/* Minification failed. Returning unminified contents.
(113,1-6): run-time error JS1195: Expected expression: class
(114,23-24): run-time error JS1004: Expected ';': {
(121,1-2): run-time error JS1002: Syntax error: }
(124,12-13): run-time error JS1004: Expected ';': :
(124,69-70): run-time error JS1004: Expected ';': {
(135,1-6): run-time error JS1195: Expected expression: class
(136,23-24): run-time error JS1004: Expected ';': {
(140,30-31): run-time error JS1197: Too many errors. The file might not be a JavaScript file: )
 */
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.TSApp.cs
// class: RedirectUrl
panda = {};
var Authentication = require("./app/Authentication/Authentication");
panda.Authentication = Authentication;
var CallToAction = require('./app/CallToAction/CallToAction');
panda.CallToAction = CallToAction;
var Contact = require('./app/Contact/Contact');
panda.Contact = Contact;
var ContentPage = require('./app/ContentPage/ContentPage');
panda.ContentPage = ContentPage;
var HomeStream = require('./app/HomeStream/HomeStream');
panda.HomeStream = HomeStream;
var DashboardVersion = require('./app/DashboardVersion/DashboardVersion');
panda.DashboardVersion = DashboardVersion;
var Media = require('./app/Media/Media');
panda.MediaLibrary = Media;
var ContentPageTreeView = require('./app/ContentPageTreeView/ContentPageTreeView');
panda.ContentPageTreeView = ContentPageTreeView;
var Coupon = require('./app/Coupon/Coupon');
panda.Coupon = Coupon;
var CouponRedemption = require('./app/CouponRedemption/CouponRedemption');
panda.CouponRedemption = CouponRedemption;
var Fundraiser = require('./app/Fundraiser/Fundraiser');
panda.Fundraiser = Fundraiser;
var FundraiserBlackoutDate = require('./app/FundraiserBlackoutDate/FundraiserBlackoutDate');
panda.FundraiserBlackoutDate = FundraiserBlackoutDate;
var FundraiserMember = require('./app/FundraiserMember/FundraiserMember');
panda.FundraiserMember = FundraiserMember;
var FundraiserUnitException = require('./app/FundraiserUnitException/FundraiserUnitException');
panda.FundraiserUnitException = FundraiserUnitException;
var GridContentPage = require('./app/GridContentPage/GridContentPage');
panda.GridContentPage = GridContentPage;
var HalfAndHalf = require('./app/HalfAndHalf/HalfAndHalf');
panda.HalfAndHalf = HalfAndHalf;
var Meal = require('./app/Meal/Meal');
panda.Meal = Meal;
var MenuCategory = require('./app/MenuCategory/MenuCategory');
panda.MenuCategory = MenuCategory;
var MenuItem = require('./app/MenuItem/MenuItem');
panda.MenuItem = MenuItem;
var MobileFeature = require('./app/MobileFeature/MobileFeature');
panda.MobileFeature = MobileFeature;
var QuestionAnswer = require('./app/QuestionAnswer/QuestionAnswer');
panda.QuestionAnswer = QuestionAnswer;
var RedirectUrl = require('./app/RedirectUrl/RedirectUrl');
panda.RedirectUrl = RedirectUrl;
var Store = require('./app/Store/Store');
panda.Store = Store;
var StoreException = require('./app/StoreException/StoreException');
panda.StoreException = StoreException;
var SystemContentPage = require('./app/SystemContentPage/SystemContentPage');
panda.SystemContentPage = SystemContentPage;
var User = require('./app/User/User');
panda.User = User;
var UserLocation = require('./app/UserLocation/UserLocation');
panda.UserLocation = UserLocation;
var Connect = require('./app/Connect/Connect');
panda.ConnectUs = Connect;
var ContactUs = require('./app/ContactUs/ContactUs');
panda.ContactUs = ContactUs;
var FundraiserLogin = require('./app/FundraiserLogin/FundraiserLogin');
panda.FundraiserLogin = FundraiserLogin;
var Menu = require('./app/Menu/Menu');
panda.Menu = Menu;
var PandaFundraiser = require('./app/PandaFundraiser/PandaFundraiser');
panda.PandaFundraiser = PandaFundraiser;
var PandaFundraiserBlackoutDate = require('./app/PandaFundraiserBlackoutDate/PandaFundraiserBlackoutDate');
panda.PandaFundraiserBlackoutDate = PandaFundraiserBlackoutDate;
var PandaFundraiserMember = require('./app/PandaFundraiserMember/PandaFundraiserMember');
panda.PandaFundraiserMember = PandaFundraiserMember;
var PublicContentPage = require('./app/PublicContentPage/PublicContentPage');
panda.PublicContentPage = PublicContentPage;
var Error = require('./app/Error/Error');
panda.Error = Error;
var AdminError = require('./app/AdminError/AdminError');
panda.AdminError = AdminError;
var StyleGuide = require('./app/StyleGuide/StyleGuide');
panda.StyleGuide = StyleGuide;
var SiteMap = require('./app/SiteMap/SiteMap');
panda.SiteMap = SiteMap;
var FeedbackKeyword = require('./app/FeedbackKeyword/FeedbackKeyword');
panda.FeedbackKeyword = FeedbackKeyword;
var Vendor = require('./app/Vendor/Vendor');
panda.Vendor = Vendor;
var FeedbackKeywordLog = require('./app/FeedbackKeywordLog/FeedbackKeywordLog');
panda.FeedbackKeywordLog = FeedbackKeywordLog;
var Allergen = require('./app/Allergen/Allergen');
panda.Allergen = Allergen;
var FundraiserLog = require('./app/FundraiserLog/FundraiserLog');
panda.FundraiserLog = FundraiserLog;
var FundraiserInquiry = require('./app/FundraiserInquiry/FundraiserInquiry');
panda.FundraiserInquiry = FundraiserInquiry;
var YelpReview = require('./app/YelpReview/YelpReview');
panda.YelpReview = YelpReview;
var VisitorScheduledMeeting = require('./app/VisitorScheduledMeeting/VisitorScheduledMeeting');
panda.VisitorScheduledMeeting = VisitorScheduledMeeting;
var Nutrition = require('./app/Nutrition/Nutrition');
panda.Nutrition = Nutrition;

document.onkeydown = function (e) {
    if (e.keyCode === 13) {
        console.log('enter');
        document.activeElement.click();
    }
};
},{"./app/AdminError/AdminError":2,"./app/Allergen/Allergen":3,"./app/Authentication/Authentication":5,"./app/CallToAction/CallToAction":13,"./app/Connect/Connect":15,"./app/Contact/Contact":20,"./app/ContactUs/ContactUs":18,"./app/ContentPage/ContentPage":23,"./app/ContentPageTreeView/ContentPageTreeView":22,"./app/Coupon/Coupon":28,"./app/CouponRedemption/CouponRedemption":27,"./app/DashboardVersion/DashboardVersion":29,"./app/Error/Error":32,"./app/FeedbackKeyword/FeedbackKeyword":34,"./app/FeedbackKeywordLog/FeedbackKeywordLog":33,"./app/Fundraiser/Fundraiser":47,"./app/FundraiserBlackoutDate/FundraiserBlackoutDate":36,"./app/FundraiserInquiry/FundraiserInquiry":38,"./app/FundraiserLog/FundraiserLog":40,"./app/FundraiserLogin/FundraiserLogin":41,"./app/FundraiserMember/FundraiserMember":43,"./app/FundraiserUnitException/FundraiserUnitException":45,"./app/GridContentPage/GridContentPage":49,"./app/HalfAndHalf/HalfAndHalf":51,"./app/HomeStream/HomeStream":53,"./app/Meal/Meal":55,"./app/Media/Media":56,"./app/Menu/Menu":62,"./app/MenuCategory/MenuCategory":58,"./app/MenuItem/MenuItem":60,"./app/MobileFeature/MobileFeature":63,"./app/Nutrition/Nutrition":64,"./app/PandaFundraiser/PandaFundraiser":68,"./app/PandaFundraiserBlackoutDate/PandaFundraiserBlackoutDate":65,"./app/PandaFundraiserMember/PandaFundraiserMember":66,"./app/PublicContentPage/PublicContentPage":71,"./app/QuestionAnswer/QuestionAnswer":72,"./app/RedirectUrl/RedirectUrl":73,"./app/SiteMap/SiteMap":75,"./app/Store/Store":78,"./app/StoreException/StoreException":76,"./app/StyleGuide/StyleGuide":80,"./app/SystemContentPage/SystemContentPage":81,"./app/User/User":84,"./app/UserLocation/UserLocation":83,"./app/Vendor/Vendor":86,"./app/VisitorScheduledMeeting/VisitorScheduledMeeting":87,"./app/YelpReview/YelpReview":88}],2:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
class AdminError {
    constructor(data) {
        //call base class constructor
        // super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = AdminError;

},{"jquery":109,"knockout":111}],3:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: Allergen
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const AllergenRouter = require("./AllergenRouter");
const Form = require("../Base/Form");
class Allergen extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, AllergenRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Allergen;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./AllergenRouter":4,"jquery":109,"knockout":111}],4:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class AllergenRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = AllergenRouter;

},{"../Base/Router":10}],5:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Form = require("../Base/Form");
const AuthenticationRouter1 = require("./AuthenticationRouter");
class Authentication extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, AuthenticationRouter1);
        this.data = data;
        this.Filters = null;
        var self = this;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
        $('#login-button').on('click', () => {
            self.Alerts([]);
            var url = '/Admin/Authentication/Login';
            var mapping = {
                'ignore': this.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(this, mapping);
            $('#loading').height($(window).height());
            this.IsLoading(true);
            var promise = $.ajax({
                url: url,
                data: JSON.stringify(postData),
                type: 'POST',
                cache: false,
                contentType: 'application/json;charset=utf-8'
            });
            promise.fail(function (error) {
                //something went wrong display error
                var html = error.error().responseText;
                var element = $('<div/>').html(html);
                $('style', element).remove();
                var htmlText = element.html();
                self.AddAlert(htmlText, 'error');
                self.IsLoading(false);
            });
            promise.done(function (data) {
                if (data.LoginSuccess) {
                    window.location.href = data.ReturnUrl;
                }
                else {
                    self.AddAlert(data.Message, 'error');
                }
                self.IsLoading(false);
            });
            return promise;
        });
        $('#forgot-password-button').on('click', () => {
            self.Alerts.removeAll();
            self.IsLoading(true);
            var promise = $.ajax({
                url: '/Admin/Authentication/ForgotPassword?email=' + $('#ItemDetail_Email').val(),
                type: 'POST',
                cache: false,
                dataType: 'json'
            });
            promise.fail(function (error) {
                //something went wrong display error
                var msg = error.error().responseJSON.Message;
                var element = $('<div/>').html(msg);
                $('style', element).remove();
                var htmlText = element.html();
                self.AddAlert(htmlText, "error");
                self.IsLoading(false);
            });
            promise.done(function (data) {
                self.IsLoading(false);
                self.AddAlert(data.Message, 'success');
                self.ShowForgotPassword(false);
                window.location.hash = '#/index';
            });
            return promise;
        });
        $('#reset-password-button').on('click', () => {
            self.Alerts.removeAll();
            self.IsLoading(true);
            var mapping = {
                'ignore': this.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(this, mapping);
            var promise = $.ajax({
                url: '/Admin/Authentication/ResetPassword',
                data: JSON.stringify(postData),
                type: 'POST',
                cache: false,
                contentType: 'application/json;charset=utf-8',
                dataType: 'json'
            });
            promise.fail(function (error) {
                //something went wrong display error
                //var msg = error.error().responseJSON.Message;
                $.each(error.responseJSON.ModelState.PropertyErrors, function (k, v) {
                    var element = $('<div/>').html(v.ErrorMessage);
                    $('style', element).remove();
                    var htmlText = element.html();
                    self.AddAlert(htmlText, "error");
                });
                $.each(error.responseJSON.ModelState.ModelErrors, function (k, v) {
                    var element = $('<div/>').html(v.ErrorMessage);
                    $('style', element).remove();
                    var htmlText = element.html();
                    self.AddAlert(htmlText, "error");
                });
                self.IsLoading(false);
            });
            promise.done(function (data) {
                self.IsLoading(false);
                self.AddAlert(data.Message, 'success');
                self.ShowForgotPassword(false);
                self.ShowResetPassword(false);
                window.location.hash = '#/index';
            });
            return promise;
        });
        $(document).on('keyup', (e) => {
            if (e.which === 13) {
                self.ItemDetail.Password($('#password-text').val());
                self.ItemDetail.Email($('#ItemDetail_Email').val());
                $('#login-button').click();
            }
        });
    }
}
module.exports = Authentication;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./AuthenticationRouter":6,"jquery":109,"knockout":111}],6:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class AuthenticationRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: '/Admin/Authentication#/index',
                func() {
                    self.vm.ShowForgotPassword(false);
                },
                convertToRegEx: true
            },
            {
                name: '/Admin/Authentication#/forgotpassword',
                func() {
                    self.vm.ShowForgotPassword(true);
                },
                convertToRegEx: true
            },
            {
                name: '/Admin/Authentication#/resetpassword',
                func() {
                    self.vm.ShowForgotPassword(false);
                    self.vm.ShowResetPassword(true);
                },
                convertToRegEx: true
            }
        ];
    }
}
module.exports = AuthenticationRouter;

},{"../Base/Router":10}],7:[function(require,module,exports){
"use strict";
const $ = require("jquery");
var JQuery = $;
const ko = require("knockout");
const komapping = require("knockout.mapping");
ko.mapping = komapping;
const _ = require("underscore");
const bootstrap = require("bootstrap");
bootstrap;
const isLoading = require("jquery-isloading");
isLoading;
class Form {
    constructor(data, vm, editAction = 'Edit') {
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
        this.controllerUrl = `/${data.Title}`;
        this.tabRowSelector = '.main-modal-form form > .row';
        this.area = this.data.Area ? `/${this.data.Area}` : '';
        this.getUrl = `${this.area}/${data.Title}/Item`;
        this.postUrl = `${this.area}/${this.data.Title}/${this.editAction}`;
        this.vm.IsLoading.subscribe(function (newValue) {
            if (newValue)
                $.isLoading({
                    'text': 'Sending....please don\'t refresh or close your window'
                });
            else
                $.isLoading('hide');
        }, this);
        this.setupBindigs();
        this.setupTabs();
    }
    //postUrl(): string {
    //    return `${this.area() }/${this.data.Title}/${this.editAction}`;
    //}
    //area(): string {
    //    return this.data.Area ? `/${this.data.Area}` : '';
    //}
    setupBindigs() {
        var self = this;
        //tab click setup
        $('.modalform-holder').on('click', '.form-tab-nav', function () {
            //set clicked one to active
            var formTab = ko.dataFor(this); //local this
            var index = _.indexOf(self.vm.FormTabs(), formTab);
            self.vm.ActiveTabIndex(index);
        });
        $('.modalform-holder').on('click', '#save', () => {
            this.post();
            return false;
        });
        $('.indexform-holder').on('click', '#save', () => {
            this.postIndex();
            return false;
        });
        $('.form-body').on('click', '#confirm-delete', () => {
            this.confirmDelete();
            return false;
        });
    }
    setupClearValidation(property) {
        //get property off of vm using string name coming from server
        var vmProperty = this.getVmProperty(property);
        if (ko.isObservable(vmProperty)) {
            var subscription = vmProperty.subscribe((newValue) => {
                this.removeError(property);
                //get rid of subscription
                subscription.dispose();
            });
        }
    }
    confirmDelete() {
        this.editAction = 'Delete';
        this.postUrl = `${this.area}/${this.data.Title}/${this.editAction}`;
        var promise = this.post();
        promise.done(() => {
            $('#delete-modal').modal('hide');
            this.editAction = 'Edit';
            this.postUrl = `${this.area}/${this.data.Title}/${this.editAction}`;
        });
    }
    //postUrl() {
    //    return `${this.area}/${this.data.Title}/${this.editAction}`;
    //}
    //area() {
    //    return this.data.Area ? `/${this.data.Area}` : '';
    //}
    removeError(property) {
        //property id has _ instead of .
        var forminput = $('#' + property.replace(/\./g, '_'));
        $("#error_message_" + property.replace(/\./g, '_')).empty();
        //select2 uses parent
        if (forminput.hasClass('select2-offscreen')) {
            forminput = $('.select2-container', forminput.parent());
        }
        //remove error class to parent element
        var formGroup = forminput.parent();
        formGroup.removeClass('has-error has-feedback');
        //remove bootsrap popover
        if ((forminput).attr('data-trigger')) {
            forminput
                .removeAttr('data-trigger')
                .removeAttr('data-placement')
                .removeAttr('data-content')
                .popover('destroy') //todo bootstrap popover
            ;
        }
        //remove popover element
        $('.form-control-feedback', formGroup).remove();
        //get rid of subscription
        //subscription.dispose();
        //refresh tabs
        this.refreshTabValidationBadges();
        //handle span differently
        var isSpan = forminput.is('span');
        if (isSpan) {
            forminput.text('');
            forminput.removeClass('label label-danger');
        }
        //});
    }
    getVmProperty(property) {
        var propertyParts = property.split('.');
        var vmProperty = this.vm[propertyParts[0]][propertyParts[1]];
        return vmProperty;
    }
    setupTabs() {
        $(this.tabRowSelector + ' h2').hide();
        //create a knockoutobservable foreach h2 inside a row
        $(this.tabRowSelector + ' h2').each((index, value) => {
            var element = $(value);
            var attr = 'visible: $root.ActiveTabIndex() === ' + index.toString();
            $(value).parent().parent().attr('data-bind', attr);
            this.vm.FormTabs.push({
                Text: ko.observable(element.html()),
                ErrorCount: ko.observable(0),
                ChangeCount: ko.observable(0),
                Hidden: ko.observable(false),
                Id: ko.observable(null)
            });
        });
        this.vm.ActiveTabIndex(0);
    }
    generateNewClientId() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); });
    }
    add() {
        this.vm.IsLoading(true);
        this.resetDetail();
        this.vm.ItemDetailIsNew(true);
        $('body').addClass('form-shown');
        this.vm.FormVisible(true);
        this.vm.IsLoading(false);
    }
    deleteitem(id) {
        var promise = this.getDetail(id);
        promise.done(() => {
            this.vm.routes.view(id);
            $('#delete-modal').modal('show');
        });
        return promise;
    }
    cancel() {
        this.vm.FormVisible(false);
        setTimeout(function () {
            $('body').removeClass('form-shown');
        }, 250);
    }
    post() {
        //prevent double post
        if (this.vm.IsLoading()) {
            return;
        }
        //make overlay loading div full height
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this.vm, ignoreMapping);
        delete postData.Alerts;
        delete postData.NewVersion;
        $(".form-validation-errors").hide();
        var promise = $.ajax({
            url: this.postUrl.toString().toLowerCase(),
            data: JSON.stringify(postData),
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8',
        });
        promise.fail((error) => this.postPromiseFail(error));
        promise.done(data => this.postPromiseDone(data));
        return promise;
    }
    postIndex() {
        //prevent double post
        if (this.vm.IsLoading()) {
            return;
        }
        //make overlay loading div full height
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this.vm, ignoreMapping);
        delete postData.Alerts;
        delete postData.NewVersion;
        $(".form-validation-errors").hide();
        var promise = $.ajax({
            url: this.postUrl.toString().toLowerCase(),
            data: JSON.stringify(postData),
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8',
        });
        promise.fail((error) => this.postPromiseFail(error));
        promise.done(data => this.postPromiseIndexDone(data));
        return promise;
    }
    deleteItem(id) {
        this.isDeleting = true;
        this.vm.routes.view(id); // Kicks off an implied getDetail()
        //var promise = this.getDetail(id);
        //promise.done(() => {
        //    this.vm.routes.view(id);
        //    $('#delete-modal').modal('show');
        //    this.isModalShowing = true;
        //});
        //return promise;
    }
    //confirmDelete() {
    //    this.editAction = 'Delete';
    //    var promise = this.post();
    //    promise.done(() => {
    //        this.editAction = 'Edit';
    //    });
    //}
    mapPostData(data) {
        var copyMapping = {
            'copy': this.data.KOMapping.copy
        };
        ko.mapping.fromJS(data.ItemDetail, copyMapping, this.vm.ItemDetail);
    }
    addPropertyError(propertyError) {
        var key = propertyError.Key, message = propertyError.ErrorMessage;
        if (key === undefined || key === null)
            return;
        //find matching input
        var forminput = $('#' + key.replace(/\./g, '_'));
        //select2 need to use parent element
        if (forminput.hasClass('select2-offscreen')) {
            forminput = $('.select2-container', forminput.parent());
        }
        this.formInputAddError(forminput, key, message);
        var errorMessage = $("#error_message_" + key.replace(/\./g, '_'));
        this.formInputAddError(errorMessage, key, message);
    }
    //add error state to dom
    formInputAddError(forminput, key, message) {
        //select2 need to use parent element
        if (forminput.hasClass('select2-offscreen')) {
            forminput = $('.select2-container', forminput.parent());
        }
        var isSpan = forminput.is('span');
        var formElementFound = true;
        if (forminput.length > 0) {
            var elementParent = forminput.parent();
            elementParent.addClass('has-error has-feedback');
            if (!isSpan) {
                elementParent.append('<span class=\'glyphicon glyphicon-remove form-control-feedback\'></span>');
            }
            else {
                forminput.text(message);
                forminput.addClass('label label-danger');
            }
            if (message && !isSpan) {
                forminput
                    .attr('data-trigger', 'hover')
                    .attr('data-placement', 'bottom')
                    .attr('data-content', message)
                    .popover();
            }
            if (!isSpan)
                forminput.attr('aria-invalid', 'true');
            elementParent.parent().trigger("form:property.validation.error");
        }
        else {
            formElementFound = false;
            if (message === 'DBConcurrencyException') {
                //$("#conflictModal").modal("show");
            }
            else {
                //addAlert(message, "error"); //todo form class level validation
            }
        }
        if (formElementFound) {
            this.setupClearValidation(key);
        }
    }
    //remove error state from don
    formInputRemoveError(forminput, key) {
        if (forminput.hasClass('select2-offscreen')) {
            forminput = $('.select2-container', forminput.parent());
        }
        //remove error class to parent element
        var formGroup = forminput.closest('.form-group');
        formGroup.removeClass('has-error has-feedback');
        //remove bootsrap popover
        if ((forminput).attr('data-trigger')) {
            forminput
                .removeAttr('data-trigger')
                .removeAttr('data-placement')
                .removeAttr('data-content')
                .popover('destroy') //todo bootstrap popover
            ;
        }
        //remove popover element
        $('.form-control-feedback', formGroup).remove();
        //refresh tabs
        this.refreshTabValidationBadges();
        //handle span differently
        var isSpan = forminput.is('span');
        if (isSpan) {
            forminput.text('');
            forminput.removeClass('label label-danger');
        }
    }
    //setup tab validation notice
    refreshTabValidationBadges() {
        //find elements inside row that have has-error class
        $('.form-holder .row').each((i, v) => {
            //get the number of errors on in tab section
            var errors = $('.has-error', v).length;
            //find tab by title and set error count
            var tabTitle = $('h2', v).html();
            var match = ko.utils.arrayFirst(this.vm.FormTabs(), item => (tabTitle === item.Text()));
            if (match) {
                match.ErrorCount(errors);
            }
        });
    }
    //resets item detail so that it looks like a new insert
    resetDetail() {
        //$('#delete-modal').modal('hide');
        ko.mapping.fromJS(this.vm.NewItemDetail, {}, this.vm.ItemDetail);
        //this.refreshTabValidationBadges();
        _.each(this.vm.FormTabs(), function (tab) { tab.ErrorCount(0); }); //reset errors to 0
        $('.main-modal-form form > .row').hide();
        this.vm.ActiveTabIndex(0);
        $('.main-modal-form form > .row:eq(0)').show();
    }
    //resets item detail so that it looks like a new insert
    resetDetailIndex() {
        //$('#delete-modal').modal('hide');
        // ko.mapping.fromJS(this.vm.NewItemDetail, {}, this.vm.ItemDetail);
        //this.refreshTabValidationBadges();
        _.each(this.vm.FormTabs(), function (tab) { tab.ErrorCount(0); }); //reset errors to 0
        $('.main-modal-form form > .row').hide();
        this.vm.ActiveTabIndex(0);
        $('.main-modal-form form > .row:eq(0)').show();
    }
    getDetail(id) {
        this.resetDetail();
        //$('#loading').height($(window).height());
        this.vm.IsLoading(true);
        $('body').addClass('form-shown');
        var promise = $.ajax({
            url: this.getUrl,
            data: { id: id },
            type: 'GET',
            cache: false,
            contentType: 'application/json;charset=utf-8'
        });
        promise.fail((error) => this.getPromiseFail(error, id));
        promise.fail((error) => {
            var html = error.error().responseText;
            var element = $('<div/>').html(html);
            $('style', element).remove();
            var htmlText = element.html();
            this.vm.AddAlert(htmlText, 'alert-error');
            this.vm.IsLoading(false);
        });
        promise.done((data) => this.getPromiseDone(data, id));
        return promise;
    }
    komappingfromdata(data, id) {
        var copyMapping = {
            'copy': this.data.KOMapping.allNonPostBack
        };
        ko.mapping.fromJS(data.ItemDetail, copyMapping, this.vm.ItemDetail);
    }
    //post ajax fail$$
    postPromiseFail(error) {
        if (error.status === 400) {
            if (error.responseJSON.ModelState.PropertyErrors.length > 0)
                $(".form-validation-errors").show();
            _.each(error.responseJSON.ModelState.PropertyErrors, (propertyError) => {
                this.addPropertyError(propertyError);
            });
            this.refreshTabValidationBadges();
        }
        else if (error.status === 422) {
            // Failed captcha
            alert("Your request appears to be invalid. Please try again.");
        }
        else {
            if (error.responseJSON) {
                if (error.responseJSON.Message) {
                    this.vm.AddAlert(error.responseJSON.Message, 'error');
                }
                else {
                    var html = error.error().responseText;
                    var element = $('<div/>').html(html);
                    $('style', element).remove();
                    var htmlText = element.html();
                    this.vm.AddAlert(htmlText, 'error');
                }
            }
            else {
                var html2 = error.error().responseText;
                var element2 = $('<div/>').html(html2);
                $('style', element2).remove();
                var htmlText2 = element2.html();
                this.vm.AddAlert(htmlText2, 'error');
            }
        }
        this.vm.IsLoading(false);
    }
    //post ajax success
    postPromiseDone(data) {
        this.mapPostData(data);
        if (!this.vm.LeaveOpenOnAjaxSuccess()) {
            this.vm.routes.goBack();
            this.resetDetail();
            this.vm.AddAlert(data.Message, 'success');
        }
        this.vm.IsLoading(false);
    }
    //post ajax success
    postPromiseIndexDone(data) {
        this.mapPostData(data);
        if (!this.vm.LeaveOpenOnAjaxSuccess()) {
            this.vm.routes.goBack();
            this.resetDetailIndex();
            this.vm.AddAlert(data.Message, 'success');
        }
        this.vm.IsLoading(false);
    }
    //get ajax fail
    getPromiseFail(error, id) {
        var html = error.error().responseText;
        var element = $('<div/>').html(html);
        $('style', element).remove();
        var htmlText = element.html();
        this.vm.AddAlert(htmlText, 'alert-error');
        this.vm.IsLoading(false);
    }
    //get ajax success
    getPromiseDone(data, id) {
        if (data.length === 0 || data === 'undefined') {
            window.location.href = '/Admin/Authentication/Login';
        }
        this.vm.ItemDetailIsNew(false);
        this.komappingfromdata(data, id);
        this.vm.routes.view(id);
        this.vm.IsLoading(false);
        this.vm.FormVisible(true);
        if (this.isDeleting) {
            $('#delete-modal').modal('show');
            this.isModalShowing = true;
        }
    }
}
module.exports = Form;

},{"bootstrap":96,"jquery":109,"jquery-isloading":90,"knockout":111,"knockout.mapping":110,"underscore":113}],8:[function(require,module,exports){
"use strict";
const ko = require("knockout");
const $ = require("jquery");
class KoBindingExtensions {
    register() {
        ko.bindingHandlers.hidden = {
            update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
                var value = ko.utils.unwrapObservable(valueAccessor());
                ko.bindingHandlers.visible.update(element, () => (!value), allBindingsAccessor, viewModel, bindingContext);
            }
        };
        ko.bindingHandlers.slideInVisible = {
            init(element, valueAccessor) {
                // Initially set the element to be instantly visible/hidden depending on the value
                var value = valueAccessor();
                $(element).toggle(ko.unwrap(value)); // Use "unwrapObservable" so we can handle values that may or may not be observable
            },
            update(element, valueAccessor) {
                // Whenever the value subsequently changes, slowly fade the element in or out
                var value = valueAccessor();
                var jqueryElement = $(element);
                if (ko.unwrap(value)) {
                    //scroll browser to top to make sure form is in view
                    $('body')
                        .animate({ scrollTop: 0 }, '250', 'swing');
                    //hide
                    //position off screen 
                    //show
                    //slide into position
                    jqueryElement
                        .hide()
                        .animate({ left: -3000 }, 1, 'linear', function () {
                        $(this).show(); //local this
                    })
                        .animate({ left: 0 }, 250);
                }
                else {
                    //slide off screen
                    //hide
                    //reset to 0 position
                    jqueryElement
                        .animate({ left: -3000 }, 500, 'linear', function () {
                        $(this).hide().css('left', '0'); //local this
                    });
                    ;
                }
            }
        };
        ko.bindingHandlers.slideAlert = {
            init(element, valueAccessor, allBindings, viewModel, bindingContext) {
                $(element).slideDown(400);
                //auto remove success messages after 3 seconds
                if (viewModel.Type === 'alert-success') {
                    setTimeout(() => {
                        $(element).slideUp(400);
                        bindingContext.$root.Alerts.remove(viewModel);
                    }, 3000);
                }
            }
        };
        ko.bindingHandlers.href = {
            update(element, valueAccessor, allBindings, viewModel, bindingContext) {
                ko.bindingHandlers.attr.update(element, () => {
                    return { href: valueAccessor() };
                }, allBindings, viewModel, bindingContext);
            }
        };
        ko.bindingHandlers.datetime = {
            update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
                var value = valueAccessor();
                var allBindings = allBindingsAccessor();
                var valueUnwrapped = ko.utils.unwrapObservable(value);
                // Date formats: http://momentjs.com/docs/#/displaying/format/
                var elementFormat = $(element).attr('data-format');
                var pattern = elementFormat || allBindings.format || 'MM/DD/YYYY';
                var output = '';
                if (valueUnwrapped !== null && valueUnwrapped !== undefined && valueUnwrapped.length > 0) {
                    if (valueUnwrapped.indexOf('Z') == valueUnwrapped.length - 1) { //by default momentjs converts UTC to local and we want it to stay UTC if selected
                        output = moment.utc(valueUnwrapped).format(pattern);
                    }
                    else {
                        output = moment(valueUnwrapped).format(pattern);
                    }
                }
                if ($(element).is('input') === true) {
                    $(element).val(output);
                }
                else {
                    $(element).text(output);
                }
            }
        };
        ko.bindingHandlers.time = {
            update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
                var value = valueAccessor();
                var allBindings = allBindingsAccessor();
                var valueUnwrapped = ko.utils.unwrapObservable(value);
                // Date formats: http://momentjs.com/docs/#/displaying/format/
                var elementFormat = $(element).attr('data-format');
                var pattern = elementFormat || allBindings.format || 'H:mm a';
                var output = '';
                if (valueUnwrapped !== null && valueUnwrapped !== undefined && valueUnwrapped.length > 0) {
                    if (valueUnwrapped.indexOf('Z') == valueUnwrapped.length - 1) { //by default momentjs converts UTC to local and we want it to stay UTC if selected
                        output = moment.utc(valueUnwrapped).format(pattern);
                    }
                    else {
                        output = moment(valueUnwrapped).format(pattern);
                    }
                }
                if ($(element).is('input') === true) {
                    $(element).val(output);
                }
                else {
                    $(element).text(output);
                }
            }
        };
        ko.bindingHandlers.summernote = {
            init(element, valueAccessor, allBindings, viewModel, bindingContext) {
                var valueBinding = valueAccessor();
                var $element = $(element);
                var updateObservable = () => viewModel[valueBinding]($element.code());
                $element.summernote({
                    height: 600,
                    onblur: updateObservable
                });
                $element.code(viewModel[valueBinding]());
                // replace script tags so they're not executed when loaded in admin
                var codeToReplace = $element.code();
                codeToReplace = codeToReplace.replace('<script', '<!--<script');
                codeToReplace = codeToReplace.replace('</script>', '</script>-->');
                $element.code(codeToReplace);
                viewModel[valueBinding].subscribe(newValue => {
                    $element.code(viewModel[valueBinding]());
                });
            }
        };
    }
}
module.exports = KoBindingExtensions;

},{"jquery":109,"knockout":111}],9:[function(require,module,exports){
"use strict";
const ko = require("knockout");
const $ = require("jquery");
const select2 = require("select2");
const _ = require("underscore");
$['select2'] = select2;
class KoBindingSelect2 {
    addBinding() { ko.bindingHandlers.select2helper = this; }
    init(element, valueAccessor, allBindings, viewModel, bindingContext) {
        /*Inital Setup*/
        ko.utils.domNodeDisposal.addDisposeCallback(element, () => {
            $(element).select2('destroy');
        });
        var boundObservable = valueAccessor();
        var isBoundToArray = KoBindingSelect2.isObservableArray(boundObservable);
        var select2HelperSourceName = allBindings().select2HelperSourceName;
        var oDataAjaxSource = allBindings().select2HelperODataAjaxSource;
        var isReferenceType = allBindings().select2HelperReference;
        var customSelectionFormat = allBindings().select2HelperFormatSelection;
        var customResultFormat = allBindings().select2HelperFormatResult;
        var placeholderText = allBindings().select2PlaceholderText;
        var allowClear = allBindings().select2AllowClear;
        var oDataSort = allBindings().select2HelperODataSort;
        var optionsSupplied = true;
        //select2 options
        var data = {};
        data.formatSelection = customSelectionFormat ? KoBindingSelect2.getNestedProperty(customSelectionFormat, bindingContext.$root) : KoBindingSelect2.formatSelection;
        data.formatResult = customResultFormat ? KoBindingSelect2.getNestedProperty(customResultFormat, bindingContext.$root) : KoBindingSelect2.formatResult;
        data.id = KoBindingSelect2.formatId;
        data.matcher = KoBindingSelect2.matcher;
        data.multiple = isBoundToArray;
        data.dropdownAutoWidth = true;
        data.placeholder = placeholderText ? placeholderText : '';
        data.allowClear = allowClear ? allowClear : true;
        var initValue = null;
        if (!isBoundToArray) {
            if (isReferenceType) {
                var value = ko.toJS(boundObservable);
                if (value)
                    initValue = value;
            }
            else {
                initValue = ko.toJS(boundObservable);
            }
        }
        //setup source for options
        if (select2HelperSourceName) { //using array on view model
            var sourceList = KoBindingSelect2.getNestedProperty(select2HelperSourceName, bindingContext.$root);
            data.data = () => {
                return { results: ko.utils.unwrapObservable(sourceList) };
            };
        }
        else if (oDataAjaxSource) { //using ajax
            data.initSelection = (element, callback) => {
                callback(ko.toJS(boundObservable));
            };
            var pageSize = 30;
            data.ajax = {
                url: oDataAjaxSource,
                dataType: 'json',
                data(term, page) {
                    return {
                        $inlinecount: 'allpages',
                        $orderby: oDataSort ? oDataSort : "Name",
                        $top: pageSize,
                        $skip: (page == undefined || page < 1) ? 0 : (page - 1) * pageSize,
                        SearchTerm: term == undefined ? '' : term
                    };
                },
                results(resultData, page) {
                    var more = (page * pageSize) < resultData.PageInfo.TotalItemCount;
                    return { results: resultData.List, more: more };
                }
            };
        }
        else {
            //no valid source specified
            optionsSupplied = false;
        }
        if (optionsSupplied) {
            $(element).select2(data);
            /*Initial value*/
            if (initValue) {
                $(element).select2('val', initValue);
            }
            /*Jquery Updates*/
            $(element).on('change', (event) => {
                if (event.added) {
                    //update observable depending on if it is an array or property
                    var newValue = ko.utils.unwrapObservable(event.added);
                    ;
                    if (isReferenceType) {
                        if (!isBoundToArray) {
                            boundObservable(newValue);
                        }
                        else {
                            boundObservable.push(newValue);
                        }
                    }
                    else {
                        if (!isBoundToArray) {
                            boundObservable(newValue.Id);
                        }
                        else {
                            boundObservable.push(newValue.Id);
                        }
                    }
                }
                //if removing and bound to array we have to call remove on observable array
                if (event.removed && isBoundToArray) {
                    var removedValue = ko.utils.unwrapObservable(event.removed);
                    ;
                    //find the item with matchin id and remove
                    boundObservable.remove(item => {
                        var id = isReferenceType ? item.Id : item;
                        var itemId = ko.utils.unwrapObservable(id);
                        var removedValueId = ko.utils.unwrapObservable(removedValue.Id);
                        return itemId === removedValueId;
                    });
                }
            });
            $(element).on("select2-removed", function (event) {
                if (!isBoundToArray) {
                    boundObservable(null);
                }
            });
            /*observable updates*/
            boundObservable.subscribe(newValue => {
                newValue = ko.toJS(newValue);
                if (isBoundToArray) {
                    if (newValue.length === 0)
                        $(element).select2('val', null);
                    else {
                        var plucked = _.pluck(newValue, 'Id');
                        $(element).select2('val', plucked);
                    }
                }
                else {
                    if (isReferenceType) {
                        $(element).select2('data', newValue);
                    }
                    else {
                        $(element).select2('val', newValue);
                    }
                }
            });
        }
    }
    static isObservableArray(boundObservable) {
        return (boundObservable() instanceof Array);
    }
    static formatSelection(item) {
        return ko.utils.unwrapObservable(item.Name);
    }
    static formatResult(item) {
        return ko.utils.unwrapObservable(item.Name);
    }
    static formatId(item) {
        if (item)
            return ko.utils.unwrapObservable(item.Id);
    }
    static matcher(term, text, option) {
        var name = ko.utils.unwrapObservable(option.Name);
        return name.toUpperCase().indexOf(term.toUpperCase()) >= 0;
    }
    static getNestedProperty(propertyString, parentObject) {
        var parts = propertyString.split('.');
        for (var i = 0, size = parts.length; i < size; i++) {
            parentObject = parentObject[parts[i]];
        }
        return parentObject;
    }
}
module.exports = KoBindingSelect2;

},{"jquery":109,"knockout":111,"select2":94,"underscore":113}],10:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const Sammy = require("sammy");
const _ = require("underscore");
class Router {
    constructor(data, vm, alternateroutes) {
        this.data = data;
        this.vm = vm;
        if (alternateroutes) {
            this.routes = alternateroutes;
        }
        else {
            this.routes = this.getRoutes();
            // add i regex flag for case insensitive routes
            for (var i = 0; i < this.routes.length; i++) {
                if (this.routes[i].convertToRegEx && this.routes[i].name.constructor !== RegExp) {
                    this.routes[i].name = new RegExp(this.routes[i].name.toString(), 'i');
                }
            }
        }
        this.setupBindigs();
        this.initRoutes();
    }
    getRoutes() {
        var self = this;
        return [
            {
                name: new RegExp(`${self.getArea()}/${self.data.Title}#/list`),
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: true
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: true
            },
            {
                //name: /\#\/view\/(.*)/i,
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: true
            }
        ];
    }
    setupBindigs() {
        var self = this;
        //#add show call new route
        $('#admin-button-container').on('click', '#add', () => {
            this.add();
            return false;
        });
        //#cancel show back
        $('.main-modal-form').on('click', '.dialog-close', () => {
            this.goBack();
            return false;
        });
    }
    initRoutes() {
        var app = Sammy('body', sammy => {
            //pass error 
            sammy.raise_errors = true;
            //register all routes (this allows us to add to them from derived class)
            _.each(this.routes, v => {
                sammy.get(v.name, v.func);
            });
            //keep track of last route
            sammy.before((route) => {
                this.lastRoute = this.currentRoute;
                this.currentRoute = route;
            });
        });
        $(() => {
            //go to default route
            app.run(this.getArea() + '/' + this.vm.Title().toLowerCase() + '#/' + this.vm.DefaultSammyRoute());
        });
    }
    getArea() {
        var area = '';
        if (this.vm.Area()) {
            area = '/' + this.vm.Area();
        }
        return area;
    }
    //go to previous route or default route if undefined
    goBack() {
        window.location.hash = `#/list`;
    }
    add() {
        window.location.hash = '#/new';
    }
    view(id) {
        window.location.hash = '#/view/' + id;
    }
}
module.exports = Router;

},{"jquery":109,"sammy":93,"underscore":113}],11:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const komapping = require("knockout.mapping");
ko.mapping = komapping;
const _ = require("underscore");
class Table {
    constructor(data, vm) {
        this.data = data;
        this.vm = vm;
        this.oDataUrl = `/api/${data.Title}`;
        this.defaultSort = "CreatedDate desc";
        this.orderby = this.defaultSort;
        this.sortBy = new Array();
        this.setupSubscriptions();
        this.setupBindings();
    }
    //loads ajax data into table
    loadResponse(responsedata) {
        //clear the list
        this.vm.List.removeAll();
        //add the new items
        _.each(responsedata.List, (v) => {
            this.vm.List.push(v);
        });
        //reload page info
        ko.mapping.fromJS(responsedata.PageInfo, {}, this.vm.PageInfo);
    }
    //subscribes to observables
    setupSubscriptions() {
        //page number
        this.vm.PageInfo.PageNumber.subscribe(() => {
            this.load();
        });
        //page size
        this.vm.PageInfo.PageSize.subscribe((newValue) => {
            this.somethingChanged();
        });
        //filters values
        _.each(this.vm.Filters, (v) => {
            v.subscribe(() => {
                this.somethingChanged();
            });
        });
    }
    somethingChanged() {
        if (this.vm.PageInfo.PageNumber() === 1)
            this.load();
        this.vm.PageInfo.PageNumber(1);
    }
    setupBindings() {
        //add click handlers to the column-headings
        var self = this;
        // click - column headers
        $(".table-holder-" + this.data.Title).on("click", ".column-heading", function () {
            var data = ko.dataFor(this); //'this' is local
            var isUp = data.IsSortedUp();
            var isDown = data.IsSortedDown();
            //neither -> up
            if (!isUp && !isDown) {
                data.IsSortedUp(true);
                //add column asc to array + remove other variants of this column
                self.sortBy.push(data.SortColumn() + " asc");
                self.sortBy = _.without(self.sortBy, data.SortColumn() + " desc");
                // remove default sort if it's not the same sort we just invoked
                if (self.defaultSort !== data.SortColumn() + " asc")
                    self.sortBy = _.without(self.sortBy, self.defaultSort);
            }
            //up -> down
            else if (isUp) {
                data.IsSortedUp(false);
                data.IsSortedDown(true);
                //add column desc to array + remove other variants of this column
                self.sortBy.push(data.SortColumn() + " desc");
                self.sortBy = _.without(self.sortBy, data.SortColumn() + " asc");
                // remove default sort if it's not the same sort we just invoked
                if (self.defaultSort !== data.SortColumn() + " desc")
                    self.sortBy = _.without(self.sortBy, self.defaultSort);
            }
            //down -> neither
            else {
                data.IsSortedUp(false);
                data.IsSortedDown(false);
                //remove all variants of this column
                self.sortBy = _.without(self.sortBy, data.SortColumn() + " desc");
                self.sortBy = _.without(self.sortBy, data.SortColumn() + " asc");
                self.sortBy = _.without(self.sortBy, self.defaultSort);
            }
            //if no sort add default
            if (self.sortBy.length === 0)
                self.sortBy.push(self.defaultSort);
            self.orderby = self.sortBy.join(", ");
            self.load();
            return false;
        });
        // click - paging controls
        $(".pagination-container-" + this.data.Title + " .pagination").on("click", "a, button", function () {
            var aLink = this;
            var vm = ko.dataFor(this);
            if ($(aLink).parent().hasClass("disabled") === false) {
                var aText = $(aLink).text().toLowerCase();
                var pageNumber = vm.PageInfo.PageNumber();
                if (aText.indexOf("first") > -1) {
                    pageNumber = 1;
                }
                else if (aText.indexOf("prev") > -1 || $(aLink).hasClass('prev')) {
                    pageNumber = pageNumber - 1;
                }
                else if (aText.indexOf("next") > -1 || $(aLink).hasClass('next')) {
                    pageNumber = pageNumber + 1;
                }
                else if (aText.indexOf("last") > -1) {
                    pageNumber = self.vm.PageInfo.PageCount();
                }
                else { //numbers
                    pageNumber = parseInt(aText);
                }
                vm.PageInfo.PageNumber(pageNumber);
            }
            //self.load();
            return false;
        });
    }
    //clears sorts on all columns except ones named
    clearSortColumns(dotNotClearColumnName) {
        _.each(this.vm.Columns(), (v) => {
            if (v.ColumnName() !== dotNotClearColumnName) {
                v.IsSortedUp(false);
                v.IsSortedDown(false);
            }
        });
    }
    top() {
        return (this.vm.PageInfo.PageSize());
    }
    skip() {
        return (this.vm.PageInfo.PageNumber() - 1) * this.top();
    }
    //sends ajax call for data 
    load() {
        this.vm.form.isDeleting = false;
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        //format the request
        var requestData = {
            $inlinecount: "allpages",
            $orderby: this.orderby,
            $top: this.top(),
            $skip: this.skip()
        };
        //add in filters
        $.extend(requestData, ko.toJS(this.vm.Filters));
        //make the request
        var response = $.ajax({
            url: this.oDataUrl,
            dataType: "json",
            cache: false,
            data: requestData
        });
        //handle successful response
        response.done(responsedata => {
            this.loadResponse(responsedata);
            this.vm.IsLoading(false);
        });
        return response;
    }
}
module.exports = Table;

},{"jquery":109,"knockout":111,"knockout.mapping":110,"underscore":113}],12:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.VmBase = void 0;
const $ = require("jquery");
window['$'] = $;
const ko = require("knockout");
const komapping = require("knockout.mapping");
ko.mapping = komapping;
window['ko'] = ko; //for console debugging
const koextensions = require("./KoBindingExtensions");
new koextensions().register();
const koselect2 = require("./KoBindingSelect2");
new koselect2().addBinding();
const mommentDatetimeKo = require("moment-datepicker-ko");
mommentDatetimeKo;
const mommentDatetime = require("moment-datepicker");
mommentDatetime;
const bootstrap = require("bootstrap");
bootstrap;
class VmBase {
    constructor(data, formType, tableType, routerType) {
        this.data = data;
        ko.mapping.fromJS(data, data.KOMapping, this);
        this.setupBindings();
        //save copy of what a empty item looks like for creating after editing
        this.NewItemDetail = ko.mapping.toJS(this.ItemDetail);
        if (formType !== null)
            this.form = new formType(data, this);
        if (tableType !== null)
            this.table = new tableType(data, this);
        if (routerType !== null)
            this.routes = new routerType(data, this);
    }
    setupBindings() {
        var self = this;
        $('.alerts-holder').on('click', '.close', function () {
            var data = ko.dataFor(this); //local this
            self.Alerts.remove(data);
        });
        $('body').on('click', '.main-hamburger', function () {
            $("#wrapper").toggleClass("toggled");
        });
        //$('body').on('click', function () {
        //    $("#wrapper").removeClass("toggled");
        //})
    }
    AddAlert(message, alertType) {
        var css = 'alert-warning';
        if (alertType === 'info')
            css = 'alert-info';
        if (alertType === 'error')
            css = 'alert-danger';
        if (alertType === 'success')
            css = 'alert-success';
        this.Alerts.push({
            Message: message,
            Type: css,
            IsVisible: ko.observable(true)
        });
    }
}
exports.VmBase = VmBase;

},{"./KoBindingExtensions":8,"./KoBindingSelect2":9,"bootstrap":96,"jquery":109,"knockout":111,"knockout.mapping":110,"moment-datepicker":92,"moment-datepicker-ko":91}],13:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class CallToAction extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = CallToAction;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],14:[function(require,module,exports){
"use strict";
const $ = require("jquery");
/**
 * Modal that can be used anywhere.
 * @param  {String}  modalName  Name of the modal
 */
class Modal {
    constructor(modalName) {
        this.name = modalName;
        this.visible = false;
        this.$trigger = $('[data-modal-trigger="' + modalName + '"]');
        this.$modal = $('[data-modal="' + modalName + '"]');
    }
    /**
     * Init function for an indivual modal - Sets up click actions.
     */
    init() {
        var modal = this;
        if ($('[data-modal-overlay]').length < 1) {
            $('.wrapper, .modal-body').after('<div class="modal-overlay" data-modal-overlay data-state="hidden"></div>');
            $('[data-modal-overlay], [data-modal-close]').on('click', function (event) {
                event.preventDefault();
                modal.close();
            });
        }
        this.$modal.attr('data-state', 'hidden');
        //this.$trigger.on('click', function (event) {
        //    event.preventDefault();
        //    modal.open();
        //});
    }
    /**
     * Function to open this Modal
     */
    open(id) {
        this.eventId = id;
        var $overlay = $('[data-modal-overlay]').first();
        // var $clone = this.$modal.clone().attr('data-state', 'visible');
        this.$modal.attr('data-state', 'visible');
        $overlay.attr('data-state', 'visible');
        this.visible = true;
    }
    /**
     * Function to Close this Modal
     */
    close() {
        var $overlay = $('[data-modal-overlay]').first();
        this.$modal.attr('data-state', 'hidden');
        $overlay.attr('data-state', 'hidden');
        this.visible = false;
    }
}
module.exports = Modal;

},{"jquery":109}],15:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const ConnectRouter = require("./ConnectRouter");
const ConnectForm = require("./ConnectForm");
const Modal = require("../Common/Modal");
class Connect extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, ConnectForm, Table, ConnectRouter);
        this.data = data;
        this.modal = new Modal("unsubscribe");
        this.modal.init();
        this.OriginalEmail = ko.observable('');
        $('.modalform-holder').on('click', '#save-connect', () => {
            var promise = this.form.post();
            promise.done((data) => {
                window.location.href = "/ConnectUs#/thankyou";
            });
            return false;
        });
        $('.modalform-holder').on('click', '#update-connect', () => {
            console.log('update');
            var promise = this.form.post();
            promise.done((data) => {
                window.location.href = "/connectus#/thankyou";
            });
            return false;
        });
        $('.modalform-holder').on('click', '#save-connect-standalone', () => {
            var promise = this.form.post();
            promise.done((data) => {
                window.location.href = "/ConnectUs/StandAlone#/thankyou";
            });
            return false;
        });
        $('.modalform-holder').on('click', '#unsubscribe', () => {
            var promise = this.form.unsubscribe();
            promise.done((data) => {
                this.modal.close();
                window.location.href = "/connectus#/unsubscribed";
            });
            promise.fail((error) => this.form.postPromiseFail(error));
            return false;
        });
        $('.modalform-holder').keypress(function (e) {
            var key = e.which;
            if (key === 13) // the enter key code
             {
                $('#save-connect').click();
                return false;
            }
        });
        $('.modalform-holder').on('click', '#unsubscribe-modal', () => {
            this.modal.open('unsubscribe');
            return false;
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Connect;

},{"../Base/Table":11,"../Base/VMBase":12,"../Common/Modal":14,"./ConnectForm":16,"./ConnectRouter":17,"jquery":109,"knockout":111}],16:[function(require,module,exports){
"use strict";
const Form = require("../Base/Form");
class ConnectForm extends Form {
    constructor(data, vm, editAction = 'Edit') {
        super(data, vm, editAction);
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
        $('#EmailOptIn').on('click', () => {
            if (vm.ItemDetail.Email() === null || vm.ItemDetail.Email().length === 0) {
                vm.ItemDetail.Email('none');
                vm.ItemDetail.Email('');
            }
            if (vm.ItemDetail.ConfirmEmail() === null || vm.ItemDetail.ConfirmEmail().length === 0) {
                vm.ItemDetail.ConfirmEmail('none');
                vm.ItemDetail.ConfirmEmail('');
            }
            this.removeErrors();
        });
        $('#SmsOptIn').on('click', () => {
            if (vm.ItemDetail.Phone() === null || vm.ItemDetail.Phone().length === 0) {
                vm.ItemDetail.Phone('none');
                vm.ItemDetail.Phone('');
            }
            this.removeErrors();
        });
    }
    promiseDone(data, id) {
        super.getPromiseDone(data, id);
        window.location.href = data.ReturnUrl;
    }
    removeErrors() {
        $('#ItemDetail_EmailOptIn').text('');
        $('#ItemDetail_EmailOptIn').removeClass('label').removeClass('label-danger');
        $('#ItemDetail_EmailOptIn').parent().removeClass('has-error').removeClass('has-feedback');
        $('#ItemDetail_SmsOptIn').text('');
        $('#ItemDetail_SmsOptIn').removeClass('label').removeClass('label-danger');
        $('#ItemDetail_SmsOptIn').parent().removeClass('has-error').removeClass('has-feedback');
    }
    unsubscribe() {
        var mapping = {
            'ignore': this.vm.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this.vm, mapping);
        var promise = $.ajax({
            url: '/connectus/unsubscribe',
            data: JSON.stringify(postData),
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8',
        });
        return promise;
    }
    getSubscriber(id) {
        var promise = $.ajax({
            url: '/connectus/subscriber?id=' + encodeURIComponent(id),
            type: 'GET',
            cache: false
        });
        promise.done((data) => this.refreshFields(data));
        return promise;
    }
    refreshFields(data) {
        this.vm.ItemDetail.FirstName(data.ItemDetail.FirstName);
        this.vm.ItemDetail.LastName(data.ItemDetail.LastName);
        this.vm.ItemDetail.Email(data.ItemDetail.Email);
        this.vm.ItemDetail.ConfirmEmail(data.ItemDetail.ConfirmEmail);
        this.vm.ItemDetail.Zip(data.ItemDetail.Zip);
        this.vm.ItemDetail.BirthdayDay(data.ItemDetail.BirthdayDay);
        this.vm.ItemDetail.BirthdayMonth(data.ItemDetail.BirthdayMonth);
        this.vm.ItemDetail.UniqueId(data.ItemDetail.UniqueId);
        this.vm.ItemDetail.EmailOptIn(true);
        this.vm.OriginalEmail(data.ItemDetail.Email);
    }
}
module.exports = ConnectForm;

},{"../Base/Form":7}],17:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class ConnectRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `/ConnectUs#/new`,
                func() {
                    self.vm.form.add();
                    self.vm.ShowThankYou(false);
                    self.vm.ShowUnsubscribed(false);
                    self.vm.IsUpdate(false);
                },
                convertToRegEx: true
            },
            {
                name: `/ConnectUs#/thankyou`,
                func() {
                    self.vm.ShowThankYou(true);
                    self.vm.ShowUnsubscribed(false);
                    self.vm.IsUpdate(false);
                },
                convertToRegEx: true
            },
            {
                name: `/Connect/StandAlone#/new`,
                func() {
                    self.vm.form.add();
                    self.vm.ShowThankYou(false);
                    self.vm.ShowUnsubscribed(false);
                    self.vm.IsUpdate(false);
                },
                convertToRegEx: true
            },
            {
                name: `/Connect/StandAlone#/thankyou`,
                func() {
                    self.vm.ShowThankYou(true);
                    self.vm.ShowUnsubscribed(false);
                    self.vm.IsUpdate(false);
                },
                convertToRegEx: true
            },
            {
                name: `/ConnectUs#/profile`,
                func() {
                    var id = this.params.uid;
                    var promise = self.vm.form.getSubscriber(id);
                    promise.done(() => self.vm.IsUpdate(true));
                    promise.fail(() => {
                        window.location.href = "/connectus#/new";
                    });
                    self.vm.form.add();
                    self.vm.ShowThankYou(false);
                },
                convertToRegEx: true
            },
            {
                name: `/connectus#/unsubscribed`,
                func() {
                    self.vm.ShowThankYou(false);
                    self.vm.ShowUnsubscribed(true);
                    self.vm.IsUpdate(false);
                },
                convertToRegEx: true
            },
        ];
    }
}
module.exports = ConnectRouter;

},{"../Base/Router":10}],18:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Form = require("../Base/Form");
const ContactUsRouter = require("./ContactUsRouter");
const _ = require("underscore");
const Store = require("../Store/Store");
class ContactUs extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, ContactUsRouter);
        this.data = data;
        //setup table, routes and form
        var self = this;
        //reuse the store vm for store search
        this.storeVm = new Store(data.StoreViewModel, false);
        this.ItemDetail.StoreState.subscribe((newValue) => {
            if (newValue !== 'undefined' && newValue != null) {
                this.StoreCities.removeAll();
                $.ajax({
                    url: '/api/Store/GetStoreCitiesByState?state=' + newValue,
                    success: function (data) {
                        _.each(data, (v) => {
                            self.StoreCities.push(v);
                        });
                    }
                });
            }
        });
        this.ItemDetail.StoreCity.subscribe((newValue) => {
            if (newValue !== 'undefined' && newValue != null) {
                this.StoreAddresses.removeAll();
                $.ajax({
                    url: '/api/Store/GetStoresByStateAndCity?state=' + this.ItemDetail.StoreState() + '&city=' + newValue,
                    success: function (data) {
                        _.each(data, (v) => {
                            self.StoreAddresses.push(v);
                        });
                    }
                });
            }
        });
        $('.modalform-holder').on('click', '#save-contact', () => {
            $('#ItemDetail_RequireResponse').text('');
            $('#ItemDetail_RequireResponse').removeClass('label').removeClass('label-danger');
            $('#ItemDetail_RequireResponse').parent().removeClass('has-error').removeClass('has-feedback');
            var promise = this.form.post();
            promise.done(() => {
                window.location.href = "/ContactUs#/thankyou";
            });
            return false;
        });
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
        $("form.contact-us .row > div").on("form:property.validation.error", function (e) {
            var id = $(e.target).find("input").prop("id");
            console.log(id);
            var ffe = $("form.contact-us .ff-address-wrapper .error-message");
            if (id === "ItemDetail_Address")
                ffe.show();
            if (id === "ItemDetail_City")
                ffe.show();
            if (id === "ItemDetail_State")
                ffe.show();
            if (id === "ItemDetail_Zip")
                ffe.show();
        });
        //$('#ItemDetail_PurchaseDate').val('mm/dd/yyyy');
    }
}
module.exports = ContactUs;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"../Store/Store":78,"./ContactUsRouter":19,"jquery":109,"knockout":111,"underscore":113}],19:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class ContactUsRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: '/ContactUs#/new',
                func() {
                    var origin = this.params.platform;
                    self.vm.form.add();
                    if (origin != '') {
                        self.vm.ItemDetail.Origin(origin);
                    }
                    self.vm.ShowThankYou(false);
                },
                convertToRegEx: true
            },
            {
                name: '/ContactUs#/thankyou',
                func() {
                    self.vm.ShowThankYou(true);
                },
                convertToRegEx: true
            }
        ];
    }
}
module.exports = ContactUsRouter;

},{"../Base/Router":10}],20:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const ContactRouter = require("./ContactRouter");
const Form = require("../Base/Form");
class Contact extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, ContactRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Contact;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./ContactRouter":21,"jquery":109,"knockout":111}],21:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class ContactRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = ContactRouter;

},{"../Base/Router":10}],22:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: ContentPageTreeView
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class ContentPageTreeView extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = ContentPageTreeView;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],23:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const ContentPageForm = require("./ContentPageForm");
const Table = require("../Base/Table");
const PageBase = require("./ContentPageBase");
const ContentPageRouter = require("./ContentPageRouter");
class ContentPage extends PageBase {
    constructor(data, applyBindings = true) {
        //call base class constructor
        super(data, ContentPageForm, Table, ContentPageRouter);
        this.data = data;
        if (applyBindings) {
            ko.applyBindings(this);
            $('.hideUnbound').removeClass('hideUnbound');
        }
    }
}
module.exports = ContentPage;

},{"../Base/Table":11,"./ContentPageBase":24,"./ContentPageForm":25,"./ContentPageRouter":26,"jquery":109,"knockout":111}],24:[function(require,module,exports){
"use strict";
const base = require("../Base/VMBase");
class ContentPageBase extends base.VmBase {
    constructor(data, formType, tableType, routerType) {
        super(data, formType, tableType, routerType);
        this.data = data;
    }
}
module.exports = ContentPageBase;

},{"../Base/VMBase":12}],25:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const _ = require("underscore");
const Form = require("../Base/Form");
const moment = require("moment");
const summernote = require("summernote");
summernote;
class ContentPageForm extends Form {
    constructor(data, vm) {
        super(data, vm);
        this.data = data;
        this.vm = vm;
        this.versionErrorKey = 'CF1B6183-8A11-449F-8C4B-D1AE13B7DE0F';
        this.newPageName = ko.observable('');
        this.newPageName.subscribe((newValue) => {
            this.vm.NewItemDetail.Name(newValue);
        });
        this.addItemDetailClientOnlyProperties();
    }
    setupTabs() {
        $(this.tabRowSelector + ' h2').hide();
        //create a knockoutobservable foreach h2 inside a row
        $(this.tabRowSelector + ' h2').each((index, value) => {
            var element = $(value);
            var attr = 'visible: $root.ActiveTabIndex() === ' + index.toString();
            $(value).parent().parent().attr('data-bind', attr);
            var allLang = this.vm.Meta.AllLanguages;
            var matchingLang = _.findWhere(allLang, { Name: element.html() });
            var newTab = {
                Text: ko.observable(element.html()),
                ErrorCount: ko.observable(0),
                ChangeCount: ko.observable(0),
                Hidden: ko.observable(false),
                Id: null
            };
            if (matchingLang) {
                newTab.Id = matchingLang.Id;
            }
            this.vm.FormTabs.push(newTab);
        });
        this.vm.ActiveTabIndex(0);
    }
    //find the form input based on proprty key
    addPropertyError(propertyError) {
        var key = propertyError.Key, message = propertyError.ErrorMessage;
        var forminput = null;
        if (key.indexOf(this.versionErrorKey) > -1) {
            forminput = this.getVersionFormInput(key);
        }
        else {
            //find matching input
            forminput = $('#' + key.replace(/\./g, '_'));
        }
        this.formInputAddError(forminput, key, message);
    }
    removeError(key) {
        var forminput = null;
        if (key.indexOf(this.versionErrorKey) > -1) {
            forminput = this.getVersionFormInput(key);
        }
        else {
            forminput = $('#' + key.replace(/\./g, '_'));
        }
        this.formInputRemoveError(forminput, key);
    }
    formInputRemoveError(forminput, key) {
        super.formInputRemoveError(forminput, key);
    }
    getVersionFormInput(key) {
        var splitVal = key.split('|');
        var lang = splitVal[1];
        var version = splitVal[2];
        var property = splitVal[3];
        var vm = this.vm;
        //find the tab for the lang and 
        //var tab = _.find(this.vm.FormTabs(), { Id: lang });
        return $('#' + property, '.' + lang + '-tab');
    }
    //protected setupClearValidation(property) {
    //    var vmProperty;
    //    //get property off of vm using string name coming from server
    //    var propertyParts = property.split('.');
    //    var countOfParts = propertyParts.length;
    //    if (countOfParts === 2)
    //        vmProperty = this.vm[propertyParts[0]][propertyParts[1]];
    //    if (countOfParts === 3)
    //        var activeVersion = this.vm[propertyParts[0]][propertyParts[1]];
    //    vmProperty = $('input#Title.form-control');
    //    if (ko.isObservable(vmProperty)) {
    //        var subscription = vmProperty.subscribe((newValue) => {
    //            var forminput;
    //            //property id has _ instead of .
    //            if (countOfParts === 2)
    //                forminput = $('#' + property.replace(/\./g, '_'));
    //            //select2 uses parent
    //            if (forminput.hasClass('select2-offscreen')) {
    //                forminput = $('.select2-container', forminput.parent());
    //            }
    //            //remove error class to parent element
    //            var formGroup = forminput.parent();
    //            formGroup.removeClass('has-error has-feedback');
    //            //remove bootsrap popover
    //            if ((forminput).attr('data-trigger')) {
    //                forminput
    //                    .removeAttr('data-trigger')
    //                    .removeAttr('data-placement')
    //                    .removeAttr('data-content')
    //                    .popover('destroy') //todo bootstrap popover
    //                ;
    //            }
    //            //remove popover element
    //            $('.form-control-feedback', formGroup).remove();
    //            //get rid of subscription
    //            subscription.dispose();
    //            //refresh tabs
    //            this.refreshTabValidationBadges();
    //            //handle span differently
    //            var isSpan = forminput.is('span');
    //            if (isSpan) {
    //                forminput.text('');
    //                forminput.removeClass('label label-danger');
    //            }
    //        });
    //    }
    //}
    setupBindigs() {
        super.setupBindigs();
        var self = this;
        $('.version-tab').on('click', '.activate-version', function () {
            var data = ko.dataFor(this);
            //figure out version
            //make sure current Active_ version is valid (if its not valid we cant navigate away)
            self.vm.ItemDetail['Active_' + data.Language()](data);
            return false;
        });
        $(`.${this.data.Title}-form-body`).on('click', '#confirm-delete', () => {
            this.confirmDelete();
            return false;
        });
        this.addActiveTabLanguageId();
    }
    resetDetail() {
        super.resetDetail();
        this.clearAllVersions();
    }
    sortAllVersions() {
        //todo why does this make objects being sorted observable?
        //this.vm.ItemDetail.AllVersions.sort((version1, version2) => {
        //    if (version1.Date() === version2.Date()) {
        //        return version1.Version() < version2.Version();
        //    }
        //    return version1.Date() < version2.Date();
        //});
    }
    setupLanguageVersions() {
        var maxLanguageVersion = {};
        var self = this;
        this.clearAllLanguageVersions();
        _.each(this.vm.ItemDetail.AllVersions(), (v) => {
            //this needs to pull the parent url to append to the begining if it has a parent
            self.addNewPermalink(v);
            //add to language version array
            var language = v.Language();
            this.addVersionComputed(v);
            var propertyName = `All_${v.Language()}`;
            this.vm.ItemDetail[propertyName].push(v);
            //set max version in temp object
            //if there is no max version for language make it this one
            if (maxLanguageVersion[language] == undefined) {
                maxLanguageVersion[language] = v;
            }
            else {
                //if this one is bigger than the current max make this one the max
                if (v.Version() > maxLanguageVersion[language].Version()) {
                    maxLanguageVersion[language] = v;
                }
            }
        });
        //set max version to observable
        _.each(this.vm.Meta.AllLanguages, (v) => {
            var propertyName = `Active_${v.Id}`;
            if (maxLanguageVersion[v.Id] !== undefined) {
                var activeVersion = this.vm.ItemDetail[propertyName]();
                if (activeVersion === null) {
                    this.vm.ItemDetail[propertyName](maxLanguageVersion[v.Id]);
                }
                else {
                    var lang = v.Id;
                    var version = activeVersion.Version();
                    var activeVersion = _.find(this.vm.ItemDetail[`All_${v.Id}`](), (ver) => (ver.Version() === version && ver.Language() === lang));
                    this.vm.ItemDetail[propertyName](activeVersion);
                }
            }
            propertyName = `MaxVersion_${v.Id}`;
            var x = maxLanguageVersion[v.Id] ?
                maxLanguageVersion[v.Id] :
                ko.mapping.fromJS(ko.toJS(this.vm.NewVersion));
            this.vm.ItemDetail[propertyName](x);
        });
        this.addActiveTabLanguageId();
    }
    clearAllLanguageVersions() {
        _.each(this.vm.Meta.AllLanguages, (v) => {
            var propertyName = `All_${v.Id}`;
            this.vm.ItemDetail[propertyName].removeAll();
        });
    }
    addVersionComputed(version) {
    }
    addActiveTabLanguageId() {
        this.vm.ItemDetail['ActiveTabLanguageId'] = ko.computed(() => {
            if (this.data.Meta.AllLanguages[this.vm.ActiveTabIndex()])
                return this.data.Meta.AllLanguages[this.vm.ActiveTabIndex()].Id;
            return null;
        });
    }
    getNewVersion(language) {
        var maxVersion = this.vm.ItemDetail['MaxVersion_' + language]().Version();
        var newVersion = maxVersion + 1;
        var versionToCreateFrom = this.getVersionToCreateFrom(language);
        var newObservable = ko.mapping.fromJS(ko.toJS(versionToCreateFrom));
        this.addVersionComputed(newObservable);
        newObservable.Id(this.vm.NewVersion.Id());
        var today = moment().format('YYYY-MM-DD[T]') + '00:00:00';
        newObservable.Version(newVersion);
        newObservable.VersionDisplay(language + '-' + newObservable.Version());
        newObservable.Language(language);
        newObservable.Date(today);
        newObservable.StartDateTime = ko.observable(new Date());
        newObservable.Date(today);
        newObservable.ParentContentPage = ko.observable(versionToCreateFrom.ParentContentPage());
        newObservable.IsReadOnly(false);
        newObservable.CreatedBy(this.vm.User.UserName());
        newObservable.CreatedDate(today);
        newObservable.Status(this.vm.NewVersion.Status());
        //newObservable.Status('Draft');
        this.vm.ItemDetail.AllVersions.push(newObservable);
        this.vm.ItemDetail['All_' + language].push(newObservable);
        this.sortAllVersions();
        this.vm.ItemDetail['MaxVersion_' + language](newObservable);
        this.addNewPermalink(newObservable);
        this.vm.ItemDetail['Active_' + language](newObservable);
        return newObservable;
    }
    getVersionToCreateFrom(language) {
        //first see if there is a active version for language
        var versionToCreateFrom = this.vm.ItemDetail['Active_' + language]();
        //check all versions 
        if (versionToCreateFrom === null) {
            versionToCreateFrom = _.max(this.vm.ItemDetail.AllVersions(), function (version) { return version.Version(); });
            if (versionToCreateFrom === -Infinity)
                versionToCreateFrom = null;
        }
        //finally used default new version
        if (versionToCreateFrom === null) {
            versionToCreateFrom = this.vm.NewVersion;
        }
        return versionToCreateFrom;
    }
    //changeStatus(id, status) {
    //    var propertyName = `Active_${id}`;
    //    //keep track of the original status incase the server validation fails
    //    this.vm.ItemDetail[propertyName]().OriginalStatus(this.vm.ItemDetail[propertyName]().Status());
    //    this.vm.ItemDetail[propertyName]().Status(status);
    //    super.post();
    //}
    changeStatus(id, status) {
        var propertyName = `Active_${id}`;
        var oldStatus = this.vm.ItemDetail[propertyName]().Status();
        this.vm.ItemDetail[propertyName]().OriginalStatus(oldStatus);
        this.vm.ItemDetail[propertyName]().Status(status);
        this.vm.ItemDetail.ActiveVersionDisplay(this.vm.ItemDetail[propertyName]().VersionDisplay());
        this.post();
        //var promise = super.post();
        //promise.fail((data) => this.getPromiseFail(data, id));
        //return promise;
    }
    unPublish(id) {
        var propertyName = `Active_${id}`;
        var endTime = moment().format('YYYY-MM-DD[T]') + '00:00:00';
        var startTime = moment().subtract(1, 'days').format('YYYY-MM-DD[T]') + '00:00:00';
        if (this.vm.ItemDetail[propertyName]().StartDateTime() === endTime) {
            this.vm.ItemDetail[propertyName]().StartDateTime(startTime);
        }
        this.vm.ItemDetail[propertyName]().EndDateTime(endTime);
        this.post();
    }
    preview(id) {
        var propertyName = `Active_${id}`;
        this.vm.LeaveOpenOnAjaxSuccess(true);
        var promise = this.post();
        promise.done((data) => {
            var version = this.vm.ItemDetail[propertyName]();
            this.vm.LeaveOpenOnAjaxSuccess(false);
            var url = version.PermalinkDisplay() + '?previewId=' + version.Id() + '&tick=' + Date.now();
            window.open(url, '_blank');
        });
    }
    clearAllVersions() {
        var self = this;
        //create a dynamic active observable for each lang type
        _.each(self.vm.Meta.AllLanguages, (v, i) => {
            var propertyName = 'Active_' + v.Id;
            this.vm.ItemDetail[propertyName](null);
            var propertyName = 'MaxVersion_' + v.Id;
            var maxVersion = ko.mapping.fromJS(ko.toJS(this.vm.NewVersion));
            this.vm.ItemDetail[propertyName](maxVersion);
            var propertyName = 'All_' + v.Id;
            this.vm.ItemDetail[propertyName].removeAll();
        });
    }
    addItemDetailClientOnlyProperties() {
        //create a dynamic active observable for each lang type
        _.each(this.vm.Meta.AllLanguages, (v, i) => {
            //Active
            var activePropertyName = `Active_${v.Id}`;
            this.vm.ItemDetail[activePropertyName] = ko.observable(null);
            //Max
            this.vm.ItemDetail[`MaxVersion_${v.Id}`] = ko.observable(null);
            //All
            var propertyName = `All_${v.Id}`;
            this.vm.ItemDetail[propertyName] = ko.observableArray([]);
        });
    }
    komappingfromdata(data, id) {
        var copyMapping = {
            'copy': this.data.KOMapping.allNonPostBack
        };
        //do not make ParentContentPage child properties observable
        //make the whole ParentContentPage object itself observable
        copyMapping['ParentContentPage'] = { 'create': function (options) {
                return ko.observable(options.data);
            } };
        ko.mapping.fromJS(data.ItemDetail, copyMapping, this.vm.ItemDetail);
    }
    addNewPermalink(v) {
        v.PermalinkDisplay = ko.computed(() => {
            var permalinkDisplay;
            var language = v.Language() + '/';
            if (v.Language() === 'en')
                language = '';
            //if we have a parent get its active node language match and prepend its url 
            if (v.ParentContentPage() !== null) {
                var version = _.find(v.ParentContentPage().ActiveTreeNodes, (node) => (node.Language === v.Language()));
                if (version !== undefined && version !== null) {
                    var url = v.Url() === null ? '' : v.Url();
                    permalinkDisplay = this.data.RootUrl + language + version.Url + '/' + url;
                }
            }
            else {
                var url = v.Url() === null ? '' : v.Url();
                permalinkDisplay = this.data.RootUrl + language + url;
            }
            return permalinkDisplay;
        });
    }
    getPromiseFail(error, id) {
        var propertyName = `Active_${id}`;
        var oldStatus = this.vm.ItemDetail[propertyName]().OriginalStatus();
        this.vm.ItemDetail[propertyName]().Status(oldStatus);
    }
    //getPromiseFail(error, id) {
    //    super.getPromiseFail(error, id);
    //}
    getPromiseDone(data, id) {
        super.getPromiseDone(data, id);
        this.sortAllVersions();
        this.setupLanguageVersions();
    }
    postPromiseDone(data) {
        if (!this.vm.LeaveOpenOnAjaxSuccess()) {
            this.vm.routes.goBack();
            this.resetDetail();
            this.vm.AddAlert(data.Message, 'success');
        }
        else {
            this.mapPostData(data);
        }
        this.vm.IsLoading(false);
    }
    postPromiseFail(error) {
        super.postPromiseFail(error);
        _.each(this.vm.ItemDetail.AllVersions(), function (version) {
            if (version.OriginalStatus()) {
                version.Status(version.OriginalStatus());
                version.OriginalStatus(null);
            }
        });
    }
    getVmProperty(property) {
        if (property.indexOf(this.versionErrorKey) > -1) {
            var splitVal = property.split('|');
            var lang = splitVal[1];
            var version = splitVal[2];
            var property = splitVal[3];
            //var vm = this.vm;
            var errorVersion = _.find(this.vm.ItemDetail.AllVersions(), function (v) { return (v.Version().toString() === version && v.Language() === lang); });
            return errorVersion[property];
        }
        else {
            return super.getVmProperty(property);
        }
    }
    mapPostData(data) {
        super.mapPostData(data);
        this.setupLanguageVersions();
    }
    post() {
        //prevent double post
        if (this.vm.IsLoading()) {
            return;
        }
        //make overlay loading div full height
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this.vm, ignoreMapping);
        $.each(postData.ItemDetail.AllVersions, function (i, v) {
            if (moment.isMoment(v.StartDateTime))
                v.StartDateTime = v.StartDateTime.format("YYYY-MM-DTHH:mm:ss.mmm");
            if (!isNaN(v.EndDateTime)) {
                if (moment.isMoment(v.EndDateTime))
                    v.EndDateTime = v.EndDateTime.format("YYYY-MM-DTHH:mm:ss.mmm");
            }
        });
        postData = JSON.stringify(postData);
        postData = postData.replace('<!--<script', '<script');
        postData = postData.replace('</script>-->', '</script>');
        delete postData.Alerts;
        delete postData.NewVersion;
        var promise = $.ajax({
            url: this.postUrl.toString().toLowerCase(),
            data: postData,
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8',
        });
        promise.fail((error) => this.postPromiseFail(error));
        promise.done(data => this.postPromiseDone(data));
        return promise;
    }
}
module.exports = ContentPageForm;

},{"../Base/Form":7,"jquery":109,"knockout":111,"moment":112,"summernote":95,"underscore":113}],26:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class ContentPageRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = ContentPageRouter;

},{"../Base/Router":10}],27:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class CouponRedemption extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = CouponRedemption;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],28:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class Coupon extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = Coupon;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],29:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const DashboardVersionRouter = require("./DashboardVersionRouter");
const DashboardVersionForm = require("./DashboardVersionForm");
class DashboardVersion extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, DashboardVersionForm, Table, DashboardVersionRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = DashboardVersion;

},{"../Base/Table":11,"../Base/VMBase":12,"./DashboardVersionForm":30,"./DashboardVersionRouter":31,"jquery":109,"knockout":111}],30:[function(require,module,exports){
"use strict";
const Form = require("../Base/Form");
class DashboardVersionForm extends Form {
    constructor(data, vm, editAction = 'Edit') {
        super(data, vm, editAction);
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
        $('#ItemDetail_UpgradeRequired').on('click', () => {
            if (vm.ItemDetail.UpgradeRequired() == false) {
                $('#upgrade-required-modal').modal({
                    backdrop: 'static',
                    keyboard: false
                });
            }
            else {
                vm.ItemDetail.UpgradeRequired(false);
                vm.ItemDetail.CurrentVersion(true);
            }
        });
        $('#require-upgrade').on('click', () => {
            vm.ItemDetail.UpgradeRequired(true);
            vm.ItemDetail.CurrentVersion(false);
            $('#upgrade-required-modal').modal('hide');
        });
        $('#require-upgrade-cancel').on('click', () => {
            vm.ItemDetail.UpgradeRequired(false);
            vm.ItemDetail.CurrentVersion(true);
            $('#upgrade-required-modal').modal('hide');
        });
        $('#ItemDetail_CurrentVersion').on('click', () => {
            vm.ItemDetail.UpgradeRequired(false);
        });
    }
}
module.exports = DashboardVersionForm;

},{"../Base/Form":7}],31:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class DashboardVersionRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = DashboardVersionRouter;

},{"../Base/Router":10}],32:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
class Error {
    constructor(data) {
        //call base class constructor
        // super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Error;

},{"jquery":109,"knockout":111}],33:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: FeedbackKeywordLog
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
const _ = require("underscore");
class FeedbackKeywordLog extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
    clearFilters() {
        _.each(this.Filters, (v) => {
            v('');
        });
    }
}
module.exports = FeedbackKeywordLog;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111,"underscore":113}],34:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: FeedbackKeyword
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Form = require("../Base/Form");
const FeedbackKeywordRouter = require("./FeedbackKeywordRouter");
class FeedbackKeyword extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FeedbackKeywordRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = FeedbackKeyword;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./FeedbackKeywordRouter":35,"jquery":109,"knockout":111}],35:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FeedbackKeywordRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FeedbackKeywordRouter;

},{"../Base/Router":10}],36:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const FundraiserBlackoutDateRouter = require("./FundraiserBlackoutDateRouter");
const Form = require("../Base/Form");
class FundraiserBlackoutDate extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FundraiserBlackoutDateRouter);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = FundraiserBlackoutDate;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./FundraiserBlackoutDateRouter":37,"jquery":109,"knockout":111}],37:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FundraiserBlackoutDateRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FundraiserBlackoutDateRouter;

},{"../Base/Router":10}],38:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: FundraiserInquiry
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Form = require("../Base/Form");
const FundraiserInquiryRouter = require("./FundraiserInquiryRouter");
const _ = require("underscore");
class FundraiserInquiry extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FundraiserInquiryRouter);
        this.data = data;
        this.NumDates = 1;
        var self = this;
        $('.modalform-holder').on('click', '#save-fundraiser-inquiry', () => {
            self.ItemDetail.InterestedDates([]);
            $('input[name^="ItemDetail.InterestedDates"]').each(function () {
                if ($(this).val()) {
                    self.ItemDetail.InterestedDates().push($(this).val());
                }
            });
            var promise = this.form.post();
            promise.done(() => {
                window.location.href = "/fundraiserinquiry#/thankyou";
            });
            return false;
        });
        $('.modalform-holder').on('click', '#add-interested-date', () => {
            $('#interested-dates').append('<div class="input-group"><div class="date-input"><input name="ItemDetail.InterestedDates[' + self.NumDates + ']" class="form-control" id="ItemDetail_InterestedDates[' + this.NumDates + ']" type="date"></div><div class="input-group-addon background-white"><i class="fa fa-calendar"></i></div></div>');
            this.NumDates++;
            return false;
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
    clearFilters() {
        _.each(this.Filters, (v) => {
            v('');
        });
    }
}
module.exports = FundraiserInquiry;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./FundraiserInquiryRouter":39,"jquery":109,"knockout":111,"underscore":113}],39:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FundraiserInquiryRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: '/FundraiserInquiry#/new',
                func() {
                    self.vm.form.add();
                    self.vm.ShowThankYou(false);
                },
                convertToRegEx: true
            },
            {
                name: '/FundraiserInquiry#/thankyou',
                func() {
                    self.vm.ShowThankYou(true);
                },
                convertToRegEx: true
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                    self.vm.ShowThankYou(false);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/thankyou`,
                func() {
                    self.vm.ShowThankYou(true);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FundraiserInquiryRouter;

},{"../Base/Router":10}],40:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: FundraiserLog
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class FundraiserLog extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
    copyFundraiser(id) {
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        console.log(id);
        var promise = $.ajax({
            url: '/Admin/FundraiserLog/Copy',
            data: 'id=' + id,
            type: 'POST',
            cache: false
        });
        promise.fail((error) => {
            this.IsLoading(false);
        });
        promise.done(data => {
            this.IsLoading(false);
        });
    }
}
module.exports = FundraiserLog;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],41:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Modal = require("../Common/Modal");
const LoginForm = require("./FundraiserLoginForm");
class FundraiserLogin extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, LoginForm, Table, Router);
        this.data = data;
        var self = this;
        this.modal = new Modal("forgotPassword");
        this.modal.init();
        self.ItemDetail.ShowSuccess(false);
        $("div.login-box").on("click", "a.forgot-password", function () {
            $("#resetEmailAddress").val(null);
            self.ItemDetail.ShowSuccess(false);
            self.ItemDetail.EmailIsValid(true);
            self.modal.open("forgotPassword");
        });
        $('div.px-modal div.button-group button.button.secondary.reset-password-done').on('click', function () {
            window.location.href = "/fundraiserlogin#/index";
        });
        $('div.px-modal div.button-group button.button.secondary.reset-password').on('click', function (event) {
            event.preventDefault();
            var email = $("#resetEmailAddress").val();
            var url = "/pandafundraisermember/forgotpassword?emailAddress=" + email;
            var mapping = {
                'ignore': self.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(self, mapping);
            $("#loading").height($(window).height());
            self.IsLoading(true);
            var promise = $.ajax({
                url: url,
                data: JSON.stringify(postData),
                type: "POST",
                cache: false,
                contentType: "application/json;charset=utf-8"
            });
            promise.fail(function (error) {
                //something went wrong display error
                self.ItemDetail.EmailIsValid(false);
                self.IsLoading(false);
            });
            promise.done(function (vm) {
                self.ItemDetail.EmailIsValid(true);
                self.ItemDetail.ShowSuccess(true);
                self.IsLoading(false);
            });
            return promise;
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = FundraiserLogin;

},{"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"../Common/Modal":14,"./FundraiserLoginForm":42,"jquery":109,"knockout":111}],42:[function(require,module,exports){
"use strict";
const Form = require("../Base/Form");
class FundraiserLoginForm extends Form {
    constructor(data, vm, editAction = 'Login') {
        super(data, vm, editAction);
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
    }
    post() {
        var promise = super.post();
        promise.done(data => {
            window.location.href = data.ReturnUrl;
        });
        promise.fail(error => {
            this.vm.Message(error.responseJSON.Message);
        });
        return promise;
    }
    promiseDone(data, id) {
        super.getPromiseDone(data, id);
        window.location.href = data.ReturnUrl;
    }
}
module.exports = FundraiserLoginForm;

},{"../Base/Form":7}],43:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Form = require("../Base/Form");
const FundraiserMemberRouter = require("./FundraiserMemberRouter");
class FundraiserMember extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FundraiserMemberRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = FundraiserMember;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./FundraiserMemberRouter":44,"jquery":109,"knockout":111}],44:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FundraiserMemberRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FundraiserMemberRouter;

},{"../Base/Router":10}],45:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const FundraiserUnitExceptionRouter = require("./FundraiserUnitExceptionRouter");
const Form = require("../Base/Form");
class FundraiserUnitException extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FundraiserUnitExceptionRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = FundraiserUnitException;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./FundraiserUnitExceptionRouter":46,"jquery":109,"knockout":111}],46:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FundraiserUnitExceptionRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FundraiserUnitExceptionRouter;

},{"../Base/Router":10}],47:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const FundraiserRouter = require("./FundraiserRouter");
const Form = require("../Base/Form");
const Modal = require("../Common/Modal");
const _ = require("underscore");
class Fundraiser extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FundraiserRouter);
        this.data = data;
        this.modal = new Modal('fundraiserStatusWarning');
        this.modal.init();
        var self = this;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
        $('#item-detail-form').on("change", '#ItemDetail_Status', () => {
            //your code goes here...
            if ($('#ItemDetail_Status').val() == 'COMPLETED') {
                this.modal.open('clicked-status');
            }
            ;
        });
        $('#save').on('click', function () {
            if ($('#ItemDetail_Status').val() == 'COMPLETED') {
                $('#item-detail-form #ItemDetail_Status').trigger("change");
                return false;
            }
        });
        $('#Logo').on('change', function () {
            for (var i = 0; i < this.files.length; i++) {
                var file = this.files[i];
                var fd = new FormData();
                fd.append("fileToUpload", file);
                $.ajax({
                    url: '/pandafundraiser/uploadfile',
                    data: fd,
                    type: 'POST',
                    cache: false,
                    processData: false,
                    contentType: false,
                    success: function (data) {
                        self.ItemDetail.Logo(data);
                    }
                });
            }
        });
        $('body').on('click', '.remove-logo', (e) => {
            e.preventDefault();
            this.ItemDetail.Logo('');
            $('#Logo').val('');
        });
        this.ItemDetail.NumberStores.subscribe(function (numberStores) {
            if (numberStores === 'Multiple Stores') {
                self.ItemDetail.ShowMultipleStoresUpload(true);
            }
            else {
                self.ItemDetail.ShowMultipleStoresUpload(false);
            }
        });
        $('body').on('change', '#Stores', function () {
            for (var i = 0; i < this.files.length; i++) {
                var file = this.files[i];
                var fd = new FormData();
                fd.append("fileToUpload", file);
                $.ajax({
                    url: '/admin/fundraiser/UploadFundraiserStoreList',
                    data: fd,
                    type: 'POST',
                    cache: false,
                    processData: false,
                    contentType: false,
                    success: function (data) { },
                    error: function () {
                        console.log('error');
                        $('#StoreUploadError').html('There was an error uploading file');
                    }
                });
            }
        });
    }
    clearFilters() {
        _.each(this.Filters, (v) => {
            v('');
        });
    }
    exportFundraisers() {
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this, ignoreMapping);
        delete postData.Alerts;
        var promise = $.ajax({
            url: '/Admin/Fundraiser/Export',
            data: JSON.stringify(postData),
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8'
        });
        promise.fail((error) => {
            this.IsLoading(false);
        });
        promise.done(data => {
            this.IsLoading(false);
        });
    }
}
module.exports = Fundraiser;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"../Common/Modal":14,"./FundraiserRouter":48,"jquery":109,"knockout":111,"underscore":113}],48:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FundraiserRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                    self.vm.ItemDetail.NumberStores('One Store');
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FundraiserRouter;

},{"../Base/Router":10}],49:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const PageBase = require("../ContentPage/ContentPageBase");
const GridContentPageForm = require("./GridContentPageForm");
const Table = require("../Base/Table");
const ContentPageRouter = require("../ContentPage/ContentPageRouter");
class GridContentPage extends PageBase {
    constructor(data) {
        super(data, GridContentPageForm, Table, ContentPageRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = GridContentPage;

},{"../Base/Table":11,"../ContentPage/ContentPageBase":24,"../ContentPage/ContentPageRouter":26,"./GridContentPageForm":50,"jquery":109,"knockout":111}],50:[function(require,module,exports){
"use strict";
const _ = require("underscore");
const PageForm = require("../ContentPage/ContentPageForm");
class GridContentPageForm extends PageForm {
    constructor(data, vm) {
        super(data, vm);
        this.data = data;
        this.vm = vm;
        this.addItemDetailClientOnlyProperties();
    }
    setupBindigs() {
        super.setupBindigs();
        var self = this;
        var modelHolderSelector = $('.modalform-holder');
        //Toggle Collapse
        modelHolderSelector.on('click', '.toggle-row', function () {
            var data = ko.dataFor(this); //local this
            data.Hidden(!data.Hidden());
        });
        modelHolderSelector.on('click', '.gridcell-toggle', function () {
            var data = ko.dataFor(this); //local this
            data.Expanded(!data.Expanded());
            var cell = $(this).parent().parent().parent(); //local this
            var originalClass = cell.attr('data-normal-css');
            if (cell.hasClass(originalClass)) {
                cell.removeClass(originalClass);
                cell.addClass('col-xs-12');
            }
            else {
                cell.addClass(originalClass);
                cell.removeClass('col-xs-12');
            }
        });
        modelHolderSelector.on('click', '.minimize-all', function () {
            var data = ko.dataFor(this); //local this
            self.minimizeAllRows(data);
        });
        modelHolderSelector.on('click', '.maximize-all', function () {
            var data = ko.dataFor(this); //local this
            self.maximizeAllRows(data);
        });
        //Removing
        modelHolderSelector.on('click', '.row-remove', function () {
            var data = ko.dataFor(this); //local this
            var context = ko.contextFor(this); //local this
            var grid = context.$parent;
            grid.Rows.remove(data);
        });
        modelHolderSelector.on('click', '.cell-remove', function () {
            var data = ko.dataFor(this); //local this
            var context = ko.contextFor(this); //local this
            var row = context.$parent;
            row.Cells.remove(data);
        });
        modelHolderSelector.on('click', '.href-remove', function () {
            var data = ko.dataFor(this); //local this
            var context = ko.contextFor(this); //local this
            var cell = context.$parent;
            cell.Hrefs.remove(data);
        });
        //Adding
        modelHolderSelector.on('click', '.add-row', function () {
            var data = ko.dataFor(this); //local this
            self.minimizeAllRows(data);
            var order = data.Rows().length + 1;
            var row = self.vm.NewRow;
            var rowCopy = ko.mapping.fromJS(ko.toJS(row));
            self.addSortedCells(rowCopy);
            var cell = self.vm.NewCell;
            var cellCopy = ko.mapping.fromJS(ko.toJS(cell));
            self.addSortedHrefs(cellCopy);
            cellCopy.Order(order);
            rowCopy.Cells.push(cellCopy);
            rowCopy.Order(order);
            data.Rows.push(rowCopy);
        });
        modelHolderSelector.on('click', '.add-cell', function () {
            var row = ko.dataFor(this); //local this
            var order = row.Cells().length + 1;
            var cell = self.vm.NewCell;
            var cellCopy = ko.mapping.fromJS(ko.toJS(cell));
            self.addSortedHrefs(cellCopy);
            cellCopy.Order(order);
            row.Cells.push(cellCopy);
        });
        modelHolderSelector.on('click', '.add-href', function () {
            var cell = ko.dataFor(this); //local this
            var href = self.vm.NewHref;
            var hrefCopy = ko.mapping.fromJS(ko.toJS(href));
            cell.Hrefs.push(hrefCopy);
        });
    }
    minimizeAllRows(data) {
        _.each(data.Rows(), (row) => {
            row.Hidden(true);
        });
    }
    maximizeAllRows(data) {
        _.each(data.Rows(), (row) => {
            row.Hidden(false);
        });
    }
    getNewVersion(language) {
        var newVersion = super.getNewVersion(language);
        //reset all Ids to 00000000-0000-0000-0000-000000000000
        //so that all all children of new version are new copies
        var defaultId = newVersion.Id();
        _.each(newVersion.Rows(), (row) => {
            row.Id(defaultId);
            _.each(row.Cells(), (cell) => {
                cell.Id(defaultId);
                _.each(cell.Hrefs(), (href) => {
                    href.Id(defaultId);
                });
            });
        });
        return newVersion;
    }
    addVersionComputed(version) {
        super.addVersionComputed(version);
        //sorted rows
        version.SortedRows = ko.computed(() => {
            return version.Rows().sort((left, right) => (left.Order() === right.Order() ? 0 : (left.Order() < right.Order() ? -1 : 1)));
        });
        //sorted cells
        _.each(version.Rows(), (row) => {
            this.addSortedCells(row);
        });
        version.showMinimizeAll = ko.computed(() => _.any(version.Rows(), (row) => (!row.Hidden())));
        version.showMaximizeAll = ko.computed(() => _.any(version.Rows(), (row) => (row.Hidden())));
    }
    addSortedCells(row) {
        row.SortedCells = ko.computed(() => {
            return row.Cells().sort((left, right) => (left.Order() === right.Order() ? 0 : (left.Order() < right.Order() ? -1 : 1)));
        });
        //sorted cells
        _.each(row.Cells(), (cell) => {
            this.addSortedHrefs(cell);
        });
    }
    addSortedHrefs(cell) {
        cell.SortedHrefs = ko.computed(() => cell.Hrefs().sort((left, right) => (left.Order() === right.Order() ? 0 : (left.Order() < right.Order() ? -1 : 1))));
    }
    post() {
        //prevent double post
        if (this.vm.IsLoading()) {
            return;
        }
        //make overlay loading div full height
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this.vm, ignoreMapping);
        $.each(postData.ItemDetail.AllVersions, function (i, v) {
            if (moment.isMoment(v.StartDateTime))
                v.StartDateTime = v.StartDateTime.format("YYYY-MM-DTHH:mm:ss.mmm");
            if (!isNaN(v.EndDateTime)) {
                if (moment.isMoment(v.EndDateTime))
                    v.EndDateTime = v.EndDateTime.format("YYYY-MM-DTHH:mm:ss.mmm");
            }
        });
        postData = JSON.stringify(postData);
        postData = postData.replace('<!--<script', '<script');
        postData = postData.replace('</script>-->', '</script>');
        delete postData.Alerts;
        delete postData.NewVersion;
        var promise = $.ajax({
            url: this.postUrl.toString().toLowerCase(),
            data: postData,
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8',
        });
        promise.fail((error) => this.postPromiseFail(error));
        promise.done(data => this.postPromiseDone(data));
        return promise;
    }
}
module.exports = GridContentPageForm;

},{"../ContentPage/ContentPageForm":25,"underscore":113}],51:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const HalfAndHalfRouter = require("./HalfAndHalfRouter");
const Form = require("../Base/Form");
class HalfAndHalf extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, HalfAndHalfRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = HalfAndHalf;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./HalfAndHalfRouter":52,"jquery":109,"knockout":111}],52:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class HalfAndHalfRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = HalfAndHalfRouter;

},{"../Base/Router":10}],53:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const HomeStreamRouter = require("./HomeStreamRouter");
const Form = require("../Base/Form");
class HomeStream extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, HomeStreamRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = HomeStream;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./HomeStreamRouter":54,"jquery":109,"knockout":111}],54:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class HomeStreamRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    //self.vm.table.load();
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = HomeStreamRouter;

},{"../Base/Router":10}],55:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class Meal extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Meal;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],56:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const MediaRouter = require("./MediaRouter");
const Form = require("../Base/Form");
class Media extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, MediaRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Media;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./MediaRouter":57,"jquery":109,"knockout":111}],57:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class MediaRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = MediaRouter;

},{"../Base/Router":10}],58:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const MenuCategoryRouter = require("./MenuCategoryRouter");
const Form = require("../Base/Form");
class MenuItem extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, MenuCategoryRouter);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = MenuItem;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./MenuCategoryRouter":59,"jquery":109,"knockout":111}],59:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class MenuCategoryRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = MenuCategoryRouter;

},{"../Base/Router":10}],60:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const MenuItemRouter = require("./MenuItemRouter");
const Form = require("../Base/Form");
class MenuItem extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, MenuItemRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = MenuItem;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./MenuItemRouter":61,"jquery":109,"knockout":111}],61:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class MenuItemRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = MenuItemRouter;

},{"../Base/Router":10}],62:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
class Menu extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, null, null, null);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = Menu;

},{"../Base/VMBase":12,"jquery":109,"knockout":111}],63:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class MobileFeature extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = MobileFeature;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],64:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
class Nutrition {
    constructor(data) {
        //call base class constructor
        // super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Nutrition;

},{"jquery":109,"knockout":111}],65:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class PandaFundraiserBlackoutDate extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = PandaFundraiserBlackoutDate;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],66:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
//import Form = require('../Base/Form');
const PandaFundraiserMemberForm = require("./PandaFundraiserMemberForm");
class PandaFundraiserMember extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, PandaFundraiserMemberForm, Table, Router);
        this.data = data;
        var self = this;
        self.LeaveOpenOnAjaxSuccess(false);
        self.ItemDetail.ShowSuccess(false);
        $("#register").on("click", () => {
            var url = "/pandafundraisermember/edit";
            var mapping = {
                'ignore': this.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(this, mapping);
            $("#loading").height($(window).height());
            this.IsLoading(true);
            delete postData.Alerts;
            var promise = $.ajax({
                url: url,
                data: JSON.stringify(postData),
                type: "POST",
                cache: false,
                contentType: "application/json;charset=utf-8"
            });
            promise.fail(function (error) {
                //something went wrong display error
                var html = error.error().responseText;
                var element = $("<div/>").html(html);
                $("style", element).remove();
                var htmlText = element.html();
                this.AddAlert(htmlText, "error");
                this.IsLoading(false);
            });
            promise.done(function (data) {
                if (data.LoginSuccess) {
                    window.location.href = data.ReturnUrl;
                }
                else {
                    this.AddAlert(data.Message, "error");
                }
                this.vm.IsLoading(false);
            });
            return promise;
        });
        $('button.button.primary.change-password').on('click', function (event) {
            event.preventDefault();
            var url = "/pandafundraisermember/resetpassword";
            var mapping = {
                'ignore': self.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(self, mapping);
            delete postData.Alerts;
            $("#loading").height($(window).height());
            self.IsLoading(true);
            var promise = $.ajax({
                url: url,
                data: JSON.stringify(postData),
                type: "POST",
                cache: false,
                contentType: "application/json;charset=utf-8"
            });
            promise.fail((error) => self.form.postPromiseFail(error));
            promise.done(function (vm) {
                self.ItemDetail.ShowSuccess(true);
                self.IsLoading(false);
            });
            return promise;
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = PandaFundraiserMember;

},{"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"./PandaFundraiserMemberForm":67,"jquery":109,"knockout":111}],67:[function(require,module,exports){
"use strict";
const Form = require("../Base/Form");
class PandaFundraiserMemberForm extends Form {
    constructor(data, vm, editAction = 'Edit') {
        super(data, vm, editAction);
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
        var self = this;
    }
    post() {
        this.vm.ItemDetail.InvalidEmailMessage(null);
        var promise = super.post();
        promise.done(data => {
            //window.location.href = data.ReturnUrl;
            if (this.vm.ItemDetailIsNew())
                window.location.href = '/fundraiserlogin#/index';
            else
                window.location.href = '/pandafundraiser#/list';
        });
        promise.fail(error => {
            this.vm.Message = error.responseJSON.Message;
            var html = error.error().responseText;
            var element = $("<div/>").html(html);
            $("style", element).remove();
            var htmlText = element.html();
            this.vm.AddAlert(htmlText, "error");
        });
        return promise;
    }
}
module.exports = PandaFundraiserMemberForm;

},{"../Base/Form":7}],68:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const PandaFundraiserRouter = require("./PandaFundraiserRouter");
const PandaFundraiserForm = require("./PandaFundraiserForm");
const Store = require("../Store/Store");
const Modal = require("../Common/Modal");
const _ = require("underscore");
class PandaFundraiser extends base.VmBase {
    //me: this;
    constructor(data) {
        //call base class constructor
        super(data, PandaFundraiserForm, Table, PandaFundraiserRouter);
        this.data = data;
        this.table.orderby = "EventDate desc";
        //setup table, routes and form
        var self = this;
        //reuse the store vm for store search
        this.storeVm = new Store(data.StoreViewModel, false, true);
        this.storeVm.Filters.ShowHawaii(false);
        this.modal = new Modal("deleteEvent");
        this.modal.init();
        $(".table-holder-" + this.data.Title).on("click", "a.cancel-event", function () {
            var aData = ko.dataFor(this); //local this
            var id = aData.UniqueId;
            self.modal.open(id);
        });
        $('div.px-modal div.button-group button.button.secondary').on('click', function () {
            //self.Alerts = ;
            var url = "/pandafundraiser/cancel?uniqueid=" + self.modal.eventId;
            var mapping = {
                'ignore': self.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(self, mapping);
            $("#loading").height($(window).height());
            self.IsLoading(true);
            var promise = $.ajax({
                url: url,
                data: JSON.stringify(postData),
                type: "POST",
                cache: false,
                contentType: "application/json;charset=utf-8"
            });
            promise.fail(error => {
                //something went wrong display error
                var html = error.error().responseText;
                var element = $("<div/>").html(html);
                $("style", element).remove();
                var htmlText = element.html();
                self.AddAlert(htmlText, "error");
                self.IsLoading(false);
            });
            promise.done(vm => {
                window.location.hash = '#/' + vm.DefaultSammyRoute;
                self.IsLoading(false);
                self.table.load();
            });
            self.modal.close();
            //return true;
            return promise;
        });
        $('.modalform-holder').on('click', '#continue-fundraiser', () => {
            //prevent double post
            if (this.IsLoading() || (!this.ItemDetail.CanEdit() && !this.ItemDetailIsNew())) {
                return false;
            }
            var re = new RegExp('MemberId');
            var value = re.exec(document.cookie);
            if (value === null) {
                window.location.href = '/fundraiserlogin#/index';
            }
            this.ItemDetail.CustomerConfirmed(false);
            var captcha = window["fundraiserCaptchaSatisfied"];
            if (!captcha) {
                if (this.ItemDetail.AgreeToTerms())
                    alert("Please complete the captcha challenge.");
                return false;
            }
            //make overlay loading div full height
            $('#loading').height($(window).height());
            this.IsLoading(true);
            var ignoreMapping = {
                'ignore': this.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(this, ignoreMapping);
            delete postData.Alerts;
            var promise = $.ajax({
                url: 'pandafundraiser/edit',
                data: JSON.stringify(postData),
                type: 'POST',
                cache: false,
                contentType: 'application/json;charset=utf-8',
            });
            promise.fail((error) => {
                if (error.status === 400) {
                    _.each(error.responseJSON.ModelState.PropertyErrors, (propertyError) => {
                        this.form.addPropertyError(propertyError);
                    });
                    _.each(error.responseJSON.ModelState.ModelErrors, (v) => {
                        // addAlert(v.ErrorMessage, 'error');
                    });
                    if (error.responseJSON.Message) {
                        this.Message = error.responseJSON.Message;
                    }
                    this.form.refreshTabValidationBadges();
                }
                else {
                    if (error.responseJSON) {
                        if (error.responseJSON.Message) {
                            this.AddAlert(error.responseJSON.Message, 'error');
                        }
                        else {
                            var html = error.error().responseText;
                            var element = $('<div/>').html(html);
                            $('style', element).remove();
                            var htmlText = element.html();
                            this.AddAlert(htmlText, 'error');
                        }
                    }
                    else {
                        var html2 = error.error().responseText;
                        var element2 = $('<div/>').html(html2);
                        $('style', element2).remove();
                        var htmlText2 = element2.html();
                        this.AddAlert(htmlText2, 'error');
                    }
                }
                this.IsLoading(false);
            });
            promise.done((data) => {
                if (data.ReviewEvent) {
                    ko.mapping.fromJS(data.ItemDetail, {}, this.ItemDetail);
                    //ko.mapping.fromJS(data.StoreViewModel, {}, this.storeVm);
                    ko.mapping.fromJS(data.StoreViewModel.Filters, {}, this.storeVm.Filters);
                    this.FormVisible(false);
                    this.ReviewEvent(true);
                    //var id = this.params['id'];
                    window.location.hash = '#/view/' + ko.unwrap(data.ItemDetail.Id);
                }
                else {
                    this.ReviewEvent(false);
                    this.FormVisible(true);
                }
                this.IsLoading(false);
            });
            return false;
        });
        $('.modalform-holder').on('click', '#save-fundraiser', () => {
            //prevent double post
            if (this.IsLoading()) {
                return;
            }
            this.ItemDetail.AgreeToTerms(true);
            this.ItemDetail.CustomerConfirmed(true);
            //make overlay loading div full height
            $('#loading').height($(window).height());
            this.IsLoading(true);
            var ignoreMapping = {
                'ignore': this.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(this, ignoreMapping);
            delete postData.Alerts;
            var promise = $.ajax({
                url: 'pandafundraiser/edit',
                data: JSON.stringify(postData),
                type: 'POST',
                cache: false,
                contentType: 'application/json;charset=utf-8',
            });
            promise.fail((error) => {
                if (error.status === 400) {
                    if (this.ReviewEvent()) { //if they were on the review event tab and clicked submit and the validation failed go back to the edit tab
                        this.ReviewEvent(false);
                        this.FormVisible(true);
                        this.EventSubmitted(false);
                    }
                    _.each(error.responseJSON.ModelState.PropertyErrors, (propertyError) => {
                        this.form.addPropertyError(propertyError);
                    });
                    _.each(error.responseJSON.ModelState.ModelErrors, (v) => {
                        // addAlert(v.ErrorMessage, 'error');
                    });
                    if (error.responseJSON.Message) {
                        this.Message = error.responseJSON.Message;
                    }
                    this.form.refreshTabValidationBadges();
                }
                else {
                    if (error.responseJSON) {
                        if (error.responseJSON.Message) {
                            this.AddAlert(error.responseJSON.Message, 'error');
                        }
                        else {
                            var html = error.error().responseText;
                            var element = $('<div/>').html(html);
                            $('style', element).remove();
                            var htmlText = element.html();
                            this.AddAlert(htmlText, 'error');
                        }
                    }
                    else {
                        var html2 = error.error().responseText;
                        var element2 = $('<div/>').html(html2);
                        $('style', element2).remove();
                        var htmlText2 = element2.html();
                        this.AddAlert(htmlText2, 'error');
                    }
                }
                this.IsLoading(false);
            });
            promise.done((data) => {
                var copyMapping = {
                    'copy': this.data.KOMapping.copy
                };
                ko.mapping.fromJS(data.ItemDetail, copyMapping, this.ItemDetail);
                if (!this.data.LeaveOpenOnAjaxSuccess) {
                    this.ReviewEvent(false);
                    this.FormVisible(false);
                    this.EventSubmitted(true);
                }
                this.IsLoading(false);
            });
            return false;
        });
        $('.modalform-holder').on('change', '#Logo', function () {
            for (var i = 0; i < this.files.length; i++) {
                var file = this.files[i];
                var fd = new FormData();
                fd.append("fileToUpload", file);
                $.ajax({
                    url: 'pandafundraiser/uploadfile',
                    data: fd,
                    type: 'POST',
                    cache: false,
                    processData: false,
                    contentType: false,
                    success: function (data) {
                        self.ItemDetail.Logo(data);
                    }
                });
            }
        });
        $('.modalform-holder').on('click', '.image-button-tile', () => {
            this.ItemDetail.Logo('');
            $('#Logo').val('');
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
        this.PaymentToModalShown = false;
        $('#ItemDetail_PaymentPayableTo').blur(() => {
            if (!this.PaymentToModalShown) {
                alert('Help us get your check to you on time! Please take a moment to ensure your organization’s name is not abbreviated and matches your Tax ID.');
                // only show once
                this.PaymentToModalShown = true;
            }
        });
        $(document).ready(function () {
            $('#ItemDetail_EventDate').val('mm/dd/yyyy');
        });
    }
}
module.exports = PandaFundraiser;

},{"../Base/Table":11,"../Base/VMBase":12,"../Common/Modal":14,"../Store/Store":78,"./PandaFundraiserForm":69,"./PandaFundraiserRouter":70,"jquery":109,"knockout":111,"underscore":113}],69:[function(require,module,exports){
"use strict";
const Form = require("../Base/Form");
class PandaFundraiserForm extends Form {
    constructor(data, vm, editAction = 'Edit') {
        super(data, vm, editAction);
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
    }
    promiseDone(data, id) {
        this.vm.ItemDetailIsNew(false);
        this.komappingfromdata(data, id);
        this.vm.IsLoading(false);
        this.vm.FormVisible(true);
        this.vm.ReviewEvent(data.ReviewEvent);
        if (this.vm.ReviewEvent())
            this.vm.FormVisible(false);
        if (data.ReturnUrl !== null)
            window.location.href = data.ReturnUrl;
        //else
        //  this.vm.routes.view(id);
    }
    getDetail(id) {
        this.resetDetail();
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        $('body').addClass('form-shown');
        var promise = $.ajax({
            url: this.getUrl,
            data: { id: id },
            type: 'GET',
            cache: false,
            contentType: 'application/json;charset=utf-8'
        });
        promise.fail((error) => {
            var html = error.error().responseText;
            var element = $('<div/>').html(html);
            $('style', element).remove();
            var htmlText = element.html();
            this.vm.AddAlert(htmlText, 'alert-error');
            this.vm.IsLoading(false);
        });
        promise.done((data) => this.promiseDone(data, id));
        return promise;
    }
    komappingfromdata(data, id) {
        var copyMapping = {
            'copy': this.data.KOMapping.allNonPostBack
        };
        data.ItemDetail.EventDate = moment(data.ItemDetail.EventDate).format('YYYY-MM-DD');
        ko.mapping.fromJS(data.ItemDetail, copyMapping, this.vm.ItemDetail);
        if (data.StoreViewModel != null) {
            ko.mapping.fromJS(data.StoreViewModel.Filters, copyMapping, this.vm.storeVm.Filters);
            ko.mapping.fromJS(data.StoreViewModel.ItemDetail, copyMapping, this.vm.storeVm.ItemDetail);
        }
    }
    //resets item detail so that it looks like a new insert
    resetDetail() {
        super.resetDetail();
        this.vm.ItemDetail.EventDate(null); //clear the datepicker time
        ko.mapping.fromJS(this.vm.NewItemDetail, {}, this.vm.ItemDetail);
        this.vm.storeVm.Filters.SearchTerm(null);
    }
    post() {
        this.vm.routes.lastRoute = undefined;
        var promise = super.post();
        promise.done(data => {
            window.scrollTo(0, 0);
            if (data.ReturnUrl !== null)
                window.location.href = data.ReturnUrl;
        });
        return promise;
    }
}
module.exports = PandaFundraiserForm;

},{"../Base/Form":7}],70:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class PandaFundraiserRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: '/PandaFundraiser#/list',
                func() {
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    self.vm.form.cancel();
                    self.vm.table.load();
                    self.vm.ReviewEvent(false);
                    self.vm.FormVisible(false);
                    self.vm.EventSubmitted(false);
                    self.vm.ViewResources(false);
                },
                convertToRegEx: true
            },
            {
                name: '/PandaFundraiser#/new',
                func() {
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    self.vm.form.resetDetail();
                    self.vm.ItemDetailIsNew(true);
                    self.vm.ReviewEvent(false);
                    self.vm.FormVisible(true);
                    self.vm.ViewResources(false);
                    $('#ItemDetail_EventDate').val('mm/dd/yyyy');
                },
                convertToRegEx: true
            },
            {
                name: '/PandaFundraiser#/save',
                func() {
                    self.vm.SaveForLater(true);
                    self.vm.ItemDetail.SaveForLater(true);
                    self.vm.ReturnUrl = '/pandafundraiser#/list';
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    return self.vm.form.post();
                },
                convertToRegEx: true
            },
            {
                name: /\/PandaFundraiser#\/view\/(.*)/i,
                func() {
                    var id = this.params['splat'][0];
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    var promise = self.vm.form.getDetail(id);
                    promise.done(() => {
                        self.vm.ReviewEvent(true);
                        self.vm.FormVisible(false);
                        self.vm.EventSubmitted(false);
                        self.vm.ViewResources(false);
                    });
                },
                convertToRegEx: false
            },
            {
                name: /\/PandaFundraiser#\/resources\/(.*)/i,
                func() {
                    var id = this.params['splat'][0];
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    var promise = self.vm.form.getDetail(id);
                    promise.done(() => {
                        self.vm.ReviewEvent(false);
                        self.vm.FormVisible(false);
                        self.vm.EventSubmitted(false);
                        self.vm.ViewResources(true);
                    });
                },
                convertToRegEx: false
            },
            {
                name: /\/PandaFundraiser#\/edit\/(.*)/i,
                func() {
                    var id = this.params['splat'][0];
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = PandaFundraiserRouter;

},{"../Base/Router":10}],71:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: PublicContentPage
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
class PublicContentPage extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, null, null, null);
        this.data = data;
        var $element = $('.content-container');
        $element.summernote({
            height: 600, airMode: true
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = PublicContentPage;

},{"../Base/VMBase":12,"jquery":109,"knockout":111}],72:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class QuestionAnswer extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = QuestionAnswer;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],73:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const RedirectUrlRouter = require("./RedirectUrlRouter");
const Form = require("../Base/Form");
class RedirectUrl extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, RedirectUrlRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = RedirectUrl;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./RedirectUrlRouter":74,"jquery":109,"knockout":111}],74:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class RedirectUrlRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = RedirectUrlRouter;

},{"../Base/Router":10}],75:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
class SiteMap {
    constructor(data) {
        //call base class constructor
        // super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = SiteMap;

},{"jquery":109,"knockout":111}],76:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: StoreException
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const StoreExceptionRouter = require("./StoreExceptionRouter");
const Form = require("../Base/Form");
class StoreException extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, StoreExceptionRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = StoreException;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./StoreExceptionRouter":77,"jquery":109,"knockout":111}],77:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class StoreExceptionRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = StoreExceptionRouter;

},{"../Base/Router":10}],78:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
//import Table = require('../Base/Table');
const Router = require("../Base/Router");
const Form = require("../Base/Form");
const StoreTable = require("./StoreTable");
class Store extends base.VmBase {
    constructor(data, applyBindings = true, fundraiserStores = false) {
        //call base class constructor
        super(data, Form, StoreTable, Router);
        this.data = data;
        this.toggleFundraiser = (data, e) => {
            var postData = data.Id;
            $.ajax({
                url: '/Admin/Store/ToggleFundraiser?store=' + data.Id,
                type: 'GET',
                contentType: 'application/json;charset=utf-8',
                async: false,
                data: postData
            }).done((responsedata) => {
                this.table.load();
            });
        };
        if (applyBindings) {
            ko.applyBindings(this);
            $('.hideUnbound').removeClass('hideUnbound');
        }
        if (fundraiserStores) {
            this.GetUrl = '/api/Store/Get';
        }
        else {
            this.GetUrl = '/api/Store/GetAllFundraiserInclude';
        }
    }
}
module.exports = Store;

},{"../Base/Form":7,"../Base/Router":10,"../Base/VMBase":12,"./StoreTable":79,"jquery":109,"knockout":111}],79:[function(require,module,exports){
"use strict";
const Table = require("../Base/Table");
const $ = require("jquery");
const ko = require("knockout");
const komapping = require("knockout.mapping");
ko.mapping = komapping;
class StoreTable extends Table {
    constructor(data, vm) {
        super(data, vm);
        this.data = data;
        this.vm = vm;
    }
    //sends ajax call for data 
    load() {
        //this.vm.form.isDeleting = false;
        this.orderby = 'Name';
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        //format the request
        var requestData = {
            $inlinecount: "allpages",
            $orderby: this.orderby,
            $top: this.top(),
            $skip: this.skip()
        };
        //add in filters
        $.extend(requestData, ko.toJS(this.vm.Filters));
        //make the request
        var response = $.ajax({
            url: this.vm.GetUrl,
            dataType: "json",
            cache: false,
            data: requestData
        });
        //handle successful response
        response.done(responsedata => {
            this.loadResponse(responsedata);
            this.vm.HasHawaiiLocations(responsedata.HasHawaiiLocations);
            this.vm.IsLoading(false);
        });
        return response;
    }
}
module.exports = StoreTable;

},{"../Base/Table":11,"jquery":109,"knockout":111,"knockout.mapping":110}],80:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class StyleGuide extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
        //this.table.defaultSort = ""
    }
}
module.exports = StyleGuide;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],81:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const PageBase = require("../ContentPage/ContentPageBase");
const SystemContentPageForm = require("./SystemContentPageForm");
const Table = require("../Base/Table");
const ContentPageRouter = require("../ContentPage/ContentPageRouter");
class SystemContentPage extends PageBase {
    constructor(data) {
        super(data, SystemContentPageForm, Table, ContentPageRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = SystemContentPage;

},{"../Base/Table":11,"../ContentPage/ContentPageBase":24,"../ContentPage/ContentPageRouter":26,"./SystemContentPageForm":82,"jquery":109,"knockout":111}],82:[function(require,module,exports){
"use strict";
const PageForm = require("../ContentPage/ContentPageForm");
class SystemContentPageForm extends PageForm {
    constructor(data, vm) {
        super(data, vm);
        this.data = data;
        this.vm = vm;
        this.addItemDetailClientOnlyProperties();
    }
    //add-contentblock
    setupBindigs() {
        super.setupBindigs();
        var self = this;
        var modelHolderSelector = $('.modalform-holder');
        //Adding
        modelHolderSelector.on('click', '.add-contentblock', function () {
            var data = ko.dataFor(this); //local this
            var row = self.vm.NewContentBlock;
            var rowCopy = ko.mapping.fromJS(ko.toJS(row));
            // self.addSortedCells(rowCopy);
            data.ContentBlocks.push(rowCopy);
        });
    }
}
module.exports = SystemContentPageForm;

},{"../ContentPage/ContentPageForm":25}],83:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class UserLocation extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
        //this.table.defaultSort = ""
    }
}
module.exports = UserLocation;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],84:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const UserRouter = require("./UserRouter");
const Form = require("../Base/Form");
class User extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, UserRouter);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = User;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./UserRouter":85,"jquery":109,"knockout":111}],85:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class UserRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = UserRouter;

},{"../Base/Router":10}],86:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: Vendor
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class Vendor extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Vendor;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],87:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class VisitorScheduledMeeting extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        $('.modalform-holder').on('click', '#save-visitor', () => {
            var promise = this.form.post();
            promise.done((data) => {
                window.location.href = "/lunar-new-year/schedule-a-visit/ThankYou";
            });
            return false;
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = VisitorScheduledMeeting;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],88:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
const YelpReviewTable = require("./YelpReviewTable");
const _ = require("underscore");
class YelpReview extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, YelpReviewTable, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
    clearFilters() {
        _.each(this.Filters, (v) => {
            v('');
        });
    }
}
module.exports = YelpReview;

},{"../Base/Form":7,"../Base/Router":10,"../Base/VMBase":12,"./YelpReviewTable":89,"jquery":109,"knockout":111,"underscore":113}],89:[function(require,module,exports){
"use strict";
const Table = require("../Base/Table");
const ko = require("knockout");
const komapping = require("knockout.mapping");
ko.mapping = komapping;
class YelpReviewTable extends Table {
    constructor(data, vm) {
        super(data, vm);
        this.data = data;
        this.vm = vm;
    }
}
module.exports = YelpReviewTable;

},{"../Base/Table":11,"knockout":111,"knockout.mapping":110}],90:[function(require,module,exports){
(function (global){

; jQuery = global.jQuery = require("jquery");
; var __browserify_shim_require__=require;(function browserifyShim(module, define, require) {
﻿/**
* Loading plugin for jQuery
* version: v1.0.6
* 
* Small helper to give the user a visual feedback that something is happening 
* when fetching/posting data
* 
* USAGE:
* - global overlay:                     $.isLoading();
* - use javascript:                     $( selector ).isLoading();
* - On non-form elements:               $("div").isLoading({ text: "Loading", position:'inside'});
* - remove the loading element:         $( selector ).isLoading( "hide" );
*
* @author Laurent Blanes <laurent.blanes@gmail.com>
* ---
* Copyright 2013, Laurent Blanes ( https://github.com/hekigan/is-loading )
* 
* The MIT License (MIT)
* 
* Copyright (c) 2013 Laurent Blanes
* 
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* 
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
; (function ($, window, document, undefined) {

    // Create the defaults once
    var pluginName = "isLoading",
        defaults = {
            'position': "right",        // right | inside | overlay
            'text': "",                 // Text to display next to the loader
            'class': "icon-refresh",    // loader CSS class
            'tpl': '<span class="isloading-wrapper %wrapper%">%text%<i class="%class% icon-spin"></i></span>',    // loader base Tag
            'disableSource': true,      // true | false
            'disableOthers': []
        };

    // The actual plugin constructor
    function Plugin(element, options) {
        this.element = element;

        // Merge user options with default ones
        this.options = $.extend({}, defaults, options);

        this._defaults = defaults;
        this._name = pluginName;
        this._loader = null;                // Contain the loading tag element

        this.init();
    }

    // Contructor function for the plugin (only once on page load)
    function contruct() {

        if (!$[pluginName]) {
            $.isLoading = function (opts) {
                $("body").isLoading(opts);
            };
        }
    }

    Plugin.prototype = {

        init: function () {

            if ($(this.element).is("body")) {
                this.options.position = "overlay";
            }
            this.show();
        },

        show: function () {

            var self = this,
                tpl = self.options.tpl.replace('%wrapper%', ' isloading-show ' + ' isloading-' + self.options.position);
            tpl = tpl.replace('%class%', self.options['class']);
            tpl = tpl.replace('%text%', (self.options.text !== "") ? self.options.text + ' ' : '');
            self._loader = $(tpl);

            // Disable the element
            if ($(self.element).is("input, textarea") && true === self.options.disableSource) {

                $(self.element).attr("disabled", "disabled");

            }
            else if (true === self.options.disableSource) {

                $(self.element).addClass("disabled");

            }

            // Set position
            switch (self.options.position) {

                case "inside":
                    $(self.element).html(self._loader);
                    break;

                case "overlay":
                    var $wrapperTpl = null;

                    if ($(self.element).is("body")) {
                        $wrapperTpl = $('<div class="isloading-overlay" style="position:fixed; left:0; top:0; z-index: 10000; background: rgba(0,0,0,0.5); width: 100%; height: ' + $(window).height() + 'px;" />');
                        $("body").prepend($wrapperTpl);

                        $(window).on('resize', function () {
                            $wrapperTpl.height($(window).height() + 'px');
                            self._loader.css({ top: ($(window).height() / 2 - self._loader.outerHeight() / 2) + 'px' });
                        });
                    } else {
                        var cssPosition = $(self.element).css('position'),
                            pos = {},
                            height = $(self.element).outerHeight() + 'px',
                            width = '100%'; // $( self.element ).outerWidth() + 'px;

                        if ('relative' === cssPosition || 'absolute' === cssPosition) {
                            pos = { 'top': 0, 'left': 0 };
                        } else {
                            pos = $(self.element).position();
                        }
                        $wrapperTpl = $('<div class="isloading-overlay" style="position:absolute; top: ' + pos.top + 'px; left: ' + pos.left + 'px; z-index: 10000; background: rgba(0,0,0,0.5); width: ' + width + '; height: ' + height + ';" />');
                        $(self.element).prepend($wrapperTpl);

                        $(window).on('resize', function () {
                            $wrapperTpl.height($(self.element).outerHeight() + 'px');
                            self._loader.css({ top: ($wrapperTpl.outerHeight() / 2 - self._loader.outerHeight() / 2) + 'px' });
                        });
                    }

                    $wrapperTpl.html(self._loader);
                    self._loader.css({ top: ($wrapperTpl.outerHeight() / 2 - self._loader.outerHeight() / 2) + 'px' });
                    break;

                default:
                    $(self.element).after(self._loader);
                    break;
            }

            self.disableOthers();
        },

        hide: function () {

            if ("overlay" === this.options.position) {

                $(this.element).find(".isloading-overlay").first().remove();

            } else {

                $(this._loader).remove();
                $(this.element).text($(this.element).attr("data-isloading-label"));

            }

            $(this.element).removeAttr("disabled").removeClass("disabled");

            this.enableOthers();
        },

        disableOthers: function () {
            $.each(this.options.disableOthers, function (i, e) {
                var elt = $(e);
                if (elt.is("button, input, textarea")) {
                    elt.attr("disabled", "disabled");
                }
                else {
                    elt.addClass("disabled");
                }
            });
        },

        enableOthers: function () {
            $.each(this.options.disableOthers, function (i, e) {
                var elt = $(e);
                if (elt.is("button, input, textarea")) {
                    elt.removeAttr("disabled");
                }
                else {
                    elt.removeClass("disabled");
                }
            });
        }
    };

    // Constructor
    $.fn[pluginName] = function (options) {
        return this.each(function () {
            if (options && "hide" !== options || !$.data(this, "plugin_" + pluginName)) {
                $.data(this, "plugin_" + pluginName, new Plugin(this, options));
            } else {
                var elt = $.data(this, "plugin_" + pluginName);

                if ("hide" === options) { elt.hide(); }
                else { elt.show(); }
            }
        });
    };

    contruct();

})(jQuery, window, document);
}).call(global, module, undefined, undefined);

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL2pxdWVyeS5pc2xvYWRpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuOyBqUXVlcnkgPSBnbG9iYWwualF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbjsgdmFyIF9fYnJvd3NlcmlmeV9zaGltX3JlcXVpcmVfXz1yZXF1aXJlOyhmdW5jdGlvbiBicm93c2VyaWZ5U2hpbShtb2R1bGUsIGRlZmluZSwgcmVxdWlyZSkge1xu77u/LyoqXHJcbiogTG9hZGluZyBwbHVnaW4gZm9yIGpRdWVyeVxyXG4qIHZlcnNpb246IHYxLjAuNlxyXG4qIFxyXG4qIFNtYWxsIGhlbHBlciB0byBnaXZlIHRoZSB1c2VyIGEgdmlzdWFsIGZlZWRiYWNrIHRoYXQgc29tZXRoaW5nIGlzIGhhcHBlbmluZyBcclxuKiB3aGVuIGZldGNoaW5nL3Bvc3RpbmcgZGF0YVxyXG4qIFxyXG4qIFVTQUdFOlxyXG4qIC0gZ2xvYmFsIG92ZXJsYXk6ICAgICAgICAgICAgICAgICAgICAgJC5pc0xvYWRpbmcoKTtcclxuKiAtIHVzZSBqYXZhc2NyaXB0OiAgICAgICAgICAgICAgICAgICAgICQoIHNlbGVjdG9yICkuaXNMb2FkaW5nKCk7XHJcbiogLSBPbiBub24tZm9ybSBlbGVtZW50czogICAgICAgICAgICAgICAkKFwiZGl2XCIpLmlzTG9hZGluZyh7IHRleHQ6IFwiTG9hZGluZ1wiLCBwb3NpdGlvbjonaW5zaWRlJ30pO1xyXG4qIC0gcmVtb3ZlIHRoZSBsb2FkaW5nIGVsZW1lbnQ6ICAgICAgICAgJCggc2VsZWN0b3IgKS5pc0xvYWRpbmcoIFwiaGlkZVwiICk7XHJcbipcclxuKiBAYXV0aG9yIExhdXJlbnQgQmxhbmVzIDxsYXVyZW50LmJsYW5lc0BnbWFpbC5jb20+XHJcbiogLS0tXHJcbiogQ29weXJpZ2h0IDIwMTMsIExhdXJlbnQgQmxhbmVzICggaHR0cHM6Ly9naXRodWIuY29tL2hla2lnYW4vaXMtbG9hZGluZyApXHJcbiogXHJcbiogVGhlIE1JVCBMaWNlbnNlIChNSVQpXHJcbiogXHJcbiogQ29weXJpZ2h0IChjKSAyMDEzIExhdXJlbnQgQmxhbmVzXHJcbiogXHJcbiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4qIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXHJcbiogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4qIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4qIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiogXHJcbiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cclxuKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuKiBcclxuKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4qIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxyXG4qIFRIRSBTT0ZUV0FSRS5cclxuKi9cclxuOyAoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xyXG5cclxuICAgIC8vIENyZWF0ZSB0aGUgZGVmYXVsdHMgb25jZVxyXG4gICAgdmFyIHBsdWdpbk5hbWUgPSBcImlzTG9hZGluZ1wiLFxyXG4gICAgICAgIGRlZmF1bHRzID0ge1xyXG4gICAgICAgICAgICAncG9zaXRpb24nOiBcInJpZ2h0XCIsICAgICAgICAvLyByaWdodCB8IGluc2lkZSB8IG92ZXJsYXlcclxuICAgICAgICAgICAgJ3RleHQnOiBcIlwiLCAgICAgICAgICAgICAgICAgLy8gVGV4dCB0byBkaXNwbGF5IG5leHQgdG8gdGhlIGxvYWRlclxyXG4gICAgICAgICAgICAnY2xhc3MnOiBcImljb24tcmVmcmVzaFwiLCAgICAvLyBsb2FkZXIgQ1NTIGNsYXNzXHJcbiAgICAgICAgICAgICd0cGwnOiAnPHNwYW4gY2xhc3M9XCJpc2xvYWRpbmctd3JhcHBlciAld3JhcHBlciVcIj4ldGV4dCU8aSBjbGFzcz1cIiVjbGFzcyUgaWNvbi1zcGluXCI+PC9pPjwvc3Bhbj4nLCAgICAvLyBsb2FkZXIgYmFzZSBUYWdcclxuICAgICAgICAgICAgJ2Rpc2FibGVTb3VyY2UnOiB0cnVlLCAgICAgIC8vIHRydWUgfCBmYWxzZVxyXG4gICAgICAgICAgICAnZGlzYWJsZU90aGVycyc6IFtdXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAvLyBUaGUgYWN0dWFsIHBsdWdpbiBjb25zdHJ1Y3RvclxyXG4gICAgZnVuY3Rpb24gUGx1Z2luKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xyXG5cclxuICAgICAgICAvLyBNZXJnZSB1c2VyIG9wdGlvbnMgd2l0aCBkZWZhdWx0IG9uZXNcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLl9kZWZhdWx0cyA9IGRlZmF1bHRzO1xyXG4gICAgICAgIHRoaXMuX25hbWUgPSBwbHVnaW5OYW1lO1xyXG4gICAgICAgIHRoaXMuX2xvYWRlciA9IG51bGw7ICAgICAgICAgICAgICAgIC8vIENvbnRhaW4gdGhlIGxvYWRpbmcgdGFnIGVsZW1lbnRcclxuXHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udHJ1Y3RvciBmdW5jdGlvbiBmb3IgdGhlIHBsdWdpbiAob25seSBvbmNlIG9uIHBhZ2UgbG9hZClcclxuICAgIGZ1bmN0aW9uIGNvbnRydWN0KCkge1xyXG5cclxuICAgICAgICBpZiAoISRbcGx1Z2luTmFtZV0pIHtcclxuICAgICAgICAgICAgJC5pc0xvYWRpbmcgPSBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgICAgICAgICAgICAgJChcImJvZHlcIikuaXNMb2FkaW5nKG9wdHMpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBQbHVnaW4ucHJvdG90eXBlID0ge1xyXG5cclxuICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoJCh0aGlzLmVsZW1lbnQpLmlzKFwiYm9keVwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uID0gXCJvdmVybGF5XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2hvdzogZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxyXG4gICAgICAgICAgICAgICAgdHBsID0gc2VsZi5vcHRpb25zLnRwbC5yZXBsYWNlKCcld3JhcHBlciUnLCAnIGlzbG9hZGluZy1zaG93ICcgKyAnIGlzbG9hZGluZy0nICsgc2VsZi5vcHRpb25zLnBvc2l0aW9uKTtcclxuICAgICAgICAgICAgdHBsID0gdHBsLnJlcGxhY2UoJyVjbGFzcyUnLCBzZWxmLm9wdGlvbnNbJ2NsYXNzJ10pO1xyXG4gICAgICAgICAgICB0cGwgPSB0cGwucmVwbGFjZSgnJXRleHQlJywgKHNlbGYub3B0aW9ucy50ZXh0ICE9PSBcIlwiKSA/IHNlbGYub3B0aW9ucy50ZXh0ICsgJyAnIDogJycpO1xyXG4gICAgICAgICAgICBzZWxmLl9sb2FkZXIgPSAkKHRwbCk7XHJcblxyXG4gICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBlbGVtZW50XHJcbiAgICAgICAgICAgIGlmICgkKHNlbGYuZWxlbWVudCkuaXMoXCJpbnB1dCwgdGV4dGFyZWFcIikgJiYgdHJ1ZSA9PT0gc2VsZi5vcHRpb25zLmRpc2FibGVTb3VyY2UpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAkKHNlbGYuZWxlbWVudCkuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRydWUgPT09IHNlbGYub3B0aW9ucy5kaXNhYmxlU291cmNlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgJChzZWxmLmVsZW1lbnQpLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgcG9zaXRpb25cclxuICAgICAgICAgICAgc3dpdGNoIChzZWxmLm9wdGlvbnMucG9zaXRpb24pIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiaW5zaWRlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmVsZW1lbnQpLmh0bWwoc2VsZi5fbG9hZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIFwib3ZlcmxheVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciAkd3JhcHBlclRwbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgkKHNlbGYuZWxlbWVudCkuaXMoXCJib2R5XCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR3cmFwcGVyVHBsID0gJCgnPGRpdiBjbGFzcz1cImlzbG9hZGluZy1vdmVybGF5XCIgc3R5bGU9XCJwb3NpdGlvbjpmaXhlZDsgbGVmdDowOyB0b3A6MDsgei1pbmRleDogMTAwMDA7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTsgd2lkdGg6IDEwMCU7IGhlaWdodDogJyArICQod2luZG93KS5oZWlnaHQoKSArICdweDtcIiAvPicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiYm9keVwiKS5wcmVwZW5kKCR3cmFwcGVyVHBsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdyYXBwZXJUcGwuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSArICdweCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9hZGVyLmNzcyh7IHRvcDogKCQod2luZG93KS5oZWlnaHQoKSAvIDIgLSBzZWxmLl9sb2FkZXIub3V0ZXJIZWlnaHQoKSAvIDIpICsgJ3B4JyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNzc1Bvc2l0aW9uID0gJChzZWxmLmVsZW1lbnQpLmNzcygncG9zaXRpb24nKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gJChzZWxmLmVsZW1lbnQpLm91dGVySGVpZ2h0KCkgKyAncHgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAnMTAwJSc7IC8vICQoIHNlbGYuZWxlbWVudCApLm91dGVyV2lkdGgoKSArICdweDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgncmVsYXRpdmUnID09PSBjc3NQb3NpdGlvbiB8fCAnYWJzb2x1dGUnID09PSBjc3NQb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0geyAndG9wJzogMCwgJ2xlZnQnOiAwIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSAkKHNlbGYuZWxlbWVudCkucG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkd3JhcHBlclRwbCA9ICQoJzxkaXYgY2xhc3M9XCJpc2xvYWRpbmctb3ZlcmxheVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7IHRvcDogJyArIHBvcy50b3AgKyAncHg7IGxlZnQ6ICcgKyBwb3MubGVmdCArICdweDsgei1pbmRleDogMTAwMDA7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTsgd2lkdGg6ICcgKyB3aWR0aCArICc7IGhlaWdodDogJyArIGhlaWdodCArICc7XCIgLz4nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmVsZW1lbnQpLnByZXBlbmQoJHdyYXBwZXJUcGwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd3JhcHBlclRwbC5oZWlnaHQoJChzZWxmLmVsZW1lbnQpLm91dGVySGVpZ2h0KCkgKyAncHgnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRlci5jc3MoeyB0b3A6ICgkd3JhcHBlclRwbC5vdXRlckhlaWdodCgpIC8gMiAtIHNlbGYuX2xvYWRlci5vdXRlckhlaWdodCgpIC8gMikgKyAncHgnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICR3cmFwcGVyVHBsLmh0bWwoc2VsZi5fbG9hZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2FkZXIuY3NzKHsgdG9wOiAoJHdyYXBwZXJUcGwub3V0ZXJIZWlnaHQoKSAvIDIgLSBzZWxmLl9sb2FkZXIub3V0ZXJIZWlnaHQoKSAvIDIpICsgJ3B4JyB9KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICQoc2VsZi5lbGVtZW50KS5hZnRlcihzZWxmLl9sb2FkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWxmLmRpc2FibGVPdGhlcnMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBoaWRlOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoXCJvdmVybGF5XCIgPT09IHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xyXG5cclxuICAgICAgICAgICAgICAgICQodGhpcy5lbGVtZW50KS5maW5kKFwiLmlzbG9hZGluZy1vdmVybGF5XCIpLmZpcnN0KCkucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgICQodGhpcy5fbG9hZGVyKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICQodGhpcy5lbGVtZW50KS50ZXh0KCQodGhpcy5lbGVtZW50KS5hdHRyKFwiZGF0YS1pc2xvYWRpbmctbGFiZWxcIikpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgJCh0aGlzLmVsZW1lbnQpLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKS5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbmFibGVPdGhlcnMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBkaXNhYmxlT3RoZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZGlzYWJsZU90aGVycywgZnVuY3Rpb24gKGksIGUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlbHQgPSAkKGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsdC5pcyhcImJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWx0LmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWx0LmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGVuYWJsZU90aGVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkLmVhY2godGhpcy5vcHRpb25zLmRpc2FibGVPdGhlcnMsIGZ1bmN0aW9uIChpLCBlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZWx0ID0gJChlKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbHQuaXMoXCJidXR0b24sIGlucHV0LCB0ZXh0YXJlYVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsdC5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlbHQucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBDb25zdHJ1Y3RvclxyXG4gICAgJC5mbltwbHVnaW5OYW1lXSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIFwiaGlkZVwiICE9PSBvcHRpb25zIHx8ICEkLmRhdGEodGhpcywgXCJwbHVnaW5fXCIgKyBwbHVnaW5OYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgJC5kYXRhKHRoaXMsIFwicGx1Z2luX1wiICsgcGx1Z2luTmFtZSwgbmV3IFBsdWdpbih0aGlzLCBvcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZWx0ID0gJC5kYXRhKHRoaXMsIFwicGx1Z2luX1wiICsgcGx1Z2luTmFtZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKFwiaGlkZVwiID09PSBvcHRpb25zKSB7IGVsdC5oaWRlKCk7IH1cclxuICAgICAgICAgICAgICAgIGVsc2UgeyBlbHQuc2hvdygpOyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgY29udHJ1Y3QoKTtcclxuXHJcbn0pKGpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG59KS5jYWxsKGdsb2JhbCwgbW9kdWxlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4iXX0=
},{"jquery":109}],91:[function(require,module,exports){
(function (global){

; bootstrap = global.bootstrap = require("bootstrap");
moment = global.moment = require("moment");
jQuery = global.jQuery = require("jquery");
ko = global.ko = require("knockout");
; var __browserify_shim_require__=require;(function browserifyShim(module, define, require) {
(function ($, ko, moment, undefined) {

    //#region Utils

    var detectDataType = function (value) {
        for (var fname in detectDataType.typeDetection) {
            var f = detectDataType[fname];
            if (f(value)) {
                return detectDataType.typeDetection[fname];
            }
        }
        return null;
    };

    detectDataType.isString = function (value) {
        return typeof value === 'string';
    };
    detectDataType.isDate = function (value) {
        return typeof value === 'object' && Object.prototype.toString.call(value) === "[object Date]";
    };
    detectDataType.isMoment = function (value) {
        return moment.isMoment(value);
    };
    detectDataType.typeDetection = {
        "isMoment": "moment",
        "isString": "string",
        "isDate": "date"
    };

    var elBinder = function($el) {
        return {
            set: function(value) {
                if (value === undefined) {
                    value = null;
                }
                var funcs = elBinder.functions[$el.data(elBinder.DATATYPE_KEY)] || elBinder.functions['_default'];
                var func = funcs['set'] || elBinder.functions['_default']['set'];
                return func($el, value);
            },
            get: function() {
                var funcs = elBinder.functions[$el.data(elBinder.DATATYPE_KEY)] || elBinder.functions['_default'];
                var func = funcs['get'] || elBinder.functions['_default']['get'];
                return func($el);
            },
            register: function(dataType) {
                $el.data(elBinder.DATATYPE_KEY, dataType);
            }
        }
    };
    
    elBinder.DATATYPE_KEY = "datepicker.ko.dataType";

    elBinder.functions = {
        '_default': {
            get: function ($el) {
                return $el.datepicker('get');
            },
            set: function ($el, value) {
                $el.datepicker('set', value);
            }
        },
        'iso': {
            get: function ($el) {
                var value = $el.datepicker('get');
                return (value && value.format('YYYY-MM-DD'));
            },
            set: function ($el, value) {
                var mnt = moment(value);
                $el.datepicker('set', mnt);
            }
        },
        'format': {
            get: function ($el) {
                return $el.datepicker('getAsText');
            }
        },
        'date': {
            get: function ($el) {
                var value = $el.datepicker('get');
                return (value && value.toDate());
            }
        }
    };

    //#endregion

    ko.bindingHandlers.datepicker = {
        init: function (element, valueAccessor, allBindingsAccessor) {
            var options = allBindingsAccessor().datepickerOptions || {};
            var dataType = options.dataType || detectDataType(ko.utils.unwrapObservable(valueAccessor()));
            dataType = !dataType || dataType == 'string' ? 'iso' : dataType;
            var $el = $(element).datepicker(options);

            elBinder($el).register(dataType);

            ko.utils.registerEventHandler(element, "changeDate", function (event) {
                var accessor = valueAccessor();
                if (ko.isObservable(accessor)) {
                    var value = elBinder($el).get();
                    accessor(value);
                }
            });
        },
        update: function (element, valueAccessor) {
            elBinder($(element))
                .set(ko.utils.unwrapObservable(valueAccessor()));
        }
    };


    ko.bindingHandlers.datetimepicker = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
            //initialize datepicker with some optional options
            var options = {
                format: 'DD/MM/YYYY hh:mm A',
                defaultDate: valueAccessor()()
            };

            if (allBindingsAccessor() !== undefined) {
                if (allBindingsAccessor().datepickerOptions !== undefined) {
                    options.format = allBindingsAccessor().datepickerOptions.format !== undefined ? allBindingsAccessor().datepickerOptions.format : options.format;
                }
            }

            $(element).datetimepicker(options);

            //when a user changes the date, update the view model
            ko.utils.registerEventHandler(element, "dp.change", function (event) {
                var value = valueAccessor();
                if (ko.isObservable(value)) {
                    value(event.date);
                }
            });
        },
        update: function (element, valueAccessor) {
            elBinder($(element))
                .set(ko.utils.unwrapObservable(valueAccessor()));
        }
    };
})(jQuery, this.ko, this.moment);
}).call(global, module, undefined, undefined);

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL21vbWVudC1kYXRlcGlja2VyLWtvLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiXG47IGJvb3RzdHJhcCA9IGdsb2JhbC5ib290c3RyYXAgPSByZXF1aXJlKFwiYm9vdHN0cmFwXCIpO1xubW9tZW50ID0gZ2xvYmFsLm1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5qUXVlcnkgPSBnbG9iYWwualF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmtvID0gZ2xvYmFsLmtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xuOyB2YXIgX19icm93c2VyaWZ5X3NoaW1fcmVxdWlyZV9fPXJlcXVpcmU7KGZ1bmN0aW9uIGJyb3dzZXJpZnlTaGltKG1vZHVsZSwgZGVmaW5lLCByZXF1aXJlKSB7XG4oZnVuY3Rpb24gKCQsIGtvLCBtb21lbnQsIHVuZGVmaW5lZCkge1xyXG5cclxuICAgIC8vI3JlZ2lvbiBVdGlsc1xyXG5cclxuICAgIHZhciBkZXRlY3REYXRhVHlwZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIGZvciAodmFyIGZuYW1lIGluIGRldGVjdERhdGFUeXBlLnR5cGVEZXRlY3Rpb24pIHtcclxuICAgICAgICAgICAgdmFyIGYgPSBkZXRlY3REYXRhVHlwZVtmbmFtZV07XHJcbiAgICAgICAgICAgIGlmIChmKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRldGVjdERhdGFUeXBlLnR5cGVEZXRlY3Rpb25bZm5hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuXHJcbiAgICBkZXRlY3REYXRhVHlwZS5pc1N0cmluZyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xyXG4gICAgfTtcclxuICAgIGRldGVjdERhdGFUeXBlLmlzRGF0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBEYXRlXVwiO1xyXG4gICAgfTtcclxuICAgIGRldGVjdERhdGFUeXBlLmlzTW9tZW50ID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vbWVudC5pc01vbWVudCh2YWx1ZSk7XHJcbiAgICB9O1xyXG4gICAgZGV0ZWN0RGF0YVR5cGUudHlwZURldGVjdGlvbiA9IHtcclxuICAgICAgICBcImlzTW9tZW50XCI6IFwibW9tZW50XCIsXHJcbiAgICAgICAgXCJpc1N0cmluZ1wiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgIFwiaXNEYXRlXCI6IFwiZGF0ZVwiXHJcbiAgICB9O1xyXG5cclxuICAgIHZhciBlbEJpbmRlciA9IGZ1bmN0aW9uKCRlbCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gZWxCaW5kZXIuZnVuY3Rpb25zWyRlbC5kYXRhKGVsQmluZGVyLkRBVEFUWVBFX0tFWSldIHx8IGVsQmluZGVyLmZ1bmN0aW9uc1snX2RlZmF1bHQnXTtcclxuICAgICAgICAgICAgICAgIHZhciBmdW5jID0gZnVuY3NbJ3NldCddIHx8IGVsQmluZGVyLmZ1bmN0aW9uc1snX2RlZmF1bHQnXVsnc2V0J107XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygkZWwsIHZhbHVlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmdW5jcyA9IGVsQmluZGVyLmZ1bmN0aW9uc1skZWwuZGF0YShlbEJpbmRlci5EQVRBVFlQRV9LRVkpXSB8fCBlbEJpbmRlci5mdW5jdGlvbnNbJ19kZWZhdWx0J107XHJcbiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmNzWydnZXQnXSB8fCBlbEJpbmRlci5mdW5jdGlvbnNbJ19kZWZhdWx0J11bJ2dldCddO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMoJGVsKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uKGRhdGFUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAkZWwuZGF0YShlbEJpbmRlci5EQVRBVFlQRV9LRVksIGRhdGFUeXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIGVsQmluZGVyLkRBVEFUWVBFX0tFWSA9IFwiZGF0ZXBpY2tlci5rby5kYXRhVHlwZVwiO1xyXG5cclxuICAgIGVsQmluZGVyLmZ1bmN0aW9ucyA9IHtcclxuICAgICAgICAnX2RlZmF1bHQnOiB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCRlbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICRlbC5kYXRlcGlja2VyKCdnZXQnKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoJGVsLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgJGVsLmRhdGVwaWNrZXIoJ3NldCcsIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2lzbyc6IHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoJGVsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAkZWwuZGF0ZXBpY2tlcignZ2V0Jyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlLmZvcm1hdCgnWVlZWS1NTS1ERCcpKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoJGVsLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1udCA9IG1vbWVudCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAkZWwuZGF0ZXBpY2tlcignc2V0JywgbW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2Zvcm1hdCc6IHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoJGVsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJGVsLmRhdGVwaWNrZXIoJ2dldEFzVGV4dCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAnZGF0ZSc6IHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoJGVsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAkZWwuZGF0ZXBpY2tlcignZ2V0Jyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlLnRvRGF0ZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAga28uYmluZGluZ0hhbmRsZXJzLmRhdGVwaWNrZXIgPSB7XHJcbiAgICAgICAgaW5pdDogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IpIHtcclxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBhbGxCaW5kaW5nc0FjY2Vzc29yKCkuZGF0ZXBpY2tlck9wdGlvbnMgfHwge307XHJcbiAgICAgICAgICAgIHZhciBkYXRhVHlwZSA9IG9wdGlvbnMuZGF0YVR5cGUgfHwgZGV0ZWN0RGF0YVR5cGUoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpKTtcclxuICAgICAgICAgICAgZGF0YVR5cGUgPSAhZGF0YVR5cGUgfHwgZGF0YVR5cGUgPT0gJ3N0cmluZycgPyAnaXNvJyA6IGRhdGFUeXBlO1xyXG4gICAgICAgICAgICB2YXIgJGVsID0gJChlbGVtZW50KS5kYXRlcGlja2VyKG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgZWxCaW5kZXIoJGVsKS5yZWdpc3RlcihkYXRhVHlwZSk7XHJcblxyXG4gICAgICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcImNoYW5nZURhdGVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYWNjZXNzb3IgPSB2YWx1ZUFjY2Vzc29yKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoa28uaXNPYnNlcnZhYmxlKGFjY2Vzc29yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVsQmluZGVyKCRlbCkuZ2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3IodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcclxuICAgICAgICAgICAgZWxCaW5kZXIoJChlbGVtZW50KSlcclxuICAgICAgICAgICAgICAgIC5zZXQoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBrby5iaW5kaW5nSGFuZGxlcnMuZGF0ZXRpbWVwaWNrZXIgPSB7XHJcbiAgICAgICAgaW5pdDogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcclxuICAgICAgICAgICAgLy9pbml0aWFsaXplIGRhdGVwaWNrZXIgd2l0aCBzb21lIG9wdGlvbmFsIG9wdGlvbnNcclxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtYXQ6ICdERC9NTS9ZWVlZIGhoOm1tIEEnLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdERhdGU6IHZhbHVlQWNjZXNzb3IoKSgpXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAoYWxsQmluZGluZ3NBY2Nlc3NvcigpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhbGxCaW5kaW5nc0FjY2Vzc29yKCkuZGF0ZXBpY2tlck9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0ID0gYWxsQmluZGluZ3NBY2Nlc3NvcigpLmRhdGVwaWNrZXJPcHRpb25zLmZvcm1hdCAhPT0gdW5kZWZpbmVkID8gYWxsQmluZGluZ3NBY2Nlc3NvcigpLmRhdGVwaWNrZXJPcHRpb25zLmZvcm1hdCA6IG9wdGlvbnMuZm9ybWF0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGV0aW1lcGlja2VyKG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgLy93aGVuIGEgdXNlciBjaGFuZ2VzIHRoZSBkYXRlLCB1cGRhdGUgdGhlIHZpZXcgbW9kZWxcclxuICAgICAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgXCJkcC5jaGFuZ2VcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoa28uaXNPYnNlcnZhYmxlKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlKGV2ZW50LmRhdGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcclxuICAgICAgICAgICAgZWxCaW5kZXIoJChlbGVtZW50KSlcclxuICAgICAgICAgICAgICAgIC5zZXQoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59KShqUXVlcnksIHRoaXMua28sIHRoaXMubW9tZW50KTtcbn0pLmNhbGwoZ2xvYmFsLCBtb2R1bGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiJdfQ==
},{"bootstrap":96,"jquery":109,"knockout":111,"moment":112}],92:[function(require,module,exports){
(function (global){

; moment = global.moment = require("moment");
jQuery = global.jQuery = require("jquery");
; var __browserify_shim_require__=require;(function browserifyShim(module, define, require) {
/* =========================================================
 * MomentDatepicker
 * Based on http://www.eyecon.ro/bootstrap-datepicker
 * =========================================================
 * Copyright 2012 Andres Moschini
 *
 * 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 ($, moment, undefined) {

    // Picker object

    var Datepicker = function (element, options) {
        this.element = $(element);
        this.autoHide = true && (options.autoHide !== false) && (this.element.data('datepicker-autohide') !== false);
        this.format = options.format || this.element.data('datepicker-format') || moment.localeData().longDateFormat('L');
        this.calendarPlacement = options.calendarPlacement || this.element.data('datepicker-calendarplacement') || 'right';
        this.picker = $(DPGlobal.template)
							.appendTo(options.container)
							.on({
							    click: $.proxy(this.click, this),
							    mousedown: $.proxy(this.mousedown, this)
							});

        this.$viewport = $(options.viewport || options.container);

        var startDateText = options.startDate || this.element.data('datepicker-startdate') || undefined;
        this.startDate = (startDateText) ? DPGlobal.parseDate(startDateText, this.format) : undefined;
        var endDateText = options.endDate || this.element.data('datepicker-enddate') || undefined;
        this.endDate = (endDateText) ? DPGlobal.parseDate(endDateText, this.format) : undefined;
        this.isInput = this.element.is('input');
        this.component = !this.isInput && this.element.is('.date') ? this.element.find('.input-group-addon, .add-on') : false;

        if (this.isInput) {
            this.element.on({
                focus: $.proxy(this.show, this),
                blur: $.proxy(function (e) {
                    this._hide();
                    this.triggerChangeDate();
                }, this),
                input: $.proxy(function (e) {
                    this.updateFromValue(true);
                }, this),
                keyup: $.proxy(function (e) {
                    if (e.keyCode == 13)
                        this.updateFromValue();
                }, this),
                click: $.proxy(this.show, this)
            });
        } else {
            if (this.component) {
                this.component.on('click', $.proxy(this.show, this));
            } else {
                this.element.on('click', $.proxy(this.show, this));
            }
        }
        this.minViewMode = options.minViewMode || this.element.data('datepicker-minviewmode') || 0;
        if (typeof this.minViewMode === 'string') {
            switch (this.minViewMode) {
                case 'months':
                    this.minViewMode = 1;
                    break;
                case 'years':
                    this.minViewMode = 2;
                    break;
                default:
                    this.minViewMode = 0;
                    break;
            }
        }
        this.viewMode = options.viewMode || this.element.data('datepicker-viewmode') || 0;
        if (typeof this.viewMode === 'string') {
            switch (this.viewMode) {
                case 'months':
                    this.viewMode = 1;
                    break;
                case 'years':
                    this.viewMode = 2;
                    break;
                default:
                    this.viewMode = 0;
                    break;
            }
        }
        this.startViewMode = this.viewMode;
        this.weekStart = options.weekStart || this.element.data('datepicker-weekstart') || 0;
        this.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1;
        this.fillDow();
        this.fillMonths();
        this.setCustomClasses();
        this.updateFromValue();
        this.showMode();
        this.refresh();
    };

    Datepicker.prototype = {
        constructor: Datepicker,
        get: function () {
            return (this.moment && this.moment.clone());
        },
        getAsText: function (format) {
            var displayFormat = this.format;
            if (Object.prototype.toString.call(displayFormat) === '[object Array]') {
                displayFormat = displayFormat[0];
            }
            return (this.moment && this.moment.format(format || displayFormat)) || '';
        },
        show: function (e) {

            if (this.isInput && this.element.is(':disabled')) { return; }

            else if (this.element.children('input').is(':disabled')) { return; }

            this.picker.show();
            this.height = (this.component && this.component.outerHeight()) || this.element.outerHeight();
            this.place();
            $(window).on('resize', $.proxy(this.place, this));
            if (e) {
                e.stopPropagation();
                e.preventDefault();
            }
            if (!this.isInput) {
                $(document).on('mousedown', $.proxy(this.hide, this));
            }
            this.element.trigger({
                type: 'show'
            });
        },

        _hide: function (e) {
            // When going from the input to the picker, IE handles the blur/click
            // events differently than other browsers, in such a way that the blur
            // event triggers a hide before the click event can stop propagation.
            if (navigator.userAgent.indexOf("MSIE 8.0") > 0) {
                var t = this, args = arguments;

                function cancel_hide() {
                    clearTimeout(hide_timeout);
                    e.target.focus();
                    t.picker.off('click', cancel_hide);
                }

                function do_hide() {
                    t.hide.apply(t, args);
                    t.picker.off('click', cancel_hide);
                }

                this.picker.on('click', cancel_hide);
                var hide_timeout = setTimeout(do_hide, 100);
            } else {
                return this.hide.apply(this, arguments);
            }
        },

        hide: function () {
            this.picker.hide();
            $(window).off('resize', this.place);
            this.viewMode = this.startViewMode;
            this.showMode();
            if (!this.isInput) {
                $(document).off('mousedown', this.hide);
            }
            this.refresh();
            this.element.trigger({
                type: 'hide'
            });
        },

        refresh: function () {
            var formated = this.getAsText();

            if (!this.isInput) {
                if (this.component) {
                    this.element.find('input').prop('value', formated).change();
                }
                this.element.data('date', formated).change();
            } else {
                this.element.prop('value', formated).change();
            }
        },

        set: function (newDate, ommitEvent) {
            this.update(newDate, ommitEvent);
            this.refresh();
        },

        place: function () {
            var sourceItem = this.component ? this.component : this.element;
            var offset = sourceItem.offset();

            var viewportOffset = this.$viewport.offset();
            var scrollTop = this.$viewport.scrollTop();

            var zIndex = parseInt(this.element.parents().filter(function () {
                var zIndex = $(this).css('z-index');
                return zIndex != 'auto' && zIndex != '0';
            }).first().css('z-index')) + 10;

            if (this.calendarPlacement == 'left') {
                this.picker.css({
                    top: offset.top + this.height,
                    left: offset.left + sourceItem[0].offsetWidth - this.picker[0].offsetWidth
                });
            } else {
                this.picker.css({
                    top: offset.top + this.height,
                    left: offset.left,
                    zIndex : zIndex
                });
            }
        },
        lastValue: null,
        triggerChangeDate: function () {
            var newValue = this.moment ? this.moment.valueOf() : null;
            if (newValue != this.lastValue) {
                this.lastValue = newValue;
                this.element.trigger({
                    type: 'changeDate'
                });
            }
            if (this.autoHide)
                this.hide();
        },
        updateFromValue: function (ommitEvent) {
            this.update(this.isInput ? this.element.prop('value') : this.element.data('date'), ommitEvent);
        },

        update: function (newDate, ommitEvent) {
            var originalValue = this.moment ? this.moment.valueOf() : null;

            this.moment = DPGlobal.parseDate(newDate, this.format);

            var newValue = this.moment ? this.moment.valueOf() : null;

            if (!this.viewDate || originalValue != newValue) {
                this.viewDate = this.get() || moment().hours(0).minutes(0).seconds(0).milliseconds(0);
                this.fill();
                this.element.trigger({
                    type: 'changeDateInstant'
                });
            }
            if (!ommitEvent)
                this.triggerChangeDate();
        },

        fillDow: function () {
            var dowCnt = this.weekStart;
            var html = '<tr>';
            var daysMin = $.proxy(moment.localeData().weekdaysMin, moment.localeData());
            while (dowCnt < this.weekStart + 7) {
                html += '<th class="dow">' + daysMin(moment().day((dowCnt++) % 7)) + '</th>';
            }
            html += '</tr>';
            this.picker.find('.datepicker-days thead').append(html);
        },

        fillMonths: function () {
            var html = '';
            var i = 0;
            var monthsShort = $.proxy(moment.localeData().monthsShort, moment.localeData());
            while (i < 12) {
                html += '<span class="month">' + monthsShort(moment().startOf('month').month(i++)) + '</span>';
            }
            this.picker.find('.datepicker-months td').append(html);
        },

        fill: function () {
            var year = this.viewDate.year();
            var month = this.viewDate.month();
            var currentMoment = this.get();
            var currentDate = currentMoment ? currentMoment.valueOf() : null; //TODO: use diff
            var currentYear = currentMoment ? currentMoment.year() : null;
            var currentMonth = currentMoment ? currentMoment.month() : null;

            this.picker.find('.datepicker-days th:eq(1)')
						.text(moment.localeData().months(moment().month(month)) + ' ' + year);

            var prevMonth = moment([year, month, 1]);
            prevMonth.subtract(1, 'day');
            prevMonth.day(prevMonth.day() - (prevMonth.day() - this.weekStart + 7) % 7);

            //TODO: use diff
            var nextMonthVal = moment(prevMonth).add(42, 'days').valueOf();

            html = [];
            var clsName;
            //TODO: use diff
            while (prevMonth.valueOf() < nextMonthVal) {
                if (prevMonth.day() === this.weekStart) {
                    html.push('<tr>');
                }
                clsName = '';
                //TODO: use diff
                if (prevMonth.year() < year || (prevMonth.year() == year && prevMonth.month() < month)) {
                    clsName += ' old';
                } else if (prevMonth.year() > year || (prevMonth.year() == year && prevMonth.month() > month)) {
                    clsName += ' new';
                }
                //TODO: use diff
                if (prevMonth.valueOf() === currentDate) {
                    clsName += ' active';
                }
                if (prevMonth.valueOf() < this.startDate || prevMonth.valueOf() > this.endDate) {
                    clsName += ' disabled';
                }
                html.push('<td class="day' + clsName + '">' + prevMonth.date() + '</td>');
                if (prevMonth.day() === this.weekEnd) {
                    html.push('</tr>');
                }
                prevMonth.add(1, 'days');
            }
            this.picker.find('.datepicker-days tbody').empty().append(html.join(''));

            var months = this.picker.find('.datepicker-months')
						.find('th:eq(1)')
							.text(year)
							.end()
						.find('span').removeClass('active').removeClass('disabled');
            if (currentYear === year) {
                months.eq(currentMonth).addClass('active');
            }
            if (((this.startDate) && year < this.startDate.year()) || ((this.endDate) && year > this.endDate.year())) {
                months.addClass('disabled');
            }
            if ((this.startDate) && year == this.startDate.year()) {
                months.slice(0, this.startDate.month()).addClass('disabled');
            }
            if ((this.endDate) && year == this.endDate.year()) {
                months.slice(this.endDate.month() + 1).addClass('disabled');
            }

            html = '';
            year = parseInt(year / 10, 10) * 10;
            var yearCont = this.picker.find('.datepicker-years')
								.find('th:eq(1)')
									.text(year + '-' + (year + 9))
									.end()
								.find('td');
            year -= 1;
            for (var i = -1; i < 11; i++) {
                html += '<span class="year' + (i === -1 || i === 10 ? ' old' : '') + (currentYear === year ? ' active' : '') + (((this.startDate) && year < this.startDate.year()) || ((this.endDate) && year > this.endDate.year()) ? ' disabled' : '') + '">' + year + '</span>';
                year += 1;
            }
            yearCont.html(html);
        },

        click: function (e) {
            e.stopPropagation();
            e.preventDefault();
            var target = $(e.target).closest('span, td, th');
            if (target.length === 1) {
                switch (target[0].nodeName.toLowerCase()) {
                    case 'th':
                        switch (target[0].className) {
                            case 'switch':
                                this.showMode(1);
                                break;
                            case 'prev':
                            case 'next':
                                var nav = DPGlobal.modes[this.viewMode];
                                this.viewDate.add(nav.navStep * (target[0].className === 'prev' ? -1 : 1), nav.navFnc);
                                this.fill();
                                this.refresh();
                                break;
                        }
                        break;
                    case 'span':
                        if (!target.is('.disabled')) {
                            if (target.is('.month')) {

                                var newMonth = target.parent().find('span').index(target);
                                //this.viewDate.month(newMonth); I do not like how it works when the new month have less days
                                this.viewDate.add(newMonth - this.viewDate.month(), 'months');

                            } else {
                                var year = parseInt(target.text(), 10) || 0;
                                this.viewDate.year(year);
                            }

                            if (this.viewMode !== this.minViewMode) {
                                this.showMode(-1);
                                this.set(this.viewDate, true);
                            } else {
                                this.set(this.viewDate);
                            }
                        }
                        break;
                    case 'td':
                        if (!target.is('.disabled')) {
                            if (target.is('.day')) {
                                var day = parseInt(target.text(), 10) || 1;
                                var tempDate = this.viewDate.clone();
                                if (target.is('.old')) {
                                    tempDate.startOf('month').add(-1, 'days');
                                } else if (target.is('.new')) {
                                    tempDate.endOf('month').add(1, 'days');
                                }
                                var month = tempDate.month();
                                var year = tempDate.year();
                                this.set(moment([year, month, day]));
                            }
                        }
                        break;
                }
            }
        },

        dateWithinRange: function (date) {
            return date >= this.startDate && date <= this.endDate;
        },

        mousedown: function (e) {
            e.stopPropagation();
            e.preventDefault();
        },

        showMode: function (dir) {
            if (dir) {
                this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir));
            }
            this.picker.find('>div').hide().filter('.datepicker-' + DPGlobal.modes[this.viewMode].clsName).show();
        },
        setCustomClasses: function() {
            if (this.calendarPlacement == 'left') {
                this.picker.addClass('datepicker-left');
            }
        }
    };

    $.fn.datepicker = function (option, val) {
        var results = [];
        var chain = this.each(function () {
            var $this = $(this),
				data = $this.data('datepicker'),
				options = typeof option === 'object' && option;
            if (typeof option === 'string') {
                if (data) {
                    var result = data[option](val);
                    if (typeof result !== 'undefined')
                        results.push(result);
                }
            } else if (!data) {
                $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults, options))));
            }
        });
        return results.length == 1 ? results[0]
            : results.length ? results
            : chain;
    };

    $.fn.datepicker.defaults = {
        container : 'body'
    };
    $.fn.datepicker.Constructor = Datepicker;

    var DPGlobal = {
        modes: [
			{
			    clsName: 'days',
			    navFnc: 'months',
			    navStep: 1
			},
			{
			    clsName: 'months',
			    navFnc: 'years',
			    navStep: 1
			},
			{
			    clsName: 'years',
			    navFnc: 'years',
			    navStep: 10
			}],
        parseDate: function (value, format) {
            var mmnt = null;
            if (typeof value === "string") {
                if (Object.prototype.toString.call(format) === '[object Array]') {
                    mmnt = moment(value, format, true);
                } else {
                    mmnt = moment(value, format);
                }
            }
            if (!mmnt || !mmnt.isValid()) {
                mmnt = moment(value);
            }
            if (!mmnt || !mmnt.isValid()) {
                return null;
            }
            return mmnt.hours(0).minutes(0).seconds(0).milliseconds(0);
        },
        headTemplate: '<thead>' +
							'<tr>' +
								'<th class="prev">&lsaquo;</th>' +
								'<th colspan="5" class="switch"></th>' +
								'<th class="next">&rsaquo;</th>' +
							'</tr>' +
						'</thead>',
        contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>'
    };
    DPGlobal.template = '<div class="datepicker dropdown-menu">' +
							'<div class="datepicker-days">' +
								'<table class=" table-condensed">' +
									DPGlobal.headTemplate +
									'<tbody></tbody>' +
								'</table>' +
							'</div>' +
							'<div class="datepicker-months">' +
								'<table class="table-condensed">' +
									DPGlobal.headTemplate +
									DPGlobal.contTemplate +
								'</table>' +
							'</div>' +
							'<div class="datepicker-years">' +
								'<table class="table-condensed">' +
									DPGlobal.headTemplate +
									DPGlobal.contTemplate +
								'</table>' +
							'</div>' +
						'</div>';

}(this.jQuery, this.moment);
}).call(global, module, undefined, undefined);

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL21vbWVudC1kYXRlcGlja2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuOyBtb21lbnQgPSBnbG9iYWwubW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmpRdWVyeSA9IGdsb2JhbC5qUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuOyB2YXIgX19icm93c2VyaWZ5X3NoaW1fcmVxdWlyZV9fPXJlcXVpcmU7KGZ1bmN0aW9uIGJyb3dzZXJpZnlTaGltKG1vZHVsZSwgZGVmaW5lLCByZXF1aXJlKSB7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogTW9tZW50RGF0ZXBpY2tlclxyXG4gKiBCYXNlZCBvbiBodHRwOi8vd3d3LmV5ZWNvbi5yby9ib290c3RyYXAtZGF0ZXBpY2tlclxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgQW5kcmVzIE1vc2NoaW5pXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuIWZ1bmN0aW9uICgkLCBtb21lbnQsIHVuZGVmaW5lZCkge1xyXG5cclxuICAgIC8vIFBpY2tlciBvYmplY3RcclxuXHJcbiAgICB2YXIgRGF0ZXBpY2tlciA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTtcclxuICAgICAgICB0aGlzLmF1dG9IaWRlID0gdHJ1ZSAmJiAob3B0aW9ucy5hdXRvSGlkZSAhPT0gZmFsc2UpICYmICh0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZXBpY2tlci1hdXRvaGlkZScpICE9PSBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5mb3JtYXQgPSBvcHRpb25zLmZvcm1hdCB8fCB0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZXBpY2tlci1mb3JtYXQnKSB8fCBtb21lbnQubG9jYWxlRGF0YSgpLmxvbmdEYXRlRm9ybWF0KCdMJyk7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclBsYWNlbWVudCA9IG9wdGlvbnMuY2FsZW5kYXJQbGFjZW1lbnQgfHwgdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGVwaWNrZXItY2FsZW5kYXJwbGFjZW1lbnQnKSB8fCAncmlnaHQnO1xyXG4gICAgICAgIHRoaXMucGlja2VyID0gJChEUEdsb2JhbC50ZW1wbGF0ZSlcclxuXHRcdFx0XHRcdFx0XHQuYXBwZW5kVG8ob3B0aW9ucy5jb250YWluZXIpXHJcblx0XHRcdFx0XHRcdFx0Lm9uKHtcclxuXHRcdFx0XHRcdFx0XHQgICAgY2xpY2s6ICQucHJveHkodGhpcy5jbGljaywgdGhpcyksXHJcblx0XHRcdFx0XHRcdFx0ICAgIG1vdXNlZG93bjogJC5wcm94eSh0aGlzLm1vdXNlZG93biwgdGhpcylcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHJcbiAgICAgICAgdGhpcy4kdmlld3BvcnQgPSAkKG9wdGlvbnMudmlld3BvcnQgfHwgb3B0aW9ucy5jb250YWluZXIpO1xyXG5cclxuICAgICAgICB2YXIgc3RhcnREYXRlVGV4dCA9IG9wdGlvbnMuc3RhcnREYXRlIHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLXN0YXJ0ZGF0ZScpIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IChzdGFydERhdGVUZXh0KSA/IERQR2xvYmFsLnBhcnNlRGF0ZShzdGFydERhdGVUZXh0LCB0aGlzLmZvcm1hdCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmFyIGVuZERhdGVUZXh0ID0gb3B0aW9ucy5lbmREYXRlIHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLWVuZGRhdGUnKSB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbmREYXRlID0gKGVuZERhdGVUZXh0KSA/IERQR2xvYmFsLnBhcnNlRGF0ZShlbmREYXRlVGV4dCwgdGhpcy5mb3JtYXQpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuaXNJbnB1dCA9IHRoaXMuZWxlbWVudC5pcygnaW5wdXQnKTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudCA9ICF0aGlzLmlzSW5wdXQgJiYgdGhpcy5lbGVtZW50LmlzKCcuZGF0ZScpID8gdGhpcy5lbGVtZW50LmZpbmQoJy5pbnB1dC1ncm91cC1hZGRvbiwgLmFkZC1vbicpIDogZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzSW5wdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm9uKHtcclxuICAgICAgICAgICAgICAgIGZvY3VzOiAkLnByb3h5KHRoaXMuc2hvdywgdGhpcyksXHJcbiAgICAgICAgICAgICAgICBibHVyOiAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZURhdGUoKTtcclxuICAgICAgICAgICAgICAgIH0sIHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgaW5wdXQ6ICQucHJveHkoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZyb21WYWx1ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0sIHRoaXMpLFxyXG4gICAgICAgICAgICAgICAga2V5dXA6ICQucHJveHkoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IDEzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZyb21WYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSwgdGhpcyksXHJcbiAgICAgICAgICAgICAgICBjbGljazogJC5wcm94eSh0aGlzLnNob3csIHRoaXMpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLnNob3csIHRoaXMpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuc2hvdywgdGhpcykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubWluVmlld01vZGUgPSBvcHRpb25zLm1pblZpZXdNb2RlIHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLW1pbnZpZXdtb2RlJykgfHwgMDtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWluVmlld01vZGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5taW5WaWV3TW9kZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnbW9udGhzJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZpZXdNb2RlID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3llYXJzJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZpZXdNb2RlID0gMjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WaWV3TW9kZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9IG9wdGlvbnMudmlld01vZGUgfHwgdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGVwaWNrZXItdmlld21vZGUnKSB8fCAwO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy52aWV3TW9kZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdtb250aHMnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld01vZGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAneWVhcnMnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld01vZGUgPSAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdNb2RlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0YXJ0Vmlld01vZGUgPSB0aGlzLnZpZXdNb2RlO1xyXG4gICAgICAgIHRoaXMud2Vla1N0YXJ0ID0gb3B0aW9ucy53ZWVrU3RhcnQgfHwgdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGVwaWNrZXItd2Vla3N0YXJ0JykgfHwgMDtcclxuICAgICAgICB0aGlzLndlZWtFbmQgPSB0aGlzLndlZWtTdGFydCA9PT0gMCA/IDYgOiB0aGlzLndlZWtTdGFydCAtIDE7XHJcbiAgICAgICAgdGhpcy5maWxsRG93KCk7XHJcbiAgICAgICAgdGhpcy5maWxsTW9udGhzKCk7XHJcbiAgICAgICAgdGhpcy5zZXRDdXN0b21DbGFzc2VzKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGcm9tVmFsdWUoKTtcclxuICAgICAgICB0aGlzLnNob3dNb2RlKCk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIERhdGVwaWNrZXIucHJvdG90eXBlID0ge1xyXG4gICAgICAgIGNvbnN0cnVjdG9yOiBEYXRlcGlja2VyLFxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMubW9tZW50ICYmIHRoaXMubW9tZW50LmNsb25lKCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ2V0QXNUZXh0OiBmdW5jdGlvbiAoZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIHZhciBkaXNwbGF5Rm9ybWF0ID0gdGhpcy5mb3JtYXQ7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGlzcGxheUZvcm1hdCkgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQgPSBkaXNwbGF5Rm9ybWF0WzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5tb21lbnQgJiYgdGhpcy5tb21lbnQuZm9ybWF0KGZvcm1hdCB8fCBkaXNwbGF5Rm9ybWF0KSkgfHwgJyc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93OiBmdW5jdGlvbiAoZSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnB1dCAmJiB0aGlzLmVsZW1lbnQuaXMoJzpkaXNhYmxlZCcpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5lbGVtZW50LmNoaWxkcmVuKCdpbnB1dCcpLmlzKCc6ZGlzYWJsZWQnKSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucGlja2VyLnNob3coKTtcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSAodGhpcy5jb21wb25lbnQgJiYgdGhpcy5jb21wb25lbnQub3V0ZXJIZWlnaHQoKSkgfHwgdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCk7XHJcbiAgICAgICAgICAgIHRoaXMucGxhY2UoKTtcclxuICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCAkLnByb3h5KHRoaXMucGxhY2UsIHRoaXMpKTtcclxuICAgICAgICAgICAgaWYgKGUpIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5wdXQpIHtcclxuICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCdtb3VzZWRvd24nLCAkLnByb3h5KHRoaXMuaGlkZSwgdGhpcykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdzaG93J1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaGlkZTogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgLy8gV2hlbiBnb2luZyBmcm9tIHRoZSBpbnB1dCB0byB0aGUgcGlja2VyLCBJRSBoYW5kbGVzIHRoZSBibHVyL2NsaWNrXHJcbiAgICAgICAgICAgIC8vIGV2ZW50cyBkaWZmZXJlbnRseSB0aGFuIG90aGVyIGJyb3dzZXJzLCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIGJsdXJcclxuICAgICAgICAgICAgLy8gZXZlbnQgdHJpZ2dlcnMgYSBoaWRlIGJlZm9yZSB0aGUgY2xpY2sgZXZlbnQgY2FuIHN0b3AgcHJvcGFnYXRpb24uXHJcbiAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJNU0lFIDguMFwiKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcclxuXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYW5jZWxfaGlkZSgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlkZV90aW1lb3V0KTtcclxuICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHQucGlja2VyLm9mZignY2xpY2snLCBjYW5jZWxfaGlkZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9faGlkZSgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0LmhpZGUuYXBwbHkodCwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5waWNrZXIub2ZmKCdjbGljaycsIGNhbmNlbF9oaWRlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5vbignY2xpY2snLCBjYW5jZWxfaGlkZSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaGlkZV90aW1lb3V0ID0gc2V0VGltZW91dChkb19oaWRlLCAxMDApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGlkZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgaGlkZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5oaWRlKCk7XHJcbiAgICAgICAgICAgICQod2luZG93KS5vZmYoJ3Jlc2l6ZScsIHRoaXMucGxhY2UpO1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdNb2RlID0gdGhpcy5zdGFydFZpZXdNb2RlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dNb2RlKCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0lucHV0KSB7XHJcbiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ21vdXNlZG93bicsIHRoaXMuaGlkZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdoaWRlJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICByZWZyZXNoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBmb3JtYXRlZCA9IHRoaXMuZ2V0QXNUZXh0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJ2lucHV0JykucHJvcCgndmFsdWUnLCBmb3JtYXRlZCkuY2hhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZScsIGZvcm1hdGVkKS5jaGFuZ2UoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5wcm9wKCd2YWx1ZScsIGZvcm1hdGVkKS5jaGFuZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld0RhdGUsIG9tbWl0RXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUobmV3RGF0ZSwgb21taXRFdmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHBsYWNlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzb3VyY2VJdGVtID0gdGhpcy5jb21wb25lbnQgPyB0aGlzLmNvbXBvbmVudCA6IHRoaXMuZWxlbWVudDtcclxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHNvdXJjZUl0ZW0ub2Zmc2V0KCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgdmlld3BvcnRPZmZzZXQgPSB0aGlzLiR2aWV3cG9ydC5vZmZzZXQoKTtcclxuICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IHRoaXMuJHZpZXdwb3J0LnNjcm9sbFRvcCgpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHpJbmRleCA9IHBhcnNlSW50KHRoaXMuZWxlbWVudC5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciB6SW5kZXggPSAkKHRoaXMpLmNzcygnei1pbmRleCcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHpJbmRleCAhPSAnYXV0bycgJiYgekluZGV4ICE9ICcwJztcclxuICAgICAgICAgICAgfSkuZmlyc3QoKS5jc3MoJ3otaW5kZXgnKSkgKyAxMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGVuZGFyUGxhY2VtZW50ID09ICdsZWZ0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IG9mZnNldC50b3AgKyB0aGlzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBvZmZzZXQubGVmdCArIHNvdXJjZUl0ZW1bMF0ub2Zmc2V0V2lkdGggLSB0aGlzLnBpY2tlclswXS5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogb2Zmc2V0LnRvcCArIHRoaXMuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IG9mZnNldC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHpJbmRleCA6IHpJbmRleFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGxhc3RWYWx1ZTogbnVsbCxcclxuICAgICAgICB0cmlnZ2VyQ2hhbmdlRGF0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLm1vbWVudCA/IHRoaXMubW9tZW50LnZhbHVlT2YoKSA6IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSB0aGlzLmxhc3RWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2hhbmdlRGF0ZSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9IaWRlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB1cGRhdGVGcm9tVmFsdWU6IGZ1bmN0aW9uIChvbW1pdEV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMuaXNJbnB1dCA/IHRoaXMuZWxlbWVudC5wcm9wKCd2YWx1ZScpIDogdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGUnKSwgb21taXRFdmVudCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbiAobmV3RGF0ZSwgb21taXRFdmVudCkge1xyXG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxWYWx1ZSA9IHRoaXMubW9tZW50ID8gdGhpcy5tb21lbnQudmFsdWVPZigpIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubW9tZW50ID0gRFBHbG9iYWwucGFyc2VEYXRlKG5ld0RhdGUsIHRoaXMuZm9ybWF0KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMubW9tZW50ID8gdGhpcy5tb21lbnQudmFsdWVPZigpIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy52aWV3RGF0ZSB8fCBvcmlnaW5hbFZhbHVlICE9IG5ld1ZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlID0gdGhpcy5nZXQoKSB8fCBtb21lbnQoKS5ob3VycygwKS5taW51dGVzKDApLnNlY29uZHMoMCkubWlsbGlzZWNvbmRzKDApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWxsKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoYW5nZURhdGVJbnN0YW50J1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFvbW1pdEV2ZW50KVxyXG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlRGF0ZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZpbGxEb3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRvd0NudCA9IHRoaXMud2Vla1N0YXJ0O1xyXG4gICAgICAgICAgICB2YXIgaHRtbCA9ICc8dHI+JztcclxuICAgICAgICAgICAgdmFyIGRheXNNaW4gPSAkLnByb3h5KG1vbWVudC5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4sIG1vbWVudC5sb2NhbGVEYXRhKCkpO1xyXG4gICAgICAgICAgICB3aGlsZSAoZG93Q250IDwgdGhpcy53ZWVrU3RhcnQgKyA3KSB7XHJcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8dGggY2xhc3M9XCJkb3dcIj4nICsgZGF5c01pbihtb21lbnQoKS5kYXkoKGRvd0NudCsrKSAlIDcpKSArICc8L3RoPic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaHRtbCArPSAnPC90cj4nO1xyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5maW5kKCcuZGF0ZXBpY2tlci1kYXlzIHRoZWFkJykuYXBwZW5kKGh0bWwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZpbGxNb250aHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGh0bWwgPSAnJztcclxuICAgICAgICAgICAgdmFyIGkgPSAwO1xyXG4gICAgICAgICAgICB2YXIgbW9udGhzU2hvcnQgPSAkLnByb3h5KG1vbWVudC5sb2NhbGVEYXRhKCkubW9udGhzU2hvcnQsIG1vbWVudC5sb2NhbGVEYXRhKCkpO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IDEyKSB7XHJcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cIm1vbnRoXCI+JyArIG1vbnRoc1Nob3J0KG1vbWVudCgpLnN0YXJ0T2YoJ21vbnRoJykubW9udGgoaSsrKSkgKyAnPC9zcGFuPic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuZmluZCgnLmRhdGVwaWNrZXItbW9udGhzIHRkJykuYXBwZW5kKGh0bWwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZpbGw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHllYXIgPSB0aGlzLnZpZXdEYXRlLnllYXIoKTtcclxuICAgICAgICAgICAgdmFyIG1vbnRoID0gdGhpcy52aWV3RGF0ZS5tb250aCgpO1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudE1vbWVudCA9IHRoaXMuZ2V0KCk7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50RGF0ZSA9IGN1cnJlbnRNb21lbnQgPyBjdXJyZW50TW9tZW50LnZhbHVlT2YoKSA6IG51bGw7IC8vVE9ETzogdXNlIGRpZmZcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnRZZWFyID0gY3VycmVudE1vbWVudCA/IGN1cnJlbnRNb21lbnQueWVhcigpIDogbnVsbDtcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnRNb250aCA9IGN1cnJlbnRNb21lbnQgPyBjdXJyZW50TW9tZW50Lm1vbnRoKCkgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuZmluZCgnLmRhdGVwaWNrZXItZGF5cyB0aDplcSgxKScpXHJcblx0XHRcdFx0XHRcdC50ZXh0KG1vbWVudC5sb2NhbGVEYXRhKCkubW9udGhzKG1vbWVudCgpLm1vbnRoKG1vbnRoKSkgKyAnICcgKyB5ZWFyKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwcmV2TW9udGggPSBtb21lbnQoW3llYXIsIG1vbnRoLCAxXSk7XHJcbiAgICAgICAgICAgIHByZXZNb250aC5zdWJ0cmFjdCgxLCAnZGF5Jyk7XHJcbiAgICAgICAgICAgIHByZXZNb250aC5kYXkocHJldk1vbnRoLmRheSgpIC0gKHByZXZNb250aC5kYXkoKSAtIHRoaXMud2Vla1N0YXJ0ICsgNykgJSA3KTtcclxuXHJcbiAgICAgICAgICAgIC8vVE9ETzogdXNlIGRpZmZcclxuICAgICAgICAgICAgdmFyIG5leHRNb250aFZhbCA9IG1vbWVudChwcmV2TW9udGgpLmFkZCg0MiwgJ2RheXMnKS52YWx1ZU9mKCk7XHJcblxyXG4gICAgICAgICAgICBodG1sID0gW107XHJcbiAgICAgICAgICAgIHZhciBjbHNOYW1lO1xyXG4gICAgICAgICAgICAvL1RPRE86IHVzZSBkaWZmXHJcbiAgICAgICAgICAgIHdoaWxlIChwcmV2TW9udGgudmFsdWVPZigpIDwgbmV4dE1vbnRoVmFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldk1vbnRoLmRheSgpID09PSB0aGlzLndlZWtTdGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGh0bWwucHVzaCgnPHRyPicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2xzTmFtZSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgLy9UT0RPOiB1c2UgZGlmZlxyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZNb250aC55ZWFyKCkgPCB5ZWFyIHx8IChwcmV2TW9udGgueWVhcigpID09IHllYXIgJiYgcHJldk1vbnRoLm1vbnRoKCkgPCBtb250aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbHNOYW1lICs9ICcgb2xkJztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJldk1vbnRoLnllYXIoKSA+IHllYXIgfHwgKHByZXZNb250aC55ZWFyKCkgPT0geWVhciAmJiBwcmV2TW9udGgubW9udGgoKSA+IG1vbnRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsc05hbWUgKz0gJyBuZXcnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9UT0RPOiB1c2UgZGlmZlxyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZNb250aC52YWx1ZU9mKCkgPT09IGN1cnJlbnREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzTmFtZSArPSAnIGFjdGl2ZSc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldk1vbnRoLnZhbHVlT2YoKSA8IHRoaXMuc3RhcnREYXRlIHx8IHByZXZNb250aC52YWx1ZU9mKCkgPiB0aGlzLmVuZERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbHNOYW1lICs9ICcgZGlzYWJsZWQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaHRtbC5wdXNoKCc8dGQgY2xhc3M9XCJkYXknICsgY2xzTmFtZSArICdcIj4nICsgcHJldk1vbnRoLmRhdGUoKSArICc8L3RkPicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZNb250aC5kYXkoKSA9PT0gdGhpcy53ZWVrRW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaHRtbC5wdXNoKCc8L3RyPicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcHJldk1vbnRoLmFkZCgxLCAnZGF5cycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucGlja2VyLmZpbmQoJy5kYXRlcGlja2VyLWRheXMgdGJvZHknKS5lbXB0eSgpLmFwcGVuZChodG1sLmpvaW4oJycpKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBtb250aHMgPSB0aGlzLnBpY2tlci5maW5kKCcuZGF0ZXBpY2tlci1tb250aHMnKVxyXG5cdFx0XHRcdFx0XHQuZmluZCgndGg6ZXEoMSknKVxyXG5cdFx0XHRcdFx0XHRcdC50ZXh0KHllYXIpXHJcblx0XHRcdFx0XHRcdFx0LmVuZCgpXHJcblx0XHRcdFx0XHRcdC5maW5kKCdzcGFuJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFllYXIgPT09IHllYXIpIHtcclxuICAgICAgICAgICAgICAgIG1vbnRocy5lcShjdXJyZW50TW9udGgpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoKCh0aGlzLnN0YXJ0RGF0ZSkgJiYgeWVhciA8IHRoaXMuc3RhcnREYXRlLnllYXIoKSkgfHwgKCh0aGlzLmVuZERhdGUpICYmIHllYXIgPiB0aGlzLmVuZERhdGUueWVhcigpKSkge1xyXG4gICAgICAgICAgICAgICAgbW9udGhzLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgodGhpcy5zdGFydERhdGUpICYmIHllYXIgPT0gdGhpcy5zdGFydERhdGUueWVhcigpKSB7XHJcbiAgICAgICAgICAgICAgICBtb250aHMuc2xpY2UoMCwgdGhpcy5zdGFydERhdGUubW9udGgoKSkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCh0aGlzLmVuZERhdGUpICYmIHllYXIgPT0gdGhpcy5lbmREYXRlLnllYXIoKSkge1xyXG4gICAgICAgICAgICAgICAgbW9udGhzLnNsaWNlKHRoaXMuZW5kRGF0ZS5tb250aCgpICsgMSkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGh0bWwgPSAnJztcclxuICAgICAgICAgICAgeWVhciA9IHBhcnNlSW50KHllYXIgLyAxMCwgMTApICogMTA7XHJcbiAgICAgICAgICAgIHZhciB5ZWFyQ29udCA9IHRoaXMucGlja2VyLmZpbmQoJy5kYXRlcGlja2VyLXllYXJzJylcclxuXHRcdFx0XHRcdFx0XHRcdC5maW5kKCd0aDplcSgxKScpXHJcblx0XHRcdFx0XHRcdFx0XHRcdC50ZXh0KHllYXIgKyAnLScgKyAoeWVhciArIDkpKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQuZW5kKClcclxuXHRcdFx0XHRcdFx0XHRcdC5maW5kKCd0ZCcpO1xyXG4gICAgICAgICAgICB5ZWFyIC09IDE7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAtMTsgaSA8IDExOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPVwieWVhcicgKyAoaSA9PT0gLTEgfHwgaSA9PT0gMTAgPyAnIG9sZCcgOiAnJykgKyAoY3VycmVudFllYXIgPT09IHllYXIgPyAnIGFjdGl2ZScgOiAnJykgKyAoKCh0aGlzLnN0YXJ0RGF0ZSkgJiYgeWVhciA8IHRoaXMuc3RhcnREYXRlLnllYXIoKSkgfHwgKCh0aGlzLmVuZERhdGUpICYmIHllYXIgPiB0aGlzLmVuZERhdGUueWVhcigpKSA/ICcgZGlzYWJsZWQnIDogJycpICsgJ1wiPicgKyB5ZWFyICsgJzwvc3Bhbj4nO1xyXG4gICAgICAgICAgICAgICAgeWVhciArPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHllYXJDb250Lmh0bWwoaHRtbCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdmFyIHRhcmdldCA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ3NwYW4sIHRkLCB0aCcpO1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YXJnZXRbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RoJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0YXJnZXRbMF0uY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzd2l0Y2gnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd01vZGUoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwcmV2JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25leHQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXYgPSBEUEdsb2JhbC5tb2Rlc1t0aGlzLnZpZXdNb2RlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLmFkZChuYXYubmF2U3RlcCAqICh0YXJnZXRbMF0uY2xhc3NOYW1lID09PSAncHJldicgPyAtMSA6IDEpLCBuYXYubmF2Rm5jKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGFuJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXMoJy5kaXNhYmxlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzKCcubW9udGgnKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3TW9udGggPSB0YXJnZXQucGFyZW50KCkuZmluZCgnc3BhbicpLmluZGV4KHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLnZpZXdEYXRlLm1vbnRoKG5ld01vbnRoKTsgSSBkbyBub3QgbGlrZSBob3cgaXQgd29ya3Mgd2hlbiB0aGUgbmV3IG1vbnRoIGhhdmUgbGVzcyBkYXlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5hZGQobmV3TW9udGggLSB0aGlzLnZpZXdEYXRlLm1vbnRoKCksICdtb250aHMnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQodGFyZ2V0LnRleHQoKSwgMTApIHx8IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS55ZWFyKHllYXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdNb2RlICE9PSB0aGlzLm1pblZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93TW9kZSgtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodGhpcy52aWV3RGF0ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHRoaXMudmlld0RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RkJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXMoJy5kaXNhYmxlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzKCcuZGF5JykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF5ID0gcGFyc2VJbnQodGFyZ2V0LnRleHQoKSwgMTApIHx8IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBEYXRlID0gdGhpcy52aWV3RGF0ZS5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXMoJy5vbGQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0ZS5zdGFydE9mKCdtb250aCcpLmFkZCgtMSwgJ2RheXMnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5pcygnLm5ldycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRlLmVuZE9mKCdtb250aCcpLmFkZCgxLCAnZGF5cycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9udGggPSB0ZW1wRGF0ZS5tb250aCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ZWFyID0gdGVtcERhdGUueWVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KG1vbWVudChbeWVhciwgbW9udGgsIGRheV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGRhdGVXaXRoaW5SYW5nZTogZnVuY3Rpb24gKGRhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGUgPj0gdGhpcy5zdGFydERhdGUgJiYgZGF0ZSA8PSB0aGlzLmVuZERhdGU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgbW91c2Vkb3duOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2hvd01vZGU6IGZ1bmN0aW9uIChkaXIpIHtcclxuICAgICAgICAgICAgaWYgKGRpcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3TW9kZSA9IE1hdGgubWF4KHRoaXMubWluVmlld01vZGUsIE1hdGgubWluKDIsIHRoaXMudmlld01vZGUgKyBkaXIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5maW5kKCc+ZGl2JykuaGlkZSgpLmZpbHRlcignLmRhdGVwaWNrZXItJyArIERQR2xvYmFsLm1vZGVzW3RoaXMudmlld01vZGVdLmNsc05hbWUpLnNob3coKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNldEN1c3RvbUNsYXNzZXM6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYWxlbmRhclBsYWNlbWVudCA9PSAnbGVmdCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmFkZENsYXNzKCdkYXRlcGlja2VyLWxlZnQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgJC5mbi5kYXRlcGlja2VyID0gZnVuY3Rpb24gKG9wdGlvbiwgdmFsKSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcclxuICAgICAgICB2YXIgY2hhaW4gPSB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLFxyXG5cdFx0XHRcdGRhdGEgPSAkdGhpcy5kYXRhKCdkYXRlcGlja2VyJyksXHJcblx0XHRcdFx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmIG9wdGlvbjtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBkYXRhW29wdGlvbl0odmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAkdGhpcy5kYXRhKCdkYXRlcGlja2VyJywgKGRhdGEgPSBuZXcgRGF0ZXBpY2tlcih0aGlzLCAkLmV4dGVuZCh7fSwgJC5mbi5kYXRlcGlja2VyLmRlZmF1bHRzLCBvcHRpb25zKSkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA9PSAxID8gcmVzdWx0c1swXVxyXG4gICAgICAgICAgICA6IHJlc3VsdHMubGVuZ3RoID8gcmVzdWx0c1xyXG4gICAgICAgICAgICA6IGNoYWluO1xyXG4gICAgfTtcclxuXHJcbiAgICAkLmZuLmRhdGVwaWNrZXIuZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgY29udGFpbmVyIDogJ2JvZHknXHJcbiAgICB9O1xyXG4gICAgJC5mbi5kYXRlcGlja2VyLkNvbnN0cnVjdG9yID0gRGF0ZXBpY2tlcjtcclxuXHJcbiAgICB2YXIgRFBHbG9iYWwgPSB7XHJcbiAgICAgICAgbW9kZXM6IFtcclxuXHRcdFx0e1xyXG5cdFx0XHQgICAgY2xzTmFtZTogJ2RheXMnLFxyXG5cdFx0XHQgICAgbmF2Rm5jOiAnbW9udGhzJyxcclxuXHRcdFx0ICAgIG5hdlN0ZXA6IDFcclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHQgICAgY2xzTmFtZTogJ21vbnRocycsXHJcblx0XHRcdCAgICBuYXZGbmM6ICd5ZWFycycsXHJcblx0XHRcdCAgICBuYXZTdGVwOiAxXHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0ICAgIGNsc05hbWU6ICd5ZWFycycsXHJcblx0XHRcdCAgICBuYXZGbmM6ICd5ZWFycycsXHJcblx0XHRcdCAgICBuYXZTdGVwOiAxMFxyXG5cdFx0XHR9XSxcclxuICAgICAgICBwYXJzZURhdGU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIHZhciBtbW50ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmb3JtYXQpID09PSAnW29iamVjdCBBcnJheV0nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW1udCA9IG1vbWVudCh2YWx1ZSwgZm9ybWF0LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW1udCA9IG1vbWVudCh2YWx1ZSwgZm9ybWF0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIW1tbnQgfHwgIW1tbnQuaXNWYWxpZCgpKSB7XHJcbiAgICAgICAgICAgICAgICBtbW50ID0gbW9tZW50KHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIW1tbnQgfHwgIW1tbnQuaXNWYWxpZCgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbW1udC5ob3VycygwKS5taW51dGVzKDApLnNlY29uZHMoMCkubWlsbGlzZWNvbmRzKDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaGVhZFRlbXBsYXRlOiAnPHRoZWFkPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8dHI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRoIGNsYXNzPVwicHJldlwiPiZsc2FxdW87PC90aD4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8dGggY29sc3Bhbj1cIjVcIiBjbGFzcz1cInN3aXRjaFwiPjwvdGg+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRoIGNsYXNzPVwibmV4dFwiPiZyc2FxdW87PC90aD4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC90cj4nICtcclxuXHRcdFx0XHRcdFx0JzwvdGhlYWQ+JyxcclxuICAgICAgICBjb250VGVtcGxhdGU6ICc8dGJvZHk+PHRyPjx0ZCBjb2xzcGFuPVwiN1wiPjwvdGQ+PC90cj48L3Rib2R5PidcclxuICAgIH07XHJcbiAgICBEUEdsb2JhbC50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlciBkcm9wZG93bi1tZW51XCI+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWRheXNcIj4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8dGFibGUgY2xhc3M9XCIgdGFibGUtY29uZGVuc2VkXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmhlYWRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdCc8dGJvZHk+PC90Ym9keT4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8L3RhYmxlPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8L2Rpdj4nICtcclxuXHRcdFx0XHRcdFx0XHQnPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItbW9udGhzXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRhYmxlIGNsYXNzPVwidGFibGUtY29uZGVuc2VkXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmhlYWRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmNvbnRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHQnPC90YWJsZT4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC9kaXY+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXllYXJzXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRhYmxlIGNsYXNzPVwidGFibGUtY29uZGVuc2VkXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmhlYWRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmNvbnRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHQnPC90YWJsZT4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC9kaXY+JyArXHJcblx0XHRcdFx0XHRcdCc8L2Rpdj4nO1xyXG5cclxufSh0aGlzLmpRdWVyeSwgdGhpcy5tb21lbnQpO1xufSkuY2FsbChnbG9iYWwsIG1vZHVsZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuIl19
},{"jquery":109,"moment":112}],93:[function(require,module,exports){
(function (global){

; JQuery = global.JQuery = require("jquery");
; var __browserify_shim_require__=require;(function browserifyShim(module, exports, require, define, browserify_shim__define__module__export__) {
// name: sammy
// version: 0.7.5

// Sammy.js / http://sammyjs.org

(function(factory){
  // Support module loading scenarios
  if (typeof define === 'function' && define.amd){
    // AMD Anonymous Module
    define(['jquery'], factory);
  } else {
    // No module loader (plain <script> tag) - put directly in global namespace
    jQuery.sammy = window.Sammy = factory(jQuery);
  }
})(function($){

  var Sammy,
      PATH_REPLACER = "([^\/]+)",
      PATH_NAME_MATCHER = /:([\w\d]+)/g,
      QUERY_STRING_MATCHER = /\?([^#]*)?$/,
      // mainly for making `arguments` an Array
      _makeArray = function(nonarray) { return Array.prototype.slice.call(nonarray); },
      // borrowed from jQuery
      _isFunction = function( obj ) { return Object.prototype.toString.call(obj) === "[object Function]"; },
      _isArray = function( obj ) { return Object.prototype.toString.call(obj) === "[object Array]"; },
      _isRegExp = function( obj ) { return Object.prototype.toString.call(obj) === "[object RegExp]"; },
      _decode = function( str ) { return decodeURIComponent((str || '').replace(/\+/g, ' ')); },
      _encode = encodeURIComponent,
      _escapeHTML = function(s) {
        return String(s).replace(/&(?!\w+;)/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
      },
      _routeWrapper = function(verb) {
        return function() {
          return this.route.apply(this, [verb].concat(Array.prototype.slice.call(arguments)));
        };
      },
      _template_cache = {},
      _has_history = !!(window.history && history.pushState),
      loggers = [];


  // `Sammy` (also aliased as $.sammy) is not only the namespace for a
  // number of prototypes, its also a top level method that allows for easy
  // creation/management of `Sammy.Application` instances. There are a
  // number of different forms for `Sammy()` but each returns an instance
  // of `Sammy.Application`. When a new instance is created using
  // `Sammy` it is added to an Object called `Sammy.apps`. This
  // provides for an easy way to get at existing Sammy applications. Only one
  // instance is allowed per `element_selector` so when calling
  // `Sammy('selector')` multiple times, the first time will create
  // the application and the following times will extend the application
  // already added to that selector.
  //
  // ### Example
  //
  //      // returns the app at #main or a new app
  //      Sammy('#main')
  //
  //      // equivalent to "new Sammy.Application", except appends to apps
  //      Sammy();
  //      Sammy(function() { ... });
  //
  //      // extends the app at '#main' with function.
  //      Sammy('#main', function() { ... });
  //
  Sammy = function() {
    var args = _makeArray(arguments),
        app, selector;
    Sammy.apps = Sammy.apps || {};
    if (args.length === 0 || args[0] && _isFunction(args[0])) { // Sammy()
      return Sammy.apply(Sammy, ['body'].concat(args));
    } else if (typeof (selector = args.shift()) == 'string') { // Sammy('#main')
      app = Sammy.apps[selector] || new Sammy.Application();
      app.element_selector = selector;
      if (args.length > 0) {
        $.each(args, function(i, plugin) {
          app.use(plugin);
        });
      }
      // if the selector changes make sure the reference in Sammy.apps changes
      if (app.element_selector != selector) {
        delete Sammy.apps[selector];
      }
      Sammy.apps[app.element_selector] = app;
      return app;
    }
  };

  Sammy.VERSION = '0.7.5';

  // Add to the global logger pool. Takes a function that accepts an
  // unknown number of arguments and should print them or send them somewhere
  // The first argument is always a timestamp.
  Sammy.addLogger = function(logger) {
    loggers.push(logger);
  };

  // Sends a log message to each logger listed in the global
  // loggers pool. Can take any number of arguments.
  // Also prefixes the arguments with a timestamp.
  Sammy.log = function()  {
    var args = _makeArray(arguments);
    args.unshift("[" + Date() + "]");
    $.each(loggers, function(i, logger) {
      logger.apply(Sammy, args);
    });
  };

  if (typeof window.console != 'undefined') {
    if (typeof window.console.log === 'function' && _isFunction(window.console.log.apply)) {
      Sammy.addLogger(function() {
        window.console.log.apply(window.console, arguments);
      });
    } else {
      Sammy.addLogger(function() {
        window.console.log(arguments);
      });
    }
  } else if (typeof console != 'undefined') {
    Sammy.addLogger(function() {
      console.log.apply(console, arguments);
    });
  }

  $.extend(Sammy, {
    makeArray: _makeArray,
    isFunction: _isFunction,
    isArray: _isArray
  });

  // Sammy.Object is the base for all other Sammy classes. It provides some useful
  // functionality, including cloning, iterating, etc.
  Sammy.Object = function(obj) { // constructor
    return $.extend(this, obj || {});
  };

  $.extend(Sammy.Object.prototype, {

    // Escape HTML in string, use in templates to prevent script injection.
    // Also aliased as `h()`
    escapeHTML: _escapeHTML,
    h: _escapeHTML,

    // Returns a copy of the object with Functions removed.
    toHash: function() {
      var json = {};
      $.each(this, function(k,v) {
        if (!_isFunction(v)) {
          json[k] = v;
        }
      });
      return json;
    },

    // Renders a simple HTML version of this Objects attributes.
    // Does not render functions.
    // For example. Given this Sammy.Object:
    //
    //     var s = new Sammy.Object({first_name: 'Sammy', last_name: 'Davis Jr.'});
    //     s.toHTML()
    //     //=> '<strong>first_name</strong> Sammy<br /><strong>last_name</strong> Davis Jr.<br />'
    //
    toHTML: function() {
      var display = "";
      $.each(this, function(k, v) {
        if (!_isFunction(v)) {
          display += "<strong>" + k + "</strong> " + v + "<br />";
        }
      });
      return display;
    },

    // Returns an array of keys for this object. If `attributes_only`
    // is true will not return keys that map to a `function()`
    keys: function(attributes_only) {
      var keys = [];
      for (var property in this) {
        if (!_isFunction(this[property]) || !attributes_only) {
          keys.push(property);
        }
      }
      return keys;
    },

    // Checks if the object has a value at `key` and that the value is not empty
    has: function(key) {
      return this[key] && $.trim(this[key].toString()) !== '';
    },

    // convenience method to join as many arguments as you want
    // by the first argument - useful for making paths
    join: function() {
      var args = _makeArray(arguments);
      var delimiter = args.shift();
      return args.join(delimiter);
    },

    // Shortcut to Sammy.log
    log: function() {
      Sammy.log.apply(Sammy, arguments);
    },

    // Returns a string representation of this object.
    // if `include_functions` is true, it will also toString() the
    // methods of this object. By default only prints the attributes.
    toString: function(include_functions) {
      var s = [];
      $.each(this, function(k, v) {
        if (!_isFunction(v) || include_functions) {
          s.push('"' + k + '": ' + v.toString());
        }
      });
      return "Sammy.Object: {" + s.join(',') + "}";
    }
  });


  // Return whether the event targets this window.
  Sammy.targetIsThisWindow = function targetIsThisWindow(event, tagName) {
    var targetElement = $(event.target).closest(tagName);
    if (targetElement.length === 0) { return true; }

    var targetWindow = targetElement.attr('target');
    if (!targetWindow || targetWindow === window.name || targetWindow === '_self') { return true; }
    if (targetWindow === '_blank') { return false; }
    if (targetWindow === 'top' && window === window.top) { return true; }
    return false;
  };


  // The DefaultLocationProxy is the default location proxy for all Sammy applications.
  // A location proxy is a prototype that conforms to a simple interface. The purpose
  // of a location proxy is to notify the Sammy.Application its bound to when the location
  // or 'external state' changes.
  //
  // The `DefaultLocationProxy` watches for changes to the path of the current window and
  // is also able to set the path based on changes in the application. It does this by
  // using different methods depending on what is available in the current browser. In
  // the latest and greatest browsers it used the HTML5 History API and the `pushState`
  // `popState` events/methods. This allows you to use Sammy to serve a site behind normal
  // URI paths as opposed to the older default of hash (#) based routing. Because the server
  // can interpret the changed path on a refresh or re-entry, though, it requires additional
  // support on the server side. If you'd like to force disable HTML5 history support, please
  // use the `disable_push_state` setting on `Sammy.Application`. If pushState support
  // is enabled, `DefaultLocationProxy` also binds to all links on the page. If a link is clicked
  // that matches the current set of routes, the URL is changed using pushState instead of
  // fully setting the location and the app is notified of the change.
  //
  // If the browser does not have support for HTML5 History, `DefaultLocationProxy` automatically
  // falls back to the older hash based routing. The newest browsers (IE, Safari > 4, FF >= 3.6)
  // support a 'onhashchange' DOM event, thats fired whenever the location.hash changes.
  // In this situation the DefaultLocationProxy just binds to this event and delegates it to
  // the application. In the case of older browsers a poller is set up to track changes to the
  // hash.
  Sammy.DefaultLocationProxy = function(app, run_interval_every) {
    this.app = app;
    // set is native to false and start the poller immediately
    this.is_native = false;
    this.has_history = _has_history;
    this._startPolling(run_interval_every);
  };

  Sammy.DefaultLocationProxy.fullPath = function(location_obj) {
   // Bypass the `window.location.hash` attribute.  If a question mark
    // appears in the hash IE6 will strip it and all of the following
    // characters from `window.location.hash`.
    var matches = location_obj.toString().match(/^[^#]*(#.+)$/);
    var hash = matches ? matches[1] : '';
    return [location_obj.pathname, location_obj.search, hash].join('');
  };
$.extend(Sammy.DefaultLocationProxy.prototype , {
    // bind the proxy events to the current app.
    bind: function() {
      var proxy = this, app = this.app, lp = Sammy.DefaultLocationProxy;
      $(window).bind('hashchange.' + this.app.eventNamespace(), function(e, non_native) {
        // if we receive a native hash change event, set the proxy accordingly
        // and stop polling
        if (proxy.is_native === false && !non_native) {
          proxy.is_native = true;
          window.clearInterval(lp._interval);
          lp._interval = null;
        }
        app.trigger('location-changed');
      });
      if (_has_history && !app.disable_push_state) {
        // bind to popstate
        $(window).bind('popstate.' + this.app.eventNamespace(), function(e) {
          app.trigger('location-changed');
        });
        // bind to link clicks that have routes
        $(document).delegate('a', 'click.history-' + this.app.eventNamespace(), function (e) {
          if (e.isDefaultPrevented() || e.metaKey || e.ctrlKey) {
            return;
          }
          var full_path = lp.fullPath(this),
            // Get anchor's host name in a cross browser compatible way.
            // IE looses hostname property when setting href in JS
            // with a relative URL, e.g. a.setAttribute('href',"/whatever").
            // Circumvent this problem by creating a new link with given URL and
            // querying that for a hostname.
            hostname = this.hostname ? this.hostname : function (a) {
              var l = document.createElement("a");
              l.href = a.href;
              return l.hostname;
            }(this);

          if (hostname == window.location.hostname &&
              app.lookupRoute('get', full_path) &&
              Sammy.targetIsThisWindow(e, 'a')) {
            e.preventDefault();
            proxy.setLocation(full_path);
            return false;
          }
        });
      }
      if (!lp._bindings) {
        lp._bindings = 0;
      }
      lp._bindings++;
    },

    // unbind the proxy events from the current app
    unbind: function() {
      $(window).unbind('hashchange.' + this.app.eventNamespace());
      $(window).unbind('popstate.' + this.app.eventNamespace());
      $(document).undelegate('a', 'click.history-' + this.app.eventNamespace());
      Sammy.DefaultLocationProxy._bindings--;
      if (Sammy.DefaultLocationProxy._bindings <= 0) {
        window.clearInterval(Sammy.DefaultLocationProxy._interval);
        Sammy.DefaultLocationProxy._interval = null;
      }
    },

    // get the current location from the hash.
    getLocation: function() {
      return Sammy.DefaultLocationProxy.fullPath(window.location);
    },

    // set the current location to `new_location`
    setLocation: function(new_location) {
      if (/^([^#\/]|$)/.test(new_location)) { // non-prefixed url
        if (_has_history && !this.app.disable_push_state) {
          new_location = '/' + new_location;
        } else {
          new_location = '#!/' + new_location;
        }
      }
      if (new_location != this.getLocation()) {
        // HTML5 History exists and new_location is a full path
        if (_has_history && !this.app.disable_push_state && /^\//.test(new_location)) {
          history.pushState({ path: new_location }, window.title, new_location);
          this.app.trigger('location-changed');
        } else {
          return (window.location = new_location);
        }
      }
    },

    _startPolling: function(every) {
      // set up interval
      var proxy = this;
      if (!Sammy.DefaultLocationProxy._interval) {
        if (!every) { every = 10; }
        var hashCheck = function() {
          var current_location = proxy.getLocation();
          if (typeof Sammy.DefaultLocationProxy._last_location == 'undefined' ||
            current_location != Sammy.DefaultLocationProxy._last_location) {
            window.setTimeout(function() {
              $(window).trigger('hashchange', [true]);
            }, 0);
          }
          Sammy.DefaultLocationProxy._last_location = current_location;
        };
        hashCheck();
        Sammy.DefaultLocationProxy._interval = window.setInterval(hashCheck, every);
      }
    }
  });


  // Sammy.Application is the Base prototype for defining 'applications'.
  // An 'application' is a collection of 'routes' and bound events that is
  // attached to an element when `run()` is called.
  // The only argument an 'app_function' is evaluated within the context of the application.
  Sammy.Application = function(app_function) {
    var app = this;
    this.routes            = {};
    this.listeners         = new Sammy.Object({});
    this.arounds           = [];
    this.befores           = [];
    // generate a unique namespace
    this.namespace         = (new Date()).getTime() + '-' + parseInt(Math.random() * 1000, 10);
    this.context_prototype = function() { Sammy.EventContext.apply(this, arguments); };
    this.context_prototype.prototype = new Sammy.EventContext();

    if (_isFunction(app_function)) {
      app_function.apply(this, [this]);
    }
    // set the location proxy if not defined to the default (DefaultLocationProxy)
    if (!this._location_proxy) {
      this.setLocationProxy(new Sammy.DefaultLocationProxy(this, this.run_interval_every));
    }
    if (this.debug) {
      this.bindToAllEvents(function(e, data) {
        app.log(app.toString(), e.cleaned_type, data || {});
      });
    }
  };

  Sammy.Application.prototype = $.extend({}, Sammy.Object.prototype, {

    // the four route verbs
    ROUTE_VERBS: ['get','post','put','delete'],

    // An array of the default events triggered by the
    // application during its lifecycle
    APP_EVENTS: ['run', 'unload', 'lookup-route', 'run-route', 'route-found', 'event-context-before', 'event-context-after', 'changed', 'error', 'check-form-submission', 'redirect', 'location-changed'],

    _last_route: null,
    _location_proxy: null,
    _running: false,

    // Defines what element the application is bound to. Provide a selector
    // (parseable by `jQuery()`) and this will be used by `$element()`
    element_selector: 'body',

    // When set to true, logs all of the default events using `log()`
    debug: false,

    // When set to true, and the error() handler is not overridden, will actually
    // raise JS errors in routes (500) and when routes can't be found (404)
    raise_errors: false,

    // The time in milliseconds that the URL is queried for changes
    run_interval_every: 50,

    // if using the `DefaultLocationProxy` setting this to true will force the app to use
    // traditional hash based routing as opposed to the new HTML5 PushState support
    disable_push_state: false,

    // The default template engine to use when using `partial()` in an
    // `EventContext`. `template_engine` can either be a string that
    // corresponds to the name of a method/helper on EventContext or it can be a function
    // that takes two arguments, the content of the unrendered partial and an optional
    // JS object that contains interpolation data. Template engine is only called/referred
    // to if the extension of the partial is null or unknown. See `partial()`
    // for more information
    template_engine: null,

    // //=> Sammy.Application: body
    toString: function() {
      return 'Sammy.Application:' + this.element_selector;
    },

    // returns a jQuery object of the Applications bound element.
    $element: function(selector) {
      return selector ? $(this.element_selector).find(selector) : $(this.element_selector);
    },

    // `use()` is the entry point for including Sammy plugins.
    // The first argument to use should be a function() that is evaluated
    // in the context of the current application, just like the `app_function`
    // argument to the `Sammy.Application` constructor.
    //
    // Any additional arguments are passed to the app function sequentially.
    //
    // For much more detail about plugins, check out:
    // [http://sammyjs.org/docs/plugins](http://sammyjs.org/docs/plugins)
    //
    // ### Example
    //
    //      var MyPlugin = function(app, prepend) {
    //
    //        this.helpers({
    //          myhelper: function(text) {
    //            alert(prepend + " " + text);
    //          }
    //        });
    //
    //      };
    //
    //      var app = $.sammy(function() {
    //
    //        this.use(MyPlugin, 'This is my plugin');
    //
    //        this.get('#/', function() {
    //          this.myhelper('and dont you forget it!');
    //          //=> Alerts: This is my plugin and dont you forget it!
    //        });
    //
    //      });
    //
    // If plugin is passed as a string it assumes your are trying to load
    // Sammy."Plugin". This is the preferred way of loading core Sammy plugins
    // as it allows for better error-messaging.
    //
    // ### Example
    //
    //      $.sammy(function() {
    //        this.use('Mustache'); //=> Sammy.Mustache
    //        this.use('Storage'); //=> Sammy.Storage
    //      });
    //
    use: function() {
      // flatten the arguments
      var args = _makeArray(arguments),
          plugin = args.shift(),
          plugin_name = plugin || '';
      try {
        args.unshift(this);
        if (typeof plugin == 'string') {
          plugin_name = 'Sammy.' + plugin;
          plugin = Sammy[plugin];
        }
        plugin.apply(this, args);
      } catch(e) {
        if (typeof plugin === 'undefined') {
          this.error("Plugin Error: called use() but plugin (" + plugin_name.toString() + ") is not defined", e);
        } else if (!_isFunction(plugin)) {
          this.error("Plugin Error: called use() but '" + plugin_name.toString() + "' is not a function", e);
        } else {
          this.error("Plugin Error", e);
        }
      }
      return this;
    },

    // Sets the location proxy for the current app. By default this is set to
    // a new `Sammy.DefaultLocationProxy` on initialization. However, you can set
    // the location_proxy inside you're app function to give your app a custom
    // location mechanism. See `Sammy.DefaultLocationProxy` and `Sammy.DataLocationProxy`
    // for examples.
    //
    // `setLocationProxy()` takes an initialized location proxy.
    //
    // ### Example
    //
    //        // to bind to data instead of the default hash;
    //        var app = $.sammy(function() {
    //          this.setLocationProxy(new Sammy.DataLocationProxy(this));
    //        });
    //
    setLocationProxy: function(new_proxy) {
      var original_proxy = this._location_proxy;
      this._location_proxy = new_proxy;
      if (this.isRunning()) {
        if (original_proxy) {
          // if there is already a location proxy, unbind it.
          original_proxy.unbind();
        }
        this._location_proxy.bind();
      }
    },

    // provide log() override for inside an app that includes the relevant application element_selector
    log: function() {
      Sammy.log.apply(Sammy, Array.prototype.concat.apply([this.element_selector],arguments));
    },


    // `route()` is the main method for defining routes within an application.
    // For great detail on routes, check out:
    // [http://sammyjs.org/docs/routes](http://sammyjs.org/docs/routes)
    //
    // This method also has aliases for each of the different verbs (eg. `get()`, `post()`, etc.)
    //
    // ### Arguments
    //
    // * `verb` A String in the set of ROUTE_VERBS or 'any'. 'any' will add routes for each
    //    of the ROUTE_VERBS. If only two arguments are passed,
    //    the first argument is the path, the second is the callback and the verb
    //    is assumed to be 'any'.
    // * `path` A Regexp or a String representing the path to match to invoke this verb.
    // * `callback` A Function that is called/evaluated when the route is run see: `runRoute()`.
    //    It is also possible to pass a string as the callback, which is looked up as the name
    //    of a method on the application.
    //
    route: function(verb, path) {
      var app = this, param_names = [], add_route, path_match, callback = Array.prototype.slice.call(arguments,2);

      // if the method signature is just (path, callback)
      // assume the verb is 'any'
      if (callback.length === 0 && _isFunction(path)) {
        callback = [path];
        path = verb;
        verb = 'any';
      }

      verb = verb.toLowerCase(); // ensure verb is lower case

      // if path is a string turn it into a regex
      if (path.constructor == String) {

        // Needs to be explicitly set because IE will maintain the index unless NULL is returned,
        // which means that with two consecutive routes that contain params, the second set of params will not be found and end up in splat instead of params
        // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp/lastIndex
        PATH_NAME_MATCHER.lastIndex = 0;

        // find the names
        while ((path_match = PATH_NAME_MATCHER.exec(path)) !== null) {
          param_names.push(path_match[1]);
        }
        // replace with the path replacement
        path = new RegExp(path.replace(PATH_NAME_MATCHER, PATH_REPLACER) + "$");
      }
      // lookup callbacks
      $.each(callback,function(i,cb){
        if (typeof(cb) === 'string') {
          callback[i] = app[cb];
        }
      });

      add_route = function(with_verb) {
        var r = {verb: with_verb, path: path, callback: callback, param_names: param_names};
        // add route to routes array
        app.routes[with_verb] = app.routes[with_verb] || [];
        // place routes in order of definition
        app.routes[with_verb].push(r);
      };

      if (verb === 'any') {
        $.each(this.ROUTE_VERBS, function(i, v) { add_route(v); });
      } else {
        add_route(verb);
      }

      // return the app
      return this;
    },

    // Alias for route('get', ...)
    get: _routeWrapper('get'),

    // Alias for route('post', ...)
    post: _routeWrapper('post'),

    // Alias for route('put', ...)
    put: _routeWrapper('put'),

    // Alias for route('delete', ...)
    del: _routeWrapper('delete'),

    // Alias for route('any', ...)
    any: _routeWrapper('any'),

    // `mapRoutes` takes an array of arrays, each array being passed to route()
    // as arguments, this allows for mass definition of routes. Another benefit is
    // this makes it possible/easier to load routes via remote JSON.
    //
    // ### Example
    //
    //      var app = $.sammy(function() {
    //
    //        this.mapRoutes([
    //            ['get', '#/', function() { this.log('index'); }],
    //            // strings in callbacks are looked up as methods on the app
    //            ['post', '#/create', 'addUser'],
    //            // No verb assumes 'any' as the verb
    //            [/dowhatever/, function() { this.log(this.verb, this.path)}];
    //          ]);
    //      });
    //
    mapRoutes: function(route_array) {
      var app = this;
      $.each(route_array, function(i, route_args) {
        app.route.apply(app, route_args);
      });
      return this;
    },

    // A unique event namespace defined per application.
    // All events bound with `bind()` are automatically bound within this space.
    eventNamespace: function() {
      return ['sammy-app', this.namespace].join('-');
    },

    // Works just like `jQuery.fn.bind()` with a couple notable differences.
    //
    // * It binds all events to the application element
    // * All events are bound within the `eventNamespace()`
    // * Events are not actually bound until the application is started with `run()`
    // * callbacks are evaluated within the context of a Sammy.EventContext
    //
    bind: function(name, data, callback) {
      var app = this;
      // build the callback
      // if the arity is 2, callback is the second argument
      if (typeof callback == 'undefined') { callback = data; }
      var listener_callback =  function() {
        // pull off the context from the arguments to the callback
        var e, context, data;
        e       = arguments[0];
        data    = arguments[1];
        if (data && data.context) {
          context = data.context;
          delete data.context;
        } else {
          context = new app.context_prototype(app, 'bind', e.type, data, e.target);
        }
        e.cleaned_type = e.type.replace(app.eventNamespace(), '');
        callback.apply(context, [e, data]);
      };

      // it could be that the app element doesnt exist yet
      // so attach to the listeners array and then run()
      // will actually bind the event.
      if (!this.listeners[name]) { this.listeners[name] = []; }
      this.listeners[name].push(listener_callback);
      if (this.isRunning()) {
        // if the app is running
        // *actually* bind the event to the app element
        this._listen(name, listener_callback);
      }
      return this;
    },

    // Triggers custom events defined with `bind()`
    //
    // ### Arguments
    //
    // * `name` The name of the event. Automatically prefixed with the `eventNamespace()`
    // * `data` An optional Object that can be passed to the bound callback.
    // * `context` An optional context/Object in which to execute the bound callback.
    //   If no context is supplied a the context is a new `Sammy.EventContext`
    //
    trigger: function(name, data) {
      this.$element().trigger([name, this.eventNamespace()].join('.'), [data]);
      return this;
    },

    // Reruns the current route
    refresh: function() {
      this.last_location = null;
      this.trigger('location-changed');
      return this;
    },

    // Takes a single callback that is pushed on to a stack.
    // Before any route is run, the callbacks are evaluated in order within
    // the current `Sammy.EventContext`
    //
    // If any of the callbacks explicitly return false, execution of any
    // further callbacks and the route itself is halted.
    //
    // You can also provide a set of options that will define when to run this
    // before based on the route it proceeds.
    //
    // ### Example
    //
    //      var app = $.sammy(function() {
    //
    //        // will run at #/route but not at #/
    //        this.before('#/route', function() {
    //          //...
    //        });
    //
    //        // will run at #/ but not at #/route
    //        this.before({except: {path: '#/route'}}, function() {
    //          this.log('not before #/route');
    //        });
    //
    //        this.get('#/', function() {});
    //
    //        this.get('#/route', function() {});
    //
    //      });
    //
    // See `contextMatchesOptions()` for a full list of supported options
    //
    before: function(options, callback) {
      if (_isFunction(options)) {
        callback = options;
        options = {};
      }
      this.befores.push([options, callback]);
      return this;
    },

    // A shortcut for binding a callback to be run after a route is executed.
    // After callbacks have no guarunteed order.
    after: function(callback) {
      return this.bind('event-context-after', callback);
    },


    // Adds an around filter to the application. around filters are functions
    // that take a single argument `callback` which is the entire route
    // execution path wrapped up in a closure. This means you can decide whether
    // or not to proceed with execution by not invoking `callback` or,
    // more usefully wrapping callback inside the result of an asynchronous execution.
    //
    // ### Example
    //
    // The most common use case for around() is calling a _possibly_ async function
    // and executing the route within the functions callback:
    //
    //      var app = $.sammy(function() {
    //
    //        var current_user = false;
    //
    //        function checkLoggedIn(callback) {
    //          // /session returns a JSON representation of the logged in user
    //          // or an empty object
    //          if (!current_user) {
    //            $.getJSON('/session', function(json) {
    //              if (json.login) {
    //                // show the user as logged in
    //                current_user = json;
    //                // execute the route path
    //                callback();
    //              } else {
    //                // show the user as not logged in
    //                current_user = false;
    //                // the context of aroundFilters is an EventContext
    //                this.redirect('#/login');
    //              }
    //            });
    //          } else {
    //            // execute the route path
    //            callback();
    //          }
    //        };
    //
    //        this.around(checkLoggedIn);
    //
    //      });
    //
    around: function(callback) {
      this.arounds.push(callback);
      return this;
    },

    // Adds a onComplete function to the application. onComplete functions are executed
    // at the end of a chain of route callbacks, if they call next(). Unlike after,
    // which is called as soon as the route is complete, onComplete is like a final next()
    // for all routes, and is thus run asynchronously
    //
    // ### Example
    //
    //      app.get('/chain',function(context,next) {
    //          console.log('chain1');
    //          next();
    //      },function(context,next) {
    //          console.log('chain2');
    //          next();
    //      });
    //
    //      app.get('/link',function(context,next) {
    //          console.log('link1');
    //          next();
    //      },function(context,next) {
    //          console.log('link2');
    //          next();
    //      });
    //
    //      app.onComplete(function() {
    //          console.log("Running finally");
    //      });
    //
    // If you go to '/chain', you will get the following messages:
    //
    //      chain1
    //      chain2
    //      Running onComplete
    //
    //
    // If you go to /link, you will get the following messages:
    //
    //      link1
    //      link2
    //      Running onComplete
    //
    //
    // It really comes to play when doing asynchronous:
    //
    //      app.get('/chain',function(context,next) {
    //        $.get('/my/url',function() {
    //          console.log('chain1');
    //          next();
    //        });
    //      },function(context,next) {
    //        console.log('chain2');
    //        next();
    //      });
    //
    onComplete: function(callback) {
      this._onComplete = callback;
      return this;
    },

    // Returns `true` if the current application is running.
    isRunning: function() {
      return this._running;
    },

    // Helpers extends the EventContext prototype specific to this app.
    // This allows you to define app specific helper functions that can be used
    // whenever you're inside of an event context (templates, routes, bind).
    //
    // ### Example
    //
    //     var app = $.sammy(function() {
    //
    //       helpers({
    //         upcase: function(text) {
    //          return text.toString().toUpperCase();
    //         }
    //       });
    //
    //       get('#/', function() { with(this) {
    //         // inside of this context I can use the helpers
    //         $('#main').html(upcase($('#main').text());
    //       }});
    //
    //     });
    //
    //
    // ### Arguments
    //
    // * `extensions` An object collection of functions to extend the context.
    //
    helpers: function(extensions) {
      $.extend(this.context_prototype.prototype, extensions);
      return this;
    },

    // Helper extends the event context just like `helpers()` but does it
    // a single method at a time. This is especially useful for dynamically named
    // helpers
    //
    // ### Example
    //
    //     // Trivial example that adds 3 helper methods to the context dynamically
    //     var app = $.sammy(function(app) {
    //
    //       $.each([1,2,3], function(i, num) {
    //         app.helper('helper' + num, function() {
    //           this.log("I'm helper number " + num);
    //         });
    //       });
    //
    //       this.get('#/', function() {
    //         this.helper2(); //=> I'm helper number 2
    //       });
    //     });
    //
    // ### Arguments
    //
    // * `name` The name of the method
    // * `method` The function to be added to the prototype at `name`
    //
    helper: function(name, method) {
      this.context_prototype.prototype[name] = method;
      return this;
    },

    // Actually starts the application's lifecycle. `run()` should be invoked
    // within a document.ready block to ensure the DOM exists before binding events, etc.
    //
    // ### Example
    //
    //     var app = $.sammy(function() { ... }); // your application
    //     $(function() { // document.ready
    //        app.run();
    //     });
    //
    // ### Arguments
    //
    // * `start_url` Optionally, a String can be passed which the App will redirect to
    //   after the events/routes have been bound.
    run: function(start_url) {
      if (this.isRunning()) { return false; }
      var app = this;

      // actually bind all the listeners
      $.each(this.listeners.toHash(), function(name, callbacks) {
        $.each(callbacks, function(i, listener_callback) {
          app._listen(name, listener_callback);
        });
      });

      this.trigger('run', {start_url: start_url});
      this._running = true;
      // set last location
      this.last_location = null;
      if (!(/\#(.+)/.test(this.getLocation())) && typeof start_url != 'undefined') {
        this.setLocation(start_url);
      }
      // check url
      this._checkLocation();
      this._location_proxy.bind();
      this.bind('location-changed', function() {
        app._checkLocation();
      });

      // bind to submit to capture post/put/delete routes
      this.bind('submit', function(e) {
        if ( !Sammy.targetIsThisWindow(e, 'form') ) { return true; }
        var returned = app._checkFormSubmission($(e.target).closest('form'));
        return (returned === false) ? e.preventDefault() : false;
      });

      // bind unload to body unload
      $(window).bind('unload', function() {
        app.unload();
      });

      // trigger html changed
      return this.trigger('changed');
    },

    // The opposite of `run()`, un-binds all event listeners and intervals
    // `run()` Automatically binds a `onunload` event to run this when
    // the document is closed.
    unload: function() {
      if (!this.isRunning()) { return false; }
      var app = this;
      this.trigger('unload');
      // clear interval
      this._location_proxy.unbind();
      // unbind form submits
      this.$element().unbind('submit').removeClass(app.eventNamespace());
      // unbind all events
      $.each(this.listeners.toHash() , function(name, listeners) {
        $.each(listeners, function(i, listener_callback) {
          app._unlisten(name, listener_callback);
        });
      });
      this._running = false;
      return this;
    },

    // Not only runs `unbind` but also destroys the app reference.
    destroy: function() {
      this.unload();
      delete Sammy.apps[this.element_selector];
      return this;
    },

    // Will bind a single callback function to every event that is already
    // being listened to in the app. This includes all the `APP_EVENTS`
    // as well as any custom events defined with `bind()`.
    //
    // Used internally for debug logging.
    bindToAllEvents: function(callback) {
      var app = this;
      // bind to the APP_EVENTS first
      $.each(this.APP_EVENTS, function(i, e) {
        app.bind(e, callback);
      });
      // next, bind to listener names (only if they dont exist in APP_EVENTS)
      $.each(this.listeners.keys(true), function(i, name) {
        if ($.inArray(name, app.APP_EVENTS) == -1) {
          app.bind(name, callback);
        }
      });
      return this;
    },

    // Returns a copy of the given path with any query string after the hash
    // removed.
    routablePath: function(path) {
      return path.replace(QUERY_STRING_MATCHER, '');
    },

    // Given a verb and a String path, will return either a route object or false
    // if a matching route can be found within the current defined set.
    lookupRoute: function(verb, path) {
      var app = this, routed = false, i = 0, l, route;
      if (typeof this.routes[verb] != 'undefined') {
        l = this.routes[verb].length;
        for (; i < l; i++) {
          route = this.routes[verb][i];
          if (app.routablePath(path).match(route.path)) {
            routed = route;
            break;
          }
        }
      }
      return routed;
    },

    // First, invokes `lookupRoute()` and if a route is found, parses the
    // possible URL params and then invokes the route's callback within a new
    // `Sammy.EventContext`. If the route can not be found, it calls
    // `notFound()`. If `raise_errors` is set to `true` and
    // the `error()` has not been overridden, it will throw an actual JS
    // error.
    //
    // You probably will never have to call this directly.
    //
    // ### Arguments
    //
    // * `verb` A String for the verb.
    // * `path` A String path to lookup.
    // * `params` An Object of Params pulled from the URI or passed directly.
    //
    // ### Returns
    //
    // Either returns the value returned by the route callback or raises a 404 Not Found error.
    //
    runRoute: function(verb, path, params, target) {
      var app = this,
          route = this.lookupRoute(verb, path),
          context,
          wrapped_route,
          arounds,
          around,
          befores,
          before,
          callback_args,
          path_params,
          final_returned;

      if (this.debug) {
        this.log('runRoute', [verb, path].join(' '));
      }

      this.trigger('run-route', {verb: verb, path: path, params: params});
      if (typeof params == 'undefined') { params = {}; }

      $.extend(params, this._parseQueryString(path));

      if (route) {
        this.trigger('route-found', {route: route});
        // pull out the params from the path
        if ((path_params = route.path.exec(this.routablePath(path))) !== null) {
          // first match is the full path
          path_params.shift();
          // for each of the matches
          $.each(path_params, function(i, param) {
            // if theres a matching param name
            if (route.param_names[i]) {
              // set the name to the match
              params[route.param_names[i]] = _decode(param);
            } else {
              // initialize 'splat'
              if (!params.splat) { params.splat = []; }
              params.splat.push(_decode(param));
            }
          });
        }

        // set event context
        context  = new this.context_prototype(this, verb, path, params, target);
        // ensure arrays
        arounds = this.arounds.slice(0);
        befores = this.befores.slice(0);
        // set the callback args to the context + contents of the splat
        callback_args = [context];
        if (params.splat) {
          callback_args = callback_args.concat(params.splat);
        }
        // wrap the route up with the before filters
        wrapped_route = function() {
          var returned, i, nextRoute;
          while (befores.length > 0) {
            before = befores.shift();
            // check the options
            if (app.contextMatchesOptions(context, before[0])) {
              returned = before[1].apply(context, [context]);
              if (returned === false) { return false; }
            }
          }
          app.last_route = route;
          context.trigger('event-context-before', {context: context});
          // run multiple callbacks
          if (typeof(route.callback) === "function") {
            route.callback = [route.callback];
          }
          if (route.callback && route.callback.length) {
            i = -1;
            nextRoute = function() {
              i++;
              if (route.callback[i]) {
                returned = route.callback[i].apply(context,callback_args);
              } else if (app._onComplete && typeof(app._onComplete === "function")) {
                app._onComplete(context);
              }
            };
            callback_args.push(nextRoute);
            nextRoute();
          }
          context.trigger('event-context-after', {context: context});
          return returned;
        };
        $.each(arounds.reverse(), function(i, around) {
          var last_wrapped_route = wrapped_route;
          wrapped_route = function() { return around.apply(context, [last_wrapped_route]); };
        });
        try {
          final_returned = wrapped_route();
        } catch(e) {
          this.error(['500 Error', verb, path].join(' '), e);
        }
        return final_returned;
      } else {
        return this.notFound(verb, path);
      }
    },

    // Matches an object of options against an `EventContext` like object that
    // contains `path` and `verb` attributes. Internally Sammy uses this
    // for matching `before()` filters against specific options. You can set the
    // object to _only_ match certain paths or verbs, or match all paths or verbs _except_
    // those that match the options.
    //
    // ### Example
    //
    //     var app = $.sammy(),
    //         context = {verb: 'get', path: '#/mypath'};
    //
    //     // match against a path string
    //     app.contextMatchesOptions(context, '#/mypath'); //=> true
    //     app.contextMatchesOptions(context, '#/otherpath'); //=> false
    //     // equivalent to
    //     app.contextMatchesOptions(context, {only: {path:'#/mypath'}}); //=> true
    //     app.contextMatchesOptions(context, {only: {path:'#/otherpath'}}); //=> false
    //     // match against a path regexp
    //     app.contextMatchesOptions(context, /path/); //=> true
    //     app.contextMatchesOptions(context, /^path/); //=> false
    //     // match only a verb
    //     app.contextMatchesOptions(context, {only: {verb:'get'}}); //=> true
    //     app.contextMatchesOptions(context, {only: {verb:'post'}}); //=> false
    //     // match all except a verb
    //     app.contextMatchesOptions(context, {except: {verb:'post'}}); //=> true
    //     app.contextMatchesOptions(context, {except: {verb:'get'}}); //=> false
    //     // match all except a path
    //     app.contextMatchesOptions(context, {except: {path:'#/otherpath'}}); //=> true
    //     app.contextMatchesOptions(context, {except: {path:'#/mypath'}}); //=> false
    //     // match all except a verb and a path
    //     app.contextMatchesOptions(context, {except: {path:'#/otherpath', verb:'post'}}); //=> true
    //     app.contextMatchesOptions(context, {except: {path:'#/mypath', verb:'post'}}); //=> true
    //     app.contextMatchesOptions(context, {except: {path:'#/mypath', verb:'get'}}); //=> false
    //     // match multiple paths
    //     app.contextMatchesOptions(context, {path: ['#/mypath', '#/otherpath']}); //=> true
    //     app.contextMatchesOptions(context, {path: ['#/otherpath', '#/thirdpath']}); //=> false
    //     // equivalent to
    //     app.contextMatchesOptions(context, {only: {path: ['#/mypath', '#/otherpath']}}); //=> true
    //     app.contextMatchesOptions(context, {only: {path: ['#/otherpath', '#/thirdpath']}}); //=> false
    //     // match all except multiple paths
    //     app.contextMatchesOptions(context, {except: {path: ['#/mypath', '#/otherpath']}}); //=> false
    //     app.contextMatchesOptions(context, {except: {path: ['#/otherpath', '#/thirdpath']}}); //=> true
    //     // match all except multiple paths and verbs
    //     app.contextMatchesOptions(context, {except: {path: ['#/mypath', '#/otherpath'], verb: ['get', 'post']}}); //=> false
    //     app.contextMatchesOptions(context, {except: {path: ['#/otherpath', '#/thirdpath'], verb: ['get', 'post']}}); //=> true
    //
    contextMatchesOptions: function(context, match_options, positive) {
      var options = match_options;
      // normalize options
      if (typeof options === 'string' || _isRegExp(options)) {
        options = {path: options};
      }
      if (typeof positive === 'undefined') {
        positive = true;
      }
      // empty options always match
      if ($.isEmptyObject(options)) {
        return true;
      }
      // Do we have to match against multiple paths?
      if (_isArray(options.path)){
        var results, numopt, opts, len;
        results = [];
        for (numopt = 0, len = options.path.length; numopt < len; numopt += 1) {
          opts = $.extend({}, options, {path: options.path[numopt]});
          results.push(this.contextMatchesOptions(context, opts));
        }
        var matched = $.inArray(true, results) > -1 ? true : false;
        return positive ? matched : !matched;
      }
      if (options.only) {
        return this.contextMatchesOptions(context, options.only, true);
      } else if (options.except) {
        return this.contextMatchesOptions(context, options.except, false);
      }
      var path_matched = true, verb_matched = true;
      if (options.path) {
        if (!_isRegExp(options.path)) {
          options.path = new RegExp(options.path.toString() + '$');
        }
        path_matched = options.path.test(context.path);
      }
      if (options.verb) {
        if(typeof options.verb === 'string') {
          verb_matched = options.verb === context.verb;
        } else {
          verb_matched = options.verb.indexOf(context.verb) > -1;
        }
      }
      return positive ? (verb_matched && path_matched) : !(verb_matched && path_matched);
    },


    // Delegates to the `location_proxy` to get the current location.
    // See `Sammy.DefaultLocationProxy` for more info on location proxies.
    getLocation: function() {
      return this._location_proxy.getLocation();
    },

    // Delegates to the `location_proxy` to set the current location.
    // See `Sammy.DefaultLocationProxy` for more info on location proxies.
    //
    // ### Arguments
    //
    // * `new_location` A new location string (e.g. '#/')
    //
    setLocation: function(new_location) {
      return this._location_proxy.setLocation(new_location);
    },

    // Swaps the content of `$element()` with `content`
    // You can override this method to provide an alternate swap behavior
    // for `EventContext.partial()`.
    //
    // ### Example
    //
    //      var app = $.sammy(function() {
    //
    //        // implements a 'fade out'/'fade in'
    //        this.swap = function(content, callback) {
    //          var context = this;
    //          context.$element().fadeOut('slow', function() {
    //            context.$element().html(content);
    //            context.$element().fadeIn('slow', function() {
    //              if (callback) {
    //                callback.apply();
    //              }
    //            });
    //          });
    //        };
    //
    //      });
    //
    swap: function(content, callback) {
      var $el = this.$element().html(content);
      if (_isFunction(callback)) { callback(content); }
      return $el;
    },

    // a simple global cache for templates. Uses the same semantics as
    // `Sammy.Cache` and `Sammy.Storage` so can easily be replaced with
    // a persistent storage that lasts beyond the current request.
    templateCache: function(key, value) {
      if (typeof value != 'undefined') {
        return _template_cache[key] = value;
      } else {
        return _template_cache[key];
      }
    },

    // clear the templateCache
    clearTemplateCache: function() {
      return (_template_cache = {});
    },

    // This throws a '404 Not Found' error by invoking `error()`.
    // Override this method or `error()` to provide custom
    // 404 behavior (i.e redirecting to / or showing a warning)
    notFound: function(verb, path) {
      var ret = this.error(['404 Not Found', verb, path].join(' '));
      return (verb === 'get') ? ret : true;
    },

    // The base error handler takes a string `message` and an `Error`
    // object. If `raise_errors` is set to `true` on the app level,
    // this will re-throw the error to the browser. Otherwise it will send the error
    // to `log()`. Override this method to provide custom error handling
    // e.g logging to a server side component or displaying some feedback to the
    // user.
    error: function(message, original_error) {
      if (!original_error) { original_error = new Error(); }
      original_error.message = [message, original_error.message].join(' ');
      this.trigger('error', {message: original_error.message, error: original_error});
      if (this.raise_errors) {
        throw(original_error);
      } else {
        this.log(original_error.message, original_error);
      }
    },

    _checkLocation: function() {
      var location, returned;
      // get current location
      location = this.getLocation();
      // compare to see if hash has changed
      if (!this.last_location || this.last_location[0] != 'get' || this.last_location[1] != location) {
        // reset last location
        this.last_location = ['get', location];
        // lookup route for current hash
        returned = this.runRoute('get', location);
      }
      return returned;
    },

    _getFormVerb: function(form) {
      var $form = $(form), verb, $_method;
      $_method = $form.find('input[name="_method"]');
      if ($_method.length > 0) { verb = $_method.val(); }
      if (!verb) { verb = $form[0].getAttribute('method'); }
      if (!verb || verb === '') { verb = 'get'; }
      return $.trim(verb.toString().toLowerCase());
    },

    _checkFormSubmission: function(form) {
      var $form, path, verb, params, returned;
      this.trigger('check-form-submission', {form: form});
      $form = $(form);
      path  = $form.attr('action') || '';
      verb  = this._getFormVerb($form);

      if (this.debug) {
        this.log('_checkFormSubmission', $form, path, verb);
      }

      if (verb === 'get') {
        params = this._serializeFormParams($form);
        if (params !== '') { path += '?' + params; }
        this.setLocation(path);
        returned = false;
      } else {
        params = $.extend({}, this._parseFormParams($form));
        returned = this.runRoute(verb, path, params, form.get(0));
      }
      return (typeof returned == 'undefined') ? false : returned;
    },

    _serializeFormParams: function($form) {
       var queryString = "",
         fields = $form.serializeArray(),
         i;
       if (fields.length > 0) {
         queryString = this._encodeFormPair(fields[0].name, fields[0].value);
         for (i = 1; i < fields.length; i++) {
           queryString = queryString + "&" + this._encodeFormPair(fields[i].name, fields[i].value);
         }
       }
       return queryString;
    },

    _encodeFormPair: function(name, value){
      return _encode(name) + "=" + _encode(value);
    },

    _parseFormParams: function($form) {
      var params = {},
          form_fields = $form.serializeArray(),
          i;
      for (i = 0; i < form_fields.length; i++) {
        params = this._parseParamPair(params, form_fields[i].name, form_fields[i].value);
      }
      return params;
    },

    _parseQueryString: function(path) {
      var params = {}, parts, pairs, pair, i;

      parts = path.match(QUERY_STRING_MATCHER);
      if (parts && parts[1]) {
        pairs = parts[1].split('&');
        for (i = 0; i < pairs.length; i++) {
          pair = pairs[i].split('=');
          params = this._parseParamPair(params, _decode(pair[0]), _decode(pair[1] || ""));
        }
      }
      return params;
    },

    _parseParamPair: function(params, key, value) {
      if (typeof params[key] !== 'undefined') {
        if (_isArray(params[key])) {
          params[key].push(value);
        } else {
          params[key] = [params[key], value];
        }
      } else {
        params[key] = value;
      }
      return params;
    },

    _listen: function(name, callback) {
      return this.$element().bind([name, this.eventNamespace()].join('.'), callback);
    },

    _unlisten: function(name, callback) {
      return this.$element().unbind([name, this.eventNamespace()].join('.'), callback);
    }

  });

  // `Sammy.RenderContext` is an object that makes sequential template loading,
  // rendering and interpolation seamless even when dealing with asynchronous
  // operations.
  //
  // `RenderContext` objects are not usually created directly, rather they are
  // instantiated from an `Sammy.EventContext` by using `render()`, `load()` or
  // `partial()` which all return `RenderContext` objects.
  //
  // `RenderContext` methods always returns a modified `RenderContext`
  // for chaining (like jQuery itself).
  //
  // The core magic is in the `then()` method which puts the callback passed as
  // an argument into a queue to be executed once the previous callback is complete.
  // All the methods of `RenderContext` are wrapped in `then()` which allows you
  // to queue up methods by chaining, but maintaining a guaranteed execution order
  // even with remote calls to fetch templates.
  //
  Sammy.RenderContext = function(event_context) {
    this.event_context    = event_context;
    this.callbacks        = [];
    this.previous_content = null;
    this.content          = null;
    this.next_engine      = false;
    this.waiting          = false;
  };

  Sammy.RenderContext.prototype = $.extend({}, Sammy.Object.prototype, {

    // The "core" of the `RenderContext` object, adds the `callback` to the
    // queue. If the context is `waiting` (meaning an async operation is happening)
    // then the callback will be executed in order, once the other operations are
    // complete. If there is no currently executing operation, the `callback`
    // is executed immediately.
    //
    // The value returned from the callback is stored in `content` for the
    // subsequent operation. If you return `false`, the queue will pause, and
    // the next callback in the queue will not be executed until `next()` is
    // called. This allows for the guaranteed order of execution while working
    // with async operations.
    //
    // If then() is passed a string instead of a function, the string is looked
    // up as a helper method on the event context.
    //
    // ### Example
    //
    //      this.get('#/', function() {
    //        // initialize the RenderContext
    //        // Even though `load()` executes async, the next `then()`
    //        // wont execute until the load finishes
    //        this.load('myfile.txt')
    //            .then(function(content) {
    //              // the first argument to then is the content of the
    //              // prev operation
    //              $('#main').html(content);
    //            });
    //      });
    //
    then: function(callback) {
      if (!_isFunction(callback)) {
        // if a string is passed to then, assume we want to call
        // a helper on the event context in its context
        if (typeof callback === 'string' && callback in this.event_context) {
          var helper = this.event_context[callback];
          callback = function(content) {
            return helper.apply(this.event_context, [content]);
          };
        } else {
          return this;
        }
      }
      var context = this;
      if (this.waiting) {
        this.callbacks.push(callback);
      } else {
        this.wait();
        window.setTimeout(function() {
          var returned = callback.apply(context, [context.content, context.previous_content]);
          if (returned !== false) {
            context.next(returned);
          }
        }, 0);
      }
      return this;
    },

    // Pause the `RenderContext` queue. Combined with `next()` allows for async
    // operations.
    //
    // ### Example
    //
    //        this.get('#/', function() {
    //          this.load('mytext.json')
    //              .then(function(content) {
    //                var context = this,
    //                    data    = JSON.parse(content);
    //                // pause execution
    //                context.wait();
    //                // post to a url
    //                $.post(data.url, {}, function(response) {
    //                  context.next(JSON.parse(response));
    //                });
    //              })
    //              .then(function(data) {
    //                // data is json from the previous post
    //                $('#message').text(data.status);
    //              });
    //        });
    wait: function() {
      this.waiting = true;
    },

    // Resume the queue, setting `content` to be used in the next operation.
    // See `wait()` for an example.
    next: function(content) {
      this.waiting = false;
      if (typeof content !== 'undefined') {
        this.previous_content = this.content;
        this.content = content;
      }
      if (this.callbacks.length > 0) {
        this.then(this.callbacks.shift());
      }
    },

    // Load a template into the context.
    // The `location` can either be a string specifying the remote path to the
    // file, a jQuery object, or a DOM element.
    //
    // No interpolation happens by default, the content is stored in
    // `content`.
    //
    // In the case of a path, unless the option `{cache: false}` is passed the
    // data is stored in the app's `templateCache()`.
    //
    // If a jQuery or DOM object is passed the `innerHTML` of the node is pulled in.
    // This is useful for nesting templates as part of the initial page load wrapped
    // in invisible elements or `<script>` tags. With template paths, the template
    // engine is looked up by the extension. For DOM/jQuery embedded templates,
    // this isnt possible, so there are a couple of options:
    //
    //  * pass an `{engine:}` option.
    //  * define the engine in the `data-engine` attribute of the passed node.
    //  * just store the raw template data and use `interpolate()` manually
    //
    // If a `callback` is passed it is executed after the template load.
    load: function(location, options, callback) {
      var context = this;
      return this.then(function() {
        var should_cache, cached, is_json, location_array;
        if (_isFunction(options)) {
          callback = options;
          options = {};
        } else {
          options = $.extend({}, options);
        }
        if (callback) { this.then(callback); }
        if (typeof location === 'string') {
          // it's a path
          is_json      = (location.match(/\.json(\?|$)/) || options.json);
          should_cache = is_json ? options.cache === true : options.cache !== false;
          context.next_engine = context.event_context.engineFor(location);
          delete options.cache;
          delete options.json;
          if (options.engine) {
            context.next_engine = options.engine;
            delete options.engine;
          }
          if (should_cache && (cached = this.event_context.app.templateCache(location))) {
            return cached;
          }
          this.wait();
          $.ajax($.extend({
            url: location,
            data: {},
            dataType: is_json ? 'json' : 'text',
            type: 'get',
            success: function(data) {
              if (should_cache) {
                context.event_context.app.templateCache(location, data);
              }
              context.next(data);
            }
          }, options));
          return false;
        } else {
          // it's a dom/jQuery
          if (location.nodeType) {
            return location.innerHTML;
          }
          if (location.selector) {
            // it's a jQuery
            context.next_engine = location.attr('data-engine');
            if (options.clone === false) {
              return location.remove()[0].innerHTML.toString();
            } else {
              return location[0].innerHTML.toString();
            }
          }
        }
      });
    },

    // Load partials
    //
    // ### Example
    //
    //      this.loadPartials({mypartial: '/path/to/partial'});
    //
    loadPartials: function(partials) {
      var name;
      if(partials) {
        this.partials = this.partials || {};
        for(name in partials) {
          (function(context, name) {
            context.load(partials[name])
                   .then(function(template) {
                     this.partials[name] = template;
                   });
          })(this, name);
        }
      }
      return this;
    },

    // `load()` a template and then `interpolate()` it with data.
    //
    // can be called with multiple different signatures:
    //
    //      this.render(callback);
    //      this.render('/location');
    //      this.render('/location', {some: data});
    //      this.render('/location', callback);
    //      this.render('/location', {some: data}, callback);
    //      this.render('/location', {some: data}, {my: partials});
    //      this.render('/location', callback, {my: partials});
    //      this.render('/location', {some: data}, callback, {my: partials});
    //
    // ### Example
    //
    //      this.get('#/', function() {
    //        this.render('mytemplate.template', {name: 'test'});
    //      });
    //
    render: function(location, data, callback, partials) {
      if (_isFunction(location) && !data) {
        // invoked as render(callback)
        return this.then(location);
      } else {
        if(_isFunction(data)) {
          // invoked as render(location, callback, [partials])
          partials = callback;
          callback = data;
          data = null;
        } else if(callback && !_isFunction(callback)) {
          // invoked as render(location, data, partials)
          partials = callback;
          callback = null;
        }

        return this.loadPartials(partials)
                   .load(location)
                   .interpolate(data, location)
                   .then(callback);
      }
    },

    // `render()` the `location` with `data` and then `swap()` the
    // app's `$element` with the rendered content.
    partial: function(location, data, callback, partials) {
      if (_isFunction(callback)) {
        // invoked as partial(location, data, callback, [partials])
        return this.render(location, data, partials).swap(callback);
      } else if (_isFunction(data)) {
        // invoked as partial(location, callback, [partials])
        return this.render(location, {}, callback).swap(data);
      } else {
        // invoked as partial(location, data, [partials])
        return this.render(location, data, callback).swap();
      }
    },

    // defers the call of function to occur in order of the render queue.
    // The function can accept any number of arguments as long as the last
    // argument is a callback function. This is useful for putting arbitrary
    // asynchronous functions into the queue. The content passed to the
    // callback is passed as `content` to the next item in the queue.
    //
    // ### Example
    //
    //     this.send($.getJSON, '/app.json')
    //         .then(function(json) {
    //           $('#message).text(json['message']);
    //          });
    //
    //
    send: function() {
      var context = this,
          args = _makeArray(arguments),
          fun  = args.shift();

      if (_isArray(args[0])) { args = args[0]; }

      return this.then(function(content) {
        args.push(function(response) { context.next(response); });
        context.wait();
        fun.apply(fun, args);
        return false;
      });
    },

    // iterates over an array, applying the callback for each item item. the
    // callback takes the same style of arguments as `jQuery.each()` (index, item).
    // The return value of each callback is collected as a single string and stored
    // as `content` to be used in the next iteration of the `RenderContext`.
    collect: function(array, callback, now) {
      var context = this;
      var coll = function() {
        if (_isFunction(array)) {
          callback = array;
          array = this.content;
        }
        var contents = [], doms = false;
        $.each(array, function(i, item) {
          var returned = callback.apply(context, [i, item]);
          if (returned.jquery && returned.length == 1) {
            returned = returned[0];
            doms = true;
          }
          contents.push(returned);
          return returned;
        });
        return doms ? contents : contents.join('');
      };
      return now ? coll() : this.then(coll);
    },

    // loads a template, and then interpolates it for each item in the `data`
    // array. If a callback is passed, it will call the callback with each
    // item in the array _after_ interpolation
    renderEach: function(location, name, data, callback) {
      if (_isArray(name)) {
        callback = data;
        data = name;
        name = null;
      }
      return this.load(location).then(function(content) {
          var rctx = this;
          if (!data) {
            data = _isArray(this.previous_content) ? this.previous_content : [];
          }
          if (callback) {
            $.each(data, function(i, value) {
              var idata = {}, engine = this.next_engine || location;
              if (name) {
                idata[name] = value;
              } else {
                idata = value;
              }
              callback(value, rctx.event_context.interpolate(content, idata, engine));
            });
          } else {
            return this.collect(data, function(i, value) {
              var idata = {}, engine = this.next_engine || location;
              if (name) {
                idata[name] = value;
              } else {
                idata = value;
              }
              return this.event_context.interpolate(content, idata, engine);
            }, true);
          }
      });
    },

    // uses the previous loaded `content` and the `data` object to interpolate
    // a template. `engine` defines the templating/interpolation method/engine
    // that should be used. If `engine` is not passed, the `next_engine` is
    // used. If `retain` is `true`, the final interpolated data is appended to
    // the `previous_content` instead of just replacing it.
    interpolate: function(data, engine, retain) {
      var context = this;
      return this.then(function(content, prev) {
        if (!data && prev) { data = prev; }
        if (this.next_engine) {
          engine = this.next_engine;
          this.next_engine = false;
        }
        var rendered = context.event_context.interpolate(content, data, engine, this.partials);
        return retain ? prev + rendered : rendered;
      });
    },

    // Swap the return contents ensuring order. See `Application#swap`
    swap: function(callback) {
      return this.then(function(content) {
        this.event_context.swap(content, callback);
        return content;
      }).trigger('changed', {});
    },

    // Same usage as `jQuery.fn.appendTo()` but uses `then()` to ensure order
    appendTo: function(selector) {
      return this.then(function(content) {
        $(selector).append(content);
      }).trigger('changed', {});
    },

    // Same usage as `jQuery.fn.prependTo()` but uses `then()` to ensure order
    prependTo: function(selector) {
      return this.then(function(content) {
        $(selector).prepend(content);
      }).trigger('changed', {});
    },

    // Replaces the `$(selector)` using `html()` with the previously loaded
    // `content`
    replace: function(selector) {
      return this.then(function(content) {
        $(selector).html(content);
      }).trigger('changed', {});
    },

    // trigger the event in the order of the event context. Same semantics
    // as `Sammy.EventContext#trigger()`. If data is omitted, `content`
    // is sent as `{content: content}`
    trigger: function(name, data) {
      return this.then(function(content) {
        if (typeof data == 'undefined') { data = {content: content}; }
        this.event_context.trigger(name, data);
        return content;
      });
    }

  });

  // `Sammy.EventContext` objects are created every time a route is run or a
  // bound event is triggered. The callbacks for these events are evaluated within a `Sammy.EventContext`
  // This within these callbacks the special methods of `EventContext` are available.
  //
  // ### Example
  //
  //       $.sammy(function() {
  //         // The context here is this Sammy.Application
  //         this.get('#/:name', function() {
  //           // The context here is a new Sammy.EventContext
  //           if (this.params['name'] == 'sammy') {
  //             this.partial('name.html.erb', {name: 'Sammy'});
  //           } else {
  //             this.redirect('#/somewhere-else')
  //           }
  //         });
  //       });
  //
  // Initialize a new EventContext
  //
  // ### Arguments
  //
  // * `app` The `Sammy.Application` this event is called within.
  // * `verb` The verb invoked to run this context/route.
  // * `path` The string path invoked to run this context/route.
  // * `params` An Object of optional params to pass to the context. Is converted
  //   to a `Sammy.Object`.
  // * `target` a DOM element that the event that holds this context originates
  //   from. For post, put and del routes, this is the form element that triggered
  //   the route.
  //
  Sammy.EventContext = function(app, verb, path, params, target) {
    this.app    = app;
    this.verb   = verb;
    this.path   = path;
    this.params = new Sammy.Object(params);
    this.target = target;
  };

  Sammy.EventContext.prototype = $.extend({}, Sammy.Object.prototype, {

    // A shortcut to the app's `$element()`
    $element: function() {
      return this.app.$element(_makeArray(arguments).shift());
    },

    // Look up a templating engine within the current app and context.
    // `engine` can be one of the following:
    //
    // * a function: should conform to `function(content, data) { return interpolated; }`
    // * a template path: 'template.ejs', looks up the extension to match to
    //   the `ejs()` helper
    // * a string referring to the helper: "mustache" => `mustache()`
    //
    // If no engine is found, use the app's default `template_engine`
    //
    engineFor: function(engine) {
      var context = this, engine_match;
      // if path is actually an engine function just return it
      if (_isFunction(engine)) { return engine; }
      // lookup engine name by path extension
      engine = (engine || context.app.template_engine).toString();
      if ((engine_match = engine.match(/\.([^\.\?\#]+)(\?|$)/))) {
        engine = engine_match[1];
      }
      // set the engine to the default template engine if no match is found
      if (engine && _isFunction(context[engine])) {
        return context[engine];
      }

      if (context.app.template_engine) {
        return this.engineFor(context.app.template_engine);
      }
      return function(content, data) { return content; };
    },

    // using the template `engine` found with `engineFor()`, interpolate the
    // `data` into `content`
    interpolate: function(content, data, engine, partials) {
      return this.engineFor(engine).apply(this, [content, data, partials]);
    },

    // Create and return a `Sammy.RenderContext` calling `render()` on it.
    // Loads the template and interpolate the data, however does not actual
    // place it in the DOM.
    //
    // ### Example
    //
    //      // mytemplate.mustache <div class="name">{{name}}</div>
    //      render('mytemplate.mustache', {name: 'quirkey'});
    //      // sets the `content` to <div class="name">quirkey</div>
    //      render('mytemplate.mustache', {name: 'quirkey'})
    //        .appendTo('ul');
    //      // appends the rendered content to $('ul')
    //
    render: function(location, data, callback, partials) {
      return new Sammy.RenderContext(this).render(location, data, callback, partials);
    },

    // Create and return a `Sammy.RenderContext` calling `renderEach()` on it.
    // Loads the template and interpolates the data for each item,
    // however does not actual place it in the DOM.
    //
    // ### Example
    //
    //      // mytemplate.mustache <div class="name">{{name}}</div>
    //      renderEach('mytemplate.mustache', [{name: 'quirkey'}, {name: 'endor'}])
    //      // sets the `content` to <div class="name">quirkey</div><div class="name">endor</div>
    //      renderEach('mytemplate.mustache', [{name: 'quirkey'}, {name: 'endor'}]).appendTo('ul');
    //      // appends the rendered content to $('ul')
    //
    renderEach: function(location, name, data, callback) {
      return new Sammy.RenderContext(this).renderEach(location, name, data, callback);
    },

    // create a new `Sammy.RenderContext` calling `load()` with `location` and
    // `options`. Called without interpolation or placement, this allows for
    // preloading/caching the templates.
    load: function(location, options, callback) {
      return new Sammy.RenderContext(this).load(location, options, callback);
    },

    // create a new `Sammy.RenderContext` calling `loadPartials()` with `partials`.
    loadPartials: function(partials) {
      return new Sammy.RenderContext(this).loadPartials(partials);
    },

    // `render()` the `location` with `data` and then `swap()` the
    // app's `$element` with the rendered content.
    partial: function(location, data, callback, partials) {
      return new Sammy.RenderContext(this).partial(location, data, callback, partials);
    },

    // create a new `Sammy.RenderContext` calling `send()` with an arbitrary
    // function
    send: function() {
      var rctx = new Sammy.RenderContext(this);
      return rctx.send.apply(rctx, arguments);
    },

    // Changes the location of the current window. If `to` begins with
    // '#' it only changes the document's hash. If passed more than 1 argument
    // redirect will join them together with forward slashes.
    //
    // ### Example
    //
    //      redirect('#/other/route');
    //      // equivalent to
    //      redirect('#', 'other', 'route');
    //
    redirect: function() {
      var to, args = _makeArray(arguments),
          current_location = this.app.getLocation(),
          l = args.length;
      if (l > 1) {
        var i = 0, paths = [], pairs = [], params = {}, has_params = false;
        for (; i < l; i++) {
          if (typeof args[i] == 'string') {
            paths.push(args[i]);
          } else {
            $.extend(params, args[i]);
            has_params = true;
          }
        }
        to = paths.join('/');
        if (has_params) {
          for (var k in params) {
            pairs.push(this.app._encodeFormPair(k, params[k]));
          }
          to += '?' + pairs.join('&');
        }
      } else {
        to = args[0];
      }
      this.trigger('redirect', {to: to});
      this.app.last_location = [this.verb, this.path];
      this.app.setLocation(to);
      if (new RegExp(to).test(current_location)) {
        this.app.trigger('location-changed');
      }
    },

    // Triggers events on `app` within the current context.
    trigger: function(name, data) {
      if (typeof data == 'undefined') { data = {}; }
      if (!data.context) { data.context = this; }
      return this.app.trigger(name, data);
    },

    // A shortcut to app's `eventNamespace()`
    eventNamespace: function() {
      return this.app.eventNamespace();
    },

    // A shortcut to app's `swap()`
    swap: function(contents, callback) {
      return this.app.swap(contents, callback);
    },

    // Raises a possible `notFound()` error for the current path.
    notFound: function() {
      return this.app.notFound(this.verb, this.path);
    },

    // Default JSON parsing uses jQuery's `parseJSON()`. Include `Sammy.JSON`
    // plugin for the more conformant "crockford special".
    json: function(string) {
      return $.parseJSON(string);
    },

    // //=> Sammy.EventContext: get #/ {}
    toString: function() {
      return "Sammy.EventContext: " + [this.verb, this.path, this.params].join(' ');
    }

  });

  return Sammy;
});


; browserify_shim__define__module__export__(typeof Sammy != "undefined" ? Sammy : window.Sammy);

}).call(global, undefined, undefined, undefined, undefined, function defineExport(ex) { module.exports = ex; });

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL3NhbW15LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuOyBKUXVlcnkgPSBnbG9iYWwuSlF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbjsgdmFyIF9fYnJvd3NlcmlmeV9zaGltX3JlcXVpcmVfXz1yZXF1aXJlOyhmdW5jdGlvbiBicm93c2VyaWZ5U2hpbShtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIGRlZmluZSwgYnJvd3NlcmlmeV9zaGltX19kZWZpbmVfX21vZHVsZV9fZXhwb3J0X18pIHtcbi8vIG5hbWU6IHNhbW15XHJcbi8vIHZlcnNpb246IDAuNy41XHJcblxyXG4vLyBTYW1teS5qcyAvIGh0dHA6Ly9zYW1teWpzLm9yZ1xyXG5cclxuKGZ1bmN0aW9uKGZhY3Rvcnkpe1xyXG4gIC8vIFN1cHBvcnQgbW9kdWxlIGxvYWRpbmcgc2NlbmFyaW9zXHJcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCl7XHJcbiAgICAvLyBBTUQgQW5vbnltb3VzIE1vZHVsZVxyXG4gICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBObyBtb2R1bGUgbG9hZGVyIChwbGFpbiA8c2NyaXB0PiB0YWcpIC0gcHV0IGRpcmVjdGx5IGluIGdsb2JhbCBuYW1lc3BhY2VcclxuICAgIGpRdWVyeS5zYW1teSA9IHdpbmRvdy5TYW1teSA9IGZhY3RvcnkoalF1ZXJ5KTtcclxuICB9XHJcbn0pKGZ1bmN0aW9uKCQpe1xyXG5cclxuICB2YXIgU2FtbXksXHJcbiAgICAgIFBBVEhfUkVQTEFDRVIgPSBcIihbXlxcL10rKVwiLFxyXG4gICAgICBQQVRIX05BTUVfTUFUQ0hFUiA9IC86KFtcXHdcXGRdKykvZyxcclxuICAgICAgUVVFUllfU1RSSU5HX01BVENIRVIgPSAvXFw/KFteI10qKT8kLyxcclxuICAgICAgLy8gbWFpbmx5IGZvciBtYWtpbmcgYGFyZ3VtZW50c2AgYW4gQXJyYXlcclxuICAgICAgX21ha2VBcnJheSA9IGZ1bmN0aW9uKG5vbmFycmF5KSB7IHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChub25hcnJheSk7IH0sXHJcbiAgICAgIC8vIGJvcnJvd2VkIGZyb20galF1ZXJ5XHJcbiAgICAgIF9pc0Z1bmN0aW9uID0gZnVuY3Rpb24oIG9iaiApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCI7IH0sXHJcbiAgICAgIF9pc0FycmF5ID0gZnVuY3Rpb24oIG9iaiApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgQXJyYXldXCI7IH0sXHJcbiAgICAgIF9pc1JlZ0V4cCA9IGZ1bmN0aW9uKCBvYmogKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjsgfSxcclxuICAgICAgX2RlY29kZSA9IGZ1bmN0aW9uKCBzdHIgKSB7IHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoKHN0ciB8fCAnJykucmVwbGFjZSgvXFwrL2csICcgJykpOyB9LFxyXG4gICAgICBfZW5jb2RlID0gZW5jb2RlVVJJQ29tcG9uZW50LFxyXG4gICAgICBfZXNjYXBlSFRNTCA9IGZ1bmN0aW9uKHMpIHtcclxuICAgICAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoLyYoPyFcXHcrOykvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIF9yb3V0ZVdyYXBwZXIgPSBmdW5jdGlvbih2ZXJiKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMucm91dGUuYXBwbHkodGhpcywgW3ZlcmJdLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfSxcclxuICAgICAgX3RlbXBsYXRlX2NhY2hlID0ge30sXHJcbiAgICAgIF9oYXNfaGlzdG9yeSA9ICEhKHdpbmRvdy5oaXN0b3J5ICYmIGhpc3RvcnkucHVzaFN0YXRlKSxcclxuICAgICAgbG9nZ2VycyA9IFtdO1xyXG5cclxuXHJcbiAgLy8gYFNhbW15YCAoYWxzbyBhbGlhc2VkIGFzICQuc2FtbXkpIGlzIG5vdCBvbmx5IHRoZSBuYW1lc3BhY2UgZm9yIGFcclxuICAvLyBudW1iZXIgb2YgcHJvdG90eXBlcywgaXRzIGFsc28gYSB0b3AgbGV2ZWwgbWV0aG9kIHRoYXQgYWxsb3dzIGZvciBlYXN5XHJcbiAgLy8gY3JlYXRpb24vbWFuYWdlbWVudCBvZiBgU2FtbXkuQXBwbGljYXRpb25gIGluc3RhbmNlcy4gVGhlcmUgYXJlIGFcclxuICAvLyBudW1iZXIgb2YgZGlmZmVyZW50IGZvcm1zIGZvciBgU2FtbXkoKWAgYnV0IGVhY2ggcmV0dXJucyBhbiBpbnN0YW5jZVxyXG4gIC8vIG9mIGBTYW1teS5BcHBsaWNhdGlvbmAuIFdoZW4gYSBuZXcgaW5zdGFuY2UgaXMgY3JlYXRlZCB1c2luZ1xyXG4gIC8vIGBTYW1teWAgaXQgaXMgYWRkZWQgdG8gYW4gT2JqZWN0IGNhbGxlZCBgU2FtbXkuYXBwc2AuIFRoaXNcclxuICAvLyBwcm92aWRlcyBmb3IgYW4gZWFzeSB3YXkgdG8gZ2V0IGF0IGV4aXN0aW5nIFNhbW15IGFwcGxpY2F0aW9ucy4gT25seSBvbmVcclxuICAvLyBpbnN0YW5jZSBpcyBhbGxvd2VkIHBlciBgZWxlbWVudF9zZWxlY3RvcmAgc28gd2hlbiBjYWxsaW5nXHJcbiAgLy8gYFNhbW15KCdzZWxlY3RvcicpYCBtdWx0aXBsZSB0aW1lcywgdGhlIGZpcnN0IHRpbWUgd2lsbCBjcmVhdGVcclxuICAvLyB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBmb2xsb3dpbmcgdGltZXMgd2lsbCBleHRlbmQgdGhlIGFwcGxpY2F0aW9uXHJcbiAgLy8gYWxyZWFkeSBhZGRlZCB0byB0aGF0IHNlbGVjdG9yLlxyXG4gIC8vXHJcbiAgLy8gIyMjIEV4YW1wbGVcclxuICAvL1xyXG4gIC8vICAgICAgLy8gcmV0dXJucyB0aGUgYXBwIGF0ICNtYWluIG9yIGEgbmV3IGFwcFxyXG4gIC8vICAgICAgU2FtbXkoJyNtYWluJylcclxuICAvL1xyXG4gIC8vICAgICAgLy8gZXF1aXZhbGVudCB0byBcIm5ldyBTYW1teS5BcHBsaWNhdGlvblwiLCBleGNlcHQgYXBwZW5kcyB0byBhcHBzXHJcbiAgLy8gICAgICBTYW1teSgpO1xyXG4gIC8vICAgICAgU2FtbXkoZnVuY3Rpb24oKSB7IC4uLiB9KTtcclxuICAvL1xyXG4gIC8vICAgICAgLy8gZXh0ZW5kcyB0aGUgYXBwIGF0ICcjbWFpbicgd2l0aCBmdW5jdGlvbi5cclxuICAvLyAgICAgIFNhbW15KCcjbWFpbicsIGZ1bmN0aW9uKCkgeyAuLi4gfSk7XHJcbiAgLy9cclxuICBTYW1teSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIGFyZ3MgPSBfbWFrZUFycmF5KGFyZ3VtZW50cyksXHJcbiAgICAgICAgYXBwLCBzZWxlY3RvcjtcclxuICAgIFNhbW15LmFwcHMgPSBTYW1teS5hcHBzIHx8IHt9O1xyXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwIHx8IGFyZ3NbMF0gJiYgX2lzRnVuY3Rpb24oYXJnc1swXSkpIHsgLy8gU2FtbXkoKVxyXG4gICAgICByZXR1cm4gU2FtbXkuYXBwbHkoU2FtbXksIFsnYm9keSddLmNvbmNhdChhcmdzKSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAoc2VsZWN0b3IgPSBhcmdzLnNoaWZ0KCkpID09ICdzdHJpbmcnKSB7IC8vIFNhbW15KCcjbWFpbicpXHJcbiAgICAgIGFwcCA9IFNhbW15LmFwcHNbc2VsZWN0b3JdIHx8IG5ldyBTYW1teS5BcHBsaWNhdGlvbigpO1xyXG4gICAgICBhcHAuZWxlbWVudF9zZWxlY3RvciA9IHNlbGVjdG9yO1xyXG4gICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgJC5lYWNoKGFyZ3MsIGZ1bmN0aW9uKGksIHBsdWdpbikge1xyXG4gICAgICAgICAgYXBwLnVzZShwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGlmIHRoZSBzZWxlY3RvciBjaGFuZ2VzIG1ha2Ugc3VyZSB0aGUgcmVmZXJlbmNlIGluIFNhbW15LmFwcHMgY2hhbmdlc1xyXG4gICAgICBpZiAoYXBwLmVsZW1lbnRfc2VsZWN0b3IgIT0gc2VsZWN0b3IpIHtcclxuICAgICAgICBkZWxldGUgU2FtbXkuYXBwc1tzZWxlY3Rvcl07XHJcbiAgICAgIH1cclxuICAgICAgU2FtbXkuYXBwc1thcHAuZWxlbWVudF9zZWxlY3Rvcl0gPSBhcHA7XHJcbiAgICAgIHJldHVybiBhcHA7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgU2FtbXkuVkVSU0lPTiA9ICcwLjcuNSc7XHJcblxyXG4gIC8vIEFkZCB0byB0aGUgZ2xvYmFsIGxvZ2dlciBwb29sLiBUYWtlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhblxyXG4gIC8vIHVua25vd24gbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgc2hvdWxkIHByaW50IHRoZW0gb3Igc2VuZCB0aGVtIHNvbWV3aGVyZVxyXG4gIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbHdheXMgYSB0aW1lc3RhbXAuXHJcbiAgU2FtbXkuYWRkTG9nZ2VyID0gZnVuY3Rpb24obG9nZ2VyKSB7XHJcbiAgICBsb2dnZXJzLnB1c2gobG9nZ2VyKTtcclxuICB9O1xyXG5cclxuICAvLyBTZW5kcyBhIGxvZyBtZXNzYWdlIHRvIGVhY2ggbG9nZ2VyIGxpc3RlZCBpbiB0aGUgZ2xvYmFsXHJcbiAgLy8gbG9nZ2VycyBwb29sLiBDYW4gdGFrZSBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50cy5cclxuICAvLyBBbHNvIHByZWZpeGVzIHRoZSBhcmd1bWVudHMgd2l0aCBhIHRpbWVzdGFtcC5cclxuICBTYW1teS5sb2cgPSBmdW5jdGlvbigpICB7XHJcbiAgICB2YXIgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKTtcclxuICAgIGFyZ3MudW5zaGlmdChcIltcIiArIERhdGUoKSArIFwiXVwiKTtcclxuICAgICQuZWFjaChsb2dnZXJzLCBmdW5jdGlvbihpLCBsb2dnZXIpIHtcclxuICAgICAgbG9nZ2VyLmFwcGx5KFNhbW15LCBhcmdzKTtcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIGlmICh0eXBlb2Ygd2luZG93LmNvbnNvbGUgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93LmNvbnNvbGUubG9nID09PSAnZnVuY3Rpb24nICYmIF9pc0Z1bmN0aW9uKHdpbmRvdy5jb25zb2xlLmxvZy5hcHBseSkpIHtcclxuICAgICAgU2FtbXkuYWRkTG9nZ2VyKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZy5hcHBseSh3aW5kb3cuY29uc29sZSwgYXJndW1lbnRzKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBTYW1teS5hZGRMb2dnZXIoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgd2luZG93LmNvbnNvbGUubG9nKGFyZ3VtZW50cyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIFNhbW15LmFkZExvZ2dlcihmdW5jdGlvbigpIHtcclxuICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgJC5leHRlbmQoU2FtbXksIHtcclxuICAgIG1ha2VBcnJheTogX21ha2VBcnJheSxcclxuICAgIGlzRnVuY3Rpb246IF9pc0Z1bmN0aW9uLFxyXG4gICAgaXNBcnJheTogX2lzQXJyYXlcclxuICB9KTtcclxuXHJcbiAgLy8gU2FtbXkuT2JqZWN0IGlzIHRoZSBiYXNlIGZvciBhbGwgb3RoZXIgU2FtbXkgY2xhc3Nlcy4gSXQgcHJvdmlkZXMgc29tZSB1c2VmdWxcclxuICAvLyBmdW5jdGlvbmFsaXR5LCBpbmNsdWRpbmcgY2xvbmluZywgaXRlcmF0aW5nLCBldGMuXHJcbiAgU2FtbXkuT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7IC8vIGNvbnN0cnVjdG9yXHJcbiAgICByZXR1cm4gJC5leHRlbmQodGhpcywgb2JqIHx8IHt9KTtcclxuICB9O1xyXG5cclxuICAkLmV4dGVuZChTYW1teS5PYmplY3QucHJvdG90eXBlLCB7XHJcblxyXG4gICAgLy8gRXNjYXBlIEhUTUwgaW4gc3RyaW5nLCB1c2UgaW4gdGVtcGxhdGVzIHRvIHByZXZlbnQgc2NyaXB0IGluamVjdGlvbi5cclxuICAgIC8vIEFsc28gYWxpYXNlZCBhcyBgaCgpYFxyXG4gICAgZXNjYXBlSFRNTDogX2VzY2FwZUhUTUwsXHJcbiAgICBoOiBfZXNjYXBlSFRNTCxcclxuXHJcbiAgICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgb2JqZWN0IHdpdGggRnVuY3Rpb25zIHJlbW92ZWQuXHJcbiAgICB0b0hhc2g6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIganNvbiA9IHt9O1xyXG4gICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24oayx2KSB7XHJcbiAgICAgICAgaWYgKCFfaXNGdW5jdGlvbih2KSkge1xyXG4gICAgICAgICAganNvbltrXSA9IHY7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGpzb247XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJlbmRlcnMgYSBzaW1wbGUgSFRNTCB2ZXJzaW9uIG9mIHRoaXMgT2JqZWN0cyBhdHRyaWJ1dGVzLlxyXG4gICAgLy8gRG9lcyBub3QgcmVuZGVyIGZ1bmN0aW9ucy5cclxuICAgIC8vIEZvciBleGFtcGxlLiBHaXZlbiB0aGlzIFNhbW15Lk9iamVjdDpcclxuICAgIC8vXHJcbiAgICAvLyAgICAgdmFyIHMgPSBuZXcgU2FtbXkuT2JqZWN0KHtmaXJzdF9uYW1lOiAnU2FtbXknLCBsYXN0X25hbWU6ICdEYXZpcyBKci4nfSk7XHJcbiAgICAvLyAgICAgcy50b0hUTUwoKVxyXG4gICAgLy8gICAgIC8vPT4gJzxzdHJvbmc+Zmlyc3RfbmFtZTwvc3Ryb25nPiBTYW1teTxiciAvPjxzdHJvbmc+bGFzdF9uYW1lPC9zdHJvbmc+IERhdmlzIEpyLjxiciAvPidcclxuICAgIC8vXHJcbiAgICB0b0hUTUw6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgZGlzcGxheSA9IFwiXCI7XHJcbiAgICAgICQuZWFjaCh0aGlzLCBmdW5jdGlvbihrLCB2KSB7XHJcbiAgICAgICAgaWYgKCFfaXNGdW5jdGlvbih2KSkge1xyXG4gICAgICAgICAgZGlzcGxheSArPSBcIjxzdHJvbmc+XCIgKyBrICsgXCI8L3N0cm9uZz4gXCIgKyB2ICsgXCI8YnIgLz5cIjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlzcGxheTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBrZXlzIGZvciB0aGlzIG9iamVjdC4gSWYgYGF0dHJpYnV0ZXNfb25seWBcclxuICAgIC8vIGlzIHRydWUgd2lsbCBub3QgcmV0dXJuIGtleXMgdGhhdCBtYXAgdG8gYSBgZnVuY3Rpb24oKWBcclxuICAgIGtleXM6IGZ1bmN0aW9uKGF0dHJpYnV0ZXNfb25seSkge1xyXG4gICAgICB2YXIga2V5cyA9IFtdO1xyXG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSB7XHJcbiAgICAgICAgaWYgKCFfaXNGdW5jdGlvbih0aGlzW3Byb3BlcnR5XSkgfHwgIWF0dHJpYnV0ZXNfb25seSkge1xyXG4gICAgICAgICAga2V5cy5wdXNoKHByb3BlcnR5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIENoZWNrcyBpZiB0aGUgb2JqZWN0IGhhcyBhIHZhbHVlIGF0IGBrZXlgIGFuZCB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgZW1wdHlcclxuICAgIGhhczogZnVuY3Rpb24oa2V5KSB7XHJcbiAgICAgIHJldHVybiB0aGlzW2tleV0gJiYgJC50cmltKHRoaXNba2V5XS50b1N0cmluZygpKSAhPT0gJyc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGNvbnZlbmllbmNlIG1ldGhvZCB0byBqb2luIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50XHJcbiAgICAvLyBieSB0aGUgZmlyc3QgYXJndW1lbnQgLSB1c2VmdWwgZm9yIG1ha2luZyBwYXRoc1xyXG4gICAgam9pbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBhcmdzID0gX21ha2VBcnJheShhcmd1bWVudHMpO1xyXG4gICAgICB2YXIgZGVsaW1pdGVyID0gYXJncy5zaGlmdCgpO1xyXG4gICAgICByZXR1cm4gYXJncy5qb2luKGRlbGltaXRlcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFNob3J0Y3V0IHRvIFNhbW15LmxvZ1xyXG4gICAgbG9nOiBmdW5jdGlvbigpIHtcclxuICAgICAgU2FtbXkubG9nLmFwcGx5KFNhbW15LCBhcmd1bWVudHMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxyXG4gICAgLy8gaWYgYGluY2x1ZGVfZnVuY3Rpb25zYCBpcyB0cnVlLCBpdCB3aWxsIGFsc28gdG9TdHJpbmcoKSB0aGVcclxuICAgIC8vIG1ldGhvZHMgb2YgdGhpcyBvYmplY3QuIEJ5IGRlZmF1bHQgb25seSBwcmludHMgdGhlIGF0dHJpYnV0ZXMuXHJcbiAgICB0b1N0cmluZzogZnVuY3Rpb24oaW5jbHVkZV9mdW5jdGlvbnMpIHtcclxuICAgICAgdmFyIHMgPSBbXTtcclxuICAgICAgJC5lYWNoKHRoaXMsIGZ1bmN0aW9uKGssIHYpIHtcclxuICAgICAgICBpZiAoIV9pc0Z1bmN0aW9uKHYpIHx8IGluY2x1ZGVfZnVuY3Rpb25zKSB7XHJcbiAgICAgICAgICBzLnB1c2goJ1wiJyArIGsgKyAnXCI6ICcgKyB2LnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBcIlNhbW15Lk9iamVjdDoge1wiICsgcy5qb2luKCcsJykgKyBcIn1cIjtcclxuICAgIH1cclxuICB9KTtcclxuXHJcblxyXG4gIC8vIFJldHVybiB3aGV0aGVyIHRoZSBldmVudCB0YXJnZXRzIHRoaXMgd2luZG93LlxyXG4gIFNhbW15LnRhcmdldElzVGhpc1dpbmRvdyA9IGZ1bmN0aW9uIHRhcmdldElzVGhpc1dpbmRvdyhldmVudCwgdGFnTmFtZSkge1xyXG4gICAgdmFyIHRhcmdldEVsZW1lbnQgPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCh0YWdOYW1lKTtcclxuICAgIGlmICh0YXJnZXRFbGVtZW50Lmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gdHJ1ZTsgfVxyXG5cclxuICAgIHZhciB0YXJnZXRXaW5kb3cgPSB0YXJnZXRFbGVtZW50LmF0dHIoJ3RhcmdldCcpO1xyXG4gICAgaWYgKCF0YXJnZXRXaW5kb3cgfHwgdGFyZ2V0V2luZG93ID09PSB3aW5kb3cubmFtZSB8fCB0YXJnZXRXaW5kb3cgPT09ICdfc2VsZicpIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIGlmICh0YXJnZXRXaW5kb3cgPT09ICdfYmxhbmsnKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgaWYgKHRhcmdldFdpbmRvdyA9PT0gJ3RvcCcgJiYgd2luZG93ID09PSB3aW5kb3cudG9wKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfTtcclxuXHJcblxyXG4gIC8vIFRoZSBEZWZhdWx0TG9jYXRpb25Qcm94eSBpcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBwcm94eSBmb3IgYWxsIFNhbW15IGFwcGxpY2F0aW9ucy5cclxuICAvLyBBIGxvY2F0aW9uIHByb3h5IGlzIGEgcHJvdG90eXBlIHRoYXQgY29uZm9ybXMgdG8gYSBzaW1wbGUgaW50ZXJmYWNlLiBUaGUgcHVycG9zZVxyXG4gIC8vIG9mIGEgbG9jYXRpb24gcHJveHkgaXMgdG8gbm90aWZ5IHRoZSBTYW1teS5BcHBsaWNhdGlvbiBpdHMgYm91bmQgdG8gd2hlbiB0aGUgbG9jYXRpb25cclxuICAvLyBvciAnZXh0ZXJuYWwgc3RhdGUnIGNoYW5nZXMuXHJcbiAgLy9cclxuICAvLyBUaGUgYERlZmF1bHRMb2NhdGlvblByb3h5YCB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IHdpbmRvdyBhbmRcclxuICAvLyBpcyBhbHNvIGFibGUgdG8gc2V0IHRoZSBwYXRoIGJhc2VkIG9uIGNoYW5nZXMgaW4gdGhlIGFwcGxpY2F0aW9uLiBJdCBkb2VzIHRoaXMgYnlcclxuICAvLyB1c2luZyBkaWZmZXJlbnQgbWV0aG9kcyBkZXBlbmRpbmcgb24gd2hhdCBpcyBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgYnJvd3Nlci4gSW5cclxuICAvLyB0aGUgbGF0ZXN0IGFuZCBncmVhdGVzdCBicm93c2VycyBpdCB1c2VkIHRoZSBIVE1MNSBIaXN0b3J5IEFQSSBhbmQgdGhlIGBwdXNoU3RhdGVgXHJcbiAgLy8gYHBvcFN0YXRlYCBldmVudHMvbWV0aG9kcy4gVGhpcyBhbGxvd3MgeW91IHRvIHVzZSBTYW1teSB0byBzZXJ2ZSBhIHNpdGUgYmVoaW5kIG5vcm1hbFxyXG4gIC8vIFVSSSBwYXRocyBhcyBvcHBvc2VkIHRvIHRoZSBvbGRlciBkZWZhdWx0IG9mIGhhc2ggKCMpIGJhc2VkIHJvdXRpbmcuIEJlY2F1c2UgdGhlIHNlcnZlclxyXG4gIC8vIGNhbiBpbnRlcnByZXQgdGhlIGNoYW5nZWQgcGF0aCBvbiBhIHJlZnJlc2ggb3IgcmUtZW50cnksIHRob3VnaCwgaXQgcmVxdWlyZXMgYWRkaXRpb25hbFxyXG4gIC8vIHN1cHBvcnQgb24gdGhlIHNlcnZlciBzaWRlLiBJZiB5b3UnZCBsaWtlIHRvIGZvcmNlIGRpc2FibGUgSFRNTDUgaGlzdG9yeSBzdXBwb3J0LCBwbGVhc2VcclxuICAvLyB1c2UgdGhlIGBkaXNhYmxlX3B1c2hfc3RhdGVgIHNldHRpbmcgb24gYFNhbW15LkFwcGxpY2F0aW9uYC4gSWYgcHVzaFN0YXRlIHN1cHBvcnRcclxuICAvLyBpcyBlbmFibGVkLCBgRGVmYXVsdExvY2F0aW9uUHJveHlgIGFsc28gYmluZHMgdG8gYWxsIGxpbmtzIG9uIHRoZSBwYWdlLiBJZiBhIGxpbmsgaXMgY2xpY2tlZFxyXG4gIC8vIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBzZXQgb2Ygcm91dGVzLCB0aGUgVVJMIGlzIGNoYW5nZWQgdXNpbmcgcHVzaFN0YXRlIGluc3RlYWQgb2ZcclxuICAvLyBmdWxseSBzZXR0aW5nIHRoZSBsb2NhdGlvbiBhbmQgdGhlIGFwcCBpcyBub3RpZmllZCBvZiB0aGUgY2hhbmdlLlxyXG4gIC8vXHJcbiAgLy8gSWYgdGhlIGJyb3dzZXIgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBIVE1MNSBIaXN0b3J5LCBgRGVmYXVsdExvY2F0aW9uUHJveHlgIGF1dG9tYXRpY2FsbHlcclxuICAvLyBmYWxscyBiYWNrIHRvIHRoZSBvbGRlciBoYXNoIGJhc2VkIHJvdXRpbmcuIFRoZSBuZXdlc3QgYnJvd3NlcnMgKElFLCBTYWZhcmkgPiA0LCBGRiA+PSAzLjYpXHJcbiAgLy8gc3VwcG9ydCBhICdvbmhhc2hjaGFuZ2UnIERPTSBldmVudCwgdGhhdHMgZmlyZWQgd2hlbmV2ZXIgdGhlIGxvY2F0aW9uLmhhc2ggY2hhbmdlcy5cclxuICAvLyBJbiB0aGlzIHNpdHVhdGlvbiB0aGUgRGVmYXVsdExvY2F0aW9uUHJveHkganVzdCBiaW5kcyB0byB0aGlzIGV2ZW50IGFuZCBkZWxlZ2F0ZXMgaXQgdG9cclxuICAvLyB0aGUgYXBwbGljYXRpb24uIEluIHRoZSBjYXNlIG9mIG9sZGVyIGJyb3dzZXJzIGEgcG9sbGVyIGlzIHNldCB1cCB0byB0cmFjayBjaGFuZ2VzIHRvIHRoZVxyXG4gIC8vIGhhc2guXHJcbiAgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkgPSBmdW5jdGlvbihhcHAsIHJ1bl9pbnRlcnZhbF9ldmVyeSkge1xyXG4gICAgdGhpcy5hcHAgPSBhcHA7XHJcbiAgICAvLyBzZXQgaXMgbmF0aXZlIHRvIGZhbHNlIGFuZCBzdGFydCB0aGUgcG9sbGVyIGltbWVkaWF0ZWx5XHJcbiAgICB0aGlzLmlzX25hdGl2ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5oYXNfaGlzdG9yeSA9IF9oYXNfaGlzdG9yeTtcclxuICAgIHRoaXMuX3N0YXJ0UG9sbGluZyhydW5faW50ZXJ2YWxfZXZlcnkpO1xyXG4gIH07XHJcblxyXG4gIFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5LmZ1bGxQYXRoID0gZnVuY3Rpb24obG9jYXRpb25fb2JqKSB7XHJcbiAgIC8vIEJ5cGFzcyB0aGUgYHdpbmRvdy5sb2NhdGlvbi5oYXNoYCBhdHRyaWJ1dGUuICBJZiBhIHF1ZXN0aW9uIG1hcmtcclxuICAgIC8vIGFwcGVhcnMgaW4gdGhlIGhhc2ggSUU2IHdpbGwgc3RyaXAgaXQgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nXHJcbiAgICAvLyBjaGFyYWN0ZXJzIGZyb20gYHdpbmRvdy5sb2NhdGlvbi5oYXNoYC5cclxuICAgIHZhciBtYXRjaGVzID0gbG9jYXRpb25fb2JqLnRvU3RyaW5nKCkubWF0Y2goL15bXiNdKigjLispJC8pO1xyXG4gICAgdmFyIGhhc2ggPSBtYXRjaGVzID8gbWF0Y2hlc1sxXSA6ICcnO1xyXG4gICAgcmV0dXJuIFtsb2NhdGlvbl9vYmoucGF0aG5hbWUsIGxvY2F0aW9uX29iai5zZWFyY2gsIGhhc2hdLmpvaW4oJycpO1xyXG4gIH07XHJcbiQuZXh0ZW5kKFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5LnByb3RvdHlwZSAsIHtcclxuICAgIC8vIGJpbmQgdGhlIHByb3h5IGV2ZW50cyB0byB0aGUgY3VycmVudCBhcHAuXHJcbiAgICBiaW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIHByb3h5ID0gdGhpcywgYXBwID0gdGhpcy5hcHAsIGxwID0gU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHk7XHJcbiAgICAgICQod2luZG93KS5iaW5kKCdoYXNoY2hhbmdlLicgKyB0aGlzLmFwcC5ldmVudE5hbWVzcGFjZSgpLCBmdW5jdGlvbihlLCBub25fbmF0aXZlKSB7XHJcbiAgICAgICAgLy8gaWYgd2UgcmVjZWl2ZSBhIG5hdGl2ZSBoYXNoIGNoYW5nZSBldmVudCwgc2V0IHRoZSBwcm94eSBhY2NvcmRpbmdseVxyXG4gICAgICAgIC8vIGFuZCBzdG9wIHBvbGxpbmdcclxuICAgICAgICBpZiAocHJveHkuaXNfbmF0aXZlID09PSBmYWxzZSAmJiAhbm9uX25hdGl2ZSkge1xyXG4gICAgICAgICAgcHJveHkuaXNfbmF0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGxwLl9pbnRlcnZhbCk7XHJcbiAgICAgICAgICBscC5faW50ZXJ2YWwgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhcHAudHJpZ2dlcignbG9jYXRpb24tY2hhbmdlZCcpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKF9oYXNfaGlzdG9yeSAmJiAhYXBwLmRpc2FibGVfcHVzaF9zdGF0ZSkge1xyXG4gICAgICAgIC8vIGJpbmQgdG8gcG9wc3RhdGVcclxuICAgICAgICAkKHdpbmRvdykuYmluZCgncG9wc3RhdGUuJyArIHRoaXMuYXBwLmV2ZW50TmFtZXNwYWNlKCksIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgIGFwcC50cmlnZ2VyKCdsb2NhdGlvbi1jaGFuZ2VkJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gYmluZCB0byBsaW5rIGNsaWNrcyB0aGF0IGhhdmUgcm91dGVzXHJcbiAgICAgICAgJChkb2N1bWVudCkuZGVsZWdhdGUoJ2EnLCAnY2xpY2suaGlzdG9yeS0nICsgdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKSwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8IGUubWV0YUtleSB8fCBlLmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFyIGZ1bGxfcGF0aCA9IGxwLmZ1bGxQYXRoKHRoaXMpLFxyXG4gICAgICAgICAgICAvLyBHZXQgYW5jaG9yJ3MgaG9zdCBuYW1lIGluIGEgY3Jvc3MgYnJvd3NlciBjb21wYXRpYmxlIHdheS5cclxuICAgICAgICAgICAgLy8gSUUgbG9vc2VzIGhvc3RuYW1lIHByb3BlcnR5IHdoZW4gc2V0dGluZyBocmVmIGluIEpTXHJcbiAgICAgICAgICAgIC8vIHdpdGggYSByZWxhdGl2ZSBVUkwsIGUuZy4gYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLFwiL3doYXRldmVyXCIpLlxyXG4gICAgICAgICAgICAvLyBDaXJjdW12ZW50IHRoaXMgcHJvYmxlbSBieSBjcmVhdGluZyBhIG5ldyBsaW5rIHdpdGggZ2l2ZW4gVVJMIGFuZFxyXG4gICAgICAgICAgICAvLyBxdWVyeWluZyB0aGF0IGZvciBhIGhvc3RuYW1lLlxyXG4gICAgICAgICAgICBob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgPyB0aGlzLmhvc3RuYW1lIDogZnVuY3Rpb24gKGEpIHtcclxuICAgICAgICAgICAgICB2YXIgbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgICAgICAgIGwuaHJlZiA9IGEuaHJlZjtcclxuICAgICAgICAgICAgICByZXR1cm4gbC5ob3N0bmFtZTtcclxuICAgICAgICAgICAgfSh0aGlzKTtcclxuXHJcbiAgICAgICAgICBpZiAoaG9zdG5hbWUgPT0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICYmXHJcbiAgICAgICAgICAgICAgYXBwLmxvb2t1cFJvdXRlKCdnZXQnLCBmdWxsX3BhdGgpICYmXHJcbiAgICAgICAgICAgICAgU2FtbXkudGFyZ2V0SXNUaGlzV2luZG93KGUsICdhJykpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBwcm94eS5zZXRMb2NhdGlvbihmdWxsX3BhdGgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFscC5fYmluZGluZ3MpIHtcclxuICAgICAgICBscC5fYmluZGluZ3MgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGxwLl9iaW5kaW5ncysrO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyB1bmJpbmQgdGhlIHByb3h5IGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IGFwcFxyXG4gICAgdW5iaW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgJCh3aW5kb3cpLnVuYmluZCgnaGFzaGNoYW5nZS4nICsgdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKSk7XHJcbiAgICAgICQod2luZG93KS51bmJpbmQoJ3BvcHN0YXRlLicgKyB0aGlzLmFwcC5ldmVudE5hbWVzcGFjZSgpKTtcclxuICAgICAgJChkb2N1bWVudCkudW5kZWxlZ2F0ZSgnYScsICdjbGljay5oaXN0b3J5LScgKyB0aGlzLmFwcC5ldmVudE5hbWVzcGFjZSgpKTtcclxuICAgICAgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2JpbmRpbmdzLS07XHJcbiAgICAgIGlmIChTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5fYmluZGluZ3MgPD0gMCkge1xyXG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5Ll9pbnRlcnZhbCk7XHJcbiAgICAgICAgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2ludGVydmFsID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyBnZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gZnJvbSB0aGUgaGFzaC5cclxuICAgIGdldExvY2F0aW9uOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5LmZ1bGxQYXRoKHdpbmRvdy5sb2NhdGlvbik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHNldCB0aGUgY3VycmVudCBsb2NhdGlvbiB0byBgbmV3X2xvY2F0aW9uYFxyXG4gICAgc2V0TG9jYXRpb246IGZ1bmN0aW9uKG5ld19sb2NhdGlvbikge1xyXG4gICAgICBpZiAoL14oW14jXFwvXXwkKS8udGVzdChuZXdfbG9jYXRpb24pKSB7IC8vIG5vbi1wcmVmaXhlZCB1cmxcclxuICAgICAgICBpZiAoX2hhc19oaXN0b3J5ICYmICF0aGlzLmFwcC5kaXNhYmxlX3B1c2hfc3RhdGUpIHtcclxuICAgICAgICAgIG5ld19sb2NhdGlvbiA9ICcvJyArIG5ld19sb2NhdGlvbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbmV3X2xvY2F0aW9uID0gJyMhLycgKyBuZXdfbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChuZXdfbG9jYXRpb24gIT0gdGhpcy5nZXRMb2NhdGlvbigpKSB7XHJcbiAgICAgICAgLy8gSFRNTDUgSGlzdG9yeSBleGlzdHMgYW5kIG5ld19sb2NhdGlvbiBpcyBhIGZ1bGwgcGF0aFxyXG4gICAgICAgIGlmIChfaGFzX2hpc3RvcnkgJiYgIXRoaXMuYXBwLmRpc2FibGVfcHVzaF9zdGF0ZSAmJiAvXlxcLy8udGVzdChuZXdfbG9jYXRpb24pKSB7XHJcbiAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IHBhdGg6IG5ld19sb2NhdGlvbiB9LCB3aW5kb3cudGl0bGUsIG5ld19sb2NhdGlvbik7XHJcbiAgICAgICAgICB0aGlzLmFwcC50cmlnZ2VyKCdsb2NhdGlvbi1jaGFuZ2VkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAod2luZG93LmxvY2F0aW9uID0gbmV3X2xvY2F0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgX3N0YXJ0UG9sbGluZzogZnVuY3Rpb24oZXZlcnkpIHtcclxuICAgICAgLy8gc2V0IHVwIGludGVydmFsXHJcbiAgICAgIHZhciBwcm94eSA9IHRoaXM7XHJcbiAgICAgIGlmICghU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2ludGVydmFsKSB7XHJcbiAgICAgICAgaWYgKCFldmVyeSkgeyBldmVyeSA9IDEwOyB9XHJcbiAgICAgICAgdmFyIGhhc2hDaGVjayA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgdmFyIGN1cnJlbnRfbG9jYXRpb24gPSBwcm94eS5nZXRMb2NhdGlvbigpO1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5fbGFzdF9sb2NhdGlvbiA9PSAndW5kZWZpbmVkJyB8fFxyXG4gICAgICAgICAgICBjdXJyZW50X2xvY2F0aW9uICE9IFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5Ll9sYXN0X2xvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICQod2luZG93KS50cmlnZ2VyKCdoYXNoY2hhbmdlJywgW3RydWVdKTtcclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5fbGFzdF9sb2NhdGlvbiA9IGN1cnJlbnRfbG9jYXRpb247XHJcbiAgICAgICAgfTtcclxuICAgICAgICBoYXNoQ2hlY2soKTtcclxuICAgICAgICBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5faW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoaGFzaENoZWNrLCBldmVyeSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcblxyXG4gIC8vIFNhbW15LkFwcGxpY2F0aW9uIGlzIHRoZSBCYXNlIHByb3RvdHlwZSBmb3IgZGVmaW5pbmcgJ2FwcGxpY2F0aW9ucycuXHJcbiAgLy8gQW4gJ2FwcGxpY2F0aW9uJyBpcyBhIGNvbGxlY3Rpb24gb2YgJ3JvdXRlcycgYW5kIGJvdW5kIGV2ZW50cyB0aGF0IGlzXHJcbiAgLy8gYXR0YWNoZWQgdG8gYW4gZWxlbWVudCB3aGVuIGBydW4oKWAgaXMgY2FsbGVkLlxyXG4gIC8vIFRoZSBvbmx5IGFyZ3VtZW50IGFuICdhcHBfZnVuY3Rpb24nIGlzIGV2YWx1YXRlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uLlxyXG4gIFNhbW15LkFwcGxpY2F0aW9uID0gZnVuY3Rpb24oYXBwX2Z1bmN0aW9uKSB7XHJcbiAgICB2YXIgYXBwID0gdGhpcztcclxuICAgIHRoaXMucm91dGVzICAgICAgICAgICAgPSB7fTtcclxuICAgIHRoaXMubGlzdGVuZXJzICAgICAgICAgPSBuZXcgU2FtbXkuT2JqZWN0KHt9KTtcclxuICAgIHRoaXMuYXJvdW5kcyAgICAgICAgICAgPSBbXTtcclxuICAgIHRoaXMuYmVmb3JlcyAgICAgICAgICAgPSBbXTtcclxuICAgIC8vIGdlbmVyYXRlIGEgdW5pcXVlIG5hbWVzcGFjZVxyXG4gICAgdGhpcy5uYW1lc3BhY2UgICAgICAgICA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgKyAnLScgKyBwYXJzZUludChNYXRoLnJhbmRvbSgpICogMTAwMCwgMTApO1xyXG4gICAgdGhpcy5jb250ZXh0X3Byb3RvdHlwZSA9IGZ1bmN0aW9uKCkgeyBTYW1teS5FdmVudENvbnRleHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcclxuICAgIHRoaXMuY29udGV4dF9wcm90b3R5cGUucHJvdG90eXBlID0gbmV3IFNhbW15LkV2ZW50Q29udGV4dCgpO1xyXG5cclxuICAgIGlmIChfaXNGdW5jdGlvbihhcHBfZnVuY3Rpb24pKSB7XHJcbiAgICAgIGFwcF9mdW5jdGlvbi5hcHBseSh0aGlzLCBbdGhpc10pO1xyXG4gICAgfVxyXG4gICAgLy8gc2V0IHRoZSBsb2NhdGlvbiBwcm94eSBpZiBub3QgZGVmaW5lZCB0byB0aGUgZGVmYXVsdCAoRGVmYXVsdExvY2F0aW9uUHJveHkpXHJcbiAgICBpZiAoIXRoaXMuX2xvY2F0aW9uX3Byb3h5KSB7XHJcbiAgICAgIHRoaXMuc2V0TG9jYXRpb25Qcm94eShuZXcgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkodGhpcywgdGhpcy5ydW5faW50ZXJ2YWxfZXZlcnkpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIHRoaXMuYmluZFRvQWxsRXZlbnRzKGZ1bmN0aW9uKGUsIGRhdGEpIHtcclxuICAgICAgICBhcHAubG9nKGFwcC50b1N0cmluZygpLCBlLmNsZWFuZWRfdHlwZSwgZGF0YSB8fCB7fSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIFNhbW15LkFwcGxpY2F0aW9uLnByb3RvdHlwZSA9ICQuZXh0ZW5kKHt9LCBTYW1teS5PYmplY3QucHJvdG90eXBlLCB7XHJcblxyXG4gICAgLy8gdGhlIGZvdXIgcm91dGUgdmVyYnNcclxuICAgIFJPVVRFX1ZFUkJTOiBbJ2dldCcsJ3Bvc3QnLCdwdXQnLCdkZWxldGUnXSxcclxuXHJcbiAgICAvLyBBbiBhcnJheSBvZiB0aGUgZGVmYXVsdCBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoZVxyXG4gICAgLy8gYXBwbGljYXRpb24gZHVyaW5nIGl0cyBsaWZlY3ljbGVcclxuICAgIEFQUF9FVkVOVFM6IFsncnVuJywgJ3VubG9hZCcsICdsb29rdXAtcm91dGUnLCAncnVuLXJvdXRlJywgJ3JvdXRlLWZvdW5kJywgJ2V2ZW50LWNvbnRleHQtYmVmb3JlJywgJ2V2ZW50LWNvbnRleHQtYWZ0ZXInLCAnY2hhbmdlZCcsICdlcnJvcicsICdjaGVjay1mb3JtLXN1Ym1pc3Npb24nLCAncmVkaXJlY3QnLCAnbG9jYXRpb24tY2hhbmdlZCddLFxyXG5cclxuICAgIF9sYXN0X3JvdXRlOiBudWxsLFxyXG4gICAgX2xvY2F0aW9uX3Byb3h5OiBudWxsLFxyXG4gICAgX3J1bm5pbmc6IGZhbHNlLFxyXG5cclxuICAgIC8vIERlZmluZXMgd2hhdCBlbGVtZW50IHRoZSBhcHBsaWNhdGlvbiBpcyBib3VuZCB0by4gUHJvdmlkZSBhIHNlbGVjdG9yXHJcbiAgICAvLyAocGFyc2VhYmxlIGJ5IGBqUXVlcnkoKWApIGFuZCB0aGlzIHdpbGwgYmUgdXNlZCBieSBgJGVsZW1lbnQoKWBcclxuICAgIGVsZW1lbnRfc2VsZWN0b3I6ICdib2R5JyxcclxuXHJcbiAgICAvLyBXaGVuIHNldCB0byB0cnVlLCBsb2dzIGFsbCBvZiB0aGUgZGVmYXVsdCBldmVudHMgdXNpbmcgYGxvZygpYFxyXG4gICAgZGVidWc6IGZhbHNlLFxyXG5cclxuICAgIC8vIFdoZW4gc2V0IHRvIHRydWUsIGFuZCB0aGUgZXJyb3IoKSBoYW5kbGVyIGlzIG5vdCBvdmVycmlkZGVuLCB3aWxsIGFjdHVhbGx5XHJcbiAgICAvLyByYWlzZSBKUyBlcnJvcnMgaW4gcm91dGVzICg1MDApIGFuZCB3aGVuIHJvdXRlcyBjYW4ndCBiZSBmb3VuZCAoNDA0KVxyXG4gICAgcmFpc2VfZXJyb3JzOiBmYWxzZSxcclxuXHJcbiAgICAvLyBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCB0aGUgVVJMIGlzIHF1ZXJpZWQgZm9yIGNoYW5nZXNcclxuICAgIHJ1bl9pbnRlcnZhbF9ldmVyeTogNTAsXHJcblxyXG4gICAgLy8gaWYgdXNpbmcgdGhlIGBEZWZhdWx0TG9jYXRpb25Qcm94eWAgc2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCBmb3JjZSB0aGUgYXBwIHRvIHVzZVxyXG4gICAgLy8gdHJhZGl0aW9uYWwgaGFzaCBiYXNlZCByb3V0aW5nIGFzIG9wcG9zZWQgdG8gdGhlIG5ldyBIVE1MNSBQdXNoU3RhdGUgc3VwcG9ydFxyXG4gICAgZGlzYWJsZV9wdXNoX3N0YXRlOiBmYWxzZSxcclxuXHJcbiAgICAvLyBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSBlbmdpbmUgdG8gdXNlIHdoZW4gdXNpbmcgYHBhcnRpYWwoKWAgaW4gYW5cclxuICAgIC8vIGBFdmVudENvbnRleHRgLiBgdGVtcGxhdGVfZW5naW5lYCBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIHRoYXRcclxuICAgIC8vIGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIG9mIGEgbWV0aG9kL2hlbHBlciBvbiBFdmVudENvbnRleHQgb3IgaXQgY2FuIGJlIGEgZnVuY3Rpb25cclxuICAgIC8vIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cywgdGhlIGNvbnRlbnQgb2YgdGhlIHVucmVuZGVyZWQgcGFydGlhbCBhbmQgYW4gb3B0aW9uYWxcclxuICAgIC8vIEpTIG9iamVjdCB0aGF0IGNvbnRhaW5zIGludGVycG9sYXRpb24gZGF0YS4gVGVtcGxhdGUgZW5naW5lIGlzIG9ubHkgY2FsbGVkL3JlZmVycmVkXHJcbiAgICAvLyB0byBpZiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBwYXJ0aWFsIGlzIG51bGwgb3IgdW5rbm93bi4gU2VlIGBwYXJ0aWFsKClgXHJcbiAgICAvLyBmb3IgbW9yZSBpbmZvcm1hdGlvblxyXG4gICAgdGVtcGxhdGVfZW5naW5lOiBudWxsLFxyXG5cclxuICAgIC8vIC8vPT4gU2FtbXkuQXBwbGljYXRpb246IGJvZHlcclxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuICdTYW1teS5BcHBsaWNhdGlvbjonICsgdGhpcy5lbGVtZW50X3NlbGVjdG9yO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyByZXR1cm5zIGEgalF1ZXJ5IG9iamVjdCBvZiB0aGUgQXBwbGljYXRpb25zIGJvdW5kIGVsZW1lbnQuXHJcbiAgICAkZWxlbWVudDogZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdG9yID8gJCh0aGlzLmVsZW1lbnRfc2VsZWN0b3IpLmZpbmQoc2VsZWN0b3IpIDogJCh0aGlzLmVsZW1lbnRfc2VsZWN0b3IpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBgdXNlKClgIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgaW5jbHVkaW5nIFNhbW15IHBsdWdpbnMuXHJcbiAgICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdXNlIHNob3VsZCBiZSBhIGZ1bmN0aW9uKCkgdGhhdCBpcyBldmFsdWF0ZWRcclxuICAgIC8vIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLCBqdXN0IGxpa2UgdGhlIGBhcHBfZnVuY3Rpb25gXHJcbiAgICAvLyBhcmd1bWVudCB0byB0aGUgYFNhbW15LkFwcGxpY2F0aW9uYCBjb25zdHJ1Y3Rvci5cclxuICAgIC8vXHJcbiAgICAvLyBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgYXBwIGZ1bmN0aW9uIHNlcXVlbnRpYWxseS5cclxuICAgIC8vXHJcbiAgICAvLyBGb3IgbXVjaCBtb3JlIGRldGFpbCBhYm91dCBwbHVnaW5zLCBjaGVjayBvdXQ6XHJcbiAgICAvLyBbaHR0cDovL3NhbW15anMub3JnL2RvY3MvcGx1Z2luc10oaHR0cDovL3NhbW15anMub3JnL2RvY3MvcGx1Z2lucylcclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdmFyIE15UGx1Z2luID0gZnVuY3Rpb24oYXBwLCBwcmVwZW5kKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHRoaXMuaGVscGVycyh7XHJcbiAgICAvLyAgICAgICAgICBteWhlbHBlcjogZnVuY3Rpb24odGV4dCkge1xyXG4gICAgLy8gICAgICAgICAgICBhbGVydChwcmVwZW5kICsgXCIgXCIgKyB0ZXh0KTtcclxuICAgIC8vICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIH07XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB2YXIgYXBwID0gJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy51c2UoTXlQbHVnaW4sICdUaGlzIGlzIG15IHBsdWdpbicpO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB0aGlzLmdldCgnIy8nLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgIHRoaXMubXloZWxwZXIoJ2FuZCBkb250IHlvdSBmb3JnZXQgaXQhJyk7XHJcbiAgICAvLyAgICAgICAgICAvLz0+IEFsZXJ0czogVGhpcyBpcyBteSBwbHVnaW4gYW5kIGRvbnQgeW91IGZvcmdldCBpdCFcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vIElmIHBsdWdpbiBpcyBwYXNzZWQgYXMgYSBzdHJpbmcgaXQgYXNzdW1lcyB5b3VyIGFyZSB0cnlpbmcgdG8gbG9hZFxyXG4gICAgLy8gU2FtbXkuXCJQbHVnaW5cIi4gVGhpcyBpcyB0aGUgcHJlZmVycmVkIHdheSBvZiBsb2FkaW5nIGNvcmUgU2FtbXkgcGx1Z2luc1xyXG4gICAgLy8gYXMgaXQgYWxsb3dzIGZvciBiZXR0ZXIgZXJyb3ItbWVzc2FnaW5nLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAkLnNhbW15KGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgIHRoaXMudXNlKCdNdXN0YWNoZScpOyAvLz0+IFNhbW15Lk11c3RhY2hlXHJcbiAgICAvLyAgICAgICAgdGhpcy51c2UoJ1N0b3JhZ2UnKTsgLy89PiBTYW1teS5TdG9yYWdlXHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIHVzZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIC8vIGZsYXR0ZW4gdGhlIGFyZ3VtZW50c1xyXG4gICAgICB2YXIgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKSxcclxuICAgICAgICAgIHBsdWdpbiA9IGFyZ3Muc2hpZnQoKSxcclxuICAgICAgICAgIHBsdWdpbl9uYW1lID0gcGx1Z2luIHx8ICcnO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcclxuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbiA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgcGx1Z2luX25hbWUgPSAnU2FtbXkuJyArIHBsdWdpbjtcclxuICAgICAgICAgIHBsdWdpbiA9IFNhbW15W3BsdWdpbl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBsdWdpbi5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICB0aGlzLmVycm9yKFwiUGx1Z2luIEVycm9yOiBjYWxsZWQgdXNlKCkgYnV0IHBsdWdpbiAoXCIgKyBwbHVnaW5fbmFtZS50b1N0cmluZygpICsgXCIpIGlzIG5vdCBkZWZpbmVkXCIsIGUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIV9pc0Z1bmN0aW9uKHBsdWdpbikpIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3IoXCJQbHVnaW4gRXJyb3I6IGNhbGxlZCB1c2UoKSBidXQgJ1wiICsgcGx1Z2luX25hbWUudG9TdHJpbmcoKSArIFwiJyBpcyBub3QgYSBmdW5jdGlvblwiLCBlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5lcnJvcihcIlBsdWdpbiBFcnJvclwiLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFNldHMgdGhlIGxvY2F0aW9uIHByb3h5IGZvciB0aGUgY3VycmVudCBhcHAuIEJ5IGRlZmF1bHQgdGhpcyBpcyBzZXQgdG9cclxuICAgIC8vIGEgbmV3IGBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eWAgb24gaW5pdGlhbGl6YXRpb24uIEhvd2V2ZXIsIHlvdSBjYW4gc2V0XHJcbiAgICAvLyB0aGUgbG9jYXRpb25fcHJveHkgaW5zaWRlIHlvdSdyZSBhcHAgZnVuY3Rpb24gdG8gZ2l2ZSB5b3VyIGFwcCBhIGN1c3RvbVxyXG4gICAgLy8gbG9jYXRpb24gbWVjaGFuaXNtLiBTZWUgYFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5YCBhbmQgYFNhbW15LkRhdGFMb2NhdGlvblByb3h5YFxyXG4gICAgLy8gZm9yIGV4YW1wbGVzLlxyXG4gICAgLy9cclxuICAgIC8vIGBzZXRMb2NhdGlvblByb3h5KClgIHRha2VzIGFuIGluaXRpYWxpemVkIGxvY2F0aW9uIHByb3h5LlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIC8vIHRvIGJpbmQgdG8gZGF0YSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGhhc2g7XHJcbiAgICAvLyAgICAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICB0aGlzLnNldExvY2F0aW9uUHJveHkobmV3IFNhbW15LkRhdGFMb2NhdGlvblByb3h5KHRoaXMpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICBzZXRMb2NhdGlvblByb3h5OiBmdW5jdGlvbihuZXdfcHJveHkpIHtcclxuICAgICAgdmFyIG9yaWdpbmFsX3Byb3h5ID0gdGhpcy5fbG9jYXRpb25fcHJveHk7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uX3Byb3h5ID0gbmV3X3Byb3h5O1xyXG4gICAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xyXG4gICAgICAgIGlmIChvcmlnaW5hbF9wcm94eSkge1xyXG4gICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGxvY2F0aW9uIHByb3h5LCB1bmJpbmQgaXQuXHJcbiAgICAgICAgICBvcmlnaW5hbF9wcm94eS51bmJpbmQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbG9jYXRpb25fcHJveHkuYmluZCgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHByb3ZpZGUgbG9nKCkgb3ZlcnJpZGUgZm9yIGluc2lkZSBhbiBhcHAgdGhhdCBpbmNsdWRlcyB0aGUgcmVsZXZhbnQgYXBwbGljYXRpb24gZWxlbWVudF9zZWxlY3RvclxyXG4gICAgbG9nOiBmdW5jdGlvbigpIHtcclxuICAgICAgU2FtbXkubG9nLmFwcGx5KFNhbW15LCBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFt0aGlzLmVsZW1lbnRfc2VsZWN0b3JdLGFyZ3VtZW50cykpO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLy8gYHJvdXRlKClgIGlzIHRoZSBtYWluIG1ldGhvZCBmb3IgZGVmaW5pbmcgcm91dGVzIHdpdGhpbiBhbiBhcHBsaWNhdGlvbi5cclxuICAgIC8vIEZvciBncmVhdCBkZXRhaWwgb24gcm91dGVzLCBjaGVjayBvdXQ6XHJcbiAgICAvLyBbaHR0cDovL3NhbW15anMub3JnL2RvY3Mvcm91dGVzXShodHRwOi8vc2FtbXlqcy5vcmcvZG9jcy9yb3V0ZXMpXHJcbiAgICAvL1xyXG4gICAgLy8gVGhpcyBtZXRob2QgYWxzbyBoYXMgYWxpYXNlcyBmb3IgZWFjaCBvZiB0aGUgZGlmZmVyZW50IHZlcmJzIChlZy4gYGdldCgpYCwgYHBvc3QoKWAsIGV0Yy4pXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYHZlcmJgIEEgU3RyaW5nIGluIHRoZSBzZXQgb2YgUk9VVEVfVkVSQlMgb3IgJ2FueScuICdhbnknIHdpbGwgYWRkIHJvdXRlcyBmb3IgZWFjaFxyXG4gICAgLy8gICAgb2YgdGhlIFJPVVRFX1ZFUkJTLiBJZiBvbmx5IHR3byBhcmd1bWVudHMgYXJlIHBhc3NlZCxcclxuICAgIC8vICAgIHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgcGF0aCwgdGhlIHNlY29uZCBpcyB0aGUgY2FsbGJhY2sgYW5kIHRoZSB2ZXJiXHJcbiAgICAvLyAgICBpcyBhc3N1bWVkIHRvIGJlICdhbnknLlxyXG4gICAgLy8gKiBgcGF0aGAgQSBSZWdleHAgb3IgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIG1hdGNoIHRvIGludm9rZSB0aGlzIHZlcmIuXHJcbiAgICAvLyAqIGBjYWxsYmFja2AgQSBGdW5jdGlvbiB0aGF0IGlzIGNhbGxlZC9ldmFsdWF0ZWQgd2hlbiB0aGUgcm91dGUgaXMgcnVuIHNlZTogYHJ1blJvdXRlKClgLlxyXG4gICAgLy8gICAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwYXNzIGEgc3RyaW5nIGFzIHRoZSBjYWxsYmFjaywgd2hpY2ggaXMgbG9va2VkIHVwIGFzIHRoZSBuYW1lXHJcbiAgICAvLyAgICBvZiBhIG1ldGhvZCBvbiB0aGUgYXBwbGljYXRpb24uXHJcbiAgICAvL1xyXG4gICAgcm91dGU6IGZ1bmN0aW9uKHZlcmIsIHBhdGgpIHtcclxuICAgICAgdmFyIGFwcCA9IHRoaXMsIHBhcmFtX25hbWVzID0gW10sIGFkZF9yb3V0ZSwgcGF0aF9tYXRjaCwgY2FsbGJhY2sgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBpcyBqdXN0IChwYXRoLCBjYWxsYmFjaylcclxuICAgICAgLy8gYXNzdW1lIHRoZSB2ZXJiIGlzICdhbnknXHJcbiAgICAgIGlmIChjYWxsYmFjay5sZW5ndGggPT09IDAgJiYgX2lzRnVuY3Rpb24ocGF0aCkpIHtcclxuICAgICAgICBjYWxsYmFjayA9IFtwYXRoXTtcclxuICAgICAgICBwYXRoID0gdmVyYjtcclxuICAgICAgICB2ZXJiID0gJ2FueSc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZlcmIgPSB2ZXJiLnRvTG93ZXJDYXNlKCk7IC8vIGVuc3VyZSB2ZXJiIGlzIGxvd2VyIGNhc2VcclxuXHJcbiAgICAgIC8vIGlmIHBhdGggaXMgYSBzdHJpbmcgdHVybiBpdCBpbnRvIGEgcmVnZXhcclxuICAgICAgaWYgKHBhdGguY29uc3RydWN0b3IgPT0gU3RyaW5nKSB7XHJcblxyXG4gICAgICAgIC8vIE5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgc2V0IGJlY2F1c2UgSUUgd2lsbCBtYWludGFpbiB0aGUgaW5kZXggdW5sZXNzIE5VTEwgaXMgcmV0dXJuZWQsXHJcbiAgICAgICAgLy8gd2hpY2ggbWVhbnMgdGhhdCB3aXRoIHR3byBjb25zZWN1dGl2ZSByb3V0ZXMgdGhhdCBjb250YWluIHBhcmFtcywgdGhlIHNlY29uZCBzZXQgb2YgcGFyYW1zIHdpbGwgbm90IGJlIGZvdW5kIGFuZCBlbmQgdXAgaW4gc3BsYXQgaW5zdGVhZCBvZiBwYXJhbXNcclxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9SZWdFeHAvbGFzdEluZGV4XHJcbiAgICAgICAgUEFUSF9OQU1FX01BVENIRVIubGFzdEluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgLy8gZmluZCB0aGUgbmFtZXNcclxuICAgICAgICB3aGlsZSAoKHBhdGhfbWF0Y2ggPSBQQVRIX05BTUVfTUFUQ0hFUi5leGVjKHBhdGgpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcGFyYW1fbmFtZXMucHVzaChwYXRoX21hdGNoWzFdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVwbGFjZSB3aXRoIHRoZSBwYXRoIHJlcGxhY2VtZW50XHJcbiAgICAgICAgcGF0aCA9IG5ldyBSZWdFeHAocGF0aC5yZXBsYWNlKFBBVEhfTkFNRV9NQVRDSEVSLCBQQVRIX1JFUExBQ0VSKSArIFwiJFwiKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBsb29rdXAgY2FsbGJhY2tzXHJcbiAgICAgICQuZWFjaChjYWxsYmFjayxmdW5jdGlvbihpLGNiKXtcclxuICAgICAgICBpZiAodHlwZW9mKGNiKSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNhbGxiYWNrW2ldID0gYXBwW2NiXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgYWRkX3JvdXRlID0gZnVuY3Rpb24od2l0aF92ZXJiKSB7XHJcbiAgICAgICAgdmFyIHIgPSB7dmVyYjogd2l0aF92ZXJiLCBwYXRoOiBwYXRoLCBjYWxsYmFjazogY2FsbGJhY2ssIHBhcmFtX25hbWVzOiBwYXJhbV9uYW1lc307XHJcbiAgICAgICAgLy8gYWRkIHJvdXRlIHRvIHJvdXRlcyBhcnJheVxyXG4gICAgICAgIGFwcC5yb3V0ZXNbd2l0aF92ZXJiXSA9IGFwcC5yb3V0ZXNbd2l0aF92ZXJiXSB8fCBbXTtcclxuICAgICAgICAvLyBwbGFjZSByb3V0ZXMgaW4gb3JkZXIgb2YgZGVmaW5pdGlvblxyXG4gICAgICAgIGFwcC5yb3V0ZXNbd2l0aF92ZXJiXS5wdXNoKHIpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKHZlcmIgPT09ICdhbnknKSB7XHJcbiAgICAgICAgJC5lYWNoKHRoaXMuUk9VVEVfVkVSQlMsIGZ1bmN0aW9uKGksIHYpIHsgYWRkX3JvdXRlKHYpOyB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhZGRfcm91dGUodmVyYik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJldHVybiB0aGUgYXBwXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBbGlhcyBmb3Igcm91dGUoJ2dldCcsIC4uLilcclxuICAgIGdldDogX3JvdXRlV3JhcHBlcignZ2V0JyksXHJcblxyXG4gICAgLy8gQWxpYXMgZm9yIHJvdXRlKCdwb3N0JywgLi4uKVxyXG4gICAgcG9zdDogX3JvdXRlV3JhcHBlcigncG9zdCcpLFxyXG5cclxuICAgIC8vIEFsaWFzIGZvciByb3V0ZSgncHV0JywgLi4uKVxyXG4gICAgcHV0OiBfcm91dGVXcmFwcGVyKCdwdXQnKSxcclxuXHJcbiAgICAvLyBBbGlhcyBmb3Igcm91dGUoJ2RlbGV0ZScsIC4uLilcclxuICAgIGRlbDogX3JvdXRlV3JhcHBlcignZGVsZXRlJyksXHJcblxyXG4gICAgLy8gQWxpYXMgZm9yIHJvdXRlKCdhbnknLCAuLi4pXHJcbiAgICBhbnk6IF9yb3V0ZVdyYXBwZXIoJ2FueScpLFxyXG5cclxuICAgIC8vIGBtYXBSb3V0ZXNgIHRha2VzIGFuIGFycmF5IG9mIGFycmF5cywgZWFjaCBhcnJheSBiZWluZyBwYXNzZWQgdG8gcm91dGUoKVxyXG4gICAgLy8gYXMgYXJndW1lbnRzLCB0aGlzIGFsbG93cyBmb3IgbWFzcyBkZWZpbml0aW9uIG9mIHJvdXRlcy4gQW5vdGhlciBiZW5lZml0IGlzXHJcbiAgICAvLyB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlL2Vhc2llciB0byBsb2FkIHJvdXRlcyB2aWEgcmVtb3RlIEpTT04uXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHZhciBhcHAgPSAkLnNhbW15KGZ1bmN0aW9uKCkge1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB0aGlzLm1hcFJvdXRlcyhbXHJcbiAgICAvLyAgICAgICAgICAgIFsnZ2V0JywgJyMvJywgZnVuY3Rpb24oKSB7IHRoaXMubG9nKCdpbmRleCcpOyB9XSxcclxuICAgIC8vICAgICAgICAgICAgLy8gc3RyaW5ncyBpbiBjYWxsYmFja3MgYXJlIGxvb2tlZCB1cCBhcyBtZXRob2RzIG9uIHRoZSBhcHBcclxuICAgIC8vICAgICAgICAgICAgWydwb3N0JywgJyMvY3JlYXRlJywgJ2FkZFVzZXInXSxcclxuICAgIC8vICAgICAgICAgICAgLy8gTm8gdmVyYiBhc3N1bWVzICdhbnknIGFzIHRoZSB2ZXJiXHJcbiAgICAvLyAgICAgICAgICAgIFsvZG93aGF0ZXZlci8sIGZ1bmN0aW9uKCkgeyB0aGlzLmxvZyh0aGlzLnZlcmIsIHRoaXMucGF0aCl9XTtcclxuICAgIC8vICAgICAgICAgIF0pO1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICBtYXBSb3V0ZXM6IGZ1bmN0aW9uKHJvdXRlX2FycmF5KSB7XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzO1xyXG4gICAgICAkLmVhY2gocm91dGVfYXJyYXksIGZ1bmN0aW9uKGksIHJvdXRlX2FyZ3MpIHtcclxuICAgICAgICBhcHAucm91dGUuYXBwbHkoYXBwLCByb3V0ZV9hcmdzKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBIHVuaXF1ZSBldmVudCBuYW1lc3BhY2UgZGVmaW5lZCBwZXIgYXBwbGljYXRpb24uXHJcbiAgICAvLyBBbGwgZXZlbnRzIGJvdW5kIHdpdGggYGJpbmQoKWAgYXJlIGF1dG9tYXRpY2FsbHkgYm91bmQgd2l0aGluIHRoaXMgc3BhY2UuXHJcbiAgICBldmVudE5hbWVzcGFjZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBbJ3NhbW15LWFwcCcsIHRoaXMubmFtZXNwYWNlXS5qb2luKCctJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFdvcmtzIGp1c3QgbGlrZSBgalF1ZXJ5LmZuLmJpbmQoKWAgd2l0aCBhIGNvdXBsZSBub3RhYmxlIGRpZmZlcmVuY2VzLlxyXG4gICAgLy9cclxuICAgIC8vICogSXQgYmluZHMgYWxsIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gZWxlbWVudFxyXG4gICAgLy8gKiBBbGwgZXZlbnRzIGFyZSBib3VuZCB3aXRoaW4gdGhlIGBldmVudE5hbWVzcGFjZSgpYFxyXG4gICAgLy8gKiBFdmVudHMgYXJlIG5vdCBhY3R1YWxseSBib3VuZCB1bnRpbCB0aGUgYXBwbGljYXRpb24gaXMgc3RhcnRlZCB3aXRoIGBydW4oKWBcclxuICAgIC8vICogY2FsbGJhY2tzIGFyZSBldmFsdWF0ZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgU2FtbXkuRXZlbnRDb250ZXh0XHJcbiAgICAvL1xyXG4gICAgYmluZDogZnVuY3Rpb24obmFtZSwgZGF0YSwgY2FsbGJhY2spIHtcclxuICAgICAgdmFyIGFwcCA9IHRoaXM7XHJcbiAgICAgIC8vIGJ1aWxkIHRoZSBjYWxsYmFja1xyXG4gICAgICAvLyBpZiB0aGUgYXJpdHkgaXMgMiwgY2FsbGJhY2sgaXMgdGhlIHNlY29uZCBhcmd1bWVudFxyXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09ICd1bmRlZmluZWQnKSB7IGNhbGxiYWNrID0gZGF0YTsgfVxyXG4gICAgICB2YXIgbGlzdGVuZXJfY2FsbGJhY2sgPSAgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgLy8gcHVsbCBvZmYgdGhlIGNvbnRleHQgZnJvbSB0aGUgYXJndW1lbnRzIHRvIHRoZSBjYWxsYmFja1xyXG4gICAgICAgIHZhciBlLCBjb250ZXh0LCBkYXRhO1xyXG4gICAgICAgIGUgICAgICAgPSBhcmd1bWVudHNbMF07XHJcbiAgICAgICAgZGF0YSAgICA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmNvbnRleHQpIHtcclxuICAgICAgICAgIGNvbnRleHQgPSBkYXRhLmNvbnRleHQ7XHJcbiAgICAgICAgICBkZWxldGUgZGF0YS5jb250ZXh0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb250ZXh0ID0gbmV3IGFwcC5jb250ZXh0X3Byb3RvdHlwZShhcHAsICdiaW5kJywgZS50eXBlLCBkYXRhLCBlLnRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGUuY2xlYW5lZF90eXBlID0gZS50eXBlLnJlcGxhY2UoYXBwLmV2ZW50TmFtZXNwYWNlKCksICcnKTtcclxuICAgICAgICBjYWxsYmFjay5hcHBseShjb250ZXh0LCBbZSwgZGF0YV0pO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gaXQgY291bGQgYmUgdGhhdCB0aGUgYXBwIGVsZW1lbnQgZG9lc250IGV4aXN0IHlldFxyXG4gICAgICAvLyBzbyBhdHRhY2ggdG8gdGhlIGxpc3RlbmVycyBhcnJheSBhbmQgdGhlbiBydW4oKVxyXG4gICAgICAvLyB3aWxsIGFjdHVhbGx5IGJpbmQgdGhlIGV2ZW50LlxyXG4gICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW25hbWVdKSB7IHRoaXMubGlzdGVuZXJzW25hbWVdID0gW107IH1cclxuICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZV0ucHVzaChsaXN0ZW5lcl9jYWxsYmFjayk7XHJcbiAgICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIGFwcCBpcyBydW5uaW5nXHJcbiAgICAgICAgLy8gKmFjdHVhbGx5KiBiaW5kIHRoZSBldmVudCB0byB0aGUgYXBwIGVsZW1lbnRcclxuICAgICAgICB0aGlzLl9saXN0ZW4obmFtZSwgbGlzdGVuZXJfY2FsbGJhY2spO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBUcmlnZ2VycyBjdXN0b20gZXZlbnRzIGRlZmluZWQgd2l0aCBgYmluZCgpYFxyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGBuYW1lYCBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuIEF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aCB0aGUgYGV2ZW50TmFtZXNwYWNlKClgXHJcbiAgICAvLyAqIGBkYXRhYCBBbiBvcHRpb25hbCBPYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBib3VuZCBjYWxsYmFjay5cclxuICAgIC8vICogYGNvbnRleHRgIEFuIG9wdGlvbmFsIGNvbnRleHQvT2JqZWN0IGluIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIGJvdW5kIGNhbGxiYWNrLlxyXG4gICAgLy8gICBJZiBubyBjb250ZXh0IGlzIHN1cHBsaWVkIGEgdGhlIGNvbnRleHQgaXMgYSBuZXcgYFNhbW15LkV2ZW50Q29udGV4dGBcclxuICAgIC8vXHJcbiAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lLCBkYXRhKSB7XHJcbiAgICAgIHRoaXMuJGVsZW1lbnQoKS50cmlnZ2VyKFtuYW1lLCB0aGlzLmV2ZW50TmFtZXNwYWNlKCldLmpvaW4oJy4nKSwgW2RhdGFdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJlcnVucyB0aGUgY3VycmVudCByb3V0ZVxyXG4gICAgcmVmcmVzaDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHRoaXMubGFzdF9sb2NhdGlvbiA9IG51bGw7XHJcbiAgICAgIHRoaXMudHJpZ2dlcignbG9jYXRpb24tY2hhbmdlZCcpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gVGFrZXMgYSBzaW5nbGUgY2FsbGJhY2sgdGhhdCBpcyBwdXNoZWQgb24gdG8gYSBzdGFjay5cclxuICAgIC8vIEJlZm9yZSBhbnkgcm91dGUgaXMgcnVuLCB0aGUgY2FsbGJhY2tzIGFyZSBldmFsdWF0ZWQgaW4gb3JkZXIgd2l0aGluXHJcbiAgICAvLyB0aGUgY3VycmVudCBgU2FtbXkuRXZlbnRDb250ZXh0YFxyXG4gICAgLy9cclxuICAgIC8vIElmIGFueSBvZiB0aGUgY2FsbGJhY2tzIGV4cGxpY2l0bHkgcmV0dXJuIGZhbHNlLCBleGVjdXRpb24gb2YgYW55XHJcbiAgICAvLyBmdXJ0aGVyIGNhbGxiYWNrcyBhbmQgdGhlIHJvdXRlIGl0c2VsZiBpcyBoYWx0ZWQuXHJcbiAgICAvL1xyXG4gICAgLy8gWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzZXQgb2Ygb3B0aW9ucyB0aGF0IHdpbGwgZGVmaW5lIHdoZW4gdG8gcnVuIHRoaXNcclxuICAgIC8vIGJlZm9yZSBiYXNlZCBvbiB0aGUgcm91dGUgaXQgcHJvY2VlZHMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHZhciBhcHAgPSAkLnNhbW15KGZ1bmN0aW9uKCkge1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICAvLyB3aWxsIHJ1biBhdCAjL3JvdXRlIGJ1dCBub3QgYXQgIy9cclxuICAgIC8vICAgICAgICB0aGlzLmJlZm9yZSgnIy9yb3V0ZScsIGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICAgLy8uLi5cclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgLy8gd2lsbCBydW4gYXQgIy8gYnV0IG5vdCBhdCAjL3JvdXRlXHJcbiAgICAvLyAgICAgICAgdGhpcy5iZWZvcmUoe2V4Y2VwdDoge3BhdGg6ICcjL3JvdXRlJ319LCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgIHRoaXMubG9nKCdub3QgYmVmb3JlICMvcm91dGUnKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7fSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHRoaXMuZ2V0KCcjL3JvdXRlJywgZnVuY3Rpb24oKSB7fSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyBTZWUgYGNvbnRleHRNYXRjaGVzT3B0aW9ucygpYCBmb3IgYSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIG9wdGlvbnNcclxuICAgIC8vXHJcbiAgICBiZWZvcmU6IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XHJcbiAgICAgIGlmIChfaXNGdW5jdGlvbihvcHRpb25zKSkge1xyXG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcclxuICAgICAgICBvcHRpb25zID0ge307XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5iZWZvcmVzLnB1c2goW29wdGlvbnMsIGNhbGxiYWNrXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBIHNob3J0Y3V0IGZvciBiaW5kaW5nIGEgY2FsbGJhY2sgdG8gYmUgcnVuIGFmdGVyIGEgcm91dGUgaXMgZXhlY3V0ZWQuXHJcbiAgICAvLyBBZnRlciBjYWxsYmFja3MgaGF2ZSBubyBndWFydW50ZWVkIG9yZGVyLlxyXG4gICAgYWZ0ZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmJpbmQoJ2V2ZW50LWNvbnRleHQtYWZ0ZXInLCBjYWxsYmFjayk7XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICAvLyBBZGRzIGFuIGFyb3VuZCBmaWx0ZXIgdG8gdGhlIGFwcGxpY2F0aW9uLiBhcm91bmQgZmlsdGVycyBhcmUgZnVuY3Rpb25zXHJcbiAgICAvLyB0aGF0IHRha2UgYSBzaW5nbGUgYXJndW1lbnQgYGNhbGxiYWNrYCB3aGljaCBpcyB0aGUgZW50aXJlIHJvdXRlXHJcbiAgICAvLyBleGVjdXRpb24gcGF0aCB3cmFwcGVkIHVwIGluIGEgY2xvc3VyZS4gVGhpcyBtZWFucyB5b3UgY2FuIGRlY2lkZSB3aGV0aGVyXHJcbiAgICAvLyBvciBub3QgdG8gcHJvY2VlZCB3aXRoIGV4ZWN1dGlvbiBieSBub3QgaW52b2tpbmcgYGNhbGxiYWNrYCBvcixcclxuICAgIC8vIG1vcmUgdXNlZnVsbHkgd3JhcHBpbmcgY2FsbGJhY2sgaW5zaWRlIHRoZSByZXN1bHQgb2YgYW4gYXN5bmNocm9ub3VzIGV4ZWN1dGlvbi5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vIFRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgYXJvdW5kKCkgaXMgY2FsbGluZyBhIF9wb3NzaWJseV8gYXN5bmMgZnVuY3Rpb25cclxuICAgIC8vIGFuZCBleGVjdXRpbmcgdGhlIHJvdXRlIHdpdGhpbiB0aGUgZnVuY3Rpb25zIGNhbGxiYWNrOlxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHZhciBjdXJyZW50X3VzZXIgPSBmYWxzZTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgZnVuY3Rpb24gY2hlY2tMb2dnZWRJbihjYWxsYmFjaykge1xyXG4gICAgLy8gICAgICAgICAgLy8gL3Nlc3Npb24gcmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGxvZ2dlZCBpbiB1c2VyXHJcbiAgICAvLyAgICAgICAgICAvLyBvciBhbiBlbXB0eSBvYmplY3RcclxuICAgIC8vICAgICAgICAgIGlmICghY3VycmVudF91c2VyKSB7XHJcbiAgICAvLyAgICAgICAgICAgICQuZ2V0SlNPTignL3Nlc3Npb24nLCBmdW5jdGlvbihqc29uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgaWYgKGpzb24ubG9naW4pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIHVzZXIgYXMgbG9nZ2VkIGluXHJcbiAgICAvLyAgICAgICAgICAgICAgICBjdXJyZW50X3VzZXIgPSBqc29uO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgcm91dGUgcGF0aFxyXG4gICAgLy8gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIC8vICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gc2hvdyB0aGUgdXNlciBhcyBub3QgbG9nZ2VkIGluXHJcbiAgICAvLyAgICAgICAgICAgICAgICBjdXJyZW50X3VzZXIgPSBmYWxzZTtcclxuICAgIC8vICAgICAgICAgICAgICAgIC8vIHRoZSBjb250ZXh0IG9mIGFyb3VuZEZpbHRlcnMgaXMgYW4gRXZlbnRDb250ZXh0XHJcbiAgICAvLyAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0KCcjL2xvZ2luJyk7XHJcbiAgICAvLyAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHJvdXRlIHBhdGhcclxuICAgIC8vICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIC8vICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICB9O1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB0aGlzLmFyb3VuZChjaGVja0xvZ2dlZEluKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIGFyb3VuZDogZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgdGhpcy5hcm91bmRzLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQWRkcyBhIG9uQ29tcGxldGUgZnVuY3Rpb24gdG8gdGhlIGFwcGxpY2F0aW9uLiBvbkNvbXBsZXRlIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWRcclxuICAgIC8vIGF0IHRoZSBlbmQgb2YgYSBjaGFpbiBvZiByb3V0ZSBjYWxsYmFja3MsIGlmIHRoZXkgY2FsbCBuZXh0KCkuIFVubGlrZSBhZnRlcixcclxuICAgIC8vIHdoaWNoIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSByb3V0ZSBpcyBjb21wbGV0ZSwgb25Db21wbGV0ZSBpcyBsaWtlIGEgZmluYWwgbmV4dCgpXHJcbiAgICAvLyBmb3IgYWxsIHJvdXRlcywgYW5kIGlzIHRodXMgcnVuIGFzeW5jaHJvbm91c2x5XHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIGFwcC5nZXQoJy9jaGFpbicsZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICBjb25zb2xlLmxvZygnY2hhaW4xJyk7XHJcbiAgICAvLyAgICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0sZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICBjb25zb2xlLmxvZygnY2hhaW4yJyk7XHJcbiAgICAvLyAgICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgYXBwLmdldCgnL2xpbmsnLGZ1bmN0aW9uKGNvbnRleHQsbmV4dCkge1xyXG4gICAgLy8gICAgICAgICAgY29uc29sZS5sb2coJ2xpbmsxJyk7XHJcbiAgICAvLyAgICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0sZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICBjb25zb2xlLmxvZygnbGluazInKTtcclxuICAgIC8vICAgICAgICAgIG5leHQoKTtcclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICBhcHAub25Db21wbGV0ZShmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgIGNvbnNvbGUubG9nKFwiUnVubmluZyBmaW5hbGx5XCIpO1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyBJZiB5b3UgZ28gdG8gJy9jaGFpbicsIHlvdSB3aWxsIGdldCB0aGUgZm9sbG93aW5nIG1lc3NhZ2VzOlxyXG4gICAgLy9cclxuICAgIC8vICAgICAgY2hhaW4xXHJcbiAgICAvLyAgICAgIGNoYWluMlxyXG4gICAgLy8gICAgICBSdW5uaW5nIG9uQ29tcGxldGVcclxuICAgIC8vXHJcbiAgICAvL1xyXG4gICAgLy8gSWYgeW91IGdvIHRvIC9saW5rLCB5b3Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyBtZXNzYWdlczpcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIGxpbmsxXHJcbiAgICAvLyAgICAgIGxpbmsyXHJcbiAgICAvLyAgICAgIFJ1bm5pbmcgb25Db21wbGV0ZVxyXG4gICAgLy9cclxuICAgIC8vXHJcbiAgICAvLyBJdCByZWFsbHkgY29tZXMgdG8gcGxheSB3aGVuIGRvaW5nIGFzeW5jaHJvbm91czpcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIGFwcC5nZXQoJy9jaGFpbicsZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgJC5nZXQoJy9teS91cmwnLGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICAgY29uc29sZS5sb2coJ2NoYWluMScpO1xyXG4gICAgLy8gICAgICAgICAgbmV4dCgpO1xyXG4gICAgLy8gICAgICAgIH0pO1xyXG4gICAgLy8gICAgICB9LGZ1bmN0aW9uKGNvbnRleHQsbmV4dCkge1xyXG4gICAgLy8gICAgICAgIGNvbnNvbGUubG9nKCdjaGFpbjInKTtcclxuICAgIC8vICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIHRoaXMuX29uQ29tcGxldGUgPSBjYWxsYmFjaztcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJldHVybnMgYHRydWVgIGlmIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuXHJcbiAgICBpc1J1bm5pbmc6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fcnVubmluZztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gSGVscGVycyBleHRlbmRzIHRoZSBFdmVudENvbnRleHQgcHJvdG90eXBlIHNwZWNpZmljIHRvIHRoaXMgYXBwLlxyXG4gICAgLy8gVGhpcyBhbGxvd3MgeW91IHRvIGRlZmluZSBhcHAgc3BlY2lmaWMgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkXHJcbiAgICAvLyB3aGVuZXZlciB5b3UncmUgaW5zaWRlIG9mIGFuIGV2ZW50IGNvbnRleHQgKHRlbXBsYXRlcywgcm91dGVzLCBiaW5kKS5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICB2YXIgYXBwID0gJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICBoZWxwZXJzKHtcclxuICAgIC8vICAgICAgICAgdXBjYXNlOiBmdW5jdGlvbih0ZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgIGdldCgnIy8nLCBmdW5jdGlvbigpIHsgd2l0aCh0aGlzKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIGluc2lkZSBvZiB0aGlzIGNvbnRleHQgSSBjYW4gdXNlIHRoZSBoZWxwZXJzXHJcbiAgICAvLyAgICAgICAgICQoJyNtYWluJykuaHRtbCh1cGNhc2UoJCgnI21haW4nKS50ZXh0KCkpO1xyXG4gICAgLy8gICAgICAgfX0pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYGV4dGVuc2lvbnNgIEFuIG9iamVjdCBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyB0byBleHRlbmQgdGhlIGNvbnRleHQuXHJcbiAgICAvL1xyXG4gICAgaGVscGVyczogZnVuY3Rpb24oZXh0ZW5zaW9ucykge1xyXG4gICAgICAkLmV4dGVuZCh0aGlzLmNvbnRleHRfcHJvdG90eXBlLnByb3RvdHlwZSwgZXh0ZW5zaW9ucyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBIZWxwZXIgZXh0ZW5kcyB0aGUgZXZlbnQgY29udGV4dCBqdXN0IGxpa2UgYGhlbHBlcnMoKWAgYnV0IGRvZXMgaXRcclxuICAgIC8vIGEgc2luZ2xlIG1ldGhvZCBhdCBhIHRpbWUuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIGR5bmFtaWNhbGx5IG5hbWVkXHJcbiAgICAvLyBoZWxwZXJzXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gVHJpdmlhbCBleGFtcGxlIHRoYXQgYWRkcyAzIGhlbHBlciBtZXRob2RzIHRvIHRoZSBjb250ZXh0IGR5bmFtaWNhbGx5XHJcbiAgICAvLyAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oYXBwKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgJC5lYWNoKFsxLDIsM10sIGZ1bmN0aW9uKGksIG51bSkge1xyXG4gICAgLy8gICAgICAgICBhcHAuaGVscGVyKCdoZWxwZXInICsgbnVtLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgICB0aGlzLmxvZyhcIkknbSBoZWxwZXIgbnVtYmVyIFwiICsgbnVtKTtcclxuICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICB0aGlzLmdldCgnIy8nLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5oZWxwZXIyKCk7IC8vPT4gSSdtIGhlbHBlciBudW1iZXIgMlxyXG4gICAgLy8gICAgICAgfSk7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYG5hbWVgIFRoZSBuYW1lIG9mIHRoZSBtZXRob2RcclxuICAgIC8vICogYG1ldGhvZGAgVGhlIGZ1bmN0aW9uIHRvIGJlIGFkZGVkIHRvIHRoZSBwcm90b3R5cGUgYXQgYG5hbWVgXHJcbiAgICAvL1xyXG4gICAgaGVscGVyOiBmdW5jdGlvbihuYW1lLCBtZXRob2QpIHtcclxuICAgICAgdGhpcy5jb250ZXh0X3Byb3RvdHlwZS5wcm90b3R5cGVbbmFtZV0gPSBtZXRob2Q7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBY3R1YWxseSBzdGFydHMgdGhlIGFwcGxpY2F0aW9uJ3MgbGlmZWN5Y2xlLiBgcnVuKClgIHNob3VsZCBiZSBpbnZva2VkXHJcbiAgICAvLyB3aXRoaW4gYSBkb2N1bWVudC5yZWFkeSBibG9jayB0byBlbnN1cmUgdGhlIERPTSBleGlzdHMgYmVmb3JlIGJpbmRpbmcgZXZlbnRzLCBldGMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7IC4uLiB9KTsgLy8geW91ciBhcHBsaWNhdGlvblxyXG4gICAgLy8gICAgICQoZnVuY3Rpb24oKSB7IC8vIGRvY3VtZW50LnJlYWR5XHJcbiAgICAvLyAgICAgICAgYXBwLnJ1bigpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGBzdGFydF91cmxgIE9wdGlvbmFsbHksIGEgU3RyaW5nIGNhbiBiZSBwYXNzZWQgd2hpY2ggdGhlIEFwcCB3aWxsIHJlZGlyZWN0IHRvXHJcbiAgICAvLyAgIGFmdGVyIHRoZSBldmVudHMvcm91dGVzIGhhdmUgYmVlbiBib3VuZC5cclxuICAgIHJ1bjogZnVuY3Rpb24oc3RhcnRfdXJsKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICB2YXIgYXBwID0gdGhpcztcclxuXHJcbiAgICAgIC8vIGFjdHVhbGx5IGJpbmQgYWxsIHRoZSBsaXN0ZW5lcnNcclxuICAgICAgJC5lYWNoKHRoaXMubGlzdGVuZXJzLnRvSGFzaCgpLCBmdW5jdGlvbihuYW1lLCBjYWxsYmFja3MpIHtcclxuICAgICAgICAkLmVhY2goY2FsbGJhY2tzLCBmdW5jdGlvbihpLCBsaXN0ZW5lcl9jYWxsYmFjaykge1xyXG4gICAgICAgICAgYXBwLl9saXN0ZW4obmFtZSwgbGlzdGVuZXJfY2FsbGJhY2spO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudHJpZ2dlcigncnVuJywge3N0YXJ0X3VybDogc3RhcnRfdXJsfSk7XHJcbiAgICAgIHRoaXMuX3J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAvLyBzZXQgbGFzdCBsb2NhdGlvblxyXG4gICAgICB0aGlzLmxhc3RfbG9jYXRpb24gPSBudWxsO1xyXG4gICAgICBpZiAoISgvXFwjKC4rKS8udGVzdCh0aGlzLmdldExvY2F0aW9uKCkpKSAmJiB0eXBlb2Ygc3RhcnRfdXJsICE9ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhpcy5zZXRMb2NhdGlvbihzdGFydF91cmwpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNoZWNrIHVybFxyXG4gICAgICB0aGlzLl9jaGVja0xvY2F0aW9uKCk7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uX3Byb3h5LmJpbmQoKTtcclxuICAgICAgdGhpcy5iaW5kKCdsb2NhdGlvbi1jaGFuZ2VkJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgYXBwLl9jaGVja0xvY2F0aW9uKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gYmluZCB0byBzdWJtaXQgdG8gY2FwdHVyZSBwb3N0L3B1dC9kZWxldGUgcm91dGVzXHJcbiAgICAgIHRoaXMuYmluZCgnc3VibWl0JywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGlmICggIVNhbW15LnRhcmdldElzVGhpc1dpbmRvdyhlLCAnZm9ybScpICkgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gICAgICAgIHZhciByZXR1cm5lZCA9IGFwcC5fY2hlY2tGb3JtU3VibWlzc2lvbigkKGUudGFyZ2V0KS5jbG9zZXN0KCdmb3JtJykpO1xyXG4gICAgICAgIHJldHVybiAocmV0dXJuZWQgPT09IGZhbHNlKSA/IGUucHJldmVudERlZmF1bHQoKSA6IGZhbHNlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIGJpbmQgdW5sb2FkIHRvIGJvZHkgdW5sb2FkXHJcbiAgICAgICQod2luZG93KS5iaW5kKCd1bmxvYWQnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBhcHAudW5sb2FkKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gdHJpZ2dlciBodG1sIGNoYW5nZWRcclxuICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcignY2hhbmdlZCcpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBUaGUgb3Bwb3NpdGUgb2YgYHJ1bigpYCwgdW4tYmluZHMgYWxsIGV2ZW50IGxpc3RlbmVycyBhbmQgaW50ZXJ2YWxzXHJcbiAgICAvLyBgcnVuKClgIEF1dG9tYXRpY2FsbHkgYmluZHMgYSBgb251bmxvYWRgIGV2ZW50IHRvIHJ1biB0aGlzIHdoZW5cclxuICAgIC8vIHRoZSBkb2N1bWVudCBpcyBjbG9zZWQuXHJcbiAgICB1bmxvYWQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKCkpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzO1xyXG4gICAgICB0aGlzLnRyaWdnZXIoJ3VubG9hZCcpO1xyXG4gICAgICAvLyBjbGVhciBpbnRlcnZhbFxyXG4gICAgICB0aGlzLl9sb2NhdGlvbl9wcm94eS51bmJpbmQoKTtcclxuICAgICAgLy8gdW5iaW5kIGZvcm0gc3VibWl0c1xyXG4gICAgICB0aGlzLiRlbGVtZW50KCkudW5iaW5kKCdzdWJtaXQnKS5yZW1vdmVDbGFzcyhhcHAuZXZlbnROYW1lc3BhY2UoKSk7XHJcbiAgICAgIC8vIHVuYmluZCBhbGwgZXZlbnRzXHJcbiAgICAgICQuZWFjaCh0aGlzLmxpc3RlbmVycy50b0hhc2goKSAsIGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVycykge1xyXG4gICAgICAgICQuZWFjaChsaXN0ZW5lcnMsIGZ1bmN0aW9uKGksIGxpc3RlbmVyX2NhbGxiYWNrKSB7XHJcbiAgICAgICAgICBhcHAuX3VubGlzdGVuKG5hbWUsIGxpc3RlbmVyX2NhbGxiYWNrKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIE5vdCBvbmx5IHJ1bnMgYHVuYmluZGAgYnV0IGFsc28gZGVzdHJveXMgdGhlIGFwcCByZWZlcmVuY2UuXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcclxuICAgICAgdGhpcy51bmxvYWQoKTtcclxuICAgICAgZGVsZXRlIFNhbW15LmFwcHNbdGhpcy5lbGVtZW50X3NlbGVjdG9yXTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFdpbGwgYmluZCBhIHNpbmdsZSBjYWxsYmFjayBmdW5jdGlvbiB0byBldmVyeSBldmVudCB0aGF0IGlzIGFscmVhZHlcclxuICAgIC8vIGJlaW5nIGxpc3RlbmVkIHRvIGluIHRoZSBhcHAuIFRoaXMgaW5jbHVkZXMgYWxsIHRoZSBgQVBQX0VWRU5UU2BcclxuICAgIC8vIGFzIHdlbGwgYXMgYW55IGN1c3RvbSBldmVudHMgZGVmaW5lZCB3aXRoIGBiaW5kKClgLlxyXG4gICAgLy9cclxuICAgIC8vIFVzZWQgaW50ZXJuYWxseSBmb3IgZGVidWcgbG9nZ2luZy5cclxuICAgIGJpbmRUb0FsbEV2ZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgdmFyIGFwcCA9IHRoaXM7XHJcbiAgICAgIC8vIGJpbmQgdG8gdGhlIEFQUF9FVkVOVFMgZmlyc3RcclxuICAgICAgJC5lYWNoKHRoaXMuQVBQX0VWRU5UUywgZnVuY3Rpb24oaSwgZSkge1xyXG4gICAgICAgIGFwcC5iaW5kKGUsIGNhbGxiYWNrKTtcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIG5leHQsIGJpbmQgdG8gbGlzdGVuZXIgbmFtZXMgKG9ubHkgaWYgdGhleSBkb250IGV4aXN0IGluIEFQUF9FVkVOVFMpXHJcbiAgICAgICQuZWFjaCh0aGlzLmxpc3RlbmVycy5rZXlzKHRydWUpLCBmdW5jdGlvbihpLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKCQuaW5BcnJheShuYW1lLCBhcHAuQVBQX0VWRU5UUykgPT0gLTEpIHtcclxuICAgICAgICAgIGFwcC5iaW5kKG5hbWUsIGNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIGdpdmVuIHBhdGggd2l0aCBhbnkgcXVlcnkgc3RyaW5nIGFmdGVyIHRoZSBoYXNoXHJcbiAgICAvLyByZW1vdmVkLlxyXG4gICAgcm91dGFibGVQYXRoOiBmdW5jdGlvbihwYXRoKSB7XHJcbiAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoUVVFUllfU1RSSU5HX01BVENIRVIsICcnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gR2l2ZW4gYSB2ZXJiIGFuZCBhIFN0cmluZyBwYXRoLCB3aWxsIHJldHVybiBlaXRoZXIgYSByb3V0ZSBvYmplY3Qgb3IgZmFsc2VcclxuICAgIC8vIGlmIGEgbWF0Y2hpbmcgcm91dGUgY2FuIGJlIGZvdW5kIHdpdGhpbiB0aGUgY3VycmVudCBkZWZpbmVkIHNldC5cclxuICAgIGxvb2t1cFJvdXRlOiBmdW5jdGlvbih2ZXJiLCBwYXRoKSB7XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzLCByb3V0ZWQgPSBmYWxzZSwgaSA9IDAsIGwsIHJvdXRlO1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMucm91dGVzW3ZlcmJdICE9ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgbCA9IHRoaXMucm91dGVzW3ZlcmJdLmxlbmd0aDtcclxuICAgICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgcm91dGUgPSB0aGlzLnJvdXRlc1t2ZXJiXVtpXTtcclxuICAgICAgICAgIGlmIChhcHAucm91dGFibGVQYXRoKHBhdGgpLm1hdGNoKHJvdXRlLnBhdGgpKSB7XHJcbiAgICAgICAgICAgIHJvdXRlZCA9IHJvdXRlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJvdXRlZDtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gRmlyc3QsIGludm9rZXMgYGxvb2t1cFJvdXRlKClgIGFuZCBpZiBhIHJvdXRlIGlzIGZvdW5kLCBwYXJzZXMgdGhlXHJcbiAgICAvLyBwb3NzaWJsZSBVUkwgcGFyYW1zIGFuZCB0aGVuIGludm9rZXMgdGhlIHJvdXRlJ3MgY2FsbGJhY2sgd2l0aGluIGEgbmV3XHJcbiAgICAvLyBgU2FtbXkuRXZlbnRDb250ZXh0YC4gSWYgdGhlIHJvdXRlIGNhbiBub3QgYmUgZm91bmQsIGl0IGNhbGxzXHJcbiAgICAvLyBgbm90Rm91bmQoKWAuIElmIGByYWlzZV9lcnJvcnNgIGlzIHNldCB0byBgdHJ1ZWAgYW5kXHJcbiAgICAvLyB0aGUgYGVycm9yKClgIGhhcyBub3QgYmVlbiBvdmVycmlkZGVuLCBpdCB3aWxsIHRocm93IGFuIGFjdHVhbCBKU1xyXG4gICAgLy8gZXJyb3IuXHJcbiAgICAvL1xyXG4gICAgLy8gWW91IHByb2JhYmx5IHdpbGwgbmV2ZXIgaGF2ZSB0byBjYWxsIHRoaXMgZGlyZWN0bHkuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYHZlcmJgIEEgU3RyaW5nIGZvciB0aGUgdmVyYi5cclxuICAgIC8vICogYHBhdGhgIEEgU3RyaW5nIHBhdGggdG8gbG9va3VwLlxyXG4gICAgLy8gKiBgcGFyYW1zYCBBbiBPYmplY3Qgb2YgUGFyYW1zIHB1bGxlZCBmcm9tIHRoZSBVUkkgb3IgcGFzc2VkIGRpcmVjdGx5LlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBSZXR1cm5zXHJcbiAgICAvL1xyXG4gICAgLy8gRWl0aGVyIHJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSByb3V0ZSBjYWxsYmFjayBvciByYWlzZXMgYSA0MDQgTm90IEZvdW5kIGVycm9yLlxyXG4gICAgLy9cclxuICAgIHJ1blJvdXRlOiBmdW5jdGlvbih2ZXJiLCBwYXRoLCBwYXJhbXMsIHRhcmdldCkge1xyXG4gICAgICB2YXIgYXBwID0gdGhpcyxcclxuICAgICAgICAgIHJvdXRlID0gdGhpcy5sb29rdXBSb3V0ZSh2ZXJiLCBwYXRoKSxcclxuICAgICAgICAgIGNvbnRleHQsXHJcbiAgICAgICAgICB3cmFwcGVkX3JvdXRlLFxyXG4gICAgICAgICAgYXJvdW5kcyxcclxuICAgICAgICAgIGFyb3VuZCxcclxuICAgICAgICAgIGJlZm9yZXMsXHJcbiAgICAgICAgICBiZWZvcmUsXHJcbiAgICAgICAgICBjYWxsYmFja19hcmdzLFxyXG4gICAgICAgICAgcGF0aF9wYXJhbXMsXHJcbiAgICAgICAgICBmaW5hbF9yZXR1cm5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgdGhpcy5sb2coJ3J1blJvdXRlJywgW3ZlcmIsIHBhdGhdLmpvaW4oJyAnKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudHJpZ2dlcigncnVuLXJvdXRlJywge3ZlcmI6IHZlcmIsIHBhdGg6IHBhdGgsIHBhcmFtczogcGFyYW1zfSk7XHJcbiAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09ICd1bmRlZmluZWQnKSB7IHBhcmFtcyA9IHt9OyB9XHJcblxyXG4gICAgICAkLmV4dGVuZChwYXJhbXMsIHRoaXMuX3BhcnNlUXVlcnlTdHJpbmcocGF0aCkpO1xyXG5cclxuICAgICAgaWYgKHJvdXRlKSB7XHJcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdyb3V0ZS1mb3VuZCcsIHtyb3V0ZTogcm91dGV9KTtcclxuICAgICAgICAvLyBwdWxsIG91dCB0aGUgcGFyYW1zIGZyb20gdGhlIHBhdGhcclxuICAgICAgICBpZiAoKHBhdGhfcGFyYW1zID0gcm91dGUucGF0aC5leGVjKHRoaXMucm91dGFibGVQYXRoKHBhdGgpKSkgIT09IG51bGwpIHtcclxuICAgICAgICAgIC8vIGZpcnN0IG1hdGNoIGlzIHRoZSBmdWxsIHBhdGhcclxuICAgICAgICAgIHBhdGhfcGFyYW1zLnNoaWZ0KCk7XHJcbiAgICAgICAgICAvLyBmb3IgZWFjaCBvZiB0aGUgbWF0Y2hlc1xyXG4gICAgICAgICAgJC5lYWNoKHBhdGhfcGFyYW1zLCBmdW5jdGlvbihpLCBwYXJhbSkge1xyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZXMgYSBtYXRjaGluZyBwYXJhbSBuYW1lXHJcbiAgICAgICAgICAgIGlmIChyb3V0ZS5wYXJhbV9uYW1lc1tpXSkge1xyXG4gICAgICAgICAgICAgIC8vIHNldCB0aGUgbmFtZSB0byB0aGUgbWF0Y2hcclxuICAgICAgICAgICAgICBwYXJhbXNbcm91dGUucGFyYW1fbmFtZXNbaV1dID0gX2RlY29kZShwYXJhbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSAnc3BsYXQnXHJcbiAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuc3BsYXQpIHsgcGFyYW1zLnNwbGF0ID0gW107IH1cclxuICAgICAgICAgICAgICBwYXJhbXMuc3BsYXQucHVzaChfZGVjb2RlKHBhcmFtKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0IGV2ZW50IGNvbnRleHRcclxuICAgICAgICBjb250ZXh0ICA9IG5ldyB0aGlzLmNvbnRleHRfcHJvdG90eXBlKHRoaXMsIHZlcmIsIHBhdGgsIHBhcmFtcywgdGFyZ2V0KTtcclxuICAgICAgICAvLyBlbnN1cmUgYXJyYXlzXHJcbiAgICAgICAgYXJvdW5kcyA9IHRoaXMuYXJvdW5kcy5zbGljZSgwKTtcclxuICAgICAgICBiZWZvcmVzID0gdGhpcy5iZWZvcmVzLnNsaWNlKDApO1xyXG4gICAgICAgIC8vIHNldCB0aGUgY2FsbGJhY2sgYXJncyB0byB0aGUgY29udGV4dCArIGNvbnRlbnRzIG9mIHRoZSBzcGxhdFxyXG4gICAgICAgIGNhbGxiYWNrX2FyZ3MgPSBbY29udGV4dF07XHJcbiAgICAgICAgaWYgKHBhcmFtcy5zcGxhdCkge1xyXG4gICAgICAgICAgY2FsbGJhY2tfYXJncyA9IGNhbGxiYWNrX2FyZ3MuY29uY2F0KHBhcmFtcy5zcGxhdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHdyYXAgdGhlIHJvdXRlIHVwIHdpdGggdGhlIGJlZm9yZSBmaWx0ZXJzXHJcbiAgICAgICAgd3JhcHBlZF9yb3V0ZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgdmFyIHJldHVybmVkLCBpLCBuZXh0Um91dGU7XHJcbiAgICAgICAgICB3aGlsZSAoYmVmb3Jlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGJlZm9yZSA9IGJlZm9yZXMuc2hpZnQoKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgdGhlIG9wdGlvbnNcclxuICAgICAgICAgICAgaWYgKGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgYmVmb3JlWzBdKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybmVkID0gYmVmb3JlWzFdLmFwcGx5KGNvbnRleHQsIFtjb250ZXh0XSk7XHJcbiAgICAgICAgICAgICAgaWYgKHJldHVybmVkID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXBwLmxhc3Rfcm91dGUgPSByb3V0ZTtcclxuICAgICAgICAgIGNvbnRleHQudHJpZ2dlcignZXZlbnQtY29udGV4dC1iZWZvcmUnLCB7Y29udGV4dDogY29udGV4dH0pO1xyXG4gICAgICAgICAgLy8gcnVuIG11bHRpcGxlIGNhbGxiYWNrc1xyXG4gICAgICAgICAgaWYgKHR5cGVvZihyb3V0ZS5jYWxsYmFjaykgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICByb3V0ZS5jYWxsYmFjayA9IFtyb3V0ZS5jYWxsYmFja107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocm91dGUuY2FsbGJhY2sgJiYgcm91dGUuY2FsbGJhY2subGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGkgPSAtMTtcclxuICAgICAgICAgICAgbmV4dFJvdXRlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgIGlmIChyb3V0ZS5jYWxsYmFja1tpXSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuZWQgPSByb3V0ZS5jYWxsYmFja1tpXS5hcHBseShjb250ZXh0LGNhbGxiYWNrX2FyZ3MpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwLl9vbkNvbXBsZXRlICYmIHR5cGVvZihhcHAuX29uQ29tcGxldGUgPT09IFwiZnVuY3Rpb25cIikpIHtcclxuICAgICAgICAgICAgICAgIGFwcC5fb25Db21wbGV0ZShjb250ZXh0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNhbGxiYWNrX2FyZ3MucHVzaChuZXh0Um91dGUpO1xyXG4gICAgICAgICAgICBuZXh0Um91dGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnRleHQudHJpZ2dlcignZXZlbnQtY29udGV4dC1hZnRlcicsIHtjb250ZXh0OiBjb250ZXh0fSk7XHJcbiAgICAgICAgICByZXR1cm4gcmV0dXJuZWQ7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAkLmVhY2goYXJvdW5kcy5yZXZlcnNlKCksIGZ1bmN0aW9uKGksIGFyb3VuZCkge1xyXG4gICAgICAgICAgdmFyIGxhc3Rfd3JhcHBlZF9yb3V0ZSA9IHdyYXBwZWRfcm91dGU7XHJcbiAgICAgICAgICB3cmFwcGVkX3JvdXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBhcm91bmQuYXBwbHkoY29udGV4dCwgW2xhc3Rfd3JhcHBlZF9yb3V0ZV0pOyB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBmaW5hbF9yZXR1cm5lZCA9IHdyYXBwZWRfcm91dGUoKTtcclxuICAgICAgICB9IGNhdGNoKGUpIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3IoWyc1MDAgRXJyb3InLCB2ZXJiLCBwYXRoXS5qb2luKCcgJyksIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmluYWxfcmV0dXJuZWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm90Rm91bmQodmVyYiwgcGF0aCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8gTWF0Y2hlcyBhbiBvYmplY3Qgb2Ygb3B0aW9ucyBhZ2FpbnN0IGFuIGBFdmVudENvbnRleHRgIGxpa2Ugb2JqZWN0IHRoYXRcclxuICAgIC8vIGNvbnRhaW5zIGBwYXRoYCBhbmQgYHZlcmJgIGF0dHJpYnV0ZXMuIEludGVybmFsbHkgU2FtbXkgdXNlcyB0aGlzXHJcbiAgICAvLyBmb3IgbWF0Y2hpbmcgYGJlZm9yZSgpYCBmaWx0ZXJzIGFnYWluc3Qgc3BlY2lmaWMgb3B0aW9ucy4gWW91IGNhbiBzZXQgdGhlXHJcbiAgICAvLyBvYmplY3QgdG8gX29ubHlfIG1hdGNoIGNlcnRhaW4gcGF0aHMgb3IgdmVyYnMsIG9yIG1hdGNoIGFsbCBwYXRocyBvciB2ZXJicyBfZXhjZXB0X1xyXG4gICAgLy8gdGhvc2UgdGhhdCBtYXRjaCB0aGUgb3B0aW9ucy5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICB2YXIgYXBwID0gJC5zYW1teSgpLFxyXG4gICAgLy8gICAgICAgICBjb250ZXh0ID0ge3ZlcmI6ICdnZXQnLCBwYXRoOiAnIy9teXBhdGgnfTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggYWdhaW5zdCBhIHBhdGggc3RyaW5nXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCAnIy9teXBhdGgnKTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCAnIy9vdGhlcnBhdGgnKTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIGVxdWl2YWxlbnQgdG9cclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtvbmx5OiB7cGF0aDonIy9teXBhdGgnfX0pOyAvLz0+IHRydWVcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtvbmx5OiB7cGF0aDonIy9vdGhlcnBhdGgnfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggYWdhaW5zdCBhIHBhdGggcmVnZXhwXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCAvcGF0aC8pOyAvLz0+IHRydWVcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIC9ecGF0aC8pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggb25seSBhIHZlcmJcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtvbmx5OiB7dmVyYjonZ2V0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3ZlcmI6J3Bvc3QnfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggYWxsIGV4Y2VwdCBhIHZlcmJcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHt2ZXJiOidwb3N0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7dmVyYjonZ2V0J319KTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFsbCBleGNlcHQgYSBwYXRoXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9vdGhlcnBhdGgnfX0pOyAvLz0+IHRydWVcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOicjL215cGF0aCd9fSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICAvLyBtYXRjaCBhbGwgZXhjZXB0IGEgdmVyYiBhbmQgYSBwYXRoXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9vdGhlcnBhdGgnLCB2ZXJiOidwb3N0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9teXBhdGgnLCB2ZXJiOidwb3N0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9teXBhdGgnLCB2ZXJiOidnZXQnfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggbXVsdGlwbGUgcGF0aHNcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtwYXRoOiBbJyMvbXlwYXRoJywgJyMvb3RoZXJwYXRoJ119KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7cGF0aDogWycjL290aGVycGF0aCcsICcjL3RoaXJkcGF0aCddfSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICAvLyBlcXVpdmFsZW50IHRvXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3BhdGg6IFsnIy9teXBhdGgnLCAnIy9vdGhlcnBhdGgnXX19KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3BhdGg6IFsnIy9vdGhlcnBhdGgnLCAnIy90aGlyZHBhdGgnXX19KTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFsbCBleGNlcHQgbXVsdGlwbGUgcGF0aHNcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOiBbJyMvbXlwYXRoJywgJyMvb3RoZXJwYXRoJ119fSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOiBbJyMvb3RoZXJwYXRoJywgJyMvdGhpcmRwYXRoJ119fSk7IC8vPT4gdHJ1ZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFsbCBleGNlcHQgbXVsdGlwbGUgcGF0aHMgYW5kIHZlcmJzXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDogWycjL215cGF0aCcsICcjL290aGVycGF0aCddLCB2ZXJiOiBbJ2dldCcsICdwb3N0J119fSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOiBbJyMvb3RoZXJwYXRoJywgJyMvdGhpcmRwYXRoJ10sIHZlcmI6IFsnZ2V0JywgJ3Bvc3QnXX19KTsgLy89PiB0cnVlXHJcbiAgICAvL1xyXG4gICAgY29udGV4dE1hdGNoZXNPcHRpb25zOiBmdW5jdGlvbihjb250ZXh0LCBtYXRjaF9vcHRpb25zLCBwb3NpdGl2ZSkge1xyXG4gICAgICB2YXIgb3B0aW9ucyA9IG1hdGNoX29wdGlvbnM7XHJcbiAgICAgIC8vIG5vcm1hbGl6ZSBvcHRpb25zXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgfHwgX2lzUmVnRXhwKG9wdGlvbnMpKSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IHtwYXRoOiBvcHRpb25zfTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodHlwZW9mIHBvc2l0aXZlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHBvc2l0aXZlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBlbXB0eSBvcHRpb25zIGFsd2F5cyBtYXRjaFxyXG4gICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KG9wdGlvbnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gRG8gd2UgaGF2ZSB0byBtYXRjaCBhZ2FpbnN0IG11bHRpcGxlIHBhdGhzP1xyXG4gICAgICBpZiAoX2lzQXJyYXkob3B0aW9ucy5wYXRoKSl7XHJcbiAgICAgICAgdmFyIHJlc3VsdHMsIG51bW9wdCwgb3B0cywgbGVuO1xyXG4gICAgICAgIHJlc3VsdHMgPSBbXTtcclxuICAgICAgICBmb3IgKG51bW9wdCA9IDAsIGxlbiA9IG9wdGlvbnMucGF0aC5sZW5ndGg7IG51bW9wdCA8IGxlbjsgbnVtb3B0ICs9IDEpIHtcclxuICAgICAgICAgIG9wdHMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucywge3BhdGg6IG9wdGlvbnMucGF0aFtudW1vcHRdfSk7XHJcbiAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgb3B0cykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbWF0Y2hlZCA9ICQuaW5BcnJheSh0cnVlLCByZXN1bHRzKSA+IC0xID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBwb3NpdGl2ZSA/IG1hdGNoZWQgOiAhbWF0Y2hlZDtcclxuICAgICAgfVxyXG4gICAgICBpZiAob3B0aW9ucy5vbmx5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIG9wdGlvbnMub25seSwgdHJ1ZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5leGNlcHQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgb3B0aW9ucy5leGNlcHQsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgcGF0aF9tYXRjaGVkID0gdHJ1ZSwgdmVyYl9tYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKG9wdGlvbnMucGF0aCkge1xyXG4gICAgICAgIGlmICghX2lzUmVnRXhwKG9wdGlvbnMucGF0aCkpIHtcclxuICAgICAgICAgIG9wdGlvbnMucGF0aCA9IG5ldyBSZWdFeHAob3B0aW9ucy5wYXRoLnRvU3RyaW5nKCkgKyAnJCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYXRoX21hdGNoZWQgPSBvcHRpb25zLnBhdGgudGVzdChjb250ZXh0LnBhdGgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvcHRpb25zLnZlcmIpIHtcclxuICAgICAgICBpZih0eXBlb2Ygb3B0aW9ucy52ZXJiID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgdmVyYl9tYXRjaGVkID0gb3B0aW9ucy52ZXJiID09PSBjb250ZXh0LnZlcmI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZlcmJfbWF0Y2hlZCA9IG9wdGlvbnMudmVyYi5pbmRleE9mKGNvbnRleHQudmVyYikgPiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBvc2l0aXZlID8gKHZlcmJfbWF0Y2hlZCAmJiBwYXRoX21hdGNoZWQpIDogISh2ZXJiX21hdGNoZWQgJiYgcGF0aF9tYXRjaGVkKTtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIC8vIERlbGVnYXRlcyB0byB0aGUgYGxvY2F0aW9uX3Byb3h5YCB0byBnZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uXHJcbiAgICAvLyBTZWUgYFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5YCBmb3IgbW9yZSBpbmZvIG9uIGxvY2F0aW9uIHByb3hpZXMuXHJcbiAgICBnZXRMb2NhdGlvbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9sb2NhdGlvbl9wcm94eS5nZXRMb2NhdGlvbigpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBEZWxlZ2F0ZXMgdG8gdGhlIGBsb2NhdGlvbl9wcm94eWAgdG8gc2V0IHRoZSBjdXJyZW50IGxvY2F0aW9uLlxyXG4gICAgLy8gU2VlIGBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eWAgZm9yIG1vcmUgaW5mbyBvbiBsb2NhdGlvbiBwcm94aWVzLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGBuZXdfbG9jYXRpb25gIEEgbmV3IGxvY2F0aW9uIHN0cmluZyAoZS5nLiAnIy8nKVxyXG4gICAgLy9cclxuICAgIHNldExvY2F0aW9uOiBmdW5jdGlvbihuZXdfbG9jYXRpb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2xvY2F0aW9uX3Byb3h5LnNldExvY2F0aW9uKG5ld19sb2NhdGlvbik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFN3YXBzIHRoZSBjb250ZW50IG9mIGAkZWxlbWVudCgpYCB3aXRoIGBjb250ZW50YFxyXG4gICAgLy8gWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFuIGFsdGVybmF0ZSBzd2FwIGJlaGF2aW9yXHJcbiAgICAvLyBmb3IgYEV2ZW50Q29udGV4dC5wYXJ0aWFsKClgLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB2YXIgYXBwID0gJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgLy8gaW1wbGVtZW50cyBhICdmYWRlIG91dCcvJ2ZhZGUgaW4nXHJcbiAgICAvLyAgICAgICAgdGhpcy5zd2FwID0gZnVuY3Rpb24oY29udGVudCwgY2FsbGJhY2spIHtcclxuICAgIC8vICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcclxuICAgIC8vICAgICAgICAgIGNvbnRleHQuJGVsZW1lbnQoKS5mYWRlT3V0KCdzbG93JywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICAgIGNvbnRleHQuJGVsZW1lbnQoKS5odG1sKGNvbnRlbnQpO1xyXG4gICAgLy8gICAgICAgICAgICBjb250ZXh0LiRlbGVtZW50KCkuZmFkZUluKCdzbG93JywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSgpO1xyXG4gICAgLy8gICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICB9O1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgc3dhcDogZnVuY3Rpb24oY29udGVudCwgY2FsbGJhY2spIHtcclxuICAgICAgdmFyICRlbCA9IHRoaXMuJGVsZW1lbnQoKS5odG1sKGNvbnRlbnQpO1xyXG4gICAgICBpZiAoX2lzRnVuY3Rpb24oY2FsbGJhY2spKSB7IGNhbGxiYWNrKGNvbnRlbnQpOyB9XHJcbiAgICAgIHJldHVybiAkZWw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGEgc2ltcGxlIGdsb2JhbCBjYWNoZSBmb3IgdGVtcGxhdGVzLiBVc2VzIHRoZSBzYW1lIHNlbWFudGljcyBhc1xyXG4gICAgLy8gYFNhbW15LkNhY2hlYCBhbmQgYFNhbW15LlN0b3JhZ2VgIHNvIGNhbiBlYXNpbHkgYmUgcmVwbGFjZWQgd2l0aFxyXG4gICAgLy8gYSBwZXJzaXN0ZW50IHN0b3JhZ2UgdGhhdCBsYXN0cyBiZXlvbmQgdGhlIGN1cnJlbnQgcmVxdWVzdC5cclxuICAgIHRlbXBsYXRlQ2FjaGU6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcclxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBfdGVtcGxhdGVfY2FjaGVba2V5XSA9IHZhbHVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBfdGVtcGxhdGVfY2FjaGVba2V5XTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyBjbGVhciB0aGUgdGVtcGxhdGVDYWNoZVxyXG4gICAgY2xlYXJUZW1wbGF0ZUNhY2hlOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIChfdGVtcGxhdGVfY2FjaGUgPSB7fSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFRoaXMgdGhyb3dzIGEgJzQwNCBOb3QgRm91bmQnIGVycm9yIGJ5IGludm9raW5nIGBlcnJvcigpYC5cclxuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIG9yIGBlcnJvcigpYCB0byBwcm92aWRlIGN1c3RvbVxyXG4gICAgLy8gNDA0IGJlaGF2aW9yIChpLmUgcmVkaXJlY3RpbmcgdG8gLyBvciBzaG93aW5nIGEgd2FybmluZylcclxuICAgIG5vdEZvdW5kOiBmdW5jdGlvbih2ZXJiLCBwYXRoKSB7XHJcbiAgICAgIHZhciByZXQgPSB0aGlzLmVycm9yKFsnNDA0IE5vdCBGb3VuZCcsIHZlcmIsIHBhdGhdLmpvaW4oJyAnKSk7XHJcbiAgICAgIHJldHVybiAodmVyYiA9PT0gJ2dldCcpID8gcmV0IDogdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gVGhlIGJhc2UgZXJyb3IgaGFuZGxlciB0YWtlcyBhIHN0cmluZyBgbWVzc2FnZWAgYW5kIGFuIGBFcnJvcmBcclxuICAgIC8vIG9iamVjdC4gSWYgYHJhaXNlX2Vycm9yc2AgaXMgc2V0IHRvIGB0cnVlYCBvbiB0aGUgYXBwIGxldmVsLFxyXG4gICAgLy8gdGhpcyB3aWxsIHJlLXRocm93IHRoZSBlcnJvciB0byB0aGUgYnJvd3Nlci4gT3RoZXJ3aXNlIGl0IHdpbGwgc2VuZCB0aGUgZXJyb3JcclxuICAgIC8vIHRvIGBsb2coKWAuIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgY3VzdG9tIGVycm9yIGhhbmRsaW5nXHJcbiAgICAvLyBlLmcgbG9nZ2luZyB0byBhIHNlcnZlciBzaWRlIGNvbXBvbmVudCBvciBkaXNwbGF5aW5nIHNvbWUgZmVlZGJhY2sgdG8gdGhlXHJcbiAgICAvLyB1c2VyLlxyXG4gICAgZXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UsIG9yaWdpbmFsX2Vycm9yKSB7XHJcbiAgICAgIGlmICghb3JpZ2luYWxfZXJyb3IpIHsgb3JpZ2luYWxfZXJyb3IgPSBuZXcgRXJyb3IoKTsgfVxyXG4gICAgICBvcmlnaW5hbF9lcnJvci5tZXNzYWdlID0gW21lc3NhZ2UsIG9yaWdpbmFsX2Vycm9yLm1lc3NhZ2VdLmpvaW4oJyAnKTtcclxuICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicsIHttZXNzYWdlOiBvcmlnaW5hbF9lcnJvci5tZXNzYWdlLCBlcnJvcjogb3JpZ2luYWxfZXJyb3J9KTtcclxuICAgICAgaWYgKHRoaXMucmFpc2VfZXJyb3JzKSB7XHJcbiAgICAgICAgdGhyb3cob3JpZ2luYWxfZXJyb3IpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9nKG9yaWdpbmFsX2Vycm9yLm1lc3NhZ2UsIG9yaWdpbmFsX2Vycm9yKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBfY2hlY2tMb2NhdGlvbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBsb2NhdGlvbiwgcmV0dXJuZWQ7XHJcbiAgICAgIC8vIGdldCBjdXJyZW50IGxvY2F0aW9uXHJcbiAgICAgIGxvY2F0aW9uID0gdGhpcy5nZXRMb2NhdGlvbigpO1xyXG4gICAgICAvLyBjb21wYXJlIHRvIHNlZSBpZiBoYXNoIGhhcyBjaGFuZ2VkXHJcbiAgICAgIGlmICghdGhpcy5sYXN0X2xvY2F0aW9uIHx8IHRoaXMubGFzdF9sb2NhdGlvblswXSAhPSAnZ2V0JyB8fCB0aGlzLmxhc3RfbG9jYXRpb25bMV0gIT0gbG9jYXRpb24pIHtcclxuICAgICAgICAvLyByZXNldCBsYXN0IGxvY2F0aW9uXHJcbiAgICAgICAgdGhpcy5sYXN0X2xvY2F0aW9uID0gWydnZXQnLCBsb2NhdGlvbl07XHJcbiAgICAgICAgLy8gbG9va3VwIHJvdXRlIGZvciBjdXJyZW50IGhhc2hcclxuICAgICAgICByZXR1cm5lZCA9IHRoaXMucnVuUm91dGUoJ2dldCcsIGxvY2F0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmV0dXJuZWQ7XHJcbiAgICB9LFxyXG5cclxuICAgIF9nZXRGb3JtVmVyYjogZnVuY3Rpb24oZm9ybSkge1xyXG4gICAgICB2YXIgJGZvcm0gPSAkKGZvcm0pLCB2ZXJiLCAkX21ldGhvZDtcclxuICAgICAgJF9tZXRob2QgPSAkZm9ybS5maW5kKCdpbnB1dFtuYW1lPVwiX21ldGhvZFwiXScpO1xyXG4gICAgICBpZiAoJF9tZXRob2QubGVuZ3RoID4gMCkgeyB2ZXJiID0gJF9tZXRob2QudmFsKCk7IH1cclxuICAgICAgaWYgKCF2ZXJiKSB7IHZlcmIgPSAkZm9ybVswXS5nZXRBdHRyaWJ1dGUoJ21ldGhvZCcpOyB9XHJcbiAgICAgIGlmICghdmVyYiB8fCB2ZXJiID09PSAnJykgeyB2ZXJiID0gJ2dldCc7IH1cclxuICAgICAgcmV0dXJuICQudHJpbSh2ZXJiLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIF9jaGVja0Zvcm1TdWJtaXNzaW9uOiBmdW5jdGlvbihmb3JtKSB7XHJcbiAgICAgIHZhciAkZm9ybSwgcGF0aCwgdmVyYiwgcGFyYW1zLCByZXR1cm5lZDtcclxuICAgICAgdGhpcy50cmlnZ2VyKCdjaGVjay1mb3JtLXN1Ym1pc3Npb24nLCB7Zm9ybTogZm9ybX0pO1xyXG4gICAgICAkZm9ybSA9ICQoZm9ybSk7XHJcbiAgICAgIHBhdGggID0gJGZvcm0uYXR0cignYWN0aW9uJykgfHwgJyc7XHJcbiAgICAgIHZlcmIgID0gdGhpcy5fZ2V0Rm9ybVZlcmIoJGZvcm0pO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICB0aGlzLmxvZygnX2NoZWNrRm9ybVN1Ym1pc3Npb24nLCAkZm9ybSwgcGF0aCwgdmVyYik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xyXG4gICAgICAgIHBhcmFtcyA9IHRoaXMuX3NlcmlhbGl6ZUZvcm1QYXJhbXMoJGZvcm0pO1xyXG4gICAgICAgIGlmIChwYXJhbXMgIT09ICcnKSB7IHBhdGggKz0gJz8nICsgcGFyYW1zOyB9XHJcbiAgICAgICAgdGhpcy5zZXRMb2NhdGlvbihwYXRoKTtcclxuICAgICAgICByZXR1cm5lZCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmFtcyA9ICQuZXh0ZW5kKHt9LCB0aGlzLl9wYXJzZUZvcm1QYXJhbXMoJGZvcm0pKTtcclxuICAgICAgICByZXR1cm5lZCA9IHRoaXMucnVuUm91dGUodmVyYiwgcGF0aCwgcGFyYW1zLCBmb3JtLmdldCgwKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICh0eXBlb2YgcmV0dXJuZWQgPT0gJ3VuZGVmaW5lZCcpID8gZmFsc2UgOiByZXR1cm5lZDtcclxuICAgIH0sXHJcblxyXG4gICAgX3NlcmlhbGl6ZUZvcm1QYXJhbXM6IGZ1bmN0aW9uKCRmb3JtKSB7XHJcbiAgICAgICB2YXIgcXVlcnlTdHJpbmcgPSBcIlwiLFxyXG4gICAgICAgICBmaWVsZHMgPSAkZm9ybS5zZXJpYWxpemVBcnJheSgpLFxyXG4gICAgICAgICBpO1xyXG4gICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgIHF1ZXJ5U3RyaW5nID0gdGhpcy5fZW5jb2RlRm9ybVBhaXIoZmllbGRzWzBdLm5hbWUsIGZpZWxkc1swXS52YWx1ZSk7XHJcbiAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nICsgXCImXCIgKyB0aGlzLl9lbmNvZGVGb3JtUGFpcihmaWVsZHNbaV0ubmFtZSwgZmllbGRzW2ldLnZhbHVlKTtcclxuICAgICAgICAgfVxyXG4gICAgICAgfVxyXG4gICAgICAgcmV0dXJuIHF1ZXJ5U3RyaW5nO1xyXG4gICAgfSxcclxuXHJcbiAgICBfZW5jb2RlRm9ybVBhaXI6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKXtcclxuICAgICAgcmV0dXJuIF9lbmNvZGUobmFtZSkgKyBcIj1cIiArIF9lbmNvZGUodmFsdWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICBfcGFyc2VGb3JtUGFyYW1zOiBmdW5jdGlvbigkZm9ybSkge1xyXG4gICAgICB2YXIgcGFyYW1zID0ge30sXHJcbiAgICAgICAgICBmb3JtX2ZpZWxkcyA9ICRmb3JtLnNlcmlhbGl6ZUFycmF5KCksXHJcbiAgICAgICAgICBpO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZm9ybV9maWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBwYXJhbXMgPSB0aGlzLl9wYXJzZVBhcmFtUGFpcihwYXJhbXMsIGZvcm1fZmllbGRzW2ldLm5hbWUsIGZvcm1fZmllbGRzW2ldLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGFyYW1zO1xyXG4gICAgfSxcclxuXHJcbiAgICBfcGFyc2VRdWVyeVN0cmluZzogZnVuY3Rpb24ocGF0aCkge1xyXG4gICAgICB2YXIgcGFyYW1zID0ge30sIHBhcnRzLCBwYWlycywgcGFpciwgaTtcclxuXHJcbiAgICAgIHBhcnRzID0gcGF0aC5tYXRjaChRVUVSWV9TVFJJTkdfTUFUQ0hFUik7XHJcbiAgICAgIGlmIChwYXJ0cyAmJiBwYXJ0c1sxXSkge1xyXG4gICAgICAgIHBhaXJzID0gcGFydHNbMV0uc3BsaXQoJyYnKTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgnPScpO1xyXG4gICAgICAgICAgcGFyYW1zID0gdGhpcy5fcGFyc2VQYXJhbVBhaXIocGFyYW1zLCBfZGVjb2RlKHBhaXJbMF0pLCBfZGVjb2RlKHBhaXJbMV0gfHwgXCJcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGFyYW1zO1xyXG4gICAgfSxcclxuXHJcbiAgICBfcGFyc2VQYXJhbVBhaXI6IGZ1bmN0aW9uKHBhcmFtcywga2V5LCB2YWx1ZSkge1xyXG4gICAgICBpZiAodHlwZW9mIHBhcmFtc1trZXldICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGlmIChfaXNBcnJheShwYXJhbXNba2V5XSkpIHtcclxuICAgICAgICAgIHBhcmFtc1trZXldLnB1c2godmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXJhbXNba2V5XSA9IFtwYXJhbXNba2V5XSwgdmFsdWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICB9LFxyXG5cclxuICAgIF9saXN0ZW46IGZ1bmN0aW9uKG5hbWUsIGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiRlbGVtZW50KCkuYmluZChbbmFtZSwgdGhpcy5ldmVudE5hbWVzcGFjZSgpXS5qb2luKCcuJyksIGNhbGxiYWNrKTtcclxuICAgIH0sXHJcblxyXG4gICAgX3VubGlzdGVuOiBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gdGhpcy4kZWxlbWVudCgpLnVuYmluZChbbmFtZSwgdGhpcy5ldmVudE5hbWVzcGFjZSgpXS5qb2luKCcuJyksIGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgfSk7XHJcblxyXG4gIC8vIGBTYW1teS5SZW5kZXJDb250ZXh0YCBpcyBhbiBvYmplY3QgdGhhdCBtYWtlcyBzZXF1ZW50aWFsIHRlbXBsYXRlIGxvYWRpbmcsXHJcbiAgLy8gcmVuZGVyaW5nIGFuZCBpbnRlcnBvbGF0aW9uIHNlYW1sZXNzIGV2ZW4gd2hlbiBkZWFsaW5nIHdpdGggYXN5bmNocm9ub3VzXHJcbiAgLy8gb3BlcmF0aW9ucy5cclxuICAvL1xyXG4gIC8vIGBSZW5kZXJDb250ZXh0YCBvYmplY3RzIGFyZSBub3QgdXN1YWxseSBjcmVhdGVkIGRpcmVjdGx5LCByYXRoZXIgdGhleSBhcmVcclxuICAvLyBpbnN0YW50aWF0ZWQgZnJvbSBhbiBgU2FtbXkuRXZlbnRDb250ZXh0YCBieSB1c2luZyBgcmVuZGVyKClgLCBgbG9hZCgpYCBvclxyXG4gIC8vIGBwYXJ0aWFsKClgIHdoaWNoIGFsbCByZXR1cm4gYFJlbmRlckNvbnRleHRgIG9iamVjdHMuXHJcbiAgLy9cclxuICAvLyBgUmVuZGVyQ29udGV4dGAgbWV0aG9kcyBhbHdheXMgcmV0dXJucyBhIG1vZGlmaWVkIGBSZW5kZXJDb250ZXh0YFxyXG4gIC8vIGZvciBjaGFpbmluZyAobGlrZSBqUXVlcnkgaXRzZWxmKS5cclxuICAvL1xyXG4gIC8vIFRoZSBjb3JlIG1hZ2ljIGlzIGluIHRoZSBgdGhlbigpYCBtZXRob2Qgd2hpY2ggcHV0cyB0aGUgY2FsbGJhY2sgcGFzc2VkIGFzXHJcbiAgLy8gYW4gYXJndW1lbnQgaW50byBhIHF1ZXVlIHRvIGJlIGV4ZWN1dGVkIG9uY2UgdGhlIHByZXZpb3VzIGNhbGxiYWNrIGlzIGNvbXBsZXRlLlxyXG4gIC8vIEFsbCB0aGUgbWV0aG9kcyBvZiBgUmVuZGVyQ29udGV4dGAgYXJlIHdyYXBwZWQgaW4gYHRoZW4oKWAgd2hpY2ggYWxsb3dzIHlvdVxyXG4gIC8vIHRvIHF1ZXVlIHVwIG1ldGhvZHMgYnkgY2hhaW5pbmcsIGJ1dCBtYWludGFpbmluZyBhIGd1YXJhbnRlZWQgZXhlY3V0aW9uIG9yZGVyXHJcbiAgLy8gZXZlbiB3aXRoIHJlbW90ZSBjYWxscyB0byBmZXRjaCB0ZW1wbGF0ZXMuXHJcbiAgLy9cclxuICBTYW1teS5SZW5kZXJDb250ZXh0ID0gZnVuY3Rpb24oZXZlbnRfY29udGV4dCkge1xyXG4gICAgdGhpcy5ldmVudF9jb250ZXh0ICAgID0gZXZlbnRfY29udGV4dDtcclxuICAgIHRoaXMuY2FsbGJhY2tzICAgICAgICA9IFtdO1xyXG4gICAgdGhpcy5wcmV2aW91c19jb250ZW50ID0gbnVsbDtcclxuICAgIHRoaXMuY29udGVudCAgICAgICAgICA9IG51bGw7XHJcbiAgICB0aGlzLm5leHRfZW5naW5lICAgICAgPSBmYWxzZTtcclxuICAgIHRoaXMud2FpdGluZyAgICAgICAgICA9IGZhbHNlO1xyXG4gIH07XHJcblxyXG4gIFNhbW15LlJlbmRlckNvbnRleHQucHJvdG90eXBlID0gJC5leHRlbmQoe30sIFNhbW15Lk9iamVjdC5wcm90b3R5cGUsIHtcclxuXHJcbiAgICAvLyBUaGUgXCJjb3JlXCIgb2YgdGhlIGBSZW5kZXJDb250ZXh0YCBvYmplY3QsIGFkZHMgdGhlIGBjYWxsYmFja2AgdG8gdGhlXHJcbiAgICAvLyBxdWV1ZS4gSWYgdGhlIGNvbnRleHQgaXMgYHdhaXRpbmdgIChtZWFuaW5nIGFuIGFzeW5jIG9wZXJhdGlvbiBpcyBoYXBwZW5pbmcpXHJcbiAgICAvLyB0aGVuIHRoZSBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIGluIG9yZGVyLCBvbmNlIHRoZSBvdGhlciBvcGVyYXRpb25zIGFyZVxyXG4gICAgLy8gY29tcGxldGUuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnRseSBleGVjdXRpbmcgb3BlcmF0aW9uLCB0aGUgYGNhbGxiYWNrYFxyXG4gICAgLy8gaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuXHJcbiAgICAvL1xyXG4gICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrIGlzIHN0b3JlZCBpbiBgY29udGVudGAgZm9yIHRoZVxyXG4gICAgLy8gc3Vic2VxdWVudCBvcGVyYXRpb24uIElmIHlvdSByZXR1cm4gYGZhbHNlYCwgdGhlIHF1ZXVlIHdpbGwgcGF1c2UsIGFuZFxyXG4gICAgLy8gdGhlIG5leHQgY2FsbGJhY2sgaW4gdGhlIHF1ZXVlIHdpbGwgbm90IGJlIGV4ZWN1dGVkIHVudGlsIGBuZXh0KClgIGlzXHJcbiAgICAvLyBjYWxsZWQuIFRoaXMgYWxsb3dzIGZvciB0aGUgZ3VhcmFudGVlZCBvcmRlciBvZiBleGVjdXRpb24gd2hpbGUgd29ya2luZ1xyXG4gICAgLy8gd2l0aCBhc3luYyBvcGVyYXRpb25zLlxyXG4gICAgLy9cclxuICAgIC8vIElmIHRoZW4oKSBpcyBwYXNzZWQgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uLCB0aGUgc3RyaW5nIGlzIGxvb2tlZFxyXG4gICAgLy8gdXAgYXMgYSBoZWxwZXIgbWV0aG9kIG9uIHRoZSBldmVudCBjb250ZXh0LlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB0aGlzLmdldCgnIy8nLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBSZW5kZXJDb250ZXh0XHJcbiAgICAvLyAgICAgICAgLy8gRXZlbiB0aG91Z2ggYGxvYWQoKWAgZXhlY3V0ZXMgYXN5bmMsIHRoZSBuZXh0IGB0aGVuKClgXHJcbiAgICAvLyAgICAgICAgLy8gd29udCBleGVjdXRlIHVudGlsIHRoZSBsb2FkIGZpbmlzaGVzXHJcbiAgICAvLyAgICAgICAgdGhpcy5sb2FkKCdteWZpbGUudHh0JylcclxuICAgIC8vICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgLy8gICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVuIGlzIHRoZSBjb250ZW50IG9mIHRoZVxyXG4gICAgLy8gICAgICAgICAgICAgIC8vIHByZXYgb3BlcmF0aW9uXHJcbiAgICAvLyAgICAgICAgICAgICAgJCgnI21haW4nKS5odG1sKGNvbnRlbnQpO1xyXG4gICAgLy8gICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgdGhlbjogZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgaWYgKCFfaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcclxuICAgICAgICAvLyBpZiBhIHN0cmluZyBpcyBwYXNzZWQgdG8gdGhlbiwgYXNzdW1lIHdlIHdhbnQgdG8gY2FsbFxyXG4gICAgICAgIC8vIGEgaGVscGVyIG9uIHRoZSBldmVudCBjb250ZXh0IGluIGl0cyBjb250ZXh0XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycgJiYgY2FsbGJhY2sgaW4gdGhpcy5ldmVudF9jb250ZXh0KSB7XHJcbiAgICAgICAgICB2YXIgaGVscGVyID0gdGhpcy5ldmVudF9jb250ZXh0W2NhbGxiYWNrXTtcclxuICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaGVscGVyLmFwcGx5KHRoaXMuZXZlbnRfY29udGV4dCwgW2NvbnRlbnRdKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XHJcbiAgICAgIGlmICh0aGlzLndhaXRpbmcpIHtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLndhaXQoKTtcclxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgIHZhciByZXR1cm5lZCA9IGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIFtjb250ZXh0LmNvbnRlbnQsIGNvbnRleHQucHJldmlvdXNfY29udGVudF0pO1xyXG4gICAgICAgICAgaWYgKHJldHVybmVkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjb250ZXh0Lm5leHQocmV0dXJuZWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBQYXVzZSB0aGUgYFJlbmRlckNvbnRleHRgIHF1ZXVlLiBDb21iaW5lZCB3aXRoIGBuZXh0KClgIGFsbG93cyBmb3IgYXN5bmNcclxuICAgIC8vIG9wZXJhdGlvbnMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICB0aGlzLmxvYWQoJ215dGV4dC5qc29uJylcclxuICAgIC8vICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgZGF0YSAgICA9IEpTT04ucGFyc2UoY29udGVudCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAvLyBwYXVzZSBleGVjdXRpb25cclxuICAgIC8vICAgICAgICAgICAgICAgIGNvbnRleHQud2FpdCgpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gcG9zdCB0byBhIHVybFxyXG4gICAgLy8gICAgICAgICAgICAgICAgJC5wb3N0KGRhdGEudXJsLCB7fSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgY29udGV4dC5uZXh0KEpTT04ucGFyc2UocmVzcG9uc2UpKTtcclxuICAgIC8vICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgICAgICAgIH0pXHJcbiAgICAvLyAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gZGF0YSBpcyBqc29uIGZyb20gdGhlIHByZXZpb3VzIHBvc3RcclxuICAgIC8vICAgICAgICAgICAgICAgICQoJyNtZXNzYWdlJykudGV4dChkYXRhLnN0YXR1cyk7XHJcbiAgICAvLyAgICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICB3YWl0OiBmdW5jdGlvbigpIHtcclxuICAgICAgdGhpcy53YWl0aW5nID0gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmVzdW1lIHRoZSBxdWV1ZSwgc2V0dGluZyBgY29udGVudGAgdG8gYmUgdXNlZCBpbiB0aGUgbmV4dCBvcGVyYXRpb24uXHJcbiAgICAvLyBTZWUgYHdhaXQoKWAgZm9yIGFuIGV4YW1wbGUuXHJcbiAgICBuZXh0OiBmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgIHRoaXMud2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICBpZiAodHlwZW9mIGNvbnRlbnQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91c19jb250ZW50ID0gdGhpcy5jb250ZW50O1xyXG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnRoZW4odGhpcy5jYWxsYmFja3Muc2hpZnQoKSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8gTG9hZCBhIHRlbXBsYXRlIGludG8gdGhlIGNvbnRleHQuXHJcbiAgICAvLyBUaGUgYGxvY2F0aW9uYCBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHJlbW90ZSBwYXRoIHRvIHRoZVxyXG4gICAgLy8gZmlsZSwgYSBqUXVlcnkgb2JqZWN0LCBvciBhIERPTSBlbGVtZW50LlxyXG4gICAgLy9cclxuICAgIC8vIE5vIGludGVycG9sYXRpb24gaGFwcGVucyBieSBkZWZhdWx0LCB0aGUgY29udGVudCBpcyBzdG9yZWQgaW5cclxuICAgIC8vIGBjb250ZW50YC5cclxuICAgIC8vXHJcbiAgICAvLyBJbiB0aGUgY2FzZSBvZiBhIHBhdGgsIHVubGVzcyB0aGUgb3B0aW9uIGB7Y2FjaGU6IGZhbHNlfWAgaXMgcGFzc2VkIHRoZVxyXG4gICAgLy8gZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGFwcCdzIGB0ZW1wbGF0ZUNhY2hlKClgLlxyXG4gICAgLy9cclxuICAgIC8vIElmIGEgalF1ZXJ5IG9yIERPTSBvYmplY3QgaXMgcGFzc2VkIHRoZSBgaW5uZXJIVE1MYCBvZiB0aGUgbm9kZSBpcyBwdWxsZWQgaW4uXHJcbiAgICAvLyBUaGlzIGlzIHVzZWZ1bCBmb3IgbmVzdGluZyB0ZW1wbGF0ZXMgYXMgcGFydCBvZiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQgd3JhcHBlZFxyXG4gICAgLy8gaW4gaW52aXNpYmxlIGVsZW1lbnRzIG9yIGA8c2NyaXB0PmAgdGFncy4gV2l0aCB0ZW1wbGF0ZSBwYXRocywgdGhlIHRlbXBsYXRlXHJcbiAgICAvLyBlbmdpbmUgaXMgbG9va2VkIHVwIGJ5IHRoZSBleHRlbnNpb24uIEZvciBET00valF1ZXJ5IGVtYmVkZGVkIHRlbXBsYXRlcyxcclxuICAgIC8vIHRoaXMgaXNudCBwb3NzaWJsZSwgc28gdGhlcmUgYXJlIGEgY291cGxlIG9mIG9wdGlvbnM6XHJcbiAgICAvL1xyXG4gICAgLy8gICogcGFzcyBhbiBge2VuZ2luZTp9YCBvcHRpb24uXHJcbiAgICAvLyAgKiBkZWZpbmUgdGhlIGVuZ2luZSBpbiB0aGUgYGRhdGEtZW5naW5lYCBhdHRyaWJ1dGUgb2YgdGhlIHBhc3NlZCBub2RlLlxyXG4gICAgLy8gICoganVzdCBzdG9yZSB0aGUgcmF3IHRlbXBsYXRlIGRhdGEgYW5kIHVzZSBgaW50ZXJwb2xhdGUoKWAgbWFudWFsbHlcclxuICAgIC8vXHJcbiAgICAvLyBJZiBhIGBjYWxsYmFja2AgaXMgcGFzc2VkIGl0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSB0ZW1wbGF0ZSBsb2FkLlxyXG4gICAgbG9hZDogZnVuY3Rpb24obG9jYXRpb24sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XHJcbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcclxuICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgc2hvdWxkX2NhY2hlLCBjYWNoZWQsIGlzX2pzb24sIGxvY2F0aW9uX2FycmF5O1xyXG4gICAgICAgIGlmIChfaXNGdW5jdGlvbihvcHRpb25zKSkge1xyXG4gICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xyXG4gICAgICAgICAgb3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2FsbGJhY2spIHsgdGhpcy50aGVuKGNhbGxiYWNrKTsgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgbG9jYXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAvLyBpdCdzIGEgcGF0aFxyXG4gICAgICAgICAgaXNfanNvbiAgICAgID0gKGxvY2F0aW9uLm1hdGNoKC9cXC5qc29uKFxcP3wkKS8pIHx8IG9wdGlvbnMuanNvbik7XHJcbiAgICAgICAgICBzaG91bGRfY2FjaGUgPSBpc19qc29uID8gb3B0aW9ucy5jYWNoZSA9PT0gdHJ1ZSA6IG9wdGlvbnMuY2FjaGUgIT09IGZhbHNlO1xyXG4gICAgICAgICAgY29udGV4dC5uZXh0X2VuZ2luZSA9IGNvbnRleHQuZXZlbnRfY29udGV4dC5lbmdpbmVGb3IobG9jYXRpb24pO1xyXG4gICAgICAgICAgZGVsZXRlIG9wdGlvbnMuY2FjaGU7XHJcbiAgICAgICAgICBkZWxldGUgb3B0aW9ucy5qc29uO1xyXG4gICAgICAgICAgaWYgKG9wdGlvbnMuZW5naW5lKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQubmV4dF9lbmdpbmUgPSBvcHRpb25zLmVuZ2luZTtcclxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZW5naW5lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHNob3VsZF9jYWNoZSAmJiAoY2FjaGVkID0gdGhpcy5ldmVudF9jb250ZXh0LmFwcC50ZW1wbGF0ZUNhY2hlKGxvY2F0aW9uKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMud2FpdCgpO1xyXG4gICAgICAgICAgJC5hamF4KCQuZXh0ZW5kKHtcclxuICAgICAgICAgICAgdXJsOiBsb2NhdGlvbixcclxuICAgICAgICAgICAgZGF0YToge30sXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiBpc19qc29uID8gJ2pzb24nIDogJ3RleHQnLFxyXG4gICAgICAgICAgICB0eXBlOiAnZ2V0JyxcclxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICAgICAgICAgIGlmIChzaG91bGRfY2FjaGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZXZlbnRfY29udGV4dC5hcHAudGVtcGxhdGVDYWNoZShsb2NhdGlvbiwgZGF0YSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNvbnRleHQubmV4dChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSwgb3B0aW9ucykpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBpdCdzIGEgZG9tL2pRdWVyeVxyXG4gICAgICAgICAgaWYgKGxvY2F0aW9uLm5vZGVUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5pbm5lckhUTUw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobG9jYXRpb24uc2VsZWN0b3IpIHtcclxuICAgICAgICAgICAgLy8gaXQncyBhIGpRdWVyeVxyXG4gICAgICAgICAgICBjb250ZXh0Lm5leHRfZW5naW5lID0gbG9jYXRpb24uYXR0cignZGF0YS1lbmdpbmUnKTtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xvbmUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLnJlbW92ZSgpWzBdLmlubmVySFRNTC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvblswXS5pbm5lckhUTUwudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIExvYWQgcGFydGlhbHNcclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdGhpcy5sb2FkUGFydGlhbHMoe215cGFydGlhbDogJy9wYXRoL3RvL3BhcnRpYWwnfSk7XHJcbiAgICAvL1xyXG4gICAgbG9hZFBhcnRpYWxzOiBmdW5jdGlvbihwYXJ0aWFscykge1xyXG4gICAgICB2YXIgbmFtZTtcclxuICAgICAgaWYocGFydGlhbHMpIHtcclxuICAgICAgICB0aGlzLnBhcnRpYWxzID0gdGhpcy5wYXJ0aWFscyB8fCB7fTtcclxuICAgICAgICBmb3IobmFtZSBpbiBwYXJ0aWFscykge1xyXG4gICAgICAgICAgKGZ1bmN0aW9uKGNvbnRleHQsIG5hbWUpIHtcclxuICAgICAgICAgICAgY29udGV4dC5sb2FkKHBhcnRpYWxzW25hbWVdKVxyXG4gICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KSh0aGlzLCBuYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGBsb2FkKClgIGEgdGVtcGxhdGUgYW5kIHRoZW4gYGludGVycG9sYXRlKClgIGl0IHdpdGggZGF0YS5cclxuICAgIC8vXHJcbiAgICAvLyBjYW4gYmUgY2FsbGVkIHdpdGggbXVsdGlwbGUgZGlmZmVyZW50IHNpZ25hdHVyZXM6XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB0aGlzLnJlbmRlcihjYWxsYmFjayk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nKTtcclxuICAgIC8vICAgICAgdGhpcy5yZW5kZXIoJy9sb2NhdGlvbicsIHtzb21lOiBkYXRhfSk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nLCBjYWxsYmFjayk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nLCB7c29tZTogZGF0YX0sIGNhbGxiYWNrKTtcclxuICAgIC8vICAgICAgdGhpcy5yZW5kZXIoJy9sb2NhdGlvbicsIHtzb21lOiBkYXRhfSwge215OiBwYXJ0aWFsc30pO1xyXG4gICAgLy8gICAgICB0aGlzLnJlbmRlcignL2xvY2F0aW9uJywgY2FsbGJhY2ssIHtteTogcGFydGlhbHN9KTtcclxuICAgIC8vICAgICAgdGhpcy5yZW5kZXIoJy9sb2NhdGlvbicsIHtzb21lOiBkYXRhfSwgY2FsbGJhY2ssIHtteTogcGFydGlhbHN9KTtcclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgdGhpcy5yZW5kZXIoJ215dGVtcGxhdGUudGVtcGxhdGUnLCB7bmFtZTogJ3Rlc3QnfSk7XHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIHJlbmRlcjogZnVuY3Rpb24obG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBwYXJ0aWFscykge1xyXG4gICAgICBpZiAoX2lzRnVuY3Rpb24obG9jYXRpb24pICYmICFkYXRhKSB7XHJcbiAgICAgICAgLy8gaW52b2tlZCBhcyByZW5kZXIoY2FsbGJhY2spXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihsb2NhdGlvbik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYoX2lzRnVuY3Rpb24oZGF0YSkpIHtcclxuICAgICAgICAgIC8vIGludm9rZWQgYXMgcmVuZGVyKGxvY2F0aW9uLCBjYWxsYmFjaywgW3BhcnRpYWxzXSlcclxuICAgICAgICAgIHBhcnRpYWxzID0gY2FsbGJhY2s7XHJcbiAgICAgICAgICBjYWxsYmFjayA9IGRhdGE7XHJcbiAgICAgICAgICBkYXRhID0gbnVsbDtcclxuICAgICAgICB9IGVsc2UgaWYoY2FsbGJhY2sgJiYgIV9pc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xyXG4gICAgICAgICAgLy8gaW52b2tlZCBhcyByZW5kZXIobG9jYXRpb24sIGRhdGEsIHBhcnRpYWxzKVxyXG4gICAgICAgICAgcGFydGlhbHMgPSBjYWxsYmFjaztcclxuICAgICAgICAgIGNhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRQYXJ0aWFscyhwYXJ0aWFscylcclxuICAgICAgICAgICAgICAgICAgIC5sb2FkKGxvY2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgLmludGVycG9sYXRlKGRhdGEsIGxvY2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgLnRoZW4oY2FsbGJhY2spO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGByZW5kZXIoKWAgdGhlIGBsb2NhdGlvbmAgd2l0aCBgZGF0YWAgYW5kIHRoZW4gYHN3YXAoKWAgdGhlXHJcbiAgICAvLyBhcHAncyBgJGVsZW1lbnRgIHdpdGggdGhlIHJlbmRlcmVkIGNvbnRlbnQuXHJcbiAgICBwYXJ0aWFsOiBmdW5jdGlvbihsb2NhdGlvbiwgZGF0YSwgY2FsbGJhY2ssIHBhcnRpYWxzKSB7XHJcbiAgICAgIGlmIChfaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcclxuICAgICAgICAvLyBpbnZva2VkIGFzIHBhcnRpYWwobG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBbcGFydGlhbHNdKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcihsb2NhdGlvbiwgZGF0YSwgcGFydGlhbHMpLnN3YXAoY2FsbGJhY2spO1xyXG4gICAgICB9IGVsc2UgaWYgKF9pc0Z1bmN0aW9uKGRhdGEpKSB7XHJcbiAgICAgICAgLy8gaW52b2tlZCBhcyBwYXJ0aWFsKGxvY2F0aW9uLCBjYWxsYmFjaywgW3BhcnRpYWxzXSlcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIobG9jYXRpb24sIHt9LCBjYWxsYmFjaykuc3dhcChkYXRhKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBpbnZva2VkIGFzIHBhcnRpYWwobG9jYXRpb24sIGRhdGEsIFtwYXJ0aWFsc10pXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKGxvY2F0aW9uLCBkYXRhLCBjYWxsYmFjaykuc3dhcCgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGRlZmVycyB0aGUgY2FsbCBvZiBmdW5jdGlvbiB0byBvY2N1ciBpbiBvcmRlciBvZiB0aGUgcmVuZGVyIHF1ZXVlLlxyXG4gICAgLy8gVGhlIGZ1bmN0aW9uIGNhbiBhY2NlcHQgYW55IG51bWJlciBvZiBhcmd1bWVudHMgYXMgbG9uZyBhcyB0aGUgbGFzdFxyXG4gICAgLy8gYXJndW1lbnQgaXMgYSBjYWxsYmFjayBmdW5jdGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIHB1dHRpbmcgYXJiaXRyYXJ5XHJcbiAgICAvLyBhc3luY2hyb25vdXMgZnVuY3Rpb25zIGludG8gdGhlIHF1ZXVlLiBUaGUgY29udGVudCBwYXNzZWQgdG8gdGhlXHJcbiAgICAvLyBjYWxsYmFjayBpcyBwYXNzZWQgYXMgYGNvbnRlbnRgIHRvIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHF1ZXVlLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgIHRoaXMuc2VuZCgkLmdldEpTT04sICcvYXBwLmpzb24nKVxyXG4gICAgLy8gICAgICAgICAudGhlbihmdW5jdGlvbihqc29uKSB7XHJcbiAgICAvLyAgICAgICAgICAgJCgnI21lc3NhZ2UpLnRleHQoanNvblsnbWVzc2FnZSddKTtcclxuICAgIC8vICAgICAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vXHJcbiAgICBzZW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLFxyXG4gICAgICAgICAgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKSxcclxuICAgICAgICAgIGZ1biAgPSBhcmdzLnNoaWZ0KCk7XHJcblxyXG4gICAgICBpZiAoX2lzQXJyYXkoYXJnc1swXSkpIHsgYXJncyA9IGFyZ3NbMF07IH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgIGFyZ3MucHVzaChmdW5jdGlvbihyZXNwb25zZSkgeyBjb250ZXh0Lm5leHQocmVzcG9uc2UpOyB9KTtcclxuICAgICAgICBjb250ZXh0LndhaXQoKTtcclxuICAgICAgICBmdW4uYXBwbHkoZnVuLCBhcmdzKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBpdGVyYXRlcyBvdmVyIGFuIGFycmF5LCBhcHBseWluZyB0aGUgY2FsbGJhY2sgZm9yIGVhY2ggaXRlbSBpdGVtLiB0aGVcclxuICAgIC8vIGNhbGxiYWNrIHRha2VzIHRoZSBzYW1lIHN0eWxlIG9mIGFyZ3VtZW50cyBhcyBgalF1ZXJ5LmVhY2goKWAgKGluZGV4LCBpdGVtKS5cclxuICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgb2YgZWFjaCBjYWxsYmFjayBpcyBjb2xsZWN0ZWQgYXMgYSBzaW5nbGUgc3RyaW5nIGFuZCBzdG9yZWRcclxuICAgIC8vIGFzIGBjb250ZW50YCB0byBiZSB1c2VkIGluIHRoZSBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgYFJlbmRlckNvbnRleHRgLlxyXG4gICAgY29sbGVjdDogZnVuY3Rpb24oYXJyYXksIGNhbGxiYWNrLCBub3cpIHtcclxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xyXG4gICAgICB2YXIgY29sbCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChfaXNGdW5jdGlvbihhcnJheSkpIHtcclxuICAgICAgICAgIGNhbGxiYWNrID0gYXJyYXk7XHJcbiAgICAgICAgICBhcnJheSA9IHRoaXMuY29udGVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNvbnRlbnRzID0gW10sIGRvbXMgPSBmYWxzZTtcclxuICAgICAgICAkLmVhY2goYXJyYXksIGZ1bmN0aW9uKGksIGl0ZW0pIHtcclxuICAgICAgICAgIHZhciByZXR1cm5lZCA9IGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIFtpLCBpdGVtXSk7XHJcbiAgICAgICAgICBpZiAocmV0dXJuZWQuanF1ZXJ5ICYmIHJldHVybmVkLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybmVkID0gcmV0dXJuZWRbMF07XHJcbiAgICAgICAgICAgIGRvbXMgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29udGVudHMucHVzaChyZXR1cm5lZCk7XHJcbiAgICAgICAgICByZXR1cm4gcmV0dXJuZWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGRvbXMgPyBjb250ZW50cyA6IGNvbnRlbnRzLmpvaW4oJycpO1xyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbm93ID8gY29sbCgpIDogdGhpcy50aGVuKGNvbGwpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBsb2FkcyBhIHRlbXBsYXRlLCBhbmQgdGhlbiBpbnRlcnBvbGF0ZXMgaXQgZm9yIGVhY2ggaXRlbSBpbiB0aGUgYGRhdGFgXHJcbiAgICAvLyBhcnJheS4gSWYgYSBjYWxsYmFjayBpcyBwYXNzZWQsIGl0IHdpbGwgY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBlYWNoXHJcbiAgICAvLyBpdGVtIGluIHRoZSBhcnJheSBfYWZ0ZXJfIGludGVycG9sYXRpb25cclxuICAgIHJlbmRlckVhY2g6IGZ1bmN0aW9uKGxvY2F0aW9uLCBuYW1lLCBkYXRhLCBjYWxsYmFjaykge1xyXG4gICAgICBpZiAoX2lzQXJyYXkobmFtZSkpIHtcclxuICAgICAgICBjYWxsYmFjayA9IGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IG5hbWU7XHJcbiAgICAgICAgbmFtZSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMubG9hZChsb2NhdGlvbikudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgICAgICB2YXIgcmN0eCA9IHRoaXM7XHJcbiAgICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgICAgZGF0YSA9IF9pc0FycmF5KHRoaXMucHJldmlvdXNfY29udGVudCkgPyB0aGlzLnByZXZpb3VzX2NvbnRlbnQgOiBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAkLmVhY2goZGF0YSwgZnVuY3Rpb24oaSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICB2YXIgaWRhdGEgPSB7fSwgZW5naW5lID0gdGhpcy5uZXh0X2VuZ2luZSB8fCBsb2NhdGlvbjtcclxuICAgICAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICAgICAgaWRhdGFbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWRhdGEgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY2FsbGJhY2sodmFsdWUsIHJjdHguZXZlbnRfY29udGV4dC5pbnRlcnBvbGF0ZShjb250ZW50LCBpZGF0YSwgZW5naW5lKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdChkYXRhLCBmdW5jdGlvbihpLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHZhciBpZGF0YSA9IHt9LCBlbmdpbmUgPSB0aGlzLm5leHRfZW5naW5lIHx8IGxvY2F0aW9uO1xyXG4gICAgICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpZGF0YVtuYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZGF0YSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ldmVudF9jb250ZXh0LmludGVycG9sYXRlKGNvbnRlbnQsIGlkYXRhLCBlbmdpbmUpO1xyXG4gICAgICAgICAgICB9LCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHVzZXMgdGhlIHByZXZpb3VzIGxvYWRlZCBgY29udGVudGAgYW5kIHRoZSBgZGF0YWAgb2JqZWN0IHRvIGludGVycG9sYXRlXHJcbiAgICAvLyBhIHRlbXBsYXRlLiBgZW5naW5lYCBkZWZpbmVzIHRoZSB0ZW1wbGF0aW5nL2ludGVycG9sYXRpb24gbWV0aG9kL2VuZ2luZVxyXG4gICAgLy8gdGhhdCBzaG91bGQgYmUgdXNlZC4gSWYgYGVuZ2luZWAgaXMgbm90IHBhc3NlZCwgdGhlIGBuZXh0X2VuZ2luZWAgaXNcclxuICAgIC8vIHVzZWQuIElmIGByZXRhaW5gIGlzIGB0cnVlYCwgdGhlIGZpbmFsIGludGVycG9sYXRlZCBkYXRhIGlzIGFwcGVuZGVkIHRvXHJcbiAgICAvLyB0aGUgYHByZXZpb3VzX2NvbnRlbnRgIGluc3RlYWQgb2YganVzdCByZXBsYWNpbmcgaXQuXHJcbiAgICBpbnRlcnBvbGF0ZTogZnVuY3Rpb24oZGF0YSwgZW5naW5lLCByZXRhaW4pIHtcclxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xyXG4gICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGNvbnRlbnQsIHByZXYpIHtcclxuICAgICAgICBpZiAoIWRhdGEgJiYgcHJldikgeyBkYXRhID0gcHJldjsgfVxyXG4gICAgICAgIGlmICh0aGlzLm5leHRfZW5naW5lKSB7XHJcbiAgICAgICAgICBlbmdpbmUgPSB0aGlzLm5leHRfZW5naW5lO1xyXG4gICAgICAgICAgdGhpcy5uZXh0X2VuZ2luZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVuZGVyZWQgPSBjb250ZXh0LmV2ZW50X2NvbnRleHQuaW50ZXJwb2xhdGUoY29udGVudCwgZGF0YSwgZW5naW5lLCB0aGlzLnBhcnRpYWxzKTtcclxuICAgICAgICByZXR1cm4gcmV0YWluID8gcHJldiArIHJlbmRlcmVkIDogcmVuZGVyZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBTd2FwIHRoZSByZXR1cm4gY29udGVudHMgZW5zdXJpbmcgb3JkZXIuIFNlZSBgQXBwbGljYXRpb24jc3dhcGBcclxuICAgIHN3YXA6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnRfY29udGV4dC5zd2FwKGNvbnRlbnQsIGNhbGxiYWNrKTtcclxuICAgICAgICByZXR1cm4gY29udGVudDtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gU2FtZSB1c2FnZSBhcyBgalF1ZXJ5LmZuLmFwcGVuZFRvKClgIGJ1dCB1c2VzIGB0aGVuKClgIHRvIGVuc3VyZSBvcmRlclxyXG4gICAgYXBwZW5kVG86IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgICQoc2VsZWN0b3IpLmFwcGVuZChjb250ZW50KTtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gU2FtZSB1c2FnZSBhcyBgalF1ZXJ5LmZuLnByZXBlbmRUbygpYCBidXQgdXNlcyBgdGhlbigpYCB0byBlbnN1cmUgb3JkZXJcclxuICAgIHByZXBlbmRUbzogZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgICAgJChzZWxlY3RvcikucHJlcGVuZChjb250ZW50KTtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmVwbGFjZXMgdGhlIGAkKHNlbGVjdG9yKWAgdXNpbmcgYGh0bWwoKWAgd2l0aCB0aGUgcHJldmlvdXNseSBsb2FkZWRcclxuICAgIC8vIGBjb250ZW50YFxyXG4gICAgcmVwbGFjZTogZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgICAgJChzZWxlY3RvcikuaHRtbChjb250ZW50KTtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gdHJpZ2dlciB0aGUgZXZlbnQgaW4gdGhlIG9yZGVyIG9mIHRoZSBldmVudCBjb250ZXh0LiBTYW1lIHNlbWFudGljc1xyXG4gICAgLy8gYXMgYFNhbW15LkV2ZW50Q29udGV4dCN0cmlnZ2VyKClgLiBJZiBkYXRhIGlzIG9taXR0ZWQsIGBjb250ZW50YFxyXG4gICAgLy8gaXMgc2VudCBhcyBge2NvbnRlbnQ6IGNvbnRlbnR9YFxyXG4gICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZGF0YSkge1xyXG4gICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGNvbnRlbnQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT0gJ3VuZGVmaW5lZCcpIHsgZGF0YSA9IHtjb250ZW50OiBjb250ZW50fTsgfVxyXG4gICAgICAgIHRoaXMuZXZlbnRfY29udGV4dC50cmlnZ2VyKG5hbWUsIGRhdGEpO1xyXG4gICAgICAgIHJldHVybiBjb250ZW50O1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfSk7XHJcblxyXG4gIC8vIGBTYW1teS5FdmVudENvbnRleHRgIG9iamVjdHMgYXJlIGNyZWF0ZWQgZXZlcnkgdGltZSBhIHJvdXRlIGlzIHJ1biBvciBhXHJcbiAgLy8gYm91bmQgZXZlbnQgaXMgdHJpZ2dlcmVkLiBUaGUgY2FsbGJhY2tzIGZvciB0aGVzZSBldmVudHMgYXJlIGV2YWx1YXRlZCB3aXRoaW4gYSBgU2FtbXkuRXZlbnRDb250ZXh0YFxyXG4gIC8vIFRoaXMgd2l0aGluIHRoZXNlIGNhbGxiYWNrcyB0aGUgc3BlY2lhbCBtZXRob2RzIG9mIGBFdmVudENvbnRleHRgIGFyZSBhdmFpbGFibGUuXHJcbiAgLy9cclxuICAvLyAjIyMgRXhhbXBsZVxyXG4gIC8vXHJcbiAgLy8gICAgICAgJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAvLyAgICAgICAgIC8vIFRoZSBjb250ZXh0IGhlcmUgaXMgdGhpcyBTYW1teS5BcHBsaWNhdGlvblxyXG4gIC8vICAgICAgICAgdGhpcy5nZXQoJyMvOm5hbWUnLCBmdW5jdGlvbigpIHtcclxuICAvLyAgICAgICAgICAgLy8gVGhlIGNvbnRleHQgaGVyZSBpcyBhIG5ldyBTYW1teS5FdmVudENvbnRleHRcclxuICAvLyAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zWyduYW1lJ10gPT0gJ3NhbW15Jykge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMucGFydGlhbCgnbmFtZS5odG1sLmVyYicsIHtuYW1lOiAnU2FtbXknfSk7XHJcbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5yZWRpcmVjdCgnIy9zb21ld2hlcmUtZWxzZScpXHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vXHJcbiAgLy8gSW5pdGlhbGl6ZSBhIG5ldyBFdmVudENvbnRleHRcclxuICAvL1xyXG4gIC8vICMjIyBBcmd1bWVudHNcclxuICAvL1xyXG4gIC8vICogYGFwcGAgVGhlIGBTYW1teS5BcHBsaWNhdGlvbmAgdGhpcyBldmVudCBpcyBjYWxsZWQgd2l0aGluLlxyXG4gIC8vICogYHZlcmJgIFRoZSB2ZXJiIGludm9rZWQgdG8gcnVuIHRoaXMgY29udGV4dC9yb3V0ZS5cclxuICAvLyAqIGBwYXRoYCBUaGUgc3RyaW5nIHBhdGggaW52b2tlZCB0byBydW4gdGhpcyBjb250ZXh0L3JvdXRlLlxyXG4gIC8vICogYHBhcmFtc2AgQW4gT2JqZWN0IG9mIG9wdGlvbmFsIHBhcmFtcyB0byBwYXNzIHRvIHRoZSBjb250ZXh0LiBJcyBjb252ZXJ0ZWRcclxuICAvLyAgIHRvIGEgYFNhbW15Lk9iamVjdGAuXHJcbiAgLy8gKiBgdGFyZ2V0YCBhIERPTSBlbGVtZW50IHRoYXQgdGhlIGV2ZW50IHRoYXQgaG9sZHMgdGhpcyBjb250ZXh0IG9yaWdpbmF0ZXNcclxuICAvLyAgIGZyb20uIEZvciBwb3N0LCBwdXQgYW5kIGRlbCByb3V0ZXMsIHRoaXMgaXMgdGhlIGZvcm0gZWxlbWVudCB0aGF0IHRyaWdnZXJlZFxyXG4gIC8vICAgdGhlIHJvdXRlLlxyXG4gIC8vXHJcbiAgU2FtbXkuRXZlbnRDb250ZXh0ID0gZnVuY3Rpb24oYXBwLCB2ZXJiLCBwYXRoLCBwYXJhbXMsIHRhcmdldCkge1xyXG4gICAgdGhpcy5hcHAgICAgPSBhcHA7XHJcbiAgICB0aGlzLnZlcmIgICA9IHZlcmI7XHJcbiAgICB0aGlzLnBhdGggICA9IHBhdGg7XHJcbiAgICB0aGlzLnBhcmFtcyA9IG5ldyBTYW1teS5PYmplY3QocGFyYW1zKTtcclxuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gIH07XHJcblxyXG4gIFNhbW15LkV2ZW50Q29udGV4dC5wcm90b3R5cGUgPSAkLmV4dGVuZCh7fSwgU2FtbXkuT2JqZWN0LnByb3RvdHlwZSwge1xyXG5cclxuICAgIC8vIEEgc2hvcnRjdXQgdG8gdGhlIGFwcCdzIGAkZWxlbWVudCgpYFxyXG4gICAgJGVsZW1lbnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcHAuJGVsZW1lbnQoX21ha2VBcnJheShhcmd1bWVudHMpLnNoaWZ0KCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBMb29rIHVwIGEgdGVtcGxhdGluZyBlbmdpbmUgd2l0aGluIHRoZSBjdXJyZW50IGFwcCBhbmQgY29udGV4dC5cclxuICAgIC8vIGBlbmdpbmVgIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcclxuICAgIC8vXHJcbiAgICAvLyAqIGEgZnVuY3Rpb246IHNob3VsZCBjb25mb3JtIHRvIGBmdW5jdGlvbihjb250ZW50LCBkYXRhKSB7IHJldHVybiBpbnRlcnBvbGF0ZWQ7IH1gXHJcbiAgICAvLyAqIGEgdGVtcGxhdGUgcGF0aDogJ3RlbXBsYXRlLmVqcycsIGxvb2tzIHVwIHRoZSBleHRlbnNpb24gdG8gbWF0Y2ggdG9cclxuICAgIC8vICAgdGhlIGBlanMoKWAgaGVscGVyXHJcbiAgICAvLyAqIGEgc3RyaW5nIHJlZmVycmluZyB0byB0aGUgaGVscGVyOiBcIm11c3RhY2hlXCIgPT4gYG11c3RhY2hlKClgXHJcbiAgICAvL1xyXG4gICAgLy8gSWYgbm8gZW5naW5lIGlzIGZvdW5kLCB1c2UgdGhlIGFwcCdzIGRlZmF1bHQgYHRlbXBsYXRlX2VuZ2luZWBcclxuICAgIC8vXHJcbiAgICBlbmdpbmVGb3I6IGZ1bmN0aW9uKGVuZ2luZSkge1xyXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXMsIGVuZ2luZV9tYXRjaDtcclxuICAgICAgLy8gaWYgcGF0aCBpcyBhY3R1YWxseSBhbiBlbmdpbmUgZnVuY3Rpb24ganVzdCByZXR1cm4gaXRcclxuICAgICAgaWYgKF9pc0Z1bmN0aW9uKGVuZ2luZSkpIHsgcmV0dXJuIGVuZ2luZTsgfVxyXG4gICAgICAvLyBsb29rdXAgZW5naW5lIG5hbWUgYnkgcGF0aCBleHRlbnNpb25cclxuICAgICAgZW5naW5lID0gKGVuZ2luZSB8fCBjb250ZXh0LmFwcC50ZW1wbGF0ZV9lbmdpbmUpLnRvU3RyaW5nKCk7XHJcbiAgICAgIGlmICgoZW5naW5lX21hdGNoID0gZW5naW5lLm1hdGNoKC9cXC4oW15cXC5cXD9cXCNdKykoXFw/fCQpLykpKSB7XHJcbiAgICAgICAgZW5naW5lID0gZW5naW5lX21hdGNoWzFdO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHNldCB0aGUgZW5naW5lIHRvIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGVuZ2luZSBpZiBubyBtYXRjaCBpcyBmb3VuZFxyXG4gICAgICBpZiAoZW5naW5lICYmIF9pc0Z1bmN0aW9uKGNvbnRleHRbZW5naW5lXSkpIHtcclxuICAgICAgICByZXR1cm4gY29udGV4dFtlbmdpbmVdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29udGV4dC5hcHAudGVtcGxhdGVfZW5naW5lKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5naW5lRm9yKGNvbnRleHQuYXBwLnRlbXBsYXRlX2VuZ2luZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRlbnQsIGRhdGEpIHsgcmV0dXJuIGNvbnRlbnQ7IH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHVzaW5nIHRoZSB0ZW1wbGF0ZSBgZW5naW5lYCBmb3VuZCB3aXRoIGBlbmdpbmVGb3IoKWAsIGludGVycG9sYXRlIHRoZVxyXG4gICAgLy8gYGRhdGFgIGludG8gYGNvbnRlbnRgXHJcbiAgICBpbnRlcnBvbGF0ZTogZnVuY3Rpb24oY29udGVudCwgZGF0YSwgZW5naW5lLCBwYXJ0aWFscykge1xyXG4gICAgICByZXR1cm4gdGhpcy5lbmdpbmVGb3IoZW5naW5lKS5hcHBseSh0aGlzLCBbY29udGVudCwgZGF0YSwgcGFydGlhbHNdKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBgU2FtbXkuUmVuZGVyQ29udGV4dGAgY2FsbGluZyBgcmVuZGVyKClgIG9uIGl0LlxyXG4gICAgLy8gTG9hZHMgdGhlIHRlbXBsYXRlIGFuZCBpbnRlcnBvbGF0ZSB0aGUgZGF0YSwgaG93ZXZlciBkb2VzIG5vdCBhY3R1YWxcclxuICAgIC8vIHBsYWNlIGl0IGluIHRoZSBET00uXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIC8vIG15dGVtcGxhdGUubXVzdGFjaGUgPGRpdiBjbGFzcz1cIm5hbWVcIj57e25hbWV9fTwvZGl2PlxyXG4gICAgLy8gICAgICByZW5kZXIoJ215dGVtcGxhdGUubXVzdGFjaGUnLCB7bmFtZTogJ3F1aXJrZXknfSk7XHJcbiAgICAvLyAgICAgIC8vIHNldHMgdGhlIGBjb250ZW50YCB0byA8ZGl2IGNsYXNzPVwibmFtZVwiPnF1aXJrZXk8L2Rpdj5cclxuICAgIC8vICAgICAgcmVuZGVyKCdteXRlbXBsYXRlLm11c3RhY2hlJywge25hbWU6ICdxdWlya2V5J30pXHJcbiAgICAvLyAgICAgICAgLmFwcGVuZFRvKCd1bCcpO1xyXG4gICAgLy8gICAgICAvLyBhcHBlbmRzIHRoZSByZW5kZXJlZCBjb250ZW50IHRvICQoJ3VsJylcclxuICAgIC8vXHJcbiAgICByZW5kZXI6IGZ1bmN0aW9uKGxvY2F0aW9uLCBkYXRhLCBjYWxsYmFjaywgcGFydGlhbHMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBTYW1teS5SZW5kZXJDb250ZXh0KHRoaXMpLnJlbmRlcihsb2NhdGlvbiwgZGF0YSwgY2FsbGJhY2ssIHBhcnRpYWxzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBgU2FtbXkuUmVuZGVyQ29udGV4dGAgY2FsbGluZyBgcmVuZGVyRWFjaCgpYCBvbiBpdC5cclxuICAgIC8vIExvYWRzIHRoZSB0ZW1wbGF0ZSBhbmQgaW50ZXJwb2xhdGVzIHRoZSBkYXRhIGZvciBlYWNoIGl0ZW0sXHJcbiAgICAvLyBob3dldmVyIGRvZXMgbm90IGFjdHVhbCBwbGFjZSBpdCBpbiB0aGUgRE9NLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAvLyBteXRlbXBsYXRlLm11c3RhY2hlIDxkaXYgY2xhc3M9XCJuYW1lXCI+e3tuYW1lfX08L2Rpdj5cclxuICAgIC8vICAgICAgcmVuZGVyRWFjaCgnbXl0ZW1wbGF0ZS5tdXN0YWNoZScsIFt7bmFtZTogJ3F1aXJrZXknfSwge25hbWU6ICdlbmRvcid9XSlcclxuICAgIC8vICAgICAgLy8gc2V0cyB0aGUgYGNvbnRlbnRgIHRvIDxkaXYgY2xhc3M9XCJuYW1lXCI+cXVpcmtleTwvZGl2PjxkaXYgY2xhc3M9XCJuYW1lXCI+ZW5kb3I8L2Rpdj5cclxuICAgIC8vICAgICAgcmVuZGVyRWFjaCgnbXl0ZW1wbGF0ZS5tdXN0YWNoZScsIFt7bmFtZTogJ3F1aXJrZXknfSwge25hbWU6ICdlbmRvcid9XSkuYXBwZW5kVG8oJ3VsJyk7XHJcbiAgICAvLyAgICAgIC8vIGFwcGVuZHMgdGhlIHJlbmRlcmVkIGNvbnRlbnQgdG8gJCgndWwnKVxyXG4gICAgLy9cclxuICAgIHJlbmRlckVhY2g6IGZ1bmN0aW9uKGxvY2F0aW9uLCBuYW1lLCBkYXRhLCBjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcykucmVuZGVyRWFjaChsb2NhdGlvbiwgbmFtZSwgZGF0YSwgY2FsbGJhY2spO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBjcmVhdGUgYSBuZXcgYFNhbW15LlJlbmRlckNvbnRleHRgIGNhbGxpbmcgYGxvYWQoKWAgd2l0aCBgbG9jYXRpb25gIGFuZFxyXG4gICAgLy8gYG9wdGlvbnNgLiBDYWxsZWQgd2l0aG91dCBpbnRlcnBvbGF0aW9uIG9yIHBsYWNlbWVudCwgdGhpcyBhbGxvd3MgZm9yXHJcbiAgICAvLyBwcmVsb2FkaW5nL2NhY2hpbmcgdGhlIHRlbXBsYXRlcy5cclxuICAgIGxvYWQ6IGZ1bmN0aW9uKGxvY2F0aW9uLCBvcHRpb25zLCBjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcykubG9hZChsb2NhdGlvbiwgb3B0aW9ucywgY2FsbGJhY2spO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBjcmVhdGUgYSBuZXcgYFNhbW15LlJlbmRlckNvbnRleHRgIGNhbGxpbmcgYGxvYWRQYXJ0aWFscygpYCB3aXRoIGBwYXJ0aWFsc2AuXHJcbiAgICBsb2FkUGFydGlhbHM6IGZ1bmN0aW9uKHBhcnRpYWxzKSB7XHJcbiAgICAgIHJldHVybiBuZXcgU2FtbXkuUmVuZGVyQ29udGV4dCh0aGlzKS5sb2FkUGFydGlhbHMocGFydGlhbHMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBgcmVuZGVyKClgIHRoZSBgbG9jYXRpb25gIHdpdGggYGRhdGFgIGFuZCB0aGVuIGBzd2FwKClgIHRoZVxyXG4gICAgLy8gYXBwJ3MgYCRlbGVtZW50YCB3aXRoIHRoZSByZW5kZXJlZCBjb250ZW50LlxyXG4gICAgcGFydGlhbDogZnVuY3Rpb24obG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBwYXJ0aWFscykge1xyXG4gICAgICByZXR1cm4gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcykucGFydGlhbChsb2NhdGlvbiwgZGF0YSwgY2FsbGJhY2ssIHBhcnRpYWxzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gY3JlYXRlIGEgbmV3IGBTYW1teS5SZW5kZXJDb250ZXh0YCBjYWxsaW5nIGBzZW5kKClgIHdpdGggYW4gYXJiaXRyYXJ5XHJcbiAgICAvLyBmdW5jdGlvblxyXG4gICAgc2VuZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciByY3R4ID0gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcyk7XHJcbiAgICAgIHJldHVybiByY3R4LnNlbmQuYXBwbHkocmN0eCwgYXJndW1lbnRzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQ2hhbmdlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgd2luZG93LiBJZiBgdG9gIGJlZ2lucyB3aXRoXHJcbiAgICAvLyAnIycgaXQgb25seSBjaGFuZ2VzIHRoZSBkb2N1bWVudCdzIGhhc2guIElmIHBhc3NlZCBtb3JlIHRoYW4gMSBhcmd1bWVudFxyXG4gICAgLy8gcmVkaXJlY3Qgd2lsbCBqb2luIHRoZW0gdG9nZXRoZXIgd2l0aCBmb3J3YXJkIHNsYXNoZXMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHJlZGlyZWN0KCcjL290aGVyL3JvdXRlJyk7XHJcbiAgICAvLyAgICAgIC8vIGVxdWl2YWxlbnQgdG9cclxuICAgIC8vICAgICAgcmVkaXJlY3QoJyMnLCAnb3RoZXInLCAncm91dGUnKTtcclxuICAgIC8vXHJcbiAgICByZWRpcmVjdDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciB0bywgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKSxcclxuICAgICAgICAgIGN1cnJlbnRfbG9jYXRpb24gPSB0aGlzLmFwcC5nZXRMb2NhdGlvbigpLFxyXG4gICAgICAgICAgbCA9IGFyZ3MubGVuZ3RoO1xyXG4gICAgICBpZiAobCA+IDEpIHtcclxuICAgICAgICB2YXIgaSA9IDAsIHBhdGhzID0gW10sIHBhaXJzID0gW10sIHBhcmFtcyA9IHt9LCBoYXNfcGFyYW1zID0gZmFsc2U7XHJcbiAgICAgICAgZm9yICg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgYXJnc1tpXSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBwYXRocy5wdXNoKGFyZ3NbaV0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJC5leHRlbmQocGFyYW1zLCBhcmdzW2ldKTtcclxuICAgICAgICAgICAgaGFzX3BhcmFtcyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRvID0gcGF0aHMuam9pbignLycpO1xyXG4gICAgICAgIGlmIChoYXNfcGFyYW1zKSB7XHJcbiAgICAgICAgICBmb3IgKHZhciBrIGluIHBhcmFtcykge1xyXG4gICAgICAgICAgICBwYWlycy5wdXNoKHRoaXMuYXBwLl9lbmNvZGVGb3JtUGFpcihrLCBwYXJhbXNba10pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRvICs9ICc/JyArIHBhaXJzLmpvaW4oJyYnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG8gPSBhcmdzWzBdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHJpZ2dlcigncmVkaXJlY3QnLCB7dG86IHRvfSk7XHJcbiAgICAgIHRoaXMuYXBwLmxhc3RfbG9jYXRpb24gPSBbdGhpcy52ZXJiLCB0aGlzLnBhdGhdO1xyXG4gICAgICB0aGlzLmFwcC5zZXRMb2NhdGlvbih0byk7XHJcbiAgICAgIGlmIChuZXcgUmVnRXhwKHRvKS50ZXN0KGN1cnJlbnRfbG9jYXRpb24pKSB7XHJcbiAgICAgICAgdGhpcy5hcHAudHJpZ2dlcignbG9jYXRpb24tY2hhbmdlZCcpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFRyaWdnZXJzIGV2ZW50cyBvbiBgYXBwYCB3aXRoaW4gdGhlIGN1cnJlbnQgY29udGV4dC5cclxuICAgIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHtcclxuICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICd1bmRlZmluZWQnKSB7IGRhdGEgPSB7fTsgfVxyXG4gICAgICBpZiAoIWRhdGEuY29udGV4dCkgeyBkYXRhLmNvbnRleHQgPSB0aGlzOyB9XHJcbiAgICAgIHJldHVybiB0aGlzLmFwcC50cmlnZ2VyKG5hbWUsIGRhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBIHNob3J0Y3V0IHRvIGFwcCdzIGBldmVudE5hbWVzcGFjZSgpYFxyXG4gICAgZXZlbnROYW1lc3BhY2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQSBzaG9ydGN1dCB0byBhcHAncyBgc3dhcCgpYFxyXG4gICAgc3dhcDogZnVuY3Rpb24oY29udGVudHMsIGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFwcC5zd2FwKGNvbnRlbnRzLCBjYWxsYmFjayk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJhaXNlcyBhIHBvc3NpYmxlIGBub3RGb3VuZCgpYCBlcnJvciBmb3IgdGhlIGN1cnJlbnQgcGF0aC5cclxuICAgIG5vdEZvdW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBwLm5vdEZvdW5kKHRoaXMudmVyYiwgdGhpcy5wYXRoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gRGVmYXVsdCBKU09OIHBhcnNpbmcgdXNlcyBqUXVlcnkncyBgcGFyc2VKU09OKClgLiBJbmNsdWRlIGBTYW1teS5KU09OYFxyXG4gICAgLy8gcGx1Z2luIGZvciB0aGUgbW9yZSBjb25mb3JtYW50IFwiY3JvY2tmb3JkIHNwZWNpYWxcIi5cclxuICAgIGpzb246IGZ1bmN0aW9uKHN0cmluZykge1xyXG4gICAgICByZXR1cm4gJC5wYXJzZUpTT04oc3RyaW5nKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gLy89PiBTYW1teS5FdmVudENvbnRleHQ6IGdldCAjLyB7fVxyXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gXCJTYW1teS5FdmVudENvbnRleHQ6IFwiICsgW3RoaXMudmVyYiwgdGhpcy5wYXRoLCB0aGlzLnBhcmFtc10uam9pbignICcpO1xyXG4gICAgfVxyXG5cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIFNhbW15O1xyXG59KTtcclxuXHJcblxuOyBicm93c2VyaWZ5X3NoaW1fX2RlZmluZV9fbW9kdWxlX19leHBvcnRfXyh0eXBlb2YgU2FtbXkgIT0gXCJ1bmRlZmluZWRcIiA/IFNhbW15IDogd2luZG93LlNhbW15KTtcblxufSkuY2FsbChnbG9iYWwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZnVuY3Rpb24gZGVmaW5lRXhwb3J0KGV4KSB7IG1vZHVsZS5leHBvcnRzID0gZXg7IH0pO1xuIl19
},{"jquery":109}],94:[function(require,module,exports){
(function (global){

; jQuery = global.jQuery = require("jquery");
; var __browserify_shim_require__=require;(function browserifyShim(module, define, require) {
/*
Copyright 2012 Igor Vaynberg

Version: 3.4.2 Timestamp: Mon Aug 12 15:04:12 PDT 2013

This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
General Public License version 2 (the "GPL License"). You may choose either license to govern your
use of this software only upon the condition that you accept all of the terms of either the Apache
License or the GPL License.

You may obtain a copy of the Apache License and the GPL License at:

    http://www.apache.org/licenses/LICENSE-2.0
    http://www.gnu.org/licenses/gpl-2.0.html

Unless required by applicable law or agreed to in writing, software distributed under the
Apache License or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
the specific language governing permissions and limitations under the Apache License and the GPL License.
*/
(function ($) {
    if(typeof $.fn.each2 == "undefined") {
        $.extend($.fn, {
            /*
            * 4-10 times faster .each replacement
            * use it carefully, as it overrides jQuery context of element on each iteration
            */
            each2 : function (c) {
                var j = $([0]), i = -1, l = this.length;
                while (
                    ++i < l
                    && (j.context = j[0] = this[i])
                    && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
                );
                return this;
            }
        });
    }
})(jQuery);

(function ($, undefined) {
    "use strict";
    /*global document, window, jQuery, console */

    if (window.Select2 !== undefined) {
        return;
    }

    var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
        lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,

    KEY = {
        TAB: 9,
        ENTER: 13,
        ESC: 27,
        SPACE: 32,
        LEFT: 37,
        UP: 38,
        RIGHT: 39,
        DOWN: 40,
        SHIFT: 16,
        CTRL: 17,
        ALT: 18,
        PAGE_UP: 33,
        PAGE_DOWN: 34,
        HOME: 36,
        END: 35,
        BACKSPACE: 8,
        DELETE: 46,
        isArrow: function (k) {
            k = k.which ? k.which : k;
            switch (k) {
            case KEY.LEFT:
            case KEY.RIGHT:
            case KEY.UP:
            case KEY.DOWN:
                return true;
            }
            return false;
        },
        isControl: function (e) {
            var k = e.which;
            switch (k) {
            case KEY.SHIFT:
            case KEY.CTRL:
            case KEY.ALT:
                return true;
            }

            if (e.metaKey) return true;

            return false;
        },
        isFunctionKey: function (k) {
            k = k.which ? k.which : k;
            return k >= 112 && k <= 123;
        }
    },
    MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>",

    DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z"};

    $document = $(document);

    nextUid=(function() { var counter=1; return function() { return counter++; }; }());


    function stripDiacritics(str) {
        var ret, i, l, c;

        if (!str || str.length < 1) return str;

        ret = "";
        for (i = 0, l = str.length; i < l; i++) {
            c = str.charAt(i);
            ret += DIACRITICS[c] || c;
        }
        return ret;
    }

    function indexOf(value, array) {
        var i = 0, l = array.length;
        for (; i < l; i = i + 1) {
            if (equal(value, array[i])) return i;
        }
        return -1;
    }

    function measureScrollbar () {
        var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
        $template.appendTo('body');

        var dim = {
            width: $template.width() - $template[0].clientWidth,
            height: $template.height() - $template[0].clientHeight
        };
        $template.remove();

        return dim;
    }

    /**
     * Compares equality of a and b
     * @param a
     * @param b
     */
    function equal(a, b) {
        if (a === b) return true;
        if (a === undefined || b === undefined) return false;
        if (a === null || b === null) return false;
        // Check whether 'a' or 'b' is a string (primitive or object).
        // The concatenation of an empty string (+'') converts its argument to a string's primitive.
        if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
        if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
        return false;
    }

    /**
     * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty
     * strings
     * @param string
     * @param separator
     */
    function splitVal(string, separator) {
        var val, i, l;
        if (string === null || string.length < 1) return [];
        val = string.split(separator);
        for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);
        return val;
    }

    function getSideBorderPadding(element) {
        return element.outerWidth(false) - element.width();
    }

    function installKeyUpChangeEvent(element) {
        var key="keyup-change-value";
        element.on("keydown", function () {
            if ($.data(element, key) === undefined) {
                $.data(element, key, element.val());
            }
        });
        element.on("keyup", function () {
            var val= $.data(element, key);
            if (val !== undefined && element.val() !== val) {
                $.removeData(element, key);
                element.trigger("keyup-change");
            }
        });
    }

    $document.on("mousemove", function (e) {
        lastMousePosition.x = e.pageX;
        lastMousePosition.y = e.pageY;
    });

    /**
     * filters mouse events so an event is fired only if the mouse moved.
     *
     * filters out mouse events that occur when mouse is stationary but
     * the elements under the pointer are scrolled.
     */
    function installFilteredMouseMove(element) {
        element.on("mousemove", function (e) {
            var lastpos = lastMousePosition;
            if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
                $(e.target).trigger("mousemove-filtered", e);
            }
        });
    }

    /**
     * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
     * within the last quietMillis milliseconds.
     *
     * @param quietMillis number of milliseconds to wait before invoking fn
     * @param fn function to be debounced
     * @param ctx object to be used as this reference within fn
     * @return debounced version of fn
     */
    function debounce(quietMillis, fn, ctx) {
        ctx = ctx || undefined;
        var timeout;
        return function () {
            var args = arguments;
            window.clearTimeout(timeout);
            timeout = window.setTimeout(function() {
                fn.apply(ctx, args);
            }, quietMillis);
        };
    }

    /**
     * A simple implementation of a thunk
     * @param formula function used to lazily initialize the thunk
     * @return {Function}
     */
    function thunk(formula) {
        var evaluated = false,
            value;
        return function() {
            if (evaluated === false) { value = formula(); evaluated = true; }
            return value;
        };
    };

    function installDebouncedScroll(threshold, element) {
        var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
        element.on("scroll", function (e) {
            if (indexOf(e.target, element.get()) >= 0) notify(e);
        });
    }

    function focus($el) {
        if ($el[0] === document.activeElement) return;

        /* set the focus in a 0 timeout - that way the focus is set after the processing
            of the current event has finished - which seems like the only reliable way
            to set focus */
        window.setTimeout(function() {
            var el=$el[0], pos=$el.val().length, range;

            $el.focus();

            /* make sure el received focus so we do not error out when trying to manipulate the caret.
                sometimes modals or others listeners may steal it after its set */
            if ($el.is(":visible") && el === document.activeElement) {

                /* after the focus is set move the caret to the end, necessary when we val()
                    just before setting focus */
                if(el.setSelectionRange)
                {
                    el.setSelectionRange(pos, pos);
                }
                else if (el.createTextRange) {
                    range = el.createTextRange();
                    range.collapse(false);
                    range.select();
                }
            }
        }, 0);
    }

    function getCursorInfo(el) {
        el = $(el)[0];
        var offset = 0;
        var length = 0;
        if ('selectionStart' in el) {
            offset = el.selectionStart;
            length = el.selectionEnd - offset;
        } else if ('selection' in document) {
            el.focus();
            var sel = document.selection.createRange();
            length = document.selection.createRange().text.length;
            sel.moveStart('character', -el.value.length);
            offset = sel.text.length - length;
        }
        return { offset: offset, length: length };
    }

    function killEvent(event) {
        event.preventDefault();
        event.stopPropagation();
    }
    function killEventImmediately(event) {
        event.preventDefault();
        event.stopImmediatePropagation();
    }

    function measureTextWidth(e) {
        if (!sizer){
            var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
            sizer = $(document.createElement("div")).css({
                position: "absolute",
                left: "-10000px",
                top: "-10000px",
                display: "none",
                fontSize: style.fontSize,
                fontFamily: style.fontFamily,
                fontStyle: style.fontStyle,
                fontWeight: style.fontWeight,
                letterSpacing: style.letterSpacing,
                textTransform: style.textTransform,
                whiteSpace: "nowrap"
            });
            sizer.attr("class","select2-sizer");
            $("body").append(sizer);
        }
        sizer.text(e.val());
        return sizer.width();
    }

    function syncCssClasses(dest, src, adapter) {
        var classes, replacements = [], adapted;

        classes = dest.attr("class");
        if (classes) {
            classes = '' + classes; // for IE which returns object
            $(classes.split(" ")).each2(function() {
                if (this.indexOf("select2-") === 0) {
                    replacements.push(this);
                }
            });
        }
        classes = src.attr("class");
        if (classes) {
            classes = '' + classes; // for IE which returns object
            $(classes.split(" ")).each2(function() {
                if (this.indexOf("select2-") !== 0) {
                    adapted = adapter(this);
                    if (adapted) {
                        replacements.push(this);
                    }
                }
            });
        }
        dest.attr("class", replacements.join(" "));
    }


    function markMatch(text, term, markup, escapeMarkup) {
        var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
            tl=term.length;

        if (match<0) {
            markup.push(escapeMarkup(text));
            return;
        }

        markup.push(escapeMarkup(text.substring(0, match)));
        markup.push("<span class='select2-match'>");
        markup.push(escapeMarkup(text.substring(match, match + tl)));
        markup.push("</span>");
        markup.push(escapeMarkup(text.substring(match + tl, text.length)));
    }

    function defaultEscapeMarkup(markup) {
        var replace_map = {
            '\\': '&#92;',
            '&': '&amp;',
            '<': '&lt;',
            '>': '&gt;',
            '"': '&quot;',
            "'": '&#39;',
            "/": '&#47;'
        };

        return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
            return replace_map[match];
        });
    }

    /**
     * Produces an ajax-based query function
     *
     * @param options object containing configuration paramters
     * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
     * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
     * @param options.url url for the data
     * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
     * @param options.dataType request data type: ajax, jsonp, other datatatypes supported by jQuery's $.ajax function or the transport function if specified
     * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
     * @param options.results a function(remoteData, pageNumber) that converts data returned form the remote request to the format expected by Select2.
     *      The expected format is an object containing the following keys:
     *      results array of objects that will be used as choices
     *      more (optional) boolean indicating whether there are more results available
     *      Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
     */
    function ajax(options) {
        var timeout, // current scheduled but not yet executed request
            handler = null,
            quietMillis = options.quietMillis || 100,
            ajaxUrl = options.url,
            self = this;

        return function (query) {
            window.clearTimeout(timeout);
            timeout = window.setTimeout(function () {
                var data = options.data, // ajax data function
                    url = ajaxUrl, // ajax url string or function
                    transport = options.transport || $.fn.select2.ajaxDefaults.transport,
                    // deprecated - to be removed in 4.0  - use params instead
                    deprecated = {
                        type: options.type || 'GET', // set type of request (GET or POST)
                        cache: options.cache || false,
                        jsonpCallback: options.jsonpCallback||undefined,
                        dataType: options.dataType||"json"
                    },
                    params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);

                data = data ? data.call(self, query.term, query.page, query.context) : null;
                url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;

                if (handler) { handler.abort(); }

                if (options.params) {
                    if ($.isFunction(options.params)) {
                        $.extend(params, options.params.call(self));
                    } else {
                        $.extend(params, options.params);
                    }
                }

                $.extend(params, {
                    url: url,
                    dataType: options.dataType,
                    data: data,
                    success: function (data) {
                        // TODO - replace query.page with query so users have access to term, page, etc.
                        var results = options.results(data, query.page);
                        query.callback(results);
                    }
                });
                handler = transport.call(self, params);
            }, quietMillis);
        };
    }

    /**
     * Produces a query function that works with a local array
     *
     * @param options object containing configuration parameters. The options parameter can either be an array or an
     * object.
     *
     * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
     *
     * If the object form is used ti is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
     * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
     * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
     * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
     * the text.
     */
    function local(options) {
        var data = options, // data elements
            dataText,
            tmp,
            text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search

         if ($.isArray(data)) {
            tmp = data;
            data = { results: tmp };
        }

         if ($.isFunction(data) === false) {
            tmp = data;
            data = function() { return tmp; };
        }

        var dataItem = data();
        if (dataItem.text) {
            text = dataItem.text;
            // if text is not a function we assume it to be a key name
            if (!$.isFunction(text)) {
                dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
                text = function (item) { return item[dataText]; };
            }
        }

        return function (query) {
            var t = query.term, filtered = { results: [] }, process;
            if (t === "") {
                query.callback(data());
                return;
            }

            process = function(datum, collection) {
                var group, attr;
                datum = datum[0];
                if (datum.children) {
                    group = {};
                    for (attr in datum) {
                        if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
                    }
                    group.children=[];
                    $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
                    if (group.children.length || query.matcher(t, text(group), datum)) {
                        collection.push(group);
                    }
                } else {
                    if (query.matcher(t, text(datum), datum)) {
                        collection.push(datum);
                    }
                }
            };

            $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
            query.callback(filtered);
        };
    }

    // TODO javadoc
    function tags(data) {
        var isFunc = $.isFunction(data);
        return function (query) {
            var t = query.term, filtered = {results: []};
            $(isFunc ? data() : data).each(function () {
                var isObject = this.text !== undefined,
                    text = isObject ? this.text : this;
                if (t === "" || query.matcher(t, text)) {
                    filtered.results.push(isObject ? this : {id: this, text: this});
                }
            });
            query.callback(filtered);
        };
    }

    /**
     * Checks if the formatter function should be used.
     *
     * Throws an error if it is not a function. Returns true if it should be used,
     * false if no formatting should be performed.
     *
     * @param formatter
     */
    function checkFormatter(formatter, formatterName) {
        if ($.isFunction(formatter)) return true;
        if (!formatter) return false;
        throw new Error(formatterName +" must be a function or a falsy value");
    }

    function evaluate(val) {
        return $.isFunction(val) ? val() : val;
    }

    function countResults(results) {
        var count = 0;
        $.each(results, function(i, item) {
            if (item.children) {
                count += countResults(item.children);
            } else {
                count++;
            }
        });
        return count;
    }

    /**
     * Default tokenizer. This function uses breaks the input on substring match of any string from the
     * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
     * two options have to be defined in order for the tokenizer to work.
     *
     * @param input text user has typed so far or pasted into the search field
     * @param selection currently selected choices
     * @param selectCallback function(choice) callback tho add the choice to selection
     * @param opts select2's opts
     * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
     */
    function defaultTokenizer(input, selection, selectCallback, opts) {
        var original = input, // store the original so we can compare and know if we need to tell the search to update its text
            dupe = false, // check for whether a token we extracted represents a duplicate selected choice
            token, // token
            index, // position at which the separator was found
            i, l, // looping variables
            separator; // the matched separator

        if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;

        while (true) {
            index = -1;

            for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
                separator = opts.tokenSeparators[i];
                index = input.indexOf(separator);
                if (index >= 0) break;
            }

            if (index < 0) break; // did not find any token separator in the input string, bail

            token = input.substring(0, index);
            input = input.substring(index + separator.length);

            if (token.length > 0) {
                token = opts.createSearchChoice.call(this, token, selection);
                if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
                    dupe = false;
                    for (i = 0, l = selection.length; i < l; i++) {
                        if (equal(opts.id(token), opts.id(selection[i]))) {
                            dupe = true; break;
                        }
                    }

                    if (!dupe) selectCallback(token);
                }
            }
        }

        if (original!==input) return input;
    }

    /**
     * Creates a new class
     *
     * @param superClass
     * @param methods
     */
    function clazz(SuperClass, methods) {
        var constructor = function () {};
        constructor.prototype = new SuperClass;
        constructor.prototype.constructor = constructor;
        constructor.prototype.parent = SuperClass.prototype;
        constructor.prototype = $.extend(constructor.prototype, methods);
        return constructor;
    }

    AbstractSelect2 = clazz(Object, {

        // abstract
        bind: function (func) {
            var self = this;
            return function () {
                func.apply(self, arguments);
            };
        },

        // abstract
        init: function (opts) {
            var results, search, resultsSelector = ".select2-results", disabled, readonly;

            // prepare options
            this.opts = opts = this.prepareOpts(opts);

            this.id=opts.id;

            // destroy if called on an existing component
            if (opts.element.data("select2") !== undefined &&
                opts.element.data("select2") !== null) {
                opts.element.data("select2").destroy();
            }

            this.container = this.createContainer();

            this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
            this.containerSelector="#"+this.containerId.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
            this.container.attr("id", this.containerId);

            // cache the body so future lookups are cheap
            this.body = thunk(function() { return opts.element.closest("body"); });

            syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);

            this.container.attr("style", opts.element.attr("style"));
            this.container.css(evaluate(opts.containerCss));
            this.container.addClass(evaluate(opts.containerCssClass));

            this.elementTabIndex = this.opts.element.attr("tabindex");

            // swap container for the element
            this.opts.element
                .data("select2", this)
                .attr("tabindex", "-1")
                .before(this.container);
            this.container.data("select2", this);

            this.dropdown = this.container.find(".select2-drop");
            this.dropdown.addClass(evaluate(opts.dropdownCssClass));
            this.dropdown.data("select2", this);

            syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);

            this.results = results = this.container.find(resultsSelector);
            this.search = search = this.container.find("input.select2-input");

            this.queryCount = 0;
            this.resultsPage = 0;
            this.context = null;

            // initialize the container
            this.initContainer();

            installFilteredMouseMove(this.results);
            this.dropdown.on("mousemove-filtered touchstart touchmove touchend", resultsSelector, this.bind(this.highlightUnderEvent));

            installDebouncedScroll(80, this.results);
            this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));

            // do not propagate change event from the search field out of the component
            $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
            $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});

            // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
            if ($.fn.mousewheel) {
                results.mousewheel(function (e, delta, deltaX, deltaY) {
                    var top = results.scrollTop(), height;
                    if (deltaY > 0 && top - deltaY <= 0) {
                        results.scrollTop(0);
                        killEvent(e);
                    } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
                        results.scrollTop(results.get(0).scrollHeight - results.height());
                        killEvent(e);
                    }
                });
            }

            installKeyUpChangeEvent(search);
            search.on("keyup-change input paste", this.bind(this.updateResults));
            search.on("focus", function () { search.addClass("select2-focused"); });
            search.on("blur", function () { search.removeClass("select2-focused");});

            this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
                if ($(e.target).closest(".select2-result-selectable").length > 0) {
                    this.highlightUnderEvent(e);
                    this.selectHighlighted(e);
                }
            }));

            // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
            // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
            // dom it will trigger the popup close, which is not what we want
            this.dropdown.on("click mouseup mousedown", function (e) { e.stopPropagation(); });

            if ($.isFunction(this.opts.initSelection)) {
                // initialize selection based on the current value of the source element
                this.initSelection();

                // if the user has provided a function that can set selection based on the value of the source element
                // we monitor the change event on the element and trigger it, allowing for two way synchronization
                this.monitorSource();
            }

            if (opts.maximumInputLength !== null) {
                this.search.attr("maxlength", opts.maximumInputLength);
            }

            var disabled = opts.element.prop("disabled");
            if (disabled === undefined) disabled = false;
            this.enable(!disabled);

            var readonly = opts.element.prop("readonly");
            if (readonly === undefined) readonly = false;
            this.readonly(readonly);

            // Calculate size of scrollbar
            scrollBarDimensions = scrollBarDimensions || measureScrollbar();

            this.autofocus = opts.element.prop("autofocus");
            opts.element.prop("autofocus", false);
            if (this.autofocus) this.focus();

            this.nextSearchTerm = undefined;
        },

        // abstract
        destroy: function () {
            var element=this.opts.element, select2 = element.data("select2");

            this.close();

            if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }

            if (select2 !== undefined) {
                select2.container.remove();
                select2.dropdown.remove();
                element
                    .removeClass("select2-offscreen")
                    .removeData("select2")
                    .off(".select2")
                    .prop("autofocus", this.autofocus || false);
                if (this.elementTabIndex) {
                    element.attr({tabindex: this.elementTabIndex});
                } else {
                    element.removeAttr("tabindex");
                }
                element.show();
            }
        },

        // abstract
        optionToData: function(element) {
            if (element.is("option")) {
                return {
                    id:element.prop("value"),
                    text:element.text(),
                    element: element.get(),
                    css: element.attr("class"),
                    disabled: element.prop("disabled"),
                    locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
                };
            } else if (element.is("optgroup")) {
                return {
                    text:element.attr("label"),
                    children:[],
                    element: element.get(),
                    css: element.attr("class")
                };
            }
        },

        // abstract
        prepareOpts: function (opts) {
            var element, select, idKey, ajaxUrl, self = this;

            element = opts.element;

            if (element.get(0).tagName.toLowerCase() === "select") {
                this.select = select = opts.element;
            }

            if (select) {
                // these options are not allowed when attached to a select because they are picked up off the element itself
                $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
                    if (this in opts) {
                        throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
                    }
                });
            }

            opts = $.extend({}, {
                populateResults: function(container, results, query) {
                    var populate,  data, result, children, id=this.opts.id;

                    populate=function(results, container, depth) {

                        var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;

                        results = opts.sortResults(results, container, query);

                        for (i = 0, l = results.length; i < l; i = i + 1) {

                            result=results[i];

                            disabled = (result.disabled === true);
                            selectable = (!disabled) && (id(result) !== undefined);

                            compound=result.children && result.children.length > 0;

                            node=$("<li></li>");
                            node.addClass("select2-results-dept-"+depth);
                            node.addClass("select2-result");
                            node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
                            if (disabled) { node.addClass("select2-disabled"); }
                            if (compound) { node.addClass("select2-result-with-children"); }
                            node.addClass(self.opts.formatResultCssClass(result));

                            label=$(document.createElement("div"));
                            label.addClass("select2-result-label");

                            formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
                            if (formatted!==undefined) {
                                label.html(formatted);
                            }

                            node.append(label);

                            if (compound) {

                                innerContainer=$("<ul></ul>");
                                innerContainer.addClass("select2-result-sub");
                                populate(result.children, innerContainer, depth+1);
                                node.append(innerContainer);
                            }

                            node.data("select2-data", result);
                            container.append(node);
                        }
                    };

                    populate(results, container, 0);
                }
            }, $.fn.select2.defaults, opts);

            if (typeof(opts.id) !== "function") {
                idKey = opts.id;
                opts.id = function (e) { return e[idKey]; };
            }

            if ($.isArray(opts.element.data("select2Tags"))) {
                if ("tags" in opts) {
                    throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
                }
                opts.tags=opts.element.data("select2Tags");
            }

            if (select) {
                opts.query = this.bind(function (query) {
                    var data = { results: [], more: false },
                        term = query.term,
                        children, placeholderOption, process;

                    process=function(element, collection) {
                        var group;
                        if (element.is("option")) {
                            if (query.matcher(term, element.text(), element)) {
                                collection.push(self.optionToData(element));
                            }
                        } else if (element.is("optgroup")) {
                            group=self.optionToData(element);
                            element.children().each2(function(i, elm) { process(elm, group.children); });
                            if (group.children.length>0) {
                                collection.push(group);
                            }
                        }
                    };

                    children=element.children();

                    // ignore the placeholder option if there is one
                    if (this.getPlaceholder() !== undefined && children.length > 0) {
                        placeholderOption = this.getPlaceholderOption();
                        if (placeholderOption) {
                            children=children.not(placeholderOption);
                        }
                    }

                    children.each2(function(i, elm) { process(elm, data.results); });

                    query.callback(data);
                });
                // this is needed because inside val() we construct choices from options and there id is hardcoded
                opts.id=function(e) { return e.id; };
                opts.formatResultCssClass = function(data) { return data.css; };
            } else {
                if (!("query" in opts)) {

                    if ("ajax" in opts) {
                        ajaxUrl = opts.element.data("ajax-url");
                        if (ajaxUrl && ajaxUrl.length > 0) {
                            opts.ajax.url = ajaxUrl;
                        }
                        opts.query = ajax.call(opts.element, opts.ajax);
                    } else if ("data" in opts) {
                        opts.query = local(opts.data);
                    } else if ("tags" in opts) {
                        opts.query = tags(opts.tags);
                        if (opts.createSearchChoice === undefined) {
                            opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
                        }
                        if (opts.initSelection === undefined) {
                            opts.initSelection = function (element, callback) {
                                var data = [];
                                $(splitVal(element.val(), opts.separator)).each(function () {
                                    var id = this, text = this, tags=opts.tags;
                                    if ($.isFunction(tags)) tags=tags();
                                    $(tags).each(function() { if (equal(this.id, id)) { text = this.text; return false; } });
                                    data.push({id: id, text: text});
                                });

                                callback(data);
                            };
                        }
                    }
                }
            }
            if (typeof(opts.query) !== "function") {
                throw "query function not defined for Select2 " + opts.element.attr("id");
            }

            return opts;
        },

        /**
         * Monitor the original element for changes and update select2 accordingly
         */
        // abstract
        monitorSource: function () {
            var el = this.opts.element, sync;

            el.on("change.select2", this.bind(function (e) {
                if (this.opts.element.data("select2-change-triggered") !== true) {
                    this.initSelection();
                }
            }));

            sync = this.bind(function () {

                var enabled, readonly, self = this;

                // sync enabled state
                var disabled = el.prop("disabled");
                if (disabled === undefined) disabled = false;
                this.enable(!disabled);

                var readonly = el.prop("readonly");
                if (readonly === undefined) readonly = false;
                this.readonly(readonly);

                syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
                this.container.addClass(evaluate(this.opts.containerCssClass));

                syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
                this.dropdown.addClass(evaluate(this.opts.dropdownCssClass));

            });

            // mozilla and IE
            el.on("propertychange.select2 DOMAttrModified.select2", sync);


            // hold onto a reference of the callback to work around a chromium bug
            if (this.mutationCallback === undefined) {
                this.mutationCallback = function (mutations) {
                    mutations.forEach(sync);
                }
            }

            // safari and chrome
            if (typeof WebKitMutationObserver !== "undefined") {
                if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
                this.propertyObserver = new WebKitMutationObserver(this.mutationCallback);
                this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
            }
        },

        // abstract
        triggerSelect: function(data) {
            var evt = $.Event("select2-selecting", { val: this.id(data), object: data });
            this.opts.element.trigger(evt);
            return !evt.isDefaultPrevented();
        },

        /**
         * Triggers the change event on the source element
         */
        // abstract
        triggerChange: function (details) {

            details = details || {};
            details= $.extend({}, details, { type: "change", val: this.val() });
            // prevents recursive triggering
            this.opts.element.data("select2-change-triggered", true);
            this.opts.element.trigger(details);
            this.opts.element.data("select2-change-triggered", false);

            // some validation frameworks ignore the change event and listen instead to keyup, click for selects
            // so here we trigger the click event manually
            this.opts.element.click();

            // ValidationEngine ignorea the change event and listens instead to blur
            // so here we trigger the blur event manually if so desired
            if (this.opts.blurOnChange)
                this.opts.element.blur();
        },

        //abstract
        isInterfaceEnabled: function()
        {
            return this.enabledInterface === true;
        },

        // abstract
        enableInterface: function() {
            var enabled = this._enabled && !this._readonly,
                disabled = !enabled;

            if (enabled === this.enabledInterface) return false;

            this.container.toggleClass("select2-container-disabled", disabled);
            this.close();
            this.enabledInterface = enabled;

            return true;
        },

        // abstract
        enable: function(enabled) {
            if (enabled === undefined) enabled = true;
            if (this._enabled === enabled) return;
            this._enabled = enabled;

            this.opts.element.prop("disabled", !enabled);
            this.enableInterface();
        },

        // abstract
        disable: function() {
            this.enable(false);
        },

        // abstract
        readonly: function(enabled) {
            if (enabled === undefined) enabled = false;
            if (this._readonly === enabled) return false;
            this._readonly = enabled;

            this.opts.element.prop("readonly", enabled);
            this.enableInterface();
            return true;
        },

        // abstract
        opened: function () {
            return this.container.hasClass("select2-dropdown-open");
        },

        // abstract
        positionDropdown: function() {
            var $dropdown = this.dropdown,
                offset = this.container.offset(),
                height = this.container.outerHeight(false),
                width = this.container.outerWidth(false),
                dropHeight = $dropdown.outerHeight(false),
                viewPortRight = $(window).scrollLeft() + $(window).width(),
                viewportBottom = $(window).scrollTop() + $(window).height(),
                dropTop = offset.top + height,
                dropLeft = offset.left,
                enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
                enoughRoomAbove = (offset.top - dropHeight) >= this.body().scrollTop(),
                dropWidth = $dropdown.outerWidth(false),
                enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight,
                aboveNow = $dropdown.hasClass("select2-drop-above"),
                bodyOffset,
                above,
                css,
                resultsListNode;

            if (this.opts.dropdownAutoWidth) {
                resultsListNode = $('.select2-results', $dropdown)[0];
                $dropdown.addClass('select2-drop-auto-width');
                $dropdown.css('width', '');
                // Add scrollbar width to dropdown if vertical scrollbar is present
                dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
                dropWidth > width ? width = dropWidth : dropWidth = width;
                enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
            }
            else {
                this.container.removeClass('select2-drop-auto-width');
            }

            //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
            //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body().scrollTop(), "enough?", enoughRoomAbove);

            // fix positioning when body has an offset and is not position: static
            if (this.body().css('position') !== 'static') {
                bodyOffset = this.body().offset();
                dropTop -= bodyOffset.top;
                dropLeft -= bodyOffset.left;
            }

            // always prefer the current above/below alignment, unless there is not enough room
            if (aboveNow) {
                above = true;
                if (!enoughRoomAbove && enoughRoomBelow) above = false;
            } else {
                above = false;
                if (!enoughRoomBelow && enoughRoomAbove) above = true;
            }

            if (!enoughRoomOnRight) {
               dropLeft = offset.left + width - dropWidth;
            }

            if (above) {
                dropTop = offset.top - dropHeight;
                this.container.addClass("select2-drop-above");
                $dropdown.addClass("select2-drop-above");
            }
            else {
                this.container.removeClass("select2-drop-above");
                $dropdown.removeClass("select2-drop-above");
            }

            css = $.extend({
                top: dropTop,
                left: dropLeft,
                width: width
            }, evaluate(this.opts.dropdownCss));

            $dropdown.css(css);
        },

        // abstract
        shouldOpen: function() {
            var event;

            if (this.opened()) return false;

            if (this._enabled === false || this._readonly === true) return false;

            event = $.Event("select2-opening");
            this.opts.element.trigger(event);
            return !event.isDefaultPrevented();
        },

        // abstract
        clearDropdownAlignmentPreference: function() {
            // clear the classes used to figure out the preference of where the dropdown should be opened
            this.container.removeClass("select2-drop-above");
            this.dropdown.removeClass("select2-drop-above");
        },

        /**
         * Opens the dropdown
         *
         * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
         * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
         */
        // abstract
        open: function () {

            if (!this.shouldOpen()) return false;

            this.opening();

            return true;
        },

        /**
         * Performs the opening of the dropdown
         */
        // abstract
        opening: function() {
            var cid = this.containerId,
                scroll = "scroll." + cid,
                resize = "resize."+cid,
                orient = "orientationchange."+cid,
                mask, maskCss;

            this.container.addClass("select2-dropdown-open").addClass("select2-container-active");

            this.clearDropdownAlignmentPreference();

            if(this.dropdown[0] !== this.body().children().last()[0]) {
                this.dropdown.detach().appendTo(this.body());
            }

            // create the dropdown mask if doesnt already exist
            mask = $("#select2-drop-mask");
            if (mask.length == 0) {
                mask = $(document.createElement("div"));
                mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
                mask.hide();
                mask.appendTo(this.body());
                mask.on("mousedown touchstart click", function (e) {
                    var dropdown = $("#select2-drop"), self;
                    if (dropdown.length > 0) {
                        self=dropdown.data("select2");
                        if (self.opts.selectOnBlur) {
                            self.selectHighlighted({noFocus: true});
                        }
                        self.close({focus:false});
                        e.preventDefault();
                        e.stopPropagation();
                    }
                });
            }

            // ensure the mask is always right before the dropdown
            if (this.dropdown.prev()[0] !== mask[0]) {
                this.dropdown.before(mask);
            }

            // move the global id to the correct dropdown
            $("#select2-drop").removeAttr("id");
            this.dropdown.attr("id", "select2-drop");

            // show the elements
            mask.show();

            this.positionDropdown();
            this.dropdown.show();
            this.positionDropdown();

            this.dropdown.addClass("select2-drop-active");

            // attach listeners to events that can change the position of the container and thus require
            // the position of the dropdown to be updated as well so it does not come unglued from the container
            var that = this;
            this.container.parents().add(window).each(function () {
                $(this).on(resize+" "+scroll+" "+orient, function (e) {
                    that.positionDropdown();
                });
            });


        },

        // abstract
        close: function () {
            if (!this.opened()) return;

            var cid = this.containerId,
                scroll = "scroll." + cid,
                resize = "resize."+cid,
                orient = "orientationchange."+cid;

            // unbind event listeners
            this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });

            this.clearDropdownAlignmentPreference();

            $("#select2-drop-mask").hide();
            this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
            this.dropdown.hide();
            this.container.removeClass("select2-dropdown-open");
            this.results.empty();


            this.clearSearch();
            this.search.removeClass("select2-active");
            this.opts.element.trigger($.Event("select2-close"));
        },

        /**
         * Opens control, sets input value, and updates results.
         */
        // abstract
        externalSearch: function (term) {
            this.open();
            this.search.val(term);
            this.updateResults(false);
        },

        // abstract
        clearSearch: function () {

        },

        //abstract
        getMaximumSelectionSize: function() {
            return evaluate(this.opts.maximumSelectionSize);
        },

        // abstract
        ensureHighlightVisible: function () {
            var results = this.results, children, index, child, hb, rb, y, more;

            index = this.highlight();

            if (index < 0) return;

            if (index == 0) {

                // if the first element is highlighted scroll all the way to the top,
                // that way any unselectable headers above it will also be scrolled
                // into view

                results.scrollTop(0);
                return;
            }

            children = this.findHighlightableChoices().find('.select2-result-label');

            child = $(children[index]);

            hb = child.offset().top + child.outerHeight(true);

            // if this is the last child lets also make sure select2-more-results is visible
            if (index === children.length - 1) {
                more = results.find("li.select2-more-results");
                if (more.length > 0) {
                    hb = more.offset().top + more.outerHeight(true);
                }
            }

            rb = results.offset().top + results.outerHeight(true);
            if (hb > rb) {
                results.scrollTop(results.scrollTop() + (hb - rb));
            }
            y = child.offset().top - results.offset().top;

            // make sure the top of the element is visible
            if (y < 0 && child.css('display') != 'none' ) {
                results.scrollTop(results.scrollTop() + y); // y is negative
            }
        },

        // abstract
        findHighlightableChoices: function() {
            return this.results.find(".select2-result-selectable:not(.select2-selected):not(.select2-disabled)");
        },

        // abstract
        moveHighlight: function (delta) {
            var choices = this.findHighlightableChoices(),
                index = this.highlight();

            while (index > -1 && index < choices.length) {
                index += delta;
                var choice = $(choices[index]);
                if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
                    this.highlight(index);
                    break;
                }
            }
        },

        // abstract
        highlight: function (index) {
            var choices = this.findHighlightableChoices(),
                choice,
                data;

            if (arguments.length === 0) {
                return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
            }

            if (index >= choices.length) index = choices.length - 1;
            if (index < 0) index = 0;

            this.removeHighlight();

            choice = $(choices[index]);
            choice.addClass("select2-highlighted");

            this.ensureHighlightVisible();

            data = choice.data("select2-data");
            if (data) {
                this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
            }
        },

        removeHighlight: function() {
            this.results.find(".select2-highlighted").removeClass("select2-highlighted");
        },

        // abstract
        countSelectableResults: function() {
            return this.findHighlightableChoices().length;
        },

        // abstract
        highlightUnderEvent: function (event) {
            var el = $(event.target).closest(".select2-result-selectable");
            if (el.length > 0 && !el.is(".select2-highlighted")) {
                var choices = this.findHighlightableChoices();
                this.highlight(choices.index(el));
            } else if (el.length == 0) {
                // if we are over an unselectable item remove all highlights
                this.removeHighlight();
            }
        },

        // abstract
        loadMoreIfNeeded: function () {
            var results = this.results,
                more = results.find("li.select2-more-results"),
                below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
                offset = -1, // index of first element without data
                page = this.resultsPage + 1,
                self=this,
                term=this.search.val(),
                context=this.context;

            if (more.length === 0) return;
            below = more.offset().top - results.offset().top - results.height();

            if (below <= this.opts.loadMorePadding) {
                more.addClass("select2-active");
                this.opts.query({
                        element: this.opts.element,
                        term: term,
                        page: page,
                        context: context,
                        matcher: this.opts.matcher,
                        callback: this.bind(function (data) {

                    // ignore a response if the select2 has been closed before it was received
                    if (!self.opened()) return;


                    self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
                    self.postprocessResults(data, false, false);

                    if (data.more===true) {
                        more.detach().appendTo(results).text(self.opts.formatLoadMore(page+1));
                        window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
                    } else {
                        more.remove();
                    }
                    self.positionDropdown();
                    self.resultsPage = page;
                    self.context = data.context;
                    this.opts.element.trigger({ type: "select2-loaded", items: data });
                })});
            }
        },

        /**
         * Default tokenizer function which does nothing
         */
        tokenize: function() {

        },

        /**
         * @param initial whether or not this is the call to this method right after the dropdown has been opened
         */
        // abstract
        updateResults: function (initial) {
            var search = this.search,
                results = this.results,
                opts = this.opts,
                data,
                self = this,
                input,
                term = search.val(),
                lastTerm = $.data(this.container, "select2-last-term"),
                // sequence number used to drop out-of-order responses
                queryNumber;

            // prevent duplicate queries against the same term
            if (initial !== true && lastTerm && equal(term, lastTerm)) return;

            $.data(this.container, "select2-last-term", term);

            // if the search is currently hidden we do not alter the results
            if (initial !== true && (this.showSearchInput === false || !this.opened())) {
                return;
            }

            function postRender() {
                search.removeClass("select2-active");
                self.positionDropdown();
            }

            function render(html) {
                results.html(html);
                postRender();
            }

            queryNumber = ++this.queryCount;

            var maxSelSize = this.getMaximumSelectionSize();
            if (maxSelSize >=1) {
                data = this.data();
                if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
                    render("<li class='select2-selection-limit'>" + opts.formatSelectionTooBig(maxSelSize) + "</li>");
                    return;
                }
            }

            if (search.val().length < opts.minimumInputLength) {
                if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
                    render("<li class='select2-no-results'>" + opts.formatInputTooShort(search.val(), opts.minimumInputLength) + "</li>");
                } else {
                    render("");
                }
                if (initial && this.showSearch) this.showSearch(true);
                return;
            }

            if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
                if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
                    render("<li class='select2-no-results'>" + opts.formatInputTooLong(search.val(), opts.maximumInputLength) + "</li>");
                } else {
                    render("");
                }
                return;
            }

            if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
                render("<li class='select2-searching'>" + opts.formatSearching() + "</li>");
            }

            search.addClass("select2-active");

            this.removeHighlight();

            // give the tokenizer a chance to pre-process the input
            input = this.tokenize();
            if (input != undefined && input != null) {
                search.val(input);
            }

            this.resultsPage = 1;

            opts.query({
                element: opts.element,
                    term: search.val(),
                    page: this.resultsPage,
                    context: null,
                    matcher: opts.matcher,
                    callback: this.bind(function (data) {
                var def; // default choice

                // ignore old responses
                if (queryNumber != this.queryCount) {
                  return;
                }

                // ignore a response if the select2 has been closed before it was received
                if (!this.opened()) {
                    this.search.removeClass("select2-active");
                    return;
                }

                // save context, if any
                this.context = (data.context===undefined) ? null : data.context;
                // create a default choice and prepend it to the list
                if (this.opts.createSearchChoice && search.val() !== "") {
                    def = this.opts.createSearchChoice.call(self, search.val(), data.results);
                    if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
                        if ($(data.results).filter(
                            function () {
                                return equal(self.id(this), self.id(def));
                            }).length === 0) {
                            data.results.unshift(def);
                        }
                    }
                }

                if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
                    render("<li class='select2-no-results'>" + opts.formatNoMatches(search.val()) + "</li>");
                    return;
                }

                results.empty();
                self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});

                if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
                    results.append("<li class='select2-more-results'>" + self.opts.escapeMarkup(opts.formatLoadMore(this.resultsPage)) + "</li>");
                    window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
                }

                this.postprocessResults(data, initial);

                postRender();

                this.opts.element.trigger({ type: "select2-loaded", items: data });
            })});
        },

        // abstract
        cancel: function () {
            this.close();
        },

        // abstract
        blur: function () {
            // if selectOnBlur == true, select the currently highlighted option
            if (this.opts.selectOnBlur)
                this.selectHighlighted({noFocus: true});

            this.close();
            this.container.removeClass("select2-container-active");
            // synonymous to .is(':focus'), which is available in jquery >= 1.6
            if (this.search[0] === document.activeElement) { this.search.blur(); }
            this.clearSearch();
            this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
        },

        // abstract
        focusSearch: function () {
            focus(this.search);
        },

        // abstract
        selectHighlighted: function (options) {
            var index=this.highlight(),
                highlighted=this.results.find(".select2-highlighted"),
                data = highlighted.closest('.select2-result').data("select2-data");

            if (data) {
                this.highlight(index);
                this.onSelect(data, options);
            } else if (options && options.noFocus) {
                this.close();
            }
        },

        // abstract
        getPlaceholder: function () {
            var placeholderOption;
            return this.opts.element.attr("placeholder") ||
                this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
                this.opts.element.data("placeholder") ||
                this.opts.placeholder ||
                ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
        },

        // abstract
        getPlaceholderOption: function() {
            if (this.select) {
                var firstOption = this.select.children().first();
                if (this.opts.placeholderOption !== undefined ) {
                    //Determine the placeholder option based on the specified placeholderOption setting
                    return (this.opts.placeholderOption === "first" && firstOption) ||
                           (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
                } else if (firstOption.text() === "" && firstOption.val() === "") {
                    //No explicit placeholder option specified, use the first if it's blank
                    return firstOption;
                }
            }
        },

        /**
         * Get the desired width for the container element.  This is
         * derived first from option `width` passed to select2, then
         * the inline 'style' on the original element, and finally
         * falls back to the jQuery calculated element width.
         */
        // abstract
        initContainerWidth: function () {
            function resolveContainerWidth() {
                var style, attrs, matches, i, l;

                if (this.opts.width === "off") {
                    return null;
                } else if (this.opts.width === "element"){
                    return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
                } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
                    // check if there is inline style on the element that contains width
                    style = this.opts.element.attr('style');
                    if (style !== undefined) {
                        attrs = style.split(';');
                        for (i = 0, l = attrs.length; i < l; i = i + 1) {
                            matches = attrs[i].replace(/\s/g, '')
                                .match(/[^-]width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
                            if (matches !== null && matches.length >= 1)
                                return matches[1];
                        }
                    }

                    if (this.opts.width === "resolve") {
                        // next check if css('width') can resolve a width that is percent based, this is sometimes possible
                        // when attached to input type=hidden or elements hidden via css
                        style = this.opts.element.css('width');
                        if (style.indexOf("%") > 0) return style;

                        // finally, fallback on the calculated width of the element
                        return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
                    }

                    return null;
                } else if ($.isFunction(this.opts.width)) {
                    return this.opts.width();
                } else {
                    return this.opts.width;
               }
            };

            var width = resolveContainerWidth.call(this);
            if (width !== null) {
                this.container.css("width", width);
            }
        }
    });

    SingleSelect2 = clazz(AbstractSelect2, {

        // single

        createContainer: function () {
            var container = $(document.createElement("div")).attr({
                "class": "select2-container"
            }).html([
                "<a href='javascript:void(0)' onclick='return false;' class='select2-choice' tabindex='-1'>",
                "   <span class='select2-chosen'>&nbsp;</span><abbr class='select2-search-choice-close'></abbr>",
                "   <span class='select2-arrow'><i class='fa fa-sort brand-info select2-fa'></i></span>",
                "</a>",
                "<input class='select2-focusser select2-offscreen' type='text'/>",
                "<div class='select2-drop select2-display-none'>",
                "   <div class='select2-search'>",
                "       <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'/>",
                "   </div>",
                "   <ul class='select2-results'>",
                "   </ul>",
                "</div>"].join(""));
            return container;
        },

        // single
        enableInterface: function() {
            if (this.parent.enableInterface.apply(this, arguments)) {
                this.focusser.prop("disabled", !this.isInterfaceEnabled());
            }
        },

        // single
        opening: function () {
            var el, range, len;

            if (this.opts.minimumResultsForSearch >= 0) {
                this.showSearch(true);
            }

            this.parent.opening.apply(this, arguments);

            if (this.showSearchInput !== false) {
                // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
                // all other browsers handle this just fine

                this.search.val(this.focusser.val());
            }
            this.search.focus();
            // move the cursor to the end after focussing, otherwise it will be at the beginning and
            // new text will appear *before* focusser.val()
            el = this.search.get(0);
            if (el.createTextRange) {
                range = el.createTextRange();
                range.collapse(false);
                range.select();
            } else if (el.setSelectionRange) {
                len = this.search.val().length;
                el.setSelectionRange(len, len);
            }

            // initializes search's value with nextSearchTerm (if defined by user)
            // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
            if(this.search.val() === "") {
                if(this.nextSearchTerm != undefined){
                    this.search.val(this.nextSearchTerm);
                    this.search.select();
                }
            }

            this.focusser.prop("disabled", true).val("");
            this.updateResults(true);
            this.opts.element.trigger($.Event("select2-open"));
        },

        // single
        close: function (params) {
            if (!this.opened()) return;
            this.parent.close.apply(this, arguments);

            params = params || {focus: true};
            this.focusser.removeAttr("disabled");

            if (params.focus) {
                this.focusser.focus();
            }
        },

        // single
        focus: function () {
            if (this.opened()) {
                this.close();
            } else {
                this.focusser.removeAttr("disabled");
                this.focusser.focus();
            }
        },

        // single
        isFocused: function () {
            return this.container.hasClass("select2-container-active");
        },

        // single
        cancel: function () {
            this.parent.cancel.apply(this, arguments);
            this.focusser.removeAttr("disabled");
            this.focusser.focus();
        },

        // single
        destroy: function() {
            $("label[for='" + this.focusser.attr('id') + "']")
                .attr('for', this.opts.element.attr("id"));
            this.parent.destroy.apply(this, arguments);
        },

        // single
        initContainer: function () {

            var selection,
                container = this.container,
                dropdown = this.dropdown;

            if (this.opts.minimumResultsForSearch < 0) {
                this.showSearch(false);
            } else {
                this.showSearch(true);
            }

            this.selection = selection = container.find(".select2-choice");

            this.focusser = container.find(".select2-focusser");

            // rewrite labels from original element to focusser
            this.focusser.attr("id", "s2id_autogen"+nextUid());

            $("label[for='" + this.opts.element.attr("id") + "']")
                .attr('for', this.focusser.attr('id'));

            this.focusser.attr("tabindex", this.elementTabIndex);

            this.search.on("keydown", this.bind(function (e) {
                if (!this.isInterfaceEnabled()) return;

                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
                    // prevent the page from scrolling
                    killEvent(e);
                    return;
                }

                switch (e.which) {
                    case KEY.UP:
                    case KEY.DOWN:
                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
                        killEvent(e);
                        return;
                    case KEY.ENTER:
                        this.selectHighlighted();
                        killEvent(e);
                        return;
                    case KEY.TAB:
                        // if selectOnBlur == true, select the currently highlighted option
                        if (this.opts.selectOnBlur) {
                            this.selectHighlighted({noFocus: true});
                        }
                        return;
                    case KEY.ESC:
                        this.cancel(e);
                        killEvent(e);
                        return;
                }
            }));

            this.search.on("blur", this.bind(function(e) {
                // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
                // without this the search field loses focus which is annoying
                if (document.activeElement === this.body().get(0)) {
                    window.setTimeout(this.bind(function() {
                        this.search.focus();
                    }), 0);
                }
            }));

            this.focusser.on("keydown", this.bind(function (e) {
                if (!this.isInterfaceEnabled()) return;

                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
                    return;
                }

                if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
                    killEvent(e);
                    return;
                }

                if (e.which == KEY.DOWN || e.which == KEY.UP
                    || (e.which == KEY.ENTER && this.opts.openOnEnter)) {

                    if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;

                    this.open();
                    killEvent(e);
                    return;
                }

                if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
                    if (this.opts.allowClear) {
                        this.clear();
                    }
                    killEvent(e);
                    return;
                }
            }));


            installKeyUpChangeEvent(this.focusser);
            this.focusser.on("keyup-change input", this.bind(function(e) {
                if (this.opts.minimumResultsForSearch >= 0) {
                    e.stopPropagation();
                    if (this.opened()) return;
                    this.open();
                }
            }));

            selection.on("mousedown", "abbr", this.bind(function (e) {
                if (!this.isInterfaceEnabled()) return;
                this.clear();
                killEventImmediately(e);
                this.close();
                this.selection.focus();
            }));

            selection.on("mousedown", this.bind(function (e) {

                if (!this.container.hasClass("select2-container-active")) {
                    this.opts.element.trigger($.Event("select2-focus"));
                }

                if (this.opened()) {
                    this.close();
                } else if (this.isInterfaceEnabled()) {
                    this.open();
                }

                killEvent(e);
            }));

            dropdown.on("mousedown", this.bind(function() { this.search.focus(); }));

            selection.on("focus", this.bind(function(e) {
                killEvent(e);
            }));

            this.focusser.on("focus", this.bind(function(){
                if (!this.container.hasClass("select2-container-active")) {
                    this.opts.element.trigger($.Event("select2-focus"));
                }
                this.container.addClass("select2-container-active");
            })).on("blur", this.bind(function() {
                if (!this.opened()) {
                    this.container.removeClass("select2-container-active");
                    this.opts.element.trigger($.Event("select2-blur"));
                }
            }));
            this.search.on("focus", this.bind(function(){
                if (!this.container.hasClass("select2-container-active")) {
                    this.opts.element.trigger($.Event("select2-focus"));
                }
                this.container.addClass("select2-container-active");
            }));

            this.initContainerWidth();
            this.opts.element.addClass("select2-offscreen");
            this.setPlaceholder();

        },

        // single
        clear: function(triggerChange) {
            var data=this.selection.data("select2-data");
            if (data) { // guard against queued quick consecutive clicks
                var placeholderOption = this.getPlaceholderOption();
                this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
                this.selection.find(".select2-chosen").empty();
                this.selection.removeData("select2-data");
                this.setPlaceholder();

                if (triggerChange !== false){
                    this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
                    this.triggerChange({removed:data});
                }
            }
        },

        /**
         * Sets selection based on source element's value
         */
        // single
        initSelection: function () {
            var selected;
            if (this.isPlaceholderOptionSelected()) {
                this.updateSelection(null);
                this.close();
                this.setPlaceholder();
            } else {
                var self = this;
                this.opts.initSelection.call(null, this.opts.element, function(selected){
                    if (selected !== undefined && selected !== null) {
                        self.updateSelection(selected);
                        self.close();
                        self.setPlaceholder();
                    }
                });
            }
        },

        isPlaceholderOptionSelected: function() {
            var placeholderOption;
            if (!this.opts.placeholder) return false; // no placeholder specified so no option should be considered
            return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.is(':selected'))
                || (this.opts.element.val() === "")
                || (this.opts.element.val() === undefined)
                || (this.opts.element.val() === null);
        },

        // single
        prepareOpts: function () {
            var opts = this.parent.prepareOpts.apply(this, arguments),
                self=this;

            if (opts.element.get(0).tagName.toLowerCase() === "select") {
                // install the selection initializer
                opts.initSelection = function (element, callback) {
                    var selected = element.find(":selected");
                    // a single select box always has a value, no need to null check 'selected'
                    callback(self.optionToData(selected));
                };
            } else if ("data" in opts) {
                // install default initSelection when applied to hidden input and data is local
                opts.initSelection = opts.initSelection || function (element, callback) {
                    var id = element.val();
                    //search in data by id, storing the actual matching item
                    var match = null;
                    opts.query({
                        matcher: function(term, text, el){
                            var is_match = equal(id, opts.id(el));
                            if (is_match) {
                                match = el;
                            }
                            return is_match;
                        },
                        callback: !$.isFunction(callback) ? $.noop : function() {
                            callback(match);
                        }
                    });
                };
            }

            return opts;
        },

        // single
        getPlaceholder: function() {
            // if a placeholder is specified on a single select without a valid placeholder option ignore it
            if (this.select) {
                if (this.getPlaceholderOption() === undefined) {
                    return undefined;
                }
            }

            return this.parent.getPlaceholder.apply(this, arguments);
        },

        // single
        setPlaceholder: function () {
            var placeholder = this.getPlaceholder();

            if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {

                // check for a placeholder option if attached to a select
                if (this.select && this.getPlaceholderOption() === undefined) return;

                this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));

                this.selection.addClass("select2-default");

                this.container.removeClass("select2-allowclear");
            }
        },

        // single
        postprocessResults: function (data, initial, noHighlightUpdate) {
            var selected = 0, self = this, showSearchInput = true;

            // find the selected element in the result list

            this.findHighlightableChoices().each2(function (i, elm) {
                if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
                    selected = i;
                    return false;
                }
            });

            // and highlight it
            if (noHighlightUpdate !== false) {
                if (initial === true && selected >= 0) {
                    this.highlight(selected);
                } else {
                    this.highlight(0);
                }
            }

            // hide the search box if this is the first we got the results and there are enough of them for search

            if (initial === true) {
                var min = this.opts.minimumResultsForSearch;
                if (min >= 0) {
                    this.showSearch(countResults(data.results) >= min);
                }
            }
        },

        // single
        showSearch: function(showSearchInput) {
            if (this.showSearchInput === showSearchInput) return;

            this.showSearchInput = showSearchInput;

            this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
            this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
            //add "select2-with-searchbox" to the container if search box is shown
            $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
        },

        // single
        onSelect: function (data, options) {

            if (!this.triggerSelect(data)) { return; }

            var old = this.opts.element.val(),
                oldData = this.data();

            this.opts.element.val(this.id(data));
            this.updateSelection(data);

            this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });

            this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
            this.close();

            if (!options || !options.noFocus)
                this.selection.focus();

            if (!equal(old, this.id(data))) { this.triggerChange({added:data,removed:oldData}); }
        },

        // single
        updateSelection: function (data) {

            var container=this.selection.find(".select2-chosen"), formatted, cssClass;

            this.selection.data("select2-data", data);

            container.empty();
            if (data !== null) {
                formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
            }
            if (formatted !== undefined) {
                container.append(formatted);
            }
            cssClass=this.opts.formatSelectionCssClass(data, container);
            if (cssClass !== undefined) {
                container.addClass(cssClass);
            }

            this.selection.removeClass("select2-default");

            if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
                this.container.addClass("select2-allowclear");
            }
        },

        // single
        val: function () {
            var val,
                triggerChange = false,
                data = null,
                self = this,
                oldData = this.data();

            if (arguments.length === 0) {
                return this.opts.element.val();
            }

            val = arguments[0];

            if (arguments.length > 1) {
                triggerChange = arguments[1];
            }

            if (this.select) {
                this.select
                    .val(val)
                    .find(":selected").each2(function (i, elm) {
                        data = self.optionToData(elm);
                        return false;
                    });
                this.updateSelection(data);
                this.setPlaceholder();
                if (triggerChange) {
                    this.triggerChange({added: data, removed:oldData});
                }
            } else {
                // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
                if (!val && val !== 0) {
                    this.clear(triggerChange);
                    return;
                }
                if (this.opts.initSelection === undefined) {
                    throw new Error("cannot call val() if initSelection() is not defined");
                }
                this.opts.element.val(val);
                this.opts.initSelection(this.opts.element, function(data){
                    self.opts.element.val(!data ? "" : self.id(data));
                    self.updateSelection(data);
                    self.setPlaceholder();
                    if (triggerChange) {
                        self.triggerChange({added: data, removed:oldData});
                    }
                });
            }
        },

        // single
        clearSearch: function () {
            this.search.val("");
            this.focusser.val("");
        },

        // single
        data: function(value) {
            var data,
                triggerChange = false;

            if (arguments.length === 0) {
                data = this.selection.data("select2-data");
                if (data == undefined) data = null;
                return data;
            } else {
                if (arguments.length > 1) {
                    triggerChange = arguments[1];
                }
                if (!value) {
                    this.clear(triggerChange);
                } else {
                    data = this.data();
                    this.opts.element.val(!value ? "" : this.id(value));
                    this.updateSelection(value);
                    if (triggerChange) {
                        this.triggerChange({added: value, removed:data});
                    }
                }
            }
        }
    });

    MultiSelect2 = clazz(AbstractSelect2, {

        // multi
        createContainer: function () {
            var container = $(document.createElement("div")).attr({
                "class": "select2-container select2-container-multi"
            }).html([
                "<ul class='select2-choices'>",
                "  <li class='select2-search-field'>",
                "    <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>",
                "  </li>",
                "</ul>",
                "<div class='select2-drop select2-drop-multi select2-display-none'>",
                "   <ul class='select2-results'>",
                "   </ul>",
                "</div>"].join(""));
            return container;
        },

        // multi
        prepareOpts: function () {
            var opts = this.parent.prepareOpts.apply(this, arguments),
                self=this;

            // TODO validate placeholder is a string if specified

            if (opts.element.get(0).tagName.toLowerCase() === "select") {
                // install sthe selection initializer
                opts.initSelection = function (element, callback) {

                    var data = [];

                    element.find(":selected").each2(function (i, elm) {
                        data.push(self.optionToData(elm));
                    });
                    callback(data);
                };
            } else if ("data" in opts) {
                // install default initSelection when applied to hidden input and data is local
                opts.initSelection = opts.initSelection || function (element, callback) {
                    var ids = splitVal(element.val(), opts.separator);
                    //search in data by array of ids, storing matching items in a list
                    var matches = [];
                    opts.query({
                        matcher: function(term, text, el){
                            var is_match = $.grep(ids, function(id) {
                                return equal(id, opts.id(el));
                            }).length;
                            if (is_match) {
                                matches.push(el);
                            }
                            return is_match;
                        },
                        callback: !$.isFunction(callback) ? $.noop : function() {
                            // reorder matches based on the order they appear in the ids array because right now
                            // they are in the order in which they appear in data array
                            var ordered = [];
                            for (var i = 0; i < ids.length; i++) {
                                var id = ids[i];
                                for (var j = 0; j < matches.length; j++) {
                                    var match = matches[j];
                                    if (equal(id, opts.id(match))) {
                                        ordered.push(match);
                                        matches.splice(j, 1);
                                        break;
                                    }
                                }
                            }
                            callback(ordered);
                        }
                    });
                };
            }

            return opts;
        },

        selectChoice: function (choice) {

            var selected = this.container.find(".select2-search-choice-focus");
            if (selected.length && choice && choice[0] == selected[0]) {

            } else {
                if (selected.length) {
                    this.opts.element.trigger("choice-deselected", selected);
                }
                selected.removeClass("select2-search-choice-focus");
                if (choice && choice.length) {
                    this.close();
                    choice.addClass("select2-search-choice-focus");
                    this.opts.element.trigger("choice-selected", choice);
                }
            }
        },

        // multi
        destroy: function() {
            $("label[for='" + this.search.attr('id') + "']")
                .attr('for', this.opts.element.attr("id"));
            this.parent.destroy.apply(this, arguments);
        },

        // multi
        initContainer: function () {

            var selector = ".select2-choices", selection;

            this.searchContainer = this.container.find(".select2-search-field");
            this.selection = selection = this.container.find(selector);

            var _this = this;
            this.selection.on("click", ".select2-search-choice", function (e) {
                //killEvent(e);
                _this.search[0].focus();
                _this.selectChoice($(this));
            });

            // rewrite labels from original element to focusser
            this.search.attr("id", "s2id_autogen"+nextUid());
            $("label[for='" + this.opts.element.attr("id") + "']")
                .attr('for', this.search.attr('id'));

            this.search.on("input paste", this.bind(function() {
                if (!this.isInterfaceEnabled()) return;
                if (!this.opened()) {
                    this.open();
                }
            }));

            this.search.attr("tabindex", this.elementTabIndex);

            this.keydowns = 0;
            this.search.on("keydown", this.bind(function (e) {
                if (!this.isInterfaceEnabled()) return;

                ++this.keydowns;
                var selected = selection.find(".select2-search-choice-focus");
                var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
                var next = selected.next(".select2-search-choice:not(.select2-locked)");
                var pos = getCursorInfo(this.search);

                if (selected.length &&
                    (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
                    var selectedChoice = selected;
                    if (e.which == KEY.LEFT && prev.length) {
                        selectedChoice = prev;
                    }
                    else if (e.which == KEY.RIGHT) {
                        selectedChoice = next.length ? next : null;
                    }
                    else if (e.which === KEY.BACKSPACE) {
                        this.unselect(selected.first());
                        this.search.width(10);
                        selectedChoice = prev.length ? prev : next;
                    } else if (e.which == KEY.DELETE) {
                        this.unselect(selected.first());
                        this.search.width(10);
                        selectedChoice = next.length ? next : null;
                    } else if (e.which == KEY.ENTER) {
                        selectedChoice = null;
                    }

                    this.selectChoice(selectedChoice);
                    killEvent(e);
                    if (!selectedChoice || !selectedChoice.length) {
                        this.open();
                    }
                    return;
                } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
                    || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {

                    this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
                    killEvent(e);
                    return;
                } else {
                    this.selectChoice(null);
                }

                if (this.opened()) {
                    switch (e.which) {
                    case KEY.UP:
                    case KEY.DOWN:
                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
                        killEvent(e);
                        return;
                    case KEY.ENTER:
                        this.selectHighlighted();
                        killEvent(e);
                        return;
                    case KEY.TAB:
                        // if selectOnBlur == true, select the currently highlighted option
                        if (this.opts.selectOnBlur) {
                            this.selectHighlighted({noFocus:true});
                        }
                        this.close();
                        return;
                    case KEY.ESC:
                        this.cancel(e);
                        killEvent(e);
                        return;
                    }
                }

                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
                 || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
                    return;
                }

                if (e.which === KEY.ENTER) {
                    if (this.opts.openOnEnter === false) {
                        return;
                    } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
                        return;
                    }
                }

                this.open();

                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
                    // prevent the page from scrolling
                    killEvent(e);
                }

                if (e.which === KEY.ENTER) {
                    // prevent form from being submitted
                    killEvent(e);
                }

            }));

            this.search.on("keyup", this.bind(function (e) {
                this.keydowns = 0;
                this.resizeSearch();
            })
            );

            this.search.on("blur", this.bind(function(e) {
                this.container.removeClass("select2-container-active");
                this.search.removeClass("select2-focused");
                this.selectChoice(null);
                if (!this.opened()) this.clearSearch();
                e.stopImmediatePropagation();
                this.opts.element.trigger($.Event("select2-blur"));
            }));

            this.container.on("click", selector, this.bind(function (e) {
                if (!this.isInterfaceEnabled()) return;
                if ($(e.target).closest(".select2-search-choice").length > 0) {
                    // clicked inside a select2 search choice, do not open
                    return;
                }
                this.selectChoice(null);
                this.clearPlaceholder();
                if (!this.container.hasClass("select2-container-active")) {
                    this.opts.element.trigger($.Event("select2-focus"));
                }
                this.open();
                this.focusSearch();
                e.preventDefault();
            }));

            this.container.on("focus", selector, this.bind(function () {
                if (!this.isInterfaceEnabled()) return;
                if (!this.container.hasClass("select2-container-active")) {
                    this.opts.element.trigger($.Event("select2-focus"));
                }
                this.container.addClass("select2-container-active");
                this.dropdown.addClass("select2-drop-active");
                this.clearPlaceholder();
            }));

            this.initContainerWidth();
            this.opts.element.addClass("select2-offscreen");

            // set the placeholder if necessary
            this.clearSearch();
        },

        // multi
        enableInterface: function() {
            if (this.parent.enableInterface.apply(this, arguments)) {
                this.search.prop("disabled", !this.isInterfaceEnabled());
            }
        },

        // multi
        initSelection: function () {
            var data;
            if (this.opts.element.val() === "" && this.opts.element.text() === "") {
                this.updateSelection([]);
                this.close();
                // set the placeholder if necessary
                this.clearSearch();
            }
            if (this.select || this.opts.element.val() !== "") {
                var self = this;
                this.opts.initSelection.call(null, this.opts.element, function(data){
                    if (data !== undefined && data !== null) {
                        self.updateSelection(data);
                        self.close();
                        // set the placeholder if necessary
                        self.clearSearch();
                    }
                });
            }
        },

        // multi
        clearSearch: function () {
            var placeholder = this.getPlaceholder(),
                maxWidth = this.getMaxSearchWidth();

            if (placeholder !== undefined  && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
                this.search.val(placeholder).addClass("select2-default");
                // stretch the search box to full width of the container so as much of the placeholder is visible as possible
                // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
                this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
            } else {
                this.search.val("").width(10);
            }
        },

        // multi
        clearPlaceholder: function () {
            if (this.search.hasClass("select2-default")) {
                this.search.val("").removeClass("select2-default");
            }
        },

        // multi
        opening: function () {
            this.clearPlaceholder(); // should be done before super so placeholder is not used to search
            this.resizeSearch();

            this.parent.opening.apply(this, arguments);

            this.focusSearch();

            this.updateResults(true);
            this.search.focus();
            this.opts.element.trigger($.Event("select2-open"));
        },

        // multi
        close: function () {
            if (!this.opened()) return;
            this.parent.close.apply(this, arguments);
        },

        // multi
        focus: function () {
            this.close();
            this.search.focus();
        },

        // multi
        isFocused: function () {
            return this.search.hasClass("select2-focused");
        },

        // multi
        updateSelection: function (data) {
            var ids = [], filtered = [], self = this;

            // filter out duplicates
            $(data).each(function () {
                if (indexOf(self.id(this), ids) < 0) {
                    ids.push(self.id(this));
                    filtered.push(this);
                }
            });
            data = filtered;

            this.selection.find(".select2-search-choice").remove();
            $(data).each(function () {
                self.addSelectedChoice(this);
            });
            self.postprocessResults();
        },

        // multi
        tokenize: function() {
            var input = this.search.val();
            input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
            if (input != null && input != undefined) {
                this.search.val(input);
                if (input.length > 0) {
                    this.open();
                }
            }

        },

        // multi
        onSelect: function (data, options) {

            if (!this.triggerSelect(data)) { return; }

            this.addSelectedChoice(data);

            this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });

            if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);

            if (this.opts.closeOnSelect) {
                this.close();
                this.search.width(10);
            } else {
                if (this.countSelectableResults()>0) {
                    this.search.width(10);
                    this.resizeSearch();
                    if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
                        // if we reached max selection size repaint the results so choices
                        // are replaced with the max selection reached message
                        this.updateResults(true);
                    }
                    this.positionDropdown();
                } else {
                    // if nothing left to select close
                    this.close();
                    this.search.width(10);
                }
            }

            // since its not possible to select an element that has already been
            // added we do not need to check if this is a new element before firing change
            this.triggerChange({ added: data });

            if (!options || !options.noFocus)
                this.focusSearch();
        },

        // multi
        cancel: function () {
            this.close();
            this.focusSearch();
        },

        addSelectedChoice: function (data) {
            var enableChoice = !data.locked,
                enabledItem = $(
                    "<li class='select2-search-choice'>" +
                    "    <div></div>" +
                    "    <a href='#' onclick='return false;' class='select2-search-choice-close' tabindex='-1'></a>" +
                    "</li>"),
                disabledItem = $(
                    "<li class='select2-search-choice select2-locked'>" +
                    "<div></div>" +
                    "</li>");
            var choice = enableChoice ? enabledItem : disabledItem,
                id = this.id(data),
                val = this.getVal(),
                formatted,
                cssClass;

            formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
            if (formatted != undefined) {
                choice.find("div").replaceWith("<div>"+formatted+"</div>");
            }
            cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
            if (cssClass != undefined) {
                choice.addClass(cssClass);
            }

            if(enableChoice){
              choice.find(".select2-search-choice-close")
                  .on("mousedown", killEvent)
                  .on("click dblclick", this.bind(function (e) {
                  if (!this.isInterfaceEnabled()) return;

                  $(e.target).closest(".select2-search-choice").fadeOut('fast', this.bind(function(){
                      this.unselect($(e.target));
                      this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
                      this.close();
                      this.focusSearch();
                  })).dequeue();
                  killEvent(e);
              })).on("focus", this.bind(function () {
                  if (!this.isInterfaceEnabled()) return;
                  this.container.addClass("select2-container-active");
                  this.dropdown.addClass("select2-drop-active");
              }));
            }

            choice.data("select2-data", data);
            choice.insertBefore(this.searchContainer);

            val.push(id);
            this.setVal(val);
        },

        // multi
        unselect: function (selected) {
            var val = this.getVal(),
                data,
                index;

            selected = selected.closest(".select2-search-choice");

            if (selected.length === 0) {
                throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
            }

            data = selected.data("select2-data");

            if (!data) {
                // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
                // and invoked on an element already removed
                return;
            }

            index = indexOf(this.id(data), val);

            if (index >= 0) {
                val.splice(index, 1);
                this.setVal(val);
                if (this.select) this.postprocessResults();
            }
            selected.remove();

            this.opts.element.trigger({ type: "removed", val: this.id(data), choice: data });
            this.triggerChange({ removed: data });
        },

        // multi
        postprocessResults: function (data, initial, noHighlightUpdate) {
            var val = this.getVal(),
                choices = this.results.find(".select2-result"),
                compound = this.results.find(".select2-result-with-children"),
                self = this;

            choices.each2(function (i, choice) {
                var id = self.id(choice.data("select2-data"));
                if (indexOf(id, val) >= 0) {
                    choice.addClass("select2-selected");
                    // mark all children of the selected parent as selected
                    choice.find(".select2-result-selectable").addClass("select2-selected");
                }
            });

            compound.each2(function(i, choice) {
                // hide an optgroup if it doesnt have any selectable children
                if (!choice.is('.select2-result-selectable')
                    && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
                    choice.addClass("select2-selected");
                }
            });

            if (this.highlight() == -1 && noHighlightUpdate !== false){
                self.highlight(0);
            }

            //If all results are chosen render formatNoMAtches
            if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
                if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
                    if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
                        this.results.append("<li class='select2-no-results'>" + self.opts.formatNoMatches(self.search.val()) + "</li>");
                    }
                }
            }

        },

        // multi
        getMaxSearchWidth: function() {
            return this.selection.width() - getSideBorderPadding(this.search);
        },

        // multi
        resizeSearch: function () {
            var minimumWidth, left, maxWidth, containerLeft, searchWidth,
                sideBorderPadding = getSideBorderPadding(this.search);

            minimumWidth = measureTextWidth(this.search) + 10;

            left = this.search.offset().left;

            maxWidth = this.selection.width();
            containerLeft = this.selection.offset().left;

            searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;

            if (searchWidth < minimumWidth) {
                searchWidth = maxWidth - sideBorderPadding;
            }

            if (searchWidth < 40) {
                searchWidth = maxWidth - sideBorderPadding;
            }

            if (searchWidth <= 0) {
              searchWidth = minimumWidth;
            }

            this.search.width(searchWidth);
        },

        // multi
        getVal: function () {
            var val;
            if (this.select) {
                val = this.select.val();
                return val === null ? [] : val;
            } else {
                val = this.opts.element.val();
                return splitVal(val, this.opts.separator);
            }
        },

        // multi
        setVal: function (val) {
            var unique;
            if (this.select) {
                this.select.val(val);
            } else {
                unique = [];
                // filter out duplicates
                $(val).each(function () {
                    if (indexOf(this, unique) < 0) unique.push(this);
                });
                this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
            }
        },

        // multi
        buildChangeDetails: function (old, current) {
            var current = current.slice(0),
                old = old.slice(0);

            // remove intersection from each array
            for (var i = 0; i < current.length; i++) {
                for (var j = 0; j < old.length; j++) {
                    if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
                        current.splice(i, 1);
                        i--;
                        old.splice(j, 1);
                        j--;
                    }
                }
            }

            return {added: current, removed: old};
        },


        // multi
        val: function (val, triggerChange) {
            var oldData, self=this, changeDetails;

            if (arguments.length === 0) {
                return this.getVal();
            }

            oldData=this.data();
            if (!oldData.length) oldData=[];

            // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
            if (!val && val !== 0) {
                this.opts.element.val("");
                this.updateSelection([]);
                this.clearSearch();
                if (triggerChange) {
                    this.triggerChange({added: this.data(), removed: oldData});
                }
                return;
            }

            // val is a list of ids
            this.setVal(val);

            if (this.select) {
                this.opts.initSelection(this.select, this.bind(this.updateSelection));
                if (triggerChange) {
                    this.triggerChange(this.buildChangeDetails(oldData, this.data()));
                }
            } else {
                if (this.opts.initSelection === undefined) {
                    throw new Error("val() cannot be called if initSelection() is not defined");
                }

                this.opts.initSelection(this.opts.element, function(data){
                    var ids=$.map(data, self.id);
                    self.setVal(ids);
                    self.updateSelection(data);
                    self.clearSearch();
                    if (triggerChange) {
                        self.triggerChange(self.buildChangeDetails(oldData, this.data()));
                    }
                });
            }
            this.clearSearch();
        },

        // multi
        onSortStart: function() {
            if (this.select) {
                throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
            }

            // collapse search field into 0 width so its container can be collapsed as well
            this.search.width(0);
            // hide the container
            this.searchContainer.hide();
        },

        // multi
        onSortEnd:function() {

            var val=[], self=this;

            // show search and move it to the end of the list
            this.searchContainer.show();
            // make sure the search container is the last item in the list
            this.searchContainer.appendTo(this.searchContainer.parent());
            // since we collapsed the width in dragStarted, we resize it here
            this.resizeSearch();

            // update selection
            this.selection.find(".select2-search-choice").each(function() {
                val.push(self.opts.id($(this).data("select2-data")));
            });
            this.setVal(val);
            this.triggerChange();
        },

        // multi
        data: function(values, triggerChange) {
            var self=this, ids, old;
            if (arguments.length === 0) {
                 return this.selection
                     .find(".select2-search-choice")
                     .map(function() { return $(this).data("select2-data"); })
                     .get();
            } else {
                old = this.data();
                if (!values) { values = []; }
                ids = $.map(values, function(e) { return self.opts.id(e); });
                this.setVal(ids);
                this.updateSelection(values);
                this.clearSearch();
                if (triggerChange) {
                    this.triggerChange(this.buildChangeDetails(old, this.data()));
                }
            }
        }
    });

    $.fn.select2 = function () {

        var args = Array.prototype.slice.call(arguments, 0),
            opts,
            select2,
            method, value, multiple,
            allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
            valueMethods = ["opened", "isFocused", "container", "dropdown"],
            propertyMethods = ["val", "data"],
            methodsMap = { search: "externalSearch" };

        this.each(function () {
            if (args.length === 0 || typeof(args[0]) === "object") {
                opts = args.length === 0 ? {} : $.extend({}, args[0]);
                opts.element = $(this);

                if (opts.element.get(0).tagName.toLowerCase() === "select") {
                    multiple = opts.element.prop("multiple");
                } else {
                    multiple = opts.multiple || false;
                    if ("tags" in opts) {opts.multiple = multiple = true;}
                }

                select2 = multiple ? new MultiSelect2() : new SingleSelect2();
                select2.init(opts);
            } else if (typeof(args[0]) === "string") {

                if (indexOf(args[0], allowedMethods) < 0) {
                    throw "Unknown method: " + args[0];
                }

                value = undefined;
                select2 = $(this).data("select2");
                if (select2 === undefined) return;

                method=args[0];

                if (method === "container") {
                    value = select2.container;
                } else if (method === "dropdown") {
                    value = select2.dropdown;
                } else {
                    if (methodsMap[method]) method = methodsMap[method];

                    value = select2[method].apply(select2, args.slice(1));
                }
                if (indexOf(args[0], valueMethods) >= 0
                    || (indexOf(args[0], propertyMethods) && args.length == 1)) {
                    return false; // abort the iteration, ready to return first matched value
                }
            } else {
                throw "Invalid arguments to select2 plugin: " + args;
            }
        });
        return (value === undefined) ? this : value;
    };

    // plugin defaults, accessible to users
    $.fn.select2.defaults = {
        width: "copy",
        loadMorePadding: 0,
        closeOnSelect: true,
        openOnEnter: true,
        containerCss: {},
        dropdownCss: {},
        containerCssClass: "",
        dropdownCssClass: "",
        formatResult: function(result, container, query, escapeMarkup) {
            var markup=[];
            markMatch(result.text, query.term, markup, escapeMarkup);
            return markup.join("");
        },
        formatSelection: function (data, container, escapeMarkup) {
            return data ? escapeMarkup(data.text) : undefined;
        },
        sortResults: function (results, container, query) {
            return results;
        },
        formatResultCssClass: function(data) {return undefined;},
        formatSelectionCssClass: function(data, container) {return undefined;},
        formatNoMatches: function () { return "No matches found"; },
        formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " more character" + (n == 1? "" : "s"); },
        formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1? "" : "s"); },
        formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
        formatLoadMore: function (pageNumber) { return "Loading more results..."; },
        formatSearching: function () { return "Searching..."; },
        minimumResultsForSearch: 0,
        minimumInputLength: 0,
        maximumInputLength: null,
        maximumSelectionSize: 0,
        id: function (e) { return e.id; },
        matcher: function(term, text) {
            return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
        },
        separator: ",",
        tokenSeparators: [],
        tokenizer: defaultTokenizer,
        escapeMarkup: defaultEscapeMarkup,
        blurOnChange: false,
        selectOnBlur: false,
        adaptContainerCssClass: function(c) { return c; },
        adaptDropdownCssClass: function(c) { return null; },
        nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; }
    };

    $.fn.select2.ajaxDefaults = {
        transport: $.ajax,
        params: {
            type: "GET",
            cache: false,
            dataType: "json"
        }
    };

    // exports
    window.Select2 = {
        query: {
            ajax: ajax,
            local: local,
            tags: tags
        }, util: {
            debounce: debounce,
            markMatch: markMatch,
            escapeMarkup: defaultEscapeMarkup,
            stripDiacritics: stripDiacritics
        }, "class": {
            "abstract": AbstractSelect2,
            "single": SingleSelect2,
            "multi": MultiSelect2
        }
    };

}(jQuery));


}).call(global, module, undefined, undefined);

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL3NlbGVjdDIuMy40LjIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbjsgalF1ZXJ5ID0gZ2xvYmFsLmpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG47IHZhciBfX2Jyb3dzZXJpZnlfc2hpbV9yZXF1aXJlX189cmVxdWlyZTsoZnVuY3Rpb24gYnJvd3NlcmlmeVNoaW0obW9kdWxlLCBkZWZpbmUsIHJlcXVpcmUpIHtcbi8qXHJcbkNvcHlyaWdodCAyMDEyIElnb3IgVmF5bmJlcmdcclxuXHJcblZlcnNpb246IDMuNC4yIFRpbWVzdGFtcDogTW9uIEF1ZyAxMiAxNTowNDoxMiBQRFQgMjAxM1xyXG5cclxuVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJBcGFjaGUgTGljZW5zZVwiKSBvciB0aGUgR05VXHJcbkdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgXCJHUEwgTGljZW5zZVwiKS4gWW91IG1heSBjaG9vc2UgZWl0aGVyIGxpY2Vuc2UgdG8gZ292ZXJuIHlvdXJcclxudXNlIG9mIHRoaXMgc29mdHdhcmUgb25seSB1cG9uIHRoZSBjb25kaXRpb24gdGhhdCB5b3UgYWNjZXB0IGFsbCBvZiB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBBcGFjaGVcclxuTGljZW5zZSBvciB0aGUgR1BMIExpY2Vuc2UuXHJcblxyXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIGFuZCB0aGUgR1BMIExpY2Vuc2UgYXQ6XHJcblxyXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sXHJcblxyXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZVxyXG5BcGFjaGUgTGljZW5zZSBvciB0aGUgR1BMIExpY2VzbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SXHJcbkNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgQXBhY2hlIExpY2Vuc2UgYW5kIHRoZSBHUEwgTGljZW5zZSBmb3JcclxudGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIGFuZCB0aGUgR1BMIExpY2Vuc2UuXHJcbiovXHJcbihmdW5jdGlvbiAoJCkge1xyXG4gICAgaWYodHlwZW9mICQuZm4uZWFjaDIgPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICQuZXh0ZW5kKCQuZm4sIHtcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgKiA0LTEwIHRpbWVzIGZhc3RlciAuZWFjaCByZXBsYWNlbWVudFxyXG4gICAgICAgICAgICAqIHVzZSBpdCBjYXJlZnVsbHksIGFzIGl0IG92ZXJyaWRlcyBqUXVlcnkgY29udGV4dCBvZiBlbGVtZW50IG9uIGVhY2ggaXRlcmF0aW9uXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGVhY2gyIDogZnVuY3Rpb24gKGMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBqID0gJChbMF0pLCBpID0gLTEsIGwgPSB0aGlzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChcclxuICAgICAgICAgICAgICAgICAgICArK2kgPCBsXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGouY29udGV4dCA9IGpbMF0gPSB0aGlzW2ldKVxyXG4gICAgICAgICAgICAgICAgICAgICYmIGMuY2FsbChqWzBdLCBpLCBqKSAhPT0gZmFsc2UgLy9cInRoaXNcIj1ET00sIGk9aW5kZXgsIGo9alF1ZXJ5IG9iamVjdFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0pKGpRdWVyeSk7XHJcblxyXG4oZnVuY3Rpb24gKCQsIHVuZGVmaW5lZCkge1xyXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XHJcbiAgICAvKmdsb2JhbCBkb2N1bWVudCwgd2luZG93LCBqUXVlcnksIGNvbnNvbGUgKi9cclxuXHJcbiAgICBpZiAod2luZG93LlNlbGVjdDIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgS0VZLCBBYnN0cmFjdFNlbGVjdDIsIFNpbmdsZVNlbGVjdDIsIE11bHRpU2VsZWN0MiwgbmV4dFVpZCwgc2l6ZXIsXHJcbiAgICAgICAgbGFzdE1vdXNlUG9zaXRpb249e3g6MCx5OjB9LCAkZG9jdW1lbnQsIHNjcm9sbEJhckRpbWVuc2lvbnMsXHJcblxyXG4gICAgS0VZID0ge1xyXG4gICAgICAgIFRBQjogOSxcclxuICAgICAgICBFTlRFUjogMTMsXHJcbiAgICAgICAgRVNDOiAyNyxcclxuICAgICAgICBTUEFDRTogMzIsXHJcbiAgICAgICAgTEVGVDogMzcsXHJcbiAgICAgICAgVVA6IDM4LFxyXG4gICAgICAgIFJJR0hUOiAzOSxcclxuICAgICAgICBET1dOOiA0MCxcclxuICAgICAgICBTSElGVDogMTYsXHJcbiAgICAgICAgQ1RSTDogMTcsXHJcbiAgICAgICAgQUxUOiAxOCxcclxuICAgICAgICBQQUdFX1VQOiAzMyxcclxuICAgICAgICBQQUdFX0RPV046IDM0LFxyXG4gICAgICAgIEhPTUU6IDM2LFxyXG4gICAgICAgIEVORDogMzUsXHJcbiAgICAgICAgQkFDS1NQQUNFOiA4LFxyXG4gICAgICAgIERFTEVURTogNDYsXHJcbiAgICAgICAgaXNBcnJvdzogZnVuY3Rpb24gKGspIHtcclxuICAgICAgICAgICAgayA9IGsud2hpY2ggPyBrLndoaWNoIDogaztcclxuICAgICAgICAgICAgc3dpdGNoIChrKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLkxFRlQ6XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLlJJR0hUOlxyXG4gICAgICAgICAgICBjYXNlIEtFWS5VUDpcclxuICAgICAgICAgICAgY2FzZSBLRVkuRE9XTjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzQ29udHJvbDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdmFyIGsgPSBlLndoaWNoO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGspIHtcclxuICAgICAgICAgICAgY2FzZSBLRVkuU0hJRlQ6XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLkNUUkw6XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLkFMVDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZS5tZXRhS2V5KSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzRnVuY3Rpb25LZXk6IGZ1bmN0aW9uIChrKSB7XHJcbiAgICAgICAgICAgIGsgPSBrLndoaWNoID8gay53aGljaCA6IGs7XHJcbiAgICAgICAgICAgIHJldHVybiBrID49IDExMiAmJiBrIDw9IDEyMztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgTUVBU1VSRV9TQ1JPTExCQVJfVEVNUExBVEUgPSBcIjxkaXYgY2xhc3M9J3NlbGVjdDItbWVhc3VyZS1zY3JvbGxiYXInPjwvZGl2PlwiLFxyXG5cclxuICAgIERJQUNSSVRJQ1MgPSB7XCJcXHUyNEI2XCI6XCJBXCIsXCJcXHVGRjIxXCI6XCJBXCIsXCJcXHUwMEMwXCI6XCJBXCIsXCJcXHUwMEMxXCI6XCJBXCIsXCJcXHUwMEMyXCI6XCJBXCIsXCJcXHUxRUE2XCI6XCJBXCIsXCJcXHUxRUE0XCI6XCJBXCIsXCJcXHUxRUFBXCI6XCJBXCIsXCJcXHUxRUE4XCI6XCJBXCIsXCJcXHUwMEMzXCI6XCJBXCIsXCJcXHUwMTAwXCI6XCJBXCIsXCJcXHUwMTAyXCI6XCJBXCIsXCJcXHUxRUIwXCI6XCJBXCIsXCJcXHUxRUFFXCI6XCJBXCIsXCJcXHUxRUI0XCI6XCJBXCIsXCJcXHUxRUIyXCI6XCJBXCIsXCJcXHUwMjI2XCI6XCJBXCIsXCJcXHUwMUUwXCI6XCJBXCIsXCJcXHUwMEM0XCI6XCJBXCIsXCJcXHUwMURFXCI6XCJBXCIsXCJcXHUxRUEyXCI6XCJBXCIsXCJcXHUwMEM1XCI6XCJBXCIsXCJcXHUwMUZBXCI6XCJBXCIsXCJcXHUwMUNEXCI6XCJBXCIsXCJcXHUwMjAwXCI6XCJBXCIsXCJcXHUwMjAyXCI6XCJBXCIsXCJcXHUxRUEwXCI6XCJBXCIsXCJcXHUxRUFDXCI6XCJBXCIsXCJcXHUxRUI2XCI6XCJBXCIsXCJcXHUxRTAwXCI6XCJBXCIsXCJcXHUwMTA0XCI6XCJBXCIsXCJcXHUwMjNBXCI6XCJBXCIsXCJcXHUyQzZGXCI6XCJBXCIsXCJcXHVBNzMyXCI6XCJBQVwiLFwiXFx1MDBDNlwiOlwiQUVcIixcIlxcdTAxRkNcIjpcIkFFXCIsXCJcXHUwMUUyXCI6XCJBRVwiLFwiXFx1QTczNFwiOlwiQU9cIixcIlxcdUE3MzZcIjpcIkFVXCIsXCJcXHVBNzM4XCI6XCJBVlwiLFwiXFx1QTczQVwiOlwiQVZcIixcIlxcdUE3M0NcIjpcIkFZXCIsXCJcXHUyNEI3XCI6XCJCXCIsXCJcXHVGRjIyXCI6XCJCXCIsXCJcXHUxRTAyXCI6XCJCXCIsXCJcXHUxRTA0XCI6XCJCXCIsXCJcXHUxRTA2XCI6XCJCXCIsXCJcXHUwMjQzXCI6XCJCXCIsXCJcXHUwMTgyXCI6XCJCXCIsXCJcXHUwMTgxXCI6XCJCXCIsXCJcXHUyNEI4XCI6XCJDXCIsXCJcXHVGRjIzXCI6XCJDXCIsXCJcXHUwMTA2XCI6XCJDXCIsXCJcXHUwMTA4XCI6XCJDXCIsXCJcXHUwMTBBXCI6XCJDXCIsXCJcXHUwMTBDXCI6XCJDXCIsXCJcXHUwMEM3XCI6XCJDXCIsXCJcXHUxRTA4XCI6XCJDXCIsXCJcXHUwMTg3XCI6XCJDXCIsXCJcXHUwMjNCXCI6XCJDXCIsXCJcXHVBNzNFXCI6XCJDXCIsXCJcXHUyNEI5XCI6XCJEXCIsXCJcXHVGRjI0XCI6XCJEXCIsXCJcXHUxRTBBXCI6XCJEXCIsXCJcXHUwMTBFXCI6XCJEXCIsXCJcXHUxRTBDXCI6XCJEXCIsXCJcXHUxRTEwXCI6XCJEXCIsXCJcXHUxRTEyXCI6XCJEXCIsXCJcXHUxRTBFXCI6XCJEXCIsXCJcXHUwMTEwXCI6XCJEXCIsXCJcXHUwMThCXCI6XCJEXCIsXCJcXHUwMThBXCI6XCJEXCIsXCJcXHUwMTg5XCI6XCJEXCIsXCJcXHVBNzc5XCI6XCJEXCIsXCJcXHUwMUYxXCI6XCJEWlwiLFwiXFx1MDFDNFwiOlwiRFpcIixcIlxcdTAxRjJcIjpcIkR6XCIsXCJcXHUwMUM1XCI6XCJEelwiLFwiXFx1MjRCQVwiOlwiRVwiLFwiXFx1RkYyNVwiOlwiRVwiLFwiXFx1MDBDOFwiOlwiRVwiLFwiXFx1MDBDOVwiOlwiRVwiLFwiXFx1MDBDQVwiOlwiRVwiLFwiXFx1MUVDMFwiOlwiRVwiLFwiXFx1MUVCRVwiOlwiRVwiLFwiXFx1MUVDNFwiOlwiRVwiLFwiXFx1MUVDMlwiOlwiRVwiLFwiXFx1MUVCQ1wiOlwiRVwiLFwiXFx1MDExMlwiOlwiRVwiLFwiXFx1MUUxNFwiOlwiRVwiLFwiXFx1MUUxNlwiOlwiRVwiLFwiXFx1MDExNFwiOlwiRVwiLFwiXFx1MDExNlwiOlwiRVwiLFwiXFx1MDBDQlwiOlwiRVwiLFwiXFx1MUVCQVwiOlwiRVwiLFwiXFx1MDExQVwiOlwiRVwiLFwiXFx1MDIwNFwiOlwiRVwiLFwiXFx1MDIwNlwiOlwiRVwiLFwiXFx1MUVCOFwiOlwiRVwiLFwiXFx1MUVDNlwiOlwiRVwiLFwiXFx1MDIyOFwiOlwiRVwiLFwiXFx1MUUxQ1wiOlwiRVwiLFwiXFx1MDExOFwiOlwiRVwiLFwiXFx1MUUxOFwiOlwiRVwiLFwiXFx1MUUxQVwiOlwiRVwiLFwiXFx1MDE5MFwiOlwiRVwiLFwiXFx1MDE4RVwiOlwiRVwiLFwiXFx1MjRCQlwiOlwiRlwiLFwiXFx1RkYyNlwiOlwiRlwiLFwiXFx1MUUxRVwiOlwiRlwiLFwiXFx1MDE5MVwiOlwiRlwiLFwiXFx1QTc3QlwiOlwiRlwiLFwiXFx1MjRCQ1wiOlwiR1wiLFwiXFx1RkYyN1wiOlwiR1wiLFwiXFx1MDFGNFwiOlwiR1wiLFwiXFx1MDExQ1wiOlwiR1wiLFwiXFx1MUUyMFwiOlwiR1wiLFwiXFx1MDExRVwiOlwiR1wiLFwiXFx1MDEyMFwiOlwiR1wiLFwiXFx1MDFFNlwiOlwiR1wiLFwiXFx1MDEyMlwiOlwiR1wiLFwiXFx1MDFFNFwiOlwiR1wiLFwiXFx1MDE5M1wiOlwiR1wiLFwiXFx1QTdBMFwiOlwiR1wiLFwiXFx1QTc3RFwiOlwiR1wiLFwiXFx1QTc3RVwiOlwiR1wiLFwiXFx1MjRCRFwiOlwiSFwiLFwiXFx1RkYyOFwiOlwiSFwiLFwiXFx1MDEyNFwiOlwiSFwiLFwiXFx1MUUyMlwiOlwiSFwiLFwiXFx1MUUyNlwiOlwiSFwiLFwiXFx1MDIxRVwiOlwiSFwiLFwiXFx1MUUyNFwiOlwiSFwiLFwiXFx1MUUyOFwiOlwiSFwiLFwiXFx1MUUyQVwiOlwiSFwiLFwiXFx1MDEyNlwiOlwiSFwiLFwiXFx1MkM2N1wiOlwiSFwiLFwiXFx1MkM3NVwiOlwiSFwiLFwiXFx1QTc4RFwiOlwiSFwiLFwiXFx1MjRCRVwiOlwiSVwiLFwiXFx1RkYyOVwiOlwiSVwiLFwiXFx1MDBDQ1wiOlwiSVwiLFwiXFx1MDBDRFwiOlwiSVwiLFwiXFx1MDBDRVwiOlwiSVwiLFwiXFx1MDEyOFwiOlwiSVwiLFwiXFx1MDEyQVwiOlwiSVwiLFwiXFx1MDEyQ1wiOlwiSVwiLFwiXFx1MDEzMFwiOlwiSVwiLFwiXFx1MDBDRlwiOlwiSVwiLFwiXFx1MUUyRVwiOlwiSVwiLFwiXFx1MUVDOFwiOlwiSVwiLFwiXFx1MDFDRlwiOlwiSVwiLFwiXFx1MDIwOFwiOlwiSVwiLFwiXFx1MDIwQVwiOlwiSVwiLFwiXFx1MUVDQVwiOlwiSVwiLFwiXFx1MDEyRVwiOlwiSVwiLFwiXFx1MUUyQ1wiOlwiSVwiLFwiXFx1MDE5N1wiOlwiSVwiLFwiXFx1MjRCRlwiOlwiSlwiLFwiXFx1RkYyQVwiOlwiSlwiLFwiXFx1MDEzNFwiOlwiSlwiLFwiXFx1MDI0OFwiOlwiSlwiLFwiXFx1MjRDMFwiOlwiS1wiLFwiXFx1RkYyQlwiOlwiS1wiLFwiXFx1MUUzMFwiOlwiS1wiLFwiXFx1MDFFOFwiOlwiS1wiLFwiXFx1MUUzMlwiOlwiS1wiLFwiXFx1MDEzNlwiOlwiS1wiLFwiXFx1MUUzNFwiOlwiS1wiLFwiXFx1MDE5OFwiOlwiS1wiLFwiXFx1MkM2OVwiOlwiS1wiLFwiXFx1QTc0MFwiOlwiS1wiLFwiXFx1QTc0MlwiOlwiS1wiLFwiXFx1QTc0NFwiOlwiS1wiLFwiXFx1QTdBMlwiOlwiS1wiLFwiXFx1MjRDMVwiOlwiTFwiLFwiXFx1RkYyQ1wiOlwiTFwiLFwiXFx1MDEzRlwiOlwiTFwiLFwiXFx1MDEzOVwiOlwiTFwiLFwiXFx1MDEzRFwiOlwiTFwiLFwiXFx1MUUzNlwiOlwiTFwiLFwiXFx1MUUzOFwiOlwiTFwiLFwiXFx1MDEzQlwiOlwiTFwiLFwiXFx1MUUzQ1wiOlwiTFwiLFwiXFx1MUUzQVwiOlwiTFwiLFwiXFx1MDE0MVwiOlwiTFwiLFwiXFx1MDIzRFwiOlwiTFwiLFwiXFx1MkM2MlwiOlwiTFwiLFwiXFx1MkM2MFwiOlwiTFwiLFwiXFx1QTc0OFwiOlwiTFwiLFwiXFx1QTc0NlwiOlwiTFwiLFwiXFx1QTc4MFwiOlwiTFwiLFwiXFx1MDFDN1wiOlwiTEpcIixcIlxcdTAxQzhcIjpcIkxqXCIsXCJcXHUyNEMyXCI6XCJNXCIsXCJcXHVGRjJEXCI6XCJNXCIsXCJcXHUxRTNFXCI6XCJNXCIsXCJcXHUxRTQwXCI6XCJNXCIsXCJcXHUxRTQyXCI6XCJNXCIsXCJcXHUyQzZFXCI6XCJNXCIsXCJcXHUwMTlDXCI6XCJNXCIsXCJcXHUyNEMzXCI6XCJOXCIsXCJcXHVGRjJFXCI6XCJOXCIsXCJcXHUwMUY4XCI6XCJOXCIsXCJcXHUwMTQzXCI6XCJOXCIsXCJcXHUwMEQxXCI6XCJOXCIsXCJcXHUxRTQ0XCI6XCJOXCIsXCJcXHUwMTQ3XCI6XCJOXCIsXCJcXHUxRTQ2XCI6XCJOXCIsXCJcXHUwMTQ1XCI6XCJOXCIsXCJcXHUxRTRBXCI6XCJOXCIsXCJcXHUxRTQ4XCI6XCJOXCIsXCJcXHUwMjIwXCI6XCJOXCIsXCJcXHUwMTlEXCI6XCJOXCIsXCJcXHVBNzkwXCI6XCJOXCIsXCJcXHVBN0E0XCI6XCJOXCIsXCJcXHUwMUNBXCI6XCJOSlwiLFwiXFx1MDFDQlwiOlwiTmpcIixcIlxcdTI0QzRcIjpcIk9cIixcIlxcdUZGMkZcIjpcIk9cIixcIlxcdTAwRDJcIjpcIk9cIixcIlxcdTAwRDNcIjpcIk9cIixcIlxcdTAwRDRcIjpcIk9cIixcIlxcdTFFRDJcIjpcIk9cIixcIlxcdTFFRDBcIjpcIk9cIixcIlxcdTFFRDZcIjpcIk9cIixcIlxcdTFFRDRcIjpcIk9cIixcIlxcdTAwRDVcIjpcIk9cIixcIlxcdTFFNENcIjpcIk9cIixcIlxcdTAyMkNcIjpcIk9cIixcIlxcdTFFNEVcIjpcIk9cIixcIlxcdTAxNENcIjpcIk9cIixcIlxcdTFFNTBcIjpcIk9cIixcIlxcdTFFNTJcIjpcIk9cIixcIlxcdTAxNEVcIjpcIk9cIixcIlxcdTAyMkVcIjpcIk9cIixcIlxcdTAyMzBcIjpcIk9cIixcIlxcdTAwRDZcIjpcIk9cIixcIlxcdTAyMkFcIjpcIk9cIixcIlxcdTFFQ0VcIjpcIk9cIixcIlxcdTAxNTBcIjpcIk9cIixcIlxcdTAxRDFcIjpcIk9cIixcIlxcdTAyMENcIjpcIk9cIixcIlxcdTAyMEVcIjpcIk9cIixcIlxcdTAxQTBcIjpcIk9cIixcIlxcdTFFRENcIjpcIk9cIixcIlxcdTFFREFcIjpcIk9cIixcIlxcdTFFRTBcIjpcIk9cIixcIlxcdTFFREVcIjpcIk9cIixcIlxcdTFFRTJcIjpcIk9cIixcIlxcdTFFQ0NcIjpcIk9cIixcIlxcdTFFRDhcIjpcIk9cIixcIlxcdTAxRUFcIjpcIk9cIixcIlxcdTAxRUNcIjpcIk9cIixcIlxcdTAwRDhcIjpcIk9cIixcIlxcdTAxRkVcIjpcIk9cIixcIlxcdTAxODZcIjpcIk9cIixcIlxcdTAxOUZcIjpcIk9cIixcIlxcdUE3NEFcIjpcIk9cIixcIlxcdUE3NENcIjpcIk9cIixcIlxcdTAxQTJcIjpcIk9JXCIsXCJcXHVBNzRFXCI6XCJPT1wiLFwiXFx1MDIyMlwiOlwiT1VcIixcIlxcdTI0QzVcIjpcIlBcIixcIlxcdUZGMzBcIjpcIlBcIixcIlxcdTFFNTRcIjpcIlBcIixcIlxcdTFFNTZcIjpcIlBcIixcIlxcdTAxQTRcIjpcIlBcIixcIlxcdTJDNjNcIjpcIlBcIixcIlxcdUE3NTBcIjpcIlBcIixcIlxcdUE3NTJcIjpcIlBcIixcIlxcdUE3NTRcIjpcIlBcIixcIlxcdTI0QzZcIjpcIlFcIixcIlxcdUZGMzFcIjpcIlFcIixcIlxcdUE3NTZcIjpcIlFcIixcIlxcdUE3NThcIjpcIlFcIixcIlxcdTAyNEFcIjpcIlFcIixcIlxcdTI0QzdcIjpcIlJcIixcIlxcdUZGMzJcIjpcIlJcIixcIlxcdTAxNTRcIjpcIlJcIixcIlxcdTFFNThcIjpcIlJcIixcIlxcdTAxNThcIjpcIlJcIixcIlxcdTAyMTBcIjpcIlJcIixcIlxcdTAyMTJcIjpcIlJcIixcIlxcdTFFNUFcIjpcIlJcIixcIlxcdTFFNUNcIjpcIlJcIixcIlxcdTAxNTZcIjpcIlJcIixcIlxcdTFFNUVcIjpcIlJcIixcIlxcdTAyNENcIjpcIlJcIixcIlxcdTJDNjRcIjpcIlJcIixcIlxcdUE3NUFcIjpcIlJcIixcIlxcdUE3QTZcIjpcIlJcIixcIlxcdUE3ODJcIjpcIlJcIixcIlxcdTI0QzhcIjpcIlNcIixcIlxcdUZGMzNcIjpcIlNcIixcIlxcdTFFOUVcIjpcIlNcIixcIlxcdTAxNUFcIjpcIlNcIixcIlxcdTFFNjRcIjpcIlNcIixcIlxcdTAxNUNcIjpcIlNcIixcIlxcdTFFNjBcIjpcIlNcIixcIlxcdTAxNjBcIjpcIlNcIixcIlxcdTFFNjZcIjpcIlNcIixcIlxcdTFFNjJcIjpcIlNcIixcIlxcdTFFNjhcIjpcIlNcIixcIlxcdTAyMThcIjpcIlNcIixcIlxcdTAxNUVcIjpcIlNcIixcIlxcdTJDN0VcIjpcIlNcIixcIlxcdUE3QThcIjpcIlNcIixcIlxcdUE3ODRcIjpcIlNcIixcIlxcdTI0QzlcIjpcIlRcIixcIlxcdUZGMzRcIjpcIlRcIixcIlxcdTFFNkFcIjpcIlRcIixcIlxcdTAxNjRcIjpcIlRcIixcIlxcdTFFNkNcIjpcIlRcIixcIlxcdTAyMUFcIjpcIlRcIixcIlxcdTAxNjJcIjpcIlRcIixcIlxcdTFFNzBcIjpcIlRcIixcIlxcdTFFNkVcIjpcIlRcIixcIlxcdTAxNjZcIjpcIlRcIixcIlxcdTAxQUNcIjpcIlRcIixcIlxcdTAxQUVcIjpcIlRcIixcIlxcdTAyM0VcIjpcIlRcIixcIlxcdUE3ODZcIjpcIlRcIixcIlxcdUE3MjhcIjpcIlRaXCIsXCJcXHUyNENBXCI6XCJVXCIsXCJcXHVGRjM1XCI6XCJVXCIsXCJcXHUwMEQ5XCI6XCJVXCIsXCJcXHUwMERBXCI6XCJVXCIsXCJcXHUwMERCXCI6XCJVXCIsXCJcXHUwMTY4XCI6XCJVXCIsXCJcXHUxRTc4XCI6XCJVXCIsXCJcXHUwMTZBXCI6XCJVXCIsXCJcXHUxRTdBXCI6XCJVXCIsXCJcXHUwMTZDXCI6XCJVXCIsXCJcXHUwMERDXCI6XCJVXCIsXCJcXHUwMURCXCI6XCJVXCIsXCJcXHUwMUQ3XCI6XCJVXCIsXCJcXHUwMUQ1XCI6XCJVXCIsXCJcXHUwMUQ5XCI6XCJVXCIsXCJcXHUxRUU2XCI6XCJVXCIsXCJcXHUwMTZFXCI6XCJVXCIsXCJcXHUwMTcwXCI6XCJVXCIsXCJcXHUwMUQzXCI6XCJVXCIsXCJcXHUwMjE0XCI6XCJVXCIsXCJcXHUwMjE2XCI6XCJVXCIsXCJcXHUwMUFGXCI6XCJVXCIsXCJcXHUxRUVBXCI6XCJVXCIsXCJcXHUxRUU4XCI6XCJVXCIsXCJcXHUxRUVFXCI6XCJVXCIsXCJcXHUxRUVDXCI6XCJVXCIsXCJcXHUxRUYwXCI6XCJVXCIsXCJcXHUxRUU0XCI6XCJVXCIsXCJcXHUxRTcyXCI6XCJVXCIsXCJcXHUwMTcyXCI6XCJVXCIsXCJcXHUxRTc2XCI6XCJVXCIsXCJcXHUxRTc0XCI6XCJVXCIsXCJcXHUwMjQ0XCI6XCJVXCIsXCJcXHUyNENCXCI6XCJWXCIsXCJcXHVGRjM2XCI6XCJWXCIsXCJcXHUxRTdDXCI6XCJWXCIsXCJcXHUxRTdFXCI6XCJWXCIsXCJcXHUwMUIyXCI6XCJWXCIsXCJcXHVBNzVFXCI6XCJWXCIsXCJcXHUwMjQ1XCI6XCJWXCIsXCJcXHVBNzYwXCI6XCJWWVwiLFwiXFx1MjRDQ1wiOlwiV1wiLFwiXFx1RkYzN1wiOlwiV1wiLFwiXFx1MUU4MFwiOlwiV1wiLFwiXFx1MUU4MlwiOlwiV1wiLFwiXFx1MDE3NFwiOlwiV1wiLFwiXFx1MUU4NlwiOlwiV1wiLFwiXFx1MUU4NFwiOlwiV1wiLFwiXFx1MUU4OFwiOlwiV1wiLFwiXFx1MkM3MlwiOlwiV1wiLFwiXFx1MjRDRFwiOlwiWFwiLFwiXFx1RkYzOFwiOlwiWFwiLFwiXFx1MUU4QVwiOlwiWFwiLFwiXFx1MUU4Q1wiOlwiWFwiLFwiXFx1MjRDRVwiOlwiWVwiLFwiXFx1RkYzOVwiOlwiWVwiLFwiXFx1MUVGMlwiOlwiWVwiLFwiXFx1MDBERFwiOlwiWVwiLFwiXFx1MDE3NlwiOlwiWVwiLFwiXFx1MUVGOFwiOlwiWVwiLFwiXFx1MDIzMlwiOlwiWVwiLFwiXFx1MUU4RVwiOlwiWVwiLFwiXFx1MDE3OFwiOlwiWVwiLFwiXFx1MUVGNlwiOlwiWVwiLFwiXFx1MUVGNFwiOlwiWVwiLFwiXFx1MDFCM1wiOlwiWVwiLFwiXFx1MDI0RVwiOlwiWVwiLFwiXFx1MUVGRVwiOlwiWVwiLFwiXFx1MjRDRlwiOlwiWlwiLFwiXFx1RkYzQVwiOlwiWlwiLFwiXFx1MDE3OVwiOlwiWlwiLFwiXFx1MUU5MFwiOlwiWlwiLFwiXFx1MDE3QlwiOlwiWlwiLFwiXFx1MDE3RFwiOlwiWlwiLFwiXFx1MUU5MlwiOlwiWlwiLFwiXFx1MUU5NFwiOlwiWlwiLFwiXFx1MDFCNVwiOlwiWlwiLFwiXFx1MDIyNFwiOlwiWlwiLFwiXFx1MkM3RlwiOlwiWlwiLFwiXFx1MkM2QlwiOlwiWlwiLFwiXFx1QTc2MlwiOlwiWlwiLFwiXFx1MjREMFwiOlwiYVwiLFwiXFx1RkY0MVwiOlwiYVwiLFwiXFx1MUU5QVwiOlwiYVwiLFwiXFx1MDBFMFwiOlwiYVwiLFwiXFx1MDBFMVwiOlwiYVwiLFwiXFx1MDBFMlwiOlwiYVwiLFwiXFx1MUVBN1wiOlwiYVwiLFwiXFx1MUVBNVwiOlwiYVwiLFwiXFx1MUVBQlwiOlwiYVwiLFwiXFx1MUVBOVwiOlwiYVwiLFwiXFx1MDBFM1wiOlwiYVwiLFwiXFx1MDEwMVwiOlwiYVwiLFwiXFx1MDEwM1wiOlwiYVwiLFwiXFx1MUVCMVwiOlwiYVwiLFwiXFx1MUVBRlwiOlwiYVwiLFwiXFx1MUVCNVwiOlwiYVwiLFwiXFx1MUVCM1wiOlwiYVwiLFwiXFx1MDIyN1wiOlwiYVwiLFwiXFx1MDFFMVwiOlwiYVwiLFwiXFx1MDBFNFwiOlwiYVwiLFwiXFx1MDFERlwiOlwiYVwiLFwiXFx1MUVBM1wiOlwiYVwiLFwiXFx1MDBFNVwiOlwiYVwiLFwiXFx1MDFGQlwiOlwiYVwiLFwiXFx1MDFDRVwiOlwiYVwiLFwiXFx1MDIwMVwiOlwiYVwiLFwiXFx1MDIwM1wiOlwiYVwiLFwiXFx1MUVBMVwiOlwiYVwiLFwiXFx1MUVBRFwiOlwiYVwiLFwiXFx1MUVCN1wiOlwiYVwiLFwiXFx1MUUwMVwiOlwiYVwiLFwiXFx1MDEwNVwiOlwiYVwiLFwiXFx1MkM2NVwiOlwiYVwiLFwiXFx1MDI1MFwiOlwiYVwiLFwiXFx1QTczM1wiOlwiYWFcIixcIlxcdTAwRTZcIjpcImFlXCIsXCJcXHUwMUZEXCI6XCJhZVwiLFwiXFx1MDFFM1wiOlwiYWVcIixcIlxcdUE3MzVcIjpcImFvXCIsXCJcXHVBNzM3XCI6XCJhdVwiLFwiXFx1QTczOVwiOlwiYXZcIixcIlxcdUE3M0JcIjpcImF2XCIsXCJcXHVBNzNEXCI6XCJheVwiLFwiXFx1MjREMVwiOlwiYlwiLFwiXFx1RkY0MlwiOlwiYlwiLFwiXFx1MUUwM1wiOlwiYlwiLFwiXFx1MUUwNVwiOlwiYlwiLFwiXFx1MUUwN1wiOlwiYlwiLFwiXFx1MDE4MFwiOlwiYlwiLFwiXFx1MDE4M1wiOlwiYlwiLFwiXFx1MDI1M1wiOlwiYlwiLFwiXFx1MjREMlwiOlwiY1wiLFwiXFx1RkY0M1wiOlwiY1wiLFwiXFx1MDEwN1wiOlwiY1wiLFwiXFx1MDEwOVwiOlwiY1wiLFwiXFx1MDEwQlwiOlwiY1wiLFwiXFx1MDEwRFwiOlwiY1wiLFwiXFx1MDBFN1wiOlwiY1wiLFwiXFx1MUUwOVwiOlwiY1wiLFwiXFx1MDE4OFwiOlwiY1wiLFwiXFx1MDIzQ1wiOlwiY1wiLFwiXFx1QTczRlwiOlwiY1wiLFwiXFx1MjE4NFwiOlwiY1wiLFwiXFx1MjREM1wiOlwiZFwiLFwiXFx1RkY0NFwiOlwiZFwiLFwiXFx1MUUwQlwiOlwiZFwiLFwiXFx1MDEwRlwiOlwiZFwiLFwiXFx1MUUwRFwiOlwiZFwiLFwiXFx1MUUxMVwiOlwiZFwiLFwiXFx1MUUxM1wiOlwiZFwiLFwiXFx1MUUwRlwiOlwiZFwiLFwiXFx1MDExMVwiOlwiZFwiLFwiXFx1MDE4Q1wiOlwiZFwiLFwiXFx1MDI1NlwiOlwiZFwiLFwiXFx1MDI1N1wiOlwiZFwiLFwiXFx1QTc3QVwiOlwiZFwiLFwiXFx1MDFGM1wiOlwiZHpcIixcIlxcdTAxQzZcIjpcImR6XCIsXCJcXHUyNEQ0XCI6XCJlXCIsXCJcXHVGRjQ1XCI6XCJlXCIsXCJcXHUwMEU4XCI6XCJlXCIsXCJcXHUwMEU5XCI6XCJlXCIsXCJcXHUwMEVBXCI6XCJlXCIsXCJcXHUxRUMxXCI6XCJlXCIsXCJcXHUxRUJGXCI6XCJlXCIsXCJcXHUxRUM1XCI6XCJlXCIsXCJcXHUxRUMzXCI6XCJlXCIsXCJcXHUxRUJEXCI6XCJlXCIsXCJcXHUwMTEzXCI6XCJlXCIsXCJcXHUxRTE1XCI6XCJlXCIsXCJcXHUxRTE3XCI6XCJlXCIsXCJcXHUwMTE1XCI6XCJlXCIsXCJcXHUwMTE3XCI6XCJlXCIsXCJcXHUwMEVCXCI6XCJlXCIsXCJcXHUxRUJCXCI6XCJlXCIsXCJcXHUwMTFCXCI6XCJlXCIsXCJcXHUwMjA1XCI6XCJlXCIsXCJcXHUwMjA3XCI6XCJlXCIsXCJcXHUxRUI5XCI6XCJlXCIsXCJcXHUxRUM3XCI6XCJlXCIsXCJcXHUwMjI5XCI6XCJlXCIsXCJcXHUxRTFEXCI6XCJlXCIsXCJcXHUwMTE5XCI6XCJlXCIsXCJcXHUxRTE5XCI6XCJlXCIsXCJcXHUxRTFCXCI6XCJlXCIsXCJcXHUwMjQ3XCI6XCJlXCIsXCJcXHUwMjVCXCI6XCJlXCIsXCJcXHUwMUREXCI6XCJlXCIsXCJcXHUyNEQ1XCI6XCJmXCIsXCJcXHVGRjQ2XCI6XCJmXCIsXCJcXHUxRTFGXCI6XCJmXCIsXCJcXHUwMTkyXCI6XCJmXCIsXCJcXHVBNzdDXCI6XCJmXCIsXCJcXHUyNEQ2XCI6XCJnXCIsXCJcXHVGRjQ3XCI6XCJnXCIsXCJcXHUwMUY1XCI6XCJnXCIsXCJcXHUwMTFEXCI6XCJnXCIsXCJcXHUxRTIxXCI6XCJnXCIsXCJcXHUwMTFGXCI6XCJnXCIsXCJcXHUwMTIxXCI6XCJnXCIsXCJcXHUwMUU3XCI6XCJnXCIsXCJcXHUwMTIzXCI6XCJnXCIsXCJcXHUwMUU1XCI6XCJnXCIsXCJcXHUwMjYwXCI6XCJnXCIsXCJcXHVBN0ExXCI6XCJnXCIsXCJcXHUxRDc5XCI6XCJnXCIsXCJcXHVBNzdGXCI6XCJnXCIsXCJcXHUyNEQ3XCI6XCJoXCIsXCJcXHVGRjQ4XCI6XCJoXCIsXCJcXHUwMTI1XCI6XCJoXCIsXCJcXHUxRTIzXCI6XCJoXCIsXCJcXHUxRTI3XCI6XCJoXCIsXCJcXHUwMjFGXCI6XCJoXCIsXCJcXHUxRTI1XCI6XCJoXCIsXCJcXHUxRTI5XCI6XCJoXCIsXCJcXHUxRTJCXCI6XCJoXCIsXCJcXHUxRTk2XCI6XCJoXCIsXCJcXHUwMTI3XCI6XCJoXCIsXCJcXHUyQzY4XCI6XCJoXCIsXCJcXHUyQzc2XCI6XCJoXCIsXCJcXHUwMjY1XCI6XCJoXCIsXCJcXHUwMTk1XCI6XCJodlwiLFwiXFx1MjREOFwiOlwiaVwiLFwiXFx1RkY0OVwiOlwiaVwiLFwiXFx1MDBFQ1wiOlwiaVwiLFwiXFx1MDBFRFwiOlwiaVwiLFwiXFx1MDBFRVwiOlwiaVwiLFwiXFx1MDEyOVwiOlwiaVwiLFwiXFx1MDEyQlwiOlwiaVwiLFwiXFx1MDEyRFwiOlwiaVwiLFwiXFx1MDBFRlwiOlwiaVwiLFwiXFx1MUUyRlwiOlwiaVwiLFwiXFx1MUVDOVwiOlwiaVwiLFwiXFx1MDFEMFwiOlwiaVwiLFwiXFx1MDIwOVwiOlwiaVwiLFwiXFx1MDIwQlwiOlwiaVwiLFwiXFx1MUVDQlwiOlwiaVwiLFwiXFx1MDEyRlwiOlwiaVwiLFwiXFx1MUUyRFwiOlwiaVwiLFwiXFx1MDI2OFwiOlwiaVwiLFwiXFx1MDEzMVwiOlwiaVwiLFwiXFx1MjREOVwiOlwialwiLFwiXFx1RkY0QVwiOlwialwiLFwiXFx1MDEzNVwiOlwialwiLFwiXFx1MDFGMFwiOlwialwiLFwiXFx1MDI0OVwiOlwialwiLFwiXFx1MjREQVwiOlwia1wiLFwiXFx1RkY0QlwiOlwia1wiLFwiXFx1MUUzMVwiOlwia1wiLFwiXFx1MDFFOVwiOlwia1wiLFwiXFx1MUUzM1wiOlwia1wiLFwiXFx1MDEzN1wiOlwia1wiLFwiXFx1MUUzNVwiOlwia1wiLFwiXFx1MDE5OVwiOlwia1wiLFwiXFx1MkM2QVwiOlwia1wiLFwiXFx1QTc0MVwiOlwia1wiLFwiXFx1QTc0M1wiOlwia1wiLFwiXFx1QTc0NVwiOlwia1wiLFwiXFx1QTdBM1wiOlwia1wiLFwiXFx1MjREQlwiOlwibFwiLFwiXFx1RkY0Q1wiOlwibFwiLFwiXFx1MDE0MFwiOlwibFwiLFwiXFx1MDEzQVwiOlwibFwiLFwiXFx1MDEzRVwiOlwibFwiLFwiXFx1MUUzN1wiOlwibFwiLFwiXFx1MUUzOVwiOlwibFwiLFwiXFx1MDEzQ1wiOlwibFwiLFwiXFx1MUUzRFwiOlwibFwiLFwiXFx1MUUzQlwiOlwibFwiLFwiXFx1MDE3RlwiOlwibFwiLFwiXFx1MDE0MlwiOlwibFwiLFwiXFx1MDE5QVwiOlwibFwiLFwiXFx1MDI2QlwiOlwibFwiLFwiXFx1MkM2MVwiOlwibFwiLFwiXFx1QTc0OVwiOlwibFwiLFwiXFx1QTc4MVwiOlwibFwiLFwiXFx1QTc0N1wiOlwibFwiLFwiXFx1MDFDOVwiOlwibGpcIixcIlxcdTI0RENcIjpcIm1cIixcIlxcdUZGNERcIjpcIm1cIixcIlxcdTFFM0ZcIjpcIm1cIixcIlxcdTFFNDFcIjpcIm1cIixcIlxcdTFFNDNcIjpcIm1cIixcIlxcdTAyNzFcIjpcIm1cIixcIlxcdTAyNkZcIjpcIm1cIixcIlxcdTI0RERcIjpcIm5cIixcIlxcdUZGNEVcIjpcIm5cIixcIlxcdTAxRjlcIjpcIm5cIixcIlxcdTAxNDRcIjpcIm5cIixcIlxcdTAwRjFcIjpcIm5cIixcIlxcdTFFNDVcIjpcIm5cIixcIlxcdTAxNDhcIjpcIm5cIixcIlxcdTFFNDdcIjpcIm5cIixcIlxcdTAxNDZcIjpcIm5cIixcIlxcdTFFNEJcIjpcIm5cIixcIlxcdTFFNDlcIjpcIm5cIixcIlxcdTAxOUVcIjpcIm5cIixcIlxcdTAyNzJcIjpcIm5cIixcIlxcdTAxNDlcIjpcIm5cIixcIlxcdUE3OTFcIjpcIm5cIixcIlxcdUE3QTVcIjpcIm5cIixcIlxcdTAxQ0NcIjpcIm5qXCIsXCJcXHUyNERFXCI6XCJvXCIsXCJcXHVGRjRGXCI6XCJvXCIsXCJcXHUwMEYyXCI6XCJvXCIsXCJcXHUwMEYzXCI6XCJvXCIsXCJcXHUwMEY0XCI6XCJvXCIsXCJcXHUxRUQzXCI6XCJvXCIsXCJcXHUxRUQxXCI6XCJvXCIsXCJcXHUxRUQ3XCI6XCJvXCIsXCJcXHUxRUQ1XCI6XCJvXCIsXCJcXHUwMEY1XCI6XCJvXCIsXCJcXHUxRTREXCI6XCJvXCIsXCJcXHUwMjJEXCI6XCJvXCIsXCJcXHUxRTRGXCI6XCJvXCIsXCJcXHUwMTREXCI6XCJvXCIsXCJcXHUxRTUxXCI6XCJvXCIsXCJcXHUxRTUzXCI6XCJvXCIsXCJcXHUwMTRGXCI6XCJvXCIsXCJcXHUwMjJGXCI6XCJvXCIsXCJcXHUwMjMxXCI6XCJvXCIsXCJcXHUwMEY2XCI6XCJvXCIsXCJcXHUwMjJCXCI6XCJvXCIsXCJcXHUxRUNGXCI6XCJvXCIsXCJcXHUwMTUxXCI6XCJvXCIsXCJcXHUwMUQyXCI6XCJvXCIsXCJcXHUwMjBEXCI6XCJvXCIsXCJcXHUwMjBGXCI6XCJvXCIsXCJcXHUwMUExXCI6XCJvXCIsXCJcXHUxRUREXCI6XCJvXCIsXCJcXHUxRURCXCI6XCJvXCIsXCJcXHUxRUUxXCI6XCJvXCIsXCJcXHUxRURGXCI6XCJvXCIsXCJcXHUxRUUzXCI6XCJvXCIsXCJcXHUxRUNEXCI6XCJvXCIsXCJcXHUxRUQ5XCI6XCJvXCIsXCJcXHUwMUVCXCI6XCJvXCIsXCJcXHUwMUVEXCI6XCJvXCIsXCJcXHUwMEY4XCI6XCJvXCIsXCJcXHUwMUZGXCI6XCJvXCIsXCJcXHUwMjU0XCI6XCJvXCIsXCJcXHVBNzRCXCI6XCJvXCIsXCJcXHVBNzREXCI6XCJvXCIsXCJcXHUwMjc1XCI6XCJvXCIsXCJcXHUwMUEzXCI6XCJvaVwiLFwiXFx1MDIyM1wiOlwib3VcIixcIlxcdUE3NEZcIjpcIm9vXCIsXCJcXHUyNERGXCI6XCJwXCIsXCJcXHVGRjUwXCI6XCJwXCIsXCJcXHUxRTU1XCI6XCJwXCIsXCJcXHUxRTU3XCI6XCJwXCIsXCJcXHUwMUE1XCI6XCJwXCIsXCJcXHUxRDdEXCI6XCJwXCIsXCJcXHVBNzUxXCI6XCJwXCIsXCJcXHVBNzUzXCI6XCJwXCIsXCJcXHVBNzU1XCI6XCJwXCIsXCJcXHUyNEUwXCI6XCJxXCIsXCJcXHVGRjUxXCI6XCJxXCIsXCJcXHUwMjRCXCI6XCJxXCIsXCJcXHVBNzU3XCI6XCJxXCIsXCJcXHVBNzU5XCI6XCJxXCIsXCJcXHUyNEUxXCI6XCJyXCIsXCJcXHVGRjUyXCI6XCJyXCIsXCJcXHUwMTU1XCI6XCJyXCIsXCJcXHUxRTU5XCI6XCJyXCIsXCJcXHUwMTU5XCI6XCJyXCIsXCJcXHUwMjExXCI6XCJyXCIsXCJcXHUwMjEzXCI6XCJyXCIsXCJcXHUxRTVCXCI6XCJyXCIsXCJcXHUxRTVEXCI6XCJyXCIsXCJcXHUwMTU3XCI6XCJyXCIsXCJcXHUxRTVGXCI6XCJyXCIsXCJcXHUwMjREXCI6XCJyXCIsXCJcXHUwMjdEXCI6XCJyXCIsXCJcXHVBNzVCXCI6XCJyXCIsXCJcXHVBN0E3XCI6XCJyXCIsXCJcXHVBNzgzXCI6XCJyXCIsXCJcXHUyNEUyXCI6XCJzXCIsXCJcXHVGRjUzXCI6XCJzXCIsXCJcXHUwMERGXCI6XCJzXCIsXCJcXHUwMTVCXCI6XCJzXCIsXCJcXHUxRTY1XCI6XCJzXCIsXCJcXHUwMTVEXCI6XCJzXCIsXCJcXHUxRTYxXCI6XCJzXCIsXCJcXHUwMTYxXCI6XCJzXCIsXCJcXHUxRTY3XCI6XCJzXCIsXCJcXHUxRTYzXCI6XCJzXCIsXCJcXHUxRTY5XCI6XCJzXCIsXCJcXHUwMjE5XCI6XCJzXCIsXCJcXHUwMTVGXCI6XCJzXCIsXCJcXHUwMjNGXCI6XCJzXCIsXCJcXHVBN0E5XCI6XCJzXCIsXCJcXHVBNzg1XCI6XCJzXCIsXCJcXHUxRTlCXCI6XCJzXCIsXCJcXHUyNEUzXCI6XCJ0XCIsXCJcXHVGRjU0XCI6XCJ0XCIsXCJcXHUxRTZCXCI6XCJ0XCIsXCJcXHUxRTk3XCI6XCJ0XCIsXCJcXHUwMTY1XCI6XCJ0XCIsXCJcXHUxRTZEXCI6XCJ0XCIsXCJcXHUwMjFCXCI6XCJ0XCIsXCJcXHUwMTYzXCI6XCJ0XCIsXCJcXHUxRTcxXCI6XCJ0XCIsXCJcXHUxRTZGXCI6XCJ0XCIsXCJcXHUwMTY3XCI6XCJ0XCIsXCJcXHUwMUFEXCI6XCJ0XCIsXCJcXHUwMjg4XCI6XCJ0XCIsXCJcXHUyQzY2XCI6XCJ0XCIsXCJcXHVBNzg3XCI6XCJ0XCIsXCJcXHVBNzI5XCI6XCJ0elwiLFwiXFx1MjRFNFwiOlwidVwiLFwiXFx1RkY1NVwiOlwidVwiLFwiXFx1MDBGOVwiOlwidVwiLFwiXFx1MDBGQVwiOlwidVwiLFwiXFx1MDBGQlwiOlwidVwiLFwiXFx1MDE2OVwiOlwidVwiLFwiXFx1MUU3OVwiOlwidVwiLFwiXFx1MDE2QlwiOlwidVwiLFwiXFx1MUU3QlwiOlwidVwiLFwiXFx1MDE2RFwiOlwidVwiLFwiXFx1MDBGQ1wiOlwidVwiLFwiXFx1MDFEQ1wiOlwidVwiLFwiXFx1MDFEOFwiOlwidVwiLFwiXFx1MDFENlwiOlwidVwiLFwiXFx1MDFEQVwiOlwidVwiLFwiXFx1MUVFN1wiOlwidVwiLFwiXFx1MDE2RlwiOlwidVwiLFwiXFx1MDE3MVwiOlwidVwiLFwiXFx1MDFENFwiOlwidVwiLFwiXFx1MDIxNVwiOlwidVwiLFwiXFx1MDIxN1wiOlwidVwiLFwiXFx1MDFCMFwiOlwidVwiLFwiXFx1MUVFQlwiOlwidVwiLFwiXFx1MUVFOVwiOlwidVwiLFwiXFx1MUVFRlwiOlwidVwiLFwiXFx1MUVFRFwiOlwidVwiLFwiXFx1MUVGMVwiOlwidVwiLFwiXFx1MUVFNVwiOlwidVwiLFwiXFx1MUU3M1wiOlwidVwiLFwiXFx1MDE3M1wiOlwidVwiLFwiXFx1MUU3N1wiOlwidVwiLFwiXFx1MUU3NVwiOlwidVwiLFwiXFx1MDI4OVwiOlwidVwiLFwiXFx1MjRFNVwiOlwidlwiLFwiXFx1RkY1NlwiOlwidlwiLFwiXFx1MUU3RFwiOlwidlwiLFwiXFx1MUU3RlwiOlwidlwiLFwiXFx1MDI4QlwiOlwidlwiLFwiXFx1QTc1RlwiOlwidlwiLFwiXFx1MDI4Q1wiOlwidlwiLFwiXFx1QTc2MVwiOlwidnlcIixcIlxcdTI0RTZcIjpcIndcIixcIlxcdUZGNTdcIjpcIndcIixcIlxcdTFFODFcIjpcIndcIixcIlxcdTFFODNcIjpcIndcIixcIlxcdTAxNzVcIjpcIndcIixcIlxcdTFFODdcIjpcIndcIixcIlxcdTFFODVcIjpcIndcIixcIlxcdTFFOThcIjpcIndcIixcIlxcdTFFODlcIjpcIndcIixcIlxcdTJDNzNcIjpcIndcIixcIlxcdTI0RTdcIjpcInhcIixcIlxcdUZGNThcIjpcInhcIixcIlxcdTFFOEJcIjpcInhcIixcIlxcdTFFOERcIjpcInhcIixcIlxcdTI0RThcIjpcInlcIixcIlxcdUZGNTlcIjpcInlcIixcIlxcdTFFRjNcIjpcInlcIixcIlxcdTAwRkRcIjpcInlcIixcIlxcdTAxNzdcIjpcInlcIixcIlxcdTFFRjlcIjpcInlcIixcIlxcdTAyMzNcIjpcInlcIixcIlxcdTFFOEZcIjpcInlcIixcIlxcdTAwRkZcIjpcInlcIixcIlxcdTFFRjdcIjpcInlcIixcIlxcdTFFOTlcIjpcInlcIixcIlxcdTFFRjVcIjpcInlcIixcIlxcdTAxQjRcIjpcInlcIixcIlxcdTAyNEZcIjpcInlcIixcIlxcdTFFRkZcIjpcInlcIixcIlxcdTI0RTlcIjpcInpcIixcIlxcdUZGNUFcIjpcInpcIixcIlxcdTAxN0FcIjpcInpcIixcIlxcdTFFOTFcIjpcInpcIixcIlxcdTAxN0NcIjpcInpcIixcIlxcdTAxN0VcIjpcInpcIixcIlxcdTFFOTNcIjpcInpcIixcIlxcdTFFOTVcIjpcInpcIixcIlxcdTAxQjZcIjpcInpcIixcIlxcdTAyMjVcIjpcInpcIixcIlxcdTAyNDBcIjpcInpcIixcIlxcdTJDNkNcIjpcInpcIixcIlxcdUE3NjNcIjpcInpcIn07XHJcblxyXG4gICAgJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XHJcblxyXG4gICAgbmV4dFVpZD0oZnVuY3Rpb24oKSB7IHZhciBjb3VudGVyPTE7IHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGNvdW50ZXIrKzsgfTsgfSgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gc3RyaXBEaWFjcml0aWNzKHN0cikge1xyXG4gICAgICAgIHZhciByZXQsIGksIGwsIGM7XHJcblxyXG4gICAgICAgIGlmICghc3RyIHx8IHN0ci5sZW5ndGggPCAxKSByZXR1cm4gc3RyO1xyXG5cclxuICAgICAgICByZXQgPSBcIlwiO1xyXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBzdHIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGMgPSBzdHIuY2hhckF0KGkpO1xyXG4gICAgICAgICAgICByZXQgKz0gRElBQ1JJVElDU1tjXSB8fCBjO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluZGV4T2YodmFsdWUsIGFycmF5KSB7XHJcbiAgICAgICAgdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICAgIGlmIChlcXVhbCh2YWx1ZSwgYXJyYXlbaV0pKSByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1lYXN1cmVTY3JvbGxiYXIgKCkge1xyXG4gICAgICAgIHZhciAkdGVtcGxhdGUgPSAkKCBNRUFTVVJFX1NDUk9MTEJBUl9URU1QTEFURSApO1xyXG4gICAgICAgICR0ZW1wbGF0ZS5hcHBlbmRUbygnYm9keScpO1xyXG5cclxuICAgICAgICB2YXIgZGltID0ge1xyXG4gICAgICAgICAgICB3aWR0aDogJHRlbXBsYXRlLndpZHRoKCkgLSAkdGVtcGxhdGVbMF0uY2xpZW50V2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogJHRlbXBsYXRlLmhlaWdodCgpIC0gJHRlbXBsYXRlWzBdLmNsaWVudEhlaWdodFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgJHRlbXBsYXRlLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGltO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGFyZXMgZXF1YWxpdHkgb2YgYSBhbmQgYlxyXG4gICAgICogQHBhcmFtIGFcclxuICAgICAqIEBwYXJhbSBiXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcclxuICAgICAgICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciAnYScgb3IgJ2InIGlzIGEgc3RyaW5nIChwcmltaXRpdmUgb3Igb2JqZWN0KS5cclxuICAgICAgICAvLyBUaGUgY29uY2F0ZW5hdGlvbiBvZiBhbiBlbXB0eSBzdHJpbmcgKCsnJykgY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgc3RyaW5nJ3MgcHJpbWl0aXZlLlxyXG4gICAgICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHJldHVybiBhKycnID09PSBiKycnOyAvLyBhKycnIC0gaW4gY2FzZSAnYScgaXMgYSBTdHJpbmcgb2JqZWN0XHJcbiAgICAgICAgaWYgKGIuY29uc3RydWN0b3IgPT09IFN0cmluZykgcmV0dXJuIGIrJycgPT09IGErJyc7IC8vIGIrJycgLSBpbiBjYXNlICdiJyBpcyBhIFN0cmluZyBvYmplY3RcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGxpdHMgdGhlIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHZhbHVlcywgdHJpbW1pbmcgZWFjaCB2YWx1ZS4gQW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQgZm9yIG51bGxzIG9yIGVtcHR5XHJcbiAgICAgKiBzdHJpbmdzXHJcbiAgICAgKiBAcGFyYW0gc3RyaW5nXHJcbiAgICAgKiBAcGFyYW0gc2VwYXJhdG9yXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIHNwbGl0VmFsKHN0cmluZywgc2VwYXJhdG9yKSB7XHJcbiAgICAgICAgdmFyIHZhbCwgaSwgbDtcclxuICAgICAgICBpZiAoc3RyaW5nID09PSBudWxsIHx8IHN0cmluZy5sZW5ndGggPCAxKSByZXR1cm4gW107XHJcbiAgICAgICAgdmFsID0gc3RyaW5nLnNwbGl0KHNlcGFyYXRvcik7XHJcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpID0gaSArIDEpIHZhbFtpXSA9ICQudHJpbSh2YWxbaV0pO1xyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0U2lkZUJvcmRlclBhZGRpbmcoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50Lm91dGVyV2lkdGgoZmFsc2UpIC0gZWxlbWVudC53aWR0aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluc3RhbGxLZXlVcENoYW5nZUV2ZW50KGVsZW1lbnQpIHtcclxuICAgICAgICB2YXIga2V5PVwia2V5dXAtY2hhbmdlLXZhbHVlXCI7XHJcbiAgICAgICAgZWxlbWVudC5vbihcImtleWRvd25cIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoJC5kYXRhKGVsZW1lbnQsIGtleSkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgJC5kYXRhKGVsZW1lbnQsIGtleSwgZWxlbWVudC52YWwoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBlbGVtZW50Lm9uKFwia2V5dXBcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsPSAkLmRhdGEoZWxlbWVudCwga2V5KTtcclxuICAgICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQudmFsKCkgIT09IHZhbCkge1xyXG4gICAgICAgICAgICAgICAgJC5yZW1vdmVEYXRhKGVsZW1lbnQsIGtleSk7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXIoXCJrZXl1cC1jaGFuZ2VcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAkZG9jdW1lbnQub24oXCJtb3VzZW1vdmVcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBsYXN0TW91c2VQb3NpdGlvbi54ID0gZS5wYWdlWDtcclxuICAgICAgICBsYXN0TW91c2VQb3NpdGlvbi55ID0gZS5wYWdlWTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogZmlsdGVycyBtb3VzZSBldmVudHMgc28gYW4gZXZlbnQgaXMgZmlyZWQgb25seSBpZiB0aGUgbW91c2UgbW92ZWQuXHJcbiAgICAgKlxyXG4gICAgICogZmlsdGVycyBvdXQgbW91c2UgZXZlbnRzIHRoYXQgb2NjdXIgd2hlbiBtb3VzZSBpcyBzdGF0aW9uYXJ5IGJ1dFxyXG4gICAgICogdGhlIGVsZW1lbnRzIHVuZGVyIHRoZSBwb2ludGVyIGFyZSBzY3JvbGxlZC5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gaW5zdGFsbEZpbHRlcmVkTW91c2VNb3ZlKGVsZW1lbnQpIHtcclxuICAgICAgICBlbGVtZW50Lm9uKFwibW91c2Vtb3ZlXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXN0cG9zID0gbGFzdE1vdXNlUG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmIChsYXN0cG9zID09PSB1bmRlZmluZWQgfHwgbGFzdHBvcy54ICE9PSBlLnBhZ2VYIHx8IGxhc3Rwb3MueSAhPT0gZS5wYWdlWSkge1xyXG4gICAgICAgICAgICAgICAgJChlLnRhcmdldCkudHJpZ2dlcihcIm1vdXNlbW92ZS1maWx0ZXJlZFwiLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVib3VuY2VzIGEgZnVuY3Rpb24uIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBvcmlnaW5hbCBmbiBmdW5jdGlvbiBvbmx5IGlmIG5vIGludm9jYXRpb25zIGhhdmUgYmVlbiBtYWRlXHJcbiAgICAgKiB3aXRoaW4gdGhlIGxhc3QgcXVpZXRNaWxsaXMgbWlsbGlzZWNvbmRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBxdWlldE1pbGxpcyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGludm9raW5nIGZuXHJcbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gYmUgZGVib3VuY2VkXHJcbiAgICAgKiBAcGFyYW0gY3R4IG9iamVjdCB0byBiZSB1c2VkIGFzIHRoaXMgcmVmZXJlbmNlIHdpdGhpbiBmblxyXG4gICAgICogQHJldHVybiBkZWJvdW5jZWQgdmVyc2lvbiBvZiBmblxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBkZWJvdW5jZShxdWlldE1pbGxpcywgZm4sIGN0eCkge1xyXG4gICAgICAgIGN0eCA9IGN0eCB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmFyIHRpbWVvdXQ7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGZuLmFwcGx5KGN0eCwgYXJncyk7XHJcbiAgICAgICAgICAgIH0sIHF1aWV0TWlsbGlzKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgYSB0aHVua1xyXG4gICAgICogQHBhcmFtIGZvcm11bGEgZnVuY3Rpb24gdXNlZCB0byBsYXppbHkgaW5pdGlhbGl6ZSB0aGUgdGh1bmtcclxuICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiB0aHVuayhmb3JtdWxhKSB7XHJcbiAgICAgICAgdmFyIGV2YWx1YXRlZCA9IGZhbHNlLFxyXG4gICAgICAgICAgICB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGlmIChldmFsdWF0ZWQgPT09IGZhbHNlKSB7IHZhbHVlID0gZm9ybXVsYSgpOyBldmFsdWF0ZWQgPSB0cnVlOyB9XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBpbnN0YWxsRGVib3VuY2VkU2Nyb2xsKHRocmVzaG9sZCwgZWxlbWVudCkge1xyXG4gICAgICAgIHZhciBub3RpZnkgPSBkZWJvdW5jZSh0aHJlc2hvbGQsIGZ1bmN0aW9uIChlKSB7IGVsZW1lbnQudHJpZ2dlcihcInNjcm9sbC1kZWJvdW5jZWRcIiwgZSk7fSk7XHJcbiAgICAgICAgZWxlbWVudC5vbihcInNjcm9sbFwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXhPZihlLnRhcmdldCwgZWxlbWVudC5nZXQoKSkgPj0gMCkgbm90aWZ5KGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZvY3VzKCRlbCkge1xyXG4gICAgICAgIGlmICgkZWxbMF0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHJldHVybjtcclxuXHJcbiAgICAgICAgLyogc2V0IHRoZSBmb2N1cyBpbiBhIDAgdGltZW91dCAtIHRoYXQgd2F5IHRoZSBmb2N1cyBpcyBzZXQgYWZ0ZXIgdGhlIHByb2Nlc3NpbmdcclxuICAgICAgICAgICAgb2YgdGhlIGN1cnJlbnQgZXZlbnQgaGFzIGZpbmlzaGVkIC0gd2hpY2ggc2VlbXMgbGlrZSB0aGUgb25seSByZWxpYWJsZSB3YXlcclxuICAgICAgICAgICAgdG8gc2V0IGZvY3VzICovXHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBlbD0kZWxbMF0sIHBvcz0kZWwudmFsKCkubGVuZ3RoLCByYW5nZTtcclxuXHJcbiAgICAgICAgICAgICRlbC5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgLyogbWFrZSBzdXJlIGVsIHJlY2VpdmVkIGZvY3VzIHNvIHdlIGRvIG5vdCBlcnJvciBvdXQgd2hlbiB0cnlpbmcgdG8gbWFuaXB1bGF0ZSB0aGUgY2FyZXQuXHJcbiAgICAgICAgICAgICAgICBzb21ldGltZXMgbW9kYWxzIG9yIG90aGVycyBsaXN0ZW5lcnMgbWF5IHN0ZWFsIGl0IGFmdGVyIGl0cyBzZXQgKi9cclxuICAgICAgICAgICAgaWYgKCRlbC5pcyhcIjp2aXNpYmxlXCIpICYmIGVsID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLyogYWZ0ZXIgdGhlIGZvY3VzIGlzIHNldCBtb3ZlIHRoZSBjYXJldCB0byB0aGUgZW5kLCBuZWNlc3Nhcnkgd2hlbiB3ZSB2YWwoKVxyXG4gICAgICAgICAgICAgICAgICAgIGp1c3QgYmVmb3JlIHNldHRpbmcgZm9jdXMgKi9cclxuICAgICAgICAgICAgICAgIGlmKGVsLnNldFNlbGVjdGlvblJhbmdlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKHBvcywgcG9zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVsLmNyZWF0ZVRleHRSYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gZWwuY3JlYXRlVGV4dFJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q3Vyc29ySW5mbyhlbCkge1xyXG4gICAgICAgIGVsID0gJChlbClbMF07XHJcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XHJcbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XHJcbiAgICAgICAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gZWwpIHtcclxuICAgICAgICAgICAgb2Zmc2V0ID0gZWwuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IGVsLnNlbGVjdGlvbkVuZCAtIG9mZnNldDtcclxuICAgICAgICB9IGVsc2UgaWYgKCdzZWxlY3Rpb24nIGluIGRvY3VtZW50KSB7XHJcbiAgICAgICAgICAgIGVsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHZhciBzZWwgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgbGVuZ3RoID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgIHNlbC5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIC1lbC52YWx1ZS5sZW5ndGgpO1xyXG4gICAgICAgICAgICBvZmZzZXQgPSBzZWwudGV4dC5sZW5ndGggLSBsZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IG9mZnNldDogb2Zmc2V0LCBsZW5ndGg6IGxlbmd0aCB9O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGtpbGxFdmVudChldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBraWxsRXZlbnRJbW1lZGlhdGVseShldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWVhc3VyZVRleHRXaWR0aChlKSB7XHJcbiAgICAgICAgaWYgKCFzaXplcil7XHJcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IGVbMF0uY3VycmVudFN0eWxlIHx8IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVbMF0sIG51bGwpO1xyXG4gICAgICAgICAgICBzaXplciA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuY3NzKHtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBcIi0xMDAwMHB4XCIsXHJcbiAgICAgICAgICAgICAgICB0b3A6IFwiLTEwMDAwcHhcIixcclxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwibm9uZVwiLFxyXG4gICAgICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlLmZvbnRTaXplLFxyXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogc3R5bGUuZm9udEZhbWlseSxcclxuICAgICAgICAgICAgICAgIGZvbnRTdHlsZTogc3R5bGUuZm9udFN0eWxlLFxyXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogc3R5bGUuZm9udFdlaWdodCxcclxuICAgICAgICAgICAgICAgIGxldHRlclNwYWNpbmc6IHN0eWxlLmxldHRlclNwYWNpbmcsXHJcbiAgICAgICAgICAgICAgICB0ZXh0VHJhbnNmb3JtOiBzdHlsZS50ZXh0VHJhbnNmb3JtLFxyXG4gICAgICAgICAgICAgICAgd2hpdGVTcGFjZTogXCJub3dyYXBcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2l6ZXIuYXR0cihcImNsYXNzXCIsXCJzZWxlY3QyLXNpemVyXCIpO1xyXG4gICAgICAgICAgICAkKFwiYm9keVwiKS5hcHBlbmQoc2l6ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzaXplci50ZXh0KGUudmFsKCkpO1xyXG4gICAgICAgIHJldHVybiBzaXplci53aWR0aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHN5bmNDc3NDbGFzc2VzKGRlc3QsIHNyYywgYWRhcHRlcikge1xyXG4gICAgICAgIHZhciBjbGFzc2VzLCByZXBsYWNlbWVudHMgPSBbXSwgYWRhcHRlZDtcclxuXHJcbiAgICAgICAgY2xhc3NlcyA9IGRlc3QuYXR0cihcImNsYXNzXCIpO1xyXG4gICAgICAgIGlmIChjbGFzc2VzKSB7XHJcbiAgICAgICAgICAgIGNsYXNzZXMgPSAnJyArIGNsYXNzZXM7IC8vIGZvciBJRSB3aGljaCByZXR1cm5zIG9iamVjdFxyXG4gICAgICAgICAgICAkKGNsYXNzZXMuc3BsaXQoXCIgXCIpKS5lYWNoMihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZGV4T2YoXCJzZWxlY3QyLVwiKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2xhc3NlcyA9IHNyYy5hdHRyKFwiY2xhc3NcIik7XHJcbiAgICAgICAgaWYgKGNsYXNzZXMpIHtcclxuICAgICAgICAgICAgY2xhc3NlcyA9ICcnICsgY2xhc3NlczsgLy8gZm9yIElFIHdoaWNoIHJldHVybnMgb2JqZWN0XHJcbiAgICAgICAgICAgICQoY2xhc3Nlcy5zcGxpdChcIiBcIikpLmVhY2gyKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXhPZihcInNlbGVjdDItXCIpICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWRhcHRlZCA9IGFkYXB0ZXIodGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzLnB1c2godGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVzdC5hdHRyKFwiY2xhc3NcIiwgcmVwbGFjZW1lbnRzLmpvaW4oXCIgXCIpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gbWFya01hdGNoKHRleHQsIHRlcm0sIG1hcmt1cCwgZXNjYXBlTWFya3VwKSB7XHJcbiAgICAgICAgdmFyIG1hdGNoPXN0cmlwRGlhY3JpdGljcyh0ZXh0LnRvVXBwZXJDYXNlKCkpLmluZGV4T2Yoc3RyaXBEaWFjcml0aWNzKHRlcm0udG9VcHBlckNhc2UoKSkpLFxyXG4gICAgICAgICAgICB0bD10ZXJtLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKG1hdGNoPDApIHtcclxuICAgICAgICAgICAgbWFya3VwLnB1c2goZXNjYXBlTWFya3VwKHRleHQpKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWFya3VwLnB1c2goZXNjYXBlTWFya3VwKHRleHQuc3Vic3RyaW5nKDAsIG1hdGNoKSkpO1xyXG4gICAgICAgIG1hcmt1cC5wdXNoKFwiPHNwYW4gY2xhc3M9J3NlbGVjdDItbWF0Y2gnPlwiKTtcclxuICAgICAgICBtYXJrdXAucHVzaChlc2NhcGVNYXJrdXAodGV4dC5zdWJzdHJpbmcobWF0Y2gsIG1hdGNoICsgdGwpKSk7XHJcbiAgICAgICAgbWFya3VwLnB1c2goXCI8L3NwYW4+XCIpO1xyXG4gICAgICAgIG1hcmt1cC5wdXNoKGVzY2FwZU1hcmt1cCh0ZXh0LnN1YnN0cmluZyhtYXRjaCArIHRsLCB0ZXh0Lmxlbmd0aCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkZWZhdWx0RXNjYXBlTWFya3VwKG1hcmt1cCkge1xyXG4gICAgICAgIHZhciByZXBsYWNlX21hcCA9IHtcclxuICAgICAgICAgICAgJ1xcXFwnOiAnJiM5MjsnLFxyXG4gICAgICAgICAgICAnJic6ICcmYW1wOycsXHJcbiAgICAgICAgICAgICc8JzogJyZsdDsnLFxyXG4gICAgICAgICAgICAnPic6ICcmZ3Q7JyxcclxuICAgICAgICAgICAgJ1wiJzogJyZxdW90OycsXHJcbiAgICAgICAgICAgIFwiJ1wiOiAnJiMzOTsnLFxyXG4gICAgICAgICAgICBcIi9cIjogJyYjNDc7J1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBTdHJpbmcobWFya3VwKS5yZXBsYWNlKC9bJjw+XCInXFwvXFxcXF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXBsYWNlX21hcFttYXRjaF07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9kdWNlcyBhbiBhamF4LWJhc2VkIHF1ZXJ5IGZ1bmN0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBwYXJhbXRlcnNcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLnBhcmFtcyBwYXJhbWV0ZXIgbWFwIGZvciB0aGUgdHJhbnNwb3J0IGFqYXggY2FsbCwgY2FuIGNvbnRhaW4gc3VjaCBvcHRpb25zIGFzIGNhY2hlLCBqc29ucENhbGxiYWNrLCBldGMuIHNlZSAkLmFqYXhcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLnRyYW5zcG9ydCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBleGVjdXRlIHRoZSBhamF4IHJlcXVlc3QuIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHBhcmFtZXRlcnMgc3VwcG9ydGVkIGJ5ICQuYWpheFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMudXJsIHVybCBmb3IgdGhlIGRhdGFcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLmRhdGEgYSBmdW5jdGlvbihzZWFyY2hUZXJtLCBwYWdlTnVtYmVyLCBjb250ZXh0KSB0aGF0IHNob3VsZCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgZm9yIHRoZSBhYm92ZSB1cmwuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5kYXRhVHlwZSByZXF1ZXN0IGRhdGEgdHlwZTogYWpheCwganNvbnAsIG90aGVyIGRhdGF0YXR5cGVzIHN1cHBvcnRlZCBieSBqUXVlcnkncyAkLmFqYXggZnVuY3Rpb24gb3IgdGhlIHRyYW5zcG9ydCBmdW5jdGlvbiBpZiBzcGVjaWZpZWRcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLnF1aWV0TWlsbGlzIChvcHRpb25hbCkgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIG1ha2luZyB0aGUgYWpheFJlcXVlc3QsIGhlbHBzIGRlYm91bmNlIHRoZSBhamF4IGZ1bmN0aW9uIGlmIGludm9rZWQgdG9vIG9mdGVuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yZXN1bHRzIGEgZnVuY3Rpb24ocmVtb3RlRGF0YSwgcGFnZU51bWJlcikgdGhhdCBjb252ZXJ0cyBkYXRhIHJldHVybmVkIGZvcm0gdGhlIHJlbW90ZSByZXF1ZXN0IHRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgU2VsZWN0Mi5cclxuICAgICAqICAgICAgVGhlIGV4cGVjdGVkIGZvcm1hdCBpcyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGtleXM6XHJcbiAgICAgKiAgICAgIHJlc3VsdHMgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBjaG9pY2VzXHJcbiAgICAgKiAgICAgIG1vcmUgKG9wdGlvbmFsKSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGVyZSBhcmUgbW9yZSByZXN1bHRzIGF2YWlsYWJsZVxyXG4gICAgICogICAgICBFeGFtcGxlOiB7cmVzdWx0czpbe2lkOjEsIHRleHQ6J1JlZCd9LHtpZDoyLCB0ZXh0OidCbHVlJ31dLCBtb3JlOnRydWV9XHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGFqYXgob3B0aW9ucykge1xyXG4gICAgICAgIHZhciB0aW1lb3V0LCAvLyBjdXJyZW50IHNjaGVkdWxlZCBidXQgbm90IHlldCBleGVjdXRlZCByZXF1ZXN0XHJcbiAgICAgICAgICAgIGhhbmRsZXIgPSBudWxsLFxyXG4gICAgICAgICAgICBxdWlldE1pbGxpcyA9IG9wdGlvbnMucXVpZXRNaWxsaXMgfHwgMTAwLFxyXG4gICAgICAgICAgICBhamF4VXJsID0gb3B0aW9ucy51cmwsXHJcbiAgICAgICAgICAgIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSwgLy8gYWpheCBkYXRhIGZ1bmN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gYWpheFVybCwgLy8gYWpheCB1cmwgc3RyaW5nIG9yIGZ1bmN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gb3B0aW9ucy50cmFuc3BvcnQgfHwgJC5mbi5zZWxlY3QyLmFqYXhEZWZhdWx0cy50cmFuc3BvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCAtIHRvIGJlIHJlbW92ZWQgaW4gNC4wICAtIHVzZSBwYXJhbXMgaW5zdGVhZFxyXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZSB8fCAnR0VUJywgLy8gc2V0IHR5cGUgb2YgcmVxdWVzdCAoR0VUIG9yIFBPU1QpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlOiBvcHRpb25zLmNhY2hlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqc29ucENhbGxiYWNrOiBvcHRpb25zLmpzb25wQ2FsbGJhY2t8fHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IG9wdGlvbnMuZGF0YVR5cGV8fFwianNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSAkLmV4dGVuZCh7fSwgJC5mbi5zZWxlY3QyLmFqYXhEZWZhdWx0cy5wYXJhbXMsIGRlcHJlY2F0ZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhID8gZGF0YS5jYWxsKHNlbGYsIHF1ZXJ5LnRlcm0sIHF1ZXJ5LnBhZ2UsIHF1ZXJ5LmNvbnRleHQpIDogbnVsbDtcclxuICAgICAgICAgICAgICAgIHVybCA9ICh0eXBlb2YgdXJsID09PSAnZnVuY3Rpb24nKSA/IHVybC5jYWxsKHNlbGYsIHF1ZXJ5LnRlcm0sIHF1ZXJ5LnBhZ2UsIHF1ZXJ5LmNvbnRleHQpIDogdXJsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7IGhhbmRsZXIuYWJvcnQoKTsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcmFtcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0aW9ucy5wYXJhbXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHBhcmFtcywgb3B0aW9ucy5wYXJhbXMuY2FsbChzZWxmKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQocGFyYW1zLCBvcHRpb25zLnBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICQuZXh0ZW5kKHBhcmFtcywge1xyXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBvcHRpb25zLmRhdGFUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHJlcGxhY2UgcXVlcnkucGFnZSB3aXRoIHF1ZXJ5IHNvIHVzZXJzIGhhdmUgYWNjZXNzIHRvIHRlcm0sIHBhZ2UsIGV0Yy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBvcHRpb25zLnJlc3VsdHMoZGF0YSwgcXVlcnkucGFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmNhbGxiYWNrKHJlc3VsdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaGFuZGxlciA9IHRyYW5zcG9ydC5jYWxsKHNlbGYsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgIH0sIHF1aWV0TWlsbGlzKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZHVjZXMgYSBxdWVyeSBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggYSBsb2NhbCBhcnJheVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gVGhlIG9wdGlvbnMgcGFyYW1ldGVyIGNhbiBlaXRoZXIgYmUgYW4gYXJyYXkgb3IgYW5cclxuICAgICAqIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgYXJyYXkgZm9ybSBpcyB1c2VkIGl0IGlzIGFzc3VtZWQgdGhhdCBpdCBjb250YWlucyBvYmplY3RzIHdpdGggJ2lkJyBhbmQgJ3RleHQnIGtleXMuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIG9iamVjdCBmb3JtIGlzIHVzZWQgdGkgaXMgYXNzdW1lZCB0aGF0IGl0IGNvbnRhaW5zICdkYXRhJyBhbmQgJ3RleHQnIGtleXMuIFRoZSAnZGF0YScga2V5IHNob3VsZCBjb250YWluXHJcbiAgICAgKiBhbiBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGNob2ljZXMuIFRoZXNlIG9iamVjdHMgbXVzdCBjb250YWluIGF0IGxlYXN0IGFuICdpZCcga2V5LiBUaGUgJ3RleHQnXHJcbiAgICAgKiBrZXkgY2FuIGVpdGhlciBiZSBhIFN0cmluZyBpbiB3aGljaCBjYXNlIGl0IGlzIGV4cGVjdGVkIHRoYXQgZWFjaCBlbGVtZW50IGluIHRoZSAnZGF0YScgYXJyYXkgaGFzIGEga2V5IHdpdGggdGhlXHJcbiAgICAgKiB2YWx1ZSBvZiAndGV4dCcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIG1hdGNoIGNob2ljZXMuIEFsdGVybmF0aXZlbHksIHRleHQgY2FuIGJlIGEgZnVuY3Rpb24oaXRlbSkgdGhhdCBjYW4gZXh0cmFjdFxyXG4gICAgICogdGhlIHRleHQuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGxvY2FsKG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IG9wdGlvbnMsIC8vIGRhdGEgZWxlbWVudHNcclxuICAgICAgICAgICAgZGF0YVRleHQsXHJcbiAgICAgICAgICAgIHRtcCxcclxuICAgICAgICAgICAgdGV4dCA9IGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBcIlwiK2l0ZW0udGV4dDsgfTsgLy8gZnVuY3Rpb24gdXNlZCB0byByZXRyaWV2ZSB0aGUgdGV4dCBwb3J0aW9uIG9mIGEgZGF0YSBpdGVtIHRoYXQgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzZWFyY2hcclxuXHJcbiAgICAgICAgIGlmICgkLmlzQXJyYXkoZGF0YSkpIHtcclxuICAgICAgICAgICAgdG1wID0gZGF0YTtcclxuICAgICAgICAgICAgZGF0YSA9IHsgcmVzdWx0czogdG1wIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihkYXRhKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdG1wID0gZGF0YTtcclxuICAgICAgICAgICAgZGF0YSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdG1wOyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRhdGFJdGVtID0gZGF0YSgpO1xyXG4gICAgICAgIGlmIChkYXRhSXRlbS50ZXh0KSB7XHJcbiAgICAgICAgICAgIHRleHQgPSBkYXRhSXRlbS50ZXh0O1xyXG4gICAgICAgICAgICAvLyBpZiB0ZXh0IGlzIG5vdCBhIGZ1bmN0aW9uIHdlIGFzc3VtZSBpdCB0byBiZSBhIGtleSBuYW1lXHJcbiAgICAgICAgICAgIGlmICghJC5pc0Z1bmN0aW9uKHRleHQpKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhVGV4dCA9IGRhdGFJdGVtLnRleHQ7IC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhpcyBpbiBhIHNlcGFyYXRlIHZhcmlhYmxlIGJlY2F1c2UgaW4gdGhlIG5leHQgc3RlcCBkYXRhIGdldHMgcmVzZXQgYW5kIGRhdGEudGV4dCBpcyBubyBsb25nZXIgYXZhaWxhYmxlXHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW1bZGF0YVRleHRdOyB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIHZhciB0ID0gcXVlcnkudGVybSwgZmlsdGVyZWQgPSB7IHJlc3VsdHM6IFtdIH0sIHByb2Nlc3M7XHJcbiAgICAgICAgICAgIGlmICh0ID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBxdWVyeS5jYWxsYmFjayhkYXRhKCkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNzID0gZnVuY3Rpb24oZGF0dW0sIGNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHZhciBncm91cCwgYXR0cjtcclxuICAgICAgICAgICAgICAgIGRhdHVtID0gZGF0dW1bMF07XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0dW0uY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBncm91cCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoYXR0ciBpbiBkYXR1bSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0dW0uaGFzT3duUHJvcGVydHkoYXR0cikpIGdyb3VwW2F0dHJdPWRhdHVtW2F0dHJdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBncm91cC5jaGlsZHJlbj1bXTtcclxuICAgICAgICAgICAgICAgICAgICAkKGRhdHVtLmNoaWxkcmVuKS5lYWNoMihmdW5jdGlvbihpLCBjaGlsZERhdHVtKSB7IHByb2Nlc3MoY2hpbGREYXR1bSwgZ3JvdXAuY2hpbGRyZW4pOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuY2hpbGRyZW4ubGVuZ3RoIHx8IHF1ZXJ5Lm1hdGNoZXIodCwgdGV4dChncm91cCksIGRhdHVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5Lm1hdGNoZXIodCwgdGV4dChkYXR1bSksIGRhdHVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goZGF0dW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICQoZGF0YSgpLnJlc3VsdHMpLmVhY2gyKGZ1bmN0aW9uKGksIGRhdHVtKSB7IHByb2Nlc3MoZGF0dW0sIGZpbHRlcmVkLnJlc3VsdHMpOyB9KTtcclxuICAgICAgICAgICAgcXVlcnkuY2FsbGJhY2soZmlsdGVyZWQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETyBqYXZhZG9jXHJcbiAgICBmdW5jdGlvbiB0YWdzKGRhdGEpIHtcclxuICAgICAgICB2YXIgaXNGdW5jID0gJC5pc0Z1bmN0aW9uKGRhdGEpO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocXVlcnkpIHtcclxuICAgICAgICAgICAgdmFyIHQgPSBxdWVyeS50ZXJtLCBmaWx0ZXJlZCA9IHtyZXN1bHRzOiBbXX07XHJcbiAgICAgICAgICAgICQoaXNGdW5jID8gZGF0YSgpIDogZGF0YSkuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXNPYmplY3QgPSB0aGlzLnRleHQgIT09IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gaXNPYmplY3QgPyB0aGlzLnRleHQgOiB0aGlzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHQgPT09IFwiXCIgfHwgcXVlcnkubWF0Y2hlcih0LCB0ZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLnJlc3VsdHMucHVzaChpc09iamVjdCA/IHRoaXMgOiB7aWQ6IHRoaXMsIHRleHQ6IHRoaXN9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHF1ZXJ5LmNhbGxiYWNrKGZpbHRlcmVkKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBmb3JtYXR0ZXIgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogVGhyb3dzIGFuIGVycm9yIGlmIGl0IGlzIG5vdCBhIGZ1bmN0aW9uLiBSZXR1cm5zIHRydWUgaWYgaXQgc2hvdWxkIGJlIHVzZWQsXHJcbiAgICAgKiBmYWxzZSBpZiBubyBmb3JtYXR0aW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGZvcm1hdHRlclxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBjaGVja0Zvcm1hdHRlcihmb3JtYXR0ZXIsIGZvcm1hdHRlck5hbWUpIHtcclxuICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKGZvcm1hdHRlcikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICghZm9ybWF0dGVyKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdHRlck5hbWUgK1wiIG11c3QgYmUgYSBmdW5jdGlvbiBvciBhIGZhbHN5IHZhbHVlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGV2YWx1YXRlKHZhbCkge1xyXG4gICAgICAgIHJldHVybiAkLmlzRnVuY3Rpb24odmFsKSA/IHZhbCgpIDogdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvdW50UmVzdWx0cyhyZXN1bHRzKSB7XHJcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcclxuICAgICAgICAkLmVhY2gocmVzdWx0cywgZnVuY3Rpb24oaSwgaXRlbSkge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRSZXN1bHRzKGl0ZW0uY2hpbGRyZW4pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmF1bHQgdG9rZW5pemVyLiBUaGlzIGZ1bmN0aW9uIHVzZXMgYnJlYWtzIHRoZSBpbnB1dCBvbiBzdWJzdHJpbmcgbWF0Y2ggb2YgYW55IHN0cmluZyBmcm9tIHRoZVxyXG4gICAgICogb3B0cy50b2tlblNlcGFyYXRvcnMgYXJyYXkgYW5kIHVzZXMgb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgdG8gY3JlYXRlIHRoZSBjaG9pY2Ugb2JqZWN0LiBCb3RoIG9mIHRob3NlXHJcbiAgICAgKiB0d28gb3B0aW9ucyBoYXZlIHRvIGJlIGRlZmluZWQgaW4gb3JkZXIgZm9yIHRoZSB0b2tlbml6ZXIgdG8gd29yay5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgdGV4dCB1c2VyIGhhcyB0eXBlZCBzbyBmYXIgb3IgcGFzdGVkIGludG8gdGhlIHNlYXJjaCBmaWVsZFxyXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbiBjdXJyZW50bHkgc2VsZWN0ZWQgY2hvaWNlc1xyXG4gICAgICogQHBhcmFtIHNlbGVjdENhbGxiYWNrIGZ1bmN0aW9uKGNob2ljZSkgY2FsbGJhY2sgdGhvIGFkZCB0aGUgY2hvaWNlIHRvIHNlbGVjdGlvblxyXG4gICAgICogQHBhcmFtIG9wdHMgc2VsZWN0MidzIG9wdHNcclxuICAgICAqIEByZXR1cm4gdW5kZWZpbmVkL251bGwgdG8gbGVhdmUgdGhlIGN1cnJlbnQgaW5wdXQgdW5jaGFuZ2VkLCBvciBhIHN0cmluZyB0byBjaGFuZ2UgdGhlIGlucHV0IHRvIHRoZSByZXR1cm5lZCB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBkZWZhdWx0VG9rZW5pemVyKGlucHV0LCBzZWxlY3Rpb24sIHNlbGVjdENhbGxiYWNrLCBvcHRzKSB7XHJcbiAgICAgICAgdmFyIG9yaWdpbmFsID0gaW5wdXQsIC8vIHN0b3JlIHRoZSBvcmlnaW5hbCBzbyB3ZSBjYW4gY29tcGFyZSBhbmQga25vdyBpZiB3ZSBuZWVkIHRvIHRlbGwgdGhlIHNlYXJjaCB0byB1cGRhdGUgaXRzIHRleHRcclxuICAgICAgICAgICAgZHVwZSA9IGZhbHNlLCAvLyBjaGVjayBmb3Igd2hldGhlciBhIHRva2VuIHdlIGV4dHJhY3RlZCByZXByZXNlbnRzIGEgZHVwbGljYXRlIHNlbGVjdGVkIGNob2ljZVxyXG4gICAgICAgICAgICB0b2tlbiwgLy8gdG9rZW5cclxuICAgICAgICAgICAgaW5kZXgsIC8vIHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBzZXBhcmF0b3Igd2FzIGZvdW5kXHJcbiAgICAgICAgICAgIGksIGwsIC8vIGxvb3BpbmcgdmFyaWFibGVzXHJcbiAgICAgICAgICAgIHNlcGFyYXRvcjsgLy8gdGhlIG1hdGNoZWQgc2VwYXJhdG9yXHJcblxyXG4gICAgICAgIGlmICghb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgfHwgIW9wdHMudG9rZW5TZXBhcmF0b3JzIHx8IG9wdHMudG9rZW5TZXBhcmF0b3JzLmxlbmd0aCA8IDEpIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gb3B0cy50b2tlblNlcGFyYXRvcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBvcHRzLnRva2VuU2VwYXJhdG9yc1tpXTtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaW5wdXQuaW5kZXhPZihzZXBhcmF0b3IpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSBicmVhazsgLy8gZGlkIG5vdCBmaW5kIGFueSB0b2tlbiBzZXBhcmF0b3IgaW4gdGhlIGlucHV0IHN0cmluZywgYmFpbFxyXG5cclxuICAgICAgICAgICAgdG9rZW4gPSBpbnB1dC5zdWJzdHJpbmcoMCwgaW5kZXgpO1xyXG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cmluZyhpbmRleCArIHNlcGFyYXRvci5sZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRva2VuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRva2VuID0gb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UuY2FsbCh0aGlzLCB0b2tlbiwgc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsICYmIG9wdHMuaWQodG9rZW4pICE9PSB1bmRlZmluZWQgJiYgb3B0cy5pZCh0b2tlbikgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBkdXBlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVxdWFsKG9wdHMuaWQodG9rZW4pLCBvcHRzLmlkKHNlbGVjdGlvbltpXSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBlID0gdHJ1ZTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZHVwZSkgc2VsZWN0Q2FsbGJhY2sodG9rZW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3JpZ2luYWwhPT1pbnB1dCkgcmV0dXJuIGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjbGFzc1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzdXBlckNsYXNzXHJcbiAgICAgKiBAcGFyYW0gbWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBjbGF6eihTdXBlckNsYXNzLCBtZXRob2RzKSB7XHJcbiAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkge307XHJcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IFN1cGVyQ2xhc3M7XHJcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XHJcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLnBhcmVudCA9IFN1cGVyQ2xhc3MucHJvdG90eXBlO1xyXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQuZXh0ZW5kKGNvbnN0cnVjdG9yLnByb3RvdHlwZSwgbWV0aG9kcyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIEFic3RyYWN0U2VsZWN0MiA9IGNsYXp6KE9iamVjdCwge1xyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGJpbmQ6IGZ1bmN0aW9uIChmdW5jKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uIChvcHRzKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRzLCBzZWFyY2gsIHJlc3VsdHNTZWxlY3RvciA9IFwiLnNlbGVjdDItcmVzdWx0c1wiLCBkaXNhYmxlZCwgcmVhZG9ubHk7XHJcblxyXG4gICAgICAgICAgICAvLyBwcmVwYXJlIG9wdGlvbnNcclxuICAgICAgICAgICAgdGhpcy5vcHRzID0gb3B0cyA9IHRoaXMucHJlcGFyZU9wdHMob3B0cyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlkPW9wdHMuaWQ7XHJcblxyXG4gICAgICAgICAgICAvLyBkZXN0cm95IGlmIGNhbGxlZCBvbiBhbiBleGlzdGluZyBjb21wb25lbnRcclxuICAgICAgICAgICAgaWYgKG9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0MlwiKSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgICAgICBvcHRzLmVsZW1lbnQuZGF0YShcInNlbGVjdDJcIikgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIG9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0MlwiKS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5jcmVhdGVDb250YWluZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVySWQ9XCJzMmlkX1wiKyhvcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpIHx8IFwiYXV0b2dlblwiK25leHRVaWQoKSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyU2VsZWN0b3I9XCIjXCIrdGhpcy5jb250YWluZXJJZC5yZXBsYWNlKC8oWzsmLFxcLlxcK1xcKlxcfic6XCJcXCFcXF4jJCVAXFxbXFxdXFwoXFwpPT5cXHxdKS9nLCAnXFxcXCQxJyk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmF0dHIoXCJpZFwiLCB0aGlzLmNvbnRhaW5lcklkKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGNhY2hlIHRoZSBib2R5IHNvIGZ1dHVyZSBsb29rdXBzIGFyZSBjaGVhcFxyXG4gICAgICAgICAgICB0aGlzLmJvZHkgPSB0aHVuayhmdW5jdGlvbigpIHsgcmV0dXJuIG9wdHMuZWxlbWVudC5jbG9zZXN0KFwiYm9keVwiKTsgfSk7XHJcblxyXG4gICAgICAgICAgICBzeW5jQ3NzQ2xhc3Nlcyh0aGlzLmNvbnRhaW5lciwgdGhpcy5vcHRzLmVsZW1lbnQsIHRoaXMub3B0cy5hZGFwdENvbnRhaW5lckNzc0NsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmF0dHIoXCJzdHlsZVwiLCBvcHRzLmVsZW1lbnQuYXR0cihcInN0eWxlXCIpKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY3NzKGV2YWx1YXRlKG9wdHMuY29udGFpbmVyQ3NzKSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKGV2YWx1YXRlKG9wdHMuY29udGFpbmVyQ3NzQ2xhc3MpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFRhYkluZGV4ID0gdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcInRhYmluZGV4XCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gc3dhcCBjb250YWluZXIgZm9yIHRoZSBlbGVtZW50XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50XHJcbiAgICAgICAgICAgICAgICAuZGF0YShcInNlbGVjdDJcIiwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5hdHRyKFwidGFiaW5kZXhcIiwgXCItMVwiKVxyXG4gICAgICAgICAgICAgICAgLmJlZm9yZSh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmRhdGEoXCJzZWxlY3QyXCIsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93biA9IHRoaXMuY29udGFpbmVyLmZpbmQoXCIuc2VsZWN0Mi1kcm9wXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmFkZENsYXNzKGV2YWx1YXRlKG9wdHMuZHJvcGRvd25Dc3NDbGFzcykpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmRhdGEoXCJzZWxlY3QyXCIsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgc3luY0Nzc0NsYXNzZXModGhpcy5kcm9wZG93biwgdGhpcy5vcHRzLmVsZW1lbnQsIHRoaXMub3B0cy5hZGFwdERyb3Bkb3duQ3NzQ2xhc3MpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0cyA9IHRoaXMuY29udGFpbmVyLmZpbmQocmVzdWx0c1NlbGVjdG9yKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2ggPSBzZWFyY2ggPSB0aGlzLmNvbnRhaW5lci5maW5kKFwiaW5wdXQuc2VsZWN0Mi1pbnB1dFwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucXVlcnlDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c1BhZ2UgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY29udGFpbmVyXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRhaW5lcigpO1xyXG5cclxuICAgICAgICAgICAgaW5zdGFsbEZpbHRlcmVkTW91c2VNb3ZlKHRoaXMucmVzdWx0cyk7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24ub24oXCJtb3VzZW1vdmUtZmlsdGVyZWQgdG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmRcIiwgcmVzdWx0c1NlbGVjdG9yLCB0aGlzLmJpbmQodGhpcy5oaWdobGlnaHRVbmRlckV2ZW50KSk7XHJcblxyXG4gICAgICAgICAgICBpbnN0YWxsRGVib3VuY2VkU2Nyb2xsKDgwLCB0aGlzLnJlc3VsdHMpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLm9uKFwic2Nyb2xsLWRlYm91bmNlZFwiLCByZXN1bHRzU2VsZWN0b3IsIHRoaXMuYmluZCh0aGlzLmxvYWRNb3JlSWZOZWVkZWQpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGRvIG5vdCBwcm9wYWdhdGUgY2hhbmdlIGV2ZW50IGZyb20gdGhlIHNlYXJjaCBmaWVsZCBvdXQgb2YgdGhlIGNvbXBvbmVudFxyXG4gICAgICAgICAgICAkKHRoaXMuY29udGFpbmVyKS5vbihcImNoYW5nZVwiLCBcIi5zZWxlY3QyLWlucHV0XCIsIGZ1bmN0aW9uKGUpIHtlLnN0b3BQcm9wYWdhdGlvbigpO30pO1xyXG4gICAgICAgICAgICAkKHRoaXMuZHJvcGRvd24pLm9uKFwiY2hhbmdlXCIsIFwiLnNlbGVjdDItaW5wdXRcIiwgZnVuY3Rpb24oZSkge2Uuc3RvcFByb3BhZ2F0aW9uKCk7fSk7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiBqcXVlcnkubW91c2V3aGVlbCBwbHVnaW4gaXMgaW5zdGFsbGVkIHdlIGNhbiBwcmV2ZW50IG91dC1vZi1ib3VuZHMgc2Nyb2xsaW5nIG9mIHJlc3VsdHMgdmlhIG1vdXNld2hlZWxcclxuICAgICAgICAgICAgaWYgKCQuZm4ubW91c2V3aGVlbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5tb3VzZXdoZWVsKGZ1bmN0aW9uIChlLCBkZWx0YSwgZGVsdGFYLCBkZWx0YVkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdG9wID0gcmVzdWx0cy5zY3JvbGxUb3AoKSwgaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgPiAwICYmIHRvcCAtIGRlbHRhWSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuc2Nyb2xsVG9wKDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWx0YVkgPCAwICYmIHJlc3VsdHMuZ2V0KDApLnNjcm9sbEhlaWdodCAtIHJlc3VsdHMuc2Nyb2xsVG9wKCkgKyBkZWx0YVkgPD0gcmVzdWx0cy5oZWlnaHQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNjcm9sbFRvcChyZXN1bHRzLmdldCgwKS5zY3JvbGxIZWlnaHQgLSByZXN1bHRzLmhlaWdodCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpbnN0YWxsS2V5VXBDaGFuZ2VFdmVudChzZWFyY2gpO1xyXG4gICAgICAgICAgICBzZWFyY2gub24oXCJrZXl1cC1jaGFuZ2UgaW5wdXQgcGFzdGVcIiwgdGhpcy5iaW5kKHRoaXMudXBkYXRlUmVzdWx0cykpO1xyXG4gICAgICAgICAgICBzZWFyY2gub24oXCJmb2N1c1wiLCBmdW5jdGlvbiAoKSB7IHNlYXJjaC5hZGRDbGFzcyhcInNlbGVjdDItZm9jdXNlZFwiKTsgfSk7XHJcbiAgICAgICAgICAgIHNlYXJjaC5vbihcImJsdXJcIiwgZnVuY3Rpb24gKCkgeyBzZWFyY2gucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWZvY3VzZWRcIik7fSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLm9uKFwibW91c2V1cFwiLCByZXN1bHRzU2VsZWN0b3IsIHRoaXMuYmluZChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoZS50YXJnZXQpLmNsb3Nlc3QoXCIuc2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZVwiKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRVbmRlckV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SGlnaGxpZ2h0ZWQoZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRyYXAgYWxsIG1vdXNlIGV2ZW50cyBmcm9tIGxlYXZpbmcgdGhlIGRyb3Bkb3duLiBzb21ldGltZXMgdGhlcmUgbWF5IGJlIGEgbW9kYWwgdGhhdCBpcyBsaXN0ZW5pbmdcclxuICAgICAgICAgICAgLy8gZm9yIG1vdXNlIGV2ZW50cyBvdXRzaWRlIG9mIGl0c2VsZiBzbyBpdCBjYW4gY2xvc2UgaXRzZWxmLiBzaW5jZSB0aGUgZHJvcGRvd24gaXMgbm93IG91dHNpZGUgdGhlIHNlbGVjdDInc1xyXG4gICAgICAgICAgICAvLyBkb20gaXQgd2lsbCB0cmlnZ2VyIHRoZSBwb3B1cCBjbG9zZSwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLm9uKFwiY2xpY2sgbW91c2V1cCBtb3VzZWRvd25cIiwgZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKHRoaXMub3B0cy5pbml0U2VsZWN0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNvdXJjZSBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBoYXMgcHJvdmlkZWQgYSBmdW5jdGlvbiB0aGF0IGNhbiBzZXQgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgc291cmNlIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgIC8vIHdlIG1vbml0b3IgdGhlIGNoYW5nZSBldmVudCBvbiB0aGUgZWxlbWVudCBhbmQgdHJpZ2dlciBpdCwgYWxsb3dpbmcgZm9yIHR3byB3YXkgc3luY2hyb25pemF0aW9uXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vbml0b3JTb3VyY2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdHMubWF4aW11bUlucHV0TGVuZ3RoICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5hdHRyKFwibWF4bGVuZ3RoXCIsIG9wdHMubWF4aW11bUlucHV0TGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGRpc2FibGVkID0gb3B0cy5lbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGRpc2FibGVkID09PSB1bmRlZmluZWQpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlKCFkaXNhYmxlZCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVhZG9ubHkgPSBvcHRzLmVsZW1lbnQucHJvcChcInJlYWRvbmx5XCIpO1xyXG4gICAgICAgICAgICBpZiAocmVhZG9ubHkgPT09IHVuZGVmaW5lZCkgcmVhZG9ubHkgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yZWFkb25seShyZWFkb25seSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgc2l6ZSBvZiBzY3JvbGxiYXJcclxuICAgICAgICAgICAgc2Nyb2xsQmFyRGltZW5zaW9ucyA9IHNjcm9sbEJhckRpbWVuc2lvbnMgfHwgbWVhc3VyZVNjcm9sbGJhcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hdXRvZm9jdXMgPSBvcHRzLmVsZW1lbnQucHJvcChcImF1dG9mb2N1c1wiKTtcclxuICAgICAgICAgICAgb3B0cy5lbGVtZW50LnByb3AoXCJhdXRvZm9jdXNcIiwgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvZm9jdXMpIHRoaXMuZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubmV4dFNlYXJjaFRlcm0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50PXRoaXMub3B0cy5lbGVtZW50LCBzZWxlY3QyID0gZWxlbWVudC5kYXRhKFwic2VsZWN0MlwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BlcnR5T2JzZXJ2ZXIpIHsgZGVsZXRlIHRoaXMucHJvcGVydHlPYnNlcnZlcjsgdGhpcy5wcm9wZXJ0eU9ic2VydmVyID0gbnVsbDsgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdDIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0Mi5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3QyLmRyb3Bkb3duLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhcInNlbGVjdDItb2Zmc2NyZWVuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZURhdGEoXCJzZWxlY3QyXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZihcIi5zZWxlY3QyXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnByb3AoXCJhdXRvZm9jdXNcIiwgdGhpcy5hdXRvZm9jdXMgfHwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudFRhYkluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hdHRyKHt0YWJpbmRleDogdGhpcy5lbGVtZW50VGFiSW5kZXh9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyKFwidGFiaW5kZXhcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgb3B0aW9uVG9EYXRhOiBmdW5jdGlvbihlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmlzKFwib3B0aW9uXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkOmVsZW1lbnQucHJvcChcInZhbHVlXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ZWxlbWVudC50ZXh0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudC5nZXQoKSxcclxuICAgICAgICAgICAgICAgICAgICBjc3M6IGVsZW1lbnQuYXR0cihcImNsYXNzXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiKSxcclxuICAgICAgICAgICAgICAgICAgICBsb2NrZWQ6IGVxdWFsKGVsZW1lbnQuYXR0cihcImxvY2tlZFwiKSwgXCJsb2NrZWRcIikgfHwgZXF1YWwoZWxlbWVudC5kYXRhKFwibG9ja2VkXCIpLCB0cnVlKVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmlzKFwib3B0Z3JvdXBcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDplbGVtZW50LmF0dHIoXCJsYWJlbFwiKSxcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjpbXSxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LmdldCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNzczogZWxlbWVudC5hdHRyKFwiY2xhc3NcIilcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHByZXBhcmVPcHRzOiBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudCwgc2VsZWN0LCBpZEtleSwgYWpheFVybCwgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50ID0gb3B0cy5lbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0KDApLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzZWxlY3RcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QgPSBzZWxlY3QgPSBvcHRzLmVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoZXNlIG9wdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHdoZW4gYXR0YWNoZWQgdG8gYSBzZWxlY3QgYmVjYXVzZSB0aGV5IGFyZSBwaWNrZWQgdXAgb2ZmIHRoZSBlbGVtZW50IGl0c2VsZlxyXG4gICAgICAgICAgICAgICAgJC5lYWNoKFtcImlkXCIsIFwibXVsdGlwbGVcIiwgXCJhamF4XCIsIFwicXVlcnlcIiwgXCJjcmVhdGVTZWFyY2hDaG9pY2VcIiwgXCJpbml0U2VsZWN0aW9uXCIsIFwiZGF0YVwiLCBcInRhZ3NcIl0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9wdGlvbiAnXCIgKyB0aGlzICsgXCInIGlzIG5vdCBhbGxvd2VkIGZvciBTZWxlY3QyIHdoZW4gYXR0YWNoZWQgdG8gYSA8c2VsZWN0PiBlbGVtZW50LlwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb3B0cyA9ICQuZXh0ZW5kKHt9LCB7XHJcbiAgICAgICAgICAgICAgICBwb3B1bGF0ZVJlc3VsdHM6IGZ1bmN0aW9uKGNvbnRhaW5lciwgcmVzdWx0cywgcXVlcnkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9wdWxhdGUsICBkYXRhLCByZXN1bHQsIGNoaWxkcmVuLCBpZD10aGlzLm9wdHMuaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlPWZ1bmN0aW9uKHJlc3VsdHMsIGNvbnRhaW5lciwgZGVwdGgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBsLCByZXN1bHQsIHNlbGVjdGFibGUsIGRpc2FibGVkLCBjb21wb3VuZCwgbm9kZSwgbGFiZWwsIGlubmVyQ29udGFpbmVyLCBmb3JtYXR0ZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gb3B0cy5zb3J0UmVzdWx0cyhyZXN1bHRzLCBjb250YWluZXIsIHF1ZXJ5KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSByZXN1bHRzLmxlbmd0aDsgaSA8IGw7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1yZXN1bHRzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkID0gKHJlc3VsdC5kaXNhYmxlZCA9PT0gdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlID0gKCFkaXNhYmxlZCkgJiYgKGlkKHJlc3VsdCkgIT09IHVuZGVmaW5lZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG91bmQ9cmVzdWx0LmNoaWxkcmVuICYmIHJlc3VsdC5jaGlsZHJlbi5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU9JChcIjxsaT48L2xpPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkQ2xhc3MoXCJzZWxlY3QyLXJlc3VsdHMtZGVwdC1cIitkZXB0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFkZENsYXNzKFwic2VsZWN0Mi1yZXN1bHRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFkZENsYXNzKHNlbGVjdGFibGUgPyBcInNlbGVjdDItcmVzdWx0LXNlbGVjdGFibGVcIiA6IFwic2VsZWN0Mi1yZXN1bHQtdW5zZWxlY3RhYmxlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkKSB7IG5vZGUuYWRkQ2xhc3MoXCJzZWxlY3QyLWRpc2FibGVkXCIpOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG91bmQpIHsgbm9kZS5hZGRDbGFzcyhcInNlbGVjdDItcmVzdWx0LXdpdGgtY2hpbGRyZW5cIik7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkQ2xhc3Moc2VsZi5vcHRzLmZvcm1hdFJlc3VsdENzc0NsYXNzKHJlc3VsdCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC5hZGRDbGFzcyhcInNlbGVjdDItcmVzdWx0LWxhYmVsXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZD1vcHRzLmZvcm1hdFJlc3VsdChyZXN1bHQsIGxhYmVsLCBxdWVyeSwgc2VsZi5vcHRzLmVzY2FwZU1hcmt1cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0dGVkIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuaHRtbChmb3JtYXR0ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kKGxhYmVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG91bmQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb250YWluZXI9JChcIjx1bD48L3VsPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbnRhaW5lci5hZGRDbGFzcyhcInNlbGVjdDItcmVzdWx0LXN1YlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZShyZXN1bHQuY2hpbGRyZW4sIGlubmVyQ29udGFpbmVyLCBkZXB0aCsxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZChpbm5lckNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhKFwic2VsZWN0Mi1kYXRhXCIsIHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGUocmVzdWx0cywgY29udGFpbmVyLCAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgJC5mbi5zZWxlY3QyLmRlZmF1bHRzLCBvcHRzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0cy5pZCkgIT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgaWRLZXkgPSBvcHRzLmlkO1xyXG4gICAgICAgICAgICAgICAgb3B0cy5pZCA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlW2lkS2V5XTsgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCQuaXNBcnJheShvcHRzLmVsZW1lbnQuZGF0YShcInNlbGVjdDJUYWdzXCIpKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFwidGFnc1wiIGluIG9wdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBcInRhZ3Mgc3BlY2lmaWVkIGFzIGJvdGggYW4gYXR0cmlidXRlICdkYXRhLXNlbGVjdDItdGFncycgYW5kIGluIG9wdGlvbnMgb2YgU2VsZWN0MiBcIiArIG9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvcHRzLnRhZ3M9b3B0cy5lbGVtZW50LmRhdGEoXCJzZWxlY3QyVGFnc1wiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgb3B0cy5xdWVyeSA9IHRoaXMuYmluZChmdW5jdGlvbiAocXVlcnkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHsgcmVzdWx0czogW10sIG1vcmU6IGZhbHNlIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm0gPSBxdWVyeS50ZXJtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwgcGxhY2Vob2xkZXJPcHRpb24sIHByb2Nlc3M7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3M9ZnVuY3Rpb24oZWxlbWVudCwgY29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ3JvdXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmlzKFwib3B0aW9uXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnkubWF0Y2hlcih0ZXJtLCBlbGVtZW50LnRleHQoKSwgZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goc2VsZi5vcHRpb25Ub0RhdGEoZWxlbWVudCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXMoXCJvcHRncm91cFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA9c2VsZi5vcHRpb25Ub0RhdGEoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNoaWxkcmVuKCkuZWFjaDIoZnVuY3Rpb24oaSwgZWxtKSB7IHByb2Nlc3MoZWxtLCBncm91cC5jaGlsZHJlbik7IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLmNoaWxkcmVuLmxlbmd0aD4wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5wdXNoKGdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuPWVsZW1lbnQuY2hpbGRyZW4oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBwbGFjZWhvbGRlciBvcHRpb24gaWYgdGhlcmUgaXMgb25lXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UGxhY2Vob2xkZXIoKSAhPT0gdW5kZWZpbmVkICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJPcHRpb24gPSB0aGlzLmdldFBsYWNlaG9sZGVyT3B0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlck9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW49Y2hpbGRyZW4ubm90KHBsYWNlaG9sZGVyT3B0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uZWFjaDIoZnVuY3Rpb24oaSwgZWxtKSB7IHByb2Nlc3MoZWxtLCBkYXRhLnJlc3VsdHMpOyB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlcnkuY2FsbGJhY2soZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW5zaWRlIHZhbCgpIHdlIGNvbnN0cnVjdCBjaG9pY2VzIGZyb20gb3B0aW9ucyBhbmQgdGhlcmUgaWQgaXMgaGFyZGNvZGVkXHJcbiAgICAgICAgICAgICAgICBvcHRzLmlkPWZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUuaWQ7IH07XHJcbiAgICAgICAgICAgICAgICBvcHRzLmZvcm1hdFJlc3VsdENzc0NsYXNzID0gZnVuY3Rpb24oZGF0YSkgeyByZXR1cm4gZGF0YS5jc3M7IH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShcInF1ZXJ5XCIgaW4gb3B0cykpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwiYWpheFwiIGluIG9wdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWpheFVybCA9IG9wdHMuZWxlbWVudC5kYXRhKFwiYWpheC11cmxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhamF4VXJsICYmIGFqYXhVcmwubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5hamF4LnVybCA9IGFqYXhVcmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5xdWVyeSA9IGFqYXguY2FsbChvcHRzLmVsZW1lbnQsIG9wdHMuYWpheCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcImRhdGFcIiBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMucXVlcnkgPSBsb2NhbChvcHRzLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJ0YWdzXCIgaW4gb3B0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnF1ZXJ5ID0gdGFncyhvcHRzLnRhZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgPSBmdW5jdGlvbiAodGVybSkgeyByZXR1cm4ge2lkOiAkLnRyaW0odGVybSksIHRleHQ6ICQudHJpbSh0ZXJtKX07IH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuaW5pdFNlbGVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmluaXRTZWxlY3Rpb24gPSBmdW5jdGlvbiAoZWxlbWVudCwgY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3BsaXRWYWwoZWxlbWVudC52YWwoKSwgb3B0cy5zZXBhcmF0b3IpKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcywgdGV4dCA9IHRoaXMsIHRhZ3M9b3B0cy50YWdzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKHRhZ3MpKSB0YWdzPXRhZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0YWdzKS5lYWNoKGZ1bmN0aW9uKCkgeyBpZiAoZXF1YWwodGhpcy5pZCwgaWQpKSB7IHRleHQgPSB0aGlzLnRleHQ7IHJldHVybiBmYWxzZTsgfSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKHtpZDogaWQsIHRleHQ6IHRleHR9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0cy5xdWVyeSkgIT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJxdWVyeSBmdW5jdGlvbiBub3QgZGVmaW5lZCBmb3IgU2VsZWN0MiBcIiArIG9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvcHRzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1vbml0b3IgdGhlIG9yaWdpbmFsIGVsZW1lbnQgZm9yIGNoYW5nZXMgYW5kIHVwZGF0ZSBzZWxlY3QyIGFjY29yZGluZ2x5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBtb25pdG9yU291cmNlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMub3B0cy5lbGVtZW50LCBzeW5jO1xyXG5cclxuICAgICAgICAgICAgZWwub24oXCJjaGFuZ2Uuc2VsZWN0MlwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0Mi1jaGFuZ2UtdHJpZ2dlcmVkXCIpICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHN5bmMgPSB0aGlzLmJpbmQoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBlbmFibGVkLCByZWFkb25seSwgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gc3luYyBlbmFibGVkIHN0YXRlXHJcbiAgICAgICAgICAgICAgICB2YXIgZGlzYWJsZWQgPSBlbC5wcm9wKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWQgPT09IHVuZGVmaW5lZCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlKCFkaXNhYmxlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHJlYWRvbmx5ID0gZWwucHJvcChcInJlYWRvbmx5XCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlYWRvbmx5ID09PSB1bmRlZmluZWQpIHJlYWRvbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRvbmx5KHJlYWRvbmx5KTtcclxuXHJcbiAgICAgICAgICAgICAgICBzeW5jQ3NzQ2xhc3Nlcyh0aGlzLmNvbnRhaW5lciwgdGhpcy5vcHRzLmVsZW1lbnQsIHRoaXMub3B0cy5hZGFwdENvbnRhaW5lckNzc0NsYXNzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKGV2YWx1YXRlKHRoaXMub3B0cy5jb250YWluZXJDc3NDbGFzcykpO1xyXG5cclxuICAgICAgICAgICAgICAgIHN5bmNDc3NDbGFzc2VzKHRoaXMuZHJvcGRvd24sIHRoaXMub3B0cy5lbGVtZW50LCB0aGlzLm9wdHMuYWRhcHREcm9wZG93bkNzc0NsYXNzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYWRkQ2xhc3MoZXZhbHVhdGUodGhpcy5vcHRzLmRyb3Bkb3duQ3NzQ2xhc3MpKTtcclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gbW96aWxsYSBhbmQgSUVcclxuICAgICAgICAgICAgZWwub24oXCJwcm9wZXJ0eWNoYW5nZS5zZWxlY3QyIERPTUF0dHJNb2RpZmllZC5zZWxlY3QyXCIsIHN5bmMpO1xyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGhvbGQgb250byBhIHJlZmVyZW5jZSBvZiB0aGUgY2FsbGJhY2sgdG8gd29yayBhcm91bmQgYSBjaHJvbWl1bSBidWdcclxuICAgICAgICAgICAgaWYgKHRoaXMubXV0YXRpb25DYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiAobXV0YXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goc3luYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNhZmFyaSBhbmQgY2hyb21lXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgV2ViS2l0TXV0YXRpb25PYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcGVydHlPYnNlcnZlcikgeyBkZWxldGUgdGhpcy5wcm9wZXJ0eU9ic2VydmVyOyB0aGlzLnByb3BlcnR5T2JzZXJ2ZXIgPSBudWxsOyB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5T2JzZXJ2ZXIgPSBuZXcgV2ViS2l0TXV0YXRpb25PYnNlcnZlcih0aGlzLm11dGF0aW9uQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eU9ic2VydmVyLm9ic2VydmUoZWwuZ2V0KDApLCB7IGF0dHJpYnV0ZXM6dHJ1ZSwgc3VidHJlZTpmYWxzZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgdHJpZ2dlclNlbGVjdDogZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgZXZ0ID0gJC5FdmVudChcInNlbGVjdDItc2VsZWN0aW5nXCIsIHsgdmFsOiB0aGlzLmlkKGRhdGEpLCBvYmplY3Q6IGRhdGEgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoZXZ0KTtcclxuICAgICAgICAgICAgcmV0dXJuICFldnQuaXNEZWZhdWx0UHJldmVudGVkKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVHJpZ2dlcnMgdGhlIGNoYW5nZSBldmVudCBvbiB0aGUgc291cmNlIGVsZW1lbnRcclxuICAgICAgICAgKi9cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHRyaWdnZXJDaGFuZ2U6IGZ1bmN0aW9uIChkZXRhaWxzKSB7XHJcblxyXG4gICAgICAgICAgICBkZXRhaWxzID0gZGV0YWlscyB8fCB7fTtcclxuICAgICAgICAgICAgZGV0YWlscz0gJC5leHRlbmQoe30sIGRldGFpbHMsIHsgdHlwZTogXCJjaGFuZ2VcIiwgdmFsOiB0aGlzLnZhbCgpIH0pO1xyXG4gICAgICAgICAgICAvLyBwcmV2ZW50cyByZWN1cnNpdmUgdHJpZ2dlcmluZ1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0Mi1jaGFuZ2UtdHJpZ2dlcmVkXCIsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKGRldGFpbHMpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0Mi1jaGFuZ2UtdHJpZ2dlcmVkXCIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNvbWUgdmFsaWRhdGlvbiBmcmFtZXdvcmtzIGlnbm9yZSB0aGUgY2hhbmdlIGV2ZW50IGFuZCBsaXN0ZW4gaW5zdGVhZCB0byBrZXl1cCwgY2xpY2sgZm9yIHNlbGVjdHNcclxuICAgICAgICAgICAgLy8gc28gaGVyZSB3ZSB0cmlnZ2VyIHRoZSBjbGljayBldmVudCBtYW51YWxseVxyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5jbGljaygpO1xyXG5cclxuICAgICAgICAgICAgLy8gVmFsaWRhdGlvbkVuZ2luZSBpZ25vcmVhIHRoZSBjaGFuZ2UgZXZlbnQgYW5kIGxpc3RlbnMgaW5zdGVhZCB0byBibHVyXHJcbiAgICAgICAgICAgIC8vIHNvIGhlcmUgd2UgdHJpZ2dlciB0aGUgYmx1ciBldmVudCBtYW51YWxseSBpZiBzbyBkZXNpcmVkXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYmx1ck9uQ2hhbmdlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQuYmx1cigpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vYWJzdHJhY3RcclxuICAgICAgICBpc0ludGVyZmFjZUVuYWJsZWQ6IGZ1bmN0aW9uKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWRJbnRlcmZhY2UgPT09IHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBlbmFibGVJbnRlcmZhY2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgZW5hYmxlZCA9IHRoaXMuX2VuYWJsZWQgJiYgIXRoaXMuX3JlYWRvbmx5LFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgPSAhZW5hYmxlZDtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkID09PSB0aGlzLmVuYWJsZWRJbnRlcmZhY2UpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnRvZ2dsZUNsYXNzKFwic2VsZWN0Mi1jb250YWluZXItZGlzYWJsZWRcIiwgZGlzYWJsZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZEludGVyZmFjZSA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGVuYWJsZTogZnVuY3Rpb24oZW5hYmxlZCkge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCA9PT0gdW5kZWZpbmVkKSBlbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2VuYWJsZWQgPT09IGVuYWJsZWQpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiwgIWVuYWJsZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZUludGVyZmFjZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlKGZhbHNlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHJlYWRvbmx5OiBmdW5jdGlvbihlbmFibGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkID09PSB1bmRlZmluZWQpIGVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlYWRvbmx5ID09PSBlbmFibGVkKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gZW5hYmxlZDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnByb3AoXCJyZWFkb25seVwiLCBlbmFibGVkKTtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVJbnRlcmZhY2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBvcGVuZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1kcm9wZG93bi1vcGVuXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgcG9zaXRpb25Ecm9wZG93bjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciAkZHJvcGRvd24gPSB0aGlzLmRyb3Bkb3duLFxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5jb250YWluZXIub2Zmc2V0KCksXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmNvbnRhaW5lci5vdXRlckhlaWdodChmYWxzZSksXHJcbiAgICAgICAgICAgICAgICB3aWR0aCA9IHRoaXMuY29udGFpbmVyLm91dGVyV2lkdGgoZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgZHJvcEhlaWdodCA9ICRkcm9wZG93bi5vdXRlckhlaWdodChmYWxzZSksXHJcbiAgICAgICAgICAgICAgICB2aWV3UG9ydFJpZ2h0ID0gJCh3aW5kb3cpLnNjcm9sbExlZnQoKSArICQod2luZG93KS53aWR0aCgpLFxyXG4gICAgICAgICAgICAgICAgdmlld3BvcnRCb3R0b20gPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgKyAkKHdpbmRvdykuaGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICBkcm9wVG9wID0gb2Zmc2V0LnRvcCArIGhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRyb3BMZWZ0ID0gb2Zmc2V0LmxlZnQsXHJcbiAgICAgICAgICAgICAgICBlbm91Z2hSb29tQmVsb3cgPSBkcm9wVG9wICsgZHJvcEhlaWdodCA8PSB2aWV3cG9ydEJvdHRvbSxcclxuICAgICAgICAgICAgICAgIGVub3VnaFJvb21BYm92ZSA9IChvZmZzZXQudG9wIC0gZHJvcEhlaWdodCkgPj0gdGhpcy5ib2R5KCkuc2Nyb2xsVG9wKCksXHJcbiAgICAgICAgICAgICAgICBkcm9wV2lkdGggPSAkZHJvcGRvd24ub3V0ZXJXaWR0aChmYWxzZSksXHJcbiAgICAgICAgICAgICAgICBlbm91Z2hSb29tT25SaWdodCA9IGRyb3BMZWZ0ICsgZHJvcFdpZHRoIDw9IHZpZXdQb3J0UmlnaHQsXHJcbiAgICAgICAgICAgICAgICBhYm92ZU5vdyA9ICRkcm9wZG93bi5oYXNDbGFzcyhcInNlbGVjdDItZHJvcC1hYm92ZVwiKSxcclxuICAgICAgICAgICAgICAgIGJvZHlPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICBhYm92ZSxcclxuICAgICAgICAgICAgICAgIGNzcyxcclxuICAgICAgICAgICAgICAgIHJlc3VsdHNMaXN0Tm9kZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZHJvcGRvd25BdXRvV2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHNMaXN0Tm9kZSA9ICQoJy5zZWxlY3QyLXJlc3VsdHMnLCAkZHJvcGRvd24pWzBdO1xyXG4gICAgICAgICAgICAgICAgJGRyb3Bkb3duLmFkZENsYXNzKCdzZWxlY3QyLWRyb3AtYXV0by13aWR0aCcpO1xyXG4gICAgICAgICAgICAgICAgJGRyb3Bkb3duLmNzcygnd2lkdGgnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgc2Nyb2xsYmFyIHdpZHRoIHRvIGRyb3Bkb3duIGlmIHZlcnRpY2FsIHNjcm9sbGJhciBpcyBwcmVzZW50XHJcbiAgICAgICAgICAgICAgICBkcm9wV2lkdGggPSAkZHJvcGRvd24ub3V0ZXJXaWR0aChmYWxzZSkgKyAocmVzdWx0c0xpc3ROb2RlLnNjcm9sbEhlaWdodCA9PT0gcmVzdWx0c0xpc3ROb2RlLmNsaWVudEhlaWdodCA/IDAgOiBzY3JvbGxCYXJEaW1lbnNpb25zLndpZHRoKTtcclxuICAgICAgICAgICAgICAgIGRyb3BXaWR0aCA+IHdpZHRoID8gd2lkdGggPSBkcm9wV2lkdGggOiBkcm9wV2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgICAgIGVub3VnaFJvb21PblJpZ2h0ID0gZHJvcExlZnQgKyBkcm9wV2lkdGggPD0gdmlld1BvcnRSaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKCdzZWxlY3QyLWRyb3AtYXV0by13aWR0aCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVsb3cvIGRyb3B0b3A6XCIsIGRyb3BUb3AsIFwiZHJvcEhlaWdodFwiLCBkcm9wSGVpZ2h0LCBcInN1bVwiLCAoZHJvcFRvcCtkcm9wSGVpZ2h0KStcIiB2aWV3cG9ydCBib3R0b21cIiwgdmlld3BvcnRCb3R0b20sIFwiZW5vdWdoP1wiLCBlbm91Z2hSb29tQmVsb3cpO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiYWJvdmUvIG9mZnNldC50b3BcIiwgb2Zmc2V0LnRvcCwgXCJkcm9wSGVpZ2h0XCIsIGRyb3BIZWlnaHQsIFwidG9wXCIsIChvZmZzZXQudG9wLWRyb3BIZWlnaHQpLCBcInNjcm9sbFRvcFwiLCB0aGlzLmJvZHkoKS5zY3JvbGxUb3AoKSwgXCJlbm91Z2g/XCIsIGVub3VnaFJvb21BYm92ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBmaXggcG9zaXRpb25pbmcgd2hlbiBib2R5IGhhcyBhbiBvZmZzZXQgYW5kIGlzIG5vdCBwb3NpdGlvbjogc3RhdGljXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJvZHkoKS5jc3MoJ3Bvc2l0aW9uJykgIT09ICdzdGF0aWMnKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5T2Zmc2V0ID0gdGhpcy5ib2R5KCkub2Zmc2V0KCk7XHJcbiAgICAgICAgICAgICAgICBkcm9wVG9wIC09IGJvZHlPZmZzZXQudG9wO1xyXG4gICAgICAgICAgICAgICAgZHJvcExlZnQgLT0gYm9keU9mZnNldC5sZWZ0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhbHdheXMgcHJlZmVyIHRoZSBjdXJyZW50IGFib3ZlL2JlbG93IGFsaWdubWVudCwgdW5sZXNzIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbVxyXG4gICAgICAgICAgICBpZiAoYWJvdmVOb3cpIHtcclxuICAgICAgICAgICAgICAgIGFib3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghZW5vdWdoUm9vbUFib3ZlICYmIGVub3VnaFJvb21CZWxvdykgYWJvdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFib3ZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWVub3VnaFJvb21CZWxvdyAmJiBlbm91Z2hSb29tQWJvdmUpIGFib3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFlbm91Z2hSb29tT25SaWdodCkge1xyXG4gICAgICAgICAgICAgICBkcm9wTGVmdCA9IG9mZnNldC5sZWZ0ICsgd2lkdGggLSBkcm9wV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChhYm92ZSkge1xyXG4gICAgICAgICAgICAgICAgZHJvcFRvcCA9IG9mZnNldC50b3AgLSBkcm9wSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWJvdmVcIik7XHJcbiAgICAgICAgICAgICAgICAkZHJvcGRvd24uYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWJvdmVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhcInNlbGVjdDItZHJvcC1hYm92ZVwiKTtcclxuICAgICAgICAgICAgICAgICRkcm9wZG93bi5yZW1vdmVDbGFzcyhcInNlbGVjdDItZHJvcC1hYm92ZVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3NzID0gJC5leHRlbmQoe1xyXG4gICAgICAgICAgICAgICAgdG9wOiBkcm9wVG9wLFxyXG4gICAgICAgICAgICAgICAgbGVmdDogZHJvcExlZnQsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGhcclxuICAgICAgICAgICAgfSwgZXZhbHVhdGUodGhpcy5vcHRzLmRyb3Bkb3duQ3NzKSk7XHJcblxyXG4gICAgICAgICAgICAkZHJvcGRvd24uY3NzKGNzcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBzaG91bGRPcGVuOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdmFyIGV2ZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKCkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbmFibGVkID09PSBmYWxzZSB8fCB0aGlzLl9yZWFkb25seSA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQgPSAkLkV2ZW50KFwic2VsZWN0Mi1vcGVuaW5nXCIpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKGV2ZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGNsZWFyRHJvcGRvd25BbGlnbm1lbnRQcmVmZXJlbmNlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGNsYXNzZXMgdXNlZCB0byBmaWd1cmUgb3V0IHRoZSBwcmVmZXJlbmNlIG9mIHdoZXJlIHRoZSBkcm9wZG93biBzaG91bGQgYmUgb3BlbmVkXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1kcm9wLWFib3ZlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1kcm9wLWFib3ZlXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE9wZW5zIHRoZSBkcm9wZG93blxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciBvciBub3QgZHJvcGRvd24gd2FzIG9wZW5lZC4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UgaWYsIGZvciBleGFtcGxlLFxyXG4gICAgICAgICAqIHRoZSBkcm9wZG93biBpcyBhbHJlYWR5IG9wZW4sIG9yIGlmIHRoZSAnb3BlbicgZXZlbnQgbGlzdGVuZXIgb24gdGhlIGVsZW1lbnQgY2FsbGVkIHByZXZlbnREZWZhdWx0KCkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBvcGVuOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkT3BlbigpKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wZW5pbmcoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFBlcmZvcm1zIHRoZSBvcGVuaW5nIG9mIHRoZSBkcm9wZG93blxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgb3BlbmluZzogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBjaWQgPSB0aGlzLmNvbnRhaW5lcklkLFxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsID0gXCJzY3JvbGwuXCIgKyBjaWQsXHJcbiAgICAgICAgICAgICAgICByZXNpemUgPSBcInJlc2l6ZS5cIitjaWQsXHJcbiAgICAgICAgICAgICAgICBvcmllbnQgPSBcIm9yaWVudGF0aW9uY2hhbmdlLlwiK2NpZCxcclxuICAgICAgICAgICAgICAgIG1hc2ssIG1hc2tDc3M7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyhcInNlbGVjdDItZHJvcGRvd24tb3BlblwiKS5hZGRDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJEcm9wZG93bkFsaWdubWVudFByZWZlcmVuY2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmKHRoaXMuZHJvcGRvd25bMF0gIT09IHRoaXMuYm9keSgpLmNoaWxkcmVuKCkubGFzdCgpWzBdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmRldGFjaCgpLmFwcGVuZFRvKHRoaXMuYm9keSgpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBkcm9wZG93biBtYXNrIGlmIGRvZXNudCBhbHJlYWR5IGV4aXN0XHJcbiAgICAgICAgICAgIG1hc2sgPSAkKFwiI3NlbGVjdDItZHJvcC1tYXNrXCIpO1xyXG4gICAgICAgICAgICBpZiAobWFzay5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbWFzayA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XHJcbiAgICAgICAgICAgICAgICBtYXNrLmF0dHIoXCJpZFwiLFwic2VsZWN0Mi1kcm9wLW1hc2tcIikuYXR0cihcImNsYXNzXCIsXCJzZWxlY3QyLWRyb3AtbWFza1wiKTtcclxuICAgICAgICAgICAgICAgIG1hc2suaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgbWFzay5hcHBlbmRUbyh0aGlzLmJvZHkoKSk7XHJcbiAgICAgICAgICAgICAgICBtYXNrLm9uKFwibW91c2Vkb3duIHRvdWNoc3RhcnQgY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZHJvcGRvd24gPSAkKFwiI3NlbGVjdDItZHJvcFwiKSwgc2VsZjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcGRvd24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmPWRyb3Bkb3duLmRhdGEoXCJzZWxlY3QyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRzLnNlbGVjdE9uQmx1cikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RIaWdobGlnaHRlZCh7bm9Gb2N1czogdHJ1ZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2Uoe2ZvY3VzOmZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSBtYXNrIGlzIGFsd2F5cyByaWdodCBiZWZvcmUgdGhlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duLnByZXYoKVswXSAhPT0gbWFza1swXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5iZWZvcmUobWFzayk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIG1vdmUgdGhlIGdsb2JhbCBpZCB0byB0aGUgY29ycmVjdCBkcm9wZG93blxyXG4gICAgICAgICAgICAkKFwiI3NlbGVjdDItZHJvcFwiKS5yZW1vdmVBdHRyKFwiaWRcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYXR0cihcImlkXCIsIFwic2VsZWN0Mi1kcm9wXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gc2hvdyB0aGUgZWxlbWVudHNcclxuICAgICAgICAgICAgbWFzay5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRHJvcGRvd24oKTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5zaG93KCk7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25Ecm9wZG93bigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5hZGRDbGFzcyhcInNlbGVjdDItZHJvcC1hY3RpdmVcIik7XHJcblxyXG4gICAgICAgICAgICAvLyBhdHRhY2ggbGlzdGVuZXJzIHRvIGV2ZW50cyB0aGF0IGNhbiBjaGFuZ2UgdGhlIHBvc2l0aW9uIG9mIHRoZSBjb250YWluZXIgYW5kIHRodXMgcmVxdWlyZVxyXG4gICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gb2YgdGhlIGRyb3Bkb3duIHRvIGJlIHVwZGF0ZWQgYXMgd2VsbCBzbyBpdCBkb2VzIG5vdCBjb21lIHVuZ2x1ZWQgZnJvbSB0aGUgY29udGFpbmVyXHJcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucGFyZW50cygpLmFkZCh3aW5kb3cpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5vbihyZXNpemUrXCIgXCIrc2Nyb2xsK1wiIFwiK29yaWVudCwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LnBvc2l0aW9uRHJvcGRvd24oKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB2YXIgY2lkID0gdGhpcy5jb250YWluZXJJZCxcclxuICAgICAgICAgICAgICAgIHNjcm9sbCA9IFwic2Nyb2xsLlwiICsgY2lkLFxyXG4gICAgICAgICAgICAgICAgcmVzaXplID0gXCJyZXNpemUuXCIrY2lkLFxyXG4gICAgICAgICAgICAgICAgb3JpZW50ID0gXCJvcmllbnRhdGlvbmNoYW5nZS5cIitjaWQ7XHJcblxyXG4gICAgICAgICAgICAvLyB1bmJpbmQgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnBhcmVudHMoKS5hZGQod2luZG93KS5lYWNoKGZ1bmN0aW9uICgpIHsgJCh0aGlzKS5vZmYoc2Nyb2xsKS5vZmYocmVzaXplKS5vZmYob3JpZW50KTsgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyRHJvcGRvd25BbGlnbm1lbnRQcmVmZXJlbmNlKCk7XHJcblxyXG4gICAgICAgICAgICAkKFwiI3NlbGVjdDItZHJvcC1tYXNrXCIpLmhpZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5yZW1vdmVBdHRyKFwiaWRcIik7IC8vIG9ubHkgdGhlIGFjdGl2ZSBkcm9wZG93biBoYXMgdGhlIHNlbGVjdDItZHJvcCBpZFxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmhpZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWRyb3Bkb3duLW9wZW5cIik7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cy5lbXB0eSgpO1xyXG5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1jbG9zZVwiKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogT3BlbnMgY29udHJvbCwgc2V0cyBpbnB1dCB2YWx1ZSwgYW5kIHVwZGF0ZXMgcmVzdWx0cy5cclxuICAgICAgICAgKi9cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGV4dGVybmFsU2VhcmNoOiBmdW5jdGlvbiAodGVybSkge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gudmFsKHRlcm0pO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHMoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgY2xlYXJTZWFyY2g6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy9hYnN0cmFjdFxyXG4gICAgICAgIGdldE1heGltdW1TZWxlY3Rpb25TaXplOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlKHRoaXMub3B0cy5tYXhpbXVtU2VsZWN0aW9uU2l6ZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBlbnN1cmVIaWdobGlnaHRWaXNpYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0gdGhpcy5yZXN1bHRzLCBjaGlsZHJlbiwgaW5kZXgsIGNoaWxkLCBoYiwgcmIsIHksIG1vcmU7XHJcblxyXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuaGlnaGxpZ2h0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGhpZ2hsaWdodGVkIHNjcm9sbCBhbGwgdGhlIHdheSB0byB0aGUgdG9wLFxyXG4gICAgICAgICAgICAgICAgLy8gdGhhdCB3YXkgYW55IHVuc2VsZWN0YWJsZSBoZWFkZXJzIGFib3ZlIGl0IHdpbGwgYWxzbyBiZSBzY3JvbGxlZFxyXG4gICAgICAgICAgICAgICAgLy8gaW50byB2aWV3XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5zY3JvbGxUb3AoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKS5maW5kKCcuc2VsZWN0Mi1yZXN1bHQtbGFiZWwnKTtcclxuXHJcbiAgICAgICAgICAgIGNoaWxkID0gJChjaGlsZHJlbltpbmRleF0pO1xyXG5cclxuICAgICAgICAgICAgaGIgPSBjaGlsZC5vZmZzZXQoKS50b3AgKyBjaGlsZC5vdXRlckhlaWdodCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2hpbGQgbGV0cyBhbHNvIG1ha2Ugc3VyZSBzZWxlY3QyLW1vcmUtcmVzdWx0cyBpcyB2aXNpYmxlXHJcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgbW9yZSA9IHJlc3VsdHMuZmluZChcImxpLnNlbGVjdDItbW9yZS1yZXN1bHRzXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1vcmUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGhiID0gbW9yZS5vZmZzZXQoKS50b3AgKyBtb3JlLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByYiA9IHJlc3VsdHMub2Zmc2V0KCkudG9wICsgcmVzdWx0cy5vdXRlckhlaWdodCh0cnVlKTtcclxuICAgICAgICAgICAgaWYgKGhiID4gcmIpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHMuc2Nyb2xsVG9wKHJlc3VsdHMuc2Nyb2xsVG9wKCkgKyAoaGIgLSByYikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHkgPSBjaGlsZC5vZmZzZXQoKS50b3AgLSByZXN1bHRzLm9mZnNldCgpLnRvcDtcclxuXHJcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdG9wIG9mIHRoZSBlbGVtZW50IGlzIHZpc2libGVcclxuICAgICAgICAgICAgaWYgKHkgPCAwICYmIGNoaWxkLmNzcygnZGlzcGxheScpICE9ICdub25lJyApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHMuc2Nyb2xsVG9wKHJlc3VsdHMuc2Nyb2xsVG9wKCkgKyB5KTsgLy8geSBpcyBuZWdhdGl2ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBmaW5kSGlnaGxpZ2h0YWJsZUNob2ljZXM6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzLmZpbmQoXCIuc2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZTpub3QoLnNlbGVjdDItc2VsZWN0ZWQpOm5vdCguc2VsZWN0Mi1kaXNhYmxlZClcIik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBtb3ZlSGlnaGxpZ2h0OiBmdW5jdGlvbiAoZGVsdGEpIHtcclxuICAgICAgICAgICAgdmFyIGNob2ljZXMgPSB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpLFxyXG4gICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLmhpZ2hsaWdodCgpO1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKGluZGV4ID4gLTEgJiYgaW5kZXggPCBjaG9pY2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaW5kZXggKz0gZGVsdGE7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hvaWNlID0gJChjaG9pY2VzW2luZGV4XSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hvaWNlLmhhc0NsYXNzKFwic2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZVwiKSAmJiAhY2hvaWNlLmhhc0NsYXNzKFwic2VsZWN0Mi1kaXNhYmxlZFwiKSAmJiAhY2hvaWNlLmhhc0NsYXNzKFwic2VsZWN0Mi1zZWxlY3RlZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0KGluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgaGlnaGxpZ2h0OiBmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICAgICAgdmFyIGNob2ljZXMgPSB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlLFxyXG4gICAgICAgICAgICAgICAgZGF0YTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhPZihjaG9pY2VzLmZpbHRlcihcIi5zZWxlY3QyLWhpZ2hsaWdodGVkXCIpWzBdLCBjaG9pY2VzLmdldCgpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ID49IGNob2ljZXMubGVuZ3RoKSBpbmRleCA9IGNob2ljZXMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgaW5kZXggPSAwO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgIGNob2ljZSA9ICQoY2hvaWNlc1tpbmRleF0pO1xyXG4gICAgICAgICAgICBjaG9pY2UuYWRkQ2xhc3MoXCJzZWxlY3QyLWhpZ2hsaWdodGVkXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbnN1cmVIaWdobGlnaHRWaXNpYmxlKCk7XHJcblxyXG4gICAgICAgICAgICBkYXRhID0gY2hvaWNlLmRhdGEoXCJzZWxlY3QyLWRhdGFcIik7XHJcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKHsgdHlwZTogXCJzZWxlY3QyLWhpZ2hsaWdodFwiLCB2YWw6IHRoaXMuaWQoZGF0YSksIGNob2ljZTogZGF0YSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHJlbW92ZUhpZ2hsaWdodDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cy5maW5kKFwiLnNlbGVjdDItaGlnaGxpZ2h0ZWRcIikucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWhpZ2hsaWdodGVkXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgY291bnRTZWxlY3RhYmxlUmVzdWx0czogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpLmxlbmd0aDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGhpZ2hsaWdodFVuZGVyRXZlbnQ6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICB2YXIgZWwgPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcIi5zZWxlY3QyLXJlc3VsdC1zZWxlY3RhYmxlXCIpO1xyXG4gICAgICAgICAgICBpZiAoZWwubGVuZ3RoID4gMCAmJiAhZWwuaXMoXCIuc2VsZWN0Mi1oaWdobGlnaHRlZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNob2ljZXMgPSB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHQoY2hvaWNlcy5pbmRleChlbCkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgb3ZlciBhbiB1bnNlbGVjdGFibGUgaXRlbSByZW1vdmUgYWxsIGhpZ2hsaWdodHNcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGxvYWRNb3JlSWZOZWVkZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMsXHJcbiAgICAgICAgICAgICAgICBtb3JlID0gcmVzdWx0cy5maW5kKFwibGkuc2VsZWN0Mi1tb3JlLXJlc3VsdHNcIiksXHJcbiAgICAgICAgICAgICAgICBiZWxvdywgLy8gcGl4ZWxzIHRoZSBlbGVtZW50IGlzIGJlbG93IHRoZSBzY3JvbGwgZm9sZCwgYmVsb3c9PTAgaXMgd2hlbiB0aGUgZWxlbWVudCBpcyBzdGFydGluZyB0byBiZSB2aXNpYmxlXHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtMSwgLy8gaW5kZXggb2YgZmlyc3QgZWxlbWVudCB3aXRob3V0IGRhdGFcclxuICAgICAgICAgICAgICAgIHBhZ2UgPSB0aGlzLnJlc3VsdHNQYWdlICsgMSxcclxuICAgICAgICAgICAgICAgIHNlbGY9dGhpcyxcclxuICAgICAgICAgICAgICAgIHRlcm09dGhpcy5zZWFyY2gudmFsKCksXHJcbiAgICAgICAgICAgICAgICBjb250ZXh0PXRoaXMuY29udGV4dDtcclxuXHJcbiAgICAgICAgICAgIGlmIChtb3JlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBiZWxvdyA9IG1vcmUub2Zmc2V0KCkudG9wIC0gcmVzdWx0cy5vZmZzZXQoKS50b3AgLSByZXN1bHRzLmhlaWdodCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGJlbG93IDw9IHRoaXMub3B0cy5sb2FkTW9yZVBhZGRpbmcpIHtcclxuICAgICAgICAgICAgICAgIG1vcmUuYWRkQ2xhc3MoXCJzZWxlY3QyLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMub3B0cy5lbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtOiB0ZXJtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyOiB0aGlzLm9wdHMubWF0Y2hlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuYmluZChmdW5jdGlvbiAoZGF0YSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYSByZXNwb25zZSBpZiB0aGUgc2VsZWN0MiBoYXMgYmVlbiBjbG9zZWQgYmVmb3JlIGl0IHdhcyByZWNlaXZlZFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcGVuZWQoKSkgcmV0dXJuO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRzLnBvcHVsYXRlUmVzdWx0cy5jYWxsKHRoaXMsIHJlc3VsdHMsIGRhdGEucmVzdWx0cywge3Rlcm06IHRlcm0sIHBhZ2U6IHBhZ2UsIGNvbnRleHQ6Y29udGV4dH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zdHByb2Nlc3NSZXN1bHRzKGRhdGEsIGZhbHNlLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm1vcmU9PT10cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUuZGV0YWNoKCkuYXBwZW5kVG8ocmVzdWx0cykudGV4dChzZWxmLm9wdHMuZm9ybWF0TG9hZE1vcmUocGFnZSsxKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxmLmxvYWRNb3JlSWZOZWVkZWQoKTsgfSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb25Ecm9wZG93bigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c1BhZ2UgPSBwYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IGRhdGEuY29udGV4dDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKHsgdHlwZTogXCJzZWxlY3QyLWxvYWRlZFwiLCBpdGVtczogZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgIH0pfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWZhdWx0IHRva2VuaXplciBmdW5jdGlvbiB3aGljaCBkb2VzIG5vdGhpbmdcclxuICAgICAgICAgKi9cclxuICAgICAgICB0b2tlbml6ZTogZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwYXJhbSBpbml0aWFsIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgdGhlIGNhbGwgdG8gdGhpcyBtZXRob2QgcmlnaHQgYWZ0ZXIgdGhlIGRyb3Bkb3duIGhhcyBiZWVuIG9wZW5lZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgdXBkYXRlUmVzdWx0czogZnVuY3Rpb24gKGluaXRpYWwpIHtcclxuICAgICAgICAgICAgdmFyIHNlYXJjaCA9IHRoaXMuc2VhcmNoLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0cyA9IHRoaXMucmVzdWx0cyxcclxuICAgICAgICAgICAgICAgIG9wdHMgPSB0aGlzLm9wdHMsXHJcbiAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgc2VsZiA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBpbnB1dCxcclxuICAgICAgICAgICAgICAgIHRlcm0gPSBzZWFyY2gudmFsKCksXHJcbiAgICAgICAgICAgICAgICBsYXN0VGVybSA9ICQuZGF0YSh0aGlzLmNvbnRhaW5lciwgXCJzZWxlY3QyLWxhc3QtdGVybVwiKSxcclxuICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlIG51bWJlciB1c2VkIHRvIGRyb3Agb3V0LW9mLW9yZGVyIHJlc3BvbnNlc1xyXG4gICAgICAgICAgICAgICAgcXVlcnlOdW1iZXI7XHJcblxyXG4gICAgICAgICAgICAvLyBwcmV2ZW50IGR1cGxpY2F0ZSBxdWVyaWVzIGFnYWluc3QgdGhlIHNhbWUgdGVybVxyXG4gICAgICAgICAgICBpZiAoaW5pdGlhbCAhPT0gdHJ1ZSAmJiBsYXN0VGVybSAmJiBlcXVhbCh0ZXJtLCBsYXN0VGVybSkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICQuZGF0YSh0aGlzLmNvbnRhaW5lciwgXCJzZWxlY3QyLWxhc3QtdGVybVwiLCB0ZXJtKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBzZWFyY2ggaXMgY3VycmVudGx5IGhpZGRlbiB3ZSBkbyBub3QgYWx0ZXIgdGhlIHJlc3VsdHNcclxuICAgICAgICAgICAgaWYgKGluaXRpYWwgIT09IHRydWUgJiYgKHRoaXMuc2hvd1NlYXJjaElucHV0ID09PSBmYWxzZSB8fCAhdGhpcy5vcGVuZWQoKSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gcG9zdFJlbmRlcigpIHtcclxuICAgICAgICAgICAgICAgIHNlYXJjaC5yZW1vdmVDbGFzcyhcInNlbGVjdDItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5wb3NpdGlvbkRyb3Bkb3duKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbmRlcihodG1sKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRzLmh0bWwoaHRtbCk7XHJcbiAgICAgICAgICAgICAgICBwb3N0UmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHF1ZXJ5TnVtYmVyID0gKyt0aGlzLnF1ZXJ5Q291bnQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgbWF4U2VsU2l6ZSA9IHRoaXMuZ2V0TWF4aW11bVNlbGVjdGlvblNpemUoKTtcclxuICAgICAgICAgICAgaWYgKG1heFNlbFNpemUgPj0xKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoJC5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID49IG1heFNlbFNpemUgJiYgY2hlY2tGb3JtYXR0ZXIob3B0cy5mb3JtYXRTZWxlY3Rpb25Ub29CaWcsIFwiZm9ybWF0U2VsZWN0aW9uVG9vQmlnXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyKFwiPGxpIGNsYXNzPSdzZWxlY3QyLXNlbGVjdGlvbi1saW1pdCc+XCIgKyBvcHRzLmZvcm1hdFNlbGVjdGlvblRvb0JpZyhtYXhTZWxTaXplKSArIFwiPC9saT5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VhcmNoLnZhbCgpLmxlbmd0aCA8IG9wdHMubWluaW11bUlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tGb3JtYXR0ZXIob3B0cy5mb3JtYXRJbnB1dFRvb1Nob3J0LCBcImZvcm1hdElucHV0VG9vU2hvcnRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXIoXCI8bGkgY2xhc3M9J3NlbGVjdDItbm8tcmVzdWx0cyc+XCIgKyBvcHRzLmZvcm1hdElucHV0VG9vU2hvcnQoc2VhcmNoLnZhbCgpLCBvcHRzLm1pbmltdW1JbnB1dExlbmd0aCkgKyBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXIoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbCAmJiB0aGlzLnNob3dTZWFyY2gpIHRoaXMuc2hvd1NlYXJjaCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdHMubWF4aW11bUlucHV0TGVuZ3RoICYmIHNlYXJjaC52YWwoKS5sZW5ndGggPiBvcHRzLm1heGltdW1JbnB1dExlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9ybWF0dGVyKG9wdHMuZm9ybWF0SW5wdXRUb29Mb25nLCBcImZvcm1hdElucHV0VG9vTG9uZ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcihcIjxsaSBjbGFzcz0nc2VsZWN0Mi1uby1yZXN1bHRzJz5cIiArIG9wdHMuZm9ybWF0SW5wdXRUb29Mb25nKHNlYXJjaC52YWwoKSwgb3B0cy5tYXhpbXVtSW5wdXRMZW5ndGgpICsgXCI8L2xpPlwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0cy5mb3JtYXRTZWFyY2hpbmcgJiYgdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJlbmRlcihcIjxsaSBjbGFzcz0nc2VsZWN0Mi1zZWFyY2hpbmcnPlwiICsgb3B0cy5mb3JtYXRTZWFyY2hpbmcoKSArIFwiPC9saT5cIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNlYXJjaC5hZGRDbGFzcyhcInNlbGVjdDItYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGdpdmUgdGhlIHRva2VuaXplciBhIGNoYW5jZSB0byBwcmUtcHJvY2VzcyB0aGUgaW5wdXRcclxuICAgICAgICAgICAgaW5wdXQgPSB0aGlzLnRva2VuaXplKCk7XHJcbiAgICAgICAgICAgIGlmIChpbnB1dCAhPSB1bmRlZmluZWQgJiYgaW5wdXQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgc2VhcmNoLnZhbChpbnB1dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c1BhZ2UgPSAxO1xyXG5cclxuICAgICAgICAgICAgb3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBvcHRzLmVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVybTogc2VhcmNoLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMucmVzdWx0c1BhZ2UsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVyOiBvcHRzLm1hdGNoZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuYmluZChmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRlZjsgLy8gZGVmYXVsdCBjaG9pY2VcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgb2xkIHJlc3BvbnNlc1xyXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5TnVtYmVyICE9IHRoaXMucXVlcnlDb3VudCkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGEgcmVzcG9uc2UgaWYgdGhlIHNlbGVjdDIgaGFzIGJlZW4gY2xvc2VkIGJlZm9yZSBpdCB3YXMgcmVjZWl2ZWRcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIHNhdmUgY29udGV4dCwgaWYgYW55XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSAoZGF0YS5jb250ZXh0PT09dW5kZWZpbmVkKSA/IG51bGwgOiBkYXRhLmNvbnRleHQ7XHJcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBkZWZhdWx0IGNob2ljZSBhbmQgcHJlcGVuZCBpdCB0byB0aGUgbGlzdFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgJiYgc2VhcmNoLnZhbCgpICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmID0gdGhpcy5vcHRzLmNyZWF0ZVNlYXJjaENob2ljZS5jYWxsKHNlbGYsIHNlYXJjaC52YWwoKSwgZGF0YS5yZXN1bHRzKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmICE9PSB1bmRlZmluZWQgJiYgZGVmICE9PSBudWxsICYmIHNlbGYuaWQoZGVmKSAhPT0gdW5kZWZpbmVkICYmIHNlbGYuaWQoZGVmKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChkYXRhLnJlc3VsdHMpLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXF1YWwoc2VsZi5pZCh0aGlzKSwgc2VsZi5pZChkZWYpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZXN1bHRzLnVuc2hpZnQoZGVmKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHRzLmxlbmd0aCA9PT0gMCAmJiBjaGVja0Zvcm1hdHRlcihvcHRzLmZvcm1hdE5vTWF0Y2hlcywgXCJmb3JtYXROb01hdGNoZXNcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXIoXCI8bGkgY2xhc3M9J3NlbGVjdDItbm8tcmVzdWx0cyc+XCIgKyBvcHRzLmZvcm1hdE5vTWF0Y2hlcyhzZWFyY2gudmFsKCkpICsgXCI8L2xpPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5vcHRzLnBvcHVsYXRlUmVzdWx0cy5jYWxsKHRoaXMsIHJlc3VsdHMsIGRhdGEucmVzdWx0cywge3Rlcm06IHNlYXJjaC52YWwoKSwgcGFnZTogdGhpcy5yZXN1bHRzUGFnZSwgY29udGV4dDpudWxsfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEubW9yZSA9PT0gdHJ1ZSAmJiBjaGVja0Zvcm1hdHRlcihvcHRzLmZvcm1hdExvYWRNb3JlLCBcImZvcm1hdExvYWRNb3JlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoXCI8bGkgY2xhc3M9J3NlbGVjdDItbW9yZS1yZXN1bHRzJz5cIiArIHNlbGYub3B0cy5lc2NhcGVNYXJrdXAob3B0cy5mb3JtYXRMb2FkTW9yZSh0aGlzLnJlc3VsdHNQYWdlKSkgKyBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxmLmxvYWRNb3JlSWZOZWVkZWQoKTsgfSwgMTApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucG9zdHByb2Nlc3NSZXN1bHRzKGRhdGEsIGluaXRpYWwpO1xyXG5cclxuICAgICAgICAgICAgICAgIHBvc3RSZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKHsgdHlwZTogXCJzZWxlY3QyLWxvYWRlZFwiLCBpdGVtczogZGF0YSB9KTtcclxuICAgICAgICAgICAgfSl9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBibHVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHNlbGVjdE9uQmx1ciA9PSB0cnVlLCBzZWxlY3QgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBvcHRpb25cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5zZWxlY3RPbkJsdXIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkKHtub0ZvY3VzOiB0cnVlfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAvLyBzeW5vbnltb3VzIHRvIC5pcygnOmZvY3VzJyksIHdoaWNoIGlzIGF2YWlsYWJsZSBpbiBqcXVlcnkgPj0gMS42XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFswXSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgeyB0aGlzLnNlYXJjaC5ibHVyKCk7IH1cclxuICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZS1mb2N1c1wiKS5yZW1vdmVDbGFzcyhcInNlbGVjdDItc2VhcmNoLWNob2ljZS1mb2N1c1wiKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGZvY3VzU2VhcmNoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZvY3VzKHRoaXMuc2VhcmNoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHNlbGVjdEhpZ2hsaWdodGVkOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICB2YXIgaW5kZXg9dGhpcy5oaWdobGlnaHQoKSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkPXRoaXMucmVzdWx0cy5maW5kKFwiLnNlbGVjdDItaGlnaGxpZ2h0ZWRcIiksXHJcbiAgICAgICAgICAgICAgICBkYXRhID0gaGlnaGxpZ2h0ZWQuY2xvc2VzdCgnLnNlbGVjdDItcmVzdWx0JykuZGF0YShcInNlbGVjdDItZGF0YVwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodChpbmRleCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0KGRhdGEsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5ub0ZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGdldFBsYWNlaG9sZGVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBwbGFjZWhvbGRlck9wdGlvbjtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0cy5lbGVtZW50LmF0dHIoXCJwbGFjZWhvbGRlclwiKSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcImRhdGEtcGxhY2Vob2xkZXJcIikgfHwgLy8ganF1ZXJ5IDEuNCBjb21wYXRcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LmRhdGEoXCJwbGFjZWhvbGRlclwiKSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLnBsYWNlaG9sZGVyIHx8XHJcbiAgICAgICAgICAgICAgICAoKHBsYWNlaG9sZGVyT3B0aW9uID0gdGhpcy5nZXRQbGFjZWhvbGRlck9wdGlvbigpKSAhPT0gdW5kZWZpbmVkID8gcGxhY2Vob2xkZXJPcHRpb24udGV4dCgpIDogdW5kZWZpbmVkKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGdldFBsYWNlaG9sZGVyT3B0aW9uOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3RPcHRpb24gPSB0aGlzLnNlbGVjdC5jaGlsZHJlbigpLmZpcnN0KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLnBsYWNlaG9sZGVyT3B0aW9uICE9PSB1bmRlZmluZWQgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9EZXRlcm1pbmUgdGhlIHBsYWNlaG9sZGVyIG9wdGlvbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBsYWNlaG9sZGVyT3B0aW9uIHNldHRpbmdcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMub3B0cy5wbGFjZWhvbGRlck9wdGlvbiA9PT0gXCJmaXJzdFwiICYmIGZpcnN0T3B0aW9uKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMub3B0cy5wbGFjZWhvbGRlck9wdGlvbiA9PT0gXCJmdW5jdGlvblwiICYmIHRoaXMub3B0cy5wbGFjZWhvbGRlck9wdGlvbih0aGlzLnNlbGVjdCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdE9wdGlvbi50ZXh0KCkgPT09IFwiXCIgJiYgZmlyc3RPcHRpb24udmFsKCkgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL05vIGV4cGxpY2l0IHBsYWNlaG9sZGVyIG9wdGlvbiBzcGVjaWZpZWQsIHVzZSB0aGUgZmlyc3QgaWYgaXQncyBibGFua1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdE9wdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdldCB0aGUgZGVzaXJlZCB3aWR0aCBmb3IgdGhlIGNvbnRhaW5lciBlbGVtZW50LiAgVGhpcyBpc1xyXG4gICAgICAgICAqIGRlcml2ZWQgZmlyc3QgZnJvbSBvcHRpb24gYHdpZHRoYCBwYXNzZWQgdG8gc2VsZWN0MiwgdGhlblxyXG4gICAgICAgICAqIHRoZSBpbmxpbmUgJ3N0eWxlJyBvbiB0aGUgb3JpZ2luYWwgZWxlbWVudCwgYW5kIGZpbmFsbHlcclxuICAgICAgICAgKiBmYWxscyBiYWNrIHRvIHRoZSBqUXVlcnkgY2FsY3VsYXRlZCBlbGVtZW50IHdpZHRoLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgaW5pdENvbnRhaW5lcldpZHRoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlc29sdmVDb250YWluZXJXaWR0aCgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzdHlsZSwgYXR0cnMsIG1hdGNoZXMsIGksIGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy53aWR0aCA9PT0gXCJvZmZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdHMud2lkdGggPT09IFwiZWxlbWVudFwiKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRzLmVsZW1lbnQub3V0ZXJXaWR0aChmYWxzZSkgPT09IDAgPyAnYXV0bycgOiB0aGlzLm9wdHMuZWxlbWVudC5vdXRlcldpZHRoKGZhbHNlKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy53aWR0aCA9PT0gXCJjb3B5XCIgfHwgdGhpcy5vcHRzLndpZHRoID09PSBcInJlc29sdmVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGlubGluZSBzdHlsZSBvbiB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHdpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSB0aGlzLm9wdHMuZWxlbWVudC5hdHRyKCdzdHlsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzID0gc3R5bGUuc3BsaXQoJzsnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IGF0dHJzW2ldLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goL1teLV13aWR0aDooKFstK10/KFswLTldKlxcLik/WzAtOV0rKShweHxlbXxleHwlfGlufGNtfG1tfHB0fHBjKSkvaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyAhPT0gbnVsbCAmJiBtYXRjaGVzLmxlbmd0aCA+PSAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLndpZHRoID09PSBcInJlc29sdmVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNoZWNrIGlmIGNzcygnd2lkdGgnKSBjYW4gcmVzb2x2ZSBhIHdpZHRoIHRoYXQgaXMgcGVyY2VudCBiYXNlZCwgdGhpcyBpcyBzb21ldGltZXMgcG9zc2libGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhdHRhY2hlZCB0byBpbnB1dCB0eXBlPWhpZGRlbiBvciBlbGVtZW50cyBoaWRkZW4gdmlhIGNzc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHRoaXMub3B0cy5lbGVtZW50LmNzcygnd2lkdGgnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlLmluZGV4T2YoXCIlXCIpID4gMCkgcmV0dXJuIHN0eWxlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSwgZmFsbGJhY2sgb24gdGhlIGNhbGN1bGF0ZWQgd2lkdGggb2YgdGhlIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLm9wdHMuZWxlbWVudC5vdXRlcldpZHRoKGZhbHNlKSA9PT0gMCA/ICdhdXRvJyA6IHRoaXMub3B0cy5lbGVtZW50Lm91dGVyV2lkdGgoZmFsc2UpICsgJ3B4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJC5pc0Z1bmN0aW9uKHRoaXMub3B0cy53aWR0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRzLndpZHRoKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdHMud2lkdGg7XHJcbiAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHJlc29sdmVDb250YWluZXJXaWR0aC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAod2lkdGggIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNzcyhcIndpZHRoXCIsIHdpZHRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIFNpbmdsZVNlbGVjdDIgPSBjbGF6eihBYnN0cmFjdFNlbGVjdDIsIHtcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcblxyXG4gICAgICAgIGNyZWF0ZUNvbnRhaW5lcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5hdHRyKHtcclxuICAgICAgICAgICAgICAgIFwiY2xhc3NcIjogXCJzZWxlY3QyLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgIH0pLmh0bWwoW1xyXG4gICAgICAgICAgICAgICAgXCI8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCknIG9uY2xpY2s9J3JldHVybiBmYWxzZTsnIGNsYXNzPSdzZWxlY3QyLWNob2ljZScgdGFiaW5kZXg9Jy0xJz5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgPHNwYW4gY2xhc3M9J3NlbGVjdDItY2hvc2VuJz4mbmJzcDs8L3NwYW4+PGFiYnIgY2xhc3M9J3NlbGVjdDItc2VhcmNoLWNob2ljZS1jbG9zZSc+PC9hYmJyPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8c3BhbiBjbGFzcz0nc2VsZWN0Mi1hcnJvdyc+PGkgY2xhc3M9J2ZhIGZhLXNvcnQgYnJhbmQtaW5mbyBzZWxlY3QyLWZhJz48L2k+PC9zcGFuPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8L2E+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjxpbnB1dCBjbGFzcz0nc2VsZWN0Mi1mb2N1c3NlciBzZWxlY3QyLW9mZnNjcmVlbicgdHlwZT0ndGV4dCcvPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8ZGl2IGNsYXNzPSdzZWxlY3QyLWRyb3Agc2VsZWN0Mi1kaXNwbGF5LW5vbmUnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8ZGl2IGNsYXNzPSdzZWxlY3QyLXNlYXJjaCc+XCIsXHJcbiAgICAgICAgICAgICAgICBcIiAgICAgICA8aW5wdXQgdHlwZT0ndGV4dCcgYXV0b2NvbXBsZXRlPSdvZmYnIGF1dG9jb3JyZWN0PSdvZmYnIGF1dG9jYXBpdGFsaXplPSdvZmYnIHNwZWxsY2hlY2s9J2ZhbHNlJyBjbGFzcz0nc2VsZWN0Mi1pbnB1dCcvPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8L2Rpdj5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgPHVsIGNsYXNzPSdzZWxlY3QyLXJlc3VsdHMnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8L3VsPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8L2Rpdj5cIl0uam9pbihcIlwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgZW5hYmxlSW50ZXJmYWNlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50LmVuYWJsZUludGVyZmFjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLnByb3AoXCJkaXNhYmxlZFwiLCAhdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBvcGVuaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlbCwgcmFuZ2UsIGxlbjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMubWluaW11bVJlc3VsdHNGb3JTZWFyY2ggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5vcGVuaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93U2VhcmNoSW5wdXQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJRSBhcHBlbmRzIGZvY3Vzc2VyLnZhbCgpIGF0IHRoZSBlbmQgb2YgZmllbGQgOi8gc28gd2UgbWFudWFsbHkgaW5zZXJ0IGl0IGF0IHRoZSBiZWdpbm5pbmcgdXNpbmcgYSByYW5nZVxyXG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIGJyb3dzZXJzIGhhbmRsZSB0aGlzIGp1c3QgZmluZVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnZhbCh0aGlzLmZvY3Vzc2VyLnZhbCgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5mb2N1cygpO1xyXG4gICAgICAgICAgICAvLyBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBhZnRlciBmb2N1c3NpbmcsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGF0IHRoZSBiZWdpbm5pbmcgYW5kXHJcbiAgICAgICAgICAgIC8vIG5ldyB0ZXh0IHdpbGwgYXBwZWFyICpiZWZvcmUqIGZvY3Vzc2VyLnZhbCgpXHJcbiAgICAgICAgICAgIGVsID0gdGhpcy5zZWFyY2guZ2V0KDApO1xyXG4gICAgICAgICAgICBpZiAoZWwuY3JlYXRlVGV4dFJhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZSA9IGVsLmNyZWF0ZVRleHRSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcclxuICAgICAgICAgICAgICAgIGxlbiA9IHRoaXMuc2VhcmNoLnZhbCgpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKGxlbiwgbGVuKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZXMgc2VhcmNoJ3MgdmFsdWUgd2l0aCBuZXh0U2VhcmNoVGVybSAoaWYgZGVmaW5lZCBieSB1c2VyKVxyXG4gICAgICAgICAgICAvLyBpZ25vcmUgbmV4dFNlYXJjaFRlcm0gaWYgdGhlIGRyb3Bkb3duIGlzIG9wZW5lZCBieSB0aGUgdXNlciBwcmVzc2luZyBhIGxldHRlclxyXG4gICAgICAgICAgICBpZih0aGlzLnNlYXJjaC52YWwoKSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5uZXh0U2VhcmNoVGVybSAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnZhbCh0aGlzLm5leHRTZWFyY2hUZXJtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5zZWxlY3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSkudmFsKFwiXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHModHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItb3BlblwiKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uIChwYXJhbXMpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmNsb3NlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcblxyXG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge2ZvY3VzOiB0cnVlfTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBmb2N1czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBpc0ZvY3VzZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIuZm9jdXMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgJChcImxhYmVsW2Zvcj0nXCIgKyB0aGlzLmZvY3Vzc2VyLmF0dHIoJ2lkJykgKyBcIiddXCIpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGluaXRDb250YWluZXI6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duID0gdGhpcy5kcm9wZG93bjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMubWluaW11bVJlc3VsdHNGb3JTZWFyY2ggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTZWFyY2goZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbiA9IGNvbnRhaW5lci5maW5kKFwiLnNlbGVjdDItY2hvaWNlXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3NlciA9IGNvbnRhaW5lci5maW5kKFwiLnNlbGVjdDItZm9jdXNzZXJcIik7XHJcblxyXG4gICAgICAgICAgICAvLyByZXdyaXRlIGxhYmVscyBmcm9tIG9yaWdpbmFsIGVsZW1lbnQgdG8gZm9jdXNzZXJcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5hdHRyKFwiaWRcIiwgXCJzMmlkX2F1dG9nZW5cIituZXh0VWlkKCkpO1xyXG5cclxuICAgICAgICAgICAgJChcImxhYmVsW2Zvcj0nXCIgKyB0aGlzLm9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIikgKyBcIiddXCIpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgdGhpcy5mb2N1c3Nlci5hdHRyKCdpZCcpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIuYXR0cihcInRhYmluZGV4XCIsIHRoaXMuZWxlbWVudFRhYkluZGV4KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLm9uKFwia2V5ZG93blwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSBLRVkuUEFHRV9VUCB8fCBlLndoaWNoID09PSBLRVkuUEFHRV9ET1dOKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCB0aGUgcGFnZSBmcm9tIHNjcm9sbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChlLndoaWNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuVVA6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuRE9XTjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0KChlLndoaWNoID09PSBLRVkuVVApID8gLTEgOiAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuRU5URVI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SGlnaGxpZ2h0ZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuVEFCOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzZWxlY3RPbkJsdXIgPT0gdHJ1ZSwgc2VsZWN0IHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuc2VsZWN0T25CbHVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkKHtub0ZvY3VzOiB0cnVlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkVTQzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWwoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5vbihcImJsdXJcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGEgd29ya2Fyb3VuZCBmb3IgY2hyb21lIHRvIGtlZXAgdGhlIHNlYXJjaCBmaWVsZCBmb2N1c3NlZCB3aGVuIHRoZSBzY3JvbGwgYmFyIGlzIHVzZWQgdG8gc2Nyb2xsIHRoZSBkcm9wZG93bi5cclxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcyB0aGUgc2VhcmNoIGZpZWxkIGxvc2VzIGZvY3VzIHdoaWNoIGlzIGFubm95aW5nXHJcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5ib2R5KCkuZ2V0KDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5iaW5kKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLCAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5vbihcImtleWRvd25cIiwgdGhpcy5iaW5kKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gS0VZLlRBQiB8fCBLRVkuaXNDb250cm9sKGUpIHx8IEtFWS5pc0Z1bmN0aW9uS2V5KGUpIHx8IGUud2hpY2ggPT09IEtFWS5FU0MpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5vcGVuT25FbnRlciA9PT0gZmFsc2UgJiYgZS53aGljaCA9PT0gS0VZLkVOVEVSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PSBLRVkuRE9XTiB8fCBlLndoaWNoID09IEtFWS5VUFxyXG4gICAgICAgICAgICAgICAgICAgIHx8IChlLndoaWNoID09IEtFWS5FTlRFUiAmJiB0aGlzLm9wdHMub3Blbk9uRW50ZXIpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmFsdEtleSB8fCBlLmN0cmxLZXkgfHwgZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PSBLRVkuREVMRVRFIHx8IGUud2hpY2ggPT0gS0VZLkJBQ0tTUEFDRSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYWxsb3dDbGVhcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcblxyXG4gICAgICAgICAgICBpbnN0YWxsS2V5VXBDaGFuZ2VFdmVudCh0aGlzLmZvY3Vzc2VyKTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5vbihcImtleXVwLWNoYW5nZSBpbnB1dFwiLCB0aGlzLmJpbmQoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVuZWQoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3Rpb24ub24oXCJtb3VzZWRvd25cIiwgXCJhYmJyXCIsIHRoaXMuYmluZChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICBraWxsRXZlbnRJbW1lZGlhdGVseShlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5vbihcIm1vdXNlZG93blwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1mb2N1c1wiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIGRyb3Bkb3duLm9uKFwibW91c2Vkb3duXCIsIHRoaXMuYmluZChmdW5jdGlvbigpIHsgdGhpcy5zZWFyY2guZm9jdXMoKTsgfSkpO1xyXG5cclxuICAgICAgICAgICAgc2VsZWN0aW9uLm9uKFwiZm9jdXNcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5vbihcImZvY3VzXCIsIHRoaXMuYmluZChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItZm9jdXNcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgIH0pKS5vbihcImJsdXJcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1ibHVyXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5vbihcImZvY3VzXCIsIHRoaXMuYmluZChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItZm9jdXNcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRhaW5lcldpZHRoKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LmFkZENsYXNzKFwic2VsZWN0Mi1vZmZzY3JlZW5cIik7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcclxuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKHRyaWdnZXJDaGFuZ2UpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGE9dGhpcy5zZWxlY3Rpb24uZGF0YShcInNlbGVjdDItZGF0YVwiKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEpIHsgLy8gZ3VhcmQgYWdhaW5zdCBxdWV1ZWQgcXVpY2sgY29uc2VjdXRpdmUgY2xpY2tzXHJcbiAgICAgICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXJPcHRpb24gPSB0aGlzLmdldFBsYWNlaG9sZGVyT3B0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC52YWwocGxhY2Vob2xkZXJPcHRpb24gPyBwbGFjZWhvbGRlck9wdGlvbi52YWwoKSA6IFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLWNob3NlblwiKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVtb3ZlRGF0YShcInNlbGVjdDItZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSAhPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoeyB0eXBlOiBcInNlbGVjdDItcmVtb3ZlZFwiLCB2YWw6IHRoaXMuaWQoZGF0YSksIGNob2ljZTogZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDaGFuZ2Uoe3JlbW92ZWQ6ZGF0YX0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2V0cyBzZWxlY3Rpb24gYmFzZWQgb24gc291cmNlIGVsZW1lbnQncyB2YWx1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGluaXRTZWxlY3Rpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1BsYWNlaG9sZGVyT3B0aW9uU2VsZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24obnVsbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuaW5pdFNlbGVjdGlvbi5jYWxsKG51bGwsIHRoaXMub3B0cy5lbGVtZW50LCBmdW5jdGlvbihzZWxlY3RlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVTZWxlY3Rpb24oc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0UGxhY2Vob2xkZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGlzUGxhY2Vob2xkZXJPcHRpb25TZWxlY3RlZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBwbGFjZWhvbGRlck9wdGlvbjtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdHMucGxhY2Vob2xkZXIpIHJldHVybiBmYWxzZTsgLy8gbm8gcGxhY2Vob2xkZXIgc3BlY2lmaWVkIHNvIG5vIG9wdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZFxyXG4gICAgICAgICAgICByZXR1cm4gKChwbGFjZWhvbGRlck9wdGlvbiA9IHRoaXMuZ2V0UGxhY2Vob2xkZXJPcHRpb24oKSkgIT09IHVuZGVmaW5lZCAmJiBwbGFjZWhvbGRlck9wdGlvbi5pcygnOnNlbGVjdGVkJykpXHJcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5vcHRzLmVsZW1lbnQudmFsKCkgPT09IFwiXCIpXHJcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5vcHRzLmVsZW1lbnQudmFsKCkgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLm9wdHMuZWxlbWVudC52YWwoKSA9PT0gbnVsbCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgcHJlcGFyZU9wdHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG9wdHMgPSB0aGlzLnBhcmVudC5wcmVwYXJlT3B0cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxyXG4gICAgICAgICAgICAgICAgc2VsZj10aGlzO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wdHMuZWxlbWVudC5nZXQoMCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbnN0YWxsIHRoZSBzZWxlY3Rpb24gaW5pdGlhbGl6ZXJcclxuICAgICAgICAgICAgICAgIG9wdHMuaW5pdFNlbGVjdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IGVsZW1lbnQuZmluZChcIjpzZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBhIHNpbmdsZSBzZWxlY3QgYm94IGFsd2F5cyBoYXMgYSB2YWx1ZSwgbm8gbmVlZCB0byBudWxsIGNoZWNrICdzZWxlY3RlZCdcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmLm9wdGlvblRvRGF0YShzZWxlY3RlZCkpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChcImRhdGFcIiBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbnN0YWxsIGRlZmF1bHQgaW5pdFNlbGVjdGlvbiB3aGVuIGFwcGxpZWQgdG8gaGlkZGVuIGlucHV0IGFuZCBkYXRhIGlzIGxvY2FsXHJcbiAgICAgICAgICAgICAgICBvcHRzLmluaXRTZWxlY3Rpb24gPSBvcHRzLmluaXRTZWxlY3Rpb24gfHwgZnVuY3Rpb24gKGVsZW1lbnQsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gZWxlbWVudC52YWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXJjaCBpbiBkYXRhIGJ5IGlkLCBzdG9yaW5nIHRoZSBhY3R1YWwgbWF0Y2hpbmcgaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXI6IGZ1bmN0aW9uKHRlcm0sIHRleHQsIGVsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc19tYXRjaCA9IGVxdWFsKGlkLCBvcHRzLmlkKGVsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfbWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGVsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzX21hdGNoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogISQuaXNGdW5jdGlvbihjYWxsYmFjaykgPyAkLm5vb3AgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1hdGNoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG9wdHM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgZ2V0UGxhY2Vob2xkZXI6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAvLyBpZiBhIHBsYWNlaG9sZGVyIGlzIHNwZWNpZmllZCBvbiBhIHNpbmdsZSBzZWxlY3Qgd2l0aG91dCBhIHZhbGlkIHBsYWNlaG9sZGVyIG9wdGlvbiBpZ25vcmUgaXRcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRQbGFjZWhvbGRlck9wdGlvbigpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UGxhY2Vob2xkZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBzZXRQbGFjZWhvbGRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1BsYWNlaG9sZGVyT3B0aW9uU2VsZWN0ZWQoKSAmJiBwbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGEgcGxhY2Vob2xkZXIgb3B0aW9uIGlmIGF0dGFjaGVkIHRvIGEgc2VsZWN0XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QgJiYgdGhpcy5nZXRQbGFjZWhvbGRlck9wdGlvbigpID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItY2hvc2VuXCIpLmh0bWwodGhpcy5vcHRzLmVzY2FwZU1hcmt1cChwbGFjZWhvbGRlcikpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmFkZENsYXNzKFwic2VsZWN0Mi1kZWZhdWx0XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1hbGxvd2NsZWFyXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgcG9zdHByb2Nlc3NSZXN1bHRzOiBmdW5jdGlvbiAoZGF0YSwgaW5pdGlhbCwgbm9IaWdobGlnaHRVcGRhdGUpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gMCwgc2VsZiA9IHRoaXMsIHNob3dTZWFyY2hJbnB1dCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAvLyBmaW5kIHRoZSBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSByZXN1bHQgbGlzdFxyXG5cclxuICAgICAgICAgICAgdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKS5lYWNoMihmdW5jdGlvbiAoaSwgZWxtKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXF1YWwoc2VsZi5pZChlbG0uZGF0YShcInNlbGVjdDItZGF0YVwiKSksIHNlbGYub3B0cy5lbGVtZW50LnZhbCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gYW5kIGhpZ2hsaWdodCBpdFxyXG4gICAgICAgICAgICBpZiAobm9IaWdobGlnaHRVcGRhdGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbCA9PT0gdHJ1ZSAmJiBzZWxlY3RlZCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHQoc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodCgwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gaGlkZSB0aGUgc2VhcmNoIGJveCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB3ZSBnb3QgdGhlIHJlc3VsdHMgYW5kIHRoZXJlIGFyZSBlbm91Z2ggb2YgdGhlbSBmb3Igc2VhcmNoXHJcblxyXG4gICAgICAgICAgICBpZiAoaW5pdGlhbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1pbiA9IHRoaXMub3B0cy5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaDtcclxuICAgICAgICAgICAgICAgIGlmIChtaW4gPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NlYXJjaChjb3VudFJlc3VsdHMoZGF0YS5yZXN1bHRzKSA+PSBtaW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgc2hvd1NlYXJjaDogZnVuY3Rpb24oc2hvd1NlYXJjaElucHV0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dTZWFyY2hJbnB1dCA9PT0gc2hvd1NlYXJjaElucHV0KSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNob3dTZWFyY2hJbnB1dCA9IHNob3dTZWFyY2hJbnB1dDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uZmluZChcIi5zZWxlY3QyLXNlYXJjaFwiKS50b2dnbGVDbGFzcyhcInNlbGVjdDItc2VhcmNoLWhpZGRlblwiLCAhc2hvd1NlYXJjaElucHV0KTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5maW5kKFwiLnNlbGVjdDItc2VhcmNoXCIpLnRvZ2dsZUNsYXNzKFwic2VsZWN0Mi1vZmZzY3JlZW5cIiwgIXNob3dTZWFyY2hJbnB1dCk7XHJcbiAgICAgICAgICAgIC8vYWRkIFwic2VsZWN0Mi13aXRoLXNlYXJjaGJveFwiIHRvIHRoZSBjb250YWluZXIgaWYgc2VhcmNoIGJveCBpcyBzaG93blxyXG4gICAgICAgICAgICAkKHRoaXMuZHJvcGRvd24sIHRoaXMuY29udGFpbmVyKS50b2dnbGVDbGFzcyhcInNlbGVjdDItd2l0aC1zZWFyY2hib3hcIiwgc2hvd1NlYXJjaElucHV0KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gKGRhdGEsIG9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy50cmlnZ2VyU2VsZWN0KGRhdGEpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgdmFyIG9sZCA9IHRoaXMub3B0cy5lbGVtZW50LnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgb2xkRGF0YSA9IHRoaXMuZGF0YSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudmFsKHRoaXMuaWQoZGF0YSkpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihkYXRhKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoeyB0eXBlOiBcInNlbGVjdDItc2VsZWN0ZWRcIiwgdmFsOiB0aGlzLmlkKGRhdGEpLCBjaG9pY2U6IGRhdGEgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5leHRTZWFyY2hUZXJtID0gdGhpcy5vcHRzLm5leHRTZWFyY2hUZXJtKGRhdGEsIHRoaXMuc2VhcmNoLnZhbCgpKTtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm5vRm9jdXMpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFlcXVhbChvbGQsIHRoaXMuaWQoZGF0YSkpKSB7IHRoaXMudHJpZ2dlckNoYW5nZSh7YWRkZWQ6ZGF0YSxyZW1vdmVkOm9sZERhdGF9KTsgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIHVwZGF0ZVNlbGVjdGlvbjogZnVuY3Rpb24gKGRhdGEpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXI9dGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLWNob3NlblwiKSwgZm9ybWF0dGVkLCBjc3NDbGFzcztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRhdGEoXCJzZWxlY3QyLWRhdGFcIiwgZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBjb250YWluZXIuZW1wdHkoKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdHRlZD10aGlzLm9wdHMuZm9ybWF0U2VsZWN0aW9uKGRhdGEsIGNvbnRhaW5lciwgdGhpcy5vcHRzLmVzY2FwZU1hcmt1cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGZvcm1hdHRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kKGZvcm1hdHRlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3NzQ2xhc3M9dGhpcy5vcHRzLmZvcm1hdFNlbGVjdGlvbkNzc0NsYXNzKGRhdGEsIGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmIChjc3NDbGFzcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkQ2xhc3MoY3NzQ2xhc3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZW1vdmVDbGFzcyhcInNlbGVjdDItZGVmYXVsdFwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYWxsb3dDbGVhciAmJiB0aGlzLmdldFBsYWNlaG9sZGVyKCkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWFsbG93Y2xlYXJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICB2YWw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHZhbCxcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJDaGFuZ2UgPSBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGEgPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgc2VsZiA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBvbGREYXRhID0gdGhpcy5kYXRhKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0cy5lbGVtZW50LnZhbCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YWwgPSBhcmd1bWVudHNbMF07XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJDaGFuZ2UgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAudmFsKHZhbClcclxuICAgICAgICAgICAgICAgICAgICAuZmluZChcIjpzZWxlY3RlZFwiKS5lYWNoMihmdW5jdGlvbiAoaSwgZWxtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLm9wdGlvblRvRGF0YShlbG0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHthZGRlZDogZGF0YSwgcmVtb3ZlZDpvbGREYXRhfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB2YWwgaXMgYW4gaWQuICF2YWwgaXMgdHJ1ZSBmb3IgW3VuZGVmaW5lZCxudWxsLCcnLDBdIC0gMCBpcyBsZWdhbFxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWwgJiYgdmFsICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhcih0cmlnZ2VyQ2hhbmdlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLmluaXRTZWxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbm5vdCBjYWxsIHZhbCgpIGlmIGluaXRTZWxlY3Rpb24oKSBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnZhbCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmluaXRTZWxlY3Rpb24odGhpcy5vcHRzLmVsZW1lbnQsIGZ1bmN0aW9uKGRhdGEpe1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYub3B0cy5lbGVtZW50LnZhbCghZGF0YSA/IFwiXCIgOiBzZWxmLmlkKGRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVNlbGVjdGlvbihkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyQ2hhbmdlKHthZGRlZDogZGF0YSwgcmVtb3ZlZDpvbGREYXRhfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBjbGVhclNlYXJjaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwoXCJcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIudmFsKFwiXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGRhdGE6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhLFxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLnNlbGVjdGlvbi5kYXRhKFwic2VsZWN0Mi1kYXRhXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gdW5kZWZpbmVkKSBkYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZSA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKHRyaWdnZXJDaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudmFsKCF2YWx1ZSA/IFwiXCIgOiB0aGlzLmlkKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh7YWRkZWQ6IHZhbHVlLCByZW1vdmVkOmRhdGF9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBNdWx0aVNlbGVjdDIgPSBjbGF6eihBYnN0cmFjdFNlbGVjdDIsIHtcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjcmVhdGVDb250YWluZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuYXR0cih7XHJcbiAgICAgICAgICAgICAgICBcImNsYXNzXCI6IFwic2VsZWN0Mi1jb250YWluZXIgc2VsZWN0Mi1jb250YWluZXItbXVsdGlcIlxyXG4gICAgICAgICAgICB9KS5odG1sKFtcclxuICAgICAgICAgICAgICAgIFwiPHVsIGNsYXNzPSdzZWxlY3QyLWNob2ljZXMnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgIDxsaSBjbGFzcz0nc2VsZWN0Mi1zZWFyY2gtZmllbGQnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICAgPGlucHV0IHR5cGU9J3RleHQnIGF1dG9jb21wbGV0ZT0nb2ZmJyBhdXRvY29ycmVjdD0nb2ZmJyBhdXRvY2FwaXRhbGl6ZT0nb2ZmJyBzcGVsbGNoZWNrPSdmYWxzZScgY2xhc3M9J3NlbGVjdDItaW5wdXQnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgIDwvbGk+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjwvdWw+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjxkaXYgY2xhc3M9J3NlbGVjdDItZHJvcCBzZWxlY3QyLWRyb3AtbXVsdGkgc2VsZWN0Mi1kaXNwbGF5LW5vbmUnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8dWwgY2xhc3M9J3NlbGVjdDItcmVzdWx0cyc+XCIsXHJcbiAgICAgICAgICAgICAgICBcIiAgIDwvdWw+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjwvZGl2PlwiXS5qb2luKFwiXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHByZXBhcmVPcHRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBvcHRzID0gdGhpcy5wYXJlbnQucHJlcGFyZU9wdHMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcclxuICAgICAgICAgICAgICAgIHNlbGY9dGhpcztcclxuXHJcbiAgICAgICAgICAgIC8vIFRPRE8gdmFsaWRhdGUgcGxhY2Vob2xkZXIgaXMgYSBzdHJpbmcgaWYgc3BlY2lmaWVkXHJcblxyXG4gICAgICAgICAgICBpZiAob3B0cy5lbGVtZW50LmdldCgwKS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2VsZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIGluc3RhbGwgc3RoZSBzZWxlY3Rpb24gaW5pdGlhbGl6ZXJcclxuICAgICAgICAgICAgICAgIG9wdHMuaW5pdFNlbGVjdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBjYWxsYmFjaykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbmQoXCI6c2VsZWN0ZWRcIikuZWFjaDIoZnVuY3Rpb24gKGksIGVsbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goc2VsZi5vcHRpb25Ub0RhdGEoZWxtKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwiZGF0YVwiIGluIG9wdHMpIHtcclxuICAgICAgICAgICAgICAgIC8vIGluc3RhbGwgZGVmYXVsdCBpbml0U2VsZWN0aW9uIHdoZW4gYXBwbGllZCB0byBoaWRkZW4gaW5wdXQgYW5kIGRhdGEgaXMgbG9jYWxcclxuICAgICAgICAgICAgICAgIG9wdHMuaW5pdFNlbGVjdGlvbiA9IG9wdHMuaW5pdFNlbGVjdGlvbiB8fCBmdW5jdGlvbiAoZWxlbWVudCwgY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWRzID0gc3BsaXRWYWwoZWxlbWVudC52YWwoKSwgb3B0cy5zZXBhcmF0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VhcmNoIGluIGRhdGEgYnkgYXJyYXkgb2YgaWRzLCBzdG9yaW5nIG1hdGNoaW5nIGl0ZW1zIGluIGEgbGlzdFxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXI6IGZ1bmN0aW9uKHRlcm0sIHRleHQsIGVsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc19tYXRjaCA9ICQuZ3JlcChpZHMsIGZ1bmN0aW9uKGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxdWFsKGlkLCBvcHRzLmlkKGVsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfbWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzX21hdGNoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogISQuaXNGdW5jdGlvbihjYWxsYmFjaykgPyAkLm5vb3AgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlb3JkZXIgbWF0Y2hlcyBiYXNlZCBvbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIGlkcyBhcnJheSBiZWNhdXNlIHJpZ2h0IG5vd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIGRhdGEgYXJyYXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlcmVkID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGlkc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hdGNoZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hlc1tqXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVxdWFsKGlkLCBvcHRzLmlkKG1hdGNoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQucHVzaChtYXRjaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnNwbGljZShqLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sob3JkZXJlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvcHRzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNlbGVjdENob2ljZTogZnVuY3Rpb24gKGNob2ljZSkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5jb250YWluZXIuZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIik7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggJiYgY2hvaWNlICYmIGNob2ljZVswXSA9PSBzZWxlY3RlZFswXSkge1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKFwiY2hvaWNlLWRlc2VsZWN0ZWRcIiwgc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hvaWNlICYmIGNob2ljZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hvaWNlLmFkZENsYXNzKFwic2VsZWN0Mi1zZWFyY2gtY2hvaWNlLWZvY3VzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoXCJjaG9pY2Utc2VsZWN0ZWRcIiwgY2hvaWNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICQoXCJsYWJlbFtmb3I9J1wiICsgdGhpcy5zZWFyY2guYXR0cignaWQnKSArIFwiJ11cIilcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCB0aGlzLm9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIikpO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBpbml0Q29udGFpbmVyOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBcIi5zZWxlY3QyLWNob2ljZXNcIiwgc2VsZWN0aW9uO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWZpZWxkXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbiA9IHRoaXMuY29udGFpbmVyLmZpbmQoc2VsZWN0b3IpO1xyXG5cclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ub24oXCJjbGlja1wiLCBcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2VcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIC8va2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2VhcmNoWzBdLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5zZWxlY3RDaG9pY2UoJCh0aGlzKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gcmV3cml0ZSBsYWJlbHMgZnJvbSBvcmlnaW5hbCBlbGVtZW50IHRvIGZvY3Vzc2VyXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLmF0dHIoXCJpZFwiLCBcInMyaWRfYXV0b2dlblwiK25leHRVaWQoKSk7XHJcbiAgICAgICAgICAgICQoXCJsYWJlbFtmb3I9J1wiICsgdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpICsgXCInXVwiKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2ZvcicsIHRoaXMuc2VhcmNoLmF0dHIoJ2lkJykpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gub24oXCJpbnB1dCBwYXN0ZVwiLCB0aGlzLmJpbmQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5hdHRyKFwidGFiaW5kZXhcIiwgdGhpcy5lbGVtZW50VGFiSW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5rZXlkb3ducyA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLm9uKFwia2V5ZG93blwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICsrdGhpcy5rZXlkb3ducztcclxuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZS1mb2N1c1wiKTtcclxuICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gc2VsZWN0ZWQucHJldihcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2U6bm90KC5zZWxlY3QyLWxvY2tlZClcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IHNlbGVjdGVkLm5leHQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlOm5vdCguc2VsZWN0Mi1sb2NrZWQpXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IGdldEN1cnNvckluZm8odGhpcy5zZWFyY2gpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggJiZcclxuICAgICAgICAgICAgICAgICAgICAoZS53aGljaCA9PSBLRVkuTEVGVCB8fCBlLndoaWNoID09IEtFWS5SSUdIVCB8fCBlLndoaWNoID09IEtFWS5CQUNLU1BBQ0UgfHwgZS53aGljaCA9PSBLRVkuREVMRVRFIHx8IGUud2hpY2ggPT0gS0VZLkVOVEVSKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZENob2ljZSA9IHNlbGVjdGVkO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09IEtFWS5MRUZUICYmIHByZXYubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hvaWNlID0gcHJldjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZS53aGljaCA9PSBLRVkuUklHSFQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBuZXh0Lmxlbmd0aCA/IG5leHQgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlLndoaWNoID09PSBLRVkuQkFDS1NQQUNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3Qoc2VsZWN0ZWQuZmlyc3QoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKDEwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBwcmV2Lmxlbmd0aCA/IHByZXYgOiBuZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS53aGljaCA9PSBLRVkuREVMRVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3Qoc2VsZWN0ZWQuZmlyc3QoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKDEwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBuZXh0Lmxlbmd0aCA/IG5leHQgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS53aGljaCA9PSBLRVkuRU5URVIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDaG9pY2Uoc2VsZWN0ZWRDaG9pY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkQ2hvaWNlIHx8ICFzZWxlY3RlZENob2ljZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKChlLndoaWNoID09PSBLRVkuQkFDS1NQQUNFICYmIHRoaXMua2V5ZG93bnMgPT0gMSlcclxuICAgICAgICAgICAgICAgICAgICB8fCBlLndoaWNoID09IEtFWS5MRUZUKSAmJiAocG9zLm9mZnNldCA9PSAwICYmICFwb3MubGVuZ3RoKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENob2ljZShzZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2U6bm90KC5zZWxlY3QyLWxvY2tlZClcIikubGFzdCgpKTtcclxuICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENob2ljZShudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS53aGljaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLlVQOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkRPV046XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZUhpZ2hsaWdodCgoZS53aGljaCA9PT0gS0VZLlVQKSA/IC0xIDogMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkVOVEVSOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLlRBQjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2VsZWN0T25CbHVyID09IHRydWUsIHNlbGVjdCB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLnNlbGVjdE9uQmx1cikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RIaWdobGlnaHRlZCh7bm9Gb2N1czp0cnVlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuRVNDOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSBLRVkuVEFCIHx8IEtFWS5pc0NvbnRyb2woZSkgfHwgS0VZLmlzRnVuY3Rpb25LZXkoZSlcclxuICAgICAgICAgICAgICAgICB8fCBlLndoaWNoID09PSBLRVkuQkFDS1NQQUNFIHx8IGUud2hpY2ggPT09IEtFWS5FU0MpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IEtFWS5FTlRFUikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMub3Blbk9uRW50ZXIgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuYWx0S2V5IHx8IGUuY3RybEtleSB8fCBlLnNoaWZ0S2V5IHx8IGUubWV0YUtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSBLRVkuUEFHRV9VUCB8fCBlLndoaWNoID09PSBLRVkuUEFHRV9ET1dOKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCB0aGUgcGFnZSBmcm9tIHNjcm9sbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gS0VZLkVOVEVSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBmb3JtIGZyb20gYmVpbmcgc3VibWl0dGVkXHJcbiAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gub24oXCJrZXl1cFwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMua2V5ZG93bnMgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVTZWFyY2goKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLm9uKFwiYmx1clwiLCB0aGlzLmJpbmQoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5yZW1vdmVDbGFzcyhcInNlbGVjdDItZm9jdXNlZFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2hvaWNlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1ibHVyXCIpKTtcclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIub24oXCJjbGlja1wiLCBzZWxlY3RvciwgdGhpcy5iaW5kKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGlmICgkKGUudGFyZ2V0KS5jbG9zZXN0KFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2tlZCBpbnNpZGUgYSBzZWxlY3QyIHNlYXJjaCBjaG9pY2UsIGRvIG5vdCBvcGVuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDaG9pY2UobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyUGxhY2Vob2xkZXIoKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250YWluZXIuaGFzQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKCQuRXZlbnQoXCJzZWxlY3QyLWZvY3VzXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c1NlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5vbihcImZvY3VzXCIsIHNlbGVjdG9yLCB0aGlzLmJpbmQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1mb2N1c1wiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRhaW5lcldpZHRoKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LmFkZENsYXNzKFwic2VsZWN0Mi1vZmZzY3JlZW5cIik7XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIHBsYWNlaG9sZGVyIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBlbmFibGVJbnRlcmZhY2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQuZW5hYmxlSW50ZXJmYWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnByb3AoXCJkaXNhYmxlZFwiLCAhdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGluaXRTZWxlY3Rpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZWxlbWVudC52YWwoKSA9PT0gXCJcIiAmJiB0aGlzLm9wdHMuZWxlbWVudC50ZXh0KCkgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKFtdKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgcGxhY2Vob2xkZXIgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0IHx8IHRoaXMub3B0cy5lbGVtZW50LnZhbCgpICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuaW5pdFNlbGVjdGlvbi5jYWxsKG51bGwsIHRoaXMub3B0cy5lbGVtZW50LCBmdW5jdGlvbihkYXRhKXtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVTZWxlY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBwbGFjZWhvbGRlciBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjbGVhclNlYXJjaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyKCksXHJcbiAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IHRoaXMuZ2V0TWF4U2VhcmNoV2lkdGgoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkICAmJiB0aGlzLmdldFZhbCgpLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnNlYXJjaC5oYXNDbGFzcyhcInNlbGVjdDItZm9jdXNlZFwiKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnZhbChwbGFjZWhvbGRlcikuYWRkQ2xhc3MoXCJzZWxlY3QyLWRlZmF1bHRcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBzdHJldGNoIHRoZSBzZWFyY2ggYm94IHRvIGZ1bGwgd2lkdGggb2YgdGhlIGNvbnRhaW5lciBzbyBhcyBtdWNoIG9mIHRoZSBwbGFjZWhvbGRlciBpcyB2aXNpYmxlIGFzIHBvc3NpYmxlXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBjb3VsZCBjYWxsIHRoaXMucmVzaXplU2VhcmNoKCksIGJ1dCB3ZSBkbyBub3QgYmVjYXVzZSB0aGF0IHJlcXVpcmVzIGEgc2l6ZXIgYW5kIHdlIGRvIG5vdCB3YW50IHRvIGNyZWF0ZSBvbmUgc28gZWFybHkgYmVjYXVzZSBvZiBhIGZpcmVmb3ggYnVnLCBzZWUgIzk0NFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gud2lkdGgobWF4V2lkdGggPiAwID8gbWF4V2lkdGggOiB0aGlzLmNvbnRhaW5lci5jc3MoXCJ3aWR0aFwiKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwoXCJcIikud2lkdGgoMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjbGVhclBsYWNlaG9sZGVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaC5oYXNDbGFzcyhcInNlbGVjdDItZGVmYXVsdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gudmFsKFwiXCIpLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1kZWZhdWx0XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBvcGVuaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJQbGFjZWhvbGRlcigpOyAvLyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgc3VwZXIgc28gcGxhY2Vob2xkZXIgaXMgbm90IHVzZWQgdG8gc2VhcmNoXHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplU2VhcmNoKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5vcGVuaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHModHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItb3BlblwiKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjbG9zZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMub3BlbmVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuY2xvc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGZvY3VzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2guZm9jdXMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGlzRm9jdXNlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2guaGFzQ2xhc3MoXCJzZWxlY3QyLWZvY3VzZWRcIik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICB1cGRhdGVTZWxlY3Rpb246IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciBpZHMgPSBbXSwgZmlsdGVyZWQgPSBbXSwgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXNcclxuICAgICAgICAgICAgJChkYXRhKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleE9mKHNlbGYuaWQodGhpcyksIGlkcykgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2goc2VsZi5pZCh0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQucHVzaCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRhdGEgPSBmaWx0ZXJlZDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZpbmQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKGRhdGEpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5hZGRTZWxlY3RlZENob2ljZSh0aGlzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHNlbGYucG9zdHByb2Nlc3NSZXN1bHRzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICB0b2tlbml6ZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IHRoaXMuc2VhcmNoLnZhbCgpO1xyXG4gICAgICAgICAgICBpbnB1dCA9IHRoaXMub3B0cy50b2tlbml6ZXIuY2FsbCh0aGlzLCBpbnB1dCwgdGhpcy5kYXRhKCksIHRoaXMuYmluZCh0aGlzLm9uU2VsZWN0KSwgdGhpcy5vcHRzKTtcclxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwoaW5wdXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykge1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyaWdnZXJTZWxlY3QoZGF0YSkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2hvaWNlKGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcih7IHR5cGU6IFwic2VsZWN0ZWRcIiwgdmFsOiB0aGlzLmlkKGRhdGEpLCBjaG9pY2U6IGRhdGEgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QgfHwgIXRoaXMub3B0cy5jbG9zZU9uU2VsZWN0KSB0aGlzLnBvc3Rwcm9jZXNzUmVzdWx0cyhkYXRhLCBmYWxzZSwgdGhpcy5vcHRzLmNsb3NlT25TZWxlY3Q9PT10cnVlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuY2xvc2VPblNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gud2lkdGgoMTApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY291bnRTZWxlY3RhYmxlUmVzdWx0cygpPjApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC53aWR0aCgxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemVTZWFyY2goKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRNYXhpbXVtU2VsZWN0aW9uU2l6ZSgpID4gMCAmJiB0aGlzLnZhbCgpLmxlbmd0aCA+PSB0aGlzLmdldE1heGltdW1TZWxlY3Rpb25TaXplKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgcmVhY2hlZCBtYXggc2VsZWN0aW9uIHNpemUgcmVwYWludCB0aGUgcmVzdWx0cyBzbyBjaG9pY2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBtYXggc2VsZWN0aW9uIHJlYWNoZWQgbWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHModHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25Ecm9wZG93bigpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIGxlZnQgdG8gc2VsZWN0IGNsb3NlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKDEwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc2luY2UgaXRzIG5vdCBwb3NzaWJsZSB0byBzZWxlY3QgYW4gZWxlbWVudCB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cclxuICAgICAgICAgICAgLy8gYWRkZWQgd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBpcyBhIG5ldyBlbGVtZW50IGJlZm9yZSBmaXJpbmcgY2hhbmdlXHJcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh7IGFkZGVkOiBkYXRhIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm5vRm9jdXMpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgYWRkU2VsZWN0ZWRDaG9pY2U6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciBlbmFibGVDaG9pY2UgPSAhZGF0YS5sb2NrZWQsXHJcbiAgICAgICAgICAgICAgICBlbmFibGVkSXRlbSA9ICQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8bGkgY2xhc3M9J3NlbGVjdDItc2VhcmNoLWNob2ljZSc+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiICAgIDxkaXY+PC9kaXY+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiICAgIDxhIGhyZWY9JyMnIG9uY2xpY2s9J3JldHVybiBmYWxzZTsnIGNsYXNzPSdzZWxlY3QyLXNlYXJjaC1jaG9pY2UtY2xvc2UnIHRhYmluZGV4PSctMSc+PC9hPlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIjwvbGk+XCIpLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWRJdGVtID0gJChcclxuICAgICAgICAgICAgICAgICAgICBcIjxsaSBjbGFzcz0nc2VsZWN0Mi1zZWFyY2gtY2hvaWNlIHNlbGVjdDItbG9ja2VkJz5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8ZGl2PjwvZGl2PlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICB2YXIgY2hvaWNlID0gZW5hYmxlQ2hvaWNlID8gZW5hYmxlZEl0ZW0gOiBkaXNhYmxlZEl0ZW0sXHJcbiAgICAgICAgICAgICAgICBpZCA9IHRoaXMuaWQoZGF0YSksXHJcbiAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLmdldFZhbCgpLFxyXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkLFxyXG4gICAgICAgICAgICAgICAgY3NzQ2xhc3M7XHJcblxyXG4gICAgICAgICAgICBmb3JtYXR0ZWQ9dGhpcy5vcHRzLmZvcm1hdFNlbGVjdGlvbihkYXRhLCBjaG9pY2UuZmluZChcImRpdlwiKSwgdGhpcy5vcHRzLmVzY2FwZU1hcmt1cCk7XHJcbiAgICAgICAgICAgIGlmIChmb3JtYXR0ZWQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjaG9pY2UuZmluZChcImRpdlwiKS5yZXBsYWNlV2l0aChcIjxkaXY+XCIrZm9ybWF0dGVkK1wiPC9kaXY+XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNzc0NsYXNzPXRoaXMub3B0cy5mb3JtYXRTZWxlY3Rpb25Dc3NDbGFzcyhkYXRhLCBjaG9pY2UuZmluZChcImRpdlwiKSk7XHJcbiAgICAgICAgICAgIGlmIChjc3NDbGFzcyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNob2ljZS5hZGRDbGFzcyhjc3NDbGFzcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmKGVuYWJsZUNob2ljZSl7XHJcbiAgICAgICAgICAgICAgY2hvaWNlLmZpbmQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlLWNsb3NlXCIpXHJcbiAgICAgICAgICAgICAgICAgIC5vbihcIm1vdXNlZG93blwiLCBraWxsRXZlbnQpXHJcbiAgICAgICAgICAgICAgICAgIC5vbihcImNsaWNrIGRibGNsaWNrXCIsIHRoaXMuYmluZChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLmNsb3Nlc3QoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlXCIpLmZhZGVPdXQoJ2Zhc3QnLCB0aGlzLmJpbmQoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3QoJChlLnRhcmdldCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIikucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0pKS5kZXF1ZXVlKCk7XHJcbiAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICB9KSkub24oXCJmb2N1c1wiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hvaWNlLmRhdGEoXCJzZWxlY3QyLWRhdGFcIiwgZGF0YSk7XHJcbiAgICAgICAgICAgIGNob2ljZS5pbnNlcnRCZWZvcmUodGhpcy5zZWFyY2hDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgdmFsLnB1c2goaWQpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFZhbCh2YWwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgdW5zZWxlY3Q6IGZ1bmN0aW9uIChzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWwoKSxcclxuICAgICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgICBpbmRleDtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQuY2xvc2VzdChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2VcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBcIkludmFsaWQgYXJndW1lbnQ6IFwiICsgc2VsZWN0ZWQgKyBcIi4gTXVzdCBiZSAuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRhdGEgPSBzZWxlY3RlZC5kYXRhKFwic2VsZWN0Mi1kYXRhXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gd2hlbiB0aGUgJ3gnIGlzIGNsaWNrZWQgcmVhbGx5IGZhc3QgcmVwZWF0ZWRseSB0aGUgZXZlbnQgY2FuIGJlIHF1ZXVlZFxyXG4gICAgICAgICAgICAgICAgLy8gYW5kIGludm9rZWQgb24gYW4gZWxlbWVudCBhbHJlYWR5IHJlbW92ZWRcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaW5kZXggPSBpbmRleE9mKHRoaXMuaWQoZGF0YSksIHZhbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFsLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB0aGlzLnBvc3Rwcm9jZXNzUmVzdWx0cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlbGVjdGVkLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcih7IHR5cGU6IFwicmVtb3ZlZFwiLCB2YWw6IHRoaXMuaWQoZGF0YSksIGNob2ljZTogZGF0YSB9KTtcclxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHsgcmVtb3ZlZDogZGF0YSB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHBvc3Rwcm9jZXNzUmVzdWx0czogZnVuY3Rpb24gKGRhdGEsIGluaXRpYWwsIG5vSGlnaGxpZ2h0VXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbCgpLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlcyA9IHRoaXMucmVzdWx0cy5maW5kKFwiLnNlbGVjdDItcmVzdWx0XCIpLFxyXG4gICAgICAgICAgICAgICAgY29tcG91bmQgPSB0aGlzLnJlc3VsdHMuZmluZChcIi5zZWxlY3QyLXJlc3VsdC13aXRoLWNoaWxkcmVuXCIpLFxyXG4gICAgICAgICAgICAgICAgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBjaG9pY2VzLmVhY2gyKGZ1bmN0aW9uIChpLCBjaG9pY2UpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpZCA9IHNlbGYuaWQoY2hvaWNlLmRhdGEoXCJzZWxlY3QyLWRhdGFcIikpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4T2YoaWQsIHZhbCkgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNob2ljZS5hZGRDbGFzcyhcInNlbGVjdDItc2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBhbGwgY2hpbGRyZW4gb2YgdGhlIHNlbGVjdGVkIHBhcmVudCBhcyBzZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgIGNob2ljZS5maW5kKFwiLnNlbGVjdDItcmVzdWx0LXNlbGVjdGFibGVcIikuYWRkQ2xhc3MoXCJzZWxlY3QyLXNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbXBvdW5kLmVhY2gyKGZ1bmN0aW9uKGksIGNob2ljZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaGlkZSBhbiBvcHRncm91cCBpZiBpdCBkb2VzbnQgaGF2ZSBhbnkgc2VsZWN0YWJsZSBjaGlsZHJlblxyXG4gICAgICAgICAgICAgICAgaWYgKCFjaG9pY2UuaXMoJy5zZWxlY3QyLXJlc3VsdC1zZWxlY3RhYmxlJylcclxuICAgICAgICAgICAgICAgICAgICAmJiBjaG9pY2UuZmluZChcIi5zZWxlY3QyLXJlc3VsdC1zZWxlY3RhYmxlOm5vdCguc2VsZWN0Mi1zZWxlY3RlZClcIikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hvaWNlLmFkZENsYXNzKFwic2VsZWN0Mi1zZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHQoKSA9PSAtMSAmJiBub0hpZ2hsaWdodFVwZGF0ZSAhPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgc2VsZi5oaWdobGlnaHQoMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSWYgYWxsIHJlc3VsdHMgYXJlIGNob3NlbiByZW5kZXIgZm9ybWF0Tm9NQXRjaGVzXHJcbiAgICAgICAgICAgIGlmKCF0aGlzLm9wdHMuY3JlYXRlU2VhcmNoQ2hvaWNlICYmICFjaG9pY2VzLmZpbHRlcignLnNlbGVjdDItcmVzdWx0Om5vdCguc2VsZWN0Mi1zZWxlY3RlZCknKS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIGlmKCFkYXRhIHx8IGRhdGEgJiYgIWRhdGEubW9yZSAmJiB0aGlzLnJlc3VsdHMuZmluZChcIi5zZWxlY3QyLW5vLXJlc3VsdHNcIikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9ybWF0dGVyKHNlbGYub3B0cy5mb3JtYXROb01hdGNoZXMsIFwiZm9ybWF0Tm9NYXRjaGVzXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5hcHBlbmQoXCI8bGkgY2xhc3M9J3NlbGVjdDItbm8tcmVzdWx0cyc+XCIgKyBzZWxmLm9wdHMuZm9ybWF0Tm9NYXRjaGVzKHNlbGYuc2VhcmNoLnZhbCgpKSArIFwiPC9saT5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgZ2V0TWF4U2VhcmNoV2lkdGg6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24ud2lkdGgoKSAtIGdldFNpZGVCb3JkZXJQYWRkaW5nKHRoaXMuc2VhcmNoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHJlc2l6ZVNlYXJjaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbWluaW11bVdpZHRoLCBsZWZ0LCBtYXhXaWR0aCwgY29udGFpbmVyTGVmdCwgc2VhcmNoV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBzaWRlQm9yZGVyUGFkZGluZyA9IGdldFNpZGVCb3JkZXJQYWRkaW5nKHRoaXMuc2VhcmNoKTtcclxuXHJcbiAgICAgICAgICAgIG1pbmltdW1XaWR0aCA9IG1lYXN1cmVUZXh0V2lkdGgodGhpcy5zZWFyY2gpICsgMTA7XHJcblxyXG4gICAgICAgICAgICBsZWZ0ID0gdGhpcy5zZWFyY2gub2Zmc2V0KCkubGVmdDtcclxuXHJcbiAgICAgICAgICAgIG1heFdpZHRoID0gdGhpcy5zZWxlY3Rpb24ud2lkdGgoKTtcclxuICAgICAgICAgICAgY29udGFpbmVyTGVmdCA9IHRoaXMuc2VsZWN0aW9uLm9mZnNldCgpLmxlZnQ7XHJcblxyXG4gICAgICAgICAgICBzZWFyY2hXaWR0aCA9IG1heFdpZHRoIC0gKGxlZnQgLSBjb250YWluZXJMZWZ0KSAtIHNpZGVCb3JkZXJQYWRkaW5nO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlYXJjaFdpZHRoIDwgbWluaW11bVdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBzZWFyY2hXaWR0aCA9IG1heFdpZHRoIC0gc2lkZUJvcmRlclBhZGRpbmc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hXaWR0aCA8IDQwKSB7XHJcbiAgICAgICAgICAgICAgICBzZWFyY2hXaWR0aCA9IG1heFdpZHRoIC0gc2lkZUJvcmRlclBhZGRpbmc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hXaWR0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgc2VhcmNoV2lkdGggPSBtaW5pbXVtV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKHNlYXJjaFdpZHRoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGdldFZhbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuc2VsZWN0LnZhbCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCA/IFtdIDogdmFsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFsID0gdGhpcy5vcHRzLmVsZW1lbnQudmFsKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3BsaXRWYWwodmFsLCB0aGlzLm9wdHMuc2VwYXJhdG9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgc2V0VmFsOiBmdW5jdGlvbiAodmFsKSB7XHJcbiAgICAgICAgICAgIHZhciB1bmlxdWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QudmFsKHZhbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1bmlxdWUgPSBbXTtcclxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgZHVwbGljYXRlc1xyXG4gICAgICAgICAgICAgICAgJCh2YWwpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE9mKHRoaXMsIHVuaXF1ZSkgPCAwKSB1bmlxdWUucHVzaCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudmFsKHVuaXF1ZS5sZW5ndGggPT09IDAgPyBcIlwiIDogdW5pcXVlLmpvaW4odGhpcy5vcHRzLnNlcGFyYXRvcikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBidWlsZENoYW5nZURldGFpbHM6IGZ1bmN0aW9uIChvbGQsIGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50LnNsaWNlKDApLFxyXG4gICAgICAgICAgICAgICAgb2xkID0gb2xkLnNsaWNlKDApO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVtb3ZlIGludGVyc2VjdGlvbiBmcm9tIGVhY2ggYXJyYXlcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9sZC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcXVhbCh0aGlzLm9wdHMuaWQoY3VycmVudFtpXSksIHRoaXMub3B0cy5pZChvbGRbal0pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaS0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbGQuc3BsaWNlKGosIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqLS07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge2FkZGVkOiBjdXJyZW50LCByZW1vdmVkOiBvbGR9O1xyXG4gICAgICAgIH0sXHJcblxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHZhbDogZnVuY3Rpb24gKHZhbCwgdHJpZ2dlckNoYW5nZSkge1xyXG4gICAgICAgICAgICB2YXIgb2xkRGF0YSwgc2VsZj10aGlzLCBjaGFuZ2VEZXRhaWxzO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvbGREYXRhPXRoaXMuZGF0YSgpO1xyXG4gICAgICAgICAgICBpZiAoIW9sZERhdGEubGVuZ3RoKSBvbGREYXRhPVtdO1xyXG5cclxuICAgICAgICAgICAgLy8gdmFsIGlzIGFuIGlkLiAhdmFsIGlzIHRydWUgZm9yIFt1bmRlZmluZWQsbnVsbCwnJywwXSAtIDAgaXMgbGVnYWxcclxuICAgICAgICAgICAgaWYgKCF2YWwgJiYgdmFsICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC52YWwoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh7YWRkZWQ6IHRoaXMuZGF0YSgpLCByZW1vdmVkOiBvbGREYXRhfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHZhbCBpcyBhIGxpc3Qgb2YgaWRzXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsKHZhbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5pbml0U2VsZWN0aW9uKHRoaXMuc2VsZWN0LCB0aGlzLmJpbmQodGhpcy51cGRhdGVTZWxlY3Rpb24pKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHRoaXMuYnVpbGRDaGFuZ2VEZXRhaWxzKG9sZERhdGEsIHRoaXMuZGF0YSgpKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLmluaXRTZWxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZhbCgpIGNhbm5vdCBiZSBjYWxsZWQgaWYgaW5pdFNlbGVjdGlvbigpIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5pbml0U2VsZWN0aW9uKHRoaXMub3B0cy5lbGVtZW50LCBmdW5jdGlvbihkYXRhKXtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWRzPSQubWFwKGRhdGEsIHNlbGYuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsKGlkcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVTZWxlY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlckNoYW5nZShzZWxmLmJ1aWxkQ2hhbmdlRGV0YWlscyhvbGREYXRhLCB0aGlzLmRhdGEoKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIG9uU29ydFN0YXJ0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb3J0aW5nIG9mIGVsZW1lbnRzIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBhdHRhY2hlZCB0byA8c2VsZWN0Pi4gQXR0YWNoIHRvIDxpbnB1dCB0eXBlPSdoaWRkZW4nLz4gaW5zdGVhZC5cIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNvbGxhcHNlIHNlYXJjaCBmaWVsZCBpbnRvIDAgd2lkdGggc28gaXRzIGNvbnRhaW5lciBjYW4gYmUgY29sbGFwc2VkIGFzIHdlbGxcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gud2lkdGgoMCk7XHJcbiAgICAgICAgICAgIC8vIGhpZGUgdGhlIGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaENvbnRhaW5lci5oaWRlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBvblNvcnRFbmQ6ZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgdmFsPVtdLCBzZWxmPXRoaXM7XHJcblxyXG4gICAgICAgICAgICAvLyBzaG93IHNlYXJjaCBhbmQgbW92ZSBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoQ29udGFpbmVyLnNob3coKTtcclxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBzZWFyY2ggY29udGFpbmVyIGlzIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGxpc3RcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hDb250YWluZXIuYXBwZW5kVG8odGhpcy5zZWFyY2hDb250YWluZXIucGFyZW50KCkpO1xyXG4gICAgICAgICAgICAvLyBzaW5jZSB3ZSBjb2xsYXBzZWQgdGhlIHdpZHRoIGluIGRyYWdTdGFydGVkLCB3ZSByZXNpemUgaXQgaGVyZVxyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNlYXJjaCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHNlbGVjdGlvblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiKS5lYWNoKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgdmFsLnB1c2goc2VsZi5vcHRzLmlkKCQodGhpcykuZGF0YShcInNlbGVjdDItZGF0YVwiKSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWwodmFsKTtcclxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBkYXRhOiBmdW5jdGlvbih2YWx1ZXMsIHRyaWdnZXJDaGFuZ2UpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGY9dGhpcywgaWRzLCBvbGQ7XHJcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgIC5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gJCh0aGlzKS5kYXRhKFwic2VsZWN0Mi1kYXRhXCIpOyB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAuZ2V0KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvbGQgPSB0aGlzLmRhdGEoKTtcclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWVzKSB7IHZhbHVlcyA9IFtdOyB9XHJcbiAgICAgICAgICAgICAgICBpZHMgPSAkLm1hcCh2YWx1ZXMsIGZ1bmN0aW9uKGUpIHsgcmV0dXJuIHNlbGYub3B0cy5pZChlKTsgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbChpZHMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odmFsdWVzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHRoaXMuYnVpbGRDaGFuZ2VEZXRhaWxzKG9sZCwgdGhpcy5kYXRhKCkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgICQuZm4uc2VsZWN0MiA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApLFxyXG4gICAgICAgICAgICBvcHRzLFxyXG4gICAgICAgICAgICBzZWxlY3QyLFxyXG4gICAgICAgICAgICBtZXRob2QsIHZhbHVlLCBtdWx0aXBsZSxcclxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHMgPSBbXCJ2YWxcIiwgXCJkZXN0cm95XCIsIFwib3BlbmVkXCIsIFwib3BlblwiLCBcImNsb3NlXCIsIFwiZm9jdXNcIiwgXCJpc0ZvY3VzZWRcIiwgXCJjb250YWluZXJcIiwgXCJkcm9wZG93blwiLCBcIm9uU29ydFN0YXJ0XCIsIFwib25Tb3J0RW5kXCIsIFwiZW5hYmxlXCIsIFwiZGlzYWJsZVwiLCBcInJlYWRvbmx5XCIsIFwicG9zaXRpb25Ecm9wZG93blwiLCBcImRhdGFcIiwgXCJzZWFyY2hcIl0sXHJcbiAgICAgICAgICAgIHZhbHVlTWV0aG9kcyA9IFtcIm9wZW5lZFwiLCBcImlzRm9jdXNlZFwiLCBcImNvbnRhaW5lclwiLCBcImRyb3Bkb3duXCJdLFxyXG4gICAgICAgICAgICBwcm9wZXJ0eU1ldGhvZHMgPSBbXCJ2YWxcIiwgXCJkYXRhXCJdLFxyXG4gICAgICAgICAgICBtZXRob2RzTWFwID0geyBzZWFyY2g6IFwiZXh0ZXJuYWxTZWFyY2hcIiB9O1xyXG5cclxuICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDAgfHwgdHlwZW9mKGFyZ3NbMF0pID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRzID0gYXJncy5sZW5ndGggPT09IDAgPyB7fSA6ICQuZXh0ZW5kKHt9LCBhcmdzWzBdKTtcclxuICAgICAgICAgICAgICAgIG9wdHMuZWxlbWVudCA9ICQodGhpcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuZWxlbWVudC5nZXQoMCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgPSBvcHRzLmVsZW1lbnQucHJvcChcIm11bHRpcGxlXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSA9IG9wdHMubXVsdGlwbGUgfHwgZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwidGFnc1wiIGluIG9wdHMpIHtvcHRzLm11bHRpcGxlID0gbXVsdGlwbGUgPSB0cnVlO31cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QyID0gbXVsdGlwbGUgPyBuZXcgTXVsdGlTZWxlY3QyKCkgOiBuZXcgU2luZ2xlU2VsZWN0MigpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0Mi5pbml0KG9wdHMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihhcmdzWzBdKSA9PT0gXCJzdHJpbmdcIikge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpbmRleE9mKGFyZ3NbMF0sIGFsbG93ZWRNZXRob2RzKSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBcIlVua25vd24gbWV0aG9kOiBcIiArIGFyZ3NbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3QyID0gJCh0aGlzKS5kYXRhKFwic2VsZWN0MlwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3QyID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q9YXJnc1swXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBcImNvbnRhaW5lclwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxlY3QyLmNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcImRyb3Bkb3duXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGVjdDIuZHJvcGRvd247XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2RzTWFwW21ldGhvZF0pIG1ldGhvZCA9IG1ldGhvZHNNYXBbbWV0aG9kXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxlY3QyW21ldGhvZF0uYXBwbHkoc2VsZWN0MiwgYXJncy5zbGljZSgxKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhPZihhcmdzWzBdLCB2YWx1ZU1ldGhvZHMpID49IDBcclxuICAgICAgICAgICAgICAgICAgICB8fCAoaW5kZXhPZihhcmdzWzBdLCBwcm9wZXJ0eU1ldGhvZHMpICYmIGFyZ3MubGVuZ3RoID09IDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhYm9ydCB0aGUgaXRlcmF0aW9uLCByZWFkeSB0byByZXR1cm4gZmlyc3QgbWF0Y2hlZCB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJJbnZhbGlkIGFyZ3VtZW50cyB0byBzZWxlY3QyIHBsdWdpbjogXCIgKyBhcmdzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IHRoaXMgOiB2YWx1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gcGx1Z2luIGRlZmF1bHRzLCBhY2Nlc3NpYmxlIHRvIHVzZXJzXHJcbiAgICAkLmZuLnNlbGVjdDIuZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgd2lkdGg6IFwiY29weVwiLFxyXG4gICAgICAgIGxvYWRNb3JlUGFkZGluZzogMCxcclxuICAgICAgICBjbG9zZU9uU2VsZWN0OiB0cnVlLFxyXG4gICAgICAgIG9wZW5PbkVudGVyOiB0cnVlLFxyXG4gICAgICAgIGNvbnRhaW5lckNzczoge30sXHJcbiAgICAgICAgZHJvcGRvd25Dc3M6IHt9LFxyXG4gICAgICAgIGNvbnRhaW5lckNzc0NsYXNzOiBcIlwiLFxyXG4gICAgICAgIGRyb3Bkb3duQ3NzQ2xhc3M6IFwiXCIsXHJcbiAgICAgICAgZm9ybWF0UmVzdWx0OiBmdW5jdGlvbihyZXN1bHQsIGNvbnRhaW5lciwgcXVlcnksIGVzY2FwZU1hcmt1cCkge1xyXG4gICAgICAgICAgICB2YXIgbWFya3VwPVtdO1xyXG4gICAgICAgICAgICBtYXJrTWF0Y2gocmVzdWx0LnRleHQsIHF1ZXJ5LnRlcm0sIG1hcmt1cCwgZXNjYXBlTWFya3VwKTtcclxuICAgICAgICAgICAgcmV0dXJuIG1hcmt1cC5qb2luKFwiXCIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZm9ybWF0U2VsZWN0aW9uOiBmdW5jdGlvbiAoZGF0YSwgY29udGFpbmVyLCBlc2NhcGVNYXJrdXApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEgPyBlc2NhcGVNYXJrdXAoZGF0YS50ZXh0KSA6IHVuZGVmaW5lZDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNvcnRSZXN1bHRzOiBmdW5jdGlvbiAocmVzdWx0cywgY29udGFpbmVyLCBxdWVyeSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZvcm1hdFJlc3VsdENzc0NsYXNzOiBmdW5jdGlvbihkYXRhKSB7cmV0dXJuIHVuZGVmaW5lZDt9LFxyXG4gICAgICAgIGZvcm1hdFNlbGVjdGlvbkNzc0NsYXNzOiBmdW5jdGlvbihkYXRhLCBjb250YWluZXIpIHtyZXR1cm4gdW5kZWZpbmVkO30sXHJcbiAgICAgICAgZm9ybWF0Tm9NYXRjaGVzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIk5vIG1hdGNoZXMgZm91bmRcIjsgfSxcclxuICAgICAgICBmb3JtYXRJbnB1dFRvb1Nob3J0OiBmdW5jdGlvbiAoaW5wdXQsIG1pbikgeyB2YXIgbiA9IG1pbiAtIGlucHV0Lmxlbmd0aDsgcmV0dXJuIFwiUGxlYXNlIGVudGVyIFwiICsgbiArIFwiIG1vcmUgY2hhcmFjdGVyXCIgKyAobiA9PSAxPyBcIlwiIDogXCJzXCIpOyB9LFxyXG4gICAgICAgIGZvcm1hdElucHV0VG9vTG9uZzogZnVuY3Rpb24gKGlucHV0LCBtYXgpIHsgdmFyIG4gPSBpbnB1dC5sZW5ndGggLSBtYXg7IHJldHVybiBcIlBsZWFzZSBkZWxldGUgXCIgKyBuICsgXCIgY2hhcmFjdGVyXCIgKyAobiA9PSAxPyBcIlwiIDogXCJzXCIpOyB9LFxyXG4gICAgICAgIGZvcm1hdFNlbGVjdGlvblRvb0JpZzogZnVuY3Rpb24gKGxpbWl0KSB7IHJldHVybiBcIllvdSBjYW4gb25seSBzZWxlY3QgXCIgKyBsaW1pdCArIFwiIGl0ZW1cIiArIChsaW1pdCA9PSAxID8gXCJcIiA6IFwic1wiKTsgfSxcclxuICAgICAgICBmb3JtYXRMb2FkTW9yZTogZnVuY3Rpb24gKHBhZ2VOdW1iZXIpIHsgcmV0dXJuIFwiTG9hZGluZyBtb3JlIHJlc3VsdHMuLi5cIjsgfSxcclxuICAgICAgICBmb3JtYXRTZWFyY2hpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiU2VhcmNoaW5nLi4uXCI7IH0sXHJcbiAgICAgICAgbWluaW11bVJlc3VsdHNGb3JTZWFyY2g6IDAsXHJcbiAgICAgICAgbWluaW11bUlucHV0TGVuZ3RoOiAwLFxyXG4gICAgICAgIG1heGltdW1JbnB1dExlbmd0aDogbnVsbCxcclxuICAgICAgICBtYXhpbXVtU2VsZWN0aW9uU2l6ZTogMCxcclxuICAgICAgICBpZDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaWQ7IH0sXHJcbiAgICAgICAgbWF0Y2hlcjogZnVuY3Rpb24odGVybSwgdGV4dCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc3RyaXBEaWFjcml0aWNzKCcnK3RleHQpLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihzdHJpcERpYWNyaXRpY3MoJycrdGVybSkudG9VcHBlckNhc2UoKSkgPj0gMDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNlcGFyYXRvcjogXCIsXCIsXHJcbiAgICAgICAgdG9rZW5TZXBhcmF0b3JzOiBbXSxcclxuICAgICAgICB0b2tlbml6ZXI6IGRlZmF1bHRUb2tlbml6ZXIsXHJcbiAgICAgICAgZXNjYXBlTWFya3VwOiBkZWZhdWx0RXNjYXBlTWFya3VwLFxyXG4gICAgICAgIGJsdXJPbkNoYW5nZTogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0T25CbHVyOiBmYWxzZSxcclxuICAgICAgICBhZGFwdENvbnRhaW5lckNzc0NsYXNzOiBmdW5jdGlvbihjKSB7IHJldHVybiBjOyB9LFxyXG4gICAgICAgIGFkYXB0RHJvcGRvd25Dc3NDbGFzczogZnVuY3Rpb24oYykgeyByZXR1cm4gbnVsbDsgfSxcclxuICAgICAgICBuZXh0U2VhcmNoVGVybTogZnVuY3Rpb24oc2VsZWN0ZWRPYmplY3QsIGN1cnJlbnRTZWFyY2hUZXJtKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cclxuICAgIH07XHJcblxyXG4gICAgJC5mbi5zZWxlY3QyLmFqYXhEZWZhdWx0cyA9IHtcclxuICAgICAgICB0cmFuc3BvcnQ6ICQuYWpheCxcclxuICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgICAgdHlwZTogXCJHRVRcIixcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogXCJqc29uXCJcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIGV4cG9ydHNcclxuICAgIHdpbmRvdy5TZWxlY3QyID0ge1xyXG4gICAgICAgIHF1ZXJ5OiB7XHJcbiAgICAgICAgICAgIGFqYXg6IGFqYXgsXHJcbiAgICAgICAgICAgIGxvY2FsOiBsb2NhbCxcclxuICAgICAgICAgICAgdGFnczogdGFnc1xyXG4gICAgICAgIH0sIHV0aWw6IHtcclxuICAgICAgICAgICAgZGVib3VuY2U6IGRlYm91bmNlLFxyXG4gICAgICAgICAgICBtYXJrTWF0Y2g6IG1hcmtNYXRjaCxcclxuICAgICAgICAgICAgZXNjYXBlTWFya3VwOiBkZWZhdWx0RXNjYXBlTWFya3VwLFxyXG4gICAgICAgICAgICBzdHJpcERpYWNyaXRpY3M6IHN0cmlwRGlhY3JpdGljc1xyXG4gICAgICAgIH0sIFwiY2xhc3NcIjoge1xyXG4gICAgICAgICAgICBcImFic3RyYWN0XCI6IEFic3RyYWN0U2VsZWN0MixcclxuICAgICAgICAgICAgXCJzaW5nbGVcIjogU2luZ2xlU2VsZWN0MixcclxuICAgICAgICAgICAgXCJtdWx0aVwiOiBNdWx0aVNlbGVjdDJcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxufShqUXVlcnkpKTtcclxuXHJcblxufSkuY2FsbChnbG9iYWwsIG1vZHVsZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuIl19
},{"jquery":109}],95:[function(require,module,exports){
(function (global){

; jQuery = global.jQuery = require("jquery");
; var __browserify_shim_require__=require;(function browserifyShim(module, define, require) {
/**
 * Super simple wysiwyg editor on Bootstrap v0.6.3
 * http://summernote.org/
 *
 * summernote.js
 * Copyright 2013-2015 Alan Hong. and other contributors
 * summernote may be freely distributed under the MIT license./
 *
 * Date: 2015-04-08T13:28Z
 */
(function (factory) {
	/* global define */
	if (typeof define === 'function' && define.amd) {
		// AMD. Register as an anonymous module.
		define(['jquery'], factory);
	} else {
		// Browser globals: jQuery
		factory(window.jQuery);
	}
}(function ($) {



	if (!Array.prototype.reduce) {
		/**
		 * Array.prototype.reduce polyfill
		 *
		 * @param {Function} callback
		 * @param {Value} [initialValue]
		 * @return {Value}
		 *
		 * @see http://goo.gl/WNriQD
		 */
		Array.prototype.reduce = function (callback) {
			var t = Object(this), len = t.length >>> 0, k = 0, value;
			if (arguments.length === 2) {
				value = arguments[1];
			} else {
				while (k < len && !(k in t)) {
					k++;
				}
				if (k >= len) {
					throw new TypeError('Reduce of empty array with no initial value');
				}
				value = t[k++];
			}
			for (; k < len; k++) {
				if (k in t) {
					value = callback(value, t[k], k, t);
				}
			}
			return value;
		};
	}

	if ('function' !== typeof Array.prototype.filter) {
		/**
		 * Array.prototype.filter polyfill
		 *
		 * @param {Function} func
		 * @return {Array}
		 *
		 * @see http://goo.gl/T1KFnq
		 */
		Array.prototype.filter = function (func) {
			var t = Object(this), len = t.length >>> 0;

			var res = [];
			var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
			for (var i = 0; i < len; i++) {
				if (i in t) {
					var val = t[i];
					if (func.call(thisArg, val, i, t)) {
						res.push(val);
					}
				}
			}

			return res;
		};
	}

	var isSupportAmd = typeof define === 'function' && define.amd;

	/**
	 * returns whether font is installed or not.
	 *
	 * @param {String} fontName
	 * @return {Boolean}
	 */
	var isFontInstalled = function (fontName) {
		var testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';
		var $tester = $('<div>').css({
			position: 'absolute',
			left: '-9999px',
			top: '-9999px',
			fontSize: '200px'
		}).text('mmmmmmmmmwwwwwww').appendTo(document.body);

		var originalWidth = $tester.css('fontFamily', testFontName).width();
		var width = $tester.css('fontFamily', fontName + ',' + testFontName).width();

		$tester.remove();

		return originalWidth !== width;
	};

	/**
	 * @class core.agent
	 *
	 * Object which check platform and agent
	 *
	 * @singleton
	 * @alternateClassName agent
	 */
	var agent = {
		/** @property {Boolean} [isMac=false] true if this agent is Mac  */
		isMac: navigator.appVersion.indexOf('Mac') > -1,
		/** @property {Boolean} [isMSIE=false] true if this agent is a Internet Explorer  */
		isMSIE: navigator.userAgent.indexOf('MSIE') > -1 || navigator.userAgent.indexOf('Trident') > -1,
		/** @property {Boolean} [isFF=false] true if this agent is a Firefox  */
		isFF: navigator.userAgent.indexOf('Firefox') > -1,
		/** @property {String} jqueryVersion current jQuery version string  */
		jqueryVersion: parseFloat($.fn.jquery),
		isSupportAmd: isSupportAmd,
		hasCodeMirror: isSupportAmd ? require.specified('CodeMirror') : !!window.CodeMirror,
		isFontInstalled: isFontInstalled,
		isW3CRangeSupport: !!document.createRange
	};

	/**
	 * @class core.func
	 *
	 * func utils (for high-order func's arg)
	 *
	 * @singleton
	 * @alternateClassName func
	 */
	var func = (function () {
		var eq = function (itemA) {
			return function (itemB) {
				return itemA === itemB;
			};
		};

		var eq2 = function (itemA, itemB) {
			return itemA === itemB;
		};

		var peq2 = function (propName) {
			return function (itemA, itemB) {
				return itemA[propName] === itemB[propName];
			};
		};

		var ok = function () {
			return true;
		};

		var fail = function () {
			return false;
		};

		var not = function (f) {
			return function () {
				return !f.apply(f, arguments);
			};
		};

		var and = function (fA, fB) {
			return function (item) {
				return fA(item) && fB(item);
			};
		};

		var self = function (a) {
			return a;
		};

		var idCounter = 0;

		/**
		 * generate a globally-unique id
		 *
		 * @param {String} [prefix]
		 */
		var uniqueId = function (prefix) {
			var id = ++idCounter + '';
			return prefix ? prefix + id : id;
		};

		/**
		 * returns bnd (bounds) from rect
		 *
		 * - IE Compatability Issue: http://goo.gl/sRLOAo
		 * - Scroll Issue: http://goo.gl/sNjUc
		 *
		 * @param {Rect} rect
		 * @return {Object} bounds
		 * @return {Number} bounds.top
		 * @return {Number} bounds.left
		 * @return {Number} bounds.width
		 * @return {Number} bounds.height
		 */
		var rect2bnd = function (rect) {
			var $document = $(document);
			return {
				top: rect.top + $document.scrollTop(),
				left: rect.left + $document.scrollLeft(),
				width: rect.right - rect.left,
				height: rect.bottom - rect.top
			};
		};

		/**
		 * returns a copy of the object where the keys have become the values and the values the keys.
		 * @param {Object} obj
		 * @return {Object}
		 */
		var invertObject = function (obj) {
			var inverted = {};
			for (var key in obj) {
				if (obj.hasOwnProperty(key)) {
					inverted[obj[key]] = key;
				}
			}
			return inverted;
		};

		return {
			eq: eq,
			eq2: eq2,
			peq2: peq2,
			ok: ok,
			fail: fail,
			self: self,
			not: not,
			and: and,
			uniqueId: uniqueId,
			rect2bnd: rect2bnd,
			invertObject: invertObject
		};
	})();

	/**
	 * @class core.list
	 *
	 * list utils
	 *
	 * @singleton
	 * @alternateClassName list
	 */
	var list = (function () {
		/**
		 * returns the first item of an array.
		 *
		 * @param {Array} array
		 */
		var head = function (array) {
			return array[0];
		};

		/**
		 * returns the last item of an array.
		 *
		 * @param {Array} array
		 */
		var last = function (array) {
			return array[array.length - 1];
		};

		/**
		 * returns everything but the last entry of the array.
		 *
		 * @param {Array} array
		 */
		var initial = function (array) {
			return array.slice(0, array.length - 1);
		};

		/**
		 * returns the rest of the items in an array.
		 *
		 * @param {Array} array
		 */
		var tail = function (array) {
			return array.slice(1);
		};

		/**
		 * returns item of array
		 */
		var find = function (array, pred) {
			for (var idx = 0, len = array.length; idx < len; idx++) {
				var item = array[idx];
				if (pred(item)) {
					return item;
				}
			}
		};

		/**
		 * returns true if all of the values in the array pass the predicate truth test.
		 */
		var all = function (array, pred) {
			for (var idx = 0, len = array.length; idx < len; idx++) {
				if (!pred(array[idx])) {
					return false;
				}
			}
			return true;
		};

		/**
		 * returns true if the value is present in the list.
		 */
		var contains = function (array, item) {
			return $.inArray(item, array) !== -1;
		};

		/**
		 * get sum from a list
		 *
		 * @param {Array} array - array
		 * @param {Function} fn - iterator
		 */
		var sum = function (array, fn) {
			fn = fn || func.self;
			return array.reduce(function (memo, v) {
				return memo + fn(v);
			}, 0);
		};

		/**
		 * returns a copy of the collection with array type.
		 * @param {Collection} collection - collection eg) node.childNodes, ...
		 */
		var from = function (collection) {
			var result = [], idx = -1, length = collection.length;
			while (++idx < length) {
				result[idx] = collection[idx];
			}
			return result;
		};

		/**
		 * cluster elements by predicate function.
		 *
		 * @param {Array} array - array
		 * @param {Function} fn - predicate function for cluster rule
		 * @param {Array[]}
		 */
		var clusterBy = function (array, fn) {
			if (!array.length) { return []; }
			var aTail = tail(array);
			return aTail.reduce(function (memo, v) {
				var aLast = last(memo);
				if (fn(last(aLast), v)) {
					aLast[aLast.length] = v;
				} else {
					memo[memo.length] = [v];
				}
				return memo;
			}, [[head(array)]]);
		};

		/**
		 * returns a copy of the array with all falsy values removed
		 *
		 * @param {Array} array - array
		 * @param {Function} fn - predicate function for cluster rule
		 */
		var compact = function (array) {
			var aResult = [];
			for (var idx = 0, len = array.length; idx < len; idx++) {
				if (array[idx]) { aResult.push(array[idx]); }
			}
			return aResult;
		};

		/**
		 * produces a duplicate-free version of the array
		 *
		 * @param {Array} array
		 */
		var unique = function (array) {
			var results = [];

			for (var idx = 0, len = array.length; idx < len; idx++) {
				if (!contains(results, array[idx])) {
					results.push(array[idx]);
				}
			}

			return results;
		};

		/**
		 * returns next item.
		 * @param {Array} array
		 */
		var next = function (array, item) {
			var idx = array.indexOf(item);
			if (idx === -1) { return null; }

			return array[idx + 1];
		};

		/**
		 * returns prev item.
		 * @param {Array} array
		 */
		var prev = function (array, item) {
			var idx = array.indexOf(item);
			if (idx === -1) { return null; }

			return array[idx - 1];
		};


		return {
			head: head, last: last, initial: initial, tail: tail,
			prev: prev, next: next, find: find, contains: contains,
			all: all, sum: sum, from: from,
			clusterBy: clusterBy, compact: compact, unique: unique
		};
	})();


	var NBSP_CHAR = String.fromCharCode(160);
	var ZERO_WIDTH_NBSP_CHAR = '\ufeff';

	/**
	 * @class core.dom
	 *
	 * Dom functions
	 *
	 * @singleton
	 * @alternateClassName dom
	 */
	var dom = (function () {
		/**
		 * @method isEditable
		 *
		 * returns whether node is `note-editable` or not.
		 *
		 * @param {Node} node
		 * @return {Boolean}
		 */
		var isEditable = function (node) {
			return node && $(node).hasClass('note-editable');
		};

		/**
		 * @method isControlSizing
		 *
		 * returns whether node is `note-control-sizing` or not.
		 *
		 * @param {Node} node
		 * @return {Boolean}
		 */
		var isControlSizing = function (node) {
			return node && $(node).hasClass('note-control-sizing');
		};

		/**
		 * @method  buildLayoutInfo
		 *
		 * build layoutInfo from $editor(.note-editor)
		 *
		 * @param {jQuery} $editor
		 * @return {Object}
		 * @return {Function} return.editor
		 * @return {Node} return.dropzone
		 * @return {Node} return.toolbar
		 * @return {Node} return.editable
		 * @return {Node} return.codable
		 * @return {Node} return.popover
		 * @return {Node} return.handle
		 * @return {Node} return.dialog
		 */
		var buildLayoutInfo = function ($editor) {
			var makeFinder;

			// air mode
			if ($editor.hasClass('note-air-editor')) {
				var id = list.last($editor.attr('id').split('-'));
				makeFinder = function (sIdPrefix) {
					return function () { return $(sIdPrefix + id); };
				};

				return {
					editor: function () { return $editor; },
					holder: function () { return $editor.data('holder'); },
					editable: function () { return $editor; },
					popover: makeFinder('#note-popover-'),
					handle: makeFinder('#note-handle-'),
					dialog: makeFinder('#note-dialog-')
				};

				// frame mode
			} else {
				makeFinder = function (sClassName) {
					return function () { return $editor.find(sClassName); };
				};
				return {
					editor: function () { return $editor; },
					holder: function () { return $editor.data('holder'); },
					dropzone: makeFinder('.note-dropzone'),
					toolbar: makeFinder('.note-toolbar'),
					editable: makeFinder('.note-editable'),
					codable: makeFinder('.note-codable'),
					statusbar: makeFinder('.note-statusbar'),
					popover: makeFinder('.note-popover'),
					handle: makeFinder('.note-handle'),
					dialog: makeFinder('.note-dialog')
				};
			}
		};

		/**
		 * returns makeLayoutInfo from editor's descendant node.
		 *
		 * @private
		 * @param {Node} descendant
		 * @return {Object}
		 */
		var makeLayoutInfo = function (descendant) {
			var $target = $(descendant).closest('.note-editor, .note-air-editor, .note-air-layout');

			if (!$target.length) {
				return null;
			}

			var $editor;
			if ($target.is('.note-editor, .note-air-editor')) {
				$editor = $target;
			} else {
				$editor = $('#note-editor-' + list.last($target.attr('id').split('-')));
			}

			return buildLayoutInfo($editor);
		};

		/**
		 * @method makePredByNodeName
		 *
		 * returns predicate which judge whether nodeName is same
		 *
		 * @param {String} nodeName
		 * @return {Function}
		 */
		var makePredByNodeName = function (nodeName) {
			nodeName = nodeName.toUpperCase();
			return function (node) {
				return node && node.nodeName.toUpperCase() === nodeName;
			};
		};

		/**
		 * @method isText
		 *
		 *
		 *
		 * @param {Node} node
		 * @return {Boolean} true if node's type is text(3)
		 */
		var isText = function (node) {
			return node && node.nodeType === 3;
		};

		/**
		 * ex) br, col, embed, hr, img, input, ...
		 * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements
		 */
		var isVoid = function (node) {
			return node && /^BR|^IMG|^HR/.test(node.nodeName.toUpperCase());
		};

		var isPara = function (node) {
			if (isEditable(node)) {
				return false;
			}

			// Chrome(v31.0), FF(v25.0.1) use DIV for paragraph
			return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());
		};

		var isLi = makePredByNodeName('LI');

		var isPurePara = function (node) {
			return isPara(node) && !isLi(node);
		};

		var isTable = makePredByNodeName('TABLE');

		var isInline = function (node) {
			return !isBodyContainer(node) &&
				   !isList(node) &&
				   !isPara(node) &&
				   !isTable(node) &&
				   !isBlockquote(node);
		};

		var isList = function (node) {
			return node && /^UL|^OL/.test(node.nodeName.toUpperCase());
		};

		var isCell = function (node) {
			return node && /^TD|^TH/.test(node.nodeName.toUpperCase());
		};

		var isBlockquote = makePredByNodeName('BLOCKQUOTE');

		var isBodyContainer = function (node) {
			return isCell(node) || isBlockquote(node) || isEditable(node);
		};

		var isAnchor = makePredByNodeName('A');

		var isParaInline = function (node) {
			return isInline(node) && !!ancestor(node, isPara);
		};

		var isBodyInline = function (node) {
			return isInline(node) && !ancestor(node, isPara);
		};

		var isBody = makePredByNodeName('BODY');

		/**
		 * returns whether nodeB is closest sibling of nodeA
		 *
		 * @param {Node} nodeA
		 * @param {Node} nodeB
		 * @return {Boolean}
		 */
		var isClosestSibling = function (nodeA, nodeB) {
			return nodeA.nextSibling === nodeB ||
				   nodeA.previousSibling === nodeB;
		};

		/**
		 * returns array of closest siblings with node
		 *
		 * @param {Node} node
		 * @param {function} [pred] - predicate function
		 * @return {Node[]}
		 */
		var withClosestSiblings = function (node, pred) {
			pred = pred || func.ok;

			var siblings = [];
			if (node.previousSibling && pred(node.previousSibling)) {
				siblings.push(node.previousSibling);
			}
			siblings.push(node);
			if (node.nextSibling && pred(node.nextSibling)) {
				siblings.push(node.nextSibling);
			}
			return siblings;
		};

		/**
		 * blank HTML for cursor position
		 */
		var blankHTML = agent.isMSIE ? '&nbsp;' : '<br>';

		/**
		 * @method nodeLength
		 *
		 * returns #text's text size or element's childNodes size
		 *
		 * @param {Node} node
		 */
		var nodeLength = function (node) {
			if (isText(node)) {
				return node.nodeValue.length;
			}

			return node.childNodes.length;
		};

		/**
		 * returns whether node is empty or not.
		 *
		 * @param {Node} node
		 * @return {Boolean}
		 */
		var isEmpty = function (node) {
			var len = nodeLength(node);

			if (len === 0) {
				return true;
			} else if (!dom.isText(node) && len === 1 && node.innerHTML === blankHTML) {
				// ex) <p><br></p>, <span><br></span>
				return true;
			}

			return false;
		};

		/**
		 * padding blankHTML if node is empty (for cursor position)
		 */
		var paddingBlankHTML = function (node) {
			if (!isVoid(node) && !nodeLength(node)) {
				node.innerHTML = blankHTML;
			}
		};

		/**
		 * find nearest ancestor predicate hit
		 *
		 * @param {Node} node
		 * @param {Function} pred - predicate function
		 */
		var ancestor = function (node, pred) {
			while (node) {
				if (pred(node)) { return node; }
				if (isEditable(node)) { break; }

				node = node.parentNode;
			}
			return null;
		};

		/**
		 * find nearest ancestor only single child blood line and predicate hit
		 *
		 * @param {Node} node
		 * @param {Function} pred - predicate function
		 */
		var singleChildAncestor = function (node, pred) {
			node = node.parentNode;

			while (node) {
				if (nodeLength(node) !== 1) { break; }
				if (pred(node)) { return node; }
				if (isEditable(node)) { break; }

				node = node.parentNode;
			}
			return null;
		};

		/**
		 * returns new array of ancestor nodes (until predicate hit).
		 *
		 * @param {Node} node
		 * @param {Function} [optional] pred - predicate function
		 */
		var listAncestor = function (node, pred) {
			pred = pred || func.fail;

			var ancestors = [];
			ancestor(node, function (el) {
				if (!isEditable(el)) {
					ancestors.push(el);
				}

				return pred(el);
			});
			return ancestors;
		};

		/**
		 * find farthest ancestor predicate hit
		 */
		var lastAncestor = function (node, pred) {
			var ancestors = listAncestor(node);
			return list.last(ancestors.filter(pred));
		};

		/**
		 * returns common ancestor node between two nodes.
		 *
		 * @param {Node} nodeA
		 * @param {Node} nodeB
		 */
		var commonAncestor = function (nodeA, nodeB) {
			var ancestors = listAncestor(nodeA);
			for (var n = nodeB; n; n = n.parentNode) {
				if ($.inArray(n, ancestors) > -1) { return n; }
			}
			return null; // difference document area
		};

		/**
		 * listing all previous siblings (until predicate hit).
		 *
		 * @param {Node} node
		 * @param {Function} [optional] pred - predicate function
		 */
		var listPrev = function (node, pred) {
			pred = pred || func.fail;

			var nodes = [];
			while (node) {
				if (pred(node)) { break; }
				nodes.push(node);
				node = node.previousSibling;
			}
			return nodes;
		};

		/**
		 * listing next siblings (until predicate hit).
		 *
		 * @param {Node} node
		 * @param {Function} [pred] - predicate function
		 */
		var listNext = function (node, pred) {
			pred = pred || func.fail;

			var nodes = [];
			while (node) {
				if (pred(node)) { break; }
				nodes.push(node);
				node = node.nextSibling;
			}
			return nodes;
		};

		/**
		 * listing descendant nodes
		 *
		 * @param {Node} node
		 * @param {Function} [pred] - predicate function
		 */
		var listDescendant = function (node, pred) {
			var descendents = [];
			pred = pred || func.ok;

			// start DFS(depth first search) with node
			(function fnWalk(current) {
				if (node !== current && pred(current)) {
					descendents.push(current);
				}
				for (var idx = 0, len = current.childNodes.length; idx < len; idx++) {
					fnWalk(current.childNodes[idx]);
				}
			})(node);

			return descendents;
		};

		/**
		 * wrap node with new tag.
		 *
		 * @param {Node} node
		 * @param {Node} tagName of wrapper
		 * @return {Node} - wrapper
		 */
		var wrap = function (node, wrapperName) {
			var parent = node.parentNode;
			var wrapper = $('<' + wrapperName + '>')[0];

			parent.insertBefore(wrapper, node);
			wrapper.appendChild(node);

			return wrapper;
		};

		/**
		 * insert node after preceding
		 *
		 * @param {Node} node
		 * @param {Node} preceding - predicate function
		 */
		var insertAfter = function (node, preceding) {
			var next = preceding.nextSibling, parent = preceding.parentNode;
			if (next) {
				parent.insertBefore(node, next);
			} else {
				parent.appendChild(node);
			}
			return node;
		};

		/**
		 * append elements.
		 *
		 * @param {Node} node
		 * @param {Collection} aChild
		 */
		var appendChildNodes = function (node, aChild) {
			$.each(aChild, function (idx, child) {
				node.appendChild(child);
			});
			return node;
		};

		/**
		 * returns whether boundaryPoint is left edge or not.
		 *
		 * @param {BoundaryPoint} point
		 * @return {Boolean}
		 */
		var isLeftEdgePoint = function (point) {
			return point.offset === 0;
		};

		/**
		 * returns whether boundaryPoint is right edge or not.
		 *
		 * @param {BoundaryPoint} point
		 * @return {Boolean}
		 */
		var isRightEdgePoint = function (point) {
			return point.offset === nodeLength(point.node);
		};

		/**
		 * returns whether boundaryPoint is edge or not.
		 *
		 * @param {BoundaryPoint} point
		 * @return {Boolean}
		 */
		var isEdgePoint = function (point) {
			return isLeftEdgePoint(point) || isRightEdgePoint(point);
		};

		/**
		 * returns wheter node is left edge of ancestor or not.
		 *
		 * @param {Node} node
		 * @param {Node} ancestor
		 * @return {Boolean}
		 */
		var isLeftEdgeOf = function (node, ancestor) {
			while (node && node !== ancestor) {
				if (position(node) !== 0) {
					return false;
				}
				node = node.parentNode;
			}

			return true;
		};

		/**
		 * returns whether node is right edge of ancestor or not.
		 *
		 * @param {Node} node
		 * @param {Node} ancestor
		 * @return {Boolean}
		 */
		var isRightEdgeOf = function (node, ancestor) {
			while (node && node !== ancestor) {
				if (position(node) !== nodeLength(node.parentNode) - 1) {
					return false;
				}
				node = node.parentNode;
			}

			return true;
		};

		/**
		 * returns offset from parent.
		 *
		 * @param {Node} node
		 */
		var position = function (node) {
			var offset = 0;
			while ((node = node.previousSibling)) {
				offset += 1;
			}
			return offset;
		};

		var hasChildren = function (node) {
			return !!(node && node.childNodes && node.childNodes.length);
		};

		/**
		 * returns previous boundaryPoint
		 *
		 * @param {BoundaryPoint} point
		 * @param {Boolean} isSkipInnerOffset
		 * @return {BoundaryPoint}
		 */
		var prevPoint = function (point, isSkipInnerOffset) {
			var node, offset;

			if (point.offset === 0) {
				if (isEditable(point.node)) {
					return null;
				}

				node = point.node.parentNode;
				offset = position(point.node);
			} else if (hasChildren(point.node)) {
				node = point.node.childNodes[point.offset - 1];
				offset = nodeLength(node);
			} else {
				node = point.node;
				offset = isSkipInnerOffset ? 0 : point.offset - 1;
			}

			return {
				node: node,
				offset: offset
			};
		};

		/**
		 * returns next boundaryPoint
		 *
		 * @param {BoundaryPoint} point
		 * @param {Boolean} isSkipInnerOffset
		 * @return {BoundaryPoint}
		 */
		var nextPoint = function (point, isSkipInnerOffset) {
			var node, offset;

			if (nodeLength(point.node) === point.offset) {
				if (isEditable(point.node)) {
					return null;
				}

				node = point.node.parentNode;
				offset = position(point.node) + 1;
			} else if (hasChildren(point.node)) {
				node = point.node.childNodes[point.offset];
				offset = 0;
			} else {
				node = point.node;
				offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
			}

			return {
				node: node,
				offset: offset
			};
		};

		/**
		 * returns whether pointA and pointB is same or not.
		 *
		 * @param {BoundaryPoint} pointA
		 * @param {BoundaryPoint} pointB
		 * @return {Boolean}
		 */
		var isSamePoint = function (pointA, pointB) {
			return pointA.node === pointB.node && pointA.offset === pointB.offset;
		};

		/**
		 * returns whether point is visible (can set cursor) or not.
		 * 
		 * @param {BoundaryPoint} point
		 * @return {Boolean}
		 */
		var isVisiblePoint = function (point) {
			if (isText(point.node) || !hasChildren(point.node) || isEmpty(point.node)) {
				return true;
			}

			var leftNode = point.node.childNodes[point.offset - 1];
			var rightNode = point.node.childNodes[point.offset];
			if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode))) {
				return true;
			}

			return false;
		};

		/**
		 * @method prevPointUtil
		 *
		 * @param {BoundaryPoint} point
		 * @param {Function} pred
		 * @return {BoundaryPoint}
		 */
		var prevPointUntil = function (point, pred) {
			while (point) {
				if (pred(point)) {
					return point;
				}

				point = prevPoint(point);
			}

			return null;
		};

		/**
		 * @method nextPointUntil
		 *
		 * @param {BoundaryPoint} point
		 * @param {Function} pred
		 * @return {BoundaryPoint}
		 */
		var nextPointUntil = function (point, pred) {
			while (point) {
				if (pred(point)) {
					return point;
				}

				point = nextPoint(point);
			}

			return null;
		};

		/**
		 * @method walkPoint
		 *
		 * @param {BoundaryPoint} startPoint
		 * @param {BoundaryPoint} endPoint
		 * @param {Function} handler
		 * @param {Boolean} isSkipInnerOffset
		 */
		var walkPoint = function (startPoint, endPoint, handler, isSkipInnerOffset) {
			var point = startPoint;

			while (point) {
				handler(point);

				if (isSamePoint(point, endPoint)) {
					break;
				}

				var isSkipOffset = isSkipInnerOffset &&
								   startPoint.node !== point.node &&
								   endPoint.node !== point.node;
				point = nextPoint(point, isSkipOffset);
			}
		};

		/**
		 * @method makeOffsetPath
		 *
		 * return offsetPath(array of offset) from ancestor
		 *
		 * @param {Node} ancestor - ancestor node
		 * @param {Node} node
		 */
		var makeOffsetPath = function (ancestor, node) {
			var ancestors = listAncestor(node, func.eq(ancestor));
			return $.map(ancestors, position).reverse();
		};

		/**
		 * @method fromOffsetPath
		 *
		 * return element from offsetPath(array of offset)
		 *
		 * @param {Node} ancestor - ancestor node
		 * @param {array} offsets - offsetPath
		 */
		var fromOffsetPath = function (ancestor, offsets) {
			var current = ancestor;
			for (var i = 0, len = offsets.length; i < len; i++) {
				if (current.childNodes.length <= offsets[i]) {
					current = current.childNodes[current.childNodes.length - 1];
				} else {
					current = current.childNodes[offsets[i]];
				}
			}
			return current;
		};

		/**
		 * @method splitNode
		 *
		 * split element or #text
		 *
		 * @param {BoundaryPoint} point
		 * @param {Boolean} [isSkipPaddingBlankHTML]
		 * @return {Node} right node of boundaryPoint
		 */
		var splitNode = function (point, isSkipPaddingBlankHTML) {
			// split #text
			if (isText(point.node)) {
				// edge case
				if (isLeftEdgePoint(point)) {
					return point.node;
				} else if (isRightEdgePoint(point)) {
					return point.node.nextSibling;
				}

				return point.node.splitText(point.offset);
			}

			// split element
			var childNode = point.node.childNodes[point.offset];
			var clone = insertAfter(point.node.cloneNode(false), point.node);
			appendChildNodes(clone, listNext(childNode));

			if (!isSkipPaddingBlankHTML) {
				paddingBlankHTML(point.node);
				paddingBlankHTML(clone);
			}

			return clone;
		};

		/**
		 * @method splitTree
		 *
		 * split tree by point
		 *
		 * @param {Node} root - split root
		 * @param {BoundaryPoint} point
		 * @param {Boolean} [isSkipPaddingBlankHTML]
		 * @return {Node} right node of boundaryPoint
		 */
		var splitTree = function (root, point, isSkipPaddingBlankHTML) {
			// ex) [#text, <span>, <p>]
			var ancestors = listAncestor(point.node, func.eq(root));

			if (!ancestors.length) {
				return null;
			} else if (ancestors.length === 1) {
				return splitNode(point, isSkipPaddingBlankHTML);
			}

			return ancestors.reduce(function (node, parent) {
				var clone = insertAfter(parent.cloneNode(false), parent);

				if (node === point.node) {
					node = splitNode(point, isSkipPaddingBlankHTML);
				}

				appendChildNodes(clone, listNext(node));

				if (!isSkipPaddingBlankHTML) {
					paddingBlankHTML(parent);
					paddingBlankHTML(clone);
				}
				return clone;
			});
		};

		/**
		 * split point
		 *
		 * @param {Point} point
		 * @param {Boolean} isInline
		 * @return {Object}
		 */
		var splitPoint = function (point, isInline) {
			// find splitRoot, container
			//  - inline: splitRoot is a child of paragraph
			//  - block: splitRoot is a child of bodyContainer
			var pred = isInline ? isPara : isBodyContainer;
			var ancestors = listAncestor(point.node, pred);
			var topAncestor = list.last(ancestors) || point.node;

			var splitRoot, container;
			if (pred(topAncestor)) {
				splitRoot = ancestors[ancestors.length - 2];
				container = topAncestor;
			} else {
				splitRoot = topAncestor;
				container = splitRoot.parentNode;
			}

			// split with splitTree
			var pivot = splitRoot && splitTree(splitRoot, point, isInline);

			return {
				rightNode: pivot,
				container: container
			};
		};

		var create = function (nodeName) {
			return document.createElement(nodeName);
		};

		var createText = function (text) {
			return document.createTextNode(text);
		};

		/**
		 * @method remove
		 *
		 * remove node, (isRemoveChild: remove child or not)
		 *
		 * @param {Node} node
		 * @param {Boolean} isRemoveChild
		 */
		var remove = function (node, isRemoveChild) {
			if (!node || !node.parentNode) { return; }
			if (node.removeNode) { return node.removeNode(isRemoveChild); }

			var parent = node.parentNode;
			if (!isRemoveChild) {
				var nodes = [];
				var i, len;
				for (i = 0, len = node.childNodes.length; i < len; i++) {
					nodes.push(node.childNodes[i]);
				}

				for (i = 0, len = nodes.length; i < len; i++) {
					parent.insertBefore(nodes[i], node);
				}
			}

			parent.removeChild(node);
		};

		/**
		 * @method removeWhile
		 *
		 * @param {Node} node
		 * @param {Function} pred
		 */
		var removeWhile = function (node, pred) {
			while (node) {
				if (isEditable(node) || !pred(node)) {
					break;
				}

				var parent = node.parentNode;
				remove(node);
				node = parent;
			}
		};

		/**
		 * @method replace
		 *
		 * replace node with provided nodeName
		 *
		 * @param {Node} node
		 * @param {String} nodeName
		 * @return {Node} - new node
		 */
		var replace = function (node, nodeName) {
			if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {
				return node;
			}

			var newNode = create(nodeName);

			if (node.style.cssText) {
				newNode.style.cssText = node.style.cssText;
			}

			appendChildNodes(newNode, list.from(node.childNodes));
			insertAfter(newNode, node);
			remove(node);

			return newNode;
		};

		var isTextarea = makePredByNodeName('TEXTAREA');

		/**
		 * @method html
		 *
		 * get the HTML contents of node
		 *
		 * @param {jQuery} $node
		 * @param {Boolean} [isNewlineOnBlock]
		 */
		var html = function ($node, isNewlineOnBlock) {
			var markup = isTextarea($node[0]) ? $node.val() : $node.html();

			if (isNewlineOnBlock) {
				var regexTag = /<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g;
				markup = markup.replace(regexTag, function (match, endSlash, name) {
					name = name.toUpperCase();
					var isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) &&
												 !!endSlash;
					var isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);

					return match + ((isEndOfInlineContainer || isBlockNode) ? '\n' : '');
				});
				markup = $.trim(markup);
			}

			return markup;
		};

		var value = function ($textarea, stripLinebreaks) {
			var val = $textarea.val();
			if (stripLinebreaks) {
				return val.replace(/[\n\r]/g, '');
			}
			return val;
		};

		return {
			/** @property {String} NBSP_CHAR */
			NBSP_CHAR: NBSP_CHAR,
			/** @property {String} ZERO_WIDTH_NBSP_CHAR */
			ZERO_WIDTH_NBSP_CHAR: ZERO_WIDTH_NBSP_CHAR,
			/** @property {String} blank */
			blank: blankHTML,
			/** @property {String} emptyPara */
			emptyPara: '<p>' + blankHTML + '</p>',
			makePredByNodeName: makePredByNodeName,
			isEditable: isEditable,
			isControlSizing: isControlSizing,
			buildLayoutInfo: buildLayoutInfo,
			makeLayoutInfo: makeLayoutInfo,
			isText: isText,
			isVoid: isVoid,
			isPara: isPara,
			isPurePara: isPurePara,
			isInline: isInline,
			isBodyInline: isBodyInline,
			isBody: isBody,
			isParaInline: isParaInline,
			isList: isList,
			isTable: isTable,
			isCell: isCell,
			isBlockquote: isBlockquote,
			isBodyContainer: isBodyContainer,
			isAnchor: isAnchor,
			isDiv: makePredByNodeName('DIV'),
			isLi: isLi,
			isBR: makePredByNodeName('BR'),
			isSpan: makePredByNodeName('SPAN'),
			isB: makePredByNodeName('B'),
			isU: makePredByNodeName('U'),
			isS: makePredByNodeName('S'),
			isI: makePredByNodeName('I'),
			isImg: makePredByNodeName('IMG'),
			isTextarea: isTextarea,
			isEmpty: isEmpty,
			isEmptyAnchor: func.and(isAnchor, isEmpty),
			isClosestSibling: isClosestSibling,
			withClosestSiblings: withClosestSiblings,
			nodeLength: nodeLength,
			isLeftEdgePoint: isLeftEdgePoint,
			isRightEdgePoint: isRightEdgePoint,
			isEdgePoint: isEdgePoint,
			isLeftEdgeOf: isLeftEdgeOf,
			isRightEdgeOf: isRightEdgeOf,
			prevPoint: prevPoint,
			nextPoint: nextPoint,
			isSamePoint: isSamePoint,
			isVisiblePoint: isVisiblePoint,
			prevPointUntil: prevPointUntil,
			nextPointUntil: nextPointUntil,
			walkPoint: walkPoint,
			ancestor: ancestor,
			singleChildAncestor: singleChildAncestor,
			listAncestor: listAncestor,
			lastAncestor: lastAncestor,
			listNext: listNext,
			listPrev: listPrev,
			listDescendant: listDescendant,
			commonAncestor: commonAncestor,
			wrap: wrap,
			insertAfter: insertAfter,
			appendChildNodes: appendChildNodes,
			position: position,
			hasChildren: hasChildren,
			makeOffsetPath: makeOffsetPath,
			fromOffsetPath: fromOffsetPath,
			splitTree: splitTree,
			splitPoint: splitPoint,
			create: create,
			createText: createText,
			remove: remove,
			removeWhile: removeWhile,
			replace: replace,
			html: html,
			value: value
		};
	})();


	var range = (function () {

		/**
		 * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js
		 *
		 * @param {TextRange} textRange
		 * @param {Boolean} isStart
		 * @return {BoundaryPoint}
		 *
		 * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx
		 */
		var textRangeToPoint = function (textRange, isStart) {
			var container = textRange.parentElement(), offset;

			var tester = document.body.createTextRange(), prevContainer;
			var childNodes = list.from(container.childNodes);
			for (offset = 0; offset < childNodes.length; offset++) {
				if (dom.isText(childNodes[offset])) {
					continue;
				}
				tester.moveToElementText(childNodes[offset]);
				if (tester.compareEndPoints('StartToStart', textRange) >= 0) {
					break;
				}
				prevContainer = childNodes[offset];
			}

			if (offset !== 0 && dom.isText(childNodes[offset - 1])) {
				var textRangeStart = document.body.createTextRange(), curTextNode = null;
				textRangeStart.moveToElementText(prevContainer || container);
				textRangeStart.collapse(!prevContainer);
				curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;

				var pointTester = textRange.duplicate();
				pointTester.setEndPoint('StartToStart', textRangeStart);
				var textCount = pointTester.text.replace(/[\r\n]/g, '').length;

				while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {
					textCount -= curTextNode.nodeValue.length;
					curTextNode = curTextNode.nextSibling;
				}

				/* jshint ignore:start */
				var dummy = curTextNode.nodeValue; // enforce IE to re-reference curTextNode, hack
				/* jshint ignore:end */

				if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) &&
					textCount === curTextNode.nodeValue.length) {
					textCount -= curTextNode.nodeValue.length;
					curTextNode = curTextNode.nextSibling;
				}

				container = curTextNode;
				offset = textCount;
			}

			return {
				cont: container,
				offset: offset
			};
		};

		/**
		 * return TextRange from boundary point (inspired by google closure-library)
		 * @param {BoundaryPoint} point
		 * @return {TextRange}
		 */
		var pointToTextRange = function (point) {
			var textRangeInfo = function (container, offset) {
				var node, isCollapseToStart;

				if (dom.isText(container)) {
					var prevTextNodes = dom.listPrev(container, func.not(dom.isText));
					var prevContainer = list.last(prevTextNodes).previousSibling;
					node = prevContainer || container.parentNode;
					offset += list.sum(list.tail(prevTextNodes), dom.nodeLength);
					isCollapseToStart = !prevContainer;
				} else {
					node = container.childNodes[offset] || container;
					if (dom.isText(node)) {
						return textRangeInfo(node, 0);
					}

					offset = 0;
					isCollapseToStart = false;
				}

				return {
					node: node,
					collapseToStart: isCollapseToStart,
					offset: offset
				};
			};

			var textRange = document.body.createTextRange();
			var info = textRangeInfo(point.node, point.offset);

			textRange.moveToElementText(info.node);
			textRange.collapse(info.collapseToStart);
			textRange.moveStart('character', info.offset);
			return textRange;
		};

		/**
		 * Wrapped Range
		 *
		 * @constructor
		 * @param {Node} sc - start container
		 * @param {Number} so - start offset
		 * @param {Node} ec - end container
		 * @param {Number} eo - end offset
		 */
		var WrappedRange = function (sc, so, ec, eo) {
			this.sc = sc;
			this.so = so;
			this.ec = ec;
			this.eo = eo;

			// nativeRange: get nativeRange from sc, so, ec, eo
			var nativeRange = function () {
				if (agent.isW3CRangeSupport) {
					var w3cRange = document.createRange();
					w3cRange.setStart(sc, so);
					w3cRange.setEnd(ec, eo);

					return w3cRange;
				} else {
					var textRange = pointToTextRange({
						node: sc,
						offset: so
					});

					textRange.setEndPoint('EndToEnd', pointToTextRange({
						node: ec,
						offset: eo
					}));

					return textRange;
				}
			};

			this.getPoints = function () {
				return {
					sc: sc,
					so: so,
					ec: ec,
					eo: eo
				};
			};

			this.getStartPoint = function () {
				return {
					node: sc,
					offset: so
				};
			};

			this.getEndPoint = function () {
				return {
					node: ec,
					offset: eo
				};
			};

			/**
			 * select update visible range
			 */
			this.select = function () {
				var nativeRng = nativeRange();
				if (agent.isW3CRangeSupport) {
					var selection = document.getSelection();
					if (selection.rangeCount > 0) {
						selection.removeAllRanges();
					}
					selection.addRange(nativeRng);
				} else {
					nativeRng.select();
				}
			};

			/**
			 * @return {WrappedRange}
			 */
			this.normalize = function () {

				/**
				 * @param {BoundaryPoint} point
				 * @return {BoundaryPoint}
				 */
				var getVisiblePoint = function (point) {
					if (!dom.isVisiblePoint(point)) {
						if (dom.isLeftEdgePoint(point)) {
							point = dom.nextPointUntil(point, dom.isVisiblePoint);
						} else {
							point = dom.prevPointUntil(point, dom.isVisiblePoint);
						}
					}
					return point;
				};

				var startPoint = getVisiblePoint(this.getStartPoint());
				var endPoint = getVisiblePoint(this.getEndPoint());

				return new WrappedRange(
				  startPoint.node,
				  startPoint.offset,
				  endPoint.node,
				  endPoint.offset
				);
			};

			/**
			 * returns matched nodes on range
			 *
			 * @param {Function} [pred] - predicate function
			 * @param {Object} [options]
			 * @param {Boolean} [options.includeAncestor]
			 * @param {Boolean} [options.fullyContains]
			 * @return {Node[]}
			 */
			this.nodes = function (pred, options) {
				pred = pred || func.ok;

				var includeAncestor = options && options.includeAncestor;
				var fullyContains = options && options.fullyContains;

				// TODO compare points and sort
				var startPoint = this.getStartPoint();
				var endPoint = this.getEndPoint();

				var nodes = [];
				var leftEdgeNodes = [];

				dom.walkPoint(startPoint, endPoint, function (point) {
					if (dom.isEditable(point.node)) {
						return;
					}

					var node;
					if (fullyContains) {
						if (dom.isLeftEdgePoint(point)) {
							leftEdgeNodes.push(point.node);
						}
						if (dom.isRightEdgePoint(point) && list.contains(leftEdgeNodes, point.node)) {
							node = point.node;
						}
					} else if (includeAncestor) {
						node = dom.ancestor(point.node, pred);
					} else {
						node = point.node;
					}

					if (node && pred(node)) {
						nodes.push(node);
					}
				}, true);

				return list.unique(nodes);
			};

			/**
			 * returns commonAncestor of range
			 * @return {Element} - commonAncestor
			 */
			this.commonAncestor = function () {
				return dom.commonAncestor(sc, ec);
			};

			/**
			 * returns expanded range by pred
			 *
			 * @param {Function} pred - predicate function
			 * @return {WrappedRange}
			 */
			this.expand = function (pred) {
				var startAncestor = dom.ancestor(sc, pred);
				var endAncestor = dom.ancestor(ec, pred);

				if (!startAncestor && !endAncestor) {
					return new WrappedRange(sc, so, ec, eo);
				}

				var boundaryPoints = this.getPoints();

				if (startAncestor) {
					boundaryPoints.sc = startAncestor;
					boundaryPoints.so = 0;
				}

				if (endAncestor) {
					boundaryPoints.ec = endAncestor;
					boundaryPoints.eo = dom.nodeLength(endAncestor);
				}

				return new WrappedRange(
				  boundaryPoints.sc,
				  boundaryPoints.so,
				  boundaryPoints.ec,
				  boundaryPoints.eo
				);
			};

			/**
			 * @param {Boolean} isCollapseToStart
			 * @return {WrappedRange}
			 */
			this.collapse = function (isCollapseToStart) {
				if (isCollapseToStart) {
					return new WrappedRange(sc, so, sc, so);
				} else {
					return new WrappedRange(ec, eo, ec, eo);
				}
			};

			/**
			 * splitText on range
			 */
			this.splitText = function () {
				var isSameContainer = sc === ec;
				var boundaryPoints = this.getPoints();

				if (dom.isText(ec) && !dom.isEdgePoint(this.getEndPoint())) {
					ec.splitText(eo);
				}

				if (dom.isText(sc) && !dom.isEdgePoint(this.getStartPoint())) {
					boundaryPoints.sc = sc.splitText(so);
					boundaryPoints.so = 0;

					if (isSameContainer) {
						boundaryPoints.ec = boundaryPoints.sc;
						boundaryPoints.eo = eo - so;
					}
				}

				return new WrappedRange(
				  boundaryPoints.sc,
				  boundaryPoints.so,
				  boundaryPoints.ec,
				  boundaryPoints.eo
				);
			};

			/**
			 * delete contents on range
			 * @return {WrappedRange}
			 */
			this.deleteContents = function () {
				if (this.isCollapsed()) {
					return this;
				}

				var rng = this.splitText();
				var nodes = rng.nodes(null, {
					fullyContains: true
				});

				// find new cursor point
				var point = dom.prevPointUntil(rng.getStartPoint(), function (point) {
					return !list.contains(nodes, point.node);
				});

				var emptyParents = [];
				$.each(nodes, function (idx, node) {
					// find empty parents
					var parent = node.parentNode;
					if (point.node !== parent && dom.nodeLength(parent) === 1) {
						emptyParents.push(parent);
					}
					dom.remove(node, false);
				});

				// remove empty parents
				$.each(emptyParents, function (idx, node) {
					dom.remove(node, false);
				});

				return new WrappedRange(
				  point.node,
				  point.offset,
				  point.node,
				  point.offset
				).normalize();
			};

			/**
			 * makeIsOn: return isOn(pred) function
			 */
			var makeIsOn = function (pred) {
				return function () {
					var ancestor = dom.ancestor(sc, pred);
					return !!ancestor && (ancestor === dom.ancestor(ec, pred));
				};
			};

			// isOnEditable: judge whether range is on editable or not
			this.isOnEditable = makeIsOn(dom.isEditable);
			// isOnList: judge whether range is on list node or not
			this.isOnList = makeIsOn(dom.isList);
			// isOnAnchor: judge whether range is on anchor node or not
			this.isOnAnchor = makeIsOn(dom.isAnchor);
			// isOnAnchor: judge whether range is on cell node or not
			this.isOnCell = makeIsOn(dom.isCell);

			/**
			 * @param {Function} pred
			 * @return {Boolean}
			 */
			this.isLeftEdgeOf = function (pred) {
				if (!dom.isLeftEdgePoint(this.getStartPoint())) {
					return false;
				}

				var node = dom.ancestor(this.sc, pred);
				return node && dom.isLeftEdgeOf(this.sc, node);
			};

			/**
			 * returns whether range was collapsed or not
			 */
			this.isCollapsed = function () {
				return sc === ec && so === eo;
			};

			/**
			 * wrap inline nodes which children of body with paragraph
			 *
			 * @return {WrappedRange}
			 */
			this.wrapBodyInlineWithPara = function () {
				if (dom.isBodyContainer(sc) && dom.isEmpty(sc)) {
					sc.innerHTML = dom.emptyPara;
					return new WrappedRange(sc.firstChild, 0, sc.firstChild, 0);
				}

				if (dom.isParaInline(sc) || dom.isPara(sc)) {
					return this.normalize();
				}

				// find inline top ancestor
				var topAncestor;
				if (dom.isInline(sc)) {
					var ancestors = dom.listAncestor(sc, func.not(dom.isInline));
					topAncestor = list.last(ancestors);
					if (!dom.isInline(topAncestor)) {
						topAncestor = ancestors[ancestors.length - 2] || sc.childNodes[so];
					}
				} else {
					topAncestor = sc.childNodes[so > 0 ? so - 1 : 0];
				}

				// siblings not in paragraph
				var inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();
				inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline));

				// wrap with paragraph
				if (inlineSiblings.length) {
					var para = dom.wrap(list.head(inlineSiblings), 'p');
					dom.appendChildNodes(para, list.tail(inlineSiblings));
				}

				return this.normalize();
			};

			/**
			 * insert node at current cursor
			 *
			 * @param {Node} node
			 * @return {Node}
			 */
			this.insertNode = function (node) {
				var rng = this.wrapBodyInlineWithPara().deleteContents();
				var info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));

				if (info.rightNode) {
					info.rightNode.parentNode.insertBefore(node, info.rightNode);
				} else {
					info.container.appendChild(node);
				}

				return node;
			};

			/**
			 * returns text in range
			 *
			 * @return {String}
			 */
			this.toString = function () {
				var nativeRng = nativeRange();
				return agent.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;
			};

			/**
			 * create offsetPath bookmark
			 *
			 * @param {Node} editable
			 */
			this.bookmark = function (editable) {
				return {
					s: {
						path: dom.makeOffsetPath(editable, sc),
						offset: so
					},
					e: {
						path: dom.makeOffsetPath(editable, ec),
						offset: eo
					}
				};
			};

			/**
			 * create offsetPath bookmark base on paragraph
			 *
			 * @param {Node[]} paras
			 */
			this.paraBookmark = function (paras) {
				return {
					s: {
						path: list.tail(dom.makeOffsetPath(list.head(paras), sc)),
						offset: so
					},
					e: {
						path: list.tail(dom.makeOffsetPath(list.last(paras), ec)),
						offset: eo
					}
				};
			};

			/**
			 * getClientRects
			 * @return {Rect[]}
			 */
			this.getClientRects = function () {
				var nativeRng = nativeRange();
				return nativeRng.getClientRects();
			};
		};

		/**
		 * @class core.range
		 *
		 * Data structure
		 *  * BoundaryPoint: a point of dom tree
		 *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range
		 *
		 * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position
		 *
		 * @singleton
		 * @alternateClassName range
		 */
		return {
			/**
			 * @method
			 * 
			 * create Range Object From arguments or Browser Selection
			 *
			 * @param {Node} sc - start container
			 * @param {Number} so - start offset
			 * @param {Node} ec - end container
			 * @param {Number} eo - end offset
			 * @return {WrappedRange}
			 */
			create: function (sc, so, ec, eo) {
				if (!arguments.length) { // from Browser Selection
					if (agent.isW3CRangeSupport) {
						var selection = document.getSelection();
						if (selection.rangeCount === 0) {
							return null;
						} else if (dom.isBody(selection.anchorNode)) {
							// Firefox: returns entire body as range on initialization. We won't never need it.
							return null;
						}

						var nativeRng = selection.getRangeAt(0);
						sc = nativeRng.startContainer;
						so = nativeRng.startOffset;
						ec = nativeRng.endContainer;
						eo = nativeRng.endOffset;
					} else { // IE8: TextRange
						var textRange = document.selection.createRange();
						var textRangeEnd = textRange.duplicate();
						textRangeEnd.collapse(false);
						var textRangeStart = textRange;
						textRangeStart.collapse(true);

						var startPoint = textRangeToPoint(textRangeStart, true),
						endPoint = textRangeToPoint(textRangeEnd, false);

						// same visible point case: range was collapsed.
						if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) &&
							dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) &&
							endPoint.node.nextSibling === startPoint.node) {
							startPoint = endPoint;
						}

						sc = startPoint.cont;
						so = startPoint.offset;
						ec = endPoint.cont;
						eo = endPoint.offset;
					}
				} else if (arguments.length === 2) { //collapsed
					ec = sc;
					eo = so;
				}
				return new WrappedRange(sc, so, ec, eo);
			},

			/**
			 * @method 
			 * 
			 * create WrappedRange from node
			 *
			 * @param {Node} node
			 * @return {WrappedRange}
			 */
			createFromNode: function (node) {
				var sc = node;
				var so = 0;
				var ec = node;
				var eo = dom.nodeLength(ec);

				// browsers can't target a picture or void node
				if (dom.isVoid(sc)) {
					so = dom.listPrev(sc).length - 1;
					sc = sc.parentNode;
				}
				if (dom.isBR(ec)) {
					eo = dom.listPrev(ec).length - 1;
					ec = ec.parentNode;
				} else if (dom.isVoid(ec)) {
					eo = dom.listPrev(ec).length;
					ec = ec.parentNode;
				}

				return this.create(sc, so, ec, eo);
			},

			/**
			 * @method 
			 * 
			 * create WrappedRange from bookmark
			 *
			 * @param {Node} editable
			 * @param {Object} bookmark
			 * @return {WrappedRange}
			 */
			createFromBookmark: function (editable, bookmark) {
				var sc = dom.fromOffsetPath(editable, bookmark.s.path);
				var so = bookmark.s.offset;
				var ec = dom.fromOffsetPath(editable, bookmark.e.path);
				var eo = bookmark.e.offset;
				return new WrappedRange(sc, so, ec, eo);
			},

			/**
			 * @method 
			 *
			 * create WrappedRange from paraBookmark
			 *
			 * @param {Object} bookmark
			 * @param {Node[]} paras
			 * @return {WrappedRange}
			 */
			createFromParaBookmark: function (bookmark, paras) {
				var so = bookmark.s.offset;
				var eo = bookmark.e.offset;
				var sc = dom.fromOffsetPath(list.head(paras), bookmark.s.path);
				var ec = dom.fromOffsetPath(list.last(paras), bookmark.e.path);

				return new WrappedRange(sc, so, ec, eo);
			}
		};
	})();

	/**
	 * @class defaults 
	 * 
	 * @singleton
	 */
	var defaults = {
		/** @property */
		version: '0.6.3',

		/**
		 * 
		 * for event options, reference to EventHandler.attach
		 * 
		 * @property {Object} options 
		 * @property {String/Number} [options.width=null] set editor width 
		 * @property {String/Number} [options.height=null] set editor height, ex) 300
		 * @property {String/Number} options.minHeight set minimum height of editor
		 * @property {String/Number} options.maxHeight
		 * @property {String/Number} options.focus 
		 * @property {Number} options.tabsize 
		 * @property {Boolean} options.styleWithSpan
		 * @property {Object} options.codemirror
		 * @property {Object} [options.codemirror.mode='text/html']
		 * @property {Object} [options.codemirror.htmlMode=true]
		 * @property {Object} [options.codemirror.lineNumbers=true]
		 * @property {String} [options.lang=en-US] language 'en-US', 'ko-KR', ...
		 * @property {String} [options.direction=null] text direction, ex) 'rtl'
		 * @property {Array} [options.toolbar]
		 * @property {Boolean} [options.airMode=false]
		 * @property {Array} [options.airPopover]
		 * @property {Fucntion} [options.onInit] initialize
		 * @property {Fucntion} [options.onsubmit]
		 */
		options: {
			width: null,                  // set editor width
			height: null,                 // set editor height, ex) 300

			minHeight: null,              // set minimum height of editor
			maxHeight: null,              // set maximum height of editor

			focus: false,                 // set focus to editable area after initializing summernote

			tabsize: 4,                   // size of tab ex) 2 or 4
			styleWithSpan: true,          // style with span (Chrome and FF only)

			disableLinkTarget: false,     // hide link Target Checkbox
			disableDragAndDrop: false,    // disable drag and drop event
			disableResizeEditor: false,   // disable resizing editor

			shortcuts: true,              // enable keyboard shortcuts

			placeholder: false,           // enable placeholder text
			prettifyHtml: true,           // enable prettifying html while toggling codeview

			iconPrefix: 'fa fa-',         // prefix for css icon classes

			codemirror: {                 // codemirror options
				mode: 'text/html',
				htmlMode: true,
				lineNumbers: true
			},

			// language
			lang: 'en-US',                // language 'en-US', 'ko-KR', ...
			direction: null,              // text direction, ex) 'rtl'

			// toolbar
			toolbar: [
			  ['style', ['style']],
			  ['font', ['bold', 'italic', 'underline', 'clear']],
			  ['fontname', ['fontname']],
			  ['color', ['color']],
			  ['para', ['ul', 'ol', 'paragraph']],
			  ['height', ['height']],
			  ['table', ['table']],
			  ['insert', ['link', 'picture', 'hr']],
			  ['view', ['fullscreen', 'codeview']],
			  ['help', ['help']]
			],

			// air mode: inline editor
			airMode: false,
			// airPopover: [
			//   ['style', ['style']],
			//   ['font', ['bold', 'italic', 'underline', 'clear']],
			//   ['fontname', ['fontname']],
			//   ['color', ['color']],
			//   ['para', ['ul', 'ol', 'paragraph']],
			//   ['height', ['height']],
			//   ['table', ['table']],
			//   ['insert', ['link', 'picture']],
			//   ['help', ['help']]
			// ],
			airPopover: [
			  ['color', ['color']],
			  ['font', ['bold', 'underline', 'clear']],
			  ['para', ['ul', 'paragraph']],
			  ['table', ['table']],
			  ['insert', ['link', 'picture']]
			],

			// style tag
			styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],

			// default fontName
			defaultFontName: 'Helvetica Neue',

			// fontName
			fontNames: [
			  'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',
			  'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',
			  'Tahoma', 'Times New Roman', 'Verdana'
			],
			fontNamesIgnoreCheck: [],

			// pallete colors(n x n)
			colors: [
			  ['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'],
			  ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'],
			  ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'],
			  ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'],
			  ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'],
			  ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'],
			  ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'],
			  ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031']
			],

			// lineHeight
			lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],

			// insertTable max size
			insertTableMaxSize: {
				col: 10,
				row: 10
			},

			// image
			maximumImageFileSize: null, // size in bytes, null = no limit

			// callbacks
			oninit: null,             // initialize
			onfocus: null,            // editable has focus
			onblur: null,             // editable out of focus
			onenter: null,            // enter key pressed
			onkeyup: null,            // keyup
			onkeydown: null,          // keydown
			onImageUpload: null,      // imageUpload
			onImageUploadError: null, // imageUploadError
			onMediaDelete: null,      // media delete
			onToolbarClick: null,
			onsubmit: null,

			/**
			 * manipulate link address when user create link
			 * @param {String} sLinkUrl
			 * @return {String}
			 */
			onCreateLink: function (sLinkUrl) {
				if (sLinkUrl.indexOf('@') !== -1 && sLinkUrl.indexOf(':') === -1) {
					sLinkUrl = 'mailto:' + sLinkUrl;
				} else if (sLinkUrl.indexOf('://') === -1) {
					sLinkUrl = 'http://' + sLinkUrl;
				}

				return sLinkUrl;
			},

			keyMap: {
				pc: {
					'ENTER': 'insertParagraph',
					'CTRL+Z': 'undo',
					'CTRL+Y': 'redo',
					'TAB': 'tab',
					'SHIFT+TAB': 'untab',
					'CTRL+B': 'bold',
					'CTRL+I': 'italic',
					'CTRL+U': 'underline',
					'CTRL+SHIFT+S': 'strikethrough',
					'CTRL+BACKSLASH': 'removeFormat',
					'CTRL+SHIFT+L': 'justifyLeft',
					'CTRL+SHIFT+E': 'justifyCenter',
					'CTRL+SHIFT+R': 'justifyRight',
					'CTRL+SHIFT+J': 'justifyFull',
					'CTRL+SHIFT+NUM7': 'insertUnorderedList',
					'CTRL+SHIFT+NUM8': 'insertOrderedList',
					'CTRL+LEFTBRACKET': 'outdent',
					'CTRL+RIGHTBRACKET': 'indent',
					'CTRL+NUM0': 'formatPara',
					'CTRL+NUM1': 'formatH1',
					'CTRL+NUM2': 'formatH2',
					'CTRL+NUM3': 'formatH3',
					'CTRL+NUM4': 'formatH4',
					'CTRL+NUM5': 'formatH5',
					'CTRL+NUM6': 'formatH6',
					'CTRL+ENTER': 'insertHorizontalRule',
					'CTRL+K': 'showLinkDialog'
				},

				mac: {
					'ENTER': 'insertParagraph',
					'CMD+Z': 'undo',
					'CMD+SHIFT+Z': 'redo',
					'TAB': 'tab',
					'SHIFT+TAB': 'untab',
					'CMD+B': 'bold',
					'CMD+I': 'italic',
					'CMD+U': 'underline',
					'CMD+SHIFT+S': 'strikethrough',
					'CMD+BACKSLASH': 'removeFormat',
					'CMD+SHIFT+L': 'justifyLeft',
					'CMD+SHIFT+E': 'justifyCenter',
					'CMD+SHIFT+R': 'justifyRight',
					'CMD+SHIFT+J': 'justifyFull',
					'CMD+SHIFT+NUM7': 'insertUnorderedList',
					'CMD+SHIFT+NUM8': 'insertOrderedList',
					'CMD+LEFTBRACKET': 'outdent',
					'CMD+RIGHTBRACKET': 'indent',
					'CMD+NUM0': 'formatPara',
					'CMD+NUM1': 'formatH1',
					'CMD+NUM2': 'formatH2',
					'CMD+NUM3': 'formatH3',
					'CMD+NUM4': 'formatH4',
					'CMD+NUM5': 'formatH5',
					'CMD+NUM6': 'formatH6',
					'CMD+ENTER': 'insertHorizontalRule',
					'CMD+K': 'showLinkDialog'
				}
			}
		},

		// default language: en-US
		lang: {
			'en-US': {
				font: {
					bold: 'Bold',
					italic: 'Italic',
					underline: 'Underline',
					clear: 'Remove Font Style',
					height: 'Line Height',
					name: 'Font Family'
				},
				image: {
					image: 'Picture',
					insert: 'Insert Image',
					resizeFull: 'Resize Full',
					resizeHalf: 'Resize Half',
					resizeQuarter: 'Resize Quarter',
					floatLeft: 'Float Left',
					floatRight: 'Float Right',
					floatNone: 'Float None',
					shapeRounded: 'Shape: Rounded',
					shapeCircle: 'Shape: Circle',
					shapeThumbnail: 'Shape: Thumbnail',
					shapeNone: 'Shape: None',
					dragImageHere: 'Drag image or text here',
					dropImage: 'Drop image or Text',
					selectFromFiles: 'Select from files',
					maximumFileSize: 'Maximum file size',
					maximumFileSizeError: 'Maximum file size exceeded.',
					url: 'Image URL',
					remove: 'Remove Image'
				},
				link: {
					link: 'Link',
					insert: 'Insert Link',
					unlink: 'Unlink',
					edit: 'Edit',
					textToDisplay: 'Text to display',
					url: 'To what URL should this link go?',
					openInNewWindow: 'Open in new window'
				},
				table: {
					table: 'Table'
				},
				hr: {
					insert: 'Insert Horizontal Rule'
				},
				style: {
					style: 'Style',
					normal: 'Normal',
					blockquote: 'Quote',
					pre: 'Code',
					h1: 'Header 1',
					h2: 'Header 2',
					h3: 'Header 3',
					h4: 'Header 4',
					h5: 'Header 5',
					h6: 'Header 6'
				},
				lists: {
					unordered: 'Unordered list',
					ordered: 'Ordered list'
				},
				options: {
					help: 'Help',
					fullscreen: 'Full Screen',
					codeview: 'Code View'
				},
				paragraph: {
					paragraph: 'Paragraph',
					outdent: 'Outdent',
					indent: 'Indent',
					left: 'Align left',
					center: 'Align center',
					right: 'Align right',
					justify: 'Justify full'
				},
				color: {
					recent: 'Recent Color',
					more: 'More Color',
					background: 'Background Color',
					foreground: 'Foreground Color',
					transparent: 'Transparent',
					setTransparent: 'Set transparent',
					reset: 'Reset',
					resetToDefault: 'Reset to default'
				},
				shortcut: {
					shortcuts: 'Keyboard shortcuts',
					close: 'Close',
					textFormatting: 'Text formatting',
					action: 'Action',
					paragraphFormatting: 'Paragraph formatting',
					documentStyle: 'Document Style',
					extraKeys: 'Extra keys'
				},
				history: {
					undo: 'Undo',
					redo: 'Redo'
				}
			}
		}
	};

	/**
	 * @class core.async
	 *
	 * Async functions which returns `Promise`
	 *
	 * @singleton
	 * @alternateClassName async
	 */
	var async = (function () {
		/**
		 * @method readFileAsDataURL
		 *
		 * read contents of file as representing URL
		 *
		 * @param {File} file
		 * @return {Promise} - then: sDataUrl
		 */
		var readFileAsDataURL = function (file) {
			return $.Deferred(function (deferred) {
				$.extend(new FileReader(), {
					onload: function (e) {
						var sDataURL = e.target.result;
						deferred.resolve(sDataURL);
					},
					onerror: function () {
						deferred.reject(this);
					}
				}).readAsDataURL(file);
			}).promise();
		};

		/**
		 * @method createImage
		 *
		 * create `<image>` from url string
		 *
		 * @param {String} sUrl
		 * @param {String} filename
		 * @return {Promise} - then: $image
		 */
		var createImage = function (sUrl, filename) {
			return $.Deferred(function (deferred) {
				var $img = $('<img>');

				$img.one('load', function () {
					$img.off('error abort');
					deferred.resolve($img);
				}).one('error abort', function () {
					$img.off('load').detach();
					deferred.reject($img);
				}).css({
					display: 'none'
				}).appendTo(document.body).attr({
					'src': sUrl,
					'data-filename': filename
				});
			}).promise();
		};

		return {
			readFileAsDataURL: readFileAsDataURL,
			createImage: createImage
		};
	})();

	/**
	 * @class core.key
	 *
	 * Object for keycodes.
	 *
	 * @singleton
	 * @alternateClassName key
	 */
	var key = {
		/**
		 * @method isEdit
		 *
		 * @param {Number} keyCode
		 * @return {Boolean}
		 */
		isEdit: function (keyCode) {
			return list.contains([8, 9, 13, 32], keyCode);
		},
		/**
		 * @property {Object} nameFromCode
		 * @property {String} nameFromCode.8 "BACKSPACE"
		 */
		nameFromCode: {
			'8': 'BACKSPACE',
			'9': 'TAB',
			'13': 'ENTER',
			'32': 'SPACE',

			// Number: 0-9
			'48': 'NUM0',
			'49': 'NUM1',
			'50': 'NUM2',
			'51': 'NUM3',
			'52': 'NUM4',
			'53': 'NUM5',
			'54': 'NUM6',
			'55': 'NUM7',
			'56': 'NUM8',

			// Alphabet: a-z
			'66': 'B',
			'69': 'E',
			'73': 'I',
			'74': 'J',
			'75': 'K',
			'76': 'L',
			'82': 'R',
			'83': 'S',
			'85': 'U',
			'89': 'Y',
			'90': 'Z',

			'191': 'SLASH',
			'219': 'LEFTBRACKET',
			'220': 'BACKSLASH',
			'221': 'RIGHTBRACKET'
		}
	};

	/**
	 * @class editing.History
	 *
	 * Editor History
	 *
	 */
	var History = function ($editable) {
		var stack = [], stackOffset = -1;
		var editable = $editable[0];

		var makeSnapshot = function () {
			var rng = range.create();
			var emptyBookmark = { s: { path: [], offset: 0 }, e: { path: [], offset: 0 } };

			return {
				contents: $editable.html(),
				bookmark: (rng ? rng.bookmark(editable) : emptyBookmark)
			};
		};

		var applySnapshot = function (snapshot) {
			if (snapshot.contents !== null) {
				$editable.html(snapshot.contents);
			}
			if (snapshot.bookmark !== null) {
				range.createFromBookmark(editable, snapshot.bookmark).select();
			}
		};

		/**
		 * undo
		 */
		this.undo = function () {
			if (0 < stackOffset) {
				stackOffset--;
				applySnapshot(stack[stackOffset]);
			}
		};

		/**
		 * redo
		 */
		this.redo = function () {
			if (stack.length - 1 > stackOffset) {
				stackOffset++;
				applySnapshot(stack[stackOffset]);
			}
		};

		/**
		 * recorded undo
		 */
		this.recordUndo = function () {
			stackOffset++;

			// Wash out stack after stackOffset
			if (stack.length > stackOffset) {
				stack = stack.slice(0, stackOffset);
			}

			// Create new snapshot and push it to the end
			stack.push(makeSnapshot());
		};

		// Create first undo stack
		this.recordUndo();
	};

	/**
	 * @class editing.Style
	 *
	 * Style
	 *
	 */
	var Style = function () {
		/**
		 * @method jQueryCSS
		 *
		 * passing an array of style properties to .css()
		 * will result in an object of property-value pairs.
		 * (compability with version < 1.9)
		 *
		 * @private
		 * @param  {jQuery} $obj
		 * @param  {Array} propertyNames - An array of one or more CSS properties.
		 * @return {Object}
		 */
		var jQueryCSS = function ($obj, propertyNames) {
			if (agent.jqueryVersion < 1.9) {
				var result = {};
				$.each(propertyNames, function (idx, propertyName) {
					result[propertyName] = $obj.css(propertyName);
				});
				return result;
			}
			return $obj.css.call($obj, propertyNames);
		};

		/**
		 * paragraph level style
		 *
		 * @param {WrappedRange} rng
		 * @param {Object} styleInfo
		 */
		this.stylePara = function (rng, styleInfo) {
			$.each(rng.nodes(dom.isPara, {
				includeAncestor: true
			}), function (idx, para) {
				$(para).css(styleInfo);
			});
		};

		/**
		 * insert and returns styleNodes on range.
		 *
		 * @param {WrappedRange} rng
		 * @param {Object} [options] - options for styleNodes
		 * @param {String} [options.nodeName] - default: `SPAN`
		 * @param {Boolean} [options.expandClosestSibling] - default: `false`
		 * @param {Boolean} [options.onlyPartialContains] - default: `false`
		 * @return {Node[]}
		 */
		this.styleNodes = function (rng, options) {
			rng = rng.splitText();

			var nodeName = options && options.nodeName || 'SPAN';
			var expandClosestSibling = !!(options && options.expandClosestSibling);
			var onlyPartialContains = !!(options && options.onlyPartialContains);

			if (rng.isCollapsed()) {
				return rng.insertNode(dom.create(nodeName));
			}

			var pred = dom.makePredByNodeName(nodeName);
			var nodes = $.map(rng.nodes(dom.isText, {
				fullyContains: true
			}), function (text) {
				return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);
			});

			if (expandClosestSibling) {
				if (onlyPartialContains) {
					var nodesInRange = rng.nodes();
					// compose with partial contains predication
					pred = func.and(pred, function (node) {
						return list.contains(nodesInRange, node);
					});
				}

				return $.map(nodes, function (node) {
					var siblings = dom.withClosestSiblings(node, pred);
					var head = list.head(siblings);
					var tails = list.tail(siblings);
					$.each(tails, function (idx, elem) {
						dom.appendChildNodes(head, elem.childNodes);
						dom.remove(elem);
					});
					return list.head(siblings);
				});
			} else {
				return nodes;
			}
		};

		/**
		 * get current style on cursor
		 *
		 * @param {WrappedRange} rng
		 * @param {Node} target - target element on event
		 * @return {Object} - object contains style properties.
		 */
		this.current = function (rng, target) {
			var $cont = $(dom.isText(rng.sc) ? rng.sc.parentNode : rng.sc);
			var properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];
			var styleInfo = jQueryCSS($cont, properties) || {};

			styleInfo['font-size'] = parseInt(styleInfo['font-size'], 10);

			// document.queryCommandState for toggle state
			styleInfo['font-bold'] = document.queryCommandState('bold') ? 'bold' : 'normal';
			styleInfo['font-italic'] = document.queryCommandState('italic') ? 'italic' : 'normal';
			styleInfo['font-underline'] = document.queryCommandState('underline') ? 'underline' : 'normal';
			styleInfo['font-strikethrough'] = document.queryCommandState('strikeThrough') ? 'strikethrough' : 'normal';
			styleInfo['font-superscript'] = document.queryCommandState('superscript') ? 'superscript' : 'normal';
			styleInfo['font-subscript'] = document.queryCommandState('subscript') ? 'subscript' : 'normal';

			// list-style-type to list-style(unordered, ordered)
			if (!rng.isOnList()) {
				styleInfo['list-style'] = 'none';
			} else {
				var aOrderedType = ['circle', 'disc', 'disc-leading-zero', 'square'];
				var isUnordered = $.inArray(styleInfo['list-style-type'], aOrderedType) > -1;
				styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';
			}

			var para = dom.ancestor(rng.sc, dom.isPara);
			if (para && para.style['line-height']) {
				styleInfo['line-height'] = para.style.lineHeight;
			} else {
				var lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);
				styleInfo['line-height'] = lineHeight.toFixed(1);
			}

			styleInfo.image = dom.isImg(target) && target;
			styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);
			styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);
			styleInfo.range = rng;

			return styleInfo;
		};
	};


	/**
	 * @class editing.Typing
	 *
	 * Typing
	 *
	 */
	var Typing = function () {

		/**
		 * insert tab
		 *
		 * @param {jQuery} $editable
		 * @param {WrappedRange} rng
		 * @param {Number} tabsize
		 */
		this.insertTab = function ($editable, rng, tabsize) {
			var tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));
			rng = rng.deleteContents();
			rng.insertNode(tab, true);

			rng = range.create(tab, tabsize);
			rng.select();
		};

		/**
		 * insert paragraph
		 */
		this.insertParagraph = function () {
			var rng = range.create();

			// deleteContents on range.
			rng = rng.deleteContents();

			// Wrap range if it needs to be wrapped by paragraph
			rng = rng.wrapBodyInlineWithPara();

			// finding paragraph
			var splitRoot = dom.ancestor(rng.sc, dom.isPara);

			var nextPara;
			// on paragraph: split paragraph
			if (splitRoot) {
				nextPara = dom.splitTree(splitRoot, rng.getStartPoint());

				var emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);
				emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));

				$.each(emptyAnchors, function (idx, anchor) {
					dom.remove(anchor);
				});
				// no paragraph: insert empty paragraph
			} else {
				var next = rng.sc.childNodes[rng.so];
				nextPara = $(dom.emptyPara)[0];
				if (next) {
					rng.sc.insertBefore(nextPara, next);
				} else {
					rng.sc.appendChild(nextPara);
				}
			}

			range.create(nextPara, 0).normalize().select();
		};

	};

	/**
	 * @class editing.Table
	 *
	 * Table
	 *
	 */
	var Table = function () {
		/**
		 * handle tab key
		 *
		 * @param {WrappedRange} rng
		 * @param {Boolean} isShift
		 */
		this.tab = function (rng, isShift) {
			var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
			var table = dom.ancestor(cell, dom.isTable);
			var cells = dom.listDescendant(table, dom.isCell);

			var nextCell = list[isShift ? 'prev' : 'next'](cells, cell);
			if (nextCell) {
				range.create(nextCell, 0).select();
			}
		};

		/**
		 * create empty table element
		 *
		 * @param {Number} rowCount
		 * @param {Number} colCount
		 * @return {Node}
		 */
		this.createTable = function (colCount, rowCount) {
			var tds = [], tdHTML;
			for (var idxCol = 0; idxCol < colCount; idxCol++) {
				tds.push('<td>' + dom.blank + '</td>');
			}
			tdHTML = tds.join('');

			var trs = [], trHTML;
			for (var idxRow = 0; idxRow < rowCount; idxRow++) {
				trs.push('<tr>' + tdHTML + '</tr>');
			}
			trHTML = trs.join('');
			return $('<table class="table table-bordered">' + trHTML + '</table>')[0];
		};
	};


	/**
	 * @class editing.Bullet
	 *
	 * @alternateClassName Bullet
	 */
	var Bullet = function () {
		/**
		 * @method insertOrderedList
		 *
		 * toggle ordered list
		 *
		 * @type command
		 */
		this.insertOrderedList = function () {
			this.toggleList('OL');
		};

		/**
		 * @method insertUnorderedList
		 *
		 * toggle unordered list
		 *
		 * @type command
		 */
		this.insertUnorderedList = function () {
			this.toggleList('UL');
		};

		/**
		 * @method indent
		 *
		 * indent
		 *
		 * @type command
		 */
		this.indent = function () {
			var self = this;
			var rng = range.create().wrapBodyInlineWithPara();

			var paras = rng.nodes(dom.isPara, { includeAncestor: true });
			var clustereds = list.clusterBy(paras, func.peq2('parentNode'));

			$.each(clustereds, function (idx, paras) {
				var head = list.head(paras);
				if (dom.isLi(head)) {
					self.wrapList(paras, head.parentNode.nodeName);
				} else {
					$.each(paras, function (idx, para) {
						$(para).css('marginLeft', function (idx, val) {
							return (parseInt(val, 10) || 0) + 25;
						});
					});
				}
			});

			rng.select();
		};

		/**
		 * @method outdent
		 *
		 * outdent
		 *
		 * @type command
		 */
		this.outdent = function () {
			var self = this;
			var rng = range.create().wrapBodyInlineWithPara();

			var paras = rng.nodes(dom.isPara, { includeAncestor: true });
			var clustereds = list.clusterBy(paras, func.peq2('parentNode'));

			$.each(clustereds, function (idx, paras) {
				var head = list.head(paras);
				if (dom.isLi(head)) {
					self.releaseList([paras]);
				} else {
					$.each(paras, function (idx, para) {
						$(para).css('marginLeft', function (idx, val) {
							val = (parseInt(val, 10) || 0);
							return val > 25 ? val - 25 : '';
						});
					});
				}
			});

			rng.select();
		};

		/**
		 * @method toggleList
		 *
		 * toggle list
		 *
		 * @param {String} listName - OL or UL
		 */
		this.toggleList = function (listName) {
			var self = this;
			var rng = range.create().wrapBodyInlineWithPara();

			var paras = rng.nodes(dom.isPara, { includeAncestor: true });
			var bookmark = rng.paraBookmark(paras);
			var clustereds = list.clusterBy(paras, func.peq2('parentNode'));

			// paragraph to list
			if (list.find(paras, dom.isPurePara)) {
				var wrappedParas = [];
				$.each(clustereds, function (idx, paras) {
					wrappedParas = wrappedParas.concat(self.wrapList(paras, listName));
				});
				paras = wrappedParas;
				// list to paragraph or change list style
			} else {
				var diffLists = rng.nodes(dom.isList, {
					includeAncestor: true
				}).filter(function (listNode) {
					return !$.nodeName(listNode, listName);
				});

				if (diffLists.length) {
					$.each(diffLists, function (idx, listNode) {
						dom.replace(listNode, listName);
					});
				} else {
					paras = this.releaseList(clustereds, true);
				}
			}

			range.createFromParaBookmark(bookmark, paras).select();
		};

		/**
		 * @method wrapList
		 *
		 * @param {Node[]} paras
		 * @param {String} listName
		 * @return {Node[]}
		 */
		this.wrapList = function (paras, listName) {
			var head = list.head(paras);
			var last = list.last(paras);

			var prevList = dom.isList(head.previousSibling) && head.previousSibling;
			var nextList = dom.isList(last.nextSibling) && last.nextSibling;

			var listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last);

			// P to LI
			paras = $.map(paras, function (para) {
				return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;
			});

			// append to list(<ul>, <ol>)
			dom.appendChildNodes(listNode, paras);

			if (nextList) {
				dom.appendChildNodes(listNode, list.from(nextList.childNodes));
				dom.remove(nextList);
			}

			return paras;
		};

		/**
		 * @method releaseList
		 *
		 * @param {Array[]} clustereds
		 * @param {Boolean} isEscapseToBody
		 * @return {Node[]}
		 */
		this.releaseList = function (clustereds, isEscapseToBody) {
			var releasedParas = [];

			$.each(clustereds, function (idx, paras) {
				var head = list.head(paras);
				var last = list.last(paras);

				var headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) :
												 head.parentNode;
				var lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {
					node: last.parentNode,
					offset: dom.position(last) + 1
				}, true) : null;

				var middleList = dom.splitTree(headList, {
					node: head.parentNode,
					offset: dom.position(head)
				}, true);

				paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi) :
										  list.from(middleList.childNodes).filter(dom.isLi);

				// LI to P
				if (isEscapseToBody || !dom.isList(headList.parentNode)) {
					paras = $.map(paras, function (para) {
						return dom.replace(para, 'P');
					});
				}

				$.each(list.from(paras).reverse(), function (idx, para) {
					dom.insertAfter(para, headList);
				});

				// remove empty lists
				var rootLists = list.compact([headList, middleList, lastList]);
				$.each(rootLists, function (idx, rootList) {
					var listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));
					$.each(listNodes.reverse(), function (idx, listNode) {
						if (!dom.nodeLength(listNode)) {
							dom.remove(listNode, true);
						}
					});
				});

				releasedParas = releasedParas.concat(paras);
			});

			return releasedParas;
		};
	};

	/**
	 * @class editing.Editor
	 *
	 * Editor
	 *
	 */
	var Editor = function () {

		var style = new Style();
		var table = new Table();
		var typing = new Typing();
		var bullet = new Bullet();

		/**
		 * @method createRange
		 *
		 * create range
		 *
		 * @param {jQuery} $editable
		 * @return {WrappedRange}
		 */
		this.createRange = function ($editable) {
			$editable.focus();
			return range.create();
		};

		/**
		 * @method saveRange
		 *
		 * save current range
		 *
		 * @param {jQuery} $editable
		 * @param {Boolean} [thenCollapse=false]
		 */
		this.saveRange = function ($editable, thenCollapse) {
			$editable.focus();
			$editable.data('range', range.create());
			if (thenCollapse) {
				range.create().collapse().select();
			}
		};

		/**
		 * @method saveRange
		 *
		 * save current node list to $editable.data('childNodes')
		 *
		 * @param {jQuery} $editable
		 */
		this.saveNode = function ($editable) {
			// copy child node reference
			var copy = [];
			for (var key = 0, len = $editable[0].childNodes.length; key < len; key++) {
				copy.push($editable[0].childNodes[key]);
			}
			$editable.data('childNodes', copy);
		};

		/**
		 * @method restoreRange
		 *
		 * restore lately range
		 *
		 * @param {jQuery} $editable
		 */
		this.restoreRange = function ($editable) {
			var rng = $editable.data('range');
			if (rng) {
				rng.select();
				$editable.focus();
			}
		};

		/**
		 * @method restoreNode
		 *
		 * restore lately node list
		 *
		 * @param {jQuery} $editable
		 */
		this.restoreNode = function ($editable) {
			$editable.html('');
			var child = $editable.data('childNodes');
			for (var index = 0, len = child.length; index < len; index++) {
				$editable[0].appendChild(child[index]);
			}
		};
		/**
		 * @method currentStyle
		 *
		 * current style
		 *
		 * @param {Node} target
		 * @return {Boolean} false if range is no
		 */
		this.currentStyle = function (target) {
			var rng = range.create();
			return rng ? rng.isOnEditable() && style.current(rng, target) : false;
		};

		var triggerOnBeforeChange = this.triggerOnBeforeChange = function ($editable) {
			var onBeforeChange = $editable.data('callbacks').onBeforeChange;
			if (onBeforeChange) {
				onBeforeChange($editable.html(), $editable);
			}
		};

		var triggerOnChange = this.triggerOnChange = function ($editable) {
			var onChange = $editable.data('callbacks').onChange;
			if (onChange) {
				onChange($editable.html(), $editable);
			}
		};

		/**
		 * @method undo
		 * undo
		 * @param {jQuery} $editable
		 */
		this.undo = function ($editable) {
			triggerOnBeforeChange($editable);
			$editable.data('NoteHistory').undo();
			triggerOnChange($editable);
		};

		/**
		 * @method redo
		 * redo
		 * @param {jQuery} $editable
		 */
		this.redo = function ($editable) {
			triggerOnBeforeChange($editable);
			$editable.data('NoteHistory').redo();
			triggerOnChange($editable);
		};

		/**
		 * @method beforeCommand
		 * before command
		 * @param {jQuery} $editable
		 */
		var beforeCommand = this.beforeCommand = function ($editable) {
			triggerOnBeforeChange($editable);
		};

		/**
		 * @method afterCommand
		 * after command
		 * @param {jQuery} $editable
		 */
		var afterCommand = this.afterCommand = function ($editable) {
			$editable.data('NoteHistory').recordUndo();
			triggerOnChange($editable);
		};

		/**
		 * @method bold
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method italic
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method underline
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method strikethrough
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method formatBlock
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method superscript
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method subscript
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method justifyLeft
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method justifyCenter
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method justifyRight
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method justifyFull
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method formatBlock
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method removeFormat
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method backColor
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method foreColor
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method insertHorizontalRule
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method fontName
		 *
		 * change font name
		 *
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/* jshint ignore:start */
		// native commands(with execCommand), generate function for execCommand
		var commands = ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript',
						'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',
						'formatBlock', 'removeFormat',
						'backColor', 'foreColor', 'insertHorizontalRule', 'fontName'];

		for (var idx = 0, len = commands.length; idx < len; idx++) {
			this[commands[idx]] = (function (sCmd) {
				return function ($editable, value) {
					beforeCommand($editable);

					document.execCommand(sCmd, false, value);

					afterCommand($editable);
				};
			})(commands[idx]);
		}
		/* jshint ignore:end */

		/**
		 * @method tab
		 *
		 * handle tab key
		 *
		 * @param {jQuery} $editable
		 * @param {Object} options
		 */
		this.tab = function ($editable, options) {
			var rng = range.create();
			if (rng.isCollapsed() && rng.isOnCell()) {
				table.tab(rng);
			} else {
				beforeCommand($editable);
				typing.insertTab($editable, rng, options.tabsize);
				afterCommand($editable);
			}
		};

		/**
		 * @method untab
		 *
		 * handle shift+tab key
		 *
		 */
		this.untab = function () {
			var rng = range.create();
			if (rng.isCollapsed() && rng.isOnCell()) {
				table.tab(rng, true);
			}
		};

		/**
		 * @method insertParagraph
		 *
		 * insert paragraph
		 *
		 * @param {Node} $editable
		 */
		this.insertParagraph = function ($editable) {
			beforeCommand($editable);
			typing.insertParagraph($editable);
			afterCommand($editable);
		};

		/**
		 * @method insertOrderedList
		 *
		 * @param {jQuery} $editable
		 */
		this.insertOrderedList = function ($editable) {
			beforeCommand($editable);
			bullet.insertOrderedList($editable);
			afterCommand($editable);
		};

		/**
		 * @param {jQuery} $editable
		 */
		this.insertUnorderedList = function ($editable) {
			beforeCommand($editable);
			bullet.insertUnorderedList($editable);
			afterCommand($editable);
		};

		/**
		 * @param {jQuery} $editable
		 */
		this.indent = function ($editable) {
			beforeCommand($editable);
			bullet.indent($editable);
			afterCommand($editable);
		};

		/**
		 * @param {jQuery} $editable
		 */
		this.outdent = function ($editable) {
			beforeCommand($editable);
			bullet.outdent($editable);
			afterCommand($editable);
		};

		/**
		 * insert image
		 *
		 * @param {jQuery} $editable
		 * @param {String} sUrl
		 */
		this.insertImage = function ($editable, sUrl, filename) {
			async.createImage(sUrl, filename).then(function ($image) {
				beforeCommand($editable);
				$image.css({
					display: '',
					width: Math.min($editable.width(), $image.width())
				});
				range.create().insertNode($image[0]);
				range.createFromNode($image[0]).collapse().select();
				afterCommand($editable);
			}).fail(function () {
				var callbacks = $editable.data('callbacks');
				if (callbacks.onImageUploadError) {
					callbacks.onImageUploadError();
				}
			});
		};

		/**
		 * @method insertNode
		 * insert node
		 * @param {Node} $editable
		 * @param {Node} node
		 */
		this.insertNode = function ($editable, node) {
			beforeCommand($editable);
			var rng = this.createRange($editable);
			rng.insertNode(node);
			range.createFromNode(node).collapse().select();
			afterCommand($editable);
		};

		/**
		 * insert text
		 * @param {Node} $editable
		 * @param {String} text
		 */
		this.insertText = function ($editable, text) {
			beforeCommand($editable);
			var rng = this.createRange($editable);
			var textNode = rng.insertNode(dom.createText(text));
			range.create(textNode, dom.nodeLength(textNode)).select();
			afterCommand($editable);
		};

		/**
		 * formatBlock
		 *
		 * @param {jQuery} $editable
		 * @param {String} tagName
		 */
		this.formatBlock = function ($editable, tagName) {
			beforeCommand($editable);
			tagName = agent.isMSIE ? '<' + tagName + '>' : tagName;
			document.execCommand('FormatBlock', false, tagName);
			afterCommand($editable);
		};

		this.formatPara = function ($editable) {
			beforeCommand($editable);
			this.formatBlock($editable, 'P');
			afterCommand($editable);
		};

		/* jshint ignore:start */
		for (var idx = 1; idx <= 6; idx++) {
			this['formatH' + idx] = function (idx) {
				return function ($editable) {
					this.formatBlock($editable, 'H' + idx);
				};
			}(idx);
		};
		/* jshint ignore:end */

		/**
		 * fontsize
		 *
		 * @param {jQuery} $editable
		 * @param {String} value - px
		 */
		this.fontSize = function ($editable, value) {
			beforeCommand($editable);

			var rng = this.createRange($editable);
			var spans = style.styleNodes(rng);
			$.each(spans, function (idx, span) {
				$(span).css({
					'font-size': value + 'px'
				});
			});

			afterCommand($editable);
		};

		/**
		 * lineHeight
		 * @param {jQuery} $editable
		 * @param {String} value
		 */
		this.lineHeight = function ($editable, value) {
			beforeCommand($editable);
			style.stylePara(range.create(), {
				lineHeight: value
			});
			afterCommand($editable);
		};

		/**
		 * unlink
		 *
		 * @type command
		 *
		 * @param {jQuery} $editable
		 */
		this.unlink = function ($editable) {
			var rng = range.create();
			if (rng.isOnAnchor()) {
				var anchor = dom.ancestor(rng.sc, dom.isAnchor);
				rng = range.createFromNode(anchor);
				rng.select();

				beforeCommand($editable);
				document.execCommand('unlink');
				afterCommand($editable);
			}
		};

		/**
		 * create link (command)
		 *
		 * @param {jQuery} $editable
		 * @param {Object} linkInfo
		 * @param {Object} options
		 */
		this.createLink = function ($editable, linkInfo, options) {
			var linkUrl = linkInfo.url;
			var linkText = linkInfo.text;
			var isNewWindow = linkInfo.newWindow;
			var rng = linkInfo.range;
			var isTextChanged = rng.toString() !== linkText;

			beforeCommand($editable);

			if (options.onCreateLink) {
				linkUrl = options.onCreateLink(linkUrl);
			}

			var anchors;
			if (isTextChanged) {
				// Create a new link when text changed.
				var anchor = rng.insertNode($('<A>' + linkText + '</A>')[0]);
				anchors = [anchor];
			} else {
				anchors = style.styleNodes(rng, {
					nodeName: 'A',
					expandClosestSibling: true,
					onlyPartialContains: true
				});
			}

			$.each(anchors, function (idx, anchor) {
				$(anchor).attr('href', linkUrl);
				if (isNewWindow) {
					$(anchor).attr('target', '_blank');
				} else {
					$(anchor).removeAttr('target');
				}
			});

			var startRange = range.createFromNode(list.head(anchors)).collapse(true);
			var startPoint = startRange.getStartPoint();
			var endRange = range.createFromNode(list.last(anchors)).collapse();
			var endPoint = endRange.getEndPoint();

			range.create(
			  startPoint.node,
			  startPoint.offset,
			  endPoint.node,
			  endPoint.offset
			).select();

			afterCommand($editable);
		};

		/**
		 * returns link info
		 *
		 * @return {Object}
		 * @return {WrappedRange} return.range
		 * @return {String} return.text
		 * @return {Boolean} [return.isNewWindow=true]
		 * @return {String} [return.url=""]
		 */
		this.getLinkInfo = function ($editable) {
			$editable.focus();

			var rng = range.create().expand(dom.isAnchor);

			// Get the first anchor on range(for edit).
			var $anchor = $(list.head(rng.nodes(dom.isAnchor)));

			return {
				range: rng,
				text: rng.toString(),
				isNewWindow: $anchor.length ? $anchor.attr('target') === '_blank' : false,
				url: $anchor.length ? $anchor.attr('href') : ''
			};
		};

		/**
		 * setting color
		 *
		 * @param {Node} $editable
		 * @param {Object} sObjColor  color code
		 * @param {String} sObjColor.foreColor foreground color
		 * @param {String} sObjColor.backColor background color
		 */
		this.color = function ($editable, sObjColor) {
			var oColor = JSON.parse(sObjColor);
			var foreColor = oColor.foreColor, backColor = oColor.backColor;

			beforeCommand($editable);

			if (foreColor) { document.execCommand('foreColor', false, foreColor); }
			if (backColor) { document.execCommand('backColor', false, backColor); }

			afterCommand($editable);
		};

		/**
		 * insert Table
		 *
		 * @param {Node} $editable
		 * @param {String} sDim dimension of table (ex : "5x5")
		 */
		this.insertTable = function ($editable, sDim) {
			var dimension = sDim.split('x');
			beforeCommand($editable);

			var rng = range.create();
			rng = rng.deleteContents();
			rng.insertNode(table.createTable(dimension[0], dimension[1]));
			afterCommand($editable);
		};

		/**
		 * float me
		 *
		 * @param {jQuery} $editable
		 * @param {String} value
		 * @param {jQuery} $target
		 */
		this.floatMe = function ($editable, value, $target) {
			beforeCommand($editable);
			$target.css('float', value);
			afterCommand($editable);
		};

		/**
		 * change image shape
		 *
		 * @param {jQuery} $editable
		 * @param {String} value css class
		 * @param {Node} $target
		 */
		this.imageShape = function ($editable, value, $target) {
			beforeCommand($editable);

			$target.removeClass('img-rounded img-circle img-thumbnail');

			if (value) {
				$target.addClass(value);
			}

			afterCommand($editable);
		};

		/**
		 * resize overlay element
		 * @param {jQuery} $editable
		 * @param {String} value
		 * @param {jQuery} $target - target element
		 */
		this.resize = function ($editable, value, $target) {
			beforeCommand($editable);

			$target.css({
				width: value * 100 + '%',
				height: ''
			});

			afterCommand($editable);
		};

		/**
		 * @param {Position} pos
		 * @param {jQuery} $target - target element
		 * @param {Boolean} [bKeepRatio] - keep ratio
		 */
		this.resizeTo = function (pos, $target, bKeepRatio) {
			var imageSize;
			if (bKeepRatio) {
				var newRatio = pos.y / pos.x;
				var ratio = $target.data('ratio');
				imageSize = {
					width: ratio > newRatio ? pos.x : pos.y / ratio,
					height: ratio > newRatio ? pos.x * ratio : pos.y
				};
			} else {
				imageSize = {
					width: pos.x,
					height: pos.y
				};
			}

			$target.css(imageSize);
		};

		/**
		 * remove media object
		 *
		 * @param {jQuery} $editable
		 * @param {String} value - dummy argument (for keep interface)
		 * @param {jQuery} $target - target element
		 */
		this.removeMedia = function ($editable, value, $target) {
			beforeCommand($editable);
			$target.detach();

			var callbacks = $editable.data('callbacks');
			if (callbacks && callbacks.onMediaDelete) {
				callbacks.onMediaDelete($target, this, $editable);
			}

			afterCommand($editable);
		};

		/**
		 * set focus
		 *
		 * @param $editable
		 */
		this.focus = function ($editable) {
			$editable.focus();
		};
	};

	/**
	 * @class module.Button
	 *
	 * Button
	 */
	var Button = function () {
		/**
		 * update button status
		 *
		 * @param {jQuery} $container
		 * @param {Object} styleInfo
		 */
		this.update = function ($container, styleInfo) {
			/**
			 * handle dropdown's check mark (for fontname, fontsize, lineHeight).
			 * @param {jQuery} $btn
			 * @param {Number} value
			 */
			var checkDropdownMenu = function ($btn, value) {
				$btn.find('.dropdown-menu li a').each(function () {
					// always compare string to avoid creating another func.
					var isChecked = ($(this).data('value') + '') === (value + '');
					this.className = isChecked ? 'checked' : '';
				});
			};

			/**
			 * update button state(active or not).
			 *
			 * @private
			 * @param {String} selector
			 * @param {Function} pred
			 */
			var btnState = function (selector, pred) {
				var $btn = $container.find(selector);
				$btn.toggleClass('active', pred());
			};

			if (styleInfo.image) {
				var $img = $(styleInfo.image);

				btnState('button[data-event="imageShape"][data-value="img-rounded"]', function () {
					return $img.hasClass('img-rounded');
				});
				btnState('button[data-event="imageShape"][data-value="img-circle"]', function () {
					return $img.hasClass('img-circle');
				});
				btnState('button[data-event="imageShape"][data-value="img-thumbnail"]', function () {
					return $img.hasClass('img-thumbnail');
				});
				btnState('button[data-event="imageShape"]:not([data-value])', function () {
					return !$img.is('.img-rounded, .img-circle, .img-thumbnail');
				});

				var imgFloat = $img.css('float');
				btnState('button[data-event="floatMe"][data-value="left"]', function () {
					return imgFloat === 'left';
				});
				btnState('button[data-event="floatMe"][data-value="right"]', function () {
					return imgFloat === 'right';
				});
				btnState('button[data-event="floatMe"][data-value="none"]', function () {
					return imgFloat !== 'left' && imgFloat !== 'right';
				});

				var style = $img.attr('style');
				btnState('button[data-event="resize"][data-value="1"]', function () {
					return !!/(^|\s)(max-)?width\s*:\s*100%/.test(style);
				});
				btnState('button[data-event="resize"][data-value="0.5"]', function () {
					return !!/(^|\s)(max-)?width\s*:\s*50%/.test(style);
				});
				btnState('button[data-event="resize"][data-value="0.25"]', function () {
					return !!/(^|\s)(max-)?width\s*:\s*25%/.test(style);
				});
				return;
			}

			// fontname
			var $fontname = $container.find('.note-fontname');
			if ($fontname.length) {
				var selectedFont = styleInfo['font-family'];
				if (!!selectedFont) {

					var list = selectedFont.split(',');
					for (var i = 0, len = list.length; i < len; i++) {
						selectedFont = list[i].replace(/[\'\"]/g, '').replace(/\s+$/, '').replace(/^\s+/, '');
						if (agent.isFontInstalled(selectedFont)) {
							break;
						}
					}

					$fontname.find('.note-current-fontname').text(selectedFont);
					checkDropdownMenu($fontname, selectedFont);

				}
			}

			// fontsize
			var $fontsize = $container.find('.note-fontsize');
			$fontsize.find('.note-current-fontsize').text(styleInfo['font-size']);
			checkDropdownMenu($fontsize, parseFloat(styleInfo['font-size']));

			// lineheight
			var $lineHeight = $container.find('.note-height');
			checkDropdownMenu($lineHeight, parseFloat(styleInfo['line-height']));

			btnState('button[data-event="bold"]', function () {
				return styleInfo['font-bold'] === 'bold';
			});
			btnState('button[data-event="italic"]', function () {
				return styleInfo['font-italic'] === 'italic';
			});
			btnState('button[data-event="underline"]', function () {
				return styleInfo['font-underline'] === 'underline';
			});
			btnState('button[data-event="strikethrough"]', function () {
				return styleInfo['font-strikethrough'] === 'strikethrough';
			});
			btnState('button[data-event="superscript"]', function () {
				return styleInfo['font-superscript'] === 'superscript';
			});
			btnState('button[data-event="subscript"]', function () {
				return styleInfo['font-subscript'] === 'subscript';
			});
			btnState('button[data-event="justifyLeft"]', function () {
				return styleInfo['text-align'] === 'left' || styleInfo['text-align'] === 'start';
			});
			btnState('button[data-event="justifyCenter"]', function () {
				return styleInfo['text-align'] === 'center';
			});
			btnState('button[data-event="justifyRight"]', function () {
				return styleInfo['text-align'] === 'right';
			});
			btnState('button[data-event="justifyFull"]', function () {
				return styleInfo['text-align'] === 'justify';
			});
			btnState('button[data-event="insertUnorderedList"]', function () {
				return styleInfo['list-style'] === 'unordered';
			});
			btnState('button[data-event="insertOrderedList"]', function () {
				return styleInfo['list-style'] === 'ordered';
			});
		};

		/**
		 * update recent color
		 *
		 * @param {Node} button
		 * @param {String} eventName
		 * @param {Mixed} value
		 */
		this.updateRecentColor = function (button, eventName, value) {
			var $color = $(button).closest('.note-color');
			var $recentColor = $color.find('.note-recent-color');
			var colorInfo = JSON.parse($recentColor.attr('data-value'));
			colorInfo[eventName] = value;
			$recentColor.attr('data-value', JSON.stringify(colorInfo));
			var sKey = eventName === 'backColor' ? 'background-color' : 'color';
			$recentColor.find('i').css(sKey, value);
		};
	};

	/**
	 * @class module.Toolbar
	 *
	 * Toolbar
	 */
	var Toolbar = function () {
		var button = new Button();

		this.update = function ($toolbar, styleInfo) {
			button.update($toolbar, styleInfo);
		};

		/**
		 * @param {Node} button
		 * @param {String} eventName
		 * @param {String} value
		 */
		this.updateRecentColor = function (buttonNode, eventName, value) {
			button.updateRecentColor(buttonNode, eventName, value);
		};

		/**
		 * activate buttons exclude codeview
		 * @param {jQuery} $toolbar
		 */
		this.activate = function ($toolbar) {
			$toolbar.find('button')
					.not('button[data-event="codeview"]')
					.removeClass('disabled');
		};

		/**
		 * deactivate buttons exclude codeview
		 * @param {jQuery} $toolbar
		 */
		this.deactivate = function ($toolbar) {
			$toolbar.find('button')
					.not('button[data-event="codeview"]')
					.addClass('disabled');
		};

		/**
		 * @param {jQuery} $container
		 * @param {Boolean} [bFullscreen=false]
		 */
		this.updateFullscreen = function ($container, bFullscreen) {
			var $btn = $container.find('button[data-event="fullscreen"]');
			$btn.toggleClass('active', bFullscreen);
		};

		/**
		 * @param {jQuery} $container
		 * @param {Boolean} [isCodeview=false]
		 */
		this.updateCodeview = function ($container, isCodeview) {
			var $btn = $container.find('button[data-event="codeview"]');
			$btn.toggleClass('active', isCodeview);

			if (isCodeview) {
				this.deactivate($container);
			} else {
				this.activate($container);
			}
		};

		/**
		 * get button in toolbar 
		 *
		 * @param {jQuery} $editable
		 * @param {String} name
		 * @return {jQuery}
		 */
		this.get = function ($editable, name) {
			var $toolbar = dom.makeLayoutInfo($editable).toolbar();

			return $toolbar.find('[data-name=' + name + ']');
		};

		/**
		 * set button state
		 * @param {jQuery} $editable
		 * @param {String} name
		 * @param {Boolean} [isActive=true]
		 */
		this.setButtonState = function ($editable, name, isActive) {
			isActive = (isActive === false) ? false : true;

			var $button = this.get($editable, name);
			$button.toggleClass('active', isActive);
		};
	};

	var EDITABLE_PADDING = 24;

	var Statusbar = function () {
		var $document = $(document);

		this.attach = function (layoutInfo, options) {
			if (!options.disableResizeEditor) {
				layoutInfo.statusbar().on('mousedown', hStatusbarMousedown);
			}
		};

		/**
		 * `mousedown` event handler on statusbar
		 *
		 * @param {MouseEvent} event
		 */
		var hStatusbarMousedown = function (event) {
			event.preventDefault();
			event.stopPropagation();

			var $editable = dom.makeLayoutInfo(event.target).editable();
			var editableTop = $editable.offset().top - $document.scrollTop();

			var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);
			var options = layoutInfo.editor().data('options');

			$document.on('mousemove', function (event) {
				var nHeight = event.clientY - (editableTop + EDITABLE_PADDING);

				nHeight = (options.minHeight > 0) ? Math.max(nHeight, options.minHeight) : nHeight;
				nHeight = (options.maxHeight > 0) ? Math.min(nHeight, options.maxHeight) : nHeight;

				$editable.height(nHeight);
			}).one('mouseup', function () {
				$document.off('mousemove');
			});
		};
	};

	/**
	 * @class module.Popover
	 *
	 * Popover (http://getbootstrap.com/javascript/#popovers)
	 *
	 */
	var Popover = function () {
		var button = new Button();

		/**
		 * returns position from placeholder
		 *
		 * @private
		 * @param {Node} placeholder
		 * @param {Boolean} isAirMode
		 * @return {Object}
		 * @return {Number} return.left
		 * @return {Number} return.top
		 */
		var posFromPlaceholder = function (placeholder, isAirMode) {
			var $placeholder = $(placeholder);
			var pos = isAirMode ? $placeholder.offset() : $placeholder.position();
			var height = $placeholder.outerHeight(true); // include margin

			// popover below placeholder.
			return {
				left: pos.left,
				top: pos.top + height
			};
		};

		/**
		 * show popover
		 *
		 * @private
		 * @param {jQuery} popover
		 * @param {Position} pos
		 */
		var showPopover = function ($popover, pos) {
			$popover.css({
				display: 'block',
				left: pos.left,
				top: pos.top
			});
		};

		var PX_POPOVER_ARROW_OFFSET_X = 20;

		/**
		 * update current state
		 * @param {jQuery} $popover - popover container
		 * @param {Object} styleInfo - style object
		 * @param {Boolean} isAirMode
		 */
		this.update = function ($popover, styleInfo, isAirMode) {
			button.update($popover, styleInfo);

			var $linkPopover = $popover.find('.note-link-popover');
			if (styleInfo.anchor) {
				var $anchor = $linkPopover.find('a');
				var href = $(styleInfo.anchor).attr('href');
				var target = $(styleInfo.anchor).attr('target');
				$anchor.attr('href', href).html(href);
				if (!target) {
					$anchor.removeAttr('target');
				} else {
					$anchor.attr('target', '_blank');
				}
				showPopover($linkPopover, posFromPlaceholder(styleInfo.anchor, isAirMode));
			} else {
				$linkPopover.hide();
			}

			var $imagePopover = $popover.find('.note-image-popover');
			if (styleInfo.image) {
				showPopover($imagePopover, posFromPlaceholder(styleInfo.image, isAirMode));
			} else {
				$imagePopover.hide();
			}

			var $airPopover = $popover.find('.note-air-popover');
			if (isAirMode && !styleInfo.range.isCollapsed()) {
				var rect = list.last(styleInfo.range.getClientRects());
				if (rect) {
					var bnd = func.rect2bnd(rect);
					showPopover($airPopover, {
						left: Math.max(bnd.left + bnd.width / 2 - PX_POPOVER_ARROW_OFFSET_X, 0),
						top: bnd.top + bnd.height
					});
				}
			} else {
				$airPopover.hide();
			}
		};

		/**
		 * @param {Node} button
		 * @param {String} eventName
		 * @param {String} value
		 */
		this.updateRecentColor = function (button, eventName, value) {
			button.updateRecentColor(button, eventName, value);
		};

		/**
		 * hide all popovers
		 * @param {jQuery} $popover - popover container
		 */
		this.hide = function ($popover) {
			$popover.children().hide();
		};
	};

	/**
	 * @class module.Handle
	 *
	 * Handle
	 */
	var Handle = function (handler) {
		var $document = $(document);

		/**
		 * `mousedown` event handler on $handle
		 *  - controlSizing: resize image
		 *
		 * @param {MouseEvent} event
		 */
		var hHandleMousedown = function (event) {
			if (dom.isControlSizing(event.target)) {
				event.preventDefault();
				event.stopPropagation();

				var layoutInfo = dom.makeLayoutInfo(event.target),
					$handle = layoutInfo.handle(),
					$popover = layoutInfo.popover(),
					$editable = layoutInfo.editable(),
					$editor = layoutInfo.editor();

				var target = $handle.find('.note-control-selection').data('target'),
					$target = $(target), posStart = $target.offset(),
					scrollTop = $document.scrollTop();

				var isAirMode = $editor.data('options').airMode;

				$document.on('mousemove', function (event) {
					handler.invoke('editor.resizeTo', {
						x: event.clientX - posStart.left,
						y: event.clientY - (posStart.top - scrollTop)
					}, $target, !event.shiftKey);

					handler.invoke('handle.update', $handle, { image: target }, isAirMode);
					handler.invoke('popover.update', $popover, { image: target }, isAirMode);
				}).one('mouseup', function () {
					$document.off('mousemove');
					handler.invoke('editor.afterCommand', $editable);
				});

				if (!$target.data('ratio')) { // original ratio.
					$target.data('ratio', $target.height() / $target.width());
				}
			}
		};

		this.attach = function (layoutInfo) {
			layoutInfo.handle().on('mousedown', hHandleMousedown);
		};

		/**
		 * update handle
		 * @param {jQuery} $handle
		 * @param {Object} styleInfo
		 * @param {Boolean} isAirMode
		 */
		this.update = function ($handle, styleInfo, isAirMode) {
			var $selection = $handle.find('.note-control-selection');
			if (styleInfo.image) {
				var $image = $(styleInfo.image);
				var pos = isAirMode ? $image.offset() : $image.position();

				// include margin
				var imageSize = {
					w: $image.outerWidth(true),
					h: $image.outerHeight(true)
				};

				$selection.css({
					display: 'block',
					left: pos.left,
					top: pos.top,
					width: imageSize.w,
					height: imageSize.h
				}).data('target', styleInfo.image); // save current image element.
				var sizingText = imageSize.w + 'x' + imageSize.h;
				$selection.find('.note-control-selection-info').text(sizingText);
			} else {
				$selection.hide();
			}
		};

		/**
		 * hide
		 *
		 * @param {jQuery} $handle
		 */
		this.hide = function ($handle) {
			$handle.children().hide();
		};
	};

	var Fullscreen = function (handler) {
		var $window = $(window);
		var $scrollbar = $('html, body');

		/**
		 * toggle fullscreen
		 *
		 * @param {Object} layoutInfo
		 */
		this.toggle = function (layoutInfo) {

			var $editor = layoutInfo.editor(),
				$toolbar = layoutInfo.toolbar(),
				$editable = layoutInfo.editable(),
				$codable = layoutInfo.codable();

			var resize = function (size) {
				$editable.css('height', size.h);
				$codable.css('height', size.h);
				if ($codable.data('cmeditor')) {
					$codable.data('cmeditor').setsize(null, size.h);
				}
			};

			$editor.toggleClass('fullscreen');
			var isFullscreen = $editor.hasClass('fullscreen');
			if (isFullscreen) {
				$editable.data('orgheight', $editable.css('height'));

				$window.on('resize', function () {
					resize({
						h: $window.height() - $toolbar.outerHeight() - 142
				});
				}).trigger('resize');

				$scrollbar.css('overflow', 'hidden');
			} else {
				$window.off('resize');
				resize({
					h: $editable.data('orgheight')
				});
				$scrollbar.css('overflow', 'visible');
			}

			handler.invoke('toolbar.updateFullscreen', $toolbar, isFullscreen);
		};
	};


	var CodeMirror;
	if (agent.hasCodeMirror) {
		if (agent.isSupportAmd) {
			__browserify_shim_require__(['CodeMirror'], function (cm) {
				CodeMirror = cm;
			});
		} else {
			CodeMirror = window.CodeMirror;
		}
	}

	/**
	 * @class Codeview
	 */
	var Codeview = function (handler) {

		this.sync = function (layoutInfo) {
			var isCodeview = handler.invoke('codeview.isActivated', layoutInfo);
			if (isCodeview && agent.hasCodeMirror) {
				layoutInfo.codable().data('cmEditor').save();
			}
		};

		/**
		 * @param {Object} layoutInfo
		 * @return {Boolean}
		 */
		this.isActivated = function (layoutInfo) {
			var $editor = layoutInfo.editor();
			return $editor.hasClass('codeview');
		};

		/**
		 * toggle codeview
		 *
		 * @param {Object} layoutInfo
		 */
		this.toggle = function (layoutInfo) {
			if (this.isActivated(layoutInfo)) {
				this.deactivate(layoutInfo);
			} else {
				this.activate(layoutInfo);
			}
		};

		/**
		 * activate code view
		 *
		 * @param {Object} layoutInfo
		 */
		this.activate = function (layoutInfo) {
			var $editor = layoutInfo.editor(),
				$toolbar = layoutInfo.toolbar(),
				$editable = layoutInfo.editable(),
				$codable = layoutInfo.codable(),
				$popover = layoutInfo.popover(),
				$handle = layoutInfo.handle();

			var options = $editor.data('options');

			$codable.val(dom.html($editable, options.prettifyHtml));

            // uncomment script tags so they're correct in code view
			$codable.val($codable.val().replace('<!--<script', '<script'));
			$codable.val($codable.val().replace('</script>-->', '</script>'));

			$codable.height($editable.height());

			handler.invoke('toolbar.updateCodeview', $toolbar, true);
			handler.invoke('popover.hide', $popover);
			handler.invoke('handle.hide', $handle);

			$editor.addClass('codeview');

			$codable.focus();

			// activate CodeMirror as codable
			if (agent.hasCodeMirror) {
				var cmEditor = CodeMirror.fromTextArea($codable[0], options.codemirror);

				// CodeMirror TernServer
				if (options.codemirror.tern) {
					var server = new CodeMirror.TernServer(options.codemirror.tern);
					cmEditor.ternServer = server;
					cmEditor.on('cursorActivity', function (cm) {
						server.updateArgHints(cm);
					});
				}

				// CodeMirror hasn't Padding.
				cmEditor.setSize(null, $editable.outerHeight());
				$codable.data('cmEditor', cmEditor);
			}
		};

		/**
		 * deactivate code view
		 *
		 * @param {Object} layoutInfo
		 */
		this.deactivate = function (layoutInfo) {
			var $editor = layoutInfo.editor(),
				$toolbar = layoutInfo.toolbar(),
				$editable = layoutInfo.editable(),
				$codable = layoutInfo.codable();

			var options = $editor.data('options');

			// deactivate CodeMirror as codable
			if (agent.hasCodeMirror) {
				var cmEditor = $codable.data('cmEditor');
				$codable.val(cmEditor.getValue());
				cmEditor.toTextArea();
			}

			$editable.html(dom.value($codable, options.prettifyHtml) || dom.emptyPara);

		    // replace script tags so they're not executed when loaded in admin
			var codeToReplace = $editable.html();

			codeToReplace = codeToReplace.replace('<script', '<!--<script');
			codeToReplace = codeToReplace.replace('</script>', '</script>-->');

			$editable.html(codeToReplace);

			$editable.height(options.height ? $codable.height() : 'auto');
			$editor.removeClass('codeview');

			$editable.focus();

			handler.invoke('toolbar.updateCodeview', $toolbar, false);

            window.stop();
		};
	};

	var DragAndDrop = function (handler) {
		var $document = $(document);

		/**
		 * attach Drag and Drop Events
		 *
		 * @param {Object} layoutInfo - layout Informations
		 * @param {Object} options
		 */
		this.attach = function (layoutInfo, options) {
			if (options.airMode || options.disableDragAndDrop) {
				// prevent default drop event
				$document.on('drop', function (e) {
					e.preventDefault();
				});
			} else {
				this.attachDragAndDropEvent(layoutInfo, options);
			}
		};

		/**
		 * attach Drag and Drop Events
		 *
		 * @param {Object} layoutInfo - layout Informations
		 * @param {Object} options
		 */
		this.attachDragAndDropEvent = function (layoutInfo, options) {
			var collection = $(),
				$editor = layoutInfo.editor(),
				$dropzone = layoutInfo.dropzone(),
				$dropzoneMessage = $dropzone.find('.note-dropzone-message');

			// show dropzone on dragenter when dragging a object to document
			// -but only if the editor is visible, i.e. has a positive width and height
			$document.on('dragenter', function (e) {
				var isCodeview = handler.invoke('codeview.isActivated', layoutInfo);
				var hasEditorSize = $editor.width() > 0 && $editor.height() > 0;
				if (!isCodeview && !collection.length && hasEditorSize) {
					$editor.addClass('dragover');
					$dropzone.width($editor.width());
					$dropzone.height($editor.height());
					$dropzoneMessage.text(options.langInfo.image.dragImageHere);
				}
				collection = collection.add(e.target);
			}).on('dragleave', function (e) {
				collection = collection.not(e.target);
				if (!collection.length) {
					$editor.removeClass('dragover');
				}
			}).on('drop', function () {
				collection = $();
				$editor.removeClass('dragover');
			});

			// change dropzone's message on hover.
			$dropzone.on('dragenter', function () {
				$dropzone.addClass('hover');
				$dropzoneMessage.text(options.langInfo.image.dropImage);
			}).on('dragleave', function () {
				$dropzone.removeClass('hover');
				$dropzoneMessage.text(options.langInfo.image.dragImageHere);
			});

			// attach dropImage
			$dropzone.on('drop', function (event) {
				event.preventDefault();

				var dataTransfer = event.originalEvent.dataTransfer;
				var html = dataTransfer.getData('text/html');
				var text = dataTransfer.getData('text/plain');

				var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);

				if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
					layoutInfo.editable().focus();
					handler.insertImages(layoutInfo, dataTransfer.files);
				} else if (html) {
					$(html).each(function () {
						layoutInfo.editable().focus();
						handler.invoke('editor.insertNode', layoutInfo.editable(), this);
					});
				} else if (text) {
					layoutInfo.editable().focus();
					handler.invoke('editor.insertText', layoutInfo.editable(), text);
				}
			}).on('dragover', false); // prevent default dragover event
		};
	};

	var Clipboard = function (handler) {

		this.attach = function (layoutInfo) {
			layoutInfo.editable().on('paste', hPasteClipboardImage);
		};

		/**
		 * paste clipboard image
		 *
		 * @param {Event} event
		 */
		var hPasteClipboardImage = function (event) {
			var clipboardData = event.originalEvent.clipboardData;
			var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);
			var $editable = layoutInfo.editable();

			if (!clipboardData || !clipboardData.items || !clipboardData.items.length) {
				var callbacks = $editable.data('callbacks');
				// only can run if it has onImageUpload method
				if (!callbacks.onImageUpload) {
					return;
				}

				// save cursor
				handler.invoke('editor.saveNode', $editable);
				handler.invoke('editor.saveRange', $editable);

				$editable.html('');

				setTimeout(function () {
					var $img = $editable.find('img');

					// if img is no in clipboard, insert text or dom
					if (!$img.length || $img[0].src.indexOf('data:') === -1) {
						var html = $editable.html();

						handler.invoke('editor.restoreNode', $editable);
						handler.invoke('editor.restoreRange', $editable);

						try {
							// insert normal dom code
							$(html).each(function () {
								$editable.focus();
								handler.invoke('editor.insertNode', $editable, this);
							});
						} catch (ex) {
							// insert text
							$editable.focus();
							handler.invoke('editor.insertText', $editable, html);
						}
						return;
					}

					var datauri = $img[0].src;

					var data = atob(datauri.split(',')[1]);
					var array = new Uint8Array(data.length);
					for (var i = 0; i < data.length; i++) {
						array[i] = data.charCodeAt(i);
					}

					var blob = new Blob([array], { type: 'image/png' });
					blob.name = 'clipboard.png';

					handler.invoke('editor.restoreNode', $editable);
					handler.invoke('editor.restoreRange', $editable);
					handler.insertImages(layoutInfo, [blob]);

					handler.invoke('editor.afterCommand', $editable);
				}, 0);

				return;
			}

			var item = list.head(clipboardData.items);
			var isClipboardImage = item.kind === 'file' && item.type.indexOf('image/') !== -1;

			if (isClipboardImage) {
				handler.insertImages(layoutInfo, [item.getAsFile()]);
			}

			handler.invoke('editor.afterCommand', $editable);
		};
	};

	var LinkDialog = function (handler) {

		/**
		 * toggle button status
		 *
		 * @private
		 * @param {jQuery} $btn
		 * @param {Boolean} isEnable
		 */
		var toggleBtn = function ($btn, isEnable) {
			$btn.toggleClass('disabled', !isEnable);
			$btn.attr('disabled', !isEnable);
		};

		/**
		 * Show link dialog and set event handlers on dialog controls.
		 *
		 * @param {jQuery} $editable
		 * @param {jQuery} $dialog
		 * @param {Object} linkInfo
		 * @return {Promise}
		 */
		this.showLinkDialog = function ($editable, $dialog, linkInfo) {
			return $.Deferred(function (deferred) {
				var $linkDialog = $dialog.find('.note-link-dialog');

				var $linkText = $linkDialog.find('.note-link-text'),
				$linkUrl = $linkDialog.find('.note-link-url'),
				$linkBtn = $linkDialog.find('.note-link-btn'),
				$openInNewWindow = $linkDialog.find('input[type=checkbox]');

				$linkDialog.one('shown.bs.modal', function () {
					$linkText.val(linkInfo.text);

					$linkText.on('input', function () {
						// if linktext was modified by keyup,
						// stop cloning text from linkUrl
						linkInfo.text = $linkText.val();
					});

					// if no url was given, copy text to url
					if (!linkInfo.url) {
						linkInfo.url = linkInfo.text;
						toggleBtn($linkBtn, linkInfo.text);
					}

					$linkUrl.on('input', function () {
						toggleBtn($linkBtn, $linkUrl.val());
						// display same link on `Text to display` input
						// when create a new link
						if (!linkInfo.text) {
							$linkText.val($linkUrl.val());
						}
					}).val(linkInfo.url).trigger('focus').trigger('select');

					$openInNewWindow.prop('checked', linkInfo.newWindow);

					$linkBtn.one('click', function (event) {
						event.preventDefault();

						deferred.resolve({
							range: linkInfo.range,
							url: $linkUrl.val(),
							text: $linkText.val(),
							newWindow: $openInNewWindow.is(':checked')
						});
						$linkDialog.modal('hide');
					});
				}).one('hidden.bs.modal', function () {
					// detach events
					$linkText.off('input');
					$linkUrl.off('input');
					$linkBtn.off('click');

					if (deferred.state() === 'pending') {
						deferred.reject();
					}
				}).modal('show');
			}).promise();
		};

		/**
		 * @param {Object} layoutInfo
		 */
		this.show = function (layoutInfo) {
			var $editor = layoutInfo.editor(),
				$dialog = layoutInfo.dialog(),
				$editable = layoutInfo.editable(),
				$popover = layoutInfo.popover(),
				linkInfo = handler.invoke('editor.getLinkInfo', $editable);

			var options = $editor.data('options');

			handler.invoke('editor.saveRange', $editable);
			this.showLinkDialog($editable, $dialog, linkInfo).then(function (linkInfo) {
				handler.invoke('editor.restoreRange', $editable);
				handler.invoke('editor.createLink', $editable, linkInfo, options);
				// hide popover after creating link
				handler.invoke('popover.hide', $popover);
			}).fail(function () {
				handler.invoke('editor.restoreRange', $editable);
			});
		};
	};

	var ImageDialog = function (handler) {
		/**
		 * toggle button status
		 *
		 * @private
		 * @param {jQuery} $btn
		 * @param {Boolean} isEnable
		 */
		var toggleBtn = function ($btn, isEnable) {
			$btn.toggleClass('disabled', !isEnable);
			$btn.attr('disabled', !isEnable);
		};

		this.show = function (layoutInfo) {
			var $dialog = layoutInfo.dialog(),
				$editable = layoutInfo.editable();

			handler.invoke('editor.saveRange', $editable);
			this.showImageDialog($editable, $dialog).then(function (data) {
				handler.invoke('editor.restoreRange', $editable);

				if (typeof data === 'string') {
					// image url
					handler.invoke('editor.insertImage', $editable, data);
				} else {
					// array of files
					handler.insertImages(layoutInfo, data);
				}
			}).fail(function () {
				handler.invoke('editor.restoreRange', $editable);
			});
		};

		/**
		 * show image dialog
		 *
		 * @param {jQuery} $editable
		 * @param {jQuery} $dialog
		 * @return {Promise}
		 */
		this.showImageDialog = function ($editable, $dialog) {
			return $.Deferred(function (deferred) {
				var $imageDialog = $dialog.find('.note-image-dialog');

				var $imageInput = $dialog.find('.note-image-input'),
					$imageUrl = $dialog.find('.note-image-url'),
					$imageBtn = $dialog.find('.note-image-btn');

				$imageDialog.one('shown.bs.modal', function () {
					// Cloning imageInput to clear element.
					$imageInput.replaceWith($imageInput.clone()
					  .on('change', function () {
					  	deferred.resolve(this.files || this.value);
					  	$imageDialog.modal('hide');
					  })
					  .val('')
					);

					$imageBtn.click(function (event) {
						event.preventDefault();

						deferred.resolve($imageUrl.val());
						$imageDialog.modal('hide');
					});

					$imageUrl.on('keyup paste', function (event) {
						var url;

						if (event.type === 'paste') {
							url = event.originalEvent.clipboardData.getData('text');
						} else {
							url = $imageUrl.val();
						}

						toggleBtn($imageBtn, url);
					}).val('').trigger('focus');
				}).one('hidden.bs.modal', function () {
					$imageInput.off('change');
					$imageUrl.off('keyup paste');
					$imageBtn.off('click');

					if (deferred.state() === 'pending') {
						deferred.reject();
					}
				}).modal('show');
			});
		};
	};

	var HelpDialog = function (handler) {
		/**
		 * show help dialog
		 *
		 * @param {jQuery} $editable
		 * @param {jQuery} $dialog
		 * @return {Promise}
		 */
		this.showHelpDialog = function ($editable, $dialog) {
			return $.Deferred(function (deferred) {
				var $helpDialog = $dialog.find('.note-help-dialog');

				$helpDialog.one('hidden.bs.modal', function () {
					deferred.resolve();
				}).modal('show');
			}).promise();
		};

		/**
		 * @param {Object} layoutInfo
		 */
		this.show = function (layoutInfo) {
			var $dialog = layoutInfo.dialog(),
				$editable = layoutInfo.editable();

			handler.invoke('editor.saveRange', $editable, true);
			this.showHelpDialog($editable, $dialog).then(function () {
				handler.invoke('editor.restoreRange', $editable);
			});
		};
	};


	/**
	 * @class EventHandler
	 *
	 * EventHandler
	 *  - TODO: new instance per a editor
	 *  - TODO: rename EventHandler
	 */
	var EventHandler = function () {
		/**
		 * Modules
		 */
		var modules = this.modules = {
			editor: new Editor(this),
			toolbar: new Toolbar(this),
			statusbar: new Statusbar(this),
			popover: new Popover(this),
			handle: new Handle(this),
			fullscreen: new Fullscreen(this),
			codeview: new Codeview(this),
			dragAndDrop: new DragAndDrop(this),
			clipboard: new Clipboard(this),
			linkDialog: new LinkDialog(this),
			imageDialog: new ImageDialog(this),
			helpDialog: new HelpDialog(this)
		};

		// TODO refactor modules and eventHandler
		//  - remove this method and use custom event from $holder instead
		this.invoke = function () {
			var moduleAndMethod = list.head(list.from(arguments));
			var args = list.tail(list.from(arguments));

			var splits = moduleAndMethod.split('.');
			var hasSeparator = splits.length > 1;
			var moduleName = hasSeparator && list.head(splits);
			var methodName = hasSeparator ? list.last(splits) : list.head(splits);

			var module = this.getModule(moduleName);
			var method = module[methodName];

			return method && method.apply(module, args);
		};

		/**
		 * returns module
		 *
		 * @param {String} moduleName - name of module
		 * @return {Module} - defaults is editor
		 */
		this.getModule = function (moduleName) {
			return this.modules[moduleName] || this.modules.editor;
		};

		/**
		 * insert Images from file array.
		 *
		 * @private
		 * @param {Object} layoutInfo
		 * @param {File[]} files
		 */
		this.insertImages = function (layoutInfo, files) {
			var $editor = layoutInfo.editor(),
				$editable = layoutInfo.editable(),
				$holder = layoutInfo.holder();

			var callbacks = $editable.data('callbacks');
			var options = $editor.data('options');

			// If onImageUpload options setted
			if (callbacks.onImageUpload) {
				callbacks.onImageUpload(files, modules.editor, $editable);
				bindCustomEvent($holder, 'image.upload')([files]);
				// else insert Image as dataURL
			} else {
				$.each(files, function (idx, file) {
					var filename = file.name;
					if (options.maximumImageFileSize && options.maximumImageFileSize < file.size) {
						if (callbacks.onImageUploadError) {
							callbacks.onImageUploadError(options.langInfo.image.maximumFileSizeError);
							bindCustomEvent($holder, 'image.upload.error')(options.langInfo.image.maximumFileSizeError);
						} else {
							alert(options.langInfo.image.maximumFileSizeError);
						}
					} else {
						async.readFileAsDataURL(file).then(function (sDataURL) {
							modules.editor.insertImage($editable, sDataURL, filename);
						}).fail(function () {
							if (callbacks.onImageUploadError) {
								callbacks.onImageUploadError();
								bindCustomEvent($holder, 'image.upload.error')(options.langInfo.image.maximumFileSizeError);
							}
						});
					}
				});
			}
		};

		var commands = {
			/**
			 * @param {Object} layoutInfo
			 */
			showLinkDialog: function (layoutInfo) {
				modules.linkDialog.show(layoutInfo);
			},

			/**
			 * @param {Object} layoutInfo
			 */
			showImageDialog: function (layoutInfo) {
				modules.imageDialog.show(layoutInfo);
			},

			/**
			 * @param {Object} layoutInfo
			 */
			showHelpDialog: function (layoutInfo) {
				modules.helpDialog.show(layoutInfo);
			},

			/**
			 * @param {Object} layoutInfo
			 */
			fullscreen: function (layoutInfo) {
				modules.fullscreen.toggle(layoutInfo);
			},

			/**
			 * @param {Object} layoutInfo
			 */
			codeview: function (layoutInfo) {
				modules.codeview.toggle(layoutInfo);
			}
		};

		var hMousedown = function (event) {
			//preventDefault Selection for FF, IE8+
			if (dom.isImg(event.target)) {
				event.preventDefault();
			}
		};

		var hToolbarAndPopoverUpdate = function (event) {
			// delay for range after mouseup
			setTimeout(function () {
				var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);
				var styleInfo = modules.editor.currentStyle(event.target);
				if (!styleInfo) { return; }

				var isAirMode = layoutInfo.editor().data('options').airMode;
				if (!isAirMode) {
					modules.toolbar.update(layoutInfo.toolbar(), styleInfo);
				}

				modules.popover.update(layoutInfo.popover(), styleInfo, isAirMode);
				modules.handle.update(layoutInfo.handle(), styleInfo, isAirMode);
			}, 0);
		};

		var hScroll = function (event) {
			var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);
			//hide popover and handle when scrolled
			modules.popover.hide(layoutInfo.popover());
			modules.handle.hide(layoutInfo.handle());
		};

		var hToolbarAndPopoverMousedown = function (event) {
			// prevent default event when insertTable (FF, Webkit)
			var $btn = $(event.target).closest('[data-event]');
			if ($btn.length) {
				event.preventDefault();
			}
		};

		var hToolbarAndPopoverClick = function (event) {
			var $btn = $(event.target).closest('[data-event]');

			if ($btn.length) {
				var eventName = $btn.attr('data-event'),
					value = $btn.attr('data-value'),
					hide = $btn.attr('data-hide');

				var layoutInfo = dom.makeLayoutInfo(event.target);

				// before command: detect control selection element($target)
				var $target;
				if ($.inArray(eventName, ['resize', 'floatMe', 'removeMedia', 'imageShape']) !== -1) {
					var $selection = layoutInfo.handle().find('.note-control-selection');
					$target = $($selection.data('target'));
				}

				// If requested, hide the popover when the button is clicked.
				// Useful for things like showHelpDialog.
				if (hide) {
					$btn.parents('.popover').hide();
				}

				if ($.isFunction($.summernote.pluginEvents[eventName])) {
					$.summernote.pluginEvents[eventName](event, modules.editor, layoutInfo, value);
				} else if (modules.editor[eventName]) { // on command
					var $editable = layoutInfo.editable();
					$editable.focus();
					modules.editor[eventName]($editable, value, $target);
					event.preventDefault();
				} else if (commands[eventName]) {
					commands[eventName].call(this, layoutInfo);
					event.preventDefault();
				}

				// after command
				if ($.inArray(eventName, ['backColor', 'foreColor']) !== -1) {
					var options = layoutInfo.editor().data('options', options);
					var module = options.airMode ? modules.popover : modules.toolbar;
					module.updateRecentColor(list.head($btn), eventName, value);
				}

				hToolbarAndPopoverUpdate(event);
			}
		};

		var PX_PER_EM = 18;
		var hDimensionPickerMove = function (event, options) {
			var $picker = $(event.target.parentNode); // target is mousecatcher
			var $dimensionDisplay = $picker.next();
			var $catcher = $picker.find('.note-dimension-picker-mousecatcher');
			var $highlighted = $picker.find('.note-dimension-picker-highlighted');
			var $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');

			var posOffset;
			// HTML5 with jQuery - e.offsetX is undefined in Firefox
			if (event.offsetX === undefined) {
				var posCatcher = $(event.target).offset();
				posOffset = {
					x: event.pageX - posCatcher.left,
					y: event.pageY - posCatcher.top
				};
			} else {
				posOffset = {
					x: event.offsetX,
					y: event.offsetY
				};
			}

			var dim = {
				c: Math.ceil(posOffset.x / PX_PER_EM) || 1,
				r: Math.ceil(posOffset.y / PX_PER_EM) || 1
			};

			$highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });
			$catcher.attr('data-value', dim.c + 'x' + dim.r);

			if (3 < dim.c && dim.c < options.insertTableMaxSize.col) {
				$unhighlighted.css({ width: dim.c + 1 + 'em' });
			}

			if (3 < dim.r && dim.r < options.insertTableMaxSize.row) {
				$unhighlighted.css({ height: dim.r + 1 + 'em' });
			}

			$dimensionDisplay.html(dim.c + ' x ' + dim.r);
		};

		var bindCustomEvent = function ($holder, eventName) {
			return function () {
				return $holder.trigger('summernote.' + eventName, arguments);
			};
		};

		/**
		 * bind KeyMap on keydown
		 *
		 * @param {Object} layoutInfo
		 * @param {Object} keyMap
		 */
		this.bindKeyMap = function (layoutInfo, keyMap) {
			var $editor = layoutInfo.editor();
			var $editable = layoutInfo.editable();

			$editable.on('keydown', function (event) {
				var keys = [];

				// modifier
				if (event.metaKey) { keys.push('CMD'); }
				if (event.ctrlKey && !event.altKey) { keys.push('CTRL'); }
				if (event.shiftKey) { keys.push('SHIFT'); }

				// keycode
				var keyName = key.nameFromCode[event.keyCode];
				if (keyName) {
					keys.push(keyName);
				}

				var eventName = keyMap[keys.join('+')];
				if (eventName) {
					if ($.summernote.pluginEvents[eventName]) {
						var plugin = $.summernote.pluginEvents[eventName];
						if ($.isFunction(plugin)) {
							plugin(event, modules.editor, layoutInfo);
						}
					} else if (modules.editor[eventName]) {
						modules.editor[eventName]($editable, $editor.data('options'));
						event.preventDefault();
					} else if (commands[eventName]) {
						commands[eventName].call(this, layoutInfo);
						event.preventDefault();
					}
				} else if (key.isEdit(event.keyCode)) {
					modules.editor.afterCommand($editable);
				}
			});
		};

		/**
		 * attach eventhandler
		 *
		 * @param {Object} layoutInfo - layout Informations
		 * @param {Object} options - user options include custom event handlers
		 * @param {function(event)} [options.onenter] - enter key handler
		 * @param {function(event)} [options.onfocus]
		 * @param {function(event)} [options.onblur]
		 * @param {function(event)} [options.onkeyup]
		 * @param {function(event)} [options.onkeydown]
		 * @param {function(event)} [options.onpaste]
		 * @param {function(event)} [options.onToolBarclick]
		 * @param {function(event)} [options.onChange]
		 */
		this.attach = function (layoutInfo, options) {
			// handlers for editable
			if (options.shortcuts) {
				this.bindKeyMap(layoutInfo, options.keyMap[agent.isMac ? 'mac' : 'pc']);
			}
			layoutInfo.editable().on('mousedown', hMousedown);
			layoutInfo.editable().on('keyup mouseup', hToolbarAndPopoverUpdate);
			layoutInfo.editable().on('scroll', hScroll);
			modules.clipboard.attach(layoutInfo, options);

			// handler for handle and popover
			modules.handle.attach(layoutInfo, options);
			layoutInfo.popover().on('click', hToolbarAndPopoverClick);
			layoutInfo.popover().on('mousedown', hToolbarAndPopoverMousedown);

			// handler for drag and drop
			modules.dragAndDrop.attach(layoutInfo, options);

			// handlers for frame mode (toolbar, statusbar)
			if (!options.airMode) {
				// handler for toolbar
				layoutInfo.toolbar().on('click', hToolbarAndPopoverClick);
				layoutInfo.toolbar().on('mousedown', hToolbarAndPopoverMousedown);

				// handler for statusbar
				modules.statusbar.attach(layoutInfo, options);
			}

			// handler for table dimension
			var $catcherContainer = options.airMode ? layoutInfo.popover() :
													  layoutInfo.toolbar();
			var $catcher = $catcherContainer.find('.note-dimension-picker-mousecatcher');
			$catcher.css({
				width: options.insertTableMaxSize.col + 'em',
				height: options.insertTableMaxSize.row + 'em'
			}).on('mousemove', function (event) {
				hDimensionPickerMove(event, options);
			});

			// save options on editor
			layoutInfo.editor().data('options', options);

			// ret styleWithCSS for backColor / foreColor clearing with 'inherit'.
			if (!agent.isMSIE) {
				// protect FF Error: NS_ERROR_FAILURE: Failure
				setTimeout(function () {
					document.execCommand('styleWithCSS', 0, options.styleWithSpan);
				}, 0);
			}

			// History
			var history = new History(layoutInfo.editable());
			layoutInfo.editable().data('NoteHistory', history);

			// basic event callbacks (lowercase)
			// enter, focus, blur, keyup, keydown
			if (options.onenter) {
				layoutInfo.editable().keypress(function (event) {
					if (event.keyCode === key.ENTER) { options.onenter(event); }
				});
			}

			if (options.onfocus) { layoutInfo.editable().focus(options.onfocus); }
			if (options.onblur) { layoutInfo.editable().blur(options.onblur); }
			if (options.onkeyup) { layoutInfo.editable().keyup(options.onkeyup); }
			if (options.onkeydown) { layoutInfo.editable().keydown(options.onkeydown); }
			if (options.onpaste) { layoutInfo.editable().on('paste', options.onpaste); }

			// callbacks for advanced features (camel)

			// onToolbarClick
			if (options.onToolbarClick) {
				layoutInfo.toolbar().click(options.onToolbarClick);
			}

			// onChange
			if (options.onChange) {
				var hChange = function () {
					modules.editor.triggerOnChange(layoutInfo.editable());
				};

				if (agent.isMSIE) {
					var sDomEvents = 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted';
					layoutInfo.editable().on(sDomEvents, hChange);
				} else {
					layoutInfo.editable().on('input', hChange);
				}
			}

			// All editor status will be saved on editable with jquery's data
			// for support multiple editor with singleton object.
			layoutInfo.editable().data('callbacks', {
				onBeforeChange: options.onBeforeChange,
				onChange: options.onChange,
				onAutoSave: options.onAutoSave,
				onImageUpload: options.onImageUpload,
				onImageUploadError: options.onImageUploadError,
				onFileUpload: options.onFileUpload,
				onFileUploadError: options.onFileUpload,
				onMediaDelete: options.onMediaDelete
			});

			// Textarea: auto filling the code before form submit.
			if (dom.isTextarea(list.head(layoutInfo.holder()))) {
				layoutInfo.holder().closest('form').submit(function () {
					var contents = layoutInfo.holder().code();
					layoutInfo.holder().val(contents);

					// callback on submit
					if (options.onsubmit) {
						options.onsubmit(contents);
					}
				});
			}
		};

		/**
		 * attach jquery custom event
		 *
		 * @param {Object} layoutInfo - layout Informations
		 */
		this.attachCustomEvent = function (layoutInfo, options) {
			var $holder = layoutInfo.holder();
			var $editable = layoutInfo.editable();

			$editable.on('mousedown', bindCustomEvent($holder, 'mousedown'));
			$editable.on('keyup mouseup', bindCustomEvent($holder, 'update'));
			$editable.on('scroll', bindCustomEvent($holder, 'scroll'));

			// basic event callbacks (lowercase)
			// enter, focus, blur, keyup, keydown
			$editable.keypress(function (event) {
				if (event.keyCode === key.ENTER) {
					bindCustomEvent($holder, 'enter').call(this, event);
				}
			});

			$editable.focus(bindCustomEvent($holder, 'focus'));
			$editable.blur(bindCustomEvent($holder, 'blur'));
			$editable.keyup(bindCustomEvent($holder, 'keyup'));
			$editable.keydown(bindCustomEvent($holder, 'keydown'));
			$editable.on('paste', bindCustomEvent($holder, 'paste'));

			// callbacks for advanced features (camel)
			if (!options.airMode) {
				layoutInfo.toolbar().click(bindCustomEvent($holder, 'toolbar.click'));
				layoutInfo.popover().click(bindCustomEvent($holder, 'popover.click'));
			}

			if (agent.isMSIE) {
				var sDomEvents = 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted';
				$editable.on(sDomEvents, bindCustomEvent($holder, 'change'));
			} else {
				$editable.on('input', bindCustomEvent($holder, 'change'));
			}

			// Textarea: auto filling the code before form submit.
			if (dom.isTextarea(list.head($holder))) {
				$holder.closest('form').submit(function (e) {
					var contents = $holder.code();
					bindCustomEvent($holder, 'submit').call(this, e, contents);
				});
			}

			// fire init event
			bindCustomEvent($holder, 'init')();

			// fire plugin init event
			for (var i = 0, len = $.summernote.plugins.length; i < len; i++) {
				if ($.isFunction($.summernote.plugins[i].init)) {
					$.summernote.plugins[i].init(layoutInfo);
				}
			}
		};

		this.detach = function (layoutInfo, options) {
			layoutInfo.holder().off();
			layoutInfo.editable().off();

			layoutInfo.popover().off();
			layoutInfo.handle().off();
			layoutInfo.dialog().off();

			if (!options.airMode) {
				layoutInfo.dropzone().off();
				layoutInfo.toolbar().off();
				layoutInfo.statusbar().off();
			}
		};
	};

	/**
	 * @class Renderer
	 *
	 * renderer
	 *
	 * rendering toolbar and editable
	 */
	var Renderer = function () {

		/**
		 * bootstrap button template
		 * @private
		 * @param {String} label button name
		 * @param {Object} [options] button options
		 * @param {String} [options.event] data-event
		 * @param {String} [options.className] button's class name
		 * @param {String} [options.value] data-value
		 * @param {String} [options.title] button's title for popup
		 * @param {String} [options.dropdown] dropdown html
		 * @param {String} [options.hide] data-hide
		 */
		var tplButton = function (label, options) {
			var event = options.event;
			var value = options.value;
			var title = options.title;
			var className = options.className;
			var dropdown = options.dropdown;
			var hide = options.hide;

			return '<button type="button"' +
					   ' class="btn btn-default btn-sm btn-small' +
						 (className ? ' ' + className : '') +
						 (dropdown ? ' dropdown-toggle' : '') +
					   '"' +
					   (dropdown ? ' data-toggle="dropdown"' : '') +
					   (title ? ' title="' + title + '"' : '') +
					   (event ? ' data-event="' + event + '"' : '') +
					   (value ? ' data-value=\'' + value + '\'' : '') +
					   (hide ? ' data-hide=\'' + hide + '\'' : '') +
					   ' tabindex="-1">' +
					 label +
					 (dropdown ? ' <span class="caret"></span>' : '') +
				   '</button>' +
				   (dropdown || '');
		};

		/**
		 * bootstrap icon button template
		 * @private
		 * @param {String} iconClassName
		 * @param {Object} [options]
		 * @param {String} [options.event]
		 * @param {String} [options.value]
		 * @param {String} [options.title]
		 * @param {String} [options.dropdown]
		 */
		var tplIconButton = function (iconClassName, options) {
			var label = '<i class="' + iconClassName + '"></i>';
			return tplButton(label, options);
		};

		/**
		 * bootstrap popover template
		 * @private
		 * @param {String} className
		 * @param {String} content
		 */
		var tplPopover = function (className, content) {
			var $popover = $('<div class="' + className + ' popover bottom in" style="display: none;">' +
					 '<div class="arrow"></div>' +
					 '<div class="popover-content">' +
					 '</div>' +
				   '</div>');

			$popover.find('.popover-content').append(content);
			return $popover;
		};

		/**
		 * bootstrap dialog template
		 *
		 * @param {String} className
		 * @param {String} [title='']
		 * @param {String} body
		 * @param {String} [footer='']
		 */
		var tplDialog = function (className, title, body, footer) {
			return '<div class="' + className + ' modal" aria-hidden="false">' +
					 '<div class="modal-dialog">' +
					   '<div class="modal-content">' +
						 (title ?
						 '<div class="modal-header">' +
						   '<button type="button" class="close" aria-hidden="true" tabindex="-1">&times;</button>' +
						   '<h4 class="modal-title">' + title + '</h4>' +
						 '</div>' : ''
						 ) +
						 '<form class="note-modal-form">' +
						   '<div class="modal-body">' + body + '</div>' +
						   (footer ?
						   '<div class="modal-footer">' + footer + '</div>' : ''
						   ) +
						 '</form>' +
					   '</div>' +
					 '</div>' +
				   '</div>';
		};

		var tplButtonInfo = {
			picture: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'picture-o', {
					event: 'showImageDialog',
					title: lang.image.image,
					hide: true
				});
			},
			link: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'link', {
					event: 'showLinkDialog',
					title: lang.link.link,
					hide: true
				});
			},
			table: function (lang, options) {
				var dropdown = '<ul class="note-table dropdown-menu">' +
								 '<div class="note-dimension-picker">' +
								   '<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>' +
								   '<div class="note-dimension-picker-highlighted"></div>' +
								   '<div class="note-dimension-picker-unhighlighted"></div>' +
								 '</div>' +
								 '<div class="note-dimension-display"> 1 x 1 </div>' +
							   '</ul>';
				return tplIconButton(options.iconPrefix + 'table', {
					title: lang.table.table,
					dropdown: dropdown
				});
			},
			style: function (lang, options) {
				var items = options.styleTags.reduce(function (memo, v) {
					var label = lang.style[v === 'p' ? 'normal' : v];
					return memo + '<li><a data-event="formatBlock" href="#" data-value="' + v + '">' +
							 (
							   (v === 'p' || v === 'pre') ? label :
							   '<' + v + '>' + label + '</' + v + '>'
							 ) +
						   '</a></li>';
				}, '');

				return tplIconButton(options.iconPrefix + 'magic', {
					title: lang.style.style,
					dropdown: '<ul class="dropdown-menu">' + items + '</ul>'
				});
			},
			fontname: function (lang, options) {
				var realFontList = [];
				var items = options.fontNames.reduce(function (memo, v) {
					if (!agent.isFontInstalled(v) && options.fontNamesIgnoreCheck.indexOf(v) === -1) {
						return memo;
					}
					realFontList.push(v);
					return memo + '<li><a data-event="fontName" href="#" data-value="' + v + '" style="font-family:\'' + v + '\'">' +
									'<i class="' + options.iconPrefix + 'check"></i> ' + v +
								  '</a></li>';
				}, '');

				var hasDefaultFont = agent.isFontInstalled(options.defaultFontName);
				var defaultFontName = (hasDefaultFont) ? options.defaultFontName : realFontList[0];

				var label = '<span class="note-current-fontname">' +
								defaultFontName +
							 '</span>';
				return tplButton(label, {
					title: lang.font.name,
					dropdown: '<ul class="dropdown-menu">' + items + '</ul>'
				});
			},
			color: function (lang, options) {
				var colorButtonLabel = '<i class="' + options.iconPrefix + 'font" style="color:black;background-color:yellow;"></i>';
				var colorButton = tplButton(colorButtonLabel, {
					className: 'note-recent-color',
					title: lang.color.recent,
					event: 'color',
					value: '{"backColor":"yellow"}'
				});

				var dropdown = '<ul class="dropdown-menu">' +
								 '<li>' +
								   '<div class="btn-group">' +
									 '<div class="note-palette-title">' + lang.color.background + '</div>' +
									 '<div class="note-color-reset" data-event="backColor"' +
									   ' data-value="inherit" title="' + lang.color.transparent + '">' +
									   lang.color.setTransparent +
									 '</div>' +
									 '<div class="note-color-palette" data-target-event="backColor"></div>' +
								   '</div>' +
								   '<div class="btn-group">' +
									 '<div class="note-palette-title">' + lang.color.foreground + '</div>' +
									 '<div class="note-color-reset" data-event="foreColor" data-value="inherit" title="' + lang.color.reset + '">' +
									   lang.color.resetToDefault +
									 '</div>' +
									 '<div class="note-color-palette" data-target-event="foreColor"></div>' +
								   '</div>' +
								 '</li>' +
							   '</ul>';

				var moreButton = tplButton('', {
					title: lang.color.more,
					dropdown: dropdown
				});

				return colorButton + moreButton;
			},
			bold: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'bold', {
					event: 'bold',
					title: lang.font.bold
				});
			},
			italic: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'italic', {
					event: 'italic',
					title: lang.font.italic
				});
			},
			underline: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'underline', {
					event: 'underline',
					title: lang.font.underline
				});
			},
			clear: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'eraser', {
					event: 'removeFormat',
					title: lang.font.clear
				});
			},
			ul: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'list-ul', {
					event: 'insertUnorderedList',
					title: lang.lists.unordered
				});
			},
			ol: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'list-ol', {
					event: 'insertOrderedList',
					title: lang.lists.ordered
				});
			},
			paragraph: function (lang, options) {
				var leftButton = tplIconButton(options.iconPrefix + 'align-left', {
					title: lang.paragraph.left,
					event: 'justifyLeft'
				});
				var centerButton = tplIconButton(options.iconPrefix + 'align-center', {
					title: lang.paragraph.center,
					event: 'justifyCenter'
				});
				var rightButton = tplIconButton(options.iconPrefix + 'align-right', {
					title: lang.paragraph.right,
					event: 'justifyRight'
				});
				var justifyButton = tplIconButton(options.iconPrefix + 'align-justify', {
					title: lang.paragraph.justify,
					event: 'justifyFull'
				});

				var outdentButton = tplIconButton(options.iconPrefix + 'outdent', {
					title: lang.paragraph.outdent,
					event: 'outdent'
				});
				var indentButton = tplIconButton(options.iconPrefix + 'indent', {
					title: lang.paragraph.indent,
					event: 'indent'
				});

				var dropdown = '<div class="dropdown-menu">' +
								 '<div class="note-align btn-group">' +
								   leftButton + centerButton + rightButton + justifyButton +
								 '</div>' +
								 '<div class="note-list btn-group">' +
								   indentButton + outdentButton +
								 '</div>' +
							   '</div>';

				return tplIconButton(options.iconPrefix + 'align-left', {
					title: lang.paragraph.paragraph,
					dropdown: dropdown
				});
			},
			height: function (lang, options) {
				var items = options.lineHeights.reduce(function (memo, v) {
					return memo + '<li><a data-event="lineHeight" href="#" data-value="' + parseFloat(v) + '">' +
									'<i class="' + options.iconPrefix + 'check"></i> ' + v +
								  '</a></li>';
				}, '');

				return tplIconButton(options.iconPrefix + 'text-height', {
					title: lang.font.height,
					dropdown: '<ul class="dropdown-menu">' + items + '</ul>'
				});

			},
			help: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'question', {
					event: 'showHelpDialog',
					title: lang.options.help,
					hide: true
				});
			},
			fullscreen: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'arrows-alt', {
					event: 'fullscreen',
					title: lang.options.fullscreen
				});
			},
			codeview: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'code', {
					event: 'codeview',
					title: lang.options.codeview
				});
			},
			undo: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'undo', {
					event: 'undo',
					title: lang.history.undo
				});
			},
			redo: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'repeat', {
					event: 'redo',
					title: lang.history.redo
				});
			},
			hr: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'minus', {
					event: 'insertHorizontalRule',
					title: lang.hr.insert
				});
			}
		};

		var tplPopovers = function (lang, options) {
			var tplLinkPopover = function () {
				var linkButton = tplIconButton(options.iconPrefix + 'edit', {
					title: lang.link.edit,
					event: 'showLinkDialog',
					hide: true
				});
				var unlinkButton = tplIconButton(options.iconPrefix + 'unlink', {
					title: lang.link.unlink,
					event: 'unlink'
				});
				var content = '<a href="http://www.google.com" target="_blank">www.google.com</a>&nbsp;&nbsp;' +
							  '<div class="note-insert btn-group">' +
								linkButton + unlinkButton +
							  '</div>';
				return tplPopover('note-link-popover', content);
			};

			var tplImagePopover = function () {
				var fullButton = tplButton('<span class="note-fontsize-10">100%</span>', {
					title: lang.image.resizeFull,
					event: 'resize',
					value: '1'
				});
				var halfButton = tplButton('<span class="note-fontsize-10">50%</span>', {
					title: lang.image.resizeHalf,
					event: 'resize',
					value: '0.5'
				});
				var quarterButton = tplButton('<span class="note-fontsize-10">25%</span>', {
					title: lang.image.resizeQuarter,
					event: 'resize',
					value: '0.25'
				});

				var leftButton = tplIconButton(options.iconPrefix + 'align-left', {
					title: lang.image.floatLeft,
					event: 'floatMe',
					value: 'left'
				});
				var rightButton = tplIconButton(options.iconPrefix + 'align-right', {
					title: lang.image.floatRight,
					event: 'floatMe',
					value: 'right'
				});
				var justifyButton = tplIconButton(options.iconPrefix + 'align-justify', {
					title: lang.image.floatNone,
					event: 'floatMe',
					value: 'none'
				});

				var roundedButton = tplIconButton(options.iconPrefix + 'square', {
					title: lang.image.shapeRounded,
					event: 'imageShape',
					value: 'img-rounded'
				});
				var circleButton = tplIconButton(options.iconPrefix + 'circle-o', {
					title: lang.image.shapeCircle,
					event: 'imageShape',
					value: 'img-circle'
				});
				var thumbnailButton = tplIconButton(options.iconPrefix + 'picture-o', {
					title: lang.image.shapeThumbnail,
					event: 'imageShape',
					value: 'img-thumbnail'
				});
				var noneButton = tplIconButton(options.iconPrefix + 'times', {
					title: lang.image.shapeNone,
					event: 'imageShape',
					value: ''
				});

				var removeButton = tplIconButton(options.iconPrefix + 'trash-o', {
					title: lang.image.remove,
					event: 'removeMedia',
					value: 'none'
				});

				var content = '<div class="btn-group">' + fullButton + halfButton + quarterButton + '</div>' +
							  '<div class="btn-group">' + leftButton + rightButton + justifyButton + '</div>' +
							  '<div class="btn-group">' + roundedButton + circleButton + thumbnailButton + noneButton + '</div>' +
							  '<div class="btn-group">' + removeButton + '</div>';
				return tplPopover('note-image-popover', content);
			};

			var tplAirPopover = function () {
				var $content = $('<div />');
				for (var idx = 0, len = options.airPopover.length; idx < len; idx++) {
					var group = options.airPopover[idx];

					var $group = $('<div class="note-' + group[0] + ' btn-group">');
					for (var i = 0, lenGroup = group[1].length; i < lenGroup; i++) {
						var $button = $(tplButtonInfo[group[1][i]](lang, options));

						$button.attr('data-name', group[1][i]);

						$group.append($button);
					}
					$content.append($group);
				}

				return tplPopover('note-air-popover', $content.children());
			};

			var $notePopover = $('<div class="note-popover" />');

			$notePopover.append(tplLinkPopover());
			$notePopover.append(tplImagePopover());

			if (options.airMode) {
				$notePopover.append(tplAirPopover());
			}

			return $notePopover;
		};

		var tplHandles = function () {
			return '<div class="note-handle">' +
					 '<div class="note-control-selection">' +
					   '<div class="note-control-selection-bg"></div>' +
					   '<div class="note-control-holder note-control-nw"></div>' +
					   '<div class="note-control-holder note-control-ne"></div>' +
					   '<div class="note-control-holder note-control-sw"></div>' +
					   '<div class="note-control-sizing note-control-se"></div>' +
					   '<div class="note-control-selection-info"></div>' +
					 '</div>' +
				   '</div>';
		};

		/**
		 * shortcut table template
		 * @param {String} title
		 * @param {String} body
		 */
		var tplShortcut = function (title, keys) {
			var keyClass = 'note-shortcut-col col-xs-6 note-shortcut-';
			var body = [];

			for (var i in keys) {
				if (keys.hasOwnProperty(i)) {
					body.push(
					  '<div class="' + keyClass + 'key">' + keys[i].kbd + '</div>' +
					  '<div class="' + keyClass + 'name">' + keys[i].text + '</div>'
					  );
				}
			}

			return '<div class="note-shortcut-row row"><div class="' + keyClass + 'title col-xs-offset-6">' + title + '</div></div>' +
				   '<div class="note-shortcut-row row">' + body.join('</div><div class="note-shortcut-row row">') + '</div>';
		};

		var tplShortcutText = function (lang) {
			var keys = [
			  { kbd: '⌘ + B', text: lang.font.bold },
			  { kbd: '⌘ + I', text: lang.font.italic },
			  { kbd: '⌘ + U', text: lang.font.underline },
			  { kbd: '⌘ + \\', text: lang.font.clear }
			];

			return tplShortcut(lang.shortcut.textFormatting, keys);
		};

		var tplShortcutAction = function (lang) {
			var keys = [
			  { kbd: '⌘ + Z', text: lang.history.undo },
			  { kbd: '⌘ + ⇧ + Z', text: lang.history.redo },
			  { kbd: '⌘ + ]', text: lang.paragraph.indent },
			  { kbd: '⌘ + [', text: lang.paragraph.outdent },
			  { kbd: '⌘ + ENTER', text: lang.hr.insert }
			];

			return tplShortcut(lang.shortcut.action, keys);
		};

		var tplShortcutPara = function (lang) {
			var keys = [
			  { kbd: '⌘ + ⇧ + L', text: lang.paragraph.left },
			  { kbd: '⌘ + ⇧ + E', text: lang.paragraph.center },
			  { kbd: '⌘ + ⇧ + R', text: lang.paragraph.right },
			  { kbd: '⌘ + ⇧ + J', text: lang.paragraph.justify },
			  { kbd: '⌘ + ⇧ + NUM7', text: lang.lists.ordered },
			  { kbd: '⌘ + ⇧ + NUM8', text: lang.lists.unordered }
			];

			return tplShortcut(lang.shortcut.paragraphFormatting, keys);
		};

		var tplShortcutStyle = function (lang) {
			var keys = [
			  { kbd: '⌘ + NUM0', text: lang.style.normal },
			  { kbd: '⌘ + NUM1', text: lang.style.h1 },
			  { kbd: '⌘ + NUM2', text: lang.style.h2 },
			  { kbd: '⌘ + NUM3', text: lang.style.h3 },
			  { kbd: '⌘ + NUM4', text: lang.style.h4 },
			  { kbd: '⌘ + NUM5', text: lang.style.h5 },
			  { kbd: '⌘ + NUM6', text: lang.style.h6 }
			];

			return tplShortcut(lang.shortcut.documentStyle, keys);
		};

		var tplExtraShortcuts = function (lang, options) {
			var extraKeys = options.extraKeys;
			var keys = [];

			for (var key in extraKeys) {
				if (extraKeys.hasOwnProperty(key)) {
					keys.push({ kbd: key, text: extraKeys[key] });
				}
			}

			return tplShortcut(lang.shortcut.extraKeys, keys);
		};

		var tplShortcutTable = function (lang, options) {
			var colClass = 'class="note-shortcut note-shortcut-col col-sm-6 col-xs-12"';
			var template = [
			  '<div ' + colClass + '>' + tplShortcutAction(lang, options) + '</div>' +
			  '<div ' + colClass + '>' + tplShortcutText(lang, options) + '</div>',
			  '<div ' + colClass + '>' + tplShortcutStyle(lang, options) + '</div>' +
			  '<div ' + colClass + '>' + tplShortcutPara(lang, options) + '</div>'
			];

			if (options.extraKeys) {
				template.push('<div ' + colClass + '>' + tplExtraShortcuts(lang, options) + '</div>');
			}

			return '<div class="note-shortcut-row row">' +
					 template.join('</div><div class="note-shortcut-row row">') +
				   '</div>';
		};

		var replaceMacKeys = function (sHtml) {
			return sHtml.replace(/⌘/g, 'Ctrl').replace(/⇧/g, 'Shift');
		};

		var tplDialogInfo = {
			image: function (lang, options) {
				var imageLimitation = '';
				if (options.maximumImageFileSize) {
					var unit = Math.floor(Math.log(options.maximumImageFileSize) / Math.log(1024));
					var readableSize = (options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 +
									   ' ' + ' KMGTP'[unit] + 'B';
					imageLimitation = '<small>' + lang.image.maximumFileSize + ' : ' + readableSize + '</small>';
				}

				var body = '<div class="form-group row-fluid note-group-select-from-files">' +
							 '<label>' + lang.image.selectFromFiles + '</label>' +
							 '<input class="note-image-input" type="file" name="files" accept="image/*" multiple="multiple" />' +
							 imageLimitation +
						   '</div>' +
						   '<div class="form-group row-fluid">' +
							 '<label>' + lang.image.url + '</label>' +
							 '<input class="note-image-url form-control span12" type="text" />' +
						   '</div>';
				var footer = '<button href="#" class="btn btn-primary note-image-btn disabled" disabled>' + lang.image.insert + '</button>';
				return tplDialog('note-image-dialog', lang.image.insert, body, footer);
			},

			link: function (lang, options) {
				var body = '<div class="form-group row-fluid">' +
							 '<label>' + lang.link.textToDisplay + '</label>' +
							 '<input class="note-link-text form-control span12" type="text" />' +
						   '</div>' +
						   '<div class="form-group row-fluid">' +
							 '<label>' + lang.link.url + '</label>' +
							 '<input class="note-link-url form-control span12" type="text" />' +
						   '</div>' +
						   (!options.disableLinkTarget ?
							 '<div class="checkbox">' +
							   '<label>' + '<input type="checkbox" checked> ' +
								 lang.link.openInNewWindow +
							   '</label>' +
							 '</div>' : ''
						   );
				var footer = '<button href="#" class="btn btn-primary note-link-btn disabled" disabled>' + lang.link.insert + '</button>';
				return tplDialog('note-link-dialog', lang.link.insert, body, footer);
			},

			help: function (lang, options) {
				var body = '<a class="modal-close pull-right" aria-hidden="true" tabindex="-1">' + lang.shortcut.close + '</a>' +
						   '<div class="title">' + lang.shortcut.shortcuts + '</div>' +
						   (agent.isMac ? tplShortcutTable(lang, options) : replaceMacKeys(tplShortcutTable(lang, options))) +
						   '<p class="text-center">' +
							 '<a href="//summernote.org/" target="_blank">Summernote 0.6.3</a> · ' +
							 '<a href="//github.com/summernote/summernote" target="_blank">Project</a> · ' +
							 '<a href="//github.com/summernote/summernote/issues" target="_blank">Issues</a>' +
						   '</p>';
				return tplDialog('note-help-dialog', '', body, '');
			}
		};

		var tplDialogs = function (lang, options) {
			var dialogs = '';

			$.each(tplDialogInfo, function (idx, tplDialog) {
				dialogs += tplDialog(lang, options);
			});

			return '<div class="note-dialog">' + dialogs + '</div>';
		};

		var tplStatusbar = function () {
			return '<div class="note-resizebar">' +
					 '<div class="note-icon-bar"></div>' +
					 '<div class="note-icon-bar"></div>' +
					 '<div class="note-icon-bar"></div>' +
				   '</div>';
		};

		var representShortcut = function (str) {
			if (agent.isMac) {
				str = str.replace('CMD', '⌘').replace('SHIFT', '⇧');
			}

			return str.replace('BACKSLASH', '\\')
					  .replace('SLASH', '/')
					  .replace('LEFTBRACKET', '[')
					  .replace('RIGHTBRACKET', ']');
		};

		/**
		 * createTooltip
		 *
		 * @param {jQuery} $container
		 * @param {Object} keyMap
		 * @param {String} [sPlacement]
		 */
		var createTooltip = function ($container, keyMap, sPlacement) {
			var invertedKeyMap = func.invertObject(keyMap);
			var $buttons = $container.find('button');

			$buttons.each(function (i, elBtn) {
				var $btn = $(elBtn);
				var sShortcut = invertedKeyMap[$btn.data('event')];
				if (sShortcut) {
					$btn.attr('title', function (i, v) {
						return v + ' (' + representShortcut(sShortcut) + ')';
					});
				}
				// bootstrap tooltip on btn-group bug
				// https://github.com/twbs/bootstrap/issues/5687
			}).tooltip({
				container: 'body',
				trigger: 'hover',
				placement: sPlacement || 'top'
			}).on('click', function () {
				$(this).tooltip('hide');
			});
		};

		// createPalette
		var createPalette = function ($container, options) {
			var colorInfo = options.colors;
			$container.find('.note-color-palette').each(function () {
				var $palette = $(this), eventName = $palette.attr('data-target-event');
				var paletteContents = [];
				for (var row = 0, lenRow = colorInfo.length; row < lenRow; row++) {
					var colors = colorInfo[row];
					var buttons = [];
					for (var col = 0, lenCol = colors.length; col < lenCol; col++) {
						var color = colors[col];
						buttons.push(['<button type="button" class="note-color-btn" style="background-color:', color,
									   ';" data-event="', eventName,
									   '" data-value="', color,
									   '" title="', color,
									   '" data-toggle="button" tabindex="-1"></button>'].join(''));
					}
					paletteContents.push('<div class="note-color-row">' + buttons.join('') + '</div>');
				}
				$palette.html(paletteContents.join(''));
			});
		};

		/**
		 * create summernote layout (air mode)
		 *
		 * @param {jQuery} $holder
		 * @param {Object} options
		 */
		this.createLayoutByAirMode = function ($holder, options) {
			var langInfo = options.langInfo;
			var keyMap = options.keyMap[agent.isMac ? 'mac' : 'pc'];
			var id = func.uniqueId();

			$holder.addClass('note-air-editor note-editable');
			$holder.attr({
				'id': 'note-editor-' + id,
				'contentEditable': true
			});

			var body = document.body;

			// create Popover
			var $popover = $(tplPopovers(langInfo, options));
			$popover.addClass('note-air-layout');
			$popover.attr('id', 'note-popover-' + id);
			$popover.appendTo(body);
			createTooltip($popover, keyMap);
			createPalette($popover, options);

			// create Handle
			var $handle = $(tplHandles());
			$handle.addClass('note-air-layout');
			$handle.attr('id', 'note-handle-' + id);
			$handle.appendTo(body);

			// create Dialog
			var $dialog = $(tplDialogs(langInfo, options));
			$dialog.addClass('note-air-layout');
			$dialog.attr('id', 'note-dialog-' + id);
			$dialog.find('button.close, a.modal-close').click(function () {
				$(this).closest('.modal').modal('hide');
			});
			$dialog.appendTo(body);
		};

		/**
		 * create summernote layout (normal mode)
		 *
		 * @param {jQuery} $holder
		 * @param {Object} options
		 */
		this.createLayoutByFrame = function ($holder, options) {
			var langInfo = options.langInfo;

			var isContentEditable = !$holder.is(':disabled');

			//01. create Editor
			var $editor = $('<div class="note-editor editable-' + isContentEditable + '"></div>');
			if (options.width) {
				$editor.width(options.width);
			}

			//02. statusbar (resizebar)
			if (options.height > 0) {
				$('<div class="note-statusbar">' + (options.disableResizeEditor ? '' : tplStatusbar()) + '</div>').prependTo($editor);
			}

			//03. create Editable

			var $editable = $('<div class="note-editable" contentEditable="' + isContentEditable + '"></div>')
				.prependTo($editor);
			if (options.height) {
				$editable.height(options.height);
			}
			if (options.direction) {
				$editable.attr('dir', options.direction);
			}
			var placeholder = $holder.attr('placeholder') || options.placeholder;
			if (placeholder) {
				$editable.attr('data-placeholder', placeholder);
			}

			$editable.html(dom.html($holder));

			//031. create codable
			$('<textarea class="note-codable"></textarea>').prependTo($editor);

			//04. create Toolbar
			var $toolbar = $('<div class="note-toolbar btn-toolbar" />');
			for (var idx = 0, len = options.toolbar.length; idx < len; idx++) {
				var groupName = options.toolbar[idx][0];
				var groupButtons = options.toolbar[idx][1];

				var $group = $('<div class="note-' + groupName + ' btn-group" />');
				for (var i = 0, btnLength = groupButtons.length; i < btnLength; i++) {
					var buttonInfo = tplButtonInfo[groupButtons[i]];
					// continue creating toolbar even if a button doesn't exist
					if (!$.isFunction(buttonInfo)) { continue; }

					var $button = $(buttonInfo(langInfo, options));
					$button.attr('data-name', groupButtons[i]);  // set button's alias, becuase to get button element from $toolbar
					$group.append($button);
				}
				$toolbar.append($group);
			}

			$toolbar.prependTo($editor);
			var keyMap = options.keyMap[agent.isMac ? 'mac' : 'pc'];
			createPalette($toolbar, options);
			createTooltip($toolbar, keyMap, 'bottom');

			//05. create Popover
			var $popover = $(tplPopovers(langInfo, options)).prependTo($editor);
			createPalette($popover, options);
			createTooltip($popover, keyMap);

			//06. handle(control selection, ...)
			$(tplHandles()).prependTo($editor);

			//07. create Dialog
			var $dialog = $(tplDialogs(langInfo, options)).prependTo($editor);
			$dialog.find('button.close, a.modal-close').click(function () {
				$(this).closest('.modal').modal('hide');
			});

			//08. create Dropzone
			$('<div class="note-dropzone"><div class="note-dropzone-message"></div></div>').prependTo($editor);

			//09. Editor/Holder switch
			$editor.insertAfter($holder);
			$holder.hide();
		};

		this.hasNoteEditor = function ($holder) {
			return this.noteEditorFromHolder($holder).length > 0;
		};

		this.noteEditorFromHolder = function ($holder) {
			if ($holder.hasClass('note-air-editor')) {
				return $holder;
			} else if ($holder.next().hasClass('note-editor')) {
				return $holder.next();
			} else {
				return $();
			}
		};

		/**
		 * create summernote layout
		 *
		 * @param {jQuery} $holder
		 * @param {Object} options
		 */
		this.createLayout = function ($holder, options) {
			if (options.airMode) {
				this.createLayoutByAirMode($holder, options);
			} else {
				this.createLayoutByFrame($holder, options);
			}
		};

		/**
		 * returns layoutInfo from holder
		 *
		 * @param {jQuery} $holder - placeholder
		 * @return {Object}
		 */
		this.layoutInfoFromHolder = function ($holder) {
			var $editor = this.noteEditorFromHolder($holder);
			if (!$editor.length) {
				return;
			}

			// connect $holder to $editor
			$editor.data('holder', $holder);

			return dom.buildLayoutInfo($editor);
		};

		/**
		 * removeLayout
		 *
		 * @param {jQuery} $holder - placeholder
		 * @param {Object} layoutInfo
		 * @param {Object} options
		 *
		 */
		this.removeLayout = function ($holder, layoutInfo, options) {
			if (options.airMode) {
				$holder.removeClass('note-air-editor note-editable')
					   .removeAttr('id contentEditable');

				layoutInfo.popover().remove();
				layoutInfo.handle().remove();
				layoutInfo.dialog().remove();
			} else {
				$holder.html(layoutInfo.editable().html());

				layoutInfo.editor().remove();
				$holder.show();
			}
		};

		/**
		 *
		 * @return {Object}
		 * @return {function(label, options=):string} return.button {@link #tplButton function to make text button}
		 * @return {function(iconClass, options=):string} return.iconButton {@link #tplIconButton function to make icon button}
		 * @return {function(className, title=, body=, footer=):string} return.dialog {@link #tplDialog function to make dialog}
		 */
		this.getTemplate = function () {
			return {
				button: tplButton,
				iconButton: tplIconButton,
				dialog: tplDialog
			};
		};

		/**
		 * add button information
		 *
		 * @param {String} name button name
		 * @param {Function} buttonInfo function to make button, reference to {@link #tplButton},{@link #tplIconButton}
		 */
		this.addButtonInfo = function (name, buttonInfo) {
			tplButtonInfo[name] = buttonInfo;
		};

		/**
		 *
		 * @param {String} name
		 * @param {Function} dialogInfo function to make dialog, reference to {@link #tplDialog}
		 */
		this.addDialogInfo = function (name, dialogInfo) {
			tplDialogInfo[name] = dialogInfo;
		};
	};


	// jQuery namespace for summernote
	/**
	 * @class $.summernote 
	 * 
	 * summernote attribute  
	 * 
	 * @mixin defaults
	 * @singleton  
	 * 
	 */
	$.summernote = $.summernote || {};

	// extends default settings
	//  - $.summernote.version
	//  - $.summernote.options
	//  - $.summernote.lang
	$.extend($.summernote, defaults);

	var renderer = new Renderer();
	var eventHandler = new EventHandler();

	$.extend($.summernote, {
		/** @property {Renderer} */
		renderer: renderer,
		/** @property {EventHandler} */
		eventHandler: eventHandler,
		/** 
		 * @property {Object} core 
		 * @property {core.agent} core.agent 
		 * @property {core.dom} core.dom
		 * @property {core.range} core.range 
		 */
		core: {
			agent: agent,
			dom: dom,
			range: range
		},
		/** 
		 * @property {Object} 
		 * pluginEvents event list for plugins
		 * event has name and callback function.
		 * 
		 * ``` 
		 * $.summernote.addPlugin({
		 *     events : {
		 *          'hello' : function(layoutInfo, value, $target) {
		 *              console.log('event name is hello, value is ' + value );
		 *          }
		 *     }     
		 * })
		 * ```
		 * 
		 * * event name is data-event property.
		 * * layoutInfo is a summernote layout information.
		 * * value is data-value property.
		 */
		pluginEvents: {},

		plugins: []
	});

	/**
	 * @method addPlugin
	 *
	 * add Plugin in Summernote 
	 * 
	 * Summernote can make a own plugin.
	 *
	 * ### Define plugin
	 * ```
	 * // get template function  
	 * var tmpl = $.summernote.renderer.getTemplate();
	 * 
	 * // add a button   
	 * $.summernote.addPlugin({
	 *     buttons : {
	 *        // "hello"  is button's namespace.      
	 *        "hello" : function(lang, options) {
	 *            // make icon button by template function          
	 *            return tmpl.iconButton('fa fa-header', {
	 *                // callback function name when button clicked 
	 *                event : 'hello',
	 *                // set data-value property                 
	 *                value : 'hello',                
	 *                hide : true
	 *            });           
	 *        }
	 *     
	 *     }, 
	 *     
	 *     events : {
	 *        "hello" : function(layoutInfo, value) {
	 *            // here is event code 
	 *        }
	 *     }     
	 * });
	 * ``` 
	 * ### Use a plugin in toolbar
	 * 
	 * ``` 
	 *    $("#editor").summernote({
	 *    ...
	 *    toolbar : [
	 *        // display hello plugin in toolbar     
	 *        ['group', [ 'hello' ]]
	 *    ]
	 *    ...    
	 *    });
	 * ```
	 *  
	 *  
	 * @param {Object} plugin
	 * @param {Object} [plugin.buttons] define plugin button. for detail, see to Renderer.addButtonInfo
	 * @param {Object} [plugin.dialogs] define plugin dialog. for detail, see to Renderer.addDialogInfo
	 * @param {Object} [plugin.events] add event in $.summernote.pluginEvents 
	 * @param {Object} [plugin.langs] update $.summernote.lang
	 * @param {Object} [plugin.options] update $.summernote.options
	 */
	$.summernote.addPlugin = function (plugin) {

		// save plugin list
		$.summernote.plugins.push(plugin);

		if (plugin.buttons) {
			$.each(plugin.buttons, function (name, button) {
				renderer.addButtonInfo(name, button);
			});
		}

		if (plugin.dialogs) {
			$.each(plugin.dialogs, function (name, dialog) {
				renderer.addDialogInfo(name, dialog);
			});
		}

		if (plugin.events) {
			$.each(plugin.events, function (name, event) {
				$.summernote.pluginEvents[name] = event;
			});
		}

		if (plugin.langs) {
			$.each(plugin.langs, function (locale, lang) {
				if ($.summernote.lang[locale]) {
					$.extend($.summernote.lang[locale], lang);
				}
			});
		}

		if (plugin.options) {
			$.extend($.summernote.options, plugin.options);
		}
	};

	/*
	 * extend $.fn
	 */
	$.fn.extend({
		/**
		 * @method
		 * Initialize summernote
		 *  - create editor layout and attach Mouse and keyboard events.
		 * 
		 * ```
		 * $("#summernote").summernote( { options ..} );
		 * ```
		 *   
		 * @member $.fn
		 * @param {Object|String} options reference to $.summernote.options
		 * @return {this}
		 */
		summernote: function () {
			// check first argument's type
			//  - {String}: External API call {{module}}.{{method}}
			//  - {Object}: init options
			var type = $.type(list.head(arguments));
			var isExternalAPICalled = type === 'string';
			var isInitOptions = type === 'object';

			// extend default options with custom user options
			var options = isInitOptions ? list.head(arguments) : {};
			options = $.extend(true, {}, $.summernote.options, options);

			// Include langInfo in options for later use, e.g. for image drag-n-drop
			// Setup language info with en-US as default
			options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);

			this.each(function (idx, holder) {
				var $holder = $(holder);

				// if layout isn't created yet, createLayout and attach events
				if (!renderer.hasNoteEditor($holder)) {
					renderer.createLayout($holder, options);

					var layoutInfo = renderer.layoutInfoFromHolder($holder);

					eventHandler.attach(layoutInfo, options);
					eventHandler.attachCustomEvent(layoutInfo, options);

				}
			});

			// callback on init
			if (!isExternalAPICalled && this.length && options.oninit) {
				options.oninit();
			}

			var $first = this.first();
			if ($first.length) {
				var layoutInfo = renderer.layoutInfoFromHolder($first);

				// external API
				if (isExternalAPICalled) {
					var moduleAndMethod = list.head(list.from(arguments));
					var args = list.tail(list.from(arguments));

					// TODO now external API only works for editor
					var params = [moduleAndMethod, layoutInfo.editable()].concat(args);
					return eventHandler.invoke.apply(eventHandler, params);
				} else if (options.focus) {
					// focus on first editable element for initialize editor
					layoutInfo.editable().focus();
				}
			}

			return this;
		},

		/**
		 * @method 
		 * 
		 * get the HTML contents of note or set the HTML contents of note.
		 *
		 * * get contents 
		 * ```
		 * var content = $("#summernote").code();
		 * ```
		 * * set contents 
		 *
		 * ```
		 * $("#summernote").code(html);
		 * ```
		 *
		 * @member $.fn 
		 * @param {String} [html] - HTML contents(optional, set)
		 * @return {this|String} - context(set) or HTML contents of note(get).
		 */
		code: function (html) {
			// get the HTML contents of note
			if (html === undefined) {
				var $holder = this.first();
				if (!$holder.length) {
					return;
				}

				var layoutInfo = renderer.layoutInfoFromHolder($holder);
				var $editable = layoutInfo && layoutInfo.editable();

				if ($editable && $editable.length) {
					var isCodeview = eventHandler.invoke('codeview.isActivated', layoutInfo);
					eventHandler.invoke('codeview.sync', layoutInfo);
					return isCodeview ? layoutInfo.codable().val() :
										layoutInfo.editable().html();
				}
				return dom.isTextarea($holder[0]) ? $holder.val() : $holder.html();
			}

			// set the HTML contents of note
			this.each(function (i, holder) {
				var layoutInfo = renderer.layoutInfoFromHolder($(holder));
				var $editable = layoutInfo && layoutInfo.editable();
				if ($editable) {
					$editable.html(html);
				}
			});

			return this;
		},

		/**
		 * @method
		 * 
		 * destroy Editor Layout and detach Key and Mouse Event
		 *
		 * @member $.fn
		 * @return {this}
		 */
		destroy: function () {
			this.each(function (idx, holder) {
				var $holder = $(holder);

				if (!renderer.hasNoteEditor($holder)) {
					return;
				}

				var info = renderer.layoutInfoFromHolder($holder);
				var options = info.editor().data('options');

				eventHandler.detach(info, options);
				renderer.removeLayout($holder, info, options);
			});

			return this;
		}
	});
}));

}).call(global, module, undefined, undefined);

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL3N1bW1lcm5vdGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbjsgalF1ZXJ5ID0gZ2xvYmFsLmpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG47IHZhciBfX2Jyb3dzZXJpZnlfc2hpbV9yZXF1aXJlX189cmVxdWlyZTsoZnVuY3Rpb24gYnJvd3NlcmlmeVNoaW0obW9kdWxlLCBkZWZpbmUsIHJlcXVpcmUpIHtcbi8qKlxuICogU3VwZXIgc2ltcGxlIHd5c2l3eWcgZWRpdG9yIG9uIEJvb3RzdHJhcCB2MC42LjNcbiAqIGh0dHA6Ly9zdW1tZXJub3RlLm9yZy9cbiAqXG4gKiBzdW1tZXJub3RlLmpzXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE1IEFsYW4gSG9uZy4gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogc3VtbWVybm90ZSBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4vXG4gKlxuICogRGF0ZTogMjAxNS0wNC0wOFQxMzoyOFpcbiAqL1xuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG5cdC8qIGdsb2JhbCBkZWZpbmUgKi9cblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoWydqcXVlcnknXSwgZmFjdG9yeSk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQnJvd3NlciBnbG9iYWxzOiBqUXVlcnlcblx0XHRmYWN0b3J5KHdpbmRvdy5qUXVlcnkpO1xuXHR9XG59KGZ1bmN0aW9uICgkKSB7XG5cblxuXG5cdGlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZSkge1xuXHRcdC8qKlxuXHRcdCAqIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgcG9seWZpbGxcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG5cdFx0ICogQHBhcmFtIHtWYWx1ZX0gW2luaXRpYWxWYWx1ZV1cblx0XHQgKiBAcmV0dXJuIHtWYWx1ZX1cblx0XHQgKlxuXHRcdCAqIEBzZWUgaHR0cDovL2dvby5nbC9XTnJpUURcblx0XHQgKi9cblx0XHRBcnJheS5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdFx0XHR2YXIgdCA9IE9iamVjdCh0aGlzKSwgbGVuID0gdC5sZW5ndGggPj4+IDAsIGsgPSAwLCB2YWx1ZTtcblx0XHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdHZhbHVlID0gYXJndW1lbnRzWzFdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKGsgPCBsZW4gJiYgIShrIGluIHQpKSB7XG5cdFx0XHRcdFx0aysrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChrID49IGxlbikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZSA9IHRbaysrXTtcblx0XHRcdH1cblx0XHRcdGZvciAoOyBrIDwgbGVuOyBrKyspIHtcblx0XHRcdFx0aWYgKGsgaW4gdCkge1xuXHRcdFx0XHRcdHZhbHVlID0gY2FsbGJhY2sodmFsdWUsIHRba10sIGssIHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fTtcblx0fVxuXG5cdGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgQXJyYXkucHJvdG90eXBlLmZpbHRlcikge1xuXHRcdC8qKlxuXHRcdCAqIEFycmF5LnByb3RvdHlwZS5maWx0ZXIgcG9seWZpbGxcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcblx0XHQgKiBAcmV0dXJuIHtBcnJheX1cblx0XHQgKlxuXHRcdCAqIEBzZWUgaHR0cDovL2dvby5nbC9UMUtGbnFcblx0XHQgKi9cblx0XHRBcnJheS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gKGZ1bmMpIHtcblx0XHRcdHZhciB0ID0gT2JqZWN0KHRoaXMpLCBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDtcblxuXHRcdFx0dmFyIHJlcyA9IFtdO1xuXHRcdFx0dmFyIHRoaXNBcmcgPSBhcmd1bWVudHMubGVuZ3RoID49IDIgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDA7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdGlmIChpIGluIHQpIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gdFtpXTtcblx0XHRcdFx0XHRpZiAoZnVuYy5jYWxsKHRoaXNBcmcsIHZhbCwgaSwgdCkpIHtcblx0XHRcdFx0XHRcdHJlcy5wdXNoKHZhbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXM7XG5cdFx0fTtcblx0fVxuXG5cdHZhciBpc1N1cHBvcnRBbWQgPSB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQ7XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciBmb250IGlzIGluc3RhbGxlZCBvciBub3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBmb250TmFtZVxuXHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHQgKi9cblx0dmFyIGlzRm9udEluc3RhbGxlZCA9IGZ1bmN0aW9uIChmb250TmFtZSkge1xuXHRcdHZhciB0ZXN0Rm9udE5hbWUgPSBmb250TmFtZSA9PT0gJ0NvbWljIFNhbnMgTVMnID8gJ0NvdXJpZXIgTmV3JyA6ICdDb21pYyBTYW5zIE1TJztcblx0XHR2YXIgJHRlc3RlciA9ICQoJzxkaXY+JykuY3NzKHtcblx0XHRcdHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuXHRcdFx0bGVmdDogJy05OTk5cHgnLFxuXHRcdFx0dG9wOiAnLTk5OTlweCcsXG5cdFx0XHRmb250U2l6ZTogJzIwMHB4J1xuXHRcdH0pLnRleHQoJ21tbW1tbW1tbXd3d3d3d3cnKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcblxuXHRcdHZhciBvcmlnaW5hbFdpZHRoID0gJHRlc3Rlci5jc3MoJ2ZvbnRGYW1pbHknLCB0ZXN0Rm9udE5hbWUpLndpZHRoKCk7XG5cdFx0dmFyIHdpZHRoID0gJHRlc3Rlci5jc3MoJ2ZvbnRGYW1pbHknLCBmb250TmFtZSArICcsJyArIHRlc3RGb250TmFtZSkud2lkdGgoKTtcblxuXHRcdCR0ZXN0ZXIucmVtb3ZlKCk7XG5cblx0XHRyZXR1cm4gb3JpZ2luYWxXaWR0aCAhPT0gd2lkdGg7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBjb3JlLmFnZW50XG5cdCAqXG5cdCAqIE9iamVjdCB3aGljaCBjaGVjayBwbGF0Zm9ybSBhbmQgYWdlbnRcblx0ICpcblx0ICogQHNpbmdsZXRvblxuXHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIGFnZW50XG5cdCAqL1xuXHR2YXIgYWdlbnQgPSB7XG5cdFx0LyoqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2lzTWFjPWZhbHNlXSB0cnVlIGlmIHRoaXMgYWdlbnQgaXMgTWFjICAqL1xuXHRcdGlzTWFjOiBuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdNYWMnKSA+IC0xLFxuXHRcdC8qKiBAcHJvcGVydHkge0Jvb2xlYW59IFtpc01TSUU9ZmFsc2VdIHRydWUgaWYgdGhpcyBhZ2VudCBpcyBhIEludGVybmV0IEV4cGxvcmVyICAqL1xuXHRcdGlzTVNJRTogbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgPiAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1RyaWRlbnQnKSA+IC0xLFxuXHRcdC8qKiBAcHJvcGVydHkge0Jvb2xlYW59IFtpc0ZGPWZhbHNlXSB0cnVlIGlmIHRoaXMgYWdlbnQgaXMgYSBGaXJlZm94ICAqL1xuXHRcdGlzRkY6IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID4gLTEsXG5cdFx0LyoqIEBwcm9wZXJ0eSB7U3RyaW5nfSBqcXVlcnlWZXJzaW9uIGN1cnJlbnQgalF1ZXJ5IHZlcnNpb24gc3RyaW5nICAqL1xuXHRcdGpxdWVyeVZlcnNpb246IHBhcnNlRmxvYXQoJC5mbi5qcXVlcnkpLFxuXHRcdGlzU3VwcG9ydEFtZDogaXNTdXBwb3J0QW1kLFxuXHRcdGhhc0NvZGVNaXJyb3I6IGlzU3VwcG9ydEFtZCA/IHJlcXVpcmUuc3BlY2lmaWVkKCdDb2RlTWlycm9yJykgOiAhIXdpbmRvdy5Db2RlTWlycm9yLFxuXHRcdGlzRm9udEluc3RhbGxlZDogaXNGb250SW5zdGFsbGVkLFxuXHRcdGlzVzNDUmFuZ2VTdXBwb3J0OiAhIWRvY3VtZW50LmNyZWF0ZVJhbmdlXG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBjb3JlLmZ1bmNcblx0ICpcblx0ICogZnVuYyB1dGlscyAoZm9yIGhpZ2gtb3JkZXIgZnVuYydzIGFyZylcblx0ICpcblx0ICogQHNpbmdsZXRvblxuXHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIGZ1bmNcblx0ICovXG5cdHZhciBmdW5jID0gKGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgZXEgPSBmdW5jdGlvbiAoaXRlbUEpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoaXRlbUIpIHtcblx0XHRcdFx0cmV0dXJuIGl0ZW1BID09PSBpdGVtQjtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdHZhciBlcTIgPSBmdW5jdGlvbiAoaXRlbUEsIGl0ZW1CKSB7XG5cdFx0XHRyZXR1cm4gaXRlbUEgPT09IGl0ZW1CO1xuXHRcdH07XG5cblx0XHR2YXIgcGVxMiA9IGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChpdGVtQSwgaXRlbUIpIHtcblx0XHRcdFx0cmV0dXJuIGl0ZW1BW3Byb3BOYW1lXSA9PT0gaXRlbUJbcHJvcE5hbWVdO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0dmFyIG9rID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblxuXHRcdHZhciBmYWlsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0XHR2YXIgbm90ID0gZnVuY3Rpb24gKGYpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiAhZi5hcHBseShmLCBhcmd1bWVudHMpO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0dmFyIGFuZCA9IGZ1bmN0aW9uIChmQSwgZkIpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoaXRlbSkge1xuXHRcdFx0XHRyZXR1cm4gZkEoaXRlbSkgJiYgZkIoaXRlbSk7XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHR2YXIgc2VsZiA9IGZ1bmN0aW9uIChhKSB7XG5cdFx0XHRyZXR1cm4gYTtcblx0XHR9O1xuXG5cdFx0dmFyIGlkQ291bnRlciA9IDA7XG5cblx0XHQvKipcblx0XHQgKiBnZW5lcmF0ZSBhIGdsb2JhbGx5LXVuaXF1ZSBpZFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtwcmVmaXhdXG5cdFx0ICovXG5cdFx0dmFyIHVuaXF1ZUlkID0gZnVuY3Rpb24gKHByZWZpeCkge1xuXHRcdFx0dmFyIGlkID0gKytpZENvdW50ZXIgKyAnJztcblx0XHRcdHJldHVybiBwcmVmaXggPyBwcmVmaXggKyBpZCA6IGlkO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGJuZCAoYm91bmRzKSBmcm9tIHJlY3Rcblx0XHQgKlxuXHRcdCAqIC0gSUUgQ29tcGF0YWJpbGl0eSBJc3N1ZTogaHR0cDovL2dvby5nbC9zUkxPQW9cblx0XHQgKiAtIFNjcm9sbCBJc3N1ZTogaHR0cDovL2dvby5nbC9zTmpVY1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtSZWN0fSByZWN0XG5cdFx0ICogQHJldHVybiB7T2JqZWN0fSBib3VuZHNcblx0XHQgKiBAcmV0dXJuIHtOdW1iZXJ9IGJvdW5kcy50b3Bcblx0XHQgKiBAcmV0dXJuIHtOdW1iZXJ9IGJvdW5kcy5sZWZ0XG5cdFx0ICogQHJldHVybiB7TnVtYmVyfSBib3VuZHMud2lkdGhcblx0XHQgKiBAcmV0dXJuIHtOdW1iZXJ9IGJvdW5kcy5oZWlnaHRcblx0XHQgKi9cblx0XHR2YXIgcmVjdDJibmQgPSBmdW5jdGlvbiAocmVjdCkge1xuXHRcdFx0dmFyICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dG9wOiByZWN0LnRvcCArICRkb2N1bWVudC5zY3JvbGxUb3AoKSxcblx0XHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgJGRvY3VtZW50LnNjcm9sbExlZnQoKSxcblx0XHRcdFx0d2lkdGg6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG5cdFx0XHRcdGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9iamVjdCB3aGVyZSB0aGUga2V5cyBoYXZlIGJlY29tZSB0aGUgdmFsdWVzIGFuZCB0aGUgdmFsdWVzIHRoZSBrZXlzLlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dmFyIGludmVydE9iamVjdCA9IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdHZhciBpbnZlcnRlZCA9IHt9O1xuXHRcdFx0Zm9yICh2YXIga2V5IGluIG9iaikge1xuXHRcdFx0XHRpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0XHRpbnZlcnRlZFtvYmpba2V5XV0gPSBrZXk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBpbnZlcnRlZDtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGVxOiBlcSxcblx0XHRcdGVxMjogZXEyLFxuXHRcdFx0cGVxMjogcGVxMixcblx0XHRcdG9rOiBvayxcblx0XHRcdGZhaWw6IGZhaWwsXG5cdFx0XHRzZWxmOiBzZWxmLFxuXHRcdFx0bm90OiBub3QsXG5cdFx0XHRhbmQ6IGFuZCxcblx0XHRcdHVuaXF1ZUlkOiB1bmlxdWVJZCxcblx0XHRcdHJlY3QyYm5kOiByZWN0MmJuZCxcblx0XHRcdGludmVydE9iamVjdDogaW52ZXJ0T2JqZWN0XG5cdFx0fTtcblx0fSkoKTtcblxuXHQvKipcblx0ICogQGNsYXNzIGNvcmUubGlzdFxuXHQgKlxuXHQgKiBsaXN0IHV0aWxzXG5cdCAqXG5cdCAqIEBzaW5nbGV0b25cblx0ICogQGFsdGVybmF0ZUNsYXNzTmFtZSBsaXN0XG5cdCAqL1xuXHR2YXIgbGlzdCA9IChmdW5jdGlvbiAoKSB7XG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB0aGUgZmlyc3QgaXRlbSBvZiBhbiBhcnJheS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG5cdFx0ICovXG5cdFx0dmFyIGhlYWQgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0XHRcdHJldHVybiBhcnJheVswXTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB0aGUgbGFzdCBpdGVtIG9mIGFuIGFycmF5LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXlcblx0XHQgKi9cblx0XHR2YXIgbGFzdCA9IGZ1bmN0aW9uIChhcnJheSkge1xuXHRcdFx0cmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGV2ZXJ5dGhpbmcgYnV0IHRoZSBsYXN0IGVudHJ5IG9mIHRoZSBhcnJheS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG5cdFx0ICovXG5cdFx0dmFyIGluaXRpYWwgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0XHRcdHJldHVybiBhcnJheS5zbGljZSgwLCBhcnJheS5sZW5ndGggLSAxKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB0aGUgcmVzdCBvZiB0aGUgaXRlbXMgaW4gYW4gYXJyYXkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuXHRcdCAqL1xuXHRcdHZhciB0YWlsID0gZnVuY3Rpb24gKGFycmF5KSB7XG5cdFx0XHRyZXR1cm4gYXJyYXkuc2xpY2UoMSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgaXRlbSBvZiBhcnJheVxuXHRcdCAqL1xuXHRcdHZhciBmaW5kID0gZnVuY3Rpb24gKGFycmF5LCBwcmVkKSB7XG5cdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcblx0XHRcdFx0dmFyIGl0ZW0gPSBhcnJheVtpZHhdO1xuXHRcdFx0XHRpZiAocHJlZChpdGVtKSkge1xuXHRcdFx0XHRcdHJldHVybiBpdGVtO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgdHJ1ZSBpZiBhbGwgb2YgdGhlIHZhbHVlcyBpbiB0aGUgYXJyYXkgcGFzcyB0aGUgcHJlZGljYXRlIHRydXRoIHRlc3QuXG5cdFx0ICovXG5cdFx0dmFyIGFsbCA9IGZ1bmN0aW9uIChhcnJheSwgcHJlZCkge1xuXHRcdFx0Zm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHRcdGlmICghcHJlZChhcnJheVtpZHhdKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgcHJlc2VudCBpbiB0aGUgbGlzdC5cblx0XHQgKi9cblx0XHR2YXIgY29udGFpbnMgPSBmdW5jdGlvbiAoYXJyYXksIGl0ZW0pIHtcblx0XHRcdHJldHVybiAkLmluQXJyYXkoaXRlbSwgYXJyYXkpICE9PSAtMTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZ2V0IHN1bSBmcm9tIGEgbGlzdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgLSBhcnJheVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gaXRlcmF0b3Jcblx0XHQgKi9cblx0XHR2YXIgc3VtID0gZnVuY3Rpb24gKGFycmF5LCBmbikge1xuXHRcdFx0Zm4gPSBmbiB8fCBmdW5jLnNlbGY7XG5cdFx0XHRyZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCB2KSB7XG5cdFx0XHRcdHJldHVybiBtZW1vICsgZm4odik7XG5cdFx0XHR9LCAwKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBhIGNvcHkgb2YgdGhlIGNvbGxlY3Rpb24gd2l0aCBhcnJheSB0eXBlLlxuXHRcdCAqIEBwYXJhbSB7Q29sbGVjdGlvbn0gY29sbGVjdGlvbiAtIGNvbGxlY3Rpb24gZWcpIG5vZGUuY2hpbGROb2RlcywgLi4uXG5cdFx0ICovXG5cdFx0dmFyIGZyb20gPSBmdW5jdGlvbiAoY29sbGVjdGlvbikge1xuXHRcdFx0dmFyIHJlc3VsdCA9IFtdLCBpZHggPSAtMSwgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoKytpZHggPCBsZW5ndGgpIHtcblx0XHRcdFx0cmVzdWx0W2lkeF0gPSBjb2xsZWN0aW9uW2lkeF07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBjbHVzdGVyIGVsZW1lbnRzIGJ5IHByZWRpY2F0ZSBmdW5jdGlvbi5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IC0gYXJyYXlcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHByZWRpY2F0ZSBmdW5jdGlvbiBmb3IgY2x1c3RlciBydWxlXG5cdFx0ICogQHBhcmFtIHtBcnJheVtdfVxuXHRcdCAqL1xuXHRcdHZhciBjbHVzdGVyQnkgPSBmdW5jdGlvbiAoYXJyYXksIGZuKSB7XG5cdFx0XHRpZiAoIWFycmF5Lmxlbmd0aCkgeyByZXR1cm4gW107IH1cblx0XHRcdHZhciBhVGFpbCA9IHRhaWwoYXJyYXkpO1xuXHRcdFx0cmV0dXJuIGFUYWlsLnJlZHVjZShmdW5jdGlvbiAobWVtbywgdikge1xuXHRcdFx0XHR2YXIgYUxhc3QgPSBsYXN0KG1lbW8pO1xuXHRcdFx0XHRpZiAoZm4obGFzdChhTGFzdCksIHYpKSB7XG5cdFx0XHRcdFx0YUxhc3RbYUxhc3QubGVuZ3RoXSA9IHY7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bWVtb1ttZW1vLmxlbmd0aF0gPSBbdl07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1lbW87XG5cdFx0XHR9LCBbW2hlYWQoYXJyYXkpXV0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGEgY29weSBvZiB0aGUgYXJyYXkgd2l0aCBhbGwgZmFsc3kgdmFsdWVzIHJlbW92ZWRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IC0gYXJyYXlcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHByZWRpY2F0ZSBmdW5jdGlvbiBmb3IgY2x1c3RlciBydWxlXG5cdFx0ICovXG5cdFx0dmFyIGNvbXBhY3QgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0XHRcdHZhciBhUmVzdWx0ID0gW107XG5cdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcblx0XHRcdFx0aWYgKGFycmF5W2lkeF0pIHsgYVJlc3VsdC5wdXNoKGFycmF5W2lkeF0pOyB9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVJlc3VsdDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcHJvZHVjZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIHRoZSBhcnJheVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXlcblx0XHQgKi9cblx0XHR2YXIgdW5pcXVlID0gZnVuY3Rpb24gKGFycmF5KSB7XG5cdFx0XHR2YXIgcmVzdWx0cyA9IFtdO1xuXG5cdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcblx0XHRcdFx0aWYgKCFjb250YWlucyhyZXN1bHRzLCBhcnJheVtpZHhdKSkge1xuXHRcdFx0XHRcdHJlc3VsdHMucHVzaChhcnJheVtpZHhdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBuZXh0IGl0ZW0uXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXlcblx0XHQgKi9cblx0XHR2YXIgbmV4dCA9IGZ1bmN0aW9uIChhcnJheSwgaXRlbSkge1xuXHRcdFx0dmFyIGlkeCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XG5cdFx0XHRpZiAoaWR4ID09PSAtMSkgeyByZXR1cm4gbnVsbDsgfVxuXG5cdFx0XHRyZXR1cm4gYXJyYXlbaWR4ICsgMV07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgcHJldiBpdGVtLlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG5cdFx0ICovXG5cdFx0dmFyIHByZXYgPSBmdW5jdGlvbiAoYXJyYXksIGl0ZW0pIHtcblx0XHRcdHZhciBpZHggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuXHRcdFx0aWYgKGlkeCA9PT0gLTEpIHsgcmV0dXJuIG51bGw7IH1cblxuXHRcdFx0cmV0dXJuIGFycmF5W2lkeCAtIDFdO1xuXHRcdH07XG5cblxuXHRcdHJldHVybiB7XG5cdFx0XHRoZWFkOiBoZWFkLCBsYXN0OiBsYXN0LCBpbml0aWFsOiBpbml0aWFsLCB0YWlsOiB0YWlsLFxuXHRcdFx0cHJldjogcHJldiwgbmV4dDogbmV4dCwgZmluZDogZmluZCwgY29udGFpbnM6IGNvbnRhaW5zLFxuXHRcdFx0YWxsOiBhbGwsIHN1bTogc3VtLCBmcm9tOiBmcm9tLFxuXHRcdFx0Y2x1c3RlckJ5OiBjbHVzdGVyQnksIGNvbXBhY3Q6IGNvbXBhY3QsIHVuaXF1ZTogdW5pcXVlXG5cdFx0fTtcblx0fSkoKTtcblxuXG5cdHZhciBOQlNQX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCk7XG5cdHZhciBaRVJPX1dJRFRIX05CU1BfQ0hBUiA9ICdcXHVmZWZmJztcblxuXHQvKipcblx0ICogQGNsYXNzIGNvcmUuZG9tXG5cdCAqXG5cdCAqIERvbSBmdW5jdGlvbnNcblx0ICpcblx0ICogQHNpbmdsZXRvblxuXHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIGRvbVxuXHQgKi9cblx0dmFyIGRvbSA9IChmdW5jdGlvbiAoKSB7XG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpc0VkaXRhYmxlXG5cdFx0ICpcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgbm9kZSBpcyBgbm90ZS1lZGl0YWJsZWAgb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNFZGl0YWJsZSA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gbm9kZSAmJiAkKG5vZGUpLmhhc0NsYXNzKCdub3RlLWVkaXRhYmxlJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaXNDb250cm9sU2l6aW5nXG5cdFx0ICpcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgbm9kZSBpcyBgbm90ZS1jb250cm9sLXNpemluZ2Agb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNDb250cm9sU2l6aW5nID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBub2RlICYmICQobm9kZSkuaGFzQ2xhc3MoJ25vdGUtY29udHJvbC1zaXppbmcnKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCAgYnVpbGRMYXlvdXRJbmZvXG5cdFx0ICpcblx0XHQgKiBidWlsZCBsYXlvdXRJbmZvIGZyb20gJGVkaXRvcigubm90ZS1lZGl0b3IpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRvclxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKiBAcmV0dXJuIHtGdW5jdGlvbn0gcmV0dXJuLmVkaXRvclxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJldHVybi5kcm9wem9uZVxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJldHVybi50b29sYmFyXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gcmV0dXJuLmVkaXRhYmxlXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gcmV0dXJuLmNvZGFibGVcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByZXR1cm4ucG9wb3ZlclxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJldHVybi5oYW5kbGVcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByZXR1cm4uZGlhbG9nXG5cdFx0ICovXG5cdFx0dmFyIGJ1aWxkTGF5b3V0SW5mbyA9IGZ1bmN0aW9uICgkZWRpdG9yKSB7XG5cdFx0XHR2YXIgbWFrZUZpbmRlcjtcblxuXHRcdFx0Ly8gYWlyIG1vZGVcblx0XHRcdGlmICgkZWRpdG9yLmhhc0NsYXNzKCdub3RlLWFpci1lZGl0b3InKSkge1xuXHRcdFx0XHR2YXIgaWQgPSBsaXN0Lmxhc3QoJGVkaXRvci5hdHRyKCdpZCcpLnNwbGl0KCctJykpO1xuXHRcdFx0XHRtYWtlRmluZGVyID0gZnVuY3Rpb24gKHNJZFByZWZpeCkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiAkKHNJZFByZWZpeCArIGlkKTsgfTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGVkaXRvcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gJGVkaXRvcjsgfSxcblx0XHRcdFx0XHRob2xkZXI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICRlZGl0b3IuZGF0YSgnaG9sZGVyJyk7IH0sXG5cdFx0XHRcdFx0ZWRpdGFibGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICRlZGl0b3I7IH0sXG5cdFx0XHRcdFx0cG9wb3ZlcjogbWFrZUZpbmRlcignI25vdGUtcG9wb3Zlci0nKSxcblx0XHRcdFx0XHRoYW5kbGU6IG1ha2VGaW5kZXIoJyNub3RlLWhhbmRsZS0nKSxcblx0XHRcdFx0XHRkaWFsb2c6IG1ha2VGaW5kZXIoJyNub3RlLWRpYWxvZy0nKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIGZyYW1lIG1vZGVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1ha2VGaW5kZXIgPSBmdW5jdGlvbiAoc0NsYXNzTmFtZSkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiAkZWRpdG9yLmZpbmQoc0NsYXNzTmFtZSk7IH07XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZWRpdG9yOiBmdW5jdGlvbiAoKSB7IHJldHVybiAkZWRpdG9yOyB9LFxuXHRcdFx0XHRcdGhvbGRlcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gJGVkaXRvci5kYXRhKCdob2xkZXInKTsgfSxcblx0XHRcdFx0XHRkcm9wem9uZTogbWFrZUZpbmRlcignLm5vdGUtZHJvcHpvbmUnKSxcblx0XHRcdFx0XHR0b29sYmFyOiBtYWtlRmluZGVyKCcubm90ZS10b29sYmFyJyksXG5cdFx0XHRcdFx0ZWRpdGFibGU6IG1ha2VGaW5kZXIoJy5ub3RlLWVkaXRhYmxlJyksXG5cdFx0XHRcdFx0Y29kYWJsZTogbWFrZUZpbmRlcignLm5vdGUtY29kYWJsZScpLFxuXHRcdFx0XHRcdHN0YXR1c2JhcjogbWFrZUZpbmRlcignLm5vdGUtc3RhdHVzYmFyJyksXG5cdFx0XHRcdFx0cG9wb3ZlcjogbWFrZUZpbmRlcignLm5vdGUtcG9wb3ZlcicpLFxuXHRcdFx0XHRcdGhhbmRsZTogbWFrZUZpbmRlcignLm5vdGUtaGFuZGxlJyksXG5cdFx0XHRcdFx0ZGlhbG9nOiBtYWtlRmluZGVyKCcubm90ZS1kaWFsb2cnKVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIG1ha2VMYXlvdXRJbmZvIGZyb20gZWRpdG9yJ3MgZGVzY2VuZGFudCBub2RlLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge05vZGV9IGRlc2NlbmRhbnRcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dmFyIG1ha2VMYXlvdXRJbmZvID0gZnVuY3Rpb24gKGRlc2NlbmRhbnQpIHtcblx0XHRcdHZhciAkdGFyZ2V0ID0gJChkZXNjZW5kYW50KS5jbG9zZXN0KCcubm90ZS1lZGl0b3IsIC5ub3RlLWFpci1lZGl0b3IsIC5ub3RlLWFpci1sYXlvdXQnKTtcblxuXHRcdFx0aWYgKCEkdGFyZ2V0Lmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0dmFyICRlZGl0b3I7XG5cdFx0XHRpZiAoJHRhcmdldC5pcygnLm5vdGUtZWRpdG9yLCAubm90ZS1haXItZWRpdG9yJykpIHtcblx0XHRcdFx0JGVkaXRvciA9ICR0YXJnZXQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkZWRpdG9yID0gJCgnI25vdGUtZWRpdG9yLScgKyBsaXN0Lmxhc3QoJHRhcmdldC5hdHRyKCdpZCcpLnNwbGl0KCctJykpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGJ1aWxkTGF5b3V0SW5mbygkZWRpdG9yKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBtYWtlUHJlZEJ5Tm9kZU5hbWVcblx0XHQgKlxuXHRcdCAqIHJldHVybnMgcHJlZGljYXRlIHdoaWNoIGp1ZGdlIHdoZXRoZXIgbm9kZU5hbWUgaXMgc2FtZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5vZGVOYW1lXG5cdFx0ICogQHJldHVybiB7RnVuY3Rpb259XG5cdFx0ICovXG5cdFx0dmFyIG1ha2VQcmVkQnlOb2RlTmFtZSA9IGZ1bmN0aW9uIChub2RlTmFtZSkge1xuXHRcdFx0bm9kZU5hbWUgPSBub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gbm9kZU5hbWU7XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGlzVGV4dFxuXHRcdCAqXG5cdFx0ICpcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgbm9kZSdzIHR5cGUgaXMgdGV4dCgzKVxuXHRcdCAqL1xuXHRcdHZhciBpc1RleHQgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZXgpIGJyLCBjb2wsIGVtYmVkLCBociwgaW1nLCBpbnB1dCwgLi4uXG5cdFx0ICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL2RyYWZ0cy9odG1sL21hc3Rlci9zeW50YXguaHRtbCN2b2lkLWVsZW1lbnRzXG5cdFx0ICovXG5cdFx0dmFyIGlzVm9pZCA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gbm9kZSAmJiAvXkJSfF5JTUd8XkhSLy50ZXN0KG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc1BhcmEgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0aWYgKGlzRWRpdGFibGUobm9kZSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaHJvbWUodjMxLjApLCBGRih2MjUuMC4xKSB1c2UgRElWIGZvciBwYXJhZ3JhcGhcblx0XHRcdHJldHVybiBub2RlICYmIC9eRElWfF5QfF5MSXxeSFsxLTddLy50ZXN0KG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc0xpID0gbWFrZVByZWRCeU5vZGVOYW1lKCdMSScpO1xuXG5cdFx0dmFyIGlzUHVyZVBhcmEgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIGlzUGFyYShub2RlKSAmJiAhaXNMaShub2RlKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzVGFibGUgPSBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ1RBQkxFJyk7XG5cblx0XHR2YXIgaXNJbmxpbmUgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuICFpc0JvZHlDb250YWluZXIobm9kZSkgJiZcblx0XHRcdFx0ICAgIWlzTGlzdChub2RlKSAmJlxuXHRcdFx0XHQgICAhaXNQYXJhKG5vZGUpICYmXG5cdFx0XHRcdCAgICFpc1RhYmxlKG5vZGUpICYmXG5cdFx0XHRcdCAgICFpc0Jsb2NrcXVvdGUobm9kZSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc0xpc3QgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIG5vZGUgJiYgL15VTHxeT0wvLnRlc3Qobm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzQ2VsbCA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gbm9kZSAmJiAvXlREfF5USC8udGVzdChub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpO1xuXHRcdH07XG5cblx0XHR2YXIgaXNCbG9ja3F1b3RlID0gbWFrZVByZWRCeU5vZGVOYW1lKCdCTE9DS1FVT1RFJyk7XG5cblx0XHR2YXIgaXNCb2R5Q29udGFpbmVyID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBpc0NlbGwobm9kZSkgfHwgaXNCbG9ja3F1b3RlKG5vZGUpIHx8IGlzRWRpdGFibGUobm9kZSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc0FuY2hvciA9IG1ha2VQcmVkQnlOb2RlTmFtZSgnQScpO1xuXG5cdFx0dmFyIGlzUGFyYUlubGluZSA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gaXNJbmxpbmUobm9kZSkgJiYgISFhbmNlc3Rvcihub2RlLCBpc1BhcmEpO1xuXHRcdH07XG5cblx0XHR2YXIgaXNCb2R5SW5saW5lID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBpc0lubGluZShub2RlKSAmJiAhYW5jZXN0b3Iobm9kZSwgaXNQYXJhKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzQm9keSA9IG1ha2VQcmVkQnlOb2RlTmFtZSgnQk9EWScpO1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIG5vZGVCIGlzIGNsb3Nlc3Qgc2libGluZyBvZiBub2RlQVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlQVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZUJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc0Nsb3Nlc3RTaWJsaW5nID0gZnVuY3Rpb24gKG5vZGVBLCBub2RlQikge1xuXHRcdFx0cmV0dXJuIG5vZGVBLm5leHRTaWJsaW5nID09PSBub2RlQiB8fFxuXHRcdFx0XHQgICBub2RlQS5wcmV2aW91c1NpYmxpbmcgPT09IG5vZGVCO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGFycmF5IG9mIGNsb3Nlc3Qgc2libGluZ3Mgd2l0aCBub2RlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbcHJlZF0gLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHQgKiBAcmV0dXJuIHtOb2RlW119XG5cdFx0ICovXG5cdFx0dmFyIHdpdGhDbG9zZXN0U2libGluZ3MgPSBmdW5jdGlvbiAobm9kZSwgcHJlZCkge1xuXHRcdFx0cHJlZCA9IHByZWQgfHwgZnVuYy5vaztcblxuXHRcdFx0dmFyIHNpYmxpbmdzID0gW107XG5cdFx0XHRpZiAobm9kZS5wcmV2aW91c1NpYmxpbmcgJiYgcHJlZChub2RlLnByZXZpb3VzU2libGluZykpIHtcblx0XHRcdFx0c2libGluZ3MucHVzaChub2RlLnByZXZpb3VzU2libGluZyk7XG5cdFx0XHR9XG5cdFx0XHRzaWJsaW5ncy5wdXNoKG5vZGUpO1xuXHRcdFx0aWYgKG5vZGUubmV4dFNpYmxpbmcgJiYgcHJlZChub2RlLm5leHRTaWJsaW5nKSkge1xuXHRcdFx0XHRzaWJsaW5ncy5wdXNoKG5vZGUubmV4dFNpYmxpbmcpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNpYmxpbmdzO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBibGFuayBIVE1MIGZvciBjdXJzb3IgcG9zaXRpb25cblx0XHQgKi9cblx0XHR2YXIgYmxhbmtIVE1MID0gYWdlbnQuaXNNU0lFID8gJyZuYnNwOycgOiAnPGJyPic7XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIG5vZGVMZW5ndGhcblx0XHQgKlxuXHRcdCAqIHJldHVybnMgI3RleHQncyB0ZXh0IHNpemUgb3IgZWxlbWVudCdzIGNoaWxkTm9kZXMgc2l6ZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICovXG5cdFx0dmFyIG5vZGVMZW5ndGggPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0aWYgKGlzVGV4dChub2RlKSkge1xuXHRcdFx0XHRyZXR1cm4gbm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIG5vZGUgaXMgZW1wdHkgb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNFbXB0eSA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHR2YXIgbGVuID0gbm9kZUxlbmd0aChub2RlKTtcblxuXHRcdFx0aWYgKGxlbiA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoIWRvbS5pc1RleHQobm9kZSkgJiYgbGVuID09PSAxICYmIG5vZGUuaW5uZXJIVE1MID09PSBibGFua0hUTUwpIHtcblx0XHRcdFx0Ly8gZXgpIDxwPjxicj48L3A+LCA8c3Bhbj48YnI+PC9zcGFuPlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBwYWRkaW5nIGJsYW5rSFRNTCBpZiBub2RlIGlzIGVtcHR5IChmb3IgY3Vyc29yIHBvc2l0aW9uKVxuXHRcdCAqL1xuXHRcdHZhciBwYWRkaW5nQmxhbmtIVE1MID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdGlmICghaXNWb2lkKG5vZGUpICYmICFub2RlTGVuZ3RoKG5vZGUpKSB7XG5cdFx0XHRcdG5vZGUuaW5uZXJIVE1MID0gYmxhbmtIVE1MO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBmaW5kIG5lYXJlc3QgYW5jZXN0b3IgcHJlZGljYXRlIGhpdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdHZhciBhbmNlc3RvciA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0XHRpZiAocHJlZChub2RlKSkgeyByZXR1cm4gbm9kZTsgfVxuXHRcdFx0XHRpZiAoaXNFZGl0YWJsZShub2RlKSkgeyBicmVhazsgfVxuXG5cdFx0XHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZmluZCBuZWFyZXN0IGFuY2VzdG9yIG9ubHkgc2luZ2xlIGNoaWxkIGJsb29kIGxpbmUgYW5kIHByZWRpY2F0ZSBoaXRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHQgKi9cblx0XHR2YXIgc2luZ2xlQ2hpbGRBbmNlc3RvciA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHRub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0XHRpZiAobm9kZUxlbmd0aChub2RlKSAhPT0gMSkgeyBicmVhazsgfVxuXHRcdFx0XHRpZiAocHJlZChub2RlKSkgeyByZXR1cm4gbm9kZTsgfVxuXHRcdFx0XHRpZiAoaXNFZGl0YWJsZShub2RlKSkgeyBicmVhazsgfVxuXG5cdFx0XHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBuZXcgYXJyYXkgb2YgYW5jZXN0b3Igbm9kZXMgKHVudGlsIHByZWRpY2F0ZSBoaXQpLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbmFsXSBwcmVkIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0dmFyIGxpc3RBbmNlc3RvciA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHRwcmVkID0gcHJlZCB8fCBmdW5jLmZhaWw7XG5cblx0XHRcdHZhciBhbmNlc3RvcnMgPSBbXTtcblx0XHRcdGFuY2VzdG9yKG5vZGUsIGZ1bmN0aW9uIChlbCkge1xuXHRcdFx0XHRpZiAoIWlzRWRpdGFibGUoZWwpKSB7XG5cdFx0XHRcdFx0YW5jZXN0b3JzLnB1c2goZWwpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHByZWQoZWwpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gYW5jZXN0b3JzO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBmaW5kIGZhcnRoZXN0IGFuY2VzdG9yIHByZWRpY2F0ZSBoaXRcblx0XHQgKi9cblx0XHR2YXIgbGFzdEFuY2VzdG9yID0gZnVuY3Rpb24gKG5vZGUsIHByZWQpIHtcblx0XHRcdHZhciBhbmNlc3RvcnMgPSBsaXN0QW5jZXN0b3Iobm9kZSk7XG5cdFx0XHRyZXR1cm4gbGlzdC5sYXN0KGFuY2VzdG9ycy5maWx0ZXIocHJlZCkpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGNvbW1vbiBhbmNlc3RvciBub2RlIGJldHdlZW4gdHdvIG5vZGVzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlQVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZUJcblx0XHQgKi9cblx0XHR2YXIgY29tbW9uQW5jZXN0b3IgPSBmdW5jdGlvbiAobm9kZUEsIG5vZGVCKSB7XG5cdFx0XHR2YXIgYW5jZXN0b3JzID0gbGlzdEFuY2VzdG9yKG5vZGVBKTtcblx0XHRcdGZvciAodmFyIG4gPSBub2RlQjsgbjsgbiA9IG4ucGFyZW50Tm9kZSkge1xuXHRcdFx0XHRpZiAoJC5pbkFycmF5KG4sIGFuY2VzdG9ycykgPiAtMSkgeyByZXR1cm4gbjsgfVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7IC8vIGRpZmZlcmVuY2UgZG9jdW1lbnQgYXJlYVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBsaXN0aW5nIGFsbCBwcmV2aW91cyBzaWJsaW5ncyAodW50aWwgcHJlZGljYXRlIGhpdCkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9uYWxdIHByZWQgLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHQgKi9cblx0XHR2YXIgbGlzdFByZXYgPSBmdW5jdGlvbiAobm9kZSwgcHJlZCkge1xuXHRcdFx0cHJlZCA9IHByZWQgfHwgZnVuYy5mYWlsO1xuXG5cdFx0XHR2YXIgbm9kZXMgPSBbXTtcblx0XHRcdHdoaWxlIChub2RlKSB7XG5cdFx0XHRcdGlmIChwcmVkKG5vZGUpKSB7IGJyZWFrOyB9XG5cdFx0XHRcdG5vZGVzLnB1c2gobm9kZSk7XG5cdFx0XHRcdG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcblx0XHRcdH1cblx0XHRcdHJldHVybiBub2Rlcztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogbGlzdGluZyBuZXh0IHNpYmxpbmdzICh1bnRpbCBwcmVkaWNhdGUgaGl0KS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkXSAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdHZhciBsaXN0TmV4dCA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHRwcmVkID0gcHJlZCB8fCBmdW5jLmZhaWw7XG5cblx0XHRcdHZhciBub2RlcyA9IFtdO1xuXHRcdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdFx0aWYgKHByZWQobm9kZSkpIHsgYnJlYWs7IH1cblx0XHRcdFx0bm9kZXMucHVzaChub2RlKTtcblx0XHRcdFx0bm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbm9kZXM7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGxpc3RpbmcgZGVzY2VuZGFudCBub2Rlc1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRdIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0dmFyIGxpc3REZXNjZW5kYW50ID0gZnVuY3Rpb24gKG5vZGUsIHByZWQpIHtcblx0XHRcdHZhciBkZXNjZW5kZW50cyA9IFtdO1xuXHRcdFx0cHJlZCA9IHByZWQgfHwgZnVuYy5vaztcblxuXHRcdFx0Ly8gc3RhcnQgREZTKGRlcHRoIGZpcnN0IHNlYXJjaCkgd2l0aCBub2RlXG5cdFx0XHQoZnVuY3Rpb24gZm5XYWxrKGN1cnJlbnQpIHtcblx0XHRcdFx0aWYgKG5vZGUgIT09IGN1cnJlbnQgJiYgcHJlZChjdXJyZW50KSkge1xuXHRcdFx0XHRcdGRlc2NlbmRlbnRzLnB1c2goY3VycmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yICh2YXIgaWR4ID0gMCwgbGVuID0gY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuXHRcdFx0XHRcdGZuV2FsayhjdXJyZW50LmNoaWxkTm9kZXNbaWR4XSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pKG5vZGUpO1xuXG5cdFx0XHRyZXR1cm4gZGVzY2VuZGVudHM7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHdyYXAgbm9kZSB3aXRoIG5ldyB0YWcuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge05vZGV9IHRhZ05hbWUgb2Ygd3JhcHBlclxuXHRcdCAqIEByZXR1cm4ge05vZGV9IC0gd3JhcHBlclxuXHRcdCAqL1xuXHRcdHZhciB3cmFwID0gZnVuY3Rpb24gKG5vZGUsIHdyYXBwZXJOYW1lKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0dmFyIHdyYXBwZXIgPSAkKCc8JyArIHdyYXBwZXJOYW1lICsgJz4nKVswXTtcblxuXHRcdFx0cGFyZW50Lmluc2VydEJlZm9yZSh3cmFwcGVyLCBub2RlKTtcblx0XHRcdHdyYXBwZXIuYXBwZW5kQ2hpbGQobm9kZSk7XG5cblx0XHRcdHJldHVybiB3cmFwcGVyO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgbm9kZSBhZnRlciBwcmVjZWRpbmdcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gcHJlY2VkaW5nIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0dmFyIGluc2VydEFmdGVyID0gZnVuY3Rpb24gKG5vZGUsIHByZWNlZGluZykge1xuXHRcdFx0dmFyIG5leHQgPSBwcmVjZWRpbmcubmV4dFNpYmxpbmcsIHBhcmVudCA9IHByZWNlZGluZy5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKG5leHQpIHtcblx0XHRcdFx0cGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBuZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBub2RlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBhcHBlbmQgZWxlbWVudHMuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge0NvbGxlY3Rpb259IGFDaGlsZFxuXHRcdCAqL1xuXHRcdHZhciBhcHBlbmRDaGlsZE5vZGVzID0gZnVuY3Rpb24gKG5vZGUsIGFDaGlsZCkge1xuXHRcdFx0JC5lYWNoKGFDaGlsZCwgZnVuY3Rpb24gKGlkeCwgY2hpbGQpIHtcblx0XHRcdFx0bm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBub2RlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgYm91bmRhcnlQb2ludCBpcyBsZWZ0IGVkZ2Ugb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzTGVmdEVkZ2VQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuXHRcdFx0cmV0dXJuIHBvaW50Lm9mZnNldCA9PT0gMDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIGJvdW5kYXJ5UG9pbnQgaXMgcmlnaHQgZWRnZSBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNSaWdodEVkZ2VQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuXHRcdFx0cmV0dXJuIHBvaW50Lm9mZnNldCA9PT0gbm9kZUxlbmd0aChwb2ludC5ub2RlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIGJvdW5kYXJ5UG9pbnQgaXMgZWRnZSBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNFZGdlUG9pbnQgPSBmdW5jdGlvbiAocG9pbnQpIHtcblx0XHRcdHJldHVybiBpc0xlZnRFZGdlUG9pbnQocG9pbnQpIHx8IGlzUmlnaHRFZGdlUG9pbnQocG9pbnQpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRlciBub2RlIGlzIGxlZnQgZWRnZSBvZiBhbmNlc3RvciBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge05vZGV9IGFuY2VzdG9yXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNMZWZ0RWRnZU9mID0gZnVuY3Rpb24gKG5vZGUsIGFuY2VzdG9yKSB7XG5cdFx0XHR3aGlsZSAobm9kZSAmJiBub2RlICE9PSBhbmNlc3Rvcikge1xuXHRcdFx0XHRpZiAocG9zaXRpb24obm9kZSkgIT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0bm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgd2hldGhlciBub2RlIGlzIHJpZ2h0IGVkZ2Ugb2YgYW5jZXN0b3Igb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBhbmNlc3RvclxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzUmlnaHRFZGdlT2YgPSBmdW5jdGlvbiAobm9kZSwgYW5jZXN0b3IpIHtcblx0XHRcdHdoaWxlIChub2RlICYmIG5vZGUgIT09IGFuY2VzdG9yKSB7XG5cdFx0XHRcdGlmIChwb3NpdGlvbihub2RlKSAhPT0gbm9kZUxlbmd0aChub2RlLnBhcmVudE5vZGUpIC0gMSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBvZmZzZXQgZnJvbSBwYXJlbnQuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKi9cblx0XHR2YXIgcG9zaXRpb24gPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0dmFyIG9mZnNldCA9IDA7XG5cdFx0XHR3aGlsZSAoKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykpIHtcblx0XHRcdFx0b2Zmc2V0ICs9IDE7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb2Zmc2V0O1xuXHRcdH07XG5cblx0XHR2YXIgaGFzQ2hpbGRyZW4gPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuICEhKG5vZGUgJiYgbm9kZS5jaGlsZE5vZGVzICYmIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHByZXZpb3VzIGJvdW5kYXJ5UG9pbnRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzU2tpcElubmVyT2Zmc2V0XG5cdFx0ICogQHJldHVybiB7Qm91bmRhcnlQb2ludH1cblx0XHQgKi9cblx0XHR2YXIgcHJldlBvaW50ID0gZnVuY3Rpb24gKHBvaW50LCBpc1NraXBJbm5lck9mZnNldCkge1xuXHRcdFx0dmFyIG5vZGUsIG9mZnNldDtcblxuXHRcdFx0aWYgKHBvaW50Lm9mZnNldCA9PT0gMCkge1xuXHRcdFx0XHRpZiAoaXNFZGl0YWJsZShwb2ludC5ub2RlKSkge1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bm9kZSA9IHBvaW50Lm5vZGUucGFyZW50Tm9kZTtcblx0XHRcdFx0b2Zmc2V0ID0gcG9zaXRpb24ocG9pbnQubm9kZSk7XG5cdFx0XHR9IGVsc2UgaWYgKGhhc0NoaWxkcmVuKHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdG5vZGUgPSBwb2ludC5ub2RlLmNoaWxkTm9kZXNbcG9pbnQub2Zmc2V0IC0gMV07XG5cdFx0XHRcdG9mZnNldCA9IG5vZGVMZW5ndGgobm9kZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRub2RlID0gcG9pbnQubm9kZTtcblx0XHRcdFx0b2Zmc2V0ID0gaXNTa2lwSW5uZXJPZmZzZXQgPyAwIDogcG9pbnQub2Zmc2V0IC0gMTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bm9kZTogbm9kZSxcblx0XHRcdFx0b2Zmc2V0OiBvZmZzZXRcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgbmV4dCBib3VuZGFyeVBvaW50XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc1NraXBJbm5lck9mZnNldFxuXHRcdCAqIEByZXR1cm4ge0JvdW5kYXJ5UG9pbnR9XG5cdFx0ICovXG5cdFx0dmFyIG5leHRQb2ludCA9IGZ1bmN0aW9uIChwb2ludCwgaXNTa2lwSW5uZXJPZmZzZXQpIHtcblx0XHRcdHZhciBub2RlLCBvZmZzZXQ7XG5cblx0XHRcdGlmIChub2RlTGVuZ3RoKHBvaW50Lm5vZGUpID09PSBwb2ludC5vZmZzZXQpIHtcblx0XHRcdFx0aWYgKGlzRWRpdGFibGUocG9pbnQubm9kZSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG5vZGUgPSBwb2ludC5ub2RlLnBhcmVudE5vZGU7XG5cdFx0XHRcdG9mZnNldCA9IHBvc2l0aW9uKHBvaW50Lm5vZGUpICsgMTtcblx0XHRcdH0gZWxzZSBpZiAoaGFzQ2hpbGRyZW4ocG9pbnQubm9kZSkpIHtcblx0XHRcdFx0bm9kZSA9IHBvaW50Lm5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXRdO1xuXHRcdFx0XHRvZmZzZXQgPSAwO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bm9kZSA9IHBvaW50Lm5vZGU7XG5cdFx0XHRcdG9mZnNldCA9IGlzU2tpcElubmVyT2Zmc2V0ID8gbm9kZUxlbmd0aChwb2ludC5ub2RlKSA6IHBvaW50Lm9mZnNldCArIDE7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG5vZGU6IG5vZGUsXG5cdFx0XHRcdG9mZnNldDogb2Zmc2V0XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgcG9pbnRBIGFuZCBwb2ludEIgaXMgc2FtZSBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50QVxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRCXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNTYW1lUG9pbnQgPSBmdW5jdGlvbiAocG9pbnRBLCBwb2ludEIpIHtcblx0XHRcdHJldHVybiBwb2ludEEubm9kZSA9PT0gcG9pbnRCLm5vZGUgJiYgcG9pbnRBLm9mZnNldCA9PT0gcG9pbnRCLm9mZnNldDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIHBvaW50IGlzIHZpc2libGUgKGNhbiBzZXQgY3Vyc29yKSBvciBub3QuXG5cdFx0ICogXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzVmlzaWJsZVBvaW50ID0gZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHRpZiAoaXNUZXh0KHBvaW50Lm5vZGUpIHx8ICFoYXNDaGlsZHJlbihwb2ludC5ub2RlKSB8fCBpc0VtcHR5KHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbGVmdE5vZGUgPSBwb2ludC5ub2RlLmNoaWxkTm9kZXNbcG9pbnQub2Zmc2V0IC0gMV07XG5cdFx0XHR2YXIgcmlnaHROb2RlID0gcG9pbnQubm9kZS5jaGlsZE5vZGVzW3BvaW50Lm9mZnNldF07XG5cdFx0XHRpZiAoKCFsZWZ0Tm9kZSB8fCBpc1ZvaWQobGVmdE5vZGUpKSAmJiAoIXJpZ2h0Tm9kZSB8fCBpc1ZvaWQocmlnaHROb2RlKSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBwcmV2UG9pbnRVdGlsXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuXHRcdCAqIEByZXR1cm4ge0JvdW5kYXJ5UG9pbnR9XG5cdFx0ICovXG5cdFx0dmFyIHByZXZQb2ludFVudGlsID0gZnVuY3Rpb24gKHBvaW50LCBwcmVkKSB7XG5cdFx0XHR3aGlsZSAocG9pbnQpIHtcblx0XHRcdFx0aWYgKHByZWQocG9pbnQpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBvaW50O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cG9pbnQgPSBwcmV2UG9pbnQocG9pbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBuZXh0UG9pbnRVbnRpbFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcblx0XHQgKiBAcmV0dXJuIHtCb3VuZGFyeVBvaW50fVxuXHRcdCAqL1xuXHRcdHZhciBuZXh0UG9pbnRVbnRpbCA9IGZ1bmN0aW9uIChwb2ludCwgcHJlZCkge1xuXHRcdFx0d2hpbGUgKHBvaW50KSB7XG5cdFx0XHRcdGlmIChwcmVkKHBvaW50KSkge1xuXHRcdFx0XHRcdHJldHVybiBwb2ludDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHBvaW50ID0gbmV4dFBvaW50KHBvaW50KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgd2Fsa1BvaW50XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHN0YXJ0UG9pbnRcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IGVuZFBvaW50XG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNTa2lwSW5uZXJPZmZzZXRcblx0XHQgKi9cblx0XHR2YXIgd2Fsa1BvaW50ID0gZnVuY3Rpb24gKHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBoYW5kbGVyLCBpc1NraXBJbm5lck9mZnNldCkge1xuXHRcdFx0dmFyIHBvaW50ID0gc3RhcnRQb2ludDtcblxuXHRcdFx0d2hpbGUgKHBvaW50KSB7XG5cdFx0XHRcdGhhbmRsZXIocG9pbnQpO1xuXG5cdFx0XHRcdGlmIChpc1NhbWVQb2ludChwb2ludCwgZW5kUG9pbnQpKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgaXNTa2lwT2Zmc2V0ID0gaXNTa2lwSW5uZXJPZmZzZXQgJiZcblx0XHRcdFx0XHRcdFx0XHQgICBzdGFydFBvaW50Lm5vZGUgIT09IHBvaW50Lm5vZGUgJiZcblx0XHRcdFx0XHRcdFx0XHQgICBlbmRQb2ludC5ub2RlICE9PSBwb2ludC5ub2RlO1xuXHRcdFx0XHRwb2ludCA9IG5leHRQb2ludChwb2ludCwgaXNTa2lwT2Zmc2V0KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBtYWtlT2Zmc2V0UGF0aFxuXHRcdCAqXG5cdFx0ICogcmV0dXJuIG9mZnNldFBhdGgoYXJyYXkgb2Ygb2Zmc2V0KSBmcm9tIGFuY2VzdG9yXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IGFuY2VzdG9yIC0gYW5jZXN0b3Igbm9kZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqL1xuXHRcdHZhciBtYWtlT2Zmc2V0UGF0aCA9IGZ1bmN0aW9uIChhbmNlc3Rvciwgbm9kZSkge1xuXHRcdFx0dmFyIGFuY2VzdG9ycyA9IGxpc3RBbmNlc3Rvcihub2RlLCBmdW5jLmVxKGFuY2VzdG9yKSk7XG5cdFx0XHRyZXR1cm4gJC5tYXAoYW5jZXN0b3JzLCBwb3NpdGlvbikucmV2ZXJzZSgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGZyb21PZmZzZXRQYXRoXG5cdFx0ICpcblx0XHQgKiByZXR1cm4gZWxlbWVudCBmcm9tIG9mZnNldFBhdGgoYXJyYXkgb2Ygb2Zmc2V0KVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBhbmNlc3RvciAtIGFuY2VzdG9yIG5vZGVcblx0XHQgKiBAcGFyYW0ge2FycmF5fSBvZmZzZXRzIC0gb2Zmc2V0UGF0aFxuXHRcdCAqL1xuXHRcdHZhciBmcm9tT2Zmc2V0UGF0aCA9IGZ1bmN0aW9uIChhbmNlc3Rvciwgb2Zmc2V0cykge1xuXHRcdFx0dmFyIGN1cnJlbnQgPSBhbmNlc3Rvcjtcblx0XHRcdGZvciAodmFyIGkgPSAwLCBsZW4gPSBvZmZzZXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdGlmIChjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoIDw9IG9mZnNldHNbaV0pIHtcblx0XHRcdFx0XHRjdXJyZW50ID0gY3VycmVudC5jaGlsZE5vZGVzW2N1cnJlbnQuY2hpbGROb2Rlcy5sZW5ndGggLSAxXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjdXJyZW50ID0gY3VycmVudC5jaGlsZE5vZGVzW29mZnNldHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY3VycmVudDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBzcGxpdE5vZGVcblx0XHQgKlxuXHRcdCAqIHNwbGl0IGVsZW1lbnQgb3IgI3RleHRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtpc1NraXBQYWRkaW5nQmxhbmtIVE1MXVxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJpZ2h0IG5vZGUgb2YgYm91bmRhcnlQb2ludFxuXHRcdCAqL1xuXHRcdHZhciBzcGxpdE5vZGUgPSBmdW5jdGlvbiAocG9pbnQsIGlzU2tpcFBhZGRpbmdCbGFua0hUTUwpIHtcblx0XHRcdC8vIHNwbGl0ICN0ZXh0XG5cdFx0XHRpZiAoaXNUZXh0KHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdC8vIGVkZ2UgY2FzZVxuXHRcdFx0XHRpZiAoaXNMZWZ0RWRnZVBvaW50KHBvaW50KSkge1xuXHRcdFx0XHRcdHJldHVybiBwb2ludC5ub2RlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzUmlnaHRFZGdlUG9pbnQocG9pbnQpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBvaW50Lm5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcG9pbnQubm9kZS5zcGxpdFRleHQocG9pbnQub2Zmc2V0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gc3BsaXQgZWxlbWVudFxuXHRcdFx0dmFyIGNoaWxkTm9kZSA9IHBvaW50Lm5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXRdO1xuXHRcdFx0dmFyIGNsb25lID0gaW5zZXJ0QWZ0ZXIocG9pbnQubm9kZS5jbG9uZU5vZGUoZmFsc2UpLCBwb2ludC5ub2RlKTtcblx0XHRcdGFwcGVuZENoaWxkTm9kZXMoY2xvbmUsIGxpc3ROZXh0KGNoaWxkTm9kZSkpO1xuXG5cdFx0XHRpZiAoIWlzU2tpcFBhZGRpbmdCbGFua0hUTUwpIHtcblx0XHRcdFx0cGFkZGluZ0JsYW5rSFRNTChwb2ludC5ub2RlKTtcblx0XHRcdFx0cGFkZGluZ0JsYW5rSFRNTChjbG9uZSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBjbG9uZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBzcGxpdFRyZWVcblx0XHQgKlxuXHRcdCAqIHNwbGl0IHRyZWUgYnkgcG9pbnRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gcm9vdCAtIHNwbGl0IHJvb3Rcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbaXNTa2lwUGFkZGluZ0JsYW5rSFRNTF1cblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByaWdodCBub2RlIG9mIGJvdW5kYXJ5UG9pbnRcblx0XHQgKi9cblx0XHR2YXIgc3BsaXRUcmVlID0gZnVuY3Rpb24gKHJvb3QsIHBvaW50LCBpc1NraXBQYWRkaW5nQmxhbmtIVE1MKSB7XG5cdFx0XHQvLyBleCkgWyN0ZXh0LCA8c3Bhbj4sIDxwPl1cblx0XHRcdHZhciBhbmNlc3RvcnMgPSBsaXN0QW5jZXN0b3IocG9pbnQubm9kZSwgZnVuYy5lcShyb290KSk7XG5cblx0XHRcdGlmICghYW5jZXN0b3JzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH0gZWxzZSBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4gc3BsaXROb2RlKHBvaW50LCBpc1NraXBQYWRkaW5nQmxhbmtIVE1MKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGFuY2VzdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKG5vZGUsIHBhcmVudCkge1xuXHRcdFx0XHR2YXIgY2xvbmUgPSBpbnNlcnRBZnRlcihwYXJlbnQuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50KTtcblxuXHRcdFx0XHRpZiAobm9kZSA9PT0gcG9pbnQubm9kZSkge1xuXHRcdFx0XHRcdG5vZGUgPSBzcGxpdE5vZGUocG9pbnQsIGlzU2tpcFBhZGRpbmdCbGFua0hUTUwpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXBwZW5kQ2hpbGROb2RlcyhjbG9uZSwgbGlzdE5leHQobm9kZSkpO1xuXG5cdFx0XHRcdGlmICghaXNTa2lwUGFkZGluZ0JsYW5rSFRNTCkge1xuXHRcdFx0XHRcdHBhZGRpbmdCbGFua0hUTUwocGFyZW50KTtcblx0XHRcdFx0XHRwYWRkaW5nQmxhbmtIVE1MKGNsb25lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY2xvbmU7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogc3BsaXQgcG9pbnRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7UG9pbnR9IHBvaW50XG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc0lubGluZVxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKi9cblx0XHR2YXIgc3BsaXRQb2ludCA9IGZ1bmN0aW9uIChwb2ludCwgaXNJbmxpbmUpIHtcblx0XHRcdC8vIGZpbmQgc3BsaXRSb290LCBjb250YWluZXJcblx0XHRcdC8vICAtIGlubGluZTogc3BsaXRSb290IGlzIGEgY2hpbGQgb2YgcGFyYWdyYXBoXG5cdFx0XHQvLyAgLSBibG9jazogc3BsaXRSb290IGlzIGEgY2hpbGQgb2YgYm9keUNvbnRhaW5lclxuXHRcdFx0dmFyIHByZWQgPSBpc0lubGluZSA/IGlzUGFyYSA6IGlzQm9keUNvbnRhaW5lcjtcblx0XHRcdHZhciBhbmNlc3RvcnMgPSBsaXN0QW5jZXN0b3IocG9pbnQubm9kZSwgcHJlZCk7XG5cdFx0XHR2YXIgdG9wQW5jZXN0b3IgPSBsaXN0Lmxhc3QoYW5jZXN0b3JzKSB8fCBwb2ludC5ub2RlO1xuXG5cdFx0XHR2YXIgc3BsaXRSb290LCBjb250YWluZXI7XG5cdFx0XHRpZiAocHJlZCh0b3BBbmNlc3RvcikpIHtcblx0XHRcdFx0c3BsaXRSb290ID0gYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAyXTtcblx0XHRcdFx0Y29udGFpbmVyID0gdG9wQW5jZXN0b3I7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzcGxpdFJvb3QgPSB0b3BBbmNlc3Rvcjtcblx0XHRcdFx0Y29udGFpbmVyID0gc3BsaXRSb290LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHNwbGl0IHdpdGggc3BsaXRUcmVlXG5cdFx0XHR2YXIgcGl2b3QgPSBzcGxpdFJvb3QgJiYgc3BsaXRUcmVlKHNwbGl0Um9vdCwgcG9pbnQsIGlzSW5saW5lKTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmlnaHROb2RlOiBwaXZvdCxcblx0XHRcdFx0Y29udGFpbmVyOiBjb250YWluZXJcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdHZhciBjcmVhdGUgPSBmdW5jdGlvbiAobm9kZU5hbWUpIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5vZGVOYW1lKTtcblx0XHR9O1xuXG5cdFx0dmFyIGNyZWF0ZVRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHJlbW92ZVxuXHRcdCAqXG5cdFx0ICogcmVtb3ZlIG5vZGUsIChpc1JlbW92ZUNoaWxkOiByZW1vdmUgY2hpbGQgb3Igbm90KVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZUNoaWxkXG5cdFx0ICovXG5cdFx0dmFyIHJlbW92ZSA9IGZ1bmN0aW9uIChub2RlLCBpc1JlbW92ZUNoaWxkKSB7XG5cdFx0XHRpZiAoIW5vZGUgfHwgIW5vZGUucGFyZW50Tm9kZSkgeyByZXR1cm47IH1cblx0XHRcdGlmIChub2RlLnJlbW92ZU5vZGUpIHsgcmV0dXJuIG5vZGUucmVtb3ZlTm9kZShpc1JlbW92ZUNoaWxkKTsgfVxuXG5cdFx0XHR2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCFpc1JlbW92ZUNoaWxkKSB7XG5cdFx0XHRcdHZhciBub2RlcyA9IFtdO1xuXHRcdFx0XHR2YXIgaSwgbGVuO1xuXHRcdFx0XHRmb3IgKGkgPSAwLCBsZW4gPSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0XHRub2Rlcy5wdXNoKG5vZGUuY2hpbGROb2Rlc1tpXSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKGkgPSAwLCBsZW4gPSBub2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRcdHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZXNbaV0sIG5vZGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZW1vdmVXaGlsZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuXHRcdCAqL1xuXHRcdHZhciByZW1vdmVXaGlsZSA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0XHRpZiAoaXNFZGl0YWJsZShub2RlKSB8fCAhcHJlZChub2RlKSkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdFx0cmVtb3ZlKG5vZGUpO1xuXHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHJlcGxhY2Vcblx0XHQgKlxuXHRcdCAqIHJlcGxhY2Ugbm9kZSB3aXRoIHByb3ZpZGVkIG5vZGVOYW1lXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbm9kZU5hbWVcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSAtIG5ldyBub2RlXG5cdFx0ICovXG5cdFx0dmFyIHJlcGxhY2UgPSBmdW5jdGlvbiAobm9kZSwgbm9kZU5hbWUpIHtcblx0XHRcdGlmIChub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IG5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpIHtcblx0XHRcdFx0cmV0dXJuIG5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBuZXdOb2RlID0gY3JlYXRlKG5vZGVOYW1lKTtcblxuXHRcdFx0aWYgKG5vZGUuc3R5bGUuY3NzVGV4dCkge1xuXHRcdFx0XHRuZXdOb2RlLnN0eWxlLmNzc1RleHQgPSBub2RlLnN0eWxlLmNzc1RleHQ7XG5cdFx0XHR9XG5cblx0XHRcdGFwcGVuZENoaWxkTm9kZXMobmV3Tm9kZSwgbGlzdC5mcm9tKG5vZGUuY2hpbGROb2RlcykpO1xuXHRcdFx0aW5zZXJ0QWZ0ZXIobmV3Tm9kZSwgbm9kZSk7XG5cdFx0XHRyZW1vdmUobm9kZSk7XG5cblx0XHRcdHJldHVybiBuZXdOb2RlO1xuXHRcdH07XG5cblx0XHR2YXIgaXNUZXh0YXJlYSA9IG1ha2VQcmVkQnlOb2RlTmFtZSgnVEVYVEFSRUEnKTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaHRtbFxuXHRcdCAqXG5cdFx0ICogZ2V0IHRoZSBIVE1MIGNvbnRlbnRzIG9mIG5vZGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkbm9kZVxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzTmV3bGluZU9uQmxvY2tdXG5cdFx0ICovXG5cdFx0dmFyIGh0bWwgPSBmdW5jdGlvbiAoJG5vZGUsIGlzTmV3bGluZU9uQmxvY2spIHtcblx0XHRcdHZhciBtYXJrdXAgPSBpc1RleHRhcmVhKCRub2RlWzBdKSA/ICRub2RlLnZhbCgpIDogJG5vZGUuaHRtbCgpO1xuXG5cdFx0XHRpZiAoaXNOZXdsaW5lT25CbG9jaykge1xuXHRcdFx0XHR2YXIgcmVnZXhUYWcgPSAvPChcXC8/KShcXGIoPyEhKVtePlxcc10qKSguKj8pKFxccypcXC8/PikvZztcblx0XHRcdFx0bWFya3VwID0gbWFya3VwLnJlcGxhY2UocmVnZXhUYWcsIGZ1bmN0aW9uIChtYXRjaCwgZW5kU2xhc2gsIG5hbWUpIHtcblx0XHRcdFx0XHRuYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpO1xuXHRcdFx0XHRcdHZhciBpc0VuZE9mSW5saW5lQ29udGFpbmVyID0gL15ESVZ8XlREfF5USHxeUHxeTEl8XkhbMS03XS8udGVzdChuYW1lKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICEhZW5kU2xhc2g7XG5cdFx0XHRcdFx0dmFyIGlzQmxvY2tOb2RlID0gL15CTE9DS1FVT1RFfF5UQUJMRXxeVEJPRFl8XlRSfF5IUnxeVUx8Xk9MLy50ZXN0KG5hbWUpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoICsgKChpc0VuZE9mSW5saW5lQ29udGFpbmVyIHx8IGlzQmxvY2tOb2RlKSA/ICdcXG4nIDogJycpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0bWFya3VwID0gJC50cmltKG1hcmt1cCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXJrdXA7XG5cdFx0fTtcblxuXHRcdHZhciB2YWx1ZSA9IGZ1bmN0aW9uICgkdGV4dGFyZWEsIHN0cmlwTGluZWJyZWFrcykge1xuXHRcdFx0dmFyIHZhbCA9ICR0ZXh0YXJlYS52YWwoKTtcblx0XHRcdGlmIChzdHJpcExpbmVicmVha3MpIHtcblx0XHRcdFx0cmV0dXJuIHZhbC5yZXBsYWNlKC9bXFxuXFxyXS9nLCAnJyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH07XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0LyoqIEBwcm9wZXJ0eSB7U3RyaW5nfSBOQlNQX0NIQVIgKi9cblx0XHRcdE5CU1BfQ0hBUjogTkJTUF9DSEFSLFxuXHRcdFx0LyoqIEBwcm9wZXJ0eSB7U3RyaW5nfSBaRVJPX1dJRFRIX05CU1BfQ0hBUiAqL1xuXHRcdFx0WkVST19XSURUSF9OQlNQX0NIQVI6IFpFUk9fV0lEVEhfTkJTUF9DSEFSLFxuXHRcdFx0LyoqIEBwcm9wZXJ0eSB7U3RyaW5nfSBibGFuayAqL1xuXHRcdFx0Ymxhbms6IGJsYW5rSFRNTCxcblx0XHRcdC8qKiBAcHJvcGVydHkge1N0cmluZ30gZW1wdHlQYXJhICovXG5cdFx0XHRlbXB0eVBhcmE6ICc8cD4nICsgYmxhbmtIVE1MICsgJzwvcD4nLFxuXHRcdFx0bWFrZVByZWRCeU5vZGVOYW1lOiBtYWtlUHJlZEJ5Tm9kZU5hbWUsXG5cdFx0XHRpc0VkaXRhYmxlOiBpc0VkaXRhYmxlLFxuXHRcdFx0aXNDb250cm9sU2l6aW5nOiBpc0NvbnRyb2xTaXppbmcsXG5cdFx0XHRidWlsZExheW91dEluZm86IGJ1aWxkTGF5b3V0SW5mbyxcblx0XHRcdG1ha2VMYXlvdXRJbmZvOiBtYWtlTGF5b3V0SW5mbyxcblx0XHRcdGlzVGV4dDogaXNUZXh0LFxuXHRcdFx0aXNWb2lkOiBpc1ZvaWQsXG5cdFx0XHRpc1BhcmE6IGlzUGFyYSxcblx0XHRcdGlzUHVyZVBhcmE6IGlzUHVyZVBhcmEsXG5cdFx0XHRpc0lubGluZTogaXNJbmxpbmUsXG5cdFx0XHRpc0JvZHlJbmxpbmU6IGlzQm9keUlubGluZSxcblx0XHRcdGlzQm9keTogaXNCb2R5LFxuXHRcdFx0aXNQYXJhSW5saW5lOiBpc1BhcmFJbmxpbmUsXG5cdFx0XHRpc0xpc3Q6IGlzTGlzdCxcblx0XHRcdGlzVGFibGU6IGlzVGFibGUsXG5cdFx0XHRpc0NlbGw6IGlzQ2VsbCxcblx0XHRcdGlzQmxvY2txdW90ZTogaXNCbG9ja3F1b3RlLFxuXHRcdFx0aXNCb2R5Q29udGFpbmVyOiBpc0JvZHlDb250YWluZXIsXG5cdFx0XHRpc0FuY2hvcjogaXNBbmNob3IsXG5cdFx0XHRpc0RpdjogbWFrZVByZWRCeU5vZGVOYW1lKCdESVYnKSxcblx0XHRcdGlzTGk6IGlzTGksXG5cdFx0XHRpc0JSOiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0JSJyksXG5cdFx0XHRpc1NwYW46IG1ha2VQcmVkQnlOb2RlTmFtZSgnU1BBTicpLFxuXHRcdFx0aXNCOiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0InKSxcblx0XHRcdGlzVTogbWFrZVByZWRCeU5vZGVOYW1lKCdVJyksXG5cdFx0XHRpc1M6IG1ha2VQcmVkQnlOb2RlTmFtZSgnUycpLFxuXHRcdFx0aXNJOiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0knKSxcblx0XHRcdGlzSW1nOiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0lNRycpLFxuXHRcdFx0aXNUZXh0YXJlYTogaXNUZXh0YXJlYSxcblx0XHRcdGlzRW1wdHk6IGlzRW1wdHksXG5cdFx0XHRpc0VtcHR5QW5jaG9yOiBmdW5jLmFuZChpc0FuY2hvciwgaXNFbXB0eSksXG5cdFx0XHRpc0Nsb3Nlc3RTaWJsaW5nOiBpc0Nsb3Nlc3RTaWJsaW5nLFxuXHRcdFx0d2l0aENsb3Nlc3RTaWJsaW5nczogd2l0aENsb3Nlc3RTaWJsaW5ncyxcblx0XHRcdG5vZGVMZW5ndGg6IG5vZGVMZW5ndGgsXG5cdFx0XHRpc0xlZnRFZGdlUG9pbnQ6IGlzTGVmdEVkZ2VQb2ludCxcblx0XHRcdGlzUmlnaHRFZGdlUG9pbnQ6IGlzUmlnaHRFZGdlUG9pbnQsXG5cdFx0XHRpc0VkZ2VQb2ludDogaXNFZGdlUG9pbnQsXG5cdFx0XHRpc0xlZnRFZGdlT2Y6IGlzTGVmdEVkZ2VPZixcblx0XHRcdGlzUmlnaHRFZGdlT2Y6IGlzUmlnaHRFZGdlT2YsXG5cdFx0XHRwcmV2UG9pbnQ6IHByZXZQb2ludCxcblx0XHRcdG5leHRQb2ludDogbmV4dFBvaW50LFxuXHRcdFx0aXNTYW1lUG9pbnQ6IGlzU2FtZVBvaW50LFxuXHRcdFx0aXNWaXNpYmxlUG9pbnQ6IGlzVmlzaWJsZVBvaW50LFxuXHRcdFx0cHJldlBvaW50VW50aWw6IHByZXZQb2ludFVudGlsLFxuXHRcdFx0bmV4dFBvaW50VW50aWw6IG5leHRQb2ludFVudGlsLFxuXHRcdFx0d2Fsa1BvaW50OiB3YWxrUG9pbnQsXG5cdFx0XHRhbmNlc3RvcjogYW5jZXN0b3IsXG5cdFx0XHRzaW5nbGVDaGlsZEFuY2VzdG9yOiBzaW5nbGVDaGlsZEFuY2VzdG9yLFxuXHRcdFx0bGlzdEFuY2VzdG9yOiBsaXN0QW5jZXN0b3IsXG5cdFx0XHRsYXN0QW5jZXN0b3I6IGxhc3RBbmNlc3Rvcixcblx0XHRcdGxpc3ROZXh0OiBsaXN0TmV4dCxcblx0XHRcdGxpc3RQcmV2OiBsaXN0UHJldixcblx0XHRcdGxpc3REZXNjZW5kYW50OiBsaXN0RGVzY2VuZGFudCxcblx0XHRcdGNvbW1vbkFuY2VzdG9yOiBjb21tb25BbmNlc3Rvcixcblx0XHRcdHdyYXA6IHdyYXAsXG5cdFx0XHRpbnNlcnRBZnRlcjogaW5zZXJ0QWZ0ZXIsXG5cdFx0XHRhcHBlbmRDaGlsZE5vZGVzOiBhcHBlbmRDaGlsZE5vZGVzLFxuXHRcdFx0cG9zaXRpb246IHBvc2l0aW9uLFxuXHRcdFx0aGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLFxuXHRcdFx0bWFrZU9mZnNldFBhdGg6IG1ha2VPZmZzZXRQYXRoLFxuXHRcdFx0ZnJvbU9mZnNldFBhdGg6IGZyb21PZmZzZXRQYXRoLFxuXHRcdFx0c3BsaXRUcmVlOiBzcGxpdFRyZWUsXG5cdFx0XHRzcGxpdFBvaW50OiBzcGxpdFBvaW50LFxuXHRcdFx0Y3JlYXRlOiBjcmVhdGUsXG5cdFx0XHRjcmVhdGVUZXh0OiBjcmVhdGVUZXh0LFxuXHRcdFx0cmVtb3ZlOiByZW1vdmUsXG5cdFx0XHRyZW1vdmVXaGlsZTogcmVtb3ZlV2hpbGUsXG5cdFx0XHRyZXBsYWNlOiByZXBsYWNlLFxuXHRcdFx0aHRtbDogaHRtbCxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH07XG5cdH0pKCk7XG5cblxuXHR2YXIgcmFuZ2UgPSAoZnVuY3Rpb24gKCkge1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJuIGJvdW5kYXJ5UG9pbnQgZnJvbSBUZXh0UmFuZ2UsIGluc3BpcmVkIGJ5IEFuZHkgTmEncyBIdXNreVJhbmdlLmpzXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1RleHRSYW5nZX0gdGV4dFJhbmdlXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc1N0YXJ0XG5cdFx0ICogQHJldHVybiB7Qm91bmRhcnlQb2ludH1cblx0XHQgKlxuXHRcdCAqIEBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL21zNTM1ODcyKHY9dnMuODUpLmFzcHhcblx0XHQgKi9cblx0XHR2YXIgdGV4dFJhbmdlVG9Qb2ludCA9IGZ1bmN0aW9uICh0ZXh0UmFuZ2UsIGlzU3RhcnQpIHtcblx0XHRcdHZhciBjb250YWluZXIgPSB0ZXh0UmFuZ2UucGFyZW50RWxlbWVudCgpLCBvZmZzZXQ7XG5cblx0XHRcdHZhciB0ZXN0ZXIgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpLCBwcmV2Q29udGFpbmVyO1xuXHRcdFx0dmFyIGNoaWxkTm9kZXMgPSBsaXN0LmZyb20oY29udGFpbmVyLmNoaWxkTm9kZXMpO1xuXHRcdFx0Zm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBjaGlsZE5vZGVzLmxlbmd0aDsgb2Zmc2V0KyspIHtcblx0XHRcdFx0aWYgKGRvbS5pc1RleHQoY2hpbGROb2Rlc1tvZmZzZXRdKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRlc3Rlci5tb3ZlVG9FbGVtZW50VGV4dChjaGlsZE5vZGVzW29mZnNldF0pO1xuXHRcdFx0XHRpZiAodGVzdGVyLmNvbXBhcmVFbmRQb2ludHMoJ1N0YXJ0VG9TdGFydCcsIHRleHRSYW5nZSkgPj0gMCkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHByZXZDb250YWluZXIgPSBjaGlsZE5vZGVzW29mZnNldF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvZmZzZXQgIT09IDAgJiYgZG9tLmlzVGV4dChjaGlsZE5vZGVzW29mZnNldCAtIDFdKSkge1xuXHRcdFx0XHR2YXIgdGV4dFJhbmdlU3RhcnQgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpLCBjdXJUZXh0Tm9kZSA9IG51bGw7XG5cdFx0XHRcdHRleHRSYW5nZVN0YXJ0Lm1vdmVUb0VsZW1lbnRUZXh0KHByZXZDb250YWluZXIgfHwgY29udGFpbmVyKTtcblx0XHRcdFx0dGV4dFJhbmdlU3RhcnQuY29sbGFwc2UoIXByZXZDb250YWluZXIpO1xuXHRcdFx0XHRjdXJUZXh0Tm9kZSA9IHByZXZDb250YWluZXIgPyBwcmV2Q29udGFpbmVyLm5leHRTaWJsaW5nIDogY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG5cblx0XHRcdFx0dmFyIHBvaW50VGVzdGVyID0gdGV4dFJhbmdlLmR1cGxpY2F0ZSgpO1xuXHRcdFx0XHRwb2ludFRlc3Rlci5zZXRFbmRQb2ludCgnU3RhcnRUb1N0YXJ0JywgdGV4dFJhbmdlU3RhcnQpO1xuXHRcdFx0XHR2YXIgdGV4dENvdW50ID0gcG9pbnRUZXN0ZXIudGV4dC5yZXBsYWNlKC9bXFxyXFxuXS9nLCAnJykubGVuZ3RoO1xuXG5cdFx0XHRcdHdoaWxlICh0ZXh0Q291bnQgPiBjdXJUZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoICYmIGN1clRleHROb2RlLm5leHRTaWJsaW5nKSB7XG5cdFx0XHRcdFx0dGV4dENvdW50IC09IGN1clRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG5cdFx0XHRcdFx0Y3VyVGV4dE5vZGUgPSBjdXJUZXh0Tm9kZS5uZXh0U2libGluZztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0XHRcdFx0dmFyIGR1bW15ID0gY3VyVGV4dE5vZGUubm9kZVZhbHVlOyAvLyBlbmZvcmNlIElFIHRvIHJlLXJlZmVyZW5jZSBjdXJUZXh0Tm9kZSwgaGFja1xuXHRcdFx0XHQvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5cdFx0XHRcdGlmIChpc1N0YXJ0ICYmIGN1clRleHROb2RlLm5leHRTaWJsaW5nICYmIGRvbS5pc1RleHQoY3VyVGV4dE5vZGUubmV4dFNpYmxpbmcpICYmXG5cdFx0XHRcdFx0dGV4dENvdW50ID09PSBjdXJUZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dGV4dENvdW50IC09IGN1clRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG5cdFx0XHRcdFx0Y3VyVGV4dE5vZGUgPSBjdXJUZXh0Tm9kZS5uZXh0U2libGluZztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnRhaW5lciA9IGN1clRleHROb2RlO1xuXHRcdFx0XHRvZmZzZXQgPSB0ZXh0Q291bnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNvbnQ6IGNvbnRhaW5lcixcblx0XHRcdFx0b2Zmc2V0OiBvZmZzZXRcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybiBUZXh0UmFuZ2UgZnJvbSBib3VuZGFyeSBwb2ludCAoaW5zcGlyZWQgYnkgZ29vZ2xlIGNsb3N1cmUtbGlicmFyeSlcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHJldHVybiB7VGV4dFJhbmdlfVxuXHRcdCAqL1xuXHRcdHZhciBwb2ludFRvVGV4dFJhbmdlID0gZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHR2YXIgdGV4dFJhbmdlSW5mbyA9IGZ1bmN0aW9uIChjb250YWluZXIsIG9mZnNldCkge1xuXHRcdFx0XHR2YXIgbm9kZSwgaXNDb2xsYXBzZVRvU3RhcnQ7XG5cblx0XHRcdFx0aWYgKGRvbS5pc1RleHQoY29udGFpbmVyKSkge1xuXHRcdFx0XHRcdHZhciBwcmV2VGV4dE5vZGVzID0gZG9tLmxpc3RQcmV2KGNvbnRhaW5lciwgZnVuYy5ub3QoZG9tLmlzVGV4dCkpO1xuXHRcdFx0XHRcdHZhciBwcmV2Q29udGFpbmVyID0gbGlzdC5sYXN0KHByZXZUZXh0Tm9kZXMpLnByZXZpb3VzU2libGluZztcblx0XHRcdFx0XHRub2RlID0gcHJldkNvbnRhaW5lciB8fCBjb250YWluZXIucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRvZmZzZXQgKz0gbGlzdC5zdW0obGlzdC50YWlsKHByZXZUZXh0Tm9kZXMpLCBkb20ubm9kZUxlbmd0aCk7XG5cdFx0XHRcdFx0aXNDb2xsYXBzZVRvU3RhcnQgPSAhcHJldkNvbnRhaW5lcjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRub2RlID0gY29udGFpbmVyLmNoaWxkTm9kZXNbb2Zmc2V0XSB8fCBjb250YWluZXI7XG5cdFx0XHRcdFx0aWYgKGRvbS5pc1RleHQobm9kZSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0ZXh0UmFuZ2VJbmZvKG5vZGUsIDApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHRcdFx0aXNDb2xsYXBzZVRvU3RhcnQgPSBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bm9kZTogbm9kZSxcblx0XHRcdFx0XHRjb2xsYXBzZVRvU3RhcnQ6IGlzQ29sbGFwc2VUb1N0YXJ0LFxuXHRcdFx0XHRcdG9mZnNldDogb2Zmc2V0XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgdGV4dFJhbmdlID0gZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTtcblx0XHRcdHZhciBpbmZvID0gdGV4dFJhbmdlSW5mbyhwb2ludC5ub2RlLCBwb2ludC5vZmZzZXQpO1xuXG5cdFx0XHR0ZXh0UmFuZ2UubW92ZVRvRWxlbWVudFRleHQoaW5mby5ub2RlKTtcblx0XHRcdHRleHRSYW5nZS5jb2xsYXBzZShpbmZvLmNvbGxhcHNlVG9TdGFydCk7XG5cdFx0XHR0ZXh0UmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBpbmZvLm9mZnNldCk7XG5cdFx0XHRyZXR1cm4gdGV4dFJhbmdlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBXcmFwcGVkIFJhbmdlXG5cdFx0ICpcblx0XHQgKiBAY29uc3RydWN0b3Jcblx0XHQgKiBAcGFyYW0ge05vZGV9IHNjIC0gc3RhcnQgY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHNvIC0gc3RhcnQgb2Zmc2V0XG5cdFx0ICogQHBhcmFtIHtOb2RlfSBlYyAtIGVuZCBjb250YWluZXJcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gZW8gLSBlbmQgb2Zmc2V0XG5cdFx0ICovXG5cdFx0dmFyIFdyYXBwZWRSYW5nZSA9IGZ1bmN0aW9uIChzYywgc28sIGVjLCBlbykge1xuXHRcdFx0dGhpcy5zYyA9IHNjO1xuXHRcdFx0dGhpcy5zbyA9IHNvO1xuXHRcdFx0dGhpcy5lYyA9IGVjO1xuXHRcdFx0dGhpcy5lbyA9IGVvO1xuXG5cdFx0XHQvLyBuYXRpdmVSYW5nZTogZ2V0IG5hdGl2ZVJhbmdlIGZyb20gc2MsIHNvLCBlYywgZW9cblx0XHRcdHZhciBuYXRpdmVSYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKGFnZW50LmlzVzNDUmFuZ2VTdXBwb3J0KSB7XG5cdFx0XHRcdFx0dmFyIHczY1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblx0XHRcdFx0XHR3M2NSYW5nZS5zZXRTdGFydChzYywgc28pO1xuXHRcdFx0XHRcdHczY1JhbmdlLnNldEVuZChlYywgZW8pO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHczY1JhbmdlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhciB0ZXh0UmFuZ2UgPSBwb2ludFRvVGV4dFJhbmdlKHtcblx0XHRcdFx0XHRcdG5vZGU6IHNjLFxuXHRcdFx0XHRcdFx0b2Zmc2V0OiBzb1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0dGV4dFJhbmdlLnNldEVuZFBvaW50KCdFbmRUb0VuZCcsIHBvaW50VG9UZXh0UmFuZ2Uoe1xuXHRcdFx0XHRcdFx0bm9kZTogZWMsXG5cdFx0XHRcdFx0XHRvZmZzZXQ6IGVvXG5cdFx0XHRcdFx0fSkpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRleHRSYW5nZTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5nZXRQb2ludHMgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0c2M6IHNjLFxuXHRcdFx0XHRcdHNvOiBzbyxcblx0XHRcdFx0XHRlYzogZWMsXG5cdFx0XHRcdFx0ZW86IGVvXG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLmdldFN0YXJ0UG9pbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bm9kZTogc2MsXG5cdFx0XHRcdFx0b2Zmc2V0OiBzb1xuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5nZXRFbmRQb2ludCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRub2RlOiBlYyxcblx0XHRcdFx0XHRvZmZzZXQ6IGVvXG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHNlbGVjdCB1cGRhdGUgdmlzaWJsZSByYW5nZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIG5hdGl2ZVJuZyA9IG5hdGl2ZVJhbmdlKCk7XG5cdFx0XHRcdGlmIChhZ2VudC5pc1czQ1JhbmdlU3VwcG9ydCkge1xuXHRcdFx0XHRcdHZhciBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcblx0XHRcdFx0XHRpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNlbGVjdGlvbi5hZGRSYW5nZShuYXRpdmVSbmcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5hdGl2ZVJuZy5zZWxlY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMubm9ybWFsaXplID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0XHRcdCAqIEByZXR1cm4ge0JvdW5kYXJ5UG9pbnR9XG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR2YXIgZ2V0VmlzaWJsZVBvaW50ID0gZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHRcdFx0aWYgKCFkb20uaXNWaXNpYmxlUG9pbnQocG9pbnQpKSB7XG5cdFx0XHRcdFx0XHRpZiAoZG9tLmlzTGVmdEVkZ2VQb2ludChwb2ludCkpIHtcblx0XHRcdFx0XHRcdFx0cG9pbnQgPSBkb20ubmV4dFBvaW50VW50aWwocG9pbnQsIGRvbS5pc1Zpc2libGVQb2ludCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwb2ludCA9IGRvbS5wcmV2UG9pbnRVbnRpbChwb2ludCwgZG9tLmlzVmlzaWJsZVBvaW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHBvaW50O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHZhciBzdGFydFBvaW50ID0gZ2V0VmlzaWJsZVBvaW50KHRoaXMuZ2V0U3RhcnRQb2ludCgpKTtcblx0XHRcdFx0dmFyIGVuZFBvaW50ID0gZ2V0VmlzaWJsZVBvaW50KHRoaXMuZ2V0RW5kUG9pbnQoKSk7XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2UoXG5cdFx0XHRcdCAgc3RhcnRQb2ludC5ub2RlLFxuXHRcdFx0XHQgIHN0YXJ0UG9pbnQub2Zmc2V0LFxuXHRcdFx0XHQgIGVuZFBvaW50Lm5vZGUsXG5cdFx0XHRcdCAgZW5kUG9pbnQub2Zmc2V0XG5cdFx0XHRcdCk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHJldHVybnMgbWF0Y2hlZCBub2RlcyBvbiByYW5nZVxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkXSAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuXHRcdFx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbmNsdWRlQW5jZXN0b3JdXG5cdFx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZ1bGx5Q29udGFpbnNdXG5cdFx0XHQgKiBAcmV0dXJuIHtOb2RlW119XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMubm9kZXMgPSBmdW5jdGlvbiAocHJlZCwgb3B0aW9ucykge1xuXHRcdFx0XHRwcmVkID0gcHJlZCB8fCBmdW5jLm9rO1xuXG5cdFx0XHRcdHZhciBpbmNsdWRlQW5jZXN0b3IgPSBvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZUFuY2VzdG9yO1xuXHRcdFx0XHR2YXIgZnVsbHlDb250YWlucyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5mdWxseUNvbnRhaW5zO1xuXG5cdFx0XHRcdC8vIFRPRE8gY29tcGFyZSBwb2ludHMgYW5kIHNvcnRcblx0XHRcdFx0dmFyIHN0YXJ0UG9pbnQgPSB0aGlzLmdldFN0YXJ0UG9pbnQoKTtcblx0XHRcdFx0dmFyIGVuZFBvaW50ID0gdGhpcy5nZXRFbmRQb2ludCgpO1xuXG5cdFx0XHRcdHZhciBub2RlcyA9IFtdO1xuXHRcdFx0XHR2YXIgbGVmdEVkZ2VOb2RlcyA9IFtdO1xuXG5cdFx0XHRcdGRvbS53YWxrUG9pbnQoc3RhcnRQb2ludCwgZW5kUG9pbnQsIGZ1bmN0aW9uIChwb2ludCkge1xuXHRcdFx0XHRcdGlmIChkb20uaXNFZGl0YWJsZShwb2ludC5ub2RlKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBub2RlO1xuXHRcdFx0XHRcdGlmIChmdWxseUNvbnRhaW5zKSB7XG5cdFx0XHRcdFx0XHRpZiAoZG9tLmlzTGVmdEVkZ2VQb2ludChwb2ludCkpIHtcblx0XHRcdFx0XHRcdFx0bGVmdEVkZ2VOb2Rlcy5wdXNoKHBvaW50Lm5vZGUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGRvbS5pc1JpZ2h0RWRnZVBvaW50KHBvaW50KSAmJiBsaXN0LmNvbnRhaW5zKGxlZnRFZGdlTm9kZXMsIHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBwb2ludC5ub2RlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaW5jbHVkZUFuY2VzdG9yKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gZG9tLmFuY2VzdG9yKHBvaW50Lm5vZGUsIHByZWQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRub2RlID0gcG9pbnQubm9kZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAobm9kZSAmJiBwcmVkKG5vZGUpKSB7XG5cdFx0XHRcdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSwgdHJ1ZSk7XG5cblx0XHRcdFx0cmV0dXJuIGxpc3QudW5pcXVlKG5vZGVzKTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogcmV0dXJucyBjb21tb25BbmNlc3RvciBvZiByYW5nZVxuXHRcdFx0ICogQHJldHVybiB7RWxlbWVudH0gLSBjb21tb25BbmNlc3RvclxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmNvbW1vbkFuY2VzdG9yID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gZG9tLmNvbW1vbkFuY2VzdG9yKHNjLCBlYyk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHJldHVybnMgZXhwYW5kZWQgcmFuZ2UgYnkgcHJlZFxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5leHBhbmQgPSBmdW5jdGlvbiAocHJlZCkge1xuXHRcdFx0XHR2YXIgc3RhcnRBbmNlc3RvciA9IGRvbS5hbmNlc3RvcihzYywgcHJlZCk7XG5cdFx0XHRcdHZhciBlbmRBbmNlc3RvciA9IGRvbS5hbmNlc3RvcihlYywgcHJlZCk7XG5cblx0XHRcdFx0aWYgKCFzdGFydEFuY2VzdG9yICYmICFlbmRBbmNlc3Rvcikge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKHNjLCBzbywgZWMsIGVvKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBib3VuZGFyeVBvaW50cyA9IHRoaXMuZ2V0UG9pbnRzKCk7XG5cblx0XHRcdFx0aWYgKHN0YXJ0QW5jZXN0b3IpIHtcblx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5zYyA9IHN0YXJ0QW5jZXN0b3I7XG5cdFx0XHRcdFx0Ym91bmRhcnlQb2ludHMuc28gPSAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGVuZEFuY2VzdG9yKSB7XG5cdFx0XHRcdFx0Ym91bmRhcnlQb2ludHMuZWMgPSBlbmRBbmNlc3Rvcjtcblx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5lbyA9IGRvbS5ub2RlTGVuZ3RoKGVuZEFuY2VzdG9yKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLnNjLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLnNvLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLmVjLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLmVvXG5cdFx0XHRcdCk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNDb2xsYXBzZVRvU3RhcnRcblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5jb2xsYXBzZSA9IGZ1bmN0aW9uIChpc0NvbGxhcHNlVG9TdGFydCkge1xuXHRcdFx0XHRpZiAoaXNDb2xsYXBzZVRvU3RhcnQpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShzYywgc28sIHNjLCBzbyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2UoZWMsIGVvLCBlYywgZW8pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHNwbGl0VGV4dCBvbiByYW5nZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnNwbGl0VGV4dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIGlzU2FtZUNvbnRhaW5lciA9IHNjID09PSBlYztcblx0XHRcdFx0dmFyIGJvdW5kYXJ5UG9pbnRzID0gdGhpcy5nZXRQb2ludHMoKTtcblxuXHRcdFx0XHRpZiAoZG9tLmlzVGV4dChlYykgJiYgIWRvbS5pc0VkZ2VQb2ludCh0aGlzLmdldEVuZFBvaW50KCkpKSB7XG5cdFx0XHRcdFx0ZWMuc3BsaXRUZXh0KGVvKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkb20uaXNUZXh0KHNjKSAmJiAhZG9tLmlzRWRnZVBvaW50KHRoaXMuZ2V0U3RhcnRQb2ludCgpKSkge1xuXHRcdFx0XHRcdGJvdW5kYXJ5UG9pbnRzLnNjID0gc2Muc3BsaXRUZXh0KHNvKTtcblx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5zbyA9IDA7XG5cblx0XHRcdFx0XHRpZiAoaXNTYW1lQ29udGFpbmVyKSB7XG5cdFx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5lYyA9IGJvdW5kYXJ5UG9pbnRzLnNjO1xuXHRcdFx0XHRcdFx0Ym91bmRhcnlQb2ludHMuZW8gPSBlbyAtIHNvO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLnNjLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLnNvLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLmVjLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLmVvXG5cdFx0XHRcdCk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIGRlbGV0ZSBjb250ZW50cyBvbiByYW5nZVxuXHRcdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmRlbGV0ZUNvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAodGhpcy5pc0NvbGxhcHNlZCgpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcm5nID0gdGhpcy5zcGxpdFRleHQoKTtcblx0XHRcdFx0dmFyIG5vZGVzID0gcm5nLm5vZGVzKG51bGwsIHtcblx0XHRcdFx0XHRmdWxseUNvbnRhaW5zOiB0cnVlXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIGZpbmQgbmV3IGN1cnNvciBwb2ludFxuXHRcdFx0XHR2YXIgcG9pbnQgPSBkb20ucHJldlBvaW50VW50aWwocm5nLmdldFN0YXJ0UG9pbnQoKSwgZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHRcdFx0cmV0dXJuICFsaXN0LmNvbnRhaW5zKG5vZGVzLCBwb2ludC5ub2RlKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIGVtcHR5UGFyZW50cyA9IFtdO1xuXHRcdFx0XHQkLmVhY2gobm9kZXMsIGZ1bmN0aW9uIChpZHgsIG5vZGUpIHtcblx0XHRcdFx0XHQvLyBmaW5kIGVtcHR5IHBhcmVudHNcblx0XHRcdFx0XHR2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdGlmIChwb2ludC5ub2RlICE9PSBwYXJlbnQgJiYgZG9tLm5vZGVMZW5ndGgocGFyZW50KSA9PT0gMSkge1xuXHRcdFx0XHRcdFx0ZW1wdHlQYXJlbnRzLnB1c2gocGFyZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9tLnJlbW92ZShub2RlLCBmYWxzZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIHJlbW92ZSBlbXB0eSBwYXJlbnRzXG5cdFx0XHRcdCQuZWFjaChlbXB0eVBhcmVudHMsIGZ1bmN0aW9uIChpZHgsIG5vZGUpIHtcblx0XHRcdFx0XHRkb20ucmVtb3ZlKG5vZGUsIGZhbHNlKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2UoXG5cdFx0XHRcdCAgcG9pbnQubm9kZSxcblx0XHRcdFx0ICBwb2ludC5vZmZzZXQsXG5cdFx0XHRcdCAgcG9pbnQubm9kZSxcblx0XHRcdFx0ICBwb2ludC5vZmZzZXRcblx0XHRcdFx0KS5ub3JtYWxpemUoKTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogbWFrZUlzT246IHJldHVybiBpc09uKHByZWQpIGZ1bmN0aW9uXG5cdFx0XHQgKi9cblx0XHRcdHZhciBtYWtlSXNPbiA9IGZ1bmN0aW9uIChwcmVkKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0dmFyIGFuY2VzdG9yID0gZG9tLmFuY2VzdG9yKHNjLCBwcmVkKTtcblx0XHRcdFx0XHRyZXR1cm4gISFhbmNlc3RvciAmJiAoYW5jZXN0b3IgPT09IGRvbS5hbmNlc3RvcihlYywgcHJlZCkpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdFx0Ly8gaXNPbkVkaXRhYmxlOiBqdWRnZSB3aGV0aGVyIHJhbmdlIGlzIG9uIGVkaXRhYmxlIG9yIG5vdFxuXHRcdFx0dGhpcy5pc09uRWRpdGFibGUgPSBtYWtlSXNPbihkb20uaXNFZGl0YWJsZSk7XG5cdFx0XHQvLyBpc09uTGlzdDoganVkZ2Ugd2hldGhlciByYW5nZSBpcyBvbiBsaXN0IG5vZGUgb3Igbm90XG5cdFx0XHR0aGlzLmlzT25MaXN0ID0gbWFrZUlzT24oZG9tLmlzTGlzdCk7XG5cdFx0XHQvLyBpc09uQW5jaG9yOiBqdWRnZSB3aGV0aGVyIHJhbmdlIGlzIG9uIGFuY2hvciBub2RlIG9yIG5vdFxuXHRcdFx0dGhpcy5pc09uQW5jaG9yID0gbWFrZUlzT24oZG9tLmlzQW5jaG9yKTtcblx0XHRcdC8vIGlzT25BbmNob3I6IGp1ZGdlIHdoZXRoZXIgcmFuZ2UgaXMgb24gY2VsbCBub2RlIG9yIG5vdFxuXHRcdFx0dGhpcy5pc09uQ2VsbCA9IG1ha2VJc09uKGRvbS5pc0NlbGwpO1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcblx0XHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuaXNMZWZ0RWRnZU9mID0gZnVuY3Rpb24gKHByZWQpIHtcblx0XHRcdFx0aWYgKCFkb20uaXNMZWZ0RWRnZVBvaW50KHRoaXMuZ2V0U3RhcnRQb2ludCgpKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBub2RlID0gZG9tLmFuY2VzdG9yKHRoaXMuc2MsIHByZWQpO1xuXHRcdFx0XHRyZXR1cm4gbm9kZSAmJiBkb20uaXNMZWZ0RWRnZU9mKHRoaXMuc2MsIG5vZGUpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiByZXR1cm5zIHdoZXRoZXIgcmFuZ2Ugd2FzIGNvbGxhcHNlZCBvciBub3Rcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5pc0NvbGxhcHNlZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHNjID09PSBlYyAmJiBzbyA9PT0gZW87XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHdyYXAgaW5saW5lIG5vZGVzIHdoaWNoIGNoaWxkcmVuIG9mIGJvZHkgd2l0aCBwYXJhZ3JhcGhcblx0XHRcdCAqXG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMud3JhcEJvZHlJbmxpbmVXaXRoUGFyYSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKGRvbS5pc0JvZHlDb250YWluZXIoc2MpICYmIGRvbS5pc0VtcHR5KHNjKSkge1xuXHRcdFx0XHRcdHNjLmlubmVySFRNTCA9IGRvbS5lbXB0eVBhcmE7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2Uoc2MuZmlyc3RDaGlsZCwgMCwgc2MuZmlyc3RDaGlsZCwgMCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZG9tLmlzUGFyYUlubGluZShzYykgfHwgZG9tLmlzUGFyYShzYykpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGZpbmQgaW5saW5lIHRvcCBhbmNlc3RvclxuXHRcdFx0XHR2YXIgdG9wQW5jZXN0b3I7XG5cdFx0XHRcdGlmIChkb20uaXNJbmxpbmUoc2MpKSB7XG5cdFx0XHRcdFx0dmFyIGFuY2VzdG9ycyA9IGRvbS5saXN0QW5jZXN0b3Ioc2MsIGZ1bmMubm90KGRvbS5pc0lubGluZSkpO1xuXHRcdFx0XHRcdHRvcEFuY2VzdG9yID0gbGlzdC5sYXN0KGFuY2VzdG9ycyk7XG5cdFx0XHRcdFx0aWYgKCFkb20uaXNJbmxpbmUodG9wQW5jZXN0b3IpKSB7XG5cdFx0XHRcdFx0XHR0b3BBbmNlc3RvciA9IGFuY2VzdG9yc1thbmNlc3RvcnMubGVuZ3RoIC0gMl0gfHwgc2MuY2hpbGROb2Rlc1tzb107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRvcEFuY2VzdG9yID0gc2MuY2hpbGROb2Rlc1tzbyA+IDAgPyBzbyAtIDEgOiAwXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHNpYmxpbmdzIG5vdCBpbiBwYXJhZ3JhcGhcblx0XHRcdFx0dmFyIGlubGluZVNpYmxpbmdzID0gZG9tLmxpc3RQcmV2KHRvcEFuY2VzdG9yLCBkb20uaXNQYXJhSW5saW5lKS5yZXZlcnNlKCk7XG5cdFx0XHRcdGlubGluZVNpYmxpbmdzID0gaW5saW5lU2libGluZ3MuY29uY2F0KGRvbS5saXN0TmV4dCh0b3BBbmNlc3Rvci5uZXh0U2libGluZywgZG9tLmlzUGFyYUlubGluZSkpO1xuXG5cdFx0XHRcdC8vIHdyYXAgd2l0aCBwYXJhZ3JhcGhcblx0XHRcdFx0aWYgKGlubGluZVNpYmxpbmdzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHZhciBwYXJhID0gZG9tLndyYXAobGlzdC5oZWFkKGlubGluZVNpYmxpbmdzKSwgJ3AnKTtcblx0XHRcdFx0XHRkb20uYXBwZW5kQ2hpbGROb2RlcyhwYXJhLCBsaXN0LnRhaWwoaW5saW5lU2libGluZ3MpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBpbnNlcnQgbm9kZSBhdCBjdXJyZW50IGN1cnNvclxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdFx0ICogQHJldHVybiB7Tm9kZX1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5pbnNlcnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdFx0dmFyIHJuZyA9IHRoaXMud3JhcEJvZHlJbmxpbmVXaXRoUGFyYSgpLmRlbGV0ZUNvbnRlbnRzKCk7XG5cdFx0XHRcdHZhciBpbmZvID0gZG9tLnNwbGl0UG9pbnQocm5nLmdldFN0YXJ0UG9pbnQoKSwgZG9tLmlzSW5saW5lKG5vZGUpKTtcblxuXHRcdFx0XHRpZiAoaW5mby5yaWdodE5vZGUpIHtcblx0XHRcdFx0XHRpbmZvLnJpZ2h0Tm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBpbmZvLnJpZ2h0Tm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aW5mby5jb250YWluZXIuYXBwZW5kQ2hpbGQobm9kZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbm9kZTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogcmV0dXJucyB0ZXh0IGluIHJhbmdlXG5cdFx0XHQgKlxuXHRcdFx0ICogQHJldHVybiB7U3RyaW5nfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgbmF0aXZlUm5nID0gbmF0aXZlUmFuZ2UoKTtcblx0XHRcdFx0cmV0dXJuIGFnZW50LmlzVzNDUmFuZ2VTdXBwb3J0ID8gbmF0aXZlUm5nLnRvU3RyaW5nKCkgOiBuYXRpdmVSbmcudGV4dDtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogY3JlYXRlIG9mZnNldFBhdGggYm9va21hcmtcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge05vZGV9IGVkaXRhYmxlXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuYm9va21hcmsgPSBmdW5jdGlvbiAoZWRpdGFibGUpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRzOiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBkb20ubWFrZU9mZnNldFBhdGgoZWRpdGFibGUsIHNjKSxcblx0XHRcdFx0XHRcdG9mZnNldDogc29cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGU6IHtcblx0XHRcdFx0XHRcdHBhdGg6IGRvbS5tYWtlT2Zmc2V0UGF0aChlZGl0YWJsZSwgZWMpLFxuXHRcdFx0XHRcdFx0b2Zmc2V0OiBlb1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogY3JlYXRlIG9mZnNldFBhdGggYm9va21hcmsgYmFzZSBvbiBwYXJhZ3JhcGhcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge05vZGVbXX0gcGFyYXNcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5wYXJhQm9va21hcmsgPSBmdW5jdGlvbiAocGFyYXMpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRzOiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBsaXN0LnRhaWwoZG9tLm1ha2VPZmZzZXRQYXRoKGxpc3QuaGVhZChwYXJhcyksIHNjKSksXG5cdFx0XHRcdFx0XHRvZmZzZXQ6IHNvXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlOiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBsaXN0LnRhaWwoZG9tLm1ha2VPZmZzZXRQYXRoKGxpc3QubGFzdChwYXJhcyksIGVjKSksXG5cdFx0XHRcdFx0XHRvZmZzZXQ6IGVvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBnZXRDbGllbnRSZWN0c1xuXHRcdFx0ICogQHJldHVybiB7UmVjdFtdfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmdldENsaWVudFJlY3RzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgbmF0aXZlUm5nID0gbmF0aXZlUmFuZ2UoKTtcblx0XHRcdFx0cmV0dXJuIG5hdGl2ZVJuZy5nZXRDbGllbnRSZWN0cygpO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQGNsYXNzIGNvcmUucmFuZ2Vcblx0XHQgKlxuXHRcdCAqIERhdGEgc3RydWN0dXJlXG5cdFx0ICogICogQm91bmRhcnlQb2ludDogYSBwb2ludCBvZiBkb20gdHJlZVxuXHRcdCAqICAqIEJvdW5kYXJ5UG9pbnRzOiB0d28gYm91bmRhcnlQb2ludHMgY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIFJhbmdlXG5cdFx0ICpcblx0XHQgKiBTZWUgdG8gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItVHJhdmVyc2FsLVJhbmdlL3Jhbmdlcy5odG1sI0xldmVsLTItUmFuZ2UtUG9zaXRpb25cblx0XHQgKlxuXHRcdCAqIEBzaW5nbGV0b25cblx0XHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIHJhbmdlXG5cdFx0ICovXG5cdFx0cmV0dXJuIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogQG1ldGhvZFxuXHRcdFx0ICogXG5cdFx0XHQgKiBjcmVhdGUgUmFuZ2UgT2JqZWN0IEZyb20gYXJndW1lbnRzIG9yIEJyb3dzZXIgU2VsZWN0aW9uXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtOb2RlfSBzYyAtIHN0YXJ0IGNvbnRhaW5lclxuXHRcdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHNvIC0gc3RhcnQgb2Zmc2V0XG5cdFx0XHQgKiBAcGFyYW0ge05vZGV9IGVjIC0gZW5kIGNvbnRhaW5lclxuXHRcdFx0ICogQHBhcmFtIHtOdW1iZXJ9IGVvIC0gZW5kIG9mZnNldFxuXHRcdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdFx0ICovXG5cdFx0XHRjcmVhdGU6IGZ1bmN0aW9uIChzYywgc28sIGVjLCBlbykge1xuXHRcdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgLy8gZnJvbSBCcm93c2VyIFNlbGVjdGlvblxuXHRcdFx0XHRcdGlmIChhZ2VudC5pc1czQ1JhbmdlU3VwcG9ydCkge1xuXHRcdFx0XHRcdFx0dmFyIHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXHRcdFx0XHRcdFx0aWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChkb20uaXNCb2R5KHNlbGVjdGlvbi5hbmNob3JOb2RlKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBGaXJlZm94OiByZXR1cm5zIGVudGlyZSBib2R5IGFzIHJhbmdlIG9uIGluaXRpYWxpemF0aW9uLiBXZSB3b24ndCBuZXZlciBuZWVkIGl0LlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dmFyIG5hdGl2ZVJuZyA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuXHRcdFx0XHRcdFx0c2MgPSBuYXRpdmVSbmcuc3RhcnRDb250YWluZXI7XG5cdFx0XHRcdFx0XHRzbyA9IG5hdGl2ZVJuZy5zdGFydE9mZnNldDtcblx0XHRcdFx0XHRcdGVjID0gbmF0aXZlUm5nLmVuZENvbnRhaW5lcjtcblx0XHRcdFx0XHRcdGVvID0gbmF0aXZlUm5nLmVuZE9mZnNldDtcblx0XHRcdFx0XHR9IGVsc2UgeyAvLyBJRTg6IFRleHRSYW5nZVxuXHRcdFx0XHRcdFx0dmFyIHRleHRSYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO1xuXHRcdFx0XHRcdFx0dmFyIHRleHRSYW5nZUVuZCA9IHRleHRSYW5nZS5kdXBsaWNhdGUoKTtcblx0XHRcdFx0XHRcdHRleHRSYW5nZUVuZC5jb2xsYXBzZShmYWxzZSk7XG5cdFx0XHRcdFx0XHR2YXIgdGV4dFJhbmdlU3RhcnQgPSB0ZXh0UmFuZ2U7XG5cdFx0XHRcdFx0XHR0ZXh0UmFuZ2VTdGFydC5jb2xsYXBzZSh0cnVlKTtcblxuXHRcdFx0XHRcdFx0dmFyIHN0YXJ0UG9pbnQgPSB0ZXh0UmFuZ2VUb1BvaW50KHRleHRSYW5nZVN0YXJ0LCB0cnVlKSxcblx0XHRcdFx0XHRcdGVuZFBvaW50ID0gdGV4dFJhbmdlVG9Qb2ludCh0ZXh0UmFuZ2VFbmQsIGZhbHNlKTtcblxuXHRcdFx0XHRcdFx0Ly8gc2FtZSB2aXNpYmxlIHBvaW50IGNhc2U6IHJhbmdlIHdhcyBjb2xsYXBzZWQuXG5cdFx0XHRcdFx0XHRpZiAoZG9tLmlzVGV4dChzdGFydFBvaW50Lm5vZGUpICYmIGRvbS5pc0xlZnRFZGdlUG9pbnQoc3RhcnRQb2ludCkgJiZcblx0XHRcdFx0XHRcdFx0ZG9tLmlzVGV4dE5vZGUoZW5kUG9pbnQubm9kZSkgJiYgZG9tLmlzUmlnaHRFZGdlUG9pbnQoZW5kUG9pbnQpICYmXG5cdFx0XHRcdFx0XHRcdGVuZFBvaW50Lm5vZGUubmV4dFNpYmxpbmcgPT09IHN0YXJ0UG9pbnQubm9kZSkge1xuXHRcdFx0XHRcdFx0XHRzdGFydFBvaW50ID0gZW5kUG9pbnQ7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHNjID0gc3RhcnRQb2ludC5jb250O1xuXHRcdFx0XHRcdFx0c28gPSBzdGFydFBvaW50Lm9mZnNldDtcblx0XHRcdFx0XHRcdGVjID0gZW5kUG9pbnQuY29udDtcblx0XHRcdFx0XHRcdGVvID0gZW5kUG9pbnQub2Zmc2V0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7IC8vY29sbGFwc2VkXG5cdFx0XHRcdFx0ZWMgPSBzYztcblx0XHRcdFx0XHRlbyA9IHNvO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKHNjLCBzbywgZWMsIGVvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQG1ldGhvZCBcblx0XHRcdCAqIFxuXHRcdFx0ICogY3JlYXRlIFdyYXBwZWRSYW5nZSBmcm9tIG5vZGVcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0Y3JlYXRlRnJvbU5vZGU6IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdHZhciBzYyA9IG5vZGU7XG5cdFx0XHRcdHZhciBzbyA9IDA7XG5cdFx0XHRcdHZhciBlYyA9IG5vZGU7XG5cdFx0XHRcdHZhciBlbyA9IGRvbS5ub2RlTGVuZ3RoKGVjKTtcblxuXHRcdFx0XHQvLyBicm93c2VycyBjYW4ndCB0YXJnZXQgYSBwaWN0dXJlIG9yIHZvaWQgbm9kZVxuXHRcdFx0XHRpZiAoZG9tLmlzVm9pZChzYykpIHtcblx0XHRcdFx0XHRzbyA9IGRvbS5saXN0UHJldihzYykubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRzYyA9IHNjLnBhcmVudE5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGRvbS5pc0JSKGVjKSkge1xuXHRcdFx0XHRcdGVvID0gZG9tLmxpc3RQcmV2KGVjKS5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdGVjID0gZWMucGFyZW50Tm9kZTtcblx0XHRcdFx0fSBlbHNlIGlmIChkb20uaXNWb2lkKGVjKSkge1xuXHRcdFx0XHRcdGVvID0gZG9tLmxpc3RQcmV2KGVjKS5sZW5ndGg7XG5cdFx0XHRcdFx0ZWMgPSBlYy5wYXJlbnROb2RlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlKHNjLCBzbywgZWMsIGVvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQG1ldGhvZCBcblx0XHRcdCAqIFxuXHRcdFx0ICogY3JlYXRlIFdyYXBwZWRSYW5nZSBmcm9tIGJvb2ttYXJrXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtOb2RlfSBlZGl0YWJsZVxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGJvb2ttYXJrXG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdGNyZWF0ZUZyb21Cb29rbWFyazogZnVuY3Rpb24gKGVkaXRhYmxlLCBib29rbWFyaykge1xuXHRcdFx0XHR2YXIgc2MgPSBkb20uZnJvbU9mZnNldFBhdGgoZWRpdGFibGUsIGJvb2ttYXJrLnMucGF0aCk7XG5cdFx0XHRcdHZhciBzbyA9IGJvb2ttYXJrLnMub2Zmc2V0O1xuXHRcdFx0XHR2YXIgZWMgPSBkb20uZnJvbU9mZnNldFBhdGgoZWRpdGFibGUsIGJvb2ttYXJrLmUucGF0aCk7XG5cdFx0XHRcdHZhciBlbyA9IGJvb2ttYXJrLmUub2Zmc2V0O1xuXHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShzYywgc28sIGVjLCBlbyk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBtZXRob2QgXG5cdFx0XHQgKlxuXHRcdFx0ICogY3JlYXRlIFdyYXBwZWRSYW5nZSBmcm9tIHBhcmFCb29rbWFya1xuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBib29rbWFya1xuXHRcdFx0ICogQHBhcmFtIHtOb2RlW119IHBhcmFzXG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdGNyZWF0ZUZyb21QYXJhQm9va21hcms6IGZ1bmN0aW9uIChib29rbWFyaywgcGFyYXMpIHtcblx0XHRcdFx0dmFyIHNvID0gYm9va21hcmsucy5vZmZzZXQ7XG5cdFx0XHRcdHZhciBlbyA9IGJvb2ttYXJrLmUub2Zmc2V0O1xuXHRcdFx0XHR2YXIgc2MgPSBkb20uZnJvbU9mZnNldFBhdGgobGlzdC5oZWFkKHBhcmFzKSwgYm9va21hcmsucy5wYXRoKTtcblx0XHRcdFx0dmFyIGVjID0gZG9tLmZyb21PZmZzZXRQYXRoKGxpc3QubGFzdChwYXJhcyksIGJvb2ttYXJrLmUucGF0aCk7XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2Uoc2MsIHNvLCBlYywgZW8pO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pKCk7XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBkZWZhdWx0cyBcblx0ICogXG5cdCAqIEBzaW5nbGV0b25cblx0ICovXG5cdHZhciBkZWZhdWx0cyA9IHtcblx0XHQvKiogQHByb3BlcnR5ICovXG5cdFx0dmVyc2lvbjogJzAuNi4zJyxcblxuXHRcdC8qKlxuXHRcdCAqIFxuXHRcdCAqIGZvciBldmVudCBvcHRpb25zLCByZWZlcmVuY2UgdG8gRXZlbnRIYW5kbGVyLmF0dGFjaFxuXHRcdCAqIFxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zIFxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nL051bWJlcn0gW29wdGlvbnMud2lkdGg9bnVsbF0gc2V0IGVkaXRvciB3aWR0aCBcblx0XHQgKiBAcHJvcGVydHkge1N0cmluZy9OdW1iZXJ9IFtvcHRpb25zLmhlaWdodD1udWxsXSBzZXQgZWRpdG9yIGhlaWdodCwgZXgpIDMwMFxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nL051bWJlcn0gb3B0aW9ucy5taW5IZWlnaHQgc2V0IG1pbmltdW0gaGVpZ2h0IG9mIGVkaXRvclxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nL051bWJlcn0gb3B0aW9ucy5tYXhIZWlnaHRcblx0XHQgKiBAcHJvcGVydHkge1N0cmluZy9OdW1iZXJ9IG9wdGlvbnMuZm9jdXMgXG5cdFx0ICogQHByb3BlcnR5IHtOdW1iZXJ9IG9wdGlvbnMudGFic2l6ZSBcblx0XHQgKiBAcHJvcGVydHkge0Jvb2xlYW59IG9wdGlvbnMuc3R5bGVXaXRoU3BhblxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLmNvZGVtaXJyb3Jcblx0XHQgKiBAcHJvcGVydHkge09iamVjdH0gW29wdGlvbnMuY29kZW1pcnJvci5tb2RlPSd0ZXh0L2h0bWwnXVxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbb3B0aW9ucy5jb2RlbWlycm9yLmh0bWxNb2RlPXRydWVdXG5cdFx0ICogQHByb3BlcnR5IHtPYmplY3R9IFtvcHRpb25zLmNvZGVtaXJyb3IubGluZU51bWJlcnM9dHJ1ZV1cblx0XHQgKiBAcHJvcGVydHkge1N0cmluZ30gW29wdGlvbnMubGFuZz1lbi1VU10gbGFuZ3VhZ2UgJ2VuLVVTJywgJ2tvLUtSJywgLi4uXG5cdFx0ICogQHByb3BlcnR5IHtTdHJpbmd9IFtvcHRpb25zLmRpcmVjdGlvbj1udWxsXSB0ZXh0IGRpcmVjdGlvbiwgZXgpICdydGwnXG5cdFx0ICogQHByb3BlcnR5IHtBcnJheX0gW29wdGlvbnMudG9vbGJhcl1cblx0XHQgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtvcHRpb25zLmFpck1vZGU9ZmFsc2VdXG5cdFx0ICogQHByb3BlcnR5IHtBcnJheX0gW29wdGlvbnMuYWlyUG9wb3Zlcl1cblx0XHQgKiBAcHJvcGVydHkge0Z1Y250aW9ufSBbb3B0aW9ucy5vbkluaXRdIGluaXRpYWxpemVcblx0XHQgKiBAcHJvcGVydHkge0Z1Y250aW9ufSBbb3B0aW9ucy5vbnN1Ym1pdF1cblx0XHQgKi9cblx0XHRvcHRpb25zOiB7XG5cdFx0XHR3aWR0aDogbnVsbCwgICAgICAgICAgICAgICAgICAvLyBzZXQgZWRpdG9yIHdpZHRoXG5cdFx0XHRoZWlnaHQ6IG51bGwsICAgICAgICAgICAgICAgICAvLyBzZXQgZWRpdG9yIGhlaWdodCwgZXgpIDMwMFxuXG5cdFx0XHRtaW5IZWlnaHQ6IG51bGwsICAgICAgICAgICAgICAvLyBzZXQgbWluaW11bSBoZWlnaHQgb2YgZWRpdG9yXG5cdFx0XHRtYXhIZWlnaHQ6IG51bGwsICAgICAgICAgICAgICAvLyBzZXQgbWF4aW11bSBoZWlnaHQgb2YgZWRpdG9yXG5cblx0XHRcdGZvY3VzOiBmYWxzZSwgICAgICAgICAgICAgICAgIC8vIHNldCBmb2N1cyB0byBlZGl0YWJsZSBhcmVhIGFmdGVyIGluaXRpYWxpemluZyBzdW1tZXJub3RlXG5cblx0XHRcdHRhYnNpemU6IDQsICAgICAgICAgICAgICAgICAgIC8vIHNpemUgb2YgdGFiIGV4KSAyIG9yIDRcblx0XHRcdHN0eWxlV2l0aFNwYW46IHRydWUsICAgICAgICAgIC8vIHN0eWxlIHdpdGggc3BhbiAoQ2hyb21lIGFuZCBGRiBvbmx5KVxuXG5cdFx0XHRkaXNhYmxlTGlua1RhcmdldDogZmFsc2UsICAgICAvLyBoaWRlIGxpbmsgVGFyZ2V0IENoZWNrYm94XG5cdFx0XHRkaXNhYmxlRHJhZ0FuZERyb3A6IGZhbHNlLCAgICAvLyBkaXNhYmxlIGRyYWcgYW5kIGRyb3AgZXZlbnRcblx0XHRcdGRpc2FibGVSZXNpemVFZGl0b3I6IGZhbHNlLCAgIC8vIGRpc2FibGUgcmVzaXppbmcgZWRpdG9yXG5cblx0XHRcdHNob3J0Y3V0czogdHJ1ZSwgICAgICAgICAgICAgIC8vIGVuYWJsZSBrZXlib2FyZCBzaG9ydGN1dHNcblxuXHRcdFx0cGxhY2Vob2xkZXI6IGZhbHNlLCAgICAgICAgICAgLy8gZW5hYmxlIHBsYWNlaG9sZGVyIHRleHRcblx0XHRcdHByZXR0aWZ5SHRtbDogdHJ1ZSwgICAgICAgICAgIC8vIGVuYWJsZSBwcmV0dGlmeWluZyBodG1sIHdoaWxlIHRvZ2dsaW5nIGNvZGV2aWV3XG5cblx0XHRcdGljb25QcmVmaXg6ICdmYSBmYS0nLCAgICAgICAgIC8vIHByZWZpeCBmb3IgY3NzIGljb24gY2xhc3Nlc1xuXG5cdFx0XHRjb2RlbWlycm9yOiB7ICAgICAgICAgICAgICAgICAvLyBjb2RlbWlycm9yIG9wdGlvbnNcblx0XHRcdFx0bW9kZTogJ3RleHQvaHRtbCcsXG5cdFx0XHRcdGh0bWxNb2RlOiB0cnVlLFxuXHRcdFx0XHRsaW5lTnVtYmVyczogdHJ1ZVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gbGFuZ3VhZ2Vcblx0XHRcdGxhbmc6ICdlbi1VUycsICAgICAgICAgICAgICAgIC8vIGxhbmd1YWdlICdlbi1VUycsICdrby1LUicsIC4uLlxuXHRcdFx0ZGlyZWN0aW9uOiBudWxsLCAgICAgICAgICAgICAgLy8gdGV4dCBkaXJlY3Rpb24sIGV4KSAncnRsJ1xuXG5cdFx0XHQvLyB0b29sYmFyXG5cdFx0XHR0b29sYmFyOiBbXG5cdFx0XHQgIFsnc3R5bGUnLCBbJ3N0eWxlJ11dLFxuXHRcdFx0ICBbJ2ZvbnQnLCBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdjbGVhciddXSxcblx0XHRcdCAgWydmb250bmFtZScsIFsnZm9udG5hbWUnXV0sXG5cdFx0XHQgIFsnY29sb3InLCBbJ2NvbG9yJ11dLFxuXHRcdFx0ICBbJ3BhcmEnLCBbJ3VsJywgJ29sJywgJ3BhcmFncmFwaCddXSxcblx0XHRcdCAgWydoZWlnaHQnLCBbJ2hlaWdodCddXSxcblx0XHRcdCAgWyd0YWJsZScsIFsndGFibGUnXV0sXG5cdFx0XHQgIFsnaW5zZXJ0JywgWydsaW5rJywgJ3BpY3R1cmUnLCAnaHInXV0sXG5cdFx0XHQgIFsndmlldycsIFsnZnVsbHNjcmVlbicsICdjb2RldmlldyddXSxcblx0XHRcdCAgWydoZWxwJywgWydoZWxwJ11dXG5cdFx0XHRdLFxuXG5cdFx0XHQvLyBhaXIgbW9kZTogaW5saW5lIGVkaXRvclxuXHRcdFx0YWlyTW9kZTogZmFsc2UsXG5cdFx0XHQvLyBhaXJQb3BvdmVyOiBbXG5cdFx0XHQvLyAgIFsnc3R5bGUnLCBbJ3N0eWxlJ11dLFxuXHRcdFx0Ly8gICBbJ2ZvbnQnLCBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdjbGVhciddXSxcblx0XHRcdC8vICAgWydmb250bmFtZScsIFsnZm9udG5hbWUnXV0sXG5cdFx0XHQvLyAgIFsnY29sb3InLCBbJ2NvbG9yJ11dLFxuXHRcdFx0Ly8gICBbJ3BhcmEnLCBbJ3VsJywgJ29sJywgJ3BhcmFncmFwaCddXSxcblx0XHRcdC8vICAgWydoZWlnaHQnLCBbJ2hlaWdodCddXSxcblx0XHRcdC8vICAgWyd0YWJsZScsIFsndGFibGUnXV0sXG5cdFx0XHQvLyAgIFsnaW5zZXJ0JywgWydsaW5rJywgJ3BpY3R1cmUnXV0sXG5cdFx0XHQvLyAgIFsnaGVscCcsIFsnaGVscCddXVxuXHRcdFx0Ly8gXSxcblx0XHRcdGFpclBvcG92ZXI6IFtcblx0XHRcdCAgWydjb2xvcicsIFsnY29sb3InXV0sXG5cdFx0XHQgIFsnZm9udCcsIFsnYm9sZCcsICd1bmRlcmxpbmUnLCAnY2xlYXInXV0sXG5cdFx0XHQgIFsncGFyYScsIFsndWwnLCAncGFyYWdyYXBoJ11dLFxuXHRcdFx0ICBbJ3RhYmxlJywgWyd0YWJsZSddXSxcblx0XHRcdCAgWydpbnNlcnQnLCBbJ2xpbmsnLCAncGljdHVyZSddXVxuXHRcdFx0XSxcblxuXHRcdFx0Ly8gc3R5bGUgdGFnXG5cdFx0XHRzdHlsZVRhZ3M6IFsncCcsICdibG9ja3F1b3RlJywgJ3ByZScsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNiddLFxuXG5cdFx0XHQvLyBkZWZhdWx0IGZvbnROYW1lXG5cdFx0XHRkZWZhdWx0Rm9udE5hbWU6ICdIZWx2ZXRpY2EgTmV1ZScsXG5cblx0XHRcdC8vIGZvbnROYW1lXG5cdFx0XHRmb250TmFtZXM6IFtcblx0XHRcdCAgJ0FyaWFsJywgJ0FyaWFsIEJsYWNrJywgJ0NvbWljIFNhbnMgTVMnLCAnQ291cmllciBOZXcnLFxuXHRcdFx0ICAnSGVsdmV0aWNhIE5ldWUnLCAnSGVsdmV0aWNhJywgJ0ltcGFjdCcsICdMdWNpZGEgR3JhbmRlJyxcblx0XHRcdCAgJ1RhaG9tYScsICdUaW1lcyBOZXcgUm9tYW4nLCAnVmVyZGFuYSdcblx0XHRcdF0sXG5cdFx0XHRmb250TmFtZXNJZ25vcmVDaGVjazogW10sXG5cblx0XHRcdC8vIHBhbGxldGUgY29sb3JzKG4geCBuKVxuXHRcdFx0Y29sb3JzOiBbXG5cdFx0XHQgIFsnIzAwMDAwMCcsICcjNDI0MjQyJywgJyM2MzYzNjMnLCAnIzlDOUM5NCcsICcjQ0VDNkNFJywgJyNFRkVGRUYnLCAnI0Y3RjdGNycsICcjRkZGRkZGJ10sXG5cdFx0XHQgIFsnI0ZGMDAwMCcsICcjRkY5QzAwJywgJyNGRkZGMDAnLCAnIzAwRkYwMCcsICcjMDBGRkZGJywgJyMwMDAwRkYnLCAnIzlDMDBGRicsICcjRkYwMEZGJ10sXG5cdFx0XHQgIFsnI0Y3QzZDRScsICcjRkZFN0NFJywgJyNGRkVGQzYnLCAnI0Q2RUZENicsICcjQ0VERUU3JywgJyNDRUU3RjcnLCAnI0Q2RDZFNycsICcjRTdENkRFJ10sXG5cdFx0XHQgIFsnI0U3OUM5QycsICcjRkZDNjlDJywgJyNGRkU3OUMnLCAnI0I1RDZBNScsICcjQTVDNkNFJywgJyM5Q0M2RUYnLCAnI0I1QTVENicsICcjRDZBNUJEJ10sXG5cdFx0XHQgIFsnI0U3NjM2MycsICcjRjdBRDZCJywgJyNGRkQ2NjMnLCAnIzk0QkQ3QicsICcjNzNBNUFEJywgJyM2QkFEREUnLCAnIzhDN0JDNicsICcjQzY3QkE1J10sXG5cdFx0XHQgIFsnI0NFMDAwMCcsICcjRTc5NDM5JywgJyNFRkM2MzEnLCAnIzZCQTU0QScsICcjNEE3QjhDJywgJyMzOTg0QzYnLCAnIzYzNEFBNScsICcjQTU0QTdCJ10sXG5cdFx0XHQgIFsnIzlDMDAwMCcsICcjQjU2MzA4JywgJyNCRDk0MDAnLCAnIzM5N0IyMScsICcjMTA0QTVBJywgJyMwODUyOTQnLCAnIzMxMTg3MycsICcjNzMxODQyJ10sXG5cdFx0XHQgIFsnIzYzMDAwMCcsICcjN0IzOTAwJywgJyM4NDYzMDAnLCAnIzI5NTIxOCcsICcjMDgzMTM5JywgJyMwMDMxNjMnLCAnIzIxMTA0QScsICcjNEExMDMxJ11cblx0XHRcdF0sXG5cblx0XHRcdC8vIGxpbmVIZWlnaHRcblx0XHRcdGxpbmVIZWlnaHRzOiBbJzEuMCcsICcxLjInLCAnMS40JywgJzEuNScsICcxLjYnLCAnMS44JywgJzIuMCcsICczLjAnXSxcblxuXHRcdFx0Ly8gaW5zZXJ0VGFibGUgbWF4IHNpemVcblx0XHRcdGluc2VydFRhYmxlTWF4U2l6ZToge1xuXHRcdFx0XHRjb2w6IDEwLFxuXHRcdFx0XHRyb3c6IDEwXG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBpbWFnZVxuXHRcdFx0bWF4aW11bUltYWdlRmlsZVNpemU6IG51bGwsIC8vIHNpemUgaW4gYnl0ZXMsIG51bGwgPSBubyBsaW1pdFxuXG5cdFx0XHQvLyBjYWxsYmFja3Ncblx0XHRcdG9uaW5pdDogbnVsbCwgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZVxuXHRcdFx0b25mb2N1czogbnVsbCwgICAgICAgICAgICAvLyBlZGl0YWJsZSBoYXMgZm9jdXNcblx0XHRcdG9uYmx1cjogbnVsbCwgICAgICAgICAgICAgLy8gZWRpdGFibGUgb3V0IG9mIGZvY3VzXG5cdFx0XHRvbmVudGVyOiBudWxsLCAgICAgICAgICAgIC8vIGVudGVyIGtleSBwcmVzc2VkXG5cdFx0XHRvbmtleXVwOiBudWxsLCAgICAgICAgICAgIC8vIGtleXVwXG5cdFx0XHRvbmtleWRvd246IG51bGwsICAgICAgICAgIC8vIGtleWRvd25cblx0XHRcdG9uSW1hZ2VVcGxvYWQ6IG51bGwsICAgICAgLy8gaW1hZ2VVcGxvYWRcblx0XHRcdG9uSW1hZ2VVcGxvYWRFcnJvcjogbnVsbCwgLy8gaW1hZ2VVcGxvYWRFcnJvclxuXHRcdFx0b25NZWRpYURlbGV0ZTogbnVsbCwgICAgICAvLyBtZWRpYSBkZWxldGVcblx0XHRcdG9uVG9vbGJhckNsaWNrOiBudWxsLFxuXHRcdFx0b25zdWJtaXQ6IG51bGwsXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogbWFuaXB1bGF0ZSBsaW5rIGFkZHJlc3Mgd2hlbiB1c2VyIGNyZWF0ZSBsaW5rXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc0xpbmtVcmxcblx0XHRcdCAqIEByZXR1cm4ge1N0cmluZ31cblx0XHRcdCAqL1xuXHRcdFx0b25DcmVhdGVMaW5rOiBmdW5jdGlvbiAoc0xpbmtVcmwpIHtcblx0XHRcdFx0aWYgKHNMaW5rVXJsLmluZGV4T2YoJ0AnKSAhPT0gLTEgJiYgc0xpbmtVcmwuaW5kZXhPZignOicpID09PSAtMSkge1xuXHRcdFx0XHRcdHNMaW5rVXJsID0gJ21haWx0bzonICsgc0xpbmtVcmw7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0xpbmtVcmwuaW5kZXhPZignOi8vJykgPT09IC0xKSB7XG5cdFx0XHRcdFx0c0xpbmtVcmwgPSAnaHR0cDovLycgKyBzTGlua1VybDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBzTGlua1VybDtcblx0XHRcdH0sXG5cblx0XHRcdGtleU1hcDoge1xuXHRcdFx0XHRwYzoge1xuXHRcdFx0XHRcdCdFTlRFUic6ICdpbnNlcnRQYXJhZ3JhcGgnLFxuXHRcdFx0XHRcdCdDVFJMK1onOiAndW5kbycsXG5cdFx0XHRcdFx0J0NUUkwrWSc6ICdyZWRvJyxcblx0XHRcdFx0XHQnVEFCJzogJ3RhYicsXG5cdFx0XHRcdFx0J1NISUZUK1RBQic6ICd1bnRhYicsXG5cdFx0XHRcdFx0J0NUUkwrQic6ICdib2xkJyxcblx0XHRcdFx0XHQnQ1RSTCtJJzogJ2l0YWxpYycsXG5cdFx0XHRcdFx0J0NUUkwrVSc6ICd1bmRlcmxpbmUnLFxuXHRcdFx0XHRcdCdDVFJMK1NISUZUK1MnOiAnc3RyaWtldGhyb3VnaCcsXG5cdFx0XHRcdFx0J0NUUkwrQkFDS1NMQVNIJzogJ3JlbW92ZUZvcm1hdCcsXG5cdFx0XHRcdFx0J0NUUkwrU0hJRlQrTCc6ICdqdXN0aWZ5TGVmdCcsXG5cdFx0XHRcdFx0J0NUUkwrU0hJRlQrRSc6ICdqdXN0aWZ5Q2VudGVyJyxcblx0XHRcdFx0XHQnQ1RSTCtTSElGVCtSJzogJ2p1c3RpZnlSaWdodCcsXG5cdFx0XHRcdFx0J0NUUkwrU0hJRlQrSic6ICdqdXN0aWZ5RnVsbCcsXG5cdFx0XHRcdFx0J0NUUkwrU0hJRlQrTlVNNyc6ICdpbnNlcnRVbm9yZGVyZWRMaXN0Jyxcblx0XHRcdFx0XHQnQ1RSTCtTSElGVCtOVU04JzogJ2luc2VydE9yZGVyZWRMaXN0Jyxcblx0XHRcdFx0XHQnQ1RSTCtMRUZUQlJBQ0tFVCc6ICdvdXRkZW50Jyxcblx0XHRcdFx0XHQnQ1RSTCtSSUdIVEJSQUNLRVQnOiAnaW5kZW50Jyxcblx0XHRcdFx0XHQnQ1RSTCtOVU0wJzogJ2Zvcm1hdFBhcmEnLFxuXHRcdFx0XHRcdCdDVFJMK05VTTEnOiAnZm9ybWF0SDEnLFxuXHRcdFx0XHRcdCdDVFJMK05VTTInOiAnZm9ybWF0SDInLFxuXHRcdFx0XHRcdCdDVFJMK05VTTMnOiAnZm9ybWF0SDMnLFxuXHRcdFx0XHRcdCdDVFJMK05VTTQnOiAnZm9ybWF0SDQnLFxuXHRcdFx0XHRcdCdDVFJMK05VTTUnOiAnZm9ybWF0SDUnLFxuXHRcdFx0XHRcdCdDVFJMK05VTTYnOiAnZm9ybWF0SDYnLFxuXHRcdFx0XHRcdCdDVFJMK0VOVEVSJzogJ2luc2VydEhvcml6b250YWxSdWxlJyxcblx0XHRcdFx0XHQnQ1RSTCtLJzogJ3Nob3dMaW5rRGlhbG9nJ1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdG1hYzoge1xuXHRcdFx0XHRcdCdFTlRFUic6ICdpbnNlcnRQYXJhZ3JhcGgnLFxuXHRcdFx0XHRcdCdDTUQrWic6ICd1bmRvJyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK1onOiAncmVkbycsXG5cdFx0XHRcdFx0J1RBQic6ICd0YWInLFxuXHRcdFx0XHRcdCdTSElGVCtUQUInOiAndW50YWInLFxuXHRcdFx0XHRcdCdDTUQrQic6ICdib2xkJyxcblx0XHRcdFx0XHQnQ01EK0knOiAnaXRhbGljJyxcblx0XHRcdFx0XHQnQ01EK1UnOiAndW5kZXJsaW5lJyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK1MnOiAnc3RyaWtldGhyb3VnaCcsXG5cdFx0XHRcdFx0J0NNRCtCQUNLU0xBU0gnOiAncmVtb3ZlRm9ybWF0Jyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK0wnOiAnanVzdGlmeUxlZnQnLFxuXHRcdFx0XHRcdCdDTUQrU0hJRlQrRSc6ICdqdXN0aWZ5Q2VudGVyJyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK1InOiAnanVzdGlmeVJpZ2h0Jyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK0onOiAnanVzdGlmeUZ1bGwnLFxuXHRcdFx0XHRcdCdDTUQrU0hJRlQrTlVNNyc6ICdpbnNlcnRVbm9yZGVyZWRMaXN0Jyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK05VTTgnOiAnaW5zZXJ0T3JkZXJlZExpc3QnLFxuXHRcdFx0XHRcdCdDTUQrTEVGVEJSQUNLRVQnOiAnb3V0ZGVudCcsXG5cdFx0XHRcdFx0J0NNRCtSSUdIVEJSQUNLRVQnOiAnaW5kZW50Jyxcblx0XHRcdFx0XHQnQ01EK05VTTAnOiAnZm9ybWF0UGFyYScsXG5cdFx0XHRcdFx0J0NNRCtOVU0xJzogJ2Zvcm1hdEgxJyxcblx0XHRcdFx0XHQnQ01EK05VTTInOiAnZm9ybWF0SDInLFxuXHRcdFx0XHRcdCdDTUQrTlVNMyc6ICdmb3JtYXRIMycsXG5cdFx0XHRcdFx0J0NNRCtOVU00JzogJ2Zvcm1hdEg0Jyxcblx0XHRcdFx0XHQnQ01EK05VTTUnOiAnZm9ybWF0SDUnLFxuXHRcdFx0XHRcdCdDTUQrTlVNNic6ICdmb3JtYXRINicsXG5cdFx0XHRcdFx0J0NNRCtFTlRFUic6ICdpbnNlcnRIb3Jpem9udGFsUnVsZScsXG5cdFx0XHRcdFx0J0NNRCtLJzogJ3Nob3dMaW5rRGlhbG9nJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIGRlZmF1bHQgbGFuZ3VhZ2U6IGVuLVVTXG5cdFx0bGFuZzoge1xuXHRcdFx0J2VuLVVTJzoge1xuXHRcdFx0XHRmb250OiB7XG5cdFx0XHRcdFx0Ym9sZDogJ0JvbGQnLFxuXHRcdFx0XHRcdGl0YWxpYzogJ0l0YWxpYycsXG5cdFx0XHRcdFx0dW5kZXJsaW5lOiAnVW5kZXJsaW5lJyxcblx0XHRcdFx0XHRjbGVhcjogJ1JlbW92ZSBGb250IFN0eWxlJyxcblx0XHRcdFx0XHRoZWlnaHQ6ICdMaW5lIEhlaWdodCcsXG5cdFx0XHRcdFx0bmFtZTogJ0ZvbnQgRmFtaWx5J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRpbWFnZToge1xuXHRcdFx0XHRcdGltYWdlOiAnUGljdHVyZScsXG5cdFx0XHRcdFx0aW5zZXJ0OiAnSW5zZXJ0IEltYWdlJyxcblx0XHRcdFx0XHRyZXNpemVGdWxsOiAnUmVzaXplIEZ1bGwnLFxuXHRcdFx0XHRcdHJlc2l6ZUhhbGY6ICdSZXNpemUgSGFsZicsXG5cdFx0XHRcdFx0cmVzaXplUXVhcnRlcjogJ1Jlc2l6ZSBRdWFydGVyJyxcblx0XHRcdFx0XHRmbG9hdExlZnQ6ICdGbG9hdCBMZWZ0Jyxcblx0XHRcdFx0XHRmbG9hdFJpZ2h0OiAnRmxvYXQgUmlnaHQnLFxuXHRcdFx0XHRcdGZsb2F0Tm9uZTogJ0Zsb2F0IE5vbmUnLFxuXHRcdFx0XHRcdHNoYXBlUm91bmRlZDogJ1NoYXBlOiBSb3VuZGVkJyxcblx0XHRcdFx0XHRzaGFwZUNpcmNsZTogJ1NoYXBlOiBDaXJjbGUnLFxuXHRcdFx0XHRcdHNoYXBlVGh1bWJuYWlsOiAnU2hhcGU6IFRodW1ibmFpbCcsXG5cdFx0XHRcdFx0c2hhcGVOb25lOiAnU2hhcGU6IE5vbmUnLFxuXHRcdFx0XHRcdGRyYWdJbWFnZUhlcmU6ICdEcmFnIGltYWdlIG9yIHRleHQgaGVyZScsXG5cdFx0XHRcdFx0ZHJvcEltYWdlOiAnRHJvcCBpbWFnZSBvciBUZXh0Jyxcblx0XHRcdFx0XHRzZWxlY3RGcm9tRmlsZXM6ICdTZWxlY3QgZnJvbSBmaWxlcycsXG5cdFx0XHRcdFx0bWF4aW11bUZpbGVTaXplOiAnTWF4aW11bSBmaWxlIHNpemUnLFxuXHRcdFx0XHRcdG1heGltdW1GaWxlU2l6ZUVycm9yOiAnTWF4aW11bSBmaWxlIHNpemUgZXhjZWVkZWQuJyxcblx0XHRcdFx0XHR1cmw6ICdJbWFnZSBVUkwnLFxuXHRcdFx0XHRcdHJlbW92ZTogJ1JlbW92ZSBJbWFnZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0bGluazoge1xuXHRcdFx0XHRcdGxpbms6ICdMaW5rJyxcblx0XHRcdFx0XHRpbnNlcnQ6ICdJbnNlcnQgTGluaycsXG5cdFx0XHRcdFx0dW5saW5rOiAnVW5saW5rJyxcblx0XHRcdFx0XHRlZGl0OiAnRWRpdCcsXG5cdFx0XHRcdFx0dGV4dFRvRGlzcGxheTogJ1RleHQgdG8gZGlzcGxheScsXG5cdFx0XHRcdFx0dXJsOiAnVG8gd2hhdCBVUkwgc2hvdWxkIHRoaXMgbGluayBnbz8nLFxuXHRcdFx0XHRcdG9wZW5Jbk5ld1dpbmRvdzogJ09wZW4gaW4gbmV3IHdpbmRvdydcblx0XHRcdFx0fSxcblx0XHRcdFx0dGFibGU6IHtcblx0XHRcdFx0XHR0YWJsZTogJ1RhYmxlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRocjoge1xuXHRcdFx0XHRcdGluc2VydDogJ0luc2VydCBIb3Jpem9udGFsIFJ1bGUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN0eWxlOiB7XG5cdFx0XHRcdFx0c3R5bGU6ICdTdHlsZScsXG5cdFx0XHRcdFx0bm9ybWFsOiAnTm9ybWFsJyxcblx0XHRcdFx0XHRibG9ja3F1b3RlOiAnUXVvdGUnLFxuXHRcdFx0XHRcdHByZTogJ0NvZGUnLFxuXHRcdFx0XHRcdGgxOiAnSGVhZGVyIDEnLFxuXHRcdFx0XHRcdGgyOiAnSGVhZGVyIDInLFxuXHRcdFx0XHRcdGgzOiAnSGVhZGVyIDMnLFxuXHRcdFx0XHRcdGg0OiAnSGVhZGVyIDQnLFxuXHRcdFx0XHRcdGg1OiAnSGVhZGVyIDUnLFxuXHRcdFx0XHRcdGg2OiAnSGVhZGVyIDYnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxpc3RzOiB7XG5cdFx0XHRcdFx0dW5vcmRlcmVkOiAnVW5vcmRlcmVkIGxpc3QnLFxuXHRcdFx0XHRcdG9yZGVyZWQ6ICdPcmRlcmVkIGxpc3QnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRoZWxwOiAnSGVscCcsXG5cdFx0XHRcdFx0ZnVsbHNjcmVlbjogJ0Z1bGwgU2NyZWVuJyxcblx0XHRcdFx0XHRjb2RldmlldzogJ0NvZGUgVmlldydcblx0XHRcdFx0fSxcblx0XHRcdFx0cGFyYWdyYXBoOiB7XG5cdFx0XHRcdFx0cGFyYWdyYXBoOiAnUGFyYWdyYXBoJyxcblx0XHRcdFx0XHRvdXRkZW50OiAnT3V0ZGVudCcsXG5cdFx0XHRcdFx0aW5kZW50OiAnSW5kZW50Jyxcblx0XHRcdFx0XHRsZWZ0OiAnQWxpZ24gbGVmdCcsXG5cdFx0XHRcdFx0Y2VudGVyOiAnQWxpZ24gY2VudGVyJyxcblx0XHRcdFx0XHRyaWdodDogJ0FsaWduIHJpZ2h0Jyxcblx0XHRcdFx0XHRqdXN0aWZ5OiAnSnVzdGlmeSBmdWxsJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb2xvcjoge1xuXHRcdFx0XHRcdHJlY2VudDogJ1JlY2VudCBDb2xvcicsXG5cdFx0XHRcdFx0bW9yZTogJ01vcmUgQ29sb3InLFxuXHRcdFx0XHRcdGJhY2tncm91bmQ6ICdCYWNrZ3JvdW5kIENvbG9yJyxcblx0XHRcdFx0XHRmb3JlZ3JvdW5kOiAnRm9yZWdyb3VuZCBDb2xvcicsXG5cdFx0XHRcdFx0dHJhbnNwYXJlbnQ6ICdUcmFuc3BhcmVudCcsXG5cdFx0XHRcdFx0c2V0VHJhbnNwYXJlbnQ6ICdTZXQgdHJhbnNwYXJlbnQnLFxuXHRcdFx0XHRcdHJlc2V0OiAnUmVzZXQnLFxuXHRcdFx0XHRcdHJlc2V0VG9EZWZhdWx0OiAnUmVzZXQgdG8gZGVmYXVsdCdcblx0XHRcdFx0fSxcblx0XHRcdFx0c2hvcnRjdXQ6IHtcblx0XHRcdFx0XHRzaG9ydGN1dHM6ICdLZXlib2FyZCBzaG9ydGN1dHMnLFxuXHRcdFx0XHRcdGNsb3NlOiAnQ2xvc2UnLFxuXHRcdFx0XHRcdHRleHRGb3JtYXR0aW5nOiAnVGV4dCBmb3JtYXR0aW5nJyxcblx0XHRcdFx0XHRhY3Rpb246ICdBY3Rpb24nLFxuXHRcdFx0XHRcdHBhcmFncmFwaEZvcm1hdHRpbmc6ICdQYXJhZ3JhcGggZm9ybWF0dGluZycsXG5cdFx0XHRcdFx0ZG9jdW1lbnRTdHlsZTogJ0RvY3VtZW50IFN0eWxlJyxcblx0XHRcdFx0XHRleHRyYUtleXM6ICdFeHRyYSBrZXlzJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRoaXN0b3J5OiB7XG5cdFx0XHRcdFx0dW5kbzogJ1VuZG8nLFxuXHRcdFx0XHRcdHJlZG86ICdSZWRvJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgY29yZS5hc3luY1xuXHQgKlxuXHQgKiBBc3luYyBmdW5jdGlvbnMgd2hpY2ggcmV0dXJucyBgUHJvbWlzZWBcblx0ICpcblx0ICogQHNpbmdsZXRvblxuXHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIGFzeW5jXG5cdCAqL1xuXHR2YXIgYXN5bmMgPSAoZnVuY3Rpb24gKCkge1xuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVhZEZpbGVBc0RhdGFVUkxcblx0XHQgKlxuXHRcdCAqIHJlYWQgY29udGVudHMgb2YgZmlsZSBhcyByZXByZXNlbnRpbmcgVVJMXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0ZpbGV9IGZpbGVcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZW46IHNEYXRhVXJsXG5cdFx0ICovXG5cdFx0dmFyIHJlYWRGaWxlQXNEYXRhVVJMID0gZnVuY3Rpb24gKGZpbGUpIHtcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKGZ1bmN0aW9uIChkZWZlcnJlZCkge1xuXHRcdFx0XHQkLmV4dGVuZChuZXcgRmlsZVJlYWRlcigpLCB7XG5cdFx0XHRcdFx0b25sb2FkOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0dmFyIHNEYXRhVVJMID0gZS50YXJnZXQucmVzdWx0O1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZShzRGF0YVVSTCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvbmVycm9yOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3QodGhpcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KS5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuXHRcdFx0fSkucHJvbWlzZSgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGNyZWF0ZUltYWdlXG5cdFx0ICpcblx0XHQgKiBjcmVhdGUgYDxpbWFnZT5gIGZyb20gdXJsIHN0cmluZ1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHNVcmxcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWVcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZW46ICRpbWFnZVxuXHRcdCAqL1xuXHRcdHZhciBjcmVhdGVJbWFnZSA9IGZ1bmN0aW9uIChzVXJsLCBmaWxlbmFtZSkge1xuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoZnVuY3Rpb24gKGRlZmVycmVkKSB7XG5cdFx0XHRcdHZhciAkaW1nID0gJCgnPGltZz4nKTtcblxuXHRcdFx0XHQkaW1nLm9uZSgnbG9hZCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQkaW1nLm9mZignZXJyb3IgYWJvcnQnKTtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKCRpbWcpO1xuXHRcdFx0XHR9KS5vbmUoJ2Vycm9yIGFib3J0JywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCRpbWcub2ZmKCdsb2FkJykuZGV0YWNoKCk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0KCRpbWcpO1xuXHRcdFx0XHR9KS5jc3Moe1xuXHRcdFx0XHRcdGRpc3BsYXk6ICdub25lJ1xuXHRcdFx0XHR9KS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5hdHRyKHtcblx0XHRcdFx0XHQnc3JjJzogc1VybCxcblx0XHRcdFx0XHQnZGF0YS1maWxlbmFtZSc6IGZpbGVuYW1lXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSkucHJvbWlzZSgpO1xuXHRcdH07XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVhZEZpbGVBc0RhdGFVUkw6IHJlYWRGaWxlQXNEYXRhVVJMLFxuXHRcdFx0Y3JlYXRlSW1hZ2U6IGNyZWF0ZUltYWdlXG5cdFx0fTtcblx0fSkoKTtcblxuXHQvKipcblx0ICogQGNsYXNzIGNvcmUua2V5XG5cdCAqXG5cdCAqIE9iamVjdCBmb3Iga2V5Y29kZXMuXG5cdCAqXG5cdCAqIEBzaW5nbGV0b25cblx0ICogQGFsdGVybmF0ZUNsYXNzTmFtZSBrZXlcblx0ICovXG5cdHZhciBrZXkgPSB7XG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpc0VkaXRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBrZXlDb2RlXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHRpc0VkaXQ6IGZ1bmN0aW9uIChrZXlDb2RlKSB7XG5cdFx0XHRyZXR1cm4gbGlzdC5jb250YWlucyhbOCwgOSwgMTMsIDMyXSwga2V5Q29kZSk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBAcHJvcGVydHkge09iamVjdH0gbmFtZUZyb21Db2RlXG5cdFx0ICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWVGcm9tQ29kZS44IFwiQkFDS1NQQUNFXCJcblx0XHQgKi9cblx0XHRuYW1lRnJvbUNvZGU6IHtcblx0XHRcdCc4JzogJ0JBQ0tTUEFDRScsXG5cdFx0XHQnOSc6ICdUQUInLFxuXHRcdFx0JzEzJzogJ0VOVEVSJyxcblx0XHRcdCczMic6ICdTUEFDRScsXG5cblx0XHRcdC8vIE51bWJlcjogMC05XG5cdFx0XHQnNDgnOiAnTlVNMCcsXG5cdFx0XHQnNDknOiAnTlVNMScsXG5cdFx0XHQnNTAnOiAnTlVNMicsXG5cdFx0XHQnNTEnOiAnTlVNMycsXG5cdFx0XHQnNTInOiAnTlVNNCcsXG5cdFx0XHQnNTMnOiAnTlVNNScsXG5cdFx0XHQnNTQnOiAnTlVNNicsXG5cdFx0XHQnNTUnOiAnTlVNNycsXG5cdFx0XHQnNTYnOiAnTlVNOCcsXG5cblx0XHRcdC8vIEFscGhhYmV0OiBhLXpcblx0XHRcdCc2Nic6ICdCJyxcblx0XHRcdCc2OSc6ICdFJyxcblx0XHRcdCc3Myc6ICdJJyxcblx0XHRcdCc3NCc6ICdKJyxcblx0XHRcdCc3NSc6ICdLJyxcblx0XHRcdCc3Nic6ICdMJyxcblx0XHRcdCc4Mic6ICdSJyxcblx0XHRcdCc4Myc6ICdTJyxcblx0XHRcdCc4NSc6ICdVJyxcblx0XHRcdCc4OSc6ICdZJyxcblx0XHRcdCc5MCc6ICdaJyxcblxuXHRcdFx0JzE5MSc6ICdTTEFTSCcsXG5cdFx0XHQnMjE5JzogJ0xFRlRCUkFDS0VUJyxcblx0XHRcdCcyMjAnOiAnQkFDS1NMQVNIJyxcblx0XHRcdCcyMjEnOiAnUklHSFRCUkFDS0VUJ1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIGVkaXRpbmcuSGlzdG9yeVxuXHQgKlxuXHQgKiBFZGl0b3IgSGlzdG9yeVxuXHQgKlxuXHQgKi9cblx0dmFyIEhpc3RvcnkgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0dmFyIHN0YWNrID0gW10sIHN0YWNrT2Zmc2V0ID0gLTE7XG5cdFx0dmFyIGVkaXRhYmxlID0gJGVkaXRhYmxlWzBdO1xuXG5cdFx0dmFyIG1ha2VTbmFwc2hvdCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKTtcblx0XHRcdHZhciBlbXB0eUJvb2ttYXJrID0geyBzOiB7IHBhdGg6IFtdLCBvZmZzZXQ6IDAgfSwgZTogeyBwYXRoOiBbXSwgb2Zmc2V0OiAwIH0gfTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Y29udGVudHM6ICRlZGl0YWJsZS5odG1sKCksXG5cdFx0XHRcdGJvb2ttYXJrOiAocm5nID8gcm5nLmJvb2ttYXJrKGVkaXRhYmxlKSA6IGVtcHR5Qm9va21hcmspXG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHR2YXIgYXBwbHlTbmFwc2hvdCA9IGZ1bmN0aW9uIChzbmFwc2hvdCkge1xuXHRcdFx0aWYgKHNuYXBzaG90LmNvbnRlbnRzICE9PSBudWxsKSB7XG5cdFx0XHRcdCRlZGl0YWJsZS5odG1sKHNuYXBzaG90LmNvbnRlbnRzKTtcblx0XHRcdH1cblx0XHRcdGlmIChzbmFwc2hvdC5ib29rbWFyayAhPT0gbnVsbCkge1xuXHRcdFx0XHRyYW5nZS5jcmVhdGVGcm9tQm9va21hcmsoZWRpdGFibGUsIHNuYXBzaG90LmJvb2ttYXJrKS5zZWxlY3QoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogdW5kb1xuXHRcdCAqL1xuXHRcdHRoaXMudW5kbyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmICgwIDwgc3RhY2tPZmZzZXQpIHtcblx0XHRcdFx0c3RhY2tPZmZzZXQtLTtcblx0XHRcdFx0YXBwbHlTbmFwc2hvdChzdGFja1tzdGFja09mZnNldF0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZWRvXG5cdFx0ICovXG5cdFx0dGhpcy5yZWRvID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHN0YWNrLmxlbmd0aCAtIDEgPiBzdGFja09mZnNldCkge1xuXHRcdFx0XHRzdGFja09mZnNldCsrO1xuXHRcdFx0XHRhcHBseVNuYXBzaG90KHN0YWNrW3N0YWNrT2Zmc2V0XSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJlY29yZGVkIHVuZG9cblx0XHQgKi9cblx0XHR0aGlzLnJlY29yZFVuZG8gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRzdGFja09mZnNldCsrO1xuXG5cdFx0XHQvLyBXYXNoIG91dCBzdGFjayBhZnRlciBzdGFja09mZnNldFxuXHRcdFx0aWYgKHN0YWNrLmxlbmd0aCA+IHN0YWNrT2Zmc2V0KSB7XG5cdFx0XHRcdHN0YWNrID0gc3RhY2suc2xpY2UoMCwgc3RhY2tPZmZzZXQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDcmVhdGUgbmV3IHNuYXBzaG90IGFuZCBwdXNoIGl0IHRvIHRoZSBlbmRcblx0XHRcdHN0YWNrLnB1c2gobWFrZVNuYXBzaG90KCkpO1xuXHRcdH07XG5cblx0XHQvLyBDcmVhdGUgZmlyc3QgdW5kbyBzdGFja1xuXHRcdHRoaXMucmVjb3JkVW5kbygpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgZWRpdGluZy5TdHlsZVxuXHQgKlxuXHQgKiBTdHlsZVxuXHQgKlxuXHQgKi9cblx0dmFyIFN0eWxlID0gZnVuY3Rpb24gKCkge1xuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgalF1ZXJ5Q1NTXG5cdFx0ICpcblx0XHQgKiBwYXNzaW5nIGFuIGFycmF5IG9mIHN0eWxlIHByb3BlcnRpZXMgdG8gLmNzcygpXG5cdFx0ICogd2lsbCByZXN1bHQgaW4gYW4gb2JqZWN0IG9mIHByb3BlcnR5LXZhbHVlIHBhaXJzLlxuXHRcdCAqIChjb21wYWJpbGl0eSB3aXRoIHZlcnNpb24gPCAxLjkpXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSAge2pRdWVyeX0gJG9ialxuXHRcdCAqIEBwYXJhbSAge0FycmF5fSBwcm9wZXJ0eU5hbWVzIC0gQW4gYXJyYXkgb2Ygb25lIG9yIG1vcmUgQ1NTIHByb3BlcnRpZXMuXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHZhciBqUXVlcnlDU1MgPSBmdW5jdGlvbiAoJG9iaiwgcHJvcGVydHlOYW1lcykge1xuXHRcdFx0aWYgKGFnZW50LmpxdWVyeVZlcnNpb24gPCAxLjkpIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IHt9O1xuXHRcdFx0XHQkLmVhY2gocHJvcGVydHlOYW1lcywgZnVuY3Rpb24gKGlkeCwgcHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0cmVzdWx0W3Byb3BlcnR5TmFtZV0gPSAkb2JqLmNzcyhwcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHRcdHJldHVybiAkb2JqLmNzcy5jYWxsKCRvYmosIHByb3BlcnR5TmFtZXMpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBwYXJhZ3JhcGggbGV2ZWwgc3R5bGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7V3JhcHBlZFJhbmdlfSBybmdcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc3R5bGVJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy5zdHlsZVBhcmEgPSBmdW5jdGlvbiAocm5nLCBzdHlsZUluZm8pIHtcblx0XHRcdCQuZWFjaChybmcubm9kZXMoZG9tLmlzUGFyYSwge1xuXHRcdFx0XHRpbmNsdWRlQW5jZXN0b3I6IHRydWVcblx0XHRcdH0pLCBmdW5jdGlvbiAoaWR4LCBwYXJhKSB7XG5cdFx0XHRcdCQocGFyYSkuY3NzKHN0eWxlSW5mbyk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaW5zZXJ0IGFuZCByZXR1cm5zIHN0eWxlTm9kZXMgb24gcmFuZ2UuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1dyYXBwZWRSYW5nZX0gcm5nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgZm9yIHN0eWxlTm9kZXNcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubm9kZU5hbWVdIC0gZGVmYXVsdDogYFNQQU5gXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5leHBhbmRDbG9zZXN0U2libGluZ10gLSBkZWZhdWx0OiBgZmFsc2VgXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5vbmx5UGFydGlhbENvbnRhaW5zXSAtIGRlZmF1bHQ6IGBmYWxzZWBcblx0XHQgKiBAcmV0dXJuIHtOb2RlW119XG5cdFx0ICovXG5cdFx0dGhpcy5zdHlsZU5vZGVzID0gZnVuY3Rpb24gKHJuZywgb3B0aW9ucykge1xuXHRcdFx0cm5nID0gcm5nLnNwbGl0VGV4dCgpO1xuXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBvcHRpb25zICYmIG9wdGlvbnMubm9kZU5hbWUgfHwgJ1NQQU4nO1xuXHRcdFx0dmFyIGV4cGFuZENsb3Nlc3RTaWJsaW5nID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmV4cGFuZENsb3Nlc3RTaWJsaW5nKTtcblx0XHRcdHZhciBvbmx5UGFydGlhbENvbnRhaW5zID0gISEob3B0aW9ucyAmJiBvcHRpb25zLm9ubHlQYXJ0aWFsQ29udGFpbnMpO1xuXG5cdFx0XHRpZiAocm5nLmlzQ29sbGFwc2VkKCkpIHtcblx0XHRcdFx0cmV0dXJuIHJuZy5pbnNlcnROb2RlKGRvbS5jcmVhdGUobm9kZU5hbWUpKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHByZWQgPSBkb20ubWFrZVByZWRCeU5vZGVOYW1lKG5vZGVOYW1lKTtcblx0XHRcdHZhciBub2RlcyA9ICQubWFwKHJuZy5ub2Rlcyhkb20uaXNUZXh0LCB7XG5cdFx0XHRcdGZ1bGx5Q29udGFpbnM6IHRydWVcblx0XHRcdH0pLCBmdW5jdGlvbiAodGV4dCkge1xuXHRcdFx0XHRyZXR1cm4gZG9tLnNpbmdsZUNoaWxkQW5jZXN0b3IodGV4dCwgcHJlZCkgfHwgZG9tLndyYXAodGV4dCwgbm9kZU5hbWUpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChleHBhbmRDbG9zZXN0U2libGluZykge1xuXHRcdFx0XHRpZiAob25seVBhcnRpYWxDb250YWlucykge1xuXHRcdFx0XHRcdHZhciBub2Rlc0luUmFuZ2UgPSBybmcubm9kZXMoKTtcblx0XHRcdFx0XHQvLyBjb21wb3NlIHdpdGggcGFydGlhbCBjb250YWlucyBwcmVkaWNhdGlvblxuXHRcdFx0XHRcdHByZWQgPSBmdW5jLmFuZChwcmVkLCBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGxpc3QuY29udGFpbnMobm9kZXNJblJhbmdlLCBub2RlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAkLm1hcChub2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdFx0XHR2YXIgc2libGluZ3MgPSBkb20ud2l0aENsb3Nlc3RTaWJsaW5ncyhub2RlLCBwcmVkKTtcblx0XHRcdFx0XHR2YXIgaGVhZCA9IGxpc3QuaGVhZChzaWJsaW5ncyk7XG5cdFx0XHRcdFx0dmFyIHRhaWxzID0gbGlzdC50YWlsKHNpYmxpbmdzKTtcblx0XHRcdFx0XHQkLmVhY2godGFpbHMsIGZ1bmN0aW9uIChpZHgsIGVsZW0pIHtcblx0XHRcdFx0XHRcdGRvbS5hcHBlbmRDaGlsZE5vZGVzKGhlYWQsIGVsZW0uY2hpbGROb2Rlcyk7XG5cdFx0XHRcdFx0XHRkb20ucmVtb3ZlKGVsZW0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBsaXN0LmhlYWQoc2libGluZ3MpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBub2Rlcztcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZ2V0IGN1cnJlbnQgc3R5bGUgb24gY3Vyc29yXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1dyYXBwZWRSYW5nZX0gcm5nXG5cdFx0ICogQHBhcmFtIHtOb2RlfSB0YXJnZXQgLSB0YXJnZXQgZWxlbWVudCBvbiBldmVudFxuXHRcdCAqIEByZXR1cm4ge09iamVjdH0gLSBvYmplY3QgY29udGFpbnMgc3R5bGUgcHJvcGVydGllcy5cblx0XHQgKi9cblx0XHR0aGlzLmN1cnJlbnQgPSBmdW5jdGlvbiAocm5nLCB0YXJnZXQpIHtcblx0XHRcdHZhciAkY29udCA9ICQoZG9tLmlzVGV4dChybmcuc2MpID8gcm5nLnNjLnBhcmVudE5vZGUgOiBybmcuc2MpO1xuXHRcdFx0dmFyIHByb3BlcnRpZXMgPSBbJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICd0ZXh0LWFsaWduJywgJ2xpc3Qtc3R5bGUtdHlwZScsICdsaW5lLWhlaWdodCddO1xuXHRcdFx0dmFyIHN0eWxlSW5mbyA9IGpRdWVyeUNTUygkY29udCwgcHJvcGVydGllcykgfHwge307XG5cblx0XHRcdHN0eWxlSW5mb1snZm9udC1zaXplJ10gPSBwYXJzZUludChzdHlsZUluZm9bJ2ZvbnQtc2l6ZSddLCAxMCk7XG5cblx0XHRcdC8vIGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlIGZvciB0b2dnbGUgc3RhdGVcblx0XHRcdHN0eWxlSW5mb1snZm9udC1ib2xkJ10gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnYm9sZCcpID8gJ2JvbGQnIDogJ25vcm1hbCc7XG5cdFx0XHRzdHlsZUluZm9bJ2ZvbnQtaXRhbGljJ10gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnaXRhbGljJykgPyAnaXRhbGljJyA6ICdub3JtYWwnO1xuXHRcdFx0c3R5bGVJbmZvWydmb250LXVuZGVybGluZSddID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3VuZGVybGluZScpID8gJ3VuZGVybGluZScgOiAnbm9ybWFsJztcblx0XHRcdHN0eWxlSW5mb1snZm9udC1zdHJpa2V0aHJvdWdoJ10gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnc3RyaWtlVGhyb3VnaCcpID8gJ3N0cmlrZXRocm91Z2gnIDogJ25vcm1hbCc7XG5cdFx0XHRzdHlsZUluZm9bJ2ZvbnQtc3VwZXJzY3JpcHQnXSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCdzdXBlcnNjcmlwdCcpID8gJ3N1cGVyc2NyaXB0JyA6ICdub3JtYWwnO1xuXHRcdFx0c3R5bGVJbmZvWydmb250LXN1YnNjcmlwdCddID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3N1YnNjcmlwdCcpID8gJ3N1YnNjcmlwdCcgOiAnbm9ybWFsJztcblxuXHRcdFx0Ly8gbGlzdC1zdHlsZS10eXBlIHRvIGxpc3Qtc3R5bGUodW5vcmRlcmVkLCBvcmRlcmVkKVxuXHRcdFx0aWYgKCFybmcuaXNPbkxpc3QoKSkge1xuXHRcdFx0XHRzdHlsZUluZm9bJ2xpc3Qtc3R5bGUnXSA9ICdub25lJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBhT3JkZXJlZFR5cGUgPSBbJ2NpcmNsZScsICdkaXNjJywgJ2Rpc2MtbGVhZGluZy16ZXJvJywgJ3NxdWFyZSddO1xuXHRcdFx0XHR2YXIgaXNVbm9yZGVyZWQgPSAkLmluQXJyYXkoc3R5bGVJbmZvWydsaXN0LXN0eWxlLXR5cGUnXSwgYU9yZGVyZWRUeXBlKSA+IC0xO1xuXHRcdFx0XHRzdHlsZUluZm9bJ2xpc3Qtc3R5bGUnXSA9IGlzVW5vcmRlcmVkID8gJ3Vub3JkZXJlZCcgOiAnb3JkZXJlZCc7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBwYXJhID0gZG9tLmFuY2VzdG9yKHJuZy5zYywgZG9tLmlzUGFyYSk7XG5cdFx0XHRpZiAocGFyYSAmJiBwYXJhLnN0eWxlWydsaW5lLWhlaWdodCddKSB7XG5cdFx0XHRcdHN0eWxlSW5mb1snbGluZS1oZWlnaHQnXSA9IHBhcmEuc3R5bGUubGluZUhlaWdodDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBsaW5lSGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGVJbmZvWydsaW5lLWhlaWdodCddLCAxMCkgLyBwYXJzZUludChzdHlsZUluZm9bJ2ZvbnQtc2l6ZSddLCAxMCk7XG5cdFx0XHRcdHN0eWxlSW5mb1snbGluZS1oZWlnaHQnXSA9IGxpbmVIZWlnaHQudG9GaXhlZCgxKTtcblx0XHRcdH1cblxuXHRcdFx0c3R5bGVJbmZvLmltYWdlID0gZG9tLmlzSW1nKHRhcmdldCkgJiYgdGFyZ2V0O1xuXHRcdFx0c3R5bGVJbmZvLmFuY2hvciA9IHJuZy5pc09uQW5jaG9yKCkgJiYgZG9tLmFuY2VzdG9yKHJuZy5zYywgZG9tLmlzQW5jaG9yKTtcblx0XHRcdHN0eWxlSW5mby5hbmNlc3RvcnMgPSBkb20ubGlzdEFuY2VzdG9yKHJuZy5zYywgZG9tLmlzRWRpdGFibGUpO1xuXHRcdFx0c3R5bGVJbmZvLnJhbmdlID0gcm5nO1xuXG5cdFx0XHRyZXR1cm4gc3R5bGVJbmZvO1xuXHRcdH07XG5cdH07XG5cblxuXHQvKipcblx0ICogQGNsYXNzIGVkaXRpbmcuVHlwaW5nXG5cdCAqXG5cdCAqIFR5cGluZ1xuXHQgKlxuXHQgKi9cblx0dmFyIFR5cGluZyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qKlxuXHRcdCAqIGluc2VydCB0YWJcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1dyYXBwZWRSYW5nZX0gcm5nXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHRhYnNpemVcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFRhYiA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHJuZywgdGFic2l6ZSkge1xuXHRcdFx0dmFyIHRhYiA9IGRvbS5jcmVhdGVUZXh0KG5ldyBBcnJheSh0YWJzaXplICsgMSkuam9pbihkb20uTkJTUF9DSEFSKSk7XG5cdFx0XHRybmcgPSBybmcuZGVsZXRlQ29udGVudHMoKTtcblx0XHRcdHJuZy5pbnNlcnROb2RlKHRhYiwgdHJ1ZSk7XG5cblx0XHRcdHJuZyA9IHJhbmdlLmNyZWF0ZSh0YWIsIHRhYnNpemUpO1xuXHRcdFx0cm5nLnNlbGVjdCgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgcGFyYWdyYXBoXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRQYXJhZ3JhcGggPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCk7XG5cblx0XHRcdC8vIGRlbGV0ZUNvbnRlbnRzIG9uIHJhbmdlLlxuXHRcdFx0cm5nID0gcm5nLmRlbGV0ZUNvbnRlbnRzKCk7XG5cblx0XHRcdC8vIFdyYXAgcmFuZ2UgaWYgaXQgbmVlZHMgdG8gYmUgd3JhcHBlZCBieSBwYXJhZ3JhcGhcblx0XHRcdHJuZyA9IHJuZy53cmFwQm9keUlubGluZVdpdGhQYXJhKCk7XG5cblx0XHRcdC8vIGZpbmRpbmcgcGFyYWdyYXBoXG5cdFx0XHR2YXIgc3BsaXRSb290ID0gZG9tLmFuY2VzdG9yKHJuZy5zYywgZG9tLmlzUGFyYSk7XG5cblx0XHRcdHZhciBuZXh0UGFyYTtcblx0XHRcdC8vIG9uIHBhcmFncmFwaDogc3BsaXQgcGFyYWdyYXBoXG5cdFx0XHRpZiAoc3BsaXRSb290KSB7XG5cdFx0XHRcdG5leHRQYXJhID0gZG9tLnNwbGl0VHJlZShzcGxpdFJvb3QsIHJuZy5nZXRTdGFydFBvaW50KCkpO1xuXG5cdFx0XHRcdHZhciBlbXB0eUFuY2hvcnMgPSBkb20ubGlzdERlc2NlbmRhbnQoc3BsaXRSb290LCBkb20uaXNFbXB0eUFuY2hvcik7XG5cdFx0XHRcdGVtcHR5QW5jaG9ycyA9IGVtcHR5QW5jaG9ycy5jb25jYXQoZG9tLmxpc3REZXNjZW5kYW50KG5leHRQYXJhLCBkb20uaXNFbXB0eUFuY2hvcikpO1xuXG5cdFx0XHRcdCQuZWFjaChlbXB0eUFuY2hvcnMsIGZ1bmN0aW9uIChpZHgsIGFuY2hvcikge1xuXHRcdFx0XHRcdGRvbS5yZW1vdmUoYW5jaG9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdC8vIG5vIHBhcmFncmFwaDogaW5zZXJ0IGVtcHR5IHBhcmFncmFwaFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIG5leHQgPSBybmcuc2MuY2hpbGROb2Rlc1tybmcuc29dO1xuXHRcdFx0XHRuZXh0UGFyYSA9ICQoZG9tLmVtcHR5UGFyYSlbMF07XG5cdFx0XHRcdGlmIChuZXh0KSB7XG5cdFx0XHRcdFx0cm5nLnNjLmluc2VydEJlZm9yZShuZXh0UGFyYSwgbmV4dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cm5nLnNjLmFwcGVuZENoaWxkKG5leHRQYXJhKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyYW5nZS5jcmVhdGUobmV4dFBhcmEsIDApLm5vcm1hbGl6ZSgpLnNlbGVjdCgpO1xuXHRcdH07XG5cblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIGVkaXRpbmcuVGFibGVcblx0ICpcblx0ICogVGFibGVcblx0ICpcblx0ICovXG5cdHZhciBUYWJsZSA9IGZ1bmN0aW9uICgpIHtcblx0XHQvKipcblx0XHQgKiBoYW5kbGUgdGFiIGtleVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtXcmFwcGVkUmFuZ2V9IHJuZ1xuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNTaGlmdFxuXHRcdCAqL1xuXHRcdHRoaXMudGFiID0gZnVuY3Rpb24gKHJuZywgaXNTaGlmdCkge1xuXHRcdFx0dmFyIGNlbGwgPSBkb20uYW5jZXN0b3Iocm5nLmNvbW1vbkFuY2VzdG9yKCksIGRvbS5pc0NlbGwpO1xuXHRcdFx0dmFyIHRhYmxlID0gZG9tLmFuY2VzdG9yKGNlbGwsIGRvbS5pc1RhYmxlKTtcblx0XHRcdHZhciBjZWxscyA9IGRvbS5saXN0RGVzY2VuZGFudCh0YWJsZSwgZG9tLmlzQ2VsbCk7XG5cblx0XHRcdHZhciBuZXh0Q2VsbCA9IGxpc3RbaXNTaGlmdCA/ICdwcmV2JyA6ICduZXh0J10oY2VsbHMsIGNlbGwpO1xuXHRcdFx0aWYgKG5leHRDZWxsKSB7XG5cdFx0XHRcdHJhbmdlLmNyZWF0ZShuZXh0Q2VsbCwgMCkuc2VsZWN0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNyZWF0ZSBlbXB0eSB0YWJsZSBlbGVtZW50XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gcm93Q291bnRcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gY29sQ291bnRcblx0XHQgKiBAcmV0dXJuIHtOb2RlfVxuXHRcdCAqL1xuXHRcdHRoaXMuY3JlYXRlVGFibGUgPSBmdW5jdGlvbiAoY29sQ291bnQsIHJvd0NvdW50KSB7XG5cdFx0XHR2YXIgdGRzID0gW10sIHRkSFRNTDtcblx0XHRcdGZvciAodmFyIGlkeENvbCA9IDA7IGlkeENvbCA8IGNvbENvdW50OyBpZHhDb2wrKykge1xuXHRcdFx0XHR0ZHMucHVzaCgnPHRkPicgKyBkb20uYmxhbmsgKyAnPC90ZD4nKTtcblx0XHRcdH1cblx0XHRcdHRkSFRNTCA9IHRkcy5qb2luKCcnKTtcblxuXHRcdFx0dmFyIHRycyA9IFtdLCB0ckhUTUw7XG5cdFx0XHRmb3IgKHZhciBpZHhSb3cgPSAwOyBpZHhSb3cgPCByb3dDb3VudDsgaWR4Um93KyspIHtcblx0XHRcdFx0dHJzLnB1c2goJzx0cj4nICsgdGRIVE1MICsgJzwvdHI+Jyk7XG5cdFx0XHR9XG5cdFx0XHR0ckhUTUwgPSB0cnMuam9pbignJyk7XG5cdFx0XHRyZXR1cm4gJCgnPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWRcIj4nICsgdHJIVE1MICsgJzwvdGFibGU+JylbMF07XG5cdFx0fTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBAY2xhc3MgZWRpdGluZy5CdWxsZXRcblx0ICpcblx0ICogQGFsdGVybmF0ZUNsYXNzTmFtZSBCdWxsZXRcblx0ICovXG5cdHZhciBCdWxsZXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpbnNlcnRPcmRlcmVkTGlzdFxuXHRcdCAqXG5cdFx0ICogdG9nZ2xlIG9yZGVyZWQgbGlzdFxuXHRcdCAqXG5cdFx0ICogQHR5cGUgY29tbWFuZFxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0T3JkZXJlZExpc3QgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLnRvZ2dsZUxpc3QoJ09MJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaW5zZXJ0VW5vcmRlcmVkTGlzdFxuXHRcdCAqXG5cdFx0ICogdG9nZ2xlIHVub3JkZXJlZCBsaXN0XG5cdFx0ICpcblx0XHQgKiBAdHlwZSBjb21tYW5kXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRVbm9yZGVyZWRMaXN0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dGhpcy50b2dnbGVMaXN0KCdVTCcpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGluZGVudFxuXHRcdCAqXG5cdFx0ICogaW5kZW50XG5cdFx0ICpcblx0XHQgKiBAdHlwZSBjb21tYW5kXG5cdFx0ICovXG5cdFx0dGhpcy5pbmRlbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCkud3JhcEJvZHlJbmxpbmVXaXRoUGFyYSgpO1xuXG5cdFx0XHR2YXIgcGFyYXMgPSBybmcubm9kZXMoZG9tLmlzUGFyYSwgeyBpbmNsdWRlQW5jZXN0b3I6IHRydWUgfSk7XG5cdFx0XHR2YXIgY2x1c3RlcmVkcyA9IGxpc3QuY2x1c3RlckJ5KHBhcmFzLCBmdW5jLnBlcTIoJ3BhcmVudE5vZGUnKSk7XG5cblx0XHRcdCQuZWFjaChjbHVzdGVyZWRzLCBmdW5jdGlvbiAoaWR4LCBwYXJhcykge1xuXHRcdFx0XHR2YXIgaGVhZCA9IGxpc3QuaGVhZChwYXJhcyk7XG5cdFx0XHRcdGlmIChkb20uaXNMaShoZWFkKSkge1xuXHRcdFx0XHRcdHNlbGYud3JhcExpc3QocGFyYXMsIGhlYWQucGFyZW50Tm9kZS5ub2RlTmFtZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JC5lYWNoKHBhcmFzLCBmdW5jdGlvbiAoaWR4LCBwYXJhKSB7XG5cdFx0XHRcdFx0XHQkKHBhcmEpLmNzcygnbWFyZ2luTGVmdCcsIGZ1bmN0aW9uIChpZHgsIHZhbCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKHBhcnNlSW50KHZhbCwgMTApIHx8IDApICsgMjU7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHJuZy5zZWxlY3QoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBvdXRkZW50XG5cdFx0ICpcblx0XHQgKiBvdXRkZW50XG5cdFx0ICpcblx0XHQgKiBAdHlwZSBjb21tYW5kXG5cdFx0ICovXG5cdFx0dGhpcy5vdXRkZW50ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpLndyYXBCb2R5SW5saW5lV2l0aFBhcmEoKTtcblxuXHRcdFx0dmFyIHBhcmFzID0gcm5nLm5vZGVzKGRvbS5pc1BhcmEsIHsgaW5jbHVkZUFuY2VzdG9yOiB0cnVlIH0pO1xuXHRcdFx0dmFyIGNsdXN0ZXJlZHMgPSBsaXN0LmNsdXN0ZXJCeShwYXJhcywgZnVuYy5wZXEyKCdwYXJlbnROb2RlJykpO1xuXG5cdFx0XHQkLmVhY2goY2x1c3RlcmVkcywgZnVuY3Rpb24gKGlkeCwgcGFyYXMpIHtcblx0XHRcdFx0dmFyIGhlYWQgPSBsaXN0LmhlYWQocGFyYXMpO1xuXHRcdFx0XHRpZiAoZG9tLmlzTGkoaGVhZCkpIHtcblx0XHRcdFx0XHRzZWxmLnJlbGVhc2VMaXN0KFtwYXJhc10pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCQuZWFjaChwYXJhcywgZnVuY3Rpb24gKGlkeCwgcGFyYSkge1xuXHRcdFx0XHRcdFx0JChwYXJhKS5jc3MoJ21hcmdpbkxlZnQnLCBmdW5jdGlvbiAoaWR4LCB2YWwpIHtcblx0XHRcdFx0XHRcdFx0dmFsID0gKHBhcnNlSW50KHZhbCwgMTApIHx8IDApO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsID4gMjUgPyB2YWwgLSAyNSA6ICcnO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRybmcuc2VsZWN0KCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgdG9nZ2xlTGlzdFxuXHRcdCAqXG5cdFx0ICogdG9nZ2xlIGxpc3Rcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBsaXN0TmFtZSAtIE9MIG9yIFVMXG5cdFx0ICovXG5cdFx0dGhpcy50b2dnbGVMaXN0ID0gZnVuY3Rpb24gKGxpc3ROYW1lKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCkud3JhcEJvZHlJbmxpbmVXaXRoUGFyYSgpO1xuXG5cdFx0XHR2YXIgcGFyYXMgPSBybmcubm9kZXMoZG9tLmlzUGFyYSwgeyBpbmNsdWRlQW5jZXN0b3I6IHRydWUgfSk7XG5cdFx0XHR2YXIgYm9va21hcmsgPSBybmcucGFyYUJvb2ttYXJrKHBhcmFzKTtcblx0XHRcdHZhciBjbHVzdGVyZWRzID0gbGlzdC5jbHVzdGVyQnkocGFyYXMsIGZ1bmMucGVxMigncGFyZW50Tm9kZScpKTtcblxuXHRcdFx0Ly8gcGFyYWdyYXBoIHRvIGxpc3Rcblx0XHRcdGlmIChsaXN0LmZpbmQocGFyYXMsIGRvbS5pc1B1cmVQYXJhKSkge1xuXHRcdFx0XHR2YXIgd3JhcHBlZFBhcmFzID0gW107XG5cdFx0XHRcdCQuZWFjaChjbHVzdGVyZWRzLCBmdW5jdGlvbiAoaWR4LCBwYXJhcykge1xuXHRcdFx0XHRcdHdyYXBwZWRQYXJhcyA9IHdyYXBwZWRQYXJhcy5jb25jYXQoc2VsZi53cmFwTGlzdChwYXJhcywgbGlzdE5hbWUpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHBhcmFzID0gd3JhcHBlZFBhcmFzO1xuXHRcdFx0XHQvLyBsaXN0IHRvIHBhcmFncmFwaCBvciBjaGFuZ2UgbGlzdCBzdHlsZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGRpZmZMaXN0cyA9IHJuZy5ub2Rlcyhkb20uaXNMaXN0LCB7XG5cdFx0XHRcdFx0aW5jbHVkZUFuY2VzdG9yOiB0cnVlXG5cdFx0XHRcdH0pLmZpbHRlcihmdW5jdGlvbiAobGlzdE5vZGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gISQubm9kZU5hbWUobGlzdE5vZGUsIGxpc3ROYW1lKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGRpZmZMaXN0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHQkLmVhY2goZGlmZkxpc3RzLCBmdW5jdGlvbiAoaWR4LCBsaXN0Tm9kZSkge1xuXHRcdFx0XHRcdFx0ZG9tLnJlcGxhY2UobGlzdE5vZGUsIGxpc3ROYW1lKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwYXJhcyA9IHRoaXMucmVsZWFzZUxpc3QoY2x1c3RlcmVkcywgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmFuZ2UuY3JlYXRlRnJvbVBhcmFCb29rbWFyayhib29rbWFyaywgcGFyYXMpLnNlbGVjdCgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHdyYXBMaXN0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGVbXX0gcGFyYXNcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbGlzdE5hbWVcblx0XHQgKiBAcmV0dXJuIHtOb2RlW119XG5cdFx0ICovXG5cdFx0dGhpcy53cmFwTGlzdCA9IGZ1bmN0aW9uIChwYXJhcywgbGlzdE5hbWUpIHtcblx0XHRcdHZhciBoZWFkID0gbGlzdC5oZWFkKHBhcmFzKTtcblx0XHRcdHZhciBsYXN0ID0gbGlzdC5sYXN0KHBhcmFzKTtcblxuXHRcdFx0dmFyIHByZXZMaXN0ID0gZG9tLmlzTGlzdChoZWFkLnByZXZpb3VzU2libGluZykgJiYgaGVhZC5wcmV2aW91c1NpYmxpbmc7XG5cdFx0XHR2YXIgbmV4dExpc3QgPSBkb20uaXNMaXN0KGxhc3QubmV4dFNpYmxpbmcpICYmIGxhc3QubmV4dFNpYmxpbmc7XG5cblx0XHRcdHZhciBsaXN0Tm9kZSA9IHByZXZMaXN0IHx8IGRvbS5pbnNlcnRBZnRlcihkb20uY3JlYXRlKGxpc3ROYW1lIHx8ICdVTCcpLCBsYXN0KTtcblxuXHRcdFx0Ly8gUCB0byBMSVxuXHRcdFx0cGFyYXMgPSAkLm1hcChwYXJhcywgZnVuY3Rpb24gKHBhcmEpIHtcblx0XHRcdFx0cmV0dXJuIGRvbS5pc1B1cmVQYXJhKHBhcmEpID8gZG9tLnJlcGxhY2UocGFyYSwgJ0xJJykgOiBwYXJhO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIGFwcGVuZCB0byBsaXN0KDx1bD4sIDxvbD4pXG5cdFx0XHRkb20uYXBwZW5kQ2hpbGROb2RlcyhsaXN0Tm9kZSwgcGFyYXMpO1xuXG5cdFx0XHRpZiAobmV4dExpc3QpIHtcblx0XHRcdFx0ZG9tLmFwcGVuZENoaWxkTm9kZXMobGlzdE5vZGUsIGxpc3QuZnJvbShuZXh0TGlzdC5jaGlsZE5vZGVzKSk7XG5cdFx0XHRcdGRvbS5yZW1vdmUobmV4dExpc3QpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcGFyYXM7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVsZWFzZUxpc3Rcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXlbXX0gY2x1c3RlcmVkc1xuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNFc2NhcHNlVG9Cb2R5XG5cdFx0ICogQHJldHVybiB7Tm9kZVtdfVxuXHRcdCAqL1xuXHRcdHRoaXMucmVsZWFzZUxpc3QgPSBmdW5jdGlvbiAoY2x1c3RlcmVkcywgaXNFc2NhcHNlVG9Cb2R5KSB7XG5cdFx0XHR2YXIgcmVsZWFzZWRQYXJhcyA9IFtdO1xuXG5cdFx0XHQkLmVhY2goY2x1c3RlcmVkcywgZnVuY3Rpb24gKGlkeCwgcGFyYXMpIHtcblx0XHRcdFx0dmFyIGhlYWQgPSBsaXN0LmhlYWQocGFyYXMpO1xuXHRcdFx0XHR2YXIgbGFzdCA9IGxpc3QubGFzdChwYXJhcyk7XG5cblx0XHRcdFx0dmFyIGhlYWRMaXN0ID0gaXNFc2NhcHNlVG9Cb2R5ID8gZG9tLmxhc3RBbmNlc3RvcihoZWFkLCBkb20uaXNMaXN0KSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgaGVhZC5wYXJlbnROb2RlO1xuXHRcdFx0XHR2YXIgbGFzdExpc3QgPSBoZWFkTGlzdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPyBkb20uc3BsaXRUcmVlKGhlYWRMaXN0LCB7XG5cdFx0XHRcdFx0bm9kZTogbGFzdC5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdG9mZnNldDogZG9tLnBvc2l0aW9uKGxhc3QpICsgMVxuXHRcdFx0XHR9LCB0cnVlKSA6IG51bGw7XG5cblx0XHRcdFx0dmFyIG1pZGRsZUxpc3QgPSBkb20uc3BsaXRUcmVlKGhlYWRMaXN0LCB7XG5cdFx0XHRcdFx0bm9kZTogaGVhZC5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdG9mZnNldDogZG9tLnBvc2l0aW9uKGhlYWQpXG5cdFx0XHRcdH0sIHRydWUpO1xuXG5cdFx0XHRcdHBhcmFzID0gaXNFc2NhcHNlVG9Cb2R5ID8gZG9tLmxpc3REZXNjZW5kYW50KG1pZGRsZUxpc3QsIGRvbS5pc0xpKSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCAgbGlzdC5mcm9tKG1pZGRsZUxpc3QuY2hpbGROb2RlcykuZmlsdGVyKGRvbS5pc0xpKTtcblxuXHRcdFx0XHQvLyBMSSB0byBQXG5cdFx0XHRcdGlmIChpc0VzY2Fwc2VUb0JvZHkgfHwgIWRvbS5pc0xpc3QoaGVhZExpc3QucGFyZW50Tm9kZSkpIHtcblx0XHRcdFx0XHRwYXJhcyA9ICQubWFwKHBhcmFzLCBmdW5jdGlvbiAocGFyYSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRvbS5yZXBsYWNlKHBhcmEsICdQJyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQkLmVhY2gobGlzdC5mcm9tKHBhcmFzKS5yZXZlcnNlKCksIGZ1bmN0aW9uIChpZHgsIHBhcmEpIHtcblx0XHRcdFx0XHRkb20uaW5zZXJ0QWZ0ZXIocGFyYSwgaGVhZExpc3QpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyByZW1vdmUgZW1wdHkgbGlzdHNcblx0XHRcdFx0dmFyIHJvb3RMaXN0cyA9IGxpc3QuY29tcGFjdChbaGVhZExpc3QsIG1pZGRsZUxpc3QsIGxhc3RMaXN0XSk7XG5cdFx0XHRcdCQuZWFjaChyb290TGlzdHMsIGZ1bmN0aW9uIChpZHgsIHJvb3RMaXN0KSB7XG5cdFx0XHRcdFx0dmFyIGxpc3ROb2RlcyA9IFtyb290TGlzdF0uY29uY2F0KGRvbS5saXN0RGVzY2VuZGFudChyb290TGlzdCwgZG9tLmlzTGlzdCkpO1xuXHRcdFx0XHRcdCQuZWFjaChsaXN0Tm9kZXMucmV2ZXJzZSgpLCBmdW5jdGlvbiAoaWR4LCBsaXN0Tm9kZSkge1xuXHRcdFx0XHRcdFx0aWYgKCFkb20ubm9kZUxlbmd0aChsaXN0Tm9kZSkpIHtcblx0XHRcdFx0XHRcdFx0ZG9tLnJlbW92ZShsaXN0Tm9kZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJlbGVhc2VkUGFyYXMgPSByZWxlYXNlZFBhcmFzLmNvbmNhdChwYXJhcyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHJlbGVhc2VkUGFyYXM7XG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIGVkaXRpbmcuRWRpdG9yXG5cdCAqXG5cdCAqIEVkaXRvclxuXHQgKlxuXHQgKi9cblx0dmFyIEVkaXRvciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdHlsZSA9IG5ldyBTdHlsZSgpO1xuXHRcdHZhciB0YWJsZSA9IG5ldyBUYWJsZSgpO1xuXHRcdHZhciB0eXBpbmcgPSBuZXcgVHlwaW5nKCk7XG5cdFx0dmFyIGJ1bGxldCA9IG5ldyBCdWxsZXQoKTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgY3JlYXRlUmFuZ2Vcblx0XHQgKlxuXHRcdCAqIGNyZWF0ZSByYW5nZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHQgKi9cblx0XHR0aGlzLmNyZWF0ZVJhbmdlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cdFx0XHRyZXR1cm4gcmFuZ2UuY3JlYXRlKCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgc2F2ZVJhbmdlXG5cdFx0ICpcblx0XHQgKiBzYXZlIGN1cnJlbnQgcmFuZ2Vcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFt0aGVuQ29sbGFwc2U9ZmFsc2VdXG5cdFx0ICovXG5cdFx0dGhpcy5zYXZlUmFuZ2UgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB0aGVuQ29sbGFwc2UpIHtcblx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXHRcdFx0JGVkaXRhYmxlLmRhdGEoJ3JhbmdlJywgcmFuZ2UuY3JlYXRlKCkpO1xuXHRcdFx0aWYgKHRoZW5Db2xsYXBzZSkge1xuXHRcdFx0XHRyYW5nZS5jcmVhdGUoKS5jb2xsYXBzZSgpLnNlbGVjdCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHNhdmVSYW5nZVxuXHRcdCAqXG5cdFx0ICogc2F2ZSBjdXJyZW50IG5vZGUgbGlzdCB0byAkZWRpdGFibGUuZGF0YSgnY2hpbGROb2RlcycpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5zYXZlTm9kZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdC8vIGNvcHkgY2hpbGQgbm9kZSByZWZlcmVuY2Vcblx0XHRcdHZhciBjb3B5ID0gW107XG5cdFx0XHRmb3IgKHZhciBrZXkgPSAwLCBsZW4gPSAkZWRpdGFibGVbMF0uY2hpbGROb2Rlcy5sZW5ndGg7IGtleSA8IGxlbjsga2V5KyspIHtcblx0XHRcdFx0Y29weS5wdXNoKCRlZGl0YWJsZVswXS5jaGlsZE5vZGVzW2tleV0pO1xuXHRcdFx0fVxuXHRcdFx0JGVkaXRhYmxlLmRhdGEoJ2NoaWxkTm9kZXMnLCBjb3B5KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZXN0b3JlUmFuZ2Vcblx0XHQgKlxuXHRcdCAqIHJlc3RvcmUgbGF0ZWx5IHJhbmdlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5yZXN0b3JlUmFuZ2UgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHR2YXIgcm5nID0gJGVkaXRhYmxlLmRhdGEoJ3JhbmdlJyk7XG5cdFx0XHRpZiAocm5nKSB7XG5cdFx0XHRcdHJuZy5zZWxlY3QoKTtcblx0XHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVzdG9yZU5vZGVcblx0XHQgKlxuXHRcdCAqIHJlc3RvcmUgbGF0ZWx5IG5vZGUgbGlzdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMucmVzdG9yZU5vZGUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHQkZWRpdGFibGUuaHRtbCgnJyk7XG5cdFx0XHR2YXIgY2hpbGQgPSAkZWRpdGFibGUuZGF0YSgnY2hpbGROb2RlcycpO1xuXHRcdFx0Zm9yICh2YXIgaW5kZXggPSAwLCBsZW4gPSBjaGlsZC5sZW5ndGg7IGluZGV4IDwgbGVuOyBpbmRleCsrKSB7XG5cdFx0XHRcdCRlZGl0YWJsZVswXS5hcHBlbmRDaGlsZChjaGlsZFtpbmRleF0pO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBjdXJyZW50U3R5bGVcblx0XHQgKlxuXHRcdCAqIGN1cnJlbnQgc3R5bGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn0gZmFsc2UgaWYgcmFuZ2UgaXMgbm9cblx0XHQgKi9cblx0XHR0aGlzLmN1cnJlbnRTdHlsZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKTtcblx0XHRcdHJldHVybiBybmcgPyBybmcuaXNPbkVkaXRhYmxlKCkgJiYgc3R5bGUuY3VycmVudChybmcsIHRhcmdldCkgOiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0dmFyIHRyaWdnZXJPbkJlZm9yZUNoYW5nZSA9IHRoaXMudHJpZ2dlck9uQmVmb3JlQ2hhbmdlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0dmFyIG9uQmVmb3JlQ2hhbmdlID0gJGVkaXRhYmxlLmRhdGEoJ2NhbGxiYWNrcycpLm9uQmVmb3JlQ2hhbmdlO1xuXHRcdFx0aWYgKG9uQmVmb3JlQ2hhbmdlKSB7XG5cdFx0XHRcdG9uQmVmb3JlQ2hhbmdlKCRlZGl0YWJsZS5odG1sKCksICRlZGl0YWJsZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB0cmlnZ2VyT25DaGFuZ2UgPSB0aGlzLnRyaWdnZXJPbkNoYW5nZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdHZhciBvbkNoYW5nZSA9ICRlZGl0YWJsZS5kYXRhKCdjYWxsYmFja3MnKS5vbkNoYW5nZTtcblx0XHRcdGlmIChvbkNoYW5nZSkge1xuXHRcdFx0XHRvbkNoYW5nZSgkZWRpdGFibGUuaHRtbCgpLCAkZWRpdGFibGUpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHVuZG9cblx0XHQgKiB1bmRvXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMudW5kbyA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdHRyaWdnZXJPbkJlZm9yZUNoYW5nZSgkZWRpdGFibGUpO1xuXHRcdFx0JGVkaXRhYmxlLmRhdGEoJ05vdGVIaXN0b3J5JykudW5kbygpO1xuXHRcdFx0dHJpZ2dlck9uQ2hhbmdlKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVkb1xuXHRcdCAqIHJlZG9cblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5yZWRvID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0dHJpZ2dlck9uQmVmb3JlQ2hhbmdlKCRlZGl0YWJsZSk7XG5cdFx0XHQkZWRpdGFibGUuZGF0YSgnTm90ZUhpc3RvcnknKS5yZWRvKCk7XG5cdFx0XHR0cmlnZ2VyT25DaGFuZ2UoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBiZWZvcmVDb21tYW5kXG5cdFx0ICogYmVmb3JlIGNvbW1hbmRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dmFyIGJlZm9yZUNvbW1hbmQgPSB0aGlzLmJlZm9yZUNvbW1hbmQgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHR0cmlnZ2VyT25CZWZvcmVDaGFuZ2UoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBhZnRlckNvbW1hbmRcblx0XHQgKiBhZnRlciBjb21tYW5kXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHZhciBhZnRlckNvbW1hbmQgPSB0aGlzLmFmdGVyQ29tbWFuZCA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdCRlZGl0YWJsZS5kYXRhKCdOb3RlSGlzdG9yeScpLnJlY29yZFVuZG8oKTtcblx0XHRcdHRyaWdnZXJPbkNoYW5nZSgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGJvbGRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaXRhbGljXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHVuZGVybGluZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBzdHJpa2V0aHJvdWdoXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGZvcm1hdEJsb2NrXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHN1cGVyc2NyaXB0XG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHN1YnNjcmlwdFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBqdXN0aWZ5TGVmdFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBqdXN0aWZ5Q2VudGVyXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGp1c3RpZnlSaWdodFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBqdXN0aWZ5RnVsbFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBmb3JtYXRCbG9ja1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZW1vdmVGb3JtYXRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgYmFja0NvbG9yXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGZvcmVDb2xvclxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpbnNlcnRIb3Jpem9udGFsUnVsZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBmb250TmFtZVxuXHRcdCAqXG5cdFx0ICogY2hhbmdlIGZvbnQgbmFtZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdFx0Ly8gbmF0aXZlIGNvbW1hbmRzKHdpdGggZXhlY0NvbW1hbmQpLCBnZW5lcmF0ZSBmdW5jdGlvbiBmb3IgZXhlY0NvbW1hbmRcblx0XHR2YXIgY29tbWFuZHMgPSBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3N1cGVyc2NyaXB0JywgJ3N1YnNjcmlwdCcsXG5cdFx0XHRcdFx0XHQnanVzdGlmeUxlZnQnLCAnanVzdGlmeUNlbnRlcicsICdqdXN0aWZ5UmlnaHQnLCAnanVzdGlmeUZ1bGwnLFxuXHRcdFx0XHRcdFx0J2Zvcm1hdEJsb2NrJywgJ3JlbW92ZUZvcm1hdCcsXG5cdFx0XHRcdFx0XHQnYmFja0NvbG9yJywgJ2ZvcmVDb2xvcicsICdpbnNlcnRIb3Jpem9udGFsUnVsZScsICdmb250TmFtZSddO1xuXG5cdFx0Zm9yICh2YXIgaWR4ID0gMCwgbGVuID0gY29tbWFuZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHR0aGlzW2NvbW1hbmRzW2lkeF1dID0gKGZ1bmN0aW9uIChzQ21kKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoJGVkaXRhYmxlLCB2YWx1ZSkge1xuXHRcdFx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblxuXHRcdFx0XHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKHNDbWQsIGZhbHNlLCB2YWx1ZSk7XG5cblx0XHRcdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdFx0fTtcblx0XHRcdH0pKGNvbW1hbmRzW2lkeF0pO1xuXHRcdH1cblx0XHQvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCB0YWJcblx0XHQgKlxuXHRcdCAqIGhhbmRsZSB0YWIga2V5XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzLnRhYiA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKTtcblx0XHRcdGlmIChybmcuaXNDb2xsYXBzZWQoKSAmJiBybmcuaXNPbkNlbGwoKSkge1xuXHRcdFx0XHR0YWJsZS50YWIocm5nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdFx0dHlwaW5nLmluc2VydFRhYigkZWRpdGFibGUsIHJuZywgb3B0aW9ucy50YWJzaXplKTtcblx0XHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgdW50YWJcblx0XHQgKlxuXHRcdCAqIGhhbmRsZSBzaGlmdCt0YWIga2V5XG5cdFx0ICpcblx0XHQgKi9cblx0XHR0aGlzLnVudGFiID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpO1xuXHRcdFx0aWYgKHJuZy5pc0NvbGxhcHNlZCgpICYmIHJuZy5pc09uQ2VsbCgpKSB7XG5cdFx0XHRcdHRhYmxlLnRhYihybmcsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGluc2VydFBhcmFncmFwaFxuXHRcdCAqXG5cdFx0ICogaW5zZXJ0IHBhcmFncmFwaFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFBhcmFncmFwaCA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdHR5cGluZy5pbnNlcnRQYXJhZ3JhcGgoJGVkaXRhYmxlKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGluc2VydE9yZGVyZWRMaXN0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRPcmRlcmVkTGlzdCA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdGJ1bGxldC5pbnNlcnRPcmRlcmVkTGlzdCgkZWRpdGFibGUpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFVub3JkZXJlZExpc3QgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRidWxsZXQuaW5zZXJ0VW5vcmRlcmVkTGlzdCgkZWRpdGFibGUpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLmluZGVudCA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdGJ1bGxldC5pbmRlbnQoJGVkaXRhYmxlKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5vdXRkZW50ID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0YnVsbGV0Lm91dGRlbnQoJGVkaXRhYmxlKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgaW1hZ2Vcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc1VybFxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0SW1hZ2UgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBzVXJsLCBmaWxlbmFtZSkge1xuXHRcdFx0YXN5bmMuY3JlYXRlSW1hZ2Uoc1VybCwgZmlsZW5hbWUpLnRoZW4oZnVuY3Rpb24gKCRpbWFnZSkge1xuXHRcdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRcdCRpbWFnZS5jc3Moe1xuXHRcdFx0XHRcdGRpc3BsYXk6ICcnLFxuXHRcdFx0XHRcdHdpZHRoOiBNYXRoLm1pbigkZWRpdGFibGUud2lkdGgoKSwgJGltYWdlLndpZHRoKCkpXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyYW5nZS5jcmVhdGUoKS5pbnNlcnROb2RlKCRpbWFnZVswXSk7XG5cdFx0XHRcdHJhbmdlLmNyZWF0ZUZyb21Ob2RlKCRpbWFnZVswXSkuY29sbGFwc2UoKS5zZWxlY3QoKTtcblx0XHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHR9KS5mYWlsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIGNhbGxiYWNrcyA9ICRlZGl0YWJsZS5kYXRhKCdjYWxsYmFja3MnKTtcblx0XHRcdFx0aWYgKGNhbGxiYWNrcy5vbkltYWdlVXBsb2FkRXJyb3IpIHtcblx0XHRcdFx0XHRjYWxsYmFja3Mub25JbWFnZVVwbG9hZEVycm9yKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGluc2VydE5vZGVcblx0XHQgKiBpbnNlcnQgbm9kZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnROb2RlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgbm9kZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0dmFyIHJuZyA9IHRoaXMuY3JlYXRlUmFuZ2UoJGVkaXRhYmxlKTtcblx0XHRcdHJuZy5pbnNlcnROb2RlKG5vZGUpO1xuXHRcdFx0cmFuZ2UuY3JlYXRlRnJvbU5vZGUobm9kZSkuY29sbGFwc2UoKS5zZWxlY3QoKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgdGV4dFxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHRcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFRleHQgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB0ZXh0KSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHR2YXIgcm5nID0gdGhpcy5jcmVhdGVSYW5nZSgkZWRpdGFibGUpO1xuXHRcdFx0dmFyIHRleHROb2RlID0gcm5nLmluc2VydE5vZGUoZG9tLmNyZWF0ZVRleHQodGV4dCkpO1xuXHRcdFx0cmFuZ2UuY3JlYXRlKHRleHROb2RlLCBkb20ubm9kZUxlbmd0aCh0ZXh0Tm9kZSkpLnNlbGVjdCgpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGZvcm1hdEJsb2NrXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHRhZ05hbWVcblx0XHQgKi9cblx0XHR0aGlzLmZvcm1hdEJsb2NrID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdGFnTmFtZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0dGFnTmFtZSA9IGFnZW50LmlzTVNJRSA/ICc8JyArIHRhZ05hbWUgKyAnPicgOiB0YWdOYW1lO1xuXHRcdFx0ZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ0Zvcm1hdEJsb2NrJywgZmFsc2UsIHRhZ05hbWUpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdHRoaXMuZm9ybWF0UGFyYSA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdHRoaXMuZm9ybWF0QmxvY2soJGVkaXRhYmxlLCAnUCcpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0XHRmb3IgKHZhciBpZHggPSAxOyBpZHggPD0gNjsgaWR4KyspIHtcblx0XHRcdHRoaXNbJ2Zvcm1hdEgnICsgaWR4XSA9IGZ1bmN0aW9uIChpZHgpIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdFx0XHR0aGlzLmZvcm1hdEJsb2NrKCRlZGl0YWJsZSwgJ0gnICsgaWR4KTtcblx0XHRcdFx0fTtcblx0XHRcdH0oaWR4KTtcblx0XHR9O1xuXHRcdC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cblx0XHQvKipcblx0XHQgKiBmb250c2l6ZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtIHB4XG5cdFx0ICovXG5cdFx0dGhpcy5mb250U2l6ZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHZhbHVlKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cblx0XHRcdHZhciBybmcgPSB0aGlzLmNyZWF0ZVJhbmdlKCRlZGl0YWJsZSk7XG5cdFx0XHR2YXIgc3BhbnMgPSBzdHlsZS5zdHlsZU5vZGVzKHJuZyk7XG5cdFx0XHQkLmVhY2goc3BhbnMsIGZ1bmN0aW9uIChpZHgsIHNwYW4pIHtcblx0XHRcdFx0JChzcGFuKS5jc3Moe1xuXHRcdFx0XHRcdCdmb250LXNpemUnOiB2YWx1ZSArICdweCdcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGxpbmVIZWlnaHRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG5cdFx0ICovXG5cdFx0dGhpcy5saW5lSGVpZ2h0ID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdmFsdWUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdHN0eWxlLnN0eWxlUGFyYShyYW5nZS5jcmVhdGUoKSwge1xuXHRcdFx0XHRsaW5lSGVpZ2h0OiB2YWx1ZVxuXHRcdFx0fSk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogdW5saW5rXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBjb21tYW5kXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy51bmxpbmsgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCk7XG5cdFx0XHRpZiAocm5nLmlzT25BbmNob3IoKSkge1xuXHRcdFx0XHR2YXIgYW5jaG9yID0gZG9tLmFuY2VzdG9yKHJuZy5zYywgZG9tLmlzQW5jaG9yKTtcblx0XHRcdFx0cm5nID0gcmFuZ2UuY3JlYXRlRnJvbU5vZGUoYW5jaG9yKTtcblx0XHRcdFx0cm5nLnNlbGVjdCgpO1xuXG5cdFx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdFx0ZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ3VubGluaycpO1xuXHRcdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogY3JlYXRlIGxpbmsgKGNvbW1hbmQpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxpbmtJbmZvXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzLmNyZWF0ZUxpbmsgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBsaW5rSW5mbywgb3B0aW9ucykge1xuXHRcdFx0dmFyIGxpbmtVcmwgPSBsaW5rSW5mby51cmw7XG5cdFx0XHR2YXIgbGlua1RleHQgPSBsaW5rSW5mby50ZXh0O1xuXHRcdFx0dmFyIGlzTmV3V2luZG93ID0gbGlua0luZm8ubmV3V2luZG93O1xuXHRcdFx0dmFyIHJuZyA9IGxpbmtJbmZvLnJhbmdlO1xuXHRcdFx0dmFyIGlzVGV4dENoYW5nZWQgPSBybmcudG9TdHJpbmcoKSAhPT0gbGlua1RleHQ7XG5cblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblxuXHRcdFx0aWYgKG9wdGlvbnMub25DcmVhdGVMaW5rKSB7XG5cdFx0XHRcdGxpbmtVcmwgPSBvcHRpb25zLm9uQ3JlYXRlTGluayhsaW5rVXJsKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGFuY2hvcnM7XG5cdFx0XHRpZiAoaXNUZXh0Q2hhbmdlZCkge1xuXHRcdFx0XHQvLyBDcmVhdGUgYSBuZXcgbGluayB3aGVuIHRleHQgY2hhbmdlZC5cblx0XHRcdFx0dmFyIGFuY2hvciA9IHJuZy5pbnNlcnROb2RlKCQoJzxBPicgKyBsaW5rVGV4dCArICc8L0E+JylbMF0pO1xuXHRcdFx0XHRhbmNob3JzID0gW2FuY2hvcl07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhbmNob3JzID0gc3R5bGUuc3R5bGVOb2RlcyhybmcsIHtcblx0XHRcdFx0XHRub2RlTmFtZTogJ0EnLFxuXHRcdFx0XHRcdGV4cGFuZENsb3Nlc3RTaWJsaW5nOiB0cnVlLFxuXHRcdFx0XHRcdG9ubHlQYXJ0aWFsQ29udGFpbnM6IHRydWVcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdCQuZWFjaChhbmNob3JzLCBmdW5jdGlvbiAoaWR4LCBhbmNob3IpIHtcblx0XHRcdFx0JChhbmNob3IpLmF0dHIoJ2hyZWYnLCBsaW5rVXJsKTtcblx0XHRcdFx0aWYgKGlzTmV3V2luZG93KSB7XG5cdFx0XHRcdFx0JChhbmNob3IpLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkKGFuY2hvcikucmVtb3ZlQXR0cigndGFyZ2V0Jyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHR2YXIgc3RhcnRSYW5nZSA9IHJhbmdlLmNyZWF0ZUZyb21Ob2RlKGxpc3QuaGVhZChhbmNob3JzKSkuY29sbGFwc2UodHJ1ZSk7XG5cdFx0XHR2YXIgc3RhcnRQb2ludCA9IHN0YXJ0UmFuZ2UuZ2V0U3RhcnRQb2ludCgpO1xuXHRcdFx0dmFyIGVuZFJhbmdlID0gcmFuZ2UuY3JlYXRlRnJvbU5vZGUobGlzdC5sYXN0KGFuY2hvcnMpKS5jb2xsYXBzZSgpO1xuXHRcdFx0dmFyIGVuZFBvaW50ID0gZW5kUmFuZ2UuZ2V0RW5kUG9pbnQoKTtcblxuXHRcdFx0cmFuZ2UuY3JlYXRlKFxuXHRcdFx0ICBzdGFydFBvaW50Lm5vZGUsXG5cdFx0XHQgIHN0YXJ0UG9pbnQub2Zmc2V0LFxuXHRcdFx0ICBlbmRQb2ludC5ub2RlLFxuXHRcdFx0ICBlbmRQb2ludC5vZmZzZXRcblx0XHRcdCkuc2VsZWN0KCk7XG5cblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGxpbmsgaW5mb1xuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX0gcmV0dXJuLnJhbmdlXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfSByZXR1cm4udGV4dFxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59IFtyZXR1cm4uaXNOZXdXaW5kb3c9dHJ1ZV1cblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9IFtyZXR1cm4udXJsPVwiXCJdXG5cdFx0ICovXG5cdFx0dGhpcy5nZXRMaW5rSW5mbyA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCkuZXhwYW5kKGRvbS5pc0FuY2hvcik7XG5cblx0XHRcdC8vIEdldCB0aGUgZmlyc3QgYW5jaG9yIG9uIHJhbmdlKGZvciBlZGl0KS5cblx0XHRcdHZhciAkYW5jaG9yID0gJChsaXN0LmhlYWQocm5nLm5vZGVzKGRvbS5pc0FuY2hvcikpKTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmFuZ2U6IHJuZyxcblx0XHRcdFx0dGV4dDogcm5nLnRvU3RyaW5nKCksXG5cdFx0XHRcdGlzTmV3V2luZG93OiAkYW5jaG9yLmxlbmd0aCA/ICRhbmNob3IuYXR0cigndGFyZ2V0JykgPT09ICdfYmxhbmsnIDogZmFsc2UsXG5cdFx0XHRcdHVybDogJGFuY2hvci5sZW5ndGggPyAkYW5jaG9yLmF0dHIoJ2hyZWYnKSA6ICcnXG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBzZXR0aW5nIGNvbG9yXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzT2JqQ29sb3IgIGNvbG9yIGNvZGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc09iakNvbG9yLmZvcmVDb2xvciBmb3JlZ3JvdW5kIGNvbG9yXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHNPYmpDb2xvci5iYWNrQ29sb3IgYmFja2dyb3VuZCBjb2xvclxuXHRcdCAqL1xuXHRcdHRoaXMuY29sb3IgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBzT2JqQ29sb3IpIHtcblx0XHRcdHZhciBvQ29sb3IgPSBKU09OLnBhcnNlKHNPYmpDb2xvcik7XG5cdFx0XHR2YXIgZm9yZUNvbG9yID0gb0NvbG9yLmZvcmVDb2xvciwgYmFja0NvbG9yID0gb0NvbG9yLmJhY2tDb2xvcjtcblxuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXG5cdFx0XHRpZiAoZm9yZUNvbG9yKSB7IGRvY3VtZW50LmV4ZWNDb21tYW5kKCdmb3JlQ29sb3InLCBmYWxzZSwgZm9yZUNvbG9yKTsgfVxuXHRcdFx0aWYgKGJhY2tDb2xvcikgeyBkb2N1bWVudC5leGVjQ29tbWFuZCgnYmFja0NvbG9yJywgZmFsc2UsIGJhY2tDb2xvcik7IH1cblxuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGluc2VydCBUYWJsZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc0RpbSBkaW1lbnNpb24gb2YgdGFibGUgKGV4IDogXCI1eDVcIilcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFRhYmxlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgc0RpbSkge1xuXHRcdFx0dmFyIGRpbWVuc2lvbiA9IHNEaW0uc3BsaXQoJ3gnKTtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblxuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpO1xuXHRcdFx0cm5nID0gcm5nLmRlbGV0ZUNvbnRlbnRzKCk7XG5cdFx0XHRybmcuaW5zZXJ0Tm9kZSh0YWJsZS5jcmVhdGVUYWJsZShkaW1lbnNpb25bMF0sIGRpbWVuc2lvblsxXSkpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGZsb2F0IG1lXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICR0YXJnZXRcblx0XHQgKi9cblx0XHR0aGlzLmZsb2F0TWUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB2YWx1ZSwgJHRhcmdldCkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0JHRhcmdldC5jc3MoJ2Zsb2F0JywgdmFsdWUpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNoYW5nZSBpbWFnZSBzaGFwZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSBjc3MgY2xhc3Ncblx0XHQgKiBAcGFyYW0ge05vZGV9ICR0YXJnZXRcblx0XHQgKi9cblx0XHR0aGlzLmltYWdlU2hhcGUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB2YWx1ZSwgJHRhcmdldCkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXG5cdFx0XHQkdGFyZ2V0LnJlbW92ZUNsYXNzKCdpbWctcm91bmRlZCBpbWctY2lyY2xlIGltZy10aHVtYm5haWwnKTtcblxuXHRcdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRcdCR0YXJnZXQuYWRkQ2xhc3ModmFsdWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmVzaXplIG92ZXJsYXkgZWxlbWVudFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIHRhcmdldCBlbGVtZW50XG5cdFx0ICovXG5cdFx0dGhpcy5yZXNpemUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB2YWx1ZSwgJHRhcmdldCkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXG5cdFx0XHQkdGFyZ2V0LmNzcyh7XG5cdFx0XHRcdHdpZHRoOiB2YWx1ZSAqIDEwMCArICclJyxcblx0XHRcdFx0aGVpZ2h0OiAnJ1xuXHRcdFx0fSk7XG5cblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3Ncblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIHRhcmdldCBlbGVtZW50XG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbYktlZXBSYXRpb10gLSBrZWVwIHJhdGlvXG5cdFx0ICovXG5cdFx0dGhpcy5yZXNpemVUbyA9IGZ1bmN0aW9uIChwb3MsICR0YXJnZXQsIGJLZWVwUmF0aW8pIHtcblx0XHRcdHZhciBpbWFnZVNpemU7XG5cdFx0XHRpZiAoYktlZXBSYXRpbykge1xuXHRcdFx0XHR2YXIgbmV3UmF0aW8gPSBwb3MueSAvIHBvcy54O1xuXHRcdFx0XHR2YXIgcmF0aW8gPSAkdGFyZ2V0LmRhdGEoJ3JhdGlvJyk7XG5cdFx0XHRcdGltYWdlU2l6ZSA9IHtcblx0XHRcdFx0XHR3aWR0aDogcmF0aW8gPiBuZXdSYXRpbyA/IHBvcy54IDogcG9zLnkgLyByYXRpbyxcblx0XHRcdFx0XHRoZWlnaHQ6IHJhdGlvID4gbmV3UmF0aW8gPyBwb3MueCAqIHJhdGlvIDogcG9zLnlcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGltYWdlU2l6ZSA9IHtcblx0XHRcdFx0XHR3aWR0aDogcG9zLngsXG5cdFx0XHRcdFx0aGVpZ2h0OiBwb3MueVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHQkdGFyZ2V0LmNzcyhpbWFnZVNpemUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZW1vdmUgbWVkaWEgb2JqZWN0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC0gZHVtbXkgYXJndW1lbnQgKGZvciBrZWVwIGludGVyZmFjZSlcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIHRhcmdldCBlbGVtZW50XG5cdFx0ICovXG5cdFx0dGhpcy5yZW1vdmVNZWRpYSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHZhbHVlLCAkdGFyZ2V0KSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHQkdGFyZ2V0LmRldGFjaCgpO1xuXG5cdFx0XHR2YXIgY2FsbGJhY2tzID0gJGVkaXRhYmxlLmRhdGEoJ2NhbGxiYWNrcycpO1xuXHRcdFx0aWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3Mub25NZWRpYURlbGV0ZSkge1xuXHRcdFx0XHRjYWxsYmFja3Mub25NZWRpYURlbGV0ZSgkdGFyZ2V0LCB0aGlzLCAkZWRpdGFibGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogc2V0IGZvY3VzXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5mb2N1cyA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBtb2R1bGUuQnV0dG9uXG5cdCAqXG5cdCAqIEJ1dHRvblxuXHQgKi9cblx0dmFyIEJ1dHRvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHQvKipcblx0XHQgKiB1cGRhdGUgYnV0dG9uIHN0YXR1c1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRjb250YWluZXJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc3R5bGVJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoJGNvbnRhaW5lciwgc3R5bGVJbmZvKSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIGhhbmRsZSBkcm9wZG93bidzIGNoZWNrIG1hcmsgKGZvciBmb250bmFtZSwgZm9udHNpemUsIGxpbmVIZWlnaHQpLlxuXHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRidG5cblx0XHRcdCAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZVxuXHRcdFx0ICovXG5cdFx0XHR2YXIgY2hlY2tEcm9wZG93bk1lbnUgPSBmdW5jdGlvbiAoJGJ0biwgdmFsdWUpIHtcblx0XHRcdFx0JGJ0bi5maW5kKCcuZHJvcGRvd24tbWVudSBsaSBhJykuZWFjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gYWx3YXlzIGNvbXBhcmUgc3RyaW5nIHRvIGF2b2lkIGNyZWF0aW5nIGFub3RoZXIgZnVuYy5cblx0XHRcdFx0XHR2YXIgaXNDaGVja2VkID0gKCQodGhpcykuZGF0YSgndmFsdWUnKSArICcnKSA9PT0gKHZhbHVlICsgJycpO1xuXHRcdFx0XHRcdHRoaXMuY2xhc3NOYW1lID0gaXNDaGVja2VkID8gJ2NoZWNrZWQnIDogJyc7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiB1cGRhdGUgYnV0dG9uIHN0YXRlKGFjdGl2ZSBvciBub3QpLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3Jcblx0XHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcblx0XHRcdCAqL1xuXHRcdFx0dmFyIGJ0blN0YXRlID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBwcmVkKSB7XG5cdFx0XHRcdHZhciAkYnRuID0gJGNvbnRhaW5lci5maW5kKHNlbGVjdG9yKTtcblx0XHRcdFx0JGJ0bi50b2dnbGVDbGFzcygnYWN0aXZlJywgcHJlZCgpKTtcblx0XHRcdH07XG5cblx0XHRcdGlmIChzdHlsZUluZm8uaW1hZ2UpIHtcblx0XHRcdFx0dmFyICRpbWcgPSAkKHN0eWxlSW5mby5pbWFnZSk7XG5cblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiaW1hZ2VTaGFwZVwiXVtkYXRhLXZhbHVlPVwiaW1nLXJvdW5kZWRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRpbWcuaGFzQ2xhc3MoJ2ltZy1yb3VuZGVkJyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpbWFnZVNoYXBlXCJdW2RhdGEtdmFsdWU9XCJpbWctY2lyY2xlXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiAkaW1nLmhhc0NsYXNzKCdpbWctY2lyY2xlJyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpbWFnZVNoYXBlXCJdW2RhdGEtdmFsdWU9XCJpbWctdGh1bWJuYWlsXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiAkaW1nLmhhc0NsYXNzKCdpbWctdGh1bWJuYWlsJyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpbWFnZVNoYXBlXCJdOm5vdChbZGF0YS12YWx1ZV0pJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiAhJGltZy5pcygnLmltZy1yb3VuZGVkLCAuaW1nLWNpcmNsZSwgLmltZy10aHVtYm5haWwnKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIGltZ0Zsb2F0ID0gJGltZy5jc3MoJ2Zsb2F0Jyk7XG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImZsb2F0TWVcIl1bZGF0YS12YWx1ZT1cImxlZnRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGltZ0Zsb2F0ID09PSAnbGVmdCc7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJmbG9hdE1lXCJdW2RhdGEtdmFsdWU9XCJyaWdodFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gaW1nRmxvYXQgPT09ICdyaWdodCc7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJmbG9hdE1lXCJdW2RhdGEtdmFsdWU9XCJub25lXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBpbWdGbG9hdCAhPT0gJ2xlZnQnICYmIGltZ0Zsb2F0ICE9PSAncmlnaHQnO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgc3R5bGUgPSAkaW1nLmF0dHIoJ3N0eWxlJyk7XG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cInJlc2l6ZVwiXVtkYXRhLXZhbHVlPVwiMVwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gISEvKF58XFxzKShtYXgtKT93aWR0aFxccyo6XFxzKjEwMCUvLnRlc3Qoc3R5bGUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwicmVzaXplXCJdW2RhdGEtdmFsdWU9XCIwLjVcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhLyhefFxccykobWF4LSk/d2lkdGhcXHMqOlxccyo1MCUvLnRlc3Qoc3R5bGUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwicmVzaXplXCJdW2RhdGEtdmFsdWU9XCIwLjI1XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiAhIS8oXnxcXHMpKG1heC0pP3dpZHRoXFxzKjpcXHMqMjUlLy50ZXN0KHN0eWxlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZm9udG5hbWVcblx0XHRcdHZhciAkZm9udG5hbWUgPSAkY29udGFpbmVyLmZpbmQoJy5ub3RlLWZvbnRuYW1lJyk7XG5cdFx0XHRpZiAoJGZvbnRuYW1lLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgc2VsZWN0ZWRGb250ID0gc3R5bGVJbmZvWydmb250LWZhbWlseSddO1xuXHRcdFx0XHRpZiAoISFzZWxlY3RlZEZvbnQpIHtcblxuXHRcdFx0XHRcdHZhciBsaXN0ID0gc2VsZWN0ZWRGb250LnNwbGl0KCcsJyk7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDAsIGxlbiA9IGxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0XHRcdHNlbGVjdGVkRm9udCA9IGxpc3RbaV0ucmVwbGFjZSgvW1xcJ1xcXCJdL2csICcnKS5yZXBsYWNlKC9cXHMrJC8sICcnKS5yZXBsYWNlKC9eXFxzKy8sICcnKTtcblx0XHRcdFx0XHRcdGlmIChhZ2VudC5pc0ZvbnRJbnN0YWxsZWQoc2VsZWN0ZWRGb250KSkge1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQkZm9udG5hbWUuZmluZCgnLm5vdGUtY3VycmVudC1mb250bmFtZScpLnRleHQoc2VsZWN0ZWRGb250KTtcblx0XHRcdFx0XHRjaGVja0Ryb3Bkb3duTWVudSgkZm9udG5hbWUsIHNlbGVjdGVkRm9udCk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmb250c2l6ZVxuXHRcdFx0dmFyICRmb250c2l6ZSA9ICRjb250YWluZXIuZmluZCgnLm5vdGUtZm9udHNpemUnKTtcblx0XHRcdCRmb250c2l6ZS5maW5kKCcubm90ZS1jdXJyZW50LWZvbnRzaXplJykudGV4dChzdHlsZUluZm9bJ2ZvbnQtc2l6ZSddKTtcblx0XHRcdGNoZWNrRHJvcGRvd25NZW51KCRmb250c2l6ZSwgcGFyc2VGbG9hdChzdHlsZUluZm9bJ2ZvbnQtc2l6ZSddKSk7XG5cblx0XHRcdC8vIGxpbmVoZWlnaHRcblx0XHRcdHZhciAkbGluZUhlaWdodCA9ICRjb250YWluZXIuZmluZCgnLm5vdGUtaGVpZ2h0Jyk7XG5cdFx0XHRjaGVja0Ryb3Bkb3duTWVudSgkbGluZUhlaWdodCwgcGFyc2VGbG9hdChzdHlsZUluZm9bJ2xpbmUtaGVpZ2h0J10pKTtcblxuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiYm9sZFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1snZm9udC1ib2xkJ10gPT09ICdib2xkJztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiaXRhbGljXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydmb250LWl0YWxpYyddID09PSAnaXRhbGljJztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwidW5kZXJsaW5lXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydmb250LXVuZGVybGluZSddID09PSAndW5kZXJsaW5lJztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwic3RyaWtldGhyb3VnaFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1snZm9udC1zdHJpa2V0aHJvdWdoJ10gPT09ICdzdHJpa2V0aHJvdWdoJztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwic3VwZXJzY3JpcHRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ2ZvbnQtc3VwZXJzY3JpcHQnXSA9PT0gJ3N1cGVyc2NyaXB0Jztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwic3Vic2NyaXB0XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydmb250LXN1YnNjcmlwdCddID09PSAnc3Vic2NyaXB0Jztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwianVzdGlmeUxlZnRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ3RleHQtYWxpZ24nXSA9PT0gJ2xlZnQnIHx8IHN0eWxlSW5mb1sndGV4dC1hbGlnbiddID09PSAnc3RhcnQnO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJqdXN0aWZ5Q2VudGVyXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWyd0ZXh0LWFsaWduJ10gPT09ICdjZW50ZXInO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJqdXN0aWZ5UmlnaHRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ3RleHQtYWxpZ24nXSA9PT0gJ3JpZ2h0Jztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwianVzdGlmeUZ1bGxcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ3RleHQtYWxpZ24nXSA9PT0gJ2p1c3RpZnknO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpbnNlcnRVbm9yZGVyZWRMaXN0XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydsaXN0LXN0eWxlJ10gPT09ICd1bm9yZGVyZWQnO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpbnNlcnRPcmRlcmVkTGlzdFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1snbGlzdC1zdHlsZSddID09PSAnb3JkZXJlZCc7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogdXBkYXRlIHJlY2VudCBjb2xvclxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBidXR0b25cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblx0XHR0aGlzLnVwZGF0ZVJlY2VudENvbG9yID0gZnVuY3Rpb24gKGJ1dHRvbiwgZXZlbnROYW1lLCB2YWx1ZSkge1xuXHRcdFx0dmFyICRjb2xvciA9ICQoYnV0dG9uKS5jbG9zZXN0KCcubm90ZS1jb2xvcicpO1xuXHRcdFx0dmFyICRyZWNlbnRDb2xvciA9ICRjb2xvci5maW5kKCcubm90ZS1yZWNlbnQtY29sb3InKTtcblx0XHRcdHZhciBjb2xvckluZm8gPSBKU09OLnBhcnNlKCRyZWNlbnRDb2xvci5hdHRyKCdkYXRhLXZhbHVlJykpO1xuXHRcdFx0Y29sb3JJbmZvW2V2ZW50TmFtZV0gPSB2YWx1ZTtcblx0XHRcdCRyZWNlbnRDb2xvci5hdHRyKCdkYXRhLXZhbHVlJywgSlNPTi5zdHJpbmdpZnkoY29sb3JJbmZvKSk7XG5cdFx0XHR2YXIgc0tleSA9IGV2ZW50TmFtZSA9PT0gJ2JhY2tDb2xvcicgPyAnYmFja2dyb3VuZC1jb2xvcicgOiAnY29sb3InO1xuXHRcdFx0JHJlY2VudENvbG9yLmZpbmQoJ2knKS5jc3Moc0tleSwgdmFsdWUpO1xuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBtb2R1bGUuVG9vbGJhclxuXHQgKlxuXHQgKiBUb29sYmFyXG5cdCAqL1xuXHR2YXIgVG9vbGJhciA9IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgYnV0dG9uID0gbmV3IEJ1dHRvbigpO1xuXG5cdFx0dGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoJHRvb2xiYXIsIHN0eWxlSW5mbykge1xuXHRcdFx0YnV0dG9uLnVwZGF0ZSgkdG9vbGJhciwgc3R5bGVJbmZvKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBidXR0b25cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGVSZWNlbnRDb2xvciA9IGZ1bmN0aW9uIChidXR0b25Ob2RlLCBldmVudE5hbWUsIHZhbHVlKSB7XG5cdFx0XHRidXR0b24udXBkYXRlUmVjZW50Q29sb3IoYnV0dG9uTm9kZSwgZXZlbnROYW1lLCB2YWx1ZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGFjdGl2YXRlIGJ1dHRvbnMgZXhjbHVkZSBjb2Rldmlld1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkdG9vbGJhclxuXHRcdCAqL1xuXHRcdHRoaXMuYWN0aXZhdGUgPSBmdW5jdGlvbiAoJHRvb2xiYXIpIHtcblx0XHRcdCR0b29sYmFyLmZpbmQoJ2J1dHRvbicpXG5cdFx0XHRcdFx0Lm5vdCgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJjb2Rldmlld1wiXScpXG5cdFx0XHRcdFx0LnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBkZWFjdGl2YXRlIGJ1dHRvbnMgZXhjbHVkZSBjb2Rldmlld1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkdG9vbGJhclxuXHRcdCAqL1xuXHRcdHRoaXMuZGVhY3RpdmF0ZSA9IGZ1bmN0aW9uICgkdG9vbGJhcikge1xuXHRcdFx0JHRvb2xiYXIuZmluZCgnYnV0dG9uJylcblx0XHRcdFx0XHQubm90KCdidXR0b25bZGF0YS1ldmVudD1cImNvZGV2aWV3XCJdJylcblx0XHRcdFx0XHQuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbYkZ1bGxzY3JlZW49ZmFsc2VdXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGVGdWxsc2NyZWVuID0gZnVuY3Rpb24gKCRjb250YWluZXIsIGJGdWxsc2NyZWVuKSB7XG5cdFx0XHR2YXIgJGJ0biA9ICRjb250YWluZXIuZmluZCgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJmdWxsc2NyZWVuXCJdJyk7XG5cdFx0XHQkYnRuLnRvZ2dsZUNsYXNzKCdhY3RpdmUnLCBiRnVsbHNjcmVlbik7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbaXNDb2Rldmlldz1mYWxzZV1cblx0XHQgKi9cblx0XHR0aGlzLnVwZGF0ZUNvZGV2aWV3ID0gZnVuY3Rpb24gKCRjb250YWluZXIsIGlzQ29kZXZpZXcpIHtcblx0XHRcdHZhciAkYnRuID0gJGNvbnRhaW5lci5maW5kKCdidXR0b25bZGF0YS1ldmVudD1cImNvZGV2aWV3XCJdJyk7XG5cdFx0XHQkYnRuLnRvZ2dsZUNsYXNzKCdhY3RpdmUnLCBpc0NvZGV2aWV3KTtcblxuXHRcdFx0aWYgKGlzQ29kZXZpZXcpIHtcblx0XHRcdFx0dGhpcy5kZWFjdGl2YXRlKCRjb250YWluZXIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5hY3RpdmF0ZSgkY29udGFpbmVyKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZ2V0IGJ1dHRvbiBpbiB0b29sYmFyIFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdFx0ICogQHJldHVybiB7alF1ZXJ5fVxuXHRcdCAqL1xuXHRcdHRoaXMuZ2V0ID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgbmFtZSkge1xuXHRcdFx0dmFyICR0b29sYmFyID0gZG9tLm1ha2VMYXlvdXRJbmZvKCRlZGl0YWJsZSkudG9vbGJhcigpO1xuXG5cdFx0XHRyZXR1cm4gJHRvb2xiYXIuZmluZCgnW2RhdGEtbmFtZT0nICsgbmFtZSArICddJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHNldCBidXR0b24gc3RhdGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtpc0FjdGl2ZT10cnVlXVxuXHRcdCAqL1xuXHRcdHRoaXMuc2V0QnV0dG9uU3RhdGUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBuYW1lLCBpc0FjdGl2ZSkge1xuXHRcdFx0aXNBY3RpdmUgPSAoaXNBY3RpdmUgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcblxuXHRcdFx0dmFyICRidXR0b24gPSB0aGlzLmdldCgkZWRpdGFibGUsIG5hbWUpO1xuXHRcdFx0JGJ1dHRvbi50b2dnbGVDbGFzcygnYWN0aXZlJywgaXNBY3RpdmUpO1xuXHRcdH07XG5cdH07XG5cblx0dmFyIEVESVRBQkxFX1BBRERJTkcgPSAyNDtcblxuXHR2YXIgU3RhdHVzYmFyID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciAkZG9jdW1lbnQgPSAkKGRvY3VtZW50KTtcblxuXHRcdHRoaXMuYXR0YWNoID0gZnVuY3Rpb24gKGxheW91dEluZm8sIG9wdGlvbnMpIHtcblx0XHRcdGlmICghb3B0aW9ucy5kaXNhYmxlUmVzaXplRWRpdG9yKSB7XG5cdFx0XHRcdGxheW91dEluZm8uc3RhdHVzYmFyKCkub24oJ21vdXNlZG93bicsIGhTdGF0dXNiYXJNb3VzZWRvd24pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBgbW91c2Vkb3duYCBldmVudCBoYW5kbGVyIG9uIHN0YXR1c2JhclxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuXHRcdCAqL1xuXHRcdHZhciBoU3RhdHVzYmFyTW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRcdHZhciAkZWRpdGFibGUgPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQudGFyZ2V0KS5lZGl0YWJsZSgpO1xuXHRcdFx0dmFyIGVkaXRhYmxlVG9wID0gJGVkaXRhYmxlLm9mZnNldCgpLnRvcCAtICRkb2N1bWVudC5zY3JvbGxUb3AoKTtcblxuXHRcdFx0dmFyIGxheW91dEluZm8gPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQuY3VycmVudFRhcmdldCB8fCBldmVudC50YXJnZXQpO1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBsYXlvdXRJbmZvLmVkaXRvcigpLmRhdGEoJ29wdGlvbnMnKTtcblxuXHRcdFx0JGRvY3VtZW50Lm9uKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0dmFyIG5IZWlnaHQgPSBldmVudC5jbGllbnRZIC0gKGVkaXRhYmxlVG9wICsgRURJVEFCTEVfUEFERElORyk7XG5cblx0XHRcdFx0bkhlaWdodCA9IChvcHRpb25zLm1pbkhlaWdodCA+IDApID8gTWF0aC5tYXgobkhlaWdodCwgb3B0aW9ucy5taW5IZWlnaHQpIDogbkhlaWdodDtcblx0XHRcdFx0bkhlaWdodCA9IChvcHRpb25zLm1heEhlaWdodCA+IDApID8gTWF0aC5taW4obkhlaWdodCwgb3B0aW9ucy5tYXhIZWlnaHQpIDogbkhlaWdodDtcblxuXHRcdFx0XHQkZWRpdGFibGUuaGVpZ2h0KG5IZWlnaHQpO1xuXHRcdFx0fSkub25lKCdtb3VzZXVwJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQkZG9jdW1lbnQub2ZmKCdtb3VzZW1vdmUnKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBtb2R1bGUuUG9wb3ZlclxuXHQgKlxuXHQgKiBQb3BvdmVyIChodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNwb3BvdmVycylcblx0ICpcblx0ICovXG5cdHZhciBQb3BvdmVyID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBidXR0b24gPSBuZXcgQnV0dG9uKCk7XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHBvc2l0aW9uIGZyb20gcGxhY2Vob2xkZXJcblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBwbGFjZWhvbGRlclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBaXJNb2RlXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqIEByZXR1cm4ge051bWJlcn0gcmV0dXJuLmxlZnRcblx0XHQgKiBAcmV0dXJuIHtOdW1iZXJ9IHJldHVybi50b3Bcblx0XHQgKi9cblx0XHR2YXIgcG9zRnJvbVBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBsYWNlaG9sZGVyLCBpc0Fpck1vZGUpIHtcblx0XHRcdHZhciAkcGxhY2Vob2xkZXIgPSAkKHBsYWNlaG9sZGVyKTtcblx0XHRcdHZhciBwb3MgPSBpc0Fpck1vZGUgPyAkcGxhY2Vob2xkZXIub2Zmc2V0KCkgOiAkcGxhY2Vob2xkZXIucG9zaXRpb24oKTtcblx0XHRcdHZhciBoZWlnaHQgPSAkcGxhY2Vob2xkZXIub3V0ZXJIZWlnaHQodHJ1ZSk7IC8vIGluY2x1ZGUgbWFyZ2luXG5cblx0XHRcdC8vIHBvcG92ZXIgYmVsb3cgcGxhY2Vob2xkZXIuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRsZWZ0OiBwb3MubGVmdCxcblx0XHRcdFx0dG9wOiBwb3MudG9wICsgaGVpZ2h0XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBzaG93IHBvcG92ZXJcblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9IHBvcG92ZXJcblx0XHQgKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3Ncblx0XHQgKi9cblx0XHR2YXIgc2hvd1BvcG92ZXIgPSBmdW5jdGlvbiAoJHBvcG92ZXIsIHBvcykge1xuXHRcdFx0JHBvcG92ZXIuY3NzKHtcblx0XHRcdFx0ZGlzcGxheTogJ2Jsb2NrJyxcblx0XHRcdFx0bGVmdDogcG9zLmxlZnQsXG5cdFx0XHRcdHRvcDogcG9zLnRvcFxuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdHZhciBQWF9QT1BPVkVSX0FSUk9XX09GRlNFVF9YID0gMjA7XG5cblx0XHQvKipcblx0XHQgKiB1cGRhdGUgY3VycmVudCBzdGF0ZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkcG9wb3ZlciAtIHBvcG92ZXIgY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHN0eWxlSW5mbyAtIHN0eWxlIG9iamVjdFxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBaXJNb2RlXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoJHBvcG92ZXIsIHN0eWxlSW5mbywgaXNBaXJNb2RlKSB7XG5cdFx0XHRidXR0b24udXBkYXRlKCRwb3BvdmVyLCBzdHlsZUluZm8pO1xuXG5cdFx0XHR2YXIgJGxpbmtQb3BvdmVyID0gJHBvcG92ZXIuZmluZCgnLm5vdGUtbGluay1wb3BvdmVyJyk7XG5cdFx0XHRpZiAoc3R5bGVJbmZvLmFuY2hvcikge1xuXHRcdFx0XHR2YXIgJGFuY2hvciA9ICRsaW5rUG9wb3Zlci5maW5kKCdhJyk7XG5cdFx0XHRcdHZhciBocmVmID0gJChzdHlsZUluZm8uYW5jaG9yKS5hdHRyKCdocmVmJyk7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSAkKHN0eWxlSW5mby5hbmNob3IpLmF0dHIoJ3RhcmdldCcpO1xuXHRcdFx0XHQkYW5jaG9yLmF0dHIoJ2hyZWYnLCBocmVmKS5odG1sKGhyZWYpO1xuXHRcdFx0XHRpZiAoIXRhcmdldCkge1xuXHRcdFx0XHRcdCRhbmNob3IucmVtb3ZlQXR0cigndGFyZ2V0Jyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JGFuY2hvci5hdHRyKCd0YXJnZXQnLCAnX2JsYW5rJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2hvd1BvcG92ZXIoJGxpbmtQb3BvdmVyLCBwb3NGcm9tUGxhY2Vob2xkZXIoc3R5bGVJbmZvLmFuY2hvciwgaXNBaXJNb2RlKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkbGlua1BvcG92ZXIuaGlkZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgJGltYWdlUG9wb3ZlciA9ICRwb3BvdmVyLmZpbmQoJy5ub3RlLWltYWdlLXBvcG92ZXInKTtcblx0XHRcdGlmIChzdHlsZUluZm8uaW1hZ2UpIHtcblx0XHRcdFx0c2hvd1BvcG92ZXIoJGltYWdlUG9wb3ZlciwgcG9zRnJvbVBsYWNlaG9sZGVyKHN0eWxlSW5mby5pbWFnZSwgaXNBaXJNb2RlKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkaW1hZ2VQb3BvdmVyLmhpZGUoKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyICRhaXJQb3BvdmVyID0gJHBvcG92ZXIuZmluZCgnLm5vdGUtYWlyLXBvcG92ZXInKTtcblx0XHRcdGlmIChpc0Fpck1vZGUgJiYgIXN0eWxlSW5mby5yYW5nZS5pc0NvbGxhcHNlZCgpKSB7XG5cdFx0XHRcdHZhciByZWN0ID0gbGlzdC5sYXN0KHN0eWxlSW5mby5yYW5nZS5nZXRDbGllbnRSZWN0cygpKTtcblx0XHRcdFx0aWYgKHJlY3QpIHtcblx0XHRcdFx0XHR2YXIgYm5kID0gZnVuYy5yZWN0MmJuZChyZWN0KTtcblx0XHRcdFx0XHRzaG93UG9wb3ZlcigkYWlyUG9wb3Zlciwge1xuXHRcdFx0XHRcdFx0bGVmdDogTWF0aC5tYXgoYm5kLmxlZnQgKyBibmQud2lkdGggLyAyIC0gUFhfUE9QT1ZFUl9BUlJPV19PRkZTRVRfWCwgMCksXG5cdFx0XHRcdFx0XHR0b3A6IGJuZC50b3AgKyBibmQuaGVpZ2h0XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCRhaXJQb3BvdmVyLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBidXR0b25cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGVSZWNlbnRDb2xvciA9IGZ1bmN0aW9uIChidXR0b24sIGV2ZW50TmFtZSwgdmFsdWUpIHtcblx0XHRcdGJ1dHRvbi51cGRhdGVSZWNlbnRDb2xvcihidXR0b24sIGV2ZW50TmFtZSwgdmFsdWUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBoaWRlIGFsbCBwb3BvdmVyc1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkcG9wb3ZlciAtIHBvcG92ZXIgY29udGFpbmVyXG5cdFx0ICovXG5cdFx0dGhpcy5oaWRlID0gZnVuY3Rpb24gKCRwb3BvdmVyKSB7XG5cdFx0XHQkcG9wb3Zlci5jaGlsZHJlbigpLmhpZGUoKTtcblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgbW9kdWxlLkhhbmRsZVxuXHQgKlxuXHQgKiBIYW5kbGVcblx0ICovXG5cdHZhciBIYW5kbGUgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuXHRcdHZhciAkZG9jdW1lbnQgPSAkKGRvY3VtZW50KTtcblxuXHRcdC8qKlxuXHRcdCAqIGBtb3VzZWRvd25gIGV2ZW50IGhhbmRsZXIgb24gJGhhbmRsZVxuXHRcdCAqICAtIGNvbnRyb2xTaXppbmc6IHJlc2l6ZSBpbWFnZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuXHRcdCAqL1xuXHRcdHZhciBoSGFuZGxlTW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRpZiAoZG9tLmlzQ29udHJvbFNpemluZyhldmVudC50YXJnZXQpKSB7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHRcdHZhciBsYXlvdXRJbmZvID0gZG9tLm1ha2VMYXlvdXRJbmZvKGV2ZW50LnRhcmdldCksXG5cdFx0XHRcdFx0JGhhbmRsZSA9IGxheW91dEluZm8uaGFuZGxlKCksXG5cdFx0XHRcdFx0JHBvcG92ZXIgPSBsYXlvdXRJbmZvLnBvcG92ZXIoKSxcblx0XHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCksXG5cdFx0XHRcdFx0JGVkaXRvciA9IGxheW91dEluZm8uZWRpdG9yKCk7XG5cblx0XHRcdFx0dmFyIHRhcmdldCA9ICRoYW5kbGUuZmluZCgnLm5vdGUtY29udHJvbC1zZWxlY3Rpb24nKS5kYXRhKCd0YXJnZXQnKSxcblx0XHRcdFx0XHQkdGFyZ2V0ID0gJCh0YXJnZXQpLCBwb3NTdGFydCA9ICR0YXJnZXQub2Zmc2V0KCksXG5cdFx0XHRcdFx0c2Nyb2xsVG9wID0gJGRvY3VtZW50LnNjcm9sbFRvcCgpO1xuXG5cdFx0XHRcdHZhciBpc0Fpck1vZGUgPSAkZWRpdG9yLmRhdGEoJ29wdGlvbnMnKS5haXJNb2RlO1xuXG5cdFx0XHRcdCRkb2N1bWVudC5vbignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXNpemVUbycsIHtcblx0XHRcdFx0XHRcdHg6IGV2ZW50LmNsaWVudFggLSBwb3NTdGFydC5sZWZ0LFxuXHRcdFx0XHRcdFx0eTogZXZlbnQuY2xpZW50WSAtIChwb3NTdGFydC50b3AgLSBzY3JvbGxUb3ApXG5cdFx0XHRcdFx0fSwgJHRhcmdldCwgIWV2ZW50LnNoaWZ0S2V5KTtcblxuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdoYW5kbGUudXBkYXRlJywgJGhhbmRsZSwgeyBpbWFnZTogdGFyZ2V0IH0sIGlzQWlyTW9kZSk7XG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ3BvcG92ZXIudXBkYXRlJywgJHBvcG92ZXIsIHsgaW1hZ2U6IHRhcmdldCB9LCBpc0Fpck1vZGUpO1xuXHRcdFx0XHR9KS5vbmUoJ21vdXNldXAnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0JGRvY3VtZW50Lm9mZignbW91c2Vtb3ZlJyk7XG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5hZnRlckNvbW1hbmQnLCAkZWRpdGFibGUpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoISR0YXJnZXQuZGF0YSgncmF0aW8nKSkgeyAvLyBvcmlnaW5hbCByYXRpby5cblx0XHRcdFx0XHQkdGFyZ2V0LmRhdGEoJ3JhdGlvJywgJHRhcmdldC5oZWlnaHQoKSAvICR0YXJnZXQud2lkdGgoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGhpcy5hdHRhY2ggPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0bGF5b3V0SW5mby5oYW5kbGUoKS5vbignbW91c2Vkb3duJywgaEhhbmRsZU1vdXNlZG93bik7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHVwZGF0ZSBoYW5kbGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGhhbmRsZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZUluZm9cblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzQWlyTW9kZVxuXHRcdCAqL1xuXHRcdHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCRoYW5kbGUsIHN0eWxlSW5mbywgaXNBaXJNb2RlKSB7XG5cdFx0XHR2YXIgJHNlbGVjdGlvbiA9ICRoYW5kbGUuZmluZCgnLm5vdGUtY29udHJvbC1zZWxlY3Rpb24nKTtcblx0XHRcdGlmIChzdHlsZUluZm8uaW1hZ2UpIHtcblx0XHRcdFx0dmFyICRpbWFnZSA9ICQoc3R5bGVJbmZvLmltYWdlKTtcblx0XHRcdFx0dmFyIHBvcyA9IGlzQWlyTW9kZSA/ICRpbWFnZS5vZmZzZXQoKSA6ICRpbWFnZS5wb3NpdGlvbigpO1xuXG5cdFx0XHRcdC8vIGluY2x1ZGUgbWFyZ2luXG5cdFx0XHRcdHZhciBpbWFnZVNpemUgPSB7XG5cdFx0XHRcdFx0dzogJGltYWdlLm91dGVyV2lkdGgodHJ1ZSksXG5cdFx0XHRcdFx0aDogJGltYWdlLm91dGVySGVpZ2h0KHRydWUpXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0JHNlbGVjdGlvbi5jc3Moe1xuXHRcdFx0XHRcdGRpc3BsYXk6ICdibG9jaycsXG5cdFx0XHRcdFx0bGVmdDogcG9zLmxlZnQsXG5cdFx0XHRcdFx0dG9wOiBwb3MudG9wLFxuXHRcdFx0XHRcdHdpZHRoOiBpbWFnZVNpemUudyxcblx0XHRcdFx0XHRoZWlnaHQ6IGltYWdlU2l6ZS5oXG5cdFx0XHRcdH0pLmRhdGEoJ3RhcmdldCcsIHN0eWxlSW5mby5pbWFnZSk7IC8vIHNhdmUgY3VycmVudCBpbWFnZSBlbGVtZW50LlxuXHRcdFx0XHR2YXIgc2l6aW5nVGV4dCA9IGltYWdlU2l6ZS53ICsgJ3gnICsgaW1hZ2VTaXplLmg7XG5cdFx0XHRcdCRzZWxlY3Rpb24uZmluZCgnLm5vdGUtY29udHJvbC1zZWxlY3Rpb24taW5mbycpLnRleHQoc2l6aW5nVGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkc2VsZWN0aW9uLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaGlkZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRoYW5kbGVcblx0XHQgKi9cblx0XHR0aGlzLmhpZGUgPSBmdW5jdGlvbiAoJGhhbmRsZSkge1xuXHRcdFx0JGhhbmRsZS5jaGlsZHJlbigpLmhpZGUoKTtcblx0XHR9O1xuXHR9O1xuXG5cdHZhciBGdWxsc2NyZWVuID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblx0XHR2YXIgJHdpbmRvdyA9ICQod2luZG93KTtcblx0XHR2YXIgJHNjcm9sbGJhciA9ICQoJ2h0bWwsIGJvZHknKTtcblxuXHRcdC8qKlxuXHRcdCAqIHRvZ2dsZSBmdWxsc2NyZWVuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqL1xuXHRcdHRoaXMudG9nZ2xlID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblxuXHRcdFx0dmFyICRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpLFxuXHRcdFx0XHQkdG9vbGJhciA9IGxheW91dEluZm8udG9vbGJhcigpLFxuXHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCksXG5cdFx0XHRcdCRjb2RhYmxlID0gbGF5b3V0SW5mby5jb2RhYmxlKCk7XG5cblx0XHRcdHZhciByZXNpemUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuXHRcdFx0XHQkZWRpdGFibGUuY3NzKCdoZWlnaHQnLCBzaXplLmgpO1xuXHRcdFx0XHQkY29kYWJsZS5jc3MoJ2hlaWdodCcsIHNpemUuaCk7XG5cdFx0XHRcdGlmICgkY29kYWJsZS5kYXRhKCdjbWVkaXRvcicpKSB7XG5cdFx0XHRcdFx0JGNvZGFibGUuZGF0YSgnY21lZGl0b3InKS5zZXRzaXplKG51bGwsIHNpemUuaCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdCRlZGl0b3IudG9nZ2xlQ2xhc3MoJ2Z1bGxzY3JlZW4nKTtcblx0XHRcdHZhciBpc0Z1bGxzY3JlZW4gPSAkZWRpdG9yLmhhc0NsYXNzKCdmdWxsc2NyZWVuJyk7XG5cdFx0XHRpZiAoaXNGdWxsc2NyZWVuKSB7XG5cdFx0XHRcdCRlZGl0YWJsZS5kYXRhKCdvcmdoZWlnaHQnLCAkZWRpdGFibGUuY3NzKCdoZWlnaHQnKSk7XG5cblx0XHRcdFx0JHdpbmRvdy5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJlc2l6ZSh7XG5cdFx0XHRcdFx0XHRoOiAkd2luZG93LmhlaWdodCgpIC0gJHRvb2xiYXIub3V0ZXJIZWlnaHQoKSAtIDE0MlxuXHRcdFx0XHR9KTtcblx0XHRcdFx0fSkudHJpZ2dlcigncmVzaXplJyk7XG5cblx0XHRcdFx0JHNjcm9sbGJhci5jc3MoJ292ZXJmbG93JywgJ2hpZGRlbicpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JHdpbmRvdy5vZmYoJ3Jlc2l6ZScpO1xuXHRcdFx0XHRyZXNpemUoe1xuXHRcdFx0XHRcdGg6ICRlZGl0YWJsZS5kYXRhKCdvcmdoZWlnaHQnKVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0JHNjcm9sbGJhci5jc3MoJ292ZXJmbG93JywgJ3Zpc2libGUnKTtcblx0XHRcdH1cblxuXHRcdFx0aGFuZGxlci5pbnZva2UoJ3Rvb2xiYXIudXBkYXRlRnVsbHNjcmVlbicsICR0b29sYmFyLCBpc0Z1bGxzY3JlZW4pO1xuXHRcdH07XG5cdH07XG5cblxuXHR2YXIgQ29kZU1pcnJvcjtcblx0aWYgKGFnZW50Lmhhc0NvZGVNaXJyb3IpIHtcblx0XHRpZiAoYWdlbnQuaXNTdXBwb3J0QW1kKSB7XG5cdFx0XHRfX2Jyb3dzZXJpZnlfc2hpbV9yZXF1aXJlX18oWydDb2RlTWlycm9yJ10sIGZ1bmN0aW9uIChjbSkge1xuXHRcdFx0XHRDb2RlTWlycm9yID0gY207XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29kZU1pcnJvciA9IHdpbmRvdy5Db2RlTWlycm9yO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAY2xhc3MgQ29kZXZpZXdcblx0ICovXG5cdHZhciBDb2RldmlldyA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG5cblx0XHR0aGlzLnN5bmMgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0dmFyIGlzQ29kZXZpZXcgPSBoYW5kbGVyLmludm9rZSgnY29kZXZpZXcuaXNBY3RpdmF0ZWQnLCBsYXlvdXRJbmZvKTtcblx0XHRcdGlmIChpc0NvZGV2aWV3ICYmIGFnZW50Lmhhc0NvZGVNaXJyb3IpIHtcblx0XHRcdFx0bGF5b3V0SW5mby5jb2RhYmxlKCkuZGF0YSgnY21FZGl0b3InKS5zYXZlKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR0aGlzLmlzQWN0aXZhdGVkID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdHZhciAkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKTtcblx0XHRcdHJldHVybiAkZWRpdG9yLmhhc0NsYXNzKCdjb2RldmlldycpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiB0b2dnbGUgY29kZXZpZXdcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy50b2dnbGUgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0aWYgKHRoaXMuaXNBY3RpdmF0ZWQobGF5b3V0SW5mbykpIHtcblx0XHRcdFx0dGhpcy5kZWFjdGl2YXRlKGxheW91dEluZm8pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5hY3RpdmF0ZShsYXlvdXRJbmZvKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYWN0aXZhdGUgY29kZSB2aWV3XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqL1xuXHRcdHRoaXMuYWN0aXZhdGUgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0dmFyICRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpLFxuXHRcdFx0XHQkdG9vbGJhciA9IGxheW91dEluZm8udG9vbGJhcigpLFxuXHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCksXG5cdFx0XHRcdCRjb2RhYmxlID0gbGF5b3V0SW5mby5jb2RhYmxlKCksXG5cdFx0XHRcdCRwb3BvdmVyID0gbGF5b3V0SW5mby5wb3BvdmVyKCksXG5cdFx0XHRcdCRoYW5kbGUgPSBsYXlvdXRJbmZvLmhhbmRsZSgpO1xuXG5cdFx0XHR2YXIgb3B0aW9ucyA9ICRlZGl0b3IuZGF0YSgnb3B0aW9ucycpO1xuXG5cdFx0XHQkY29kYWJsZS52YWwoZG9tLmh0bWwoJGVkaXRhYmxlLCBvcHRpb25zLnByZXR0aWZ5SHRtbCkpO1xuXG4gICAgICAgICAgICAvLyB1bmNvbW1lbnQgc2NyaXB0IHRhZ3Mgc28gdGhleSdyZSBjb3JyZWN0IGluIGNvZGUgdmlld1xuXHRcdFx0JGNvZGFibGUudmFsKCRjb2RhYmxlLnZhbCgpLnJlcGxhY2UoJzwhLS08c2NyaXB0JywgJzxzY3JpcHQnKSk7XHJcblx0XHRcdCRjb2RhYmxlLnZhbCgkY29kYWJsZS52YWwoKS5yZXBsYWNlKCc8L3NjcmlwdD4tLT4nLCAnPC9zY3JpcHQ+JykpO1xuXG5cdFx0XHQkY29kYWJsZS5oZWlnaHQoJGVkaXRhYmxlLmhlaWdodCgpKTtcblxuXHRcdFx0aGFuZGxlci5pbnZva2UoJ3Rvb2xiYXIudXBkYXRlQ29kZXZpZXcnLCAkdG9vbGJhciwgdHJ1ZSk7XG5cdFx0XHRoYW5kbGVyLmludm9rZSgncG9wb3Zlci5oaWRlJywgJHBvcG92ZXIpO1xuXHRcdFx0aGFuZGxlci5pbnZva2UoJ2hhbmRsZS5oaWRlJywgJGhhbmRsZSk7XG5cblx0XHRcdCRlZGl0b3IuYWRkQ2xhc3MoJ2NvZGV2aWV3Jyk7XG5cblx0XHRcdCRjb2RhYmxlLmZvY3VzKCk7XG5cblx0XHRcdC8vIGFjdGl2YXRlIENvZGVNaXJyb3IgYXMgY29kYWJsZVxuXHRcdFx0aWYgKGFnZW50Lmhhc0NvZGVNaXJyb3IpIHtcblx0XHRcdFx0dmFyIGNtRWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJGNvZGFibGVbMF0sIG9wdGlvbnMuY29kZW1pcnJvcik7XG5cblx0XHRcdFx0Ly8gQ29kZU1pcnJvciBUZXJuU2VydmVyXG5cdFx0XHRcdGlmIChvcHRpb25zLmNvZGVtaXJyb3IudGVybikge1xuXHRcdFx0XHRcdHZhciBzZXJ2ZXIgPSBuZXcgQ29kZU1pcnJvci5UZXJuU2VydmVyKG9wdGlvbnMuY29kZW1pcnJvci50ZXJuKTtcblx0XHRcdFx0XHRjbUVkaXRvci50ZXJuU2VydmVyID0gc2VydmVyO1xuXHRcdFx0XHRcdGNtRWRpdG9yLm9uKCdjdXJzb3JBY3Rpdml0eScsIGZ1bmN0aW9uIChjbSkge1xuXHRcdFx0XHRcdFx0c2VydmVyLnVwZGF0ZUFyZ0hpbnRzKGNtKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENvZGVNaXJyb3IgaGFzbid0IFBhZGRpbmcuXG5cdFx0XHRcdGNtRWRpdG9yLnNldFNpemUobnVsbCwgJGVkaXRhYmxlLm91dGVySGVpZ2h0KCkpO1xuXHRcdFx0XHQkY29kYWJsZS5kYXRhKCdjbUVkaXRvcicsIGNtRWRpdG9yKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZGVhY3RpdmF0ZSBjb2RlIHZpZXdcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy5kZWFjdGl2YXRlID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdHZhciAkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKSxcblx0XHRcdFx0JHRvb2xiYXIgPSBsYXlvdXRJbmZvLnRvb2xiYXIoKSxcblx0XHRcdFx0JGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpLFxuXHRcdFx0XHQkY29kYWJsZSA9IGxheW91dEluZm8uY29kYWJsZSgpO1xuXG5cdFx0XHR2YXIgb3B0aW9ucyA9ICRlZGl0b3IuZGF0YSgnb3B0aW9ucycpO1xuXG5cdFx0XHQvLyBkZWFjdGl2YXRlIENvZGVNaXJyb3IgYXMgY29kYWJsZVxuXHRcdFx0aWYgKGFnZW50Lmhhc0NvZGVNaXJyb3IpIHtcblx0XHRcdFx0dmFyIGNtRWRpdG9yID0gJGNvZGFibGUuZGF0YSgnY21FZGl0b3InKTtcblx0XHRcdFx0JGNvZGFibGUudmFsKGNtRWRpdG9yLmdldFZhbHVlKCkpO1xuXHRcdFx0XHRjbUVkaXRvci50b1RleHRBcmVhKCk7XG5cdFx0XHR9XG5cblx0XHRcdCRlZGl0YWJsZS5odG1sKGRvbS52YWx1ZSgkY29kYWJsZSwgb3B0aW9ucy5wcmV0dGlmeUh0bWwpIHx8IGRvbS5lbXB0eVBhcmEpO1xuXG5cdFx0ICAgIC8vIHJlcGxhY2Ugc2NyaXB0IHRhZ3Mgc28gdGhleSdyZSBub3QgZXhlY3V0ZWQgd2hlbiBsb2FkZWQgaW4gYWRtaW5cblx0XHRcdHZhciBjb2RlVG9SZXBsYWNlID0gJGVkaXRhYmxlLmh0bWwoKTtcclxuXHJcblx0XHRcdGNvZGVUb1JlcGxhY2UgPSBjb2RlVG9SZXBsYWNlLnJlcGxhY2UoJzxzY3JpcHQnLCAnPCEtLTxzY3JpcHQnKTtcclxuXHRcdFx0Y29kZVRvUmVwbGFjZSA9IGNvZGVUb1JlcGxhY2UucmVwbGFjZSgnPC9zY3JpcHQ+JywgJzwvc2NyaXB0Pi0tPicpO1xyXG5cclxuXHRcdFx0JGVkaXRhYmxlLmh0bWwoY29kZVRvUmVwbGFjZSk7XG5cblx0XHRcdCRlZGl0YWJsZS5oZWlnaHQob3B0aW9ucy5oZWlnaHQgPyAkY29kYWJsZS5oZWlnaHQoKSA6ICdhdXRvJyk7XG5cdFx0XHQkZWRpdG9yLnJlbW92ZUNsYXNzKCdjb2RldmlldycpO1xuXG5cdFx0XHQkZWRpdGFibGUuZm9jdXMoKTtcblxuXHRcdFx0aGFuZGxlci5pbnZva2UoJ3Rvb2xiYXIudXBkYXRlQ29kZXZpZXcnLCAkdG9vbGJhciwgZmFsc2UpO1xuXG4gICAgICAgICAgICB3aW5kb3cuc3RvcCgpO1xuXHRcdH07XG5cdH07XG5cblx0dmFyIERyYWdBbmREcm9wID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblx0XHR2YXIgJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XG5cblx0XHQvKipcblx0XHQgKiBhdHRhY2ggRHJhZyBhbmQgRHJvcCBFdmVudHNcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvIC0gbGF5b3V0IEluZm9ybWF0aW9uc1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICovXG5cdFx0dGhpcy5hdHRhY2ggPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgb3B0aW9ucykge1xuXHRcdFx0aWYgKG9wdGlvbnMuYWlyTW9kZSB8fCBvcHRpb25zLmRpc2FibGVEcmFnQW5kRHJvcCkge1xuXHRcdFx0XHQvLyBwcmV2ZW50IGRlZmF1bHQgZHJvcCBldmVudFxuXHRcdFx0XHQkZG9jdW1lbnQub24oJ2Ryb3AnLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmF0dGFjaERyYWdBbmREcm9wRXZlbnQobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGF0dGFjaCBEcmFnIGFuZCBEcm9wIEV2ZW50c1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm8gLSBsYXlvdXQgSW5mb3JtYXRpb25zXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzLmF0dGFjaERyYWdBbmREcm9wRXZlbnQgPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgb3B0aW9ucykge1xuXHRcdFx0dmFyIGNvbGxlY3Rpb24gPSAkKCksXG5cdFx0XHRcdCRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpLFxuXHRcdFx0XHQkZHJvcHpvbmUgPSBsYXlvdXRJbmZvLmRyb3B6b25lKCksXG5cdFx0XHRcdCRkcm9wem9uZU1lc3NhZ2UgPSAkZHJvcHpvbmUuZmluZCgnLm5vdGUtZHJvcHpvbmUtbWVzc2FnZScpO1xuXG5cdFx0XHQvLyBzaG93IGRyb3B6b25lIG9uIGRyYWdlbnRlciB3aGVuIGRyYWdnaW5nIGEgb2JqZWN0IHRvIGRvY3VtZW50XG5cdFx0XHQvLyAtYnV0IG9ubHkgaWYgdGhlIGVkaXRvciBpcyB2aXNpYmxlLCBpLmUuIGhhcyBhIHBvc2l0aXZlIHdpZHRoIGFuZCBoZWlnaHRcblx0XHRcdCRkb2N1bWVudC5vbignZHJhZ2VudGVyJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0dmFyIGlzQ29kZXZpZXcgPSBoYW5kbGVyLmludm9rZSgnY29kZXZpZXcuaXNBY3RpdmF0ZWQnLCBsYXlvdXRJbmZvKTtcblx0XHRcdFx0dmFyIGhhc0VkaXRvclNpemUgPSAkZWRpdG9yLndpZHRoKCkgPiAwICYmICRlZGl0b3IuaGVpZ2h0KCkgPiAwO1xuXHRcdFx0XHRpZiAoIWlzQ29kZXZpZXcgJiYgIWNvbGxlY3Rpb24ubGVuZ3RoICYmIGhhc0VkaXRvclNpemUpIHtcblx0XHRcdFx0XHQkZWRpdG9yLmFkZENsYXNzKCdkcmFnb3ZlcicpO1xuXHRcdFx0XHRcdCRkcm9wem9uZS53aWR0aCgkZWRpdG9yLndpZHRoKCkpO1xuXHRcdFx0XHRcdCRkcm9wem9uZS5oZWlnaHQoJGVkaXRvci5oZWlnaHQoKSk7XG5cdFx0XHRcdFx0JGRyb3B6b25lTWVzc2FnZS50ZXh0KG9wdGlvbnMubGFuZ0luZm8uaW1hZ2UuZHJhZ0ltYWdlSGVyZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29sbGVjdGlvbiA9IGNvbGxlY3Rpb24uYWRkKGUudGFyZ2V0KTtcblx0XHRcdH0pLm9uKCdkcmFnbGVhdmUnLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRjb2xsZWN0aW9uID0gY29sbGVjdGlvbi5ub3QoZS50YXJnZXQpO1xuXHRcdFx0XHRpZiAoIWNvbGxlY3Rpb24ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0JGVkaXRvci5yZW1vdmVDbGFzcygnZHJhZ292ZXInKTtcblx0XHRcdFx0fVxuXHRcdFx0fSkub24oJ2Ryb3AnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbGxlY3Rpb24gPSAkKCk7XG5cdFx0XHRcdCRlZGl0b3IucmVtb3ZlQ2xhc3MoJ2RyYWdvdmVyJyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gY2hhbmdlIGRyb3B6b25lJ3MgbWVzc2FnZSBvbiBob3Zlci5cblx0XHRcdCRkcm9wem9uZS5vbignZHJhZ2VudGVyJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQkZHJvcHpvbmUuYWRkQ2xhc3MoJ2hvdmVyJyk7XG5cdFx0XHRcdCRkcm9wem9uZU1lc3NhZ2UudGV4dChvcHRpb25zLmxhbmdJbmZvLmltYWdlLmRyb3BJbWFnZSk7XG5cdFx0XHR9KS5vbignZHJhZ2xlYXZlJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQkZHJvcHpvbmUucmVtb3ZlQ2xhc3MoJ2hvdmVyJyk7XG5cdFx0XHRcdCRkcm9wem9uZU1lc3NhZ2UudGV4dChvcHRpb25zLmxhbmdJbmZvLmltYWdlLmRyYWdJbWFnZUhlcmUpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIGF0dGFjaCBkcm9wSW1hZ2Vcblx0XHRcdCRkcm9wem9uZS5vbignZHJvcCcsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdHZhciBkYXRhVHJhbnNmZXIgPSBldmVudC5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlcjtcblx0XHRcdFx0dmFyIGh0bWwgPSBkYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dC9odG1sJyk7XG5cdFx0XHRcdHZhciB0ZXh0ID0gZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQvcGxhaW4nKTtcblxuXHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IGRvbS5tYWtlTGF5b3V0SW5mbyhldmVudC5jdXJyZW50VGFyZ2V0IHx8IGV2ZW50LnRhcmdldCk7XG5cblx0XHRcdFx0aWYgKGRhdGFUcmFuc2ZlciAmJiBkYXRhVHJhbnNmZXIuZmlsZXMgJiYgZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5mb2N1cygpO1xuXHRcdFx0XHRcdGhhbmRsZXIuaW5zZXJ0SW1hZ2VzKGxheW91dEluZm8sIGRhdGFUcmFuc2Zlci5maWxlcyk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaHRtbCkge1xuXHRcdFx0XHRcdCQoaHRtbCkuZWFjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkuZm9jdXMoKTtcblx0XHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuaW5zZXJ0Tm9kZScsIGxheW91dEluZm8uZWRpdGFibGUoKSwgdGhpcyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGV4dCkge1xuXHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5mb2N1cygpO1xuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuaW5zZXJ0VGV4dCcsIGxheW91dEluZm8uZWRpdGFibGUoKSwgdGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLm9uKCdkcmFnb3ZlcicsIGZhbHNlKTsgLy8gcHJldmVudCBkZWZhdWx0IGRyYWdvdmVyIGV2ZW50XG5cdFx0fTtcblx0fTtcblxuXHR2YXIgQ2xpcGJvYXJkID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblxuXHRcdHRoaXMuYXR0YWNoID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5vbigncGFzdGUnLCBoUGFzdGVDbGlwYm9hcmRJbWFnZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHBhc3RlIGNsaXBib2FyZCBpbWFnZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0XHQgKi9cblx0XHR2YXIgaFBhc3RlQ2xpcGJvYXJkSW1hZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdHZhciBjbGlwYm9hcmREYXRhID0gZXZlbnQub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhO1xuXHRcdFx0dmFyIGxheW91dEluZm8gPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQuY3VycmVudFRhcmdldCB8fCBldmVudC50YXJnZXQpO1xuXHRcdFx0dmFyICRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKTtcblxuXHRcdFx0aWYgKCFjbGlwYm9hcmREYXRhIHx8ICFjbGlwYm9hcmREYXRhLml0ZW1zIHx8ICFjbGlwYm9hcmREYXRhLml0ZW1zLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gJGVkaXRhYmxlLmRhdGEoJ2NhbGxiYWNrcycpO1xuXHRcdFx0XHQvLyBvbmx5IGNhbiBydW4gaWYgaXQgaGFzIG9uSW1hZ2VVcGxvYWQgbWV0aG9kXG5cdFx0XHRcdGlmICghY2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBzYXZlIGN1cnNvclxuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnNhdmVOb2RlJywgJGVkaXRhYmxlKTtcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5zYXZlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXG5cdFx0XHRcdCRlZGl0YWJsZS5odG1sKCcnKTtcblxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgJGltZyA9ICRlZGl0YWJsZS5maW5kKCdpbWcnKTtcblxuXHRcdFx0XHRcdC8vIGlmIGltZyBpcyBubyBpbiBjbGlwYm9hcmQsIGluc2VydCB0ZXh0IG9yIGRvbVxuXHRcdFx0XHRcdGlmICghJGltZy5sZW5ndGggfHwgJGltZ1swXS5zcmMuaW5kZXhPZignZGF0YTonKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdHZhciBodG1sID0gJGVkaXRhYmxlLmh0bWwoKTtcblxuXHRcdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlTm9kZScsICRlZGl0YWJsZSk7XG5cdFx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVSYW5nZScsICRlZGl0YWJsZSk7XG5cblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluc2VydCBub3JtYWwgZG9tIGNvZGVcblx0XHRcdFx0XHRcdFx0JChodG1sKS5lYWNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHQkZWRpdGFibGUuZm9jdXMoKTtcblx0XHRcdFx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmluc2VydE5vZGUnLCAkZWRpdGFibGUsIHRoaXMpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGV4KSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluc2VydCB0ZXh0XG5cdFx0XHRcdFx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXHRcdFx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmluc2VydFRleHQnLCAkZWRpdGFibGUsIGh0bWwpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBkYXRhdXJpID0gJGltZ1swXS5zcmM7XG5cblx0XHRcdFx0XHR2YXIgZGF0YSA9IGF0b2IoZGF0YXVyaS5zcGxpdCgnLCcpWzFdKTtcblx0XHRcdFx0XHR2YXIgYXJyYXkgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCk7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRhcnJheVtpXSA9IGRhdGEuY2hhckNvZGVBdChpKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgYmxvYiA9IG5ldyBCbG9iKFthcnJheV0sIHsgdHlwZTogJ2ltYWdlL3BuZycgfSk7XG5cdFx0XHRcdFx0YmxvYi5uYW1lID0gJ2NsaXBib2FyZC5wbmcnO1xuXG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlTm9kZScsICRlZGl0YWJsZSk7XG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXHRcdFx0XHRcdGhhbmRsZXIuaW5zZXJ0SW1hZ2VzKGxheW91dEluZm8sIFtibG9iXSk7XG5cblx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmFmdGVyQ29tbWFuZCcsICRlZGl0YWJsZSk7XG5cdFx0XHRcdH0sIDApO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGl0ZW0gPSBsaXN0LmhlYWQoY2xpcGJvYXJkRGF0YS5pdGVtcyk7XG5cdFx0XHR2YXIgaXNDbGlwYm9hcmRJbWFnZSA9IGl0ZW0ua2luZCA9PT0gJ2ZpbGUnICYmIGl0ZW0udHlwZS5pbmRleE9mKCdpbWFnZS8nKSAhPT0gLTE7XG5cblx0XHRcdGlmIChpc0NsaXBib2FyZEltYWdlKSB7XG5cdFx0XHRcdGhhbmRsZXIuaW5zZXJ0SW1hZ2VzKGxheW91dEluZm8sIFtpdGVtLmdldEFzRmlsZSgpXSk7XG5cdFx0XHR9XG5cblx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuYWZ0ZXJDb21tYW5kJywgJGVkaXRhYmxlKTtcblx0XHR9O1xuXHR9O1xuXG5cdHZhciBMaW5rRGlhbG9nID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblxuXHRcdC8qKlxuXHRcdCAqIHRvZ2dsZSBidXR0b24gc3RhdHVzXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkYnRuXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc0VuYWJsZVxuXHRcdCAqL1xuXHRcdHZhciB0b2dnbGVCdG4gPSBmdW5jdGlvbiAoJGJ0biwgaXNFbmFibGUpIHtcblx0XHRcdCRidG4udG9nZ2xlQ2xhc3MoJ2Rpc2FibGVkJywgIWlzRW5hYmxlKTtcblx0XHRcdCRidG4uYXR0cignZGlzYWJsZWQnLCAhaXNFbmFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBTaG93IGxpbmsgZGlhbG9nIGFuZCBzZXQgZXZlbnQgaGFuZGxlcnMgb24gZGlhbG9nIGNvbnRyb2xzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZGlhbG9nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxpbmtJbmZvXG5cdFx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0XHQgKi9cblx0XHR0aGlzLnNob3dMaW5rRGlhbG9nID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgJGRpYWxvZywgbGlua0luZm8pIHtcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKGZ1bmN0aW9uIChkZWZlcnJlZCkge1xuXHRcdFx0XHR2YXIgJGxpbmtEaWFsb2cgPSAkZGlhbG9nLmZpbmQoJy5ub3RlLWxpbmstZGlhbG9nJyk7XG5cblx0XHRcdFx0dmFyICRsaW5rVGV4dCA9ICRsaW5rRGlhbG9nLmZpbmQoJy5ub3RlLWxpbmstdGV4dCcpLFxuXHRcdFx0XHQkbGlua1VybCA9ICRsaW5rRGlhbG9nLmZpbmQoJy5ub3RlLWxpbmstdXJsJyksXG5cdFx0XHRcdCRsaW5rQnRuID0gJGxpbmtEaWFsb2cuZmluZCgnLm5vdGUtbGluay1idG4nKSxcblx0XHRcdFx0JG9wZW5Jbk5ld1dpbmRvdyA9ICRsaW5rRGlhbG9nLmZpbmQoJ2lucHV0W3R5cGU9Y2hlY2tib3hdJyk7XG5cblx0XHRcdFx0JGxpbmtEaWFsb2cub25lKCdzaG93bi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQkbGlua1RleHQudmFsKGxpbmtJbmZvLnRleHQpO1xuXG5cdFx0XHRcdFx0JGxpbmtUZXh0Lm9uKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdC8vIGlmIGxpbmt0ZXh0IHdhcyBtb2RpZmllZCBieSBrZXl1cCxcblx0XHRcdFx0XHRcdC8vIHN0b3AgY2xvbmluZyB0ZXh0IGZyb20gbGlua1VybFxuXHRcdFx0XHRcdFx0bGlua0luZm8udGV4dCA9ICRsaW5rVGV4dC52YWwoKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdC8vIGlmIG5vIHVybCB3YXMgZ2l2ZW4sIGNvcHkgdGV4dCB0byB1cmxcblx0XHRcdFx0XHRpZiAoIWxpbmtJbmZvLnVybCkge1xuXHRcdFx0XHRcdFx0bGlua0luZm8udXJsID0gbGlua0luZm8udGV4dDtcblx0XHRcdFx0XHRcdHRvZ2dsZUJ0bigkbGlua0J0biwgbGlua0luZm8udGV4dCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0JGxpbmtVcmwub24oJ2lucHV0JywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dG9nZ2xlQnRuKCRsaW5rQnRuLCAkbGlua1VybC52YWwoKSk7XG5cdFx0XHRcdFx0XHQvLyBkaXNwbGF5IHNhbWUgbGluayBvbiBgVGV4dCB0byBkaXNwbGF5YCBpbnB1dFxuXHRcdFx0XHRcdFx0Ly8gd2hlbiBjcmVhdGUgYSBuZXcgbGlua1xuXHRcdFx0XHRcdFx0aWYgKCFsaW5rSW5mby50ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdCRsaW5rVGV4dC52YWwoJGxpbmtVcmwudmFsKCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLnZhbChsaW5rSW5mby51cmwpLnRyaWdnZXIoJ2ZvY3VzJykudHJpZ2dlcignc2VsZWN0Jyk7XG5cblx0XHRcdFx0XHQkb3BlbkluTmV3V2luZG93LnByb3AoJ2NoZWNrZWQnLCBsaW5rSW5mby5uZXdXaW5kb3cpO1xuXG5cdFx0XHRcdFx0JGxpbmtCdG4ub25lKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZSh7XG5cdFx0XHRcdFx0XHRcdHJhbmdlOiBsaW5rSW5mby5yYW5nZSxcblx0XHRcdFx0XHRcdFx0dXJsOiAkbGlua1VybC52YWwoKSxcblx0XHRcdFx0XHRcdFx0dGV4dDogJGxpbmtUZXh0LnZhbCgpLFxuXHRcdFx0XHRcdFx0XHRuZXdXaW5kb3c6ICRvcGVuSW5OZXdXaW5kb3cuaXMoJzpjaGVja2VkJylcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0JGxpbmtEaWFsb2cubW9kYWwoJ2hpZGUnKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSkub25lKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gZGV0YWNoIGV2ZW50c1xuXHRcdFx0XHRcdCRsaW5rVGV4dC5vZmYoJ2lucHV0Jyk7XG5cdFx0XHRcdFx0JGxpbmtVcmwub2ZmKCdpbnB1dCcpO1xuXHRcdFx0XHRcdCRsaW5rQnRuLm9mZignY2xpY2snKTtcblxuXHRcdFx0XHRcdGlmIChkZWZlcnJlZC5zdGF0ZSgpID09PSAncGVuZGluZycpIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkubW9kYWwoJ3Nob3cnKTtcblx0XHRcdH0pLnByb21pc2UoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHQgKi9cblx0XHR0aGlzLnNob3cgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0dmFyICRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpLFxuXHRcdFx0XHQkZGlhbG9nID0gbGF5b3V0SW5mby5kaWFsb2coKSxcblx0XHRcdFx0JGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpLFxuXHRcdFx0XHQkcG9wb3ZlciA9IGxheW91dEluZm8ucG9wb3ZlcigpLFxuXHRcdFx0XHRsaW5rSW5mbyA9IGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuZ2V0TGlua0luZm8nLCAkZWRpdGFibGUpO1xuXG5cdFx0XHR2YXIgb3B0aW9ucyA9ICRlZGl0b3IuZGF0YSgnb3B0aW9ucycpO1xuXG5cdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnNhdmVSYW5nZScsICRlZGl0YWJsZSk7XG5cdFx0XHR0aGlzLnNob3dMaW5rRGlhbG9nKCRlZGl0YWJsZSwgJGRpYWxvZywgbGlua0luZm8pLnRoZW4oZnVuY3Rpb24gKGxpbmtJbmZvKSB7XG5cdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IucmVzdG9yZVJhbmdlJywgJGVkaXRhYmxlKTtcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5jcmVhdGVMaW5rJywgJGVkaXRhYmxlLCBsaW5rSW5mbywgb3B0aW9ucyk7XG5cdFx0XHRcdC8vIGhpZGUgcG9wb3ZlciBhZnRlciBjcmVhdGluZyBsaW5rXG5cdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdwb3BvdmVyLmhpZGUnLCAkcG9wb3Zlcik7XG5cdFx0XHR9KS5mYWlsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0fTtcblxuXHR2YXIgSW1hZ2VEaWFsb2cgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuXHRcdC8qKlxuXHRcdCAqIHRvZ2dsZSBidXR0b24gc3RhdHVzXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkYnRuXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc0VuYWJsZVxuXHRcdCAqL1xuXHRcdHZhciB0b2dnbGVCdG4gPSBmdW5jdGlvbiAoJGJ0biwgaXNFbmFibGUpIHtcblx0XHRcdCRidG4udG9nZ2xlQ2xhc3MoJ2Rpc2FibGVkJywgIWlzRW5hYmxlKTtcblx0XHRcdCRidG4uYXR0cignZGlzYWJsZWQnLCAhaXNFbmFibGUpO1xuXHRcdH07XG5cblx0XHR0aGlzLnNob3cgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0dmFyICRkaWFsb2cgPSBsYXlvdXRJbmZvLmRpYWxvZygpLFxuXHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cblx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3Iuc2F2ZVJhbmdlJywgJGVkaXRhYmxlKTtcblx0XHRcdHRoaXMuc2hvd0ltYWdlRGlhbG9nKCRlZGl0YWJsZSwgJGRpYWxvZykudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVSYW5nZScsICRlZGl0YWJsZSk7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdC8vIGltYWdlIHVybFxuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuaW5zZXJ0SW1hZ2UnLCAkZWRpdGFibGUsIGRhdGEpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFycmF5IG9mIGZpbGVzXG5cdFx0XHRcdFx0aGFuZGxlci5pbnNlcnRJbWFnZXMobGF5b3V0SW5mbywgZGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVSYW5nZScsICRlZGl0YWJsZSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogc2hvdyBpbWFnZSBkaWFsb2dcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGRpYWxvZ1xuXHRcdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0dGhpcy5zaG93SW1hZ2VEaWFsb2cgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCAkZGlhbG9nKSB7XG5cdFx0XHRyZXR1cm4gJC5EZWZlcnJlZChmdW5jdGlvbiAoZGVmZXJyZWQpIHtcblx0XHRcdFx0dmFyICRpbWFnZURpYWxvZyA9ICRkaWFsb2cuZmluZCgnLm5vdGUtaW1hZ2UtZGlhbG9nJyk7XG5cblx0XHRcdFx0dmFyICRpbWFnZUlucHV0ID0gJGRpYWxvZy5maW5kKCcubm90ZS1pbWFnZS1pbnB1dCcpLFxuXHRcdFx0XHRcdCRpbWFnZVVybCA9ICRkaWFsb2cuZmluZCgnLm5vdGUtaW1hZ2UtdXJsJyksXG5cdFx0XHRcdFx0JGltYWdlQnRuID0gJGRpYWxvZy5maW5kKCcubm90ZS1pbWFnZS1idG4nKTtcblxuXHRcdFx0XHQkaW1hZ2VEaWFsb2cub25lKCdzaG93bi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBDbG9uaW5nIGltYWdlSW5wdXQgdG8gY2xlYXIgZWxlbWVudC5cblx0XHRcdFx0XHQkaW1hZ2VJbnB1dC5yZXBsYWNlV2l0aCgkaW1hZ2VJbnB1dC5jbG9uZSgpXG5cdFx0XHRcdFx0ICAub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQgIFx0ZGVmZXJyZWQucmVzb2x2ZSh0aGlzLmZpbGVzIHx8IHRoaXMudmFsdWUpO1xuXHRcdFx0XHRcdCAgXHQkaW1hZ2VEaWFsb2cubW9kYWwoJ2hpZGUnKTtcblx0XHRcdFx0XHQgIH0pXG5cdFx0XHRcdFx0ICAudmFsKCcnKVxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHQkaW1hZ2VCdG4uY2xpY2soZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKCRpbWFnZVVybC52YWwoKSk7XG5cdFx0XHRcdFx0XHQkaW1hZ2VEaWFsb2cubW9kYWwoJ2hpZGUnKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdCRpbWFnZVVybC5vbigna2V5dXAgcGFzdGUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0XHRcdHZhciB1cmw7XG5cblx0XHRcdFx0XHRcdGlmIChldmVudC50eXBlID09PSAncGFzdGUnKSB7XG5cdFx0XHRcdFx0XHRcdHVybCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR1cmwgPSAkaW1hZ2VVcmwudmFsKCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHRvZ2dsZUJ0bigkaW1hZ2VCdG4sIHVybCk7XG5cdFx0XHRcdFx0fSkudmFsKCcnKS50cmlnZ2VyKCdmb2N1cycpO1xuXHRcdFx0XHR9KS5vbmUoJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQkaW1hZ2VJbnB1dC5vZmYoJ2NoYW5nZScpO1xuXHRcdFx0XHRcdCRpbWFnZVVybC5vZmYoJ2tleXVwIHBhc3RlJyk7XG5cdFx0XHRcdFx0JGltYWdlQnRuLm9mZignY2xpY2snKTtcblxuXHRcdFx0XHRcdGlmIChkZWZlcnJlZC5zdGF0ZSgpID09PSAncGVuZGluZycpIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkubW9kYWwoJ3Nob3cnKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cdH07XG5cblx0dmFyIEhlbHBEaWFsb2cgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuXHRcdC8qKlxuXHRcdCAqIHNob3cgaGVscCBkaWFsb2dcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGRpYWxvZ1xuXHRcdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0dGhpcy5zaG93SGVscERpYWxvZyA9IGZ1bmN0aW9uICgkZWRpdGFibGUsICRkaWFsb2cpIHtcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKGZ1bmN0aW9uIChkZWZlcnJlZCkge1xuXHRcdFx0XHR2YXIgJGhlbHBEaWFsb2cgPSAkZGlhbG9nLmZpbmQoJy5ub3RlLWhlbHAtZGlhbG9nJyk7XG5cblx0XHRcdFx0JGhlbHBEaWFsb2cub25lKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZSgpO1xuXHRcdFx0XHR9KS5tb2RhbCgnc2hvdycpO1xuXHRcdFx0fSkucHJvbWlzZSgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqL1xuXHRcdHRoaXMuc2hvdyA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHR2YXIgJGRpYWxvZyA9IGxheW91dEluZm8uZGlhbG9nKCksXG5cdFx0XHRcdCRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKTtcblxuXHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5zYXZlUmFuZ2UnLCAkZWRpdGFibGUsIHRydWUpO1xuXHRcdFx0dGhpcy5zaG93SGVscERpYWxvZygkZWRpdGFibGUsICRkaWFsb2cpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVSYW5nZScsICRlZGl0YWJsZSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIEBjbGFzcyBFdmVudEhhbmRsZXJcblx0ICpcblx0ICogRXZlbnRIYW5kbGVyXG5cdCAqICAtIFRPRE86IG5ldyBpbnN0YW5jZSBwZXIgYSBlZGl0b3Jcblx0ICogIC0gVE9ETzogcmVuYW1lIEV2ZW50SGFuZGxlclxuXHQgKi9cblx0dmFyIEV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcblx0XHQvKipcblx0XHQgKiBNb2R1bGVzXG5cdFx0ICovXG5cdFx0dmFyIG1vZHVsZXMgPSB0aGlzLm1vZHVsZXMgPSB7XG5cdFx0XHRlZGl0b3I6IG5ldyBFZGl0b3IodGhpcyksXG5cdFx0XHR0b29sYmFyOiBuZXcgVG9vbGJhcih0aGlzKSxcblx0XHRcdHN0YXR1c2JhcjogbmV3IFN0YXR1c2Jhcih0aGlzKSxcblx0XHRcdHBvcG92ZXI6IG5ldyBQb3BvdmVyKHRoaXMpLFxuXHRcdFx0aGFuZGxlOiBuZXcgSGFuZGxlKHRoaXMpLFxuXHRcdFx0ZnVsbHNjcmVlbjogbmV3IEZ1bGxzY3JlZW4odGhpcyksXG5cdFx0XHRjb2RldmlldzogbmV3IENvZGV2aWV3KHRoaXMpLFxuXHRcdFx0ZHJhZ0FuZERyb3A6IG5ldyBEcmFnQW5kRHJvcCh0aGlzKSxcblx0XHRcdGNsaXBib2FyZDogbmV3IENsaXBib2FyZCh0aGlzKSxcblx0XHRcdGxpbmtEaWFsb2c6IG5ldyBMaW5rRGlhbG9nKHRoaXMpLFxuXHRcdFx0aW1hZ2VEaWFsb2c6IG5ldyBJbWFnZURpYWxvZyh0aGlzKSxcblx0XHRcdGhlbHBEaWFsb2c6IG5ldyBIZWxwRGlhbG9nKHRoaXMpXG5cdFx0fTtcblxuXHRcdC8vIFRPRE8gcmVmYWN0b3IgbW9kdWxlcyBhbmQgZXZlbnRIYW5kbGVyXG5cdFx0Ly8gIC0gcmVtb3ZlIHRoaXMgbWV0aG9kIGFuZCB1c2UgY3VzdG9tIGV2ZW50IGZyb20gJGhvbGRlciBpbnN0ZWFkXG5cdFx0dGhpcy5pbnZva2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgbW9kdWxlQW5kTWV0aG9kID0gbGlzdC5oZWFkKGxpc3QuZnJvbShhcmd1bWVudHMpKTtcblx0XHRcdHZhciBhcmdzID0gbGlzdC50YWlsKGxpc3QuZnJvbShhcmd1bWVudHMpKTtcblxuXHRcdFx0dmFyIHNwbGl0cyA9IG1vZHVsZUFuZE1ldGhvZC5zcGxpdCgnLicpO1xuXHRcdFx0dmFyIGhhc1NlcGFyYXRvciA9IHNwbGl0cy5sZW5ndGggPiAxO1xuXHRcdFx0dmFyIG1vZHVsZU5hbWUgPSBoYXNTZXBhcmF0b3IgJiYgbGlzdC5oZWFkKHNwbGl0cyk7XG5cdFx0XHR2YXIgbWV0aG9kTmFtZSA9IGhhc1NlcGFyYXRvciA/IGxpc3QubGFzdChzcGxpdHMpIDogbGlzdC5oZWFkKHNwbGl0cyk7XG5cblx0XHRcdHZhciBtb2R1bGUgPSB0aGlzLmdldE1vZHVsZShtb2R1bGVOYW1lKTtcblx0XHRcdHZhciBtZXRob2QgPSBtb2R1bGVbbWV0aG9kTmFtZV07XG5cblx0XHRcdHJldHVybiBtZXRob2QgJiYgbWV0aG9kLmFwcGx5KG1vZHVsZSwgYXJncyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgbW9kdWxlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlTmFtZSAtIG5hbWUgb2YgbW9kdWxlXG5cdFx0ICogQHJldHVybiB7TW9kdWxlfSAtIGRlZmF1bHRzIGlzIGVkaXRvclxuXHRcdCAqL1xuXHRcdHRoaXMuZ2V0TW9kdWxlID0gZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHtcblx0XHRcdHJldHVybiB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV0gfHwgdGhpcy5tb2R1bGVzLmVkaXRvcjtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaW5zZXJ0IEltYWdlcyBmcm9tIGZpbGUgYXJyYXkuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICogQHBhcmFtIHtGaWxlW119IGZpbGVzXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRJbWFnZXMgPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgZmlsZXMpIHtcblx0XHRcdHZhciAkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKSxcblx0XHRcdFx0JGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpLFxuXHRcdFx0XHQkaG9sZGVyID0gbGF5b3V0SW5mby5ob2xkZXIoKTtcblxuXHRcdFx0dmFyIGNhbGxiYWNrcyA9ICRlZGl0YWJsZS5kYXRhKCdjYWxsYmFja3MnKTtcblx0XHRcdHZhciBvcHRpb25zID0gJGVkaXRvci5kYXRhKCdvcHRpb25zJyk7XG5cblx0XHRcdC8vIElmIG9uSW1hZ2VVcGxvYWQgb3B0aW9ucyBzZXR0ZWRcblx0XHRcdGlmIChjYWxsYmFja3Mub25JbWFnZVVwbG9hZCkge1xuXHRcdFx0XHRjYWxsYmFja3Mub25JbWFnZVVwbG9hZChmaWxlcywgbW9kdWxlcy5lZGl0b3IsICRlZGl0YWJsZSk7XG5cdFx0XHRcdGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnaW1hZ2UudXBsb2FkJykoW2ZpbGVzXSk7XG5cdFx0XHRcdC8vIGVsc2UgaW5zZXJ0IEltYWdlIGFzIGRhdGFVUkxcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGlkeCwgZmlsZSkge1xuXHRcdFx0XHRcdHZhciBmaWxlbmFtZSA9IGZpbGUubmFtZTtcblx0XHRcdFx0XHRpZiAob3B0aW9ucy5tYXhpbXVtSW1hZ2VGaWxlU2l6ZSAmJiBvcHRpb25zLm1heGltdW1JbWFnZUZpbGVTaXplIDwgZmlsZS5zaXplKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWRFcnJvcikge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFja3Mub25JbWFnZVVwbG9hZEVycm9yKG9wdGlvbnMubGFuZ0luZm8uaW1hZ2UubWF4aW11bUZpbGVTaXplRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2ltYWdlLnVwbG9hZC5lcnJvcicpKG9wdGlvbnMubGFuZ0luZm8uaW1hZ2UubWF4aW11bUZpbGVTaXplRXJyb3IpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YWxlcnQob3B0aW9ucy5sYW5nSW5mby5pbWFnZS5tYXhpbXVtRmlsZVNpemVFcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFzeW5jLnJlYWRGaWxlQXNEYXRhVVJMKGZpbGUpLnRoZW4oZnVuY3Rpb24gKHNEYXRhVVJMKSB7XG5cdFx0XHRcdFx0XHRcdG1vZHVsZXMuZWRpdG9yLmluc2VydEltYWdlKCRlZGl0YWJsZSwgc0RhdGFVUkwsIGZpbGVuYW1lKTtcblx0XHRcdFx0XHRcdH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoY2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWRFcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdGNhbGxiYWNrcy5vbkltYWdlVXBsb2FkRXJyb3IoKTtcblx0XHRcdFx0XHRcdFx0XHRiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2ltYWdlLnVwbG9hZC5lcnJvcicpKG9wdGlvbnMubGFuZ0luZm8uaW1hZ2UubWF4aW11bUZpbGVTaXplRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgY29tbWFuZHMgPSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0XHQgKi9cblx0XHRcdHNob3dMaW5rRGlhbG9nOiBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0XHRtb2R1bGVzLmxpbmtEaWFsb2cuc2hvdyhsYXlvdXRJbmZvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHRcdCAqL1xuXHRcdFx0c2hvd0ltYWdlRGlhbG9nOiBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0XHRtb2R1bGVzLmltYWdlRGlhbG9nLnNob3cobGF5b3V0SW5mbyk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0XHQgKi9cblx0XHRcdHNob3dIZWxwRGlhbG9nOiBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0XHRtb2R1bGVzLmhlbHBEaWFsb2cuc2hvdyhsYXlvdXRJbmZvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHRcdCAqL1xuXHRcdFx0ZnVsbHNjcmVlbjogZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdFx0bW9kdWxlcy5mdWxsc2NyZWVuLnRvZ2dsZShsYXlvdXRJbmZvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHRcdCAqL1xuXHRcdFx0Y29kZXZpZXc6IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHRcdG1vZHVsZXMuY29kZXZpZXcudG9nZ2xlKGxheW91dEluZm8pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgaE1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0Ly9wcmV2ZW50RGVmYXVsdCBTZWxlY3Rpb24gZm9yIEZGLCBJRTgrXG5cdFx0XHRpZiAoZG9tLmlzSW1nKGV2ZW50LnRhcmdldCkpIHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmFyIGhUb29sYmFyQW5kUG9wb3ZlclVwZGF0ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0Ly8gZGVsYXkgZm9yIHJhbmdlIGFmdGVyIG1vdXNldXBcblx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IGRvbS5tYWtlTGF5b3V0SW5mbyhldmVudC5jdXJyZW50VGFyZ2V0IHx8IGV2ZW50LnRhcmdldCk7XG5cdFx0XHRcdHZhciBzdHlsZUluZm8gPSBtb2R1bGVzLmVkaXRvci5jdXJyZW50U3R5bGUoZXZlbnQudGFyZ2V0KTtcblx0XHRcdFx0aWYgKCFzdHlsZUluZm8pIHsgcmV0dXJuOyB9XG5cblx0XHRcdFx0dmFyIGlzQWlyTW9kZSA9IGxheW91dEluZm8uZWRpdG9yKCkuZGF0YSgnb3B0aW9ucycpLmFpck1vZGU7XG5cdFx0XHRcdGlmICghaXNBaXJNb2RlKSB7XG5cdFx0XHRcdFx0bW9kdWxlcy50b29sYmFyLnVwZGF0ZShsYXlvdXRJbmZvLnRvb2xiYXIoKSwgc3R5bGVJbmZvKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG1vZHVsZXMucG9wb3Zlci51cGRhdGUobGF5b3V0SW5mby5wb3BvdmVyKCksIHN0eWxlSW5mbywgaXNBaXJNb2RlKTtcblx0XHRcdFx0bW9kdWxlcy5oYW5kbGUudXBkYXRlKGxheW91dEluZm8uaGFuZGxlKCksIHN0eWxlSW5mbywgaXNBaXJNb2RlKTtcblx0XHRcdH0sIDApO1xuXHRcdH07XG5cblx0XHR2YXIgaFNjcm9sbCA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0dmFyIGxheW91dEluZm8gPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQuY3VycmVudFRhcmdldCB8fCBldmVudC50YXJnZXQpO1xuXHRcdFx0Ly9oaWRlIHBvcG92ZXIgYW5kIGhhbmRsZSB3aGVuIHNjcm9sbGVkXG5cdFx0XHRtb2R1bGVzLnBvcG92ZXIuaGlkZShsYXlvdXRJbmZvLnBvcG92ZXIoKSk7XG5cdFx0XHRtb2R1bGVzLmhhbmRsZS5oaWRlKGxheW91dEluZm8uaGFuZGxlKCkpO1xuXHRcdH07XG5cblx0XHR2YXIgaFRvb2xiYXJBbmRQb3BvdmVyTW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHQvLyBwcmV2ZW50IGRlZmF1bHQgZXZlbnQgd2hlbiBpbnNlcnRUYWJsZSAoRkYsIFdlYmtpdClcblx0XHRcdHZhciAkYnRuID0gJChldmVudC50YXJnZXQpLmNsb3Nlc3QoJ1tkYXRhLWV2ZW50XScpO1xuXHRcdFx0aWYgKCRidG4ubGVuZ3RoKSB7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBoVG9vbGJhckFuZFBvcG92ZXJDbGljayA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0dmFyICRidG4gPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnW2RhdGEtZXZlbnRdJyk7XG5cblx0XHRcdGlmICgkYnRuLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgZXZlbnROYW1lID0gJGJ0bi5hdHRyKCdkYXRhLWV2ZW50JyksXG5cdFx0XHRcdFx0dmFsdWUgPSAkYnRuLmF0dHIoJ2RhdGEtdmFsdWUnKSxcblx0XHRcdFx0XHRoaWRlID0gJGJ0bi5hdHRyKCdkYXRhLWhpZGUnKTtcblxuXHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IGRvbS5tYWtlTGF5b3V0SW5mbyhldmVudC50YXJnZXQpO1xuXG5cdFx0XHRcdC8vIGJlZm9yZSBjb21tYW5kOiBkZXRlY3QgY29udHJvbCBzZWxlY3Rpb24gZWxlbWVudCgkdGFyZ2V0KVxuXHRcdFx0XHR2YXIgJHRhcmdldDtcblx0XHRcdFx0aWYgKCQuaW5BcnJheShldmVudE5hbWUsIFsncmVzaXplJywgJ2Zsb2F0TWUnLCAncmVtb3ZlTWVkaWEnLCAnaW1hZ2VTaGFwZSddKSAhPT0gLTEpIHtcblx0XHRcdFx0XHR2YXIgJHNlbGVjdGlvbiA9IGxheW91dEluZm8uaGFuZGxlKCkuZmluZCgnLm5vdGUtY29udHJvbC1zZWxlY3Rpb24nKTtcblx0XHRcdFx0XHQkdGFyZ2V0ID0gJCgkc2VsZWN0aW9uLmRhdGEoJ3RhcmdldCcpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHJlcXVlc3RlZCwgaGlkZSB0aGUgcG9wb3ZlciB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC5cblx0XHRcdFx0Ly8gVXNlZnVsIGZvciB0aGluZ3MgbGlrZSBzaG93SGVscERpYWxvZy5cblx0XHRcdFx0aWYgKGhpZGUpIHtcblx0XHRcdFx0XHQkYnRuLnBhcmVudHMoJy5wb3BvdmVyJykuaGlkZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCQuaXNGdW5jdGlvbigkLnN1bW1lcm5vdGUucGx1Z2luRXZlbnRzW2V2ZW50TmFtZV0pKSB7XG5cdFx0XHRcdFx0JC5zdW1tZXJub3RlLnBsdWdpbkV2ZW50c1tldmVudE5hbWVdKGV2ZW50LCBtb2R1bGVzLmVkaXRvciwgbGF5b3V0SW5mbywgdmFsdWUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG1vZHVsZXMuZWRpdG9yW2V2ZW50TmFtZV0pIHsgLy8gb24gY29tbWFuZFxuXHRcdFx0XHRcdHZhciAkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cdFx0XHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cdFx0XHRcdFx0bW9kdWxlcy5lZGl0b3JbZXZlbnROYW1lXSgkZWRpdGFibGUsIHZhbHVlLCAkdGFyZ2V0KTtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbW1hbmRzW2V2ZW50TmFtZV0pIHtcblx0XHRcdFx0XHRjb21tYW5kc1tldmVudE5hbWVdLmNhbGwodGhpcywgbGF5b3V0SW5mbyk7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGFmdGVyIGNvbW1hbmRcblx0XHRcdFx0aWYgKCQuaW5BcnJheShldmVudE5hbWUsIFsnYmFja0NvbG9yJywgJ2ZvcmVDb2xvciddKSAhPT0gLTEpIHtcblx0XHRcdFx0XHR2YXIgb3B0aW9ucyA9IGxheW91dEluZm8uZWRpdG9yKCkuZGF0YSgnb3B0aW9ucycsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdHZhciBtb2R1bGUgPSBvcHRpb25zLmFpck1vZGUgPyBtb2R1bGVzLnBvcG92ZXIgOiBtb2R1bGVzLnRvb2xiYXI7XG5cdFx0XHRcdFx0bW9kdWxlLnVwZGF0ZVJlY2VudENvbG9yKGxpc3QuaGVhZCgkYnRuKSwgZXZlbnROYW1lLCB2YWx1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRoVG9vbGJhckFuZFBvcG92ZXJVcGRhdGUoZXZlbnQpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgUFhfUEVSX0VNID0gMTg7XG5cdFx0dmFyIGhEaW1lbnNpb25QaWNrZXJNb3ZlID0gZnVuY3Rpb24gKGV2ZW50LCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgJHBpY2tlciA9ICQoZXZlbnQudGFyZ2V0LnBhcmVudE5vZGUpOyAvLyB0YXJnZXQgaXMgbW91c2VjYXRjaGVyXG5cdFx0XHR2YXIgJGRpbWVuc2lvbkRpc3BsYXkgPSAkcGlja2VyLm5leHQoKTtcblx0XHRcdHZhciAkY2F0Y2hlciA9ICRwaWNrZXIuZmluZCgnLm5vdGUtZGltZW5zaW9uLXBpY2tlci1tb3VzZWNhdGNoZXInKTtcblx0XHRcdHZhciAkaGlnaGxpZ2h0ZWQgPSAkcGlja2VyLmZpbmQoJy5ub3RlLWRpbWVuc2lvbi1waWNrZXItaGlnaGxpZ2h0ZWQnKTtcblx0XHRcdHZhciAkdW5oaWdobGlnaHRlZCA9ICRwaWNrZXIuZmluZCgnLm5vdGUtZGltZW5zaW9uLXBpY2tlci11bmhpZ2hsaWdodGVkJyk7XG5cblx0XHRcdHZhciBwb3NPZmZzZXQ7XG5cdFx0XHQvLyBIVE1MNSB3aXRoIGpRdWVyeSAtIGUub2Zmc2V0WCBpcyB1bmRlZmluZWQgaW4gRmlyZWZveFxuXHRcdFx0aWYgKGV2ZW50Lm9mZnNldFggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR2YXIgcG9zQ2F0Y2hlciA9ICQoZXZlbnQudGFyZ2V0KS5vZmZzZXQoKTtcblx0XHRcdFx0cG9zT2Zmc2V0ID0ge1xuXHRcdFx0XHRcdHg6IGV2ZW50LnBhZ2VYIC0gcG9zQ2F0Y2hlci5sZWZ0LFxuXHRcdFx0XHRcdHk6IGV2ZW50LnBhZ2VZIC0gcG9zQ2F0Y2hlci50b3Bcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBvc09mZnNldCA9IHtcblx0XHRcdFx0XHR4OiBldmVudC5vZmZzZXRYLFxuXHRcdFx0XHRcdHk6IGV2ZW50Lm9mZnNldFlcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGRpbSA9IHtcblx0XHRcdFx0YzogTWF0aC5jZWlsKHBvc09mZnNldC54IC8gUFhfUEVSX0VNKSB8fCAxLFxuXHRcdFx0XHRyOiBNYXRoLmNlaWwocG9zT2Zmc2V0LnkgLyBQWF9QRVJfRU0pIHx8IDFcblx0XHRcdH07XG5cblx0XHRcdCRoaWdobGlnaHRlZC5jc3MoeyB3aWR0aDogZGltLmMgKyAnZW0nLCBoZWlnaHQ6IGRpbS5yICsgJ2VtJyB9KTtcblx0XHRcdCRjYXRjaGVyLmF0dHIoJ2RhdGEtdmFsdWUnLCBkaW0uYyArICd4JyArIGRpbS5yKTtcblxuXHRcdFx0aWYgKDMgPCBkaW0uYyAmJiBkaW0uYyA8IG9wdGlvbnMuaW5zZXJ0VGFibGVNYXhTaXplLmNvbCkge1xuXHRcdFx0XHQkdW5oaWdobGlnaHRlZC5jc3MoeyB3aWR0aDogZGltLmMgKyAxICsgJ2VtJyB9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKDMgPCBkaW0uciAmJiBkaW0uciA8IG9wdGlvbnMuaW5zZXJ0VGFibGVNYXhTaXplLnJvdykge1xuXHRcdFx0XHQkdW5oaWdobGlnaHRlZC5jc3MoeyBoZWlnaHQ6IGRpbS5yICsgMSArICdlbScgfSk7XG5cdFx0XHR9XG5cblx0XHRcdCRkaW1lbnNpb25EaXNwbGF5Lmh0bWwoZGltLmMgKyAnIHggJyArIGRpbS5yKTtcblx0XHR9O1xuXG5cdFx0dmFyIGJpbmRDdXN0b21FdmVudCA9IGZ1bmN0aW9uICgkaG9sZGVyLCBldmVudE5hbWUpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiAkaG9sZGVyLnRyaWdnZXIoJ3N1bW1lcm5vdGUuJyArIGV2ZW50TmFtZSwgYXJndW1lbnRzKTtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGJpbmQgS2V5TWFwIG9uIGtleWRvd25cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGtleU1hcFxuXHRcdCAqL1xuXHRcdHRoaXMuYmluZEtleU1hcCA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvLCBrZXlNYXApIHtcblx0XHRcdHZhciAkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKTtcblx0XHRcdHZhciAkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cblx0XHRcdCRlZGl0YWJsZS5vbigna2V5ZG93bicsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHR2YXIga2V5cyA9IFtdO1xuXG5cdFx0XHRcdC8vIG1vZGlmaWVyXG5cdFx0XHRcdGlmIChldmVudC5tZXRhS2V5KSB7IGtleXMucHVzaCgnQ01EJyk7IH1cblx0XHRcdFx0aWYgKGV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSkgeyBrZXlzLnB1c2goJ0NUUkwnKTsgfVxuXHRcdFx0XHRpZiAoZXZlbnQuc2hpZnRLZXkpIHsga2V5cy5wdXNoKCdTSElGVCcpOyB9XG5cblx0XHRcdFx0Ly8ga2V5Y29kZVxuXHRcdFx0XHR2YXIga2V5TmFtZSA9IGtleS5uYW1lRnJvbUNvZGVbZXZlbnQua2V5Q29kZV07XG5cdFx0XHRcdGlmIChrZXlOYW1lKSB7XG5cdFx0XHRcdFx0a2V5cy5wdXNoKGtleU5hbWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGV2ZW50TmFtZSA9IGtleU1hcFtrZXlzLmpvaW4oJysnKV07XG5cdFx0XHRcdGlmIChldmVudE5hbWUpIHtcblx0XHRcdFx0XHRpZiAoJC5zdW1tZXJub3RlLnBsdWdpbkV2ZW50c1tldmVudE5hbWVdKSB7XG5cdFx0XHRcdFx0XHR2YXIgcGx1Z2luID0gJC5zdW1tZXJub3RlLnBsdWdpbkV2ZW50c1tldmVudE5hbWVdO1xuXHRcdFx0XHRcdFx0aWYgKCQuaXNGdW5jdGlvbihwbHVnaW4pKSB7XG5cdFx0XHRcdFx0XHRcdHBsdWdpbihldmVudCwgbW9kdWxlcy5lZGl0b3IsIGxheW91dEluZm8pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAobW9kdWxlcy5lZGl0b3JbZXZlbnROYW1lXSkge1xuXHRcdFx0XHRcdFx0bW9kdWxlcy5lZGl0b3JbZXZlbnROYW1lXSgkZWRpdGFibGUsICRlZGl0b3IuZGF0YSgnb3B0aW9ucycpKTtcblx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChjb21tYW5kc1tldmVudE5hbWVdKSB7XG5cdFx0XHRcdFx0XHRjb21tYW5kc1tldmVudE5hbWVdLmNhbGwodGhpcywgbGF5b3V0SW5mbyk7XG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChrZXkuaXNFZGl0KGV2ZW50LmtleUNvZGUpKSB7XG5cdFx0XHRcdFx0bW9kdWxlcy5lZGl0b3IuYWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBhdHRhY2ggZXZlbnRoYW5kbGVyXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mbyAtIGxheW91dCBJbmZvcm1hdGlvbnNcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIHVzZXIgb3B0aW9ucyBpbmNsdWRlIGN1c3RvbSBldmVudCBoYW5kbGVyc1xuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQpfSBbb3B0aW9ucy5vbmVudGVyXSAtIGVudGVyIGtleSBoYW5kbGVyXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihldmVudCl9IFtvcHRpb25zLm9uZm9jdXNdXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihldmVudCl9IFtvcHRpb25zLm9uYmx1cl1cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50KX0gW29wdGlvbnMub25rZXl1cF1cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50KX0gW29wdGlvbnMub25rZXlkb3duXVxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQpfSBbb3B0aW9ucy5vbnBhc3RlXVxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQpfSBbb3B0aW9ucy5vblRvb2xCYXJjbGlja11cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50KX0gW29wdGlvbnMub25DaGFuZ2VdXG5cdFx0ICovXG5cdFx0dGhpcy5hdHRhY2ggPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgb3B0aW9ucykge1xuXHRcdFx0Ly8gaGFuZGxlcnMgZm9yIGVkaXRhYmxlXG5cdFx0XHRpZiAob3B0aW9ucy5zaG9ydGN1dHMpIHtcblx0XHRcdFx0dGhpcy5iaW5kS2V5TWFwKGxheW91dEluZm8sIG9wdGlvbnMua2V5TWFwW2FnZW50LmlzTWFjID8gJ21hYycgOiAncGMnXSk7XG5cdFx0XHR9XG5cdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkub24oJ21vdXNlZG93bicsIGhNb3VzZWRvd24pO1xuXHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLm9uKCdrZXl1cCBtb3VzZXVwJywgaFRvb2xiYXJBbmRQb3BvdmVyVXBkYXRlKTtcblx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5vbignc2Nyb2xsJywgaFNjcm9sbCk7XG5cdFx0XHRtb2R1bGVzLmNsaXBib2FyZC5hdHRhY2gobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cblx0XHRcdC8vIGhhbmRsZXIgZm9yIGhhbmRsZSBhbmQgcG9wb3ZlclxuXHRcdFx0bW9kdWxlcy5oYW5kbGUuYXR0YWNoKGxheW91dEluZm8sIG9wdGlvbnMpO1xuXHRcdFx0bGF5b3V0SW5mby5wb3BvdmVyKCkub24oJ2NsaWNrJywgaFRvb2xiYXJBbmRQb3BvdmVyQ2xpY2spO1xuXHRcdFx0bGF5b3V0SW5mby5wb3BvdmVyKCkub24oJ21vdXNlZG93bicsIGhUb29sYmFyQW5kUG9wb3Zlck1vdXNlZG93bik7XG5cblx0XHRcdC8vIGhhbmRsZXIgZm9yIGRyYWcgYW5kIGRyb3Bcblx0XHRcdG1vZHVsZXMuZHJhZ0FuZERyb3AuYXR0YWNoKGxheW91dEluZm8sIG9wdGlvbnMpO1xuXG5cdFx0XHQvLyBoYW5kbGVycyBmb3IgZnJhbWUgbW9kZSAodG9vbGJhciwgc3RhdHVzYmFyKVxuXHRcdFx0aWYgKCFvcHRpb25zLmFpck1vZGUpIHtcblx0XHRcdFx0Ly8gaGFuZGxlciBmb3IgdG9vbGJhclxuXHRcdFx0XHRsYXlvdXRJbmZvLnRvb2xiYXIoKS5vbignY2xpY2snLCBoVG9vbGJhckFuZFBvcG92ZXJDbGljayk7XG5cdFx0XHRcdGxheW91dEluZm8udG9vbGJhcigpLm9uKCdtb3VzZWRvd24nLCBoVG9vbGJhckFuZFBvcG92ZXJNb3VzZWRvd24pO1xuXG5cdFx0XHRcdC8vIGhhbmRsZXIgZm9yIHN0YXR1c2JhclxuXHRcdFx0XHRtb2R1bGVzLnN0YXR1c2Jhci5hdHRhY2gobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGhhbmRsZXIgZm9yIHRhYmxlIGRpbWVuc2lvblxuXHRcdFx0dmFyICRjYXRjaGVyQ29udGFpbmVyID0gb3B0aW9ucy5haXJNb2RlID8gbGF5b3V0SW5mby5wb3BvdmVyKCkgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIGxheW91dEluZm8udG9vbGJhcigpO1xuXHRcdFx0dmFyICRjYXRjaGVyID0gJGNhdGNoZXJDb250YWluZXIuZmluZCgnLm5vdGUtZGltZW5zaW9uLXBpY2tlci1tb3VzZWNhdGNoZXInKTtcblx0XHRcdCRjYXRjaGVyLmNzcyh7XG5cdFx0XHRcdHdpZHRoOiBvcHRpb25zLmluc2VydFRhYmxlTWF4U2l6ZS5jb2wgKyAnZW0nLFxuXHRcdFx0XHRoZWlnaHQ6IG9wdGlvbnMuaW5zZXJ0VGFibGVNYXhTaXplLnJvdyArICdlbSdcblx0XHRcdH0pLm9uKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0aERpbWVuc2lvblBpY2tlck1vdmUoZXZlbnQsIG9wdGlvbnMpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIHNhdmUgb3B0aW9ucyBvbiBlZGl0b3Jcblx0XHRcdGxheW91dEluZm8uZWRpdG9yKCkuZGF0YSgnb3B0aW9ucycsIG9wdGlvbnMpO1xuXG5cdFx0XHQvLyByZXQgc3R5bGVXaXRoQ1NTIGZvciBiYWNrQ29sb3IgLyBmb3JlQ29sb3IgY2xlYXJpbmcgd2l0aCAnaW5oZXJpdCcuXG5cdFx0XHRpZiAoIWFnZW50LmlzTVNJRSkge1xuXHRcdFx0XHQvLyBwcm90ZWN0IEZGIEVycm9yOiBOU19FUlJPUl9GQUlMVVJFOiBGYWlsdXJlXG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKCdzdHlsZVdpdGhDU1MnLCAwLCBvcHRpb25zLnN0eWxlV2l0aFNwYW4pO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSGlzdG9yeVxuXHRcdFx0dmFyIGhpc3RvcnkgPSBuZXcgSGlzdG9yeShsYXlvdXRJbmZvLmVkaXRhYmxlKCkpO1xuXHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLmRhdGEoJ05vdGVIaXN0b3J5JywgaGlzdG9yeSk7XG5cblx0XHRcdC8vIGJhc2ljIGV2ZW50IGNhbGxiYWNrcyAobG93ZXJjYXNlKVxuXHRcdFx0Ly8gZW50ZXIsIGZvY3VzLCBibHVyLCBrZXl1cCwga2V5ZG93blxuXHRcdFx0aWYgKG9wdGlvbnMub25lbnRlcikge1xuXHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkua2V5cHJlc3MoZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdFx0aWYgKGV2ZW50LmtleUNvZGUgPT09IGtleS5FTlRFUikgeyBvcHRpb25zLm9uZW50ZXIoZXZlbnQpOyB9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0aW9ucy5vbmZvY3VzKSB7IGxheW91dEluZm8uZWRpdGFibGUoKS5mb2N1cyhvcHRpb25zLm9uZm9jdXMpOyB9XG5cdFx0XHRpZiAob3B0aW9ucy5vbmJsdXIpIHsgbGF5b3V0SW5mby5lZGl0YWJsZSgpLmJsdXIob3B0aW9ucy5vbmJsdXIpOyB9XG5cdFx0XHRpZiAob3B0aW9ucy5vbmtleXVwKSB7IGxheW91dEluZm8uZWRpdGFibGUoKS5rZXl1cChvcHRpb25zLm9ua2V5dXApOyB9XG5cdFx0XHRpZiAob3B0aW9ucy5vbmtleWRvd24pIHsgbGF5b3V0SW5mby5lZGl0YWJsZSgpLmtleWRvd24ob3B0aW9ucy5vbmtleWRvd24pOyB9XG5cdFx0XHRpZiAob3B0aW9ucy5vbnBhc3RlKSB7IGxheW91dEluZm8uZWRpdGFibGUoKS5vbigncGFzdGUnLCBvcHRpb25zLm9ucGFzdGUpOyB9XG5cblx0XHRcdC8vIGNhbGxiYWNrcyBmb3IgYWR2YW5jZWQgZmVhdHVyZXMgKGNhbWVsKVxuXG5cdFx0XHQvLyBvblRvb2xiYXJDbGlja1xuXHRcdFx0aWYgKG9wdGlvbnMub25Ub29sYmFyQ2xpY2spIHtcblx0XHRcdFx0bGF5b3V0SW5mby50b29sYmFyKCkuY2xpY2sob3B0aW9ucy5vblRvb2xiYXJDbGljayk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIG9uQ2hhbmdlXG5cdFx0XHRpZiAob3B0aW9ucy5vbkNoYW5nZSkge1xuXHRcdFx0XHR2YXIgaENoYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRtb2R1bGVzLmVkaXRvci50cmlnZ2VyT25DaGFuZ2UobGF5b3V0SW5mby5lZGl0YWJsZSgpKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAoYWdlbnQuaXNNU0lFKSB7XG5cdFx0XHRcdFx0dmFyIHNEb21FdmVudHMgPSAnRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkIERPTVN1YnRyZWVNb2RpZmllZCBET01Ob2RlSW5zZXJ0ZWQnO1xuXHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5vbihzRG9tRXZlbnRzLCBoQ2hhbmdlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkub24oJ2lucHV0JywgaENoYW5nZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWxsIGVkaXRvciBzdGF0dXMgd2lsbCBiZSBzYXZlZCBvbiBlZGl0YWJsZSB3aXRoIGpxdWVyeSdzIGRhdGFcblx0XHRcdC8vIGZvciBzdXBwb3J0IG11bHRpcGxlIGVkaXRvciB3aXRoIHNpbmdsZXRvbiBvYmplY3QuXG5cdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkuZGF0YSgnY2FsbGJhY2tzJywge1xuXHRcdFx0XHRvbkJlZm9yZUNoYW5nZTogb3B0aW9ucy5vbkJlZm9yZUNoYW5nZSxcblx0XHRcdFx0b25DaGFuZ2U6IG9wdGlvbnMub25DaGFuZ2UsXG5cdFx0XHRcdG9uQXV0b1NhdmU6IG9wdGlvbnMub25BdXRvU2F2ZSxcblx0XHRcdFx0b25JbWFnZVVwbG9hZDogb3B0aW9ucy5vbkltYWdlVXBsb2FkLFxuXHRcdFx0XHRvbkltYWdlVXBsb2FkRXJyb3I6IG9wdGlvbnMub25JbWFnZVVwbG9hZEVycm9yLFxuXHRcdFx0XHRvbkZpbGVVcGxvYWQ6IG9wdGlvbnMub25GaWxlVXBsb2FkLFxuXHRcdFx0XHRvbkZpbGVVcGxvYWRFcnJvcjogb3B0aW9ucy5vbkZpbGVVcGxvYWQsXG5cdFx0XHRcdG9uTWVkaWFEZWxldGU6IG9wdGlvbnMub25NZWRpYURlbGV0ZVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIFRleHRhcmVhOiBhdXRvIGZpbGxpbmcgdGhlIGNvZGUgYmVmb3JlIGZvcm0gc3VibWl0LlxuXHRcdFx0aWYgKGRvbS5pc1RleHRhcmVhKGxpc3QuaGVhZChsYXlvdXRJbmZvLmhvbGRlcigpKSkpIHtcblx0XHRcdFx0bGF5b3V0SW5mby5ob2xkZXIoKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgY29udGVudHMgPSBsYXlvdXRJbmZvLmhvbGRlcigpLmNvZGUoKTtcblx0XHRcdFx0XHRsYXlvdXRJbmZvLmhvbGRlcigpLnZhbChjb250ZW50cyk7XG5cblx0XHRcdFx0XHQvLyBjYWxsYmFjayBvbiBzdWJtaXRcblx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbnN1Ym1pdCkge1xuXHRcdFx0XHRcdFx0b3B0aW9ucy5vbnN1Ym1pdChjb250ZW50cyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYXR0YWNoIGpxdWVyeSBjdXN0b20gZXZlbnRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvIC0gbGF5b3V0IEluZm9ybWF0aW9uc1xuXHRcdCAqL1xuXHRcdHRoaXMuYXR0YWNoQ3VzdG9tRXZlbnQgPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgb3B0aW9ucykge1xuXHRcdFx0dmFyICRob2xkZXIgPSBsYXlvdXRJbmZvLmhvbGRlcigpO1xuXHRcdFx0dmFyICRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKTtcblxuXHRcdFx0JGVkaXRhYmxlLm9uKCdtb3VzZWRvd24nLCBiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ21vdXNlZG93bicpKTtcblx0XHRcdCRlZGl0YWJsZS5vbigna2V5dXAgbW91c2V1cCcsIGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAndXBkYXRlJykpO1xuXHRcdFx0JGVkaXRhYmxlLm9uKCdzY3JvbGwnLCBiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ3Njcm9sbCcpKTtcblxuXHRcdFx0Ly8gYmFzaWMgZXZlbnQgY2FsbGJhY2tzIChsb3dlcmNhc2UpXG5cdFx0XHQvLyBlbnRlciwgZm9jdXMsIGJsdXIsIGtleXVwLCBrZXlkb3duXG5cdFx0XHQkZWRpdGFibGUua2V5cHJlc3MoZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdGlmIChldmVudC5rZXlDb2RlID09PSBrZXkuRU5URVIpIHtcblx0XHRcdFx0XHRiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2VudGVyJykuY2FsbCh0aGlzLCBldmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHQkZWRpdGFibGUuZm9jdXMoYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdmb2N1cycpKTtcblx0XHRcdCRlZGl0YWJsZS5ibHVyKGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnYmx1cicpKTtcblx0XHRcdCRlZGl0YWJsZS5rZXl1cChiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2tleXVwJykpO1xuXHRcdFx0JGVkaXRhYmxlLmtleWRvd24oYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdrZXlkb3duJykpO1xuXHRcdFx0JGVkaXRhYmxlLm9uKCdwYXN0ZScsIGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAncGFzdGUnKSk7XG5cblx0XHRcdC8vIGNhbGxiYWNrcyBmb3IgYWR2YW5jZWQgZmVhdHVyZXMgKGNhbWVsKVxuXHRcdFx0aWYgKCFvcHRpb25zLmFpck1vZGUpIHtcblx0XHRcdFx0bGF5b3V0SW5mby50b29sYmFyKCkuY2xpY2soYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICd0b29sYmFyLmNsaWNrJykpO1xuXHRcdFx0XHRsYXlvdXRJbmZvLnBvcG92ZXIoKS5jbGljayhiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ3BvcG92ZXIuY2xpY2snKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhZ2VudC5pc01TSUUpIHtcblx0XHRcdFx0dmFyIHNEb21FdmVudHMgPSAnRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkIERPTVN1YnRyZWVNb2RpZmllZCBET01Ob2RlSW5zZXJ0ZWQnO1xuXHRcdFx0XHQkZWRpdGFibGUub24oc0RvbUV2ZW50cywgYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdjaGFuZ2UnKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkZWRpdGFibGUub24oJ2lucHV0JywgYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdjaGFuZ2UnKSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRleHRhcmVhOiBhdXRvIGZpbGxpbmcgdGhlIGNvZGUgYmVmb3JlIGZvcm0gc3VibWl0LlxuXHRcdFx0aWYgKGRvbS5pc1RleHRhcmVhKGxpc3QuaGVhZCgkaG9sZGVyKSkpIHtcblx0XHRcdFx0JGhvbGRlci5jbG9zZXN0KCdmb3JtJykuc3VibWl0KGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0dmFyIGNvbnRlbnRzID0gJGhvbGRlci5jb2RlKCk7XG5cdFx0XHRcdFx0YmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdzdWJtaXQnKS5jYWxsKHRoaXMsIGUsIGNvbnRlbnRzKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGZpcmUgaW5pdCBldmVudFxuXHRcdFx0YmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdpbml0JykoKTtcblxuXHRcdFx0Ly8gZmlyZSBwbHVnaW4gaW5pdCBldmVudFxuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGxlbiA9ICQuc3VtbWVybm90ZS5wbHVnaW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdGlmICgkLmlzRnVuY3Rpb24oJC5zdW1tZXJub3RlLnBsdWdpbnNbaV0uaW5pdCkpIHtcblx0XHRcdFx0XHQkLnN1bW1lcm5vdGUucGx1Z2luc1tpXS5pbml0KGxheW91dEluZm8pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRoaXMuZGV0YWNoID0gZnVuY3Rpb24gKGxheW91dEluZm8sIG9wdGlvbnMpIHtcblx0XHRcdGxheW91dEluZm8uaG9sZGVyKCkub2ZmKCk7XG5cdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkub2ZmKCk7XG5cblx0XHRcdGxheW91dEluZm8ucG9wb3ZlcigpLm9mZigpO1xuXHRcdFx0bGF5b3V0SW5mby5oYW5kbGUoKS5vZmYoKTtcblx0XHRcdGxheW91dEluZm8uZGlhbG9nKCkub2ZmKCk7XG5cblx0XHRcdGlmICghb3B0aW9ucy5haXJNb2RlKSB7XG5cdFx0XHRcdGxheW91dEluZm8uZHJvcHpvbmUoKS5vZmYoKTtcblx0XHRcdFx0bGF5b3V0SW5mby50b29sYmFyKCkub2ZmKCk7XG5cdFx0XHRcdGxheW91dEluZm8uc3RhdHVzYmFyKCkub2ZmKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIFJlbmRlcmVyXG5cdCAqXG5cdCAqIHJlbmRlcmVyXG5cdCAqXG5cdCAqIHJlbmRlcmluZyB0b29sYmFyIGFuZCBlZGl0YWJsZVxuXHQgKi9cblx0dmFyIFJlbmRlcmVyID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0LyoqXG5cdFx0ICogYm9vdHN0cmFwIGJ1dHRvbiB0ZW1wbGF0ZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIGJ1dHRvbiBuYW1lXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBidXR0b24gb3B0aW9uc1xuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5ldmVudF0gZGF0YS1ldmVudFxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jbGFzc05hbWVdIGJ1dHRvbidzIGNsYXNzIG5hbWVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudmFsdWVdIGRhdGEtdmFsdWVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudGl0bGVdIGJ1dHRvbidzIHRpdGxlIGZvciBwb3B1cFxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5kcm9wZG93bl0gZHJvcGRvd24gaHRtbFxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5oaWRlXSBkYXRhLWhpZGVcblx0XHQgKi9cblx0XHR2YXIgdHBsQnV0dG9uID0gZnVuY3Rpb24gKGxhYmVsLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgZXZlbnQgPSBvcHRpb25zLmV2ZW50O1xuXHRcdFx0dmFyIHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcblx0XHRcdHZhciB0aXRsZSA9IG9wdGlvbnMudGl0bGU7XG5cdFx0XHR2YXIgY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzc05hbWU7XG5cdFx0XHR2YXIgZHJvcGRvd24gPSBvcHRpb25zLmRyb3Bkb3duO1xuXHRcdFx0dmFyIGhpZGUgPSBvcHRpb25zLmhpZGU7XG5cblx0XHRcdHJldHVybiAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCInICtcblx0XHRcdFx0XHQgICAnIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBidG4tc21hbGwnICtcblx0XHRcdFx0XHRcdCAoY2xhc3NOYW1lID8gJyAnICsgY2xhc3NOYW1lIDogJycpICtcblx0XHRcdFx0XHRcdCAoZHJvcGRvd24gPyAnIGRyb3Bkb3duLXRvZ2dsZScgOiAnJykgK1xuXHRcdFx0XHRcdCAgICdcIicgK1xuXHRcdFx0XHRcdCAgIChkcm9wZG93biA/ICcgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiJyA6ICcnKSArXG5cdFx0XHRcdFx0ICAgKHRpdGxlID8gJyB0aXRsZT1cIicgKyB0aXRsZSArICdcIicgOiAnJykgK1xuXHRcdFx0XHRcdCAgIChldmVudCA/ICcgZGF0YS1ldmVudD1cIicgKyBldmVudCArICdcIicgOiAnJykgK1xuXHRcdFx0XHRcdCAgICh2YWx1ZSA/ICcgZGF0YS12YWx1ZT1cXCcnICsgdmFsdWUgKyAnXFwnJyA6ICcnKSArXG5cdFx0XHRcdFx0ICAgKGhpZGUgPyAnIGRhdGEtaGlkZT1cXCcnICsgaGlkZSArICdcXCcnIDogJycpICtcblx0XHRcdFx0XHQgICAnIHRhYmluZGV4PVwiLTFcIj4nICtcblx0XHRcdFx0XHQgbGFiZWwgK1xuXHRcdFx0XHRcdCAoZHJvcGRvd24gPyAnIDxzcGFuIGNsYXNzPVwiY2FyZXRcIj48L3NwYW4+JyA6ICcnKSArXG5cdFx0XHRcdCAgICc8L2J1dHRvbj4nICtcblx0XHRcdFx0ICAgKGRyb3Bkb3duIHx8ICcnKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYm9vdHN0cmFwIGljb24gYnV0dG9uIHRlbXBsYXRlXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gaWNvbkNsYXNzTmFtZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZXZlbnRdXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnZhbHVlXVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aXRsZV1cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZHJvcGRvd25dXG5cdFx0ICovXG5cdFx0dmFyIHRwbEljb25CdXR0b24gPSBmdW5jdGlvbiAoaWNvbkNsYXNzTmFtZSwgb3B0aW9ucykge1xuXHRcdFx0dmFyIGxhYmVsID0gJzxpIGNsYXNzPVwiJyArIGljb25DbGFzc05hbWUgKyAnXCI+PC9pPic7XG5cdFx0XHRyZXR1cm4gdHBsQnV0dG9uKGxhYmVsLCBvcHRpb25zKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYm9vdHN0cmFwIHBvcG92ZXIgdGVtcGxhdGVcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudFxuXHRcdCAqL1xuXHRcdHZhciB0cGxQb3BvdmVyID0gZnVuY3Rpb24gKGNsYXNzTmFtZSwgY29udGVudCkge1xuXHRcdFx0dmFyICRwb3BvdmVyID0gJCgnPGRpdiBjbGFzcz1cIicgKyBjbGFzc05hbWUgKyAnIHBvcG92ZXIgYm90dG9tIGluXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPicgK1xuXHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1jb250ZW50XCI+JyArXG5cdFx0XHRcdFx0ICc8L2Rpdj4nICtcblx0XHRcdFx0ICAgJzwvZGl2PicpO1xuXG5cdFx0XHQkcG9wb3Zlci5maW5kKCcucG9wb3Zlci1jb250ZW50JykuYXBwZW5kKGNvbnRlbnQpO1xuXHRcdFx0cmV0dXJuICRwb3BvdmVyO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBib290c3RyYXAgZGlhbG9nIHRlbXBsYXRlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFt0aXRsZT0nJ11cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gYm9keVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbZm9vdGVyPScnXVxuXHRcdCAqL1xuXHRcdHZhciB0cGxEaWFsb2cgPSBmdW5jdGlvbiAoY2xhc3NOYW1lLCB0aXRsZSwgYm9keSwgZm9vdGVyKSB7XG5cdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCInICsgY2xhc3NOYW1lICsgJyBtb2RhbFwiIGFyaWEtaGlkZGVuPVwiZmFsc2VcIj4nICtcblx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIj4nICtcblx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj4nICtcblx0XHRcdFx0XHRcdCAodGl0bGUgP1xuXHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+JyArXG5cdFx0XHRcdFx0XHQgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRhYmluZGV4PVwiLTFcIj4mdGltZXM7PC9idXR0b24+JyArXG5cdFx0XHRcdFx0XHQgICAnPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj4nICsgdGl0bGUgKyAnPC9oND4nICtcblx0XHRcdFx0XHRcdCAnPC9kaXY+JyA6ICcnXG5cdFx0XHRcdFx0XHQgKSArXG5cdFx0XHRcdFx0XHQgJzxmb3JtIGNsYXNzPVwibm90ZS1tb2RhbC1mb3JtXCI+JyArXG5cdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj4nICsgYm9keSArICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdCAgIChmb290ZXIgP1xuXHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj4nICsgZm9vdGVyICsgJzwvZGl2PicgOiAnJ1xuXHRcdFx0XHRcdFx0ICAgKSArXG5cdFx0XHRcdFx0XHQgJzwvZm9ybT4nICtcblx0XHRcdFx0XHQgICAnPC9kaXY+JyArXG5cdFx0XHRcdFx0ICc8L2Rpdj4nICtcblx0XHRcdFx0ICAgJzwvZGl2Pic7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxCdXR0b25JbmZvID0ge1xuXHRcdFx0cGljdHVyZTogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3BpY3R1cmUtbycsIHtcblx0XHRcdFx0XHRldmVudDogJ3Nob3dJbWFnZURpYWxvZycsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2UuaW1hZ2UsXG5cdFx0XHRcdFx0aGlkZTogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRsaW5rOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnbGluaycsIHtcblx0XHRcdFx0XHRldmVudDogJ3Nob3dMaW5rRGlhbG9nJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5saW5rLmxpbmssXG5cdFx0XHRcdFx0aGlkZTogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHR0YWJsZTogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0dmFyIGRyb3Bkb3duID0gJzx1bCBjbGFzcz1cIm5vdGUtdGFibGUgZHJvcGRvd24tbWVudVwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtZGltZW5zaW9uLXBpY2tlclwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1kaW1lbnNpb24tcGlja2VyLW1vdXNlY2F0Y2hlclwiIGRhdGEtZXZlbnQ9XCJpbnNlcnRUYWJsZVwiIGRhdGEtdmFsdWU9XCIxeDFcIj48L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtZGltZW5zaW9uLXBpY2tlci1oaWdobGlnaHRlZFwiPjwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1kaW1lbnNpb24tcGlja2VyLXVuaGlnaGxpZ2h0ZWRcIj48L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtZGltZW5zaW9uLWRpc3BsYXlcIj4gMSB4IDEgPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdCAgICc8L3VsPic7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICd0YWJsZScsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy50YWJsZS50YWJsZSxcblx0XHRcdFx0XHRkcm9wZG93bjogZHJvcGRvd25cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0c3R5bGU6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBpdGVtcyA9IG9wdGlvbnMuc3R5bGVUYWdzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgdikge1xuXHRcdFx0XHRcdHZhciBsYWJlbCA9IGxhbmcuc3R5bGVbdiA9PT0gJ3AnID8gJ25vcm1hbCcgOiB2XTtcblx0XHRcdFx0XHRyZXR1cm4gbWVtbyArICc8bGk+PGEgZGF0YS1ldmVudD1cImZvcm1hdEJsb2NrXCIgaHJlZj1cIiNcIiBkYXRhLXZhbHVlPVwiJyArIHYgKyAnXCI+JyArXG5cdFx0XHRcdFx0XHRcdCAoXG5cdFx0XHRcdFx0XHRcdCAgICh2ID09PSAncCcgfHwgdiA9PT0gJ3ByZScpID8gbGFiZWwgOlxuXHRcdFx0XHRcdFx0XHQgICAnPCcgKyB2ICsgJz4nICsgbGFiZWwgKyAnPC8nICsgdiArICc+J1xuXHRcdFx0XHRcdFx0XHQgKSArXG5cdFx0XHRcdFx0XHQgICAnPC9hPjwvbGk+Jztcblx0XHRcdFx0fSwgJycpO1xuXG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdtYWdpYycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5zdHlsZS5zdHlsZSxcblx0XHRcdFx0XHRkcm9wZG93bjogJzx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj4nICsgaXRlbXMgKyAnPC91bD4nXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGZvbnRuYW1lOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgcmVhbEZvbnRMaXN0ID0gW107XG5cdFx0XHRcdHZhciBpdGVtcyA9IG9wdGlvbnMuZm9udE5hbWVzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgdikge1xuXHRcdFx0XHRcdGlmICghYWdlbnQuaXNGb250SW5zdGFsbGVkKHYpICYmIG9wdGlvbnMuZm9udE5hbWVzSWdub3JlQ2hlY2suaW5kZXhPZih2KSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdHJldHVybiBtZW1vO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZWFsRm9udExpc3QucHVzaCh2KTtcblx0XHRcdFx0XHRyZXR1cm4gbWVtbyArICc8bGk+PGEgZGF0YS1ldmVudD1cImZvbnROYW1lXCIgaHJlZj1cIiNcIiBkYXRhLXZhbHVlPVwiJyArIHYgKyAnXCIgc3R5bGU9XCJmb250LWZhbWlseTpcXCcnICsgdiArICdcXCdcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCc8aSBjbGFzcz1cIicgKyBvcHRpb25zLmljb25QcmVmaXggKyAnY2hlY2tcIj48L2k+ICcgKyB2ICtcblx0XHRcdFx0XHRcdFx0XHQgICc8L2E+PC9saT4nO1xuXHRcdFx0XHR9LCAnJyk7XG5cblx0XHRcdFx0dmFyIGhhc0RlZmF1bHRGb250ID0gYWdlbnQuaXNGb250SW5zdGFsbGVkKG9wdGlvbnMuZGVmYXVsdEZvbnROYW1lKTtcblx0XHRcdFx0dmFyIGRlZmF1bHRGb250TmFtZSA9IChoYXNEZWZhdWx0Rm9udCkgPyBvcHRpb25zLmRlZmF1bHRGb250TmFtZSA6IHJlYWxGb250TGlzdFswXTtcblxuXHRcdFx0XHR2YXIgbGFiZWwgPSAnPHNwYW4gY2xhc3M9XCJub3RlLWN1cnJlbnQtZm9udG5hbWVcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Rm9udE5hbWUgK1xuXHRcdFx0XHRcdFx0XHQgJzwvc3Bhbj4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsQnV0dG9uKGxhYmVsLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuZm9udC5uYW1lLFxuXHRcdFx0XHRcdGRyb3Bkb3duOiAnPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPicgKyBpdGVtcyArICc8L3VsPidcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0Y29sb3I6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBjb2xvckJ1dHRvbkxhYmVsID0gJzxpIGNsYXNzPVwiJyArIG9wdGlvbnMuaWNvblByZWZpeCArICdmb250XCIgc3R5bGU9XCJjb2xvcjpibGFjaztiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdztcIj48L2k+Jztcblx0XHRcdFx0dmFyIGNvbG9yQnV0dG9uID0gdHBsQnV0dG9uKGNvbG9yQnV0dG9uTGFiZWwsIHtcblx0XHRcdFx0XHRjbGFzc05hbWU6ICdub3RlLXJlY2VudC1jb2xvcicsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuY29sb3IucmVjZW50LFxuXHRcdFx0XHRcdGV2ZW50OiAnY29sb3InLFxuXHRcdFx0XHRcdHZhbHVlOiAne1wiYmFja0NvbG9yXCI6XCJ5ZWxsb3dcIn0nXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHZhciBkcm9wZG93biA9ICc8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICc8bGk+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtcGFsZXR0ZS10aXRsZVwiPicgKyBsYW5nLmNvbG9yLmJhY2tncm91bmQgKyAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWNvbG9yLXJlc2V0XCIgZGF0YS1ldmVudD1cImJhY2tDb2xvclwiJyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAnIGRhdGEtdmFsdWU9XCJpbmhlcml0XCIgdGl0bGU9XCInICsgbGFuZy5jb2xvci50cmFuc3BhcmVudCArICdcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCAgIGxhbmcuY29sb3Iuc2V0VHJhbnNwYXJlbnQgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtY29sb3ItcGFsZXR0ZVwiIGRhdGEtdGFyZ2V0LWV2ZW50PVwiYmFja0NvbG9yXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICAgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLXBhbGV0dGUtdGl0bGVcIj4nICsgbGFuZy5jb2xvci5mb3JlZ3JvdW5kICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1jb2xvci1yZXNldFwiIGRhdGEtZXZlbnQ9XCJmb3JlQ29sb3JcIiBkYXRhLXZhbHVlPVwiaW5oZXJpdFwiIHRpdGxlPVwiJyArIGxhbmcuY29sb3IucmVzZXQgKyAnXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgICBsYW5nLmNvbG9yLnJlc2V0VG9EZWZhdWx0ICtcblx0XHRcdFx0XHRcdFx0XHRcdCAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWNvbG9yLXBhbGV0dGVcIiBkYXRhLXRhcmdldC1ldmVudD1cImZvcmVDb2xvclwiPjwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgJzwvbGk+JyArXG5cdFx0XHRcdFx0XHRcdCAgICc8L3VsPic7XG5cblx0XHRcdFx0dmFyIG1vcmVCdXR0b24gPSB0cGxCdXR0b24oJycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5jb2xvci5tb3JlLFxuXHRcdFx0XHRcdGRyb3Bkb3duOiBkcm9wZG93blxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gY29sb3JCdXR0b24gKyBtb3JlQnV0dG9uO1xuXHRcdFx0fSxcblx0XHRcdGJvbGQ6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdib2xkJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnYm9sZCcsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuZm9udC5ib2xkXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGl0YWxpYzogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2l0YWxpYycsIHtcblx0XHRcdFx0XHRldmVudDogJ2l0YWxpYycsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuZm9udC5pdGFsaWNcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0dW5kZXJsaW5lOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAndW5kZXJsaW5lJywge1xuXHRcdFx0XHRcdGV2ZW50OiAndW5kZXJsaW5lJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5mb250LnVuZGVybGluZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRjbGVhcjogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2VyYXNlcicsIHtcblx0XHRcdFx0XHRldmVudDogJ3JlbW92ZUZvcm1hdCcsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuZm9udC5jbGVhclxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHR1bDogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2xpc3QtdWwnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdpbnNlcnRVbm9yZGVyZWRMaXN0Jyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5saXN0cy51bm9yZGVyZWRcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0b2w6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdsaXN0LW9sJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnaW5zZXJ0T3JkZXJlZExpc3QnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmxpc3RzLm9yZGVyZWRcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0cGFyYWdyYXBoOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgbGVmdEJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2FsaWduLWxlZnQnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcucGFyYWdyYXBoLmxlZnQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdqdXN0aWZ5TGVmdCdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBjZW50ZXJCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1jZW50ZXInLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcucGFyYWdyYXBoLmNlbnRlcixcblx0XHRcdFx0XHRldmVudDogJ2p1c3RpZnlDZW50ZXInXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgcmlnaHRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1yaWdodCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5wYXJhZ3JhcGgucmlnaHQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdqdXN0aWZ5UmlnaHQnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIganVzdGlmeUJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2FsaWduLWp1c3RpZnknLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcucGFyYWdyYXBoLmp1c3RpZnksXG5cdFx0XHRcdFx0ZXZlbnQ6ICdqdXN0aWZ5RnVsbCdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIG91dGRlbnRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdvdXRkZW50Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLnBhcmFncmFwaC5vdXRkZW50LFxuXHRcdFx0XHRcdGV2ZW50OiAnb3V0ZGVudCdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBpbmRlbnRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdpbmRlbnQnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcucGFyYWdyYXBoLmluZGVudCxcblx0XHRcdFx0XHRldmVudDogJ2luZGVudCdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIGRyb3Bkb3duID0gJzxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1hbGlnbiBidG4tZ3JvdXBcIj4nICtcblx0XHRcdFx0XHRcdFx0XHQgICBsZWZ0QnV0dG9uICsgY2VudGVyQnV0dG9uICsgcmlnaHRCdXR0b24gKyBqdXN0aWZ5QnV0dG9uICtcblx0XHRcdFx0XHRcdFx0XHQgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtbGlzdCBidG4tZ3JvdXBcIj4nICtcblx0XHRcdFx0XHRcdFx0XHQgICBpbmRlbnRCdXR0b24gKyBvdXRkZW50QnV0dG9uICtcblx0XHRcdFx0XHRcdFx0XHQgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHQgICAnPC9kaXY+JztcblxuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnYWxpZ24tbGVmdCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5wYXJhZ3JhcGgucGFyYWdyYXBoLFxuXHRcdFx0XHRcdGRyb3Bkb3duOiBkcm9wZG93blxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRoZWlnaHQ6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBpdGVtcyA9IG9wdGlvbnMubGluZUhlaWdodHMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCB2KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1lbW8gKyAnPGxpPjxhIGRhdGEtZXZlbnQ9XCJsaW5lSGVpZ2h0XCIgaHJlZj1cIiNcIiBkYXRhLXZhbHVlPVwiJyArIHBhcnNlRmxvYXQodikgKyAnXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQnPGkgY2xhc3M9XCInICsgb3B0aW9ucy5pY29uUHJlZml4ICsgJ2NoZWNrXCI+PC9pPiAnICsgdiArXG5cdFx0XHRcdFx0XHRcdFx0ICAnPC9hPjwvbGk+Jztcblx0XHRcdFx0fSwgJycpO1xuXG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICd0ZXh0LWhlaWdodCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5mb250LmhlaWdodCxcblx0XHRcdFx0XHRkcm9wZG93bjogJzx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj4nICsgaXRlbXMgKyAnPC91bD4nXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHR9LFxuXHRcdFx0aGVscDogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3F1ZXN0aW9uJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnc2hvd0hlbHBEaWFsb2cnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLm9wdGlvbnMuaGVscCxcblx0XHRcdFx0XHRoaWRlOiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGZ1bGxzY3JlZW46IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhcnJvd3MtYWx0Jywge1xuXHRcdFx0XHRcdGV2ZW50OiAnZnVsbHNjcmVlbicsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcub3B0aW9ucy5mdWxsc2NyZWVuXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGNvZGV2aWV3OiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnY29kZScsIHtcblx0XHRcdFx0XHRldmVudDogJ2NvZGV2aWV3Jyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5vcHRpb25zLmNvZGV2aWV3XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHVuZG86IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICd1bmRvJywge1xuXHRcdFx0XHRcdGV2ZW50OiAndW5kbycsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaGlzdG9yeS51bmRvXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHJlZG86IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdyZXBlYXQnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdyZWRvJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5oaXN0b3J5LnJlZG9cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0aHI6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdtaW51cycsIHtcblx0XHRcdFx0XHRldmVudDogJ2luc2VydEhvcml6b250YWxSdWxlJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5oci5pbnNlcnRcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB0cGxQb3BvdmVycyA9IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgdHBsTGlua1BvcG92ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBsaW5rQnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnZWRpdCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5saW5rLmVkaXQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdzaG93TGlua0RpYWxvZycsXG5cdFx0XHRcdFx0aGlkZTogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIHVubGlua0J1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3VubGluaycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5saW5rLnVubGluayxcblx0XHRcdFx0XHRldmVudDogJ3VubGluaydcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBjb250ZW50ID0gJzxhIGhyZWY9XCJodHRwOi8vd3d3Lmdvb2dsZS5jb21cIiB0YXJnZXQ9XCJfYmxhbmtcIj53d3cuZ29vZ2xlLmNvbTwvYT4mbmJzcDsmbmJzcDsnICtcblx0XHRcdFx0XHRcdFx0ICAnPGRpdiBjbGFzcz1cIm5vdGUtaW5zZXJ0IGJ0bi1ncm91cFwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdGxpbmtCdXR0b24gKyB1bmxpbmtCdXR0b24gK1xuXHRcdFx0XHRcdFx0XHQgICc8L2Rpdj4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsUG9wb3Zlcignbm90ZS1saW5rLXBvcG92ZXInLCBjb250ZW50KTtcblx0XHRcdH07XG5cblx0XHRcdHZhciB0cGxJbWFnZVBvcG92ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBmdWxsQnV0dG9uID0gdHBsQnV0dG9uKCc8c3BhbiBjbGFzcz1cIm5vdGUtZm9udHNpemUtMTBcIj4xMDAlPC9zcGFuPicsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5yZXNpemVGdWxsLFxuXHRcdFx0XHRcdGV2ZW50OiAncmVzaXplJyxcblx0XHRcdFx0XHR2YWx1ZTogJzEnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgaGFsZkJ1dHRvbiA9IHRwbEJ1dHRvbignPHNwYW4gY2xhc3M9XCJub3RlLWZvbnRzaXplLTEwXCI+NTAlPC9zcGFuPicsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5yZXNpemVIYWxmLFxuXHRcdFx0XHRcdGV2ZW50OiAncmVzaXplJyxcblx0XHRcdFx0XHR2YWx1ZTogJzAuNSdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBxdWFydGVyQnV0dG9uID0gdHBsQnV0dG9uKCc8c3BhbiBjbGFzcz1cIm5vdGUtZm9udHNpemUtMTBcIj4yNSU8L3NwYW4+Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLnJlc2l6ZVF1YXJ0ZXIsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdyZXNpemUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnMC4yNSdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIGxlZnRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1sZWZ0Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLmZsb2F0TGVmdCxcblx0XHRcdFx0XHRldmVudDogJ2Zsb2F0TWUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnbGVmdCdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciByaWdodEJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2FsaWduLXJpZ2h0Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLmZsb2F0UmlnaHQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdmbG9hdE1lJyxcblx0XHRcdFx0XHR2YWx1ZTogJ3JpZ2h0J1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIGp1c3RpZnlCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1qdXN0aWZ5Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLmZsb2F0Tm9uZSxcblx0XHRcdFx0XHRldmVudDogJ2Zsb2F0TWUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm9uZSdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIHJvdW5kZWRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdzcXVhcmUnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2Uuc2hhcGVSb3VuZGVkLFxuXHRcdFx0XHRcdGV2ZW50OiAnaW1hZ2VTaGFwZScsXG5cdFx0XHRcdFx0dmFsdWU6ICdpbWctcm91bmRlZCdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBjaXJjbGVCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdjaXJjbGUtbycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5zaGFwZUNpcmNsZSxcblx0XHRcdFx0XHRldmVudDogJ2ltYWdlU2hhcGUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnaW1nLWNpcmNsZSdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciB0aHVtYm5haWxCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdwaWN0dXJlLW8nLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2Uuc2hhcGVUaHVtYm5haWwsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdpbWFnZVNoYXBlJyxcblx0XHRcdFx0XHR2YWx1ZTogJ2ltZy10aHVtYm5haWwnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgbm9uZUJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3RpbWVzJywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLnNoYXBlTm9uZSxcblx0XHRcdFx0XHRldmVudDogJ2ltYWdlU2hhcGUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnJ1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgcmVtb3ZlQnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAndHJhc2gtbycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5yZW1vdmUsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdyZW1vdmVNZWRpYScsXG5cdFx0XHRcdFx0dmFsdWU6ICdub25lJ1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgY29udGVudCA9ICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+JyArIGZ1bGxCdXR0b24gKyBoYWxmQnV0dG9uICsgcXVhcnRlckJ1dHRvbiArICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0ICAnPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPicgKyBsZWZ0QnV0dG9uICsgcmlnaHRCdXR0b24gKyBqdXN0aWZ5QnV0dG9uICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHQgICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+JyArIHJvdW5kZWRCdXR0b24gKyBjaXJjbGVCdXR0b24gKyB0aHVtYm5haWxCdXR0b24gKyBub25lQnV0dG9uICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHQgICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+JyArIHJlbW92ZUJ1dHRvbiArICc8L2Rpdj4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsUG9wb3Zlcignbm90ZS1pbWFnZS1wb3BvdmVyJywgY29udGVudCk7XG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgdHBsQWlyUG9wb3ZlciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyICRjb250ZW50ID0gJCgnPGRpdiAvPicpO1xuXHRcdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmFpclBvcG92ZXIubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHRcdFx0dmFyIGdyb3VwID0gb3B0aW9ucy5haXJQb3BvdmVyW2lkeF07XG5cblx0XHRcdFx0XHR2YXIgJGdyb3VwID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtJyArIGdyb3VwWzBdICsgJyBidG4tZ3JvdXBcIj4nKTtcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMCwgbGVuR3JvdXAgPSBncm91cFsxXS5sZW5ndGg7IGkgPCBsZW5Hcm91cDsgaSsrKSB7XG5cdFx0XHRcdFx0XHR2YXIgJGJ1dHRvbiA9ICQodHBsQnV0dG9uSW5mb1tncm91cFsxXVtpXV0obGFuZywgb3B0aW9ucykpO1xuXG5cdFx0XHRcdFx0XHQkYnV0dG9uLmF0dHIoJ2RhdGEtbmFtZScsIGdyb3VwWzFdW2ldKTtcblxuXHRcdFx0XHRcdFx0JGdyb3VwLmFwcGVuZCgkYnV0dG9uKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0JGNvbnRlbnQuYXBwZW5kKCRncm91cCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdHBsUG9wb3Zlcignbm90ZS1haXItcG9wb3ZlcicsICRjb250ZW50LmNoaWxkcmVuKCkpO1xuXHRcdFx0fTtcblxuXHRcdFx0dmFyICRub3RlUG9wb3ZlciA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLXBvcG92ZXJcIiAvPicpO1xuXG5cdFx0XHQkbm90ZVBvcG92ZXIuYXBwZW5kKHRwbExpbmtQb3BvdmVyKCkpO1xuXHRcdFx0JG5vdGVQb3BvdmVyLmFwcGVuZCh0cGxJbWFnZVBvcG92ZXIoKSk7XG5cblx0XHRcdGlmIChvcHRpb25zLmFpck1vZGUpIHtcblx0XHRcdFx0JG5vdGVQb3BvdmVyLmFwcGVuZCh0cGxBaXJQb3BvdmVyKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gJG5vdGVQb3BvdmVyO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsSGFuZGxlcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiAnPGRpdiBjbGFzcz1cIm5vdGUtaGFuZGxlXCI+JyArXG5cdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1jb250cm9sLXNlbGVjdGlvblwiPicgK1xuXHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1jb250cm9sLXNlbGVjdGlvbi1iZ1wiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1jb250cm9sLWhvbGRlciBub3RlLWNvbnRyb2wtbndcIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtY29udHJvbC1ob2xkZXIgbm90ZS1jb250cm9sLW5lXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLWNvbnRyb2wtaG9sZGVyIG5vdGUtY29udHJvbC1zd1wiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1jb250cm9sLXNpemluZyBub3RlLWNvbnRyb2wtc2VcIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtY29udHJvbC1zZWxlY3Rpb24taW5mb1wiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAnPC9kaXY+JyArXG5cdFx0XHRcdCAgICc8L2Rpdj4nO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBzaG9ydGN1dCB0YWJsZSB0ZW1wbGF0ZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBib2R5XG5cdFx0ICovXG5cdFx0dmFyIHRwbFNob3J0Y3V0ID0gZnVuY3Rpb24gKHRpdGxlLCBrZXlzKSB7XG5cdFx0XHR2YXIga2V5Q2xhc3MgPSAnbm90ZS1zaG9ydGN1dC1jb2wgY29sLXhzLTYgbm90ZS1zaG9ydGN1dC0nO1xuXHRcdFx0dmFyIGJvZHkgPSBbXTtcblxuXHRcdFx0Zm9yICh2YXIgaSBpbiBrZXlzKSB7XG5cdFx0XHRcdGlmIChrZXlzLmhhc093blByb3BlcnR5KGkpKSB7XG5cdFx0XHRcdFx0Ym9keS5wdXNoKFxuXHRcdFx0XHRcdCAgJzxkaXYgY2xhc3M9XCInICsga2V5Q2xhc3MgKyAna2V5XCI+JyArIGtleXNbaV0ua2JkICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdCAgJzxkaXYgY2xhc3M9XCInICsga2V5Q2xhc3MgKyAnbmFtZVwiPicgKyBrZXlzW2ldLnRleHQgKyAnPC9kaXY+J1xuXHRcdFx0XHRcdCAgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCJub3RlLXNob3J0Y3V0LXJvdyByb3dcIj48ZGl2IGNsYXNzPVwiJyArIGtleUNsYXNzICsgJ3RpdGxlIGNvbC14cy1vZmZzZXQtNlwiPicgKyB0aXRsZSArICc8L2Rpdj48L2Rpdj4nICtcblx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLXNob3J0Y3V0LXJvdyByb3dcIj4nICsgYm9keS5qb2luKCc8L2Rpdj48ZGl2IGNsYXNzPVwibm90ZS1zaG9ydGN1dC1yb3cgcm93XCI+JykgKyAnPC9kaXY+Jztcblx0XHR9O1xuXG5cdFx0dmFyIHRwbFNob3J0Y3V0VGV4dCA9IGZ1bmN0aW9uIChsYW5nKSB7XG5cdFx0XHR2YXIga2V5cyA9IFtcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBCJywgdGV4dDogbGFuZy5mb250LmJvbGQgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBJJywgdGV4dDogbGFuZy5mb250Lml0YWxpYyB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIFUnLCB0ZXh0OiBsYW5nLmZvbnQudW5kZXJsaW5lIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgXFxcXCcsIHRleHQ6IGxhbmcuZm9udC5jbGVhciB9XG5cdFx0XHRdO1xuXG5cdFx0XHRyZXR1cm4gdHBsU2hvcnRjdXQobGFuZy5zaG9ydGN1dC50ZXh0Rm9ybWF0dGluZywga2V5cyk7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxTaG9ydGN1dEFjdGlvbiA9IGZ1bmN0aW9uIChsYW5nKSB7XG5cdFx0XHR2YXIga2V5cyA9IFtcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBaJywgdGV4dDogbGFuZy5oaXN0b3J5LnVuZG8gfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyDih6cgKyBaJywgdGV4dDogbGFuZy5oaXN0b3J5LnJlZG8gfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBdJywgdGV4dDogbGFuZy5wYXJhZ3JhcGguaW5kZW50IH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgWycsIHRleHQ6IGxhbmcucGFyYWdyYXBoLm91dGRlbnQgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBFTlRFUicsIHRleHQ6IGxhbmcuaHIuaW5zZXJ0IH1cblx0XHRcdF07XG5cblx0XHRcdHJldHVybiB0cGxTaG9ydGN1dChsYW5nLnNob3J0Y3V0LmFjdGlvbiwga2V5cyk7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxTaG9ydGN1dFBhcmEgPSBmdW5jdGlvbiAobGFuZykge1xuXHRcdFx0dmFyIGtleXMgPSBbXG5cdFx0XHQgIHsga2JkOiAn4oyYICsg4oenICsgTCcsIHRleHQ6IGxhbmcucGFyYWdyYXBoLmxlZnQgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyDih6cgKyBFJywgdGV4dDogbGFuZy5wYXJhZ3JhcGguY2VudGVyIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsg4oenICsgUicsIHRleHQ6IGxhbmcucGFyYWdyYXBoLnJpZ2h0IH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsg4oenICsgSicsIHRleHQ6IGxhbmcucGFyYWdyYXBoLmp1c3RpZnkgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyDih6cgKyBOVU03JywgdGV4dDogbGFuZy5saXN0cy5vcmRlcmVkIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsg4oenICsgTlVNOCcsIHRleHQ6IGxhbmcubGlzdHMudW5vcmRlcmVkIH1cblx0XHRcdF07XG5cblx0XHRcdHJldHVybiB0cGxTaG9ydGN1dChsYW5nLnNob3J0Y3V0LnBhcmFncmFwaEZvcm1hdHRpbmcsIGtleXMpO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsU2hvcnRjdXRTdHlsZSA9IGZ1bmN0aW9uIChsYW5nKSB7XG5cdFx0XHR2YXIga2V5cyA9IFtcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBOVU0wJywgdGV4dDogbGFuZy5zdHlsZS5ub3JtYWwgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBOVU0xJywgdGV4dDogbGFuZy5zdHlsZS5oMSB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIE5VTTInLCB0ZXh0OiBsYW5nLnN0eWxlLmgyIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgTlVNMycsIHRleHQ6IGxhbmcuc3R5bGUuaDMgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBOVU00JywgdGV4dDogbGFuZy5zdHlsZS5oNCB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIE5VTTUnLCB0ZXh0OiBsYW5nLnN0eWxlLmg1IH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgTlVNNicsIHRleHQ6IGxhbmcuc3R5bGUuaDYgfVxuXHRcdFx0XTtcblxuXHRcdFx0cmV0dXJuIHRwbFNob3J0Y3V0KGxhbmcuc2hvcnRjdXQuZG9jdW1lbnRTdHlsZSwga2V5cyk7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxFeHRyYVNob3J0Y3V0cyA9IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgZXh0cmFLZXlzID0gb3B0aW9ucy5leHRyYUtleXM7XG5cdFx0XHR2YXIga2V5cyA9IFtdO1xuXG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gZXh0cmFLZXlzKSB7XG5cdFx0XHRcdGlmIChleHRyYUtleXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHRcdGtleXMucHVzaCh7IGtiZDoga2V5LCB0ZXh0OiBleHRyYUtleXNba2V5XSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHBsU2hvcnRjdXQobGFuZy5zaG9ydGN1dC5leHRyYUtleXMsIGtleXMpO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsU2hvcnRjdXRUYWJsZSA9IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgY29sQ2xhc3MgPSAnY2xhc3M9XCJub3RlLXNob3J0Y3V0IG5vdGUtc2hvcnRjdXQtY29sIGNvbC1zbS02IGNvbC14cy0xMlwiJztcblx0XHRcdHZhciB0ZW1wbGF0ZSA9IFtcblx0XHRcdCAgJzxkaXYgJyArIGNvbENsYXNzICsgJz4nICsgdHBsU2hvcnRjdXRBY3Rpb24obGFuZywgb3B0aW9ucykgKyAnPC9kaXY+JyArXG5cdFx0XHQgICc8ZGl2ICcgKyBjb2xDbGFzcyArICc+JyArIHRwbFNob3J0Y3V0VGV4dChsYW5nLCBvcHRpb25zKSArICc8L2Rpdj4nLFxuXHRcdFx0ICAnPGRpdiAnICsgY29sQ2xhc3MgKyAnPicgKyB0cGxTaG9ydGN1dFN0eWxlKGxhbmcsIG9wdGlvbnMpICsgJzwvZGl2PicgK1xuXHRcdFx0ICAnPGRpdiAnICsgY29sQ2xhc3MgKyAnPicgKyB0cGxTaG9ydGN1dFBhcmEobGFuZywgb3B0aW9ucykgKyAnPC9kaXY+J1xuXHRcdFx0XTtcblxuXHRcdFx0aWYgKG9wdGlvbnMuZXh0cmFLZXlzKSB7XG5cdFx0XHRcdHRlbXBsYXRlLnB1c2goJzxkaXYgJyArIGNvbENsYXNzICsgJz4nICsgdHBsRXh0cmFTaG9ydGN1dHMobGFuZywgb3B0aW9ucykgKyAnPC9kaXY+Jyk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAnPGRpdiBjbGFzcz1cIm5vdGUtc2hvcnRjdXQtcm93IHJvd1wiPicgK1xuXHRcdFx0XHRcdCB0ZW1wbGF0ZS5qb2luKCc8L2Rpdj48ZGl2IGNsYXNzPVwibm90ZS1zaG9ydGN1dC1yb3cgcm93XCI+JykgK1xuXHRcdFx0XHQgICAnPC9kaXY+Jztcblx0XHR9O1xuXG5cdFx0dmFyIHJlcGxhY2VNYWNLZXlzID0gZnVuY3Rpb24gKHNIdG1sKSB7XG5cdFx0XHRyZXR1cm4gc0h0bWwucmVwbGFjZSgv4oyYL2csICdDdHJsJykucmVwbGFjZSgv4oenL2csICdTaGlmdCcpO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsRGlhbG9nSW5mbyA9IHtcblx0XHRcdGltYWdlOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgaW1hZ2VMaW1pdGF0aW9uID0gJyc7XG5cdFx0XHRcdGlmIChvcHRpb25zLm1heGltdW1JbWFnZUZpbGVTaXplKSB7XG5cdFx0XHRcdFx0dmFyIHVuaXQgPSBNYXRoLmZsb29yKE1hdGgubG9nKG9wdGlvbnMubWF4aW11bUltYWdlRmlsZVNpemUpIC8gTWF0aC5sb2coMTAyNCkpO1xuXHRcdFx0XHRcdHZhciByZWFkYWJsZVNpemUgPSAob3B0aW9ucy5tYXhpbXVtSW1hZ2VGaWxlU2l6ZSAvIE1hdGgucG93KDEwMjQsIHVuaXQpKS50b0ZpeGVkKDIpICogMSArXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAnICcgKyAnIEtNR1RQJ1t1bml0XSArICdCJztcblx0XHRcdFx0XHRpbWFnZUxpbWl0YXRpb24gPSAnPHNtYWxsPicgKyBsYW5nLmltYWdlLm1heGltdW1GaWxlU2l6ZSArICcgOiAnICsgcmVhZGFibGVTaXplICsgJzwvc21hbGw+Jztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBib2R5ID0gJzxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdy1mbHVpZCBub3RlLWdyb3VwLXNlbGVjdC1mcm9tLWZpbGVzXCI+JyArXG5cdFx0XHRcdFx0XHRcdCAnPGxhYmVsPicgKyBsYW5nLmltYWdlLnNlbGVjdEZyb21GaWxlcyArICc8L2xhYmVsPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxpbnB1dCBjbGFzcz1cIm5vdGUtaW1hZ2UtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlc1wiIGFjY2VwdD1cImltYWdlLypcIiBtdWx0aXBsZT1cIm11bHRpcGxlXCIgLz4nICtcblx0XHRcdFx0XHRcdFx0IGltYWdlTGltaXRhdGlvbiArXG5cdFx0XHRcdFx0XHQgICAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93LWZsdWlkXCI+JyArXG5cdFx0XHRcdFx0XHRcdCAnPGxhYmVsPicgKyBsYW5nLmltYWdlLnVybCArICc8L2xhYmVsPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxpbnB1dCBjbGFzcz1cIm5vdGUtaW1hZ2UtdXJsIGZvcm0tY29udHJvbCBzcGFuMTJcIiB0eXBlPVwidGV4dFwiIC8+JyArXG5cdFx0XHRcdFx0XHQgICAnPC9kaXY+Jztcblx0XHRcdFx0dmFyIGZvb3RlciA9ICc8YnV0dG9uIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbm90ZS1pbWFnZS1idG4gZGlzYWJsZWRcIiBkaXNhYmxlZD4nICsgbGFuZy5pbWFnZS5pbnNlcnQgKyAnPC9idXR0b24+Jztcblx0XHRcdFx0cmV0dXJuIHRwbERpYWxvZygnbm90ZS1pbWFnZS1kaWFsb2cnLCBsYW5nLmltYWdlLmluc2VydCwgYm9keSwgZm9vdGVyKTtcblx0XHRcdH0sXG5cblx0XHRcdGxpbms6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBib2R5ID0gJzxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdy1mbHVpZFwiPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxsYWJlbD4nICsgbGFuZy5saW5rLnRleHRUb0Rpc3BsYXkgKyAnPC9sYWJlbD4nICtcblx0XHRcdFx0XHRcdFx0ICc8aW5wdXQgY2xhc3M9XCJub3RlLWxpbmstdGV4dCBmb3JtLWNvbnRyb2wgc3BhbjEyXCIgdHlwZT1cInRleHRcIiAvPicgK1xuXHRcdFx0XHRcdFx0ICAgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdy1mbHVpZFwiPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxsYWJlbD4nICsgbGFuZy5saW5rLnVybCArICc8L2xhYmVsPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxpbnB1dCBjbGFzcz1cIm5vdGUtbGluay11cmwgZm9ybS1jb250cm9sIHNwYW4xMlwiIHR5cGU9XCJ0ZXh0XCIgLz4nICtcblx0XHRcdFx0XHRcdCAgICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdCAgICghb3B0aW9ucy5kaXNhYmxlTGlua1RhcmdldCA/XG5cdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+JyArXG5cdFx0XHRcdFx0XHRcdCAgICc8bGFiZWw+JyArICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2hlY2tlZD4gJyArXG5cdFx0XHRcdFx0XHRcdFx0IGxhbmcubGluay5vcGVuSW5OZXdXaW5kb3cgK1xuXHRcdFx0XHRcdFx0XHQgICAnPC9sYWJlbD4nICtcblx0XHRcdFx0XHRcdFx0ICc8L2Rpdj4nIDogJydcblx0XHRcdFx0XHRcdCAgICk7XG5cdFx0XHRcdHZhciBmb290ZXIgPSAnPGJ1dHRvbiBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG5vdGUtbGluay1idG4gZGlzYWJsZWRcIiBkaXNhYmxlZD4nICsgbGFuZy5saW5rLmluc2VydCArICc8L2J1dHRvbj4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsRGlhbG9nKCdub3RlLWxpbmstZGlhbG9nJywgbGFuZy5saW5rLmluc2VydCwgYm9keSwgZm9vdGVyKTtcblx0XHRcdH0sXG5cblx0XHRcdGhlbHA6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBib2R5ID0gJzxhIGNsYXNzPVwibW9kYWwtY2xvc2UgcHVsbC1yaWdodFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRhYmluZGV4PVwiLTFcIj4nICsgbGFuZy5zaG9ydGN1dC5jbG9zZSArICc8L2E+JyArXG5cdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cInRpdGxlXCI+JyArIGxhbmcuc2hvcnRjdXQuc2hvcnRjdXRzICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0ICAgKGFnZW50LmlzTWFjID8gdHBsU2hvcnRjdXRUYWJsZShsYW5nLCBvcHRpb25zKSA6IHJlcGxhY2VNYWNLZXlzKHRwbFNob3J0Y3V0VGFibGUobGFuZywgb3B0aW9ucykpKSArXG5cdFx0XHRcdFx0XHQgICAnPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxhIGhyZWY9XCIvL3N1bW1lcm5vdGUub3JnL1wiIHRhcmdldD1cIl9ibGFua1wiPlN1bW1lcm5vdGUgMC42LjM8L2E+IMK3ICcgK1xuXHRcdFx0XHRcdFx0XHQgJzxhIGhyZWY9XCIvL2dpdGh1Yi5jb20vc3VtbWVybm90ZS9zdW1tZXJub3RlXCIgdGFyZ2V0PVwiX2JsYW5rXCI+UHJvamVjdDwvYT4gwrcgJyArXG5cdFx0XHRcdFx0XHRcdCAnPGEgaHJlZj1cIi8vZ2l0aHViLmNvbS9zdW1tZXJub3RlL3N1bW1lcm5vdGUvaXNzdWVzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+SXNzdWVzPC9hPicgK1xuXHRcdFx0XHRcdFx0ICAgJzwvcD4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsRGlhbG9nKCdub3RlLWhlbHAtZGlhbG9nJywgJycsIGJvZHksICcnKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmFyIHRwbERpYWxvZ3MgPSBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0dmFyIGRpYWxvZ3MgPSAnJztcblxuXHRcdFx0JC5lYWNoKHRwbERpYWxvZ0luZm8sIGZ1bmN0aW9uIChpZHgsIHRwbERpYWxvZykge1xuXHRcdFx0XHRkaWFsb2dzICs9IHRwbERpYWxvZyhsYW5nLCBvcHRpb25zKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCJub3RlLWRpYWxvZ1wiPicgKyBkaWFsb2dzICsgJzwvZGl2Pic7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxTdGF0dXNiYXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCJub3RlLXJlc2l6ZWJhclwiPicgK1xuXHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtaWNvbi1iYXJcIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWljb24tYmFyXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1pY29uLWJhclwiPjwvZGl2PicgK1xuXHRcdFx0XHQgICAnPC9kaXY+Jztcblx0XHR9O1xuXG5cdFx0dmFyIHJlcHJlc2VudFNob3J0Y3V0ID0gZnVuY3Rpb24gKHN0cikge1xuXHRcdFx0aWYgKGFnZW50LmlzTWFjKSB7XG5cdFx0XHRcdHN0ciA9IHN0ci5yZXBsYWNlKCdDTUQnLCAn4oyYJykucmVwbGFjZSgnU0hJRlQnLCAn4oenJyk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzdHIucmVwbGFjZSgnQkFDS1NMQVNIJywgJ1xcXFwnKVxuXHRcdFx0XHRcdCAgLnJlcGxhY2UoJ1NMQVNIJywgJy8nKVxuXHRcdFx0XHRcdCAgLnJlcGxhY2UoJ0xFRlRCUkFDS0VUJywgJ1snKVxuXHRcdFx0XHRcdCAgLnJlcGxhY2UoJ1JJR0hUQlJBQ0tFVCcsICddJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNyZWF0ZVRvb2x0aXBcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGtleU1hcFxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbc1BsYWNlbWVudF1cblx0XHQgKi9cblx0XHR2YXIgY3JlYXRlVG9vbHRpcCA9IGZ1bmN0aW9uICgkY29udGFpbmVyLCBrZXlNYXAsIHNQbGFjZW1lbnQpIHtcblx0XHRcdHZhciBpbnZlcnRlZEtleU1hcCA9IGZ1bmMuaW52ZXJ0T2JqZWN0KGtleU1hcCk7XG5cdFx0XHR2YXIgJGJ1dHRvbnMgPSAkY29udGFpbmVyLmZpbmQoJ2J1dHRvbicpO1xuXG5cdFx0XHQkYnV0dG9ucy5lYWNoKGZ1bmN0aW9uIChpLCBlbEJ0bikge1xuXHRcdFx0XHR2YXIgJGJ0biA9ICQoZWxCdG4pO1xuXHRcdFx0XHR2YXIgc1Nob3J0Y3V0ID0gaW52ZXJ0ZWRLZXlNYXBbJGJ0bi5kYXRhKCdldmVudCcpXTtcblx0XHRcdFx0aWYgKHNTaG9ydGN1dCkge1xuXHRcdFx0XHRcdCRidG4uYXR0cigndGl0bGUnLCBmdW5jdGlvbiAoaSwgdikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHYgKyAnICgnICsgcmVwcmVzZW50U2hvcnRjdXQoc1Nob3J0Y3V0KSArICcpJztcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBib290c3RyYXAgdG9vbHRpcCBvbiBidG4tZ3JvdXAgYnVnXG5cdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvNTY4N1xuXHRcdFx0fSkudG9vbHRpcCh7XG5cdFx0XHRcdGNvbnRhaW5lcjogJ2JvZHknLFxuXHRcdFx0XHR0cmlnZ2VyOiAnaG92ZXInLFxuXHRcdFx0XHRwbGFjZW1lbnQ6IHNQbGFjZW1lbnQgfHwgJ3RvcCdcblx0XHRcdH0pLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0JCh0aGlzKS50b29sdGlwKCdoaWRlJyk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0Ly8gY3JlYXRlUGFsZXR0ZVxuXHRcdHZhciBjcmVhdGVQYWxldHRlID0gZnVuY3Rpb24gKCRjb250YWluZXIsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBjb2xvckluZm8gPSBvcHRpb25zLmNvbG9ycztcblx0XHRcdCRjb250YWluZXIuZmluZCgnLm5vdGUtY29sb3ItcGFsZXR0ZScpLmVhY2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgJHBhbGV0dGUgPSAkKHRoaXMpLCBldmVudE5hbWUgPSAkcGFsZXR0ZS5hdHRyKCdkYXRhLXRhcmdldC1ldmVudCcpO1xuXHRcdFx0XHR2YXIgcGFsZXR0ZUNvbnRlbnRzID0gW107XG5cdFx0XHRcdGZvciAodmFyIHJvdyA9IDAsIGxlblJvdyA9IGNvbG9ySW5mby5sZW5ndGg7IHJvdyA8IGxlblJvdzsgcm93KyspIHtcblx0XHRcdFx0XHR2YXIgY29sb3JzID0gY29sb3JJbmZvW3Jvd107XG5cdFx0XHRcdFx0dmFyIGJ1dHRvbnMgPSBbXTtcblx0XHRcdFx0XHRmb3IgKHZhciBjb2wgPSAwLCBsZW5Db2wgPSBjb2xvcnMubGVuZ3RoOyBjb2wgPCBsZW5Db2w7IGNvbCsrKSB7XG5cdFx0XHRcdFx0XHR2YXIgY29sb3IgPSBjb2xvcnNbY29sXTtcblx0XHRcdFx0XHRcdGJ1dHRvbnMucHVzaChbJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibm90ZS1jb2xvci1idG5cIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6JywgY29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAnO1wiIGRhdGEtZXZlbnQ9XCInLCBldmVudE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAnXCIgZGF0YS12YWx1ZT1cIicsIGNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdFx0ICAgJ1wiIHRpdGxlPVwiJywgY29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAnXCIgZGF0YS10b2dnbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIi0xXCI+PC9idXR0b24+J10uam9pbignJykpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYWxldHRlQ29udGVudHMucHVzaCgnPGRpdiBjbGFzcz1cIm5vdGUtY29sb3Itcm93XCI+JyArIGJ1dHRvbnMuam9pbignJykgKyAnPC9kaXY+Jyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0JHBhbGV0dGUuaHRtbChwYWxldHRlQ29udGVudHMuam9pbignJykpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNyZWF0ZSBzdW1tZXJub3RlIGxheW91dCAoYWlyIG1vZGUpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGhvbGRlclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICovXG5cdFx0dGhpcy5jcmVhdGVMYXlvdXRCeUFpck1vZGUgPSBmdW5jdGlvbiAoJGhvbGRlciwgb3B0aW9ucykge1xuXHRcdFx0dmFyIGxhbmdJbmZvID0gb3B0aW9ucy5sYW5nSW5mbztcblx0XHRcdHZhciBrZXlNYXAgPSBvcHRpb25zLmtleU1hcFthZ2VudC5pc01hYyA/ICdtYWMnIDogJ3BjJ107XG5cdFx0XHR2YXIgaWQgPSBmdW5jLnVuaXF1ZUlkKCk7XG5cblx0XHRcdCRob2xkZXIuYWRkQ2xhc3MoJ25vdGUtYWlyLWVkaXRvciBub3RlLWVkaXRhYmxlJyk7XG5cdFx0XHQkaG9sZGVyLmF0dHIoe1xuXHRcdFx0XHQnaWQnOiAnbm90ZS1lZGl0b3ItJyArIGlkLFxuXHRcdFx0XHQnY29udGVudEVkaXRhYmxlJzogdHJ1ZVxuXHRcdFx0fSk7XG5cblx0XHRcdHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcblxuXHRcdFx0Ly8gY3JlYXRlIFBvcG92ZXJcblx0XHRcdHZhciAkcG9wb3ZlciA9ICQodHBsUG9wb3ZlcnMobGFuZ0luZm8sIG9wdGlvbnMpKTtcblx0XHRcdCRwb3BvdmVyLmFkZENsYXNzKCdub3RlLWFpci1sYXlvdXQnKTtcblx0XHRcdCRwb3BvdmVyLmF0dHIoJ2lkJywgJ25vdGUtcG9wb3Zlci0nICsgaWQpO1xuXHRcdFx0JHBvcG92ZXIuYXBwZW5kVG8oYm9keSk7XG5cdFx0XHRjcmVhdGVUb29sdGlwKCRwb3BvdmVyLCBrZXlNYXApO1xuXHRcdFx0Y3JlYXRlUGFsZXR0ZSgkcG9wb3Zlciwgb3B0aW9ucyk7XG5cblx0XHRcdC8vIGNyZWF0ZSBIYW5kbGVcblx0XHRcdHZhciAkaGFuZGxlID0gJCh0cGxIYW5kbGVzKCkpO1xuXHRcdFx0JGhhbmRsZS5hZGRDbGFzcygnbm90ZS1haXItbGF5b3V0Jyk7XG5cdFx0XHQkaGFuZGxlLmF0dHIoJ2lkJywgJ25vdGUtaGFuZGxlLScgKyBpZCk7XG5cdFx0XHQkaGFuZGxlLmFwcGVuZFRvKGJvZHkpO1xuXG5cdFx0XHQvLyBjcmVhdGUgRGlhbG9nXG5cdFx0XHR2YXIgJGRpYWxvZyA9ICQodHBsRGlhbG9ncyhsYW5nSW5mbywgb3B0aW9ucykpO1xuXHRcdFx0JGRpYWxvZy5hZGRDbGFzcygnbm90ZS1haXItbGF5b3V0Jyk7XG5cdFx0XHQkZGlhbG9nLmF0dHIoJ2lkJywgJ25vdGUtZGlhbG9nLScgKyBpZCk7XG5cdFx0XHQkZGlhbG9nLmZpbmQoJ2J1dHRvbi5jbG9zZSwgYS5tb2RhbC1jbG9zZScpLmNsaWNrKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0JCh0aGlzKS5jbG9zZXN0KCcubW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXHRcdFx0fSk7XG5cdFx0XHQkZGlhbG9nLmFwcGVuZFRvKGJvZHkpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBjcmVhdGUgc3VtbWVybm90ZSBsYXlvdXQgKG5vcm1hbCBtb2RlKVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRob2xkZXJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHRcdCAqL1xuXHRcdHRoaXMuY3JlYXRlTGF5b3V0QnlGcmFtZSA9IGZ1bmN0aW9uICgkaG9sZGVyLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgbGFuZ0luZm8gPSBvcHRpb25zLmxhbmdJbmZvO1xuXG5cdFx0XHR2YXIgaXNDb250ZW50RWRpdGFibGUgPSAhJGhvbGRlci5pcygnOmRpc2FibGVkJyk7XG5cblx0XHRcdC8vMDEuIGNyZWF0ZSBFZGl0b3Jcblx0XHRcdHZhciAkZWRpdG9yID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtZWRpdG9yIGVkaXRhYmxlLScgKyBpc0NvbnRlbnRFZGl0YWJsZSArICdcIj48L2Rpdj4nKTtcblx0XHRcdGlmIChvcHRpb25zLndpZHRoKSB7XG5cdFx0XHRcdCRlZGl0b3Iud2lkdGgob3B0aW9ucy53aWR0aCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vMDIuIHN0YXR1c2JhciAocmVzaXplYmFyKVxuXHRcdFx0aWYgKG9wdGlvbnMuaGVpZ2h0ID4gMCkge1xuXHRcdFx0XHQkKCc8ZGl2IGNsYXNzPVwibm90ZS1zdGF0dXNiYXJcIj4nICsgKG9wdGlvbnMuZGlzYWJsZVJlc2l6ZUVkaXRvciA/ICcnIDogdHBsU3RhdHVzYmFyKCkpICsgJzwvZGl2PicpLnByZXBlbmRUbygkZWRpdG9yKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8wMy4gY3JlYXRlIEVkaXRhYmxlXG5cblx0XHRcdHZhciAkZWRpdGFibGUgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS1lZGl0YWJsZVwiIGNvbnRlbnRFZGl0YWJsZT1cIicgKyBpc0NvbnRlbnRFZGl0YWJsZSArICdcIj48L2Rpdj4nKVxuXHRcdFx0XHQucHJlcGVuZFRvKCRlZGl0b3IpO1xuXHRcdFx0aWYgKG9wdGlvbnMuaGVpZ2h0KSB7XG5cdFx0XHRcdCRlZGl0YWJsZS5oZWlnaHQob3B0aW9ucy5oZWlnaHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9wdGlvbnMuZGlyZWN0aW9uKSB7XG5cdFx0XHRcdCRlZGl0YWJsZS5hdHRyKCdkaXInLCBvcHRpb25zLmRpcmVjdGlvbik7XG5cdFx0XHR9XG5cdFx0XHR2YXIgcGxhY2Vob2xkZXIgPSAkaG9sZGVyLmF0dHIoJ3BsYWNlaG9sZGVyJykgfHwgb3B0aW9ucy5wbGFjZWhvbGRlcjtcblx0XHRcdGlmIChwbGFjZWhvbGRlcikge1xuXHRcdFx0XHQkZWRpdGFibGUuYXR0cignZGF0YS1wbGFjZWhvbGRlcicsIHBsYWNlaG9sZGVyKTtcblx0XHRcdH1cblxuXHRcdFx0JGVkaXRhYmxlLmh0bWwoZG9tLmh0bWwoJGhvbGRlcikpO1xuXG5cdFx0XHQvLzAzMS4gY3JlYXRlIGNvZGFibGVcblx0XHRcdCQoJzx0ZXh0YXJlYSBjbGFzcz1cIm5vdGUtY29kYWJsZVwiPjwvdGV4dGFyZWE+JykucHJlcGVuZFRvKCRlZGl0b3IpO1xuXG5cdFx0XHQvLzA0LiBjcmVhdGUgVG9vbGJhclxuXHRcdFx0dmFyICR0b29sYmFyID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtdG9vbGJhciBidG4tdG9vbGJhclwiIC8+Jyk7XG5cdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLnRvb2xiYXIubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHRcdHZhciBncm91cE5hbWUgPSBvcHRpb25zLnRvb2xiYXJbaWR4XVswXTtcblx0XHRcdFx0dmFyIGdyb3VwQnV0dG9ucyA9IG9wdGlvbnMudG9vbGJhcltpZHhdWzFdO1xuXG5cdFx0XHRcdHZhciAkZ3JvdXAgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS0nICsgZ3JvdXBOYW1lICsgJyBidG4tZ3JvdXBcIiAvPicpO1xuXHRcdFx0XHRmb3IgKHZhciBpID0gMCwgYnRuTGVuZ3RoID0gZ3JvdXBCdXR0b25zLmxlbmd0aDsgaSA8IGJ0bkxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0dmFyIGJ1dHRvbkluZm8gPSB0cGxCdXR0b25JbmZvW2dyb3VwQnV0dG9uc1tpXV07XG5cdFx0XHRcdFx0Ly8gY29udGludWUgY3JlYXRpbmcgdG9vbGJhciBldmVuIGlmIGEgYnV0dG9uIGRvZXNuJ3QgZXhpc3Rcblx0XHRcdFx0XHRpZiAoISQuaXNGdW5jdGlvbihidXR0b25JbmZvKSkgeyBjb250aW51ZTsgfVxuXG5cdFx0XHRcdFx0dmFyICRidXR0b24gPSAkKGJ1dHRvbkluZm8obGFuZ0luZm8sIG9wdGlvbnMpKTtcblx0XHRcdFx0XHQkYnV0dG9uLmF0dHIoJ2RhdGEtbmFtZScsIGdyb3VwQnV0dG9uc1tpXSk7ICAvLyBzZXQgYnV0dG9uJ3MgYWxpYXMsIGJlY3Vhc2UgdG8gZ2V0IGJ1dHRvbiBlbGVtZW50IGZyb20gJHRvb2xiYXJcblx0XHRcdFx0XHQkZ3JvdXAuYXBwZW5kKCRidXR0b24pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCR0b29sYmFyLmFwcGVuZCgkZ3JvdXApO1xuXHRcdFx0fVxuXG5cdFx0XHQkdG9vbGJhci5wcmVwZW5kVG8oJGVkaXRvcik7XG5cdFx0XHR2YXIga2V5TWFwID0gb3B0aW9ucy5rZXlNYXBbYWdlbnQuaXNNYWMgPyAnbWFjJyA6ICdwYyddO1xuXHRcdFx0Y3JlYXRlUGFsZXR0ZSgkdG9vbGJhciwgb3B0aW9ucyk7XG5cdFx0XHRjcmVhdGVUb29sdGlwKCR0b29sYmFyLCBrZXlNYXAsICdib3R0b20nKTtcblxuXHRcdFx0Ly8wNS4gY3JlYXRlIFBvcG92ZXJcblx0XHRcdHZhciAkcG9wb3ZlciA9ICQodHBsUG9wb3ZlcnMobGFuZ0luZm8sIG9wdGlvbnMpKS5wcmVwZW5kVG8oJGVkaXRvcik7XG5cdFx0XHRjcmVhdGVQYWxldHRlKCRwb3BvdmVyLCBvcHRpb25zKTtcblx0XHRcdGNyZWF0ZVRvb2x0aXAoJHBvcG92ZXIsIGtleU1hcCk7XG5cblx0XHRcdC8vMDYuIGhhbmRsZShjb250cm9sIHNlbGVjdGlvbiwgLi4uKVxuXHRcdFx0JCh0cGxIYW5kbGVzKCkpLnByZXBlbmRUbygkZWRpdG9yKTtcblxuXHRcdFx0Ly8wNy4gY3JlYXRlIERpYWxvZ1xuXHRcdFx0dmFyICRkaWFsb2cgPSAkKHRwbERpYWxvZ3MobGFuZ0luZm8sIG9wdGlvbnMpKS5wcmVwZW5kVG8oJGVkaXRvcik7XG5cdFx0XHQkZGlhbG9nLmZpbmQoJ2J1dHRvbi5jbG9zZSwgYS5tb2RhbC1jbG9zZScpLmNsaWNrKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0JCh0aGlzKS5jbG9zZXN0KCcubW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vMDguIGNyZWF0ZSBEcm9wem9uZVxuXHRcdFx0JCgnPGRpdiBjbGFzcz1cIm5vdGUtZHJvcHpvbmVcIj48ZGl2IGNsYXNzPVwibm90ZS1kcm9wem9uZS1tZXNzYWdlXCI+PC9kaXY+PC9kaXY+JykucHJlcGVuZFRvKCRlZGl0b3IpO1xuXG5cdFx0XHQvLzA5LiBFZGl0b3IvSG9sZGVyIHN3aXRjaFxuXHRcdFx0JGVkaXRvci5pbnNlcnRBZnRlcigkaG9sZGVyKTtcblx0XHRcdCRob2xkZXIuaGlkZSgpO1xuXHRcdH07XG5cblx0XHR0aGlzLmhhc05vdGVFZGl0b3IgPSBmdW5jdGlvbiAoJGhvbGRlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMubm90ZUVkaXRvckZyb21Ib2xkZXIoJGhvbGRlcikubGVuZ3RoID4gMDtcblx0XHR9O1xuXG5cdFx0dGhpcy5ub3RlRWRpdG9yRnJvbUhvbGRlciA9IGZ1bmN0aW9uICgkaG9sZGVyKSB7XG5cdFx0XHRpZiAoJGhvbGRlci5oYXNDbGFzcygnbm90ZS1haXItZWRpdG9yJykpIHtcblx0XHRcdFx0cmV0dXJuICRob2xkZXI7XG5cdFx0XHR9IGVsc2UgaWYgKCRob2xkZXIubmV4dCgpLmhhc0NsYXNzKCdub3RlLWVkaXRvcicpKSB7XG5cdFx0XHRcdHJldHVybiAkaG9sZGVyLm5leHQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiAkKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNyZWF0ZSBzdW1tZXJub3RlIGxheW91dFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRob2xkZXJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHRcdCAqL1xuXHRcdHRoaXMuY3JlYXRlTGF5b3V0ID0gZnVuY3Rpb24gKCRob2xkZXIsIG9wdGlvbnMpIHtcblx0XHRcdGlmIChvcHRpb25zLmFpck1vZGUpIHtcblx0XHRcdFx0dGhpcy5jcmVhdGVMYXlvdXRCeUFpck1vZGUoJGhvbGRlciwgb3B0aW9ucyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmNyZWF0ZUxheW91dEJ5RnJhbWUoJGhvbGRlciwgb3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgbGF5b3V0SW5mbyBmcm9tIGhvbGRlclxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRob2xkZXIgLSBwbGFjZWhvbGRlclxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLmxheW91dEluZm9Gcm9tSG9sZGVyID0gZnVuY3Rpb24gKCRob2xkZXIpIHtcblx0XHRcdHZhciAkZWRpdG9yID0gdGhpcy5ub3RlRWRpdG9yRnJvbUhvbGRlcigkaG9sZGVyKTtcblx0XHRcdGlmICghJGVkaXRvci5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBjb25uZWN0ICRob2xkZXIgdG8gJGVkaXRvclxuXHRcdFx0JGVkaXRvci5kYXRhKCdob2xkZXInLCAkaG9sZGVyKTtcblxuXHRcdFx0cmV0dXJuIGRvbS5idWlsZExheW91dEluZm8oJGVkaXRvcik7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJlbW92ZUxheW91dFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRob2xkZXIgLSBwbGFjZWhvbGRlclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKlxuXHRcdCAqL1xuXHRcdHRoaXMucmVtb3ZlTGF5b3V0ID0gZnVuY3Rpb24gKCRob2xkZXIsIGxheW91dEluZm8sIG9wdGlvbnMpIHtcblx0XHRcdGlmIChvcHRpb25zLmFpck1vZGUpIHtcblx0XHRcdFx0JGhvbGRlci5yZW1vdmVDbGFzcygnbm90ZS1haXItZWRpdG9yIG5vdGUtZWRpdGFibGUnKVxuXHRcdFx0XHRcdCAgIC5yZW1vdmVBdHRyKCdpZCBjb250ZW50RWRpdGFibGUnKTtcblxuXHRcdFx0XHRsYXlvdXRJbmZvLnBvcG92ZXIoKS5yZW1vdmUoKTtcblx0XHRcdFx0bGF5b3V0SW5mby5oYW5kbGUoKS5yZW1vdmUoKTtcblx0XHRcdFx0bGF5b3V0SW5mby5kaWFsb2coKS5yZW1vdmUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCRob2xkZXIuaHRtbChsYXlvdXRJbmZvLmVkaXRhYmxlKCkuaHRtbCgpKTtcblxuXHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRvcigpLnJlbW92ZSgpO1xuXHRcdFx0XHQkaG9sZGVyLnNob3coKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICogQHJldHVybiB7ZnVuY3Rpb24obGFiZWwsIG9wdGlvbnM9KTpzdHJpbmd9IHJldHVybi5idXR0b24ge0BsaW5rICN0cGxCdXR0b24gZnVuY3Rpb24gdG8gbWFrZSB0ZXh0IGJ1dHRvbn1cblx0XHQgKiBAcmV0dXJuIHtmdW5jdGlvbihpY29uQ2xhc3MsIG9wdGlvbnM9KTpzdHJpbmd9IHJldHVybi5pY29uQnV0dG9uIHtAbGluayAjdHBsSWNvbkJ1dHRvbiBmdW5jdGlvbiB0byBtYWtlIGljb24gYnV0dG9ufVxuXHRcdCAqIEByZXR1cm4ge2Z1bmN0aW9uKGNsYXNzTmFtZSwgdGl0bGU9LCBib2R5PSwgZm9vdGVyPSk6c3RyaW5nfSByZXR1cm4uZGlhbG9nIHtAbGluayAjdHBsRGlhbG9nIGZ1bmN0aW9uIHRvIG1ha2UgZGlhbG9nfVxuXHRcdCAqL1xuXHRcdHRoaXMuZ2V0VGVtcGxhdGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRidXR0b246IHRwbEJ1dHRvbixcblx0XHRcdFx0aWNvbkJ1dHRvbjogdHBsSWNvbkJ1dHRvbixcblx0XHRcdFx0ZGlhbG9nOiB0cGxEaWFsb2dcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGFkZCBidXR0b24gaW5mb3JtYXRpb25cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGJ1dHRvbiBuYW1lXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gYnV0dG9uSW5mbyBmdW5jdGlvbiB0byBtYWtlIGJ1dHRvbiwgcmVmZXJlbmNlIHRvIHtAbGluayAjdHBsQnV0dG9ufSx7QGxpbmsgI3RwbEljb25CdXR0b259XG5cdFx0ICovXG5cdFx0dGhpcy5hZGRCdXR0b25JbmZvID0gZnVuY3Rpb24gKG5hbWUsIGJ1dHRvbkluZm8pIHtcblx0XHRcdHRwbEJ1dHRvbkluZm9bbmFtZV0gPSBidXR0b25JbmZvO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZGlhbG9nSW5mbyBmdW5jdGlvbiB0byBtYWtlIGRpYWxvZywgcmVmZXJlbmNlIHRvIHtAbGluayAjdHBsRGlhbG9nfVxuXHRcdCAqL1xuXHRcdHRoaXMuYWRkRGlhbG9nSW5mbyA9IGZ1bmN0aW9uIChuYW1lLCBkaWFsb2dJbmZvKSB7XG5cdFx0XHR0cGxEaWFsb2dJbmZvW25hbWVdID0gZGlhbG9nSW5mbztcblx0XHR9O1xuXHR9O1xuXG5cblx0Ly8galF1ZXJ5IG5hbWVzcGFjZSBmb3Igc3VtbWVybm90ZVxuXHQvKipcblx0ICogQGNsYXNzICQuc3VtbWVybm90ZSBcblx0ICogXG5cdCAqIHN1bW1lcm5vdGUgYXR0cmlidXRlICBcblx0ICogXG5cdCAqIEBtaXhpbiBkZWZhdWx0c1xuXHQgKiBAc2luZ2xldG9uICBcblx0ICogXG5cdCAqL1xuXHQkLnN1bW1lcm5vdGUgPSAkLnN1bW1lcm5vdGUgfHwge307XG5cblx0Ly8gZXh0ZW5kcyBkZWZhdWx0IHNldHRpbmdzXG5cdC8vICAtICQuc3VtbWVybm90ZS52ZXJzaW9uXG5cdC8vICAtICQuc3VtbWVybm90ZS5vcHRpb25zXG5cdC8vICAtICQuc3VtbWVybm90ZS5sYW5nXG5cdCQuZXh0ZW5kKCQuc3VtbWVybm90ZSwgZGVmYXVsdHMpO1xuXG5cdHZhciByZW5kZXJlciA9IG5ldyBSZW5kZXJlcigpO1xuXHR2YXIgZXZlbnRIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuXG5cdCQuZXh0ZW5kKCQuc3VtbWVybm90ZSwge1xuXHRcdC8qKiBAcHJvcGVydHkge1JlbmRlcmVyfSAqL1xuXHRcdHJlbmRlcmVyOiByZW5kZXJlcixcblx0XHQvKiogQHByb3BlcnR5IHtFdmVudEhhbmRsZXJ9ICovXG5cdFx0ZXZlbnRIYW5kbGVyOiBldmVudEhhbmRsZXIsXG5cdFx0LyoqIFxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb3JlIFxuXHRcdCAqIEBwcm9wZXJ0eSB7Y29yZS5hZ2VudH0gY29yZS5hZ2VudCBcblx0XHQgKiBAcHJvcGVydHkge2NvcmUuZG9tfSBjb3JlLmRvbVxuXHRcdCAqIEBwcm9wZXJ0eSB7Y29yZS5yYW5nZX0gY29yZS5yYW5nZSBcblx0XHQgKi9cblx0XHRjb3JlOiB7XG5cdFx0XHRhZ2VudDogYWdlbnQsXG5cdFx0XHRkb206IGRvbSxcblx0XHRcdHJhbmdlOiByYW5nZVxuXHRcdH0sXG5cdFx0LyoqIFxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBcblx0XHQgKiBwbHVnaW5FdmVudHMgZXZlbnQgbGlzdCBmb3IgcGx1Z2luc1xuXHRcdCAqIGV2ZW50IGhhcyBuYW1lIGFuZCBjYWxsYmFjayBmdW5jdGlvbi5cblx0XHQgKiBcblx0XHQgKiBgYGAgXG5cdFx0ICogJC5zdW1tZXJub3RlLmFkZFBsdWdpbih7XG5cdFx0ICogICAgIGV2ZW50cyA6IHtcblx0XHQgKiAgICAgICAgICAnaGVsbG8nIDogZnVuY3Rpb24obGF5b3V0SW5mbywgdmFsdWUsICR0YXJnZXQpIHtcblx0XHQgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2V2ZW50IG5hbWUgaXMgaGVsbG8sIHZhbHVlIGlzICcgKyB2YWx1ZSApO1xuXHRcdCAqICAgICAgICAgIH1cblx0XHQgKiAgICAgfSAgICAgXG5cdFx0ICogfSlcblx0XHQgKiBgYGBcblx0XHQgKiBcblx0XHQgKiAqIGV2ZW50IG5hbWUgaXMgZGF0YS1ldmVudCBwcm9wZXJ0eS5cblx0XHQgKiAqIGxheW91dEluZm8gaXMgYSBzdW1tZXJub3RlIGxheW91dCBpbmZvcm1hdGlvbi5cblx0XHQgKiAqIHZhbHVlIGlzIGRhdGEtdmFsdWUgcHJvcGVydHkuXG5cdFx0ICovXG5cdFx0cGx1Z2luRXZlbnRzOiB7fSxcblxuXHRcdHBsdWdpbnM6IFtdXG5cdH0pO1xuXG5cdC8qKlxuXHQgKiBAbWV0aG9kIGFkZFBsdWdpblxuXHQgKlxuXHQgKiBhZGQgUGx1Z2luIGluIFN1bW1lcm5vdGUgXG5cdCAqIFxuXHQgKiBTdW1tZXJub3RlIGNhbiBtYWtlIGEgb3duIHBsdWdpbi5cblx0ICpcblx0ICogIyMjIERlZmluZSBwbHVnaW5cblx0ICogYGBgXG5cdCAqIC8vIGdldCB0ZW1wbGF0ZSBmdW5jdGlvbiAgXG5cdCAqIHZhciB0bXBsID0gJC5zdW1tZXJub3RlLnJlbmRlcmVyLmdldFRlbXBsYXRlKCk7XG5cdCAqIFxuXHQgKiAvLyBhZGQgYSBidXR0b24gICBcblx0ICogJC5zdW1tZXJub3RlLmFkZFBsdWdpbih7XG5cdCAqICAgICBidXR0b25zIDoge1xuXHQgKiAgICAgICAgLy8gXCJoZWxsb1wiICBpcyBidXR0b24ncyBuYW1lc3BhY2UuICAgICAgXG5cdCAqICAgICAgICBcImhlbGxvXCIgOiBmdW5jdGlvbihsYW5nLCBvcHRpb25zKSB7XG5cdCAqICAgICAgICAgICAgLy8gbWFrZSBpY29uIGJ1dHRvbiBieSB0ZW1wbGF0ZSBmdW5jdGlvbiAgICAgICAgICBcblx0ICogICAgICAgICAgICByZXR1cm4gdG1wbC5pY29uQnV0dG9uKCdmYSBmYS1oZWFkZXInLCB7XG5cdCAqICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIG5hbWUgd2hlbiBidXR0b24gY2xpY2tlZCBcblx0ICogICAgICAgICAgICAgICAgZXZlbnQgOiAnaGVsbG8nLFxuXHQgKiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YS12YWx1ZSBwcm9wZXJ0eSAgICAgICAgICAgICAgICAgXG5cdCAqICAgICAgICAgICAgICAgIHZhbHVlIDogJ2hlbGxvJywgICAgICAgICAgICAgICAgXG5cdCAqICAgICAgICAgICAgICAgIGhpZGUgOiB0cnVlXG5cdCAqICAgICAgICAgICAgfSk7ICAgICAgICAgICBcblx0ICogICAgICAgIH1cblx0ICogICAgIFxuXHQgKiAgICAgfSwgXG5cdCAqICAgICBcblx0ICogICAgIGV2ZW50cyA6IHtcblx0ICogICAgICAgIFwiaGVsbG9cIiA6IGZ1bmN0aW9uKGxheW91dEluZm8sIHZhbHVlKSB7XG5cdCAqICAgICAgICAgICAgLy8gaGVyZSBpcyBldmVudCBjb2RlIFxuXHQgKiAgICAgICAgfVxuXHQgKiAgICAgfSAgICAgXG5cdCAqIH0pO1xuXHQgKiBgYGAgXG5cdCAqICMjIyBVc2UgYSBwbHVnaW4gaW4gdG9vbGJhclxuXHQgKiBcblx0ICogYGBgIFxuXHQgKiAgICAkKFwiI2VkaXRvclwiKS5zdW1tZXJub3RlKHtcblx0ICogICAgLi4uXG5cdCAqICAgIHRvb2xiYXIgOiBbXG5cdCAqICAgICAgICAvLyBkaXNwbGF5IGhlbGxvIHBsdWdpbiBpbiB0b29sYmFyICAgICBcblx0ICogICAgICAgIFsnZ3JvdXAnLCBbICdoZWxsbycgXV1cblx0ICogICAgXVxuXHQgKiAgICAuLi4gICAgXG5cdCAqICAgIH0pO1xuXHQgKiBgYGBcblx0ICogIFxuXHQgKiAgXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBwbHVnaW5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwbHVnaW4uYnV0dG9uc10gZGVmaW5lIHBsdWdpbiBidXR0b24uIGZvciBkZXRhaWwsIHNlZSB0byBSZW5kZXJlci5hZGRCdXR0b25JbmZvXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGx1Z2luLmRpYWxvZ3NdIGRlZmluZSBwbHVnaW4gZGlhbG9nLiBmb3IgZGV0YWlsLCBzZWUgdG8gUmVuZGVyZXIuYWRkRGlhbG9nSW5mb1xuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BsdWdpbi5ldmVudHNdIGFkZCBldmVudCBpbiAkLnN1bW1lcm5vdGUucGx1Z2luRXZlbnRzIFxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BsdWdpbi5sYW5nc10gdXBkYXRlICQuc3VtbWVybm90ZS5sYW5nXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGx1Z2luLm9wdGlvbnNdIHVwZGF0ZSAkLnN1bW1lcm5vdGUub3B0aW9uc1xuXHQgKi9cblx0JC5zdW1tZXJub3RlLmFkZFBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4pIHtcblxuXHRcdC8vIHNhdmUgcGx1Z2luIGxpc3Rcblx0XHQkLnN1bW1lcm5vdGUucGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cblx0XHRpZiAocGx1Z2luLmJ1dHRvbnMpIHtcblx0XHRcdCQuZWFjaChwbHVnaW4uYnV0dG9ucywgZnVuY3Rpb24gKG5hbWUsIGJ1dHRvbikge1xuXHRcdFx0XHRyZW5kZXJlci5hZGRCdXR0b25JbmZvKG5hbWUsIGJ1dHRvbik7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAocGx1Z2luLmRpYWxvZ3MpIHtcblx0XHRcdCQuZWFjaChwbHVnaW4uZGlhbG9ncywgZnVuY3Rpb24gKG5hbWUsIGRpYWxvZykge1xuXHRcdFx0XHRyZW5kZXJlci5hZGREaWFsb2dJbmZvKG5hbWUsIGRpYWxvZyk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAocGx1Z2luLmV2ZW50cykge1xuXHRcdFx0JC5lYWNoKHBsdWdpbi5ldmVudHMsIGZ1bmN0aW9uIChuYW1lLCBldmVudCkge1xuXHRcdFx0XHQkLnN1bW1lcm5vdGUucGx1Z2luRXZlbnRzW25hbWVdID0gZXZlbnQ7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAocGx1Z2luLmxhbmdzKSB7XG5cdFx0XHQkLmVhY2gocGx1Z2luLmxhbmdzLCBmdW5jdGlvbiAobG9jYWxlLCBsYW5nKSB7XG5cdFx0XHRcdGlmICgkLnN1bW1lcm5vdGUubGFuZ1tsb2NhbGVdKSB7XG5cdFx0XHRcdFx0JC5leHRlbmQoJC5zdW1tZXJub3RlLmxhbmdbbG9jYWxlXSwgbGFuZyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChwbHVnaW4ub3B0aW9ucykge1xuXHRcdFx0JC5leHRlbmQoJC5zdW1tZXJub3RlLm9wdGlvbnMsIHBsdWdpbi5vcHRpb25zKTtcblx0XHR9XG5cdH07XG5cblx0Lypcblx0ICogZXh0ZW5kICQuZm5cblx0ICovXG5cdCQuZm4uZXh0ZW5kKHtcblx0XHQvKipcblx0XHQgKiBAbWV0aG9kXG5cdFx0ICogSW5pdGlhbGl6ZSBzdW1tZXJub3RlXG5cdFx0ICogIC0gY3JlYXRlIGVkaXRvciBsYXlvdXQgYW5kIGF0dGFjaCBNb3VzZSBhbmQga2V5Ym9hcmQgZXZlbnRzLlxuXHRcdCAqIFxuXHRcdCAqIGBgYFxuXHRcdCAqICQoXCIjc3VtbWVybm90ZVwiKS5zdW1tZXJub3RlKCB7IG9wdGlvbnMgLi59ICk7XG5cdFx0ICogYGBgXG5cdFx0ICogICBcblx0XHQgKiBAbWVtYmVyICQuZm5cblx0XHQgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnMgcmVmZXJlbmNlIHRvICQuc3VtbWVybm90ZS5vcHRpb25zXG5cdFx0ICogQHJldHVybiB7dGhpc31cblx0XHQgKi9cblx0XHRzdW1tZXJub3RlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHQvLyBjaGVjayBmaXJzdCBhcmd1bWVudCdzIHR5cGVcblx0XHRcdC8vICAtIHtTdHJpbmd9OiBFeHRlcm5hbCBBUEkgY2FsbCB7e21vZHVsZX19Lnt7bWV0aG9kfX1cblx0XHRcdC8vICAtIHtPYmplY3R9OiBpbml0IG9wdGlvbnNcblx0XHRcdHZhciB0eXBlID0gJC50eXBlKGxpc3QuaGVhZChhcmd1bWVudHMpKTtcblx0XHRcdHZhciBpc0V4dGVybmFsQVBJQ2FsbGVkID0gdHlwZSA9PT0gJ3N0cmluZyc7XG5cdFx0XHR2YXIgaXNJbml0T3B0aW9ucyA9IHR5cGUgPT09ICdvYmplY3QnO1xuXG5cdFx0XHQvLyBleHRlbmQgZGVmYXVsdCBvcHRpb25zIHdpdGggY3VzdG9tIHVzZXIgb3B0aW9uc1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBpc0luaXRPcHRpb25zID8gbGlzdC5oZWFkKGFyZ3VtZW50cykgOiB7fTtcblx0XHRcdG9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5zdW1tZXJub3RlLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG5cdFx0XHQvLyBJbmNsdWRlIGxhbmdJbmZvIGluIG9wdGlvbnMgZm9yIGxhdGVyIHVzZSwgZS5nLiBmb3IgaW1hZ2UgZHJhZy1uLWRyb3Bcblx0XHRcdC8vIFNldHVwIGxhbmd1YWdlIGluZm8gd2l0aCBlbi1VUyBhcyBkZWZhdWx0XG5cdFx0XHRvcHRpb25zLmxhbmdJbmZvID0gJC5leHRlbmQodHJ1ZSwge30sICQuc3VtbWVybm90ZS5sYW5nWydlbi1VUyddLCAkLnN1bW1lcm5vdGUubGFuZ1tvcHRpb25zLmxhbmddKTtcblxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uIChpZHgsIGhvbGRlcikge1xuXHRcdFx0XHR2YXIgJGhvbGRlciA9ICQoaG9sZGVyKTtcblxuXHRcdFx0XHQvLyBpZiBsYXlvdXQgaXNuJ3QgY3JlYXRlZCB5ZXQsIGNyZWF0ZUxheW91dCBhbmQgYXR0YWNoIGV2ZW50c1xuXHRcdFx0XHRpZiAoIXJlbmRlcmVyLmhhc05vdGVFZGl0b3IoJGhvbGRlcikpIHtcblx0XHRcdFx0XHRyZW5kZXJlci5jcmVhdGVMYXlvdXQoJGhvbGRlciwgb3B0aW9ucyk7XG5cblx0XHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IHJlbmRlcmVyLmxheW91dEluZm9Gcm9tSG9sZGVyKCRob2xkZXIpO1xuXG5cdFx0XHRcdFx0ZXZlbnRIYW5kbGVyLmF0dGFjaChsYXlvdXRJbmZvLCBvcHRpb25zKTtcblx0XHRcdFx0XHRldmVudEhhbmRsZXIuYXR0YWNoQ3VzdG9tRXZlbnQobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIGNhbGxiYWNrIG9uIGluaXRcblx0XHRcdGlmICghaXNFeHRlcm5hbEFQSUNhbGxlZCAmJiB0aGlzLmxlbmd0aCAmJiBvcHRpb25zLm9uaW5pdCkge1xuXHRcdFx0XHRvcHRpb25zLm9uaW5pdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgJGZpcnN0ID0gdGhpcy5maXJzdCgpO1xuXHRcdFx0aWYgKCRmaXJzdC5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGxheW91dEluZm8gPSByZW5kZXJlci5sYXlvdXRJbmZvRnJvbUhvbGRlcigkZmlyc3QpO1xuXG5cdFx0XHRcdC8vIGV4dGVybmFsIEFQSVxuXHRcdFx0XHRpZiAoaXNFeHRlcm5hbEFQSUNhbGxlZCkge1xuXHRcdFx0XHRcdHZhciBtb2R1bGVBbmRNZXRob2QgPSBsaXN0LmhlYWQobGlzdC5mcm9tKGFyZ3VtZW50cykpO1xuXHRcdFx0XHRcdHZhciBhcmdzID0gbGlzdC50YWlsKGxpc3QuZnJvbShhcmd1bWVudHMpKTtcblxuXHRcdFx0XHRcdC8vIFRPRE8gbm93IGV4dGVybmFsIEFQSSBvbmx5IHdvcmtzIGZvciBlZGl0b3Jcblx0XHRcdFx0XHR2YXIgcGFyYW1zID0gW21vZHVsZUFuZE1ldGhvZCwgbGF5b3V0SW5mby5lZGl0YWJsZSgpXS5jb25jYXQoYXJncyk7XG5cdFx0XHRcdFx0cmV0dXJuIGV2ZW50SGFuZGxlci5pbnZva2UuYXBwbHkoZXZlbnRIYW5kbGVyLCBwYXJhbXMpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9wdGlvbnMuZm9jdXMpIHtcblx0XHRcdFx0XHQvLyBmb2N1cyBvbiBmaXJzdCBlZGl0YWJsZSBlbGVtZW50IGZvciBpbml0aWFsaXplIGVkaXRvclxuXHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIFxuXHRcdCAqIFxuXHRcdCAqIGdldCB0aGUgSFRNTCBjb250ZW50cyBvZiBub3RlIG9yIHNldCB0aGUgSFRNTCBjb250ZW50cyBvZiBub3RlLlxuXHRcdCAqXG5cdFx0ICogKiBnZXQgY29udGVudHMgXG5cdFx0ICogYGBgXG5cdFx0ICogdmFyIGNvbnRlbnQgPSAkKFwiI3N1bW1lcm5vdGVcIikuY29kZSgpO1xuXHRcdCAqIGBgYFxuXHRcdCAqICogc2V0IGNvbnRlbnRzIFxuXHRcdCAqXG5cdFx0ICogYGBgXG5cdFx0ICogJChcIiNzdW1tZXJub3RlXCIpLmNvZGUoaHRtbCk7XG5cdFx0ICogYGBgXG5cdFx0ICpcblx0XHQgKiBAbWVtYmVyICQuZm4gXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtodG1sXSAtIEhUTUwgY29udGVudHMob3B0aW9uYWwsIHNldClcblx0XHQgKiBAcmV0dXJuIHt0aGlzfFN0cmluZ30gLSBjb250ZXh0KHNldCkgb3IgSFRNTCBjb250ZW50cyBvZiBub3RlKGdldCkuXG5cdFx0ICovXG5cdFx0Y29kZTogZnVuY3Rpb24gKGh0bWwpIHtcblx0XHRcdC8vIGdldCB0aGUgSFRNTCBjb250ZW50cyBvZiBub3RlXG5cdFx0XHRpZiAoaHRtbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHZhciAkaG9sZGVyID0gdGhpcy5maXJzdCgpO1xuXHRcdFx0XHRpZiAoISRob2xkZXIubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGxheW91dEluZm8gPSByZW5kZXJlci5sYXlvdXRJbmZvRnJvbUhvbGRlcigkaG9sZGVyKTtcblx0XHRcdFx0dmFyICRlZGl0YWJsZSA9IGxheW91dEluZm8gJiYgbGF5b3V0SW5mby5lZGl0YWJsZSgpO1xuXG5cdFx0XHRcdGlmICgkZWRpdGFibGUgJiYgJGVkaXRhYmxlLmxlbmd0aCkge1xuXHRcdFx0XHRcdHZhciBpc0NvZGV2aWV3ID0gZXZlbnRIYW5kbGVyLmludm9rZSgnY29kZXZpZXcuaXNBY3RpdmF0ZWQnLCBsYXlvdXRJbmZvKTtcblx0XHRcdFx0XHRldmVudEhhbmRsZXIuaW52b2tlKCdjb2Rldmlldy5zeW5jJywgbGF5b3V0SW5mbyk7XG5cdFx0XHRcdFx0cmV0dXJuIGlzQ29kZXZpZXcgPyBsYXlvdXRJbmZvLmNvZGFibGUoKS52YWwoKSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5odG1sKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGRvbS5pc1RleHRhcmVhKCRob2xkZXJbMF0pID8gJGhvbGRlci52YWwoKSA6ICRob2xkZXIuaHRtbCgpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzZXQgdGhlIEhUTUwgY29udGVudHMgb2Ygbm90ZVxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBob2xkZXIpIHtcblx0XHRcdFx0dmFyIGxheW91dEluZm8gPSByZW5kZXJlci5sYXlvdXRJbmZvRnJvbUhvbGRlcigkKGhvbGRlcikpO1xuXHRcdFx0XHR2YXIgJGVkaXRhYmxlID0gbGF5b3V0SW5mbyAmJiBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cdFx0XHRcdGlmICgkZWRpdGFibGUpIHtcblx0XHRcdFx0XHQkZWRpdGFibGUuaHRtbChodG1sKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kXG5cdFx0ICogXG5cdFx0ICogZGVzdHJveSBFZGl0b3IgTGF5b3V0IGFuZCBkZXRhY2ggS2V5IGFuZCBNb3VzZSBFdmVudFxuXHRcdCAqXG5cdFx0ICogQG1lbWJlciAkLmZuXG5cdFx0ICogQHJldHVybiB7dGhpc31cblx0XHQgKi9cblx0XHRkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24gKGlkeCwgaG9sZGVyKSB7XG5cdFx0XHRcdHZhciAkaG9sZGVyID0gJChob2xkZXIpO1xuXG5cdFx0XHRcdGlmICghcmVuZGVyZXIuaGFzTm90ZUVkaXRvcigkaG9sZGVyKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBpbmZvID0gcmVuZGVyZXIubGF5b3V0SW5mb0Zyb21Ib2xkZXIoJGhvbGRlcik7XG5cdFx0XHRcdHZhciBvcHRpb25zID0gaW5mby5lZGl0b3IoKS5kYXRhKCdvcHRpb25zJyk7XG5cblx0XHRcdFx0ZXZlbnRIYW5kbGVyLmRldGFjaChpbmZvLCBvcHRpb25zKTtcblx0XHRcdFx0cmVuZGVyZXIucmVtb3ZlTGF5b3V0KCRob2xkZXIsIGluZm8sIG9wdGlvbnMpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fSk7XG59KSk7XG5cbn0pLmNhbGwoZ2xvYmFsLCBtb2R1bGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiJdfQ==
},{"jquery":109}],96:[function(require,module,exports){
// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
require('../../js/transition.js')
require('../../js/alert.js')
require('../../js/button.js')
require('../../js/carousel.js')
require('../../js/collapse.js')
require('../../js/dropdown.js')
require('../../js/modal.js')
require('../../js/tooltip.js')
require('../../js/popover.js')
require('../../js/scrollspy.js')
require('../../js/tab.js')
require('../../js/affix.js')
},{"../../js/affix.js":97,"../../js/alert.js":98,"../../js/button.js":99,"../../js/carousel.js":100,"../../js/collapse.js":101,"../../js/dropdown.js":102,"../../js/modal.js":103,"../../js/popover.js":104,"../../js/scrollspy.js":105,"../../js/tab.js":106,"../../js/tooltip.js":107,"../../js/transition.js":108}],97:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: affix.js v3.3.7
 * http://getbootstrap.com/javascript/#affix
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // AFFIX CLASS DEFINITION
  // ======================

  var Affix = function (element, options) {
    this.options = $.extend({}, Affix.DEFAULTS, options)

    this.$target = $(this.options.target)
      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))

    this.$element     = $(element)
    this.affixed      = null
    this.unpin        = null
    this.pinnedOffset = null

    this.checkPosition()
  }

  Affix.VERSION  = '3.3.7'

  Affix.RESET    = 'affix affix-top affix-bottom'

  Affix.DEFAULTS = {
    offset: 0,
    target: window
  }

  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
    var scrollTop    = this.$target.scrollTop()
    var position     = this.$element.offset()
    var targetHeight = this.$target.height()

    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false

    if (this.affixed == 'bottom') {
      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
    }

    var initializing   = this.affixed == null
    var colliderTop    = initializing ? scrollTop : position.top
    var colliderHeight = initializing ? targetHeight : height

    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'

    return false
  }

  Affix.prototype.getPinnedOffset = function () {
    if (this.pinnedOffset) return this.pinnedOffset
    this.$element.removeClass(Affix.RESET).addClass('affix')
    var scrollTop = this.$target.scrollTop()
    var position  = this.$element.offset()
    return (this.pinnedOffset = position.top - scrollTop)
  }

  Affix.prototype.checkPositionWithEventLoop = function () {
    setTimeout($.proxy(this.checkPosition, this), 1)
  }

  Affix.prototype.checkPosition = function () {
    if (!this.$element.is(':visible')) return

    var height       = this.$element.height()
    var offset       = this.options.offset
    var offsetTop    = offset.top
    var offsetBottom = offset.bottom
    var scrollHeight = Math.max($(document).height(), $(document.body).height())

    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)

    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)

    if (this.affixed != affix) {
      if (this.unpin != null) this.$element.css('top', '')

      var affixType = 'affix' + (affix ? '-' + affix : '')
      var e         = $.Event(affixType + '.bs.affix')

      this.$element.trigger(e)

      if (e.isDefaultPrevented()) return

      this.affixed = affix
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null

      this.$element
        .removeClass(Affix.RESET)
        .addClass(affixType)
        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
    }

    if (affix == 'bottom') {
      this.$element.offset({
        top: scrollHeight - height - offsetBottom
      })
    }
  }


  // AFFIX PLUGIN DEFINITION
  // =======================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.affix')
      var options = typeof option == 'object' && option

      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.affix

  $.fn.affix             = Plugin
  $.fn.affix.Constructor = Affix


  // AFFIX NO CONFLICT
  // =================

  $.fn.affix.noConflict = function () {
    $.fn.affix = old
    return this
  }


  // AFFIX DATA-API
  // ==============

  $(window).on('load', function () {
    $('[data-spy="affix"]').each(function () {
      var $spy = $(this)
      var data = $spy.data()

      data.offset = data.offset || {}

      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
      if (data.offsetTop    != null) data.offset.top    = data.offsetTop

      Plugin.call($spy, data)
    })
  })

}(jQuery);

},{}],98:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: alert.js v3.3.7
 * http://getbootstrap.com/javascript/#alerts
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // ALERT CLASS DEFINITION
  // ======================

  var dismiss = '[data-dismiss="alert"]'
  var Alert   = function (el) {
    $(el).on('click', dismiss, this.close)
  }

  Alert.VERSION = '3.3.7'

  Alert.TRANSITION_DURATION = 150

  Alert.prototype.close = function (e) {
    var $this    = $(this)
    var selector = $this.attr('data-target')

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }

    var $parent = $(selector === '#' ? [] : selector)

    if (e) e.preventDefault()

    if (!$parent.length) {
      $parent = $this.closest('.alert')
    }

    $parent.trigger(e = $.Event('close.bs.alert'))

    if (e.isDefaultPrevented()) return

    $parent.removeClass('in')

    function removeElement() {
      // detach from parent, fire event then clean up data
      $parent.detach().trigger('closed.bs.alert').remove()
    }

    $.support.transition && $parent.hasClass('fade') ?
      $parent
        .one('bsTransitionEnd', removeElement)
        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
      removeElement()
  }


  // ALERT PLUGIN DEFINITION
  // =======================

  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.alert')

      if (!data) $this.data('bs.alert', (data = new Alert(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }

  var old = $.fn.alert

  $.fn.alert             = Plugin
  $.fn.alert.Constructor = Alert


  // ALERT NO CONFLICT
  // =================

  $.fn.alert.noConflict = function () {
    $.fn.alert = old
    return this
  }


  // ALERT DATA-API
  // ==============

  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)

}(jQuery);

},{}],99:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: button.js v3.3.7
 * http://getbootstrap.com/javascript/#buttons
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // BUTTON PUBLIC CLASS DEFINITION
  // ==============================

  var Button = function (element, options) {
    this.$element  = $(element)
    this.options   = $.extend({}, Button.DEFAULTS, options)
    this.isLoading = false
  }

  Button.VERSION  = '3.3.7'

  Button.DEFAULTS = {
    loadingText: 'loading...'
  }

  Button.prototype.setState = function (state) {
    var d    = 'disabled'
    var $el  = this.$element
    var val  = $el.is('input') ? 'val' : 'html'
    var data = $el.data()

    state += 'Text'

    if (data.resetText == null) $el.data('resetText', $el[val]())

    // push to event loop to allow forms to submit
    setTimeout($.proxy(function () {
      $el[val](data[state] == null ? this.options[state] : data[state])

      if (state == 'loadingText') {
        this.isLoading = true
        $el.addClass(d).attr(d, d).prop(d, true)
      } else if (this.isLoading) {
        this.isLoading = false
        $el.removeClass(d).removeAttr(d).prop(d, false)
      }
    }, this), 0)
  }

  Button.prototype.toggle = function () {
    var changed = true
    var $parent = this.$element.closest('[data-toggle="buttons"]')

    if ($parent.length) {
      var $input = this.$element.find('input')
      if ($input.prop('type') == 'radio') {
        if ($input.prop('checked')) changed = false
        $parent.find('.active').removeClass('active')
        this.$element.addClass('active')
      } else if ($input.prop('type') == 'checkbox') {
        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
        this.$element.toggleClass('active')
      }
      $input.prop('checked', this.$element.hasClass('active'))
      if (changed) $input.trigger('change')
    } else {
      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
      this.$element.toggleClass('active')
    }
  }


  // BUTTON PLUGIN DEFINITION
  // ========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.button')
      var options = typeof option == 'object' && option

      if (!data) $this.data('bs.button', (data = new Button(this, options)))

      if (option == 'toggle') data.toggle()
      else if (option) data.setState(option)
    })
  }

  var old = $.fn.button

  $.fn.button             = Plugin
  $.fn.button.Constructor = Button


  // BUTTON NO CONFLICT
  // ==================

  $.fn.button.noConflict = function () {
    $.fn.button = old
    return this
  }


  // BUTTON DATA-API
  // ===============

  $(document)
    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      var $btn = $(e.target).closest('.btn')
      Plugin.call($btn, 'toggle')
      if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
        e.preventDefault()
        // The target component still receive the focus
        if ($btn.is('input,button')) $btn.trigger('focus')
        else $btn.find('input:visible,button:visible').first().trigger('focus')
      }
    })
    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
    })

}(jQuery);

},{}],100:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: carousel.js v3.3.7
 * http://getbootstrap.com/javascript/#carousel
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // CAROUSEL CLASS DEFINITION
  // =========================

  var Carousel = function (element, options) {
    this.$element    = $(element)
    this.$indicators = this.$element.find('.carousel-indicators')
    this.options     = options
    this.paused      = null
    this.sliding     = null
    this.interval    = null
    this.$active     = null
    this.$items      = null

    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))

    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
  }

  Carousel.VERSION  = '3.3.7'

  Carousel.TRANSITION_DURATION = 600

  Carousel.DEFAULTS = {
    interval: 5000,
    pause: 'hover',
    wrap: true,
    keyboard: true
  }

  Carousel.prototype.keydown = function (e) {
    if (/input|textarea/i.test(e.target.tagName)) return
    switch (e.which) {
      case 37: this.prev(); break
      case 39: this.next(); break
      default: return
    }

    e.preventDefault()
  }

  Carousel.prototype.cycle = function (e) {
    e || (this.paused = false)

    this.interval && clearInterval(this.interval)

    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))

    return this
  }

  Carousel.prototype.getItemIndex = function (item) {
    this.$items = item.parent().children('.item')
    return this.$items.index(item || this.$active)
  }

  Carousel.prototype.getItemForDirection = function (direction, active) {
    var activeIndex = this.getItemIndex(active)
    var willWrap = (direction == 'prev' && activeIndex === 0)
                || (direction == 'next' && activeIndex == (this.$items.length - 1))
    if (willWrap && !this.options.wrap) return active
    var delta = direction == 'prev' ? -1 : 1
    var itemIndex = (activeIndex + delta) % this.$items.length
    return this.$items.eq(itemIndex)
  }

  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))

    if (pos > (this.$items.length - 1) || pos < 0) return

    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
    if (activeIndex == pos) return this.pause().cycle()

    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
  }

  Carousel.prototype.pause = function (e) {
    e || (this.paused = true)

    if (this.$element.find('.next, .prev').length && $.support.transition) {
      this.$element.trigger($.support.transition.end)
      this.cycle(true)
    }

    this.interval = clearInterval(this.interval)

    return this
  }

  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }

  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }

  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
    var $next     = next || this.getItemForDirection(type, $active)
    var isCycling = this.interval
    var direction = type == 'next' ? 'left' : 'right'
    var that      = this

    if ($next.hasClass('active')) return (this.sliding = false)

    var relatedTarget = $next[0]
    var slideEvent = $.Event('slide.bs.carousel', {
      relatedTarget: relatedTarget,
      direction: direction
    })
    this.$element.trigger(slideEvent)
    if (slideEvent.isDefaultPrevented()) return

    this.sliding = true

    isCycling && this.pause()

    if (this.$indicators.length) {
      this.$indicators.find('.active').removeClass('active')
      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
      $nextIndicator && $nextIndicator.addClass('active')
    }

    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
    if ($.support.transition && this.$element.hasClass('slide')) {
      $next.addClass(type)
      $next[0].offsetWidth // force reflow
      $active.addClass(direction)
      $next.addClass(direction)
      $active
        .one('bsTransitionEnd', function () {
          $next.removeClass([type, direction].join(' ')).addClass('active')
          $active.removeClass(['active', direction].join(' '))
          that.sliding = false
          setTimeout(function () {
            that.$element.trigger(slidEvent)
          }, 0)
        })
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
      this.$element.trigger(slidEvent)
    }

    isCycling && this.cycle()

    return this
  }


  // CAROUSEL PLUGIN DEFINITION
  // ==========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.carousel')
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
      var action  = typeof option == 'string' ? option : options.slide

      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
      if (typeof option == 'number') data.to(option)
      else if (action) data[action]()
      else if (options.interval) data.pause().cycle()
    })
  }

  var old = $.fn.carousel

  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel


  // CAROUSEL NO CONFLICT
  // ====================

  $.fn.carousel.noConflict = function () {
    $.fn.carousel = old
    return this
  }


  // CAROUSEL DATA-API
  // =================

  var clickHandler = function (e) {
    var href
    var $this   = $(this)
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
    if (!$target.hasClass('carousel')) return
    var options = $.extend({}, $target.data(), $this.data())
    var slideIndex = $this.attr('data-slide-to')
    if (slideIndex) options.interval = false

    Plugin.call($target, options)

    if (slideIndex) {
      $target.data('bs.carousel').to(slideIndex)
    }

    e.preventDefault()
  }

  $(document)
    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)

  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      Plugin.call($carousel, $carousel.data())
    })
  })

}(jQuery);

},{}],101:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: collapse.js v3.3.7
 * http://getbootstrap.com/javascript/#collapse
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */

/* jshint latedef: false */

+function ($) {
  'use strict';

  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================

  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
    this.transitioning = null

    if (this.options.parent) {
      this.$parent = this.getParent()
    } else {
      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
    }

    if (this.options.toggle) this.toggle()
  }

  Collapse.VERSION  = '3.3.7'

  Collapse.TRANSITION_DURATION = 350

  Collapse.DEFAULTS = {
    toggle: true
  }

  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }

  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return

    var activesData
    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')

    if (actives && actives.length) {
      activesData = actives.data('bs.collapse')
      if (activesData && activesData.transitioning) return
    }

    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return

    if (actives && actives.length) {
      Plugin.call(actives, 'hide')
      activesData || actives.data('bs.collapse', null)
    }

    var dimension = this.dimension()

    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
      .attr('aria-expanded', true)

    this.$trigger
      .removeClass('collapsed')
      .attr('aria-expanded', true)

    this.transitioning = 1

    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
      this.$element
        .trigger('shown.bs.collapse')
    }

    if (!$.support.transition) return complete.call(this)

    var scrollSize = $.camelCase(['scroll', dimension].join('-'))

    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
  }

  Collapse.prototype.hide = function () {
    if (this.transitioning || !this.$element.hasClass('in')) return

    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return

    var dimension = this.dimension()

    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

    this.$element
      .addClass('collapsing')
      .removeClass('collapse in')
      .attr('aria-expanded', false)

    this.$trigger
      .addClass('collapsed')
      .attr('aria-expanded', false)

    this.transitioning = 1

    var complete = function () {
      this.transitioning = 0
      this.$element
        .removeClass('collapsing')
        .addClass('collapse')
        .trigger('hidden.bs.collapse')
    }

    if (!$.support.transition) return complete.call(this)

    this.$element
      [dimension](0)
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
  }

  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }

  Collapse.prototype.getParent = function () {
    return $(this.options.parent)
      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
      .each($.proxy(function (i, element) {
        var $element = $(element)
        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
      }, this))
      .end()
  }

  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
    var isOpen = $element.hasClass('in')

    $element.attr('aria-expanded', isOpen)
    $trigger
      .toggleClass('collapsed', !isOpen)
      .attr('aria-expanded', isOpen)
  }

  function getTargetFromTrigger($trigger) {
    var href
    var target = $trigger.attr('data-target')
      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7

    return $(target)
  }


  // COLLAPSE PLUGIN DEFINITION
  // ==========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.collapse')
      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)

      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.collapse

  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse


  // COLLAPSE NO CONFLICT
  // ====================

  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }


  // COLLAPSE DATA-API
  // =================

  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
    var $this   = $(this)

    if (!$this.attr('data-target')) e.preventDefault()

    var $target = getTargetFromTrigger($this)
    var data    = $target.data('bs.collapse')
    var option  = data ? 'toggle' : $this.data()

    Plugin.call($target, option)
  })

}(jQuery);

},{}],102:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: dropdown.js v3.3.7
 * http://getbootstrap.com/javascript/#dropdowns
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // DROPDOWN CLASS DEFINITION
  // =========================

  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }

  Dropdown.VERSION = '3.3.7'

  function getParent($this) {
    var selector = $this.attr('data-target')

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }

    var $parent = selector && $(selector)

    return $parent && $parent.length ? $parent : $this.parent()
  }

  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
      var $this         = $(this)
      var $parent       = getParent($this)
      var relatedTarget = { relatedTarget: this }

      if (!$parent.hasClass('open')) return

      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return

      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))

      if (e.isDefaultPrevented()) return

      $this.attr('aria-expanded', 'false')
      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
    })
  }

  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)

    if ($this.is('.disabled, :disabled')) return

    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')

    clearMenus()

    if (!isActive) {
      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
        // if mobile we use a backdrop because click events don't delegate
        $(document.createElement('div'))
          .addClass('dropdown-backdrop')
          .insertAfter($(this))
          .on('click', clearMenus)
      }

      var relatedTarget = { relatedTarget: this }
      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))

      if (e.isDefaultPrevented()) return

      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')

      $parent
        .toggleClass('open')
        .trigger($.Event('shown.bs.dropdown', relatedTarget))
    }

    return false
  }

  Dropdown.prototype.keydown = function (e) {
    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return

    var $this = $(this)

    e.preventDefault()
    e.stopPropagation()

    if ($this.is('.disabled, :disabled')) return

    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')

    if (!isActive && e.which != 27 || isActive && e.which == 27) {
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }

    var desc = ' li:not(.disabled):visible a'
    var $items = $parent.find('.dropdown-menu' + desc)

    if (!$items.length) return

    var index = $items.index(e.target)

    if (e.which == 38 && index > 0)                 index--         // up
    if (e.which == 40 && index < $items.length - 1) index++         // down
    if (!~index)                                    index = 0

    $items.eq(index).trigger('focus')
  }


  // DROPDOWN PLUGIN DEFINITION
  // ==========================

  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')

      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }

  var old = $.fn.dropdown

  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown


  // DROPDOWN NO CONFLICT
  // ====================

  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }


  // APPLY TO STANDARD DROPDOWN ELEMENTS
  // ===================================

  $(document)
    .on('click.bs.dropdown.data-api', clearMenus)
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)

}(jQuery);

},{}],103:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: modal.js v3.3.7
 * http://getbootstrap.com/javascript/#modals
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // MODAL CLASS DEFINITION
  // ======================

  var Modal = function (element, options) {
    this.options             = options
    this.$body               = $(document.body)
    this.$element            = $(element)
    this.$dialog             = this.$element.find('.modal-dialog')
    this.$backdrop           = null
    this.isShown             = null
    this.originalBodyPad     = null
    this.scrollbarWidth      = 0
    this.ignoreBackdropClick = false

    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
    }
  }

  Modal.VERSION  = '3.3.7'

  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }

  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }

  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })

    this.$element.trigger(e)

    if (this.isShown || e.isDefaultPrevented()) return

    this.isShown = true

    this.checkScrollbar()
    this.setScrollbar()
    this.$body.addClass('modal-open')

    this.escape()
    this.resize()

    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))

    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
      })
    })

    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')

      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }

      that.$element
        .show()
        .scrollTop(0)

      that.adjustDialog()

      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }

      that.$element.addClass('in')

      that.enforceFocus()

      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })

      transition ?
        that.$dialog // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
        that.$element.trigger('focus').trigger(e)
    })
  }

  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()

    e = $.Event('hide.bs.modal')

    this.$element.trigger(e)

    if (!this.isShown || e.isDefaultPrevented()) return

    this.isShown = false

    this.escape()
    this.resize()

    $(document).off('focusin.bs.modal')

    this.$element
      .removeClass('in')
      .off('click.dismiss.bs.modal')
      .off('mouseup.dismiss.bs.modal')

    this.$dialog.off('mousedown.dismiss.bs.modal')

    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
      this.hideModal()
  }

  Modal.prototype.enforceFocus = function () {
    $(document)
      .off('focusin.bs.modal') // guard against infinite focus loop
      .on('focusin.bs.modal', $.proxy(function (e) {
        if (document !== e.target &&
            this.$element[0] !== e.target &&
            !this.$element.has(e.target).length) {
          this.$element.trigger('focus')
        }
      }, this))
  }

  Modal.prototype.escape = function () {
    if (this.isShown && this.options.keyboard) {
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
      this.$element.off('keydown.dismiss.bs.modal')
    }
  }

  Modal.prototype.resize = function () {
    if (this.isShown) {
      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
    } else {
      $(window).off('resize.bs.modal')
    }
  }

  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
      that.$body.removeClass('modal-open')
      that.resetAdjustments()
      that.resetScrollbar()
      that.$element.trigger('hidden.bs.modal')
    })
  }

  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }

  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''

    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate

      this.$backdrop = $(document.createElement('div'))
        .addClass('modal-backdrop ' + animate)
        .appendTo(this.$body)

      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
        if (this.ignoreBackdropClick) {
          this.ignoreBackdropClick = false
          return
        }
        if (e.target !== e.currentTarget) return
        this.options.backdrop == 'static'
          ? this.$element[0].focus()
          : this.hide()
      }, this))

      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow

      this.$backdrop.addClass('in')

      if (!callback) return

      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        callback()

    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')

      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
      }
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        callbackRemove()

    } else if (callback) {
      callback()
    }
  }

  // these following methods are used to handle overflowing modals

  Modal.prototype.handleUpdate = function () {
    this.adjustDialog()
  }

  Modal.prototype.adjustDialog = function () {
    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight

    this.$element.css({
      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
    })
  }

  Modal.prototype.resetAdjustments = function () {
    this.$element.css({
      paddingLeft: '',
      paddingRight: ''
    })
  }

  Modal.prototype.checkScrollbar = function () {
    var fullWindowWidth = window.innerWidth
    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
      var documentElementRect = document.documentElement.getBoundingClientRect()
      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
    }
    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
    this.scrollbarWidth = this.measureScrollbar()
  }

  Modal.prototype.setScrollbar = function () {
    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
    this.originalBodyPad = document.body.style.paddingRight || ''
    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
  }

  Modal.prototype.resetScrollbar = function () {
    this.$body.css('padding-right', this.originalBodyPad)
  }

  Modal.prototype.measureScrollbar = function () { // thx walsh
    var scrollDiv = document.createElement('div')
    scrollDiv.className = 'modal-scrollbar-measure'
    this.$body.append(scrollDiv)
    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
    this.$body[0].removeChild(scrollDiv)
    return scrollbarWidth
  }


  // MODAL PLUGIN DEFINITION
  // =======================

  function Plugin(option, _relatedTarget) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.modal')
      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)

      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
      if (typeof option == 'string') data[option](_relatedTarget)
      else if (options.show) data.show(_relatedTarget)
    })
  }

  var old = $.fn.modal

  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal


  // MODAL NO CONFLICT
  // =================

  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }


  // MODAL DATA-API
  // ==============

  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
    var $this   = $(this)
    var href    = $this.attr('href')
    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())

    if ($this.is('a')) e.preventDefault()

    $target.one('show.bs.modal', function (showEvent) {
      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
      $target.one('hidden.bs.modal', function () {
        $this.is(':visible') && $this.trigger('focus')
      })
    })
    Plugin.call($target, option, this)
  })

}(jQuery);

},{}],104:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: popover.js v3.3.7
 * http://getbootstrap.com/javascript/#popovers
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================

  var Popover = function (element, options) {
    this.init('popover', element, options)
  }

  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')

  Popover.VERSION  = '3.3.7'

  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
    placement: 'right',
    trigger: 'click',
    content: '',
    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
  })


  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================

  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)

  Popover.prototype.constructor = Popover

  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }

  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()

    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
    ](content)

    $tip.removeClass('fade top bottom left right in')

    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
    // this manually by checking the contents.
    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
  }

  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }

  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options

    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }

  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }


  // POPOVER PLUGIN DEFINITION
  // =========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.popover')
      var options = typeof option == 'object' && option

      if (!data && /destroy|hide/.test(option)) return
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.popover

  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover


  // POPOVER NO CONFLICT
  // ===================

  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }

}(jQuery);

},{}],105:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: scrollspy.js v3.3.7
 * http://getbootstrap.com/javascript/#scrollspy
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // SCROLLSPY CLASS DEFINITION
  // ==========================

  function ScrollSpy(element, options) {
    this.$body          = $(document.body)
    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
    this.selector       = (this.options.target || '') + ' .nav li > a'
    this.offsets        = []
    this.targets        = []
    this.activeTarget   = null
    this.scrollHeight   = 0

    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
    this.refresh()
    this.process()
  }

  ScrollSpy.VERSION  = '3.3.7'

  ScrollSpy.DEFAULTS = {
    offset: 10
  }

  ScrollSpy.prototype.getScrollHeight = function () {
    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
  }

  ScrollSpy.prototype.refresh = function () {
    var that          = this
    var offsetMethod  = 'offset'
    var offsetBase    = 0

    this.offsets      = []
    this.targets      = []
    this.scrollHeight = this.getScrollHeight()

    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }

    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)

        return ($href
          && $href.length
          && $href.is(':visible')
          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
      })
      .sort(function (a, b) { return a[0] - b[0] })
      .each(function () {
        that.offsets.push(this[0])
        that.targets.push(this[1])
      })
  }

  ScrollSpy.prototype.process = function () {
    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
    var scrollHeight = this.getScrollHeight()
    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
    var offsets      = this.offsets
    var targets      = this.targets
    var activeTarget = this.activeTarget
    var i

    if (this.scrollHeight != scrollHeight) {
      this.refresh()
    }

    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }

    if (activeTarget && scrollTop < offsets[0]) {
      this.activeTarget = null
      return this.clear()
    }

    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
        && this.activate(targets[i])
    }
  }

  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target

    this.clear()

    var selector = this.selector +
      '[data-target="' + target + '"],' +
      this.selector + '[href="' + target + '"]'

    var active = $(selector)
      .parents('li')
      .addClass('active')

    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
    }

    active.trigger('activate.bs.scrollspy')
  }

  ScrollSpy.prototype.clear = function () {
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
  }


  // SCROLLSPY PLUGIN DEFINITION
  // ===========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.scrollspy')
      var options = typeof option == 'object' && option

      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.scrollspy

  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy


  // SCROLLSPY NO CONFLICT
  // =====================

  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }


  // SCROLLSPY DATA-API
  // ==================

  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
  })

}(jQuery);

},{}],106:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: tab.js v3.3.7
 * http://getbootstrap.com/javascript/#tabs
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // TAB CLASS DEFINITION
  // ====================

  var Tab = function (element) {
    // jscs:disable requireDollarBeforejQueryAssignment
    this.element = $(element)
    // jscs:enable requireDollarBeforejQueryAssignment
  }

  Tab.VERSION = '3.3.7'

  Tab.TRANSITION_DURATION = 150

  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }

    if ($this.parent('li').hasClass('active')) return

    var $previous = $ul.find('.active:last a')
    var hideEvent = $.Event('hide.bs.tab', {
      relatedTarget: $this[0]
    })
    var showEvent = $.Event('show.bs.tab', {
      relatedTarget: $previous[0]
    })

    $previous.trigger(hideEvent)
    $this.trigger(showEvent)

    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return

    var $target = $(selector)

    this.activate($this.closest('li'), $ul)
    this.activate($target, $target.parent(), function () {
      $previous.trigger({
        type: 'hidden.bs.tab',
        relatedTarget: $this[0]
      })
      $this.trigger({
        type: 'shown.bs.tab',
        relatedTarget: $previous[0]
      })
    })
  }

  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)

    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
          .removeClass('active')
        .end()
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', false)

      element
        .addClass('active')
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', true)

      if (transition) {
        element[0].offsetWidth // reflow for transition
        element.addClass('in')
      } else {
        element.removeClass('fade')
      }

      if (element.parent('.dropdown-menu').length) {
        element
          .closest('li.dropdown')
            .addClass('active')
          .end()
          .find('[data-toggle="tab"]')
            .attr('aria-expanded', true)
      }

      callback && callback()
    }

    $active.length && transition ?
      $active
        .one('bsTransitionEnd', next)
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
      next()

    $active.removeClass('in')
  }


  // TAB PLUGIN DEFINITION
  // =====================

  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.tab')

      if (!data) $this.data('bs.tab', (data = new Tab(this)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.tab

  $.fn.tab             = Plugin
  $.fn.tab.Constructor = Tab


  // TAB NO CONFLICT
  // ===============

  $.fn.tab.noConflict = function () {
    $.fn.tab = old
    return this
  }


  // TAB DATA-API
  // ============

  var clickHandler = function (e) {
    e.preventDefault()
    Plugin.call($(this), 'show')
  }

  $(document)
    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)

}(jQuery);

},{}],107:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: tooltip.js v3.3.7
 * http://getbootstrap.com/javascript/#tooltip
 * Inspired by the original jQuery.tipsy by Jason Frame
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // TOOLTIP PUBLIC CLASS DEFINITION
  // ===============================

  var Tooltip = function (element, options) {
    this.type       = null
    this.options    = null
    this.enabled    = null
    this.timeout    = null
    this.hoverState = null
    this.$element   = null
    this.inState    = null

    this.init('tooltip', element, options)
  }

  Tooltip.VERSION  = '3.3.7'

  Tooltip.TRANSITION_DURATION = 150

  Tooltip.DEFAULTS = {
    animation: true,
    placement: 'top',
    selector: false,
    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
    trigger: 'hover focus',
    title: '',
    delay: 0,
    html: false,
    container: false,
    viewport: {
      selector: 'body',
      padding: 0
    }
  }

  Tooltip.prototype.init = function (type, element, options) {
    this.enabled   = true
    this.type      = type
    this.$element  = $(element)
    this.options   = this.getOptions(options)
    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
    this.inState   = { click: false, hover: false, focus: false }

    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
    }

    var triggers = this.options.trigger.split(' ')

    for (var i = triggers.length; i--;) {
      var trigger = triggers[i]

      if (trigger == 'click') {
        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
      } else if (trigger != 'manual') {
        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'

        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()
  }

  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }

  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)

    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
      }
    }

    return options
  }

  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()

    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })

    return options
  }

  Tooltip.prototype.enter = function (obj) {
    var self = obj instanceof this.constructor ?
      obj : $(obj.currentTarget).data('bs.' + this.type)

    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
    }

    if (obj instanceof $.Event) {
      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
    }

    if (self.tip().hasClass('in') || self.hoverState == 'in') {
      self.hoverState = 'in'
      return
    }

    clearTimeout(self.timeout)

    self.hoverState = 'in'

    if (!self.options.delay || !self.options.delay.show) return self.show()

    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }

  Tooltip.prototype.isInStateTrue = function () {
    for (var key in this.inState) {
      if (this.inState[key]) return true
    }

    return false
  }

  Tooltip.prototype.leave = function (obj) {
    var self = obj instanceof this.constructor ?
      obj : $(obj.currentTarget).data('bs.' + this.type)

    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
    }

    if (obj instanceof $.Event) {
      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
    }

    if (self.isInStateTrue()) return

    clearTimeout(self.timeout)

    self.hoverState = 'out'

    if (!self.options.delay || !self.options.delay.hide) return self.hide()

    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }

  Tooltip.prototype.show = function () {
    var e = $.Event('show.bs.' + this.type)

    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)

      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
      if (e.isDefaultPrevented() || !inDom) return
      var that = this

      var $tip = this.tip()

      var tipId = this.getUID(this.type)

      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)

      if (this.options.animation) $tip.addClass('fade')

      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement

      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'

      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)

      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
      this.$element.trigger('inserted.bs.' + this.type)

      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight

      if (autoPlace) {
        var orgPlacement = placement
        var viewportDim = this.getPosition(this.$viewport)

        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
                    placement

        $tip
          .removeClass(orgPlacement)
          .addClass(placement)
      }

      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)

      this.applyPlacement(calculatedOffset, placement)

      var complete = function () {
        var prevHoverState = that.hoverState
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null

        if (prevHoverState == 'out') that.leave(that)
      }

      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
        complete()
    }
  }

  Tooltip.prototype.applyPlacement = function (offset, placement) {
    var $tip   = this.tip()
    var width  = $tip[0].offsetWidth
    var height = $tip[0].offsetHeight

    // manually read margins because getBoundingClientRect includes difference
    var marginTop = parseInt($tip.css('margin-top'), 10)
    var marginLeft = parseInt($tip.css('margin-left'), 10)

    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0

    offset.top  += marginTop
    offset.left += marginLeft

    // $.fn.offset doesn't round pixel values
    // so we use setOffset directly with our own function B-0
    $.offset.setOffset($tip[0], $.extend({
      using: function (props) {
        $tip.css({
          top: Math.round(props.top),
          left: Math.round(props.left)
        })
      }
    }, offset), 0)

    $tip.addClass('in')

    // check to see if placing tip in new offset caused the tip to resize itself
    var actualWidth  = $tip[0].offsetWidth
    var actualHeight = $tip[0].offsetHeight

    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }

    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)

    if (delta.left) offset.left += delta.left
    else offset.top += delta.top

    var isVertical          = /top|bottom/.test(placement)
    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'

    $tip.offset(offset)
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
  }

  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
    this.arrow()
      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
      .css(isVertical ? 'top' : 'left', '')
  }

  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()

    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }

  Tooltip.prototype.hide = function (callback) {
    var that = this
    var $tip = $(this.$tip)
    var e    = $.Event('hide.bs.' + this.type)

    function complete() {
      if (that.hoverState != 'in') $tip.detach()
      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
        that.$element
          .removeAttr('aria-describedby')
          .trigger('hidden.bs.' + that.type)
      }
      callback && callback()
    }

    this.$element.trigger(e)

    if (e.isDefaultPrevented()) return

    $tip.removeClass('in')

    $.support.transition && $tip.hasClass('fade') ?
      $tip
        .one('bsTransitionEnd', complete)
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
      complete()

    this.hoverState = null

    return this
  }

  Tooltip.prototype.fixTitle = function () {
    var $e = this.$element
    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
    }
  }

  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }

  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element

    var el     = $element[0]
    var isBody = el.tagName == 'BODY'

    var elRect    = el.getBoundingClientRect()
    if (elRect.width == null) {
      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
    }
    var isSvg = window.SVGElement && el instanceof window.SVGElement
    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
    // See https://github.com/twbs/bootstrap/issues/20280
    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null

    return $.extend({}, elRect, scroll, outerDims, elOffset)
  }

  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }

  }

  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
    var delta = { top: 0, left: 0 }
    if (!this.$viewport) return delta

    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)

    if (/right|left/.test(placement)) {
      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
      if (topEdgeOffset < viewportDimensions.top) { // top overflow
        delta.top = viewportDimensions.top - topEdgeOffset
      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
      }
    } else {
      var leftEdgeOffset  = pos.left - viewportPadding
      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
        delta.left = viewportDimensions.left - leftEdgeOffset
      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
      }
    }

    return delta
  }

  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options

    title = $e.attr('data-original-title')
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)

    return title
  }

  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }

  Tooltip.prototype.tip = function () {
    if (!this.$tip) {
      this.$tip = $(this.options.template)
      if (this.$tip.length != 1) {
        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
      }
    }
    return this.$tip
  }

  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }

  Tooltip.prototype.enable = function () {
    this.enabled = true
  }

  Tooltip.prototype.disable = function () {
    this.enabled = false
  }

  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }

  Tooltip.prototype.toggle = function (e) {
    var self = this
    if (e) {
      self = $(e.currentTarget).data('bs.' + this.type)
      if (!self) {
        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
        $(e.currentTarget).data('bs.' + this.type, self)
      }
    }

    if (e) {
      self.inState.click = !self.inState.click
      if (self.isInStateTrue()) self.enter(self)
      else self.leave(self)
    } else {
      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
    }
  }

  Tooltip.prototype.destroy = function () {
    var that = this
    clearTimeout(this.timeout)
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
      if (that.$tip) {
        that.$tip.detach()
      }
      that.$tip = null
      that.$arrow = null
      that.$viewport = null
      that.$element = null
    })
  }


  // TOOLTIP PLUGIN DEFINITION
  // =========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.tooltip')
      var options = typeof option == 'object' && option

      if (!data && /destroy|hide/.test(option)) return
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.tooltip

  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip


  // TOOLTIP NO CONFLICT
  // ===================

  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }

}(jQuery);

},{}],108:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: transition.js v3.3.7
 * http://getbootstrap.com/javascript/#transitions
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================

  function transitionEnd() {
    var el = document.createElement('bootstrap')

    var transEndEventNames = {
      WebkitTransition : 'webkitTransitionEnd',
      MozTransition    : 'transitionend',
      OTransition      : 'oTransitionEnd otransitionend',
      transition       : 'transitionend'
    }

    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
      }
    }

    return false // explicit for ie8 (  ._.)
  }

  // http://blog.alexmaccaw.com/css-transitions
  $.fn.emulateTransitionEnd = function (duration) {
    var called = false
    var $el = this
    $(this).one('bsTransitionEnd', function () { called = true })
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
    setTimeout(callback, duration)
    return this
  }

  $(function () {
    $.support.transition = transitionEnd()

    if (!$.support.transition) return

    $.event.special.bsTransitionEnd = {
      bindType: $.support.transition.end,
      delegateType: $.support.transition.end,
      handle: function (e) {
        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
      }
    }
  })

}(jQuery);

},{}],109:[function(require,module,exports){
/*!
 * jQuery JavaScript Library v1.12.4
 * http://jquery.com/
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2016-05-20T17:17Z
 */

(function( global, factory ) {

	if ( typeof module === "object" && typeof module.exports === "object" ) {
		// For CommonJS and CommonJS-like environments where a proper `window`
		// is present, execute the factory and get jQuery.
		// For environments that do not have a `window` with a `document`
		// (such as Node.js), expose a factory as module.exports.
		// This accentuates the need for the creation of a real `window`.
		// e.g. var jQuery = require("jquery")(window);
		// See ticket #14549 for more info.
		module.exports = global.document ?
			factory( global, true ) :
			function( w ) {
				if ( !w.document ) {
					throw new Error( "jQuery requires a window with a document" );
				}
				return factory( w );
			};
	} else {
		factory( global );
	}

// Pass this if window is not defined yet
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {

// Support: Firefox 18+
// Can't be in strict mode, several libs including ASP.NET trace
// the stack via arguments.caller.callee and Firefox dies if
// you try to trace through "use strict" call chains. (#13335)
//"use strict";
var deletedIds = [];

var document = window.document;

var slice = deletedIds.slice;

var concat = deletedIds.concat;

var push = deletedIds.push;

var indexOf = deletedIds.indexOf;

var class2type = {};

var toString = class2type.toString;

var hasOwn = class2type.hasOwnProperty;

var support = {};



var
	version = "1.12.4",

	// Define a local copy of jQuery
	jQuery = function( selector, context ) {

		// The jQuery object is actually just the init constructor 'enhanced'
		// Need init if jQuery is called (just allow error to be thrown if not included)
		return new jQuery.fn.init( selector, context );
	},

	// Support: Android<4.1, IE<9
	// Make sure we trim BOM and NBSP
	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,

	// Matches dashed string for camelizing
	rmsPrefix = /^-ms-/,
	rdashAlpha = /-([\da-z])/gi,

	// Used by jQuery.camelCase as callback to replace()
	fcamelCase = function( all, letter ) {
		return letter.toUpperCase();
	};

jQuery.fn = jQuery.prototype = {

	// The current version of jQuery being used
	jquery: version,

	constructor: jQuery,

	// Start with an empty selector
	selector: "",

	// The default length of a jQuery object is 0
	length: 0,

	toArray: function() {
		return 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( num ) {
		return num != null ?

			// Return just the one element from the set
			( num < 0 ? this[ num + this.length ] : this[ num ] ) :

			// Return all the elements in a clean array
			slice.call( this );
	},

	// Take an array of elements and push it onto the stack
	// (returning the new matched element set)
	pushStack: function( elems ) {

		// 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;

		// Return the newly-formed element set
		return ret;
	},

	// Execute a callback for every element in the matched set.
	each: function( callback ) {
		return jQuery.each( this, callback );
	},

	map: function( callback ) {
		return this.pushStack( jQuery.map( this, function( elem, i ) {
			return callback.call( elem, i, elem );
		} ) );
	},

	slice: function() {
		return this.pushStack( slice.apply( this, arguments ) );
	},

	first: function() {
		return this.eq( 0 );
	},

	last: function() {
		return this.eq( -1 );
	},

	eq: function( i ) {
		var len = this.length,
			j = +i + ( i < 0 ? len : 0 );
		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
	},

	end: function() {
		return this.prevObject || this.constructor();
	},

	// For internal use only.
	// Behaves like an Array's method, not like a jQuery method.
	push: push,
	sort: deletedIds.sort,
	splice: deletedIds.splice
};

jQuery.extend = jQuery.fn.extend = function() {
	var src, copyIsArray, copy, name, options, clone,
		target = arguments[ 0 ] || {},
		i = 1,
		length = arguments.length,
		deep = false;

	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {
		deep = target;

		// skip the boolean and the target
		target = arguments[ i ] || {};
		i++;
	}

	// 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 ( i === length ) {
		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( {

	// Unique for each copy of jQuery on the page
	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),

	// Assume jQuery is ready without the ready module
	isReady: true,

	error: function( msg ) {
		throw new Error( msg );
	},

	noop: function() {},

	// 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( obj ) {
		return jQuery.type( obj ) === "function";
	},

	isArray: Array.isArray || function( obj ) {
		return jQuery.type( obj ) === "array";
	},

	isWindow: function( obj ) {
		/* jshint eqeqeq: false */
		return obj != null && obj == obj.window;
	},

	isNumeric: function( obj ) {

		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
		// subtraction forces infinities to NaN
		// adding 1 corrects loss of precision from parseFloat (#15100)
		var realStringObj = obj && obj.toString();
		return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
	},

	isEmptyObject: function( obj ) {
		var name;
		for ( name in obj ) {
			return false;
		}
		return true;
	},

	isPlainObject: function( obj ) {
		var key;

		// 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 &&
				!hasOwn.call( obj, "constructor" ) &&
				!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
				return false;
			}
		} catch ( e ) {

			// IE8,9 Will throw exceptions on certain host objects #9897
			return false;
		}

		// Support: IE<9
		// Handle iteration over inherited properties before own properties.
		if ( !support.ownFirst ) {
			for ( key in obj ) {
				return hasOwn.call( obj, key );
			}
		}

		// Own properties are enumerated firstly, so to speed up,
		// if last one is own, then all properties are own.
		for ( key in obj ) {}

		return key === undefined || hasOwn.call( obj, key );
	},

	type: function( obj ) {
		if ( obj == null ) {
			return obj + "";
		}
		return typeof obj === "object" || typeof obj === "function" ?
			class2type[ toString.call( obj ) ] || "object" :
			typeof obj;
	},

	// Workarounds based on findings by Jim Driscoll
	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
	globalEval: function( data ) {
		if ( data && jQuery.trim( 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 ); // jscs:ignore requireDotNotation
			} )( data );
		}
	},

	// Convert dashed to camelCase; used by the css and data modules
	// Microsoft forgot to hump their vendor prefix (#9572)
	camelCase: function( string ) {
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
	},

	nodeName: function( elem, name ) {
		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
	},

	each: function( obj, callback ) {
		var length, i = 0;

		if ( isArrayLike( obj ) ) {
			length = obj.length;
			for ( ; i < length; i++ ) {
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
					break;
				}
			}
		} else {
			for ( i in obj ) {
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
					break;
				}
			}
		}

		return obj;
	},

	// Support: Android<4.1, IE<9
	trim: function( text ) {
		return text == null ?
			"" :
			( text + "" ).replace( rtrim, "" );
	},

	// results is for internal usage only
	makeArray: function( arr, results ) {
		var ret = results || [];

		if ( arr != null ) {
			if ( isArrayLike( Object( arr ) ) ) {
				jQuery.merge( ret,
					typeof arr === "string" ?
					[ arr ] : arr
				);
			} else {
				push.call( ret, arr );
			}
		}

		return ret;
	},

	inArray: function( elem, arr, i ) {
		var len;

		if ( arr ) {
			if ( indexOf ) {
				return 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( first, second ) {
		var len = +second.length,
			j = 0,
			i = first.length;

		while ( j < len ) {
			first[ i++ ] = second[ j++ ];
		}

		// Support: IE<9
		// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
		if ( len !== len ) {
			while ( second[ j ] !== undefined ) {
				first[ i++ ] = second[ j++ ];
			}
		}

		first.length = i;

		return first;
	},

	grep: function( elems, callback, invert ) {
		var callbackInverse,
			matches = [],
			i = 0,
			length = elems.length,
			callbackExpect = !invert;

		// Go through the array, only saving the items
		// that pass the validator function
		for ( ; i < length; i++ ) {
			callbackInverse = !callback( elems[ i ], i );
			if ( callbackInverse !== callbackExpect ) {
				matches.push( elems[ i ] );
			}
		}

		return matches;
	},

	// arg is for internal usage only
	map: function( elems, callback, arg ) {
		var length, value,
			i = 0,
			ret = [];

		// Go through the array, translating each of the items to their new values
		if ( isArrayLike( elems ) ) {
			length = elems.length;
			for ( ; i < length; i++ ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}

		// Go through every key on the object,
		} else {
			for ( i in elems ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}
		}

		// Flatten any nested arrays
		return concat.apply( [], ret );
	},

	// A global GUID counter for objects
	guid: 1,

	// Bind a function to a context, optionally partially applying any
	// arguments.
	proxy: function( fn, context ) {
		var args, proxy, tmp;

		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 = slice.call( arguments, 2 );
		proxy = function() {
			return fn.apply( context || this, args.concat( 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 || jQuery.guid++;

		return proxy;
	},

	now: function() {
		return +( new Date() );
	},

	// jQuery.support is not used in Core but other projects attach their
	// properties to it so it needs to exist.
	support: support
} );

// JSHint would error on this code due to the Symbol not being defined in ES5.
// Defining this global in .jshintrc would create a danger of using the global
// unguarded in another place, it seems safer to just disable JSHint for these
// three lines.
/* jshint ignore: start */
if ( typeof Symbol === "function" ) {
	jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];
}
/* jshint ignore: end */

// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
function( i, name ) {
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
} );

function isArrayLike( obj ) {

	// Support: iOS 8.2 (not reproducible in simulator)
	// `in` check used to prevent JIT error (gh-2145)
	// hasOwn isn't used here due to false negatives
	// regarding Nodelist length in IE
	var length = !!obj && "length" in obj && obj.length,
		type = jQuery.type( obj );

	if ( type === "function" || jQuery.isWindow( obj ) ) {
		return false;
	}

	return type === "array" || length === 0 ||
		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}
var Sizzle =
/*!
 * Sizzle CSS Selector Engine v2.2.1
 * http://sizzlejs.com/
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2015-10-17
 */
(function( window ) {

var i,
	support,
	Expr,
	getText,
	isXML,
	tokenize,
	compile,
	select,
	outermostContext,
	sortInput,
	hasDuplicate,

	// Local document vars
	setDocument,
	document,
	docElem,
	documentIsHTML,
	rbuggyQSA,
	rbuggyMatches,
	matches,
	contains,

	// Instance-specific data
	expando = "sizzle" + 1 * new Date(),
	preferredDoc = window.document,
	dirruns = 0,
	done = 0,
	classCache = createCache(),
	tokenCache = createCache(),
	compilerCache = createCache(),
	sortOrder = function( a, b ) {
		if ( a === b ) {
			hasDuplicate = true;
		}
		return 0;
	},

	// General-purpose constants
	MAX_NEGATIVE = 1 << 31,

	// Instance methods
	hasOwn = ({}).hasOwnProperty,
	arr = [],
	pop = arr.pop,
	push_native = arr.push,
	push = arr.push,
	slice = arr.slice,
	// Use a stripped-down indexOf as it's faster than native
	// http://jsperf.com/thor-indexof-vs-for/5
	indexOf = function( list, elem ) {
		var i = 0,
			len = list.length;
		for ( ; i < len; i++ ) {
			if ( list[i] === elem ) {
				return i;
			}
		}
		return -1;
	},

	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",

	// Regular expressions

	// http://www.w3.org/TR/css3-selectors/#whitespace
	whitespace = "[\\x20\\t\\r\\n\\f]",

	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
	identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",

	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
		// Operator (capture 2)
		"*([*^$|!~]?=)" + whitespace +
		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
		"*\\]",

	pseudos = ":(" + identifier + ")(?:\\((" +
		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
		// 1. quoted (capture 3; capture 4 or capture 5)
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
		// 2. simple (capture 6)
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
		// 3. anything else (capture 2)
		".*" +
		")\\)|)",

	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
	rwhitespace = new RegExp( whitespace + "+", "g" ),
	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),

	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),

	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),

	rpseudo = new RegExp( pseudos ),
	ridentifier = new RegExp( "^" + identifier + "$" ),

	matchExpr = {
		"ID": new RegExp( "^#(" + identifier + ")" ),
		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
		"ATTR": new RegExp( "^" + attributes ),
		"PSEUDO": new RegExp( "^" + pseudos ),
		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
		// For use in libraries implementing .is()
		// We use this for POS matching in `select`
		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
	},

	rinputs = /^(?:input|select|textarea|button)$/i,
	rheader = /^h\d$/i,

	rnative = /^[^{]+\{\s*\[native \w/,

	// Easily-parseable/retrievable ID or TAG or CLASS selectors
	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,

	rsibling = /[+~]/,
	rescape = /'|\\/g,

	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
	funescape = function( _, escaped, escapedWhitespace ) {
		var high = "0x" + escaped - 0x10000;
		// NaN means non-codepoint
		// Support: Firefox<24
		// Workaround erroneous numeric interpretation of +"0x"
		return high !== high || escapedWhitespace ?
			escaped :
			high < 0 ?
				// BMP codepoint
				String.fromCharCode( high + 0x10000 ) :
				// Supplemental Plane codepoint (surrogate pair)
				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
	},

	// Used for iframes
	// See setDocument()
	// Removing the function wrapper causes a "Permission Denied"
	// error in IE
	unloadHandler = function() {
		setDocument();
	};

// Optimize for push.apply( _, NodeList )
try {
	push.apply(
		(arr = slice.call( preferredDoc.childNodes )),
		preferredDoc.childNodes
	);
	// Support: Android<4.0
	// Detect silently failing push.apply
	arr[ preferredDoc.childNodes.length ].nodeType;
} catch ( e ) {
	push = { apply: arr.length ?

		// Leverage slice if possible
		function( target, els ) {
			push_native.apply( target, slice.call(els) );
		} :

		// Support: IE<9
		// Otherwise append directly
		function( target, els ) {
			var j = target.length,
				i = 0;
			// Can't trust NodeList.length
			while ( (target[j++] = els[i++]) ) {}
			target.length = j - 1;
		}
	};
}

function Sizzle( selector, context, results, seed ) {
	var m, i, elem, nid, nidselect, match, groups, newSelector,
		newContext = context && context.ownerDocument,

		// nodeType defaults to 9, since context defaults to document
		nodeType = context ? context.nodeType : 9;

	results = results || [];

	// Return early from calls with invalid selector or context
	if ( typeof selector !== "string" || !selector ||
		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {

		return results;
	}

	// Try to shortcut find operations (as opposed to filters) in HTML documents
	if ( !seed ) {

		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
			setDocument( context );
		}
		context = context || document;

		if ( documentIsHTML ) {

			// If the selector is sufficiently simple, try using a "get*By*" DOM method
			// (excepting DocumentFragment context, where the methods don't exist)
			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {

				// ID selector
				if ( (m = match[1]) ) {

					// Document context
					if ( nodeType === 9 ) {
						if ( (elem = context.getElementById( m )) ) {

							// Support: IE, Opera, Webkit
							// TODO: identify versions
							// getElementById can match elements by name instead of ID
							if ( elem.id === m ) {
								results.push( elem );
								return results;
							}
						} else {
							return results;
						}

					// Element context
					} else {

						// Support: IE, Opera, Webkit
						// TODO: identify versions
						// getElementById can match elements by name instead of ID
						if ( newContext && (elem = newContext.getElementById( m )) &&
							contains( context, elem ) &&
							elem.id === m ) {

							results.push( elem );
							return results;
						}
					}

				// Type selector
				} else if ( match[2] ) {
					push.apply( results, context.getElementsByTagName( selector ) );
					return results;

				// Class selector
				} else if ( (m = match[3]) && support.getElementsByClassName &&
					context.getElementsByClassName ) {

					push.apply( results, context.getElementsByClassName( m ) );
					return results;
				}
			}

			// Take advantage of querySelectorAll
			if ( support.qsa &&
				!compilerCache[ selector + " " ] &&
				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {

				if ( nodeType !== 1 ) {
					newContext = context;
					newSelector = selector;

				// qSA looks outside Element context, which is not what we want
				// Thanks to Andrew Dupont for this workaround technique
				// Support: IE <=8
				// Exclude object elements
				} else if ( context.nodeName.toLowerCase() !== "object" ) {

					// Capture the context ID, setting it first if necessary
					if ( (nid = context.getAttribute( "id" )) ) {
						nid = nid.replace( rescape, "\\$&" );
					} else {
						context.setAttribute( "id", (nid = expando) );
					}

					// Prefix every selector in the list
					groups = tokenize( selector );
					i = groups.length;
					nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
					while ( i-- ) {
						groups[i] = nidselect + " " + toSelector( groups[i] );
					}
					newSelector = groups.join( "," );

					// Expand context for sibling selectors
					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
						context;
				}

				if ( newSelector ) {
					try {
						push.apply( results,
							newContext.querySelectorAll( newSelector )
						);
						return results;
					} catch ( qsaError ) {
					} finally {
						if ( nid === expando ) {
							context.removeAttribute( "id" );
						}
					}
				}
			}
		}
	}

	// All others
	return select( selector.replace( rtrim, "$1" ), context, results, seed );
}

/**
 * Create key-value caches of limited size
 * @returns {function(string, object)} Returns the Object data after storing it on itself with
 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
 *	deleting the oldest entry
 */
function createCache() {
	var keys = [];

	function cache( key, value ) {
		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
		if ( keys.push( key + " " ) > Expr.cacheLength ) {
			// Only keep the most recent entries
			delete cache[ keys.shift() ];
		}
		return (cache[ key + " " ] = value);
	}
	return cache;
}

/**
 * Mark a function for special use by Sizzle
 * @param {Function} fn The function to mark
 */
function markFunction( fn ) {
	fn[ expando ] = true;
	return fn;
}

/**
 * Support testing using an element
 * @param {Function} fn Passed the created div and expects a boolean result
 */
function assert( fn ) {
	var div = document.createElement("div");

	try {
		return !!fn( div );
	} catch (e) {
		return false;
	} finally {
		// Remove from its parent by default
		if ( div.parentNode ) {
			div.parentNode.removeChild( div );
		}
		// release memory in IE
		div = null;
	}
}

/**
 * Adds the same handler for all of the specified attrs
 * @param {String} attrs Pipe-separated list of attributes
 * @param {Function} handler The method that will be applied
 */
function addHandle( attrs, handler ) {
	var arr = attrs.split("|"),
		i = arr.length;

	while ( i-- ) {
		Expr.attrHandle[ arr[i] ] = handler;
	}
}

/**
 * Checks document order of two siblings
 * @param {Element} a
 * @param {Element} b
 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
 */
function siblingCheck( a, b ) {
	var cur = b && a,
		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
			( ~b.sourceIndex || MAX_NEGATIVE ) -
			( ~a.sourceIndex || MAX_NEGATIVE );

	// Use IE sourceIndex if available on both nodes
	if ( diff ) {
		return diff;
	}

	// Check if b follows a
	if ( cur ) {
		while ( (cur = cur.nextSibling) ) {
			if ( cur === b ) {
				return -1;
			}
		}
	}

	return a ? 1 : -1;
}

/**
 * Returns a function to use in pseudos for input types
 * @param {String} type
 */
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
 * @param {String} type
 */
function createButtonPseudo( type ) {
	return function( elem ) {
		var name = elem.nodeName.toLowerCase();
		return (name === "input" || name === "button") && elem.type === type;
	};
}

/**
 * Returns a function to use in pseudos for positionals
 * @param {Function} fn
 */
function createPositionalPseudo( fn ) {
	return markFunction(function( argument ) {
		argument = +argument;
		return markFunction(function( seed, matches ) {
			var j,
				matchIndexes = fn( [], seed.length, argument ),
				i = matchIndexes.length;

			// Match elements found at the specified indexes
			while ( i-- ) {
				if ( seed[ (j = matchIndexes[i]) ] ) {
					seed[j] = !(matches[j] = seed[j]);
				}
			}
		});
	});
}

/**
 * Checks a node for validity as a Sizzle context
 * @param {Element|Object=} context
 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
 */
function testContext( context ) {
	return context && typeof context.getElementsByTagName !== "undefined" && context;
}

// Expose support vars for convenience
support = Sizzle.support = {};

/**
 * Detects XML nodes
 * @param {Element|Object} elem An element or a document
 * @returns {Boolean} True iff elem is a non-HTML XML node
 */
isXML = Sizzle.isXML = function( 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;
};

/**
 * Sets document-related variables once based on the current document
 * @param {Element|Object} [doc] An element or document object to use to set the document
 * @returns {Object} Returns the current document
 */
setDocument = Sizzle.setDocument = function( node ) {
	var hasCompare, parent,
		doc = node ? node.ownerDocument || node : preferredDoc;

	// Return early if doc is invalid or already selected
	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
		return document;
	}

	// Update global variables
	document = doc;
	docElem = document.documentElement;
	documentIsHTML = !isXML( document );

	// Support: IE 9-11, Edge
	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
	if ( (parent = document.defaultView) && parent.top !== parent ) {
		// Support: IE 11
		if ( parent.addEventListener ) {
			parent.addEventListener( "unload", unloadHandler, false );

		// Support: IE 9 - 10 only
		} else if ( parent.attachEvent ) {
			parent.attachEvent( "onunload", unloadHandler );
		}
	}

	/* Attributes
	---------------------------------------------------------------------- */

	// Support: IE<8
	// Verify that getAttribute really returns attributes and not properties
	// (excepting IE8 booleans)
	support.attributes = assert(function( div ) {
		div.className = "i";
		return !div.getAttribute("className");
	});

	/* getElement(s)By*
	---------------------------------------------------------------------- */

	// Check if getElementsByTagName("*") returns only elements
	support.getElementsByTagName = assert(function( div ) {
		div.appendChild( document.createComment("") );
		return !div.getElementsByTagName("*").length;
	});

	// Support: IE<9
	support.getElementsByClassName = rnative.test( document.getElementsByClassName );

	// Support: IE<10
	// Check if getElementById returns elements by name
	// The broken getElementById methods don't pick up programatically-set names,
	// so use a roundabout getElementsByName test
	support.getById = assert(function( div ) {
		docElem.appendChild( div ).id = expando;
		return !document.getElementsByName || !document.getElementsByName( expando ).length;
	});

	// ID find and filter
	if ( support.getById ) {
		Expr.find["ID"] = function( id, context ) {
			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
				var m = context.getElementById( id );
				return m ? [ m ] : [];
			}
		};
		Expr.filter["ID"] = function( id ) {
			var attrId = id.replace( runescape, funescape );
			return function( elem ) {
				return elem.getAttribute("id") === attrId;
			};
		};
	} else {
		// Support: IE6/7
		// getElementById is not reliable as a find shortcut
		delete Expr.find["ID"];

		Expr.filter["ID"] =  function( id ) {
			var attrId = id.replace( runescape, funescape );
			return function( elem ) {
				var node = typeof elem.getAttributeNode !== "undefined" &&
					elem.getAttributeNode("id");
				return node && node.value === attrId;
			};
		};
	}

	// Tag
	Expr.find["TAG"] = support.getElementsByTagName ?
		function( tag, context ) {
			if ( typeof context.getElementsByTagName !== "undefined" ) {
				return context.getElementsByTagName( tag );

			// DocumentFragment nodes don't have gEBTN
			} else if ( support.qsa ) {
				return context.querySelectorAll( tag );
			}
		} :

		function( tag, context ) {
			var elem,
				tmp = [],
				i = 0,
				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
				results = context.getElementsByTagName( tag );

			// Filter out possible comments
			if ( tag === "*" ) {
				while ( (elem = results[i++]) ) {
					if ( elem.nodeType === 1 ) {
						tmp.push( elem );
					}
				}

				return tmp;
			}
			return results;
		};

	// Class
	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
			return context.getElementsByClassName( className );
		}
	};

	/* QSA/matchesSelector
	---------------------------------------------------------------------- */

	// QSA and matchesSelector support

	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
	rbuggyMatches = [];

	// qSa(:focus) reports false when true (Chrome 21)
	// We allow this because of a bug in IE8/9 that throws an error
	// whenever `document.activeElement` is accessed on an iframe
	// So, we allow :focus to pass through QSA all the time to avoid the IE error
	// See http://bugs.jquery.com/ticket/13378
	rbuggyQSA = [];

	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
		// 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 explicitly
			// setting a boolean content attribute,
			// since its presence should be enough
			// http://bugs.jquery.com/ticket/12359
			docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
				"<option selected=''></option></select>";

			// Support: IE8, Opera 11-12.16
			// Nothing should be selected when empty strings follow ^= or $= or *=
			// The test attribute must be unknown in Opera but "safe" for WinRT
			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
			if ( div.querySelectorAll("[msallowcapture^='']").length ) {
				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
			}

			// Support: IE8
			// Boolean attributes and "value" are not treated correctly
			if ( !div.querySelectorAll("[selected]").length ) {
				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
			}

			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
			if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
				rbuggyQSA.push("~=");
			}

			// Webkit/Opera - :checked should return selected option elements
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
			// IE8 throws error here and will not see later tests
			if ( !div.querySelectorAll(":checked").length ) {
				rbuggyQSA.push(":checked");
			}

			// Support: Safari 8+, iOS 8+
			// https://bugs.webkit.org/show_bug.cgi?id=136851
			// In-page `selector#id sibing-combinator selector` fails
			if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
				rbuggyQSA.push(".#.+[+~]");
			}
		});

		assert(function( div ) {
			// Support: Windows 8 Native Apps
			// The type and name attributes are restricted during .innerHTML assignment
			var input = document.createElement("input");
			input.setAttribute( "type", "hidden" );
			div.appendChild( input ).setAttribute( "name", "D" );

			// Support: IE8
			// Enforce case-sensitivity of name attribute
			if ( div.querySelectorAll("[name=d]").length ) {
				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
			}

			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
			// IE8 throws error here and will not see later tests
			if ( !div.querySelectorAll(":enabled").length ) {
				rbuggyQSA.push( ":enabled", ":disabled" );
			}

			// Opera 10-11 does not throw on post-comma invalid pseudos
			div.querySelectorAll("*,:x");
			rbuggyQSA.push(",.*:");
		});
	}

	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
		docElem.webkitMatchesSelector ||
		docElem.mozMatchesSelector ||
		docElem.oMatchesSelector ||
		docElem.msMatchesSelector) )) ) {

		assert(function( div ) {
			// Check to see if it's possible to do matchesSelector
			// on a disconnected node (IE 9)
			support.disconnectedMatch = matches.call( div, "div" );

			// This should fail with an exception
			// Gecko does not error, returns false instead
			matches.call( div, "[s!='']:x" );
			rbuggyMatches.push( "!=", pseudos );
		});
	}

	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );

	/* Contains
	---------------------------------------------------------------------- */
	hasCompare = rnative.test( docElem.compareDocumentPosition );

	// Element contains another
	// Purposefully self-exclusive
	// As in, an element does not contain itself
	contains = hasCompare || rnative.test( 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 ) :
					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
			));
		} :
		function( a, b ) {
			if ( b ) {
				while ( (b = b.parentNode) ) {
					if ( b === a ) {
						return true;
					}
				}
			}
			return false;
		};

	/* Sorting
	---------------------------------------------------------------------- */

	// Document order sorting
	sortOrder = hasCompare ?
	function( a, b ) {

		// Flag for duplicate removal
		if ( a === b ) {
			hasDuplicate = true;
			return 0;
		}

		// Sort on method existence if only one input has compareDocumentPosition
		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
		if ( compare ) {
			return compare;
		}

		// Calculate position if both inputs belong to the same document
		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
			a.compareDocumentPosition( b ) :

			// Otherwise we know they are disconnected
			1;

		// Disconnected nodes
		if ( compare & 1 ||
			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {

			// Choose the first element that is related to our preferred document
			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
				return -1;
			}
			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
				return 1;
			}

			// Maintain original order
			return sortInput ?
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
				0;
		}

		return compare & 4 ? -1 : 1;
	} :
	function( a, b ) {
		// Exit early if the nodes are identical
		if ( a === b ) {
			hasDuplicate = true;
			return 0;
		}

		var cur,
			i = 0,
			aup = a.parentNode,
			bup = b.parentNode,
			ap = [ a ],
			bp = [ b ];

		// Parentless nodes are either documents or disconnected
		if ( !aup || !bup ) {
			return a === document ? -1 :
				b === document ? 1 :
				aup ? -1 :
				bup ? 1 :
				sortInput ?
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
				0;

		// If the nodes are siblings, we can do a quick check
		} else if ( aup === bup ) {
			return siblingCheck( a, b );
		}

		// Otherwise we need full lists of their ancestors for comparison
		cur = a;
		while ( (cur = cur.parentNode) ) {
			ap.unshift( cur );
		}
		cur = b;
		while ( (cur = cur.parentNode) ) {
			bp.unshift( cur );
		}

		// Walk down the tree looking for a discrepancy
		while ( ap[i] === bp[i] ) {
			i++;
		}

		return i ?
			// Do a sibling check if the nodes have a common ancestor
			siblingCheck( ap[i], bp[i] ) :

			// Otherwise nodes in our document sort first
			ap[i] === preferredDoc ? -1 :
			bp[i] === preferredDoc ? 1 :
			0;
	};

	return document;
};

Sizzle.matches = function( expr, elements ) {
	return Sizzle( expr, null, null, elements );
};

Sizzle.matchesSelector = function( elem, expr ) {
	// Set document vars if needed
	if ( ( elem.ownerDocument || elem ) !== document ) {
		setDocument( elem );
	}

	// Make sure that attribute selectors are quoted
	expr = expr.replace( rattributeQuotes, "='$1']" );

	if ( support.matchesSelector && documentIsHTML &&
		!compilerCache[ expr + " " ] &&
		( !rbuggyMatches || !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 || support.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, document, null, [ elem ] ).length > 0;
};

Sizzle.contains = function( context, elem ) {
	// Set document vars if needed
	if ( ( context.ownerDocument || context ) !== document ) {
		setDocument( context );
	}
	return contains( context, elem );
};

Sizzle.attr = function( elem, name ) {
	// Set document vars if needed
	if ( ( elem.ownerDocument || elem ) !== document ) {
		setDocument( elem );
	}

	var fn = Expr.attrHandle[ name.toLowerCase() ],
		// Don't get fooled by Object.prototype properties (jQuery #13807)
		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
			fn( elem, name, !documentIsHTML ) :
			undefined;

	return val !== undefined ?
		val :
		support.attributes || !documentIsHTML ?
			elem.getAttribute( name ) :
			(val = elem.getAttributeNode(name)) && val.specified ?
				val.value :
				null;
};

Sizzle.error = function( msg ) {
	throw new Error( "Syntax error, unrecognized expression: " + msg );
};

/**
 * Document sorting and removing duplicates
 * @param {ArrayLike} results
 */
Sizzle.uniqueSort = function( results ) {
	var elem,
		duplicates = [],
		j = 0,
		i = 0;

	// Unless we *know* we can detect duplicates, assume their presence
	hasDuplicate = !support.detectDuplicates;
	sortInput = !support.sortStable && results.slice( 0 );
	results.sort( sortOrder );

	if ( hasDuplicate ) {
		while ( (elem = results[i++]) ) {
			if ( elem === results[ i ] ) {
				j = duplicates.push( i );
			}
		}
		while ( j-- ) {
			results.splice( duplicates[ j ], 1 );
		}
	}

	// Clear input after sorting to release objects
	// See https://github.com/jquery/sizzle/pull/225
	sortInput = null;

	return results;
};

/**
 * 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 no nodeType, this is expected to be an array
		while ( (node = elem[i++]) ) {
			// Do not traverse comment nodes
			ret += getText( node );
		}
	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
		// Use textContent for elements
		// innerText usage removed for consistency of new lines (jQuery #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

	return ret;
};

Expr = Sizzle.selectors = {

	// Can be adjusted by the user
	cacheLength: 50,

	createPseudo: markFunction,

	match: matchExpr,

	attrHandle: {},

	find: {},

	relative: {
		">": { dir: "parentNode", first: true },
		" ": { dir: "parentNode" },
		"+": { dir: "previousSibling", first: true },
		"~": { dir: "previousSibling" }
	},

	preFilter: {
		"ATTR": function( match ) {
			match[1] = match[1].replace( runescape, funescape );

			// Move the given value to match[3] whether quoted or unquoted
			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );

			if ( match[2] === "~=" ) {
				match[3] = " " + match[3] + " ";
			}

			return match.slice( 0, 4 );
		},

		"CHILD": function( match ) {
			/* matches from matchExpr["CHILD"]
				1 type (only|nth|...)
				2 what (child|of-type)
				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
				4 xn-component of xn+y argument ([+-]?\d*n|)
				5 sign of xn-component
				6 x of xn-component
				7 sign of y-component
				8 y of y-component
			*/
			match[1] = match[1].toLowerCase();

			if ( match[1].slice( 0, 3 ) === "nth" ) {
				// nth-* requires argument
				if ( !match[3] ) {
					Sizzle.error( match[0] );
				}

				// numeric x and y parameters for Expr.filter.CHILD
				// remember that false/true cast respectively to 0/1
				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );

			// other types prohibit arguments
			} else if ( match[3] ) {
				Sizzle.error( match[0] );
			}

			return match;
		},

		"PSEUDO": function( match ) {
			var excess,
				unquoted = !match[6] && match[2];

			if ( matchExpr["CHILD"].test( match[0] ) ) {
				return null;
			}

			// Accept quoted arguments as-is
			if ( match[3] ) {
				match[2] = match[4] || match[5] || "";

			// Strip excess characters from unquoted arguments
			} else if ( unquoted && rpseudo.test( unquoted ) &&
				// Get excess from tokenize (recursively)
				(excess = tokenize( unquoted, true )) &&
				// advance to the next closing parenthesis
				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {

				// excess is a negative index
				match[0] = match[0].slice( 0, excess );
				match[2] = unquoted.slice( 0, excess );
			}

			// Return only captures needed by the pseudo filter method (type and argument)
			return match.slice( 0, 3 );
		}
	},

	filter: {

		"TAG": function( nodeNameSelector ) {
			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
			return nodeNameSelector === "*" ?
				function() { return true; } :
				function( elem ) {
					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
				};
		},

		"CLASS": function( className ) {
			var pattern = classCache[ className + " " ];

			return pattern ||
				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
				classCache( className, function( elem ) {
					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
				});
		},

		"ATTR": function( name, operator, check ) {
			return function( elem ) {
				var result = Sizzle.attr( elem, name );

				if ( result == null ) {
					return operator === "!=";
				}
				if ( !operator ) {
					return true;
				}

				result += "";

				return operator === "=" ? result === check :
					operator === "!=" ? result !== check :
					operator === "^=" ? check && result.indexOf( check ) === 0 :
					operator === "*=" ? check && result.indexOf( check ) > -1 :
					operator === "$=" ? check && result.slice( -check.length ) === check :
					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
					false;
			};
		},

		"CHILD": function( type, what, argument, first, last ) {
			var simple = type.slice( 0, 3 ) !== "nth",
				forward = type.slice( -4 ) !== "last",
				ofType = what === "of-type";

			return first === 1 && last === 0 ?

				// Shortcut for :nth-*(n)
				function( elem ) {
					return !!elem.parentNode;
				} :

				function( elem, context, xml ) {
					var cache, uniqueCache, outerCache, node, nodeIndex, start,
						dir = simple !== forward ? "nextSibling" : "previousSibling",
						parent = elem.parentNode,
						name = ofType && elem.nodeName.toLowerCase(),
						useCache = !xml && !ofType,
						diff = false;

					if ( parent ) {

						// :(first|last|only)-(child|of-type)
						if ( simple ) {
							while ( dir ) {
								node = elem;
								while ( (node = node[ dir ]) ) {
									if ( ofType ?
										node.nodeName.toLowerCase() === name :
										node.nodeType === 1 ) {

										return false;
									}
								}
								// Reverse direction for :only-* (if we haven't yet done so)
								start = dir = type === "only" && !start && "nextSibling";
							}
							return true;
						}

						start = [ forward ? parent.firstChild : parent.lastChild ];

						// non-xml :nth-child(...) stores cache data on `parent`
						if ( forward && useCache ) {

							// Seek `elem` from a previously-cached index

							// ...in a gzip-friendly way
							node = parent;
							outerCache = node[ expando ] || (node[ expando ] = {});

							// Support: IE <9 only
							// Defend against cloned attroperties (jQuery gh-1709)
							uniqueCache = outerCache[ node.uniqueID ] ||
								(outerCache[ node.uniqueID ] = {});

							cache = uniqueCache[ type ] || [];
							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
							diff = nodeIndex && cache[ 2 ];
							node = nodeIndex && parent.childNodes[ nodeIndex ];

							while ( (node = ++nodeIndex && node && node[ dir ] ||

								// Fallback to seeking `elem` from the start
								(diff = nodeIndex = 0) || start.pop()) ) {

								// When found, cache indexes on `parent` and break
								if ( node.nodeType === 1 && ++diff && node === elem ) {
									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
									break;
								}
							}

						} else {
							// Use previously-cached element index if available
							if ( useCache ) {
								// ...in a gzip-friendly way
								node = elem;
								outerCache = node[ expando ] || (node[ expando ] = {});

								// Support: IE <9 only
								// Defend against cloned attroperties (jQuery gh-1709)
								uniqueCache = outerCache[ node.uniqueID ] ||
									(outerCache[ node.uniqueID ] = {});

								cache = uniqueCache[ type ] || [];
								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
								diff = nodeIndex;
							}

							// xml :nth-child(...)
							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
							if ( diff === false ) {
								// Use the same loop as above to seek `elem` from the start
								while ( (node = ++nodeIndex && node && node[ dir ] ||
									(diff = nodeIndex = 0) || start.pop()) ) {

									if ( ( ofType ?
										node.nodeName.toLowerCase() === name :
										node.nodeType === 1 ) &&
										++diff ) {

										// Cache the index of each encountered element
										if ( useCache ) {
											outerCache = node[ expando ] || (node[ expando ] = {});

											// Support: IE <9 only
											// Defend against cloned attroperties (jQuery gh-1709)
											uniqueCache = outerCache[ node.uniqueID ] ||
												(outerCache[ node.uniqueID ] = {});

											uniqueCache[ type ] = [ dirruns, diff ];
										}

										if ( node === elem ) {
											break;
										}
									}
								}
							}
						}

						// Incorporate the offset, then check against cycle size
						diff -= last;
						return diff === first || ( diff % first === 0 && diff / first >= 0 );
					}
				};
		},

		"PSEUDO": function( pseudo, argument ) {
			// 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
			// Remember that setFilters inherits from pseudos
			var args,
				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
					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 ] ) {
				return fn( argument );
			}

			// But maintain support for old signatures
			if ( fn.length > 1 ) {
				args = [ pseudo, pseudo, "", argument ];
				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
					markFunction(function( seed, matches ) {
						var idx,
							matched = fn( seed, argument ),
							i = matched.length;
						while ( i-- ) {
							idx = indexOf( seed, matched[i] );
							seed[ idx ] = !( matches[ idx ] = matched[i] );
						}
					}) :
					function( elem ) {
						return fn( elem, 0, args );
					};
			}

			return fn;
		}
	},

	pseudos: {
		// Potentially complex pseudos
		"not": markFunction(function( selector ) {
			// Trim the selector passed to compile
			// to avoid treating leading and trailing
			// spaces as combinators
			var input = [],
				results = [],
				matcher = compile( selector.replace( rtrim, "$1" ) );

			return matcher[ expando ] ?
				markFunction(function( seed, matches, context, xml ) {
					var elem,
						unmatched = matcher( seed, null, xml, [] ),
						i = seed.length;

					// Match elements unmatched by `matcher`
					while ( i-- ) {
						if ( (elem = unmatched[i]) ) {
							seed[i] = !(matches[i] = elem);
						}
					}
				}) :
				function( elem, context, xml ) {
					input[0] = elem;
					matcher( input, null, xml, results );
					// Don't keep the element (issue #299)
					input[0] = null;
					return !results.pop();
				};
		}),

		"has": markFunction(function( selector ) {
			return function( elem ) {
				return Sizzle( selector, elem ).length > 0;
			};
		}),

		"contains": markFunction(function( text ) {
			text = text.replace( runescape, funescape );
			return function( elem ) {
				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
			};
		}),

		// "Whether an element is represented by a :lang() selector
		// is based solely on the element's language value
		// being equal to the identifier C,
		// or beginning with the identifier C immediately followed by "-".
		// The matching of C against the element's language value is performed case-insensitively.
		// The identifier C does not have to be a valid language name."
		// http://www.w3.org/TR/selectors/#lang-pseudo
		"lang": markFunction( function( lang ) {
			// lang value must be a valid identifier
			if ( !ridentifier.test(lang || "") ) {
				Sizzle.error( "unsupported lang: " + lang );
			}
			lang = lang.replace( runescape, funescape ).toLowerCase();
			return function( elem ) {
				var elemLang;
				do {
					if ( (elemLang = documentIsHTML ?
						elem.lang :
						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {

						elemLang = elemLang.toLowerCase();
						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
					}
				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
				return false;
			};
		}),

		// Miscellaneous
		"target": function( elem ) {
			var hash = window.location && window.location.hash;
			return hash && hash.slice( 1 ) === elem.id;
		},

		"root": function( elem ) {
			return elem === docElem;
		},

		"focus": function( elem ) {
			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
		},

		// Boolean properties
		"enabled": function( elem ) {
			return elem.disabled === false;
		},

		"disabled": function( elem ) {
			return elem.disabled === true;
		},

		"checked": function( 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( elem ) {
			// Accessing this property makes selected-by-default
			// options in Safari work properly
			if ( elem.parentNode ) {
				elem.parentNode.selectedIndex;
			}

			return elem.selected === true;
		},

		// Contents
		"empty": function( elem ) {
			// http://www.w3.org/TR/selectors/#empty-pseudo
			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
			//   but not by others (comment: 8; processing instruction: 7; etc.)
			// nodeType < 6 works because attributes (2) do not appear as children
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
				if ( elem.nodeType < 6 ) {
					return false;
				}
			}
			return true;
		},

		"parent": function( elem ) {
			return !Expr.pseudos["empty"]( elem );
		},

		// Element/input types
		"header": function( elem ) {
			return rheader.test( elem.nodeName );
		},

		"input": function( elem ) {
			return rinputs.test( elem.nodeName );
		},

		"button": function( elem ) {
			var name = elem.nodeName.toLowerCase();
			return name === "input" && elem.type === "button" || name === "button";
		},

		"text": function( elem ) {
			var attr;
			return elem.nodeName.toLowerCase() === "input" &&
				elem.type === "text" &&

				// Support: IE<8
				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
		},

		// Position-in-collection
		"first": createPositionalPseudo(function() {
			return [ 0 ];
		}),

		"last": createPositionalPseudo(function( matchIndexes, length ) {
			return [ length - 1 ];
		}),

		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
			return [ argument < 0 ? argument + length : argument ];
		}),

		"even": createPositionalPseudo(function( matchIndexes, length ) {
			var i = 0;
			for ( ; i < length; i += 2 ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"odd": createPositionalPseudo(function( matchIndexes, length ) {
			var i = 1;
			for ( ; i < length; i += 2 ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
			var i = argument < 0 ? argument + length : argument;
			for ( ; --i >= 0; ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
			var i = argument < 0 ? argument + length : argument;
			for ( ; ++i < length; ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		})
	}
};

Expr.pseudos["nth"] = Expr.pseudos["eq"];

// Add button/input type pseudos
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
	Expr.pseudos[ i ] = createInputPseudo( i );
}
for ( i in { submit: true, reset: true } ) {
	Expr.pseudos[ i ] = createButtonPseudo( i );
}

// Easy API for creating new setFilters
function setFilters() {}
setFilters.prototype = Expr.filters = Expr.pseudos;
Expr.setFilters = new setFilters();

tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
	var matched, match, tokens, type,
		soFar, groups, preFilters,
		cached = tokenCache[ selector + " " ];

	if ( cached ) {
		return parseOnly ? 0 : cached.slice( 0 );
	}

	soFar = selector;
	groups = [];
	preFilters = Expr.preFilter;

	while ( soFar ) {

		// Comma and first run
		if ( !matched || (match = rcomma.exec( soFar )) ) {
			if ( match ) {
				// Don't consume trailing commas as valid
				soFar = soFar.slice( match[0].length ) || soFar;
			}
			groups.push( (tokens = []) );
		}

		matched = false;

		// Combinators
		if ( (match = rcombinators.exec( soFar )) ) {
			matched = match.shift();
			tokens.push({
				value: matched,
				// Cast descendant combinators to space
				type: match[0].replace( rtrim, " " )
			});
			soFar = soFar.slice( matched.length );
		}

		// Filters
		for ( type in Expr.filter ) {
			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
				(match = preFilters[ type ]( match ))) ) {
				matched = match.shift();
				tokens.push({
					value: matched,
					type: type,
					matches: match
				});
				soFar = soFar.slice( matched.length );
			}
		}

		if ( !matched ) {
			break;
		}
	}

	// 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
			tokenCache( selector, groups ).slice( 0 );
};

function toSelector( tokens ) {
	var i = 0,
		len = tokens.length,
		selector = "";
	for ( ; i < len; i++ ) {
		selector += tokens[i].value;
	}
	return selector;
}

function addCombinator( matcher, combinator, base ) {
	var dir = combinator.dir,
		checkNonElements = base && dir === "parentNode",
		doneName = done++;

	return combinator.first ?
		// Check against closest ancestor/preceding element
		function( elem, context, xml ) {
			while ( (elem = elem[ dir ]) ) {
				if ( elem.nodeType === 1 || checkNonElements ) {
					return matcher( elem, context, xml );
				}
			}
		} :

		// Check against all ancestor/preceding elements
		function( elem, context, xml ) {
			var oldCache, uniqueCache, outerCache,
				newCache = [ dirruns, doneName ];

			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
			if ( xml ) {
				while ( (elem = elem[ dir ]) ) {
					if ( elem.nodeType === 1 || checkNonElements ) {
						if ( matcher( elem, context, xml ) ) {
							return true;
						}
					}
				}
			} else {
				while ( (elem = elem[ dir ]) ) {
					if ( elem.nodeType === 1 || checkNonElements ) {
						outerCache = elem[ expando ] || (elem[ expando ] = {});

						// Support: IE <9 only
						// Defend against cloned attroperties (jQuery gh-1709)
						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});

						if ( (oldCache = uniqueCache[ dir ]) &&
							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {

							// Assign to newCache so results back-propagate to previous elements
							return (newCache[ 2 ] = oldCache[ 2 ]);
						} else {
							// Reuse newcache so results back-propagate to previous elements
							uniqueCache[ dir ] = newCache;

							// A match means we're done; a fail means we have to keep checking
							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
								return true;
							}
						}
					}
				}
			}
		};
}

function elementMatcher( matchers ) {
	return matchers.length > 1 ?
		function( elem, context, xml ) {
			var i = matchers.length;
			while ( i-- ) {
				if ( !matchers[i]( elem, context, xml ) ) {
					return false;
				}
			}
			return true;
		} :
		matchers[0];
}

function multipleContexts( selector, contexts, results ) {
	var i = 0,
		len = contexts.length;
	for ( ; i < len; i++ ) {
		Sizzle( selector, contexts[i], results );
	}
	return results;
}

function condense( unmatched, map, filter, context, xml ) {
	var elem,
		newUnmatched = [],
		i = 0,
		len = unmatched.length,
		mapped = map != null;

	for ( ; i < len; i++ ) {
		if ( (elem = unmatched[i]) ) {
			if ( !filter || filter( elem, context, xml ) ) {
				newUnmatched.push( elem );
				if ( mapped ) {
					map.push( i );
				}
			}
		}
	}

	return newUnmatched;
}

function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
	if ( postFilter && !postFilter[ expando ] ) {
		postFilter = setMatcher( postFilter );
	}
	if ( postFinder && !postFinder[ expando ] ) {
		postFinder = setMatcher( postFinder, postSelector );
	}
	return markFunction(function( seed, results, context, xml ) {
		var temp, i, elem,
			preMap = [],
			postMap = [],
			preexisting = results.length,

			// Get initial elements from seed or context
			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),

			// Prefilter to get matcher input, preserving a map for seed-results synchronization
			matcherIn = preFilter && ( seed || !selector ) ?
				condense( elems, preMap, preFilter, context, xml ) :
				elems,

			matcherOut = matcher ?
				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?

					// ...intermediate processing is necessary
					[] :

					// ...otherwise use results directly
					results :
				matcherIn;

		// Find primary matches
		if ( matcher ) {
			matcher( matcherIn, matcherOut, context, xml );
		}

		// Apply postFilter
		if ( postFilter ) {
			temp = condense( matcherOut, postMap );
			postFilter( temp, [], context, xml );

			// Un-match failing elements by moving them back to matcherIn
			i = temp.length;
			while ( i-- ) {
				if ( (elem = temp[i]) ) {
					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
				}
			}
		}

		if ( seed ) {
			if ( postFinder || preFilter ) {
				if ( postFinder ) {
					// Get the final matcherOut by condensing this intermediate into postFinder contexts
					temp = [];
					i = matcherOut.length;
					while ( i-- ) {
						if ( (elem = matcherOut[i]) ) {
							// Restore matcherIn since elem is not yet a final match
							temp.push( (matcherIn[i] = elem) );
						}
					}
					postFinder( null, (matcherOut = []), temp, xml );
				}

				// Move matched elements from seed to results to keep them synchronized
				i = matcherOut.length;
				while ( i-- ) {
					if ( (elem = matcherOut[i]) &&
						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {

						seed[temp] = !(results[temp] = elem);
					}
				}
			}

		// Add elements to results, through postFinder if defined
		} else {
			matcherOut = condense(
				matcherOut === results ?
					matcherOut.splice( preexisting, matcherOut.length ) :
					matcherOut
			);
			if ( postFinder ) {
				postFinder( null, results, matcherOut, xml );
			} else {
				push.apply( results, matcherOut );
			}
		}
	});
}

function matcherFromTokens( tokens ) {
	var checkContext, matcher, j,
		len = tokens.length,
		leadingRelative = Expr.relative[ tokens[0].type ],
		implicitRelative = leadingRelative || Expr.relative[" "],
		i = leadingRelative ? 1 : 0,

		// The foundational matcher ensures that elements are reachable from top-level context(s)
		matchContext = addCombinator( function( elem ) {
			return elem === checkContext;
		}, implicitRelative, true ),
		matchAnyContext = addCombinator( function( elem ) {
			return indexOf( checkContext, elem ) > -1;
		}, implicitRelative, true ),
		matchers = [ function( elem, context, xml ) {
			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
				(checkContext = context).nodeType ?
					matchContext( elem, context, xml ) :
					matchAnyContext( elem, context, xml ) );
			// Avoid hanging onto element (issue #299)
			checkContext = null;
			return ret;
		} ];

	for ( ; i < len; i++ ) {
		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
		} else {
			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );

			// Return special upon seeing a positional matcher
			if ( matcher[ expando ] ) {
				// Find the next relative operator (if any) for proper handling
				j = ++i;
				for ( ; j < len; j++ ) {
					if ( Expr.relative[ tokens[j].type ] ) {
						break;
					}
				}
				return setMatcher(
					i > 1 && elementMatcher( matchers ),
					i > 1 && toSelector(
						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
					).replace( rtrim, "$1" ),
					matcher,
					i < j && matcherFromTokens( tokens.slice( i, j ) ),
					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
					j < len && toSelector( tokens )
				);
			}
			matchers.push( matcher );
		}
	}

	return elementMatcher( matchers );
}

function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
	var bySet = setMatchers.length > 0,
		byElement = elementMatchers.length > 0,
		superMatcher = function( seed, context, xml, results, outermost ) {
			var elem, j, matcher,
				matchedCount = 0,
				i = "0",
				unmatched = seed && [],
				setMatched = [],
				contextBackup = outermostContext,
				// We must always have either seed elements or outermost context
				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
				// Use integer dirruns iff this is the outermost matcher
				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
				len = elems.length;

			if ( outermost ) {
				outermostContext = context === document || context || outermost;
			}

			// Add elements passing elementMatchers directly to results
			// Support: IE<9, Safari
			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
				if ( byElement && elem ) {
					j = 0;
					if ( !context && elem.ownerDocument !== document ) {
						setDocument( elem );
						xml = !documentIsHTML;
					}
					while ( (matcher = elementMatchers[j++]) ) {
						if ( matcher( elem, context || document, xml) ) {
							results.push( elem );
							break;
						}
					}
					if ( outermost ) {
						dirruns = dirrunsUnique;
					}
				}

				// Track unmatched elements for set filters
				if ( bySet ) {
					// They will have gone through all possible matchers
					if ( (elem = !matcher && elem) ) {
						matchedCount--;
					}

					// Lengthen the array for every element, matched or not
					if ( seed ) {
						unmatched.push( elem );
					}
				}
			}

			// `i` is now the count of elements visited above, and adding it to `matchedCount`
			// makes the latter nonnegative.
			matchedCount += i;

			// Apply set filters to unmatched elements
			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
			// no element matchers and no seed.
			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
			// numerically zero.
			if ( bySet && i !== matchedCount ) {
				j = 0;
				while ( (matcher = setMatchers[j++]) ) {
					matcher( unmatched, setMatched, context, xml );
				}

				if ( seed ) {
					// Reintegrate element matches to eliminate the need for sorting
					if ( matchedCount > 0 ) {
						while ( i-- ) {
							if ( !(unmatched[i] || setMatched[i]) ) {
								setMatched[i] = pop.call( results );
							}
						}
					}

					// Discard index placeholder values to get only actual matches
					setMatched = condense( setMatched );
				}

				// Add matches to results
				push.apply( results, setMatched );

				// Seedless set matches succeeding multiple successful matchers stipulate sorting
				if ( outermost && !seed && setMatched.length > 0 &&
					( matchedCount + setMatchers.length ) > 1 ) {

					Sizzle.uniqueSort( results );
				}
			}

			// Override manipulation of globals by nested matchers
			if ( outermost ) {
				dirruns = dirrunsUnique;
				outermostContext = contextBackup;
			}

			return unmatched;
		};

	return bySet ?
		markFunction( superMatcher ) :
		superMatcher;
}

compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
	var i,
		setMatchers = [],
		elementMatchers = [],
		cached = compilerCache[ selector + " " ];

	if ( !cached ) {
		// Generate a function of recursive functions that can be used to check each element
		if ( !match ) {
			match = tokenize( selector );
		}
		i = match.length;
		while ( i-- ) {
			cached = matcherFromTokens( match[i] );
			if ( cached[ expando ] ) {
				setMatchers.push( cached );
			} else {
				elementMatchers.push( cached );
			}
		}

		// Cache the compiled function
		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );

		// Save selector and tokenization
		cached.selector = selector;
	}
	return cached;
};

/**
 * A low-level selection function that works with Sizzle's compiled
 *  selector functions
 * @param {String|Function} selector A selector or a pre-compiled
 *  selector function built with Sizzle.compile
 * @param {Element} context
 * @param {Array} [results]
 * @param {Array} [seed] A set of elements to match against
 */
select = Sizzle.select = function( selector, context, results, seed ) {
	var i, tokens, token, type, find,
		compiled = typeof selector === "function" && selector,
		match = !seed && tokenize( (selector = compiled.selector || selector) );

	results = results || [];

	// Try to minimize operations if there is only one selector in the list and no seed
	// (the latter of which guarantees us context)
	if ( match.length === 1 ) {

		// Reduce context if the leading compound selector is an ID
		tokens = match[0] = match[0].slice( 0 );
		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
				support.getById && context.nodeType === 9 && documentIsHTML &&
				Expr.relative[ tokens[1].type ] ) {

			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
			if ( !context ) {
				return results;

			// Precompiled matchers will still verify ancestry, so step up a level
			} else if ( compiled ) {
				context = context.parentNode;
			}

			selector = selector.slice( tokens.shift().value.length );
		}

		// Fetch a seed set for right-to-left matching
		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
		while ( i-- ) {
			token = tokens[i];

			// Abort if we hit a combinator
			if ( Expr.relative[ (type = token.type) ] ) {
				break;
			}
			if ( (find = Expr.find[ type ]) ) {
				// Search, expanding context for leading sibling combinators
				if ( (seed = find(
					token.matches[0].replace( runescape, funescape ),
					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
				)) ) {

					// If seed is empty or no tokens remain, we can return early
					tokens.splice( i, 1 );
					selector = seed.length && toSelector( tokens );
					if ( !selector ) {
						push.apply( results, seed );
						return results;
					}

					break;
				}
			}
		}
	}

	// Compile and execute a filtering function if one is not provided
	// Provide `match` to avoid retokenization if we modified the selector above
	( compiled || compile( selector, match ) )(
		seed,
		context,
		!documentIsHTML,
		results,
		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
	);
	return results;
};

// One-time assignments

// Sort stability
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;

// Support: Chrome 14-35+
// Always assume duplicates if they aren't passed to the comparison function
support.detectDuplicates = !!hasDuplicate;

// Initialize against the default document
setDocument();

// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
// Detached nodes confoundingly follow *each other*
support.sortDetached = assert(function( div1 ) {
	// Should return 1, but returns 4 (following)
	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
});

// Support: IE<8
// Prevent attribute/property "interpolation"
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
if ( !assert(function( div ) {
	div.innerHTML = "<a href='#'></a>";
	return div.firstChild.getAttribute("href") === "#" ;
}) ) {
	addHandle( "type|href|height|width", function( elem, name, isXML ) {
		if ( !isXML ) {
			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
		}
	});
}

// Support: IE<9
// Use defaultValue in place of getAttribute("value")
if ( !support.attributes || !assert(function( div ) {
	div.innerHTML = "<input/>";
	div.firstChild.setAttribute( "value", "" );
	return div.firstChild.getAttribute( "value" ) === "";
}) ) {
	addHandle( "value", function( elem, name, isXML ) {
		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
			return elem.defaultValue;
		}
	});
}

// Support: IE<9
// Use getAttributeNode to fetch booleans when getAttribute lies
if ( !assert(function( div ) {
	return div.getAttribute("disabled") == null;
}) ) {
	addHandle( booleans, function( elem, name, isXML ) {
		var val;
		if ( !isXML ) {
			return elem[ name ] === true ? name.toLowerCase() :
					(val = elem.getAttributeNode( name )) && val.specified ?
					val.value :
				null;
		}
	});
}

return Sizzle;

})( window );



jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;



var dir = function( elem, dir, until ) {
	var matched = [],
		truncate = until !== undefined;

	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
		if ( elem.nodeType === 1 ) {
			if ( truncate && jQuery( elem ).is( until ) ) {
				break;
			}
			matched.push( elem );
		}
	}
	return matched;
};


var siblings = function( n, elem ) {
	var matched = [];

	for ( ; n; n = n.nextSibling ) {
		if ( n.nodeType === 1 && n !== elem ) {
			matched.push( n );
		}
	}

	return matched;
};


var rneedsContext = jQuery.expr.match.needsContext;

var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );



var risSimple = /^.[^:#\[\.,]*$/;

// Implement the identical functionality for filter and not
function winnow( elements, qualifier, not ) {
	if ( jQuery.isFunction( qualifier ) ) {
		return jQuery.grep( elements, function( elem, i ) {
			/* jshint -W018 */
			return !!qualifier.call( elem, i, elem ) !== not;
		} );

	}

	if ( qualifier.nodeType ) {
		return jQuery.grep( elements, function( elem ) {
			return ( elem === qualifier ) !== not;
		} );

	}

	if ( typeof qualifier === "string" ) {
		if ( risSimple.test( qualifier ) ) {
			return jQuery.filter( qualifier, elements, not );
		}

		qualifier = jQuery.filter( qualifier, elements );
	}

	return jQuery.grep( elements, function( elem ) {
		return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not;
	} );
}

jQuery.filter = function( expr, elems, not ) {
	var elem = elems[ 0 ];

	if ( not ) {
		expr = ":not(" + expr + ")";
	}

	return elems.length === 1 && elem.nodeType === 1 ?
		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
			return elem.nodeType === 1;
		} ) );
};

jQuery.fn.extend( {
	find: function( selector ) {
		var i,
			ret = [],
			self = this,
			len = self.length;

		if ( typeof selector !== "string" ) {
			return this.pushStack( jQuery( selector ).filter( function() {
				for ( i = 0; i < len; i++ ) {
					if ( jQuery.contains( self[ i ], this ) ) {
						return true;
					}
				}
			} ) );
		}

		for ( i = 0; i < len; i++ ) {
			jQuery.find( selector, self[ i ], ret );
		}

		// Needed because $( selector, context ) becomes $( context ).find( selector )
		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
		ret.selector = this.selector ? this.selector + " " + selector : selector;
		return ret;
	},
	filter: function( selector ) {
		return this.pushStack( winnow( this, selector || [], false ) );
	},
	not: function( selector ) {
		return this.pushStack( winnow( this, selector || [], true ) );
	},
	is: function( selector ) {
		return !!winnow(
			this,

			// 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".
			typeof selector === "string" && rneedsContext.test( selector ) ?
				jQuery( selector ) :
				selector || [],
			false
		).length;
	}
} );


// Initialize a jQuery object


// A central reference to the root jQuery(document)
var rootjQuery,

	// A simple way to check for HTML strings
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
	// Strict HTML recognition (#11290: must start with <)
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,

	init = jQuery.fn.init = function( selector, context, root ) {
		var match, elem;

		// HANDLE: $(""), $(null), $(undefined), $(false)
		if ( !selector ) {
			return this;
		}

		// init accepts an alternate rootjQuery
		// so migrate can support jQuery.sub (gh-2101)
		root = root || rootjQuery;

		// 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;

					// scripts is true for back-compat
					// Intentionally let the error be thrown if parseHTML is not present
					jQuery.merge( this, jQuery.parseHTML(
						match[ 1 ],
						context && context.nodeType ? context.ownerDocument || context : document,
						true
					) );

					// HANDLE: $(html, props)
					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
						for ( match in context ) {

							// Properties of context are called as methods if possible
							if ( jQuery.isFunction( this[ match ] ) ) {
								this[ match ]( context[ match ] );

							// ...and otherwise set as attributes
							} else {
								this.attr( match, context[ match ] );
							}
						}
					}

					return this;

				// 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 || root ).find( selector );

			// HANDLE: $(expr, context)
			// (which is just equivalent to: $(context).find(expr)
			} else {
				return this.constructor( context ).find( selector );
			}

		// HANDLE: $(DOMElement)
		} else if ( selector.nodeType ) {
			this.context = this[ 0 ] = selector;
			this.length = 1;
			return this;

		// HANDLE: $(function)
		// Shortcut for document ready
		} else if ( jQuery.isFunction( selector ) ) {
			return typeof root.ready !== "undefined" ?
				root.ready( selector ) :

				// Execute immediately if ready is not present
				selector( jQuery );
		}

		if ( selector.selector !== undefined ) {
			this.selector = selector.selector;
			this.context = selector.context;
		}

		return jQuery.makeArray( selector, this );
	};

// Give the init function the jQuery prototype for later instantiation
init.prototype = jQuery.fn;

// Initialize central reference
rootjQuery = jQuery( document );


var rparentsprev = /^(?:parents|prev(?:Until|All))/,

	// 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( {
	has: function( 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;
				}
			}
		} );
	},

	closest: function( selectors, context ) {
		var cur,
			i = 0,
			l = this.length,
			matched = [],
			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
				jQuery( selectors, context || this.context ) :
				0;

		for ( ; i < l; i++ ) {
			for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {

				// Always skip document fragments
				if ( cur.nodeType < 11 && ( pos ?
					pos.index( cur ) > -1 :

					// Don't pass non-elements to Sizzle
					cur.nodeType === 1 &&
						jQuery.find.matchesSelector( cur, selectors ) ) ) {

					matched.push( cur );
					break;
				}
			}
		}

		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
	},

	// Determine the position of an element within
	// the matched set of elements
	index: function( elem ) {

		// No argument, return index in parent
		if ( !elem ) {
			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().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( selector, context ) {
		return this.pushStack(
			jQuery.uniqueSort(
				jQuery.merge( this.get(), jQuery( selector, context ) )
			)
		);
	},

	addBack: function( selector ) {
		return this.add( selector == null ?
			this.prevObject : this.prevObject.filter( selector )
		);
	}
} );

function sibling( cur, dir ) {
	do {
		cur = cur[ dir ];
	} while ( cur && cur.nodeType !== 1 );

	return cur;
}

jQuery.each( {
	parent: function( elem ) {
		var parent = elem.parentNode;
		return parent && parent.nodeType !== 11 ? parent : null;
	},
	parents: function( elem ) {
		return dir( elem, "parentNode" );
	},
	parentsUntil: function( elem, i, until ) {
		return dir( elem, "parentNode", until );
	},
	next: function( elem ) {
		return sibling( elem, "nextSibling" );
	},
	prev: function( elem ) {
		return sibling( elem, "previousSibling" );
	},
	nextAll: function( elem ) {
		return dir( elem, "nextSibling" );
	},
	prevAll: function( elem ) {
		return dir( elem, "previousSibling" );
	},
	nextUntil: function( elem, i, until ) {
		return dir( elem, "nextSibling", until );
	},
	prevUntil: function( elem, i, until ) {
		return dir( elem, "previousSibling", until );
	},
	siblings: function( elem ) {
		return siblings( ( elem.parentNode || {} ).firstChild, elem );
	},
	children: function( elem ) {
		return siblings( elem.firstChild );
	},
	contents: function( 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 ( name.slice( -5 ) !== "Until" ) {
			selector = until;
		}

		if ( selector && typeof selector === "string" ) {
			ret = jQuery.filter( selector, ret );
		}

		if ( this.length > 1 ) {

			// Remove duplicates
			if ( !guaranteedUnique[ name ] ) {
				ret = jQuery.uniqueSort( ret );
			}

			// Reverse order for parents* and prev-derivatives
			if ( rparentsprev.test( name ) ) {
				ret = ret.reverse();
			}
		}

		return this.pushStack( ret );
	};
} );
var rnotwhite = ( /\S+/g );



// Convert String-formatted options into Object-formatted ones
function createOptions( options ) {
	var object = {};
	jQuery.each( options.match( rnotwhite ) || [], 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" ?
		createOptions( options ) :
		jQuery.extend( {}, options );

	var // Flag to know if list is currently firing
		firing,

		// Last fire value for non-forgettable lists
		memory,

		// Flag to know if list was already fired
		fired,

		// Flag to prevent firing
		locked,

		// Actual callback list
		list = [],

		// Queue of execution data for repeatable lists
		queue = [],

		// Index of currently firing callback (modified by add/remove as needed)
		firingIndex = -1,

		// Fire callbacks
		fire = function() {

			// Enforce single-firing
			locked = options.once;

			// Execute callbacks for all pending executions,
			// respecting firingIndex overrides and runtime changes
			fired = firing = true;
			for ( ; queue.length; firingIndex = -1 ) {
				memory = queue.shift();
				while ( ++firingIndex < list.length ) {

					// Run callback and check for early termination
					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
						options.stopOnFalse ) {

						// Jump to end and forget the data so .add doesn't re-fire
						firingIndex = list.length;
						memory = false;
					}
				}
			}

			// Forget the data if we're done with it
			if ( !options.memory ) {
				memory = false;
			}

			firing = false;

			// Clean up if we're done firing for good
			if ( locked ) {

				// Keep an empty list if we have data for future add calls
				if ( memory ) {
					list = [];

				// Otherwise, this object is spent
				} else {
					list = "";
				}
			}
		},

		// Actual Callbacks object
		self = {

			// Add a callback or a collection of callbacks to the list
			add: function() {
				if ( list ) {

					// If we have memory from a past run, we should fire after adding
					if ( memory && !firing ) {
						firingIndex = list.length - 1;
						queue.push( memory );
					}

					( function add( args ) {
						jQuery.each( args, function( _, arg ) {
							if ( jQuery.isFunction( arg ) ) {
								if ( !options.unique || !self.has( arg ) ) {
									list.push( arg );
								}
							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {

								// Inspect recursively
								add( arg );
							}
						} );
					} )( arguments );

					if ( memory && !firing ) {
						fire();
					}
				}
				return this;
			},

			// Remove a callback from the list
			remove: function() {
				jQuery.each( arguments, function( _, arg ) {
					var index;
					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
						list.splice( index, 1 );

						// Handle firing indexes
						if ( index <= firingIndex ) {
							firingIndex--;
						}
					}
				} );
				return this;
			},

			// Check if a given callback is in the list.
			// If no argument is given, return whether or not list has callbacks attached.
			has: function( fn ) {
				return fn ?
					jQuery.inArray( fn, list ) > -1 :
					list.length > 0;
			},

			// Remove all callbacks from the list
			empty: function() {
				if ( list ) {
					list = [];
				}
				return this;
			},

			// Disable .fire and .add
			// Abort any current/pending executions
			// Clear all callbacks and values
			disable: function() {
				locked = queue = [];
				list = memory = "";
				return this;
			},
			disabled: function() {
				return !list;
			},

			// Disable .fire
			// Also disable .add unless we have memory (since it would have no effect)
			// Abort any pending executions
			lock: function() {
				locked = true;
				if ( !memory ) {
					self.disable();
				}
				return this;
			},
			locked: function() {
				return !!locked;
			},

			// Call all callbacks with the given context and arguments
			fireWith: function( context, args ) {
				if ( !locked ) {
					args = args || [];
					args = [ context, args.slice ? args.slice() : args ];
					queue.push( args );
					if ( !firing ) {
						fire();
					}
				}
				return this;
			},

			// Call all the callbacks with the given arguments
			fire: function() {
				self.fireWith( this, arguments );
				return this;
			},

			// To know if the callbacks have already been called at least once
			fired: function() {
				return !!fired;
			}
		};

	return self;
};


jQuery.extend( {

	Deferred: function( 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() {
					return state;
				},
				always: function() {
					deferred.done( arguments ).fail( arguments );
					return this;
				},
				then: function( /* fnDone, fnFail, fnProgress */ ) {
					var fns = arguments;
					return jQuery.Deferred( function( newDefer ) {
						jQuery.each( tuples, function( i, tuple ) {
							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];

							// deferred[ done | fail | progress ] for forwarding actions to newDefer
							deferred[ tuple[ 1 ] ]( function() {
								var returned = fn && fn.apply( this, arguments );
								if ( returned && jQuery.isFunction( returned.promise ) ) {
									returned.promise()
										.progress( newDefer.notify )
										.done( newDefer.resolve )
										.fail( newDefer.reject );
								} else {
									newDefer[ tuple[ 0 ] + "With" ](
										this === promise ? newDefer.promise() : this,
										fn ? [ returned ] : arguments
									);
								}
							} );
						} );
						fns = null;
					} ).promise();
				},

				// Get a promise for this deferred
				// If obj is provided, the promise aspect is added to the object
				promise: function( obj ) {
					return obj != null ? 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 ]
			deferred[ tuple[ 0 ] ] = function() {
				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
				return this;
			};
			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( subordinate /* , ..., subordinateN */ ) {
		var i = 0,
			resolveValues = 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( i, contexts, values ) {
				return function( value ) {
					contexts[ i ] = this;
					values[ i ] = arguments.length > 1 ? 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()
						.progress( updateFunc( i, progressContexts, progressValues ) )
						.done( updateFunc( i, resolveContexts, resolveValues ) )
						.fail( deferred.reject );
				} else {
					--remaining;
				}
			}
		}

		// if we're not waiting on anything, resolve the master
		if ( !remaining ) {
			deferred.resolveWith( resolveContexts, resolveValues );
		}

		return deferred.promise();
	}
} );


// The deferred used on DOM ready
var readyList;

jQuery.fn.ready = function( fn ) {

	// Add the callback
	jQuery.ready.promise().done( fn );

	return this;
};

jQuery.extend( {

	// 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( hold ) {
		if ( hold ) {
			jQuery.readyWait++;
		} else {
			jQuery.ready( true );
		}
	},

	// Handle when the DOM is ready
	ready: function( wait ) {

		// Abort if there are pending holds or we're already ready
		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
			return;
		}

		// 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.triggerHandler ) {
			jQuery( document ).triggerHandler( "ready" );
			jQuery( document ).off( "ready" );
		}
	}
} );

/**
 * Clean-up method for dom ready events
 */
function detach() {
	if ( document.addEventListener ) {
		document.removeEventListener( "DOMContentLoaded", completed );
		window.removeEventListener( "load", completed );

	} else {
		document.detachEvent( "onreadystatechange", completed );
		window.detachEvent( "onload", completed );
	}
}

/**
 * The ready event handler and self cleanup method
 */
function completed() {

	// readyState === "complete" is good enough for us to call the dom ready in oldIE
	if ( document.addEventListener ||
		window.event.type === "load" ||
		document.readyState === "complete" ) {

		detach();
		jQuery.ready();
	}
}

jQuery.ready.promise = function( obj ) {
	if ( !readyList ) {

		readyList = jQuery.Deferred();

		// Catch cases where $(document).ready() is called
		// after the browser event has already occurred.
		// Support: IE6-10
		// Older IE sometimes signals "interactive" too soon
		if ( document.readyState === "complete" ||
			( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {

			// Handle it asynchronously to allow scripts the opportunity to delay ready
			window.setTimeout( jQuery.ready );

		// Standards-based browsers support DOMContentLoaded
		} else if ( document.addEventListener ) {

			// Use the handy event callback
			document.addEventListener( "DOMContentLoaded", completed );

			// A fallback to window.onload, that will always work
			window.addEventListener( "load", completed );

		// If IE event model is used
		} else {

			// Ensure firing before onload, maybe late but safe also for iframes
			document.attachEvent( "onreadystatechange", completed );

			// A fallback to window.onload, that will always work
			window.attachEvent( "onload", completed );

			// 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 window.setTimeout( doScrollCheck, 50 );
						}

						// detach all dom ready events
						detach();

						// and execute any waiting functions
						jQuery.ready();
					}
				} )();
			}
		}
	}
	return readyList.promise( obj );
};

// Kick off the DOM ready check even if the user does not
jQuery.ready.promise();




// Support: IE<9
// Iteration over object's inherited properties before its own
var i;
for ( i in jQuery( support ) ) {
	break;
}
support.ownFirst = i === "0";

// Note: most support tests are defined in their respective modules.
// false until the test is run
support.inlineBlockNeedsLayout = false;

// Execute ASAP in case we need to set body.style.zoom
jQuery( function() {

	// Minified: var a,b,c,d
	var val, div, body, container;

	body = document.getElementsByTagName( "body" )[ 0 ];
	if ( !body || !body.style ) {

		// Return for frameset docs that don't have a body
		return;
	}

	// Setup
	div = document.createElement( "div" );
	container = document.createElement( "div" );
	container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
	body.appendChild( container ).appendChild( div );

	if ( typeof div.style.zoom !== "undefined" ) {

		// Support: IE<8
		// Check if natively block-level elements act like inline-block
		// elements when setting their display to 'inline' and giving
		// them layout
		div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";

		support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
		if ( val ) {

			// Prevent IE 6 from affecting layout for positioned elements #11048
			// Prevent IE from shrinking the body in IE 7 mode #12869
			// Support: IE<8
			body.style.zoom = 1;
		}
	}

	body.removeChild( container );
} );


( function() {
	var div = document.createElement( "div" );

	// Support: IE<9
	support.deleteExpando = true;
	try {
		delete div.test;
	} catch ( e ) {
		support.deleteExpando = false;
	}

	// Null elements to avoid leaks in IE.
	div = null;
} )();
var acceptData = function( elem ) {
	var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ],
		nodeType = +elem.nodeType || 1;

	// Do not set data on non-element DOM nodes because it will not be cleared (#8335).
	return nodeType !== 1 && nodeType !== 9 ?
		false :

		// Nodes accept data unless otherwise specified; rejection can be conditional
		!noData || noData !== true && elem.getAttribute( "classid" ) === noData;
};




var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
	rmultiDash = /([A-Z])/g;

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;
}

function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
	if ( !acceptData( elem ) ) {
		return;
	}

	var ret, thisCache,
		internalKey = jQuery.expando,

		// 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 ) ) &&
		data === undefined && typeof name === "string" ) {
		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 ) {
			id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
		} else {
			id = internalKey;
		}
	}

	if ( !cache[ id ] ) {

		// Avoid exposing jQuery metadata on plain JS objects when the object
		// is serialized using JSON.stringify
		cache[ id ] = isNode ? {} : { 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 ( typeof name === "string" ) {

		// 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;
}

function internalRemoveData( elem, name, pvt ) {
	if ( !acceptData( elem ) ) {
		return;
	}

	var thisCache, i,
		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( " " );
					}
				}
			} else {

				// If "name" is an array of keys...
				// When data is initially created, via ("key", "val") signature,
				// keys will be converted to camelCase.
				// Since there is no way to tell _how_ a key was added, remove
				// both plain key and camelCase key. #12786
				// This will only penalize the array argument path.
				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
			}

			i = name.length;
			while ( 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( thisCache ) : !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)
	/* jshint eqeqeq: false */
	} else if ( support.deleteExpando || cache != cache.window ) {
		/* jshint eqeqeq: true */
		delete cache[ id ];

	// When all else fails, undefined
	} else {
		cache[ id ] = undefined;
	}
}

jQuery.extend( {
	cache: {},

	// The following elements (space-suffixed to avoid Object.prototype collisions)
	// throw uncatchable exceptions if you attempt to set expando properties
	noData: {
		"applet ": true,
		"embed ": true,

		// ...but Flash objects (which have this classid) *can* handle expandos
		"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
	},

	hasData: function( elem ) {
		elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ];
		return !!elem && !isEmptyDataObject( elem );
	},

	data: function( elem, name, data ) {
		return internalData( elem, name, data );
	},

	removeData: function( elem, name ) {
		return internalRemoveData( elem, name );
	},

	// For internal use only.
	_data: function( elem, name, data ) {
		return internalData( elem, name, data, true );
	},

	_removeData: function( elem, name ) {
		return internalRemoveData( elem, name, true );
	}
} );

jQuery.fn.extend( {
	data: function( key, value ) {
		var i, name, data,
			elem = this[ 0 ],
			attrs = elem && elem.attributes;

		// Special expections of .data basically thwart jQuery.access,
		// so implement the relevant behavior ourselves

		// Gets all values
		if ( key === undefined ) {
			if ( this.length ) {
				data = jQuery.data( elem );

				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
					i = attrs.length;
					while ( i-- ) {

						// Support: IE11+
						// The attrs elements can be null (#14894)
						if ( attrs[ i ] ) {
							name = attrs[ i ].name;
							if ( name.indexOf( "data-" ) === 0 ) {
								name = jQuery.camelCase( name.slice( 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 );
			} );
		}

		return arguments.length > 1 ?

			// Sets one value
			this.each( function() {
				jQuery.data( this, key, value );
			} ) :

			// Gets one value
			// Try to fetch any internally stored data first
			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
	},

	removeData: function( key ) {
		return this.each( function() {
			jQuery.removeData( this, key );
		} );
	}
} );


jQuery.extend( {
	queue: function( 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( elem, type ) {
		type = type || "fx";

		var queue = jQuery.queue( elem, type ),
			startLength = queue.length,
			fn = queue.shift(),
			hooks = jQuery._queueHooks( elem, type ),
			next = function() {
				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( 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" );
				jQuery._removeData( elem, key );
			} )
		} );
	}
} );

jQuery.fn.extend( {
	queue: function( 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( type ) {
		return this.each( function() {
			jQuery.dequeue( this, type );
		} );
	},
	clearQueue: function( 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( type, obj ) {
		var tmp,
			count = 1,
			defer = jQuery.Deferred(),
			elements = this,
			i = this.length,
			resolve = function() {
				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 );
	}
} );


( function() {
	var shrinkWrapBlocksVal;

	support.shrinkWrapBlocks = function() {
		if ( shrinkWrapBlocksVal != null ) {
			return shrinkWrapBlocksVal;
		}

		// Will be changed later if needed.
		shrinkWrapBlocksVal = false;

		// Minified: var b,c,d
		var div, body, container;

		body = document.getElementsByTagName( "body" )[ 0 ];
		if ( !body || !body.style ) {

			// Test fired too early or in an unsupported environment, exit.
			return;
		}

		// Setup
		div = document.createElement( "div" );
		container = document.createElement( "div" );
		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
		body.appendChild( container ).appendChild( div );

		// Support: IE6
		// Check if elements with layout shrink-wrap their children
		if ( typeof div.style.zoom !== "undefined" ) {

			// Reset CSS: box-sizing; display; margin; border
			div.style.cssText =

				// Support: Firefox<29, Android 2.3
				// Vendor-prefix box-sizing
				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
				"box-sizing:content-box;display:block;margin:0;border:0;" +
				"padding:1px;width:1px;zoom:1";
			div.appendChild( document.createElement( "div" ) ).style.width = "5px";
			shrinkWrapBlocksVal = div.offsetWidth !== 3;
		}

		body.removeChild( container );

		return shrinkWrapBlocksVal;
	};

} )();
var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;

var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );


var cssExpand = [ "Top", "Right", "Bottom", "Left" ];

var isHidden = function( elem, el ) {

		// isHidden might be called from jQuery#filter function;
		// in that case, element will be second argument
		elem = el || elem;
		return jQuery.css( elem, "display" ) === "none" ||
			!jQuery.contains( elem.ownerDocument, elem );
	};



function adjustCSS( elem, prop, valueParts, tween ) {
	var adjusted,
		scale = 1,
		maxIterations = 20,
		currentValue = tween ?
			function() { return tween.cur(); } :
			function() { return jQuery.css( elem, prop, "" ); },
		initial = currentValue(),
		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),

		// Starting value computation is required for potential unit mismatches
		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
			rcssNum.exec( jQuery.css( elem, prop ) );

	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {

		// Trust units reported by jQuery.css
		unit = unit || initialInUnit[ 3 ];

		// Make sure we update the tween properties later on
		valueParts = valueParts || [];

		// Iteratively approximate from a nonzero starting point
		initialInUnit = +initial || 1;

		do {

			// If previous iteration zeroed out, double until we get *something*.
			// Use string for doubling so we don't accidentally see scale as unchanged below
			scale = scale || ".5";

			// Adjust and apply
			initialInUnit = initialInUnit / scale;
			jQuery.style( elem, prop, initialInUnit + unit );

		// Update scale, tolerating zero or NaN from tween.cur()
		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
		} while (
			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
		);
	}

	if ( valueParts ) {
		initialInUnit = +initialInUnit || +initial || 0;

		// Apply relative offset (+=/-=) if specified
		adjusted = valueParts[ 1 ] ?
			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
			+valueParts[ 2 ];
		if ( tween ) {
			tween.unit = unit;
			tween.start = initialInUnit;
			tween.end = adjusted;
		}
	}
	return adjusted;
}


// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it's a function
var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
	var i = 0,
		length = elems.length,
		bulk = key == null;

	// Sets many values
	if ( jQuery.type( key ) === "object" ) {
		chainable = true;
		for ( i in key ) {
			access( elems, fn, i, key[ i ], true, emptyGet, raw );
		}

	// Sets one value
	} else if ( value !== undefined ) {
		chainable = true;

		if ( !jQuery.isFunction( value ) ) {
			raw = true;
		}

		if ( bulk ) {

			// Bulk operations run against the entire set
			if ( raw ) {
				fn.call( elems, value );
				fn = null;

			// ...except when executing function values
			} else {
				bulk = fn;
				fn = function( elem, key, value ) {
					return bulk.call( jQuery( elem ), value );
				};
			}
		}

		if ( fn ) {
			for ( ; i < length; i++ ) {
				fn(
					elems[ i ],
					key,
					raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) )
				);
			}
		}
	}

	return chainable ?
		elems :

		// Gets
		bulk ?
			fn.call( elems ) :
			length ? fn( elems[ 0 ], key ) : emptyGet;
};
var rcheckableType = ( /^(?:checkbox|radio)$/i );

var rtagName = ( /<([\w:-]+)/ );

var rscriptType = ( /^$|\/(?:java|ecma)script/i );

var rleadingWhitespace = ( /^\s+/ );

var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" +
		"details|dialog|figcaption|figure|footer|header|hgroup|main|" +
		"mark|meter|nav|output|picture|progress|section|summary|template|time|video";



function createSafeFragment( document ) {
	var list = nodeNames.split( "|" ),
		safeFrag = document.createDocumentFragment();

	if ( safeFrag.createElement ) {
		while ( list.length ) {
			safeFrag.createElement(
				list.pop()
			);
		}
	}
	return safeFrag;
}


( function() {
	var div = document.createElement( "div" ),
		fragment = document.createDocumentFragment(),
		input = document.createElement( "input" );

	// Setup
	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";

	// IE strips leading whitespace when .innerHTML is used
	support.leadingWhitespace = div.firstChild.nodeType === 3;

	// Make sure that tbody elements aren't automatically inserted
	// IE will insert them into empty tables
	support.tbody = !div.getElementsByTagName( "tbody" ).length;

	// Make sure that link elements get serialized correctly by innerHTML
	// This requires a wrapper element in IE
	support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;

	// Makes sure cloning an html5 element does not cause problems
	// Where outerHTML is undefined, this still works
	support.html5Clone =
		document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";

	// Check if a disconnected checkbox will retain its checked
	// value of true after appended to the DOM (IE6/7)
	input.type = "checkbox";
	input.checked = true;
	fragment.appendChild( input );
	support.appendChecked = input.checked;

	// Make sure textarea (and checkbox) defaultValue is properly cloned
	// Support: IE6-IE11+
	div.innerHTML = "<textarea>x</textarea>";
	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;

	// #11217 - WebKit loses check when the name is after the checked attribute
	fragment.appendChild( div );

	// Support: Windows Web Apps (WWA)
	// `name` and `type` must use .setAttribute for WWA (#14901)
	input = document.createElement( "input" );
	input.setAttribute( "type", "radio" );
	input.setAttribute( "checked", "checked" );
	input.setAttribute( "name", "t" );

	div.appendChild( input );

	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
	// old WebKit doesn't clone checked state correctly in fragments
	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;

	// Support: IE<9
	// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
	support.noCloneEvent = !!div.addEventListener;

	// Support: IE<9
	// Since attributes and properties are the same in IE,
	// cleanData must set properties to undefined rather than use removeAttribute
	div[ jQuery.expando ] = 1;
	support.attributes = !div.getAttribute( jQuery.expando );
} )();


// We have to close these tags to support XHTML (#13200)
var wrapMap = {
	option: [ 1, "<select multiple='multiple'>", "</select>" ],
	legend: [ 1, "<fieldset>", "</fieldset>" ],
	area: [ 1, "<map>", "</map>" ],

	// Support: IE8
	param: [ 1, "<object>", "</object>" ],
	thead: [ 1, "<table>", "</table>" ],
	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
	col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],

	// 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.
	_default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
};

// Support: IE8-IE9
wrapMap.optgroup = wrapMap.option;

wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;


function getAll( context, tag ) {
	var elems, elem,
		i = 0,
		found = typeof context.getElementsByTagName !== "undefined" ?
			context.getElementsByTagName( tag || "*" ) :
			typeof context.querySelectorAll !== "undefined" ?
				context.querySelectorAll( tag || "*" ) :
				undefined;

	if ( !found ) {
		for ( found = [], elems = context.childNodes || context;
			( elem = elems[ i ] ) != null;
			i++
		) {
			if ( !tag || jQuery.nodeName( elem, tag ) ) {
				found.push( elem );
			} else {
				jQuery.merge( found, getAll( elem, tag ) );
			}
		}
	}

	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
		jQuery.merge( [ context ], found ) :
		found;
}


// Mark scripts as having already been evaluated
function setGlobalEval( elems, refElements ) {
	var elem,
		i = 0;
	for ( ; ( elem = elems[ i ] ) != null; i++ ) {
		jQuery._data(
			elem,
			"globalEval",
			!refElements || jQuery._data( refElements[ i ], "globalEval" )
		);
	}
}


var rhtml = /<|&#?\w+;/,
	rtbody = /<tbody/i;

function fixDefaultChecked( elem ) {
	if ( rcheckableType.test( elem.type ) ) {
		elem.defaultChecked = elem.checked;
	}
}

function buildFragment( elems, context, scripts, selection, ignored ) {
	var j, elem, contains,
		tmp, tag, tbody, wrap,
		l = elems.length,

		// Ensure a safe fragment
		safe = createSafeFragment( context ),

		nodes = [],
		i = 0;

	for ( ; i < l; i++ ) {
		elem = elems[ i ];

		if ( elem || elem === 0 ) {

			// Add nodes directly
			if ( jQuery.type( elem ) === "object" ) {
				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );

			// Convert non-html into a text node
			} else if ( !rhtml.test( elem ) ) {
				nodes.push( context.createTextNode( elem ) );

			// Convert html into DOM nodes
			} else {
				tmp = tmp || safe.appendChild( context.createElement( "div" ) );

				// Deserialize a standard representation
				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
				wrap = wrapMap[ tag ] || wrapMap._default;

				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];

				// Descend through wrappers to the right content
				j = wrap[ 0 ];
				while ( j-- ) {
					tmp = tmp.lastChild;
				}

				// Manually add leading whitespace removed by IE
				if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
					nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) );
				}

				// Remove IE's autoinserted <tbody> from table fragments
				if ( !support.tbody ) {

					// String was a <table>, *may* have spurious <tbody>
					elem = tag === "table" && !rtbody.test( elem ) ?
						tmp.firstChild :

						// String was a bare <thead> or <tfoot>
						wrap[ 1 ] === "<table>" && !rtbody.test( elem ) ?
							tmp :
							0;

					j = elem && elem.childNodes.length;
					while ( j-- ) {
						if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) &&
							!tbody.childNodes.length ) {

							elem.removeChild( tbody );
						}
					}
				}

				jQuery.merge( nodes, tmp.childNodes );

				// Fix #12392 for WebKit and IE > 9
				tmp.textContent = "";

				// Fix #12392 for oldIE
				while ( tmp.firstChild ) {
					tmp.removeChild( tmp.firstChild );
				}

				// Remember the top-level container for proper cleanup
				tmp = safe.lastChild;
			}
		}
	}

	// Fix #11356: Clear elements from fragment
	if ( tmp ) {
		safe.removeChild( tmp );
	}

	// Reset defaultChecked for any radios and checkboxes
	// about to be appended to the DOM in IE 6/7 (#8060)
	if ( !support.appendChecked ) {
		jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
	}

	i = 0;
	while ( ( elem = nodes[ i++ ] ) ) {

		// Skip elements already in the context collection (trac-4087)
		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
			if ( ignored ) {
				ignored.push( elem );
			}

			continue;
		}

		contains = jQuery.contains( elem.ownerDocument, elem );

		// Append to fragment
		tmp = getAll( safe.appendChild( elem ), "script" );

		// Preserve script evaluation history
		if ( contains ) {
			setGlobalEval( tmp );
		}

		// Capture executables
		if ( scripts ) {
			j = 0;
			while ( ( elem = tmp[ j++ ] ) ) {
				if ( rscriptType.test( elem.type || "" ) ) {
					scripts.push( elem );
				}
			}
		}
	}

	tmp = null;

	return safe;
}


( function() {
	var i, eventName,
		div = document.createElement( "div" );

	// Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)
	for ( i in { submit: true, change: true, focusin: true } ) {
		eventName = "on" + i;

		if ( !( support[ i ] = eventName in window ) ) {

			// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
			div.setAttribute( eventName, "t" );
			support[ i ] = div.attributes[ eventName ].expando === false;
		}
	}

	// Null elements to avoid leaks in IE.
	div = null;
} )();


var rformElems = /^(?:input|select|textarea)$/i,
	rkeyEvent = /^key/,
	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;

function returnTrue() {
	return true;
}

function returnFalse() {
	return false;
}

// Support: IE9
// See #13393 for more info
function safeActiveElement() {
	try {
		return document.activeElement;
	} catch ( err ) { }
}

function on( elem, types, selector, data, fn, one ) {
	var origFn, type;

	// Types can be a map of types/handlers
	if ( typeof types === "object" ) {

		// ( types-Object, selector, data )
		if ( typeof selector !== "string" ) {

			// ( types-Object, data )
			data = data || selector;
			selector = undefined;
		}
		for ( type in types ) {
			on( elem, type, selector, data, types[ type ], one );
		}
		return elem;
	}

	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 elem;
	}

	if ( one === 1 ) {
		origFn = fn;
		fn = function( 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 elem.each( function() {
		jQuery.event.add( this, types, fn, data, selector );
	} );
}

/*
 * Helper functions for managing events -- not part of the public interface.
 * Props to Dean Edwards' addEvent library for many of the ideas.
 */
jQuery.event = {

	global: {},

	add: function( elem, types, handler, data, selector ) {
		var tmp, events, t, handleObjIn,
			special, eventHandle, handleObj,
			handlers, type, namespaces, origType,
			elemData = jQuery._data( elem );

		// Don't attach events to noData or text/comment nodes (but allow plain objects)
		if ( !elemData ) {
			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
		if ( !( events = elemData.events ) ) {
			events = elemData.events = {};
		}
		if ( !( eventHandle = elemData.handle ) ) {
			eventHandle = elemData.handle = function( 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
		types = ( types || "" ).match( rnotwhite ) || [ "" ];
		t = types.length;
		while ( t-- ) {
			tmp = rtypenamespace.exec( types[ t ] ) || [];
			type = origType = tmp[ 1 ];
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();

			// There *must* be a type, no attaching namespace-only handlers
			if ( !type ) {
				continue;
			}

			// 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: origType,
				data: data,
				handler: handler,
				guid: handler.guid,
				selector: selector,
				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
				namespace: namespaces.join( "." )
			}, handleObjIn );

			// Init the event handler queue if we're the first
			if ( !( handlers = events[ type ] ) ) {
				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;
	},

	// Detach an event or set of events from an element
	remove: function( elem, types, handler, selector, mappedTypes ) {
		var j, handleObj, tmp,
			origCount, t, events,
			special, handlers, type,
			namespaces, origType,
			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 = ( types || "" ).match( rnotwhite ) || [ "" ];
		t = types.length;
		while ( t-- ) {
			tmp = rtypenamespace.exec( types[ t ] ) || [];
			type = origType = tmp[ 1 ];
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();

			// 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;
			handlers = events[ type ] || [];
			tmp = tmp[ 2 ] &&
				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );

			// Remove matching events
			origCount = j = handlers.length;
			while ( j-- ) {
				handleObj = handlers[ j ];

				if ( ( mappedTypes || origType === handleObj.origType ) &&
					( !handler || handler.guid === handleObj.guid ) &&
					( !tmp || tmp.test( handleObj.namespace ) ) &&
					( !selector || selector === handleObj.selector ||
						selector === "**" && handleObj.selector ) ) {
					handlers.splice( j, 1 );

					if ( handleObj.selector ) {
						handlers.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 ( origCount && !handlers.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" );
		}
	},

	trigger: function( event, data, elem, onlyHandlers ) {
		var handle, ontype, cur,
			bubbleType, special, tmp, i,
			eventPath = [ elem || document ],
			type = hasOwn.call( event, "type" ) ? event.type : event,
			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];

		cur = tmp = elem = elem || document;

		// Don't do events on text and comment nodes
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
			return;
		}

		// 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( "." ) > -1 ) {

			// Namespaced trigger; create a regexp to match event type in handle()
			namespaces = type.split( "." );
			type = namespaces.shift();
			namespaces.sort();
		}
		ontype = type.indexOf( ":" ) < 0 && "on" + type;

		// Caller can pass in a jQuery.Event object, Object, or just an event type string
		event = event[ jQuery.expando ] ?
			event :
			new jQuery.Event( type, typeof event === "object" && event );

		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
		event.isTrigger = onlyHandlers ? 2 : 3;
		event.namespace = namespaces.join( "." );
		event.rnamespace = event.namespace ?
			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
			null;

		// 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 ?
			[ event ] :
			jQuery.makeArray( data, [ event ] );

		// Allow special events to draw outside the lines
		special = jQuery.event.special[ type ] || {};
		if ( !onlyHandlers && 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)
		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {

			bubbleType = special.delegateType || type;
			if ( !rfocusMorph.test( bubbleType + type ) ) {
				cur = cur.parentNode;
			}
			for ( ; cur; cur = cur.parentNode ) {
				eventPath.push( cur );
				tmp = cur;
			}

			// Only add window if we got to document (e.g., not plain obj or detached DOM)
			if ( tmp === ( elem.ownerDocument || document ) ) {
				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
			}
		}

		// Fire handlers on the event path
		i = 0;
		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {

			event.type = i > 1 ?
				bubbleType :
				special.bindType || type;

			// jQuery handler
			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] &&
				jQuery._data( cur, "handle" );

			if ( handle ) {
				handle.apply( cur, data );
			}

			// Native handler
			handle = ontype && cur[ ontype ];
			if ( handle && handle.apply && acceptData( cur ) ) {
				event.result = handle.apply( cur, data );
				if ( event.result === 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( eventPath.pop(), data ) === false
				) && 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)
				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {

					// Don't re-trigger an onFOO event when we call its FOO() method
					tmp = elem[ ontype ];

					if ( tmp ) {
						elem[ ontype ] = null;
					}

					// Prevent re-triggering of the same event, since we already bubbled it above
					jQuery.event.triggered = type;
					try {
						elem[ type ]();
					} catch ( e ) {

						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
					}
					jQuery.event.triggered = undefined;

					if ( tmp ) {
						elem[ ontype ] = tmp;
					}
				}
			}
		}

		return event.result;
	},

	dispatch: function( event ) {

		// Make a writable jQuery.Event from the native event object
		event = jQuery.event.fix( event );

		var i, j, ret, matched, handleObj,
			handlerQueue = [],
			args = slice.call( arguments ),
			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
			special = jQuery.event.special[ event.type ] || {};

		// 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
		handlerQueue = jQuery.event.handlers.call( this, event, handlers );

		// Run delegates first; they may want to stop propagation beneath us
		i = 0;
		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
			event.currentTarget = matched.elem;

			j = 0;
			while ( ( handleObj = matched.handlers[ j++ ] ) &&
				!event.isImmediatePropagationStopped() ) {

				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
				// a subset or equal to those in the bound event (both can have no namespace).
				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {

					event.handleObj = handleObj;
					event.data = handleObj.data;

					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
						handleObj.handler ).apply( matched.elem, args );

					if ( ret !== undefined ) {
						if ( ( event.result = 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;
	},

	handlers: function( event, handlers ) {
		var i, matches, sel, handleObj,
			handlerQueue = [],
			delegateCount = handlers.delegateCount,
			cur = event.target;

		// Support (at least): Chrome, IE9
		// Find delegate handlers
		// Black-hole SVG <use> instance trees (#13180)
		//
		// Support: Firefox<=42+
		// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
		if ( delegateCount && cur.nodeType &&
			( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {

			/* jshint eqeqeq: false */
			for ( ; cur != this; cur = cur.parentNode || this ) {
				/* jshint eqeqeq: true */

				// Don't check non-elements (#13208)
				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
				if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
					matches = [];
					for ( i = 0; i < delegateCount; i++ ) {
						handleObj = handlers[ i ];

						// Don't conflict with Object.prototype properties (#13203)
						sel = handleObj.selector + " ";

						if ( matches[ sel ] === undefined ) {
							matches[ sel ] = handleObj.needsContext ?
								jQuery( sel, this ).index( cur ) > -1 :
								jQuery.find( sel, this, null, [ cur ] ).length;
						}
						if ( matches[ sel ] ) {
							matches.push( handleObj );
						}
					}
					if ( matches.length ) {
						handlerQueue.push( { elem: cur, handlers: matches } );
					}
				}
			}
		}

		// Add the remaining (directly-bound) handlers
		if ( delegateCount < handlers.length ) {
			handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
		}

		return handlerQueue;
	},

	fix: function( event ) {
		if ( event[ jQuery.expando ] ) {
			return event;
		}

		// Create a writable copy of the event object and normalize some properties
		var i, prop, copy,
			type = event.type,
			originalEvent = event,
			fixHook = this.fixHooks[ type ];

		if ( !fixHook ) {
			this.fixHooks[ type ] = fixHook =
				rmouseEvent.test( type ) ? this.mouseHooks :
				rkeyEvent.test( type ) ? this.keyHooks :
				{};
		}
		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;

		event = new jQuery.Event( originalEvent );

		i = copy.length;
		while ( i-- ) {
			prop = copy[ i ];
			event[ prop ] = originalEvent[ prop ];
		}

		// Support: IE<9
		// Fix target property (#1925)
		if ( !event.target ) {
			event.target = originalEvent.srcElement || document;
		}

		// Support: Safari 6-8+
		// Target should not be a text node (#504, #13143)
		if ( event.target.nodeType === 3 ) {
			event.target = event.target.parentNode;
		}

		// Support: IE<9
		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
		event.metaKey = !!event.metaKey;

		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
	},

	// Includes some event props shared by KeyEvent and MouseEvent
	props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
		"metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),

	fixHooks: {},

	keyHooks: {
		props: "char charCode key keyCode".split( " " ),
		filter: function( 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( event, original ) {
			var body, eventDoc, doc,
				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;
		}
	},

	special: {
		load: {

			// Prevent triggered image.load events from bubbling to window.load
			noBubble: true
		},
		focus: {

			// Fire native event if possible so blur/focus sequence is correct
			trigger: function() {
				if ( this !== safeActiveElement() && this.focus ) {
					try {
						this.focus();
						return false;
					} catch ( e ) {

						// Support: IE<9
						// If we error on focus to hidden element (#1486, #12518),
						// let .trigger() run the handlers
					}
				}
			},
			delegateType: "focusin"
		},
		blur: {
			trigger: function() {
				if ( this === safeActiveElement() && this.blur ) {
					this.blur();
					return false;
				}
			},
			delegateType: "focusout"
		},
		click: {

			// For checkbox, fire native event so checked state will be right
			trigger: function() {
				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
					this.click();
					return false;
				}
			},

			// For cross-browser consistency, don't fire native .click() on links
			_default: function( event ) {
				return jQuery.nodeName( event.target, "a" );
			}
		},

		beforeunload: {
			postDispatch: function( event ) {

				// Support: Firefox 20+
				// Firefox doesn't alert if the returnValue field is not set.
				if ( event.result !== undefined && event.originalEvent ) {
					event.originalEvent.returnValue = event.result;
				}
			}
		}
	},

	// Piggyback on a donor event to simulate a different one
	simulate: function( type, elem, event ) {
		var e = jQuery.extend(
			new jQuery.Event(),
			event,
			{
				type: type,
				isSimulated: true

				// Previously, `originalEvent: {}` was set here, so stopPropagation call
				// would not be triggered on donor event, since in our own
				// jQuery.event.stopPropagation function we had a check for existence of
				// originalEvent.stopPropagation method, so, consequently it would be a noop.
				//
				// Guard for simulated events was moved to jQuery.event.stopPropagation function
				// since `originalEvent` should point to the original event for the
				// constancy with other events and for more focused logic
			}
		);

		jQuery.event.trigger( e, null, elem );

		if ( e.isDefaultPrevented() ) {
			event.preventDefault();
		}
	}
};

jQuery.removeEvent = document.removeEventListener ?
	function( elem, type, handle ) {

		// This "if" is needed for plain objects
		if ( elem.removeEventListener ) {
			elem.removeEventListener( type, handle );
		}
	} :
	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.defaultPrevented === undefined &&

				// Support: IE < 9, Android < 4.0
				src.returnValue === false ?
			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;
};

// 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 = {
	constructor: jQuery.Event,
	isDefaultPrevented: returnFalse,
	isPropagationStopped: returnFalse,
	isImmediatePropagationStopped: returnFalse,

	preventDefault: function() {
		var e = this.originalEvent;

		this.isDefaultPrevented = returnTrue;
		if ( !e ) {
			return;
		}

		// If preventDefault exists, run it on the original event
		if ( e.preventDefault ) {
			e.preventDefault();

		// Support: IE
		// Otherwise set the returnValue property of the original event to false
		} else {
			e.returnValue = false;
		}
	},
	stopPropagation: function() {
		var e = this.originalEvent;

		this.isPropagationStopped = returnTrue;

		if ( !e || this.isSimulated ) {
			return;
		}

		// If stopPropagation exists, run it on the original event
		if ( e.stopPropagation ) {
			e.stopPropagation();
		}

		// Support: IE
		// Set the cancelBubble property of the original event to true
		e.cancelBubble = true;
	},
	stopImmediatePropagation: function() {
		var e = this.originalEvent;

		this.isImmediatePropagationStopped = returnTrue;

		if ( e && e.stopImmediatePropagation ) {
			e.stopImmediatePropagation();
		}

		this.stopPropagation();
	}
};

// Create mouseenter/leave events using mouseover/out and event-time checks
// so that event delegation works in jQuery.
// Do the same for pointerenter/pointerleave and pointerover/pointerout
//
// Support: Safari 7 only
// Safari sends mouseenter too often; see:
// https://code.google.com/p/chromium/issues/detail?id=470258
// for the description of the bug (it existed in older Chrome versions as well).
jQuery.each( {
	mouseenter: "mouseover",
	mouseleave: "mouseout",
	pointerenter: "pointerover",
	pointerleave: "pointerout"
}, function( orig, fix ) {
	jQuery.event.special[ orig ] = {
		delegateType: fix,
		bindType: fix,

		handle: function( event ) {
			var ret,
				target = this,
				related = event.relatedTarget,
				handleObj = event.handleObj;

			// For mouseenter/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 ( !support.submit ) {

	jQuery.event.special.submit = {
		setup: function() {

			// 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" ) ?

						// Support: IE <=8
						// We use jQuery.prop instead of elem.form
						// to allow fixing the IE8 delegated submit issue (gh-2332)
						// by 3rd party polyfills/workarounds.
						jQuery.prop( elem, "form" ) :
						undefined;

				if ( form && !jQuery._data( form, "submit" ) ) {
					jQuery.event.add( form, "submit._submit", function( event ) {
						event._submitBubble = true;
					} );
					jQuery._data( form, "submit", true );
				}
			} );

			// return undefined since we don't need an event listener
		},

		postDispatch: function( event ) {

			// If form was submitted by the user, bubble the event up the tree
			if ( event._submitBubble ) {
				delete event._submitBubble;
				if ( this.parentNode && !event.isTrigger ) {
					jQuery.event.simulate( "submit", this.parentNode, event );
				}
			}
		},

		teardown: function() {

			// 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 ( !support.change ) {

	jQuery.event.special.change = {

		setup: function() {

			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._justChanged = true;
						}
					} );
					jQuery.event.add( this, "click._change", function( event ) {
						if ( this._justChanged && !event.isTrigger ) {
							this._justChanged = false;
						}

						// Allow triggered, simulated change events (#11500)
						jQuery.event.simulate( "change", this, event );
					} );
				}
				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" ) ) {
					jQuery.event.add( elem, "change._change", function( event ) {
						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
							jQuery.event.simulate( "change", this.parentNode, event );
						}
					} );
					jQuery._data( elem, "change", true );
				}
			} );
		},

		handle: function( 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() {
			jQuery.event.remove( this, "._change" );

			return !rformElems.test( this.nodeName );
		}
	};
}

// Support: Firefox
// Firefox doesn't have focus(in | out) events
// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
//
// Support: Chrome, Safari
// focus(in | out) events fire after focus & blur events,
// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
if ( !support.focusin ) {
	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {

		// Attach a single capturing handler on the document while someone wants focusin/focusout
		var handler = function( event ) {
			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
		};

		jQuery.event.special[ fix ] = {
			setup: function() {
				var doc = this.ownerDocument || this,
					attaches = jQuery._data( doc, fix );

				if ( !attaches ) {
					doc.addEventListener( orig, handler, true );
				}
				jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
			},
			teardown: function() {
				var doc = this.ownerDocument || this,
					attaches = jQuery._data( doc, fix ) - 1;

				if ( !attaches ) {
					doc.removeEventListener( orig, handler, true );
					jQuery._removeData( doc, fix );
				} else {
					jQuery._data( doc, fix, attaches );
				}
			}
		};
	} );
}

jQuery.fn.extend( {

	on: function( types, selector, data, fn ) {
		return on( this, types, selector, data, fn );
	},
	one: function( types, selector, data, fn ) {
		return on( this, types, selector, data, fn, 1 );
	},
	off: function( 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 );
		} );
	},

	trigger: function( type, data ) {
		return this.each( function() {
			jQuery.event.trigger( type, data, this );
		} );
	},
	triggerHandler: function( type, data ) {
		var elem = this[ 0 ];
		if ( elem ) {
			return jQuery.event.trigger( type, data, elem, true );
		}
	}
} );


var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
	rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ),
	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,

	// Support: IE 10-11, Edge 10240+
	// In IE/Edge using regex groups here causes severe slowdowns.
	// See https://connect.microsoft.com/IE/feedback/details/1736512/
	rnoInnerhtml = /<script|<style|<link/i,

	// checked="checked" or checked
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
	rscriptTypeMasked = /^true\/(.*)/,
	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
	safeFragment = createSafeFragment( document ),
	fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) );

// Support: IE<8
// Manipulating tables requires a tbody
function manipulationTarget( elem, content ) {
	return jQuery.nodeName( elem, "table" ) &&
		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?

		elem.getElementsByTagName( "tbody" )[ 0 ] ||
			elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
		elem;
}

// Replace/restore the type attribute of script elements for safe DOM manipulation
function disableScript( elem ) {
	elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type;
	return elem;
}
function restoreScript( elem ) {
	var match = rscriptTypeMasked.exec( elem.type );
	if ( match ) {
		elem.type = match[ 1 ];
	} else {
		elem.removeAttribute( "type" );
	}
	return elem;
}

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 fixCloneNodeIssues( src, dest ) {
	var nodeName, e, data;

	// We do not need to do anything for non-Elements
	if ( dest.nodeType !== 1 ) {
		return;
	}

	nodeName = dest.nodeName.toLowerCase();

	// IE6-8 copies events bound via attachEvent when using cloneNode.
	if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
		data = jQuery._data( dest );

		for ( e in data.events ) {
			jQuery.removeEvent( dest, e, data.handle );
		}

		// Event data gets referenced instead of copied if the expando gets copied too
		dest.removeAttribute( jQuery.expando );
	}

	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
	if ( nodeName === "script" && dest.text !== src.text ) {
		disableScript( dest ).text = src.text;
		restoreScript( dest );

	// IE6-10 improperly clones children of object elements using classid.
	// IE10 throws NoModificationAllowedError if parent is null, #12132.
	} else if ( nodeName === "object" ) {
		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 ( 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.defaultSelected = 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;
	}
}

function domManip( collection, args, callback, ignored ) {

	// Flatten any nested arrays
	args = concat.apply( [], args );

	var first, node, hasScripts,
		scripts, doc, fragment,
		i = 0,
		l = collection.length,
		iNoClone = l - 1,
		value = args[ 0 ],
		isFunction = jQuery.isFunction( value );

	// We can't cloneNode fragments that contain checked, in WebKit
	if ( isFunction ||
			( l > 1 && typeof value === "string" &&
				!support.checkClone && rchecked.test( value ) ) ) {
		return collection.each( function( index ) {
			var self = collection.eq( index );
			if ( isFunction ) {
				args[ 0 ] = value.call( this, index, self.html() );
			}
			domManip( self, args, callback, ignored );
		} );
	}

	if ( l ) {
		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
		first = fragment.firstChild;

		if ( fragment.childNodes.length === 1 ) {
			fragment = first;
		}

		// Require either new content or an interest in ignored elements to invoke the callback
		if ( first || ignored ) {
			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
			hasScripts = scripts.length;

			// Use the original fragment for the last item
			// instead of the first because it can end up
			// being emptied incorrectly in certain situations (#8070).
			for ( ; i < l; i++ ) {
				node = fragment;

				if ( i !== iNoClone ) {
					node = jQuery.clone( node, true, true );

					// Keep references to cloned scripts for later restoration
					if ( hasScripts ) {

						// Support: Android<4.1, PhantomJS<2
						// push.apply(_, arraylike) throws on ancient WebKit
						jQuery.merge( scripts, getAll( node, "script" ) );
					}
				}

				callback.call( collection[ i ], node, i );
			}

			if ( hasScripts ) {
				doc = scripts[ scripts.length - 1 ].ownerDocument;

				// Reenable scripts
				jQuery.map( scripts, restoreScript );

				// Evaluate executable scripts on first document insertion
				for ( i = 0; i < hasScripts; i++ ) {
					node = scripts[ i ];
					if ( rscriptType.test( node.type || "" ) &&
						!jQuery._data( node, "globalEval" ) &&
						jQuery.contains( doc, node ) ) {

						if ( node.src ) {

							// Optional AJAX dependency, but won't run scripts if not present
							if ( jQuery._evalUrl ) {
								jQuery._evalUrl( node.src );
							}
						} else {
							jQuery.globalEval(
								( node.text || node.textContent || node.innerHTML || "" )
									.replace( rcleanScript, "" )
							);
						}
					}
				}
			}

			// Fix #11809: Avoid leaking memory
			fragment = first = null;
		}
	}

	return collection;
}

function remove( elem, selector, keepData ) {
	var node,
		elems = selector ? jQuery.filter( selector, elem ) : elem,
		i = 0;

	for ( ; ( node = elems[ i ] ) != null; i++ ) {

		if ( !keepData && node.nodeType === 1 ) {
			jQuery.cleanData( getAll( node ) );
		}

		if ( node.parentNode ) {
			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
				setGlobalEval( getAll( node, "script" ) );
			}
			node.parentNode.removeChild( node );
		}
	}

	return elem;
}

jQuery.extend( {
	htmlPrefilter: function( html ) {
		return html.replace( rxhtmlTag, "<$1></$2>" );
	},

	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
		var destElements, node, clone, i, srcElements,
			inPage = jQuery.contains( elem.ownerDocument, elem );

		if ( 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 ( ( !support.noCloneEvent || !support.noCloneChecked ) &&
				( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {

			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
			destElements = getAll( clone );
			srcElements = getAll( elem );

			// Fix all IE cloning issues
			for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) {

				// Ensure that the destination node is not null; Fixes #9587
				if ( destElements[ i ] ) {
					fixCloneNodeIssues( node, destElements[ i ] );
				}
			}
		}

		// Copy the events from the original to the clone
		if ( dataAndEvents ) {
			if ( deepDataAndEvents ) {
				srcElements = srcElements || getAll( elem );
				destElements = destElements || getAll( clone );

				for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) {
					cloneCopyEvent( node, destElements[ i ] );
				}
			} else {
				cloneCopyEvent( elem, clone );
			}
		}

		// Preserve script evaluation history
		destElements = getAll( clone, "script" );
		if ( destElements.length > 0 ) {
			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
		}

		destElements = srcElements = node = null;

		// Return the cloned set
		return clone;
	},

	cleanData: function( elems, /* internal */ forceAcceptData ) {
		var elem, type, id, data,
			i = 0,
			internalKey = jQuery.expando,
			cache = jQuery.cache,
			attributes = support.attributes,
			special = jQuery.event.special;

		for ( ; ( elem = elems[ i ] ) != null; i++ ) {
			if ( forceAcceptData || 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 ];

						// Support: IE<9
						// IE does not allow us to delete expando properties from nodes
						// IE creates expando attributes along with the property
						// IE does not have a removeAttribute function on Document nodes
						if ( !attributes && typeof elem.removeAttribute !== "undefined" ) {
							elem.removeAttribute( internalKey );

						// Webkit & Blink performance suffers when deleting properties
						// from DOM nodes, so set to undefined instead
						// https://code.google.com/p/chromium/issues/detail?id=378607
						} else {
							elem[ internalKey ] = undefined;
						}

						deletedIds.push( id );
					}
				}
			}
		}
	}
} );

jQuery.fn.extend( {

	// Keep domManip exposed until 3.0 (gh-2225)
	domManip: domManip,

	detach: function( selector ) {
		return remove( this, selector, true );
	},

	remove: function( selector ) {
		return remove( this, selector );
	},

	text: function( value ) {
		return 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 );
	},

	append: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
				var target = manipulationTarget( this, elem );
				target.appendChild( elem );
			}
		} );
	},

	prepend: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
				var target = manipulationTarget( this, elem );
				target.insertBefore( elem, target.firstChild );
			}
		} );
	},

	before: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.parentNode ) {
				this.parentNode.insertBefore( elem, this );
			}
		} );
	},

	after: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.parentNode ) {
				this.parentNode.insertBefore( elem, this.nextSibling );
			}
		} );
	},

	empty: function() {
		var elem,
			i = 0;

		for ( ; ( elem = this[ i ] ) != null; i++ ) {

			// Remove element nodes and prevent memory leaks
			if ( elem.nodeType === 1 ) {
				jQuery.cleanData( getAll( elem, false ) );
			}

			// Remove any remaining nodes
			while ( elem.firstChild ) {
				elem.removeChild( elem.firstChild );
			}

			// If this is a select, ensure that it displays empty (#12336)
			// Support: IE<9
			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
				elem.options.length = 0;
			}
		}

		return this;
	},

	clone: function( dataAndEvents, deepDataAndEvents ) {
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;

		return this.map( function() {
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
		} );
	},

	html: function( value ) {
		return 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 ) &&
				( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
				( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {

				value = jQuery.htmlPrefilter( value );

				try {
					for ( ; i < l; i++ ) {

						// Remove element nodes and prevent memory leaks
						elem = this[ i ] || {};
						if ( elem.nodeType === 1 ) {
							jQuery.cleanData( getAll( elem, false ) );
							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() {
		var ignored = [];

		// Make the changes, replacing each non-ignored context element with the new content
		return domManip( this, arguments, function( elem ) {
			var parent = this.parentNode;

			if ( jQuery.inArray( this, ignored ) < 0 ) {
				jQuery.cleanData( getAll( this ) );
				if ( parent ) {
					parent.replaceChild( elem, this );
				}
			}

		// Force callback invocation
		}, ignored );
	}
} );

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 ),
			last = insert.length - 1;

		for ( ; i <= last; i++ ) {
			elems = i === last ? this : this.clone( true );
			jQuery( insert[ i ] )[ original ]( elems );

			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
			push.apply( ret, elems.get() );
		}

		return this.pushStack( ret );
	};
} );


var iframe,
	elemdisplay = {

		// Support: Firefox
		// We have to pre-define these values for FF (#10227)
		HTML: "block",
		BODY: "block"
	};

/**
 * Retrieve the actual display of a element
 * @param {String} name nodeName of the element
 * @param {Object} doc Document object
 */

// Called only from within defaultDisplay
function actualDisplay( name, doc ) {
	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),

		display = jQuery.css( elem[ 0 ], "display" );

	// We don't have any data stored on the element,
	// so use "detach" method as fast way to get rid of the element
	elem.detach();

	return display;
}

/**
 * Try to determine the default display value of an element
 * @param {String} nodeName
 */
function defaultDisplay( nodeName ) {
	var doc = document,
		display = elemdisplay[ nodeName ];

	if ( !display ) {
		display = actualDisplay( nodeName, doc );

		// If the simple way fails, read from inside an iframe
		if ( display === "none" || !display ) {

			// Use the already-created iframe if possible
			iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
				.appendTo( doc.documentElement );

			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
			doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;

			// Support: IE
			doc.write();
			doc.close();

			display = actualDisplay( nodeName, doc );
			iframe.detach();
		}

		// Store the correct default display
		elemdisplay[ nodeName ] = display;
	}

	return display;
}
var rmargin = ( /^margin/ );

var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );

var swap = function( elem, options, callback, args ) {
	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.apply( elem, args || [] );

	// Revert the old values
	for ( name in options ) {
		elem.style[ name ] = old[ name ];
	}

	return ret;
};


var documentElement = document.documentElement;



( function() {
	var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal,
		reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal,
		container = document.createElement( "div" ),
		div = document.createElement( "div" );

	// Finish early in limited (non-browser) environments
	if ( !div.style ) {
		return;
	}

	div.style.cssText = "float:left;opacity:.5";

	// Support: IE<9
	// Make sure that element opacity exists (as opposed to filter)
	support.opacity = div.style.opacity === "0.5";

	// Verify style float existence
	// (IE uses styleFloat instead of cssFloat)
	support.cssFloat = !!div.style.cssFloat;

	div.style.backgroundClip = "content-box";
	div.cloneNode( true ).style.backgroundClip = "";
	support.clearCloneStyle = div.style.backgroundClip === "content-box";

	container = document.createElement( "div" );
	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
		"padding:0;margin-top:1px;position:absolute";
	div.innerHTML = "";
	container.appendChild( div );

	// Support: Firefox<29, Android 2.3
	// Vendor-prefix box-sizing
	support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" ||
		div.style.WebkitBoxSizing === "";

	jQuery.extend( support, {
		reliableHiddenOffsets: function() {
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return reliableHiddenOffsetsVal;
		},

		boxSizingReliable: function() {

			// We're checking for pixelPositionVal here instead of boxSizingReliableVal
			// since that compresses better and they're computed together anyway.
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return boxSizingReliableVal;
		},

		pixelMarginRight: function() {

			// Support: Android 4.0-4.3
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return pixelMarginRightVal;
		},

		pixelPosition: function() {
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return pixelPositionVal;
		},

		reliableMarginRight: function() {

			// Support: Android 2.3
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return reliableMarginRightVal;
		},

		reliableMarginLeft: function() {

			// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return reliableMarginLeftVal;
		}
	} );

	function computeStyleTests() {
		var contents, divStyle,
			documentElement = document.documentElement;

		// Setup
		documentElement.appendChild( container );

		div.style.cssText =

			// Support: Android 2.3
			// Vendor-prefix box-sizing
			"-webkit-box-sizing:border-box;box-sizing:border-box;" +
			"position:relative;display:block;" +
			"margin:auto;border:1px;padding:1px;" +
			"top:1%;width:50%";

		// Support: IE<9
		// Assume reasonable values in the absence of getComputedStyle
		pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;
		pixelMarginRightVal = reliableMarginRightVal = true;

		// Check for getComputedStyle so that this code is not run in IE<9.
		if ( window.getComputedStyle ) {
			divStyle = window.getComputedStyle( div );
			pixelPositionVal = ( divStyle || {} ).top !== "1%";
			reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px";
			boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px";

			// Support: Android 4.0 - 4.3 only
			// Some styles come back with percentage values, even though they shouldn't
			div.style.marginRight = "50%";
			pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px";

			// Support: Android 2.3 only
			// Div with explicit width and no margin-right incorrectly
			// gets computed margin-right based on width of container (#3333)
			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
			contents = div.appendChild( document.createElement( "div" ) );

			// Reset CSS: box-sizing; display; margin; border; padding
			contents.style.cssText = div.style.cssText =

				// Support: Android 2.3
				// Vendor-prefix box-sizing
				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
				"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
			contents.style.marginRight = contents.style.width = "0";
			div.style.width = "1px";

			reliableMarginRightVal =
				!parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight );

			div.removeChild( contents );
		}

		// Support: IE6-8
		// First check that getClientRects works as expected
		// 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).
		div.style.display = "none";
		reliableHiddenOffsetsVal = div.getClientRects().length === 0;
		if ( reliableHiddenOffsetsVal ) {
			div.style.display = "";
			div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
			div.childNodes[ 0 ].style.borderCollapse = "separate";
			contents = div.getElementsByTagName( "td" );
			contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
			reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
			if ( reliableHiddenOffsetsVal ) {
				contents[ 0 ].style.display = "";
				contents[ 1 ].style.display = "none";
				reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
			}
		}

		// Teardown
		documentElement.removeChild( container );
	}

} )();


var getStyles, curCSS,
	rposition = /^(top|right|bottom|left)$/;

if ( window.getComputedStyle ) {
	getStyles = function( elem ) {

		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
		// IE throws on elements created in popups
		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
		var view = elem.ownerDocument.defaultView;

		if ( !view || !view.opener ) {
			view = window;
		}

		return view.getComputedStyle( elem );
	};

	curCSS = function( elem, name, computed ) {
		var width, minWidth, maxWidth, ret,
			style = elem.style;

		computed = computed || getStyles( elem );

		// getPropertyValue is only needed for .css('filter') in IE9, see #12537
		ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;

		// Support: Opera 12.1x only
		// Fall back to style even without computed
		// computed is undefined for elems on document fragments
		if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
			ret = jQuery.style( elem, name );
		}

		if ( computed ) {

			// 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 ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {

				// Remember the original values
				width = style.width;
				minWidth = style.minWidth;
				maxWidth = style.maxWidth;

				// Put in the new values to get a computed value out
				style.minWidth = style.maxWidth = style.width = ret;
				ret = computed.width;

				// Revert the changed values
				style.width = width;
				style.minWidth = minWidth;
				style.maxWidth = maxWidth;
			}
		}

		// Support: IE
		// IE returns zIndex value as an integer.
		return ret === undefined ?
			ret :
			ret + "";
	};
} else if ( documentElement.currentStyle ) {
	getStyles = function( elem ) {
		return elem.currentStyle;
	};

	curCSS = function( elem, name, computed ) {
		var left, rs, rsLeft, ret,
			style = elem.style;

		computed = computed || getStyles( elem );
		ret = computed ? computed[ name ] : undefined;

		// 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;
			rs = elem.runtimeStyle;
			rsLeft = rs && rs.left;

			// Put in the new values to get a computed value out
			if ( rsLeft ) {
				rs.left = elem.currentStyle.left;
			}
			style.left = name === "fontSize" ? "1em" : ret;
			ret = style.pixelLeft + "px";

			// Revert the changed values
			style.left = left;
			if ( rsLeft ) {
				rs.left = rsLeft;
			}
		}

		// Support: IE
		// IE returns zIndex value as an integer.
		return ret === undefined ?
			ret :
			ret + "" || "auto";
	};
}




function addGetHookIf( conditionFn, hookFn ) {

	// Define the hook, we'll check on the first run if it's really needed.
	return {
		get: function() {
			if ( conditionFn() ) {

				// Hook not needed (or it's not possible to use it due
				// to missing dependency), remove it.
				delete this.get;
				return;
			}

			// Hook needed; redefine it so that the support test is not executed again.
			return ( this.get = hookFn ).apply( this, arguments );
		}
	};
}


var

		ralpha = /alpha\([^)]*\)/i,
	ropacity = /opacity\s*=\s*([^)]*)/i,

	// 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]).+)/,
	rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),

	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
	cssNormalTransform = {
		letterSpacing: "0",
		fontWeight: "400"
	},

	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
	emptyStyle = document.createElement( "div" ).style;


// return a css property mapped to a potentially vendor prefixed property
function vendorPropName( name ) {

	// shortcut for names that are not vendor prefixed
	if ( name in emptyStyle ) {
		return name;
	}

	// check for vendor prefixed names
	var capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ),
		i = cssPrefixes.length;

	while ( i-- ) {
		name = cssPrefixes[ i ] + capName;
		if ( name in emptyStyle ) {
			return name;
		}
	}
}

function showHide( elements, show ) {
	var display, elem, hidden,
		values = [],
		index = 0,
		length = elements.length;

	for ( ; index < length; index++ ) {
		elem = elements[ index ];
		if ( !elem.style ) {
			continue;
		}

		values[ index ] = jQuery._data( elem, "olddisplay" );
		display = elem.style.display;
		if ( show ) {

			// Reset the inline display of this element to learn if it is
			// being hidden by cascaded rules or not
			if ( !values[ index ] && 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", defaultDisplay( elem.nodeName ) );
			}
		} else {
			hidden = isHidden( elem );

			if ( display && display !== "none" || !hidden ) {
				jQuery._data(
					elem,
					"olddisplay",
					hidden ? display : jQuery.css( elem, "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;
}

function setPositiveNumber( elem, value, subtract ) {
	var matches = rnumsplit.exec( value );
	return matches ?

		// Guard against undefined "subtract", e.g., when used as in cssHooks
		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
		value;
}

function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
	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" ) {
			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
		}

		if ( isBorderBox ) {

			// border-box includes padding, so remove it if we want content
			if ( extra === "content" ) {
				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
			}

			// at this point, extra isn't border nor margin, so remove border
			if ( extra !== "margin" ) {
				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
			}
		} else {

			// at this point, extra isn't content, so add padding
			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );

			// at this point, extra isn't content nor padding, so add border
			if ( extra !== "padding" ) {
				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
			}
		}
	}

	return val;
}

function getWidthOrHeight( elem, name, extra ) {

	// Start with offset property, which is equivalent to the border-box value
	var valueIsBorderBox = true,
		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
		styles = getStyles( elem ),
		isBorderBox = support.boxSizing &&
			jQuery.css( elem, "boxSizing", false, styles ) === "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, styles );
		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 &&
			( 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,
			styles
		)
	) + "px";
}

jQuery.extend( {

	// Add in style property hooks for overriding the default
	// behavior of getting and setting a style property
	cssHooks: {
		opacity: {
			get: function( elem, computed ) {
				if ( computed ) {

					// We should always get a number back from opacity
					var ret = curCSS( elem, "opacity" );
					return ret === "" ? "1" : ret;
				}
			}
		}
	},

	// Don't automatically add "px" to these possibly-unitless properties
	cssNumber: {
		"animationIterationCount": true,
		"columnCount": true,
		"fillOpacity": true,
		"flexGrow": true,
		"flexShrink": true,
		"fontWeight": true,
		"lineHeight": true,
		"opacity": true,
		"order": 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": support.cssFloat ? "cssFloat" : "styleFloat"
	},

	// Get and set the style property on a DOM Node
	style: function( 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( origName ) || 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 "+=" or "-=" to relative numbers (#7345)
			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
				value = adjustCSS( elem, name, ret );

				// Fixes bug #9237
				type = "number";
			}

			// Make sure that null and NaN values aren't set. See: #7116
			if ( value == null || value !== value ) {
				return;
			}

			// If a number was passed in, add the unit (except for certain CSS properties)
			if ( type === "number" ) {
				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
			}

			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
			// but it would mean to define eight
			// (for every problematic property) identical functions
			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
				style[ name ] = "inherit";
			}

			// 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 ) {

				// Support: IE
				// Swallow errors from 'invalid' CSS values (#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( elem, name, extra, styles ) {
		var num, val, hooks,
			origName = jQuery.camelCase( name );

		// Make sure that we're working with the right name
		name = jQuery.cssProps[ origName ] ||
			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || 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, styles );
		}

		//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 ( extra === "" || extra ) {
			num = parseFloat( val );
			return extra === true || isFinite( num ) ? num || 0 : val;
		}
		return val;
	}
} );

jQuery.each( [ "height", "width" ], function( i, name ) {
	jQuery.cssHooks[ name ] = {
		get: function( 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
				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
					elem.offsetWidth === 0 ?
						swap( elem, cssShow, function() {
							return getWidthOrHeight( elem, name, extra );
						} ) :
						getWidthOrHeight( elem, name, extra );
			}
		},

		set: function( elem, value, extra ) {
			var styles = extra && getStyles( elem );
			return setPositiveNumber( elem, value, extra ?
				augmentWidthOrHeight(
					elem,
					name,
					extra,
					support.boxSizing &&
						jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
					styles
				) : 0
			);
		}
	};
} );

if ( !support.opacity ) {
	jQuery.cssHooks.opacity = {
		get: function( 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( 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 === "", then remove inline opacity #12685
			if ( ( value >= 1 || value === "" ) &&
					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 is no filter style applied in a css rule
				// or unset inline opacity, we are done
				if ( value === "" || currentStyle && !currentStyle.filter ) {
					return;
				}
			}

			// otherwise, set new filter values
			style.filter = ralpha.test( filter ) ?
				filter.replace( ralpha, opacity ) :
				filter + " " + opacity;
		}
	};
}

jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
	function( elem, computed ) {
		if ( computed ) {
			return swap( elem, { "display": "inline-block" },
				curCSS, [ elem, "marginRight" ] );
		}
	}
);

jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
	function( elem, computed ) {
		if ( computed ) {
			return (
				parseFloat( curCSS( elem, "marginLeft" ) ) ||

				// Support: IE<=11+
				// Running getBoundingClientRect on a disconnected node in IE throws an error
				// Support: IE8 only
				// getClientRects() errors on disconnected elems
				( jQuery.contains( elem.ownerDocument, elem ) ?
					elem.getBoundingClientRect().left -
						swap( elem, { marginLeft: 0 }, function() {
							return elem.getBoundingClientRect().left;
						} ) :
					0
				)
			) + "px";
		}
	}
);

// These hooks are used by animate to expand properties
jQuery.each( {
	margin: "",
	padding: "",
	border: "Width"
}, function( prefix, suffix ) {
	jQuery.cssHooks[ prefix + suffix ] = {
		expand: function( value ) {
			var i = 0,
				expanded = {},

				// assumes a single number if not a string
				parts = typeof value === "string" ? value.split( " " ) : [ value ];

			for ( ; 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;
	}
} );

jQuery.fn.extend( {
	css: function( name, value ) {
		return access( this, function( elem, name, value ) {
			var styles, len,
				map = {},
				i = 0;

			if ( jQuery.isArray( name ) ) {
				styles = getStyles( elem );
				len = name.length;

				for ( ; i < len; i++ ) {
					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
				}

				return map;
			}

			return value !== undefined ?
				jQuery.style( elem, name, value ) :
				jQuery.css( elem, name );
		}, name, value, arguments.length > 1 );
	},
	show: function() {
		return showHide( this, true );
	},
	hide: function() {
		return showHide( this );
	},
	toggle: function( state ) {
		if ( typeof state === "boolean" ) {
			return state ? this.show() : this.hide();
		}

		return this.each( function() {
			if ( isHidden( this ) ) {
				jQuery( this ).show();
			} else {
				jQuery( this ).hide();
			}
		} );
	}
} );


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( elem, options, prop, end, easing, unit ) {
		this.elem = elem;
		this.prop = prop;
		this.easing = easing || jQuery.easing._default;
		this.options = options;
		this.start = this.now = this.cur();
		this.end = end;
		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
	},
	cur: function() {
		var hooks = Tween.propHooks[ this.prop ];

		return hooks && hooks.get ?
			hooks.get( this ) :
			Tween.propHooks._default.get( this );
	},
	run: function( 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( tween ) {
			var result;

			// Use a property on the element directly when it is not a DOM element,
			// or when there is no matching style property that exists.
			if ( tween.elem.nodeType !== 1 ||
				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
				return tween.elem[ tween.prop ];
			}

			// passing an empty string as a 3rd 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, "" );

			// Empty strings, null, undefined and "auto" are converted to 0.
			return !result || result === "auto" ? 0 : result;
		},
		set: function( 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.nodeType === 1 &&
				( 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;
			}
		}
	}
};

// Support: IE <=9
// Panic based approach to setting things on disconnected nodes

Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
	set: function( tween ) {
		if ( tween.elem.nodeType && tween.elem.parentNode ) {
			tween.elem[ tween.prop ] = tween.now;
		}
	}
};

jQuery.easing = {
	linear: function( p ) {
		return p;
	},
	swing: function( p ) {
		return 0.5 - Math.cos( p * Math.PI ) / 2;
	},
	_default: "swing"
};

jQuery.fx = Tween.prototype.init;

// Back Compat <1.8 extension point
jQuery.fx.step = {};




var
	fxNow, timerId,
	rfxtypes = /^(?:toggle|show|hide)$/,
	rrun = /queueHooks$/;

// Animations created synchronously will run synchronously
function createFxNow() {
	window.setTimeout( function() {
		fxNow = undefined;
	} );
	return ( fxNow = jQuery.now() );
}

// 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;
}

function createTween( value, prop, animation ) {
	var tween,
		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
		index = 0,
		length = collection.length;
	for ( ; index < length; index++ ) {
		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {

			// we're done with this property
			return tween;
		}
	}
}

function defaultPrefilter( elem, props, opts ) {
	/* jshint validthis: true */
	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
		anim = this,
		orig = {},
		style = elem.style,
		hidden = elem.nodeType && isHidden( elem ),
		dataShow = jQuery._data( elem, "fxshow" );

	// 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
		display = jQuery.css( elem, "display" );

		// Test default display if display is currently "none"
		checkDisplay = display === "none" ?
			jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;

		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {

			// inline-level elements accept inline-block;
			// block-level elements need to be inline with layout
			if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
				style.display = "inline-block";
			} else {
				style.zoom = 1;
			}
		}
	}

	if ( opts.overflow ) {
		style.overflow = "hidden";
		if ( !support.shrinkWrapBlocks() ) {
			anim.always( function() {
				style.overflow = opts.overflow[ 0 ];
				style.overflowX = opts.overflow[ 1 ];
				style.overflowY = opts.overflow[ 2 ];
			} );
		}
	}

	// show/hide pass
	for ( prop in props ) {
		value = props[ prop ];
		if ( rfxtypes.exec( value ) ) {
			delete props[ prop ];
			toggle = toggle || value === "toggle";
			if ( value === ( hidden ? "hide" : "show" ) ) {

				// If there is dataShow left over from a stopped hide or show
				// and we are going to proceed with show, we should pretend to be hidden
				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
					hidden = true;
				} else {
					continue;
				}
			}
			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );

		// Any non-fx value stops us from restoring the original display value
		} else {
			display = undefined;
		}
	}

	if ( !jQuery.isEmptyObject( orig ) ) {
		if ( dataShow ) {
			if ( "hidden" in dataShow ) {
				hidden = dataShow.hidden;
			}
		} else {
			dataShow = jQuery._data( elem, "fxshow", {} );
		}

		// store state if its toggle - enables .stop().toggle() to "reverse"
		if ( toggle ) {
			dataShow.hidden = !hidden;
		}
		if ( hidden ) {
			jQuery( elem ).show();
		} else {
			anim.done( function() {
				jQuery( elem ).hide();
			} );
		}
		anim.done( function() {
			var prop;
			jQuery._removeData( elem, "fxshow" );
			for ( prop in orig ) {
				jQuery.style( elem, prop, orig[ prop ] );
			}
		} );
		for ( prop in orig ) {
			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );

			if ( !( prop in dataShow ) ) {
				dataShow[ prop ] = tween.start;
				if ( hidden ) {
					tween.end = tween.start;
					tween.start = prop === "width" || prop === "height" ? 1 : 0;
				}
			}
		}

	// If this is a noop like .hide().hide(), restore an overwritten display value
	} else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) {
		style.display = display;
	}
}

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;
		}
	}
}

function Animation( elem, properties, options ) {
	var result,
		stopped,
		index = 0,
		length = Animation.prefilters.length,
		deferred = jQuery.Deferred().always( function() {

			// don't match elem in the :animated selector
			delete tick.elem;
		} ),
		tick = function() {
			if ( stopped ) {
				return false;
			}
			var currentTime = fxNow || createFxNow(),
				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),

				// Support: Android 2.3
				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
				temp = remaining / animation.duration || 0,
				percent = 1 - temp,
				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: {},
				easing: jQuery.easing._default
			}, options ),
			originalProperties: properties,
			originalOptions: options,
			startTime: fxNow || createFxNow(),
			duration: options.duration,
			tweens: [],
			createTween: function( prop, end ) {
				var tween = jQuery.Tween( elem, animation.opts, prop, end,
						animation.opts.specialEasing[ prop ] || animation.opts.easing );
				animation.tweens.push( tween );
				return tween;
			},
			stop: function( 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;
				if ( stopped ) {
					return this;
				}
				stopped = true;
				for ( ; index < length ; index++ ) {
					animation.tweens[ index ].run( 1 );
				}

				// resolve when we played the last frame
				// otherwise, reject
				if ( gotoEnd ) {
					deferred.notifyWith( elem, [ animation, 1, 0 ] );
					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 = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
		if ( result ) {
			if ( jQuery.isFunction( result.stop ) ) {
				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
					jQuery.proxy( result.stop, result );
			}
			return result;
		}
	}

	jQuery.map( props, createTween, animation );

	if ( jQuery.isFunction( animation.opts.start ) ) {
		animation.opts.start.call( elem, animation );
	}

	jQuery.fx.timer(
		jQuery.extend( tick, {
			elem: elem,
			anim: animation,
			queue: animation.opts.queue
		} )
	);

	// 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 );
}

jQuery.Animation = jQuery.extend( Animation, {

	tweeners: {
		"*": [ function( prop, value ) {
			var tween = this.createTween( prop, value );
			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
			return tween;
		} ]
	},

	tweener: function( props, callback ) {
		if ( jQuery.isFunction( props ) ) {
			callback = props;
			props = [ "*" ];
		} else {
			props = props.match( rnotwhite );
		}

		var prop,
			index = 0,
			length = props.length;

		for ( ; index < length ; index++ ) {
			prop = props[ index ];
			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
			Animation.tweeners[ prop ].unshift( callback );
		}
	},

	prefilters: [ defaultPrefilter ],

	prefilter: function( callback, prepend ) {
		if ( prepend ) {
			Animation.prefilters.unshift( callback );
		} else {
			Animation.prefilters.push( 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.fn.extend( {
	fadeTo: function( 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( prop, speed, easing, callback ) {
		var empty = jQuery.isEmptyObject( prop ),
			optall = jQuery.speed( speed, easing, callback ),
			doAnimation = function() {

				// Operate on a copy of prop so per-property easing won't be lost
				var anim = Animation( this, jQuery.extend( {}, prop ), optall );

				// Empty animations, or finishing resolves immediately
				if ( empty || jQuery._data( this, "finish" ) ) {
					anim.stop( true );
				}
			};
			doAnimation.finish = doAnimation;

		return empty || optall.queue === false ?
			this.each( doAnimation ) :
			this.queue( optall.queue, doAnimation );
	},
	stop: function( type, clearQueue, gotoEnd ) {
		var stopQueue = function( 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 );
			}
		} );
	},
	finish: function( type ) {
		if ( type !== false ) {
			type = type || "fx";
		}
		return this.each( function() {
			var index,
				data = jQuery._data( this ),
				queue = data[ type + "queue" ],
				hooks = data[ type + "queueHooks" ],
				timers = jQuery.timers,
				length = queue ? queue.length : 0;

			// enable finishing flag on private data
			data.finish = true;

			// empty the queue first
			jQuery.queue( this, type, [] );

			if ( hooks && hooks.stop ) {
				hooks.stop.call( this, true );
			}

			// look for any active animations, and finish them
			for ( index = timers.length; index--; ) {
				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
					timers[ index ].anim.stop( true );
					timers.splice( index, 1 );
				}
			}

			// look for any animations in the old queue and finish them
			for ( index = 0; index < length; index++ ) {
				if ( queue[ index ] && queue[ index ].finish ) {
					queue[ index ].finish.call( this );
				}
			}

			// turn off finishing flag
			delete data.finish;
		} );
	}
} );

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" ?
			cssFn.apply( this, arguments ) :
			this.animate( genFx( name, true ), speed, easing, callback );
	};
} );

// 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.timers = [];
jQuery.fx.tick = function() {
	var timer,
		timers = jQuery.timers,
		i = 0;

	fxNow = jQuery.now();

	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();
	}
	fxNow = undefined;
};

jQuery.fx.timer = function( timer ) {
	jQuery.timers.push( timer );
	if ( timer() ) {
		jQuery.fx.start();
	} else {
		jQuery.timers.pop();
	}
};

jQuery.fx.interval = 13;

jQuery.fx.start = function() {
	if ( !timerId ) {
		timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
	}
};

jQuery.fx.stop = function() {
	window.clearInterval( timerId );
	timerId = null;
};

jQuery.fx.speeds = {
	slow: 600,
	fast: 200,

	// Default speed
	_default: 400
};


// Based off of the plugin by Clint Helfers, with permission.
// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
jQuery.fn.delay = function( time, type ) {
	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
	type = type || "fx";

	return this.queue( type, function( next, hooks ) {
		var timeout = window.setTimeout( next, time );
		hooks.stop = function() {
			window.clearTimeout( timeout );
		};
	} );
};


( function() {
	var a,
		input = document.createElement( "input" ),
		div = document.createElement( "div" ),
		select = document.createElement( "select" ),
		opt = select.appendChild( document.createElement( "option" ) );

	// Setup
	div = document.createElement( "div" );
	div.setAttribute( "className", "t" );
	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
	a = div.getElementsByTagName( "a" )[ 0 ];

	// Support: Windows Web Apps (WWA)
	// `type` must use .setAttribute for WWA (#14901)
	input.setAttribute( "type", "checkbox" );
	div.appendChild( input );

	a = div.getElementsByTagName( "a" )[ 0 ];

	// First batch of tests.
	a.style.cssText = "top:1px";

	// Test setAttribute on camelCase class.
	// If it works, we need attrFixes when doing get/setAttribute (ie6/7)
	support.getSetAttribute = div.className !== "t";

	// Get the style information from getAttribute
	// (IE uses .cssText instead)
	support.style = /top/.test( a.getAttribute( "style" ) );

	// Make sure that URLs aren't manipulated
	// (IE normalizes it by default)
	support.hrefNormalized = a.getAttribute( "href" ) === "/a";

	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
	support.checkOn = !!input.value;

	// 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)
	support.optSelected = opt.selected;

	// Tests for enctype support on a form (#6743)
	support.enctype = !!document.createElement( "form" ).enctype;

	// 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;

	// Support: IE8 only
	// Check if we can trust getAttribute("value")
	input = document.createElement( "input" );
	input.setAttribute( "value", "" );
	support.input = input.getAttribute( "value" ) === "";

	// Check if an input maintains its value after becoming a radio
	input.value = "t";
	input.setAttribute( "type", "radio" );
	support.radioValue = input.value === "t";
} )();


var rreturn = /\r/g,
	rspaces = /[\x20\t\r\n\f]+/g;

jQuery.fn.extend( {
	val: function( 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;

			if ( this.nodeType !== 1 ) {
				return;
			}

			if ( isFunction ) {
				val = value.call( this, i, jQuery( this ).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( elem ) {
				var val = jQuery.find.attr( elem, "value" );
				return val != null ?
					val :

					// Support: IE10-11+
					// option.text throws exceptions (#14686, #14858)
					// Strip and collapse whitespace
					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
					jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
			}
		},
		select: {
			get: function( elem ) {
				var value, option,
					options = elem.options,
					index = elem.selectedIndex,
					one = elem.type === "select-one" || index < 0,
					values = one ? null : [],
					max = one ? index + 1 : options.length,
					i = index < 0 ?
						max :
						one ? index : 0;

				// Loop through all the selected options
				for ( ; i < max; i++ ) {
					option = options[ i ];

					// oldIE doesn't update selected after form reset (#2551)
					if ( ( option.selected || i === index ) &&

							// Don't return options that are disabled or in a disabled optgroup
							( 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 );
					}
				}

				return values;
			},

			set: function( elem, value ) {
				var optionSet, option,
					options = elem.options,
					values = jQuery.makeArray( value ),
					i = options.length;

				while ( i-- ) {
					option = options[ i ];

					if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) {

						// Support: IE6
						// When new option element is added to select box we need to
						// force reflow of newly added node in order to workaround delay
						// of initialization properties
						try {
							option.selected = optionSet = true;

						} catch ( _ ) {

							// Will be executed only in IE6
							option.scrollHeight;
						}

					} else {
						option.selected = false;
					}
				}

				// Force browsers to behave consistently when non-matching value is set
				if ( !optionSet ) {
					elem.selectedIndex = -1;
				}

				return options;
			}
		}
	}
} );

// Radios and checkboxes getter/setter
jQuery.each( [ "radio", "checkbox" ], function() {
	jQuery.valHooks[ this ] = {
		set: function( elem, value ) {
			if ( jQuery.isArray( value ) ) {
				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
			}
		}
	};
	if ( !support.checkOn ) {
		jQuery.valHooks[ this ].get = function( elem ) {
			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
		};
	}
} );




var nodeHook, boolHook,
	attrHandle = jQuery.expr.attrHandle,
	ruseDefault = /^(?:checked|selected)$/i,
	getSetAttribute = support.getSetAttribute,
	getSetInput = support.input;

jQuery.fn.extend( {
	attr: function( name, value ) {
		return access( this, jQuery.attr, name, value, arguments.length > 1 );
	},

	removeAttr: function( name ) {
		return this.each( function() {
			jQuery.removeAttr( this, name );
		} );
	}
} );

jQuery.extend( {
	attr: function( elem, name, value ) {
		var ret, hooks,
			nType = elem.nodeType;

		// Don't get/set attributes on text, comment and attribute nodes
		if ( nType === 3 || nType === 8 || nType === 2 ) {
			return;
		}

		// Fallback to prop when attributes are not supported
		if ( typeof elem.getAttribute === "undefined" ) {
			return jQuery.prop( elem, name, value );
		}

		// All attributes are lowercase
		// Grab necessary hook if one is defined
		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
			name = name.toLowerCase();
			hooks = jQuery.attrHooks[ name ] ||
				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
		}

		if ( value !== undefined ) {
			if ( value === null ) {
				jQuery.removeAttr( elem, name );
				return;
			}

			if ( hooks && "set" in hooks &&
				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
				return ret;
			}

			elem.setAttribute( name, value + "" );
			return value;
		}

		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
			return ret;
		}

		ret = jQuery.find.attr( elem, name );

		// Non-existent attributes return null, we normalize to undefined
		return ret == null ? undefined : ret;
	},

	attrHooks: {
		type: {
			set: function( elem, value ) {
				if ( !support.radioValue && value === "radio" &&
					jQuery.nodeName( elem, "input" ) ) {

					// Setting the type on a radio button after the value resets the value in IE8-9
					// Reset value to default in case type is set after value during creation
					var val = elem.value;
					elem.setAttribute( "type", value );
					if ( val ) {
						elem.value = val;
					}
					return value;
				}
			}
		}
	},

	removeAttr: function( elem, value ) {
		var name, propName,
			i = 0,
			attrNames = value && value.match( rnotwhite );

		if ( attrNames && elem.nodeType === 1 ) {
			while ( ( name = attrNames[ i++ ] ) ) {
				propName = jQuery.propFix[ name ] || name;

				// Boolean attributes get special treatment (#10870)
				if ( jQuery.expr.match.bool.test( name ) ) {

					// Set corresponding property to false
					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
						elem[ propName ] = false;

					// Support: IE<9
					// Also clear defaultChecked/defaultSelected (if appropriate)
					} else {
						elem[ jQuery.camelCase( "default-" + name ) ] =
							elem[ propName ] = false;
					}

				// See #9699 for explanation of this approach (setting first, then removal)
				} else {
					jQuery.attr( elem, name, "" );
				}

				elem.removeAttribute( getSetAttribute ? name : propName );
			}
		}
	}
} );

// Hooks for boolean attributes
boolHook = {
	set: function( elem, value, name ) {
		if ( value === false ) {

			// Remove boolean attributes when set to false
			jQuery.removeAttr( elem, name );
		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {

			// IE<8 needs the *property* name
			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );

		} else {

			// Support: IE<9
			// Use defaultChecked and defaultSelected for oldIE
			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
		}
		return name;
	}
};

jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
	var getter = attrHandle[ name ] || jQuery.find.attr;

	if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
		attrHandle[ name ] = function( elem, name, isXML ) {
			var ret, handle;
			if ( !isXML ) {

				// Avoid an infinite loop by temporarily removing this function from the getter
				handle = attrHandle[ name ];
				attrHandle[ name ] = ret;
				ret = getter( elem, name, isXML ) != null ?
					name.toLowerCase() :
					null;
				attrHandle[ name ] = handle;
			}
			return ret;
		};
	} else {
		attrHandle[ name ] = function( elem, name, isXML ) {
			if ( !isXML ) {
				return elem[ jQuery.camelCase( "default-" + name ) ] ?
					name.toLowerCase() :
					null;
			}
		};
	}
} );

// fix oldIE attroperties
if ( !getSetInput || !getSetAttribute ) {
	jQuery.attrHooks.value = {
		set: function( elem, value, name ) {
			if ( jQuery.nodeName( elem, "input" ) ) {

				// Does not return so that setAttribute is also used
				elem.defaultValue = value;
			} else {

				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
				return nodeHook && nodeHook.set( elem, value, name );
			}
		}
	};
}

// IE6/7 do not support getting/setting some attributes with get/setAttribute
if ( !getSetAttribute ) {

	// Use this for any attribute in IE6/7
	// This fixes almost every IE6/7 issue
	nodeHook = {
		set: function( elem, value, name ) {

			// Set the existing or create a new attribute node
			var ret = elem.getAttributeNode( name );
			if ( !ret ) {
				elem.setAttributeNode(
					( ret = elem.ownerDocument.createAttribute( name ) )
				);
			}

			ret.value = value += "";

			// Break association with cloned elements by also using setAttribute (#9646)
			if ( name === "value" || value === elem.getAttribute( name ) ) {
				return value;
			}
		}
	};

	// Some attributes are constructed with empty-string values when not defined
	attrHandle.id = attrHandle.name = attrHandle.coords =
		function( elem, name, isXML ) {
			var ret;
			if ( !isXML ) {
				return ( ret = elem.getAttributeNode( name ) ) && ret.value !== "" ?
					ret.value :
					null;
			}
		};

	// Fixing value retrieval on a button requires this module
	jQuery.valHooks.button = {
		get: function( elem, name ) {
			var ret = elem.getAttributeNode( name );
			if ( ret && ret.specified ) {
				return ret.value;
			}
		},
		set: nodeHook.set
	};

	// Set contenteditable to false on removals(#10429)
	// Setting to empty string throws an error as an invalid value
	jQuery.attrHooks.contenteditable = {
		set: function( elem, value, name ) {
			nodeHook.set( elem, value === "" ? false : value, name );
		}
	};

	// 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 ] = {
			set: function( elem, value ) {
				if ( value === "" ) {
					elem.setAttribute( name, "auto" );
					return value;
				}
			}
		};
	} );
}

if ( !support.style ) {
	jQuery.attrHooks.style = {
		get: function( elem ) {

			// Return undefined in the case of empty string
			// Note: IE uppercases css property names, but if we were to .toLowerCase()
			// .cssText, that would destroy case sensitivity in URL's, like in "background"
			return elem.style.cssText || undefined;
		},
		set: function( elem, value ) {
			return ( elem.style.cssText = value + "" );
		}
	};
}




var rfocusable = /^(?:input|select|textarea|button|object)$/i,
	rclickable = /^(?:a|area)$/i;

jQuery.fn.extend( {
	prop: function( name, value ) {
		return access( this, jQuery.prop, name, value, arguments.length > 1 );
	},

	removeProp: function( 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 ) {}
		} );
	}
} );

jQuery.extend( {
	prop: function( elem, name, value ) {
		var ret, hooks,
			nType = elem.nodeType;

		// Don't get/set properties on text, comment and attribute nodes
		if ( nType === 3 || nType === 8 || nType === 2 ) {
			return;
		}

		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {

			// 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;
			}

			return ( elem[ name ] = value );
		}

		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
			return ret;
		}

		return elem[ name ];
	},

	propHooks: {
		tabIndex: {
			get: function( 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/
				// Use proper attribute retrieval(#12072)
				var tabindex = jQuery.find.attr( elem, "tabindex" );

				return tabindex ?
					parseInt( tabindex, 10 ) :
					rfocusable.test( elem.nodeName ) ||
						rclickable.test( elem.nodeName ) && elem.href ?
							0 :
							-1;
			}
		}
	},

	propFix: {
		"for": "htmlFor",
		"class": "className"
	}
} );

// Some attributes require a special call on IE
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
if ( !support.hrefNormalized ) {

	// href/src property should get the full normalized URL (#10299/#12915)
	jQuery.each( [ "href", "src" ], function( i, name ) {
		jQuery.propHooks[ name ] = {
			get: function( elem ) {
				return elem.getAttribute( name, 4 );
			}
		};
	} );
}

// Support: Safari, IE9+
// Accessing the selectedIndex property
// forces the browser to respect setting selected
// on the option
// The getter ensures a default option is selected
// when in an optgroup
if ( !support.optSelected ) {
	jQuery.propHooks.selected = {
		get: function( 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;
		},
		set: function( elem ) {
			var parent = elem.parentNode;
			if ( parent ) {
				parent.selectedIndex;

				if ( parent.parentNode ) {
					parent.parentNode.selectedIndex;
				}
			}
		}
	};
}

jQuery.each( [
	"tabIndex",
	"readOnly",
	"maxLength",
	"cellSpacing",
	"cellPadding",
	"rowSpan",
	"colSpan",
	"useMap",
	"frameBorder",
	"contentEditable"
], function() {
	jQuery.propFix[ this.toLowerCase() ] = this;
} );

// IE6/7 call enctype encoding
if ( !support.enctype ) {
	jQuery.propFix.enctype = "encoding";
}




var rclass = /[\t\r\n\f]/g;

function getClass( elem ) {
	return jQuery.attr( elem, "class" ) || "";
}

jQuery.fn.extend( {
	addClass: function( value ) {
		var classes, elem, cur, curValue, clazz, j, finalValue,
			i = 0;

		if ( jQuery.isFunction( value ) ) {
			return this.each( function( j ) {
				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
			} );
		}

		if ( typeof value === "string" && value ) {
			classes = value.match( rnotwhite ) || [];

			while ( ( elem = this[ i++ ] ) ) {
				curValue = getClass( elem );
				cur = elem.nodeType === 1 &&
					( " " + curValue + " " ).replace( rclass, " " );

				if ( cur ) {
					j = 0;
					while ( ( clazz = classes[ j++ ] ) ) {
						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
							cur += clazz + " ";
						}
					}

					// only assign if different to avoid unneeded rendering.
					finalValue = jQuery.trim( cur );
					if ( curValue !== finalValue ) {
						jQuery.attr( elem, "class", finalValue );
					}
				}
			}
		}

		return this;
	},

	removeClass: function( value ) {
		var classes, elem, cur, curValue, clazz, j, finalValue,
			i = 0;

		if ( jQuery.isFunction( value ) ) {
			return this.each( function( j ) {
				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
			} );
		}

		if ( !arguments.length ) {
			return this.attr( "class", "" );
		}

		if ( typeof value === "string" && value ) {
			classes = value.match( rnotwhite ) || [];

			while ( ( elem = this[ i++ ] ) ) {
				curValue = getClass( elem );

				// This expression is here for better compressibility (see addClass)
				cur = elem.nodeType === 1 &&
					( " " + curValue + " " ).replace( rclass, " " );

				if ( cur ) {
					j = 0;
					while ( ( clazz = classes[ j++ ] ) ) {

						// Remove *all* instances
						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
							cur = cur.replace( " " + clazz + " ", " " );
						}
					}

					// Only assign if different to avoid unneeded rendering.
					finalValue = jQuery.trim( cur );
					if ( curValue !== finalValue ) {
						jQuery.attr( elem, "class", finalValue );
					}
				}
			}
		}

		return this;
	},

	toggleClass: function( value, stateVal ) {
		var type = typeof value;

		if ( typeof stateVal === "boolean" && type === "string" ) {
			return stateVal ? this.addClass( value ) : this.removeClass( value );
		}

		if ( jQuery.isFunction( value ) ) {
			return this.each( function( i ) {
				jQuery( this ).toggleClass(
					value.call( this, i, getClass( this ), stateVal ),
					stateVal
				);
			} );
		}

		return this.each( function() {
			var className, i, self, classNames;

			if ( type === "string" ) {

				// Toggle individual class names
				i = 0;
				self = jQuery( this );
				classNames = value.match( rnotwhite ) || [];

				while ( ( className = classNames[ i++ ] ) ) {

					// Check each className given, space separated list
					if ( self.hasClass( className ) ) {
						self.removeClass( className );
					} else {
						self.addClass( className );
					}
				}

			// Toggle whole class name
			} else if ( value === undefined || type === "boolean" ) {
				className = getClass( this );
				if ( className ) {

					// store className if set
					jQuery._data( this, "__className__", className );
				}

				// If the element has a class name or if we're passed "false",
				// then remove the whole classname (if there was one, the above saved it).
				// Otherwise bring back whatever was previously saved (if anything),
				// falling back to the empty string if nothing was stored.
				jQuery.attr( this, "class",
					className || value === false ?
					"" :
					jQuery._data( this, "__className__" ) || ""
				);
			}
		} );
	},

	hasClass: function( selector ) {
		var className, elem,
			i = 0;

		className = " " + selector + " ";
		while ( ( elem = this[ i++ ] ) ) {
			if ( elem.nodeType === 1 &&
				( " " + getClass( elem ) + " " ).replace( rclass, " " )
					.indexOf( className ) > -1
			) {
				return true;
			}
		}

		return false;
	}
} );




// Return jQuery for attributes-only inclusion


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 ) {
		return arguments.length > 0 ?
			this.on( name, null, data, fn ) :
			this.trigger( name );
	};
} );

jQuery.fn.extend( {
	hover: function( fnOver, fnOut ) {
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
	}
} );


var location = window.location;

var nonce = jQuery.now();

var rquery = ( /\?/ );



var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;

jQuery.parseJSON = function( data ) {

	// Attempt to parse using the native JSON parser first
	if ( window.JSON && window.JSON.parse ) {

		// Support: Android 2.3
		// Workaround failure to string-cast null input
		return window.JSON.parse( data + "" );
	}

	var requireNonComma,
		depth = null,
		str = jQuery.trim( data + "" );

	// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
	// after removing valid tokens
	return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {

		// Force termination if we see a misplaced comma
		if ( requireNonComma && comma ) {
			depth = 0;
		}

		// Perform no more replacements after returning to outermost depth
		if ( depth === 0 ) {
			return token;
		}

		// Commas must not follow "[", "{", or ","
		requireNonComma = open || comma;

		// Determine new depth
		// array/object open ("[" or "{"): depth += true - false (increment)
		// array/object close ("]" or "}"): depth += false - true (decrement)
		// other cases ("," or primitive): depth += true - true (numeric cast)
		depth += !close - !open;

		// Remove this token
		return "";
	} ) ) ?
		( Function( "return " + str ) )() :
		jQuery.error( "Invalid JSON: " + data );
};


// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
	var xml, tmp;
	if ( !data || typeof data !== "string" ) {
		return null;
	}
	try {
		if ( window.DOMParser ) { // Standard
			tmp = new window.DOMParser();
			xml = tmp.parseFromString( data, "text/xml" );
		} else { // IE
			xml = new window.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;
};


var
	rhash = /#.*$/,
	rts = /([?&])_=[^&]*/,

	// IE leaves an \r character at EOL
	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,

	// #7653, #8125, #8152: local protocol detection
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
	rnoContent = /^(?:GET|HEAD)$/,
	rprotocol = /^\/\//,
	rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,

	/* 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 = "*/".concat( "*" ),

	// Document location
	ajaxLocation = location.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,
			i = 0,
			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];

		if ( jQuery.isFunction( func ) ) {

			// For each dataType in the dataTypeExpression
			while ( ( dataType = dataTypes[ i++ ] ) ) {

				// Prepend if requested
				if ( dataType.charAt( 0 ) === "+" ) {
					dataType = dataType.slice( 1 ) || "*";
					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );

				// Otherwise append
				} else {
					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
				}
			}
		}
	};
}

// Base inspection function for prefilters and transports
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {

	var inspected = {},
		seekingTransport = ( structure === transports );

	function inspect( dataType ) {
		var selected;
		inspected[ dataType ] = true;
		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
			if ( typeof dataTypeOrTransport === "string" &&
				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {

				options.dataTypes.unshift( dataTypeOrTransport );
				inspect( dataTypeOrTransport );
				return false;
			} else if ( seekingTransport ) {
				return !( selected = dataTypeOrTransport );
			}
		} );
		return selected;
	}

	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
}

// A special extend for ajax options
// that takes "flat" options (not to be deep extended)
// Fixes #9887
function ajaxExtend( target, src ) {
	var deep, key,
		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 );
	}

	return target;
}

/* Handles responses to an ajax request:
 * - finds the right dataType (mediates between content-type and expected dataType)
 * - returns the corresponding response
 */
function ajaxHandleResponses( s, jqXHR, responses ) {
	var firstDataType, ct, finalDataType, type,
		contents = s.contents,
		dataTypes = s.dataTypes;

	// 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
 * Also sets the responseXXX fields on the jqXHR instance
 */
function ajaxConvert( s, response, jqXHR, isSuccess ) {
	var conv2, current, conv, tmp, prev,
		converters = {},

		// Work with a copy of dataTypes in case we need to modify it for conversion
		dataTypes = s.dataTypes.slice();

	// Create converters map with lowercased keys
	if ( dataTypes[ 1 ] ) {
		for ( conv in s.converters ) {
			converters[ conv.toLowerCase() ] = s.converters[ conv ];
		}
	}

	current = dataTypes.shift();

	// Convert to each sequential dataType
	while ( current ) {

		if ( s.responseFields[ current ] ) {
			jqXHR[ s.responseFields[ current ] ] = response;
		}

		// Apply the dataFilter if provided
		if ( !prev && isSuccess && s.dataFilter ) {
			response = s.dataFilter( response, s.dataType );
		}

		prev = current;
		current = dataTypes.shift();

		if ( current ) {

			// There's only work to do if current dataType is non-auto
			if ( current === "*" ) {

				current = prev;

			// Convert response if prev dataType is non-auto and differs from current
			} else 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.unshift( tmp[ 1 ] );
								}
								break;
							}
						}
					}
				}

				// Apply converter (if not an equivalence)
				if ( conv !== true ) {

					// Unless errors are allowed to bubble, catch and return them
					if ( conv && s[ "throws" ] ) { // jscs:ignore requireDotNotation
						response = conv( response );
					} else {
						try {
							response = conv( response );
						} catch ( e ) {
							return {
								state: "parsererror",
								error: conv ? e : "No conversion from " + prev + " to " + current
							};
						}
					}
				}
			}
		}
	}

	return { state: "success", data: response };
}

jQuery.extend( {

	// Counter for holding the number of active queries
	active: 0,

	// Last-Modified header cache for next request
	lastModified: {},
	etag: {},

	ajaxSettings: {
		url: ajaxLocation,
		type: "GET",
		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
		global: true,
		processData: true,
		async: true,
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
		/*
		timeout: 0,
		data: null,
		dataType: null,
		username: null,
		password: null,
		cache: null,
		throws: false,
		traditional: false,
		headers: {},
		*/

		accepts: {
			"*": allTypes,
			text: "text/plain",
			html: "text/html",
			xml: "application/xml, text/xml",
			json: "application/json, text/javascript"
		},

		contents: {
			xml: /\bxml\b/,
			html: /\bhtml/,
			json: /\bjson\b/
		},

		responseFields: {
			xml: "responseXML",
			text: "responseText",
			json: "responseJSON"
		},

		// Data converters
		// Keys separate source (or catchall "*") and destination types with a single space
		converters: {

			// Convert anything to text
			"* text": 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: {
			url: true,
			context: true
		}
	},

	// Creates a full fledged settings object into target
	// with both ajaxSettings and settings fields.
	// If target is omitted, writes into ajaxSettings.
	ajaxSetup: function( target, settings ) {
		return settings ?

			// Building a settings object
			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :

			// Extending ajaxSettings
			ajaxExtend( jQuery.ajaxSettings, target );
	},

	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
	ajaxTransport: addToPrefiltersOrTransports( transports ),

	// Main method
	ajax: function( 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

			// Cross-domain detection vars
			parts,

			// Loop variable
			i,

			// URL without anti-cache param
			cacheURL,

			// Response headers as string
			responseHeadersString,

			// timeout handle
			timeoutTimer,

			// To know if global events are to be dispatched
			fireGlobals,

			transport,

			// Response headers
			responseHeaders,

			// Create the final options object
			s = jQuery.ajaxSetup( {}, options ),

			// Callbacks context
			callbackContext = s.context || s,

			// Context for global events is callbackContext if it is a DOM node or jQuery collection
			globalEventContext = s.context &&
				( callbackContext.nodeType || callbackContext.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,

				// Builds headers hashtable if needed
				getResponseHeader: function( 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 == null ? null : match;
				},

				// Raw string
				getAllResponseHeaders: function() {
					return state === 2 ? responseHeadersString : null;
				},

				// Caches the header
				setRequestHeader: function( name, value ) {
					var lname = name.toLowerCase();
					if ( !state ) {
						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
						requestHeaders[ name ] = value;
					}
					return this;
				},

				// Overrides response content-type header
				overrideMimeType: function( type ) {
					if ( !state ) {
						s.mimeType = type;
					}
					return this;
				},

				// Status-dependent callbacks
				statusCode: function( map ) {
					var code;
					if ( map ) {
						if ( state < 2 ) {
							for ( code in map ) {

								// Lazy-add the new callback in a way that preserves old ones
								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
							}
						} else {

							// Execute the appropriate callbacks
							jqXHR.always( map[ jqXHR.status ] );
						}
					}
					return this;
				},

				// Cancel the request
				abort: function( statusText ) {
					var finalText = statusText || strAbort;
					if ( transport ) {
						transport.abort( finalText );
					}
					done( 0, finalText );
					return this;
				}
			};

		// Attach deferreds
		deferred.promise( jqXHR ).complete = completeDeferred.add;
		jqXHR.success = jqXHR.done;
		jqXHR.error = jqXHR.fail;

		// Remove hash character (#7531: and string promotion)
		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
		// Handle falsy url in the settings object (#10093: consistency with old signature)
		// We also use the url parameter if available
		s.url = ( ( url || s.url || ajaxLocation ) + "" )
			.replace( rhash, "" )
			.replace( rprotocol, ajaxLocParts[ 1 ] + "//" );

		// Alias method option to type as per ticket #12004
		s.type = options.method || options.type || s.method || s.type;

		// Extract dataTypes list
		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];

		// A cross-domain request is in order when we have a protocol:host:port mismatch
		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
		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
		fireGlobals = jQuery.event && s.global;

		// Watch for a new set of requests
		if ( fireGlobals && jQuery.active++ === 0 ) {
			jQuery.event.trigger( "ajaxStart" );
		}

		// Uppercase the type
		s.type = s.type.toUpperCase();

		// Determine if request has content
		s.hasContent = !rnoContent.test( s.type );

		// Save the URL in case we're toying with the If-Modified-Since
		// and/or If-None-Match header later on
		cacheURL = s.url;

		// More options handling for requests with no content
		if ( !s.hasContent ) {

			// If data is available, append data to url
			if ( s.data ) {
				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );

				// #9682: remove data so that it's not used in an eventual retry
				delete s.data;
			}

			// Add anti-cache in url if needed
			if ( s.cache === false ) {
				s.url = rts.test( cacheURL ) ?

					// If there is already a '_' parameter, set its value
					cacheURL.replace( rts, "$1_=" + nonce++ ) :

					// Otherwise add one to the end
					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
			}
		}

		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
		if ( s.ifModified ) {
			if ( jQuery.lastModified[ cacheURL ] ) {
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
			}
			if ( jQuery.etag[ cacheURL ] ) {
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
			}
		}

		// 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 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 ] );
			}

			// If request was aborted inside ajaxSend, stop there
			if ( state === 2 ) {
				return jqXHR;
			}

			// Timeout
			if ( s.async && s.timeout > 0 ) {
				timeoutTimer = window.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;
				}
			}
		}

		// Callback for when everything is done
		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 ) {
				window.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;

			// Determine if successful
			isSuccess = status >= 200 && status < 300 || status === 304;

			// Get response data
			if ( responses ) {
				response = ajaxHandleResponses( s, jqXHR, responses );
			}

			// Convert no matter what (that way responseXXX fields are always set)
			response = ajaxConvert( s, response, jqXHR, isSuccess );

			// If successful, handle type chaining
			if ( isSuccess ) {

				// 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[ cacheURL ] = modified;
					}
					modified = jqXHR.getResponseHeader( "etag" );
					if ( modified ) {
						jQuery.etag[ cacheURL ] = modified;
					}
				}

				// if no content
				if ( status === 204 || s.type === "HEAD" ) {
					statusText = "nocontent";

				// if not modified
				} else if ( status === 304 ) {
					statusText = "notmodified";

				// If we have data, let's convert it
				} else {
					statusText = response.state;
					success = response.data;
					error = response.error;
					isSuccess = !error;
				}
			} else {

				// We extract error from statusText
				// then normalize statusText and status for non-aborts
				error = statusText;
				if ( status || !statusText ) {
					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( isSuccess ? "ajaxSuccess" : "ajaxError",
					[ 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" );
				}
			}
		}

		return jqXHR;
	},

	getJSON: function( url, data, callback ) {
		return jQuery.get( url, data, callback, "json" );
	},

	getScript: function( url, callback ) {
		return jQuery.get( url, undefined, callback, "script" );
	}
} );

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;
		}

		// The url can be an options object (which then must have .url)
		return jQuery.ajax( jQuery.extend( {
			url: url,
			type: method,
			dataType: type,
			data: data,
			success: callback
		}, jQuery.isPlainObject( url ) && url ) );
	};
} );


jQuery._evalUrl = function( url ) {
	return jQuery.ajax( {
		url: url,

		// Make this explicit, since user can override this through ajaxSetup (#11264)
		type: "GET",
		dataType: "script",
		cache: true,
		async: false,
		global: false,
		"throws": true
	} );
};


jQuery.fn.extend( {
	wrapAll: function( 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( 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( html ) {
		var isFunction = jQuery.isFunction( html );

		return this.each( function( i ) {
			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
		} );
	},

	unwrap: function() {
		return this.parent().each( function() {
			if ( !jQuery.nodeName( this, "body" ) ) {
				jQuery( this ).replaceWith( this.childNodes );
			}
		} ).end();
	}
} );


function getDisplay( elem ) {
	return elem.style && elem.style.display || jQuery.css( elem, "display" );
}

function filterHidden( elem ) {

	// Disconnected elements are considered hidden
	if ( !jQuery.contains( elem.ownerDocument || document, elem ) ) {
		return true;
	}
	while ( elem && elem.nodeType === 1 ) {
		if ( getDisplay( elem ) === "none" || elem.type === "hidden" ) {
			return true;
		}
		elem = elem.parentNode;
	}
	return false;
}

jQuery.expr.filters.hidden = function( elem ) {

	// Support: Opera <= 12.12
	// Opera reports offsetWidths and offsetHeights less than zero on some elements
	return support.reliableHiddenOffsets() ?
		( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 &&
			!elem.getClientRects().length ) :
			filterHidden( elem );
};

jQuery.expr.filters.visible = function( elem ) {
	return !jQuery.expr.filters.hidden( elem );
};




var r20 = /%20/g,
	rbracket = /\[\]$/,
	rCRLF = /\r?\n/g,
	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
	rsubmittable = /^(?:input|select|textarea|keygen)/i;

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 {

				// Item is non-scalar (array or object), encode its numeric index.
				buildParams(
					prefix + "[" + ( typeof v === "object" && v != null ? 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 );
	}
}

// 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( 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, "+" );
};

jQuery.fn.extend( {
	serialize: function() {
		return jQuery.param( this.serializeArray() );
	},
	serializeArray: function() {
		return this.map( function() {

			// Can add propHook for "elements" to filter or add form elements
			var elements = jQuery.prop( this, "elements" );
			return elements ? jQuery.makeArray( elements ) : this;
		} )
		.filter( function() {
			var type = this.type;

			// Use .is(":disabled") so that fieldset[disabled] works
			return this.name && !jQuery( this ).is( ":disabled" ) &&
				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
				( this.checked || !rcheckableType.test( type ) );
		} )
		.map( function( i, elem ) {
			var val = jQuery( this ).val();

			return val == null ?
				null :
				jQuery.isArray( val ) ?
					jQuery.map( val, function( val ) {
						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
					} ) :
					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
		} ).get();
	}
} );


// Create the request object
// (This is still attached to ajaxSettings for backward compatibility)
jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?

	// Support: IE6-IE8
	function() {

		// XHR cannot access local files, always use ActiveX for that case
		if ( this.isLocal ) {
			return createActiveXHR();
		}

		// Support: IE 9-11
		// IE seems to error on cross-domain PATCH requests when ActiveX XHR
		// is used. In IE 9+ always use the native XHR.
		// Note: this condition won't catch Edge as it doesn't define
		// document.documentMode but it also doesn't support ActiveX so it won't
		// reach this code.
		if ( document.documentMode > 8 ) {
			return createStandardXHR();
		}

		// Support: IE<9
		// oldIE XHR does not support non-RFC2616 methods (#13240)
		// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
		// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
		// Although this check for six methods instead of eight
		// since IE also does not support "trace" and "connect"
		return /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
			createStandardXHR() || createActiveXHR();
	} :

	// For all other browsers, use the standard XMLHttpRequest object
	createStandardXHR;

var xhrId = 0,
	xhrCallbacks = {},
	xhrSupported = jQuery.ajaxSettings.xhr();

// Support: IE<10
// Open requests must be manually aborted on unload (#5280)
// See https://support.microsoft.com/kb/2856746 for more info
if ( window.attachEvent ) {
	window.attachEvent( "onunload", function() {
		for ( var key in xhrCallbacks ) {
			xhrCallbacks[ key ]( undefined, true );
		}
	} );
}

// Determine support properties
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
xhrSupported = support.ajax = !!xhrSupported;

// Create transport if the browser can provide an xhr
if ( xhrSupported ) {

	jQuery.ajaxTransport( function( options ) {

		// Cross domain only allowed if supported through XMLHttpRequest
		if ( !options.crossDomain || support.cors ) {

			var callback;

			return {
				send: function( headers, complete ) {
					var i,
						xhr = options.xhr(),
						id = ++xhrId;

					// Open the socket
					xhr.open(
						options.type,
						options.url,
						options.async,
						options.username,
						options.password
					);

					// Apply custom fields if provided
					if ( options.xhrFields ) {
						for ( i in options.xhrFields ) {
							xhr[ i ] = options.xhrFields[ i ];
						}
					}

					// Override mime type if needed
					if ( options.mimeType && xhr.overrideMimeType ) {
						xhr.overrideMimeType( options.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 ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
						headers[ "X-Requested-With" ] = "XMLHttpRequest";
					}

					// Set headers
					for ( i in headers ) {

						// Support: IE<9
						// IE's ActiveXObject throws a 'Type Mismatch' exception when setting
						// request header to a null-value.
						//
						// To keep consistent with other XHR implementations, cast the value
						// to string and ignore `undefined`.
						if ( headers[ i ] !== undefined ) {
							xhr.setRequestHeader( i, headers[ i ] + "" );
						}
					}

					// Do send the request
					// This may raise an exception which is actually
					// handled in jQuery.ajax (so no try/catch here)
					xhr.send( ( options.hasContent && options.data ) || null );

					// Listener
					callback = function( _, isAbort ) {
						var status, statusText, responses;

						// Was never called and is aborted or complete
						if ( callback && ( isAbort || xhr.readyState === 4 ) ) {

							// Clean up
							delete xhrCallbacks[ id ];
							callback = undefined;
							xhr.onreadystatechange = jQuery.noop;

							// Abort manually if needed
							if ( isAbort ) {
								if ( xhr.readyState !== 4 ) {
									xhr.abort();
								}
							} else {
								responses = {};
								status = xhr.status;

								// Support: IE<10
								// Accessing binary-data responseText throws an exception
								// (#11426)
								if ( typeof xhr.responseText === "string" ) {
									responses.text = xhr.responseText;
								}

								// 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 && options.isLocal && !options.crossDomain ) {
									status = responses.text ? 200 : 404;

								// IE - #1450: sometimes returns 1223 when it should be 204
								} else if ( status === 1223 ) {
									status = 204;
								}
							}
						}

						// Call complete if needed
						if ( responses ) {
							complete( status, statusText, responses, xhr.getAllResponseHeaders() );
						}
					};

					// Do send the request
					// `xhr.send` may raise an exception, but it will be
					// handled in jQuery.ajax (so no try/catch here)
					if ( !options.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
						window.setTimeout( callback );
					} else {

						// Register the callback, but delay it in case `xhr.send` throws
						// Add to the list of active xhr callbacks
						xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
					}
				},

				abort: function() {
					if ( callback ) {
						callback( undefined, true );
					}
				}
			};
		}
	} );
}

// Functions to create xhrs
function createStandardXHR() {
	try {
		return new window.XMLHttpRequest();
	} catch ( e ) {}
}

function createActiveXHR() {
	try {
		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
	} catch ( e ) {}
}




// Install script dataType
jQuery.ajaxSetup( {
	accepts: {
		script: "text/javascript, application/javascript, " +
			"application/ecmascript, application/x-ecmascript"
	},
	contents: {
		script: /\b(?:java|ecma)script\b/
	},
	converters: {
		"text script": function( 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 || jQuery( "head" )[ 0 ] || document.documentElement;

		return {

			send: function( _, callback ) {

				script = document.createElement( "script" );

				script.async = true;

				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 ( script.parentNode ) {
							script.parentNode.removeChild( script );
						}

						// Dereference the script
						script = null;

						// Callback if not abort
						if ( !isAbort ) {
							callback( 200, "success" );
						}
					}
				};

				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
				// Use native DOM manipulation to avoid our domManip AJAX trickery
				head.insertBefore( script, head.firstChild );
			},

			abort: function() {
				if ( script ) {
					script.onload( undefined, true );
				}
			}
		};
	}
} );




var oldCallbacks = [],
	rjsonp = /(=)\?(?=&|$)|\?\?/;

// Default jsonp settings
jQuery.ajaxSetup( {
	jsonp: "callback",
	jsonpCallback: function() {
		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,
		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
			"url" :
			typeof s.data === "string" &&
				( s.contentType || "" )
					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
				rjsonp.test( s.data ) && "data"
		);

	// Handle iff the expected data type is "jsonp" or we have a parameter to set
	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {

		// Get callback name, remembering preexisting value associated with it
		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
			s.jsonpCallback() :
			s.jsonpCallback;

		// Insert callback into url or form data
		if ( jsonProp ) {
			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
		} else if ( s.jsonp !== false ) {
			s.url += ( rquery.test( s.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
		overwritten = window[ callbackName ];
		window[ callbackName ] = function() {
			responseContainer = arguments;
		};

		// Clean-up function (fires after converters)
		jqXHR.always( function() {

			// If previous value didn't exist - remove it
			if ( overwritten === undefined ) {
				jQuery( window ).removeProp( callbackName );

			// Otherwise restore preexisting value
			} else {
				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";
	}
} );




// data: string of html
// context (optional): If specified, the fragment will be created in this context,
// defaults to document
// keepScripts (optional): If true, will include scripts passed in the html string
jQuery.parseHTML = function( data, context, keepScripts ) {
	if ( !data || typeof data !== "string" ) {
		return null;
	}
	if ( typeof context === "boolean" ) {
		keepScripts = context;
		context = false;
	}
	context = context || document;

	var parsed = rsingleTag.exec( data ),
		scripts = !keepScripts && [];

	// Single tag
	if ( parsed ) {
		return [ context.createElement( parsed[ 1 ] ) ];
	}

	parsed = buildFragment( [ data ], context, scripts );

	if ( scripts && scripts.length ) {
		jQuery( scripts ).remove();
	}

	return jQuery.merge( [], parsed.childNodes );
};


// Keep a copy of the old load method
var _load = jQuery.fn.load;

/**
 * Load a url into a page
 */
jQuery.fn.load = function( url, params, callback ) {
	if ( typeof url !== "string" && _load ) {
		return _load.apply( this, arguments );
	}

	var selector, type, response,
		self = this,
		off = url.indexOf( " " );

	if ( off > -1 ) {
		selector = jQuery.trim( 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";
	}

	// If we have elements to modify, make the request
	if ( self.length > 0 ) {
		jQuery.ajax( {
			url: url,

			// If "type" variable is undefined, then "GET" method will be used.
			// Make value of this field explicit since
			// user can override it through ajaxSetup method
			type: type || "GET",
			dataType: "html",
			data: params
		} ).done( function( responseText ) {

			// Save response for use in complete callback
			response = arguments;

			self.html( selector ?

				// If a selector was specified, locate the right elements in a dummy div
				// Exclude scripts to avoid IE 'Permission Denied' errors
				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :

				// Otherwise use the full result
				responseText );

		// If the request succeeds, this function gets "data", "status", "jqXHR"
		// but they are ignored because response was set above.
		// If it fails, this function gets "jqXHR", "status", "error"
		} ).always( callback && function( jqXHR, status ) {
			self.each( function() {
				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
			} );
		} );
	}

	return this;
};




// Attach a bunch of functions for handling common AJAX events
jQuery.each( [
	"ajaxStart",
	"ajaxStop",
	"ajaxComplete",
	"ajaxError",
	"ajaxSuccess",
	"ajaxSend"
], function( i, type ) {
	jQuery.fn[ type ] = function( fn ) {
		return this.on( type, fn );
	};
} );




jQuery.expr.filters.animated = function( elem ) {
	return jQuery.grep( jQuery.timers, function( fn ) {
		return elem === fn.elem;
	} ).length;
};





/**
 * Gets a window from an element
 */
function getWindow( elem ) {
	return jQuery.isWindow( elem ) ?
		elem :
		elem.nodeType === 9 ?
			elem.defaultView || elem.parentWindow :
			false;
}

jQuery.offset = {
	setOffset: function( elem, options, i ) {
		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
			position = jQuery.css( elem, "position" ),
			curElem = jQuery( elem ),
			props = {};

		// set position first, in-case top/left are set even on static elem
		if ( position === "static" ) {
			elem.style.position = "relative";
		}

		curOffset = curElem.offset();
		curCSSTop = jQuery.css( elem, "top" );
		curCSSLeft = jQuery.css( elem, "left" );
		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
			jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1;

		// 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 ) ) {

			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
			options = options.call( elem, i, jQuery.extend( {}, 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( {
	offset: function( options ) {
		if ( arguments.length ) {
			return options === undefined ?
				this :
				this.each( function( i ) {
					jQuery.offset.setOffset( this, options, i );
				} );
		}

		var docElem, win,
			box = { top: 0, left: 0 },
			elem = this[ 0 ],
			doc = elem && elem.ownerDocument;

		if ( !doc ) {
			return;
		}

		docElem = doc.documentElement;

		// Make sure it's not a disconnected DOM node
		if ( !jQuery.contains( docElem, elem ) ) {
			return box;
		}

		// If we don't have gBCR, just use 0,0 rather than error
		// BlackBerry 5, iOS 3 (original iPhone)
		if ( typeof elem.getBoundingClientRect !== "undefined" ) {
			box = elem.getBoundingClientRect();
		}
		win = getWindow( doc );
		return {
			top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
			left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
		};
	},

	position: function() {
		if ( !this[ 0 ] ) {
			return;
		}

		var offsetParent, offset,
			parentOffset = { top: 0, left: 0 },
			elem = this[ 0 ];

		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
		// because it is its only offset parent
		if ( jQuery.css( elem, "position" ) === "fixed" ) {

			// we assume that getBoundingClientRect is available when computed position is fixed
			offset = elem.getBoundingClientRect();
		} else {

			// Get *real* offsetParent
			offsetParent = this.offsetParent();

			// Get correct offsets
			offset = this.offset();
			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
				parentOffset = offsetParent.offset();
			}

			// Add offsetParent borders
			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
		}

		// Subtract parent offsets and 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
		return {
			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
		};
	},

	offsetParent: function() {
		return this.map( function() {
			var offsetParent = this.offsetParent;

			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) &&
				jQuery.css( offsetParent, "position" ) === "static" ) ) {
				offsetParent = offsetParent.offsetParent;
			}
			return offsetParent || documentElement;
		} );
	}
} );

// 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 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 );
	};
} );

// Support: Safari<7-8+, Chrome<37-44+
// Add the top/left cssHooks using jQuery.fn.position
// 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
jQuery.each( [ "top", "left" ], function( i, prop ) {
	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
		function( elem, computed ) {
			if ( computed ) {
				computed = curCSS( elem, prop );

				// if curCSS returns percentage, fallback to offset
				return rnumnonpx.test( computed ) ?
					jQuery( elem ).position()[ prop ] + "px" :
					computed;
			}
		}
	);
} );


// 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 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, extra ) :

					// Set width or height on the element
					jQuery.style( elem, type, value, extra );
			}, type, chainable ? margin : undefined, chainable, null );
		};
	} );
} );


jQuery.fn.extend( {

	bind: function( types, data, fn ) {
		return this.on( types, null, data, fn );
	},
	unbind: function( types, fn ) {
		return this.off( types, null, fn );
	},

	delegate: function( selector, types, data, fn ) {
		return this.on( types, selector, data, fn );
	},
	undelegate: function( selector, types, fn ) {

		// ( namespace ) or ( selector, types [, fn] )
		return arguments.length === 1 ?
			this.off( selector, "**" ) :
			this.off( types, selector || "**", fn );
	}
} );

// The number of elements contained in the matched element set
jQuery.fn.size = function() {
	return this.length;
};

jQuery.fn.andSelf = jQuery.fn.addBack;




// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via 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.

// Note that for maximum portability, libraries that are not jQuery should
// declare themselves as anonymous modules, and avoid setting a global if an
// AMD loader is present. jQuery is a special case. For more information, see
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

if ( typeof define === "function" && define.amd ) {
	define( "jquery", [], function() {
		return jQuery;
	} );
}



var

	// Map over jQuery in case of overwrite
	_jQuery = window.jQuery,

	// Map over the $ in case of overwrite
	_$ = window.$;

jQuery.noConflict = function( deep ) {
	if ( window.$ === jQuery ) {
		window.$ = _$;
	}

	if ( deep && window.jQuery === jQuery ) {
		window.jQuery = _jQuery;
	}

	return jQuery;
};

// Expose jQuery and $ identifiers, even in
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
if ( !noGlobal ) {
	window.jQuery = window.$ = jQuery;
}

return jQuery;
}));

},{}],110:[function(require,module,exports){
(function (factory) {
    // Module systems magic dance.

    if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
        // CommonJS or Node: hard-coded dependency on "knockout"
        factory(require("knockout"), exports);
    } else if (typeof define === "function" && define["amd"]) {
        // AMD anonymous module with hard-coded dependency on "knockout"
        define(["knockout", "exports"], factory);
    } else {
        // <script> tag: use the global `ko` object, attaching a `mapping` property
        factory(ko, ko.mapping = {});
    }
}(function (ko, exports) {
    var DEBUG = true;
    var mappingProperty = "__ko_mapping__";
    var realKoDependentObservable = ko.dependentObservable;
    var mappingNesting = 0;
    var dependentObservables;
    var visitedObjects;
    var recognizedRootProperties = ["create", "update", "key", "arrayChanged"];
    var emptyReturn = {};

    var _defaultOptions = {
        include: ["_destroy"],
        ignore: [],
        copy: [],
        observe: []
    };
    var defaultOptions = _defaultOptions;

    function unionArrays() {
        var args = arguments,
        l = args.length,
        obj = {},
        res = [],
        i, j, k;

        while (l--) {
            k = args[l];
            i = k.length;

            while (i--) {
                j = k[i];
                if (!obj[j]) {
                    obj[j] = 1;
                    res.push(j);
                }
            }
        }

        return res;
    }

    function extendObject(destination, source) {
        var destType;

        for (var key in source) {
            if (source.hasOwnProperty(key) && source[key]) {
                destType = exports.getType(destination[key]);
                if (key && destination[key] && destType !== "array" && destType !== "string") {
                    extendObject(destination[key], source[key]);
                } else {
                    var bothArrays = exports.getType(destination[key]) === "array" && exports.getType(source[key]) === "array";
                    if (bothArrays) {
                        destination[key] = unionArrays(destination[key], source[key]);
                    } else {
                        destination[key] = source[key];
                    }
                }
            }
        }
    }

    function merge(obj1, obj2) {
        var merged = {};
        extendObject(merged, obj1);
        extendObject(merged, obj2);

        return merged;
    }

    exports.isMapped = function (viewModel) {
        var unwrapped = ko.utils.unwrapObservable(viewModel);
        return unwrapped && unwrapped[mappingProperty];
    };

    exports.fromJS = function (jsObject /*, inputOptions, target*/ ) {
        if (!arguments.length) throw new Error("When calling ko.mapping.fromJS, pass the object you want to convert.");

        try {
            if (!mappingNesting++) {
                dependentObservables = [];
                visitedObjects = new objectLookup();
            }

            var options;
            var target;

            if (arguments.length == 2) {
                if (arguments[1][mappingProperty]) {
                    target = arguments[1];
                } else {
                    options = arguments[1];
                }
            }
            if (arguments.length == 3) {
                options = arguments[1];
                target = arguments[2];
            }

            if (target) {
                options = merge(options, target[mappingProperty]);
            }
            options = fillOptions(options);

            var result = updateViewModel(target, jsObject, options);
            if (target) {
                result = target;
            }

            // Evaluate any dependent observables that were proxied.
            // Do this after the model's observables have been created
            if (!--mappingNesting) {
                while (dependentObservables.length) {
                    var DO = dependentObservables.pop();
                    if (DO) {
                        DO();

                        // Move this magic property to the underlying dependent observable
                        DO.__DO["throttleEvaluation"] = DO["throttleEvaluation"];
                    }
                }
            }

            // Save any new mapping options in the view model, so that updateFromJS can use them later.
            result[mappingProperty] = merge(result[mappingProperty], options);

            return result;
        } catch(e) {
            mappingNesting = 0;
            throw e;
        }
    };

    exports.fromJSON = function (jsonString /*, options, target*/ ) {
        var parsed = ko.utils.parseJson(jsonString);
        var argArray = Array.prototype.slice.call(arguments);
        argArray[0] = parsed;
        return exports.fromJS.apply(this, argArray);
    };

    exports.updateFromJS = function (viewModel) {
        throw new Error("ko.mapping.updateFromJS, use ko.mapping.fromJS instead. Please note that the order of parameters is different!");
    };

    exports.updateFromJSON = function (viewModel) {
        throw new Error("ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead. Please note that the order of parameters is different!");
    };

    exports.toJS = function (rootObject, options) {
        if (!defaultOptions) exports.resetDefaultOptions();

        if (!arguments.length) throw new Error("When calling ko.mapping.toJS, pass the object you want to convert.");
        if (exports.getType(defaultOptions.ignore) !== "array") throw new Error("ko.mapping.defaultOptions().ignore should be an array.");
        if (exports.getType(defaultOptions.include) !== "array") throw new Error("ko.mapping.defaultOptions().include should be an array.");
        if (exports.getType(defaultOptions.copy) !== "array") throw new Error("ko.mapping.defaultOptions().copy should be an array.");

        // Merge in the options used in fromJS
        options = fillOptions(options, rootObject[mappingProperty]);

        // We just unwrap everything at every level in the object graph
        return exports.visitModel(rootObject, function (x) {
            return ko.utils.unwrapObservable(x);
        }, options);
    };

    exports.toJSON = function (rootObject, options) {
        var plainJavaScriptObject = exports.toJS(rootObject, options);
        return ko.utils.stringifyJson(plainJavaScriptObject);
    };

    exports.defaultOptions = function () {
        if (arguments.length > 0) {
            defaultOptions = arguments[0];
        } else {
            return defaultOptions;
        }
    };

    exports.resetDefaultOptions = function () {
        defaultOptions = {
            include: _defaultOptions.include.slice(0),
            ignore: _defaultOptions.ignore.slice(0),
            copy: _defaultOptions.copy.slice(0),
            observe: _defaultOptions.observe.slice(0)
        };
    };

    exports.getType = function(x) {
        if ((x) && (typeof (x) === "object")) {
            if (x.constructor === Date) return "date";
            if (x.constructor === Array) return "array";
        }
        return typeof x;
    };

    function fillOptions(rawOptions, otherOptions) {
        var options = merge({}, rawOptions);

        // Move recognized root-level properties into a root namespace
        for (var i = recognizedRootProperties.length - 1; i >= 0; i--) {
            var property = recognizedRootProperties[i];

            // Carry on, unless this property is present
            if (!options[property]) continue;

            // Move the property into the root namespace
            if (!(options[""] instanceof Object)) options[""] = {};
            options[""][property] = options[property];
            delete options[property];
        }

        if (otherOptions) {
            options.ignore = mergeArrays(otherOptions.ignore, options.ignore);
            options.include = mergeArrays(otherOptions.include, options.include);
            options.copy = mergeArrays(otherOptions.copy, options.copy);
            options.observe = mergeArrays(otherOptions.observe, options.observe);
        }
        options.ignore = mergeArrays(options.ignore, defaultOptions.ignore);
        options.include = mergeArrays(options.include, defaultOptions.include);
        options.copy = mergeArrays(options.copy, defaultOptions.copy);
        options.observe = mergeArrays(options.observe, defaultOptions.observe);

        options.mappedProperties = options.mappedProperties || {};
        options.copiedProperties = options.copiedProperties || {};
        return options;
    }

    function mergeArrays(a, b) {
        if (exports.getType(a) !== "array") {
            if (exports.getType(a) === "undefined") a = [];
            else a = [a];
        }
        if (exports.getType(b) !== "array") {
            if (exports.getType(b) === "undefined") b = [];
            else b = [b];
        }

        return ko.utils.arrayGetDistinctValues(a.concat(b));
    }

    // When using a 'create' callback, we proxy the dependent observable so that it doesn't immediately evaluate on creation.
    // The reason is that the dependent observables in the user-specified callback may contain references to properties that have not been mapped yet.
    function withProxyDependentObservable(dependentObservables, callback) {
        var localDO = ko.dependentObservable;
        ko.dependentObservable = function (read, owner, options) {
            options = options || {};

            if (read && typeof read == "object") { // mirrors condition in knockout implementation of DO's
                options = read;
            }

            var realDeferEvaluation = options.deferEvaluation;

            var isRemoved = false;

            // We wrap the original dependent observable so that we can remove it from the 'dependentObservables' list we need to evaluate after mapping has
            // completed if the user already evaluated the DO themselves in the meantime.
            var wrap = function (DO) {
                // Temporarily revert ko.dependentObservable, since it is used in ko.isWriteableObservable
                var tmp = ko.dependentObservable;
                ko.dependentObservable = realKoDependentObservable;
                var isWriteable = ko.isWriteableObservable(DO);
                ko.dependentObservable = tmp;

                var wrapped = realKoDependentObservable({
                    read: function () {
                        if (!isRemoved) {
                            ko.utils.arrayRemoveItem(dependentObservables, DO);
                            isRemoved = true;
                        }
                        return DO.apply(DO, arguments);
                    },
                    write: isWriteable && function (val) {
                        return DO(val);
                    },
                    deferEvaluation: true
                });
                if (DEBUG) wrapped._wrapper = true;
                wrapped.__DO = DO;
                return wrapped;
            };

            options.deferEvaluation = true; // will either set for just options, or both read/options.
            var realDependentObservable = new realKoDependentObservable(read, owner, options);

            if (!realDeferEvaluation) {
                realDependentObservable = wrap(realDependentObservable);
                dependentObservables.push(realDependentObservable);
            }

            return realDependentObservable;
        };
        ko.dependentObservable.fn = realKoDependentObservable.fn;
        ko.computed = ko.dependentObservable;
        var result = callback();
        ko.dependentObservable = localDO;
        ko.computed = ko.dependentObservable;
        return result;
    }

    function updateViewModel(mappedRootObject, rootObject, options, parentName, parent, parentPropertyName, mappedParent) {
        var isArray = exports.getType(ko.utils.unwrapObservable(rootObject)) === "array";

        parentPropertyName = parentPropertyName || "";

        // If this object was already mapped previously, take the options from there and merge them with our existing ones.
        if (exports.isMapped(mappedRootObject)) {
            var previousMapping = ko.utils.unwrapObservable(mappedRootObject)[mappingProperty];
            options = merge(previousMapping, options);
        }

        var callbackParams = {
            data: rootObject,
            parent: mappedParent || parent
        };

        var hasCreateCallback = function () {
            return options[parentName] && options[parentName].create instanceof Function;
        };

        var createCallback = function (data) {
            return withProxyDependentObservable(dependentObservables, function () {

                if (ko.utils.unwrapObservable(parent) instanceof Array) {
                    return options[parentName].create({
                        data: data || callbackParams.data,
                        parent: callbackParams.parent,
                        skip: emptyReturn
                    });
                } else {
                    return options[parentName].create({
                        data: data || callbackParams.data,
                        parent: callbackParams.parent
                    });
                }
            });
        };

        var hasUpdateCallback = function () {
            return options[parentName] && options[parentName].update instanceof Function;
        };

        var updateCallback = function (obj, data) {
            var params = {
                data: data || callbackParams.data,
                parent: callbackParams.parent,
                target: ko.utils.unwrapObservable(obj)
            };

            if (ko.isWriteableObservable(obj)) {
                params.observable = obj;
            }

            return options[parentName].update(params);
        };

        var alreadyMapped = visitedObjects.get(rootObject);
        if (alreadyMapped) {
            return alreadyMapped;
        }

        parentName = parentName || "";

        if (!isArray) {
            // For atomic types, do a direct update on the observable
            if (!canHaveProperties(rootObject)) {
                switch (exports.getType(rootObject)) {
                case "function":
                    if (hasUpdateCallback()) {
                        if (ko.isWriteableObservable(rootObject)) {
                            rootObject(updateCallback(rootObject));
                            mappedRootObject = rootObject;
                        } else {
                            mappedRootObject = updateCallback(rootObject);
                        }
                    } else {
                        mappedRootObject = rootObject;
                    }
                    break;
                default:
                    var valueToWrite;
                    if (ko.isWriteableObservable(mappedRootObject)) {
                        if (hasUpdateCallback()) {
                            valueToWrite = updateCallback(mappedRootObject);
                            mappedRootObject(valueToWrite);
                            return valueToWrite;
                        } else {
                            valueToWrite = ko.utils.unwrapObservable(rootObject);
                            mappedRootObject(valueToWrite);
                            return valueToWrite;
                        }
                    } else {
                        var hasCreateOrUpdateCallback = hasCreateCallback() || hasUpdateCallback();

                        if (hasCreateCallback()) {
                            mappedRootObject = createCallback();
                        } else {
                            mappedRootObject = ko.observable(ko.utils.unwrapObservable(rootObject));
                        }

                        if (hasUpdateCallback()) {
                            mappedRootObject(updateCallback(mappedRootObject));
                        }

                        if (hasCreateOrUpdateCallback) return mappedRootObject;
                    }
                }

            } else {
                mappedRootObject = ko.utils.unwrapObservable(mappedRootObject);
                if (!mappedRootObject) {
                    if (hasCreateCallback()) {
                        var result = createCallback();

                        if (hasUpdateCallback()) {
                            result = updateCallback(result);
                        }

                        return result;
                    } else {
                        if (hasUpdateCallback()) {
                            return updateCallback(result);
                        }

                        mappedRootObject = {};
                    }
                }

                if (hasUpdateCallback()) {
                    mappedRootObject = updateCallback(mappedRootObject);
                }

                visitedObjects.save(rootObject, mappedRootObject);
                if (hasUpdateCallback()) return mappedRootObject;

                // For non-atomic types, visit all properties and update recursively
                visitPropertiesOrArrayEntries(rootObject, function (indexer) {
                    var fullPropertyName = parentPropertyName.length ? parentPropertyName + "." + indexer : indexer;

                    if (ko.utils.arrayIndexOf(options.ignore, fullPropertyName) != -1) {
                        return;
                    }

                    if (ko.utils.arrayIndexOf(options.copy, fullPropertyName) != -1) {
                        mappedRootObject[indexer] = rootObject[indexer];
                        return;
                    }

                    if(typeof rootObject[indexer] != "object" && typeof rootObject[indexer] != "array" && options.observe.length > 0 && ko.utils.arrayIndexOf(options.observe, fullPropertyName) == -1)
                    {
                        mappedRootObject[indexer] = rootObject[indexer];
                        options.copiedProperties[fullPropertyName] = true;
                        return;
                    }

                    // In case we are adding an already mapped property, fill it with the previously mapped property value to prevent recursion.
                    // If this is a property that was generated by fromJS, we should use the options specified there
                    var prevMappedProperty = visitedObjects.get(rootObject[indexer]);
                    var retval = updateViewModel(mappedRootObject[indexer], rootObject[indexer], options, indexer, mappedRootObject, fullPropertyName, mappedRootObject);
                    var value = prevMappedProperty || retval;

                    if(options.observe.length > 0 && ko.utils.arrayIndexOf(options.observe, fullPropertyName) == -1)
                    {
                        mappedRootObject[indexer] = ko.utils.unwrapObservable(value);
                        options.copiedProperties[fullPropertyName] = true;
                        return;
                    }

                    if (ko.isWriteableObservable(mappedRootObject[indexer])) {
                        value = ko.utils.unwrapObservable(value);
                        if (mappedRootObject[indexer]() !== value) {
                            mappedRootObject[indexer](value);
                        }
                    } else {
                        value = mappedRootObject[indexer] === undefined ? value : ko.utils.unwrapObservable(value);
                        mappedRootObject[indexer] = value;
                    }

                    options.mappedProperties[fullPropertyName] = true;
                });
            }
        } else { //mappedRootObject is an array
            var changes = [];

            var hasKeyCallback = false;
            var keyCallback = function (x) {
                return x;
            };
            if (options[parentName] && options[parentName].key) {
                keyCallback = options[parentName].key;
                hasKeyCallback = true;
            }

            if (!ko.isObservable(mappedRootObject)) {
                // When creating the new observable array, also add a bunch of utility functions that take the 'key' of the array items into account.
                mappedRootObject = ko.observableArray([]);

                mappedRootObject.mappedRemove = function (valueOrPredicate) {
                    var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) {
                            return value === keyCallback(valueOrPredicate);
                        };
                    return mappedRootObject.remove(function (item) {
                        return predicate(keyCallback(item));
                    });
                };

                mappedRootObject.mappedRemoveAll = function (arrayOfValues) {
                    var arrayOfKeys = filterArrayByKey(arrayOfValues, keyCallback);
                    return mappedRootObject.remove(function (item) {
                        return ko.utils.arrayIndexOf(arrayOfKeys, keyCallback(item)) != -1;
                    });
                };

                mappedRootObject.mappedDestroy = function (valueOrPredicate) {
                    var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) {
                            return value === keyCallback(valueOrPredicate);
                        };
                    return mappedRootObject.destroy(function (item) {
                        return predicate(keyCallback(item));
                    });
                };

                mappedRootObject.mappedDestroyAll = function (arrayOfValues) {
                    var arrayOfKeys = filterArrayByKey(arrayOfValues, keyCallback);
                    return mappedRootObject.destroy(function (item) {
                        return ko.utils.arrayIndexOf(arrayOfKeys, keyCallback(item)) != -1;
                    });
                };

                mappedRootObject.mappedIndexOf = function (item) {
                    var keys = filterArrayByKey(mappedRootObject(), keyCallback);
                    var key = keyCallback(item);
                    return ko.utils.arrayIndexOf(keys, key);
                };

                mappedRootObject.mappedGet = function (item) {
                    return mappedRootObject()[mappedRootObject.mappedIndexOf(item)];
                };

                mappedRootObject.mappedCreate = function (value) {
                    if (mappedRootObject.mappedIndexOf(value) !== -1) {
                        throw new Error("There already is an object with the key that you specified.");
                    }

                    var item = hasCreateCallback() ? createCallback(value) : value;
                    if (hasUpdateCallback()) {
                        var newValue = updateCallback(item, value);
                        if (ko.isWriteableObservable(item)) {
                            item(newValue);
                        } else {
                            item = newValue;
                        }
                    }
                    mappedRootObject.push(item);
                    return item;
                };
            }

            var currentArrayKeys = filterArrayByKey(ko.utils.unwrapObservable(mappedRootObject), keyCallback).sort();
            var newArrayKeys = filterArrayByKey(rootObject, keyCallback);
            if (hasKeyCallback) newArrayKeys.sort();
            var editScript = ko.utils.compareArrays(currentArrayKeys, newArrayKeys);

            var ignoreIndexOf = {};

            var i;
            var j;

            var key;
            var unwrappedRootObject = ko.utils.unwrapObservable(rootObject);
            var itemsByKey = {};
            var optimizedKeys = true;
            for (i = 0, j = unwrappedRootObject.length; i < j; i++) {
                key = keyCallback(unwrappedRootObject[i]);
                if (key === undefined || key instanceof Object) {
                    optimizedKeys = false;
                    break;
                }
                itemsByKey[key] = unwrappedRootObject[i];
            }

            var newContents = [];
            var passedOver = 0;
            for (i = 0, j = editScript.length; i < j; i++) {
                key = editScript[i];
                var mappedItem;
                var fullPropertyName = parentPropertyName + "[" + i + "]";
                var item;
                var index;
                switch (key.status) {
                case "added":
                    item = optimizedKeys ? itemsByKey[key.value] : getItemByKey(ko.utils.unwrapObservable(rootObject), key.value, keyCallback);
                    mappedItem = updateViewModel(undefined, item, options, parentName, mappedRootObject, fullPropertyName, parent);
                    if(!hasCreateCallback()) {
                        mappedItem = ko.utils.unwrapObservable(mappedItem);
                    }

                    index = ignorableIndexOf(ko.utils.unwrapObservable(rootObject), item, ignoreIndexOf);

                    if (mappedItem === emptyReturn) {
                        passedOver++;
                    } else {
                        newContents[index - passedOver] = mappedItem;
                    }

                    ignoreIndexOf[index] = true;
                    break;
                case "retained":
                    item = optimizedKeys ? itemsByKey[key.value] : getItemByKey(ko.utils.unwrapObservable(rootObject), key.value, keyCallback);
                    mappedItem = getItemByKey(mappedRootObject, key.value, keyCallback);
                    updateViewModel(mappedItem, item, options, parentName, mappedRootObject, fullPropertyName, parent);

                    index = ignorableIndexOf(ko.utils.unwrapObservable(rootObject), item, ignoreIndexOf);
                    newContents[index] = mappedItem;
                    ignoreIndexOf[index] = true;
                    break;
                case "deleted":
                    mappedItem = getItemByKey(mappedRootObject, key.value, keyCallback);
                    break;
                }

                changes.push({
                    event: key.status,
                    item: mappedItem
                });
            }

            mappedRootObject(newContents);

            if (options[parentName] && options[parentName].arrayChanged) {
                ko.utils.arrayForEach(changes, function (change) {
                    options[parentName].arrayChanged(change.event, change.item);
                });
            }
        }

        return mappedRootObject;
    }

    function ignorableIndexOf(array, item, ignoreIndices) {
        for (var i = 0, j = array.length; i < j; i++) {
            if (ignoreIndices[i] === true) continue;
            if (array[i] === item) return i;
        }
        return null;
    }

    function mapKey(item, callback) {
        var mappedItem;
        if (callback) mappedItem = callback(item);
        if (exports.getType(mappedItem) === "undefined") mappedItem = item;

        return ko.utils.unwrapObservable(mappedItem);
    }

    function getItemByKey(array, key, callback) {
        array = ko.utils.unwrapObservable(array);
        for (var i = 0, j = array.length; i < j; i++) {
            var item = array[i];
            if (mapKey(item, callback) === key) return item;
        }

        throw new Error("When calling ko.update*, the key '" + key + "' was not found!");
    }

    function filterArrayByKey(array, callback) {
        return ko.utils.arrayMap(ko.utils.unwrapObservable(array), function (item) {
            if (callback) {
                return mapKey(item, callback);
            } else {
                return item;
            }
        });
    }

    function visitPropertiesOrArrayEntries(rootObject, visitorCallback) {
        if (exports.getType(rootObject) === "array") {
            for (var i = 0; i < rootObject.length; i++)
            visitorCallback(i);
        } else {
            for (var propertyName in rootObject)
            visitorCallback(propertyName);
        }
    }

    function canHaveProperties(object) {
        var type = exports.getType(object);
        return ((type === "object") || (type === "array")) && (object !== null);
    }

    // Based on the parentName, this creates a fully classified name of a property

    function getPropertyName(parentName, parent, indexer) {
        var propertyName = parentName || "";
        if (exports.getType(parent) === "array") {
            if (parentName) {
                propertyName += "[" + indexer + "]";
            }
        } else {
            if (parentName) {
                propertyName += ".";
            }
            propertyName += indexer;
        }
        return propertyName;
    }

    exports.visitModel = function (rootObject, callback, options) {
        options = options || {};
        options.visitedObjects = options.visitedObjects || new objectLookup();

        var mappedRootObject;
        var unwrappedRootObject = ko.utils.unwrapObservable(rootObject);

        if (!canHaveProperties(unwrappedRootObject)) {
            return callback(rootObject, options.parentName);
        } else {
            options = fillOptions(options, unwrappedRootObject[mappingProperty]);

            // Only do a callback, but ignore the results
            callback(rootObject, options.parentName);
            mappedRootObject = exports.getType(unwrappedRootObject) === "array" ? [] : {};
        }

        options.visitedObjects.save(rootObject, mappedRootObject);

        var parentName = options.parentName;
        visitPropertiesOrArrayEntries(unwrappedRootObject, function (indexer) {
            if (options.ignore && ko.utils.arrayIndexOf(options.ignore, indexer) != -1) return;

            var propertyValue = unwrappedRootObject[indexer];
            options.parentName = getPropertyName(parentName, unwrappedRootObject, indexer);

            // If we don't want to explicitly copy the unmapped property...
            if (ko.utils.arrayIndexOf(options.copy, indexer) === -1) {
                // ...find out if it's a property we want to explicitly include
                if (ko.utils.arrayIndexOf(options.include, indexer) === -1) {
                    // The mapped properties object contains all the properties that were part of the original object.
                    // If a property does not exist, and it is not because it is part of an array (e.g. "myProp[3]"), then it should not be unmapped.
                    if (unwrappedRootObject[mappingProperty] &&
                        unwrappedRootObject[mappingProperty].mappedProperties &&
                        !unwrappedRootObject[mappingProperty].mappedProperties[indexer] &&
                        unwrappedRootObject[mappingProperty].copiedProperties &&
                        !unwrappedRootObject[mappingProperty].copiedProperties[indexer] &&
                        exports.getType(unwrappedRootObject) !== "array")
                    {
                        return;
                    }
                }
            }

            var outputProperty;
            switch (exports.getType(ko.utils.unwrapObservable(propertyValue))) {
            case "object":
            case "array":
            case "undefined":
                var previouslyMappedValue = options.visitedObjects.get(propertyValue);
                mappedRootObject[indexer] = (exports.getType(previouslyMappedValue) !== "undefined") ? previouslyMappedValue : exports.visitModel(propertyValue, callback, options);
                break;
            default:
                mappedRootObject[indexer] = callback(propertyValue, options.parentName);
            }
        });

        return mappedRootObject;
    };

    function simpleObjectLookup() {
        var keys = [];
        var values = [];
        this.save = function (key, value) {
            var existingIndex = ko.utils.arrayIndexOf(keys, key);
            if (existingIndex >= 0) values[existingIndex] = value;
            else {
                keys.push(key);
                values.push(value);
            }
        };
        this.get = function (key) {
            var existingIndex = ko.utils.arrayIndexOf(keys, key);
            var value = (existingIndex >= 0) ? values[existingIndex] : undefined;
            return value;
        };
    }

    function objectLookup() {
        var buckets = {};

        var findBucket = function(key) {
            var bucketKey;
            try {
                bucketKey = key;//JSON.stringify(key);
            }
            catch (e) {
                bucketKey = "$$$";
            }

            var bucket = buckets[bucketKey];
            if (bucket === undefined) {
                bucket = new simpleObjectLookup();
                buckets[bucketKey] = bucket;
            }
            return bucket;
        };

        this.save = function (key, value) {
            findBucket(key).save(key, value);
        };
        this.get = function (key) {
            return findBucket(key).get(key);
        };
    }
}));

},{"knockout":111}],111:[function(require,module,exports){
/*!
 * Knockout JavaScript library v3.3.0
 * (c) Steven Sanderson - http://knockoutjs.com/
 * License: MIT (http://www.opensource.org/licenses/mit-license.php)
 */

(function(){
var DEBUG=true;
(function(undefined){
    // (0, eval)('this') is a robust way of getting a reference to the global object
    // For details, see http://stackoverflow.com/questions/14119988/return-this-0-evalthis/14120023#14120023
    var window = this || (0, eval)('this'),
        document = window['document'],
        navigator = window['navigator'],
        jQueryInstance = window["jQuery"],
        JSON = window["JSON"];
(function(factory) {
    // Support three module loading scenarios
    if (typeof define === 'function' && define['amd']) {
        // [1] AMD anonymous module
        define(['exports', 'require'], factory);
    } else if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
        // [2] CommonJS/Node.js
        factory(module['exports'] || exports);  // module.exports is for Node.js
    } else {
        // [3] No module loader (plain <script> tag) - put directly in global namespace
        factory(window['ko'] = {});
    }
}(function(koExports, amdRequire){
// Internally, all KO objects are attached to koExports (even the non-exported ones whose names will be minified by the closure compiler).
// In the future, the following "ko" variable may be made distinct from "koExports" so that private objects are not externally reachable.
var ko = typeof koExports !== 'undefined' ? koExports : {};
// Google Closure Compiler helpers (used only to make the minified file smaller)
ko.exportSymbol = function(koPath, object) {
    var tokens = koPath.split(".");

    // In the future, "ko" may become distinct from "koExports" (so that non-exported objects are not reachable)
    // At that point, "target" would be set to: (typeof koExports !== "undefined" ? koExports : ko)
    var target = ko;

    for (var i = 0; i < tokens.length - 1; i++)
        target = target[tokens[i]];
    target[tokens[tokens.length - 1]] = object;
};
ko.exportProperty = function(owner, publicName, object) {
    owner[publicName] = object;
};
ko.version = "3.3.0";

ko.exportSymbol('version', ko.version);
ko.utils = (function () {
    function objectForEach(obj, action) {
        for (var prop in obj) {
            if (obj.hasOwnProperty(prop)) {
                action(prop, obj[prop]);
            }
        }
    }

    function extend(target, source) {
        if (source) {
            for(var prop in source) {
                if(source.hasOwnProperty(prop)) {
                    target[prop] = source[prop];
                }
            }
        }
        return target;
    }

    function setPrototypeOf(obj, proto) {
        obj.__proto__ = proto;
        return obj;
    }

    var canSetPrototype = ({ __proto__: [] } instanceof Array);

    // Represent the known event types in a compact way, then at runtime transform it into a hash with event name as key (for fast lookup)
    var knownEvents = {}, knownEventTypesByEventName = {};
    var keyEventTypeName = (navigator && /Firefox\/2/i.test(navigator.userAgent)) ? 'KeyboardEvent' : 'UIEvents';
    knownEvents[keyEventTypeName] = ['keyup', 'keydown', 'keypress'];
    knownEvents['MouseEvents'] = ['click', 'dblclick', 'mousedown', 'mouseup', 'mousemove', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave'];
    objectForEach(knownEvents, function(eventType, knownEventsForType) {
        if (knownEventsForType.length) {
            for (var i = 0, j = knownEventsForType.length; i < j; i++)
                knownEventTypesByEventName[knownEventsForType[i]] = eventType;
        }
    });
    var eventsThatMustBeRegisteredUsingAttachEvent = { 'propertychange': true }; // Workaround for an IE9 issue - https://github.com/SteveSanderson/knockout/issues/406

    // Detect IE versions for bug workarounds (uses IE conditionals, not UA string, for robustness)
    // Note that, since IE 10 does not support conditional comments, the following logic only detects IE < 10.
    // Currently this is by design, since IE 10+ behaves correctly when treated as a standard browser.
    // If there is a future need to detect specific versions of IE10+, we will amend this.
    var ieVersion = document && (function() {
        var version = 3, div = document.createElement('div'), iElems = div.getElementsByTagName('i');

        // Keep constructing conditional HTML blocks until we hit one that resolves to an empty fragment
        while (
            div.innerHTML = '<!--[if gt IE ' + (++version) + ']><i></i><![endif]-->',
            iElems[0]
        ) {}
        return version > 4 ? version : undefined;
    }());
    var isIe6 = ieVersion === 6,
        isIe7 = ieVersion === 7;

    function isClickOnCheckableElement(element, eventType) {
        if ((ko.utils.tagNameLower(element) !== "input") || !element.type) return false;
        if (eventType.toLowerCase() != "click") return false;
        var inputType = element.type;
        return (inputType == "checkbox") || (inputType == "radio");
    }

    // For details on the pattern for changing node classes
    // see: https://github.com/knockout/knockout/issues/1597
    var cssClassNameRegex = /\S+/g;

    function toggleDomNodeCssClass(node, classNames, shouldHaveClass) {
        var addOrRemoveFn;
        if (classNames) {
            if (typeof node.classList === 'object') {
                addOrRemoveFn = node.classList[shouldHaveClass ? 'add' : 'remove'];
                ko.utils.arrayForEach(classNames.match(cssClassNameRegex), function(className) {
                    addOrRemoveFn.call(node.classList, className);
                });
            } else if (typeof node.className['baseVal'] === 'string') {
                // SVG tag .classNames is an SVGAnimatedString instance
                toggleObjectClassPropertyString(node.className, 'baseVal', classNames, shouldHaveClass);
            } else {
                // node.className ought to be a string.
                toggleObjectClassPropertyString(node, 'className', classNames, shouldHaveClass);
            }
        }
    }

    function toggleObjectClassPropertyString(obj, prop, classNames, shouldHaveClass) {
        // obj/prop is either a node/'className' or a SVGAnimatedString/'baseVal'.
        var currentClassNames = obj[prop].match(cssClassNameRegex) || [];
        ko.utils.arrayForEach(classNames.match(cssClassNameRegex), function(className) {
            ko.utils.addOrRemoveItem(currentClassNames, className, shouldHaveClass);
        });
        obj[prop] = currentClassNames.join(" ");
    }

    return {
        fieldsIncludedWithJsonPost: ['authenticity_token', /^__RequestVerificationToken(_.*)?$/],

        arrayForEach: function (array, action) {
            for (var i = 0, j = array.length; i < j; i++)
                action(array[i], i);
        },

        arrayIndexOf: function (array, item) {
            if (typeof Array.prototype.indexOf == "function")
                return Array.prototype.indexOf.call(array, item);
            for (var i = 0, j = array.length; i < j; i++)
                if (array[i] === item)
                    return i;
            return -1;
        },

        arrayFirst: function (array, predicate, predicateOwner) {
            for (var i = 0, j = array.length; i < j; i++)
                if (predicate.call(predicateOwner, array[i], i))
                    return array[i];
            return null;
        },

        arrayRemoveItem: function (array, itemToRemove) {
            var index = ko.utils.arrayIndexOf(array, itemToRemove);
            if (index > 0) {
                array.splice(index, 1);
            }
            else if (index === 0) {
                array.shift();
            }
        },

        arrayGetDistinctValues: function (array) {
            array = array || [];
            var result = [];
            for (var i = 0, j = array.length; i < j; i++) {
                if (ko.utils.arrayIndexOf(result, array[i]) < 0)
                    result.push(array[i]);
            }
            return result;
        },

        arrayMap: function (array, mapping) {
            array = array || [];
            var result = [];
            for (var i = 0, j = array.length; i < j; i++)
                result.push(mapping(array[i], i));
            return result;
        },

        arrayFilter: function (array, predicate) {
            array = array || [];
            var result = [];
            for (var i = 0, j = array.length; i < j; i++)
                if (predicate(array[i], i))
                    result.push(array[i]);
            return result;
        },

        arrayPushAll: function (array, valuesToPush) {
            if (valuesToPush instanceof Array)
                array.push.apply(array, valuesToPush);
            else
                for (var i = 0, j = valuesToPush.length; i < j; i++)
                    array.push(valuesToPush[i]);
            return array;
        },

        addOrRemoveItem: function(array, value, included) {
            var existingEntryIndex = ko.utils.arrayIndexOf(ko.utils.peekObservable(array), value);
            if (existingEntryIndex < 0) {
                if (included)
                    array.push(value);
            } else {
                if (!included)
                    array.splice(existingEntryIndex, 1);
            }
        },

        canSetPrototype: canSetPrototype,

        extend: extend,

        setPrototypeOf: setPrototypeOf,

        setPrototypeOfOrExtend: canSetPrototype ? setPrototypeOf : extend,

        objectForEach: objectForEach,

        objectMap: function(source, mapping) {
            if (!source)
                return source;
            var target = {};
            for (var prop in source) {
                if (source.hasOwnProperty(prop)) {
                    target[prop] = mapping(source[prop], prop, source);
                }
            }
            return target;
        },

        emptyDomNode: function (domNode) {
            while (domNode.firstChild) {
                ko.removeNode(domNode.firstChild);
            }
        },

        moveCleanedNodesToContainerElement: function(nodes) {
            // Ensure it's a real array, as we're about to reparent the nodes and
            // we don't want the underlying collection to change while we're doing that.
            var nodesArray = ko.utils.makeArray(nodes);
            var templateDocument = (nodesArray[0] && nodesArray[0].ownerDocument) || document;

            var container = templateDocument.createElement('div');
            for (var i = 0, j = nodesArray.length; i < j; i++) {
                container.appendChild(ko.cleanNode(nodesArray[i]));
            }
            return container;
        },

        cloneNodes: function (nodesArray, shouldCleanNodes) {
            for (var i = 0, j = nodesArray.length, newNodesArray = []; i < j; i++) {
                var clonedNode = nodesArray[i].cloneNode(true);
                newNodesArray.push(shouldCleanNodes ? ko.cleanNode(clonedNode) : clonedNode);
            }
            return newNodesArray;
        },

        setDomNodeChildren: function (domNode, childNodes) {
            ko.utils.emptyDomNode(domNode);
            if (childNodes) {
                for (var i = 0, j = childNodes.length; i < j; i++)
                    domNode.appendChild(childNodes[i]);
            }
        },

        replaceDomNodes: function (nodeToReplaceOrNodeArray, newNodesArray) {
            var nodesToReplaceArray = nodeToReplaceOrNodeArray.nodeType ? [nodeToReplaceOrNodeArray] : nodeToReplaceOrNodeArray;
            if (nodesToReplaceArray.length > 0) {
                var insertionPoint = nodesToReplaceArray[0];
                var parent = insertionPoint.parentNode;
                for (var i = 0, j = newNodesArray.length; i < j; i++)
                    parent.insertBefore(newNodesArray[i], insertionPoint);
                for (var i = 0, j = nodesToReplaceArray.length; i < j; i++) {
                    ko.removeNode(nodesToReplaceArray[i]);
                }
            }
        },

        fixUpContinuousNodeArray: function(continuousNodeArray, parentNode) {
            // Before acting on a set of nodes that were previously outputted by a template function, we have to reconcile
            // them against what is in the DOM right now. It may be that some of the nodes have already been removed, or that
            // new nodes might have been inserted in the middle, for example by a binding. Also, there may previously have been
            // leading comment nodes (created by rewritten string-based templates) that have since been removed during binding.
            // So, this function translates the old "map" output array into its best guess of the set of current DOM nodes.
            //
            // Rules:
            //   [A] Any leading nodes that have been removed should be ignored
            //       These most likely correspond to memoization nodes that were already removed during binding
            //       See https://github.com/SteveSanderson/knockout/pull/440
            //   [B] We want to output a continuous series of nodes. So, ignore any nodes that have already been removed,
            //       and include any nodes that have been inserted among the previous collection

            if (continuousNodeArray.length) {
                // The parent node can be a virtual element; so get the real parent node
                parentNode = (parentNode.nodeType === 8 && parentNode.parentNode) || parentNode;

                // Rule [A]
                while (continuousNodeArray.length && continuousNodeArray[0].parentNode !== parentNode)
                    continuousNodeArray.splice(0, 1);

                // Rule [B]
                if (continuousNodeArray.length > 1) {
                    var current = continuousNodeArray[0], last = continuousNodeArray[continuousNodeArray.length - 1];
                    // Replace with the actual new continuous node set
                    continuousNodeArray.length = 0;
                    while (current !== last) {
                        continuousNodeArray.push(current);
                        current = current.nextSibling;
                        if (!current) // Won't happen, except if the developer has manually removed some DOM elements (then we're in an undefined scenario)
                            return;
                    }
                    continuousNodeArray.push(last);
                }
            }
            return continuousNodeArray;
        },

        setOptionNodeSelectionState: function (optionNode, isSelected) {
            // IE6 sometimes throws "unknown error" if you try to write to .selected directly, whereas Firefox struggles with setAttribute. Pick one based on browser.
            if (ieVersion < 7)
                optionNode.setAttribute("selected", isSelected);
            else
                optionNode.selected = isSelected;
        },

        stringTrim: function (string) {
            return string === null || string === undefined ? '' :
                string.trim ?
                    string.trim() :
                    string.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
        },

        stringStartsWith: function (string, startsWith) {
            string = string || "";
            if (startsWith.length > string.length)
                return false;
            return string.substring(0, startsWith.length) === startsWith;
        },

        domNodeIsContainedBy: function (node, containedByNode) {
            if (node === containedByNode)
                return true;
            if (node.nodeType === 11)
                return false; // Fixes issue #1162 - can't use node.contains for document fragments on IE8
            if (containedByNode.contains)
                return containedByNode.contains(node.nodeType === 3 ? node.parentNode : node);
            if (containedByNode.compareDocumentPosition)
                return (containedByNode.compareDocumentPosition(node) & 16) == 16;
            while (node && node != containedByNode) {
                node = node.parentNode;
            }
            return !!node;
        },

        domNodeIsAttachedToDocument: function (node) {
            return ko.utils.domNodeIsContainedBy(node, node.ownerDocument.documentElement);
        },

        anyDomNodeIsAttachedToDocument: function(nodes) {
            return !!ko.utils.arrayFirst(nodes, ko.utils.domNodeIsAttachedToDocument);
        },

        tagNameLower: function(element) {
            // For HTML elements, tagName will always be upper case; for XHTML elements, it'll be lower case.
            // Possible future optimization: If we know it's an element from an XHTML document (not HTML),
            // we don't need to do the .toLowerCase() as it will always be lower case anyway.
            return element && element.tagName && element.tagName.toLowerCase();
        },

        registerEventHandler: function (element, eventType, handler) {
            var mustUseAttachEvent = ieVersion && eventsThatMustBeRegisteredUsingAttachEvent[eventType];
            if (!mustUseAttachEvent && jQueryInstance) {
                jQueryInstance(element)['bind'](eventType, handler);
            } else if (!mustUseAttachEvent && typeof element.addEventListener == "function")
                element.addEventListener(eventType, handler, false);
            else if (typeof element.attachEvent != "undefined") {
                var attachEventHandler = function (event) { handler.call(element, event); },
                    attachEventName = "on" + eventType;
                element.attachEvent(attachEventName, attachEventHandler);

                // IE does not dispose attachEvent handlers automatically (unlike with addEventListener)
                // so to avoid leaks, we have to remove them manually. See bug #856
                ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
                    element.detachEvent(attachEventName, attachEventHandler);
                });
            } else
                throw new Error("Browser doesn't support addEventListener or attachEvent");
        },

        triggerEvent: function (element, eventType) {
            if (!(element && element.nodeType))
                throw new Error("element must be a DOM node when calling triggerEvent");

            // For click events on checkboxes and radio buttons, jQuery toggles the element checked state *after* the
            // event handler runs instead of *before*. (This was fixed in 1.9 for checkboxes but not for radio buttons.)
            // IE doesn't change the checked state when you trigger the click event using "fireEvent".
            // In both cases, we'll use the click method instead.
            var useClickWorkaround = isClickOnCheckableElement(element, eventType);

            if (jQueryInstance && !useClickWorkaround) {
                jQueryInstance(element)['trigger'](eventType);
            } else if (typeof document.createEvent == "function") {
                if (typeof element.dispatchEvent == "function") {
                    var eventCategory = knownEventTypesByEventName[eventType] || "HTMLEvents";
                    var event = document.createEvent(eventCategory);
                    event.initEvent(eventType, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, element);
                    element.dispatchEvent(event);
                }
                else
                    throw new Error("The supplied element doesn't support dispatchEvent");
            } else if (useClickWorkaround && element.click) {
                element.click();
            } else if (typeof element.fireEvent != "undefined") {
                element.fireEvent("on" + eventType);
            } else {
                throw new Error("Browser doesn't support triggering events");
            }
        },

        unwrapObservable: function (value) {
            return ko.isObservable(value) ? value() : value;
        },

        peekObservable: function (value) {
            return ko.isObservable(value) ? value.peek() : value;
        },

        toggleDomNodeCssClass: toggleDomNodeCssClass,

        setTextContent: function(element, textContent) {
            var value = ko.utils.unwrapObservable(textContent);
            if ((value === null) || (value === undefined))
                value = "";

            // We need there to be exactly one child: a text node.
            // If there are no children, more than one, or if it's not a text node,
            // we'll clear everything and create a single text node.
            var innerTextNode = ko.virtualElements.firstChild(element);
            if (!innerTextNode || innerTextNode.nodeType != 3 || ko.virtualElements.nextSibling(innerTextNode)) {
                ko.virtualElements.setDomNodeChildren(element, [element.ownerDocument.createTextNode(value)]);
            } else {
                innerTextNode.data = value;
            }

            ko.utils.forceRefresh(element);
        },

        setElementName: function(element, name) {
            element.name = name;

            // Workaround IE 6/7 issue
            // - https://github.com/SteveSanderson/knockout/issues/197
            // - http://www.matts411.com/post/setting_the_name_attribute_in_ie_dom/
            if (ieVersion <= 7) {
                try {
                    element.mergeAttributes(document.createElement("<input name='" + element.name + "'/>"), false);
                }
                catch(e) {} // For IE9 with doc mode "IE9 Standards" and browser mode "IE9 Compatibility View"
            }
        },

        forceRefresh: function(node) {
            // Workaround for an IE9 rendering bug - https://github.com/SteveSanderson/knockout/issues/209
            if (ieVersion >= 9) {
                // For text nodes and comment nodes (most likely virtual elements), we will have to refresh the container
                var elem = node.nodeType == 1 ? node : node.parentNode;
                if (elem.style)
                    elem.style.zoom = elem.style.zoom;
            }
        },

        ensureSelectElementIsRenderedCorrectly: function(selectElement) {
            // Workaround for IE9 rendering bug - it doesn't reliably display all the text in dynamically-added select boxes unless you force it to re-render by updating the width.
            // (See https://github.com/SteveSanderson/knockout/issues/312, http://stackoverflow.com/questions/5908494/select-only-shows-first-char-of-selected-option)
            // Also fixes IE7 and IE8 bug that causes selects to be zero width if enclosed by 'if' or 'with'. (See issue #839)
            if (ieVersion) {
                var originalWidth = selectElement.style.width;
                selectElement.style.width = 0;
                selectElement.style.width = originalWidth;
            }
        },

        range: function (min, max) {
            min = ko.utils.unwrapObservable(min);
            max = ko.utils.unwrapObservable(max);
            var result = [];
            for (var i = min; i <= max; i++)
                result.push(i);
            return result;
        },

        makeArray: function(arrayLikeObject) {
            var result = [];
            for (var i = 0, j = arrayLikeObject.length; i < j; i++) {
                result.push(arrayLikeObject[i]);
            };
            return result;
        },

        isIe6 : isIe6,
        isIe7 : isIe7,
        ieVersion : ieVersion,

        getFormFields: function(form, fieldName) {
            var fields = ko.utils.makeArray(form.getElementsByTagName("input")).concat(ko.utils.makeArray(form.getElementsByTagName("textarea")));
            var isMatchingField = (typeof fieldName == 'string')
                ? function(field) { return field.name === fieldName }
                : function(field) { return fieldName.test(field.name) }; // Treat fieldName as regex or object containing predicate
            var matches = [];
            for (var i = fields.length - 1; i >= 0; i--) {
                if (isMatchingField(fields[i]))
                    matches.push(fields[i]);
            };
            return matches;
        },

        parseJson: function (jsonString) {
            if (typeof jsonString == "string") {
                jsonString = ko.utils.stringTrim(jsonString);
                if (jsonString) {
                    if (JSON && JSON.parse) // Use native parsing where available
                        return JSON.parse(jsonString);
                    return (new Function("return " + jsonString))(); // Fallback on less safe parsing for older browsers
                }
            }
            return null;
        },

        stringifyJson: function (data, replacer, space) {   // replacer and space are optional
            if (!JSON || !JSON.stringify)
                throw new Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
            return JSON.stringify(ko.utils.unwrapObservable(data), replacer, space);
        },

        postJson: function (urlOrForm, data, options) {
            options = options || {};
            var params = options['params'] || {};
            var includeFields = options['includeFields'] || this.fieldsIncludedWithJsonPost;
            var url = urlOrForm;

            // If we were given a form, use its 'action' URL and pick out any requested field values
            if((typeof urlOrForm == 'object') && (ko.utils.tagNameLower(urlOrForm) === "form")) {
                var originalForm = urlOrForm;
                url = originalForm.action;
                for (var i = includeFields.length - 1; i >= 0; i--) {
                    var fields = ko.utils.getFormFields(originalForm, includeFields[i]);
                    for (var j = fields.length - 1; j >= 0; j--)
                        params[fields[j].name] = fields[j].value;
                }
            }

            data = ko.utils.unwrapObservable(data);
            var form = document.createElement("form");
            form.style.display = "none";
            form.action = url;
            form.method = "post";
            for (var key in data) {
                // Since 'data' this is a model object, we include all properties including those inherited from its prototype
                var input = document.createElement("input");
                input.type = "hidden";
                input.name = key;
                input.value = ko.utils.stringifyJson(ko.utils.unwrapObservable(data[key]));
                form.appendChild(input);
            }
            objectForEach(params, function(key, value) {
                var input = document.createElement("input");
                input.type = "hidden";
                input.name = key;
                input.value = value;
                form.appendChild(input);
            });
            document.body.appendChild(form);
            options['submitter'] ? options['submitter'](form) : form.submit();
            setTimeout(function () { form.parentNode.removeChild(form); }, 0);
        }
    }
}());

ko.exportSymbol('utils', ko.utils);
ko.exportSymbol('utils.arrayForEach', ko.utils.arrayForEach);
ko.exportSymbol('utils.arrayFirst', ko.utils.arrayFirst);
ko.exportSymbol('utils.arrayFilter', ko.utils.arrayFilter);
ko.exportSymbol('utils.arrayGetDistinctValues', ko.utils.arrayGetDistinctValues);
ko.exportSymbol('utils.arrayIndexOf', ko.utils.arrayIndexOf);
ko.exportSymbol('utils.arrayMap', ko.utils.arrayMap);
ko.exportSymbol('utils.arrayPushAll', ko.utils.arrayPushAll);
ko.exportSymbol('utils.arrayRemoveItem', ko.utils.arrayRemoveItem);
ko.exportSymbol('utils.extend', ko.utils.extend);
ko.exportSymbol('utils.fieldsIncludedWithJsonPost', ko.utils.fieldsIncludedWithJsonPost);
ko.exportSymbol('utils.getFormFields', ko.utils.getFormFields);
ko.exportSymbol('utils.peekObservable', ko.utils.peekObservable);
ko.exportSymbol('utils.postJson', ko.utils.postJson);
ko.exportSymbol('utils.parseJson', ko.utils.parseJson);
ko.exportSymbol('utils.registerEventHandler', ko.utils.registerEventHandler);
ko.exportSymbol('utils.stringifyJson', ko.utils.stringifyJson);
ko.exportSymbol('utils.range', ko.utils.range);
ko.exportSymbol('utils.toggleDomNodeCssClass', ko.utils.toggleDomNodeCssClass);
ko.exportSymbol('utils.triggerEvent', ko.utils.triggerEvent);
ko.exportSymbol('utils.unwrapObservable', ko.utils.unwrapObservable);
ko.exportSymbol('utils.objectForEach', ko.utils.objectForEach);
ko.exportSymbol('utils.addOrRemoveItem', ko.utils.addOrRemoveItem);
ko.exportSymbol('utils.setTextContent', ko.utils.setTextContent);
ko.exportSymbol('unwrap', ko.utils.unwrapObservable); // Convenient shorthand, because this is used so commonly

if (!Function.prototype['bind']) {
    // Function.prototype.bind is a standard part of ECMAScript 5th Edition (December 2009, http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf)
    // In case the browser doesn't implement it natively, provide a JavaScript implementation. This implementation is based on the one in prototype.js
    Function.prototype['bind'] = function (object) {
        var originalFunction = this;
        if (arguments.length === 1) {
            return function () {
                return originalFunction.apply(object, arguments);
            };
        } else {
            var partialArgs = Array.prototype.slice.call(arguments, 1);
            return function () {
                var args = partialArgs.slice(0);
                args.push.apply(args, arguments);
                return originalFunction.apply(object, args);
            };
        }
    };
}

ko.utils.domData = new (function () {
    var uniqueId = 0;
    var dataStoreKeyExpandoPropertyName = "__ko__" + (new Date).getTime();
    var dataStore = {};

    function getAll(node, createIfNotFound) {
        var dataStoreKey = node[dataStoreKeyExpandoPropertyName];
        var hasExistingDataStore = dataStoreKey && (dataStoreKey !== "null") && dataStore[dataStoreKey];
        if (!hasExistingDataStore) {
            if (!createIfNotFound)
                return undefined;
            dataStoreKey = node[dataStoreKeyExpandoPropertyName] = "ko" + uniqueId++;
            dataStore[dataStoreKey] = {};
        }
        return dataStore[dataStoreKey];
    }

    return {
        get: function (node, key) {
            var allDataForNode = getAll(node, false);
            return allDataForNode === undefined ? undefined : allDataForNode[key];
        },
        set: function (node, key, value) {
            if (value === undefined) {
                // Make sure we don't actually create a new domData key if we are actually deleting a value
                if (getAll(node, false) === undefined)
                    return;
            }
            var allDataForNode = getAll(node, true);
            allDataForNode[key] = value;
        },
        clear: function (node) {
            var dataStoreKey = node[dataStoreKeyExpandoPropertyName];
            if (dataStoreKey) {
                delete dataStore[dataStoreKey];
                node[dataStoreKeyExpandoPropertyName] = null;
                return true; // Exposing "did clean" flag purely so specs can infer whether things have been cleaned up as intended
            }
            return false;
        },

        nextKey: function () {
            return (uniqueId++) + dataStoreKeyExpandoPropertyName;
        }
    };
})();

ko.exportSymbol('utils.domData', ko.utils.domData);
ko.exportSymbol('utils.domData.clear', ko.utils.domData.clear); // Exporting only so specs can clear up after themselves fully

ko.utils.domNodeDisposal = new (function () {
    var domDataKey = ko.utils.domData.nextKey();
    var cleanableNodeTypes = { 1: true, 8: true, 9: true };       // Element, Comment, Document
    var cleanableNodeTypesWithDescendants = { 1: true, 9: true }; // Element, Document

    function getDisposeCallbacksCollection(node, createIfNotFound) {
        var allDisposeCallbacks = ko.utils.domData.get(node, domDataKey);
        if ((allDisposeCallbacks === undefined) && createIfNotFound) {
            allDisposeCallbacks = [];
            ko.utils.domData.set(node, domDataKey, allDisposeCallbacks);
        }
        return allDisposeCallbacks;
    }
    function destroyCallbacksCollection(node) {
        ko.utils.domData.set(node, domDataKey, undefined);
    }

    function cleanSingleNode(node) {
        // Run all the dispose callbacks
        var callbacks = getDisposeCallbacksCollection(node, false);
        if (callbacks) {
            callbacks = callbacks.slice(0); // Clone, as the array may be modified during iteration (typically, callbacks will remove themselves)
            for (var i = 0; i < callbacks.length; i++)
                callbacks[i](node);
        }

        // Erase the DOM data
        ko.utils.domData.clear(node);

        // Perform cleanup needed by external libraries (currently only jQuery, but can be extended)
        ko.utils.domNodeDisposal["cleanExternalData"](node);

        // Clear any immediate-child comment nodes, as these wouldn't have been found by
        // node.getElementsByTagName("*") in cleanNode() (comment nodes aren't elements)
        if (cleanableNodeTypesWithDescendants[node.nodeType])
            cleanImmediateCommentTypeChildren(node);
    }

    function cleanImmediateCommentTypeChildren(nodeWithChildren) {
        var child, nextChild = nodeWithChildren.firstChild;
        while (child = nextChild) {
            nextChild = child.nextSibling;
            if (child.nodeType === 8)
                cleanSingleNode(child);
        }
    }

    return {
        addDisposeCallback : function(node, callback) {
            if (typeof callback != "function")
                throw new Error("Callback must be a function");
            getDisposeCallbacksCollection(node, true).push(callback);
        },

        removeDisposeCallback : function(node, callback) {
            var callbacksCollection = getDisposeCallbacksCollection(node, false);
            if (callbacksCollection) {
                ko.utils.arrayRemoveItem(callbacksCollection, callback);
                if (callbacksCollection.length == 0)
                    destroyCallbacksCollection(node);
            }
        },

        cleanNode : function(node) {
            // First clean this node, where applicable
            if (cleanableNodeTypes[node.nodeType]) {
                cleanSingleNode(node);

                // ... then its descendants, where applicable
                if (cleanableNodeTypesWithDescendants[node.nodeType]) {
                    // Clone the descendants list in case it changes during iteration
                    var descendants = [];
                    ko.utils.arrayPushAll(descendants, node.getElementsByTagName("*"));
                    for (var i = 0, j = descendants.length; i < j; i++)
                        cleanSingleNode(descendants[i]);
                }
            }
            return node;
        },

        removeNode : function(node) {
            ko.cleanNode(node);
            if (node.parentNode)
                node.parentNode.removeChild(node);
        },

        "cleanExternalData" : function (node) {
            // Special support for jQuery here because it's so commonly used.
            // Many jQuery plugins (including jquery.tmpl) store data using jQuery's equivalent of domData
            // so notify it to tear down any resources associated with the node & descendants here.
            if (jQueryInstance && (typeof jQueryInstance['cleanData'] == "function"))
                jQueryInstance['cleanData']([node]);
        }
    };
})();
ko.cleanNode = ko.utils.domNodeDisposal.cleanNode; // Shorthand name for convenience
ko.removeNode = ko.utils.domNodeDisposal.removeNode; // Shorthand name for convenience
ko.exportSymbol('cleanNode', ko.cleanNode);
ko.exportSymbol('removeNode', ko.removeNode);
ko.exportSymbol('utils.domNodeDisposal', ko.utils.domNodeDisposal);
ko.exportSymbol('utils.domNodeDisposal.addDisposeCallback', ko.utils.domNodeDisposal.addDisposeCallback);
ko.exportSymbol('utils.domNodeDisposal.removeDisposeCallback', ko.utils.domNodeDisposal.removeDisposeCallback);
(function () {
    var leadingCommentRegex = /^(\s*)<!--(.*?)-->/;

    function simpleHtmlParse(html, documentContext) {
        documentContext || (documentContext = document);
        var windowContext = documentContext['parentWindow'] || documentContext['defaultView'] || window;

        // Based on jQuery's "clean" function, but only accounting for table-related elements.
        // If you have referenced jQuery, this won't be used anyway - KO will use jQuery's "clean" function directly

        // Note that there's still an issue in IE < 9 whereby it will discard comment nodes that are the first child of
        // a descendant node. For example: "<div><!-- mycomment -->abc</div>" will get parsed as "<div>abc</div>"
        // This won't affect anyone who has referenced jQuery, and there's always the workaround of inserting a dummy node
        // (possibly a text node) in front of the comment. So, KO does not attempt to workaround this IE issue automatically at present.

        // Trim whitespace, otherwise indexOf won't work as expected
        var tags = ko.utils.stringTrim(html).toLowerCase(), div = documentContext.createElement("div");

        // Finds the first match from the left column, and returns the corresponding "wrap" data from the right column
        var wrap = tags.match(/^<(thead|tbody|tfoot)/)              && [1, "<table>", "</table>"] ||
                   !tags.indexOf("<tr")                             && [2, "<table><tbody>", "</tbody></table>"] ||
                   (!tags.indexOf("<td") || !tags.indexOf("<th"))   && [3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
                   /* anything else */                                 [0, "", ""];

        // Go to html and back, then peel off extra wrappers
        // Note that we always prefix with some dummy text, because otherwise, IE<9 will strip out leading comment nodes in descendants. Total madness.
        var markup = "ignored<div>" + wrap[1] + html + wrap[2] + "</div>";
        if (typeof windowContext['innerShiv'] == "function") {
            div.appendChild(windowContext['innerShiv'](markup));
        } else {
            div.innerHTML = markup;
        }

        // Move to the right depth
        while (wrap[0]--)
            div = div.lastChild;

        return ko.utils.makeArray(div.lastChild.childNodes);
    }

    function jQueryHtmlParse(html, documentContext) {
        // jQuery's "parseHTML" function was introduced in jQuery 1.8.0 and is a documented public API.
        if (jQueryInstance['parseHTML']) {
            return jQueryInstance['parseHTML'](html, documentContext) || []; // Ensure we always return an array and never null
        } else {
            // For jQuery < 1.8.0, we fall back on the undocumented internal "clean" function.
            var elems = jQueryInstance['clean']([html], documentContext);

            // As of jQuery 1.7.1, jQuery parses the HTML by appending it to some dummy parent nodes held in an in-memory document fragment.
            // Unfortunately, it never clears the dummy parent nodes from the document fragment, so it leaks memory over time.
            // Fix this by finding the top-most dummy parent element, and detaching it from its owner fragment.
            if (elems && elems[0]) {
                // Find the top-most parent element that's a direct child of a document fragment
                var elem = elems[0];
                while (elem.parentNode && elem.parentNode.nodeType !== 11 /* i.e., DocumentFragment */)
                    elem = elem.parentNode;
                // ... then detach it
                if (elem.parentNode)
                    elem.parentNode.removeChild(elem);
            }

            return elems;
        }
    }

    ko.utils.parseHtmlFragment = function(html, documentContext) {
        return jQueryInstance ? jQueryHtmlParse(html, documentContext)   // As below, benefit from jQuery's optimisations where possible
                              : simpleHtmlParse(html, documentContext);  // ... otherwise, this simple logic will do in most common cases.
    };

    ko.utils.setHtml = function(node, html) {
        ko.utils.emptyDomNode(node);

        // There's no legitimate reason to display a stringified observable without unwrapping it, so we'll unwrap it
        html = ko.utils.unwrapObservable(html);

        if ((html !== null) && (html !== undefined)) {
            if (typeof html != 'string')
                html = html.toString();

            // jQuery contains a lot of sophisticated code to parse arbitrary HTML fragments,
            // for example <tr> elements which are not normally allowed to exist on their own.
            // If you've referenced jQuery we'll use that rather than duplicating its code.
            if (jQueryInstance) {
                jQueryInstance(node)['html'](html);
            } else {
                // ... otherwise, use KO's own parsing logic.
                var parsedNodes = ko.utils.parseHtmlFragment(html, node.ownerDocument);
                for (var i = 0; i < parsedNodes.length; i++)
                    node.appendChild(parsedNodes[i]);
            }
        }
    };
})();

ko.exportSymbol('utils.parseHtmlFragment', ko.utils.parseHtmlFragment);
ko.exportSymbol('utils.setHtml', ko.utils.setHtml);

ko.memoization = (function () {
    var memos = {};

    function randomMax8HexChars() {
        return (((1 + Math.random()) * 0x100000000) | 0).toString(16).substring(1);
    }
    function generateRandomId() {
        return randomMax8HexChars() + randomMax8HexChars();
    }
    function findMemoNodes(rootNode, appendToArray) {
        if (!rootNode)
            return;
        if (rootNode.nodeType == 8) {
            var memoId = ko.memoization.parseMemoText(rootNode.nodeValue);
            if (memoId != null)
                appendToArray.push({ domNode: rootNode, memoId: memoId });
        } else if (rootNode.nodeType == 1) {
            for (var i = 0, childNodes = rootNode.childNodes, j = childNodes.length; i < j; i++)
                findMemoNodes(childNodes[i], appendToArray);
        }
    }

    return {
        memoize: function (callback) {
            if (typeof callback != "function")
                throw new Error("You can only pass a function to ko.memoization.memoize()");
            var memoId = generateRandomId();
            memos[memoId] = callback;
            return "<!--[ko_memo:" + memoId + "]-->";
        },

        unmemoize: function (memoId, callbackParams) {
            var callback = memos[memoId];
            if (callback === undefined)
                throw new Error("Couldn't find any memo with ID " + memoId + ". Perhaps it's already been unmemoized.");
            try {
                callback.apply(null, callbackParams || []);
                return true;
            }
            finally { delete memos[memoId]; }
        },

        unmemoizeDomNodeAndDescendants: function (domNode, extraCallbackParamsArray) {
            var memos = [];
            findMemoNodes(domNode, memos);
            for (var i = 0, j = memos.length; i < j; i++) {
                var node = memos[i].domNode;
                var combinedParams = [node];
                if (extraCallbackParamsArray)
                    ko.utils.arrayPushAll(combinedParams, extraCallbackParamsArray);
                ko.memoization.unmemoize(memos[i].memoId, combinedParams);
                node.nodeValue = ""; // Neuter this node so we don't try to unmemoize it again
                if (node.parentNode)
                    node.parentNode.removeChild(node); // If possible, erase it totally (not always possible - someone else might just hold a reference to it then call unmemoizeDomNodeAndDescendants again)
            }
        },

        parseMemoText: function (memoText) {
            var match = memoText.match(/^\[ko_memo\:(.*?)\]$/);
            return match ? match[1] : null;
        }
    };
})();

ko.exportSymbol('memoization', ko.memoization);
ko.exportSymbol('memoization.memoize', ko.memoization.memoize);
ko.exportSymbol('memoization.unmemoize', ko.memoization.unmemoize);
ko.exportSymbol('memoization.parseMemoText', ko.memoization.parseMemoText);
ko.exportSymbol('memoization.unmemoizeDomNodeAndDescendants', ko.memoization.unmemoizeDomNodeAndDescendants);
ko.extenders = {
    'throttle': function(target, timeout) {
        // Throttling means two things:

        // (1) For dependent observables, we throttle *evaluations* so that, no matter how fast its dependencies
        //     notify updates, the target doesn't re-evaluate (and hence doesn't notify) faster than a certain rate
        target['throttleEvaluation'] = timeout;

        // (2) For writable targets (observables, or writable dependent observables), we throttle *writes*
        //     so the target cannot change value synchronously or faster than a certain rate
        var writeTimeoutInstance = null;
        return ko.dependentObservable({
            'read': target,
            'write': function(value) {
                clearTimeout(writeTimeoutInstance);
                writeTimeoutInstance = setTimeout(function() {
                    target(value);
                }, timeout);
            }
        });
    },

    'rateLimit': function(target, options) {
        var timeout, method, limitFunction;

        if (typeof options == 'number') {
            timeout = options;
        } else {
            timeout = options['timeout'];
            method = options['method'];
        }

        limitFunction = method == 'notifyWhenChangesStop' ?  debounce : throttle;
        target.limit(function(callback) {
            return limitFunction(callback, timeout);
        });
    },

    'notify': function(target, notifyWhen) {
        target["equalityComparer"] = notifyWhen == "always" ?
            null :  // null equalityComparer means to always notify
            valuesArePrimitiveAndEqual;
    }
};

var primitiveTypes = { 'undefined':1, 'boolean':1, 'number':1, 'string':1 };
function valuesArePrimitiveAndEqual(a, b) {
    var oldValueIsPrimitive = (a === null) || (typeof(a) in primitiveTypes);
    return oldValueIsPrimitive ? (a === b) : false;
}

function throttle(callback, timeout) {
    var timeoutInstance;
    return function () {
        if (!timeoutInstance) {
            timeoutInstance = setTimeout(function() {
                timeoutInstance = undefined;
                callback();
            }, timeout);
        }
    };
}

function debounce(callback, timeout) {
    var timeoutInstance;
    return function () {
        clearTimeout(timeoutInstance);
        timeoutInstance = setTimeout(callback, timeout);
    };
}

function applyExtenders(requestedExtenders) {
    var target = this;
    if (requestedExtenders) {
        ko.utils.objectForEach(requestedExtenders, function(key, value) {
            var extenderHandler = ko.extenders[key];
            if (typeof extenderHandler == 'function') {
                target = extenderHandler(target, value) || target;
            }
        });
    }
    return target;
}

ko.exportSymbol('extenders', ko.extenders);

ko.subscription = function (target, callback, disposeCallback) {
    this._target = target;
    this.callback = callback;
    this.disposeCallback = disposeCallback;
    this.isDisposed = false;
    ko.exportProperty(this, 'dispose', this.dispose);
};
ko.subscription.prototype.dispose = function () {
    this.isDisposed = true;
    this.disposeCallback();
};

ko.subscribable = function () {
    ko.utils.setPrototypeOfOrExtend(this, ko.subscribable['fn']);
    this._subscriptions = {};
    this._versionNumber = 1;
}

var defaultEvent = "change";

var ko_subscribable_fn = {
    subscribe: function (callback, callbackTarget, event) {
        var self = this;

        event = event || defaultEvent;
        var boundCallback = callbackTarget ? callback.bind(callbackTarget) : callback;

        var subscription = new ko.subscription(self, boundCallback, function () {
            ko.utils.arrayRemoveItem(self._subscriptions[event], subscription);
            if (self.afterSubscriptionRemove)
                self.afterSubscriptionRemove(event);
        });

        if (self.beforeSubscriptionAdd)
            self.beforeSubscriptionAdd(event);

        if (!self._subscriptions[event])
            self._subscriptions[event] = [];
        self._subscriptions[event].push(subscription);

        return subscription;
    },

    "notifySubscribers": function (valueToNotify, event) {
        event = event || defaultEvent;
        if (event === defaultEvent) {
            this.updateVersion();
        }
        if (this.hasSubscriptionsForEvent(event)) {
            try {
                ko.dependencyDetection.begin(); // Begin suppressing dependency detection (by setting the top frame to undefined)
                for (var a = this._subscriptions[event].slice(0), i = 0, subscription; subscription = a[i]; ++i) {
                    // In case a subscription was disposed during the arrayForEach cycle, check
                    // for isDisposed on each subscription before invoking its callback
                    if (!subscription.isDisposed)
                        subscription.callback(valueToNotify);
                }
            } finally {
                ko.dependencyDetection.end(); // End suppressing dependency detection
            }
        }
    },

    getVersion: function () {
        return this._versionNumber;
    },

    hasChanged: function (versionToCheck) {
        return this.getVersion() !== versionToCheck;
    },

    updateVersion: function () {
        ++this._versionNumber;
    },

    limit: function(limitFunction) {
        var self = this, selfIsObservable = ko.isObservable(self),
            isPending, previousValue, pendingValue, beforeChange = 'beforeChange';

        if (!self._origNotifySubscribers) {
            self._origNotifySubscribers = self["notifySubscribers"];
            self["notifySubscribers"] = function(value, event) {
                if (!event || event === defaultEvent) {
                    self._rateLimitedChange(value);
                } else if (event === beforeChange) {
                    self._rateLimitedBeforeChange(value);
                } else {
                    self._origNotifySubscribers(value, event);
                }
            };
        }

        var finish = limitFunction(function() {
            // If an observable provided a reference to itself, access it to get the latest value.
            // This allows computed observables to delay calculating their value until needed.
            if (selfIsObservable && pendingValue === self) {
                pendingValue = self();
            }
            isPending = false;
            if (self.isDifferent(previousValue, pendingValue)) {
                self._origNotifySubscribers(previousValue = pendingValue);
            }
        });

        self._rateLimitedChange = function(value) {
            isPending = true;
            pendingValue = value;
            finish();
        };
        self._rateLimitedBeforeChange = function(value) {
            if (!isPending) {
                previousValue = value;
                self._origNotifySubscribers(value, beforeChange);
            }
        };
    },

    hasSubscriptionsForEvent: function(event) {
        return this._subscriptions[event] && this._subscriptions[event].length;
    },

    getSubscriptionsCount: function (event) {
        if (event) {
            return this._subscriptions[event] && this._subscriptions[event].length || 0;
        } else {
            var total = 0;
            ko.utils.objectForEach(this._subscriptions, function(eventName, subscriptions) {
                total += subscriptions.length;
            });
            return total;
        }
    },

    isDifferent: function(oldValue, newValue) {
        return !this['equalityComparer'] || !this['equalityComparer'](oldValue, newValue);
    },

    extend: applyExtenders
};

ko.exportProperty(ko_subscribable_fn, 'subscribe', ko_subscribable_fn.subscribe);
ko.exportProperty(ko_subscribable_fn, 'extend', ko_subscribable_fn.extend);
ko.exportProperty(ko_subscribable_fn, 'getSubscriptionsCount', ko_subscribable_fn.getSubscriptionsCount);

// For browsers that support proto assignment, we overwrite the prototype of each
// observable instance. Since observables are functions, we need Function.prototype
// to still be in the prototype chain.
if (ko.utils.canSetPrototype) {
    ko.utils.setPrototypeOf(ko_subscribable_fn, Function.prototype);
}

ko.subscribable['fn'] = ko_subscribable_fn;


ko.isSubscribable = function (instance) {
    return instance != null && typeof instance.subscribe == "function" && typeof instance["notifySubscribers"] == "function";
};

ko.exportSymbol('subscribable', ko.subscribable);
ko.exportSymbol('isSubscribable', ko.isSubscribable);

ko.computedContext = ko.dependencyDetection = (function () {
    var outerFrames = [],
        currentFrame,
        lastId = 0;

    // Return a unique ID that can be assigned to an observable for dependency tracking.
    // Theoretically, you could eventually overflow the number storage size, resulting
    // in duplicate IDs. But in JavaScript, the largest exact integral value is 2^53
    // or 9,007,199,254,740,992. If you created 1,000,000 IDs per second, it would
    // take over 285 years to reach that number.
    // Reference http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html
    function getId() {
        return ++lastId;
    }

    function begin(options) {
        outerFrames.push(currentFrame);
        currentFrame = options;
    }

    function end() {
        currentFrame = outerFrames.pop();
    }

    return {
        begin: begin,

        end: end,

        registerDependency: function (subscribable) {
            if (currentFrame) {
                if (!ko.isSubscribable(subscribable))
                    throw new Error("Only subscribable things can act as dependencies");
                currentFrame.callback(subscribable, subscribable._id || (subscribable._id = getId()));
            }
        },

        ignore: function (callback, callbackTarget, callbackArgs) {
            try {
                begin();
                return callback.apply(callbackTarget, callbackArgs || []);
            } finally {
                end();
            }
        },

        getDependenciesCount: function () {
            if (currentFrame)
                return currentFrame.computed.getDependenciesCount();
        },

        isInitial: function() {
            if (currentFrame)
                return currentFrame.isInitial;
        }
    };
})();

ko.exportSymbol('computedContext', ko.computedContext);
ko.exportSymbol('computedContext.getDependenciesCount', ko.computedContext.getDependenciesCount);
ko.exportSymbol('computedContext.isInitial', ko.computedContext.isInitial);
ko.exportSymbol('computedContext.isSleeping', ko.computedContext.isSleeping);

ko.exportSymbol('ignoreDependencies', ko.ignoreDependencies = ko.dependencyDetection.ignore);
ko.observable = function (initialValue) {
    var _latestValue = initialValue;

    function observable() {
        if (arguments.length > 0) {
            // Write

            // Ignore writes if the value hasn't changed
            if (observable.isDifferent(_latestValue, arguments[0])) {
                observable.valueWillMutate();
                _latestValue = arguments[0];
                if (DEBUG) observable._latestValue = _latestValue;
                observable.valueHasMutated();
            }
            return this; // Permits chained assignments
        }
        else {
            // Read
            ko.dependencyDetection.registerDependency(observable); // The caller only needs to be notified of changes if they did a "read" operation
            return _latestValue;
        }
    }
    ko.subscribable.call(observable);
    ko.utils.setPrototypeOfOrExtend(observable, ko.observable['fn']);

    if (DEBUG) observable._latestValue = _latestValue;
    observable.peek = function() { return _latestValue };
    observable.valueHasMutated = function () { observable["notifySubscribers"](_latestValue); }
    observable.valueWillMutate = function () { observable["notifySubscribers"](_latestValue, "beforeChange"); }

    ko.exportProperty(observable, 'peek', observable.peek);
    ko.exportProperty(observable, "valueHasMutated", observable.valueHasMutated);
    ko.exportProperty(observable, "valueWillMutate", observable.valueWillMutate);

    return observable;
}

ko.observable['fn'] = {
    "equalityComparer": valuesArePrimitiveAndEqual
};

var protoProperty = ko.observable.protoProperty = "__ko_proto__";
ko.observable['fn'][protoProperty] = ko.observable;

// Note that for browsers that don't support proto assignment, the
// inheritance chain is created manually in the ko.observable constructor
if (ko.utils.canSetPrototype) {
    ko.utils.setPrototypeOf(ko.observable['fn'], ko.subscribable['fn']);
}

ko.hasPrototype = function(instance, prototype) {
    if ((instance === null) || (instance === undefined) || (instance[protoProperty] === undefined)) return false;
    if (instance[protoProperty] === prototype) return true;
    return ko.hasPrototype(instance[protoProperty], prototype); // Walk the prototype chain
};

ko.isObservable = function (instance) {
    return ko.hasPrototype(instance, ko.observable);
}
ko.isWriteableObservable = function (instance) {
    // Observable
    if ((typeof instance == "function") && instance[protoProperty] === ko.observable)
        return true;
    // Writeable dependent observable
    if ((typeof instance == "function") && (instance[protoProperty] === ko.dependentObservable) && (instance.hasWriteFunction))
        return true;
    // Anything else
    return false;
}


ko.exportSymbol('observable', ko.observable);
ko.exportSymbol('isObservable', ko.isObservable);
ko.exportSymbol('isWriteableObservable', ko.isWriteableObservable);
ko.exportSymbol('isWritableObservable', ko.isWriteableObservable);
ko.observableArray = function (initialValues) {
    initialValues = initialValues || [];

    if (typeof initialValues != 'object' || !('length' in initialValues))
        throw new Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");

    var result = ko.observable(initialValues);
    ko.utils.setPrototypeOfOrExtend(result, ko.observableArray['fn']);
    return result.extend({'trackArrayChanges':true});
};

ko.observableArray['fn'] = {
    'remove': function (valueOrPredicate) {
        var underlyingArray = this.peek();
        var removedValues = [];
        var predicate = typeof valueOrPredicate == "function" && !ko.isObservable(valueOrPredicate) ? valueOrPredicate : function (value) { return value === valueOrPredicate; };
        for (var i = 0; i < underlyingArray.length; i++) {
            var value = underlyingArray[i];
            if (predicate(value)) {
                if (removedValues.length === 0) {
                    this.valueWillMutate();
                }
                removedValues.push(value);
                underlyingArray.splice(i, 1);
                i--;
            }
        }
        if (removedValues.length) {
            this.valueHasMutated();
        }
        return removedValues;
    },

    'removeAll': function (arrayOfValues) {
        // If you passed zero args, we remove everything
        if (arrayOfValues === undefined) {
            var underlyingArray = this.peek();
            var allValues = underlyingArray.slice(0);
            this.valueWillMutate();
            underlyingArray.splice(0, underlyingArray.length);
            this.valueHasMutated();
            return allValues;
        }
        // If you passed an arg, we interpret it as an array of entries to remove
        if (!arrayOfValues)
            return [];
        return this['remove'](function (value) {
            return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;
        });
    },

    'destroy': function (valueOrPredicate) {
        var underlyingArray = this.peek();
        var predicate = typeof valueOrPredicate == "function" && !ko.isObservable(valueOrPredicate) ? valueOrPredicate : function (value) { return value === valueOrPredicate; };
        this.valueWillMutate();
        for (var i = underlyingArray.length - 1; i >= 0; i--) {
            var value = underlyingArray[i];
            if (predicate(value))
                underlyingArray[i]["_destroy"] = true;
        }
        this.valueHasMutated();
    },

    'destroyAll': function (arrayOfValues) {
        // If you passed zero args, we destroy everything
        if (arrayOfValues === undefined)
            return this['destroy'](function() { return true });

        // If you passed an arg, we interpret it as an array of entries to destroy
        if (!arrayOfValues)
            return [];
        return this['destroy'](function (value) {
            return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;
        });
    },

    'indexOf': function (item) {
        var underlyingArray = this();
        return ko.utils.arrayIndexOf(underlyingArray, item);
    },

    'replace': function(oldItem, newItem) {
        var index = this['indexOf'](oldItem);
        if (index >= 0) {
            this.valueWillMutate();
            this.peek()[index] = newItem;
            this.valueHasMutated();
        }
    }
};

// Populate ko.observableArray.fn with read/write functions from native arrays
// Important: Do not add any additional functions here that may reasonably be used to *read* data from the array
// because we'll eval them without causing subscriptions, so ko.computed output could end up getting stale
ko.utils.arrayForEach(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function (methodName) {
    ko.observableArray['fn'][methodName] = function () {
        // Use "peek" to avoid creating a subscription in any computed that we're executing in the context of
        // (for consistency with mutating regular observables)
        var underlyingArray = this.peek();
        this.valueWillMutate();
        this.cacheDiffForKnownOperation(underlyingArray, methodName, arguments);
        var methodCallResult = underlyingArray[methodName].apply(underlyingArray, arguments);
        this.valueHasMutated();
        return methodCallResult;
    };
});

// Populate ko.observableArray.fn with read-only functions from native arrays
ko.utils.arrayForEach(["slice"], function (methodName) {
    ko.observableArray['fn'][methodName] = function () {
        var underlyingArray = this();
        return underlyingArray[methodName].apply(underlyingArray, arguments);
    };
});

// Note that for browsers that don't support proto assignment, the
// inheritance chain is created manually in the ko.observableArray constructor
if (ko.utils.canSetPrototype) {
    ko.utils.setPrototypeOf(ko.observableArray['fn'], ko.observable['fn']);
}

ko.exportSymbol('observableArray', ko.observableArray);
var arrayChangeEventName = 'arrayChange';
ko.extenders['trackArrayChanges'] = function(target) {
    // Only modify the target observable once
    if (target.cacheDiffForKnownOperation) {
        return;
    }
    var trackingChanges = false,
        cachedDiff = null,
        arrayChangeSubscription,
        pendingNotifications = 0,
        underlyingBeforeSubscriptionAddFunction = target.beforeSubscriptionAdd,
        underlyingAfterSubscriptionRemoveFunction = target.afterSubscriptionRemove;

    // Watch "subscribe" calls, and for array change events, ensure change tracking is enabled
    target.beforeSubscriptionAdd = function (event) {
        if (underlyingBeforeSubscriptionAddFunction)
            underlyingBeforeSubscriptionAddFunction.call(target, event);
        if (event === arrayChangeEventName) {
            trackChanges();
        }
    };
    // Watch "dispose" calls, and for array change events, ensure change tracking is disabled when all are disposed
    target.afterSubscriptionRemove = function (event) {
        if (underlyingAfterSubscriptionRemoveFunction)
            underlyingAfterSubscriptionRemoveFunction.call(target, event);
        if (event === arrayChangeEventName && !target.hasSubscriptionsForEvent(arrayChangeEventName)) {
            arrayChangeSubscription.dispose();
            trackingChanges = false;
        }
    };

    function trackChanges() {
        // Calling 'trackChanges' multiple times is the same as calling it once
        if (trackingChanges) {
            return;
        }

        trackingChanges = true;

        // Intercept "notifySubscribers" to track how many times it was called.
        var underlyingNotifySubscribersFunction = target['notifySubscribers'];
        target['notifySubscribers'] = function(valueToNotify, event) {
            if (!event || event === defaultEvent) {
                ++pendingNotifications;
            }
            return underlyingNotifySubscribersFunction.apply(this, arguments);
        };

        // Each time the array changes value, capture a clone so that on the next
        // change it's possible to produce a diff
        var previousContents = [].concat(target.peek() || []);
        cachedDiff = null;
        arrayChangeSubscription = target.subscribe(function(currentContents) {
            // Make a copy of the current contents and ensure it's an array
            currentContents = [].concat(currentContents || []);

            // Compute the diff and issue notifications, but only if someone is listening
            if (target.hasSubscriptionsForEvent(arrayChangeEventName)) {
                var changes = getChanges(previousContents, currentContents);
            }

            // Eliminate references to the old, removed items, so they can be GCed
            previousContents = currentContents;
            cachedDiff = null;
            pendingNotifications = 0;

            if (changes && changes.length) {
                target['notifySubscribers'](changes, arrayChangeEventName);
            }
        });
    }

    function getChanges(previousContents, currentContents) {
        // We try to re-use cached diffs.
        // The scenarios where pendingNotifications > 1 are when using rate-limiting or the Deferred Updates
        // plugin, which without this check would not be compatible with arrayChange notifications. Normally,
        // notifications are issued immediately so we wouldn't be queueing up more than one.
        if (!cachedDiff || pendingNotifications > 1) {
            cachedDiff = ko.utils.compareArrays(previousContents, currentContents, { 'sparse': true });
        }

        return cachedDiff;
    }

    target.cacheDiffForKnownOperation = function(rawArray, operationName, args) {
        // Only run if we're currently tracking changes for this observable array
        // and there aren't any pending deferred notifications.
        if (!trackingChanges || pendingNotifications) {
            return;
        }
        var diff = [],
            arrayLength = rawArray.length,
            argsLength = args.length,
            offset = 0;

        function pushDiff(status, value, index) {
            return diff[diff.length] = { 'status': status, 'value': value, 'index': index };
        }
        switch (operationName) {
            case 'push':
                offset = arrayLength;
            case 'unshift':
                for (var index = 0; index < argsLength; index++) {
                    pushDiff('added', args[index], offset + index);
                }
                break;

            case 'pop':
                offset = arrayLength - 1;
            case 'shift':
                if (arrayLength) {
                    pushDiff('deleted', rawArray[offset], offset);
                }
                break;

            case 'splice':
                // Negative start index means 'from end of array'. After that we clamp to [0...arrayLength].
                // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
                var startIndex = Math.min(Math.max(0, args[0] < 0 ? arrayLength + args[0] : args[0]), arrayLength),
                    endDeleteIndex = argsLength === 1 ? arrayLength : Math.min(startIndex + (args[1] || 0), arrayLength),
                    endAddIndex = startIndex + argsLength - 2,
                    endIndex = Math.max(endDeleteIndex, endAddIndex),
                    additions = [], deletions = [];
                for (var index = startIndex, argsIndex = 2; index < endIndex; ++index, ++argsIndex) {
                    if (index < endDeleteIndex)
                        deletions.push(pushDiff('deleted', rawArray[index], index));
                    if (index < endAddIndex)
                        additions.push(pushDiff('added', args[argsIndex], index));
                }
                ko.utils.findMovesInArrayComparison(deletions, additions);
                break;

            default:
                return;
        }
        cachedDiff = diff;
    };
};
ko.computed = ko.dependentObservable = function (evaluatorFunctionOrOptions, evaluatorFunctionTarget, options) {
    var _latestValue,
        _needsEvaluation = true,
        _isBeingEvaluated = false,
        _suppressDisposalUntilDisposeWhenReturnsFalse = false,
        _isDisposed = false,
        readFunction = evaluatorFunctionOrOptions,
        pure = false,
        isSleeping = false;

    if (readFunction && typeof readFunction == "object") {
        // Single-parameter syntax - everything is on this "options" param
        options = readFunction;
        readFunction = options["read"];
    } else {
        // Multi-parameter syntax - construct the options according to the params passed
        options = options || {};
        if (!readFunction)
            readFunction = options["read"];
    }
    if (typeof readFunction != "function")
        throw new Error("Pass a function that returns the value of the ko.computed");

    function addDependencyTracking(id, target, trackingObj) {
        if (pure && target === dependentObservable) {
            throw Error("A 'pure' computed must not be called recursively");
        }

        dependencyTracking[id] = trackingObj;
        trackingObj._order = _dependenciesCount++;
        trackingObj._version = target.getVersion();
    }

    function haveDependenciesChanged() {
        var id, dependency;
        for (id in dependencyTracking) {
            if (dependencyTracking.hasOwnProperty(id)) {
                dependency = dependencyTracking[id];
                if (dependency._target.hasChanged(dependency._version)) {
                    return true;
                }
            }
        }
    }

    function disposeComputed() {
        if (!isSleeping && dependencyTracking) {
            ko.utils.objectForEach(dependencyTracking, function (id, dependency) {
                if (dependency.dispose)
                    dependency.dispose();
            });
        }
        dependencyTracking = null;
        _dependenciesCount = 0;
        _isDisposed = true;
        _needsEvaluation = false;
        isSleeping = false;
    }

    function evaluatePossiblyAsync() {
        var throttleEvaluationTimeout = dependentObservable['throttleEvaluation'];
        if (throttleEvaluationTimeout && throttleEvaluationTimeout >= 0) {
            clearTimeout(evaluationTimeoutInstance);
            evaluationTimeoutInstance = setTimeout(function () {
                evaluateImmediate(true /*notifyChange*/);
            }, throttleEvaluationTimeout);
        } else if (dependentObservable._evalRateLimited) {
            dependentObservable._evalRateLimited();
        } else {
            evaluateImmediate(true /*notifyChange*/);
        }
    }

    function evaluateImmediate(notifyChange) {
        if (_isBeingEvaluated) {
            // If the evaluation of a ko.computed causes side effects, it's possible that it will trigger its own re-evaluation.
            // This is not desirable (it's hard for a developer to realise a chain of dependencies might cause this, and they almost
            // certainly didn't intend infinite re-evaluations). So, for predictability, we simply prevent ko.computeds from causing
            // their own re-evaluation. Further discussion at https://github.com/SteveSanderson/knockout/pull/387
            return;
        }

        // Do not evaluate (and possibly capture new dependencies) if disposed
        if (_isDisposed) {
            return;
        }

        if (disposeWhen && disposeWhen()) {
            // See comment below about _suppressDisposalUntilDisposeWhenReturnsFalse
            if (!_suppressDisposalUntilDisposeWhenReturnsFalse) {
                dispose();
                return;
            }
        } else {
            // It just did return false, so we can stop suppressing now
            _suppressDisposalUntilDisposeWhenReturnsFalse = false;
        }

        _isBeingEvaluated = true;

        try {
            // Initially, we assume that none of the subscriptions are still being used (i.e., all are candidates for disposal).
            // Then, during evaluation, we cross off any that are in fact still being used.
            var disposalCandidates = dependencyTracking,
                disposalCount = _dependenciesCount,
                isInitial = pure ? undefined : !_dependenciesCount;   // If we're evaluating when there are no previous dependencies, it must be the first time

            ko.dependencyDetection.begin({
                callback: function(subscribable, id) {
                    if (!_isDisposed) {
                        if (disposalCount && disposalCandidates[id]) {
                            // Don't want to dispose this subscription, as it's still being used
                            addDependencyTracking(id, subscribable, disposalCandidates[id]);
                            delete disposalCandidates[id];
                            --disposalCount;
                        } else if (!dependencyTracking[id]) {
                            // Brand new subscription - add it
                            addDependencyTracking(id, subscribable, isSleeping ? { _target: subscribable } : subscribable.subscribe(evaluatePossiblyAsync));
                        }
                    }
                },
                computed: dependentObservable,
                isInitial: isInitial
            });

            dependencyTracking = {};
            _dependenciesCount = 0;

            try {
                var newValue = evaluatorFunctionTarget ? readFunction.call(evaluatorFunctionTarget) : readFunction();

            } finally {
                ko.dependencyDetection.end();

                // For each subscription no longer being used, remove it from the active subscriptions list and dispose it
                if (disposalCount && !isSleeping) {
                    ko.utils.objectForEach(disposalCandidates, function(id, toDispose) {
                        if (toDispose.dispose)
                            toDispose.dispose();
                    });
                }

                _needsEvaluation = false;
            }

            if (dependentObservable.isDifferent(_latestValue, newValue)) {
                if (!isSleeping) {
                    notify(_latestValue, "beforeChange");
                }

                _latestValue = newValue;
                if (DEBUG) dependentObservable._latestValue = _latestValue;

                if (isSleeping) {
                    dependentObservable.updateVersion();
                } else if (notifyChange) {
                    notify(_latestValue);
                }
            }

            if (isInitial) {
                notify(_latestValue, "awake");
            }
        } finally {
            _isBeingEvaluated = false;
        }

        if (!_dependenciesCount)
            dispose();
    }

    function dependentObservable() {
        if (arguments.length > 0) {
            if (typeof writeFunction === "function") {
                // Writing a value
                writeFunction.apply(evaluatorFunctionTarget, arguments);
            } else {
                throw new Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");
            }
            return this; // Permits chained assignments
        } else {
            // Reading the value
            ko.dependencyDetection.registerDependency(dependentObservable);
            if (_needsEvaluation || (isSleeping && haveDependenciesChanged())) {
                evaluateImmediate();
            }
            return _latestValue;
        }
    }

    function peek() {
        // Peek won't re-evaluate, except while the computed is sleeping or to get the initial value when "deferEvaluation" is set.
        if ((_needsEvaluation && !_dependenciesCount) || (isSleeping && haveDependenciesChanged())) {
            evaluateImmediate();
        }
        return _latestValue;
    }

    function isActive() {
        return _needsEvaluation || _dependenciesCount > 0;
    }

    function notify(value, event) {
        dependentObservable["notifySubscribers"](value, event);
    }

    // By here, "options" is always non-null
    var writeFunction = options["write"],
        disposeWhenNodeIsRemoved = options["disposeWhenNodeIsRemoved"] || options.disposeWhenNodeIsRemoved || null,
        disposeWhenOption = options["disposeWhen"] || options.disposeWhen,
        disposeWhen = disposeWhenOption,
        dispose = disposeComputed,
        dependencyTracking = {},
        _dependenciesCount = 0,
        evaluationTimeoutInstance = null;

    if (!evaluatorFunctionTarget)
        evaluatorFunctionTarget = options["owner"];

    ko.subscribable.call(dependentObservable);
    ko.utils.setPrototypeOfOrExtend(dependentObservable, ko.dependentObservable['fn']);

    dependentObservable.peek = peek;
    dependentObservable.getDependenciesCount = function () { return _dependenciesCount; };
    dependentObservable.hasWriteFunction = typeof writeFunction === "function";
    dependentObservable.dispose = function () { dispose(); };
    dependentObservable.isActive = isActive;

    // Replace the limit function with one that delays evaluation as well.
    var originalLimit = dependentObservable.limit;
    dependentObservable.limit = function(limitFunction) {
        originalLimit.call(dependentObservable, limitFunction);
        dependentObservable._evalRateLimited = function() {
            dependentObservable._rateLimitedBeforeChange(_latestValue);

            _needsEvaluation = true;    // Mark as dirty

            // Pass the observable to the rate-limit code, which will access it when
            // it's time to do the notification.
            dependentObservable._rateLimitedChange(dependentObservable);
        }
    };

    if (options['pure']) {
        pure = true;
        isSleeping = true;     // Starts off sleeping; will awake on the first subscription
        dependentObservable.beforeSubscriptionAdd = function (event) {
            // If asleep, wake up the computed by subscribing to any dependencies.
            if (!_isDisposed && isSleeping && event == 'change') {
                isSleeping = false;
                if (_needsEvaluation || haveDependenciesChanged()) {
                    dependencyTracking = null;
                    _dependenciesCount = 0;
                    _needsEvaluation = true;
                    evaluateImmediate();
                } else {
                    // First put the dependencies in order
                    var dependeciesOrder = [];
                    ko.utils.objectForEach(dependencyTracking, function (id, dependency) {
                        dependeciesOrder[dependency._order] = id;
                    });
                    // Next, subscribe to each one
                    ko.utils.arrayForEach(dependeciesOrder, function(id, order) {
                        var dependency = dependencyTracking[id],
                            subscription = dependency._target.subscribe(evaluatePossiblyAsync);
                        subscription._order = order;
                        subscription._version = dependency._version;
                        dependencyTracking[id] = subscription;
                    });
                }
                if (!_isDisposed) {     // test since evaluating could trigger disposal
                    notify(_latestValue, "awake");
                }
            }
        };

        dependentObservable.afterSubscriptionRemove = function (event) {
            if (!_isDisposed && event == 'change' && !dependentObservable.hasSubscriptionsForEvent('change')) {
                ko.utils.objectForEach(dependencyTracking, function (id, dependency) {
                    if (dependency.dispose) {
                        dependencyTracking[id] = {
                            _target: dependency._target,
                            _order: dependency._order,
                            _version: dependency._version
                        };
                        dependency.dispose();
                    }
                });
                isSleeping = true;
                notify(undefined, "asleep");
            }
        };

        // Because a pure computed is not automatically updated while it is sleeping, we can't
        // simply return the version number. Instead, we check if any of the dependencies have
        // changed and conditionally re-evaluate the computed observable.
        dependentObservable._originalGetVersion = dependentObservable.getVersion;
        dependentObservable.getVersion = function () {
            if (isSleeping && (_needsEvaluation || haveDependenciesChanged())) {
                evaluateImmediate();
            }
            return dependentObservable._originalGetVersion();
        };
    } else if (options['deferEvaluation']) {
        // This will force a computed with deferEvaluation to evaluate when the first subscriptions is registered.
        dependentObservable.beforeSubscriptionAdd = function (event) {
            if (event == 'change' || event == 'beforeChange') {
                peek();
            }
        }
    }

    ko.exportProperty(dependentObservable, 'peek', dependentObservable.peek);
    ko.exportProperty(dependentObservable, 'dispose', dependentObservable.dispose);
    ko.exportProperty(dependentObservable, 'isActive', dependentObservable.isActive);
    ko.exportProperty(dependentObservable, 'getDependenciesCount', dependentObservable.getDependenciesCount);

    // Add a "disposeWhen" callback that, on each evaluation, disposes if the node was removed without using ko.removeNode.
    if (disposeWhenNodeIsRemoved) {
        // Since this computed is associated with a DOM node, and we don't want to dispose the computed
        // until the DOM node is *removed* from the document (as opposed to never having been in the document),
        // we'll prevent disposal until "disposeWhen" first returns false.
        _suppressDisposalUntilDisposeWhenReturnsFalse = true;

        // Only watch for the node's disposal if the value really is a node. It might not be,
        // e.g., { disposeWhenNodeIsRemoved: true } can be used to opt into the "only dispose
        // after first false result" behaviour even if there's no specific node to watch. This
        // technique is intended for KO's internal use only and shouldn't be documented or used
        // by application code, as it's likely to change in a future version of KO.
        if (disposeWhenNodeIsRemoved.nodeType) {
            disposeWhen = function () {
                return !ko.utils.domNodeIsAttachedToDocument(disposeWhenNodeIsRemoved) || (disposeWhenOption && disposeWhenOption());
            };
        }
    }

    // Evaluate, unless sleeping or deferEvaluation is true
    if (!isSleeping && !options['deferEvaluation'])
        evaluateImmediate();

    // Attach a DOM node disposal callback so that the computed will be proactively disposed as soon as the node is
    // removed using ko.removeNode. But skip if isActive is false (there will never be any dependencies to dispose).
    if (disposeWhenNodeIsRemoved && isActive() && disposeWhenNodeIsRemoved.nodeType) {
        dispose = function() {
            ko.utils.domNodeDisposal.removeDisposeCallback(disposeWhenNodeIsRemoved, dispose);
            disposeComputed();
        };
        ko.utils.domNodeDisposal.addDisposeCallback(disposeWhenNodeIsRemoved, dispose);
    }

    return dependentObservable;
};

ko.isComputed = function(instance) {
    return ko.hasPrototype(instance, ko.dependentObservable);
};

var protoProp = ko.observable.protoProperty; // == "__ko_proto__"
ko.dependentObservable[protoProp] = ko.observable;

ko.dependentObservable['fn'] = {
    "equalityComparer": valuesArePrimitiveAndEqual
};
ko.dependentObservable['fn'][protoProp] = ko.dependentObservable;

// Note that for browsers that don't support proto assignment, the
// inheritance chain is created manually in the ko.dependentObservable constructor
if (ko.utils.canSetPrototype) {
    ko.utils.setPrototypeOf(ko.dependentObservable['fn'], ko.subscribable['fn']);
}

ko.exportSymbol('dependentObservable', ko.dependentObservable);
ko.exportSymbol('computed', ko.dependentObservable); // Make "ko.computed" an alias for "ko.dependentObservable"
ko.exportSymbol('isComputed', ko.isComputed);

ko.pureComputed = function (evaluatorFunctionOrOptions, evaluatorFunctionTarget) {
    if (typeof evaluatorFunctionOrOptions === 'function') {
        return ko.computed(evaluatorFunctionOrOptions, evaluatorFunctionTarget, {'pure':true});
    } else {
        evaluatorFunctionOrOptions = ko.utils.extend({}, evaluatorFunctionOrOptions);   // make a copy of the parameter object
        evaluatorFunctionOrOptions['pure'] = true;
        return ko.computed(evaluatorFunctionOrOptions, evaluatorFunctionTarget);
    }
}
ko.exportSymbol('pureComputed', ko.pureComputed);

(function() {
    var maxNestedObservableDepth = 10; // Escape the (unlikely) pathalogical case where an observable's current value is itself (or similar reference cycle)

    ko.toJS = function(rootObject) {
        if (arguments.length == 0)
            throw new Error("When calling ko.toJS, pass the object you want to convert.");

        // We just unwrap everything at every level in the object graph
        return mapJsObjectGraph(rootObject, function(valueToMap) {
            // Loop because an observable's value might in turn be another observable wrapper
            for (var i = 0; ko.isObservable(valueToMap) && (i < maxNestedObservableDepth); i++)
                valueToMap = valueToMap();
            return valueToMap;
        });
    };

    ko.toJSON = function(rootObject, replacer, space) {     // replacer and space are optional
        var plainJavaScriptObject = ko.toJS(rootObject);
        return ko.utils.stringifyJson(plainJavaScriptObject, replacer, space);
    };

    function mapJsObjectGraph(rootObject, mapInputCallback, visitedObjects) {
        visitedObjects = visitedObjects || new objectLookup();

        rootObject = mapInputCallback(rootObject);
        var canHaveProperties = (typeof rootObject == "object") && (rootObject !== null) && (rootObject !== undefined) && (!(rootObject instanceof Date)) && (!(rootObject instanceof String)) && (!(rootObject instanceof Number)) && (!(rootObject instanceof Boolean));
        if (!canHaveProperties)
            return rootObject;

        var outputProperties = rootObject instanceof Array ? [] : {};
        visitedObjects.save(rootObject, outputProperties);

        visitPropertiesOrArrayEntries(rootObject, function(indexer) {
            var propertyValue = mapInputCallback(rootObject[indexer]);

            switch (typeof propertyValue) {
                case "boolean":
                case "number":
                case "string":
                case "function":
                    outputProperties[indexer] = propertyValue;
                    break;
                case "object":
                case "undefined":
                    var previouslyMappedValue = visitedObjects.get(propertyValue);
                    outputProperties[indexer] = (previouslyMappedValue !== undefined)
                        ? previouslyMappedValue
                        : mapJsObjectGraph(propertyValue, mapInputCallback, visitedObjects);
                    break;
            }
        });

        return outputProperties;
    }

    function visitPropertiesOrArrayEntries(rootObject, visitorCallback) {
        if (rootObject instanceof Array) {
            for (var i = 0; i < rootObject.length; i++)
                visitorCallback(i);

            // For arrays, also respect toJSON property for custom mappings (fixes #278)
            if (typeof rootObject['toJSON'] == 'function')
                visitorCallback('toJSON');
        } else {
            for (var propertyName in rootObject) {
                visitorCallback(propertyName);
            }
        }
    };

    function objectLookup() {
        this.keys = [];
        this.values = [];
    };

    objectLookup.prototype = {
        constructor: objectLookup,
        save: function(key, value) {
            var existingIndex = ko.utils.arrayIndexOf(this.keys, key);
            if (existingIndex >= 0)
                this.values[existingIndex] = value;
            else {
                this.keys.push(key);
                this.values.push(value);
            }
        },
        get: function(key) {
            var existingIndex = ko.utils.arrayIndexOf(this.keys, key);
            return (existingIndex >= 0) ? this.values[existingIndex] : undefined;
        }
    };
})();

ko.exportSymbol('toJS', ko.toJS);
ko.exportSymbol('toJSON', ko.toJSON);
(function () {
    var hasDomDataExpandoProperty = '__ko__hasDomDataOptionValue__';

    // Normally, SELECT elements and their OPTIONs can only take value of type 'string' (because the values
    // are stored on DOM attributes). ko.selectExtensions provides a way for SELECTs/OPTIONs to have values
    // that are arbitrary objects. This is very convenient when implementing things like cascading dropdowns.
    ko.selectExtensions = {
        readValue : function(element) {
            switch (ko.utils.tagNameLower(element)) {
                case 'option':
                    if (element[hasDomDataExpandoProperty] === true)
                        return ko.utils.domData.get(element, ko.bindingHandlers.options.optionValueDomDataKey);
                    return ko.utils.ieVersion <= 7
                        ? (element.getAttributeNode('value') && element.getAttributeNode('value').specified ? element.value : element.text)
                        : element.value;
                case 'select':
                    return element.selectedIndex >= 0 ? ko.selectExtensions.readValue(element.options[element.selectedIndex]) : undefined;
                default:
                    return element.value;
            }
        },

        writeValue: function(element, value, allowUnset) {
            switch (ko.utils.tagNameLower(element)) {
                case 'option':
                    switch(typeof value) {
                        case "string":
                            ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, undefined);
                            if (hasDomDataExpandoProperty in element) { // IE <= 8 throws errors if you delete non-existent properties from a DOM node
                                delete element[hasDomDataExpandoProperty];
                            }
                            element.value = value;
                            break;
                        default:
                            // Store arbitrary object using DomData
                            ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, value);
                            element[hasDomDataExpandoProperty] = true;

                            // Special treatment of numbers is just for backward compatibility. KO 1.2.1 wrote numerical values to element.value.
                            element.value = typeof value === "number" ? value : "";
                            break;
                    }
                    break;
                case 'select':
                    if (value === "" || value === null)       // A blank string or null value will select the caption
                        value = undefined;
                    var selection = -1;
                    for (var i = 0, n = element.options.length, optionValue; i < n; ++i) {
                        optionValue = ko.selectExtensions.readValue(element.options[i]);
                        // Include special check to handle selecting a caption with a blank string value
                        if (optionValue == value || (optionValue == "" && value === undefined)) {
                            selection = i;
                            break;
                        }
                    }
                    if (allowUnset || selection >= 0 || (value === undefined && element.size > 1)) {
                        element.selectedIndex = selection;
                    }
                    break;
                default:
                    if ((value === null) || (value === undefined))
                        value = "";
                    element.value = value;
                    break;
            }
        }
    };
})();

ko.exportSymbol('selectExtensions', ko.selectExtensions);
ko.exportSymbol('selectExtensions.readValue', ko.selectExtensions.readValue);
ko.exportSymbol('selectExtensions.writeValue', ko.selectExtensions.writeValue);
ko.expressionRewriting = (function () {
    var javaScriptReservedWords = ["true", "false", "null", "undefined"];

    // Matches something that can be assigned to--either an isolated identifier or something ending with a property accessor
    // This is designed to be simple and avoid false negatives, but could produce false positives (e.g., a+b.c).
    // This also will not properly handle nested brackets (e.g., obj1[obj2['prop']]; see #911).
    var javaScriptAssignmentTarget = /^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i;

    function getWriteableValue(expression) {
        if (ko.utils.arrayIndexOf(javaScriptReservedWords, expression) >= 0)
            return false;
        var match = expression.match(javaScriptAssignmentTarget);
        return match === null ? false : match[1] ? ('Object(' + match[1] + ')' + match[2]) : expression;
    }

    // The following regular expressions will be used to split an object-literal string into tokens

        // These two match strings, either with double quotes or single quotes
    var stringDouble = '"(?:[^"\\\\]|\\\\.)*"',
        stringSingle = "'(?:[^'\\\\]|\\\\.)*'",
        // Matches a regular expression (text enclosed by slashes), but will also match sets of divisions
        // as a regular expression (this is handled by the parsing loop below).
        stringRegexp = '/(?:[^/\\\\]|\\\\.)*/\w*',
        // These characters have special meaning to the parser and must not appear in the middle of a
        // token, except as part of a string.
        specials = ',"\'{}()/:[\\]',
        // Match text (at least two characters) that does not contain any of the above special characters,
        // although some of the special characters are allowed to start it (all but the colon and comma).
        // The text can contain spaces, but leading or trailing spaces are skipped.
        everyThingElse = '[^\\s:,/][^' + specials + ']*[^\\s' + specials + ']',
        // Match any non-space character not matched already. This will match colons and commas, since they're
        // not matched by "everyThingElse", but will also match any other single character that wasn't already
        // matched (for example: in "a: 1, b: 2", each of the non-space characters will be matched by oneNotSpace).
        oneNotSpace = '[^\\s]',

        // Create the actual regular expression by or-ing the above strings. The order is important.
        bindingToken = RegExp(stringDouble + '|' + stringSingle + '|' + stringRegexp + '|' + everyThingElse + '|' + oneNotSpace, 'g'),

        // Match end of previous token to determine whether a slash is a division or regex.
        divisionLookBehind = /[\])"'A-Za-z0-9_$]+$/,
        keywordRegexLookBehind = {'in':1,'return':1,'typeof':1};

    function parseObjectLiteral(objectLiteralString) {
        // Trim leading and trailing spaces from the string
        var str = ko.utils.stringTrim(objectLiteralString);

        // Trim braces '{' surrounding the whole object literal
        if (str.charCodeAt(0) === 123) str = str.slice(1, -1);

        // Split into tokens
        var result = [], toks = str.match(bindingToken), key, values = [], depth = 0;

        if (toks) {
            // Append a comma so that we don't need a separate code block to deal with the last item
            toks.push(',');

            for (var i = 0, tok; tok = toks[i]; ++i) {
                var c = tok.charCodeAt(0);
                // A comma signals the end of a key/value pair if depth is zero
                if (c === 44) { // ","
                    if (depth <= 0) {
                        result.push((key && values.length) ? {key: key, value: values.join('')} : {'unknown': key || values.join('')});
                        key = depth = 0;
                        values = [];
                        continue;
                    }
                // Simply skip the colon that separates the name and value
                } else if (c === 58) { // ":"
                    if (!depth && !key && values.length === 1) {
                        key = values.pop();
                        continue;
                    }
                // A set of slashes is initially matched as a regular expression, but could be division
                } else if (c === 47 && i && tok.length > 1) {  // "/"
                    // Look at the end of the previous token to determine if the slash is actually division
                    var match = toks[i-1].match(divisionLookBehind);
                    if (match && !keywordRegexLookBehind[match[0]]) {
                        // The slash is actually a division punctuator; re-parse the remainder of the string (not including the slash)
                        str = str.substr(str.indexOf(tok) + 1);
                        toks = str.match(bindingToken);
                        toks.push(',');
                        i = -1;
                        // Continue with just the slash
                        tok = '/';
                    }
                // Increment depth for parentheses, braces, and brackets so that interior commas are ignored
                } else if (c === 40 || c === 123 || c === 91) { // '(', '{', '['
                    ++depth;
                } else if (c === 41 || c === 125 || c === 93) { // ')', '}', ']'
                    --depth;
                // The key will be the first token; if it's a string, trim the quotes
                } else if (!key && !values.length && (c === 34 || c === 39)) { // '"', "'"
                    tok = tok.slice(1, -1);
                }
                values.push(tok);
            }
        }
        return result;
    }

    // Two-way bindings include a write function that allow the handler to update the value even if it's not an observable.
    var twoWayBindings = {};

    function preProcessBindings(bindingsStringOrKeyValueArray, bindingOptions) {
        bindingOptions = bindingOptions || {};

        function processKeyValue(key, val) {
            var writableVal;
            function callPreprocessHook(obj) {
                return (obj && obj['preprocess']) ? (val = obj['preprocess'](val, key, processKeyValue)) : true;
            }
            if (!bindingParams) {
                if (!callPreprocessHook(ko['getBindingHandler'](key)))
                    return;

                if (twoWayBindings[key] && (writableVal = getWriteableValue(val))) {
                    // For two-way bindings, provide a write method in case the value
                    // isn't a writable observable.
                    propertyAccessorResultStrings.push("'" + key + "':function(_z){" + writableVal + "=_z}");
                }
            }
            // Values are wrapped in a function so that each value can be accessed independently
            if (makeValueAccessors) {
                val = 'function(){return ' + val + ' }';
            }
            resultStrings.push("'" + key + "':" + val);
        }

        var resultStrings = [],
            propertyAccessorResultStrings = [],
            makeValueAccessors = bindingOptions['valueAccessors'],
            bindingParams = bindingOptions['bindingParams'],
            keyValueArray = typeof bindingsStringOrKeyValueArray === "string" ?
                parseObjectLiteral(bindingsStringOrKeyValueArray) : bindingsStringOrKeyValueArray;

        ko.utils.arrayForEach(keyValueArray, function(keyValue) {
            processKeyValue(keyValue.key || keyValue['unknown'], keyValue.value);
        });

        if (propertyAccessorResultStrings.length)
            processKeyValue('_ko_property_writers', "{" + propertyAccessorResultStrings.join(",") + " }");

        return resultStrings.join(",");
    }

    return {
        bindingRewriteValidators: [],

        twoWayBindings: twoWayBindings,

        parseObjectLiteral: parseObjectLiteral,

        preProcessBindings: preProcessBindings,

        keyValueArrayContainsKey: function(keyValueArray, key) {
            for (var i = 0; i < keyValueArray.length; i++)
                if (keyValueArray[i]['key'] == key)
                    return true;
            return false;
        },

        // Internal, private KO utility for updating model properties from within bindings
        // property:            If the property being updated is (or might be) an observable, pass it here
        //                      If it turns out to be a writable observable, it will be written to directly
        // allBindings:         An object with a get method to retrieve bindings in the current execution context.
        //                      This will be searched for a '_ko_property_writers' property in case you're writing to a non-observable
        // key:                 The key identifying the property to be written. Example: for { hasFocus: myValue }, write to 'myValue' by specifying the key 'hasFocus'
        // value:               The value to be written
        // checkIfDifferent:    If true, and if the property being written is a writable observable, the value will only be written if
        //                      it is !== existing value on that writable observable
        writeValueToProperty: function(property, allBindings, key, value, checkIfDifferent) {
            if (!property || !ko.isObservable(property)) {
                var propWriters = allBindings.get('_ko_property_writers');
                if (propWriters && propWriters[key])
                    propWriters[key](value);
            } else if (ko.isWriteableObservable(property) && (!checkIfDifferent || property.peek() !== value)) {
                property(value);
            }
        }
    };
})();

ko.exportSymbol('expressionRewriting', ko.expressionRewriting);
ko.exportSymbol('expressionRewriting.bindingRewriteValidators', ko.expressionRewriting.bindingRewriteValidators);
ko.exportSymbol('expressionRewriting.parseObjectLiteral', ko.expressionRewriting.parseObjectLiteral);
ko.exportSymbol('expressionRewriting.preProcessBindings', ko.expressionRewriting.preProcessBindings);

// Making bindings explicitly declare themselves as "two way" isn't ideal in the long term (it would be better if
// all bindings could use an official 'property writer' API without needing to declare that they might). However,
// since this is not, and has never been, a public API (_ko_property_writers was never documented), it's acceptable
// as an internal implementation detail in the short term.
// For those developers who rely on _ko_property_writers in their custom bindings, we expose _twoWayBindings as an
// undocumented feature that makes it relatively easy to upgrade to KO 3.0. However, this is still not an official
// public API, and we reserve the right to remove it at any time if we create a real public property writers API.
ko.exportSymbol('expressionRewriting._twoWayBindings', ko.expressionRewriting.twoWayBindings);

// For backward compatibility, define the following aliases. (Previously, these function names were misleading because
// they referred to JSON specifically, even though they actually work with arbitrary JavaScript object literal expressions.)
ko.exportSymbol('jsonExpressionRewriting', ko.expressionRewriting);
ko.exportSymbol('jsonExpressionRewriting.insertPropertyAccessorsIntoJson', ko.expressionRewriting.preProcessBindings);
(function() {
    // "Virtual elements" is an abstraction on top of the usual DOM API which understands the notion that comment nodes
    // may be used to represent hierarchy (in addition to the DOM's natural hierarchy).
    // If you call the DOM-manipulating functions on ko.virtualElements, you will be able to read and write the state
    // of that virtual hierarchy
    //
    // The point of all this is to support containerless templates (e.g., <!-- ko foreach:someCollection -->blah<!-- /ko -->)
    // without having to scatter special cases all over the binding and templating code.

    // IE 9 cannot reliably read the "nodeValue" property of a comment node (see https://github.com/SteveSanderson/knockout/issues/186)
    // but it does give them a nonstandard alternative property called "text" that it can read reliably. Other browsers don't have that property.
    // So, use node.text where available, and node.nodeValue elsewhere
    var commentNodesHaveTextProperty = document && document.createComment("test").text === "<!--test-->";

    var startCommentRegex = commentNodesHaveTextProperty ? /^<!--\s*ko(?:\s+([\s\S]+))?\s*-->$/ : /^\s*ko(?:\s+([\s\S]+))?\s*$/;
    var endCommentRegex =   commentNodesHaveTextProperty ? /^<!--\s*\/ko\s*-->$/ : /^\s*\/ko\s*$/;
    var htmlTagsWithOptionallyClosingChildren = { 'ul': true, 'ol': true };

    function isStartComment(node) {
        return (node.nodeType == 8) && startCommentRegex.test(commentNodesHaveTextProperty ? node.text : node.nodeValue);
    }

    function isEndComment(node) {
        return (node.nodeType == 8) && endCommentRegex.test(commentNodesHaveTextProperty ? node.text : node.nodeValue);
    }

    function getVirtualChildren(startComment, allowUnbalanced) {
        var currentNode = startComment;
        var depth = 1;
        var children = [];
        while (currentNode = currentNode.nextSibling) {
            if (isEndComment(currentNode)) {
                depth--;
                if (depth === 0)
                    return children;
            }

            children.push(currentNode);

            if (isStartComment(currentNode))
                depth++;
        }
        if (!allowUnbalanced)
            throw new Error("Cannot find closing comment tag to match: " + startComment.nodeValue);
        return null;
    }

    function getMatchingEndComment(startComment, allowUnbalanced) {
        var allVirtualChildren = getVirtualChildren(startComment, allowUnbalanced);
        if (allVirtualChildren) {
            if (allVirtualChildren.length > 0)
                return allVirtualChildren[allVirtualChildren.length - 1].nextSibling;
            return startComment.nextSibling;
        } else
            return null; // Must have no matching end comment, and allowUnbalanced is true
    }

    function getUnbalancedChildTags(node) {
        // e.g., from <div>OK</div><!-- ko blah --><span>Another</span>, returns: <!-- ko blah --><span>Another</span>
        //       from <div>OK</div><!-- /ko --><!-- /ko -->,             returns: <!-- /ko --><!-- /ko -->
        var childNode = node.firstChild, captureRemaining = null;
        if (childNode) {
            do {
                if (captureRemaining)                   // We already hit an unbalanced node and are now just scooping up all subsequent nodes
                    captureRemaining.push(childNode);
                else if (isStartComment(childNode)) {
                    var matchingEndComment = getMatchingEndComment(childNode, /* allowUnbalanced: */ true);
                    if (matchingEndComment)             // It's a balanced tag, so skip immediately to the end of this virtual set
                        childNode = matchingEndComment;
                    else
                        captureRemaining = [childNode]; // It's unbalanced, so start capturing from this point
                } else if (isEndComment(childNode)) {
                    captureRemaining = [childNode];     // It's unbalanced (if it wasn't, we'd have skipped over it already), so start capturing
                }
            } while (childNode = childNode.nextSibling);
        }
        return captureRemaining;
    }

    ko.virtualElements = {
        allowedBindings: {},

        childNodes: function(node) {
            return isStartComment(node) ? getVirtualChildren(node) : node.childNodes;
        },

        emptyNode: function(node) {
            if (!isStartComment(node))
                ko.utils.emptyDomNode(node);
            else {
                var virtualChildren = ko.virtualElements.childNodes(node);
                for (var i = 0, j = virtualChildren.length; i < j; i++)
                    ko.removeNode(virtualChildren[i]);
            }
        },

        setDomNodeChildren: function(node, childNodes) {
            if (!isStartComment(node))
                ko.utils.setDomNodeChildren(node, childNodes);
            else {
                ko.virtualElements.emptyNode(node);
                var endCommentNode = node.nextSibling; // Must be the next sibling, as we just emptied the children
                for (var i = 0, j = childNodes.length; i < j; i++)
                    endCommentNode.parentNode.insertBefore(childNodes[i], endCommentNode);
            }
        },

        prepend: function(containerNode, nodeToPrepend) {
            if (!isStartComment(containerNode)) {
                if (containerNode.firstChild)
                    containerNode.insertBefore(nodeToPrepend, containerNode.firstChild);
                else
                    containerNode.appendChild(nodeToPrepend);
            } else {
                // Start comments must always have a parent and at least one following sibling (the end comment)
                containerNode.parentNode.insertBefore(nodeToPrepend, containerNode.nextSibling);
            }
        },

        insertAfter: function(containerNode, nodeToInsert, insertAfterNode) {
            if (!insertAfterNode) {
                ko.virtualElements.prepend(containerNode, nodeToInsert);
            } else if (!isStartComment(containerNode)) {
                // Insert after insertion point
                if (insertAfterNode.nextSibling)
                    containerNode.insertBefore(nodeToInsert, insertAfterNode.nextSibling);
                else
                    containerNode.appendChild(nodeToInsert);
            } else {
                // Children of start comments must always have a parent and at least one following sibling (the end comment)
                containerNode.parentNode.insertBefore(nodeToInsert, insertAfterNode.nextSibling);
            }
        },

        firstChild: function(node) {
            if (!isStartComment(node))
                return node.firstChild;
            if (!node.nextSibling || isEndComment(node.nextSibling))
                return null;
            return node.nextSibling;
        },

        nextSibling: function(node) {
            if (isStartComment(node))
                node = getMatchingEndComment(node);
            if (node.nextSibling && isEndComment(node.nextSibling))
                return null;
            return node.nextSibling;
        },

        hasBindingValue: isStartComment,

        virtualNodeBindingValue: function(node) {
            var regexMatch = (commentNodesHaveTextProperty ? node.text : node.nodeValue).match(startCommentRegex);
            return regexMatch ? regexMatch[1] : null;
        },

        normaliseVirtualElementDomStructure: function(elementVerified) {
            // Workaround for https://github.com/SteveSanderson/knockout/issues/155
            // (IE <= 8 or IE 9 quirks mode parses your HTML weirdly, treating closing </li> tags as if they don't exist, thereby moving comment nodes
            // that are direct descendants of <ul> into the preceding <li>)
            if (!htmlTagsWithOptionallyClosingChildren[ko.utils.tagNameLower(elementVerified)])
                return;

            // Scan immediate children to see if they contain unbalanced comment tags. If they do, those comment tags
            // must be intended to appear *after* that child, so move them there.
            var childNode = elementVerified.firstChild;
            if (childNode) {
                do {
                    if (childNode.nodeType === 1) {
                        var unbalancedTags = getUnbalancedChildTags(childNode);
                        if (unbalancedTags) {
                            // Fix up the DOM by moving the unbalanced tags to where they most likely were intended to be placed - *after* the child
                            var nodeToInsertBefore = childNode.nextSibling;
                            for (var i = 0; i < unbalancedTags.length; i++) {
                                if (nodeToInsertBefore)
                                    elementVerified.insertBefore(unbalancedTags[i], nodeToInsertBefore);
                                else
                                    elementVerified.appendChild(unbalancedTags[i]);
                            }
                        }
                    }
                } while (childNode = childNode.nextSibling);
            }
        }
    };
})();
ko.exportSymbol('virtualElements', ko.virtualElements);
ko.exportSymbol('virtualElements.allowedBindings', ko.virtualElements.allowedBindings);
ko.exportSymbol('virtualElements.emptyNode', ko.virtualElements.emptyNode);
//ko.exportSymbol('virtualElements.firstChild', ko.virtualElements.firstChild);     // firstChild is not minified
ko.exportSymbol('virtualElements.insertAfter', ko.virtualElements.insertAfter);
//ko.exportSymbol('virtualElements.nextSibling', ko.virtualElements.nextSibling);   // nextSibling is not minified
ko.exportSymbol('virtualElements.prepend', ko.virtualElements.prepend);
ko.exportSymbol('virtualElements.setDomNodeChildren', ko.virtualElements.setDomNodeChildren);
(function() {
    var defaultBindingAttributeName = "data-bind";

    ko.bindingProvider = function() {
        this.bindingCache = {};
    };

    ko.utils.extend(ko.bindingProvider.prototype, {
        'nodeHasBindings': function(node) {
            switch (node.nodeType) {
                case 1: // Element
                    return node.getAttribute(defaultBindingAttributeName) != null
                        || ko.components['getComponentNameForNode'](node);
                case 8: // Comment node
                    return ko.virtualElements.hasBindingValue(node);
                default: return false;
            }
        },

        'getBindings': function(node, bindingContext) {
            var bindingsString = this['getBindingsString'](node, bindingContext),
                parsedBindings = bindingsString ? this['parseBindingsString'](bindingsString, bindingContext, node) : null;
            return ko.components.addBindingsForCustomElement(parsedBindings, node, bindingContext, /* valueAccessors */ false);
        },

        'getBindingAccessors': function(node, bindingContext) {
            var bindingsString = this['getBindingsString'](node, bindingContext),
                parsedBindings = bindingsString ? this['parseBindingsString'](bindingsString, bindingContext, node, { 'valueAccessors': true }) : null;
            return ko.components.addBindingsForCustomElement(parsedBindings, node, bindingContext, /* valueAccessors */ true);
        },

        // The following function is only used internally by this default provider.
        // It's not part of the interface definition for a general binding provider.
        'getBindingsString': function(node, bindingContext) {
            switch (node.nodeType) {
                case 1: return node.getAttribute(defaultBindingAttributeName);   // Element
                case 8: return ko.virtualElements.virtualNodeBindingValue(node); // Comment node
                default: return null;
            }
        },

        // The following function is only used internally by this default provider.
        // It's not part of the interface definition for a general binding provider.
        'parseBindingsString': function(bindingsString, bindingContext, node, options) {
            try {
                var bindingFunction = createBindingsStringEvaluatorViaCache(bindingsString, this.bindingCache, options);
                return bindingFunction(bindingContext, node);
            } catch (ex) {
                ex.message = "Unable to parse bindings.\nBindings value: " + bindingsString + "\nMessage: " + ex.message;
                throw ex;
            }
        }
    });

    ko.bindingProvider['instance'] = new ko.bindingProvider();

    function createBindingsStringEvaluatorViaCache(bindingsString, cache, options) {
        var cacheKey = bindingsString + (options && options['valueAccessors'] || '');
        return cache[cacheKey]
            || (cache[cacheKey] = createBindingsStringEvaluator(bindingsString, options));
    }

    function createBindingsStringEvaluator(bindingsString, options) {
        // Build the source for a function that evaluates "expression"
        // For each scope variable, add an extra level of "with" nesting
        // Example result: with(sc1) { with(sc0) { return (expression) } }
        var rewrittenBindings = ko.expressionRewriting.preProcessBindings(bindingsString, options),
            functionBody = "with($context){with($data||{}){return{" + rewrittenBindings + "}}}";
        return new Function("$context", "$element", functionBody);
    }
})();

ko.exportSymbol('bindingProvider', ko.bindingProvider);
(function () {
    ko.bindingHandlers = {};

    // The following element types will not be recursed into during binding. In the future, we
    // may consider adding <template> to this list, because such elements' contents are always
    // intended to be bound in a different context from where they appear in the document.
    var bindingDoesNotRecurseIntoElementTypes = {
        // Don't want bindings that operate on text nodes to mutate <script> and <textarea> contents,
        // because it's unexpected and a potential XSS issue
        'script': true,
        'textarea': true
    };

    // Use an overridable method for retrieving binding handlers so that a plugins may support dynamically created handlers
    ko['getBindingHandler'] = function(bindingKey) {
        return ko.bindingHandlers[bindingKey];
    };

    // The ko.bindingContext constructor is only called directly to create the root context. For child
    // contexts, use bindingContext.createChildContext or bindingContext.extend.
    ko.bindingContext = function(dataItemOrAccessor, parentContext, dataItemAlias, extendCallback) {

        // The binding context object includes static properties for the current, parent, and root view models.
        // If a view model is actually stored in an observable, the corresponding binding context object, and
        // any child contexts, must be updated when the view model is changed.
        function updateContext() {
            // Most of the time, the context will directly get a view model object, but if a function is given,
            // we call the function to retrieve the view model. If the function accesses any obsevables or returns
            // an observable, the dependency is tracked, and those observables can later cause the binding
            // context to be updated.
            var dataItemOrObservable = isFunc ? dataItemOrAccessor() : dataItemOrAccessor,
                dataItem = ko.utils.unwrapObservable(dataItemOrObservable);

            if (parentContext) {
                // When a "parent" context is given, register a dependency on the parent context. Thus whenever the
                // parent context is updated, this context will also be updated.
                if (parentContext._subscribable)
                    parentContext._subscribable();

                // Copy $root and any custom properties from the parent context
                ko.utils.extend(self, parentContext);

                // Because the above copy overwrites our own properties, we need to reset them.
                // During the first execution, "subscribable" isn't set, so don't bother doing the update then.
                if (subscribable) {
                    self._subscribable = subscribable;
                }
            } else {
                self['$parents'] = [];
                self['$root'] = dataItem;

                // Export 'ko' in the binding context so it will be available in bindings and templates
                // even if 'ko' isn't exported as a global, such as when using an AMD loader.
                // See https://github.com/SteveSanderson/knockout/issues/490
                self['ko'] = ko;
            }
            self['$rawData'] = dataItemOrObservable;
            self['$data'] = dataItem;
            if (dataItemAlias)
                self[dataItemAlias] = dataItem;

            // The extendCallback function is provided when creating a child context or extending a context.
            // It handles the specific actions needed to finish setting up the binding context. Actions in this
            // function could also add dependencies to this binding context.
            if (extendCallback)
                extendCallback(self, parentContext, dataItem);

            return self['$data'];
        }
        function disposeWhen() {
            return nodes && !ko.utils.anyDomNodeIsAttachedToDocument(nodes);
        }

        var self = this,
            isFunc = typeof(dataItemOrAccessor) == "function" && !ko.isObservable(dataItemOrAccessor),
            nodes,
            subscribable = ko.dependentObservable(updateContext, null, { disposeWhen: disposeWhen, disposeWhenNodeIsRemoved: true });

        // At this point, the binding context has been initialized, and the "subscribable" computed observable is
        // subscribed to any observables that were accessed in the process. If there is nothing to track, the
        // computed will be inactive, and we can safely throw it away. If it's active, the computed is stored in
        // the context object.
        if (subscribable.isActive()) {
            self._subscribable = subscribable;

            // Always notify because even if the model ($data) hasn't changed, other context properties might have changed
            subscribable['equalityComparer'] = null;

            // We need to be able to dispose of this computed observable when it's no longer needed. This would be
            // easy if we had a single node to watch, but binding contexts can be used by many different nodes, and
            // we cannot assume that those nodes have any relation to each other. So instead we track any node that
            // the context is attached to, and dispose the computed when all of those nodes have been cleaned.

            // Add properties to *subscribable* instead of *self* because any properties added to *self* may be overwritten on updates
            nodes = [];
            subscribable._addNode = function(node) {
                nodes.push(node);
                ko.utils.domNodeDisposal.addDisposeCallback(node, function(node) {
                    ko.utils.arrayRemoveItem(nodes, node);
                    if (!nodes.length) {
                        subscribable.dispose();
                        self._subscribable = subscribable = undefined;
                    }
                });
            };
        }
    }

    // Extend the binding context hierarchy with a new view model object. If the parent context is watching
    // any obsevables, the new child context will automatically get a dependency on the parent context.
    // But this does not mean that the $data value of the child context will also get updated. If the child
    // view model also depends on the parent view model, you must provide a function that returns the correct
    // view model on each update.
    ko.bindingContext.prototype['createChildContext'] = function (dataItemOrAccessor, dataItemAlias, extendCallback) {
        return new ko.bindingContext(dataItemOrAccessor, this, dataItemAlias, function(self, parentContext) {
            // Extend the context hierarchy by setting the appropriate pointers
            self['$parentContext'] = parentContext;
            self['$parent'] = parentContext['$data'];
            self['$parents'] = (parentContext['$parents'] || []).slice(0);
            self['$parents'].unshift(self['$parent']);
            if (extendCallback)
                extendCallback(self);
        });
    };

    // Extend the binding context with new custom properties. This doesn't change the context hierarchy.
    // Similarly to "child" contexts, provide a function here to make sure that the correct values are set
    // when an observable view model is updated.
    ko.bindingContext.prototype['extend'] = function(properties) {
        // If the parent context references an observable view model, "_subscribable" will always be the
        // latest view model object. If not, "_subscribable" isn't set, and we can use the static "$data" value.
        return new ko.bindingContext(this._subscribable || this['$data'], this, null, function(self, parentContext) {
            // This "child" context doesn't directly track a parent observable view model,
            // so we need to manually set the $rawData value to match the parent.
            self['$rawData'] = parentContext['$rawData'];
            ko.utils.extend(self, typeof(properties) == "function" ? properties() : properties);
        });
    };

    // Returns the valueAccesor function for a binding value
    function makeValueAccessor(value) {
        return function() {
            return value;
        };
    }

    // Returns the value of a valueAccessor function
    function evaluateValueAccessor(valueAccessor) {
        return valueAccessor();
    }

    // Given a function that returns bindings, create and return a new object that contains
    // binding value-accessors functions. Each accessor function calls the original function
    // so that it always gets the latest value and all dependencies are captured. This is used
    // by ko.applyBindingsToNode and getBindingsAndMakeAccessors.
    function makeAccessorsFromFunction(callback) {
        return ko.utils.objectMap(ko.dependencyDetection.ignore(callback), function(value, key) {
            return function() {
                return callback()[key];
            };
        });
    }

    // Given a bindings function or object, create and return a new object that contains
    // binding value-accessors functions. This is used by ko.applyBindingsToNode.
    function makeBindingAccessors(bindings, context, node) {
        if (typeof bindings === 'function') {
            return makeAccessorsFromFunction(bindings.bind(null, context, node));
        } else {
            return ko.utils.objectMap(bindings, makeValueAccessor);
        }
    }

    // This function is used if the binding provider doesn't include a getBindingAccessors function.
    // It must be called with 'this' set to the provider instance.
    function getBindingsAndMakeAccessors(node, context) {
        return makeAccessorsFromFunction(this['getBindings'].bind(this, node, context));
    }

    function validateThatBindingIsAllowedForVirtualElements(bindingName) {
        var validator = ko.virtualElements.allowedBindings[bindingName];
        if (!validator)
            throw new Error("The binding '" + bindingName + "' cannot be used with virtual elements")
    }

    function applyBindingsToDescendantsInternal (bindingContext, elementOrVirtualElement, bindingContextsMayDifferFromDomParentElement) {
        var currentChild,
            nextInQueue = ko.virtualElements.firstChild(elementOrVirtualElement),
            provider = ko.bindingProvider['instance'],
            preprocessNode = provider['preprocessNode'];

        // Preprocessing allows a binding provider to mutate a node before bindings are applied to it. For example it's
        // possible to insert new siblings after it, and/or replace the node with a different one. This can be used to
        // implement custom binding syntaxes, such as {{ value }} for string interpolation, or custom element types that
        // trigger insertion of <template> contents at that point in the document.
        if (preprocessNode) {
            while (currentChild = nextInQueue) {
                nextInQueue = ko.virtualElements.nextSibling(currentChild);
                preprocessNode.call(provider, currentChild);
            }
            // Reset nextInQueue for the next loop
            nextInQueue = ko.virtualElements.firstChild(elementOrVirtualElement);
        }

        while (currentChild = nextInQueue) {
            // Keep a record of the next child *before* applying bindings, in case the binding removes the current child from its position
            nextInQueue = ko.virtualElements.nextSibling(currentChild);
            applyBindingsToNodeAndDescendantsInternal(bindingContext, currentChild, bindingContextsMayDifferFromDomParentElement);
        }
    }

    function applyBindingsToNodeAndDescendantsInternal (bindingContext, nodeVerified, bindingContextMayDifferFromDomParentElement) {
        var shouldBindDescendants = true;

        // Perf optimisation: Apply bindings only if...
        // (1) We need to store the binding context on this node (because it may differ from the DOM parent node's binding context)
        //     Note that we can't store binding contexts on non-elements (e.g., text nodes), as IE doesn't allow expando properties for those
        // (2) It might have bindings (e.g., it has a data-bind attribute, or it's a marker for a containerless template)
        var isElement = (nodeVerified.nodeType === 1);
        if (isElement) // Workaround IE <= 8 HTML parsing weirdness
            ko.virtualElements.normaliseVirtualElementDomStructure(nodeVerified);

        var shouldApplyBindings = (isElement && bindingContextMayDifferFromDomParentElement)             // Case (1)
                               || ko.bindingProvider['instance']['nodeHasBindings'](nodeVerified);       // Case (2)
        if (shouldApplyBindings)
            shouldBindDescendants = applyBindingsToNodeInternal(nodeVerified, null, bindingContext, bindingContextMayDifferFromDomParentElement)['shouldBindDescendants'];

        if (shouldBindDescendants && !bindingDoesNotRecurseIntoElementTypes[ko.utils.tagNameLower(nodeVerified)]) {
            // We're recursing automatically into (real or virtual) child nodes without changing binding contexts. So,
            //  * For children of a *real* element, the binding context is certainly the same as on their DOM .parentNode,
            //    hence bindingContextsMayDifferFromDomParentElement is false
            //  * For children of a *virtual* element, we can't be sure. Evaluating .parentNode on those children may
            //    skip over any number of intermediate virtual elements, any of which might define a custom binding context,
            //    hence bindingContextsMayDifferFromDomParentElement is true
            applyBindingsToDescendantsInternal(bindingContext, nodeVerified, /* bindingContextsMayDifferFromDomParentElement: */ !isElement);
        }
    }

    var boundElementDomDataKey = ko.utils.domData.nextKey();


    function topologicalSortBindings(bindings) {
        // Depth-first sort
        var result = [],                // The list of key/handler pairs that we will return
            bindingsConsidered = {},    // A temporary record of which bindings are already in 'result'
            cyclicDependencyStack = []; // Keeps track of a depth-search so that, if there's a cycle, we know which bindings caused it
        ko.utils.objectForEach(bindings, function pushBinding(bindingKey) {
            if (!bindingsConsidered[bindingKey]) {
                var binding = ko['getBindingHandler'](bindingKey);
                if (binding) {
                    // First add dependencies (if any) of the current binding
                    if (binding['after']) {
                        cyclicDependencyStack.push(bindingKey);
                        ko.utils.arrayForEach(binding['after'], function(bindingDependencyKey) {
                            if (bindings[bindingDependencyKey]) {
                                if (ko.utils.arrayIndexOf(cyclicDependencyStack, bindingDependencyKey) !== -1) {
                                    throw Error("Cannot combine the following bindings, because they have a cyclic dependency: " + cyclicDependencyStack.join(", "));
                                } else {
                                    pushBinding(bindingDependencyKey);
                                }
                            }
                        });
                        cyclicDependencyStack.length--;
                    }
                    // Next add the current binding
                    result.push({ key: bindingKey, handler: binding });
                }
                bindingsConsidered[bindingKey] = true;
            }
        });

        return result;
    }

    function applyBindingsToNodeInternal(node, sourceBindings, bindingContext, bindingContextMayDifferFromDomParentElement) {
        // Prevent multiple applyBindings calls for the same node, except when a binding value is specified
        var alreadyBound = ko.utils.domData.get(node, boundElementDomDataKey);
        if (!sourceBindings) {
            if (alreadyBound) {
                throw Error("You cannot apply bindings multiple times to the same element.");
            }
            ko.utils.domData.set(node, boundElementDomDataKey, true);
        }

        // Optimization: Don't store the binding context on this node if it's definitely the same as on node.parentNode, because
        // we can easily recover it just by scanning up the node's ancestors in the DOM
        // (note: here, parent node means "real DOM parent" not "virtual parent", as there's no O(1) way to find the virtual parent)
        if (!alreadyBound && bindingContextMayDifferFromDomParentElement)
            ko.storedBindingContextForNode(node, bindingContext);

        // Use bindings if given, otherwise fall back on asking the bindings provider to give us some bindings
        var bindings;
        if (sourceBindings && typeof sourceBindings !== 'function') {
            bindings = sourceBindings;
        } else {
            var provider = ko.bindingProvider['instance'],
                getBindings = provider['getBindingAccessors'] || getBindingsAndMakeAccessors;

            // Get the binding from the provider within a computed observable so that we can update the bindings whenever
            // the binding context is updated or if the binding provider accesses observables.
            var bindingsUpdater = ko.dependentObservable(
                function() {
                    bindings = sourceBindings ? sourceBindings(bindingContext, node) : getBindings.call(provider, node, bindingContext);
                    // Register a dependency on the binding context to support obsevable view models.
                    if (bindings && bindingContext._subscribable)
                        bindingContext._subscribable();
                    return bindings;
                },
                null, { disposeWhenNodeIsRemoved: node }
            );

            if (!bindings || !bindingsUpdater.isActive())
                bindingsUpdater = null;
        }

        var bindingHandlerThatControlsDescendantBindings;
        if (bindings) {
            // Return the value accessor for a given binding. When bindings are static (won't be updated because of a binding
            // context update), just return the value accessor from the binding. Otherwise, return a function that always gets
            // the latest binding value and registers a dependency on the binding updater.
            var getValueAccessor = bindingsUpdater
                ? function(bindingKey) {
                    return function() {
                        return evaluateValueAccessor(bindingsUpdater()[bindingKey]);
                    };
                } : function(bindingKey) {
                    return bindings[bindingKey];
                };

            // Use of allBindings as a function is maintained for backwards compatibility, but its use is deprecated
            function allBindings() {
                return ko.utils.objectMap(bindingsUpdater ? bindingsUpdater() : bindings, evaluateValueAccessor);
            }
            // The following is the 3.x allBindings API
            allBindings['get'] = function(key) {
                return bindings[key] && evaluateValueAccessor(getValueAccessor(key));
            };
            allBindings['has'] = function(key) {
                return key in bindings;
            };

            // First put the bindings into the right order
            var orderedBindings = topologicalSortBindings(bindings);

            // Go through the sorted bindings, calling init and update for each
            ko.utils.arrayForEach(orderedBindings, function(bindingKeyAndHandler) {
                // Note that topologicalSortBindings has already filtered out any nonexistent binding handlers,
                // so bindingKeyAndHandler.handler will always be nonnull.
                var handlerInitFn = bindingKeyAndHandler.handler["init"],
                    handlerUpdateFn = bindingKeyAndHandler.handler["update"],
                    bindingKey = bindingKeyAndHandler.key;

                if (node.nodeType === 8) {
                    validateThatBindingIsAllowedForVirtualElements(bindingKey);
                }

                try {
                    // Run init, ignoring any dependencies
                    if (typeof handlerInitFn == "function") {
                        ko.dependencyDetection.ignore(function() {
                            var initResult = handlerInitFn(node, getValueAccessor(bindingKey), allBindings, bindingContext['$data'], bindingContext);

                            // If this binding handler claims to control descendant bindings, make a note of this
                            if (initResult && initResult['controlsDescendantBindings']) {
                                if (bindingHandlerThatControlsDescendantBindings !== undefined)
                                    throw new Error("Multiple bindings (" + bindingHandlerThatControlsDescendantBindings + " and " + bindingKey + ") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");
                                bindingHandlerThatControlsDescendantBindings = bindingKey;
                            }
                        });
                    }

                    // Run update in its own computed wrapper
                    if (typeof handlerUpdateFn == "function") {
                        ko.dependentObservable(
                            function() {
                                handlerUpdateFn(node, getValueAccessor(bindingKey), allBindings, bindingContext['$data'], bindingContext);
                            },
                            null,
                            { disposeWhenNodeIsRemoved: node }
                        );
                    }
                } catch (ex) {
                    ex.message = "Unable to process binding \"" + bindingKey + ": " + bindings[bindingKey] + "\"\nMessage: " + ex.message;
                    throw ex;
                }
            });
        }

        return {
            'shouldBindDescendants': bindingHandlerThatControlsDescendantBindings === undefined
        };
    };

    var storedBindingContextDomDataKey = ko.utils.domData.nextKey();
    ko.storedBindingContextForNode = function (node, bindingContext) {
        if (arguments.length == 2) {
            ko.utils.domData.set(node, storedBindingContextDomDataKey, bindingContext);
            if (bindingContext._subscribable)
                bindingContext._subscribable._addNode(node);
        } else {
            return ko.utils.domData.get(node, storedBindingContextDomDataKey);
        }
    }

    function getBindingContext(viewModelOrBindingContext) {
        return viewModelOrBindingContext && (viewModelOrBindingContext instanceof ko.bindingContext)
            ? viewModelOrBindingContext
            : new ko.bindingContext(viewModelOrBindingContext);
    }

    ko.applyBindingAccessorsToNode = function (node, bindings, viewModelOrBindingContext) {
        if (node.nodeType === 1) // If it's an element, workaround IE <= 8 HTML parsing weirdness
            ko.virtualElements.normaliseVirtualElementDomStructure(node);
        return applyBindingsToNodeInternal(node, bindings, getBindingContext(viewModelOrBindingContext), true);
    };

    ko.applyBindingsToNode = function (node, bindings, viewModelOrBindingContext) {
        var context = getBindingContext(viewModelOrBindingContext);
        return ko.applyBindingAccessorsToNode(node, makeBindingAccessors(bindings, context, node), context);
    };

    ko.applyBindingsToDescendants = function(viewModelOrBindingContext, rootNode) {
        if (rootNode.nodeType === 1 || rootNode.nodeType === 8)
            applyBindingsToDescendantsInternal(getBindingContext(viewModelOrBindingContext), rootNode, true);
    };

    ko.applyBindings = function (viewModelOrBindingContext, rootNode) {
        // If jQuery is loaded after Knockout, we won't initially have access to it. So save it here.
        if (!jQueryInstance && window['jQuery']) {
            jQueryInstance = window['jQuery'];
        }

        if (rootNode && (rootNode.nodeType !== 1) && (rootNode.nodeType !== 8))
            throw new Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");
        rootNode = rootNode || window.document.body; // Make "rootNode" parameter optional

        applyBindingsToNodeAndDescendantsInternal(getBindingContext(viewModelOrBindingContext), rootNode, true);
    };

    // Retrieving binding context from arbitrary nodes
    ko.contextFor = function(node) {
        // We can only do something meaningful for elements and comment nodes (in particular, not text nodes, as IE can't store domdata for them)
        switch (node.nodeType) {
            case 1:
            case 8:
                var context = ko.storedBindingContextForNode(node);
                if (context) return context;
                if (node.parentNode) return ko.contextFor(node.parentNode);
                break;
        }
        return undefined;
    };
    ko.dataFor = function(node) {
        var context = ko.contextFor(node);
        return context ? context['$data'] : undefined;
    };

    ko.exportSymbol('bindingHandlers', ko.bindingHandlers);
    ko.exportSymbol('applyBindings', ko.applyBindings);
    ko.exportSymbol('applyBindingsToDescendants', ko.applyBindingsToDescendants);
    ko.exportSymbol('applyBindingAccessorsToNode', ko.applyBindingAccessorsToNode);
    ko.exportSymbol('applyBindingsToNode', ko.applyBindingsToNode);
    ko.exportSymbol('contextFor', ko.contextFor);
    ko.exportSymbol('dataFor', ko.dataFor);
})();
(function(undefined) {
    var loadingSubscribablesCache = {}, // Tracks component loads that are currently in flight
        loadedDefinitionsCache = {};    // Tracks component loads that have already completed

    ko.components = {
        get: function(componentName, callback) {
            var cachedDefinition = getObjectOwnProperty(loadedDefinitionsCache, componentName);
            if (cachedDefinition) {
                // It's already loaded and cached. Reuse the same definition object.
                // Note that for API consistency, even cache hits complete asynchronously by default.
                // You can bypass this by putting synchronous:true on your component config.
                if (cachedDefinition.isSynchronousComponent) {
                    ko.dependencyDetection.ignore(function() { // See comment in loaderRegistryBehaviors.js for reasoning
                        callback(cachedDefinition.definition);
                    });
                } else {
                    setTimeout(function() { callback(cachedDefinition.definition); }, 0);
                }
            } else {
                // Join the loading process that is already underway, or start a new one.
                loadComponentAndNotify(componentName, callback);
            }
        },

        clearCachedDefinition: function(componentName) {
            delete loadedDefinitionsCache[componentName];
        },

        _getFirstResultFromLoaders: getFirstResultFromLoaders
    };

    function getObjectOwnProperty(obj, propName) {
        return obj.hasOwnProperty(propName) ? obj[propName] : undefined;
    }

    function loadComponentAndNotify(componentName, callback) {
        var subscribable = getObjectOwnProperty(loadingSubscribablesCache, componentName),
            completedAsync;
        if (!subscribable) {
            // It's not started loading yet. Start loading, and when it's done, move it to loadedDefinitionsCache.
            subscribable = loadingSubscribablesCache[componentName] = new ko.subscribable();
            subscribable.subscribe(callback);

            beginLoadingComponent(componentName, function(definition, config) {
                var isSynchronousComponent = !!(config && config['synchronous']);
                loadedDefinitionsCache[componentName] = { definition: definition, isSynchronousComponent: isSynchronousComponent };
                delete loadingSubscribablesCache[componentName];

                // For API consistency, all loads complete asynchronously. However we want to avoid
                // adding an extra setTimeout if it's unnecessary (i.e., the completion is already
                // async) since setTimeout(..., 0) still takes about 16ms or more on most browsers.
                //
                // You can bypass the 'always synchronous' feature by putting the synchronous:true
                // flag on your component configuration when you register it.
                if (completedAsync || isSynchronousComponent) {
                    // Note that notifySubscribers ignores any dependencies read within the callback.
                    // See comment in loaderRegistryBehaviors.js for reasoning
                    subscribable['notifySubscribers'](definition);
                } else {
                    setTimeout(function() {
                        subscribable['notifySubscribers'](definition);
                    }, 0);
                }
            });
            completedAsync = true;
        } else {
            subscribable.subscribe(callback);
        }
    }

    function beginLoadingComponent(componentName, callback) {
        getFirstResultFromLoaders('getConfig', [componentName], function(config) {
            if (config) {
                // We have a config, so now load its definition
                getFirstResultFromLoaders('loadComponent', [componentName, config], function(definition) {
                    callback(definition, config);
                });
            } else {
                // The component has no config - it's unknown to all the loaders.
                // Note that this is not an error (e.g., a module loading error) - that would abort the
                // process and this callback would not run. For this callback to run, all loaders must
                // have confirmed they don't know about this component.
                callback(null, null);
            }
        });
    }

    function getFirstResultFromLoaders(methodName, argsExceptCallback, callback, candidateLoaders) {
        // On the first call in the stack, start with the full set of loaders
        if (!candidateLoaders) {
            candidateLoaders = ko.components['loaders'].slice(0); // Use a copy, because we'll be mutating this array
        }

        // Try the next candidate
        var currentCandidateLoader = candidateLoaders.shift();
        if (currentCandidateLoader) {
            var methodInstance = currentCandidateLoader[methodName];
            if (methodInstance) {
                var wasAborted = false,
                    synchronousReturnValue = methodInstance.apply(currentCandidateLoader, argsExceptCallback.concat(function(result) {
                        if (wasAborted) {
                            callback(null);
                        } else if (result !== null) {
                            // This candidate returned a value. Use it.
                            callback(result);
                        } else {
                            // Try the next candidate
                            getFirstResultFromLoaders(methodName, argsExceptCallback, callback, candidateLoaders);
                        }
                    }));

                // Currently, loaders may not return anything synchronously. This leaves open the possibility
                // that we'll extend the API to support synchronous return values in the future. It won't be
                // a breaking change, because currently no loader is allowed to return anything except undefined.
                if (synchronousReturnValue !== undefined) {
                    wasAborted = true;

                    // Method to suppress exceptions will remain undocumented. This is only to keep
                    // KO's specs running tidily, since we can observe the loading got aborted without
                    // having exceptions cluttering up the console too.
                    if (!currentCandidateLoader['suppressLoaderExceptions']) {
                        throw new Error('Component loaders must supply values by invoking the callback, not by returning values synchronously.');
                    }
                }
            } else {
                // This candidate doesn't have the relevant handler. Synchronously move on to the next one.
                getFirstResultFromLoaders(methodName, argsExceptCallback, callback, candidateLoaders);
            }
        } else {
            // No candidates returned a value
            callback(null);
        }
    }

    // Reference the loaders via string name so it's possible for developers
    // to replace the whole array by assigning to ko.components.loaders
    ko.components['loaders'] = [];

    ko.exportSymbol('components', ko.components);
    ko.exportSymbol('components.get', ko.components.get);
    ko.exportSymbol('components.clearCachedDefinition', ko.components.clearCachedDefinition);
})();
(function(undefined) {

    // The default loader is responsible for two things:
    // 1. Maintaining the default in-memory registry of component configuration objects
    //    (i.e., the thing you're writing to when you call ko.components.register(someName, ...))
    // 2. Answering requests for components by fetching configuration objects
    //    from that default in-memory registry and resolving them into standard
    //    component definition objects (of the form { createViewModel: ..., template: ... })
    // Custom loaders may override either of these facilities, i.e.,
    // 1. To supply configuration objects from some other source (e.g., conventions)
    // 2. Or, to resolve configuration objects by loading viewmodels/templates via arbitrary logic.

    var defaultConfigRegistry = {};

    ko.components.register = function(componentName, config) {
        if (!config) {
            throw new Error('Invalid configuration for ' + componentName);
        }

        if (ko.components.isRegistered(componentName)) {
            throw new Error('Component ' + componentName + ' is already registered');
        }

        defaultConfigRegistry[componentName] = config;
    }

    ko.components.isRegistered = function(componentName) {
        return componentName in defaultConfigRegistry;
    }

    ko.components.unregister = function(componentName) {
        delete defaultConfigRegistry[componentName];
        ko.components.clearCachedDefinition(componentName);
    }

    ko.components.defaultLoader = {
        'getConfig': function(componentName, callback) {
            var result = defaultConfigRegistry.hasOwnProperty(componentName)
                ? defaultConfigRegistry[componentName]
                : null;
            callback(result);
        },

        'loadComponent': function(componentName, config, callback) {
            var errorCallback = makeErrorCallback(componentName);
            possiblyGetConfigFromAmd(errorCallback, config, function(loadedConfig) {
                resolveConfig(componentName, errorCallback, loadedConfig, callback);
            });
        },

        'loadTemplate': function(componentName, templateConfig, callback) {
            resolveTemplate(makeErrorCallback(componentName), templateConfig, callback);
        },

        'loadViewModel': function(componentName, viewModelConfig, callback) {
            resolveViewModel(makeErrorCallback(componentName), viewModelConfig, callback);
        }
    };

    var createViewModelKey = 'createViewModel';

    // Takes a config object of the form { template: ..., viewModel: ... }, and asynchronously convert it
    // into the standard component definition format:
    //    { template: <ArrayOfDomNodes>, createViewModel: function(params, componentInfo) { ... } }.
    // Since both template and viewModel may need to be resolved asynchronously, both tasks are performed
    // in parallel, and the results joined when both are ready. We don't depend on any promises infrastructure,
    // so this is implemented manually below.
    function resolveConfig(componentName, errorCallback, config, callback) {
        var result = {},
            makeCallBackWhenZero = 2,
            tryIssueCallback = function() {
                if (--makeCallBackWhenZero === 0) {
                    callback(result);
                }
            },
            templateConfig = config['template'],
            viewModelConfig = config['viewModel'];

        if (templateConfig) {
            possiblyGetConfigFromAmd(errorCallback, templateConfig, function(loadedConfig) {
                ko.components._getFirstResultFromLoaders('loadTemplate', [componentName, loadedConfig], function(resolvedTemplate) {
                    result['template'] = resolvedTemplate;
                    tryIssueCallback();
                });
            });
        } else {
            tryIssueCallback();
        }

        if (viewModelConfig) {
            possiblyGetConfigFromAmd(errorCallback, viewModelConfig, function(loadedConfig) {
                ko.components._getFirstResultFromLoaders('loadViewModel', [componentName, loadedConfig], function(resolvedViewModel) {
                    result[createViewModelKey] = resolvedViewModel;
                    tryIssueCallback();
                });
            });
        } else {
            tryIssueCallback();
        }
    }

    function resolveTemplate(errorCallback, templateConfig, callback) {
        if (typeof templateConfig === 'string') {
            // Markup - parse it
            callback(ko.utils.parseHtmlFragment(templateConfig));
        } else if (templateConfig instanceof Array) {
            // Assume already an array of DOM nodes - pass through unchanged
            callback(templateConfig);
        } else if (isDocumentFragment(templateConfig)) {
            // Document fragment - use its child nodes
            callback(ko.utils.makeArray(templateConfig.childNodes));
        } else if (templateConfig['element']) {
            var element = templateConfig['element'];
            if (isDomElement(element)) {
                // Element instance - copy its child nodes
                callback(cloneNodesFromTemplateSourceElement(element));
            } else if (typeof element === 'string') {
                // Element ID - find it, then copy its child nodes
                var elemInstance = document.getElementById(element);
                if (elemInstance) {
                    callback(cloneNodesFromTemplateSourceElement(elemInstance));
                } else {
                    errorCallback('Cannot find element with ID ' + element);
                }
            } else {
                errorCallback('Unknown element type: ' + element);
            }
        } else {
            errorCallback('Unknown template value: ' + templateConfig);
        }
    }

    function resolveViewModel(errorCallback, viewModelConfig, callback) {
        if (typeof viewModelConfig === 'function') {
            // Constructor - convert to standard factory function format
            // By design, this does *not* supply componentInfo to the constructor, as the intent is that
            // componentInfo contains non-viewmodel data (e.g., the component's element) that should only
            // be used in factory functions, not viewmodel constructors.
            callback(function (params /*, componentInfo */) {
                return new viewModelConfig(params);
            });
        } else if (typeof viewModelConfig[createViewModelKey] === 'function') {
            // Already a factory function - use it as-is
            callback(viewModelConfig[createViewModelKey]);
        } else if ('instance' in viewModelConfig) {
            // Fixed object instance - promote to createViewModel format for API consistency
            var fixedInstance = viewModelConfig['instance'];
            callback(function (params, componentInfo) {
                return fixedInstance;
            });
        } else if ('viewModel' in viewModelConfig) {
            // Resolved AMD module whose value is of the form { viewModel: ... }
            resolveViewModel(errorCallback, viewModelConfig['viewModel'], callback);
        } else {
            errorCallback('Unknown viewModel value: ' + viewModelConfig);
        }
    }

    function cloneNodesFromTemplateSourceElement(elemInstance) {
        switch (ko.utils.tagNameLower(elemInstance)) {
            case 'script':
                return ko.utils.parseHtmlFragment(elemInstance.text);
            case 'textarea':
                return ko.utils.parseHtmlFragment(elemInstance.value);
            case 'template':
                // For browsers with proper <template> element support (i.e., where the .content property
                // gives a document fragment), use that document fragment.
                if (isDocumentFragment(elemInstance.content)) {
                    return ko.utils.cloneNodes(elemInstance.content.childNodes);
                }
        }

        // Regular elements such as <div>, and <template> elements on old browsers that don't really
        // understand <template> and just treat it as a regular container
        return ko.utils.cloneNodes(elemInstance.childNodes);
    }

    function isDomElement(obj) {
        if (window['HTMLElement']) {
            return obj instanceof HTMLElement;
        } else {
            return obj && obj.tagName && obj.nodeType === 1;
        }
    }

    function isDocumentFragment(obj) {
        if (window['DocumentFragment']) {
            return obj instanceof DocumentFragment;
        } else {
            return obj && obj.nodeType === 11;
        }
    }

    function possiblyGetConfigFromAmd(errorCallback, config, callback) {
        if (typeof config['require'] === 'string') {
            // The config is the value of an AMD module
            if (amdRequire || window['require']) {
                (amdRequire || window['require'])([config['require']], callback);
            } else {
                errorCallback('Uses require, but no AMD loader is present');
            }
        } else {
            callback(config);
        }
    }

    function makeErrorCallback(componentName) {
        return function (message) {
            throw new Error('Component \'' + componentName + '\': ' + message);
        };
    }

    ko.exportSymbol('components.register', ko.components.register);
    ko.exportSymbol('components.isRegistered', ko.components.isRegistered);
    ko.exportSymbol('components.unregister', ko.components.unregister);

    // Expose the default loader so that developers can directly ask it for configuration
    // or to resolve configuration
    ko.exportSymbol('components.defaultLoader', ko.components.defaultLoader);

    // By default, the default loader is the only registered component loader
    ko.components['loaders'].push(ko.components.defaultLoader);

    // Privately expose the underlying config registry for use in old-IE shim
    ko.components._allRegisteredComponents = defaultConfigRegistry;
})();
(function (undefined) {
    // Overridable API for determining which component name applies to a given node. By overriding this,
    // you can for example map specific tagNames to components that are not preregistered.
    ko.components['getComponentNameForNode'] = function(node) {
        var tagNameLower = ko.utils.tagNameLower(node);
        return ko.components.isRegistered(tagNameLower) && tagNameLower;
    };

    ko.components.addBindingsForCustomElement = function(allBindings, node, bindingContext, valueAccessors) {
        // Determine if it's really a custom element matching a component
        if (node.nodeType === 1) {
            var componentName = ko.components['getComponentNameForNode'](node);
            if (componentName) {
                // It does represent a component, so add a component binding for it
                allBindings = allBindings || {};

                if (allBindings['component']) {
                    // Avoid silently overwriting some other 'component' binding that may already be on the element
                    throw new Error('Cannot use the "component" binding on a custom element matching a component');
                }

                var componentBindingValue = { 'name': componentName, 'params': getComponentParamsFromCustomElement(node, bindingContext) };

                allBindings['component'] = valueAccessors
                    ? function() { return componentBindingValue; }
                    : componentBindingValue;
            }
        }

        return allBindings;
    }

    var nativeBindingProviderInstance = new ko.bindingProvider();

    function getComponentParamsFromCustomElement(elem, bindingContext) {
        var paramsAttribute = elem.getAttribute('params');

        if (paramsAttribute) {
            var params = nativeBindingProviderInstance['parseBindingsString'](paramsAttribute, bindingContext, elem, { 'valueAccessors': true, 'bindingParams': true }),
                rawParamComputedValues = ko.utils.objectMap(params, function(paramValue, paramName) {
                    return ko.computed(paramValue, null, { disposeWhenNodeIsRemoved: elem });
                }),
                result = ko.utils.objectMap(rawParamComputedValues, function(paramValueComputed, paramName) {
                    var paramValue = paramValueComputed.peek();
                    // Does the evaluation of the parameter value unwrap any observables?
                    if (!paramValueComputed.isActive()) {
                        // No it doesn't, so there's no need for any computed wrapper. Just pass through the supplied value directly.
                        // Example: "someVal: firstName, age: 123" (whether or not firstName is an observable/computed)
                        return paramValue;
                    } else {
                        // Yes it does. Supply a computed property that unwraps both the outer (binding expression)
                        // level of observability, and any inner (resulting model value) level of observability.
                        // This means the component doesn't have to worry about multiple unwrapping. If the value is a
                        // writable observable, the computed will also be writable and pass the value on to the observable.
                        return ko.computed({
                            'read': function() {
                                return ko.utils.unwrapObservable(paramValueComputed());
                            },
                            'write': ko.isWriteableObservable(paramValue) && function(value) {
                                paramValueComputed()(value);
                            },
                            disposeWhenNodeIsRemoved: elem
                        });
                    }
                });

            // Give access to the raw computeds, as long as that wouldn't overwrite any custom param also called '$raw'
            // This is in case the developer wants to react to outer (binding) observability separately from inner
            // (model value) observability, or in case the model value observable has subobservables.
            if (!result.hasOwnProperty('$raw')) {
                result['$raw'] = rawParamComputedValues;
            }

            return result;
        } else {
            // For consistency, absence of a "params" attribute is treated the same as the presence of
            // any empty one. Otherwise component viewmodels need special code to check whether or not
            // 'params' or 'params.$raw' is null/undefined before reading subproperties, which is annoying.
            return { '$raw': {} };
        }
    }

    // --------------------------------------------------------------------------------
    // Compatibility code for older (pre-HTML5) IE browsers

    if (ko.utils.ieVersion < 9) {
        // Whenever you preregister a component, enable it as a custom element in the current document
        ko.components['register'] = (function(originalFunction) {
            return function(componentName) {
                document.createElement(componentName); // Allows IE<9 to parse markup containing the custom element
                return originalFunction.apply(this, arguments);
            }
        })(ko.components['register']);

        // Whenever you create a document fragment, enable all preregistered component names as custom elements
        // This is needed to make innerShiv/jQuery HTML parsing correctly handle the custom elements
        document.createDocumentFragment = (function(originalFunction) {
            return function() {
                var newDocFrag = originalFunction(),
                    allComponents = ko.components._allRegisteredComponents;
                for (var componentName in allComponents) {
                    if (allComponents.hasOwnProperty(componentName)) {
                        newDocFrag.createElement(componentName);
                    }
                }
                return newDocFrag;
            };
        })(document.createDocumentFragment);
    }
})();(function(undefined) {

    var componentLoadingOperationUniqueId = 0;

    ko.bindingHandlers['component'] = {
        'init': function(element, valueAccessor, ignored1, ignored2, bindingContext) {
            var currentViewModel,
                currentLoadingOperationId,
                disposeAssociatedComponentViewModel = function () {
                    var currentViewModelDispose = currentViewModel && currentViewModel['dispose'];
                    if (typeof currentViewModelDispose === 'function') {
                        currentViewModelDispose.call(currentViewModel);
                    }

                    // Any in-flight loading operation is no longer relevant, so make sure we ignore its completion
                    currentLoadingOperationId = null;
                },
                originalChildNodes = ko.utils.makeArray(ko.virtualElements.childNodes(element));

            ko.utils.domNodeDisposal.addDisposeCallback(element, disposeAssociatedComponentViewModel);

            ko.computed(function () {
                var value = ko.utils.unwrapObservable(valueAccessor()),
                    componentName, componentParams;

                if (typeof value === 'string') {
                    componentName = value;
                } else {
                    componentName = ko.utils.unwrapObservable(value['name']);
                    componentParams = ko.utils.unwrapObservable(value['params']);
                }

                if (!componentName) {
                    throw new Error('No component name specified');
                }

                var loadingOperationId = currentLoadingOperationId = ++componentLoadingOperationUniqueId;
                ko.components.get(componentName, function(componentDefinition) {
                    // If this is not the current load operation for this element, ignore it.
                    if (currentLoadingOperationId !== loadingOperationId) {
                        return;
                    }

                    // Clean up previous state
                    disposeAssociatedComponentViewModel();

                    // Instantiate and bind new component. Implicitly this cleans any old DOM nodes.
                    if (!componentDefinition) {
                        throw new Error('Unknown component \'' + componentName + '\'');
                    }
                    cloneTemplateIntoElement(componentName, componentDefinition, element);
                    var componentViewModel = createViewModel(componentDefinition, element, originalChildNodes, componentParams),
                        childBindingContext = bindingContext['createChildContext'](componentViewModel, /* dataItemAlias */ undefined, function(ctx) {
                            ctx['$component'] = componentViewModel;
                            ctx['$componentTemplateNodes'] = originalChildNodes;
                        });
                    currentViewModel = componentViewModel;
                    ko.applyBindingsToDescendants(childBindingContext, element);
                });
            }, null, { disposeWhenNodeIsRemoved: element });

            return { 'controlsDescendantBindings': true };
        }
    };

    ko.virtualElements.allowedBindings['component'] = true;

    function cloneTemplateIntoElement(componentName, componentDefinition, element) {
        var template = componentDefinition['template'];
        if (!template) {
            throw new Error('Component \'' + componentName + '\' has no template');
        }

        var clonedNodesArray = ko.utils.cloneNodes(template);
        ko.virtualElements.setDomNodeChildren(element, clonedNodesArray);
    }

    function createViewModel(componentDefinition, element, originalChildNodes, componentParams) {
        var componentViewModelFactory = componentDefinition['createViewModel'];
        return componentViewModelFactory
            ? componentViewModelFactory.call(componentDefinition, componentParams, { 'element': element, 'templateNodes': originalChildNodes })
            : componentParams; // Template-only component
    }

})();
var attrHtmlToJavascriptMap = { 'class': 'className', 'for': 'htmlFor' };
ko.bindingHandlers['attr'] = {
    'update': function(element, valueAccessor, allBindings) {
        var value = ko.utils.unwrapObservable(valueAccessor()) || {};
        ko.utils.objectForEach(value, function(attrName, attrValue) {
            attrValue = ko.utils.unwrapObservable(attrValue);

            // To cover cases like "attr: { checked:someProp }", we want to remove the attribute entirely
            // when someProp is a "no value"-like value (strictly null, false, or undefined)
            // (because the absence of the "checked" attr is how to mark an element as not checked, etc.)
            var toRemove = (attrValue === false) || (attrValue === null) || (attrValue === undefined);
            if (toRemove)
                element.removeAttribute(attrName);

            // In IE <= 7 and IE8 Quirks Mode, you have to use the Javascript property name instead of the
            // HTML attribute name for certain attributes. IE8 Standards Mode supports the correct behavior,
            // but instead of figuring out the mode, we'll just set the attribute through the Javascript
            // property for IE <= 8.
            if (ko.utils.ieVersion <= 8 && attrName in attrHtmlToJavascriptMap) {
                attrName = attrHtmlToJavascriptMap[attrName];
                if (toRemove)
                    element.removeAttribute(attrName);
                else
                    element[attrName] = attrValue;
            } else if (!toRemove) {
                element.setAttribute(attrName, attrValue.toString());
            }

            // Treat "name" specially - although you can think of it as an attribute, it also needs
            // special handling on older versions of IE (https://github.com/SteveSanderson/knockout/pull/333)
            // Deliberately being case-sensitive here because XHTML would regard "Name" as a different thing
            // entirely, and there's no strong reason to allow for such casing in HTML.
            if (attrName === "name") {
                ko.utils.setElementName(element, toRemove ? "" : attrValue.toString());
            }
        });
    }
};
(function() {

ko.bindingHandlers['checked'] = {
    'after': ['value', 'attr'],
    'init': function (element, valueAccessor, allBindings) {
        var checkedValue = ko.pureComputed(function() {
            // Treat "value" like "checkedValue" when it is included with "checked" binding
            if (allBindings['has']('checkedValue')) {
                return ko.utils.unwrapObservable(allBindings.get('checkedValue'));
            } else if (allBindings['has']('value')) {
                return ko.utils.unwrapObservable(allBindings.get('value'));
            }

            return element.value;
        });

        function updateModel() {
            // This updates the model value from the view value.
            // It runs in response to DOM events (click) and changes in checkedValue.
            var isChecked = element.checked,
                elemValue = useCheckedValue ? checkedValue() : isChecked;

            // When we're first setting up this computed, don't change any model state.
            if (ko.computedContext.isInitial()) {
                return;
            }

            // We can ignore unchecked radio buttons, because some other radio
            // button will be getting checked, and that one can take care of updating state.
            if (isRadio && !isChecked) {
                return;
            }

            var modelValue = ko.dependencyDetection.ignore(valueAccessor);
            if (isValueArray) {
                if (oldElemValue !== elemValue) {
                    // When we're responding to the checkedValue changing, and the element is
                    // currently checked, replace the old elem value with the new elem value
                    // in the model array.
                    if (isChecked) {
                        ko.utils.addOrRemoveItem(modelValue, elemValue, true);
                        ko.utils.addOrRemoveItem(modelValue, oldElemValue, false);
                    }

                    oldElemValue = elemValue;
                } else {
                    // When we're responding to the user having checked/unchecked a checkbox,
                    // add/remove the element value to the model array.
                    ko.utils.addOrRemoveItem(modelValue, elemValue, isChecked);
                }
            } else {
                ko.expressionRewriting.writeValueToProperty(modelValue, allBindings, 'checked', elemValue, true);
            }
        };

        function updateView() {
            // This updates the view value from the model value.
            // It runs in response to changes in the bound (checked) value.
            var modelValue = ko.utils.unwrapObservable(valueAccessor());

            if (isValueArray) {
                // When a checkbox is bound to an array, being checked represents its value being present in that array
                element.checked = ko.utils.arrayIndexOf(modelValue, checkedValue()) >= 0;
            } else if (isCheckbox) {
                // When a checkbox is bound to any other value (not an array), being checked represents the value being trueish
                element.checked = modelValue;
            } else {
                // For radio buttons, being checked means that the radio button's value corresponds to the model value
                element.checked = (checkedValue() === modelValue);
            }
        };

        var isCheckbox = element.type == "checkbox",
            isRadio = element.type == "radio";

        // Only bind to check boxes and radio buttons
        if (!isCheckbox && !isRadio) {
            return;
        }

        var isValueArray = isCheckbox && (ko.utils.unwrapObservable(valueAccessor()) instanceof Array),
            oldElemValue = isValueArray ? checkedValue() : undefined,
            useCheckedValue = isRadio || isValueArray;

        // IE 6 won't allow radio buttons to be selected unless they have a name
        if (isRadio && !element.name)
            ko.bindingHandlers['uniqueName']['init'](element, function() { return true });

        // Set up two computeds to update the binding:

        // The first responds to changes in the checkedValue value and to element clicks
        ko.computed(updateModel, null, { disposeWhenNodeIsRemoved: element });
        ko.utils.registerEventHandler(element, "click", updateModel);

        // The second responds to changes in the model value (the one associated with the checked binding)
        ko.computed(updateView, null, { disposeWhenNodeIsRemoved: element });
    }
};
ko.expressionRewriting.twoWayBindings['checked'] = true;

ko.bindingHandlers['checkedValue'] = {
    'update': function (element, valueAccessor) {
        element.value = ko.utils.unwrapObservable(valueAccessor());
    }
};

})();var classesWrittenByBindingKey = '__ko__cssValue';
ko.bindingHandlers['css'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        if (value !== null && typeof value == "object") {
            ko.utils.objectForEach(value, function(className, shouldHaveClass) {
                shouldHaveClass = ko.utils.unwrapObservable(shouldHaveClass);
                ko.utils.toggleDomNodeCssClass(element, className, shouldHaveClass);
            });
        } else {
            value = String(value || ''); // Make sure we don't try to store or set a non-string value
            ko.utils.toggleDomNodeCssClass(element, element[classesWrittenByBindingKey], false);
            element[classesWrittenByBindingKey] = value;
            ko.utils.toggleDomNodeCssClass(element, value, true);
        }
    }
};
ko.bindingHandlers['enable'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        if (value && element.disabled)
            element.removeAttribute("disabled");
        else if ((!value) && (!element.disabled))
            element.disabled = true;
    }
};

ko.bindingHandlers['disable'] = {
    'update': function (element, valueAccessor) {
        ko.bindingHandlers['enable']['update'](element, function() { return !ko.utils.unwrapObservable(valueAccessor()) });
    }
};
// For certain common events (currently just 'click'), allow a simplified data-binding syntax
// e.g. click:handler instead of the usual full-length event:{click:handler}
function makeEventHandlerShortcut(eventName) {
    ko.bindingHandlers[eventName] = {
        'init': function(element, valueAccessor, allBindings, viewModel, bindingContext) {
            var newValueAccessor = function () {
                var result = {};
                result[eventName] = valueAccessor();
                return result;
            };
            return ko.bindingHandlers['event']['init'].call(this, element, newValueAccessor, allBindings, viewModel, bindingContext);
        }
    }
}

ko.bindingHandlers['event'] = {
    'init' : function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        var eventsToHandle = valueAccessor() || {};
        ko.utils.objectForEach(eventsToHandle, function(eventName) {
            if (typeof eventName == "string") {
                ko.utils.registerEventHandler(element, eventName, function (event) {
                    var handlerReturnValue;
                    var handlerFunction = valueAccessor()[eventName];
                    if (!handlerFunction)
                        return;

                    try {
                        // Take all the event args, and prefix with the viewmodel
                        var argsForHandler = ko.utils.makeArray(arguments);
                        viewModel = bindingContext['$data'];
                        argsForHandler.unshift(viewModel);
                        handlerReturnValue = handlerFunction.apply(viewModel, argsForHandler);
                    } finally {
                        if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.
                            if (event.preventDefault)
                                event.preventDefault();
                            else
                                event.returnValue = false;
                        }
                    }

                    var bubble = allBindings.get(eventName + 'Bubble') !== false;
                    if (!bubble) {
                        event.cancelBubble = true;
                        if (event.stopPropagation)
                            event.stopPropagation();
                    }
                });
            }
        });
    }
};
// "foreach: someExpression" is equivalent to "template: { foreach: someExpression }"
// "foreach: { data: someExpression, afterAdd: myfn }" is equivalent to "template: { foreach: someExpression, afterAdd: myfn }"
ko.bindingHandlers['foreach'] = {
    makeTemplateValueAccessor: function(valueAccessor) {
        return function() {
            var modelValue = valueAccessor(),
                unwrappedValue = ko.utils.peekObservable(modelValue);    // Unwrap without setting a dependency here

            // If unwrappedValue is the array, pass in the wrapped value on its own
            // The value will be unwrapped and tracked within the template binding
            // (See https://github.com/SteveSanderson/knockout/issues/523)
            if ((!unwrappedValue) || typeof unwrappedValue.length == "number")
                return { 'foreach': modelValue, 'templateEngine': ko.nativeTemplateEngine.instance };

            // If unwrappedValue.data is the array, preserve all relevant options and unwrap again value so we get updates
            ko.utils.unwrapObservable(modelValue);
            return {
                'foreach': unwrappedValue['data'],
                'as': unwrappedValue['as'],
                'includeDestroyed': unwrappedValue['includeDestroyed'],
                'afterAdd': unwrappedValue['afterAdd'],
                'beforeRemove': unwrappedValue['beforeRemove'],
                'afterRender': unwrappedValue['afterRender'],
                'beforeMove': unwrappedValue['beforeMove'],
                'afterMove': unwrappedValue['afterMove'],
                'templateEngine': ko.nativeTemplateEngine.instance
            };
        };
    },
    'init': function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['init'](element, ko.bindingHandlers['foreach'].makeTemplateValueAccessor(valueAccessor));
    },
    'update': function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['update'](element, ko.bindingHandlers['foreach'].makeTemplateValueAccessor(valueAccessor), allBindings, viewModel, bindingContext);
    }
};
ko.expressionRewriting.bindingRewriteValidators['foreach'] = false; // Can't rewrite control flow bindings
ko.virtualElements.allowedBindings['foreach'] = true;
var hasfocusUpdatingProperty = '__ko_hasfocusUpdating';
var hasfocusLastValue = '__ko_hasfocusLastValue';
ko.bindingHandlers['hasfocus'] = {
    'init': function(element, valueAccessor, allBindings) {
        var handleElementFocusChange = function(isFocused) {
            // Where possible, ignore which event was raised and determine focus state using activeElement,
            // as this avoids phantom focus/blur events raised when changing tabs in modern browsers.
            // However, not all KO-targeted browsers (Firefox 2) support activeElement. For those browsers,
            // prevent a loss of focus when changing tabs/windows by setting a flag that prevents hasfocus
            // from calling 'blur()' on the element when it loses focus.
            // Discussion at https://github.com/SteveSanderson/knockout/pull/352
            element[hasfocusUpdatingProperty] = true;
            var ownerDoc = element.ownerDocument;
            if ("activeElement" in ownerDoc) {
                var active;
                try {
                    active = ownerDoc.activeElement;
                } catch(e) {
                    // IE9 throws if you access activeElement during page load (see issue #703)
                    active = ownerDoc.body;
                }
                isFocused = (active === element);
            }
            var modelValue = valueAccessor();
            ko.expressionRewriting.writeValueToProperty(modelValue, allBindings, 'hasfocus', isFocused, true);

            //cache the latest value, so we can avoid unnecessarily calling focus/blur in the update function
            element[hasfocusLastValue] = isFocused;
            element[hasfocusUpdatingProperty] = false;
        };
        var handleElementFocusIn = handleElementFocusChange.bind(null, true);
        var handleElementFocusOut = handleElementFocusChange.bind(null, false);

        ko.utils.registerEventHandler(element, "focus", handleElementFocusIn);
        ko.utils.registerEventHandler(element, "focusin", handleElementFocusIn); // For IE
        ko.utils.registerEventHandler(element, "blur",  handleElementFocusOut);
        ko.utils.registerEventHandler(element, "focusout",  handleElementFocusOut); // For IE
    },
    'update': function(element, valueAccessor) {
        var value = !!ko.utils.unwrapObservable(valueAccessor()); //force boolean to compare with last value
        if (!element[hasfocusUpdatingProperty] && element[hasfocusLastValue] !== value) {
            value ? element.focus() : element.blur();
            ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, value ? "focusin" : "focusout"]); // For IE, which doesn't reliably fire "focus" or "blur" events synchronously
        }
    }
};
ko.expressionRewriting.twoWayBindings['hasfocus'] = true;

ko.bindingHandlers['hasFocus'] = ko.bindingHandlers['hasfocus']; // Make "hasFocus" an alias
ko.expressionRewriting.twoWayBindings['hasFocus'] = true;
ko.bindingHandlers['html'] = {
    'init': function() {
        // Prevent binding on the dynamically-injected HTML (as developers are unlikely to expect that, and it has security implications)
        return { 'controlsDescendantBindings': true };
    },
    'update': function (element, valueAccessor) {
        // setHtml will unwrap the value if needed
        ko.utils.setHtml(element, valueAccessor());
    }
};
// Makes a binding like with or if
function makeWithIfBinding(bindingKey, isWith, isNot, makeContextCallback) {
    ko.bindingHandlers[bindingKey] = {
        'init': function(element, valueAccessor, allBindings, viewModel, bindingContext) {
            var didDisplayOnLastUpdate,
                savedNodes;
            ko.computed(function() {
                var dataValue = ko.utils.unwrapObservable(valueAccessor()),
                    shouldDisplay = !isNot !== !dataValue, // equivalent to isNot ? !dataValue : !!dataValue
                    isFirstRender = !savedNodes,
                    needsRefresh = isFirstRender || isWith || (shouldDisplay !== didDisplayOnLastUpdate);

                if (needsRefresh) {
                    // Save a copy of the inner nodes on the initial update, but only if we have dependencies.
                    if (isFirstRender && ko.computedContext.getDependenciesCount()) {
                        savedNodes = ko.utils.cloneNodes(ko.virtualElements.childNodes(element), true /* shouldCleanNodes */);
                    }

                    if (shouldDisplay) {
                        if (!isFirstRender) {
                            ko.virtualElements.setDomNodeChildren(element, ko.utils.cloneNodes(savedNodes));
                        }
                        ko.applyBindingsToDescendants(makeContextCallback ? makeContextCallback(bindingContext, dataValue) : bindingContext, element);
                    } else {
                        ko.virtualElements.emptyNode(element);
                    }

                    didDisplayOnLastUpdate = shouldDisplay;
                }
            }, null, { disposeWhenNodeIsRemoved: element });
            return { 'controlsDescendantBindings': true };
        }
    };
    ko.expressionRewriting.bindingRewriteValidators[bindingKey] = false; // Can't rewrite control flow bindings
    ko.virtualElements.allowedBindings[bindingKey] = true;
}

// Construct the actual binding handlers
makeWithIfBinding('if');
makeWithIfBinding('ifnot', false /* isWith */, true /* isNot */);
makeWithIfBinding('with', true /* isWith */, false /* isNot */,
    function(bindingContext, dataValue) {
        return bindingContext['createChildContext'](dataValue);
    }
);
var captionPlaceholder = {};
ko.bindingHandlers['options'] = {
    'init': function(element) {
        if (ko.utils.tagNameLower(element) !== "select")
            throw new Error("options binding applies only to SELECT elements");

        // Remove all existing <option>s.
        while (element.length > 0) {
            element.remove(0);
        }

        // Ensures that the binding processor doesn't try to bind the options
        return { 'controlsDescendantBindings': true };
    },
    'update': function (element, valueAccessor, allBindings) {
        function selectedOptions() {
            return ko.utils.arrayFilter(element.options, function (node) { return node.selected; });
        }

        var selectWasPreviouslyEmpty = element.length == 0,
            multiple = element.multiple,
            previousScrollTop = (!selectWasPreviouslyEmpty && multiple) ? element.scrollTop : null,
            unwrappedArray = ko.utils.unwrapObservable(valueAccessor()),
            valueAllowUnset = allBindings.get('valueAllowUnset') && allBindings['has']('value'),
            includeDestroyed = allBindings.get('optionsIncludeDestroyed'),
            arrayToDomNodeChildrenOptions = {},
            captionValue,
            filteredArray,
            previousSelectedValues = [];

        if (!valueAllowUnset) {
            if (multiple) {
                previousSelectedValues = ko.utils.arrayMap(selectedOptions(), ko.selectExtensions.readValue);
            } else if (element.selectedIndex >= 0) {
                previousSelectedValues.push(ko.selectExtensions.readValue(element.options[element.selectedIndex]));
            }
        }

        if (unwrappedArray) {
            if (typeof unwrappedArray.length == "undefined") // Coerce single value into array
                unwrappedArray = [unwrappedArray];

            // Filter out any entries marked as destroyed
            filteredArray = ko.utils.arrayFilter(unwrappedArray, function(item) {
                return includeDestroyed || item === undefined || item === null || !ko.utils.unwrapObservable(item['_destroy']);
            });

            // If caption is included, add it to the array
            if (allBindings['has']('optionsCaption')) {
                captionValue = ko.utils.unwrapObservable(allBindings.get('optionsCaption'));
                // If caption value is null or undefined, don't show a caption
                if (captionValue !== null && captionValue !== undefined) {
                    filteredArray.unshift(captionPlaceholder);
                }
            }
        } else {
            // If a falsy value is provided (e.g. null), we'll simply empty the select element
        }

        function applyToObject(object, predicate, defaultValue) {
            var predicateType = typeof predicate;
            if (predicateType == "function")    // Given a function; run it against the data value
                return predicate(object);
            else if (predicateType == "string") // Given a string; treat it as a property name on the data value
                return object[predicate];
            else                                // Given no optionsText arg; use the data value itself
                return defaultValue;
        }

        // The following functions can run at two different times:
        // The first is when the whole array is being updated directly from this binding handler.
        // The second is when an observable value for a specific array entry is updated.
        // oldOptions will be empty in the first case, but will be filled with the previously generated option in the second.
        var itemUpdate = false;
        function optionForArrayItem(arrayEntry, index, oldOptions) {
            if (oldOptions.length) {
                previousSelectedValues = !valueAllowUnset && oldOptions[0].selected ? [ ko.selectExtensions.readValue(oldOptions[0]) ] : [];
                itemUpdate = true;
            }
            var option = element.ownerDocument.createElement("option");
            if (arrayEntry === captionPlaceholder) {
                ko.utils.setTextContent(option, allBindings.get('optionsCaption'));
                ko.selectExtensions.writeValue(option, undefined);
            } else {
                // Apply a value to the option element
                var optionValue = applyToObject(arrayEntry, allBindings.get('optionsValue'), arrayEntry);
                ko.selectExtensions.writeValue(option, ko.utils.unwrapObservable(optionValue));

                // Apply some text to the option element
                var optionText = applyToObject(arrayEntry, allBindings.get('optionsText'), optionValue);
                ko.utils.setTextContent(option, optionText);
            }
            return [option];
        }

        // By using a beforeRemove callback, we delay the removal until after new items are added. This fixes a selection
        // problem in IE<=8 and Firefox. See https://github.com/knockout/knockout/issues/1208
        arrayToDomNodeChildrenOptions['beforeRemove'] =
            function (option) {
                element.removeChild(option);
            };

        function setSelectionCallback(arrayEntry, newOptions) {
            if (itemUpdate && valueAllowUnset) {
                // The model value is authoritative, so make sure its value is the one selected
                // There is no need to use dependencyDetection.ignore since setDomNodeChildrenFromArrayMapping does so already.
                ko.selectExtensions.writeValue(element, ko.utils.unwrapObservable(allBindings.get('value')), true /* allowUnset */);
            } else if (previousSelectedValues.length) {
                // IE6 doesn't like us to assign selection to OPTION nodes before they're added to the document.
                // That's why we first added them without selection. Now it's time to set the selection.
                var isSelected = ko.utils.arrayIndexOf(previousSelectedValues, ko.selectExtensions.readValue(newOptions[0])) >= 0;
                ko.utils.setOptionNodeSelectionState(newOptions[0], isSelected);

                // If this option was changed from being selected during a single-item update, notify the change
                if (itemUpdate && !isSelected) {
                    ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
                }
            }
        }

        var callback = setSelectionCallback;
        if (allBindings['has']('optionsAfterRender') && typeof allBindings.get('optionsAfterRender') == "function") {
            callback = function(arrayEntry, newOptions) {
                setSelectionCallback(arrayEntry, newOptions);
                ko.dependencyDetection.ignore(allBindings.get('optionsAfterRender'), null, [newOptions[0], arrayEntry !== captionPlaceholder ? arrayEntry : undefined]);
            }
        }

        ko.utils.setDomNodeChildrenFromArrayMapping(element, filteredArray, optionForArrayItem, arrayToDomNodeChildrenOptions, callback);

        ko.dependencyDetection.ignore(function () {
            if (valueAllowUnset) {
                // The model value is authoritative, so make sure its value is the one selected
                ko.selectExtensions.writeValue(element, ko.utils.unwrapObservable(allBindings.get('value')), true /* allowUnset */);
            } else {
                // Determine if the selection has changed as a result of updating the options list
                var selectionChanged;
                if (multiple) {
                    // For a multiple-select box, compare the new selection count to the previous one
                    // But if nothing was selected before, the selection can't have changed
                    selectionChanged = previousSelectedValues.length && selectedOptions().length < previousSelectedValues.length;
                } else {
                    // For a single-select box, compare the current value to the previous value
                    // But if nothing was selected before or nothing is selected now, just look for a change in selection
                    selectionChanged = (previousSelectedValues.length && element.selectedIndex >= 0)
                        ? (ko.selectExtensions.readValue(element.options[element.selectedIndex]) !== previousSelectedValues[0])
                        : (previousSelectedValues.length || element.selectedIndex >= 0);
                }

                // Ensure consistency between model value and selected option.
                // If the dropdown was changed so that selection is no longer the same,
                // notify the value or selectedOptions binding.
                if (selectionChanged) {
                    ko.utils.triggerEvent(element, "change");
                }
            }
        });

        // Workaround for IE bug
        ko.utils.ensureSelectElementIsRenderedCorrectly(element);

        if (previousScrollTop && Math.abs(previousScrollTop - element.scrollTop) > 20)
            element.scrollTop = previousScrollTop;
    }
};
ko.bindingHandlers['options'].optionValueDomDataKey = ko.utils.domData.nextKey();
ko.bindingHandlers['selectedOptions'] = {
    'after': ['options', 'foreach'],
    'init': function (element, valueAccessor, allBindings) {
        ko.utils.registerEventHandler(element, "change", function () {
            var value = valueAccessor(), valueToWrite = [];
            ko.utils.arrayForEach(element.getElementsByTagName("option"), function(node) {
                if (node.selected)
                    valueToWrite.push(ko.selectExtensions.readValue(node));
            });
            ko.expressionRewriting.writeValueToProperty(value, allBindings, 'selectedOptions', valueToWrite);
        });
    },
    'update': function (element, valueAccessor) {
        if (ko.utils.tagNameLower(element) != "select")
            throw new Error("values binding applies only to SELECT elements");

        var newValue = ko.utils.unwrapObservable(valueAccessor());
        if (newValue && typeof newValue.length == "number") {
            ko.utils.arrayForEach(element.getElementsByTagName("option"), function(node) {
                var isSelected = ko.utils.arrayIndexOf(newValue, ko.selectExtensions.readValue(node)) >= 0;
                ko.utils.setOptionNodeSelectionState(node, isSelected);
            });
        }
    }
};
ko.expressionRewriting.twoWayBindings['selectedOptions'] = true;
ko.bindingHandlers['style'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor() || {});
        ko.utils.objectForEach(value, function(styleName, styleValue) {
            styleValue = ko.utils.unwrapObservable(styleValue);

            if (styleValue === null || styleValue === undefined || styleValue === false) {
                // Empty string removes the value, whereas null/undefined have no effect
                styleValue = "";
            }

            element.style[styleName] = styleValue;
        });
    }
};
ko.bindingHandlers['submit'] = {
    'init': function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        if (typeof valueAccessor() != "function")
            throw new Error("The value for a submit binding must be a function");
        ko.utils.registerEventHandler(element, "submit", function (event) {
            var handlerReturnValue;
            var value = valueAccessor();
            try { handlerReturnValue = value.call(bindingContext['$data'], element); }
            finally {
                if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.
                    if (event.preventDefault)
                        event.preventDefault();
                    else
                        event.returnValue = false;
                }
            }
        });
    }
};
ko.bindingHandlers['text'] = {
    'init': function() {
        // Prevent binding on the dynamically-injected text node (as developers are unlikely to expect that, and it has security implications).
        // It should also make things faster, as we no longer have to consider whether the text node might be bindable.
        return { 'controlsDescendantBindings': true };
    },
    'update': function (element, valueAccessor) {
        ko.utils.setTextContent(element, valueAccessor());
    }
};
ko.virtualElements.allowedBindings['text'] = true;
(function () {

if (window && window.navigator) {
    var parseVersion = function (matches) {
        if (matches) {
            return parseFloat(matches[1]);
        }
    };

    // Detect various browser versions because some old versions don't fully support the 'input' event
    var operaVersion = window.opera && window.opera.version && parseInt(window.opera.version()),
        userAgent = window.navigator.userAgent,
        safariVersion = parseVersion(userAgent.match(/^(?:(?!chrome).)*version\/([^ ]*) safari/i)),
        firefoxVersion = parseVersion(userAgent.match(/Firefox\/([^ ]*)/));
}

// IE 8 and 9 have bugs that prevent the normal events from firing when the value changes.
// But it does fire the 'selectionchange' event on many of those, presumably because the
// cursor is moving and that counts as the selection changing. The 'selectionchange' event is
// fired at the document level only and doesn't directly indicate which element changed. We
// set up just one event handler for the document and use 'activeElement' to determine which
// element was changed.
if (ko.utils.ieVersion < 10) {
    var selectionChangeRegisteredName = ko.utils.domData.nextKey(),
        selectionChangeHandlerName = ko.utils.domData.nextKey();
    var selectionChangeHandler = function(event) {
        var target = this.activeElement,
            handler = target && ko.utils.domData.get(target, selectionChangeHandlerName);
        if (handler) {
            handler(event);
        }
    };
    var registerForSelectionChangeEvent = function (element, handler) {
        var ownerDoc = element.ownerDocument;
        if (!ko.utils.domData.get(ownerDoc, selectionChangeRegisteredName)) {
            ko.utils.domData.set(ownerDoc, selectionChangeRegisteredName, true);
            ko.utils.registerEventHandler(ownerDoc, 'selectionchange', selectionChangeHandler);
        }
        ko.utils.domData.set(element, selectionChangeHandlerName, handler);
    };
}

ko.bindingHandlers['textInput'] = {
    'init': function (element, valueAccessor, allBindings) {

        var previousElementValue = element.value,
            timeoutHandle,
            elementValueBeforeEvent;

        var updateModel = function (event) {
            clearTimeout(timeoutHandle);
            elementValueBeforeEvent = timeoutHandle = undefined;

            var elementValue = element.value;
            if (previousElementValue !== elementValue) {
                // Provide a way for tests to know exactly which event was processed
                if (DEBUG && event) element['_ko_textInputProcessedEvent'] = event.type;
                previousElementValue = elementValue;
                ko.expressionRewriting.writeValueToProperty(valueAccessor(), allBindings, 'textInput', elementValue);
            }
        };

        var deferUpdateModel = function (event) {
            if (!timeoutHandle) {
                // The elementValueBeforeEvent variable is set *only* during the brief gap between an
                // event firing and the updateModel function running. This allows us to ignore model
                // updates that are from the previous state of the element, usually due to techniques
                // such as rateLimit. Such updates, if not ignored, can cause keystrokes to be lost.
                elementValueBeforeEvent = element.value;
                var handler = DEBUG ? updateModel.bind(element, {type: event.type}) : updateModel;
                timeoutHandle = setTimeout(handler, 4);
            }
        };

        var updateView = function () {
            var modelValue = ko.utils.unwrapObservable(valueAccessor());

            if (modelValue === null || modelValue === undefined) {
                modelValue = '';
            }

            if (elementValueBeforeEvent !== undefined && modelValue === elementValueBeforeEvent) {
                setTimeout(updateView, 4);
                return;
            }

            // Update the element only if the element and model are different. On some browsers, updating the value
            // will move the cursor to the end of the input, which would be bad while the user is typing.
            if (element.value !== modelValue) {
                previousElementValue = modelValue;  // Make sure we ignore events (propertychange) that result from updating the value
                element.value = modelValue;
            }
        };

        var onEvent = function (event, handler) {
            ko.utils.registerEventHandler(element, event, handler);
        };

        if (DEBUG && ko.bindingHandlers['textInput']['_forceUpdateOn']) {
            // Provide a way for tests to specify exactly which events are bound
            ko.utils.arrayForEach(ko.bindingHandlers['textInput']['_forceUpdateOn'], function(eventName) {
                if (eventName.slice(0,5) == 'after') {
                    onEvent(eventName.slice(5), deferUpdateModel);
                } else {
                    onEvent(eventName, updateModel);
                }
            });
        } else {
            if (ko.utils.ieVersion < 10) {
                // Internet Explorer <= 8 doesn't support the 'input' event, but does include 'propertychange' that fires whenever
                // any property of an element changes. Unlike 'input', it also fires if a property is changed from JavaScript code,
                // but that's an acceptable compromise for this binding. IE 9 does support 'input', but since it doesn't fire it
                // when using autocomplete, we'll use 'propertychange' for it also.
                onEvent('propertychange', function(event) {
                    if (event.propertyName === 'value') {
                        updateModel(event);
                    }
                });

                if (ko.utils.ieVersion == 8) {
                    // IE 8 has a bug where it fails to fire 'propertychange' on the first update following a value change from
                    // JavaScript code. It also doesn't fire if you clear the entire value. To fix this, we bind to the following
                    // events too.
                    onEvent('keyup', updateModel);      // A single keystoke
                    onEvent('keydown', updateModel);    // The first character when a key is held down
                }
                if (ko.utils.ieVersion >= 8) {
                    // Internet Explorer 9 doesn't fire the 'input' event when deleting text, including using
                    // the backspace, delete, or ctrl-x keys, clicking the 'x' to clear the input, dragging text
                    // out of the field, and cutting or deleting text using the context menu. 'selectionchange'
                    // can detect all of those except dragging text out of the field, for which we use 'dragend'.
                    // These are also needed in IE8 because of the bug described above.
                    registerForSelectionChangeEvent(element, updateModel);  // 'selectionchange' covers cut, paste, drop, delete, etc.
                    onEvent('dragend', deferUpdateModel);
                }
            } else {
                // All other supported browsers support the 'input' event, which fires whenever the content of the element is changed
                // through the user interface.
                onEvent('input', updateModel);

                if (safariVersion < 5 && ko.utils.tagNameLower(element) === "textarea") {
                    // Safari <5 doesn't fire the 'input' event for <textarea> elements (it does fire 'textInput'
                    // but only when typing). So we'll just catch as much as we can with keydown, cut, and paste.
                    onEvent('keydown', deferUpdateModel);
                    onEvent('paste', deferUpdateModel);
                    onEvent('cut', deferUpdateModel);
                } else if (operaVersion < 11) {
                    // Opera 10 doesn't always fire the 'input' event for cut, paste, undo & drop operations.
                    // We can try to catch some of those using 'keydown'.
                    onEvent('keydown', deferUpdateModel);
                } else if (firefoxVersion < 4.0) {
                    // Firefox <= 3.6 doesn't fire the 'input' event when text is filled in through autocomplete
                    onEvent('DOMAutoComplete', updateModel);

                    // Firefox <=3.5 doesn't fire the 'input' event when text is dropped into the input.
                    onEvent('dragdrop', updateModel);       // <3.5
                    onEvent('drop', updateModel);           // 3.5
                }
            }
        }

        // Bind to the change event so that we can catch programmatic updates of the value that fire this event.
        onEvent('change', updateModel);

        ko.computed(updateView, null, { disposeWhenNodeIsRemoved: element });
    }
};
ko.expressionRewriting.twoWayBindings['textInput'] = true;

// textinput is an alias for textInput
ko.bindingHandlers['textinput'] = {
    // preprocess is the only way to set up a full alias
    'preprocess': function (value, name, addBinding) {
        addBinding('textInput', value);
    }
};

})();ko.bindingHandlers['uniqueName'] = {
    'init': function (element, valueAccessor) {
        if (valueAccessor()) {
            var name = "ko_unique_" + (++ko.bindingHandlers['uniqueName'].currentIndex);
            ko.utils.setElementName(element, name);
        }
    }
};
ko.bindingHandlers['uniqueName'].currentIndex = 0;
ko.bindingHandlers['value'] = {
    'after': ['options', 'foreach'],
    'init': function (element, valueAccessor, allBindings) {
        // If the value binding is placed on a radio/checkbox, then just pass through to checkedValue and quit
        if (element.tagName.toLowerCase() == "input" && (element.type == "checkbox" || element.type == "radio")) {
            ko.applyBindingAccessorsToNode(element, { 'checkedValue': valueAccessor });
            return;
        }

        // Always catch "change" event; possibly other events too if asked
        var eventsToCatch = ["change"];
        var requestedEventsToCatch = allBindings.get("valueUpdate");
        var propertyChangedFired = false;
        var elementValueBeforeEvent = null;

        if (requestedEventsToCatch) {
            if (typeof requestedEventsToCatch == "string") // Allow both individual event names, and arrays of event names
                requestedEventsToCatch = [requestedEventsToCatch];
            ko.utils.arrayPushAll(eventsToCatch, requestedEventsToCatch);
            eventsToCatch = ko.utils.arrayGetDistinctValues(eventsToCatch);
        }

        var valueUpdateHandler = function() {
            elementValueBeforeEvent = null;
            propertyChangedFired = false;
            var modelValue = valueAccessor();
            var elementValue = ko.selectExtensions.readValue(element);
            ko.expressionRewriting.writeValueToProperty(modelValue, allBindings, 'value', elementValue);
        }

        // Workaround for https://github.com/SteveSanderson/knockout/issues/122
        // IE doesn't fire "change" events on textboxes if the user selects a value from its autocomplete list
        var ieAutoCompleteHackNeeded = ko.utils.ieVersion && element.tagName.toLowerCase() == "input" && element.type == "text"
                                       && element.autocomplete != "off" && (!element.form || element.form.autocomplete != "off");
        if (ieAutoCompleteHackNeeded && ko.utils.arrayIndexOf(eventsToCatch, "propertychange") == -1) {
            ko.utils.registerEventHandler(element, "propertychange", function () { propertyChangedFired = true });
            ko.utils.registerEventHandler(element, "focus", function () { propertyChangedFired = false });
            ko.utils.registerEventHandler(element, "blur", function() {
                if (propertyChangedFired) {
                    valueUpdateHandler();
                }
            });
        }

        ko.utils.arrayForEach(eventsToCatch, function(eventName) {
            // The syntax "after<eventname>" means "run the handler asynchronously after the event"
            // This is useful, for example, to catch "keydown" events after the browser has updated the control
            // (otherwise, ko.selectExtensions.readValue(this) will receive the control's value *before* the key event)
            var handler = valueUpdateHandler;
            if (ko.utils.stringStartsWith(eventName, "after")) {
                handler = function() {
                    // The elementValueBeforeEvent variable is non-null *only* during the brief gap between
                    // a keyX event firing and the valueUpdateHandler running, which is scheduled to happen
                    // at the earliest asynchronous opportunity. We store this temporary information so that
                    // if, between keyX and valueUpdateHandler, the underlying model value changes separately,
                    // we can overwrite that model value change with the value the user just typed. Otherwise,
                    // techniques like rateLimit can trigger model changes at critical moments that will
                    // override the user's inputs, causing keystrokes to be lost.
                    elementValueBeforeEvent = ko.selectExtensions.readValue(element);
                    setTimeout(valueUpdateHandler, 0);
                };
                eventName = eventName.substring("after".length);
            }
            ko.utils.registerEventHandler(element, eventName, handler);
        });

        var updateFromModel = function () {
            var newValue = ko.utils.unwrapObservable(valueAccessor());
            var elementValue = ko.selectExtensions.readValue(element);

            if (elementValueBeforeEvent !== null && newValue === elementValueBeforeEvent) {
                setTimeout(updateFromModel, 0);
                return;
            }

            var valueHasChanged = (newValue !== elementValue);

            if (valueHasChanged) {
                if (ko.utils.tagNameLower(element) === "select") {
                    var allowUnset = allBindings.get('valueAllowUnset');
                    var applyValueAction = function () {
                        ko.selectExtensions.writeValue(element, newValue, allowUnset);
                    };
                    applyValueAction();

                    if (!allowUnset && newValue !== ko.selectExtensions.readValue(element)) {
                        // If you try to set a model value that can't be represented in an already-populated dropdown, reject that change,
                        // because you're not allowed to have a model value that disagrees with a visible UI selection.
                        ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
                    } else {
                        // Workaround for IE6 bug: It won't reliably apply values to SELECT nodes during the same execution thread
                        // right after you've changed the set of OPTION nodes on it. So for that node type, we'll schedule a second thread
                        // to apply the value as well.
                        setTimeout(applyValueAction, 0);
                    }
                } else {
                    ko.selectExtensions.writeValue(element, newValue);
                }
            }
        };

        ko.computed(updateFromModel, null, { disposeWhenNodeIsRemoved: element });
    },
    'update': function() {} // Keep for backwards compatibility with code that may have wrapped value binding
};
ko.expressionRewriting.twoWayBindings['value'] = true;
ko.bindingHandlers['visible'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        var isCurrentlyVisible = !(element.style.display == "none");
        if (value && !isCurrentlyVisible)
            element.style.display = "";
        else if ((!value) && isCurrentlyVisible)
            element.style.display = "none";
    }
};
// 'click' is just a shorthand for the usual full-length event:{click:handler}
makeEventHandlerShortcut('click');
// If you want to make a custom template engine,
//
// [1] Inherit from this class (like ko.nativeTemplateEngine does)
// [2] Override 'renderTemplateSource', supplying a function with this signature:
//
//        function (templateSource, bindingContext, options) {
//            // - templateSource.text() is the text of the template you should render
//            // - bindingContext.$data is the data you should pass into the template
//            //   - you might also want to make bindingContext.$parent, bindingContext.$parents,
//            //     and bindingContext.$root available in the template too
//            // - options gives you access to any other properties set on "data-bind: { template: options }"
//            // - templateDocument is the document object of the template
//            //
//            // Return value: an array of DOM nodes
//        }
//
// [3] Override 'createJavaScriptEvaluatorBlock', supplying a function with this signature:
//
//        function (script) {
//            // Return value: Whatever syntax means "Evaluate the JavaScript statement 'script' and output the result"
//            //               For example, the jquery.tmpl template engine converts 'someScript' to '${ someScript }'
//        }
//
//     This is only necessary if you want to allow data-bind attributes to reference arbitrary template variables.
//     If you don't want to allow that, you can set the property 'allowTemplateRewriting' to false (like ko.nativeTemplateEngine does)
//     and then you don't need to override 'createJavaScriptEvaluatorBlock'.

ko.templateEngine = function () { };

ko.templateEngine.prototype['renderTemplateSource'] = function (templateSource, bindingContext, options, templateDocument) {
    throw new Error("Override renderTemplateSource");
};

ko.templateEngine.prototype['createJavaScriptEvaluatorBlock'] = function (script) {
    throw new Error("Override createJavaScriptEvaluatorBlock");
};

ko.templateEngine.prototype['makeTemplateSource'] = function(template, templateDocument) {
    // Named template
    if (typeof template == "string") {
        templateDocument = templateDocument || document;
        var elem = templateDocument.getElementById(template);
        if (!elem)
            throw new Error("Cannot find template with ID " + template);
        return new ko.templateSources.domElement(elem);
    } else if ((template.nodeType == 1) || (template.nodeType == 8)) {
        // Anonymous template
        return new ko.templateSources.anonymousTemplate(template);
    } else
        throw new Error("Unknown template type: " + template);
};

ko.templateEngine.prototype['renderTemplate'] = function (template, bindingContext, options, templateDocument) {
    var templateSource = this['makeTemplateSource'](template, templateDocument);
    return this['renderTemplateSource'](templateSource, bindingContext, options, templateDocument);
};

ko.templateEngine.prototype['isTemplateRewritten'] = function (template, templateDocument) {
    // Skip rewriting if requested
    if (this['allowTemplateRewriting'] === false)
        return true;
    return this['makeTemplateSource'](template, templateDocument)['data']("isRewritten");
};

ko.templateEngine.prototype['rewriteTemplate'] = function (template, rewriterCallback, templateDocument) {
    var templateSource = this['makeTemplateSource'](template, templateDocument);
    var rewritten = rewriterCallback(templateSource['text']());
    templateSource['text'](rewritten);
    templateSource['data']("isRewritten", true);
};

ko.exportSymbol('templateEngine', ko.templateEngine);

ko.templateRewriting = (function () {
    var memoizeDataBindingAttributeSyntaxRegex = /(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi;
    var memoizeVirtualContainerBindingSyntaxRegex = /<!--\s*ko\b\s*([\s\S]*?)\s*-->/g;

    function validateDataBindValuesForRewriting(keyValueArray) {
        var allValidators = ko.expressionRewriting.bindingRewriteValidators;
        for (var i = 0; i < keyValueArray.length; i++) {
            var key = keyValueArray[i]['key'];
            if (allValidators.hasOwnProperty(key)) {
                var validator = allValidators[key];

                if (typeof validator === "function") {
                    var possibleErrorMessage = validator(keyValueArray[i]['value']);
                    if (possibleErrorMessage)
                        throw new Error(possibleErrorMessage);
                } else if (!validator) {
                    throw new Error("This template engine does not support the '" + key + "' binding within its templates");
                }
            }
        }
    }

    function constructMemoizedTagReplacement(dataBindAttributeValue, tagToRetain, nodeName, templateEngine) {
        var dataBindKeyValueArray = ko.expressionRewriting.parseObjectLiteral(dataBindAttributeValue);
        validateDataBindValuesForRewriting(dataBindKeyValueArray);
        var rewrittenDataBindAttributeValue = ko.expressionRewriting.preProcessBindings(dataBindKeyValueArray, {'valueAccessors':true});

        // For no obvious reason, Opera fails to evaluate rewrittenDataBindAttributeValue unless it's wrapped in an additional
        // anonymous function, even though Opera's built-in debugger can evaluate it anyway. No other browser requires this
        // extra indirection.
        var applyBindingsToNextSiblingScript =
            "ko.__tr_ambtns(function($context,$element){return(function(){return{ " + rewrittenDataBindAttributeValue + " } })()},'" + nodeName.toLowerCase() + "')";
        return templateEngine['createJavaScriptEvaluatorBlock'](applyBindingsToNextSiblingScript) + tagToRetain;
    }

    return {
        ensureTemplateIsRewritten: function (template, templateEngine, templateDocument) {
            if (!templateEngine['isTemplateRewritten'](template, templateDocument))
                templateEngine['rewriteTemplate'](template, function (htmlString) {
                    return ko.templateRewriting.memoizeBindingAttributeSyntax(htmlString, templateEngine);
                }, templateDocument);
        },

        memoizeBindingAttributeSyntax: function (htmlString, templateEngine) {
            return htmlString.replace(memoizeDataBindingAttributeSyntaxRegex, function () {
                return constructMemoizedTagReplacement(/* dataBindAttributeValue: */ arguments[4], /* tagToRetain: */ arguments[1], /* nodeName: */ arguments[2], templateEngine);
            }).replace(memoizeVirtualContainerBindingSyntaxRegex, function() {
                return constructMemoizedTagReplacement(/* dataBindAttributeValue: */ arguments[1], /* tagToRetain: */ "<!-- ko -->", /* nodeName: */ "#comment", templateEngine);
            });
        },

        applyMemoizedBindingsToNextSibling: function (bindings, nodeName) {
            return ko.memoization.memoize(function (domNode, bindingContext) {
                var nodeToBind = domNode.nextSibling;
                if (nodeToBind && nodeToBind.nodeName.toLowerCase() === nodeName) {
                    ko.applyBindingAccessorsToNode(nodeToBind, bindings, bindingContext);
                }
            });
        }
    }
})();


// Exported only because it has to be referenced by string lookup from within rewritten template
ko.exportSymbol('__tr_ambtns', ko.templateRewriting.applyMemoizedBindingsToNextSibling);
(function() {
    // A template source represents a read/write way of accessing a template. This is to eliminate the need for template loading/saving
    // logic to be duplicated in every template engine (and means they can all work with anonymous templates, etc.)
    //
    // Two are provided by default:
    //  1. ko.templateSources.domElement       - reads/writes the text content of an arbitrary DOM element
    //  2. ko.templateSources.anonymousElement - uses ko.utils.domData to read/write text *associated* with the DOM element, but
    //                                           without reading/writing the actual element text content, since it will be overwritten
    //                                           with the rendered template output.
    // You can implement your own template source if you want to fetch/store templates somewhere other than in DOM elements.
    // Template sources need to have the following functions:
    //   text() 			- returns the template text from your storage location
    //   text(value)		- writes the supplied template text to your storage location
    //   data(key)			- reads values stored using data(key, value) - see below
    //   data(key, value)	- associates "value" with this template and the key "key". Is used to store information like "isRewritten".
    //
    // Optionally, template sources can also have the following functions:
    //   nodes()            - returns a DOM element containing the nodes of this template, where available
    //   nodes(value)       - writes the given DOM element to your storage location
    // If a DOM element is available for a given template source, template engines are encouraged to use it in preference over text()
    // for improved speed. However, all templateSources must supply text() even if they don't supply nodes().
    //
    // Once you've implemented a templateSource, make your template engine use it by subclassing whatever template engine you were
    // using and overriding "makeTemplateSource" to return an instance of your custom template source.

    ko.templateSources = {};

    // ---- ko.templateSources.domElement -----

    ko.templateSources.domElement = function(element) {
        this.domElement = element;
    }

    ko.templateSources.domElement.prototype['text'] = function(/* valueToWrite */) {
        var tagNameLower = ko.utils.tagNameLower(this.domElement),
            elemContentsProperty = tagNameLower === "script" ? "text"
                                 : tagNameLower === "textarea" ? "value"
                                 : "innerHTML";

        if (arguments.length == 0) {
            return this.domElement[elemContentsProperty];
        } else {
            var valueToWrite = arguments[0];
            if (elemContentsProperty === "innerHTML")
                ko.utils.setHtml(this.domElement, valueToWrite);
            else
                this.domElement[elemContentsProperty] = valueToWrite;
        }
    };

    var dataDomDataPrefix = ko.utils.domData.nextKey() + "_";
    ko.templateSources.domElement.prototype['data'] = function(key /*, valueToWrite */) {
        if (arguments.length === 1) {
            return ko.utils.domData.get(this.domElement, dataDomDataPrefix + key);
        } else {
            ko.utils.domData.set(this.domElement, dataDomDataPrefix + key, arguments[1]);
        }
    };

    // ---- ko.templateSources.anonymousTemplate -----
    // Anonymous templates are normally saved/retrieved as DOM nodes through "nodes".
    // For compatibility, you can also read "text"; it will be serialized from the nodes on demand.
    // Writing to "text" is still supported, but then the template data will not be available as DOM nodes.

    var anonymousTemplatesDomDataKey = ko.utils.domData.nextKey();
    ko.templateSources.anonymousTemplate = function(element) {
        this.domElement = element;
    }
    ko.templateSources.anonymousTemplate.prototype = new ko.templateSources.domElement();
    ko.templateSources.anonymousTemplate.prototype.constructor = ko.templateSources.anonymousTemplate;
    ko.templateSources.anonymousTemplate.prototype['text'] = function(/* valueToWrite */) {
        if (arguments.length == 0) {
            var templateData = ko.utils.domData.get(this.domElement, anonymousTemplatesDomDataKey) || {};
            if (templateData.textData === undefined && templateData.containerData)
                templateData.textData = templateData.containerData.innerHTML;
            return templateData.textData;
        } else {
            var valueToWrite = arguments[0];
            ko.utils.domData.set(this.domElement, anonymousTemplatesDomDataKey, {textData: valueToWrite});
        }
    };
    ko.templateSources.domElement.prototype['nodes'] = function(/* valueToWrite */) {
        if (arguments.length == 0) {
            var templateData = ko.utils.domData.get(this.domElement, anonymousTemplatesDomDataKey) || {};
            return templateData.containerData;
        } else {
            var valueToWrite = arguments[0];
            ko.utils.domData.set(this.domElement, anonymousTemplatesDomDataKey, {containerData: valueToWrite});
        }
    };

    ko.exportSymbol('templateSources', ko.templateSources);
    ko.exportSymbol('templateSources.domElement', ko.templateSources.domElement);
    ko.exportSymbol('templateSources.anonymousTemplate', ko.templateSources.anonymousTemplate);
})();
(function () {
    var _templateEngine;
    ko.setTemplateEngine = function (templateEngine) {
        if ((templateEngine != undefined) && !(templateEngine instanceof ko.templateEngine))
            throw new Error("templateEngine must inherit from ko.templateEngine");
        _templateEngine = templateEngine;
    }

    function invokeForEachNodeInContinuousRange(firstNode, lastNode, action) {
        var node, nextInQueue = firstNode, firstOutOfRangeNode = ko.virtualElements.nextSibling(lastNode);
        while (nextInQueue && ((node = nextInQueue) !== firstOutOfRangeNode)) {
            nextInQueue = ko.virtualElements.nextSibling(node);
            action(node, nextInQueue);
        }
    }

    function activateBindingsOnContinuousNodeArray(continuousNodeArray, bindingContext) {
        // To be used on any nodes that have been rendered by a template and have been inserted into some parent element
        // Walks through continuousNodeArray (which *must* be continuous, i.e., an uninterrupted sequence of sibling nodes, because
        // the algorithm for walking them relies on this), and for each top-level item in the virtual-element sense,
        // (1) Does a regular "applyBindings" to associate bindingContext with this node and to activate any non-memoized bindings
        // (2) Unmemoizes any memos in the DOM subtree (e.g., to activate bindings that had been memoized during template rewriting)

        if (continuousNodeArray.length) {
            var firstNode = continuousNodeArray[0],
                lastNode = continuousNodeArray[continuousNodeArray.length - 1],
                parentNode = firstNode.parentNode,
                provider = ko.bindingProvider['instance'],
                preprocessNode = provider['preprocessNode'];

            if (preprocessNode) {
                invokeForEachNodeInContinuousRange(firstNode, lastNode, function(node, nextNodeInRange) {
                    var nodePreviousSibling = node.previousSibling;
                    var newNodes = preprocessNode.call(provider, node);
                    if (newNodes) {
                        if (node === firstNode)
                            firstNode = newNodes[0] || nextNodeInRange;
                        if (node === lastNode)
                            lastNode = newNodes[newNodes.length - 1] || nodePreviousSibling;
                    }
                });

                // Because preprocessNode can change the nodes, including the first and last nodes, update continuousNodeArray to match.
                // We need the full set, including inner nodes, because the unmemoize step might remove the first node (and so the real
                // first node needs to be in the array).
                continuousNodeArray.length = 0;
                if (!firstNode) { // preprocessNode might have removed all the nodes, in which case there's nothing left to do
                    return;
                }
                if (firstNode === lastNode) {
                    continuousNodeArray.push(firstNode);
                } else {
                    continuousNodeArray.push(firstNode, lastNode);
                    ko.utils.fixUpContinuousNodeArray(continuousNodeArray, parentNode);
                }
            }

            // Need to applyBindings *before* unmemoziation, because unmemoization might introduce extra nodes (that we don't want to re-bind)
            // whereas a regular applyBindings won't introduce new memoized nodes
            invokeForEachNodeInContinuousRange(firstNode, lastNode, function(node) {
                if (node.nodeType === 1 || node.nodeType === 8)
                    ko.applyBindings(bindingContext, node);
            });
            invokeForEachNodeInContinuousRange(firstNode, lastNode, function(node) {
                if (node.nodeType === 1 || node.nodeType === 8)
                    ko.memoization.unmemoizeDomNodeAndDescendants(node, [bindingContext]);
            });

            // Make sure any changes done by applyBindings or unmemoize are reflected in the array
            ko.utils.fixUpContinuousNodeArray(continuousNodeArray, parentNode);
        }
    }

    function getFirstNodeFromPossibleArray(nodeOrNodeArray) {
        return nodeOrNodeArray.nodeType ? nodeOrNodeArray
                                        : nodeOrNodeArray.length > 0 ? nodeOrNodeArray[0]
                                        : null;
    }

    function executeTemplate(targetNodeOrNodeArray, renderMode, template, bindingContext, options) {
        options = options || {};
        var firstTargetNode = targetNodeOrNodeArray && getFirstNodeFromPossibleArray(targetNodeOrNodeArray);
        var templateDocument = (firstTargetNode || template || {}).ownerDocument;
        var templateEngineToUse = (options['templateEngine'] || _templateEngine);
        ko.templateRewriting.ensureTemplateIsRewritten(template, templateEngineToUse, templateDocument);
        var renderedNodesArray = templateEngineToUse['renderTemplate'](template, bindingContext, options, templateDocument);

        // Loosely check result is an array of DOM nodes
        if ((typeof renderedNodesArray.length != "number") || (renderedNodesArray.length > 0 && typeof renderedNodesArray[0].nodeType != "number"))
            throw new Error("Template engine must return an array of DOM nodes");

        var haveAddedNodesToParent = false;
        switch (renderMode) {
            case "replaceChildren":
                ko.virtualElements.setDomNodeChildren(targetNodeOrNodeArray, renderedNodesArray);
                haveAddedNodesToParent = true;
                break;
            case "replaceNode":
                ko.utils.replaceDomNodes(targetNodeOrNodeArray, renderedNodesArray);
                haveAddedNodesToParent = true;
                break;
            case "ignoreTargetNode": break;
            default:
                throw new Error("Unknown renderMode: " + renderMode);
        }

        if (haveAddedNodesToParent) {
            activateBindingsOnContinuousNodeArray(renderedNodesArray, bindingContext);
            if (options['afterRender'])
                ko.dependencyDetection.ignore(options['afterRender'], null, [renderedNodesArray, bindingContext['$data']]);
        }

        return renderedNodesArray;
    }

    function resolveTemplateName(template, data, context) {
        // The template can be specified as:
        if (ko.isObservable(template)) {
            // 1. An observable, with string value
            return template();
        } else if (typeof template === 'function') {
            // 2. A function of (data, context) returning a string
            return template(data, context);
        } else {
            // 3. A string
            return template;
        }
    }

    ko.renderTemplate = function (template, dataOrBindingContext, options, targetNodeOrNodeArray, renderMode) {
        options = options || {};
        if ((options['templateEngine'] || _templateEngine) == undefined)
            throw new Error("Set a template engine before calling renderTemplate");
        renderMode = renderMode || "replaceChildren";

        if (targetNodeOrNodeArray) {
            var firstTargetNode = getFirstNodeFromPossibleArray(targetNodeOrNodeArray);

            var whenToDispose = function () { return (!firstTargetNode) || !ko.utils.domNodeIsAttachedToDocument(firstTargetNode); }; // Passive disposal (on next evaluation)
            var activelyDisposeWhenNodeIsRemoved = (firstTargetNode && renderMode == "replaceNode") ? firstTargetNode.parentNode : firstTargetNode;

            return ko.dependentObservable( // So the DOM is automatically updated when any dependency changes
                function () {
                    // Ensure we've got a proper binding context to work with
                    var bindingContext = (dataOrBindingContext && (dataOrBindingContext instanceof ko.bindingContext))
                        ? dataOrBindingContext
                        : new ko.bindingContext(ko.utils.unwrapObservable(dataOrBindingContext));

                    var templateName = resolveTemplateName(template, bindingContext['$data'], bindingContext),
                        renderedNodesArray = executeTemplate(targetNodeOrNodeArray, renderMode, templateName, bindingContext, options);

                    if (renderMode == "replaceNode") {
                        targetNodeOrNodeArray = renderedNodesArray;
                        firstTargetNode = getFirstNodeFromPossibleArray(targetNodeOrNodeArray);
                    }
                },
                null,
                { disposeWhen: whenToDispose, disposeWhenNodeIsRemoved: activelyDisposeWhenNodeIsRemoved }
            );
        } else {
            // We don't yet have a DOM node to evaluate, so use a memo and render the template later when there is a DOM node
            return ko.memoization.memoize(function (domNode) {
                ko.renderTemplate(template, dataOrBindingContext, options, domNode, "replaceNode");
            });
        }
    };

    ko.renderTemplateForEach = function (template, arrayOrObservableArray, options, targetNode, parentBindingContext) {
        // Since setDomNodeChildrenFromArrayMapping always calls executeTemplateForArrayItem and then
        // activateBindingsCallback for added items, we can store the binding context in the former to use in the latter.
        var arrayItemContext;

        // This will be called by setDomNodeChildrenFromArrayMapping to get the nodes to add to targetNode
        var executeTemplateForArrayItem = function (arrayValue, index) {
            // Support selecting template as a function of the data being rendered
            arrayItemContext = parentBindingContext['createChildContext'](arrayValue, options['as'], function(context) {
                context['$index'] = index;
            });

            var templateName = resolveTemplateName(template, arrayValue, arrayItemContext);
            return executeTemplate(null, "ignoreTargetNode", templateName, arrayItemContext, options);
        }

        // This will be called whenever setDomNodeChildrenFromArrayMapping has added nodes to targetNode
        var activateBindingsCallback = function(arrayValue, addedNodesArray, index) {
            activateBindingsOnContinuousNodeArray(addedNodesArray, arrayItemContext);
            if (options['afterRender'])
                options['afterRender'](addedNodesArray, arrayValue);

            // release the "cache" variable, so that it can be collected by
            // the GC when its value isn't used from within the bindings anymore.
            arrayItemContext = null;
        };

        return ko.dependentObservable(function () {
            var unwrappedArray = ko.utils.unwrapObservable(arrayOrObservableArray) || [];
            if (typeof unwrappedArray.length == "undefined") // Coerce single value into array
                unwrappedArray = [unwrappedArray];

            // Filter out any entries marked as destroyed
            var filteredArray = ko.utils.arrayFilter(unwrappedArray, function(item) {
                return options['includeDestroyed'] || item === undefined || item === null || !ko.utils.unwrapObservable(item['_destroy']);
            });

            // Call setDomNodeChildrenFromArrayMapping, ignoring any observables unwrapped within (most likely from a callback function).
            // If the array items are observables, though, they will be unwrapped in executeTemplateForArrayItem and managed within setDomNodeChildrenFromArrayMapping.
            ko.dependencyDetection.ignore(ko.utils.setDomNodeChildrenFromArrayMapping, null, [targetNode, filteredArray, executeTemplateForArrayItem, options, activateBindingsCallback]);

        }, null, { disposeWhenNodeIsRemoved: targetNode });
    };

    var templateComputedDomDataKey = ko.utils.domData.nextKey();
    function disposeOldComputedAndStoreNewOne(element, newComputed) {
        var oldComputed = ko.utils.domData.get(element, templateComputedDomDataKey);
        if (oldComputed && (typeof(oldComputed.dispose) == 'function'))
            oldComputed.dispose();
        ko.utils.domData.set(element, templateComputedDomDataKey, (newComputed && newComputed.isActive()) ? newComputed : undefined);
    }

    ko.bindingHandlers['template'] = {
        'init': function(element, valueAccessor) {
            // Support anonymous templates
            var bindingValue = ko.utils.unwrapObservable(valueAccessor());
            if (typeof bindingValue == "string" || bindingValue['name']) {
                // It's a named template - clear the element
                ko.virtualElements.emptyNode(element);
            } else if ('nodes' in bindingValue) {
                // We've been given an array of DOM nodes. Save them as the template source.
                // There is no known use case for the node array being an observable array (if the output
                // varies, put that behavior *into* your template - that's what templates are for), and
                // the implementation would be a mess, so assert that it's not observable.
                var nodes = bindingValue['nodes'] || [];
                if (ko.isObservable(nodes)) {
                    throw new Error('The "nodes" option must be a plain, non-observable array.');
                }
                var container = ko.utils.moveCleanedNodesToContainerElement(nodes); // This also removes the nodes from their current parent
                new ko.templateSources.anonymousTemplate(element)['nodes'](container);
            } else {
                // It's an anonymous template - store the element contents, then clear the element
                var templateNodes = ko.virtualElements.childNodes(element),
                    container = ko.utils.moveCleanedNodesToContainerElement(templateNodes); // This also removes the nodes from their current parent
                new ko.templateSources.anonymousTemplate(element)['nodes'](container);
            }
            return { 'controlsDescendantBindings': true };
        },
        'update': function (element, valueAccessor, allBindings, viewModel, bindingContext) {
            var value = valueAccessor(),
                dataValue,
                options = ko.utils.unwrapObservable(value),
                shouldDisplay = true,
                templateComputed = null,
                templateName;

            if (typeof options == "string") {
                templateName = value;
                options = {};
            } else {
                templateName = options['name'];

                // Support "if"/"ifnot" conditions
                if ('if' in options)
                    shouldDisplay = ko.utils.unwrapObservable(options['if']);
                if (shouldDisplay && 'ifnot' in options)
                    shouldDisplay = !ko.utils.unwrapObservable(options['ifnot']);

                dataValue = ko.utils.unwrapObservable(options['data']);
            }

            if ('foreach' in options) {
                // Render once for each data point (treating data set as empty if shouldDisplay==false)
                var dataArray = (shouldDisplay && options['foreach']) || [];
                templateComputed = ko.renderTemplateForEach(templateName || element, dataArray, options, element, bindingContext);
            } else if (!shouldDisplay) {
                ko.virtualElements.emptyNode(element);
            } else {
                // Render once for this single data point (or use the viewModel if no data was provided)
                var innerBindingContext = ('data' in options) ?
                    bindingContext['createChildContext'](dataValue, options['as']) :  // Given an explitit 'data' value, we create a child binding context for it
                    bindingContext;                                                        // Given no explicit 'data' value, we retain the same binding context
                templateComputed = ko.renderTemplate(templateName || element, innerBindingContext, options, element);
            }

            // It only makes sense to have a single template computed per element (otherwise which one should have its output displayed?)
            disposeOldComputedAndStoreNewOne(element, templateComputed);
        }
    };

    // Anonymous templates can't be rewritten. Give a nice error message if you try to do it.
    ko.expressionRewriting.bindingRewriteValidators['template'] = function(bindingValue) {
        var parsedBindingValue = ko.expressionRewriting.parseObjectLiteral(bindingValue);

        if ((parsedBindingValue.length == 1) && parsedBindingValue[0]['unknown'])
            return null; // It looks like a string literal, not an object literal, so treat it as a named template (which is allowed for rewriting)

        if (ko.expressionRewriting.keyValueArrayContainsKey(parsedBindingValue, "name"))
            return null; // Named templates can be rewritten, so return "no error"
        return "This template engine does not support anonymous templates nested within its templates";
    };

    ko.virtualElements.allowedBindings['template'] = true;
})();

ko.exportSymbol('setTemplateEngine', ko.setTemplateEngine);
ko.exportSymbol('renderTemplate', ko.renderTemplate);
// Go through the items that have been added and deleted and try to find matches between them.
ko.utils.findMovesInArrayComparison = function (left, right, limitFailedCompares) {
    if (left.length && right.length) {
        var failedCompares, l, r, leftItem, rightItem;
        for (failedCompares = l = 0; (!limitFailedCompares || failedCompares < limitFailedCompares) && (leftItem = left[l]); ++l) {
            for (r = 0; rightItem = right[r]; ++r) {
                if (leftItem['value'] === rightItem['value']) {
                    leftItem['moved'] = rightItem['index'];
                    rightItem['moved'] = leftItem['index'];
                    right.splice(r, 1);         // This item is marked as moved; so remove it from right list
                    failedCompares = r = 0;     // Reset failed compares count because we're checking for consecutive failures
                    break;
                }
            }
            failedCompares += r;
        }
    }
};

ko.utils.compareArrays = (function () {
    var statusNotInOld = 'added', statusNotInNew = 'deleted';

    // Simple calculation based on Levenshtein distance.
    function compareArrays(oldArray, newArray, options) {
        // For backward compatibility, if the third arg is actually a bool, interpret
        // it as the old parameter 'dontLimitMoves'. Newer code should use { dontLimitMoves: true }.
        options = (typeof options === 'boolean') ? { 'dontLimitMoves': options } : (options || {});
        oldArray = oldArray || [];
        newArray = newArray || [];

        if (oldArray.length <= newArray.length)
            return compareSmallArrayToBigArray(oldArray, newArray, statusNotInOld, statusNotInNew, options);
        else
            return compareSmallArrayToBigArray(newArray, oldArray, statusNotInNew, statusNotInOld, options);
    }

    function compareSmallArrayToBigArray(smlArray, bigArray, statusNotInSml, statusNotInBig, options) {
        var myMin = Math.min,
            myMax = Math.max,
            editDistanceMatrix = [],
            smlIndex, smlIndexMax = smlArray.length,
            bigIndex, bigIndexMax = bigArray.length,
            compareRange = (bigIndexMax - smlIndexMax) || 1,
            maxDistance = smlIndexMax + bigIndexMax + 1,
            thisRow, lastRow,
            bigIndexMaxForRow, bigIndexMinForRow;

        for (smlIndex = 0; smlIndex <= smlIndexMax; smlIndex++) {
            lastRow = thisRow;
            editDistanceMatrix.push(thisRow = []);
            bigIndexMaxForRow = myMin(bigIndexMax, smlIndex + compareRange);
            bigIndexMinForRow = myMax(0, smlIndex - 1);
            for (bigIndex = bigIndexMinForRow; bigIndex <= bigIndexMaxForRow; bigIndex++) {
                if (!bigIndex)
                    thisRow[bigIndex] = smlIndex + 1;
                else if (!smlIndex)  // Top row - transform empty array into new array via additions
                    thisRow[bigIndex] = bigIndex + 1;
                else if (smlArray[smlIndex - 1] === bigArray[bigIndex - 1])
                    thisRow[bigIndex] = lastRow[bigIndex - 1];                  // copy value (no edit)
                else {
                    var northDistance = lastRow[bigIndex] || maxDistance;       // not in big (deletion)
                    var westDistance = thisRow[bigIndex - 1] || maxDistance;    // not in small (addition)
                    thisRow[bigIndex] = myMin(northDistance, westDistance) + 1;
                }
            }
        }

        var editScript = [], meMinusOne, notInSml = [], notInBig = [];
        for (smlIndex = smlIndexMax, bigIndex = bigIndexMax; smlIndex || bigIndex;) {
            meMinusOne = editDistanceMatrix[smlIndex][bigIndex] - 1;
            if (bigIndex && meMinusOne === editDistanceMatrix[smlIndex][bigIndex-1]) {
                notInSml.push(editScript[editScript.length] = {     // added
                    'status': statusNotInSml,
                    'value': bigArray[--bigIndex],
                    'index': bigIndex });
            } else if (smlIndex && meMinusOne === editDistanceMatrix[smlIndex - 1][bigIndex]) {
                notInBig.push(editScript[editScript.length] = {     // deleted
                    'status': statusNotInBig,
                    'value': smlArray[--smlIndex],
                    'index': smlIndex });
            } else {
                --bigIndex;
                --smlIndex;
                if (!options['sparse']) {
                    editScript.push({
                        'status': "retained",
                        'value': bigArray[bigIndex] });
                }
            }
        }

        // Set a limit on the number of consecutive non-matching comparisons; having it a multiple of
        // smlIndexMax keeps the time complexity of this algorithm linear.
        ko.utils.findMovesInArrayComparison(notInSml, notInBig, smlIndexMax * 10);

        return editScript.reverse();
    }

    return compareArrays;
})();

ko.exportSymbol('utils.compareArrays', ko.utils.compareArrays);
(function () {
    // Objective:
    // * Given an input array, a container DOM node, and a function from array elements to arrays of DOM nodes,
    //   map the array elements to arrays of DOM nodes, concatenate together all these arrays, and use them to populate the container DOM node
    // * Next time we're given the same combination of things (with the array possibly having mutated), update the container DOM node
    //   so that its children is again the concatenation of the mappings of the array elements, but don't re-map any array elements that we
    //   previously mapped - retain those nodes, and just insert/delete other ones

    // "callbackAfterAddingNodes" will be invoked after any "mapping"-generated nodes are inserted into the container node
    // You can use this, for example, to activate bindings on those nodes.

    function mapNodeAndRefreshWhenChanged(containerNode, mapping, valueToMap, callbackAfterAddingNodes, index) {
        // Map this array value inside a dependentObservable so we re-map when any dependency changes
        var mappedNodes = [];
        var dependentObservable = ko.dependentObservable(function() {
            var newMappedNodes = mapping(valueToMap, index, ko.utils.fixUpContinuousNodeArray(mappedNodes, containerNode)) || [];

            // On subsequent evaluations, just replace the previously-inserted DOM nodes
            if (mappedNodes.length > 0) {
                ko.utils.replaceDomNodes(mappedNodes, newMappedNodes);
                if (callbackAfterAddingNodes)
                    ko.dependencyDetection.ignore(callbackAfterAddingNodes, null, [valueToMap, newMappedNodes, index]);
            }

            // Replace the contents of the mappedNodes array, thereby updating the record
            // of which nodes would be deleted if valueToMap was itself later removed
            mappedNodes.length = 0;
            ko.utils.arrayPushAll(mappedNodes, newMappedNodes);
        }, null, { disposeWhenNodeIsRemoved: containerNode, disposeWhen: function() { return !ko.utils.anyDomNodeIsAttachedToDocument(mappedNodes); } });
        return { mappedNodes : mappedNodes, dependentObservable : (dependentObservable.isActive() ? dependentObservable : undefined) };
    }

    var lastMappingResultDomDataKey = ko.utils.domData.nextKey();

    ko.utils.setDomNodeChildrenFromArrayMapping = function (domNode, array, mapping, options, callbackAfterAddingNodes) {
        // Compare the provided array against the previous one
        array = array || [];
        options = options || {};
        var isFirstExecution = ko.utils.domData.get(domNode, lastMappingResultDomDataKey) === undefined;
        var lastMappingResult = ko.utils.domData.get(domNode, lastMappingResultDomDataKey) || [];
        var lastArray = ko.utils.arrayMap(lastMappingResult, function (x) { return x.arrayEntry; });
        var editScript = ko.utils.compareArrays(lastArray, array, options['dontLimitMoves']);

        // Build the new mapping result
        var newMappingResult = [];
        var lastMappingResultIndex = 0;
        var newMappingResultIndex = 0;

        var nodesToDelete = [];
        var itemsToProcess = [];
        var itemsForBeforeRemoveCallbacks = [];
        var itemsForMoveCallbacks = [];
        var itemsForAfterAddCallbacks = [];
        var mapData;

        function itemMovedOrRetained(editScriptIndex, oldPosition) {
            mapData = lastMappingResult[oldPosition];
            if (newMappingResultIndex !== oldPosition)
                itemsForMoveCallbacks[editScriptIndex] = mapData;
            // Since updating the index might change the nodes, do so before calling fixUpContinuousNodeArray
            mapData.indexObservable(newMappingResultIndex++);
            ko.utils.fixUpContinuousNodeArray(mapData.mappedNodes, domNode);
            newMappingResult.push(mapData);
            itemsToProcess.push(mapData);
        }

        function callCallback(callback, items) {
            if (callback) {
                for (var i = 0, n = items.length; i < n; i++) {
                    if (items[i]) {
                        ko.utils.arrayForEach(items[i].mappedNodes, function(node) {
                            callback(node, i, items[i].arrayEntry);
                        });
                    }
                }
            }
        }

        for (var i = 0, editScriptItem, movedIndex; editScriptItem = editScript[i]; i++) {
            movedIndex = editScriptItem['moved'];
            switch (editScriptItem['status']) {
                case "deleted":
                    if (movedIndex === undefined) {
                        mapData = lastMappingResult[lastMappingResultIndex];

                        // Stop tracking changes to the mapping for these nodes
                        if (mapData.dependentObservable)
                            mapData.dependentObservable.dispose();

                        // Queue these nodes for later removal
                        nodesToDelete.push.apply(nodesToDelete, ko.utils.fixUpContinuousNodeArray(mapData.mappedNodes, domNode));
                        if (options['beforeRemove']) {
                            itemsForBeforeRemoveCallbacks[i] = mapData;
                            itemsToProcess.push(mapData);
                        }
                    }
                    lastMappingResultIndex++;
                    break;

                case "retained":
                    itemMovedOrRetained(i, lastMappingResultIndex++);
                    break;

                case "added":
                    if (movedIndex !== undefined) {
                        itemMovedOrRetained(i, movedIndex);
                    } else {
                        mapData = { arrayEntry: editScriptItem['value'], indexObservable: ko.observable(newMappingResultIndex++) };
                        newMappingResult.push(mapData);
                        itemsToProcess.push(mapData);
                        if (!isFirstExecution)
                            itemsForAfterAddCallbacks[i] = mapData;
                    }
                    break;
            }
        }

        // Call beforeMove first before any changes have been made to the DOM
        callCallback(options['beforeMove'], itemsForMoveCallbacks);

        // Next remove nodes for deleted items (or just clean if there's a beforeRemove callback)
        ko.utils.arrayForEach(nodesToDelete, options['beforeRemove'] ? ko.cleanNode : ko.removeNode);

        // Next add/reorder the remaining items (will include deleted items if there's a beforeRemove callback)
        for (var i = 0, nextNode = ko.virtualElements.firstChild(domNode), lastNode, node; mapData = itemsToProcess[i]; i++) {
            // Get nodes for newly added items
            if (!mapData.mappedNodes)
                ko.utils.extend(mapData, mapNodeAndRefreshWhenChanged(domNode, mapping, mapData.arrayEntry, callbackAfterAddingNodes, mapData.indexObservable));

            // Put nodes in the right place if they aren't there already
            for (var j = 0; node = mapData.mappedNodes[j]; nextNode = node.nextSibling, lastNode = node, j++) {
                if (node !== nextNode)
                    ko.virtualElements.insertAfter(domNode, node, lastNode);
            }

            // Run the callbacks for newly added nodes (for example, to apply bindings, etc.)
            if (!mapData.initialized && callbackAfterAddingNodes) {
                callbackAfterAddingNodes(mapData.arrayEntry, mapData.mappedNodes, mapData.indexObservable);
                mapData.initialized = true;
            }
        }

        // If there's a beforeRemove callback, call it after reordering.
        // Note that we assume that the beforeRemove callback will usually be used to remove the nodes using
        // some sort of animation, which is why we first reorder the nodes that will be removed. If the
        // callback instead removes the nodes right away, it would be more efficient to skip reordering them.
        // Perhaps we'll make that change in the future if this scenario becomes more common.
        callCallback(options['beforeRemove'], itemsForBeforeRemoveCallbacks);

        // Finally call afterMove and afterAdd callbacks
        callCallback(options['afterMove'], itemsForMoveCallbacks);
        callCallback(options['afterAdd'], itemsForAfterAddCallbacks);

        // Store a copy of the array items we just considered so we can difference it next time
        ko.utils.domData.set(domNode, lastMappingResultDomDataKey, newMappingResult);
    }
})();

ko.exportSymbol('utils.setDomNodeChildrenFromArrayMapping', ko.utils.setDomNodeChildrenFromArrayMapping);
ko.nativeTemplateEngine = function () {
    this['allowTemplateRewriting'] = false;
}

ko.nativeTemplateEngine.prototype = new ko.templateEngine();
ko.nativeTemplateEngine.prototype.constructor = ko.nativeTemplateEngine;
ko.nativeTemplateEngine.prototype['renderTemplateSource'] = function (templateSource, bindingContext, options, templateDocument) {
    var useNodesIfAvailable = !(ko.utils.ieVersion < 9), // IE<9 cloneNode doesn't work properly
        templateNodesFunc = useNodesIfAvailable ? templateSource['nodes'] : null,
        templateNodes = templateNodesFunc ? templateSource['nodes']() : null;

    if (templateNodes) {
        return ko.utils.makeArray(templateNodes.cloneNode(true).childNodes);
    } else {
        var templateText = templateSource['text']();
        return ko.utils.parseHtmlFragment(templateText, templateDocument);
    }
};

ko.nativeTemplateEngine.instance = new ko.nativeTemplateEngine();
ko.setTemplateEngine(ko.nativeTemplateEngine.instance);

ko.exportSymbol('nativeTemplateEngine', ko.nativeTemplateEngine);
(function() {
    ko.jqueryTmplTemplateEngine = function () {
        // Detect which version of jquery-tmpl you're using. Unfortunately jquery-tmpl
        // doesn't expose a version number, so we have to infer it.
        // Note that as of Knockout 1.3, we only support jQuery.tmpl 1.0.0pre and later,
        // which KO internally refers to as version "2", so older versions are no longer detected.
        var jQueryTmplVersion = this.jQueryTmplVersion = (function() {
            if (!jQueryInstance || !(jQueryInstance['tmpl']))
                return 0;
            // Since it exposes no official version number, we use our own numbering system. To be updated as jquery-tmpl evolves.
            try {
                if (jQueryInstance['tmpl']['tag']['tmpl']['open'].toString().indexOf('__') >= 0) {
                    // Since 1.0.0pre, custom tags should append markup to an array called "__"
                    return 2; // Final version of jquery.tmpl
                }
            } catch(ex) { /* Apparently not the version we were looking for */ }

            return 1; // Any older version that we don't support
        })();

        function ensureHasReferencedJQueryTemplates() {
            if (jQueryTmplVersion < 2)
                throw new Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");
        }

        function executeTemplate(compiledTemplate, data, jQueryTemplateOptions) {
            return jQueryInstance['tmpl'](compiledTemplate, data, jQueryTemplateOptions);
        }

        this['renderTemplateSource'] = function(templateSource, bindingContext, options, templateDocument) {
            templateDocument = templateDocument || document;
            options = options || {};
            ensureHasReferencedJQueryTemplates();

            // Ensure we have stored a precompiled version of this template (don't want to reparse on every render)
            var precompiled = templateSource['data']('precompiled');
            if (!precompiled) {
                var templateText = templateSource['text']() || "";
                // Wrap in "with($whatever.koBindingContext) { ... }"
                templateText = "{{ko_with $item.koBindingContext}}" + templateText + "{{/ko_with}}";

                precompiled = jQueryInstance['template'](null, templateText);
                templateSource['data']('precompiled', precompiled);
            }

            var data = [bindingContext['$data']]; // Prewrap the data in an array to stop jquery.tmpl from trying to unwrap any arrays
            var jQueryTemplateOptions = jQueryInstance['extend']({ 'koBindingContext': bindingContext }, options['templateOptions']);

            var resultNodes = executeTemplate(precompiled, data, jQueryTemplateOptions);
            resultNodes['appendTo'](templateDocument.createElement("div")); // Using "appendTo" forces jQuery/jQuery.tmpl to perform necessary cleanup work

            jQueryInstance['fragments'] = {}; // Clear jQuery's fragment cache to avoid a memory leak after a large number of template renders
            return resultNodes;
        };

        this['createJavaScriptEvaluatorBlock'] = function(script) {
            return "{{ko_code ((function() { return " + script + " })()) }}";
        };

        this['addTemplate'] = function(templateName, templateMarkup) {
            document.write("<script type='text/html' id='" + templateName + "'>" + templateMarkup + "<" + "/script>");
        };

        if (jQueryTmplVersion > 0) {
            jQueryInstance['tmpl']['tag']['ko_code'] = {
                open: "__.push($1 || '');"
            };
            jQueryInstance['tmpl']['tag']['ko_with'] = {
                open: "with($1) {",
                close: "} "
            };
        }
    };

    ko.jqueryTmplTemplateEngine.prototype = new ko.templateEngine();
    ko.jqueryTmplTemplateEngine.prototype.constructor = ko.jqueryTmplTemplateEngine;

    // Use this one by default *only if jquery.tmpl is referenced*
    var jqueryTmplTemplateEngineInstance = new ko.jqueryTmplTemplateEngine();
    if (jqueryTmplTemplateEngineInstance.jQueryTmplVersion > 0)
        ko.setTemplateEngine(jqueryTmplTemplateEngineInstance);

    ko.exportSymbol('jqueryTmplTemplateEngine', ko.jqueryTmplTemplateEngine);
})();
}));
}());
})();

},{}],112:[function(require,module,exports){
//! moment.js

;(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(factory) :
    global.moment = factory()
}(this, (function () { 'use strict';

    var hookCallback;

    function hooks () {
        return hookCallback.apply(null, arguments);
    }

    // This is done to register the method called with moment()
    // without creating circular dependencies.
    function setHookCallback (callback) {
        hookCallback = callback;
    }

    function isArray(input) {
        return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
    }

    function isObject(input) {
        // IE8 will treat undefined and null as object if it wasn't for
        // input != null
        return input != null && Object.prototype.toString.call(input) === '[object Object]';
    }

    function isObjectEmpty(obj) {
        if (Object.getOwnPropertyNames) {
            return (Object.getOwnPropertyNames(obj).length === 0);
        } else {
            var k;
            for (k in obj) {
                if (obj.hasOwnProperty(k)) {
                    return false;
                }
            }
            return true;
        }
    }

    function isUndefined(input) {
        return input === void 0;
    }

    function isNumber(input) {
        return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
    }

    function isDate(input) {
        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
    }

    function map(arr, fn) {
        var res = [], i;
        for (i = 0; i < arr.length; ++i) {
            res.push(fn(arr[i], i));
        }
        return res;
    }

    function hasOwnProp(a, b) {
        return Object.prototype.hasOwnProperty.call(a, b);
    }

    function extend(a, b) {
        for (var i in b) {
            if (hasOwnProp(b, i)) {
                a[i] = b[i];
            }
        }

        if (hasOwnProp(b, 'toString')) {
            a.toString = b.toString;
        }

        if (hasOwnProp(b, 'valueOf')) {
            a.valueOf = b.valueOf;
        }

        return a;
    }

    function createUTC (input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, true).utc();
    }

    function defaultParsingFlags() {
        // We need to deep clone this object.
        return {
            empty           : false,
            unusedTokens    : [],
            unusedInput     : [],
            overflow        : -2,
            charsLeftOver   : 0,
            nullInput       : false,
            invalidMonth    : null,
            invalidFormat   : false,
            userInvalidated : false,
            iso             : false,
            parsedDateParts : [],
            meridiem        : null,
            rfc2822         : false,
            weekdayMismatch : false
        };
    }

    function getParsingFlags(m) {
        if (m._pf == null) {
            m._pf = defaultParsingFlags();
        }
        return m._pf;
    }

    var some;
    if (Array.prototype.some) {
        some = Array.prototype.some;
    } else {
        some = function (fun) {
            var t = Object(this);
            var len = t.length >>> 0;

            for (var i = 0; i < len; i++) {
                if (i in t && fun.call(this, t[i], i, t)) {
                    return true;
                }
            }

            return false;
        };
    }

    function isValid(m) {
        if (m._isValid == null) {
            var flags = getParsingFlags(m);
            var parsedParts = some.call(flags.parsedDateParts, function (i) {
                return i != null;
            });
            var isNowValid = !isNaN(m._d.getTime()) &&
                flags.overflow < 0 &&
                !flags.empty &&
                !flags.invalidMonth &&
                !flags.invalidWeekday &&
                !flags.weekdayMismatch &&
                !flags.nullInput &&
                !flags.invalidFormat &&
                !flags.userInvalidated &&
                (!flags.meridiem || (flags.meridiem && parsedParts));

            if (m._strict) {
                isNowValid = isNowValid &&
                    flags.charsLeftOver === 0 &&
                    flags.unusedTokens.length === 0 &&
                    flags.bigHour === undefined;
            }

            if (Object.isFrozen == null || !Object.isFrozen(m)) {
                m._isValid = isNowValid;
            }
            else {
                return isNowValid;
            }
        }
        return m._isValid;
    }

    function createInvalid (flags) {
        var m = createUTC(NaN);
        if (flags != null) {
            extend(getParsingFlags(m), flags);
        }
        else {
            getParsingFlags(m).userInvalidated = true;
        }

        return m;
    }

    // Plugins that add properties should also add the key here (null value),
    // so we can properly clone ourselves.
    var momentProperties = hooks.momentProperties = [];

    function copyConfig(to, from) {
        var i, prop, val;

        if (!isUndefined(from._isAMomentObject)) {
            to._isAMomentObject = from._isAMomentObject;
        }
        if (!isUndefined(from._i)) {
            to._i = from._i;
        }
        if (!isUndefined(from._f)) {
            to._f = from._f;
        }
        if (!isUndefined(from._l)) {
            to._l = from._l;
        }
        if (!isUndefined(from._strict)) {
            to._strict = from._strict;
        }
        if (!isUndefined(from._tzm)) {
            to._tzm = from._tzm;
        }
        if (!isUndefined(from._isUTC)) {
            to._isUTC = from._isUTC;
        }
        if (!isUndefined(from._offset)) {
            to._offset = from._offset;
        }
        if (!isUndefined(from._pf)) {
            to._pf = getParsingFlags(from);
        }
        if (!isUndefined(from._locale)) {
            to._locale = from._locale;
        }

        if (momentProperties.length > 0) {
            for (i = 0; i < momentProperties.length; i++) {
                prop = momentProperties[i];
                val = from[prop];
                if (!isUndefined(val)) {
                    to[prop] = val;
                }
            }
        }

        return to;
    }

    var updateInProgress = false;

    // Moment prototype object
    function Moment(config) {
        copyConfig(this, config);
        this._d = new Date(config._d != null ? config._d.getTime() : NaN);
        if (!this.isValid()) {
            this._d = new Date(NaN);
        }
        // Prevent infinite loop in case updateOffset creates new moment
        // objects.
        if (updateInProgress === false) {
            updateInProgress = true;
            hooks.updateOffset(this);
            updateInProgress = false;
        }
    }

    function isMoment (obj) {
        return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
    }

    function absFloor (number) {
        if (number < 0) {
            // -0 -> 0
            return Math.ceil(number) || 0;
        } else {
            return Math.floor(number);
        }
    }

    function toInt(argumentForCoercion) {
        var coercedNumber = +argumentForCoercion,
            value = 0;

        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
            value = absFloor(coercedNumber);
        }

        return value;
    }

    // compare two arrays, return the number of differences
    function compareArrays(array1, array2, dontConvert) {
        var len = Math.min(array1.length, array2.length),
            lengthDiff = Math.abs(array1.length - array2.length),
            diffs = 0,
            i;
        for (i = 0; i < len; i++) {
            if ((dontConvert && array1[i] !== array2[i]) ||
                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
                diffs++;
            }
        }
        return diffs + lengthDiff;
    }

    function warn(msg) {
        if (hooks.suppressDeprecationWarnings === false &&
                (typeof console !==  'undefined') && console.warn) {
            console.warn('Deprecation warning: ' + msg);
        }
    }

    function deprecate(msg, fn) {
        var firstTime = true;

        return extend(function () {
            if (hooks.deprecationHandler != null) {
                hooks.deprecationHandler(null, msg);
            }
            if (firstTime) {
                var args = [];
                var arg;
                for (var i = 0; i < arguments.length; i++) {
                    arg = '';
                    if (typeof arguments[i] === 'object') {
                        arg += '\n[' + i + '] ';
                        for (var key in arguments[0]) {
                            arg += key + ': ' + arguments[0][key] + ', ';
                        }
                        arg = arg.slice(0, -2); // Remove trailing comma and space
                    } else {
                        arg = arguments[i];
                    }
                    args.push(arg);
                }
                warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
                firstTime = false;
            }
            return fn.apply(this, arguments);
        }, fn);
    }

    var deprecations = {};

    function deprecateSimple(name, msg) {
        if (hooks.deprecationHandler != null) {
            hooks.deprecationHandler(name, msg);
        }
        if (!deprecations[name]) {
            warn(msg);
            deprecations[name] = true;
        }
    }

    hooks.suppressDeprecationWarnings = false;
    hooks.deprecationHandler = null;

    function isFunction(input) {
        return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
    }

    function set (config) {
        var prop, i;
        for (i in config) {
            prop = config[i];
            if (isFunction(prop)) {
                this[i] = prop;
            } else {
                this['_' + i] = prop;
            }
        }
        this._config = config;
        // Lenient ordinal parsing accepts just a number in addition to
        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
        // TODO: Remove "ordinalParse" fallback in next major release.
        this._dayOfMonthOrdinalParseLenient = new RegExp(
            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
                '|' + (/\d{1,2}/).source);
    }

    function mergeConfigs(parentConfig, childConfig) {
        var res = extend({}, parentConfig), prop;
        for (prop in childConfig) {
            if (hasOwnProp(childConfig, prop)) {
                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
                    res[prop] = {};
                    extend(res[prop], parentConfig[prop]);
                    extend(res[prop], childConfig[prop]);
                } else if (childConfig[prop] != null) {
                    res[prop] = childConfig[prop];
                } else {
                    delete res[prop];
                }
            }
        }
        for (prop in parentConfig) {
            if (hasOwnProp(parentConfig, prop) &&
                    !hasOwnProp(childConfig, prop) &&
                    isObject(parentConfig[prop])) {
                // make sure changes to properties don't modify parent config
                res[prop] = extend({}, res[prop]);
            }
        }
        return res;
    }

    function Locale(config) {
        if (config != null) {
            this.set(config);
        }
    }

    var keys;

    if (Object.keys) {
        keys = Object.keys;
    } else {
        keys = function (obj) {
            var i, res = [];
            for (i in obj) {
                if (hasOwnProp(obj, i)) {
                    res.push(i);
                }
            }
            return res;
        };
    }

    var defaultCalendar = {
        sameDay : '[Today at] LT',
        nextDay : '[Tomorrow at] LT',
        nextWeek : 'dddd [at] LT',
        lastDay : '[Yesterday at] LT',
        lastWeek : '[Last] dddd [at] LT',
        sameElse : 'L'
    };

    function calendar (key, mom, now) {
        var output = this._calendar[key] || this._calendar['sameElse'];
        return isFunction(output) ? output.call(mom, now) : output;
    }

    var defaultLongDateFormat = {
        LTS  : 'h:mm:ss A',
        LT   : 'h:mm A',
        L    : 'MM/DD/YYYY',
        LL   : 'MMMM D, YYYY',
        LLL  : 'MMMM D, YYYY h:mm A',
        LLLL : 'dddd, MMMM D, YYYY h:mm A'
    };

    function longDateFormat (key) {
        var format = this._longDateFormat[key],
            formatUpper = this._longDateFormat[key.toUpperCase()];

        if (format || !formatUpper) {
            return format;
        }

        this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
            return val.slice(1);
        });

        return this._longDateFormat[key];
    }

    var defaultInvalidDate = 'Invalid date';

    function invalidDate () {
        return this._invalidDate;
    }

    var defaultOrdinal = '%d';
    var defaultDayOfMonthOrdinalParse = /\d{1,2}/;

    function ordinal (number) {
        return this._ordinal.replace('%d', number);
    }

    var defaultRelativeTime = {
        future : 'in %s',
        past   : '%s ago',
        s  : 'a few seconds',
        ss : '%d seconds',
        m  : 'a minute',
        mm : '%d minutes',
        h  : 'an hour',
        hh : '%d hours',
        d  : 'a day',
        dd : '%d days',
        M  : 'a month',
        MM : '%d months',
        y  : 'a year',
        yy : '%d years'
    };

    function relativeTime (number, withoutSuffix, string, isFuture) {
        var output = this._relativeTime[string];
        return (isFunction(output)) ?
            output(number, withoutSuffix, string, isFuture) :
            output.replace(/%d/i, number);
    }

    function pastFuture (diff, output) {
        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
        return isFunction(format) ? format(output) : format.replace(/%s/i, output);
    }

    var aliases = {};

    function addUnitAlias (unit, shorthand) {
        var lowerCase = unit.toLowerCase();
        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
    }

    function normalizeUnits(units) {
        return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
    }

    function normalizeObjectUnits(inputObject) {
        var normalizedInput = {},
            normalizedProp,
            prop;

        for (prop in inputObject) {
            if (hasOwnProp(inputObject, prop)) {
                normalizedProp = normalizeUnits(prop);
                if (normalizedProp) {
                    normalizedInput[normalizedProp] = inputObject[prop];
                }
            }
        }

        return normalizedInput;
    }

    var priorities = {};

    function addUnitPriority(unit, priority) {
        priorities[unit] = priority;
    }

    function getPrioritizedUnits(unitsObj) {
        var units = [];
        for (var u in unitsObj) {
            units.push({unit: u, priority: priorities[u]});
        }
        units.sort(function (a, b) {
            return a.priority - b.priority;
        });
        return units;
    }

    function zeroFill(number, targetLength, forceSign) {
        var absNumber = '' + Math.abs(number),
            zerosToFill = targetLength - absNumber.length,
            sign = number >= 0;
        return (sign ? (forceSign ? '+' : '') : '-') +
            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
    }

    var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;

    var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;

    var formatFunctions = {};

    var formatTokenFunctions = {};

    // token:    'M'
    // padded:   ['MM', 2]
    // ordinal:  'Mo'
    // callback: function () { this.month() + 1 }
    function addFormatToken (token, padded, ordinal, callback) {
        var func = callback;
        if (typeof callback === 'string') {
            func = function () {
                return this[callback]();
            };
        }
        if (token) {
            formatTokenFunctions[token] = func;
        }
        if (padded) {
            formatTokenFunctions[padded[0]] = function () {
                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
            };
        }
        if (ordinal) {
            formatTokenFunctions[ordinal] = function () {
                return this.localeData().ordinal(func.apply(this, arguments), token);
            };
        }
    }

    function removeFormattingTokens(input) {
        if (input.match(/\[[\s\S]/)) {
            return input.replace(/^\[|\]$/g, '');
        }
        return input.replace(/\\/g, '');
    }

    function makeFormatFunction(format) {
        var array = format.match(formattingTokens), i, length;

        for (i = 0, length = array.length; i < length; i++) {
            if (formatTokenFunctions[array[i]]) {
                array[i] = formatTokenFunctions[array[i]];
            } else {
                array[i] = removeFormattingTokens(array[i]);
            }
        }

        return function (mom) {
            var output = '', i;
            for (i = 0; i < length; i++) {
                output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];
            }
            return output;
        };
    }

    // format date using native date object
    function formatMoment(m, format) {
        if (!m.isValid()) {
            return m.localeData().invalidDate();
        }

        format = expandFormat(format, m.localeData());
        formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);

        return formatFunctions[format](m);
    }

    function expandFormat(format, locale) {
        var i = 5;

        function replaceLongDateFormatTokens(input) {
            return locale.longDateFormat(input) || input;
        }

        localFormattingTokens.lastIndex = 0;
        while (i >= 0 && localFormattingTokens.test(format)) {
            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
            localFormattingTokens.lastIndex = 0;
            i -= 1;
        }

        return format;
    }

    var match1         = /\d/;            //       0 - 9
    var match2         = /\d\d/;          //      00 - 99
    var match3         = /\d{3}/;         //     000 - 999
    var match4         = /\d{4}/;         //    0000 - 9999
    var match6         = /[+-]?\d{6}/;    // -999999 - 999999
    var match1to2      = /\d\d?/;         //       0 - 99
    var match3to4      = /\d\d\d\d?/;     //     999 - 9999
    var match5to6      = /\d\d\d\d\d\d?/; //   99999 - 999999
    var match1to3      = /\d{1,3}/;       //       0 - 999
    var match1to4      = /\d{1,4}/;       //       0 - 9999
    var match1to6      = /[+-]?\d{1,6}/;  // -999999 - 999999

    var matchUnsigned  = /\d+/;           //       0 - inf
    var matchSigned    = /[+-]?\d+/;      //    -inf - inf

    var matchOffset    = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
    var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z

    var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123

    // any word (or two) characters or numbers including two/three word month in arabic.
    // includes scottish gaelic two word and hyphenated months
    var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;

    var regexes = {};

    function addRegexToken (token, regex, strictRegex) {
        regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
            return (isStrict && strictRegex) ? strictRegex : regex;
        };
    }

    function getParseRegexForToken (token, config) {
        if (!hasOwnProp(regexes, token)) {
            return new RegExp(unescapeFormat(token));
        }

        return regexes[token](config._strict, config._locale);
    }

    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
    function unescapeFormat(s) {
        return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
            return p1 || p2 || p3 || p4;
        }));
    }

    function regexEscape(s) {
        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    }

    var tokens = {};

    function addParseToken (token, callback) {
        var i, func = callback;
        if (typeof token === 'string') {
            token = [token];
        }
        if (isNumber(callback)) {
            func = function (input, array) {
                array[callback] = toInt(input);
            };
        }
        for (i = 0; i < token.length; i++) {
            tokens[token[i]] = func;
        }
    }

    function addWeekParseToken (token, callback) {
        addParseToken(token, function (input, array, config, token) {
            config._w = config._w || {};
            callback(input, config._w, config, token);
        });
    }

    function addTimeToArrayFromToken(token, input, config) {
        if (input != null && hasOwnProp(tokens, token)) {
            tokens[token](input, config._a, config, token);
        }
    }

    var YEAR = 0;
    var MONTH = 1;
    var DATE = 2;
    var HOUR = 3;
    var MINUTE = 4;
    var SECOND = 5;
    var MILLISECOND = 6;
    var WEEK = 7;
    var WEEKDAY = 8;

    // FORMATTING

    addFormatToken('Y', 0, 0, function () {
        var y = this.year();
        return y <= 9999 ? '' + y : '+' + y;
    });

    addFormatToken(0, ['YY', 2], 0, function () {
        return this.year() % 100;
    });

    addFormatToken(0, ['YYYY',   4],       0, 'year');
    addFormatToken(0, ['YYYYY',  5],       0, 'year');
    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');

    // ALIASES

    addUnitAlias('year', 'y');

    // PRIORITIES

    addUnitPriority('year', 1);

    // PARSING

    addRegexToken('Y',      matchSigned);
    addRegexToken('YY',     match1to2, match2);
    addRegexToken('YYYY',   match1to4, match4);
    addRegexToken('YYYYY',  match1to6, match6);
    addRegexToken('YYYYYY', match1to6, match6);

    addParseToken(['YYYYY', 'YYYYYY'], YEAR);
    addParseToken('YYYY', function (input, array) {
        array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
    });
    addParseToken('YY', function (input, array) {
        array[YEAR] = hooks.parseTwoDigitYear(input);
    });
    addParseToken('Y', function (input, array) {
        array[YEAR] = parseInt(input, 10);
    });

    // HELPERS

    function daysInYear(year) {
        return isLeapYear(year) ? 366 : 365;
    }

    function isLeapYear(year) {
        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
    }

    // HOOKS

    hooks.parseTwoDigitYear = function (input) {
        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
    };

    // MOMENTS

    var getSetYear = makeGetSet('FullYear', true);

    function getIsLeapYear () {
        return isLeapYear(this.year());
    }

    function makeGetSet (unit, keepTime) {
        return function (value) {
            if (value != null) {
                set$1(this, unit, value);
                hooks.updateOffset(this, keepTime);
                return this;
            } else {
                return get(this, unit);
            }
        };
    }

    function get (mom, unit) {
        return mom.isValid() ?
            mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
    }

    function set$1 (mom, unit, value) {
        if (mom.isValid() && !isNaN(value)) {
            if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {
                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));
            }
            else {
                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
            }
        }
    }

    // MOMENTS

    function stringGet (units) {
        units = normalizeUnits(units);
        if (isFunction(this[units])) {
            return this[units]();
        }
        return this;
    }


    function stringSet (units, value) {
        if (typeof units === 'object') {
            units = normalizeObjectUnits(units);
            var prioritized = getPrioritizedUnits(units);
            for (var i = 0; i < prioritized.length; i++) {
                this[prioritized[i].unit](units[prioritized[i].unit]);
            }
        } else {
            units = normalizeUnits(units);
            if (isFunction(this[units])) {
                return this[units](value);
            }
        }
        return this;
    }

    function mod(n, x) {
        return ((n % x) + x) % x;
    }

    var indexOf;

    if (Array.prototype.indexOf) {
        indexOf = Array.prototype.indexOf;
    } else {
        indexOf = function (o) {
            // I know
            var i;
            for (i = 0; i < this.length; ++i) {
                if (this[i] === o) {
                    return i;
                }
            }
            return -1;
        };
    }

    function daysInMonth(year, month) {
        if (isNaN(year) || isNaN(month)) {
            return NaN;
        }
        var modMonth = mod(month, 12);
        year += (month - modMonth) / 12;
        return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);
    }

    // FORMATTING

    addFormatToken('M', ['MM', 2], 'Mo', function () {
        return this.month() + 1;
    });

    addFormatToken('MMM', 0, 0, function (format) {
        return this.localeData().monthsShort(this, format);
    });

    addFormatToken('MMMM', 0, 0, function (format) {
        return this.localeData().months(this, format);
    });

    // ALIASES

    addUnitAlias('month', 'M');

    // PRIORITY

    addUnitPriority('month', 8);

    // PARSING

    addRegexToken('M',    match1to2);
    addRegexToken('MM',   match1to2, match2);
    addRegexToken('MMM',  function (isStrict, locale) {
        return locale.monthsShortRegex(isStrict);
    });
    addRegexToken('MMMM', function (isStrict, locale) {
        return locale.monthsRegex(isStrict);
    });

    addParseToken(['M', 'MM'], function (input, array) {
        array[MONTH] = toInt(input) - 1;
    });

    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
        var month = config._locale.monthsParse(input, token, config._strict);
        // if we didn't find a month name, mark the date as invalid.
        if (month != null) {
            array[MONTH] = month;
        } else {
            getParsingFlags(config).invalidMonth = input;
        }
    });

    // LOCALES

    var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
    function localeMonths (m, format) {
        if (!m) {
            return isArray(this._months) ? this._months :
                this._months['standalone'];
        }
        return isArray(this._months) ? this._months[m.month()] :
            this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
    }

    var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
    function localeMonthsShort (m, format) {
        if (!m) {
            return isArray(this._monthsShort) ? this._monthsShort :
                this._monthsShort['standalone'];
        }
        return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
            this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
    }

    function handleStrictParse(monthName, format, strict) {
        var i, ii, mom, llc = monthName.toLocaleLowerCase();
        if (!this._monthsParse) {
            // this is not used
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
            for (i = 0; i < 12; ++i) {
                mom = createUTC([2000, i]);
                this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeMonthsParse (monthName, format, strict) {
        var i, mom, regex;

        if (this._monthsParseExact) {
            return handleStrictParse.call(this, monthName, format, strict);
        }

        if (!this._monthsParse) {
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
        }

        // TODO: add sorting
        // Sorting makes sure if one month (or abbr) is a prefix of another
        // see sorting in computeMonthsParse
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, i]);
            if (strict && !this._longMonthsParse[i]) {
                this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
                this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
            }
            if (!strict && !this._monthsParse[i]) {
                regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
                return i;
            } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
                return i;
            } else if (!strict && this._monthsParse[i].test(monthName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function setMonth (mom, value) {
        var dayOfMonth;

        if (!mom.isValid()) {
            // No op
            return mom;
        }

        if (typeof value === 'string') {
            if (/^\d+$/.test(value)) {
                value = toInt(value);
            } else {
                value = mom.localeData().monthsParse(value);
                // TODO: Another silent failure?
                if (!isNumber(value)) {
                    return mom;
                }
            }
        }

        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
        return mom;
    }

    function getSetMonth (value) {
        if (value != null) {
            setMonth(this, value);
            hooks.updateOffset(this, true);
            return this;
        } else {
            return get(this, 'Month');
        }
    }

    function getDaysInMonth () {
        return daysInMonth(this.year(), this.month());
    }

    var defaultMonthsShortRegex = matchWord;
    function monthsShortRegex (isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsShortStrictRegex;
            } else {
                return this._monthsShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsShortRegex')) {
                this._monthsShortRegex = defaultMonthsShortRegex;
            }
            return this._monthsShortStrictRegex && isStrict ?
                this._monthsShortStrictRegex : this._monthsShortRegex;
        }
    }

    var defaultMonthsRegex = matchWord;
    function monthsRegex (isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsStrictRegex;
            } else {
                return this._monthsRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsRegex')) {
                this._monthsRegex = defaultMonthsRegex;
            }
            return this._monthsStrictRegex && isStrict ?
                this._monthsStrictRegex : this._monthsRegex;
        }
    }

    function computeMonthsParse () {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var shortPieces = [], longPieces = [], mixedPieces = [],
            i, mom;
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, i]);
            shortPieces.push(this.monthsShort(mom, ''));
            longPieces.push(this.months(mom, ''));
            mixedPieces.push(this.months(mom, ''));
            mixedPieces.push(this.monthsShort(mom, ''));
        }
        // Sorting makes sure if one month (or abbr) is a prefix of another it
        // will match the longer piece.
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);
        for (i = 0; i < 12; i++) {
            shortPieces[i] = regexEscape(shortPieces[i]);
            longPieces[i] = regexEscape(longPieces[i]);
        }
        for (i = 0; i < 24; i++) {
            mixedPieces[i] = regexEscape(mixedPieces[i]);
        }

        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._monthsShortRegex = this._monthsRegex;
        this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
        this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
    }

    function createDate (y, m, d, h, M, s, ms) {
        // can't just apply() to create a date:
        // https://stackoverflow.com/q/181348
        var date = new Date(y, m, d, h, M, s, ms);

        // the date constructor remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
            date.setFullYear(y);
        }
        return date;
    }

    function createUTCDate (y) {
        var date = new Date(Date.UTC.apply(null, arguments));

        // the Date.UTC function remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
            date.setUTCFullYear(y);
        }
        return date;
    }

    // start-of-first-week - start-of-year
    function firstWeekOffset(year, dow, doy) {
        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
            fwd = 7 + dow - doy,
            // first-week day local weekday -- which local weekday is fwd
            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;

        return -fwdlw + fwd - 1;
    }

    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
        var localWeekday = (7 + weekday - dow) % 7,
            weekOffset = firstWeekOffset(year, dow, doy),
            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
            resYear, resDayOfYear;

        if (dayOfYear <= 0) {
            resYear = year - 1;
            resDayOfYear = daysInYear(resYear) + dayOfYear;
        } else if (dayOfYear > daysInYear(year)) {
            resYear = year + 1;
            resDayOfYear = dayOfYear - daysInYear(year);
        } else {
            resYear = year;
            resDayOfYear = dayOfYear;
        }

        return {
            year: resYear,
            dayOfYear: resDayOfYear
        };
    }

    function weekOfYear(mom, dow, doy) {
        var weekOffset = firstWeekOffset(mom.year(), dow, doy),
            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
            resWeek, resYear;

        if (week < 1) {
            resYear = mom.year() - 1;
            resWeek = week + weeksInYear(resYear, dow, doy);
        } else if (week > weeksInYear(mom.year(), dow, doy)) {
            resWeek = week - weeksInYear(mom.year(), dow, doy);
            resYear = mom.year() + 1;
        } else {
            resYear = mom.year();
            resWeek = week;
        }

        return {
            week: resWeek,
            year: resYear
        };
    }

    function weeksInYear(year, dow, doy) {
        var weekOffset = firstWeekOffset(year, dow, doy),
            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
    }

    // FORMATTING

    addFormatToken('w', ['ww', 2], 'wo', 'week');
    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');

    // ALIASES

    addUnitAlias('week', 'w');
    addUnitAlias('isoWeek', 'W');

    // PRIORITIES

    addUnitPriority('week', 5);
    addUnitPriority('isoWeek', 5);

    // PARSING

    addRegexToken('w',  match1to2);
    addRegexToken('ww', match1to2, match2);
    addRegexToken('W',  match1to2);
    addRegexToken('WW', match1to2, match2);

    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
        week[token.substr(0, 1)] = toInt(input);
    });

    // HELPERS

    // LOCALES

    function localeWeek (mom) {
        return weekOfYear(mom, this._week.dow, this._week.doy).week;
    }

    var defaultLocaleWeek = {
        dow : 0, // Sunday is the first day of the week.
        doy : 6  // The week that contains Jan 1st is the first week of the year.
    };

    function localeFirstDayOfWeek () {
        return this._week.dow;
    }

    function localeFirstDayOfYear () {
        return this._week.doy;
    }

    // MOMENTS

    function getSetWeek (input) {
        var week = this.localeData().week(this);
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    function getSetISOWeek (input) {
        var week = weekOfYear(this, 1, 4).week;
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    // FORMATTING

    addFormatToken('d', 0, 'do', 'day');

    addFormatToken('dd', 0, 0, function (format) {
        return this.localeData().weekdaysMin(this, format);
    });

    addFormatToken('ddd', 0, 0, function (format) {
        return this.localeData().weekdaysShort(this, format);
    });

    addFormatToken('dddd', 0, 0, function (format) {
        return this.localeData().weekdays(this, format);
    });

    addFormatToken('e', 0, 0, 'weekday');
    addFormatToken('E', 0, 0, 'isoWeekday');

    // ALIASES

    addUnitAlias('day', 'd');
    addUnitAlias('weekday', 'e');
    addUnitAlias('isoWeekday', 'E');

    // PRIORITY
    addUnitPriority('day', 11);
    addUnitPriority('weekday', 11);
    addUnitPriority('isoWeekday', 11);

    // PARSING

    addRegexToken('d',    match1to2);
    addRegexToken('e',    match1to2);
    addRegexToken('E',    match1to2);
    addRegexToken('dd',   function (isStrict, locale) {
        return locale.weekdaysMinRegex(isStrict);
    });
    addRegexToken('ddd',   function (isStrict, locale) {
        return locale.weekdaysShortRegex(isStrict);
    });
    addRegexToken('dddd',   function (isStrict, locale) {
        return locale.weekdaysRegex(isStrict);
    });

    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
        var weekday = config._locale.weekdaysParse(input, token, config._strict);
        // if we didn't get a weekday name, mark the date as invalid
        if (weekday != null) {
            week.d = weekday;
        } else {
            getParsingFlags(config).invalidWeekday = input;
        }
    });

    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
        week[token] = toInt(input);
    });

    // HELPERS

    function parseWeekday(input, locale) {
        if (typeof input !== 'string') {
            return input;
        }

        if (!isNaN(input)) {
            return parseInt(input, 10);
        }

        input = locale.weekdaysParse(input);
        if (typeof input === 'number') {
            return input;
        }

        return null;
    }

    function parseIsoWeekday(input, locale) {
        if (typeof input === 'string') {
            return locale.weekdaysParse(input) % 7 || 7;
        }
        return isNaN(input) ? null : input;
    }

    // LOCALES

    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
    function localeWeekdays (m, format) {
        if (!m) {
            return isArray(this._weekdays) ? this._weekdays :
                this._weekdays['standalone'];
        }
        return isArray(this._weekdays) ? this._weekdays[m.day()] :
            this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
    }

    var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
    function localeWeekdaysShort (m) {
        return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
    }

    var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
    function localeWeekdaysMin (m) {
        return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
    }

    function handleStrictParse$1(weekdayName, format, strict) {
        var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._minWeekdaysParse = [];

            for (i = 0; i < 7; ++i) {
                mom = createUTC([2000, 1]).day(i);
                this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
                this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeWeekdaysParse (weekdayName, format, strict) {
        var i, mom, regex;

        if (this._weekdaysParseExact) {
            return handleStrictParse$1.call(this, weekdayName, format, strict);
        }

        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._minWeekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._fullWeekdaysParse = [];
        }

        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already

            mom = createUTC([2000, 1]).day(i);
            if (strict && !this._fullWeekdaysParse[i]) {
                this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');
                this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');
                this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');
            }
            if (!this._weekdaysParse[i]) {
                regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
                return i;
            } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
                return i;
            } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
                return i;
            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function getSetDayOfWeek (input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
        if (input != null) {
            input = parseWeekday(input, this.localeData());
            return this.add(input - day, 'd');
        } else {
            return day;
        }
    }

    function getSetLocaleDayOfWeek (input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
        return input == null ? weekday : this.add(input - weekday, 'd');
    }

    function getSetISODayOfWeek (input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }

        // behaves the same as moment#day except
        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
        // as a setter, sunday should belong to the previous week.

        if (input != null) {
            var weekday = parseIsoWeekday(input, this.localeData());
            return this.day(this.day() % 7 ? weekday : weekday - 7);
        } else {
            return this.day() || 7;
        }
    }

    var defaultWeekdaysRegex = matchWord;
    function weekdaysRegex (isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysStrictRegex;
            } else {
                return this._weekdaysRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                this._weekdaysRegex = defaultWeekdaysRegex;
            }
            return this._weekdaysStrictRegex && isStrict ?
                this._weekdaysStrictRegex : this._weekdaysRegex;
        }
    }

    var defaultWeekdaysShortRegex = matchWord;
    function weekdaysShortRegex (isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysShortStrictRegex;
            } else {
                return this._weekdaysShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysShortRegex')) {
                this._weekdaysShortRegex = defaultWeekdaysShortRegex;
            }
            return this._weekdaysShortStrictRegex && isStrict ?
                this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
        }
    }

    var defaultWeekdaysMinRegex = matchWord;
    function weekdaysMinRegex (isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysMinStrictRegex;
            } else {
                return this._weekdaysMinRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysMinRegex')) {
                this._weekdaysMinRegex = defaultWeekdaysMinRegex;
            }
            return this._weekdaysMinStrictRegex && isStrict ?
                this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
        }
    }


    function computeWeekdaysParse () {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
            i, mom, minp, shortp, longp;
        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, 1]).day(i);
            minp = this.weekdaysMin(mom, '');
            shortp = this.weekdaysShort(mom, '');
            longp = this.weekdays(mom, '');
            minPieces.push(minp);
            shortPieces.push(shortp);
            longPieces.push(longp);
            mixedPieces.push(minp);
            mixedPieces.push(shortp);
            mixedPieces.push(longp);
        }
        // Sorting makes sure if one weekday (or abbr) is a prefix of another it
        // will match the longer piece.
        minPieces.sort(cmpLenRev);
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);
        for (i = 0; i < 7; i++) {
            shortPieces[i] = regexEscape(shortPieces[i]);
            longPieces[i] = regexEscape(longPieces[i]);
            mixedPieces[i] = regexEscape(mixedPieces[i]);
        }

        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._weekdaysShortRegex = this._weekdaysRegex;
        this._weekdaysMinRegex = this._weekdaysRegex;

        this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
        this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
        this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
    }

    // FORMATTING

    function hFormat() {
        return this.hours() % 12 || 12;
    }

    function kFormat() {
        return this.hours() || 24;
    }

    addFormatToken('H', ['HH', 2], 0, 'hour');
    addFormatToken('h', ['hh', 2], 0, hFormat);
    addFormatToken('k', ['kk', 2], 0, kFormat);

    addFormatToken('hmm', 0, 0, function () {
        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
    });

    addFormatToken('hmmss', 0, 0, function () {
        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2);
    });

    addFormatToken('Hmm', 0, 0, function () {
        return '' + this.hours() + zeroFill(this.minutes(), 2);
    });

    addFormatToken('Hmmss', 0, 0, function () {
        return '' + this.hours() + zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2);
    });

    function meridiem (token, lowercase) {
        addFormatToken(token, 0, 0, function () {
            return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
        });
    }

    meridiem('a', true);
    meridiem('A', false);

    // ALIASES

    addUnitAlias('hour', 'h');

    // PRIORITY
    addUnitPriority('hour', 13);

    // PARSING

    function matchMeridiem (isStrict, locale) {
        return locale._meridiemParse;
    }

    addRegexToken('a',  matchMeridiem);
    addRegexToken('A',  matchMeridiem);
    addRegexToken('H',  match1to2);
    addRegexToken('h',  match1to2);
    addRegexToken('k',  match1to2);
    addRegexToken('HH', match1to2, match2);
    addRegexToken('hh', match1to2, match2);
    addRegexToken('kk', match1to2, match2);

    addRegexToken('hmm', match3to4);
    addRegexToken('hmmss', match5to6);
    addRegexToken('Hmm', match3to4);
    addRegexToken('Hmmss', match5to6);

    addParseToken(['H', 'HH'], HOUR);
    addParseToken(['k', 'kk'], function (input, array, config) {
        var kInput = toInt(input);
        array[HOUR] = kInput === 24 ? 0 : kInput;
    });
    addParseToken(['a', 'A'], function (input, array, config) {
        config._isPm = config._locale.isPM(input);
        config._meridiem = input;
    });
    addParseToken(['h', 'hh'], function (input, array, config) {
        array[HOUR] = toInt(input);
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmmss', function (input, array, config) {
        var pos1 = input.length - 4;
        var pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('Hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
    });
    addParseToken('Hmmss', function (input, array, config) {
        var pos1 = input.length - 4;
        var pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
    });

    // LOCALES

    function localeIsPM (input) {
        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
        // Using charAt should be more compatible.
        return ((input + '').toLowerCase().charAt(0) === 'p');
    }

    var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
    function localeMeridiem (hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'pm' : 'PM';
        } else {
            return isLower ? 'am' : 'AM';
        }
    }


    // MOMENTS

    // Setting the hour should keep the time, because the user explicitly
    // specified which hour they want. So trying to maintain the same hour (in
    // a new timezone) makes sense. Adding/subtracting hours does not follow
    // this rule.
    var getSetHour = makeGetSet('Hours', true);

    var baseConfig = {
        calendar: defaultCalendar,
        longDateFormat: defaultLongDateFormat,
        invalidDate: defaultInvalidDate,
        ordinal: defaultOrdinal,
        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
        relativeTime: defaultRelativeTime,

        months: defaultLocaleMonths,
        monthsShort: defaultLocaleMonthsShort,

        week: defaultLocaleWeek,

        weekdays: defaultLocaleWeekdays,
        weekdaysMin: defaultLocaleWeekdaysMin,
        weekdaysShort: defaultLocaleWeekdaysShort,

        meridiemParse: defaultLocaleMeridiemParse
    };

    // internal storage for locale config files
    var locales = {};
    var localeFamilies = {};
    var globalLocale;

    function normalizeLocale(key) {
        return key ? key.toLowerCase().replace('_', '-') : key;
    }

    // pick the locale from the array
    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
    function chooseLocale(names) {
        var i = 0, j, next, locale, split;

        while (i < names.length) {
            split = normalizeLocale(names[i]).split('-');
            j = split.length;
            next = normalizeLocale(names[i + 1]);
            next = next ? next.split('-') : null;
            while (j > 0) {
                locale = loadLocale(split.slice(0, j).join('-'));
                if (locale) {
                    return locale;
                }
                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
                    //the next array item is better than a shallower substring of this one
                    break;
                }
                j--;
            }
            i++;
        }
        return globalLocale;
    }

    function loadLocale(name) {
        var oldLocale = null;
        // TODO: Find a better way to register and load all the locales in Node
        if (!locales[name] && (typeof module !== 'undefined') &&
                module && module.exports) {
            try {
                oldLocale = globalLocale._abbr;
                var aliasedRequire = require;
                aliasedRequire('./locale/' + name);
                getSetGlobalLocale(oldLocale);
            } catch (e) {}
        }
        return locales[name];
    }

    // This function will load locale and then set the global locale.  If
    // no arguments are passed in, it will simply return the current global
    // locale key.
    function getSetGlobalLocale (key, values) {
        var data;
        if (key) {
            if (isUndefined(values)) {
                data = getLocale(key);
            }
            else {
                data = defineLocale(key, values);
            }

            if (data) {
                // moment.duration._locale = moment._locale = data;
                globalLocale = data;
            }
            else {
                if ((typeof console !==  'undefined') && console.warn) {
                    //warn user if arguments are passed but the locale could not be set
                    console.warn('Locale ' + key +  ' not found. Did you forget to load it?');
                }
            }
        }

        return globalLocale._abbr;
    }

    function defineLocale (name, config) {
        if (config !== null) {
            var locale, parentConfig = baseConfig;
            config.abbr = name;
            if (locales[name] != null) {
                deprecateSimple('defineLocaleOverride',
                        'use moment.updateLocale(localeName, config) to change ' +
                        'an existing locale. moment.defineLocale(localeName, ' +
                        'config) should only be used for creating a new locale ' +
                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
                parentConfig = locales[name]._config;
            } else if (config.parentLocale != null) {
                if (locales[config.parentLocale] != null) {
                    parentConfig = locales[config.parentLocale]._config;
                } else {
                    locale = loadLocale(config.parentLocale);
                    if (locale != null) {
                        parentConfig = locale._config;
                    } else {
                        if (!localeFamilies[config.parentLocale]) {
                            localeFamilies[config.parentLocale] = [];
                        }
                        localeFamilies[config.parentLocale].push({
                            name: name,
                            config: config
                        });
                        return null;
                    }
                }
            }
            locales[name] = new Locale(mergeConfigs(parentConfig, config));

            if (localeFamilies[name]) {
                localeFamilies[name].forEach(function (x) {
                    defineLocale(x.name, x.config);
                });
            }

            // backwards compat for now: also set the locale
            // make sure we set the locale AFTER all child locales have been
            // created, so we won't end up with the child locale set.
            getSetGlobalLocale(name);


            return locales[name];
        } else {
            // useful for testing
            delete locales[name];
            return null;
        }
    }

    function updateLocale(name, config) {
        if (config != null) {
            var locale, tmpLocale, parentConfig = baseConfig;
            // MERGE
            tmpLocale = loadLocale(name);
            if (tmpLocale != null) {
                parentConfig = tmpLocale._config;
            }
            config = mergeConfigs(parentConfig, config);
            locale = new Locale(config);
            locale.parentLocale = locales[name];
            locales[name] = locale;

            // backwards compat for now: also set the locale
            getSetGlobalLocale(name);
        } else {
            // pass null for config to unupdate, useful for tests
            if (locales[name] != null) {
                if (locales[name].parentLocale != null) {
                    locales[name] = locales[name].parentLocale;
                } else if (locales[name] != null) {
                    delete locales[name];
                }
            }
        }
        return locales[name];
    }

    // returns locale data
    function getLocale (key) {
        var locale;

        if (key && key._locale && key._locale._abbr) {
            key = key._locale._abbr;
        }

        if (!key) {
            return globalLocale;
        }

        if (!isArray(key)) {
            //short-circuit everything else
            locale = loadLocale(key);
            if (locale) {
                return locale;
            }
            key = [key];
        }

        return chooseLocale(key);
    }

    function listLocales() {
        return keys(locales);
    }

    function checkOverflow (m) {
        var overflow;
        var a = m._a;

        if (a && getParsingFlags(m).overflow === -2) {
            overflow =
                a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :
                a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
                a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
                a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :
                a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :
                a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
                -1;

            if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
                overflow = DATE;
            }
            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
                overflow = WEEK;
            }
            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
                overflow = WEEKDAY;
            }

            getParsingFlags(m).overflow = overflow;
        }

        return m;
    }

    // Pick the first defined of two or three arguments.
    function defaults(a, b, c) {
        if (a != null) {
            return a;
        }
        if (b != null) {
            return b;
        }
        return c;
    }

    function currentDateArray(config) {
        // hooks is actually the exported moment object
        var nowValue = new Date(hooks.now());
        if (config._useUTC) {
            return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
        }
        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
    }

    // convert an array to a date.
    // the array should mirror the parameters below
    // note: all values past the year are optional and will default to the lowest possible value.
    // [year, month, day , hour, minute, second, millisecond]
    function configFromArray (config) {
        var i, date, input = [], currentDate, expectedWeekday, yearToUse;

        if (config._d) {
            return;
        }

        currentDate = currentDateArray(config);

        //compute day of the year from weeks and weekdays
        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
            dayOfYearFromWeekInfo(config);
        }

        //if the day of the year is set, figure out what it is
        if (config._dayOfYear != null) {
            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);

            if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {
                getParsingFlags(config)._overflowDayOfYear = true;
            }

            date = createUTCDate(yearToUse, 0, config._dayOfYear);
            config._a[MONTH] = date.getUTCMonth();
            config._a[DATE] = date.getUTCDate();
        }

        // Default to current date.
        // * if no year, month, day of month are given, default to today
        // * if day of month is given, default month and year
        // * if month is given, default only year
        // * if year is given, don't default anything
        for (i = 0; i < 3 && config._a[i] == null; ++i) {
            config._a[i] = input[i] = currentDate[i];
        }

        // Zero out whatever was not defaulted, including time
        for (; i < 7; i++) {
            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
        }

        // Check for 24:00:00.000
        if (config._a[HOUR] === 24 &&
                config._a[MINUTE] === 0 &&
                config._a[SECOND] === 0 &&
                config._a[MILLISECOND] === 0) {
            config._nextDay = true;
            config._a[HOUR] = 0;
        }

        config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
        expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();

        // Apply timezone offset from input. The actual utcOffset can be changed
        // with parseZone.
        if (config._tzm != null) {
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
        }

        if (config._nextDay) {
            config._a[HOUR] = 24;
        }

        // check for mismatching day of week
        if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {
            getParsingFlags(config).weekdayMismatch = true;
        }
    }

    function dayOfYearFromWeekInfo(config) {
        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;

        w = config._w;
        if (w.GG != null || w.W != null || w.E != null) {
            dow = 1;
            doy = 4;

            // TODO: We need to take the current isoWeekYear, but that depends on
            // how we interpret now (local, utc, fixed offset). So create
            // a now version of current config (take local/utc/offset flags, and
            // create now).
            weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
            week = defaults(w.W, 1);
            weekday = defaults(w.E, 1);
            if (weekday < 1 || weekday > 7) {
                weekdayOverflow = true;
            }
        } else {
            dow = config._locale._week.dow;
            doy = config._locale._week.doy;

            var curWeek = weekOfYear(createLocal(), dow, doy);

            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);

            // Default to current week.
            week = defaults(w.w, curWeek.week);

            if (w.d != null) {
                // weekday -- low day numbers are considered next week
                weekday = w.d;
                if (weekday < 0 || weekday > 6) {
                    weekdayOverflow = true;
                }
            } else if (w.e != null) {
                // local weekday -- counting starts from begining of week
                weekday = w.e + dow;
                if (w.e < 0 || w.e > 6) {
                    weekdayOverflow = true;
                }
            } else {
                // default to begining of week
                weekday = dow;
            }
        }
        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
            getParsingFlags(config)._overflowWeeks = true;
        } else if (weekdayOverflow != null) {
            getParsingFlags(config)._overflowWeekday = true;
        } else {
            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
            config._a[YEAR] = temp.year;
            config._dayOfYear = temp.dayOfYear;
        }
    }

    // iso 8601 regex
    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
    var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
    var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;

    var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;

    var isoDates = [
        ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
        ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
        ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
        ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
        ['YYYY-DDD', /\d{4}-\d{3}/],
        ['YYYY-MM', /\d{4}-\d\d/, false],
        ['YYYYYYMMDD', /[+-]\d{10}/],
        ['YYYYMMDD', /\d{8}/],
        // YYYYMM is NOT allowed by the standard
        ['GGGG[W]WWE', /\d{4}W\d{3}/],
        ['GGGG[W]WW', /\d{4}W\d{2}/, false],
        ['YYYYDDD', /\d{7}/]
    ];

    // iso time formats and regexes
    var isoTimes = [
        ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
        ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
        ['HH:mm:ss', /\d\d:\d\d:\d\d/],
        ['HH:mm', /\d\d:\d\d/],
        ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
        ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
        ['HHmmss', /\d\d\d\d\d\d/],
        ['HHmm', /\d\d\d\d/],
        ['HH', /\d\d/]
    ];

    var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;

    // date from iso format
    function configFromISO(config) {
        var i, l,
            string = config._i,
            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
            allowTime, dateFormat, timeFormat, tzFormat;

        if (match) {
            getParsingFlags(config).iso = true;

            for (i = 0, l = isoDates.length; i < l; i++) {
                if (isoDates[i][1].exec(match[1])) {
                    dateFormat = isoDates[i][0];
                    allowTime = isoDates[i][2] !== false;
                    break;
                }
            }
            if (dateFormat == null) {
                config._isValid = false;
                return;
            }
            if (match[3]) {
                for (i = 0, l = isoTimes.length; i < l; i++) {
                    if (isoTimes[i][1].exec(match[3])) {
                        // match[2] should be 'T' or space
                        timeFormat = (match[2] || ' ') + isoTimes[i][0];
                        break;
                    }
                }
                if (timeFormat == null) {
                    config._isValid = false;
                    return;
                }
            }
            if (!allowTime && timeFormat != null) {
                config._isValid = false;
                return;
            }
            if (match[4]) {
                if (tzRegex.exec(match[4])) {
                    tzFormat = 'Z';
                } else {
                    config._isValid = false;
                    return;
                }
            }
            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
            configFromStringAndFormat(config);
        } else {
            config._isValid = false;
        }
    }

    // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
    var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;

    function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {
        var result = [
            untruncateYear(yearStr),
            defaultLocaleMonthsShort.indexOf(monthStr),
            parseInt(dayStr, 10),
            parseInt(hourStr, 10),
            parseInt(minuteStr, 10)
        ];

        if (secondStr) {
            result.push(parseInt(secondStr, 10));
        }

        return result;
    }

    function untruncateYear(yearStr) {
        var year = parseInt(yearStr, 10);
        if (year <= 49) {
            return 2000 + year;
        } else if (year <= 999) {
            return 1900 + year;
        }
        return year;
    }

    function preprocessRFC2822(s) {
        // Remove comments and folding whitespace and replace multiple-spaces with a single space
        return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, '');
    }

    function checkWeekday(weekdayStr, parsedInput, config) {
        if (weekdayStr) {
            // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.
            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
                weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();
            if (weekdayProvided !== weekdayActual) {
                getParsingFlags(config).weekdayMismatch = true;
                config._isValid = false;
                return false;
            }
        }
        return true;
    }

    var obsOffsets = {
        UT: 0,
        GMT: 0,
        EDT: -4 * 60,
        EST: -5 * 60,
        CDT: -5 * 60,
        CST: -6 * 60,
        MDT: -6 * 60,
        MST: -7 * 60,
        PDT: -7 * 60,
        PST: -8 * 60
    };

    function calculateOffset(obsOffset, militaryOffset, numOffset) {
        if (obsOffset) {
            return obsOffsets[obsOffset];
        } else if (militaryOffset) {
            // the only allowed military tz is Z
            return 0;
        } else {
            var hm = parseInt(numOffset, 10);
            var m = hm % 100, h = (hm - m) / 100;
            return h * 60 + m;
        }
    }

    // date and time from ref 2822 format
    function configFromRFC2822(config) {
        var match = rfc2822.exec(preprocessRFC2822(config._i));
        if (match) {
            var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);
            if (!checkWeekday(match[1], parsedArray, config)) {
                return;
            }

            config._a = parsedArray;
            config._tzm = calculateOffset(match[8], match[9], match[10]);

            config._d = createUTCDate.apply(null, config._a);
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);

            getParsingFlags(config).rfc2822 = true;
        } else {
            config._isValid = false;
        }
    }

    // date from iso format or fallback
    function configFromString(config) {
        var matched = aspNetJsonRegex.exec(config._i);

        if (matched !== null) {
            config._d = new Date(+matched[1]);
            return;
        }

        configFromISO(config);
        if (config._isValid === false) {
            delete config._isValid;
        } else {
            return;
        }

        configFromRFC2822(config);
        if (config._isValid === false) {
            delete config._isValid;
        } else {
            return;
        }

        // Final attempt, use Input Fallback
        hooks.createFromInputFallback(config);
    }

    hooks.createFromInputFallback = deprecate(
        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
        'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
        'discouraged and will be removed in an upcoming major release. Please refer to ' +
        'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
        function (config) {
            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
        }
    );

    // constant that refers to the ISO standard
    hooks.ISO_8601 = function () {};

    // constant that refers to the RFC 2822 form
    hooks.RFC_2822 = function () {};

    // date from string and format string
    function configFromStringAndFormat(config) {
        // TODO: Move this to another part of the creation flow to prevent circular deps
        if (config._f === hooks.ISO_8601) {
            configFromISO(config);
            return;
        }
        if (config._f === hooks.RFC_2822) {
            configFromRFC2822(config);
            return;
        }
        config._a = [];
        getParsingFlags(config).empty = true;

        // This array is used to make a Date, either with `new Date` or `Date.UTC`
        var string = '' + config._i,
            i, parsedInput, tokens, token, skipped,
            stringLength = string.length,
            totalParsedInputLength = 0;

        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];

        for (i = 0; i < tokens.length; i++) {
            token = tokens[i];
            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
            // console.log('token', token, 'parsedInput', parsedInput,
            //         'regex', getParseRegexForToken(token, config));
            if (parsedInput) {
                skipped = string.substr(0, string.indexOf(parsedInput));
                if (skipped.length > 0) {
                    getParsingFlags(config).unusedInput.push(skipped);
                }
                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
                totalParsedInputLength += parsedInput.length;
            }
            // don't parse if it's not a known token
            if (formatTokenFunctions[token]) {
                if (parsedInput) {
                    getParsingFlags(config).empty = false;
                }
                else {
                    getParsingFlags(config).unusedTokens.push(token);
                }
                addTimeToArrayFromToken(token, parsedInput, config);
            }
            else if (config._strict && !parsedInput) {
                getParsingFlags(config).unusedTokens.push(token);
            }
        }

        // add remaining unparsed input length to the string
        getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
        if (string.length > 0) {
            getParsingFlags(config).unusedInput.push(string);
        }

        // clear _12h flag if hour is <= 12
        if (config._a[HOUR] <= 12 &&
            getParsingFlags(config).bigHour === true &&
            config._a[HOUR] > 0) {
            getParsingFlags(config).bigHour = undefined;
        }

        getParsingFlags(config).parsedDateParts = config._a.slice(0);
        getParsingFlags(config).meridiem = config._meridiem;
        // handle meridiem
        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);

        configFromArray(config);
        checkOverflow(config);
    }


    function meridiemFixWrap (locale, hour, meridiem) {
        var isPm;

        if (meridiem == null) {
            // nothing to do
            return hour;
        }
        if (locale.meridiemHour != null) {
            return locale.meridiemHour(hour, meridiem);
        } else if (locale.isPM != null) {
            // Fallback
            isPm = locale.isPM(meridiem);
            if (isPm && hour < 12) {
                hour += 12;
            }
            if (!isPm && hour === 12) {
                hour = 0;
            }
            return hour;
        } else {
            // this is not supposed to happen
            return hour;
        }
    }

    // date from string and array of format strings
    function configFromStringAndArray(config) {
        var tempConfig,
            bestMoment,

            scoreToBeat,
            i,
            currentScore;

        if (config._f.length === 0) {
            getParsingFlags(config).invalidFormat = true;
            config._d = new Date(NaN);
            return;
        }

        for (i = 0; i < config._f.length; i++) {
            currentScore = 0;
            tempConfig = copyConfig({}, config);
            if (config._useUTC != null) {
                tempConfig._useUTC = config._useUTC;
            }
            tempConfig._f = config._f[i];
            configFromStringAndFormat(tempConfig);

            if (!isValid(tempConfig)) {
                continue;
            }

            // if there is any input that was not parsed add a penalty for that format
            currentScore += getParsingFlags(tempConfig).charsLeftOver;

            //or tokens
            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;

            getParsingFlags(tempConfig).score = currentScore;

            if (scoreToBeat == null || currentScore < scoreToBeat) {
                scoreToBeat = currentScore;
                bestMoment = tempConfig;
            }
        }

        extend(config, bestMoment || tempConfig);
    }

    function configFromObject(config) {
        if (config._d) {
            return;
        }

        var i = normalizeObjectUnits(config._i);
        config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
            return obj && parseInt(obj, 10);
        });

        configFromArray(config);
    }

    function createFromConfig (config) {
        var res = new Moment(checkOverflow(prepareConfig(config)));
        if (res._nextDay) {
            // Adding is smart enough around DST
            res.add(1, 'd');
            res._nextDay = undefined;
        }

        return res;
    }

    function prepareConfig (config) {
        var input = config._i,
            format = config._f;

        config._locale = config._locale || getLocale(config._l);

        if (input === null || (format === undefined && input === '')) {
            return createInvalid({nullInput: true});
        }

        if (typeof input === 'string') {
            config._i = input = config._locale.preparse(input);
        }

        if (isMoment(input)) {
            return new Moment(checkOverflow(input));
        } else if (isDate(input)) {
            config._d = input;
        } else if (isArray(format)) {
            configFromStringAndArray(config);
        } else if (format) {
            configFromStringAndFormat(config);
        }  else {
            configFromInput(config);
        }

        if (!isValid(config)) {
            config._d = null;
        }

        return config;
    }

    function configFromInput(config) {
        var input = config._i;
        if (isUndefined(input)) {
            config._d = new Date(hooks.now());
        } else if (isDate(input)) {
            config._d = new Date(input.valueOf());
        } else if (typeof input === 'string') {
            configFromString(config);
        } else if (isArray(input)) {
            config._a = map(input.slice(0), function (obj) {
                return parseInt(obj, 10);
            });
            configFromArray(config);
        } else if (isObject(input)) {
            configFromObject(config);
        } else if (isNumber(input)) {
            // from milliseconds
            config._d = new Date(input);
        } else {
            hooks.createFromInputFallback(config);
        }
    }

    function createLocalOrUTC (input, format, locale, strict, isUTC) {
        var c = {};

        if (locale === true || locale === false) {
            strict = locale;
            locale = undefined;
        }

        if ((isObject(input) && isObjectEmpty(input)) ||
                (isArray(input) && input.length === 0)) {
            input = undefined;
        }
        // object construction must be done this way.
        // https://github.com/moment/moment/issues/1423
        c._isAMomentObject = true;
        c._useUTC = c._isUTC = isUTC;
        c._l = locale;
        c._i = input;
        c._f = format;
        c._strict = strict;

        return createFromConfig(c);
    }

    function createLocal (input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, false);
    }

    var prototypeMin = deprecate(
        'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
        function () {
            var other = createLocal.apply(null, arguments);
            if (this.isValid() && other.isValid()) {
                return other < this ? this : other;
            } else {
                return createInvalid();
            }
        }
    );

    var prototypeMax = deprecate(
        'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
        function () {
            var other = createLocal.apply(null, arguments);
            if (this.isValid() && other.isValid()) {
                return other > this ? this : other;
            } else {
                return createInvalid();
            }
        }
    );

    // Pick a moment m from moments so that m[fn](other) is true for all
    // other. This relies on the function fn to be transitive.
    //
    // moments should either be an array of moment objects or an array, whose
    // first element is an array of moment objects.
    function pickBy(fn, moments) {
        var res, i;
        if (moments.length === 1 && isArray(moments[0])) {
            moments = moments[0];
        }
        if (!moments.length) {
            return createLocal();
        }
        res = moments[0];
        for (i = 1; i < moments.length; ++i) {
            if (!moments[i].isValid() || moments[i][fn](res)) {
                res = moments[i];
            }
        }
        return res;
    }

    // TODO: Use [].sort instead?
    function min () {
        var args = [].slice.call(arguments, 0);

        return pickBy('isBefore', args);
    }

    function max () {
        var args = [].slice.call(arguments, 0);

        return pickBy('isAfter', args);
    }

    var now = function () {
        return Date.now ? Date.now() : +(new Date());
    };

    var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];

    function isDurationValid(m) {
        for (var key in m) {
            if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {
                return false;
            }
        }

        var unitHasDecimal = false;
        for (var i = 0; i < ordering.length; ++i) {
            if (m[ordering[i]]) {
                if (unitHasDecimal) {
                    return false; // only allow non-integers for smallest unit
                }
                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
                    unitHasDecimal = true;
                }
            }
        }

        return true;
    }

    function isValid$1() {
        return this._isValid;
    }

    function createInvalid$1() {
        return createDuration(NaN);
    }

    function Duration (duration) {
        var normalizedInput = normalizeObjectUnits(duration),
            years = normalizedInput.year || 0,
            quarters = normalizedInput.quarter || 0,
            months = normalizedInput.month || 0,
            weeks = normalizedInput.week || 0,
            days = normalizedInput.day || 0,
            hours = normalizedInput.hour || 0,
            minutes = normalizedInput.minute || 0,
            seconds = normalizedInput.second || 0,
            milliseconds = normalizedInput.millisecond || 0;

        this._isValid = isDurationValid(normalizedInput);

        // representation for dateAddRemove
        this._milliseconds = +milliseconds +
            seconds * 1e3 + // 1000
            minutes * 6e4 + // 1000 * 60
            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
        // Because of dateAddRemove treats 24 hours as different from a
        // day when working around DST, we need to store them separately
        this._days = +days +
            weeks * 7;
        // It is impossible to translate months into days without knowing
        // which months you are are talking about, so we have to store
        // it separately.
        this._months = +months +
            quarters * 3 +
            years * 12;

        this._data = {};

        this._locale = getLocale();

        this._bubble();
    }

    function isDuration (obj) {
        return obj instanceof Duration;
    }

    function absRound (number) {
        if (number < 0) {
            return Math.round(-1 * number) * -1;
        } else {
            return Math.round(number);
        }
    }

    // FORMATTING

    function offset (token, separator) {
        addFormatToken(token, 0, 0, function () {
            var offset = this.utcOffset();
            var sign = '+';
            if (offset < 0) {
                offset = -offset;
                sign = '-';
            }
            return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
        });
    }

    offset('Z', ':');
    offset('ZZ', '');

    // PARSING

    addRegexToken('Z',  matchShortOffset);
    addRegexToken('ZZ', matchShortOffset);
    addParseToken(['Z', 'ZZ'], function (input, array, config) {
        config._useUTC = true;
        config._tzm = offsetFromString(matchShortOffset, input);
    });

    // HELPERS

    // timezone chunker
    // '+10:00' > ['10',  '00']
    // '-1530'  > ['-15', '30']
    var chunkOffset = /([\+\-]|\d\d)/gi;

    function offsetFromString(matcher, string) {
        var matches = (string || '').match(matcher);

        if (matches === null) {
            return null;
        }

        var chunk   = matches[matches.length - 1] || [];
        var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];
        var minutes = +(parts[1] * 60) + toInt(parts[2]);

        return minutes === 0 ?
          0 :
          parts[0] === '+' ? minutes : -minutes;
    }

    // Return a moment from input, that is local/utc/zone equivalent to model.
    function cloneWithOffset(input, model) {
        var res, diff;
        if (model._isUTC) {
            res = model.clone();
            diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
            // Use low-level api, because this fn is low-level api.
            res._d.setTime(res._d.valueOf() + diff);
            hooks.updateOffset(res, false);
            return res;
        } else {
            return createLocal(input).local();
        }
    }

    function getDateOffset (m) {
        // On Firefox.24 Date#getTimezoneOffset returns a floating point.
        // https://github.com/moment/moment/pull/1871
        return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
    }

    // HOOKS

    // This function will be called whenever a moment is mutated.
    // It is intended to keep the offset in sync with the timezone.
    hooks.updateOffset = function () {};

    // MOMENTS

    // keepLocalTime = true means only change the timezone, without
    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
    // +0200, so we adjust the time as needed, to be valid.
    //
    // Keeping the time actually adds/subtracts (one hour)
    // from the actual represented time. That is why we call updateOffset
    // a second time. In case it wants us to change the offset again
    // _changeInProgress == true case, then we have to adjust, because
    // there is no such time in the given timezone.
    function getSetOffset (input, keepLocalTime, keepMinutes) {
        var offset = this._offset || 0,
            localAdjust;
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        if (input != null) {
            if (typeof input === 'string') {
                input = offsetFromString(matchShortOffset, input);
                if (input === null) {
                    return this;
                }
            } else if (Math.abs(input) < 16 && !keepMinutes) {
                input = input * 60;
            }
            if (!this._isUTC && keepLocalTime) {
                localAdjust = getDateOffset(this);
            }
            this._offset = input;
            this._isUTC = true;
            if (localAdjust != null) {
                this.add(localAdjust, 'm');
            }
            if (offset !== input) {
                if (!keepLocalTime || this._changeInProgress) {
                    addSubtract(this, createDuration(input - offset, 'm'), 1, false);
                } else if (!this._changeInProgress) {
                    this._changeInProgress = true;
                    hooks.updateOffset(this, true);
                    this._changeInProgress = null;
                }
            }
            return this;
        } else {
            return this._isUTC ? offset : getDateOffset(this);
        }
    }

    function getSetZone (input, keepLocalTime) {
        if (input != null) {
            if (typeof input !== 'string') {
                input = -input;
            }

            this.utcOffset(input, keepLocalTime);

            return this;
        } else {
            return -this.utcOffset();
        }
    }

    function setOffsetToUTC (keepLocalTime) {
        return this.utcOffset(0, keepLocalTime);
    }

    function setOffsetToLocal (keepLocalTime) {
        if (this._isUTC) {
            this.utcOffset(0, keepLocalTime);
            this._isUTC = false;

            if (keepLocalTime) {
                this.subtract(getDateOffset(this), 'm');
            }
        }
        return this;
    }

    function setOffsetToParsedOffset () {
        if (this._tzm != null) {
            this.utcOffset(this._tzm, false, true);
        } else if (typeof this._i === 'string') {
            var tZone = offsetFromString(matchOffset, this._i);
            if (tZone != null) {
                this.utcOffset(tZone);
            }
            else {
                this.utcOffset(0, true);
            }
        }
        return this;
    }

    function hasAlignedHourOffset (input) {
        if (!this.isValid()) {
            return false;
        }
        input = input ? createLocal(input).utcOffset() : 0;

        return (this.utcOffset() - input) % 60 === 0;
    }

    function isDaylightSavingTime () {
        return (
            this.utcOffset() > this.clone().month(0).utcOffset() ||
            this.utcOffset() > this.clone().month(5).utcOffset()
        );
    }

    function isDaylightSavingTimeShifted () {
        if (!isUndefined(this._isDSTShifted)) {
            return this._isDSTShifted;
        }

        var c = {};

        copyConfig(c, this);
        c = prepareConfig(c);

        if (c._a) {
            var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
            this._isDSTShifted = this.isValid() &&
                compareArrays(c._a, other.toArray()) > 0;
        } else {
            this._isDSTShifted = false;
        }

        return this._isDSTShifted;
    }

    function isLocal () {
        return this.isValid() ? !this._isUTC : false;
    }

    function isUtcOffset () {
        return this.isValid() ? this._isUTC : false;
    }

    function isUtc () {
        return this.isValid() ? this._isUTC && this._offset === 0 : false;
    }

    // ASP.NET json date format regex
    var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;

    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
    // and further modified to allow for strings containing both week and day
    var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;

    function createDuration (input, key) {
        var duration = input,
            // matching against regexp is expensive, do it on demand
            match = null,
            sign,
            ret,
            diffRes;

        if (isDuration(input)) {
            duration = {
                ms : input._milliseconds,
                d  : input._days,
                M  : input._months
            };
        } else if (isNumber(input)) {
            duration = {};
            if (key) {
                duration[key] = input;
            } else {
                duration.milliseconds = input;
            }
        } else if (!!(match = aspNetRegex.exec(input))) {
            sign = (match[1] === '-') ? -1 : 1;
            duration = {
                y  : 0,
                d  : toInt(match[DATE])                         * sign,
                h  : toInt(match[HOUR])                         * sign,
                m  : toInt(match[MINUTE])                       * sign,
                s  : toInt(match[SECOND])                       * sign,
                ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
            };
        } else if (!!(match = isoRegex.exec(input))) {
            sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;
            duration = {
                y : parseIso(match[2], sign),
                M : parseIso(match[3], sign),
                w : parseIso(match[4], sign),
                d : parseIso(match[5], sign),
                h : parseIso(match[6], sign),
                m : parseIso(match[7], sign),
                s : parseIso(match[8], sign)
            };
        } else if (duration == null) {// checks for null or undefined
            duration = {};
        } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
            diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));

            duration = {};
            duration.ms = diffRes.milliseconds;
            duration.M = diffRes.months;
        }

        ret = new Duration(duration);

        if (isDuration(input) && hasOwnProp(input, '_locale')) {
            ret._locale = input._locale;
        }

        return ret;
    }

    createDuration.fn = Duration.prototype;
    createDuration.invalid = createInvalid$1;

    function parseIso (inp, sign) {
        // We'd normally use ~~inp for this, but unfortunately it also
        // converts floats to ints.
        // inp may be undefined, so careful calling replace on it.
        var res = inp && parseFloat(inp.replace(',', '.'));
        // apply sign while we're at it
        return (isNaN(res) ? 0 : res) * sign;
    }

    function positiveMomentsDifference(base, other) {
        var res = {milliseconds: 0, months: 0};

        res.months = other.month() - base.month() +
            (other.year() - base.year()) * 12;
        if (base.clone().add(res.months, 'M').isAfter(other)) {
            --res.months;
        }

        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));

        return res;
    }

    function momentsDifference(base, other) {
        var res;
        if (!(base.isValid() && other.isValid())) {
            return {milliseconds: 0, months: 0};
        }

        other = cloneWithOffset(other, base);
        if (base.isBefore(other)) {
            res = positiveMomentsDifference(base, other);
        } else {
            res = positiveMomentsDifference(other, base);
            res.milliseconds = -res.milliseconds;
            res.months = -res.months;
        }

        return res;
    }

    // TODO: remove 'name' arg after deprecation is removed
    function createAdder(direction, name) {
        return function (val, period) {
            var dur, tmp;
            //invert the arguments, but complain about it
            if (period !== null && !isNaN(+period)) {
                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
                'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
                tmp = val; val = period; period = tmp;
            }

            val = typeof val === 'string' ? +val : val;
            dur = createDuration(val, period);
            addSubtract(this, dur, direction);
            return this;
        };
    }

    function addSubtract (mom, duration, isAdding, updateOffset) {
        var milliseconds = duration._milliseconds,
            days = absRound(duration._days),
            months = absRound(duration._months);

        if (!mom.isValid()) {
            // No op
            return;
        }

        updateOffset = updateOffset == null ? true : updateOffset;

        if (months) {
            setMonth(mom, get(mom, 'Month') + months * isAdding);
        }
        if (days) {
            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
        }
        if (milliseconds) {
            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
        }
        if (updateOffset) {
            hooks.updateOffset(mom, days || months);
        }
    }

    var add      = createAdder(1, 'add');
    var subtract = createAdder(-1, 'subtract');

    function getCalendarFormat(myMoment, now) {
        var diff = myMoment.diff(now, 'days', true);
        return diff < -6 ? 'sameElse' :
                diff < -1 ? 'lastWeek' :
                diff < 0 ? 'lastDay' :
                diff < 1 ? 'sameDay' :
                diff < 2 ? 'nextDay' :
                diff < 7 ? 'nextWeek' : 'sameElse';
    }

    function calendar$1 (time, formats) {
        // We want to compare the start of today, vs this.
        // Getting start-of-today depends on whether we're local/utc/offset or not.
        var now = time || createLocal(),
            sod = cloneWithOffset(now, this).startOf('day'),
            format = hooks.calendarFormat(this, sod) || 'sameElse';

        var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);

        return this.format(output || this.localeData().calendar(format, this, createLocal(now)));
    }

    function clone () {
        return new Moment(this);
    }

    function isAfter (input, units) {
        var localInput = isMoment(input) ? input : createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
        if (units === 'millisecond') {
            return this.valueOf() > localInput.valueOf();
        } else {
            return localInput.valueOf() < this.clone().startOf(units).valueOf();
        }
    }

    function isBefore (input, units) {
        var localInput = isMoment(input) ? input : createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
        if (units === 'millisecond') {
            return this.valueOf() < localInput.valueOf();
        } else {
            return this.clone().endOf(units).valueOf() < localInput.valueOf();
        }
    }

    function isBetween (from, to, units, inclusivity) {
        inclusivity = inclusivity || '()';
        return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&
            (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));
    }

    function isSame (input, units) {
        var localInput = isMoment(input) ? input : createLocal(input),
            inputMs;
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units || 'millisecond');
        if (units === 'millisecond') {
            return this.valueOf() === localInput.valueOf();
        } else {
            inputMs = localInput.valueOf();
            return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
        }
    }

    function isSameOrAfter (input, units) {
        return this.isSame(input, units) || this.isAfter(input,units);
    }

    function isSameOrBefore (input, units) {
        return this.isSame(input, units) || this.isBefore(input,units);
    }

    function diff (input, units, asFloat) {
        var that,
            zoneDelta,
            output;

        if (!this.isValid()) {
            return NaN;
        }

        that = cloneWithOffset(input, this);

        if (!that.isValid()) {
            return NaN;
        }

        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;

        units = normalizeUnits(units);

        switch (units) {
            case 'year': output = monthDiff(this, that) / 12; break;
            case 'month': output = monthDiff(this, that); break;
            case 'quarter': output = monthDiff(this, that) / 3; break;
            case 'second': output = (this - that) / 1e3; break; // 1000
            case 'minute': output = (this - that) / 6e4; break; // 1000 * 60
            case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60
            case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst
            case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst
            default: output = this - that;
        }

        return asFloat ? output : absFloor(output);
    }

    function monthDiff (a, b) {
        // difference in months
        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
            // b is in (anchor - 1 month, anchor + 1 month)
            anchor = a.clone().add(wholeMonthDiff, 'months'),
            anchor2, adjust;

        if (b - anchor < 0) {
            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor - anchor2);
        } else {
            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor2 - anchor);
        }

        //check for negative zero, return zero if negative zero
        return -(wholeMonthDiff + adjust) || 0;
    }

    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';

    function toString () {
        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
    }

    function toISOString(keepOffset) {
        if (!this.isValid()) {
            return null;
        }
        var utc = keepOffset !== true;
        var m = utc ? this.clone().utc() : this;
        if (m.year() < 0 || m.year() > 9999) {
            return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');
        }
        if (isFunction(Date.prototype.toISOString)) {
            // native implementation is ~50x faster, use it when we can
            if (utc) {
                return this.toDate().toISOString();
            } else {
                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));
            }
        }
        return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');
    }

    /**
     * Return a human readable representation of a moment that can
     * also be evaluated to get a new moment which is the same
     *
     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
     */
    function inspect () {
        if (!this.isValid()) {
            return 'moment.invalid(/* ' + this._i + ' */)';
        }
        var func = 'moment';
        var zone = '';
        if (!this.isLocal()) {
            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
            zone = 'Z';
        }
        var prefix = '[' + func + '("]';
        var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
        var datetime = '-MM-DD[T]HH:mm:ss.SSS';
        var suffix = zone + '[")]';

        return this.format(prefix + year + datetime + suffix);
    }

    function format (inputString) {
        if (!inputString) {
            inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
        }
        var output = formatMoment(this, inputString);
        return this.localeData().postformat(output);
    }

    function from (time, withoutSuffix) {
        if (this.isValid() &&
                ((isMoment(time) && time.isValid()) ||
                 createLocal(time).isValid())) {
            return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function fromNow (withoutSuffix) {
        return this.from(createLocal(), withoutSuffix);
    }

    function to (time, withoutSuffix) {
        if (this.isValid() &&
                ((isMoment(time) && time.isValid()) ||
                 createLocal(time).isValid())) {
            return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function toNow (withoutSuffix) {
        return this.to(createLocal(), withoutSuffix);
    }

    // If passed a locale key, it will set the locale for this
    // instance.  Otherwise, it will return the locale configuration
    // variables for this instance.
    function locale (key) {
        var newLocaleData;

        if (key === undefined) {
            return this._locale._abbr;
        } else {
            newLocaleData = getLocale(key);
            if (newLocaleData != null) {
                this._locale = newLocaleData;
            }
            return this;
        }
    }

    var lang = deprecate(
        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
        function (key) {
            if (key === undefined) {
                return this.localeData();
            } else {
                return this.locale(key);
            }
        }
    );

    function localeData () {
        return this._locale;
    }

    function startOf (units) {
        units = normalizeUnits(units);
        // the following switch intentionally omits break keywords
        // to utilize falling through the cases.
        switch (units) {
            case 'year':
                this.month(0);
                /* falls through */
            case 'quarter':
            case 'month':
                this.date(1);
                /* falls through */
            case 'week':
            case 'isoWeek':
            case 'day':
            case 'date':
                this.hours(0);
                /* falls through */
            case 'hour':
                this.minutes(0);
                /* falls through */
            case 'minute':
                this.seconds(0);
                /* falls through */
            case 'second':
                this.milliseconds(0);
        }

        // weeks are a special case
        if (units === 'week') {
            this.weekday(0);
        }
        if (units === 'isoWeek') {
            this.isoWeekday(1);
        }

        // quarters are also special
        if (units === 'quarter') {
            this.month(Math.floor(this.month() / 3) * 3);
        }

        return this;
    }

    function endOf (units) {
        units = normalizeUnits(units);
        if (units === undefined || units === 'millisecond') {
            return this;
        }

        // 'date' is an alias for 'day', so it should be considered as such.
        if (units === 'date') {
            units = 'day';
        }

        return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
    }

    function valueOf () {
        return this._d.valueOf() - ((this._offset || 0) * 60000);
    }

    function unix () {
        return Math.floor(this.valueOf() / 1000);
    }

    function toDate () {
        return new Date(this.valueOf());
    }

    function toArray () {
        var m = this;
        return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
    }

    function toObject () {
        var m = this;
        return {
            years: m.year(),
            months: m.month(),
            date: m.date(),
            hours: m.hours(),
            minutes: m.minutes(),
            seconds: m.seconds(),
            milliseconds: m.milliseconds()
        };
    }

    function toJSON () {
        // new Date(NaN).toJSON() === null
        return this.isValid() ? this.toISOString() : null;
    }

    function isValid$2 () {
        return isValid(this);
    }

    function parsingFlags () {
        return extend({}, getParsingFlags(this));
    }

    function invalidAt () {
        return getParsingFlags(this).overflow;
    }

    function creationData() {
        return {
            input: this._i,
            format: this._f,
            locale: this._locale,
            isUTC: this._isUTC,
            strict: this._strict
        };
    }

    // FORMATTING

    addFormatToken(0, ['gg', 2], 0, function () {
        return this.weekYear() % 100;
    });

    addFormatToken(0, ['GG', 2], 0, function () {
        return this.isoWeekYear() % 100;
    });

    function addWeekYearFormatToken (token, getter) {
        addFormatToken(0, [token, token.length], 0, getter);
    }

    addWeekYearFormatToken('gggg',     'weekYear');
    addWeekYearFormatToken('ggggg',    'weekYear');
    addWeekYearFormatToken('GGGG',  'isoWeekYear');
    addWeekYearFormatToken('GGGGG', 'isoWeekYear');

    // ALIASES

    addUnitAlias('weekYear', 'gg');
    addUnitAlias('isoWeekYear', 'GG');

    // PRIORITY

    addUnitPriority('weekYear', 1);
    addUnitPriority('isoWeekYear', 1);


    // PARSING

    addRegexToken('G',      matchSigned);
    addRegexToken('g',      matchSigned);
    addRegexToken('GG',     match1to2, match2);
    addRegexToken('gg',     match1to2, match2);
    addRegexToken('GGGG',   match1to4, match4);
    addRegexToken('gggg',   match1to4, match4);
    addRegexToken('GGGGG',  match1to6, match6);
    addRegexToken('ggggg',  match1to6, match6);

    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
        week[token.substr(0, 2)] = toInt(input);
    });

    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
        week[token] = hooks.parseTwoDigitYear(input);
    });

    // MOMENTS

    function getSetWeekYear (input) {
        return getSetWeekYearHelper.call(this,
                input,
                this.week(),
                this.weekday(),
                this.localeData()._week.dow,
                this.localeData()._week.doy);
    }

    function getSetISOWeekYear (input) {
        return getSetWeekYearHelper.call(this,
                input, this.isoWeek(), this.isoWeekday(), 1, 4);
    }

    function getISOWeeksInYear () {
        return weeksInYear(this.year(), 1, 4);
    }

    function getWeeksInYear () {
        var weekInfo = this.localeData()._week;
        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
    }

    function getSetWeekYearHelper(input, week, weekday, dow, doy) {
        var weeksTarget;
        if (input == null) {
            return weekOfYear(this, dow, doy).year;
        } else {
            weeksTarget = weeksInYear(input, dow, doy);
            if (week > weeksTarget) {
                week = weeksTarget;
            }
            return setWeekAll.call(this, input, week, weekday, dow, doy);
        }
    }

    function setWeekAll(weekYear, week, weekday, dow, doy) {
        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);

        this.year(date.getUTCFullYear());
        this.month(date.getUTCMonth());
        this.date(date.getUTCDate());
        return this;
    }

    // FORMATTING

    addFormatToken('Q', 0, 'Qo', 'quarter');

    // ALIASES

    addUnitAlias('quarter', 'Q');

    // PRIORITY

    addUnitPriority('quarter', 7);

    // PARSING

    addRegexToken('Q', match1);
    addParseToken('Q', function (input, array) {
        array[MONTH] = (toInt(input) - 1) * 3;
    });

    // MOMENTS

    function getSetQuarter (input) {
        return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
    }

    // FORMATTING

    addFormatToken('D', ['DD', 2], 'Do', 'date');

    // ALIASES

    addUnitAlias('date', 'D');

    // PRIORITY
    addUnitPriority('date', 9);

    // PARSING

    addRegexToken('D',  match1to2);
    addRegexToken('DD', match1to2, match2);
    addRegexToken('Do', function (isStrict, locale) {
        // TODO: Remove "ordinalParse" fallback in next major release.
        return isStrict ?
          (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :
          locale._dayOfMonthOrdinalParseLenient;
    });

    addParseToken(['D', 'DD'], DATE);
    addParseToken('Do', function (input, array) {
        array[DATE] = toInt(input.match(match1to2)[0]);
    });

    // MOMENTS

    var getSetDayOfMonth = makeGetSet('Date', true);

    // FORMATTING

    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');

    // ALIASES

    addUnitAlias('dayOfYear', 'DDD');

    // PRIORITY
    addUnitPriority('dayOfYear', 4);

    // PARSING

    addRegexToken('DDD',  match1to3);
    addRegexToken('DDDD', match3);
    addParseToken(['DDD', 'DDDD'], function (input, array, config) {
        config._dayOfYear = toInt(input);
    });

    // HELPERS

    // MOMENTS

    function getSetDayOfYear (input) {
        var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
        return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
    }

    // FORMATTING

    addFormatToken('m', ['mm', 2], 0, 'minute');

    // ALIASES

    addUnitAlias('minute', 'm');

    // PRIORITY

    addUnitPriority('minute', 14);

    // PARSING

    addRegexToken('m',  match1to2);
    addRegexToken('mm', match1to2, match2);
    addParseToken(['m', 'mm'], MINUTE);

    // MOMENTS

    var getSetMinute = makeGetSet('Minutes', false);

    // FORMATTING

    addFormatToken('s', ['ss', 2], 0, 'second');

    // ALIASES

    addUnitAlias('second', 's');

    // PRIORITY

    addUnitPriority('second', 15);

    // PARSING

    addRegexToken('s',  match1to2);
    addRegexToken('ss', match1to2, match2);
    addParseToken(['s', 'ss'], SECOND);

    // MOMENTS

    var getSetSecond = makeGetSet('Seconds', false);

    // FORMATTING

    addFormatToken('S', 0, 0, function () {
        return ~~(this.millisecond() / 100);
    });

    addFormatToken(0, ['SS', 2], 0, function () {
        return ~~(this.millisecond() / 10);
    });

    addFormatToken(0, ['SSS', 3], 0, 'millisecond');
    addFormatToken(0, ['SSSS', 4], 0, function () {
        return this.millisecond() * 10;
    });
    addFormatToken(0, ['SSSSS', 5], 0, function () {
        return this.millisecond() * 100;
    });
    addFormatToken(0, ['SSSSSS', 6], 0, function () {
        return this.millisecond() * 1000;
    });
    addFormatToken(0, ['SSSSSSS', 7], 0, function () {
        return this.millisecond() * 10000;
    });
    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
        return this.millisecond() * 100000;
    });
    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
        return this.millisecond() * 1000000;
    });


    // ALIASES

    addUnitAlias('millisecond', 'ms');

    // PRIORITY

    addUnitPriority('millisecond', 16);

    // PARSING

    addRegexToken('S',    match1to3, match1);
    addRegexToken('SS',   match1to3, match2);
    addRegexToken('SSS',  match1to3, match3);

    var token;
    for (token = 'SSSS'; token.length <= 9; token += 'S') {
        addRegexToken(token, matchUnsigned);
    }

    function parseMs(input, array) {
        array[MILLISECOND] = toInt(('0.' + input) * 1000);
    }

    for (token = 'S'; token.length <= 9; token += 'S') {
        addParseToken(token, parseMs);
    }
    // MOMENTS

    var getSetMillisecond = makeGetSet('Milliseconds', false);

    // FORMATTING

    addFormatToken('z',  0, 0, 'zoneAbbr');
    addFormatToken('zz', 0, 0, 'zoneName');

    // MOMENTS

    function getZoneAbbr () {
        return this._isUTC ? 'UTC' : '';
    }

    function getZoneName () {
        return this._isUTC ? 'Coordinated Universal Time' : '';
    }

    var proto = Moment.prototype;

    proto.add               = add;
    proto.calendar          = calendar$1;
    proto.clone             = clone;
    proto.diff              = diff;
    proto.endOf             = endOf;
    proto.format            = format;
    proto.from              = from;
    proto.fromNow           = fromNow;
    proto.to                = to;
    proto.toNow             = toNow;
    proto.get               = stringGet;
    proto.invalidAt         = invalidAt;
    proto.isAfter           = isAfter;
    proto.isBefore          = isBefore;
    proto.isBetween         = isBetween;
    proto.isSame            = isSame;
    proto.isSameOrAfter     = isSameOrAfter;
    proto.isSameOrBefore    = isSameOrBefore;
    proto.isValid           = isValid$2;
    proto.lang              = lang;
    proto.locale            = locale;
    proto.localeData        = localeData;
    proto.max               = prototypeMax;
    proto.min               = prototypeMin;
    proto.parsingFlags      = parsingFlags;
    proto.set               = stringSet;
    proto.startOf           = startOf;
    proto.subtract          = subtract;
    proto.toArray           = toArray;
    proto.toObject          = toObject;
    proto.toDate            = toDate;
    proto.toISOString       = toISOString;
    proto.inspect           = inspect;
    proto.toJSON            = toJSON;
    proto.toString          = toString;
    proto.unix              = unix;
    proto.valueOf           = valueOf;
    proto.creationData      = creationData;
    proto.year       = getSetYear;
    proto.isLeapYear = getIsLeapYear;
    proto.weekYear    = getSetWeekYear;
    proto.isoWeekYear = getSetISOWeekYear;
    proto.quarter = proto.quarters = getSetQuarter;
    proto.month       = getSetMonth;
    proto.daysInMonth = getDaysInMonth;
    proto.week           = proto.weeks        = getSetWeek;
    proto.isoWeek        = proto.isoWeeks     = getSetISOWeek;
    proto.weeksInYear    = getWeeksInYear;
    proto.isoWeeksInYear = getISOWeeksInYear;
    proto.date       = getSetDayOfMonth;
    proto.day        = proto.days             = getSetDayOfWeek;
    proto.weekday    = getSetLocaleDayOfWeek;
    proto.isoWeekday = getSetISODayOfWeek;
    proto.dayOfYear  = getSetDayOfYear;
    proto.hour = proto.hours = getSetHour;
    proto.minute = proto.minutes = getSetMinute;
    proto.second = proto.seconds = getSetSecond;
    proto.millisecond = proto.milliseconds = getSetMillisecond;
    proto.utcOffset            = getSetOffset;
    proto.utc                  = setOffsetToUTC;
    proto.local                = setOffsetToLocal;
    proto.parseZone            = setOffsetToParsedOffset;
    proto.hasAlignedHourOffset = hasAlignedHourOffset;
    proto.isDST                = isDaylightSavingTime;
    proto.isLocal              = isLocal;
    proto.isUtcOffset          = isUtcOffset;
    proto.isUtc                = isUtc;
    proto.isUTC                = isUtc;
    proto.zoneAbbr = getZoneAbbr;
    proto.zoneName = getZoneName;
    proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
    proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
    proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);
    proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
    proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);

    function createUnix (input) {
        return createLocal(input * 1000);
    }

    function createInZone () {
        return createLocal.apply(null, arguments).parseZone();
    }

    function preParsePostFormat (string) {
        return string;
    }

    var proto$1 = Locale.prototype;

    proto$1.calendar        = calendar;
    proto$1.longDateFormat  = longDateFormat;
    proto$1.invalidDate     = invalidDate;
    proto$1.ordinal         = ordinal;
    proto$1.preparse        = preParsePostFormat;
    proto$1.postformat      = preParsePostFormat;
    proto$1.relativeTime    = relativeTime;
    proto$1.pastFuture      = pastFuture;
    proto$1.set             = set;

    proto$1.months            =        localeMonths;
    proto$1.monthsShort       =        localeMonthsShort;
    proto$1.monthsParse       =        localeMonthsParse;
    proto$1.monthsRegex       = monthsRegex;
    proto$1.monthsShortRegex  = monthsShortRegex;
    proto$1.week = localeWeek;
    proto$1.firstDayOfYear = localeFirstDayOfYear;
    proto$1.firstDayOfWeek = localeFirstDayOfWeek;

    proto$1.weekdays       =        localeWeekdays;
    proto$1.weekdaysMin    =        localeWeekdaysMin;
    proto$1.weekdaysShort  =        localeWeekdaysShort;
    proto$1.weekdaysParse  =        localeWeekdaysParse;

    proto$1.weekdaysRegex       =        weekdaysRegex;
    proto$1.weekdaysShortRegex  =        weekdaysShortRegex;
    proto$1.weekdaysMinRegex    =        weekdaysMinRegex;

    proto$1.isPM = localeIsPM;
    proto$1.meridiem = localeMeridiem;

    function get$1 (format, index, field, setter) {
        var locale = getLocale();
        var utc = createUTC().set(setter, index);
        return locale[field](utc, format);
    }

    function listMonthsImpl (format, index, field) {
        if (isNumber(format)) {
            index = format;
            format = undefined;
        }

        format = format || '';

        if (index != null) {
            return get$1(format, index, field, 'month');
        }

        var i;
        var out = [];
        for (i = 0; i < 12; i++) {
            out[i] = get$1(format, i, field, 'month');
        }
        return out;
    }

    // ()
    // (5)
    // (fmt, 5)
    // (fmt)
    // (true)
    // (true, 5)
    // (true, fmt, 5)
    // (true, fmt)
    function listWeekdaysImpl (localeSorted, format, index, field) {
        if (typeof localeSorted === 'boolean') {
            if (isNumber(format)) {
                index = format;
                format = undefined;
            }

            format = format || '';
        } else {
            format = localeSorted;
            index = format;
            localeSorted = false;

            if (isNumber(format)) {
                index = format;
                format = undefined;
            }

            format = format || '';
        }

        var locale = getLocale(),
            shift = localeSorted ? locale._week.dow : 0;

        if (index != null) {
            return get$1(format, (index + shift) % 7, field, 'day');
        }

        var i;
        var out = [];
        for (i = 0; i < 7; i++) {
            out[i] = get$1(format, (i + shift) % 7, field, 'day');
        }
        return out;
    }

    function listMonths (format, index) {
        return listMonthsImpl(format, index, 'months');
    }

    function listMonthsShort (format, index) {
        return listMonthsImpl(format, index, 'monthsShort');
    }

    function listWeekdays (localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
    }

    function listWeekdaysShort (localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
    }

    function listWeekdaysMin (localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
    }

    getSetGlobalLocale('en', {
        dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
        ordinal : function (number) {
            var b = number % 10,
                output = (toInt(number % 100 / 10) === 1) ? 'th' :
                (b === 1) ? 'st' :
                (b === 2) ? 'nd' :
                (b === 3) ? 'rd' : 'th';
            return number + output;
        }
    });

    // Side effect imports

    hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);
    hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);

    var mathAbs = Math.abs;

    function abs () {
        var data           = this._data;

        this._milliseconds = mathAbs(this._milliseconds);
        this._days         = mathAbs(this._days);
        this._months       = mathAbs(this._months);

        data.milliseconds  = mathAbs(data.milliseconds);
        data.seconds       = mathAbs(data.seconds);
        data.minutes       = mathAbs(data.minutes);
        data.hours         = mathAbs(data.hours);
        data.months        = mathAbs(data.months);
        data.years         = mathAbs(data.years);

        return this;
    }

    function addSubtract$1 (duration, input, value, direction) {
        var other = createDuration(input, value);

        duration._milliseconds += direction * other._milliseconds;
        duration._days         += direction * other._days;
        duration._months       += direction * other._months;

        return duration._bubble();
    }

    // supports only 2.0-style add(1, 's') or add(duration)
    function add$1 (input, value) {
        return addSubtract$1(this, input, value, 1);
    }

    // supports only 2.0-style subtract(1, 's') or subtract(duration)
    function subtract$1 (input, value) {
        return addSubtract$1(this, input, value, -1);
    }

    function absCeil (number) {
        if (number < 0) {
            return Math.floor(number);
        } else {
            return Math.ceil(number);
        }
    }

    function bubble () {
        var milliseconds = this._milliseconds;
        var days         = this._days;
        var months       = this._months;
        var data         = this._data;
        var seconds, minutes, hours, years, monthsFromDays;

        // if we have a mix of positive and negative values, bubble down first
        // check: https://github.com/moment/moment/issues/2166
        if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
                (milliseconds <= 0 && days <= 0 && months <= 0))) {
            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
            days = 0;
            months = 0;
        }

        // The following code bubbles up values, see the tests for
        // examples of what that means.
        data.milliseconds = milliseconds % 1000;

        seconds           = absFloor(milliseconds / 1000);
        data.seconds      = seconds % 60;

        minutes           = absFloor(seconds / 60);
        data.minutes      = minutes % 60;

        hours             = absFloor(minutes / 60);
        data.hours        = hours % 24;

        days += absFloor(hours / 24);

        // convert days to months
        monthsFromDays = absFloor(daysToMonths(days));
        months += monthsFromDays;
        days -= absCeil(monthsToDays(monthsFromDays));

        // 12 months -> 1 year
        years = absFloor(months / 12);
        months %= 12;

        data.days   = days;
        data.months = months;
        data.years  = years;

        return this;
    }

    function daysToMonths (days) {
        // 400 years have 146097 days (taking into account leap year rules)
        // 400 years have 12 months === 4800
        return days * 4800 / 146097;
    }

    function monthsToDays (months) {
        // the reverse of daysToMonths
        return months * 146097 / 4800;
    }

    function as (units) {
        if (!this.isValid()) {
            return NaN;
        }
        var days;
        var months;
        var milliseconds = this._milliseconds;

        units = normalizeUnits(units);

        if (units === 'month' || units === 'year') {
            days   = this._days   + milliseconds / 864e5;
            months = this._months + daysToMonths(days);
            return units === 'month' ? months : months / 12;
        } else {
            // handle milliseconds separately because of floating point math errors (issue #1867)
            days = this._days + Math.round(monthsToDays(this._months));
            switch (units) {
                case 'week'   : return days / 7     + milliseconds / 6048e5;
                case 'day'    : return days         + milliseconds / 864e5;
                case 'hour'   : return days * 24    + milliseconds / 36e5;
                case 'minute' : return days * 1440  + milliseconds / 6e4;
                case 'second' : return days * 86400 + milliseconds / 1000;
                // Math.floor prevents floating point math errors here
                case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
                default: throw new Error('Unknown unit ' + units);
            }
        }
    }

    // TODO: Use this.as('ms')?
    function valueOf$1 () {
        if (!this.isValid()) {
            return NaN;
        }
        return (
            this._milliseconds +
            this._days * 864e5 +
            (this._months % 12) * 2592e6 +
            toInt(this._months / 12) * 31536e6
        );
    }

    function makeAs (alias) {
        return function () {
            return this.as(alias);
        };
    }

    var asMilliseconds = makeAs('ms');
    var asSeconds      = makeAs('s');
    var asMinutes      = makeAs('m');
    var asHours        = makeAs('h');
    var asDays         = makeAs('d');
    var asWeeks        = makeAs('w');
    var asMonths       = makeAs('M');
    var asYears        = makeAs('y');

    function clone$1 () {
        return createDuration(this);
    }

    function get$2 (units) {
        units = normalizeUnits(units);
        return this.isValid() ? this[units + 's']() : NaN;
    }

    function makeGetter(name) {
        return function () {
            return this.isValid() ? this._data[name] : NaN;
        };
    }

    var milliseconds = makeGetter('milliseconds');
    var seconds      = makeGetter('seconds');
    var minutes      = makeGetter('minutes');
    var hours        = makeGetter('hours');
    var days         = makeGetter('days');
    var months       = makeGetter('months');
    var years        = makeGetter('years');

    function weeks () {
        return absFloor(this.days() / 7);
    }

    var round = Math.round;
    var thresholds = {
        ss: 44,         // a few seconds to seconds
        s : 45,         // seconds to minute
        m : 45,         // minutes to hour
        h : 22,         // hours to day
        d : 26,         // days to month
        M : 11          // months to year
    };

    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
    }

    function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
        var duration = createDuration(posNegDuration).abs();
        var seconds  = round(duration.as('s'));
        var minutes  = round(duration.as('m'));
        var hours    = round(duration.as('h'));
        var days     = round(duration.as('d'));
        var months   = round(duration.as('M'));
        var years    = round(duration.as('y'));

        var a = seconds <= thresholds.ss && ['s', seconds]  ||
                seconds < thresholds.s   && ['ss', seconds] ||
                minutes <= 1             && ['m']           ||
                minutes < thresholds.m   && ['mm', minutes] ||
                hours   <= 1             && ['h']           ||
                hours   < thresholds.h   && ['hh', hours]   ||
                days    <= 1             && ['d']           ||
                days    < thresholds.d   && ['dd', days]    ||
                months  <= 1             && ['M']           ||
                months  < thresholds.M   && ['MM', months]  ||
                years   <= 1             && ['y']           || ['yy', years];

        a[2] = withoutSuffix;
        a[3] = +posNegDuration > 0;
        a[4] = locale;
        return substituteTimeAgo.apply(null, a);
    }

    // This function allows you to set the rounding function for relative time strings
    function getSetRelativeTimeRounding (roundingFunction) {
        if (roundingFunction === undefined) {
            return round;
        }
        if (typeof(roundingFunction) === 'function') {
            round = roundingFunction;
            return true;
        }
        return false;
    }

    // This function allows you to set a threshold for relative time strings
    function getSetRelativeTimeThreshold (threshold, limit) {
        if (thresholds[threshold] === undefined) {
            return false;
        }
        if (limit === undefined) {
            return thresholds[threshold];
        }
        thresholds[threshold] = limit;
        if (threshold === 's') {
            thresholds.ss = limit - 1;
        }
        return true;
    }

    function humanize (withSuffix) {
        if (!this.isValid()) {
            return this.localeData().invalidDate();
        }

        var locale = this.localeData();
        var output = relativeTime$1(this, !withSuffix, locale);

        if (withSuffix) {
            output = locale.pastFuture(+this, output);
        }

        return locale.postformat(output);
    }

    var abs$1 = Math.abs;

    function sign(x) {
        return ((x > 0) - (x < 0)) || +x;
    }

    function toISOString$1() {
        // for ISO strings we do not use the normal bubbling rules:
        //  * milliseconds bubble up until they become hours
        //  * days do not bubble at all
        //  * months bubble up until they become years
        // This is because there is no context-free conversion between hours and days
        // (think of clock changes)
        // and also not between days and months (28-31 days per month)
        if (!this.isValid()) {
            return this.localeData().invalidDate();
        }

        var seconds = abs$1(this._milliseconds) / 1000;
        var days         = abs$1(this._days);
        var months       = abs$1(this._months);
        var minutes, hours, years;

        // 3600 seconds -> 60 minutes -> 1 hour
        minutes           = absFloor(seconds / 60);
        hours             = absFloor(minutes / 60);
        seconds %= 60;
        minutes %= 60;

        // 12 months -> 1 year
        years  = absFloor(months / 12);
        months %= 12;


        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
        var Y = years;
        var M = months;
        var D = days;
        var h = hours;
        var m = minutes;
        var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
        var total = this.asSeconds();

        if (!total) {
            // this is the same as C#'s (Noda) and python (isodate)...
            // but not other JS (goog.date)
            return 'P0D';
        }

        var totalSign = total < 0 ? '-' : '';
        var ymSign = sign(this._months) !== sign(total) ? '-' : '';
        var daysSign = sign(this._days) !== sign(total) ? '-' : '';
        var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';

        return totalSign + 'P' +
            (Y ? ymSign + Y + 'Y' : '') +
            (M ? ymSign + M + 'M' : '') +
            (D ? daysSign + D + 'D' : '') +
            ((h || m || s) ? 'T' : '') +
            (h ? hmsSign + h + 'H' : '') +
            (m ? hmsSign + m + 'M' : '') +
            (s ? hmsSign + s + 'S' : '');
    }

    var proto$2 = Duration.prototype;

    proto$2.isValid        = isValid$1;
    proto$2.abs            = abs;
    proto$2.add            = add$1;
    proto$2.subtract       = subtract$1;
    proto$2.as             = as;
    proto$2.asMilliseconds = asMilliseconds;
    proto$2.asSeconds      = asSeconds;
    proto$2.asMinutes      = asMinutes;
    proto$2.asHours        = asHours;
    proto$2.asDays         = asDays;
    proto$2.asWeeks        = asWeeks;
    proto$2.asMonths       = asMonths;
    proto$2.asYears        = asYears;
    proto$2.valueOf        = valueOf$1;
    proto$2._bubble        = bubble;
    proto$2.clone          = clone$1;
    proto$2.get            = get$2;
    proto$2.milliseconds   = milliseconds;
    proto$2.seconds        = seconds;
    proto$2.minutes        = minutes;
    proto$2.hours          = hours;
    proto$2.days           = days;
    proto$2.weeks          = weeks;
    proto$2.months         = months;
    proto$2.years          = years;
    proto$2.humanize       = humanize;
    proto$2.toISOString    = toISOString$1;
    proto$2.toString       = toISOString$1;
    proto$2.toJSON         = toISOString$1;
    proto$2.locale         = locale;
    proto$2.localeData     = localeData;

    proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);
    proto$2.lang = lang;

    // Side effect imports

    // FORMATTING

    addFormatToken('X', 0, 0, 'unix');
    addFormatToken('x', 0, 0, 'valueOf');

    // PARSING

    addRegexToken('x', matchSigned);
    addRegexToken('X', matchTimestamp);
    addParseToken('X', function (input, array, config) {
        config._d = new Date(parseFloat(input, 10) * 1000);
    });
    addParseToken('x', function (input, array, config) {
        config._d = new Date(toInt(input));
    });

    // Side effect imports


    hooks.version = '2.22.2';

    setHookCallback(createLocal);

    hooks.fn                    = proto;
    hooks.min                   = min;
    hooks.max                   = max;
    hooks.now                   = now;
    hooks.utc                   = createUTC;
    hooks.unix                  = createUnix;
    hooks.months                = listMonths;
    hooks.isDate                = isDate;
    hooks.locale                = getSetGlobalLocale;
    hooks.invalid               = createInvalid;
    hooks.duration              = createDuration;
    hooks.isMoment              = isMoment;
    hooks.weekdays              = listWeekdays;
    hooks.parseZone             = createInZone;
    hooks.localeData            = getLocale;
    hooks.isDuration            = isDuration;
    hooks.monthsShort           = listMonthsShort;
    hooks.weekdaysMin           = listWeekdaysMin;
    hooks.defineLocale          = defineLocale;
    hooks.updateLocale          = updateLocale;
    hooks.locales               = listLocales;
    hooks.weekdaysShort         = listWeekdaysShort;
    hooks.normalizeUnits        = normalizeUnits;
    hooks.relativeTimeRounding  = getSetRelativeTimeRounding;
    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
    hooks.calendarFormat        = getCalendarFormat;
    hooks.prototype             = proto;

    // currently HTML5 input type only supports 24-hour formats
    hooks.HTML5_FMT = {
        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',             // <input type="datetime-local" />
        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',  // <input type="datetime-local" step="1" />
        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',   // <input type="datetime-local" step="0.001" />
        DATE: 'YYYY-MM-DD',                             // <input type="date" />
        TIME: 'HH:mm',                                  // <input type="time" />
        TIME_SECONDS: 'HH:mm:ss',                       // <input type="time" step="1" />
        TIME_MS: 'HH:mm:ss.SSS',                        // <input type="time" step="0.001" />
        WEEK: 'YYYY-[W]WW',                             // <input type="week" />
        MONTH: 'YYYY-MM'                                // <input type="month" />
    };

    return hooks;

})));

},{}],113:[function(require,module,exports){
(function (global){
//     Underscore.js 1.9.1
//     http://underscorejs.org
//     (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
//     Underscore may be freely distributed under the MIT license.

(function() {

  // Baseline setup
  // --------------

  // Establish the root object, `window` (`self`) in the browser, `global`
  // on the server, or `this` in some virtual machines. We use `self`
  // instead of `window` for `WebWorker` support.
  var root = typeof self == 'object' && self.self === self && self ||
            typeof global == 'object' && global.global === global && global ||
            this ||
            {};

  // Save the previous value of the `_` variable.
  var previousUnderscore = root._;

  // Save bytes in the minified (but not gzipped) version:
  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;

  // Create quick reference variables for speed access to core prototypes.
  var push = ArrayProto.push,
      slice = ArrayProto.slice,
      toString = ObjProto.toString,
      hasOwnProperty = ObjProto.hasOwnProperty;

  // All **ECMAScript 5** native function implementations that we hope to use
  // are declared here.
  var nativeIsArray = Array.isArray,
      nativeKeys = Object.keys,
      nativeCreate = Object.create;

  // Naked function reference for surrogate-prototype-swapping.
  var Ctor = function(){};

  // Create a safe reference to the Underscore object for use below.
  var _ = function(obj) {
    if (obj instanceof _) return obj;
    if (!(this instanceof _)) return new _(obj);
    this._wrapped = obj;
  };

  // Export the Underscore object for **Node.js**, with
  // backwards-compatibility for their old module API. If we're in
  // the browser, add `_` as a global object.
  // (`nodeType` is checked to ensure that `module`
  // and `exports` are not HTML elements.)
  if (typeof exports != 'undefined' && !exports.nodeType) {
    if (typeof module != 'undefined' && !module.nodeType && module.exports) {
      exports = module.exports = _;
    }
    exports._ = _;
  } else {
    root._ = _;
  }

  // Current version.
  _.VERSION = '1.9.1';

  // Internal function that returns an efficient (for current engines) version
  // of the passed-in callback, to be repeatedly applied in other Underscore
  // functions.
  var optimizeCb = function(func, context, argCount) {
    if (context === void 0) return func;
    switch (argCount == null ? 3 : argCount) {
      case 1: return function(value) {
        return func.call(context, value);
      };
      // The 2-argument case is omitted because we’re not using it.
      case 3: return function(value, index, collection) {
        return func.call(context, value, index, collection);
      };
      case 4: return function(accumulator, value, index, collection) {
        return func.call(context, accumulator, value, index, collection);
      };
    }
    return function() {
      return func.apply(context, arguments);
    };
  };

  var builtinIteratee;

  // An internal function to generate callbacks that can be applied to each
  // element in a collection, returning the desired result — either `identity`,
  // an arbitrary callback, a property matcher, or a property accessor.
  var cb = function(value, context, argCount) {
    if (_.iteratee !== builtinIteratee) return _.iteratee(value, context);
    if (value == null) return _.identity;
    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
    if (_.isObject(value) && !_.isArray(value)) return _.matcher(value);
    return _.property(value);
  };

  // External wrapper for our callback generator. Users may customize
  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
  // This abstraction hides the internal-only argCount argument.
  _.iteratee = builtinIteratee = function(value, context) {
    return cb(value, context, Infinity);
  };

  // Some functions take a variable number of arguments, or a few expected
  // arguments at the beginning and then a variable number of values to operate
  // on. This helper accumulates all remaining arguments past the function’s
  // argument length (or an explicit `startIndex`), into an array that becomes
  // the last argument. Similar to ES6’s "rest parameter".
  var restArguments = function(func, startIndex) {
    startIndex = startIndex == null ? func.length - 1 : +startIndex;
    return function() {
      var length = Math.max(arguments.length - startIndex, 0),
          rest = Array(length),
          index = 0;
      for (; index < length; index++) {
        rest[index] = arguments[index + startIndex];
      }
      switch (startIndex) {
        case 0: return func.call(this, rest);
        case 1: return func.call(this, arguments[0], rest);
        case 2: return func.call(this, arguments[0], arguments[1], rest);
      }
      var args = Array(startIndex + 1);
      for (index = 0; index < startIndex; index++) {
        args[index] = arguments[index];
      }
      args[startIndex] = rest;
      return func.apply(this, args);
    };
  };

  // An internal function for creating a new object that inherits from another.
  var baseCreate = function(prototype) {
    if (!_.isObject(prototype)) return {};
    if (nativeCreate) return nativeCreate(prototype);
    Ctor.prototype = prototype;
    var result = new Ctor;
    Ctor.prototype = null;
    return result;
  };

  var shallowProperty = function(key) {
    return function(obj) {
      return obj == null ? void 0 : obj[key];
    };
  };

  var has = function(obj, path) {
    return obj != null && hasOwnProperty.call(obj, path);
  }

  var deepGet = function(obj, path) {
    var length = path.length;
    for (var i = 0; i < length; i++) {
      if (obj == null) return void 0;
      obj = obj[path[i]];
    }
    return length ? obj : void 0;
  };

  // Helper for collection methods to determine whether a collection
  // should be iterated as an array or as an object.
  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
  var getLength = shallowProperty('length');
  var isArrayLike = function(collection) {
    var length = getLength(collection);
    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
  };

  // Collection Functions
  // --------------------

  // The cornerstone, an `each` implementation, aka `forEach`.
  // Handles raw objects in addition to array-likes. Treats all
  // sparse array-likes as if they were dense.
  _.each = _.forEach = function(obj, iteratee, context) {
    iteratee = optimizeCb(iteratee, context);
    var i, length;
    if (isArrayLike(obj)) {
      for (i = 0, length = obj.length; i < length; i++) {
        iteratee(obj[i], i, obj);
      }
    } else {
      var keys = _.keys(obj);
      for (i = 0, length = keys.length; i < length; i++) {
        iteratee(obj[keys[i]], keys[i], obj);
      }
    }
    return obj;
  };

  // Return the results of applying the iteratee to each element.
  _.map = _.collect = function(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
        length = (keys || obj).length,
        results = Array(length);
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      results[index] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  };

  // Create a reducing function iterating left or right.
  var createReduce = function(dir) {
    // Wrap code that reassigns argument variables in a separate function than
    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
    var reducer = function(obj, iteratee, memo, initial) {
      var keys = !isArrayLike(obj) && _.keys(obj),
          length = (keys || obj).length,
          index = dir > 0 ? 0 : length - 1;
      if (!initial) {
        memo = obj[keys ? keys[index] : index];
        index += dir;
      }
      for (; index >= 0 && index < length; index += dir) {
        var currentKey = keys ? keys[index] : index;
        memo = iteratee(memo, obj[currentKey], currentKey, obj);
      }
      return memo;
    };

    return function(obj, iteratee, memo, context) {
      var initial = arguments.length >= 3;
      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
    };
  };

  // **Reduce** builds up a single result from a list of values, aka `inject`,
  // or `foldl`.
  _.reduce = _.foldl = _.inject = createReduce(1);

  // The right-associative version of reduce, also known as `foldr`.
  _.reduceRight = _.foldr = createReduce(-1);

  // Return the first value which passes a truth test. Aliased as `detect`.
  _.find = _.detect = function(obj, predicate, context) {
    var keyFinder = isArrayLike(obj) ? _.findIndex : _.findKey;
    var key = keyFinder(obj, predicate, context);
    if (key !== void 0 && key !== -1) return obj[key];
  };

  // Return all the elements that pass a truth test.
  // Aliased as `select`.
  _.filter = _.select = function(obj, predicate, context) {
    var results = [];
    predicate = cb(predicate, context);
    _.each(obj, function(value, index, list) {
      if (predicate(value, index, list)) results.push(value);
    });
    return results;
  };

  // Return all the elements for which a truth test fails.
  _.reject = function(obj, predicate, context) {
    return _.filter(obj, _.negate(cb(predicate)), context);
  };

  // Determine whether all of the elements match a truth test.
  // Aliased as `all`.
  _.every = _.all = function(obj, predicate, context) {
    predicate = cb(predicate, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
        length = (keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      if (!predicate(obj[currentKey], currentKey, obj)) return false;
    }
    return true;
  };

  // Determine if at least one element in the object matches a truth test.
  // Aliased as `any`.
  _.some = _.any = function(obj, predicate, context) {
    predicate = cb(predicate, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
        length = (keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      if (predicate(obj[currentKey], currentKey, obj)) return true;
    }
    return false;
  };

  // Determine if the array or object contains a given item (using `===`).
  // Aliased as `includes` and `include`.
  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
    if (!isArrayLike(obj)) obj = _.values(obj);
    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
    return _.indexOf(obj, item, fromIndex) >= 0;
  };

  // Invoke a method (with arguments) on every item in a collection.
  _.invoke = restArguments(function(obj, path, args) {
    var contextPath, func;
    if (_.isFunction(path)) {
      func = path;
    } else if (_.isArray(path)) {
      contextPath = path.slice(0, -1);
      path = path[path.length - 1];
    }
    return _.map(obj, function(context) {
      var method = func;
      if (!method) {
        if (contextPath && contextPath.length) {
          context = deepGet(context, contextPath);
        }
        if (context == null) return void 0;
        method = context[path];
      }
      return method == null ? method : method.apply(context, args);
    });
  });

  // Convenience version of a common use case of `map`: fetching a property.
  _.pluck = function(obj, key) {
    return _.map(obj, _.property(key));
  };

  // Convenience version of a common use case of `filter`: selecting only objects
  // containing specific `key:value` pairs.
  _.where = function(obj, attrs) {
    return _.filter(obj, _.matcher(attrs));
  };

  // Convenience version of a common use case of `find`: getting the first object
  // containing specific `key:value` pairs.
  _.findWhere = function(obj, attrs) {
    return _.find(obj, _.matcher(attrs));
  };

  // Return the maximum element (or element-based computation).
  _.max = function(obj, iteratee, context) {
    var result = -Infinity, lastComputed = -Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = isArrayLike(obj) ? obj : _.values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value > result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      _.each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  };

  // Return the minimum element (or element-based computation).
  _.min = function(obj, iteratee, context) {
    var result = Infinity, lastComputed = Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = isArrayLike(obj) ? obj : _.values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value < result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      _.each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed < lastComputed || computed === Infinity && result === Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  };

  // Shuffle a collection.
  _.shuffle = function(obj) {
    return _.sample(obj, Infinity);
  };

  // Sample **n** random values from a collection using the modern version of the
  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
  // If **n** is not specified, returns a single random element.
  // The internal `guard` argument allows it to work with `map`.
  _.sample = function(obj, n, guard) {
    if (n == null || guard) {
      if (!isArrayLike(obj)) obj = _.values(obj);
      return obj[_.random(obj.length - 1)];
    }
    var sample = isArrayLike(obj) ? _.clone(obj) : _.values(obj);
    var length = getLength(sample);
    n = Math.max(Math.min(n, length), 0);
    var last = length - 1;
    for (var index = 0; index < n; index++) {
      var rand = _.random(index, last);
      var temp = sample[index];
      sample[index] = sample[rand];
      sample[rand] = temp;
    }
    return sample.slice(0, n);
  };

  // Sort the object's values by a criterion produced by an iteratee.
  _.sortBy = function(obj, iteratee, context) {
    var index = 0;
    iteratee = cb(iteratee, context);
    return _.pluck(_.map(obj, function(value, key, list) {
      return {
        value: value,
        index: index++,
        criteria: iteratee(value, key, list)
      };
    }).sort(function(left, right) {
      var a = left.criteria;
      var b = right.criteria;
      if (a !== b) {
        if (a > b || a === void 0) return 1;
        if (a < b || b === void 0) return -1;
      }
      return left.index - right.index;
    }), 'value');
  };

  // An internal function used for aggregate "group by" operations.
  var group = function(behavior, partition) {
    return function(obj, iteratee, context) {
      var result = partition ? [[], []] : {};
      iteratee = cb(iteratee, context);
      _.each(obj, function(value, index) {
        var key = iteratee(value, index, obj);
        behavior(result, value, key);
      });
      return result;
    };
  };

  // Groups the object's values by a criterion. Pass either a string attribute
  // to group by, or a function that returns the criterion.
  _.groupBy = group(function(result, value, key) {
    if (has(result, key)) result[key].push(value); else result[key] = [value];
  });

  // Indexes the object's values by a criterion, similar to `groupBy`, but for
  // when you know that your index values will be unique.
  _.indexBy = group(function(result, value, key) {
    result[key] = value;
  });

  // Counts instances of an object that group by a certain criterion. Pass
  // either a string attribute to count by, or a function that returns the
  // criterion.
  _.countBy = group(function(result, value, key) {
    if (has(result, key)) result[key]++; else result[key] = 1;
  });

  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
  // Safely create a real, live array from anything iterable.
  _.toArray = function(obj) {
    if (!obj) return [];
    if (_.isArray(obj)) return slice.call(obj);
    if (_.isString(obj)) {
      // Keep surrogate pair characters together
      return obj.match(reStrSymbol);
    }
    if (isArrayLike(obj)) return _.map(obj, _.identity);
    return _.values(obj);
  };

  // Return the number of elements in an object.
  _.size = function(obj) {
    if (obj == null) return 0;
    return isArrayLike(obj) ? obj.length : _.keys(obj).length;
  };

  // Split a collection into two arrays: one whose elements all satisfy the given
  // predicate, and one whose elements all do not satisfy the predicate.
  _.partition = group(function(result, value, pass) {
    result[pass ? 0 : 1].push(value);
  }, true);

  // Array Functions
  // ---------------

  // Get the first element of an array. Passing **n** will return the first N
  // values in the array. Aliased as `head` and `take`. The **guard** check
  // allows it to work with `_.map`.
  _.first = _.head = _.take = function(array, n, guard) {
    if (array == null || array.length < 1) return n == null ? void 0 : [];
    if (n == null || guard) return array[0];
    return _.initial(array, array.length - n);
  };

  // Returns everything but the last entry of the array. Especially useful on
  // the arguments object. Passing **n** will return all the values in
  // the array, excluding the last N.
  _.initial = function(array, n, guard) {
    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
  };

  // Get the last element of an array. Passing **n** will return the last N
  // values in the array.
  _.last = function(array, n, guard) {
    if (array == null || array.length < 1) return n == null ? void 0 : [];
    if (n == null || guard) return array[array.length - 1];
    return _.rest(array, Math.max(0, array.length - n));
  };

  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
  // Especially useful on the arguments object. Passing an **n** will return
  // the rest N values in the array.
  _.rest = _.tail = _.drop = function(array, n, guard) {
    return slice.call(array, n == null || guard ? 1 : n);
  };

  // Trim out all falsy values from an array.
  _.compact = function(array) {
    return _.filter(array, Boolean);
  };

  // Internal implementation of a recursive `flatten` function.
  var flatten = function(input, shallow, strict, output) {
    output = output || [];
    var idx = output.length;
    for (var i = 0, length = getLength(input); i < length; i++) {
      var value = input[i];
      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
        // Flatten current level of array or arguments object.
        if (shallow) {
          var j = 0, len = value.length;
          while (j < len) output[idx++] = value[j++];
        } else {
          flatten(value, shallow, strict, output);
          idx = output.length;
        }
      } else if (!strict) {
        output[idx++] = value;
      }
    }
    return output;
  };

  // Flatten out an array, either recursively (by default), or just one level.
  _.flatten = function(array, shallow) {
    return flatten(array, shallow, false);
  };

  // Return a version of the array that does not contain the specified value(s).
  _.without = restArguments(function(array, otherArrays) {
    return _.difference(array, otherArrays);
  });

  // Produce a duplicate-free version of the array. If the array has already
  // been sorted, you have the option of using a faster algorithm.
  // The faster algorithm will not work with an iteratee if the iteratee
  // is not a one-to-one function, so providing an iteratee will disable
  // the faster algorithm.
  // Aliased as `unique`.
  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
    if (!_.isBoolean(isSorted)) {
      context = iteratee;
      iteratee = isSorted;
      isSorted = false;
    }
    if (iteratee != null) iteratee = cb(iteratee, context);
    var result = [];
    var seen = [];
    for (var i = 0, length = getLength(array); i < length; i++) {
      var value = array[i],
          computed = iteratee ? iteratee(value, i, array) : value;
      if (isSorted && !iteratee) {
        if (!i || seen !== computed) result.push(value);
        seen = computed;
      } else if (iteratee) {
        if (!_.contains(seen, computed)) {
          seen.push(computed);
          result.push(value);
        }
      } else if (!_.contains(result, value)) {
        result.push(value);
      }
    }
    return result;
  };

  // Produce an array that contains the union: each distinct element from all of
  // the passed-in arrays.
  _.union = restArguments(function(arrays) {
    return _.uniq(flatten(arrays, true, true));
  });

  // Produce an array that contains every item shared between all the
  // passed-in arrays.
  _.intersection = function(array) {
    var result = [];
    var argsLength = arguments.length;
    for (var i = 0, length = getLength(array); i < length; i++) {
      var item = array[i];
      if (_.contains(result, item)) continue;
      var j;
      for (j = 1; j < argsLength; j++) {
        if (!_.contains(arguments[j], item)) break;
      }
      if (j === argsLength) result.push(item);
    }
    return result;
  };

  // Take the difference between one array and a number of other arrays.
  // Only the elements present in just the first array will remain.
  _.difference = restArguments(function(array, rest) {
    rest = flatten(rest, true, true);
    return _.filter(array, function(value){
      return !_.contains(rest, value);
    });
  });

  // Complement of _.zip. Unzip accepts an array of arrays and groups
  // each array's elements on shared indices.
  _.unzip = function(array) {
    var length = array && _.max(array, getLength).length || 0;
    var result = Array(length);

    for (var index = 0; index < length; index++) {
      result[index] = _.pluck(array, index);
    }
    return result;
  };

  // Zip together multiple lists into a single array -- elements that share
  // an index go together.
  _.zip = restArguments(_.unzip);

  // Converts lists into objects. Pass either a single array of `[key, value]`
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
  // the corresponding values. Passing by pairs is the reverse of _.pairs.
  _.object = function(list, values) {
    var result = {};
    for (var i = 0, length = getLength(list); i < length; i++) {
      if (values) {
        result[list[i]] = values[i];
      } else {
        result[list[i][0]] = list[i][1];
      }
    }
    return result;
  };

  // Generator function to create the findIndex and findLastIndex functions.
  var createPredicateIndexFinder = function(dir) {
    return function(array, predicate, context) {
      predicate = cb(predicate, context);
      var length = getLength(array);
      var index = dir > 0 ? 0 : length - 1;
      for (; index >= 0 && index < length; index += dir) {
        if (predicate(array[index], index, array)) return index;
      }
      return -1;
    };
  };

  // Returns the first index on an array-like that passes a predicate test.
  _.findIndex = createPredicateIndexFinder(1);
  _.findLastIndex = createPredicateIndexFinder(-1);

  // Use a comparator function to figure out the smallest index at which
  // an object should be inserted so as to maintain order. Uses binary search.
  _.sortedIndex = function(array, obj, iteratee, context) {
    iteratee = cb(iteratee, context, 1);
    var value = iteratee(obj);
    var low = 0, high = getLength(array);
    while (low < high) {
      var mid = Math.floor((low + high) / 2);
      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
    }
    return low;
  };

  // Generator function to create the indexOf and lastIndexOf functions.
  var createIndexFinder = function(dir, predicateFind, sortedIndex) {
    return function(array, item, idx) {
      var i = 0, length = getLength(array);
      if (typeof idx == 'number') {
        if (dir > 0) {
          i = idx >= 0 ? idx : Math.max(idx + length, i);
        } else {
          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
        }
      } else if (sortedIndex && idx && length) {
        idx = sortedIndex(array, item);
        return array[idx] === item ? idx : -1;
      }
      if (item !== item) {
        idx = predicateFind(slice.call(array, i, length), _.isNaN);
        return idx >= 0 ? idx + i : -1;
      }
      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
        if (array[idx] === item) return idx;
      }
      return -1;
    };
  };

  // Return the position of the first occurrence of an item in an array,
  // or -1 if the item is not included in the array.
  // If the array is large and already in sort order, pass `true`
  // for **isSorted** to use binary search.
  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);

  // Generate an integer Array containing an arithmetic progression. A port of
  // the native Python `range()` function. See
  // [the Python documentation](http://docs.python.org/library/functions.html#range).
  _.range = function(start, stop, step) {
    if (stop == null) {
      stop = start || 0;
      start = 0;
    }
    if (!step) {
      step = stop < start ? -1 : 1;
    }

    var length = Math.max(Math.ceil((stop - start) / step), 0);
    var range = Array(length);

    for (var idx = 0; idx < length; idx++, start += step) {
      range[idx] = start;
    }

    return range;
  };

  // Chunk a single array into multiple arrays, each containing `count` or fewer
  // items.
  _.chunk = function(array, count) {
    if (count == null || count < 1) return [];
    var result = [];
    var i = 0, length = array.length;
    while (i < length) {
      result.push(slice.call(array, i, i += count));
    }
    return result;
  };

  // Function (ahem) Functions
  // ------------------

  // Determines whether to execute a function as a constructor
  // or a normal function with the provided arguments.
  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
    var self = baseCreate(sourceFunc.prototype);
    var result = sourceFunc.apply(self, args);
    if (_.isObject(result)) return result;
    return self;
  };

  // Create a function bound to a given object (assigning `this`, and arguments,
  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
  // available.
  _.bind = restArguments(function(func, context, args) {
    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
    var bound = restArguments(function(callArgs) {
      return executeBound(func, bound, context, this, args.concat(callArgs));
    });
    return bound;
  });

  // Partially apply a function by creating a version that has had some of its
  // arguments pre-filled, without changing its dynamic `this` context. _ acts
  // as a placeholder by default, allowing any combination of arguments to be
  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
  _.partial = restArguments(function(func, boundArgs) {
    var placeholder = _.partial.placeholder;
    var bound = function() {
      var position = 0, length = boundArgs.length;
      var args = Array(length);
      for (var i = 0; i < length; i++) {
        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
      }
      while (position < arguments.length) args.push(arguments[position++]);
      return executeBound(func, bound, this, this, args);
    };
    return bound;
  });

  _.partial.placeholder = _;

  // Bind a number of an object's methods to that object. Remaining arguments
  // are the method names to be bound. Useful for ensuring that all callbacks
  // defined on an object belong to it.
  _.bindAll = restArguments(function(obj, keys) {
    keys = flatten(keys, false, false);
    var index = keys.length;
    if (index < 1) throw new Error('bindAll must be passed function names');
    while (index--) {
      var key = keys[index];
      obj[key] = _.bind(obj[key], obj);
    }
  });

  // Memoize an expensive function by storing its results.
  _.memoize = function(func, hasher) {
    var memoize = function(key) {
      var cache = memoize.cache;
      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
      if (!has(cache, address)) cache[address] = func.apply(this, arguments);
      return cache[address];
    };
    memoize.cache = {};
    return memoize;
  };

  // Delays a function for the given number of milliseconds, and then calls
  // it with the arguments supplied.
  _.delay = restArguments(function(func, wait, args) {
    return setTimeout(function() {
      return func.apply(null, args);
    }, wait);
  });

  // Defers a function, scheduling it to run after the current call stack has
  // cleared.
  _.defer = _.partial(_.delay, _, 1);

  // Returns a function, that, when invoked, will only be triggered at most once
  // during a given window of time. Normally, the throttled function will run
  // as much as it can, without ever going more than once per `wait` duration;
  // but if you'd like to disable the execution on the leading edge, pass
  // `{leading: false}`. To disable execution on the trailing edge, ditto.
  _.throttle = function(func, wait, options) {
    var timeout, context, args, result;
    var previous = 0;
    if (!options) options = {};

    var later = function() {
      previous = options.leading === false ? 0 : _.now();
      timeout = null;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    };

    var throttled = function() {
      var now = _.now();
      if (!previous && options.leading === false) previous = now;
      var remaining = wait - (now - previous);
      context = this;
      args = arguments;
      if (remaining <= 0 || remaining > wait) {
        if (timeout) {
          clearTimeout(timeout);
          timeout = null;
        }
        previous = now;
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      } else if (!timeout && options.trailing !== false) {
        timeout = setTimeout(later, remaining);
      }
      return result;
    };

    throttled.cancel = function() {
      clearTimeout(timeout);
      previous = 0;
      timeout = context = args = null;
    };

    return throttled;
  };

  // Returns a function, that, as long as it continues to be invoked, will not
  // be triggered. The function will be called after it stops being called for
  // N milliseconds. If `immediate` is passed, trigger the function on the
  // leading edge, instead of the trailing.
  _.debounce = function(func, wait, immediate) {
    var timeout, result;

    var later = function(context, args) {
      timeout = null;
      if (args) result = func.apply(context, args);
    };

    var debounced = restArguments(function(args) {
      if (timeout) clearTimeout(timeout);
      if (immediate) {
        var callNow = !timeout;
        timeout = setTimeout(later, wait);
        if (callNow) result = func.apply(this, args);
      } else {
        timeout = _.delay(later, wait, this, args);
      }

      return result;
    });

    debounced.cancel = function() {
      clearTimeout(timeout);
      timeout = null;
    };

    return debounced;
  };

  // Returns the first function passed as an argument to the second,
  // allowing you to adjust arguments, run code before and after, and
  // conditionally execute the original function.
  _.wrap = function(func, wrapper) {
    return _.partial(wrapper, func);
  };

  // Returns a negated version of the passed-in predicate.
  _.negate = function(predicate) {
    return function() {
      return !predicate.apply(this, arguments);
    };
  };

  // Returns a function that is the composition of a list of functions, each
  // consuming the return value of the function that follows.
  _.compose = function() {
    var args = arguments;
    var start = args.length - 1;
    return function() {
      var i = start;
      var result = args[start].apply(this, arguments);
      while (i--) result = args[i].call(this, result);
      return result;
    };
  };

  // Returns a function that will only be executed on and after the Nth call.
  _.after = function(times, func) {
    return function() {
      if (--times < 1) {
        return func.apply(this, arguments);
      }
    };
  };

  // Returns a function that will only be executed up to (but not including) the Nth call.
  _.before = function(times, func) {
    var memo;
    return function() {
      if (--times > 0) {
        memo = func.apply(this, arguments);
      }
      if (times <= 1) func = null;
      return memo;
    };
  };

  // Returns a function that will be executed at most one time, no matter how
  // often you call it. Useful for lazy initialization.
  _.once = _.partial(_.before, 2);

  _.restArguments = restArguments;

  // Object Functions
  // ----------------

  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

  var collectNonEnumProps = function(obj, keys) {
    var nonEnumIdx = nonEnumerableProps.length;
    var constructor = obj.constructor;
    var proto = _.isFunction(constructor) && constructor.prototype || ObjProto;

    // Constructor is a special case.
    var prop = 'constructor';
    if (has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);

    while (nonEnumIdx--) {
      prop = nonEnumerableProps[nonEnumIdx];
      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
        keys.push(prop);
      }
    }
  };

  // Retrieve the names of an object's own properties.
  // Delegates to **ECMAScript 5**'s native `Object.keys`.
  _.keys = function(obj) {
    if (!_.isObject(obj)) return [];
    if (nativeKeys) return nativeKeys(obj);
    var keys = [];
    for (var key in obj) if (has(obj, key)) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  };

  // Retrieve all the property names of an object.
  _.allKeys = function(obj) {
    if (!_.isObject(obj)) return [];
    var keys = [];
    for (var key in obj) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  };

  // Retrieve the values of an object's properties.
  _.values = function(obj) {
    var keys = _.keys(obj);
    var length = keys.length;
    var values = Array(length);
    for (var i = 0; i < length; i++) {
      values[i] = obj[keys[i]];
    }
    return values;
  };

  // Returns the results of applying the iteratee to each element of the object.
  // In contrast to _.map it returns an object.
  _.mapObject = function(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var keys = _.keys(obj),
        length = keys.length,
        results = {};
    for (var index = 0; index < length; index++) {
      var currentKey = keys[index];
      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  };

  // Convert an object into a list of `[key, value]` pairs.
  // The opposite of _.object.
  _.pairs = function(obj) {
    var keys = _.keys(obj);
    var length = keys.length;
    var pairs = Array(length);
    for (var i = 0; i < length; i++) {
      pairs[i] = [keys[i], obj[keys[i]]];
    }
    return pairs;
  };

  // Invert the keys and values of an object. The values must be serializable.
  _.invert = function(obj) {
    var result = {};
    var keys = _.keys(obj);
    for (var i = 0, length = keys.length; i < length; i++) {
      result[obj[keys[i]]] = keys[i];
    }
    return result;
  };

  // Return a sorted list of the function names available on the object.
  // Aliased as `methods`.
  _.functions = _.methods = function(obj) {
    var names = [];
    for (var key in obj) {
      if (_.isFunction(obj[key])) names.push(key);
    }
    return names.sort();
  };

  // An internal function for creating assigner functions.
  var createAssigner = function(keysFunc, defaults) {
    return function(obj) {
      var length = arguments.length;
      if (defaults) obj = Object(obj);
      if (length < 2 || obj == null) return obj;
      for (var index = 1; index < length; index++) {
        var source = arguments[index],
            keys = keysFunc(source),
            l = keys.length;
        for (var i = 0; i < l; i++) {
          var key = keys[i];
          if (!defaults || obj[key] === void 0) obj[key] = source[key];
        }
      }
      return obj;
    };
  };

  // Extend a given object with all the properties in passed-in object(s).
  _.extend = createAssigner(_.allKeys);

  // Assigns a given object with all the own properties in the passed-in object(s).
  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
  _.extendOwn = _.assign = createAssigner(_.keys);

  // Returns the first key on an object that passes a predicate test.
  _.findKey = function(obj, predicate, context) {
    predicate = cb(predicate, context);
    var keys = _.keys(obj), key;
    for (var i = 0, length = keys.length; i < length; i++) {
      key = keys[i];
      if (predicate(obj[key], key, obj)) return key;
    }
  };

  // Internal pick helper function to determine if `obj` has key `key`.
  var keyInObj = function(value, key, obj) {
    return key in obj;
  };

  // Return a copy of the object only containing the whitelisted properties.
  _.pick = restArguments(function(obj, keys) {
    var result = {}, iteratee = keys[0];
    if (obj == null) return result;
    if (_.isFunction(iteratee)) {
      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
      keys = _.allKeys(obj);
    } else {
      iteratee = keyInObj;
      keys = flatten(keys, false, false);
      obj = Object(obj);
    }
    for (var i = 0, length = keys.length; i < length; i++) {
      var key = keys[i];
      var value = obj[key];
      if (iteratee(value, key, obj)) result[key] = value;
    }
    return result;
  });

  // Return a copy of the object without the blacklisted properties.
  _.omit = restArguments(function(obj, keys) {
    var iteratee = keys[0], context;
    if (_.isFunction(iteratee)) {
      iteratee = _.negate(iteratee);
      if (keys.length > 1) context = keys[1];
    } else {
      keys = _.map(flatten(keys, false, false), String);
      iteratee = function(value, key) {
        return !_.contains(keys, key);
      };
    }
    return _.pick(obj, iteratee, context);
  });

  // Fill in a given object with default properties.
  _.defaults = createAssigner(_.allKeys, true);

  // Creates an object that inherits from the given prototype object.
  // If additional properties are provided then they will be added to the
  // created object.
  _.create = function(prototype, props) {
    var result = baseCreate(prototype);
    if (props) _.extendOwn(result, props);
    return result;
  };

  // Create a (shallow-cloned) duplicate of an object.
  _.clone = function(obj) {
    if (!_.isObject(obj)) return obj;
    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
  };

  // Invokes interceptor with the obj, and then returns obj.
  // The primary purpose of this method is to "tap into" a method chain, in
  // order to perform operations on intermediate results within the chain.
  _.tap = function(obj, interceptor) {
    interceptor(obj);
    return obj;
  };

  // Returns whether an object has a given set of `key:value` pairs.
  _.isMatch = function(object, attrs) {
    var keys = _.keys(attrs), length = keys.length;
    if (object == null) return !length;
    var obj = Object(object);
    for (var i = 0; i < length; i++) {
      var key = keys[i];
      if (attrs[key] !== obj[key] || !(key in obj)) return false;
    }
    return true;
  };


  // Internal recursive comparison function for `isEqual`.
  var eq, deepEq;
  eq = function(a, b, aStack, bStack) {
    // Identical objects are equal. `0 === -0`, but they aren't identical.
    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
    if (a === b) return a !== 0 || 1 / a === 1 / b;
    // `null` or `undefined` only equal to itself (strict comparison).
    if (a == null || b == null) return false;
    // `NaN`s are equivalent, but non-reflexive.
    if (a !== a) return b !== b;
    // Exhaust primitive checks
    var type = typeof a;
    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
    return deepEq(a, b, aStack, bStack);
  };

  // Internal recursive comparison function for `isEqual`.
  deepEq = function(a, b, aStack, bStack) {
    // Unwrap any wrapped objects.
    if (a instanceof _) a = a._wrapped;
    if (b instanceof _) b = b._wrapped;
    // Compare `[[Class]]` names.
    var className = toString.call(a);
    if (className !== toString.call(b)) return false;
    switch (className) {
      // Strings, numbers, regular expressions, dates, and booleans are compared by value.
      case '[object RegExp]':
      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
      case '[object String]':
        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
        // equivalent to `new String("5")`.
        return '' + a === '' + b;
      case '[object Number]':
        // `NaN`s are equivalent, but non-reflexive.
        // Object(NaN) is equivalent to NaN.
        if (+a !== +a) return +b !== +b;
        // An `egal` comparison is performed for other numeric values.
        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
      case '[object Date]':
      case '[object Boolean]':
        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
        // millisecond representations. Note that invalid dates with millisecond representations
        // of `NaN` are not equivalent.
        return +a === +b;
      case '[object Symbol]':
        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
    }

    var areArrays = className === '[object Array]';
    if (!areArrays) {
      if (typeof a != 'object' || typeof b != 'object') return false;

      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
      // from different frames are.
      var aCtor = a.constructor, bCtor = b.constructor;
      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
                               _.isFunction(bCtor) && bCtor instanceof bCtor)
                          && ('constructor' in a && 'constructor' in b)) {
        return false;
      }
    }
    // Assume equality for cyclic structures. The algorithm for detecting cyclic
    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.

    // Initializing stack of traversed objects.
    // It's done here since we only need them for objects and arrays comparison.
    aStack = aStack || [];
    bStack = bStack || [];
    var length = aStack.length;
    while (length--) {
      // Linear search. Performance is inversely proportional to the number of
      // unique nested structures.
      if (aStack[length] === a) return bStack[length] === b;
    }

    // Add the first object to the stack of traversed objects.
    aStack.push(a);
    bStack.push(b);

    // Recursively compare objects and arrays.
    if (areArrays) {
      // Compare array lengths to determine if a deep comparison is necessary.
      length = a.length;
      if (length !== b.length) return false;
      // Deep compare the contents, ignoring non-numeric properties.
      while (length--) {
        if (!eq(a[length], b[length], aStack, bStack)) return false;
      }
    } else {
      // Deep compare objects.
      var keys = _.keys(a), key;
      length = keys.length;
      // Ensure that both objects contain the same number of properties before comparing deep equality.
      if (_.keys(b).length !== length) return false;
      while (length--) {
        // Deep compare each member
        key = keys[length];
        if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
      }
    }
    // Remove the first object from the stack of traversed objects.
    aStack.pop();
    bStack.pop();
    return true;
  };

  // Perform a deep comparison to check if two objects are equal.
  _.isEqual = function(a, b) {
    return eq(a, b);
  };

  // Is a given array, string, or object empty?
  // An "empty" object has no enumerable own-properties.
  _.isEmpty = function(obj) {
    if (obj == null) return true;
    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
    return _.keys(obj).length === 0;
  };

  // Is a given value a DOM element?
  _.isElement = function(obj) {
    return !!(obj && obj.nodeType === 1);
  };

  // Is a given value an array?
  // Delegates to ECMA5's native Array.isArray
  _.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
  };

  // Is a given variable an object?
  _.isObject = function(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && !!obj;
  };

  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet.
  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], function(name) {
    _['is' + name] = function(obj) {
      return toString.call(obj) === '[object ' + name + ']';
    };
  });

  // Define a fallback version of the method in browsers (ahem, IE < 9), where
  // there isn't any inspectable "Arguments" type.
  if (!_.isArguments(arguments)) {
    _.isArguments = function(obj) {
      return has(obj, 'callee');
    };
  }

  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
  // IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
  var nodelist = root.document && root.document.childNodes;
  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
    _.isFunction = function(obj) {
      return typeof obj == 'function' || false;
    };
  }

  // Is a given object a finite number?
  _.isFinite = function(obj) {
    return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj));
  };

  // Is the given value `NaN`?
  _.isNaN = function(obj) {
    return _.isNumber(obj) && isNaN(obj);
  };

  // Is a given value a boolean?
  _.isBoolean = function(obj) {
    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
  };

  // Is a given value equal to null?
  _.isNull = function(obj) {
    return obj === null;
  };

  // Is a given variable undefined?
  _.isUndefined = function(obj) {
    return obj === void 0;
  };

  // Shortcut function for checking if an object has a given property directly
  // on itself (in other words, not on a prototype).
  _.has = function(obj, path) {
    if (!_.isArray(path)) {
      return has(obj, path);
    }
    var length = path.length;
    for (var i = 0; i < length; i++) {
      var key = path[i];
      if (obj == null || !hasOwnProperty.call(obj, key)) {
        return false;
      }
      obj = obj[key];
    }
    return !!length;
  };

  // Utility Functions
  // -----------------

  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
  // previous owner. Returns a reference to the Underscore object.
  _.noConflict = function() {
    root._ = previousUnderscore;
    return this;
  };

  // Keep the identity function around for default iteratees.
  _.identity = function(value) {
    return value;
  };

  // Predicate-generating functions. Often useful outside of Underscore.
  _.constant = function(value) {
    return function() {
      return value;
    };
  };

  _.noop = function(){};

  // Creates a function that, when passed an object, will traverse that object’s
  // properties down the given `path`, specified as an array of keys or indexes.
  _.property = function(path) {
    if (!_.isArray(path)) {
      return shallowProperty(path);
    }
    return function(obj) {
      return deepGet(obj, path);
    };
  };

  // Generates a function for a given object that returns a given property.
  _.propertyOf = function(obj) {
    if (obj == null) {
      return function(){};
    }
    return function(path) {
      return !_.isArray(path) ? obj[path] : deepGet(obj, path);
    };
  };

  // Returns a predicate for checking whether an object has a given set of
  // `key:value` pairs.
  _.matcher = _.matches = function(attrs) {
    attrs = _.extendOwn({}, attrs);
    return function(obj) {
      return _.isMatch(obj, attrs);
    };
  };

  // Run a function **n** times.
  _.times = function(n, iteratee, context) {
    var accum = Array(Math.max(0, n));
    iteratee = optimizeCb(iteratee, context, 1);
    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
    return accum;
  };

  // Return a random integer between min and max (inclusive).
  _.random = function(min, max) {
    if (max == null) {
      max = min;
      min = 0;
    }
    return min + Math.floor(Math.random() * (max - min + 1));
  };

  // A (possibly faster) way to get the current timestamp as an integer.
  _.now = Date.now || function() {
    return new Date().getTime();
  };

  // List of HTML entities for escaping.
  var escapeMap = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#x27;',
    '`': '&#x60;'
  };
  var unescapeMap = _.invert(escapeMap);

  // Functions for escaping and unescaping strings to/from HTML interpolation.
  var createEscaper = function(map) {
    var escaper = function(match) {
      return map[match];
    };
    // Regexes for identifying a key that needs to be escaped.
    var source = '(?:' + _.keys(map).join('|') + ')';
    var testRegexp = RegExp(source);
    var replaceRegexp = RegExp(source, 'g');
    return function(string) {
      string = string == null ? '' : '' + string;
      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
    };
  };
  _.escape = createEscaper(escapeMap);
  _.unescape = createEscaper(unescapeMap);

  // Traverses the children of `obj` along `path`. If a child is a function, it
  // is invoked with its parent as context. Returns the value of the final
  // child, or `fallback` if any child is undefined.
  _.result = function(obj, path, fallback) {
    if (!_.isArray(path)) path = [path];
    var length = path.length;
    if (!length) {
      return _.isFunction(fallback) ? fallback.call(obj) : fallback;
    }
    for (var i = 0; i < length; i++) {
      var prop = obj == null ? void 0 : obj[path[i]];
      if (prop === void 0) {
        prop = fallback;
        i = length; // Ensure we don't continue iterating.
      }
      obj = _.isFunction(prop) ? prop.call(obj) : prop;
    }
    return obj;
  };

  // Generate a unique integer id (unique within the entire client session).
  // Useful for temporary DOM ids.
  var idCounter = 0;
  _.uniqueId = function(prefix) {
    var id = ++idCounter + '';
    return prefix ? prefix + id : id;
  };

  // By default, Underscore uses ERB-style template delimiters, change the
  // following template settings to use alternative delimiters.
  _.templateSettings = {
    evaluate: /<%([\s\S]+?)%>/g,
    interpolate: /<%=([\s\S]+?)%>/g,
    escape: /<%-([\s\S]+?)%>/g
  };

  // When customizing `templateSettings`, if you don't want to define an
  // interpolation, evaluation or escaping regex, we need one that is
  // guaranteed not to match.
  var noMatch = /(.)^/;

  // Certain characters need to be escaped so that they can be put into a
  // string literal.
  var escapes = {
    "'": "'",
    '\\': '\\',
    '\r': 'r',
    '\n': 'n',
    '\u2028': 'u2028',
    '\u2029': 'u2029'
  };

  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;

  var escapeChar = function(match) {
    return '\\' + escapes[match];
  };

  // JavaScript micro-templating, similar to John Resig's implementation.
  // Underscore templating handles arbitrary delimiters, preserves whitespace,
  // and correctly escapes quotes within interpolated code.
  // NB: `oldSettings` only exists for backwards compatibility.
  _.template = function(text, settings, oldSettings) {
    if (!settings && oldSettings) settings = oldSettings;
    settings = _.defaults({}, settings, _.templateSettings);

    // Combine delimiters into one regular expression via alternation.
    var matcher = RegExp([
      (settings.escape || noMatch).source,
      (settings.interpolate || noMatch).source,
      (settings.evaluate || noMatch).source
    ].join('|') + '|$', 'g');

    // Compile the template source, escaping string literals appropriately.
    var index = 0;
    var source = "__p+='";
    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
      index = offset + match.length;

      if (escape) {
        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
      } else if (interpolate) {
        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
      } else if (evaluate) {
        source += "';\n" + evaluate + "\n__p+='";
      }

      // Adobe VMs need the match returned to produce the correct offset.
      return match;
    });
    source += "';\n";

    // If a variable is not specified, place data values in local scope.
    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';

    source = "var __t,__p='',__j=Array.prototype.join," +
      "print=function(){__p+=__j.call(arguments,'');};\n" +
      source + 'return __p;\n';

    var render;
    try {
      render = new Function(settings.variable || 'obj', '_', source);
    } catch (e) {
      e.source = source;
      throw e;
    }

    var template = function(data) {
      return render.call(this, data, _);
    };

    // Provide the compiled source as a convenience for precompilation.
    var argument = settings.variable || 'obj';
    template.source = 'function(' + argument + '){\n' + source + '}';

    return template;
  };

  // Add a "chain" function. Start chaining a wrapped Underscore object.
  _.chain = function(obj) {
    var instance = _(obj);
    instance._chain = true;
    return instance;
  };

  // OOP
  // ---------------
  // If Underscore is called as a function, it returns a wrapped object that
  // can be used OO-style. This wrapper holds altered versions of all the
  // underscore functions. Wrapped objects may be chained.

  // Helper function to continue chaining intermediate results.
  var chainResult = function(instance, obj) {
    return instance._chain ? _(obj).chain() : obj;
  };

  // Add your own custom functions to the Underscore object.
  _.mixin = function(obj) {
    _.each(_.functions(obj), function(name) {
      var func = _[name] = obj[name];
      _.prototype[name] = function() {
        var args = [this._wrapped];
        push.apply(args, arguments);
        return chainResult(this, func.apply(_, args));
      };
    });
    return _;
  };

  // Add all of the Underscore functions to the wrapper object.
  _.mixin(_);

  // Add all mutator Array functions to the wrapper.
  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      var obj = this._wrapped;
      method.apply(obj, arguments);
      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
      return chainResult(this, obj);
    };
  });

  // Add all accessor Array functions to the wrapper.
  _.each(['concat', 'join', 'slice'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      return chainResult(this, method.apply(this._wrapped, arguments));
    };
  });

  // Extracts the result from a wrapped and chained object.
  _.prototype.value = function() {
    return this._wrapped;
  };

  // Provide unwrapping proxy for some methods used in engine operations
  // such as arithmetic and JSON stringification.
  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;

  _.prototype.toString = function() {
    return String(this._wrapped);
  };

  // AMD registration happens at the end for compatibility with AMD loaders
  // that may not enforce next-turn semantics on modules. Even though general
  // practice for AMD registration is to be anonymous, underscore registers
  // as a named module because, like jQuery, it is a base library that is
  // popular enough to be bundled in a third party lib, but not be part of
  // an AMD load request. Those cases could generate an error when an
  // anonymous define() is called outside of a loader request.
  if (typeof define == 'function' && define.amd) {
    define('underscore', [], function() {
      return _;
    });
  }
}());

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy91bmRlcnNjb3JlL3VuZGVyc2NvcmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAgICAgVW5kZXJzY29yZS5qcyAxLjkuMVxuLy8gICAgIGh0dHA6Ly91bmRlcnNjb3JlanMub3JnXG4vLyAgICAgKGMpIDIwMDktMjAxOCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuLy8gICAgIFVuZGVyc2NvcmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbihmdW5jdGlvbigpIHtcblxuICAvLyBCYXNlbGluZSBzZXR1cFxuICAvLyAtLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEVzdGFibGlzaCB0aGUgcm9vdCBvYmplY3QsIGB3aW5kb3dgIChgc2VsZmApIGluIHRoZSBicm93c2VyLCBgZ2xvYmFsYFxuICAvLyBvbiB0aGUgc2VydmVyLCBvciBgdGhpc2AgaW4gc29tZSB2aXJ0dWFsIG1hY2hpbmVzLiBXZSB1c2UgYHNlbGZgXG4gIC8vIGluc3RlYWQgb2YgYHdpbmRvd2AgZm9yIGBXZWJXb3JrZXJgIHN1cHBvcnQuXG4gIHZhciByb290ID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmICYmIHNlbGYgfHxcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsLmdsb2JhbCA9PT0gZ2xvYmFsICYmIGdsb2JhbCB8fFxuICAgICAgICAgICAgdGhpcyB8fFxuICAgICAgICAgICAge307XG5cbiAgLy8gU2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGBfYCB2YXJpYWJsZS5cbiAgdmFyIHByZXZpb3VzVW5kZXJzY29yZSA9IHJvb3QuXztcblxuICAvLyBTYXZlIGJ5dGVzIGluIHRoZSBtaW5pZmllZCAoYnV0IG5vdCBnemlwcGVkKSB2ZXJzaW9uOlxuICB2YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSwgT2JqUHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgU3ltYm9sUHJvdG8gPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyA/IFN5bWJvbC5wcm90b3R5cGUgOiBudWxsO1xuXG4gIC8vIENyZWF0ZSBxdWljayByZWZlcmVuY2UgdmFyaWFibGVzIGZvciBzcGVlZCBhY2Nlc3MgdG8gY29yZSBwcm90b3R5cGVzLlxuICB2YXIgcHVzaCA9IEFycmF5UHJvdG8ucHVzaCxcbiAgICAgIHNsaWNlID0gQXJyYXlQcm90by5zbGljZSxcbiAgICAgIHRvU3RyaW5nID0gT2JqUHJvdG8udG9TdHJpbmcsXG4gICAgICBoYXNPd25Qcm9wZXJ0eSA9IE9ialByb3RvLmhhc093blByb3BlcnR5O1xuXG4gIC8vIEFsbCAqKkVDTUFTY3JpcHQgNSoqIG5hdGl2ZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3ZSBob3BlIHRvIHVzZVxuICAvLyBhcmUgZGVjbGFyZWQgaGVyZS5cbiAgdmFyIG5hdGl2ZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5LFxuICAgICAgbmF0aXZlS2V5cyA9IE9iamVjdC5rZXlzLFxuICAgICAgbmF0aXZlQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuICAvLyBOYWtlZCBmdW5jdGlvbiByZWZlcmVuY2UgZm9yIHN1cnJvZ2F0ZS1wcm90b3R5cGUtc3dhcHBpbmcuXG4gIHZhciBDdG9yID0gZnVuY3Rpb24oKXt9O1xuXG4gIC8vIENyZWF0ZSBhIHNhZmUgcmVmZXJlbmNlIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdCBmb3IgdXNlIGJlbG93LlxuICB2YXIgXyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBfKSByZXR1cm4gb2JqO1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBfKSkgcmV0dXJuIG5ldyBfKG9iaik7XG4gICAgdGhpcy5fd3JhcHBlZCA9IG9iajtcbiAgfTtcblxuICAvLyBFeHBvcnQgdGhlIFVuZGVyc2NvcmUgb2JqZWN0IGZvciAqKk5vZGUuanMqKiwgd2l0aFxuICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgdGhlaXIgb2xkIG1vZHVsZSBBUEkuIElmIHdlJ3JlIGluXG4gIC8vIHRoZSBicm93c2VyLCBhZGQgYF9gIGFzIGEgZ2xvYmFsIG9iamVjdC5cbiAgLy8gKGBub2RlVHlwZWAgaXMgY2hlY2tlZCB0byBlbnN1cmUgdGhhdCBgbW9kdWxlYFxuICAvLyBhbmQgYGV4cG9ydHNgIGFyZSBub3QgSFRNTCBlbGVtZW50cy4pXG4gIGlmICh0eXBlb2YgZXhwb3J0cyAhPSAndW5kZWZpbmVkJyAmJiAhZXhwb3J0cy5ub2RlVHlwZSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF87XG4gICAgfVxuICAgIGV4cG9ydHMuXyA9IF87XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fID0gXztcbiAgfVxuXG4gIC8vIEN1cnJlbnQgdmVyc2lvbi5cbiAgXy5WRVJTSU9OID0gJzEuOS4xJztcblxuICAvLyBJbnRlcm5hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZWZmaWNpZW50IChmb3IgY3VycmVudCBlbmdpbmVzKSB2ZXJzaW9uXG4gIC8vIG9mIHRoZSBwYXNzZWQtaW4gY2FsbGJhY2ssIHRvIGJlIHJlcGVhdGVkbHkgYXBwbGllZCBpbiBvdGhlciBVbmRlcnNjb3JlXG4gIC8vIGZ1bmN0aW9ucy5cbiAgdmFyIG9wdGltaXplQ2IgPSBmdW5jdGlvbihmdW5jLCBjb250ZXh0LCBhcmdDb3VudCkge1xuICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHJldHVybiBmdW5jO1xuICAgIHN3aXRjaCAoYXJnQ291bnQgPT0gbnVsbCA/IDMgOiBhcmdDb3VudCkge1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCB2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgLy8gVGhlIDItYXJndW1lbnQgY2FzZSBpcyBvbWl0dGVkIGJlY2F1c2Ugd2XigJlyZSBub3QgdXNpbmcgaXQuXG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgfTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGZ1bmN0aW9uKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCBhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgYnVpbHRpbkl0ZXJhdGVlO1xuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNhbGxiYWNrcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGVhY2hcbiAgLy8gZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24sIHJldHVybmluZyB0aGUgZGVzaXJlZCByZXN1bHQg4oCUIGVpdGhlciBgaWRlbnRpdHlgLFxuICAvLyBhbiBhcmJpdHJhcnkgY2FsbGJhY2ssIGEgcHJvcGVydHkgbWF0Y2hlciwgb3IgYSBwcm9wZXJ0eSBhY2Nlc3Nvci5cbiAgdmFyIGNiID0gZnVuY3Rpb24odmFsdWUsIGNvbnRleHQsIGFyZ0NvdW50KSB7XG4gICAgaWYgKF8uaXRlcmF0ZWUgIT09IGJ1aWx0aW5JdGVyYXRlZSkgcmV0dXJuIF8uaXRlcmF0ZWUodmFsdWUsIGNvbnRleHQpO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gXy5pZGVudGl0eTtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuIG9wdGltaXplQ2IodmFsdWUsIGNvbnRleHQsIGFyZ0NvdW50KTtcbiAgICBpZiAoXy5pc09iamVjdCh2YWx1ZSkgJiYgIV8uaXNBcnJheSh2YWx1ZSkpIHJldHVybiBfLm1hdGNoZXIodmFsdWUpO1xuICAgIHJldHVybiBfLnByb3BlcnR5KHZhbHVlKTtcbiAgfTtcblxuICAvLyBFeHRlcm5hbCB3cmFwcGVyIGZvciBvdXIgY2FsbGJhY2sgZ2VuZXJhdG9yLiBVc2VycyBtYXkgY3VzdG9taXplXG4gIC8vIGBfLml0ZXJhdGVlYCBpZiB0aGV5IHdhbnQgYWRkaXRpb25hbCBwcmVkaWNhdGUvaXRlcmF0ZWUgc2hvcnRoYW5kIHN0eWxlcy5cbiAgLy8gVGhpcyBhYnN0cmFjdGlvbiBoaWRlcyB0aGUgaW50ZXJuYWwtb25seSBhcmdDb3VudCBhcmd1bWVudC5cbiAgXy5pdGVyYXRlZSA9IGJ1aWx0aW5JdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNiKHZhbHVlLCBjb250ZXh0LCBJbmZpbml0eSk7XG4gIH07XG5cbiAgLy8gU29tZSBmdW5jdGlvbnMgdGFrZSBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMsIG9yIGEgZmV3IGV4cGVjdGVkXG4gIC8vIGFyZ3VtZW50cyBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGVuIGEgdmFyaWFibGUgbnVtYmVyIG9mIHZhbHVlcyB0byBvcGVyYXRlXG4gIC8vIG9uLiBUaGlzIGhlbHBlciBhY2N1bXVsYXRlcyBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cyBwYXN0IHRoZSBmdW5jdGlvbuKAmXNcbiAgLy8gYXJndW1lbnQgbGVuZ3RoIChvciBhbiBleHBsaWNpdCBgc3RhcnRJbmRleGApLCBpbnRvIGFuIGFycmF5IHRoYXQgYmVjb21lc1xuICAvLyB0aGUgbGFzdCBhcmd1bWVudC4gU2ltaWxhciB0byBFUzbigJlzIFwicmVzdCBwYXJhbWV0ZXJcIi5cbiAgdmFyIHJlc3RBcmd1bWVudHMgPSBmdW5jdGlvbihmdW5jLCBzdGFydEluZGV4KSB7XG4gICAgc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXggPT0gbnVsbCA/IGZ1bmMubGVuZ3RoIC0gMSA6ICtzdGFydEluZGV4O1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBsZW5ndGggPSBNYXRoLm1heChhcmd1bWVudHMubGVuZ3RoIC0gc3RhcnRJbmRleCwgMCksXG4gICAgICAgICAgcmVzdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHJlc3RbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4ICsgc3RhcnRJbmRleF07XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXMsIHJlc3QpO1xuICAgICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpcywgYXJndW1lbnRzWzBdLCByZXN0KTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXMsIGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdLCByZXN0KTtcbiAgICAgIH1cbiAgICAgIHZhciBhcmdzID0gQXJyYXkoc3RhcnRJbmRleCArIDEpO1xuICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3RhcnRJbmRleDsgaW5kZXgrKykge1xuICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICB9XG4gICAgICBhcmdzW3N0YXJ0SW5kZXhdID0gcmVzdDtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgbmV3IG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gYW5vdGhlci5cbiAgdmFyIGJhc2VDcmVhdGUgPSBmdW5jdGlvbihwcm90b3R5cGUpIHtcbiAgICBpZiAoIV8uaXNPYmplY3QocHJvdG90eXBlKSkgcmV0dXJuIHt9O1xuICAgIGlmIChuYXRpdmVDcmVhdGUpIHJldHVybiBuYXRpdmVDcmVhdGUocHJvdG90eXBlKTtcbiAgICBDdG9yLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEN0b3I7XG4gICAgQ3Rvci5wcm90b3R5cGUgPSBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIHNoYWxsb3dQcm9wZXJ0eSA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogPT0gbnVsbCA/IHZvaWQgMCA6IG9ialtrZXldO1xuICAgIH07XG4gIH07XG5cbiAgdmFyIGhhcyA9IGZ1bmN0aW9uKG9iaiwgcGF0aCkge1xuICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcGF0aCk7XG4gIH1cblxuICB2YXIgZGVlcEdldCA9IGZ1bmN0aW9uKG9iaiwgcGF0aCkge1xuICAgIHZhciBsZW5ndGggPSBwYXRoLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiB2b2lkIDA7XG4gICAgICBvYmogPSBvYmpbcGF0aFtpXV07XG4gICAgfVxuICAgIHJldHVybiBsZW5ndGggPyBvYmogOiB2b2lkIDA7XG4gIH07XG5cbiAgLy8gSGVscGVyIGZvciBjb2xsZWN0aW9uIG1ldGhvZHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2xsZWN0aW9uXG4gIC8vIHNob3VsZCBiZSBpdGVyYXRlZCBhcyBhbiBhcnJheSBvciBhcyBhbiBvYmplY3QuXG4gIC8vIFJlbGF0ZWQ6IGh0dHA6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvbGVuZ3RoXG4gIC8vIEF2b2lkcyBhIHZlcnkgbmFzdHkgaU9TIDggSklUIGJ1ZyBvbiBBUk0tNjQuICMyMDk0XG4gIHZhciBNQVhfQVJSQVlfSU5ERVggPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuICB2YXIgZ2V0TGVuZ3RoID0gc2hhbGxvd1Byb3BlcnR5KCdsZW5ndGgnKTtcbiAgdmFyIGlzQXJyYXlMaWtlID0gZnVuY3Rpb24oY29sbGVjdGlvbikge1xuICAgIHZhciBsZW5ndGggPSBnZXRMZW5ndGgoY29sbGVjdGlvbik7XG4gICAgcmV0dXJuIHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgJiYgbGVuZ3RoID49IDAgJiYgbGVuZ3RoIDw9IE1BWF9BUlJBWV9JTkRFWDtcbiAgfTtcblxuICAvLyBDb2xsZWN0aW9uIEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFRoZSBjb3JuZXJzdG9uZSwgYW4gYGVhY2hgIGltcGxlbWVudGF0aW9uLCBha2EgYGZvckVhY2hgLlxuICAvLyBIYW5kbGVzIHJhdyBvYmplY3RzIGluIGFkZGl0aW9uIHRvIGFycmF5LWxpa2VzLiBUcmVhdHMgYWxsXG4gIC8vIHNwYXJzZSBhcnJheS1saWtlcyBhcyBpZiB0aGV5IHdlcmUgZGVuc2UuXG4gIF8uZWFjaCA9IF8uZm9yRWFjaCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IG9wdGltaXplQ2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciBpLCBsZW5ndGg7XG4gICAgaWYgKGlzQXJyYXlMaWtlKG9iaikpIHtcbiAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVyYXRlZShvYmpbaV0sIGksIG9iaik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdGVlKG9ialtrZXlzW2ldXSwga2V5c1tpXSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGl0ZXJhdGVlIHRvIGVhY2ggZWxlbWVudC5cbiAgXy5tYXAgPSBfLmNvbGxlY3QgPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdHMgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICByZXN1bHRzW2luZGV4XSA9IGl0ZXJhdGVlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG5cbiAgLy8gQ3JlYXRlIGEgcmVkdWNpbmcgZnVuY3Rpb24gaXRlcmF0aW5nIGxlZnQgb3IgcmlnaHQuXG4gIHZhciBjcmVhdGVSZWR1Y2UgPSBmdW5jdGlvbihkaXIpIHtcbiAgICAvLyBXcmFwIGNvZGUgdGhhdCByZWFzc2lnbnMgYXJndW1lbnQgdmFyaWFibGVzIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gdGhhblxuICAgIC8vIHRoZSBvbmUgdGhhdCBhY2Nlc3NlcyBgYXJndW1lbnRzLmxlbmd0aGAgdG8gYXZvaWQgYSBwZXJmIGhpdC4gKCMxOTkxKVxuICAgIHZhciByZWR1Y2VyID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgbWVtbywgaW5pdGlhbCkge1xuICAgICAgdmFyIGtleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgICBsZW5ndGggPSAoa2V5cyB8fCBvYmopLmxlbmd0aCxcbiAgICAgICAgICBpbmRleCA9IGRpciA+IDAgPyAwIDogbGVuZ3RoIC0gMTtcbiAgICAgIGlmICghaW5pdGlhbCkge1xuICAgICAgICBtZW1vID0gb2JqW2tleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4XTtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuICAgICAgfVxuICAgICAgZm9yICg7IGluZGV4ID49IDAgJiYgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IGRpcikge1xuICAgICAgICB2YXIgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgICBtZW1vID0gaXRlcmF0ZWUobWVtbywgb2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfTtcblxuICAgIHJldHVybiBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBtZW1vLCBjb250ZXh0KSB7XG4gICAgICB2YXIgaW5pdGlhbCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMztcbiAgICAgIHJldHVybiByZWR1Y2VyKG9iaiwgb3B0aW1pemVDYihpdGVyYXRlZSwgY29udGV4dCwgNCksIG1lbW8sIGluaXRpYWwpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gKipSZWR1Y2UqKiBidWlsZHMgdXAgYSBzaW5nbGUgcmVzdWx0IGZyb20gYSBsaXN0IG9mIHZhbHVlcywgYWthIGBpbmplY3RgLFxuICAvLyBvciBgZm9sZGxgLlxuICBfLnJlZHVjZSA9IF8uZm9sZGwgPSBfLmluamVjdCA9IGNyZWF0ZVJlZHVjZSgxKTtcblxuICAvLyBUaGUgcmlnaHQtYXNzb2NpYXRpdmUgdmVyc2lvbiBvZiByZWR1Y2UsIGFsc28ga25vd24gYXMgYGZvbGRyYC5cbiAgXy5yZWR1Y2VSaWdodCA9IF8uZm9sZHIgPSBjcmVhdGVSZWR1Y2UoLTEpO1xuXG4gIC8vIFJldHVybiB0aGUgZmlyc3QgdmFsdWUgd2hpY2ggcGFzc2VzIGEgdHJ1dGggdGVzdC4gQWxpYXNlZCBhcyBgZGV0ZWN0YC5cbiAgXy5maW5kID0gXy5kZXRlY3QgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBrZXlGaW5kZXIgPSBpc0FycmF5TGlrZShvYmopID8gXy5maW5kSW5kZXggOiBfLmZpbmRLZXk7XG4gICAgdmFyIGtleSA9IGtleUZpbmRlcihvYmosIHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgaWYgKGtleSAhPT0gdm9pZCAwICYmIGtleSAhPT0gLTEpIHJldHVybiBvYmpba2V5XTtcbiAgfTtcblxuICAvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyB0aGF0IHBhc3MgYSB0cnV0aCB0ZXN0LlxuICAvLyBBbGlhc2VkIGFzIGBzZWxlY3RgLlxuICBfLmZpbHRlciA9IF8uc2VsZWN0ID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHByZWRpY2F0ZSA9IGNiKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgbGlzdCkpIHJlc3VsdHMucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgZm9yIHdoaWNoIGEgdHJ1dGggdGVzdCBmYWlscy5cbiAgXy5yZWplY3QgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHJldHVybiBfLmZpbHRlcihvYmosIF8ubmVnYXRlKGNiKHByZWRpY2F0ZSkpLCBjb250ZXh0KTtcbiAgfTtcblxuICAvLyBEZXRlcm1pbmUgd2hldGhlciBhbGwgb2YgdGhlIGVsZW1lbnRzIG1hdGNoIGEgdHJ1dGggdGVzdC5cbiAgLy8gQWxpYXNlZCBhcyBgYWxsYC5cbiAgXy5ldmVyeSA9IF8uYWxsID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICBwcmVkaWNhdGUgPSBjYihwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYgXy5rZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IChrZXlzIHx8IG9iaikubGVuZ3RoO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICBpZiAoIXByZWRpY2F0ZShvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLy8gRGV0ZXJtaW5lIGlmIGF0IGxlYXN0IG9uZSBlbGVtZW50IGluIHRoZSBvYmplY3QgbWF0Y2hlcyBhIHRydXRoIHRlc3QuXG4gIC8vIEFsaWFzZWQgYXMgYGFueWAuXG4gIF8uc29tZSA9IF8uYW55ID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICBwcmVkaWNhdGUgPSBjYihwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYgXy5rZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IChrZXlzIHx8IG9iaikubGVuZ3RoO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICBpZiAocHJlZGljYXRlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvLyBEZXRlcm1pbmUgaWYgdGhlIGFycmF5IG9yIG9iamVjdCBjb250YWlucyBhIGdpdmVuIGl0ZW0gKHVzaW5nIGA9PT1gKS5cbiAgLy8gQWxpYXNlZCBhcyBgaW5jbHVkZXNgIGFuZCBgaW5jbHVkZWAuXG4gIF8uY29udGFpbnMgPSBfLmluY2x1ZGVzID0gXy5pbmNsdWRlID0gZnVuY3Rpb24ob2JqLCBpdGVtLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgaWYgKCFpc0FycmF5TGlrZShvYmopKSBvYmogPSBfLnZhbHVlcyhvYmopO1xuICAgIGlmICh0eXBlb2YgZnJvbUluZGV4ICE9ICdudW1iZXInIHx8IGd1YXJkKSBmcm9tSW5kZXggPSAwO1xuICAgIHJldHVybiBfLmluZGV4T2Yob2JqLCBpdGVtLCBmcm9tSW5kZXgpID49IDA7XG4gIH07XG5cbiAgLy8gSW52b2tlIGEgbWV0aG9kICh3aXRoIGFyZ3VtZW50cykgb24gZXZlcnkgaXRlbSBpbiBhIGNvbGxlY3Rpb24uXG4gIF8uaW52b2tlID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihvYmosIHBhdGgsIGFyZ3MpIHtcbiAgICB2YXIgY29udGV4dFBhdGgsIGZ1bmM7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXRoKSkge1xuICAgICAgZnVuYyA9IHBhdGg7XG4gICAgfSBlbHNlIGlmIChfLmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIGNvbnRleHRQYXRoID0gcGF0aC5zbGljZSgwLCAtMSk7XG4gICAgICBwYXRoID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICByZXR1cm4gXy5tYXAob2JqLCBmdW5jdGlvbihjb250ZXh0KSB7XG4gICAgICB2YXIgbWV0aG9kID0gZnVuYztcbiAgICAgIGlmICghbWV0aG9kKSB7XG4gICAgICAgIGlmIChjb250ZXh0UGF0aCAmJiBjb250ZXh0UGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICBjb250ZXh0ID0gZGVlcEdldChjb250ZXh0LCBjb250ZXh0UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgbWV0aG9kID0gY29udGV4dFtwYXRoXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2QgPT0gbnVsbCA/IG1ldGhvZCA6IG1ldGhvZC5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gQ29udmVuaWVuY2UgdmVyc2lvbiBvZiBhIGNvbW1vbiB1c2UgY2FzZSBvZiBgbWFwYDogZmV0Y2hpbmcgYSBwcm9wZXJ0eS5cbiAgXy5wbHVjayA9IGZ1bmN0aW9uKG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIF8ubWFwKG9iaiwgXy5wcm9wZXJ0eShrZXkpKTtcbiAgfTtcblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBmaWx0ZXJgOiBzZWxlY3Rpbmcgb25seSBvYmplY3RzXG4gIC8vIGNvbnRhaW5pbmcgc3BlY2lmaWMgYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8ud2hlcmUgPSBmdW5jdGlvbihvYmosIGF0dHJzKSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKG9iaiwgXy5tYXRjaGVyKGF0dHJzKSk7XG4gIH07XG5cbiAgLy8gQ29udmVuaWVuY2UgdmVyc2lvbiBvZiBhIGNvbW1vbiB1c2UgY2FzZSBvZiBgZmluZGA6IGdldHRpbmcgdGhlIGZpcnN0IG9iamVjdFxuICAvLyBjb250YWluaW5nIHNwZWNpZmljIGBrZXk6dmFsdWVgIHBhaXJzLlxuICBfLmZpbmRXaGVyZSA9IGZ1bmN0aW9uKG9iaiwgYXR0cnMpIHtcbiAgICByZXR1cm4gXy5maW5kKG9iaiwgXy5tYXRjaGVyKGF0dHJzKSk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBtYXhpbXVtIGVsZW1lbnQgKG9yIGVsZW1lbnQtYmFzZWQgY29tcHV0YXRpb24pLlxuICBfLm1heCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0ID0gLUluZmluaXR5LCBsYXN0Q29tcHV0ZWQgPSAtSW5maW5pdHksXG4gICAgICAgIHZhbHVlLCBjb21wdXRlZDtcbiAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCB8fCB0eXBlb2YgaXRlcmF0ZWUgPT0gJ251bWJlcicgJiYgdHlwZW9mIG9ialswXSAhPSAnb2JqZWN0JyAmJiBvYmogIT0gbnVsbCkge1xuICAgICAgb2JqID0gaXNBcnJheUxpa2Uob2JqKSA/IG9iaiA6IF8udmFsdWVzKG9iaik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gb2JqLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gb2JqW2ldO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA+IHJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odiwgaW5kZXgsIGxpc3QpIHtcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSh2LCBpbmRleCwgbGlzdCk7XG4gICAgICAgIGlmIChjb21wdXRlZCA+IGxhc3RDb21wdXRlZCB8fCBjb21wdXRlZCA9PT0gLUluZmluaXR5ICYmIHJlc3VsdCA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmVzdWx0ID0gdjtcbiAgICAgICAgICBsYXN0Q29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgKG9yIGVsZW1lbnQtYmFzZWQgY29tcHV0YXRpb24pLlxuICBfLm1pbiA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0ID0gSW5maW5pdHksIGxhc3RDb21wdXRlZCA9IEluZmluaXR5LFxuICAgICAgICB2YWx1ZSwgY29tcHV0ZWQ7XG4gICAgaWYgKGl0ZXJhdGVlID09IG51bGwgfHwgdHlwZW9mIGl0ZXJhdGVlID09ICdudW1iZXInICYmIHR5cGVvZiBvYmpbMF0gIT0gJ29iamVjdCcgJiYgb2JqICE9IG51bGwpIHtcbiAgICAgIG9iaiA9IGlzQXJyYXlMaWtlKG9iaikgPyBvYmogOiBfLnZhbHVlcyhvYmopO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IG9ialtpXTtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgPCByZXN1bHQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHYsIGluZGV4LCBsaXN0KSB7XG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodiwgaW5kZXgsIGxpc3QpO1xuICAgICAgICBpZiAoY29tcHV0ZWQgPCBsYXN0Q29tcHV0ZWQgfHwgY29tcHV0ZWQgPT09IEluZmluaXR5ICYmIHJlc3VsdCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXN1bHQgPSB2O1xuICAgICAgICAgIGxhc3RDb21wdXRlZCA9IGNvbXB1dGVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBTaHVmZmxlIGEgY29sbGVjdGlvbi5cbiAgXy5zaHVmZmxlID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIF8uc2FtcGxlKG9iaiwgSW5maW5pdHkpO1xuICB9O1xuXG4gIC8vIFNhbXBsZSAqKm4qKiByYW5kb20gdmFsdWVzIGZyb20gYSBjb2xsZWN0aW9uIHVzaW5nIHRoZSBtb2Rlcm4gdmVyc2lvbiBvZiB0aGVcbiAgLy8gW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlcuKAk1lhdGVzX3NodWZmbGUpLlxuICAvLyBJZiAqKm4qKiBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIGEgc2luZ2xlIHJhbmRvbSBlbGVtZW50LlxuICAvLyBUaGUgaW50ZXJuYWwgYGd1YXJkYCBhcmd1bWVudCBhbGxvd3MgaXQgdG8gd29yayB3aXRoIGBtYXBgLlxuICBfLnNhbXBsZSA9IGZ1bmN0aW9uKG9iaiwgbiwgZ3VhcmQpIHtcbiAgICBpZiAobiA9PSBudWxsIHx8IGd1YXJkKSB7XG4gICAgICBpZiAoIWlzQXJyYXlMaWtlKG9iaikpIG9iaiA9IF8udmFsdWVzKG9iaik7XG4gICAgICByZXR1cm4gb2JqW18ucmFuZG9tKG9iai5sZW5ndGggLSAxKV07XG4gICAgfVxuICAgIHZhciBzYW1wbGUgPSBpc0FycmF5TGlrZShvYmopID8gXy5jbG9uZShvYmopIDogXy52YWx1ZXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0gZ2V0TGVuZ3RoKHNhbXBsZSk7XG4gICAgbiA9IE1hdGgubWF4KE1hdGgubWluKG4sIGxlbmd0aCksIDApO1xuICAgIHZhciBsYXN0ID0gbGVuZ3RoIC0gMTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbjsgaW5kZXgrKykge1xuICAgICAgdmFyIHJhbmQgPSBfLnJhbmRvbShpbmRleCwgbGFzdCk7XG4gICAgICB2YXIgdGVtcCA9IHNhbXBsZVtpbmRleF07XG4gICAgICBzYW1wbGVbaW5kZXhdID0gc2FtcGxlW3JhbmRdO1xuICAgICAgc2FtcGxlW3JhbmRdID0gdGVtcDtcbiAgICB9XG4gICAgcmV0dXJuIHNhbXBsZS5zbGljZSgwLCBuKTtcbiAgfTtcblxuICAvLyBTb3J0IHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24gcHJvZHVjZWQgYnkgYW4gaXRlcmF0ZWUuXG4gIF8uc29ydEJ5ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgcmV0dXJuIF8ucGx1Y2soXy5tYXAob2JqLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBsaXN0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGluZGV4OiBpbmRleCsrLFxuICAgICAgICBjcml0ZXJpYTogaXRlcmF0ZWUodmFsdWUsIGtleSwgbGlzdClcbiAgICAgIH07XG4gICAgfSkuc29ydChmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhO1xuICAgICAgdmFyIGIgPSByaWdodC5jcml0ZXJpYTtcbiAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgIGlmIChhID4gYiB8fCBhID09PSB2b2lkIDApIHJldHVybiAxO1xuICAgICAgICBpZiAoYSA8IGIgfHwgYiA9PT0gdm9pZCAwKSByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVmdC5pbmRleCAtIHJpZ2h0LmluZGV4O1xuICAgIH0pLCAndmFsdWUnKTtcbiAgfTtcblxuICAvLyBBbiBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGZvciBhZ2dyZWdhdGUgXCJncm91cCBieVwiIG9wZXJhdGlvbnMuXG4gIHZhciBncm91cCA9IGZ1bmN0aW9uKGJlaGF2aW9yLCBwYXJ0aXRpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHBhcnRpdGlvbiA/IFtbXSwgW11dIDoge307XG4gICAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICB2YXIga2V5ID0gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBvYmopO1xuICAgICAgICBiZWhhdmlvcihyZXN1bHQsIHZhbHVlLCBrZXkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH07XG5cbiAgLy8gR3JvdXBzIHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24uIFBhc3MgZWl0aGVyIGEgc3RyaW5nIGF0dHJpYnV0ZVxuICAvLyB0byBncm91cCBieSwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNyaXRlcmlvbi5cbiAgXy5ncm91cEJ5ID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgaWYgKGhhcyhyZXN1bHQsIGtleSkpIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOyBlbHNlIHJlc3VsdFtrZXldID0gW3ZhbHVlXTtcbiAgfSk7XG5cbiAgLy8gSW5kZXhlcyB0aGUgb2JqZWN0J3MgdmFsdWVzIGJ5IGEgY3JpdGVyaW9uLCBzaW1pbGFyIHRvIGBncm91cEJ5YCwgYnV0IGZvclxuICAvLyB3aGVuIHlvdSBrbm93IHRoYXQgeW91ciBpbmRleCB2YWx1ZXMgd2lsbCBiZSB1bmlxdWUuXG4gIF8uaW5kZXhCeSA9IGdyb3VwKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gIH0pO1xuXG4gIC8vIENvdW50cyBpbnN0YW5jZXMgb2YgYW4gb2JqZWN0IHRoYXQgZ3JvdXAgYnkgYSBjZXJ0YWluIGNyaXRlcmlvbi4gUGFzc1xuICAvLyBlaXRoZXIgYSBzdHJpbmcgYXR0cmlidXRlIHRvIGNvdW50IGJ5LCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGVcbiAgLy8gY3JpdGVyaW9uLlxuICBfLmNvdW50QnkgPSBncm91cChmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICBpZiAoaGFzKHJlc3VsdCwga2V5KSkgcmVzdWx0W2tleV0rKzsgZWxzZSByZXN1bHRba2V5XSA9IDE7XG4gIH0pO1xuXG4gIHZhciByZVN0clN5bWJvbCA9IC9bXlxcdWQ4MDAtXFx1ZGZmZl18W1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXXxbXFx1ZDgwMC1cXHVkZmZmXS9nO1xuICAvLyBTYWZlbHkgY3JlYXRlIGEgcmVhbCwgbGl2ZSBhcnJheSBmcm9tIGFueXRoaW5nIGl0ZXJhYmxlLlxuICBfLnRvQXJyYXkgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIW9iaikgcmV0dXJuIFtdO1xuICAgIGlmIChfLmlzQXJyYXkob2JqKSkgcmV0dXJuIHNsaWNlLmNhbGwob2JqKTtcbiAgICBpZiAoXy5pc1N0cmluZyhvYmopKSB7XG4gICAgICAvLyBLZWVwIHN1cnJvZ2F0ZSBwYWlyIGNoYXJhY3RlcnMgdG9nZXRoZXJcbiAgICAgIHJldHVybiBvYmoubWF0Y2gocmVTdHJTeW1ib2wpO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheUxpa2Uob2JqKSkgcmV0dXJuIF8ubWFwKG9iaiwgXy5pZGVudGl0eSk7XG4gICAgcmV0dXJuIF8udmFsdWVzKG9iaik7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gb2JqZWN0LlxuICBfLnNpemUgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiAwO1xuICAgIHJldHVybiBpc0FycmF5TGlrZShvYmopID8gb2JqLmxlbmd0aCA6IF8ua2V5cyhvYmopLmxlbmd0aDtcbiAgfTtcblxuICAvLyBTcGxpdCBhIGNvbGxlY3Rpb24gaW50byB0d28gYXJyYXlzOiBvbmUgd2hvc2UgZWxlbWVudHMgYWxsIHNhdGlzZnkgdGhlIGdpdmVuXG4gIC8vIHByZWRpY2F0ZSwgYW5kIG9uZSB3aG9zZSBlbGVtZW50cyBhbGwgZG8gbm90IHNhdGlzZnkgdGhlIHByZWRpY2F0ZS5cbiAgXy5wYXJ0aXRpb24gPSBncm91cChmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBwYXNzKSB7XG4gICAgcmVzdWx0W3Bhc3MgPyAwIDogMV0ucHVzaCh2YWx1ZSk7XG4gIH0sIHRydWUpO1xuXG4gIC8vIEFycmF5IEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS1cblxuICAvLyBHZXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYW4gYXJyYXkuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gdGhlIGZpcnN0IE5cbiAgLy8gdmFsdWVzIGluIHRoZSBhcnJheS4gQWxpYXNlZCBhcyBgaGVhZGAgYW5kIGB0YWtlYC4gVGhlICoqZ3VhcmQqKiBjaGVja1xuICAvLyBhbGxvd3MgaXQgdG8gd29yayB3aXRoIGBfLm1hcGAuXG4gIF8uZmlyc3QgPSBfLmhlYWQgPSBfLnRha2UgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICBpZiAoYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggPCAxKSByZXR1cm4gbiA9PSBudWxsID8gdm9pZCAwIDogW107XG4gICAgaWYgKG4gPT0gbnVsbCB8fCBndWFyZCkgcmV0dXJuIGFycmF5WzBdO1xuICAgIHJldHVybiBfLmluaXRpYWwoYXJyYXksIGFycmF5Lmxlbmd0aCAtIG4pO1xuICB9O1xuXG4gIC8vIFJldHVybnMgZXZlcnl0aGluZyBidXQgdGhlIGxhc3QgZW50cnkgb2YgdGhlIGFycmF5LiBFc3BlY2lhbGx5IHVzZWZ1bCBvblxuICAvLyB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyAqKm4qKiB3aWxsIHJldHVybiBhbGwgdGhlIHZhbHVlcyBpblxuICAvLyB0aGUgYXJyYXksIGV4Y2x1ZGluZyB0aGUgbGFzdCBOLlxuICBfLmluaXRpYWwgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICByZXR1cm4gc2xpY2UuY2FsbChhcnJheSwgMCwgTWF0aC5tYXgoMCwgYXJyYXkubGVuZ3RoIC0gKG4gPT0gbnVsbCB8fCBndWFyZCA/IDEgOiBuKSkpO1xuICB9O1xuXG4gIC8vIEdldCB0aGUgbGFzdCBlbGVtZW50IG9mIGFuIGFycmF5LiBQYXNzaW5nICoqbioqIHdpbGwgcmV0dXJuIHRoZSBsYXN0IE5cbiAgLy8gdmFsdWVzIGluIHRoZSBhcnJheS5cbiAgXy5sYXN0ID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgaWYgKGFycmF5ID09IG51bGwgfHwgYXJyYXkubGVuZ3RoIDwgMSkgcmV0dXJuIG4gPT0gbnVsbCA/IHZvaWQgMCA6IFtdO1xuICAgIGlmIChuID09IG51bGwgfHwgZ3VhcmQpIHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gXy5yZXN0KGFycmF5LCBNYXRoLm1heCgwLCBhcnJheS5sZW5ndGggLSBuKSk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIGFycmF5LiBBbGlhc2VkIGFzIGB0YWlsYCBhbmQgYGRyb3BgLlxuICAvLyBFc3BlY2lhbGx5IHVzZWZ1bCBvbiB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyBhbiAqKm4qKiB3aWxsIHJldHVyblxuICAvLyB0aGUgcmVzdCBOIHZhbHVlcyBpbiB0aGUgYXJyYXkuXG4gIF8ucmVzdCA9IF8udGFpbCA9IF8uZHJvcCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkge1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCBuID09IG51bGwgfHwgZ3VhcmQgPyAxIDogbik7XG4gIH07XG5cbiAgLy8gVHJpbSBvdXQgYWxsIGZhbHN5IHZhbHVlcyBmcm9tIGFuIGFycmF5LlxuICBfLmNvbXBhY3QgPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHJldHVybiBfLmZpbHRlcihhcnJheSwgQm9vbGVhbik7XG4gIH07XG5cbiAgLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgYSByZWN1cnNpdmUgYGZsYXR0ZW5gIGZ1bmN0aW9uLlxuICB2YXIgZmxhdHRlbiA9IGZ1bmN0aW9uKGlucHV0LCBzaGFsbG93LCBzdHJpY3QsIG91dHB1dCkge1xuICAgIG91dHB1dCA9IG91dHB1dCB8fCBbXTtcbiAgICB2YXIgaWR4ID0gb3V0cHV0Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGlucHV0KTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiYgKF8uaXNBcnJheSh2YWx1ZSkgfHwgXy5pc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgICAgIC8vIEZsYXR0ZW4gY3VycmVudCBsZXZlbCBvZiBhcnJheSBvciBhcmd1bWVudHMgb2JqZWN0LlxuICAgICAgICBpZiAoc2hhbGxvdykge1xuICAgICAgICAgIHZhciBqID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChqIDwgbGVuKSBvdXRwdXRbaWR4KytdID0gdmFsdWVbaisrXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBzaGFsbG93LCBzdHJpY3QsIG91dHB1dCk7XG4gICAgICAgICAgaWR4ID0gb3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghc3RyaWN0KSB7XG4gICAgICAgIG91dHB1dFtpZHgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICAvLyBGbGF0dGVuIG91dCBhbiBhcnJheSwgZWl0aGVyIHJlY3Vyc2l2ZWx5IChieSBkZWZhdWx0KSwgb3IganVzdCBvbmUgbGV2ZWwuXG4gIF8uZmxhdHRlbiA9IGZ1bmN0aW9uKGFycmF5LCBzaGFsbG93KSB7XG4gICAgcmV0dXJuIGZsYXR0ZW4oYXJyYXksIHNoYWxsb3csIGZhbHNlKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoZSBhcnJheSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCB2YWx1ZShzKS5cbiAgXy53aXRob3V0ID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihhcnJheSwgb3RoZXJBcnJheXMpIHtcbiAgICByZXR1cm4gXy5kaWZmZXJlbmNlKGFycmF5LCBvdGhlckFycmF5cyk7XG4gIH0pO1xuXG4gIC8vIFByb2R1Y2UgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIHRoZSBhcnJheS4gSWYgdGhlIGFycmF5IGhhcyBhbHJlYWR5XG4gIC8vIGJlZW4gc29ydGVkLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIGEgZmFzdGVyIGFsZ29yaXRobS5cbiAgLy8gVGhlIGZhc3RlciBhbGdvcml0aG0gd2lsbCBub3Qgd29yayB3aXRoIGFuIGl0ZXJhdGVlIGlmIHRoZSBpdGVyYXRlZVxuICAvLyBpcyBub3QgYSBvbmUtdG8tb25lIGZ1bmN0aW9uLCBzbyBwcm92aWRpbmcgYW4gaXRlcmF0ZWUgd2lsbCBkaXNhYmxlXG4gIC8vIHRoZSBmYXN0ZXIgYWxnb3JpdGhtLlxuICAvLyBBbGlhc2VkIGFzIGB1bmlxdWVgLlxuICBfLnVuaXEgPSBfLnVuaXF1ZSA9IGZ1bmN0aW9uKGFycmF5LCBpc1NvcnRlZCwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKGlzU29ydGVkKSkge1xuICAgICAgY29udGV4dCA9IGl0ZXJhdGVlO1xuICAgICAgaXRlcmF0ZWUgPSBpc1NvcnRlZDtcbiAgICAgIGlzU29ydGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpdGVyYXRlZSAhPSBudWxsKSBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIHNlZW4gPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGFycmF5KTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpXSxcbiAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUsIGksIGFycmF5KSA6IHZhbHVlO1xuICAgICAgaWYgKGlzU29ydGVkICYmICFpdGVyYXRlZSkge1xuICAgICAgICBpZiAoIWkgfHwgc2VlbiAhPT0gY29tcHV0ZWQpIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgfSBlbHNlIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBpZiAoIV8uY29udGFpbnMoc2VlbiwgY29tcHV0ZWQpKSB7XG4gICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIV8uY29udGFpbnMocmVzdWx0LCB2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFByb2R1Y2UgYW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgdW5pb246IGVhY2ggZGlzdGluY3QgZWxlbWVudCBmcm9tIGFsbCBvZlxuICAvLyB0aGUgcGFzc2VkLWluIGFycmF5cy5cbiAgXy51bmlvbiA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgcmV0dXJuIF8udW5pcShmbGF0dGVuKGFycmF5cywgdHJ1ZSwgdHJ1ZSkpO1xuICB9KTtcblxuICAvLyBQcm9kdWNlIGFuIGFycmF5IHRoYXQgY29udGFpbnMgZXZlcnkgaXRlbSBzaGFyZWQgYmV0d2VlbiBhbGwgdGhlXG4gIC8vIHBhc3NlZC1pbiBhcnJheXMuXG4gIF8uaW50ZXJzZWN0aW9uID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gYXJyYXlbaV07XG4gICAgICBpZiAoXy5jb250YWlucyhyZXN1bHQsIGl0ZW0pKSBjb250aW51ZTtcbiAgICAgIHZhciBqO1xuICAgICAgZm9yIChqID0gMTsgaiA8IGFyZ3NMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoIV8uY29udGFpbnMoYXJndW1lbnRzW2pdLCBpdGVtKSkgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaiA9PT0gYXJnc0xlbmd0aCkgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gVGFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9uZSBhcnJheSBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgYXJyYXlzLlxuICAvLyBPbmx5IHRoZSBlbGVtZW50cyBwcmVzZW50IGluIGp1c3QgdGhlIGZpcnN0IGFycmF5IHdpbGwgcmVtYWluLlxuICBfLmRpZmZlcmVuY2UgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGFycmF5LCByZXN0KSB7XG4gICAgcmVzdCA9IGZsYXR0ZW4ocmVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIF8uZmlsdGVyKGFycmF5LCBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICByZXR1cm4gIV8uY29udGFpbnMocmVzdCwgdmFsdWUpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBDb21wbGVtZW50IG9mIF8uemlwLiBVbnppcCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyBhbmQgZ3JvdXBzXG4gIC8vIGVhY2ggYXJyYXkncyBlbGVtZW50cyBvbiBzaGFyZWQgaW5kaWNlcy5cbiAgXy51bnppcCA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ICYmIF8ubWF4KGFycmF5LCBnZXRMZW5ndGgpLmxlbmd0aCB8fCAwO1xuICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IF8ucGx1Y2soYXJyYXksIGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBaaXAgdG9nZXRoZXIgbXVsdGlwbGUgbGlzdHMgaW50byBhIHNpbmdsZSBhcnJheSAtLSBlbGVtZW50cyB0aGF0IHNoYXJlXG4gIC8vIGFuIGluZGV4IGdvIHRvZ2V0aGVyLlxuICBfLnppcCA9IHJlc3RBcmd1bWVudHMoXy51bnppcCk7XG5cbiAgLy8gQ29udmVydHMgbGlzdHMgaW50byBvYmplY3RzLiBQYXNzIGVpdGhlciBhIHNpbmdsZSBhcnJheSBvZiBgW2tleSwgdmFsdWVdYFxuICAvLyBwYWlycywgb3IgdHdvIHBhcmFsbGVsIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGggLS0gb25lIG9mIGtleXMsIGFuZCBvbmUgb2ZcbiAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiBQYXNzaW5nIGJ5IHBhaXJzIGlzIHRoZSByZXZlcnNlIG9mIF8ucGFpcnMuXG4gIF8ub2JqZWN0ID0gZnVuY3Rpb24obGlzdCwgdmFsdWVzKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgobGlzdCk7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICByZXN1bHRbbGlzdFtpXV0gPSB2YWx1ZXNbaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbbGlzdFtpXVswXV0gPSBsaXN0W2ldWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIEdlbmVyYXRvciBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGZpbmRJbmRleCBhbmQgZmluZExhc3RJbmRleCBmdW5jdGlvbnMuXG4gIHZhciBjcmVhdGVQcmVkaWNhdGVJbmRleEZpbmRlciA9IGZ1bmN0aW9uKGRpcikge1xuICAgIHJldHVybiBmdW5jdGlvbihhcnJheSwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICBwcmVkaWNhdGUgPSBjYihwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgICAgdmFyIGxlbmd0aCA9IGdldExlbmd0aChhcnJheSk7XG4gICAgICB2YXIgaW5kZXggPSBkaXIgPiAwID8gMCA6IGxlbmd0aCAtIDE7XG4gICAgICBmb3IgKDsgaW5kZXggPj0gMCAmJiBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gZGlyKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIHRoZSBmaXJzdCBpbmRleCBvbiBhbiBhcnJheS1saWtlIHRoYXQgcGFzc2VzIGEgcHJlZGljYXRlIHRlc3QuXG4gIF8uZmluZEluZGV4ID0gY3JlYXRlUHJlZGljYXRlSW5kZXhGaW5kZXIoMSk7XG4gIF8uZmluZExhc3RJbmRleCA9IGNyZWF0ZVByZWRpY2F0ZUluZGV4RmluZGVyKC0xKTtcblxuICAvLyBVc2UgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlIHNtYWxsZXN0IGluZGV4IGF0IHdoaWNoXG4gIC8vIGFuIG9iamVjdCBzaG91bGQgYmUgaW5zZXJ0ZWQgc28gYXMgdG8gbWFpbnRhaW4gb3JkZXIuIFVzZXMgYmluYXJ5IHNlYXJjaC5cbiAgXy5zb3J0ZWRJbmRleCA9IGZ1bmN0aW9uKGFycmF5LCBvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCwgMSk7XG4gICAgdmFyIHZhbHVlID0gaXRlcmF0ZWUob2JqKTtcbiAgICB2YXIgbG93ID0gMCwgaGlnaCA9IGdldExlbmd0aChhcnJheSk7XG4gICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgIHZhciBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W21pZF0pIDwgdmFsdWUpIGxvdyA9IG1pZCArIDE7IGVsc2UgaGlnaCA9IG1pZDtcbiAgICB9XG4gICAgcmV0dXJuIGxvdztcbiAgfTtcblxuICAvLyBHZW5lcmF0b3IgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBpbmRleE9mIGFuZCBsYXN0SW5kZXhPZiBmdW5jdGlvbnMuXG4gIHZhciBjcmVhdGVJbmRleEZpbmRlciA9IGZ1bmN0aW9uKGRpciwgcHJlZGljYXRlRmluZCwgc29ydGVkSW5kZXgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGlkeCkge1xuICAgICAgdmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpO1xuICAgICAgaWYgKHR5cGVvZiBpZHggPT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGRpciA+IDApIHtcbiAgICAgICAgICBpID0gaWR4ID49IDAgPyBpZHggOiBNYXRoLm1heChpZHggKyBsZW5ndGgsIGkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxlbmd0aCA9IGlkeCA+PSAwID8gTWF0aC5taW4oaWR4ICsgMSwgbGVuZ3RoKSA6IGlkeCArIGxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc29ydGVkSW5kZXggJiYgaWR4ICYmIGxlbmd0aCkge1xuICAgICAgICBpZHggPSBzb3J0ZWRJbmRleChhcnJheSwgaXRlbSk7XG4gICAgICAgIHJldHVybiBhcnJheVtpZHhdID09PSBpdGVtID8gaWR4IDogLTE7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbSAhPT0gaXRlbSkge1xuICAgICAgICBpZHggPSBwcmVkaWNhdGVGaW5kKHNsaWNlLmNhbGwoYXJyYXksIGksIGxlbmd0aCksIF8uaXNOYU4pO1xuICAgICAgICByZXR1cm4gaWR4ID49IDAgPyBpZHggKyBpIDogLTE7XG4gICAgICB9XG4gICAgICBmb3IgKGlkeCA9IGRpciA+IDAgPyBpIDogbGVuZ3RoIC0gMTsgaWR4ID49IDAgJiYgaWR4IDwgbGVuZ3RoOyBpZHggKz0gZGlyKSB7XG4gICAgICAgIGlmIChhcnJheVtpZHhdID09PSBpdGVtKSByZXR1cm4gaWR4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbiBpdGVtIGluIGFuIGFycmF5LFxuICAvLyBvciAtMSBpZiB0aGUgaXRlbSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGFycmF5LlxuICAvLyBJZiB0aGUgYXJyYXkgaXMgbGFyZ2UgYW5kIGFscmVhZHkgaW4gc29ydCBvcmRlciwgcGFzcyBgdHJ1ZWBcbiAgLy8gZm9yICoqaXNTb3J0ZWQqKiB0byB1c2UgYmluYXJ5IHNlYXJjaC5cbiAgXy5pbmRleE9mID0gY3JlYXRlSW5kZXhGaW5kZXIoMSwgXy5maW5kSW5kZXgsIF8uc29ydGVkSW5kZXgpO1xuICBfLmxhc3RJbmRleE9mID0gY3JlYXRlSW5kZXhGaW5kZXIoLTEsIF8uZmluZExhc3RJbmRleCk7XG5cbiAgLy8gR2VuZXJhdGUgYW4gaW50ZWdlciBBcnJheSBjb250YWluaW5nIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24uIEEgcG9ydCBvZlxuICAvLyB0aGUgbmF0aXZlIFB5dGhvbiBgcmFuZ2UoKWAgZnVuY3Rpb24uIFNlZVxuICAvLyBbdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uXShodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvZnVuY3Rpb25zLmh0bWwjcmFuZ2UpLlxuICBfLnJhbmdlID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgICBpZiAoc3RvcCA9PSBudWxsKSB7XG4gICAgICBzdG9wID0gc3RhcnQgfHwgMDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgaWYgKCFzdGVwKSB7XG4gICAgICBzdGVwID0gc3RvcCA8IHN0YXJ0ID8gLTEgOiAxO1xuICAgIH1cblxuICAgIHZhciBsZW5ndGggPSBNYXRoLm1heChNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSwgMCk7XG4gICAgdmFyIHJhbmdlID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyssIHN0YXJ0ICs9IHN0ZXApIHtcbiAgICAgIHJhbmdlW2lkeF0gPSBzdGFydDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmFuZ2U7XG4gIH07XG5cbiAgLy8gQ2h1bmsgYSBzaW5nbGUgYXJyYXkgaW50byBtdWx0aXBsZSBhcnJheXMsIGVhY2ggY29udGFpbmluZyBgY291bnRgIG9yIGZld2VyXG4gIC8vIGl0ZW1zLlxuICBfLmNodW5rID0gZnVuY3Rpb24oYXJyYXksIGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09IG51bGwgfHwgY291bnQgPCAxKSByZXR1cm4gW107XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHQucHVzaChzbGljZS5jYWxsKGFycmF5LCBpLCBpICs9IGNvdW50KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gRnVuY3Rpb24gKGFoZW0pIEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIGFzIGEgY29uc3RydWN0b3JcbiAgLy8gb3IgYSBub3JtYWwgZnVuY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICB2YXIgZXhlY3V0ZUJvdW5kID0gZnVuY3Rpb24oc291cmNlRnVuYywgYm91bmRGdW5jLCBjb250ZXh0LCBjYWxsaW5nQ29udGV4dCwgYXJncykge1xuICAgIGlmICghKGNhbGxpbmdDb250ZXh0IGluc3RhbmNlb2YgYm91bmRGdW5jKSkgcmV0dXJuIHNvdXJjZUZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgdmFyIHNlbGYgPSBiYXNlQ3JlYXRlKHNvdXJjZUZ1bmMucHJvdG90eXBlKTtcbiAgICB2YXIgcmVzdWx0ID0gc291cmNlRnVuYy5hcHBseShzZWxmLCBhcmdzKTtcbiAgICBpZiAoXy5pc09iamVjdChyZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIGJvdW5kIHRvIGEgZ2l2ZW4gb2JqZWN0IChhc3NpZ25pbmcgYHRoaXNgLCBhbmQgYXJndW1lbnRzLFxuICAvLyBvcHRpb25hbGx5KS4gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYEZ1bmN0aW9uLmJpbmRgIGlmXG4gIC8vIGF2YWlsYWJsZS5cbiAgXy5iaW5kID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihmdW5jLCBjb250ZXh0LCBhcmdzKSB7XG4gICAgaWYgKCFfLmlzRnVuY3Rpb24oZnVuYykpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JpbmQgbXVzdCBiZSBjYWxsZWQgb24gYSBmdW5jdGlvbicpO1xuICAgIHZhciBib3VuZCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oY2FsbEFyZ3MpIHtcbiAgICAgIHJldHVybiBleGVjdXRlQm91bmQoZnVuYywgYm91bmQsIGNvbnRleHQsIHRoaXMsIGFyZ3MuY29uY2F0KGNhbGxBcmdzKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGJvdW5kO1xuICB9KTtcblxuICAvLyBQYXJ0aWFsbHkgYXBwbHkgYSBmdW5jdGlvbiBieSBjcmVhdGluZyBhIHZlcnNpb24gdGhhdCBoYXMgaGFkIHNvbWUgb2YgaXRzXG4gIC8vIGFyZ3VtZW50cyBwcmUtZmlsbGVkLCB3aXRob3V0IGNoYW5naW5nIGl0cyBkeW5hbWljIGB0aGlzYCBjb250ZXh0LiBfIGFjdHNcbiAgLy8gYXMgYSBwbGFjZWhvbGRlciBieSBkZWZhdWx0LCBhbGxvd2luZyBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzIHRvIGJlXG4gIC8vIHByZS1maWxsZWQuIFNldCBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCBmb3IgYSBjdXN0b20gcGxhY2Vob2xkZXIgYXJndW1lbnQuXG4gIF8ucGFydGlhbCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oZnVuYywgYm91bmRBcmdzKSB7XG4gICAgdmFyIHBsYWNlaG9sZGVyID0gXy5wYXJ0aWFsLnBsYWNlaG9sZGVyO1xuICAgIHZhciBib3VuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBvc2l0aW9uID0gMCwgbGVuZ3RoID0gYm91bmRBcmdzLmxlbmd0aDtcbiAgICAgIHZhciBhcmdzID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJnc1tpXSA9IGJvdW5kQXJnc1tpXSA9PT0gcGxhY2Vob2xkZXIgPyBhcmd1bWVudHNbcG9zaXRpb24rK10gOiBib3VuZEFyZ3NbaV07XG4gICAgICB9XG4gICAgICB3aGlsZSAocG9zaXRpb24gPCBhcmd1bWVudHMubGVuZ3RoKSBhcmdzLnB1c2goYXJndW1lbnRzW3Bvc2l0aW9uKytdKTtcbiAgICAgIHJldHVybiBleGVjdXRlQm91bmQoZnVuYywgYm91bmQsIHRoaXMsIHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gICAgcmV0dXJuIGJvdW5kO1xuICB9KTtcblxuICBfLnBhcnRpYWwucGxhY2Vob2xkZXIgPSBfO1xuXG4gIC8vIEJpbmQgYSBudW1iZXIgb2YgYW4gb2JqZWN0J3MgbWV0aG9kcyB0byB0aGF0IG9iamVjdC4gUmVtYWluaW5nIGFyZ3VtZW50c1xuICAvLyBhcmUgdGhlIG1ldGhvZCBuYW1lcyB0byBiZSBib3VuZC4gVXNlZnVsIGZvciBlbnN1cmluZyB0aGF0IGFsbCBjYWxsYmFja3NcbiAgLy8gZGVmaW5lZCBvbiBhbiBvYmplY3QgYmVsb25nIHRvIGl0LlxuICBfLmJpbmRBbGwgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKG9iaiwga2V5cykge1xuICAgIGtleXMgPSBmbGF0dGVuKGtleXMsIGZhbHNlLCBmYWxzZSk7XG4gICAgdmFyIGluZGV4ID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGluZGV4IDwgMSkgdGhyb3cgbmV3IEVycm9yKCdiaW5kQWxsIG11c3QgYmUgcGFzc2VkIGZ1bmN0aW9uIG5hbWVzJyk7XG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2luZGV4XTtcbiAgICAgIG9ialtrZXldID0gXy5iaW5kKG9ialtrZXldLCBvYmopO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTWVtb2l6ZSBhbiBleHBlbnNpdmUgZnVuY3Rpb24gYnkgc3RvcmluZyBpdHMgcmVzdWx0cy5cbiAgXy5tZW1vaXplID0gZnVuY3Rpb24oZnVuYywgaGFzaGVyKSB7XG4gICAgdmFyIG1lbW9pemUgPSBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHZhciBjYWNoZSA9IG1lbW9pemUuY2FjaGU7XG4gICAgICB2YXIgYWRkcmVzcyA9ICcnICsgKGhhc2hlciA/IGhhc2hlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDoga2V5KTtcbiAgICAgIGlmICghaGFzKGNhY2hlLCBhZGRyZXNzKSkgY2FjaGVbYWRkcmVzc10gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gY2FjaGVbYWRkcmVzc107XG4gICAgfTtcbiAgICBtZW1vaXplLmNhY2hlID0ge307XG4gICAgcmV0dXJuIG1lbW9pemU7XG4gIH07XG5cbiAgLy8gRGVsYXlzIGEgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCBhbmQgdGhlbiBjYWxsc1xuICAvLyBpdCB3aXRoIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQuXG4gIF8uZGVsYXkgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0sIHdhaXQpO1xuICB9KTtcblxuICAvLyBEZWZlcnMgYSBmdW5jdGlvbiwgc2NoZWR1bGluZyBpdCB0byBydW4gYWZ0ZXIgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXNcbiAgLy8gY2xlYXJlZC5cbiAgXy5kZWZlciA9IF8ucGFydGlhbChfLmRlbGF5LCBfLCAxKTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIHdoZW4gaW52b2tlZCwgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBhdCBtb3N0IG9uY2VcbiAgLy8gZHVyaW5nIGEgZ2l2ZW4gd2luZG93IG9mIHRpbWUuIE5vcm1hbGx5LCB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHdpbGwgcnVuXG4gIC8vIGFzIG11Y2ggYXMgaXQgY2FuLCB3aXRob3V0IGV2ZXIgZ29pbmcgbW9yZSB0aGFuIG9uY2UgcGVyIGB3YWl0YCBkdXJhdGlvbjtcbiAgLy8gYnV0IGlmIHlvdSdkIGxpa2UgdG8gZGlzYWJsZSB0aGUgZXhlY3V0aW9uIG9uIHRoZSBsZWFkaW5nIGVkZ2UsIHBhc3NcbiAgLy8gYHtsZWFkaW5nOiBmYWxzZX1gLiBUbyBkaXNhYmxlIGV4ZWN1dGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSwgZGl0dG8uXG4gIF8udGhyb3R0bGUgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgdmFyIHRpbWVvdXQsIGNvbnRleHQsIGFyZ3MsIHJlc3VsdDtcbiAgICB2YXIgcHJldmlvdXMgPSAwO1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuXG4gICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogXy5ub3coKTtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgIH07XG5cbiAgICB2YXIgdGhyb3R0bGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbm93ID0gXy5ub3coKTtcbiAgICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgICBjb250ZXh0ID0gdGhpcztcbiAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gd2FpdCkge1xuICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCF0aW1lb3V0ICYmIG9wdGlvbnMudHJhaWxpbmcgIT09IGZhbHNlKSB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdGhyb3R0bGVkLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgcHJldmlvdXMgPSAwO1xuICAgICAgdGltZW91dCA9IGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRocm90dGxlZDtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gIC8vIGJlIHRyaWdnZXJlZC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3JcbiAgLy8gTiBtaWxsaXNlY29uZHMuIElmIGBpbW1lZGlhdGVgIGlzIHBhc3NlZCwgdHJpZ2dlciB0aGUgZnVuY3Rpb24gb24gdGhlXG4gIC8vIGxlYWRpbmcgZWRnZSwgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcuXG4gIF8uZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICB2YXIgdGltZW91dCwgcmVzdWx0O1xuXG4gICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oY29udGV4dCwgYXJncykge1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICBpZiAoYXJncykgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9O1xuXG4gICAgdmFyIGRlYm91bmNlZCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oYXJncykge1xuICAgICAgaWYgKHRpbWVvdXQpIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgICAgdmFyIGNhbGxOb3cgPSAhdGltZW91dDtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICBpZiAoY2FsbE5vdykgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpbWVvdXQgPSBfLmRlbGF5KGxhdGVyLCB3YWl0LCB0aGlzLCBhcmdzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIGRlYm91bmNlZC5jYW5jZWwgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVib3VuY2VkO1xuICB9O1xuXG4gIC8vIFJldHVybnMgdGhlIGZpcnN0IGZ1bmN0aW9uIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgc2Vjb25kLFxuICAvLyBhbGxvd2luZyB5b3UgdG8gYWRqdXN0IGFyZ3VtZW50cywgcnVuIGNvZGUgYmVmb3JlIGFuZCBhZnRlciwgYW5kXG4gIC8vIGNvbmRpdGlvbmFsbHkgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uXG4gIF8ud3JhcCA9IGZ1bmN0aW9uKGZ1bmMsIHdyYXBwZXIpIHtcbiAgICByZXR1cm4gXy5wYXJ0aWFsKHdyYXBwZXIsIGZ1bmMpO1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBuZWdhdGVkIHZlcnNpb24gb2YgdGhlIHBhc3NlZC1pbiBwcmVkaWNhdGUuXG4gIF8ubmVnYXRlID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICFwcmVkaWNhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBhIGxpc3Qgb2YgZnVuY3Rpb25zLCBlYWNoXG4gIC8vIGNvbnN1bWluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGZvbGxvd3MuXG4gIF8uY29tcG9zZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBzdGFydCA9IGFyZ3MubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaSA9IHN0YXJ0O1xuICAgICAgdmFyIHJlc3VsdCA9IGFyZ3Nbc3RhcnRdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB3aGlsZSAoaS0tKSByZXN1bHQgPSBhcmdzW2ldLmNhbGwodGhpcywgcmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgb24gYW5kIGFmdGVyIHRoZSBOdGggY2FsbC5cbiAgXy5hZnRlciA9IGZ1bmN0aW9uKHRpbWVzLCBmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGltZXMgPCAxKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGUgTnRoIGNhbGwuXG4gIF8uYmVmb3JlID0gZnVuY3Rpb24odGltZXMsIGZ1bmMpIHtcbiAgICB2YXIgbWVtbztcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aW1lcyA+IDApIHtcbiAgICAgICAgbWVtbyA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lcyA8PSAxKSBmdW5jID0gbnVsbDtcbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhdCBtb3N0IG9uZSB0aW1lLCBubyBtYXR0ZXIgaG93XG4gIC8vIG9mdGVuIHlvdSBjYWxsIGl0LiBVc2VmdWwgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24uXG4gIF8ub25jZSA9IF8ucGFydGlhbChfLmJlZm9yZSwgMik7XG5cbiAgXy5yZXN0QXJndW1lbnRzID0gcmVzdEFyZ3VtZW50cztcblxuICAvLyBPYmplY3QgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBLZXlzIGluIElFIDwgOSB0aGF0IHdvbid0IGJlIGl0ZXJhdGVkIGJ5IGBmb3Iga2V5IGluIC4uLmAgYW5kIHRodXMgbWlzc2VkLlxuICB2YXIgaGFzRW51bUJ1ZyA9ICF7dG9TdHJpbmc6IG51bGx9LnByb3BlcnR5SXNFbnVtZXJhYmxlKCd0b1N0cmluZycpO1xuICB2YXIgbm9uRW51bWVyYWJsZVByb3BzID0gWyd2YWx1ZU9mJywgJ2lzUHJvdG90eXBlT2YnLCAndG9TdHJpbmcnLFxuICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICdoYXNPd25Qcm9wZXJ0eScsICd0b0xvY2FsZVN0cmluZyddO1xuXG4gIHZhciBjb2xsZWN0Tm9uRW51bVByb3BzID0gZnVuY3Rpb24ob2JqLCBrZXlzKSB7XG4gICAgdmFyIG5vbkVudW1JZHggPSBub25FbnVtZXJhYmxlUHJvcHMubGVuZ3RoO1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IG9iai5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgcHJvdG8gPSBfLmlzRnVuY3Rpb24oY29uc3RydWN0b3IpICYmIGNvbnN0cnVjdG9yLnByb3RvdHlwZSB8fCBPYmpQcm90bztcblxuICAgIC8vIENvbnN0cnVjdG9yIGlzIGEgc3BlY2lhbCBjYXNlLlxuICAgIHZhciBwcm9wID0gJ2NvbnN0cnVjdG9yJztcbiAgICBpZiAoaGFzKG9iaiwgcHJvcCkgJiYgIV8uY29udGFpbnMoa2V5cywgcHJvcCkpIGtleXMucHVzaChwcm9wKTtcblxuICAgIHdoaWxlIChub25FbnVtSWR4LS0pIHtcbiAgICAgIHByb3AgPSBub25FbnVtZXJhYmxlUHJvcHNbbm9uRW51bUlkeF07XG4gICAgICBpZiAocHJvcCBpbiBvYmogJiYgb2JqW3Byb3BdICE9PSBwcm90b1twcm9wXSAmJiAhXy5jb250YWlucyhrZXlzLCBwcm9wKSkge1xuICAgICAgICBrZXlzLnB1c2gocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIFJldHJpZXZlIHRoZSBuYW1lcyBvZiBhbiBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAgLy8gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYE9iamVjdC5rZXlzYC5cbiAgXy5rZXlzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBbXTtcbiAgICBpZiAobmF0aXZlS2V5cykgcmV0dXJuIG5hdGl2ZUtleXMob2JqKTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIGlmIChoYXMob2JqLCBrZXkpKSBrZXlzLnB1c2goa2V5KTtcbiAgICAvLyBBaGVtLCBJRSA8IDkuXG4gICAgaWYgKGhhc0VudW1CdWcpIGNvbGxlY3ROb25FbnVtUHJvcHMob2JqLCBrZXlzKTtcbiAgICByZXR1cm4ga2V5cztcbiAgfTtcblxuICAvLyBSZXRyaWV2ZSBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdC5cbiAgXy5hbGxLZXlzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBbXTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIGtleXMucHVzaChrZXkpO1xuICAgIC8vIEFoZW0sIElFIDwgOS5cbiAgICBpZiAoaGFzRW51bUJ1ZykgY29sbGVjdE5vbkVudW1Qcm9wcyhvYmosIGtleXMpO1xuICAgIHJldHVybiBrZXlzO1xuICB9O1xuXG4gIC8vIFJldHJpZXZlIHRoZSB2YWx1ZXMgb2YgYW4gb2JqZWN0J3MgcHJvcGVydGllcy5cbiAgXy52YWx1ZXMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgdmFsdWVzID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZXNbaV0gPSBvYmpba2V5c1tpXV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVzdWx0cyBvZiBhcHBseWluZyB0aGUgaXRlcmF0ZWUgdG8gZWFjaCBlbGVtZW50IG9mIHRoZSBvYmplY3QuXG4gIC8vIEluIGNvbnRyYXN0IHRvIF8ubWFwIGl0IHJldHVybnMgYW4gb2JqZWN0LlxuICBfLm1hcE9iamVjdCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopLFxuICAgICAgICBsZW5ndGggPSBrZXlzLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0cyA9IHt9O1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5c1tpbmRleF07XG4gICAgICByZXN1bHRzW2N1cnJlbnRLZXldID0gaXRlcmF0ZWUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICAvLyBDb252ZXJ0IGFuIG9iamVjdCBpbnRvIGEgbGlzdCBvZiBgW2tleSwgdmFsdWVdYCBwYWlycy5cbiAgLy8gVGhlIG9wcG9zaXRlIG9mIF8ub2JqZWN0LlxuICBfLnBhaXJzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIGtleXMgPSBfLmtleXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIHBhaXJzID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBwYWlyc1tpXSA9IFtrZXlzW2ldLCBvYmpba2V5c1tpXV1dO1xuICAgIH1cbiAgICByZXR1cm4gcGFpcnM7XG4gIH07XG5cbiAgLy8gSW52ZXJ0IHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgYW4gb2JqZWN0LiBUaGUgdmFsdWVzIG11c3QgYmUgc2VyaWFsaXphYmxlLlxuICBfLmludmVydCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbb2JqW2tleXNbaV1dXSA9IGtleXNbaV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGEgc29ydGVkIGxpc3Qgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGF2YWlsYWJsZSBvbiB0aGUgb2JqZWN0LlxuICAvLyBBbGlhc2VkIGFzIGBtZXRob2RzYC5cbiAgXy5mdW5jdGlvbnMgPSBfLm1ldGhvZHMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoXy5pc0Z1bmN0aW9uKG9ialtrZXldKSkgbmFtZXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXMuc29ydCgpO1xuICB9O1xuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhc3NpZ25lciBmdW5jdGlvbnMuXG4gIHZhciBjcmVhdGVBc3NpZ25lciA9IGZ1bmN0aW9uKGtleXNGdW5jLCBkZWZhdWx0cykge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKGRlZmF1bHRzKSBvYmogPSBPYmplY3Qob2JqKTtcbiAgICAgIGlmIChsZW5ndGggPCAyIHx8IG9iaiA9PSBudWxsKSByZXR1cm4gb2JqO1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2luZGV4XSxcbiAgICAgICAgICAgIGtleXMgPSBrZXlzRnVuYyhzb3VyY2UpLFxuICAgICAgICAgICAgbCA9IGtleXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmICghZGVmYXVsdHMgfHwgb2JqW2tleV0gPT09IHZvaWQgMCkgb2JqW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICB9O1xuXG4gIC8vIEV4dGVuZCBhIGdpdmVuIG9iamVjdCB3aXRoIGFsbCB0aGUgcHJvcGVydGllcyBpbiBwYXNzZWQtaW4gb2JqZWN0KHMpLlxuICBfLmV4dGVuZCA9IGNyZWF0ZUFzc2lnbmVyKF8uYWxsS2V5cyk7XG5cbiAgLy8gQXNzaWducyBhIGdpdmVuIG9iamVjdCB3aXRoIGFsbCB0aGUgb3duIHByb3BlcnRpZXMgaW4gdGhlIHBhc3NlZC1pbiBvYmplY3QocykuXG4gIC8vIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduKVxuICBfLmV4dGVuZE93biA9IF8uYXNzaWduID0gY3JlYXRlQXNzaWduZXIoXy5rZXlzKTtcblxuICAvLyBSZXR1cm5zIHRoZSBmaXJzdCBrZXkgb24gYW4gb2JqZWN0IHRoYXQgcGFzc2VzIGEgcHJlZGljYXRlIHRlc3QuXG4gIF8uZmluZEtleSA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopLCBrZXk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAocHJlZGljYXRlKG9ialtrZXldLCBrZXksIG9iaikpIHJldHVybiBrZXk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEludGVybmFsIHBpY2sgaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBgb2JqYCBoYXMga2V5IGBrZXlgLlxuICB2YXIga2V5SW5PYmogPSBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmopIHtcbiAgICByZXR1cm4ga2V5IGluIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBvYmplY3Qgb25seSBjb250YWluaW5nIHRoZSB3aGl0ZWxpc3RlZCBwcm9wZXJ0aWVzLlxuICBfLnBpY2sgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKG9iaiwga2V5cykge1xuICAgIHZhciByZXN1bHQgPSB7fSwgaXRlcmF0ZWUgPSBrZXlzWzBdO1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGl0ZXJhdGVlKSkge1xuICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkgaXRlcmF0ZWUgPSBvcHRpbWl6ZUNiKGl0ZXJhdGVlLCBrZXlzWzFdKTtcbiAgICAgIGtleXMgPSBfLmFsbEtleXMob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlcmF0ZWUgPSBrZXlJbk9iajtcbiAgICAgIGtleXMgPSBmbGF0dGVuKGtleXMsIGZhbHNlLCBmYWxzZSk7XG4gICAgICBvYmogPSBPYmplY3Qob2JqKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgdmFyIHZhbHVlID0gb2JqW2tleV07XG4gICAgICBpZiAoaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqKSkgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgb2JqZWN0IHdpdGhvdXQgdGhlIGJsYWNrbGlzdGVkIHByb3BlcnRpZXMuXG4gIF8ub21pdCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24ob2JqLCBrZXlzKSB7XG4gICAgdmFyIGl0ZXJhdGVlID0ga2V5c1swXSwgY29udGV4dDtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGl0ZXJhdGVlKSkge1xuICAgICAgaXRlcmF0ZWUgPSBfLm5lZ2F0ZShpdGVyYXRlZSk7XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSBjb250ZXh0ID0ga2V5c1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5cyA9IF8ubWFwKGZsYXR0ZW4oa2V5cywgZmFsc2UsIGZhbHNlKSwgU3RyaW5nKTtcbiAgICAgIGl0ZXJhdGVlID0gZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICByZXR1cm4gIV8uY29udGFpbnMoa2V5cywga2V5KTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBfLnBpY2sob2JqLCBpdGVyYXRlZSwgY29udGV4dCk7XG4gIH0pO1xuXG4gIC8vIEZpbGwgaW4gYSBnaXZlbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gIF8uZGVmYXVsdHMgPSBjcmVhdGVBc3NpZ25lcihfLmFsbEtleXMsIHRydWUpO1xuXG4gIC8vIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgZ2l2ZW4gcHJvdG90eXBlIG9iamVjdC5cbiAgLy8gSWYgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBwcm92aWRlZCB0aGVuIHRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGVcbiAgLy8gY3JlYXRlZCBvYmplY3QuXG4gIF8uY3JlYXRlID0gZnVuY3Rpb24ocHJvdG90eXBlLCBwcm9wcykge1xuICAgIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgaWYgKHByb3BzKSBfLmV4dGVuZE93bihyZXN1bHQsIHByb3BzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIENyZWF0ZSBhIChzaGFsbG93LWNsb25lZCkgZHVwbGljYXRlIG9mIGFuIG9iamVjdC5cbiAgXy5jbG9uZSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmICghXy5pc09iamVjdChvYmopKSByZXR1cm4gb2JqO1xuICAgIHJldHVybiBfLmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogXy5leHRlbmQoe30sIG9iaik7XG4gIH07XG5cbiAgLy8gSW52b2tlcyBpbnRlcmNlcHRvciB3aXRoIHRoZSBvYmosIGFuZCB0aGVuIHJldHVybnMgb2JqLlxuICAvLyBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiwgaW5cbiAgLy8gb3JkZXIgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9uIGludGVybWVkaWF0ZSByZXN1bHRzIHdpdGhpbiB0aGUgY2hhaW4uXG4gIF8udGFwID0gZnVuY3Rpb24ob2JqLCBpbnRlcmNlcHRvcikge1xuICAgIGludGVyY2VwdG9yKG9iaik7XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyBhIGdpdmVuIHNldCBvZiBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy5pc01hdGNoID0gZnVuY3Rpb24ob2JqZWN0LCBhdHRycykge1xuICAgIHZhciBrZXlzID0gXy5rZXlzKGF0dHJzKSwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gIWxlbmd0aDtcbiAgICB2YXIgb2JqID0gT2JqZWN0KG9iamVjdCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoYXR0cnNba2V5XSAhPT0gb2JqW2tleV0gfHwgIShrZXkgaW4gb2JqKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuXG4gIC8vIEludGVybmFsIHJlY3Vyc2l2ZSBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciBgaXNFcXVhbGAuXG4gIHZhciBlcSwgZGVlcEVxO1xuICBlcSA9IGZ1bmN0aW9uKGEsIGIsIGFTdGFjaywgYlN0YWNrKSB7XG4gICAgLy8gSWRlbnRpY2FsIG9iamVjdHMgYXJlIGVxdWFsLiBgMCA9PT0gLTBgLCBidXQgdGhleSBhcmVuJ3QgaWRlbnRpY2FsLlxuICAgIC8vIFNlZSB0aGUgW0hhcm1vbnkgYGVnYWxgIHByb3Bvc2FsXShodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OmVnYWwpLlxuICAgIGlmIChhID09PSBiKSByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PT0gMSAvIGI7XG4gICAgLy8gYG51bGxgIG9yIGB1bmRlZmluZWRgIG9ubHkgZXF1YWwgdG8gaXRzZWxmIChzdHJpY3QgY29tcGFyaXNvbikuXG4gICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAvLyBgTmFOYHMgYXJlIGVxdWl2YWxlbnQsIGJ1dCBub24tcmVmbGV4aXZlLlxuICAgIGlmIChhICE9PSBhKSByZXR1cm4gYiAhPT0gYjtcbiAgICAvLyBFeGhhdXN0IHByaW1pdGl2ZSBjaGVja3NcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiBhO1xuICAgIGlmICh0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGUgIT09ICdvYmplY3QnICYmIHR5cGVvZiBiICE9ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGRlZXBFcShhLCBiLCBhU3RhY2ssIGJTdGFjayk7XG4gIH07XG5cbiAgLy8gSW50ZXJuYWwgcmVjdXJzaXZlIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIGBpc0VxdWFsYC5cbiAgZGVlcEVxID0gZnVuY3Rpb24oYSwgYiwgYVN0YWNrLCBiU3RhY2spIHtcbiAgICAvLyBVbndyYXAgYW55IHdyYXBwZWQgb2JqZWN0cy5cbiAgICBpZiAoYSBpbnN0YW5jZW9mIF8pIGEgPSBhLl93cmFwcGVkO1xuICAgIGlmIChiIGluc3RhbmNlb2YgXykgYiA9IGIuX3dyYXBwZWQ7XG4gICAgLy8gQ29tcGFyZSBgW1tDbGFzc11dYCBuYW1lcy5cbiAgICB2YXIgY2xhc3NOYW1lID0gdG9TdHJpbmcuY2FsbChhKTtcbiAgICBpZiAoY2xhc3NOYW1lICE9PSB0b1N0cmluZy5jYWxsKGIpKSByZXR1cm4gZmFsc2U7XG4gICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgIC8vIFN0cmluZ3MsIG51bWJlcnMsIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGRhdGVzLCBhbmQgYm9vbGVhbnMgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlLlxuICAgICAgY2FzZSAnW29iamVjdCBSZWdFeHBdJzpcbiAgICAgIC8vIFJlZ0V4cHMgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncyBmb3IgY29tcGFyaXNvbiAoTm90ZTogJycgKyAvYS9pID09PSAnL2EvaScpXG4gICAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgICAgICAvLyBQcmltaXRpdmVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG9iamVjdCB3cmFwcGVycyBhcmUgZXF1aXZhbGVudDsgdGh1cywgYFwiNVwiYCBpc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIGBuZXcgU3RyaW5nKFwiNVwiKWAuXG4gICAgICAgIHJldHVybiAnJyArIGEgPT09ICcnICsgYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICAgIC8vIGBOYU5gcyBhcmUgZXF1aXZhbGVudCwgYnV0IG5vbi1yZWZsZXhpdmUuXG4gICAgICAgIC8vIE9iamVjdChOYU4pIGlzIGVxdWl2YWxlbnQgdG8gTmFOLlxuICAgICAgICBpZiAoK2EgIT09ICthKSByZXR1cm4gK2IgIT09ICtiO1xuICAgICAgICAvLyBBbiBgZWdhbGAgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgZm9yIG90aGVyIG51bWVyaWMgdmFsdWVzLlxuICAgICAgICByZXR1cm4gK2EgPT09IDAgPyAxIC8gK2EgPT09IDEgLyBiIDogK2EgPT09ICtiO1xuICAgICAgY2FzZSAnW29iamVjdCBEYXRlXSc6XG4gICAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzpcbiAgICAgICAgLy8gQ29lcmNlIGRhdGVzIGFuZCBib29sZWFucyB0byBudW1lcmljIHByaW1pdGl2ZSB2YWx1ZXMuIERhdGVzIGFyZSBjb21wYXJlZCBieSB0aGVpclxuICAgICAgICAvLyBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnMuIE5vdGUgdGhhdCBpbnZhbGlkIGRhdGVzIHdpdGggbWlsbGlzZWNvbmQgcmVwcmVzZW50YXRpb25zXG4gICAgICAgIC8vIG9mIGBOYU5gIGFyZSBub3QgZXF1aXZhbGVudC5cbiAgICAgICAgcmV0dXJuICthID09PSArYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgU3ltYm9sXSc6XG4gICAgICAgIHJldHVybiBTeW1ib2xQcm90by52YWx1ZU9mLmNhbGwoYSkgPT09IFN5bWJvbFByb3RvLnZhbHVlT2YuY2FsbChiKTtcbiAgICB9XG5cbiAgICB2YXIgYXJlQXJyYXlzID0gY2xhc3NOYW1lID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgIGlmICghYXJlQXJyYXlzKSB7XG4gICAgICBpZiAodHlwZW9mIGEgIT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gT2JqZWN0cyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVpdmFsZW50LCBidXQgYE9iamVjdGBzIG9yIGBBcnJheWBzXG4gICAgICAvLyBmcm9tIGRpZmZlcmVudCBmcmFtZXMgYXJlLlxuICAgICAgdmFyIGFDdG9yID0gYS5jb25zdHJ1Y3RvciwgYkN0b3IgPSBiLmNvbnN0cnVjdG9yO1xuICAgICAgaWYgKGFDdG9yICE9PSBiQ3RvciAmJiAhKF8uaXNGdW5jdGlvbihhQ3RvcikgJiYgYUN0b3IgaW5zdGFuY2VvZiBhQ3RvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uaXNGdW5jdGlvbihiQ3RvcikgJiYgYkN0b3IgaW5zdGFuY2VvZiBiQ3RvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCdjb25zdHJ1Y3RvcicgaW4gYSAmJiAnY29uc3RydWN0b3InIGluIGIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQXNzdW1lIGVxdWFsaXR5IGZvciBjeWNsaWMgc3RydWN0dXJlcy4gVGhlIGFsZ29yaXRobSBmb3IgZGV0ZWN0aW5nIGN5Y2xpY1xuICAgIC8vIHN0cnVjdHVyZXMgaXMgYWRhcHRlZCBmcm9tIEVTIDUuMSBzZWN0aW9uIDE1LjEyLjMsIGFic3RyYWN0IG9wZXJhdGlvbiBgSk9gLlxuXG4gICAgLy8gSW5pdGlhbGl6aW5nIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgIC8vIEl0J3MgZG9uZSBoZXJlIHNpbmNlIHdlIG9ubHkgbmVlZCB0aGVtIGZvciBvYmplY3RzIGFuZCBhcnJheXMgY29tcGFyaXNvbi5cbiAgICBhU3RhY2sgPSBhU3RhY2sgfHwgW107XG4gICAgYlN0YWNrID0gYlN0YWNrIHx8IFtdO1xuICAgIHZhciBsZW5ndGggPSBhU3RhY2subGVuZ3RoO1xuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgLy8gTGluZWFyIHNlYXJjaC4gUGVyZm9ybWFuY2UgaXMgaW52ZXJzZWx5IHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mXG4gICAgICAvLyB1bmlxdWUgbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAgICBpZiAoYVN0YWNrW2xlbmd0aF0gPT09IGEpIHJldHVybiBiU3RhY2tbbGVuZ3RoXSA9PT0gYjtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGZpcnN0IG9iamVjdCB0byB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgYVN0YWNrLnB1c2goYSk7XG4gICAgYlN0YWNrLnB1c2goYik7XG5cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgYW5kIGFycmF5cy5cbiAgICBpZiAoYXJlQXJyYXlzKSB7XG4gICAgICAvLyBDb21wYXJlIGFycmF5IGxlbmd0aHMgdG8gZGV0ZXJtaW5lIGlmIGEgZGVlcCBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeS5cbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIERlZXAgY29tcGFyZSB0aGUgY29udGVudHMsIGlnbm9yaW5nIG5vbi1udW1lcmljIHByb3BlcnRpZXMuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaWYgKCFlcShhW2xlbmd0aF0sIGJbbGVuZ3RoXSwgYVN0YWNrLCBiU3RhY2spKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZXAgY29tcGFyZSBvYmplY3RzLlxuICAgICAgdmFyIGtleXMgPSBfLmtleXMoYSksIGtleTtcbiAgICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgICAgLy8gRW5zdXJlIHRoYXQgYm90aCBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUgbnVtYmVyIG9mIHByb3BlcnRpZXMgYmVmb3JlIGNvbXBhcmluZyBkZWVwIGVxdWFsaXR5LlxuICAgICAgaWYgKF8ua2V5cyhiKS5sZW5ndGggIT09IGxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIC8vIERlZXAgY29tcGFyZSBlYWNoIG1lbWJlclxuICAgICAgICBrZXkgPSBrZXlzW2xlbmd0aF07XG4gICAgICAgIGlmICghKGhhcyhiLCBrZXkpICYmIGVxKGFba2V5XSwgYltrZXldLCBhU3RhY2ssIGJTdGFjaykpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJlbW92ZSB0aGUgZmlyc3Qgb2JqZWN0IGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgIGFTdGFjay5wb3AoKTtcbiAgICBiU3RhY2sucG9wKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLy8gUGVyZm9ybSBhIGRlZXAgY29tcGFyaXNvbiB0byBjaGVjayBpZiB0d28gb2JqZWN0cyBhcmUgZXF1YWwuXG4gIF8uaXNFcXVhbCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gZXEoYSwgYik7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiBhcnJheSwgc3RyaW5nLCBvciBvYmplY3QgZW1wdHk/XG4gIC8vIEFuIFwiZW1wdHlcIiBvYmplY3QgaGFzIG5vIGVudW1lcmFibGUgb3duLXByb3BlcnRpZXMuXG4gIF8uaXNFbXB0eSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQXJyYXlMaWtlKG9iaikgJiYgKF8uaXNBcnJheShvYmopIHx8IF8uaXNTdHJpbmcob2JqKSB8fCBfLmlzQXJndW1lbnRzKG9iaikpKSByZXR1cm4gb2JqLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gXy5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFsdWUgYSBET00gZWxlbWVudD9cbiAgXy5pc0VsZW1lbnQgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gISEob2JqICYmIG9iai5ub2RlVHlwZSA9PT0gMSk7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBhbiBhcnJheT9cbiAgLy8gRGVsZWdhdGVzIHRvIEVDTUE1J3MgbmF0aXZlIEFycmF5LmlzQXJyYXlcbiAgXy5pc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBBcnJheV0nO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFyaWFibGUgYW4gb2JqZWN0P1xuICBfLmlzT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIHR5cGUgPSB0eXBlb2Ygb2JqO1xuICAgIHJldHVybiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IHR5cGUgPT09ICdvYmplY3QnICYmICEhb2JqO1xuICB9O1xuXG4gIC8vIEFkZCBzb21lIGlzVHlwZSBtZXRob2RzOiBpc0FyZ3VtZW50cywgaXNGdW5jdGlvbiwgaXNTdHJpbmcsIGlzTnVtYmVyLCBpc0RhdGUsIGlzUmVnRXhwLCBpc0Vycm9yLCBpc01hcCwgaXNXZWFrTWFwLCBpc1NldCwgaXNXZWFrU2V0LlxuICBfLmVhY2goWydBcmd1bWVudHMnLCAnRnVuY3Rpb24nLCAnU3RyaW5nJywgJ051bWJlcicsICdEYXRlJywgJ1JlZ0V4cCcsICdFcnJvcicsICdTeW1ib2wnLCAnTWFwJywgJ1dlYWtNYXAnLCAnU2V0JywgJ1dlYWtTZXQnXSwgZnVuY3Rpb24obmFtZSkge1xuICAgIF9bJ2lzJyArIG5hbWVdID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCAnICsgbmFtZSArICddJztcbiAgICB9O1xuICB9KTtcblxuICAvLyBEZWZpbmUgYSBmYWxsYmFjayB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgaW4gYnJvd3NlcnMgKGFoZW0sIElFIDwgOSksIHdoZXJlXG4gIC8vIHRoZXJlIGlzbid0IGFueSBpbnNwZWN0YWJsZSBcIkFyZ3VtZW50c1wiIHR5cGUuXG4gIGlmICghXy5pc0FyZ3VtZW50cyhhcmd1bWVudHMpKSB7XG4gICAgXy5pc0FyZ3VtZW50cyA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIGhhcyhvYmosICdjYWxsZWUnKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gT3B0aW1pemUgYGlzRnVuY3Rpb25gIGlmIGFwcHJvcHJpYXRlLiBXb3JrIGFyb3VuZCBzb21lIHR5cGVvZiBidWdzIGluIG9sZCB2OCxcbiAgLy8gSUUgMTEgKCMxNjIxKSwgU2FmYXJpIDggKCMxOTI5KSwgYW5kIFBoYW50b21KUyAoIzIyMzYpLlxuICB2YXIgbm9kZWxpc3QgPSByb290LmRvY3VtZW50ICYmIHJvb3QuZG9jdW1lbnQuY2hpbGROb2RlcztcbiAgaWYgKHR5cGVvZiAvLi8gIT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgSW50OEFycmF5ICE9ICdvYmplY3QnICYmIHR5cGVvZiBub2RlbGlzdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgXy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PSAnZnVuY3Rpb24nIHx8IGZhbHNlO1xuICAgIH07XG4gIH1cblxuICAvLyBJcyBhIGdpdmVuIG9iamVjdCBhIGZpbml0ZSBudW1iZXI/XG4gIF8uaXNGaW5pdGUgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gIV8uaXNTeW1ib2wob2JqKSAmJiBpc0Zpbml0ZShvYmopICYmICFpc05hTihwYXJzZUZsb2F0KG9iaikpO1xuICB9O1xuXG4gIC8vIElzIHRoZSBnaXZlbiB2YWx1ZSBgTmFOYD9cbiAgXy5pc05hTiA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBfLmlzTnVtYmVyKG9iaikgJiYgaXNOYU4ob2JqKTtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhbHVlIGEgYm9vbGVhbj9cbiAgXy5pc0Jvb2xlYW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB0cnVlIHx8IG9iaiA9PT0gZmFsc2UgfHwgdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBCb29sZWFuXSc7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBlcXVhbCB0byBudWxsP1xuICBfLmlzTnVsbCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IG51bGw7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YXJpYWJsZSB1bmRlZmluZWQ/XG4gIF8uaXNVbmRlZmluZWQgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB2b2lkIDA7XG4gIH07XG5cbiAgLy8gU2hvcnRjdXQgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBwcm9wZXJ0eSBkaXJlY3RseVxuICAvLyBvbiBpdHNlbGYgKGluIG90aGVyIHdvcmRzLCBub3Qgb24gYSBwcm90b3R5cGUpLlxuICBfLmhhcyA9IGZ1bmN0aW9uKG9iaiwgcGF0aCkge1xuICAgIGlmICghXy5pc0FycmF5KHBhdGgpKSB7XG4gICAgICByZXR1cm4gaGFzKG9iaiwgcGF0aCk7XG4gICAgfVxuICAgIHZhciBsZW5ndGggPSBwYXRoLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gcGF0aFtpXTtcbiAgICAgIGlmIChvYmogPT0gbnVsbCB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqID0gb2JqW2tleV07XG4gICAgfVxuICAgIHJldHVybiAhIWxlbmd0aDtcbiAgfTtcblxuICAvLyBVdGlsaXR5IEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFJ1biBVbmRlcnNjb3JlLmpzIGluICpub0NvbmZsaWN0KiBtb2RlLCByZXR1cm5pbmcgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHNcbiAgLy8gcHJldmlvdXMgb3duZXIuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0LlxuICBfLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICByb290Ll8gPSBwcmV2aW91c1VuZGVyc2NvcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gS2VlcCB0aGUgaWRlbnRpdHkgZnVuY3Rpb24gYXJvdW5kIGZvciBkZWZhdWx0IGl0ZXJhdGVlcy5cbiAgXy5pZGVudGl0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIC8vIFByZWRpY2F0ZS1nZW5lcmF0aW5nIGZ1bmN0aW9ucy4gT2Z0ZW4gdXNlZnVsIG91dHNpZGUgb2YgVW5kZXJzY29yZS5cbiAgXy5jb25zdGFudCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gIH07XG5cbiAgXy5ub29wID0gZnVuY3Rpb24oKXt9O1xuXG4gIC8vIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIHBhc3NlZCBhbiBvYmplY3QsIHdpbGwgdHJhdmVyc2UgdGhhdCBvYmplY3TigJlzXG4gIC8vIHByb3BlcnRpZXMgZG93biB0aGUgZ2l2ZW4gYHBhdGhgLCBzcGVjaWZpZWQgYXMgYW4gYXJyYXkgb2Yga2V5cyBvciBpbmRleGVzLlxuICBfLnByb3BlcnR5ID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIGlmICghXy5pc0FycmF5KHBhdGgpKSB7XG4gICAgICByZXR1cm4gc2hhbGxvd1Byb3BlcnR5KHBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gZGVlcEdldChvYmosIHBhdGgpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gR2VuZXJhdGVzIGEgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gb2JqZWN0IHRoYXQgcmV0dXJucyBhIGdpdmVuIHByb3BlcnR5LlxuICBfLnByb3BlcnR5T2YgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpe307XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICByZXR1cm4gIV8uaXNBcnJheShwYXRoKSA/IG9ialtwYXRoXSA6IGRlZXBHZXQob2JqLCBwYXRoKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBwcmVkaWNhdGUgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyBhIGdpdmVuIHNldCBvZlxuICAvLyBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy5tYXRjaGVyID0gXy5tYXRjaGVzID0gZnVuY3Rpb24oYXR0cnMpIHtcbiAgICBhdHRycyA9IF8uZXh0ZW5kT3duKHt9LCBhdHRycyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIF8uaXNNYXRjaChvYmosIGF0dHJzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJ1biBhIGZ1bmN0aW9uICoqbioqIHRpbWVzLlxuICBfLnRpbWVzID0gZnVuY3Rpb24obiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgYWNjdW0gPSBBcnJheShNYXRoLm1heCgwLCBuKSk7XG4gICAgaXRlcmF0ZWUgPSBvcHRpbWl6ZUNiKGl0ZXJhdGVlLCBjb250ZXh0LCAxKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgYWNjdW1baV0gPSBpdGVyYXRlZShpKTtcbiAgICByZXR1cm4gYWNjdW07XG4gIH07XG5cbiAgLy8gUmV0dXJuIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAoaW5jbHVzaXZlKS5cbiAgXy5yYW5kb20gPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIGlmIChtYXggPT0gbnVsbCkge1xuICAgICAgbWF4ID0gbWluO1xuICAgICAgbWluID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIG1pbiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSk7XG4gIH07XG5cbiAgLy8gQSAocG9zc2libHkgZmFzdGVyKSB3YXkgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyBhbiBpbnRlZ2VyLlxuICBfLm5vdyA9IERhdGUubm93IHx8IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgfTtcblxuICAvLyBMaXN0IG9mIEhUTUwgZW50aXRpZXMgZm9yIGVzY2FwaW5nLlxuICB2YXIgZXNjYXBlTWFwID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjeDI3OycsXG4gICAgJ2AnOiAnJiN4NjA7J1xuICB9O1xuICB2YXIgdW5lc2NhcGVNYXAgPSBfLmludmVydChlc2NhcGVNYXApO1xuXG4gIC8vIEZ1bmN0aW9ucyBmb3IgZXNjYXBpbmcgYW5kIHVuZXNjYXBpbmcgc3RyaW5ncyB0by9mcm9tIEhUTUwgaW50ZXJwb2xhdGlvbi5cbiAgdmFyIGNyZWF0ZUVzY2FwZXIgPSBmdW5jdGlvbihtYXApIHtcbiAgICB2YXIgZXNjYXBlciA9IGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWFwW21hdGNoXTtcbiAgICB9O1xuICAgIC8vIFJlZ2V4ZXMgZm9yIGlkZW50aWZ5aW5nIGEga2V5IHRoYXQgbmVlZHMgdG8gYmUgZXNjYXBlZC5cbiAgICB2YXIgc291cmNlID0gJyg/OicgKyBfLmtleXMobWFwKS5qb2luKCd8JykgKyAnKSc7XG4gICAgdmFyIHRlc3RSZWdleHAgPSBSZWdFeHAoc291cmNlKTtcbiAgICB2YXIgcmVwbGFjZVJlZ2V4cCA9IFJlZ0V4cChzb3VyY2UsICdnJyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gc3RyaW5nID09IG51bGwgPyAnJyA6ICcnICsgc3RyaW5nO1xuICAgICAgcmV0dXJuIHRlc3RSZWdleHAudGVzdChzdHJpbmcpID8gc3RyaW5nLnJlcGxhY2UocmVwbGFjZVJlZ2V4cCwgZXNjYXBlcikgOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgXy5lc2NhcGUgPSBjcmVhdGVFc2NhcGVyKGVzY2FwZU1hcCk7XG4gIF8udW5lc2NhcGUgPSBjcmVhdGVFc2NhcGVyKHVuZXNjYXBlTWFwKTtcblxuICAvLyBUcmF2ZXJzZXMgdGhlIGNoaWxkcmVuIG9mIGBvYmpgIGFsb25nIGBwYXRoYC4gSWYgYSBjaGlsZCBpcyBhIGZ1bmN0aW9uLCBpdFxuICAvLyBpcyBpbnZva2VkIHdpdGggaXRzIHBhcmVudCBhcyBjb250ZXh0LiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmluYWxcbiAgLy8gY2hpbGQsIG9yIGBmYWxsYmFja2AgaWYgYW55IGNoaWxkIGlzIHVuZGVmaW5lZC5cbiAgXy5yZXN1bHQgPSBmdW5jdGlvbihvYmosIHBhdGgsIGZhbGxiYWNrKSB7XG4gICAgaWYgKCFfLmlzQXJyYXkocGF0aCkpIHBhdGggPSBbcGF0aF07XG4gICAgdmFyIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gXy5pc0Z1bmN0aW9uKGZhbGxiYWNrKSA/IGZhbGxiYWNrLmNhbGwob2JqKSA6IGZhbGxiYWNrO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IG9iaiA9PSBudWxsID8gdm9pZCAwIDogb2JqW3BhdGhbaV1dO1xuICAgICAgaWYgKHByb3AgPT09IHZvaWQgMCkge1xuICAgICAgICBwcm9wID0gZmFsbGJhY2s7XG4gICAgICAgIGkgPSBsZW5ndGg7IC8vIEVuc3VyZSB3ZSBkb24ndCBjb250aW51ZSBpdGVyYXRpbmcuXG4gICAgICB9XG4gICAgICBvYmogPSBfLmlzRnVuY3Rpb24ocHJvcCkgPyBwcm9wLmNhbGwob2JqKSA6IHByb3A7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgLy8gR2VuZXJhdGUgYSB1bmlxdWUgaW50ZWdlciBpZCAodW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIGNsaWVudCBzZXNzaW9uKS5cbiAgLy8gVXNlZnVsIGZvciB0ZW1wb3JhcnkgRE9NIGlkcy5cbiAgdmFyIGlkQ291bnRlciA9IDA7XG4gIF8udW5pcXVlSWQgPSBmdW5jdGlvbihwcmVmaXgpIHtcbiAgICB2YXIgaWQgPSArK2lkQ291bnRlciArICcnO1xuICAgIHJldHVybiBwcmVmaXggPyBwcmVmaXggKyBpZCA6IGlkO1xuICB9O1xuXG4gIC8vIEJ5IGRlZmF1bHQsIFVuZGVyc2NvcmUgdXNlcyBFUkItc3R5bGUgdGVtcGxhdGUgZGVsaW1pdGVycywgY2hhbmdlIHRoZVxuICAvLyBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlIGRlbGltaXRlcnMuXG4gIF8udGVtcGxhdGVTZXR0aW5ncyA9IHtcbiAgICBldmFsdWF0ZTogLzwlKFtcXHNcXFNdKz8pJT4vZyxcbiAgICBpbnRlcnBvbGF0ZTogLzwlPShbXFxzXFxTXSs/KSU+L2csXG4gICAgZXNjYXBlOiAvPCUtKFtcXHNcXFNdKz8pJT4vZ1xuICB9O1xuXG4gIC8vIFdoZW4gY3VzdG9taXppbmcgYHRlbXBsYXRlU2V0dGluZ3NgLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgYW5cbiAgLy8gaW50ZXJwb2xhdGlvbiwgZXZhbHVhdGlvbiBvciBlc2NhcGluZyByZWdleCwgd2UgbmVlZCBvbmUgdGhhdCBpc1xuICAvLyBndWFyYW50ZWVkIG5vdCB0byBtYXRjaC5cbiAgdmFyIG5vTWF0Y2ggPSAvKC4pXi87XG5cbiAgLy8gQ2VydGFpbiBjaGFyYWN0ZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHB1dCBpbnRvIGFcbiAgLy8gc3RyaW5nIGxpdGVyYWwuXG4gIHZhciBlc2NhcGVzID0ge1xuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICAnXFxyJzogJ3InLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIHZhciBlc2NhcGVSZWdFeHAgPSAvXFxcXHwnfFxccnxcXG58XFx1MjAyOHxcXHUyMDI5L2c7XG5cbiAgdmFyIGVzY2FwZUNoYXIgPSBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiAnXFxcXCcgKyBlc2NhcGVzW21hdGNoXTtcbiAgfTtcblxuICAvLyBKYXZhU2NyaXB0IG1pY3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIgdG8gSm9obiBSZXNpZydzIGltcGxlbWVudGF0aW9uLlxuICAvLyBVbmRlcnNjb3JlIHRlbXBsYXRpbmcgaGFuZGxlcyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJlc2VydmVzIHdoaXRlc3BhY2UsXG4gIC8vIGFuZCBjb3JyZWN0bHkgZXNjYXBlcyBxdW90ZXMgd2l0aGluIGludGVycG9sYXRlZCBjb2RlLlxuICAvLyBOQjogYG9sZFNldHRpbmdzYCBvbmx5IGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gIF8udGVtcGxhdGUgPSBmdW5jdGlvbih0ZXh0LCBzZXR0aW5ncywgb2xkU2V0dGluZ3MpIHtcbiAgICBpZiAoIXNldHRpbmdzICYmIG9sZFNldHRpbmdzKSBzZXR0aW5ncyA9IG9sZFNldHRpbmdzO1xuICAgIHNldHRpbmdzID0gXy5kZWZhdWx0cyh7fSwgc2V0dGluZ3MsIF8udGVtcGxhdGVTZXR0aW5ncyk7XG5cbiAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHByZXNzaW9uIHZpYSBhbHRlcm5hdGlvbi5cbiAgICB2YXIgbWF0Y2hlciA9IFJlZ0V4cChbXG4gICAgICAoc2V0dGluZ3MuZXNjYXBlIHx8IG5vTWF0Y2gpLnNvdXJjZSxcbiAgICAgIChzZXR0aW5ncy5pbnRlcnBvbGF0ZSB8fCBub01hdGNoKS5zb3VyY2UsXG4gICAgICAoc2V0dGluZ3MuZXZhbHVhdGUgfHwgbm9NYXRjaCkuc291cmNlXG4gICAgXS5qb2luKCd8JykgKyAnfCQnLCAnZycpO1xuXG4gICAgLy8gQ29tcGlsZSB0aGUgdGVtcGxhdGUgc291cmNlLCBlc2NhcGluZyBzdHJpbmcgbGl0ZXJhbHMgYXBwcm9wcmlhdGVseS5cbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBzb3VyY2UgPSBcIl9fcCs9J1wiO1xuICAgIHRleHQucmVwbGFjZShtYXRjaGVyLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlLCBpbnRlcnBvbGF0ZSwgZXZhbHVhdGUsIG9mZnNldCkge1xuICAgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShlc2NhcGVSZWdFeHAsIGVzY2FwZUNoYXIpO1xuICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgIGlmIChlc2NhcGUpIHtcbiAgICAgICAgc291cmNlICs9IFwiJytcXG4oKF9fdD0oXCIgKyBlc2NhcGUgKyBcIikpPT1udWxsPycnOl8uZXNjYXBlKF9fdCkpK1xcbidcIjtcbiAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGUpIHtcbiAgICAgICAgc291cmNlICs9IFwiJytcXG4oKF9fdD0oXCIgKyBpbnRlcnBvbGF0ZSArIFwiKSk9PW51bGw/Jyc6X190KStcXG4nXCI7XG4gICAgICB9IGVsc2UgaWYgKGV2YWx1YXRlKSB7XG4gICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZSArIFwiXFxuX19wKz0nXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkb2JlIFZNcyBuZWVkIHRoZSBtYXRjaCByZXR1cm5lZCB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG9mZnNldC5cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcbiAgICBzb3VyY2UgKz0gXCInO1xcblwiO1xuXG4gICAgLy8gSWYgYSB2YXJpYWJsZSBpcyBub3Qgc3BlY2lmaWVkLCBwbGFjZSBkYXRhIHZhbHVlcyBpbiBsb2NhbCBzY29wZS5cbiAgICBpZiAoIXNldHRpbmdzLnZhcmlhYmxlKSBzb3VyY2UgPSAnd2l0aChvYmp8fHt9KXtcXG4nICsgc291cmNlICsgJ31cXG4nO1xuXG4gICAgc291cmNlID0gXCJ2YXIgX190LF9fcD0nJyxfX2o9QXJyYXkucHJvdG90eXBlLmpvaW4sXCIgK1xuICAgICAgXCJwcmludD1mdW5jdGlvbigpe19fcCs9X19qLmNhbGwoYXJndW1lbnRzLCcnKTt9O1xcblwiICtcbiAgICAgIHNvdXJjZSArICdyZXR1cm4gX19wO1xcbic7XG5cbiAgICB2YXIgcmVuZGVyO1xuICAgIHRyeSB7XG4gICAgICByZW5kZXIgPSBuZXcgRnVuY3Rpb24oc2V0dGluZ3MudmFyaWFibGUgfHwgJ29iaicsICdfJywgc291cmNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdmFyIHRlbXBsYXRlID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgcmV0dXJuIHJlbmRlci5jYWxsKHRoaXMsIGRhdGEsIF8pO1xuICAgIH07XG5cbiAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBzb3VyY2UgYXMgYSBjb252ZW5pZW5jZSBmb3IgcHJlY29tcGlsYXRpb24uXG4gICAgdmFyIGFyZ3VtZW50ID0gc2V0dGluZ3MudmFyaWFibGUgfHwgJ29iaic7XG4gICAgdGVtcGxhdGUuc291cmNlID0gJ2Z1bmN0aW9uKCcgKyBhcmd1bWVudCArICcpe1xcbicgKyBzb3VyY2UgKyAnfSc7XG5cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH07XG5cbiAgLy8gQWRkIGEgXCJjaGFpblwiIGZ1bmN0aW9uLiBTdGFydCBjaGFpbmluZyBhIHdyYXBwZWQgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8uY2hhaW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfKG9iaik7XG4gICAgaW5zdGFuY2UuX2NoYWluID0gdHJ1ZTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG5cbiAgLy8gT09QXG4gIC8vIC0tLS0tLS0tLS0tLS0tLVxuICAvLyBJZiBVbmRlcnNjb3JlIGlzIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBpdCByZXR1cm5zIGEgd3JhcHBlZCBvYmplY3QgdGhhdFxuICAvLyBjYW4gYmUgdXNlZCBPTy1zdHlsZS4gVGhpcyB3cmFwcGVyIGhvbGRzIGFsdGVyZWQgdmVyc2lvbnMgb2YgYWxsIHRoZVxuICAvLyB1bmRlcnNjb3JlIGZ1bmN0aW9ucy4gV3JhcHBlZCBvYmplY3RzIG1heSBiZSBjaGFpbmVkLlxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb250aW51ZSBjaGFpbmluZyBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgdmFyIGNoYWluUmVzdWx0ID0gZnVuY3Rpb24oaW5zdGFuY2UsIG9iaikge1xuICAgIHJldHVybiBpbnN0YW5jZS5fY2hhaW4gPyBfKG9iaikuY2hhaW4oKSA6IG9iajtcbiAgfTtcblxuICAvLyBBZGQgeW91ciBvd24gY3VzdG9tIGZ1bmN0aW9ucyB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8ubWl4aW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICBfLmVhY2goXy5mdW5jdGlvbnMob2JqKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBfW25hbWVdID0gb2JqW25hbWVdO1xuICAgICAgXy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbdGhpcy5fd3JhcHBlZF07XG4gICAgICAgIHB1c2guYXBwbHkoYXJncywgYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIGNoYWluUmVzdWx0KHRoaXMsIGZ1bmMuYXBwbHkoXywgYXJncykpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gXztcbiAgfTtcblxuICAvLyBBZGQgYWxsIG9mIHRoZSBVbmRlcnNjb3JlIGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlciBvYmplY3QuXG4gIF8ubWl4aW4oXyk7XG5cbiAgLy8gQWRkIGFsbCBtdXRhdG9yIEFycmF5IGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci5cbiAgXy5lYWNoKFsncG9wJywgJ3B1c2gnLCAncmV2ZXJzZScsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90b1tuYW1lXTtcbiAgICBfLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG9iaiA9IHRoaXMuX3dyYXBwZWQ7XG4gICAgICBtZXRob2QuYXBwbHkob2JqLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKChuYW1lID09PSAnc2hpZnQnIHx8IG5hbWUgPT09ICdzcGxpY2UnKSAmJiBvYmoubGVuZ3RoID09PSAwKSBkZWxldGUgb2JqWzBdO1xuICAgICAgcmV0dXJuIGNoYWluUmVzdWx0KHRoaXMsIG9iaik7XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gQWRkIGFsbCBhY2Nlc3NvciBBcnJheSBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXIuXG4gIF8uZWFjaChbJ2NvbmNhdCcsICdqb2luJywgJ3NsaWNlJ10sIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90b1tuYW1lXTtcbiAgICBfLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNoYWluUmVzdWx0KHRoaXMsIG1ldGhvZC5hcHBseSh0aGlzLl93cmFwcGVkLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9KTtcblxuICAvLyBFeHRyYWN0cyB0aGUgcmVzdWx0IGZyb20gYSB3cmFwcGVkIGFuZCBjaGFpbmVkIG9iamVjdC5cbiAgXy5wcm90b3R5cGUudmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JhcHBlZDtcbiAgfTtcblxuICAvLyBQcm92aWRlIHVud3JhcHBpbmcgcHJveHkgZm9yIHNvbWUgbWV0aG9kcyB1c2VkIGluIGVuZ2luZSBvcGVyYXRpb25zXG4gIC8vIHN1Y2ggYXMgYXJpdGhtZXRpYyBhbmQgSlNPTiBzdHJpbmdpZmljYXRpb24uXG4gIF8ucHJvdG90eXBlLnZhbHVlT2YgPSBfLnByb3RvdHlwZS50b0pTT04gPSBfLnByb3RvdHlwZS52YWx1ZTtcblxuICBfLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy5fd3JhcHBlZCk7XG4gIH07XG5cbiAgLy8gQU1EIHJlZ2lzdHJhdGlvbiBoYXBwZW5zIGF0IHRoZSBlbmQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBBTUQgbG9hZGVyc1xuICAvLyB0aGF0IG1heSBub3QgZW5mb3JjZSBuZXh0LXR1cm4gc2VtYW50aWNzIG9uIG1vZHVsZXMuIEV2ZW4gdGhvdWdoIGdlbmVyYWxcbiAgLy8gcHJhY3RpY2UgZm9yIEFNRCByZWdpc3RyYXRpb24gaXMgdG8gYmUgYW5vbnltb3VzLCB1bmRlcnNjb3JlIHJlZ2lzdGVyc1xuICAvLyBhcyBhIG5hbWVkIG1vZHVsZSBiZWNhdXNlLCBsaWtlIGpRdWVyeSwgaXQgaXMgYSBiYXNlIGxpYnJhcnkgdGhhdCBpc1xuICAvLyBwb3B1bGFyIGVub3VnaCB0byBiZSBidW5kbGVkIGluIGEgdGhpcmQgcGFydHkgbGliLCBidXQgbm90IGJlIHBhcnQgb2ZcbiAgLy8gYW4gQU1EIGxvYWQgcmVxdWVzdC4gVGhvc2UgY2FzZXMgY291bGQgZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBhblxuICAvLyBhbm9ueW1vdXMgZGVmaW5lKCkgaXMgY2FsbGVkIG91dHNpZGUgb2YgYSBsb2FkZXIgcmVxdWVzdC5cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKCd1bmRlcnNjb3JlJywgW10sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cbn0oKSk7XG4iXX0=
},{}]},{},[1])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJTY3JpcHRzL2FwcC5qcyIsIlNjcmlwdHMvYXBwL0FkbWluRXJyb3IvQWRtaW5FcnJvci5qcyIsIlNjcmlwdHMvYXBwL0FsbGVyZ2VuL0FsbGVyZ2VuLmpzIiwiU2NyaXB0cy9hcHAvQWxsZXJnZW4vQWxsZXJnZW5Sb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9BdXRoZW50aWNhdGlvbi9BdXRoZW50aWNhdGlvbi5qcyIsIlNjcmlwdHMvYXBwL0F1dGhlbnRpY2F0aW9uL0F1dGhlbnRpY2F0aW9uUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvQmFzZS9Gb3JtLmpzIiwiU2NyaXB0cy9hcHAvQmFzZS9Lb0JpbmRpbmdFeHRlbnNpb25zLmpzIiwiU2NyaXB0cy9hcHAvQmFzZS9Lb0JpbmRpbmdTZWxlY3QyLmpzIiwiU2NyaXB0cy9hcHAvQmFzZS9Sb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9CYXNlL1RhYmxlLmpzIiwiU2NyaXB0cy9hcHAvQmFzZS9WTUJhc2UuanMiLCJTY3JpcHRzL2FwcC9DYWxsVG9BY3Rpb24vQ2FsbFRvQWN0aW9uLmpzIiwiU2NyaXB0cy9hcHAvQ29tbW9uL01vZGFsLmpzIiwiU2NyaXB0cy9hcHAvQ29ubmVjdC9Db25uZWN0LmpzIiwiU2NyaXB0cy9hcHAvQ29ubmVjdC9Db25uZWN0Rm9ybS5qcyIsIlNjcmlwdHMvYXBwL0Nvbm5lY3QvQ29ubmVjdFJvdXRlci5qcyIsIlNjcmlwdHMvYXBwL0NvbnRhY3RVcy9Db250YWN0VXMuanMiLCJTY3JpcHRzL2FwcC9Db250YWN0VXMvQ29udGFjdFVzUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvQ29udGFjdC9Db250YWN0LmpzIiwiU2NyaXB0cy9hcHAvQ29udGFjdC9Db250YWN0Um91dGVyLmpzIiwiU2NyaXB0cy9hcHAvQ29udGVudFBhZ2VUcmVlVmlldy9Db250ZW50UGFnZVRyZWVWaWV3LmpzIiwiU2NyaXB0cy9hcHAvQ29udGVudFBhZ2UvQ29udGVudFBhZ2UuanMiLCJTY3JpcHRzL2FwcC9Db250ZW50UGFnZS9Db250ZW50UGFnZUJhc2UuanMiLCJTY3JpcHRzL2FwcC9Db250ZW50UGFnZS9Db250ZW50UGFnZUZvcm0uanMiLCJTY3JpcHRzL2FwcC9Db250ZW50UGFnZS9Db250ZW50UGFnZVJvdXRlci5qcyIsIlNjcmlwdHMvYXBwL0NvdXBvblJlZGVtcHRpb24vQ291cG9uUmVkZW1wdGlvbi5qcyIsIlNjcmlwdHMvYXBwL0NvdXBvbi9Db3Vwb24uanMiLCJTY3JpcHRzL2FwcC9EYXNoYm9hcmRWZXJzaW9uL0Rhc2hib2FyZFZlcnNpb24uanMiLCJTY3JpcHRzL2FwcC9EYXNoYm9hcmRWZXJzaW9uL0Rhc2hib2FyZFZlcnNpb25Gb3JtLmpzIiwiU2NyaXB0cy9hcHAvRGFzaGJvYXJkVmVyc2lvbi9EYXNoYm9hcmRWZXJzaW9uUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvRXJyb3IvRXJyb3IuanMiLCJTY3JpcHRzL2FwcC9GZWVkYmFja0tleXdvcmRMb2cvRmVlZGJhY2tLZXl3b3JkTG9nLmpzIiwiU2NyaXB0cy9hcHAvRmVlZGJhY2tLZXl3b3JkL0ZlZWRiYWNrS2V5d29yZC5qcyIsIlNjcmlwdHMvYXBwL0ZlZWRiYWNrS2V5d29yZC9GZWVkYmFja0tleXdvcmRSb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9GdW5kcmFpc2VyQmxhY2tvdXREYXRlL0Z1bmRyYWlzZXJCbGFja291dERhdGUuanMiLCJTY3JpcHRzL2FwcC9GdW5kcmFpc2VyQmxhY2tvdXREYXRlL0Z1bmRyYWlzZXJCbGFja291dERhdGVSb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9GdW5kcmFpc2VySW5xdWlyeS9GdW5kcmFpc2VySW5xdWlyeS5qcyIsIlNjcmlwdHMvYXBwL0Z1bmRyYWlzZXJJbnF1aXJ5L0Z1bmRyYWlzZXJJbnF1aXJ5Um91dGVyLmpzIiwiU2NyaXB0cy9hcHAvRnVuZHJhaXNlckxvZy9GdW5kcmFpc2VyTG9nLmpzIiwiU2NyaXB0cy9hcHAvRnVuZHJhaXNlckxvZ2luL0Z1bmRyYWlzZXJMb2dpbi5qcyIsIlNjcmlwdHMvYXBwL0Z1bmRyYWlzZXJMb2dpbi9GdW5kcmFpc2VyTG9naW5Gb3JtLmpzIiwiU2NyaXB0cy9hcHAvRnVuZHJhaXNlck1lbWJlci9GdW5kcmFpc2VyTWVtYmVyLmpzIiwiU2NyaXB0cy9hcHAvRnVuZHJhaXNlck1lbWJlci9GdW5kcmFpc2VyTWVtYmVyUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvRnVuZHJhaXNlclVuaXRFeGNlcHRpb24vRnVuZHJhaXNlclVuaXRFeGNlcHRpb24uanMiLCJTY3JpcHRzL2FwcC9GdW5kcmFpc2VyVW5pdEV4Y2VwdGlvbi9GdW5kcmFpc2VyVW5pdEV4Y2VwdGlvblJvdXRlci5qcyIsIlNjcmlwdHMvYXBwL0Z1bmRyYWlzZXIvRnVuZHJhaXNlci5qcyIsIlNjcmlwdHMvYXBwL0Z1bmRyYWlzZXIvRnVuZHJhaXNlclJvdXRlci5qcyIsIlNjcmlwdHMvYXBwL0dyaWRDb250ZW50UGFnZS9HcmlkQ29udGVudFBhZ2UuanMiLCJTY3JpcHRzL2FwcC9HcmlkQ29udGVudFBhZ2UvR3JpZENvbnRlbnRQYWdlRm9ybS5qcyIsIlNjcmlwdHMvYXBwL0hhbGZBbmRIYWxmL0hhbGZBbmRIYWxmLmpzIiwiU2NyaXB0cy9hcHAvSGFsZkFuZEhhbGYvSGFsZkFuZEhhbGZSb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9Ib21lU3RyZWFtL0hvbWVTdHJlYW0uanMiLCJTY3JpcHRzL2FwcC9Ib21lU3RyZWFtL0hvbWVTdHJlYW1Sb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9NZWFsL01lYWwuanMiLCJTY3JpcHRzL2FwcC9NZWRpYS9NZWRpYS5qcyIsIlNjcmlwdHMvYXBwL01lZGlhL01lZGlhUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvTWVudUNhdGVnb3J5L01lbnVDYXRlZ29yeS5qcyIsIlNjcmlwdHMvYXBwL01lbnVDYXRlZ29yeS9NZW51Q2F0ZWdvcnlSb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9NZW51SXRlbS9NZW51SXRlbS5qcyIsIlNjcmlwdHMvYXBwL01lbnVJdGVtL01lbnVJdGVtUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvTWVudS9NZW51LmpzIiwiU2NyaXB0cy9hcHAvTW9iaWxlRmVhdHVyZS9Nb2JpbGVGZWF0dXJlLmpzIiwiU2NyaXB0cy9hcHAvTnV0cml0aW9uL051dHJpdGlvbi5qcyIsIlNjcmlwdHMvYXBwL1BhbmRhRnVuZHJhaXNlckJsYWNrb3V0RGF0ZS9QYW5kYUZ1bmRyYWlzZXJCbGFja291dERhdGUuanMiLCJTY3JpcHRzL2FwcC9QYW5kYUZ1bmRyYWlzZXJNZW1iZXIvUGFuZGFGdW5kcmFpc2VyTWVtYmVyLmpzIiwiU2NyaXB0cy9hcHAvUGFuZGFGdW5kcmFpc2VyTWVtYmVyL1BhbmRhRnVuZHJhaXNlck1lbWJlckZvcm0uanMiLCJTY3JpcHRzL2FwcC9QYW5kYUZ1bmRyYWlzZXIvUGFuZGFGdW5kcmFpc2VyLmpzIiwiU2NyaXB0cy9hcHAvUGFuZGFGdW5kcmFpc2VyL1BhbmRhRnVuZHJhaXNlckZvcm0uanMiLCJTY3JpcHRzL2FwcC9QYW5kYUZ1bmRyYWlzZXIvUGFuZGFGdW5kcmFpc2VyUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvUHVibGljQ29udGVudFBhZ2UvUHVibGljQ29udGVudFBhZ2UuanMiLCJTY3JpcHRzL2FwcC9RdWVzdGlvbkFuc3dlci9RdWVzdGlvbkFuc3dlci5qcyIsIlNjcmlwdHMvYXBwL1JlZGlyZWN0VXJsL1JlZGlyZWN0VXJsLmpzIiwiU2NyaXB0cy9hcHAvUmVkaXJlY3RVcmwvUmVkaXJlY3RVcmxSb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9TaXRlTWFwL1NpdGVNYXAuanMiLCJTY3JpcHRzL2FwcC9TdG9yZUV4Y2VwdGlvbi9TdG9yZUV4Y2VwdGlvbi5qcyIsIlNjcmlwdHMvYXBwL1N0b3JlRXhjZXB0aW9uL1N0b3JlRXhjZXB0aW9uUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvU3RvcmUvU3RvcmUuanMiLCJTY3JpcHRzL2FwcC9TdG9yZS9TdG9yZVRhYmxlLmpzIiwiU2NyaXB0cy9hcHAvU3R5bGVHdWlkZS9TdHlsZUd1aWRlLmpzIiwiU2NyaXB0cy9hcHAvU3lzdGVtQ29udGVudFBhZ2UvU3lzdGVtQ29udGVudFBhZ2UuanMiLCJTY3JpcHRzL2FwcC9TeXN0ZW1Db250ZW50UGFnZS9TeXN0ZW1Db250ZW50UGFnZUZvcm0uanMiLCJTY3JpcHRzL2FwcC9Vc2VyTG9jYXRpb24vVXNlckxvY2F0aW9uLmpzIiwiU2NyaXB0cy9hcHAvVXNlci9Vc2VyLmpzIiwiU2NyaXB0cy9hcHAvVXNlci9Vc2VyUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvVmVuZG9yL1ZlbmRvci5qcyIsIlNjcmlwdHMvYXBwL1Zpc2l0b3JTY2hlZHVsZWRNZWV0aW5nL1Zpc2l0b3JTY2hlZHVsZWRNZWV0aW5nLmpzIiwiU2NyaXB0cy9hcHAvWWVscFJldmlldy9ZZWxwUmV2aWV3LmpzIiwiU2NyaXB0cy9hcHAvWWVscFJldmlldy9ZZWxwUmV2aWV3VGFibGUuanMiLCJTY3JpcHRzL2xpYi9qcXVlcnkuaXNsb2FkaW5nLmpzIiwiU2NyaXB0cy9saWIvbW9tZW50LWRhdGVwaWNrZXIta28uanMiLCJTY3JpcHRzL2xpYi9tb21lbnQtZGF0ZXBpY2tlci5qcyIsIlNjcmlwdHMvbGliL3NhbW15LmpzIiwiU2NyaXB0cy9saWIvc2VsZWN0Mi4zLjQuMi5qcyIsIlNjcmlwdHMvbGliL3N1bW1lcm5vdGUuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2Rpc3QvanMvbnBtLmpzIiwibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9hZmZpeC5qcyIsIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvYWxlcnQuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2J1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvY2Fyb3VzZWwuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2NvbGxhcHNlLmpzIiwibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kcm9wZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvbW9kYWwuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3BvcG92ZXIuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3Njcm9sbHNweS5qcyIsIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvdGFiLmpzIiwibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy90b29sdGlwLmpzIiwibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy90cmFuc2l0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2pxdWVyeS9kaXN0L2pxdWVyeS5qcyIsIm5vZGVfbW9kdWxlcy9rbm9ja291dC5tYXBwaW5nL2tub2Nrb3V0Lm1hcHBpbmcuanMiLCJub2RlX21vZHVsZXMva25vY2tvdXQvYnVpbGQvb3V0cHV0L2tub2Nrb3V0LWxhdGVzdC5kZWJ1Zy5qcyIsIm5vZGVfbW9kdWxlcy9tb21lbnQvbW9tZW50LmpzIiwibm9kZV9tb2R1bGVzL3VuZGVyc2NvcmUvdW5kZXJzY29yZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzliQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNW1FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0cEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xsTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25WQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2h3VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDenpCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuMktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzE1SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLy8vIFRoaXMgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IE9yYW5nZSBPbmlvbiBTY2FmZm9sZGVyLlxyXG4vLyB0ZW1wbGF0ZTogTVZDLlRTQXBwLmNzXHJcbi8vIGNsYXNzOiBSZWRpcmVjdFVybFxyXG5wYW5kYSA9IHt9O1xyXG52YXIgQXV0aGVudGljYXRpb24gPSByZXF1aXJlKFwiLi9hcHAvQXV0aGVudGljYXRpb24vQXV0aGVudGljYXRpb25cIik7XHJcbnBhbmRhLkF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb247XHJcbnZhciBDYWxsVG9BY3Rpb24gPSByZXF1aXJlKCcuL2FwcC9DYWxsVG9BY3Rpb24vQ2FsbFRvQWN0aW9uJyk7XHJcbnBhbmRhLkNhbGxUb0FjdGlvbiA9IENhbGxUb0FjdGlvbjtcclxudmFyIENvbnRhY3QgPSByZXF1aXJlKCcuL2FwcC9Db250YWN0L0NvbnRhY3QnKTtcclxucGFuZGEuQ29udGFjdCA9IENvbnRhY3Q7XHJcbnZhciBDb250ZW50UGFnZSA9IHJlcXVpcmUoJy4vYXBwL0NvbnRlbnRQYWdlL0NvbnRlbnRQYWdlJyk7XHJcbnBhbmRhLkNvbnRlbnRQYWdlID0gQ29udGVudFBhZ2U7XHJcbnZhciBIb21lU3RyZWFtID0gcmVxdWlyZSgnLi9hcHAvSG9tZVN0cmVhbS9Ib21lU3RyZWFtJyk7XHJcbnBhbmRhLkhvbWVTdHJlYW0gPSBIb21lU3RyZWFtO1xyXG52YXIgRGFzaGJvYXJkVmVyc2lvbiA9IHJlcXVpcmUoJy4vYXBwL0Rhc2hib2FyZFZlcnNpb24vRGFzaGJvYXJkVmVyc2lvbicpO1xyXG5wYW5kYS5EYXNoYm9hcmRWZXJzaW9uID0gRGFzaGJvYXJkVmVyc2lvbjtcclxudmFyIE1lZGlhID0gcmVxdWlyZSgnLi9hcHAvTWVkaWEvTWVkaWEnKTtcclxucGFuZGEuTWVkaWFMaWJyYXJ5ID0gTWVkaWE7XHJcbnZhciBDb250ZW50UGFnZVRyZWVWaWV3ID0gcmVxdWlyZSgnLi9hcHAvQ29udGVudFBhZ2VUcmVlVmlldy9Db250ZW50UGFnZVRyZWVWaWV3Jyk7XHJcbnBhbmRhLkNvbnRlbnRQYWdlVHJlZVZpZXcgPSBDb250ZW50UGFnZVRyZWVWaWV3O1xyXG52YXIgQ291cG9uID0gcmVxdWlyZSgnLi9hcHAvQ291cG9uL0NvdXBvbicpO1xyXG5wYW5kYS5Db3Vwb24gPSBDb3Vwb247XHJcbnZhciBDb3Vwb25SZWRlbXB0aW9uID0gcmVxdWlyZSgnLi9hcHAvQ291cG9uUmVkZW1wdGlvbi9Db3Vwb25SZWRlbXB0aW9uJyk7XHJcbnBhbmRhLkNvdXBvblJlZGVtcHRpb24gPSBDb3Vwb25SZWRlbXB0aW9uO1xyXG52YXIgRnVuZHJhaXNlciA9IHJlcXVpcmUoJy4vYXBwL0Z1bmRyYWlzZXIvRnVuZHJhaXNlcicpO1xyXG5wYW5kYS5GdW5kcmFpc2VyID0gRnVuZHJhaXNlcjtcclxudmFyIEZ1bmRyYWlzZXJCbGFja291dERhdGUgPSByZXF1aXJlKCcuL2FwcC9GdW5kcmFpc2VyQmxhY2tvdXREYXRlL0Z1bmRyYWlzZXJCbGFja291dERhdGUnKTtcclxucGFuZGEuRnVuZHJhaXNlckJsYWNrb3V0RGF0ZSA9IEZ1bmRyYWlzZXJCbGFja291dERhdGU7XHJcbnZhciBGdW5kcmFpc2VyTWVtYmVyID0gcmVxdWlyZSgnLi9hcHAvRnVuZHJhaXNlck1lbWJlci9GdW5kcmFpc2VyTWVtYmVyJyk7XHJcbnBhbmRhLkZ1bmRyYWlzZXJNZW1iZXIgPSBGdW5kcmFpc2VyTWVtYmVyO1xyXG52YXIgRnVuZHJhaXNlclVuaXRFeGNlcHRpb24gPSByZXF1aXJlKCcuL2FwcC9GdW5kcmFpc2VyVW5pdEV4Y2VwdGlvbi9GdW5kcmFpc2VyVW5pdEV4Y2VwdGlvbicpO1xyXG5wYW5kYS5GdW5kcmFpc2VyVW5pdEV4Y2VwdGlvbiA9IEZ1bmRyYWlzZXJVbml0RXhjZXB0aW9uO1xyXG52YXIgR3JpZENvbnRlbnRQYWdlID0gcmVxdWlyZSgnLi9hcHAvR3JpZENvbnRlbnRQYWdlL0dyaWRDb250ZW50UGFnZScpO1xyXG5wYW5kYS5HcmlkQ29udGVudFBhZ2UgPSBHcmlkQ29udGVudFBhZ2U7XHJcbnZhciBIYWxmQW5kSGFsZiA9IHJlcXVpcmUoJy4vYXBwL0hhbGZBbmRIYWxmL0hhbGZBbmRIYWxmJyk7XHJcbnBhbmRhLkhhbGZBbmRIYWxmID0gSGFsZkFuZEhhbGY7XHJcbnZhciBNZWFsID0gcmVxdWlyZSgnLi9hcHAvTWVhbC9NZWFsJyk7XHJcbnBhbmRhLk1lYWwgPSBNZWFsO1xyXG52YXIgTWVudUNhdGVnb3J5ID0gcmVxdWlyZSgnLi9hcHAvTWVudUNhdGVnb3J5L01lbnVDYXRlZ29yeScpO1xyXG5wYW5kYS5NZW51Q2F0ZWdvcnkgPSBNZW51Q2F0ZWdvcnk7XHJcbnZhciBNZW51SXRlbSA9IHJlcXVpcmUoJy4vYXBwL01lbnVJdGVtL01lbnVJdGVtJyk7XHJcbnBhbmRhLk1lbnVJdGVtID0gTWVudUl0ZW07XHJcbnZhciBNb2JpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi9hcHAvTW9iaWxlRmVhdHVyZS9Nb2JpbGVGZWF0dXJlJyk7XHJcbnBhbmRhLk1vYmlsZUZlYXR1cmUgPSBNb2JpbGVGZWF0dXJlO1xyXG52YXIgUXVlc3Rpb25BbnN3ZXIgPSByZXF1aXJlKCcuL2FwcC9RdWVzdGlvbkFuc3dlci9RdWVzdGlvbkFuc3dlcicpO1xyXG5wYW5kYS5RdWVzdGlvbkFuc3dlciA9IFF1ZXN0aW9uQW5zd2VyO1xyXG52YXIgUmVkaXJlY3RVcmwgPSByZXF1aXJlKCcuL2FwcC9SZWRpcmVjdFVybC9SZWRpcmVjdFVybCcpO1xyXG5wYW5kYS5SZWRpcmVjdFVybCA9IFJlZGlyZWN0VXJsO1xyXG52YXIgU3RvcmUgPSByZXF1aXJlKCcuL2FwcC9TdG9yZS9TdG9yZScpO1xyXG5wYW5kYS5TdG9yZSA9IFN0b3JlO1xyXG52YXIgU3RvcmVFeGNlcHRpb24gPSByZXF1aXJlKCcuL2FwcC9TdG9yZUV4Y2VwdGlvbi9TdG9yZUV4Y2VwdGlvbicpO1xyXG5wYW5kYS5TdG9yZUV4Y2VwdGlvbiA9IFN0b3JlRXhjZXB0aW9uO1xyXG52YXIgU3lzdGVtQ29udGVudFBhZ2UgPSByZXF1aXJlKCcuL2FwcC9TeXN0ZW1Db250ZW50UGFnZS9TeXN0ZW1Db250ZW50UGFnZScpO1xyXG5wYW5kYS5TeXN0ZW1Db250ZW50UGFnZSA9IFN5c3RlbUNvbnRlbnRQYWdlO1xyXG52YXIgVXNlciA9IHJlcXVpcmUoJy4vYXBwL1VzZXIvVXNlcicpO1xyXG5wYW5kYS5Vc2VyID0gVXNlcjtcclxudmFyIFVzZXJMb2NhdGlvbiA9IHJlcXVpcmUoJy4vYXBwL1VzZXJMb2NhdGlvbi9Vc2VyTG9jYXRpb24nKTtcclxucGFuZGEuVXNlckxvY2F0aW9uID0gVXNlckxvY2F0aW9uO1xyXG52YXIgQ29ubmVjdCA9IHJlcXVpcmUoJy4vYXBwL0Nvbm5lY3QvQ29ubmVjdCcpO1xyXG5wYW5kYS5Db25uZWN0VXMgPSBDb25uZWN0O1xyXG52YXIgQ29udGFjdFVzID0gcmVxdWlyZSgnLi9hcHAvQ29udGFjdFVzL0NvbnRhY3RVcycpO1xyXG5wYW5kYS5Db250YWN0VXMgPSBDb250YWN0VXM7XHJcbnZhciBGdW5kcmFpc2VyTG9naW4gPSByZXF1aXJlKCcuL2FwcC9GdW5kcmFpc2VyTG9naW4vRnVuZHJhaXNlckxvZ2luJyk7XHJcbnBhbmRhLkZ1bmRyYWlzZXJMb2dpbiA9IEZ1bmRyYWlzZXJMb2dpbjtcclxudmFyIE1lbnUgPSByZXF1aXJlKCcuL2FwcC9NZW51L01lbnUnKTtcclxucGFuZGEuTWVudSA9IE1lbnU7XHJcbnZhciBQYW5kYUZ1bmRyYWlzZXIgPSByZXF1aXJlKCcuL2FwcC9QYW5kYUZ1bmRyYWlzZXIvUGFuZGFGdW5kcmFpc2VyJyk7XHJcbnBhbmRhLlBhbmRhRnVuZHJhaXNlciA9IFBhbmRhRnVuZHJhaXNlcjtcclxudmFyIFBhbmRhRnVuZHJhaXNlckJsYWNrb3V0RGF0ZSA9IHJlcXVpcmUoJy4vYXBwL1BhbmRhRnVuZHJhaXNlckJsYWNrb3V0RGF0ZS9QYW5kYUZ1bmRyYWlzZXJCbGFja291dERhdGUnKTtcclxucGFuZGEuUGFuZGFGdW5kcmFpc2VyQmxhY2tvdXREYXRlID0gUGFuZGFGdW5kcmFpc2VyQmxhY2tvdXREYXRlO1xyXG52YXIgUGFuZGFGdW5kcmFpc2VyTWVtYmVyID0gcmVxdWlyZSgnLi9hcHAvUGFuZGFGdW5kcmFpc2VyTWVtYmVyL1BhbmRhRnVuZHJhaXNlck1lbWJlcicpO1xyXG5wYW5kYS5QYW5kYUZ1bmRyYWlzZXJNZW1iZXIgPSBQYW5kYUZ1bmRyYWlzZXJNZW1iZXI7XHJcbnZhciBQdWJsaWNDb250ZW50UGFnZSA9IHJlcXVpcmUoJy4vYXBwL1B1YmxpY0NvbnRlbnRQYWdlL1B1YmxpY0NvbnRlbnRQYWdlJyk7XHJcbnBhbmRhLlB1YmxpY0NvbnRlbnRQYWdlID0gUHVibGljQ29udGVudFBhZ2U7XHJcbnZhciBFcnJvciA9IHJlcXVpcmUoJy4vYXBwL0Vycm9yL0Vycm9yJyk7XHJcbnBhbmRhLkVycm9yID0gRXJyb3I7XHJcbnZhciBBZG1pbkVycm9yID0gcmVxdWlyZSgnLi9hcHAvQWRtaW5FcnJvci9BZG1pbkVycm9yJyk7XHJcbnBhbmRhLkFkbWluRXJyb3IgPSBBZG1pbkVycm9yO1xyXG52YXIgU3R5bGVHdWlkZSA9IHJlcXVpcmUoJy4vYXBwL1N0eWxlR3VpZGUvU3R5bGVHdWlkZScpO1xyXG5wYW5kYS5TdHlsZUd1aWRlID0gU3R5bGVHdWlkZTtcclxudmFyIFNpdGVNYXAgPSByZXF1aXJlKCcuL2FwcC9TaXRlTWFwL1NpdGVNYXAnKTtcclxucGFuZGEuU2l0ZU1hcCA9IFNpdGVNYXA7XHJcbnZhciBGZWVkYmFja0tleXdvcmQgPSByZXF1aXJlKCcuL2FwcC9GZWVkYmFja0tleXdvcmQvRmVlZGJhY2tLZXl3b3JkJyk7XHJcbnBhbmRhLkZlZWRiYWNrS2V5d29yZCA9IEZlZWRiYWNrS2V5d29yZDtcclxudmFyIFZlbmRvciA9IHJlcXVpcmUoJy4vYXBwL1ZlbmRvci9WZW5kb3InKTtcclxucGFuZGEuVmVuZG9yID0gVmVuZG9yO1xyXG52YXIgRmVlZGJhY2tLZXl3b3JkTG9nID0gcmVxdWlyZSgnLi9hcHAvRmVlZGJhY2tLZXl3b3JkTG9nL0ZlZWRiYWNrS2V5d29yZExvZycpO1xyXG5wYW5kYS5GZWVkYmFja0tleXdvcmRMb2cgPSBGZWVkYmFja0tleXdvcmRMb2c7XHJcbnZhciBBbGxlcmdlbiA9IHJlcXVpcmUoJy4vYXBwL0FsbGVyZ2VuL0FsbGVyZ2VuJyk7XHJcbnBhbmRhLkFsbGVyZ2VuID0gQWxsZXJnZW47XHJcbnZhciBGdW5kcmFpc2VyTG9nID0gcmVxdWlyZSgnLi9hcHAvRnVuZHJhaXNlckxvZy9GdW5kcmFpc2VyTG9nJyk7XHJcbnBhbmRhLkZ1bmRyYWlzZXJMb2cgPSBGdW5kcmFpc2VyTG9nO1xyXG52YXIgRnVuZHJhaXNlcklucXVpcnkgPSByZXF1aXJlKCcuL2FwcC9GdW5kcmFpc2VySW5xdWlyeS9GdW5kcmFpc2VySW5xdWlyeScpO1xyXG5wYW5kYS5GdW5kcmFpc2VySW5xdWlyeSA9IEZ1bmRyYWlzZXJJbnF1aXJ5O1xyXG52YXIgWWVscFJldmlldyA9IHJlcXVpcmUoJy4vYXBwL1llbHBSZXZpZXcvWWVscFJldmlldycpO1xyXG5wYW5kYS5ZZWxwUmV2aWV3ID0gWWVscFJldmlldztcclxudmFyIFZpc2l0b3JTY2hlZHVsZWRNZWV0aW5nID0gcmVxdWlyZSgnLi9hcHAvVmlzaXRvclNjaGVkdWxlZE1lZXRpbmcvVmlzaXRvclNjaGVkdWxlZE1lZXRpbmcnKTtcclxucGFuZGEuVmlzaXRvclNjaGVkdWxlZE1lZXRpbmcgPSBWaXNpdG9yU2NoZWR1bGVkTWVldGluZztcclxudmFyIE51dHJpdGlvbiA9IHJlcXVpcmUoJy4vYXBwL051dHJpdGlvbi9OdXRyaXRpb24nKTtcclxucGFuZGEuTnV0cml0aW9uID0gTnV0cml0aW9uO1xyXG5cclxuZG9jdW1lbnQub25rZXlkb3duID0gZnVuY3Rpb24gKGUpIHtcclxuICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2VudGVyJyk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gICAgfVxyXG59OyIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNsYXNzIEFkbWluRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgLy8gc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQWRtaW5FcnJvcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vLyBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBPcmFuZ2UgT25pb24gU2NhZmZvbGRlci5cclxuLy8gdGVtcGxhdGU6IE1WQy5KU01vZHVsZS5jc1xyXG4vLyBjbGFzczogQWxsZXJnZW5cclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBBbGxlcmdlblJvdXRlciA9IHJlcXVpcmUoXCIuL0FsbGVyZ2VuUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgQWxsZXJnZW4gZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgQWxsZXJnZW5Sb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEFsbGVyZ2VuO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBBbGxlcmdlblJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3ZpZXcvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2luZGV4YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvZGVsZXRlLzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5kZWxldGVJdGVtKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBBbGxlcmdlblJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNvbnN0IEF1dGhlbnRpY2F0aW9uUm91dGVyMSA9IHJlcXVpcmUoXCIuL0F1dGhlbnRpY2F0aW9uUm91dGVyXCIpO1xyXG5jbGFzcyBBdXRoZW50aWNhdGlvbiBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBBdXRoZW50aWNhdGlvblJvdXRlcjEpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5GaWx0ZXJzID0gbnVsbDtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgICAgICAkKCcjbG9naW4tYnV0dG9uJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzZWxmLkFsZXJ0cyhbXSk7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSAnL0FkbWluL0F1dGhlbnRpY2F0aW9uL0xvZ2luJztcclxuICAgICAgICAgICAgdmFyIG1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICAgICAnaWdub3JlJzogdGhpcy5kYXRhLktPTWFwcGluZy5hbGxOb25Qb3N0QmFja1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB2YXIgcG9zdERhdGEgPSBrby5tYXBwaW5nLnRvSlModGhpcywgbWFwcGluZyk7XHJcbiAgICAgICAgICAgICQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgICAgIHRoaXMuSXNMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhKSxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04J1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcHJvbWlzZS5mYWlsKGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgLy9zb21ldGhpbmcgd2VudCB3cm9uZyBkaXNwbGF5IGVycm9yXHJcbiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGVycm9yLmVycm9yKCkucmVzcG9uc2VUZXh0O1xyXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5odG1sKGh0bWwpO1xyXG4gICAgICAgICAgICAgICAgJCgnc3R5bGUnLCBlbGVtZW50KS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIHZhciBodG1sVGV4dCA9IGVsZW1lbnQuaHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5BZGRBbGVydChodG1sVGV4dCwgJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLkxvZ2luU3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5SZXR1cm5Vcmw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLkFkZEFsZXJ0KGRhdGEuTWVzc2FnZSwgJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZWxmLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcjZm9yZ290LXBhc3N3b3JkLWJ1dHRvbicpLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgc2VsZi5BbGVydHMucmVtb3ZlQWxsKCk7XHJcbiAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvQWRtaW4vQXV0aGVudGljYXRpb24vRm9yZ290UGFzc3dvcmQ/ZW1haWw9JyArICQoJyNJdGVtRGV0YWlsX0VtYWlsJykudmFsKCksXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAvL3NvbWV0aGluZyB3ZW50IHdyb25nIGRpc3BsYXkgZXJyb3JcclxuICAgICAgICAgICAgICAgIHZhciBtc2cgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlSlNPTi5NZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5odG1sKG1zZyk7XHJcbiAgICAgICAgICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGh0bWxUZXh0ID0gZWxlbWVudC5odG1sKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkFkZEFsZXJ0KGh0bWxUZXh0LCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkFkZEFsZXJ0KGRhdGEuTWVzc2FnZSwgJ3N1Y2Nlc3MnKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuU2hvd0ZvcmdvdFBhc3N3b3JkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyMvaW5kZXgnO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnI3Jlc2V0LXBhc3N3b3JkLWJ1dHRvbicpLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgc2VsZi5BbGVydHMucmVtb3ZlQWxsKCk7XHJcbiAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICB2YXIgbWFwcGluZyA9IHtcclxuICAgICAgICAgICAgICAgICdpZ25vcmUnOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZhciBwb3N0RGF0YSA9IGtvLm1hcHBpbmcudG9KUyh0aGlzLCBtYXBwaW5nKTtcclxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL0FkbWluL0F1dGhlbnRpY2F0aW9uL1Jlc2V0UGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdERhdGEpLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnLFxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcHJvbWlzZS5mYWlsKGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgLy9zb21ldGhpbmcgd2VudCB3cm9uZyBkaXNwbGF5IGVycm9yXHJcbiAgICAgICAgICAgICAgICAvL3ZhciBtc2cgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlSlNPTi5NZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgJC5lYWNoKGVycm9yLnJlc3BvbnNlSlNPTi5Nb2RlbFN0YXRlLlByb3BlcnR5RXJyb3JzLCBmdW5jdGlvbiAoaywgdikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gJCgnPGRpdi8+JykuaHRtbCh2LkVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnc3R5bGUnLCBlbGVtZW50KS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbFRleHQgPSBlbGVtZW50Lmh0bWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLkFkZEFsZXJ0KGh0bWxUZXh0LCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAkLmVhY2goZXJyb3IucmVzcG9uc2VKU09OLk1vZGVsU3RhdGUuTW9kZWxFcnJvcnMsIGZ1bmN0aW9uIChrLCB2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5odG1sKHYuRXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBodG1sVGV4dCA9IGVsZW1lbnQuaHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuQWRkQWxlcnQoaHRtbFRleHQsIFwiZXJyb3JcIik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZShmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5BZGRBbGVydChkYXRhLk1lc3NhZ2UsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLlNob3dGb3Jnb3RQYXNzd29yZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLlNob3dSZXNldFBhc3N3b3JkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyMvaW5kZXgnO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJChkb2N1bWVudCkub24oJ2tleXVwJywgKGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IDEzKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuUGFzc3dvcmQoJCgnI3Bhc3N3b3JkLXRleHQnKS52YWwoKSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuRW1haWwoJCgnI0l0ZW1EZXRhaWxfRW1haWwnKS52YWwoKSk7XHJcbiAgICAgICAgICAgICAgICAkKCcjbG9naW4tYnV0dG9uJykuY2xpY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQXV0aGVudGljYXRpb247XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIEF1dGhlbnRpY2F0aW9uUm91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnL0FkbWluL0F1dGhlbnRpY2F0aW9uIy9pbmRleCcsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uU2hvd0ZvcmdvdFBhc3N3b3JkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnL0FkbWluL0F1dGhlbnRpY2F0aW9uIy9mb3Jnb3RwYXNzd29yZCcsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uU2hvd0ZvcmdvdFBhc3N3b3JkKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICcvQWRtaW4vQXV0aGVudGljYXRpb24jL3Jlc2V0cGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dGb3Jnb3RQYXNzd29yZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93UmVzZXRQYXNzd29yZCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEF1dGhlbnRpY2F0aW9uUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbnZhciBKUXVlcnkgPSAkO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3Qga29tYXBwaW5nID0gcmVxdWlyZShcImtub2Nrb3V0Lm1hcHBpbmdcIik7XHJcbmtvLm1hcHBpbmcgPSBrb21hcHBpbmc7XHJcbmNvbnN0IF8gPSByZXF1aXJlKFwidW5kZXJzY29yZVwiKTtcclxuY29uc3QgYm9vdHN0cmFwID0gcmVxdWlyZShcImJvb3RzdHJhcFwiKTtcclxuYm9vdHN0cmFwO1xyXG5jb25zdCBpc0xvYWRpbmcgPSByZXF1aXJlKFwianF1ZXJ5LWlzbG9hZGluZ1wiKTtcclxuaXNMb2FkaW5nO1xyXG5jbGFzcyBGb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBlZGl0QWN0aW9uID0gJ0VkaXQnKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICAgICAgdGhpcy5lZGl0QWN0aW9uID0gZWRpdEFjdGlvbjtcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXJVcmwgPSBgLyR7ZGF0YS5UaXRsZX1gO1xyXG4gICAgICAgIHRoaXMudGFiUm93U2VsZWN0b3IgPSAnLm1haW4tbW9kYWwtZm9ybSBmb3JtID4gLnJvdyc7XHJcbiAgICAgICAgdGhpcy5hcmVhID0gdGhpcy5kYXRhLkFyZWEgPyBgLyR7dGhpcy5kYXRhLkFyZWF9YCA6ICcnO1xyXG4gICAgICAgIHRoaXMuZ2V0VXJsID0gYCR7dGhpcy5hcmVhfS8ke2RhdGEuVGl0bGV9L0l0ZW1gO1xyXG4gICAgICAgIHRoaXMucG9zdFVybCA9IGAke3RoaXMuYXJlYX0vJHt0aGlzLmRhdGEuVGl0bGV9LyR7dGhpcy5lZGl0QWN0aW9ufWA7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAobmV3VmFsdWUpXHJcbiAgICAgICAgICAgICAgICAkLmlzTG9hZGluZyh7XHJcbiAgICAgICAgICAgICAgICAgICAgJ3RleHQnOiAnU2VuZGluZy4uLi5wbGVhc2UgZG9uXFwndCByZWZyZXNoIG9yIGNsb3NlIHlvdXIgd2luZG93J1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICQuaXNMb2FkaW5nKCdoaWRlJyk7XHJcbiAgICAgICAgfSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXR1cEJpbmRpZ3MoKTtcclxuICAgICAgICB0aGlzLnNldHVwVGFicygpO1xyXG4gICAgfVxyXG4gICAgLy9wb3N0VXJsKCk6IHN0cmluZyB7XHJcbiAgICAvLyAgICByZXR1cm4gYCR7dGhpcy5hcmVhKCkgfS8ke3RoaXMuZGF0YS5UaXRsZX0vJHt0aGlzLmVkaXRBY3Rpb259YDtcclxuICAgIC8vfVxyXG4gICAgLy9hcmVhKCk6IHN0cmluZyB7XHJcbiAgICAvLyAgICByZXR1cm4gdGhpcy5kYXRhLkFyZWEgPyBgLyR7dGhpcy5kYXRhLkFyZWF9YCA6ICcnO1xyXG4gICAgLy99XHJcbiAgICBzZXR1cEJpbmRpZ3MoKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vdGFiIGNsaWNrIHNldHVwXHJcbiAgICAgICAgJCgnLm1vZGFsZm9ybS1ob2xkZXInKS5vbignY2xpY2snLCAnLmZvcm0tdGFiLW5hdicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLy9zZXQgY2xpY2tlZCBvbmUgdG8gYWN0aXZlXHJcbiAgICAgICAgICAgIHZhciBmb3JtVGFiID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHZhciBpbmRleCA9IF8uaW5kZXhPZihzZWxmLnZtLkZvcm1UYWJzKCksIGZvcm1UYWIpO1xyXG4gICAgICAgICAgICBzZWxmLnZtLkFjdGl2ZVRhYkluZGV4KGluZGV4KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZScsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3N0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcuaW5kZXhmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZScsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3N0SW5kZXgoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5mb3JtLWJvZHknKS5vbignY2xpY2snLCAnI2NvbmZpcm0tZGVsZXRlJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1EZWxldGUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2V0dXBDbGVhclZhbGlkYXRpb24ocHJvcGVydHkpIHtcclxuICAgICAgICAvL2dldCBwcm9wZXJ0eSBvZmYgb2Ygdm0gdXNpbmcgc3RyaW5nIG5hbWUgY29taW5nIGZyb20gc2VydmVyXHJcbiAgICAgICAgdmFyIHZtUHJvcGVydHkgPSB0aGlzLmdldFZtUHJvcGVydHkocHJvcGVydHkpO1xyXG4gICAgICAgIGlmIChrby5pc09ic2VydmFibGUodm1Qcm9wZXJ0eSkpIHtcclxuICAgICAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHZtUHJvcGVydHkuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFcnJvcihwcm9wZXJ0eSk7XHJcbiAgICAgICAgICAgICAgICAvL2dldCByaWQgb2Ygc3Vic2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25maXJtRGVsZXRlKCkge1xyXG4gICAgICAgIHRoaXMuZWRpdEFjdGlvbiA9ICdEZWxldGUnO1xyXG4gICAgICAgIHRoaXMucG9zdFVybCA9IGAke3RoaXMuYXJlYX0vJHt0aGlzLmRhdGEuVGl0bGV9LyR7dGhpcy5lZGl0QWN0aW9ufWA7XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLnBvc3QoKTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAkKCcjZGVsZXRlLW1vZGFsJykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAgICAgdGhpcy5lZGl0QWN0aW9uID0gJ0VkaXQnO1xyXG4gICAgICAgICAgICB0aGlzLnBvc3RVcmwgPSBgJHt0aGlzLmFyZWF9LyR7dGhpcy5kYXRhLlRpdGxlfS8ke3RoaXMuZWRpdEFjdGlvbn1gO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9wb3N0VXJsKCkge1xyXG4gICAgLy8gICAgcmV0dXJuIGAke3RoaXMuYXJlYX0vJHt0aGlzLmRhdGEuVGl0bGV9LyR7dGhpcy5lZGl0QWN0aW9ufWA7XHJcbiAgICAvL31cclxuICAgIC8vYXJlYSgpIHtcclxuICAgIC8vICAgIHJldHVybiB0aGlzLmRhdGEuQXJlYSA/IGAvJHt0aGlzLmRhdGEuQXJlYX1gIDogJyc7XHJcbiAgICAvL31cclxuICAgIHJlbW92ZUVycm9yKHByb3BlcnR5KSB7XHJcbiAgICAgICAgLy9wcm9wZXJ0eSBpZCBoYXMgXyBpbnN0ZWFkIG9mIC5cclxuICAgICAgICB2YXIgZm9ybWlucHV0ID0gJCgnIycgKyBwcm9wZXJ0eS5yZXBsYWNlKC9cXC4vZywgJ18nKSk7XHJcbiAgICAgICAgJChcIiNlcnJvcl9tZXNzYWdlX1wiICsgcHJvcGVydHkucmVwbGFjZSgvXFwuL2csICdfJykpLmVtcHR5KCk7XHJcbiAgICAgICAgLy9zZWxlY3QyIHVzZXMgcGFyZW50XHJcbiAgICAgICAgaWYgKGZvcm1pbnB1dC5oYXNDbGFzcygnc2VsZWN0Mi1vZmZzY3JlZW4nKSkge1xyXG4gICAgICAgICAgICBmb3JtaW5wdXQgPSAkKCcuc2VsZWN0Mi1jb250YWluZXInLCBmb3JtaW5wdXQucGFyZW50KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL3JlbW92ZSBlcnJvciBjbGFzcyB0byBwYXJlbnQgZWxlbWVudFxyXG4gICAgICAgIHZhciBmb3JtR3JvdXAgPSBmb3JtaW5wdXQucGFyZW50KCk7XHJcbiAgICAgICAgZm9ybUdyb3VwLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3IgaGFzLWZlZWRiYWNrJyk7XHJcbiAgICAgICAgLy9yZW1vdmUgYm9vdHNyYXAgcG9wb3ZlclxyXG4gICAgICAgIGlmICgoZm9ybWlucHV0KS5hdHRyKCdkYXRhLXRyaWdnZXInKSkge1xyXG4gICAgICAgICAgICBmb3JtaW5wdXRcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLXRyaWdnZXInKVxyXG4gICAgICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtcGxhY2VtZW50JylcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLWNvbnRlbnQnKVxyXG4gICAgICAgICAgICAgICAgLnBvcG92ZXIoJ2Rlc3Ryb3knKSAvL3RvZG8gYm9vdHN0cmFwIHBvcG92ZXJcclxuICAgICAgICAgICAgO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL3JlbW92ZSBwb3BvdmVyIGVsZW1lbnRcclxuICAgICAgICAkKCcuZm9ybS1jb250cm9sLWZlZWRiYWNrJywgZm9ybUdyb3VwKS5yZW1vdmUoKTtcclxuICAgICAgICAvL2dldCByaWQgb2Ygc3Vic2NyaXB0aW9uXHJcbiAgICAgICAgLy9zdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xyXG4gICAgICAgIC8vcmVmcmVzaCB0YWJzXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoVGFiVmFsaWRhdGlvbkJhZGdlcygpO1xyXG4gICAgICAgIC8vaGFuZGxlIHNwYW4gZGlmZmVyZW50bHlcclxuICAgICAgICB2YXIgaXNTcGFuID0gZm9ybWlucHV0LmlzKCdzcGFuJyk7XHJcbiAgICAgICAgaWYgKGlzU3Bhbikge1xyXG4gICAgICAgICAgICBmb3JtaW5wdXQudGV4dCgnJyk7XHJcbiAgICAgICAgICAgIGZvcm1pbnB1dC5yZW1vdmVDbGFzcygnbGFiZWwgbGFiZWwtZGFuZ2VyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vfSk7XHJcbiAgICB9XHJcbiAgICBnZXRWbVByb3BlcnR5KHByb3BlcnR5KSB7XHJcbiAgICAgICAgdmFyIHByb3BlcnR5UGFydHMgPSBwcm9wZXJ0eS5zcGxpdCgnLicpO1xyXG4gICAgICAgIHZhciB2bVByb3BlcnR5ID0gdGhpcy52bVtwcm9wZXJ0eVBhcnRzWzBdXVtwcm9wZXJ0eVBhcnRzWzFdXTtcclxuICAgICAgICByZXR1cm4gdm1Qcm9wZXJ0eTtcclxuICAgIH1cclxuICAgIHNldHVwVGFicygpIHtcclxuICAgICAgICAkKHRoaXMudGFiUm93U2VsZWN0b3IgKyAnIGgyJykuaGlkZSgpO1xyXG4gICAgICAgIC8vY3JlYXRlIGEga25vY2tvdXRvYnNlcnZhYmxlIGZvcmVhY2ggaDIgaW5zaWRlIGEgcm93XHJcbiAgICAgICAgJCh0aGlzLnRhYlJvd1NlbGVjdG9yICsgJyBoMicpLmVhY2goKGluZGV4LCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQodmFsdWUpO1xyXG4gICAgICAgICAgICB2YXIgYXR0ciA9ICd2aXNpYmxlOiAkcm9vdC5BY3RpdmVUYWJJbmRleCgpID09PSAnICsgaW5kZXgudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgJCh2YWx1ZSkucGFyZW50KCkucGFyZW50KCkuYXR0cignZGF0YS1iaW5kJywgYXR0cik7XHJcbiAgICAgICAgICAgIHRoaXMudm0uRm9ybVRhYnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBUZXh0OiBrby5vYnNlcnZhYmxlKGVsZW1lbnQuaHRtbCgpKSxcclxuICAgICAgICAgICAgICAgIEVycm9yQ291bnQ6IGtvLm9ic2VydmFibGUoMCksXHJcbiAgICAgICAgICAgICAgICBDaGFuZ2VDb3VudDoga28ub2JzZXJ2YWJsZSgwKSxcclxuICAgICAgICAgICAgICAgIEhpZGRlbjoga28ub2JzZXJ2YWJsZShmYWxzZSksXHJcbiAgICAgICAgICAgICAgICBJZDoga28ub2JzZXJ2YWJsZShudWxsKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnZtLkFjdGl2ZVRhYkluZGV4KDApO1xyXG4gICAgfVxyXG4gICAgZ2VuZXJhdGVOZXdDbGllbnRJZCgpIHtcclxuICAgICAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykgeyB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7IHJldHVybiB2LnRvU3RyaW5nKDE2KTsgfSk7XHJcbiAgICB9XHJcbiAgICBhZGQoKSB7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5yZXNldERldGFpbCgpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbElzTmV3KHRydWUpO1xyXG4gICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygnZm9ybS1zaG93bicpO1xyXG4gICAgICAgIHRoaXMudm0uRm9ybVZpc2libGUodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlaXRlbShpZCkge1xyXG4gICAgICAgIHZhciBwcm9taXNlID0gdGhpcy5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgIHByb21pc2UuZG9uZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudm0ucm91dGVzLnZpZXcoaWQpO1xyXG4gICAgICAgICAgICAkKCcjZGVsZXRlLW1vZGFsJykubW9kYWwoJ3Nob3cnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuICAgIGNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLnZtLkZvcm1WaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdmb3JtLXNob3duJyk7XHJcbiAgICAgICAgfSwgMjUwKTtcclxuICAgIH1cclxuICAgIHBvc3QoKSB7XHJcbiAgICAgICAgLy9wcmV2ZW50IGRvdWJsZSBwb3N0XHJcbiAgICAgICAgaWYgKHRoaXMudm0uSXNMb2FkaW5nKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL21ha2Ugb3ZlcmxheSBsb2FkaW5nIGRpdiBmdWxsIGhlaWdodFxyXG4gICAgICAgICQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgdmFyIGlnbm9yZU1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICdpZ25vcmUnOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgcG9zdERhdGEgPSBrby5tYXBwaW5nLnRvSlModGhpcy52bSwgaWdub3JlTWFwcGluZyk7XHJcbiAgICAgICAgZGVsZXRlIHBvc3REYXRhLkFsZXJ0cztcclxuICAgICAgICBkZWxldGUgcG9zdERhdGEuTmV3VmVyc2lvbjtcclxuICAgICAgICAkKFwiLmZvcm0tdmFsaWRhdGlvbi1lcnJvcnNcIikuaGlkZSgpO1xyXG4gICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgdXJsOiB0aGlzLnBvc3RVcmwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksXHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5mYWlsKChlcnJvcikgPT4gdGhpcy5wb3N0UHJvbWlzZUZhaWwoZXJyb3IpKTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoZGF0YSA9PiB0aGlzLnBvc3RQcm9taXNlRG9uZShkYXRhKSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbiAgICBwb3N0SW5kZXgoKSB7XHJcbiAgICAgICAgLy9wcmV2ZW50IGRvdWJsZSBwb3N0XHJcbiAgICAgICAgaWYgKHRoaXMudm0uSXNMb2FkaW5nKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL21ha2Ugb3ZlcmxheSBsb2FkaW5nIGRpdiBmdWxsIGhlaWdodFxyXG4gICAgICAgICQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgdmFyIGlnbm9yZU1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICdpZ25vcmUnOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgcG9zdERhdGEgPSBrby5tYXBwaW5nLnRvSlModGhpcy52bSwgaWdub3JlTWFwcGluZyk7XHJcbiAgICAgICAgZGVsZXRlIHBvc3REYXRhLkFsZXJ0cztcclxuICAgICAgICBkZWxldGUgcG9zdERhdGEuTmV3VmVyc2lvbjtcclxuICAgICAgICAkKFwiLmZvcm0tdmFsaWRhdGlvbi1lcnJvcnNcIikuaGlkZSgpO1xyXG4gICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgdXJsOiB0aGlzLnBvc3RVcmwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksXHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5mYWlsKChlcnJvcikgPT4gdGhpcy5wb3N0UHJvbWlzZUZhaWwoZXJyb3IpKTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoZGF0YSA9PiB0aGlzLnBvc3RQcm9taXNlSW5kZXhEb25lKGRhdGEpKTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuICAgIGRlbGV0ZUl0ZW0oaWQpIHtcclxuICAgICAgICB0aGlzLmlzRGVsZXRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudm0ucm91dGVzLnZpZXcoaWQpOyAvLyBLaWNrcyBvZmYgYW4gaW1wbGllZCBnZXREZXRhaWwoKVxyXG4gICAgICAgIC8vdmFyIHByb21pc2UgPSB0aGlzLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgLy9wcm9taXNlLmRvbmUoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgIHRoaXMudm0ucm91dGVzLnZpZXcoaWQpO1xyXG4gICAgICAgIC8vICAgICQoJyNkZWxldGUtbW9kYWwnKS5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgIC8vICAgIHRoaXMuaXNNb2RhbFNob3dpbmcgPSB0cnVlO1xyXG4gICAgICAgIC8vfSk7XHJcbiAgICAgICAgLy9yZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuICAgIC8vY29uZmlybURlbGV0ZSgpIHtcclxuICAgIC8vICAgIHRoaXMuZWRpdEFjdGlvbiA9ICdEZWxldGUnO1xyXG4gICAgLy8gICAgdmFyIHByb21pc2UgPSB0aGlzLnBvc3QoKTtcclxuICAgIC8vICAgIHByb21pc2UuZG9uZSgoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgdGhpcy5lZGl0QWN0aW9uID0gJ0VkaXQnO1xyXG4gICAgLy8gICAgfSk7XHJcbiAgICAvL31cclxuICAgIG1hcFBvc3REYXRhKGRhdGEpIHtcclxuICAgICAgICB2YXIgY29weU1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICdjb3B5JzogdGhpcy5kYXRhLktPTWFwcGluZy5jb3B5XHJcbiAgICAgICAgfTtcclxuICAgICAgICBrby5tYXBwaW5nLmZyb21KUyhkYXRhLkl0ZW1EZXRhaWwsIGNvcHlNYXBwaW5nLCB0aGlzLnZtLkl0ZW1EZXRhaWwpO1xyXG4gICAgfVxyXG4gICAgYWRkUHJvcGVydHlFcnJvcihwcm9wZXJ0eUVycm9yKSB7XHJcbiAgICAgICAgdmFyIGtleSA9IHByb3BlcnR5RXJyb3IuS2V5LCBtZXNzYWdlID0gcHJvcGVydHlFcnJvci5FcnJvck1lc3NhZ2U7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vZmluZCBtYXRjaGluZyBpbnB1dFxyXG4gICAgICAgIHZhciBmb3JtaW5wdXQgPSAkKCcjJyArIGtleS5yZXBsYWNlKC9cXC4vZywgJ18nKSk7XHJcbiAgICAgICAgLy9zZWxlY3QyIG5lZWQgdG8gdXNlIHBhcmVudCBlbGVtZW50XHJcbiAgICAgICAgaWYgKGZvcm1pbnB1dC5oYXNDbGFzcygnc2VsZWN0Mi1vZmZzY3JlZW4nKSkge1xyXG4gICAgICAgICAgICBmb3JtaW5wdXQgPSAkKCcuc2VsZWN0Mi1jb250YWluZXInLCBmb3JtaW5wdXQucGFyZW50KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcm1JbnB1dEFkZEVycm9yKGZvcm1pbnB1dCwga2V5LCBtZXNzYWdlKTtcclxuICAgICAgICB2YXIgZXJyb3JNZXNzYWdlID0gJChcIiNlcnJvcl9tZXNzYWdlX1wiICsga2V5LnJlcGxhY2UoL1xcLi9nLCAnXycpKTtcclxuICAgICAgICB0aGlzLmZvcm1JbnB1dEFkZEVycm9yKGVycm9yTWVzc2FnZSwga2V5LCBtZXNzYWdlKTtcclxuICAgIH1cclxuICAgIC8vYWRkIGVycm9yIHN0YXRlIHRvIGRvbVxyXG4gICAgZm9ybUlucHV0QWRkRXJyb3IoZm9ybWlucHV0LCBrZXksIG1lc3NhZ2UpIHtcclxuICAgICAgICAvL3NlbGVjdDIgbmVlZCB0byB1c2UgcGFyZW50IGVsZW1lbnRcclxuICAgICAgICBpZiAoZm9ybWlucHV0Lmhhc0NsYXNzKCdzZWxlY3QyLW9mZnNjcmVlbicpKSB7XHJcbiAgICAgICAgICAgIGZvcm1pbnB1dCA9ICQoJy5zZWxlY3QyLWNvbnRhaW5lcicsIGZvcm1pbnB1dC5wYXJlbnQoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpc1NwYW4gPSBmb3JtaW5wdXQuaXMoJ3NwYW4nKTtcclxuICAgICAgICB2YXIgZm9ybUVsZW1lbnRGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGZvcm1pbnB1dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50UGFyZW50ID0gZm9ybWlucHV0LnBhcmVudCgpO1xyXG4gICAgICAgICAgICBlbGVtZW50UGFyZW50LmFkZENsYXNzKCdoYXMtZXJyb3IgaGFzLWZlZWRiYWNrJyk7XHJcbiAgICAgICAgICAgIGlmICghaXNTcGFuKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50UGFyZW50LmFwcGVuZCgnPHNwYW4gY2xhc3M9XFwnZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmUgZm9ybS1jb250cm9sLWZlZWRiYWNrXFwnPjwvc3Bhbj4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvcm1pbnB1dC50ZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZm9ybWlucHV0LmFkZENsYXNzKCdsYWJlbCBsYWJlbC1kYW5nZXInKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWVzc2FnZSAmJiAhaXNTcGFuKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtaW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignZGF0YS10cmlnZ2VyJywgJ2hvdmVyJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignZGF0YS1wbGFjZW1lbnQnLCAnYm90dG9tJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignZGF0YS1jb250ZW50JywgbWVzc2FnZSlcclxuICAgICAgICAgICAgICAgICAgICAucG9wb3ZlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghaXNTcGFuKVxyXG4gICAgICAgICAgICAgICAgZm9ybWlucHV0LmF0dHIoJ2FyaWEtaW52YWxpZCcsICd0cnVlJyk7XHJcbiAgICAgICAgICAgIGVsZW1lbnRQYXJlbnQucGFyZW50KCkudHJpZ2dlcihcImZvcm06cHJvcGVydHkudmFsaWRhdGlvbi5lcnJvclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvcm1FbGVtZW50Rm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT09ICdEQkNvbmN1cnJlbmN5RXhjZXB0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgLy8kKFwiI2NvbmZsaWN0TW9kYWxcIikubW9kYWwoXCJzaG93XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9hZGRBbGVydChtZXNzYWdlLCBcImVycm9yXCIpOyAvL3RvZG8gZm9ybSBjbGFzcyBsZXZlbCB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZvcm1FbGVtZW50Rm91bmQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cENsZWFyVmFsaWRhdGlvbihrZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vcmVtb3ZlIGVycm9yIHN0YXRlIGZyb20gZG9uXHJcbiAgICBmb3JtSW5wdXRSZW1vdmVFcnJvcihmb3JtaW5wdXQsIGtleSkge1xyXG4gICAgICAgIGlmIChmb3JtaW5wdXQuaGFzQ2xhc3MoJ3NlbGVjdDItb2Zmc2NyZWVuJykpIHtcclxuICAgICAgICAgICAgZm9ybWlucHV0ID0gJCgnLnNlbGVjdDItY29udGFpbmVyJywgZm9ybWlucHV0LnBhcmVudCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9yZW1vdmUgZXJyb3IgY2xhc3MgdG8gcGFyZW50IGVsZW1lbnRcclxuICAgICAgICB2YXIgZm9ybUdyb3VwID0gZm9ybWlucHV0LmNsb3Nlc3QoJy5mb3JtLWdyb3VwJyk7XHJcbiAgICAgICAgZm9ybUdyb3VwLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3IgaGFzLWZlZWRiYWNrJyk7XHJcbiAgICAgICAgLy9yZW1vdmUgYm9vdHNyYXAgcG9wb3ZlclxyXG4gICAgICAgIGlmICgoZm9ybWlucHV0KS5hdHRyKCdkYXRhLXRyaWdnZXInKSkge1xyXG4gICAgICAgICAgICBmb3JtaW5wdXRcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLXRyaWdnZXInKVxyXG4gICAgICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtcGxhY2VtZW50JylcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLWNvbnRlbnQnKVxyXG4gICAgICAgICAgICAgICAgLnBvcG92ZXIoJ2Rlc3Ryb3knKSAvL3RvZG8gYm9vdHN0cmFwIHBvcG92ZXJcclxuICAgICAgICAgICAgO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL3JlbW92ZSBwb3BvdmVyIGVsZW1lbnRcclxuICAgICAgICAkKCcuZm9ybS1jb250cm9sLWZlZWRiYWNrJywgZm9ybUdyb3VwKS5yZW1vdmUoKTtcclxuICAgICAgICAvL3JlZnJlc2ggdGFic1xyXG4gICAgICAgIHRoaXMucmVmcmVzaFRhYlZhbGlkYXRpb25CYWRnZXMoKTtcclxuICAgICAgICAvL2hhbmRsZSBzcGFuIGRpZmZlcmVudGx5XHJcbiAgICAgICAgdmFyIGlzU3BhbiA9IGZvcm1pbnB1dC5pcygnc3BhbicpO1xyXG4gICAgICAgIGlmIChpc1NwYW4pIHtcclxuICAgICAgICAgICAgZm9ybWlucHV0LnRleHQoJycpO1xyXG4gICAgICAgICAgICBmb3JtaW5wdXQucmVtb3ZlQ2xhc3MoJ2xhYmVsIGxhYmVsLWRhbmdlcicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vc2V0dXAgdGFiIHZhbGlkYXRpb24gbm90aWNlXHJcbiAgICByZWZyZXNoVGFiVmFsaWRhdGlvbkJhZGdlcygpIHtcclxuICAgICAgICAvL2ZpbmQgZWxlbWVudHMgaW5zaWRlIHJvdyB0aGF0IGhhdmUgaGFzLWVycm9yIGNsYXNzXHJcbiAgICAgICAgJCgnLmZvcm0taG9sZGVyIC5yb3cnKS5lYWNoKChpLCB2KSA9PiB7XHJcbiAgICAgICAgICAgIC8vZ2V0IHRoZSBudW1iZXIgb2YgZXJyb3JzIG9uIGluIHRhYiBzZWN0aW9uXHJcbiAgICAgICAgICAgIHZhciBlcnJvcnMgPSAkKCcuaGFzLWVycm9yJywgdikubGVuZ3RoO1xyXG4gICAgICAgICAgICAvL2ZpbmQgdGFiIGJ5IHRpdGxlIGFuZCBzZXQgZXJyb3IgY291bnRcclxuICAgICAgICAgICAgdmFyIHRhYlRpdGxlID0gJCgnaDInLCB2KS5odG1sKCk7XHJcbiAgICAgICAgICAgIHZhciBtYXRjaCA9IGtvLnV0aWxzLmFycmF5Rmlyc3QodGhpcy52bS5Gb3JtVGFicygpLCBpdGVtID0+ICh0YWJUaXRsZSA9PT0gaXRlbS5UZXh0KCkpKTtcclxuICAgICAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICBtYXRjaC5FcnJvckNvdW50KGVycm9ycyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vcmVzZXRzIGl0ZW0gZGV0YWlsIHNvIHRoYXQgaXQgbG9va3MgbGlrZSBhIG5ldyBpbnNlcnRcclxuICAgIHJlc2V0RGV0YWlsKCkge1xyXG4gICAgICAgIC8vJCgnI2RlbGV0ZS1tb2RhbCcpLm1vZGFsKCdoaWRlJyk7XHJcbiAgICAgICAga28ubWFwcGluZy5mcm9tSlModGhpcy52bS5OZXdJdGVtRGV0YWlsLCB7fSwgdGhpcy52bS5JdGVtRGV0YWlsKTtcclxuICAgICAgICAvL3RoaXMucmVmcmVzaFRhYlZhbGlkYXRpb25CYWRnZXMoKTtcclxuICAgICAgICBfLmVhY2godGhpcy52bS5Gb3JtVGFicygpLCBmdW5jdGlvbiAodGFiKSB7IHRhYi5FcnJvckNvdW50KDApOyB9KTsgLy9yZXNldCBlcnJvcnMgdG8gMFxyXG4gICAgICAgICQoJy5tYWluLW1vZGFsLWZvcm0gZm9ybSA+IC5yb3cnKS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy52bS5BY3RpdmVUYWJJbmRleCgwKTtcclxuICAgICAgICAkKCcubWFpbi1tb2RhbC1mb3JtIGZvcm0gPiAucm93OmVxKDApJykuc2hvdygpO1xyXG4gICAgfVxyXG4gICAgLy9yZXNldHMgaXRlbSBkZXRhaWwgc28gdGhhdCBpdCBsb29rcyBsaWtlIGEgbmV3IGluc2VydFxyXG4gICAgcmVzZXREZXRhaWxJbmRleCgpIHtcclxuICAgICAgICAvLyQoJyNkZWxldGUtbW9kYWwnKS5tb2RhbCgnaGlkZScpO1xyXG4gICAgICAgIC8vIGtvLm1hcHBpbmcuZnJvbUpTKHRoaXMudm0uTmV3SXRlbURldGFpbCwge30sIHRoaXMudm0uSXRlbURldGFpbCk7XHJcbiAgICAgICAgLy90aGlzLnJlZnJlc2hUYWJWYWxpZGF0aW9uQmFkZ2VzKCk7XHJcbiAgICAgICAgXy5lYWNoKHRoaXMudm0uRm9ybVRhYnMoKSwgZnVuY3Rpb24gKHRhYikgeyB0YWIuRXJyb3JDb3VudCgwKTsgfSk7IC8vcmVzZXQgZXJyb3JzIHRvIDBcclxuICAgICAgICAkKCcubWFpbi1tb2RhbC1mb3JtIGZvcm0gPiAucm93JykuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudm0uQWN0aXZlVGFiSW5kZXgoMCk7XHJcbiAgICAgICAgJCgnLm1haW4tbW9kYWwtZm9ybSBmb3JtID4gLnJvdzplcSgwKScpLnNob3coKTtcclxuICAgIH1cclxuICAgIGdldERldGFpbChpZCkge1xyXG4gICAgICAgIHRoaXMucmVzZXREZXRhaWwoKTtcclxuICAgICAgICAvLyQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKCdmb3JtLXNob3duJyk7XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6IHRoaXMuZ2V0VXJsLFxyXG4gICAgICAgICAgICBkYXRhOiB7IGlkOiBpZCB9LFxyXG4gICAgICAgICAgICB0eXBlOiAnR0VUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCdcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcm9taXNlLmZhaWwoKGVycm9yKSA9PiB0aGlzLmdldFByb21pc2VGYWlsKGVycm9yLCBpZCkpO1xyXG4gICAgICAgIHByb21pc2UuZmFpbCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgdmFyIGh0bWwgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlVGV4dDtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5odG1sKGh0bWwpO1xyXG4gICAgICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB2YXIgaHRtbFRleHQgPSBlbGVtZW50Lmh0bWwoKTtcclxuICAgICAgICAgICAgdGhpcy52bS5BZGRBbGVydChodG1sVGV4dCwgJ2FsZXJ0LWVycm9yJyk7XHJcbiAgICAgICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoKGRhdGEpID0+IHRoaXMuZ2V0UHJvbWlzZURvbmUoZGF0YSwgaWQpKTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuICAgIGtvbWFwcGluZ2Zyb21kYXRhKGRhdGEsIGlkKSB7XHJcbiAgICAgICAgdmFyIGNvcHlNYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAnY29weSc6IHRoaXMuZGF0YS5LT01hcHBpbmcuYWxsTm9uUG9zdEJhY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKGRhdGEuSXRlbURldGFpbCwgY29weU1hcHBpbmcsIHRoaXMudm0uSXRlbURldGFpbCk7XHJcbiAgICB9XHJcbiAgICAvL3Bvc3QgYWpheCBmYWlsJCRcclxuICAgIHBvc3RQcm9taXNlRmFpbChlcnJvcikge1xyXG4gICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMCkge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2VKU09OLk1vZGVsU3RhdGUuUHJvcGVydHlFcnJvcnMubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgICAgICQoXCIuZm9ybS12YWxpZGF0aW9uLWVycm9yc1wiKS5zaG93KCk7XHJcbiAgICAgICAgICAgIF8uZWFjaChlcnJvci5yZXNwb25zZUpTT04uTW9kZWxTdGF0ZS5Qcm9wZXJ0eUVycm9ycywgKHByb3BlcnR5RXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUHJvcGVydHlFcnJvcihwcm9wZXJ0eUVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRhYlZhbGlkYXRpb25CYWRnZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MjIpIHtcclxuICAgICAgICAgICAgLy8gRmFpbGVkIGNhcHRjaGFcclxuICAgICAgICAgICAgYWxlcnQoXCJZb3VyIHJlcXVlc3QgYXBwZWFycyB0byBiZSBpbnZhbGlkLiBQbGVhc2UgdHJ5IGFnYWluLlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5yZXNwb25zZUpTT04pIHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5yZXNwb25zZUpTT04uTWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm0uQWRkQWxlcnQoZXJyb3IucmVzcG9uc2VKU09OLk1lc3NhZ2UsICdlcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlVGV4dDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQoJzxkaXYvPicpLmh0bWwoaHRtbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnc3R5bGUnLCBlbGVtZW50KS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbFRleHQgPSBlbGVtZW50Lmh0bWwoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZtLkFkZEFsZXJ0KGh0bWxUZXh0LCAnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciBodG1sMiA9IGVycm9yLmVycm9yKCkucmVzcG9uc2VUZXh0O1xyXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQyID0gJCgnPGRpdi8+JykuaHRtbChodG1sMik7XHJcbiAgICAgICAgICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQyKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIHZhciBodG1sVGV4dDIgPSBlbGVtZW50Mi5odG1sKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZtLkFkZEFsZXJ0KGh0bWxUZXh0MiwgJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLy9wb3N0IGFqYXggc3VjY2Vzc1xyXG4gICAgcG9zdFByb21pc2VEb25lKGRhdGEpIHtcclxuICAgICAgICB0aGlzLm1hcFBvc3REYXRhKGRhdGEpO1xyXG4gICAgICAgIGlmICghdGhpcy52bS5MZWF2ZU9wZW5PbkFqYXhTdWNjZXNzKCkpIHtcclxuICAgICAgICAgICAgdGhpcy52bS5yb3V0ZXMuZ29CYWNrKCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXREZXRhaWwoKTtcclxuICAgICAgICAgICAgdGhpcy52bS5BZGRBbGVydChkYXRhLk1lc3NhZ2UsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgIH1cclxuICAgIC8vcG9zdCBhamF4IHN1Y2Nlc3NcclxuICAgIHBvc3RQcm9taXNlSW5kZXhEb25lKGRhdGEpIHtcclxuICAgICAgICB0aGlzLm1hcFBvc3REYXRhKGRhdGEpO1xyXG4gICAgICAgIGlmICghdGhpcy52bS5MZWF2ZU9wZW5PbkFqYXhTdWNjZXNzKCkpIHtcclxuICAgICAgICAgICAgdGhpcy52bS5yb3V0ZXMuZ29CYWNrKCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXREZXRhaWxJbmRleCgpO1xyXG4gICAgICAgICAgICB0aGlzLnZtLkFkZEFsZXJ0KGRhdGEuTWVzc2FnZSwgJ3N1Y2Nlc3MnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLy9nZXQgYWpheCBmYWlsXHJcbiAgICBnZXRQcm9taXNlRmFpbChlcnJvciwgaWQpIHtcclxuICAgICAgICB2YXIgaHRtbCA9IGVycm9yLmVycm9yKCkucmVzcG9uc2VUZXh0O1xyXG4gICAgICAgIHZhciBlbGVtZW50ID0gJCgnPGRpdi8+JykuaHRtbChodG1sKTtcclxuICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQpLnJlbW92ZSgpO1xyXG4gICAgICAgIHZhciBodG1sVGV4dCA9IGVsZW1lbnQuaHRtbCgpO1xyXG4gICAgICAgIHRoaXMudm0uQWRkQWxlcnQoaHRtbFRleHQsICdhbGVydC1lcnJvcicpO1xyXG4gICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgIH1cclxuICAgIC8vZ2V0IGFqYXggc3VjY2Vzc1xyXG4gICAgZ2V0UHJvbWlzZURvbmUoZGF0YSwgaWQpIHtcclxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDAgfHwgZGF0YSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL0FkbWluL0F1dGhlbnRpY2F0aW9uL0xvZ2luJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsSXNOZXcoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMua29tYXBwaW5nZnJvbWRhdGEoZGF0YSwgaWQpO1xyXG4gICAgICAgIHRoaXMudm0ucm91dGVzLnZpZXcoaWQpO1xyXG4gICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICB0aGlzLnZtLkZvcm1WaXNpYmxlKHRydWUpO1xyXG4gICAgICAgIGlmICh0aGlzLmlzRGVsZXRpbmcpIHtcclxuICAgICAgICAgICAgJCgnI2RlbGV0ZS1tb2RhbCcpLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNNb2RhbFNob3dpbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEZvcm07XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNsYXNzIEtvQmluZGluZ0V4dGVuc2lvbnMge1xyXG4gICAgcmVnaXN0ZXIoKSB7XHJcbiAgICAgICAga28uYmluZGluZ0hhbmRsZXJzLmhpZGRlbiA9IHtcclxuICAgICAgICAgICAgdXBkYXRlKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcclxuICAgICAgICAgICAgICAgIGtvLmJpbmRpbmdIYW5kbGVycy52aXNpYmxlLnVwZGF0ZShlbGVtZW50LCAoKSA9PiAoIXZhbHVlKSwgYWxsQmluZGluZ3NBY2Nlc3Nvciwgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGtvLmJpbmRpbmdIYW5kbGVycy5zbGlkZUluVmlzaWJsZSA9IHtcclxuICAgICAgICAgICAgaW5pdChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsbHkgc2V0IHRoZSBlbGVtZW50IHRvIGJlIGluc3RhbnRseSB2aXNpYmxlL2hpZGRlbiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlXHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCk7XHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLnRvZ2dsZShrby51bndyYXAodmFsdWUpKTsgLy8gVXNlIFwidW53cmFwT2JzZXJ2YWJsZVwiIHNvIHdlIGNhbiBoYW5kbGUgdmFsdWVzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgb2JzZXJ2YWJsZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB1cGRhdGUoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xyXG4gICAgICAgICAgICAgICAgLy8gV2hlbmV2ZXIgdGhlIHZhbHVlIHN1YnNlcXVlbnRseSBjaGFuZ2VzLCBzbG93bHkgZmFkZSB0aGUgZWxlbWVudCBpbiBvciBvdXRcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlQWNjZXNzb3IoKTtcclxuICAgICAgICAgICAgICAgIHZhciBqcXVlcnlFbGVtZW50ID0gJChlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIGlmIChrby51bndyYXAodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zY3JvbGwgYnJvd3NlciB0byB0b3AgdG8gbWFrZSBzdXJlIGZvcm0gaXMgaW4gdmlld1xyXG4gICAgICAgICAgICAgICAgICAgICQoJ2JvZHknKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYW5pbWF0ZSh7IHNjcm9sbFRvcDogMCB9LCAnMjUwJywgJ3N3aW5nJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9oaWRlXHJcbiAgICAgICAgICAgICAgICAgICAgLy9wb3NpdGlvbiBvZmYgc2NyZWVuIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vc2hvd1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2xpZGUgaW50byBwb3NpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIGpxdWVyeUVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmhpZGUoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYW5pbWF0ZSh7IGxlZnQ6IC0zMDAwIH0sIDEsICdsaW5lYXInLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuc2hvdygpOyAvL2xvY2FsIHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYW5pbWF0ZSh7IGxlZnQ6IDAgfSwgMjUwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2xpZGUgb2ZmIHNjcmVlblxyXG4gICAgICAgICAgICAgICAgICAgIC8vaGlkZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vcmVzZXQgdG8gMCBwb3NpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIGpxdWVyeUVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFuaW1hdGUoeyBsZWZ0OiAtMzAwMCB9LCA1MDAsICdsaW5lYXInLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaGlkZSgpLmNzcygnbGVmdCcsICcwJyk7IC8vbG9jYWwgdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAga28uYmluZGluZ0hhbmRsZXJzLnNsaWRlQWxlcnQgPSB7XHJcbiAgICAgICAgICAgIGluaXQoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuc2xpZGVEb3duKDQwMCk7XHJcbiAgICAgICAgICAgICAgICAvL2F1dG8gcmVtb3ZlIHN1Y2Nlc3MgbWVzc2FnZXMgYWZ0ZXIgMyBzZWNvbmRzXHJcbiAgICAgICAgICAgICAgICBpZiAodmlld01vZGVsLlR5cGUgPT09ICdhbGVydC1zdWNjZXNzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLnNsaWRlVXAoNDAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvbnRleHQuJHJvb3QuQWxlcnRzLnJlbW92ZSh2aWV3TW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDMwMDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBrby5iaW5kaW5nSGFuZGxlcnMuaHJlZiA9IHtcclxuICAgICAgICAgICAgdXBkYXRlKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBrby5iaW5kaW5nSGFuZGxlcnMuYXR0ci51cGRhdGUoZWxlbWVudCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGhyZWY6IHZhbHVlQWNjZXNzb3IoKSB9O1xyXG4gICAgICAgICAgICAgICAgfSwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBrby5iaW5kaW5nSGFuZGxlcnMuZGF0ZXRpbWUgPSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVBY2Nlc3NvcigpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGFsbEJpbmRpbmdzID0gYWxsQmluZGluZ3NBY2Nlc3NvcigpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlVW53cmFwcGVkID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAvLyBEYXRlIGZvcm1hdHM6IGh0dHA6Ly9tb21lbnRqcy5jb20vZG9jcy8jL2Rpc3BsYXlpbmcvZm9ybWF0L1xyXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRGb3JtYXQgPSAkKGVsZW1lbnQpLmF0dHIoJ2RhdGEtZm9ybWF0Jyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcGF0dGVybiA9IGVsZW1lbnRGb3JtYXQgfHwgYWxsQmluZGluZ3MuZm9ybWF0IHx8ICdNTS9ERC9ZWVlZJztcclxuICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZVVud3JhcHBlZCAhPT0gbnVsbCAmJiB2YWx1ZVVud3JhcHBlZCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlVW53cmFwcGVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVVbndyYXBwZWQuaW5kZXhPZignWicpID09IHZhbHVlVW53cmFwcGVkLmxlbmd0aCAtIDEpIHsgLy9ieSBkZWZhdWx0IG1vbWVudGpzIGNvbnZlcnRzIFVUQyB0byBsb2NhbCBhbmQgd2Ugd2FudCBpdCB0byBzdGF5IFVUQyBpZiBzZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb21lbnQudXRjKHZhbHVlVW53cmFwcGVkKS5mb3JtYXQocGF0dGVybik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb21lbnQodmFsdWVVbndyYXBwZWQpLmZvcm1hdChwYXR0ZXJuKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoJChlbGVtZW50KS5pcygnaW5wdXQnKSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkudmFsKG91dHB1dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLnRleHQob3V0cHV0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAga28uYmluZGluZ0hhbmRsZXJzLnRpbWUgPSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVBY2Nlc3NvcigpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGFsbEJpbmRpbmdzID0gYWxsQmluZGluZ3NBY2Nlc3NvcigpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlVW53cmFwcGVkID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAvLyBEYXRlIGZvcm1hdHM6IGh0dHA6Ly9tb21lbnRqcy5jb20vZG9jcy8jL2Rpc3BsYXlpbmcvZm9ybWF0L1xyXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRGb3JtYXQgPSAkKGVsZW1lbnQpLmF0dHIoJ2RhdGEtZm9ybWF0Jyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcGF0dGVybiA9IGVsZW1lbnRGb3JtYXQgfHwgYWxsQmluZGluZ3MuZm9ybWF0IHx8ICdIOm1tIGEnO1xyXG4gICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlVW53cmFwcGVkICE9PSBudWxsICYmIHZhbHVlVW53cmFwcGVkICE9PSB1bmRlZmluZWQgJiYgdmFsdWVVbndyYXBwZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVVud3JhcHBlZC5pbmRleE9mKCdaJykgPT0gdmFsdWVVbndyYXBwZWQubGVuZ3RoIC0gMSkgeyAvL2J5IGRlZmF1bHQgbW9tZW50anMgY29udmVydHMgVVRDIHRvIGxvY2FsIGFuZCB3ZSB3YW50IGl0IHRvIHN0YXkgVVRDIGlmIHNlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbWVudC51dGModmFsdWVVbndyYXBwZWQpLmZvcm1hdChwYXR0ZXJuKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbWVudCh2YWx1ZVVud3JhcHBlZCkuZm9ybWF0KHBhdHRlcm4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmlzKCdpbnB1dCcpID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS52YWwob3V0cHV0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkudGV4dChvdXRwdXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBrby5iaW5kaW5nSGFuZGxlcnMuc3VtbWVybm90ZSA9IHtcclxuICAgICAgICAgICAgaW5pdChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlQmluZGluZyA9IHZhbHVlQWNjZXNzb3IoKTtcclxuICAgICAgICAgICAgICAgIHZhciAkZWxlbWVudCA9ICQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgdXBkYXRlT2JzZXJ2YWJsZSA9ICgpID0+IHZpZXdNb2RlbFt2YWx1ZUJpbmRpbmddKCRlbGVtZW50LmNvZGUoKSk7XHJcbiAgICAgICAgICAgICAgICAkZWxlbWVudC5zdW1tZXJub3RlKHtcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDYwMCxcclxuICAgICAgICAgICAgICAgICAgICBvbmJsdXI6IHVwZGF0ZU9ic2VydmFibGVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgJGVsZW1lbnQuY29kZSh2aWV3TW9kZWxbdmFsdWVCaW5kaW5nXSgpKTtcclxuICAgICAgICAgICAgICAgIC8vIHJlcGxhY2Ugc2NyaXB0IHRhZ3Mgc28gdGhleSdyZSBub3QgZXhlY3V0ZWQgd2hlbiBsb2FkZWQgaW4gYWRtaW5cclxuICAgICAgICAgICAgICAgIHZhciBjb2RlVG9SZXBsYWNlID0gJGVsZW1lbnQuY29kZSgpO1xyXG4gICAgICAgICAgICAgICAgY29kZVRvUmVwbGFjZSA9IGNvZGVUb1JlcGxhY2UucmVwbGFjZSgnPHNjcmlwdCcsICc8IS0tPHNjcmlwdCcpO1xyXG4gICAgICAgICAgICAgICAgY29kZVRvUmVwbGFjZSA9IGNvZGVUb1JlcGxhY2UucmVwbGFjZSgnPC9zY3JpcHQ+JywgJzwvc2NyaXB0Pi0tPicpO1xyXG4gICAgICAgICAgICAgICAgJGVsZW1lbnQuY29kZShjb2RlVG9SZXBsYWNlKTtcclxuICAgICAgICAgICAgICAgIHZpZXdNb2RlbFt2YWx1ZUJpbmRpbmddLnN1YnNjcmliZShuZXdWYWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGVsZW1lbnQuY29kZSh2aWV3TW9kZWxbdmFsdWVCaW5kaW5nXSgpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEtvQmluZGluZ0V4dGVuc2lvbnM7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IHNlbGVjdDIgPSByZXF1aXJlKFwic2VsZWN0MlwiKTtcclxuY29uc3QgXyA9IHJlcXVpcmUoXCJ1bmRlcnNjb3JlXCIpO1xyXG4kWydzZWxlY3QyJ10gPSBzZWxlY3QyO1xyXG5jbGFzcyBLb0JpbmRpbmdTZWxlY3QyIHtcclxuICAgIGFkZEJpbmRpbmcoKSB7IGtvLmJpbmRpbmdIYW5kbGVycy5zZWxlY3QyaGVscGVyID0gdGhpczsgfVxyXG4gICAgaW5pdChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xyXG4gICAgICAgIC8qSW5pdGFsIFNldHVwKi9cclxuICAgICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsZW1lbnQsICgpID0+IHtcclxuICAgICAgICAgICAgJChlbGVtZW50KS5zZWxlY3QyKCdkZXN0cm95Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdmFyIGJvdW5kT2JzZXJ2YWJsZSA9IHZhbHVlQWNjZXNzb3IoKTtcclxuICAgICAgICB2YXIgaXNCb3VuZFRvQXJyYXkgPSBLb0JpbmRpbmdTZWxlY3QyLmlzT2JzZXJ2YWJsZUFycmF5KGJvdW5kT2JzZXJ2YWJsZSk7XHJcbiAgICAgICAgdmFyIHNlbGVjdDJIZWxwZXJTb3VyY2VOYW1lID0gYWxsQmluZGluZ3MoKS5zZWxlY3QySGVscGVyU291cmNlTmFtZTtcclxuICAgICAgICB2YXIgb0RhdGFBamF4U291cmNlID0gYWxsQmluZGluZ3MoKS5zZWxlY3QySGVscGVyT0RhdGFBamF4U291cmNlO1xyXG4gICAgICAgIHZhciBpc1JlZmVyZW5jZVR5cGUgPSBhbGxCaW5kaW5ncygpLnNlbGVjdDJIZWxwZXJSZWZlcmVuY2U7XHJcbiAgICAgICAgdmFyIGN1c3RvbVNlbGVjdGlvbkZvcm1hdCA9IGFsbEJpbmRpbmdzKCkuc2VsZWN0MkhlbHBlckZvcm1hdFNlbGVjdGlvbjtcclxuICAgICAgICB2YXIgY3VzdG9tUmVzdWx0Rm9ybWF0ID0gYWxsQmluZGluZ3MoKS5zZWxlY3QySGVscGVyRm9ybWF0UmVzdWx0O1xyXG4gICAgICAgIHZhciBwbGFjZWhvbGRlclRleHQgPSBhbGxCaW5kaW5ncygpLnNlbGVjdDJQbGFjZWhvbGRlclRleHQ7XHJcbiAgICAgICAgdmFyIGFsbG93Q2xlYXIgPSBhbGxCaW5kaW5ncygpLnNlbGVjdDJBbGxvd0NsZWFyO1xyXG4gICAgICAgIHZhciBvRGF0YVNvcnQgPSBhbGxCaW5kaW5ncygpLnNlbGVjdDJIZWxwZXJPRGF0YVNvcnQ7XHJcbiAgICAgICAgdmFyIG9wdGlvbnNTdXBwbGllZCA9IHRydWU7XHJcbiAgICAgICAgLy9zZWxlY3QyIG9wdGlvbnNcclxuICAgICAgICB2YXIgZGF0YSA9IHt9O1xyXG4gICAgICAgIGRhdGEuZm9ybWF0U2VsZWN0aW9uID0gY3VzdG9tU2VsZWN0aW9uRm9ybWF0ID8gS29CaW5kaW5nU2VsZWN0Mi5nZXROZXN0ZWRQcm9wZXJ0eShjdXN0b21TZWxlY3Rpb25Gb3JtYXQsIGJpbmRpbmdDb250ZXh0LiRyb290KSA6IEtvQmluZGluZ1NlbGVjdDIuZm9ybWF0U2VsZWN0aW9uO1xyXG4gICAgICAgIGRhdGEuZm9ybWF0UmVzdWx0ID0gY3VzdG9tUmVzdWx0Rm9ybWF0ID8gS29CaW5kaW5nU2VsZWN0Mi5nZXROZXN0ZWRQcm9wZXJ0eShjdXN0b21SZXN1bHRGb3JtYXQsIGJpbmRpbmdDb250ZXh0LiRyb290KSA6IEtvQmluZGluZ1NlbGVjdDIuZm9ybWF0UmVzdWx0O1xyXG4gICAgICAgIGRhdGEuaWQgPSBLb0JpbmRpbmdTZWxlY3QyLmZvcm1hdElkO1xyXG4gICAgICAgIGRhdGEubWF0Y2hlciA9IEtvQmluZGluZ1NlbGVjdDIubWF0Y2hlcjtcclxuICAgICAgICBkYXRhLm11bHRpcGxlID0gaXNCb3VuZFRvQXJyYXk7XHJcbiAgICAgICAgZGF0YS5kcm9wZG93bkF1dG9XaWR0aCA9IHRydWU7XHJcbiAgICAgICAgZGF0YS5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyVGV4dCA/IHBsYWNlaG9sZGVyVGV4dCA6ICcnO1xyXG4gICAgICAgIGRhdGEuYWxsb3dDbGVhciA9IGFsbG93Q2xlYXIgPyBhbGxvd0NsZWFyIDogdHJ1ZTtcclxuICAgICAgICB2YXIgaW5pdFZhbHVlID0gbnVsbDtcclxuICAgICAgICBpZiAoIWlzQm91bmRUb0FycmF5KSB7XHJcbiAgICAgICAgICAgIGlmIChpc1JlZmVyZW5jZVR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGtvLnRvSlMoYm91bmRPYnNlcnZhYmxlKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICBpbml0VmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGluaXRWYWx1ZSA9IGtvLnRvSlMoYm91bmRPYnNlcnZhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL3NldHVwIHNvdXJjZSBmb3Igb3B0aW9uc1xyXG4gICAgICAgIGlmIChzZWxlY3QySGVscGVyU291cmNlTmFtZSkgeyAvL3VzaW5nIGFycmF5IG9uIHZpZXcgbW9kZWxcclxuICAgICAgICAgICAgdmFyIHNvdXJjZUxpc3QgPSBLb0JpbmRpbmdTZWxlY3QyLmdldE5lc3RlZFByb3BlcnR5KHNlbGVjdDJIZWxwZXJTb3VyY2VOYW1lLCBiaW5kaW5nQ29udGV4dC4kcm9vdCk7XHJcbiAgICAgICAgICAgIGRhdGEuZGF0YSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdHM6IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoc291cmNlTGlzdCkgfTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAob0RhdGFBamF4U291cmNlKSB7IC8vdXNpbmcgYWpheFxyXG4gICAgICAgICAgICBkYXRhLmluaXRTZWxlY3Rpb24gPSAoZWxlbWVudCwgY2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGtvLnRvSlMoYm91bmRPYnNlcnZhYmxlKSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZhciBwYWdlU2l6ZSA9IDMwO1xyXG4gICAgICAgICAgICBkYXRhLmFqYXggPSB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IG9EYXRhQWpheFNvdXJjZSxcclxuICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgICAgICBkYXRhKHRlcm0sIHBhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkaW5saW5lY291bnQ6ICdhbGxwYWdlcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRvcmRlcmJ5OiBvRGF0YVNvcnQgPyBvRGF0YVNvcnQgOiBcIk5hbWVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHRvcDogcGFnZVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRza2lwOiAocGFnZSA9PSB1bmRlZmluZWQgfHwgcGFnZSA8IDEpID8gMCA6IChwYWdlIC0gMSkgKiBwYWdlU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoVGVybTogdGVybSA9PSB1bmRlZmluZWQgPyAnJyA6IHRlcm1cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdHMocmVzdWx0RGF0YSwgcGFnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtb3JlID0gKHBhZ2UgKiBwYWdlU2l6ZSkgPCByZXN1bHREYXRhLlBhZ2VJbmZvLlRvdGFsSXRlbUNvdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdHM6IHJlc3VsdERhdGEuTGlzdCwgbW9yZTogbW9yZSB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9ubyB2YWxpZCBzb3VyY2Ugc3BlY2lmaWVkXHJcbiAgICAgICAgICAgIG9wdGlvbnNTdXBwbGllZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3B0aW9uc1N1cHBsaWVkKSB7XHJcbiAgICAgICAgICAgICQoZWxlbWVudCkuc2VsZWN0MihkYXRhKTtcclxuICAgICAgICAgICAgLypJbml0aWFsIHZhbHVlKi9cclxuICAgICAgICAgICAgaWYgKGluaXRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5zZWxlY3QyKCd2YWwnLCBpbml0VmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8qSnF1ZXJ5IFVwZGF0ZXMqL1xyXG4gICAgICAgICAgICAkKGVsZW1lbnQpLm9uKCdjaGFuZ2UnLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5hZGRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIG9ic2VydmFibGUgZGVwZW5kaW5nIG9uIGlmIGl0IGlzIGFuIGFycmF5IG9yIHByb3BlcnR5XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShldmVudC5hZGRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1JlZmVyZW5jZVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0JvdW5kVG9BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRPYnNlcnZhYmxlKG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kT2JzZXJ2YWJsZS5wdXNoKG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0JvdW5kVG9BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRPYnNlcnZhYmxlKG5ld1ZhbHVlLklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kT2JzZXJ2YWJsZS5wdXNoKG5ld1ZhbHVlLklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vaWYgcmVtb3ZpbmcgYW5kIGJvdW5kIHRvIGFycmF5IHdlIGhhdmUgdG8gY2FsbCByZW1vdmUgb24gb2JzZXJ2YWJsZSBhcnJheVxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnJlbW92ZWQgJiYgaXNCb3VuZFRvQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZFZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShldmVudC5yZW1vdmVkKTtcclxuICAgICAgICAgICAgICAgICAgICA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9maW5kIHRoZSBpdGVtIHdpdGggbWF0Y2hpbiBpZCBhbmQgcmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgYm91bmRPYnNlcnZhYmxlLnJlbW92ZShpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gaXNSZWZlcmVuY2VUeXBlID8gaXRlbS5JZCA6IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtSWQgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbW92ZWRWYWx1ZUlkID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShyZW1vdmVkVmFsdWUuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUlkID09PSByZW1vdmVkVmFsdWVJZDtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICQoZWxlbWVudCkub24oXCJzZWxlY3QyLXJlbW92ZWRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzQm91bmRUb0FycmF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYm91bmRPYnNlcnZhYmxlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLypvYnNlcnZhYmxlIHVwZGF0ZXMqL1xyXG4gICAgICAgICAgICBib3VuZE9ic2VydmFibGUuc3Vic2NyaWJlKG5ld1ZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0ga28udG9KUyhuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNCb3VuZFRvQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLnNlbGVjdDIoJ3ZhbCcsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGx1Y2tlZCA9IF8ucGx1Y2sobmV3VmFsdWUsICdJZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLnNlbGVjdDIoJ3ZhbCcsIHBsdWNrZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1JlZmVyZW5jZVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5zZWxlY3QyKCdkYXRhJywgbmV3VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5zZWxlY3QyKCd2YWwnLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaXNPYnNlcnZhYmxlQXJyYXkoYm91bmRPYnNlcnZhYmxlKSB7XHJcbiAgICAgICAgcmV0dXJuIChib3VuZE9ic2VydmFibGUoKSBpbnN0YW5jZW9mIEFycmF5KTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBmb3JtYXRTZWxlY3Rpb24oaXRlbSkge1xyXG4gICAgICAgIHJldHVybiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGl0ZW0uTmFtZSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZm9ybWF0UmVzdWx0KGl0ZW0pIHtcclxuICAgICAgICByZXR1cm4ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShpdGVtLk5hbWUpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZvcm1hdElkKGl0ZW0pIHtcclxuICAgICAgICBpZiAoaXRlbSlcclxuICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoaXRlbS5JZCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgbWF0Y2hlcih0ZXJtLCB0ZXh0LCBvcHRpb24pIHtcclxuICAgICAgICB2YXIgbmFtZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUob3B0aW9uLk5hbWUpO1xyXG4gICAgICAgIHJldHVybiBuYW1lLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0ZXJtLnRvVXBwZXJDYXNlKCkpID49IDA7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZ2V0TmVzdGVkUHJvcGVydHkocHJvcGVydHlTdHJpbmcsIHBhcmVudE9iamVjdCkge1xyXG4gICAgICAgIHZhciBwYXJ0cyA9IHByb3BlcnR5U3RyaW5nLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHNpemUgPSBwYXJ0cy5sZW5ndGg7IGkgPCBzaXplOyBpKyspIHtcclxuICAgICAgICAgICAgcGFyZW50T2JqZWN0ID0gcGFyZW50T2JqZWN0W3BhcnRzW2ldXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudE9iamVjdDtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEtvQmluZGluZ1NlbGVjdDI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3QgU2FtbXkgPSByZXF1aXJlKFwic2FtbXlcIik7XHJcbmNvbnN0IF8gPSByZXF1aXJlKFwidW5kZXJzY29yZVwiKTtcclxuY2xhc3MgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgICAgICBpZiAoYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVzID0gYWx0ZXJuYXRlcm91dGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXMgPSB0aGlzLmdldFJvdXRlcygpO1xyXG4gICAgICAgICAgICAvLyBhZGQgaSByZWdleCBmbGFnIGZvciBjYXNlIGluc2Vuc2l0aXZlIHJvdXRlc1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm91dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb3V0ZXNbaV0uY29udmVydFRvUmVnRXggJiYgdGhpcy5yb3V0ZXNbaV0ubmFtZS5jb25zdHJ1Y3RvciAhPT0gUmVnRXhwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXNbaV0ubmFtZSA9IG5ldyBSZWdFeHAodGhpcy5yb3V0ZXNbaV0ubmFtZS50b1N0cmluZygpLCAnaScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0dXBCaW5kaWdzKCk7XHJcbiAgICAgICAgdGhpcy5pbml0Um91dGVzKCk7XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IG5ldyBSZWdFeHAoYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGApLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy9uYW1lOiAvXFwjXFwvdmlld1xcLyguKikvaSxcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3ZpZXcvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2luZGV4YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuICAgIHNldHVwQmluZGlncygpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy8jYWRkIHNob3cgY2FsbCBuZXcgcm91dGVcclxuICAgICAgICAkKCcjYWRtaW4tYnV0dG9uLWNvbnRhaW5lcicpLm9uKCdjbGljaycsICcjYWRkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8jY2FuY2VsIHNob3cgYmFja1xyXG4gICAgICAgICQoJy5tYWluLW1vZGFsLWZvcm0nKS5vbignY2xpY2snLCAnLmRpYWxvZy1jbG9zZScsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5nb0JhY2soKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaW5pdFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgYXBwID0gU2FtbXkoJ2JvZHknLCBzYW1teSA9PiB7XHJcbiAgICAgICAgICAgIC8vcGFzcyBlcnJvciBcclxuICAgICAgICAgICAgc2FtbXkucmFpc2VfZXJyb3JzID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy9yZWdpc3RlciBhbGwgcm91dGVzICh0aGlzIGFsbG93cyB1cyB0byBhZGQgdG8gdGhlbSBmcm9tIGRlcml2ZWQgY2xhc3MpXHJcbiAgICAgICAgICAgIF8uZWFjaCh0aGlzLnJvdXRlcywgdiA9PiB7XHJcbiAgICAgICAgICAgICAgICBzYW1teS5nZXQodi5uYW1lLCB2LmZ1bmMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy9rZWVwIHRyYWNrIG9mIGxhc3Qgcm91dGVcclxuICAgICAgICAgICAgc2FtbXkuYmVmb3JlKChyb3V0ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0Um91dGUgPSB0aGlzLmN1cnJlbnRSb3V0ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFJvdXRlID0gcm91dGU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoKCkgPT4ge1xyXG4gICAgICAgICAgICAvL2dvIHRvIGRlZmF1bHQgcm91dGVcclxuICAgICAgICAgICAgYXBwLnJ1bih0aGlzLmdldEFyZWEoKSArICcvJyArIHRoaXMudm0uVGl0bGUoKS50b0xvd2VyQ2FzZSgpICsgJyMvJyArIHRoaXMudm0uRGVmYXVsdFNhbW15Um91dGUoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBnZXRBcmVhKCkge1xyXG4gICAgICAgIHZhciBhcmVhID0gJyc7XHJcbiAgICAgICAgaWYgKHRoaXMudm0uQXJlYSgpKSB7XHJcbiAgICAgICAgICAgIGFyZWEgPSAnLycgKyB0aGlzLnZtLkFyZWEoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFyZWE7XHJcbiAgICB9XHJcbiAgICAvL2dvIHRvIHByZXZpb3VzIHJvdXRlIG9yIGRlZmF1bHQgcm91dGUgaWYgdW5kZWZpbmVkXHJcbiAgICBnb0JhY2soKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBgIy9saXN0YDtcclxuICAgIH1cclxuICAgIGFkZCgpIHtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9ICcjL25ldyc7XHJcbiAgICB9XHJcbiAgICB2aWV3KGlkKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnIy92aWV3LycgKyBpZDtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3Qga29tYXBwaW5nID0gcmVxdWlyZShcImtub2Nrb3V0Lm1hcHBpbmdcIik7XHJcbmtvLm1hcHBpbmcgPSBrb21hcHBpbmc7XHJcbmNvbnN0IF8gPSByZXF1aXJlKFwidW5kZXJzY29yZVwiKTtcclxuY2xhc3MgVGFibGUge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0pIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgICAgICB0aGlzLm9EYXRhVXJsID0gYC9hcGkvJHtkYXRhLlRpdGxlfWA7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydCA9IFwiQ3JlYXRlZERhdGUgZGVzY1wiO1xyXG4gICAgICAgIHRoaXMub3JkZXJieSA9IHRoaXMuZGVmYXVsdFNvcnQ7XHJcbiAgICAgICAgdGhpcy5zb3J0QnkgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICB0aGlzLnNldHVwU3Vic2NyaXB0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuc2V0dXBCaW5kaW5ncygpO1xyXG4gICAgfVxyXG4gICAgLy9sb2FkcyBhamF4IGRhdGEgaW50byB0YWJsZVxyXG4gICAgbG9hZFJlc3BvbnNlKHJlc3BvbnNlZGF0YSkge1xyXG4gICAgICAgIC8vY2xlYXIgdGhlIGxpc3RcclxuICAgICAgICB0aGlzLnZtLkxpc3QucmVtb3ZlQWxsKCk7XHJcbiAgICAgICAgLy9hZGQgdGhlIG5ldyBpdGVtc1xyXG4gICAgICAgIF8uZWFjaChyZXNwb25zZWRhdGEuTGlzdCwgKHYpID0+IHtcclxuICAgICAgICAgICAgdGhpcy52bS5MaXN0LnB1c2godik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy9yZWxvYWQgcGFnZSBpbmZvXHJcbiAgICAgICAga28ubWFwcGluZy5mcm9tSlMocmVzcG9uc2VkYXRhLlBhZ2VJbmZvLCB7fSwgdGhpcy52bS5QYWdlSW5mbyk7XHJcbiAgICB9XHJcbiAgICAvL3N1YnNjcmliZXMgdG8gb2JzZXJ2YWJsZXNcclxuICAgIHNldHVwU3Vic2NyaXB0aW9ucygpIHtcclxuICAgICAgICAvL3BhZ2UgbnVtYmVyXHJcbiAgICAgICAgdGhpcy52bS5QYWdlSW5mby5QYWdlTnVtYmVyLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vcGFnZSBzaXplXHJcbiAgICAgICAgdGhpcy52bS5QYWdlSW5mby5QYWdlU2l6ZS5zdWJzY3JpYmUoKG5ld1ZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc29tZXRoaW5nQ2hhbmdlZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vZmlsdGVycyB2YWx1ZXNcclxuICAgICAgICBfLmVhY2godGhpcy52bS5GaWx0ZXJzLCAodikgPT4ge1xyXG4gICAgICAgICAgICB2LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvbWV0aGluZ0NoYW5nZWQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzb21ldGhpbmdDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnZtLlBhZ2VJbmZvLlBhZ2VOdW1iZXIoKSA9PT0gMSlcclxuICAgICAgICAgICAgdGhpcy5sb2FkKCk7XHJcbiAgICAgICAgdGhpcy52bS5QYWdlSW5mby5QYWdlTnVtYmVyKDEpO1xyXG4gICAgfVxyXG4gICAgc2V0dXBCaW5kaW5ncygpIHtcclxuICAgICAgICAvL2FkZCBjbGljayBoYW5kbGVycyB0byB0aGUgY29sdW1uLWhlYWRpbmdzXHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vIGNsaWNrIC0gY29sdW1uIGhlYWRlcnNcclxuICAgICAgICAkKFwiLnRhYmxlLWhvbGRlci1cIiArIHRoaXMuZGF0YS5UaXRsZSkub24oXCJjbGlja1wiLCBcIi5jb2x1bW4taGVhZGluZ1wiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTsgLy8ndGhpcycgaXMgbG9jYWxcclxuICAgICAgICAgICAgdmFyIGlzVXAgPSBkYXRhLklzU29ydGVkVXAoKTtcclxuICAgICAgICAgICAgdmFyIGlzRG93biA9IGRhdGEuSXNTb3J0ZWREb3duKCk7XHJcbiAgICAgICAgICAgIC8vbmVpdGhlciAtPiB1cFxyXG4gICAgICAgICAgICBpZiAoIWlzVXAgJiYgIWlzRG93bikge1xyXG4gICAgICAgICAgICAgICAgZGF0YS5Jc1NvcnRlZFVwKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgLy9hZGQgY29sdW1uIGFzYyB0byBhcnJheSArIHJlbW92ZSBvdGhlciB2YXJpYW50cyBvZiB0aGlzIGNvbHVtblxyXG4gICAgICAgICAgICAgICAgc2VsZi5zb3J0QnkucHVzaChkYXRhLlNvcnRDb2x1bW4oKSArIFwiIGFzY1wiKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuc29ydEJ5ID0gXy53aXRob3V0KHNlbGYuc29ydEJ5LCBkYXRhLlNvcnRDb2x1bW4oKSArIFwiIGRlc2NcIik7XHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZGVmYXVsdCBzb3J0IGlmIGl0J3Mgbm90IHRoZSBzYW1lIHNvcnQgd2UganVzdCBpbnZva2VkXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kZWZhdWx0U29ydCAhPT0gZGF0YS5Tb3J0Q29sdW1uKCkgKyBcIiBhc2NcIilcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRCeSA9IF8ud2l0aG91dChzZWxmLnNvcnRCeSwgc2VsZi5kZWZhdWx0U29ydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy91cCAtPiBkb3duXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVXApIHtcclxuICAgICAgICAgICAgICAgIGRhdGEuSXNTb3J0ZWRVcChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBkYXRhLklzU29ydGVkRG93bih0cnVlKTtcclxuICAgICAgICAgICAgICAgIC8vYWRkIGNvbHVtbiBkZXNjIHRvIGFycmF5ICsgcmVtb3ZlIG90aGVyIHZhcmlhbnRzIG9mIHRoaXMgY29sdW1uXHJcbiAgICAgICAgICAgICAgICBzZWxmLnNvcnRCeS5wdXNoKGRhdGEuU29ydENvbHVtbigpICsgXCIgZGVzY1wiKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuc29ydEJ5ID0gXy53aXRob3V0KHNlbGYuc29ydEJ5LCBkYXRhLlNvcnRDb2x1bW4oKSArIFwiIGFzY1wiKTtcclxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBkZWZhdWx0IHNvcnQgaWYgaXQncyBub3QgdGhlIHNhbWUgc29ydCB3ZSBqdXN0IGludm9rZWRcclxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmRlZmF1bHRTb3J0ICE9PSBkYXRhLlNvcnRDb2x1bW4oKSArIFwiIGRlc2NcIilcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRCeSA9IF8ud2l0aG91dChzZWxmLnNvcnRCeSwgc2VsZi5kZWZhdWx0U29ydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9kb3duIC0+IG5laXRoZXJcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLklzU29ydGVkVXAoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5Jc1NvcnRlZERvd24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy9yZW1vdmUgYWxsIHZhcmlhbnRzIG9mIHRoaXMgY29sdW1uXHJcbiAgICAgICAgICAgICAgICBzZWxmLnNvcnRCeSA9IF8ud2l0aG91dChzZWxmLnNvcnRCeSwgZGF0YS5Tb3J0Q29sdW1uKCkgKyBcIiBkZXNjXCIpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zb3J0QnkgPSBfLndpdGhvdXQoc2VsZi5zb3J0QnksIGRhdGEuU29ydENvbHVtbigpICsgXCIgYXNjXCIpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zb3J0QnkgPSBfLndpdGhvdXQoc2VsZi5zb3J0QnksIHNlbGYuZGVmYXVsdFNvcnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vaWYgbm8gc29ydCBhZGQgZGVmYXVsdFxyXG4gICAgICAgICAgICBpZiAoc2VsZi5zb3J0QnkubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICAgICAgc2VsZi5zb3J0QnkucHVzaChzZWxmLmRlZmF1bHRTb3J0KTtcclxuICAgICAgICAgICAgc2VsZi5vcmRlcmJ5ID0gc2VsZi5zb3J0Qnkuam9pbihcIiwgXCIpO1xyXG4gICAgICAgICAgICBzZWxmLmxvYWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIGNsaWNrIC0gcGFnaW5nIGNvbnRyb2xzXHJcbiAgICAgICAgJChcIi5wYWdpbmF0aW9uLWNvbnRhaW5lci1cIiArIHRoaXMuZGF0YS5UaXRsZSArIFwiIC5wYWdpbmF0aW9uXCIpLm9uKFwiY2xpY2tcIiwgXCJhLCBidXR0b25cIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgYUxpbmsgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgdm0gPSBrby5kYXRhRm9yKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAoJChhTGluaykucGFyZW50KCkuaGFzQ2xhc3MoXCJkaXNhYmxlZFwiKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHZhciBhVGV4dCA9ICQoYUxpbmspLnRleHQoKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBhZ2VOdW1iZXIgPSB2bS5QYWdlSW5mby5QYWdlTnVtYmVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYVRleHQuaW5kZXhPZihcImZpcnN0XCIpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFUZXh0LmluZGV4T2YoXCJwcmV2XCIpID4gLTEgfHwgJChhTGluaykuaGFzQ2xhc3MoJ3ByZXYnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIgPSBwYWdlTnVtYmVyIC0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFUZXh0LmluZGV4T2YoXCJuZXh0XCIpID4gLTEgfHwgJChhTGluaykuaGFzQ2xhc3MoJ25leHQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIgPSBwYWdlTnVtYmVyICsgMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFUZXh0LmluZGV4T2YoXCJsYXN0XCIpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyID0gc2VsZi52bS5QYWdlSW5mby5QYWdlQ291bnQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgeyAvL251bWJlcnNcclxuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyID0gcGFyc2VJbnQoYVRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdm0uUGFnZUluZm8uUGFnZU51bWJlcihwYWdlTnVtYmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL3NlbGYubG9hZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvL2NsZWFycyBzb3J0cyBvbiBhbGwgY29sdW1ucyBleGNlcHQgb25lcyBuYW1lZFxyXG4gICAgY2xlYXJTb3J0Q29sdW1ucyhkb3ROb3RDbGVhckNvbHVtbk5hbWUpIHtcclxuICAgICAgICBfLmVhY2godGhpcy52bS5Db2x1bW5zKCksICh2KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2LkNvbHVtbk5hbWUoKSAhPT0gZG90Tm90Q2xlYXJDb2x1bW5OYW1lKSB7XHJcbiAgICAgICAgICAgICAgICB2LklzU29ydGVkVXAoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdi5Jc1NvcnRlZERvd24oZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0b3AoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnZtLlBhZ2VJbmZvLlBhZ2VTaXplKCkpO1xyXG4gICAgfVxyXG4gICAgc2tpcCgpIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMudm0uUGFnZUluZm8uUGFnZU51bWJlcigpIC0gMSkgKiB0aGlzLnRvcCgpO1xyXG4gICAgfVxyXG4gICAgLy9zZW5kcyBhamF4IGNhbGwgZm9yIGRhdGEgXHJcbiAgICBsb2FkKCkge1xyXG4gICAgICAgIHRoaXMudm0uZm9ybS5pc0RlbGV0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgJCgnI2xvYWRpbmcnKS5oZWlnaHQoJCh3aW5kb3cpLmhlaWdodCgpKTtcclxuICAgICAgICB0aGlzLnZtLklzTG9hZGluZyh0cnVlKTtcclxuICAgICAgICAvL2Zvcm1hdCB0aGUgcmVxdWVzdFxyXG4gICAgICAgIHZhciByZXF1ZXN0RGF0YSA9IHtcclxuICAgICAgICAgICAgJGlubGluZWNvdW50OiBcImFsbHBhZ2VzXCIsXHJcbiAgICAgICAgICAgICRvcmRlcmJ5OiB0aGlzLm9yZGVyYnksXHJcbiAgICAgICAgICAgICR0b3A6IHRoaXMudG9wKCksXHJcbiAgICAgICAgICAgICRza2lwOiB0aGlzLnNraXAoKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy9hZGQgaW4gZmlsdGVyc1xyXG4gICAgICAgICQuZXh0ZW5kKHJlcXVlc3REYXRhLCBrby50b0pTKHRoaXMudm0uRmlsdGVycykpO1xyXG4gICAgICAgIC8vbWFrZSB0aGUgcmVxdWVzdFxyXG4gICAgICAgIHZhciByZXNwb25zZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogdGhpcy5vRGF0YVVybCxcclxuICAgICAgICAgICAgZGF0YVR5cGU6IFwianNvblwiLFxyXG4gICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGRhdGE6IHJlcXVlc3REYXRhXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy9oYW5kbGUgc3VjY2Vzc2Z1bCByZXNwb25zZVxyXG4gICAgICAgIHJlc3BvbnNlLmRvbmUocmVzcG9uc2VkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkUmVzcG9uc2UocmVzcG9uc2VkYXRhKTtcclxuICAgICAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFRhYmxlO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5leHBvcnRzLlZtQmFzZSA9IHZvaWQgMDtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbndpbmRvd1snJCddID0gJDtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGtvbWFwcGluZyA9IHJlcXVpcmUoXCJrbm9ja291dC5tYXBwaW5nXCIpO1xyXG5rby5tYXBwaW5nID0ga29tYXBwaW5nO1xyXG53aW5kb3dbJ2tvJ10gPSBrbzsgLy9mb3IgY29uc29sZSBkZWJ1Z2dpbmdcclxuY29uc3Qga29leHRlbnNpb25zID0gcmVxdWlyZShcIi4vS29CaW5kaW5nRXh0ZW5zaW9uc1wiKTtcclxubmV3IGtvZXh0ZW5zaW9ucygpLnJlZ2lzdGVyKCk7XHJcbmNvbnN0IGtvc2VsZWN0MiA9IHJlcXVpcmUoXCIuL0tvQmluZGluZ1NlbGVjdDJcIik7XHJcbm5ldyBrb3NlbGVjdDIoKS5hZGRCaW5kaW5nKCk7XHJcbmNvbnN0IG1vbW1lbnREYXRldGltZUtvID0gcmVxdWlyZShcIm1vbWVudC1kYXRlcGlja2VyLWtvXCIpO1xyXG5tb21tZW50RGF0ZXRpbWVLbztcclxuY29uc3QgbW9tbWVudERhdGV0aW1lID0gcmVxdWlyZShcIm1vbWVudC1kYXRlcGlja2VyXCIpO1xyXG5tb21tZW50RGF0ZXRpbWU7XHJcbmNvbnN0IGJvb3RzdHJhcCA9IHJlcXVpcmUoXCJib290c3RyYXBcIik7XHJcbmJvb3RzdHJhcDtcclxuY2xhc3MgVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIGZvcm1UeXBlLCB0YWJsZVR5cGUsIHJvdXRlclR5cGUpIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKGRhdGEsIGRhdGEuS09NYXBwaW5nLCB0aGlzKTtcclxuICAgICAgICB0aGlzLnNldHVwQmluZGluZ3MoKTtcclxuICAgICAgICAvL3NhdmUgY29weSBvZiB3aGF0IGEgZW1wdHkgaXRlbSBsb29rcyBsaWtlIGZvciBjcmVhdGluZyBhZnRlciBlZGl0aW5nXHJcbiAgICAgICAgdGhpcy5OZXdJdGVtRGV0YWlsID0ga28ubWFwcGluZy50b0pTKHRoaXMuSXRlbURldGFpbCk7XHJcbiAgICAgICAgaWYgKGZvcm1UeXBlICE9PSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLmZvcm0gPSBuZXcgZm9ybVR5cGUoZGF0YSwgdGhpcyk7XHJcbiAgICAgICAgaWYgKHRhYmxlVHlwZSAhPT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy50YWJsZSA9IG5ldyB0YWJsZVR5cGUoZGF0YSwgdGhpcyk7XHJcbiAgICAgICAgaWYgKHJvdXRlclR5cGUgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHRoaXMucm91dGVzID0gbmV3IHJvdXRlclR5cGUoZGF0YSwgdGhpcyk7XHJcbiAgICB9XHJcbiAgICBzZXR1cEJpbmRpbmdzKCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAkKCcuYWxlcnRzLWhvbGRlcicpLm9uKCdjbGljaycsICcuY2xvc2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHNlbGYuQWxlcnRzLnJlbW92ZShkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCdib2R5Jykub24oJ2NsaWNrJywgJy5tYWluLWhhbWJ1cmdlcicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJChcIiN3cmFwcGVyXCIpLnRvZ2dsZUNsYXNzKFwidG9nZ2xlZFwiKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyQoJ2JvZHknKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gICAgJChcIiN3cmFwcGVyXCIpLnJlbW92ZUNsYXNzKFwidG9nZ2xlZFwiKTtcclxuICAgICAgICAvL30pXHJcbiAgICB9XHJcbiAgICBBZGRBbGVydChtZXNzYWdlLCBhbGVydFR5cGUpIHtcclxuICAgICAgICB2YXIgY3NzID0gJ2FsZXJ0LXdhcm5pbmcnO1xyXG4gICAgICAgIGlmIChhbGVydFR5cGUgPT09ICdpbmZvJylcclxuICAgICAgICAgICAgY3NzID0gJ2FsZXJ0LWluZm8nO1xyXG4gICAgICAgIGlmIChhbGVydFR5cGUgPT09ICdlcnJvcicpXHJcbiAgICAgICAgICAgIGNzcyA9ICdhbGVydC1kYW5nZXInO1xyXG4gICAgICAgIGlmIChhbGVydFR5cGUgPT09ICdzdWNjZXNzJylcclxuICAgICAgICAgICAgY3NzID0gJ2FsZXJ0LXN1Y2Nlc3MnO1xyXG4gICAgICAgIHRoaXMuQWxlcnRzLnB1c2goe1xyXG4gICAgICAgICAgICBNZXNzYWdlOiBtZXNzYWdlLFxyXG4gICAgICAgICAgICBUeXBlOiBjc3MsXHJcbiAgICAgICAgICAgIElzVmlzaWJsZToga28ub2JzZXJ2YWJsZSh0cnVlKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMuVm1CYXNlID0gVm1CYXNlO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBDYWxsVG9BY3Rpb24gZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBDYWxsVG9BY3Rpb247XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuLyoqXHJcbiAqIE1vZGFsIHRoYXQgY2FuIGJlIHVzZWQgYW55d2hlcmUuXHJcbiAqIEBwYXJhbSAge1N0cmluZ30gIG1vZGFsTmFtZSAgTmFtZSBvZiB0aGUgbW9kYWxcclxuICovXHJcbmNsYXNzIE1vZGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKG1vZGFsTmFtZSkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG1vZGFsTmFtZTtcclxuICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLiR0cmlnZ2VyID0gJCgnW2RhdGEtbW9kYWwtdHJpZ2dlcj1cIicgKyBtb2RhbE5hbWUgKyAnXCJdJyk7XHJcbiAgICAgICAgdGhpcy4kbW9kYWwgPSAkKCdbZGF0YS1tb2RhbD1cIicgKyBtb2RhbE5hbWUgKyAnXCJdJyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluaXQgZnVuY3Rpb24gZm9yIGFuIGluZGl2dWFsIG1vZGFsIC0gU2V0cyB1cCBjbGljayBhY3Rpb25zLlxyXG4gICAgICovXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIHZhciBtb2RhbCA9IHRoaXM7XHJcbiAgICAgICAgaWYgKCQoJ1tkYXRhLW1vZGFsLW92ZXJsYXldJykubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgICAgICAkKCcud3JhcHBlciwgLm1vZGFsLWJvZHknKS5hZnRlcignPGRpdiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIiBkYXRhLW1vZGFsLW92ZXJsYXkgZGF0YS1zdGF0ZT1cImhpZGRlblwiPjwvZGl2PicpO1xyXG4gICAgICAgICAgICAkKCdbZGF0YS1tb2RhbC1vdmVybGF5XSwgW2RhdGEtbW9kYWwtY2xvc2VdJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgbW9kYWwuY2xvc2UoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuJG1vZGFsLmF0dHIoJ2RhdGEtc3RhdGUnLCAnaGlkZGVuJyk7XHJcbiAgICAgICAgLy90aGlzLiR0cmlnZ2VyLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIC8vICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgLy8gICAgbW9kYWwub3BlbigpO1xyXG4gICAgICAgIC8vfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRvIG9wZW4gdGhpcyBNb2RhbFxyXG4gICAgICovXHJcbiAgICBvcGVuKGlkKSB7XHJcbiAgICAgICAgdGhpcy5ldmVudElkID0gaWQ7XHJcbiAgICAgICAgdmFyICRvdmVybGF5ID0gJCgnW2RhdGEtbW9kYWwtb3ZlcmxheV0nKS5maXJzdCgpO1xyXG4gICAgICAgIC8vIHZhciAkY2xvbmUgPSB0aGlzLiRtb2RhbC5jbG9uZSgpLmF0dHIoJ2RhdGEtc3RhdGUnLCAndmlzaWJsZScpO1xyXG4gICAgICAgIHRoaXMuJG1vZGFsLmF0dHIoJ2RhdGEtc3RhdGUnLCAndmlzaWJsZScpO1xyXG4gICAgICAgICRvdmVybGF5LmF0dHIoJ2RhdGEtc3RhdGUnLCAndmlzaWJsZScpO1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRvIENsb3NlIHRoaXMgTW9kYWxcclxuICAgICAqL1xyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgdmFyICRvdmVybGF5ID0gJCgnW2RhdGEtbW9kYWwtb3ZlcmxheV0nKS5maXJzdCgpO1xyXG4gICAgICAgIHRoaXMuJG1vZGFsLmF0dHIoJ2RhdGEtc3RhdGUnLCAnaGlkZGVuJyk7XHJcbiAgICAgICAgJG92ZXJsYXkuYXR0cignZGF0YS1zdGF0ZScsICdoaWRkZW4nKTtcclxuICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGFsO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBDb25uZWN0Um91dGVyID0gcmVxdWlyZShcIi4vQ29ubmVjdFJvdXRlclwiKTtcclxuY29uc3QgQ29ubmVjdEZvcm0gPSByZXF1aXJlKFwiLi9Db25uZWN0Rm9ybVwiKTtcclxuY29uc3QgTW9kYWwgPSByZXF1aXJlKFwiLi4vQ29tbW9uL01vZGFsXCIpO1xyXG5jbGFzcyBDb25uZWN0IGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgQ29ubmVjdEZvcm0sIFRhYmxlLCBDb25uZWN0Um91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMubW9kYWwgPSBuZXcgTW9kYWwoXCJ1bnN1YnNjcmliZVwiKTtcclxuICAgICAgICB0aGlzLm1vZGFsLmluaXQoKTtcclxuICAgICAgICB0aGlzLk9yaWdpbmFsRW1haWwgPSBrby5vYnNlcnZhYmxlKCcnKTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZS1jb25uZWN0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuZm9ybS5wb3N0KCk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi9Db25uZWN0VXMjL3RoYW5reW91XCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnLm1vZGFsZm9ybS1ob2xkZXInKS5vbignY2xpY2snLCAnI3VwZGF0ZS1jb25uZWN0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygndXBkYXRlJyk7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gdGhpcy5mb3JtLnBvc3QoKTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL2Nvbm5lY3R1cyMvdGhhbmt5b3VcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZS1jb25uZWN0LXN0YW5kYWxvbmUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gdGhpcy5mb3JtLnBvc3QoKTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL0Nvbm5lY3RVcy9TdGFuZEFsb25lIy90aGFua3lvdVwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5tb2RhbGZvcm0taG9sZGVyJykub24oJ2NsaWNrJywgJyN1bnN1YnNjcmliZScsICgpID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmZvcm0udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL2Nvbm5lY3R1cyMvdW5zdWJzY3JpYmVkXCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmZhaWwoKGVycm9yKSA9PiB0aGlzLmZvcm0ucG9zdFByb21pc2VGYWlsKGVycm9yKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLmtleXByZXNzKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBrZXkgPSBlLndoaWNoO1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAxMykgLy8gdGhlIGVudGVyIGtleSBjb2RlXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAkKCcjc2F2ZS1jb25uZWN0JykuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5tb2RhbGZvcm0taG9sZGVyJykub24oJ2NsaWNrJywgJyN1bnN1YnNjcmliZS1tb2RhbCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb2RhbC5vcGVuKCd1bnN1YnNjcmliZScpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbm5lY3Q7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgQ29ubmVjdEZvcm0gZXh0ZW5kcyBGb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBlZGl0QWN0aW9uID0gJ0VkaXQnKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGVkaXRBY3Rpb24pO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgICAgIHRoaXMuZWRpdEFjdGlvbiA9IGVkaXRBY3Rpb247XHJcbiAgICAgICAgJCgnI0VtYWlsT3B0SW4nKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2bS5JdGVtRGV0YWlsLkVtYWlsKCkgPT09IG51bGwgfHwgdm0uSXRlbURldGFpbC5FbWFpbCgpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdm0uSXRlbURldGFpbC5FbWFpbCgnbm9uZScpO1xyXG4gICAgICAgICAgICAgICAgdm0uSXRlbURldGFpbC5FbWFpbCgnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZtLkl0ZW1EZXRhaWwuQ29uZmlybUVtYWlsKCkgPT09IG51bGwgfHwgdm0uSXRlbURldGFpbC5Db25maXJtRW1haWwoKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHZtLkl0ZW1EZXRhaWwuQ29uZmlybUVtYWlsKCdub25lJyk7XHJcbiAgICAgICAgICAgICAgICB2bS5JdGVtRGV0YWlsLkNvbmZpcm1FbWFpbCgnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVFcnJvcnMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcjU21zT3B0SW4nKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2bS5JdGVtRGV0YWlsLlBob25lKCkgPT09IG51bGwgfHwgdm0uSXRlbURldGFpbC5QaG9uZSgpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdm0uSXRlbURldGFpbC5QaG9uZSgnbm9uZScpO1xyXG4gICAgICAgICAgICAgICAgdm0uSXRlbURldGFpbC5QaG9uZSgnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVFcnJvcnMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByb21pc2VEb25lKGRhdGEsIGlkKSB7XHJcbiAgICAgICAgc3VwZXIuZ2V0UHJvbWlzZURvbmUoZGF0YSwgaWQpO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5SZXR1cm5Vcmw7XHJcbiAgICB9XHJcbiAgICByZW1vdmVFcnJvcnMoKSB7XHJcbiAgICAgICAgJCgnI0l0ZW1EZXRhaWxfRW1haWxPcHRJbicpLnRleHQoJycpO1xyXG4gICAgICAgICQoJyNJdGVtRGV0YWlsX0VtYWlsT3B0SW4nKS5yZW1vdmVDbGFzcygnbGFiZWwnKS5yZW1vdmVDbGFzcygnbGFiZWwtZGFuZ2VyJyk7XHJcbiAgICAgICAgJCgnI0l0ZW1EZXRhaWxfRW1haWxPcHRJbicpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKS5yZW1vdmVDbGFzcygnaGFzLWZlZWRiYWNrJyk7XHJcbiAgICAgICAgJCgnI0l0ZW1EZXRhaWxfU21zT3B0SW4nKS50ZXh0KCcnKTtcclxuICAgICAgICAkKCcjSXRlbURldGFpbF9TbXNPcHRJbicpLnJlbW92ZUNsYXNzKCdsYWJlbCcpLnJlbW92ZUNsYXNzKCdsYWJlbC1kYW5nZXInKTtcclxuICAgICAgICAkKCcjSXRlbURldGFpbF9TbXNPcHRJbicpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKS5yZW1vdmVDbGFzcygnaGFzLWZlZWRiYWNrJyk7XHJcbiAgICB9XHJcbiAgICB1bnN1YnNjcmliZSgpIHtcclxuICAgICAgICB2YXIgbWFwcGluZyA9IHtcclxuICAgICAgICAgICAgJ2lnbm9yZSc6IHRoaXMudm0uZGF0YS5LT01hcHBpbmcuYWxsTm9uUG9zdEJhY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBwb3N0RGF0YSA9IGtvLm1hcHBpbmcudG9KUyh0aGlzLnZtLCBtYXBwaW5nKTtcclxuICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogJy9jb25uZWN0dXMvdW5zdWJzY3JpYmUnLFxyXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksXHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbiAgICBnZXRTdWJzY3JpYmVyKGlkKSB7XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6ICcvY29ubmVjdHVzL3N1YnNjcmliZXI/aWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChpZCksXHJcbiAgICAgICAgICAgIHR5cGU6ICdHRVQnLFxyXG4gICAgICAgICAgICBjYWNoZTogZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoKGRhdGEpID0+IHRoaXMucmVmcmVzaEZpZWxkcyhkYXRhKSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbiAgICByZWZyZXNoRmllbGRzKGRhdGEpIHtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWwuRmlyc3ROYW1lKGRhdGEuSXRlbURldGFpbC5GaXJzdE5hbWUpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbC5MYXN0TmFtZShkYXRhLkl0ZW1EZXRhaWwuTGFzdE5hbWUpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbC5FbWFpbChkYXRhLkl0ZW1EZXRhaWwuRW1haWwpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbC5Db25maXJtRW1haWwoZGF0YS5JdGVtRGV0YWlsLkNvbmZpcm1FbWFpbCk7XHJcbiAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsLlppcChkYXRhLkl0ZW1EZXRhaWwuWmlwKTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWwuQmlydGhkYXlEYXkoZGF0YS5JdGVtRGV0YWlsLkJpcnRoZGF5RGF5KTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWwuQmlydGhkYXlNb250aChkYXRhLkl0ZW1EZXRhaWwuQmlydGhkYXlNb250aCk7XHJcbiAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsLlVuaXF1ZUlkKGRhdGEuSXRlbURldGFpbC5VbmlxdWVJZCk7XHJcbiAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsLkVtYWlsT3B0SW4odHJ1ZSk7XHJcbiAgICAgICAgdGhpcy52bS5PcmlnaW5hbEVtYWlsKGRhdGEuSXRlbURldGFpbC5FbWFpbCk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBDb25uZWN0Rm9ybTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgQ29ubmVjdFJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYC9Db25uZWN0VXMjL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VW5zdWJzY3JpYmVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLklzVXBkYXRlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgL0Nvbm5lY3RVcyMvdGhhbmt5b3VgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdSh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dVbnN1YnNjcmliZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uSXNVcGRhdGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAvQ29ubmVjdC9TdGFuZEFsb25lIy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VGhhbmtZb3UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uU2hvd1Vuc3Vic2NyaWJlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5Jc1VwZGF0ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYC9Db25uZWN0L1N0YW5kQWxvbmUjL3RoYW5reW91YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VGhhbmtZb3UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VW5zdWJzY3JpYmVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLklzVXBkYXRlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgL0Nvbm5lY3RVcyMvcHJvZmlsZWAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zLnVpZDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHNlbGYudm0uZm9ybS5nZXRTdWJzY3JpYmVyKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoKCkgPT4gc2VsZi52bS5Jc1VwZGF0ZSh0cnVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5mYWlsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi9jb25uZWN0dXMjL25ld1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYC9jb25uZWN0dXMjL3Vuc3Vic2NyaWJlZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uU2hvd1RoYW5rWW91KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dVbnN1YnNjcmliZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5Jc1VwZGF0ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQ29ubmVjdFJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNvbnN0IENvbnRhY3RVc1JvdXRlciA9IHJlcXVpcmUoXCIuL0NvbnRhY3RVc1JvdXRlclwiKTtcclxuY29uc3QgXyA9IHJlcXVpcmUoXCJ1bmRlcnNjb3JlXCIpO1xyXG5jb25zdCBTdG9yZSA9IHJlcXVpcmUoXCIuLi9TdG9yZS9TdG9yZVwiKTtcclxuY2xhc3MgQ29udGFjdFVzIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIENvbnRhY3RVc1JvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICAvL3NldHVwIHRhYmxlLCByb3V0ZXMgYW5kIGZvcm1cclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy9yZXVzZSB0aGUgc3RvcmUgdm0gZm9yIHN0b3JlIHNlYXJjaFxyXG4gICAgICAgIHRoaXMuc3RvcmVWbSA9IG5ldyBTdG9yZShkYXRhLlN0b3JlVmlld01vZGVsLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5JdGVtRGV0YWlsLlN0b3JlU3RhdGUuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09ICd1bmRlZmluZWQnICYmIG5ld1ZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuU3RvcmVDaXRpZXMucmVtb3ZlQWxsKCk7XHJcbiAgICAgICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgICAgIHVybDogJy9hcGkvU3RvcmUvR2V0U3RvcmVDaXRpZXNCeVN0YXRlP3N0YXRlPScgKyBuZXdWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmVhY2goZGF0YSwgKHYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuU3RvcmVDaXRpZXMucHVzaCh2KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLkl0ZW1EZXRhaWwuU3RvcmVDaXR5LnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiBuZXdWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlN0b3JlQWRkcmVzc2VzLnJlbW92ZUFsbCgpO1xyXG4gICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6ICcvYXBpL1N0b3JlL0dldFN0b3Jlc0J5U3RhdGVBbmRDaXR5P3N0YXRlPScgKyB0aGlzLkl0ZW1EZXRhaWwuU3RvcmVTdGF0ZSgpICsgJyZjaXR5PScgKyBuZXdWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmVhY2goZGF0YSwgKHYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuU3RvcmVBZGRyZXNzZXMucHVzaCh2KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZS1jb250YWN0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICAkKCcjSXRlbURldGFpbF9SZXF1aXJlUmVzcG9uc2UnKS50ZXh0KCcnKTtcclxuICAgICAgICAgICAgJCgnI0l0ZW1EZXRhaWxfUmVxdWlyZVJlc3BvbnNlJykucmVtb3ZlQ2xhc3MoJ2xhYmVsJykucmVtb3ZlQ2xhc3MoJ2xhYmVsLWRhbmdlcicpO1xyXG4gICAgICAgICAgICAkKCcjSXRlbURldGFpbF9SZXF1aXJlUmVzcG9uc2UnKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnaGFzLWVycm9yJykucmVtb3ZlQ2xhc3MoJ2hhcy1mZWVkYmFjaycpO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuZm9ybS5wb3N0KCk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL0NvbnRhY3RVcyMvdGhhbmt5b3VcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoXCIuaGlkZVVuYm91bmRcIikucmVtb3ZlQ2xhc3MoXCJoaWRlVW5ib3VuZFwiKTtcclxuICAgICAgICAkKFwiZm9ybS5jb250YWN0LXVzIC5yb3cgPiBkaXZcIikub24oXCJmb3JtOnByb3BlcnR5LnZhbGlkYXRpb24uZXJyb3JcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdmFyIGlkID0gJChlLnRhcmdldCkuZmluZChcImlucHV0XCIpLnByb3AoXCJpZFwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coaWQpO1xyXG4gICAgICAgICAgICB2YXIgZmZlID0gJChcImZvcm0uY29udGFjdC11cyAuZmYtYWRkcmVzcy13cmFwcGVyIC5lcnJvci1tZXNzYWdlXCIpO1xyXG4gICAgICAgICAgICBpZiAoaWQgPT09IFwiSXRlbURldGFpbF9BZGRyZXNzXCIpXHJcbiAgICAgICAgICAgICAgICBmZmUuc2hvdygpO1xyXG4gICAgICAgICAgICBpZiAoaWQgPT09IFwiSXRlbURldGFpbF9DaXR5XCIpXHJcbiAgICAgICAgICAgICAgICBmZmUuc2hvdygpO1xyXG4gICAgICAgICAgICBpZiAoaWQgPT09IFwiSXRlbURldGFpbF9TdGF0ZVwiKVxyXG4gICAgICAgICAgICAgICAgZmZlLnNob3coKTtcclxuICAgICAgICAgICAgaWYgKGlkID09PSBcIkl0ZW1EZXRhaWxfWmlwXCIpXHJcbiAgICAgICAgICAgICAgICBmZmUuc2hvdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vJCgnI0l0ZW1EZXRhaWxfUHVyY2hhc2VEYXRlJykudmFsKCdtbS9kZC95eXl5Jyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBDb250YWN0VXM7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIENvbnRhY3RVc1JvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJy9Db250YWN0VXMjL25ldycsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvcmlnaW4gPSB0aGlzLnBhcmFtcy5wbGF0Zm9ybTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbiAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLkl0ZW1EZXRhaWwuT3JpZ2luKG9yaWdpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uU2hvd1RoYW5rWW91KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnL0NvbnRhY3RVcyMvdGhhbmt5b3UnLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRhY3RVc1JvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgQ29udGFjdFJvdXRlciA9IHJlcXVpcmUoXCIuL0NvbnRhY3RSb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBDb250YWN0IGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIENvbnRhY3RSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRhY3Q7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIENvbnRhY3RSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGFjdFJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vLyBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBPcmFuZ2UgT25pb24gU2NhZmZvbGRlci5cclxuLy8gdGVtcGxhdGU6IE1WQy5KU01vZHVsZS5jc1xyXG4vLyBjbGFzczogQ29udGVudFBhZ2VUcmVlVmlld1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIENvbnRlbnRQYWdlVHJlZVZpZXcgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBDb250ZW50UGFnZVRyZWVWaWV3O1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBDb250ZW50UGFnZUZvcm0gPSByZXF1aXJlKFwiLi9Db250ZW50UGFnZUZvcm1cIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFBhZ2VCYXNlID0gcmVxdWlyZShcIi4vQ29udGVudFBhZ2VCYXNlXCIpO1xyXG5jb25zdCBDb250ZW50UGFnZVJvdXRlciA9IHJlcXVpcmUoXCIuL0NvbnRlbnRQYWdlUm91dGVyXCIpO1xyXG5jbGFzcyBDb250ZW50UGFnZSBleHRlbmRzIFBhZ2VCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIGFwcGx5QmluZGluZ3MgPSB0cnVlKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBDb250ZW50UGFnZUZvcm0sIFRhYmxlLCBDb250ZW50UGFnZVJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBpZiAoYXBwbHlCaW5kaW5ncykge1xyXG4gICAgICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBDb250ZW50UGFnZTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNsYXNzIENvbnRlbnRQYWdlQmFzZSBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIGZvcm1UeXBlLCB0YWJsZVR5cGUsIHJvdXRlclR5cGUpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCBmb3JtVHlwZSwgdGFibGVUeXBlLCByb3V0ZXJUeXBlKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGVudFBhZ2VCYXNlO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBfID0gcmVxdWlyZShcInVuZGVyc2NvcmVcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xyXG5jb25zdCBzdW1tZXJub3RlID0gcmVxdWlyZShcInN1bW1lcm5vdGVcIik7XHJcbnN1bW1lcm5vdGU7XHJcbmNsYXNzIENvbnRlbnRQYWdlRm9ybSBleHRlbmRzIEZvcm0ge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0pIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICAgICAgdGhpcy52ZXJzaW9uRXJyb3JLZXkgPSAnQ0YxQjYxODMtOEExMS00NDlGLThDNEItRDFBRTEzQjdERTBGJztcclxuICAgICAgICB0aGlzLm5ld1BhZ2VOYW1lID0ga28ub2JzZXJ2YWJsZSgnJyk7XHJcbiAgICAgICAgdGhpcy5uZXdQYWdlTmFtZS5zdWJzY3JpYmUoKG5ld1ZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudm0uTmV3SXRlbURldGFpbC5OYW1lKG5ld1ZhbHVlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmFkZEl0ZW1EZXRhaWxDbGllbnRPbmx5UHJvcGVydGllcygpO1xyXG4gICAgfVxyXG4gICAgc2V0dXBUYWJzKCkge1xyXG4gICAgICAgICQodGhpcy50YWJSb3dTZWxlY3RvciArICcgaDInKS5oaWRlKCk7XHJcbiAgICAgICAgLy9jcmVhdGUgYSBrbm9ja291dG9ic2VydmFibGUgZm9yZWFjaCBoMiBpbnNpZGUgYSByb3dcclxuICAgICAgICAkKHRoaXMudGFiUm93U2VsZWN0b3IgKyAnIGgyJykuZWFjaCgoaW5kZXgsIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gJCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHZhciBhdHRyID0gJ3Zpc2libGU6ICRyb290LkFjdGl2ZVRhYkluZGV4KCkgPT09ICcgKyBpbmRleC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAkKHZhbHVlKS5wYXJlbnQoKS5wYXJlbnQoKS5hdHRyKCdkYXRhLWJpbmQnLCBhdHRyKTtcclxuICAgICAgICAgICAgdmFyIGFsbExhbmcgPSB0aGlzLnZtLk1ldGEuQWxsTGFuZ3VhZ2VzO1xyXG4gICAgICAgICAgICB2YXIgbWF0Y2hpbmdMYW5nID0gXy5maW5kV2hlcmUoYWxsTGFuZywgeyBOYW1lOiBlbGVtZW50Lmh0bWwoKSB9KTtcclxuICAgICAgICAgICAgdmFyIG5ld1RhYiA9IHtcclxuICAgICAgICAgICAgICAgIFRleHQ6IGtvLm9ic2VydmFibGUoZWxlbWVudC5odG1sKCkpLFxyXG4gICAgICAgICAgICAgICAgRXJyb3JDb3VudDoga28ub2JzZXJ2YWJsZSgwKSxcclxuICAgICAgICAgICAgICAgIENoYW5nZUNvdW50OiBrby5vYnNlcnZhYmxlKDApLFxyXG4gICAgICAgICAgICAgICAgSGlkZGVuOiBrby5vYnNlcnZhYmxlKGZhbHNlKSxcclxuICAgICAgICAgICAgICAgIElkOiBudWxsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ0xhbmcpIHtcclxuICAgICAgICAgICAgICAgIG5ld1RhYi5JZCA9IG1hdGNoaW5nTGFuZy5JZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnZtLkZvcm1UYWJzLnB1c2gobmV3VGFiKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnZtLkFjdGl2ZVRhYkluZGV4KDApO1xyXG4gICAgfVxyXG4gICAgLy9maW5kIHRoZSBmb3JtIGlucHV0IGJhc2VkIG9uIHByb3BydHkga2V5XHJcbiAgICBhZGRQcm9wZXJ0eUVycm9yKHByb3BlcnR5RXJyb3IpIHtcclxuICAgICAgICB2YXIga2V5ID0gcHJvcGVydHlFcnJvci5LZXksIG1lc3NhZ2UgPSBwcm9wZXJ0eUVycm9yLkVycm9yTWVzc2FnZTtcclxuICAgICAgICB2YXIgZm9ybWlucHV0ID0gbnVsbDtcclxuICAgICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy52ZXJzaW9uRXJyb3JLZXkpID4gLTEpIHtcclxuICAgICAgICAgICAgZm9ybWlucHV0ID0gdGhpcy5nZXRWZXJzaW9uRm9ybUlucHV0KGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvL2ZpbmQgbWF0Y2hpbmcgaW5wdXRcclxuICAgICAgICAgICAgZm9ybWlucHV0ID0gJCgnIycgKyBrZXkucmVwbGFjZSgvXFwuL2csICdfJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcm1JbnB1dEFkZEVycm9yKGZvcm1pbnB1dCwga2V5LCBtZXNzYWdlKTtcclxuICAgIH1cclxuICAgIHJlbW92ZUVycm9yKGtleSkge1xyXG4gICAgICAgIHZhciBmb3JtaW5wdXQgPSBudWxsO1xyXG4gICAgICAgIGlmIChrZXkuaW5kZXhPZih0aGlzLnZlcnNpb25FcnJvcktleSkgPiAtMSkge1xyXG4gICAgICAgICAgICBmb3JtaW5wdXQgPSB0aGlzLmdldFZlcnNpb25Gb3JtSW5wdXQoa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvcm1pbnB1dCA9ICQoJyMnICsga2V5LnJlcGxhY2UoL1xcLi9nLCAnXycpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JtSW5wdXRSZW1vdmVFcnJvcihmb3JtaW5wdXQsIGtleSk7XHJcbiAgICB9XHJcbiAgICBmb3JtSW5wdXRSZW1vdmVFcnJvcihmb3JtaW5wdXQsIGtleSkge1xyXG4gICAgICAgIHN1cGVyLmZvcm1JbnB1dFJlbW92ZUVycm9yKGZvcm1pbnB1dCwga2V5KTtcclxuICAgIH1cclxuICAgIGdldFZlcnNpb25Gb3JtSW5wdXQoa2V5KSB7XHJcbiAgICAgICAgdmFyIHNwbGl0VmFsID0ga2V5LnNwbGl0KCd8Jyk7XHJcbiAgICAgICAgdmFyIGxhbmcgPSBzcGxpdFZhbFsxXTtcclxuICAgICAgICB2YXIgdmVyc2lvbiA9IHNwbGl0VmFsWzJdO1xyXG4gICAgICAgIHZhciBwcm9wZXJ0eSA9IHNwbGl0VmFsWzNdO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXMudm07XHJcbiAgICAgICAgLy9maW5kIHRoZSB0YWIgZm9yIHRoZSBsYW5nIGFuZCBcclxuICAgICAgICAvL3ZhciB0YWIgPSBfLmZpbmQodGhpcy52bS5Gb3JtVGFicygpLCB7IElkOiBsYW5nIH0pO1xyXG4gICAgICAgIHJldHVybiAkKCcjJyArIHByb3BlcnR5LCAnLicgKyBsYW5nICsgJy10YWInKTtcclxuICAgIH1cclxuICAgIC8vcHJvdGVjdGVkIHNldHVwQ2xlYXJWYWxpZGF0aW9uKHByb3BlcnR5KSB7XHJcbiAgICAvLyAgICB2YXIgdm1Qcm9wZXJ0eTtcclxuICAgIC8vICAgIC8vZ2V0IHByb3BlcnR5IG9mZiBvZiB2bSB1c2luZyBzdHJpbmcgbmFtZSBjb21pbmcgZnJvbSBzZXJ2ZXJcclxuICAgIC8vICAgIHZhciBwcm9wZXJ0eVBhcnRzID0gcHJvcGVydHkuc3BsaXQoJy4nKTtcclxuICAgIC8vICAgIHZhciBjb3VudE9mUGFydHMgPSBwcm9wZXJ0eVBhcnRzLmxlbmd0aDtcclxuICAgIC8vICAgIGlmIChjb3VudE9mUGFydHMgPT09IDIpXHJcbiAgICAvLyAgICAgICAgdm1Qcm9wZXJ0eSA9IHRoaXMudm1bcHJvcGVydHlQYXJ0c1swXV1bcHJvcGVydHlQYXJ0c1sxXV07XHJcbiAgICAvLyAgICBpZiAoY291bnRPZlBhcnRzID09PSAzKVxyXG4gICAgLy8gICAgICAgIHZhciBhY3RpdmVWZXJzaW9uID0gdGhpcy52bVtwcm9wZXJ0eVBhcnRzWzBdXVtwcm9wZXJ0eVBhcnRzWzFdXTtcclxuICAgIC8vICAgIHZtUHJvcGVydHkgPSAkKCdpbnB1dCNUaXRsZS5mb3JtLWNvbnRyb2wnKTtcclxuICAgIC8vICAgIGlmIChrby5pc09ic2VydmFibGUodm1Qcm9wZXJ0eSkpIHtcclxuICAgIC8vICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gdm1Qcm9wZXJ0eS5zdWJzY3JpYmUoKG5ld1ZhbHVlKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgIHZhciBmb3JtaW5wdXQ7XHJcbiAgICAvLyAgICAgICAgICAgIC8vcHJvcGVydHkgaWQgaGFzIF8gaW5zdGVhZCBvZiAuXHJcbiAgICAvLyAgICAgICAgICAgIGlmIChjb3VudE9mUGFydHMgPT09IDIpXHJcbiAgICAvLyAgICAgICAgICAgICAgICBmb3JtaW5wdXQgPSAkKCcjJyArIHByb3BlcnR5LnJlcGxhY2UoL1xcLi9nLCAnXycpKTtcclxuICAgIC8vICAgICAgICAgICAgLy9zZWxlY3QyIHVzZXMgcGFyZW50XHJcbiAgICAvLyAgICAgICAgICAgIGlmIChmb3JtaW5wdXQuaGFzQ2xhc3MoJ3NlbGVjdDItb2Zmc2NyZWVuJykpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgIGZvcm1pbnB1dCA9ICQoJy5zZWxlY3QyLWNvbnRhaW5lcicsIGZvcm1pbnB1dC5wYXJlbnQoKSk7XHJcbiAgICAvLyAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgLy9yZW1vdmUgZXJyb3IgY2xhc3MgdG8gcGFyZW50IGVsZW1lbnRcclxuICAgIC8vICAgICAgICAgICAgdmFyIGZvcm1Hcm91cCA9IGZvcm1pbnB1dC5wYXJlbnQoKTtcclxuICAgIC8vICAgICAgICAgICAgZm9ybUdyb3VwLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3IgaGFzLWZlZWRiYWNrJyk7XHJcbiAgICAvLyAgICAgICAgICAgIC8vcmVtb3ZlIGJvb3RzcmFwIHBvcG92ZXJcclxuICAgIC8vICAgICAgICAgICAgaWYgKChmb3JtaW5wdXQpLmF0dHIoJ2RhdGEtdHJpZ2dlcicpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICBmb3JtaW5wdXRcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQXR0cignZGF0YS10cmlnZ2VyJylcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQXR0cignZGF0YS1wbGFjZW1lbnQnKVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLWNvbnRlbnQnKVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgIC5wb3BvdmVyKCdkZXN0cm95JykgLy90b2RvIGJvb3RzdHJhcCBwb3BvdmVyXHJcbiAgICAvLyAgICAgICAgICAgICAgICA7XHJcbiAgICAvLyAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgLy9yZW1vdmUgcG9wb3ZlciBlbGVtZW50XHJcbiAgICAvLyAgICAgICAgICAgICQoJy5mb3JtLWNvbnRyb2wtZmVlZGJhY2snLCBmb3JtR3JvdXApLnJlbW92ZSgpO1xyXG4gICAgLy8gICAgICAgICAgICAvL2dldCByaWQgb2Ygc3Vic2NyaXB0aW9uXHJcbiAgICAvLyAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XHJcbiAgICAvLyAgICAgICAgICAgIC8vcmVmcmVzaCB0YWJzXHJcbiAgICAvLyAgICAgICAgICAgIHRoaXMucmVmcmVzaFRhYlZhbGlkYXRpb25CYWRnZXMoKTtcclxuICAgIC8vICAgICAgICAgICAgLy9oYW5kbGUgc3BhbiBkaWZmZXJlbnRseVxyXG4gICAgLy8gICAgICAgICAgICB2YXIgaXNTcGFuID0gZm9ybWlucHV0LmlzKCdzcGFuJyk7XHJcbiAgICAvLyAgICAgICAgICAgIGlmIChpc1NwYW4pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgIGZvcm1pbnB1dC50ZXh0KCcnKTtcclxuICAgIC8vICAgICAgICAgICAgICAgIGZvcm1pbnB1dC5yZW1vdmVDbGFzcygnbGFiZWwgbGFiZWwtZGFuZ2VyJyk7XHJcbiAgICAvLyAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgIH1cclxuICAgIC8vfVxyXG4gICAgc2V0dXBCaW5kaWdzKCkge1xyXG4gICAgICAgIHN1cGVyLnNldHVwQmluZGlncygpO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAkKCcudmVyc2lvbi10YWInKS5vbignY2xpY2snLCAnLmFjdGl2YXRlLXZlcnNpb24nLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTtcclxuICAgICAgICAgICAgLy9maWd1cmUgb3V0IHZlcnNpb25cclxuICAgICAgICAgICAgLy9tYWtlIHN1cmUgY3VycmVudCBBY3RpdmVfIHZlcnNpb24gaXMgdmFsaWQgKGlmIGl0cyBub3QgdmFsaWQgd2UgY2FudCBuYXZpZ2F0ZSBhd2F5KVxyXG4gICAgICAgICAgICBzZWxmLnZtLkl0ZW1EZXRhaWxbJ0FjdGl2ZV8nICsgZGF0YS5MYW5ndWFnZSgpXShkYXRhKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoYC4ke3RoaXMuZGF0YS5UaXRsZX0tZm9ybS1ib2R5YCkub24oJ2NsaWNrJywgJyNjb25maXJtLWRlbGV0ZScsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb25maXJtRGVsZXRlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmFkZEFjdGl2ZVRhYkxhbmd1YWdlSWQoKTtcclxuICAgIH1cclxuICAgIHJlc2V0RGV0YWlsKCkge1xyXG4gICAgICAgIHN1cGVyLnJlc2V0RGV0YWlsKCk7XHJcbiAgICAgICAgdGhpcy5jbGVhckFsbFZlcnNpb25zKCk7XHJcbiAgICB9XHJcbiAgICBzb3J0QWxsVmVyc2lvbnMoKSB7XHJcbiAgICAgICAgLy90b2RvIHdoeSBkb2VzIHRoaXMgbWFrZSBvYmplY3RzIGJlaW5nIHNvcnRlZCBvYnNlcnZhYmxlP1xyXG4gICAgICAgIC8vdGhpcy52bS5JdGVtRGV0YWlsLkFsbFZlcnNpb25zLnNvcnQoKHZlcnNpb24xLCB2ZXJzaW9uMikgPT4ge1xyXG4gICAgICAgIC8vICAgIGlmICh2ZXJzaW9uMS5EYXRlKCkgPT09IHZlcnNpb24yLkRhdGUoKSkge1xyXG4gICAgICAgIC8vICAgICAgICByZXR1cm4gdmVyc2lvbjEuVmVyc2lvbigpIDwgdmVyc2lvbjIuVmVyc2lvbigpO1xyXG4gICAgICAgIC8vICAgIH1cclxuICAgICAgICAvLyAgICByZXR1cm4gdmVyc2lvbjEuRGF0ZSgpIDwgdmVyc2lvbjIuRGF0ZSgpO1xyXG4gICAgICAgIC8vfSk7XHJcbiAgICB9XHJcbiAgICBzZXR1cExhbmd1YWdlVmVyc2lvbnMoKSB7XHJcbiAgICAgICAgdmFyIG1heExhbmd1YWdlVmVyc2lvbiA9IHt9O1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB0aGlzLmNsZWFyQWxsTGFuZ3VhZ2VWZXJzaW9ucygpO1xyXG4gICAgICAgIF8uZWFjaCh0aGlzLnZtLkl0ZW1EZXRhaWwuQWxsVmVyc2lvbnMoKSwgKHYpID0+IHtcclxuICAgICAgICAgICAgLy90aGlzIG5lZWRzIHRvIHB1bGwgdGhlIHBhcmVudCB1cmwgdG8gYXBwZW5kIHRvIHRoZSBiZWdpbmluZyBpZiBpdCBoYXMgYSBwYXJlbnRcclxuICAgICAgICAgICAgc2VsZi5hZGROZXdQZXJtYWxpbmsodik7XHJcbiAgICAgICAgICAgIC8vYWRkIHRvIGxhbmd1YWdlIHZlcnNpb24gYXJyYXlcclxuICAgICAgICAgICAgdmFyIGxhbmd1YWdlID0gdi5MYW5ndWFnZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFZlcnNpb25Db21wdXRlZCh2KTtcclxuICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IGBBbGxfJHt2Lkxhbmd1YWdlKCl9YDtcclxuICAgICAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0ucHVzaCh2KTtcclxuICAgICAgICAgICAgLy9zZXQgbWF4IHZlcnNpb24gaW4gdGVtcCBvYmplY3RcclxuICAgICAgICAgICAgLy9pZiB0aGVyZSBpcyBubyBtYXggdmVyc2lvbiBmb3IgbGFuZ3VhZ2UgbWFrZSBpdCB0aGlzIG9uZVxyXG4gICAgICAgICAgICBpZiAobWF4TGFuZ3VhZ2VWZXJzaW9uW2xhbmd1YWdlXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG1heExhbmd1YWdlVmVyc2lvbltsYW5ndWFnZV0gPSB2O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9pZiB0aGlzIG9uZSBpcyBiaWdnZXIgdGhhbiB0aGUgY3VycmVudCBtYXggbWFrZSB0aGlzIG9uZSB0aGUgbWF4XHJcbiAgICAgICAgICAgICAgICBpZiAodi5WZXJzaW9uKCkgPiBtYXhMYW5ndWFnZVZlcnNpb25bbGFuZ3VhZ2VdLlZlcnNpb24oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1heExhbmd1YWdlVmVyc2lvbltsYW5ndWFnZV0gPSB2O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy9zZXQgbWF4IHZlcnNpb24gdG8gb2JzZXJ2YWJsZVxyXG4gICAgICAgIF8uZWFjaCh0aGlzLnZtLk1ldGEuQWxsTGFuZ3VhZ2VzLCAodikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gYEFjdGl2ZV8ke3YuSWR9YDtcclxuICAgICAgICAgICAgaWYgKG1heExhbmd1YWdlVmVyc2lvblt2LklkXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYWN0aXZlVmVyc2lvbiA9IHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVmVyc2lvbiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKG1heExhbmd1YWdlVmVyc2lvblt2LklkXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZyA9IHYuSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBhY3RpdmVWZXJzaW9uLlZlcnNpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aXZlVmVyc2lvbiA9IF8uZmluZCh0aGlzLnZtLkl0ZW1EZXRhaWxbYEFsbF8ke3YuSWR9YF0oKSwgKHZlcikgPT4gKHZlci5WZXJzaW9uKCkgPT09IHZlcnNpb24gJiYgdmVyLkxhbmd1YWdlKCkgPT09IGxhbmcpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXShhY3RpdmVWZXJzaW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBgTWF4VmVyc2lvbl8ke3YuSWR9YDtcclxuICAgICAgICAgICAgdmFyIHggPSBtYXhMYW5ndWFnZVZlcnNpb25bdi5JZF0gP1xyXG4gICAgICAgICAgICAgICAgbWF4TGFuZ3VhZ2VWZXJzaW9uW3YuSWRdIDpcclxuICAgICAgICAgICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKGtvLnRvSlModGhpcy52bS5OZXdWZXJzaW9uKSk7XHJcbiAgICAgICAgICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKHgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuYWRkQWN0aXZlVGFiTGFuZ3VhZ2VJZCgpO1xyXG4gICAgfVxyXG4gICAgY2xlYXJBbGxMYW5ndWFnZVZlcnNpb25zKCkge1xyXG4gICAgICAgIF8uZWFjaCh0aGlzLnZtLk1ldGEuQWxsTGFuZ3VhZ2VzLCAodikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gYEFsbF8ke3YuSWR9YDtcclxuICAgICAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0ucmVtb3ZlQWxsKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBhZGRWZXJzaW9uQ29tcHV0ZWQodmVyc2lvbikge1xyXG4gICAgfVxyXG4gICAgYWRkQWN0aXZlVGFiTGFuZ3VhZ2VJZCgpIHtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbJ0FjdGl2ZVRhYkxhbmd1YWdlSWQnXSA9IGtvLmNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5NZXRhLkFsbExhbmd1YWdlc1t0aGlzLnZtLkFjdGl2ZVRhYkluZGV4KCldKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5NZXRhLkFsbExhbmd1YWdlc1t0aGlzLnZtLkFjdGl2ZVRhYkluZGV4KCldLklkO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGdldE5ld1ZlcnNpb24obGFuZ3VhZ2UpIHtcclxuICAgICAgICB2YXIgbWF4VmVyc2lvbiA9IHRoaXMudm0uSXRlbURldGFpbFsnTWF4VmVyc2lvbl8nICsgbGFuZ3VhZ2VdKCkuVmVyc2lvbigpO1xyXG4gICAgICAgIHZhciBuZXdWZXJzaW9uID0gbWF4VmVyc2lvbiArIDE7XHJcbiAgICAgICAgdmFyIHZlcnNpb25Ub0NyZWF0ZUZyb20gPSB0aGlzLmdldFZlcnNpb25Ub0NyZWF0ZUZyb20obGFuZ3VhZ2UpO1xyXG4gICAgICAgIHZhciBuZXdPYnNlcnZhYmxlID0ga28ubWFwcGluZy5mcm9tSlMoa28udG9KUyh2ZXJzaW9uVG9DcmVhdGVGcm9tKSk7XHJcbiAgICAgICAgdGhpcy5hZGRWZXJzaW9uQ29tcHV0ZWQobmV3T2JzZXJ2YWJsZSk7XHJcbiAgICAgICAgbmV3T2JzZXJ2YWJsZS5JZCh0aGlzLnZtLk5ld1ZlcnNpb24uSWQoKSk7XHJcbiAgICAgICAgdmFyIHRvZGF5ID0gbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREW1RdJykgKyAnMDA6MDA6MDAnO1xyXG4gICAgICAgIG5ld09ic2VydmFibGUuVmVyc2lvbihuZXdWZXJzaW9uKTtcclxuICAgICAgICBuZXdPYnNlcnZhYmxlLlZlcnNpb25EaXNwbGF5KGxhbmd1YWdlICsgJy0nICsgbmV3T2JzZXJ2YWJsZS5WZXJzaW9uKCkpO1xyXG4gICAgICAgIG5ld09ic2VydmFibGUuTGFuZ3VhZ2UobGFuZ3VhZ2UpO1xyXG4gICAgICAgIG5ld09ic2VydmFibGUuRGF0ZSh0b2RheSk7XHJcbiAgICAgICAgbmV3T2JzZXJ2YWJsZS5TdGFydERhdGVUaW1lID0ga28ub2JzZXJ2YWJsZShuZXcgRGF0ZSgpKTtcclxuICAgICAgICBuZXdPYnNlcnZhYmxlLkRhdGUodG9kYXkpO1xyXG4gICAgICAgIG5ld09ic2VydmFibGUuUGFyZW50Q29udGVudFBhZ2UgPSBrby5vYnNlcnZhYmxlKHZlcnNpb25Ub0NyZWF0ZUZyb20uUGFyZW50Q29udGVudFBhZ2UoKSk7XHJcbiAgICAgICAgbmV3T2JzZXJ2YWJsZS5Jc1JlYWRPbmx5KGZhbHNlKTtcclxuICAgICAgICBuZXdPYnNlcnZhYmxlLkNyZWF0ZWRCeSh0aGlzLnZtLlVzZXIuVXNlck5hbWUoKSk7XHJcbiAgICAgICAgbmV3T2JzZXJ2YWJsZS5DcmVhdGVkRGF0ZSh0b2RheSk7XHJcbiAgICAgICAgbmV3T2JzZXJ2YWJsZS5TdGF0dXModGhpcy52bS5OZXdWZXJzaW9uLlN0YXR1cygpKTtcclxuICAgICAgICAvL25ld09ic2VydmFibGUuU3RhdHVzKCdEcmFmdCcpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbC5BbGxWZXJzaW9ucy5wdXNoKG5ld09ic2VydmFibGUpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbFsnQWxsXycgKyBsYW5ndWFnZV0ucHVzaChuZXdPYnNlcnZhYmxlKTtcclxuICAgICAgICB0aGlzLnNvcnRBbGxWZXJzaW9ucygpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbFsnTWF4VmVyc2lvbl8nICsgbGFuZ3VhZ2VdKG5ld09ic2VydmFibGUpO1xyXG4gICAgICAgIHRoaXMuYWRkTmV3UGVybWFsaW5rKG5ld09ic2VydmFibGUpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbFsnQWN0aXZlXycgKyBsYW5ndWFnZV0obmV3T2JzZXJ2YWJsZSk7XHJcbiAgICAgICAgcmV0dXJuIG5ld09ic2VydmFibGU7XHJcbiAgICB9XHJcbiAgICBnZXRWZXJzaW9uVG9DcmVhdGVGcm9tKGxhbmd1YWdlKSB7XHJcbiAgICAgICAgLy9maXJzdCBzZWUgaWYgdGhlcmUgaXMgYSBhY3RpdmUgdmVyc2lvbiBmb3IgbGFuZ3VhZ2VcclxuICAgICAgICB2YXIgdmVyc2lvblRvQ3JlYXRlRnJvbSA9IHRoaXMudm0uSXRlbURldGFpbFsnQWN0aXZlXycgKyBsYW5ndWFnZV0oKTtcclxuICAgICAgICAvL2NoZWNrIGFsbCB2ZXJzaW9ucyBcclxuICAgICAgICBpZiAodmVyc2lvblRvQ3JlYXRlRnJvbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2ZXJzaW9uVG9DcmVhdGVGcm9tID0gXy5tYXgodGhpcy52bS5JdGVtRGV0YWlsLkFsbFZlcnNpb25zKCksIGZ1bmN0aW9uICh2ZXJzaW9uKSB7IHJldHVybiB2ZXJzaW9uLlZlcnNpb24oKTsgfSk7XHJcbiAgICAgICAgICAgIGlmICh2ZXJzaW9uVG9DcmVhdGVGcm9tID09PSAtSW5maW5pdHkpXHJcbiAgICAgICAgICAgICAgICB2ZXJzaW9uVG9DcmVhdGVGcm9tID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9maW5hbGx5IHVzZWQgZGVmYXVsdCBuZXcgdmVyc2lvblxyXG4gICAgICAgIGlmICh2ZXJzaW9uVG9DcmVhdGVGcm9tID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZlcnNpb25Ub0NyZWF0ZUZyb20gPSB0aGlzLnZtLk5ld1ZlcnNpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2ZXJzaW9uVG9DcmVhdGVGcm9tO1xyXG4gICAgfVxyXG4gICAgLy9jaGFuZ2VTdGF0dXMoaWQsIHN0YXR1cykge1xyXG4gICAgLy8gICAgdmFyIHByb3BlcnR5TmFtZSA9IGBBY3RpdmVfJHtpZH1gO1xyXG4gICAgLy8gICAgLy9rZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBzdGF0dXMgaW5jYXNlIHRoZSBzZXJ2ZXIgdmFsaWRhdGlvbiBmYWlsc1xyXG4gICAgLy8gICAgdGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0oKS5PcmlnaW5hbFN0YXR1cyh0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSgpLlN0YXR1cygpKTtcclxuICAgIC8vICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKCkuU3RhdHVzKHN0YXR1cyk7XHJcbiAgICAvLyAgICBzdXBlci5wb3N0KCk7XHJcbiAgICAvL31cclxuICAgIGNoYW5nZVN0YXR1cyhpZCwgc3RhdHVzKSB7XHJcbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IGBBY3RpdmVfJHtpZH1gO1xyXG4gICAgICAgIHZhciBvbGRTdGF0dXMgPSB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSgpLlN0YXR1cygpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKCkuT3JpZ2luYWxTdGF0dXMob2xkU3RhdHVzKTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSgpLlN0YXR1cyhzdGF0dXMpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbC5BY3RpdmVWZXJzaW9uRGlzcGxheSh0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSgpLlZlcnNpb25EaXNwbGF5KCkpO1xyXG4gICAgICAgIHRoaXMucG9zdCgpO1xyXG4gICAgICAgIC8vdmFyIHByb21pc2UgPSBzdXBlci5wb3N0KCk7XHJcbiAgICAgICAgLy9wcm9taXNlLmZhaWwoKGRhdGEpID0+IHRoaXMuZ2V0UHJvbWlzZUZhaWwoZGF0YSwgaWQpKTtcclxuICAgICAgICAvL3JldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG4gICAgdW5QdWJsaXNoKGlkKSB7XHJcbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IGBBY3RpdmVfJHtpZH1gO1xyXG4gICAgICAgIHZhciBlbmRUaW1lID0gbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREW1RdJykgKyAnMDA6MDA6MDAnO1xyXG4gICAgICAgIHZhciBzdGFydFRpbWUgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnZGF5cycpLmZvcm1hdCgnWVlZWS1NTS1ERFtUXScpICsgJzAwOjAwOjAwJztcclxuICAgICAgICBpZiAodGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0oKS5TdGFydERhdGVUaW1lKCkgPT09IGVuZFRpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0oKS5TdGFydERhdGVUaW1lKHN0YXJ0VGltZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKCkuRW5kRGF0ZVRpbWUoZW5kVGltZSk7XHJcbiAgICAgICAgdGhpcy5wb3N0KCk7XHJcbiAgICB9XHJcbiAgICBwcmV2aWV3KGlkKSB7XHJcbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IGBBY3RpdmVfJHtpZH1gO1xyXG4gICAgICAgIHRoaXMudm0uTGVhdmVPcGVuT25BamF4U3VjY2Vzcyh0cnVlKTtcclxuICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMucG9zdCgpO1xyXG4gICAgICAgIHByb21pc2UuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgdmVyc2lvbiA9IHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKCk7XHJcbiAgICAgICAgICAgIHRoaXMudm0uTGVhdmVPcGVuT25BamF4U3VjY2VzcyhmYWxzZSk7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSB2ZXJzaW9uLlBlcm1hbGlua0Rpc3BsYXkoKSArICc/cHJldmlld0lkPScgKyB2ZXJzaW9uLklkKCkgKyAnJnRpY2s9JyArIERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY2xlYXJBbGxWZXJzaW9ucygpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy9jcmVhdGUgYSBkeW5hbWljIGFjdGl2ZSBvYnNlcnZhYmxlIGZvciBlYWNoIGxhbmcgdHlwZVxyXG4gICAgICAgIF8uZWFjaChzZWxmLnZtLk1ldGEuQWxsTGFuZ3VhZ2VzLCAodiwgaSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gJ0FjdGl2ZV8nICsgdi5JZDtcclxuICAgICAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0obnVsbCk7XHJcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSAnTWF4VmVyc2lvbl8nICsgdi5JZDtcclxuICAgICAgICAgICAgdmFyIG1heFZlcnNpb24gPSBrby5tYXBwaW5nLmZyb21KUyhrby50b0pTKHRoaXMudm0uTmV3VmVyc2lvbikpO1xyXG4gICAgICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXShtYXhWZXJzaW9uKTtcclxuICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICdBbGxfJyArIHYuSWQ7XHJcbiAgICAgICAgICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdLnJlbW92ZUFsbCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYWRkSXRlbURldGFpbENsaWVudE9ubHlQcm9wZXJ0aWVzKCkge1xyXG4gICAgICAgIC8vY3JlYXRlIGEgZHluYW1pYyBhY3RpdmUgb2JzZXJ2YWJsZSBmb3IgZWFjaCBsYW5nIHR5cGVcclxuICAgICAgICBfLmVhY2godGhpcy52bS5NZXRhLkFsbExhbmd1YWdlcywgKHYsIGkpID0+IHtcclxuICAgICAgICAgICAgLy9BY3RpdmVcclxuICAgICAgICAgICAgdmFyIGFjdGl2ZVByb3BlcnR5TmFtZSA9IGBBY3RpdmVfJHt2LklkfWA7XHJcbiAgICAgICAgICAgIHRoaXMudm0uSXRlbURldGFpbFthY3RpdmVQcm9wZXJ0eU5hbWVdID0ga28ub2JzZXJ2YWJsZShudWxsKTtcclxuICAgICAgICAgICAgLy9NYXhcclxuICAgICAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsW2BNYXhWZXJzaW9uXyR7di5JZH1gXSA9IGtvLm9ic2VydmFibGUobnVsbCk7XHJcbiAgICAgICAgICAgIC8vQWxsXHJcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBgQWxsXyR7di5JZH1gO1xyXG4gICAgICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSA9IGtvLm9ic2VydmFibGVBcnJheShbXSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBrb21hcHBpbmdmcm9tZGF0YShkYXRhLCBpZCkge1xyXG4gICAgICAgIHZhciBjb3B5TWFwcGluZyA9IHtcclxuICAgICAgICAgICAgJ2NvcHknOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvL2RvIG5vdCBtYWtlIFBhcmVudENvbnRlbnRQYWdlIGNoaWxkIHByb3BlcnRpZXMgb2JzZXJ2YWJsZVxyXG4gICAgICAgIC8vbWFrZSB0aGUgd2hvbGUgUGFyZW50Q29udGVudFBhZ2Ugb2JqZWN0IGl0c2VsZiBvYnNlcnZhYmxlXHJcbiAgICAgICAgY29weU1hcHBpbmdbJ1BhcmVudENvbnRlbnRQYWdlJ10gPSB7ICdjcmVhdGUnOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtvLm9ic2VydmFibGUob3B0aW9ucy5kYXRhKTtcclxuICAgICAgICAgICAgfSB9O1xyXG4gICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKGRhdGEuSXRlbURldGFpbCwgY29weU1hcHBpbmcsIHRoaXMudm0uSXRlbURldGFpbCk7XHJcbiAgICB9XHJcbiAgICBhZGROZXdQZXJtYWxpbmsodikge1xyXG4gICAgICAgIHYuUGVybWFsaW5rRGlzcGxheSA9IGtvLmNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgICAgICAgdmFyIHBlcm1hbGlua0Rpc3BsYXk7XHJcbiAgICAgICAgICAgIHZhciBsYW5ndWFnZSA9IHYuTGFuZ3VhZ2UoKSArICcvJztcclxuICAgICAgICAgICAgaWYgKHYuTGFuZ3VhZ2UoKSA9PT0gJ2VuJylcclxuICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJyc7XHJcbiAgICAgICAgICAgIC8vaWYgd2UgaGF2ZSBhIHBhcmVudCBnZXQgaXRzIGFjdGl2ZSBub2RlIGxhbmd1YWdlIG1hdGNoIGFuZCBwcmVwZW5kIGl0cyB1cmwgXHJcbiAgICAgICAgICAgIGlmICh2LlBhcmVudENvbnRlbnRQYWdlKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gXy5maW5kKHYuUGFyZW50Q29udGVudFBhZ2UoKS5BY3RpdmVUcmVlTm9kZXMsIChub2RlKSA9PiAobm9kZS5MYW5ndWFnZSA9PT0gdi5MYW5ndWFnZSgpKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHZlcnNpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gdi5VcmwoKSA9PT0gbnVsbCA/ICcnIDogdi5VcmwoKTtcclxuICAgICAgICAgICAgICAgICAgICBwZXJtYWxpbmtEaXNwbGF5ID0gdGhpcy5kYXRhLlJvb3RVcmwgKyBsYW5ndWFnZSArIHZlcnNpb24uVXJsICsgJy8nICsgdXJsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IHYuVXJsKCkgPT09IG51bGwgPyAnJyA6IHYuVXJsKCk7XHJcbiAgICAgICAgICAgICAgICBwZXJtYWxpbmtEaXNwbGF5ID0gdGhpcy5kYXRhLlJvb3RVcmwgKyBsYW5ndWFnZSArIHVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcGVybWFsaW5rRGlzcGxheTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGdldFByb21pc2VGYWlsKGVycm9yLCBpZCkge1xyXG4gICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBgQWN0aXZlXyR7aWR9YDtcclxuICAgICAgICB2YXIgb2xkU3RhdHVzID0gdGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0oKS5PcmlnaW5hbFN0YXR1cygpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKCkuU3RhdHVzKG9sZFN0YXR1cyk7XHJcbiAgICB9XHJcbiAgICAvL2dldFByb21pc2VGYWlsKGVycm9yLCBpZCkge1xyXG4gICAgLy8gICAgc3VwZXIuZ2V0UHJvbWlzZUZhaWwoZXJyb3IsIGlkKTtcclxuICAgIC8vfVxyXG4gICAgZ2V0UHJvbWlzZURvbmUoZGF0YSwgaWQpIHtcclxuICAgICAgICBzdXBlci5nZXRQcm9taXNlRG9uZShkYXRhLCBpZCk7XHJcbiAgICAgICAgdGhpcy5zb3J0QWxsVmVyc2lvbnMoKTtcclxuICAgICAgICB0aGlzLnNldHVwTGFuZ3VhZ2VWZXJzaW9ucygpO1xyXG4gICAgfVxyXG4gICAgcG9zdFByb21pc2VEb25lKGRhdGEpIHtcclxuICAgICAgICBpZiAoIXRoaXMudm0uTGVhdmVPcGVuT25BamF4U3VjY2VzcygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudm0ucm91dGVzLmdvQmFjaygpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0RGV0YWlsKCk7XHJcbiAgICAgICAgICAgIHRoaXMudm0uQWRkQWxlcnQoZGF0YS5NZXNzYWdlLCAnc3VjY2VzcycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXBQb3N0RGF0YShkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgcG9zdFByb21pc2VGYWlsKGVycm9yKSB7XHJcbiAgICAgICAgc3VwZXIucG9zdFByb21pc2VGYWlsKGVycm9yKTtcclxuICAgICAgICBfLmVhY2godGhpcy52bS5JdGVtRGV0YWlsLkFsbFZlcnNpb25zKCksIGZ1bmN0aW9uICh2ZXJzaW9uKSB7XHJcbiAgICAgICAgICAgIGlmICh2ZXJzaW9uLk9yaWdpbmFsU3RhdHVzKCkpIHtcclxuICAgICAgICAgICAgICAgIHZlcnNpb24uU3RhdHVzKHZlcnNpb24uT3JpZ2luYWxTdGF0dXMoKSk7XHJcbiAgICAgICAgICAgICAgICB2ZXJzaW9uLk9yaWdpbmFsU3RhdHVzKG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBnZXRWbVByb3BlcnR5KHByb3BlcnR5KSB7XHJcbiAgICAgICAgaWYgKHByb3BlcnR5LmluZGV4T2YodGhpcy52ZXJzaW9uRXJyb3JLZXkpID4gLTEpIHtcclxuICAgICAgICAgICAgdmFyIHNwbGl0VmFsID0gcHJvcGVydHkuc3BsaXQoJ3wnKTtcclxuICAgICAgICAgICAgdmFyIGxhbmcgPSBzcGxpdFZhbFsxXTtcclxuICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBzcGxpdFZhbFsyXTtcclxuICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gc3BsaXRWYWxbM107XHJcbiAgICAgICAgICAgIC8vdmFyIHZtID0gdGhpcy52bTtcclxuICAgICAgICAgICAgdmFyIGVycm9yVmVyc2lvbiA9IF8uZmluZCh0aGlzLnZtLkl0ZW1EZXRhaWwuQWxsVmVyc2lvbnMoKSwgZnVuY3Rpb24gKHYpIHsgcmV0dXJuICh2LlZlcnNpb24oKS50b1N0cmluZygpID09PSB2ZXJzaW9uICYmIHYuTGFuZ3VhZ2UoKSA9PT0gbGFuZyk7IH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZXJyb3JWZXJzaW9uW3Byb3BlcnR5XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRWbVByb3BlcnR5KHByb3BlcnR5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBtYXBQb3N0RGF0YShkYXRhKSB7XHJcbiAgICAgICAgc3VwZXIubWFwUG9zdERhdGEoZGF0YSk7XHJcbiAgICAgICAgdGhpcy5zZXR1cExhbmd1YWdlVmVyc2lvbnMoKTtcclxuICAgIH1cclxuICAgIHBvc3QoKSB7XHJcbiAgICAgICAgLy9wcmV2ZW50IGRvdWJsZSBwb3N0XHJcbiAgICAgICAgaWYgKHRoaXMudm0uSXNMb2FkaW5nKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL21ha2Ugb3ZlcmxheSBsb2FkaW5nIGRpdiBmdWxsIGhlaWdodFxyXG4gICAgICAgICQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgdmFyIGlnbm9yZU1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICdpZ25vcmUnOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgcG9zdERhdGEgPSBrby5tYXBwaW5nLnRvSlModGhpcy52bSwgaWdub3JlTWFwcGluZyk7XHJcbiAgICAgICAgJC5lYWNoKHBvc3REYXRhLkl0ZW1EZXRhaWwuQWxsVmVyc2lvbnMsIGZ1bmN0aW9uIChpLCB2KSB7XHJcbiAgICAgICAgICAgIGlmIChtb21lbnQuaXNNb21lbnQodi5TdGFydERhdGVUaW1lKSlcclxuICAgICAgICAgICAgICAgIHYuU3RhcnREYXRlVGltZSA9IHYuU3RhcnREYXRlVGltZS5mb3JtYXQoXCJZWVlZLU1NLURUSEg6bW06c3MubW1tXCIpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKHYuRW5kRGF0ZVRpbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobW9tZW50LmlzTW9tZW50KHYuRW5kRGF0ZVRpbWUpKVxyXG4gICAgICAgICAgICAgICAgICAgIHYuRW5kRGF0ZVRpbWUgPSB2LkVuZERhdGVUaW1lLmZvcm1hdChcIllZWVktTU0tRFRISDptbTpzcy5tbW1cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBwb3N0RGF0YSA9IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhKTtcclxuICAgICAgICBwb3N0RGF0YSA9IHBvc3REYXRhLnJlcGxhY2UoJzwhLS08c2NyaXB0JywgJzxzY3JpcHQnKTtcclxuICAgICAgICBwb3N0RGF0YSA9IHBvc3REYXRhLnJlcGxhY2UoJzwvc2NyaXB0Pi0tPicsICc8L3NjcmlwdD4nKTtcclxuICAgICAgICBkZWxldGUgcG9zdERhdGEuQWxlcnRzO1xyXG4gICAgICAgIGRlbGV0ZSBwb3N0RGF0YS5OZXdWZXJzaW9uO1xyXG4gICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgdXJsOiB0aGlzLnBvc3RVcmwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgICBkYXRhOiBwb3N0RGF0YSxcclxuICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04JyxcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcm9taXNlLmZhaWwoKGVycm9yKSA9PiB0aGlzLnBvc3RQcm9taXNlRmFpbChlcnJvcikpO1xyXG4gICAgICAgIHByb21pc2UuZG9uZShkYXRhID0+IHRoaXMucG9zdFByb21pc2VEb25lKGRhdGEpKTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRlbnRQYWdlRm9ybTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgQ29udGVudFBhZ2VSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGVudFBhZ2VSb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIENvdXBvblJlZGVtcHRpb24gZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBDb3Vwb25SZWRlbXB0aW9uO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBDb3Vwb24gZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJChcIi5oaWRlVW5ib3VuZFwiKS5yZW1vdmVDbGFzcyhcImhpZGVVbmJvdW5kXCIpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQ291cG9uO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBEYXNoYm9hcmRWZXJzaW9uUm91dGVyID0gcmVxdWlyZShcIi4vRGFzaGJvYXJkVmVyc2lvblJvdXRlclwiKTtcclxuY29uc3QgRGFzaGJvYXJkVmVyc2lvbkZvcm0gPSByZXF1aXJlKFwiLi9EYXNoYm9hcmRWZXJzaW9uRm9ybVwiKTtcclxuY2xhc3MgRGFzaGJvYXJkVmVyc2lvbiBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIERhc2hib2FyZFZlcnNpb25Gb3JtLCBUYWJsZSwgRGFzaGJvYXJkVmVyc2lvblJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRGFzaGJvYXJkVmVyc2lvbjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBEYXNoYm9hcmRWZXJzaW9uRm9ybSBleHRlbmRzIEZvcm0ge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGVkaXRBY3Rpb24gPSAnRWRpdCcpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgZWRpdEFjdGlvbik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICAgICAgdGhpcy5lZGl0QWN0aW9uID0gZWRpdEFjdGlvbjtcclxuICAgICAgICAkKCcjSXRlbURldGFpbF9VcGdyYWRlUmVxdWlyZWQnKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2bS5JdGVtRGV0YWlsLlVwZ3JhZGVSZXF1aXJlZCgpID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcjdXBncmFkZS1yZXF1aXJlZC1tb2RhbCcpLm1vZGFsKHtcclxuICAgICAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXHJcbiAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmQ6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZtLkl0ZW1EZXRhaWwuVXBncmFkZVJlcXVpcmVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHZtLkl0ZW1EZXRhaWwuQ3VycmVudFZlcnNpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcjcmVxdWlyZS11cGdyYWRlJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB2bS5JdGVtRGV0YWlsLlVwZ3JhZGVSZXF1aXJlZCh0cnVlKTtcclxuICAgICAgICAgICAgdm0uSXRlbURldGFpbC5DdXJyZW50VmVyc2lvbihmYWxzZSk7XHJcbiAgICAgICAgICAgICQoJyN1cGdyYWRlLXJlcXVpcmVkLW1vZGFsJykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcjcmVxdWlyZS11cGdyYWRlLWNhbmNlbCcpLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgdm0uSXRlbURldGFpbC5VcGdyYWRlUmVxdWlyZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICB2bS5JdGVtRGV0YWlsLkN1cnJlbnRWZXJzaW9uKHRydWUpO1xyXG4gICAgICAgICAgICAkKCcjdXBncmFkZS1yZXF1aXJlZC1tb2RhbCcpLm1vZGFsKCdoaWRlJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnI0l0ZW1EZXRhaWxfQ3VycmVudFZlcnNpb24nKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHZtLkl0ZW1EZXRhaWwuVXBncmFkZVJlcXVpcmVkKGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IERhc2hib2FyZFZlcnNpb25Gb3JtO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBEYXNoYm9hcmRWZXJzaW9uUm91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9saXN0YCxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvdmlldy86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvaW5kZXhgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9kZWxldGUvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmRlbGV0ZUl0ZW0oaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IERhc2hib2FyZFZlcnNpb25Sb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNsYXNzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIC8vIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEVycm9yO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuLy8vIFRoaXMgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IE9yYW5nZSBPbmlvbiBTY2FmZm9sZGVyLlxyXG4vLyB0ZW1wbGF0ZTogTVZDLkpTTW9kdWxlLmNzXHJcbi8vIGNsYXNzOiBGZWVkYmFja0tleXdvcmRMb2dcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jb25zdCBfID0gcmVxdWlyZShcInVuZGVyc2NvcmVcIik7XHJcbmNsYXNzIEZlZWRiYWNrS2V5d29yZExvZyBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxuICAgIGNsZWFyRmlsdGVycygpIHtcclxuICAgICAgICBfLmVhY2godGhpcy5GaWx0ZXJzLCAodikgPT4ge1xyXG4gICAgICAgICAgICB2KCcnKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEZlZWRiYWNrS2V5d29yZExvZztcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vLyBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBPcmFuZ2UgT25pb24gU2NhZmZvbGRlci5cclxuLy8gdGVtcGxhdGU6IE1WQy5KU01vZHVsZS5jc1xyXG4vLyBjbGFzczogRmVlZGJhY2tLZXl3b3JkXHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNvbnN0IEZlZWRiYWNrS2V5d29yZFJvdXRlciA9IHJlcXVpcmUoXCIuL0ZlZWRiYWNrS2V5d29yZFJvdXRlclwiKTtcclxuY2xhc3MgRmVlZGJhY2tLZXl3b3JkIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIEZlZWRiYWNrS2V5d29yZFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRmVlZGJhY2tLZXl3b3JkO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBGZWVkYmFja0tleXdvcmRSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRmVlZGJhY2tLZXl3b3JkUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBGdW5kcmFpc2VyQmxhY2tvdXREYXRlUm91dGVyID0gcmVxdWlyZShcIi4vRnVuZHJhaXNlckJsYWNrb3V0RGF0ZVJvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIEZ1bmRyYWlzZXJCbGFja291dERhdGUgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgRnVuZHJhaXNlckJsYWNrb3V0RGF0ZVJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoXCIuaGlkZVVuYm91bmRcIikucmVtb3ZlQ2xhc3MoXCJoaWRlVW5ib3VuZFwiKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmRyYWlzZXJCbGFja291dERhdGU7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIEZ1bmRyYWlzZXJCbGFja291dERhdGVSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRnVuZHJhaXNlckJsYWNrb3V0RGF0ZVJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vLyBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBPcmFuZ2UgT25pb24gU2NhZmZvbGRlci5cclxuLy8gdGVtcGxhdGU6IE1WQy5KU01vZHVsZS5jc1xyXG4vLyBjbGFzczogRnVuZHJhaXNlcklucXVpcnlcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY29uc3QgRnVuZHJhaXNlcklucXVpcnlSb3V0ZXIgPSByZXF1aXJlKFwiLi9GdW5kcmFpc2VySW5xdWlyeVJvdXRlclwiKTtcclxuY29uc3QgXyA9IHJlcXVpcmUoXCJ1bmRlcnNjb3JlXCIpO1xyXG5jbGFzcyBGdW5kcmFpc2VySW5xdWlyeSBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBGdW5kcmFpc2VySW5xdWlyeVJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLk51bURhdGVzID0gMTtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgJCgnLm1vZGFsZm9ybS1ob2xkZXInKS5vbignY2xpY2snLCAnI3NhdmUtZnVuZHJhaXNlci1pbnF1aXJ5JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuSW50ZXJlc3RlZERhdGVzKFtdKTtcclxuICAgICAgICAgICAgJCgnaW5wdXRbbmFtZV49XCJJdGVtRGV0YWlsLkludGVyZXN0ZWREYXRlc1wiXScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcykudmFsKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuSW50ZXJlc3RlZERhdGVzKCkucHVzaCgkKHRoaXMpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gdGhpcy5mb3JtLnBvc3QoKTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIvZnVuZHJhaXNlcmlucXVpcnkjL3RoYW5reW91XCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnLm1vZGFsZm9ybS1ob2xkZXInKS5vbignY2xpY2snLCAnI2FkZC1pbnRlcmVzdGVkLWRhdGUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICQoJyNpbnRlcmVzdGVkLWRhdGVzJykuYXBwZW5kKCc8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj48ZGl2IGNsYXNzPVwiZGF0ZS1pbnB1dFwiPjxpbnB1dCBuYW1lPVwiSXRlbURldGFpbC5JbnRlcmVzdGVkRGF0ZXNbJyArIHNlbGYuTnVtRGF0ZXMgKyAnXVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJJdGVtRGV0YWlsX0ludGVyZXN0ZWREYXRlc1snICsgdGhpcy5OdW1EYXRlcyArICddXCIgdHlwZT1cImRhdGVcIj48L2Rpdj48ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb24gYmFja2dyb3VuZC13aGl0ZVwiPjxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXJcIj48L2k+PC9kaXY+PC9kaXY+Jyk7XHJcbiAgICAgICAgICAgIHRoaXMuTnVtRGF0ZXMrKztcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbiAgICBjbGVhckZpbHRlcnMoKSB7XHJcbiAgICAgICAgXy5lYWNoKHRoaXMuRmlsdGVycywgKHYpID0+IHtcclxuICAgICAgICAgICAgdignJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGdW5kcmFpc2VySW5xdWlyeTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgRnVuZHJhaXNlcklucXVpcnlSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICcvRnVuZHJhaXNlcklucXVpcnkjL25ldycsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJy9GdW5kcmFpc2VySW5xdWlyeSMvdGhhbmt5b3UnLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9saXN0YCxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3ZpZXcvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2luZGV4YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvdGhhbmt5b3VgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvZGVsZXRlLzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5kZWxldGVJdGVtKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGdW5kcmFpc2VySW5xdWlyeVJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vLyBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBPcmFuZ2UgT25pb24gU2NhZmZvbGRlci5cclxuLy8gdGVtcGxhdGU6IE1WQy5KU01vZHVsZS5jc1xyXG4vLyBjbGFzczogRnVuZHJhaXNlckxvZ1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIEZ1bmRyYWlzZXJMb2cgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbiAgICBjb3B5RnVuZHJhaXNlcihpZCkge1xyXG4gICAgICAgIHZhciBpZ25vcmVNYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAnaWdub3JlJzogdGhpcy5kYXRhLktPTWFwcGluZy5hbGxOb25Qb3N0QmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc29sZS5sb2coaWQpO1xyXG4gICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgdXJsOiAnL0FkbWluL0Z1bmRyYWlzZXJMb2cvQ29weScsXHJcbiAgICAgICAgICAgIGRhdGE6ICdpZD0nICsgaWQsXHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5mYWlsKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5kb25lKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGdW5kcmFpc2VyTG9nO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IE1vZGFsID0gcmVxdWlyZShcIi4uL0NvbW1vbi9Nb2RhbFwiKTtcclxuY29uc3QgTG9naW5Gb3JtID0gcmVxdWlyZShcIi4vRnVuZHJhaXNlckxvZ2luRm9ybVwiKTtcclxuY2xhc3MgRnVuZHJhaXNlckxvZ2luIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgTG9naW5Gb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsKFwiZm9yZ290UGFzc3dvcmRcIik7XHJcbiAgICAgICAgdGhpcy5tb2RhbC5pbml0KCk7XHJcbiAgICAgICAgc2VsZi5JdGVtRGV0YWlsLlNob3dTdWNjZXNzKGZhbHNlKTtcclxuICAgICAgICAkKFwiZGl2LmxvZ2luLWJveFwiKS5vbihcImNsaWNrXCIsIFwiYS5mb3Jnb3QtcGFzc3dvcmRcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkKFwiI3Jlc2V0RW1haWxBZGRyZXNzXCIpLnZhbChudWxsKTtcclxuICAgICAgICAgICAgc2VsZi5JdGVtRGV0YWlsLlNob3dTdWNjZXNzKGZhbHNlKTtcclxuICAgICAgICAgICAgc2VsZi5JdGVtRGV0YWlsLkVtYWlsSXNWYWxpZCh0cnVlKTtcclxuICAgICAgICAgICAgc2VsZi5tb2RhbC5vcGVuKFwiZm9yZ290UGFzc3dvcmRcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnZGl2LnB4LW1vZGFsIGRpdi5idXR0b24tZ3JvdXAgYnV0dG9uLmJ1dHRvbi5zZWNvbmRhcnkucmVzZXQtcGFzc3dvcmQtZG9uZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi9mdW5kcmFpc2VybG9naW4jL2luZGV4XCI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnZGl2LnB4LW1vZGFsIGRpdi5idXR0b24tZ3JvdXAgYnV0dG9uLmJ1dHRvbi5zZWNvbmRhcnkucmVzZXQtcGFzc3dvcmQnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdmFyIGVtYWlsID0gJChcIiNyZXNldEVtYWlsQWRkcmVzc1wiKS52YWwoKTtcclxuICAgICAgICAgICAgdmFyIHVybCA9IFwiL3BhbmRhZnVuZHJhaXNlcm1lbWJlci9mb3Jnb3RwYXNzd29yZD9lbWFpbEFkZHJlc3M9XCIgKyBlbWFpbDtcclxuICAgICAgICAgICAgdmFyIG1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICAgICAnaWdub3JlJzogc2VsZi5kYXRhLktPTWFwcGluZy5hbGxOb25Qb3N0QmFja1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB2YXIgcG9zdERhdGEgPSBrby5tYXBwaW5nLnRvSlMoc2VsZiwgbWFwcGluZyk7XHJcbiAgICAgICAgICAgICQoXCIjbG9hZGluZ1wiKS5oZWlnaHQoJCh3aW5kb3cpLmhlaWdodCgpKTtcclxuICAgICAgICAgICAgc2VsZi5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdERhdGEpLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLThcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcHJvbWlzZS5mYWlsKGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgLy9zb21ldGhpbmcgd2VudCB3cm9uZyBkaXNwbGF5IGVycm9yXHJcbiAgICAgICAgICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuRW1haWxJc1ZhbGlkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZShmdW5jdGlvbiAodm0pIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuSXRlbURldGFpbC5FbWFpbElzVmFsaWQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuU2hvd1N1Y2Nlc3ModHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRnVuZHJhaXNlckxvZ2luO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIEZ1bmRyYWlzZXJMb2dpbkZvcm0gZXh0ZW5kcyBGb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBlZGl0QWN0aW9uID0gJ0xvZ2luJykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBlZGl0QWN0aW9uKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgICAgICB0aGlzLmVkaXRBY3Rpb24gPSBlZGl0QWN0aW9uO1xyXG4gICAgfVxyXG4gICAgcG9zdCgpIHtcclxuICAgICAgICB2YXIgcHJvbWlzZSA9IHN1cGVyLnBvc3QoKTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5SZXR1cm5Vcmw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5mYWlsKGVycm9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy52bS5NZXNzYWdlKGVycm9yLnJlc3BvbnNlSlNPTi5NZXNzYWdlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuICAgIHByb21pc2VEb25lKGRhdGEsIGlkKSB7XHJcbiAgICAgICAgc3VwZXIuZ2V0UHJvbWlzZURvbmUoZGF0YSwgaWQpO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5SZXR1cm5Vcmw7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGdW5kcmFpc2VyTG9naW5Gb3JtO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY29uc3QgRnVuZHJhaXNlck1lbWJlclJvdXRlciA9IHJlcXVpcmUoXCIuL0Z1bmRyYWlzZXJNZW1iZXJSb3V0ZXJcIik7XHJcbmNsYXNzIEZ1bmRyYWlzZXJNZW1iZXIgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgRnVuZHJhaXNlck1lbWJlclJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRnVuZHJhaXNlck1lbWJlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgRnVuZHJhaXNlck1lbWJlclJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3ZpZXcvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2luZGV4YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvZGVsZXRlLzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5kZWxldGVJdGVtKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGdW5kcmFpc2VyTWVtYmVyUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBGdW5kcmFpc2VyVW5pdEV4Y2VwdGlvblJvdXRlciA9IHJlcXVpcmUoXCIuL0Z1bmRyYWlzZXJVbml0RXhjZXB0aW9uUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgRnVuZHJhaXNlclVuaXRFeGNlcHRpb24gZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgRnVuZHJhaXNlclVuaXRFeGNlcHRpb25Sb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmRyYWlzZXJVbml0RXhjZXB0aW9uO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBGdW5kcmFpc2VyVW5pdEV4Y2VwdGlvblJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3ZpZXcvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2luZGV4YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvZGVsZXRlLzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5kZWxldGVJdGVtKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGdW5kcmFpc2VyVW5pdEV4Y2VwdGlvblJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgRnVuZHJhaXNlclJvdXRlciA9IHJlcXVpcmUoXCIuL0Z1bmRyYWlzZXJSb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jb25zdCBNb2RhbCA9IHJlcXVpcmUoXCIuLi9Db21tb24vTW9kYWxcIik7XHJcbmNvbnN0IF8gPSByZXF1aXJlKFwidW5kZXJzY29yZVwiKTtcclxuY2xhc3MgRnVuZHJhaXNlciBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBGdW5kcmFpc2VyUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMubW9kYWwgPSBuZXcgTW9kYWwoJ2Z1bmRyYWlzZXJTdGF0dXNXYXJuaW5nJyk7XHJcbiAgICAgICAgdGhpcy5tb2RhbC5pbml0KCk7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJChcIi5oaWRlVW5ib3VuZFwiKS5yZW1vdmVDbGFzcyhcImhpZGVVbmJvdW5kXCIpO1xyXG4gICAgICAgICQoJyNpdGVtLWRldGFpbC1mb3JtJykub24oXCJjaGFuZ2VcIiwgJyNJdGVtRGV0YWlsX1N0YXR1cycsICgpID0+IHtcclxuICAgICAgICAgICAgLy95b3VyIGNvZGUgZ29lcyBoZXJlLi4uXHJcbiAgICAgICAgICAgIGlmICgkKCcjSXRlbURldGFpbF9TdGF0dXMnKS52YWwoKSA9PSAnQ09NUExFVEVEJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RhbC5vcGVuKCdjbGlja2VkLXN0YXR1cycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcjc2F2ZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCQoJyNJdGVtRGV0YWlsX1N0YXR1cycpLnZhbCgpID09ICdDT01QTEVURUQnKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcjaXRlbS1kZXRhaWwtZm9ybSAjSXRlbURldGFpbF9TdGF0dXMnKS50cmlnZ2VyKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnI0xvZ28nKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlID0gdGhpcy5maWxlc1tpXTtcclxuICAgICAgICAgICAgICAgIHZhciBmZCA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgZmQuYXBwZW5kKFwiZmlsZVRvVXBsb2FkXCIsIGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6ICcvcGFuZGFmdW5kcmFpc2VyL3VwbG9hZGZpbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGZkLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuTG9nbyhkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJ2JvZHknKS5vbignY2xpY2snLCAnLnJlbW92ZS1sb2dvJywgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLkl0ZW1EZXRhaWwuTG9nbygnJyk7XHJcbiAgICAgICAgICAgICQoJyNMb2dvJykudmFsKCcnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLkl0ZW1EZXRhaWwuTnVtYmVyU3RvcmVzLnN1YnNjcmliZShmdW5jdGlvbiAobnVtYmVyU3RvcmVzKSB7XHJcbiAgICAgICAgICAgIGlmIChudW1iZXJTdG9yZXMgPT09ICdNdWx0aXBsZSBTdG9yZXMnKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuU2hvd011bHRpcGxlU3RvcmVzVXBsb2FkKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5JdGVtRGV0YWlsLlNob3dNdWx0aXBsZVN0b3Jlc1VwbG9hZChmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCdib2R5Jykub24oJ2NoYW5nZScsICcjU3RvcmVzJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlID0gdGhpcy5maWxlc1tpXTtcclxuICAgICAgICAgICAgICAgIHZhciBmZCA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgZmQuYXBwZW5kKFwiZmlsZVRvVXBsb2FkXCIsIGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6ICcvYWRtaW4vZnVuZHJhaXNlci9VcGxvYWRGdW5kcmFpc2VyU3RvcmVMaXN0JyxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBmZCxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHsgfSxcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnI1N0b3JlVXBsb2FkRXJyb3InKS5odG1sKCdUaGVyZSB3YXMgYW4gZXJyb3IgdXBsb2FkaW5nIGZpbGUnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY2xlYXJGaWx0ZXJzKCkge1xyXG4gICAgICAgIF8uZWFjaCh0aGlzLkZpbHRlcnMsICh2KSA9PiB7XHJcbiAgICAgICAgICAgIHYoJycpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZXhwb3J0RnVuZHJhaXNlcnMoKSB7XHJcbiAgICAgICAgdmFyIGlnbm9yZU1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICdpZ25vcmUnOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgcG9zdERhdGEgPSBrby5tYXBwaW5nLnRvSlModGhpcywgaWdub3JlTWFwcGluZyk7XHJcbiAgICAgICAgZGVsZXRlIHBvc3REYXRhLkFsZXJ0cztcclxuICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogJy9BZG1pbi9GdW5kcmFpc2VyL0V4cG9ydCcsXHJcbiAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhKSxcclxuICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04J1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHByb21pc2UuZmFpbCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHByb21pc2UuZG9uZShkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRnVuZHJhaXNlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgRnVuZHJhaXNlclJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5JdGVtRGV0YWlsLk51bWJlclN0b3JlcygnT25lIFN0b3JlJyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3ZpZXcvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2luZGV4YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvZGVsZXRlLzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5kZWxldGVJdGVtKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGdW5kcmFpc2VyUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBQYWdlQmFzZSA9IHJlcXVpcmUoXCIuLi9Db250ZW50UGFnZS9Db250ZW50UGFnZUJhc2VcIik7XHJcbmNvbnN0IEdyaWRDb250ZW50UGFnZUZvcm0gPSByZXF1aXJlKFwiLi9HcmlkQ29udGVudFBhZ2VGb3JtXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBDb250ZW50UGFnZVJvdXRlciA9IHJlcXVpcmUoXCIuLi9Db250ZW50UGFnZS9Db250ZW50UGFnZVJvdXRlclwiKTtcclxuY2xhc3MgR3JpZENvbnRlbnRQYWdlIGV4dGVuZHMgUGFnZUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIEdyaWRDb250ZW50UGFnZUZvcm0sIFRhYmxlLCBDb250ZW50UGFnZVJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gR3JpZENvbnRlbnRQYWdlO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgXyA9IHJlcXVpcmUoXCJ1bmRlcnNjb3JlXCIpO1xyXG5jb25zdCBQYWdlRm9ybSA9IHJlcXVpcmUoXCIuLi9Db250ZW50UGFnZS9Db250ZW50UGFnZUZvcm1cIik7XHJcbmNsYXNzIEdyaWRDb250ZW50UGFnZUZvcm0gZXh0ZW5kcyBQYWdlRm9ybSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSkge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgICAgICB0aGlzLmFkZEl0ZW1EZXRhaWxDbGllbnRPbmx5UHJvcGVydGllcygpO1xyXG4gICAgfVxyXG4gICAgc2V0dXBCaW5kaWdzKCkge1xyXG4gICAgICAgIHN1cGVyLnNldHVwQmluZGlncygpO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB2YXIgbW9kZWxIb2xkZXJTZWxlY3RvciA9ICQoJy5tb2RhbGZvcm0taG9sZGVyJyk7XHJcbiAgICAgICAgLy9Ub2dnbGUgQ29sbGFwc2VcclxuICAgICAgICBtb2RlbEhvbGRlclNlbGVjdG9yLm9uKCdjbGljaycsICcudG9nZ2xlLXJvdycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGEgPSBrby5kYXRhRm9yKHRoaXMpOyAvL2xvY2FsIHRoaXNcclxuICAgICAgICAgICAgZGF0YS5IaWRkZW4oIWRhdGEuSGlkZGVuKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGVsSG9sZGVyU2VsZWN0b3Iub24oJ2NsaWNrJywgJy5ncmlkY2VsbC10b2dnbGUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIGRhdGEuRXhwYW5kZWQoIWRhdGEuRXhwYW5kZWQoKSk7XHJcbiAgICAgICAgICAgIHZhciBjZWxsID0gJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHZhciBvcmlnaW5hbENsYXNzID0gY2VsbC5hdHRyKCdkYXRhLW5vcm1hbC1jc3MnKTtcclxuICAgICAgICAgICAgaWYgKGNlbGwuaGFzQ2xhc3Mob3JpZ2luYWxDbGFzcykpIHtcclxuICAgICAgICAgICAgICAgIGNlbGwucmVtb3ZlQ2xhc3Mob3JpZ2luYWxDbGFzcyk7XHJcbiAgICAgICAgICAgICAgICBjZWxsLmFkZENsYXNzKCdjb2wteHMtMTInKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNlbGwuYWRkQ2xhc3Mob3JpZ2luYWxDbGFzcyk7XHJcbiAgICAgICAgICAgICAgICBjZWxsLnJlbW92ZUNsYXNzKCdjb2wteHMtMTInKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGVsSG9sZGVyU2VsZWN0b3Iub24oJ2NsaWNrJywgJy5taW5pbWl6ZS1hbGwnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHNlbGYubWluaW1pemVBbGxSb3dzKGRhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGVsSG9sZGVyU2VsZWN0b3Iub24oJ2NsaWNrJywgJy5tYXhpbWl6ZS1hbGwnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHNlbGYubWF4aW1pemVBbGxSb3dzKGRhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vUmVtb3ZpbmdcclxuICAgICAgICBtb2RlbEhvbGRlclNlbGVjdG9yLm9uKCdjbGljaycsICcucm93LXJlbW92ZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGEgPSBrby5kYXRhRm9yKHRoaXMpOyAvL2xvY2FsIHRoaXNcclxuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBrby5jb250ZXh0Rm9yKHRoaXMpOyAvL2xvY2FsIHRoaXNcclxuICAgICAgICAgICAgdmFyIGdyaWQgPSBjb250ZXh0LiRwYXJlbnQ7XHJcbiAgICAgICAgICAgIGdyaWQuUm93cy5yZW1vdmUoZGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbW9kZWxIb2xkZXJTZWxlY3Rvci5vbignY2xpY2snLCAnLmNlbGwtcmVtb3ZlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGtvLmRhdGFGb3IodGhpcyk7IC8vbG9jYWwgdGhpc1xyXG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IGtvLmNvbnRleHRGb3IodGhpcyk7IC8vbG9jYWwgdGhpc1xyXG4gICAgICAgICAgICB2YXIgcm93ID0gY29udGV4dC4kcGFyZW50O1xyXG4gICAgICAgICAgICByb3cuQ2VsbHMucmVtb3ZlKGRhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGVsSG9sZGVyU2VsZWN0b3Iub24oJ2NsaWNrJywgJy5ocmVmLXJlbW92ZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGEgPSBrby5kYXRhRm9yKHRoaXMpOyAvL2xvY2FsIHRoaXNcclxuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBrby5jb250ZXh0Rm9yKHRoaXMpOyAvL2xvY2FsIHRoaXNcclxuICAgICAgICAgICAgdmFyIGNlbGwgPSBjb250ZXh0LiRwYXJlbnQ7XHJcbiAgICAgICAgICAgIGNlbGwuSHJlZnMucmVtb3ZlKGRhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vQWRkaW5nXHJcbiAgICAgICAgbW9kZWxIb2xkZXJTZWxlY3Rvci5vbignY2xpY2snLCAnLmFkZC1yb3cnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHNlbGYubWluaW1pemVBbGxSb3dzKGRhdGEpO1xyXG4gICAgICAgICAgICB2YXIgb3JkZXIgPSBkYXRhLlJvd3MoKS5sZW5ndGggKyAxO1xyXG4gICAgICAgICAgICB2YXIgcm93ID0gc2VsZi52bS5OZXdSb3c7XHJcbiAgICAgICAgICAgIHZhciByb3dDb3B5ID0ga28ubWFwcGluZy5mcm9tSlMoa28udG9KUyhyb3cpKTtcclxuICAgICAgICAgICAgc2VsZi5hZGRTb3J0ZWRDZWxscyhyb3dDb3B5KTtcclxuICAgICAgICAgICAgdmFyIGNlbGwgPSBzZWxmLnZtLk5ld0NlbGw7XHJcbiAgICAgICAgICAgIHZhciBjZWxsQ29weSA9IGtvLm1hcHBpbmcuZnJvbUpTKGtvLnRvSlMoY2VsbCkpO1xyXG4gICAgICAgICAgICBzZWxmLmFkZFNvcnRlZEhyZWZzKGNlbGxDb3B5KTtcclxuICAgICAgICAgICAgY2VsbENvcHkuT3JkZXIob3JkZXIpO1xyXG4gICAgICAgICAgICByb3dDb3B5LkNlbGxzLnB1c2goY2VsbENvcHkpO1xyXG4gICAgICAgICAgICByb3dDb3B5Lk9yZGVyKG9yZGVyKTtcclxuICAgICAgICAgICAgZGF0YS5Sb3dzLnB1c2gocm93Q29weSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbW9kZWxIb2xkZXJTZWxlY3Rvci5vbignY2xpY2snLCAnLmFkZC1jZWxsJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcm93ID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHZhciBvcmRlciA9IHJvdy5DZWxscygpLmxlbmd0aCArIDE7XHJcbiAgICAgICAgICAgIHZhciBjZWxsID0gc2VsZi52bS5OZXdDZWxsO1xyXG4gICAgICAgICAgICB2YXIgY2VsbENvcHkgPSBrby5tYXBwaW5nLmZyb21KUyhrby50b0pTKGNlbGwpKTtcclxuICAgICAgICAgICAgc2VsZi5hZGRTb3J0ZWRIcmVmcyhjZWxsQ29weSk7XHJcbiAgICAgICAgICAgIGNlbGxDb3B5Lk9yZGVyKG9yZGVyKTtcclxuICAgICAgICAgICAgcm93LkNlbGxzLnB1c2goY2VsbENvcHkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGVsSG9sZGVyU2VsZWN0b3Iub24oJ2NsaWNrJywgJy5hZGQtaHJlZicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGNlbGwgPSBrby5kYXRhRm9yKHRoaXMpOyAvL2xvY2FsIHRoaXNcclxuICAgICAgICAgICAgdmFyIGhyZWYgPSBzZWxmLnZtLk5ld0hyZWY7XHJcbiAgICAgICAgICAgIHZhciBocmVmQ29weSA9IGtvLm1hcHBpbmcuZnJvbUpTKGtvLnRvSlMoaHJlZikpO1xyXG4gICAgICAgICAgICBjZWxsLkhyZWZzLnB1c2goaHJlZkNvcHkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgbWluaW1pemVBbGxSb3dzKGRhdGEpIHtcclxuICAgICAgICBfLmVhY2goZGF0YS5Sb3dzKCksIChyb3cpID0+IHtcclxuICAgICAgICAgICAgcm93LkhpZGRlbih0cnVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIG1heGltaXplQWxsUm93cyhkYXRhKSB7XHJcbiAgICAgICAgXy5lYWNoKGRhdGEuUm93cygpLCAocm93KSA9PiB7XHJcbiAgICAgICAgICAgIHJvdy5IaWRkZW4oZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZ2V0TmV3VmVyc2lvbihsYW5ndWFnZSkge1xyXG4gICAgICAgIHZhciBuZXdWZXJzaW9uID0gc3VwZXIuZ2V0TmV3VmVyc2lvbihsYW5ndWFnZSk7XHJcbiAgICAgICAgLy9yZXNldCBhbGwgSWRzIHRvIDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFxyXG4gICAgICAgIC8vc28gdGhhdCBhbGwgYWxsIGNoaWxkcmVuIG9mIG5ldyB2ZXJzaW9uIGFyZSBuZXcgY29waWVzXHJcbiAgICAgICAgdmFyIGRlZmF1bHRJZCA9IG5ld1ZlcnNpb24uSWQoKTtcclxuICAgICAgICBfLmVhY2gobmV3VmVyc2lvbi5Sb3dzKCksIChyb3cpID0+IHtcclxuICAgICAgICAgICAgcm93LklkKGRlZmF1bHRJZCk7XHJcbiAgICAgICAgICAgIF8uZWFjaChyb3cuQ2VsbHMoKSwgKGNlbGwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNlbGwuSWQoZGVmYXVsdElkKTtcclxuICAgICAgICAgICAgICAgIF8uZWFjaChjZWxsLkhyZWZzKCksIChocmVmKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaHJlZi5JZChkZWZhdWx0SWQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBuZXdWZXJzaW9uO1xyXG4gICAgfVxyXG4gICAgYWRkVmVyc2lvbkNvbXB1dGVkKHZlcnNpb24pIHtcclxuICAgICAgICBzdXBlci5hZGRWZXJzaW9uQ29tcHV0ZWQodmVyc2lvbik7XHJcbiAgICAgICAgLy9zb3J0ZWQgcm93c1xyXG4gICAgICAgIHZlcnNpb24uU29ydGVkUm93cyA9IGtvLmNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24uUm93cygpLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiAobGVmdC5PcmRlcigpID09PSByaWdodC5PcmRlcigpID8gMCA6IChsZWZ0Lk9yZGVyKCkgPCByaWdodC5PcmRlcigpID8gLTEgOiAxKSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vc29ydGVkIGNlbGxzXHJcbiAgICAgICAgXy5lYWNoKHZlcnNpb24uUm93cygpLCAocm93KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkU29ydGVkQ2VsbHMocm93KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2ZXJzaW9uLnNob3dNaW5pbWl6ZUFsbCA9IGtvLmNvbXB1dGVkKCgpID0+IF8uYW55KHZlcnNpb24uUm93cygpLCAocm93KSA9PiAoIXJvdy5IaWRkZW4oKSkpKTtcclxuICAgICAgICB2ZXJzaW9uLnNob3dNYXhpbWl6ZUFsbCA9IGtvLmNvbXB1dGVkKCgpID0+IF8uYW55KHZlcnNpb24uUm93cygpLCAocm93KSA9PiAocm93LkhpZGRlbigpKSkpO1xyXG4gICAgfVxyXG4gICAgYWRkU29ydGVkQ2VsbHMocm93KSB7XHJcbiAgICAgICAgcm93LlNvcnRlZENlbGxzID0ga28uY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcm93LkNlbGxzKCkuc29ydCgobGVmdCwgcmlnaHQpID0+IChsZWZ0Lk9yZGVyKCkgPT09IHJpZ2h0Lk9yZGVyKCkgPyAwIDogKGxlZnQuT3JkZXIoKSA8IHJpZ2h0Lk9yZGVyKCkgPyAtMSA6IDEpKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy9zb3J0ZWQgY2VsbHNcclxuICAgICAgICBfLmVhY2gocm93LkNlbGxzKCksIChjZWxsKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkU29ydGVkSHJlZnMoY2VsbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBhZGRTb3J0ZWRIcmVmcyhjZWxsKSB7XHJcbiAgICAgICAgY2VsbC5Tb3J0ZWRIcmVmcyA9IGtvLmNvbXB1dGVkKCgpID0+IGNlbGwuSHJlZnMoKS5zb3J0KChsZWZ0LCByaWdodCkgPT4gKGxlZnQuT3JkZXIoKSA9PT0gcmlnaHQuT3JkZXIoKSA/IDAgOiAobGVmdC5PcmRlcigpIDwgcmlnaHQuT3JkZXIoKSA/IC0xIDogMSkpKSk7XHJcbiAgICB9XHJcbiAgICBwb3N0KCkge1xyXG4gICAgICAgIC8vcHJldmVudCBkb3VibGUgcG9zdFxyXG4gICAgICAgIGlmICh0aGlzLnZtLklzTG9hZGluZygpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9tYWtlIG92ZXJsYXkgbG9hZGluZyBkaXYgZnVsbCBoZWlnaHRcclxuICAgICAgICAkKCcjbG9hZGluZycpLmhlaWdodCgkKHdpbmRvdykuaGVpZ2h0KCkpO1xyXG4gICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgIHZhciBpZ25vcmVNYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAnaWdub3JlJzogdGhpcy5kYXRhLktPTWFwcGluZy5hbGxOb25Qb3N0QmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIHBvc3REYXRhID0ga28ubWFwcGluZy50b0pTKHRoaXMudm0sIGlnbm9yZU1hcHBpbmcpO1xyXG4gICAgICAgICQuZWFjaChwb3N0RGF0YS5JdGVtRGV0YWlsLkFsbFZlcnNpb25zLCBmdW5jdGlvbiAoaSwgdikge1xyXG4gICAgICAgICAgICBpZiAobW9tZW50LmlzTW9tZW50KHYuU3RhcnREYXRlVGltZSkpXHJcbiAgICAgICAgICAgICAgICB2LlN0YXJ0RGF0ZVRpbWUgPSB2LlN0YXJ0RGF0ZVRpbWUuZm9ybWF0KFwiWVlZWS1NTS1EVEhIOm1tOnNzLm1tbVwiKTtcclxuICAgICAgICAgICAgaWYgKCFpc05hTih2LkVuZERhdGVUaW1lKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1vbWVudC5pc01vbWVudCh2LkVuZERhdGVUaW1lKSlcclxuICAgICAgICAgICAgICAgICAgICB2LkVuZERhdGVUaW1lID0gdi5FbmREYXRlVGltZS5mb3JtYXQoXCJZWVlZLU1NLURUSEg6bW06c3MubW1tXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcG9zdERhdGEgPSBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSk7XHJcbiAgICAgICAgcG9zdERhdGEgPSBwb3N0RGF0YS5yZXBsYWNlKCc8IS0tPHNjcmlwdCcsICc8c2NyaXB0Jyk7XHJcbiAgICAgICAgcG9zdERhdGEgPSBwb3N0RGF0YS5yZXBsYWNlKCc8L3NjcmlwdD4tLT4nLCAnPC9zY3JpcHQ+Jyk7XHJcbiAgICAgICAgZGVsZXRlIHBvc3REYXRhLkFsZXJ0cztcclxuICAgICAgICBkZWxldGUgcG9zdERhdGEuTmV3VmVyc2lvbjtcclxuICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogdGhpcy5wb3N0VXJsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAgICAgZGF0YTogcG9zdERhdGEsXHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5mYWlsKChlcnJvcikgPT4gdGhpcy5wb3N0UHJvbWlzZUZhaWwoZXJyb3IpKTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoZGF0YSA9PiB0aGlzLnBvc3RQcm9taXNlRG9uZShkYXRhKSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBHcmlkQ29udGVudFBhZ2VGb3JtO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBIYWxmQW5kSGFsZlJvdXRlciA9IHJlcXVpcmUoXCIuL0hhbGZBbmRIYWxmUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgSGFsZkFuZEhhbGYgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgSGFsZkFuZEhhbGZSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEhhbGZBbmRIYWxmO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBIYWxmQW5kSGFsZlJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3ZpZXcvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2luZGV4YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvZGVsZXRlLzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5kZWxldGVJdGVtKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBIYWxmQW5kSGFsZlJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgSG9tZVN0cmVhbVJvdXRlciA9IHJlcXVpcmUoXCIuL0hvbWVTdHJlYW1Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBIb21lU3RyZWFtIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIEhvbWVTdHJlYW1Sb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEhvbWVTdHJlYW07XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIEhvbWVTdHJlYW1Sb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEhvbWVTdHJlYW1Sb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIE1lYWwgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBNZWFsO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBNZWRpYVJvdXRlciA9IHJlcXVpcmUoXCIuL01lZGlhUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgTWVkaWEgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgTWVkaWFSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IE1lZGlhO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBNZWRpYVJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IE1lZGlhUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBNZW51Q2F0ZWdvcnlSb3V0ZXIgPSByZXF1aXJlKFwiLi9NZW51Q2F0ZWdvcnlSb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBNZW51SXRlbSBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBNZW51Q2F0ZWdvcnlSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKFwiLmhpZGVVbmJvdW5kXCIpLnJlbW92ZUNsYXNzKFwiaGlkZVVuYm91bmRcIik7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBNZW51SXRlbTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgTWVudUNhdGVnb3J5Um91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9saXN0YCxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvdmlldy86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvaW5kZXhgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9kZWxldGUvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmRlbGV0ZUl0ZW0oaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IE1lbnVDYXRlZ29yeVJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgTWVudUl0ZW1Sb3V0ZXIgPSByZXF1aXJlKFwiLi9NZW51SXRlbVJvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIE1lbnVJdGVtIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIE1lbnVJdGVtUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBNZW51SXRlbTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgTWVudUl0ZW1Sb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gTWVudUl0ZW1Sb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNsYXNzIE1lbnUgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJChcIi5oaWRlVW5ib3VuZFwiKS5yZW1vdmVDbGFzcyhcImhpZGVVbmJvdW5kXCIpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gTWVudTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgTW9iaWxlRmVhdHVyZSBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IE1vYmlsZUZlYXR1cmU7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNsYXNzIE51dHJpdGlvbiB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICAvLyBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBOdXRyaXRpb247XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIFBhbmRhRnVuZHJhaXNlckJsYWNrb3V0RGF0ZSBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKFwiLmhpZGVVbmJvdW5kXCIpLnJlbW92ZUNsYXNzKFwiaGlkZVVuYm91bmRcIik7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBQYW5kYUZ1bmRyYWlzZXJCbGFja291dERhdGU7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuLy9pbXBvcnQgRm9ybSA9IHJlcXVpcmUoJy4uL0Jhc2UvRm9ybScpO1xyXG5jb25zdCBQYW5kYUZ1bmRyYWlzZXJNZW1iZXJGb3JtID0gcmVxdWlyZShcIi4vUGFuZGFGdW5kcmFpc2VyTWVtYmVyRm9ybVwiKTtcclxuY2xhc3MgUGFuZGFGdW5kcmFpc2VyTWVtYmVyIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgUGFuZGFGdW5kcmFpc2VyTWVtYmVyRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5MZWF2ZU9wZW5PbkFqYXhTdWNjZXNzKGZhbHNlKTtcclxuICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuU2hvd1N1Y2Nlc3MoZmFsc2UpO1xyXG4gICAgICAgICQoXCIjcmVnaXN0ZXJcIikub24oXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSBcIi9wYW5kYWZ1bmRyYWlzZXJtZW1iZXIvZWRpdFwiO1xyXG4gICAgICAgICAgICB2YXIgbWFwcGluZyA9IHtcclxuICAgICAgICAgICAgICAgICdpZ25vcmUnOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZhciBwb3N0RGF0YSA9IGtvLm1hcHBpbmcudG9KUyh0aGlzLCBtYXBwaW5nKTtcclxuICAgICAgICAgICAgJChcIiNsb2FkaW5nXCIpLmhlaWdodCgkKHdpbmRvdykuaGVpZ2h0KCkpO1xyXG4gICAgICAgICAgICB0aGlzLklzTG9hZGluZyh0cnVlKTtcclxuICAgICAgICAgICAgZGVsZXRlIHBvc3REYXRhLkFsZXJ0cztcclxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOFwiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAvL3NvbWV0aGluZyB3ZW50IHdyb25nIGRpc3BsYXkgZXJyb3JcclxuICAgICAgICAgICAgICAgIHZhciBodG1sID0gZXJyb3IuZXJyb3IoKS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIikuaHRtbChodG1sKTtcclxuICAgICAgICAgICAgICAgICQoXCJzdHlsZVwiLCBlbGVtZW50KS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIHZhciBodG1sVGV4dCA9IGVsZW1lbnQuaHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRBbGVydChodG1sVGV4dCwgXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZShmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuTG9naW5TdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkYXRhLlJldHVyblVybDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkQWxlcnQoZGF0YS5NZXNzYWdlLCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnYnV0dG9uLmJ1dHRvbi5wcmltYXJ5LmNoYW5nZS1wYXNzd29yZCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gXCIvcGFuZGFmdW5kcmFpc2VybWVtYmVyL3Jlc2V0cGFzc3dvcmRcIjtcclxuICAgICAgICAgICAgdmFyIG1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICAgICAnaWdub3JlJzogc2VsZi5kYXRhLktPTWFwcGluZy5hbGxOb25Qb3N0QmFja1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB2YXIgcG9zdERhdGEgPSBrby5tYXBwaW5nLnRvSlMoc2VsZiwgbWFwcGluZyk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBwb3N0RGF0YS5BbGVydHM7XHJcbiAgICAgICAgICAgICQoXCIjbG9hZGluZ1wiKS5oZWlnaHQoJCh3aW5kb3cpLmhlaWdodCgpKTtcclxuICAgICAgICAgICAgc2VsZi5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdERhdGEpLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLThcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcHJvbWlzZS5mYWlsKChlcnJvcikgPT4gc2VsZi5mb3JtLnBvc3RQcm9taXNlRmFpbChlcnJvcikpO1xyXG4gICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKHZtKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuU2hvd1N1Y2Nlc3ModHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gUGFuZGFGdW5kcmFpc2VyTWVtYmVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIFBhbmRhRnVuZHJhaXNlck1lbWJlckZvcm0gZXh0ZW5kcyBGb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBlZGl0QWN0aW9uID0gJ0VkaXQnKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGVkaXRBY3Rpb24pO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgICAgIHRoaXMuZWRpdEFjdGlvbiA9IGVkaXRBY3Rpb247XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgfVxyXG4gICAgcG9zdCgpIHtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWwuSW52YWxpZEVtYWlsTWVzc2FnZShudWxsKTtcclxuICAgICAgICB2YXIgcHJvbWlzZSA9IHN1cGVyLnBvc3QoKTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkYXRhLlJldHVyblVybDtcclxuICAgICAgICAgICAgaWYgKHRoaXMudm0uSXRlbURldGFpbElzTmV3KCkpXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvZnVuZHJhaXNlcmxvZ2luIy9pbmRleCc7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9wYW5kYWZ1bmRyYWlzZXIjL2xpc3QnO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHByb21pc2UuZmFpbChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudm0uTWVzc2FnZSA9IGVycm9yLnJlc3BvbnNlSlNPTi5NZXNzYWdlO1xyXG4gICAgICAgICAgICB2YXIgaHRtbCA9IGVycm9yLmVycm9yKCkucmVzcG9uc2VUZXh0O1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIikuaHRtbChodG1sKTtcclxuICAgICAgICAgICAgJChcInN0eWxlXCIsIGVsZW1lbnQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB2YXIgaHRtbFRleHQgPSBlbGVtZW50Lmh0bWwoKTtcclxuICAgICAgICAgICAgdGhpcy52bS5BZGRBbGVydChodG1sVGV4dCwgXCJlcnJvclwiKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhbmRhRnVuZHJhaXNlck1lbWJlckZvcm07XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFBhbmRhRnVuZHJhaXNlclJvdXRlciA9IHJlcXVpcmUoXCIuL1BhbmRhRnVuZHJhaXNlclJvdXRlclwiKTtcclxuY29uc3QgUGFuZGFGdW5kcmFpc2VyRm9ybSA9IHJlcXVpcmUoXCIuL1BhbmRhRnVuZHJhaXNlckZvcm1cIik7XHJcbmNvbnN0IFN0b3JlID0gcmVxdWlyZShcIi4uL1N0b3JlL1N0b3JlXCIpO1xyXG5jb25zdCBNb2RhbCA9IHJlcXVpcmUoXCIuLi9Db21tb24vTW9kYWxcIik7XHJcbmNvbnN0IF8gPSByZXF1aXJlKFwidW5kZXJzY29yZVwiKTtcclxuY2xhc3MgUGFuZGFGdW5kcmFpc2VyIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgLy9tZTogdGhpcztcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIFBhbmRhRnVuZHJhaXNlckZvcm0sIFRhYmxlLCBQYW5kYUZ1bmRyYWlzZXJSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy50YWJsZS5vcmRlcmJ5ID0gXCJFdmVudERhdGUgZGVzY1wiO1xyXG4gICAgICAgIC8vc2V0dXAgdGFibGUsIHJvdXRlcyBhbmQgZm9ybVxyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAvL3JldXNlIHRoZSBzdG9yZSB2bSBmb3Igc3RvcmUgc2VhcmNoXHJcbiAgICAgICAgdGhpcy5zdG9yZVZtID0gbmV3IFN0b3JlKGRhdGEuU3RvcmVWaWV3TW9kZWwsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnN0b3JlVm0uRmlsdGVycy5TaG93SGF3YWlpKGZhbHNlKTtcclxuICAgICAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsKFwiZGVsZXRlRXZlbnRcIik7XHJcbiAgICAgICAgdGhpcy5tb2RhbC5pbml0KCk7XHJcbiAgICAgICAgJChcIi50YWJsZS1ob2xkZXItXCIgKyB0aGlzLmRhdGEuVGl0bGUpLm9uKFwiY2xpY2tcIiwgXCJhLmNhbmNlbC1ldmVudFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBhRGF0YSA9IGtvLmRhdGFGb3IodGhpcyk7IC8vbG9jYWwgdGhpc1xyXG4gICAgICAgICAgICB2YXIgaWQgPSBhRGF0YS5VbmlxdWVJZDtcclxuICAgICAgICAgICAgc2VsZi5tb2RhbC5vcGVuKGlkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCdkaXYucHgtbW9kYWwgZGl2LmJ1dHRvbi1ncm91cCBidXR0b24uYnV0dG9uLnNlY29uZGFyeScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLy9zZWxmLkFsZXJ0cyA9IDtcclxuICAgICAgICAgICAgdmFyIHVybCA9IFwiL3BhbmRhZnVuZHJhaXNlci9jYW5jZWw/dW5pcXVlaWQ9XCIgKyBzZWxmLm1vZGFsLmV2ZW50SWQ7XHJcbiAgICAgICAgICAgIHZhciBtYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAgICAgJ2lnbm9yZSc6IHNlbGYuZGF0YS5LT01hcHBpbmcuYWxsTm9uUG9zdEJhY2tcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdmFyIHBvc3REYXRhID0ga28ubWFwcGluZy50b0pTKHNlbGYsIG1hcHBpbmcpO1xyXG4gICAgICAgICAgICAkKFwiI2xvYWRpbmdcIikuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhKSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04XCJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZmFpbChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3NvbWV0aGluZyB3ZW50IHdyb25nIGRpc3BsYXkgZXJyb3JcclxuICAgICAgICAgICAgICAgIHZhciBodG1sID0gZXJyb3IuZXJyb3IoKS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIikuaHRtbChodG1sKTtcclxuICAgICAgICAgICAgICAgICQoXCJzdHlsZVwiLCBlbGVtZW50KS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIHZhciBodG1sVGV4dCA9IGVsZW1lbnQuaHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5BZGRBbGVydChodG1sVGV4dCwgXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZSh2bSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9ICcjLycgKyB2bS5EZWZhdWx0U2FtbXlSb3V0ZTtcclxuICAgICAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHNlbGYudGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2VsZi5tb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgICAgICAvL3JldHVybiB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjY29udGludWUtZnVuZHJhaXNlcicsICgpID0+IHtcclxuICAgICAgICAgICAgLy9wcmV2ZW50IGRvdWJsZSBwb3N0XHJcbiAgICAgICAgICAgIGlmICh0aGlzLklzTG9hZGluZygpIHx8ICghdGhpcy5JdGVtRGV0YWlsLkNhbkVkaXQoKSAmJiAhdGhpcy5JdGVtRGV0YWlsSXNOZXcoKSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdNZW1iZXJJZCcpO1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSByZS5leGVjKGRvY3VtZW50LmNvb2tpZSk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2Z1bmRyYWlzZXJsb2dpbiMvaW5kZXgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuSXRlbURldGFpbC5DdXN0b21lckNvbmZpcm1lZChmYWxzZSk7XHJcbiAgICAgICAgICAgIHZhciBjYXB0Y2hhID0gd2luZG93W1wiZnVuZHJhaXNlckNhcHRjaGFTYXRpc2ZpZWRcIl07XHJcbiAgICAgICAgICAgIGlmICghY2FwdGNoYSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuSXRlbURldGFpbC5BZ3JlZVRvVGVybXMoKSlcclxuICAgICAgICAgICAgICAgICAgICBhbGVydChcIlBsZWFzZSBjb21wbGV0ZSB0aGUgY2FwdGNoYSBjaGFsbGVuZ2UuXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vbWFrZSBvdmVybGF5IGxvYWRpbmcgZGl2IGZ1bGwgaGVpZ2h0XHJcbiAgICAgICAgICAgICQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgICAgIHRoaXMuSXNMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICB2YXIgaWdub3JlTWFwcGluZyA9IHtcclxuICAgICAgICAgICAgICAgICdpZ25vcmUnOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZhciBwb3N0RGF0YSA9IGtvLm1hcHBpbmcudG9KUyh0aGlzLCBpZ25vcmVNYXBwaW5nKTtcclxuICAgICAgICAgICAgZGVsZXRlIHBvc3REYXRhLkFsZXJ0cztcclxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiAncGFuZGFmdW5kcmFpc2VyL2VkaXQnLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdERhdGEpLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcHJvbWlzZS5mYWlsKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXy5lYWNoKGVycm9yLnJlc3BvbnNlSlNPTi5Nb2RlbFN0YXRlLlByb3BlcnR5RXJyb3JzLCAocHJvcGVydHlFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYWRkUHJvcGVydHlFcnJvcihwcm9wZXJ0eUVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBfLmVhY2goZXJyb3IucmVzcG9uc2VKU09OLk1vZGVsU3RhdGUuTW9kZWxFcnJvcnMsICh2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZEFsZXJ0KHYuRXJyb3JNZXNzYWdlLCAnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2VKU09OLk1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NZXNzYWdlID0gZXJyb3IucmVzcG9uc2VKU09OLk1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5yZWZyZXNoVGFiVmFsaWRhdGlvbkJhZGdlcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlSlNPTikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2VKU09OLk1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkQWxlcnQoZXJyb3IucmVzcG9uc2VKU09OLk1lc3NhZ2UsICdlcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlVGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gJCgnPGRpdi8+JykuaHRtbChodG1sKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ3N0eWxlJywgZWxlbWVudCkucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbFRleHQgPSBlbGVtZW50Lmh0bWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkQWxlcnQoaHRtbFRleHQsICdlcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbDIgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlVGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQyID0gJCgnPGRpdi8+JykuaHRtbChodG1sMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJ3N0eWxlJywgZWxlbWVudDIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbFRleHQyID0gZWxlbWVudDIuaHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZEFsZXJ0KGh0bWxUZXh0MiwgJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5SZXZpZXdFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKGRhdGEuSXRlbURldGFpbCwge30sIHRoaXMuSXRlbURldGFpbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9rby5tYXBwaW5nLmZyb21KUyhkYXRhLlN0b3JlVmlld01vZGVsLCB7fSwgdGhpcy5zdG9yZVZtKTtcclxuICAgICAgICAgICAgICAgICAgICBrby5tYXBwaW5nLmZyb21KUyhkYXRhLlN0b3JlVmlld01vZGVsLkZpbHRlcnMsIHt9LCB0aGlzLnN0b3JlVm0uRmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Gb3JtVmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXZpZXdFdmVudCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3ZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyMvdmlldy8nICsga28udW53cmFwKGRhdGEuSXRlbURldGFpbC5JZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlJldmlld0V2ZW50KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkZvcm1WaXNpYmxlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5tb2RhbGZvcm0taG9sZGVyJykub24oJ2NsaWNrJywgJyNzYXZlLWZ1bmRyYWlzZXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vcHJldmVudCBkb3VibGUgcG9zdFxyXG4gICAgICAgICAgICBpZiAodGhpcy5Jc0xvYWRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuSXRlbURldGFpbC5BZ3JlZVRvVGVybXModHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuSXRlbURldGFpbC5DdXN0b21lckNvbmZpcm1lZCh0cnVlKTtcclxuICAgICAgICAgICAgLy9tYWtlIG92ZXJsYXkgbG9hZGluZyBkaXYgZnVsbCBoZWlnaHRcclxuICAgICAgICAgICAgJCgnI2xvYWRpbmcnKS5oZWlnaHQoJCh3aW5kb3cpLmhlaWdodCgpKTtcclxuICAgICAgICAgICAgdGhpcy5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgIHZhciBpZ25vcmVNYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAgICAgJ2lnbm9yZSc6IHRoaXMuZGF0YS5LT01hcHBpbmcuYWxsTm9uUG9zdEJhY2tcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdmFyIHBvc3REYXRhID0ga28ubWFwcGluZy50b0pTKHRoaXMsIGlnbm9yZU1hcHBpbmcpO1xyXG4gICAgICAgICAgICBkZWxldGUgcG9zdERhdGEuQWxlcnRzO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICdwYW5kYWZ1bmRyYWlzZXIvZWRpdCcsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmZhaWwoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5SZXZpZXdFdmVudCgpKSB7IC8vaWYgdGhleSB3ZXJlIG9uIHRoZSByZXZpZXcgZXZlbnQgdGFiIGFuZCBjbGlja2VkIHN1Ym1pdCBhbmQgdGhlIHZhbGlkYXRpb24gZmFpbGVkIGdvIGJhY2sgdG8gdGhlIGVkaXQgdGFiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmV2aWV3RXZlbnQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZvcm1WaXNpYmxlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkV2ZW50U3VibWl0dGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXy5lYWNoKGVycm9yLnJlc3BvbnNlSlNPTi5Nb2RlbFN0YXRlLlByb3BlcnR5RXJyb3JzLCAocHJvcGVydHlFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYWRkUHJvcGVydHlFcnJvcihwcm9wZXJ0eUVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBfLmVhY2goZXJyb3IucmVzcG9uc2VKU09OLk1vZGVsU3RhdGUuTW9kZWxFcnJvcnMsICh2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZEFsZXJ0KHYuRXJyb3JNZXNzYWdlLCAnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2VKU09OLk1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NZXNzYWdlID0gZXJyb3IucmVzcG9uc2VKU09OLk1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5yZWZyZXNoVGFiVmFsaWRhdGlvbkJhZGdlcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlSlNPTikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2VKU09OLk1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkQWxlcnQoZXJyb3IucmVzcG9uc2VKU09OLk1lc3NhZ2UsICdlcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlVGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gJCgnPGRpdi8+JykuaHRtbChodG1sKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ3N0eWxlJywgZWxlbWVudCkucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbFRleHQgPSBlbGVtZW50Lmh0bWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkQWxlcnQoaHRtbFRleHQsICdlcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbDIgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlVGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQyID0gJCgnPGRpdi8+JykuaHRtbChodG1sMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJ3N0eWxlJywgZWxlbWVudDIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbFRleHQyID0gZWxlbWVudDIuaHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZEFsZXJ0KGh0bWxUZXh0MiwgJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29weU1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2NvcHknOiB0aGlzLmRhdGEuS09NYXBwaW5nLmNvcHlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBrby5tYXBwaW5nLmZyb21KUyhkYXRhLkl0ZW1EZXRhaWwsIGNvcHlNYXBwaW5nLCB0aGlzLkl0ZW1EZXRhaWwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEuTGVhdmVPcGVuT25BamF4U3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmV2aWV3RXZlbnQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRm9ybVZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRTdWJtaXR0ZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnLm1vZGFsZm9ybS1ob2xkZXInKS5vbignY2hhbmdlJywgJyNMb2dvJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlID0gdGhpcy5maWxlc1tpXTtcclxuICAgICAgICAgICAgICAgIHZhciBmZCA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgZmQuYXBwZW5kKFwiZmlsZVRvVXBsb2FkXCIsIGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6ICdwYW5kYWZ1bmRyYWlzZXIvdXBsb2FkZmlsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZmQsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSXRlbURldGFpbC5Mb2dvKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnLm1vZGFsZm9ybS1ob2xkZXInKS5vbignY2xpY2snLCAnLmltYWdlLWJ1dHRvbi10aWxlJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLkl0ZW1EZXRhaWwuTG9nbygnJyk7XHJcbiAgICAgICAgICAgICQoJyNMb2dvJykudmFsKCcnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgICAgIHRoaXMuUGF5bWVudFRvTW9kYWxTaG93biA9IGZhbHNlO1xyXG4gICAgICAgICQoJyNJdGVtRGV0YWlsX1BheW1lbnRQYXlhYmxlVG8nKS5ibHVyKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLlBheW1lbnRUb01vZGFsU2hvd24pIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KCdIZWxwIHVzIGdldCB5b3VyIGNoZWNrIHRvIHlvdSBvbiB0aW1lISBQbGVhc2UgdGFrZSBhIG1vbWVudCB0byBlbnN1cmUgeW91ciBvcmdhbml6YXRpb27igJlzIG5hbWUgaXMgbm90IGFiYnJldmlhdGVkIGFuZCBtYXRjaGVzIHlvdXIgVGF4IElELicpO1xyXG4gICAgICAgICAgICAgICAgLy8gb25seSBzaG93IG9uY2VcclxuICAgICAgICAgICAgICAgIHRoaXMuUGF5bWVudFRvTW9kYWxTaG93biA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQoJyNJdGVtRGV0YWlsX0V2ZW50RGF0ZScpLnZhbCgnbW0vZGQveXl5eScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gUGFuZGFGdW5kcmFpc2VyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIFBhbmRhRnVuZHJhaXNlckZvcm0gZXh0ZW5kcyBGb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBlZGl0QWN0aW9uID0gJ0VkaXQnKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGVkaXRBY3Rpb24pO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgICAgIHRoaXMuZWRpdEFjdGlvbiA9IGVkaXRBY3Rpb247XHJcbiAgICB9XHJcbiAgICBwcm9taXNlRG9uZShkYXRhLCBpZCkge1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbElzTmV3KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmtvbWFwcGluZ2Zyb21kYXRhKGRhdGEsIGlkKTtcclxuICAgICAgICB0aGlzLnZtLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgdGhpcy52bS5Gb3JtVmlzaWJsZSh0cnVlKTtcclxuICAgICAgICB0aGlzLnZtLlJldmlld0V2ZW50KGRhdGEuUmV2aWV3RXZlbnQpO1xyXG4gICAgICAgIGlmICh0aGlzLnZtLlJldmlld0V2ZW50KCkpXHJcbiAgICAgICAgICAgIHRoaXMudm0uRm9ybVZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgIGlmIChkYXRhLlJldHVyblVybCAhPT0gbnVsbClcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkYXRhLlJldHVyblVybDtcclxuICAgICAgICAvL2Vsc2VcclxuICAgICAgICAvLyAgdGhpcy52bS5yb3V0ZXMudmlldyhpZCk7XHJcbiAgICB9XHJcbiAgICBnZXREZXRhaWwoaWQpIHtcclxuICAgICAgICB0aGlzLnJlc2V0RGV0YWlsKCk7XHJcbiAgICAgICAgJCgnI2xvYWRpbmcnKS5oZWlnaHQoJCh3aW5kb3cpLmhlaWdodCgpKTtcclxuICAgICAgICB0aGlzLnZtLklzTG9hZGluZyh0cnVlKTtcclxuICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ2Zvcm0tc2hvd24nKTtcclxuICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogdGhpcy5nZXRVcmwsXHJcbiAgICAgICAgICAgIGRhdGE6IHsgaWQ6IGlkIH0sXHJcbiAgICAgICAgICAgIHR5cGU6ICdHRVQnLFxyXG4gICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04J1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHByb21pc2UuZmFpbCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgdmFyIGh0bWwgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlVGV4dDtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5odG1sKGh0bWwpO1xyXG4gICAgICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB2YXIgaHRtbFRleHQgPSBlbGVtZW50Lmh0bWwoKTtcclxuICAgICAgICAgICAgdGhpcy52bS5BZGRBbGVydChodG1sVGV4dCwgJ2FsZXJ0LWVycm9yJyk7XHJcbiAgICAgICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoKGRhdGEpID0+IHRoaXMucHJvbWlzZURvbmUoZGF0YSwgaWQpKTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuICAgIGtvbWFwcGluZ2Zyb21kYXRhKGRhdGEsIGlkKSB7XHJcbiAgICAgICAgdmFyIGNvcHlNYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAnY29weSc6IHRoaXMuZGF0YS5LT01hcHBpbmcuYWxsTm9uUG9zdEJhY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIGRhdGEuSXRlbURldGFpbC5FdmVudERhdGUgPSBtb21lbnQoZGF0YS5JdGVtRGV0YWlsLkV2ZW50RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAga28ubWFwcGluZy5mcm9tSlMoZGF0YS5JdGVtRGV0YWlsLCBjb3B5TWFwcGluZywgdGhpcy52bS5JdGVtRGV0YWlsKTtcclxuICAgICAgICBpZiAoZGF0YS5TdG9yZVZpZXdNb2RlbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKGRhdGEuU3RvcmVWaWV3TW9kZWwuRmlsdGVycywgY29weU1hcHBpbmcsIHRoaXMudm0uc3RvcmVWbS5GaWx0ZXJzKTtcclxuICAgICAgICAgICAga28ubWFwcGluZy5mcm9tSlMoZGF0YS5TdG9yZVZpZXdNb2RlbC5JdGVtRGV0YWlsLCBjb3B5TWFwcGluZywgdGhpcy52bS5zdG9yZVZtLkl0ZW1EZXRhaWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vcmVzZXRzIGl0ZW0gZGV0YWlsIHNvIHRoYXQgaXQgbG9va3MgbGlrZSBhIG5ldyBpbnNlcnRcclxuICAgIHJlc2V0RGV0YWlsKCkge1xyXG4gICAgICAgIHN1cGVyLnJlc2V0RGV0YWlsKCk7XHJcbiAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsLkV2ZW50RGF0ZShudWxsKTsgLy9jbGVhciB0aGUgZGF0ZXBpY2tlciB0aW1lXHJcbiAgICAgICAga28ubWFwcGluZy5mcm9tSlModGhpcy52bS5OZXdJdGVtRGV0YWlsLCB7fSwgdGhpcy52bS5JdGVtRGV0YWlsKTtcclxuICAgICAgICB0aGlzLnZtLnN0b3JlVm0uRmlsdGVycy5TZWFyY2hUZXJtKG51bGwpO1xyXG4gICAgfVxyXG4gICAgcG9zdCgpIHtcclxuICAgICAgICB0aGlzLnZtLnJvdXRlcy5sYXN0Um91dGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSBzdXBlci5wb3N0KCk7XHJcbiAgICAgICAgcHJvbWlzZS5kb25lKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLlJldHVyblVybCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5SZXR1cm5Vcmw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBQYW5kYUZ1bmRyYWlzZXJGb3JtO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBQYW5kYUZ1bmRyYWlzZXJSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICcvUGFuZGFGdW5kcmFpc2VyIy9saXN0JyxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnTWVtYmVySWQnKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSByZS5leGVjKGRvY3VtZW50LmNvb2tpZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9mdW5kcmFpc2VybG9naW4jL2luZGV4JztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uUmV2aWV3RXZlbnQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uRm9ybVZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uRXZlbnRTdWJtaXR0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uVmlld1Jlc291cmNlcyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJy9QYW5kYUZ1bmRyYWlzZXIjL25ldycsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ01lbWJlcklkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmUuZXhlYyhkb2N1bWVudC5jb29raWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvZnVuZHJhaXNlcmxvZ2luIy9pbmRleCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5yZXNldERldGFpbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uSXRlbURldGFpbElzTmV3KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uUmV2aWV3RXZlbnQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uRm9ybVZpc2libGUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5WaWV3UmVzb3VyY2VzKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcjSXRlbURldGFpbF9FdmVudERhdGUnKS52YWwoJ21tL2RkL3l5eXknKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnL1BhbmRhRnVuZHJhaXNlciMvc2F2ZScsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uU2F2ZUZvckxhdGVyKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uSXRlbURldGFpbC5TYXZlRm9yTGF0ZXIodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5SZXR1cm5VcmwgPSAnL3BhbmRhZnVuZHJhaXNlciMvbGlzdCc7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnTWVtYmVySWQnKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSByZS5leGVjKGRvY3VtZW50LmNvb2tpZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9mdW5kcmFpc2VybG9naW4jL2luZGV4JztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudm0uZm9ybS5wb3N0KCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogL1xcL1BhbmRhRnVuZHJhaXNlciNcXC92aWV3XFwvKC4qKS9pLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snc3BsYXQnXVswXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdNZW1iZXJJZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlLmV4ZWMoZG9jdW1lbnQuY29va2llKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2Z1bmRyYWlzZXJsb2dpbiMvaW5kZXgnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2UuZG9uZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudm0uUmV2aWV3RXZlbnQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudm0uRm9ybVZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLkV2ZW50U3VibWl0dGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5WaWV3UmVzb3VyY2VzKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogL1xcL1BhbmRhRnVuZHJhaXNlciNcXC9yZXNvdXJjZXNcXC8oLiopL2ksXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydzcGxhdCddWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ01lbWJlcklkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmUuZXhlYyhkb2N1bWVudC5jb29raWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvZnVuZHJhaXNlcmxvZ2luIy9pbmRleCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5kb25lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5SZXZpZXdFdmVudChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudm0uRm9ybVZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLkV2ZW50U3VibWl0dGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5WaWV3UmVzb3VyY2VzKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAvXFwvUGFuZGFGdW5kcmFpc2VyI1xcL2VkaXRcXC8oLiopL2ksXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydzcGxhdCddWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ01lbWJlcklkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmUuZXhlYyhkb2N1bWVudC5jb29raWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvZnVuZHJhaXNlcmxvZ2luIy9pbmRleCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhbmRhRnVuZHJhaXNlclJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vLyBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBPcmFuZ2UgT25pb24gU2NhZmZvbGRlci5cclxuLy8gdGVtcGxhdGU6IE1WQy5KU01vZHVsZS5jc1xyXG4vLyBjbGFzczogUHVibGljQ29udGVudFBhZ2VcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jbGFzcyBQdWJsaWNDb250ZW50UGFnZSBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJCgnLmNvbnRlbnQtY29udGFpbmVyJyk7XHJcbiAgICAgICAgJGVsZW1lbnQuc3VtbWVybm90ZSh7XHJcbiAgICAgICAgICAgIGhlaWdodDogNjAwLCBhaXJNb2RlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFB1YmxpY0NvbnRlbnRQYWdlO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBRdWVzdGlvbkFuc3dlciBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKFwiLmhpZGVVbmJvdW5kXCIpLnJlbW92ZUNsYXNzKFwiaGlkZVVuYm91bmRcIik7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBRdWVzdGlvbkFuc3dlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgUmVkaXJlY3RVcmxSb3V0ZXIgPSByZXF1aXJlKFwiLi9SZWRpcmVjdFVybFJvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIFJlZGlyZWN0VXJsIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJlZGlyZWN0VXJsUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBSZWRpcmVjdFVybDtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgUmVkaXJlY3RVcmxSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gUmVkaXJlY3RVcmxSb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNsYXNzIFNpdGVNYXAge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgLy8gc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gU2l0ZU1hcDtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vLyBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBPcmFuZ2UgT25pb24gU2NhZmZvbGRlci5cclxuLy8gdGVtcGxhdGU6IE1WQy5KU01vZHVsZS5jc1xyXG4vLyBjbGFzczogU3RvcmVFeGNlcHRpb25cclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBTdG9yZUV4Y2VwdGlvblJvdXRlciA9IHJlcXVpcmUoXCIuL1N0b3JlRXhjZXB0aW9uUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgU3RvcmVFeGNlcHRpb24gZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgU3RvcmVFeGNlcHRpb25Sb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JlRXhjZXB0aW9uO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBTdG9yZUV4Y2VwdGlvblJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3ZpZXcvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2luZGV4YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvZGVsZXRlLzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5kZWxldGVJdGVtKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBTdG9yZUV4Y2VwdGlvblJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuLy9pbXBvcnQgVGFibGUgPSByZXF1aXJlKCcuLi9CYXNlL1RhYmxlJyk7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNvbnN0IFN0b3JlVGFibGUgPSByZXF1aXJlKFwiLi9TdG9yZVRhYmxlXCIpO1xyXG5jbGFzcyBTdG9yZSBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIGFwcGx5QmluZGluZ3MgPSB0cnVlLCBmdW5kcmFpc2VyU3RvcmVzID0gZmFsc2UpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFN0b3JlVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnRvZ2dsZUZ1bmRyYWlzZXIgPSAoZGF0YSwgZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcG9zdERhdGEgPSBkYXRhLklkO1xyXG4gICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL0FkbWluL1N0b3JlL1RvZ2dsZUZ1bmRyYWlzZXI/c3RvcmU9JyArIGRhdGEuSWQsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnR0VUJyxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04JyxcclxuICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGE6IHBvc3REYXRhXHJcbiAgICAgICAgICAgIH0pLmRvbmUoKHJlc3BvbnNlZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGFwcGx5QmluZGluZ3MpIHtcclxuICAgICAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmdW5kcmFpc2VyU3RvcmVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0VXJsID0gJy9hcGkvU3RvcmUvR2V0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0VXJsID0gJy9hcGkvU3RvcmUvR2V0QWxsRnVuZHJhaXNlckluY2x1ZGUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JlO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBrb21hcHBpbmcgPSByZXF1aXJlKFwia25vY2tvdXQubWFwcGluZ1wiKTtcclxua28ubWFwcGluZyA9IGtvbWFwcGluZztcclxuY2xhc3MgU3RvcmVUYWJsZSBleHRlbmRzIFRhYmxlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0pO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgLy9zZW5kcyBhamF4IGNhbGwgZm9yIGRhdGEgXHJcbiAgICBsb2FkKCkge1xyXG4gICAgICAgIC8vdGhpcy52bS5mb3JtLmlzRGVsZXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9yZGVyYnkgPSAnTmFtZSc7XHJcbiAgICAgICAgJCgnI2xvYWRpbmcnKS5oZWlnaHQoJCh3aW5kb3cpLmhlaWdodCgpKTtcclxuICAgICAgICB0aGlzLnZtLklzTG9hZGluZyh0cnVlKTtcclxuICAgICAgICAvL2Zvcm1hdCB0aGUgcmVxdWVzdFxyXG4gICAgICAgIHZhciByZXF1ZXN0RGF0YSA9IHtcclxuICAgICAgICAgICAgJGlubGluZWNvdW50OiBcImFsbHBhZ2VzXCIsXHJcbiAgICAgICAgICAgICRvcmRlcmJ5OiB0aGlzLm9yZGVyYnksXHJcbiAgICAgICAgICAgICR0b3A6IHRoaXMudG9wKCksXHJcbiAgICAgICAgICAgICRza2lwOiB0aGlzLnNraXAoKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy9hZGQgaW4gZmlsdGVyc1xyXG4gICAgICAgICQuZXh0ZW5kKHJlcXVlc3REYXRhLCBrby50b0pTKHRoaXMudm0uRmlsdGVycykpO1xyXG4gICAgICAgIC8vbWFrZSB0aGUgcmVxdWVzdFxyXG4gICAgICAgIHZhciByZXNwb25zZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogdGhpcy52bS5HZXRVcmwsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiBcImpzb25cIixcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBkYXRhOiByZXF1ZXN0RGF0YVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vaGFuZGxlIHN1Y2Nlc3NmdWwgcmVzcG9uc2VcclxuICAgICAgICByZXNwb25zZS5kb25lKHJlc3BvbnNlZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFJlc3BvbnNlKHJlc3BvbnNlZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMudm0uSGFzSGF3YWlpTG9jYXRpb25zKHJlc3BvbnNlZGF0YS5IYXNIYXdhaWlMb2NhdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLnZtLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gU3RvcmVUYWJsZTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgU3R5bGVHdWlkZSBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKFwiLmhpZGVVbmJvdW5kXCIpLnJlbW92ZUNsYXNzKFwiaGlkZVVuYm91bmRcIik7XHJcbiAgICAgICAgLy90aGlzLnRhYmxlLmRlZmF1bHRTb3J0ID0gXCJcIlxyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gU3R5bGVHdWlkZTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgUGFnZUJhc2UgPSByZXF1aXJlKFwiLi4vQ29udGVudFBhZ2UvQ29udGVudFBhZ2VCYXNlXCIpO1xyXG5jb25zdCBTeXN0ZW1Db250ZW50UGFnZUZvcm0gPSByZXF1aXJlKFwiLi9TeXN0ZW1Db250ZW50UGFnZUZvcm1cIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IENvbnRlbnRQYWdlUm91dGVyID0gcmVxdWlyZShcIi4uL0NvbnRlbnRQYWdlL0NvbnRlbnRQYWdlUm91dGVyXCIpO1xyXG5jbGFzcyBTeXN0ZW1Db250ZW50UGFnZSBleHRlbmRzIFBhZ2VCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCBTeXN0ZW1Db250ZW50UGFnZUZvcm0sIFRhYmxlLCBDb250ZW50UGFnZVJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gU3lzdGVtQ29udGVudFBhZ2U7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBQYWdlRm9ybSA9IHJlcXVpcmUoXCIuLi9Db250ZW50UGFnZS9Db250ZW50UGFnZUZvcm1cIik7XHJcbmNsYXNzIFN5c3RlbUNvbnRlbnRQYWdlRm9ybSBleHRlbmRzIFBhZ2VGb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0pO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgICAgIHRoaXMuYWRkSXRlbURldGFpbENsaWVudE9ubHlQcm9wZXJ0aWVzKCk7XHJcbiAgICB9XHJcbiAgICAvL2FkZC1jb250ZW50YmxvY2tcclxuICAgIHNldHVwQmluZGlncygpIHtcclxuICAgICAgICBzdXBlci5zZXR1cEJpbmRpZ3MoKTtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdmFyIG1vZGVsSG9sZGVyU2VsZWN0b3IgPSAkKCcubW9kYWxmb3JtLWhvbGRlcicpO1xyXG4gICAgICAgIC8vQWRkaW5nXHJcbiAgICAgICAgbW9kZWxIb2xkZXJTZWxlY3Rvci5vbignY2xpY2snLCAnLmFkZC1jb250ZW50YmxvY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHZhciByb3cgPSBzZWxmLnZtLk5ld0NvbnRlbnRCbG9jaztcclxuICAgICAgICAgICAgdmFyIHJvd0NvcHkgPSBrby5tYXBwaW5nLmZyb21KUyhrby50b0pTKHJvdykpO1xyXG4gICAgICAgICAgICAvLyBzZWxmLmFkZFNvcnRlZENlbGxzKHJvd0NvcHkpO1xyXG4gICAgICAgICAgICBkYXRhLkNvbnRlbnRCbG9ja3MucHVzaChyb3dDb3B5KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFN5c3RlbUNvbnRlbnRQYWdlRm9ybTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgVXNlckxvY2F0aW9uIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoXCIuaGlkZVVuYm91bmRcIikucmVtb3ZlQ2xhc3MoXCJoaWRlVW5ib3VuZFwiKTtcclxuICAgICAgICAvL3RoaXMudGFibGUuZGVmYXVsdFNvcnQgPSBcIlwiXHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBVc2VyTG9jYXRpb247XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFVzZXJSb3V0ZXIgPSByZXF1aXJlKFwiLi9Vc2VyUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgVXNlciBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBVc2VyUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJChcIi5oaWRlVW5ib3VuZFwiKS5yZW1vdmVDbGFzcyhcImhpZGVVbmJvdW5kXCIpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gVXNlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgVXNlclJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3ZpZXcvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2luZGV4YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvZGVsZXRlLzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5kZWxldGVJdGVtKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBVc2VyUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuLy8vIFRoaXMgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IE9yYW5nZSBPbmlvbiBTY2FmZm9sZGVyLlxyXG4vLyB0ZW1wbGF0ZTogTVZDLkpTTW9kdWxlLmNzXHJcbi8vIGNsYXNzOiBWZW5kb3JcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBWZW5kb3IgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBWZW5kb3I7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIFZpc2l0b3JTY2hlZHVsZWRNZWV0aW5nIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZS12aXNpdG9yJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuZm9ybS5wb3N0KCk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi9sdW5hci1uZXcteWVhci9zY2hlZHVsZS1hLXZpc2l0L1RoYW5rWW91XCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFZpc2l0b3JTY2hlZHVsZWRNZWV0aW5nO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jb25zdCBZZWxwUmV2aWV3VGFibGUgPSByZXF1aXJlKFwiLi9ZZWxwUmV2aWV3VGFibGVcIik7XHJcbmNvbnN0IF8gPSByZXF1aXJlKFwidW5kZXJzY29yZVwiKTtcclxuY2xhc3MgWWVscFJldmlldyBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFllbHBSZXZpZXdUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbiAgICBjbGVhckZpbHRlcnMoKSB7XHJcbiAgICAgICAgXy5lYWNoKHRoaXMuRmlsdGVycywgKHYpID0+IHtcclxuICAgICAgICAgICAgdignJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBZZWxwUmV2aWV3O1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGtvbWFwcGluZyA9IHJlcXVpcmUoXCJrbm9ja291dC5tYXBwaW5nXCIpO1xyXG5rby5tYXBwaW5nID0ga29tYXBwaW5nO1xyXG5jbGFzcyBZZWxwUmV2aWV3VGFibGUgZXh0ZW5kcyBUYWJsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSkge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFllbHBSZXZpZXdUYWJsZTtcclxuIiwiKGZ1bmN0aW9uIChnbG9iYWwpe1xuXG47IGpRdWVyeSA9IGdsb2JhbC5qUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuOyB2YXIgX19icm93c2VyaWZ5X3NoaW1fcmVxdWlyZV9fPXJlcXVpcmU7KGZ1bmN0aW9uIGJyb3dzZXJpZnlTaGltKG1vZHVsZSwgZGVmaW5lLCByZXF1aXJlKSB7XG7vu78vKipcclxuKiBMb2FkaW5nIHBsdWdpbiBmb3IgalF1ZXJ5XHJcbiogdmVyc2lvbjogdjEuMC42XHJcbiogXHJcbiogU21hbGwgaGVscGVyIHRvIGdpdmUgdGhlIHVzZXIgYSB2aXN1YWwgZmVlZGJhY2sgdGhhdCBzb21ldGhpbmcgaXMgaGFwcGVuaW5nIFxyXG4qIHdoZW4gZmV0Y2hpbmcvcG9zdGluZyBkYXRhXHJcbiogXHJcbiogVVNBR0U6XHJcbiogLSBnbG9iYWwgb3ZlcmxheTogICAgICAgICAgICAgICAgICAgICAkLmlzTG9hZGluZygpO1xyXG4qIC0gdXNlIGphdmFzY3JpcHQ6ICAgICAgICAgICAgICAgICAgICAgJCggc2VsZWN0b3IgKS5pc0xvYWRpbmcoKTtcclxuKiAtIE9uIG5vbi1mb3JtIGVsZW1lbnRzOiAgICAgICAgICAgICAgICQoXCJkaXZcIikuaXNMb2FkaW5nKHsgdGV4dDogXCJMb2FkaW5nXCIsIHBvc2l0aW9uOidpbnNpZGUnfSk7XHJcbiogLSByZW1vdmUgdGhlIGxvYWRpbmcgZWxlbWVudDogICAgICAgICAkKCBzZWxlY3RvciApLmlzTG9hZGluZyggXCJoaWRlXCIgKTtcclxuKlxyXG4qIEBhdXRob3IgTGF1cmVudCBCbGFuZXMgPGxhdXJlbnQuYmxhbmVzQGdtYWlsLmNvbT5cclxuKiAtLS1cclxuKiBDb3B5cmlnaHQgMjAxMywgTGF1cmVudCBCbGFuZXMgKCBodHRwczovL2dpdGh1Yi5jb20vaGVraWdhbi9pcy1sb2FkaW5nIClcclxuKiBcclxuKiBUaGUgTUlUIExpY2Vuc2UgKE1JVClcclxuKiBcclxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgTGF1cmVudCBCbGFuZXNcclxuKiBcclxuKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxyXG4qIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXHJcbiogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuKiBcclxuKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxyXG4qIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4qIFxyXG4qIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcclxuKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcclxuKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXHJcbiogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXHJcbiogVEhFIFNPRlRXQVJFLlxyXG4qL1xyXG47IChmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgLy8gQ3JlYXRlIHRoZSBkZWZhdWx0cyBvbmNlXHJcbiAgICB2YXIgcGx1Z2luTmFtZSA9IFwiaXNMb2FkaW5nXCIsXHJcbiAgICAgICAgZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgICAgICdwb3NpdGlvbic6IFwicmlnaHRcIiwgICAgICAgIC8vIHJpZ2h0IHwgaW5zaWRlIHwgb3ZlcmxheVxyXG4gICAgICAgICAgICAndGV4dCc6IFwiXCIsICAgICAgICAgICAgICAgICAvLyBUZXh0IHRvIGRpc3BsYXkgbmV4dCB0byB0aGUgbG9hZGVyXHJcbiAgICAgICAgICAgICdjbGFzcyc6IFwiaWNvbi1yZWZyZXNoXCIsICAgIC8vIGxvYWRlciBDU1MgY2xhc3NcclxuICAgICAgICAgICAgJ3RwbCc6ICc8c3BhbiBjbGFzcz1cImlzbG9hZGluZy13cmFwcGVyICV3cmFwcGVyJVwiPiV0ZXh0JTxpIGNsYXNzPVwiJWNsYXNzJSBpY29uLXNwaW5cIj48L2k+PC9zcGFuPicsICAgIC8vIGxvYWRlciBiYXNlIFRhZ1xyXG4gICAgICAgICAgICAnZGlzYWJsZVNvdXJjZSc6IHRydWUsICAgICAgLy8gdHJ1ZSB8IGZhbHNlXHJcbiAgICAgICAgICAgICdkaXNhYmxlT3RoZXJzJzogW11cclxuICAgICAgICB9O1xyXG5cclxuICAgIC8vIFRoZSBhY3R1YWwgcGx1Z2luIGNvbnN0cnVjdG9yXHJcbiAgICBmdW5jdGlvbiBQbHVnaW4oZWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIE1lcmdlIHVzZXIgb3B0aW9ucyB3aXRoIGRlZmF1bHQgb25lc1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RlZmF1bHRzID0gZGVmYXVsdHM7XHJcbiAgICAgICAgdGhpcy5fbmFtZSA9IHBsdWdpbk5hbWU7XHJcbiAgICAgICAgdGhpcy5fbG9hZGVyID0gbnVsbDsgICAgICAgICAgICAgICAgLy8gQ29udGFpbiB0aGUgbG9hZGluZyB0YWcgZWxlbWVudFxyXG5cclxuICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb250cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGUgcGx1Z2luIChvbmx5IG9uY2Ugb24gcGFnZSBsb2FkKVxyXG4gICAgZnVuY3Rpb24gY29udHJ1Y3QoKSB7XHJcblxyXG4gICAgICAgIGlmICghJFtwbHVnaW5OYW1lXSkge1xyXG4gICAgICAgICAgICAkLmlzTG9hZGluZyA9IGZ1bmN0aW9uIChvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiYm9keVwiKS5pc0xvYWRpbmcob3B0cyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFBsdWdpbi5wcm90b3R5cGUgPSB7XHJcblxyXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICgkKHRoaXMuZWxlbWVudCkuaXMoXCJib2R5XCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSBcIm92ZXJsYXlcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzaG93OiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICB0cGwgPSBzZWxmLm9wdGlvbnMudHBsLnJlcGxhY2UoJyV3cmFwcGVyJScsICcgaXNsb2FkaW5nLXNob3cgJyArICcgaXNsb2FkaW5nLScgKyBzZWxmLm9wdGlvbnMucG9zaXRpb24pO1xyXG4gICAgICAgICAgICB0cGwgPSB0cGwucmVwbGFjZSgnJWNsYXNzJScsIHNlbGYub3B0aW9uc1snY2xhc3MnXSk7XHJcbiAgICAgICAgICAgIHRwbCA9IHRwbC5yZXBsYWNlKCcldGV4dCUnLCAoc2VsZi5vcHRpb25zLnRleHQgIT09IFwiXCIpID8gc2VsZi5vcHRpb25zLnRleHQgKyAnICcgOiAnJyk7XHJcbiAgICAgICAgICAgIHNlbGYuX2xvYWRlciA9ICQodHBsKTtcclxuXHJcbiAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGVsZW1lbnRcclxuICAgICAgICAgICAgaWYgKCQoc2VsZi5lbGVtZW50KS5pcyhcImlucHV0LCB0ZXh0YXJlYVwiKSAmJiB0cnVlID09PSBzZWxmLm9wdGlvbnMuZGlzYWJsZVNvdXJjZSkge1xyXG5cclxuICAgICAgICAgICAgICAgICQoc2VsZi5lbGVtZW50KS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodHJ1ZSA9PT0gc2VsZi5vcHRpb25zLmRpc2FibGVTb3VyY2UpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAkKHNlbGYuZWxlbWVudCkuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNldCBwb3NpdGlvblxyXG4gICAgICAgICAgICBzd2l0Y2ggKHNlbGYub3B0aW9ucy5wb3NpdGlvbikge1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgXCJpbnNpZGVcIjpcclxuICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZWxlbWVudCkuaHRtbChzZWxmLl9sb2FkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgXCJvdmVybGF5XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyICR3cmFwcGVyVHBsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCQoc2VsZi5lbGVtZW50KS5pcyhcImJvZHlcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHdyYXBwZXJUcGwgPSAkKCc8ZGl2IGNsYXNzPVwiaXNsb2FkaW5nLW92ZXJsYXlcIiBzdHlsZT1cInBvc2l0aW9uOmZpeGVkOyBsZWZ0OjA7IHRvcDowOyB6LWluZGV4OiAxMDAwMDsgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjUpOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAnICsgJCh3aW5kb3cpLmhlaWdodCgpICsgJ3B4O1wiIC8+Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoXCJib2R5XCIpLnByZXBlbmQoJHdyYXBwZXJUcGwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd3JhcHBlclRwbC5oZWlnaHQoJCh3aW5kb3cpLmhlaWdodCgpICsgJ3B4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2FkZXIuY3NzKHsgdG9wOiAoJCh3aW5kb3cpLmhlaWdodCgpIC8gMiAtIHNlbGYuX2xvYWRlci5vdXRlckhlaWdodCgpIC8gMikgKyAncHgnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3NzUG9zaXRpb24gPSAkKHNlbGYuZWxlbWVudCkuY3NzKCdwb3NpdGlvbicpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0ge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAkKHNlbGYuZWxlbWVudCkub3V0ZXJIZWlnaHQoKSArICdweCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9ICcxMDAlJzsgLy8gJCggc2VsZi5lbGVtZW50ICkub3V0ZXJXaWR0aCgpICsgJ3B4O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdyZWxhdGl2ZScgPT09IGNzc1Bvc2l0aW9uIHx8ICdhYnNvbHV0ZScgPT09IGNzc1Bvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSB7ICd0b3AnOiAwLCAnbGVmdCc6IDAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9ICQoc2VsZi5lbGVtZW50KS5wb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR3cmFwcGVyVHBsID0gJCgnPGRpdiBjbGFzcz1cImlzbG9hZGluZy1vdmVybGF5XCIgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOiAnICsgcG9zLnRvcCArICdweDsgbGVmdDogJyArIHBvcy5sZWZ0ICsgJ3B4OyB6LWluZGV4OiAxMDAwMDsgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjUpOyB3aWR0aDogJyArIHdpZHRoICsgJzsgaGVpZ2h0OiAnICsgaGVpZ2h0ICsgJztcIiAvPicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZWxlbWVudCkucHJlcGVuZCgkd3JhcHBlclRwbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3cmFwcGVyVHBsLmhlaWdodCgkKHNlbGYuZWxlbWVudCkub3V0ZXJIZWlnaHQoKSArICdweCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9hZGVyLmNzcyh7IHRvcDogKCR3cmFwcGVyVHBsLm91dGVySGVpZ2h0KCkgLyAyIC0gc2VsZi5fbG9hZGVyLm91dGVySGVpZ2h0KCkgLyAyKSArICdweCcgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJHdyYXBwZXJUcGwuaHRtbChzZWxmLl9sb2FkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRlci5jc3MoeyB0b3A6ICgkd3JhcHBlclRwbC5vdXRlckhlaWdodCgpIC8gMiAtIHNlbGYuX2xvYWRlci5vdXRlckhlaWdodCgpIC8gMikgKyAncHgnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmVsZW1lbnQpLmFmdGVyKHNlbGYuX2xvYWRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNlbGYuZGlzYWJsZU90aGVycygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGhpZGU6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChcIm92ZXJsYXlcIiA9PT0gdGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmVsZW1lbnQpLmZpbmQoXCIuaXNsb2FkaW5nLW92ZXJsYXlcIikuZmlyc3QoKS5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgJCh0aGlzLl9sb2FkZXIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmVsZW1lbnQpLnRleHQoJCh0aGlzLmVsZW1lbnQpLmF0dHIoXCJkYXRhLWlzbG9hZGluZy1sYWJlbFwiKSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAkKHRoaXMuZWxlbWVudCkucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZU90aGVycygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGRpc2FibGVPdGhlcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucy5kaXNhYmxlT3RoZXJzLCBmdW5jdGlvbiAoaSwgZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVsdCA9ICQoZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWx0LmlzKFwiYnV0dG9uLCBpbnB1dCwgdGV4dGFyZWFcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbHQuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlbHQuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgZW5hYmxlT3RoZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZGlzYWJsZU90aGVycywgZnVuY3Rpb24gKGksIGUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlbHQgPSAkKGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsdC5pcyhcImJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWx0LnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsdC5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENvbnN0cnVjdG9yXHJcbiAgICAkLmZuW3BsdWdpbk5hbWVdID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiYgXCJoaWRlXCIgIT09IG9wdGlvbnMgfHwgISQuZGF0YSh0aGlzLCBcInBsdWdpbl9cIiArIHBsdWdpbk5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAkLmRhdGEodGhpcywgXCJwbHVnaW5fXCIgKyBwbHVnaW5OYW1lLCBuZXcgUGx1Z2luKHRoaXMsIG9wdGlvbnMpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciBlbHQgPSAkLmRhdGEodGhpcywgXCJwbHVnaW5fXCIgKyBwbHVnaW5OYW1lKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoXCJoaWRlXCIgPT09IG9wdGlvbnMpIHsgZWx0LmhpZGUoKTsgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7IGVsdC5zaG93KCk7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb250cnVjdCgpO1xyXG5cclxufSkoalF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KTtcbn0pLmNhbGwoZ2xvYmFsLCBtb2R1bGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbE5qY21sd2RITXZiR2xpTDJweGRXVnllUzVwYzJ4dllXUnBibWN1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEVpTENKbWFXeGxJam9pWjJWdVpYSmhkR1ZrTG1weklpd2ljMjkxY21ObFVtOXZkQ0k2SWlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklseHVPeUJxVVhWbGNua2dQU0JuYkc5aVlXd3VhbEYxWlhKNUlEMGdjbVZ4ZFdseVpTaGNJbXB4ZFdWeWVWd2lLVHRjYmpzZ2RtRnlJRjlmWW5KdmQzTmxjbWxtZVY5emFHbHRYM0psY1hWcGNtVmZYejF5WlhGMWFYSmxPeWhtZFc1amRHbHZiaUJpY205M2MyVnlhV1o1VTJocGJTaHRiMlIxYkdVc0lHUmxabWx1WlN3Z2NtVnhkV2x5WlNrZ2UxeHU3N3UvTHlvcVhISmNiaW9nVEc5aFpHbHVaeUJ3YkhWbmFXNGdabTl5SUdwUmRXVnllVnh5WEc0cUlIWmxjbk5wYjI0NklIWXhMakF1Tmx4eVhHNHFJRnh5WEc0cUlGTnRZV3hzSUdobGJIQmxjaUIwYnlCbmFYWmxJSFJvWlNCMWMyVnlJR0VnZG1semRXRnNJR1psWldSaVlXTnJJSFJvWVhRZ2MyOXRaWFJvYVc1bklHbHpJR2hoY0hCbGJtbHVaeUJjY2x4dUtpQjNhR1Z1SUdabGRHTm9hVzVuTDNCdmMzUnBibWNnWkdGMFlWeHlYRzRxSUZ4eVhHNHFJRlZUUVVkRk9seHlYRzRxSUMwZ1oyeHZZbUZzSUc5MlpYSnNZWGs2SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pDNXBjMHh2WVdScGJtY29LVHRjY2x4dUtpQXRJSFZ6WlNCcVlYWmhjMk55YVhCME9pQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1FvSUhObGJHVmpkRzl5SUNrdWFYTk1iMkZrYVc1bktDazdYSEpjYmlvZ0xTQlBiaUJ1YjI0dFptOXliU0JsYkdWdFpXNTBjem9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWtLRndpWkdsMlhDSXBMbWx6VEc5aFpHbHVaeWg3SUhSbGVIUTZJRndpVEc5aFpHbHVaMXdpTENCd2IzTnBkR2x2YmpvbmFXNXphV1JsSjMwcE8xeHlYRzRxSUMwZ2NtVnRiM1psSUhSb1pTQnNiMkZrYVc1bklHVnNaVzFsYm5RNklDQWdJQ0FnSUNBZ0pDZ2djMlZzWldOMGIzSWdLUzVwYzB4dllXUnBibWNvSUZ3aWFHbGtaVndpSUNrN1hISmNiaXBjY2x4dUtpQkFZWFYwYUc5eUlFeGhkWEpsYm5RZ1FteGhibVZ6SUR4c1lYVnlaVzUwTG1Kc1lXNWxjMEJuYldGcGJDNWpiMjArWEhKY2Jpb2dMUzB0WEhKY2Jpb2dRMjl3ZVhKcFoyaDBJREl3TVRNc0lFeGhkWEpsYm5RZ1FteGhibVZ6SUNnZ2FIUjBjSE02THk5bmFYUm9kV0l1WTI5dEwyaGxhMmxuWVc0dmFYTXRiRzloWkdsdVp5QXBYSEpjYmlvZ1hISmNiaW9nVkdobElFMUpWQ0JNYVdObGJuTmxJQ2hOU1ZRcFhISmNiaW9nWEhKY2Jpb2dRMjl3ZVhKcFoyaDBJQ2hqS1NBeU1ERXpJRXhoZFhKbGJuUWdRbXhoYm1WelhISmNiaW9nWEhKY2Jpb2dVR1Z5YldsemMybHZiaUJwY3lCb1pYSmxZbmtnWjNKaGJuUmxaQ3dnWm5KbFpTQnZaaUJqYUdGeVoyVXNJSFJ2SUdGdWVTQndaWEp6YjI0Z2IySjBZV2x1YVc1bklHRWdZMjl3ZVZ4eVhHNHFJRzltSUhSb2FYTWdjMjltZEhkaGNtVWdZVzVrSUdGemMyOWphV0YwWldRZ1pHOWpkVzFsYm5SaGRHbHZiaUJtYVd4bGN5QW9kR2hsSUZ3aVUyOW1kSGRoY21WY0lpa3NJSFJ2SUdSbFlXeGNjbHh1S2lCcGJpQjBhR1VnVTI5bWRIZGhjbVVnZDJsMGFHOTFkQ0J5WlhOMGNtbGpkR2x2Yml3Z2FXNWpiSFZrYVc1bklIZHBkR2h2ZFhRZ2JHbHRhWFJoZEdsdmJpQjBhR1VnY21sbmFIUnpYSEpjYmlvZ2RHOGdkWE5sTENCamIzQjVMQ0J0YjJScFpua3NJRzFsY21kbExDQndkV0pzYVhOb0xDQmthWE4wY21saWRYUmxMQ0J6ZFdKc2FXTmxibk5sTENCaGJtUXZiM0lnYzJWc2JGeHlYRzRxSUdOdmNHbGxjeUJ2WmlCMGFHVWdVMjltZEhkaGNtVXNJR0Z1WkNCMGJ5QndaWEp0YVhRZ2NHVnljMjl1Y3lCMGJ5QjNhRzl0SUhSb1pTQlRiMlowZDJGeVpTQnBjMXh5WEc0cUlHWjFjbTVwYzJobFpDQjBieUJrYnlCemJ5d2djM1ZpYW1WamRDQjBieUIwYUdVZ1ptOXNiRzkzYVc1bklHTnZibVJwZEdsdmJuTTZYSEpjYmlvZ1hISmNiaW9nVkdobElHRmliM1psSUdOdmNIbHlhV2RvZENCdWIzUnBZMlVnWVc1a0lIUm9hWE1nY0dWeWJXbHpjMmx2YmlCdWIzUnBZMlVnYzJoaGJHd2dZbVVnYVc1amJIVmtaV1FnYVc1Y2NseHVLaUJoYkd3Z1kyOXdhV1Z6SUc5eUlITjFZbk4wWVc1MGFXRnNJSEJ2Y25ScGIyNXpJRzltSUhSb1pTQlRiMlowZDJGeVpTNWNjbHh1S2lCY2NseHVLaUJVU0VVZ1UwOUdWRmRCVWtVZ1NWTWdVRkpQVmtsRVJVUWdYQ0pCVXlCSlUxd2lMQ0JYU1ZSSVQxVlVJRmRCVWxKQlRsUlpJRTlHSUVGT1dTQkxTVTVFTENCRldGQlNSVk5USUU5U1hISmNiaW9nU1UxUVRFbEZSQ3dnU1U1RFRGVkVTVTVISUVKVlZDQk9UMVFnVEVsTlNWUkZSQ0JVVHlCVVNFVWdWMEZTVWtGT1ZFbEZVeUJQUmlCTlJWSkRTRUZPVkVGQ1NVeEpWRmtzWEhKY2Jpb2dSa2xVVGtWVFV5QkdUMUlnUVNCUVFWSlVTVU5WVEVGU0lGQlZVbEJQVTBVZ1FVNUVJRTVQVGtsT1JsSkpUa2RGVFVWT1ZDNGdTVTRnVGs4Z1JWWkZUbFFnVTBoQlRFd2dWRWhGWEhKY2Jpb2dRVlZVU0U5U1V5QlBVaUJEVDFCWlVrbEhTRlFnU0U5TVJFVlNVeUJDUlNCTVNVRkNURVVnUms5U0lFRk9XU0JEVEVGSlRTd2dSRUZOUVVkRlV5QlBVaUJQVkVoRlVseHlYRzRxSUV4SlFVSkpURWxVV1N3Z1YwaEZWRWhGVWlCSlRpQkJUaUJCUTFSSlQwNGdUMFlnUTA5T1ZGSkJRMVFzSUZSUFVsUWdUMUlnVDFSSVJWSlhTVk5GTENCQlVrbFRTVTVISUVaU1QwMHNYSEpjYmlvZ1QxVlVJRTlHSUU5U0lFbE9JRU5QVGs1RlExUkpUMDRnVjBsVVNDQlVTRVVnVTA5R1ZGZEJVa1VnVDFJZ1ZFaEZJRlZUUlNCUFVpQlBWRWhGVWlCRVJVRk1TVTVIVXlCSlRseHlYRzRxSUZSSVJTQlRUMFpVVjBGU1JTNWNjbHh1S2k5Y2NseHVPeUFvWm5WdVkzUnBiMjRnS0NRc0lIZHBibVJ2ZHl3Z1pHOWpkVzFsYm5Rc0lIVnVaR1ZtYVc1bFpDa2dlMXh5WEc1Y2NseHVJQ0FnSUM4dklFTnlaV0YwWlNCMGFHVWdaR1ZtWVhWc2RITWdiMjVqWlZ4eVhHNGdJQ0FnZG1GeUlIQnNkV2RwYms1aGJXVWdQU0JjSW1selRHOWhaR2x1WjF3aUxGeHlYRzRnSUNBZ0lDQWdJR1JsWm1GMWJIUnpJRDBnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FuY0c5emFYUnBiMjRuT2lCY0luSnBaMmgwWENJc0lDQWdJQ0FnSUNBdkx5QnlhV2RvZENCOElHbHVjMmxrWlNCOElHOTJaWEpzWVhsY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSjNSbGVIUW5PaUJjSWx3aUxDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdWR1Y0ZENCMGJ5QmthWE53YkdGNUlHNWxlSFFnZEc4Z2RHaGxJR3h2WVdSbGNseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBblkyeGhjM01uT2lCY0ltbGpiMjR0Y21WbWNtVnphRndpTENBZ0lDQXZMeUJzYjJGa1pYSWdRMU5USUdOc1lYTnpYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDZDBjR3duT2lBblBITndZVzRnWTJ4aGMzTTlYQ0pwYzJ4dllXUnBibWN0ZDNKaGNIQmxjaUFsZDNKaGNIQmxjaVZjSWo0bGRHVjRkQ1U4YVNCamJHRnpjejFjSWlWamJHRnpjeVVnYVdOdmJpMXpjR2x1WENJK1BDOXBQand2YzNCaGJqNG5MQ0FnSUNBdkx5QnNiMkZrWlhJZ1ltRnpaU0JVWVdkY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSjJScGMyRmliR1ZUYjNWeVkyVW5PaUIwY25WbExDQWdJQ0FnSUM4dklIUnlkV1VnZkNCbVlXeHpaVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQW5aR2x6WVdKc1pVOTBhR1Z5Y3ljNklGdGRYSEpjYmlBZ0lDQWdJQ0FnZlR0Y2NseHVYSEpjYmlBZ0lDQXZMeUJVYUdVZ1lXTjBkV0ZzSUhCc2RXZHBiaUJqYjI1emRISjFZM1J2Y2x4eVhHNGdJQ0FnWm5WdVkzUnBiMjRnVUd4MVoybHVLR1ZzWlcxbGJuUXNJRzl3ZEdsdmJuTXBJSHRjY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbVZzWlcxbGJuUWdQU0JsYkdWdFpXNTBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJOWlhKblpTQjFjMlZ5SUc5d2RHbHZibk1nZDJsMGFDQmtaV1poZFd4MElHOXVaWE5jY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbTl3ZEdsdmJuTWdQU0FrTG1WNGRHVnVaQ2g3ZlN3Z1pHVm1ZWFZzZEhNc0lHOXdkR2x2Ym5NcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbDlrWldaaGRXeDBjeUE5SUdSbFptRjFiSFJ6TzF4eVhHNGdJQ0FnSUNBZ0lIUm9hWE11WDI1aGJXVWdQU0J3YkhWbmFXNU9ZVzFsTzF4eVhHNGdJQ0FnSUNBZ0lIUm9hWE11WDJ4dllXUmxjaUE5SUc1MWJHdzdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJRU52Ym5SaGFXNGdkR2hsSUd4dllXUnBibWNnZEdGbklHVnNaVzFsYm5SY2NseHVYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NXBibWwwS0NrN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdMeThnUTI5dWRISjFZM1J2Y2lCbWRXNWpkR2x2YmlCbWIzSWdkR2hsSUhCc2RXZHBiaUFvYjI1c2VTQnZibU5sSUc5dUlIQmhaMlVnYkc5aFpDbGNjbHh1SUNBZ0lHWjFibU4wYVc5dUlHTnZiblJ5ZFdOMEtDa2dlMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQnBaaUFvSVNSYmNHeDFaMmx1VG1GdFpWMHBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdKQzVwYzB4dllXUnBibWNnUFNCbWRXNWpkR2x2YmlBb2IzQjBjeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pDaGNJbUp2WkhsY0lpa3VhWE5NYjJGa2FXNW5LRzl3ZEhNcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOU8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNCUWJIVm5hVzR1Y0hKdmRHOTBlWEJsSUQwZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNCcGJtbDBPaUJtZFc1amRHbHZiaUFvS1NCN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSkNoMGFHbHpMbVZzWlcxbGJuUXBMbWx6S0Z3aVltOWtlVndpS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmNIUnBiMjV6TG5CdmMybDBhVzl1SUQwZ1hDSnZkbVZ5YkdGNVhDSTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6YUc5M0tDazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnYzJodmR6b2dablZ1WTNScGIyNGdLQ2tnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSE5sYkdZZ1BTQjBhR2x6TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RIQnNJRDBnYzJWc1ppNXZjSFJwYjI1ekxuUndiQzV5WlhCc1lXTmxLQ2NsZDNKaGNIQmxjaVVuTENBbklHbHpiRzloWkdsdVp5MXphRzkzSUNjZ0t5QW5JR2x6Ykc5aFpHbHVaeTBuSUNzZ2MyVnNaaTV2Y0hScGIyNXpMbkJ2YzJsMGFXOXVLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkSEJzSUQwZ2RIQnNMbkpsY0d4aFkyVW9KeVZqYkdGemN5VW5MQ0J6Wld4bUxtOXdkR2x2Ym5OYkoyTnNZWE56SjEwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGNHd2dQU0IwY0d3dWNtVndiR0ZqWlNnbkpYUmxlSFFsSnl3Z0tITmxiR1l1YjNCMGFXOXVjeTUwWlhoMElDRTlQU0JjSWx3aUtTQS9JSE5sYkdZdWIzQjBhVzl1Y3k1MFpYaDBJQ3NnSnlBbklEb2dKeWNwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J6Wld4bUxsOXNiMkZrWlhJZ1BTQWtLSFJ3YkNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJFYVhOaFlteGxJSFJvWlNCbGJHVnRaVzUwWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNna0tITmxiR1l1Wld4bGJXVnVkQ2t1YVhNb1hDSnBibkIxZEN3Z2RHVjRkR0Z5WldGY0lpa2dKaVlnZEhKMVpTQTlQVDBnYzJWc1ppNXZjSFJwYjI1ekxtUnBjMkZpYkdWVGIzVnlZMlVwSUh0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FrS0hObGJHWXVaV3hsYldWdWRDa3VZWFIwY2loY0ltUnBjMkZpYkdWa1hDSXNJRndpWkdsellXSnNaV1JjSWlrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHVnNjMlVnYVdZZ0tIUnlkV1VnUFQwOUlITmxiR1l1YjNCMGFXOXVjeTVrYVhOaFlteGxVMjkxY21ObEtTQjdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pDaHpaV3htTG1Wc1pXMWxiblFwTG1Ga1pFTnNZWE56S0Z3aVpHbHpZV0pzWldSY0lpazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QlRaWFFnY0c5emFYUnBiMjVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjM2RwZEdOb0lDaHpaV3htTG05d2RHbHZibk11Y0c5emFYUnBiMjRwSUh0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVhObElGd2lhVzV6YVdSbFhDSTZYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pDaHpaV3htTG1Wc1pXMWxiblFwTG1oMGJXd29jMlZzWmk1ZmJHOWhaR1Z5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCallYTmxJRndpYjNabGNteGhlVndpT2x4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lBa2QzSmhjSEJsY2xSd2JDQTlJRzUxYkd3N1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2drS0hObGJHWXVaV3hsYldWdWRDa3VhWE1vWENKaWIyUjVYQ0lwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDUjNjbUZ3Y0dWeVZIQnNJRDBnSkNnblBHUnBkaUJqYkdGemN6MWNJbWx6Ykc5aFpHbHVaeTF2ZG1WeWJHRjVYQ0lnYzNSNWJHVTlYQ0p3YjNOcGRHbHZianBtYVhobFpEc2diR1ZtZERvd095QjBiM0E2TURzZ2VpMXBibVJsZURvZ01UQXdNREE3SUdKaFkydG5jbTkxYm1RNklISm5ZbUVvTUN3d0xEQXNNQzQxS1RzZ2QybGtkR2c2SURFd01DVTdJR2hsYVdkb2REb2dKeUFySUNRb2QybHVaRzkzS1M1b1pXbG5hSFFvS1NBcklDZHdlRHRjSWlBdlBpY3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FrS0Z3aVltOWtlVndpS1M1d2NtVndaVzVrS0NSM2NtRndjR1Z5VkhCc0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNRb2QybHVaRzkzS1M1dmJpZ25jbVZ6YVhwbEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKSGR5WVhCd1pYSlVjR3d1YUdWcFoyaDBLQ1FvZDJsdVpHOTNLUzVvWldsbmFIUW9LU0FySUNkd2VDY3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaaTVmYkc5aFpHVnlMbU56Y3loN0lIUnZjRG9nS0NRb2QybHVaRzkzS1M1b1pXbG5hSFFvS1NBdklESWdMU0J6Wld4bUxsOXNiMkZrWlhJdWIzVjBaWEpJWldsbmFIUW9LU0F2SURJcElDc2dKM0I0SnlCOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdOemMxQnZjMmwwYVc5dUlEMGdKQ2h6Wld4bUxtVnNaVzFsYm5RcExtTnpjeWduY0c5emFYUnBiMjRuS1N4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJ2Y3lBOUlIdDlMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FHVnBaMmgwSUQwZ0pDaHpaV3htTG1Wc1pXMWxiblFwTG05MWRHVnlTR1ZwWjJoMEtDa2dLeUFuY0hnbkxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZDJsa2RHZ2dQU0FuTVRBd0pTYzdJQzh2SUNRb0lITmxiR1l1Wld4bGJXVnVkQ0FwTG05MWRHVnlWMmxrZEdnb0tTQXJJQ2R3ZUR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnbmNtVnNZWFJwZG1VbklEMDlQU0JqYzNOUWIzTnBkR2x2YmlCOGZDQW5ZV0p6YjJ4MWRHVW5JRDA5UFNCamMzTlFiM05wZEdsdmJpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NHOXpJRDBnZXlBbmRHOXdKem9nTUN3Z0oyeGxablFuT2lBd0lIMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd2IzTWdQU0FrS0hObGJHWXVaV3hsYldWdWRDa3VjRzl6YVhScGIyNG9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBa2QzSmhjSEJsY2xSd2JDQTlJQ1FvSnp4a2FYWWdZMnhoYzNNOVhDSnBjMnh2WVdScGJtY3RiM1psY214aGVWd2lJSE4wZVd4bFBWd2ljRzl6YVhScGIyNDZZV0p6YjJ4MWRHVTdJSFJ2Y0RvZ0p5QXJJSEJ2Y3k1MGIzQWdLeUFuY0hnN0lHeGxablE2SUNjZ0t5QndiM011YkdWbWRDQXJJQ2R3ZURzZ2VpMXBibVJsZURvZ01UQXdNREE3SUdKaFkydG5jbTkxYm1RNklISm5ZbUVvTUN3d0xEQXNNQzQxS1RzZ2QybGtkR2c2SUNjZ0t5QjNhV1IwYUNBcklDYzdJR2hsYVdkb2REb2dKeUFySUdobGFXZG9kQ0FySUNjN1hDSWdMejRuS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pDaHpaV3htTG1Wc1pXMWxiblFwTG5CeVpYQmxibVFvSkhkeVlYQndaWEpVY0d3cE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkNoM2FXNWtiM2NwTG05dUtDZHlaWE5wZW1VbkxDQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWtkM0poY0hCbGNsUndiQzVvWldsbmFIUW9KQ2h6Wld4bUxtVnNaVzFsYm5RcExtOTFkR1Z5U0dWcFoyaDBLQ2tnS3lBbmNIZ25LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxiR1l1WDJ4dllXUmxjaTVqYzNNb2V5QjBiM0E2SUNna2QzSmhjSEJsY2xSd2JDNXZkWFJsY2tobGFXZG9kQ2dwSUM4Z01pQXRJSE5sYkdZdVgyeHZZV1JsY2k1dmRYUmxja2hsYVdkb2RDZ3BJQzhnTWlrZ0t5QW5jSGduSUgwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1IzY21Gd2NHVnlWSEJzTG1oMGJXd29jMlZzWmk1ZmJHOWhaR1Z5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6Wld4bUxsOXNiMkZrWlhJdVkzTnpLSHNnZEc5d09pQW9KSGR5WVhCd1pYSlVjR3d1YjNWMFpYSklaV2xuYUhRb0tTQXZJRElnTFNCelpXeG1MbDlzYjJGa1pYSXViM1YwWlhKSVpXbG5hSFFvS1NBdklESXBJQ3NnSjNCNEp5QjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmljbVZoYXp0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrWldaaGRXeDBPbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDUW9jMlZzWmk1bGJHVnRaVzUwS1M1aFpuUmxjaWh6Wld4bUxsOXNiMkZrWlhJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKeVpXRnJPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J6Wld4bUxtUnBjMkZpYkdWUGRHaGxjbk1vS1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQm9hV1JsT2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1hDSnZkbVZ5YkdGNVhDSWdQVDA5SUhSb2FYTXViM0IwYVc5dWN5NXdiM05wZEdsdmJpa2dlMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDUW9kR2hwY3k1bGJHVnRaVzUwS1M1bWFXNWtLRndpTG1semJHOWhaR2x1WnkxdmRtVnliR0Y1WENJcExtWnBjbk4wS0NrdWNtVnRiM1psS0NrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNRb2RHaHBjeTVmYkc5aFpHVnlLUzV5WlcxdmRtVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNRb2RHaHBjeTVsYkdWdFpXNTBLUzUwWlhoMEtDUW9kR2hwY3k1bGJHVnRaVzUwS1M1aGRIUnlLRndpWkdGMFlTMXBjMnh2WVdScGJtY3RiR0ZpWld4Y0lpa3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0pDaDBhR2x6TG1Wc1pXMWxiblFwTG5KbGJXOTJaVUYwZEhJb1hDSmthWE5oWW14bFpGd2lLUzV5WlcxdmRtVkRiR0Z6Y3loY0ltUnBjMkZpYkdWa1hDSXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWxibUZpYkdWUGRHaGxjbk1vS1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQmthWE5oWW14bFQzUm9aWEp6T2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDUXVaV0ZqYUNoMGFHbHpMbTl3ZEdsdmJuTXVaR2x6WVdKc1pVOTBhR1Z5Y3l3Z1puVnVZM1JwYjI0Z0tHa3NJR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJsYkhRZ1BTQWtLR1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1ZzZEM1cGN5aGNJbUoxZEhSdmJpd2dhVzV3ZFhRc0lIUmxlSFJoY21WaFhDSXBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaV3gwTG1GMGRISW9YQ0prYVhOaFlteGxaRndpTENCY0ltUnBjMkZpYkdWa1hDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaV3gwTG1Ga1pFTnNZWE56S0Z3aVpHbHpZV0pzWldSY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lHVnVZV0pzWlU5MGFHVnljem9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBa0xtVmhZMmdvZEdocGN5NXZjSFJwYjI1ekxtUnBjMkZpYkdWUGRHaGxjbk1zSUdaMWJtTjBhVzl1SUNocExDQmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdaV3gwSUQwZ0pDaGxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxiSFF1YVhNb1hDSmlkWFIwYjI0c0lHbHVjSFYwTENCMFpYaDBZWEpsWVZ3aUtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnNkQzV5WlcxdmRtVkJkSFJ5S0Z3aVpHbHpZV0pzWldSY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxiSFF1Y21WdGIzWmxRMnhoYzNNb1hDSmthWE5oWW14bFpGd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVHRjY2x4dVhISmNiaUFnSUNBdkx5QkRiMjV6ZEhKMVkzUnZjbHh5WEc0Z0lDQWdKQzVtYmx0d2JIVm5hVzVPWVcxbFhTQTlJR1oxYm1OMGFXOXVJQ2h2Y0hScGIyNXpLU0I3WEhKY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVaV0ZqYUNobWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h2Y0hScGIyNXpJQ1ltSUZ3aWFHbGtaVndpSUNFOVBTQnZjSFJwYjI1eklIeDhJQ0VrTG1SaGRHRW9kR2hwY3l3Z1hDSndiSFZuYVc1ZlhDSWdLeUJ3YkhWbmFXNU9ZVzFsS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKQzVrWVhSaEtIUm9hWE1zSUZ3aWNHeDFaMmx1WDF3aUlDc2djR3gxWjJsdVRtRnRaU3dnYm1WM0lGQnNkV2RwYmloMGFHbHpMQ0J2Y0hScGIyNXpLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1pXeDBJRDBnSkM1a1lYUmhLSFJvYVhNc0lGd2ljR3gxWjJsdVgxd2lJQ3NnY0d4MVoybHVUbUZ0WlNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tGd2lhR2xrWlZ3aUlEMDlQU0J2Y0hScGIyNXpLU0I3SUdWc2RDNW9hV1JsS0NrN0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1ZzYzJVZ2V5QmxiSFF1YzJodmR5Z3BPeUI5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lIMDdYSEpjYmx4eVhHNGdJQ0FnWTI5dWRISjFZM1FvS1R0Y2NseHVYSEpjYm4wcEtHcFJkV1Z5ZVN3Z2QybHVaRzkzTENCa2IyTjFiV1Z1ZENrN1hHNTlLUzVqWVd4c0tHZHNiMkpoYkN3Z2JXOWtkV3hsTENCMWJtUmxabWx1WldRc0lIVnVaR1ZtYVc1bFpDazdYRzRpWFgwPSIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcblxuOyBib290c3RyYXAgPSBnbG9iYWwuYm9vdHN0cmFwID0gcmVxdWlyZShcImJvb3RzdHJhcFwiKTtcbm1vbWVudCA9IGdsb2JhbC5tb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xualF1ZXJ5ID0gZ2xvYmFsLmpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5rbyA9IGdsb2JhbC5rbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcbjsgdmFyIF9fYnJvd3NlcmlmeV9zaGltX3JlcXVpcmVfXz1yZXF1aXJlOyhmdW5jdGlvbiBicm93c2VyaWZ5U2hpbShtb2R1bGUsIGRlZmluZSwgcmVxdWlyZSkge1xuKGZ1bmN0aW9uICgkLCBrbywgbW9tZW50LCB1bmRlZmluZWQpIHtcclxuXHJcbiAgICAvLyNyZWdpb24gVXRpbHNcclxuXHJcbiAgICB2YXIgZGV0ZWN0RGF0YVR5cGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICBmb3IgKHZhciBmbmFtZSBpbiBkZXRlY3REYXRhVHlwZS50eXBlRGV0ZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBmID0gZGV0ZWN0RGF0YVR5cGVbZm5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoZih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkZXRlY3REYXRhVHlwZS50eXBlRGV0ZWN0aW9uW2ZuYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcblxyXG4gICAgZGV0ZWN0RGF0YVR5cGUuaXNTdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcclxuICAgIH07XHJcbiAgICBkZXRlY3REYXRhVHlwZS5pc0RhdGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBcIltvYmplY3QgRGF0ZV1cIjtcclxuICAgIH07XHJcbiAgICBkZXRlY3REYXRhVHlwZS5pc01vbWVudCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBtb21lbnQuaXNNb21lbnQodmFsdWUpO1xyXG4gICAgfTtcclxuICAgIGRldGVjdERhdGFUeXBlLnR5cGVEZXRlY3Rpb24gPSB7XHJcbiAgICAgICAgXCJpc01vbWVudFwiOiBcIm1vbWVudFwiLFxyXG4gICAgICAgIFwiaXNTdHJpbmdcIjogXCJzdHJpbmdcIixcclxuICAgICAgICBcImlzRGF0ZVwiOiBcImRhdGVcIlxyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgZWxCaW5kZXIgPSBmdW5jdGlvbigkZWwpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBmdW5jcyA9IGVsQmluZGVyLmZ1bmN0aW9uc1skZWwuZGF0YShlbEJpbmRlci5EQVRBVFlQRV9LRVkpXSB8fCBlbEJpbmRlci5mdW5jdGlvbnNbJ19kZWZhdWx0J107XHJcbiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmNzWydzZXQnXSB8fCBlbEJpbmRlci5mdW5jdGlvbnNbJ19kZWZhdWx0J11bJ3NldCddO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMoJGVsLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZnVuY3MgPSBlbEJpbmRlci5mdW5jdGlvbnNbJGVsLmRhdGEoZWxCaW5kZXIuREFUQVRZUEVfS0VZKV0gfHwgZWxCaW5kZXIuZnVuY3Rpb25zWydfZGVmYXVsdCddO1xyXG4gICAgICAgICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1snZ2V0J10gfHwgZWxCaW5kZXIuZnVuY3Rpb25zWydfZGVmYXVsdCddWydnZXQnXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCRlbCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihkYXRhVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgJGVsLmRhdGEoZWxCaW5kZXIuREFUQVRZUEVfS0VZLCBkYXRhVHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICBlbEJpbmRlci5EQVRBVFlQRV9LRVkgPSBcImRhdGVwaWNrZXIua28uZGF0YVR5cGVcIjtcclxuXHJcbiAgICBlbEJpbmRlci5mdW5jdGlvbnMgPSB7XHJcbiAgICAgICAgJ19kZWZhdWx0Jzoge1xyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgkZWwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAkZWwuZGF0ZXBpY2tlcignZ2V0Jyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCRlbCwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICRlbC5kYXRlcGlja2VyKCdzZXQnLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICdpc28nOiB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCRlbCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJGVsLmRhdGVwaWNrZXIoJ2dldCcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCRlbCwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBtbnQgPSBtb21lbnQodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgJGVsLmRhdGVwaWNrZXIoJ3NldCcsIG1udCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICdmb3JtYXQnOiB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCRlbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICRlbC5kYXRlcGlja2VyKCdnZXRBc1RleHQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2RhdGUnOiB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCRlbCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJGVsLmRhdGVwaWNrZXIoJ2dldCcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZS50b0RhdGUoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIGtvLmJpbmRpbmdIYW5kbGVycy5kYXRlcGlja2VyID0ge1xyXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yKSB7XHJcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0gYWxsQmluZGluZ3NBY2Nlc3NvcigpLmRhdGVwaWNrZXJPcHRpb25zIHx8IHt9O1xyXG4gICAgICAgICAgICB2YXIgZGF0YVR5cGUgPSBvcHRpb25zLmRhdGFUeXBlIHx8IGRldGVjdERhdGFUeXBlKGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKSk7XHJcbiAgICAgICAgICAgIGRhdGFUeXBlID0gIWRhdGFUeXBlIHx8IGRhdGFUeXBlID09ICdzdHJpbmcnID8gJ2lzbycgOiBkYXRhVHlwZTtcclxuICAgICAgICAgICAgdmFyICRlbCA9ICQoZWxlbWVudCkuZGF0ZXBpY2tlcihvcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgIGVsQmluZGVyKCRlbCkucmVnaXN0ZXIoZGF0YVR5cGUpO1xyXG5cclxuICAgICAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgXCJjaGFuZ2VEYXRlXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFjY2Vzc29yID0gdmFsdWVBY2Nlc3NvcigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGtvLmlzT2JzZXJ2YWJsZShhY2Nlc3NvcikpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbEJpbmRlcigkZWwpLmdldCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XHJcbiAgICAgICAgICAgIGVsQmluZGVyKCQoZWxlbWVudCkpXHJcbiAgICAgICAgICAgICAgICAuc2V0KGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAga28uYmluZGluZ0hhbmRsZXJzLmRhdGV0aW1lcGlja2VyID0ge1xyXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XHJcbiAgICAgICAgICAgIC8vaW5pdGlhbGl6ZSBkYXRlcGlja2VyIHdpdGggc29tZSBvcHRpb25hbCBvcHRpb25zXHJcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiAnREQvTU0vWVlZWSBoaDptbSBBJyxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHREYXRlOiB2YWx1ZUFjY2Vzc29yKCkoKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKGFsbEJpbmRpbmdzQWNjZXNzb3IoKSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxsQmluZGluZ3NBY2Nlc3NvcigpLmRhdGVwaWNrZXJPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1hdCA9IGFsbEJpbmRpbmdzQWNjZXNzb3IoKS5kYXRlcGlja2VyT3B0aW9ucy5mb3JtYXQgIT09IHVuZGVmaW5lZCA/IGFsbEJpbmRpbmdzQWNjZXNzb3IoKS5kYXRlcGlja2VyT3B0aW9ucy5mb3JtYXQgOiBvcHRpb25zLmZvcm1hdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgJChlbGVtZW50KS5kYXRldGltZXBpY2tlcihvcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgIC8vd2hlbiBhIHVzZXIgY2hhbmdlcyB0aGUgZGF0ZSwgdXBkYXRlIHRoZSB2aWV3IG1vZGVsXHJcbiAgICAgICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwiZHAuY2hhbmdlXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVBY2Nlc3NvcigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGtvLmlzT2JzZXJ2YWJsZSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZShldmVudC5kYXRlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XHJcbiAgICAgICAgICAgIGVsQmluZGVyKCQoZWxlbWVudCkpXHJcbiAgICAgICAgICAgICAgICAuc2V0KGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufSkoalF1ZXJ5LCB0aGlzLmtvLCB0aGlzLm1vbWVudCk7XG59KS5jYWxsKGdsb2JhbCwgbW9kdWxlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWxOamNtbHdkSE12YkdsaUwyMXZiV1Z1ZEMxa1lYUmxjR2xqYTJWeUxXdHZMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3UVVGQlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lYRzQ3SUdKdmIzUnpkSEpoY0NBOUlHZHNiMkpoYkM1aWIyOTBjM1J5WVhBZ1BTQnlaWEYxYVhKbEtGd2lZbTl2ZEhOMGNtRndYQ0lwTzF4dWJXOXRaVzUwSUQwZ1oyeHZZbUZzTG0xdmJXVnVkQ0E5SUhKbGNYVnBjbVVvWENKdGIyMWxiblJjSWlrN1hHNXFVWFZsY25rZ1BTQm5iRzlpWVd3dWFsRjFaWEo1SUQwZ2NtVnhkV2x5WlNoY0ltcHhkV1Z5ZVZ3aUtUdGNibXR2SUQwZ1oyeHZZbUZzTG10dklEMGdjbVZ4ZFdseVpTaGNJbXR1YjJOcmIzVjBYQ0lwTzF4dU95QjJZWElnWDE5aWNtOTNjMlZ5YVdaNVgzTm9hVzFmY21WeGRXbHlaVjlmUFhKbGNYVnBjbVU3S0daMWJtTjBhVzl1SUdKeWIzZHpaWEpwWm5sVGFHbHRLRzF2WkhWc1pTd2daR1ZtYVc1bExDQnlaWEYxYVhKbEtTQjdYRzRvWm5WdVkzUnBiMjRnS0NRc0lHdHZMQ0J0YjIxbGJuUXNJSFZ1WkdWbWFXNWxaQ2tnZTF4eVhHNWNjbHh1SUNBZ0lDOHZJM0psWjJsdmJpQlZkR2xzYzF4eVhHNWNjbHh1SUNBZ0lIWmhjaUJrWlhSbFkzUkVZWFJoVkhsd1pTQTlJR1oxYm1OMGFXOXVJQ2gyWVd4MVpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUdadmNpQW9kbUZ5SUdadVlXMWxJR2x1SUdSbGRHVmpkRVJoZEdGVWVYQmxMblI1Y0dWRVpYUmxZM1JwYjI0cElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR1lnUFNCa1pYUmxZM1JFWVhSaFZIbHdaVnRtYm1GdFpWMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2htS0haaGJIVmxLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdSbGRHVmpkRVJoZEdGVWVYQmxMblI1Y0dWRVpYUmxZM1JwYjI1YlptNWhiV1ZkTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnVkV3hzTzF4eVhHNGdJQ0FnZlR0Y2NseHVYSEpjYmlBZ0lDQmtaWFJsWTNSRVlYUmhWSGx3WlM1cGMxTjBjbWx1WnlBOUlHWjFibU4wYVc5dUlDaDJZV3gxWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBlWEJsYjJZZ2RtRnNkV1VnUFQwOUlDZHpkSEpwYm1jbk8xeHlYRzRnSUNBZ2ZUdGNjbHh1SUNBZ0lHUmxkR1ZqZEVSaGRHRlVlWEJsTG1selJHRjBaU0E5SUdaMWJtTjBhVzl1SUNoMllXeDFaU2tnZTF4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGVYQmxiMllnZG1Gc2RXVWdQVDA5SUNkdlltcGxZM1FuSUNZbUlFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWRHOVRkSEpwYm1jdVkyRnNiQ2gyWVd4MVpTa2dQVDA5SUZ3aVcyOWlhbVZqZENCRVlYUmxYVndpTzF4eVhHNGdJQ0FnZlR0Y2NseHVJQ0FnSUdSbGRHVmpkRVJoZEdGVWVYQmxMbWx6VFc5dFpXNTBJRDBnWm5WdVkzUnBiMjRnS0haaGJIVmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUcxdmJXVnVkQzVwYzAxdmJXVnVkQ2gyWVd4MVpTazdYSEpjYmlBZ0lDQjlPMXh5WEc0Z0lDQWdaR1YwWldOMFJHRjBZVlI1Y0dVdWRIbHdaVVJsZEdWamRHbHZiaUE5SUh0Y2NseHVJQ0FnSUNBZ0lDQmNJbWx6VFc5dFpXNTBYQ0k2SUZ3aWJXOXRaVzUwWENJc1hISmNiaUFnSUNBZ0lDQWdYQ0pwYzFOMGNtbHVaMXdpT2lCY0luTjBjbWx1WjF3aUxGeHlYRzRnSUNBZ0lDQWdJRndpYVhORVlYUmxYQ0k2SUZ3aVpHRjBaVndpWEhKY2JpQWdJQ0I5TzF4eVhHNWNjbHh1SUNBZ0lIWmhjaUJsYkVKcGJtUmxjaUE5SUdaMWJtTjBhVzl1S0NSbGJDa2dlMXh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUI3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSE5sZERvZ1puVnVZM1JwYjI0b2RtRnNkV1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gyWVd4MVpTQTlQVDBnZFc1a1pXWnBibVZrS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc2RXVWdQU0J1ZFd4c08xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHWjFibU56SUQwZ1pXeENhVzVrWlhJdVpuVnVZM1JwYjI1eld5UmxiQzVrWVhSaEtHVnNRbWx1WkdWeUxrUkJWRUZVV1ZCRlgwdEZXU2xkSUh4OElHVnNRbWx1WkdWeUxtWjFibU4wYVc5dWMxc25YMlJsWm1GMWJIUW5YVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQm1kVzVqSUQwZ1puVnVZM05iSjNObGRDZGRJSHg4SUdWc1FtbHVaR1Z5TG1aMWJtTjBhVzl1YzFzblgyUmxabUYxYkhRblhWc25jMlYwSjEwN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1puVnVZeWdrWld3c0lIWmhiSFZsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWjJWME9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQm1kVzVqY3lBOUlHVnNRbWx1WkdWeUxtWjFibU4wYVc5dWMxc2taV3d1WkdGMFlTaGxiRUpwYm1SbGNpNUVRVlJCVkZsUVJWOUxSVmtwWFNCOGZDQmxiRUpwYm1SbGNpNW1kVzVqZEdsdmJuTmJKMTlrWldaaGRXeDBKMTA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdablZ1WXlBOUlHWjFibU56V3lkblpYUW5YU0I4ZkNCbGJFSnBibVJsY2k1bWRXNWpkR2x2Ym5OYkoxOWtaV1poZFd4MEoxMWJKMmRsZENkZE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWjFibU1vSkdWc0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVm5hWE4wWlhJNklHWjFibU4wYVc5dUtHUmhkR0ZVZVhCbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FrWld3dVpHRjBZU2hsYkVKcGJtUmxjaTVFUVZSQlZGbFFSVjlMUlZrc0lHUmhkR0ZVZVhCbEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJSDA3WEhKY2JpQWdJQ0JjY2x4dUlDQWdJR1ZzUW1sdVpHVnlMa1JCVkVGVVdWQkZYMHRGV1NBOUlGd2laR0YwWlhCcFkydGxjaTVyYnk1a1lYUmhWSGx3WlZ3aU8xeHlYRzVjY2x4dUlDQWdJR1ZzUW1sdVpHVnlMbVoxYm1OMGFXOXVjeUE5SUh0Y2NseHVJQ0FnSUNBZ0lDQW5YMlJsWm1GMWJIUW5PaUI3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2RsZERvZ1puVnVZM1JwYjI0Z0tDUmxiQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUNSbGJDNWtZWFJsY0dsamEyVnlLQ2RuWlhRbktUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2MyVjBPaUJtZFc1amRHbHZiaUFvSkdWc0xDQjJZV3gxWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKR1ZzTG1SaGRHVndhV05yWlhJb0ozTmxkQ2NzSUhaaGJIVmxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNiaUFnSUNBZ0lDQWdKMmx6YnljNklIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1oyVjBPaUJtZFc1amRHbHZiaUFvSkdWc0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2RtRnNkV1VnUFNBa1pXd3VaR0YwWlhCcFkydGxjaWduWjJWMEp5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdLSFpoYkhWbElDWW1JSFpoYkhWbExtWnZjbTFoZENnbldWbFpXUzFOVFMxRVJDY3BLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjMlYwT2lCbWRXNWpkR2x2YmlBb0pHVnNMQ0IyWVd4MVpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHMXVkQ0E5SUcxdmJXVnVkQ2gyWVd4MVpTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FrWld3dVpHRjBaWEJwWTJ0bGNpZ25jMlYwSnl3Z2JXNTBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNiaUFnSUNBZ0lDQWdKMlp2Y20xaGRDYzZJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaMlYwT2lCbWRXNWpkR2x2YmlBb0pHVnNLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnSkdWc0xtUmhkR1Z3YVdOclpYSW9KMmRsZEVGelZHVjRkQ2NwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1SUNBZ0lDQWdJQ0FuWkdGMFpTYzZJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaMlYwT2lCbWRXNWpkR2x2YmlBb0pHVnNLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdkbUZzZFdVZ1BTQWtaV3d1WkdGMFpYQnBZMnRsY2lnbloyVjBKeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnS0haaGJIVmxJQ1ltSUhaaGJIVmxMblJ2UkdGMFpTZ3BLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUgwN1hISmNibHh5WEc0Z0lDQWdMeThqWlc1a2NtVm5hVzl1WEhKY2JseHlYRzRnSUNBZ2EyOHVZbWx1WkdsdVowaGhibVJzWlhKekxtUmhkR1Z3YVdOclpYSWdQU0I3WEhKY2JpQWdJQ0FnSUNBZ2FXNXBkRG9nWm5WdVkzUnBiMjRnS0dWc1pXMWxiblFzSUhaaGJIVmxRV05qWlhOemIzSXNJR0ZzYkVKcGJtUnBibWR6UVdOalpYTnpiM0lwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHOXdkR2x2Ym5NZ1BTQmhiR3hDYVc1a2FXNW5jMEZqWTJWemMyOXlLQ2t1WkdGMFpYQnBZMnRsY2s5d2RHbHZibk1nZkh3Z2UzMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJrWVhSaFZIbHdaU0E5SUc5d2RHbHZibk11WkdGMFlWUjVjR1VnZkh3Z1pHVjBaV04wUkdGMFlWUjVjR1VvYTI4dWRYUnBiSE11ZFc1M2NtRndUMkp6WlhKMllXSnNaU2gyWVd4MVpVRmpZMlZ6YzI5eUtDa3BLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaR0YwWVZSNWNHVWdQU0FoWkdGMFlWUjVjR1VnZkh3Z1pHRjBZVlI1Y0dVZ1BUMGdKM04wY21sdVp5Y2dQeUFuYVhOdkp5QTZJR1JoZEdGVWVYQmxPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnSkdWc0lEMGdKQ2hsYkdWdFpXNTBLUzVrWVhSbGNHbGphMlZ5S0c5d2RHbHZibk1wTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pXeENhVzVrWlhJb0pHVnNLUzV5WldkcGMzUmxjaWhrWVhSaFZIbHdaU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcmJ5NTFkR2xzY3k1eVpXZHBjM1JsY2tWMlpXNTBTR0Z1Wkd4bGNpaGxiR1Z0Wlc1MExDQmNJbU5vWVc1blpVUmhkR1ZjSWl3Z1puVnVZM1JwYjI0Z0tHVjJaVzUwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWVdOalpYTnpiM0lnUFNCMllXeDFaVUZqWTJWemMyOXlLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hMjh1YVhOUFluTmxjblpoWW14bEtHRmpZMlZ6YzI5eUtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUIyWVd4MVpTQTlJR1ZzUW1sdVpHVnlLQ1JsYkNrdVoyVjBLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV05qWlhOemIzSW9kbUZzZFdVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzRnSUNBZ0lDQWdJSFZ3WkdGMFpUb2dablZ1WTNScGIyNGdLR1ZzWlcxbGJuUXNJSFpoYkhWbFFXTmpaWE56YjNJcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pXeENhVzVrWlhJb0pDaGxiR1Z0Wlc1MEtTbGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzV6WlhRb2EyOHVkWFJwYkhNdWRXNTNjbUZ3VDJKelpYSjJZV0pzWlNoMllXeDFaVUZqWTJWemMyOXlLQ2twS1R0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlPMXh5WEc1Y2NseHVYSEpjYmlBZ0lDQnJieTVpYVc1a2FXNW5TR0Z1Wkd4bGNuTXVaR0YwWlhScGJXVndhV05yWlhJZ1BTQjdYSEpjYmlBZ0lDQWdJQ0FnYVc1cGREb2dablZ1WTNScGIyNGdLR1ZzWlcxbGJuUXNJSFpoYkhWbFFXTmpaWE56YjNJc0lHRnNiRUpwYm1ScGJtZHpRV05qWlhOemIzSXNJSFpwWlhkTmIyUmxiQ3dnWW1sdVpHbHVaME52Ym5SbGVIUXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeTlwYm1sMGFXRnNhWHBsSUdSaGRHVndhV05yWlhJZ2QybDBhQ0J6YjIxbElHOXdkR2x2Ym1Gc0lHOXdkR2x2Ym5OY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHOXdkR2x2Ym5NZ1BTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYjNKdFlYUTZJQ2RFUkM5TlRTOVpXVmxaSUdob09tMXRJRUVuTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHVm1ZWFZzZEVSaGRHVTZJSFpoYkhWbFFXTmpaWE56YjNJb0tTZ3BYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMDdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1lXeHNRbWx1WkdsdVozTkJZMk5sYzNOdmNpZ3BJQ0U5UFNCMWJtUmxabWx1WldRcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoaGJHeENhVzVrYVc1bmMwRmpZMlZ6YzI5eUtDa3VaR0YwWlhCcFkydGxjazl3ZEdsdmJuTWdJVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5d2RHbHZibk11Wm05eWJXRjBJRDBnWVd4c1FtbHVaR2x1WjNOQlkyTmxjM052Y2lncExtUmhkR1Z3YVdOclpYSlBjSFJwYjI1ekxtWnZjbTFoZENBaFBUMGdkVzVrWldacGJtVmtJRDhnWVd4c1FtbHVaR2x1WjNOQlkyTmxjM052Y2lncExtUmhkR1Z3YVdOclpYSlBjSFJwYjI1ekxtWnZjbTFoZENBNklHOXdkR2x2Ym5NdVptOXliV0YwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWtLR1ZzWlcxbGJuUXBMbVJoZEdWMGFXMWxjR2xqYTJWeUtHOXdkR2x2Ym5NcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeTkzYUdWdUlHRWdkWE5sY2lCamFHRnVaMlZ6SUhSb1pTQmtZWFJsTENCMWNHUmhkR1VnZEdobElIWnBaWGNnYlc5a1pXeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2EyOHVkWFJwYkhNdWNtVm5hWE4wWlhKRmRtVnVkRWhoYm1Sc1pYSW9aV3hsYldWdWRDd2dYQ0prY0M1amFHRnVaMlZjSWl3Z1puVnVZM1JwYjI0Z0tHVjJaVzUwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnZG1Gc2RXVWdQU0IyWVd4MVpVRmpZMlZ6YzI5eUtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2EyOHVhWE5QWW5ObGNuWmhZbXhsS0haaGJIVmxLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoYkhWbEtHVjJaVzUwTG1SaGRHVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc0Z0lDQWdJQ0FnSUhWd1pHRjBaVG9nWm5WdVkzUnBiMjRnS0dWc1pXMWxiblFzSUhaaGJIVmxRV05qWlhOemIzSXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaV3hDYVc1a1pYSW9KQ2hsYkdWdFpXNTBLU2xjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM1elpYUW9hMjh1ZFhScGJITXVkVzUzY21Gd1QySnpaWEoyWVdKc1pTaDJZV3gxWlVGalkyVnpjMjl5S0NrcEtUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0I5TzF4eVhHNTlLU2hxVVhWbGNua3NJSFJvYVhNdWEyOHNJSFJvYVhNdWJXOXRaVzUwS1R0Y2JuMHBMbU5oYkd3b1oyeHZZbUZzTENCdGIyUjFiR1VzSUhWdVpHVm1hVzVsWkN3Z2RXNWtaV1pwYm1Wa0tUdGNiaUpkZlE9PSIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcblxuOyBtb21lbnQgPSBnbG9iYWwubW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmpRdWVyeSA9IGdsb2JhbC5qUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuOyB2YXIgX19icm93c2VyaWZ5X3NoaW1fcmVxdWlyZV9fPXJlcXVpcmU7KGZ1bmN0aW9uIGJyb3dzZXJpZnlTaGltKG1vZHVsZSwgZGVmaW5lLCByZXF1aXJlKSB7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogTW9tZW50RGF0ZXBpY2tlclxyXG4gKiBCYXNlZCBvbiBodHRwOi8vd3d3LmV5ZWNvbi5yby9ib290c3RyYXAtZGF0ZXBpY2tlclxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgQW5kcmVzIE1vc2NoaW5pXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuIWZ1bmN0aW9uICgkLCBtb21lbnQsIHVuZGVmaW5lZCkge1xyXG5cclxuICAgIC8vIFBpY2tlciBvYmplY3RcclxuXHJcbiAgICB2YXIgRGF0ZXBpY2tlciA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTtcclxuICAgICAgICB0aGlzLmF1dG9IaWRlID0gdHJ1ZSAmJiAob3B0aW9ucy5hdXRvSGlkZSAhPT0gZmFsc2UpICYmICh0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZXBpY2tlci1hdXRvaGlkZScpICE9PSBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5mb3JtYXQgPSBvcHRpb25zLmZvcm1hdCB8fCB0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZXBpY2tlci1mb3JtYXQnKSB8fCBtb21lbnQubG9jYWxlRGF0YSgpLmxvbmdEYXRlRm9ybWF0KCdMJyk7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclBsYWNlbWVudCA9IG9wdGlvbnMuY2FsZW5kYXJQbGFjZW1lbnQgfHwgdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGVwaWNrZXItY2FsZW5kYXJwbGFjZW1lbnQnKSB8fCAncmlnaHQnO1xyXG4gICAgICAgIHRoaXMucGlja2VyID0gJChEUEdsb2JhbC50ZW1wbGF0ZSlcclxuXHRcdFx0XHRcdFx0XHQuYXBwZW5kVG8ob3B0aW9ucy5jb250YWluZXIpXHJcblx0XHRcdFx0XHRcdFx0Lm9uKHtcclxuXHRcdFx0XHRcdFx0XHQgICAgY2xpY2s6ICQucHJveHkodGhpcy5jbGljaywgdGhpcyksXHJcblx0XHRcdFx0XHRcdFx0ICAgIG1vdXNlZG93bjogJC5wcm94eSh0aGlzLm1vdXNlZG93biwgdGhpcylcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHJcbiAgICAgICAgdGhpcy4kdmlld3BvcnQgPSAkKG9wdGlvbnMudmlld3BvcnQgfHwgb3B0aW9ucy5jb250YWluZXIpO1xyXG5cclxuICAgICAgICB2YXIgc3RhcnREYXRlVGV4dCA9IG9wdGlvbnMuc3RhcnREYXRlIHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLXN0YXJ0ZGF0ZScpIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IChzdGFydERhdGVUZXh0KSA/IERQR2xvYmFsLnBhcnNlRGF0ZShzdGFydERhdGVUZXh0LCB0aGlzLmZvcm1hdCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmFyIGVuZERhdGVUZXh0ID0gb3B0aW9ucy5lbmREYXRlIHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLWVuZGRhdGUnKSB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbmREYXRlID0gKGVuZERhdGVUZXh0KSA/IERQR2xvYmFsLnBhcnNlRGF0ZShlbmREYXRlVGV4dCwgdGhpcy5mb3JtYXQpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuaXNJbnB1dCA9IHRoaXMuZWxlbWVudC5pcygnaW5wdXQnKTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudCA9ICF0aGlzLmlzSW5wdXQgJiYgdGhpcy5lbGVtZW50LmlzKCcuZGF0ZScpID8gdGhpcy5lbGVtZW50LmZpbmQoJy5pbnB1dC1ncm91cC1hZGRvbiwgLmFkZC1vbicpIDogZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzSW5wdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm9uKHtcclxuICAgICAgICAgICAgICAgIGZvY3VzOiAkLnByb3h5KHRoaXMuc2hvdywgdGhpcyksXHJcbiAgICAgICAgICAgICAgICBibHVyOiAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZURhdGUoKTtcclxuICAgICAgICAgICAgICAgIH0sIHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgaW5wdXQ6ICQucHJveHkoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZyb21WYWx1ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0sIHRoaXMpLFxyXG4gICAgICAgICAgICAgICAga2V5dXA6ICQucHJveHkoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IDEzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZyb21WYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSwgdGhpcyksXHJcbiAgICAgICAgICAgICAgICBjbGljazogJC5wcm94eSh0aGlzLnNob3csIHRoaXMpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLnNob3csIHRoaXMpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuc2hvdywgdGhpcykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubWluVmlld01vZGUgPSBvcHRpb25zLm1pblZpZXdNb2RlIHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLW1pbnZpZXdtb2RlJykgfHwgMDtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWluVmlld01vZGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5taW5WaWV3TW9kZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnbW9udGhzJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZpZXdNb2RlID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3llYXJzJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZpZXdNb2RlID0gMjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WaWV3TW9kZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9IG9wdGlvbnMudmlld01vZGUgfHwgdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGVwaWNrZXItdmlld21vZGUnKSB8fCAwO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy52aWV3TW9kZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdtb250aHMnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld01vZGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAneWVhcnMnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld01vZGUgPSAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdNb2RlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0YXJ0Vmlld01vZGUgPSB0aGlzLnZpZXdNb2RlO1xyXG4gICAgICAgIHRoaXMud2Vla1N0YXJ0ID0gb3B0aW9ucy53ZWVrU3RhcnQgfHwgdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGVwaWNrZXItd2Vla3N0YXJ0JykgfHwgMDtcclxuICAgICAgICB0aGlzLndlZWtFbmQgPSB0aGlzLndlZWtTdGFydCA9PT0gMCA/IDYgOiB0aGlzLndlZWtTdGFydCAtIDE7XHJcbiAgICAgICAgdGhpcy5maWxsRG93KCk7XHJcbiAgICAgICAgdGhpcy5maWxsTW9udGhzKCk7XHJcbiAgICAgICAgdGhpcy5zZXRDdXN0b21DbGFzc2VzKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGcm9tVmFsdWUoKTtcclxuICAgICAgICB0aGlzLnNob3dNb2RlKCk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIERhdGVwaWNrZXIucHJvdG90eXBlID0ge1xyXG4gICAgICAgIGNvbnN0cnVjdG9yOiBEYXRlcGlja2VyLFxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMubW9tZW50ICYmIHRoaXMubW9tZW50LmNsb25lKCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ2V0QXNUZXh0OiBmdW5jdGlvbiAoZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIHZhciBkaXNwbGF5Rm9ybWF0ID0gdGhpcy5mb3JtYXQ7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGlzcGxheUZvcm1hdCkgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQgPSBkaXNwbGF5Rm9ybWF0WzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5tb21lbnQgJiYgdGhpcy5tb21lbnQuZm9ybWF0KGZvcm1hdCB8fCBkaXNwbGF5Rm9ybWF0KSkgfHwgJyc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93OiBmdW5jdGlvbiAoZSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnB1dCAmJiB0aGlzLmVsZW1lbnQuaXMoJzpkaXNhYmxlZCcpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5lbGVtZW50LmNoaWxkcmVuKCdpbnB1dCcpLmlzKCc6ZGlzYWJsZWQnKSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucGlja2VyLnNob3coKTtcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSAodGhpcy5jb21wb25lbnQgJiYgdGhpcy5jb21wb25lbnQub3V0ZXJIZWlnaHQoKSkgfHwgdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCk7XHJcbiAgICAgICAgICAgIHRoaXMucGxhY2UoKTtcclxuICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCAkLnByb3h5KHRoaXMucGxhY2UsIHRoaXMpKTtcclxuICAgICAgICAgICAgaWYgKGUpIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5wdXQpIHtcclxuICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCdtb3VzZWRvd24nLCAkLnByb3h5KHRoaXMuaGlkZSwgdGhpcykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdzaG93J1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaGlkZTogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgLy8gV2hlbiBnb2luZyBmcm9tIHRoZSBpbnB1dCB0byB0aGUgcGlja2VyLCBJRSBoYW5kbGVzIHRoZSBibHVyL2NsaWNrXHJcbiAgICAgICAgICAgIC8vIGV2ZW50cyBkaWZmZXJlbnRseSB0aGFuIG90aGVyIGJyb3dzZXJzLCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIGJsdXJcclxuICAgICAgICAgICAgLy8gZXZlbnQgdHJpZ2dlcnMgYSBoaWRlIGJlZm9yZSB0aGUgY2xpY2sgZXZlbnQgY2FuIHN0b3AgcHJvcGFnYXRpb24uXHJcbiAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJNU0lFIDguMFwiKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcclxuXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYW5jZWxfaGlkZSgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlkZV90aW1lb3V0KTtcclxuICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHQucGlja2VyLm9mZignY2xpY2snLCBjYW5jZWxfaGlkZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9faGlkZSgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0LmhpZGUuYXBwbHkodCwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5waWNrZXIub2ZmKCdjbGljaycsIGNhbmNlbF9oaWRlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5vbignY2xpY2snLCBjYW5jZWxfaGlkZSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaGlkZV90aW1lb3V0ID0gc2V0VGltZW91dChkb19oaWRlLCAxMDApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGlkZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgaGlkZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5oaWRlKCk7XHJcbiAgICAgICAgICAgICQod2luZG93KS5vZmYoJ3Jlc2l6ZScsIHRoaXMucGxhY2UpO1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdNb2RlID0gdGhpcy5zdGFydFZpZXdNb2RlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dNb2RlKCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0lucHV0KSB7XHJcbiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ21vdXNlZG93bicsIHRoaXMuaGlkZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdoaWRlJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICByZWZyZXNoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBmb3JtYXRlZCA9IHRoaXMuZ2V0QXNUZXh0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJ2lucHV0JykucHJvcCgndmFsdWUnLCBmb3JtYXRlZCkuY2hhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZScsIGZvcm1hdGVkKS5jaGFuZ2UoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5wcm9wKCd2YWx1ZScsIGZvcm1hdGVkKS5jaGFuZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld0RhdGUsIG9tbWl0RXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUobmV3RGF0ZSwgb21taXRFdmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHBsYWNlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzb3VyY2VJdGVtID0gdGhpcy5jb21wb25lbnQgPyB0aGlzLmNvbXBvbmVudCA6IHRoaXMuZWxlbWVudDtcclxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHNvdXJjZUl0ZW0ub2Zmc2V0KCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgdmlld3BvcnRPZmZzZXQgPSB0aGlzLiR2aWV3cG9ydC5vZmZzZXQoKTtcclxuICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IHRoaXMuJHZpZXdwb3J0LnNjcm9sbFRvcCgpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHpJbmRleCA9IHBhcnNlSW50KHRoaXMuZWxlbWVudC5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciB6SW5kZXggPSAkKHRoaXMpLmNzcygnei1pbmRleCcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHpJbmRleCAhPSAnYXV0bycgJiYgekluZGV4ICE9ICcwJztcclxuICAgICAgICAgICAgfSkuZmlyc3QoKS5jc3MoJ3otaW5kZXgnKSkgKyAxMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGVuZGFyUGxhY2VtZW50ID09ICdsZWZ0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IG9mZnNldC50b3AgKyB0aGlzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBvZmZzZXQubGVmdCArIHNvdXJjZUl0ZW1bMF0ub2Zmc2V0V2lkdGggLSB0aGlzLnBpY2tlclswXS5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogb2Zmc2V0LnRvcCArIHRoaXMuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IG9mZnNldC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHpJbmRleCA6IHpJbmRleFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGxhc3RWYWx1ZTogbnVsbCxcclxuICAgICAgICB0cmlnZ2VyQ2hhbmdlRGF0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLm1vbWVudCA/IHRoaXMubW9tZW50LnZhbHVlT2YoKSA6IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSB0aGlzLmxhc3RWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2hhbmdlRGF0ZSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9IaWRlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB1cGRhdGVGcm9tVmFsdWU6IGZ1bmN0aW9uIChvbW1pdEV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMuaXNJbnB1dCA/IHRoaXMuZWxlbWVudC5wcm9wKCd2YWx1ZScpIDogdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGUnKSwgb21taXRFdmVudCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbiAobmV3RGF0ZSwgb21taXRFdmVudCkge1xyXG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxWYWx1ZSA9IHRoaXMubW9tZW50ID8gdGhpcy5tb21lbnQudmFsdWVPZigpIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubW9tZW50ID0gRFBHbG9iYWwucGFyc2VEYXRlKG5ld0RhdGUsIHRoaXMuZm9ybWF0KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMubW9tZW50ID8gdGhpcy5tb21lbnQudmFsdWVPZigpIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy52aWV3RGF0ZSB8fCBvcmlnaW5hbFZhbHVlICE9IG5ld1ZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlID0gdGhpcy5nZXQoKSB8fCBtb21lbnQoKS5ob3VycygwKS5taW51dGVzKDApLnNlY29uZHMoMCkubWlsbGlzZWNvbmRzKDApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWxsKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoYW5nZURhdGVJbnN0YW50J1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFvbW1pdEV2ZW50KVxyXG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlRGF0ZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZpbGxEb3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRvd0NudCA9IHRoaXMud2Vla1N0YXJ0O1xyXG4gICAgICAgICAgICB2YXIgaHRtbCA9ICc8dHI+JztcclxuICAgICAgICAgICAgdmFyIGRheXNNaW4gPSAkLnByb3h5KG1vbWVudC5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4sIG1vbWVudC5sb2NhbGVEYXRhKCkpO1xyXG4gICAgICAgICAgICB3aGlsZSAoZG93Q250IDwgdGhpcy53ZWVrU3RhcnQgKyA3KSB7XHJcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8dGggY2xhc3M9XCJkb3dcIj4nICsgZGF5c01pbihtb21lbnQoKS5kYXkoKGRvd0NudCsrKSAlIDcpKSArICc8L3RoPic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaHRtbCArPSAnPC90cj4nO1xyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5maW5kKCcuZGF0ZXBpY2tlci1kYXlzIHRoZWFkJykuYXBwZW5kKGh0bWwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZpbGxNb250aHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGh0bWwgPSAnJztcclxuICAgICAgICAgICAgdmFyIGkgPSAwO1xyXG4gICAgICAgICAgICB2YXIgbW9udGhzU2hvcnQgPSAkLnByb3h5KG1vbWVudC5sb2NhbGVEYXRhKCkubW9udGhzU2hvcnQsIG1vbWVudC5sb2NhbGVEYXRhKCkpO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IDEyKSB7XHJcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cIm1vbnRoXCI+JyArIG1vbnRoc1Nob3J0KG1vbWVudCgpLnN0YXJ0T2YoJ21vbnRoJykubW9udGgoaSsrKSkgKyAnPC9zcGFuPic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuZmluZCgnLmRhdGVwaWNrZXItbW9udGhzIHRkJykuYXBwZW5kKGh0bWwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZpbGw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHllYXIgPSB0aGlzLnZpZXdEYXRlLnllYXIoKTtcclxuICAgICAgICAgICAgdmFyIG1vbnRoID0gdGhpcy52aWV3RGF0ZS5tb250aCgpO1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudE1vbWVudCA9IHRoaXMuZ2V0KCk7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50RGF0ZSA9IGN1cnJlbnRNb21lbnQgPyBjdXJyZW50TW9tZW50LnZhbHVlT2YoKSA6IG51bGw7IC8vVE9ETzogdXNlIGRpZmZcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnRZZWFyID0gY3VycmVudE1vbWVudCA/IGN1cnJlbnRNb21lbnQueWVhcigpIDogbnVsbDtcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnRNb250aCA9IGN1cnJlbnRNb21lbnQgPyBjdXJyZW50TW9tZW50Lm1vbnRoKCkgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuZmluZCgnLmRhdGVwaWNrZXItZGF5cyB0aDplcSgxKScpXHJcblx0XHRcdFx0XHRcdC50ZXh0KG1vbWVudC5sb2NhbGVEYXRhKCkubW9udGhzKG1vbWVudCgpLm1vbnRoKG1vbnRoKSkgKyAnICcgKyB5ZWFyKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwcmV2TW9udGggPSBtb21lbnQoW3llYXIsIG1vbnRoLCAxXSk7XHJcbiAgICAgICAgICAgIHByZXZNb250aC5zdWJ0cmFjdCgxLCAnZGF5Jyk7XHJcbiAgICAgICAgICAgIHByZXZNb250aC5kYXkocHJldk1vbnRoLmRheSgpIC0gKHByZXZNb250aC5kYXkoKSAtIHRoaXMud2Vla1N0YXJ0ICsgNykgJSA3KTtcclxuXHJcbiAgICAgICAgICAgIC8vVE9ETzogdXNlIGRpZmZcclxuICAgICAgICAgICAgdmFyIG5leHRNb250aFZhbCA9IG1vbWVudChwcmV2TW9udGgpLmFkZCg0MiwgJ2RheXMnKS52YWx1ZU9mKCk7XHJcblxyXG4gICAgICAgICAgICBodG1sID0gW107XHJcbiAgICAgICAgICAgIHZhciBjbHNOYW1lO1xyXG4gICAgICAgICAgICAvL1RPRE86IHVzZSBkaWZmXHJcbiAgICAgICAgICAgIHdoaWxlIChwcmV2TW9udGgudmFsdWVPZigpIDwgbmV4dE1vbnRoVmFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldk1vbnRoLmRheSgpID09PSB0aGlzLndlZWtTdGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGh0bWwucHVzaCgnPHRyPicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2xzTmFtZSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgLy9UT0RPOiB1c2UgZGlmZlxyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZNb250aC55ZWFyKCkgPCB5ZWFyIHx8IChwcmV2TW9udGgueWVhcigpID09IHllYXIgJiYgcHJldk1vbnRoLm1vbnRoKCkgPCBtb250aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbHNOYW1lICs9ICcgb2xkJztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJldk1vbnRoLnllYXIoKSA+IHllYXIgfHwgKHByZXZNb250aC55ZWFyKCkgPT0geWVhciAmJiBwcmV2TW9udGgubW9udGgoKSA+IG1vbnRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsc05hbWUgKz0gJyBuZXcnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9UT0RPOiB1c2UgZGlmZlxyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZNb250aC52YWx1ZU9mKCkgPT09IGN1cnJlbnREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzTmFtZSArPSAnIGFjdGl2ZSc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldk1vbnRoLnZhbHVlT2YoKSA8IHRoaXMuc3RhcnREYXRlIHx8IHByZXZNb250aC52YWx1ZU9mKCkgPiB0aGlzLmVuZERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbHNOYW1lICs9ICcgZGlzYWJsZWQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaHRtbC5wdXNoKCc8dGQgY2xhc3M9XCJkYXknICsgY2xzTmFtZSArICdcIj4nICsgcHJldk1vbnRoLmRhdGUoKSArICc8L3RkPicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZNb250aC5kYXkoKSA9PT0gdGhpcy53ZWVrRW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaHRtbC5wdXNoKCc8L3RyPicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcHJldk1vbnRoLmFkZCgxLCAnZGF5cycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucGlja2VyLmZpbmQoJy5kYXRlcGlja2VyLWRheXMgdGJvZHknKS5lbXB0eSgpLmFwcGVuZChodG1sLmpvaW4oJycpKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBtb250aHMgPSB0aGlzLnBpY2tlci5maW5kKCcuZGF0ZXBpY2tlci1tb250aHMnKVxyXG5cdFx0XHRcdFx0XHQuZmluZCgndGg6ZXEoMSknKVxyXG5cdFx0XHRcdFx0XHRcdC50ZXh0KHllYXIpXHJcblx0XHRcdFx0XHRcdFx0LmVuZCgpXHJcblx0XHRcdFx0XHRcdC5maW5kKCdzcGFuJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFllYXIgPT09IHllYXIpIHtcclxuICAgICAgICAgICAgICAgIG1vbnRocy5lcShjdXJyZW50TW9udGgpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoKCh0aGlzLnN0YXJ0RGF0ZSkgJiYgeWVhciA8IHRoaXMuc3RhcnREYXRlLnllYXIoKSkgfHwgKCh0aGlzLmVuZERhdGUpICYmIHllYXIgPiB0aGlzLmVuZERhdGUueWVhcigpKSkge1xyXG4gICAgICAgICAgICAgICAgbW9udGhzLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgodGhpcy5zdGFydERhdGUpICYmIHllYXIgPT0gdGhpcy5zdGFydERhdGUueWVhcigpKSB7XHJcbiAgICAgICAgICAgICAgICBtb250aHMuc2xpY2UoMCwgdGhpcy5zdGFydERhdGUubW9udGgoKSkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCh0aGlzLmVuZERhdGUpICYmIHllYXIgPT0gdGhpcy5lbmREYXRlLnllYXIoKSkge1xyXG4gICAgICAgICAgICAgICAgbW9udGhzLnNsaWNlKHRoaXMuZW5kRGF0ZS5tb250aCgpICsgMSkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGh0bWwgPSAnJztcclxuICAgICAgICAgICAgeWVhciA9IHBhcnNlSW50KHllYXIgLyAxMCwgMTApICogMTA7XHJcbiAgICAgICAgICAgIHZhciB5ZWFyQ29udCA9IHRoaXMucGlja2VyLmZpbmQoJy5kYXRlcGlja2VyLXllYXJzJylcclxuXHRcdFx0XHRcdFx0XHRcdC5maW5kKCd0aDplcSgxKScpXHJcblx0XHRcdFx0XHRcdFx0XHRcdC50ZXh0KHllYXIgKyAnLScgKyAoeWVhciArIDkpKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQuZW5kKClcclxuXHRcdFx0XHRcdFx0XHRcdC5maW5kKCd0ZCcpO1xyXG4gICAgICAgICAgICB5ZWFyIC09IDE7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAtMTsgaSA8IDExOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPVwieWVhcicgKyAoaSA9PT0gLTEgfHwgaSA9PT0gMTAgPyAnIG9sZCcgOiAnJykgKyAoY3VycmVudFllYXIgPT09IHllYXIgPyAnIGFjdGl2ZScgOiAnJykgKyAoKCh0aGlzLnN0YXJ0RGF0ZSkgJiYgeWVhciA8IHRoaXMuc3RhcnREYXRlLnllYXIoKSkgfHwgKCh0aGlzLmVuZERhdGUpICYmIHllYXIgPiB0aGlzLmVuZERhdGUueWVhcigpKSA/ICcgZGlzYWJsZWQnIDogJycpICsgJ1wiPicgKyB5ZWFyICsgJzwvc3Bhbj4nO1xyXG4gICAgICAgICAgICAgICAgeWVhciArPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHllYXJDb250Lmh0bWwoaHRtbCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdmFyIHRhcmdldCA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ3NwYW4sIHRkLCB0aCcpO1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YXJnZXRbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RoJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0YXJnZXRbMF0uY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzd2l0Y2gnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd01vZGUoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwcmV2JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25leHQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXYgPSBEUEdsb2JhbC5tb2Rlc1t0aGlzLnZpZXdNb2RlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLmFkZChuYXYubmF2U3RlcCAqICh0YXJnZXRbMF0uY2xhc3NOYW1lID09PSAncHJldicgPyAtMSA6IDEpLCBuYXYubmF2Rm5jKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGFuJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXMoJy5kaXNhYmxlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzKCcubW9udGgnKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3TW9udGggPSB0YXJnZXQucGFyZW50KCkuZmluZCgnc3BhbicpLmluZGV4KHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLnZpZXdEYXRlLm1vbnRoKG5ld01vbnRoKTsgSSBkbyBub3QgbGlrZSBob3cgaXQgd29ya3Mgd2hlbiB0aGUgbmV3IG1vbnRoIGhhdmUgbGVzcyBkYXlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5hZGQobmV3TW9udGggLSB0aGlzLnZpZXdEYXRlLm1vbnRoKCksICdtb250aHMnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQodGFyZ2V0LnRleHQoKSwgMTApIHx8IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS55ZWFyKHllYXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdNb2RlICE9PSB0aGlzLm1pblZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93TW9kZSgtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodGhpcy52aWV3RGF0ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHRoaXMudmlld0RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RkJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXMoJy5kaXNhYmxlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzKCcuZGF5JykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF5ID0gcGFyc2VJbnQodGFyZ2V0LnRleHQoKSwgMTApIHx8IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBEYXRlID0gdGhpcy52aWV3RGF0ZS5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXMoJy5vbGQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0ZS5zdGFydE9mKCdtb250aCcpLmFkZCgtMSwgJ2RheXMnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5pcygnLm5ldycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRlLmVuZE9mKCdtb250aCcpLmFkZCgxLCAnZGF5cycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9udGggPSB0ZW1wRGF0ZS5tb250aCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ZWFyID0gdGVtcERhdGUueWVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KG1vbWVudChbeWVhciwgbW9udGgsIGRheV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGRhdGVXaXRoaW5SYW5nZTogZnVuY3Rpb24gKGRhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGUgPj0gdGhpcy5zdGFydERhdGUgJiYgZGF0ZSA8PSB0aGlzLmVuZERhdGU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgbW91c2Vkb3duOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2hvd01vZGU6IGZ1bmN0aW9uIChkaXIpIHtcclxuICAgICAgICAgICAgaWYgKGRpcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3TW9kZSA9IE1hdGgubWF4KHRoaXMubWluVmlld01vZGUsIE1hdGgubWluKDIsIHRoaXMudmlld01vZGUgKyBkaXIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5maW5kKCc+ZGl2JykuaGlkZSgpLmZpbHRlcignLmRhdGVwaWNrZXItJyArIERQR2xvYmFsLm1vZGVzW3RoaXMudmlld01vZGVdLmNsc05hbWUpLnNob3coKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNldEN1c3RvbUNsYXNzZXM6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYWxlbmRhclBsYWNlbWVudCA9PSAnbGVmdCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmFkZENsYXNzKCdkYXRlcGlja2VyLWxlZnQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgJC5mbi5kYXRlcGlja2VyID0gZnVuY3Rpb24gKG9wdGlvbiwgdmFsKSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcclxuICAgICAgICB2YXIgY2hhaW4gPSB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLFxyXG5cdFx0XHRcdGRhdGEgPSAkdGhpcy5kYXRhKCdkYXRlcGlja2VyJyksXHJcblx0XHRcdFx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmIG9wdGlvbjtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBkYXRhW29wdGlvbl0odmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAkdGhpcy5kYXRhKCdkYXRlcGlja2VyJywgKGRhdGEgPSBuZXcgRGF0ZXBpY2tlcih0aGlzLCAkLmV4dGVuZCh7fSwgJC5mbi5kYXRlcGlja2VyLmRlZmF1bHRzLCBvcHRpb25zKSkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA9PSAxID8gcmVzdWx0c1swXVxyXG4gICAgICAgICAgICA6IHJlc3VsdHMubGVuZ3RoID8gcmVzdWx0c1xyXG4gICAgICAgICAgICA6IGNoYWluO1xyXG4gICAgfTtcclxuXHJcbiAgICAkLmZuLmRhdGVwaWNrZXIuZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgY29udGFpbmVyIDogJ2JvZHknXHJcbiAgICB9O1xyXG4gICAgJC5mbi5kYXRlcGlja2VyLkNvbnN0cnVjdG9yID0gRGF0ZXBpY2tlcjtcclxuXHJcbiAgICB2YXIgRFBHbG9iYWwgPSB7XHJcbiAgICAgICAgbW9kZXM6IFtcclxuXHRcdFx0e1xyXG5cdFx0XHQgICAgY2xzTmFtZTogJ2RheXMnLFxyXG5cdFx0XHQgICAgbmF2Rm5jOiAnbW9udGhzJyxcclxuXHRcdFx0ICAgIG5hdlN0ZXA6IDFcclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHQgICAgY2xzTmFtZTogJ21vbnRocycsXHJcblx0XHRcdCAgICBuYXZGbmM6ICd5ZWFycycsXHJcblx0XHRcdCAgICBuYXZTdGVwOiAxXHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0ICAgIGNsc05hbWU6ICd5ZWFycycsXHJcblx0XHRcdCAgICBuYXZGbmM6ICd5ZWFycycsXHJcblx0XHRcdCAgICBuYXZTdGVwOiAxMFxyXG5cdFx0XHR9XSxcclxuICAgICAgICBwYXJzZURhdGU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIHZhciBtbW50ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmb3JtYXQpID09PSAnW29iamVjdCBBcnJheV0nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW1udCA9IG1vbWVudCh2YWx1ZSwgZm9ybWF0LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW1udCA9IG1vbWVudCh2YWx1ZSwgZm9ybWF0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIW1tbnQgfHwgIW1tbnQuaXNWYWxpZCgpKSB7XHJcbiAgICAgICAgICAgICAgICBtbW50ID0gbW9tZW50KHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIW1tbnQgfHwgIW1tbnQuaXNWYWxpZCgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbW1udC5ob3VycygwKS5taW51dGVzKDApLnNlY29uZHMoMCkubWlsbGlzZWNvbmRzKDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaGVhZFRlbXBsYXRlOiAnPHRoZWFkPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8dHI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRoIGNsYXNzPVwicHJldlwiPiZsc2FxdW87PC90aD4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8dGggY29sc3Bhbj1cIjVcIiBjbGFzcz1cInN3aXRjaFwiPjwvdGg+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRoIGNsYXNzPVwibmV4dFwiPiZyc2FxdW87PC90aD4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC90cj4nICtcclxuXHRcdFx0XHRcdFx0JzwvdGhlYWQ+JyxcclxuICAgICAgICBjb250VGVtcGxhdGU6ICc8dGJvZHk+PHRyPjx0ZCBjb2xzcGFuPVwiN1wiPjwvdGQ+PC90cj48L3Rib2R5PidcclxuICAgIH07XHJcbiAgICBEUEdsb2JhbC50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlciBkcm9wZG93bi1tZW51XCI+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWRheXNcIj4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8dGFibGUgY2xhc3M9XCIgdGFibGUtY29uZGVuc2VkXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmhlYWRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdCc8dGJvZHk+PC90Ym9keT4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8L3RhYmxlPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8L2Rpdj4nICtcclxuXHRcdFx0XHRcdFx0XHQnPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItbW9udGhzXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRhYmxlIGNsYXNzPVwidGFibGUtY29uZGVuc2VkXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmhlYWRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmNvbnRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHQnPC90YWJsZT4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC9kaXY+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXllYXJzXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRhYmxlIGNsYXNzPVwidGFibGUtY29uZGVuc2VkXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmhlYWRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmNvbnRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHQnPC90YWJsZT4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC9kaXY+JyArXHJcblx0XHRcdFx0XHRcdCc8L2Rpdj4nO1xyXG5cclxufSh0aGlzLmpRdWVyeSwgdGhpcy5tb21lbnQpO1xufSkuY2FsbChnbG9iYWwsIG1vZHVsZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklsTmpjbWx3ZEhNdmJHbGlMMjF2YldWdWRDMWtZWFJsY0dsamEyVnlMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3UVVGQlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbHh1T3lCdGIyMWxiblFnUFNCbmJHOWlZV3d1Ylc5dFpXNTBJRDBnY21WeGRXbHlaU2hjSW0xdmJXVnVkRndpS1R0Y2JtcFJkV1Z5ZVNBOUlHZHNiMkpoYkM1cVVYVmxjbmtnUFNCeVpYRjFhWEpsS0Z3aWFuRjFaWEo1WENJcE8xeHVPeUIyWVhJZ1gxOWljbTkzYzJWeWFXWjVYM05vYVcxZmNtVnhkV2x5WlY5ZlBYSmxjWFZwY21VN0tHWjFibU4wYVc5dUlHSnliM2R6WlhKcFpubFRhR2x0S0cxdlpIVnNaU3dnWkdWbWFXNWxMQ0J5WlhGMWFYSmxLU0I3WEc0dktpQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDFjY2x4dUlDb2dUVzl0Wlc1MFJHRjBaWEJwWTJ0bGNseHlYRzRnS2lCQ1lYTmxaQ0J2YmlCb2RIUndPaTh2ZDNkM0xtVjVaV052Ymk1eWJ5OWliMjkwYzNSeVlYQXRaR0YwWlhCcFkydGxjbHh5WEc0Z0tpQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDFjY2x4dUlDb2dRMjl3ZVhKcFoyaDBJREl3TVRJZ1FXNWtjbVZ6SUUxdmMyTm9hVzVwWEhKY2JpQXFYSEpjYmlBcUlFeHBZMlZ1YzJWa0lIVnVaR1Z5SUhSb1pTQkJjR0ZqYUdVZ1RHbGpaVzV6WlN3Z1ZtVnljMmx2YmlBeUxqQWdLSFJvWlNCY0lreHBZMlZ1YzJWY0lpazdYSEpjYmlBcUlIbHZkU0J0WVhrZ2JtOTBJSFZ6WlNCMGFHbHpJR1pwYkdVZ1pYaGpaWEIwSUdsdUlHTnZiWEJzYVdGdVkyVWdkMmwwYUNCMGFHVWdUR2xqWlc1elpTNWNjbHh1SUNvZ1dXOTFJRzFoZVNCdlluUmhhVzRnWVNCamIzQjVJRzltSUhSb1pTQk1hV05sYm5ObElHRjBYSEpjYmlBcVhISmNiaUFxSUdoMGRIQTZMeTkzZDNjdVlYQmhZMmhsTG05eVp5OXNhV05sYm5ObGN5OU1TVU5GVGxORkxUSXVNRnh5WEc0Z0tseHlYRzRnS2lCVmJteGxjM01nY21WeGRXbHlaV1FnWW5rZ1lYQndiR2xqWVdKc1pTQnNZWGNnYjNJZ1lXZHlaV1ZrSUhSdklHbHVJSGR5YVhScGJtY3NJSE52Wm5SM1lYSmxYSEpjYmlBcUlHUnBjM1J5YVdKMWRHVmtJSFZ1WkdWeUlIUm9aU0JNYVdObGJuTmxJR2x6SUdScGMzUnlhV0oxZEdWa0lHOXVJR0Z1SUZ3aVFWTWdTVk5jSWlCQ1FWTkpVeXhjY2x4dUlDb2dWMGxVU0U5VlZDQlhRVkpTUVU1VVNVVlRJRTlTSUVOUFRrUkpWRWxQVGxNZ1QwWWdRVTVaSUV0SlRrUXNJR1ZwZEdobGNpQmxlSEJ5WlhOeklHOXlJR2x0Y0d4cFpXUXVYSEpjYmlBcUlGTmxaU0IwYUdVZ1RHbGpaVzV6WlNCbWIzSWdkR2hsSUhOd1pXTnBabWxqSUd4aGJtZDFZV2RsSUdkdmRtVnlibWx1WnlCd1pYSnRhWE56YVc5dWN5QmhibVJjY2x4dUlDb2diR2x0YVhSaGRHbHZibk1nZFc1a1pYSWdkR2hsSUV4cFkyVnVjMlV1WEhKY2JpQXFJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFNBcUwxeHlYRzVjY2x4dUlXWjFibU4wYVc5dUlDZ2tMQ0J0YjIxbGJuUXNJSFZ1WkdWbWFXNWxaQ2tnZTF4eVhHNWNjbHh1SUNBZ0lDOHZJRkJwWTJ0bGNpQnZZbXBsWTNSY2NseHVYSEpjYmlBZ0lDQjJZWElnUkdGMFpYQnBZMnRsY2lBOUlHWjFibU4wYVc5dUlDaGxiR1Z0Wlc1MExDQnZjSFJwYjI1ektTQjdYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NWxiR1Z0Wlc1MElEMGdKQ2hsYkdWdFpXNTBLVHRjY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbUYxZEc5SWFXUmxJRDBnZEhKMVpTQW1KaUFvYjNCMGFXOXVjeTVoZFhSdlNHbGtaU0FoUFQwZ1ptRnNjMlVwSUNZbUlDaDBhR2x6TG1Wc1pXMWxiblF1WkdGMFlTZ25aR0YwWlhCcFkydGxjaTFoZFhSdmFHbGtaU2NwSUNFOVBTQm1ZV3h6WlNrN1hISmNiaUFnSUNBZ0lDQWdkR2hwY3k1bWIzSnRZWFFnUFNCdmNIUnBiMjV6TG1admNtMWhkQ0I4ZkNCMGFHbHpMbVZzWlcxbGJuUXVaR0YwWVNnblpHRjBaWEJwWTJ0bGNpMW1iM0p0WVhRbktTQjhmQ0J0YjIxbGJuUXViRzlqWVd4bFJHRjBZU2dwTG14dmJtZEVZWFJsUm05eWJXRjBLQ2RNSnlrN1hISmNiaUFnSUNBZ0lDQWdkR2hwY3k1allXeGxibVJoY2xCc1lXTmxiV1Z1ZENBOUlHOXdkR2x2Ym5NdVkyRnNaVzVrWVhKUWJHRmpaVzFsYm5RZ2ZId2dkR2hwY3k1bGJHVnRaVzUwTG1SaGRHRW9KMlJoZEdWd2FXTnJaWEl0WTJGc1pXNWtZWEp3YkdGalpXMWxiblFuS1NCOGZDQW5jbWxuYUhRbk8xeHlYRzRnSUNBZ0lDQWdJSFJvYVhNdWNHbGphMlZ5SUQwZ0pDaEVVRWRzYjJKaGJDNTBaVzF3YkdGMFpTbGNjbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUXVZWEJ3Wlc1a1ZHOG9iM0IwYVc5dWN5NWpiMjUwWVdsdVpYSXBYSEpjYmx4MFhIUmNkRngwWEhSY2RGeDBMbTl1S0h0Y2NseHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQWdZMnhwWTJzNklDUXVjSEp2ZUhrb2RHaHBjeTVqYkdsamF5d2dkR2hwY3lrc1hISmNibHgwWEhSY2RGeDBYSFJjZEZ4MElDQWdJRzF2ZFhObFpHOTNiam9nSkM1d2NtOTRlU2gwYUdsekxtMXZkWE5sWkc5M2Jpd2dkR2hwY3lsY2NseHVYSFJjZEZ4MFhIUmNkRngwWEhSOUtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTRrZG1sbGQzQnZjblFnUFNBa0tHOXdkR2x2Ym5NdWRtbGxkM0J2Y25RZ2ZId2diM0IwYVc5dWN5NWpiMjUwWVdsdVpYSXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQjJZWElnYzNSaGNuUkVZWFJsVkdWNGRDQTlJRzl3ZEdsdmJuTXVjM1JoY25SRVlYUmxJSHg4SUhSb2FYTXVaV3hsYldWdWRDNWtZWFJoS0Nka1lYUmxjR2xqYTJWeUxYTjBZWEowWkdGMFpTY3BJSHg4SUhWdVpHVm1hVzVsWkR0Y2NseHVJQ0FnSUNBZ0lDQjBhR2x6TG5OMFlYSjBSR0YwWlNBOUlDaHpkR0Z5ZEVSaGRHVlVaWGgwS1NBL0lFUlFSMnh2WW1Gc0xuQmhjbk5sUkdGMFpTaHpkR0Z5ZEVSaGRHVlVaWGgwTENCMGFHbHpMbVp2Y20xaGRDa2dPaUIxYm1SbFptbHVaV1E3WEhKY2JpQWdJQ0FnSUNBZ2RtRnlJR1Z1WkVSaGRHVlVaWGgwSUQwZ2IzQjBhVzl1Y3k1bGJtUkVZWFJsSUh4OElIUm9hWE11Wld4bGJXVnVkQzVrWVhSaEtDZGtZWFJsY0dsamEyVnlMV1Z1WkdSaGRHVW5LU0I4ZkNCMWJtUmxabWx1WldRN1hISmNiaUFnSUNBZ0lDQWdkR2hwY3k1bGJtUkVZWFJsSUQwZ0tHVnVaRVJoZEdWVVpYaDBLU0EvSUVSUVIyeHZZbUZzTG5CaGNuTmxSR0YwWlNobGJtUkVZWFJsVkdWNGRDd2dkR2hwY3k1bWIzSnRZWFFwSURvZ2RXNWtaV1pwYm1Wa08xeHlYRzRnSUNBZ0lDQWdJSFJvYVhNdWFYTkpibkIxZENBOUlIUm9hWE11Wld4bGJXVnVkQzVwY3lnbmFXNXdkWFFuS1R0Y2NseHVJQ0FnSUNBZ0lDQjBhR2x6TG1OdmJYQnZibVZ1ZENBOUlDRjBhR2x6TG1selNXNXdkWFFnSmlZZ2RHaHBjeTVsYkdWdFpXNTBMbWx6S0NjdVpHRjBaU2NwSUQ4Z2RHaHBjeTVsYkdWdFpXNTBMbVpwYm1Rb0p5NXBibkIxZEMxbmNtOTFjQzFoWkdSdmJpd2dMbUZrWkMxdmJpY3BJRG9nWm1Gc2MyVTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtbHpTVzV3ZFhRcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbTl1S0h0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnZZM1Z6T2lBa0xuQnliM2g1S0hSb2FYTXVjMmh2ZHl3Z2RHaHBjeWtzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWJIVnlPaUFrTG5CeWIzaDVLR1oxYm1OMGFXOXVJQ2hsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWZhR2xrWlNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkSEpwWjJkbGNrTm9ZVzVuWlVSaGRHVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwc0lIUm9hWE1wTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXNXdkWFE2SUNRdWNISnZlSGtvWm5WdVkzUnBiMjRnS0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblZ3WkdGMFpVWnliMjFXWVd4MVpTaDBjblZsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHNJSFJvYVhNcExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhMlY1ZFhBNklDUXVjSEp2ZUhrb1puVnVZM1JwYjI0Z0tHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWlM1clpYbERiMlJsSUQwOUlERXpLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuVndaR0YwWlVaeWIyMVdZV3gxWlNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU3dnZEdocGN5a3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYkdsamF6b2dKQzV3Y205NGVTaDBhR2x6TG5Ob2IzY3NJSFJvYVhNcFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtTnZiWEJ2Ym1WdWRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiMjF3YjI1bGJuUXViMjRvSjJOc2FXTnJKeXdnSkM1d2NtOTRlU2gwYUdsekxuTm9iM2NzSUhSb2FYTXBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1dmJpZ25ZMnhwWTJzbkxDQWtMbkJ5YjNoNUtIUm9hWE11YzJodmR5d2dkR2hwY3lrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUhSb2FYTXViV2x1Vm1sbGQwMXZaR1VnUFNCdmNIUnBiMjV6TG0xcGJsWnBaWGROYjJSbElIeDhJSFJvYVhNdVpXeGxiV1Z1ZEM1a1lYUmhLQ2RrWVhSbGNHbGphMlZ5TFcxcGJuWnBaWGR0YjJSbEp5a2dmSHdnTUR0Y2NseHVJQ0FnSUNBZ0lDQnBaaUFvZEhsd1pXOW1JSFJvYVhNdWJXbHVWbWxsZDAxdlpHVWdQVDA5SUNkemRISnBibWNuS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhOM2FYUmphQ0FvZEdocGN5NXRhVzVXYVdWM1RXOWtaU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyRnpaU0FuYlc5dWRHaHpKenBjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG0xcGJsWnBaWGROYjJSbElEMGdNVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmljbVZoYXp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmhjMlVnSjNsbFlYSnpKenBjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG0xcGJsWnBaWGROYjJSbElEMGdNanRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmljbVZoYXp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUmxabUYxYkhRNlhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXRhVzVXYVdWM1RXOWtaU0E5SURBN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW5KbFlXczdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTUyYVdWM1RXOWtaU0E5SUc5d2RHbHZibk11ZG1sbGQwMXZaR1VnZkh3Z2RHaHBjeTVsYkdWdFpXNTBMbVJoZEdFb0oyUmhkR1Z3YVdOclpYSXRkbWxsZDIxdlpHVW5LU0I4ZkNBd08xeHlYRzRnSUNBZ0lDQWdJR2xtSUNoMGVYQmxiMllnZEdocGN5NTJhV1YzVFc5a1pTQTlQVDBnSjNOMGNtbHVaeWNwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYzNkcGRHTm9JQ2gwYUdsekxuWnBaWGROYjJSbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVhObElDZHRiMjUwYUhNbk9seHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkbWxsZDAxdlpHVWdQU0F4TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0p5WldGck8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMkZ6WlNBbmVXVmhjbk1uT2x4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWRtbGxkMDF2WkdVZ1BTQXlPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSnlaV0ZyTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHVm1ZWFZzZERwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuWnBaWGROYjJSbElEMGdNRHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmljbVZoYXp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0IwYUdsekxuTjBZWEowVm1sbGQwMXZaR1VnUFNCMGFHbHpMblpwWlhkTmIyUmxPMXh5WEc0Z0lDQWdJQ0FnSUhSb2FYTXVkMlZsYTFOMFlYSjBJRDBnYjNCMGFXOXVjeTUzWldWclUzUmhjblFnZkh3Z2RHaHBjeTVsYkdWdFpXNTBMbVJoZEdFb0oyUmhkR1Z3YVdOclpYSXRkMlZsYTNOMFlYSjBKeWtnZkh3Z01EdGNjbHh1SUNBZ0lDQWdJQ0IwYUdsekxuZGxaV3RGYm1RZ1BTQjBhR2x6TG5kbFpXdFRkR0Z5ZENBOVBUMGdNQ0EvSURZZ09pQjBhR2x6TG5kbFpXdFRkR0Z5ZENBdElERTdYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NW1hV3hzUkc5M0tDazdYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NW1hV3hzVFc5dWRHaHpLQ2s3WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTV6WlhSRGRYTjBiMjFEYkdGemMyVnpLQ2s3WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTUxY0dSaGRHVkdjbTl0Vm1Gc2RXVW9LVHRjY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbk5vYjNkTmIyUmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTV5WldaeVpYTm9LQ2s3WEhKY2JpQWdJQ0I5TzF4eVhHNWNjbHh1SUNBZ0lFUmhkR1Z3YVdOclpYSXVjSEp2ZEc5MGVYQmxJRDBnZTF4eVhHNGdJQ0FnSUNBZ0lHTnZibk4wY25WamRHOXlPaUJFWVhSbGNHbGphMlZ5TEZ4eVhHNGdJQ0FnSUNBZ0lHZGxkRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnS0hSb2FYTXViVzl0Wlc1MElDWW1JSFJvYVhNdWJXOXRaVzUwTG1Oc2IyNWxLQ2twTzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmlBZ0lDQWdJQ0FnWjJWMFFYTlVaWGgwT2lCbWRXNWpkR2x2YmlBb1ptOXliV0YwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQmthWE53YkdGNVJtOXliV0YwSUQwZ2RHaHBjeTVtYjNKdFlYUTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hQWW1wbFkzUXVjSEp2ZEc5MGVYQmxMblJ2VTNSeWFXNW5MbU5oYkd3b1pHbHpjR3hoZVVadmNtMWhkQ2tnUFQwOUlDZGJiMkpxWldOMElFRnljbUY1WFNjcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwYzNCc1lYbEdiM0p0WVhRZ1BTQmthWE53YkdGNVJtOXliV0YwV3pCZE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUFvZEdocGN5NXRiMjFsYm5RZ0ppWWdkR2hwY3k1dGIyMWxiblF1Wm05eWJXRjBLR1p2Y20xaGRDQjhmQ0JrYVhOd2JHRjVSbTl5YldGMEtTa2dmSHdnSnljN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dUlDQWdJQ0FnSUNCemFHOTNPaUJtZFc1amRHbHZiaUFvWlNrZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVhWE5KYm5CMWRDQW1KaUIwYUdsekxtVnNaVzFsYm5RdWFYTW9KenBrYVhOaFlteGxaQ2NwS1NCN0lISmxkSFZ5YmpzZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaV3h6WlNCcFppQW9kR2hwY3k1bGJHVnRaVzUwTG1Ob2FXeGtjbVZ1S0NkcGJuQjFkQ2NwTG1sektDYzZaR2x6WVdKc1pXUW5LU2tnZXlCeVpYUjFjbTQ3SUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y0dsamEyVnlMbk5vYjNjb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVvWldsbmFIUWdQU0FvZEdocGN5NWpiMjF3YjI1bGJuUWdKaVlnZEdocGN5NWpiMjF3YjI1bGJuUXViM1YwWlhKSVpXbG5hSFFvS1NrZ2ZId2dkR2hwY3k1bGJHVnRaVzUwTG05MWRHVnlTR1ZwWjJoMEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y0d4aFkyVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdKQ2gzYVc1a2IzY3BMbTl1S0NkeVpYTnBlbVVuTENBa0xuQnliM2g1S0hSb2FYTXVjR3hoWTJVc0lIUm9hWE1wS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdVdWMzUnZjRkJ5YjNCaFoyRjBhVzl1S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxMbkJ5WlhabGJuUkVaV1poZFd4MEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0YwYUdsekxtbHpTVzV3ZFhRcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1FvWkc5amRXMWxiblFwTG05dUtDZHRiM1Z6WldSdmQyNG5MQ0FrTG5CeWIzaDVLSFJvYVhNdWFHbGtaU3dnZEdocGN5a3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Wld4bGJXVnVkQzUwY21sbloyVnlLSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJQ2R6YUc5M0oxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0JmYUdsa1pUb2dablZ1WTNScGIyNGdLR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1YyaGxiaUJuYjJsdVp5Qm1jbTl0SUhSb1pTQnBibkIxZENCMGJ5QjBhR1VnY0dsamEyVnlMQ0JKUlNCb1lXNWtiR1Z6SUhSb1pTQmliSFZ5TDJOc2FXTnJYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJR1YyWlc1MGN5QmthV1ptWlhKbGJuUnNlU0IwYUdGdUlHOTBhR1Z5SUdKeWIzZHpaWEp6TENCcGJpQnpkV05vSUdFZ2QyRjVJSFJvWVhRZ2RHaGxJR0pzZFhKY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1pYWmxiblFnZEhKcFoyZGxjbk1nWVNCb2FXUmxJR0psWm05eVpTQjBhR1VnWTJ4cFkyc2daWFpsYm5RZ1kyRnVJSE4wYjNBZ2NISnZjR0ZuWVhScGIyNHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h1WVhacFoyRjBiM0l1ZFhObGNrRm5aVzUwTG1sdVpHVjRUMllvWENKTlUwbEZJRGd1TUZ3aUtTQStJREFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUIwSUQwZ2RHaHBjeXdnWVhKbmN5QTlJR0Z5WjNWdFpXNTBjenRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1kVzVqZEdsdmJpQmpZVzVqWld4ZmFHbGtaU2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYkdWaGNsUnBiV1Z2ZFhRb2FHbGtaVjkwYVcxbGIzVjBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxMblJoY21kbGRDNW1iMk4xY3lncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhRdWNHbGphMlZ5TG05bVppZ25ZMnhwWTJzbkxDQmpZVzVqWld4ZmFHbGtaU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm5WdVkzUnBiMjRnWkc5ZmFHbGtaU2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwTG1ocFpHVXVZWEJ3Ykhrb2RDd2dZWEpuY3lrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEM1d2FXTnJaWEl1YjJabUtDZGpiR2xqYXljc0lHTmhibU5sYkY5b2FXUmxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuQnBZMnRsY2k1dmJpZ25ZMnhwWTJzbkxDQmpZVzVqWld4ZmFHbGtaU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdhR2xrWlY5MGFXMWxiM1YwSUQwZ2MyVjBWR2x0Wlc5MWRDaGtiMTlvYVdSbExDQXhNREFwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWFHbGtaUzVoY0hCc2VTaDBhR2x6TENCaGNtZDFiV1Z1ZEhNcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdhR2xrWlRvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5CcFkydGxjaTVvYVdSbEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDUW9kMmx1Wkc5M0tTNXZabVlvSjNKbGMybDZaU2NzSUhSb2FYTXVjR3hoWTJVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblpwWlhkTmIyUmxJRDBnZEdocGN5NXpkR0Z5ZEZacFpYZE5iMlJsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTm9iM2ROYjJSbEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doZEdocGN5NXBjMGx1Y0hWMEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FrS0dSdlkzVnRaVzUwS1M1dlptWW9KMjF2ZFhObFpHOTNiaWNzSUhSb2FYTXVhR2xrWlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXlaV1p5WlhOb0tDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Wld4bGJXVnVkQzUwY21sbloyVnlLSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJQ2RvYVdSbEoxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0J5WldaeVpYTm9PaUJtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQm1iM0p0WVhSbFpDQTlJSFJvYVhNdVoyVjBRWE5VWlhoMEtDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lYUm9hWE11YVhOSmJuQjFkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdVkyOXRjRzl1Wlc1MEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbVpwYm1Rb0oybHVjSFYwSnlrdWNISnZjQ2duZG1Gc2RXVW5MQ0JtYjNKdFlYUmxaQ2t1WTJoaGJtZGxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1WkdGMFlTZ25aR0YwWlNjc0lHWnZjbTFoZEdWa0tTNWphR0Z1WjJVb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Wld4bGJXVnVkQzV3Y205d0tDZDJZV3gxWlNjc0lHWnZjbTFoZEdWa0tTNWphR0Z1WjJVb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJSE5sZERvZ1puVnVZM1JwYjI0Z0tHNWxkMFJoZEdVc0lHOXRiV2wwUlhabGJuUXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MWNHUmhkR1VvYm1WM1JHRjBaU3dnYjIxdGFYUkZkbVZ1ZENrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjbVZtY21WemFDZ3BPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUhCc1lXTmxPaUJtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnpiM1Z5WTJWSmRHVnRJRDBnZEdocGN5NWpiMjF3YjI1bGJuUWdQeUIwYUdsekxtTnZiWEJ2Ym1WdWRDQTZJSFJvYVhNdVpXeGxiV1Z1ZER0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHOW1abk5sZENBOUlITnZkWEpqWlVsMFpXMHViMlptYzJWMEtDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2RtbGxkM0J2Y25SUFptWnpaWFFnUFNCMGFHbHpMaVIyYVdWM2NHOXlkQzV2Wm1aelpYUW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhOamNtOXNiRlJ2Y0NBOUlIUm9hWE11SkhacFpYZHdiM0owTG5OamNtOXNiRlJ2Y0NncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhwSmJtUmxlQ0E5SUhCaGNuTmxTVzUwS0hSb2FYTXVaV3hsYldWdWRDNXdZWEpsYm5SektDa3VabWxzZEdWeUtHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQjZTVzVrWlhnZ1BTQWtLSFJvYVhNcExtTnpjeWduZWkxcGJtUmxlQ2NwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhwSmJtUmxlQ0FoUFNBbllYVjBieWNnSmlZZ2VrbHVaR1Y0SUNFOUlDY3dKenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU2t1Wm1seWMzUW9LUzVqYzNNb0ozb3RhVzVrWlhnbktTa2dLeUF4TUR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtTmhiR1Z1WkdGeVVHeGhZMlZ0Wlc1MElEMDlJQ2RzWldaMEp5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXdhV05yWlhJdVkzTnpLSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBiM0E2SUc5bVpuTmxkQzUwYjNBZ0t5QjBhR2x6TG1obGFXZG9kQ3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNaV1owT2lCdlptWnpaWFF1YkdWbWRDQXJJSE52ZFhKalpVbDBaVzFiTUYwdWIyWm1jMlYwVjJsa2RHZ2dMU0IwYUdsekxuQnBZMnRsY2xzd1hTNXZabVp6WlhSWGFXUjBhRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbkJwWTJ0bGNpNWpjM01vZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJ2Y0RvZ2IyWm1jMlYwTG5SdmNDQXJJSFJvYVhNdWFHVnBaMmgwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hsWm5RNklHOW1abk5sZEM1c1pXWjBMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIcEpibVJsZUNBNklIcEpibVJsZUZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNGdJQ0FnSUNBZ0lHeGhjM1JXWVd4MVpUb2diblZzYkN4Y2NseHVJQ0FnSUNBZ0lDQjBjbWxuWjJWeVEyaGhibWRsUkdGMFpUb2dablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2JtVjNWbUZzZFdVZ1BTQjBhR2x6TG0xdmJXVnVkQ0EvSUhSb2FYTXViVzl0Wlc1MExuWmhiSFZsVDJZb0tTQTZJRzUxYkd3N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHVaWGRXWVd4MVpTQWhQU0IwYUdsekxteGhjM1JXWVd4MVpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXNZWE4wVm1Gc2RXVWdQU0J1WlhkV1lXeDFaVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNTBjbWxuWjJWeUtIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGVYQmxPaUFuWTJoaGJtZGxSR0YwWlNkY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtRjFkRzlJYVdSbEtWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1b2FXUmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1SUNBZ0lDQWdJQ0IxY0dSaGRHVkdjbTl0Vm1Gc2RXVTZJR1oxYm1OMGFXOXVJQ2h2YlcxcGRFVjJaVzUwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkWEJrWVhSbEtIUm9hWE11YVhOSmJuQjFkQ0EvSUhSb2FYTXVaV3hsYldWdWRDNXdjbTl3S0NkMllXeDFaU2NwSURvZ2RHaHBjeTVsYkdWdFpXNTBMbVJoZEdFb0oyUmhkR1VuS1N3Z2IyMXRhWFJGZG1WdWRDazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnZFhCa1lYUmxPaUJtZFc1amRHbHZiaUFvYm1WM1JHRjBaU3dnYjIxdGFYUkZkbVZ1ZENrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdiM0pwWjJsdVlXeFdZV3gxWlNBOUlIUm9hWE11Ylc5dFpXNTBJRDhnZEdocGN5NXRiMjFsYm5RdWRtRnNkV1ZQWmlncElEb2diblZzYkR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Ylc5dFpXNTBJRDBnUkZCSGJHOWlZV3d1Y0dGeWMyVkVZWFJsS0c1bGQwUmhkR1VzSUhSb2FYTXVabTl5YldGMEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCdVpYZFdZV3gxWlNBOUlIUm9hWE11Ylc5dFpXNTBJRDhnZEdocGN5NXRiMjFsYm5RdWRtRnNkV1ZQWmlncElEb2diblZzYkR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doZEdocGN5NTJhV1YzUkdGMFpTQjhmQ0J2Y21sbmFXNWhiRlpoYkhWbElDRTlJRzVsZDFaaGJIVmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblpwWlhkRVlYUmxJRDBnZEdocGN5NW5aWFFvS1NCOGZDQnRiMjFsYm5Rb0tTNW9iM1Z5Y3lnd0tTNXRhVzUxZEdWektEQXBMbk5sWTI5dVpITW9NQ2t1Yldsc2JHbHpaV052Ym1SektEQXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW1hV3hzS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1ZEhKcFoyZGxjaWg3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkSGx3WlRvZ0oyTm9ZVzVuWlVSaGRHVkpibk4wWVc1MEoxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGdmJXMXBkRVYyWlc1MEtWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MGNtbG5aMlZ5UTJoaGJtZGxSR0YwWlNncE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJR1pwYkd4RWIzYzZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHUnZkME51ZENBOUlIUm9hWE11ZDJWbGExTjBZWEowTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2FIUnRiQ0E5SUNjOGRISStKenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdSaGVYTk5hVzRnUFNBa0xuQnliM2g1S0cxdmJXVnVkQzVzYjJOaGJHVkVZWFJoS0NrdWQyVmxhMlJoZVhOTmFXNHNJRzF2YldWdWRDNXNiMk5oYkdWRVlYUmhLQ2twTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IzYUdsc1pTQW9aRzkzUTI1MElEd2dkR2hwY3k1M1pXVnJVM1JoY25RZ0t5QTNLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCb2RHMXNJQ3M5SUNjOGRHZ2dZMnhoYzNNOVhDSmtiM2RjSWo0bklDc2daR0Y1YzAxcGJpaHRiMjFsYm5Rb0tTNWtZWGtvS0dSdmQwTnVkQ3NyS1NBbElEY3BLU0FySUNjOEwzUm9QaWM3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhSFJ0YkNBclBTQW5QQzkwY2o0bk8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbkJwWTJ0bGNpNW1hVzVrS0NjdVpHRjBaWEJwWTJ0bGNpMWtZWGx6SUhSb1pXRmtKeWt1WVhCd1pXNWtLR2gwYld3cE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJR1pwYkd4TmIyNTBhSE02SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR2gwYld3Z1BTQW5KenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdrZ1BTQXdPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnYlc5dWRHaHpVMmh2Y25RZ1BTQWtMbkJ5YjNoNUtHMXZiV1Z1ZEM1c2IyTmhiR1ZFWVhSaEtDa3ViVzl1ZEdoelUyaHZjblFzSUcxdmJXVnVkQzVzYjJOaGJHVkVZWFJoS0NrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCM2FHbHNaU0FvYVNBOElERXlLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCb2RHMXNJQ3M5SUNjOGMzQmhiaUJqYkdGemN6MWNJbTF2Ym5Sb1hDSStKeUFySUcxdmJuUm9jMU5vYjNKMEtHMXZiV1Z1ZENncExuTjBZWEowVDJZb0oyMXZiblJvSnlrdWJXOXVkR2dvYVNzcktTa2dLeUFuUEM5emNHRnVQaWM3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1d2FXTnJaWEl1Wm1sdVpDZ25MbVJoZEdWd2FXTnJaWEl0Ylc5dWRHaHpJSFJrSnlrdVlYQndaVzVrS0doMGJXd3BPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUdacGJHdzZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlIbGxZWElnUFNCMGFHbHpMblpwWlhkRVlYUmxMbmxsWVhJb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzF2Ym5Sb0lEMGdkR2hwY3k1MmFXVjNSR0YwWlM1dGIyNTBhQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1kzVnljbVZ1ZEUxdmJXVnVkQ0E5SUhSb2FYTXVaMlYwS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQmpkWEp5Wlc1MFJHRjBaU0E5SUdOMWNuSmxiblJOYjIxbGJuUWdQeUJqZFhKeVpXNTBUVzl0Wlc1MExuWmhiSFZsVDJZb0tTQTZJRzUxYkd3N0lDOHZWRTlFVHpvZ2RYTmxJR1JwWm1aY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHTjFjbkpsYm5SWlpXRnlJRDBnWTNWeWNtVnVkRTF2YldWdWRDQS9JR04xY25KbGJuUk5iMjFsYm5RdWVXVmhjaWdwSURvZ2JuVnNiRHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdOMWNuSmxiblJOYjI1MGFDQTlJR04xY25KbGJuUk5iMjFsYm5RZ1B5QmpkWEp5Wlc1MFRXOXRaVzUwTG0xdmJuUm9LQ2tnT2lCdWRXeHNPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXdhV05yWlhJdVptbHVaQ2duTG1SaGRHVndhV05yWlhJdFpHRjVjeUIwYURwbGNTZ3hLU2NwWEhKY2JseDBYSFJjZEZ4MFhIUmNkQzUwWlhoMEtHMXZiV1Z1ZEM1c2IyTmhiR1ZFWVhSaEtDa3ViVzl1ZEdoektHMXZiV1Z1ZENncExtMXZiblJvS0cxdmJuUm9LU2tnS3lBbklDY2dLeUI1WldGeUtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCd2NtVjJUVzl1ZEdnZ1BTQnRiMjFsYm5Rb1czbGxZWElzSUcxdmJuUm9MQ0F4WFNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhCeVpYWk5iMjUwYUM1emRXSjBjbUZqZENneExDQW5aR0Y1SnlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhCeVpYWk5iMjUwYUM1a1lYa29jSEpsZGsxdmJuUm9MbVJoZVNncElDMGdLSEJ5WlhaTmIyNTBhQzVrWVhrb0tTQXRJSFJvYVhNdWQyVmxhMU4wWVhKMElDc2dOeWtnSlNBM0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2VkU5RVR6b2dkWE5sSUdScFptWmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzVsZUhSTmIyNTBhRlpoYkNBOUlHMXZiV1Z1ZENod2NtVjJUVzl1ZEdncExtRmtaQ2cwTWl3Z0oyUmhlWE1uS1M1MllXeDFaVTltS0NrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQm9kRzFzSUQwZ1cxMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJqYkhOT1lXMWxPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMMVJQUkU4NklIVnpaU0JrYVdabVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhkb2FXeGxJQ2h3Y21WMlRXOXVkR2d1ZG1Gc2RXVlBaaWdwSUR3Z2JtVjRkRTF2Ym5Sb1ZtRnNLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9jSEpsZGsxdmJuUm9MbVJoZVNncElEMDlQU0IwYUdsekxuZGxaV3RUZEdGeWRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHaDBiV3d1Y0hWemFDZ25QSFJ5UGljcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJ4elRtRnRaU0E5SUNjbk8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeTlVVDBSUE9pQjFjMlVnWkdsbVpseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hCeVpYWk5iMjUwYUM1NVpXRnlLQ2tnUENCNVpXRnlJSHg4SUNod2NtVjJUVzl1ZEdndWVXVmhjaWdwSUQwOUlIbGxZWElnSmlZZ2NISmxkazF2Ym5Sb0xtMXZiblJvS0NrZ1BDQnRiMjUwYUNrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamJITk9ZVzFsSUNzOUlDY2diMnhrSnp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9jSEpsZGsxdmJuUm9MbmxsWVhJb0tTQStJSGxsWVhJZ2ZId2dLSEJ5WlhaTmIyNTBhQzU1WldGeUtDa2dQVDBnZVdWaGNpQW1KaUJ3Y21WMlRXOXVkR2d1Ylc5dWRHZ29LU0ErSUcxdmJuUm9LU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05zYzA1aGJXVWdLejBnSnlCdVpYY25PMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OVVUMFJQT2lCMWMyVWdaR2xtWmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEJ5WlhaTmIyNTBhQzUyWVd4MVpVOW1LQ2tnUFQwOUlHTjFjbkpsYm5SRVlYUmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMnh6VG1GdFpTQXJQU0FuSUdGamRHbDJaU2M3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvY0hKbGRrMXZiblJvTG5aaGJIVmxUMllvS1NBOElIUm9hWE11YzNSaGNuUkVZWFJsSUh4OElIQnlaWFpOYjI1MGFDNTJZV3gxWlU5bUtDa2dQaUIwYUdsekxtVnVaRVJoZEdVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamJITk9ZVzFsSUNzOUlDY2daR2x6WVdKc1pXUW5PMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FIUnRiQzV3ZFhOb0tDYzhkR1FnWTJ4aGMzTTlYQ0prWVhrbklDc2dZMnh6VG1GdFpTQXJJQ2RjSWo0bklDc2djSEpsZGsxdmJuUm9MbVJoZEdVb0tTQXJJQ2M4TDNSa1BpY3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIQnlaWFpOYjI1MGFDNWtZWGtvS1NBOVBUMGdkR2hwY3k1M1pXVnJSVzVrS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYUhSdGJDNXdkWE5vS0NjOEwzUnlQaWNwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSEpsZGsxdmJuUm9MbUZrWkNneExDQW5aR0Y1Y3ljcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjR2xqYTJWeUxtWnBibVFvSnk1a1lYUmxjR2xqYTJWeUxXUmhlWE1nZEdKdlpIa25LUzVsYlhCMGVTZ3BMbUZ3Y0dWdVpDaG9kRzFzTG1wdmFXNG9KeWNwS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ0YjI1MGFITWdQU0IwYUdsekxuQnBZMnRsY2k1bWFXNWtLQ2N1WkdGMFpYQnBZMnRsY2kxdGIyNTBhSE1uS1Z4eVhHNWNkRngwWEhSY2RGeDBYSFF1Wm1sdVpDZ25kR2c2WlhFb01Ta25LVnh5WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQzUwWlhoMEtIbGxZWElwWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwTG1WdVpDZ3BYSEpjYmx4MFhIUmNkRngwWEhSY2RDNW1hVzVrS0NkemNHRnVKeWt1Y21WdGIzWmxRMnhoYzNNb0oyRmpkR2wyWlNjcExuSmxiVzkyWlVOc1lYTnpLQ2RrYVhOaFlteGxaQ2NwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1kzVnljbVZ1ZEZsbFlYSWdQVDA5SUhsbFlYSXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxdmJuUm9jeTVsY1NoamRYSnlaVzUwVFc5dWRHZ3BMbUZrWkVOc1lYTnpLQ2RoWTNScGRtVW5LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvS0NoMGFHbHpMbk4wWVhKMFJHRjBaU2tnSmlZZ2VXVmhjaUE4SUhSb2FYTXVjM1JoY25SRVlYUmxMbmxsWVhJb0tTa2dmSHdnS0NoMGFHbHpMbVZ1WkVSaGRHVXBJQ1ltSUhsbFlYSWdQaUIwYUdsekxtVnVaRVJoZEdVdWVXVmhjaWdwS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiVzl1ZEdoekxtRmtaRU5zWVhOektDZGthWE5oWW14bFpDY3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2dvZEdocGN5NXpkR0Z5ZEVSaGRHVXBJQ1ltSUhsbFlYSWdQVDBnZEdocGN5NXpkR0Z5ZEVSaGRHVXVlV1ZoY2lncEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0YjI1MGFITXVjMnhwWTJVb01Dd2dkR2hwY3k1emRHRnlkRVJoZEdVdWJXOXVkR2dvS1NrdVlXUmtRMnhoYzNNb0oyUnBjMkZpYkdWa0p5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ2gwYUdsekxtVnVaRVJoZEdVcElDWW1JSGxsWVhJZ1BUMGdkR2hwY3k1bGJtUkVZWFJsTG5sbFlYSW9LU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXOXVkR2h6TG5Oc2FXTmxLSFJvYVhNdVpXNWtSR0YwWlM1dGIyNTBhQ2dwSUNzZ01Ta3VZV1JrUTJ4aGMzTW9KMlJwYzJGaWJHVmtKeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdoMGJXd2dQU0FuSnp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZVdWaGNpQTlJSEJoY25ObFNXNTBLSGxsWVhJZ0x5QXhNQ3dnTVRBcElDb2dNVEE3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCNVpXRnlRMjl1ZENBOUlIUm9hWE11Y0dsamEyVnlMbVpwYm1Rb0p5NWtZWFJsY0dsamEyVnlMWGxsWVhKekp5bGNjbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkQzVtYVc1a0tDZDBhRHBsY1NneEtTY3BYSEpjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEM1MFpYaDBLSGxsWVhJZ0t5QW5MU2NnS3lBb2VXVmhjaUFySURrcEtWeHlYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFF1Wlc1a0tDbGNjbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkQzVtYVc1a0tDZDBaQ2NwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I1WldGeUlDMDlJREU3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR1p2Y2lBb2RtRnlJR2tnUFNBdE1Uc2dhU0E4SURFeE95QnBLeXNwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHaDBiV3dnS3owZ0p6eHpjR0Z1SUdOc1lYTnpQVndpZVdWaGNpY2dLeUFvYVNBOVBUMGdMVEVnZkh3Z2FTQTlQVDBnTVRBZ1B5QW5JRzlzWkNjZ09pQW5KeWtnS3lBb1kzVnljbVZ1ZEZsbFlYSWdQVDA5SUhsbFlYSWdQeUFuSUdGamRHbDJaU2NnT2lBbkp5a2dLeUFvS0NoMGFHbHpMbk4wWVhKMFJHRjBaU2tnSmlZZ2VXVmhjaUE4SUhSb2FYTXVjM1JoY25SRVlYUmxMbmxsWVhJb0tTa2dmSHdnS0NoMGFHbHpMbVZ1WkVSaGRHVXBJQ1ltSUhsbFlYSWdQaUIwYUdsekxtVnVaRVJoZEdVdWVXVmhjaWdwS1NBL0lDY2daR2x6WVdKc1pXUW5JRG9nSnljcElDc2dKMXdpUGljZ0t5QjVaV0Z5SUNzZ0p6d3ZjM0JoYmo0bk8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdlV1ZoY2lBclBTQXhPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIbGxZWEpEYjI1MExtaDBiV3dvYUhSdGJDazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnWTJ4cFkyczZJR1oxYm1OMGFXOXVJQ2hsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdVdWMzUnZjRkJ5YjNCaFoyRjBhVzl1S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdVdWNISmxkbVZ1ZEVSbFptRjFiSFFvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlIUmhjbWRsZENBOUlDUW9aUzUwWVhKblpYUXBMbU5zYjNObGMzUW9KM053WVc0c0lIUmtMQ0IwYUNjcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR0Z5WjJWMExteGxibWQwYUNBOVBUMGdNU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzZHBkR05vSUNoMFlYSm5aWFJiTUYwdWJtOWtaVTVoYldVdWRHOU1iM2RsY2tOaGMyVW9LU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ0ozUm9KenBjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNkcGRHTm9JQ2gwWVhKblpYUmJNRjB1WTJ4aGMzTk9ZVzFsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVhObElDZHpkMmwwWTJnbk9seHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJodmQwMXZaR1VvTVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1luSmxZV3M3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZWE5sSUNkd2NtVjJKenBjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmhjMlVnSjI1bGVIUW5PbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCdVlYWWdQU0JFVUVkc2IySmhiQzV0YjJSbGMxdDBhR2x6TG5acFpYZE5iMlJsWFR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblpwWlhkRVlYUmxMbUZrWkNodVlYWXVibUYyVTNSbGNDQXFJQ2gwWVhKblpYUmJNRjB1WTJ4aGMzTk9ZVzFsSUQwOVBTQW5jSEpsZGljZ1B5QXRNU0E2SURFcExDQnVZWFl1Ym1GMlJtNWpLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtWnBiR3dvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbkpsWm5KbGMyZ29LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCallYTmxJQ2R6Y0dGdUp6cGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMFlYSm5aWFF1YVhNb0p5NWthWE5oWW14bFpDY3BLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdGeVoyVjBMbWx6S0NjdWJXOXVkR2duS1NrZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2JtVjNUVzl1ZEdnZ1BTQjBZWEpuWlhRdWNHRnlaVzUwS0NrdVptbHVaQ2duYzNCaGJpY3BMbWx1WkdWNEtIUmhjbWRsZENrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OTBhR2x6TG5acFpYZEVZWFJsTG0xdmJuUm9LRzVsZDAxdmJuUm9LVHNnU1NCa2J5QnViM1FnYkdsclpTQm9iM2NnYVhRZ2QyOXlhM01nZDJobGJpQjBhR1VnYm1WM0lHMXZiblJvSUdoaGRtVWdiR1Z6Y3lCa1lYbHpYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MmFXVjNSR0YwWlM1aFpHUW9ibVYzVFc5dWRHZ2dMU0IwYUdsekxuWnBaWGRFWVhSbExtMXZiblJvS0Nrc0lDZHRiMjUwYUhNbktUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUI1WldGeUlEMGdjR0Z5YzJWSmJuUW9kR0Z5WjJWMExuUmxlSFFvS1N3Z01UQXBJSHg4SURBN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTUyYVdWM1JHRjBaUzU1WldGeUtIbGxZWElwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMblpwWlhkTmIyUmxJQ0U5UFNCMGFHbHpMbTFwYmxacFpYZE5iMlJsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6YUc5M1RXOWtaU2d0TVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WlhRb2RHaHBjeTUyYVdWM1JHRjBaU3dnZEhKMVpTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlYwS0hSb2FYTXVkbWxsZDBSaGRHVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0p5WldGck8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOaGMyVWdKM1JrSnpwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0YwWVhKblpYUXVhWE1vSnk1a2FYTmhZbXhsWkNjcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR0Z5WjJWMExtbHpLQ2N1WkdGNUp5a3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1pHRjVJRDBnY0dGeWMyVkpiblFvZEdGeVoyVjBMblJsZUhRb0tTd2dNVEFwSUh4OElERTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhSbGJYQkVZWFJsSUQwZ2RHaHBjeTUyYVdWM1JHRjBaUzVqYkc5dVpTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMFlYSm5aWFF1YVhNb0p5NXZiR1FuS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwWlcxd1JHRjBaUzV6ZEdGeWRFOW1LQ2R0YjI1MGFDY3BMbUZrWkNndE1Td2dKMlJoZVhNbktUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFJoY21kbGRDNXBjeWduTG01bGR5Y3BLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUmxiWEJFWVhSbExtVnVaRTltS0NkdGIyNTBhQ2NwTG1Ga1pDZ3hMQ0FuWkdGNWN5Y3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2JXOXVkR2dnUFNCMFpXMXdSR0YwWlM1dGIyNTBhQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQjVaV0Z5SUQwZ2RHVnRjRVJoZEdVdWVXVmhjaWdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlYwS0cxdmJXVnVkQ2hiZVdWaGNpd2diVzl1ZEdnc0lHUmhlVjBwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lHUmhkR1ZYYVhSb2FXNVNZVzVuWlRvZ1puVnVZM1JwYjI0Z0tHUmhkR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1JoZEdVZ1BqMGdkR2hwY3k1emRHRnlkRVJoZEdVZ0ppWWdaR0YwWlNBOFBTQjBhR2x6TG1WdVpFUmhkR1U3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ2JXOTFjMlZrYjNkdU9pQm1kVzVqZEdsdmJpQW9aU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JsTG5OMGIzQlFjbTl3WVdkaGRHbHZiaWdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JsTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ2MyaHZkMDF2WkdVNklHWjFibU4wYVc5dUlDaGthWElwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHUnBjaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTUyYVdWM1RXOWtaU0E5SUUxaGRHZ3ViV0Y0S0hSb2FYTXViV2x1Vm1sbGQwMXZaR1VzSUUxaGRHZ3ViV2x1S0RJc0lIUm9hWE11ZG1sbGQwMXZaR1VnS3lCa2FYSXBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5CcFkydGxjaTVtYVc1a0tDYytaR2wySnlrdWFHbGtaU2dwTG1acGJIUmxjaWduTG1SaGRHVndhV05yWlhJdEp5QXJJRVJRUjJ4dlltRnNMbTF2WkdWelczUm9hWE11ZG1sbGQwMXZaR1ZkTG1Oc2MwNWhiV1VwTG5Ob2IzY29LVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzRnSUNBZ0lDQWdJSE5sZEVOMWMzUnZiVU5zWVhOelpYTTZJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTVqWVd4bGJtUmhjbEJzWVdObGJXVnVkQ0E5UFNBbmJHVm1kQ2NwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y0dsamEyVnlMbUZrWkVOc1lYTnpLQ2RrWVhSbGNHbGphMlZ5TFd4bFpuUW5LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUgwN1hISmNibHh5WEc0Z0lDQWdKQzVtYmk1a1lYUmxjR2xqYTJWeUlEMGdablZ1WTNScGIyNGdLRzl3ZEdsdmJpd2dkbUZzS1NCN1hISmNiaUFnSUNBZ0lDQWdkbUZ5SUhKbGMzVnNkSE1nUFNCYlhUdGNjbHh1SUNBZ0lDQWdJQ0IyWVhJZ1kyaGhhVzRnUFNCMGFHbHpMbVZoWTJnb1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnSkhSb2FYTWdQU0FrS0hSb2FYTXBMRnh5WEc1Y2RGeDBYSFJjZEdSaGRHRWdQU0FrZEdocGN5NWtZWFJoS0Nka1lYUmxjR2xqYTJWeUp5a3NYSEpjYmx4MFhIUmNkRngwYjNCMGFXOXVjeUE5SUhSNWNHVnZaaUJ2Y0hScGIyNGdQVDA5SUNkdlltcGxZM1FuSUNZbUlHOXdkR2x2Ymp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCdmNIUnBiMjRnUFQwOUlDZHpkSEpwYm1jbktTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pHRjBZU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCeVpYTjFiSFFnUFNCa1lYUmhXMjl3ZEdsdmJsMG9kbUZzS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RIbHdaVzltSUhKbGMzVnNkQ0FoUFQwZ0ozVnVaR1ZtYVc1bFpDY3BYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RITXVjSFZ6YUNoeVpYTjFiSFFwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tDRmtZWFJoS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWtkR2hwY3k1a1lYUmhLQ2RrWVhSbGNHbGphMlZ5Snl3Z0tHUmhkR0VnUFNCdVpYY2dSR0YwWlhCcFkydGxjaWgwYUdsekxDQWtMbVY0ZEdWdVpDaDdmU3dnSkM1bWJpNWtZWFJsY0dsamEyVnlMbVJsWm1GMWJIUnpMQ0J2Y0hScGIyNXpLU2twS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUnpMbXhsYm1kMGFDQTlQU0F4SUQ4Z2NtVnpkV3gwYzFzd1hWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBNklISmxjM1ZzZEhNdWJHVnVaM1JvSUQ4Z2NtVnpkV3gwYzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0E2SUdOb1lXbHVPMXh5WEc0Z0lDQWdmVHRjY2x4dVhISmNiaUFnSUNBa0xtWnVMbVJoZEdWd2FXTnJaWEl1WkdWbVlYVnNkSE1nUFNCN1hISmNiaUFnSUNBZ0lDQWdZMjl1ZEdGcGJtVnlJRG9nSjJKdlpIa25YSEpjYmlBZ0lDQjlPMXh5WEc0Z0lDQWdKQzVtYmk1a1lYUmxjR2xqYTJWeUxrTnZibk4wY25WamRHOXlJRDBnUkdGMFpYQnBZMnRsY2p0Y2NseHVYSEpjYmlBZ0lDQjJZWElnUkZCSGJHOWlZV3dnUFNCN1hISmNiaUFnSUNBZ0lDQWdiVzlrWlhNNklGdGNjbHh1WEhSY2RGeDBlMXh5WEc1Y2RGeDBYSFFnSUNBZ1kyeHpUbUZ0WlRvZ0oyUmhlWE1uTEZ4eVhHNWNkRngwWEhRZ0lDQWdibUYyUm01ak9pQW5iVzl1ZEdoekp5eGNjbHh1WEhSY2RGeDBJQ0FnSUc1aGRsTjBaWEE2SURGY2NseHVYSFJjZEZ4MGZTeGNjbHh1WEhSY2RGeDBlMXh5WEc1Y2RGeDBYSFFnSUNBZ1kyeHpUbUZ0WlRvZ0oyMXZiblJvY3ljc1hISmNibHgwWEhSY2RDQWdJQ0J1WVhaR2JtTTZJQ2Q1WldGeWN5Y3NYSEpjYmx4MFhIUmNkQ0FnSUNCdVlYWlRkR1Z3T2lBeFhISmNibHgwWEhSY2RIMHNYSEpjYmx4MFhIUmNkSHRjY2x4dVhIUmNkRngwSUNBZ0lHTnNjMDVoYldVNklDZDVaV0Z5Y3ljc1hISmNibHgwWEhSY2RDQWdJQ0J1WVhaR2JtTTZJQ2Q1WldGeWN5Y3NYSEpjYmx4MFhIUmNkQ0FnSUNCdVlYWlRkR1Z3T2lBeE1GeHlYRzVjZEZ4MFhIUjlYU3hjY2x4dUlDQWdJQ0FnSUNCd1lYSnpaVVJoZEdVNklHWjFibU4wYVc5dUlDaDJZV3gxWlN3Z1ptOXliV0YwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnRiVzUwSUQwZ2JuVnNiRHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUIyWVd4MVpTQTlQVDBnWENKemRISnBibWRjSWlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0U5aWFtVmpkQzV3Y205MGIzUjVjR1V1ZEc5VGRISnBibWN1WTJGc2JDaG1iM0p0WVhRcElEMDlQU0FuVzI5aWFtVmpkQ0JCY25KaGVWMG5LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiVzF1ZENBOUlHMXZiV1Z1ZENoMllXeDFaU3dnWm05eWJXRjBMQ0IwY25WbEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXMXVkQ0E5SUcxdmJXVnVkQ2gyWVd4MVpTd2dabTl5YldGMEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVcxdGJuUWdmSHdnSVcxdGJuUXVhWE5XWVd4cFpDZ3BLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdGJXNTBJRDBnYlc5dFpXNTBLSFpoYkhWbEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JVzF0Ym5RZ2ZId2dJVzF0Ym5RdWFYTldZV3hwWkNncEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdiblZzYkR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdiVzF1ZEM1b2IzVnljeWd3S1M1dGFXNTFkR1Z6S0RBcExuTmxZMjl1WkhNb01Da3ViV2xzYkdselpXTnZibVJ6S0RBcE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JpQWdJQ0FnSUNBZ2FHVmhaRlJsYlhCc1lYUmxPaUFuUEhSb1pXRmtQaWNnSzF4eVhHNWNkRngwWEhSY2RGeDBYSFJjZENjOGRISStKeUFyWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRblBIUm9JR05zWVhOelBWd2ljSEpsZGx3aVBpWnNjMkZ4ZFc4N1BDOTBhRDRuSUN0Y2NseHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDYzhkR2dnWTI5c2MzQmhiajFjSWpWY0lpQmpiR0Z6Y3oxY0luTjNhWFJqYUZ3aVBqd3ZkR2crSnlBclhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUW5QSFJvSUdOc1lYTnpQVndpYm1WNGRGd2lQaVp5YzJGeGRXODdQQzkwYUQ0bklDdGNjbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUW5QQzkwY2o0bklDdGNjbHh1WEhSY2RGeDBYSFJjZEZ4MEp6d3ZkR2hsWVdRK0p5eGNjbHh1SUNBZ0lDQWdJQ0JqYjI1MFZHVnRjR3hoZEdVNklDYzhkR0p2WkhrK1BIUnlQangwWkNCamIyeHpjR0Z1UFZ3aU4xd2lQand2ZEdRK1BDOTBjajQ4TDNSaWIyUjVQaWRjY2x4dUlDQWdJSDA3WEhKY2JpQWdJQ0JFVUVkc2IySmhiQzUwWlcxd2JHRjBaU0E5SUNjOFpHbDJJR05zWVhOelBWd2laR0YwWlhCcFkydGxjaUJrY205d1pHOTNiaTF0Wlc1MVhDSStKeUFyWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwSnp4a2FYWWdZMnhoYzNNOVhDSmtZWFJsY0dsamEyVnlMV1JoZVhOY0lqNG5JQ3RjY2x4dVhIUmNkRngwWEhSY2RGeDBYSFJjZENjOGRHRmliR1VnWTJ4aGMzTTlYQ0lnZEdGaWJHVXRZMjl1WkdWdWMyVmtYQ0krSnlBclhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkRVJRUjJ4dlltRnNMbWhsWVdSVVpXMXdiR0YwWlNBclhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkQ2M4ZEdKdlpIaytQQzkwWW05a2VUNG5JQ3RjY2x4dVhIUmNkRngwWEhSY2RGeDBYSFJjZENjOEwzUmhZbXhsUGljZ0sxeHlYRzVjZEZ4MFhIUmNkRngwWEhSY2RDYzhMMlJwZGo0bklDdGNjbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUW5QR1JwZGlCamJHRnpjejFjSW1SaGRHVndhV05yWlhJdGJXOXVkR2h6WENJK0p5QXJYSEpjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFFuUEhSaFlteGxJR05zWVhOelBWd2lkR0ZpYkdVdFkyOXVaR1Z1YzJWa1hDSStKeUFyWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RFUlFSMnh2WW1Gc0xtaGxZV1JVWlcxd2JHRjBaU0FyWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RFUlFSMnh2WW1Gc0xtTnZiblJVWlcxd2JHRjBaU0FyWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRblBDOTBZV0pzWlQ0bklDdGNjbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUW5QQzlrYVhZK0p5QXJYSEpjYmx4MFhIUmNkRngwWEhSY2RGeDBKenhrYVhZZ1kyeGhjM005WENKa1lYUmxjR2xqYTJWeUxYbGxZWEp6WENJK0p5QXJYSEpjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFFuUEhSaFlteGxJR05zWVhOelBWd2lkR0ZpYkdVdFkyOXVaR1Z1YzJWa1hDSStKeUFyWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RFUlFSMnh2WW1Gc0xtaGxZV1JVWlcxd2JHRjBaU0FyWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RFUlFSMnh2WW1Gc0xtTnZiblJVWlcxd2JHRjBaU0FyWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRblBDOTBZV0pzWlQ0bklDdGNjbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUW5QQzlrYVhZK0p5QXJYSEpjYmx4MFhIUmNkRngwWEhSY2RDYzhMMlJwZGo0bk8xeHlYRzVjY2x4dWZTaDBhR2x6TG1wUmRXVnllU3dnZEdocGN5NXRiMjFsYm5RcE8xeHVmU2t1WTJGc2JDaG5iRzlpWVd3c0lHMXZaSFZzWlN3Z2RXNWtaV1pwYm1Wa0xDQjFibVJsWm1sdVpXUXBPMXh1SWwxOSIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcblxuOyBKUXVlcnkgPSBnbG9iYWwuSlF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbjsgdmFyIF9fYnJvd3NlcmlmeV9zaGltX3JlcXVpcmVfXz1yZXF1aXJlOyhmdW5jdGlvbiBicm93c2VyaWZ5U2hpbShtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIGRlZmluZSwgYnJvd3NlcmlmeV9zaGltX19kZWZpbmVfX21vZHVsZV9fZXhwb3J0X18pIHtcbi8vIG5hbWU6IHNhbW15XHJcbi8vIHZlcnNpb246IDAuNy41XHJcblxyXG4vLyBTYW1teS5qcyAvIGh0dHA6Ly9zYW1teWpzLm9yZ1xyXG5cclxuKGZ1bmN0aW9uKGZhY3Rvcnkpe1xyXG4gIC8vIFN1cHBvcnQgbW9kdWxlIGxvYWRpbmcgc2NlbmFyaW9zXHJcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCl7XHJcbiAgICAvLyBBTUQgQW5vbnltb3VzIE1vZHVsZVxyXG4gICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBObyBtb2R1bGUgbG9hZGVyIChwbGFpbiA8c2NyaXB0PiB0YWcpIC0gcHV0IGRpcmVjdGx5IGluIGdsb2JhbCBuYW1lc3BhY2VcclxuICAgIGpRdWVyeS5zYW1teSA9IHdpbmRvdy5TYW1teSA9IGZhY3RvcnkoalF1ZXJ5KTtcclxuICB9XHJcbn0pKGZ1bmN0aW9uKCQpe1xyXG5cclxuICB2YXIgU2FtbXksXHJcbiAgICAgIFBBVEhfUkVQTEFDRVIgPSBcIihbXlxcL10rKVwiLFxyXG4gICAgICBQQVRIX05BTUVfTUFUQ0hFUiA9IC86KFtcXHdcXGRdKykvZyxcclxuICAgICAgUVVFUllfU1RSSU5HX01BVENIRVIgPSAvXFw/KFteI10qKT8kLyxcclxuICAgICAgLy8gbWFpbmx5IGZvciBtYWtpbmcgYGFyZ3VtZW50c2AgYW4gQXJyYXlcclxuICAgICAgX21ha2VBcnJheSA9IGZ1bmN0aW9uKG5vbmFycmF5KSB7IHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChub25hcnJheSk7IH0sXHJcbiAgICAgIC8vIGJvcnJvd2VkIGZyb20galF1ZXJ5XHJcbiAgICAgIF9pc0Z1bmN0aW9uID0gZnVuY3Rpb24oIG9iaiApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCI7IH0sXHJcbiAgICAgIF9pc0FycmF5ID0gZnVuY3Rpb24oIG9iaiApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgQXJyYXldXCI7IH0sXHJcbiAgICAgIF9pc1JlZ0V4cCA9IGZ1bmN0aW9uKCBvYmogKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjsgfSxcclxuICAgICAgX2RlY29kZSA9IGZ1bmN0aW9uKCBzdHIgKSB7IHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoKHN0ciB8fCAnJykucmVwbGFjZSgvXFwrL2csICcgJykpOyB9LFxyXG4gICAgICBfZW5jb2RlID0gZW5jb2RlVVJJQ29tcG9uZW50LFxyXG4gICAgICBfZXNjYXBlSFRNTCA9IGZ1bmN0aW9uKHMpIHtcclxuICAgICAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoLyYoPyFcXHcrOykvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIF9yb3V0ZVdyYXBwZXIgPSBmdW5jdGlvbih2ZXJiKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMucm91dGUuYXBwbHkodGhpcywgW3ZlcmJdLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfSxcclxuICAgICAgX3RlbXBsYXRlX2NhY2hlID0ge30sXHJcbiAgICAgIF9oYXNfaGlzdG9yeSA9ICEhKHdpbmRvdy5oaXN0b3J5ICYmIGhpc3RvcnkucHVzaFN0YXRlKSxcclxuICAgICAgbG9nZ2VycyA9IFtdO1xyXG5cclxuXHJcbiAgLy8gYFNhbW15YCAoYWxzbyBhbGlhc2VkIGFzICQuc2FtbXkpIGlzIG5vdCBvbmx5IHRoZSBuYW1lc3BhY2UgZm9yIGFcclxuICAvLyBudW1iZXIgb2YgcHJvdG90eXBlcywgaXRzIGFsc28gYSB0b3AgbGV2ZWwgbWV0aG9kIHRoYXQgYWxsb3dzIGZvciBlYXN5XHJcbiAgLy8gY3JlYXRpb24vbWFuYWdlbWVudCBvZiBgU2FtbXkuQXBwbGljYXRpb25gIGluc3RhbmNlcy4gVGhlcmUgYXJlIGFcclxuICAvLyBudW1iZXIgb2YgZGlmZmVyZW50IGZvcm1zIGZvciBgU2FtbXkoKWAgYnV0IGVhY2ggcmV0dXJucyBhbiBpbnN0YW5jZVxyXG4gIC8vIG9mIGBTYW1teS5BcHBsaWNhdGlvbmAuIFdoZW4gYSBuZXcgaW5zdGFuY2UgaXMgY3JlYXRlZCB1c2luZ1xyXG4gIC8vIGBTYW1teWAgaXQgaXMgYWRkZWQgdG8gYW4gT2JqZWN0IGNhbGxlZCBgU2FtbXkuYXBwc2AuIFRoaXNcclxuICAvLyBwcm92aWRlcyBmb3IgYW4gZWFzeSB3YXkgdG8gZ2V0IGF0IGV4aXN0aW5nIFNhbW15IGFwcGxpY2F0aW9ucy4gT25seSBvbmVcclxuICAvLyBpbnN0YW5jZSBpcyBhbGxvd2VkIHBlciBgZWxlbWVudF9zZWxlY3RvcmAgc28gd2hlbiBjYWxsaW5nXHJcbiAgLy8gYFNhbW15KCdzZWxlY3RvcicpYCBtdWx0aXBsZSB0aW1lcywgdGhlIGZpcnN0IHRpbWUgd2lsbCBjcmVhdGVcclxuICAvLyB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBmb2xsb3dpbmcgdGltZXMgd2lsbCBleHRlbmQgdGhlIGFwcGxpY2F0aW9uXHJcbiAgLy8gYWxyZWFkeSBhZGRlZCB0byB0aGF0IHNlbGVjdG9yLlxyXG4gIC8vXHJcbiAgLy8gIyMjIEV4YW1wbGVcclxuICAvL1xyXG4gIC8vICAgICAgLy8gcmV0dXJucyB0aGUgYXBwIGF0ICNtYWluIG9yIGEgbmV3IGFwcFxyXG4gIC8vICAgICAgU2FtbXkoJyNtYWluJylcclxuICAvL1xyXG4gIC8vICAgICAgLy8gZXF1aXZhbGVudCB0byBcIm5ldyBTYW1teS5BcHBsaWNhdGlvblwiLCBleGNlcHQgYXBwZW5kcyB0byBhcHBzXHJcbiAgLy8gICAgICBTYW1teSgpO1xyXG4gIC8vICAgICAgU2FtbXkoZnVuY3Rpb24oKSB7IC4uLiB9KTtcclxuICAvL1xyXG4gIC8vICAgICAgLy8gZXh0ZW5kcyB0aGUgYXBwIGF0ICcjbWFpbicgd2l0aCBmdW5jdGlvbi5cclxuICAvLyAgICAgIFNhbW15KCcjbWFpbicsIGZ1bmN0aW9uKCkgeyAuLi4gfSk7XHJcbiAgLy9cclxuICBTYW1teSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIGFyZ3MgPSBfbWFrZUFycmF5KGFyZ3VtZW50cyksXHJcbiAgICAgICAgYXBwLCBzZWxlY3RvcjtcclxuICAgIFNhbW15LmFwcHMgPSBTYW1teS5hcHBzIHx8IHt9O1xyXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwIHx8IGFyZ3NbMF0gJiYgX2lzRnVuY3Rpb24oYXJnc1swXSkpIHsgLy8gU2FtbXkoKVxyXG4gICAgICByZXR1cm4gU2FtbXkuYXBwbHkoU2FtbXksIFsnYm9keSddLmNvbmNhdChhcmdzKSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAoc2VsZWN0b3IgPSBhcmdzLnNoaWZ0KCkpID09ICdzdHJpbmcnKSB7IC8vIFNhbW15KCcjbWFpbicpXHJcbiAgICAgIGFwcCA9IFNhbW15LmFwcHNbc2VsZWN0b3JdIHx8IG5ldyBTYW1teS5BcHBsaWNhdGlvbigpO1xyXG4gICAgICBhcHAuZWxlbWVudF9zZWxlY3RvciA9IHNlbGVjdG9yO1xyXG4gICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgJC5lYWNoKGFyZ3MsIGZ1bmN0aW9uKGksIHBsdWdpbikge1xyXG4gICAgICAgICAgYXBwLnVzZShwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGlmIHRoZSBzZWxlY3RvciBjaGFuZ2VzIG1ha2Ugc3VyZSB0aGUgcmVmZXJlbmNlIGluIFNhbW15LmFwcHMgY2hhbmdlc1xyXG4gICAgICBpZiAoYXBwLmVsZW1lbnRfc2VsZWN0b3IgIT0gc2VsZWN0b3IpIHtcclxuICAgICAgICBkZWxldGUgU2FtbXkuYXBwc1tzZWxlY3Rvcl07XHJcbiAgICAgIH1cclxuICAgICAgU2FtbXkuYXBwc1thcHAuZWxlbWVudF9zZWxlY3Rvcl0gPSBhcHA7XHJcbiAgICAgIHJldHVybiBhcHA7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgU2FtbXkuVkVSU0lPTiA9ICcwLjcuNSc7XHJcblxyXG4gIC8vIEFkZCB0byB0aGUgZ2xvYmFsIGxvZ2dlciBwb29sLiBUYWtlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhblxyXG4gIC8vIHVua25vd24gbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgc2hvdWxkIHByaW50IHRoZW0gb3Igc2VuZCB0aGVtIHNvbWV3aGVyZVxyXG4gIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbHdheXMgYSB0aW1lc3RhbXAuXHJcbiAgU2FtbXkuYWRkTG9nZ2VyID0gZnVuY3Rpb24obG9nZ2VyKSB7XHJcbiAgICBsb2dnZXJzLnB1c2gobG9nZ2VyKTtcclxuICB9O1xyXG5cclxuICAvLyBTZW5kcyBhIGxvZyBtZXNzYWdlIHRvIGVhY2ggbG9nZ2VyIGxpc3RlZCBpbiB0aGUgZ2xvYmFsXHJcbiAgLy8gbG9nZ2VycyBwb29sLiBDYW4gdGFrZSBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50cy5cclxuICAvLyBBbHNvIHByZWZpeGVzIHRoZSBhcmd1bWVudHMgd2l0aCBhIHRpbWVzdGFtcC5cclxuICBTYW1teS5sb2cgPSBmdW5jdGlvbigpICB7XHJcbiAgICB2YXIgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKTtcclxuICAgIGFyZ3MudW5zaGlmdChcIltcIiArIERhdGUoKSArIFwiXVwiKTtcclxuICAgICQuZWFjaChsb2dnZXJzLCBmdW5jdGlvbihpLCBsb2dnZXIpIHtcclxuICAgICAgbG9nZ2VyLmFwcGx5KFNhbW15LCBhcmdzKTtcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIGlmICh0eXBlb2Ygd2luZG93LmNvbnNvbGUgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93LmNvbnNvbGUubG9nID09PSAnZnVuY3Rpb24nICYmIF9pc0Z1bmN0aW9uKHdpbmRvdy5jb25zb2xlLmxvZy5hcHBseSkpIHtcclxuICAgICAgU2FtbXkuYWRkTG9nZ2VyKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZy5hcHBseSh3aW5kb3cuY29uc29sZSwgYXJndW1lbnRzKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBTYW1teS5hZGRMb2dnZXIoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgd2luZG93LmNvbnNvbGUubG9nKGFyZ3VtZW50cyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIFNhbW15LmFkZExvZ2dlcihmdW5jdGlvbigpIHtcclxuICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgJC5leHRlbmQoU2FtbXksIHtcclxuICAgIG1ha2VBcnJheTogX21ha2VBcnJheSxcclxuICAgIGlzRnVuY3Rpb246IF9pc0Z1bmN0aW9uLFxyXG4gICAgaXNBcnJheTogX2lzQXJyYXlcclxuICB9KTtcclxuXHJcbiAgLy8gU2FtbXkuT2JqZWN0IGlzIHRoZSBiYXNlIGZvciBhbGwgb3RoZXIgU2FtbXkgY2xhc3Nlcy4gSXQgcHJvdmlkZXMgc29tZSB1c2VmdWxcclxuICAvLyBmdW5jdGlvbmFsaXR5LCBpbmNsdWRpbmcgY2xvbmluZywgaXRlcmF0aW5nLCBldGMuXHJcbiAgU2FtbXkuT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7IC8vIGNvbnN0cnVjdG9yXHJcbiAgICByZXR1cm4gJC5leHRlbmQodGhpcywgb2JqIHx8IHt9KTtcclxuICB9O1xyXG5cclxuICAkLmV4dGVuZChTYW1teS5PYmplY3QucHJvdG90eXBlLCB7XHJcblxyXG4gICAgLy8gRXNjYXBlIEhUTUwgaW4gc3RyaW5nLCB1c2UgaW4gdGVtcGxhdGVzIHRvIHByZXZlbnQgc2NyaXB0IGluamVjdGlvbi5cclxuICAgIC8vIEFsc28gYWxpYXNlZCBhcyBgaCgpYFxyXG4gICAgZXNjYXBlSFRNTDogX2VzY2FwZUhUTUwsXHJcbiAgICBoOiBfZXNjYXBlSFRNTCxcclxuXHJcbiAgICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgb2JqZWN0IHdpdGggRnVuY3Rpb25zIHJlbW92ZWQuXHJcbiAgICB0b0hhc2g6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIganNvbiA9IHt9O1xyXG4gICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24oayx2KSB7XHJcbiAgICAgICAgaWYgKCFfaXNGdW5jdGlvbih2KSkge1xyXG4gICAgICAgICAganNvbltrXSA9IHY7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGpzb247XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJlbmRlcnMgYSBzaW1wbGUgSFRNTCB2ZXJzaW9uIG9mIHRoaXMgT2JqZWN0cyBhdHRyaWJ1dGVzLlxyXG4gICAgLy8gRG9lcyBub3QgcmVuZGVyIGZ1bmN0aW9ucy5cclxuICAgIC8vIEZvciBleGFtcGxlLiBHaXZlbiB0aGlzIFNhbW15Lk9iamVjdDpcclxuICAgIC8vXHJcbiAgICAvLyAgICAgdmFyIHMgPSBuZXcgU2FtbXkuT2JqZWN0KHtmaXJzdF9uYW1lOiAnU2FtbXknLCBsYXN0X25hbWU6ICdEYXZpcyBKci4nfSk7XHJcbiAgICAvLyAgICAgcy50b0hUTUwoKVxyXG4gICAgLy8gICAgIC8vPT4gJzxzdHJvbmc+Zmlyc3RfbmFtZTwvc3Ryb25nPiBTYW1teTxiciAvPjxzdHJvbmc+bGFzdF9uYW1lPC9zdHJvbmc+IERhdmlzIEpyLjxiciAvPidcclxuICAgIC8vXHJcbiAgICB0b0hUTUw6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgZGlzcGxheSA9IFwiXCI7XHJcbiAgICAgICQuZWFjaCh0aGlzLCBmdW5jdGlvbihrLCB2KSB7XHJcbiAgICAgICAgaWYgKCFfaXNGdW5jdGlvbih2KSkge1xyXG4gICAgICAgICAgZGlzcGxheSArPSBcIjxzdHJvbmc+XCIgKyBrICsgXCI8L3N0cm9uZz4gXCIgKyB2ICsgXCI8YnIgLz5cIjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlzcGxheTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBrZXlzIGZvciB0aGlzIG9iamVjdC4gSWYgYGF0dHJpYnV0ZXNfb25seWBcclxuICAgIC8vIGlzIHRydWUgd2lsbCBub3QgcmV0dXJuIGtleXMgdGhhdCBtYXAgdG8gYSBgZnVuY3Rpb24oKWBcclxuICAgIGtleXM6IGZ1bmN0aW9uKGF0dHJpYnV0ZXNfb25seSkge1xyXG4gICAgICB2YXIga2V5cyA9IFtdO1xyXG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSB7XHJcbiAgICAgICAgaWYgKCFfaXNGdW5jdGlvbih0aGlzW3Byb3BlcnR5XSkgfHwgIWF0dHJpYnV0ZXNfb25seSkge1xyXG4gICAgICAgICAga2V5cy5wdXNoKHByb3BlcnR5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIENoZWNrcyBpZiB0aGUgb2JqZWN0IGhhcyBhIHZhbHVlIGF0IGBrZXlgIGFuZCB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgZW1wdHlcclxuICAgIGhhczogZnVuY3Rpb24oa2V5KSB7XHJcbiAgICAgIHJldHVybiB0aGlzW2tleV0gJiYgJC50cmltKHRoaXNba2V5XS50b1N0cmluZygpKSAhPT0gJyc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGNvbnZlbmllbmNlIG1ldGhvZCB0byBqb2luIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50XHJcbiAgICAvLyBieSB0aGUgZmlyc3QgYXJndW1lbnQgLSB1c2VmdWwgZm9yIG1ha2luZyBwYXRoc1xyXG4gICAgam9pbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBhcmdzID0gX21ha2VBcnJheShhcmd1bWVudHMpO1xyXG4gICAgICB2YXIgZGVsaW1pdGVyID0gYXJncy5zaGlmdCgpO1xyXG4gICAgICByZXR1cm4gYXJncy5qb2luKGRlbGltaXRlcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFNob3J0Y3V0IHRvIFNhbW15LmxvZ1xyXG4gICAgbG9nOiBmdW5jdGlvbigpIHtcclxuICAgICAgU2FtbXkubG9nLmFwcGx5KFNhbW15LCBhcmd1bWVudHMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxyXG4gICAgLy8gaWYgYGluY2x1ZGVfZnVuY3Rpb25zYCBpcyB0cnVlLCBpdCB3aWxsIGFsc28gdG9TdHJpbmcoKSB0aGVcclxuICAgIC8vIG1ldGhvZHMgb2YgdGhpcyBvYmplY3QuIEJ5IGRlZmF1bHQgb25seSBwcmludHMgdGhlIGF0dHJpYnV0ZXMuXHJcbiAgICB0b1N0cmluZzogZnVuY3Rpb24oaW5jbHVkZV9mdW5jdGlvbnMpIHtcclxuICAgICAgdmFyIHMgPSBbXTtcclxuICAgICAgJC5lYWNoKHRoaXMsIGZ1bmN0aW9uKGssIHYpIHtcclxuICAgICAgICBpZiAoIV9pc0Z1bmN0aW9uKHYpIHx8IGluY2x1ZGVfZnVuY3Rpb25zKSB7XHJcbiAgICAgICAgICBzLnB1c2goJ1wiJyArIGsgKyAnXCI6ICcgKyB2LnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBcIlNhbW15Lk9iamVjdDoge1wiICsgcy5qb2luKCcsJykgKyBcIn1cIjtcclxuICAgIH1cclxuICB9KTtcclxuXHJcblxyXG4gIC8vIFJldHVybiB3aGV0aGVyIHRoZSBldmVudCB0YXJnZXRzIHRoaXMgd2luZG93LlxyXG4gIFNhbW15LnRhcmdldElzVGhpc1dpbmRvdyA9IGZ1bmN0aW9uIHRhcmdldElzVGhpc1dpbmRvdyhldmVudCwgdGFnTmFtZSkge1xyXG4gICAgdmFyIHRhcmdldEVsZW1lbnQgPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCh0YWdOYW1lKTtcclxuICAgIGlmICh0YXJnZXRFbGVtZW50Lmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gdHJ1ZTsgfVxyXG5cclxuICAgIHZhciB0YXJnZXRXaW5kb3cgPSB0YXJnZXRFbGVtZW50LmF0dHIoJ3RhcmdldCcpO1xyXG4gICAgaWYgKCF0YXJnZXRXaW5kb3cgfHwgdGFyZ2V0V2luZG93ID09PSB3aW5kb3cubmFtZSB8fCB0YXJnZXRXaW5kb3cgPT09ICdfc2VsZicpIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIGlmICh0YXJnZXRXaW5kb3cgPT09ICdfYmxhbmsnKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgaWYgKHRhcmdldFdpbmRvdyA9PT0gJ3RvcCcgJiYgd2luZG93ID09PSB3aW5kb3cudG9wKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfTtcclxuXHJcblxyXG4gIC8vIFRoZSBEZWZhdWx0TG9jYXRpb25Qcm94eSBpcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBwcm94eSBmb3IgYWxsIFNhbW15IGFwcGxpY2F0aW9ucy5cclxuICAvLyBBIGxvY2F0aW9uIHByb3h5IGlzIGEgcHJvdG90eXBlIHRoYXQgY29uZm9ybXMgdG8gYSBzaW1wbGUgaW50ZXJmYWNlLiBUaGUgcHVycG9zZVxyXG4gIC8vIG9mIGEgbG9jYXRpb24gcHJveHkgaXMgdG8gbm90aWZ5IHRoZSBTYW1teS5BcHBsaWNhdGlvbiBpdHMgYm91bmQgdG8gd2hlbiB0aGUgbG9jYXRpb25cclxuICAvLyBvciAnZXh0ZXJuYWwgc3RhdGUnIGNoYW5nZXMuXHJcbiAgLy9cclxuICAvLyBUaGUgYERlZmF1bHRMb2NhdGlvblByb3h5YCB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IHdpbmRvdyBhbmRcclxuICAvLyBpcyBhbHNvIGFibGUgdG8gc2V0IHRoZSBwYXRoIGJhc2VkIG9uIGNoYW5nZXMgaW4gdGhlIGFwcGxpY2F0aW9uLiBJdCBkb2VzIHRoaXMgYnlcclxuICAvLyB1c2luZyBkaWZmZXJlbnQgbWV0aG9kcyBkZXBlbmRpbmcgb24gd2hhdCBpcyBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgYnJvd3Nlci4gSW5cclxuICAvLyB0aGUgbGF0ZXN0IGFuZCBncmVhdGVzdCBicm93c2VycyBpdCB1c2VkIHRoZSBIVE1MNSBIaXN0b3J5IEFQSSBhbmQgdGhlIGBwdXNoU3RhdGVgXHJcbiAgLy8gYHBvcFN0YXRlYCBldmVudHMvbWV0aG9kcy4gVGhpcyBhbGxvd3MgeW91IHRvIHVzZSBTYW1teSB0byBzZXJ2ZSBhIHNpdGUgYmVoaW5kIG5vcm1hbFxyXG4gIC8vIFVSSSBwYXRocyBhcyBvcHBvc2VkIHRvIHRoZSBvbGRlciBkZWZhdWx0IG9mIGhhc2ggKCMpIGJhc2VkIHJvdXRpbmcuIEJlY2F1c2UgdGhlIHNlcnZlclxyXG4gIC8vIGNhbiBpbnRlcnByZXQgdGhlIGNoYW5nZWQgcGF0aCBvbiBhIHJlZnJlc2ggb3IgcmUtZW50cnksIHRob3VnaCwgaXQgcmVxdWlyZXMgYWRkaXRpb25hbFxyXG4gIC8vIHN1cHBvcnQgb24gdGhlIHNlcnZlciBzaWRlLiBJZiB5b3UnZCBsaWtlIHRvIGZvcmNlIGRpc2FibGUgSFRNTDUgaGlzdG9yeSBzdXBwb3J0LCBwbGVhc2VcclxuICAvLyB1c2UgdGhlIGBkaXNhYmxlX3B1c2hfc3RhdGVgIHNldHRpbmcgb24gYFNhbW15LkFwcGxpY2F0aW9uYC4gSWYgcHVzaFN0YXRlIHN1cHBvcnRcclxuICAvLyBpcyBlbmFibGVkLCBgRGVmYXVsdExvY2F0aW9uUHJveHlgIGFsc28gYmluZHMgdG8gYWxsIGxpbmtzIG9uIHRoZSBwYWdlLiBJZiBhIGxpbmsgaXMgY2xpY2tlZFxyXG4gIC8vIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBzZXQgb2Ygcm91dGVzLCB0aGUgVVJMIGlzIGNoYW5nZWQgdXNpbmcgcHVzaFN0YXRlIGluc3RlYWQgb2ZcclxuICAvLyBmdWxseSBzZXR0aW5nIHRoZSBsb2NhdGlvbiBhbmQgdGhlIGFwcCBpcyBub3RpZmllZCBvZiB0aGUgY2hhbmdlLlxyXG4gIC8vXHJcbiAgLy8gSWYgdGhlIGJyb3dzZXIgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBIVE1MNSBIaXN0b3J5LCBgRGVmYXVsdExvY2F0aW9uUHJveHlgIGF1dG9tYXRpY2FsbHlcclxuICAvLyBmYWxscyBiYWNrIHRvIHRoZSBvbGRlciBoYXNoIGJhc2VkIHJvdXRpbmcuIFRoZSBuZXdlc3QgYnJvd3NlcnMgKElFLCBTYWZhcmkgPiA0LCBGRiA+PSAzLjYpXHJcbiAgLy8gc3VwcG9ydCBhICdvbmhhc2hjaGFuZ2UnIERPTSBldmVudCwgdGhhdHMgZmlyZWQgd2hlbmV2ZXIgdGhlIGxvY2F0aW9uLmhhc2ggY2hhbmdlcy5cclxuICAvLyBJbiB0aGlzIHNpdHVhdGlvbiB0aGUgRGVmYXVsdExvY2F0aW9uUHJveHkganVzdCBiaW5kcyB0byB0aGlzIGV2ZW50IGFuZCBkZWxlZ2F0ZXMgaXQgdG9cclxuICAvLyB0aGUgYXBwbGljYXRpb24uIEluIHRoZSBjYXNlIG9mIG9sZGVyIGJyb3dzZXJzIGEgcG9sbGVyIGlzIHNldCB1cCB0byB0cmFjayBjaGFuZ2VzIHRvIHRoZVxyXG4gIC8vIGhhc2guXHJcbiAgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkgPSBmdW5jdGlvbihhcHAsIHJ1bl9pbnRlcnZhbF9ldmVyeSkge1xyXG4gICAgdGhpcy5hcHAgPSBhcHA7XHJcbiAgICAvLyBzZXQgaXMgbmF0aXZlIHRvIGZhbHNlIGFuZCBzdGFydCB0aGUgcG9sbGVyIGltbWVkaWF0ZWx5XHJcbiAgICB0aGlzLmlzX25hdGl2ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5oYXNfaGlzdG9yeSA9IF9oYXNfaGlzdG9yeTtcclxuICAgIHRoaXMuX3N0YXJ0UG9sbGluZyhydW5faW50ZXJ2YWxfZXZlcnkpO1xyXG4gIH07XHJcblxyXG4gIFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5LmZ1bGxQYXRoID0gZnVuY3Rpb24obG9jYXRpb25fb2JqKSB7XHJcbiAgIC8vIEJ5cGFzcyB0aGUgYHdpbmRvdy5sb2NhdGlvbi5oYXNoYCBhdHRyaWJ1dGUuICBJZiBhIHF1ZXN0aW9uIG1hcmtcclxuICAgIC8vIGFwcGVhcnMgaW4gdGhlIGhhc2ggSUU2IHdpbGwgc3RyaXAgaXQgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nXHJcbiAgICAvLyBjaGFyYWN0ZXJzIGZyb20gYHdpbmRvdy5sb2NhdGlvbi5oYXNoYC5cclxuICAgIHZhciBtYXRjaGVzID0gbG9jYXRpb25fb2JqLnRvU3RyaW5nKCkubWF0Y2goL15bXiNdKigjLispJC8pO1xyXG4gICAgdmFyIGhhc2ggPSBtYXRjaGVzID8gbWF0Y2hlc1sxXSA6ICcnO1xyXG4gICAgcmV0dXJuIFtsb2NhdGlvbl9vYmoucGF0aG5hbWUsIGxvY2F0aW9uX29iai5zZWFyY2gsIGhhc2hdLmpvaW4oJycpO1xyXG4gIH07XHJcbiQuZXh0ZW5kKFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5LnByb3RvdHlwZSAsIHtcclxuICAgIC8vIGJpbmQgdGhlIHByb3h5IGV2ZW50cyB0byB0aGUgY3VycmVudCBhcHAuXHJcbiAgICBiaW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIHByb3h5ID0gdGhpcywgYXBwID0gdGhpcy5hcHAsIGxwID0gU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHk7XHJcbiAgICAgICQod2luZG93KS5iaW5kKCdoYXNoY2hhbmdlLicgKyB0aGlzLmFwcC5ldmVudE5hbWVzcGFjZSgpLCBmdW5jdGlvbihlLCBub25fbmF0aXZlKSB7XHJcbiAgICAgICAgLy8gaWYgd2UgcmVjZWl2ZSBhIG5hdGl2ZSBoYXNoIGNoYW5nZSBldmVudCwgc2V0IHRoZSBwcm94eSBhY2NvcmRpbmdseVxyXG4gICAgICAgIC8vIGFuZCBzdG9wIHBvbGxpbmdcclxuICAgICAgICBpZiAocHJveHkuaXNfbmF0aXZlID09PSBmYWxzZSAmJiAhbm9uX25hdGl2ZSkge1xyXG4gICAgICAgICAgcHJveHkuaXNfbmF0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGxwLl9pbnRlcnZhbCk7XHJcbiAgICAgICAgICBscC5faW50ZXJ2YWwgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhcHAudHJpZ2dlcignbG9jYXRpb24tY2hhbmdlZCcpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKF9oYXNfaGlzdG9yeSAmJiAhYXBwLmRpc2FibGVfcHVzaF9zdGF0ZSkge1xyXG4gICAgICAgIC8vIGJpbmQgdG8gcG9wc3RhdGVcclxuICAgICAgICAkKHdpbmRvdykuYmluZCgncG9wc3RhdGUuJyArIHRoaXMuYXBwLmV2ZW50TmFtZXNwYWNlKCksIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgIGFwcC50cmlnZ2VyKCdsb2NhdGlvbi1jaGFuZ2VkJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gYmluZCB0byBsaW5rIGNsaWNrcyB0aGF0IGhhdmUgcm91dGVzXHJcbiAgICAgICAgJChkb2N1bWVudCkuZGVsZWdhdGUoJ2EnLCAnY2xpY2suaGlzdG9yeS0nICsgdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKSwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8IGUubWV0YUtleSB8fCBlLmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFyIGZ1bGxfcGF0aCA9IGxwLmZ1bGxQYXRoKHRoaXMpLFxyXG4gICAgICAgICAgICAvLyBHZXQgYW5jaG9yJ3MgaG9zdCBuYW1lIGluIGEgY3Jvc3MgYnJvd3NlciBjb21wYXRpYmxlIHdheS5cclxuICAgICAgICAgICAgLy8gSUUgbG9vc2VzIGhvc3RuYW1lIHByb3BlcnR5IHdoZW4gc2V0dGluZyBocmVmIGluIEpTXHJcbiAgICAgICAgICAgIC8vIHdpdGggYSByZWxhdGl2ZSBVUkwsIGUuZy4gYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLFwiL3doYXRldmVyXCIpLlxyXG4gICAgICAgICAgICAvLyBDaXJjdW12ZW50IHRoaXMgcHJvYmxlbSBieSBjcmVhdGluZyBhIG5ldyBsaW5rIHdpdGggZ2l2ZW4gVVJMIGFuZFxyXG4gICAgICAgICAgICAvLyBxdWVyeWluZyB0aGF0IGZvciBhIGhvc3RuYW1lLlxyXG4gICAgICAgICAgICBob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgPyB0aGlzLmhvc3RuYW1lIDogZnVuY3Rpb24gKGEpIHtcclxuICAgICAgICAgICAgICB2YXIgbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgICAgICAgIGwuaHJlZiA9IGEuaHJlZjtcclxuICAgICAgICAgICAgICByZXR1cm4gbC5ob3N0bmFtZTtcclxuICAgICAgICAgICAgfSh0aGlzKTtcclxuXHJcbiAgICAgICAgICBpZiAoaG9zdG5hbWUgPT0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICYmXHJcbiAgICAgICAgICAgICAgYXBwLmxvb2t1cFJvdXRlKCdnZXQnLCBmdWxsX3BhdGgpICYmXHJcbiAgICAgICAgICAgICAgU2FtbXkudGFyZ2V0SXNUaGlzV2luZG93KGUsICdhJykpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBwcm94eS5zZXRMb2NhdGlvbihmdWxsX3BhdGgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFscC5fYmluZGluZ3MpIHtcclxuICAgICAgICBscC5fYmluZGluZ3MgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGxwLl9iaW5kaW5ncysrO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyB1bmJpbmQgdGhlIHByb3h5IGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IGFwcFxyXG4gICAgdW5iaW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgJCh3aW5kb3cpLnVuYmluZCgnaGFzaGNoYW5nZS4nICsgdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKSk7XHJcbiAgICAgICQod2luZG93KS51bmJpbmQoJ3BvcHN0YXRlLicgKyB0aGlzLmFwcC5ldmVudE5hbWVzcGFjZSgpKTtcclxuICAgICAgJChkb2N1bWVudCkudW5kZWxlZ2F0ZSgnYScsICdjbGljay5oaXN0b3J5LScgKyB0aGlzLmFwcC5ldmVudE5hbWVzcGFjZSgpKTtcclxuICAgICAgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2JpbmRpbmdzLS07XHJcbiAgICAgIGlmIChTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5fYmluZGluZ3MgPD0gMCkge1xyXG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5Ll9pbnRlcnZhbCk7XHJcbiAgICAgICAgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2ludGVydmFsID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyBnZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gZnJvbSB0aGUgaGFzaC5cclxuICAgIGdldExvY2F0aW9uOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5LmZ1bGxQYXRoKHdpbmRvdy5sb2NhdGlvbik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHNldCB0aGUgY3VycmVudCBsb2NhdGlvbiB0byBgbmV3X2xvY2F0aW9uYFxyXG4gICAgc2V0TG9jYXRpb246IGZ1bmN0aW9uKG5ld19sb2NhdGlvbikge1xyXG4gICAgICBpZiAoL14oW14jXFwvXXwkKS8udGVzdChuZXdfbG9jYXRpb24pKSB7IC8vIG5vbi1wcmVmaXhlZCB1cmxcclxuICAgICAgICBpZiAoX2hhc19oaXN0b3J5ICYmICF0aGlzLmFwcC5kaXNhYmxlX3B1c2hfc3RhdGUpIHtcclxuICAgICAgICAgIG5ld19sb2NhdGlvbiA9ICcvJyArIG5ld19sb2NhdGlvbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbmV3X2xvY2F0aW9uID0gJyMhLycgKyBuZXdfbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChuZXdfbG9jYXRpb24gIT0gdGhpcy5nZXRMb2NhdGlvbigpKSB7XHJcbiAgICAgICAgLy8gSFRNTDUgSGlzdG9yeSBleGlzdHMgYW5kIG5ld19sb2NhdGlvbiBpcyBhIGZ1bGwgcGF0aFxyXG4gICAgICAgIGlmIChfaGFzX2hpc3RvcnkgJiYgIXRoaXMuYXBwLmRpc2FibGVfcHVzaF9zdGF0ZSAmJiAvXlxcLy8udGVzdChuZXdfbG9jYXRpb24pKSB7XHJcbiAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IHBhdGg6IG5ld19sb2NhdGlvbiB9LCB3aW5kb3cudGl0bGUsIG5ld19sb2NhdGlvbik7XHJcbiAgICAgICAgICB0aGlzLmFwcC50cmlnZ2VyKCdsb2NhdGlvbi1jaGFuZ2VkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAod2luZG93LmxvY2F0aW9uID0gbmV3X2xvY2F0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgX3N0YXJ0UG9sbGluZzogZnVuY3Rpb24oZXZlcnkpIHtcclxuICAgICAgLy8gc2V0IHVwIGludGVydmFsXHJcbiAgICAgIHZhciBwcm94eSA9IHRoaXM7XHJcbiAgICAgIGlmICghU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2ludGVydmFsKSB7XHJcbiAgICAgICAgaWYgKCFldmVyeSkgeyBldmVyeSA9IDEwOyB9XHJcbiAgICAgICAgdmFyIGhhc2hDaGVjayA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgdmFyIGN1cnJlbnRfbG9jYXRpb24gPSBwcm94eS5nZXRMb2NhdGlvbigpO1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5fbGFzdF9sb2NhdGlvbiA9PSAndW5kZWZpbmVkJyB8fFxyXG4gICAgICAgICAgICBjdXJyZW50X2xvY2F0aW9uICE9IFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5Ll9sYXN0X2xvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICQod2luZG93KS50cmlnZ2VyKCdoYXNoY2hhbmdlJywgW3RydWVdKTtcclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5fbGFzdF9sb2NhdGlvbiA9IGN1cnJlbnRfbG9jYXRpb247XHJcbiAgICAgICAgfTtcclxuICAgICAgICBoYXNoQ2hlY2soKTtcclxuICAgICAgICBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5faW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoaGFzaENoZWNrLCBldmVyeSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcblxyXG4gIC8vIFNhbW15LkFwcGxpY2F0aW9uIGlzIHRoZSBCYXNlIHByb3RvdHlwZSBmb3IgZGVmaW5pbmcgJ2FwcGxpY2F0aW9ucycuXHJcbiAgLy8gQW4gJ2FwcGxpY2F0aW9uJyBpcyBhIGNvbGxlY3Rpb24gb2YgJ3JvdXRlcycgYW5kIGJvdW5kIGV2ZW50cyB0aGF0IGlzXHJcbiAgLy8gYXR0YWNoZWQgdG8gYW4gZWxlbWVudCB3aGVuIGBydW4oKWAgaXMgY2FsbGVkLlxyXG4gIC8vIFRoZSBvbmx5IGFyZ3VtZW50IGFuICdhcHBfZnVuY3Rpb24nIGlzIGV2YWx1YXRlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uLlxyXG4gIFNhbW15LkFwcGxpY2F0aW9uID0gZnVuY3Rpb24oYXBwX2Z1bmN0aW9uKSB7XHJcbiAgICB2YXIgYXBwID0gdGhpcztcclxuICAgIHRoaXMucm91dGVzICAgICAgICAgICAgPSB7fTtcclxuICAgIHRoaXMubGlzdGVuZXJzICAgICAgICAgPSBuZXcgU2FtbXkuT2JqZWN0KHt9KTtcclxuICAgIHRoaXMuYXJvdW5kcyAgICAgICAgICAgPSBbXTtcclxuICAgIHRoaXMuYmVmb3JlcyAgICAgICAgICAgPSBbXTtcclxuICAgIC8vIGdlbmVyYXRlIGEgdW5pcXVlIG5hbWVzcGFjZVxyXG4gICAgdGhpcy5uYW1lc3BhY2UgICAgICAgICA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgKyAnLScgKyBwYXJzZUludChNYXRoLnJhbmRvbSgpICogMTAwMCwgMTApO1xyXG4gICAgdGhpcy5jb250ZXh0X3Byb3RvdHlwZSA9IGZ1bmN0aW9uKCkgeyBTYW1teS5FdmVudENvbnRleHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcclxuICAgIHRoaXMuY29udGV4dF9wcm90b3R5cGUucHJvdG90eXBlID0gbmV3IFNhbW15LkV2ZW50Q29udGV4dCgpO1xyXG5cclxuICAgIGlmIChfaXNGdW5jdGlvbihhcHBfZnVuY3Rpb24pKSB7XHJcbiAgICAgIGFwcF9mdW5jdGlvbi5hcHBseSh0aGlzLCBbdGhpc10pO1xyXG4gICAgfVxyXG4gICAgLy8gc2V0IHRoZSBsb2NhdGlvbiBwcm94eSBpZiBub3QgZGVmaW5lZCB0byB0aGUgZGVmYXVsdCAoRGVmYXVsdExvY2F0aW9uUHJveHkpXHJcbiAgICBpZiAoIXRoaXMuX2xvY2F0aW9uX3Byb3h5KSB7XHJcbiAgICAgIHRoaXMuc2V0TG9jYXRpb25Qcm94eShuZXcgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkodGhpcywgdGhpcy5ydW5faW50ZXJ2YWxfZXZlcnkpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIHRoaXMuYmluZFRvQWxsRXZlbnRzKGZ1bmN0aW9uKGUsIGRhdGEpIHtcclxuICAgICAgICBhcHAubG9nKGFwcC50b1N0cmluZygpLCBlLmNsZWFuZWRfdHlwZSwgZGF0YSB8fCB7fSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIFNhbW15LkFwcGxpY2F0aW9uLnByb3RvdHlwZSA9ICQuZXh0ZW5kKHt9LCBTYW1teS5PYmplY3QucHJvdG90eXBlLCB7XHJcblxyXG4gICAgLy8gdGhlIGZvdXIgcm91dGUgdmVyYnNcclxuICAgIFJPVVRFX1ZFUkJTOiBbJ2dldCcsJ3Bvc3QnLCdwdXQnLCdkZWxldGUnXSxcclxuXHJcbiAgICAvLyBBbiBhcnJheSBvZiB0aGUgZGVmYXVsdCBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoZVxyXG4gICAgLy8gYXBwbGljYXRpb24gZHVyaW5nIGl0cyBsaWZlY3ljbGVcclxuICAgIEFQUF9FVkVOVFM6IFsncnVuJywgJ3VubG9hZCcsICdsb29rdXAtcm91dGUnLCAncnVuLXJvdXRlJywgJ3JvdXRlLWZvdW5kJywgJ2V2ZW50LWNvbnRleHQtYmVmb3JlJywgJ2V2ZW50LWNvbnRleHQtYWZ0ZXInLCAnY2hhbmdlZCcsICdlcnJvcicsICdjaGVjay1mb3JtLXN1Ym1pc3Npb24nLCAncmVkaXJlY3QnLCAnbG9jYXRpb24tY2hhbmdlZCddLFxyXG5cclxuICAgIF9sYXN0X3JvdXRlOiBudWxsLFxyXG4gICAgX2xvY2F0aW9uX3Byb3h5OiBudWxsLFxyXG4gICAgX3J1bm5pbmc6IGZhbHNlLFxyXG5cclxuICAgIC8vIERlZmluZXMgd2hhdCBlbGVtZW50IHRoZSBhcHBsaWNhdGlvbiBpcyBib3VuZCB0by4gUHJvdmlkZSBhIHNlbGVjdG9yXHJcbiAgICAvLyAocGFyc2VhYmxlIGJ5IGBqUXVlcnkoKWApIGFuZCB0aGlzIHdpbGwgYmUgdXNlZCBieSBgJGVsZW1lbnQoKWBcclxuICAgIGVsZW1lbnRfc2VsZWN0b3I6ICdib2R5JyxcclxuXHJcbiAgICAvLyBXaGVuIHNldCB0byB0cnVlLCBsb2dzIGFsbCBvZiB0aGUgZGVmYXVsdCBldmVudHMgdXNpbmcgYGxvZygpYFxyXG4gICAgZGVidWc6IGZhbHNlLFxyXG5cclxuICAgIC8vIFdoZW4gc2V0IHRvIHRydWUsIGFuZCB0aGUgZXJyb3IoKSBoYW5kbGVyIGlzIG5vdCBvdmVycmlkZGVuLCB3aWxsIGFjdHVhbGx5XHJcbiAgICAvLyByYWlzZSBKUyBlcnJvcnMgaW4gcm91dGVzICg1MDApIGFuZCB3aGVuIHJvdXRlcyBjYW4ndCBiZSBmb3VuZCAoNDA0KVxyXG4gICAgcmFpc2VfZXJyb3JzOiBmYWxzZSxcclxuXHJcbiAgICAvLyBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCB0aGUgVVJMIGlzIHF1ZXJpZWQgZm9yIGNoYW5nZXNcclxuICAgIHJ1bl9pbnRlcnZhbF9ldmVyeTogNTAsXHJcblxyXG4gICAgLy8gaWYgdXNpbmcgdGhlIGBEZWZhdWx0TG9jYXRpb25Qcm94eWAgc2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCBmb3JjZSB0aGUgYXBwIHRvIHVzZVxyXG4gICAgLy8gdHJhZGl0aW9uYWwgaGFzaCBiYXNlZCByb3V0aW5nIGFzIG9wcG9zZWQgdG8gdGhlIG5ldyBIVE1MNSBQdXNoU3RhdGUgc3VwcG9ydFxyXG4gICAgZGlzYWJsZV9wdXNoX3N0YXRlOiBmYWxzZSxcclxuXHJcbiAgICAvLyBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSBlbmdpbmUgdG8gdXNlIHdoZW4gdXNpbmcgYHBhcnRpYWwoKWAgaW4gYW5cclxuICAgIC8vIGBFdmVudENvbnRleHRgLiBgdGVtcGxhdGVfZW5naW5lYCBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIHRoYXRcclxuICAgIC8vIGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIG9mIGEgbWV0aG9kL2hlbHBlciBvbiBFdmVudENvbnRleHQgb3IgaXQgY2FuIGJlIGEgZnVuY3Rpb25cclxuICAgIC8vIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cywgdGhlIGNvbnRlbnQgb2YgdGhlIHVucmVuZGVyZWQgcGFydGlhbCBhbmQgYW4gb3B0aW9uYWxcclxuICAgIC8vIEpTIG9iamVjdCB0aGF0IGNvbnRhaW5zIGludGVycG9sYXRpb24gZGF0YS4gVGVtcGxhdGUgZW5naW5lIGlzIG9ubHkgY2FsbGVkL3JlZmVycmVkXHJcbiAgICAvLyB0byBpZiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBwYXJ0aWFsIGlzIG51bGwgb3IgdW5rbm93bi4gU2VlIGBwYXJ0aWFsKClgXHJcbiAgICAvLyBmb3IgbW9yZSBpbmZvcm1hdGlvblxyXG4gICAgdGVtcGxhdGVfZW5naW5lOiBudWxsLFxyXG5cclxuICAgIC8vIC8vPT4gU2FtbXkuQXBwbGljYXRpb246IGJvZHlcclxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuICdTYW1teS5BcHBsaWNhdGlvbjonICsgdGhpcy5lbGVtZW50X3NlbGVjdG9yO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyByZXR1cm5zIGEgalF1ZXJ5IG9iamVjdCBvZiB0aGUgQXBwbGljYXRpb25zIGJvdW5kIGVsZW1lbnQuXHJcbiAgICAkZWxlbWVudDogZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdG9yID8gJCh0aGlzLmVsZW1lbnRfc2VsZWN0b3IpLmZpbmQoc2VsZWN0b3IpIDogJCh0aGlzLmVsZW1lbnRfc2VsZWN0b3IpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBgdXNlKClgIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgaW5jbHVkaW5nIFNhbW15IHBsdWdpbnMuXHJcbiAgICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdXNlIHNob3VsZCBiZSBhIGZ1bmN0aW9uKCkgdGhhdCBpcyBldmFsdWF0ZWRcclxuICAgIC8vIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLCBqdXN0IGxpa2UgdGhlIGBhcHBfZnVuY3Rpb25gXHJcbiAgICAvLyBhcmd1bWVudCB0byB0aGUgYFNhbW15LkFwcGxpY2F0aW9uYCBjb25zdHJ1Y3Rvci5cclxuICAgIC8vXHJcbiAgICAvLyBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgYXBwIGZ1bmN0aW9uIHNlcXVlbnRpYWxseS5cclxuICAgIC8vXHJcbiAgICAvLyBGb3IgbXVjaCBtb3JlIGRldGFpbCBhYm91dCBwbHVnaW5zLCBjaGVjayBvdXQ6XHJcbiAgICAvLyBbaHR0cDovL3NhbW15anMub3JnL2RvY3MvcGx1Z2luc10oaHR0cDovL3NhbW15anMub3JnL2RvY3MvcGx1Z2lucylcclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdmFyIE15UGx1Z2luID0gZnVuY3Rpb24oYXBwLCBwcmVwZW5kKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHRoaXMuaGVscGVycyh7XHJcbiAgICAvLyAgICAgICAgICBteWhlbHBlcjogZnVuY3Rpb24odGV4dCkge1xyXG4gICAgLy8gICAgICAgICAgICBhbGVydChwcmVwZW5kICsgXCIgXCIgKyB0ZXh0KTtcclxuICAgIC8vICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIH07XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB2YXIgYXBwID0gJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy51c2UoTXlQbHVnaW4sICdUaGlzIGlzIG15IHBsdWdpbicpO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB0aGlzLmdldCgnIy8nLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgIHRoaXMubXloZWxwZXIoJ2FuZCBkb250IHlvdSBmb3JnZXQgaXQhJyk7XHJcbiAgICAvLyAgICAgICAgICAvLz0+IEFsZXJ0czogVGhpcyBpcyBteSBwbHVnaW4gYW5kIGRvbnQgeW91IGZvcmdldCBpdCFcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vIElmIHBsdWdpbiBpcyBwYXNzZWQgYXMgYSBzdHJpbmcgaXQgYXNzdW1lcyB5b3VyIGFyZSB0cnlpbmcgdG8gbG9hZFxyXG4gICAgLy8gU2FtbXkuXCJQbHVnaW5cIi4gVGhpcyBpcyB0aGUgcHJlZmVycmVkIHdheSBvZiBsb2FkaW5nIGNvcmUgU2FtbXkgcGx1Z2luc1xyXG4gICAgLy8gYXMgaXQgYWxsb3dzIGZvciBiZXR0ZXIgZXJyb3ItbWVzc2FnaW5nLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAkLnNhbW15KGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgIHRoaXMudXNlKCdNdXN0YWNoZScpOyAvLz0+IFNhbW15Lk11c3RhY2hlXHJcbiAgICAvLyAgICAgICAgdGhpcy51c2UoJ1N0b3JhZ2UnKTsgLy89PiBTYW1teS5TdG9yYWdlXHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIHVzZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIC8vIGZsYXR0ZW4gdGhlIGFyZ3VtZW50c1xyXG4gICAgICB2YXIgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKSxcclxuICAgICAgICAgIHBsdWdpbiA9IGFyZ3Muc2hpZnQoKSxcclxuICAgICAgICAgIHBsdWdpbl9uYW1lID0gcGx1Z2luIHx8ICcnO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcclxuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbiA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgcGx1Z2luX25hbWUgPSAnU2FtbXkuJyArIHBsdWdpbjtcclxuICAgICAgICAgIHBsdWdpbiA9IFNhbW15W3BsdWdpbl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBsdWdpbi5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICB0aGlzLmVycm9yKFwiUGx1Z2luIEVycm9yOiBjYWxsZWQgdXNlKCkgYnV0IHBsdWdpbiAoXCIgKyBwbHVnaW5fbmFtZS50b1N0cmluZygpICsgXCIpIGlzIG5vdCBkZWZpbmVkXCIsIGUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIV9pc0Z1bmN0aW9uKHBsdWdpbikpIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3IoXCJQbHVnaW4gRXJyb3I6IGNhbGxlZCB1c2UoKSBidXQgJ1wiICsgcGx1Z2luX25hbWUudG9TdHJpbmcoKSArIFwiJyBpcyBub3QgYSBmdW5jdGlvblwiLCBlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5lcnJvcihcIlBsdWdpbiBFcnJvclwiLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFNldHMgdGhlIGxvY2F0aW9uIHByb3h5IGZvciB0aGUgY3VycmVudCBhcHAuIEJ5IGRlZmF1bHQgdGhpcyBpcyBzZXQgdG9cclxuICAgIC8vIGEgbmV3IGBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eWAgb24gaW5pdGlhbGl6YXRpb24uIEhvd2V2ZXIsIHlvdSBjYW4gc2V0XHJcbiAgICAvLyB0aGUgbG9jYXRpb25fcHJveHkgaW5zaWRlIHlvdSdyZSBhcHAgZnVuY3Rpb24gdG8gZ2l2ZSB5b3VyIGFwcCBhIGN1c3RvbVxyXG4gICAgLy8gbG9jYXRpb24gbWVjaGFuaXNtLiBTZWUgYFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5YCBhbmQgYFNhbW15LkRhdGFMb2NhdGlvblByb3h5YFxyXG4gICAgLy8gZm9yIGV4YW1wbGVzLlxyXG4gICAgLy9cclxuICAgIC8vIGBzZXRMb2NhdGlvblByb3h5KClgIHRha2VzIGFuIGluaXRpYWxpemVkIGxvY2F0aW9uIHByb3h5LlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIC8vIHRvIGJpbmQgdG8gZGF0YSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGhhc2g7XHJcbiAgICAvLyAgICAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICB0aGlzLnNldExvY2F0aW9uUHJveHkobmV3IFNhbW15LkRhdGFMb2NhdGlvblByb3h5KHRoaXMpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICBzZXRMb2NhdGlvblByb3h5OiBmdW5jdGlvbihuZXdfcHJveHkpIHtcclxuICAgICAgdmFyIG9yaWdpbmFsX3Byb3h5ID0gdGhpcy5fbG9jYXRpb25fcHJveHk7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uX3Byb3h5ID0gbmV3X3Byb3h5O1xyXG4gICAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xyXG4gICAgICAgIGlmIChvcmlnaW5hbF9wcm94eSkge1xyXG4gICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGxvY2F0aW9uIHByb3h5LCB1bmJpbmQgaXQuXHJcbiAgICAgICAgICBvcmlnaW5hbF9wcm94eS51bmJpbmQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbG9jYXRpb25fcHJveHkuYmluZCgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHByb3ZpZGUgbG9nKCkgb3ZlcnJpZGUgZm9yIGluc2lkZSBhbiBhcHAgdGhhdCBpbmNsdWRlcyB0aGUgcmVsZXZhbnQgYXBwbGljYXRpb24gZWxlbWVudF9zZWxlY3RvclxyXG4gICAgbG9nOiBmdW5jdGlvbigpIHtcclxuICAgICAgU2FtbXkubG9nLmFwcGx5KFNhbW15LCBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFt0aGlzLmVsZW1lbnRfc2VsZWN0b3JdLGFyZ3VtZW50cykpO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLy8gYHJvdXRlKClgIGlzIHRoZSBtYWluIG1ldGhvZCBmb3IgZGVmaW5pbmcgcm91dGVzIHdpdGhpbiBhbiBhcHBsaWNhdGlvbi5cclxuICAgIC8vIEZvciBncmVhdCBkZXRhaWwgb24gcm91dGVzLCBjaGVjayBvdXQ6XHJcbiAgICAvLyBbaHR0cDovL3NhbW15anMub3JnL2RvY3Mvcm91dGVzXShodHRwOi8vc2FtbXlqcy5vcmcvZG9jcy9yb3V0ZXMpXHJcbiAgICAvL1xyXG4gICAgLy8gVGhpcyBtZXRob2QgYWxzbyBoYXMgYWxpYXNlcyBmb3IgZWFjaCBvZiB0aGUgZGlmZmVyZW50IHZlcmJzIChlZy4gYGdldCgpYCwgYHBvc3QoKWAsIGV0Yy4pXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYHZlcmJgIEEgU3RyaW5nIGluIHRoZSBzZXQgb2YgUk9VVEVfVkVSQlMgb3IgJ2FueScuICdhbnknIHdpbGwgYWRkIHJvdXRlcyBmb3IgZWFjaFxyXG4gICAgLy8gICAgb2YgdGhlIFJPVVRFX1ZFUkJTLiBJZiBvbmx5IHR3byBhcmd1bWVudHMgYXJlIHBhc3NlZCxcclxuICAgIC8vICAgIHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgcGF0aCwgdGhlIHNlY29uZCBpcyB0aGUgY2FsbGJhY2sgYW5kIHRoZSB2ZXJiXHJcbiAgICAvLyAgICBpcyBhc3N1bWVkIHRvIGJlICdhbnknLlxyXG4gICAgLy8gKiBgcGF0aGAgQSBSZWdleHAgb3IgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIG1hdGNoIHRvIGludm9rZSB0aGlzIHZlcmIuXHJcbiAgICAvLyAqIGBjYWxsYmFja2AgQSBGdW5jdGlvbiB0aGF0IGlzIGNhbGxlZC9ldmFsdWF0ZWQgd2hlbiB0aGUgcm91dGUgaXMgcnVuIHNlZTogYHJ1blJvdXRlKClgLlxyXG4gICAgLy8gICAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwYXNzIGEgc3RyaW5nIGFzIHRoZSBjYWxsYmFjaywgd2hpY2ggaXMgbG9va2VkIHVwIGFzIHRoZSBuYW1lXHJcbiAgICAvLyAgICBvZiBhIG1ldGhvZCBvbiB0aGUgYXBwbGljYXRpb24uXHJcbiAgICAvL1xyXG4gICAgcm91dGU6IGZ1bmN0aW9uKHZlcmIsIHBhdGgpIHtcclxuICAgICAgdmFyIGFwcCA9IHRoaXMsIHBhcmFtX25hbWVzID0gW10sIGFkZF9yb3V0ZSwgcGF0aF9tYXRjaCwgY2FsbGJhY2sgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBpcyBqdXN0IChwYXRoLCBjYWxsYmFjaylcclxuICAgICAgLy8gYXNzdW1lIHRoZSB2ZXJiIGlzICdhbnknXHJcbiAgICAgIGlmIChjYWxsYmFjay5sZW5ndGggPT09IDAgJiYgX2lzRnVuY3Rpb24ocGF0aCkpIHtcclxuICAgICAgICBjYWxsYmFjayA9IFtwYXRoXTtcclxuICAgICAgICBwYXRoID0gdmVyYjtcclxuICAgICAgICB2ZXJiID0gJ2FueSc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZlcmIgPSB2ZXJiLnRvTG93ZXJDYXNlKCk7IC8vIGVuc3VyZSB2ZXJiIGlzIGxvd2VyIGNhc2VcclxuXHJcbiAgICAgIC8vIGlmIHBhdGggaXMgYSBzdHJpbmcgdHVybiBpdCBpbnRvIGEgcmVnZXhcclxuICAgICAgaWYgKHBhdGguY29uc3RydWN0b3IgPT0gU3RyaW5nKSB7XHJcblxyXG4gICAgICAgIC8vIE5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgc2V0IGJlY2F1c2UgSUUgd2lsbCBtYWludGFpbiB0aGUgaW5kZXggdW5sZXNzIE5VTEwgaXMgcmV0dXJuZWQsXHJcbiAgICAgICAgLy8gd2hpY2ggbWVhbnMgdGhhdCB3aXRoIHR3byBjb25zZWN1dGl2ZSByb3V0ZXMgdGhhdCBjb250YWluIHBhcmFtcywgdGhlIHNlY29uZCBzZXQgb2YgcGFyYW1zIHdpbGwgbm90IGJlIGZvdW5kIGFuZCBlbmQgdXAgaW4gc3BsYXQgaW5zdGVhZCBvZiBwYXJhbXNcclxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9SZWdFeHAvbGFzdEluZGV4XHJcbiAgICAgICAgUEFUSF9OQU1FX01BVENIRVIubGFzdEluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgLy8gZmluZCB0aGUgbmFtZXNcclxuICAgICAgICB3aGlsZSAoKHBhdGhfbWF0Y2ggPSBQQVRIX05BTUVfTUFUQ0hFUi5leGVjKHBhdGgpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcGFyYW1fbmFtZXMucHVzaChwYXRoX21hdGNoWzFdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVwbGFjZSB3aXRoIHRoZSBwYXRoIHJlcGxhY2VtZW50XHJcbiAgICAgICAgcGF0aCA9IG5ldyBSZWdFeHAocGF0aC5yZXBsYWNlKFBBVEhfTkFNRV9NQVRDSEVSLCBQQVRIX1JFUExBQ0VSKSArIFwiJFwiKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBsb29rdXAgY2FsbGJhY2tzXHJcbiAgICAgICQuZWFjaChjYWxsYmFjayxmdW5jdGlvbihpLGNiKXtcclxuICAgICAgICBpZiAodHlwZW9mKGNiKSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNhbGxiYWNrW2ldID0gYXBwW2NiXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgYWRkX3JvdXRlID0gZnVuY3Rpb24od2l0aF92ZXJiKSB7XHJcbiAgICAgICAgdmFyIHIgPSB7dmVyYjogd2l0aF92ZXJiLCBwYXRoOiBwYXRoLCBjYWxsYmFjazogY2FsbGJhY2ssIHBhcmFtX25hbWVzOiBwYXJhbV9uYW1lc307XHJcbiAgICAgICAgLy8gYWRkIHJvdXRlIHRvIHJvdXRlcyBhcnJheVxyXG4gICAgICAgIGFwcC5yb3V0ZXNbd2l0aF92ZXJiXSA9IGFwcC5yb3V0ZXNbd2l0aF92ZXJiXSB8fCBbXTtcclxuICAgICAgICAvLyBwbGFjZSByb3V0ZXMgaW4gb3JkZXIgb2YgZGVmaW5pdGlvblxyXG4gICAgICAgIGFwcC5yb3V0ZXNbd2l0aF92ZXJiXS5wdXNoKHIpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKHZlcmIgPT09ICdhbnknKSB7XHJcbiAgICAgICAgJC5lYWNoKHRoaXMuUk9VVEVfVkVSQlMsIGZ1bmN0aW9uKGksIHYpIHsgYWRkX3JvdXRlKHYpOyB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhZGRfcm91dGUodmVyYik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJldHVybiB0aGUgYXBwXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBbGlhcyBmb3Igcm91dGUoJ2dldCcsIC4uLilcclxuICAgIGdldDogX3JvdXRlV3JhcHBlcignZ2V0JyksXHJcblxyXG4gICAgLy8gQWxpYXMgZm9yIHJvdXRlKCdwb3N0JywgLi4uKVxyXG4gICAgcG9zdDogX3JvdXRlV3JhcHBlcigncG9zdCcpLFxyXG5cclxuICAgIC8vIEFsaWFzIGZvciByb3V0ZSgncHV0JywgLi4uKVxyXG4gICAgcHV0OiBfcm91dGVXcmFwcGVyKCdwdXQnKSxcclxuXHJcbiAgICAvLyBBbGlhcyBmb3Igcm91dGUoJ2RlbGV0ZScsIC4uLilcclxuICAgIGRlbDogX3JvdXRlV3JhcHBlcignZGVsZXRlJyksXHJcblxyXG4gICAgLy8gQWxpYXMgZm9yIHJvdXRlKCdhbnknLCAuLi4pXHJcbiAgICBhbnk6IF9yb3V0ZVdyYXBwZXIoJ2FueScpLFxyXG5cclxuICAgIC8vIGBtYXBSb3V0ZXNgIHRha2VzIGFuIGFycmF5IG9mIGFycmF5cywgZWFjaCBhcnJheSBiZWluZyBwYXNzZWQgdG8gcm91dGUoKVxyXG4gICAgLy8gYXMgYXJndW1lbnRzLCB0aGlzIGFsbG93cyBmb3IgbWFzcyBkZWZpbml0aW9uIG9mIHJvdXRlcy4gQW5vdGhlciBiZW5lZml0IGlzXHJcbiAgICAvLyB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlL2Vhc2llciB0byBsb2FkIHJvdXRlcyB2aWEgcmVtb3RlIEpTT04uXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHZhciBhcHAgPSAkLnNhbW15KGZ1bmN0aW9uKCkge1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB0aGlzLm1hcFJvdXRlcyhbXHJcbiAgICAvLyAgICAgICAgICAgIFsnZ2V0JywgJyMvJywgZnVuY3Rpb24oKSB7IHRoaXMubG9nKCdpbmRleCcpOyB9XSxcclxuICAgIC8vICAgICAgICAgICAgLy8gc3RyaW5ncyBpbiBjYWxsYmFja3MgYXJlIGxvb2tlZCB1cCBhcyBtZXRob2RzIG9uIHRoZSBhcHBcclxuICAgIC8vICAgICAgICAgICAgWydwb3N0JywgJyMvY3JlYXRlJywgJ2FkZFVzZXInXSxcclxuICAgIC8vICAgICAgICAgICAgLy8gTm8gdmVyYiBhc3N1bWVzICdhbnknIGFzIHRoZSB2ZXJiXHJcbiAgICAvLyAgICAgICAgICAgIFsvZG93aGF0ZXZlci8sIGZ1bmN0aW9uKCkgeyB0aGlzLmxvZyh0aGlzLnZlcmIsIHRoaXMucGF0aCl9XTtcclxuICAgIC8vICAgICAgICAgIF0pO1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICBtYXBSb3V0ZXM6IGZ1bmN0aW9uKHJvdXRlX2FycmF5KSB7XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzO1xyXG4gICAgICAkLmVhY2gocm91dGVfYXJyYXksIGZ1bmN0aW9uKGksIHJvdXRlX2FyZ3MpIHtcclxuICAgICAgICBhcHAucm91dGUuYXBwbHkoYXBwLCByb3V0ZV9hcmdzKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBIHVuaXF1ZSBldmVudCBuYW1lc3BhY2UgZGVmaW5lZCBwZXIgYXBwbGljYXRpb24uXHJcbiAgICAvLyBBbGwgZXZlbnRzIGJvdW5kIHdpdGggYGJpbmQoKWAgYXJlIGF1dG9tYXRpY2FsbHkgYm91bmQgd2l0aGluIHRoaXMgc3BhY2UuXHJcbiAgICBldmVudE5hbWVzcGFjZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBbJ3NhbW15LWFwcCcsIHRoaXMubmFtZXNwYWNlXS5qb2luKCctJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFdvcmtzIGp1c3QgbGlrZSBgalF1ZXJ5LmZuLmJpbmQoKWAgd2l0aCBhIGNvdXBsZSBub3RhYmxlIGRpZmZlcmVuY2VzLlxyXG4gICAgLy9cclxuICAgIC8vICogSXQgYmluZHMgYWxsIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gZWxlbWVudFxyXG4gICAgLy8gKiBBbGwgZXZlbnRzIGFyZSBib3VuZCB3aXRoaW4gdGhlIGBldmVudE5hbWVzcGFjZSgpYFxyXG4gICAgLy8gKiBFdmVudHMgYXJlIG5vdCBhY3R1YWxseSBib3VuZCB1bnRpbCB0aGUgYXBwbGljYXRpb24gaXMgc3RhcnRlZCB3aXRoIGBydW4oKWBcclxuICAgIC8vICogY2FsbGJhY2tzIGFyZSBldmFsdWF0ZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgU2FtbXkuRXZlbnRDb250ZXh0XHJcbiAgICAvL1xyXG4gICAgYmluZDogZnVuY3Rpb24obmFtZSwgZGF0YSwgY2FsbGJhY2spIHtcclxuICAgICAgdmFyIGFwcCA9IHRoaXM7XHJcbiAgICAgIC8vIGJ1aWxkIHRoZSBjYWxsYmFja1xyXG4gICAgICAvLyBpZiB0aGUgYXJpdHkgaXMgMiwgY2FsbGJhY2sgaXMgdGhlIHNlY29uZCBhcmd1bWVudFxyXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09ICd1bmRlZmluZWQnKSB7IGNhbGxiYWNrID0gZGF0YTsgfVxyXG4gICAgICB2YXIgbGlzdGVuZXJfY2FsbGJhY2sgPSAgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgLy8gcHVsbCBvZmYgdGhlIGNvbnRleHQgZnJvbSB0aGUgYXJndW1lbnRzIHRvIHRoZSBjYWxsYmFja1xyXG4gICAgICAgIHZhciBlLCBjb250ZXh0LCBkYXRhO1xyXG4gICAgICAgIGUgICAgICAgPSBhcmd1bWVudHNbMF07XHJcbiAgICAgICAgZGF0YSAgICA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmNvbnRleHQpIHtcclxuICAgICAgICAgIGNvbnRleHQgPSBkYXRhLmNvbnRleHQ7XHJcbiAgICAgICAgICBkZWxldGUgZGF0YS5jb250ZXh0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb250ZXh0ID0gbmV3IGFwcC5jb250ZXh0X3Byb3RvdHlwZShhcHAsICdiaW5kJywgZS50eXBlLCBkYXRhLCBlLnRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGUuY2xlYW5lZF90eXBlID0gZS50eXBlLnJlcGxhY2UoYXBwLmV2ZW50TmFtZXNwYWNlKCksICcnKTtcclxuICAgICAgICBjYWxsYmFjay5hcHBseShjb250ZXh0LCBbZSwgZGF0YV0pO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gaXQgY291bGQgYmUgdGhhdCB0aGUgYXBwIGVsZW1lbnQgZG9lc250IGV4aXN0IHlldFxyXG4gICAgICAvLyBzbyBhdHRhY2ggdG8gdGhlIGxpc3RlbmVycyBhcnJheSBhbmQgdGhlbiBydW4oKVxyXG4gICAgICAvLyB3aWxsIGFjdHVhbGx5IGJpbmQgdGhlIGV2ZW50LlxyXG4gICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW25hbWVdKSB7IHRoaXMubGlzdGVuZXJzW25hbWVdID0gW107IH1cclxuICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZV0ucHVzaChsaXN0ZW5lcl9jYWxsYmFjayk7XHJcbiAgICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIGFwcCBpcyBydW5uaW5nXHJcbiAgICAgICAgLy8gKmFjdHVhbGx5KiBiaW5kIHRoZSBldmVudCB0byB0aGUgYXBwIGVsZW1lbnRcclxuICAgICAgICB0aGlzLl9saXN0ZW4obmFtZSwgbGlzdGVuZXJfY2FsbGJhY2spO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBUcmlnZ2VycyBjdXN0b20gZXZlbnRzIGRlZmluZWQgd2l0aCBgYmluZCgpYFxyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGBuYW1lYCBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuIEF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aCB0aGUgYGV2ZW50TmFtZXNwYWNlKClgXHJcbiAgICAvLyAqIGBkYXRhYCBBbiBvcHRpb25hbCBPYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBib3VuZCBjYWxsYmFjay5cclxuICAgIC8vICogYGNvbnRleHRgIEFuIG9wdGlvbmFsIGNvbnRleHQvT2JqZWN0IGluIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIGJvdW5kIGNhbGxiYWNrLlxyXG4gICAgLy8gICBJZiBubyBjb250ZXh0IGlzIHN1cHBsaWVkIGEgdGhlIGNvbnRleHQgaXMgYSBuZXcgYFNhbW15LkV2ZW50Q29udGV4dGBcclxuICAgIC8vXHJcbiAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lLCBkYXRhKSB7XHJcbiAgICAgIHRoaXMuJGVsZW1lbnQoKS50cmlnZ2VyKFtuYW1lLCB0aGlzLmV2ZW50TmFtZXNwYWNlKCldLmpvaW4oJy4nKSwgW2RhdGFdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJlcnVucyB0aGUgY3VycmVudCByb3V0ZVxyXG4gICAgcmVmcmVzaDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHRoaXMubGFzdF9sb2NhdGlvbiA9IG51bGw7XHJcbiAgICAgIHRoaXMudHJpZ2dlcignbG9jYXRpb24tY2hhbmdlZCcpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gVGFrZXMgYSBzaW5nbGUgY2FsbGJhY2sgdGhhdCBpcyBwdXNoZWQgb24gdG8gYSBzdGFjay5cclxuICAgIC8vIEJlZm9yZSBhbnkgcm91dGUgaXMgcnVuLCB0aGUgY2FsbGJhY2tzIGFyZSBldmFsdWF0ZWQgaW4gb3JkZXIgd2l0aGluXHJcbiAgICAvLyB0aGUgY3VycmVudCBgU2FtbXkuRXZlbnRDb250ZXh0YFxyXG4gICAgLy9cclxuICAgIC8vIElmIGFueSBvZiB0aGUgY2FsbGJhY2tzIGV4cGxpY2l0bHkgcmV0dXJuIGZhbHNlLCBleGVjdXRpb24gb2YgYW55XHJcbiAgICAvLyBmdXJ0aGVyIGNhbGxiYWNrcyBhbmQgdGhlIHJvdXRlIGl0c2VsZiBpcyBoYWx0ZWQuXHJcbiAgICAvL1xyXG4gICAgLy8gWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzZXQgb2Ygb3B0aW9ucyB0aGF0IHdpbGwgZGVmaW5lIHdoZW4gdG8gcnVuIHRoaXNcclxuICAgIC8vIGJlZm9yZSBiYXNlZCBvbiB0aGUgcm91dGUgaXQgcHJvY2VlZHMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHZhciBhcHAgPSAkLnNhbW15KGZ1bmN0aW9uKCkge1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICAvLyB3aWxsIHJ1biBhdCAjL3JvdXRlIGJ1dCBub3QgYXQgIy9cclxuICAgIC8vICAgICAgICB0aGlzLmJlZm9yZSgnIy9yb3V0ZScsIGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICAgLy8uLi5cclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgLy8gd2lsbCBydW4gYXQgIy8gYnV0IG5vdCBhdCAjL3JvdXRlXHJcbiAgICAvLyAgICAgICAgdGhpcy5iZWZvcmUoe2V4Y2VwdDoge3BhdGg6ICcjL3JvdXRlJ319LCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgIHRoaXMubG9nKCdub3QgYmVmb3JlICMvcm91dGUnKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7fSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHRoaXMuZ2V0KCcjL3JvdXRlJywgZnVuY3Rpb24oKSB7fSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyBTZWUgYGNvbnRleHRNYXRjaGVzT3B0aW9ucygpYCBmb3IgYSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIG9wdGlvbnNcclxuICAgIC8vXHJcbiAgICBiZWZvcmU6IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XHJcbiAgICAgIGlmIChfaXNGdW5jdGlvbihvcHRpb25zKSkge1xyXG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcclxuICAgICAgICBvcHRpb25zID0ge307XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5iZWZvcmVzLnB1c2goW29wdGlvbnMsIGNhbGxiYWNrXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBIHNob3J0Y3V0IGZvciBiaW5kaW5nIGEgY2FsbGJhY2sgdG8gYmUgcnVuIGFmdGVyIGEgcm91dGUgaXMgZXhlY3V0ZWQuXHJcbiAgICAvLyBBZnRlciBjYWxsYmFja3MgaGF2ZSBubyBndWFydW50ZWVkIG9yZGVyLlxyXG4gICAgYWZ0ZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmJpbmQoJ2V2ZW50LWNvbnRleHQtYWZ0ZXInLCBjYWxsYmFjayk7XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICAvLyBBZGRzIGFuIGFyb3VuZCBmaWx0ZXIgdG8gdGhlIGFwcGxpY2F0aW9uLiBhcm91bmQgZmlsdGVycyBhcmUgZnVuY3Rpb25zXHJcbiAgICAvLyB0aGF0IHRha2UgYSBzaW5nbGUgYXJndW1lbnQgYGNhbGxiYWNrYCB3aGljaCBpcyB0aGUgZW50aXJlIHJvdXRlXHJcbiAgICAvLyBleGVjdXRpb24gcGF0aCB3cmFwcGVkIHVwIGluIGEgY2xvc3VyZS4gVGhpcyBtZWFucyB5b3UgY2FuIGRlY2lkZSB3aGV0aGVyXHJcbiAgICAvLyBvciBub3QgdG8gcHJvY2VlZCB3aXRoIGV4ZWN1dGlvbiBieSBub3QgaW52b2tpbmcgYGNhbGxiYWNrYCBvcixcclxuICAgIC8vIG1vcmUgdXNlZnVsbHkgd3JhcHBpbmcgY2FsbGJhY2sgaW5zaWRlIHRoZSByZXN1bHQgb2YgYW4gYXN5bmNocm9ub3VzIGV4ZWN1dGlvbi5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vIFRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgYXJvdW5kKCkgaXMgY2FsbGluZyBhIF9wb3NzaWJseV8gYXN5bmMgZnVuY3Rpb25cclxuICAgIC8vIGFuZCBleGVjdXRpbmcgdGhlIHJvdXRlIHdpdGhpbiB0aGUgZnVuY3Rpb25zIGNhbGxiYWNrOlxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHZhciBjdXJyZW50X3VzZXIgPSBmYWxzZTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgZnVuY3Rpb24gY2hlY2tMb2dnZWRJbihjYWxsYmFjaykge1xyXG4gICAgLy8gICAgICAgICAgLy8gL3Nlc3Npb24gcmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGxvZ2dlZCBpbiB1c2VyXHJcbiAgICAvLyAgICAgICAgICAvLyBvciBhbiBlbXB0eSBvYmplY3RcclxuICAgIC8vICAgICAgICAgIGlmICghY3VycmVudF91c2VyKSB7XHJcbiAgICAvLyAgICAgICAgICAgICQuZ2V0SlNPTignL3Nlc3Npb24nLCBmdW5jdGlvbihqc29uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgaWYgKGpzb24ubG9naW4pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIHVzZXIgYXMgbG9nZ2VkIGluXHJcbiAgICAvLyAgICAgICAgICAgICAgICBjdXJyZW50X3VzZXIgPSBqc29uO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgcm91dGUgcGF0aFxyXG4gICAgLy8gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIC8vICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gc2hvdyB0aGUgdXNlciBhcyBub3QgbG9nZ2VkIGluXHJcbiAgICAvLyAgICAgICAgICAgICAgICBjdXJyZW50X3VzZXIgPSBmYWxzZTtcclxuICAgIC8vICAgICAgICAgICAgICAgIC8vIHRoZSBjb250ZXh0IG9mIGFyb3VuZEZpbHRlcnMgaXMgYW4gRXZlbnRDb250ZXh0XHJcbiAgICAvLyAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0KCcjL2xvZ2luJyk7XHJcbiAgICAvLyAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHJvdXRlIHBhdGhcclxuICAgIC8vICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIC8vICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICB9O1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB0aGlzLmFyb3VuZChjaGVja0xvZ2dlZEluKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIGFyb3VuZDogZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgdGhpcy5hcm91bmRzLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQWRkcyBhIG9uQ29tcGxldGUgZnVuY3Rpb24gdG8gdGhlIGFwcGxpY2F0aW9uLiBvbkNvbXBsZXRlIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWRcclxuICAgIC8vIGF0IHRoZSBlbmQgb2YgYSBjaGFpbiBvZiByb3V0ZSBjYWxsYmFja3MsIGlmIHRoZXkgY2FsbCBuZXh0KCkuIFVubGlrZSBhZnRlcixcclxuICAgIC8vIHdoaWNoIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSByb3V0ZSBpcyBjb21wbGV0ZSwgb25Db21wbGV0ZSBpcyBsaWtlIGEgZmluYWwgbmV4dCgpXHJcbiAgICAvLyBmb3IgYWxsIHJvdXRlcywgYW5kIGlzIHRodXMgcnVuIGFzeW5jaHJvbm91c2x5XHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIGFwcC5nZXQoJy9jaGFpbicsZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICBjb25zb2xlLmxvZygnY2hhaW4xJyk7XHJcbiAgICAvLyAgICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0sZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICBjb25zb2xlLmxvZygnY2hhaW4yJyk7XHJcbiAgICAvLyAgICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgYXBwLmdldCgnL2xpbmsnLGZ1bmN0aW9uKGNvbnRleHQsbmV4dCkge1xyXG4gICAgLy8gICAgICAgICAgY29uc29sZS5sb2coJ2xpbmsxJyk7XHJcbiAgICAvLyAgICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0sZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICBjb25zb2xlLmxvZygnbGluazInKTtcclxuICAgIC8vICAgICAgICAgIG5leHQoKTtcclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICBhcHAub25Db21wbGV0ZShmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgIGNvbnNvbGUubG9nKFwiUnVubmluZyBmaW5hbGx5XCIpO1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyBJZiB5b3UgZ28gdG8gJy9jaGFpbicsIHlvdSB3aWxsIGdldCB0aGUgZm9sbG93aW5nIG1lc3NhZ2VzOlxyXG4gICAgLy9cclxuICAgIC8vICAgICAgY2hhaW4xXHJcbiAgICAvLyAgICAgIGNoYWluMlxyXG4gICAgLy8gICAgICBSdW5uaW5nIG9uQ29tcGxldGVcclxuICAgIC8vXHJcbiAgICAvL1xyXG4gICAgLy8gSWYgeW91IGdvIHRvIC9saW5rLCB5b3Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyBtZXNzYWdlczpcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIGxpbmsxXHJcbiAgICAvLyAgICAgIGxpbmsyXHJcbiAgICAvLyAgICAgIFJ1bm5pbmcgb25Db21wbGV0ZVxyXG4gICAgLy9cclxuICAgIC8vXHJcbiAgICAvLyBJdCByZWFsbHkgY29tZXMgdG8gcGxheSB3aGVuIGRvaW5nIGFzeW5jaHJvbm91czpcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIGFwcC5nZXQoJy9jaGFpbicsZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgJC5nZXQoJy9teS91cmwnLGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICAgY29uc29sZS5sb2coJ2NoYWluMScpO1xyXG4gICAgLy8gICAgICAgICAgbmV4dCgpO1xyXG4gICAgLy8gICAgICAgIH0pO1xyXG4gICAgLy8gICAgICB9LGZ1bmN0aW9uKGNvbnRleHQsbmV4dCkge1xyXG4gICAgLy8gICAgICAgIGNvbnNvbGUubG9nKCdjaGFpbjInKTtcclxuICAgIC8vICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIHRoaXMuX29uQ29tcGxldGUgPSBjYWxsYmFjaztcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJldHVybnMgYHRydWVgIGlmIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuXHJcbiAgICBpc1J1bm5pbmc6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fcnVubmluZztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gSGVscGVycyBleHRlbmRzIHRoZSBFdmVudENvbnRleHQgcHJvdG90eXBlIHNwZWNpZmljIHRvIHRoaXMgYXBwLlxyXG4gICAgLy8gVGhpcyBhbGxvd3MgeW91IHRvIGRlZmluZSBhcHAgc3BlY2lmaWMgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkXHJcbiAgICAvLyB3aGVuZXZlciB5b3UncmUgaW5zaWRlIG9mIGFuIGV2ZW50IGNvbnRleHQgKHRlbXBsYXRlcywgcm91dGVzLCBiaW5kKS5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICB2YXIgYXBwID0gJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICBoZWxwZXJzKHtcclxuICAgIC8vICAgICAgICAgdXBjYXNlOiBmdW5jdGlvbih0ZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgIGdldCgnIy8nLCBmdW5jdGlvbigpIHsgd2l0aCh0aGlzKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIGluc2lkZSBvZiB0aGlzIGNvbnRleHQgSSBjYW4gdXNlIHRoZSBoZWxwZXJzXHJcbiAgICAvLyAgICAgICAgICQoJyNtYWluJykuaHRtbCh1cGNhc2UoJCgnI21haW4nKS50ZXh0KCkpO1xyXG4gICAgLy8gICAgICAgfX0pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYGV4dGVuc2lvbnNgIEFuIG9iamVjdCBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyB0byBleHRlbmQgdGhlIGNvbnRleHQuXHJcbiAgICAvL1xyXG4gICAgaGVscGVyczogZnVuY3Rpb24oZXh0ZW5zaW9ucykge1xyXG4gICAgICAkLmV4dGVuZCh0aGlzLmNvbnRleHRfcHJvdG90eXBlLnByb3RvdHlwZSwgZXh0ZW5zaW9ucyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBIZWxwZXIgZXh0ZW5kcyB0aGUgZXZlbnQgY29udGV4dCBqdXN0IGxpa2UgYGhlbHBlcnMoKWAgYnV0IGRvZXMgaXRcclxuICAgIC8vIGEgc2luZ2xlIG1ldGhvZCBhdCBhIHRpbWUuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIGR5bmFtaWNhbGx5IG5hbWVkXHJcbiAgICAvLyBoZWxwZXJzXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gVHJpdmlhbCBleGFtcGxlIHRoYXQgYWRkcyAzIGhlbHBlciBtZXRob2RzIHRvIHRoZSBjb250ZXh0IGR5bmFtaWNhbGx5XHJcbiAgICAvLyAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oYXBwKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgJC5lYWNoKFsxLDIsM10sIGZ1bmN0aW9uKGksIG51bSkge1xyXG4gICAgLy8gICAgICAgICBhcHAuaGVscGVyKCdoZWxwZXInICsgbnVtLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgICB0aGlzLmxvZyhcIkknbSBoZWxwZXIgbnVtYmVyIFwiICsgbnVtKTtcclxuICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICB0aGlzLmdldCgnIy8nLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5oZWxwZXIyKCk7IC8vPT4gSSdtIGhlbHBlciBudW1iZXIgMlxyXG4gICAgLy8gICAgICAgfSk7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYG5hbWVgIFRoZSBuYW1lIG9mIHRoZSBtZXRob2RcclxuICAgIC8vICogYG1ldGhvZGAgVGhlIGZ1bmN0aW9uIHRvIGJlIGFkZGVkIHRvIHRoZSBwcm90b3R5cGUgYXQgYG5hbWVgXHJcbiAgICAvL1xyXG4gICAgaGVscGVyOiBmdW5jdGlvbihuYW1lLCBtZXRob2QpIHtcclxuICAgICAgdGhpcy5jb250ZXh0X3Byb3RvdHlwZS5wcm90b3R5cGVbbmFtZV0gPSBtZXRob2Q7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBY3R1YWxseSBzdGFydHMgdGhlIGFwcGxpY2F0aW9uJ3MgbGlmZWN5Y2xlLiBgcnVuKClgIHNob3VsZCBiZSBpbnZva2VkXHJcbiAgICAvLyB3aXRoaW4gYSBkb2N1bWVudC5yZWFkeSBibG9jayB0byBlbnN1cmUgdGhlIERPTSBleGlzdHMgYmVmb3JlIGJpbmRpbmcgZXZlbnRzLCBldGMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7IC4uLiB9KTsgLy8geW91ciBhcHBsaWNhdGlvblxyXG4gICAgLy8gICAgICQoZnVuY3Rpb24oKSB7IC8vIGRvY3VtZW50LnJlYWR5XHJcbiAgICAvLyAgICAgICAgYXBwLnJ1bigpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGBzdGFydF91cmxgIE9wdGlvbmFsbHksIGEgU3RyaW5nIGNhbiBiZSBwYXNzZWQgd2hpY2ggdGhlIEFwcCB3aWxsIHJlZGlyZWN0IHRvXHJcbiAgICAvLyAgIGFmdGVyIHRoZSBldmVudHMvcm91dGVzIGhhdmUgYmVlbiBib3VuZC5cclxuICAgIHJ1bjogZnVuY3Rpb24oc3RhcnRfdXJsKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICB2YXIgYXBwID0gdGhpcztcclxuXHJcbiAgICAgIC8vIGFjdHVhbGx5IGJpbmQgYWxsIHRoZSBsaXN0ZW5lcnNcclxuICAgICAgJC5lYWNoKHRoaXMubGlzdGVuZXJzLnRvSGFzaCgpLCBmdW5jdGlvbihuYW1lLCBjYWxsYmFja3MpIHtcclxuICAgICAgICAkLmVhY2goY2FsbGJhY2tzLCBmdW5jdGlvbihpLCBsaXN0ZW5lcl9jYWxsYmFjaykge1xyXG4gICAgICAgICAgYXBwLl9saXN0ZW4obmFtZSwgbGlzdGVuZXJfY2FsbGJhY2spO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudHJpZ2dlcigncnVuJywge3N0YXJ0X3VybDogc3RhcnRfdXJsfSk7XHJcbiAgICAgIHRoaXMuX3J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAvLyBzZXQgbGFzdCBsb2NhdGlvblxyXG4gICAgICB0aGlzLmxhc3RfbG9jYXRpb24gPSBudWxsO1xyXG4gICAgICBpZiAoISgvXFwjKC4rKS8udGVzdCh0aGlzLmdldExvY2F0aW9uKCkpKSAmJiB0eXBlb2Ygc3RhcnRfdXJsICE9ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhpcy5zZXRMb2NhdGlvbihzdGFydF91cmwpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNoZWNrIHVybFxyXG4gICAgICB0aGlzLl9jaGVja0xvY2F0aW9uKCk7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uX3Byb3h5LmJpbmQoKTtcclxuICAgICAgdGhpcy5iaW5kKCdsb2NhdGlvbi1jaGFuZ2VkJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgYXBwLl9jaGVja0xvY2F0aW9uKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gYmluZCB0byBzdWJtaXQgdG8gY2FwdHVyZSBwb3N0L3B1dC9kZWxldGUgcm91dGVzXHJcbiAgICAgIHRoaXMuYmluZCgnc3VibWl0JywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGlmICggIVNhbW15LnRhcmdldElzVGhpc1dpbmRvdyhlLCAnZm9ybScpICkgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gICAgICAgIHZhciByZXR1cm5lZCA9IGFwcC5fY2hlY2tGb3JtU3VibWlzc2lvbigkKGUudGFyZ2V0KS5jbG9zZXN0KCdmb3JtJykpO1xyXG4gICAgICAgIHJldHVybiAocmV0dXJuZWQgPT09IGZhbHNlKSA/IGUucHJldmVudERlZmF1bHQoKSA6IGZhbHNlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIGJpbmQgdW5sb2FkIHRvIGJvZHkgdW5sb2FkXHJcbiAgICAgICQod2luZG93KS5iaW5kKCd1bmxvYWQnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBhcHAudW5sb2FkKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gdHJpZ2dlciBodG1sIGNoYW5nZWRcclxuICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcignY2hhbmdlZCcpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBUaGUgb3Bwb3NpdGUgb2YgYHJ1bigpYCwgdW4tYmluZHMgYWxsIGV2ZW50IGxpc3RlbmVycyBhbmQgaW50ZXJ2YWxzXHJcbiAgICAvLyBgcnVuKClgIEF1dG9tYXRpY2FsbHkgYmluZHMgYSBgb251bmxvYWRgIGV2ZW50IHRvIHJ1biB0aGlzIHdoZW5cclxuICAgIC8vIHRoZSBkb2N1bWVudCBpcyBjbG9zZWQuXHJcbiAgICB1bmxvYWQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKCkpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzO1xyXG4gICAgICB0aGlzLnRyaWdnZXIoJ3VubG9hZCcpO1xyXG4gICAgICAvLyBjbGVhciBpbnRlcnZhbFxyXG4gICAgICB0aGlzLl9sb2NhdGlvbl9wcm94eS51bmJpbmQoKTtcclxuICAgICAgLy8gdW5iaW5kIGZvcm0gc3VibWl0c1xyXG4gICAgICB0aGlzLiRlbGVtZW50KCkudW5iaW5kKCdzdWJtaXQnKS5yZW1vdmVDbGFzcyhhcHAuZXZlbnROYW1lc3BhY2UoKSk7XHJcbiAgICAgIC8vIHVuYmluZCBhbGwgZXZlbnRzXHJcbiAgICAgICQuZWFjaCh0aGlzLmxpc3RlbmVycy50b0hhc2goKSAsIGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVycykge1xyXG4gICAgICAgICQuZWFjaChsaXN0ZW5lcnMsIGZ1bmN0aW9uKGksIGxpc3RlbmVyX2NhbGxiYWNrKSB7XHJcbiAgICAgICAgICBhcHAuX3VubGlzdGVuKG5hbWUsIGxpc3RlbmVyX2NhbGxiYWNrKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIE5vdCBvbmx5IHJ1bnMgYHVuYmluZGAgYnV0IGFsc28gZGVzdHJveXMgdGhlIGFwcCByZWZlcmVuY2UuXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcclxuICAgICAgdGhpcy51bmxvYWQoKTtcclxuICAgICAgZGVsZXRlIFNhbW15LmFwcHNbdGhpcy5lbGVtZW50X3NlbGVjdG9yXTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFdpbGwgYmluZCBhIHNpbmdsZSBjYWxsYmFjayBmdW5jdGlvbiB0byBldmVyeSBldmVudCB0aGF0IGlzIGFscmVhZHlcclxuICAgIC8vIGJlaW5nIGxpc3RlbmVkIHRvIGluIHRoZSBhcHAuIFRoaXMgaW5jbHVkZXMgYWxsIHRoZSBgQVBQX0VWRU5UU2BcclxuICAgIC8vIGFzIHdlbGwgYXMgYW55IGN1c3RvbSBldmVudHMgZGVmaW5lZCB3aXRoIGBiaW5kKClgLlxyXG4gICAgLy9cclxuICAgIC8vIFVzZWQgaW50ZXJuYWxseSBmb3IgZGVidWcgbG9nZ2luZy5cclxuICAgIGJpbmRUb0FsbEV2ZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgdmFyIGFwcCA9IHRoaXM7XHJcbiAgICAgIC8vIGJpbmQgdG8gdGhlIEFQUF9FVkVOVFMgZmlyc3RcclxuICAgICAgJC5lYWNoKHRoaXMuQVBQX0VWRU5UUywgZnVuY3Rpb24oaSwgZSkge1xyXG4gICAgICAgIGFwcC5iaW5kKGUsIGNhbGxiYWNrKTtcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIG5leHQsIGJpbmQgdG8gbGlzdGVuZXIgbmFtZXMgKG9ubHkgaWYgdGhleSBkb250IGV4aXN0IGluIEFQUF9FVkVOVFMpXHJcbiAgICAgICQuZWFjaCh0aGlzLmxpc3RlbmVycy5rZXlzKHRydWUpLCBmdW5jdGlvbihpLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKCQuaW5BcnJheShuYW1lLCBhcHAuQVBQX0VWRU5UUykgPT0gLTEpIHtcclxuICAgICAgICAgIGFwcC5iaW5kKG5hbWUsIGNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIGdpdmVuIHBhdGggd2l0aCBhbnkgcXVlcnkgc3RyaW5nIGFmdGVyIHRoZSBoYXNoXHJcbiAgICAvLyByZW1vdmVkLlxyXG4gICAgcm91dGFibGVQYXRoOiBmdW5jdGlvbihwYXRoKSB7XHJcbiAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoUVVFUllfU1RSSU5HX01BVENIRVIsICcnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gR2l2ZW4gYSB2ZXJiIGFuZCBhIFN0cmluZyBwYXRoLCB3aWxsIHJldHVybiBlaXRoZXIgYSByb3V0ZSBvYmplY3Qgb3IgZmFsc2VcclxuICAgIC8vIGlmIGEgbWF0Y2hpbmcgcm91dGUgY2FuIGJlIGZvdW5kIHdpdGhpbiB0aGUgY3VycmVudCBkZWZpbmVkIHNldC5cclxuICAgIGxvb2t1cFJvdXRlOiBmdW5jdGlvbih2ZXJiLCBwYXRoKSB7XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzLCByb3V0ZWQgPSBmYWxzZSwgaSA9IDAsIGwsIHJvdXRlO1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMucm91dGVzW3ZlcmJdICE9ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgbCA9IHRoaXMucm91dGVzW3ZlcmJdLmxlbmd0aDtcclxuICAgICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgcm91dGUgPSB0aGlzLnJvdXRlc1t2ZXJiXVtpXTtcclxuICAgICAgICAgIGlmIChhcHAucm91dGFibGVQYXRoKHBhdGgpLm1hdGNoKHJvdXRlLnBhdGgpKSB7XHJcbiAgICAgICAgICAgIHJvdXRlZCA9IHJvdXRlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJvdXRlZDtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gRmlyc3QsIGludm9rZXMgYGxvb2t1cFJvdXRlKClgIGFuZCBpZiBhIHJvdXRlIGlzIGZvdW5kLCBwYXJzZXMgdGhlXHJcbiAgICAvLyBwb3NzaWJsZSBVUkwgcGFyYW1zIGFuZCB0aGVuIGludm9rZXMgdGhlIHJvdXRlJ3MgY2FsbGJhY2sgd2l0aGluIGEgbmV3XHJcbiAgICAvLyBgU2FtbXkuRXZlbnRDb250ZXh0YC4gSWYgdGhlIHJvdXRlIGNhbiBub3QgYmUgZm91bmQsIGl0IGNhbGxzXHJcbiAgICAvLyBgbm90Rm91bmQoKWAuIElmIGByYWlzZV9lcnJvcnNgIGlzIHNldCB0byBgdHJ1ZWAgYW5kXHJcbiAgICAvLyB0aGUgYGVycm9yKClgIGhhcyBub3QgYmVlbiBvdmVycmlkZGVuLCBpdCB3aWxsIHRocm93IGFuIGFjdHVhbCBKU1xyXG4gICAgLy8gZXJyb3IuXHJcbiAgICAvL1xyXG4gICAgLy8gWW91IHByb2JhYmx5IHdpbGwgbmV2ZXIgaGF2ZSB0byBjYWxsIHRoaXMgZGlyZWN0bHkuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYHZlcmJgIEEgU3RyaW5nIGZvciB0aGUgdmVyYi5cclxuICAgIC8vICogYHBhdGhgIEEgU3RyaW5nIHBhdGggdG8gbG9va3VwLlxyXG4gICAgLy8gKiBgcGFyYW1zYCBBbiBPYmplY3Qgb2YgUGFyYW1zIHB1bGxlZCBmcm9tIHRoZSBVUkkgb3IgcGFzc2VkIGRpcmVjdGx5LlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBSZXR1cm5zXHJcbiAgICAvL1xyXG4gICAgLy8gRWl0aGVyIHJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSByb3V0ZSBjYWxsYmFjayBvciByYWlzZXMgYSA0MDQgTm90IEZvdW5kIGVycm9yLlxyXG4gICAgLy9cclxuICAgIHJ1blJvdXRlOiBmdW5jdGlvbih2ZXJiLCBwYXRoLCBwYXJhbXMsIHRhcmdldCkge1xyXG4gICAgICB2YXIgYXBwID0gdGhpcyxcclxuICAgICAgICAgIHJvdXRlID0gdGhpcy5sb29rdXBSb3V0ZSh2ZXJiLCBwYXRoKSxcclxuICAgICAgICAgIGNvbnRleHQsXHJcbiAgICAgICAgICB3cmFwcGVkX3JvdXRlLFxyXG4gICAgICAgICAgYXJvdW5kcyxcclxuICAgICAgICAgIGFyb3VuZCxcclxuICAgICAgICAgIGJlZm9yZXMsXHJcbiAgICAgICAgICBiZWZvcmUsXHJcbiAgICAgICAgICBjYWxsYmFja19hcmdzLFxyXG4gICAgICAgICAgcGF0aF9wYXJhbXMsXHJcbiAgICAgICAgICBmaW5hbF9yZXR1cm5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgdGhpcy5sb2coJ3J1blJvdXRlJywgW3ZlcmIsIHBhdGhdLmpvaW4oJyAnKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudHJpZ2dlcigncnVuLXJvdXRlJywge3ZlcmI6IHZlcmIsIHBhdGg6IHBhdGgsIHBhcmFtczogcGFyYW1zfSk7XHJcbiAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09ICd1bmRlZmluZWQnKSB7IHBhcmFtcyA9IHt9OyB9XHJcblxyXG4gICAgICAkLmV4dGVuZChwYXJhbXMsIHRoaXMuX3BhcnNlUXVlcnlTdHJpbmcocGF0aCkpO1xyXG5cclxuICAgICAgaWYgKHJvdXRlKSB7XHJcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdyb3V0ZS1mb3VuZCcsIHtyb3V0ZTogcm91dGV9KTtcclxuICAgICAgICAvLyBwdWxsIG91dCB0aGUgcGFyYW1zIGZyb20gdGhlIHBhdGhcclxuICAgICAgICBpZiAoKHBhdGhfcGFyYW1zID0gcm91dGUucGF0aC5leGVjKHRoaXMucm91dGFibGVQYXRoKHBhdGgpKSkgIT09IG51bGwpIHtcclxuICAgICAgICAgIC8vIGZpcnN0IG1hdGNoIGlzIHRoZSBmdWxsIHBhdGhcclxuICAgICAgICAgIHBhdGhfcGFyYW1zLnNoaWZ0KCk7XHJcbiAgICAgICAgICAvLyBmb3IgZWFjaCBvZiB0aGUgbWF0Y2hlc1xyXG4gICAgICAgICAgJC5lYWNoKHBhdGhfcGFyYW1zLCBmdW5jdGlvbihpLCBwYXJhbSkge1xyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZXMgYSBtYXRjaGluZyBwYXJhbSBuYW1lXHJcbiAgICAgICAgICAgIGlmIChyb3V0ZS5wYXJhbV9uYW1lc1tpXSkge1xyXG4gICAgICAgICAgICAgIC8vIHNldCB0aGUgbmFtZSB0byB0aGUgbWF0Y2hcclxuICAgICAgICAgICAgICBwYXJhbXNbcm91dGUucGFyYW1fbmFtZXNbaV1dID0gX2RlY29kZShwYXJhbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSAnc3BsYXQnXHJcbiAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuc3BsYXQpIHsgcGFyYW1zLnNwbGF0ID0gW107IH1cclxuICAgICAgICAgICAgICBwYXJhbXMuc3BsYXQucHVzaChfZGVjb2RlKHBhcmFtKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0IGV2ZW50IGNvbnRleHRcclxuICAgICAgICBjb250ZXh0ICA9IG5ldyB0aGlzLmNvbnRleHRfcHJvdG90eXBlKHRoaXMsIHZlcmIsIHBhdGgsIHBhcmFtcywgdGFyZ2V0KTtcclxuICAgICAgICAvLyBlbnN1cmUgYXJyYXlzXHJcbiAgICAgICAgYXJvdW5kcyA9IHRoaXMuYXJvdW5kcy5zbGljZSgwKTtcclxuICAgICAgICBiZWZvcmVzID0gdGhpcy5iZWZvcmVzLnNsaWNlKDApO1xyXG4gICAgICAgIC8vIHNldCB0aGUgY2FsbGJhY2sgYXJncyB0byB0aGUgY29udGV4dCArIGNvbnRlbnRzIG9mIHRoZSBzcGxhdFxyXG4gICAgICAgIGNhbGxiYWNrX2FyZ3MgPSBbY29udGV4dF07XHJcbiAgICAgICAgaWYgKHBhcmFtcy5zcGxhdCkge1xyXG4gICAgICAgICAgY2FsbGJhY2tfYXJncyA9IGNhbGxiYWNrX2FyZ3MuY29uY2F0KHBhcmFtcy5zcGxhdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHdyYXAgdGhlIHJvdXRlIHVwIHdpdGggdGhlIGJlZm9yZSBmaWx0ZXJzXHJcbiAgICAgICAgd3JhcHBlZF9yb3V0ZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgdmFyIHJldHVybmVkLCBpLCBuZXh0Um91dGU7XHJcbiAgICAgICAgICB3aGlsZSAoYmVmb3Jlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGJlZm9yZSA9IGJlZm9yZXMuc2hpZnQoKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgdGhlIG9wdGlvbnNcclxuICAgICAgICAgICAgaWYgKGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgYmVmb3JlWzBdKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybmVkID0gYmVmb3JlWzFdLmFwcGx5KGNvbnRleHQsIFtjb250ZXh0XSk7XHJcbiAgICAgICAgICAgICAgaWYgKHJldHVybmVkID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXBwLmxhc3Rfcm91dGUgPSByb3V0ZTtcclxuICAgICAgICAgIGNvbnRleHQudHJpZ2dlcignZXZlbnQtY29udGV4dC1iZWZvcmUnLCB7Y29udGV4dDogY29udGV4dH0pO1xyXG4gICAgICAgICAgLy8gcnVuIG11bHRpcGxlIGNhbGxiYWNrc1xyXG4gICAgICAgICAgaWYgKHR5cGVvZihyb3V0ZS5jYWxsYmFjaykgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICByb3V0ZS5jYWxsYmFjayA9IFtyb3V0ZS5jYWxsYmFja107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocm91dGUuY2FsbGJhY2sgJiYgcm91dGUuY2FsbGJhY2subGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGkgPSAtMTtcclxuICAgICAgICAgICAgbmV4dFJvdXRlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgIGlmIChyb3V0ZS5jYWxsYmFja1tpXSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuZWQgPSByb3V0ZS5jYWxsYmFja1tpXS5hcHBseShjb250ZXh0LGNhbGxiYWNrX2FyZ3MpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwLl9vbkNvbXBsZXRlICYmIHR5cGVvZihhcHAuX29uQ29tcGxldGUgPT09IFwiZnVuY3Rpb25cIikpIHtcclxuICAgICAgICAgICAgICAgIGFwcC5fb25Db21wbGV0ZShjb250ZXh0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNhbGxiYWNrX2FyZ3MucHVzaChuZXh0Um91dGUpO1xyXG4gICAgICAgICAgICBuZXh0Um91dGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnRleHQudHJpZ2dlcignZXZlbnQtY29udGV4dC1hZnRlcicsIHtjb250ZXh0OiBjb250ZXh0fSk7XHJcbiAgICAgICAgICByZXR1cm4gcmV0dXJuZWQ7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAkLmVhY2goYXJvdW5kcy5yZXZlcnNlKCksIGZ1bmN0aW9uKGksIGFyb3VuZCkge1xyXG4gICAgICAgICAgdmFyIGxhc3Rfd3JhcHBlZF9yb3V0ZSA9IHdyYXBwZWRfcm91dGU7XHJcbiAgICAgICAgICB3cmFwcGVkX3JvdXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBhcm91bmQuYXBwbHkoY29udGV4dCwgW2xhc3Rfd3JhcHBlZF9yb3V0ZV0pOyB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBmaW5hbF9yZXR1cm5lZCA9IHdyYXBwZWRfcm91dGUoKTtcclxuICAgICAgICB9IGNhdGNoKGUpIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3IoWyc1MDAgRXJyb3InLCB2ZXJiLCBwYXRoXS5qb2luKCcgJyksIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmluYWxfcmV0dXJuZWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm90Rm91bmQodmVyYiwgcGF0aCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8gTWF0Y2hlcyBhbiBvYmplY3Qgb2Ygb3B0aW9ucyBhZ2FpbnN0IGFuIGBFdmVudENvbnRleHRgIGxpa2Ugb2JqZWN0IHRoYXRcclxuICAgIC8vIGNvbnRhaW5zIGBwYXRoYCBhbmQgYHZlcmJgIGF0dHJpYnV0ZXMuIEludGVybmFsbHkgU2FtbXkgdXNlcyB0aGlzXHJcbiAgICAvLyBmb3IgbWF0Y2hpbmcgYGJlZm9yZSgpYCBmaWx0ZXJzIGFnYWluc3Qgc3BlY2lmaWMgb3B0aW9ucy4gWW91IGNhbiBzZXQgdGhlXHJcbiAgICAvLyBvYmplY3QgdG8gX29ubHlfIG1hdGNoIGNlcnRhaW4gcGF0aHMgb3IgdmVyYnMsIG9yIG1hdGNoIGFsbCBwYXRocyBvciB2ZXJicyBfZXhjZXB0X1xyXG4gICAgLy8gdGhvc2UgdGhhdCBtYXRjaCB0aGUgb3B0aW9ucy5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICB2YXIgYXBwID0gJC5zYW1teSgpLFxyXG4gICAgLy8gICAgICAgICBjb250ZXh0ID0ge3ZlcmI6ICdnZXQnLCBwYXRoOiAnIy9teXBhdGgnfTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggYWdhaW5zdCBhIHBhdGggc3RyaW5nXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCAnIy9teXBhdGgnKTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCAnIy9vdGhlcnBhdGgnKTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIGVxdWl2YWxlbnQgdG9cclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtvbmx5OiB7cGF0aDonIy9teXBhdGgnfX0pOyAvLz0+IHRydWVcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtvbmx5OiB7cGF0aDonIy9vdGhlcnBhdGgnfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggYWdhaW5zdCBhIHBhdGggcmVnZXhwXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCAvcGF0aC8pOyAvLz0+IHRydWVcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIC9ecGF0aC8pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggb25seSBhIHZlcmJcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtvbmx5OiB7dmVyYjonZ2V0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3ZlcmI6J3Bvc3QnfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggYWxsIGV4Y2VwdCBhIHZlcmJcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHt2ZXJiOidwb3N0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7dmVyYjonZ2V0J319KTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFsbCBleGNlcHQgYSBwYXRoXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9vdGhlcnBhdGgnfX0pOyAvLz0+IHRydWVcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOicjL215cGF0aCd9fSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICAvLyBtYXRjaCBhbGwgZXhjZXB0IGEgdmVyYiBhbmQgYSBwYXRoXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9vdGhlcnBhdGgnLCB2ZXJiOidwb3N0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9teXBhdGgnLCB2ZXJiOidwb3N0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9teXBhdGgnLCB2ZXJiOidnZXQnfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggbXVsdGlwbGUgcGF0aHNcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtwYXRoOiBbJyMvbXlwYXRoJywgJyMvb3RoZXJwYXRoJ119KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7cGF0aDogWycjL290aGVycGF0aCcsICcjL3RoaXJkcGF0aCddfSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICAvLyBlcXVpdmFsZW50IHRvXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3BhdGg6IFsnIy9teXBhdGgnLCAnIy9vdGhlcnBhdGgnXX19KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3BhdGg6IFsnIy9vdGhlcnBhdGgnLCAnIy90aGlyZHBhdGgnXX19KTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFsbCBleGNlcHQgbXVsdGlwbGUgcGF0aHNcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOiBbJyMvbXlwYXRoJywgJyMvb3RoZXJwYXRoJ119fSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOiBbJyMvb3RoZXJwYXRoJywgJyMvdGhpcmRwYXRoJ119fSk7IC8vPT4gdHJ1ZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFsbCBleGNlcHQgbXVsdGlwbGUgcGF0aHMgYW5kIHZlcmJzXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDogWycjL215cGF0aCcsICcjL290aGVycGF0aCddLCB2ZXJiOiBbJ2dldCcsICdwb3N0J119fSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOiBbJyMvb3RoZXJwYXRoJywgJyMvdGhpcmRwYXRoJ10sIHZlcmI6IFsnZ2V0JywgJ3Bvc3QnXX19KTsgLy89PiB0cnVlXHJcbiAgICAvL1xyXG4gICAgY29udGV4dE1hdGNoZXNPcHRpb25zOiBmdW5jdGlvbihjb250ZXh0LCBtYXRjaF9vcHRpb25zLCBwb3NpdGl2ZSkge1xyXG4gICAgICB2YXIgb3B0aW9ucyA9IG1hdGNoX29wdGlvbnM7XHJcbiAgICAgIC8vIG5vcm1hbGl6ZSBvcHRpb25zXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgfHwgX2lzUmVnRXhwKG9wdGlvbnMpKSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IHtwYXRoOiBvcHRpb25zfTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodHlwZW9mIHBvc2l0aXZlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHBvc2l0aXZlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBlbXB0eSBvcHRpb25zIGFsd2F5cyBtYXRjaFxyXG4gICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KG9wdGlvbnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gRG8gd2UgaGF2ZSB0byBtYXRjaCBhZ2FpbnN0IG11bHRpcGxlIHBhdGhzP1xyXG4gICAgICBpZiAoX2lzQXJyYXkob3B0aW9ucy5wYXRoKSl7XHJcbiAgICAgICAgdmFyIHJlc3VsdHMsIG51bW9wdCwgb3B0cywgbGVuO1xyXG4gICAgICAgIHJlc3VsdHMgPSBbXTtcclxuICAgICAgICBmb3IgKG51bW9wdCA9IDAsIGxlbiA9IG9wdGlvbnMucGF0aC5sZW5ndGg7IG51bW9wdCA8IGxlbjsgbnVtb3B0ICs9IDEpIHtcclxuICAgICAgICAgIG9wdHMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucywge3BhdGg6IG9wdGlvbnMucGF0aFtudW1vcHRdfSk7XHJcbiAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgb3B0cykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbWF0Y2hlZCA9ICQuaW5BcnJheSh0cnVlLCByZXN1bHRzKSA+IC0xID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBwb3NpdGl2ZSA/IG1hdGNoZWQgOiAhbWF0Y2hlZDtcclxuICAgICAgfVxyXG4gICAgICBpZiAob3B0aW9ucy5vbmx5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIG9wdGlvbnMub25seSwgdHJ1ZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5leGNlcHQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgb3B0aW9ucy5leGNlcHQsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgcGF0aF9tYXRjaGVkID0gdHJ1ZSwgdmVyYl9tYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKG9wdGlvbnMucGF0aCkge1xyXG4gICAgICAgIGlmICghX2lzUmVnRXhwKG9wdGlvbnMucGF0aCkpIHtcclxuICAgICAgICAgIG9wdGlvbnMucGF0aCA9IG5ldyBSZWdFeHAob3B0aW9ucy5wYXRoLnRvU3RyaW5nKCkgKyAnJCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYXRoX21hdGNoZWQgPSBvcHRpb25zLnBhdGgudGVzdChjb250ZXh0LnBhdGgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvcHRpb25zLnZlcmIpIHtcclxuICAgICAgICBpZih0eXBlb2Ygb3B0aW9ucy52ZXJiID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgdmVyYl9tYXRjaGVkID0gb3B0aW9ucy52ZXJiID09PSBjb250ZXh0LnZlcmI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZlcmJfbWF0Y2hlZCA9IG9wdGlvbnMudmVyYi5pbmRleE9mKGNvbnRleHQudmVyYikgPiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBvc2l0aXZlID8gKHZlcmJfbWF0Y2hlZCAmJiBwYXRoX21hdGNoZWQpIDogISh2ZXJiX21hdGNoZWQgJiYgcGF0aF9tYXRjaGVkKTtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIC8vIERlbGVnYXRlcyB0byB0aGUgYGxvY2F0aW9uX3Byb3h5YCB0byBnZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uXHJcbiAgICAvLyBTZWUgYFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5YCBmb3IgbW9yZSBpbmZvIG9uIGxvY2F0aW9uIHByb3hpZXMuXHJcbiAgICBnZXRMb2NhdGlvbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9sb2NhdGlvbl9wcm94eS5nZXRMb2NhdGlvbigpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBEZWxlZ2F0ZXMgdG8gdGhlIGBsb2NhdGlvbl9wcm94eWAgdG8gc2V0IHRoZSBjdXJyZW50IGxvY2F0aW9uLlxyXG4gICAgLy8gU2VlIGBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eWAgZm9yIG1vcmUgaW5mbyBvbiBsb2NhdGlvbiBwcm94aWVzLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGBuZXdfbG9jYXRpb25gIEEgbmV3IGxvY2F0aW9uIHN0cmluZyAoZS5nLiAnIy8nKVxyXG4gICAgLy9cclxuICAgIHNldExvY2F0aW9uOiBmdW5jdGlvbihuZXdfbG9jYXRpb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2xvY2F0aW9uX3Byb3h5LnNldExvY2F0aW9uKG5ld19sb2NhdGlvbik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFN3YXBzIHRoZSBjb250ZW50IG9mIGAkZWxlbWVudCgpYCB3aXRoIGBjb250ZW50YFxyXG4gICAgLy8gWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFuIGFsdGVybmF0ZSBzd2FwIGJlaGF2aW9yXHJcbiAgICAvLyBmb3IgYEV2ZW50Q29udGV4dC5wYXJ0aWFsKClgLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB2YXIgYXBwID0gJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgLy8gaW1wbGVtZW50cyBhICdmYWRlIG91dCcvJ2ZhZGUgaW4nXHJcbiAgICAvLyAgICAgICAgdGhpcy5zd2FwID0gZnVuY3Rpb24oY29udGVudCwgY2FsbGJhY2spIHtcclxuICAgIC8vICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcclxuICAgIC8vICAgICAgICAgIGNvbnRleHQuJGVsZW1lbnQoKS5mYWRlT3V0KCdzbG93JywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICAgIGNvbnRleHQuJGVsZW1lbnQoKS5odG1sKGNvbnRlbnQpO1xyXG4gICAgLy8gICAgICAgICAgICBjb250ZXh0LiRlbGVtZW50KCkuZmFkZUluKCdzbG93JywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSgpO1xyXG4gICAgLy8gICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICB9O1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgc3dhcDogZnVuY3Rpb24oY29udGVudCwgY2FsbGJhY2spIHtcclxuICAgICAgdmFyICRlbCA9IHRoaXMuJGVsZW1lbnQoKS5odG1sKGNvbnRlbnQpO1xyXG4gICAgICBpZiAoX2lzRnVuY3Rpb24oY2FsbGJhY2spKSB7IGNhbGxiYWNrKGNvbnRlbnQpOyB9XHJcbiAgICAgIHJldHVybiAkZWw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGEgc2ltcGxlIGdsb2JhbCBjYWNoZSBmb3IgdGVtcGxhdGVzLiBVc2VzIHRoZSBzYW1lIHNlbWFudGljcyBhc1xyXG4gICAgLy8gYFNhbW15LkNhY2hlYCBhbmQgYFNhbW15LlN0b3JhZ2VgIHNvIGNhbiBlYXNpbHkgYmUgcmVwbGFjZWQgd2l0aFxyXG4gICAgLy8gYSBwZXJzaXN0ZW50IHN0b3JhZ2UgdGhhdCBsYXN0cyBiZXlvbmQgdGhlIGN1cnJlbnQgcmVxdWVzdC5cclxuICAgIHRlbXBsYXRlQ2FjaGU6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcclxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBfdGVtcGxhdGVfY2FjaGVba2V5XSA9IHZhbHVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBfdGVtcGxhdGVfY2FjaGVba2V5XTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyBjbGVhciB0aGUgdGVtcGxhdGVDYWNoZVxyXG4gICAgY2xlYXJUZW1wbGF0ZUNhY2hlOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIChfdGVtcGxhdGVfY2FjaGUgPSB7fSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFRoaXMgdGhyb3dzIGEgJzQwNCBOb3QgRm91bmQnIGVycm9yIGJ5IGludm9raW5nIGBlcnJvcigpYC5cclxuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIG9yIGBlcnJvcigpYCB0byBwcm92aWRlIGN1c3RvbVxyXG4gICAgLy8gNDA0IGJlaGF2aW9yIChpLmUgcmVkaXJlY3RpbmcgdG8gLyBvciBzaG93aW5nIGEgd2FybmluZylcclxuICAgIG5vdEZvdW5kOiBmdW5jdGlvbih2ZXJiLCBwYXRoKSB7XHJcbiAgICAgIHZhciByZXQgPSB0aGlzLmVycm9yKFsnNDA0IE5vdCBGb3VuZCcsIHZlcmIsIHBhdGhdLmpvaW4oJyAnKSk7XHJcbiAgICAgIHJldHVybiAodmVyYiA9PT0gJ2dldCcpID8gcmV0IDogdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gVGhlIGJhc2UgZXJyb3IgaGFuZGxlciB0YWtlcyBhIHN0cmluZyBgbWVzc2FnZWAgYW5kIGFuIGBFcnJvcmBcclxuICAgIC8vIG9iamVjdC4gSWYgYHJhaXNlX2Vycm9yc2AgaXMgc2V0IHRvIGB0cnVlYCBvbiB0aGUgYXBwIGxldmVsLFxyXG4gICAgLy8gdGhpcyB3aWxsIHJlLXRocm93IHRoZSBlcnJvciB0byB0aGUgYnJvd3Nlci4gT3RoZXJ3aXNlIGl0IHdpbGwgc2VuZCB0aGUgZXJyb3JcclxuICAgIC8vIHRvIGBsb2coKWAuIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgY3VzdG9tIGVycm9yIGhhbmRsaW5nXHJcbiAgICAvLyBlLmcgbG9nZ2luZyB0byBhIHNlcnZlciBzaWRlIGNvbXBvbmVudCBvciBkaXNwbGF5aW5nIHNvbWUgZmVlZGJhY2sgdG8gdGhlXHJcbiAgICAvLyB1c2VyLlxyXG4gICAgZXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UsIG9yaWdpbmFsX2Vycm9yKSB7XHJcbiAgICAgIGlmICghb3JpZ2luYWxfZXJyb3IpIHsgb3JpZ2luYWxfZXJyb3IgPSBuZXcgRXJyb3IoKTsgfVxyXG4gICAgICBvcmlnaW5hbF9lcnJvci5tZXNzYWdlID0gW21lc3NhZ2UsIG9yaWdpbmFsX2Vycm9yLm1lc3NhZ2VdLmpvaW4oJyAnKTtcclxuICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicsIHttZXNzYWdlOiBvcmlnaW5hbF9lcnJvci5tZXNzYWdlLCBlcnJvcjogb3JpZ2luYWxfZXJyb3J9KTtcclxuICAgICAgaWYgKHRoaXMucmFpc2VfZXJyb3JzKSB7XHJcbiAgICAgICAgdGhyb3cob3JpZ2luYWxfZXJyb3IpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9nKG9yaWdpbmFsX2Vycm9yLm1lc3NhZ2UsIG9yaWdpbmFsX2Vycm9yKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBfY2hlY2tMb2NhdGlvbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBsb2NhdGlvbiwgcmV0dXJuZWQ7XHJcbiAgICAgIC8vIGdldCBjdXJyZW50IGxvY2F0aW9uXHJcbiAgICAgIGxvY2F0aW9uID0gdGhpcy5nZXRMb2NhdGlvbigpO1xyXG4gICAgICAvLyBjb21wYXJlIHRvIHNlZSBpZiBoYXNoIGhhcyBjaGFuZ2VkXHJcbiAgICAgIGlmICghdGhpcy5sYXN0X2xvY2F0aW9uIHx8IHRoaXMubGFzdF9sb2NhdGlvblswXSAhPSAnZ2V0JyB8fCB0aGlzLmxhc3RfbG9jYXRpb25bMV0gIT0gbG9jYXRpb24pIHtcclxuICAgICAgICAvLyByZXNldCBsYXN0IGxvY2F0aW9uXHJcbiAgICAgICAgdGhpcy5sYXN0X2xvY2F0aW9uID0gWydnZXQnLCBsb2NhdGlvbl07XHJcbiAgICAgICAgLy8gbG9va3VwIHJvdXRlIGZvciBjdXJyZW50IGhhc2hcclxuICAgICAgICByZXR1cm5lZCA9IHRoaXMucnVuUm91dGUoJ2dldCcsIGxvY2F0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmV0dXJuZWQ7XHJcbiAgICB9LFxyXG5cclxuICAgIF9nZXRGb3JtVmVyYjogZnVuY3Rpb24oZm9ybSkge1xyXG4gICAgICB2YXIgJGZvcm0gPSAkKGZvcm0pLCB2ZXJiLCAkX21ldGhvZDtcclxuICAgICAgJF9tZXRob2QgPSAkZm9ybS5maW5kKCdpbnB1dFtuYW1lPVwiX21ldGhvZFwiXScpO1xyXG4gICAgICBpZiAoJF9tZXRob2QubGVuZ3RoID4gMCkgeyB2ZXJiID0gJF9tZXRob2QudmFsKCk7IH1cclxuICAgICAgaWYgKCF2ZXJiKSB7IHZlcmIgPSAkZm9ybVswXS5nZXRBdHRyaWJ1dGUoJ21ldGhvZCcpOyB9XHJcbiAgICAgIGlmICghdmVyYiB8fCB2ZXJiID09PSAnJykgeyB2ZXJiID0gJ2dldCc7IH1cclxuICAgICAgcmV0dXJuICQudHJpbSh2ZXJiLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIF9jaGVja0Zvcm1TdWJtaXNzaW9uOiBmdW5jdGlvbihmb3JtKSB7XHJcbiAgICAgIHZhciAkZm9ybSwgcGF0aCwgdmVyYiwgcGFyYW1zLCByZXR1cm5lZDtcclxuICAgICAgdGhpcy50cmlnZ2VyKCdjaGVjay1mb3JtLXN1Ym1pc3Npb24nLCB7Zm9ybTogZm9ybX0pO1xyXG4gICAgICAkZm9ybSA9ICQoZm9ybSk7XHJcbiAgICAgIHBhdGggID0gJGZvcm0uYXR0cignYWN0aW9uJykgfHwgJyc7XHJcbiAgICAgIHZlcmIgID0gdGhpcy5fZ2V0Rm9ybVZlcmIoJGZvcm0pO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICB0aGlzLmxvZygnX2NoZWNrRm9ybVN1Ym1pc3Npb24nLCAkZm9ybSwgcGF0aCwgdmVyYik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xyXG4gICAgICAgIHBhcmFtcyA9IHRoaXMuX3NlcmlhbGl6ZUZvcm1QYXJhbXMoJGZvcm0pO1xyXG4gICAgICAgIGlmIChwYXJhbXMgIT09ICcnKSB7IHBhdGggKz0gJz8nICsgcGFyYW1zOyB9XHJcbiAgICAgICAgdGhpcy5zZXRMb2NhdGlvbihwYXRoKTtcclxuICAgICAgICByZXR1cm5lZCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmFtcyA9ICQuZXh0ZW5kKHt9LCB0aGlzLl9wYXJzZUZvcm1QYXJhbXMoJGZvcm0pKTtcclxuICAgICAgICByZXR1cm5lZCA9IHRoaXMucnVuUm91dGUodmVyYiwgcGF0aCwgcGFyYW1zLCBmb3JtLmdldCgwKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICh0eXBlb2YgcmV0dXJuZWQgPT0gJ3VuZGVmaW5lZCcpID8gZmFsc2UgOiByZXR1cm5lZDtcclxuICAgIH0sXHJcblxyXG4gICAgX3NlcmlhbGl6ZUZvcm1QYXJhbXM6IGZ1bmN0aW9uKCRmb3JtKSB7XHJcbiAgICAgICB2YXIgcXVlcnlTdHJpbmcgPSBcIlwiLFxyXG4gICAgICAgICBmaWVsZHMgPSAkZm9ybS5zZXJpYWxpemVBcnJheSgpLFxyXG4gICAgICAgICBpO1xyXG4gICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgIHF1ZXJ5U3RyaW5nID0gdGhpcy5fZW5jb2RlRm9ybVBhaXIoZmllbGRzWzBdLm5hbWUsIGZpZWxkc1swXS52YWx1ZSk7XHJcbiAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nICsgXCImXCIgKyB0aGlzLl9lbmNvZGVGb3JtUGFpcihmaWVsZHNbaV0ubmFtZSwgZmllbGRzW2ldLnZhbHVlKTtcclxuICAgICAgICAgfVxyXG4gICAgICAgfVxyXG4gICAgICAgcmV0dXJuIHF1ZXJ5U3RyaW5nO1xyXG4gICAgfSxcclxuXHJcbiAgICBfZW5jb2RlRm9ybVBhaXI6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKXtcclxuICAgICAgcmV0dXJuIF9lbmNvZGUobmFtZSkgKyBcIj1cIiArIF9lbmNvZGUodmFsdWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICBfcGFyc2VGb3JtUGFyYW1zOiBmdW5jdGlvbigkZm9ybSkge1xyXG4gICAgICB2YXIgcGFyYW1zID0ge30sXHJcbiAgICAgICAgICBmb3JtX2ZpZWxkcyA9ICRmb3JtLnNlcmlhbGl6ZUFycmF5KCksXHJcbiAgICAgICAgICBpO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZm9ybV9maWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBwYXJhbXMgPSB0aGlzLl9wYXJzZVBhcmFtUGFpcihwYXJhbXMsIGZvcm1fZmllbGRzW2ldLm5hbWUsIGZvcm1fZmllbGRzW2ldLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGFyYW1zO1xyXG4gICAgfSxcclxuXHJcbiAgICBfcGFyc2VRdWVyeVN0cmluZzogZnVuY3Rpb24ocGF0aCkge1xyXG4gICAgICB2YXIgcGFyYW1zID0ge30sIHBhcnRzLCBwYWlycywgcGFpciwgaTtcclxuXHJcbiAgICAgIHBhcnRzID0gcGF0aC5tYXRjaChRVUVSWV9TVFJJTkdfTUFUQ0hFUik7XHJcbiAgICAgIGlmIChwYXJ0cyAmJiBwYXJ0c1sxXSkge1xyXG4gICAgICAgIHBhaXJzID0gcGFydHNbMV0uc3BsaXQoJyYnKTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgnPScpO1xyXG4gICAgICAgICAgcGFyYW1zID0gdGhpcy5fcGFyc2VQYXJhbVBhaXIocGFyYW1zLCBfZGVjb2RlKHBhaXJbMF0pLCBfZGVjb2RlKHBhaXJbMV0gfHwgXCJcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGFyYW1zO1xyXG4gICAgfSxcclxuXHJcbiAgICBfcGFyc2VQYXJhbVBhaXI6IGZ1bmN0aW9uKHBhcmFtcywga2V5LCB2YWx1ZSkge1xyXG4gICAgICBpZiAodHlwZW9mIHBhcmFtc1trZXldICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGlmIChfaXNBcnJheShwYXJhbXNba2V5XSkpIHtcclxuICAgICAgICAgIHBhcmFtc1trZXldLnB1c2godmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXJhbXNba2V5XSA9IFtwYXJhbXNba2V5XSwgdmFsdWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICB9LFxyXG5cclxuICAgIF9saXN0ZW46IGZ1bmN0aW9uKG5hbWUsIGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiRlbGVtZW50KCkuYmluZChbbmFtZSwgdGhpcy5ldmVudE5hbWVzcGFjZSgpXS5qb2luKCcuJyksIGNhbGxiYWNrKTtcclxuICAgIH0sXHJcblxyXG4gICAgX3VubGlzdGVuOiBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gdGhpcy4kZWxlbWVudCgpLnVuYmluZChbbmFtZSwgdGhpcy5ldmVudE5hbWVzcGFjZSgpXS5qb2luKCcuJyksIGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgfSk7XHJcblxyXG4gIC8vIGBTYW1teS5SZW5kZXJDb250ZXh0YCBpcyBhbiBvYmplY3QgdGhhdCBtYWtlcyBzZXF1ZW50aWFsIHRlbXBsYXRlIGxvYWRpbmcsXHJcbiAgLy8gcmVuZGVyaW5nIGFuZCBpbnRlcnBvbGF0aW9uIHNlYW1sZXNzIGV2ZW4gd2hlbiBkZWFsaW5nIHdpdGggYXN5bmNocm9ub3VzXHJcbiAgLy8gb3BlcmF0aW9ucy5cclxuICAvL1xyXG4gIC8vIGBSZW5kZXJDb250ZXh0YCBvYmplY3RzIGFyZSBub3QgdXN1YWxseSBjcmVhdGVkIGRpcmVjdGx5LCByYXRoZXIgdGhleSBhcmVcclxuICAvLyBpbnN0YW50aWF0ZWQgZnJvbSBhbiBgU2FtbXkuRXZlbnRDb250ZXh0YCBieSB1c2luZyBgcmVuZGVyKClgLCBgbG9hZCgpYCBvclxyXG4gIC8vIGBwYXJ0aWFsKClgIHdoaWNoIGFsbCByZXR1cm4gYFJlbmRlckNvbnRleHRgIG9iamVjdHMuXHJcbiAgLy9cclxuICAvLyBgUmVuZGVyQ29udGV4dGAgbWV0aG9kcyBhbHdheXMgcmV0dXJucyBhIG1vZGlmaWVkIGBSZW5kZXJDb250ZXh0YFxyXG4gIC8vIGZvciBjaGFpbmluZyAobGlrZSBqUXVlcnkgaXRzZWxmKS5cclxuICAvL1xyXG4gIC8vIFRoZSBjb3JlIG1hZ2ljIGlzIGluIHRoZSBgdGhlbigpYCBtZXRob2Qgd2hpY2ggcHV0cyB0aGUgY2FsbGJhY2sgcGFzc2VkIGFzXHJcbiAgLy8gYW4gYXJndW1lbnQgaW50byBhIHF1ZXVlIHRvIGJlIGV4ZWN1dGVkIG9uY2UgdGhlIHByZXZpb3VzIGNhbGxiYWNrIGlzIGNvbXBsZXRlLlxyXG4gIC8vIEFsbCB0aGUgbWV0aG9kcyBvZiBgUmVuZGVyQ29udGV4dGAgYXJlIHdyYXBwZWQgaW4gYHRoZW4oKWAgd2hpY2ggYWxsb3dzIHlvdVxyXG4gIC8vIHRvIHF1ZXVlIHVwIG1ldGhvZHMgYnkgY2hhaW5pbmcsIGJ1dCBtYWludGFpbmluZyBhIGd1YXJhbnRlZWQgZXhlY3V0aW9uIG9yZGVyXHJcbiAgLy8gZXZlbiB3aXRoIHJlbW90ZSBjYWxscyB0byBmZXRjaCB0ZW1wbGF0ZXMuXHJcbiAgLy9cclxuICBTYW1teS5SZW5kZXJDb250ZXh0ID0gZnVuY3Rpb24oZXZlbnRfY29udGV4dCkge1xyXG4gICAgdGhpcy5ldmVudF9jb250ZXh0ICAgID0gZXZlbnRfY29udGV4dDtcclxuICAgIHRoaXMuY2FsbGJhY2tzICAgICAgICA9IFtdO1xyXG4gICAgdGhpcy5wcmV2aW91c19jb250ZW50ID0gbnVsbDtcclxuICAgIHRoaXMuY29udGVudCAgICAgICAgICA9IG51bGw7XHJcbiAgICB0aGlzLm5leHRfZW5naW5lICAgICAgPSBmYWxzZTtcclxuICAgIHRoaXMud2FpdGluZyAgICAgICAgICA9IGZhbHNlO1xyXG4gIH07XHJcblxyXG4gIFNhbW15LlJlbmRlckNvbnRleHQucHJvdG90eXBlID0gJC5leHRlbmQoe30sIFNhbW15Lk9iamVjdC5wcm90b3R5cGUsIHtcclxuXHJcbiAgICAvLyBUaGUgXCJjb3JlXCIgb2YgdGhlIGBSZW5kZXJDb250ZXh0YCBvYmplY3QsIGFkZHMgdGhlIGBjYWxsYmFja2AgdG8gdGhlXHJcbiAgICAvLyBxdWV1ZS4gSWYgdGhlIGNvbnRleHQgaXMgYHdhaXRpbmdgIChtZWFuaW5nIGFuIGFzeW5jIG9wZXJhdGlvbiBpcyBoYXBwZW5pbmcpXHJcbiAgICAvLyB0aGVuIHRoZSBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIGluIG9yZGVyLCBvbmNlIHRoZSBvdGhlciBvcGVyYXRpb25zIGFyZVxyXG4gICAgLy8gY29tcGxldGUuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnRseSBleGVjdXRpbmcgb3BlcmF0aW9uLCB0aGUgYGNhbGxiYWNrYFxyXG4gICAgLy8gaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuXHJcbiAgICAvL1xyXG4gICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrIGlzIHN0b3JlZCBpbiBgY29udGVudGAgZm9yIHRoZVxyXG4gICAgLy8gc3Vic2VxdWVudCBvcGVyYXRpb24uIElmIHlvdSByZXR1cm4gYGZhbHNlYCwgdGhlIHF1ZXVlIHdpbGwgcGF1c2UsIGFuZFxyXG4gICAgLy8gdGhlIG5leHQgY2FsbGJhY2sgaW4gdGhlIHF1ZXVlIHdpbGwgbm90IGJlIGV4ZWN1dGVkIHVudGlsIGBuZXh0KClgIGlzXHJcbiAgICAvLyBjYWxsZWQuIFRoaXMgYWxsb3dzIGZvciB0aGUgZ3VhcmFudGVlZCBvcmRlciBvZiBleGVjdXRpb24gd2hpbGUgd29ya2luZ1xyXG4gICAgLy8gd2l0aCBhc3luYyBvcGVyYXRpb25zLlxyXG4gICAgLy9cclxuICAgIC8vIElmIHRoZW4oKSBpcyBwYXNzZWQgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uLCB0aGUgc3RyaW5nIGlzIGxvb2tlZFxyXG4gICAgLy8gdXAgYXMgYSBoZWxwZXIgbWV0aG9kIG9uIHRoZSBldmVudCBjb250ZXh0LlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB0aGlzLmdldCgnIy8nLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBSZW5kZXJDb250ZXh0XHJcbiAgICAvLyAgICAgICAgLy8gRXZlbiB0aG91Z2ggYGxvYWQoKWAgZXhlY3V0ZXMgYXN5bmMsIHRoZSBuZXh0IGB0aGVuKClgXHJcbiAgICAvLyAgICAgICAgLy8gd29udCBleGVjdXRlIHVudGlsIHRoZSBsb2FkIGZpbmlzaGVzXHJcbiAgICAvLyAgICAgICAgdGhpcy5sb2FkKCdteWZpbGUudHh0JylcclxuICAgIC8vICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgLy8gICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVuIGlzIHRoZSBjb250ZW50IG9mIHRoZVxyXG4gICAgLy8gICAgICAgICAgICAgIC8vIHByZXYgb3BlcmF0aW9uXHJcbiAgICAvLyAgICAgICAgICAgICAgJCgnI21haW4nKS5odG1sKGNvbnRlbnQpO1xyXG4gICAgLy8gICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgdGhlbjogZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgaWYgKCFfaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcclxuICAgICAgICAvLyBpZiBhIHN0cmluZyBpcyBwYXNzZWQgdG8gdGhlbiwgYXNzdW1lIHdlIHdhbnQgdG8gY2FsbFxyXG4gICAgICAgIC8vIGEgaGVscGVyIG9uIHRoZSBldmVudCBjb250ZXh0IGluIGl0cyBjb250ZXh0XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycgJiYgY2FsbGJhY2sgaW4gdGhpcy5ldmVudF9jb250ZXh0KSB7XHJcbiAgICAgICAgICB2YXIgaGVscGVyID0gdGhpcy5ldmVudF9jb250ZXh0W2NhbGxiYWNrXTtcclxuICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaGVscGVyLmFwcGx5KHRoaXMuZXZlbnRfY29udGV4dCwgW2NvbnRlbnRdKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XHJcbiAgICAgIGlmICh0aGlzLndhaXRpbmcpIHtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLndhaXQoKTtcclxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgIHZhciByZXR1cm5lZCA9IGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIFtjb250ZXh0LmNvbnRlbnQsIGNvbnRleHQucHJldmlvdXNfY29udGVudF0pO1xyXG4gICAgICAgICAgaWYgKHJldHVybmVkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjb250ZXh0Lm5leHQocmV0dXJuZWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBQYXVzZSB0aGUgYFJlbmRlckNvbnRleHRgIHF1ZXVlLiBDb21iaW5lZCB3aXRoIGBuZXh0KClgIGFsbG93cyBmb3IgYXN5bmNcclxuICAgIC8vIG9wZXJhdGlvbnMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICB0aGlzLmxvYWQoJ215dGV4dC5qc29uJylcclxuICAgIC8vICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgZGF0YSAgICA9IEpTT04ucGFyc2UoY29udGVudCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAvLyBwYXVzZSBleGVjdXRpb25cclxuICAgIC8vICAgICAgICAgICAgICAgIGNvbnRleHQud2FpdCgpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gcG9zdCB0byBhIHVybFxyXG4gICAgLy8gICAgICAgICAgICAgICAgJC5wb3N0KGRhdGEudXJsLCB7fSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgY29udGV4dC5uZXh0KEpTT04ucGFyc2UocmVzcG9uc2UpKTtcclxuICAgIC8vICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgICAgICAgIH0pXHJcbiAgICAvLyAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gZGF0YSBpcyBqc29uIGZyb20gdGhlIHByZXZpb3VzIHBvc3RcclxuICAgIC8vICAgICAgICAgICAgICAgICQoJyNtZXNzYWdlJykudGV4dChkYXRhLnN0YXR1cyk7XHJcbiAgICAvLyAgICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICB3YWl0OiBmdW5jdGlvbigpIHtcclxuICAgICAgdGhpcy53YWl0aW5nID0gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmVzdW1lIHRoZSBxdWV1ZSwgc2V0dGluZyBgY29udGVudGAgdG8gYmUgdXNlZCBpbiB0aGUgbmV4dCBvcGVyYXRpb24uXHJcbiAgICAvLyBTZWUgYHdhaXQoKWAgZm9yIGFuIGV4YW1wbGUuXHJcbiAgICBuZXh0OiBmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgIHRoaXMud2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICBpZiAodHlwZW9mIGNvbnRlbnQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91c19jb250ZW50ID0gdGhpcy5jb250ZW50O1xyXG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnRoZW4odGhpcy5jYWxsYmFja3Muc2hpZnQoKSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8gTG9hZCBhIHRlbXBsYXRlIGludG8gdGhlIGNvbnRleHQuXHJcbiAgICAvLyBUaGUgYGxvY2F0aW9uYCBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHJlbW90ZSBwYXRoIHRvIHRoZVxyXG4gICAgLy8gZmlsZSwgYSBqUXVlcnkgb2JqZWN0LCBvciBhIERPTSBlbGVtZW50LlxyXG4gICAgLy9cclxuICAgIC8vIE5vIGludGVycG9sYXRpb24gaGFwcGVucyBieSBkZWZhdWx0LCB0aGUgY29udGVudCBpcyBzdG9yZWQgaW5cclxuICAgIC8vIGBjb250ZW50YC5cclxuICAgIC8vXHJcbiAgICAvLyBJbiB0aGUgY2FzZSBvZiBhIHBhdGgsIHVubGVzcyB0aGUgb3B0aW9uIGB7Y2FjaGU6IGZhbHNlfWAgaXMgcGFzc2VkIHRoZVxyXG4gICAgLy8gZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGFwcCdzIGB0ZW1wbGF0ZUNhY2hlKClgLlxyXG4gICAgLy9cclxuICAgIC8vIElmIGEgalF1ZXJ5IG9yIERPTSBvYmplY3QgaXMgcGFzc2VkIHRoZSBgaW5uZXJIVE1MYCBvZiB0aGUgbm9kZSBpcyBwdWxsZWQgaW4uXHJcbiAgICAvLyBUaGlzIGlzIHVzZWZ1bCBmb3IgbmVzdGluZyB0ZW1wbGF0ZXMgYXMgcGFydCBvZiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQgd3JhcHBlZFxyXG4gICAgLy8gaW4gaW52aXNpYmxlIGVsZW1lbnRzIG9yIGA8c2NyaXB0PmAgdGFncy4gV2l0aCB0ZW1wbGF0ZSBwYXRocywgdGhlIHRlbXBsYXRlXHJcbiAgICAvLyBlbmdpbmUgaXMgbG9va2VkIHVwIGJ5IHRoZSBleHRlbnNpb24uIEZvciBET00valF1ZXJ5IGVtYmVkZGVkIHRlbXBsYXRlcyxcclxuICAgIC8vIHRoaXMgaXNudCBwb3NzaWJsZSwgc28gdGhlcmUgYXJlIGEgY291cGxlIG9mIG9wdGlvbnM6XHJcbiAgICAvL1xyXG4gICAgLy8gICogcGFzcyBhbiBge2VuZ2luZTp9YCBvcHRpb24uXHJcbiAgICAvLyAgKiBkZWZpbmUgdGhlIGVuZ2luZSBpbiB0aGUgYGRhdGEtZW5naW5lYCBhdHRyaWJ1dGUgb2YgdGhlIHBhc3NlZCBub2RlLlxyXG4gICAgLy8gICoganVzdCBzdG9yZSB0aGUgcmF3IHRlbXBsYXRlIGRhdGEgYW5kIHVzZSBgaW50ZXJwb2xhdGUoKWAgbWFudWFsbHlcclxuICAgIC8vXHJcbiAgICAvLyBJZiBhIGBjYWxsYmFja2AgaXMgcGFzc2VkIGl0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSB0ZW1wbGF0ZSBsb2FkLlxyXG4gICAgbG9hZDogZnVuY3Rpb24obG9jYXRpb24sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XHJcbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcclxuICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgc2hvdWxkX2NhY2hlLCBjYWNoZWQsIGlzX2pzb24sIGxvY2F0aW9uX2FycmF5O1xyXG4gICAgICAgIGlmIChfaXNGdW5jdGlvbihvcHRpb25zKSkge1xyXG4gICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xyXG4gICAgICAgICAgb3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2FsbGJhY2spIHsgdGhpcy50aGVuKGNhbGxiYWNrKTsgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgbG9jYXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAvLyBpdCdzIGEgcGF0aFxyXG4gICAgICAgICAgaXNfanNvbiAgICAgID0gKGxvY2F0aW9uLm1hdGNoKC9cXC5qc29uKFxcP3wkKS8pIHx8IG9wdGlvbnMuanNvbik7XHJcbiAgICAgICAgICBzaG91bGRfY2FjaGUgPSBpc19qc29uID8gb3B0aW9ucy5jYWNoZSA9PT0gdHJ1ZSA6IG9wdGlvbnMuY2FjaGUgIT09IGZhbHNlO1xyXG4gICAgICAgICAgY29udGV4dC5uZXh0X2VuZ2luZSA9IGNvbnRleHQuZXZlbnRfY29udGV4dC5lbmdpbmVGb3IobG9jYXRpb24pO1xyXG4gICAgICAgICAgZGVsZXRlIG9wdGlvbnMuY2FjaGU7XHJcbiAgICAgICAgICBkZWxldGUgb3B0aW9ucy5qc29uO1xyXG4gICAgICAgICAgaWYgKG9wdGlvbnMuZW5naW5lKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQubmV4dF9lbmdpbmUgPSBvcHRpb25zLmVuZ2luZTtcclxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZW5naW5lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHNob3VsZF9jYWNoZSAmJiAoY2FjaGVkID0gdGhpcy5ldmVudF9jb250ZXh0LmFwcC50ZW1wbGF0ZUNhY2hlKGxvY2F0aW9uKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMud2FpdCgpO1xyXG4gICAgICAgICAgJC5hamF4KCQuZXh0ZW5kKHtcclxuICAgICAgICAgICAgdXJsOiBsb2NhdGlvbixcclxuICAgICAgICAgICAgZGF0YToge30sXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiBpc19qc29uID8gJ2pzb24nIDogJ3RleHQnLFxyXG4gICAgICAgICAgICB0eXBlOiAnZ2V0JyxcclxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICAgICAgICAgIGlmIChzaG91bGRfY2FjaGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZXZlbnRfY29udGV4dC5hcHAudGVtcGxhdGVDYWNoZShsb2NhdGlvbiwgZGF0YSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNvbnRleHQubmV4dChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSwgb3B0aW9ucykpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBpdCdzIGEgZG9tL2pRdWVyeVxyXG4gICAgICAgICAgaWYgKGxvY2F0aW9uLm5vZGVUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5pbm5lckhUTUw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobG9jYXRpb24uc2VsZWN0b3IpIHtcclxuICAgICAgICAgICAgLy8gaXQncyBhIGpRdWVyeVxyXG4gICAgICAgICAgICBjb250ZXh0Lm5leHRfZW5naW5lID0gbG9jYXRpb24uYXR0cignZGF0YS1lbmdpbmUnKTtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xvbmUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLnJlbW92ZSgpWzBdLmlubmVySFRNTC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvblswXS5pbm5lckhUTUwudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIExvYWQgcGFydGlhbHNcclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdGhpcy5sb2FkUGFydGlhbHMoe215cGFydGlhbDogJy9wYXRoL3RvL3BhcnRpYWwnfSk7XHJcbiAgICAvL1xyXG4gICAgbG9hZFBhcnRpYWxzOiBmdW5jdGlvbihwYXJ0aWFscykge1xyXG4gICAgICB2YXIgbmFtZTtcclxuICAgICAgaWYocGFydGlhbHMpIHtcclxuICAgICAgICB0aGlzLnBhcnRpYWxzID0gdGhpcy5wYXJ0aWFscyB8fCB7fTtcclxuICAgICAgICBmb3IobmFtZSBpbiBwYXJ0aWFscykge1xyXG4gICAgICAgICAgKGZ1bmN0aW9uKGNvbnRleHQsIG5hbWUpIHtcclxuICAgICAgICAgICAgY29udGV4dC5sb2FkKHBhcnRpYWxzW25hbWVdKVxyXG4gICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KSh0aGlzLCBuYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGBsb2FkKClgIGEgdGVtcGxhdGUgYW5kIHRoZW4gYGludGVycG9sYXRlKClgIGl0IHdpdGggZGF0YS5cclxuICAgIC8vXHJcbiAgICAvLyBjYW4gYmUgY2FsbGVkIHdpdGggbXVsdGlwbGUgZGlmZmVyZW50IHNpZ25hdHVyZXM6XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB0aGlzLnJlbmRlcihjYWxsYmFjayk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nKTtcclxuICAgIC8vICAgICAgdGhpcy5yZW5kZXIoJy9sb2NhdGlvbicsIHtzb21lOiBkYXRhfSk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nLCBjYWxsYmFjayk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nLCB7c29tZTogZGF0YX0sIGNhbGxiYWNrKTtcclxuICAgIC8vICAgICAgdGhpcy5yZW5kZXIoJy9sb2NhdGlvbicsIHtzb21lOiBkYXRhfSwge215OiBwYXJ0aWFsc30pO1xyXG4gICAgLy8gICAgICB0aGlzLnJlbmRlcignL2xvY2F0aW9uJywgY2FsbGJhY2ssIHtteTogcGFydGlhbHN9KTtcclxuICAgIC8vICAgICAgdGhpcy5yZW5kZXIoJy9sb2NhdGlvbicsIHtzb21lOiBkYXRhfSwgY2FsbGJhY2ssIHtteTogcGFydGlhbHN9KTtcclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgdGhpcy5yZW5kZXIoJ215dGVtcGxhdGUudGVtcGxhdGUnLCB7bmFtZTogJ3Rlc3QnfSk7XHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIHJlbmRlcjogZnVuY3Rpb24obG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBwYXJ0aWFscykge1xyXG4gICAgICBpZiAoX2lzRnVuY3Rpb24obG9jYXRpb24pICYmICFkYXRhKSB7XHJcbiAgICAgICAgLy8gaW52b2tlZCBhcyByZW5kZXIoY2FsbGJhY2spXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihsb2NhdGlvbik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYoX2lzRnVuY3Rpb24oZGF0YSkpIHtcclxuICAgICAgICAgIC8vIGludm9rZWQgYXMgcmVuZGVyKGxvY2F0aW9uLCBjYWxsYmFjaywgW3BhcnRpYWxzXSlcclxuICAgICAgICAgIHBhcnRpYWxzID0gY2FsbGJhY2s7XHJcbiAgICAgICAgICBjYWxsYmFjayA9IGRhdGE7XHJcbiAgICAgICAgICBkYXRhID0gbnVsbDtcclxuICAgICAgICB9IGVsc2UgaWYoY2FsbGJhY2sgJiYgIV9pc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xyXG4gICAgICAgICAgLy8gaW52b2tlZCBhcyByZW5kZXIobG9jYXRpb24sIGRhdGEsIHBhcnRpYWxzKVxyXG4gICAgICAgICAgcGFydGlhbHMgPSBjYWxsYmFjaztcclxuICAgICAgICAgIGNhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRQYXJ0aWFscyhwYXJ0aWFscylcclxuICAgICAgICAgICAgICAgICAgIC5sb2FkKGxvY2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgLmludGVycG9sYXRlKGRhdGEsIGxvY2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgLnRoZW4oY2FsbGJhY2spO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGByZW5kZXIoKWAgdGhlIGBsb2NhdGlvbmAgd2l0aCBgZGF0YWAgYW5kIHRoZW4gYHN3YXAoKWAgdGhlXHJcbiAgICAvLyBhcHAncyBgJGVsZW1lbnRgIHdpdGggdGhlIHJlbmRlcmVkIGNvbnRlbnQuXHJcbiAgICBwYXJ0aWFsOiBmdW5jdGlvbihsb2NhdGlvbiwgZGF0YSwgY2FsbGJhY2ssIHBhcnRpYWxzKSB7XHJcbiAgICAgIGlmIChfaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcclxuICAgICAgICAvLyBpbnZva2VkIGFzIHBhcnRpYWwobG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBbcGFydGlhbHNdKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcihsb2NhdGlvbiwgZGF0YSwgcGFydGlhbHMpLnN3YXAoY2FsbGJhY2spO1xyXG4gICAgICB9IGVsc2UgaWYgKF9pc0Z1bmN0aW9uKGRhdGEpKSB7XHJcbiAgICAgICAgLy8gaW52b2tlZCBhcyBwYXJ0aWFsKGxvY2F0aW9uLCBjYWxsYmFjaywgW3BhcnRpYWxzXSlcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIobG9jYXRpb24sIHt9LCBjYWxsYmFjaykuc3dhcChkYXRhKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBpbnZva2VkIGFzIHBhcnRpYWwobG9jYXRpb24sIGRhdGEsIFtwYXJ0aWFsc10pXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKGxvY2F0aW9uLCBkYXRhLCBjYWxsYmFjaykuc3dhcCgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGRlZmVycyB0aGUgY2FsbCBvZiBmdW5jdGlvbiB0byBvY2N1ciBpbiBvcmRlciBvZiB0aGUgcmVuZGVyIHF1ZXVlLlxyXG4gICAgLy8gVGhlIGZ1bmN0aW9uIGNhbiBhY2NlcHQgYW55IG51bWJlciBvZiBhcmd1bWVudHMgYXMgbG9uZyBhcyB0aGUgbGFzdFxyXG4gICAgLy8gYXJndW1lbnQgaXMgYSBjYWxsYmFjayBmdW5jdGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIHB1dHRpbmcgYXJiaXRyYXJ5XHJcbiAgICAvLyBhc3luY2hyb25vdXMgZnVuY3Rpb25zIGludG8gdGhlIHF1ZXVlLiBUaGUgY29udGVudCBwYXNzZWQgdG8gdGhlXHJcbiAgICAvLyBjYWxsYmFjayBpcyBwYXNzZWQgYXMgYGNvbnRlbnRgIHRvIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHF1ZXVlLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgIHRoaXMuc2VuZCgkLmdldEpTT04sICcvYXBwLmpzb24nKVxyXG4gICAgLy8gICAgICAgICAudGhlbihmdW5jdGlvbihqc29uKSB7XHJcbiAgICAvLyAgICAgICAgICAgJCgnI21lc3NhZ2UpLnRleHQoanNvblsnbWVzc2FnZSddKTtcclxuICAgIC8vICAgICAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vXHJcbiAgICBzZW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLFxyXG4gICAgICAgICAgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKSxcclxuICAgICAgICAgIGZ1biAgPSBhcmdzLnNoaWZ0KCk7XHJcblxyXG4gICAgICBpZiAoX2lzQXJyYXkoYXJnc1swXSkpIHsgYXJncyA9IGFyZ3NbMF07IH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgIGFyZ3MucHVzaChmdW5jdGlvbihyZXNwb25zZSkgeyBjb250ZXh0Lm5leHQocmVzcG9uc2UpOyB9KTtcclxuICAgICAgICBjb250ZXh0LndhaXQoKTtcclxuICAgICAgICBmdW4uYXBwbHkoZnVuLCBhcmdzKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBpdGVyYXRlcyBvdmVyIGFuIGFycmF5LCBhcHBseWluZyB0aGUgY2FsbGJhY2sgZm9yIGVhY2ggaXRlbSBpdGVtLiB0aGVcclxuICAgIC8vIGNhbGxiYWNrIHRha2VzIHRoZSBzYW1lIHN0eWxlIG9mIGFyZ3VtZW50cyBhcyBgalF1ZXJ5LmVhY2goKWAgKGluZGV4LCBpdGVtKS5cclxuICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgb2YgZWFjaCBjYWxsYmFjayBpcyBjb2xsZWN0ZWQgYXMgYSBzaW5nbGUgc3RyaW5nIGFuZCBzdG9yZWRcclxuICAgIC8vIGFzIGBjb250ZW50YCB0byBiZSB1c2VkIGluIHRoZSBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgYFJlbmRlckNvbnRleHRgLlxyXG4gICAgY29sbGVjdDogZnVuY3Rpb24oYXJyYXksIGNhbGxiYWNrLCBub3cpIHtcclxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xyXG4gICAgICB2YXIgY29sbCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChfaXNGdW5jdGlvbihhcnJheSkpIHtcclxuICAgICAgICAgIGNhbGxiYWNrID0gYXJyYXk7XHJcbiAgICAgICAgICBhcnJheSA9IHRoaXMuY29udGVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNvbnRlbnRzID0gW10sIGRvbXMgPSBmYWxzZTtcclxuICAgICAgICAkLmVhY2goYXJyYXksIGZ1bmN0aW9uKGksIGl0ZW0pIHtcclxuICAgICAgICAgIHZhciByZXR1cm5lZCA9IGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIFtpLCBpdGVtXSk7XHJcbiAgICAgICAgICBpZiAocmV0dXJuZWQuanF1ZXJ5ICYmIHJldHVybmVkLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybmVkID0gcmV0dXJuZWRbMF07XHJcbiAgICAgICAgICAgIGRvbXMgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29udGVudHMucHVzaChyZXR1cm5lZCk7XHJcbiAgICAgICAgICByZXR1cm4gcmV0dXJuZWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGRvbXMgPyBjb250ZW50cyA6IGNvbnRlbnRzLmpvaW4oJycpO1xyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbm93ID8gY29sbCgpIDogdGhpcy50aGVuKGNvbGwpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBsb2FkcyBhIHRlbXBsYXRlLCBhbmQgdGhlbiBpbnRlcnBvbGF0ZXMgaXQgZm9yIGVhY2ggaXRlbSBpbiB0aGUgYGRhdGFgXHJcbiAgICAvLyBhcnJheS4gSWYgYSBjYWxsYmFjayBpcyBwYXNzZWQsIGl0IHdpbGwgY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBlYWNoXHJcbiAgICAvLyBpdGVtIGluIHRoZSBhcnJheSBfYWZ0ZXJfIGludGVycG9sYXRpb25cclxuICAgIHJlbmRlckVhY2g6IGZ1bmN0aW9uKGxvY2F0aW9uLCBuYW1lLCBkYXRhLCBjYWxsYmFjaykge1xyXG4gICAgICBpZiAoX2lzQXJyYXkobmFtZSkpIHtcclxuICAgICAgICBjYWxsYmFjayA9IGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IG5hbWU7XHJcbiAgICAgICAgbmFtZSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMubG9hZChsb2NhdGlvbikudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgICAgICB2YXIgcmN0eCA9IHRoaXM7XHJcbiAgICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgICAgZGF0YSA9IF9pc0FycmF5KHRoaXMucHJldmlvdXNfY29udGVudCkgPyB0aGlzLnByZXZpb3VzX2NvbnRlbnQgOiBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAkLmVhY2goZGF0YSwgZnVuY3Rpb24oaSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICB2YXIgaWRhdGEgPSB7fSwgZW5naW5lID0gdGhpcy5uZXh0X2VuZ2luZSB8fCBsb2NhdGlvbjtcclxuICAgICAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICAgICAgaWRhdGFbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWRhdGEgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY2FsbGJhY2sodmFsdWUsIHJjdHguZXZlbnRfY29udGV4dC5pbnRlcnBvbGF0ZShjb250ZW50LCBpZGF0YSwgZW5naW5lKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdChkYXRhLCBmdW5jdGlvbihpLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHZhciBpZGF0YSA9IHt9LCBlbmdpbmUgPSB0aGlzLm5leHRfZW5naW5lIHx8IGxvY2F0aW9uO1xyXG4gICAgICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpZGF0YVtuYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZGF0YSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ldmVudF9jb250ZXh0LmludGVycG9sYXRlKGNvbnRlbnQsIGlkYXRhLCBlbmdpbmUpO1xyXG4gICAgICAgICAgICB9LCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHVzZXMgdGhlIHByZXZpb3VzIGxvYWRlZCBgY29udGVudGAgYW5kIHRoZSBgZGF0YWAgb2JqZWN0IHRvIGludGVycG9sYXRlXHJcbiAgICAvLyBhIHRlbXBsYXRlLiBgZW5naW5lYCBkZWZpbmVzIHRoZSB0ZW1wbGF0aW5nL2ludGVycG9sYXRpb24gbWV0aG9kL2VuZ2luZVxyXG4gICAgLy8gdGhhdCBzaG91bGQgYmUgdXNlZC4gSWYgYGVuZ2luZWAgaXMgbm90IHBhc3NlZCwgdGhlIGBuZXh0X2VuZ2luZWAgaXNcclxuICAgIC8vIHVzZWQuIElmIGByZXRhaW5gIGlzIGB0cnVlYCwgdGhlIGZpbmFsIGludGVycG9sYXRlZCBkYXRhIGlzIGFwcGVuZGVkIHRvXHJcbiAgICAvLyB0aGUgYHByZXZpb3VzX2NvbnRlbnRgIGluc3RlYWQgb2YganVzdCByZXBsYWNpbmcgaXQuXHJcbiAgICBpbnRlcnBvbGF0ZTogZnVuY3Rpb24oZGF0YSwgZW5naW5lLCByZXRhaW4pIHtcclxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xyXG4gICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGNvbnRlbnQsIHByZXYpIHtcclxuICAgICAgICBpZiAoIWRhdGEgJiYgcHJldikgeyBkYXRhID0gcHJldjsgfVxyXG4gICAgICAgIGlmICh0aGlzLm5leHRfZW5naW5lKSB7XHJcbiAgICAgICAgICBlbmdpbmUgPSB0aGlzLm5leHRfZW5naW5lO1xyXG4gICAgICAgICAgdGhpcy5uZXh0X2VuZ2luZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVuZGVyZWQgPSBjb250ZXh0LmV2ZW50X2NvbnRleHQuaW50ZXJwb2xhdGUoY29udGVudCwgZGF0YSwgZW5naW5lLCB0aGlzLnBhcnRpYWxzKTtcclxuICAgICAgICByZXR1cm4gcmV0YWluID8gcHJldiArIHJlbmRlcmVkIDogcmVuZGVyZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBTd2FwIHRoZSByZXR1cm4gY29udGVudHMgZW5zdXJpbmcgb3JkZXIuIFNlZSBgQXBwbGljYXRpb24jc3dhcGBcclxuICAgIHN3YXA6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnRfY29udGV4dC5zd2FwKGNvbnRlbnQsIGNhbGxiYWNrKTtcclxuICAgICAgICByZXR1cm4gY29udGVudDtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gU2FtZSB1c2FnZSBhcyBgalF1ZXJ5LmZuLmFwcGVuZFRvKClgIGJ1dCB1c2VzIGB0aGVuKClgIHRvIGVuc3VyZSBvcmRlclxyXG4gICAgYXBwZW5kVG86IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgICQoc2VsZWN0b3IpLmFwcGVuZChjb250ZW50KTtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gU2FtZSB1c2FnZSBhcyBgalF1ZXJ5LmZuLnByZXBlbmRUbygpYCBidXQgdXNlcyBgdGhlbigpYCB0byBlbnN1cmUgb3JkZXJcclxuICAgIHByZXBlbmRUbzogZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgICAgJChzZWxlY3RvcikucHJlcGVuZChjb250ZW50KTtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmVwbGFjZXMgdGhlIGAkKHNlbGVjdG9yKWAgdXNpbmcgYGh0bWwoKWAgd2l0aCB0aGUgcHJldmlvdXNseSBsb2FkZWRcclxuICAgIC8vIGBjb250ZW50YFxyXG4gICAgcmVwbGFjZTogZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgICAgJChzZWxlY3RvcikuaHRtbChjb250ZW50KTtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gdHJpZ2dlciB0aGUgZXZlbnQgaW4gdGhlIG9yZGVyIG9mIHRoZSBldmVudCBjb250ZXh0LiBTYW1lIHNlbWFudGljc1xyXG4gICAgLy8gYXMgYFNhbW15LkV2ZW50Q29udGV4dCN0cmlnZ2VyKClgLiBJZiBkYXRhIGlzIG9taXR0ZWQsIGBjb250ZW50YFxyXG4gICAgLy8gaXMgc2VudCBhcyBge2NvbnRlbnQ6IGNvbnRlbnR9YFxyXG4gICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZGF0YSkge1xyXG4gICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGNvbnRlbnQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT0gJ3VuZGVmaW5lZCcpIHsgZGF0YSA9IHtjb250ZW50OiBjb250ZW50fTsgfVxyXG4gICAgICAgIHRoaXMuZXZlbnRfY29udGV4dC50cmlnZ2VyKG5hbWUsIGRhdGEpO1xyXG4gICAgICAgIHJldHVybiBjb250ZW50O1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfSk7XHJcblxyXG4gIC8vIGBTYW1teS5FdmVudENvbnRleHRgIG9iamVjdHMgYXJlIGNyZWF0ZWQgZXZlcnkgdGltZSBhIHJvdXRlIGlzIHJ1biBvciBhXHJcbiAgLy8gYm91bmQgZXZlbnQgaXMgdHJpZ2dlcmVkLiBUaGUgY2FsbGJhY2tzIGZvciB0aGVzZSBldmVudHMgYXJlIGV2YWx1YXRlZCB3aXRoaW4gYSBgU2FtbXkuRXZlbnRDb250ZXh0YFxyXG4gIC8vIFRoaXMgd2l0aGluIHRoZXNlIGNhbGxiYWNrcyB0aGUgc3BlY2lhbCBtZXRob2RzIG9mIGBFdmVudENvbnRleHRgIGFyZSBhdmFpbGFibGUuXHJcbiAgLy9cclxuICAvLyAjIyMgRXhhbXBsZVxyXG4gIC8vXHJcbiAgLy8gICAgICAgJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAvLyAgICAgICAgIC8vIFRoZSBjb250ZXh0IGhlcmUgaXMgdGhpcyBTYW1teS5BcHBsaWNhdGlvblxyXG4gIC8vICAgICAgICAgdGhpcy5nZXQoJyMvOm5hbWUnLCBmdW5jdGlvbigpIHtcclxuICAvLyAgICAgICAgICAgLy8gVGhlIGNvbnRleHQgaGVyZSBpcyBhIG5ldyBTYW1teS5FdmVudENvbnRleHRcclxuICAvLyAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zWyduYW1lJ10gPT0gJ3NhbW15Jykge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMucGFydGlhbCgnbmFtZS5odG1sLmVyYicsIHtuYW1lOiAnU2FtbXknfSk7XHJcbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5yZWRpcmVjdCgnIy9zb21ld2hlcmUtZWxzZScpXHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vXHJcbiAgLy8gSW5pdGlhbGl6ZSBhIG5ldyBFdmVudENvbnRleHRcclxuICAvL1xyXG4gIC8vICMjIyBBcmd1bWVudHNcclxuICAvL1xyXG4gIC8vICogYGFwcGAgVGhlIGBTYW1teS5BcHBsaWNhdGlvbmAgdGhpcyBldmVudCBpcyBjYWxsZWQgd2l0aGluLlxyXG4gIC8vICogYHZlcmJgIFRoZSB2ZXJiIGludm9rZWQgdG8gcnVuIHRoaXMgY29udGV4dC9yb3V0ZS5cclxuICAvLyAqIGBwYXRoYCBUaGUgc3RyaW5nIHBhdGggaW52b2tlZCB0byBydW4gdGhpcyBjb250ZXh0L3JvdXRlLlxyXG4gIC8vICogYHBhcmFtc2AgQW4gT2JqZWN0IG9mIG9wdGlvbmFsIHBhcmFtcyB0byBwYXNzIHRvIHRoZSBjb250ZXh0LiBJcyBjb252ZXJ0ZWRcclxuICAvLyAgIHRvIGEgYFNhbW15Lk9iamVjdGAuXHJcbiAgLy8gKiBgdGFyZ2V0YCBhIERPTSBlbGVtZW50IHRoYXQgdGhlIGV2ZW50IHRoYXQgaG9sZHMgdGhpcyBjb250ZXh0IG9yaWdpbmF0ZXNcclxuICAvLyAgIGZyb20uIEZvciBwb3N0LCBwdXQgYW5kIGRlbCByb3V0ZXMsIHRoaXMgaXMgdGhlIGZvcm0gZWxlbWVudCB0aGF0IHRyaWdnZXJlZFxyXG4gIC8vICAgdGhlIHJvdXRlLlxyXG4gIC8vXHJcbiAgU2FtbXkuRXZlbnRDb250ZXh0ID0gZnVuY3Rpb24oYXBwLCB2ZXJiLCBwYXRoLCBwYXJhbXMsIHRhcmdldCkge1xyXG4gICAgdGhpcy5hcHAgICAgPSBhcHA7XHJcbiAgICB0aGlzLnZlcmIgICA9IHZlcmI7XHJcbiAgICB0aGlzLnBhdGggICA9IHBhdGg7XHJcbiAgICB0aGlzLnBhcmFtcyA9IG5ldyBTYW1teS5PYmplY3QocGFyYW1zKTtcclxuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gIH07XHJcblxyXG4gIFNhbW15LkV2ZW50Q29udGV4dC5wcm90b3R5cGUgPSAkLmV4dGVuZCh7fSwgU2FtbXkuT2JqZWN0LnByb3RvdHlwZSwge1xyXG5cclxuICAgIC8vIEEgc2hvcnRjdXQgdG8gdGhlIGFwcCdzIGAkZWxlbWVudCgpYFxyXG4gICAgJGVsZW1lbnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcHAuJGVsZW1lbnQoX21ha2VBcnJheShhcmd1bWVudHMpLnNoaWZ0KCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBMb29rIHVwIGEgdGVtcGxhdGluZyBlbmdpbmUgd2l0aGluIHRoZSBjdXJyZW50IGFwcCBhbmQgY29udGV4dC5cclxuICAgIC8vIGBlbmdpbmVgIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcclxuICAgIC8vXHJcbiAgICAvLyAqIGEgZnVuY3Rpb246IHNob3VsZCBjb25mb3JtIHRvIGBmdW5jdGlvbihjb250ZW50LCBkYXRhKSB7IHJldHVybiBpbnRlcnBvbGF0ZWQ7IH1gXHJcbiAgICAvLyAqIGEgdGVtcGxhdGUgcGF0aDogJ3RlbXBsYXRlLmVqcycsIGxvb2tzIHVwIHRoZSBleHRlbnNpb24gdG8gbWF0Y2ggdG9cclxuICAgIC8vICAgdGhlIGBlanMoKWAgaGVscGVyXHJcbiAgICAvLyAqIGEgc3RyaW5nIHJlZmVycmluZyB0byB0aGUgaGVscGVyOiBcIm11c3RhY2hlXCIgPT4gYG11c3RhY2hlKClgXHJcbiAgICAvL1xyXG4gICAgLy8gSWYgbm8gZW5naW5lIGlzIGZvdW5kLCB1c2UgdGhlIGFwcCdzIGRlZmF1bHQgYHRlbXBsYXRlX2VuZ2luZWBcclxuICAgIC8vXHJcbiAgICBlbmdpbmVGb3I6IGZ1bmN0aW9uKGVuZ2luZSkge1xyXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXMsIGVuZ2luZV9tYXRjaDtcclxuICAgICAgLy8gaWYgcGF0aCBpcyBhY3R1YWxseSBhbiBlbmdpbmUgZnVuY3Rpb24ganVzdCByZXR1cm4gaXRcclxuICAgICAgaWYgKF9pc0Z1bmN0aW9uKGVuZ2luZSkpIHsgcmV0dXJuIGVuZ2luZTsgfVxyXG4gICAgICAvLyBsb29rdXAgZW5naW5lIG5hbWUgYnkgcGF0aCBleHRlbnNpb25cclxuICAgICAgZW5naW5lID0gKGVuZ2luZSB8fCBjb250ZXh0LmFwcC50ZW1wbGF0ZV9lbmdpbmUpLnRvU3RyaW5nKCk7XHJcbiAgICAgIGlmICgoZW5naW5lX21hdGNoID0gZW5naW5lLm1hdGNoKC9cXC4oW15cXC5cXD9cXCNdKykoXFw/fCQpLykpKSB7XHJcbiAgICAgICAgZW5naW5lID0gZW5naW5lX21hdGNoWzFdO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHNldCB0aGUgZW5naW5lIHRvIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGVuZ2luZSBpZiBubyBtYXRjaCBpcyBmb3VuZFxyXG4gICAgICBpZiAoZW5naW5lICYmIF9pc0Z1bmN0aW9uKGNvbnRleHRbZW5naW5lXSkpIHtcclxuICAgICAgICByZXR1cm4gY29udGV4dFtlbmdpbmVdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29udGV4dC5hcHAudGVtcGxhdGVfZW5naW5lKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5naW5lRm9yKGNvbnRleHQuYXBwLnRlbXBsYXRlX2VuZ2luZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRlbnQsIGRhdGEpIHsgcmV0dXJuIGNvbnRlbnQ7IH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHVzaW5nIHRoZSB0ZW1wbGF0ZSBgZW5naW5lYCBmb3VuZCB3aXRoIGBlbmdpbmVGb3IoKWAsIGludGVycG9sYXRlIHRoZVxyXG4gICAgLy8gYGRhdGFgIGludG8gYGNvbnRlbnRgXHJcbiAgICBpbnRlcnBvbGF0ZTogZnVuY3Rpb24oY29udGVudCwgZGF0YSwgZW5naW5lLCBwYXJ0aWFscykge1xyXG4gICAgICByZXR1cm4gdGhpcy5lbmdpbmVGb3IoZW5naW5lKS5hcHBseSh0aGlzLCBbY29udGVudCwgZGF0YSwgcGFydGlhbHNdKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBgU2FtbXkuUmVuZGVyQ29udGV4dGAgY2FsbGluZyBgcmVuZGVyKClgIG9uIGl0LlxyXG4gICAgLy8gTG9hZHMgdGhlIHRlbXBsYXRlIGFuZCBpbnRlcnBvbGF0ZSB0aGUgZGF0YSwgaG93ZXZlciBkb2VzIG5vdCBhY3R1YWxcclxuICAgIC8vIHBsYWNlIGl0IGluIHRoZSBET00uXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIC8vIG15dGVtcGxhdGUubXVzdGFjaGUgPGRpdiBjbGFzcz1cIm5hbWVcIj57e25hbWV9fTwvZGl2PlxyXG4gICAgLy8gICAgICByZW5kZXIoJ215dGVtcGxhdGUubXVzdGFjaGUnLCB7bmFtZTogJ3F1aXJrZXknfSk7XHJcbiAgICAvLyAgICAgIC8vIHNldHMgdGhlIGBjb250ZW50YCB0byA8ZGl2IGNsYXNzPVwibmFtZVwiPnF1aXJrZXk8L2Rpdj5cclxuICAgIC8vICAgICAgcmVuZGVyKCdteXRlbXBsYXRlLm11c3RhY2hlJywge25hbWU6ICdxdWlya2V5J30pXHJcbiAgICAvLyAgICAgICAgLmFwcGVuZFRvKCd1bCcpO1xyXG4gICAgLy8gICAgICAvLyBhcHBlbmRzIHRoZSByZW5kZXJlZCBjb250ZW50IHRvICQoJ3VsJylcclxuICAgIC8vXHJcbiAgICByZW5kZXI6IGZ1bmN0aW9uKGxvY2F0aW9uLCBkYXRhLCBjYWxsYmFjaywgcGFydGlhbHMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBTYW1teS5SZW5kZXJDb250ZXh0KHRoaXMpLnJlbmRlcihsb2NhdGlvbiwgZGF0YSwgY2FsbGJhY2ssIHBhcnRpYWxzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBgU2FtbXkuUmVuZGVyQ29udGV4dGAgY2FsbGluZyBgcmVuZGVyRWFjaCgpYCBvbiBpdC5cclxuICAgIC8vIExvYWRzIHRoZSB0ZW1wbGF0ZSBhbmQgaW50ZXJwb2xhdGVzIHRoZSBkYXRhIGZvciBlYWNoIGl0ZW0sXHJcbiAgICAvLyBob3dldmVyIGRvZXMgbm90IGFjdHVhbCBwbGFjZSBpdCBpbiB0aGUgRE9NLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAvLyBteXRlbXBsYXRlLm11c3RhY2hlIDxkaXYgY2xhc3M9XCJuYW1lXCI+e3tuYW1lfX08L2Rpdj5cclxuICAgIC8vICAgICAgcmVuZGVyRWFjaCgnbXl0ZW1wbGF0ZS5tdXN0YWNoZScsIFt7bmFtZTogJ3F1aXJrZXknfSwge25hbWU6ICdlbmRvcid9XSlcclxuICAgIC8vICAgICAgLy8gc2V0cyB0aGUgYGNvbnRlbnRgIHRvIDxkaXYgY2xhc3M9XCJuYW1lXCI+cXVpcmtleTwvZGl2PjxkaXYgY2xhc3M9XCJuYW1lXCI+ZW5kb3I8L2Rpdj5cclxuICAgIC8vICAgICAgcmVuZGVyRWFjaCgnbXl0ZW1wbGF0ZS5tdXN0YWNoZScsIFt7bmFtZTogJ3F1aXJrZXknfSwge25hbWU6ICdlbmRvcid9XSkuYXBwZW5kVG8oJ3VsJyk7XHJcbiAgICAvLyAgICAgIC8vIGFwcGVuZHMgdGhlIHJlbmRlcmVkIGNvbnRlbnQgdG8gJCgndWwnKVxyXG4gICAgLy9cclxuICAgIHJlbmRlckVhY2g6IGZ1bmN0aW9uKGxvY2F0aW9uLCBuYW1lLCBkYXRhLCBjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcykucmVuZGVyRWFjaChsb2NhdGlvbiwgbmFtZSwgZGF0YSwgY2FsbGJhY2spO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBjcmVhdGUgYSBuZXcgYFNhbW15LlJlbmRlckNvbnRleHRgIGNhbGxpbmcgYGxvYWQoKWAgd2l0aCBgbG9jYXRpb25gIGFuZFxyXG4gICAgLy8gYG9wdGlvbnNgLiBDYWxsZWQgd2l0aG91dCBpbnRlcnBvbGF0aW9uIG9yIHBsYWNlbWVudCwgdGhpcyBhbGxvd3MgZm9yXHJcbiAgICAvLyBwcmVsb2FkaW5nL2NhY2hpbmcgdGhlIHRlbXBsYXRlcy5cclxuICAgIGxvYWQ6IGZ1bmN0aW9uKGxvY2F0aW9uLCBvcHRpb25zLCBjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcykubG9hZChsb2NhdGlvbiwgb3B0aW9ucywgY2FsbGJhY2spO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBjcmVhdGUgYSBuZXcgYFNhbW15LlJlbmRlckNvbnRleHRgIGNhbGxpbmcgYGxvYWRQYXJ0aWFscygpYCB3aXRoIGBwYXJ0aWFsc2AuXHJcbiAgICBsb2FkUGFydGlhbHM6IGZ1bmN0aW9uKHBhcnRpYWxzKSB7XHJcbiAgICAgIHJldHVybiBuZXcgU2FtbXkuUmVuZGVyQ29udGV4dCh0aGlzKS5sb2FkUGFydGlhbHMocGFydGlhbHMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBgcmVuZGVyKClgIHRoZSBgbG9jYXRpb25gIHdpdGggYGRhdGFgIGFuZCB0aGVuIGBzd2FwKClgIHRoZVxyXG4gICAgLy8gYXBwJ3MgYCRlbGVtZW50YCB3aXRoIHRoZSByZW5kZXJlZCBjb250ZW50LlxyXG4gICAgcGFydGlhbDogZnVuY3Rpb24obG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBwYXJ0aWFscykge1xyXG4gICAgICByZXR1cm4gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcykucGFydGlhbChsb2NhdGlvbiwgZGF0YSwgY2FsbGJhY2ssIHBhcnRpYWxzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gY3JlYXRlIGEgbmV3IGBTYW1teS5SZW5kZXJDb250ZXh0YCBjYWxsaW5nIGBzZW5kKClgIHdpdGggYW4gYXJiaXRyYXJ5XHJcbiAgICAvLyBmdW5jdGlvblxyXG4gICAgc2VuZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciByY3R4ID0gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcyk7XHJcbiAgICAgIHJldHVybiByY3R4LnNlbmQuYXBwbHkocmN0eCwgYXJndW1lbnRzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQ2hhbmdlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgd2luZG93LiBJZiBgdG9gIGJlZ2lucyB3aXRoXHJcbiAgICAvLyAnIycgaXQgb25seSBjaGFuZ2VzIHRoZSBkb2N1bWVudCdzIGhhc2guIElmIHBhc3NlZCBtb3JlIHRoYW4gMSBhcmd1bWVudFxyXG4gICAgLy8gcmVkaXJlY3Qgd2lsbCBqb2luIHRoZW0gdG9nZXRoZXIgd2l0aCBmb3J3YXJkIHNsYXNoZXMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHJlZGlyZWN0KCcjL290aGVyL3JvdXRlJyk7XHJcbiAgICAvLyAgICAgIC8vIGVxdWl2YWxlbnQgdG9cclxuICAgIC8vICAgICAgcmVkaXJlY3QoJyMnLCAnb3RoZXInLCAncm91dGUnKTtcclxuICAgIC8vXHJcbiAgICByZWRpcmVjdDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciB0bywgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKSxcclxuICAgICAgICAgIGN1cnJlbnRfbG9jYXRpb24gPSB0aGlzLmFwcC5nZXRMb2NhdGlvbigpLFxyXG4gICAgICAgICAgbCA9IGFyZ3MubGVuZ3RoO1xyXG4gICAgICBpZiAobCA+IDEpIHtcclxuICAgICAgICB2YXIgaSA9IDAsIHBhdGhzID0gW10sIHBhaXJzID0gW10sIHBhcmFtcyA9IHt9LCBoYXNfcGFyYW1zID0gZmFsc2U7XHJcbiAgICAgICAgZm9yICg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgYXJnc1tpXSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBwYXRocy5wdXNoKGFyZ3NbaV0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJC5leHRlbmQocGFyYW1zLCBhcmdzW2ldKTtcclxuICAgICAgICAgICAgaGFzX3BhcmFtcyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRvID0gcGF0aHMuam9pbignLycpO1xyXG4gICAgICAgIGlmIChoYXNfcGFyYW1zKSB7XHJcbiAgICAgICAgICBmb3IgKHZhciBrIGluIHBhcmFtcykge1xyXG4gICAgICAgICAgICBwYWlycy5wdXNoKHRoaXMuYXBwLl9lbmNvZGVGb3JtUGFpcihrLCBwYXJhbXNba10pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRvICs9ICc/JyArIHBhaXJzLmpvaW4oJyYnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG8gPSBhcmdzWzBdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHJpZ2dlcigncmVkaXJlY3QnLCB7dG86IHRvfSk7XHJcbiAgICAgIHRoaXMuYXBwLmxhc3RfbG9jYXRpb24gPSBbdGhpcy52ZXJiLCB0aGlzLnBhdGhdO1xyXG4gICAgICB0aGlzLmFwcC5zZXRMb2NhdGlvbih0byk7XHJcbiAgICAgIGlmIChuZXcgUmVnRXhwKHRvKS50ZXN0KGN1cnJlbnRfbG9jYXRpb24pKSB7XHJcbiAgICAgICAgdGhpcy5hcHAudHJpZ2dlcignbG9jYXRpb24tY2hhbmdlZCcpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFRyaWdnZXJzIGV2ZW50cyBvbiBgYXBwYCB3aXRoaW4gdGhlIGN1cnJlbnQgY29udGV4dC5cclxuICAgIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHtcclxuICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICd1bmRlZmluZWQnKSB7IGRhdGEgPSB7fTsgfVxyXG4gICAgICBpZiAoIWRhdGEuY29udGV4dCkgeyBkYXRhLmNvbnRleHQgPSB0aGlzOyB9XHJcbiAgICAgIHJldHVybiB0aGlzLmFwcC50cmlnZ2VyKG5hbWUsIGRhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBIHNob3J0Y3V0IHRvIGFwcCdzIGBldmVudE5hbWVzcGFjZSgpYFxyXG4gICAgZXZlbnROYW1lc3BhY2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQSBzaG9ydGN1dCB0byBhcHAncyBgc3dhcCgpYFxyXG4gICAgc3dhcDogZnVuY3Rpb24oY29udGVudHMsIGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFwcC5zd2FwKGNvbnRlbnRzLCBjYWxsYmFjayk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJhaXNlcyBhIHBvc3NpYmxlIGBub3RGb3VuZCgpYCBlcnJvciBmb3IgdGhlIGN1cnJlbnQgcGF0aC5cclxuICAgIG5vdEZvdW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBwLm5vdEZvdW5kKHRoaXMudmVyYiwgdGhpcy5wYXRoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gRGVmYXVsdCBKU09OIHBhcnNpbmcgdXNlcyBqUXVlcnkncyBgcGFyc2VKU09OKClgLiBJbmNsdWRlIGBTYW1teS5KU09OYFxyXG4gICAgLy8gcGx1Z2luIGZvciB0aGUgbW9yZSBjb25mb3JtYW50IFwiY3JvY2tmb3JkIHNwZWNpYWxcIi5cclxuICAgIGpzb246IGZ1bmN0aW9uKHN0cmluZykge1xyXG4gICAgICByZXR1cm4gJC5wYXJzZUpTT04oc3RyaW5nKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gLy89PiBTYW1teS5FdmVudENvbnRleHQ6IGdldCAjLyB7fVxyXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gXCJTYW1teS5FdmVudENvbnRleHQ6IFwiICsgW3RoaXMudmVyYiwgdGhpcy5wYXRoLCB0aGlzLnBhcmFtc10uam9pbignICcpO1xyXG4gICAgfVxyXG5cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIFNhbW15O1xyXG59KTtcclxuXHJcblxuOyBicm93c2VyaWZ5X3NoaW1fX2RlZmluZV9fbW9kdWxlX19leHBvcnRfXyh0eXBlb2YgU2FtbXkgIT0gXCJ1bmRlZmluZWRcIiA/IFNhbW15IDogd2luZG93LlNhbW15KTtcblxufSkuY2FsbChnbG9iYWwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZnVuY3Rpb24gZGVmaW5lRXhwb3J0KGV4KSB7IG1vZHVsZS5leHBvcnRzID0gZXg7IH0pO1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklsTmpjbWx3ZEhNdmJHbGlMM05oYlcxNUxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbHh1T3lCS1VYVmxjbmtnUFNCbmJHOWlZV3d1U2xGMVpYSjVJRDBnY21WeGRXbHlaU2hjSW1weGRXVnllVndpS1R0Y2Jqc2dkbUZ5SUY5ZlluSnZkM05sY21sbWVWOXphR2x0WDNKbGNYVnBjbVZmWHoxeVpYRjFhWEpsT3lobWRXNWpkR2x2YmlCaWNtOTNjMlZ5YVdaNVUyaHBiU2h0YjJSMWJHVXNJR1Y0Y0c5eWRITXNJSEpsY1hWcGNtVXNJR1JsWm1sdVpTd2dZbkp2ZDNObGNtbG1lVjl6YUdsdFgxOWtaV1pwYm1WZlgyMXZaSFZzWlY5ZlpYaHdiM0owWDE4cElIdGNiaTh2SUc1aGJXVTZJSE5oYlcxNVhISmNiaTh2SUhabGNuTnBiMjQ2SURBdU55NDFYSEpjYmx4eVhHNHZMeUJUWVcxdGVTNXFjeUF2SUdoMGRIQTZMeTl6WVcxdGVXcHpMbTl5WjF4eVhHNWNjbHh1S0daMWJtTjBhVzl1S0daaFkzUnZjbmtwZTF4eVhHNGdJQzh2SUZOMWNIQnZjblFnYlc5a2RXeGxJR3h2WVdScGJtY2djMk5sYm1GeWFXOXpYSEpjYmlBZ2FXWWdLSFI1Y0dWdlppQmtaV1pwYm1VZ1BUMDlJQ2RtZFc1amRHbHZiaWNnSmlZZ1pHVm1hVzVsTG1GdFpDbDdYSEpjYmlBZ0lDQXZMeUJCVFVRZ1FXNXZibmx0YjNWeklFMXZaSFZzWlZ4eVhHNGdJQ0FnWkdWbWFXNWxLRnNuYW5GMVpYSjVKMTBzSUdaaFkzUnZjbmtwTzF4eVhHNGdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQXZMeUJPYnlCdGIyUjFiR1VnYkc5aFpHVnlJQ2h3YkdGcGJpQThjMk55YVhCMFBpQjBZV2NwSUMwZ2NIVjBJR1JwY21WamRHeDVJR2x1SUdkc2IySmhiQ0J1WVcxbGMzQmhZMlZjY2x4dUlDQWdJR3BSZFdWeWVTNXpZVzF0ZVNBOUlIZHBibVJ2ZHk1VFlXMXRlU0E5SUdaaFkzUnZjbmtvYWxGMVpYSjVLVHRjY2x4dUlDQjlYSEpjYm4wcEtHWjFibU4wYVc5dUtDUXBlMXh5WEc1Y2NseHVJQ0IyWVhJZ1UyRnRiWGtzWEhKY2JpQWdJQ0FnSUZCQlZFaGZVa1ZRVEVGRFJWSWdQU0JjSWloYlhseGNMMTByS1Z3aUxGeHlYRzRnSUNBZ0lDQlFRVlJJWDA1QlRVVmZUVUZVUTBoRlVpQTlJQzg2S0Z0Y1hIZGNYR1JkS3lrdlp5eGNjbHh1SUNBZ0lDQWdVVlZGVWxsZlUxUlNTVTVIWDAxQlZFTklSVklnUFNBdlhGdy9LRnRlSTEwcUtUOGtMeXhjY2x4dUlDQWdJQ0FnTHk4Z2JXRnBibXg1SUdadmNpQnRZV3RwYm1jZ1lHRnlaM1Z0Wlc1MGMyQWdZVzRnUVhKeVlYbGNjbHh1SUNBZ0lDQWdYMjFoYTJWQmNuSmhlU0E5SUdaMWJtTjBhVzl1S0c1dmJtRnljbUY1S1NCN0lISmxkSFZ5YmlCQmNuSmhlUzV3Y205MGIzUjVjR1V1YzJ4cFkyVXVZMkZzYkNodWIyNWhjbkpoZVNrN0lIMHNYSEpjYmlBZ0lDQWdJQzh2SUdKdmNuSnZkMlZrSUdaeWIyMGdhbEYxWlhKNVhISmNiaUFnSUNBZ0lGOXBjMFoxYm1OMGFXOXVJRDBnWm5WdVkzUnBiMjRvSUc5aWFpQXBJSHNnY21WMGRYSnVJRTlpYW1WamRDNXdjbTkwYjNSNWNHVXVkRzlUZEhKcGJtY3VZMkZzYkNodlltb3BJRDA5UFNCY0lsdHZZbXBsWTNRZ1JuVnVZM1JwYjI1ZFhDSTdJSDBzWEhKY2JpQWdJQ0FnSUY5cGMwRnljbUY1SUQwZ1puVnVZM1JwYjI0b0lHOWlhaUFwSUhzZ2NtVjBkWEp1SUU5aWFtVmpkQzV3Y205MGIzUjVjR1V1ZEc5VGRISnBibWN1WTJGc2JDaHZZbW9wSUQwOVBTQmNJbHR2WW1wbFkzUWdRWEp5WVhsZFhDSTdJSDBzWEhKY2JpQWdJQ0FnSUY5cGMxSmxaMFY0Y0NBOUlHWjFibU4wYVc5dUtDQnZZbW9nS1NCN0lISmxkSFZ5YmlCUFltcGxZM1F1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuTG1OaGJHd29iMkpxS1NBOVBUMGdYQ0piYjJKcVpXTjBJRkpsWjBWNGNGMWNJanNnZlN4Y2NseHVJQ0FnSUNBZ1gyUmxZMjlrWlNBOUlHWjFibU4wYVc5dUtDQnpkSElnS1NCN0lISmxkSFZ5YmlCa1pXTnZaR1ZWVWtsRGIyMXdiMjVsYm5Rb0tITjBjaUI4ZkNBbkp5a3VjbVZ3YkdGalpTZ3ZYRndyTDJjc0lDY2dKeWtwT3lCOUxGeHlYRzRnSUNBZ0lDQmZaVzVqYjJSbElEMGdaVzVqYjJSbFZWSkpRMjl0Y0c5dVpXNTBMRnh5WEc0Z0lDQWdJQ0JmWlhOallYQmxTRlJOVENBOUlHWjFibU4wYVc5dUtITXBJSHRjY2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnVTNSeWFXNW5LSE1wTG5KbGNHeGhZMlVvTHlZb1B5RmNYSGNyT3lrdlp5d2dKeVpoYlhBN0p5a3VjbVZ3YkdGalpTZ3ZQQzluTENBbkpteDBPeWNwTG5KbGNHeGhZMlVvTHo0dlp5d2dKeVpuZERzbktTNXlaWEJzWVdObEtDOWNJaTluTENBbkpuRjFiM1E3SnlrN1hISmNiaUFnSUNBZ0lIMHNYSEpjYmlBZ0lDQWdJRjl5YjNWMFpWZHlZWEJ3WlhJZ1BTQm1kVzVqZEdsdmJpaDJaWEppS1NCN1hISmNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjbTkxZEdVdVlYQndiSGtvZEdocGN5d2dXM1psY21KZExtTnZibU5oZENoQmNuSmhlUzV3Y205MGIzUjVjR1V1YzJ4cFkyVXVZMkZzYkNoaGNtZDFiV1Z1ZEhNcEtTazdYSEpjYmlBZ0lDQWdJQ0FnZlR0Y2NseHVJQ0FnSUNBZ2ZTeGNjbHh1SUNBZ0lDQWdYM1JsYlhCc1lYUmxYMk5oWTJobElEMGdlMzBzWEhKY2JpQWdJQ0FnSUY5b1lYTmZhR2x6ZEc5eWVTQTlJQ0VoS0hkcGJtUnZkeTVvYVhOMGIzSjVJQ1ltSUdocGMzUnZjbmt1Y0hWemFGTjBZWFJsS1N4Y2NseHVJQ0FnSUNBZ2JHOW5aMlZ5Y3lBOUlGdGRPMXh5WEc1Y2NseHVYSEpjYmlBZ0x5OGdZRk5oYlcxNVlDQW9ZV3h6YnlCaGJHbGhjMlZrSUdGeklDUXVjMkZ0YlhrcElHbHpJRzV2ZENCdmJteDVJSFJvWlNCdVlXMWxjM0JoWTJVZ1ptOXlJR0ZjY2x4dUlDQXZMeUJ1ZFcxaVpYSWdiMllnY0hKdmRHOTBlWEJsY3l3Z2FYUnpJR0ZzYzI4Z1lTQjBiM0FnYkdWMlpXd2diV1YwYUc5a0lIUm9ZWFFnWVd4c2IzZHpJR1p2Y2lCbFlYTjVYSEpjYmlBZ0x5OGdZM0psWVhScGIyNHZiV0Z1WVdkbGJXVnVkQ0J2WmlCZ1UyRnRiWGt1UVhCd2JHbGpZWFJwYjI1Z0lHbHVjM1JoYm1ObGN5NGdWR2hsY21VZ1lYSmxJR0ZjY2x4dUlDQXZMeUJ1ZFcxaVpYSWdiMllnWkdsbVptVnlaVzUwSUdadmNtMXpJR1p2Y2lCZ1UyRnRiWGtvS1dBZ1luVjBJR1ZoWTJnZ2NtVjBkWEp1Y3lCaGJpQnBibk4wWVc1alpWeHlYRzRnSUM4dklHOW1JR0JUWVcxdGVTNUJjSEJzYVdOaGRHbHZibUF1SUZkb1pXNGdZU0J1WlhjZ2FXNXpkR0Z1WTJVZ2FYTWdZM0psWVhSbFpDQjFjMmx1WjF4eVhHNGdJQzh2SUdCVFlXMXRlV0FnYVhRZ2FYTWdZV1JrWldRZ2RHOGdZVzRnVDJKcVpXTjBJR05oYkd4bFpDQmdVMkZ0YlhrdVlYQndjMkF1SUZSb2FYTmNjbHh1SUNBdkx5QndjbTkyYVdSbGN5Qm1iM0lnWVc0Z1pXRnplU0IzWVhrZ2RHOGdaMlYwSUdGMElHVjRhWE4wYVc1bklGTmhiVzE1SUdGd2NHeHBZMkYwYVc5dWN5NGdUMjVzZVNCdmJtVmNjbHh1SUNBdkx5QnBibk4wWVc1alpTQnBjeUJoYkd4dmQyVmtJSEJsY2lCZ1pXeGxiV1Z1ZEY5elpXeGxZM1J2Y21BZ2MyOGdkMmhsYmlCallXeHNhVzVuWEhKY2JpQWdMeThnWUZOaGJXMTVLQ2R6Wld4bFkzUnZjaWNwWUNCdGRXeDBhWEJzWlNCMGFXMWxjeXdnZEdobElHWnBjbk4wSUhScGJXVWdkMmxzYkNCamNtVmhkR1ZjY2x4dUlDQXZMeUIwYUdVZ1lYQndiR2xqWVhScGIyNGdZVzVrSUhSb1pTQm1iMnhzYjNkcGJtY2dkR2x0WlhNZ2QybHNiQ0JsZUhSbGJtUWdkR2hsSUdGd2NHeHBZMkYwYVc5dVhISmNiaUFnTHk4Z1lXeHlaV0ZrZVNCaFpHUmxaQ0IwYnlCMGFHRjBJSE5sYkdWamRHOXlMbHh5WEc0Z0lDOHZYSEpjYmlBZ0x5OGdJeU1qSUVWNFlXMXdiR1ZjY2x4dUlDQXZMMXh5WEc0Z0lDOHZJQ0FnSUNBZ0x5OGdjbVYwZFhKdWN5QjBhR1VnWVhCd0lHRjBJQ050WVdsdUlHOXlJR0VnYm1WM0lHRndjRnh5WEc0Z0lDOHZJQ0FnSUNBZ1UyRnRiWGtvSnlOdFlXbHVKeWxjY2x4dUlDQXZMMXh5WEc0Z0lDOHZJQ0FnSUNBZ0x5OGdaWEYxYVhaaGJHVnVkQ0IwYnlCY0ltNWxkeUJUWVcxdGVTNUJjSEJzYVdOaGRHbHZibHdpTENCbGVHTmxjSFFnWVhCd1pXNWtjeUIwYnlCaGNIQnpYSEpjYmlBZ0x5OGdJQ0FnSUNCVFlXMXRlU2dwTzF4eVhHNGdJQzh2SUNBZ0lDQWdVMkZ0Ylhrb1puVnVZM1JwYjI0b0tTQjdJQzR1TGlCOUtUdGNjbHh1SUNBdkwxeHlYRzRnSUM4dklDQWdJQ0FnTHk4Z1pYaDBaVzVrY3lCMGFHVWdZWEJ3SUdGMElDY2piV0ZwYmljZ2QybDBhQ0JtZFc1amRHbHZiaTVjY2x4dUlDQXZMeUFnSUNBZ0lGTmhiVzE1S0NjamJXRnBiaWNzSUdaMWJtTjBhVzl1S0NrZ2V5QXVMaTRnZlNrN1hISmNiaUFnTHk5Y2NseHVJQ0JUWVcxdGVTQTlJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnZG1GeUlHRnlaM01nUFNCZmJXRnJaVUZ5Y21GNUtHRnlaM1Z0Wlc1MGN5a3NYSEpjYmlBZ0lDQWdJQ0FnWVhCd0xDQnpaV3hsWTNSdmNqdGNjbHh1SUNBZ0lGTmhiVzE1TG1Gd2NITWdQU0JUWVcxdGVTNWhjSEJ6SUh4OElIdDlPMXh5WEc0Z0lDQWdhV1lnS0dGeVozTXViR1Z1WjNSb0lEMDlQU0F3SUh4OElHRnlaM05iTUYwZ0ppWWdYMmx6Um5WdVkzUnBiMjRvWVhKbmMxc3dYU2twSUhzZ0x5OGdVMkZ0Ylhrb0tWeHlYRzRnSUNBZ0lDQnlaWFIxY200Z1UyRnRiWGt1WVhCd2JIa29VMkZ0Ylhrc0lGc25ZbTlrZVNkZExtTnZibU5oZENoaGNtZHpLU2s3WEhKY2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVnZaaUFvYzJWc1pXTjBiM0lnUFNCaGNtZHpMbk5vYVdaMEtDa3BJRDA5SUNkemRISnBibWNuS1NCN0lDOHZJRk5oYlcxNUtDY2piV0ZwYmljcFhISmNiaUFnSUNBZ0lHRndjQ0E5SUZOaGJXMTVMbUZ3Y0hOYmMyVnNaV04wYjNKZElIeDhJRzVsZHlCVFlXMXRlUzVCY0hCc2FXTmhkR2x2YmlncE8xeHlYRzRnSUNBZ0lDQmhjSEF1Wld4bGJXVnVkRjl6Wld4bFkzUnZjaUE5SUhObGJHVmpkRzl5TzF4eVhHNGdJQ0FnSUNCcFppQW9ZWEpuY3k1c1pXNW5kR2dnUGlBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSkM1bFlXTm9LR0Z5WjNNc0lHWjFibU4wYVc5dUtHa3NJSEJzZFdkcGJpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1lYQndMblZ6WlNod2JIVm5hVzRwTzF4eVhHNGdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUM4dklHbG1JSFJvWlNCelpXeGxZM1J2Y2lCamFHRnVaMlZ6SUcxaGEyVWdjM1Z5WlNCMGFHVWdjbVZtWlhKbGJtTmxJR2x1SUZOaGJXMTVMbUZ3Y0hNZ1kyaGhibWRsYzF4eVhHNGdJQ0FnSUNCcFppQW9ZWEJ3TG1Wc1pXMWxiblJmYzJWc1pXTjBiM0lnSVQwZ2MyVnNaV04wYjNJcElIdGNjbHh1SUNBZ0lDQWdJQ0JrWld4bGRHVWdVMkZ0YlhrdVlYQndjMXR6Wld4bFkzUnZjbDA3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ1UyRnRiWGt1WVhCd2MxdGhjSEF1Wld4bGJXVnVkRjl6Wld4bFkzUnZjbDBnUFNCaGNIQTdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQmhjSEE3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVHRjY2x4dVhISmNiaUFnVTJGdGJYa3VWa1ZTVTBsUFRpQTlJQ2N3TGpjdU5TYzdYSEpjYmx4eVhHNGdJQzh2SUVGa1pDQjBieUIwYUdVZ1oyeHZZbUZzSUd4dloyZGxjaUJ3YjI5c0xpQlVZV3RsY3lCaElHWjFibU4wYVc5dUlIUm9ZWFFnWVdOalpYQjBjeUJoYmx4eVhHNGdJQzh2SUhWdWEyNXZkMjRnYm5WdFltVnlJRzltSUdGeVozVnRaVzUwY3lCaGJtUWdjMmh2ZFd4a0lIQnlhVzUwSUhSb1pXMGdiM0lnYzJWdVpDQjBhR1Z0SUhOdmJXVjNhR1Z5WlZ4eVhHNGdJQzh2SUZSb1pTQm1hWEp6ZENCaGNtZDFiV1Z1ZENCcGN5QmhiSGRoZVhNZ1lTQjBhVzFsYzNSaGJYQXVYSEpjYmlBZ1UyRnRiWGt1WVdSa1RHOW5aMlZ5SUQwZ1puVnVZM1JwYjI0b2JHOW5aMlZ5S1NCN1hISmNiaUFnSUNCc2IyZG5aWEp6TG5CMWMyZ29iRzluWjJWeUtUdGNjbHh1SUNCOU8xeHlYRzVjY2x4dUlDQXZMeUJUWlc1a2N5QmhJR3h2WnlCdFpYTnpZV2RsSUhSdklHVmhZMmdnYkc5bloyVnlJR3hwYzNSbFpDQnBiaUIwYUdVZ1oyeHZZbUZzWEhKY2JpQWdMeThnYkc5bloyVnljeUJ3YjI5c0xpQkRZVzRnZEdGclpTQmhibmtnYm5WdFltVnlJRzltSUdGeVozVnRaVzUwY3k1Y2NseHVJQ0F2THlCQmJITnZJSEJ5WldacGVHVnpJSFJvWlNCaGNtZDFiV1Z1ZEhNZ2QybDBhQ0JoSUhScGJXVnpkR0Z0Y0M1Y2NseHVJQ0JUWVcxdGVTNXNiMmNnUFNCbWRXNWpkR2x2YmlncElDQjdYSEpjYmlBZ0lDQjJZWElnWVhKbmN5QTlJRjl0WVd0bFFYSnlZWGtvWVhKbmRXMWxiblJ6S1R0Y2NseHVJQ0FnSUdGeVozTXVkVzV6YUdsbWRDaGNJbHRjSWlBcklFUmhkR1VvS1NBcklGd2lYVndpS1R0Y2NseHVJQ0FnSUNRdVpXRmphQ2hzYjJkblpYSnpMQ0JtZFc1amRHbHZiaWhwTENCc2IyZG5aWElwSUh0Y2NseHVJQ0FnSUNBZ2JHOW5aMlZ5TG1Gd2NHeDVLRk5oYlcxNUxDQmhjbWR6S1R0Y2NseHVJQ0FnSUgwcE8xeHlYRzRnSUgwN1hISmNibHh5WEc0Z0lHbG1JQ2gwZVhCbGIyWWdkMmx1Wkc5M0xtTnZibk52YkdVZ0lUMGdKM1Z1WkdWbWFXNWxaQ2NwSUh0Y2NseHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ2QybHVaRzkzTG1OdmJuTnZiR1V1Ykc5bklEMDlQU0FuWm5WdVkzUnBiMjRuSUNZbUlGOXBjMFoxYm1OMGFXOXVLSGRwYm1SdmR5NWpiMjV6YjJ4bExteHZaeTVoY0hCc2VTa3BJSHRjY2x4dUlDQWdJQ0FnVTJGdGJYa3VZV1JrVEc5bloyVnlLR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lIZHBibVJ2ZHk1amIyNXpiMnhsTG14dlp5NWhjSEJzZVNoM2FXNWtiM2N1WTI5dWMyOXNaU3dnWVhKbmRXMWxiblJ6S1R0Y2NseHVJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQlRZVzF0ZVM1aFpHUk1iMmRuWlhJb1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJQ0FnZDJsdVpHOTNMbU52Ym5OdmJHVXViRzluS0dGeVozVnRaVzUwY3lrN1hISmNiaUFnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMGdaV3h6WlNCcFppQW9kSGx3Wlc5bUlHTnZibk52YkdVZ0lUMGdKM1Z1WkdWbWFXNWxaQ2NwSUh0Y2NseHVJQ0FnSUZOaGJXMTVMbUZrWkV4dloyZGxjaWhtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ1kyOXVjMjlzWlM1c2IyY3VZWEJ3Ykhrb1kyOXVjMjlzWlN3Z1lYSm5kVzFsYm5SektUdGNjbHh1SUNBZ0lIMHBPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKQzVsZUhSbGJtUW9VMkZ0Ylhrc0lIdGNjbHh1SUNBZ0lHMWhhMlZCY25KaGVUb2dYMjFoYTJWQmNuSmhlU3hjY2x4dUlDQWdJR2x6Um5WdVkzUnBiMjQ2SUY5cGMwWjFibU4wYVc5dUxGeHlYRzRnSUNBZ2FYTkJjbkpoZVRvZ1gybHpRWEp5WVhsY2NseHVJQ0I5S1R0Y2NseHVYSEpjYmlBZ0x5OGdVMkZ0YlhrdVQySnFaV04wSUdseklIUm9aU0JpWVhObElHWnZjaUJoYkd3Z2IzUm9aWElnVTJGdGJYa2dZMnhoYzNObGN5NGdTWFFnY0hKdmRtbGtaWE1nYzI5dFpTQjFjMlZtZFd4Y2NseHVJQ0F2THlCbWRXNWpkR2x2Ym1Gc2FYUjVMQ0JwYm1Oc2RXUnBibWNnWTJ4dmJtbHVaeXdnYVhSbGNtRjBhVzVuTENCbGRHTXVYSEpjYmlBZ1UyRnRiWGt1VDJKcVpXTjBJRDBnWm5WdVkzUnBiMjRvYjJKcUtTQjdJQzh2SUdOdmJuTjBjblZqZEc5eVhISmNiaUFnSUNCeVpYUjFjbTRnSkM1bGVIUmxibVFvZEdocGN5d2diMkpxSUh4OElIdDlLVHRjY2x4dUlDQjlPMXh5WEc1Y2NseHVJQ0FrTG1WNGRHVnVaQ2hUWVcxdGVTNVBZbXBsWTNRdWNISnZkRzkwZVhCbExDQjdYSEpjYmx4eVhHNGdJQ0FnTHk4Z1JYTmpZWEJsSUVoVVRVd2dhVzRnYzNSeWFXNW5MQ0IxYzJVZ2FXNGdkR1Z0Y0d4aGRHVnpJSFJ2SUhCeVpYWmxiblFnYzJOeWFYQjBJR2x1YW1WamRHbHZiaTVjY2x4dUlDQWdJQzh2SUVGc2MyOGdZV3hwWVhObFpDQmhjeUJnYUNncFlGeHlYRzRnSUNBZ1pYTmpZWEJsU0ZSTlREb2dYMlZ6WTJGd1pVaFVUVXdzWEhKY2JpQWdJQ0JvT2lCZlpYTmpZWEJsU0ZSTlRDeGNjbHh1WEhKY2JpQWdJQ0F2THlCU1pYUjFjbTV6SUdFZ1kyOXdlU0J2WmlCMGFHVWdiMkpxWldOMElIZHBkR2dnUm5WdVkzUnBiMjV6SUhKbGJXOTJaV1F1WEhKY2JpQWdJQ0IwYjBoaGMyZzZJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNCMllYSWdhbk52YmlBOUlIdDlPMXh5WEc0Z0lDQWdJQ0FrTG1WaFkyZ29kR2hwY3l3Z1puVnVZM1JwYjI0b2F5eDJLU0I3WEhKY2JpQWdJQ0FnSUNBZ2FXWWdLQ0ZmYVhOR2RXNWpkR2x2YmloMktTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2FuTnZibHRyWFNBOUlIWTdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlHcHpiMjQ3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRkpsYm1SbGNuTWdZU0J6YVcxd2JHVWdTRlJOVENCMlpYSnphVzl1SUc5bUlIUm9hWE1nVDJKcVpXTjBjeUJoZEhSeWFXSjFkR1Z6TGx4eVhHNGdJQ0FnTHk4Z1JHOWxjeUJ1YjNRZ2NtVnVaR1Z5SUdaMWJtTjBhVzl1Y3k1Y2NseHVJQ0FnSUM4dklFWnZjaUJsZUdGdGNHeGxMaUJIYVhabGJpQjBhR2x6SUZOaGJXMTVMazlpYW1WamREcGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ2RtRnlJSE1nUFNCdVpYY2dVMkZ0YlhrdVQySnFaV04wS0h0bWFYSnpkRjl1WVcxbE9pQW5VMkZ0YlhrbkxDQnNZWE4wWDI1aGJXVTZJQ2RFWVhacGN5QktjaTRuZlNrN1hISmNiaUFnSUNBdkx5QWdJQ0FnY3k1MGIwaFVUVXdvS1Z4eVhHNGdJQ0FnTHk4Z0lDQWdJQzh2UFQ0Z0p6eHpkSEp2Ym1jK1ptbHljM1JmYm1GdFpUd3ZjM1J5YjI1blBpQlRZVzF0ZVR4aWNpQXZQanh6ZEhKdmJtYytiR0Z6ZEY5dVlXMWxQQzl6ZEhKdmJtYytJRVJoZG1seklFcHlManhpY2lBdlBpZGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQjBiMGhVVFV3NklHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0IyWVhJZ1pHbHpjR3hoZVNBOUlGd2lYQ0k3WEhKY2JpQWdJQ0FnSUNRdVpXRmphQ2gwYUdsekxDQm1kVzVqZEdsdmJpaHJMQ0IyS1NCN1hISmNiaUFnSUNBZ0lDQWdhV1lnS0NGZmFYTkdkVzVqZEdsdmJpaDJLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdaR2x6Y0d4aGVTQXJQU0JjSWp4emRISnZibWMrWENJZ0t5QnJJQ3NnWENJOEwzTjBjbTl1Wno0Z1hDSWdLeUIySUNzZ1hDSThZbklnTHo1Y0lqdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQnlaWFIxY200Z1pHbHpjR3hoZVR0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnVW1WMGRYSnVjeUJoYmlCaGNuSmhlU0J2WmlCclpYbHpJR1p2Y2lCMGFHbHpJRzlpYW1WamRDNGdTV1lnWUdGMGRISnBZblYwWlhOZmIyNXNlV0JjY2x4dUlDQWdJQzh2SUdseklIUnlkV1VnZDJsc2JDQnViM1FnY21WMGRYSnVJR3RsZVhNZ2RHaGhkQ0J0WVhBZ2RHOGdZU0JnWm5WdVkzUnBiMjRvS1dCY2NseHVJQ0FnSUd0bGVYTTZJR1oxYm1OMGFXOXVLR0YwZEhKcFluVjBaWE5mYjI1c2VTa2dlMXh5WEc0Z0lDQWdJQ0IyWVhJZ2EyVjVjeUE5SUZ0ZE8xeHlYRzRnSUNBZ0lDQm1iM0lnS0haaGNpQndjbTl3WlhKMGVTQnBiaUIwYUdsektTQjdYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tDRmZhWE5HZFc1amRHbHZiaWgwYUdselczQnliM0JsY25SNVhTa2dmSHdnSVdGMGRISnBZblYwWlhOZmIyNXNlU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdhMlY1Y3k1d2RYTm9LSEJ5YjNCbGNuUjVLVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlHdGxlWE03WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRU5vWldOcmN5QnBaaUIwYUdVZ2IySnFaV04wSUdoaGN5QmhJSFpoYkhWbElHRjBJR0JyWlhsZ0lHRnVaQ0IwYUdGMElIUm9aU0IyWVd4MVpTQnBjeUJ1YjNRZ1pXMXdkSGxjY2x4dUlDQWdJR2hoY3pvZ1puVnVZM1JwYjI0b2EyVjVLU0I3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdselcydGxlVjBnSmlZZ0pDNTBjbWx0S0hSb2FYTmJhMlY1WFM1MGIxTjBjbWx1WnlncEtTQWhQVDBnSnljN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUdOdmJuWmxibWxsYm1ObElHMWxkR2h2WkNCMGJ5QnFiMmx1SUdGeklHMWhibmtnWVhKbmRXMWxiblJ6SUdGeklIbHZkU0IzWVc1MFhISmNiaUFnSUNBdkx5QmllU0IwYUdVZ1ptbHljM1FnWVhKbmRXMWxiblFnTFNCMWMyVm1kV3dnWm05eUlHMWhhMmx1WnlCd1lYUm9jMXh5WEc0Z0lDQWdhbTlwYmpvZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJSFpoY2lCaGNtZHpJRDBnWDIxaGEyVkJjbkpoZVNoaGNtZDFiV1Z1ZEhNcE8xeHlYRzRnSUNBZ0lDQjJZWElnWkdWc2FXMXBkR1Z5SUQwZ1lYSm5jeTV6YUdsbWRDZ3BPMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdZWEpuY3k1cWIybHVLR1JsYkdsdGFYUmxjaWs3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRk5vYjNKMFkzVjBJSFJ2SUZOaGJXMTVMbXh2WjF4eVhHNGdJQ0FnYkc5bk9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnVTJGdGJYa3ViRzluTG1Gd2NHeDVLRk5oYlcxNUxDQmhjbWQxYldWdWRITXBPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5QlNaWFIxY201eklHRWdjM1J5YVc1bklISmxjSEpsYzJWdWRHRjBhVzl1SUc5bUlIUm9hWE1nYjJKcVpXTjBMbHh5WEc0Z0lDQWdMeThnYVdZZ1lHbHVZMngxWkdWZlpuVnVZM1JwYjI1ellDQnBjeUIwY25WbExDQnBkQ0IzYVd4c0lHRnNjMjhnZEc5VGRISnBibWNvS1NCMGFHVmNjbHh1SUNBZ0lDOHZJRzFsZEdodlpITWdiMllnZEdocGN5QnZZbXBsWTNRdUlFSjVJR1JsWm1GMWJIUWdiMjVzZVNCd2NtbHVkSE1nZEdobElHRjBkSEpwWW5WMFpYTXVYSEpjYmlBZ0lDQjBiMU4wY21sdVp6b2dablZ1WTNScGIyNG9hVzVqYkhWa1pWOW1kVzVqZEdsdmJuTXBJSHRjY2x4dUlDQWdJQ0FnZG1GeUlITWdQU0JiWFR0Y2NseHVJQ0FnSUNBZ0pDNWxZV05vS0hSb2FYTXNJR1oxYm1OMGFXOXVLR3NzSUhZcElIdGNjbHh1SUNBZ0lDQWdJQ0JwWmlBb0lWOXBjMFoxYm1OMGFXOXVLSFlwSUh4OElHbHVZMngxWkdWZlpuVnVZM1JwYjI1ektTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCekxuQjFjMmdvSjF3aUp5QXJJR3NnS3lBblhDSTZJQ2NnS3lCMkxuUnZVM1J5YVc1bktDa3BPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQmNJbE5oYlcxNUxrOWlhbVZqZERvZ2Uxd2lJQ3NnY3k1cWIybHVLQ2NzSnlrZ0t5QmNJbjFjSWp0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5S1R0Y2NseHVYSEpjYmx4eVhHNGdJQzh2SUZKbGRIVnliaUIzYUdWMGFHVnlJSFJvWlNCbGRtVnVkQ0IwWVhKblpYUnpJSFJvYVhNZ2QybHVaRzkzTGx4eVhHNGdJRk5oYlcxNUxuUmhjbWRsZEVselZHaHBjMWRwYm1SdmR5QTlJR1oxYm1OMGFXOXVJSFJoY21kbGRFbHpWR2hwYzFkcGJtUnZkeWhsZG1WdWRDd2dkR0ZuVG1GdFpTa2dlMXh5WEc0Z0lDQWdkbUZ5SUhSaGNtZGxkRVZzWlcxbGJuUWdQU0FrS0dWMlpXNTBMblJoY21kbGRDa3VZMnh2YzJWemRDaDBZV2RPWVcxbEtUdGNjbHh1SUNBZ0lHbG1JQ2gwWVhKblpYUkZiR1Z0Wlc1MExteGxibWQwYUNBOVBUMGdNQ2tnZXlCeVpYUjFjbTRnZEhKMVpUc2dmVnh5WEc1Y2NseHVJQ0FnSUhaaGNpQjBZWEpuWlhSWGFXNWtiM2NnUFNCMFlYSm5aWFJGYkdWdFpXNTBMbUYwZEhJb0ozUmhjbWRsZENjcE8xeHlYRzRnSUNBZ2FXWWdLQ0YwWVhKblpYUlhhVzVrYjNjZ2ZId2dkR0Z5WjJWMFYybHVaRzkzSUQwOVBTQjNhVzVrYjNjdWJtRnRaU0I4ZkNCMFlYSm5aWFJYYVc1a2IzY2dQVDA5SUNkZmMyVnNaaWNwSUhzZ2NtVjBkWEp1SUhSeWRXVTdJSDFjY2x4dUlDQWdJR2xtSUNoMFlYSm5aWFJYYVc1a2IzY2dQVDA5SUNkZllteGhibXNuS1NCN0lISmxkSFZ5YmlCbVlXeHpaVHNnZlZ4eVhHNGdJQ0FnYVdZZ0tIUmhjbWRsZEZkcGJtUnZkeUE5UFQwZ0ozUnZjQ2NnSmlZZ2QybHVaRzkzSUQwOVBTQjNhVzVrYjNjdWRHOXdLU0I3SUhKbGRIVnliaUIwY25WbE95QjlYSEpjYmlBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEhKY2JpQWdmVHRjY2x4dVhISmNibHh5WEc0Z0lDOHZJRlJvWlNCRVpXWmhkV3gwVEc5allYUnBiMjVRY205NGVTQnBjeUIwYUdVZ1pHVm1ZWFZzZENCc2IyTmhkR2x2YmlCd2NtOTRlU0JtYjNJZ1lXeHNJRk5oYlcxNUlHRndjR3hwWTJGMGFXOXVjeTVjY2x4dUlDQXZMeUJCSUd4dlkyRjBhVzl1SUhCeWIzaDVJR2x6SUdFZ2NISnZkRzkwZVhCbElIUm9ZWFFnWTI5dVptOXliWE1nZEc4Z1lTQnphVzF3YkdVZ2FXNTBaWEptWVdObExpQlVhR1VnY0hWeWNHOXpaVnh5WEc0Z0lDOHZJRzltSUdFZ2JHOWpZWFJwYjI0Z2NISnZlSGtnYVhNZ2RHOGdibTkwYVdaNUlIUm9aU0JUWVcxdGVTNUJjSEJzYVdOaGRHbHZiaUJwZEhNZ1ltOTFibVFnZEc4Z2QyaGxiaUIwYUdVZ2JHOWpZWFJwYjI1Y2NseHVJQ0F2THlCdmNpQW5aWGgwWlhKdVlXd2djM1JoZEdVbklHTm9ZVzVuWlhNdVhISmNiaUFnTHk5Y2NseHVJQ0F2THlCVWFHVWdZRVJsWm1GMWJIUk1iMk5oZEdsdmJsQnliM2g1WUNCM1lYUmphR1Z6SUdadmNpQmphR0Z1WjJWeklIUnZJSFJvWlNCd1lYUm9JRzltSUhSb1pTQmpkWEp5Wlc1MElIZHBibVJ2ZHlCaGJtUmNjbHh1SUNBdkx5QnBjeUJoYkhOdklHRmliR1VnZEc4Z2MyVjBJSFJvWlNCd1lYUm9JR0poYzJWa0lHOXVJR05vWVc1blpYTWdhVzRnZEdobElHRndjR3hwWTJGMGFXOXVMaUJKZENCa2IyVnpJSFJvYVhNZ1lubGNjbHh1SUNBdkx5QjFjMmx1WnlCa2FXWm1aWEpsYm5RZ2JXVjBhRzlrY3lCa1pYQmxibVJwYm1jZ2IyNGdkMmhoZENCcGN5QmhkbUZwYkdGaWJHVWdhVzRnZEdobElHTjFjbkpsYm5RZ1luSnZkM05sY2k0Z1NXNWNjbHh1SUNBdkx5QjBhR1VnYkdGMFpYTjBJR0Z1WkNCbmNtVmhkR1Z6ZENCaWNtOTNjMlZ5Y3lCcGRDQjFjMlZrSUhSb1pTQklWRTFNTlNCSWFYTjBiM0o1SUVGUVNTQmhibVFnZEdobElHQndkWE5vVTNSaGRHVmdYSEpjYmlBZ0x5OGdZSEJ2Y0ZOMFlYUmxZQ0JsZG1WdWRITXZiV1YwYUc5a2N5NGdWR2hwY3lCaGJHeHZkM01nZVc5MUlIUnZJSFZ6WlNCVFlXMXRlU0IwYnlCelpYSjJaU0JoSUhOcGRHVWdZbVZvYVc1a0lHNXZjbTFoYkZ4eVhHNGdJQzh2SUZWU1NTQndZWFJvY3lCaGN5QnZjSEJ2YzJWa0lIUnZJSFJvWlNCdmJHUmxjaUJrWldaaGRXeDBJRzltSUdoaGMyZ2dLQ01wSUdKaGMyVmtJSEp2ZFhScGJtY3VJRUpsWTJGMWMyVWdkR2hsSUhObGNuWmxjbHh5WEc0Z0lDOHZJR05oYmlCcGJuUmxjbkJ5WlhRZ2RHaGxJR05vWVc1blpXUWdjR0YwYUNCdmJpQmhJSEpsWm5KbGMyZ2diM0lnY21VdFpXNTBjbmtzSUhSb2IzVm5hQ3dnYVhRZ2NtVnhkV2x5WlhNZ1lXUmthWFJwYjI1aGJGeHlYRzRnSUM4dklITjFjSEJ2Y25RZ2IyNGdkR2hsSUhObGNuWmxjaUJ6YVdSbExpQkpaaUI1YjNVblpDQnNhV3RsSUhSdklHWnZjbU5sSUdScGMyRmliR1VnU0ZSTlREVWdhR2x6ZEc5eWVTQnpkWEJ3YjNKMExDQndiR1ZoYzJWY2NseHVJQ0F2THlCMWMyVWdkR2hsSUdCa2FYTmhZbXhsWDNCMWMyaGZjM1JoZEdWZ0lITmxkSFJwYm1jZ2IyNGdZRk5oYlcxNUxrRndjR3hwWTJGMGFXOXVZQzRnU1dZZ2NIVnphRk4wWVhSbElITjFjSEJ2Y25SY2NseHVJQ0F2THlCcGN5QmxibUZpYkdWa0xDQmdSR1ZtWVhWc2RFeHZZMkYwYVc5dVVISnZlSGxnSUdGc2MyOGdZbWx1WkhNZ2RHOGdZV3hzSUd4cGJtdHpJRzl1SUhSb1pTQndZV2RsTGlCSlppQmhJR3hwYm1zZ2FYTWdZMnhwWTJ0bFpGeHlYRzRnSUM4dklIUm9ZWFFnYldGMFkyaGxjeUIwYUdVZ1kzVnljbVZ1ZENCelpYUWdiMllnY205MWRHVnpMQ0IwYUdVZ1ZWSk1JR2x6SUdOb1lXNW5aV1FnZFhOcGJtY2djSFZ6YUZOMFlYUmxJR2x1YzNSbFlXUWdiMlpjY2x4dUlDQXZMeUJtZFd4c2VTQnpaWFIwYVc1bklIUm9aU0JzYjJOaGRHbHZiaUJoYm1RZ2RHaGxJR0Z3Y0NCcGN5QnViM1JwWm1sbFpDQnZaaUIwYUdVZ1kyaGhibWRsTGx4eVhHNGdJQzh2WEhKY2JpQWdMeThnU1dZZ2RHaGxJR0p5YjNkelpYSWdaRzlsY3lCdWIzUWdhR0YyWlNCemRYQndiM0owSUdadmNpQklWRTFNTlNCSWFYTjBiM0o1TENCZ1JHVm1ZWFZzZEV4dlkyRjBhVzl1VUhKdmVIbGdJR0YxZEc5dFlYUnBZMkZzYkhsY2NseHVJQ0F2THlCbVlXeHNjeUJpWVdOcklIUnZJSFJvWlNCdmJHUmxjaUJvWVhOb0lHSmhjMlZrSUhKdmRYUnBibWN1SUZSb1pTQnVaWGRsYzNRZ1luSnZkM05sY25NZ0tFbEZMQ0JUWVdaaGNta2dQaUEwTENCR1JpQStQU0F6TGpZcFhISmNiaUFnTHk4Z2MzVndjRzl5ZENCaElDZHZibWhoYzJoamFHRnVaMlVuSUVSUFRTQmxkbVZ1ZEN3Z2RHaGhkSE1nWm1seVpXUWdkMmhsYm1WMlpYSWdkR2hsSUd4dlkyRjBhVzl1TG1oaGMyZ2dZMmhoYm1kbGN5NWNjbHh1SUNBdkx5QkpiaUIwYUdseklITnBkSFZoZEdsdmJpQjBhR1VnUkdWbVlYVnNkRXh2WTJGMGFXOXVVSEp2ZUhrZ2FuVnpkQ0JpYVc1a2N5QjBieUIwYUdseklHVjJaVzUwSUdGdVpDQmtaV3hsWjJGMFpYTWdhWFFnZEc5Y2NseHVJQ0F2THlCMGFHVWdZWEJ3YkdsallYUnBiMjR1SUVsdUlIUm9aU0JqWVhObElHOW1JRzlzWkdWeUlHSnliM2R6WlhKeklHRWdjRzlzYkdWeUlHbHpJSE5sZENCMWNDQjBieUIwY21GamF5QmphR0Z1WjJWeklIUnZJSFJvWlZ4eVhHNGdJQzh2SUdoaGMyZ3VYSEpjYmlBZ1UyRnRiWGt1UkdWbVlYVnNkRXh2WTJGMGFXOXVVSEp2ZUhrZ1BTQm1kVzVqZEdsdmJpaGhjSEFzSUhKMWJsOXBiblJsY25aaGJGOWxkbVZ5ZVNrZ2UxeHlYRzRnSUNBZ2RHaHBjeTVoY0hBZ1BTQmhjSEE3WEhKY2JpQWdJQ0F2THlCelpYUWdhWE1nYm1GMGFYWmxJSFJ2SUdaaGJITmxJR0Z1WkNCemRHRnlkQ0IwYUdVZ2NHOXNiR1Z5SUdsdGJXVmthV0YwWld4NVhISmNiaUFnSUNCMGFHbHpMbWx6WDI1aGRHbDJaU0E5SUdaaGJITmxPMXh5WEc0Z0lDQWdkR2hwY3k1b1lYTmZhR2x6ZEc5eWVTQTlJRjlvWVhOZmFHbHpkRzl5ZVR0Y2NseHVJQ0FnSUhSb2FYTXVYM04wWVhKMFVHOXNiR2x1WnloeWRXNWZhVzUwWlhKMllXeGZaWFpsY25rcE8xeHlYRzRnSUgwN1hISmNibHh5WEc0Z0lGTmhiVzE1TGtSbFptRjFiSFJNYjJOaGRHbHZibEJ5YjNoNUxtWjFiR3hRWVhSb0lEMGdablZ1WTNScGIyNG9iRzlqWVhScGIyNWZiMkpxS1NCN1hISmNiaUFnSUM4dklFSjVjR0Z6Y3lCMGFHVWdZSGRwYm1SdmR5NXNiMk5oZEdsdmJpNW9ZWE5vWUNCaGRIUnlhV0oxZEdVdUlDQkpaaUJoSUhGMVpYTjBhVzl1SUcxaGNtdGNjbHh1SUNBZ0lDOHZJR0Z3Y0dWaGNuTWdhVzRnZEdobElHaGhjMmdnU1VVMklIZHBiR3dnYzNSeWFYQWdhWFFnWVc1a0lHRnNiQ0J2WmlCMGFHVWdabTlzYkc5M2FXNW5YSEpjYmlBZ0lDQXZMeUJqYUdGeVlXTjBaWEp6SUdaeWIyMGdZSGRwYm1SdmR5NXNiMk5oZEdsdmJpNW9ZWE5vWUM1Y2NseHVJQ0FnSUhaaGNpQnRZWFJqYUdWeklEMGdiRzlqWVhScGIyNWZiMkpxTG5SdlUzUnlhVzVuS0NrdWJXRjBZMmdvTDE1YlhpTmRLaWdqTGlzcEpDOHBPMXh5WEc0Z0lDQWdkbUZ5SUdoaGMyZ2dQU0J0WVhSamFHVnpJRDhnYldGMFkyaGxjMXN4WFNBNklDY25PMXh5WEc0Z0lDQWdjbVYwZFhKdUlGdHNiMk5oZEdsdmJsOXZZbW91Y0dGMGFHNWhiV1VzSUd4dlkyRjBhVzl1WDI5aWFpNXpaV0Z5WTJnc0lHaGhjMmhkTG1wdmFXNG9KeWNwTzF4eVhHNGdJSDA3WEhKY2JpUXVaWGgwWlc1a0tGTmhiVzE1TGtSbFptRjFiSFJNYjJOaGRHbHZibEJ5YjNoNUxuQnliM1J2ZEhsd1pTQXNJSHRjY2x4dUlDQWdJQzh2SUdKcGJtUWdkR2hsSUhCeWIzaDVJR1YyWlc1MGN5QjBieUIwYUdVZ1kzVnljbVZ1ZENCaGNIQXVYSEpjYmlBZ0lDQmlhVzVrT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdkbUZ5SUhCeWIzaDVJRDBnZEdocGN5d2dZWEJ3SUQwZ2RHaHBjeTVoY0hBc0lHeHdJRDBnVTJGdGJYa3VSR1ZtWVhWc2RFeHZZMkYwYVc5dVVISnZlSGs3WEhKY2JpQWdJQ0FnSUNRb2QybHVaRzkzS1M1aWFXNWtLQ2RvWVhOb1kyaGhibWRsTGljZ0t5QjBhR2x6TG1Gd2NDNWxkbVZ1ZEU1aGJXVnpjR0ZqWlNncExDQm1kVzVqZEdsdmJpaGxMQ0J1YjI1ZmJtRjBhWFpsS1NCN1hISmNiaUFnSUNBZ0lDQWdMeThnYVdZZ2QyVWdjbVZqWldsMlpTQmhJRzVoZEdsMlpTQm9ZWE5vSUdOb1lXNW5aU0JsZG1WdWRDd2djMlYwSUhSb1pTQndjbTk0ZVNCaFkyTnZjbVJwYm1kc2VWeHlYRzRnSUNBZ0lDQWdJQzh2SUdGdVpDQnpkRzl3SUhCdmJHeHBibWRjY2x4dUlDQWdJQ0FnSUNCcFppQW9jSEp2ZUhrdWFYTmZibUYwYVhabElEMDlQU0JtWVd4elpTQW1KaUFoYm05dVgyNWhkR2wyWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnY0hKdmVIa3VhWE5mYm1GMGFYWmxJRDBnZEhKMVpUdGNjbHh1SUNBZ0lDQWdJQ0FnSUhkcGJtUnZkeTVqYkdWaGNrbHVkR1Z5ZG1Gc0tHeHdMbDlwYm5SbGNuWmhiQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQnNjQzVmYVc1MFpYSjJZV3dnUFNCdWRXeHNPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQmhjSEF1ZEhKcFoyZGxjaWduYkc5allYUnBiMjR0WTJoaGJtZGxaQ2NwTzF4eVhHNGdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDQWdhV1lnS0Y5b1lYTmZhR2x6ZEc5eWVTQW1KaUFoWVhCd0xtUnBjMkZpYkdWZmNIVnphRjl6ZEdGMFpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUM4dklHSnBibVFnZEc4Z2NHOXdjM1JoZEdWY2NseHVJQ0FnSUNBZ0lDQWtLSGRwYm1SdmR5a3VZbWx1WkNnbmNHOXdjM1JoZEdVdUp5QXJJSFJvYVhNdVlYQndMbVYyWlc1MFRtRnRaWE53WVdObEtDa3NJR1oxYm1OMGFXOXVLR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0Z3Y0M1MGNtbG5aMlZ5S0Nkc2IyTmhkR2x2YmkxamFHRnVaMlZrSnlrN1hISmNiaUFnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ0x5OGdZbWx1WkNCMGJ5QnNhVzVySUdOc2FXTnJjeUIwYUdGMElHaGhkbVVnY205MWRHVnpYSEpjYmlBZ0lDQWdJQ0FnSkNoa2IyTjFiV1Z1ZENrdVpHVnNaV2RoZEdVb0oyRW5MQ0FuWTJ4cFkyc3VhR2x6ZEc5eWVTMG5JQ3NnZEdocGN5NWhjSEF1WlhabGJuUk9ZVzFsYzNCaFkyVW9LU3dnWm5WdVkzUnBiMjRnS0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdsbUlDaGxMbWx6UkdWbVlYVnNkRkJ5WlhabGJuUmxaQ2dwSUh4OElHVXViV1YwWVV0bGVTQjhmQ0JsTG1OMGNteExaWGtwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnZG1GeUlHWjFiR3hmY0dGMGFDQTlJR3h3TG1aMWJHeFFZWFJvS0hSb2FYTXBMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJIWlhRZ1lXNWphRzl5SjNNZ2FHOXpkQ0J1WVcxbElHbHVJR0VnWTNKdmMzTWdZbkp2ZDNObGNpQmpiMjF3WVhScFlteGxJSGRoZVM1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1NVVWdiRzl2YzJWeklHaHZjM1J1WVcxbElIQnliM0JsY25SNUlIZG9aVzRnYzJWMGRHbHVaeUJvY21WbUlHbHVJRXBUWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUhkcGRHZ2dZU0J5Wld4aGRHbDJaU0JWVWt3c0lHVXVaeTRnWVM1elpYUkJkSFJ5YVdKMWRHVW9KMmh5WldZbkxGd2lMM2RvWVhSbGRtVnlYQ0lwTGx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCRGFYSmpkVzEyWlc1MElIUm9hWE1nY0hKdllteGxiU0JpZVNCamNtVmhkR2x1WnlCaElHNWxkeUJzYVc1cklIZHBkR2dnWjJsMlpXNGdWVkpNSUdGdVpGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QnhkV1Z5ZVdsdVp5QjBhR0YwSUdadmNpQmhJR2h2YzNSdVlXMWxMbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQm9iM04wYm1GdFpTQTlJSFJvYVhNdWFHOXpkRzVoYldVZ1B5QjBhR2x6TG1odmMzUnVZVzFsSURvZ1puVnVZM1JwYjI0Z0tHRXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2JDQTlJR1J2WTNWdFpXNTBMbU55WldGMFpVVnNaVzFsYm5Rb1hDSmhYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUd3dWFISmxaaUE5SUdFdWFISmxaanRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdiQzVvYjNOMGJtRnRaVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU2gwYUdsektUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQnBaaUFvYUc5emRHNWhiV1VnUFQwZ2QybHVaRzkzTG14dlkyRjBhVzl1TG1odmMzUnVZVzFsSUNZbVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ1lYQndMbXh2YjJ0MWNGSnZkWFJsS0NkblpYUW5MQ0JtZFd4c1gzQmhkR2dwSUNZbVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ1UyRnRiWGt1ZEdGeVoyVjBTWE5VYUdselYybHVaRzkzS0dVc0lDZGhKeWtwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWlM1d2NtVjJaVzUwUkdWbVlYVnNkQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J3Y205NGVTNXpaWFJNYjJOaGRHbHZiaWhtZFd4c1gzQmhkR2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hISmNiaUFnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnYVdZZ0tDRnNjQzVmWW1sdVpHbHVaM01wSUh0Y2NseHVJQ0FnSUNBZ0lDQnNjQzVmWW1sdVpHbHVaM01nUFNBd08xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJR3h3TGw5aWFXNWthVzVuY3lzck8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCMWJtSnBibVFnZEdobElIQnliM2g1SUdWMlpXNTBjeUJtY205dElIUm9aU0JqZFhKeVpXNTBJR0Z3Y0Z4eVhHNGdJQ0FnZFc1aWFXNWtPaUJtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ0pDaDNhVzVrYjNjcExuVnVZbWx1WkNnbmFHRnphR05vWVc1blpTNG5JQ3NnZEdocGN5NWhjSEF1WlhabGJuUk9ZVzFsYzNCaFkyVW9LU2s3WEhKY2JpQWdJQ0FnSUNRb2QybHVaRzkzS1M1MWJtSnBibVFvSjNCdmNITjBZWFJsTGljZ0t5QjBhR2x6TG1Gd2NDNWxkbVZ1ZEU1aGJXVnpjR0ZqWlNncEtUdGNjbHh1SUNBZ0lDQWdKQ2hrYjJOMWJXVnVkQ2t1ZFc1a1pXeGxaMkYwWlNnbllTY3NJQ2RqYkdsamF5NW9hWE4wYjNKNUxTY2dLeUIwYUdsekxtRndjQzVsZG1WdWRFNWhiV1Z6Y0dGalpTZ3BLVHRjY2x4dUlDQWdJQ0FnVTJGdGJYa3VSR1ZtWVhWc2RFeHZZMkYwYVc5dVVISnZlSGt1WDJKcGJtUnBibWR6TFMwN1hISmNiaUFnSUNBZ0lHbG1JQ2hUWVcxdGVTNUVaV1poZFd4MFRHOWpZWFJwYjI1UWNtOTRlUzVmWW1sdVpHbHVaM01nUEQwZ01Da2dlMXh5WEc0Z0lDQWdJQ0FnSUhkcGJtUnZkeTVqYkdWaGNrbHVkR1Z5ZG1Gc0tGTmhiVzE1TGtSbFptRjFiSFJNYjJOaGRHbHZibEJ5YjNoNUxsOXBiblJsY25aaGJDazdYSEpjYmlBZ0lDQWdJQ0FnVTJGdGJYa3VSR1ZtWVhWc2RFeHZZMkYwYVc5dVVISnZlSGt1WDJsdWRHVnlkbUZzSUQwZ2JuVnNiRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJuWlhRZ2RHaGxJR04xY25KbGJuUWdiRzlqWVhScGIyNGdabkp2YlNCMGFHVWdhR0Z6YUM1Y2NseHVJQ0FnSUdkbGRFeHZZMkYwYVc5dU9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJRk5oYlcxNUxrUmxabUYxYkhSTWIyTmhkR2x2YmxCeWIzaDVMbVoxYkd4UVlYUm9LSGRwYm1SdmR5NXNiMk5oZEdsdmJpazdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklITmxkQ0IwYUdVZ1kzVnljbVZ1ZENCc2IyTmhkR2x2YmlCMGJ5QmdibVYzWDJ4dlkyRjBhVzl1WUZ4eVhHNGdJQ0FnYzJWMFRHOWpZWFJwYjI0NklHWjFibU4wYVc5dUtHNWxkMTlzYjJOaGRHbHZiaWtnZTF4eVhHNGdJQ0FnSUNCcFppQW9MMTRvVzE0alhGd3ZYWHdrS1M4dWRHVnpkQ2h1WlhkZmJHOWpZWFJwYjI0cEtTQjdJQzh2SUc1dmJpMXdjbVZtYVhobFpDQjFjbXhjY2x4dUlDQWdJQ0FnSUNCcFppQW9YMmhoYzE5b2FYTjBiM0o1SUNZbUlDRjBhR2x6TG1Gd2NDNWthWE5oWW14bFgzQjFjMmhmYzNSaGRHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHNWxkMTlzYjJOaGRHbHZiaUE5SUNjdkp5QXJJRzVsZDE5c2IyTmhkR2x2Ymp0Y2NseHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnYm1WM1gyeHZZMkYwYVc5dUlEMGdKeU1oTHljZ0t5QnVaWGRmYkc5allYUnBiMjQ3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJR2xtSUNodVpYZGZiRzlqWVhScGIyNGdJVDBnZEdocGN5NW5aWFJNYjJOaGRHbHZiaWdwS1NCN1hISmNiaUFnSUNBZ0lDQWdMeThnU0ZSTlREVWdTR2x6ZEc5eWVTQmxlR2x6ZEhNZ1lXNWtJRzVsZDE5c2IyTmhkR2x2YmlCcGN5QmhJR1oxYkd3Z2NHRjBhRnh5WEc0Z0lDQWdJQ0FnSUdsbUlDaGZhR0Z6WDJocGMzUnZjbmtnSmlZZ0lYUm9hWE11WVhCd0xtUnBjMkZpYkdWZmNIVnphRjl6ZEdGMFpTQW1KaUF2WGx4Y0x5OHVkR1Z6ZENodVpYZGZiRzlqWVhScGIyNHBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQm9hWE4wYjNKNUxuQjFjMmhUZEdGMFpTaDdJSEJoZEdnNklHNWxkMTlzYjJOaGRHbHZiaUI5TENCM2FXNWtiM2N1ZEdsMGJHVXNJRzVsZDE5c2IyTmhkR2x2YmlrN1hISmNiaUFnSUNBZ0lDQWdJQ0IwYUdsekxtRndjQzUwY21sbloyVnlLQ2RzYjJOaGRHbHZiaTFqYUdGdVoyVmtKeWs3WEhKY2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQW9kMmx1Wkc5M0xteHZZMkYwYVc5dUlEMGdibVYzWDJ4dlkyRjBhVzl1S1R0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ1gzTjBZWEowVUc5c2JHbHVaem9nWm5WdVkzUnBiMjRvWlhabGNua3BJSHRjY2x4dUlDQWdJQ0FnTHk4Z2MyVjBJSFZ3SUdsdWRHVnlkbUZzWEhKY2JpQWdJQ0FnSUhaaGNpQndjbTk0ZVNBOUlIUm9hWE03WEhKY2JpQWdJQ0FnSUdsbUlDZ2hVMkZ0YlhrdVJHVm1ZWFZzZEV4dlkyRjBhVzl1VUhKdmVIa3VYMmx1ZEdWeWRtRnNLU0I3WEhKY2JpQWdJQ0FnSUNBZ2FXWWdLQ0ZsZG1WeWVTa2dleUJsZG1WeWVTQTlJREV3T3lCOVhISmNiaUFnSUNBZ0lDQWdkbUZ5SUdoaGMyaERhR1ZqYXlBOUlHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2RtRnlJR04xY25KbGJuUmZiRzlqWVhScGIyNGdQU0J3Y205NGVTNW5aWFJNYjJOaGRHbHZiaWdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJUWVcxdGVTNUVaV1poZFd4MFRHOWpZWFJwYjI1UWNtOTRlUzVmYkdGemRGOXNiMk5oZEdsdmJpQTlQU0FuZFc1a1pXWnBibVZrSnlCOGZGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCamRYSnlaVzUwWDJ4dlkyRjBhVzl1SUNFOUlGTmhiVzE1TGtSbFptRjFiSFJNYjJOaGRHbHZibEJ5YjNoNUxsOXNZWE4wWDJ4dlkyRjBhVzl1S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhkcGJtUnZkeTV6WlhSVWFXMWxiM1YwS0daMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDUW9kMmx1Wkc5M0tTNTBjbWxuWjJWeUtDZG9ZWE5vWTJoaGJtZGxKeXdnVzNSeWRXVmRLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU3dnTUNrN1hISmNiaUFnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQlRZVzF0ZVM1RVpXWmhkV3gwVEc5allYUnBiMjVRY205NGVTNWZiR0Z6ZEY5c2IyTmhkR2x2YmlBOUlHTjFjbkpsYm5SZmJHOWpZWFJwYjI0N1hISmNiaUFnSUNBZ0lDQWdmVHRjY2x4dUlDQWdJQ0FnSUNCb1lYTm9RMmhsWTJzb0tUdGNjbHh1SUNBZ0lDQWdJQ0JUWVcxdGVTNUVaV1poZFd4MFRHOWpZWFJwYjI1UWNtOTRlUzVmYVc1MFpYSjJZV3dnUFNCM2FXNWtiM2N1YzJWMFNXNTBaWEoyWVd3b2FHRnphRU5vWldOckxDQmxkbVZ5ZVNrN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOUtUdGNjbHh1WEhKY2JseHlYRzRnSUM4dklGTmhiVzE1TGtGd2NHeHBZMkYwYVc5dUlHbHpJSFJvWlNCQ1lYTmxJSEJ5YjNSdmRIbHdaU0JtYjNJZ1pHVm1hVzVwYm1jZ0oyRndjR3hwWTJGMGFXOXVjeWN1WEhKY2JpQWdMeThnUVc0Z0oyRndjR3hwWTJGMGFXOXVKeUJwY3lCaElHTnZiR3hsWTNScGIyNGdiMllnSjNKdmRYUmxjeWNnWVc1a0lHSnZkVzVrSUdWMlpXNTBjeUIwYUdGMElHbHpYSEpjYmlBZ0x5OGdZWFIwWVdOb1pXUWdkRzhnWVc0Z1pXeGxiV1Z1ZENCM2FHVnVJR0J5ZFc0b0tXQWdhWE1nWTJGc2JHVmtMbHh5WEc0Z0lDOHZJRlJvWlNCdmJteDVJR0Z5WjNWdFpXNTBJR0Z1SUNkaGNIQmZablZ1WTNScGIyNG5JR2x6SUdWMllXeDFZWFJsWkNCM2FYUm9hVzRnZEdobElHTnZiblJsZUhRZ2IyWWdkR2hsSUdGd2NHeHBZMkYwYVc5dUxseHlYRzRnSUZOaGJXMTVMa0Z3Y0d4cFkyRjBhVzl1SUQwZ1puVnVZM1JwYjI0b1lYQndYMloxYm1OMGFXOXVLU0I3WEhKY2JpQWdJQ0IyWVhJZ1lYQndJRDBnZEdocGN6dGNjbHh1SUNBZ0lIUm9hWE11Y205MWRHVnpJQ0FnSUNBZ0lDQWdJQ0FnUFNCN2ZUdGNjbHh1SUNBZ0lIUm9hWE11YkdsemRHVnVaWEp6SUNBZ0lDQWdJQ0FnUFNCdVpYY2dVMkZ0YlhrdVQySnFaV04wS0h0OUtUdGNjbHh1SUNBZ0lIUm9hWE11WVhKdmRXNWtjeUFnSUNBZ0lDQWdJQ0FnUFNCYlhUdGNjbHh1SUNBZ0lIUm9hWE11WW1WbWIzSmxjeUFnSUNBZ0lDQWdJQ0FnUFNCYlhUdGNjbHh1SUNBZ0lDOHZJR2RsYm1WeVlYUmxJR0VnZFc1cGNYVmxJRzVoYldWemNHRmpaVnh5WEc0Z0lDQWdkR2hwY3k1dVlXMWxjM0JoWTJVZ0lDQWdJQ0FnSUNBOUlDaHVaWGNnUkdGMFpTZ3BLUzVuWlhSVWFXMWxLQ2tnS3lBbkxTY2dLeUJ3WVhKelpVbHVkQ2hOWVhSb0xuSmhibVJ2YlNncElDb2dNVEF3TUN3Z01UQXBPMXh5WEc0Z0lDQWdkR2hwY3k1amIyNTBaWGgwWDNCeWIzUnZkSGx3WlNBOUlHWjFibU4wYVc5dUtDa2dleUJUWVcxdGVTNUZkbVZ1ZEVOdmJuUmxlSFF1WVhCd2JIa29kR2hwY3l3Z1lYSm5kVzFsYm5SektUc2dmVHRjY2x4dUlDQWdJSFJvYVhNdVkyOXVkR1Y0ZEY5d2NtOTBiM1I1Y0dVdWNISnZkRzkwZVhCbElEMGdibVYzSUZOaGJXMTVMa1YyWlc1MFEyOXVkR1Y0ZENncE8xeHlYRzVjY2x4dUlDQWdJR2xtSUNoZmFYTkdkVzVqZEdsdmJpaGhjSEJmWm5WdVkzUnBiMjRwS1NCN1hISmNiaUFnSUNBZ0lHRndjRjltZFc1amRHbHZiaTVoY0hCc2VTaDBhR2x6TENCYmRHaHBjMTBwTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJQ0FnTHk4Z2MyVjBJSFJvWlNCc2IyTmhkR2x2YmlCd2NtOTRlU0JwWmlCdWIzUWdaR1ZtYVc1bFpDQjBieUIwYUdVZ1pHVm1ZWFZzZENBb1JHVm1ZWFZzZEV4dlkyRjBhVzl1VUhKdmVIa3BYSEpjYmlBZ0lDQnBaaUFvSVhSb2FYTXVYMnh2WTJGMGFXOXVYM0J5YjNoNUtTQjdYSEpjYmlBZ0lDQWdJSFJvYVhNdWMyVjBURzlqWVhScGIyNVFjbTk0ZVNodVpYY2dVMkZ0YlhrdVJHVm1ZWFZzZEV4dlkyRjBhVzl1VUhKdmVIa29kR2hwY3l3Z2RHaHBjeTV5ZFc1ZmFXNTBaWEoyWVd4ZlpYWmxjbmtwS1R0Y2NseHVJQ0FnSUgxY2NseHVJQ0FnSUdsbUlDaDBhR2x6TG1SbFluVm5LU0I3WEhKY2JpQWdJQ0FnSUhSb2FYTXVZbWx1WkZSdlFXeHNSWFpsYm5SektHWjFibU4wYVc5dUtHVXNJR1JoZEdFcElIdGNjbHh1SUNBZ0lDQWdJQ0JoY0hBdWJHOW5LR0Z3Y0M1MGIxTjBjbWx1WnlncExDQmxMbU5zWldGdVpXUmZkSGx3WlN3Z1pHRjBZU0I4ZkNCN2ZTazdYSEpjYmlBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDA3WEhKY2JseHlYRzRnSUZOaGJXMTVMa0Z3Y0d4cFkyRjBhVzl1TG5CeWIzUnZkSGx3WlNBOUlDUXVaWGgwWlc1a0tIdDlMQ0JUWVcxdGVTNVBZbXBsWTNRdWNISnZkRzkwZVhCbExDQjdYSEpjYmx4eVhHNGdJQ0FnTHk4Z2RHaGxJR1p2ZFhJZ2NtOTFkR1VnZG1WeVluTmNjbHh1SUNBZ0lGSlBWVlJGWDFaRlVrSlRPaUJiSjJkbGRDY3NKM0J2YzNRbkxDZHdkWFFuTENka1pXeGxkR1VuWFN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJCYmlCaGNuSmhlU0J2WmlCMGFHVWdaR1ZtWVhWc2RDQmxkbVZ1ZEhNZ2RISnBaMmRsY21Wa0lHSjVJSFJvWlZ4eVhHNGdJQ0FnTHk4Z1lYQndiR2xqWVhScGIyNGdaSFZ5YVc1bklHbDBjeUJzYVdabFkzbGpiR1ZjY2x4dUlDQWdJRUZRVUY5RlZrVk9WRk02SUZzbmNuVnVKeXdnSjNWdWJHOWhaQ2NzSUNkc2IyOXJkWEF0Y205MWRHVW5MQ0FuY25WdUxYSnZkWFJsSnl3Z0ozSnZkWFJsTFdadmRXNWtKeXdnSjJWMlpXNTBMV052Ym5SbGVIUXRZbVZtYjNKbEp5d2dKMlYyWlc1MExXTnZiblJsZUhRdFlXWjBaWEluTENBblkyaGhibWRsWkNjc0lDZGxjbkp2Y2ljc0lDZGphR1ZqYXkxbWIzSnRMWE4xWW0xcGMzTnBiMjRuTENBbmNtVmthWEpsWTNRbkxDQW5iRzlqWVhScGIyNHRZMmhoYm1kbFpDZGRMRnh5WEc1Y2NseHVJQ0FnSUY5c1lYTjBYM0p2ZFhSbE9pQnVkV3hzTEZ4eVhHNGdJQ0FnWDJ4dlkyRjBhVzl1WDNCeWIzaDVPaUJ1ZFd4c0xGeHlYRzRnSUNBZ1gzSjFibTVwYm1jNklHWmhiSE5sTEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRVJsWm1sdVpYTWdkMmhoZENCbGJHVnRaVzUwSUhSb1pTQmhjSEJzYVdOaGRHbHZiaUJwY3lCaWIzVnVaQ0IwYnk0Z1VISnZkbWxrWlNCaElITmxiR1ZqZEc5eVhISmNiaUFnSUNBdkx5QW9jR0Z5YzJWaFlteGxJR0o1SUdCcVVYVmxjbmtvS1dBcElHRnVaQ0IwYUdseklIZHBiR3dnWW1VZ2RYTmxaQ0JpZVNCZ0pHVnNaVzFsYm5Rb0tXQmNjbHh1SUNBZ0lHVnNaVzFsYm5SZmMyVnNaV04wYjNJNklDZGliMlI1Snl4Y2NseHVYSEpjYmlBZ0lDQXZMeUJYYUdWdUlITmxkQ0IwYnlCMGNuVmxMQ0JzYjJkeklHRnNiQ0J2WmlCMGFHVWdaR1ZtWVhWc2RDQmxkbVZ1ZEhNZ2RYTnBibWNnWUd4dlp5Z3BZRnh5WEc0Z0lDQWdaR1ZpZFdjNklHWmhiSE5sTEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRmRvWlc0Z2MyVjBJSFJ2SUhSeWRXVXNJR0Z1WkNCMGFHVWdaWEp5YjNJb0tTQm9ZVzVrYkdWeUlHbHpJRzV2ZENCdmRtVnljbWxrWkdWdUxDQjNhV3hzSUdGamRIVmhiR3g1WEhKY2JpQWdJQ0F2THlCeVlXbHpaU0JLVXlCbGNuSnZjbk1nYVc0Z2NtOTFkR1Z6SUNnMU1EQXBJR0Z1WkNCM2FHVnVJSEp2ZFhSbGN5QmpZVzRuZENCaVpTQm1iM1Z1WkNBb05EQTBLVnh5WEc0Z0lDQWdjbUZwYzJWZlpYSnliM0p6T2lCbVlXeHpaU3hjY2x4dVhISmNiaUFnSUNBdkx5QlVhR1VnZEdsdFpTQnBiaUJ0YVd4c2FYTmxZMjl1WkhNZ2RHaGhkQ0IwYUdVZ1ZWSk1JR2x6SUhGMVpYSnBaV1FnWm05eUlHTm9ZVzVuWlhOY2NseHVJQ0FnSUhKMWJsOXBiblJsY25aaGJGOWxkbVZ5ZVRvZ05UQXNYSEpjYmx4eVhHNGdJQ0FnTHk4Z2FXWWdkWE5wYm1jZ2RHaGxJR0JFWldaaGRXeDBURzlqWVhScGIyNVFjbTk0ZVdBZ2MyVjBkR2x1WnlCMGFHbHpJSFJ2SUhSeWRXVWdkMmxzYkNCbWIzSmpaU0IwYUdVZ1lYQndJSFJ2SUhWelpWeHlYRzRnSUNBZ0x5OGdkSEpoWkdsMGFXOXVZV3dnYUdGemFDQmlZWE5sWkNCeWIzVjBhVzVuSUdGeklHOXdjRzl6WldRZ2RHOGdkR2hsSUc1bGR5QklWRTFNTlNCUWRYTm9VM1JoZEdVZ2MzVndjRzl5ZEZ4eVhHNGdJQ0FnWkdsellXSnNaVjl3ZFhOb1gzTjBZWFJsT2lCbVlXeHpaU3hjY2x4dVhISmNiaUFnSUNBdkx5QlVhR1VnWkdWbVlYVnNkQ0IwWlcxd2JHRjBaU0JsYm1kcGJtVWdkRzhnZFhObElIZG9aVzRnZFhOcGJtY2dZSEJoY25ScFlXd29LV0FnYVc0Z1lXNWNjbHh1SUNBZ0lDOHZJR0JGZG1WdWRFTnZiblJsZUhSZ0xpQmdkR1Z0Y0d4aGRHVmZaVzVuYVc1bFlDQmpZVzRnWldsMGFHVnlJR0psSUdFZ2MzUnlhVzVuSUhSb1lYUmNjbHh1SUNBZ0lDOHZJR052Y25KbGMzQnZibVJ6SUhSdklIUm9aU0J1WVcxbElHOW1JR0VnYldWMGFHOWtMMmhsYkhCbGNpQnZiaUJGZG1WdWRFTnZiblJsZUhRZ2IzSWdhWFFnWTJGdUlHSmxJR0VnWm5WdVkzUnBiMjVjY2x4dUlDQWdJQzh2SUhSb1lYUWdkR0ZyWlhNZ2RIZHZJR0Z5WjNWdFpXNTBjeXdnZEdobElHTnZiblJsYm5RZ2IyWWdkR2hsSUhWdWNtVnVaR1Z5WldRZ2NHRnlkR2xoYkNCaGJtUWdZVzRnYjNCMGFXOXVZV3hjY2x4dUlDQWdJQzh2SUVwVElHOWlhbVZqZENCMGFHRjBJR052Ym5SaGFXNXpJR2x1ZEdWeWNHOXNZWFJwYjI0Z1pHRjBZUzRnVkdWdGNHeGhkR1VnWlc1bmFXNWxJR2x6SUc5dWJIa2dZMkZzYkdWa0wzSmxabVZ5Y21Wa1hISmNiaUFnSUNBdkx5QjBieUJwWmlCMGFHVWdaWGgwWlc1emFXOXVJRzltSUhSb1pTQndZWEowYVdGc0lHbHpJRzUxYkd3Z2IzSWdkVzVyYm05M2JpNGdVMlZsSUdCd1lYSjBhV0ZzS0NsZ1hISmNiaUFnSUNBdkx5Qm1iM0lnYlc5eVpTQnBibVp2Y20xaGRHbHZibHh5WEc0Z0lDQWdkR1Z0Y0d4aGRHVmZaVzVuYVc1bE9pQnVkV3hzTEZ4eVhHNWNjbHh1SUNBZ0lDOHZJQzh2UFQ0Z1UyRnRiWGt1UVhCd2JHbGpZWFJwYjI0NklHSnZaSGxjY2x4dUlDQWdJSFJ2VTNSeWFXNW5PaUJtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUNkVFlXMXRlUzVCY0hCc2FXTmhkR2x2YmpvbklDc2dkR2hwY3k1bGJHVnRaVzUwWDNObGJHVmpkRzl5TzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJ5WlhSMWNtNXpJR0VnYWxGMVpYSjVJRzlpYW1WamRDQnZaaUIwYUdVZ1FYQndiR2xqWVhScGIyNXpJR0p2ZFc1a0lHVnNaVzFsYm5RdVhISmNiaUFnSUNBa1pXeGxiV1Z1ZERvZ1puVnVZM1JwYjI0b2MyVnNaV04wYjNJcElIdGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlITmxiR1ZqZEc5eUlEOGdKQ2gwYUdsekxtVnNaVzFsYm5SZmMyVnNaV04wYjNJcExtWnBibVFvYzJWc1pXTjBiM0lwSURvZ0pDaDBhR2x6TG1Wc1pXMWxiblJmYzJWc1pXTjBiM0lwTzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJnZFhObEtDbGdJR2x6SUhSb1pTQmxiblJ5ZVNCd2IybHVkQ0JtYjNJZ2FXNWpiSFZrYVc1bklGTmhiVzE1SUhCc2RXZHBibk11WEhKY2JpQWdJQ0F2THlCVWFHVWdabWx5YzNRZ1lYSm5kVzFsYm5RZ2RHOGdkWE5sSUhOb2IzVnNaQ0JpWlNCaElHWjFibU4wYVc5dUtDa2dkR2hoZENCcGN5QmxkbUZzZFdGMFpXUmNjbHh1SUNBZ0lDOHZJR2x1SUhSb1pTQmpiMjUwWlhoMElHOW1JSFJvWlNCamRYSnlaVzUwSUdGd2NHeHBZMkYwYVc5dUxDQnFkWE4wSUd4cGEyVWdkR2hsSUdCaGNIQmZablZ1WTNScGIyNWdYSEpjYmlBZ0lDQXZMeUJoY21kMWJXVnVkQ0IwYnlCMGFHVWdZRk5oYlcxNUxrRndjR3hwWTJGMGFXOXVZQ0JqYjI1emRISjFZM1J2Y2k1Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QkJibmtnWVdSa2FYUnBiMjVoYkNCaGNtZDFiV1Z1ZEhNZ1lYSmxJSEJoYzNObFpDQjBieUIwYUdVZ1lYQndJR1oxYm1OMGFXOXVJSE5sY1hWbGJuUnBZV3hzZVM1Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QkdiM0lnYlhWamFDQnRiM0psSUdSbGRHRnBiQ0JoWW05MWRDQndiSFZuYVc1ekxDQmphR1ZqYXlCdmRYUTZYSEpjYmlBZ0lDQXZMeUJiYUhSMGNEb3ZMM05oYlcxNWFuTXViM0puTDJSdlkzTXZjR3gxWjJsdWMxMG9hSFIwY0RvdkwzTmhiVzE1YW5NdWIzSm5MMlJ2WTNNdmNHeDFaMmx1Y3lsY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWpJeU1nUlhoaGJYQnNaVnh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNBZ0lDQWdkbUZ5SUUxNVVHeDFaMmx1SUQwZ1puVnVZM1JwYjI0b1lYQndMQ0J3Y21Wd1pXNWtLU0I3WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUhSb2FYTXVhR1ZzY0dWeWN5aDdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0J0ZVdobGJIQmxjam9nWm5WdVkzUnBiMjRvZEdWNGRDa2dlMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNCaGJHVnlkQ2h3Y21Wd1pXNWtJQ3NnWENJZ1hDSWdLeUIwWlhoMEtUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUgwN1hISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNCMllYSWdZWEJ3SUQwZ0pDNXpZVzF0ZVNobWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdkR2hwY3k1MWMyVW9UWGxRYkhWbmFXNHNJQ2RVYUdseklHbHpJRzE1SUhCc2RXZHBiaWNwTzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNCMGFHbHpMbWRsZENnbkl5OG5MQ0JtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lIUm9hWE11Ylhsb1pXeHdaWElvSjJGdVpDQmtiMjUwSUhsdmRTQm1iM0puWlhRZ2FYUWhKeWs3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNBdkx6MCtJRUZzWlhKMGN6b2dWR2hwY3lCcGN5QnRlU0J3YkhWbmFXNGdZVzVrSUdSdmJuUWdlVzkxSUdadmNtZGxkQ0JwZENGY2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUVsbUlIQnNkV2RwYmlCcGN5QndZWE56WldRZ1lYTWdZU0J6ZEhKcGJtY2dhWFFnWVhOemRXMWxjeUI1YjNWeUlHRnlaU0IwY25scGJtY2dkRzhnYkc5aFpGeHlYRzRnSUNBZ0x5OGdVMkZ0YlhrdVhDSlFiSFZuYVc1Y0lpNGdWR2hwY3lCcGN5QjBhR1VnY0hKbFptVnljbVZrSUhkaGVTQnZaaUJzYjJGa2FXNW5JR052Y21VZ1UyRnRiWGtnY0d4MVoybHVjMXh5WEc0Z0lDQWdMeThnWVhNZ2FYUWdZV3hzYjNkeklHWnZjaUJpWlhSMFpYSWdaWEp5YjNJdGJXVnpjMkZuYVc1bkxseHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ01qSXlCRmVHRnRjR3hsWEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FrTG5OaGJXMTVLR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUhSb2FYTXVkWE5sS0NkTmRYTjBZV05vWlNjcE95QXZMejArSUZOaGJXMTVMazExYzNSaFkyaGxYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdkR2hwY3k1MWMyVW9KMU4wYjNKaFoyVW5LVHNnTHk4OVBpQlRZVzF0ZVM1VGRHOXlZV2RsWEhKY2JpQWdJQ0F2THlBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUhWelpUb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUM4dklHWnNZWFIwWlc0Z2RHaGxJR0Z5WjNWdFpXNTBjMXh5WEc0Z0lDQWdJQ0IyWVhJZ1lYSm5jeUE5SUY5dFlXdGxRWEp5WVhrb1lYSm5kVzFsYm5SektTeGNjbHh1SUNBZ0lDQWdJQ0FnSUhCc2RXZHBiaUE5SUdGeVozTXVjMmhwWm5Rb0tTeGNjbHh1SUNBZ0lDQWdJQ0FnSUhCc2RXZHBibDl1WVcxbElEMGdjR3gxWjJsdUlIeDhJQ2NuTzF4eVhHNGdJQ0FnSUNCMGNua2dlMXh5WEc0Z0lDQWdJQ0FnSUdGeVozTXVkVzV6YUdsbWRDaDBhR2x6S1R0Y2NseHVJQ0FnSUNBZ0lDQnBaaUFvZEhsd1pXOW1JSEJzZFdkcGJpQTlQU0FuYzNSeWFXNW5KeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdjR3gxWjJsdVgyNWhiV1VnUFNBblUyRnRiWGt1SnlBcklIQnNkV2RwYmp0Y2NseHVJQ0FnSUNBZ0lDQWdJSEJzZFdkcGJpQTlJRk5oYlcxNVczQnNkV2RwYmwwN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUhCc2RXZHBiaTVoY0hCc2VTaDBhR2x6TENCaGNtZHpLVHRjY2x4dUlDQWdJQ0FnZlNCallYUmphQ2hsS1NCN1hISmNiaUFnSUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJ3YkhWbmFXNGdQVDA5SUNkMWJtUmxabWx1WldRbktTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCMGFHbHpMbVZ5Y205eUtGd2lVR3gxWjJsdUlFVnljbTl5T2lCallXeHNaV1FnZFhObEtDa2dZblYwSUhCc2RXZHBiaUFvWENJZ0t5QndiSFZuYVc1ZmJtRnRaUzUwYjFOMGNtbHVaeWdwSUNzZ1hDSXBJR2x6SUc1dmRDQmtaV1pwYm1Wa1hDSXNJR1VwTzF4eVhHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9JVjlwYzBaMWJtTjBhVzl1S0hCc2RXZHBiaWtwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpYSnliM0lvWENKUWJIVm5hVzRnUlhKeWIzSTZJR05oYkd4bFpDQjFjMlVvS1NCaWRYUWdKMXdpSUNzZ2NHeDFaMmx1WDI1aGJXVXVkRzlUZEhKcGJtY29LU0FySUZ3aUp5QnBjeUJ1YjNRZ1lTQm1kVzVqZEdsdmJsd2lMQ0JsS1R0Y2NseHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEdocGN5NWxjbkp2Y2loY0lsQnNkV2RwYmlCRmNuSnZjbHdpTENCbEtUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklGTmxkSE1nZEdobElHeHZZMkYwYVc5dUlIQnliM2g1SUdadmNpQjBhR1VnWTNWeWNtVnVkQ0JoY0hBdUlFSjVJR1JsWm1GMWJIUWdkR2hwY3lCcGN5QnpaWFFnZEc5Y2NseHVJQ0FnSUM4dklHRWdibVYzSUdCVFlXMXRlUzVFWldaaGRXeDBURzlqWVhScGIyNVFjbTk0ZVdBZ2IyNGdhVzVwZEdsaGJHbDZZWFJwYjI0dUlFaHZkMlYyWlhJc0lIbHZkU0JqWVc0Z2MyVjBYSEpjYmlBZ0lDQXZMeUIwYUdVZ2JHOWpZWFJwYjI1ZmNISnZlSGtnYVc1emFXUmxJSGx2ZFNkeVpTQmhjSEFnWm5WdVkzUnBiMjRnZEc4Z1oybDJaU0I1YjNWeUlHRndjQ0JoSUdOMWMzUnZiVnh5WEc0Z0lDQWdMeThnYkc5allYUnBiMjRnYldWamFHRnVhWE50TGlCVFpXVWdZRk5oYlcxNUxrUmxabUYxYkhSTWIyTmhkR2x2YmxCeWIzaDVZQ0JoYm1RZ1lGTmhiVzE1TGtSaGRHRk1iMk5oZEdsdmJsQnliM2g1WUZ4eVhHNGdJQ0FnTHk4Z1ptOXlJR1Y0WVcxd2JHVnpMbHh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUdCelpYUk1iMk5oZEdsdmJsQnliM2g1S0NsZ0lIUmhhMlZ6SUdGdUlHbHVhWFJwWVd4cGVtVmtJR3h2WTJGMGFXOXVJSEJ5YjNoNUxseHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ01qSXlCRmVHRnRjR3hsWEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUM4dklIUnZJR0pwYm1RZ2RHOGdaR0YwWVNCcGJuTjBaV0ZrSUc5bUlIUm9aU0JrWldaaGRXeDBJR2hoYzJnN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ2RtRnlJR0Z3Y0NBOUlDUXVjMkZ0Ylhrb1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0IwYUdsekxuTmxkRXh2WTJGMGFXOXVVSEp2ZUhrb2JtVjNJRk5oYlcxNUxrUmhkR0ZNYjJOaGRHbHZibEJ5YjNoNUtIUm9hWE1wS1R0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQnpaWFJNYjJOaGRHbHZibEJ5YjNoNU9pQm1kVzVqZEdsdmJpaHVaWGRmY0hKdmVIa3BJSHRjY2x4dUlDQWdJQ0FnZG1GeUlHOXlhV2RwYm1Gc1gzQnliM2g1SUQwZ2RHaHBjeTVmYkc5allYUnBiMjVmY0hKdmVIazdYSEpjYmlBZ0lDQWdJSFJvYVhNdVgyeHZZMkYwYVc5dVgzQnliM2g1SUQwZ2JtVjNYM0J5YjNoNU8xeHlYRzRnSUNBZ0lDQnBaaUFvZEdocGN5NXBjMUoxYm01cGJtY29LU2tnZTF4eVhHNGdJQ0FnSUNBZ0lHbG1JQ2h2Y21sbmFXNWhiRjl3Y205NGVTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdhV1lnZEdobGNtVWdhWE1nWVd4eVpXRmtlU0JoSUd4dlkyRjBhVzl1SUhCeWIzaDVMQ0IxYm1KcGJtUWdhWFF1WEhKY2JpQWdJQ0FnSUNBZ0lDQnZjbWxuYVc1aGJGOXdjbTk0ZVM1MWJtSnBibVFvS1R0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NWZiRzlqWVhScGIyNWZjSEp2ZUhrdVltbHVaQ2dwTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUhCeWIzWnBaR1VnYkc5bktDa2diM1psY25KcFpHVWdabTl5SUdsdWMybGtaU0JoYmlCaGNIQWdkR2hoZENCcGJtTnNkV1JsY3lCMGFHVWdjbVZzWlhaaGJuUWdZWEJ3YkdsallYUnBiMjRnWld4bGJXVnVkRjl6Wld4bFkzUnZjbHh5WEc0Z0lDQWdiRzluT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdVMkZ0YlhrdWJHOW5MbUZ3Y0d4NUtGTmhiVzE1TENCQmNuSmhlUzV3Y205MGIzUjVjR1V1WTI5dVkyRjBMbUZ3Y0d4NUtGdDBhR2x6TG1Wc1pXMWxiblJmYzJWc1pXTjBiM0pkTEdGeVozVnRaVzUwY3lrcE8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JseHlYRzRnSUNBZ0x5OGdZSEp2ZFhSbEtDbGdJR2x6SUhSb1pTQnRZV2x1SUcxbGRHaHZaQ0JtYjNJZ1pHVm1hVzVwYm1jZ2NtOTFkR1Z6SUhkcGRHaHBiaUJoYmlCaGNIQnNhV05oZEdsdmJpNWNjbHh1SUNBZ0lDOHZJRVp2Y2lCbmNtVmhkQ0JrWlhSaGFXd2diMjRnY205MWRHVnpMQ0JqYUdWamF5QnZkWFE2WEhKY2JpQWdJQ0F2THlCYmFIUjBjRG92TDNOaGJXMTVhbk11YjNKbkwyUnZZM012Y205MWRHVnpYU2hvZEhSd09pOHZjMkZ0YlhscWN5NXZjbWN2Wkc5amN5OXliM1YwWlhNcFhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdWR2hwY3lCdFpYUm9iMlFnWVd4emJ5Qm9ZWE1nWVd4cFlYTmxjeUJtYjNJZ1pXRmphQ0J2WmlCMGFHVWdaR2xtWm1WeVpXNTBJSFpsY21KeklDaGxaeTRnWUdkbGRDZ3BZQ3dnWUhCdmMzUW9LV0FzSUdWMFl5NHBYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSXlNaklFRnlaM1Z0Wlc1MGMxeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ29nWUhabGNtSmdJRUVnVTNSeWFXNW5JR2x1SUhSb1pTQnpaWFFnYjJZZ1VrOVZWRVZmVmtWU1FsTWdiM0lnSjJGdWVTY3VJQ2RoYm5rbklIZHBiR3dnWVdSa0lISnZkWFJsY3lCbWIzSWdaV0ZqYUZ4eVhHNGdJQ0FnTHk4Z0lDQWdiMllnZEdobElGSlBWVlJGWDFaRlVrSlRMaUJKWmlCdmJteDVJSFIzYnlCaGNtZDFiV1Z1ZEhNZ1lYSmxJSEJoYzNObFpDeGNjbHh1SUNBZ0lDOHZJQ0FnSUhSb1pTQm1hWEp6ZENCaGNtZDFiV1Z1ZENCcGN5QjBhR1VnY0dGMGFDd2dkR2hsSUhObFkyOXVaQ0JwY3lCMGFHVWdZMkZzYkdKaFkyc2dZVzVrSUhSb1pTQjJaWEppWEhKY2JpQWdJQ0F2THlBZ0lDQnBjeUJoYzNOMWJXVmtJSFJ2SUdKbElDZGhibmtuTGx4eVhHNGdJQ0FnTHk4Z0tpQmdjR0YwYUdBZ1FTQlNaV2RsZUhBZ2IzSWdZU0JUZEhKcGJtY2djbVZ3Y21WelpXNTBhVzVuSUhSb1pTQndZWFJvSUhSdklHMWhkR05vSUhSdklHbHVkbTlyWlNCMGFHbHpJSFpsY21JdVhISmNiaUFnSUNBdkx5QXFJR0JqWVd4c1ltRmphMkFnUVNCR2RXNWpkR2x2YmlCMGFHRjBJR2x6SUdOaGJHeGxaQzlsZG1Gc2RXRjBaV1FnZDJobGJpQjBhR1VnY205MWRHVWdhWE1nY25WdUlITmxaVG9nWUhKMWJsSnZkWFJsS0NsZ0xseHlYRzRnSUNBZ0x5OGdJQ0FnU1hRZ2FYTWdZV3h6YnlCd2IzTnphV0pzWlNCMGJ5QndZWE56SUdFZ2MzUnlhVzVuSUdGeklIUm9aU0JqWVd4c1ltRmpheXdnZDJocFkyZ2dhWE1nYkc5dmEyVmtJSFZ3SUdGeklIUm9aU0J1WVcxbFhISmNiaUFnSUNBdkx5QWdJQ0J2WmlCaElHMWxkR2h2WkNCdmJpQjBhR1VnWVhCd2JHbGpZWFJwYjI0dVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ2NtOTFkR1U2SUdaMWJtTjBhVzl1S0habGNtSXNJSEJoZEdncElIdGNjbHh1SUNBZ0lDQWdkbUZ5SUdGd2NDQTlJSFJvYVhNc0lIQmhjbUZ0WDI1aGJXVnpJRDBnVzEwc0lHRmtaRjl5YjNWMFpTd2djR0YwYUY5dFlYUmphQ3dnWTJGc2JHSmhZMnNnUFNCQmNuSmhlUzV3Y205MGIzUjVjR1V1YzJ4cFkyVXVZMkZzYkNoaGNtZDFiV1Z1ZEhNc01pazdYSEpjYmx4eVhHNGdJQ0FnSUNBdkx5QnBaaUIwYUdVZ2JXVjBhRzlrSUhOcFoyNWhkSFZ5WlNCcGN5QnFkWE4wSUNod1lYUm9MQ0JqWVd4c1ltRmpheWxjY2x4dUlDQWdJQ0FnTHk4Z1lYTnpkVzFsSUhSb1pTQjJaWEppSUdseklDZGhibmtuWEhKY2JpQWdJQ0FnSUdsbUlDaGpZV3hzWW1GamF5NXNaVzVuZEdnZ1BUMDlJREFnSmlZZ1gybHpSblZ1WTNScGIyNG9jR0YwYUNrcElIdGNjbHh1SUNBZ0lDQWdJQ0JqWVd4c1ltRmpheUE5SUZ0d1lYUm9YVHRjY2x4dUlDQWdJQ0FnSUNCd1lYUm9JRDBnZG1WeVlqdGNjbHh1SUNBZ0lDQWdJQ0IyWlhKaUlEMGdKMkZ1ZVNjN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUhabGNtSWdQU0IyWlhKaUxuUnZURzkzWlhKRFlYTmxLQ2s3SUM4dklHVnVjM1Z5WlNCMlpYSmlJR2x6SUd4dmQyVnlJR05oYzJWY2NseHVYSEpjYmlBZ0lDQWdJQzh2SUdsbUlIQmhkR2dnYVhNZ1lTQnpkSEpwYm1jZ2RIVnliaUJwZENCcGJuUnZJR0VnY21WblpYaGNjbHh1SUNBZ0lDQWdhV1lnS0hCaGRHZ3VZMjl1YzNSeWRXTjBiM0lnUFQwZ1UzUnlhVzVuS1NCN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklFNWxaV1J6SUhSdklHSmxJR1Y0Y0d4cFkybDBiSGtnYzJWMElHSmxZMkYxYzJVZ1NVVWdkMmxzYkNCdFlXbHVkR0ZwYmlCMGFHVWdhVzVrWlhnZ2RXNXNaWE56SUU1VlRFd2dhWE1nY21WMGRYSnVaV1FzWEhKY2JpQWdJQ0FnSUNBZ0x5OGdkMmhwWTJnZ2JXVmhibk1nZEdoaGRDQjNhWFJvSUhSM2J5QmpiMjV6WldOMWRHbDJaU0J5YjNWMFpYTWdkR2hoZENCamIyNTBZV2x1SUhCaGNtRnRjeXdnZEdobElITmxZMjl1WkNCelpYUWdiMllnY0dGeVlXMXpJSGRwYkd3Z2JtOTBJR0psSUdadmRXNWtJR0Z1WkNCbGJtUWdkWEFnYVc0Z2MzQnNZWFFnYVc1emRHVmhaQ0J2WmlCd1lYSmhiWE5jY2x4dUlDQWdJQ0FnSUNBdkx5Qm9kSFJ3Y3pvdkwyUmxkbVZzYjNCbGNpNXRiM3BwYkd4aExtOXlaeTlsYmk5RGIzSmxYMHBoZG1GVFkzSnBjSFJmTVM0MVgxSmxabVZ5Wlc1alpTOUhiRzlpWVd4ZlQySnFaV04wY3k5U1pXZEZlSEF2YkdGemRFbHVaR1Y0WEhKY2JpQWdJQ0FnSUNBZ1VFRlVTRjlPUVUxRlgwMUJWRU5JUlZJdWJHRnpkRWx1WkdWNElEMGdNRHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnWm1sdVpDQjBhR1VnYm1GdFpYTmNjbHh1SUNBZ0lDQWdJQ0IzYUdsc1pTQW9LSEJoZEdoZmJXRjBZMmdnUFNCUVFWUklYMDVCVFVWZlRVRlVRMGhGVWk1bGVHVmpLSEJoZEdncEtTQWhQVDBnYm5Wc2JDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NHRnlZVzFmYm1GdFpYTXVjSFZ6YUNod1lYUm9YMjFoZEdOb1d6RmRLVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdMeThnY21Wd2JHRmpaU0IzYVhSb0lIUm9aU0J3WVhSb0lISmxjR3hoWTJWdFpXNTBYSEpjYmlBZ0lDQWdJQ0FnY0dGMGFDQTlJRzVsZHlCU1pXZEZlSEFvY0dGMGFDNXlaWEJzWVdObEtGQkJWRWhmVGtGTlJWOU5RVlJEU0VWU0xDQlFRVlJJWDFKRlVFeEJRMFZTS1NBcklGd2lKRndpS1R0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQXZMeUJzYjI5cmRYQWdZMkZzYkdKaFkydHpYSEpjYmlBZ0lDQWdJQ1F1WldGamFDaGpZV3hzWW1GamF5eG1kVzVqZEdsdmJpaHBMR05pS1h0Y2NseHVJQ0FnSUNBZ0lDQnBaaUFvZEhsd1pXOW1LR05pS1NBOVBUMGdKM04wY21sdVp5Y3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHTmhiR3hpWVdOclcybGRJRDBnWVhCd1cyTmlYVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMHBPMXh5WEc1Y2NseHVJQ0FnSUNBZ1lXUmtYM0p2ZFhSbElEMGdablZ1WTNScGIyNG9kMmwwYUY5MlpYSmlLU0I3WEhKY2JpQWdJQ0FnSUNBZ2RtRnlJSElnUFNCN2RtVnlZam9nZDJsMGFGOTJaWEppTENCd1lYUm9PaUJ3WVhSb0xDQmpZV3hzWW1GamF6b2dZMkZzYkdKaFkyc3NJSEJoY21GdFgyNWhiV1Z6T2lCd1lYSmhiVjl1WVcxbGMzMDdYSEpjYmlBZ0lDQWdJQ0FnTHk4Z1lXUmtJSEp2ZFhSbElIUnZJSEp2ZFhSbGN5QmhjbkpoZVZ4eVhHNGdJQ0FnSUNBZ0lHRndjQzV5YjNWMFpYTmJkMmwwYUY5MlpYSmlYU0E5SUdGd2NDNXliM1YwWlhOYmQybDBhRjkyWlhKaVhTQjhmQ0JiWFR0Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ3YkdGalpTQnliM1YwWlhNZ2FXNGdiM0prWlhJZ2IyWWdaR1ZtYVc1cGRHbHZibHh5WEc0Z0lDQWdJQ0FnSUdGd2NDNXliM1YwWlhOYmQybDBhRjkyWlhKaVhTNXdkWE5vS0hJcE8xeHlYRzRnSUNBZ0lDQjlPMXh5WEc1Y2NseHVJQ0FnSUNBZ2FXWWdLSFpsY21JZ1BUMDlJQ2RoYm5rbktTQjdYSEpjYmlBZ0lDQWdJQ0FnSkM1bFlXTm9LSFJvYVhNdVVrOVZWRVZmVmtWU1FsTXNJR1oxYm1OMGFXOXVLR2tzSUhZcElIc2dZV1JrWDNKdmRYUmxLSFlwT3lCOUtUdGNjbHh1SUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0JoWkdSZmNtOTFkR1VvZG1WeVlpazdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDOHZJSEpsZEhWeWJpQjBhR1VnWVhCd1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5QkJiR2xoY3lCbWIzSWdjbTkxZEdVb0oyZGxkQ2NzSUM0dUxpbGNjbHh1SUNBZ0lHZGxkRG9nWDNKdmRYUmxWM0poY0hCbGNpZ25aMlYwSnlrc1hISmNibHh5WEc0Z0lDQWdMeThnUVd4cFlYTWdabTl5SUhKdmRYUmxLQ2R3YjNOMEp5d2dMaTR1S1Z4eVhHNGdJQ0FnY0c5emREb2dYM0p2ZFhSbFYzSmhjSEJsY2lnbmNHOXpkQ2NwTEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRUZzYVdGeklHWnZjaUJ5YjNWMFpTZ25jSFYwSnl3Z0xpNHVLVnh5WEc0Z0lDQWdjSFYwT2lCZmNtOTFkR1ZYY21Gd2NHVnlLQ2R3ZFhRbktTeGNjbHh1WEhKY2JpQWdJQ0F2THlCQmJHbGhjeUJtYjNJZ2NtOTFkR1VvSjJSbGJHVjBaU2NzSUM0dUxpbGNjbHh1SUNBZ0lHUmxiRG9nWDNKdmRYUmxWM0poY0hCbGNpZ25aR1ZzWlhSbEp5a3NYSEpjYmx4eVhHNGdJQ0FnTHk4Z1FXeHBZWE1nWm05eUlISnZkWFJsS0NkaGJua25MQ0F1TGk0cFhISmNiaUFnSUNCaGJuazZJRjl5YjNWMFpWZHlZWEJ3WlhJb0oyRnVlU2NwTEZ4eVhHNWNjbHh1SUNBZ0lDOHZJR0J0WVhCU2IzVjBaWE5nSUhSaGEyVnpJR0Z1SUdGeWNtRjVJRzltSUdGeWNtRjVjeXdnWldGamFDQmhjbkpoZVNCaVpXbHVaeUJ3WVhOelpXUWdkRzhnY205MWRHVW9LVnh5WEc0Z0lDQWdMeThnWVhNZ1lYSm5kVzFsYm5SekxDQjBhR2x6SUdGc2JHOTNjeUJtYjNJZ2JXRnpjeUJrWldacGJtbDBhVzl1SUc5bUlISnZkWFJsY3k0Z1FXNXZkR2hsY2lCaVpXNWxabWwwSUdselhISmNiaUFnSUNBdkx5QjBhR2x6SUcxaGEyVnpJR2wwSUhCdmMzTnBZbXhsTDJWaGMybGxjaUIwYnlCc2IyRmtJSEp2ZFhSbGN5QjJhV0VnY21WdGIzUmxJRXBUVDA0dVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJeU1qSUVWNFlXMXdiR1ZjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJSFpoY2lCaGNIQWdQU0FrTG5OaGJXMTVLR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNCMGFHbHpMbTFoY0ZKdmRYUmxjeWhiWEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNBZ0lGc25aMlYwSnl3Z0p5TXZKeXdnWm5WdVkzUnBiMjRvS1NCN0lIUm9hWE11Ykc5bktDZHBibVJsZUNjcE95QjlYU3hjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdjM1J5YVc1bmN5QnBiaUJqWVd4c1ltRmphM01nWVhKbElHeHZiMnRsWkNCMWNDQmhjeUJ0WlhSb2IyUnpJRzl1SUhSb1pTQmhjSEJjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ1d5ZHdiM04wSnl3Z0p5TXZZM0psWVhSbEp5d2dKMkZrWkZWelpYSW5YU3hjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdUbThnZG1WeVlpQmhjM04xYldWeklDZGhibmtuSUdGeklIUm9aU0IyWlhKaVhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJRnN2Wkc5M2FHRjBaWFpsY2k4c0lHWjFibU4wYVc5dUtDa2dleUIwYUdsekxteHZaeWgwYUdsekxuWmxjbUlzSUhSb2FYTXVjR0YwYUNsOVhUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJRjBwTzF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNCdFlYQlNiM1YwWlhNNklHWjFibU4wYVc5dUtISnZkWFJsWDJGeWNtRjVLU0I3WEhKY2JpQWdJQ0FnSUhaaGNpQmhjSEFnUFNCMGFHbHpPMXh5WEc0Z0lDQWdJQ0FrTG1WaFkyZ29jbTkxZEdWZllYSnlZWGtzSUdaMWJtTjBhVzl1S0drc0lISnZkWFJsWDJGeVozTXBJSHRjY2x4dUlDQWdJQ0FnSUNCaGNIQXVjbTkxZEdVdVlYQndiSGtvWVhCd0xDQnliM1YwWlY5aGNtZHpLVHRjY2x4dUlDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5QkJJSFZ1YVhGMVpTQmxkbVZ1ZENCdVlXMWxjM0JoWTJVZ1pHVm1hVzVsWkNCd1pYSWdZWEJ3YkdsallYUnBiMjR1WEhKY2JpQWdJQ0F2THlCQmJHd2daWFpsYm5SeklHSnZkVzVrSUhkcGRHZ2dZR0pwYm1Rb0tXQWdZWEpsSUdGMWRHOXRZWFJwWTJGc2JIa2dZbTkxYm1RZ2QybDBhR2x1SUhSb2FYTWdjM0JoWTJVdVhISmNiaUFnSUNCbGRtVnVkRTVoYldWemNHRmpaVG9nWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCYkozTmhiVzE1TFdGd2NDY3NJSFJvYVhNdWJtRnRaWE53WVdObFhTNXFiMmx1S0NjdEp5azdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklGZHZjbXR6SUdwMWMzUWdiR2xyWlNCZ2FsRjFaWEo1TG1adUxtSnBibVFvS1dBZ2QybDBhQ0JoSUdOdmRYQnNaU0J1YjNSaFlteGxJR1JwWm1abGNtVnVZMlZ6TGx4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDb2dTWFFnWW1sdVpITWdZV3hzSUdWMlpXNTBjeUIwYnlCMGFHVWdZWEJ3YkdsallYUnBiMjRnWld4bGJXVnVkRnh5WEc0Z0lDQWdMeThnS2lCQmJHd2daWFpsYm5SeklHRnlaU0JpYjNWdVpDQjNhWFJvYVc0Z2RHaGxJR0JsZG1WdWRFNWhiV1Z6Y0dGalpTZ3BZRnh5WEc0Z0lDQWdMeThnS2lCRmRtVnVkSE1nWVhKbElHNXZkQ0JoWTNSMVlXeHNlU0JpYjNWdVpDQjFiblJwYkNCMGFHVWdZWEJ3YkdsallYUnBiMjRnYVhNZ2MzUmhjblJsWkNCM2FYUm9JR0J5ZFc0b0tXQmNjbHh1SUNBZ0lDOHZJQ29nWTJGc2JHSmhZMnR6SUdGeVpTQmxkbUZzZFdGMFpXUWdkMmwwYUdsdUlIUm9aU0JqYjI1MFpYaDBJRzltSUdFZ1UyRnRiWGt1UlhabGJuUkRiMjUwWlhoMFhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ1ltbHVaRG9nWm5WdVkzUnBiMjRvYm1GdFpTd2daR0YwWVN3Z1kyRnNiR0poWTJzcElIdGNjbHh1SUNBZ0lDQWdkbUZ5SUdGd2NDQTlJSFJvYVhNN1hISmNiaUFnSUNBZ0lDOHZJR0oxYVd4a0lIUm9aU0JqWVd4c1ltRmphMXh5WEc0Z0lDQWdJQ0F2THlCcFppQjBhR1VnWVhKcGRIa2dhWE1nTWl3Z1kyRnNiR0poWTJzZ2FYTWdkR2hsSUhObFkyOXVaQ0JoY21kMWJXVnVkRnh5WEc0Z0lDQWdJQ0JwWmlBb2RIbHdaVzltSUdOaGJHeGlZV05ySUQwOUlDZDFibVJsWm1sdVpXUW5LU0I3SUdOaGJHeGlZV05ySUQwZ1pHRjBZVHNnZlZ4eVhHNGdJQ0FnSUNCMllYSWdiR2x6ZEdWdVpYSmZZMkZzYkdKaFkyc2dQU0FnWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lDQWdMeThnY0hWc2JDQnZabVlnZEdobElHTnZiblJsZUhRZ1puSnZiU0IwYUdVZ1lYSm5kVzFsYm5SeklIUnZJSFJvWlNCallXeHNZbUZqYTF4eVhHNGdJQ0FnSUNBZ0lIWmhjaUJsTENCamIyNTBaWGgwTENCa1lYUmhPMXh5WEc0Z0lDQWdJQ0FnSUdVZ0lDQWdJQ0FnUFNCaGNtZDFiV1Z1ZEhOYk1GMDdYSEpjYmlBZ0lDQWdJQ0FnWkdGMFlTQWdJQ0E5SUdGeVozVnRaVzUwYzFzeFhUdGNjbHh1SUNBZ0lDQWdJQ0JwWmlBb1pHRjBZU0FtSmlCa1lYUmhMbU52Ym5SbGVIUXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHTnZiblJsZUhRZ1BTQmtZWFJoTG1OdmJuUmxlSFE3WEhKY2JpQWdJQ0FnSUNBZ0lDQmtaV3hsZEdVZ1pHRjBZUzVqYjI1MFpYaDBPMXh5WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQmpiMjUwWlhoMElEMGdibVYzSUdGd2NDNWpiMjUwWlhoMFgzQnliM1J2ZEhsd1pTaGhjSEFzSUNkaWFXNWtKeXdnWlM1MGVYQmxMQ0JrWVhSaExDQmxMblJoY21kbGRDazdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lHVXVZMnhsWVc1bFpGOTBlWEJsSUQwZ1pTNTBlWEJsTG5KbGNHeGhZMlVvWVhCd0xtVjJaVzUwVG1GdFpYTndZV05sS0Nrc0lDY25LVHRjY2x4dUlDQWdJQ0FnSUNCallXeHNZbUZqYXk1aGNIQnNlU2hqYjI1MFpYaDBMQ0JiWlN3Z1pHRjBZVjBwTzF4eVhHNGdJQ0FnSUNCOU8xeHlYRzVjY2x4dUlDQWdJQ0FnTHk4Z2FYUWdZMjkxYkdRZ1ltVWdkR2hoZENCMGFHVWdZWEJ3SUdWc1pXMWxiblFnWkc5bGMyNTBJR1Y0YVhOMElIbGxkRnh5WEc0Z0lDQWdJQ0F2THlCemJ5QmhkSFJoWTJnZ2RHOGdkR2hsSUd4cGMzUmxibVZ5Y3lCaGNuSmhlU0JoYm1RZ2RHaGxiaUJ5ZFc0b0tWeHlYRzRnSUNBZ0lDQXZMeUIzYVd4c0lHRmpkSFZoYkd4NUlHSnBibVFnZEdobElHVjJaVzUwTGx4eVhHNGdJQ0FnSUNCcFppQW9JWFJvYVhNdWJHbHpkR1Z1WlhKelcyNWhiV1ZkS1NCN0lIUm9hWE11YkdsemRHVnVaWEp6VzI1aGJXVmRJRDBnVzEwN0lIMWNjbHh1SUNBZ0lDQWdkR2hwY3k1c2FYTjBaVzVsY25OYmJtRnRaVjB1Y0hWemFDaHNhWE4wWlc1bGNsOWpZV3hzWW1GamF5azdYSEpjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbWx6VW5WdWJtbHVaeWdwS1NCN1hISmNiaUFnSUNBZ0lDQWdMeThnYVdZZ2RHaGxJR0Z3Y0NCcGN5QnlkVzV1YVc1blhISmNiaUFnSUNBZ0lDQWdMeThnS21GamRIVmhiR3g1S2lCaWFXNWtJSFJvWlNCbGRtVnVkQ0IwYnlCMGFHVWdZWEJ3SUdWc1pXMWxiblJjY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbDlzYVhOMFpXNG9ibUZ0WlN3Z2JHbHpkR1Z1WlhKZlkyRnNiR0poWTJzcE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJVY21sbloyVnljeUJqZFhOMGIyMGdaWFpsYm5SeklHUmxabWx1WldRZ2QybDBhQ0JnWW1sdVpDZ3BZRnh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNNakl5QkJjbWQxYldWdWRITmNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFxSUdCdVlXMWxZQ0JVYUdVZ2JtRnRaU0J2WmlCMGFHVWdaWFpsYm5RdUlFRjFkRzl0WVhScFkyRnNiSGtnY0hKbFptbDRaV1FnZDJsMGFDQjBhR1VnWUdWMlpXNTBUbUZ0WlhOd1lXTmxLQ2xnWEhKY2JpQWdJQ0F2THlBcUlHQmtZWFJoWUNCQmJpQnZjSFJwYjI1aGJDQlBZbXBsWTNRZ2RHaGhkQ0JqWVc0Z1ltVWdjR0Z6YzJWa0lIUnZJSFJvWlNCaWIzVnVaQ0JqWVd4c1ltRmpheTVjY2x4dUlDQWdJQzh2SUNvZ1lHTnZiblJsZUhSZ0lFRnVJRzl3ZEdsdmJtRnNJR052Ym5SbGVIUXZUMkpxWldOMElHbHVJSGRvYVdOb0lIUnZJR1Y0WldOMWRHVWdkR2hsSUdKdmRXNWtJR05oYkd4aVlXTnJMbHh5WEc0Z0lDQWdMeThnSUNCSlppQnVieUJqYjI1MFpYaDBJR2x6SUhOMWNIQnNhV1ZrSUdFZ2RHaGxJR052Ym5SbGVIUWdhWE1nWVNCdVpYY2dZRk5oYlcxNUxrVjJaVzUwUTI5dWRHVjRkR0JjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0IwY21sbloyVnlPaUJtZFc1amRHbHZiaWh1WVcxbExDQmtZWFJoS1NCN1hISmNiaUFnSUNBZ0lIUm9hWE11SkdWc1pXMWxiblFvS1M1MGNtbG5aMlZ5S0Z0dVlXMWxMQ0IwYUdsekxtVjJaVzUwVG1GdFpYTndZV05sS0NsZExtcHZhVzRvSnk0bktTd2dXMlJoZEdGZEtUdGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE03WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRkpsY25WdWN5QjBhR1VnWTNWeWNtVnVkQ0J5YjNWMFpWeHlYRzRnSUNBZ2NtVm1jbVZ6YURvZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJSFJvYVhNdWJHRnpkRjlzYjJOaGRHbHZiaUE5SUc1MWJHdzdYSEpjYmlBZ0lDQWdJSFJvYVhNdWRISnBaMmRsY2lnbmJHOWpZWFJwYjI0dFkyaGhibWRsWkNjcE8xeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjenRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdWR0ZyWlhNZ1lTQnphVzVuYkdVZ1kyRnNiR0poWTJzZ2RHaGhkQ0JwY3lCd2RYTm9aV1FnYjI0Z2RHOGdZU0J6ZEdGamF5NWNjbHh1SUNBZ0lDOHZJRUpsWm05eVpTQmhibmtnY205MWRHVWdhWE1nY25WdUxDQjBhR1VnWTJGc2JHSmhZMnR6SUdGeVpTQmxkbUZzZFdGMFpXUWdhVzRnYjNKa1pYSWdkMmwwYUdsdVhISmNiaUFnSUNBdkx5QjBhR1VnWTNWeWNtVnVkQ0JnVTJGdGJYa3VSWFpsYm5SRGIyNTBaWGgwWUZ4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklFbG1JR0Z1ZVNCdlppQjBhR1VnWTJGc2JHSmhZMnR6SUdWNGNHeHBZMmwwYkhrZ2NtVjBkWEp1SUdaaGJITmxMQ0JsZUdWamRYUnBiMjRnYjJZZ1lXNTVYSEpjYmlBZ0lDQXZMeUJtZFhKMGFHVnlJR05oYkd4aVlXTnJjeUJoYm1RZ2RHaGxJSEp2ZFhSbElHbDBjMlZzWmlCcGN5Qm9ZV3gwWldRdVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdXVzkxSUdOaGJpQmhiSE52SUhCeWIzWnBaR1VnWVNCelpYUWdiMllnYjNCMGFXOXVjeUIwYUdGMElIZHBiR3dnWkdWbWFXNWxJSGRvWlc0Z2RHOGdjblZ1SUhSb2FYTmNjbHh1SUNBZ0lDOHZJR0psWm05eVpTQmlZWE5sWkNCdmJpQjBhR1VnY205MWRHVWdhWFFnY0hKdlkyVmxaSE11WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0l5TWpJRVY0WVcxd2JHVmNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lIWmhjaUJoY0hBZ1BTQWtMbk5oYlcxNUtHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0F2THlCM2FXeHNJSEoxYmlCaGRDQWpMM0p2ZFhSbElHSjFkQ0J1YjNRZ1lYUWdJeTljY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0IwYUdsekxtSmxabTl5WlNnbkl5OXliM1YwWlNjc0lHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnTHk4dUxpNWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnTHk4Z2QybHNiQ0J5ZFc0Z1lYUWdJeThnWW5WMElHNXZkQ0JoZENBakwzSnZkWFJsWEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnZEdocGN5NWlaV1p2Y21Vb2UyVjRZMlZ3ZERvZ2UzQmhkR2c2SUNjakwzSnZkWFJsSjMxOUxDQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUhSb2FYTXViRzluS0NkdWIzUWdZbVZtYjNKbElDTXZjbTkxZEdVbktUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnZEdocGN5NW5aWFFvSnlNdkp5d2dablZ1WTNScGIyNG9LU0I3ZlNrN1hISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lIUm9hWE11WjJWMEtDY2pMM0p2ZFhSbEp5d2dablZ1WTNScGIyNG9LU0I3ZlNrN1hISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUJUWldVZ1lHTnZiblJsZUhSTllYUmphR1Z6VDNCMGFXOXVjeWdwWUNCbWIzSWdZU0JtZFd4c0lHeHBjM1FnYjJZZ2MzVndjRzl5ZEdWa0lHOXdkR2x2Ym5OY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNCaVpXWnZjbVU2SUdaMWJtTjBhVzl1S0c5d2RHbHZibk1zSUdOaGJHeGlZV05yS1NCN1hISmNiaUFnSUNBZ0lHbG1JQ2hmYVhOR2RXNWpkR2x2YmlodmNIUnBiMjV6S1NrZ2UxeHlYRzRnSUNBZ0lDQWdJR05oYkd4aVlXTnJJRDBnYjNCMGFXOXVjenRjY2x4dUlDQWdJQ0FnSUNCdmNIUnBiMjV6SUQwZ2UzMDdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZEdocGN5NWlaV1p2Y21WekxuQjFjMmdvVzI5d2RHbHZibk1zSUdOaGJHeGlZV05yWFNrN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5QkJJSE5vYjNKMFkzVjBJR1p2Y2lCaWFXNWthVzVuSUdFZ1kyRnNiR0poWTJzZ2RHOGdZbVVnY25WdUlHRm1kR1Z5SUdFZ2NtOTFkR1VnYVhNZ1pYaGxZM1YwWldRdVhISmNiaUFnSUNBdkx5QkJablJsY2lCallXeHNZbUZqYTNNZ2FHRjJaU0J1YnlCbmRXRnlkVzUwWldWa0lHOXlaR1Z5TGx4eVhHNGdJQ0FnWVdaMFpYSTZJR1oxYm1OMGFXOXVLR05oYkd4aVlXTnJLU0I3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtSnBibVFvSjJWMlpXNTBMV052Ym5SbGVIUXRZV1owWlhJbkxDQmpZV3hzWW1GamF5azdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVYSEpjYmlBZ0lDQXZMeUJCWkdSeklHRnVJR0Z5YjNWdVpDQm1hV3gwWlhJZ2RHOGdkR2hsSUdGd2NHeHBZMkYwYVc5dUxpQmhjbTkxYm1RZ1ptbHNkR1Z5Y3lCaGNtVWdablZ1WTNScGIyNXpYSEpjYmlBZ0lDQXZMeUIwYUdGMElIUmhhMlVnWVNCemFXNW5iR1VnWVhKbmRXMWxiblFnWUdOaGJHeGlZV05yWUNCM2FHbGphQ0JwY3lCMGFHVWdaVzUwYVhKbElISnZkWFJsWEhKY2JpQWdJQ0F2THlCbGVHVmpkWFJwYjI0Z2NHRjBhQ0IzY21Gd2NHVmtJSFZ3SUdsdUlHRWdZMnh2YzNWeVpTNGdWR2hwY3lCdFpXRnVjeUI1YjNVZ1kyRnVJR1JsWTJsa1pTQjNhR1YwYUdWeVhISmNiaUFnSUNBdkx5QnZjaUJ1YjNRZ2RHOGdjSEp2WTJWbFpDQjNhWFJvSUdWNFpXTjFkR2x2YmlCaWVTQnViM1FnYVc1MmIydHBibWNnWUdOaGJHeGlZV05yWUNCdmNpeGNjbHh1SUNBZ0lDOHZJRzF2Y21VZ2RYTmxablZzYkhrZ2QzSmhjSEJwYm1jZ1kyRnNiR0poWTJzZ2FXNXphV1JsSUhSb1pTQnlaWE4xYkhRZ2IyWWdZVzRnWVhONWJtTm9jbTl1YjNWeklHVjRaV04xZEdsdmJpNWNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFqSXlNZ1JYaGhiWEJzWlZ4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklGUm9aU0J0YjNOMElHTnZiVzF2YmlCMWMyVWdZMkZ6WlNCbWIzSWdZWEp2ZFc1a0tDa2dhWE1nWTJGc2JHbHVaeUJoSUY5d2IzTnphV0pzZVY4Z1lYTjVibU1nWm5WdVkzUnBiMjVjY2x4dUlDQWdJQzh2SUdGdVpDQmxlR1ZqZFhScGJtY2dkR2hsSUhKdmRYUmxJSGRwZEdocGJpQjBhR1VnWm5WdVkzUnBiMjV6SUdOaGJHeGlZV05yT2x4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDQWdJQ0FnZG1GeUlHRndjQ0E5SUNRdWMyRnRiWGtvWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lIWmhjaUJqZFhKeVpXNTBYM1Z6WlhJZ1BTQm1ZV3h6WlR0Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ1puVnVZM1JwYjI0Z1kyaGxZMnRNYjJkblpXUkpiaWhqWVd4c1ltRmpheWtnZTF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ0x5OGdMM05sYzNOcGIyNGdjbVYwZFhKdWN5QmhJRXBUVDA0Z2NtVndjbVZ6Wlc1MFlYUnBiMjRnYjJZZ2RHaGxJR3h2WjJkbFpDQnBiaUIxYzJWeVhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQXZMeUJ2Y2lCaGJpQmxiWEIwZVNCdlltcGxZM1JjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUdsbUlDZ2hZM1Z5Y21WdWRGOTFjMlZ5S1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ1F1WjJWMFNsTlBUaWduTDNObGMzTnBiMjRuTENCbWRXNWpkR2x2YmlocWMyOXVLU0I3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dwemIyNHViRzluYVc0cElIdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSE5vYjNjZ2RHaGxJSFZ6WlhJZ1lYTWdiRzluWjJWa0lHbHVYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpkWEp5Wlc1MFgzVnpaWElnUFNCcWMyOXVPMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnWlhobFkzVjBaU0IwYUdVZ2NtOTFkR1VnY0dGMGFGeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyRnNiR0poWTJzb0tUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2MyaHZkeUIwYUdVZ2RYTmxjaUJoY3lCdWIzUWdiRzluWjJWa0lHbHVYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpkWEp5Wlc1MFgzVnpaWElnUFNCbVlXeHpaVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUhSb1pTQmpiMjUwWlhoMElHOW1JR0Z5YjNWdVpFWnBiSFJsY25NZ2FYTWdZVzRnUlhabGJuUkRiMjUwWlhoMFhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbkpsWkdseVpXTjBLQ2NqTDJ4dloybHVKeWs3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUM4dklHVjRaV04xZEdVZ2RHaGxJSEp2ZFhSbElIQmhkR2hjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ1kyRnNiR0poWTJzb0tUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0I5TzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNCMGFHbHpMbUZ5YjNWdVpDaGphR1ZqYTB4dloyZGxaRWx1S1R0Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lHRnliM1Z1WkRvZ1puVnVZM1JwYjI0b1kyRnNiR0poWTJzcElIdGNjbHh1SUNBZ0lDQWdkR2hwY3k1aGNtOTFibVJ6TG5CMWMyZ29ZMkZzYkdKaFkyc3BPMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnUVdSa2N5QmhJRzl1UTI5dGNHeGxkR1VnWm5WdVkzUnBiMjRnZEc4Z2RHaGxJR0Z3Y0d4cFkyRjBhVzl1TGlCdmJrTnZiWEJzWlhSbElHWjFibU4wYVc5dWN5QmhjbVVnWlhobFkzVjBaV1JjY2x4dUlDQWdJQzh2SUdGMElIUm9aU0JsYm1RZ2IyWWdZU0JqYUdGcGJpQnZaaUJ5YjNWMFpTQmpZV3hzWW1GamEzTXNJR2xtSUhSb1pYa2dZMkZzYkNCdVpYaDBLQ2t1SUZWdWJHbHJaU0JoWm5SbGNpeGNjbHh1SUNBZ0lDOHZJSGRvYVdOb0lHbHpJR05oYkd4bFpDQmhjeUJ6YjI5dUlHRnpJSFJvWlNCeWIzVjBaU0JwY3lCamIyMXdiR1YwWlN3Z2IyNURiMjF3YkdWMFpTQnBjeUJzYVd0bElHRWdabWx1WVd3Z2JtVjRkQ2dwWEhKY2JpQWdJQ0F2THlCbWIzSWdZV3hzSUhKdmRYUmxjeXdnWVc1a0lHbHpJSFJvZFhNZ2NuVnVJR0Z6ZVc1amFISnZibTkxYzJ4NVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJeU1qSUVWNFlXMXdiR1ZjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJR0Z3Y0M1blpYUW9KeTlqYUdGcGJpY3NablZ1WTNScGIyNG9ZMjl1ZEdWNGRDeHVaWGgwS1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQmpiMjV6YjJ4bExteHZaeWduWTJoaGFXNHhKeWs3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNCdVpYaDBLQ2s3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJSDBzWm5WdVkzUnBiMjRvWTI5dWRHVjRkQ3h1WlhoMEtTQjdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0JqYjI1emIyeGxMbXh2WnlnblkyaGhhVzR5SnlrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQnVaWGgwS0NrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ1lYQndMbWRsZENnbkwyeHBibXNuTEdaMWJtTjBhVzl1S0dOdmJuUmxlSFFzYm1WNGRDa2dlMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnWTI5dWMyOXNaUzVzYjJjb0oyeHBibXN4SnlrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQnVaWGgwS0NrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUgwc1puVnVZM1JwYjI0b1kyOXVkR1Y0ZEN4dVpYaDBLU0I3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNCamIyNXpiMnhsTG14dlp5Z25iR2x1YXpJbktUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJRzVsZUhRb0tUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQmhjSEF1YjI1RGIyMXdiR1YwWlNobWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJR052Ym5OdmJHVXViRzluS0Z3aVVuVnVibWx1WnlCbWFXNWhiR3g1WENJcE8xeHlYRzRnSUNBZ0x5OGdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUJKWmlCNWIzVWdaMjhnZEc4Z0p5OWphR0ZwYmljc0lIbHZkU0IzYVd4c0lHZGxkQ0IwYUdVZ1ptOXNiRzkzYVc1bklHMWxjM05oWjJWek9seHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ1kyaGhhVzR4WEhKY2JpQWdJQ0F2THlBZ0lDQWdJR05vWVdsdU1seHlYRzRnSUNBZ0x5OGdJQ0FnSUNCU2RXNXVhVzVuSUc5dVEyOXRjR3hsZEdWY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdTV1lnZVc5MUlHZHZJSFJ2SUM5c2FXNXJMQ0I1YjNVZ2QybHNiQ0JuWlhRZ2RHaGxJR1p2Ykd4dmQybHVaeUJ0WlhOellXZGxjenBjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJR3hwYm1zeFhISmNiaUFnSUNBdkx5QWdJQ0FnSUd4cGJtc3lYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lGSjFibTVwYm1jZ2IyNURiMjF3YkdWMFpWeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUJKZENCeVpXRnNiSGtnWTI5dFpYTWdkRzhnY0d4aGVTQjNhR1Z1SUdSdmFXNW5JR0Z6ZVc1amFISnZibTkxY3pwY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUdGd2NDNW5aWFFvSnk5amFHRnBiaWNzWm5WdVkzUnBiMjRvWTI5dWRHVjRkQ3h1WlhoMEtTQjdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdKQzVuWlhRb0p5OXRlUzkxY213bkxHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnWTI5dWMyOXNaUzVzYjJjb0oyTm9ZV2x1TVNjcE8xeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQWdibVY0ZENncE8xeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQjlMR1oxYm1OMGFXOXVLR052Ym5SbGVIUXNibVY0ZENrZ2UxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lHTnZibk52YkdVdWJHOW5LQ2RqYUdGcGJqSW5LVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0J1WlhoMEtDazdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJRzl1UTI5dGNHeGxkR1U2SUdaMWJtTjBhVzl1S0dOaGJHeGlZV05yS1NCN1hISmNiaUFnSUNBZ0lIUm9hWE11WDI5dVEyOXRjR3hsZEdVZ1BTQmpZV3hzWW1GamF6dGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE03WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRkpsZEhWeWJuTWdZSFJ5ZFdWZ0lHbG1JSFJvWlNCamRYSnlaVzUwSUdGd2NHeHBZMkYwYVc5dUlHbHpJSEoxYm01cGJtY3VYSEpjYmlBZ0lDQnBjMUoxYm01cGJtYzZJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NWZjblZ1Ym1sdVp6dGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1NHVnNjR1Z5Y3lCbGVIUmxibVJ6SUhSb1pTQkZkbVZ1ZEVOdmJuUmxlSFFnY0hKdmRHOTBlWEJsSUhOd1pXTnBabWxqSUhSdklIUm9hWE1nWVhCd0xseHlYRzRnSUNBZ0x5OGdWR2hwY3lCaGJHeHZkM01nZVc5MUlIUnZJR1JsWm1sdVpTQmhjSEFnYzNCbFkybG1hV01nYUdWc2NHVnlJR1oxYm1OMGFXOXVjeUIwYUdGMElHTmhiaUJpWlNCMWMyVmtYSEpjYmlBZ0lDQXZMeUIzYUdWdVpYWmxjaUI1YjNVbmNtVWdhVzV6YVdSbElHOW1JR0Z1SUdWMlpXNTBJR052Ym5SbGVIUWdLSFJsYlhCc1lYUmxjeXdnY205MWRHVnpMQ0JpYVc1a0tTNWNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFqSXlNZ1JYaGhiWEJzWlZ4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDQWdJQ0IyWVhJZ1lYQndJRDBnSkM1ellXMXRlU2htZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUNCb1pXeHdaWEp6S0h0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ2RYQmpZWE5sT2lCbWRXNWpkR2x2YmloMFpYaDBLU0I3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdWNGRDNTBiMU4wY21sdVp5Z3BMblJ2VlhCd1pYSkRZWE5sS0NrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNBZ0lDQWdJR2RsZENnbkl5OG5MQ0JtZFc1amRHbHZiaWdwSUhzZ2QybDBhQ2gwYUdsektTQjdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQzh2SUdsdWMybGtaU0J2WmlCMGFHbHpJR052Ym5SbGVIUWdTU0JqWVc0Z2RYTmxJSFJvWlNCb1pXeHdaWEp6WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNRb0p5TnRZV2x1SnlrdWFIUnRiQ2gxY0dOaGMyVW9KQ2duSTIxaGFXNG5LUzUwWlhoMEtDa3BPMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdmWDBwTzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDQWdJQ0I5S1R0Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJeU1qSUVGeVozVnRaVzUwYzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDb2dZR1Y0ZEdWdWMybHZibk5nSUVGdUlHOWlhbVZqZENCamIyeHNaV04wYVc5dUlHOW1JR1oxYm1OMGFXOXVjeUIwYnlCbGVIUmxibVFnZEdobElHTnZiblJsZUhRdVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ2FHVnNjR1Z5Y3pvZ1puVnVZM1JwYjI0b1pYaDBaVzV6YVc5dWN5a2dlMXh5WEc0Z0lDQWdJQ0FrTG1WNGRHVnVaQ2gwYUdsekxtTnZiblJsZUhSZmNISnZkRzkwZVhCbExuQnliM1J2ZEhsd1pTd2daWGgwWlc1emFXOXVjeWs3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCSVpXeHdaWElnWlhoMFpXNWtjeUIwYUdVZ1pYWmxiblFnWTI5dWRHVjRkQ0JxZFhOMElHeHBhMlVnWUdobGJIQmxjbk1vS1dBZ1luVjBJR1J2WlhNZ2FYUmNjbHh1SUNBZ0lDOHZJR0VnYzJsdVoyeGxJRzFsZEdodlpDQmhkQ0JoSUhScGJXVXVJRlJvYVhNZ2FYTWdaWE53WldOcFlXeHNlU0IxYzJWbWRXd2dabTl5SUdSNWJtRnRhV05oYkd4NUlHNWhiV1ZrWEhKY2JpQWdJQ0F2THlCb1pXeHdaWEp6WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0l5TWpJRVY0WVcxd2JHVmNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0x5OGdWSEpwZG1saGJDQmxlR0Z0Y0d4bElIUm9ZWFFnWVdSa2N5QXpJR2hsYkhCbGNpQnRaWFJvYjJSeklIUnZJSFJvWlNCamIyNTBaWGgwSUdSNWJtRnRhV05oYkd4NVhISmNiaUFnSUNBdkx5QWdJQ0FnZG1GeUlHRndjQ0E5SUNRdWMyRnRiWGtvWm5WdVkzUnBiMjRvWVhCd0tTQjdYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdKQzVsWVdOb0tGc3hMRElzTTEwc0lHWjFibU4wYVc5dUtHa3NJRzUxYlNrZ2UxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQmhjSEF1YUdWc2NHVnlLQ2RvWld4d1pYSW5JQ3NnYm5WdExDQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbXh2WnloY0lra25iU0JvWld4d1pYSWdiblZ0WW1WeUlGd2lJQ3NnYm5WdEtUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUNCMGFHbHpMbWRsZENnbkl5OG5MQ0JtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ2RHaHBjeTVvWld4d1pYSXlLQ2s3SUM4dlBUNGdTU2R0SUdobGJIQmxjaUJ1ZFcxaVpYSWdNbHh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0F2THlBZ0lDQWdmU2s3WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0l5TWpJRUZ5WjNWdFpXNTBjMXh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNvZ1lHNWhiV1ZnSUZSb1pTQnVZVzFsSUc5bUlIUm9aU0J0WlhSb2IyUmNjbHh1SUNBZ0lDOHZJQ29nWUcxbGRHaHZaR0FnVkdobElHWjFibU4wYVc5dUlIUnZJR0psSUdGa1pHVmtJSFJ2SUhSb1pTQndjbTkwYjNSNWNHVWdZWFFnWUc1aGJXVmdYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdhR1ZzY0dWeU9pQm1kVzVqZEdsdmJpaHVZVzFsTENCdFpYUm9iMlFwSUh0Y2NseHVJQ0FnSUNBZ2RHaHBjeTVqYjI1MFpYaDBYM0J5YjNSdmRIbHdaUzV3Y205MGIzUjVjR1ZiYm1GdFpWMGdQU0J0WlhSb2IyUTdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJCWTNSMVlXeHNlU0J6ZEdGeWRITWdkR2hsSUdGd2NHeHBZMkYwYVc5dUozTWdiR2xtWldONVkyeGxMaUJnY25WdUtDbGdJSE5vYjNWc1pDQmlaU0JwYm5admEyVmtYSEpjYmlBZ0lDQXZMeUIzYVhSb2FXNGdZU0JrYjJOMWJXVnVkQzV5WldGa2VTQmliRzlqYXlCMGJ5Qmxibk4xY21VZ2RHaGxJRVJQVFNCbGVHbHpkSE1nWW1WbWIzSmxJR0pwYm1ScGJtY2daWFpsYm5SekxDQmxkR011WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0l5TWpJRVY0WVcxd2JHVmNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ2RtRnlJR0Z3Y0NBOUlDUXVjMkZ0Ylhrb1puVnVZM1JwYjI0b0tTQjdJQzR1TGlCOUtUc2dMeThnZVc5MWNpQmhjSEJzYVdOaGRHbHZibHh5WEc0Z0lDQWdMeThnSUNBZ0lDUW9ablZ1WTNScGIyNG9LU0I3SUM4dklHUnZZM1Z0Wlc1MExuSmxZV1I1WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnWVhCd0xuSjFiaWdwTzF4eVhHNGdJQ0FnTHk4Z0lDQWdJSDBwTzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDTWpJeUJCY21kMWJXVnVkSE5jY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBcUlHQnpkR0Z5ZEY5MWNteGdJRTl3ZEdsdmJtRnNiSGtzSUdFZ1UzUnlhVzVuSUdOaGJpQmlaU0J3WVhOelpXUWdkMmhwWTJnZ2RHaGxJRUZ3Y0NCM2FXeHNJSEpsWkdseVpXTjBJSFJ2WEhKY2JpQWdJQ0F2THlBZ0lHRm1kR1Z5SUhSb1pTQmxkbVZ1ZEhNdmNtOTFkR1Z6SUdoaGRtVWdZbVZsYmlCaWIzVnVaQzVjY2x4dUlDQWdJSEoxYmpvZ1puVnVZM1JwYjI0b2MzUmhjblJmZFhKc0tTQjdYSEpjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbWx6VW5WdWJtbHVaeWdwS1NCN0lISmxkSFZ5YmlCbVlXeHpaVHNnZlZ4eVhHNGdJQ0FnSUNCMllYSWdZWEJ3SUQwZ2RHaHBjenRjY2x4dVhISmNiaUFnSUNBZ0lDOHZJR0ZqZEhWaGJHeDVJR0pwYm1RZ1lXeHNJSFJvWlNCc2FYTjBaVzVsY25OY2NseHVJQ0FnSUNBZ0pDNWxZV05vS0hSb2FYTXViR2x6ZEdWdVpYSnpMblJ2U0dGemFDZ3BMQ0JtZFc1amRHbHZiaWh1WVcxbExDQmpZV3hzWW1GamEzTXBJSHRjY2x4dUlDQWdJQ0FnSUNBa0xtVmhZMmdvWTJGc2JHSmhZMnR6TENCbWRXNWpkR2x2YmlocExDQnNhWE4wWlc1bGNsOWpZV3hzWW1GamF5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1lYQndMbDlzYVhOMFpXNG9ibUZ0WlN3Z2JHbHpkR1Z1WlhKZlkyRnNiR0poWTJzcE8xeHlYRzRnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNCOUtUdGNjbHh1WEhKY2JpQWdJQ0FnSUhSb2FYTXVkSEpwWjJkbGNpZ25jblZ1Snl3Z2UzTjBZWEowWDNWeWJEb2djM1JoY25SZmRYSnNmU2s3WEhKY2JpQWdJQ0FnSUhSb2FYTXVYM0oxYm01cGJtY2dQU0IwY25WbE8xeHlYRzRnSUNBZ0lDQXZMeUJ6WlhRZ2JHRnpkQ0JzYjJOaGRHbHZibHh5WEc0Z0lDQWdJQ0IwYUdsekxteGhjM1JmYkc5allYUnBiMjRnUFNCdWRXeHNPMXh5WEc0Z0lDQWdJQ0JwWmlBb0lTZ3ZYRndqS0M0cktTOHVkR1Z6ZENoMGFHbHpMbWRsZEV4dlkyRjBhVzl1S0NrcEtTQW1KaUIwZVhCbGIyWWdjM1JoY25SZmRYSnNJQ0U5SUNkMWJtUmxabWx1WldRbktTQjdYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NXpaWFJNYjJOaGRHbHZiaWh6ZEdGeWRGOTFjbXdwTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDOHZJR05vWldOcklIVnliRnh5WEc0Z0lDQWdJQ0IwYUdsekxsOWphR1ZqYTB4dlkyRjBhVzl1S0NrN1hISmNiaUFnSUNBZ0lIUm9hWE11WDJ4dlkyRjBhVzl1WDNCeWIzaDVMbUpwYm1Rb0tUdGNjbHh1SUNBZ0lDQWdkR2hwY3k1aWFXNWtLQ2RzYjJOaGRHbHZiaTFqYUdGdVoyVmtKeXdnWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lDQWdZWEJ3TGw5amFHVmphMHh2WTJGMGFXOXVLQ2s3WEhKY2JpQWdJQ0FnSUgwcE8xeHlYRzVjY2x4dUlDQWdJQ0FnTHk4Z1ltbHVaQ0IwYnlCemRXSnRhWFFnZEc4Z1kyRndkSFZ5WlNCd2IzTjBMM0IxZEM5a1pXeGxkR1VnY205MWRHVnpYSEpjYmlBZ0lDQWdJSFJvYVhNdVltbHVaQ2duYzNWaWJXbDBKeXdnWm5WdVkzUnBiMjRvWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJR2xtSUNnZ0lWTmhiVzE1TG5SaGNtZGxkRWx6VkdocGMxZHBibVJ2ZHlobExDQW5abTl5YlNjcElDa2dleUJ5WlhSMWNtNGdkSEoxWlRzZ2ZWeHlYRzRnSUNBZ0lDQWdJSFpoY2lCeVpYUjFjbTVsWkNBOUlHRndjQzVmWTJobFkydEdiM0p0VTNWaWJXbHpjMmx2Ymlna0tHVXVkR0Z5WjJWMEtTNWpiRzl6WlhOMEtDZG1iM0p0SnlrcE8xeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQW9jbVYwZFhKdVpXUWdQVDA5SUdaaGJITmxLU0EvSUdVdWNISmxkbVZ1ZEVSbFptRjFiSFFvS1NBNklHWmhiSE5sTzF4eVhHNGdJQ0FnSUNCOUtUdGNjbHh1WEhKY2JpQWdJQ0FnSUM4dklHSnBibVFnZFc1c2IyRmtJSFJ2SUdKdlpIa2dkVzVzYjJGa1hISmNiaUFnSUNBZ0lDUW9kMmx1Wkc5M0tTNWlhVzVrS0NkMWJteHZZV1FuTENCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0JoY0hBdWRXNXNiMkZrS0NrN1hISmNiaUFnSUNBZ0lIMHBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0x5OGdkSEpwWjJkbGNpQm9kRzFzSUdOb1lXNW5aV1JjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWRISnBaMmRsY2lnblkyaGhibWRsWkNjcE8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCVWFHVWdiM0J3YjNOcGRHVWdiMllnWUhKMWJpZ3BZQ3dnZFc0dFltbHVaSE1nWVd4c0lHVjJaVzUwSUd4cGMzUmxibVZ5Y3lCaGJtUWdhVzUwWlhKMllXeHpYSEpjYmlBZ0lDQXZMeUJnY25WdUtDbGdJRUYxZEc5dFlYUnBZMkZzYkhrZ1ltbHVaSE1nWVNCZ2IyNTFibXh2WVdSZ0lHVjJaVzUwSUhSdklISjFiaUIwYUdseklIZG9aVzVjY2x4dUlDQWdJQzh2SUhSb1pTQmtiMk4xYldWdWRDQnBjeUJqYkc5elpXUXVYSEpjYmlBZ0lDQjFibXh2WVdRNklHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0JwWmlBb0lYUm9hWE11YVhOU2RXNXVhVzVuS0NrcElIc2djbVYwZFhKdUlHWmhiSE5sT3lCOVhISmNiaUFnSUNBZ0lIWmhjaUJoY0hBZ1BTQjBhR2x6TzF4eVhHNGdJQ0FnSUNCMGFHbHpMblJ5YVdkblpYSW9KM1Z1Ykc5aFpDY3BPMXh5WEc0Z0lDQWdJQ0F2THlCamJHVmhjaUJwYm5SbGNuWmhiRnh5WEc0Z0lDQWdJQ0IwYUdsekxsOXNiMk5oZEdsdmJsOXdjbTk0ZVM1MWJtSnBibVFvS1R0Y2NseHVJQ0FnSUNBZ0x5OGdkVzVpYVc1a0lHWnZjbTBnYzNWaWJXbDBjMXh5WEc0Z0lDQWdJQ0IwYUdsekxpUmxiR1Z0Wlc1MEtDa3VkVzVpYVc1a0tDZHpkV0p0YVhRbktTNXlaVzF2ZG1WRGJHRnpjeWhoY0hBdVpYWmxiblJPWVcxbGMzQmhZMlVvS1NrN1hISmNiaUFnSUNBZ0lDOHZJSFZ1WW1sdVpDQmhiR3dnWlhabGJuUnpYSEpjYmlBZ0lDQWdJQ1F1WldGamFDaDBhR2x6TG14cGMzUmxibVZ5Y3k1MGIwaGhjMmdvS1NBc0lHWjFibU4wYVc5dUtHNWhiV1VzSUd4cGMzUmxibVZ5Y3lrZ2UxeHlYRzRnSUNBZ0lDQWdJQ1F1WldGamFDaHNhWE4wWlc1bGNuTXNJR1oxYm1OMGFXOXVLR2tzSUd4cGMzUmxibVZ5WDJOaGJHeGlZV05yS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0JoY0hBdVgzVnViR2x6ZEdWdUtHNWhiV1VzSUd4cGMzUmxibVZ5WDJOaGJHeGlZV05yS1R0Y2NseHVJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lIUm9hWE11WDNKMWJtNXBibWNnUFNCbVlXeHpaVHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUU1dmRDQnZibXg1SUhKMWJuTWdZSFZ1WW1sdVpHQWdZblYwSUdGc2MyOGdaR1Z6ZEhKdmVYTWdkR2hsSUdGd2NDQnlaV1psY21WdVkyVXVYSEpjYmlBZ0lDQmtaWE4wY205NU9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnZEdocGN5NTFibXh2WVdRb0tUdGNjbHh1SUNBZ0lDQWdaR1ZzWlhSbElGTmhiVzE1TG1Gd2NITmJkR2hwY3k1bGJHVnRaVzUwWDNObGJHVmpkRzl5WFR0Y2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklGZHBiR3dnWW1sdVpDQmhJSE5wYm1kc1pTQmpZV3hzWW1GamF5Qm1kVzVqZEdsdmJpQjBieUJsZG1WeWVTQmxkbVZ1ZENCMGFHRjBJR2x6SUdGc2NtVmhaSGxjY2x4dUlDQWdJQzh2SUdKbGFXNW5JR3hwYzNSbGJtVmtJSFJ2SUdsdUlIUm9aU0JoY0hBdUlGUm9hWE1nYVc1amJIVmtaWE1nWVd4c0lIUm9aU0JnUVZCUVgwVldSVTVVVTJCY2NseHVJQ0FnSUM4dklHRnpJSGRsYkd3Z1lYTWdZVzU1SUdOMWMzUnZiU0JsZG1WdWRITWdaR1ZtYVc1bFpDQjNhWFJvSUdCaWFXNWtLQ2xnTGx4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklGVnpaV1FnYVc1MFpYSnVZV3hzZVNCbWIzSWdaR1ZpZFdjZ2JHOW5aMmx1Wnk1Y2NseHVJQ0FnSUdKcGJtUlViMEZzYkVWMlpXNTBjem9nWm5WdVkzUnBiMjRvWTJGc2JHSmhZMnNwSUh0Y2NseHVJQ0FnSUNBZ2RtRnlJR0Z3Y0NBOUlIUm9hWE03WEhKY2JpQWdJQ0FnSUM4dklHSnBibVFnZEc4Z2RHaGxJRUZRVUY5RlZrVk9WRk1nWm1seWMzUmNjbHh1SUNBZ0lDQWdKQzVsWVdOb0tIUm9hWE11UVZCUVgwVldSVTVVVXl3Z1puVnVZM1JwYjI0b2FTd2daU2tnZTF4eVhHNGdJQ0FnSUNBZ0lHRndjQzVpYVc1a0tHVXNJR05oYkd4aVlXTnJLVHRjY2x4dUlDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDOHZJRzVsZUhRc0lHSnBibVFnZEc4Z2JHbHpkR1Z1WlhJZ2JtRnRaWE1nS0c5dWJIa2dhV1lnZEdobGVTQmtiMjUwSUdWNGFYTjBJR2x1SUVGUVVGOUZWa1ZPVkZNcFhISmNiaUFnSUNBZ0lDUXVaV0ZqYUNoMGFHbHpMbXhwYzNSbGJtVnljeTVyWlhsektIUnlkV1VwTENCbWRXNWpkR2x2YmlocExDQnVZVzFsS1NCN1hISmNiaUFnSUNBZ0lDQWdhV1lnS0NRdWFXNUJjbkpoZVNodVlXMWxMQ0JoY0hBdVFWQlFYMFZXUlU1VVV5a2dQVDBnTFRFcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdGd2NDNWlhVzVrS0c1aGJXVXNJR05oYkd4aVlXTnJLVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnVW1WMGRYSnVjeUJoSUdOdmNIa2diMllnZEdobElHZHBkbVZ1SUhCaGRHZ2dkMmwwYUNCaGJua2djWFZsY25rZ2MzUnlhVzVuSUdGbWRHVnlJSFJvWlNCb1lYTm9YSEpjYmlBZ0lDQXZMeUJ5WlcxdmRtVmtMbHh5WEc0Z0lDQWdjbTkxZEdGaWJHVlFZWFJvT2lCbWRXNWpkR2x2Ymlod1lYUm9LU0I3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUJ3WVhSb0xuSmxjR3hoWTJVb1VWVkZVbGxmVTFSU1NVNUhYMDFCVkVOSVJWSXNJQ2NuS1R0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnUjJsMlpXNGdZU0IyWlhKaUlHRnVaQ0JoSUZOMGNtbHVaeUJ3WVhSb0xDQjNhV3hzSUhKbGRIVnliaUJsYVhSb1pYSWdZU0J5YjNWMFpTQnZZbXBsWTNRZ2IzSWdabUZzYzJWY2NseHVJQ0FnSUM4dklHbG1JR0VnYldGMFkyaHBibWNnY205MWRHVWdZMkZ1SUdKbElHWnZkVzVrSUhkcGRHaHBiaUIwYUdVZ1kzVnljbVZ1ZENCa1pXWnBibVZrSUhObGRDNWNjbHh1SUNBZ0lHeHZiMnQxY0ZKdmRYUmxPaUJtZFc1amRHbHZiaWgyWlhKaUxDQndZWFJvS1NCN1hISmNiaUFnSUNBZ0lIWmhjaUJoY0hBZ1BTQjBhR2x6TENCeWIzVjBaV1FnUFNCbVlXeHpaU3dnYVNBOUlEQXNJR3dzSUhKdmRYUmxPMXh5WEc0Z0lDQWdJQ0JwWmlBb2RIbHdaVzltSUhSb2FYTXVjbTkxZEdWelczWmxjbUpkSUNFOUlDZDFibVJsWm1sdVpXUW5LU0I3WEhKY2JpQWdJQ0FnSUNBZ2JDQTlJSFJvYVhNdWNtOTFkR1Z6VzNabGNtSmRMbXhsYm1kMGFEdGNjbHh1SUNBZ0lDQWdJQ0JtYjNJZ0tEc2dhU0E4SUd3N0lHa3JLeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdjbTkxZEdVZ1BTQjBhR2x6TG5KdmRYUmxjMXQyWlhKaVhWdHBYVHRjY2x4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2hoY0hBdWNtOTFkR0ZpYkdWUVlYUm9LSEJoZEdncExtMWhkR05vS0hKdmRYUmxMbkJoZEdncEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISnZkWFJsWkNBOUlISnZkWFJsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNjbHh1SUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSEp2ZFhSbFpEdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1JtbHljM1FzSUdsdWRtOXJaWE1nWUd4dmIydDFjRkp2ZFhSbEtDbGdJR0Z1WkNCcFppQmhJSEp2ZFhSbElHbHpJR1p2ZFc1a0xDQndZWEp6WlhNZ2RHaGxYSEpjYmlBZ0lDQXZMeUJ3YjNOemFXSnNaU0JWVWt3Z2NHRnlZVzF6SUdGdVpDQjBhR1Z1SUdsdWRtOXJaWE1nZEdobElISnZkWFJsSjNNZ1kyRnNiR0poWTJzZ2QybDBhR2x1SUdFZ2JtVjNYSEpjYmlBZ0lDQXZMeUJnVTJGdGJYa3VSWFpsYm5SRGIyNTBaWGgwWUM0Z1NXWWdkR2hsSUhKdmRYUmxJR05oYmlCdWIzUWdZbVVnWm05MWJtUXNJR2wwSUdOaGJHeHpYSEpjYmlBZ0lDQXZMeUJnYm05MFJtOTFibVFvS1dBdUlFbG1JR0J5WVdselpWOWxjbkp2Y25OZ0lHbHpJSE5sZENCMGJ5QmdkSEoxWldBZ1lXNWtYSEpjYmlBZ0lDQXZMeUIwYUdVZ1lHVnljbTl5S0NsZ0lHaGhjeUJ1YjNRZ1ltVmxiaUJ2ZG1WeWNtbGtaR1Z1TENCcGRDQjNhV3hzSUhSb2NtOTNJR0Z1SUdGamRIVmhiQ0JLVTF4eVhHNGdJQ0FnTHk4Z1pYSnliM0l1WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z1dXOTFJSEJ5YjJKaFlteDVJSGRwYkd3Z2JtVjJaWElnYUdGMlpTQjBieUJqWVd4c0lIUm9hWE1nWkdseVpXTjBiSGt1WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0l5TWpJRUZ5WjNWdFpXNTBjMXh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNvZ1lIWmxjbUpnSUVFZ1UzUnlhVzVuSUdadmNpQjBhR1VnZG1WeVlpNWNjbHh1SUNBZ0lDOHZJQ29nWUhCaGRHaGdJRUVnVTNSeWFXNW5JSEJoZEdnZ2RHOGdiRzl2YTNWd0xseHlYRzRnSUNBZ0x5OGdLaUJnY0dGeVlXMXpZQ0JCYmlCUFltcGxZM1FnYjJZZ1VHRnlZVzF6SUhCMWJHeGxaQ0JtY205dElIUm9aU0JWVWtrZ2IzSWdjR0Z6YzJWa0lHUnBjbVZqZEd4NUxseHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ01qSXlCU1pYUjFjbTV6WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z1JXbDBhR1Z5SUhKbGRIVnlibk1nZEdobElIWmhiSFZsSUhKbGRIVnlibVZrSUdKNUlIUm9aU0J5YjNWMFpTQmpZV3hzWW1GamF5QnZjaUJ5WVdselpYTWdZU0EwTURRZ1RtOTBJRVp2ZFc1a0lHVnljbTl5TGx4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUhKMWJsSnZkWFJsT2lCbWRXNWpkR2x2YmloMlpYSmlMQ0J3WVhSb0xDQndZWEpoYlhNc0lIUmhjbWRsZENrZ2UxeHlYRzRnSUNBZ0lDQjJZWElnWVhCd0lEMGdkR2hwY3l4Y2NseHVJQ0FnSUNBZ0lDQWdJSEp2ZFhSbElEMGdkR2hwY3k1c2IyOXJkWEJTYjNWMFpTaDJaWEppTENCd1lYUm9LU3hjY2x4dUlDQWdJQ0FnSUNBZ0lHTnZiblJsZUhRc1hISmNiaUFnSUNBZ0lDQWdJQ0IzY21Gd2NHVmtYM0p2ZFhSbExGeHlYRzRnSUNBZ0lDQWdJQ0FnWVhKdmRXNWtjeXhjY2x4dUlDQWdJQ0FnSUNBZ0lHRnliM1Z1WkN4Y2NseHVJQ0FnSUNBZ0lDQWdJR0psWm05eVpYTXNYSEpjYmlBZ0lDQWdJQ0FnSUNCaVpXWnZjbVVzWEhKY2JpQWdJQ0FnSUNBZ0lDQmpZV3hzWW1GamExOWhjbWR6TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdjR0YwYUY5d1lYSmhiWE1zWEhKY2JpQWdJQ0FnSUNBZ0lDQm1hVzVoYkY5eVpYUjFjbTVsWkR0Y2NseHVYSEpjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbVJsWW5WbktTQjdYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NXNiMmNvSjNKMWJsSnZkWFJsSnl3Z1czWmxjbUlzSUhCaGRHaGRMbXB2YVc0b0p5QW5LU2s3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJSFJvYVhNdWRISnBaMmRsY2lnbmNuVnVMWEp2ZFhSbEp5d2dlM1psY21JNklIWmxjbUlzSUhCaGRHZzZJSEJoZEdnc0lIQmhjbUZ0Y3pvZ2NHRnlZVzF6ZlNrN1hISmNiaUFnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdjR0Z5WVcxeklEMDlJQ2QxYm1SbFptbHVaV1FuS1NCN0lIQmhjbUZ0Y3lBOUlIdDlPeUI5WEhKY2JseHlYRzRnSUNBZ0lDQWtMbVY0ZEdWdVpDaHdZWEpoYlhNc0lIUm9hWE11WDNCaGNuTmxVWFZsY25sVGRISnBibWNvY0dGMGFDa3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ2FXWWdLSEp2ZFhSbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NTBjbWxuWjJWeUtDZHliM1YwWlMxbWIzVnVaQ2NzSUh0eWIzVjBaVG9nY205MWRHVjlLVHRjY2x4dUlDQWdJQ0FnSUNBdkx5QndkV3hzSUc5MWRDQjBhR1VnY0dGeVlXMXpJR1p5YjIwZ2RHaGxJSEJoZEdoY2NseHVJQ0FnSUNBZ0lDQnBaaUFvS0hCaGRHaGZjR0Z5WVcxeklEMGdjbTkxZEdVdWNHRjBhQzVsZUdWaktIUm9hWE11Y205MWRHRmliR1ZRWVhSb0tIQmhkR2dwS1NrZ0lUMDlJRzUxYkd3cElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUM4dklHWnBjbk4wSUcxaGRHTm9JR2x6SUhSb1pTQm1kV3hzSUhCaGRHaGNjbHh1SUNBZ0lDQWdJQ0FnSUhCaGRHaGZjR0Z5WVcxekxuTm9hV1owS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0F2THlCbWIzSWdaV0ZqYUNCdlppQjBhR1VnYldGMFkyaGxjMXh5WEc0Z0lDQWdJQ0FnSUNBZ0pDNWxZV05vS0hCaGRHaGZjR0Z5WVcxekxDQm1kVzVqZEdsdmJpaHBMQ0J3WVhKaGJTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJwWmlCMGFHVnlaWE1nWVNCdFlYUmphR2x1WnlCd1lYSmhiU0J1WVcxbFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHliM1YwWlM1d1lYSmhiVjl1WVcxbGMxdHBYU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklITmxkQ0IwYUdVZ2JtRnRaU0IwYnlCMGFHVWdiV0YwWTJoY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCd1lYSmhiWE5iY205MWRHVXVjR0Z5WVcxZmJtRnRaWE5iYVYxZElEMGdYMlJsWTI5a1pTaHdZWEpoYlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FXNXBkR2xoYkdsNlpTQW5jM0JzWVhRblhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0Z3WVhKaGJYTXVjM0JzWVhRcElIc2djR0Z5WVcxekxuTndiR0YwSUQwZ1cxMDdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0J3WVhKaGJYTXVjM0JzWVhRdWNIVnphQ2hmWkdWamIyUmxLSEJoY21GdEtTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYzJWMElHVjJaVzUwSUdOdmJuUmxlSFJjY2x4dUlDQWdJQ0FnSUNCamIyNTBaWGgwSUNBOUlHNWxkeUIwYUdsekxtTnZiblJsZUhSZmNISnZkRzkwZVhCbEtIUm9hWE1zSUhabGNtSXNJSEJoZEdnc0lIQmhjbUZ0Y3l3Z2RHRnlaMlYwS1R0Y2NseHVJQ0FnSUNBZ0lDQXZMeUJsYm5OMWNtVWdZWEp5WVhselhISmNiaUFnSUNBZ0lDQWdZWEp2ZFc1a2N5QTlJSFJvYVhNdVlYSnZkVzVrY3k1emJHbGpaU2d3S1R0Y2NseHVJQ0FnSUNBZ0lDQmlaV1p2Y21WeklEMGdkR2hwY3k1aVpXWnZjbVZ6TG5Oc2FXTmxLREFwTzF4eVhHNGdJQ0FnSUNBZ0lDOHZJSE5sZENCMGFHVWdZMkZzYkdKaFkyc2dZWEpuY3lCMGJ5QjBhR1VnWTI5dWRHVjRkQ0FySUdOdmJuUmxiblJ6SUc5bUlIUm9aU0J6Y0d4aGRGeHlYRzRnSUNBZ0lDQWdJR05oYkd4aVlXTnJYMkZ5WjNNZ1BTQmJZMjl1ZEdWNGRGMDdYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tIQmhjbUZ0Y3k1emNHeGhkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdZMkZzYkdKaFkydGZZWEpuY3lBOUlHTmhiR3hpWVdOclgyRnlaM011WTI5dVkyRjBLSEJoY21GdGN5NXpjR3hoZENrN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUM4dklIZHlZWEFnZEdobElISnZkWFJsSUhWd0lIZHBkR2dnZEdobElHSmxabTl5WlNCbWFXeDBaWEp6WEhKY2JpQWdJQ0FnSUNBZ2QzSmhjSEJsWkY5eWIzVjBaU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZG1GeUlISmxkSFZ5Ym1Wa0xDQnBMQ0J1WlhoMFVtOTFkR1U3WEhKY2JpQWdJQ0FnSUNBZ0lDQjNhR2xzWlNBb1ltVm1iM0psY3k1c1pXNW5kR2dnUGlBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHSmxabTl5WlNBOUlHSmxabTl5WlhNdWMyaHBablFvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1kyaGxZMnNnZEdobElHOXdkR2x2Ym5OY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHRndjQzVqYjI1MFpYaDBUV0YwWTJobGMwOXdkR2x2Ym5Nb1kyOXVkR1Y0ZEN3Z1ltVm1iM0psV3pCZEtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJtVmtJRDBnWW1WbWIzSmxXekZkTG1Gd2NHeDVLR052Ym5SbGVIUXNJRnRqYjI1MFpYaDBYU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tISmxkSFZ5Ym1Wa0lEMDlQU0JtWVd4elpTa2dleUJ5WlhSMWNtNGdabUZzYzJVN0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdZWEJ3TG14aGMzUmZjbTkxZEdVZ1BTQnliM1YwWlR0Y2NseHVJQ0FnSUNBZ0lDQWdJR052Ym5SbGVIUXVkSEpwWjJkbGNpZ25aWFpsYm5RdFkyOXVkR1Y0ZEMxaVpXWnZjbVVuTENCN1kyOXVkR1Y0ZERvZ1kyOXVkR1Y0ZEgwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnTHk4Z2NuVnVJRzExYkhScGNHeGxJR05oYkd4aVlXTnJjMXh5WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppaHliM1YwWlM1allXeHNZbUZqYXlrZ1BUMDlJRndpWm5WdVkzUnBiMjVjSWlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeWIzVjBaUzVqWVd4c1ltRmpheUE5SUZ0eWIzVjBaUzVqWVd4c1ltRmphMTA3WEhKY2JpQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNCcFppQW9jbTkxZEdVdVkyRnNiR0poWTJzZ0ppWWdjbTkxZEdVdVkyRnNiR0poWTJzdWJHVnVaM1JvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdrZ1BTQXRNVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdibVY0ZEZKdmRYUmxJRDBnWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2FTc3JPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoeWIzVjBaUzVqWVd4c1ltRmphMXRwWFNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdVpXUWdQU0J5YjNWMFpTNWpZV3hzWW1GamExdHBYUzVoY0hCc2VTaGpiMjUwWlhoMExHTmhiR3hpWVdOclgyRnlaM01wTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1lYQndMbDl2YmtOdmJYQnNaWFJsSUNZbUlIUjVjR1Z2WmloaGNIQXVYMjl1UTI5dGNHeGxkR1VnUFQwOUlGd2lablZ1WTNScGIyNWNJaWtwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRndjQzVmYjI1RGIyMXdiR1YwWlNoamIyNTBaWGgwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdOaGJHeGlZV05yWDJGeVozTXVjSFZ6YUNodVpYaDBVbTkxZEdVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCdVpYaDBVbTkxZEdVb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJR052Ym5SbGVIUXVkSEpwWjJkbGNpZ25aWFpsYm5RdFkyOXVkR1Y0ZEMxaFpuUmxjaWNzSUh0amIyNTBaWGgwT2lCamIyNTBaWGgwZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVYwZFhKdVpXUTdYSEpjYmlBZ0lDQWdJQ0FnZlR0Y2NseHVJQ0FnSUNBZ0lDQWtMbVZoWTJnb1lYSnZkVzVrY3k1eVpYWmxjbk5sS0Nrc0lHWjFibU4wYVc5dUtHa3NJR0Z5YjNWdVpDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2RtRnlJR3hoYzNSZmQzSmhjSEJsWkY5eWIzVjBaU0E5SUhkeVlYQndaV1JmY205MWRHVTdYSEpjYmlBZ0lDQWdJQ0FnSUNCM2NtRndjR1ZrWDNKdmRYUmxJRDBnWm5WdVkzUnBiMjRvS1NCN0lISmxkSFZ5YmlCaGNtOTFibVF1WVhCd2JIa29ZMjl1ZEdWNGRDd2dXMnhoYzNSZmQzSmhjSEJsWkY5eWIzVjBaVjBwT3lCOU8xeHlYRzRnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lIUnllU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQm1hVzVoYkY5eVpYUjFjbTVsWkNBOUlIZHlZWEJ3WldSZmNtOTFkR1VvS1R0Y2NseHVJQ0FnSUNBZ0lDQjlJR05oZEdOb0tHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lIUm9hWE11WlhKeWIzSW9XeWMxTURBZ1JYSnliM0luTENCMlpYSmlMQ0J3WVhSb1hTNXFiMmx1S0NjZ0p5a3NJR1VwTzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdabWx1WVd4ZmNtVjBkWEp1WldRN1hISmNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11Ym05MFJtOTFibVFvZG1WeVlpd2djR0YwYUNrN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1RXRjBZMmhsY3lCaGJpQnZZbXBsWTNRZ2IyWWdiM0IwYVc5dWN5QmhaMkZwYm5OMElHRnVJR0JGZG1WdWRFTnZiblJsZUhSZ0lHeHBhMlVnYjJKcVpXTjBJSFJvWVhSY2NseHVJQ0FnSUM4dklHTnZiblJoYVc1eklHQndZWFJvWUNCaGJtUWdZSFpsY21KZ0lHRjBkSEpwWW5WMFpYTXVJRWx1ZEdWeWJtRnNiSGtnVTJGdGJYa2dkWE5sY3lCMGFHbHpYSEpjYmlBZ0lDQXZMeUJtYjNJZ2JXRjBZMmhwYm1jZ1lHSmxabTl5WlNncFlDQm1hV3gwWlhKeklHRm5ZV2x1YzNRZ2MzQmxZMmxtYVdNZ2IzQjBhVzl1Y3k0Z1dXOTFJR05oYmlCelpYUWdkR2hsWEhKY2JpQWdJQ0F2THlCdlltcGxZM1FnZEc4Z1gyOXViSGxmSUcxaGRHTm9JR05sY25SaGFXNGdjR0YwYUhNZ2IzSWdkbVZ5WW5Nc0lHOXlJRzFoZEdOb0lHRnNiQ0J3WVhSb2N5QnZjaUIyWlhKaWN5QmZaWGhqWlhCMFgxeHlYRzRnSUNBZ0x5OGdkR2h2YzJVZ2RHaGhkQ0J0WVhSamFDQjBhR1VnYjNCMGFXOXVjeTVjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBakl5TWdSWGhoYlhCc1pWeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ0FnSUNCMllYSWdZWEJ3SUQwZ0pDNXpZVzF0ZVNncExGeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQmpiMjUwWlhoMElEMGdlM1psY21JNklDZG5aWFFuTENCd1lYUm9PaUFuSXk5dGVYQmhkR2duZlR0Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnTHk4Z2JXRjBZMmdnWVdkaGFXNXpkQ0JoSUhCaGRHZ2djM1J5YVc1blhISmNiaUFnSUNBdkx5QWdJQ0FnWVhCd0xtTnZiblJsZUhSTllYUmphR1Z6VDNCMGFXOXVjeWhqYjI1MFpYaDBMQ0FuSXk5dGVYQmhkR2duS1RzZ0x5ODlQaUIwY25WbFhISmNiaUFnSUNBdkx5QWdJQ0FnWVhCd0xtTnZiblJsZUhSTllYUmphR1Z6VDNCMGFXOXVjeWhqYjI1MFpYaDBMQ0FuSXk5dmRHaGxjbkJoZEdnbktUc2dMeTg5UGlCbVlXeHpaVnh5WEc0Z0lDQWdMeThnSUNBZ0lDOHZJR1Z4ZFdsMllXeGxiblFnZEc5Y2NseHVJQ0FnSUM4dklDQWdJQ0JoY0hBdVkyOXVkR1Y0ZEUxaGRHTm9aWE5QY0hScGIyNXpLR052Ym5SbGVIUXNJSHR2Ym14NU9pQjdjR0YwYURvbkl5OXRlWEJoZEdnbmZYMHBPeUF2THowK0lIUnlkV1ZjY2x4dUlDQWdJQzh2SUNBZ0lDQmhjSEF1WTI5dWRHVjRkRTFoZEdOb1pYTlBjSFJwYjI1ektHTnZiblJsZUhRc0lIdHZibXg1T2lCN2NHRjBhRG9uSXk5dmRHaGxjbkJoZEdnbmZYMHBPeUF2THowK0lHWmhiSE5sWEhKY2JpQWdJQ0F2THlBZ0lDQWdMeThnYldGMFkyZ2dZV2RoYVc1emRDQmhJSEJoZEdnZ2NtVm5aWGh3WEhKY2JpQWdJQ0F2THlBZ0lDQWdZWEJ3TG1OdmJuUmxlSFJOWVhSamFHVnpUM0IwYVc5dWN5aGpiMjUwWlhoMExDQXZjR0YwYUM4cE95QXZMejArSUhSeWRXVmNjbHh1SUNBZ0lDOHZJQ0FnSUNCaGNIQXVZMjl1ZEdWNGRFMWhkR05vWlhOUGNIUnBiMjV6S0dOdmJuUmxlSFFzSUM5ZWNHRjBhQzhwT3lBdkx6MCtJR1poYkhObFhISmNiaUFnSUNBdkx5QWdJQ0FnTHk4Z2JXRjBZMmdnYjI1c2VTQmhJSFpsY21KY2NseHVJQ0FnSUM4dklDQWdJQ0JoY0hBdVkyOXVkR1Y0ZEUxaGRHTm9aWE5QY0hScGIyNXpLR052Ym5SbGVIUXNJSHR2Ym14NU9pQjdkbVZ5WWpvbloyVjBKMzE5S1RzZ0x5ODlQaUIwY25WbFhISmNiaUFnSUNBdkx5QWdJQ0FnWVhCd0xtTnZiblJsZUhSTllYUmphR1Z6VDNCMGFXOXVjeWhqYjI1MFpYaDBMQ0I3YjI1c2VUb2dlM1psY21JNkozQnZjM1FuZlgwcE95QXZMejArSUdaaGJITmxYSEpjYmlBZ0lDQXZMeUFnSUNBZ0x5OGdiV0YwWTJnZ1lXeHNJR1Y0WTJWd2RDQmhJSFpsY21KY2NseHVJQ0FnSUM4dklDQWdJQ0JoY0hBdVkyOXVkR1Y0ZEUxaGRHTm9aWE5QY0hScGIyNXpLR052Ym5SbGVIUXNJSHRsZUdObGNIUTZJSHQyWlhKaU9pZHdiM04wSjMxOUtUc2dMeTg5UGlCMGNuVmxYSEpjYmlBZ0lDQXZMeUFnSUNBZ1lYQndMbU52Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3loamIyNTBaWGgwTENCN1pYaGpaWEIwT2lCN2RtVnlZam9uWjJWMEozMTlLVHNnTHk4OVBpQm1ZV3h6WlZ4eVhHNGdJQ0FnTHk4Z0lDQWdJQzh2SUcxaGRHTm9JR0ZzYkNCbGVHTmxjSFFnWVNCd1lYUm9YSEpjYmlBZ0lDQXZMeUFnSUNBZ1lYQndMbU52Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3loamIyNTBaWGgwTENCN1pYaGpaWEIwT2lCN2NHRjBhRG9uSXk5dmRHaGxjbkJoZEdnbmZYMHBPeUF2THowK0lIUnlkV1ZjY2x4dUlDQWdJQzh2SUNBZ0lDQmhjSEF1WTI5dWRHVjRkRTFoZEdOb1pYTlBjSFJwYjI1ektHTnZiblJsZUhRc0lIdGxlR05sY0hRNklIdHdZWFJvT2ljakwyMTVjR0YwYUNkOWZTazdJQzh2UFQ0Z1ptRnNjMlZjY2x4dUlDQWdJQzh2SUNBZ0lDQXZMeUJ0WVhSamFDQmhiR3dnWlhoalpYQjBJR0VnZG1WeVlpQmhibVFnWVNCd1lYUm9YSEpjYmlBZ0lDQXZMeUFnSUNBZ1lYQndMbU52Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3loamIyNTBaWGgwTENCN1pYaGpaWEIwT2lCN2NHRjBhRG9uSXk5dmRHaGxjbkJoZEdnbkxDQjJaWEppT2lkd2IzTjBKMzE5S1RzZ0x5ODlQaUIwY25WbFhISmNiaUFnSUNBdkx5QWdJQ0FnWVhCd0xtTnZiblJsZUhSTllYUmphR1Z6VDNCMGFXOXVjeWhqYjI1MFpYaDBMQ0I3WlhoalpYQjBPaUI3Y0dGMGFEb25JeTl0ZVhCaGRHZ25MQ0IyWlhKaU9pZHdiM04wSjMxOUtUc2dMeTg5UGlCMGNuVmxYSEpjYmlBZ0lDQXZMeUFnSUNBZ1lYQndMbU52Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3loamIyNTBaWGgwTENCN1pYaGpaWEIwT2lCN2NHRjBhRG9uSXk5dGVYQmhkR2duTENCMlpYSmlPaWRuWlhRbmZYMHBPeUF2THowK0lHWmhiSE5sWEhKY2JpQWdJQ0F2THlBZ0lDQWdMeThnYldGMFkyZ2diWFZzZEdsd2JHVWdjR0YwYUhOY2NseHVJQ0FnSUM4dklDQWdJQ0JoY0hBdVkyOXVkR1Y0ZEUxaGRHTm9aWE5QY0hScGIyNXpLR052Ym5SbGVIUXNJSHR3WVhSb09pQmJKeU12Ylhsd1lYUm9KeXdnSnlNdmIzUm9aWEp3WVhSb0oxMTlLVHNnTHk4OVBpQjBjblZsWEhKY2JpQWdJQ0F2THlBZ0lDQWdZWEJ3TG1OdmJuUmxlSFJOWVhSamFHVnpUM0IwYVc5dWN5aGpiMjUwWlhoMExDQjdjR0YwYURvZ1d5Y2pMMjkwYUdWeWNHRjBhQ2NzSUNjakwzUm9hWEprY0dGMGFDZGRmU2s3SUM4dlBUNGdabUZzYzJWY2NseHVJQ0FnSUM4dklDQWdJQ0F2THlCbGNYVnBkbUZzWlc1MElIUnZYSEpjYmlBZ0lDQXZMeUFnSUNBZ1lYQndMbU52Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3loamIyNTBaWGgwTENCN2IyNXNlVG9nZTNCaGRHZzZJRnNuSXk5dGVYQmhkR2duTENBbkl5OXZkR2hsY25CaGRHZ25YWDE5S1RzZ0x5ODlQaUIwY25WbFhISmNiaUFnSUNBdkx5QWdJQ0FnWVhCd0xtTnZiblJsZUhSTllYUmphR1Z6VDNCMGFXOXVjeWhqYjI1MFpYaDBMQ0I3YjI1c2VUb2dlM0JoZEdnNklGc25JeTl2ZEdobGNuQmhkR2duTENBbkl5OTBhR2x5WkhCaGRHZ25YWDE5S1RzZ0x5ODlQaUJtWVd4elpWeHlYRzRnSUNBZ0x5OGdJQ0FnSUM4dklHMWhkR05vSUdGc2JDQmxlR05sY0hRZ2JYVnNkR2x3YkdVZ2NHRjBhSE5jY2x4dUlDQWdJQzh2SUNBZ0lDQmhjSEF1WTI5dWRHVjRkRTFoZEdOb1pYTlBjSFJwYjI1ektHTnZiblJsZUhRc0lIdGxlR05sY0hRNklIdHdZWFJvT2lCYkp5TXZiWGx3WVhSb0p5d2dKeU12YjNSb1pYSndZWFJvSjExOWZTazdJQzh2UFQ0Z1ptRnNjMlZjY2x4dUlDQWdJQzh2SUNBZ0lDQmhjSEF1WTI5dWRHVjRkRTFoZEdOb1pYTlBjSFJwYjI1ektHTnZiblJsZUhRc0lIdGxlR05sY0hRNklIdHdZWFJvT2lCYkp5TXZiM1JvWlhKd1lYUm9KeXdnSnlNdmRHaHBjbVJ3WVhSb0oxMTlmU2s3SUM4dlBUNGdkSEoxWlZ4eVhHNGdJQ0FnTHk4Z0lDQWdJQzh2SUcxaGRHTm9JR0ZzYkNCbGVHTmxjSFFnYlhWc2RHbHdiR1VnY0dGMGFITWdZVzVrSUhabGNtSnpYSEpjYmlBZ0lDQXZMeUFnSUNBZ1lYQndMbU52Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3loamIyNTBaWGgwTENCN1pYaGpaWEIwT2lCN2NHRjBhRG9nV3ljakwyMTVjR0YwYUNjc0lDY2pMMjkwYUdWeWNHRjBhQ2RkTENCMlpYSmlPaUJiSjJkbGRDY3NJQ2R3YjNOMEoxMTlmU2s3SUM4dlBUNGdabUZzYzJWY2NseHVJQ0FnSUM4dklDQWdJQ0JoY0hBdVkyOXVkR1Y0ZEUxaGRHTm9aWE5QY0hScGIyNXpLR052Ym5SbGVIUXNJSHRsZUdObGNIUTZJSHR3WVhSb09pQmJKeU12YjNSb1pYSndZWFJvSnl3Z0p5TXZkR2hwY21Sd1lYUm9KMTBzSUhabGNtSTZJRnNuWjJWMEp5d2dKM0J2YzNRblhYMTlLVHNnTHk4OVBpQjBjblZsWEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnWTI5dWRHVjRkRTFoZEdOb1pYTlBjSFJwYjI1ek9pQm1kVzVqZEdsdmJpaGpiMjUwWlhoMExDQnRZWFJqYUY5dmNIUnBiMjV6TENCd2IzTnBkR2wyWlNrZ2UxeHlYRzRnSUNBZ0lDQjJZWElnYjNCMGFXOXVjeUE5SUcxaGRHTm9YMjl3ZEdsdmJuTTdYSEpjYmlBZ0lDQWdJQzh2SUc1dmNtMWhiR2w2WlNCdmNIUnBiMjV6WEhKY2JpQWdJQ0FnSUdsbUlDaDBlWEJsYjJZZ2IzQjBhVzl1Y3lBOVBUMGdKM04wY21sdVp5Y2dmSHdnWDJselVtVm5SWGh3S0c5d2RHbHZibk1wS1NCN1hISmNiaUFnSUNBZ0lDQWdiM0IwYVc5dWN5QTlJSHR3WVhSb09pQnZjSFJwYjI1emZUdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0JwWmlBb2RIbHdaVzltSUhCdmMybDBhWFpsSUQwOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4eVhHNGdJQ0FnSUNBZ0lIQnZjMmwwYVhabElEMGdkSEoxWlR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQXZMeUJsYlhCMGVTQnZjSFJwYjI1eklHRnNkMkY1Y3lCdFlYUmphRnh5WEc0Z0lDQWdJQ0JwWmlBb0pDNXBjMFZ0Y0hSNVQySnFaV04wS0c5d2RHbHZibk1wS1NCN1hISmNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUnlkV1U3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0x5OGdSRzhnZDJVZ2FHRjJaU0IwYnlCdFlYUmphQ0JoWjJGcGJuTjBJRzExYkhScGNHeGxJSEJoZEdoelAxeHlYRzRnSUNBZ0lDQnBaaUFvWDJselFYSnlZWGtvYjNCMGFXOXVjeTV3WVhSb0tTbDdYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlISmxjM1ZzZEhNc0lHNTFiVzl3ZEN3Z2IzQjBjeXdnYkdWdU8xeHlYRzRnSUNBZ0lDQWdJSEpsYzNWc2RITWdQU0JiWFR0Y2NseHVJQ0FnSUNBZ0lDQm1iM0lnS0c1MWJXOXdkQ0E5SURBc0lHeGxiaUE5SUc5d2RHbHZibk11Y0dGMGFDNXNaVzVuZEdnN0lHNTFiVzl3ZENBOElHeGxianNnYm5WdGIzQjBJQ3M5SURFcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUc5d2RITWdQU0FrTG1WNGRHVnVaQ2g3ZlN3Z2IzQjBhVzl1Y3l3Z2UzQmhkR2c2SUc5d2RHbHZibk11Y0dGMGFGdHVkVzF2Y0hSZGZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNCeVpYTjFiSFJ6TG5CMWMyZ29kR2hwY3k1amIyNTBaWGgwVFdGMFkyaGxjMDl3ZEdsdmJuTW9ZMjl1ZEdWNGRDd2diM0IwY3lrcE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCMllYSWdiV0YwWTJobFpDQTlJQ1F1YVc1QmNuSmhlU2gwY25WbExDQnlaWE4xYkhSektTQStJQzB4SUQ4Z2RISjFaU0E2SUdaaGJITmxPMXh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ3YjNOcGRHbDJaU0EvSUcxaGRHTm9aV1FnT2lBaGJXRjBZMmhsWkR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQnBaaUFvYjNCMGFXOXVjeTV2Ym14NUtTQjdYSEpjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVkyOXVkR1Y0ZEUxaGRHTm9aWE5QY0hScGIyNXpLR052Ym5SbGVIUXNJRzl3ZEdsdmJuTXViMjVzZVN3Z2RISjFaU2s3WEhKY2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2IzQjBhVzl1Y3k1bGVHTmxjSFFwSUh0Y2NseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTVqYjI1MFpYaDBUV0YwWTJobGMwOXdkR2x2Ym5Nb1kyOXVkR1Y0ZEN3Z2IzQjBhVzl1Y3k1bGVHTmxjSFFzSUdaaGJITmxLVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCMllYSWdjR0YwYUY5dFlYUmphR1ZrSUQwZ2RISjFaU3dnZG1WeVlsOXRZWFJqYUdWa0lEMGdkSEoxWlR0Y2NseHVJQ0FnSUNBZ2FXWWdLRzl3ZEdsdmJuTXVjR0YwYUNrZ2UxeHlYRzRnSUNBZ0lDQWdJR2xtSUNnaFgybHpVbVZuUlhod0tHOXdkR2x2Ym5NdWNHRjBhQ2twSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJRzl3ZEdsdmJuTXVjR0YwYUNBOUlHNWxkeUJTWldkRmVIQW9iM0IwYVc5dWN5NXdZWFJvTG5SdlUzUnlhVzVuS0NrZ0t5QW5KQ2NwTzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0J3WVhSb1gyMWhkR05vWldRZ1BTQnZjSFJwYjI1ekxuQmhkR2d1ZEdWemRDaGpiMjUwWlhoMExuQmhkR2dwTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lHbG1JQ2h2Y0hScGIyNXpMblpsY21JcElIdGNjbHh1SUNBZ0lDQWdJQ0JwWmloMGVYQmxiMllnYjNCMGFXOXVjeTUyWlhKaUlEMDlQU0FuYzNSeWFXNW5KeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdkbVZ5WWw5dFlYUmphR1ZrSUQwZ2IzQjBhVzl1Y3k1MlpYSmlJRDA5UFNCamIyNTBaWGgwTG5abGNtSTdYSEpjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lIWmxjbUpmYldGMFkyaGxaQ0E5SUc5d2RHbHZibk11ZG1WeVlpNXBibVJsZUU5bUtHTnZiblJsZUhRdWRtVnlZaWtnUGlBdE1UdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUhCdmMybDBhWFpsSUQ4Z0tIWmxjbUpmYldGMFkyaGxaQ0FtSmlCd1lYUm9YMjFoZEdOb1pXUXBJRG9nSVNoMlpYSmlYMjFoZEdOb1pXUWdKaVlnY0dGMGFGOXRZWFJqYUdWa0tUdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNWNjbHh1SUNBZ0lDOHZJRVJsYkdWbllYUmxjeUIwYnlCMGFHVWdZR3h2WTJGMGFXOXVYM0J5YjNoNVlDQjBieUJuWlhRZ2RHaGxJR04xY25KbGJuUWdiRzlqWVhScGIyNHVYSEpjYmlBZ0lDQXZMeUJUWldVZ1lGTmhiVzE1TGtSbFptRjFiSFJNYjJOaGRHbHZibEJ5YjNoNVlDQm1iM0lnYlc5eVpTQnBibVp2SUc5dUlHeHZZMkYwYVc5dUlIQnliM2hwWlhNdVhISmNiaUFnSUNCblpYUk1iMk5oZEdsdmJqb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxsOXNiMk5oZEdsdmJsOXdjbTk0ZVM1blpYUk1iMk5oZEdsdmJpZ3BPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5QkVaV3hsWjJGMFpYTWdkRzhnZEdobElHQnNiMk5oZEdsdmJsOXdjbTk0ZVdBZ2RHOGdjMlYwSUhSb1pTQmpkWEp5Wlc1MElHeHZZMkYwYVc5dUxseHlYRzRnSUNBZ0x5OGdVMlZsSUdCVFlXMXRlUzVFWldaaGRXeDBURzlqWVhScGIyNVFjbTk0ZVdBZ1ptOXlJRzF2Y21VZ2FXNW1ieUJ2YmlCc2IyTmhkR2x2YmlCd2NtOTRhV1Z6TGx4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDTWpJeUJCY21kMWJXVnVkSE5jY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBcUlHQnVaWGRmYkc5allYUnBiMjVnSUVFZ2JtVjNJR3h2WTJGMGFXOXVJSE4wY21sdVp5QW9aUzVuTGlBbkl5OG5LVnh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJSE5sZEV4dlkyRjBhVzl1T2lCbWRXNWpkR2x2YmlodVpYZGZiRzlqWVhScGIyNHBJSHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVgyeHZZMkYwYVc5dVgzQnliM2g1TG5ObGRFeHZZMkYwYVc5dUtHNWxkMTlzYjJOaGRHbHZiaWs3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRk4zWVhCeklIUm9aU0JqYjI1MFpXNTBJRzltSUdBa1pXeGxiV1Z1ZENncFlDQjNhWFJvSUdCamIyNTBaVzUwWUZ4eVhHNGdJQ0FnTHk4Z1dXOTFJR05oYmlCdmRtVnljbWxrWlNCMGFHbHpJRzFsZEdodlpDQjBieUJ3Y205MmFXUmxJR0Z1SUdGc2RHVnlibUYwWlNCemQyRndJR0psYUdGMmFXOXlYSEpjYmlBZ0lDQXZMeUJtYjNJZ1lFVjJaVzUwUTI5dWRHVjRkQzV3WVhKMGFXRnNLQ2xnTGx4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDTWpJeUJGZUdGdGNHeGxYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQjJZWElnWVhCd0lEMGdKQzV6WVcxdGVTaG1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnTHk4Z2FXMXdiR1Z0Wlc1MGN5QmhJQ2RtWVdSbElHOTFkQ2N2SjJaaFpHVWdhVzRuWEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnZEdocGN5NXpkMkZ3SUQwZ1puVnVZM1JwYjI0b1kyOXVkR1Z1ZEN3Z1kyRnNiR0poWTJzcElIdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJSFpoY2lCamIyNTBaWGgwSUQwZ2RHaHBjenRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUdOdmJuUmxlSFF1SkdWc1pXMWxiblFvS1M1bVlXUmxUM1YwS0NkemJHOTNKeXdnWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJR052Ym5SbGVIUXVKR1ZzWlcxbGJuUW9LUzVvZEcxc0tHTnZiblJsYm5RcE8xeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQWdJQ0JqYjI1MFpYaDBMaVJsYkdWdFpXNTBLQ2t1Wm1Ga1pVbHVLQ2R6Ykc5M0p5d2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dOaGJHeGlZV05yS1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCallXeHNZbUZqYXk1aGNIQnNlU2dwTzF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNCOU8xeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdjM2RoY0RvZ1puVnVZM1JwYjI0b1kyOXVkR1Z1ZEN3Z1kyRnNiR0poWTJzcElIdGNjbHh1SUNBZ0lDQWdkbUZ5SUNSbGJDQTlJSFJvYVhNdUpHVnNaVzFsYm5Rb0tTNW9kRzFzS0dOdmJuUmxiblFwTzF4eVhHNGdJQ0FnSUNCcFppQW9YMmx6Um5WdVkzUnBiMjRvWTJGc2JHSmhZMnNwS1NCN0lHTmhiR3hpWVdOcktHTnZiblJsYm5RcE95QjlYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQWtaV3c3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJR0VnYzJsdGNHeGxJR2RzYjJKaGJDQmpZV05vWlNCbWIzSWdkR1Z0Y0d4aGRHVnpMaUJWYzJWeklIUm9aU0J6WVcxbElITmxiV0Z1ZEdsamN5QmhjMXh5WEc0Z0lDQWdMeThnWUZOaGJXMTVMa05oWTJobFlDQmhibVFnWUZOaGJXMTVMbE4wYjNKaFoyVmdJSE52SUdOaGJpQmxZWE5wYkhrZ1ltVWdjbVZ3YkdGalpXUWdkMmwwYUZ4eVhHNGdJQ0FnTHk4Z1lTQndaWEp6YVhOMFpXNTBJSE4wYjNKaFoyVWdkR2hoZENCc1lYTjBjeUJpWlhsdmJtUWdkR2hsSUdOMWNuSmxiblFnY21WeGRXVnpkQzVjY2x4dUlDQWdJSFJsYlhCc1lYUmxRMkZqYUdVNklHWjFibU4wYVc5dUtHdGxlU3dnZG1Gc2RXVXBJSHRjY2x4dUlDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCMllXeDFaU0FoUFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJmZEdWdGNHeGhkR1ZmWTJGamFHVmJhMlY1WFNBOUlIWmhiSFZsTzF4eVhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCZmRHVnRjR3hoZEdWZlkyRmphR1ZiYTJWNVhUdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5QmpiR1ZoY2lCMGFHVWdkR1Z0Y0d4aGRHVkRZV05vWlZ4eVhHNGdJQ0FnWTJ4bFlYSlVaVzF3YkdGMFpVTmhZMmhsT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlDaGZkR1Z0Y0d4aGRHVmZZMkZqYUdVZ1BTQjdmU2s3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRlJvYVhNZ2RHaHliM2R6SUdFZ0p6UXdOQ0JPYjNRZ1JtOTFibVFuSUdWeWNtOXlJR0o1SUdsdWRtOXJhVzVuSUdCbGNuSnZjaWdwWUM1Y2NseHVJQ0FnSUM4dklFOTJaWEp5YVdSbElIUm9hWE1nYldWMGFHOWtJRzl5SUdCbGNuSnZjaWdwWUNCMGJ5QndjbTkyYVdSbElHTjFjM1J2YlZ4eVhHNGdJQ0FnTHk4Z05EQTBJR0psYUdGMmFXOXlJQ2hwTG1VZ2NtVmthWEpsWTNScGJtY2dkRzhnTHlCdmNpQnphRzkzYVc1bklHRWdkMkZ5Ym1sdVp5bGNjbHh1SUNBZ0lHNXZkRVp2ZFc1a09pQm1kVzVqZEdsdmJpaDJaWEppTENCd1lYUm9LU0I3WEhKY2JpQWdJQ0FnSUhaaGNpQnlaWFFnUFNCMGFHbHpMbVZ5Y205eUtGc25OREEwSUU1dmRDQkdiM1Z1WkNjc0lIWmxjbUlzSUhCaGRHaGRMbXB2YVc0b0p5QW5LU2s3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUFvZG1WeVlpQTlQVDBnSjJkbGRDY3BJRDhnY21WMElEb2dkSEoxWlR0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnVkdobElHSmhjMlVnWlhKeWIzSWdhR0Z1Wkd4bGNpQjBZV3RsY3lCaElITjBjbWx1WnlCZ2JXVnpjMkZuWldBZ1lXNWtJR0Z1SUdCRmNuSnZjbUJjY2x4dUlDQWdJQzh2SUc5aWFtVmpkQzRnU1dZZ1lISmhhWE5sWDJWeWNtOXljMkFnYVhNZ2MyVjBJSFJ2SUdCMGNuVmxZQ0J2YmlCMGFHVWdZWEJ3SUd4bGRtVnNMRnh5WEc0Z0lDQWdMeThnZEdocGN5QjNhV3hzSUhKbExYUm9jbTkzSUhSb1pTQmxjbkp2Y2lCMGJ5QjBhR1VnWW5KdmQzTmxjaTRnVDNSb1pYSjNhWE5sSUdsMElIZHBiR3dnYzJWdVpDQjBhR1VnWlhKeWIzSmNjbHh1SUNBZ0lDOHZJSFJ2SUdCc2IyY29LV0F1SUU5MlpYSnlhV1JsSUhSb2FYTWdiV1YwYUc5a0lIUnZJSEJ5YjNacFpHVWdZM1Z6ZEc5dElHVnljbTl5SUdoaGJtUnNhVzVuWEhKY2JpQWdJQ0F2THlCbExtY2diRzluWjJsdVp5QjBieUJoSUhObGNuWmxjaUJ6YVdSbElHTnZiWEJ2Ym1WdWRDQnZjaUJrYVhOd2JHRjVhVzVuSUhOdmJXVWdabVZsWkdKaFkyc2dkRzhnZEdobFhISmNiaUFnSUNBdkx5QjFjMlZ5TGx4eVhHNGdJQ0FnWlhKeWIzSTZJR1oxYm1OMGFXOXVLRzFsYzNOaFoyVXNJRzl5YVdkcGJtRnNYMlZ5Y205eUtTQjdYSEpjYmlBZ0lDQWdJR2xtSUNnaGIzSnBaMmx1WVd4ZlpYSnliM0lwSUhzZ2IzSnBaMmx1WVd4ZlpYSnliM0lnUFNCdVpYY2dSWEp5YjNJb0tUc2dmVnh5WEc0Z0lDQWdJQ0J2Y21sbmFXNWhiRjlsY25KdmNpNXRaWE56WVdkbElEMGdXMjFsYzNOaFoyVXNJRzl5YVdkcGJtRnNYMlZ5Y205eUxtMWxjM05oWjJWZExtcHZhVzRvSnlBbktUdGNjbHh1SUNBZ0lDQWdkR2hwY3k1MGNtbG5aMlZ5S0NkbGNuSnZjaWNzSUh0dFpYTnpZV2RsT2lCdmNtbG5hVzVoYkY5bGNuSnZjaTV0WlhOellXZGxMQ0JsY25KdmNqb2diM0pwWjJsdVlXeGZaWEp5YjNKOUtUdGNjbHh1SUNBZ0lDQWdhV1lnS0hSb2FYTXVjbUZwYzJWZlpYSnliM0p6S1NCN1hISmNiaUFnSUNBZ0lDQWdkR2h5YjNjb2IzSnBaMmx1WVd4ZlpYSnliM0lwTzF4eVhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lIUm9hWE11Ykc5bktHOXlhV2RwYm1Gc1gyVnljbTl5TG0xbGMzTmhaMlVzSUc5eWFXZHBibUZzWDJWeWNtOXlLVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQmZZMmhsWTJ0TWIyTmhkR2x2YmpvZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJSFpoY2lCc2IyTmhkR2x2Yml3Z2NtVjBkWEp1WldRN1hISmNiaUFnSUNBZ0lDOHZJR2RsZENCamRYSnlaVzUwSUd4dlkyRjBhVzl1WEhKY2JpQWdJQ0FnSUd4dlkyRjBhVzl1SUQwZ2RHaHBjeTVuWlhSTWIyTmhkR2x2YmlncE8xeHlYRzRnSUNBZ0lDQXZMeUJqYjIxd1lYSmxJSFJ2SUhObFpTQnBaaUJvWVhOb0lHaGhjeUJqYUdGdVoyVmtYSEpjYmlBZ0lDQWdJR2xtSUNnaGRHaHBjeTVzWVhOMFgyeHZZMkYwYVc5dUlIeDhJSFJvYVhNdWJHRnpkRjlzYjJOaGRHbHZibHN3WFNBaFBTQW5aMlYwSnlCOGZDQjBhR2x6TG14aGMzUmZiRzlqWVhScGIyNWJNVjBnSVQwZ2JHOWpZWFJwYjI0cElIdGNjbHh1SUNBZ0lDQWdJQ0F2THlCeVpYTmxkQ0JzWVhOMElHeHZZMkYwYVc5dVhISmNiaUFnSUNBZ0lDQWdkR2hwY3k1c1lYTjBYMnh2WTJGMGFXOXVJRDBnV3lkblpYUW5MQ0JzYjJOaGRHbHZibDA3WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiRzl2YTNWd0lISnZkWFJsSUdadmNpQmpkWEp5Wlc1MElHaGhjMmhjY2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTVsWkNBOUlIUm9hWE11Y25WdVVtOTFkR1VvSjJkbGRDY3NJR3h2WTJGMGFXOXVLVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCeVpYUjFjbTRnY21WMGRYSnVaV1E3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lGOW5aWFJHYjNKdFZtVnlZam9nWm5WdVkzUnBiMjRvWm05eWJTa2dlMXh5WEc0Z0lDQWdJQ0IyWVhJZ0pHWnZjbTBnUFNBa0tHWnZjbTBwTENCMlpYSmlMQ0FrWDIxbGRHaHZaRHRjY2x4dUlDQWdJQ0FnSkY5dFpYUm9iMlFnUFNBa1ptOXliUzVtYVc1a0tDZHBibkIxZEZ0dVlXMWxQVndpWDIxbGRHaHZaRndpWFNjcE8xeHlYRzRnSUNBZ0lDQnBaaUFvSkY5dFpYUm9iMlF1YkdWdVozUm9JRDRnTUNrZ2V5QjJaWEppSUQwZ0pGOXRaWFJvYjJRdWRtRnNLQ2s3SUgxY2NseHVJQ0FnSUNBZ2FXWWdLQ0YyWlhKaUtTQjdJSFpsY21JZ1BTQWtabTl5YlZzd1hTNW5aWFJCZEhSeWFXSjFkR1VvSjIxbGRHaHZaQ2NwT3lCOVhISmNiaUFnSUNBZ0lHbG1JQ2doZG1WeVlpQjhmQ0IyWlhKaUlEMDlQU0FuSnlrZ2V5QjJaWEppSUQwZ0oyZGxkQ2M3SUgxY2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUNRdWRISnBiU2gyWlhKaUxuUnZVM1J5YVc1bktDa3VkRzlNYjNkbGNrTmhjMlVvS1NrN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJRjlqYUdWamEwWnZjbTFUZFdKdGFYTnphVzl1T2lCbWRXNWpkR2x2YmlobWIzSnRLU0I3WEhKY2JpQWdJQ0FnSUhaaGNpQWtabTl5YlN3Z2NHRjBhQ3dnZG1WeVlpd2djR0Z5WVcxekxDQnlaWFIxY201bFpEdGNjbHh1SUNBZ0lDQWdkR2hwY3k1MGNtbG5aMlZ5S0NkamFHVmpheTFtYjNKdExYTjFZbTFwYzNOcGIyNG5MQ0I3Wm05eWJUb2dabTl5YlgwcE8xeHlYRzRnSUNBZ0lDQWtabTl5YlNBOUlDUW9abTl5YlNrN1hISmNiaUFnSUNBZ0lIQmhkR2dnSUQwZ0pHWnZjbTB1WVhSMGNpZ25ZV04wYVc5dUp5a2dmSHdnSnljN1hISmNiaUFnSUNBZ0lIWmxjbUlnSUQwZ2RHaHBjeTVmWjJWMFJtOXliVlpsY21Jb0pHWnZjbTBwTzF4eVhHNWNjbHh1SUNBZ0lDQWdhV1lnS0hSb2FYTXVaR1ZpZFdjcElIdGNjbHh1SUNBZ0lDQWdJQ0IwYUdsekxteHZaeWduWDJOb1pXTnJSbTl5YlZOMVltMXBjM05wYjI0bkxDQWtabTl5YlN3Z2NHRjBhQ3dnZG1WeVlpazdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lHbG1JQ2gyWlhKaUlEMDlQU0FuWjJWMEp5a2dlMXh5WEc0Z0lDQWdJQ0FnSUhCaGNtRnRjeUE5SUhSb2FYTXVYM05sY21saGJHbDZaVVp2Y20xUVlYSmhiWE1vSkdadmNtMHBPMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDaHdZWEpoYlhNZ0lUMDlJQ2NuS1NCN0lIQmhkR2dnS3owZ0p6OG5JQ3NnY0dGeVlXMXpPeUI5WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTV6WlhSTWIyTmhkR2x2Ymlod1lYUm9LVHRjY2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTVsWkNBOUlHWmhiSE5sTzF4eVhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lIQmhjbUZ0Y3lBOUlDUXVaWGgwWlc1a0tIdDlMQ0IwYUdsekxsOXdZWEp6WlVadmNtMVFZWEpoYlhNb0pHWnZjbTBwS1R0Y2NseHVJQ0FnSUNBZ0lDQnlaWFIxY201bFpDQTlJSFJvYVhNdWNuVnVVbTkxZEdVb2RtVnlZaXdnY0dGMGFDd2djR0Z5WVcxekxDQm1iM0p0TG1kbGRDZ3dLU2s3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUNoMGVYQmxiMllnY21WMGRYSnVaV1FnUFQwZ0ozVnVaR1ZtYVc1bFpDY3BJRDhnWm1Gc2MyVWdPaUJ5WlhSMWNtNWxaRHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ1gzTmxjbWxoYkdsNlpVWnZjbTFRWVhKaGJYTTZJR1oxYm1OMGFXOXVLQ1JtYjNKdEtTQjdYSEpjYmlBZ0lDQWdJQ0IyWVhJZ2NYVmxjbmxUZEhKcGJtY2dQU0JjSWx3aUxGeHlYRzRnSUNBZ0lDQWdJQ0JtYVdWc1pITWdQU0FrWm05eWJTNXpaWEpwWVd4cGVtVkJjbkpoZVNncExGeHlYRzRnSUNBZ0lDQWdJQ0JwTzF4eVhHNGdJQ0FnSUNBZ2FXWWdLR1pwWld4a2N5NXNaVzVuZEdnZ1BpQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lIRjFaWEo1VTNSeWFXNW5JRDBnZEdocGN5NWZaVzVqYjJSbFJtOXliVkJoYVhJb1ptbGxiR1J6V3pCZExtNWhiV1VzSUdacFpXeGtjMXN3WFM1MllXeDFaU2s3WEhKY2JpQWdJQ0FnSUNBZ0lHWnZjaUFvYVNBOUlERTdJR2tnUENCbWFXVnNaSE11YkdWdVozUm9PeUJwS3lzcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNCeGRXVnllVk4wY21sdVp5QTlJSEYxWlhKNVUzUnlhVzVuSUNzZ1hDSW1YQ0lnS3lCMGFHbHpMbDlsYm1OdlpHVkdiM0p0VUdGcGNpaG1hV1ZzWkhOYmFWMHVibUZ0WlN3Z1ptbGxiR1J6VzJsZExuWmhiSFZsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ2NtVjBkWEp1SUhGMVpYSjVVM1J5YVc1bk8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0JmWlc1amIyUmxSbTl5YlZCaGFYSTZJR1oxYm1OMGFXOXVLRzVoYldVc0lIWmhiSFZsS1h0Y2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUY5bGJtTnZaR1VvYm1GdFpTa2dLeUJjSWoxY0lpQXJJRjlsYm1OdlpHVW9kbUZzZFdVcE8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0JmY0dGeWMyVkdiM0p0VUdGeVlXMXpPaUJtZFc1amRHbHZiaWdrWm05eWJTa2dlMXh5WEc0Z0lDQWdJQ0IyWVhJZ2NHRnlZVzF6SUQwZ2UzMHNYSEpjYmlBZ0lDQWdJQ0FnSUNCbWIzSnRYMlpwWld4a2N5QTlJQ1JtYjNKdExuTmxjbWxoYkdsNlpVRnljbUY1S0Nrc1hISmNiaUFnSUNBZ0lDQWdJQ0JwTzF4eVhHNGdJQ0FnSUNCbWIzSWdLR2tnUFNBd095QnBJRHdnWm05eWJWOW1hV1ZzWkhNdWJHVnVaM1JvT3lCcEt5c3BJSHRjY2x4dUlDQWdJQ0FnSUNCd1lYSmhiWE1nUFNCMGFHbHpMbDl3WVhKelpWQmhjbUZ0VUdGcGNpaHdZWEpoYlhNc0lHWnZjbTFmWm1sbGJHUnpXMmxkTG01aGJXVXNJR1p2Y20xZlptbGxiR1J6VzJsZExuWmhiSFZsS1R0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2NHRnlZVzF6TzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQmZjR0Z5YzJWUmRXVnllVk4wY21sdVp6b2dablZ1WTNScGIyNG9jR0YwYUNrZ2UxeHlYRzRnSUNBZ0lDQjJZWElnY0dGeVlXMXpJRDBnZTMwc0lIQmhjblJ6TENCd1lXbHljeXdnY0dGcGNpd2dhVHRjY2x4dVhISmNiaUFnSUNBZ0lIQmhjblJ6SUQwZ2NHRjBhQzV0WVhSamFDaFJWVVZTV1Y5VFZGSkpUa2RmVFVGVVEwaEZVaWs3WEhKY2JpQWdJQ0FnSUdsbUlDaHdZWEowY3lBbUppQndZWEowYzFzeFhTa2dlMXh5WEc0Z0lDQWdJQ0FnSUhCaGFYSnpJRDBnY0dGeWRITmJNVjB1YzNCc2FYUW9KeVluS1R0Y2NseHVJQ0FnSUNBZ0lDQm1iM0lnS0drZ1BTQXdPeUJwSUR3Z2NHRnBjbk11YkdWdVozUm9PeUJwS3lzcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhCaGFYSWdQU0J3WVdseWMxdHBYUzV6Y0d4cGRDZ25QU2NwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdjR0Z5WVcxeklEMGdkR2hwY3k1ZmNHRnljMlZRWVhKaGJWQmhhWElvY0dGeVlXMXpMQ0JmWkdWamIyUmxLSEJoYVhKYk1GMHBMQ0JmWkdWamIyUmxLSEJoYVhKYk1WMGdmSHdnWENKY0lpa3BPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2NHRnlZVzF6TzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQmZjR0Z5YzJWUVlYSmhiVkJoYVhJNklHWjFibU4wYVc5dUtIQmhjbUZ0Y3l3Z2EyVjVMQ0IyWVd4MVpTa2dlMXh5WEc0Z0lDQWdJQ0JwWmlBb2RIbHdaVzltSUhCaGNtRnRjMXRyWlhsZElDRTlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHlYRzRnSUNBZ0lDQWdJR2xtSUNoZmFYTkJjbkpoZVNod1lYSmhiWE5iYTJWNVhTa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lIQmhjbUZ0YzF0clpYbGRMbkIxYzJnb2RtRnNkV1VwTzF4eVhHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J3WVhKaGJYTmJhMlY1WFNBOUlGdHdZWEpoYlhOYmEyVjVYU3dnZG1Gc2RXVmRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2NseHVJQ0FnSUNBZ0lDQndZWEpoYlhOYmEyVjVYU0E5SUhaaGJIVmxPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUJ3WVhKaGJYTTdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUY5c2FYTjBaVzQ2SUdaMWJtTjBhVzl1S0c1aGJXVXNJR05oYkd4aVlXTnJLU0I3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxpUmxiR1Z0Wlc1MEtDa3VZbWx1WkNoYmJtRnRaU3dnZEdocGN5NWxkbVZ1ZEU1aGJXVnpjR0ZqWlNncFhTNXFiMmx1S0NjdUp5a3NJR05oYkd4aVlXTnJLVHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ1gzVnViR2x6ZEdWdU9pQm1kVzVqZEdsdmJpaHVZVzFsTENCallXeHNZbUZqYXlrZ2UxeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTRrWld4bGJXVnVkQ2dwTG5WdVltbHVaQ2hiYm1GdFpTd2dkR2hwY3k1bGRtVnVkRTVoYldWemNHRmpaU2dwWFM1cWIybHVLQ2N1Snlrc0lHTmhiR3hpWVdOcktUdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdmU2s3WEhKY2JseHlYRzRnSUM4dklHQlRZVzF0ZVM1U1pXNWtaWEpEYjI1MFpYaDBZQ0JwY3lCaGJpQnZZbXBsWTNRZ2RHaGhkQ0J0WVd0bGN5QnpaWEYxWlc1MGFXRnNJSFJsYlhCc1lYUmxJR3h2WVdScGJtY3NYSEpjYmlBZ0x5OGdjbVZ1WkdWeWFXNW5JR0Z1WkNCcGJuUmxjbkJ2YkdGMGFXOXVJSE5sWVcxc1pYTnpJR1YyWlc0Z2QyaGxiaUJrWldGc2FXNW5JSGRwZEdnZ1lYTjVibU5vY205dWIzVnpYSEpjYmlBZ0x5OGdiM0JsY21GMGFXOXVjeTVjY2x4dUlDQXZMMXh5WEc0Z0lDOHZJR0JTWlc1a1pYSkRiMjUwWlhoMFlDQnZZbXBsWTNSeklHRnlaU0J1YjNRZ2RYTjFZV3hzZVNCamNtVmhkR1ZrSUdScGNtVmpkR3g1TENCeVlYUm9aWElnZEdobGVTQmhjbVZjY2x4dUlDQXZMeUJwYm5OMFlXNTBhV0YwWldRZ1puSnZiU0JoYmlCZ1UyRnRiWGt1UlhabGJuUkRiMjUwWlhoMFlDQmllU0IxYzJsdVp5QmdjbVZ1WkdWeUtDbGdMQ0JnYkc5aFpDZ3BZQ0J2Y2x4eVhHNGdJQzh2SUdCd1lYSjBhV0ZzS0NsZ0lIZG9hV05vSUdGc2JDQnlaWFIxY200Z1lGSmxibVJsY2tOdmJuUmxlSFJnSUc5aWFtVmpkSE11WEhKY2JpQWdMeTljY2x4dUlDQXZMeUJnVW1WdVpHVnlRMjl1ZEdWNGRHQWdiV1YwYUc5a2N5QmhiSGRoZVhNZ2NtVjBkWEp1Y3lCaElHMXZaR2xtYVdWa0lHQlNaVzVrWlhKRGIyNTBaWGgwWUZ4eVhHNGdJQzh2SUdadmNpQmphR0ZwYm1sdVp5QW9iR2xyWlNCcVVYVmxjbmtnYVhSelpXeG1LUzVjY2x4dUlDQXZMMXh5WEc0Z0lDOHZJRlJvWlNCamIzSmxJRzFoWjJsaklHbHpJR2x1SUhSb1pTQmdkR2hsYmlncFlDQnRaWFJvYjJRZ2QyaHBZMmdnY0hWMGN5QjBhR1VnWTJGc2JHSmhZMnNnY0dGemMyVmtJR0Z6WEhKY2JpQWdMeThnWVc0Z1lYSm5kVzFsYm5RZ2FXNTBieUJoSUhGMVpYVmxJSFJ2SUdKbElHVjRaV04xZEdWa0lHOXVZMlVnZEdobElIQnlaWFpwYjNWeklHTmhiR3hpWVdOcklHbHpJR052YlhCc1pYUmxMbHh5WEc0Z0lDOHZJRUZzYkNCMGFHVWdiV1YwYUc5a2N5QnZaaUJnVW1WdVpHVnlRMjl1ZEdWNGRHQWdZWEpsSUhkeVlYQndaV1FnYVc0Z1lIUm9aVzRvS1dBZ2QyaHBZMmdnWVd4c2IzZHpJSGx2ZFZ4eVhHNGdJQzh2SUhSdklIRjFaWFZsSUhWd0lHMWxkR2h2WkhNZ1lua2dZMmhoYVc1cGJtY3NJR0oxZENCdFlXbHVkR0ZwYm1sdVp5QmhJR2QxWVhKaGJuUmxaV1FnWlhobFkzVjBhVzl1SUc5eVpHVnlYSEpjYmlBZ0x5OGdaWFpsYmlCM2FYUm9JSEpsYlc5MFpTQmpZV3hzY3lCMGJ5Qm1aWFJqYUNCMFpXMXdiR0YwWlhNdVhISmNiaUFnTHk5Y2NseHVJQ0JUWVcxdGVTNVNaVzVrWlhKRGIyNTBaWGgwSUQwZ1puVnVZM1JwYjI0b1pYWmxiblJmWTI5dWRHVjRkQ2tnZTF4eVhHNGdJQ0FnZEdocGN5NWxkbVZ1ZEY5amIyNTBaWGgwSUNBZ0lEMGdaWFpsYm5SZlkyOXVkR1Y0ZER0Y2NseHVJQ0FnSUhSb2FYTXVZMkZzYkdKaFkydHpJQ0FnSUNBZ0lDQTlJRnRkTzF4eVhHNGdJQ0FnZEdocGN5NXdjbVYyYVc5MWMxOWpiMjUwWlc1MElEMGdiblZzYkR0Y2NseHVJQ0FnSUhSb2FYTXVZMjl1ZEdWdWRDQWdJQ0FnSUNBZ0lDQTlJRzUxYkd3N1hISmNiaUFnSUNCMGFHbHpMbTVsZUhSZlpXNW5hVzVsSUNBZ0lDQWdQU0JtWVd4elpUdGNjbHh1SUNBZ0lIUm9hWE11ZDJGcGRHbHVaeUFnSUNBZ0lDQWdJQ0E5SUdaaGJITmxPMXh5WEc0Z0lIMDdYSEpjYmx4eVhHNGdJRk5oYlcxNUxsSmxibVJsY2tOdmJuUmxlSFF1Y0hKdmRHOTBlWEJsSUQwZ0pDNWxlSFJsYm1Rb2UzMHNJRk5oYlcxNUxrOWlhbVZqZEM1d2NtOTBiM1I1Y0dVc0lIdGNjbHh1WEhKY2JpQWdJQ0F2THlCVWFHVWdYQ0pqYjNKbFhDSWdiMllnZEdobElHQlNaVzVrWlhKRGIyNTBaWGgwWUNCdlltcGxZM1FzSUdGa1pITWdkR2hsSUdCallXeHNZbUZqYTJBZ2RHOGdkR2hsWEhKY2JpQWdJQ0F2THlCeGRXVjFaUzRnU1dZZ2RHaGxJR052Ym5SbGVIUWdhWE1nWUhkaGFYUnBibWRnSUNodFpXRnVhVzVuSUdGdUlHRnplVzVqSUc5d1pYSmhkR2x2YmlCcGN5Qm9ZWEJ3Wlc1cGJtY3BYSEpjYmlBZ0lDQXZMeUIwYUdWdUlIUm9aU0JqWVd4c1ltRmpheUIzYVd4c0lHSmxJR1Y0WldOMWRHVmtJR2x1SUc5eVpHVnlMQ0J2Ym1ObElIUm9aU0J2ZEdobGNpQnZjR1Z5WVhScGIyNXpJR0Z5WlZ4eVhHNGdJQ0FnTHk4Z1kyOXRjR3hsZEdVdUlFbG1JSFJvWlhKbElHbHpJRzV2SUdOMWNuSmxiblJzZVNCbGVHVmpkWFJwYm1jZ2IzQmxjbUYwYVc5dUxDQjBhR1VnWUdOaGJHeGlZV05yWUZ4eVhHNGdJQ0FnTHk4Z2FYTWdaWGhsWTNWMFpXUWdhVzF0WldScFlYUmxiSGt1WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z1ZHaGxJSFpoYkhWbElISmxkSFZ5Ym1Wa0lHWnliMjBnZEdobElHTmhiR3hpWVdOcklHbHpJSE4wYjNKbFpDQnBiaUJnWTI5dWRHVnVkR0FnWm05eUlIUm9aVnh5WEc0Z0lDQWdMeThnYzNWaWMyVnhkV1Z1ZENCdmNHVnlZWFJwYjI0dUlFbG1JSGx2ZFNCeVpYUjFjbTRnWUdaaGJITmxZQ3dnZEdobElIRjFaWFZsSUhkcGJHd2djR0YxYzJVc0lHRnVaRnh5WEc0Z0lDQWdMeThnZEdobElHNWxlSFFnWTJGc2JHSmhZMnNnYVc0Z2RHaGxJSEYxWlhWbElIZHBiR3dnYm05MElHSmxJR1Y0WldOMWRHVmtJSFZ1ZEdsc0lHQnVaWGgwS0NsZ0lHbHpYSEpjYmlBZ0lDQXZMeUJqWVd4c1pXUXVJRlJvYVhNZ1lXeHNiM2R6SUdadmNpQjBhR1VnWjNWaGNtRnVkR1ZsWkNCdmNtUmxjaUJ2WmlCbGVHVmpkWFJwYjI0Z2QyaHBiR1VnZDI5eWEybHVaMXh5WEc0Z0lDQWdMeThnZDJsMGFDQmhjM2x1WXlCdmNHVnlZWFJwYjI1ekxseHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJRWxtSUhSb1pXNG9LU0JwY3lCd1lYTnpaV1FnWVNCemRISnBibWNnYVc1emRHVmhaQ0J2WmlCaElHWjFibU4wYVc5dUxDQjBhR1VnYzNSeWFXNW5JR2x6SUd4dmIydGxaRnh5WEc0Z0lDQWdMeThnZFhBZ1lYTWdZU0JvWld4d1pYSWdiV1YwYUc5a0lHOXVJSFJvWlNCbGRtVnVkQ0JqYjI1MFpYaDBMbHh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNNakl5QkZlR0Z0Y0d4bFhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNCMGFHbHpMbWRsZENnbkl5OG5MQ0JtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBdkx5QnBibWwwYVdGc2FYcGxJSFJvWlNCU1pXNWtaWEpEYjI1MFpYaDBYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdMeThnUlhabGJpQjBhRzkxWjJnZ1lHeHZZV1FvS1dBZ1pYaGxZM1YwWlhNZ1lYTjVibU1zSUhSb1pTQnVaWGgwSUdCMGFHVnVLQ2xnWEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnTHk4Z2QyOXVkQ0JsZUdWamRYUmxJSFZ1ZEdsc0lIUm9aU0JzYjJGa0lHWnBibWx6YUdWelhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ2RHaHBjeTVzYjJGa0tDZHRlV1pwYkdVdWRIaDBKeWxjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ0xuUm9aVzRvWm5WdVkzUnBiMjRvWTI5dWRHVnVkQ2tnZTF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUhSb1pTQm1hWEp6ZENCaGNtZDFiV1Z1ZENCMGJ5QjBhR1Z1SUdseklIUm9aU0JqYjI1MFpXNTBJRzltSUhSb1pWeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklIQnlaWFlnYjNCbGNtRjBhVzl1WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNBZ0lDQWdKQ2duSTIxaGFXNG5LUzVvZEcxc0tHTnZiblJsYm5RcE8xeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnZlNrN1hISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ2RHaGxiam9nWm5WdVkzUnBiMjRvWTJGc2JHSmhZMnNwSUh0Y2NseHVJQ0FnSUNBZ2FXWWdLQ0ZmYVhOR2RXNWpkR2x2YmloallXeHNZbUZqYXlrcElIdGNjbHh1SUNBZ0lDQWdJQ0F2THlCcFppQmhJSE4wY21sdVp5QnBjeUJ3WVhOelpXUWdkRzhnZEdobGJpd2dZWE56ZFcxbElIZGxJSGRoYm5RZ2RHOGdZMkZzYkZ4eVhHNGdJQ0FnSUNBZ0lDOHZJR0VnYUdWc2NHVnlJRzl1SUhSb1pTQmxkbVZ1ZENCamIyNTBaWGgwSUdsdUlHbDBjeUJqYjI1MFpYaDBYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCallXeHNZbUZqYXlBOVBUMGdKM04wY21sdVp5Y2dKaVlnWTJGc2JHSmhZMnNnYVc0Z2RHaHBjeTVsZG1WdWRGOWpiMjUwWlhoMEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCMllYSWdhR1ZzY0dWeUlEMGdkR2hwY3k1bGRtVnVkRjlqYjI1MFpYaDBXMk5oYkd4aVlXTnJYVHRjY2x4dUlDQWdJQ0FnSUNBZ0lHTmhiR3hpWVdOcklEMGdablZ1WTNScGIyNG9ZMjl1ZEdWdWRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2FHVnNjR1Z5TG1Gd2NHeDVLSFJvYVhNdVpYWmxiblJmWTI5dWRHVjRkQ3dnVzJOdmJuUmxiblJkS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJSDA3WEhKY2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0IyWVhJZ1kyOXVkR1Y0ZENBOUlIUm9hWE03WEhKY2JpQWdJQ0FnSUdsbUlDaDBhR2x6TG5kaGFYUnBibWNwSUh0Y2NseHVJQ0FnSUNBZ0lDQjBhR2x6TG1OaGJHeGlZV05yY3k1d2RYTm9LR05oYkd4aVlXTnJLVHRjY2x4dUlDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbmRoYVhRb0tUdGNjbHh1SUNBZ0lDQWdJQ0IzYVc1a2IzY3VjMlYwVkdsdFpXOTFkQ2htZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFpoY2lCeVpYUjFjbTVsWkNBOUlHTmhiR3hpWVdOckxtRndjR3g1S0dOdmJuUmxlSFFzSUZ0amIyNTBaWGgwTG1OdmJuUmxiblFzSUdOdmJuUmxlSFF1Y0hKbGRtbHZkWE5mWTI5dWRHVnVkRjBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdhV1lnS0hKbGRIVnlibVZrSUNFOVBTQm1ZV3h6WlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCamIyNTBaWGgwTG01bGVIUW9jbVYwZFhKdVpXUXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDBzSURBcE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJRWVhWelpTQjBhR1VnWUZKbGJtUmxja052Ym5SbGVIUmdJSEYxWlhWbExpQkRiMjFpYVc1bFpDQjNhWFJvSUdCdVpYaDBLQ2xnSUdGc2JHOTNjeUJtYjNJZ1lYTjVibU5jY2x4dUlDQWdJQzh2SUc5d1pYSmhkR2x2Ym5NdVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJeU1qSUVWNFlXMXdiR1ZjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnZEdocGN5NW5aWFFvSnlNdkp5d2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNCMGFHbHpMbXh2WVdRb0oyMTVkR1Y0ZEM1cWMyOXVKeWxjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ0lDQXVkR2hsYmlobWRXNWpkR2x2YmloamIyNTBaVzUwS1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdZMjl1ZEdWNGRDQTlJSFJvYVhNc1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR0YwWVNBZ0lDQTlJRXBUVDA0dWNHRnljMlVvWTI5dWRHVnVkQ2s3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCd1lYVnpaU0JsZUdWamRYUnBiMjVjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR052Ym5SbGVIUXVkMkZwZENncE8xeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdjRzl6ZENCMGJ5QmhJSFZ5YkZ4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkM1d2IzTjBLR1JoZEdFdWRYSnNMQ0I3ZlN3Z1puVnVZM1JwYjI0b2NtVnpjRzl1YzJVcElIdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjl1ZEdWNGRDNXVaWGgwS0VwVFQwNHVjR0Z5YzJVb2NtVnpjRzl1YzJVcEtUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHBYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUNBZ0xuUm9aVzRvWm5WdVkzUnBiMjRvWkdGMFlTa2dlMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnWkdGMFlTQnBjeUJxYzI5dUlHWnliMjBnZEdobElIQnlaWFpwYjNWeklIQnZjM1JjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1FvSnlOdFpYTnpZV2RsSnlrdWRHVjRkQ2hrWVhSaExuTjBZWFIxY3lrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQjNZV2wwT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdkR2hwY3k1M1lXbDBhVzVuSUQwZ2RISjFaVHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdVbVZ6ZFcxbElIUm9aU0J4ZFdWMVpTd2djMlYwZEdsdVp5QmdZMjl1ZEdWdWRHQWdkRzhnWW1VZ2RYTmxaQ0JwYmlCMGFHVWdibVY0ZENCdmNHVnlZWFJwYjI0dVhISmNiaUFnSUNBdkx5QlRaV1VnWUhkaGFYUW9LV0FnWm05eUlHRnVJR1Y0WVcxd2JHVXVYSEpjYmlBZ0lDQnVaWGgwT2lCbWRXNWpkR2x2YmloamIyNTBaVzUwS1NCN1hISmNiaUFnSUNBZ0lIUm9hWE11ZDJGcGRHbHVaeUE5SUdaaGJITmxPMXh5WEc0Z0lDQWdJQ0JwWmlBb2RIbHdaVzltSUdOdmJuUmxiblFnSVQwOUlDZDFibVJsWm1sdVpXUW5LU0I3WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTV3Y21WMmFXOTFjMTlqYjI1MFpXNTBJRDBnZEdocGN5NWpiMjUwWlc1ME8xeHlYRzRnSUNBZ0lDQWdJSFJvYVhNdVkyOXVkR1Z1ZENBOUlHTnZiblJsYm5RN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdhV1lnS0hSb2FYTXVZMkZzYkdKaFkydHpMbXhsYm1kMGFDQStJREFwSUh0Y2NseHVJQ0FnSUNBZ0lDQjBhR2x6TG5Sb1pXNG9kR2hwY3k1allXeHNZbUZqYTNNdWMyaHBablFvS1NrN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1RHOWhaQ0JoSUhSbGJYQnNZWFJsSUdsdWRHOGdkR2hsSUdOdmJuUmxlSFF1WEhKY2JpQWdJQ0F2THlCVWFHVWdZR3h2WTJGMGFXOXVZQ0JqWVc0Z1pXbDBhR1Z5SUdKbElHRWdjM1J5YVc1bklITndaV05wWm5scGJtY2dkR2hsSUhKbGJXOTBaU0J3WVhSb0lIUnZJSFJvWlZ4eVhHNGdJQ0FnTHk4Z1ptbHNaU3dnWVNCcVVYVmxjbmtnYjJKcVpXTjBMQ0J2Y2lCaElFUlBUU0JsYkdWdFpXNTBMbHh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUU1dklHbHVkR1Z5Y0c5c1lYUnBiMjRnYUdGd2NHVnVjeUJpZVNCa1pXWmhkV3gwTENCMGFHVWdZMjl1ZEdWdWRDQnBjeUJ6ZEc5eVpXUWdhVzVjY2x4dUlDQWdJQzh2SUdCamIyNTBaVzUwWUM1Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QkpiaUIwYUdVZ1kyRnpaU0J2WmlCaElIQmhkR2dzSUhWdWJHVnpjeUIwYUdVZ2IzQjBhVzl1SUdCN1kyRmphR1U2SUdaaGJITmxmV0FnYVhNZ2NHRnpjMlZrSUhSb1pWeHlYRzRnSUNBZ0x5OGdaR0YwWVNCcGN5QnpkRzl5WldRZ2FXNGdkR2hsSUdGd2NDZHpJR0IwWlcxd2JHRjBaVU5oWTJobEtDbGdMbHh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUVsbUlHRWdhbEYxWlhKNUlHOXlJRVJQVFNCdlltcGxZM1FnYVhNZ2NHRnpjMlZrSUhSb1pTQmdhVzV1WlhKSVZFMU1ZQ0J2WmlCMGFHVWdibTlrWlNCcGN5QndkV3hzWldRZ2FXNHVYSEpjYmlBZ0lDQXZMeUJVYUdseklHbHpJSFZ6WldaMWJDQm1iM0lnYm1WemRHbHVaeUIwWlcxd2JHRjBaWE1nWVhNZ2NHRnlkQ0J2WmlCMGFHVWdhVzVwZEdsaGJDQndZV2RsSUd4dllXUWdkM0poY0hCbFpGeHlYRzRnSUNBZ0x5OGdhVzRnYVc1MmFYTnBZbXhsSUdWc1pXMWxiblJ6SUc5eUlHQThjMk55YVhCMFBtQWdkR0ZuY3k0Z1YybDBhQ0IwWlcxd2JHRjBaU0J3WVhSb2N5d2dkR2hsSUhSbGJYQnNZWFJsWEhKY2JpQWdJQ0F2THlCbGJtZHBibVVnYVhNZ2JHOXZhMlZrSUhWd0lHSjVJSFJvWlNCbGVIUmxibk5wYjI0dUlFWnZjaUJFVDAwdmFsRjFaWEo1SUdWdFltVmtaR1ZrSUhSbGJYQnNZWFJsY3l4Y2NseHVJQ0FnSUM4dklIUm9hWE1nYVhOdWRDQndiM056YVdKc1pTd2djMjhnZEdobGNtVWdZWEpsSUdFZ1kyOTFjR3hsSUc5bUlHOXdkR2x2Ym5NNlhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJQ29nY0dGemN5QmhiaUJnZTJWdVoybHVaVHA5WUNCdmNIUnBiMjR1WEhKY2JpQWdJQ0F2THlBZ0tpQmtaV1pwYm1VZ2RHaGxJR1Z1WjJsdVpTQnBiaUIwYUdVZ1lHUmhkR0V0Wlc1bmFXNWxZQ0JoZEhSeWFXSjFkR1VnYjJZZ2RHaGxJSEJoYzNObFpDQnViMlJsTGx4eVhHNGdJQ0FnTHk4Z0lDb2dhblZ6ZENCemRHOXlaU0IwYUdVZ2NtRjNJSFJsYlhCc1lYUmxJR1JoZEdFZ1lXNWtJSFZ6WlNCZ2FXNTBaWEp3YjJ4aGRHVW9LV0FnYldGdWRXRnNiSGxjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlCSlppQmhJR0JqWVd4c1ltRmphMkFnYVhNZ2NHRnpjMlZrSUdsMElHbHpJR1Y0WldOMWRHVmtJR0ZtZEdWeUlIUm9aU0IwWlcxd2JHRjBaU0JzYjJGa0xseHlYRzRnSUNBZ2JHOWhaRG9nWm5WdVkzUnBiMjRvYkc5allYUnBiMjRzSUc5d2RHbHZibk1zSUdOaGJHeGlZV05yS1NCN1hISmNiaUFnSUNBZ0lIWmhjaUJqYjI1MFpYaDBJRDBnZEdocGN6dGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11ZEdobGJpaG1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNCMllYSWdjMmh2ZFd4a1gyTmhZMmhsTENCallXTm9aV1FzSUdselgycHpiMjRzSUd4dlkyRjBhVzl1WDJGeWNtRjVPMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDaGZhWE5HZFc1amRHbHZiaWh2Y0hScGIyNXpLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdZMkZzYkdKaFkyc2dQU0J2Y0hScGIyNXpPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2IzQjBhVzl1Y3lBOUlIdDlPMXh5WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnZjSFJwYjI1eklEMGdKQzVsZUhSbGJtUW9lMzBzSUc5d2RHbHZibk1wTzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0JwWmlBb1kyRnNiR0poWTJzcElIc2dkR2hwY3k1MGFHVnVLR05oYkd4aVlXTnJLVHNnZlZ4eVhHNGdJQ0FnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdiRzlqWVhScGIyNGdQVDA5SUNkemRISnBibWNuS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0F2THlCcGRDZHpJR0VnY0dGMGFGeHlYRzRnSUNBZ0lDQWdJQ0FnYVhOZmFuTnZiaUFnSUNBZ0lEMGdLR3h2WTJGMGFXOXVMbTFoZEdOb0tDOWNYQzVxYzI5dUtGeGNQM3drS1M4cElIeDhJRzl3ZEdsdmJuTXVhbk52YmlrN1hISmNiaUFnSUNBZ0lDQWdJQ0J6YUc5MWJHUmZZMkZqYUdVZ1BTQnBjMTlxYzI5dUlEOGdiM0IwYVc5dWN5NWpZV05vWlNBOVBUMGdkSEoxWlNBNklHOXdkR2x2Ym5NdVkyRmphR1VnSVQwOUlHWmhiSE5sTzF4eVhHNGdJQ0FnSUNBZ0lDQWdZMjl1ZEdWNGRDNXVaWGgwWDJWdVoybHVaU0E5SUdOdmJuUmxlSFF1WlhabGJuUmZZMjl1ZEdWNGRDNWxibWRwYm1WR2IzSW9iRzlqWVhScGIyNHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ1pHVnNaWFJsSUc5d2RHbHZibk11WTJGamFHVTdYSEpjYmlBZ0lDQWdJQ0FnSUNCa1pXeGxkR1VnYjNCMGFXOXVjeTVxYzI5dU8xeHlYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tHOXdkR2x2Ym5NdVpXNW5hVzVsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdOdmJuUmxlSFF1Ym1WNGRGOWxibWRwYm1VZ1BTQnZjSFJwYjI1ekxtVnVaMmx1WlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWkdWc1pYUmxJRzl3ZEdsdmJuTXVaVzVuYVc1bE8xeHlYRzRnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdhV1lnS0hOb2IzVnNaRjlqWVdOb1pTQW1KaUFvWTJGamFHVmtJRDBnZEdocGN5NWxkbVZ1ZEY5amIyNTBaWGgwTG1Gd2NDNTBaVzF3YkdGMFpVTmhZMmhsS0d4dlkyRjBhVzl1S1NrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdOaFkyaGxaRHRjY2x4dUlDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXVkMkZwZENncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSkM1aGFtRjRLQ1F1WlhoMFpXNWtLSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkWEpzT2lCc2IyTmhkR2x2Yml4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWkdGMFlUb2dlMzBzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR1JoZEdGVWVYQmxPaUJwYzE5cWMyOXVJRDhnSjJwemIyNG5JRG9nSjNSbGVIUW5MRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBlWEJsT2lBbloyVjBKeXhjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjM1ZqWTJWemN6b2dablZ1WTNScGIyNG9aR0YwWVNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h6YUc5MWJHUmZZMkZqYUdVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR052Ym5SbGVIUXVaWFpsYm5SZlkyOXVkR1Y0ZEM1aGNIQXVkR1Z0Y0d4aGRHVkRZV05vWlNoc2IyTmhkR2x2Yml3Z1pHRjBZU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJuUmxlSFF1Ym1WNGRDaGtZWFJoS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdmU3dnYjNCMGFXOXVjeWtwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4eVhHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0F2THlCcGRDZHpJR0VnWkc5dEwycFJkV1Z5ZVZ4eVhHNGdJQ0FnSUNBZ0lDQWdhV1lnS0d4dlkyRjBhVzl1TG01dlpHVlVlWEJsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJzYjJOaGRHbHZiaTVwYm01bGNraFVUVXc3WEhKY2JpQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNCcFppQW9iRzlqWVhScGIyNHVjMlZzWldOMGIzSXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnYVhRbmN5QmhJR3BSZFdWeWVWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCamIyNTBaWGgwTG01bGVIUmZaVzVuYVc1bElEMGdiRzlqWVhScGIyNHVZWFIwY2lnblpHRjBZUzFsYm1kcGJtVW5LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11WTJ4dmJtVWdQVDA5SUdaaGJITmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR3h2WTJGMGFXOXVMbkpsYlc5MlpTZ3BXekJkTG1sdWJtVnlTRlJOVEM1MGIxTjBjbWx1WnlncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJzYjJOaGRHbHZibHN3WFM1cGJtNWxja2hVVFV3dWRHOVRkSEpwYm1jb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRXh2WVdRZ2NHRnlkR2xoYkhOY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWpJeU1nUlhoaGJYQnNaVnh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNBZ0lDQWdkR2hwY3k1c2IyRmtVR0Z5ZEdsaGJITW9lMjE1Y0dGeWRHbGhiRG9nSnk5d1lYUm9MM1J2TDNCaGNuUnBZV3duZlNrN1hISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ2JHOWhaRkJoY25ScFlXeHpPaUJtZFc1amRHbHZiaWh3WVhKMGFXRnNjeWtnZTF4eVhHNGdJQ0FnSUNCMllYSWdibUZ0WlR0Y2NseHVJQ0FnSUNBZ2FXWW9jR0Z5ZEdsaGJITXBJSHRjY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbkJoY25ScFlXeHpJRDBnZEdocGN5NXdZWEowYVdGc2N5QjhmQ0I3ZlR0Y2NseHVJQ0FnSUNBZ0lDQm1iM0lvYm1GdFpTQnBiaUJ3WVhKMGFXRnNjeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdLR1oxYm1OMGFXOXVLR052Ym5SbGVIUXNJRzVoYldVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1kyOXVkR1Y0ZEM1c2IyRmtLSEJoY25ScFlXeHpXMjVoYldWZEtWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTG5Sb1pXNG9ablZ1WTNScGIyNG9kR1Z0Y0d4aGRHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1d1lYSjBhV0ZzYzF0dVlXMWxYU0E5SUhSbGJYQnNZWFJsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQjlLU2gwYUdsekxDQnVZVzFsS1R0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUdCc2IyRmtLQ2xnSUdFZ2RHVnRjR3hoZEdVZ1lXNWtJSFJvWlc0Z1lHbHVkR1Z5Y0c5c1lYUmxLQ2xnSUdsMElIZHBkR2dnWkdGMFlTNWNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUJqWVc0Z1ltVWdZMkZzYkdWa0lIZHBkR2dnYlhWc2RHbHdiR1VnWkdsbVptVnlaVzUwSUhOcFoyNWhkSFZ5WlhNNlhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNCMGFHbHpMbkpsYm1SbGNpaGpZV3hzWW1GamF5azdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2N2Ykc5allYUnBiMjRuS1R0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnZEdocGN5NXlaVzVrWlhJb0p5OXNiMk5oZEdsdmJpY3NJSHR6YjIxbE9pQmtZWFJoZlNrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUhSb2FYTXVjbVZ1WkdWeUtDY3ZiRzlqWVhScGIyNG5MQ0JqWVd4c1ltRmpheWs3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJSFJvYVhNdWNtVnVaR1Z5S0NjdmJHOWpZWFJwYjI0bkxDQjdjMjl0WlRvZ1pHRjBZWDBzSUdOaGJHeGlZV05yS1R0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnZEdocGN5NXlaVzVrWlhJb0p5OXNiMk5oZEdsdmJpY3NJSHR6YjIxbE9pQmtZWFJoZlN3Z2UyMTVPaUJ3WVhKMGFXRnNjMzBwTzF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0IwYUdsekxuSmxibVJsY2lnbkwyeHZZMkYwYVc5dUp5d2dZMkZzYkdKaFkyc3NJSHR0ZVRvZ2NHRnlkR2xoYkhOOUtUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9KeTlzYjJOaGRHbHZiaWNzSUh0emIyMWxPaUJrWVhSaGZTd2dZMkZzYkdKaFkyc3NJSHR0ZVRvZ2NHRnlkR2xoYkhOOUtUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFqSXlNZ1JYaGhiWEJzWlZ4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDQWdJQ0FnZEdocGN5NW5aWFFvSnlNdkp5d2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnZEdocGN5NXlaVzVrWlhJb0oyMTVkR1Z0Y0d4aGRHVXVkR1Z0Y0d4aGRHVW5MQ0I3Ym1GdFpUb2dKM1JsYzNRbmZTazdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJSEpsYm1SbGNqb2dablZ1WTNScGIyNG9iRzlqWVhScGIyNHNJR1JoZEdFc0lHTmhiR3hpWVdOckxDQndZWEowYVdGc2N5a2dlMXh5WEc0Z0lDQWdJQ0JwWmlBb1gybHpSblZ1WTNScGIyNG9iRzlqWVhScGIyNHBJQ1ltSUNGa1lYUmhLU0I3WEhKY2JpQWdJQ0FnSUNBZ0x5OGdhVzUyYjJ0bFpDQmhjeUJ5Wlc1a1pYSW9ZMkZzYkdKaFkyc3BYSEpjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWRHaGxiaWhzYjJOaGRHbHZiaWs3WEhKY2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ2FXWW9YMmx6Um5WdVkzUnBiMjRvWkdGMFlTa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDOHZJR2x1ZG05clpXUWdZWE1nY21WdVpHVnlLR3h2WTJGMGFXOXVMQ0JqWVd4c1ltRmpheXdnVzNCaGNuUnBZV3h6WFNsY2NseHVJQ0FnSUNBZ0lDQWdJSEJoY25ScFlXeHpJRDBnWTJGc2JHSmhZMnM3WEhKY2JpQWdJQ0FnSUNBZ0lDQmpZV3hzWW1GamF5QTlJR1JoZEdFN1hISmNiaUFnSUNBZ0lDQWdJQ0JrWVhSaElEMGdiblZzYkR0Y2NseHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWW9ZMkZzYkdKaFkyc2dKaVlnSVY5cGMwWjFibU4wYVc5dUtHTmhiR3hpWVdOcktTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdhVzUyYjJ0bFpDQmhjeUJ5Wlc1a1pYSW9iRzlqWVhScGIyNHNJR1JoZEdFc0lIQmhjblJwWVd4ektWeHlYRzRnSUNBZ0lDQWdJQ0FnY0dGeWRHbGhiSE1nUFNCallXeHNZbUZqYXp0Y2NseHVJQ0FnSUNBZ0lDQWdJR05oYkd4aVlXTnJJRDBnYm5Wc2JEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG14dllXUlFZWEowYVdGc2N5aHdZWEowYVdGc2N5bGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM1c2IyRmtLR3h2WTJGMGFXOXVLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0xtbHVkR1Z5Y0c5c1lYUmxLR1JoZEdFc0lHeHZZMkYwYVc5dUtWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTG5Sb1pXNG9ZMkZzYkdKaFkyc3BPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJR0J5Wlc1a1pYSW9LV0FnZEdobElHQnNiMk5oZEdsdmJtQWdkMmwwYUNCZ1pHRjBZV0FnWVc1a0lIUm9aVzRnWUhOM1lYQW9LV0FnZEdobFhISmNiaUFnSUNBdkx5QmhjSEFuY3lCZ0pHVnNaVzFsYm5SZ0lIZHBkR2dnZEdobElISmxibVJsY21Wa0lHTnZiblJsYm5RdVhISmNiaUFnSUNCd1lYSjBhV0ZzT2lCbWRXNWpkR2x2Ymloc2IyTmhkR2x2Yml3Z1pHRjBZU3dnWTJGc2JHSmhZMnNzSUhCaGNuUnBZV3h6S1NCN1hISmNiaUFnSUNBZ0lHbG1JQ2hmYVhOR2RXNWpkR2x2YmloallXeHNZbUZqYXlrcElIdGNjbHh1SUNBZ0lDQWdJQ0F2THlCcGJuWnZhMlZrSUdGeklIQmhjblJwWVd3b2JHOWpZWFJwYjI0c0lHUmhkR0VzSUdOaGJHeGlZV05yTENCYmNHRnlkR2xoYkhOZEtWeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5KbGJtUmxjaWhzYjJOaGRHbHZiaXdnWkdGMFlTd2djR0Z5ZEdsaGJITXBMbk4zWVhBb1kyRnNiR0poWTJzcE8xeHlYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLRjlwYzBaMWJtTjBhVzl1S0dSaGRHRXBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0x5OGdhVzUyYjJ0bFpDQmhjeUJ3WVhKMGFXRnNLR3h2WTJGMGFXOXVMQ0JqWVd4c1ltRmpheXdnVzNCaGNuUnBZV3h6WFNsY2NseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV5Wlc1a1pYSW9iRzlqWVhScGIyNHNJSHQ5TENCallXeHNZbUZqYXlrdWMzZGhjQ2hrWVhSaEtUdGNjbHh1SUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0F2THlCcGJuWnZhMlZrSUdGeklIQmhjblJwWVd3b2JHOWpZWFJwYjI0c0lHUmhkR0VzSUZ0d1lYSjBhV0ZzYzEwcFhISmNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11Y21WdVpHVnlLR3h2WTJGMGFXOXVMQ0JrWVhSaExDQmpZV3hzWW1GamF5a3VjM2RoY0NncE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklHUmxabVZ5Y3lCMGFHVWdZMkZzYkNCdlppQm1kVzVqZEdsdmJpQjBieUJ2WTJOMWNpQnBiaUJ2Y21SbGNpQnZaaUIwYUdVZ2NtVnVaR1Z5SUhGMVpYVmxMbHh5WEc0Z0lDQWdMeThnVkdobElHWjFibU4wYVc5dUlHTmhiaUJoWTJObGNIUWdZVzU1SUc1MWJXSmxjaUJ2WmlCaGNtZDFiV1Z1ZEhNZ1lYTWdiRzl1WnlCaGN5QjBhR1VnYkdGemRGeHlYRzRnSUNBZ0x5OGdZWEpuZFcxbGJuUWdhWE1nWVNCallXeHNZbUZqYXlCbWRXNWpkR2x2Ymk0Z1ZHaHBjeUJwY3lCMWMyVm1kV3dnWm05eUlIQjFkSFJwYm1jZ1lYSmlhWFJ5WVhKNVhISmNiaUFnSUNBdkx5QmhjM2x1WTJoeWIyNXZkWE1nWm5WdVkzUnBiMjV6SUdsdWRHOGdkR2hsSUhGMVpYVmxMaUJVYUdVZ1kyOXVkR1Z1ZENCd1lYTnpaV1FnZEc4Z2RHaGxYSEpjYmlBZ0lDQXZMeUJqWVd4c1ltRmpheUJwY3lCd1lYTnpaV1FnWVhNZ1lHTnZiblJsYm5SZ0lIUnZJSFJvWlNCdVpYaDBJR2wwWlcwZ2FXNGdkR2hsSUhGMVpYVmxMbHh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNNakl5QkZlR0Z0Y0d4bFhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJQ0FnSUhSb2FYTXVjMlZ1WkNna0xtZGxkRXBUVDA0c0lDY3ZZWEJ3TG1wemIyNG5LVnh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0F1ZEdobGJpaG1kVzVqZEdsdmJpaHFjMjl1S1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdKQ2duSTIxbGMzTmhaMlVwTG5SbGVIUW9hbk52YmxzbmJXVnpjMkZuWlNkZEtUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNCelpXNWtPaUJtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ2RtRnlJR052Ym5SbGVIUWdQU0IwYUdsekxGeHlYRzRnSUNBZ0lDQWdJQ0FnWVhKbmN5QTlJRjl0WVd0bFFYSnlZWGtvWVhKbmRXMWxiblJ6S1N4Y2NseHVJQ0FnSUNBZ0lDQWdJR1oxYmlBZ1BTQmhjbWR6TG5Ob2FXWjBLQ2s3WEhKY2JseHlYRzRnSUNBZ0lDQnBaaUFvWDJselFYSnlZWGtvWVhKbmMxc3dYU2twSUhzZ1lYSm5jeUE5SUdGeVozTmJNRjA3SUgxY2NseHVYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5Sb1pXNG9ablZ1WTNScGIyNG9ZMjl1ZEdWdWRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUdGeVozTXVjSFZ6YUNobWRXNWpkR2x2YmloeVpYTndiMjV6WlNrZ2V5QmpiMjUwWlhoMExtNWxlSFFvY21WemNHOXVjMlVwT3lCOUtUdGNjbHh1SUNBZ0lDQWdJQ0JqYjI1MFpYaDBMbmRoYVhRb0tUdGNjbHh1SUNBZ0lDQWdJQ0JtZFc0dVlYQndiSGtvWm5WdUxDQmhjbWR6S1R0Y2NseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEhKY2JpQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCcGRHVnlZWFJsY3lCdmRtVnlJR0Z1SUdGeWNtRjVMQ0JoY0hCc2VXbHVaeUIwYUdVZ1kyRnNiR0poWTJzZ1ptOXlJR1ZoWTJnZ2FYUmxiU0JwZEdWdExpQjBhR1ZjY2x4dUlDQWdJQzh2SUdOaGJHeGlZV05ySUhSaGEyVnpJSFJvWlNCellXMWxJSE4wZVd4bElHOW1JR0Z5WjNWdFpXNTBjeUJoY3lCZ2FsRjFaWEo1TG1WaFkyZ29LV0FnS0dsdVpHVjRMQ0JwZEdWdEtTNWNjbHh1SUNBZ0lDOHZJRlJvWlNCeVpYUjFjbTRnZG1Gc2RXVWdiMllnWldGamFDQmpZV3hzWW1GamF5QnBjeUJqYjJ4c1pXTjBaV1FnWVhNZ1lTQnphVzVuYkdVZ2MzUnlhVzVuSUdGdVpDQnpkRzl5WldSY2NseHVJQ0FnSUM4dklHRnpJR0JqYjI1MFpXNTBZQ0IwYnlCaVpTQjFjMlZrSUdsdUlIUm9aU0J1WlhoMElHbDBaWEpoZEdsdmJpQnZaaUIwYUdVZ1lGSmxibVJsY2tOdmJuUmxlSFJnTGx4eVhHNGdJQ0FnWTI5c2JHVmpkRG9nWm5WdVkzUnBiMjRvWVhKeVlYa3NJR05oYkd4aVlXTnJMQ0J1YjNjcElIdGNjbHh1SUNBZ0lDQWdkbUZ5SUdOdmJuUmxlSFFnUFNCMGFHbHpPMXh5WEc0Z0lDQWdJQ0IyWVhJZ1kyOXNiQ0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJR2xtSUNoZmFYTkdkVzVqZEdsdmJpaGhjbkpoZVNrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdOaGJHeGlZV05ySUQwZ1lYSnlZWGs3WEhKY2JpQWdJQ0FnSUNBZ0lDQmhjbkpoZVNBOUlIUm9hWE11WTI5dWRHVnVkRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdkbUZ5SUdOdmJuUmxiblJ6SUQwZ1cxMHNJR1J2YlhNZ1BTQm1ZV3h6WlR0Y2NseHVJQ0FnSUNBZ0lDQWtMbVZoWTJnb1lYSnlZWGtzSUdaMWJtTjBhVzl1S0drc0lHbDBaVzBwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFpoY2lCeVpYUjFjbTVsWkNBOUlHTmhiR3hpWVdOckxtRndjR3g1S0dOdmJuUmxlSFFzSUZ0cExDQnBkR1Z0WFNrN1hISmNiaUFnSUNBZ0lDQWdJQ0JwWmlBb2NtVjBkWEp1WldRdWFuRjFaWEo1SUNZbUlISmxkSFZ5Ym1Wa0xteGxibWQwYUNBOVBTQXhLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJtVmtJRDBnY21WMGRYSnVaV1JiTUYwN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdSdmJYTWdQU0IwY25WbE8xeHlYRzRnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdZMjl1ZEdWdWRITXVjSFZ6YUNoeVpYUjFjbTVsWkNrN1hISmNiaUFnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVYwZFhKdVpXUTdYSEpjYmlBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHUnZiWE1nUHlCamIyNTBaVzUwY3lBNklHTnZiblJsYm5SekxtcHZhVzRvSnljcE8xeHlYRzRnSUNBZ0lDQjlPMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdibTkzSUQ4Z1kyOXNiQ2dwSURvZ2RHaHBjeTUwYUdWdUtHTnZiR3dwTzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJzYjJGa2N5QmhJSFJsYlhCc1lYUmxMQ0JoYm1RZ2RHaGxiaUJwYm5SbGNuQnZiR0YwWlhNZ2FYUWdabTl5SUdWaFkyZ2dhWFJsYlNCcGJpQjBhR1VnWUdSaGRHRmdYSEpjYmlBZ0lDQXZMeUJoY25KaGVTNGdTV1lnWVNCallXeHNZbUZqYXlCcGN5QndZWE56WldRc0lHbDBJSGRwYkd3Z1kyRnNiQ0IwYUdVZ1kyRnNiR0poWTJzZ2QybDBhQ0JsWVdOb1hISmNiaUFnSUNBdkx5QnBkR1Z0SUdsdUlIUm9aU0JoY25KaGVTQmZZV1owWlhKZklHbHVkR1Z5Y0c5c1lYUnBiMjVjY2x4dUlDQWdJSEpsYm1SbGNrVmhZMmc2SUdaMWJtTjBhVzl1S0d4dlkyRjBhVzl1TENCdVlXMWxMQ0JrWVhSaExDQmpZV3hzWW1GamF5a2dlMXh5WEc0Z0lDQWdJQ0JwWmlBb1gybHpRWEp5WVhrb2JtRnRaU2twSUh0Y2NseHVJQ0FnSUNBZ0lDQmpZV3hzWW1GamF5QTlJR1JoZEdFN1hISmNiaUFnSUNBZ0lDQWdaR0YwWVNBOUlHNWhiV1U3WEhKY2JpQWdJQ0FnSUNBZ2JtRnRaU0E5SUc1MWJHdzdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWJHOWhaQ2hzYjJOaGRHbHZiaWt1ZEdobGJpaG1kVzVqZEdsdmJpaGpiMjUwWlc1MEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCMllYSWdjbU4wZUNBOUlIUm9hWE03WEhKY2JpQWdJQ0FnSUNBZ0lDQnBaaUFvSVdSaGRHRXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaR0YwWVNBOUlGOXBjMEZ5Y21GNUtIUm9hWE11Y0hKbGRtbHZkWE5mWTI5dWRHVnVkQ2tnUHlCMGFHbHpMbkJ5WlhacGIzVnpYMk52Ym5SbGJuUWdPaUJiWFR0Y2NseHVJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2hqWVd4c1ltRmpheWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FrTG1WaFkyZ29aR0YwWVN3Z1puVnVZM1JwYjI0b2FTd2dkbUZzZFdVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnYVdSaGRHRWdQU0I3ZlN3Z1pXNW5hVzVsSUQwZ2RHaHBjeTV1WlhoMFgyVnVaMmx1WlNCOGZDQnNiMk5oZEdsdmJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYm1GdFpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdSaGRHRmJibUZ0WlYwZ1BTQjJZV3gxWlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXUmhkR0VnUFNCMllXeDFaVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGc2JHSmhZMnNvZG1Gc2RXVXNJSEpqZEhndVpYWmxiblJmWTI5dWRHVjRkQzVwYm5SbGNuQnZiR0YwWlNoamIyNTBaVzUwTENCcFpHRjBZU3dnWlc1bmFXNWxLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVZMjlzYkdWamRDaGtZWFJoTENCbWRXNWpkR2x2YmlocExDQjJZV3gxWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJwWkdGMFlTQTlJSHQ5TENCbGJtZHBibVVnUFNCMGFHbHpMbTVsZUhSZlpXNW5hVzVsSUh4OElHeHZZMkYwYVc5dU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h1WVcxbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkdGMFlWdHVZVzFsWFNBOUlIWmhiSFZsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpHRjBZU0E5SUhaaGJIVmxPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1bGRtVnVkRjlqYjI1MFpYaDBMbWx1ZEdWeWNHOXNZWFJsS0dOdmJuUmxiblFzSUdsa1lYUmhMQ0JsYm1kcGJtVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlMQ0IwY25WbEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklIVnpaWE1nZEdobElIQnlaWFpwYjNWeklHeHZZV1JsWkNCZ1kyOXVkR1Z1ZEdBZ1lXNWtJSFJvWlNCZ1pHRjBZV0FnYjJKcVpXTjBJSFJ2SUdsdWRHVnljRzlzWVhSbFhISmNiaUFnSUNBdkx5QmhJSFJsYlhCc1lYUmxMaUJnWlc1bmFXNWxZQ0JrWldacGJtVnpJSFJvWlNCMFpXMXdiR0YwYVc1bkwybHVkR1Z5Y0c5c1lYUnBiMjRnYldWMGFHOWtMMlZ1WjJsdVpWeHlYRzRnSUNBZ0x5OGdkR2hoZENCemFHOTFiR1FnWW1VZ2RYTmxaQzRnU1dZZ1lHVnVaMmx1WldBZ2FYTWdibTkwSUhCaGMzTmxaQ3dnZEdobElHQnVaWGgwWDJWdVoybHVaV0FnYVhOY2NseHVJQ0FnSUM4dklIVnpaV1F1SUVsbUlHQnlaWFJoYVc1Z0lHbHpJR0IwY25WbFlDd2dkR2hsSUdacGJtRnNJR2x1ZEdWeWNHOXNZWFJsWkNCa1lYUmhJR2x6SUdGd2NHVnVaR1ZrSUhSdlhISmNiaUFnSUNBdkx5QjBhR1VnWUhCeVpYWnBiM1Z6WDJOdmJuUmxiblJnSUdsdWMzUmxZV1FnYjJZZ2FuVnpkQ0J5WlhCc1lXTnBibWNnYVhRdVhISmNiaUFnSUNCcGJuUmxjbkJ2YkdGMFpUb2dablZ1WTNScGIyNG9aR0YwWVN3Z1pXNW5hVzVsTENCeVpYUmhhVzRwSUh0Y2NseHVJQ0FnSUNBZ2RtRnlJR052Ym5SbGVIUWdQU0IwYUdsek8xeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTUwYUdWdUtHWjFibU4wYVc5dUtHTnZiblJsYm5Rc0lIQnlaWFlwSUh0Y2NseHVJQ0FnSUNBZ0lDQnBaaUFvSVdSaGRHRWdKaVlnY0hKbGRpa2dleUJrWVhSaElEMGdjSEpsZGpzZ2ZWeHlYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTVsZUhSZlpXNW5hVzVsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0JsYm1kcGJtVWdQU0IwYUdsekxtNWxlSFJmWlc1bmFXNWxPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTV1WlhoMFgyVnVaMmx1WlNBOUlHWmhiSE5sTzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0IyWVhJZ2NtVnVaR1Z5WldRZ1BTQmpiMjUwWlhoMExtVjJaVzUwWDJOdmJuUmxlSFF1YVc1MFpYSndiMnhoZEdVb1kyOXVkR1Z1ZEN3Z1pHRjBZU3dnWlc1bmFXNWxMQ0IwYUdsekxuQmhjblJwWVd4ektUdGNjbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVYwWVdsdUlEOGdjSEpsZGlBcklISmxibVJsY21Wa0lEb2djbVZ1WkdWeVpXUTdYSEpjYmlBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJUZDJGd0lIUm9aU0J5WlhSMWNtNGdZMjl1ZEdWdWRITWdaVzV6ZFhKcGJtY2diM0prWlhJdUlGTmxaU0JnUVhCd2JHbGpZWFJwYjI0amMzZGhjR0JjY2x4dUlDQWdJSE4zWVhBNklHWjFibU4wYVc5dUtHTmhiR3hpWVdOcktTQjdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5Sb1pXNG9ablZ1WTNScGIyNG9ZMjl1ZEdWdWRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUhSb2FYTXVaWFpsYm5SZlkyOXVkR1Y0ZEM1emQyRndLR052Ym5SbGJuUXNJR05oYkd4aVlXTnJLVHRjY2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWTI5dWRHVnVkRHRjY2x4dUlDQWdJQ0FnZlNrdWRISnBaMmRsY2lnblkyaGhibWRsWkNjc0lIdDlLVHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdVMkZ0WlNCMWMyRm5aU0JoY3lCZ2FsRjFaWEo1TG1adUxtRndjR1Z1WkZSdktDbGdJR0oxZENCMWMyVnpJR0IwYUdWdUtDbGdJSFJ2SUdWdWMzVnlaU0J2Y21SbGNseHlYRzRnSUNBZ1lYQndaVzVrVkc4NklHWjFibU4wYVc5dUtITmxiR1ZqZEc5eUtTQjdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5Sb1pXNG9ablZ1WTNScGIyNG9ZMjl1ZEdWdWRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNRb2MyVnNaV04wYjNJcExtRndjR1Z1WkNoamIyNTBaVzUwS1R0Y2NseHVJQ0FnSUNBZ2ZTa3VkSEpwWjJkbGNpZ25ZMmhoYm1kbFpDY3NJSHQ5S1R0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnVTJGdFpTQjFjMkZuWlNCaGN5QmdhbEYxWlhKNUxtWnVMbkJ5WlhCbGJtUlVieWdwWUNCaWRYUWdkWE5sY3lCZ2RHaGxiaWdwWUNCMGJ5Qmxibk4xY21VZ2IzSmtaWEpjY2x4dUlDQWdJSEJ5WlhCbGJtUlViem9nWm5WdVkzUnBiMjRvYzJWc1pXTjBiM0lwSUh0Y2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVkR2hsYmlobWRXNWpkR2x2YmloamIyNTBaVzUwS1NCN1hISmNiaUFnSUNBZ0lDQWdKQ2h6Wld4bFkzUnZjaWt1Y0hKbGNHVnVaQ2hqYjI1MFpXNTBLVHRjY2x4dUlDQWdJQ0FnZlNrdWRISnBaMmRsY2lnblkyaGhibWRsWkNjc0lIdDlLVHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdVbVZ3YkdGalpYTWdkR2hsSUdBa0tITmxiR1ZqZEc5eUtXQWdkWE5wYm1jZ1lHaDBiV3dvS1dBZ2QybDBhQ0IwYUdVZ2NISmxkbWx2ZFhOc2VTQnNiMkZrWldSY2NseHVJQ0FnSUM4dklHQmpiMjUwWlc1MFlGeHlYRzRnSUNBZ2NtVndiR0ZqWlRvZ1puVnVZM1JwYjI0b2MyVnNaV04wYjNJcElIdGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11ZEdobGJpaG1kVzVqZEdsdmJpaGpiMjUwWlc1MEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSkNoelpXeGxZM1J2Y2lrdWFIUnRiQ2hqYjI1MFpXNTBLVHRjY2x4dUlDQWdJQ0FnZlNrdWRISnBaMmRsY2lnblkyaGhibWRsWkNjc0lIdDlLVHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdkSEpwWjJkbGNpQjBhR1VnWlhabGJuUWdhVzRnZEdobElHOXlaR1Z5SUc5bUlIUm9aU0JsZG1WdWRDQmpiMjUwWlhoMExpQlRZVzFsSUhObGJXRnVkR2xqYzF4eVhHNGdJQ0FnTHk4Z1lYTWdZRk5oYlcxNUxrVjJaVzUwUTI5dWRHVjRkQ04wY21sbloyVnlLQ2xnTGlCSlppQmtZWFJoSUdseklHOXRhWFIwWldRc0lHQmpiMjUwWlc1MFlGeHlYRzRnSUNBZ0x5OGdhWE1nYzJWdWRDQmhjeUJnZTJOdmJuUmxiblE2SUdOdmJuUmxiblI5WUZ4eVhHNGdJQ0FnZEhKcFoyZGxjam9nWm5WdVkzUnBiMjRvYm1GdFpTd2daR0YwWVNrZ2UxeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTUwYUdWdUtHWjFibU4wYVc5dUtHTnZiblJsYm5RcElIdGNjbHh1SUNBZ0lDQWdJQ0JwWmlBb2RIbHdaVzltSUdSaGRHRWdQVDBnSjNWdVpHVm1hVzVsWkNjcElIc2daR0YwWVNBOUlIdGpiMjUwWlc1ME9pQmpiMjUwWlc1MGZUc2dmVnh5WEc0Z0lDQWdJQ0FnSUhSb2FYTXVaWFpsYm5SZlkyOXVkR1Y0ZEM1MGNtbG5aMlZ5S0c1aGJXVXNJR1JoZEdFcE8xeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmpiMjUwWlc1ME8xeHlYRzRnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnZlNrN1hISmNibHh5WEc0Z0lDOHZJR0JUWVcxdGVTNUZkbVZ1ZEVOdmJuUmxlSFJnSUc5aWFtVmpkSE1nWVhKbElHTnlaV0YwWldRZ1pYWmxjbmtnZEdsdFpTQmhJSEp2ZFhSbElHbHpJSEoxYmlCdmNpQmhYSEpjYmlBZ0x5OGdZbTkxYm1RZ1pYWmxiblFnYVhNZ2RISnBaMmRsY21Wa0xpQlVhR1VnWTJGc2JHSmhZMnR6SUdadmNpQjBhR1Z6WlNCbGRtVnVkSE1nWVhKbElHVjJZV3gxWVhSbFpDQjNhWFJvYVc0Z1lTQmdVMkZ0YlhrdVJYWmxiblJEYjI1MFpYaDBZRnh5WEc0Z0lDOHZJRlJvYVhNZ2QybDBhR2x1SUhSb1pYTmxJR05oYkd4aVlXTnJjeUIwYUdVZ2MzQmxZMmxoYkNCdFpYUm9iMlJ6SUc5bUlHQkZkbVZ1ZEVOdmJuUmxlSFJnSUdGeVpTQmhkbUZwYkdGaWJHVXVYSEpjYmlBZ0x5OWNjbHh1SUNBdkx5QWpJeU1nUlhoaGJYQnNaVnh5WEc0Z0lDOHZYSEpjYmlBZ0x5OGdJQ0FnSUNBZ0pDNXpZVzF0ZVNobWRXNWpkR2x2YmlncElIdGNjbHh1SUNBdkx5QWdJQ0FnSUNBZ0lDOHZJRlJvWlNCamIyNTBaWGgwSUdobGNtVWdhWE1nZEdocGN5QlRZVzF0ZVM1QmNIQnNhV05oZEdsdmJseHlYRzRnSUM4dklDQWdJQ0FnSUNBZ2RHaHBjeTVuWlhRb0p5TXZPbTVoYldVbkxDQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQXZMeUFnSUNBZ0lDQWdJQ0FnTHk4Z1ZHaGxJR052Ym5SbGVIUWdhR1Z5WlNCcGN5QmhJRzVsZHlCVFlXMXRlUzVGZG1WdWRFTnZiblJsZUhSY2NseHVJQ0F2THlBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWNHRnlZVzF6V3lkdVlXMWxKMTBnUFQwZ0ozTmhiVzE1SnlrZ2UxeHlYRzRnSUM4dklDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNHRnlkR2xoYkNnbmJtRnRaUzVvZEcxc0xtVnlZaWNzSUh0dVlXMWxPaUFuVTJGdGJYa25mU2s3WEhKY2JpQWdMeThnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdMeThnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV5WldScGNtVmpkQ2duSXk5emIyMWxkMmhsY21VdFpXeHpaU2NwWEhKY2JpQWdMeThnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0F2THlBZ0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUM4dklDQWdJQ0FnSUgwcE8xeHlYRzRnSUM4dlhISmNiaUFnTHk4Z1NXNXBkR2xoYkdsNlpTQmhJRzVsZHlCRmRtVnVkRU52Ym5SbGVIUmNjbHh1SUNBdkwxeHlYRzRnSUM4dklDTWpJeUJCY21kMWJXVnVkSE5jY2x4dUlDQXZMMXh5WEc0Z0lDOHZJQ29nWUdGd2NHQWdWR2hsSUdCVFlXMXRlUzVCY0hCc2FXTmhkR2x2Ym1BZ2RHaHBjeUJsZG1WdWRDQnBjeUJqWVd4c1pXUWdkMmwwYUdsdUxseHlYRzRnSUM4dklDb2dZSFpsY21KZ0lGUm9aU0IyWlhKaUlHbHVkbTlyWldRZ2RHOGdjblZ1SUhSb2FYTWdZMjl1ZEdWNGRDOXliM1YwWlM1Y2NseHVJQ0F2THlBcUlHQndZWFJvWUNCVWFHVWdjM1J5YVc1bklIQmhkR2dnYVc1MmIydGxaQ0IwYnlCeWRXNGdkR2hwY3lCamIyNTBaWGgwTDNKdmRYUmxMbHh5WEc0Z0lDOHZJQ29nWUhCaGNtRnRjMkFnUVc0Z1QySnFaV04wSUc5bUlHOXdkR2x2Ym1Gc0lIQmhjbUZ0Y3lCMGJ5QndZWE56SUhSdklIUm9aU0JqYjI1MFpYaDBMaUJKY3lCamIyNTJaWEowWldSY2NseHVJQ0F2THlBZ0lIUnZJR0VnWUZOaGJXMTVMazlpYW1WamRHQXVYSEpjYmlBZ0x5OGdLaUJnZEdGeVoyVjBZQ0JoSUVSUFRTQmxiR1Z0Wlc1MElIUm9ZWFFnZEdobElHVjJaVzUwSUhSb1lYUWdhRzlzWkhNZ2RHaHBjeUJqYjI1MFpYaDBJRzl5YVdkcGJtRjBaWE5jY2x4dUlDQXZMeUFnSUdaeWIyMHVJRVp2Y2lCd2IzTjBMQ0J3ZFhRZ1lXNWtJR1JsYkNCeWIzVjBaWE1zSUhSb2FYTWdhWE1nZEdobElHWnZjbTBnWld4bGJXVnVkQ0IwYUdGMElIUnlhV2RuWlhKbFpGeHlYRzRnSUM4dklDQWdkR2hsSUhKdmRYUmxMbHh5WEc0Z0lDOHZYSEpjYmlBZ1UyRnRiWGt1UlhabGJuUkRiMjUwWlhoMElEMGdablZ1WTNScGIyNG9ZWEJ3TENCMlpYSmlMQ0J3WVhSb0xDQndZWEpoYlhNc0lIUmhjbWRsZENrZ2UxeHlYRzRnSUNBZ2RHaHBjeTVoY0hBZ0lDQWdQU0JoY0hBN1hISmNiaUFnSUNCMGFHbHpMblpsY21JZ0lDQTlJSFpsY21JN1hISmNiaUFnSUNCMGFHbHpMbkJoZEdnZ0lDQTlJSEJoZEdnN1hISmNiaUFnSUNCMGFHbHpMbkJoY21GdGN5QTlJRzVsZHlCVFlXMXRlUzVQWW1wbFkzUW9jR0Z5WVcxektUdGNjbHh1SUNBZ0lIUm9hWE11ZEdGeVoyVjBJRDBnZEdGeVoyVjBPMXh5WEc0Z0lIMDdYSEpjYmx4eVhHNGdJRk5oYlcxNUxrVjJaVzUwUTI5dWRHVjRkQzV3Y205MGIzUjVjR1VnUFNBa0xtVjRkR1Z1WkNoN2ZTd2dVMkZ0YlhrdVQySnFaV04wTG5CeWIzUnZkSGx3WlN3Z2UxeHlYRzVjY2x4dUlDQWdJQzh2SUVFZ2MyaHZjblJqZFhRZ2RHOGdkR2hsSUdGd2NDZHpJR0FrWld4bGJXVnVkQ2dwWUZ4eVhHNGdJQ0FnSkdWc1pXMWxiblE2SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTVoY0hBdUpHVnNaVzFsYm5Rb1gyMWhhMlZCY25KaGVTaGhjbWQxYldWdWRITXBMbk5vYVdaMEtDa3BPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5Qk1iMjlySUhWd0lHRWdkR1Z0Y0d4aGRHbHVaeUJsYm1kcGJtVWdkMmwwYUdsdUlIUm9aU0JqZFhKeVpXNTBJR0Z3Y0NCaGJtUWdZMjl1ZEdWNGRDNWNjbHh1SUNBZ0lDOHZJR0JsYm1kcGJtVmdJR05oYmlCaVpTQnZibVVnYjJZZ2RHaGxJR1p2Ykd4dmQybHVaenBjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBcUlHRWdablZ1WTNScGIyNDZJSE5vYjNWc1pDQmpiMjVtYjNKdElIUnZJR0JtZFc1amRHbHZiaWhqYjI1MFpXNTBMQ0JrWVhSaEtTQjdJSEpsZEhWeWJpQnBiblJsY25CdmJHRjBaV1E3SUgxZ1hISmNiaUFnSUNBdkx5QXFJR0VnZEdWdGNHeGhkR1VnY0dGMGFEb2dKM1JsYlhCc1lYUmxMbVZxY3ljc0lHeHZiMnR6SUhWd0lIUm9aU0JsZUhSbGJuTnBiMjRnZEc4Z2JXRjBZMmdnZEc5Y2NseHVJQ0FnSUM4dklDQWdkR2hsSUdCbGFuTW9LV0FnYUdWc2NHVnlYSEpjYmlBZ0lDQXZMeUFxSUdFZ2MzUnlhVzVuSUhKbFptVnljbWx1WnlCMGJ5QjBhR1VnYUdWc2NHVnlPaUJjSW0xMWMzUmhZMmhsWENJZ1BUNGdZRzExYzNSaFkyaGxLQ2xnWEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z1NXWWdibThnWlc1bmFXNWxJR2x6SUdadmRXNWtMQ0IxYzJVZ2RHaGxJR0Z3Y0NkeklHUmxabUYxYkhRZ1lIUmxiWEJzWVhSbFgyVnVaMmx1WldCY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNCbGJtZHBibVZHYjNJNklHWjFibU4wYVc5dUtHVnVaMmx1WlNrZ2UxeHlYRzRnSUNBZ0lDQjJZWElnWTI5dWRHVjRkQ0E5SUhSb2FYTXNJR1Z1WjJsdVpWOXRZWFJqYUR0Y2NseHVJQ0FnSUNBZ0x5OGdhV1lnY0dGMGFDQnBjeUJoWTNSMVlXeHNlU0JoYmlCbGJtZHBibVVnWm5WdVkzUnBiMjRnYW5WemRDQnlaWFIxY200Z2FYUmNjbHh1SUNBZ0lDQWdhV1lnS0Y5cGMwWjFibU4wYVc5dUtHVnVaMmx1WlNrcElIc2djbVYwZFhKdUlHVnVaMmx1WlRzZ2ZWeHlYRzRnSUNBZ0lDQXZMeUJzYjI5cmRYQWdaVzVuYVc1bElHNWhiV1VnWW5rZ2NHRjBhQ0JsZUhSbGJuTnBiMjVjY2x4dUlDQWdJQ0FnWlc1bmFXNWxJRDBnS0dWdVoybHVaU0I4ZkNCamIyNTBaWGgwTG1Gd2NDNTBaVzF3YkdGMFpWOWxibWRwYm1VcExuUnZVM1J5YVc1bktDazdYSEpjYmlBZ0lDQWdJR2xtSUNnb1pXNW5hVzVsWDIxaGRHTm9JRDBnWlc1bmFXNWxMbTFoZEdOb0tDOWNYQzRvVzE1Y1hDNWNYRDljWENOZEt5a29YRncvZkNRcEx5a3BLU0I3WEhKY2JpQWdJQ0FnSUNBZ1pXNW5hVzVsSUQwZ1pXNW5hVzVsWDIxaGRHTm9XekZkTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDOHZJSE5sZENCMGFHVWdaVzVuYVc1bElIUnZJSFJvWlNCa1pXWmhkV3gwSUhSbGJYQnNZWFJsSUdWdVoybHVaU0JwWmlCdWJ5QnRZWFJqYUNCcGN5Qm1iM1Z1WkZ4eVhHNGdJQ0FnSUNCcFppQW9aVzVuYVc1bElDWW1JRjlwYzBaMWJtTjBhVzl1S0dOdmJuUmxlSFJiWlc1bmFXNWxYU2twSUh0Y2NseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyOXVkR1Y0ZEZ0bGJtZHBibVZkTzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0JwWmlBb1kyOXVkR1Y0ZEM1aGNIQXVkR1Z0Y0d4aGRHVmZaVzVuYVc1bEtTQjdYSEpjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVpXNW5hVzVsUm05eUtHTnZiblJsZUhRdVlYQndMblJsYlhCc1lYUmxYMlZ1WjJsdVpTazdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVLR052Ym5SbGJuUXNJR1JoZEdFcElIc2djbVYwZFhKdUlHTnZiblJsYm5RN0lIMDdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklIVnphVzVuSUhSb1pTQjBaVzF3YkdGMFpTQmdaVzVuYVc1bFlDQm1iM1Z1WkNCM2FYUm9JR0JsYm1kcGJtVkdiM0lvS1dBc0lHbHVkR1Z5Y0c5c1lYUmxJSFJvWlZ4eVhHNGdJQ0FnTHk4Z1lHUmhkR0ZnSUdsdWRHOGdZR052Ym5SbGJuUmdYSEpjYmlBZ0lDQnBiblJsY25CdmJHRjBaVG9nWm5WdVkzUnBiMjRvWTI5dWRHVnVkQ3dnWkdGMFlTd2daVzVuYVc1bExDQndZWEowYVdGc2N5a2dlMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1bGJtZHBibVZHYjNJb1pXNW5hVzVsS1M1aGNIQnNlU2gwYUdsekxDQmJZMjl1ZEdWdWRDd2daR0YwWVN3Z2NHRnlkR2xoYkhOZEtUdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1EzSmxZWFJsSUdGdVpDQnlaWFIxY200Z1lTQmdVMkZ0YlhrdVVtVnVaR1Z5UTI5dWRHVjRkR0FnWTJGc2JHbHVaeUJnY21WdVpHVnlLQ2xnSUc5dUlHbDBMbHh5WEc0Z0lDQWdMeThnVEc5aFpITWdkR2hsSUhSbGJYQnNZWFJsSUdGdVpDQnBiblJsY25CdmJHRjBaU0IwYUdVZ1pHRjBZU3dnYUc5M1pYWmxjaUJrYjJWeklHNXZkQ0JoWTNSMVlXeGNjbHh1SUNBZ0lDOHZJSEJzWVdObElHbDBJR2x1SUhSb1pTQkVUMDB1WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0l5TWpJRVY0WVcxd2JHVmNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDOHZJRzE1ZEdWdGNHeGhkR1V1YlhWemRHRmphR1VnUEdScGRpQmpiR0Z6Y3oxY0ltNWhiV1ZjSWo1N2UyNWhiV1Y5ZlR3dlpHbDJQbHh5WEc0Z0lDQWdMeThnSUNBZ0lDQnlaVzVrWlhJb0oyMTVkR1Z0Y0d4aGRHVXViWFZ6ZEdGamFHVW5MQ0I3Ym1GdFpUb2dKM0YxYVhKclpYa25mU2s3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQzh2SUhObGRITWdkR2hsSUdCamIyNTBaVzUwWUNCMGJ5QThaR2wySUdOc1lYTnpQVndpYm1GdFpWd2lQbkYxYVhKclpYazhMMlJwZGo1Y2NseHVJQ0FnSUM4dklDQWdJQ0FnY21WdVpHVnlLQ2R0ZVhSbGJYQnNZWFJsTG0xMWMzUmhZMmhsSnl3Z2UyNWhiV1U2SUNkeGRXbHlhMlY1SjMwcFhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0xtRndjR1Z1WkZSdktDZDFiQ2NwTzF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0F2THlCaGNIQmxibVJ6SUhSb1pTQnlaVzVrWlhKbFpDQmpiMjUwWlc1MElIUnZJQ1FvSjNWc0p5bGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQnlaVzVrWlhJNklHWjFibU4wYVc5dUtHeHZZMkYwYVc5dUxDQmtZWFJoTENCallXeHNZbUZqYXl3Z2NHRnlkR2xoYkhNcElIdGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlHNWxkeUJUWVcxdGVTNVNaVzVrWlhKRGIyNTBaWGgwS0hSb2FYTXBMbkpsYm1SbGNpaHNiMk5oZEdsdmJpd2daR0YwWVN3Z1kyRnNiR0poWTJzc0lIQmhjblJwWVd4ektUdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1EzSmxZWFJsSUdGdVpDQnlaWFIxY200Z1lTQmdVMkZ0YlhrdVVtVnVaR1Z5UTI5dWRHVjRkR0FnWTJGc2JHbHVaeUJnY21WdVpHVnlSV0ZqYUNncFlDQnZiaUJwZEM1Y2NseHVJQ0FnSUM4dklFeHZZV1J6SUhSb1pTQjBaVzF3YkdGMFpTQmhibVFnYVc1MFpYSndiMnhoZEdWeklIUm9aU0JrWVhSaElHWnZjaUJsWVdOb0lHbDBaVzBzWEhKY2JpQWdJQ0F2THlCb2IzZGxkbVZ5SUdSdlpYTWdibTkwSUdGamRIVmhiQ0J3YkdGalpTQnBkQ0JwYmlCMGFHVWdSRTlOTGx4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDTWpJeUJGZUdGdGNHeGxYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQXZMeUJ0ZVhSbGJYQnNZWFJsTG0xMWMzUmhZMmhsSUR4a2FYWWdZMnhoYzNNOVhDSnVZVzFsWENJK2UzdHVZVzFsZlgwOEwyUnBkajVjY2x4dUlDQWdJQzh2SUNBZ0lDQWdjbVZ1WkdWeVJXRmphQ2duYlhsMFpXMXdiR0YwWlM1dGRYTjBZV05vWlNjc0lGdDdibUZ0WlRvZ0ozRjFhWEpyWlhrbmZTd2dlMjVoYldVNklDZGxibVJ2Y2lkOVhTbGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0x5OGdjMlYwY3lCMGFHVWdZR052Ym5SbGJuUmdJSFJ2SUR4a2FYWWdZMnhoYzNNOVhDSnVZVzFsWENJK2NYVnBjbXRsZVR3dlpHbDJQanhrYVhZZ1kyeGhjM005WENKdVlXMWxYQ0krWlc1a2IzSThMMlJwZGo1Y2NseHVJQ0FnSUM4dklDQWdJQ0FnY21WdVpHVnlSV0ZqYUNnbmJYbDBaVzF3YkdGMFpTNXRkWE4wWVdOb1pTY3NJRnQ3Ym1GdFpUb2dKM0YxYVhKclpYa25mU3dnZTI1aGJXVTZJQ2RsYm1SdmNpZDlYU2t1WVhCd1pXNWtWRzhvSjNWc0p5azdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDOHZJR0Z3Y0dWdVpITWdkR2hsSUhKbGJtUmxjbVZrSUdOdmJuUmxiblFnZEc4Z0pDZ25kV3duS1Z4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUhKbGJtUmxja1ZoWTJnNklHWjFibU4wYVc5dUtHeHZZMkYwYVc5dUxDQnVZVzFsTENCa1lYUmhMQ0JqWVd4c1ltRmpheWtnZTF4eVhHNGdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lGTmhiVzE1TGxKbGJtUmxja052Ym5SbGVIUW9kR2hwY3lrdWNtVnVaR1Z5UldGamFDaHNiMk5oZEdsdmJpd2dibUZ0WlN3Z1pHRjBZU3dnWTJGc2JHSmhZMnNwTzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJqY21WaGRHVWdZU0J1WlhjZ1lGTmhiVzE1TGxKbGJtUmxja052Ym5SbGVIUmdJR05oYkd4cGJtY2dZR3h2WVdRb0tXQWdkMmwwYUNCZ2JHOWpZWFJwYjI1Z0lHRnVaRnh5WEc0Z0lDQWdMeThnWUc5d2RHbHZibk5nTGlCRFlXeHNaV1FnZDJsMGFHOTFkQ0JwYm5SbGNuQnZiR0YwYVc5dUlHOXlJSEJzWVdObGJXVnVkQ3dnZEdocGN5QmhiR3h2ZDNNZ1ptOXlYSEpjYmlBZ0lDQXZMeUJ3Y21Wc2IyRmthVzVuTDJOaFkyaHBibWNnZEdobElIUmxiWEJzWVhSbGN5NWNjbHh1SUNBZ0lHeHZZV1E2SUdaMWJtTjBhVzl1S0d4dlkyRjBhVzl1TENCdmNIUnBiMjV6TENCallXeHNZbUZqYXlrZ2UxeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2JtVjNJRk5oYlcxNUxsSmxibVJsY2tOdmJuUmxlSFFvZEdocGN5a3ViRzloWkNoc2IyTmhkR2x2Yml3Z2IzQjBhVzl1Y3l3Z1kyRnNiR0poWTJzcE8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCamNtVmhkR1VnWVNCdVpYY2dZRk5oYlcxNUxsSmxibVJsY2tOdmJuUmxlSFJnSUdOaGJHeHBibWNnWUd4dllXUlFZWEowYVdGc2N5Z3BZQ0IzYVhSb0lHQndZWEowYVdGc2MyQXVYSEpjYmlBZ0lDQnNiMkZrVUdGeWRHbGhiSE02SUdaMWJtTjBhVzl1S0hCaGNuUnBZV3h6S1NCN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCdVpYY2dVMkZ0YlhrdVVtVnVaR1Z5UTI5dWRHVjRkQ2gwYUdsektTNXNiMkZrVUdGeWRHbGhiSE1vY0dGeWRHbGhiSE1wTzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJnY21WdVpHVnlLQ2xnSUhSb1pTQmdiRzlqWVhScGIyNWdJSGRwZEdnZ1lHUmhkR0ZnSUdGdVpDQjBhR1Z1SUdCemQyRndLQ2xnSUhSb1pWeHlYRzRnSUNBZ0x5OGdZWEJ3SjNNZ1lDUmxiR1Z0Wlc1MFlDQjNhWFJvSUhSb1pTQnlaVzVrWlhKbFpDQmpiMjUwWlc1MExseHlYRzRnSUNBZ2NHRnlkR2xoYkRvZ1puVnVZM1JwYjI0b2JHOWpZWFJwYjI0c0lHUmhkR0VzSUdOaGJHeGlZV05yTENCd1lYSjBhV0ZzY3lrZ2UxeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2JtVjNJRk5oYlcxNUxsSmxibVJsY2tOdmJuUmxlSFFvZEdocGN5a3VjR0Z5ZEdsaGJDaHNiMk5oZEdsdmJpd2daR0YwWVN3Z1kyRnNiR0poWTJzc0lIQmhjblJwWVd4ektUdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1kzSmxZWFJsSUdFZ2JtVjNJR0JUWVcxdGVTNVNaVzVrWlhKRGIyNTBaWGgwWUNCallXeHNhVzVuSUdCelpXNWtLQ2xnSUhkcGRHZ2dZVzRnWVhKaWFYUnlZWEo1WEhKY2JpQWdJQ0F2THlCbWRXNWpkR2x2Ymx4eVhHNGdJQ0FnYzJWdVpEb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUhaaGNpQnlZM1I0SUQwZ2JtVjNJRk5oYlcxNUxsSmxibVJsY2tOdmJuUmxlSFFvZEdocGN5azdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQnlZM1I0TG5ObGJtUXVZWEJ3Ykhrb2NtTjBlQ3dnWVhKbmRXMWxiblJ6S1R0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnUTJoaGJtZGxjeUIwYUdVZ2JHOWpZWFJwYjI0Z2IyWWdkR2hsSUdOMWNuSmxiblFnZDJsdVpHOTNMaUJKWmlCZ2RHOWdJR0psWjJsdWN5QjNhWFJvWEhKY2JpQWdJQ0F2THlBbkl5Y2dhWFFnYjI1c2VTQmphR0Z1WjJWeklIUm9aU0JrYjJOMWJXVnVkQ2R6SUdoaGMyZ3VJRWxtSUhCaGMzTmxaQ0J0YjNKbElIUm9ZVzRnTVNCaGNtZDFiV1Z1ZEZ4eVhHNGdJQ0FnTHk4Z2NtVmthWEpsWTNRZ2QybHNiQ0JxYjJsdUlIUm9aVzBnZEc5blpYUm9aWElnZDJsMGFDQm1iM0ozWVhKa0lITnNZWE5vWlhNdVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJeU1qSUVWNFlXMXdiR1ZjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJSEpsWkdseVpXTjBLQ2NqTDI5MGFHVnlMM0p2ZFhSbEp5azdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDOHZJR1Z4ZFdsMllXeGxiblFnZEc5Y2NseHVJQ0FnSUM4dklDQWdJQ0FnY21Wa2FYSmxZM1FvSnlNbkxDQW5iM1JvWlhJbkxDQW5jbTkxZEdVbktUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQnlaV1JwY21WamREb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUhaaGNpQjBieXdnWVhKbmN5QTlJRjl0WVd0bFFYSnlZWGtvWVhKbmRXMWxiblJ6S1N4Y2NseHVJQ0FnSUNBZ0lDQWdJR04xY25KbGJuUmZiRzlqWVhScGIyNGdQU0IwYUdsekxtRndjQzVuWlhSTWIyTmhkR2x2YmlncExGeHlYRzRnSUNBZ0lDQWdJQ0FnYkNBOUlHRnlaM011YkdWdVozUm9PMXh5WEc0Z0lDQWdJQ0JwWmlBb2JDQStJREVwSUh0Y2NseHVJQ0FnSUNBZ0lDQjJZWElnYVNBOUlEQXNJSEJoZEdoeklEMGdXMTBzSUhCaGFYSnpJRDBnVzEwc0lIQmhjbUZ0Y3lBOUlIdDlMQ0JvWVhOZmNHRnlZVzF6SUQwZ1ptRnNjMlU3WEhKY2JpQWdJQ0FnSUNBZ1ptOXlJQ2c3SUdrZ1BDQnNPeUJwS3lzcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdsbUlDaDBlWEJsYjJZZ1lYSm5jMXRwWFNBOVBTQW5jM1J5YVc1bkp5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQndZWFJvY3k1d2RYTm9LR0Z5WjNOYmFWMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSkM1bGVIUmxibVFvY0dGeVlXMXpMQ0JoY21kelcybGRLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhR0Z6WDNCaGNtRnRjeUE5SUhSeWRXVTdYSEpjYmlBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUhSdklEMGdjR0YwYUhNdWFtOXBiaWduTHljcE8xeHlYRzRnSUNBZ0lDQWdJR2xtSUNob1lYTmZjR0Z5WVcxektTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCbWIzSWdLSFpoY2lCcklHbHVJSEJoY21GdGN5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQndZV2x5Y3k1d2RYTm9LSFJvYVhNdVlYQndMbDlsYm1OdlpHVkdiM0p0VUdGcGNpaHJMQ0J3WVhKaGJYTmJhMTBwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lIUnZJQ3M5SUNjL0p5QXJJSEJoYVhKekxtcHZhVzRvSnlZbktUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ2RHOGdQU0JoY21keld6QmRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUhSb2FYTXVkSEpwWjJkbGNpZ25jbVZrYVhKbFkzUW5MQ0I3ZEc4NklIUnZmU2s3WEhKY2JpQWdJQ0FnSUhSb2FYTXVZWEJ3TG14aGMzUmZiRzlqWVhScGIyNGdQU0JiZEdocGN5NTJaWEppTENCMGFHbHpMbkJoZEdoZE8xeHlYRzRnSUNBZ0lDQjBhR2x6TG1Gd2NDNXpaWFJNYjJOaGRHbHZiaWgwYnlrN1hISmNiaUFnSUNBZ0lHbG1JQ2h1WlhjZ1VtVm5SWGh3S0hSdktTNTBaWE4wS0dOMWNuSmxiblJmYkc5allYUnBiMjRwS1NCN1hISmNiaUFnSUNBZ0lDQWdkR2hwY3k1aGNIQXVkSEpwWjJkbGNpZ25iRzlqWVhScGIyNHRZMmhoYm1kbFpDY3BPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRlJ5YVdkblpYSnpJR1YyWlc1MGN5QnZiaUJnWVhCd1lDQjNhWFJvYVc0Z2RHaGxJR04xY25KbGJuUWdZMjl1ZEdWNGRDNWNjbHh1SUNBZ0lIUnlhV2RuWlhJNklHWjFibU4wYVc5dUtHNWhiV1VzSUdSaGRHRXBJSHRjY2x4dUlDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCa1lYUmhJRDA5SUNkMWJtUmxabWx1WldRbktTQjdJR1JoZEdFZ1BTQjdmVHNnZlZ4eVhHNGdJQ0FnSUNCcFppQW9JV1JoZEdFdVkyOXVkR1Y0ZENrZ2V5QmtZWFJoTG1OdmJuUmxlSFFnUFNCMGFHbHpPeUI5WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtRndjQzUwY21sbloyVnlLRzVoYldVc0lHUmhkR0VwTzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJCSUhOb2IzSjBZM1YwSUhSdklHRndjQ2R6SUdCbGRtVnVkRTVoYldWemNHRmpaU2dwWUZ4eVhHNGdJQ0FnWlhabGJuUk9ZVzFsYzNCaFkyVTZJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NWhjSEF1WlhabGJuUk9ZVzFsYzNCaFkyVW9LVHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdRU0J6YUc5eWRHTjFkQ0IwYnlCaGNIQW5jeUJnYzNkaGNDZ3BZRnh5WEc0Z0lDQWdjM2RoY0RvZ1puVnVZM1JwYjI0b1kyOXVkR1Z1ZEhNc0lHTmhiR3hpWVdOcktTQjdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG1Gd2NDNXpkMkZ3S0dOdmJuUmxiblJ6TENCallXeHNZbUZqYXlrN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUZKaGFYTmxjeUJoSUhCdmMzTnBZbXhsSUdCdWIzUkdiM1Z1WkNncFlDQmxjbkp2Y2lCbWIzSWdkR2hsSUdOMWNuSmxiblFnY0dGMGFDNWNjbHh1SUNBZ0lHNXZkRVp2ZFc1a09pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVlYQndMbTV2ZEVadmRXNWtLSFJvYVhNdWRtVnlZaXdnZEdocGN5NXdZWFJvS1R0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnUkdWbVlYVnNkQ0JLVTA5T0lIQmhjbk5wYm1jZ2RYTmxjeUJxVVhWbGNua25jeUJnY0dGeWMyVktVMDlPS0NsZ0xpQkpibU5zZFdSbElHQlRZVzF0ZVM1S1UwOU9ZRnh5WEc0Z0lDQWdMeThnY0d4MVoybHVJR1p2Y2lCMGFHVWdiVzl5WlNCamIyNW1iM0p0WVc1MElGd2lZM0p2WTJ0bWIzSmtJSE53WldOcFlXeGNJaTVjY2x4dUlDQWdJR3B6YjI0NklHWjFibU4wYVc5dUtITjBjbWx1WnlrZ2UxeHlYRzRnSUNBZ0lDQnlaWFIxY200Z0pDNXdZWEp6WlVwVFQwNG9jM1J5YVc1bktUdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z0x5ODlQaUJUWVcxdGVTNUZkbVZ1ZEVOdmJuUmxlSFE2SUdkbGRDQWpMeUI3ZlZ4eVhHNGdJQ0FnZEc5VGRISnBibWM2SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQnlaWFIxY200Z1hDSlRZVzF0ZVM1RmRtVnVkRU52Ym5SbGVIUTZJRndpSUNzZ1czUm9hWE11ZG1WeVlpd2dkR2hwY3k1d1lYUm9MQ0IwYUdsekxuQmhjbUZ0YzEwdWFtOXBiaWduSUNjcE8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQjlLVHRjY2x4dVhISmNiaUFnY21WMGRYSnVJRk5oYlcxNU8xeHlYRzU5S1R0Y2NseHVYSEpjYmx4dU95QmljbTkzYzJWeWFXWjVYM05vYVcxZlgyUmxabWx1WlY5ZmJXOWtkV3hsWDE5bGVIQnZjblJmWHloMGVYQmxiMllnVTJGdGJYa2dJVDBnWENKMWJtUmxabWx1WldSY0lpQS9JRk5oYlcxNUlEb2dkMmx1Wkc5M0xsTmhiVzE1S1R0Y2JseHVmU2t1WTJGc2JDaG5iRzlpWVd3c0lIVnVaR1ZtYVc1bFpDd2dkVzVrWldacGJtVmtMQ0IxYm1SbFptbHVaV1FzSUhWdVpHVm1hVzVsWkN3Z1puVnVZM1JwYjI0Z1pHVm1hVzVsUlhod2IzSjBLR1Y0S1NCN0lHMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1pYZzdJSDBwTzF4dUlsMTkiLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG5cbjsgalF1ZXJ5ID0gZ2xvYmFsLmpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG47IHZhciBfX2Jyb3dzZXJpZnlfc2hpbV9yZXF1aXJlX189cmVxdWlyZTsoZnVuY3Rpb24gYnJvd3NlcmlmeVNoaW0obW9kdWxlLCBkZWZpbmUsIHJlcXVpcmUpIHtcbi8qXHJcbkNvcHlyaWdodCAyMDEyIElnb3IgVmF5bmJlcmdcclxuXHJcblZlcnNpb246IDMuNC4yIFRpbWVzdGFtcDogTW9uIEF1ZyAxMiAxNTowNDoxMiBQRFQgMjAxM1xyXG5cclxuVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJBcGFjaGUgTGljZW5zZVwiKSBvciB0aGUgR05VXHJcbkdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgXCJHUEwgTGljZW5zZVwiKS4gWW91IG1heSBjaG9vc2UgZWl0aGVyIGxpY2Vuc2UgdG8gZ292ZXJuIHlvdXJcclxudXNlIG9mIHRoaXMgc29mdHdhcmUgb25seSB1cG9uIHRoZSBjb25kaXRpb24gdGhhdCB5b3UgYWNjZXB0IGFsbCBvZiB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBBcGFjaGVcclxuTGljZW5zZSBvciB0aGUgR1BMIExpY2Vuc2UuXHJcblxyXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIGFuZCB0aGUgR1BMIExpY2Vuc2UgYXQ6XHJcblxyXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sXHJcblxyXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZVxyXG5BcGFjaGUgTGljZW5zZSBvciB0aGUgR1BMIExpY2VzbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SXHJcbkNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgQXBhY2hlIExpY2Vuc2UgYW5kIHRoZSBHUEwgTGljZW5zZSBmb3JcclxudGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIGFuZCB0aGUgR1BMIExpY2Vuc2UuXHJcbiovXHJcbihmdW5jdGlvbiAoJCkge1xyXG4gICAgaWYodHlwZW9mICQuZm4uZWFjaDIgPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICQuZXh0ZW5kKCQuZm4sIHtcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgKiA0LTEwIHRpbWVzIGZhc3RlciAuZWFjaCByZXBsYWNlbWVudFxyXG4gICAgICAgICAgICAqIHVzZSBpdCBjYXJlZnVsbHksIGFzIGl0IG92ZXJyaWRlcyBqUXVlcnkgY29udGV4dCBvZiBlbGVtZW50IG9uIGVhY2ggaXRlcmF0aW9uXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGVhY2gyIDogZnVuY3Rpb24gKGMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBqID0gJChbMF0pLCBpID0gLTEsIGwgPSB0aGlzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChcclxuICAgICAgICAgICAgICAgICAgICArK2kgPCBsXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGouY29udGV4dCA9IGpbMF0gPSB0aGlzW2ldKVxyXG4gICAgICAgICAgICAgICAgICAgICYmIGMuY2FsbChqWzBdLCBpLCBqKSAhPT0gZmFsc2UgLy9cInRoaXNcIj1ET00sIGk9aW5kZXgsIGo9alF1ZXJ5IG9iamVjdFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0pKGpRdWVyeSk7XHJcblxyXG4oZnVuY3Rpb24gKCQsIHVuZGVmaW5lZCkge1xyXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XHJcbiAgICAvKmdsb2JhbCBkb2N1bWVudCwgd2luZG93LCBqUXVlcnksIGNvbnNvbGUgKi9cclxuXHJcbiAgICBpZiAod2luZG93LlNlbGVjdDIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgS0VZLCBBYnN0cmFjdFNlbGVjdDIsIFNpbmdsZVNlbGVjdDIsIE11bHRpU2VsZWN0MiwgbmV4dFVpZCwgc2l6ZXIsXHJcbiAgICAgICAgbGFzdE1vdXNlUG9zaXRpb249e3g6MCx5OjB9LCAkZG9jdW1lbnQsIHNjcm9sbEJhckRpbWVuc2lvbnMsXHJcblxyXG4gICAgS0VZID0ge1xyXG4gICAgICAgIFRBQjogOSxcclxuICAgICAgICBFTlRFUjogMTMsXHJcbiAgICAgICAgRVNDOiAyNyxcclxuICAgICAgICBTUEFDRTogMzIsXHJcbiAgICAgICAgTEVGVDogMzcsXHJcbiAgICAgICAgVVA6IDM4LFxyXG4gICAgICAgIFJJR0hUOiAzOSxcclxuICAgICAgICBET1dOOiA0MCxcclxuICAgICAgICBTSElGVDogMTYsXHJcbiAgICAgICAgQ1RSTDogMTcsXHJcbiAgICAgICAgQUxUOiAxOCxcclxuICAgICAgICBQQUdFX1VQOiAzMyxcclxuICAgICAgICBQQUdFX0RPV046IDM0LFxyXG4gICAgICAgIEhPTUU6IDM2LFxyXG4gICAgICAgIEVORDogMzUsXHJcbiAgICAgICAgQkFDS1NQQUNFOiA4LFxyXG4gICAgICAgIERFTEVURTogNDYsXHJcbiAgICAgICAgaXNBcnJvdzogZnVuY3Rpb24gKGspIHtcclxuICAgICAgICAgICAgayA9IGsud2hpY2ggPyBrLndoaWNoIDogaztcclxuICAgICAgICAgICAgc3dpdGNoIChrKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLkxFRlQ6XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLlJJR0hUOlxyXG4gICAgICAgICAgICBjYXNlIEtFWS5VUDpcclxuICAgICAgICAgICAgY2FzZSBLRVkuRE9XTjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzQ29udHJvbDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdmFyIGsgPSBlLndoaWNoO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGspIHtcclxuICAgICAgICAgICAgY2FzZSBLRVkuU0hJRlQ6XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLkNUUkw6XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLkFMVDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZS5tZXRhS2V5KSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzRnVuY3Rpb25LZXk6IGZ1bmN0aW9uIChrKSB7XHJcbiAgICAgICAgICAgIGsgPSBrLndoaWNoID8gay53aGljaCA6IGs7XHJcbiAgICAgICAgICAgIHJldHVybiBrID49IDExMiAmJiBrIDw9IDEyMztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgTUVBU1VSRV9TQ1JPTExCQVJfVEVNUExBVEUgPSBcIjxkaXYgY2xhc3M9J3NlbGVjdDItbWVhc3VyZS1zY3JvbGxiYXInPjwvZGl2PlwiLFxyXG5cclxuICAgIERJQUNSSVRJQ1MgPSB7XCJcXHUyNEI2XCI6XCJBXCIsXCJcXHVGRjIxXCI6XCJBXCIsXCJcXHUwMEMwXCI6XCJBXCIsXCJcXHUwMEMxXCI6XCJBXCIsXCJcXHUwMEMyXCI6XCJBXCIsXCJcXHUxRUE2XCI6XCJBXCIsXCJcXHUxRUE0XCI6XCJBXCIsXCJcXHUxRUFBXCI6XCJBXCIsXCJcXHUxRUE4XCI6XCJBXCIsXCJcXHUwMEMzXCI6XCJBXCIsXCJcXHUwMTAwXCI6XCJBXCIsXCJcXHUwMTAyXCI6XCJBXCIsXCJcXHUxRUIwXCI6XCJBXCIsXCJcXHUxRUFFXCI6XCJBXCIsXCJcXHUxRUI0XCI6XCJBXCIsXCJcXHUxRUIyXCI6XCJBXCIsXCJcXHUwMjI2XCI6XCJBXCIsXCJcXHUwMUUwXCI6XCJBXCIsXCJcXHUwMEM0XCI6XCJBXCIsXCJcXHUwMURFXCI6XCJBXCIsXCJcXHUxRUEyXCI6XCJBXCIsXCJcXHUwMEM1XCI6XCJBXCIsXCJcXHUwMUZBXCI6XCJBXCIsXCJcXHUwMUNEXCI6XCJBXCIsXCJcXHUwMjAwXCI6XCJBXCIsXCJcXHUwMjAyXCI6XCJBXCIsXCJcXHUxRUEwXCI6XCJBXCIsXCJcXHUxRUFDXCI6XCJBXCIsXCJcXHUxRUI2XCI6XCJBXCIsXCJcXHUxRTAwXCI6XCJBXCIsXCJcXHUwMTA0XCI6XCJBXCIsXCJcXHUwMjNBXCI6XCJBXCIsXCJcXHUyQzZGXCI6XCJBXCIsXCJcXHVBNzMyXCI6XCJBQVwiLFwiXFx1MDBDNlwiOlwiQUVcIixcIlxcdTAxRkNcIjpcIkFFXCIsXCJcXHUwMUUyXCI6XCJBRVwiLFwiXFx1QTczNFwiOlwiQU9cIixcIlxcdUE3MzZcIjpcIkFVXCIsXCJcXHVBNzM4XCI6XCJBVlwiLFwiXFx1QTczQVwiOlwiQVZcIixcIlxcdUE3M0NcIjpcIkFZXCIsXCJcXHUyNEI3XCI6XCJCXCIsXCJcXHVGRjIyXCI6XCJCXCIsXCJcXHUxRTAyXCI6XCJCXCIsXCJcXHUxRTA0XCI6XCJCXCIsXCJcXHUxRTA2XCI6XCJCXCIsXCJcXHUwMjQzXCI6XCJCXCIsXCJcXHUwMTgyXCI6XCJCXCIsXCJcXHUwMTgxXCI6XCJCXCIsXCJcXHUyNEI4XCI6XCJDXCIsXCJcXHVGRjIzXCI6XCJDXCIsXCJcXHUwMTA2XCI6XCJDXCIsXCJcXHUwMTA4XCI6XCJDXCIsXCJcXHUwMTBBXCI6XCJDXCIsXCJcXHUwMTBDXCI6XCJDXCIsXCJcXHUwMEM3XCI6XCJDXCIsXCJcXHUxRTA4XCI6XCJDXCIsXCJcXHUwMTg3XCI6XCJDXCIsXCJcXHUwMjNCXCI6XCJDXCIsXCJcXHVBNzNFXCI6XCJDXCIsXCJcXHUyNEI5XCI6XCJEXCIsXCJcXHVGRjI0XCI6XCJEXCIsXCJcXHUxRTBBXCI6XCJEXCIsXCJcXHUwMTBFXCI6XCJEXCIsXCJcXHUxRTBDXCI6XCJEXCIsXCJcXHUxRTEwXCI6XCJEXCIsXCJcXHUxRTEyXCI6XCJEXCIsXCJcXHUxRTBFXCI6XCJEXCIsXCJcXHUwMTEwXCI6XCJEXCIsXCJcXHUwMThCXCI6XCJEXCIsXCJcXHUwMThBXCI6XCJEXCIsXCJcXHUwMTg5XCI6XCJEXCIsXCJcXHVBNzc5XCI6XCJEXCIsXCJcXHUwMUYxXCI6XCJEWlwiLFwiXFx1MDFDNFwiOlwiRFpcIixcIlxcdTAxRjJcIjpcIkR6XCIsXCJcXHUwMUM1XCI6XCJEelwiLFwiXFx1MjRCQVwiOlwiRVwiLFwiXFx1RkYyNVwiOlwiRVwiLFwiXFx1MDBDOFwiOlwiRVwiLFwiXFx1MDBDOVwiOlwiRVwiLFwiXFx1MDBDQVwiOlwiRVwiLFwiXFx1MUVDMFwiOlwiRVwiLFwiXFx1MUVCRVwiOlwiRVwiLFwiXFx1MUVDNFwiOlwiRVwiLFwiXFx1MUVDMlwiOlwiRVwiLFwiXFx1MUVCQ1wiOlwiRVwiLFwiXFx1MDExMlwiOlwiRVwiLFwiXFx1MUUxNFwiOlwiRVwiLFwiXFx1MUUxNlwiOlwiRVwiLFwiXFx1MDExNFwiOlwiRVwiLFwiXFx1MDExNlwiOlwiRVwiLFwiXFx1MDBDQlwiOlwiRVwiLFwiXFx1MUVCQVwiOlwiRVwiLFwiXFx1MDExQVwiOlwiRVwiLFwiXFx1MDIwNFwiOlwiRVwiLFwiXFx1MDIwNlwiOlwiRVwiLFwiXFx1MUVCOFwiOlwiRVwiLFwiXFx1MUVDNlwiOlwiRVwiLFwiXFx1MDIyOFwiOlwiRVwiLFwiXFx1MUUxQ1wiOlwiRVwiLFwiXFx1MDExOFwiOlwiRVwiLFwiXFx1MUUxOFwiOlwiRVwiLFwiXFx1MUUxQVwiOlwiRVwiLFwiXFx1MDE5MFwiOlwiRVwiLFwiXFx1MDE4RVwiOlwiRVwiLFwiXFx1MjRCQlwiOlwiRlwiLFwiXFx1RkYyNlwiOlwiRlwiLFwiXFx1MUUxRVwiOlwiRlwiLFwiXFx1MDE5MVwiOlwiRlwiLFwiXFx1QTc3QlwiOlwiRlwiLFwiXFx1MjRCQ1wiOlwiR1wiLFwiXFx1RkYyN1wiOlwiR1wiLFwiXFx1MDFGNFwiOlwiR1wiLFwiXFx1MDExQ1wiOlwiR1wiLFwiXFx1MUUyMFwiOlwiR1wiLFwiXFx1MDExRVwiOlwiR1wiLFwiXFx1MDEyMFwiOlwiR1wiLFwiXFx1MDFFNlwiOlwiR1wiLFwiXFx1MDEyMlwiOlwiR1wiLFwiXFx1MDFFNFwiOlwiR1wiLFwiXFx1MDE5M1wiOlwiR1wiLFwiXFx1QTdBMFwiOlwiR1wiLFwiXFx1QTc3RFwiOlwiR1wiLFwiXFx1QTc3RVwiOlwiR1wiLFwiXFx1MjRCRFwiOlwiSFwiLFwiXFx1RkYyOFwiOlwiSFwiLFwiXFx1MDEyNFwiOlwiSFwiLFwiXFx1MUUyMlwiOlwiSFwiLFwiXFx1MUUyNlwiOlwiSFwiLFwiXFx1MDIxRVwiOlwiSFwiLFwiXFx1MUUyNFwiOlwiSFwiLFwiXFx1MUUyOFwiOlwiSFwiLFwiXFx1MUUyQVwiOlwiSFwiLFwiXFx1MDEyNlwiOlwiSFwiLFwiXFx1MkM2N1wiOlwiSFwiLFwiXFx1MkM3NVwiOlwiSFwiLFwiXFx1QTc4RFwiOlwiSFwiLFwiXFx1MjRCRVwiOlwiSVwiLFwiXFx1RkYyOVwiOlwiSVwiLFwiXFx1MDBDQ1wiOlwiSVwiLFwiXFx1MDBDRFwiOlwiSVwiLFwiXFx1MDBDRVwiOlwiSVwiLFwiXFx1MDEyOFwiOlwiSVwiLFwiXFx1MDEyQVwiOlwiSVwiLFwiXFx1MDEyQ1wiOlwiSVwiLFwiXFx1MDEzMFwiOlwiSVwiLFwiXFx1MDBDRlwiOlwiSVwiLFwiXFx1MUUyRVwiOlwiSVwiLFwiXFx1MUVDOFwiOlwiSVwiLFwiXFx1MDFDRlwiOlwiSVwiLFwiXFx1MDIwOFwiOlwiSVwiLFwiXFx1MDIwQVwiOlwiSVwiLFwiXFx1MUVDQVwiOlwiSVwiLFwiXFx1MDEyRVwiOlwiSVwiLFwiXFx1MUUyQ1wiOlwiSVwiLFwiXFx1MDE5N1wiOlwiSVwiLFwiXFx1MjRCRlwiOlwiSlwiLFwiXFx1RkYyQVwiOlwiSlwiLFwiXFx1MDEzNFwiOlwiSlwiLFwiXFx1MDI0OFwiOlwiSlwiLFwiXFx1MjRDMFwiOlwiS1wiLFwiXFx1RkYyQlwiOlwiS1wiLFwiXFx1MUUzMFwiOlwiS1wiLFwiXFx1MDFFOFwiOlwiS1wiLFwiXFx1MUUzMlwiOlwiS1wiLFwiXFx1MDEzNlwiOlwiS1wiLFwiXFx1MUUzNFwiOlwiS1wiLFwiXFx1MDE5OFwiOlwiS1wiLFwiXFx1MkM2OVwiOlwiS1wiLFwiXFx1QTc0MFwiOlwiS1wiLFwiXFx1QTc0MlwiOlwiS1wiLFwiXFx1QTc0NFwiOlwiS1wiLFwiXFx1QTdBMlwiOlwiS1wiLFwiXFx1MjRDMVwiOlwiTFwiLFwiXFx1RkYyQ1wiOlwiTFwiLFwiXFx1MDEzRlwiOlwiTFwiLFwiXFx1MDEzOVwiOlwiTFwiLFwiXFx1MDEzRFwiOlwiTFwiLFwiXFx1MUUzNlwiOlwiTFwiLFwiXFx1MUUzOFwiOlwiTFwiLFwiXFx1MDEzQlwiOlwiTFwiLFwiXFx1MUUzQ1wiOlwiTFwiLFwiXFx1MUUzQVwiOlwiTFwiLFwiXFx1MDE0MVwiOlwiTFwiLFwiXFx1MDIzRFwiOlwiTFwiLFwiXFx1MkM2MlwiOlwiTFwiLFwiXFx1MkM2MFwiOlwiTFwiLFwiXFx1QTc0OFwiOlwiTFwiLFwiXFx1QTc0NlwiOlwiTFwiLFwiXFx1QTc4MFwiOlwiTFwiLFwiXFx1MDFDN1wiOlwiTEpcIixcIlxcdTAxQzhcIjpcIkxqXCIsXCJcXHUyNEMyXCI6XCJNXCIsXCJcXHVGRjJEXCI6XCJNXCIsXCJcXHUxRTNFXCI6XCJNXCIsXCJcXHUxRTQwXCI6XCJNXCIsXCJcXHUxRTQyXCI6XCJNXCIsXCJcXHUyQzZFXCI6XCJNXCIsXCJcXHUwMTlDXCI6XCJNXCIsXCJcXHUyNEMzXCI6XCJOXCIsXCJcXHVGRjJFXCI6XCJOXCIsXCJcXHUwMUY4XCI6XCJOXCIsXCJcXHUwMTQzXCI6XCJOXCIsXCJcXHUwMEQxXCI6XCJOXCIsXCJcXHUxRTQ0XCI6XCJOXCIsXCJcXHUwMTQ3XCI6XCJOXCIsXCJcXHUxRTQ2XCI6XCJOXCIsXCJcXHUwMTQ1XCI6XCJOXCIsXCJcXHUxRTRBXCI6XCJOXCIsXCJcXHUxRTQ4XCI6XCJOXCIsXCJcXHUwMjIwXCI6XCJOXCIsXCJcXHUwMTlEXCI6XCJOXCIsXCJcXHVBNzkwXCI6XCJOXCIsXCJcXHVBN0E0XCI6XCJOXCIsXCJcXHUwMUNBXCI6XCJOSlwiLFwiXFx1MDFDQlwiOlwiTmpcIixcIlxcdTI0QzRcIjpcIk9cIixcIlxcdUZGMkZcIjpcIk9cIixcIlxcdTAwRDJcIjpcIk9cIixcIlxcdTAwRDNcIjpcIk9cIixcIlxcdTAwRDRcIjpcIk9cIixcIlxcdTFFRDJcIjpcIk9cIixcIlxcdTFFRDBcIjpcIk9cIixcIlxcdTFFRDZcIjpcIk9cIixcIlxcdTFFRDRcIjpcIk9cIixcIlxcdTAwRDVcIjpcIk9cIixcIlxcdTFFNENcIjpcIk9cIixcIlxcdTAyMkNcIjpcIk9cIixcIlxcdTFFNEVcIjpcIk9cIixcIlxcdTAxNENcIjpcIk9cIixcIlxcdTFFNTBcIjpcIk9cIixcIlxcdTFFNTJcIjpcIk9cIixcIlxcdTAxNEVcIjpcIk9cIixcIlxcdTAyMkVcIjpcIk9cIixcIlxcdTAyMzBcIjpcIk9cIixcIlxcdTAwRDZcIjpcIk9cIixcIlxcdTAyMkFcIjpcIk9cIixcIlxcdTFFQ0VcIjpcIk9cIixcIlxcdTAxNTBcIjpcIk9cIixcIlxcdTAxRDFcIjpcIk9cIixcIlxcdTAyMENcIjpcIk9cIixcIlxcdTAyMEVcIjpcIk9cIixcIlxcdTAxQTBcIjpcIk9cIixcIlxcdTFFRENcIjpcIk9cIixcIlxcdTFFREFcIjpcIk9cIixcIlxcdTFFRTBcIjpcIk9cIixcIlxcdTFFREVcIjpcIk9cIixcIlxcdTFFRTJcIjpcIk9cIixcIlxcdTFFQ0NcIjpcIk9cIixcIlxcdTFFRDhcIjpcIk9cIixcIlxcdTAxRUFcIjpcIk9cIixcIlxcdTAxRUNcIjpcIk9cIixcIlxcdTAwRDhcIjpcIk9cIixcIlxcdTAxRkVcIjpcIk9cIixcIlxcdTAxODZcIjpcIk9cIixcIlxcdTAxOUZcIjpcIk9cIixcIlxcdUE3NEFcIjpcIk9cIixcIlxcdUE3NENcIjpcIk9cIixcIlxcdTAxQTJcIjpcIk9JXCIsXCJcXHVBNzRFXCI6XCJPT1wiLFwiXFx1MDIyMlwiOlwiT1VcIixcIlxcdTI0QzVcIjpcIlBcIixcIlxcdUZGMzBcIjpcIlBcIixcIlxcdTFFNTRcIjpcIlBcIixcIlxcdTFFNTZcIjpcIlBcIixcIlxcdTAxQTRcIjpcIlBcIixcIlxcdTJDNjNcIjpcIlBcIixcIlxcdUE3NTBcIjpcIlBcIixcIlxcdUE3NTJcIjpcIlBcIixcIlxcdUE3NTRcIjpcIlBcIixcIlxcdTI0QzZcIjpcIlFcIixcIlxcdUZGMzFcIjpcIlFcIixcIlxcdUE3NTZcIjpcIlFcIixcIlxcdUE3NThcIjpcIlFcIixcIlxcdTAyNEFcIjpcIlFcIixcIlxcdTI0QzdcIjpcIlJcIixcIlxcdUZGMzJcIjpcIlJcIixcIlxcdTAxNTRcIjpcIlJcIixcIlxcdTFFNThcIjpcIlJcIixcIlxcdTAxNThcIjpcIlJcIixcIlxcdTAyMTBcIjpcIlJcIixcIlxcdTAyMTJcIjpcIlJcIixcIlxcdTFFNUFcIjpcIlJcIixcIlxcdTFFNUNcIjpcIlJcIixcIlxcdTAxNTZcIjpcIlJcIixcIlxcdTFFNUVcIjpcIlJcIixcIlxcdTAyNENcIjpcIlJcIixcIlxcdTJDNjRcIjpcIlJcIixcIlxcdUE3NUFcIjpcIlJcIixcIlxcdUE3QTZcIjpcIlJcIixcIlxcdUE3ODJcIjpcIlJcIixcIlxcdTI0QzhcIjpcIlNcIixcIlxcdUZGMzNcIjpcIlNcIixcIlxcdTFFOUVcIjpcIlNcIixcIlxcdTAxNUFcIjpcIlNcIixcIlxcdTFFNjRcIjpcIlNcIixcIlxcdTAxNUNcIjpcIlNcIixcIlxcdTFFNjBcIjpcIlNcIixcIlxcdTAxNjBcIjpcIlNcIixcIlxcdTFFNjZcIjpcIlNcIixcIlxcdTFFNjJcIjpcIlNcIixcIlxcdTFFNjhcIjpcIlNcIixcIlxcdTAyMThcIjpcIlNcIixcIlxcdTAxNUVcIjpcIlNcIixcIlxcdTJDN0VcIjpcIlNcIixcIlxcdUE3QThcIjpcIlNcIixcIlxcdUE3ODRcIjpcIlNcIixcIlxcdTI0QzlcIjpcIlRcIixcIlxcdUZGMzRcIjpcIlRcIixcIlxcdTFFNkFcIjpcIlRcIixcIlxcdTAxNjRcIjpcIlRcIixcIlxcdTFFNkNcIjpcIlRcIixcIlxcdTAyMUFcIjpcIlRcIixcIlxcdTAxNjJcIjpcIlRcIixcIlxcdTFFNzBcIjpcIlRcIixcIlxcdTFFNkVcIjpcIlRcIixcIlxcdTAxNjZcIjpcIlRcIixcIlxcdTAxQUNcIjpcIlRcIixcIlxcdTAxQUVcIjpcIlRcIixcIlxcdTAyM0VcIjpcIlRcIixcIlxcdUE3ODZcIjpcIlRcIixcIlxcdUE3MjhcIjpcIlRaXCIsXCJcXHUyNENBXCI6XCJVXCIsXCJcXHVGRjM1XCI6XCJVXCIsXCJcXHUwMEQ5XCI6XCJVXCIsXCJcXHUwMERBXCI6XCJVXCIsXCJcXHUwMERCXCI6XCJVXCIsXCJcXHUwMTY4XCI6XCJVXCIsXCJcXHUxRTc4XCI6XCJVXCIsXCJcXHUwMTZBXCI6XCJVXCIsXCJcXHUxRTdBXCI6XCJVXCIsXCJcXHUwMTZDXCI6XCJVXCIsXCJcXHUwMERDXCI6XCJVXCIsXCJcXHUwMURCXCI6XCJVXCIsXCJcXHUwMUQ3XCI6XCJVXCIsXCJcXHUwMUQ1XCI6XCJVXCIsXCJcXHUwMUQ5XCI6XCJVXCIsXCJcXHUxRUU2XCI6XCJVXCIsXCJcXHUwMTZFXCI6XCJVXCIsXCJcXHUwMTcwXCI6XCJVXCIsXCJcXHUwMUQzXCI6XCJVXCIsXCJcXHUwMjE0XCI6XCJVXCIsXCJcXHUwMjE2XCI6XCJVXCIsXCJcXHUwMUFGXCI6XCJVXCIsXCJcXHUxRUVBXCI6XCJVXCIsXCJcXHUxRUU4XCI6XCJVXCIsXCJcXHUxRUVFXCI6XCJVXCIsXCJcXHUxRUVDXCI6XCJVXCIsXCJcXHUxRUYwXCI6XCJVXCIsXCJcXHUxRUU0XCI6XCJVXCIsXCJcXHUxRTcyXCI6XCJVXCIsXCJcXHUwMTcyXCI6XCJVXCIsXCJcXHUxRTc2XCI6XCJVXCIsXCJcXHUxRTc0XCI6XCJVXCIsXCJcXHUwMjQ0XCI6XCJVXCIsXCJcXHUyNENCXCI6XCJWXCIsXCJcXHVGRjM2XCI6XCJWXCIsXCJcXHUxRTdDXCI6XCJWXCIsXCJcXHUxRTdFXCI6XCJWXCIsXCJcXHUwMUIyXCI6XCJWXCIsXCJcXHVBNzVFXCI6XCJWXCIsXCJcXHUwMjQ1XCI6XCJWXCIsXCJcXHVBNzYwXCI6XCJWWVwiLFwiXFx1MjRDQ1wiOlwiV1wiLFwiXFx1RkYzN1wiOlwiV1wiLFwiXFx1MUU4MFwiOlwiV1wiLFwiXFx1MUU4MlwiOlwiV1wiLFwiXFx1MDE3NFwiOlwiV1wiLFwiXFx1MUU4NlwiOlwiV1wiLFwiXFx1MUU4NFwiOlwiV1wiLFwiXFx1MUU4OFwiOlwiV1wiLFwiXFx1MkM3MlwiOlwiV1wiLFwiXFx1MjRDRFwiOlwiWFwiLFwiXFx1RkYzOFwiOlwiWFwiLFwiXFx1MUU4QVwiOlwiWFwiLFwiXFx1MUU4Q1wiOlwiWFwiLFwiXFx1MjRDRVwiOlwiWVwiLFwiXFx1RkYzOVwiOlwiWVwiLFwiXFx1MUVGMlwiOlwiWVwiLFwiXFx1MDBERFwiOlwiWVwiLFwiXFx1MDE3NlwiOlwiWVwiLFwiXFx1MUVGOFwiOlwiWVwiLFwiXFx1MDIzMlwiOlwiWVwiLFwiXFx1MUU4RVwiOlwiWVwiLFwiXFx1MDE3OFwiOlwiWVwiLFwiXFx1MUVGNlwiOlwiWVwiLFwiXFx1MUVGNFwiOlwiWVwiLFwiXFx1MDFCM1wiOlwiWVwiLFwiXFx1MDI0RVwiOlwiWVwiLFwiXFx1MUVGRVwiOlwiWVwiLFwiXFx1MjRDRlwiOlwiWlwiLFwiXFx1RkYzQVwiOlwiWlwiLFwiXFx1MDE3OVwiOlwiWlwiLFwiXFx1MUU5MFwiOlwiWlwiLFwiXFx1MDE3QlwiOlwiWlwiLFwiXFx1MDE3RFwiOlwiWlwiLFwiXFx1MUU5MlwiOlwiWlwiLFwiXFx1MUU5NFwiOlwiWlwiLFwiXFx1MDFCNVwiOlwiWlwiLFwiXFx1MDIyNFwiOlwiWlwiLFwiXFx1MkM3RlwiOlwiWlwiLFwiXFx1MkM2QlwiOlwiWlwiLFwiXFx1QTc2MlwiOlwiWlwiLFwiXFx1MjREMFwiOlwiYVwiLFwiXFx1RkY0MVwiOlwiYVwiLFwiXFx1MUU5QVwiOlwiYVwiLFwiXFx1MDBFMFwiOlwiYVwiLFwiXFx1MDBFMVwiOlwiYVwiLFwiXFx1MDBFMlwiOlwiYVwiLFwiXFx1MUVBN1wiOlwiYVwiLFwiXFx1MUVBNVwiOlwiYVwiLFwiXFx1MUVBQlwiOlwiYVwiLFwiXFx1MUVBOVwiOlwiYVwiLFwiXFx1MDBFM1wiOlwiYVwiLFwiXFx1MDEwMVwiOlwiYVwiLFwiXFx1MDEwM1wiOlwiYVwiLFwiXFx1MUVCMVwiOlwiYVwiLFwiXFx1MUVBRlwiOlwiYVwiLFwiXFx1MUVCNVwiOlwiYVwiLFwiXFx1MUVCM1wiOlwiYVwiLFwiXFx1MDIyN1wiOlwiYVwiLFwiXFx1MDFFMVwiOlwiYVwiLFwiXFx1MDBFNFwiOlwiYVwiLFwiXFx1MDFERlwiOlwiYVwiLFwiXFx1MUVBM1wiOlwiYVwiLFwiXFx1MDBFNVwiOlwiYVwiLFwiXFx1MDFGQlwiOlwiYVwiLFwiXFx1MDFDRVwiOlwiYVwiLFwiXFx1MDIwMVwiOlwiYVwiLFwiXFx1MDIwM1wiOlwiYVwiLFwiXFx1MUVBMVwiOlwiYVwiLFwiXFx1MUVBRFwiOlwiYVwiLFwiXFx1MUVCN1wiOlwiYVwiLFwiXFx1MUUwMVwiOlwiYVwiLFwiXFx1MDEwNVwiOlwiYVwiLFwiXFx1MkM2NVwiOlwiYVwiLFwiXFx1MDI1MFwiOlwiYVwiLFwiXFx1QTczM1wiOlwiYWFcIixcIlxcdTAwRTZcIjpcImFlXCIsXCJcXHUwMUZEXCI6XCJhZVwiLFwiXFx1MDFFM1wiOlwiYWVcIixcIlxcdUE3MzVcIjpcImFvXCIsXCJcXHVBNzM3XCI6XCJhdVwiLFwiXFx1QTczOVwiOlwiYXZcIixcIlxcdUE3M0JcIjpcImF2XCIsXCJcXHVBNzNEXCI6XCJheVwiLFwiXFx1MjREMVwiOlwiYlwiLFwiXFx1RkY0MlwiOlwiYlwiLFwiXFx1MUUwM1wiOlwiYlwiLFwiXFx1MUUwNVwiOlwiYlwiLFwiXFx1MUUwN1wiOlwiYlwiLFwiXFx1MDE4MFwiOlwiYlwiLFwiXFx1MDE4M1wiOlwiYlwiLFwiXFx1MDI1M1wiOlwiYlwiLFwiXFx1MjREMlwiOlwiY1wiLFwiXFx1RkY0M1wiOlwiY1wiLFwiXFx1MDEwN1wiOlwiY1wiLFwiXFx1MDEwOVwiOlwiY1wiLFwiXFx1MDEwQlwiOlwiY1wiLFwiXFx1MDEwRFwiOlwiY1wiLFwiXFx1MDBFN1wiOlwiY1wiLFwiXFx1MUUwOVwiOlwiY1wiLFwiXFx1MDE4OFwiOlwiY1wiLFwiXFx1MDIzQ1wiOlwiY1wiLFwiXFx1QTczRlwiOlwiY1wiLFwiXFx1MjE4NFwiOlwiY1wiLFwiXFx1MjREM1wiOlwiZFwiLFwiXFx1RkY0NFwiOlwiZFwiLFwiXFx1MUUwQlwiOlwiZFwiLFwiXFx1MDEwRlwiOlwiZFwiLFwiXFx1MUUwRFwiOlwiZFwiLFwiXFx1MUUxMVwiOlwiZFwiLFwiXFx1MUUxM1wiOlwiZFwiLFwiXFx1MUUwRlwiOlwiZFwiLFwiXFx1MDExMVwiOlwiZFwiLFwiXFx1MDE4Q1wiOlwiZFwiLFwiXFx1MDI1NlwiOlwiZFwiLFwiXFx1MDI1N1wiOlwiZFwiLFwiXFx1QTc3QVwiOlwiZFwiLFwiXFx1MDFGM1wiOlwiZHpcIixcIlxcdTAxQzZcIjpcImR6XCIsXCJcXHUyNEQ0XCI6XCJlXCIsXCJcXHVGRjQ1XCI6XCJlXCIsXCJcXHUwMEU4XCI6XCJlXCIsXCJcXHUwMEU5XCI6XCJlXCIsXCJcXHUwMEVBXCI6XCJlXCIsXCJcXHUxRUMxXCI6XCJlXCIsXCJcXHUxRUJGXCI6XCJlXCIsXCJcXHUxRUM1XCI6XCJlXCIsXCJcXHUxRUMzXCI6XCJlXCIsXCJcXHUxRUJEXCI6XCJlXCIsXCJcXHUwMTEzXCI6XCJlXCIsXCJcXHUxRTE1XCI6XCJlXCIsXCJcXHUxRTE3XCI6XCJlXCIsXCJcXHUwMTE1XCI6XCJlXCIsXCJcXHUwMTE3XCI6XCJlXCIsXCJcXHUwMEVCXCI6XCJlXCIsXCJcXHUxRUJCXCI6XCJlXCIsXCJcXHUwMTFCXCI6XCJlXCIsXCJcXHUwMjA1XCI6XCJlXCIsXCJcXHUwMjA3XCI6XCJlXCIsXCJcXHUxRUI5XCI6XCJlXCIsXCJcXHUxRUM3XCI6XCJlXCIsXCJcXHUwMjI5XCI6XCJlXCIsXCJcXHUxRTFEXCI6XCJlXCIsXCJcXHUwMTE5XCI6XCJlXCIsXCJcXHUxRTE5XCI6XCJlXCIsXCJcXHUxRTFCXCI6XCJlXCIsXCJcXHUwMjQ3XCI6XCJlXCIsXCJcXHUwMjVCXCI6XCJlXCIsXCJcXHUwMUREXCI6XCJlXCIsXCJcXHUyNEQ1XCI6XCJmXCIsXCJcXHVGRjQ2XCI6XCJmXCIsXCJcXHUxRTFGXCI6XCJmXCIsXCJcXHUwMTkyXCI6XCJmXCIsXCJcXHVBNzdDXCI6XCJmXCIsXCJcXHUyNEQ2XCI6XCJnXCIsXCJcXHVGRjQ3XCI6XCJnXCIsXCJcXHUwMUY1XCI6XCJnXCIsXCJcXHUwMTFEXCI6XCJnXCIsXCJcXHUxRTIxXCI6XCJnXCIsXCJcXHUwMTFGXCI6XCJnXCIsXCJcXHUwMTIxXCI6XCJnXCIsXCJcXHUwMUU3XCI6XCJnXCIsXCJcXHUwMTIzXCI6XCJnXCIsXCJcXHUwMUU1XCI6XCJnXCIsXCJcXHUwMjYwXCI6XCJnXCIsXCJcXHVBN0ExXCI6XCJnXCIsXCJcXHUxRDc5XCI6XCJnXCIsXCJcXHVBNzdGXCI6XCJnXCIsXCJcXHUyNEQ3XCI6XCJoXCIsXCJcXHVGRjQ4XCI6XCJoXCIsXCJcXHUwMTI1XCI6XCJoXCIsXCJcXHUxRTIzXCI6XCJoXCIsXCJcXHUxRTI3XCI6XCJoXCIsXCJcXHUwMjFGXCI6XCJoXCIsXCJcXHUxRTI1XCI6XCJoXCIsXCJcXHUxRTI5XCI6XCJoXCIsXCJcXHUxRTJCXCI6XCJoXCIsXCJcXHUxRTk2XCI6XCJoXCIsXCJcXHUwMTI3XCI6XCJoXCIsXCJcXHUyQzY4XCI6XCJoXCIsXCJcXHUyQzc2XCI6XCJoXCIsXCJcXHUwMjY1XCI6XCJoXCIsXCJcXHUwMTk1XCI6XCJodlwiLFwiXFx1MjREOFwiOlwiaVwiLFwiXFx1RkY0OVwiOlwiaVwiLFwiXFx1MDBFQ1wiOlwiaVwiLFwiXFx1MDBFRFwiOlwiaVwiLFwiXFx1MDBFRVwiOlwiaVwiLFwiXFx1MDEyOVwiOlwiaVwiLFwiXFx1MDEyQlwiOlwiaVwiLFwiXFx1MDEyRFwiOlwiaVwiLFwiXFx1MDBFRlwiOlwiaVwiLFwiXFx1MUUyRlwiOlwiaVwiLFwiXFx1MUVDOVwiOlwiaVwiLFwiXFx1MDFEMFwiOlwiaVwiLFwiXFx1MDIwOVwiOlwiaVwiLFwiXFx1MDIwQlwiOlwiaVwiLFwiXFx1MUVDQlwiOlwiaVwiLFwiXFx1MDEyRlwiOlwiaVwiLFwiXFx1MUUyRFwiOlwiaVwiLFwiXFx1MDI2OFwiOlwiaVwiLFwiXFx1MDEzMVwiOlwiaVwiLFwiXFx1MjREOVwiOlwialwiLFwiXFx1RkY0QVwiOlwialwiLFwiXFx1MDEzNVwiOlwialwiLFwiXFx1MDFGMFwiOlwialwiLFwiXFx1MDI0OVwiOlwialwiLFwiXFx1MjREQVwiOlwia1wiLFwiXFx1RkY0QlwiOlwia1wiLFwiXFx1MUUzMVwiOlwia1wiLFwiXFx1MDFFOVwiOlwia1wiLFwiXFx1MUUzM1wiOlwia1wiLFwiXFx1MDEzN1wiOlwia1wiLFwiXFx1MUUzNVwiOlwia1wiLFwiXFx1MDE5OVwiOlwia1wiLFwiXFx1MkM2QVwiOlwia1wiLFwiXFx1QTc0MVwiOlwia1wiLFwiXFx1QTc0M1wiOlwia1wiLFwiXFx1QTc0NVwiOlwia1wiLFwiXFx1QTdBM1wiOlwia1wiLFwiXFx1MjREQlwiOlwibFwiLFwiXFx1RkY0Q1wiOlwibFwiLFwiXFx1MDE0MFwiOlwibFwiLFwiXFx1MDEzQVwiOlwibFwiLFwiXFx1MDEzRVwiOlwibFwiLFwiXFx1MUUzN1wiOlwibFwiLFwiXFx1MUUzOVwiOlwibFwiLFwiXFx1MDEzQ1wiOlwibFwiLFwiXFx1MUUzRFwiOlwibFwiLFwiXFx1MUUzQlwiOlwibFwiLFwiXFx1MDE3RlwiOlwibFwiLFwiXFx1MDE0MlwiOlwibFwiLFwiXFx1MDE5QVwiOlwibFwiLFwiXFx1MDI2QlwiOlwibFwiLFwiXFx1MkM2MVwiOlwibFwiLFwiXFx1QTc0OVwiOlwibFwiLFwiXFx1QTc4MVwiOlwibFwiLFwiXFx1QTc0N1wiOlwibFwiLFwiXFx1MDFDOVwiOlwibGpcIixcIlxcdTI0RENcIjpcIm1cIixcIlxcdUZGNERcIjpcIm1cIixcIlxcdTFFM0ZcIjpcIm1cIixcIlxcdTFFNDFcIjpcIm1cIixcIlxcdTFFNDNcIjpcIm1cIixcIlxcdTAyNzFcIjpcIm1cIixcIlxcdTAyNkZcIjpcIm1cIixcIlxcdTI0RERcIjpcIm5cIixcIlxcdUZGNEVcIjpcIm5cIixcIlxcdTAxRjlcIjpcIm5cIixcIlxcdTAxNDRcIjpcIm5cIixcIlxcdTAwRjFcIjpcIm5cIixcIlxcdTFFNDVcIjpcIm5cIixcIlxcdTAxNDhcIjpcIm5cIixcIlxcdTFFNDdcIjpcIm5cIixcIlxcdTAxNDZcIjpcIm5cIixcIlxcdTFFNEJcIjpcIm5cIixcIlxcdTFFNDlcIjpcIm5cIixcIlxcdTAxOUVcIjpcIm5cIixcIlxcdTAyNzJcIjpcIm5cIixcIlxcdTAxNDlcIjpcIm5cIixcIlxcdUE3OTFcIjpcIm5cIixcIlxcdUE3QTVcIjpcIm5cIixcIlxcdTAxQ0NcIjpcIm5qXCIsXCJcXHUyNERFXCI6XCJvXCIsXCJcXHVGRjRGXCI6XCJvXCIsXCJcXHUwMEYyXCI6XCJvXCIsXCJcXHUwMEYzXCI6XCJvXCIsXCJcXHUwMEY0XCI6XCJvXCIsXCJcXHUxRUQzXCI6XCJvXCIsXCJcXHUxRUQxXCI6XCJvXCIsXCJcXHUxRUQ3XCI6XCJvXCIsXCJcXHUxRUQ1XCI6XCJvXCIsXCJcXHUwMEY1XCI6XCJvXCIsXCJcXHUxRTREXCI6XCJvXCIsXCJcXHUwMjJEXCI6XCJvXCIsXCJcXHUxRTRGXCI6XCJvXCIsXCJcXHUwMTREXCI6XCJvXCIsXCJcXHUxRTUxXCI6XCJvXCIsXCJcXHUxRTUzXCI6XCJvXCIsXCJcXHUwMTRGXCI6XCJvXCIsXCJcXHUwMjJGXCI6XCJvXCIsXCJcXHUwMjMxXCI6XCJvXCIsXCJcXHUwMEY2XCI6XCJvXCIsXCJcXHUwMjJCXCI6XCJvXCIsXCJcXHUxRUNGXCI6XCJvXCIsXCJcXHUwMTUxXCI6XCJvXCIsXCJcXHUwMUQyXCI6XCJvXCIsXCJcXHUwMjBEXCI6XCJvXCIsXCJcXHUwMjBGXCI6XCJvXCIsXCJcXHUwMUExXCI6XCJvXCIsXCJcXHUxRUREXCI6XCJvXCIsXCJcXHUxRURCXCI6XCJvXCIsXCJcXHUxRUUxXCI6XCJvXCIsXCJcXHUxRURGXCI6XCJvXCIsXCJcXHUxRUUzXCI6XCJvXCIsXCJcXHUxRUNEXCI6XCJvXCIsXCJcXHUxRUQ5XCI6XCJvXCIsXCJcXHUwMUVCXCI6XCJvXCIsXCJcXHUwMUVEXCI6XCJvXCIsXCJcXHUwMEY4XCI6XCJvXCIsXCJcXHUwMUZGXCI6XCJvXCIsXCJcXHUwMjU0XCI6XCJvXCIsXCJcXHVBNzRCXCI6XCJvXCIsXCJcXHVBNzREXCI6XCJvXCIsXCJcXHUwMjc1XCI6XCJvXCIsXCJcXHUwMUEzXCI6XCJvaVwiLFwiXFx1MDIyM1wiOlwib3VcIixcIlxcdUE3NEZcIjpcIm9vXCIsXCJcXHUyNERGXCI6XCJwXCIsXCJcXHVGRjUwXCI6XCJwXCIsXCJcXHUxRTU1XCI6XCJwXCIsXCJcXHUxRTU3XCI6XCJwXCIsXCJcXHUwMUE1XCI6XCJwXCIsXCJcXHUxRDdEXCI6XCJwXCIsXCJcXHVBNzUxXCI6XCJwXCIsXCJcXHVBNzUzXCI6XCJwXCIsXCJcXHVBNzU1XCI6XCJwXCIsXCJcXHUyNEUwXCI6XCJxXCIsXCJcXHVGRjUxXCI6XCJxXCIsXCJcXHUwMjRCXCI6XCJxXCIsXCJcXHVBNzU3XCI6XCJxXCIsXCJcXHVBNzU5XCI6XCJxXCIsXCJcXHUyNEUxXCI6XCJyXCIsXCJcXHVGRjUyXCI6XCJyXCIsXCJcXHUwMTU1XCI6XCJyXCIsXCJcXHUxRTU5XCI6XCJyXCIsXCJcXHUwMTU5XCI6XCJyXCIsXCJcXHUwMjExXCI6XCJyXCIsXCJcXHUwMjEzXCI6XCJyXCIsXCJcXHUxRTVCXCI6XCJyXCIsXCJcXHUxRTVEXCI6XCJyXCIsXCJcXHUwMTU3XCI6XCJyXCIsXCJcXHUxRTVGXCI6XCJyXCIsXCJcXHUwMjREXCI6XCJyXCIsXCJcXHUwMjdEXCI6XCJyXCIsXCJcXHVBNzVCXCI6XCJyXCIsXCJcXHVBN0E3XCI6XCJyXCIsXCJcXHVBNzgzXCI6XCJyXCIsXCJcXHUyNEUyXCI6XCJzXCIsXCJcXHVGRjUzXCI6XCJzXCIsXCJcXHUwMERGXCI6XCJzXCIsXCJcXHUwMTVCXCI6XCJzXCIsXCJcXHUxRTY1XCI6XCJzXCIsXCJcXHUwMTVEXCI6XCJzXCIsXCJcXHUxRTYxXCI6XCJzXCIsXCJcXHUwMTYxXCI6XCJzXCIsXCJcXHUxRTY3XCI6XCJzXCIsXCJcXHUxRTYzXCI6XCJzXCIsXCJcXHUxRTY5XCI6XCJzXCIsXCJcXHUwMjE5XCI6XCJzXCIsXCJcXHUwMTVGXCI6XCJzXCIsXCJcXHUwMjNGXCI6XCJzXCIsXCJcXHVBN0E5XCI6XCJzXCIsXCJcXHVBNzg1XCI6XCJzXCIsXCJcXHUxRTlCXCI6XCJzXCIsXCJcXHUyNEUzXCI6XCJ0XCIsXCJcXHVGRjU0XCI6XCJ0XCIsXCJcXHUxRTZCXCI6XCJ0XCIsXCJcXHUxRTk3XCI6XCJ0XCIsXCJcXHUwMTY1XCI6XCJ0XCIsXCJcXHUxRTZEXCI6XCJ0XCIsXCJcXHUwMjFCXCI6XCJ0XCIsXCJcXHUwMTYzXCI6XCJ0XCIsXCJcXHUxRTcxXCI6XCJ0XCIsXCJcXHUxRTZGXCI6XCJ0XCIsXCJcXHUwMTY3XCI6XCJ0XCIsXCJcXHUwMUFEXCI6XCJ0XCIsXCJcXHUwMjg4XCI6XCJ0XCIsXCJcXHUyQzY2XCI6XCJ0XCIsXCJcXHVBNzg3XCI6XCJ0XCIsXCJcXHVBNzI5XCI6XCJ0elwiLFwiXFx1MjRFNFwiOlwidVwiLFwiXFx1RkY1NVwiOlwidVwiLFwiXFx1MDBGOVwiOlwidVwiLFwiXFx1MDBGQVwiOlwidVwiLFwiXFx1MDBGQlwiOlwidVwiLFwiXFx1MDE2OVwiOlwidVwiLFwiXFx1MUU3OVwiOlwidVwiLFwiXFx1MDE2QlwiOlwidVwiLFwiXFx1MUU3QlwiOlwidVwiLFwiXFx1MDE2RFwiOlwidVwiLFwiXFx1MDBGQ1wiOlwidVwiLFwiXFx1MDFEQ1wiOlwidVwiLFwiXFx1MDFEOFwiOlwidVwiLFwiXFx1MDFENlwiOlwidVwiLFwiXFx1MDFEQVwiOlwidVwiLFwiXFx1MUVFN1wiOlwidVwiLFwiXFx1MDE2RlwiOlwidVwiLFwiXFx1MDE3MVwiOlwidVwiLFwiXFx1MDFENFwiOlwidVwiLFwiXFx1MDIxNVwiOlwidVwiLFwiXFx1MDIxN1wiOlwidVwiLFwiXFx1MDFCMFwiOlwidVwiLFwiXFx1MUVFQlwiOlwidVwiLFwiXFx1MUVFOVwiOlwidVwiLFwiXFx1MUVFRlwiOlwidVwiLFwiXFx1MUVFRFwiOlwidVwiLFwiXFx1MUVGMVwiOlwidVwiLFwiXFx1MUVFNVwiOlwidVwiLFwiXFx1MUU3M1wiOlwidVwiLFwiXFx1MDE3M1wiOlwidVwiLFwiXFx1MUU3N1wiOlwidVwiLFwiXFx1MUU3NVwiOlwidVwiLFwiXFx1MDI4OVwiOlwidVwiLFwiXFx1MjRFNVwiOlwidlwiLFwiXFx1RkY1NlwiOlwidlwiLFwiXFx1MUU3RFwiOlwidlwiLFwiXFx1MUU3RlwiOlwidlwiLFwiXFx1MDI4QlwiOlwidlwiLFwiXFx1QTc1RlwiOlwidlwiLFwiXFx1MDI4Q1wiOlwidlwiLFwiXFx1QTc2MVwiOlwidnlcIixcIlxcdTI0RTZcIjpcIndcIixcIlxcdUZGNTdcIjpcIndcIixcIlxcdTFFODFcIjpcIndcIixcIlxcdTFFODNcIjpcIndcIixcIlxcdTAxNzVcIjpcIndcIixcIlxcdTFFODdcIjpcIndcIixcIlxcdTFFODVcIjpcIndcIixcIlxcdTFFOThcIjpcIndcIixcIlxcdTFFODlcIjpcIndcIixcIlxcdTJDNzNcIjpcIndcIixcIlxcdTI0RTdcIjpcInhcIixcIlxcdUZGNThcIjpcInhcIixcIlxcdTFFOEJcIjpcInhcIixcIlxcdTFFOERcIjpcInhcIixcIlxcdTI0RThcIjpcInlcIixcIlxcdUZGNTlcIjpcInlcIixcIlxcdTFFRjNcIjpcInlcIixcIlxcdTAwRkRcIjpcInlcIixcIlxcdTAxNzdcIjpcInlcIixcIlxcdTFFRjlcIjpcInlcIixcIlxcdTAyMzNcIjpcInlcIixcIlxcdTFFOEZcIjpcInlcIixcIlxcdTAwRkZcIjpcInlcIixcIlxcdTFFRjdcIjpcInlcIixcIlxcdTFFOTlcIjpcInlcIixcIlxcdTFFRjVcIjpcInlcIixcIlxcdTAxQjRcIjpcInlcIixcIlxcdTAyNEZcIjpcInlcIixcIlxcdTFFRkZcIjpcInlcIixcIlxcdTI0RTlcIjpcInpcIixcIlxcdUZGNUFcIjpcInpcIixcIlxcdTAxN0FcIjpcInpcIixcIlxcdTFFOTFcIjpcInpcIixcIlxcdTAxN0NcIjpcInpcIixcIlxcdTAxN0VcIjpcInpcIixcIlxcdTFFOTNcIjpcInpcIixcIlxcdTFFOTVcIjpcInpcIixcIlxcdTAxQjZcIjpcInpcIixcIlxcdTAyMjVcIjpcInpcIixcIlxcdTAyNDBcIjpcInpcIixcIlxcdTJDNkNcIjpcInpcIixcIlxcdUE3NjNcIjpcInpcIn07XHJcblxyXG4gICAgJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XHJcblxyXG4gICAgbmV4dFVpZD0oZnVuY3Rpb24oKSB7IHZhciBjb3VudGVyPTE7IHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGNvdW50ZXIrKzsgfTsgfSgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gc3RyaXBEaWFjcml0aWNzKHN0cikge1xyXG4gICAgICAgIHZhciByZXQsIGksIGwsIGM7XHJcblxyXG4gICAgICAgIGlmICghc3RyIHx8IHN0ci5sZW5ndGggPCAxKSByZXR1cm4gc3RyO1xyXG5cclxuICAgICAgICByZXQgPSBcIlwiO1xyXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBzdHIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGMgPSBzdHIuY2hhckF0KGkpO1xyXG4gICAgICAgICAgICByZXQgKz0gRElBQ1JJVElDU1tjXSB8fCBjO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluZGV4T2YodmFsdWUsIGFycmF5KSB7XHJcbiAgICAgICAgdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICAgIGlmIChlcXVhbCh2YWx1ZSwgYXJyYXlbaV0pKSByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1lYXN1cmVTY3JvbGxiYXIgKCkge1xyXG4gICAgICAgIHZhciAkdGVtcGxhdGUgPSAkKCBNRUFTVVJFX1NDUk9MTEJBUl9URU1QTEFURSApO1xyXG4gICAgICAgICR0ZW1wbGF0ZS5hcHBlbmRUbygnYm9keScpO1xyXG5cclxuICAgICAgICB2YXIgZGltID0ge1xyXG4gICAgICAgICAgICB3aWR0aDogJHRlbXBsYXRlLndpZHRoKCkgLSAkdGVtcGxhdGVbMF0uY2xpZW50V2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogJHRlbXBsYXRlLmhlaWdodCgpIC0gJHRlbXBsYXRlWzBdLmNsaWVudEhlaWdodFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgJHRlbXBsYXRlLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGltO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGFyZXMgZXF1YWxpdHkgb2YgYSBhbmQgYlxyXG4gICAgICogQHBhcmFtIGFcclxuICAgICAqIEBwYXJhbSBiXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcclxuICAgICAgICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciAnYScgb3IgJ2InIGlzIGEgc3RyaW5nIChwcmltaXRpdmUgb3Igb2JqZWN0KS5cclxuICAgICAgICAvLyBUaGUgY29uY2F0ZW5hdGlvbiBvZiBhbiBlbXB0eSBzdHJpbmcgKCsnJykgY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgc3RyaW5nJ3MgcHJpbWl0aXZlLlxyXG4gICAgICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHJldHVybiBhKycnID09PSBiKycnOyAvLyBhKycnIC0gaW4gY2FzZSAnYScgaXMgYSBTdHJpbmcgb2JqZWN0XHJcbiAgICAgICAgaWYgKGIuY29uc3RydWN0b3IgPT09IFN0cmluZykgcmV0dXJuIGIrJycgPT09IGErJyc7IC8vIGIrJycgLSBpbiBjYXNlICdiJyBpcyBhIFN0cmluZyBvYmplY3RcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGxpdHMgdGhlIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHZhbHVlcywgdHJpbW1pbmcgZWFjaCB2YWx1ZS4gQW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQgZm9yIG51bGxzIG9yIGVtcHR5XHJcbiAgICAgKiBzdHJpbmdzXHJcbiAgICAgKiBAcGFyYW0gc3RyaW5nXHJcbiAgICAgKiBAcGFyYW0gc2VwYXJhdG9yXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIHNwbGl0VmFsKHN0cmluZywgc2VwYXJhdG9yKSB7XHJcbiAgICAgICAgdmFyIHZhbCwgaSwgbDtcclxuICAgICAgICBpZiAoc3RyaW5nID09PSBudWxsIHx8IHN0cmluZy5sZW5ndGggPCAxKSByZXR1cm4gW107XHJcbiAgICAgICAgdmFsID0gc3RyaW5nLnNwbGl0KHNlcGFyYXRvcik7XHJcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpID0gaSArIDEpIHZhbFtpXSA9ICQudHJpbSh2YWxbaV0pO1xyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0U2lkZUJvcmRlclBhZGRpbmcoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50Lm91dGVyV2lkdGgoZmFsc2UpIC0gZWxlbWVudC53aWR0aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluc3RhbGxLZXlVcENoYW5nZUV2ZW50KGVsZW1lbnQpIHtcclxuICAgICAgICB2YXIga2V5PVwia2V5dXAtY2hhbmdlLXZhbHVlXCI7XHJcbiAgICAgICAgZWxlbWVudC5vbihcImtleWRvd25cIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoJC5kYXRhKGVsZW1lbnQsIGtleSkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgJC5kYXRhKGVsZW1lbnQsIGtleSwgZWxlbWVudC52YWwoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBlbGVtZW50Lm9uKFwia2V5dXBcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsPSAkLmRhdGEoZWxlbWVudCwga2V5KTtcclxuICAgICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQudmFsKCkgIT09IHZhbCkge1xyXG4gICAgICAgICAgICAgICAgJC5yZW1vdmVEYXRhKGVsZW1lbnQsIGtleSk7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXIoXCJrZXl1cC1jaGFuZ2VcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAkZG9jdW1lbnQub24oXCJtb3VzZW1vdmVcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBsYXN0TW91c2VQb3NpdGlvbi54ID0gZS5wYWdlWDtcclxuICAgICAgICBsYXN0TW91c2VQb3NpdGlvbi55ID0gZS5wYWdlWTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogZmlsdGVycyBtb3VzZSBldmVudHMgc28gYW4gZXZlbnQgaXMgZmlyZWQgb25seSBpZiB0aGUgbW91c2UgbW92ZWQuXHJcbiAgICAgKlxyXG4gICAgICogZmlsdGVycyBvdXQgbW91c2UgZXZlbnRzIHRoYXQgb2NjdXIgd2hlbiBtb3VzZSBpcyBzdGF0aW9uYXJ5IGJ1dFxyXG4gICAgICogdGhlIGVsZW1lbnRzIHVuZGVyIHRoZSBwb2ludGVyIGFyZSBzY3JvbGxlZC5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gaW5zdGFsbEZpbHRlcmVkTW91c2VNb3ZlKGVsZW1lbnQpIHtcclxuICAgICAgICBlbGVtZW50Lm9uKFwibW91c2Vtb3ZlXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXN0cG9zID0gbGFzdE1vdXNlUG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmIChsYXN0cG9zID09PSB1bmRlZmluZWQgfHwgbGFzdHBvcy54ICE9PSBlLnBhZ2VYIHx8IGxhc3Rwb3MueSAhPT0gZS5wYWdlWSkge1xyXG4gICAgICAgICAgICAgICAgJChlLnRhcmdldCkudHJpZ2dlcihcIm1vdXNlbW92ZS1maWx0ZXJlZFwiLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVib3VuY2VzIGEgZnVuY3Rpb24uIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBvcmlnaW5hbCBmbiBmdW5jdGlvbiBvbmx5IGlmIG5vIGludm9jYXRpb25zIGhhdmUgYmVlbiBtYWRlXHJcbiAgICAgKiB3aXRoaW4gdGhlIGxhc3QgcXVpZXRNaWxsaXMgbWlsbGlzZWNvbmRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBxdWlldE1pbGxpcyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGludm9raW5nIGZuXHJcbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gYmUgZGVib3VuY2VkXHJcbiAgICAgKiBAcGFyYW0gY3R4IG9iamVjdCB0byBiZSB1c2VkIGFzIHRoaXMgcmVmZXJlbmNlIHdpdGhpbiBmblxyXG4gICAgICogQHJldHVybiBkZWJvdW5jZWQgdmVyc2lvbiBvZiBmblxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBkZWJvdW5jZShxdWlldE1pbGxpcywgZm4sIGN0eCkge1xyXG4gICAgICAgIGN0eCA9IGN0eCB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmFyIHRpbWVvdXQ7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGZuLmFwcGx5KGN0eCwgYXJncyk7XHJcbiAgICAgICAgICAgIH0sIHF1aWV0TWlsbGlzKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgYSB0aHVua1xyXG4gICAgICogQHBhcmFtIGZvcm11bGEgZnVuY3Rpb24gdXNlZCB0byBsYXppbHkgaW5pdGlhbGl6ZSB0aGUgdGh1bmtcclxuICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiB0aHVuayhmb3JtdWxhKSB7XHJcbiAgICAgICAgdmFyIGV2YWx1YXRlZCA9IGZhbHNlLFxyXG4gICAgICAgICAgICB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGlmIChldmFsdWF0ZWQgPT09IGZhbHNlKSB7IHZhbHVlID0gZm9ybXVsYSgpOyBldmFsdWF0ZWQgPSB0cnVlOyB9XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBpbnN0YWxsRGVib3VuY2VkU2Nyb2xsKHRocmVzaG9sZCwgZWxlbWVudCkge1xyXG4gICAgICAgIHZhciBub3RpZnkgPSBkZWJvdW5jZSh0aHJlc2hvbGQsIGZ1bmN0aW9uIChlKSB7IGVsZW1lbnQudHJpZ2dlcihcInNjcm9sbC1kZWJvdW5jZWRcIiwgZSk7fSk7XHJcbiAgICAgICAgZWxlbWVudC5vbihcInNjcm9sbFwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXhPZihlLnRhcmdldCwgZWxlbWVudC5nZXQoKSkgPj0gMCkgbm90aWZ5KGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZvY3VzKCRlbCkge1xyXG4gICAgICAgIGlmICgkZWxbMF0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHJldHVybjtcclxuXHJcbiAgICAgICAgLyogc2V0IHRoZSBmb2N1cyBpbiBhIDAgdGltZW91dCAtIHRoYXQgd2F5IHRoZSBmb2N1cyBpcyBzZXQgYWZ0ZXIgdGhlIHByb2Nlc3NpbmdcclxuICAgICAgICAgICAgb2YgdGhlIGN1cnJlbnQgZXZlbnQgaGFzIGZpbmlzaGVkIC0gd2hpY2ggc2VlbXMgbGlrZSB0aGUgb25seSByZWxpYWJsZSB3YXlcclxuICAgICAgICAgICAgdG8gc2V0IGZvY3VzICovXHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBlbD0kZWxbMF0sIHBvcz0kZWwudmFsKCkubGVuZ3RoLCByYW5nZTtcclxuXHJcbiAgICAgICAgICAgICRlbC5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgLyogbWFrZSBzdXJlIGVsIHJlY2VpdmVkIGZvY3VzIHNvIHdlIGRvIG5vdCBlcnJvciBvdXQgd2hlbiB0cnlpbmcgdG8gbWFuaXB1bGF0ZSB0aGUgY2FyZXQuXHJcbiAgICAgICAgICAgICAgICBzb21ldGltZXMgbW9kYWxzIG9yIG90aGVycyBsaXN0ZW5lcnMgbWF5IHN0ZWFsIGl0IGFmdGVyIGl0cyBzZXQgKi9cclxuICAgICAgICAgICAgaWYgKCRlbC5pcyhcIjp2aXNpYmxlXCIpICYmIGVsID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLyogYWZ0ZXIgdGhlIGZvY3VzIGlzIHNldCBtb3ZlIHRoZSBjYXJldCB0byB0aGUgZW5kLCBuZWNlc3Nhcnkgd2hlbiB3ZSB2YWwoKVxyXG4gICAgICAgICAgICAgICAgICAgIGp1c3QgYmVmb3JlIHNldHRpbmcgZm9jdXMgKi9cclxuICAgICAgICAgICAgICAgIGlmKGVsLnNldFNlbGVjdGlvblJhbmdlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKHBvcywgcG9zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVsLmNyZWF0ZVRleHRSYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gZWwuY3JlYXRlVGV4dFJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q3Vyc29ySW5mbyhlbCkge1xyXG4gICAgICAgIGVsID0gJChlbClbMF07XHJcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XHJcbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XHJcbiAgICAgICAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gZWwpIHtcclxuICAgICAgICAgICAgb2Zmc2V0ID0gZWwuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IGVsLnNlbGVjdGlvbkVuZCAtIG9mZnNldDtcclxuICAgICAgICB9IGVsc2UgaWYgKCdzZWxlY3Rpb24nIGluIGRvY3VtZW50KSB7XHJcbiAgICAgICAgICAgIGVsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHZhciBzZWwgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgbGVuZ3RoID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgIHNlbC5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIC1lbC52YWx1ZS5sZW5ndGgpO1xyXG4gICAgICAgICAgICBvZmZzZXQgPSBzZWwudGV4dC5sZW5ndGggLSBsZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IG9mZnNldDogb2Zmc2V0LCBsZW5ndGg6IGxlbmd0aCB9O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGtpbGxFdmVudChldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBraWxsRXZlbnRJbW1lZGlhdGVseShldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWVhc3VyZVRleHRXaWR0aChlKSB7XHJcbiAgICAgICAgaWYgKCFzaXplcil7XHJcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IGVbMF0uY3VycmVudFN0eWxlIHx8IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVbMF0sIG51bGwpO1xyXG4gICAgICAgICAgICBzaXplciA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuY3NzKHtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBcIi0xMDAwMHB4XCIsXHJcbiAgICAgICAgICAgICAgICB0b3A6IFwiLTEwMDAwcHhcIixcclxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwibm9uZVwiLFxyXG4gICAgICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlLmZvbnRTaXplLFxyXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogc3R5bGUuZm9udEZhbWlseSxcclxuICAgICAgICAgICAgICAgIGZvbnRTdHlsZTogc3R5bGUuZm9udFN0eWxlLFxyXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogc3R5bGUuZm9udFdlaWdodCxcclxuICAgICAgICAgICAgICAgIGxldHRlclNwYWNpbmc6IHN0eWxlLmxldHRlclNwYWNpbmcsXHJcbiAgICAgICAgICAgICAgICB0ZXh0VHJhbnNmb3JtOiBzdHlsZS50ZXh0VHJhbnNmb3JtLFxyXG4gICAgICAgICAgICAgICAgd2hpdGVTcGFjZTogXCJub3dyYXBcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2l6ZXIuYXR0cihcImNsYXNzXCIsXCJzZWxlY3QyLXNpemVyXCIpO1xyXG4gICAgICAgICAgICAkKFwiYm9keVwiKS5hcHBlbmQoc2l6ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzaXplci50ZXh0KGUudmFsKCkpO1xyXG4gICAgICAgIHJldHVybiBzaXplci53aWR0aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHN5bmNDc3NDbGFzc2VzKGRlc3QsIHNyYywgYWRhcHRlcikge1xyXG4gICAgICAgIHZhciBjbGFzc2VzLCByZXBsYWNlbWVudHMgPSBbXSwgYWRhcHRlZDtcclxuXHJcbiAgICAgICAgY2xhc3NlcyA9IGRlc3QuYXR0cihcImNsYXNzXCIpO1xyXG4gICAgICAgIGlmIChjbGFzc2VzKSB7XHJcbiAgICAgICAgICAgIGNsYXNzZXMgPSAnJyArIGNsYXNzZXM7IC8vIGZvciBJRSB3aGljaCByZXR1cm5zIG9iamVjdFxyXG4gICAgICAgICAgICAkKGNsYXNzZXMuc3BsaXQoXCIgXCIpKS5lYWNoMihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZGV4T2YoXCJzZWxlY3QyLVwiKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2xhc3NlcyA9IHNyYy5hdHRyKFwiY2xhc3NcIik7XHJcbiAgICAgICAgaWYgKGNsYXNzZXMpIHtcclxuICAgICAgICAgICAgY2xhc3NlcyA9ICcnICsgY2xhc3NlczsgLy8gZm9yIElFIHdoaWNoIHJldHVybnMgb2JqZWN0XHJcbiAgICAgICAgICAgICQoY2xhc3Nlcy5zcGxpdChcIiBcIikpLmVhY2gyKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXhPZihcInNlbGVjdDItXCIpICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWRhcHRlZCA9IGFkYXB0ZXIodGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzLnB1c2godGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVzdC5hdHRyKFwiY2xhc3NcIiwgcmVwbGFjZW1lbnRzLmpvaW4oXCIgXCIpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gbWFya01hdGNoKHRleHQsIHRlcm0sIG1hcmt1cCwgZXNjYXBlTWFya3VwKSB7XHJcbiAgICAgICAgdmFyIG1hdGNoPXN0cmlwRGlhY3JpdGljcyh0ZXh0LnRvVXBwZXJDYXNlKCkpLmluZGV4T2Yoc3RyaXBEaWFjcml0aWNzKHRlcm0udG9VcHBlckNhc2UoKSkpLFxyXG4gICAgICAgICAgICB0bD10ZXJtLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKG1hdGNoPDApIHtcclxuICAgICAgICAgICAgbWFya3VwLnB1c2goZXNjYXBlTWFya3VwKHRleHQpKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWFya3VwLnB1c2goZXNjYXBlTWFya3VwKHRleHQuc3Vic3RyaW5nKDAsIG1hdGNoKSkpO1xyXG4gICAgICAgIG1hcmt1cC5wdXNoKFwiPHNwYW4gY2xhc3M9J3NlbGVjdDItbWF0Y2gnPlwiKTtcclxuICAgICAgICBtYXJrdXAucHVzaChlc2NhcGVNYXJrdXAodGV4dC5zdWJzdHJpbmcobWF0Y2gsIG1hdGNoICsgdGwpKSk7XHJcbiAgICAgICAgbWFya3VwLnB1c2goXCI8L3NwYW4+XCIpO1xyXG4gICAgICAgIG1hcmt1cC5wdXNoKGVzY2FwZU1hcmt1cCh0ZXh0LnN1YnN0cmluZyhtYXRjaCArIHRsLCB0ZXh0Lmxlbmd0aCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkZWZhdWx0RXNjYXBlTWFya3VwKG1hcmt1cCkge1xyXG4gICAgICAgIHZhciByZXBsYWNlX21hcCA9IHtcclxuICAgICAgICAgICAgJ1xcXFwnOiAnJiM5MjsnLFxyXG4gICAgICAgICAgICAnJic6ICcmYW1wOycsXHJcbiAgICAgICAgICAgICc8JzogJyZsdDsnLFxyXG4gICAgICAgICAgICAnPic6ICcmZ3Q7JyxcclxuICAgICAgICAgICAgJ1wiJzogJyZxdW90OycsXHJcbiAgICAgICAgICAgIFwiJ1wiOiAnJiMzOTsnLFxyXG4gICAgICAgICAgICBcIi9cIjogJyYjNDc7J1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBTdHJpbmcobWFya3VwKS5yZXBsYWNlKC9bJjw+XCInXFwvXFxcXF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXBsYWNlX21hcFttYXRjaF07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9kdWNlcyBhbiBhamF4LWJhc2VkIHF1ZXJ5IGZ1bmN0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBwYXJhbXRlcnNcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLnBhcmFtcyBwYXJhbWV0ZXIgbWFwIGZvciB0aGUgdHJhbnNwb3J0IGFqYXggY2FsbCwgY2FuIGNvbnRhaW4gc3VjaCBvcHRpb25zIGFzIGNhY2hlLCBqc29ucENhbGxiYWNrLCBldGMuIHNlZSAkLmFqYXhcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLnRyYW5zcG9ydCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBleGVjdXRlIHRoZSBhamF4IHJlcXVlc3QuIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHBhcmFtZXRlcnMgc3VwcG9ydGVkIGJ5ICQuYWpheFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMudXJsIHVybCBmb3IgdGhlIGRhdGFcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLmRhdGEgYSBmdW5jdGlvbihzZWFyY2hUZXJtLCBwYWdlTnVtYmVyLCBjb250ZXh0KSB0aGF0IHNob3VsZCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgZm9yIHRoZSBhYm92ZSB1cmwuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5kYXRhVHlwZSByZXF1ZXN0IGRhdGEgdHlwZTogYWpheCwganNvbnAsIG90aGVyIGRhdGF0YXR5cGVzIHN1cHBvcnRlZCBieSBqUXVlcnkncyAkLmFqYXggZnVuY3Rpb24gb3IgdGhlIHRyYW5zcG9ydCBmdW5jdGlvbiBpZiBzcGVjaWZpZWRcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLnF1aWV0TWlsbGlzIChvcHRpb25hbCkgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIG1ha2luZyB0aGUgYWpheFJlcXVlc3QsIGhlbHBzIGRlYm91bmNlIHRoZSBhamF4IGZ1bmN0aW9uIGlmIGludm9rZWQgdG9vIG9mdGVuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yZXN1bHRzIGEgZnVuY3Rpb24ocmVtb3RlRGF0YSwgcGFnZU51bWJlcikgdGhhdCBjb252ZXJ0cyBkYXRhIHJldHVybmVkIGZvcm0gdGhlIHJlbW90ZSByZXF1ZXN0IHRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgU2VsZWN0Mi5cclxuICAgICAqICAgICAgVGhlIGV4cGVjdGVkIGZvcm1hdCBpcyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGtleXM6XHJcbiAgICAgKiAgICAgIHJlc3VsdHMgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBjaG9pY2VzXHJcbiAgICAgKiAgICAgIG1vcmUgKG9wdGlvbmFsKSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGVyZSBhcmUgbW9yZSByZXN1bHRzIGF2YWlsYWJsZVxyXG4gICAgICogICAgICBFeGFtcGxlOiB7cmVzdWx0czpbe2lkOjEsIHRleHQ6J1JlZCd9LHtpZDoyLCB0ZXh0OidCbHVlJ31dLCBtb3JlOnRydWV9XHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGFqYXgob3B0aW9ucykge1xyXG4gICAgICAgIHZhciB0aW1lb3V0LCAvLyBjdXJyZW50IHNjaGVkdWxlZCBidXQgbm90IHlldCBleGVjdXRlZCByZXF1ZXN0XHJcbiAgICAgICAgICAgIGhhbmRsZXIgPSBudWxsLFxyXG4gICAgICAgICAgICBxdWlldE1pbGxpcyA9IG9wdGlvbnMucXVpZXRNaWxsaXMgfHwgMTAwLFxyXG4gICAgICAgICAgICBhamF4VXJsID0gb3B0aW9ucy51cmwsXHJcbiAgICAgICAgICAgIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSwgLy8gYWpheCBkYXRhIGZ1bmN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gYWpheFVybCwgLy8gYWpheCB1cmwgc3RyaW5nIG9yIGZ1bmN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gb3B0aW9ucy50cmFuc3BvcnQgfHwgJC5mbi5zZWxlY3QyLmFqYXhEZWZhdWx0cy50cmFuc3BvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCAtIHRvIGJlIHJlbW92ZWQgaW4gNC4wICAtIHVzZSBwYXJhbXMgaW5zdGVhZFxyXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZSB8fCAnR0VUJywgLy8gc2V0IHR5cGUgb2YgcmVxdWVzdCAoR0VUIG9yIFBPU1QpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlOiBvcHRpb25zLmNhY2hlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqc29ucENhbGxiYWNrOiBvcHRpb25zLmpzb25wQ2FsbGJhY2t8fHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IG9wdGlvbnMuZGF0YVR5cGV8fFwianNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSAkLmV4dGVuZCh7fSwgJC5mbi5zZWxlY3QyLmFqYXhEZWZhdWx0cy5wYXJhbXMsIGRlcHJlY2F0ZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhID8gZGF0YS5jYWxsKHNlbGYsIHF1ZXJ5LnRlcm0sIHF1ZXJ5LnBhZ2UsIHF1ZXJ5LmNvbnRleHQpIDogbnVsbDtcclxuICAgICAgICAgICAgICAgIHVybCA9ICh0eXBlb2YgdXJsID09PSAnZnVuY3Rpb24nKSA/IHVybC5jYWxsKHNlbGYsIHF1ZXJ5LnRlcm0sIHF1ZXJ5LnBhZ2UsIHF1ZXJ5LmNvbnRleHQpIDogdXJsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7IGhhbmRsZXIuYWJvcnQoKTsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcmFtcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0aW9ucy5wYXJhbXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHBhcmFtcywgb3B0aW9ucy5wYXJhbXMuY2FsbChzZWxmKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQocGFyYW1zLCBvcHRpb25zLnBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICQuZXh0ZW5kKHBhcmFtcywge1xyXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBvcHRpb25zLmRhdGFUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHJlcGxhY2UgcXVlcnkucGFnZSB3aXRoIHF1ZXJ5IHNvIHVzZXJzIGhhdmUgYWNjZXNzIHRvIHRlcm0sIHBhZ2UsIGV0Yy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBvcHRpb25zLnJlc3VsdHMoZGF0YSwgcXVlcnkucGFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmNhbGxiYWNrKHJlc3VsdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaGFuZGxlciA9IHRyYW5zcG9ydC5jYWxsKHNlbGYsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgIH0sIHF1aWV0TWlsbGlzKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZHVjZXMgYSBxdWVyeSBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggYSBsb2NhbCBhcnJheVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gVGhlIG9wdGlvbnMgcGFyYW1ldGVyIGNhbiBlaXRoZXIgYmUgYW4gYXJyYXkgb3IgYW5cclxuICAgICAqIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgYXJyYXkgZm9ybSBpcyB1c2VkIGl0IGlzIGFzc3VtZWQgdGhhdCBpdCBjb250YWlucyBvYmplY3RzIHdpdGggJ2lkJyBhbmQgJ3RleHQnIGtleXMuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIG9iamVjdCBmb3JtIGlzIHVzZWQgdGkgaXMgYXNzdW1lZCB0aGF0IGl0IGNvbnRhaW5zICdkYXRhJyBhbmQgJ3RleHQnIGtleXMuIFRoZSAnZGF0YScga2V5IHNob3VsZCBjb250YWluXHJcbiAgICAgKiBhbiBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGNob2ljZXMuIFRoZXNlIG9iamVjdHMgbXVzdCBjb250YWluIGF0IGxlYXN0IGFuICdpZCcga2V5LiBUaGUgJ3RleHQnXHJcbiAgICAgKiBrZXkgY2FuIGVpdGhlciBiZSBhIFN0cmluZyBpbiB3aGljaCBjYXNlIGl0IGlzIGV4cGVjdGVkIHRoYXQgZWFjaCBlbGVtZW50IGluIHRoZSAnZGF0YScgYXJyYXkgaGFzIGEga2V5IHdpdGggdGhlXHJcbiAgICAgKiB2YWx1ZSBvZiAndGV4dCcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIG1hdGNoIGNob2ljZXMuIEFsdGVybmF0aXZlbHksIHRleHQgY2FuIGJlIGEgZnVuY3Rpb24oaXRlbSkgdGhhdCBjYW4gZXh0cmFjdFxyXG4gICAgICogdGhlIHRleHQuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGxvY2FsKG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IG9wdGlvbnMsIC8vIGRhdGEgZWxlbWVudHNcclxuICAgICAgICAgICAgZGF0YVRleHQsXHJcbiAgICAgICAgICAgIHRtcCxcclxuICAgICAgICAgICAgdGV4dCA9IGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBcIlwiK2l0ZW0udGV4dDsgfTsgLy8gZnVuY3Rpb24gdXNlZCB0byByZXRyaWV2ZSB0aGUgdGV4dCBwb3J0aW9uIG9mIGEgZGF0YSBpdGVtIHRoYXQgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzZWFyY2hcclxuXHJcbiAgICAgICAgIGlmICgkLmlzQXJyYXkoZGF0YSkpIHtcclxuICAgICAgICAgICAgdG1wID0gZGF0YTtcclxuICAgICAgICAgICAgZGF0YSA9IHsgcmVzdWx0czogdG1wIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihkYXRhKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdG1wID0gZGF0YTtcclxuICAgICAgICAgICAgZGF0YSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdG1wOyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRhdGFJdGVtID0gZGF0YSgpO1xyXG4gICAgICAgIGlmIChkYXRhSXRlbS50ZXh0KSB7XHJcbiAgICAgICAgICAgIHRleHQgPSBkYXRhSXRlbS50ZXh0O1xyXG4gICAgICAgICAgICAvLyBpZiB0ZXh0IGlzIG5vdCBhIGZ1bmN0aW9uIHdlIGFzc3VtZSBpdCB0byBiZSBhIGtleSBuYW1lXHJcbiAgICAgICAgICAgIGlmICghJC5pc0Z1bmN0aW9uKHRleHQpKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhVGV4dCA9IGRhdGFJdGVtLnRleHQ7IC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhpcyBpbiBhIHNlcGFyYXRlIHZhcmlhYmxlIGJlY2F1c2UgaW4gdGhlIG5leHQgc3RlcCBkYXRhIGdldHMgcmVzZXQgYW5kIGRhdGEudGV4dCBpcyBubyBsb25nZXIgYXZhaWxhYmxlXHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW1bZGF0YVRleHRdOyB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIHZhciB0ID0gcXVlcnkudGVybSwgZmlsdGVyZWQgPSB7IHJlc3VsdHM6IFtdIH0sIHByb2Nlc3M7XHJcbiAgICAgICAgICAgIGlmICh0ID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBxdWVyeS5jYWxsYmFjayhkYXRhKCkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNzID0gZnVuY3Rpb24oZGF0dW0sIGNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHZhciBncm91cCwgYXR0cjtcclxuICAgICAgICAgICAgICAgIGRhdHVtID0gZGF0dW1bMF07XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0dW0uY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBncm91cCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoYXR0ciBpbiBkYXR1bSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0dW0uaGFzT3duUHJvcGVydHkoYXR0cikpIGdyb3VwW2F0dHJdPWRhdHVtW2F0dHJdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBncm91cC5jaGlsZHJlbj1bXTtcclxuICAgICAgICAgICAgICAgICAgICAkKGRhdHVtLmNoaWxkcmVuKS5lYWNoMihmdW5jdGlvbihpLCBjaGlsZERhdHVtKSB7IHByb2Nlc3MoY2hpbGREYXR1bSwgZ3JvdXAuY2hpbGRyZW4pOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuY2hpbGRyZW4ubGVuZ3RoIHx8IHF1ZXJ5Lm1hdGNoZXIodCwgdGV4dChncm91cCksIGRhdHVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5Lm1hdGNoZXIodCwgdGV4dChkYXR1bSksIGRhdHVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goZGF0dW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICQoZGF0YSgpLnJlc3VsdHMpLmVhY2gyKGZ1bmN0aW9uKGksIGRhdHVtKSB7IHByb2Nlc3MoZGF0dW0sIGZpbHRlcmVkLnJlc3VsdHMpOyB9KTtcclxuICAgICAgICAgICAgcXVlcnkuY2FsbGJhY2soZmlsdGVyZWQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETyBqYXZhZG9jXHJcbiAgICBmdW5jdGlvbiB0YWdzKGRhdGEpIHtcclxuICAgICAgICB2YXIgaXNGdW5jID0gJC5pc0Z1bmN0aW9uKGRhdGEpO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocXVlcnkpIHtcclxuICAgICAgICAgICAgdmFyIHQgPSBxdWVyeS50ZXJtLCBmaWx0ZXJlZCA9IHtyZXN1bHRzOiBbXX07XHJcbiAgICAgICAgICAgICQoaXNGdW5jID8gZGF0YSgpIDogZGF0YSkuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXNPYmplY3QgPSB0aGlzLnRleHQgIT09IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gaXNPYmplY3QgPyB0aGlzLnRleHQgOiB0aGlzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHQgPT09IFwiXCIgfHwgcXVlcnkubWF0Y2hlcih0LCB0ZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLnJlc3VsdHMucHVzaChpc09iamVjdCA/IHRoaXMgOiB7aWQ6IHRoaXMsIHRleHQ6IHRoaXN9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHF1ZXJ5LmNhbGxiYWNrKGZpbHRlcmVkKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBmb3JtYXR0ZXIgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogVGhyb3dzIGFuIGVycm9yIGlmIGl0IGlzIG5vdCBhIGZ1bmN0aW9uLiBSZXR1cm5zIHRydWUgaWYgaXQgc2hvdWxkIGJlIHVzZWQsXHJcbiAgICAgKiBmYWxzZSBpZiBubyBmb3JtYXR0aW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGZvcm1hdHRlclxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBjaGVja0Zvcm1hdHRlcihmb3JtYXR0ZXIsIGZvcm1hdHRlck5hbWUpIHtcclxuICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKGZvcm1hdHRlcikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICghZm9ybWF0dGVyKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdHRlck5hbWUgK1wiIG11c3QgYmUgYSBmdW5jdGlvbiBvciBhIGZhbHN5IHZhbHVlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGV2YWx1YXRlKHZhbCkge1xyXG4gICAgICAgIHJldHVybiAkLmlzRnVuY3Rpb24odmFsKSA/IHZhbCgpIDogdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvdW50UmVzdWx0cyhyZXN1bHRzKSB7XHJcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcclxuICAgICAgICAkLmVhY2gocmVzdWx0cywgZnVuY3Rpb24oaSwgaXRlbSkge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRSZXN1bHRzKGl0ZW0uY2hpbGRyZW4pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmF1bHQgdG9rZW5pemVyLiBUaGlzIGZ1bmN0aW9uIHVzZXMgYnJlYWtzIHRoZSBpbnB1dCBvbiBzdWJzdHJpbmcgbWF0Y2ggb2YgYW55IHN0cmluZyBmcm9tIHRoZVxyXG4gICAgICogb3B0cy50b2tlblNlcGFyYXRvcnMgYXJyYXkgYW5kIHVzZXMgb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgdG8gY3JlYXRlIHRoZSBjaG9pY2Ugb2JqZWN0LiBCb3RoIG9mIHRob3NlXHJcbiAgICAgKiB0d28gb3B0aW9ucyBoYXZlIHRvIGJlIGRlZmluZWQgaW4gb3JkZXIgZm9yIHRoZSB0b2tlbml6ZXIgdG8gd29yay5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgdGV4dCB1c2VyIGhhcyB0eXBlZCBzbyBmYXIgb3IgcGFzdGVkIGludG8gdGhlIHNlYXJjaCBmaWVsZFxyXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbiBjdXJyZW50bHkgc2VsZWN0ZWQgY2hvaWNlc1xyXG4gICAgICogQHBhcmFtIHNlbGVjdENhbGxiYWNrIGZ1bmN0aW9uKGNob2ljZSkgY2FsbGJhY2sgdGhvIGFkZCB0aGUgY2hvaWNlIHRvIHNlbGVjdGlvblxyXG4gICAgICogQHBhcmFtIG9wdHMgc2VsZWN0MidzIG9wdHNcclxuICAgICAqIEByZXR1cm4gdW5kZWZpbmVkL251bGwgdG8gbGVhdmUgdGhlIGN1cnJlbnQgaW5wdXQgdW5jaGFuZ2VkLCBvciBhIHN0cmluZyB0byBjaGFuZ2UgdGhlIGlucHV0IHRvIHRoZSByZXR1cm5lZCB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBkZWZhdWx0VG9rZW5pemVyKGlucHV0LCBzZWxlY3Rpb24sIHNlbGVjdENhbGxiYWNrLCBvcHRzKSB7XHJcbiAgICAgICAgdmFyIG9yaWdpbmFsID0gaW5wdXQsIC8vIHN0b3JlIHRoZSBvcmlnaW5hbCBzbyB3ZSBjYW4gY29tcGFyZSBhbmQga25vdyBpZiB3ZSBuZWVkIHRvIHRlbGwgdGhlIHNlYXJjaCB0byB1cGRhdGUgaXRzIHRleHRcclxuICAgICAgICAgICAgZHVwZSA9IGZhbHNlLCAvLyBjaGVjayBmb3Igd2hldGhlciBhIHRva2VuIHdlIGV4dHJhY3RlZCByZXByZXNlbnRzIGEgZHVwbGljYXRlIHNlbGVjdGVkIGNob2ljZVxyXG4gICAgICAgICAgICB0b2tlbiwgLy8gdG9rZW5cclxuICAgICAgICAgICAgaW5kZXgsIC8vIHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBzZXBhcmF0b3Igd2FzIGZvdW5kXHJcbiAgICAgICAgICAgIGksIGwsIC8vIGxvb3BpbmcgdmFyaWFibGVzXHJcbiAgICAgICAgICAgIHNlcGFyYXRvcjsgLy8gdGhlIG1hdGNoZWQgc2VwYXJhdG9yXHJcblxyXG4gICAgICAgIGlmICghb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgfHwgIW9wdHMudG9rZW5TZXBhcmF0b3JzIHx8IG9wdHMudG9rZW5TZXBhcmF0b3JzLmxlbmd0aCA8IDEpIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gb3B0cy50b2tlblNlcGFyYXRvcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBvcHRzLnRva2VuU2VwYXJhdG9yc1tpXTtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaW5wdXQuaW5kZXhPZihzZXBhcmF0b3IpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSBicmVhazsgLy8gZGlkIG5vdCBmaW5kIGFueSB0b2tlbiBzZXBhcmF0b3IgaW4gdGhlIGlucHV0IHN0cmluZywgYmFpbFxyXG5cclxuICAgICAgICAgICAgdG9rZW4gPSBpbnB1dC5zdWJzdHJpbmcoMCwgaW5kZXgpO1xyXG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cmluZyhpbmRleCArIHNlcGFyYXRvci5sZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRva2VuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRva2VuID0gb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UuY2FsbCh0aGlzLCB0b2tlbiwgc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsICYmIG9wdHMuaWQodG9rZW4pICE9PSB1bmRlZmluZWQgJiYgb3B0cy5pZCh0b2tlbikgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBkdXBlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVxdWFsKG9wdHMuaWQodG9rZW4pLCBvcHRzLmlkKHNlbGVjdGlvbltpXSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBlID0gdHJ1ZTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZHVwZSkgc2VsZWN0Q2FsbGJhY2sodG9rZW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3JpZ2luYWwhPT1pbnB1dCkgcmV0dXJuIGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjbGFzc1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzdXBlckNsYXNzXHJcbiAgICAgKiBAcGFyYW0gbWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBjbGF6eihTdXBlckNsYXNzLCBtZXRob2RzKSB7XHJcbiAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkge307XHJcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IFN1cGVyQ2xhc3M7XHJcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XHJcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLnBhcmVudCA9IFN1cGVyQ2xhc3MucHJvdG90eXBlO1xyXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQuZXh0ZW5kKGNvbnN0cnVjdG9yLnByb3RvdHlwZSwgbWV0aG9kcyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIEFic3RyYWN0U2VsZWN0MiA9IGNsYXp6KE9iamVjdCwge1xyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGJpbmQ6IGZ1bmN0aW9uIChmdW5jKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uIChvcHRzKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRzLCBzZWFyY2gsIHJlc3VsdHNTZWxlY3RvciA9IFwiLnNlbGVjdDItcmVzdWx0c1wiLCBkaXNhYmxlZCwgcmVhZG9ubHk7XHJcblxyXG4gICAgICAgICAgICAvLyBwcmVwYXJlIG9wdGlvbnNcclxuICAgICAgICAgICAgdGhpcy5vcHRzID0gb3B0cyA9IHRoaXMucHJlcGFyZU9wdHMob3B0cyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlkPW9wdHMuaWQ7XHJcblxyXG4gICAgICAgICAgICAvLyBkZXN0cm95IGlmIGNhbGxlZCBvbiBhbiBleGlzdGluZyBjb21wb25lbnRcclxuICAgICAgICAgICAgaWYgKG9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0MlwiKSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgICAgICBvcHRzLmVsZW1lbnQuZGF0YShcInNlbGVjdDJcIikgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIG9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0MlwiKS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5jcmVhdGVDb250YWluZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVySWQ9XCJzMmlkX1wiKyhvcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpIHx8IFwiYXV0b2dlblwiK25leHRVaWQoKSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyU2VsZWN0b3I9XCIjXCIrdGhpcy5jb250YWluZXJJZC5yZXBsYWNlKC8oWzsmLFxcLlxcK1xcKlxcfic6XCJcXCFcXF4jJCVAXFxbXFxdXFwoXFwpPT5cXHxdKS9nLCAnXFxcXCQxJyk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmF0dHIoXCJpZFwiLCB0aGlzLmNvbnRhaW5lcklkKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGNhY2hlIHRoZSBib2R5IHNvIGZ1dHVyZSBsb29rdXBzIGFyZSBjaGVhcFxyXG4gICAgICAgICAgICB0aGlzLmJvZHkgPSB0aHVuayhmdW5jdGlvbigpIHsgcmV0dXJuIG9wdHMuZWxlbWVudC5jbG9zZXN0KFwiYm9keVwiKTsgfSk7XHJcblxyXG4gICAgICAgICAgICBzeW5jQ3NzQ2xhc3Nlcyh0aGlzLmNvbnRhaW5lciwgdGhpcy5vcHRzLmVsZW1lbnQsIHRoaXMub3B0cy5hZGFwdENvbnRhaW5lckNzc0NsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmF0dHIoXCJzdHlsZVwiLCBvcHRzLmVsZW1lbnQuYXR0cihcInN0eWxlXCIpKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY3NzKGV2YWx1YXRlKG9wdHMuY29udGFpbmVyQ3NzKSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKGV2YWx1YXRlKG9wdHMuY29udGFpbmVyQ3NzQ2xhc3MpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFRhYkluZGV4ID0gdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcInRhYmluZGV4XCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gc3dhcCBjb250YWluZXIgZm9yIHRoZSBlbGVtZW50XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50XHJcbiAgICAgICAgICAgICAgICAuZGF0YShcInNlbGVjdDJcIiwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5hdHRyKFwidGFiaW5kZXhcIiwgXCItMVwiKVxyXG4gICAgICAgICAgICAgICAgLmJlZm9yZSh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmRhdGEoXCJzZWxlY3QyXCIsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93biA9IHRoaXMuY29udGFpbmVyLmZpbmQoXCIuc2VsZWN0Mi1kcm9wXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmFkZENsYXNzKGV2YWx1YXRlKG9wdHMuZHJvcGRvd25Dc3NDbGFzcykpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmRhdGEoXCJzZWxlY3QyXCIsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgc3luY0Nzc0NsYXNzZXModGhpcy5kcm9wZG93biwgdGhpcy5vcHRzLmVsZW1lbnQsIHRoaXMub3B0cy5hZGFwdERyb3Bkb3duQ3NzQ2xhc3MpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0cyA9IHRoaXMuY29udGFpbmVyLmZpbmQocmVzdWx0c1NlbGVjdG9yKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2ggPSBzZWFyY2ggPSB0aGlzLmNvbnRhaW5lci5maW5kKFwiaW5wdXQuc2VsZWN0Mi1pbnB1dFwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucXVlcnlDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c1BhZ2UgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY29udGFpbmVyXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRhaW5lcigpO1xyXG5cclxuICAgICAgICAgICAgaW5zdGFsbEZpbHRlcmVkTW91c2VNb3ZlKHRoaXMucmVzdWx0cyk7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24ub24oXCJtb3VzZW1vdmUtZmlsdGVyZWQgdG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmRcIiwgcmVzdWx0c1NlbGVjdG9yLCB0aGlzLmJpbmQodGhpcy5oaWdobGlnaHRVbmRlckV2ZW50KSk7XHJcblxyXG4gICAgICAgICAgICBpbnN0YWxsRGVib3VuY2VkU2Nyb2xsKDgwLCB0aGlzLnJlc3VsdHMpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLm9uKFwic2Nyb2xsLWRlYm91bmNlZFwiLCByZXN1bHRzU2VsZWN0b3IsIHRoaXMuYmluZCh0aGlzLmxvYWRNb3JlSWZOZWVkZWQpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGRvIG5vdCBwcm9wYWdhdGUgY2hhbmdlIGV2ZW50IGZyb20gdGhlIHNlYXJjaCBmaWVsZCBvdXQgb2YgdGhlIGNvbXBvbmVudFxyXG4gICAgICAgICAgICAkKHRoaXMuY29udGFpbmVyKS5vbihcImNoYW5nZVwiLCBcIi5zZWxlY3QyLWlucHV0XCIsIGZ1bmN0aW9uKGUpIHtlLnN0b3BQcm9wYWdhdGlvbigpO30pO1xyXG4gICAgICAgICAgICAkKHRoaXMuZHJvcGRvd24pLm9uKFwiY2hhbmdlXCIsIFwiLnNlbGVjdDItaW5wdXRcIiwgZnVuY3Rpb24oZSkge2Uuc3RvcFByb3BhZ2F0aW9uKCk7fSk7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiBqcXVlcnkubW91c2V3aGVlbCBwbHVnaW4gaXMgaW5zdGFsbGVkIHdlIGNhbiBwcmV2ZW50IG91dC1vZi1ib3VuZHMgc2Nyb2xsaW5nIG9mIHJlc3VsdHMgdmlhIG1vdXNld2hlZWxcclxuICAgICAgICAgICAgaWYgKCQuZm4ubW91c2V3aGVlbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5tb3VzZXdoZWVsKGZ1bmN0aW9uIChlLCBkZWx0YSwgZGVsdGFYLCBkZWx0YVkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdG9wID0gcmVzdWx0cy5zY3JvbGxUb3AoKSwgaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgPiAwICYmIHRvcCAtIGRlbHRhWSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuc2Nyb2xsVG9wKDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWx0YVkgPCAwICYmIHJlc3VsdHMuZ2V0KDApLnNjcm9sbEhlaWdodCAtIHJlc3VsdHMuc2Nyb2xsVG9wKCkgKyBkZWx0YVkgPD0gcmVzdWx0cy5oZWlnaHQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNjcm9sbFRvcChyZXN1bHRzLmdldCgwKS5zY3JvbGxIZWlnaHQgLSByZXN1bHRzLmhlaWdodCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpbnN0YWxsS2V5VXBDaGFuZ2VFdmVudChzZWFyY2gpO1xyXG4gICAgICAgICAgICBzZWFyY2gub24oXCJrZXl1cC1jaGFuZ2UgaW5wdXQgcGFzdGVcIiwgdGhpcy5iaW5kKHRoaXMudXBkYXRlUmVzdWx0cykpO1xyXG4gICAgICAgICAgICBzZWFyY2gub24oXCJmb2N1c1wiLCBmdW5jdGlvbiAoKSB7IHNlYXJjaC5hZGRDbGFzcyhcInNlbGVjdDItZm9jdXNlZFwiKTsgfSk7XHJcbiAgICAgICAgICAgIHNlYXJjaC5vbihcImJsdXJcIiwgZnVuY3Rpb24gKCkgeyBzZWFyY2gucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWZvY3VzZWRcIik7fSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLm9uKFwibW91c2V1cFwiLCByZXN1bHRzU2VsZWN0b3IsIHRoaXMuYmluZChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoZS50YXJnZXQpLmNsb3Nlc3QoXCIuc2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZVwiKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRVbmRlckV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SGlnaGxpZ2h0ZWQoZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRyYXAgYWxsIG1vdXNlIGV2ZW50cyBmcm9tIGxlYXZpbmcgdGhlIGRyb3Bkb3duLiBzb21ldGltZXMgdGhlcmUgbWF5IGJlIGEgbW9kYWwgdGhhdCBpcyBsaXN0ZW5pbmdcclxuICAgICAgICAgICAgLy8gZm9yIG1vdXNlIGV2ZW50cyBvdXRzaWRlIG9mIGl0c2VsZiBzbyBpdCBjYW4gY2xvc2UgaXRzZWxmLiBzaW5jZSB0aGUgZHJvcGRvd24gaXMgbm93IG91dHNpZGUgdGhlIHNlbGVjdDInc1xyXG4gICAgICAgICAgICAvLyBkb20gaXQgd2lsbCB0cmlnZ2VyIHRoZSBwb3B1cCBjbG9zZSwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLm9uKFwiY2xpY2sgbW91c2V1cCBtb3VzZWRvd25cIiwgZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKHRoaXMub3B0cy5pbml0U2VsZWN0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNvdXJjZSBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBoYXMgcHJvdmlkZWQgYSBmdW5jdGlvbiB0aGF0IGNhbiBzZXQgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgc291cmNlIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgIC8vIHdlIG1vbml0b3IgdGhlIGNoYW5nZSBldmVudCBvbiB0aGUgZWxlbWVudCBhbmQgdHJpZ2dlciBpdCwgYWxsb3dpbmcgZm9yIHR3byB3YXkgc3luY2hyb25pemF0aW9uXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vbml0b3JTb3VyY2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdHMubWF4aW11bUlucHV0TGVuZ3RoICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5hdHRyKFwibWF4bGVuZ3RoXCIsIG9wdHMubWF4aW11bUlucHV0TGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGRpc2FibGVkID0gb3B0cy5lbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGRpc2FibGVkID09PSB1bmRlZmluZWQpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlKCFkaXNhYmxlZCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVhZG9ubHkgPSBvcHRzLmVsZW1lbnQucHJvcChcInJlYWRvbmx5XCIpO1xyXG4gICAgICAgICAgICBpZiAocmVhZG9ubHkgPT09IHVuZGVmaW5lZCkgcmVhZG9ubHkgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yZWFkb25seShyZWFkb25seSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgc2l6ZSBvZiBzY3JvbGxiYXJcclxuICAgICAgICAgICAgc2Nyb2xsQmFyRGltZW5zaW9ucyA9IHNjcm9sbEJhckRpbWVuc2lvbnMgfHwgbWVhc3VyZVNjcm9sbGJhcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hdXRvZm9jdXMgPSBvcHRzLmVsZW1lbnQucHJvcChcImF1dG9mb2N1c1wiKTtcclxuICAgICAgICAgICAgb3B0cy5lbGVtZW50LnByb3AoXCJhdXRvZm9jdXNcIiwgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvZm9jdXMpIHRoaXMuZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubmV4dFNlYXJjaFRlcm0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50PXRoaXMub3B0cy5lbGVtZW50LCBzZWxlY3QyID0gZWxlbWVudC5kYXRhKFwic2VsZWN0MlwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BlcnR5T2JzZXJ2ZXIpIHsgZGVsZXRlIHRoaXMucHJvcGVydHlPYnNlcnZlcjsgdGhpcy5wcm9wZXJ0eU9ic2VydmVyID0gbnVsbDsgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdDIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0Mi5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3QyLmRyb3Bkb3duLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhcInNlbGVjdDItb2Zmc2NyZWVuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZURhdGEoXCJzZWxlY3QyXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZihcIi5zZWxlY3QyXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnByb3AoXCJhdXRvZm9jdXNcIiwgdGhpcy5hdXRvZm9jdXMgfHwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudFRhYkluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hdHRyKHt0YWJpbmRleDogdGhpcy5lbGVtZW50VGFiSW5kZXh9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyKFwidGFiaW5kZXhcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgb3B0aW9uVG9EYXRhOiBmdW5jdGlvbihlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmlzKFwib3B0aW9uXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkOmVsZW1lbnQucHJvcChcInZhbHVlXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ZWxlbWVudC50ZXh0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudC5nZXQoKSxcclxuICAgICAgICAgICAgICAgICAgICBjc3M6IGVsZW1lbnQuYXR0cihcImNsYXNzXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiKSxcclxuICAgICAgICAgICAgICAgICAgICBsb2NrZWQ6IGVxdWFsKGVsZW1lbnQuYXR0cihcImxvY2tlZFwiKSwgXCJsb2NrZWRcIikgfHwgZXF1YWwoZWxlbWVudC5kYXRhKFwibG9ja2VkXCIpLCB0cnVlKVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmlzKFwib3B0Z3JvdXBcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDplbGVtZW50LmF0dHIoXCJsYWJlbFwiKSxcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjpbXSxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LmdldCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNzczogZWxlbWVudC5hdHRyKFwiY2xhc3NcIilcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHByZXBhcmVPcHRzOiBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudCwgc2VsZWN0LCBpZEtleSwgYWpheFVybCwgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50ID0gb3B0cy5lbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0KDApLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzZWxlY3RcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QgPSBzZWxlY3QgPSBvcHRzLmVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoZXNlIG9wdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHdoZW4gYXR0YWNoZWQgdG8gYSBzZWxlY3QgYmVjYXVzZSB0aGV5IGFyZSBwaWNrZWQgdXAgb2ZmIHRoZSBlbGVtZW50IGl0c2VsZlxyXG4gICAgICAgICAgICAgICAgJC5lYWNoKFtcImlkXCIsIFwibXVsdGlwbGVcIiwgXCJhamF4XCIsIFwicXVlcnlcIiwgXCJjcmVhdGVTZWFyY2hDaG9pY2VcIiwgXCJpbml0U2VsZWN0aW9uXCIsIFwiZGF0YVwiLCBcInRhZ3NcIl0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9wdGlvbiAnXCIgKyB0aGlzICsgXCInIGlzIG5vdCBhbGxvd2VkIGZvciBTZWxlY3QyIHdoZW4gYXR0YWNoZWQgdG8gYSA8c2VsZWN0PiBlbGVtZW50LlwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb3B0cyA9ICQuZXh0ZW5kKHt9LCB7XHJcbiAgICAgICAgICAgICAgICBwb3B1bGF0ZVJlc3VsdHM6IGZ1bmN0aW9uKGNvbnRhaW5lciwgcmVzdWx0cywgcXVlcnkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9wdWxhdGUsICBkYXRhLCByZXN1bHQsIGNoaWxkcmVuLCBpZD10aGlzLm9wdHMuaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlPWZ1bmN0aW9uKHJlc3VsdHMsIGNvbnRhaW5lciwgZGVwdGgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBsLCByZXN1bHQsIHNlbGVjdGFibGUsIGRpc2FibGVkLCBjb21wb3VuZCwgbm9kZSwgbGFiZWwsIGlubmVyQ29udGFpbmVyLCBmb3JtYXR0ZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gb3B0cy5zb3J0UmVzdWx0cyhyZXN1bHRzLCBjb250YWluZXIsIHF1ZXJ5KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSByZXN1bHRzLmxlbmd0aDsgaSA8IGw7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1yZXN1bHRzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkID0gKHJlc3VsdC5kaXNhYmxlZCA9PT0gdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlID0gKCFkaXNhYmxlZCkgJiYgKGlkKHJlc3VsdCkgIT09IHVuZGVmaW5lZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG91bmQ9cmVzdWx0LmNoaWxkcmVuICYmIHJlc3VsdC5jaGlsZHJlbi5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU9JChcIjxsaT48L2xpPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkQ2xhc3MoXCJzZWxlY3QyLXJlc3VsdHMtZGVwdC1cIitkZXB0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFkZENsYXNzKFwic2VsZWN0Mi1yZXN1bHRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFkZENsYXNzKHNlbGVjdGFibGUgPyBcInNlbGVjdDItcmVzdWx0LXNlbGVjdGFibGVcIiA6IFwic2VsZWN0Mi1yZXN1bHQtdW5zZWxlY3RhYmxlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkKSB7IG5vZGUuYWRkQ2xhc3MoXCJzZWxlY3QyLWRpc2FibGVkXCIpOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG91bmQpIHsgbm9kZS5hZGRDbGFzcyhcInNlbGVjdDItcmVzdWx0LXdpdGgtY2hpbGRyZW5cIik7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkQ2xhc3Moc2VsZi5vcHRzLmZvcm1hdFJlc3VsdENzc0NsYXNzKHJlc3VsdCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC5hZGRDbGFzcyhcInNlbGVjdDItcmVzdWx0LWxhYmVsXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZD1vcHRzLmZvcm1hdFJlc3VsdChyZXN1bHQsIGxhYmVsLCBxdWVyeSwgc2VsZi5vcHRzLmVzY2FwZU1hcmt1cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0dGVkIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuaHRtbChmb3JtYXR0ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kKGxhYmVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG91bmQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb250YWluZXI9JChcIjx1bD48L3VsPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbnRhaW5lci5hZGRDbGFzcyhcInNlbGVjdDItcmVzdWx0LXN1YlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZShyZXN1bHQuY2hpbGRyZW4sIGlubmVyQ29udGFpbmVyLCBkZXB0aCsxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZChpbm5lckNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhKFwic2VsZWN0Mi1kYXRhXCIsIHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGUocmVzdWx0cywgY29udGFpbmVyLCAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgJC5mbi5zZWxlY3QyLmRlZmF1bHRzLCBvcHRzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0cy5pZCkgIT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgaWRLZXkgPSBvcHRzLmlkO1xyXG4gICAgICAgICAgICAgICAgb3B0cy5pZCA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlW2lkS2V5XTsgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCQuaXNBcnJheShvcHRzLmVsZW1lbnQuZGF0YShcInNlbGVjdDJUYWdzXCIpKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFwidGFnc1wiIGluIG9wdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBcInRhZ3Mgc3BlY2lmaWVkIGFzIGJvdGggYW4gYXR0cmlidXRlICdkYXRhLXNlbGVjdDItdGFncycgYW5kIGluIG9wdGlvbnMgb2YgU2VsZWN0MiBcIiArIG9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvcHRzLnRhZ3M9b3B0cy5lbGVtZW50LmRhdGEoXCJzZWxlY3QyVGFnc1wiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgb3B0cy5xdWVyeSA9IHRoaXMuYmluZChmdW5jdGlvbiAocXVlcnkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHsgcmVzdWx0czogW10sIG1vcmU6IGZhbHNlIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm0gPSBxdWVyeS50ZXJtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwgcGxhY2Vob2xkZXJPcHRpb24sIHByb2Nlc3M7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3M9ZnVuY3Rpb24oZWxlbWVudCwgY29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ3JvdXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmlzKFwib3B0aW9uXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnkubWF0Y2hlcih0ZXJtLCBlbGVtZW50LnRleHQoKSwgZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goc2VsZi5vcHRpb25Ub0RhdGEoZWxlbWVudCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXMoXCJvcHRncm91cFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA9c2VsZi5vcHRpb25Ub0RhdGEoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNoaWxkcmVuKCkuZWFjaDIoZnVuY3Rpb24oaSwgZWxtKSB7IHByb2Nlc3MoZWxtLCBncm91cC5jaGlsZHJlbik7IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLmNoaWxkcmVuLmxlbmd0aD4wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5wdXNoKGdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuPWVsZW1lbnQuY2hpbGRyZW4oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBwbGFjZWhvbGRlciBvcHRpb24gaWYgdGhlcmUgaXMgb25lXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UGxhY2Vob2xkZXIoKSAhPT0gdW5kZWZpbmVkICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJPcHRpb24gPSB0aGlzLmdldFBsYWNlaG9sZGVyT3B0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlck9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW49Y2hpbGRyZW4ubm90KHBsYWNlaG9sZGVyT3B0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uZWFjaDIoZnVuY3Rpb24oaSwgZWxtKSB7IHByb2Nlc3MoZWxtLCBkYXRhLnJlc3VsdHMpOyB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlcnkuY2FsbGJhY2soZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW5zaWRlIHZhbCgpIHdlIGNvbnN0cnVjdCBjaG9pY2VzIGZyb20gb3B0aW9ucyBhbmQgdGhlcmUgaWQgaXMgaGFyZGNvZGVkXHJcbiAgICAgICAgICAgICAgICBvcHRzLmlkPWZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUuaWQ7IH07XHJcbiAgICAgICAgICAgICAgICBvcHRzLmZvcm1hdFJlc3VsdENzc0NsYXNzID0gZnVuY3Rpb24oZGF0YSkgeyByZXR1cm4gZGF0YS5jc3M7IH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShcInF1ZXJ5XCIgaW4gb3B0cykpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwiYWpheFwiIGluIG9wdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWpheFVybCA9IG9wdHMuZWxlbWVudC5kYXRhKFwiYWpheC11cmxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhamF4VXJsICYmIGFqYXhVcmwubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5hamF4LnVybCA9IGFqYXhVcmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5xdWVyeSA9IGFqYXguY2FsbChvcHRzLmVsZW1lbnQsIG9wdHMuYWpheCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcImRhdGFcIiBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMucXVlcnkgPSBsb2NhbChvcHRzLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJ0YWdzXCIgaW4gb3B0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnF1ZXJ5ID0gdGFncyhvcHRzLnRhZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgPSBmdW5jdGlvbiAodGVybSkgeyByZXR1cm4ge2lkOiAkLnRyaW0odGVybSksIHRleHQ6ICQudHJpbSh0ZXJtKX07IH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuaW5pdFNlbGVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmluaXRTZWxlY3Rpb24gPSBmdW5jdGlvbiAoZWxlbWVudCwgY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3BsaXRWYWwoZWxlbWVudC52YWwoKSwgb3B0cy5zZXBhcmF0b3IpKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcywgdGV4dCA9IHRoaXMsIHRhZ3M9b3B0cy50YWdzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKHRhZ3MpKSB0YWdzPXRhZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0YWdzKS5lYWNoKGZ1bmN0aW9uKCkgeyBpZiAoZXF1YWwodGhpcy5pZCwgaWQpKSB7IHRleHQgPSB0aGlzLnRleHQ7IHJldHVybiBmYWxzZTsgfSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKHtpZDogaWQsIHRleHQ6IHRleHR9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0cy5xdWVyeSkgIT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJxdWVyeSBmdW5jdGlvbiBub3QgZGVmaW5lZCBmb3IgU2VsZWN0MiBcIiArIG9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvcHRzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1vbml0b3IgdGhlIG9yaWdpbmFsIGVsZW1lbnQgZm9yIGNoYW5nZXMgYW5kIHVwZGF0ZSBzZWxlY3QyIGFjY29yZGluZ2x5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBtb25pdG9yU291cmNlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMub3B0cy5lbGVtZW50LCBzeW5jO1xyXG5cclxuICAgICAgICAgICAgZWwub24oXCJjaGFuZ2Uuc2VsZWN0MlwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0Mi1jaGFuZ2UtdHJpZ2dlcmVkXCIpICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHN5bmMgPSB0aGlzLmJpbmQoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBlbmFibGVkLCByZWFkb25seSwgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gc3luYyBlbmFibGVkIHN0YXRlXHJcbiAgICAgICAgICAgICAgICB2YXIgZGlzYWJsZWQgPSBlbC5wcm9wKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWQgPT09IHVuZGVmaW5lZCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlKCFkaXNhYmxlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHJlYWRvbmx5ID0gZWwucHJvcChcInJlYWRvbmx5XCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlYWRvbmx5ID09PSB1bmRlZmluZWQpIHJlYWRvbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRvbmx5KHJlYWRvbmx5KTtcclxuXHJcbiAgICAgICAgICAgICAgICBzeW5jQ3NzQ2xhc3Nlcyh0aGlzLmNvbnRhaW5lciwgdGhpcy5vcHRzLmVsZW1lbnQsIHRoaXMub3B0cy5hZGFwdENvbnRhaW5lckNzc0NsYXNzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKGV2YWx1YXRlKHRoaXMub3B0cy5jb250YWluZXJDc3NDbGFzcykpO1xyXG5cclxuICAgICAgICAgICAgICAgIHN5bmNDc3NDbGFzc2VzKHRoaXMuZHJvcGRvd24sIHRoaXMub3B0cy5lbGVtZW50LCB0aGlzLm9wdHMuYWRhcHREcm9wZG93bkNzc0NsYXNzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYWRkQ2xhc3MoZXZhbHVhdGUodGhpcy5vcHRzLmRyb3Bkb3duQ3NzQ2xhc3MpKTtcclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gbW96aWxsYSBhbmQgSUVcclxuICAgICAgICAgICAgZWwub24oXCJwcm9wZXJ0eWNoYW5nZS5zZWxlY3QyIERPTUF0dHJNb2RpZmllZC5zZWxlY3QyXCIsIHN5bmMpO1xyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGhvbGQgb250byBhIHJlZmVyZW5jZSBvZiB0aGUgY2FsbGJhY2sgdG8gd29yayBhcm91bmQgYSBjaHJvbWl1bSBidWdcclxuICAgICAgICAgICAgaWYgKHRoaXMubXV0YXRpb25DYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiAobXV0YXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goc3luYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNhZmFyaSBhbmQgY2hyb21lXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgV2ViS2l0TXV0YXRpb25PYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcGVydHlPYnNlcnZlcikgeyBkZWxldGUgdGhpcy5wcm9wZXJ0eU9ic2VydmVyOyB0aGlzLnByb3BlcnR5T2JzZXJ2ZXIgPSBudWxsOyB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5T2JzZXJ2ZXIgPSBuZXcgV2ViS2l0TXV0YXRpb25PYnNlcnZlcih0aGlzLm11dGF0aW9uQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eU9ic2VydmVyLm9ic2VydmUoZWwuZ2V0KDApLCB7IGF0dHJpYnV0ZXM6dHJ1ZSwgc3VidHJlZTpmYWxzZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgdHJpZ2dlclNlbGVjdDogZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgZXZ0ID0gJC5FdmVudChcInNlbGVjdDItc2VsZWN0aW5nXCIsIHsgdmFsOiB0aGlzLmlkKGRhdGEpLCBvYmplY3Q6IGRhdGEgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoZXZ0KTtcclxuICAgICAgICAgICAgcmV0dXJuICFldnQuaXNEZWZhdWx0UHJldmVudGVkKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVHJpZ2dlcnMgdGhlIGNoYW5nZSBldmVudCBvbiB0aGUgc291cmNlIGVsZW1lbnRcclxuICAgICAgICAgKi9cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHRyaWdnZXJDaGFuZ2U6IGZ1bmN0aW9uIChkZXRhaWxzKSB7XHJcblxyXG4gICAgICAgICAgICBkZXRhaWxzID0gZGV0YWlscyB8fCB7fTtcclxuICAgICAgICAgICAgZGV0YWlscz0gJC5leHRlbmQoe30sIGRldGFpbHMsIHsgdHlwZTogXCJjaGFuZ2VcIiwgdmFsOiB0aGlzLnZhbCgpIH0pO1xyXG4gICAgICAgICAgICAvLyBwcmV2ZW50cyByZWN1cnNpdmUgdHJpZ2dlcmluZ1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0Mi1jaGFuZ2UtdHJpZ2dlcmVkXCIsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKGRldGFpbHMpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0Mi1jaGFuZ2UtdHJpZ2dlcmVkXCIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNvbWUgdmFsaWRhdGlvbiBmcmFtZXdvcmtzIGlnbm9yZSB0aGUgY2hhbmdlIGV2ZW50IGFuZCBsaXN0ZW4gaW5zdGVhZCB0byBrZXl1cCwgY2xpY2sgZm9yIHNlbGVjdHNcclxuICAgICAgICAgICAgLy8gc28gaGVyZSB3ZSB0cmlnZ2VyIHRoZSBjbGljayBldmVudCBtYW51YWxseVxyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5jbGljaygpO1xyXG5cclxuICAgICAgICAgICAgLy8gVmFsaWRhdGlvbkVuZ2luZSBpZ25vcmVhIHRoZSBjaGFuZ2UgZXZlbnQgYW5kIGxpc3RlbnMgaW5zdGVhZCB0byBibHVyXHJcbiAgICAgICAgICAgIC8vIHNvIGhlcmUgd2UgdHJpZ2dlciB0aGUgYmx1ciBldmVudCBtYW51YWxseSBpZiBzbyBkZXNpcmVkXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYmx1ck9uQ2hhbmdlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQuYmx1cigpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vYWJzdHJhY3RcclxuICAgICAgICBpc0ludGVyZmFjZUVuYWJsZWQ6IGZ1bmN0aW9uKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWRJbnRlcmZhY2UgPT09IHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBlbmFibGVJbnRlcmZhY2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgZW5hYmxlZCA9IHRoaXMuX2VuYWJsZWQgJiYgIXRoaXMuX3JlYWRvbmx5LFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgPSAhZW5hYmxlZDtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkID09PSB0aGlzLmVuYWJsZWRJbnRlcmZhY2UpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnRvZ2dsZUNsYXNzKFwic2VsZWN0Mi1jb250YWluZXItZGlzYWJsZWRcIiwgZGlzYWJsZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZEludGVyZmFjZSA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGVuYWJsZTogZnVuY3Rpb24oZW5hYmxlZCkge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCA9PT0gdW5kZWZpbmVkKSBlbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2VuYWJsZWQgPT09IGVuYWJsZWQpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiwgIWVuYWJsZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZUludGVyZmFjZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlKGZhbHNlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHJlYWRvbmx5OiBmdW5jdGlvbihlbmFibGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkID09PSB1bmRlZmluZWQpIGVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlYWRvbmx5ID09PSBlbmFibGVkKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gZW5hYmxlZDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnByb3AoXCJyZWFkb25seVwiLCBlbmFibGVkKTtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVJbnRlcmZhY2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBvcGVuZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1kcm9wZG93bi1vcGVuXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgcG9zaXRpb25Ecm9wZG93bjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciAkZHJvcGRvd24gPSB0aGlzLmRyb3Bkb3duLFxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5jb250YWluZXIub2Zmc2V0KCksXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmNvbnRhaW5lci5vdXRlckhlaWdodChmYWxzZSksXHJcbiAgICAgICAgICAgICAgICB3aWR0aCA9IHRoaXMuY29udGFpbmVyLm91dGVyV2lkdGgoZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgZHJvcEhlaWdodCA9ICRkcm9wZG93bi5vdXRlckhlaWdodChmYWxzZSksXHJcbiAgICAgICAgICAgICAgICB2aWV3UG9ydFJpZ2h0ID0gJCh3aW5kb3cpLnNjcm9sbExlZnQoKSArICQod2luZG93KS53aWR0aCgpLFxyXG4gICAgICAgICAgICAgICAgdmlld3BvcnRCb3R0b20gPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgKyAkKHdpbmRvdykuaGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICBkcm9wVG9wID0gb2Zmc2V0LnRvcCArIGhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRyb3BMZWZ0ID0gb2Zmc2V0LmxlZnQsXHJcbiAgICAgICAgICAgICAgICBlbm91Z2hSb29tQmVsb3cgPSBkcm9wVG9wICsgZHJvcEhlaWdodCA8PSB2aWV3cG9ydEJvdHRvbSxcclxuICAgICAgICAgICAgICAgIGVub3VnaFJvb21BYm92ZSA9IChvZmZzZXQudG9wIC0gZHJvcEhlaWdodCkgPj0gdGhpcy5ib2R5KCkuc2Nyb2xsVG9wKCksXHJcbiAgICAgICAgICAgICAgICBkcm9wV2lkdGggPSAkZHJvcGRvd24ub3V0ZXJXaWR0aChmYWxzZSksXHJcbiAgICAgICAgICAgICAgICBlbm91Z2hSb29tT25SaWdodCA9IGRyb3BMZWZ0ICsgZHJvcFdpZHRoIDw9IHZpZXdQb3J0UmlnaHQsXHJcbiAgICAgICAgICAgICAgICBhYm92ZU5vdyA9ICRkcm9wZG93bi5oYXNDbGFzcyhcInNlbGVjdDItZHJvcC1hYm92ZVwiKSxcclxuICAgICAgICAgICAgICAgIGJvZHlPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICBhYm92ZSxcclxuICAgICAgICAgICAgICAgIGNzcyxcclxuICAgICAgICAgICAgICAgIHJlc3VsdHNMaXN0Tm9kZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZHJvcGRvd25BdXRvV2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHNMaXN0Tm9kZSA9ICQoJy5zZWxlY3QyLXJlc3VsdHMnLCAkZHJvcGRvd24pWzBdO1xyXG4gICAgICAgICAgICAgICAgJGRyb3Bkb3duLmFkZENsYXNzKCdzZWxlY3QyLWRyb3AtYXV0by13aWR0aCcpO1xyXG4gICAgICAgICAgICAgICAgJGRyb3Bkb3duLmNzcygnd2lkdGgnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgc2Nyb2xsYmFyIHdpZHRoIHRvIGRyb3Bkb3duIGlmIHZlcnRpY2FsIHNjcm9sbGJhciBpcyBwcmVzZW50XHJcbiAgICAgICAgICAgICAgICBkcm9wV2lkdGggPSAkZHJvcGRvd24ub3V0ZXJXaWR0aChmYWxzZSkgKyAocmVzdWx0c0xpc3ROb2RlLnNjcm9sbEhlaWdodCA9PT0gcmVzdWx0c0xpc3ROb2RlLmNsaWVudEhlaWdodCA/IDAgOiBzY3JvbGxCYXJEaW1lbnNpb25zLndpZHRoKTtcclxuICAgICAgICAgICAgICAgIGRyb3BXaWR0aCA+IHdpZHRoID8gd2lkdGggPSBkcm9wV2lkdGggOiBkcm9wV2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgICAgIGVub3VnaFJvb21PblJpZ2h0ID0gZHJvcExlZnQgKyBkcm9wV2lkdGggPD0gdmlld1BvcnRSaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKCdzZWxlY3QyLWRyb3AtYXV0by13aWR0aCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVsb3cvIGRyb3B0b3A6XCIsIGRyb3BUb3AsIFwiZHJvcEhlaWdodFwiLCBkcm9wSGVpZ2h0LCBcInN1bVwiLCAoZHJvcFRvcCtkcm9wSGVpZ2h0KStcIiB2aWV3cG9ydCBib3R0b21cIiwgdmlld3BvcnRCb3R0b20sIFwiZW5vdWdoP1wiLCBlbm91Z2hSb29tQmVsb3cpO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiYWJvdmUvIG9mZnNldC50b3BcIiwgb2Zmc2V0LnRvcCwgXCJkcm9wSGVpZ2h0XCIsIGRyb3BIZWlnaHQsIFwidG9wXCIsIChvZmZzZXQudG9wLWRyb3BIZWlnaHQpLCBcInNjcm9sbFRvcFwiLCB0aGlzLmJvZHkoKS5zY3JvbGxUb3AoKSwgXCJlbm91Z2g/XCIsIGVub3VnaFJvb21BYm92ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBmaXggcG9zaXRpb25pbmcgd2hlbiBib2R5IGhhcyBhbiBvZmZzZXQgYW5kIGlzIG5vdCBwb3NpdGlvbjogc3RhdGljXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJvZHkoKS5jc3MoJ3Bvc2l0aW9uJykgIT09ICdzdGF0aWMnKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5T2Zmc2V0ID0gdGhpcy5ib2R5KCkub2Zmc2V0KCk7XHJcbiAgICAgICAgICAgICAgICBkcm9wVG9wIC09IGJvZHlPZmZzZXQudG9wO1xyXG4gICAgICAgICAgICAgICAgZHJvcExlZnQgLT0gYm9keU9mZnNldC5sZWZ0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhbHdheXMgcHJlZmVyIHRoZSBjdXJyZW50IGFib3ZlL2JlbG93IGFsaWdubWVudCwgdW5sZXNzIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbVxyXG4gICAgICAgICAgICBpZiAoYWJvdmVOb3cpIHtcclxuICAgICAgICAgICAgICAgIGFib3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghZW5vdWdoUm9vbUFib3ZlICYmIGVub3VnaFJvb21CZWxvdykgYWJvdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFib3ZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWVub3VnaFJvb21CZWxvdyAmJiBlbm91Z2hSb29tQWJvdmUpIGFib3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFlbm91Z2hSb29tT25SaWdodCkge1xyXG4gICAgICAgICAgICAgICBkcm9wTGVmdCA9IG9mZnNldC5sZWZ0ICsgd2lkdGggLSBkcm9wV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChhYm92ZSkge1xyXG4gICAgICAgICAgICAgICAgZHJvcFRvcCA9IG9mZnNldC50b3AgLSBkcm9wSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWJvdmVcIik7XHJcbiAgICAgICAgICAgICAgICAkZHJvcGRvd24uYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWJvdmVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhcInNlbGVjdDItZHJvcC1hYm92ZVwiKTtcclxuICAgICAgICAgICAgICAgICRkcm9wZG93bi5yZW1vdmVDbGFzcyhcInNlbGVjdDItZHJvcC1hYm92ZVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3NzID0gJC5leHRlbmQoe1xyXG4gICAgICAgICAgICAgICAgdG9wOiBkcm9wVG9wLFxyXG4gICAgICAgICAgICAgICAgbGVmdDogZHJvcExlZnQsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGhcclxuICAgICAgICAgICAgfSwgZXZhbHVhdGUodGhpcy5vcHRzLmRyb3Bkb3duQ3NzKSk7XHJcblxyXG4gICAgICAgICAgICAkZHJvcGRvd24uY3NzKGNzcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBzaG91bGRPcGVuOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdmFyIGV2ZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKCkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbmFibGVkID09PSBmYWxzZSB8fCB0aGlzLl9yZWFkb25seSA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQgPSAkLkV2ZW50KFwic2VsZWN0Mi1vcGVuaW5nXCIpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKGV2ZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGNsZWFyRHJvcGRvd25BbGlnbm1lbnRQcmVmZXJlbmNlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGNsYXNzZXMgdXNlZCB0byBmaWd1cmUgb3V0IHRoZSBwcmVmZXJlbmNlIG9mIHdoZXJlIHRoZSBkcm9wZG93biBzaG91bGQgYmUgb3BlbmVkXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1kcm9wLWFib3ZlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1kcm9wLWFib3ZlXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE9wZW5zIHRoZSBkcm9wZG93blxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciBvciBub3QgZHJvcGRvd24gd2FzIG9wZW5lZC4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UgaWYsIGZvciBleGFtcGxlLFxyXG4gICAgICAgICAqIHRoZSBkcm9wZG93biBpcyBhbHJlYWR5IG9wZW4sIG9yIGlmIHRoZSAnb3BlbicgZXZlbnQgbGlzdGVuZXIgb24gdGhlIGVsZW1lbnQgY2FsbGVkIHByZXZlbnREZWZhdWx0KCkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBvcGVuOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkT3BlbigpKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wZW5pbmcoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFBlcmZvcm1zIHRoZSBvcGVuaW5nIG9mIHRoZSBkcm9wZG93blxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgb3BlbmluZzogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBjaWQgPSB0aGlzLmNvbnRhaW5lcklkLFxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsID0gXCJzY3JvbGwuXCIgKyBjaWQsXHJcbiAgICAgICAgICAgICAgICByZXNpemUgPSBcInJlc2l6ZS5cIitjaWQsXHJcbiAgICAgICAgICAgICAgICBvcmllbnQgPSBcIm9yaWVudGF0aW9uY2hhbmdlLlwiK2NpZCxcclxuICAgICAgICAgICAgICAgIG1hc2ssIG1hc2tDc3M7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyhcInNlbGVjdDItZHJvcGRvd24tb3BlblwiKS5hZGRDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJEcm9wZG93bkFsaWdubWVudFByZWZlcmVuY2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmKHRoaXMuZHJvcGRvd25bMF0gIT09IHRoaXMuYm9keSgpLmNoaWxkcmVuKCkubGFzdCgpWzBdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmRldGFjaCgpLmFwcGVuZFRvKHRoaXMuYm9keSgpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBkcm9wZG93biBtYXNrIGlmIGRvZXNudCBhbHJlYWR5IGV4aXN0XHJcbiAgICAgICAgICAgIG1hc2sgPSAkKFwiI3NlbGVjdDItZHJvcC1tYXNrXCIpO1xyXG4gICAgICAgICAgICBpZiAobWFzay5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbWFzayA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XHJcbiAgICAgICAgICAgICAgICBtYXNrLmF0dHIoXCJpZFwiLFwic2VsZWN0Mi1kcm9wLW1hc2tcIikuYXR0cihcImNsYXNzXCIsXCJzZWxlY3QyLWRyb3AtbWFza1wiKTtcclxuICAgICAgICAgICAgICAgIG1hc2suaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgbWFzay5hcHBlbmRUbyh0aGlzLmJvZHkoKSk7XHJcbiAgICAgICAgICAgICAgICBtYXNrLm9uKFwibW91c2Vkb3duIHRvdWNoc3RhcnQgY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZHJvcGRvd24gPSAkKFwiI3NlbGVjdDItZHJvcFwiKSwgc2VsZjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcGRvd24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmPWRyb3Bkb3duLmRhdGEoXCJzZWxlY3QyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRzLnNlbGVjdE9uQmx1cikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RIaWdobGlnaHRlZCh7bm9Gb2N1czogdHJ1ZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2Uoe2ZvY3VzOmZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSBtYXNrIGlzIGFsd2F5cyByaWdodCBiZWZvcmUgdGhlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duLnByZXYoKVswXSAhPT0gbWFza1swXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5iZWZvcmUobWFzayk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIG1vdmUgdGhlIGdsb2JhbCBpZCB0byB0aGUgY29ycmVjdCBkcm9wZG93blxyXG4gICAgICAgICAgICAkKFwiI3NlbGVjdDItZHJvcFwiKS5yZW1vdmVBdHRyKFwiaWRcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYXR0cihcImlkXCIsIFwic2VsZWN0Mi1kcm9wXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gc2hvdyB0aGUgZWxlbWVudHNcclxuICAgICAgICAgICAgbWFzay5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRHJvcGRvd24oKTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5zaG93KCk7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25Ecm9wZG93bigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5hZGRDbGFzcyhcInNlbGVjdDItZHJvcC1hY3RpdmVcIik7XHJcblxyXG4gICAgICAgICAgICAvLyBhdHRhY2ggbGlzdGVuZXJzIHRvIGV2ZW50cyB0aGF0IGNhbiBjaGFuZ2UgdGhlIHBvc2l0aW9uIG9mIHRoZSBjb250YWluZXIgYW5kIHRodXMgcmVxdWlyZVxyXG4gICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gb2YgdGhlIGRyb3Bkb3duIHRvIGJlIHVwZGF0ZWQgYXMgd2VsbCBzbyBpdCBkb2VzIG5vdCBjb21lIHVuZ2x1ZWQgZnJvbSB0aGUgY29udGFpbmVyXHJcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucGFyZW50cygpLmFkZCh3aW5kb3cpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5vbihyZXNpemUrXCIgXCIrc2Nyb2xsK1wiIFwiK29yaWVudCwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LnBvc2l0aW9uRHJvcGRvd24oKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB2YXIgY2lkID0gdGhpcy5jb250YWluZXJJZCxcclxuICAgICAgICAgICAgICAgIHNjcm9sbCA9IFwic2Nyb2xsLlwiICsgY2lkLFxyXG4gICAgICAgICAgICAgICAgcmVzaXplID0gXCJyZXNpemUuXCIrY2lkLFxyXG4gICAgICAgICAgICAgICAgb3JpZW50ID0gXCJvcmllbnRhdGlvbmNoYW5nZS5cIitjaWQ7XHJcblxyXG4gICAgICAgICAgICAvLyB1bmJpbmQgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnBhcmVudHMoKS5hZGQod2luZG93KS5lYWNoKGZ1bmN0aW9uICgpIHsgJCh0aGlzKS5vZmYoc2Nyb2xsKS5vZmYocmVzaXplKS5vZmYob3JpZW50KTsgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyRHJvcGRvd25BbGlnbm1lbnRQcmVmZXJlbmNlKCk7XHJcblxyXG4gICAgICAgICAgICAkKFwiI3NlbGVjdDItZHJvcC1tYXNrXCIpLmhpZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5yZW1vdmVBdHRyKFwiaWRcIik7IC8vIG9ubHkgdGhlIGFjdGl2ZSBkcm9wZG93biBoYXMgdGhlIHNlbGVjdDItZHJvcCBpZFxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmhpZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWRyb3Bkb3duLW9wZW5cIik7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cy5lbXB0eSgpO1xyXG5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1jbG9zZVwiKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogT3BlbnMgY29udHJvbCwgc2V0cyBpbnB1dCB2YWx1ZSwgYW5kIHVwZGF0ZXMgcmVzdWx0cy5cclxuICAgICAgICAgKi9cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGV4dGVybmFsU2VhcmNoOiBmdW5jdGlvbiAodGVybSkge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gudmFsKHRlcm0pO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHMoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgY2xlYXJTZWFyY2g6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy9hYnN0cmFjdFxyXG4gICAgICAgIGdldE1heGltdW1TZWxlY3Rpb25TaXplOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlKHRoaXMub3B0cy5tYXhpbXVtU2VsZWN0aW9uU2l6ZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBlbnN1cmVIaWdobGlnaHRWaXNpYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0gdGhpcy5yZXN1bHRzLCBjaGlsZHJlbiwgaW5kZXgsIGNoaWxkLCBoYiwgcmIsIHksIG1vcmU7XHJcblxyXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuaGlnaGxpZ2h0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGhpZ2hsaWdodGVkIHNjcm9sbCBhbGwgdGhlIHdheSB0byB0aGUgdG9wLFxyXG4gICAgICAgICAgICAgICAgLy8gdGhhdCB3YXkgYW55IHVuc2VsZWN0YWJsZSBoZWFkZXJzIGFib3ZlIGl0IHdpbGwgYWxzbyBiZSBzY3JvbGxlZFxyXG4gICAgICAgICAgICAgICAgLy8gaW50byB2aWV3XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5zY3JvbGxUb3AoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKS5maW5kKCcuc2VsZWN0Mi1yZXN1bHQtbGFiZWwnKTtcclxuXHJcbiAgICAgICAgICAgIGNoaWxkID0gJChjaGlsZHJlbltpbmRleF0pO1xyXG5cclxuICAgICAgICAgICAgaGIgPSBjaGlsZC5vZmZzZXQoKS50b3AgKyBjaGlsZC5vdXRlckhlaWdodCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2hpbGQgbGV0cyBhbHNvIG1ha2Ugc3VyZSBzZWxlY3QyLW1vcmUtcmVzdWx0cyBpcyB2aXNpYmxlXHJcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgbW9yZSA9IHJlc3VsdHMuZmluZChcImxpLnNlbGVjdDItbW9yZS1yZXN1bHRzXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1vcmUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGhiID0gbW9yZS5vZmZzZXQoKS50b3AgKyBtb3JlLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByYiA9IHJlc3VsdHMub2Zmc2V0KCkudG9wICsgcmVzdWx0cy5vdXRlckhlaWdodCh0cnVlKTtcclxuICAgICAgICAgICAgaWYgKGhiID4gcmIpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHMuc2Nyb2xsVG9wKHJlc3VsdHMuc2Nyb2xsVG9wKCkgKyAoaGIgLSByYikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHkgPSBjaGlsZC5vZmZzZXQoKS50b3AgLSByZXN1bHRzLm9mZnNldCgpLnRvcDtcclxuXHJcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdG9wIG9mIHRoZSBlbGVtZW50IGlzIHZpc2libGVcclxuICAgICAgICAgICAgaWYgKHkgPCAwICYmIGNoaWxkLmNzcygnZGlzcGxheScpICE9ICdub25lJyApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHMuc2Nyb2xsVG9wKHJlc3VsdHMuc2Nyb2xsVG9wKCkgKyB5KTsgLy8geSBpcyBuZWdhdGl2ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBmaW5kSGlnaGxpZ2h0YWJsZUNob2ljZXM6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzLmZpbmQoXCIuc2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZTpub3QoLnNlbGVjdDItc2VsZWN0ZWQpOm5vdCguc2VsZWN0Mi1kaXNhYmxlZClcIik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBtb3ZlSGlnaGxpZ2h0OiBmdW5jdGlvbiAoZGVsdGEpIHtcclxuICAgICAgICAgICAgdmFyIGNob2ljZXMgPSB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpLFxyXG4gICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLmhpZ2hsaWdodCgpO1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKGluZGV4ID4gLTEgJiYgaW5kZXggPCBjaG9pY2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaW5kZXggKz0gZGVsdGE7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hvaWNlID0gJChjaG9pY2VzW2luZGV4XSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hvaWNlLmhhc0NsYXNzKFwic2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZVwiKSAmJiAhY2hvaWNlLmhhc0NsYXNzKFwic2VsZWN0Mi1kaXNhYmxlZFwiKSAmJiAhY2hvaWNlLmhhc0NsYXNzKFwic2VsZWN0Mi1zZWxlY3RlZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0KGluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgaGlnaGxpZ2h0OiBmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICAgICAgdmFyIGNob2ljZXMgPSB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlLFxyXG4gICAgICAgICAgICAgICAgZGF0YTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhPZihjaG9pY2VzLmZpbHRlcihcIi5zZWxlY3QyLWhpZ2hsaWdodGVkXCIpWzBdLCBjaG9pY2VzLmdldCgpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ID49IGNob2ljZXMubGVuZ3RoKSBpbmRleCA9IGNob2ljZXMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgaW5kZXggPSAwO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgIGNob2ljZSA9ICQoY2hvaWNlc1tpbmRleF0pO1xyXG4gICAgICAgICAgICBjaG9pY2UuYWRkQ2xhc3MoXCJzZWxlY3QyLWhpZ2hsaWdodGVkXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbnN1cmVIaWdobGlnaHRWaXNpYmxlKCk7XHJcblxyXG4gICAgICAgICAgICBkYXRhID0gY2hvaWNlLmRhdGEoXCJzZWxlY3QyLWRhdGFcIik7XHJcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKHsgdHlwZTogXCJzZWxlY3QyLWhpZ2hsaWdodFwiLCB2YWw6IHRoaXMuaWQoZGF0YSksIGNob2ljZTogZGF0YSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHJlbW92ZUhpZ2hsaWdodDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cy5maW5kKFwiLnNlbGVjdDItaGlnaGxpZ2h0ZWRcIikucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWhpZ2hsaWdodGVkXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgY291bnRTZWxlY3RhYmxlUmVzdWx0czogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpLmxlbmd0aDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGhpZ2hsaWdodFVuZGVyRXZlbnQ6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICB2YXIgZWwgPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcIi5zZWxlY3QyLXJlc3VsdC1zZWxlY3RhYmxlXCIpO1xyXG4gICAgICAgICAgICBpZiAoZWwubGVuZ3RoID4gMCAmJiAhZWwuaXMoXCIuc2VsZWN0Mi1oaWdobGlnaHRlZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNob2ljZXMgPSB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHQoY2hvaWNlcy5pbmRleChlbCkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgb3ZlciBhbiB1bnNlbGVjdGFibGUgaXRlbSByZW1vdmUgYWxsIGhpZ2hsaWdodHNcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGxvYWRNb3JlSWZOZWVkZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMsXHJcbiAgICAgICAgICAgICAgICBtb3JlID0gcmVzdWx0cy5maW5kKFwibGkuc2VsZWN0Mi1tb3JlLXJlc3VsdHNcIiksXHJcbiAgICAgICAgICAgICAgICBiZWxvdywgLy8gcGl4ZWxzIHRoZSBlbGVtZW50IGlzIGJlbG93IHRoZSBzY3JvbGwgZm9sZCwgYmVsb3c9PTAgaXMgd2hlbiB0aGUgZWxlbWVudCBpcyBzdGFydGluZyB0byBiZSB2aXNpYmxlXHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtMSwgLy8gaW5kZXggb2YgZmlyc3QgZWxlbWVudCB3aXRob3V0IGRhdGFcclxuICAgICAgICAgICAgICAgIHBhZ2UgPSB0aGlzLnJlc3VsdHNQYWdlICsgMSxcclxuICAgICAgICAgICAgICAgIHNlbGY9dGhpcyxcclxuICAgICAgICAgICAgICAgIHRlcm09dGhpcy5zZWFyY2gudmFsKCksXHJcbiAgICAgICAgICAgICAgICBjb250ZXh0PXRoaXMuY29udGV4dDtcclxuXHJcbiAgICAgICAgICAgIGlmIChtb3JlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBiZWxvdyA9IG1vcmUub2Zmc2V0KCkudG9wIC0gcmVzdWx0cy5vZmZzZXQoKS50b3AgLSByZXN1bHRzLmhlaWdodCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGJlbG93IDw9IHRoaXMub3B0cy5sb2FkTW9yZVBhZGRpbmcpIHtcclxuICAgICAgICAgICAgICAgIG1vcmUuYWRkQ2xhc3MoXCJzZWxlY3QyLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMub3B0cy5lbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtOiB0ZXJtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyOiB0aGlzLm9wdHMubWF0Y2hlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuYmluZChmdW5jdGlvbiAoZGF0YSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYSByZXNwb25zZSBpZiB0aGUgc2VsZWN0MiBoYXMgYmVlbiBjbG9zZWQgYmVmb3JlIGl0IHdhcyByZWNlaXZlZFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcGVuZWQoKSkgcmV0dXJuO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRzLnBvcHVsYXRlUmVzdWx0cy5jYWxsKHRoaXMsIHJlc3VsdHMsIGRhdGEucmVzdWx0cywge3Rlcm06IHRlcm0sIHBhZ2U6IHBhZ2UsIGNvbnRleHQ6Y29udGV4dH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zdHByb2Nlc3NSZXN1bHRzKGRhdGEsIGZhbHNlLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm1vcmU9PT10cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUuZGV0YWNoKCkuYXBwZW5kVG8ocmVzdWx0cykudGV4dChzZWxmLm9wdHMuZm9ybWF0TG9hZE1vcmUocGFnZSsxKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxmLmxvYWRNb3JlSWZOZWVkZWQoKTsgfSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb25Ecm9wZG93bigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c1BhZ2UgPSBwYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IGRhdGEuY29udGV4dDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKHsgdHlwZTogXCJzZWxlY3QyLWxvYWRlZFwiLCBpdGVtczogZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgIH0pfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWZhdWx0IHRva2VuaXplciBmdW5jdGlvbiB3aGljaCBkb2VzIG5vdGhpbmdcclxuICAgICAgICAgKi9cclxuICAgICAgICB0b2tlbml6ZTogZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwYXJhbSBpbml0aWFsIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgdGhlIGNhbGwgdG8gdGhpcyBtZXRob2QgcmlnaHQgYWZ0ZXIgdGhlIGRyb3Bkb3duIGhhcyBiZWVuIG9wZW5lZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgdXBkYXRlUmVzdWx0czogZnVuY3Rpb24gKGluaXRpYWwpIHtcclxuICAgICAgICAgICAgdmFyIHNlYXJjaCA9IHRoaXMuc2VhcmNoLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0cyA9IHRoaXMucmVzdWx0cyxcclxuICAgICAgICAgICAgICAgIG9wdHMgPSB0aGlzLm9wdHMsXHJcbiAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgc2VsZiA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBpbnB1dCxcclxuICAgICAgICAgICAgICAgIHRlcm0gPSBzZWFyY2gudmFsKCksXHJcbiAgICAgICAgICAgICAgICBsYXN0VGVybSA9ICQuZGF0YSh0aGlzLmNvbnRhaW5lciwgXCJzZWxlY3QyLWxhc3QtdGVybVwiKSxcclxuICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlIG51bWJlciB1c2VkIHRvIGRyb3Agb3V0LW9mLW9yZGVyIHJlc3BvbnNlc1xyXG4gICAgICAgICAgICAgICAgcXVlcnlOdW1iZXI7XHJcblxyXG4gICAgICAgICAgICAvLyBwcmV2ZW50IGR1cGxpY2F0ZSBxdWVyaWVzIGFnYWluc3QgdGhlIHNhbWUgdGVybVxyXG4gICAgICAgICAgICBpZiAoaW5pdGlhbCAhPT0gdHJ1ZSAmJiBsYXN0VGVybSAmJiBlcXVhbCh0ZXJtLCBsYXN0VGVybSkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICQuZGF0YSh0aGlzLmNvbnRhaW5lciwgXCJzZWxlY3QyLWxhc3QtdGVybVwiLCB0ZXJtKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBzZWFyY2ggaXMgY3VycmVudGx5IGhpZGRlbiB3ZSBkbyBub3QgYWx0ZXIgdGhlIHJlc3VsdHNcclxuICAgICAgICAgICAgaWYgKGluaXRpYWwgIT09IHRydWUgJiYgKHRoaXMuc2hvd1NlYXJjaElucHV0ID09PSBmYWxzZSB8fCAhdGhpcy5vcGVuZWQoKSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gcG9zdFJlbmRlcigpIHtcclxuICAgICAgICAgICAgICAgIHNlYXJjaC5yZW1vdmVDbGFzcyhcInNlbGVjdDItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5wb3NpdGlvbkRyb3Bkb3duKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbmRlcihodG1sKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRzLmh0bWwoaHRtbCk7XHJcbiAgICAgICAgICAgICAgICBwb3N0UmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHF1ZXJ5TnVtYmVyID0gKyt0aGlzLnF1ZXJ5Q291bnQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgbWF4U2VsU2l6ZSA9IHRoaXMuZ2V0TWF4aW11bVNlbGVjdGlvblNpemUoKTtcclxuICAgICAgICAgICAgaWYgKG1heFNlbFNpemUgPj0xKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoJC5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID49IG1heFNlbFNpemUgJiYgY2hlY2tGb3JtYXR0ZXIob3B0cy5mb3JtYXRTZWxlY3Rpb25Ub29CaWcsIFwiZm9ybWF0U2VsZWN0aW9uVG9vQmlnXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyKFwiPGxpIGNsYXNzPSdzZWxlY3QyLXNlbGVjdGlvbi1saW1pdCc+XCIgKyBvcHRzLmZvcm1hdFNlbGVjdGlvblRvb0JpZyhtYXhTZWxTaXplKSArIFwiPC9saT5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VhcmNoLnZhbCgpLmxlbmd0aCA8IG9wdHMubWluaW11bUlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tGb3JtYXR0ZXIob3B0cy5mb3JtYXRJbnB1dFRvb1Nob3J0LCBcImZvcm1hdElucHV0VG9vU2hvcnRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXIoXCI8bGkgY2xhc3M9J3NlbGVjdDItbm8tcmVzdWx0cyc+XCIgKyBvcHRzLmZvcm1hdElucHV0VG9vU2hvcnQoc2VhcmNoLnZhbCgpLCBvcHRzLm1pbmltdW1JbnB1dExlbmd0aCkgKyBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXIoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbCAmJiB0aGlzLnNob3dTZWFyY2gpIHRoaXMuc2hvd1NlYXJjaCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdHMubWF4aW11bUlucHV0TGVuZ3RoICYmIHNlYXJjaC52YWwoKS5sZW5ndGggPiBvcHRzLm1heGltdW1JbnB1dExlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9ybWF0dGVyKG9wdHMuZm9ybWF0SW5wdXRUb29Mb25nLCBcImZvcm1hdElucHV0VG9vTG9uZ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcihcIjxsaSBjbGFzcz0nc2VsZWN0Mi1uby1yZXN1bHRzJz5cIiArIG9wdHMuZm9ybWF0SW5wdXRUb29Mb25nKHNlYXJjaC52YWwoKSwgb3B0cy5tYXhpbXVtSW5wdXRMZW5ndGgpICsgXCI8L2xpPlwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0cy5mb3JtYXRTZWFyY2hpbmcgJiYgdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJlbmRlcihcIjxsaSBjbGFzcz0nc2VsZWN0Mi1zZWFyY2hpbmcnPlwiICsgb3B0cy5mb3JtYXRTZWFyY2hpbmcoKSArIFwiPC9saT5cIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNlYXJjaC5hZGRDbGFzcyhcInNlbGVjdDItYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGdpdmUgdGhlIHRva2VuaXplciBhIGNoYW5jZSB0byBwcmUtcHJvY2VzcyB0aGUgaW5wdXRcclxuICAgICAgICAgICAgaW5wdXQgPSB0aGlzLnRva2VuaXplKCk7XHJcbiAgICAgICAgICAgIGlmIChpbnB1dCAhPSB1bmRlZmluZWQgJiYgaW5wdXQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgc2VhcmNoLnZhbChpbnB1dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c1BhZ2UgPSAxO1xyXG5cclxuICAgICAgICAgICAgb3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBvcHRzLmVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVybTogc2VhcmNoLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMucmVzdWx0c1BhZ2UsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVyOiBvcHRzLm1hdGNoZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuYmluZChmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRlZjsgLy8gZGVmYXVsdCBjaG9pY2VcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgb2xkIHJlc3BvbnNlc1xyXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5TnVtYmVyICE9IHRoaXMucXVlcnlDb3VudCkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGEgcmVzcG9uc2UgaWYgdGhlIHNlbGVjdDIgaGFzIGJlZW4gY2xvc2VkIGJlZm9yZSBpdCB3YXMgcmVjZWl2ZWRcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIHNhdmUgY29udGV4dCwgaWYgYW55XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSAoZGF0YS5jb250ZXh0PT09dW5kZWZpbmVkKSA/IG51bGwgOiBkYXRhLmNvbnRleHQ7XHJcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBkZWZhdWx0IGNob2ljZSBhbmQgcHJlcGVuZCBpdCB0byB0aGUgbGlzdFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgJiYgc2VhcmNoLnZhbCgpICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmID0gdGhpcy5vcHRzLmNyZWF0ZVNlYXJjaENob2ljZS5jYWxsKHNlbGYsIHNlYXJjaC52YWwoKSwgZGF0YS5yZXN1bHRzKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmICE9PSB1bmRlZmluZWQgJiYgZGVmICE9PSBudWxsICYmIHNlbGYuaWQoZGVmKSAhPT0gdW5kZWZpbmVkICYmIHNlbGYuaWQoZGVmKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChkYXRhLnJlc3VsdHMpLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXF1YWwoc2VsZi5pZCh0aGlzKSwgc2VsZi5pZChkZWYpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZXN1bHRzLnVuc2hpZnQoZGVmKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHRzLmxlbmd0aCA9PT0gMCAmJiBjaGVja0Zvcm1hdHRlcihvcHRzLmZvcm1hdE5vTWF0Y2hlcywgXCJmb3JtYXROb01hdGNoZXNcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXIoXCI8bGkgY2xhc3M9J3NlbGVjdDItbm8tcmVzdWx0cyc+XCIgKyBvcHRzLmZvcm1hdE5vTWF0Y2hlcyhzZWFyY2gudmFsKCkpICsgXCI8L2xpPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5vcHRzLnBvcHVsYXRlUmVzdWx0cy5jYWxsKHRoaXMsIHJlc3VsdHMsIGRhdGEucmVzdWx0cywge3Rlcm06IHNlYXJjaC52YWwoKSwgcGFnZTogdGhpcy5yZXN1bHRzUGFnZSwgY29udGV4dDpudWxsfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEubW9yZSA9PT0gdHJ1ZSAmJiBjaGVja0Zvcm1hdHRlcihvcHRzLmZvcm1hdExvYWRNb3JlLCBcImZvcm1hdExvYWRNb3JlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoXCI8bGkgY2xhc3M9J3NlbGVjdDItbW9yZS1yZXN1bHRzJz5cIiArIHNlbGYub3B0cy5lc2NhcGVNYXJrdXAob3B0cy5mb3JtYXRMb2FkTW9yZSh0aGlzLnJlc3VsdHNQYWdlKSkgKyBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxmLmxvYWRNb3JlSWZOZWVkZWQoKTsgfSwgMTApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucG9zdHByb2Nlc3NSZXN1bHRzKGRhdGEsIGluaXRpYWwpO1xyXG5cclxuICAgICAgICAgICAgICAgIHBvc3RSZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKHsgdHlwZTogXCJzZWxlY3QyLWxvYWRlZFwiLCBpdGVtczogZGF0YSB9KTtcclxuICAgICAgICAgICAgfSl9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBibHVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHNlbGVjdE9uQmx1ciA9PSB0cnVlLCBzZWxlY3QgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBvcHRpb25cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5zZWxlY3RPbkJsdXIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkKHtub0ZvY3VzOiB0cnVlfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAvLyBzeW5vbnltb3VzIHRvIC5pcygnOmZvY3VzJyksIHdoaWNoIGlzIGF2YWlsYWJsZSBpbiBqcXVlcnkgPj0gMS42XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFswXSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgeyB0aGlzLnNlYXJjaC5ibHVyKCk7IH1cclxuICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZS1mb2N1c1wiKS5yZW1vdmVDbGFzcyhcInNlbGVjdDItc2VhcmNoLWNob2ljZS1mb2N1c1wiKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGZvY3VzU2VhcmNoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZvY3VzKHRoaXMuc2VhcmNoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHNlbGVjdEhpZ2hsaWdodGVkOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICB2YXIgaW5kZXg9dGhpcy5oaWdobGlnaHQoKSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkPXRoaXMucmVzdWx0cy5maW5kKFwiLnNlbGVjdDItaGlnaGxpZ2h0ZWRcIiksXHJcbiAgICAgICAgICAgICAgICBkYXRhID0gaGlnaGxpZ2h0ZWQuY2xvc2VzdCgnLnNlbGVjdDItcmVzdWx0JykuZGF0YShcInNlbGVjdDItZGF0YVwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodChpbmRleCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0KGRhdGEsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5ub0ZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGdldFBsYWNlaG9sZGVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBwbGFjZWhvbGRlck9wdGlvbjtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0cy5lbGVtZW50LmF0dHIoXCJwbGFjZWhvbGRlclwiKSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcImRhdGEtcGxhY2Vob2xkZXJcIikgfHwgLy8ganF1ZXJ5IDEuNCBjb21wYXRcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LmRhdGEoXCJwbGFjZWhvbGRlclwiKSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLnBsYWNlaG9sZGVyIHx8XHJcbiAgICAgICAgICAgICAgICAoKHBsYWNlaG9sZGVyT3B0aW9uID0gdGhpcy5nZXRQbGFjZWhvbGRlck9wdGlvbigpKSAhPT0gdW5kZWZpbmVkID8gcGxhY2Vob2xkZXJPcHRpb24udGV4dCgpIDogdW5kZWZpbmVkKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGdldFBsYWNlaG9sZGVyT3B0aW9uOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3RPcHRpb24gPSB0aGlzLnNlbGVjdC5jaGlsZHJlbigpLmZpcnN0KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLnBsYWNlaG9sZGVyT3B0aW9uICE9PSB1bmRlZmluZWQgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9EZXRlcm1pbmUgdGhlIHBsYWNlaG9sZGVyIG9wdGlvbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBsYWNlaG9sZGVyT3B0aW9uIHNldHRpbmdcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMub3B0cy5wbGFjZWhvbGRlck9wdGlvbiA9PT0gXCJmaXJzdFwiICYmIGZpcnN0T3B0aW9uKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMub3B0cy5wbGFjZWhvbGRlck9wdGlvbiA9PT0gXCJmdW5jdGlvblwiICYmIHRoaXMub3B0cy5wbGFjZWhvbGRlck9wdGlvbih0aGlzLnNlbGVjdCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdE9wdGlvbi50ZXh0KCkgPT09IFwiXCIgJiYgZmlyc3RPcHRpb24udmFsKCkgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL05vIGV4cGxpY2l0IHBsYWNlaG9sZGVyIG9wdGlvbiBzcGVjaWZpZWQsIHVzZSB0aGUgZmlyc3QgaWYgaXQncyBibGFua1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdE9wdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdldCB0aGUgZGVzaXJlZCB3aWR0aCBmb3IgdGhlIGNvbnRhaW5lciBlbGVtZW50LiAgVGhpcyBpc1xyXG4gICAgICAgICAqIGRlcml2ZWQgZmlyc3QgZnJvbSBvcHRpb24gYHdpZHRoYCBwYXNzZWQgdG8gc2VsZWN0MiwgdGhlblxyXG4gICAgICAgICAqIHRoZSBpbmxpbmUgJ3N0eWxlJyBvbiB0aGUgb3JpZ2luYWwgZWxlbWVudCwgYW5kIGZpbmFsbHlcclxuICAgICAgICAgKiBmYWxscyBiYWNrIHRvIHRoZSBqUXVlcnkgY2FsY3VsYXRlZCBlbGVtZW50IHdpZHRoLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgaW5pdENvbnRhaW5lcldpZHRoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlc29sdmVDb250YWluZXJXaWR0aCgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzdHlsZSwgYXR0cnMsIG1hdGNoZXMsIGksIGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy53aWR0aCA9PT0gXCJvZmZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdHMud2lkdGggPT09IFwiZWxlbWVudFwiKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRzLmVsZW1lbnQub3V0ZXJXaWR0aChmYWxzZSkgPT09IDAgPyAnYXV0bycgOiB0aGlzLm9wdHMuZWxlbWVudC5vdXRlcldpZHRoKGZhbHNlKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy53aWR0aCA9PT0gXCJjb3B5XCIgfHwgdGhpcy5vcHRzLndpZHRoID09PSBcInJlc29sdmVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGlubGluZSBzdHlsZSBvbiB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHdpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSB0aGlzLm9wdHMuZWxlbWVudC5hdHRyKCdzdHlsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzID0gc3R5bGUuc3BsaXQoJzsnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IGF0dHJzW2ldLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goL1teLV13aWR0aDooKFstK10/KFswLTldKlxcLik/WzAtOV0rKShweHxlbXxleHwlfGlufGNtfG1tfHB0fHBjKSkvaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyAhPT0gbnVsbCAmJiBtYXRjaGVzLmxlbmd0aCA+PSAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLndpZHRoID09PSBcInJlc29sdmVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNoZWNrIGlmIGNzcygnd2lkdGgnKSBjYW4gcmVzb2x2ZSBhIHdpZHRoIHRoYXQgaXMgcGVyY2VudCBiYXNlZCwgdGhpcyBpcyBzb21ldGltZXMgcG9zc2libGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhdHRhY2hlZCB0byBpbnB1dCB0eXBlPWhpZGRlbiBvciBlbGVtZW50cyBoaWRkZW4gdmlhIGNzc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHRoaXMub3B0cy5lbGVtZW50LmNzcygnd2lkdGgnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlLmluZGV4T2YoXCIlXCIpID4gMCkgcmV0dXJuIHN0eWxlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSwgZmFsbGJhY2sgb24gdGhlIGNhbGN1bGF0ZWQgd2lkdGggb2YgdGhlIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLm9wdHMuZWxlbWVudC5vdXRlcldpZHRoKGZhbHNlKSA9PT0gMCA/ICdhdXRvJyA6IHRoaXMub3B0cy5lbGVtZW50Lm91dGVyV2lkdGgoZmFsc2UpICsgJ3B4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJC5pc0Z1bmN0aW9uKHRoaXMub3B0cy53aWR0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRzLndpZHRoKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdHMud2lkdGg7XHJcbiAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHJlc29sdmVDb250YWluZXJXaWR0aC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAod2lkdGggIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNzcyhcIndpZHRoXCIsIHdpZHRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIFNpbmdsZVNlbGVjdDIgPSBjbGF6eihBYnN0cmFjdFNlbGVjdDIsIHtcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcblxyXG4gICAgICAgIGNyZWF0ZUNvbnRhaW5lcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5hdHRyKHtcclxuICAgICAgICAgICAgICAgIFwiY2xhc3NcIjogXCJzZWxlY3QyLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgIH0pLmh0bWwoW1xyXG4gICAgICAgICAgICAgICAgXCI8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCknIG9uY2xpY2s9J3JldHVybiBmYWxzZTsnIGNsYXNzPSdzZWxlY3QyLWNob2ljZScgdGFiaW5kZXg9Jy0xJz5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgPHNwYW4gY2xhc3M9J3NlbGVjdDItY2hvc2VuJz4mbmJzcDs8L3NwYW4+PGFiYnIgY2xhc3M9J3NlbGVjdDItc2VhcmNoLWNob2ljZS1jbG9zZSc+PC9hYmJyPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8c3BhbiBjbGFzcz0nc2VsZWN0Mi1hcnJvdyc+PGkgY2xhc3M9J2ZhIGZhLXNvcnQgYnJhbmQtaW5mbyBzZWxlY3QyLWZhJz48L2k+PC9zcGFuPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8L2E+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjxpbnB1dCBjbGFzcz0nc2VsZWN0Mi1mb2N1c3NlciBzZWxlY3QyLW9mZnNjcmVlbicgdHlwZT0ndGV4dCcvPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8ZGl2IGNsYXNzPSdzZWxlY3QyLWRyb3Agc2VsZWN0Mi1kaXNwbGF5LW5vbmUnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8ZGl2IGNsYXNzPSdzZWxlY3QyLXNlYXJjaCc+XCIsXHJcbiAgICAgICAgICAgICAgICBcIiAgICAgICA8aW5wdXQgdHlwZT0ndGV4dCcgYXV0b2NvbXBsZXRlPSdvZmYnIGF1dG9jb3JyZWN0PSdvZmYnIGF1dG9jYXBpdGFsaXplPSdvZmYnIHNwZWxsY2hlY2s9J2ZhbHNlJyBjbGFzcz0nc2VsZWN0Mi1pbnB1dCcvPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8L2Rpdj5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgPHVsIGNsYXNzPSdzZWxlY3QyLXJlc3VsdHMnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8L3VsPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8L2Rpdj5cIl0uam9pbihcIlwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgZW5hYmxlSW50ZXJmYWNlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50LmVuYWJsZUludGVyZmFjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLnByb3AoXCJkaXNhYmxlZFwiLCAhdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBvcGVuaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlbCwgcmFuZ2UsIGxlbjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMubWluaW11bVJlc3VsdHNGb3JTZWFyY2ggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5vcGVuaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93U2VhcmNoSW5wdXQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJRSBhcHBlbmRzIGZvY3Vzc2VyLnZhbCgpIGF0IHRoZSBlbmQgb2YgZmllbGQgOi8gc28gd2UgbWFudWFsbHkgaW5zZXJ0IGl0IGF0IHRoZSBiZWdpbm5pbmcgdXNpbmcgYSByYW5nZVxyXG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIGJyb3dzZXJzIGhhbmRsZSB0aGlzIGp1c3QgZmluZVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnZhbCh0aGlzLmZvY3Vzc2VyLnZhbCgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5mb2N1cygpO1xyXG4gICAgICAgICAgICAvLyBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBhZnRlciBmb2N1c3NpbmcsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGF0IHRoZSBiZWdpbm5pbmcgYW5kXHJcbiAgICAgICAgICAgIC8vIG5ldyB0ZXh0IHdpbGwgYXBwZWFyICpiZWZvcmUqIGZvY3Vzc2VyLnZhbCgpXHJcbiAgICAgICAgICAgIGVsID0gdGhpcy5zZWFyY2guZ2V0KDApO1xyXG4gICAgICAgICAgICBpZiAoZWwuY3JlYXRlVGV4dFJhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZSA9IGVsLmNyZWF0ZVRleHRSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcclxuICAgICAgICAgICAgICAgIGxlbiA9IHRoaXMuc2VhcmNoLnZhbCgpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKGxlbiwgbGVuKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZXMgc2VhcmNoJ3MgdmFsdWUgd2l0aCBuZXh0U2VhcmNoVGVybSAoaWYgZGVmaW5lZCBieSB1c2VyKVxyXG4gICAgICAgICAgICAvLyBpZ25vcmUgbmV4dFNlYXJjaFRlcm0gaWYgdGhlIGRyb3Bkb3duIGlzIG9wZW5lZCBieSB0aGUgdXNlciBwcmVzc2luZyBhIGxldHRlclxyXG4gICAgICAgICAgICBpZih0aGlzLnNlYXJjaC52YWwoKSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5uZXh0U2VhcmNoVGVybSAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnZhbCh0aGlzLm5leHRTZWFyY2hUZXJtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5zZWxlY3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSkudmFsKFwiXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHModHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItb3BlblwiKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uIChwYXJhbXMpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmNsb3NlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcblxyXG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge2ZvY3VzOiB0cnVlfTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBmb2N1czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBpc0ZvY3VzZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIuZm9jdXMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgJChcImxhYmVsW2Zvcj0nXCIgKyB0aGlzLmZvY3Vzc2VyLmF0dHIoJ2lkJykgKyBcIiddXCIpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGluaXRDb250YWluZXI6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duID0gdGhpcy5kcm9wZG93bjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMubWluaW11bVJlc3VsdHNGb3JTZWFyY2ggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTZWFyY2goZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbiA9IGNvbnRhaW5lci5maW5kKFwiLnNlbGVjdDItY2hvaWNlXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3NlciA9IGNvbnRhaW5lci5maW5kKFwiLnNlbGVjdDItZm9jdXNzZXJcIik7XHJcblxyXG4gICAgICAgICAgICAvLyByZXdyaXRlIGxhYmVscyBmcm9tIG9yaWdpbmFsIGVsZW1lbnQgdG8gZm9jdXNzZXJcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5hdHRyKFwiaWRcIiwgXCJzMmlkX2F1dG9nZW5cIituZXh0VWlkKCkpO1xyXG5cclxuICAgICAgICAgICAgJChcImxhYmVsW2Zvcj0nXCIgKyB0aGlzLm9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIikgKyBcIiddXCIpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgdGhpcy5mb2N1c3Nlci5hdHRyKCdpZCcpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIuYXR0cihcInRhYmluZGV4XCIsIHRoaXMuZWxlbWVudFRhYkluZGV4KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLm9uKFwia2V5ZG93blwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSBLRVkuUEFHRV9VUCB8fCBlLndoaWNoID09PSBLRVkuUEFHRV9ET1dOKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCB0aGUgcGFnZSBmcm9tIHNjcm9sbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChlLndoaWNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuVVA6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuRE9XTjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0KChlLndoaWNoID09PSBLRVkuVVApID8gLTEgOiAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuRU5URVI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SGlnaGxpZ2h0ZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuVEFCOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzZWxlY3RPbkJsdXIgPT0gdHJ1ZSwgc2VsZWN0IHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuc2VsZWN0T25CbHVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkKHtub0ZvY3VzOiB0cnVlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkVTQzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWwoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5vbihcImJsdXJcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGEgd29ya2Fyb3VuZCBmb3IgY2hyb21lIHRvIGtlZXAgdGhlIHNlYXJjaCBmaWVsZCBmb2N1c3NlZCB3aGVuIHRoZSBzY3JvbGwgYmFyIGlzIHVzZWQgdG8gc2Nyb2xsIHRoZSBkcm9wZG93bi5cclxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcyB0aGUgc2VhcmNoIGZpZWxkIGxvc2VzIGZvY3VzIHdoaWNoIGlzIGFubm95aW5nXHJcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5ib2R5KCkuZ2V0KDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5iaW5kKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLCAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5vbihcImtleWRvd25cIiwgdGhpcy5iaW5kKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gS0VZLlRBQiB8fCBLRVkuaXNDb250cm9sKGUpIHx8IEtFWS5pc0Z1bmN0aW9uS2V5KGUpIHx8IGUud2hpY2ggPT09IEtFWS5FU0MpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5vcGVuT25FbnRlciA9PT0gZmFsc2UgJiYgZS53aGljaCA9PT0gS0VZLkVOVEVSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PSBLRVkuRE9XTiB8fCBlLndoaWNoID09IEtFWS5VUFxyXG4gICAgICAgICAgICAgICAgICAgIHx8IChlLndoaWNoID09IEtFWS5FTlRFUiAmJiB0aGlzLm9wdHMub3Blbk9uRW50ZXIpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmFsdEtleSB8fCBlLmN0cmxLZXkgfHwgZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PSBLRVkuREVMRVRFIHx8IGUud2hpY2ggPT0gS0VZLkJBQ0tTUEFDRSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYWxsb3dDbGVhcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcblxyXG4gICAgICAgICAgICBpbnN0YWxsS2V5VXBDaGFuZ2VFdmVudCh0aGlzLmZvY3Vzc2VyKTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5vbihcImtleXVwLWNoYW5nZSBpbnB1dFwiLCB0aGlzLmJpbmQoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVuZWQoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3Rpb24ub24oXCJtb3VzZWRvd25cIiwgXCJhYmJyXCIsIHRoaXMuYmluZChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICBraWxsRXZlbnRJbW1lZGlhdGVseShlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5vbihcIm1vdXNlZG93blwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1mb2N1c1wiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIGRyb3Bkb3duLm9uKFwibW91c2Vkb3duXCIsIHRoaXMuYmluZChmdW5jdGlvbigpIHsgdGhpcy5zZWFyY2guZm9jdXMoKTsgfSkpO1xyXG5cclxuICAgICAgICAgICAgc2VsZWN0aW9uLm9uKFwiZm9jdXNcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5vbihcImZvY3VzXCIsIHRoaXMuYmluZChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItZm9jdXNcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgIH0pKS5vbihcImJsdXJcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1ibHVyXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5vbihcImZvY3VzXCIsIHRoaXMuYmluZChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItZm9jdXNcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRhaW5lcldpZHRoKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LmFkZENsYXNzKFwic2VsZWN0Mi1vZmZzY3JlZW5cIik7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcclxuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKHRyaWdnZXJDaGFuZ2UpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGE9dGhpcy5zZWxlY3Rpb24uZGF0YShcInNlbGVjdDItZGF0YVwiKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEpIHsgLy8gZ3VhcmQgYWdhaW5zdCBxdWV1ZWQgcXVpY2sgY29uc2VjdXRpdmUgY2xpY2tzXHJcbiAgICAgICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXJPcHRpb24gPSB0aGlzLmdldFBsYWNlaG9sZGVyT3B0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC52YWwocGxhY2Vob2xkZXJPcHRpb24gPyBwbGFjZWhvbGRlck9wdGlvbi52YWwoKSA6IFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLWNob3NlblwiKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVtb3ZlRGF0YShcInNlbGVjdDItZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSAhPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoeyB0eXBlOiBcInNlbGVjdDItcmVtb3ZlZFwiLCB2YWw6IHRoaXMuaWQoZGF0YSksIGNob2ljZTogZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDaGFuZ2Uoe3JlbW92ZWQ6ZGF0YX0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2V0cyBzZWxlY3Rpb24gYmFzZWQgb24gc291cmNlIGVsZW1lbnQncyB2YWx1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGluaXRTZWxlY3Rpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1BsYWNlaG9sZGVyT3B0aW9uU2VsZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24obnVsbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuaW5pdFNlbGVjdGlvbi5jYWxsKG51bGwsIHRoaXMub3B0cy5lbGVtZW50LCBmdW5jdGlvbihzZWxlY3RlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVTZWxlY3Rpb24oc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0UGxhY2Vob2xkZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGlzUGxhY2Vob2xkZXJPcHRpb25TZWxlY3RlZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBwbGFjZWhvbGRlck9wdGlvbjtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdHMucGxhY2Vob2xkZXIpIHJldHVybiBmYWxzZTsgLy8gbm8gcGxhY2Vob2xkZXIgc3BlY2lmaWVkIHNvIG5vIG9wdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZFxyXG4gICAgICAgICAgICByZXR1cm4gKChwbGFjZWhvbGRlck9wdGlvbiA9IHRoaXMuZ2V0UGxhY2Vob2xkZXJPcHRpb24oKSkgIT09IHVuZGVmaW5lZCAmJiBwbGFjZWhvbGRlck9wdGlvbi5pcygnOnNlbGVjdGVkJykpXHJcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5vcHRzLmVsZW1lbnQudmFsKCkgPT09IFwiXCIpXHJcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5vcHRzLmVsZW1lbnQudmFsKCkgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLm9wdHMuZWxlbWVudC52YWwoKSA9PT0gbnVsbCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgcHJlcGFyZU9wdHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG9wdHMgPSB0aGlzLnBhcmVudC5wcmVwYXJlT3B0cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxyXG4gICAgICAgICAgICAgICAgc2VsZj10aGlzO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wdHMuZWxlbWVudC5nZXQoMCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbnN0YWxsIHRoZSBzZWxlY3Rpb24gaW5pdGlhbGl6ZXJcclxuICAgICAgICAgICAgICAgIG9wdHMuaW5pdFNlbGVjdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IGVsZW1lbnQuZmluZChcIjpzZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBhIHNpbmdsZSBzZWxlY3QgYm94IGFsd2F5cyBoYXMgYSB2YWx1ZSwgbm8gbmVlZCB0byBudWxsIGNoZWNrICdzZWxlY3RlZCdcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmLm9wdGlvblRvRGF0YShzZWxlY3RlZCkpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChcImRhdGFcIiBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbnN0YWxsIGRlZmF1bHQgaW5pdFNlbGVjdGlvbiB3aGVuIGFwcGxpZWQgdG8gaGlkZGVuIGlucHV0IGFuZCBkYXRhIGlzIGxvY2FsXHJcbiAgICAgICAgICAgICAgICBvcHRzLmluaXRTZWxlY3Rpb24gPSBvcHRzLmluaXRTZWxlY3Rpb24gfHwgZnVuY3Rpb24gKGVsZW1lbnQsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gZWxlbWVudC52YWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXJjaCBpbiBkYXRhIGJ5IGlkLCBzdG9yaW5nIHRoZSBhY3R1YWwgbWF0Y2hpbmcgaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXI6IGZ1bmN0aW9uKHRlcm0sIHRleHQsIGVsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc19tYXRjaCA9IGVxdWFsKGlkLCBvcHRzLmlkKGVsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfbWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGVsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzX21hdGNoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogISQuaXNGdW5jdGlvbihjYWxsYmFjaykgPyAkLm5vb3AgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1hdGNoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG9wdHM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgZ2V0UGxhY2Vob2xkZXI6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAvLyBpZiBhIHBsYWNlaG9sZGVyIGlzIHNwZWNpZmllZCBvbiBhIHNpbmdsZSBzZWxlY3Qgd2l0aG91dCBhIHZhbGlkIHBsYWNlaG9sZGVyIG9wdGlvbiBpZ25vcmUgaXRcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRQbGFjZWhvbGRlck9wdGlvbigpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UGxhY2Vob2xkZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBzZXRQbGFjZWhvbGRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1BsYWNlaG9sZGVyT3B0aW9uU2VsZWN0ZWQoKSAmJiBwbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGEgcGxhY2Vob2xkZXIgb3B0aW9uIGlmIGF0dGFjaGVkIHRvIGEgc2VsZWN0XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QgJiYgdGhpcy5nZXRQbGFjZWhvbGRlck9wdGlvbigpID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItY2hvc2VuXCIpLmh0bWwodGhpcy5vcHRzLmVzY2FwZU1hcmt1cChwbGFjZWhvbGRlcikpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmFkZENsYXNzKFwic2VsZWN0Mi1kZWZhdWx0XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1hbGxvd2NsZWFyXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgcG9zdHByb2Nlc3NSZXN1bHRzOiBmdW5jdGlvbiAoZGF0YSwgaW5pdGlhbCwgbm9IaWdobGlnaHRVcGRhdGUpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gMCwgc2VsZiA9IHRoaXMsIHNob3dTZWFyY2hJbnB1dCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAvLyBmaW5kIHRoZSBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSByZXN1bHQgbGlzdFxyXG5cclxuICAgICAgICAgICAgdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKS5lYWNoMihmdW5jdGlvbiAoaSwgZWxtKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXF1YWwoc2VsZi5pZChlbG0uZGF0YShcInNlbGVjdDItZGF0YVwiKSksIHNlbGYub3B0cy5lbGVtZW50LnZhbCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gYW5kIGhpZ2hsaWdodCBpdFxyXG4gICAgICAgICAgICBpZiAobm9IaWdobGlnaHRVcGRhdGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbCA9PT0gdHJ1ZSAmJiBzZWxlY3RlZCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHQoc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodCgwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gaGlkZSB0aGUgc2VhcmNoIGJveCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB3ZSBnb3QgdGhlIHJlc3VsdHMgYW5kIHRoZXJlIGFyZSBlbm91Z2ggb2YgdGhlbSBmb3Igc2VhcmNoXHJcblxyXG4gICAgICAgICAgICBpZiAoaW5pdGlhbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1pbiA9IHRoaXMub3B0cy5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaDtcclxuICAgICAgICAgICAgICAgIGlmIChtaW4gPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NlYXJjaChjb3VudFJlc3VsdHMoZGF0YS5yZXN1bHRzKSA+PSBtaW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgc2hvd1NlYXJjaDogZnVuY3Rpb24oc2hvd1NlYXJjaElucHV0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dTZWFyY2hJbnB1dCA9PT0gc2hvd1NlYXJjaElucHV0KSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNob3dTZWFyY2hJbnB1dCA9IHNob3dTZWFyY2hJbnB1dDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uZmluZChcIi5zZWxlY3QyLXNlYXJjaFwiKS50b2dnbGVDbGFzcyhcInNlbGVjdDItc2VhcmNoLWhpZGRlblwiLCAhc2hvd1NlYXJjaElucHV0KTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5maW5kKFwiLnNlbGVjdDItc2VhcmNoXCIpLnRvZ2dsZUNsYXNzKFwic2VsZWN0Mi1vZmZzY3JlZW5cIiwgIXNob3dTZWFyY2hJbnB1dCk7XHJcbiAgICAgICAgICAgIC8vYWRkIFwic2VsZWN0Mi13aXRoLXNlYXJjaGJveFwiIHRvIHRoZSBjb250YWluZXIgaWYgc2VhcmNoIGJveCBpcyBzaG93blxyXG4gICAgICAgICAgICAkKHRoaXMuZHJvcGRvd24sIHRoaXMuY29udGFpbmVyKS50b2dnbGVDbGFzcyhcInNlbGVjdDItd2l0aC1zZWFyY2hib3hcIiwgc2hvd1NlYXJjaElucHV0KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gKGRhdGEsIG9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy50cmlnZ2VyU2VsZWN0KGRhdGEpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgdmFyIG9sZCA9IHRoaXMub3B0cy5lbGVtZW50LnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgb2xkRGF0YSA9IHRoaXMuZGF0YSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudmFsKHRoaXMuaWQoZGF0YSkpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihkYXRhKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoeyB0eXBlOiBcInNlbGVjdDItc2VsZWN0ZWRcIiwgdmFsOiB0aGlzLmlkKGRhdGEpLCBjaG9pY2U6IGRhdGEgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5leHRTZWFyY2hUZXJtID0gdGhpcy5vcHRzLm5leHRTZWFyY2hUZXJtKGRhdGEsIHRoaXMuc2VhcmNoLnZhbCgpKTtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm5vRm9jdXMpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFlcXVhbChvbGQsIHRoaXMuaWQoZGF0YSkpKSB7IHRoaXMudHJpZ2dlckNoYW5nZSh7YWRkZWQ6ZGF0YSxyZW1vdmVkOm9sZERhdGF9KTsgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIHVwZGF0ZVNlbGVjdGlvbjogZnVuY3Rpb24gKGRhdGEpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXI9dGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLWNob3NlblwiKSwgZm9ybWF0dGVkLCBjc3NDbGFzcztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRhdGEoXCJzZWxlY3QyLWRhdGFcIiwgZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBjb250YWluZXIuZW1wdHkoKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdHRlZD10aGlzLm9wdHMuZm9ybWF0U2VsZWN0aW9uKGRhdGEsIGNvbnRhaW5lciwgdGhpcy5vcHRzLmVzY2FwZU1hcmt1cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGZvcm1hdHRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kKGZvcm1hdHRlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3NzQ2xhc3M9dGhpcy5vcHRzLmZvcm1hdFNlbGVjdGlvbkNzc0NsYXNzKGRhdGEsIGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmIChjc3NDbGFzcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkQ2xhc3MoY3NzQ2xhc3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZW1vdmVDbGFzcyhcInNlbGVjdDItZGVmYXVsdFwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYWxsb3dDbGVhciAmJiB0aGlzLmdldFBsYWNlaG9sZGVyKCkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWFsbG93Y2xlYXJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICB2YWw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHZhbCxcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJDaGFuZ2UgPSBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGEgPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgc2VsZiA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBvbGREYXRhID0gdGhpcy5kYXRhKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0cy5lbGVtZW50LnZhbCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YWwgPSBhcmd1bWVudHNbMF07XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJDaGFuZ2UgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAudmFsKHZhbClcclxuICAgICAgICAgICAgICAgICAgICAuZmluZChcIjpzZWxlY3RlZFwiKS5lYWNoMihmdW5jdGlvbiAoaSwgZWxtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLm9wdGlvblRvRGF0YShlbG0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHthZGRlZDogZGF0YSwgcmVtb3ZlZDpvbGREYXRhfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB2YWwgaXMgYW4gaWQuICF2YWwgaXMgdHJ1ZSBmb3IgW3VuZGVmaW5lZCxudWxsLCcnLDBdIC0gMCBpcyBsZWdhbFxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWwgJiYgdmFsICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhcih0cmlnZ2VyQ2hhbmdlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLmluaXRTZWxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbm5vdCBjYWxsIHZhbCgpIGlmIGluaXRTZWxlY3Rpb24oKSBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnZhbCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmluaXRTZWxlY3Rpb24odGhpcy5vcHRzLmVsZW1lbnQsIGZ1bmN0aW9uKGRhdGEpe1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYub3B0cy5lbGVtZW50LnZhbCghZGF0YSA/IFwiXCIgOiBzZWxmLmlkKGRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVNlbGVjdGlvbihkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyQ2hhbmdlKHthZGRlZDogZGF0YSwgcmVtb3ZlZDpvbGREYXRhfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBjbGVhclNlYXJjaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwoXCJcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIudmFsKFwiXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGRhdGE6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhLFxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLnNlbGVjdGlvbi5kYXRhKFwic2VsZWN0Mi1kYXRhXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gdW5kZWZpbmVkKSBkYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZSA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKHRyaWdnZXJDaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudmFsKCF2YWx1ZSA/IFwiXCIgOiB0aGlzLmlkKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh7YWRkZWQ6IHZhbHVlLCByZW1vdmVkOmRhdGF9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBNdWx0aVNlbGVjdDIgPSBjbGF6eihBYnN0cmFjdFNlbGVjdDIsIHtcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjcmVhdGVDb250YWluZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuYXR0cih7XHJcbiAgICAgICAgICAgICAgICBcImNsYXNzXCI6IFwic2VsZWN0Mi1jb250YWluZXIgc2VsZWN0Mi1jb250YWluZXItbXVsdGlcIlxyXG4gICAgICAgICAgICB9KS5odG1sKFtcclxuICAgICAgICAgICAgICAgIFwiPHVsIGNsYXNzPSdzZWxlY3QyLWNob2ljZXMnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgIDxsaSBjbGFzcz0nc2VsZWN0Mi1zZWFyY2gtZmllbGQnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICAgPGlucHV0IHR5cGU9J3RleHQnIGF1dG9jb21wbGV0ZT0nb2ZmJyBhdXRvY29ycmVjdD0nb2ZmJyBhdXRvY2FwaXRhbGl6ZT0nb2ZmJyBzcGVsbGNoZWNrPSdmYWxzZScgY2xhc3M9J3NlbGVjdDItaW5wdXQnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgIDwvbGk+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjwvdWw+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjxkaXYgY2xhc3M9J3NlbGVjdDItZHJvcCBzZWxlY3QyLWRyb3AtbXVsdGkgc2VsZWN0Mi1kaXNwbGF5LW5vbmUnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8dWwgY2xhc3M9J3NlbGVjdDItcmVzdWx0cyc+XCIsXHJcbiAgICAgICAgICAgICAgICBcIiAgIDwvdWw+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjwvZGl2PlwiXS5qb2luKFwiXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHByZXBhcmVPcHRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBvcHRzID0gdGhpcy5wYXJlbnQucHJlcGFyZU9wdHMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcclxuICAgICAgICAgICAgICAgIHNlbGY9dGhpcztcclxuXHJcbiAgICAgICAgICAgIC8vIFRPRE8gdmFsaWRhdGUgcGxhY2Vob2xkZXIgaXMgYSBzdHJpbmcgaWYgc3BlY2lmaWVkXHJcblxyXG4gICAgICAgICAgICBpZiAob3B0cy5lbGVtZW50LmdldCgwKS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2VsZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIGluc3RhbGwgc3RoZSBzZWxlY3Rpb24gaW5pdGlhbGl6ZXJcclxuICAgICAgICAgICAgICAgIG9wdHMuaW5pdFNlbGVjdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBjYWxsYmFjaykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbmQoXCI6c2VsZWN0ZWRcIikuZWFjaDIoZnVuY3Rpb24gKGksIGVsbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goc2VsZi5vcHRpb25Ub0RhdGEoZWxtKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwiZGF0YVwiIGluIG9wdHMpIHtcclxuICAgICAgICAgICAgICAgIC8vIGluc3RhbGwgZGVmYXVsdCBpbml0U2VsZWN0aW9uIHdoZW4gYXBwbGllZCB0byBoaWRkZW4gaW5wdXQgYW5kIGRhdGEgaXMgbG9jYWxcclxuICAgICAgICAgICAgICAgIG9wdHMuaW5pdFNlbGVjdGlvbiA9IG9wdHMuaW5pdFNlbGVjdGlvbiB8fCBmdW5jdGlvbiAoZWxlbWVudCwgY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWRzID0gc3BsaXRWYWwoZWxlbWVudC52YWwoKSwgb3B0cy5zZXBhcmF0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VhcmNoIGluIGRhdGEgYnkgYXJyYXkgb2YgaWRzLCBzdG9yaW5nIG1hdGNoaW5nIGl0ZW1zIGluIGEgbGlzdFxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXI6IGZ1bmN0aW9uKHRlcm0sIHRleHQsIGVsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc19tYXRjaCA9ICQuZ3JlcChpZHMsIGZ1bmN0aW9uKGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxdWFsKGlkLCBvcHRzLmlkKGVsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfbWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzX21hdGNoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogISQuaXNGdW5jdGlvbihjYWxsYmFjaykgPyAkLm5vb3AgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlb3JkZXIgbWF0Y2hlcyBiYXNlZCBvbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIGlkcyBhcnJheSBiZWNhdXNlIHJpZ2h0IG5vd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIGRhdGEgYXJyYXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlcmVkID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGlkc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hdGNoZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hlc1tqXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVxdWFsKGlkLCBvcHRzLmlkKG1hdGNoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQucHVzaChtYXRjaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnNwbGljZShqLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sob3JkZXJlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvcHRzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNlbGVjdENob2ljZTogZnVuY3Rpb24gKGNob2ljZSkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5jb250YWluZXIuZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIik7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggJiYgY2hvaWNlICYmIGNob2ljZVswXSA9PSBzZWxlY3RlZFswXSkge1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKFwiY2hvaWNlLWRlc2VsZWN0ZWRcIiwgc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hvaWNlICYmIGNob2ljZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hvaWNlLmFkZENsYXNzKFwic2VsZWN0Mi1zZWFyY2gtY2hvaWNlLWZvY3VzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoXCJjaG9pY2Utc2VsZWN0ZWRcIiwgY2hvaWNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICQoXCJsYWJlbFtmb3I9J1wiICsgdGhpcy5zZWFyY2guYXR0cignaWQnKSArIFwiJ11cIilcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCB0aGlzLm9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIikpO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBpbml0Q29udGFpbmVyOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBcIi5zZWxlY3QyLWNob2ljZXNcIiwgc2VsZWN0aW9uO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWZpZWxkXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbiA9IHRoaXMuY29udGFpbmVyLmZpbmQoc2VsZWN0b3IpO1xyXG5cclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ub24oXCJjbGlja1wiLCBcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2VcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIC8va2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2VhcmNoWzBdLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5zZWxlY3RDaG9pY2UoJCh0aGlzKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gcmV3cml0ZSBsYWJlbHMgZnJvbSBvcmlnaW5hbCBlbGVtZW50IHRvIGZvY3Vzc2VyXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLmF0dHIoXCJpZFwiLCBcInMyaWRfYXV0b2dlblwiK25leHRVaWQoKSk7XHJcbiAgICAgICAgICAgICQoXCJsYWJlbFtmb3I9J1wiICsgdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpICsgXCInXVwiKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2ZvcicsIHRoaXMuc2VhcmNoLmF0dHIoJ2lkJykpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gub24oXCJpbnB1dCBwYXN0ZVwiLCB0aGlzLmJpbmQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5hdHRyKFwidGFiaW5kZXhcIiwgdGhpcy5lbGVtZW50VGFiSW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5rZXlkb3ducyA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLm9uKFwia2V5ZG93blwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICsrdGhpcy5rZXlkb3ducztcclxuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZS1mb2N1c1wiKTtcclxuICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gc2VsZWN0ZWQucHJldihcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2U6bm90KC5zZWxlY3QyLWxvY2tlZClcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IHNlbGVjdGVkLm5leHQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlOm5vdCguc2VsZWN0Mi1sb2NrZWQpXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IGdldEN1cnNvckluZm8odGhpcy5zZWFyY2gpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggJiZcclxuICAgICAgICAgICAgICAgICAgICAoZS53aGljaCA9PSBLRVkuTEVGVCB8fCBlLndoaWNoID09IEtFWS5SSUdIVCB8fCBlLndoaWNoID09IEtFWS5CQUNLU1BBQ0UgfHwgZS53aGljaCA9PSBLRVkuREVMRVRFIHx8IGUud2hpY2ggPT0gS0VZLkVOVEVSKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZENob2ljZSA9IHNlbGVjdGVkO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09IEtFWS5MRUZUICYmIHByZXYubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hvaWNlID0gcHJldjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZS53aGljaCA9PSBLRVkuUklHSFQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBuZXh0Lmxlbmd0aCA/IG5leHQgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlLndoaWNoID09PSBLRVkuQkFDS1NQQUNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3Qoc2VsZWN0ZWQuZmlyc3QoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKDEwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBwcmV2Lmxlbmd0aCA/IHByZXYgOiBuZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS53aGljaCA9PSBLRVkuREVMRVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3Qoc2VsZWN0ZWQuZmlyc3QoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKDEwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBuZXh0Lmxlbmd0aCA/IG5leHQgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS53aGljaCA9PSBLRVkuRU5URVIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDaG9pY2Uoc2VsZWN0ZWRDaG9pY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkQ2hvaWNlIHx8ICFzZWxlY3RlZENob2ljZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKChlLndoaWNoID09PSBLRVkuQkFDS1NQQUNFICYmIHRoaXMua2V5ZG93bnMgPT0gMSlcclxuICAgICAgICAgICAgICAgICAgICB8fCBlLndoaWNoID09IEtFWS5MRUZUKSAmJiAocG9zLm9mZnNldCA9PSAwICYmICFwb3MubGVuZ3RoKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENob2ljZShzZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2U6bm90KC5zZWxlY3QyLWxvY2tlZClcIikubGFzdCgpKTtcclxuICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENob2ljZShudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS53aGljaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLlVQOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkRPV046XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZUhpZ2hsaWdodCgoZS53aGljaCA9PT0gS0VZLlVQKSA/IC0xIDogMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkVOVEVSOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLlRBQjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2VsZWN0T25CbHVyID09IHRydWUsIHNlbGVjdCB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLnNlbGVjdE9uQmx1cikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RIaWdobGlnaHRlZCh7bm9Gb2N1czp0cnVlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuRVNDOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSBLRVkuVEFCIHx8IEtFWS5pc0NvbnRyb2woZSkgfHwgS0VZLmlzRnVuY3Rpb25LZXkoZSlcclxuICAgICAgICAgICAgICAgICB8fCBlLndoaWNoID09PSBLRVkuQkFDS1NQQUNFIHx8IGUud2hpY2ggPT09IEtFWS5FU0MpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IEtFWS5FTlRFUikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMub3Blbk9uRW50ZXIgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuYWx0S2V5IHx8IGUuY3RybEtleSB8fCBlLnNoaWZ0S2V5IHx8IGUubWV0YUtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSBLRVkuUEFHRV9VUCB8fCBlLndoaWNoID09PSBLRVkuUEFHRV9ET1dOKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCB0aGUgcGFnZSBmcm9tIHNjcm9sbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gS0VZLkVOVEVSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBmb3JtIGZyb20gYmVpbmcgc3VibWl0dGVkXHJcbiAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gub24oXCJrZXl1cFwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMua2V5ZG93bnMgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVTZWFyY2goKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLm9uKFwiYmx1clwiLCB0aGlzLmJpbmQoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5yZW1vdmVDbGFzcyhcInNlbGVjdDItZm9jdXNlZFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2hvaWNlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1ibHVyXCIpKTtcclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIub24oXCJjbGlja1wiLCBzZWxlY3RvciwgdGhpcy5iaW5kKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGlmICgkKGUudGFyZ2V0KS5jbG9zZXN0KFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2tlZCBpbnNpZGUgYSBzZWxlY3QyIHNlYXJjaCBjaG9pY2UsIGRvIG5vdCBvcGVuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDaG9pY2UobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyUGxhY2Vob2xkZXIoKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250YWluZXIuaGFzQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKCQuRXZlbnQoXCJzZWxlY3QyLWZvY3VzXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c1NlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5vbihcImZvY3VzXCIsIHNlbGVjdG9yLCB0aGlzLmJpbmQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1mb2N1c1wiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRhaW5lcldpZHRoKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LmFkZENsYXNzKFwic2VsZWN0Mi1vZmZzY3JlZW5cIik7XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIHBsYWNlaG9sZGVyIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBlbmFibGVJbnRlcmZhY2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQuZW5hYmxlSW50ZXJmYWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnByb3AoXCJkaXNhYmxlZFwiLCAhdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGluaXRTZWxlY3Rpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZWxlbWVudC52YWwoKSA9PT0gXCJcIiAmJiB0aGlzLm9wdHMuZWxlbWVudC50ZXh0KCkgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKFtdKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgcGxhY2Vob2xkZXIgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0IHx8IHRoaXMub3B0cy5lbGVtZW50LnZhbCgpICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuaW5pdFNlbGVjdGlvbi5jYWxsKG51bGwsIHRoaXMub3B0cy5lbGVtZW50LCBmdW5jdGlvbihkYXRhKXtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVTZWxlY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBwbGFjZWhvbGRlciBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjbGVhclNlYXJjaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyKCksXHJcbiAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IHRoaXMuZ2V0TWF4U2VhcmNoV2lkdGgoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkICAmJiB0aGlzLmdldFZhbCgpLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnNlYXJjaC5oYXNDbGFzcyhcInNlbGVjdDItZm9jdXNlZFwiKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnZhbChwbGFjZWhvbGRlcikuYWRkQ2xhc3MoXCJzZWxlY3QyLWRlZmF1bHRcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBzdHJldGNoIHRoZSBzZWFyY2ggYm94IHRvIGZ1bGwgd2lkdGggb2YgdGhlIGNvbnRhaW5lciBzbyBhcyBtdWNoIG9mIHRoZSBwbGFjZWhvbGRlciBpcyB2aXNpYmxlIGFzIHBvc3NpYmxlXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBjb3VsZCBjYWxsIHRoaXMucmVzaXplU2VhcmNoKCksIGJ1dCB3ZSBkbyBub3QgYmVjYXVzZSB0aGF0IHJlcXVpcmVzIGEgc2l6ZXIgYW5kIHdlIGRvIG5vdCB3YW50IHRvIGNyZWF0ZSBvbmUgc28gZWFybHkgYmVjYXVzZSBvZiBhIGZpcmVmb3ggYnVnLCBzZWUgIzk0NFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gud2lkdGgobWF4V2lkdGggPiAwID8gbWF4V2lkdGggOiB0aGlzLmNvbnRhaW5lci5jc3MoXCJ3aWR0aFwiKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwoXCJcIikud2lkdGgoMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjbGVhclBsYWNlaG9sZGVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaC5oYXNDbGFzcyhcInNlbGVjdDItZGVmYXVsdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gudmFsKFwiXCIpLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1kZWZhdWx0XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBvcGVuaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJQbGFjZWhvbGRlcigpOyAvLyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgc3VwZXIgc28gcGxhY2Vob2xkZXIgaXMgbm90IHVzZWQgdG8gc2VhcmNoXHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplU2VhcmNoKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5vcGVuaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHModHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItb3BlblwiKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjbG9zZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMub3BlbmVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuY2xvc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGZvY3VzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2guZm9jdXMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGlzRm9jdXNlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2guaGFzQ2xhc3MoXCJzZWxlY3QyLWZvY3VzZWRcIik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICB1cGRhdGVTZWxlY3Rpb246IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciBpZHMgPSBbXSwgZmlsdGVyZWQgPSBbXSwgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXNcclxuICAgICAgICAgICAgJChkYXRhKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleE9mKHNlbGYuaWQodGhpcyksIGlkcykgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2goc2VsZi5pZCh0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQucHVzaCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRhdGEgPSBmaWx0ZXJlZDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZpbmQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKGRhdGEpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5hZGRTZWxlY3RlZENob2ljZSh0aGlzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHNlbGYucG9zdHByb2Nlc3NSZXN1bHRzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICB0b2tlbml6ZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IHRoaXMuc2VhcmNoLnZhbCgpO1xyXG4gICAgICAgICAgICBpbnB1dCA9IHRoaXMub3B0cy50b2tlbml6ZXIuY2FsbCh0aGlzLCBpbnB1dCwgdGhpcy5kYXRhKCksIHRoaXMuYmluZCh0aGlzLm9uU2VsZWN0KSwgdGhpcy5vcHRzKTtcclxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwoaW5wdXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykge1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyaWdnZXJTZWxlY3QoZGF0YSkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2hvaWNlKGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcih7IHR5cGU6IFwic2VsZWN0ZWRcIiwgdmFsOiB0aGlzLmlkKGRhdGEpLCBjaG9pY2U6IGRhdGEgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QgfHwgIXRoaXMub3B0cy5jbG9zZU9uU2VsZWN0KSB0aGlzLnBvc3Rwcm9jZXNzUmVzdWx0cyhkYXRhLCBmYWxzZSwgdGhpcy5vcHRzLmNsb3NlT25TZWxlY3Q9PT10cnVlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuY2xvc2VPblNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gud2lkdGgoMTApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY291bnRTZWxlY3RhYmxlUmVzdWx0cygpPjApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC53aWR0aCgxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemVTZWFyY2goKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRNYXhpbXVtU2VsZWN0aW9uU2l6ZSgpID4gMCAmJiB0aGlzLnZhbCgpLmxlbmd0aCA+PSB0aGlzLmdldE1heGltdW1TZWxlY3Rpb25TaXplKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgcmVhY2hlZCBtYXggc2VsZWN0aW9uIHNpemUgcmVwYWludCB0aGUgcmVzdWx0cyBzbyBjaG9pY2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBtYXggc2VsZWN0aW9uIHJlYWNoZWQgbWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHModHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25Ecm9wZG93bigpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIGxlZnQgdG8gc2VsZWN0IGNsb3NlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKDEwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc2luY2UgaXRzIG5vdCBwb3NzaWJsZSB0byBzZWxlY3QgYW4gZWxlbWVudCB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cclxuICAgICAgICAgICAgLy8gYWRkZWQgd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBpcyBhIG5ldyBlbGVtZW50IGJlZm9yZSBmaXJpbmcgY2hhbmdlXHJcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh7IGFkZGVkOiBkYXRhIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm5vRm9jdXMpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgYWRkU2VsZWN0ZWRDaG9pY2U6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciBlbmFibGVDaG9pY2UgPSAhZGF0YS5sb2NrZWQsXHJcbiAgICAgICAgICAgICAgICBlbmFibGVkSXRlbSA9ICQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8bGkgY2xhc3M9J3NlbGVjdDItc2VhcmNoLWNob2ljZSc+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiICAgIDxkaXY+PC9kaXY+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiICAgIDxhIGhyZWY9JyMnIG9uY2xpY2s9J3JldHVybiBmYWxzZTsnIGNsYXNzPSdzZWxlY3QyLXNlYXJjaC1jaG9pY2UtY2xvc2UnIHRhYmluZGV4PSctMSc+PC9hPlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIjwvbGk+XCIpLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWRJdGVtID0gJChcclxuICAgICAgICAgICAgICAgICAgICBcIjxsaSBjbGFzcz0nc2VsZWN0Mi1zZWFyY2gtY2hvaWNlIHNlbGVjdDItbG9ja2VkJz5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8ZGl2PjwvZGl2PlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICB2YXIgY2hvaWNlID0gZW5hYmxlQ2hvaWNlID8gZW5hYmxlZEl0ZW0gOiBkaXNhYmxlZEl0ZW0sXHJcbiAgICAgICAgICAgICAgICBpZCA9IHRoaXMuaWQoZGF0YSksXHJcbiAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLmdldFZhbCgpLFxyXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkLFxyXG4gICAgICAgICAgICAgICAgY3NzQ2xhc3M7XHJcblxyXG4gICAgICAgICAgICBmb3JtYXR0ZWQ9dGhpcy5vcHRzLmZvcm1hdFNlbGVjdGlvbihkYXRhLCBjaG9pY2UuZmluZChcImRpdlwiKSwgdGhpcy5vcHRzLmVzY2FwZU1hcmt1cCk7XHJcbiAgICAgICAgICAgIGlmIChmb3JtYXR0ZWQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjaG9pY2UuZmluZChcImRpdlwiKS5yZXBsYWNlV2l0aChcIjxkaXY+XCIrZm9ybWF0dGVkK1wiPC9kaXY+XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNzc0NsYXNzPXRoaXMub3B0cy5mb3JtYXRTZWxlY3Rpb25Dc3NDbGFzcyhkYXRhLCBjaG9pY2UuZmluZChcImRpdlwiKSk7XHJcbiAgICAgICAgICAgIGlmIChjc3NDbGFzcyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNob2ljZS5hZGRDbGFzcyhjc3NDbGFzcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmKGVuYWJsZUNob2ljZSl7XHJcbiAgICAgICAgICAgICAgY2hvaWNlLmZpbmQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlLWNsb3NlXCIpXHJcbiAgICAgICAgICAgICAgICAgIC5vbihcIm1vdXNlZG93blwiLCBraWxsRXZlbnQpXHJcbiAgICAgICAgICAgICAgICAgIC5vbihcImNsaWNrIGRibGNsaWNrXCIsIHRoaXMuYmluZChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLmNsb3Nlc3QoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlXCIpLmZhZGVPdXQoJ2Zhc3QnLCB0aGlzLmJpbmQoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3QoJChlLnRhcmdldCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIikucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0pKS5kZXF1ZXVlKCk7XHJcbiAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICB9KSkub24oXCJmb2N1c1wiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hvaWNlLmRhdGEoXCJzZWxlY3QyLWRhdGFcIiwgZGF0YSk7XHJcbiAgICAgICAgICAgIGNob2ljZS5pbnNlcnRCZWZvcmUodGhpcy5zZWFyY2hDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgdmFsLnB1c2goaWQpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFZhbCh2YWwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgdW5zZWxlY3Q6IGZ1bmN0aW9uIChzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWwoKSxcclxuICAgICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgICBpbmRleDtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQuY2xvc2VzdChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2VcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBcIkludmFsaWQgYXJndW1lbnQ6IFwiICsgc2VsZWN0ZWQgKyBcIi4gTXVzdCBiZSAuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRhdGEgPSBzZWxlY3RlZC5kYXRhKFwic2VsZWN0Mi1kYXRhXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gd2hlbiB0aGUgJ3gnIGlzIGNsaWNrZWQgcmVhbGx5IGZhc3QgcmVwZWF0ZWRseSB0aGUgZXZlbnQgY2FuIGJlIHF1ZXVlZFxyXG4gICAgICAgICAgICAgICAgLy8gYW5kIGludm9rZWQgb24gYW4gZWxlbWVudCBhbHJlYWR5IHJlbW92ZWRcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaW5kZXggPSBpbmRleE9mKHRoaXMuaWQoZGF0YSksIHZhbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFsLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB0aGlzLnBvc3Rwcm9jZXNzUmVzdWx0cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlbGVjdGVkLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcih7IHR5cGU6IFwicmVtb3ZlZFwiLCB2YWw6IHRoaXMuaWQoZGF0YSksIGNob2ljZTogZGF0YSB9KTtcclxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHsgcmVtb3ZlZDogZGF0YSB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHBvc3Rwcm9jZXNzUmVzdWx0czogZnVuY3Rpb24gKGRhdGEsIGluaXRpYWwsIG5vSGlnaGxpZ2h0VXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbCgpLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlcyA9IHRoaXMucmVzdWx0cy5maW5kKFwiLnNlbGVjdDItcmVzdWx0XCIpLFxyXG4gICAgICAgICAgICAgICAgY29tcG91bmQgPSB0aGlzLnJlc3VsdHMuZmluZChcIi5zZWxlY3QyLXJlc3VsdC13aXRoLWNoaWxkcmVuXCIpLFxyXG4gICAgICAgICAgICAgICAgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBjaG9pY2VzLmVhY2gyKGZ1bmN0aW9uIChpLCBjaG9pY2UpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpZCA9IHNlbGYuaWQoY2hvaWNlLmRhdGEoXCJzZWxlY3QyLWRhdGFcIikpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4T2YoaWQsIHZhbCkgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNob2ljZS5hZGRDbGFzcyhcInNlbGVjdDItc2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBhbGwgY2hpbGRyZW4gb2YgdGhlIHNlbGVjdGVkIHBhcmVudCBhcyBzZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgIGNob2ljZS5maW5kKFwiLnNlbGVjdDItcmVzdWx0LXNlbGVjdGFibGVcIikuYWRkQ2xhc3MoXCJzZWxlY3QyLXNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbXBvdW5kLmVhY2gyKGZ1bmN0aW9uKGksIGNob2ljZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaGlkZSBhbiBvcHRncm91cCBpZiBpdCBkb2VzbnQgaGF2ZSBhbnkgc2VsZWN0YWJsZSBjaGlsZHJlblxyXG4gICAgICAgICAgICAgICAgaWYgKCFjaG9pY2UuaXMoJy5zZWxlY3QyLXJlc3VsdC1zZWxlY3RhYmxlJylcclxuICAgICAgICAgICAgICAgICAgICAmJiBjaG9pY2UuZmluZChcIi5zZWxlY3QyLXJlc3VsdC1zZWxlY3RhYmxlOm5vdCguc2VsZWN0Mi1zZWxlY3RlZClcIikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hvaWNlLmFkZENsYXNzKFwic2VsZWN0Mi1zZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHQoKSA9PSAtMSAmJiBub0hpZ2hsaWdodFVwZGF0ZSAhPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgc2VsZi5oaWdobGlnaHQoMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSWYgYWxsIHJlc3VsdHMgYXJlIGNob3NlbiByZW5kZXIgZm9ybWF0Tm9NQXRjaGVzXHJcbiAgICAgICAgICAgIGlmKCF0aGlzLm9wdHMuY3JlYXRlU2VhcmNoQ2hvaWNlICYmICFjaG9pY2VzLmZpbHRlcignLnNlbGVjdDItcmVzdWx0Om5vdCguc2VsZWN0Mi1zZWxlY3RlZCknKS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIGlmKCFkYXRhIHx8IGRhdGEgJiYgIWRhdGEubW9yZSAmJiB0aGlzLnJlc3VsdHMuZmluZChcIi5zZWxlY3QyLW5vLXJlc3VsdHNcIikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9ybWF0dGVyKHNlbGYub3B0cy5mb3JtYXROb01hdGNoZXMsIFwiZm9ybWF0Tm9NYXRjaGVzXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5hcHBlbmQoXCI8bGkgY2xhc3M9J3NlbGVjdDItbm8tcmVzdWx0cyc+XCIgKyBzZWxmLm9wdHMuZm9ybWF0Tm9NYXRjaGVzKHNlbGYuc2VhcmNoLnZhbCgpKSArIFwiPC9saT5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgZ2V0TWF4U2VhcmNoV2lkdGg6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24ud2lkdGgoKSAtIGdldFNpZGVCb3JkZXJQYWRkaW5nKHRoaXMuc2VhcmNoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHJlc2l6ZVNlYXJjaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbWluaW11bVdpZHRoLCBsZWZ0LCBtYXhXaWR0aCwgY29udGFpbmVyTGVmdCwgc2VhcmNoV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBzaWRlQm9yZGVyUGFkZGluZyA9IGdldFNpZGVCb3JkZXJQYWRkaW5nKHRoaXMuc2VhcmNoKTtcclxuXHJcbiAgICAgICAgICAgIG1pbmltdW1XaWR0aCA9IG1lYXN1cmVUZXh0V2lkdGgodGhpcy5zZWFyY2gpICsgMTA7XHJcblxyXG4gICAgICAgICAgICBsZWZ0ID0gdGhpcy5zZWFyY2gub2Zmc2V0KCkubGVmdDtcclxuXHJcbiAgICAgICAgICAgIG1heFdpZHRoID0gdGhpcy5zZWxlY3Rpb24ud2lkdGgoKTtcclxuICAgICAgICAgICAgY29udGFpbmVyTGVmdCA9IHRoaXMuc2VsZWN0aW9uLm9mZnNldCgpLmxlZnQ7XHJcblxyXG4gICAgICAgICAgICBzZWFyY2hXaWR0aCA9IG1heFdpZHRoIC0gKGxlZnQgLSBjb250YWluZXJMZWZ0KSAtIHNpZGVCb3JkZXJQYWRkaW5nO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlYXJjaFdpZHRoIDwgbWluaW11bVdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBzZWFyY2hXaWR0aCA9IG1heFdpZHRoIC0gc2lkZUJvcmRlclBhZGRpbmc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hXaWR0aCA8IDQwKSB7XHJcbiAgICAgICAgICAgICAgICBzZWFyY2hXaWR0aCA9IG1heFdpZHRoIC0gc2lkZUJvcmRlclBhZGRpbmc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hXaWR0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgc2VhcmNoV2lkdGggPSBtaW5pbXVtV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKHNlYXJjaFdpZHRoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGdldFZhbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuc2VsZWN0LnZhbCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCA/IFtdIDogdmFsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFsID0gdGhpcy5vcHRzLmVsZW1lbnQudmFsKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3BsaXRWYWwodmFsLCB0aGlzLm9wdHMuc2VwYXJhdG9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgc2V0VmFsOiBmdW5jdGlvbiAodmFsKSB7XHJcbiAgICAgICAgICAgIHZhciB1bmlxdWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QudmFsKHZhbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1bmlxdWUgPSBbXTtcclxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgZHVwbGljYXRlc1xyXG4gICAgICAgICAgICAgICAgJCh2YWwpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE9mKHRoaXMsIHVuaXF1ZSkgPCAwKSB1bmlxdWUucHVzaCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudmFsKHVuaXF1ZS5sZW5ndGggPT09IDAgPyBcIlwiIDogdW5pcXVlLmpvaW4odGhpcy5vcHRzLnNlcGFyYXRvcikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBidWlsZENoYW5nZURldGFpbHM6IGZ1bmN0aW9uIChvbGQsIGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50LnNsaWNlKDApLFxyXG4gICAgICAgICAgICAgICAgb2xkID0gb2xkLnNsaWNlKDApO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVtb3ZlIGludGVyc2VjdGlvbiBmcm9tIGVhY2ggYXJyYXlcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9sZC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcXVhbCh0aGlzLm9wdHMuaWQoY3VycmVudFtpXSksIHRoaXMub3B0cy5pZChvbGRbal0pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaS0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbGQuc3BsaWNlKGosIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqLS07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge2FkZGVkOiBjdXJyZW50LCByZW1vdmVkOiBvbGR9O1xyXG4gICAgICAgIH0sXHJcblxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHZhbDogZnVuY3Rpb24gKHZhbCwgdHJpZ2dlckNoYW5nZSkge1xyXG4gICAgICAgICAgICB2YXIgb2xkRGF0YSwgc2VsZj10aGlzLCBjaGFuZ2VEZXRhaWxzO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvbGREYXRhPXRoaXMuZGF0YSgpO1xyXG4gICAgICAgICAgICBpZiAoIW9sZERhdGEubGVuZ3RoKSBvbGREYXRhPVtdO1xyXG5cclxuICAgICAgICAgICAgLy8gdmFsIGlzIGFuIGlkLiAhdmFsIGlzIHRydWUgZm9yIFt1bmRlZmluZWQsbnVsbCwnJywwXSAtIDAgaXMgbGVnYWxcclxuICAgICAgICAgICAgaWYgKCF2YWwgJiYgdmFsICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC52YWwoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh7YWRkZWQ6IHRoaXMuZGF0YSgpLCByZW1vdmVkOiBvbGREYXRhfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHZhbCBpcyBhIGxpc3Qgb2YgaWRzXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsKHZhbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5pbml0U2VsZWN0aW9uKHRoaXMuc2VsZWN0LCB0aGlzLmJpbmQodGhpcy51cGRhdGVTZWxlY3Rpb24pKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHRoaXMuYnVpbGRDaGFuZ2VEZXRhaWxzKG9sZERhdGEsIHRoaXMuZGF0YSgpKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLmluaXRTZWxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZhbCgpIGNhbm5vdCBiZSBjYWxsZWQgaWYgaW5pdFNlbGVjdGlvbigpIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5pbml0U2VsZWN0aW9uKHRoaXMub3B0cy5lbGVtZW50LCBmdW5jdGlvbihkYXRhKXtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWRzPSQubWFwKGRhdGEsIHNlbGYuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsKGlkcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVTZWxlY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlckNoYW5nZShzZWxmLmJ1aWxkQ2hhbmdlRGV0YWlscyhvbGREYXRhLCB0aGlzLmRhdGEoKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIG9uU29ydFN0YXJ0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb3J0aW5nIG9mIGVsZW1lbnRzIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBhdHRhY2hlZCB0byA8c2VsZWN0Pi4gQXR0YWNoIHRvIDxpbnB1dCB0eXBlPSdoaWRkZW4nLz4gaW5zdGVhZC5cIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNvbGxhcHNlIHNlYXJjaCBmaWVsZCBpbnRvIDAgd2lkdGggc28gaXRzIGNvbnRhaW5lciBjYW4gYmUgY29sbGFwc2VkIGFzIHdlbGxcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gud2lkdGgoMCk7XHJcbiAgICAgICAgICAgIC8vIGhpZGUgdGhlIGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaENvbnRhaW5lci5oaWRlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBvblNvcnRFbmQ6ZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgdmFsPVtdLCBzZWxmPXRoaXM7XHJcblxyXG4gICAgICAgICAgICAvLyBzaG93IHNlYXJjaCBhbmQgbW92ZSBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoQ29udGFpbmVyLnNob3coKTtcclxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBzZWFyY2ggY29udGFpbmVyIGlzIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGxpc3RcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hDb250YWluZXIuYXBwZW5kVG8odGhpcy5zZWFyY2hDb250YWluZXIucGFyZW50KCkpO1xyXG4gICAgICAgICAgICAvLyBzaW5jZSB3ZSBjb2xsYXBzZWQgdGhlIHdpZHRoIGluIGRyYWdTdGFydGVkLCB3ZSByZXNpemUgaXQgaGVyZVxyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNlYXJjaCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHNlbGVjdGlvblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiKS5lYWNoKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgdmFsLnB1c2goc2VsZi5vcHRzLmlkKCQodGhpcykuZGF0YShcInNlbGVjdDItZGF0YVwiKSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWwodmFsKTtcclxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBkYXRhOiBmdW5jdGlvbih2YWx1ZXMsIHRyaWdnZXJDaGFuZ2UpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGY9dGhpcywgaWRzLCBvbGQ7XHJcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgIC5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gJCh0aGlzKS5kYXRhKFwic2VsZWN0Mi1kYXRhXCIpOyB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAuZ2V0KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvbGQgPSB0aGlzLmRhdGEoKTtcclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWVzKSB7IHZhbHVlcyA9IFtdOyB9XHJcbiAgICAgICAgICAgICAgICBpZHMgPSAkLm1hcCh2YWx1ZXMsIGZ1bmN0aW9uKGUpIHsgcmV0dXJuIHNlbGYub3B0cy5pZChlKTsgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbChpZHMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odmFsdWVzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHRoaXMuYnVpbGRDaGFuZ2VEZXRhaWxzKG9sZCwgdGhpcy5kYXRhKCkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgICQuZm4uc2VsZWN0MiA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApLFxyXG4gICAgICAgICAgICBvcHRzLFxyXG4gICAgICAgICAgICBzZWxlY3QyLFxyXG4gICAgICAgICAgICBtZXRob2QsIHZhbHVlLCBtdWx0aXBsZSxcclxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHMgPSBbXCJ2YWxcIiwgXCJkZXN0cm95XCIsIFwib3BlbmVkXCIsIFwib3BlblwiLCBcImNsb3NlXCIsIFwiZm9jdXNcIiwgXCJpc0ZvY3VzZWRcIiwgXCJjb250YWluZXJcIiwgXCJkcm9wZG93blwiLCBcIm9uU29ydFN0YXJ0XCIsIFwib25Tb3J0RW5kXCIsIFwiZW5hYmxlXCIsIFwiZGlzYWJsZVwiLCBcInJlYWRvbmx5XCIsIFwicG9zaXRpb25Ecm9wZG93blwiLCBcImRhdGFcIiwgXCJzZWFyY2hcIl0sXHJcbiAgICAgICAgICAgIHZhbHVlTWV0aG9kcyA9IFtcIm9wZW5lZFwiLCBcImlzRm9jdXNlZFwiLCBcImNvbnRhaW5lclwiLCBcImRyb3Bkb3duXCJdLFxyXG4gICAgICAgICAgICBwcm9wZXJ0eU1ldGhvZHMgPSBbXCJ2YWxcIiwgXCJkYXRhXCJdLFxyXG4gICAgICAgICAgICBtZXRob2RzTWFwID0geyBzZWFyY2g6IFwiZXh0ZXJuYWxTZWFyY2hcIiB9O1xyXG5cclxuICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDAgfHwgdHlwZW9mKGFyZ3NbMF0pID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRzID0gYXJncy5sZW5ndGggPT09IDAgPyB7fSA6ICQuZXh0ZW5kKHt9LCBhcmdzWzBdKTtcclxuICAgICAgICAgICAgICAgIG9wdHMuZWxlbWVudCA9ICQodGhpcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuZWxlbWVudC5nZXQoMCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgPSBvcHRzLmVsZW1lbnQucHJvcChcIm11bHRpcGxlXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSA9IG9wdHMubXVsdGlwbGUgfHwgZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwidGFnc1wiIGluIG9wdHMpIHtvcHRzLm11bHRpcGxlID0gbXVsdGlwbGUgPSB0cnVlO31cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QyID0gbXVsdGlwbGUgPyBuZXcgTXVsdGlTZWxlY3QyKCkgOiBuZXcgU2luZ2xlU2VsZWN0MigpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0Mi5pbml0KG9wdHMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihhcmdzWzBdKSA9PT0gXCJzdHJpbmdcIikge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpbmRleE9mKGFyZ3NbMF0sIGFsbG93ZWRNZXRob2RzKSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBcIlVua25vd24gbWV0aG9kOiBcIiArIGFyZ3NbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3QyID0gJCh0aGlzKS5kYXRhKFwic2VsZWN0MlwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3QyID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q9YXJnc1swXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBcImNvbnRhaW5lclwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxlY3QyLmNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcImRyb3Bkb3duXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGVjdDIuZHJvcGRvd247XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2RzTWFwW21ldGhvZF0pIG1ldGhvZCA9IG1ldGhvZHNNYXBbbWV0aG9kXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxlY3QyW21ldGhvZF0uYXBwbHkoc2VsZWN0MiwgYXJncy5zbGljZSgxKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhPZihhcmdzWzBdLCB2YWx1ZU1ldGhvZHMpID49IDBcclxuICAgICAgICAgICAgICAgICAgICB8fCAoaW5kZXhPZihhcmdzWzBdLCBwcm9wZXJ0eU1ldGhvZHMpICYmIGFyZ3MubGVuZ3RoID09IDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhYm9ydCB0aGUgaXRlcmF0aW9uLCByZWFkeSB0byByZXR1cm4gZmlyc3QgbWF0Y2hlZCB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJJbnZhbGlkIGFyZ3VtZW50cyB0byBzZWxlY3QyIHBsdWdpbjogXCIgKyBhcmdzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IHRoaXMgOiB2YWx1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gcGx1Z2luIGRlZmF1bHRzLCBhY2Nlc3NpYmxlIHRvIHVzZXJzXHJcbiAgICAkLmZuLnNlbGVjdDIuZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgd2lkdGg6IFwiY29weVwiLFxyXG4gICAgICAgIGxvYWRNb3JlUGFkZGluZzogMCxcclxuICAgICAgICBjbG9zZU9uU2VsZWN0OiB0cnVlLFxyXG4gICAgICAgIG9wZW5PbkVudGVyOiB0cnVlLFxyXG4gICAgICAgIGNvbnRhaW5lckNzczoge30sXHJcbiAgICAgICAgZHJvcGRvd25Dc3M6IHt9LFxyXG4gICAgICAgIGNvbnRhaW5lckNzc0NsYXNzOiBcIlwiLFxyXG4gICAgICAgIGRyb3Bkb3duQ3NzQ2xhc3M6IFwiXCIsXHJcbiAgICAgICAgZm9ybWF0UmVzdWx0OiBmdW5jdGlvbihyZXN1bHQsIGNvbnRhaW5lciwgcXVlcnksIGVzY2FwZU1hcmt1cCkge1xyXG4gICAgICAgICAgICB2YXIgbWFya3VwPVtdO1xyXG4gICAgICAgICAgICBtYXJrTWF0Y2gocmVzdWx0LnRleHQsIHF1ZXJ5LnRlcm0sIG1hcmt1cCwgZXNjYXBlTWFya3VwKTtcclxuICAgICAgICAgICAgcmV0dXJuIG1hcmt1cC5qb2luKFwiXCIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZm9ybWF0U2VsZWN0aW9uOiBmdW5jdGlvbiAoZGF0YSwgY29udGFpbmVyLCBlc2NhcGVNYXJrdXApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEgPyBlc2NhcGVNYXJrdXAoZGF0YS50ZXh0KSA6IHVuZGVmaW5lZDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNvcnRSZXN1bHRzOiBmdW5jdGlvbiAocmVzdWx0cywgY29udGFpbmVyLCBxdWVyeSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZvcm1hdFJlc3VsdENzc0NsYXNzOiBmdW5jdGlvbihkYXRhKSB7cmV0dXJuIHVuZGVmaW5lZDt9LFxyXG4gICAgICAgIGZvcm1hdFNlbGVjdGlvbkNzc0NsYXNzOiBmdW5jdGlvbihkYXRhLCBjb250YWluZXIpIHtyZXR1cm4gdW5kZWZpbmVkO30sXHJcbiAgICAgICAgZm9ybWF0Tm9NYXRjaGVzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIk5vIG1hdGNoZXMgZm91bmRcIjsgfSxcclxuICAgICAgICBmb3JtYXRJbnB1dFRvb1Nob3J0OiBmdW5jdGlvbiAoaW5wdXQsIG1pbikgeyB2YXIgbiA9IG1pbiAtIGlucHV0Lmxlbmd0aDsgcmV0dXJuIFwiUGxlYXNlIGVudGVyIFwiICsgbiArIFwiIG1vcmUgY2hhcmFjdGVyXCIgKyAobiA9PSAxPyBcIlwiIDogXCJzXCIpOyB9LFxyXG4gICAgICAgIGZvcm1hdElucHV0VG9vTG9uZzogZnVuY3Rpb24gKGlucHV0LCBtYXgpIHsgdmFyIG4gPSBpbnB1dC5sZW5ndGggLSBtYXg7IHJldHVybiBcIlBsZWFzZSBkZWxldGUgXCIgKyBuICsgXCIgY2hhcmFjdGVyXCIgKyAobiA9PSAxPyBcIlwiIDogXCJzXCIpOyB9LFxyXG4gICAgICAgIGZvcm1hdFNlbGVjdGlvblRvb0JpZzogZnVuY3Rpb24gKGxpbWl0KSB7IHJldHVybiBcIllvdSBjYW4gb25seSBzZWxlY3QgXCIgKyBsaW1pdCArIFwiIGl0ZW1cIiArIChsaW1pdCA9PSAxID8gXCJcIiA6IFwic1wiKTsgfSxcclxuICAgICAgICBmb3JtYXRMb2FkTW9yZTogZnVuY3Rpb24gKHBhZ2VOdW1iZXIpIHsgcmV0dXJuIFwiTG9hZGluZyBtb3JlIHJlc3VsdHMuLi5cIjsgfSxcclxuICAgICAgICBmb3JtYXRTZWFyY2hpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiU2VhcmNoaW5nLi4uXCI7IH0sXHJcbiAgICAgICAgbWluaW11bVJlc3VsdHNGb3JTZWFyY2g6IDAsXHJcbiAgICAgICAgbWluaW11bUlucHV0TGVuZ3RoOiAwLFxyXG4gICAgICAgIG1heGltdW1JbnB1dExlbmd0aDogbnVsbCxcclxuICAgICAgICBtYXhpbXVtU2VsZWN0aW9uU2l6ZTogMCxcclxuICAgICAgICBpZDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaWQ7IH0sXHJcbiAgICAgICAgbWF0Y2hlcjogZnVuY3Rpb24odGVybSwgdGV4dCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc3RyaXBEaWFjcml0aWNzKCcnK3RleHQpLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihzdHJpcERpYWNyaXRpY3MoJycrdGVybSkudG9VcHBlckNhc2UoKSkgPj0gMDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNlcGFyYXRvcjogXCIsXCIsXHJcbiAgICAgICAgdG9rZW5TZXBhcmF0b3JzOiBbXSxcclxuICAgICAgICB0b2tlbml6ZXI6IGRlZmF1bHRUb2tlbml6ZXIsXHJcbiAgICAgICAgZXNjYXBlTWFya3VwOiBkZWZhdWx0RXNjYXBlTWFya3VwLFxyXG4gICAgICAgIGJsdXJPbkNoYW5nZTogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0T25CbHVyOiBmYWxzZSxcclxuICAgICAgICBhZGFwdENvbnRhaW5lckNzc0NsYXNzOiBmdW5jdGlvbihjKSB7IHJldHVybiBjOyB9LFxyXG4gICAgICAgIGFkYXB0RHJvcGRvd25Dc3NDbGFzczogZnVuY3Rpb24oYykgeyByZXR1cm4gbnVsbDsgfSxcclxuICAgICAgICBuZXh0U2VhcmNoVGVybTogZnVuY3Rpb24oc2VsZWN0ZWRPYmplY3QsIGN1cnJlbnRTZWFyY2hUZXJtKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cclxuICAgIH07XHJcblxyXG4gICAgJC5mbi5zZWxlY3QyLmFqYXhEZWZhdWx0cyA9IHtcclxuICAgICAgICB0cmFuc3BvcnQ6ICQuYWpheCxcclxuICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgICAgdHlwZTogXCJHRVRcIixcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogXCJqc29uXCJcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIGV4cG9ydHNcclxuICAgIHdpbmRvdy5TZWxlY3QyID0ge1xyXG4gICAgICAgIHF1ZXJ5OiB7XHJcbiAgICAgICAgICAgIGFqYXg6IGFqYXgsXHJcbiAgICAgICAgICAgIGxvY2FsOiBsb2NhbCxcclxuICAgICAgICAgICAgdGFnczogdGFnc1xyXG4gICAgICAgIH0sIHV0aWw6IHtcclxuICAgICAgICAgICAgZGVib3VuY2U6IGRlYm91bmNlLFxyXG4gICAgICAgICAgICBtYXJrTWF0Y2g6IG1hcmtNYXRjaCxcclxuICAgICAgICAgICAgZXNjYXBlTWFya3VwOiBkZWZhdWx0RXNjYXBlTWFya3VwLFxyXG4gICAgICAgICAgICBzdHJpcERpYWNyaXRpY3M6IHN0cmlwRGlhY3JpdGljc1xyXG4gICAgICAgIH0sIFwiY2xhc3NcIjoge1xyXG4gICAgICAgICAgICBcImFic3RyYWN0XCI6IEFic3RyYWN0U2VsZWN0MixcclxuICAgICAgICAgICAgXCJzaW5nbGVcIjogU2luZ2xlU2VsZWN0MixcclxuICAgICAgICAgICAgXCJtdWx0aVwiOiBNdWx0aVNlbGVjdDJcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxufShqUXVlcnkpKTtcclxuXHJcblxufSkuY2FsbChnbG9iYWwsIG1vZHVsZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklsTmpjbWx3ZEhNdmJHbGlMM05sYkdWamRESXVNeTQwTGpJdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqdEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQklpd2labWxzWlNJNkltZGxibVZ5WVhSbFpDNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpjYmpzZ2FsRjFaWEo1SUQwZ1oyeHZZbUZzTG1wUmRXVnllU0E5SUhKbGNYVnBjbVVvWENKcWNYVmxjbmxjSWlrN1hHNDdJSFpoY2lCZlgySnliM2R6WlhKcFpubGZjMmhwYlY5eVpYRjFhWEpsWDE4OWNtVnhkV2x5WlRzb1puVnVZM1JwYjI0Z1luSnZkM05sY21sbWVWTm9hVzBvYlc5a2RXeGxMQ0JrWldacGJtVXNJSEpsY1hWcGNtVXBJSHRjYmk4cVhISmNia052Y0hseWFXZG9kQ0F5TURFeUlFbG5iM0lnVm1GNWJtSmxjbWRjY2x4dVhISmNibFpsY25OcGIyNDZJRE11TkM0eUlGUnBiV1Z6ZEdGdGNEb2dUVzl1SUVGMVp5QXhNaUF4TlRvd05Eb3hNaUJRUkZRZ01qQXhNMXh5WEc1Y2NseHVWR2hwY3lCemIyWjBkMkZ5WlNCcGN5QnNhV05sYm5ObFpDQjFibVJsY2lCMGFHVWdRWEJoWTJobElFeHBZMlZ1YzJVc0lGWmxjbk5wYjI0Z01pNHdJQ2gwYUdVZ1hDSkJjR0ZqYUdVZ1RHbGpaVzV6WlZ3aUtTQnZjaUIwYUdVZ1IwNVZYSEpjYmtkbGJtVnlZV3dnVUhWaWJHbGpJRXhwWTJWdWMyVWdkbVZ5YzJsdmJpQXlJQ2gwYUdVZ1hDSkhVRXdnVEdsalpXNXpaVndpS1M0Z1dXOTFJRzFoZVNCamFHOXZjMlVnWldsMGFHVnlJR3hwWTJWdWMyVWdkRzhnWjI5MlpYSnVJSGx2ZFhKY2NseHVkWE5sSUc5bUlIUm9hWE1nYzI5bWRIZGhjbVVnYjI1c2VTQjFjRzl1SUhSb1pTQmpiMjVrYVhScGIyNGdkR2hoZENCNWIzVWdZV05qWlhCMElHRnNiQ0J2WmlCMGFHVWdkR1Z5YlhNZ2IyWWdaV2wwYUdWeUlIUm9aU0JCY0dGamFHVmNjbHh1VEdsalpXNXpaU0J2Y2lCMGFHVWdSMUJNSUV4cFkyVnVjMlV1WEhKY2JseHlYRzVaYjNVZ2JXRjVJRzlpZEdGcGJpQmhJR052Y0hrZ2IyWWdkR2hsSUVGd1lXTm9aU0JNYVdObGJuTmxJR0Z1WkNCMGFHVWdSMUJNSUV4cFkyVnVjMlVnWVhRNlhISmNibHh5WEc0Z0lDQWdhSFIwY0RvdkwzZDNkeTVoY0dGamFHVXViM0puTDJ4cFkyVnVjMlZ6TDB4SlEwVk9VMFV0TWk0d1hISmNiaUFnSUNCb2RIUndPaTh2ZDNkM0xtZHVkUzV2Y21jdmJHbGpaVzV6WlhNdlozQnNMVEl1TUM1b2RHMXNYSEpjYmx4eVhHNVZibXhsYzNNZ2NtVnhkV2x5WldRZ1lua2dZWEJ3YkdsallXSnNaU0JzWVhjZ2IzSWdZV2R5WldWa0lIUnZJR2x1SUhkeWFYUnBibWNzSUhOdlpuUjNZWEpsSUdScGMzUnlhV0oxZEdWa0lIVnVaR1Z5SUhSb1pWeHlYRzVCY0dGamFHVWdUR2xqWlc1elpTQnZjaUIwYUdVZ1IxQk1JRXhwWTJWemJuTmxJR2x6SUdScGMzUnlhV0oxZEdWa0lHOXVJR0Z1SUZ3aVFWTWdTVk5jSWlCQ1FWTkpVeXdnVjBsVVNFOVZWQ0JYUVZKU1FVNVVTVVZUSUU5U1hISmNia05QVGtSSlZFbFBUbE1nVDBZZ1FVNVpJRXRKVGtRc0lHVnBkR2hsY2lCbGVIQnlaWE56SUc5eUlHbHRjR3hwWldRdUlGTmxaU0IwYUdVZ1FYQmhZMmhsSUV4cFkyVnVjMlVnWVc1a0lIUm9aU0JIVUV3Z1RHbGpaVzV6WlNCbWIzSmNjbHh1ZEdobElITndaV05wWm1saklHeGhibWQxWVdkbElHZHZkbVZ5Ym1sdVp5QndaWEp0YVhOemFXOXVjeUJoYm1RZ2JHbHRhWFJoZEdsdmJuTWdkVzVrWlhJZ2RHaGxJRUZ3WVdOb1pTQk1hV05sYm5ObElHRnVaQ0IwYUdVZ1IxQk1JRXhwWTJWdWMyVXVYSEpjYmlvdlhISmNiaWhtZFc1amRHbHZiaUFvSkNrZ2UxeHlYRzRnSUNBZ2FXWW9kSGx3Wlc5bUlDUXVabTR1WldGamFESWdQVDBnWENKMWJtUmxabWx1WldSY0lpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNRdVpYaDBaVzVrS0NRdVptNHNJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeXBjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdLaUEwTFRFd0lIUnBiV1Z6SUdaaGMzUmxjaUF1WldGamFDQnlaWEJzWVdObGJXVnVkRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXFJSFZ6WlNCcGRDQmpZWEpsWm5Wc2JIa3NJR0Z6SUdsMElHOTJaWEp5YVdSbGN5QnFVWFZsY25rZ1kyOXVkR1Y0ZENCdlppQmxiR1Z0Wlc1MElHOXVJR1ZoWTJnZ2FYUmxjbUYwYVc5dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNvdlhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdWaFkyZ3lJRG9nWm5WdVkzUnBiMjRnS0dNcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCcUlEMGdKQ2hiTUYwcExDQnBJRDBnTFRFc0lHd2dQU0IwYUdsekxteGxibWQwYUR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIZG9hV3hsSUNoY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FySzJrZ1BDQnNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0ppWWdLR291WTI5dWRHVjRkQ0E5SUdwYk1GMGdQU0IwYUdselcybGRLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDWW1JR011WTJGc2JDaHFXekJkTENCcExDQnFLU0FoUFQwZ1ptRnNjMlVnTHk5Y0luUm9hWE5jSWoxRVQwMHNJR2s5YVc1a1pYZ3NJR285YWxGMVpYSjVJRzlpYW1WamRGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0I5WEhKY2JuMHBLR3BSZFdWeWVTazdYSEpjYmx4eVhHNG9ablZ1WTNScGIyNGdLQ1FzSUhWdVpHVm1hVzVsWkNrZ2UxeHlYRzRnSUNBZ1hDSjFjMlVnYzNSeWFXTjBYQ0k3WEhKY2JpQWdJQ0F2S21kc2IySmhiQ0JrYjJOMWJXVnVkQ3dnZDJsdVpHOTNMQ0JxVVhWbGNua3NJR052Ym5OdmJHVWdLaTljY2x4dVhISmNiaUFnSUNCcFppQW9kMmx1Wkc5M0xsTmxiR1ZqZERJZ0lUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQjJZWElnUzBWWkxDQkJZbk4wY21GamRGTmxiR1ZqZERJc0lGTnBibWRzWlZObGJHVmpkRElzSUUxMWJIUnBVMlZzWldOME1pd2dibVY0ZEZWcFpDd2djMmw2WlhJc1hISmNiaUFnSUNBZ0lDQWdiR0Z6ZEUxdmRYTmxVRzl6YVhScGIyNDllM2c2TUN4NU9qQjlMQ0FrWkc5amRXMWxiblFzSUhOamNtOXNiRUpoY2tScGJXVnVjMmx2Ym5Nc1hISmNibHh5WEc0Z0lDQWdTMFZaSUQwZ2UxeHlYRzRnSUNBZ0lDQWdJRlJCUWpvZ09TeGNjbHh1SUNBZ0lDQWdJQ0JGVGxSRlVqb2dNVE1zWEhKY2JpQWdJQ0FnSUNBZ1JWTkRPaUF5Tnl4Y2NseHVJQ0FnSUNBZ0lDQlRVRUZEUlRvZ016SXNYSEpjYmlBZ0lDQWdJQ0FnVEVWR1ZEb2dNemNzWEhKY2JpQWdJQ0FnSUNBZ1ZWQTZJRE00TEZ4eVhHNGdJQ0FnSUNBZ0lGSkpSMGhVT2lBek9TeGNjbHh1SUNBZ0lDQWdJQ0JFVDFkT09pQTBNQ3hjY2x4dUlDQWdJQ0FnSUNCVFNFbEdWRG9nTVRZc1hISmNiaUFnSUNBZ0lDQWdRMVJTVERvZ01UY3NYSEpjYmlBZ0lDQWdJQ0FnUVV4VU9pQXhPQ3hjY2x4dUlDQWdJQ0FnSUNCUVFVZEZYMVZRT2lBek15eGNjbHh1SUNBZ0lDQWdJQ0JRUVVkRlgwUlBWMDQ2SURNMExGeHlYRzRnSUNBZ0lDQWdJRWhQVFVVNklETTJMRnh5WEc0Z0lDQWdJQ0FnSUVWT1JEb2dNelVzWEhKY2JpQWdJQ0FnSUNBZ1FrRkRTMU5RUVVORk9pQTRMRnh5WEc0Z0lDQWdJQ0FnSUVSRlRFVlVSVG9nTkRZc1hISmNiaUFnSUNBZ0lDQWdhWE5CY25KdmR6b2dablZ1WTNScGIyNGdLR3NwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYXlBOUlHc3VkMmhwWTJnZ1B5QnJMbmRvYVdOb0lEb2dhenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjM2RwZEdOb0lDaHJLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ1MwVlpMa3hGUmxRNlhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdOaGMyVWdTMFZaTGxKSlIwaFVPbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpZWE5sSUV0RldTNVZVRHBjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdZMkZ6WlNCTFJWa3VSRTlYVGpwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzRnSUNBZ0lDQWdJR2x6UTI5dWRISnZiRG9nWm5WdVkzUnBiMjRnS0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR3NnUFNCbExuZG9hV05vTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J6ZDJsMFkyZ2dLR3NwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWTJGelpTQkxSVmt1VTBoSlJsUTZYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTmhjMlVnUzBWWkxrTlVVa3c2WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ1MwVlpMa0ZNVkRwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pTNXRaWFJoUzJWNUtTQnlaWFIxY200Z2RISjFaVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNGdJQ0FnSUNBZ0lHbHpSblZ1WTNScGIyNUxaWGs2SUdaMWJtTjBhVzl1SUNocktTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHc2dQU0JyTG5kb2FXTm9JRDhnYXk1M2FHbGphQ0E2SUdzN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJySUQ0OUlERXhNaUFtSmlCcklEdzlJREV5TXp0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlMRnh5WEc0Z0lDQWdUVVZCVTFWU1JWOVRRMUpQVEV4Q1FWSmZWRVZOVUV4QlZFVWdQU0JjSWp4a2FYWWdZMnhoYzNNOUozTmxiR1ZqZERJdGJXVmhjM1Z5WlMxelkzSnZiR3hpWVhJblBqd3ZaR2wyUGx3aUxGeHlYRzVjY2x4dUlDQWdJRVJKUVVOU1NWUkpRMU1nUFNCN1hDSmNYSFV5TkVJMlhDSTZYQ0pCWENJc1hDSmNYSFZHUmpJeFhDSTZYQ0pCWENJc1hDSmNYSFV3TUVNd1hDSTZYQ0pCWENJc1hDSmNYSFV3TUVNeFhDSTZYQ0pCWENJc1hDSmNYSFV3TUVNeVhDSTZYQ0pCWENJc1hDSmNYSFV4UlVFMlhDSTZYQ0pCWENJc1hDSmNYSFV4UlVFMFhDSTZYQ0pCWENJc1hDSmNYSFV4UlVGQlhDSTZYQ0pCWENJc1hDSmNYSFV4UlVFNFhDSTZYQ0pCWENJc1hDSmNYSFV3TUVNelhDSTZYQ0pCWENJc1hDSmNYSFV3TVRBd1hDSTZYQ0pCWENJc1hDSmNYSFV3TVRBeVhDSTZYQ0pCWENJc1hDSmNYSFV4UlVJd1hDSTZYQ0pCWENJc1hDSmNYSFV4UlVGRlhDSTZYQ0pCWENJc1hDSmNYSFV4UlVJMFhDSTZYQ0pCWENJc1hDSmNYSFV4UlVJeVhDSTZYQ0pCWENJc1hDSmNYSFV3TWpJMlhDSTZYQ0pCWENJc1hDSmNYSFV3TVVVd1hDSTZYQ0pCWENJc1hDSmNYSFV3TUVNMFhDSTZYQ0pCWENJc1hDSmNYSFV3TVVSRlhDSTZYQ0pCWENJc1hDSmNYSFV4UlVFeVhDSTZYQ0pCWENJc1hDSmNYSFV3TUVNMVhDSTZYQ0pCWENJc1hDSmNYSFV3TVVaQlhDSTZYQ0pCWENJc1hDSmNYSFV3TVVORVhDSTZYQ0pCWENJc1hDSmNYSFV3TWpBd1hDSTZYQ0pCWENJc1hDSmNYSFV3TWpBeVhDSTZYQ0pCWENJc1hDSmNYSFV4UlVFd1hDSTZYQ0pCWENJc1hDSmNYSFV4UlVGRFhDSTZYQ0pCWENJc1hDSmNYSFV4UlVJMlhDSTZYQ0pCWENJc1hDSmNYSFV4UlRBd1hDSTZYQ0pCWENJc1hDSmNYSFV3TVRBMFhDSTZYQ0pCWENJc1hDSmNYSFV3TWpOQlhDSTZYQ0pCWENJc1hDSmNYSFV5UXpaR1hDSTZYQ0pCWENJc1hDSmNYSFZCTnpNeVhDSTZYQ0pCUVZ3aUxGd2lYRngxTURCRE5sd2lPbHdpUVVWY0lpeGNJbHhjZFRBeFJrTmNJanBjSWtGRlhDSXNYQ0pjWEhVd01VVXlYQ0k2WENKQlJWd2lMRndpWEZ4MVFUY3pORndpT2x3aVFVOWNJaXhjSWx4Y2RVRTNNelpjSWpwY0lrRlZYQ0lzWENKY1hIVkJOek00WENJNlhDSkJWbHdpTEZ3aVhGeDFRVGN6UVZ3aU9sd2lRVlpjSWl4Y0lseGNkVUUzTTBOY0lqcGNJa0ZaWENJc1hDSmNYSFV5TkVJM1hDSTZYQ0pDWENJc1hDSmNYSFZHUmpJeVhDSTZYQ0pDWENJc1hDSmNYSFV4UlRBeVhDSTZYQ0pDWENJc1hDSmNYSFV4UlRBMFhDSTZYQ0pDWENJc1hDSmNYSFV4UlRBMlhDSTZYQ0pDWENJc1hDSmNYSFV3TWpRelhDSTZYQ0pDWENJc1hDSmNYSFV3TVRneVhDSTZYQ0pDWENJc1hDSmNYSFV3TVRneFhDSTZYQ0pDWENJc1hDSmNYSFV5TkVJNFhDSTZYQ0pEWENJc1hDSmNYSFZHUmpJelhDSTZYQ0pEWENJc1hDSmNYSFV3TVRBMlhDSTZYQ0pEWENJc1hDSmNYSFV3TVRBNFhDSTZYQ0pEWENJc1hDSmNYSFV3TVRCQlhDSTZYQ0pEWENJc1hDSmNYSFV3TVRCRFhDSTZYQ0pEWENJc1hDSmNYSFV3TUVNM1hDSTZYQ0pEWENJc1hDSmNYSFV4UlRBNFhDSTZYQ0pEWENJc1hDSmNYSFV3TVRnM1hDSTZYQ0pEWENJc1hDSmNYSFV3TWpOQ1hDSTZYQ0pEWENJc1hDSmNYSFZCTnpORlhDSTZYQ0pEWENJc1hDSmNYSFV5TkVJNVhDSTZYQ0pFWENJc1hDSmNYSFZHUmpJMFhDSTZYQ0pFWENJc1hDSmNYSFV4UlRCQlhDSTZYQ0pFWENJc1hDSmNYSFV3TVRCRlhDSTZYQ0pFWENJc1hDSmNYSFV4UlRCRFhDSTZYQ0pFWENJc1hDSmNYSFV4UlRFd1hDSTZYQ0pFWENJc1hDSmNYSFV4UlRFeVhDSTZYQ0pFWENJc1hDSmNYSFV4UlRCRlhDSTZYQ0pFWENJc1hDSmNYSFV3TVRFd1hDSTZYQ0pFWENJc1hDSmNYSFV3TVRoQ1hDSTZYQ0pFWENJc1hDSmNYSFV3TVRoQlhDSTZYQ0pFWENJc1hDSmNYSFV3TVRnNVhDSTZYQ0pFWENJc1hDSmNYSFZCTnpjNVhDSTZYQ0pFWENJc1hDSmNYSFV3TVVZeFhDSTZYQ0pFV2x3aUxGd2lYRngxTURGRE5Gd2lPbHdpUkZwY0lpeGNJbHhjZFRBeFJqSmNJanBjSWtSNlhDSXNYQ0pjWEhVd01VTTFYQ0k2WENKRWVsd2lMRndpWEZ4MU1qUkNRVndpT2x3aVJWd2lMRndpWEZ4MVJrWXlOVndpT2x3aVJWd2lMRndpWEZ4MU1EQkRPRndpT2x3aVJWd2lMRndpWEZ4MU1EQkRPVndpT2x3aVJWd2lMRndpWEZ4MU1EQkRRVndpT2x3aVJWd2lMRndpWEZ4MU1VVkRNRndpT2x3aVJWd2lMRndpWEZ4MU1VVkNSVndpT2x3aVJWd2lMRndpWEZ4MU1VVkRORndpT2x3aVJWd2lMRndpWEZ4MU1VVkRNbHdpT2x3aVJWd2lMRndpWEZ4MU1VVkNRMXdpT2x3aVJWd2lMRndpWEZ4MU1ERXhNbHdpT2x3aVJWd2lMRndpWEZ4MU1VVXhORndpT2x3aVJWd2lMRndpWEZ4MU1VVXhObHdpT2x3aVJWd2lMRndpWEZ4MU1ERXhORndpT2x3aVJWd2lMRndpWEZ4MU1ERXhObHdpT2x3aVJWd2lMRndpWEZ4MU1EQkRRbHdpT2x3aVJWd2lMRndpWEZ4MU1VVkNRVndpT2x3aVJWd2lMRndpWEZ4MU1ERXhRVndpT2x3aVJWd2lMRndpWEZ4MU1ESXdORndpT2x3aVJWd2lMRndpWEZ4MU1ESXdObHdpT2x3aVJWd2lMRndpWEZ4MU1VVkNPRndpT2x3aVJWd2lMRndpWEZ4MU1VVkRObHdpT2x3aVJWd2lMRndpWEZ4MU1ESXlPRndpT2x3aVJWd2lMRndpWEZ4MU1VVXhRMXdpT2x3aVJWd2lMRndpWEZ4MU1ERXhPRndpT2x3aVJWd2lMRndpWEZ4MU1VVXhPRndpT2x3aVJWd2lMRndpWEZ4MU1VVXhRVndpT2x3aVJWd2lMRndpWEZ4MU1ERTVNRndpT2x3aVJWd2lMRndpWEZ4MU1ERTRSVndpT2x3aVJWd2lMRndpWEZ4MU1qUkNRbHdpT2x3aVJsd2lMRndpWEZ4MVJrWXlObHdpT2x3aVJsd2lMRndpWEZ4MU1VVXhSVndpT2x3aVJsd2lMRndpWEZ4MU1ERTVNVndpT2x3aVJsd2lMRndpWEZ4MVFUYzNRbHdpT2x3aVJsd2lMRndpWEZ4MU1qUkNRMXdpT2x3aVIxd2lMRndpWEZ4MVJrWXlOMXdpT2x3aVIxd2lMRndpWEZ4MU1ERkdORndpT2x3aVIxd2lMRndpWEZ4MU1ERXhRMXdpT2x3aVIxd2lMRndpWEZ4MU1VVXlNRndpT2x3aVIxd2lMRndpWEZ4MU1ERXhSVndpT2x3aVIxd2lMRndpWEZ4MU1ERXlNRndpT2x3aVIxd2lMRndpWEZ4MU1ERkZObHdpT2x3aVIxd2lMRndpWEZ4MU1ERXlNbHdpT2x3aVIxd2lMRndpWEZ4MU1ERkZORndpT2x3aVIxd2lMRndpWEZ4MU1ERTVNMXdpT2x3aVIxd2lMRndpWEZ4MVFUZEJNRndpT2x3aVIxd2lMRndpWEZ4MVFUYzNSRndpT2x3aVIxd2lMRndpWEZ4MVFUYzNSVndpT2x3aVIxd2lMRndpWEZ4MU1qUkNSRndpT2x3aVNGd2lMRndpWEZ4MVJrWXlPRndpT2x3aVNGd2lMRndpWEZ4MU1ERXlORndpT2x3aVNGd2lMRndpWEZ4MU1VVXlNbHdpT2x3aVNGd2lMRndpWEZ4MU1VVXlObHdpT2x3aVNGd2lMRndpWEZ4MU1ESXhSVndpT2x3aVNGd2lMRndpWEZ4MU1VVXlORndpT2x3aVNGd2lMRndpWEZ4MU1VVXlPRndpT2x3aVNGd2lMRndpWEZ4MU1VVXlRVndpT2x3aVNGd2lMRndpWEZ4MU1ERXlObHdpT2x3aVNGd2lMRndpWEZ4MU1rTTJOMXdpT2x3aVNGd2lMRndpWEZ4MU1rTTNOVndpT2x3aVNGd2lMRndpWEZ4MVFUYzRSRndpT2x3aVNGd2lMRndpWEZ4MU1qUkNSVndpT2x3aVNWd2lMRndpWEZ4MVJrWXlPVndpT2x3aVNWd2lMRndpWEZ4MU1EQkRRMXdpT2x3aVNWd2lMRndpWEZ4MU1EQkRSRndpT2x3aVNWd2lMRndpWEZ4MU1EQkRSVndpT2x3aVNWd2lMRndpWEZ4MU1ERXlPRndpT2x3aVNWd2lMRndpWEZ4MU1ERXlRVndpT2x3aVNWd2lMRndpWEZ4MU1ERXlRMXdpT2x3aVNWd2lMRndpWEZ4MU1ERXpNRndpT2x3aVNWd2lMRndpWEZ4MU1EQkRSbHdpT2x3aVNWd2lMRndpWEZ4MU1VVXlSVndpT2x3aVNWd2lMRndpWEZ4MU1VVkRPRndpT2x3aVNWd2lMRndpWEZ4MU1ERkRSbHdpT2x3aVNWd2lMRndpWEZ4MU1ESXdPRndpT2x3aVNWd2lMRndpWEZ4MU1ESXdRVndpT2x3aVNWd2lMRndpWEZ4MU1VVkRRVndpT2x3aVNWd2lMRndpWEZ4MU1ERXlSVndpT2x3aVNWd2lMRndpWEZ4MU1VVXlRMXdpT2x3aVNWd2lMRndpWEZ4MU1ERTVOMXdpT2x3aVNWd2lMRndpWEZ4MU1qUkNSbHdpT2x3aVNsd2lMRndpWEZ4MVJrWXlRVndpT2x3aVNsd2lMRndpWEZ4MU1ERXpORndpT2x3aVNsd2lMRndpWEZ4MU1ESTBPRndpT2x3aVNsd2lMRndpWEZ4MU1qUkRNRndpT2x3aVMxd2lMRndpWEZ4MVJrWXlRbHdpT2x3aVMxd2lMRndpWEZ4MU1VVXpNRndpT2x3aVMxd2lMRndpWEZ4MU1ERkZPRndpT2x3aVMxd2lMRndpWEZ4MU1VVXpNbHdpT2x3aVMxd2lMRndpWEZ4MU1ERXpObHdpT2x3aVMxd2lMRndpWEZ4MU1VVXpORndpT2x3aVMxd2lMRndpWEZ4MU1ERTVPRndpT2x3aVMxd2lMRndpWEZ4MU1rTTJPVndpT2x3aVMxd2lMRndpWEZ4MVFUYzBNRndpT2x3aVMxd2lMRndpWEZ4MVFUYzBNbHdpT2x3aVMxd2lMRndpWEZ4MVFUYzBORndpT2x3aVMxd2lMRndpWEZ4MVFUZEJNbHdpT2x3aVMxd2lMRndpWEZ4MU1qUkRNVndpT2x3aVRGd2lMRndpWEZ4MVJrWXlRMXdpT2x3aVRGd2lMRndpWEZ4MU1ERXpSbHdpT2x3aVRGd2lMRndpWEZ4MU1ERXpPVndpT2x3aVRGd2lMRndpWEZ4MU1ERXpSRndpT2x3aVRGd2lMRndpWEZ4MU1VVXpObHdpT2x3aVRGd2lMRndpWEZ4MU1VVXpPRndpT2x3aVRGd2lMRndpWEZ4MU1ERXpRbHdpT2x3aVRGd2lMRndpWEZ4MU1VVXpRMXdpT2x3aVRGd2lMRndpWEZ4MU1VVXpRVndpT2x3aVRGd2lMRndpWEZ4MU1ERTBNVndpT2x3aVRGd2lMRndpWEZ4MU1ESXpSRndpT2x3aVRGd2lMRndpWEZ4MU1rTTJNbHdpT2x3aVRGd2lMRndpWEZ4MU1rTTJNRndpT2x3aVRGd2lMRndpWEZ4MVFUYzBPRndpT2x3aVRGd2lMRndpWEZ4MVFUYzBObHdpT2x3aVRGd2lMRndpWEZ4MVFUYzRNRndpT2x3aVRGd2lMRndpWEZ4MU1ERkROMXdpT2x3aVRFcGNJaXhjSWx4Y2RUQXhRemhjSWpwY0lreHFYQ0lzWENKY1hIVXlORU15WENJNlhDSk5YQ0lzWENKY1hIVkdSakpFWENJNlhDSk5YQ0lzWENKY1hIVXhSVE5GWENJNlhDSk5YQ0lzWENKY1hIVXhSVFF3WENJNlhDSk5YQ0lzWENKY1hIVXhSVFF5WENJNlhDSk5YQ0lzWENKY1hIVXlRelpGWENJNlhDSk5YQ0lzWENKY1hIVXdNVGxEWENJNlhDSk5YQ0lzWENKY1hIVXlORU16WENJNlhDSk9YQ0lzWENKY1hIVkdSakpGWENJNlhDSk9YQ0lzWENKY1hIVXdNVVk0WENJNlhDSk9YQ0lzWENKY1hIVXdNVFF6WENJNlhDSk9YQ0lzWENKY1hIVXdNRVF4WENJNlhDSk9YQ0lzWENKY1hIVXhSVFEwWENJNlhDSk9YQ0lzWENKY1hIVXdNVFEzWENJNlhDSk9YQ0lzWENKY1hIVXhSVFEyWENJNlhDSk9YQ0lzWENKY1hIVXdNVFExWENJNlhDSk9YQ0lzWENKY1hIVXhSVFJCWENJNlhDSk9YQ0lzWENKY1hIVXhSVFE0WENJNlhDSk9YQ0lzWENKY1hIVXdNakl3WENJNlhDSk9YQ0lzWENKY1hIVXdNVGxFWENJNlhDSk9YQ0lzWENKY1hIVkJOemt3WENJNlhDSk9YQ0lzWENKY1hIVkJOMEUwWENJNlhDSk9YQ0lzWENKY1hIVXdNVU5CWENJNlhDSk9TbHdpTEZ3aVhGeDFNREZEUWx3aU9sd2lUbXBjSWl4Y0lseGNkVEkwUXpSY0lqcGNJazljSWl4Y0lseGNkVVpHTWtaY0lqcGNJazljSWl4Y0lseGNkVEF3UkRKY0lqcGNJazljSWl4Y0lseGNkVEF3UkROY0lqcGNJazljSWl4Y0lseGNkVEF3UkRSY0lqcGNJazljSWl4Y0lseGNkVEZGUkRKY0lqcGNJazljSWl4Y0lseGNkVEZGUkRCY0lqcGNJazljSWl4Y0lseGNkVEZGUkRaY0lqcGNJazljSWl4Y0lseGNkVEZGUkRSY0lqcGNJazljSWl4Y0lseGNkVEF3UkRWY0lqcGNJazljSWl4Y0lseGNkVEZGTkVOY0lqcGNJazljSWl4Y0lseGNkVEF5TWtOY0lqcGNJazljSWl4Y0lseGNkVEZGTkVWY0lqcGNJazljSWl4Y0lseGNkVEF4TkVOY0lqcGNJazljSWl4Y0lseGNkVEZGTlRCY0lqcGNJazljSWl4Y0lseGNkVEZGTlRKY0lqcGNJazljSWl4Y0lseGNkVEF4TkVWY0lqcGNJazljSWl4Y0lseGNkVEF5TWtWY0lqcGNJazljSWl4Y0lseGNkVEF5TXpCY0lqcGNJazljSWl4Y0lseGNkVEF3UkRaY0lqcGNJazljSWl4Y0lseGNkVEF5TWtGY0lqcGNJazljSWl4Y0lseGNkVEZGUTBWY0lqcGNJazljSWl4Y0lseGNkVEF4TlRCY0lqcGNJazljSWl4Y0lseGNkVEF4UkRGY0lqcGNJazljSWl4Y0lseGNkVEF5TUVOY0lqcGNJazljSWl4Y0lseGNkVEF5TUVWY0lqcGNJazljSWl4Y0lseGNkVEF4UVRCY0lqcGNJazljSWl4Y0lseGNkVEZGUkVOY0lqcGNJazljSWl4Y0lseGNkVEZGUkVGY0lqcGNJazljSWl4Y0lseGNkVEZGUlRCY0lqcGNJazljSWl4Y0lseGNkVEZGUkVWY0lqcGNJazljSWl4Y0lseGNkVEZGUlRKY0lqcGNJazljSWl4Y0lseGNkVEZGUTBOY0lqcGNJazljSWl4Y0lseGNkVEZGUkRoY0lqcGNJazljSWl4Y0lseGNkVEF4UlVGY0lqcGNJazljSWl4Y0lseGNkVEF4UlVOY0lqcGNJazljSWl4Y0lseGNkVEF3UkRoY0lqcGNJazljSWl4Y0lseGNkVEF4UmtWY0lqcGNJazljSWl4Y0lseGNkVEF4T0RaY0lqcGNJazljSWl4Y0lseGNkVEF4T1VaY0lqcGNJazljSWl4Y0lseGNkVUUzTkVGY0lqcGNJazljSWl4Y0lseGNkVUUzTkVOY0lqcGNJazljSWl4Y0lseGNkVEF4UVRKY0lqcGNJazlKWENJc1hDSmNYSFZCTnpSRlhDSTZYQ0pQVDF3aUxGd2lYRngxTURJeU1sd2lPbHdpVDFWY0lpeGNJbHhjZFRJMFF6VmNJanBjSWxCY0lpeGNJbHhjZFVaR016QmNJanBjSWxCY0lpeGNJbHhjZFRGRk5UUmNJanBjSWxCY0lpeGNJbHhjZFRGRk5UWmNJanBjSWxCY0lpeGNJbHhjZFRBeFFUUmNJanBjSWxCY0lpeGNJbHhjZFRKRE5qTmNJanBjSWxCY0lpeGNJbHhjZFVFM05UQmNJanBjSWxCY0lpeGNJbHhjZFVFM05USmNJanBjSWxCY0lpeGNJbHhjZFVFM05UUmNJanBjSWxCY0lpeGNJbHhjZFRJMFF6WmNJanBjSWxGY0lpeGNJbHhjZFVaR016RmNJanBjSWxGY0lpeGNJbHhjZFVFM05UWmNJanBjSWxGY0lpeGNJbHhjZFVFM05UaGNJanBjSWxGY0lpeGNJbHhjZFRBeU5FRmNJanBjSWxGY0lpeGNJbHhjZFRJMFF6ZGNJanBjSWxKY0lpeGNJbHhjZFVaR016SmNJanBjSWxKY0lpeGNJbHhjZFRBeE5UUmNJanBjSWxKY0lpeGNJbHhjZFRGRk5UaGNJanBjSWxKY0lpeGNJbHhjZFRBeE5UaGNJanBjSWxKY0lpeGNJbHhjZFRBeU1UQmNJanBjSWxKY0lpeGNJbHhjZFRBeU1USmNJanBjSWxKY0lpeGNJbHhjZFRGRk5VRmNJanBjSWxKY0lpeGNJbHhjZFRGRk5VTmNJanBjSWxKY0lpeGNJbHhjZFRBeE5UWmNJanBjSWxKY0lpeGNJbHhjZFRGRk5VVmNJanBjSWxKY0lpeGNJbHhjZFRBeU5FTmNJanBjSWxKY0lpeGNJbHhjZFRKRE5qUmNJanBjSWxKY0lpeGNJbHhjZFVFM05VRmNJanBjSWxKY0lpeGNJbHhjZFVFM1FUWmNJanBjSWxKY0lpeGNJbHhjZFVFM09ESmNJanBjSWxKY0lpeGNJbHhjZFRJMFF6aGNJanBjSWxOY0lpeGNJbHhjZFVaR016TmNJanBjSWxOY0lpeGNJbHhjZFRGRk9VVmNJanBjSWxOY0lpeGNJbHhjZFRBeE5VRmNJanBjSWxOY0lpeGNJbHhjZFRGRk5qUmNJanBjSWxOY0lpeGNJbHhjZFRBeE5VTmNJanBjSWxOY0lpeGNJbHhjZFRGRk5qQmNJanBjSWxOY0lpeGNJbHhjZFRBeE5qQmNJanBjSWxOY0lpeGNJbHhjZFRGRk5qWmNJanBjSWxOY0lpeGNJbHhjZFRGRk5qSmNJanBjSWxOY0lpeGNJbHhjZFRGRk5qaGNJanBjSWxOY0lpeGNJbHhjZFRBeU1UaGNJanBjSWxOY0lpeGNJbHhjZFRBeE5VVmNJanBjSWxOY0lpeGNJbHhjZFRKRE4wVmNJanBjSWxOY0lpeGNJbHhjZFVFM1FUaGNJanBjSWxOY0lpeGNJbHhjZFVFM09EUmNJanBjSWxOY0lpeGNJbHhjZFRJMFF6bGNJanBjSWxSY0lpeGNJbHhjZFVaR016UmNJanBjSWxSY0lpeGNJbHhjZFRGRk5rRmNJanBjSWxSY0lpeGNJbHhjZFRBeE5qUmNJanBjSWxSY0lpeGNJbHhjZFRGRk5rTmNJanBjSWxSY0lpeGNJbHhjZFRBeU1VRmNJanBjSWxSY0lpeGNJbHhjZFRBeE5qSmNJanBjSWxSY0lpeGNJbHhjZFRGRk56QmNJanBjSWxSY0lpeGNJbHhjZFRGRk5rVmNJanBjSWxSY0lpeGNJbHhjZFRBeE5qWmNJanBjSWxSY0lpeGNJbHhjZFRBeFFVTmNJanBjSWxSY0lpeGNJbHhjZFRBeFFVVmNJanBjSWxSY0lpeGNJbHhjZFRBeU0wVmNJanBjSWxSY0lpeGNJbHhjZFVFM09EWmNJanBjSWxSY0lpeGNJbHhjZFVFM01qaGNJanBjSWxSYVhDSXNYQ0pjWEhVeU5FTkJYQ0k2WENKVlhDSXNYQ0pjWEhWR1JqTTFYQ0k2WENKVlhDSXNYQ0pjWEhVd01FUTVYQ0k2WENKVlhDSXNYQ0pjWEhVd01FUkJYQ0k2WENKVlhDSXNYQ0pjWEhVd01FUkNYQ0k2WENKVlhDSXNYQ0pjWEhVd01UWTRYQ0k2WENKVlhDSXNYQ0pjWEhVeFJUYzRYQ0k2WENKVlhDSXNYQ0pjWEhVd01UWkJYQ0k2WENKVlhDSXNYQ0pjWEhVeFJUZEJYQ0k2WENKVlhDSXNYQ0pjWEhVd01UWkRYQ0k2WENKVlhDSXNYQ0pjWEhVd01FUkRYQ0k2WENKVlhDSXNYQ0pjWEhVd01VUkNYQ0k2WENKVlhDSXNYQ0pjWEhVd01VUTNYQ0k2WENKVlhDSXNYQ0pjWEhVd01VUTFYQ0k2WENKVlhDSXNYQ0pjWEhVd01VUTVYQ0k2WENKVlhDSXNYQ0pjWEhVeFJVVTJYQ0k2WENKVlhDSXNYQ0pjWEhVd01UWkZYQ0k2WENKVlhDSXNYQ0pjWEhVd01UY3dYQ0k2WENKVlhDSXNYQ0pjWEhVd01VUXpYQ0k2WENKVlhDSXNYQ0pjWEhVd01qRTBYQ0k2WENKVlhDSXNYQ0pjWEhVd01qRTJYQ0k2WENKVlhDSXNYQ0pjWEhVd01VRkdYQ0k2WENKVlhDSXNYQ0pjWEhVeFJVVkJYQ0k2WENKVlhDSXNYQ0pjWEhVeFJVVTRYQ0k2WENKVlhDSXNYQ0pjWEhVeFJVVkZYQ0k2WENKVlhDSXNYQ0pjWEhVeFJVVkRYQ0k2WENKVlhDSXNYQ0pjWEhVeFJVWXdYQ0k2WENKVlhDSXNYQ0pjWEhVeFJVVTBYQ0k2WENKVlhDSXNYQ0pjWEhVeFJUY3lYQ0k2WENKVlhDSXNYQ0pjWEhVd01UY3lYQ0k2WENKVlhDSXNYQ0pjWEhVeFJUYzJYQ0k2WENKVlhDSXNYQ0pjWEhVeFJUYzBYQ0k2WENKVlhDSXNYQ0pjWEhVd01qUTBYQ0k2WENKVlhDSXNYQ0pjWEhVeU5FTkNYQ0k2WENKV1hDSXNYQ0pjWEhWR1JqTTJYQ0k2WENKV1hDSXNYQ0pjWEhVeFJUZERYQ0k2WENKV1hDSXNYQ0pjWEhVeFJUZEZYQ0k2WENKV1hDSXNYQ0pjWEhVd01VSXlYQ0k2WENKV1hDSXNYQ0pjWEhWQk56VkZYQ0k2WENKV1hDSXNYQ0pjWEhVd01qUTFYQ0k2WENKV1hDSXNYQ0pjWEhWQk56WXdYQ0k2WENKV1dWd2lMRndpWEZ4MU1qUkRRMXdpT2x3aVYxd2lMRndpWEZ4MVJrWXpOMXdpT2x3aVYxd2lMRndpWEZ4MU1VVTRNRndpT2x3aVYxd2lMRndpWEZ4MU1VVTRNbHdpT2x3aVYxd2lMRndpWEZ4MU1ERTNORndpT2x3aVYxd2lMRndpWEZ4MU1VVTRObHdpT2x3aVYxd2lMRndpWEZ4MU1VVTRORndpT2x3aVYxd2lMRndpWEZ4MU1VVTRPRndpT2x3aVYxd2lMRndpWEZ4MU1rTTNNbHdpT2x3aVYxd2lMRndpWEZ4MU1qUkRSRndpT2x3aVdGd2lMRndpWEZ4MVJrWXpPRndpT2x3aVdGd2lMRndpWEZ4MU1VVTRRVndpT2x3aVdGd2lMRndpWEZ4MU1VVTRRMXdpT2x3aVdGd2lMRndpWEZ4MU1qUkRSVndpT2x3aVdWd2lMRndpWEZ4MVJrWXpPVndpT2x3aVdWd2lMRndpWEZ4MU1VVkdNbHdpT2x3aVdWd2lMRndpWEZ4MU1EQkVSRndpT2x3aVdWd2lMRndpWEZ4MU1ERTNObHdpT2x3aVdWd2lMRndpWEZ4MU1VVkdPRndpT2x3aVdWd2lMRndpWEZ4MU1ESXpNbHdpT2x3aVdWd2lMRndpWEZ4MU1VVTRSVndpT2x3aVdWd2lMRndpWEZ4MU1ERTNPRndpT2x3aVdWd2lMRndpWEZ4MU1VVkdObHdpT2x3aVdWd2lMRndpWEZ4MU1VVkdORndpT2x3aVdWd2lMRndpWEZ4MU1ERkNNMXdpT2x3aVdWd2lMRndpWEZ4MU1ESTBSVndpT2x3aVdWd2lMRndpWEZ4MU1VVkdSVndpT2x3aVdWd2lMRndpWEZ4MU1qUkRSbHdpT2x3aVdsd2lMRndpWEZ4MVJrWXpRVndpT2x3aVdsd2lMRndpWEZ4MU1ERTNPVndpT2x3aVdsd2lMRndpWEZ4MU1VVTVNRndpT2x3aVdsd2lMRndpWEZ4MU1ERTNRbHdpT2x3aVdsd2lMRndpWEZ4MU1ERTNSRndpT2x3aVdsd2lMRndpWEZ4MU1VVTVNbHdpT2x3aVdsd2lMRndpWEZ4MU1VVTVORndpT2x3aVdsd2lMRndpWEZ4MU1ERkNOVndpT2x3aVdsd2lMRndpWEZ4MU1ESXlORndpT2x3aVdsd2lMRndpWEZ4MU1rTTNSbHdpT2x3aVdsd2lMRndpWEZ4MU1rTTJRbHdpT2x3aVdsd2lMRndpWEZ4MVFUYzJNbHdpT2x3aVdsd2lMRndpWEZ4MU1qUkVNRndpT2x3aVlWd2lMRndpWEZ4MVJrWTBNVndpT2x3aVlWd2lMRndpWEZ4MU1VVTVRVndpT2x3aVlWd2lMRndpWEZ4MU1EQkZNRndpT2x3aVlWd2lMRndpWEZ4MU1EQkZNVndpT2x3aVlWd2lMRndpWEZ4MU1EQkZNbHdpT2x3aVlWd2lMRndpWEZ4MU1VVkJOMXdpT2x3aVlWd2lMRndpWEZ4MU1VVkJOVndpT2x3aVlWd2lMRndpWEZ4MU1VVkJRbHdpT2x3aVlWd2lMRndpWEZ4MU1VVkJPVndpT2x3aVlWd2lMRndpWEZ4MU1EQkZNMXdpT2x3aVlWd2lMRndpWEZ4MU1ERXdNVndpT2x3aVlWd2lMRndpWEZ4MU1ERXdNMXdpT2x3aVlWd2lMRndpWEZ4MU1VVkNNVndpT2x3aVlWd2lMRndpWEZ4MU1VVkJSbHdpT2x3aVlWd2lMRndpWEZ4MU1VVkNOVndpT2x3aVlWd2lMRndpWEZ4MU1VVkNNMXdpT2x3aVlWd2lMRndpWEZ4MU1ESXlOMXdpT2x3aVlWd2lMRndpWEZ4MU1ERkZNVndpT2x3aVlWd2lMRndpWEZ4MU1EQkZORndpT2x3aVlWd2lMRndpWEZ4MU1ERkVSbHdpT2x3aVlWd2lMRndpWEZ4MU1VVkJNMXdpT2x3aVlWd2lMRndpWEZ4MU1EQkZOVndpT2x3aVlWd2lMRndpWEZ4MU1ERkdRbHdpT2x3aVlWd2lMRndpWEZ4MU1ERkRSVndpT2x3aVlWd2lMRndpWEZ4MU1ESXdNVndpT2x3aVlWd2lMRndpWEZ4MU1ESXdNMXdpT2x3aVlWd2lMRndpWEZ4MU1VVkJNVndpT2x3aVlWd2lMRndpWEZ4MU1VVkJSRndpT2x3aVlWd2lMRndpWEZ4MU1VVkNOMXdpT2x3aVlWd2lMRndpWEZ4MU1VVXdNVndpT2x3aVlWd2lMRndpWEZ4MU1ERXdOVndpT2x3aVlWd2lMRndpWEZ4MU1rTTJOVndpT2x3aVlWd2lMRndpWEZ4MU1ESTFNRndpT2x3aVlWd2lMRndpWEZ4MVFUY3pNMXdpT2x3aVlXRmNJaXhjSWx4Y2RUQXdSVFpjSWpwY0ltRmxYQ0lzWENKY1hIVXdNVVpFWENJNlhDSmhaVndpTEZ3aVhGeDFNREZGTTF3aU9sd2lZV1ZjSWl4Y0lseGNkVUUzTXpWY0lqcGNJbUZ2WENJc1hDSmNYSFZCTnpNM1hDSTZYQ0poZFZ3aUxGd2lYRngxUVRjek9Wd2lPbHdpWVhaY0lpeGNJbHhjZFVFM00wSmNJanBjSW1GMlhDSXNYQ0pjWEhWQk56TkVYQ0k2WENKaGVWd2lMRndpWEZ4MU1qUkVNVndpT2x3aVlsd2lMRndpWEZ4MVJrWTBNbHdpT2x3aVlsd2lMRndpWEZ4MU1VVXdNMXdpT2x3aVlsd2lMRndpWEZ4MU1VVXdOVndpT2x3aVlsd2lMRndpWEZ4MU1VVXdOMXdpT2x3aVlsd2lMRndpWEZ4MU1ERTRNRndpT2x3aVlsd2lMRndpWEZ4MU1ERTRNMXdpT2x3aVlsd2lMRndpWEZ4MU1ESTFNMXdpT2x3aVlsd2lMRndpWEZ4MU1qUkVNbHdpT2x3aVkxd2lMRndpWEZ4MVJrWTBNMXdpT2x3aVkxd2lMRndpWEZ4MU1ERXdOMXdpT2x3aVkxd2lMRndpWEZ4MU1ERXdPVndpT2x3aVkxd2lMRndpWEZ4MU1ERXdRbHdpT2x3aVkxd2lMRndpWEZ4MU1ERXdSRndpT2x3aVkxd2lMRndpWEZ4MU1EQkZOMXdpT2x3aVkxd2lMRndpWEZ4MU1VVXdPVndpT2x3aVkxd2lMRndpWEZ4MU1ERTRPRndpT2x3aVkxd2lMRndpWEZ4MU1ESXpRMXdpT2x3aVkxd2lMRndpWEZ4MVFUY3pSbHdpT2x3aVkxd2lMRndpWEZ4MU1qRTRORndpT2x3aVkxd2lMRndpWEZ4MU1qUkVNMXdpT2x3aVpGd2lMRndpWEZ4MVJrWTBORndpT2x3aVpGd2lMRndpWEZ4MU1VVXdRbHdpT2x3aVpGd2lMRndpWEZ4MU1ERXdSbHdpT2x3aVpGd2lMRndpWEZ4MU1VVXdSRndpT2x3aVpGd2lMRndpWEZ4MU1VVXhNVndpT2x3aVpGd2lMRndpWEZ4MU1VVXhNMXdpT2x3aVpGd2lMRndpWEZ4MU1VVXdSbHdpT2x3aVpGd2lMRndpWEZ4MU1ERXhNVndpT2x3aVpGd2lMRndpWEZ4MU1ERTRRMXdpT2x3aVpGd2lMRndpWEZ4MU1ESTFObHdpT2x3aVpGd2lMRndpWEZ4MU1ESTFOMXdpT2x3aVpGd2lMRndpWEZ4MVFUYzNRVndpT2x3aVpGd2lMRndpWEZ4MU1ERkdNMXdpT2x3aVpIcGNJaXhjSWx4Y2RUQXhRelpjSWpwY0ltUjZYQ0lzWENKY1hIVXlORVEwWENJNlhDSmxYQ0lzWENKY1hIVkdSalExWENJNlhDSmxYQ0lzWENKY1hIVXdNRVU0WENJNlhDSmxYQ0lzWENKY1hIVXdNRVU1WENJNlhDSmxYQ0lzWENKY1hIVXdNRVZCWENJNlhDSmxYQ0lzWENKY1hIVXhSVU14WENJNlhDSmxYQ0lzWENKY1hIVXhSVUpHWENJNlhDSmxYQ0lzWENKY1hIVXhSVU0xWENJNlhDSmxYQ0lzWENKY1hIVXhSVU16WENJNlhDSmxYQ0lzWENKY1hIVXhSVUpFWENJNlhDSmxYQ0lzWENKY1hIVXdNVEV6WENJNlhDSmxYQ0lzWENKY1hIVXhSVEUxWENJNlhDSmxYQ0lzWENKY1hIVXhSVEUzWENJNlhDSmxYQ0lzWENKY1hIVXdNVEUxWENJNlhDSmxYQ0lzWENKY1hIVXdNVEUzWENJNlhDSmxYQ0lzWENKY1hIVXdNRVZDWENJNlhDSmxYQ0lzWENKY1hIVXhSVUpDWENJNlhDSmxYQ0lzWENKY1hIVXdNVEZDWENJNlhDSmxYQ0lzWENKY1hIVXdNakExWENJNlhDSmxYQ0lzWENKY1hIVXdNakEzWENJNlhDSmxYQ0lzWENKY1hIVXhSVUk1WENJNlhDSmxYQ0lzWENKY1hIVXhSVU0zWENJNlhDSmxYQ0lzWENKY1hIVXdNakk1WENJNlhDSmxYQ0lzWENKY1hIVXhSVEZFWENJNlhDSmxYQ0lzWENKY1hIVXdNVEU1WENJNlhDSmxYQ0lzWENKY1hIVXhSVEU1WENJNlhDSmxYQ0lzWENKY1hIVXhSVEZDWENJNlhDSmxYQ0lzWENKY1hIVXdNalEzWENJNlhDSmxYQ0lzWENKY1hIVXdNalZDWENJNlhDSmxYQ0lzWENKY1hIVXdNVVJFWENJNlhDSmxYQ0lzWENKY1hIVXlORVExWENJNlhDSm1YQ0lzWENKY1hIVkdSalEyWENJNlhDSm1YQ0lzWENKY1hIVXhSVEZHWENJNlhDSm1YQ0lzWENKY1hIVXdNVGt5WENJNlhDSm1YQ0lzWENKY1hIVkJOemREWENJNlhDSm1YQ0lzWENKY1hIVXlORVEyWENJNlhDSm5YQ0lzWENKY1hIVkdSalEzWENJNlhDSm5YQ0lzWENKY1hIVXdNVVkxWENJNlhDSm5YQ0lzWENKY1hIVXdNVEZFWENJNlhDSm5YQ0lzWENKY1hIVXhSVEl4WENJNlhDSm5YQ0lzWENKY1hIVXdNVEZHWENJNlhDSm5YQ0lzWENKY1hIVXdNVEl4WENJNlhDSm5YQ0lzWENKY1hIVXdNVVUzWENJNlhDSm5YQ0lzWENKY1hIVXdNVEl6WENJNlhDSm5YQ0lzWENKY1hIVXdNVVUxWENJNlhDSm5YQ0lzWENKY1hIVXdNall3WENJNlhDSm5YQ0lzWENKY1hIVkJOMEV4WENJNlhDSm5YQ0lzWENKY1hIVXhSRGM1WENJNlhDSm5YQ0lzWENKY1hIVkJOemRHWENJNlhDSm5YQ0lzWENKY1hIVXlORVEzWENJNlhDSm9YQ0lzWENKY1hIVkdSalE0WENJNlhDSm9YQ0lzWENKY1hIVXdNVEkxWENJNlhDSm9YQ0lzWENKY1hIVXhSVEl6WENJNlhDSm9YQ0lzWENKY1hIVXhSVEkzWENJNlhDSm9YQ0lzWENKY1hIVXdNakZHWENJNlhDSm9YQ0lzWENKY1hIVXhSVEkxWENJNlhDSm9YQ0lzWENKY1hIVXhSVEk1WENJNlhDSm9YQ0lzWENKY1hIVXhSVEpDWENJNlhDSm9YQ0lzWENKY1hIVXhSVGsyWENJNlhDSm9YQ0lzWENKY1hIVXdNVEkzWENJNlhDSm9YQ0lzWENKY1hIVXlRelk0WENJNlhDSm9YQ0lzWENKY1hIVXlRemMyWENJNlhDSm9YQ0lzWENKY1hIVXdNalkxWENJNlhDSm9YQ0lzWENKY1hIVXdNVGsxWENJNlhDSm9kbHdpTEZ3aVhGeDFNalJFT0Z3aU9sd2lhVndpTEZ3aVhGeDFSa1kwT1Z3aU9sd2lhVndpTEZ3aVhGeDFNREJGUTF3aU9sd2lhVndpTEZ3aVhGeDFNREJGUkZ3aU9sd2lhVndpTEZ3aVhGeDFNREJGUlZ3aU9sd2lhVndpTEZ3aVhGeDFNREV5T1Z3aU9sd2lhVndpTEZ3aVhGeDFNREV5UWx3aU9sd2lhVndpTEZ3aVhGeDFNREV5UkZ3aU9sd2lhVndpTEZ3aVhGeDFNREJGUmx3aU9sd2lhVndpTEZ3aVhGeDFNVVV5Umx3aU9sd2lhVndpTEZ3aVhGeDFNVVZET1Z3aU9sd2lhVndpTEZ3aVhGeDFNREZFTUZ3aU9sd2lhVndpTEZ3aVhGeDFNREl3T1Z3aU9sd2lhVndpTEZ3aVhGeDFNREl3UWx3aU9sd2lhVndpTEZ3aVhGeDFNVVZEUWx3aU9sd2lhVndpTEZ3aVhGeDFNREV5Umx3aU9sd2lhVndpTEZ3aVhGeDFNVVV5UkZ3aU9sd2lhVndpTEZ3aVhGeDFNREkyT0Z3aU9sd2lhVndpTEZ3aVhGeDFNREV6TVZ3aU9sd2lhVndpTEZ3aVhGeDFNalJFT1Z3aU9sd2lhbHdpTEZ3aVhGeDFSa1kwUVZ3aU9sd2lhbHdpTEZ3aVhGeDFNREV6TlZ3aU9sd2lhbHdpTEZ3aVhGeDFNREZHTUZ3aU9sd2lhbHdpTEZ3aVhGeDFNREkwT1Z3aU9sd2lhbHdpTEZ3aVhGeDFNalJFUVZ3aU9sd2lhMXdpTEZ3aVhGeDFSa1kwUWx3aU9sd2lhMXdpTEZ3aVhGeDFNVVV6TVZ3aU9sd2lhMXdpTEZ3aVhGeDFNREZGT1Z3aU9sd2lhMXdpTEZ3aVhGeDFNVVV6TTF3aU9sd2lhMXdpTEZ3aVhGeDFNREV6TjF3aU9sd2lhMXdpTEZ3aVhGeDFNVVV6TlZ3aU9sd2lhMXdpTEZ3aVhGeDFNREU1T1Z3aU9sd2lhMXdpTEZ3aVhGeDFNa00yUVZ3aU9sd2lhMXdpTEZ3aVhGeDFRVGMwTVZ3aU9sd2lhMXdpTEZ3aVhGeDFRVGMwTTF3aU9sd2lhMXdpTEZ3aVhGeDFRVGMwTlZ3aU9sd2lhMXdpTEZ3aVhGeDFRVGRCTTF3aU9sd2lhMXdpTEZ3aVhGeDFNalJFUWx3aU9sd2liRndpTEZ3aVhGeDFSa1kwUTF3aU9sd2liRndpTEZ3aVhGeDFNREUwTUZ3aU9sd2liRndpTEZ3aVhGeDFNREV6UVZ3aU9sd2liRndpTEZ3aVhGeDFNREV6UlZ3aU9sd2liRndpTEZ3aVhGeDFNVVV6TjF3aU9sd2liRndpTEZ3aVhGeDFNVVV6T1Z3aU9sd2liRndpTEZ3aVhGeDFNREV6UTF3aU9sd2liRndpTEZ3aVhGeDFNVVV6UkZ3aU9sd2liRndpTEZ3aVhGeDFNVVV6UWx3aU9sd2liRndpTEZ3aVhGeDFNREUzUmx3aU9sd2liRndpTEZ3aVhGeDFNREUwTWx3aU9sd2liRndpTEZ3aVhGeDFNREU1UVZ3aU9sd2liRndpTEZ3aVhGeDFNREkyUWx3aU9sd2liRndpTEZ3aVhGeDFNa00yTVZ3aU9sd2liRndpTEZ3aVhGeDFRVGMwT1Z3aU9sd2liRndpTEZ3aVhGeDFRVGM0TVZ3aU9sd2liRndpTEZ3aVhGeDFRVGMwTjF3aU9sd2liRndpTEZ3aVhGeDFNREZET1Z3aU9sd2liR3BjSWl4Y0lseGNkVEkwUkVOY0lqcGNJbTFjSWl4Y0lseGNkVVpHTkVSY0lqcGNJbTFjSWl4Y0lseGNkVEZGTTBaY0lqcGNJbTFjSWl4Y0lseGNkVEZGTkRGY0lqcGNJbTFjSWl4Y0lseGNkVEZGTkROY0lqcGNJbTFjSWl4Y0lseGNkVEF5TnpGY0lqcGNJbTFjSWl4Y0lseGNkVEF5TmtaY0lqcGNJbTFjSWl4Y0lseGNkVEkwUkVSY0lqcGNJbTVjSWl4Y0lseGNkVVpHTkVWY0lqcGNJbTVjSWl4Y0lseGNkVEF4UmpsY0lqcGNJbTVjSWl4Y0lseGNkVEF4TkRSY0lqcGNJbTVjSWl4Y0lseGNkVEF3UmpGY0lqcGNJbTVjSWl4Y0lseGNkVEZGTkRWY0lqcGNJbTVjSWl4Y0lseGNkVEF4TkRoY0lqcGNJbTVjSWl4Y0lseGNkVEZGTkRkY0lqcGNJbTVjSWl4Y0lseGNkVEF4TkRaY0lqcGNJbTVjSWl4Y0lseGNkVEZGTkVKY0lqcGNJbTVjSWl4Y0lseGNkVEZGTkRsY0lqcGNJbTVjSWl4Y0lseGNkVEF4T1VWY0lqcGNJbTVjSWl4Y0lseGNkVEF5TnpKY0lqcGNJbTVjSWl4Y0lseGNkVEF4TkRsY0lqcGNJbTVjSWl4Y0lseGNkVUUzT1RGY0lqcGNJbTVjSWl4Y0lseGNkVUUzUVRWY0lqcGNJbTVjSWl4Y0lseGNkVEF4UTBOY0lqcGNJbTVxWENJc1hDSmNYSFV5TkVSRlhDSTZYQ0p2WENJc1hDSmNYSFZHUmpSR1hDSTZYQ0p2WENJc1hDSmNYSFV3TUVZeVhDSTZYQ0p2WENJc1hDSmNYSFV3TUVZelhDSTZYQ0p2WENJc1hDSmNYSFV3TUVZMFhDSTZYQ0p2WENJc1hDSmNYSFV4UlVRelhDSTZYQ0p2WENJc1hDSmNYSFV4UlVReFhDSTZYQ0p2WENJc1hDSmNYSFV4UlVRM1hDSTZYQ0p2WENJc1hDSmNYSFV4UlVRMVhDSTZYQ0p2WENJc1hDSmNYSFV3TUVZMVhDSTZYQ0p2WENJc1hDSmNYSFV4UlRSRVhDSTZYQ0p2WENJc1hDSmNYSFV3TWpKRVhDSTZYQ0p2WENJc1hDSmNYSFV4UlRSR1hDSTZYQ0p2WENJc1hDSmNYSFV3TVRSRVhDSTZYQ0p2WENJc1hDSmNYSFV4UlRVeFhDSTZYQ0p2WENJc1hDSmNYSFV4UlRVelhDSTZYQ0p2WENJc1hDSmNYSFV3TVRSR1hDSTZYQ0p2WENJc1hDSmNYSFV3TWpKR1hDSTZYQ0p2WENJc1hDSmNYSFV3TWpNeFhDSTZYQ0p2WENJc1hDSmNYSFV3TUVZMlhDSTZYQ0p2WENJc1hDSmNYSFV3TWpKQ1hDSTZYQ0p2WENJc1hDSmNYSFV4UlVOR1hDSTZYQ0p2WENJc1hDSmNYSFV3TVRVeFhDSTZYQ0p2WENJc1hDSmNYSFV3TVVReVhDSTZYQ0p2WENJc1hDSmNYSFV3TWpCRVhDSTZYQ0p2WENJc1hDSmNYSFV3TWpCR1hDSTZYQ0p2WENJc1hDSmNYSFV3TVVFeFhDSTZYQ0p2WENJc1hDSmNYSFV4UlVSRVhDSTZYQ0p2WENJc1hDSmNYSFV4UlVSQ1hDSTZYQ0p2WENJc1hDSmNYSFV4UlVVeFhDSTZYQ0p2WENJc1hDSmNYSFV4UlVSR1hDSTZYQ0p2WENJc1hDSmNYSFV4UlVVelhDSTZYQ0p2WENJc1hDSmNYSFV4UlVORVhDSTZYQ0p2WENJc1hDSmNYSFV4UlVRNVhDSTZYQ0p2WENJc1hDSmNYSFV3TVVWQ1hDSTZYQ0p2WENJc1hDSmNYSFV3TVVWRVhDSTZYQ0p2WENJc1hDSmNYSFV3TUVZNFhDSTZYQ0p2WENJc1hDSmNYSFV3TVVaR1hDSTZYQ0p2WENJc1hDSmNYSFV3TWpVMFhDSTZYQ0p2WENJc1hDSmNYSFZCTnpSQ1hDSTZYQ0p2WENJc1hDSmNYSFZCTnpSRVhDSTZYQ0p2WENJc1hDSmNYSFV3TWpjMVhDSTZYQ0p2WENJc1hDSmNYSFV3TVVFelhDSTZYQ0p2YVZ3aUxGd2lYRngxTURJeU0xd2lPbHdpYjNWY0lpeGNJbHhjZFVFM05FWmNJanBjSW05dlhDSXNYQ0pjWEhVeU5FUkdYQ0k2WENKd1hDSXNYQ0pjWEhWR1JqVXdYQ0k2WENKd1hDSXNYQ0pjWEhVeFJUVTFYQ0k2WENKd1hDSXNYQ0pjWEhVeFJUVTNYQ0k2WENKd1hDSXNYQ0pjWEhVd01VRTFYQ0k2WENKd1hDSXNYQ0pjWEhVeFJEZEVYQ0k2WENKd1hDSXNYQ0pjWEhWQk56VXhYQ0k2WENKd1hDSXNYQ0pjWEhWQk56VXpYQ0k2WENKd1hDSXNYQ0pjWEhWQk56VTFYQ0k2WENKd1hDSXNYQ0pjWEhVeU5FVXdYQ0k2WENKeFhDSXNYQ0pjWEhWR1JqVXhYQ0k2WENKeFhDSXNYQ0pjWEhVd01qUkNYQ0k2WENKeFhDSXNYQ0pjWEhWQk56VTNYQ0k2WENKeFhDSXNYQ0pjWEhWQk56VTVYQ0k2WENKeFhDSXNYQ0pjWEhVeU5FVXhYQ0k2WENKeVhDSXNYQ0pjWEhWR1JqVXlYQ0k2WENKeVhDSXNYQ0pjWEhVd01UVTFYQ0k2WENKeVhDSXNYQ0pjWEhVeFJUVTVYQ0k2WENKeVhDSXNYQ0pjWEhVd01UVTVYQ0k2WENKeVhDSXNYQ0pjWEhVd01qRXhYQ0k2WENKeVhDSXNYQ0pjWEhVd01qRXpYQ0k2WENKeVhDSXNYQ0pjWEhVeFJUVkNYQ0k2WENKeVhDSXNYQ0pjWEhVeFJUVkVYQ0k2WENKeVhDSXNYQ0pjWEhVd01UVTNYQ0k2WENKeVhDSXNYQ0pjWEhVeFJUVkdYQ0k2WENKeVhDSXNYQ0pjWEhVd01qUkVYQ0k2WENKeVhDSXNYQ0pjWEhVd01qZEVYQ0k2WENKeVhDSXNYQ0pjWEhWQk56VkNYQ0k2WENKeVhDSXNYQ0pjWEhWQk4wRTNYQ0k2WENKeVhDSXNYQ0pjWEhWQk56Z3pYQ0k2WENKeVhDSXNYQ0pjWEhVeU5FVXlYQ0k2WENKelhDSXNYQ0pjWEhWR1JqVXpYQ0k2WENKelhDSXNYQ0pjWEhVd01FUkdYQ0k2WENKelhDSXNYQ0pjWEhVd01UVkNYQ0k2WENKelhDSXNYQ0pjWEhVeFJUWTFYQ0k2WENKelhDSXNYQ0pjWEhVd01UVkVYQ0k2WENKelhDSXNYQ0pjWEhVeFJUWXhYQ0k2WENKelhDSXNYQ0pjWEhVd01UWXhYQ0k2WENKelhDSXNYQ0pjWEhVeFJUWTNYQ0k2WENKelhDSXNYQ0pjWEhVeFJUWXpYQ0k2WENKelhDSXNYQ0pjWEhVeFJUWTVYQ0k2WENKelhDSXNYQ0pjWEhVd01qRTVYQ0k2WENKelhDSXNYQ0pjWEhVd01UVkdYQ0k2WENKelhDSXNYQ0pjWEhVd01qTkdYQ0k2WENKelhDSXNYQ0pjWEhWQk4wRTVYQ0k2WENKelhDSXNYQ0pjWEhWQk56ZzFYQ0k2WENKelhDSXNYQ0pjWEhVeFJUbENYQ0k2WENKelhDSXNYQ0pjWEhVeU5FVXpYQ0k2WENKMFhDSXNYQ0pjWEhWR1JqVTBYQ0k2WENKMFhDSXNYQ0pjWEhVeFJUWkNYQ0k2WENKMFhDSXNYQ0pjWEhVeFJUazNYQ0k2WENKMFhDSXNYQ0pjWEhVd01UWTFYQ0k2WENKMFhDSXNYQ0pjWEhVeFJUWkVYQ0k2WENKMFhDSXNYQ0pjWEhVd01qRkNYQ0k2WENKMFhDSXNYQ0pjWEhVd01UWXpYQ0k2WENKMFhDSXNYQ0pjWEhVeFJUY3hYQ0k2WENKMFhDSXNYQ0pjWEhVeFJUWkdYQ0k2WENKMFhDSXNYQ0pjWEhVd01UWTNYQ0k2WENKMFhDSXNYQ0pjWEhVd01VRkVYQ0k2WENKMFhDSXNYQ0pjWEhVd01qZzRYQ0k2WENKMFhDSXNYQ0pjWEhVeVF6WTJYQ0k2WENKMFhDSXNYQ0pjWEhWQk56ZzNYQ0k2WENKMFhDSXNYQ0pjWEhWQk56STVYQ0k2WENKMGVsd2lMRndpWEZ4MU1qUkZORndpT2x3aWRWd2lMRndpWEZ4MVJrWTFOVndpT2x3aWRWd2lMRndpWEZ4MU1EQkdPVndpT2x3aWRWd2lMRndpWEZ4MU1EQkdRVndpT2x3aWRWd2lMRndpWEZ4MU1EQkdRbHdpT2x3aWRWd2lMRndpWEZ4MU1ERTJPVndpT2x3aWRWd2lMRndpWEZ4MU1VVTNPVndpT2x3aWRWd2lMRndpWEZ4MU1ERTJRbHdpT2x3aWRWd2lMRndpWEZ4MU1VVTNRbHdpT2x3aWRWd2lMRndpWEZ4MU1ERTJSRndpT2x3aWRWd2lMRndpWEZ4MU1EQkdRMXdpT2x3aWRWd2lMRndpWEZ4MU1ERkVRMXdpT2x3aWRWd2lMRndpWEZ4MU1ERkVPRndpT2x3aWRWd2lMRndpWEZ4MU1ERkVObHdpT2x3aWRWd2lMRndpWEZ4MU1ERkVRVndpT2x3aWRWd2lMRndpWEZ4MU1VVkZOMXdpT2x3aWRWd2lMRndpWEZ4MU1ERTJSbHdpT2x3aWRWd2lMRndpWEZ4MU1ERTNNVndpT2x3aWRWd2lMRndpWEZ4MU1ERkVORndpT2x3aWRWd2lMRndpWEZ4MU1ESXhOVndpT2x3aWRWd2lMRndpWEZ4MU1ESXhOMXdpT2x3aWRWd2lMRndpWEZ4MU1ERkNNRndpT2x3aWRWd2lMRndpWEZ4MU1VVkZRbHdpT2x3aWRWd2lMRndpWEZ4MU1VVkZPVndpT2x3aWRWd2lMRndpWEZ4MU1VVkZSbHdpT2x3aWRWd2lMRndpWEZ4MU1VVkZSRndpT2x3aWRWd2lMRndpWEZ4MU1VVkdNVndpT2x3aWRWd2lMRndpWEZ4MU1VVkZOVndpT2x3aWRWd2lMRndpWEZ4MU1VVTNNMXdpT2x3aWRWd2lMRndpWEZ4MU1ERTNNMXdpT2x3aWRWd2lMRndpWEZ4MU1VVTNOMXdpT2x3aWRWd2lMRndpWEZ4MU1VVTNOVndpT2x3aWRWd2lMRndpWEZ4MU1ESTRPVndpT2x3aWRWd2lMRndpWEZ4MU1qUkZOVndpT2x3aWRsd2lMRndpWEZ4MVJrWTFObHdpT2x3aWRsd2lMRndpWEZ4MU1VVTNSRndpT2x3aWRsd2lMRndpWEZ4MU1VVTNSbHdpT2x3aWRsd2lMRndpWEZ4MU1ESTRRbHdpT2x3aWRsd2lMRndpWEZ4MVFUYzFSbHdpT2x3aWRsd2lMRndpWEZ4MU1ESTRRMXdpT2x3aWRsd2lMRndpWEZ4MVFUYzJNVndpT2x3aWRubGNJaXhjSWx4Y2RUSTBSVFpjSWpwY0luZGNJaXhjSWx4Y2RVWkdOVGRjSWpwY0luZGNJaXhjSWx4Y2RURkZPREZjSWpwY0luZGNJaXhjSWx4Y2RURkZPRE5jSWpwY0luZGNJaXhjSWx4Y2RUQXhOelZjSWpwY0luZGNJaXhjSWx4Y2RURkZPRGRjSWpwY0luZGNJaXhjSWx4Y2RURkZPRFZjSWpwY0luZGNJaXhjSWx4Y2RURkZPVGhjSWpwY0luZGNJaXhjSWx4Y2RURkZPRGxjSWpwY0luZGNJaXhjSWx4Y2RUSkROek5jSWpwY0luZGNJaXhjSWx4Y2RUSTBSVGRjSWpwY0luaGNJaXhjSWx4Y2RVWkdOVGhjSWpwY0luaGNJaXhjSWx4Y2RURkZPRUpjSWpwY0luaGNJaXhjSWx4Y2RURkZPRVJjSWpwY0luaGNJaXhjSWx4Y2RUSTBSVGhjSWpwY0lubGNJaXhjSWx4Y2RVWkdOVGxjSWpwY0lubGNJaXhjSWx4Y2RURkZSak5jSWpwY0lubGNJaXhjSWx4Y2RUQXdSa1JjSWpwY0lubGNJaXhjSWx4Y2RUQXhOemRjSWpwY0lubGNJaXhjSWx4Y2RURkZSamxjSWpwY0lubGNJaXhjSWx4Y2RUQXlNek5jSWpwY0lubGNJaXhjSWx4Y2RURkZPRVpjSWpwY0lubGNJaXhjSWx4Y2RUQXdSa1pjSWpwY0lubGNJaXhjSWx4Y2RURkZSamRjSWpwY0lubGNJaXhjSWx4Y2RURkZPVGxjSWpwY0lubGNJaXhjSWx4Y2RURkZSalZjSWpwY0lubGNJaXhjSWx4Y2RUQXhRalJjSWpwY0lubGNJaXhjSWx4Y2RUQXlORVpjSWpwY0lubGNJaXhjSWx4Y2RURkZSa1pjSWpwY0lubGNJaXhjSWx4Y2RUSTBSVGxjSWpwY0lucGNJaXhjSWx4Y2RVWkdOVUZjSWpwY0lucGNJaXhjSWx4Y2RUQXhOMEZjSWpwY0lucGNJaXhjSWx4Y2RURkZPVEZjSWpwY0lucGNJaXhjSWx4Y2RUQXhOME5jSWpwY0lucGNJaXhjSWx4Y2RUQXhOMFZjSWpwY0lucGNJaXhjSWx4Y2RURkZPVE5jSWpwY0lucGNJaXhjSWx4Y2RURkZPVFZjSWpwY0lucGNJaXhjSWx4Y2RUQXhRalpjSWpwY0lucGNJaXhjSWx4Y2RUQXlNalZjSWpwY0lucGNJaXhjSWx4Y2RUQXlOREJjSWpwY0lucGNJaXhjSWx4Y2RUSkROa05jSWpwY0lucGNJaXhjSWx4Y2RVRTNOak5jSWpwY0lucGNJbjA3WEhKY2JseHlYRzRnSUNBZ0pHUnZZM1Z0Wlc1MElEMGdKQ2hrYjJOMWJXVnVkQ2s3WEhKY2JseHlYRzRnSUNBZ2JtVjRkRlZwWkQwb1puVnVZM1JwYjI0b0tTQjdJSFpoY2lCamIzVnVkR1Z5UFRFN0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlncElIc2djbVYwZFhKdUlHTnZkVzUwWlhJckt6c2dmVHNnZlNncEtUdGNjbHh1WEhKY2JseHlYRzRnSUNBZ1puVnVZM1JwYjI0Z2MzUnlhWEJFYVdGamNtbDBhV056S0hOMGNpa2dlMXh5WEc0Z0lDQWdJQ0FnSUhaaGNpQnlaWFFzSUdrc0lHd3NJR003WEhKY2JseHlYRzRnSUNBZ0lDQWdJR2xtSUNnaGMzUnlJSHg4SUhOMGNpNXNaVzVuZEdnZ1BDQXhLU0J5WlhSMWNtNGdjM1J5TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0J5WlhRZ1BTQmNJbHdpTzF4eVhHNGdJQ0FnSUNBZ0lHWnZjaUFvYVNBOUlEQXNJR3dnUFNCemRISXViR1Z1WjNSb095QnBJRHdnYkRzZ2FTc3JLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR01nUFNCemRISXVZMmhoY2tGMEtHa3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFFnS3owZ1JFbEJRMUpKVkVsRFUxdGpYU0I4ZkNCak8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnY21WME8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJR1oxYm1OMGFXOXVJR2x1WkdWNFQyWW9kbUZzZFdVc0lHRnljbUY1S1NCN1hISmNiaUFnSUNBZ0lDQWdkbUZ5SUdrZ1BTQXdMQ0JzSUQwZ1lYSnlZWGt1YkdWdVozUm9PMXh5WEc0Z0lDQWdJQ0FnSUdadmNpQW9PeUJwSUR3Z2JEc2dhU0E5SUdrZ0t5QXhLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobGNYVmhiQ2gyWVd4MVpTd2dZWEp5WVhsYmFWMHBLU0J5WlhSMWNtNGdhVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlDMHhPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUdaMWJtTjBhVzl1SUcxbFlYTjFjbVZUWTNKdmJHeGlZWElnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJSFpoY2lBa2RHVnRjR3hoZEdVZ1BTQWtLQ0JOUlVGVFZWSkZYMU5EVWs5TVRFSkJVbDlVUlUxUVRFRlVSU0FwTzF4eVhHNGdJQ0FnSUNBZ0lDUjBaVzF3YkdGMFpTNWhjSEJsYm1SVWJ5Z25ZbTlrZVNjcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNCMllYSWdaR2x0SUQwZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCM2FXUjBhRG9nSkhSbGJYQnNZWFJsTG5kcFpIUm9LQ2tnTFNBa2RHVnRjR3hoZEdWYk1GMHVZMnhwWlc1MFYybGtkR2dzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2hsYVdkb2REb2dKSFJsYlhCc1lYUmxMbWhsYVdkb2RDZ3BJQzBnSkhSbGJYQnNZWFJsV3pCZExtTnNhV1Z1ZEVobGFXZG9kRnh5WEc0Z0lDQWdJQ0FnSUgwN1hISmNiaUFnSUNBZ0lDQWdKSFJsYlhCc1lYUmxMbkpsYlc5MlpTZ3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1pHbHRPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUM4cUtseHlYRzRnSUNBZ0lDb2dRMjl0Y0dGeVpYTWdaWEYxWVd4cGRIa2diMllnWVNCaGJtUWdZbHh5WEc0Z0lDQWdJQ29nUUhCaGNtRnRJR0ZjY2x4dUlDQWdJQ0FxSUVCd1lYSmhiU0JpWEhKY2JpQWdJQ0FnS2k5Y2NseHVJQ0FnSUdaMWJtTjBhVzl1SUdWeGRXRnNLR0VzSUdJcElIdGNjbHh1SUNBZ0lDQWdJQ0JwWmlBb1lTQTlQVDBnWWlrZ2NtVjBkWEp1SUhSeWRXVTdYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tHRWdQVDA5SUhWdVpHVm1hVzVsWkNCOGZDQmlJRDA5UFNCMWJtUmxabWx1WldRcElISmxkSFZ5YmlCbVlXeHpaVHRjY2x4dUlDQWdJQ0FnSUNCcFppQW9ZU0E5UFQwZ2JuVnNiQ0I4ZkNCaUlEMDlQU0J1ZFd4c0tTQnlaWFIxY200Z1ptRnNjMlU3WEhKY2JpQWdJQ0FnSUNBZ0x5OGdRMmhsWTJzZ2QyaGxkR2hsY2lBbllTY2diM0lnSjJJbklHbHpJR0VnYzNSeWFXNW5JQ2h3Y21sdGFYUnBkbVVnYjNJZ2IySnFaV04wS1M1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJVYUdVZ1kyOXVZMkYwWlc1aGRHbHZiaUJ2WmlCaGJpQmxiWEIwZVNCemRISnBibWNnS0Nzbkp5a2dZMjl1ZG1WeWRITWdhWFJ6SUdGeVozVnRaVzUwSUhSdklHRWdjM1J5YVc1bkozTWdjSEpwYldsMGFYWmxMbHh5WEc0Z0lDQWdJQ0FnSUdsbUlDaGhMbU52Ym5OMGNuVmpkRzl5SUQwOVBTQlRkSEpwYm1jcElISmxkSFZ5YmlCaEt5Y25JRDA5UFNCaUt5Y25PeUF2THlCaEt5Y25JQzBnYVc0Z1kyRnpaU0FuWVNjZ2FYTWdZU0JUZEhKcGJtY2diMkpxWldOMFhISmNiaUFnSUNBZ0lDQWdhV1lnS0dJdVkyOXVjM1J5ZFdOMGIzSWdQVDA5SUZOMGNtbHVaeWtnY21WMGRYSnVJR0lySnljZ1BUMDlJR0VySnljN0lDOHZJR0lySnljZ0xTQnBiaUJqWVhObElDZGlKeUJwY3lCaElGTjBjbWx1WnlCdlltcGxZM1JjY2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnTHlvcVhISmNiaUFnSUNBZ0tpQlRjR3hwZEhNZ2RHaGxJSE4wY21sdVp5QnBiblJ2SUdGdUlHRnljbUY1SUc5bUlIWmhiSFZsY3l3Z2RISnBiVzFwYm1jZ1pXRmphQ0IyWVd4MVpTNGdRVzRnWlcxd2RIa2dZWEp5WVhrZ2FYTWdjbVYwZFhKdVpXUWdabTl5SUc1MWJHeHpJRzl5SUdWdGNIUjVYSEpjYmlBZ0lDQWdLaUJ6ZEhKcGJtZHpYSEpjYmlBZ0lDQWdLaUJBY0dGeVlXMGdjM1J5YVc1blhISmNiaUFnSUNBZ0tpQkFjR0Z5WVcwZ2MyVndZWEpoZEc5eVhISmNiaUFnSUNBZ0tpOWNjbHh1SUNBZ0lHWjFibU4wYVc5dUlITndiR2wwVm1Gc0tITjBjbWx1Wnl3Z2MyVndZWEpoZEc5eUtTQjdYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlIWmhiQ3dnYVN3Z2JEdGNjbHh1SUNBZ0lDQWdJQ0JwWmlBb2MzUnlhVzVuSUQwOVBTQnVkV3hzSUh4OElITjBjbWx1Wnk1c1pXNW5kR2dnUENBeEtTQnlaWFIxY200Z1cxMDdYSEpjYmlBZ0lDQWdJQ0FnZG1Gc0lEMGdjM1J5YVc1bkxuTndiR2wwS0hObGNHRnlZWFJ2Y2lrN1hISmNiaUFnSUNBZ0lDQWdabTl5SUNocElEMGdNQ3dnYkNBOUlIWmhiQzVzWlc1bmRHZzdJR2tnUENCc095QnBJRDBnYVNBcklERXBJSFpoYkZ0cFhTQTlJQ1F1ZEhKcGJTaDJZV3hiYVYwcE8xeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjJZV3c3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ1puVnVZM1JwYjI0Z1oyVjBVMmxrWlVKdmNtUmxjbEJoWkdScGJtY29aV3hsYldWdWRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJsYkdWdFpXNTBMbTkxZEdWeVYybGtkR2dvWm1Gc2MyVXBJQzBnWld4bGJXVnVkQzUzYVdSMGFDZ3BPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUdaMWJtTjBhVzl1SUdsdWMzUmhiR3hMWlhsVmNFTm9ZVzVuWlVWMlpXNTBLR1ZzWlcxbGJuUXBJSHRjY2x4dUlDQWdJQ0FnSUNCMllYSWdhMlY1UFZ3aWEyVjVkWEF0WTJoaGJtZGxMWFpoYkhWbFhDSTdYSEpjYmlBZ0lDQWdJQ0FnWld4bGJXVnVkQzV2YmloY0ltdGxlV1J2ZDI1Y0lpd2dablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0pDNWtZWFJoS0dWc1pXMWxiblFzSUd0bGVTa2dQVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKQzVrWVhSaEtHVnNaVzFsYm5Rc0lHdGxlU3dnWld4bGJXVnVkQzUyWVd3b0tTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQmxiR1Z0Wlc1MExtOXVLRndpYTJWNWRYQmNJaXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdkbUZzUFNBa0xtUmhkR0VvWld4bGJXVnVkQ3dnYTJWNUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFpoYkNBaFBUMGdkVzVrWldacGJtVmtJQ1ltSUdWc1pXMWxiblF1ZG1Gc0tDa2dJVDA5SUhaaGJDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkM1eVpXMXZkbVZFWVhSaEtHVnNaVzFsYm5Rc0lHdGxlU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJHVnRaVzUwTG5SeWFXZG5aWElvWENKclpYbDFjQzFqYUdGdVoyVmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FrWkc5amRXMWxiblF1YjI0b1hDSnRiM1Z6WlcxdmRtVmNJaXdnWm5WdVkzUnBiMjRnS0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0JzWVhOMFRXOTFjMlZRYjNOcGRHbHZiaTU0SUQwZ1pTNXdZV2RsV0R0Y2NseHVJQ0FnSUNBZ0lDQnNZWE4wVFc5MWMyVlFiM05wZEdsdmJpNTVJRDBnWlM1d1lXZGxXVHRjY2x4dUlDQWdJSDBwTzF4eVhHNWNjbHh1SUNBZ0lDOHFLbHh5WEc0Z0lDQWdJQ29nWm1sc2RHVnljeUJ0YjNWelpTQmxkbVZ1ZEhNZ2MyOGdZVzRnWlhabGJuUWdhWE1nWm1seVpXUWdiMjVzZVNCcFppQjBhR1VnYlc5MWMyVWdiVzkyWldRdVhISmNiaUFnSUNBZ0tseHlYRzRnSUNBZ0lDb2dabWxzZEdWeWN5QnZkWFFnYlc5MWMyVWdaWFpsYm5SeklIUm9ZWFFnYjJOamRYSWdkMmhsYmlCdGIzVnpaU0JwY3lCemRHRjBhVzl1WVhKNUlHSjFkRnh5WEc0Z0lDQWdJQ29nZEdobElHVnNaVzFsYm5SeklIVnVaR1Z5SUhSb1pTQndiMmx1ZEdWeUlHRnlaU0J6WTNKdmJHeGxaQzVjY2x4dUlDQWdJQ0FxTDF4eVhHNGdJQ0FnWm5WdVkzUnBiMjRnYVc1emRHRnNiRVpwYkhSbGNtVmtUVzkxYzJWTmIzWmxLR1ZzWlcxbGJuUXBJSHRjY2x4dUlDQWdJQ0FnSUNCbGJHVnRaVzUwTG05dUtGd2liVzkxYzJWdGIzWmxYQ0lzSUdaMWJtTjBhVzl1SUNobEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJzWVhOMGNHOXpJRDBnYkdGemRFMXZkWE5sVUc5emFYUnBiMjQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoc1lYTjBjRzl6SUQwOVBTQjFibVJsWm1sdVpXUWdmSHdnYkdGemRIQnZjeTU0SUNFOVBTQmxMbkJoWjJWWUlIeDhJR3hoYzNSd2IzTXVlU0FoUFQwZ1pTNXdZV2RsV1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKQ2hsTG5SaGNtZGxkQ2t1ZEhKcFoyZGxjaWhjSW0xdmRYTmxiVzkyWlMxbWFXeDBaWEpsWkZ3aUxDQmxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQzhxS2x4eVhHNGdJQ0FnSUNvZ1JHVmliM1Z1WTJWeklHRWdablZ1WTNScGIyNHVJRkpsZEhWeWJuTWdZU0JtZFc1amRHbHZiaUIwYUdGMElHTmhiR3h6SUhSb1pTQnZjbWxuYVc1aGJDQm1iaUJtZFc1amRHbHZiaUJ2Ym14NUlHbG1JRzV2SUdsdWRtOWpZWFJwYjI1eklHaGhkbVVnWW1WbGJpQnRZV1JsWEhKY2JpQWdJQ0FnS2lCM2FYUm9hVzRnZEdobElHeGhjM1FnY1hWcFpYUk5hV3hzYVhNZ2JXbHNiR2x6WldOdmJtUnpMbHh5WEc0Z0lDQWdJQ3BjY2x4dUlDQWdJQ0FxSUVCd1lYSmhiU0J4ZFdsbGRFMXBiR3hwY3lCdWRXMWlaWElnYjJZZ2JXbHNiR2x6WldOdmJtUnpJSFJ2SUhkaGFYUWdZbVZtYjNKbElHbHVkbTlyYVc1bklHWnVYSEpjYmlBZ0lDQWdLaUJBY0dGeVlXMGdabTRnWm5WdVkzUnBiMjRnZEc4Z1ltVWdaR1ZpYjNWdVkyVmtYSEpjYmlBZ0lDQWdLaUJBY0dGeVlXMGdZM1I0SUc5aWFtVmpkQ0IwYnlCaVpTQjFjMlZrSUdGeklIUm9hWE1nY21WbVpYSmxibU5sSUhkcGRHaHBiaUJtYmx4eVhHNGdJQ0FnSUNvZ1FISmxkSFZ5YmlCa1pXSnZkVzVqWldRZ2RtVnljMmx2YmlCdlppQm1ibHh5WEc0Z0lDQWdJQ292WEhKY2JpQWdJQ0JtZFc1amRHbHZiaUJrWldKdmRXNWpaU2h4ZFdsbGRFMXBiR3hwY3l3Z1ptNHNJR04wZUNrZ2UxeHlYRzRnSUNBZ0lDQWdJR04wZUNBOUlHTjBlQ0I4ZkNCMWJtUmxabWx1WldRN1hISmNiaUFnSUNBZ0lDQWdkbUZ5SUhScGJXVnZkWFE3WEhKY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR0Z5WjNNZ1BTQmhjbWQxYldWdWRITTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIZHBibVJ2ZHk1amJHVmhjbFJwYldWdmRYUW9kR2x0Wlc5MWRDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUnBiV1Z2ZFhRZ1BTQjNhVzVrYjNjdWMyVjBWR2x0Wlc5MWRDaG1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdadUxtRndjR3g1S0dOMGVDd2dZWEpuY3lrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwc0lIRjFhV1YwVFdsc2JHbHpLVHRjY2x4dUlDQWdJQ0FnSUNCOU8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQzhxS2x4eVhHNGdJQ0FnSUNvZ1FTQnphVzF3YkdVZ2FXMXdiR1Z0Wlc1MFlYUnBiMjRnYjJZZ1lTQjBhSFZ1YTF4eVhHNGdJQ0FnSUNvZ1FIQmhjbUZ0SUdadmNtMTFiR0VnWm5WdVkzUnBiMjRnZFhObFpDQjBieUJzWVhwcGJIa2dhVzVwZEdsaGJHbDZaU0IwYUdVZ2RHaDFibXRjY2x4dUlDQWdJQ0FxSUVCeVpYUjFjbTRnZTBaMWJtTjBhVzl1ZlZ4eVhHNGdJQ0FnSUNvdlhISmNiaUFnSUNCbWRXNWpkR2x2YmlCMGFIVnVheWhtYjNKdGRXeGhLU0I3WEhKY2JpQWdJQ0FnSUNBZ2RtRnlJR1YyWVd4MVlYUmxaQ0E5SUdaaGJITmxMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZV3gxWlR0Y2NseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsZG1Gc2RXRjBaV1FnUFQwOUlHWmhiSE5sS1NCN0lIWmhiSFZsSUQwZ1ptOXliWFZzWVNncE95QmxkbUZzZFdGMFpXUWdQU0IwY25WbE95QjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMllXeDFaVHRjY2x4dUlDQWdJQ0FnSUNCOU8xeHlYRzRnSUNBZ2ZUdGNjbHh1WEhKY2JpQWdJQ0JtZFc1amRHbHZiaUJwYm5OMFlXeHNSR1ZpYjNWdVkyVmtVMk55YjJ4c0tIUm9jbVZ6YUc5c1pDd2daV3hsYldWdWRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUhaaGNpQnViM1JwWm5rZ1BTQmtaV0p2ZFc1alpTaDBhSEpsYzJodmJHUXNJR1oxYm1OMGFXOXVJQ2hsS1NCN0lHVnNaVzFsYm5RdWRISnBaMmRsY2loY0luTmpjbTlzYkMxa1pXSnZkVzVqWldSY0lpd2daU2s3ZlNrN1hISmNiaUFnSUNBZ0lDQWdaV3hsYldWdWRDNXZiaWhjSW5OamNtOXNiRndpTENCbWRXNWpkR2x2YmlBb1pTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVc1a1pYaFBaaWhsTG5SaGNtZGxkQ3dnWld4bGJXVnVkQzVuWlhRb0tTa2dQajBnTUNrZ2JtOTBhV1o1S0dVcE8xeHlYRzRnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lHWjFibU4wYVc5dUlHWnZZM1Z6S0NSbGJDa2dlMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDZ2taV3hiTUYwZ1BUMDlJR1J2WTNWdFpXNTBMbUZqZEdsMlpVVnNaVzFsYm5RcElISmxkSFZ5Ymp0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHlvZ2MyVjBJSFJvWlNCbWIyTjFjeUJwYmlCaElEQWdkR2x0Wlc5MWRDQXRJSFJvWVhRZ2QyRjVJSFJvWlNCbWIyTjFjeUJwY3lCelpYUWdZV1owWlhJZ2RHaGxJSEJ5YjJObGMzTnBibWRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdiMllnZEdobElHTjFjbkpsYm5RZ1pYWmxiblFnYUdGeklHWnBibWx6YUdWa0lDMGdkMmhwWTJnZ2MyVmxiWE1nYkdsclpTQjBhR1VnYjI1c2VTQnlaV3hwWVdKc1pTQjNZWGxjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkRzhnYzJWMElHWnZZM1Z6SUNvdlhISmNiaUFnSUNBZ0lDQWdkMmx1Wkc5M0xuTmxkRlJwYldWdmRYUW9ablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCbGJEMGtaV3hiTUYwc0lIQnZjejBrWld3dWRtRnNLQ2t1YkdWdVozUm9MQ0J5WVc1blpUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ1JsYkM1bWIyTjFjeWdwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5b2diV0ZyWlNCemRYSmxJR1ZzSUhKbFkyVnBkbVZrSUdadlkzVnpJSE52SUhkbElHUnZJRzV2ZENCbGNuSnZjaUJ2ZFhRZ2QyaGxiaUIwY25scGJtY2dkRzhnYldGdWFYQjFiR0YwWlNCMGFHVWdZMkZ5WlhRdVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpiMjFsZEdsdFpYTWdiVzlrWVd4eklHOXlJRzkwYUdWeWN5QnNhWE4wWlc1bGNuTWdiV0Y1SUhOMFpXRnNJR2wwSUdGbWRHVnlJR2wwY3lCelpYUWdLaTljY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NSbGJDNXBjeWhjSWpwMmFYTnBZbXhsWENJcElDWW1JR1ZzSUQwOVBTQmtiMk4xYldWdWRDNWhZM1JwZG1WRmJHVnRaVzUwS1NCN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHlvZ1lXWjBaWElnZEdobElHWnZZM1Z6SUdseklITmxkQ0J0YjNabElIUm9aU0JqWVhKbGRDQjBieUIwYUdVZ1pXNWtMQ0J1WldObGMzTmhjbmtnZDJobGJpQjNaU0IyWVd3b0tWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdwMWMzUWdZbVZtYjNKbElITmxkSFJwYm1jZ1ptOWpkWE1nS2k5Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1LR1ZzTG5ObGRGTmxiR1ZqZEdsdmJsSmhibWRsS1Z4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWc0xuTmxkRk5sYkdWamRHbHZibEpoYm1kbEtIQnZjeXdnY0c5ektUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWc2MyVWdhV1lnS0dWc0xtTnlaV0YwWlZSbGVIUlNZVzVuWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKaGJtZGxJRDBnWld3dVkzSmxZWFJsVkdWNGRGSmhibWRsS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21GdVoyVXVZMjlzYkdGd2MyVW9abUZzYzJVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKaGJtZGxMbk5sYkdWamRDZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZTd2dNQ2s3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ1puVnVZM1JwYjI0Z1oyVjBRM1Z5YzI5eVNXNW1ieWhsYkNrZ2UxeHlYRzRnSUNBZ0lDQWdJR1ZzSUQwZ0pDaGxiQ2xiTUYwN1hISmNiaUFnSUNBZ0lDQWdkbUZ5SUc5bVpuTmxkQ0E5SURBN1hISmNiaUFnSUNBZ0lDQWdkbUZ5SUd4bGJtZDBhQ0E5SURBN1hISmNiaUFnSUNBZ0lDQWdhV1lnS0NkelpXeGxZM1JwYjI1VGRHRnlkQ2NnYVc0Z1pXd3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdiMlptYzJWMElEMGdaV3d1YzJWc1pXTjBhVzl1VTNSaGNuUTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHeGxibWQwYUNBOUlHVnNMbk5sYkdWamRHbHZia1Z1WkNBdElHOW1abk5sZER0Y2NseHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLQ2R6Wld4bFkzUnBiMjRuSUdsdUlHUnZZM1Z0Wlc1MEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHVnNMbVp2WTNWektDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ6Wld3Z1BTQmtiMk4xYldWdWRDNXpaV3hsWTNScGIyNHVZM0psWVhSbFVtRnVaMlVvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYkdWdVozUm9JRDBnWkc5amRXMWxiblF1YzJWc1pXTjBhVzl1TG1OeVpXRjBaVkpoYm1kbEtDa3VkR1Y0ZEM1c1pXNW5kR2c3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSE5sYkM1dGIzWmxVM1JoY25Rb0oyTm9ZWEpoWTNSbGNpY3NJQzFsYkM1MllXeDFaUzVzWlc1bmRHZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnZabVp6WlhRZ1BTQnpaV3d1ZEdWNGRDNXNaVzVuZEdnZ0xTQnNaVzVuZEdnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUI3SUc5bVpuTmxkRG9nYjJabWMyVjBMQ0JzWlc1bmRHZzZJR3hsYm1kMGFDQjlPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUdaMWJtTjBhVzl1SUd0cGJHeEZkbVZ1ZENobGRtVnVkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lHVjJaVzUwTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3WEhKY2JpQWdJQ0FnSUNBZ1pYWmxiblF1YzNSdmNGQnliM0JoWjJGMGFXOXVLQ2s3WEhKY2JpQWdJQ0I5WEhKY2JpQWdJQ0JtZFc1amRHbHZiaUJyYVd4c1JYWmxiblJKYlcxbFpHbGhkR1ZzZVNobGRtVnVkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lHVjJaVzUwTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3WEhKY2JpQWdJQ0FnSUNBZ1pYWmxiblF1YzNSdmNFbHRiV1ZrYVdGMFpWQnliM0JoWjJGMGFXOXVLQ2s3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ1puVnVZM1JwYjI0Z2JXVmhjM1Z5WlZSbGVIUlhhV1IwYUNobEtTQjdYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tDRnphWHBsY2lsN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnpkSGxzWlNBOUlHVmJNRjB1WTNWeWNtVnVkRk4wZVd4bElIeDhJSGRwYm1SdmR5NW5aWFJEYjIxd2RYUmxaRk4wZVd4bEtHVmJNRjBzSUc1MWJHd3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnphWHBsY2lBOUlDUW9aRzlqZFcxbGJuUXVZM0psWVhSbFJXeGxiV1Z1ZENoY0ltUnBkbHdpS1NrdVkzTnpLSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCdmMybDBhVzl1T2lCY0ltRmljMjlzZFhSbFhDSXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWldaME9pQmNJaTB4TURBd01IQjRYQ0lzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGIzQTZJRndpTFRFd01EQXdjSGhjSWl4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBjM0JzWVhrNklGd2libTl1WlZ3aUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabTl1ZEZOcGVtVTZJSE4wZVd4bExtWnZiblJUYVhwbExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabTl1ZEVaaGJXbHNlVG9nYzNSNWJHVXVabTl1ZEVaaGJXbHNlU3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdadmJuUlRkSGxzWlRvZ2MzUjViR1V1Wm05dWRGTjBlV3hsTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptOXVkRmRsYVdkb2REb2djM1I1YkdVdVptOXVkRmRsYVdkb2RDeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hsZEhSbGNsTndZV05wYm1jNklITjBlV3hsTG14bGRIUmxjbE53WVdOcGJtY3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwWlhoMFZISmhibk5tYjNKdE9pQnpkSGxzWlM1MFpYaDBWSEpoYm5ObWIzSnRMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZDJocGRHVlRjR0ZqWlRvZ1hDSnViM2R5WVhCY0lseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2MybDZaWEl1WVhSMGNpaGNJbU5zWVhOelhDSXNYQ0p6Wld4bFkzUXlMWE5wZW1WeVhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWtLRndpWW05a2VWd2lLUzVoY0hCbGJtUW9jMmw2WlhJcE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCemFYcGxjaTUwWlhoMEtHVXVkbUZzS0NrcE8xeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnphWHBsY2k1M2FXUjBhQ2dwTzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lHWjFibU4wYVc5dUlITjVibU5EYzNORGJHRnpjMlZ6S0dSbGMzUXNJSE55WXl3Z1lXUmhjSFJsY2lrZ2UxeHlYRzRnSUNBZ0lDQWdJSFpoY2lCamJHRnpjMlZ6TENCeVpYQnNZV05sYldWdWRITWdQU0JiWFN3Z1lXUmhjSFJsWkR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnWTJ4aGMzTmxjeUE5SUdSbGMzUXVZWFIwY2loY0ltTnNZWE56WENJcE8xeHlYRzRnSUNBZ0lDQWdJR2xtSUNoamJHRnpjMlZ6S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdOc1lYTnpaWE1nUFNBbkp5QXJJR05zWVhOelpYTTdJQzh2SUdadmNpQkpSU0IzYUdsamFDQnlaWFIxY201eklHOWlhbVZqZEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FrS0dOc1lYTnpaWE11YzNCc2FYUW9YQ0lnWENJcEtTNWxZV05vTWlobWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbWx1WkdWNFQyWW9YQ0p6Wld4bFkzUXlMVndpS1NBOVBUMGdNQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsY0d4aFkyVnRaVzUwY3k1d2RYTm9LSFJvYVhNcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdZMnhoYzNObGN5QTlJSE55WXk1aGRIUnlLRndpWTJ4aGMzTmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ2FXWWdLR05zWVhOelpYTXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdZMnhoYzNObGN5QTlJQ2NuSUNzZ1kyeGhjM05sY3pzZ0x5OGdabTl5SUVsRklIZG9hV05vSUhKbGRIVnlibk1nYjJKcVpXTjBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDUW9ZMnhoYzNObGN5NXpjR3hwZENoY0lpQmNJaWtwTG1WaFkyZ3lLR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWFXNWtaWGhQWmloY0luTmxiR1ZqZERJdFhDSXBJQ0U5UFNBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXUmhjSFJsWkNBOUlHRmtZWEIwWlhJb2RHaHBjeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dGa1lYQjBaV1FwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVndiR0ZqWlcxbGJuUnpMbkIxYzJnb2RHaHBjeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnWkdWemRDNWhkSFJ5S0Z3aVkyeGhjM05jSWl3Z2NtVndiR0ZqWlcxbGJuUnpMbXB2YVc0b1hDSWdYQ0lwS1R0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmx4eVhHNGdJQ0FnWm5WdVkzUnBiMjRnYldGeWEwMWhkR05vS0hSbGVIUXNJSFJsY20wc0lHMWhjbXQxY0N3Z1pYTmpZWEJsVFdGeWEzVndLU0I3WEhKY2JpQWdJQ0FnSUNBZ2RtRnlJRzFoZEdOb1BYTjBjbWx3UkdsaFkzSnBkR2xqY3loMFpYaDBMblJ2VlhCd1pYSkRZWE5sS0NrcExtbHVaR1Y0VDJZb2MzUnlhWEJFYVdGamNtbDBhV056S0hSbGNtMHVkRzlWY0hCbGNrTmhjMlVvS1NrcExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGJEMTBaWEp0TG14bGJtZDBhRHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdhV1lnS0cxaGRHTm9QREFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYldGeWEzVndMbkIxYzJnb1pYTmpZWEJsVFdGeWEzVndLSFJsZUhRcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ2JXRnlhM1Z3TG5CMWMyZ29aWE5qWVhCbFRXRnlhM1Z3S0hSbGVIUXVjM1ZpYzNSeWFXNW5LREFzSUcxaGRHTm9LU2twTzF4eVhHNGdJQ0FnSUNBZ0lHMWhjbXQxY0M1d2RYTm9LRndpUEhOd1lXNGdZMnhoYzNNOUozTmxiR1ZqZERJdGJXRjBZMmduUGx3aUtUdGNjbHh1SUNBZ0lDQWdJQ0J0WVhKcmRYQXVjSFZ6YUNobGMyTmhjR1ZOWVhKcmRYQW9kR1Y0ZEM1emRXSnpkSEpwYm1jb2JXRjBZMmdzSUcxaGRHTm9JQ3NnZEd3cEtTazdYSEpjYmlBZ0lDQWdJQ0FnYldGeWEzVndMbkIxYzJnb1hDSThMM053WVc0K1hDSXBPMXh5WEc0Z0lDQWdJQ0FnSUcxaGNtdDFjQzV3ZFhOb0tHVnpZMkZ3WlUxaGNtdDFjQ2gwWlhoMExuTjFZbk4wY21sdVp5aHRZWFJqYUNBcklIUnNMQ0IwWlhoMExteGxibWQwYUNrcEtUdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0JtZFc1amRHbHZiaUJrWldaaGRXeDBSWE5qWVhCbFRXRnlhM1Z3S0cxaGNtdDFjQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lIWmhjaUJ5WlhCc1lXTmxYMjFoY0NBOUlIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0oxeGNYRnduT2lBbkppTTVNanNuTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FuSmljNklDY21ZVzF3T3ljc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNjOEp6b2dKeVpzZERzbkxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBblBpYzZJQ2NtWjNRN0p5eGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0oxd2lKem9nSnlaeGRXOTBPeWNzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJRndpSjF3aU9pQW5KaU16T1RzbkxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCY0lpOWNJam9nSnlZak5EYzdKMXh5WEc0Z0lDQWdJQ0FnSUgwN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJUZEhKcGJtY29iV0Z5YTNWd0tTNXlaWEJzWVdObEtDOWJKancrWENJblhGd3ZYRnhjWEYwdlp5d2dablZ1WTNScGIyNGdLRzFoZEdOb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCeVpYQnNZV05sWDIxaGNGdHRZWFJqYUYwN1hISmNiaUFnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0x5b3FYSEpjYmlBZ0lDQWdLaUJRY205a2RXTmxjeUJoYmlCaGFtRjRMV0poYzJWa0lIRjFaWEo1SUdaMWJtTjBhVzl1WEhKY2JpQWdJQ0FnS2x4eVhHNGdJQ0FnSUNvZ1FIQmhjbUZ0SUc5d2RHbHZibk1nYjJKcVpXTjBJR052Ym5SaGFXNXBibWNnWTI5dVptbG5kWEpoZEdsdmJpQndZWEpoYlhSbGNuTmNjbHh1SUNBZ0lDQXFJRUJ3WVhKaGJTQnZjSFJwYjI1ekxuQmhjbUZ0Y3lCd1lYSmhiV1YwWlhJZ2JXRndJR1p2Y2lCMGFHVWdkSEpoYm5Od2IzSjBJR0ZxWVhnZ1kyRnNiQ3dnWTJGdUlHTnZiblJoYVc0Z2MzVmphQ0J2Y0hScGIyNXpJR0Z6SUdOaFkyaGxMQ0JxYzI5dWNFTmhiR3hpWVdOckxDQmxkR011SUhObFpTQWtMbUZxWVhoY2NseHVJQ0FnSUNBcUlFQndZWEpoYlNCdmNIUnBiMjV6TG5SeVlXNXpjRzl5ZENCbWRXNWpkR2x2YmlCMGFHRjBJSGRwYkd3Z1ltVWdkWE5sWkNCMGJ5QmxlR1ZqZFhSbElIUm9aU0JoYW1GNElISmxjWFZsYzNRdUlHMTFjM1FnWW1VZ1kyOXRjR0YwYVdKc1pTQjNhWFJvSUhCaGNtRnRaWFJsY25NZ2MzVndjRzl5ZEdWa0lHSjVJQ1F1WVdwaGVGeHlYRzRnSUNBZ0lDb2dRSEJoY21GdElHOXdkR2x2Ym5NdWRYSnNJSFZ5YkNCbWIzSWdkR2hsSUdSaGRHRmNjbHh1SUNBZ0lDQXFJRUJ3WVhKaGJTQnZjSFJwYjI1ekxtUmhkR0VnWVNCbWRXNWpkR2x2YmloelpXRnlZMmhVWlhKdExDQndZV2RsVG5WdFltVnlMQ0JqYjI1MFpYaDBLU0IwYUdGMElITm9iM1ZzWkNCeVpYUjFjbTRnWVc0Z2IySnFaV04wSUdOdmJuUmhhVzVwYm1jZ2NYVmxjbmtnYzNSeWFXNW5JSEJoY21GdFpYUmxjbk1nWm05eUlIUm9aU0JoWW05MlpTQjFjbXd1WEhKY2JpQWdJQ0FnS2lCQWNHRnlZVzBnYjNCMGFXOXVjeTVrWVhSaFZIbHdaU0J5WlhGMVpYTjBJR1JoZEdFZ2RIbHdaVG9nWVdwaGVDd2dhbk52Ym5Bc0lHOTBhR1Z5SUdSaGRHRjBZWFI1Y0dWeklITjFjSEJ2Y25SbFpDQmllU0JxVVhWbGNua25jeUFrTG1GcVlYZ2dablZ1WTNScGIyNGdiM0lnZEdobElIUnlZVzV6Y0c5eWRDQm1kVzVqZEdsdmJpQnBaaUJ6Y0dWamFXWnBaV1JjY2x4dUlDQWdJQ0FxSUVCd1lYSmhiU0J2Y0hScGIyNXpMbkYxYVdWMFRXbHNiR2x6SUNodmNIUnBiMjVoYkNrZ2JXbHNiR2x6WldOdmJtUnpJSFJ2SUhkaGFYUWdZbVZtYjNKbElHMWhhMmx1WnlCMGFHVWdZV3BoZUZKbGNYVmxjM1FzSUdobGJIQnpJR1JsWW05MWJtTmxJSFJvWlNCaGFtRjRJR1oxYm1OMGFXOXVJR2xtSUdsdWRtOXJaV1FnZEc5dklHOW1kR1Z1WEhKY2JpQWdJQ0FnS2lCQWNHRnlZVzBnYjNCMGFXOXVjeTV5WlhOMWJIUnpJR0VnWm5WdVkzUnBiMjRvY21WdGIzUmxSR0YwWVN3Z2NHRm5aVTUxYldKbGNpa2dkR2hoZENCamIyNTJaWEowY3lCa1lYUmhJSEpsZEhWeWJtVmtJR1p2Y20wZ2RHaGxJSEpsYlc5MFpTQnlaWEYxWlhOMElIUnZJSFJvWlNCbWIzSnRZWFFnWlhod1pXTjBaV1FnWW5rZ1UyVnNaV04wTWk1Y2NseHVJQ0FnSUNBcUlDQWdJQ0FnVkdobElHVjRjR1ZqZEdWa0lHWnZjbTFoZENCcGN5QmhiaUJ2WW1wbFkzUWdZMjl1ZEdGcGJtbHVaeUIwYUdVZ1ptOXNiRzkzYVc1bklHdGxlWE02WEhKY2JpQWdJQ0FnS2lBZ0lDQWdJSEpsYzNWc2RITWdZWEp5WVhrZ2IyWWdiMkpxWldOMGN5QjBhR0YwSUhkcGJHd2dZbVVnZFhObFpDQmhjeUJqYUc5cFkyVnpYSEpjYmlBZ0lDQWdLaUFnSUNBZ0lHMXZjbVVnS0c5d2RHbHZibUZzS1NCaWIyOXNaV0Z1SUdsdVpHbGpZWFJwYm1jZ2QyaGxkR2hsY2lCMGFHVnlaU0JoY21VZ2JXOXlaU0J5WlhOMWJIUnpJR0YyWVdsc1lXSnNaVnh5WEc0Z0lDQWdJQ29nSUNBZ0lDQkZlR0Z0Y0d4bE9pQjdjbVZ6ZFd4MGN6cGJlMmxrT2pFc0lIUmxlSFE2SjFKbFpDZDlMSHRwWkRveUxDQjBaWGgwT2lkQ2JIVmxKMzFkTENCdGIzSmxPblJ5ZFdWOVhISmNiaUFnSUNBZ0tpOWNjbHh1SUNBZ0lHWjFibU4wYVc5dUlHRnFZWGdvYjNCMGFXOXVjeWtnZTF4eVhHNGdJQ0FnSUNBZ0lIWmhjaUIwYVcxbGIzVjBMQ0F2THlCamRYSnlaVzUwSUhOamFHVmtkV3hsWkNCaWRYUWdibTkwSUhsbGRDQmxlR1ZqZFhSbFpDQnlaWEYxWlhOMFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdoaGJtUnNaWElnUFNCdWRXeHNMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnhkV2xsZEUxcGJHeHBjeUE5SUc5d2RHbHZibk11Y1hWcFpYUk5hV3hzYVhNZ2ZId2dNVEF3TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JoYW1GNFZYSnNJRDBnYjNCMGFXOXVjeTUxY213c1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhObGJHWWdQU0IwYUdsek8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWm5WdVkzUnBiMjRnS0hGMVpYSjVLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSGRwYm1SdmR5NWpiR1ZoY2xScGJXVnZkWFFvZEdsdFpXOTFkQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJwYldWdmRYUWdQU0IzYVc1a2IzY3VjMlYwVkdsdFpXOTFkQ2htZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWkdGMFlTQTlJRzl3ZEdsdmJuTXVaR0YwWVN3Z0x5OGdZV3BoZUNCa1lYUmhJR1oxYm1OMGFXOXVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RYSnNJRDBnWVdwaGVGVnliQ3dnTHk4Z1lXcGhlQ0IxY213Z2MzUnlhVzVuSUc5eUlHWjFibU4wYVc5dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEhKaGJuTndiM0owSUQwZ2IzQjBhVzl1Y3k1MGNtRnVjM0J2Y25RZ2ZId2dKQzVtYmk1elpXeGxZM1F5TG1GcVlYaEVaV1poZFd4MGN5NTBjbUZ1YzNCdmNuUXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdaR1Z3Y21WallYUmxaQ0F0SUhSdklHSmxJSEpsYlc5MlpXUWdhVzRnTkM0d0lDQXRJSFZ6WlNCd1lYSmhiWE1nYVc1emRHVmhaRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUmxjSEpsWTJGMFpXUWdQU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJRzl3ZEdsdmJuTXVkSGx3WlNCOGZDQW5SMFZVSnl3Z0x5OGdjMlYwSUhSNWNHVWdiMllnY21WeGRXVnpkQ0FvUjBWVUlHOXlJRkJQVTFRcFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmhZMmhsT2lCdmNIUnBiMjV6TG1OaFkyaGxJSHg4SUdaaGJITmxMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JxYzI5dWNFTmhiR3hpWVdOck9pQnZjSFJwYjI1ekxtcHpiMjV3UTJGc2JHSmhZMnQ4ZkhWdVpHVm1hVzVsWkN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHRjBZVlI1Y0dVNklHOXdkR2x2Ym5NdVpHRjBZVlI1Y0dWOGZGd2lhbk52Ymx3aVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3WVhKaGJYTWdQU0FrTG1WNGRHVnVaQ2g3ZlN3Z0pDNW1iaTV6Wld4bFkzUXlMbUZxWVhoRVpXWmhkV3gwY3k1d1lYSmhiWE1zSUdSbGNISmxZMkYwWldRcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdSaGRHRWdQU0JrWVhSaElEOGdaR0YwWVM1allXeHNLSE5sYkdZc0lIRjFaWEo1TG5SbGNtMHNJSEYxWlhKNUxuQmhaMlVzSUhGMVpYSjVMbU52Ym5SbGVIUXBJRG9nYm5Wc2JEdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFZ5YkNBOUlDaDBlWEJsYjJZZ2RYSnNJRDA5UFNBblpuVnVZM1JwYjI0bktTQS9JSFZ5YkM1allXeHNLSE5sYkdZc0lIRjFaWEo1TG5SbGNtMHNJSEYxWlhKNUxuQmhaMlVzSUhGMVpYSjVMbU52Ym5SbGVIUXBJRG9nZFhKc08xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaG9ZVzVrYkdWeUtTQjdJR2hoYm1Sc1pYSXVZV0p2Y25Rb0tUc2dmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h2Y0hScGIyNXpMbkJoY21GdGN5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2drTG1selJuVnVZM1JwYjI0b2IzQjBhVzl1Y3k1d1lYSmhiWE1wS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDUXVaWGgwWlc1a0tIQmhjbUZ0Y3l3Z2IzQjBhVzl1Y3k1d1lYSmhiWE11WTJGc2JDaHpaV3htS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkM1bGVIUmxibVFvY0dGeVlXMXpMQ0J2Y0hScGIyNXpMbkJoY21GdGN5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDUXVaWGgwWlc1a0tIQmhjbUZ0Y3l3Z2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhWeWJEb2dkWEpzTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JoZEdGVWVYQmxPaUJ2Y0hScGIyNXpMbVJoZEdGVWVYQmxMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUmhkR0U2SUdSaGRHRXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzVmpZMlZ6Y3pvZ1puVnVZM1JwYjI0Z0tHUmhkR0VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdWRTlFVHlBdElISmxjR3hoWTJVZ2NYVmxjbmt1Y0dGblpTQjNhWFJvSUhGMVpYSjVJSE52SUhWelpYSnpJR2hoZG1VZ1lXTmpaWE56SUhSdklIUmxjbTBzSUhCaFoyVXNJR1YwWXk1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RITWdQU0J2Y0hScGIyNXpMbkpsYzNWc2RITW9aR0YwWVN3Z2NYVmxjbmt1Y0dGblpTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEYxWlhKNUxtTmhiR3hpWVdOcktISmxjM1ZzZEhNcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYUdGdVpHeGxjaUE5SUhSeVlXNXpjRzl5ZEM1allXeHNLSE5sYkdZc0lIQmhjbUZ0Y3lrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwc0lIRjFhV1YwVFdsc2JHbHpLVHRjY2x4dUlDQWdJQ0FnSUNCOU8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQzhxS2x4eVhHNGdJQ0FnSUNvZ1VISnZaSFZqWlhNZ1lTQnhkV1Z5ZVNCbWRXNWpkR2x2YmlCMGFHRjBJSGR2Y210eklIZHBkR2dnWVNCc2IyTmhiQ0JoY25KaGVWeHlYRzRnSUNBZ0lDcGNjbHh1SUNBZ0lDQXFJRUJ3WVhKaGJTQnZjSFJwYjI1eklHOWlhbVZqZENCamIyNTBZV2x1YVc1bklHTnZibVpwWjNWeVlYUnBiMjRnY0dGeVlXMWxkR1Z5Y3k0Z1ZHaGxJRzl3ZEdsdmJuTWdjR0Z5WVcxbGRHVnlJR05oYmlCbGFYUm9aWElnWW1VZ1lXNGdZWEp5WVhrZ2IzSWdZVzVjY2x4dUlDQWdJQ0FxSUc5aWFtVmpkQzVjY2x4dUlDQWdJQ0FxWEhKY2JpQWdJQ0FnS2lCSlppQjBhR1VnWVhKeVlYa2dabTl5YlNCcGN5QjFjMlZrSUdsMElHbHpJR0Z6YzNWdFpXUWdkR2hoZENCcGRDQmpiMjUwWVdsdWN5QnZZbXBsWTNSeklIZHBkR2dnSjJsa0p5QmhibVFnSjNSbGVIUW5JR3RsZVhNdVhISmNiaUFnSUNBZ0tseHlYRzRnSUNBZ0lDb2dTV1lnZEdobElHOWlhbVZqZENCbWIzSnRJR2x6SUhWelpXUWdkR2tnYVhNZ1lYTnpkVzFsWkNCMGFHRjBJR2wwSUdOdmJuUmhhVzV6SUNka1lYUmhKeUJoYm1RZ0ozUmxlSFFuSUd0bGVYTXVJRlJvWlNBblpHRjBZU2NnYTJWNUlITm9iM1ZzWkNCamIyNTBZV2x1WEhKY2JpQWdJQ0FnS2lCaGJpQmhjbkpoZVNCdlppQnZZbXBsWTNSeklIUm9ZWFFnZDJsc2JDQmlaU0IxYzJWa0lHRnpJR05vYjJsalpYTXVJRlJvWlhObElHOWlhbVZqZEhNZ2JYVnpkQ0JqYjI1MFlXbHVJR0YwSUd4bFlYTjBJR0Z1SUNkcFpDY2dhMlY1TGlCVWFHVWdKM1JsZUhRblhISmNiaUFnSUNBZ0tpQnJaWGtnWTJGdUlHVnBkR2hsY2lCaVpTQmhJRk4wY21sdVp5QnBiaUIzYUdsamFDQmpZWE5sSUdsMElHbHpJR1Y0Y0dWamRHVmtJSFJvWVhRZ1pXRmphQ0JsYkdWdFpXNTBJR2x1SUhSb1pTQW5aR0YwWVNjZ1lYSnlZWGtnYUdGeklHRWdhMlY1SUhkcGRHZ2dkR2hsWEhKY2JpQWdJQ0FnS2lCMllXeDFaU0J2WmlBbmRHVjRkQ2NnZDJocFkyZ2dkMmxzYkNCaVpTQjFjMlZrSUhSdklHMWhkR05vSUdOb2IybGpaWE11SUVGc2RHVnlibUYwYVhabGJIa3NJSFJsZUhRZ1kyRnVJR0psSUdFZ1puVnVZM1JwYjI0b2FYUmxiU2tnZEdoaGRDQmpZVzRnWlhoMGNtRmpkRnh5WEc0Z0lDQWdJQ29nZEdobElIUmxlSFF1WEhKY2JpQWdJQ0FnS2k5Y2NseHVJQ0FnSUdaMWJtTjBhVzl1SUd4dlkyRnNLRzl3ZEdsdmJuTXBJSHRjY2x4dUlDQWdJQ0FnSUNCMllYSWdaR0YwWVNBOUlHOXdkR2x2Ym5Nc0lDOHZJR1JoZEdFZ1pXeGxiV1Z1ZEhOY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWkdGMFlWUmxlSFFzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJ0Y0N4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdWNGRDQTlJR1oxYm1OMGFXOXVJQ2hwZEdWdEtTQjdJSEpsZEhWeWJpQmNJbHdpSzJsMFpXMHVkR1Y0ZERzZ2ZUc2dMeThnWm5WdVkzUnBiMjRnZFhObFpDQjBieUJ5WlhSeWFXVjJaU0IwYUdVZ2RHVjRkQ0J3YjNKMGFXOXVJRzltSUdFZ1pHRjBZU0JwZEdWdElIUm9ZWFFnYVhNZ2JXRjBZMmhsWkNCaFoyRnBibk4wSUhSb1pTQnpaV0Z5WTJoY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUdsbUlDZ2tMbWx6UVhKeVlYa29aR0YwWVNrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHMXdJRDBnWkdGMFlUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pHRjBZU0E5SUhzZ2NtVnpkV3gwY3pvZ2RHMXdJSDA3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ2FXWWdLQ1F1YVhOR2RXNWpkR2x2Ymloa1lYUmhLU0E5UFQwZ1ptRnNjMlVwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEcxd0lEMGdaR0YwWVR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWkdGMFlTQTlJR1oxYm1OMGFXOXVLQ2tnZXlCeVpYUjFjbTRnZEcxd095QjlPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlHUmhkR0ZKZEdWdElEMGdaR0YwWVNncE8xeHlYRzRnSUNBZ0lDQWdJR2xtSUNoa1lYUmhTWFJsYlM1MFpYaDBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJsZUhRZ1BTQmtZWFJoU1hSbGJTNTBaWGgwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCcFppQjBaWGgwSUdseklHNXZkQ0JoSUdaMWJtTjBhVzl1SUhkbElHRnpjM1Z0WlNCcGRDQjBieUJpWlNCaElHdGxlU0J1WVcxbFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2hKQzVwYzBaMWJtTjBhVzl1S0hSbGVIUXBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1lYUmhWR1Y0ZENBOUlHUmhkR0ZKZEdWdExuUmxlSFE3SUM4dklIZGxJRzVsWldRZ2RHOGdjM1J2Y21VZ2RHaHBjeUJwYmlCaElITmxjR0Z5WVhSbElIWmhjbWxoWW14bElHSmxZMkYxYzJVZ2FXNGdkR2hsSUc1bGVIUWdjM1JsY0NCa1lYUmhJR2RsZEhNZ2NtVnpaWFFnWVc1a0lHUmhkR0V1ZEdWNGRDQnBjeUJ1YnlCc2IyNW5aWElnWVhaaGFXeGhZbXhsWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMFpYaDBJRDBnWm5WdVkzUnBiMjRnS0dsMFpXMHBJSHNnY21WMGRYSnVJR2wwWlcxYlpHRjBZVlJsZUhSZE95QjlPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNGdLSEYxWlhKNUtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUIwSUQwZ2NYVmxjbmt1ZEdWeWJTd2dabWxzZEdWeVpXUWdQU0I3SUhKbGMzVnNkSE02SUZ0ZElIMHNJSEJ5YjJObGMzTTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwSUQwOVBTQmNJbHdpS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnhkV1Z5ZVM1allXeHNZbUZqYXloa1lYUmhLQ2twTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCd2NtOWpaWE56SUQwZ1puVnVZM1JwYjI0b1pHRjBkVzBzSUdOdmJHeGxZM1JwYjI0cElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCbmNtOTFjQ3dnWVhSMGNqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JoZEhWdElEMGdaR0YwZFcxYk1GMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pHRjBkVzB1WTJocGJHUnlaVzRwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuY205MWNDQTlJSHQ5TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1p2Y2lBb1lYUjBjaUJwYmlCa1lYUjFiU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aR0YwZFcwdWFHRnpUM2R1VUhKdmNHVnlkSGtvWVhSMGNpa3BJR2R5YjNWd1cyRjBkSEpkUFdSaGRIVnRXMkYwZEhKZE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JuY205MWNDNWphR2xzWkhKbGJqMWJYVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWtLR1JoZEhWdExtTm9hV3hrY21WdUtTNWxZV05vTWlobWRXNWpkR2x2YmlocExDQmphR2xzWkVSaGRIVnRLU0I3SUhCeWIyTmxjM01vWTJocGJHUkVZWFIxYlN3Z1ozSnZkWEF1WTJocGJHUnlaVzRwT3lCOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aM0p2ZFhBdVkyaHBiR1J5Wlc0dWJHVnVaM1JvSUh4OElIRjFaWEo1TG0xaGRHTm9aWElvZEN3Z2RHVjRkQ2huY205MWNDa3NJR1JoZEhWdEtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4c1pXTjBhVzl1TG5CMWMyZ29aM0p2ZFhBcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIRjFaWEo1TG0xaGRHTm9aWElvZEN3Z2RHVjRkQ2hrWVhSMWJTa3NJR1JoZEhWdEtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjJ4c1pXTjBhVzl1TG5CMWMyZ29aR0YwZFcwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ1FvWkdGMFlTZ3BMbkpsYzNWc2RITXBMbVZoWTJneUtHWjFibU4wYVc5dUtHa3NJR1JoZEhWdEtTQjdJSEJ5YjJObGMzTW9aR0YwZFcwc0lHWnBiSFJsY21Wa0xuSmxjM1ZzZEhNcE95QjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjWFZsY25rdVkyRnNiR0poWTJzb1ptbHNkR1Z5WldRcE8xeHlYRzRnSUNBZ0lDQWdJSDA3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0x5OGdWRTlFVHlCcVlYWmhaRzlqWEhKY2JpQWdJQ0JtZFc1amRHbHZiaUIwWVdkektHUmhkR0VwSUh0Y2NseHVJQ0FnSUNBZ0lDQjJZWElnYVhOR2RXNWpJRDBnSkM1cGMwWjFibU4wYVc5dUtHUmhkR0VwTzF4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlBb2NYVmxjbmtwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlIUWdQU0J4ZFdWeWVTNTBaWEp0TENCbWFXeDBaWEpsWkNBOUlIdHlaWE4xYkhSek9pQmJYWDA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ1FvYVhOR2RXNWpJRDhnWkdGMFlTZ3BJRG9nWkdGMFlTa3VaV0ZqYUNobWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2FYTlBZbXBsWTNRZ1BTQjBhR2x6TG5SbGVIUWdJVDA5SUhWdVpHVm1hVzVsWkN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwWlhoMElEMGdhWE5QWW1wbFkzUWdQeUIwYUdsekxuUmxlSFFnT2lCMGFHbHpPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUWdQVDA5SUZ3aVhDSWdmSHdnY1hWbGNua3ViV0YwWTJobGNpaDBMQ0IwWlhoMEtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnBiSFJsY21Wa0xuSmxjM1ZzZEhNdWNIVnphQ2hwYzA5aWFtVmpkQ0EvSUhSb2FYTWdPaUI3YVdRNklIUm9hWE1zSUhSbGVIUTZJSFJvYVhOOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSEYxWlhKNUxtTmhiR3hpWVdOcktHWnBiSFJsY21Wa0tUdGNjbHh1SUNBZ0lDQWdJQ0I5TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDOHFLbHh5WEc0Z0lDQWdJQ29nUTJobFkydHpJR2xtSUhSb1pTQm1iM0p0WVhSMFpYSWdablZ1WTNScGIyNGdjMmh2ZFd4a0lHSmxJSFZ6WldRdVhISmNiaUFnSUNBZ0tseHlYRzRnSUNBZ0lDb2dWR2h5YjNkeklHRnVJR1Z5Y205eUlHbG1JR2wwSUdseklHNXZkQ0JoSUdaMWJtTjBhVzl1TGlCU1pYUjFjbTV6SUhSeWRXVWdhV1lnYVhRZ2MyaHZkV3hrSUdKbElIVnpaV1FzWEhKY2JpQWdJQ0FnS2lCbVlXeHpaU0JwWmlCdWJ5Qm1iM0p0WVhSMGFXNW5JSE5vYjNWc1pDQmlaU0J3WlhKbWIzSnRaV1F1WEhKY2JpQWdJQ0FnS2x4eVhHNGdJQ0FnSUNvZ1FIQmhjbUZ0SUdadmNtMWhkSFJsY2x4eVhHNGdJQ0FnSUNvdlhISmNiaUFnSUNCbWRXNWpkR2x2YmlCamFHVmphMFp2Y20xaGRIUmxjaWhtYjNKdFlYUjBaWElzSUdadmNtMWhkSFJsY2s1aGJXVXBJSHRjY2x4dUlDQWdJQ0FnSUNCcFppQW9KQzVwYzBaMWJtTjBhVzl1S0dadmNtMWhkSFJsY2lrcElISmxkSFZ5YmlCMGNuVmxPMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDZ2habTl5YldGMGRHVnlLU0J5WlhSMWNtNGdabUZzYzJVN1hISmNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtHWnZjbTFoZEhSbGNrNWhiV1VnSzF3aUlHMTFjM1FnWW1VZ1lTQm1kVzVqZEdsdmJpQnZjaUJoSUdaaGJITjVJSFpoYkhWbFhDSXBPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUdaMWJtTjBhVzl1SUdWMllXeDFZWFJsS0haaGJDa2dlMXh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUFrTG1selJuVnVZM1JwYjI0b2RtRnNLU0EvSUhaaGJDZ3BJRG9nZG1Gc08xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJR1oxYm1OMGFXOXVJR052ZFc1MFVtVnpkV3gwY3loeVpYTjFiSFJ6S1NCN1hISmNiaUFnSUNBZ0lDQWdkbUZ5SUdOdmRXNTBJRDBnTUR0Y2NseHVJQ0FnSUNBZ0lDQWtMbVZoWTJnb2NtVnpkV3gwY3l3Z1puVnVZM1JwYjI0b2FTd2dhWFJsYlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hWFJsYlM1amFHbHNaSEpsYmlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjkxYm5RZ0t6MGdZMjkxYm5SU1pYTjFiSFJ6S0dsMFpXMHVZMmhwYkdSeVpXNHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjkxYm5Rckt6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCamIzVnVkRHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNBdktpcGNjbHh1SUNBZ0lDQXFJRVJsWm1GMWJIUWdkRzlyWlc1cGVtVnlMaUJVYUdseklHWjFibU4wYVc5dUlIVnpaWE1nWW5KbFlXdHpJSFJvWlNCcGJuQjFkQ0J2YmlCemRXSnpkSEpwYm1jZ2JXRjBZMmdnYjJZZ1lXNTVJSE4wY21sdVp5Qm1jbTl0SUhSb1pWeHlYRzRnSUNBZ0lDb2diM0IwY3k1MGIydGxibE5sY0dGeVlYUnZjbk1nWVhKeVlYa2dZVzVrSUhWelpYTWdiM0IwY3k1amNtVmhkR1ZUWldGeVkyaERhRzlwWTJVZ2RHOGdZM0psWVhSbElIUm9aU0JqYUc5cFkyVWdiMkpxWldOMExpQkNiM1JvSUc5bUlIUm9iM05sWEhKY2JpQWdJQ0FnS2lCMGQyOGdiM0IwYVc5dWN5Qm9ZWFpsSUhSdklHSmxJR1JsWm1sdVpXUWdhVzRnYjNKa1pYSWdabTl5SUhSb1pTQjBiMnRsYm1sNlpYSWdkRzhnZDI5eWF5NWNjbHh1SUNBZ0lDQXFYSEpjYmlBZ0lDQWdLaUJBY0dGeVlXMGdhVzV3ZFhRZ2RHVjRkQ0IxYzJWeUlHaGhjeUIwZVhCbFpDQnpieUJtWVhJZ2IzSWdjR0Z6ZEdWa0lHbHVkRzhnZEdobElITmxZWEpqYUNCbWFXVnNaRnh5WEc0Z0lDQWdJQ29nUUhCaGNtRnRJSE5sYkdWamRHbHZiaUJqZFhKeVpXNTBiSGtnYzJWc1pXTjBaV1FnWTJodmFXTmxjMXh5WEc0Z0lDQWdJQ29nUUhCaGNtRnRJSE5sYkdWamRFTmhiR3hpWVdOcklHWjFibU4wYVc5dUtHTm9iMmxqWlNrZ1kyRnNiR0poWTJzZ2RHaHZJR0ZrWkNCMGFHVWdZMmh2YVdObElIUnZJSE5sYkdWamRHbHZibHh5WEc0Z0lDQWdJQ29nUUhCaGNtRnRJRzl3ZEhNZ2MyVnNaV04wTWlkeklHOXdkSE5jY2x4dUlDQWdJQ0FxSUVCeVpYUjFjbTRnZFc1a1pXWnBibVZrTDI1MWJHd2dkRzhnYkdWaGRtVWdkR2hsSUdOMWNuSmxiblFnYVc1d2RYUWdkVzVqYUdGdVoyVmtMQ0J2Y2lCaElITjBjbWx1WnlCMGJ5QmphR0Z1WjJVZ2RHaGxJR2x1Y0hWMElIUnZJSFJvWlNCeVpYUjFjbTVsWkNCMllXeDFaVnh5WEc0Z0lDQWdJQ292WEhKY2JpQWdJQ0JtZFc1amRHbHZiaUJrWldaaGRXeDBWRzlyWlc1cGVtVnlLR2x1Y0hWMExDQnpaV3hsWTNScGIyNHNJSE5sYkdWamRFTmhiR3hpWVdOckxDQnZjSFJ6S1NCN1hISmNiaUFnSUNBZ0lDQWdkbUZ5SUc5eWFXZHBibUZzSUQwZ2FXNXdkWFFzSUM4dklITjBiM0psSUhSb1pTQnZjbWxuYVc1aGJDQnpieUIzWlNCallXNGdZMjl0Y0dGeVpTQmhibVFnYTI1dmR5QnBaaUIzWlNCdVpXVmtJSFJ2SUhSbGJHd2dkR2hsSUhObFlYSmphQ0IwYnlCMWNHUmhkR1VnYVhSeklIUmxlSFJjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaSFZ3WlNBOUlHWmhiSE5sTENBdkx5QmphR1ZqYXlCbWIzSWdkMmhsZEdobGNpQmhJSFJ2YTJWdUlIZGxJR1Y0ZEhKaFkzUmxaQ0J5WlhCeVpYTmxiblJ6SUdFZ1pIVndiR2xqWVhSbElITmxiR1ZqZEdWa0lHTm9iMmxqWlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYjJ0bGJpd2dMeThnZEc5clpXNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXNWtaWGdzSUM4dklIQnZjMmwwYVc5dUlHRjBJSGRvYVdOb0lIUm9aU0J6WlhCaGNtRjBiM0lnZDJGeklHWnZkVzVrWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2tzSUd3c0lDOHZJR3h2YjNCcGJtY2dkbUZ5YVdGaWJHVnpYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lITmxjR0Z5WVhSdmNqc2dMeThnZEdobElHMWhkR05vWldRZ2MyVndZWEpoZEc5eVhISmNibHh5WEc0Z0lDQWdJQ0FnSUdsbUlDZ2hiM0IwY3k1amNtVmhkR1ZUWldGeVkyaERhRzlwWTJVZ2ZId2dJVzl3ZEhNdWRHOXJaVzVUWlhCaGNtRjBiM0p6SUh4OElHOXdkSE11ZEc5clpXNVRaWEJoY21GMGIzSnpMbXhsYm1kMGFDQThJREVwSUhKbGRIVnliaUIxYm1SbFptbHVaV1E3WEhKY2JseHlYRzRnSUNBZ0lDQWdJSGRvYVd4bElDaDBjblZsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsdVpHVjRJRDBnTFRFN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQm1iM0lnS0drZ1BTQXdMQ0JzSUQwZ2IzQjBjeTUwYjJ0bGJsTmxjR0Z5WVhSdmNuTXViR1Z1WjNSb095QnBJRHdnYkRzZ2FTc3JLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpYQmhjbUYwYjNJZ1BTQnZjSFJ6TG5SdmEyVnVVMlZ3WVhKaGRHOXljMXRwWFR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbHVaR1Y0SUQwZ2FXNXdkWFF1YVc1a1pYaFBaaWh6WlhCaGNtRjBiM0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR2x1WkdWNElENDlJREFwSUdKeVpXRnJPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXNWtaWGdnUENBd0tTQmljbVZoYXpzZ0x5OGdaR2xrSUc1dmRDQm1hVzVrSUdGdWVTQjBiMnRsYmlCelpYQmhjbUYwYjNJZ2FXNGdkR2hsSUdsdWNIVjBJSE4wY21sdVp5d2dZbUZwYkZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHOXJaVzRnUFNCcGJuQjFkQzV6ZFdKemRISnBibWNvTUN3Z2FXNWtaWGdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwYm5CMWRDQTlJR2x1Y0hWMExuTjFZbk4wY21sdVp5aHBibVJsZUNBcklITmxjR0Z5WVhSdmNpNXNaVzVuZEdncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSdmEyVnVMbXhsYm1kMGFDQStJREFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnZhMlZ1SUQwZ2IzQjBjeTVqY21WaGRHVlRaV0Z5WTJoRGFHOXBZMlV1WTJGc2JDaDBhR2x6TENCMGIydGxiaXdnYzJWc1pXTjBhVzl1S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYjJ0bGJpQWhQVDBnZFc1a1pXWnBibVZrSUNZbUlIUnZhMlZ1SUNFOVBTQnVkV3hzSUNZbUlHOXdkSE11YVdRb2RHOXJaVzRwSUNFOVBTQjFibVJsWm1sdVpXUWdKaVlnYjNCMGN5NXBaQ2gwYjJ0bGJpa2dJVDA5SUc1MWJHd3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtkWEJsSUQwZ1ptRnNjMlU3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabTl5SUNocElEMGdNQ3dnYkNBOUlITmxiR1ZqZEdsdmJpNXNaVzVuZEdnN0lHa2dQQ0JzT3lCcEt5c3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHVnhkV0ZzS0c5d2RITXVhV1FvZEc5clpXNHBMQ0J2Y0hSekxtbGtLSE5sYkdWamRHbHZibHRwWFNrcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2RYQmxJRDBnZEhKMVpUc2dZbkpsWVdzN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doWkhWd1pTa2djMlZzWldOMFEyRnNiR0poWTJzb2RHOXJaVzRwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQnBaaUFvYjNKcFoybHVZV3doUFQxcGJuQjFkQ2tnY21WMGRYSnVJR2x1Y0hWME8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQzhxS2x4eVhHNGdJQ0FnSUNvZ1EzSmxZWFJsY3lCaElHNWxkeUJqYkdGemMxeHlYRzRnSUNBZ0lDcGNjbHh1SUNBZ0lDQXFJRUJ3WVhKaGJTQnpkWEJsY2tOc1lYTnpYSEpjYmlBZ0lDQWdLaUJBY0dGeVlXMGdiV1YwYUc5a2MxeHlYRzRnSUNBZ0lDb3ZYSEpjYmlBZ0lDQm1kVzVqZEdsdmJpQmpiR0Y2ZWloVGRYQmxja05zWVhOekxDQnRaWFJvYjJSektTQjdYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlHTnZibk4wY25WamRHOXlJRDBnWm5WdVkzUnBiMjRnS0NrZ2UzMDdYSEpjYmlBZ0lDQWdJQ0FnWTI5dWMzUnlkV04wYjNJdWNISnZkRzkwZVhCbElEMGdibVYzSUZOMWNHVnlRMnhoYzNNN1hISmNiaUFnSUNBZ0lDQWdZMjl1YzNSeWRXTjBiM0l1Y0hKdmRHOTBlWEJsTG1OdmJuTjBjblZqZEc5eUlEMGdZMjl1YzNSeWRXTjBiM0k3WEhKY2JpQWdJQ0FnSUNBZ1kyOXVjM1J5ZFdOMGIzSXVjSEp2ZEc5MGVYQmxMbkJoY21WdWRDQTlJRk4xY0dWeVEyeGhjM011Y0hKdmRHOTBlWEJsTzF4eVhHNGdJQ0FnSUNBZ0lHTnZibk4wY25WamRHOXlMbkJ5YjNSdmRIbHdaU0E5SUNRdVpYaDBaVzVrS0dOdmJuTjBjblZqZEc5eUxuQnliM1J2ZEhsd1pTd2diV1YwYUc5a2N5azdYSEpjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR052Ym5OMGNuVmpkRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lFRmljM1J5WVdOMFUyVnNaV04wTWlBOUlHTnNZWHA2S0U5aWFtVmpkQ3dnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCaFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lHSnBibVE2SUdaMWJtTjBhVzl1SUNobWRXNWpLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCelpXeG1JRDBnZEdocGN6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1oxYm1NdVlYQndiSGtvYzJWc1ppd2dZWEpuZFcxbGJuUnpLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QmhZbk4wY21GamRGeHlYRzRnSUNBZ0lDQWdJR2x1YVhRNklHWjFibU4wYVc5dUlDaHZjSFJ6S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnlaWE4xYkhSekxDQnpaV0Z5WTJnc0lISmxjM1ZzZEhOVFpXeGxZM1J2Y2lBOUlGd2lMbk5sYkdWamRESXRjbVZ6ZFd4MGMxd2lMQ0JrYVhOaFlteGxaQ3dnY21WaFpHOXViSGs3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QndjbVZ3WVhKbElHOXdkR2x2Ym5OY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjSFJ6SUQwZ2IzQjBjeUE5SUhSb2FYTXVjSEpsY0dGeVpVOXdkSE1vYjNCMGN5azdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtbGtQVzl3ZEhNdWFXUTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCa1pYTjBjbTk1SUdsbUlHTmhiR3hsWkNCdmJpQmhiaUJsZUdsemRHbHVaeUJqYjIxd2IyNWxiblJjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0c5d2RITXVaV3hsYldWdWRDNWtZWFJoS0Z3aWMyVnNaV04wTWx3aUtTQWhQVDBnZFc1a1pXWnBibVZrSUNZbVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZjSFJ6TG1Wc1pXMWxiblF1WkdGMFlTaGNJbk5sYkdWamRESmNJaWtnSVQwOUlHNTFiR3dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOXdkSE11Wld4bGJXVnVkQzVrWVhSaEtGd2ljMlZzWldOME1sd2lLUzVrWlhOMGNtOTVLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdGcGJtVnlJRDBnZEdocGN5NWpjbVZoZEdWRGIyNTBZV2x1WlhJb0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyOXVkR0ZwYm1WeVNXUTlYQ0p6TW1sa1gxd2lLeWh2Y0hSekxtVnNaVzFsYm5RdVlYUjBjaWhjSW1sa1hDSXBJSHg4SUZ3aVlYVjBiMmRsYmx3aUsyNWxlSFJWYVdRb0tTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTI5dWRHRnBibVZ5VTJWc1pXTjBiM0k5WENJalhDSXJkR2hwY3k1amIyNTBZV2x1WlhKSlpDNXlaWEJzWVdObEtDOG9XenNtTEZ4Y0xseGNLMXhjS2x4Y2ZpYzZYQ0pjWENGY1hGNGpKQ1ZBWEZ4YlhGeGRYRndvWEZ3cFBUNWNYSHhkS1M5bkxDQW5YRnhjWENReEp5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTI5dWRHRnBibVZ5TG1GMGRISW9YQ0pwWkZ3aUxDQjBhR2x6TG1OdmJuUmhhVzVsY2tsa0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdOaFkyaGxJSFJvWlNCaWIyUjVJSE52SUdaMWRIVnlaU0JzYjI5cmRYQnpJR0Z5WlNCamFHVmhjRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1KdlpIa2dQU0IwYUhWdWF5aG1kVzVqZEdsdmJpZ3BJSHNnY21WMGRYSnVJRzl3ZEhNdVpXeGxiV1Z1ZEM1amJHOXpaWE4wS0Z3aVltOWtlVndpS1RzZ2ZTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J6ZVc1alEzTnpRMnhoYzNObGN5aDBhR2x6TG1OdmJuUmhhVzVsY2l3Z2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5Rc0lIUm9hWE11YjNCMGN5NWhaR0Z3ZEVOdmJuUmhhVzVsY2tOemMwTnNZWE56S1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTI5dWRHRnBibVZ5TG1GMGRISW9YQ0p6ZEhsc1pWd2lMQ0J2Y0hSekxtVnNaVzFsYm5RdVlYUjBjaWhjSW5OMGVXeGxYQ0lwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiMjUwWVdsdVpYSXVZM056S0dWMllXeDFZWFJsS0c5d2RITXVZMjl1ZEdGcGJtVnlRM056S1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdGcGJtVnlMbUZrWkVOc1lYTnpLR1YyWVd4MVlYUmxLRzl3ZEhNdVkyOXVkR0ZwYm1WeVEzTnpRMnhoYzNNcEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpXeGxiV1Z1ZEZSaFlrbHVaR1Y0SUQwZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdVlYUjBjaWhjSW5SaFltbHVaR1Y0WENJcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnYzNkaGNDQmpiMjUwWVdsdVpYSWdabTl5SUhSb1pTQmxiR1Z0Wlc1MFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdVpHRjBZU2hjSW5ObGJHVmpkREpjSWl3Z2RHaHBjeWxjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM1aGRIUnlLRndpZEdGaWFXNWtaWGhjSWl3Z1hDSXRNVndpS1Z4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0xtSmxabTl5WlNoMGFHbHpMbU52Ym5SaGFXNWxjaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyOXVkR0ZwYm1WeUxtUmhkR0VvWENKelpXeGxZM1F5WENJc0lIUm9hWE1wTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVrY205d1pHOTNiaUE5SUhSb2FYTXVZMjl1ZEdGcGJtVnlMbVpwYm1Rb1hDSXVjMlZzWldOME1pMWtjbTl3WENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVJ5YjNCa2IzZHVMbUZrWkVOc1lYTnpLR1YyWVd4MVlYUmxLRzl3ZEhNdVpISnZjR1J2ZDI1RGMzTkRiR0Z6Y3lrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVJ5YjNCa2IzZHVMbVJoZEdFb1hDSnpaV3hsWTNReVhDSXNJSFJvYVhNcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjM2x1WTBOemMwTnNZWE56WlhNb2RHaHBjeTVrY205d1pHOTNiaXdnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblFzSUhSb2FYTXViM0IwY3k1aFpHRndkRVJ5YjNCa2IzZHVRM056UTJ4aGMzTXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXlaWE4xYkhSeklEMGdjbVZ6ZFd4MGN5QTlJSFJvYVhNdVkyOXVkR0ZwYm1WeUxtWnBibVFvY21WemRXeDBjMU5sYkdWamRHOXlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXRnlZMmdnUFNCelpXRnlZMmdnUFNCMGFHbHpMbU52Ym5SaGFXNWxjaTVtYVc1a0tGd2lhVzV3ZFhRdWMyVnNaV04wTWkxcGJuQjFkRndpS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y1hWbGNubERiM1Z1ZENBOUlEQTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y21WemRXeDBjMUJoWjJVZ1BTQXdPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1OdmJuUmxlSFFnUFNCdWRXeHNPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FXNXBkR2xoYkdsNlpTQjBhR1VnWTI5dWRHRnBibVZ5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWFXNXBkRU52Ym5SaGFXNWxjaWdwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXNXpkR0ZzYkVacGJIUmxjbVZrVFc5MWMyVk5iM1psS0hSb2FYTXVjbVZ6ZFd4MGN5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WkhKdmNHUnZkMjR1YjI0b1hDSnRiM1Z6WlcxdmRtVXRabWxzZEdWeVpXUWdkRzkxWTJoemRHRnlkQ0IwYjNWamFHMXZkbVVnZEc5MVkyaGxibVJjSWl3Z2NtVnpkV3gwYzFObGJHVmpkRzl5TENCMGFHbHpMbUpwYm1Rb2RHaHBjeTVvYVdkb2JHbG5hSFJWYm1SbGNrVjJaVzUwS1NrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBibk4wWVd4c1JHVmliM1Z1WTJWa1UyTnliMnhzS0Rnd0xDQjBhR2x6TG5KbGMzVnNkSE1wTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtUnliM0JrYjNkdUxtOXVLRndpYzJOeWIyeHNMV1JsWW05MWJtTmxaRndpTENCeVpYTjFiSFJ6VTJWc1pXTjBiM0lzSUhSb2FYTXVZbWx1WkNoMGFHbHpMbXh2WVdSTmIzSmxTV1pPWldWa1pXUXBLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHUnZJRzV2ZENCd2NtOXdZV2RoZEdVZ1kyaGhibWRsSUdWMlpXNTBJR1p5YjIwZ2RHaGxJSE5sWVhKamFDQm1hV1ZzWkNCdmRYUWdiMllnZEdobElHTnZiWEJ2Ym1WdWRGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBa0tIUm9hWE11WTI5dWRHRnBibVZ5S1M1dmJpaGNJbU5vWVc1blpWd2lMQ0JjSWk1elpXeGxZM1F5TFdsdWNIVjBYQ0lzSUdaMWJtTjBhVzl1S0dVcElIdGxMbk4wYjNCUWNtOXdZV2RoZEdsdmJpZ3BPMzBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FrS0hSb2FYTXVaSEp2Y0dSdmQyNHBMbTl1S0Z3aVkyaGhibWRsWENJc0lGd2lMbk5sYkdWamRESXRhVzV3ZFhSY0lpd2dablZ1WTNScGIyNG9aU2tnZTJVdWMzUnZjRkJ5YjNCaFoyRjBhVzl1S0NrN2ZTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCcFppQnFjWFZsY25rdWJXOTFjMlYzYUdWbGJDQndiSFZuYVc0Z2FYTWdhVzV6ZEdGc2JHVmtJSGRsSUdOaGJpQndjbVYyWlc1MElHOTFkQzF2WmkxaWIzVnVaSE1nYzJOeWIyeHNhVzVuSUc5bUlISmxjM1ZzZEhNZ2RtbGhJRzF2ZFhObGQyaGxaV3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NRdVptNHViVzkxYzJWM2FHVmxiQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwY3k1dGIzVnpaWGRvWldWc0tHWjFibU4wYVc5dUlDaGxMQ0JrWld4MFlTd2daR1ZzZEdGWUxDQmtaV3gwWVZrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdkRzl3SUQwZ2NtVnpkV3gwY3k1elkzSnZiR3hVYjNBb0tTd2dhR1ZwWjJoME8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGtaV3gwWVZrZ1BpQXdJQ1ltSUhSdmNDQXRJR1JsYkhSaFdTQThQU0F3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEhNdWMyTnliMnhzVkc5d0tEQXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JyYVd4c1JYWmxiblFvWlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoa1pXeDBZVmtnUENBd0lDWW1JSEpsYzNWc2RITXVaMlYwS0RBcExuTmpjbTlzYkVobGFXZG9kQ0F0SUhKbGMzVnNkSE11YzJOeWIyeHNWRzl3S0NrZ0t5QmtaV3gwWVZrZ1BEMGdjbVZ6ZFd4MGN5NW9aV2xuYUhRb0tTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUnpMbk5qY205c2JGUnZjQ2h5WlhOMWJIUnpMbWRsZENnd0tTNXpZM0p2Ykd4SVpXbG5hSFFnTFNCeVpYTjFiSFJ6TG1obGFXZG9kQ2dwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2EybHNiRVYyWlc1MEtHVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcGJuTjBZV3hzUzJWNVZYQkRhR0Z1WjJWRmRtVnVkQ2h6WldGeVkyZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnpaV0Z5WTJndWIyNG9YQ0pyWlhsMWNDMWphR0Z1WjJVZ2FXNXdkWFFnY0dGemRHVmNJaXdnZEdocGN5NWlhVzVrS0hSb2FYTXVkWEJrWVhSbFVtVnpkV3gwY3lrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCelpXRnlZMmd1YjI0b1hDSm1iMk4xYzF3aUxDQm1kVzVqZEdsdmJpQW9LU0I3SUhObFlYSmphQzVoWkdSRGJHRnpjeWhjSW5ObGJHVmpkREl0Wm05amRYTmxaRndpS1RzZ2ZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lITmxZWEpqYUM1dmJpaGNJbUpzZFhKY0lpd2dablZ1WTNScGIyNGdLQ2tnZXlCelpXRnlZMmd1Y21WdGIzWmxRMnhoYzNNb1hDSnpaV3hsWTNReUxXWnZZM1Z6WldSY0lpazdmU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVJ5YjNCa2IzZHVMbTl1S0Z3aWJXOTFjMlYxY0Z3aUxDQnlaWE4xYkhSelUyVnNaV04wYjNJc0lIUm9hWE11WW1sdVpDaG1kVzVqZEdsdmJpQW9aU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ1FvWlM1MFlYSm5aWFFwTG1Oc2IzTmxjM1FvWENJdWMyVnNaV04wTWkxeVpYTjFiSFF0YzJWc1pXTjBZV0pzWlZ3aUtTNXNaVzVuZEdnZ1BpQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1b2FXZG9iR2xuYUhSVmJtUmxja1YyWlc1MEtHVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWc1pXTjBTR2xuYUd4cFoyaDBaV1FvWlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklIUnlZWEFnWVd4c0lHMXZkWE5sSUdWMlpXNTBjeUJtY205dElHeGxZWFpwYm1jZ2RHaGxJR1J5YjNCa2IzZHVMaUJ6YjIxbGRHbHRaWE1nZEdobGNtVWdiV0Y1SUdKbElHRWdiVzlrWVd3Z2RHaGhkQ0JwY3lCc2FYTjBaVzVwYm1kY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1ptOXlJRzF2ZFhObElHVjJaVzUwY3lCdmRYUnphV1JsSUc5bUlHbDBjMlZzWmlCemJ5QnBkQ0JqWVc0Z1kyeHZjMlVnYVhSelpXeG1MaUJ6YVc1alpTQjBhR1VnWkhKdmNHUnZkMjRnYVhNZ2JtOTNJRzkxZEhOcFpHVWdkR2hsSUhObGJHVmpkREluYzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCa2IyMGdhWFFnZDJsc2JDQjBjbWxuWjJWeUlIUm9aU0J3YjNCMWNDQmpiRzl6WlN3Z2QyaHBZMmdnYVhNZ2JtOTBJSGRvWVhRZ2QyVWdkMkZ1ZEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtUnliM0JrYjNkdUxtOXVLRndpWTJ4cFkyc2diVzkxYzJWMWNDQnRiM1Z6WldSdmQyNWNJaXdnWm5WdVkzUnBiMjRnS0dVcElIc2daUzV6ZEc5d1VISnZjR0ZuWVhScGIyNG9LVHNnZlNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSkM1cGMwWjFibU4wYVc5dUtIUm9hWE11YjNCMGN5NXBibWwwVTJWc1pXTjBhVzl1S1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnYVc1cGRHbGhiR2w2WlNCelpXeGxZM1JwYjI0Z1ltRnpaV1FnYjI0Z2RHaGxJR04xY25KbGJuUWdkbUZzZFdVZ2IyWWdkR2hsSUhOdmRYSmpaU0JsYkdWdFpXNTBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtbHVhWFJUWld4bFkzUnBiMjRvS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCcFppQjBhR1VnZFhObGNpQm9ZWE1nY0hKdmRtbGtaV1FnWVNCbWRXNWpkR2x2YmlCMGFHRjBJR05oYmlCelpYUWdjMlZzWldOMGFXOXVJR0poYzJWa0lHOXVJSFJvWlNCMllXeDFaU0J2WmlCMGFHVWdjMjkxY21ObElHVnNaVzFsYm5SY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSGRsSUcxdmJtbDBiM0lnZEdobElHTm9ZVzVuWlNCbGRtVnVkQ0J2YmlCMGFHVWdaV3hsYldWdWRDQmhibVFnZEhKcFoyZGxjaUJwZEN3Z1lXeHNiM2RwYm1jZ1ptOXlJSFIzYnlCM1lYa2djM2x1WTJoeWIyNXBlbUYwYVc5dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG0xdmJtbDBiM0pUYjNWeVkyVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHOXdkSE11YldGNGFXMTFiVWx1Y0hWMFRHVnVaM1JvSUNFOVBTQnVkV3hzS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphQzVoZEhSeUtGd2liV0Y0YkdWdVozUm9YQ0lzSUc5d2RITXViV0Y0YVcxMWJVbHVjSFYwVEdWdVozUm9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHUnBjMkZpYkdWa0lEMGdiM0IwY3k1bGJHVnRaVzUwTG5CeWIzQW9YQ0prYVhOaFlteGxaRndpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHUnBjMkZpYkdWa0lEMDlQU0IxYm1SbFptbHVaV1FwSUdScGMyRmliR1ZrSUQwZ1ptRnNjMlU3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpXNWhZbXhsS0NGa2FYTmhZbXhsWkNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnY21WaFpHOXViSGtnUFNCdmNIUnpMbVZzWlcxbGJuUXVjSEp2Y0NoY0luSmxZV1J2Ym14NVhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvY21WaFpHOXViSGtnUFQwOUlIVnVaR1ZtYVc1bFpDa2djbVZoWkc5dWJIa2dQU0JtWVd4elpUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV5WldGa2IyNXNlU2h5WldGa2IyNXNlU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QkRZV3hqZFd4aGRHVWdjMmw2WlNCdlppQnpZM0p2Ykd4aVlYSmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2MyTnliMnhzUW1GeVJHbHRaVzV6YVc5dWN5QTlJSE5qY205c2JFSmhja1JwYldWdWMybHZibk1nZkh3Z2JXVmhjM1Z5WlZOamNtOXNiR0poY2lncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1aGRYUnZabTlqZFhNZ1BTQnZjSFJ6TG1Wc1pXMWxiblF1Y0hKdmNDaGNJbUYxZEc5bWIyTjFjMXdpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYjNCMGN5NWxiR1Z0Wlc1MExuQnliM0FvWENKaGRYUnZabTlqZFhOY0lpd2dabUZzYzJVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1aGRYUnZabTlqZFhNcElIUm9hWE11Wm05amRYTW9LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVibVY0ZEZObFlYSmphRlJsY20wZ1BTQjFibVJsWm1sdVpXUTdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z1lXSnpkSEpoWTNSY2NseHVJQ0FnSUNBZ0lDQmtaWE4wY205NU9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCbGJHVnRaVzUwUFhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTENCelpXeGxZM1F5SUQwZ1pXeGxiV1Z1ZEM1a1lYUmhLRndpYzJWc1pXTjBNbHdpS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTJ4dmMyVW9LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG5CeWIzQmxjblI1VDJKelpYSjJaWElwSUhzZ1pHVnNaWFJsSUhSb2FYTXVjSEp2Y0dWeWRIbFBZbk5sY25abGNqc2dkR2hwY3k1d2NtOXdaWEowZVU5aWMyVnlkbVZ5SUQwZ2JuVnNiRHNnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSE5sYkdWamRESWdJVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWldOME1pNWpiMjUwWVdsdVpYSXVjbVZ0YjNabEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6Wld4bFkzUXlMbVJ5YjNCa2IzZHVMbkpsYlc5MlpTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWld4bGJXVnVkRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDNXlaVzF2ZG1WRGJHRnpjeWhjSW5ObGJHVmpkREl0YjJabWMyTnlaV1Z1WENJcFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTG5KbGJXOTJaVVJoZEdFb1hDSnpaV3hsWTNReVhDSXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0xtOW1aaWhjSWk1elpXeGxZM1F5WENJcFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTG5CeWIzQW9YQ0poZFhSdlptOWpkWE5jSWl3Z2RHaHBjeTVoZFhSdlptOWpkWE1nZkh3Z1ptRnNjMlVwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdVpXeGxiV1Z1ZEZSaFlrbHVaR1Y0S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWld4bGJXVnVkQzVoZEhSeUtIdDBZV0pwYm1SbGVEb2dkR2hwY3k1bGJHVnRaVzUwVkdGaVNXNWtaWGg5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWld4bGJXVnVkQzV5WlcxdmRtVkJkSFJ5S0Z3aWRHRmlhVzVrWlhoY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJHVnRaVzUwTG5Ob2IzY29LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklHRmljM1J5WVdOMFhISmNiaUFnSUNBZ0lDQWdiM0IwYVc5dVZHOUVZWFJoT2lCbWRXNWpkR2x2YmlobGJHVnRaVzUwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxiR1Z0Wlc1MExtbHpLRndpYjNCMGFXOXVYQ0lwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsa09tVnNaVzFsYm5RdWNISnZjQ2hjSW5aaGJIVmxYQ0lwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJsZUhRNlpXeGxiV1Z1ZEM1MFpYaDBLQ2tzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaV3hsYldWdWREb2daV3hsYldWdWRDNW5aWFFvS1N4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYzNNNklHVnNaVzFsYm5RdVlYUjBjaWhjSW1Oc1lYTnpYQ0lwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwYzJGaWJHVmtPaUJsYkdWdFpXNTBMbkJ5YjNBb1hDSmthWE5oWW14bFpGd2lLU3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMk5yWldRNklHVnhkV0ZzS0dWc1pXMWxiblF1WVhSMGNpaGNJbXh2WTJ0bFpGd2lLU3dnWENKc2IyTnJaV1JjSWlrZ2ZId2daWEYxWVd3b1pXeGxiV1Z1ZEM1a1lYUmhLRndpYkc5amEyVmtYQ0lwTENCMGNuVmxLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNobGJHVnRaVzUwTG1sektGd2liM0IwWjNKdmRYQmNJaWtwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdWNGREcGxiR1Z0Wlc1MExtRjBkSElvWENKc1lXSmxiRndpS1N4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYUdsc1pISmxianBiWFN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYkdWdFpXNTBPaUJsYkdWdFpXNTBMbWRsZENncExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOemN6b2daV3hsYldWdWRDNWhkSFJ5S0Z3aVkyeGhjM05jSWlsY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCaFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lIQnlaWEJoY21WUGNIUnpPaUJtZFc1amRHbHZiaUFvYjNCMGN5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnWld4bGJXVnVkQ3dnYzJWc1pXTjBMQ0JwWkV0bGVTd2dZV3BoZUZWeWJDd2djMlZzWmlBOUlIUm9hWE03WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCbGJHVnRaVzUwSUQwZ2IzQjBjeTVsYkdWdFpXNTBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHVnNaVzFsYm5RdVoyVjBLREFwTG5SaFowNWhiV1V1ZEc5TWIzZGxja05oYzJVb0tTQTlQVDBnWENKelpXeGxZM1JjSWlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXeGxZM1FnUFNCelpXeGxZM1FnUFNCdmNIUnpMbVZzWlcxbGJuUTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoelpXeGxZM1FwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSFJvWlhObElHOXdkR2x2Ym5NZ1lYSmxJRzV2ZENCaGJHeHZkMlZrSUhkb1pXNGdZWFIwWVdOb1pXUWdkRzhnWVNCelpXeGxZM1FnWW1WallYVnpaU0IwYUdWNUlHRnlaU0J3YVdOclpXUWdkWEFnYjJabUlIUm9aU0JsYkdWdFpXNTBJR2wwYzJWc1pseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKQzVsWVdOb0tGdGNJbWxrWENJc0lGd2liWFZzZEdsd2JHVmNJaXdnWENKaGFtRjRYQ0lzSUZ3aWNYVmxjbmxjSWl3Z1hDSmpjbVZoZEdWVFpXRnlZMmhEYUc5cFkyVmNJaXdnWENKcGJtbDBVMlZzWldOMGFXOXVYQ0lzSUZ3aVpHRjBZVndpTENCY0luUmhaM05jSWwwc0lHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5QnBiaUJ2Y0hSektTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGNJazl3ZEdsdmJpQW5YQ0lnS3lCMGFHbHpJQ3NnWENJbklHbHpJRzV2ZENCaGJHeHZkMlZrSUdadmNpQlRaV3hsWTNReUlIZG9aVzRnWVhSMFlXTm9aV1FnZEc4Z1lTQThjMlZzWldOMFBpQmxiR1Z0Wlc1MExsd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2IzQjBjeUE5SUNRdVpYaDBaVzVrS0h0OUxDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3YjNCMWJHRjBaVkpsYzNWc2RITTZJR1oxYm1OMGFXOXVLR052Ym5SaGFXNWxjaXdnY21WemRXeDBjeXdnY1hWbGNua3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnY0c5d2RXeGhkR1VzSUNCa1lYUmhMQ0J5WlhOMWJIUXNJR05vYVd4a2NtVnVMQ0JwWkQxMGFHbHpMbTl3ZEhNdWFXUTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJ2Y0hWc1lYUmxQV1oxYm1OMGFXOXVLSEpsYzNWc2RITXNJR052Ym5SaGFXNWxjaXdnWkdWd2RHZ3BJSHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJwTENCc0xDQnlaWE4xYkhRc0lITmxiR1ZqZEdGaWJHVXNJR1JwYzJGaWJHVmtMQ0JqYjIxd2IzVnVaQ3dnYm05a1pTd2diR0ZpWld3c0lHbHVibVZ5UTI5dWRHRnBibVZ5TENCbWIzSnRZWFIwWldRN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUnpJRDBnYjNCMGN5NXpiM0owVW1WemRXeDBjeWh5WlhOMWJIUnpMQ0JqYjI1MFlXbHVaWElzSUhGMVpYSjVLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnZjaUFvYVNBOUlEQXNJR3dnUFNCeVpYTjFiSFJ6TG14bGJtZDBhRHNnYVNBOElHdzdJR2tnUFNCcElDc2dNU2tnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkRDF5WlhOMWJIUnpXMmxkTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdScGMyRmliR1ZrSUQwZ0tISmxjM1ZzZEM1a2FYTmhZbXhsWkNBOVBUMGdkSEoxWlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6Wld4bFkzUmhZbXhsSUQwZ0tDRmthWE5oWW14bFpDa2dKaVlnS0dsa0tISmxjM1ZzZENrZ0lUMDlJSFZ1WkdWbWFXNWxaQ2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5dGNHOTFibVE5Y21WemRXeDBMbU5vYVd4a2NtVnVJQ1ltSUhKbGMzVnNkQzVqYUdsc1pISmxiaTVzWlc1bmRHZ2dQaUF3TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1dlpHVTlKQ2hjSWp4c2FUNDhMMnhwUGx3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1dlpHVXVZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMWEpsYzNWc2RITXRaR1Z3ZEMxY0lpdGtaWEIwYUNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1YjJSbExtRmtaRU5zWVhOektGd2ljMlZzWldOME1pMXlaWE4xYkhSY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdWIyUmxMbUZrWkVOc1lYTnpLSE5sYkdWamRHRmliR1VnUHlCY0luTmxiR1ZqZERJdGNtVnpkV3gwTFhObGJHVmpkR0ZpYkdWY0lpQTZJRndpYzJWc1pXTjBNaTF5WlhOMWJIUXRkVzV6Wld4bFkzUmhZbXhsWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHUnBjMkZpYkdWa0tTQjdJRzV2WkdVdVlXUmtRMnhoYzNNb1hDSnpaV3hsWTNReUxXUnBjMkZpYkdWa1hDSXBPeUI5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWTI5dGNHOTFibVFwSUhzZ2JtOWtaUzVoWkdSRGJHRnpjeWhjSW5ObGJHVmpkREl0Y21WemRXeDBMWGRwZEdndFkyaHBiR1J5Wlc1Y0lpazdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNXZaR1V1WVdSa1EyeGhjM01vYzJWc1ppNXZjSFJ6TG1admNtMWhkRkpsYzNWc2RFTnpjME5zWVhOektISmxjM1ZzZENrcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHeGhZbVZzUFNRb1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ2hjSW1ScGRsd2lLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZV0psYkM1aFpHUkRiR0Z6Y3loY0luTmxiR1ZqZERJdGNtVnpkV3gwTFd4aFltVnNYQ0lwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdadmNtMWhkSFJsWkQxdmNIUnpMbVp2Y20xaGRGSmxjM1ZzZENoeVpYTjFiSFFzSUd4aFltVnNMQ0J4ZFdWeWVTd2djMlZzWmk1dmNIUnpMbVZ6WTJGd1pVMWhjbXQxY0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1ptOXliV0YwZEdWa0lUMDlkVzVrWldacGJtVmtLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdGaVpXd3VhSFJ0YkNobWIzSnRZWFIwWldRcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc1dlpHVXVZWEJ3Wlc1a0tHeGhZbVZzS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZMjl0Y0c5MWJtUXBJSHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXNXVaWEpEYjI1MFlXbHVaWEk5SkNoY0lqeDFiRDQ4TDNWc1Bsd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwYm01bGNrTnZiblJoYVc1bGNpNWhaR1JEYkdGemN5aGNJbk5sYkdWamRESXRjbVZ6ZFd4MExYTjFZbHdpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd2IzQjFiR0YwWlNoeVpYTjFiSFF1WTJocGJHUnlaVzRzSUdsdWJtVnlRMjl1ZEdGcGJtVnlMQ0JrWlhCMGFDc3hLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J1YjJSbExtRndjR1Z1WkNocGJtNWxja052Ym5SaGFXNWxjaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibTlrWlM1a1lYUmhLRndpYzJWc1pXTjBNaTFrWVhSaFhDSXNJSEpsYzNWc2RDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyNTBZV2x1WlhJdVlYQndaVzVrS0c1dlpHVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0c5d2RXeGhkR1VvY21WemRXeDBjeXdnWTI5dWRHRnBibVZ5TENBd0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU3dnSkM1bWJpNXpaV3hsWTNReUxtUmxabUYxYkhSekxDQnZjSFJ6S1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwZVhCbGIyWW9iM0IwY3k1cFpDa2dJVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdSTFpYa2dQU0J2Y0hSekxtbGtPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjNCMGN5NXBaQ0E5SUdaMWJtTjBhVzl1SUNobEtTQjdJSEpsZEhWeWJpQmxXMmxrUzJWNVhUc2dmVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDUXVhWE5CY25KaGVTaHZjSFJ6TG1Wc1pXMWxiblF1WkdGMFlTaGNJbk5sYkdWamRESlVZV2R6WENJcEtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tGd2lkR0ZuYzF3aUlHbHVJRzl3ZEhNcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFISnZkeUJjSW5SaFozTWdjM0JsWTJsbWFXVmtJR0Z6SUdKdmRHZ2dZVzRnWVhSMGNtbGlkWFJsSUNka1lYUmhMWE5sYkdWamRESXRkR0ZuY3ljZ1lXNWtJR2x1SUc5d2RHbHZibk1nYjJZZ1UyVnNaV04wTWlCY0lpQXJJRzl3ZEhNdVpXeGxiV1Z1ZEM1aGRIUnlLRndpYVdSY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmNIUnpMblJoWjNNOWIzQjBjeTVsYkdWdFpXNTBMbVJoZEdFb1hDSnpaV3hsWTNReVZHRm5jMXdpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSE5sYkdWamRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjNCMGN5NXhkV1Z5ZVNBOUlIUm9hWE11WW1sdVpDaG1kVzVqZEdsdmJpQW9jWFZsY25rcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdaR0YwWVNBOUlIc2djbVZ6ZFd4MGN6b2dXMTBzSUcxdmNtVTZJR1poYkhObElIMHNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJsY20wZ1BTQnhkV1Z5ZVM1MFpYSnRMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYUdsc1pISmxiaXdnY0d4aFkyVm9iMnhrWlhKUGNIUnBiMjRzSUhCeWIyTmxjM003WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCeWIyTmxjM005Wm5WdVkzUnBiMjRvWld4bGJXVnVkQ3dnWTI5c2JHVmpkR2x2YmlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWjNKdmRYQTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobGJHVnRaVzUwTG1sektGd2liM0IwYVc5dVhDSXBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvY1hWbGNua3ViV0YwWTJobGNpaDBaWEp0TENCbGJHVnRaVzUwTG5SbGVIUW9LU3dnWld4bGJXVnVkQ2twSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyeHNaV04wYVc5dUxuQjFjMmdvYzJWc1ppNXZjSFJwYjI1VWIwUmhkR0VvWld4bGJXVnVkQ2twTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dWc1pXMWxiblF1YVhNb1hDSnZjSFJuY205MWNGd2lLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaM0p2ZFhBOWMyVnNaaTV2Y0hScGIyNVViMFJoZEdFb1pXeGxiV1Z1ZENrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYkdWdFpXNTBMbU5vYVd4a2NtVnVLQ2t1WldGamFESW9ablZ1WTNScGIyNG9hU3dnWld4dEtTQjdJSEJ5YjJObGMzTW9aV3h0TENCbmNtOTFjQzVqYUdsc1pISmxiaWs3SUgwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHZHliM1Z3TG1Ob2FXeGtjbVZ1TG14bGJtZDBhRDR3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXNiR1ZqZEdsdmJpNXdkWE5vS0dkeWIzVndLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMDdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05vYVd4a2NtVnVQV1ZzWlcxbGJuUXVZMmhwYkdSeVpXNG9LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FXZHViM0psSUhSb1pTQndiR0ZqWldodmJHUmxjaUJ2Y0hScGIyNGdhV1lnZEdobGNtVWdhWE1nYjI1bFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11WjJWMFVHeGhZMlZvYjJ4a1pYSW9LU0FoUFQwZ2RXNWtaV1pwYm1Wa0lDWW1JR05vYVd4a2NtVnVMbXhsYm1kMGFDQStJREFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NHeGhZMlZvYjJ4a1pYSlBjSFJwYjI0Z1BTQjBhR2x6TG1kbGRGQnNZV05sYUc5c1pHVnlUM0IwYVc5dUtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNod2JHRmpaV2h2YkdSbGNrOXdkR2x2YmlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJocGJHUnlaVzQ5WTJocGJHUnlaVzR1Ym05MEtIQnNZV05sYUc5c1pHVnlUM0IwYVc5dUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMmhwYkdSeVpXNHVaV0ZqYURJb1puVnVZM1JwYjI0b2FTd2daV3h0S1NCN0lIQnliMk5sYzNNb1pXeHRMQ0JrWVhSaExuSmxjM1ZzZEhNcE95QjlLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY1hWbGNua3VZMkZzYkdKaFkyc29aR0YwWVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklIUm9hWE1nYVhNZ2JtVmxaR1ZrSUdKbFkyRjFjMlVnYVc1emFXUmxJSFpoYkNncElIZGxJR052Ym5OMGNuVmpkQ0JqYUc5cFkyVnpJR1p5YjIwZ2IzQjBhVzl1Y3lCaGJtUWdkR2hsY21VZ2FXUWdhWE1nYUdGeVpHTnZaR1ZrWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmNIUnpMbWxrUFdaMWJtTjBhVzl1S0dVcElIc2djbVYwZFhKdUlHVXVhV1E3SUgwN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZjSFJ6TG1admNtMWhkRkpsYzNWc2RFTnpjME5zWVhOeklEMGdablZ1WTNScGIyNG9aR0YwWVNrZ2V5QnlaWFIxY200Z1pHRjBZUzVqYzNNN0lIMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVNoY0luRjFaWEo1WENJZ2FXNGdiM0IwY3lrcElIdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0Z3aVlXcGhlRndpSUdsdUlHOXdkSE1wSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1lXcGhlRlZ5YkNBOUlHOXdkSE11Wld4bGJXVnVkQzVrWVhSaEtGd2lZV3BoZUMxMWNteGNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGhhbUY0VlhKc0lDWW1JR0ZxWVhoVmNtd3ViR1Z1WjNSb0lENGdNQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM0IwY3k1aGFtRjRMblZ5YkNBOUlHRnFZWGhWY213N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM0IwY3k1eGRXVnllU0E5SUdGcVlYZ3VZMkZzYkNodmNIUnpMbVZzWlcxbGJuUXNJRzl3ZEhNdVlXcGhlQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hjSW1SaGRHRmNJaUJwYmlCdmNIUnpLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5d2RITXVjWFZsY25rZ1BTQnNiMk5oYkNodmNIUnpMbVJoZEdFcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1hDSjBZV2R6WENJZ2FXNGdiM0IwY3lrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZjSFJ6TG5GMVpYSjVJRDBnZEdGbmN5aHZjSFJ6TG5SaFozTXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2IzQjBjeTVqY21WaGRHVlRaV0Z5WTJoRGFHOXBZMlVnUFQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzQjBjeTVqY21WaGRHVlRaV0Z5WTJoRGFHOXBZMlVnUFNCbWRXNWpkR2x2YmlBb2RHVnliU2tnZXlCeVpYUjFjbTRnZTJsa09pQWtMblJ5YVcwb2RHVnliU2tzSUhSbGVIUTZJQ1F1ZEhKcGJTaDBaWEp0S1gwN0lIMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHOXdkSE11YVc1cGRGTmxiR1ZqZEdsdmJpQTlQVDBnZFc1a1pXWnBibVZrS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2Y0hSekxtbHVhWFJUWld4bFkzUnBiMjRnUFNCbWRXNWpkR2x2YmlBb1pXeGxiV1Z1ZEN3Z1kyRnNiR0poWTJzcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWkdGMFlTQTlJRnRkTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNRb2MzQnNhWFJXWVd3b1pXeGxiV1Z1ZEM1MllXd29LU3dnYjNCMGN5NXpaWEJoY21GMGIzSXBLUzVsWVdOb0tHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR2xrSUQwZ2RHaHBjeXdnZEdWNGRDQTlJSFJvYVhNc0lIUmhaM005YjNCMGN5NTBZV2R6TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSkM1cGMwWjFibU4wYVc5dUtIUmhaM01wS1NCMFlXZHpQWFJoWjNNb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkNoMFlXZHpLUzVsWVdOb0tHWjFibU4wYVc5dUtDa2dleUJwWmlBb1pYRjFZV3dvZEdocGN5NXBaQ3dnYVdRcEtTQjdJSFJsZUhRZ1BTQjBhR2x6TG5SbGVIUTdJSEpsZEhWeWJpQm1ZV3h6WlRzZ2ZTQjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHRjBZUzV3ZFhOb0tIdHBaRG9nYVdRc0lIUmxlSFE2SUhSbGVIUjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMkZzYkdKaFkyc29aR0YwWVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBlWEJsYjJZb2IzQjBjeTV4ZFdWeWVTa2dJVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdoeWIzY2dYQ0p4ZFdWeWVTQm1kVzVqZEdsdmJpQnViM1FnWkdWbWFXNWxaQ0JtYjNJZ1UyVnNaV04wTWlCY0lpQXJJRzl3ZEhNdVpXeGxiV1Z1ZEM1aGRIUnlLRndpYVdSY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnZjSFJ6TzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHFLbHh5WEc0Z0lDQWdJQ0FnSUNBcUlFMXZibWwwYjNJZ2RHaGxJRzl5YVdkcGJtRnNJR1ZzWlcxbGJuUWdabTl5SUdOb1lXNW5aWE1nWVc1a0lIVndaR0YwWlNCelpXeGxZM1F5SUdGalkyOXlaR2x1WjJ4NVhISmNiaUFnSUNBZ0lDQWdJQ292WEhKY2JpQWdJQ0FnSUNBZ0x5OGdZV0p6ZEhKaFkzUmNjbHh1SUNBZ0lDQWdJQ0J0YjI1cGRHOXlVMjkxY21ObE9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCbGJDQTlJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMQ0J6ZVc1ak8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaV3d1YjI0b1hDSmphR0Z1WjJVdWMyVnNaV04wTWx3aUxDQjBhR2x6TG1KcGJtUW9ablZ1WTNScGIyNGdLR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtOXdkSE11Wld4bGJXVnVkQzVrWVhSaEtGd2ljMlZzWldOME1pMWphR0Z1WjJVdGRISnBaMmRsY21Wa1hDSXBJQ0U5UFNCMGNuVmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1cGJtbDBVMlZzWldOMGFXOXVLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSE41Ym1NZ1BTQjBhR2x6TG1KcGJtUW9ablZ1WTNScGIyNGdLQ2tnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCbGJtRmliR1ZrTENCeVpXRmtiMjVzZVN3Z2MyVnNaaUE5SUhSb2FYTTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdjM2x1WXlCbGJtRmliR1ZrSUhOMFlYUmxYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1pHbHpZV0pzWldRZ1BTQmxiQzV3Y205d0tGd2laR2x6WVdKc1pXUmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aR2x6WVdKc1pXUWdQVDA5SUhWdVpHVm1hVzVsWkNrZ1pHbHpZV0pzWldRZ1BTQm1ZV3h6WlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Wlc1aFlteGxLQ0ZrYVhOaFlteGxaQ2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhKbFlXUnZibXg1SUQwZ1pXd3VjSEp2Y0NoY0luSmxZV1J2Ym14NVhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tISmxZV1J2Ym14NUlEMDlQU0IxYm1SbFptbHVaV1FwSUhKbFlXUnZibXg1SUQwZ1ptRnNjMlU3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbkpsWVdSdmJteDVLSEpsWVdSdmJteDVLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnplVzVqUTNOelEyeGhjM05sY3loMGFHbHpMbU52Ym5SaGFXNWxjaXdnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblFzSUhSb2FYTXViM0IwY3k1aFpHRndkRU52Ym5SaGFXNWxja056YzBOc1lYTnpLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdGcGJtVnlMbUZrWkVOc1lYTnpLR1YyWVd4MVlYUmxLSFJvYVhNdWIzQjBjeTVqYjI1MFlXbHVaWEpEYzNORGJHRnpjeWtwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE41Ym1ORGMzTkRiR0Z6YzJWektIUm9hWE11WkhKdmNHUnZkMjRzSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTENCMGFHbHpMbTl3ZEhNdVlXUmhjSFJFY205d1pHOTNia056YzBOc1lYTnpLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaSEp2Y0dSdmQyNHVZV1JrUTJ4aGMzTW9aWFpoYkhWaGRHVW9kR2hwY3k1dmNIUnpMbVJ5YjNCa2IzZHVRM056UTJ4aGMzTXBLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnYlc5NmFXeHNZU0JoYm1RZ1NVVmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pXd3ViMjRvWENKd2NtOXdaWEowZVdOb1lXNW5aUzV6Wld4bFkzUXlJRVJQVFVGMGRISk5iMlJwWm1sbFpDNXpaV3hsWTNReVhDSXNJSE41Ym1NcE8xeHlYRzVjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHaHZiR1FnYjI1MGJ5QmhJSEpsWm1WeVpXNWpaU0J2WmlCMGFHVWdZMkZzYkdKaFkyc2dkRzhnZDI5eWF5QmhjbTkxYm1RZ1lTQmphSEp2YldsMWJTQmlkV2RjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXViWFYwWVhScGIyNURZV3hzWW1GamF5QTlQVDBnZFc1a1pXWnBibVZrS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG0xMWRHRjBhVzl1UTJGc2JHSmhZMnNnUFNCbWRXNWpkR2x2YmlBb2JYVjBZWFJwYjI1ektTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JYVjBZWFJwYjI1ekxtWnZja1ZoWTJnb2MzbHVZeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJSE5oWm1GeWFTQmhibVFnWTJoeWIyMWxYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdWMlZpUzJsMFRYVjBZWFJwYjI1UFluTmxjblpsY2lBaFBUMGdYQ0oxYm1SbFptbHVaV1JjSWlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVjSEp2Y0dWeWRIbFBZbk5sY25abGNpa2dleUJrWld4bGRHVWdkR2hwY3k1d2NtOXdaWEowZVU5aWMyVnlkbVZ5T3lCMGFHbHpMbkJ5YjNCbGNuUjVUMkp6WlhKMlpYSWdQU0J1ZFd4c095QjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuQnliM0JsY25SNVQySnpaWEoyWlhJZ1BTQnVaWGNnVjJWaVMybDBUWFYwWVhScGIyNVBZbk5sY25abGNpaDBhR2x6TG0xMWRHRjBhVzl1UTJGc2JHSmhZMnNwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV3Y205d1pYSjBlVTlpYzJWeWRtVnlMbTlpYzJWeWRtVW9aV3d1WjJWMEtEQXBMQ0I3SUdGMGRISnBZblYwWlhNNmRISjFaU3dnYzNWaWRISmxaVHBtWVd4elpTQjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklHRmljM1J5WVdOMFhISmNiaUFnSUNBZ0lDQWdkSEpwWjJkbGNsTmxiR1ZqZERvZ1puVnVZM1JwYjI0b1pHRjBZU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1pYWjBJRDBnSkM1RmRtVnVkQ2hjSW5ObGJHVmpkREl0YzJWc1pXTjBhVzVuWENJc0lIc2dkbUZzT2lCMGFHbHpMbWxrS0dSaGRHRXBMQ0J2WW1wbFkzUTZJR1JoZEdFZ2ZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExuUnlhV2RuWlhJb1pYWjBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlDRmxkblF1YVhORVpXWmhkV3gwVUhKbGRtVnVkR1ZrS0NrN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeW9xWEhKY2JpQWdJQ0FnSUNBZ0lDb2dWSEpwWjJkbGNuTWdkR2hsSUdOb1lXNW5aU0JsZG1WdWRDQnZiaUIwYUdVZ2MyOTFjbU5sSUdWc1pXMWxiblJjY2x4dUlDQWdJQ0FnSUNBZ0tpOWNjbHh1SUNBZ0lDQWdJQ0F2THlCaFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lIUnlhV2RuWlhKRGFHRnVaMlU2SUdaMWJtTjBhVzl1SUNoa1pYUmhhV3h6S1NCN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaWFJoYVd4eklEMGdaR1YwWVdsc2N5QjhmQ0I3ZlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWkdWMFlXbHNjejBnSkM1bGVIUmxibVFvZTMwc0lHUmxkR0ZwYkhNc0lIc2dkSGx3WlRvZ1hDSmphR0Z1WjJWY0lpd2dkbUZzT2lCMGFHbHpMblpoYkNncElIMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJ3Y21WMlpXNTBjeUJ5WldOMWNuTnBkbVVnZEhKcFoyZGxjbWx1WjF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11Wld4bGJXVnVkQzVrWVhSaEtGd2ljMlZzWldOME1pMWphR0Z1WjJVdGRISnBaMmRsY21Wa1hDSXNJSFJ5ZFdVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1MGNtbG5aMlZ5S0dSbGRHRnBiSE1wTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11Wld4bGJXVnVkQzVrWVhSaEtGd2ljMlZzWldOME1pMWphR0Z1WjJVdGRISnBaMmRsY21Wa1hDSXNJR1poYkhObEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUhOdmJXVWdkbUZzYVdSaGRHbHZiaUJtY21GdFpYZHZjbXR6SUdsbmJtOXlaU0IwYUdVZ1kyaGhibWRsSUdWMlpXNTBJR0Z1WkNCc2FYTjBaVzRnYVc1emRHVmhaQ0IwYnlCclpYbDFjQ3dnWTJ4cFkyc2dabTl5SUhObGJHVmpkSE5jY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnYzI4Z2FHVnlaU0IzWlNCMGNtbG5aMlZ5SUhSb1pTQmpiR2xqYXlCbGRtVnVkQ0J0WVc1MVlXeHNlVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG05d2RITXVaV3hsYldWdWRDNWpiR2xqYXlncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnVm1Gc2FXUmhkR2x2YmtWdVoybHVaU0JwWjI1dmNtVmhJSFJvWlNCamFHRnVaMlVnWlhabGJuUWdZVzVrSUd4cGMzUmxibk1nYVc1emRHVmhaQ0IwYnlCaWJIVnlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJSE52SUdobGNtVWdkMlVnZEhKcFoyZGxjaUIwYUdVZ1lteDFjaUJsZG1WdWRDQnRZVzUxWVd4c2VTQnBaaUJ6YnlCa1pYTnBjbVZrWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEhNdVlteDFjazl1UTJoaGJtZGxLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1WW14MWNpZ3BPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dllXSnpkSEpoWTNSY2NseHVJQ0FnSUNBZ0lDQnBjMGx1ZEdWeVptRmpaVVZ1WVdKc1pXUTZJR1oxYm1OMGFXOXVLQ2xjY2x4dUlDQWdJQ0FnSUNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtVnVZV0pzWldSSmJuUmxjbVpoWTJVZ1BUMDlJSFJ5ZFdVN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnWVdKemRISmhZM1JjY2x4dUlDQWdJQ0FnSUNCbGJtRmliR1ZKYm5SbGNtWmhZMlU2SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdaVzVoWW14bFpDQTlJSFJvYVhNdVgyVnVZV0pzWldRZ0ppWWdJWFJvYVhNdVgzSmxZV1J2Ym14NUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2x6WVdKc1pXUWdQU0FoWlc1aFlteGxaRHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxibUZpYkdWa0lEMDlQU0IwYUdsekxtVnVZV0pzWldSSmJuUmxjbVpoWTJVcElISmxkSFZ5YmlCbVlXeHpaVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdGcGJtVnlMblJ2WjJkc1pVTnNZWE56S0Z3aWMyVnNaV04wTWkxamIyNTBZV2x1WlhJdFpHbHpZV0pzWldSY0lpd2daR2x6WVdKc1pXUXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Oc2IzTmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpXNWhZbXhsWkVsdWRHVnlabUZqWlNBOUlHVnVZV0pzWldRN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RISjFaVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QmhZbk4wY21GamRGeHlYRzRnSUNBZ0lDQWdJR1Z1WVdKc1pUb2dablZ1WTNScGIyNG9aVzVoWW14bFpDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWlc1aFlteGxaQ0E5UFQwZ2RXNWtaV1pwYm1Wa0tTQmxibUZpYkdWa0lEMGdkSEoxWlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11WDJWdVlXSnNaV1FnUFQwOUlHVnVZV0pzWldRcElISmxkSFZ5Ymp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWZaVzVoWW14bFpDQTlJR1Z1WVdKc1pXUTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11Wld4bGJXVnVkQzV3Y205d0tGd2laR2x6WVdKc1pXUmNJaXdnSVdWdVlXSnNaV1FwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtVnVZV0pzWlVsdWRHVnlabUZqWlNncE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzh2SUdGaWMzUnlZV04wWEhKY2JpQWdJQ0FnSUNBZ1pHbHpZV0pzWlRvZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Wlc1aFlteGxLR1poYkhObEtUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCaFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lISmxZV1J2Ym14NU9pQm1kVzVqZEdsdmJpaGxibUZpYkdWa0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsYm1GaWJHVmtJRDA5UFNCMWJtUmxabWx1WldRcElHVnVZV0pzWldRZ1BTQm1ZV3h6WlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11WDNKbFlXUnZibXg1SUQwOVBTQmxibUZpYkdWa0tTQnlaWFIxY200Z1ptRnNjMlU3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVgzSmxZV1J2Ym14NUlEMGdaVzVoWW14bFpEdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMbkJ5YjNBb1hDSnlaV0ZrYjI1c2VWd2lMQ0JsYm1GaWJHVmtLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1bGJtRmliR1ZKYm5SbGNtWmhZMlVvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJ5ZFdVN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnWVdKemRISmhZM1JjY2x4dUlDQWdJQ0FnSUNCdmNHVnVaV1E2SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVZMjl1ZEdGcGJtVnlMbWhoYzBOc1lYTnpLRndpYzJWc1pXTjBNaTFrY205d1pHOTNiaTF2Y0dWdVhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklHRmljM1J5WVdOMFhISmNiaUFnSUNBZ0lDQWdjRzl6YVhScGIyNUVjbTl3Wkc5M2Jqb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lBa1pISnZjR1J2ZDI0Z1BTQjBhR2x6TG1SeWIzQmtiM2R1TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IyWm1jMlYwSUQwZ2RHaHBjeTVqYjI1MFlXbHVaWEl1YjJabWMyVjBLQ2tzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCb1pXbG5hSFFnUFNCMGFHbHpMbU52Ym5SaGFXNWxjaTV2ZFhSbGNraGxhV2RvZENobVlXeHpaU2tzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCM2FXUjBhQ0E5SUhSb2FYTXVZMjl1ZEdGcGJtVnlMbTkxZEdWeVYybGtkR2dvWm1Gc2MyVXBMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkhKdmNFaGxhV2RvZENBOUlDUmtjbTl3Wkc5M2JpNXZkWFJsY2tobGFXZG9kQ2htWVd4elpTa3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyYVdWM1VHOXlkRkpwWjJoMElEMGdKQ2gzYVc1a2IzY3BMbk5qY205c2JFeGxablFvS1NBcklDUW9kMmx1Wkc5M0tTNTNhV1IwYUNncExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbWxsZDNCdmNuUkNiM1IwYjIwZ1BTQWtLSGRwYm1SdmR5a3VjMk55YjJ4c1ZHOXdLQ2tnS3lBa0tIZHBibVJ2ZHlrdWFHVnBaMmgwS0Nrc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtjbTl3Vkc5d0lEMGdiMlptYzJWMExuUnZjQ0FySUdobGFXZG9kQ3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdSeWIzQk1aV1owSUQwZ2IyWm1jMlYwTG14bFpuUXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYm05MVoyaFNiMjl0UW1Wc2IzY2dQU0JrY205d1ZHOXdJQ3NnWkhKdmNFaGxhV2RvZENBOFBTQjJhV1YzY0c5eWRFSnZkSFJ2YlN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnViM1ZuYUZKdmIyMUJZbTkyWlNBOUlDaHZabVp6WlhRdWRHOXdJQzBnWkhKdmNFaGxhV2RvZENrZ1BqMGdkR2hwY3k1aWIyUjVLQ2t1YzJOeWIyeHNWRzl3S0Nrc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtjbTl3VjJsa2RHZ2dQU0FrWkhKdmNHUnZkMjR1YjNWMFpYSlhhV1IwYUNobVlXeHpaU2tzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJtOTFaMmhTYjI5dFQyNVNhV2RvZENBOUlHUnliM0JNWldaMElDc2daSEp2Y0ZkcFpIUm9JRHc5SUhacFpYZFFiM0owVW1sbmFIUXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoWW05MlpVNXZkeUE5SUNSa2NtOXdaRzkzYmk1b1lYTkRiR0Z6Y3loY0luTmxiR1ZqZERJdFpISnZjQzFoWW05MlpWd2lLU3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKdlpIbFBabVp6WlhRc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhZbTkyWlN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnpjeXhjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkSE5NYVhOMFRtOWtaVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG05d2RITXVaSEp2Y0dSdmQyNUJkWFJ2VjJsa2RHZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkSE5NYVhOMFRtOWtaU0E5SUNRb0p5NXpaV3hsWTNReUxYSmxjM1ZzZEhNbkxDQWtaSEp2Y0dSdmQyNHBXekJkTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pHUnliM0JrYjNkdUxtRmtaRU5zWVhOektDZHpaV3hsWTNReUxXUnliM0F0WVhWMGJ5MTNhV1IwYUNjcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKR1J5YjNCa2IzZHVMbU56Y3lnbmQybGtkR2duTENBbkp5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCQlpHUWdjMk55YjJ4c1ltRnlJSGRwWkhSb0lIUnZJR1J5YjNCa2IzZHVJR2xtSUhabGNuUnBZMkZzSUhOamNtOXNiR0poY2lCcGN5QndjbVZ6Wlc1MFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtjbTl3VjJsa2RHZ2dQU0FrWkhKdmNHUnZkMjR1YjNWMFpYSlhhV1IwYUNobVlXeHpaU2tnS3lBb2NtVnpkV3gwYzB4cGMzUk9iMlJsTG5OamNtOXNiRWhsYVdkb2RDQTlQVDBnY21WemRXeDBjMHhwYzNST2IyUmxMbU5zYVdWdWRFaGxhV2RvZENBL0lEQWdPaUJ6WTNKdmJHeENZWEpFYVcxbGJuTnBiMjV6TG5kcFpIUm9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdSeWIzQlhhV1IwYUNBK0lIZHBaSFJvSUQ4Z2QybGtkR2dnUFNCa2NtOXdWMmxrZEdnZ09pQmtjbTl3VjJsa2RHZ2dQU0IzYVdSMGFEdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1YjNWbmFGSnZiMjFQYmxKcFoyaDBJRDBnWkhKdmNFeGxablFnS3lCa2NtOXdWMmxrZEdnZ1BEMGdkbWxsZDFCdmNuUlNhV2RvZER0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyOXVkR0ZwYm1WeUxuSmxiVzkyWlVOc1lYTnpLQ2R6Wld4bFkzUXlMV1J5YjNBdFlYVjBieTEzYVdSMGFDY3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDJOdmJuTnZiR1V1Ykc5bktGd2lZbVZzYjNjdklHUnliM0IwYjNBNlhDSXNJR1J5YjNCVWIzQXNJRndpWkhKdmNFaGxhV2RvZEZ3aUxDQmtjbTl3U0dWcFoyaDBMQ0JjSW5OMWJWd2lMQ0FvWkhKdmNGUnZjQ3RrY205d1NHVnBaMmgwS1N0Y0lpQjJhV1YzY0c5eWRDQmliM1IwYjIxY0lpd2dkbWxsZDNCdmNuUkNiM1IwYjIwc0lGd2laVzV2ZFdkb1Axd2lMQ0JsYm05MVoyaFNiMjl0UW1Wc2IzY3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMMk52Ym5OdmJHVXViRzluS0Z3aVlXSnZkbVV2SUc5bVpuTmxkQzUwYjNCY0lpd2diMlptYzJWMExuUnZjQ3dnWENKa2NtOXdTR1ZwWjJoMFhDSXNJR1J5YjNCSVpXbG5hSFFzSUZ3aWRHOXdYQ0lzSUNodlptWnpaWFF1ZEc5d0xXUnliM0JJWldsbmFIUXBMQ0JjSW5OamNtOXNiRlJ2Y0Z3aUxDQjBhR2x6TG1KdlpIa29LUzV6WTNKdmJHeFViM0FvS1N3Z1hDSmxibTkxWjJnL1hDSXNJR1Z1YjNWbmFGSnZiMjFCWW05MlpTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCbWFYZ2djRzl6YVhScGIyNXBibWNnZDJobGJpQmliMlI1SUdoaGN5QmhiaUJ2Wm1aelpYUWdZVzVrSUdseklHNXZkQ0J3YjNOcGRHbHZiam9nYzNSaGRHbGpYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtSnZaSGtvS1M1amMzTW9KM0J2YzJsMGFXOXVKeWtnSVQwOUlDZHpkR0YwYVdNbktTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpYjJSNVQyWm1jMlYwSUQwZ2RHaHBjeTVpYjJSNUtDa3ViMlptYzJWMEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrY205d1ZHOXdJQzA5SUdKdlpIbFBabVp6WlhRdWRHOXdPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkhKdmNFeGxablFnTFQwZ1ltOWtlVTltWm5ObGRDNXNaV1owTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QmhiSGRoZVhNZ2NISmxabVZ5SUhSb1pTQmpkWEp5Wlc1MElHRmliM1psTDJKbGJHOTNJR0ZzYVdkdWJXVnVkQ3dnZFc1c1pYTnpJSFJvWlhKbElHbHpJRzV2ZENCbGJtOTFaMmdnY205dmJWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZV0p2ZG1WT2IzY3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGaWIzWmxJRDBnZEhKMVpUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaFpXNXZkV2RvVW05dmJVRmliM1psSUNZbUlHVnViM1ZuYUZKdmIyMUNaV3h2ZHlrZ1lXSnZkbVVnUFNCbVlXeHpaVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0ZpYjNabElEMGdabUZzYzJVN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVdWdWIzVm5hRkp2YjIxQ1pXeHZkeUFtSmlCbGJtOTFaMmhTYjI5dFFXSnZkbVVwSUdGaWIzWmxJRDBnZEhKMVpUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGbGJtOTFaMmhTYjI5dFQyNVNhV2RvZENrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtjbTl3VEdWbWRDQTlJRzltWm5ObGRDNXNaV1owSUNzZ2QybGtkR2dnTFNCa2NtOXdWMmxrZEdnN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hoWW05MlpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkhKdmNGUnZjQ0E5SUc5bVpuTmxkQzUwYjNBZ0xTQmtjbTl3U0dWcFoyaDBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiMjUwWVdsdVpYSXVZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV1J5YjNBdFlXSnZkbVZjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWtaSEp2Y0dSdmQyNHVZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV1J5YjNBdFlXSnZkbVZjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnZiblJoYVc1bGNpNXlaVzF2ZG1WRGJHRnpjeWhjSW5ObGJHVmpkREl0WkhKdmNDMWhZbTkyWlZ3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1JrY205d1pHOTNiaTV5WlcxdmRtVkRiR0Z6Y3loY0luTmxiR1ZqZERJdFpISnZjQzFoWW05MlpWd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWTNOeklEMGdKQzVsZUhSbGJtUW9lMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEc5d09pQmtjbTl3Vkc5d0xGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR1ZtZERvZ1pISnZjRXhsWm5Rc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjNhV1IwYURvZ2QybGtkR2hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU3dnWlhaaGJIVmhkR1VvZEdocGN5NXZjSFJ6TG1SeWIzQmtiM2R1UTNOektTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FrWkhKdmNHUnZkMjR1WTNOektHTnpjeWs3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdZV0p6ZEhKaFkzUmNjbHh1SUNBZ0lDQWdJQ0J6YUc5MWJHUlBjR1Z1T2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR1YyWlc1ME8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXViM0JsYm1Wa0tDa3BJSEpsZEhWeWJpQm1ZV3h6WlR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxsOWxibUZpYkdWa0lEMDlQU0JtWVd4elpTQjhmQ0IwYUdsekxsOXlaV0ZrYjI1c2VTQTlQVDBnZEhKMVpTa2djbVYwZFhKdUlHWmhiSE5sTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pYWmxiblFnUFNBa0xrVjJaVzUwS0Z3aWMyVnNaV04wTWkxdmNHVnVhVzVuWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1MGNtbG5aMlZ5S0dWMlpXNTBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlDRmxkbVZ1ZEM1cGMwUmxabUYxYkhSUWNtVjJaVzUwWldRb0tUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCaFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lHTnNaV0Z5UkhKdmNHUnZkMjVCYkdsbmJtMWxiblJRY21WbVpYSmxibU5sT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdZMnhsWVhJZ2RHaGxJR05zWVhOelpYTWdkWE5sWkNCMGJ5Qm1hV2QxY21VZ2IzVjBJSFJvWlNCd2NtVm1aWEpsYm1ObElHOW1JSGRvWlhKbElIUm9aU0JrY205d1pHOTNiaUJ6YUc5MWJHUWdZbVVnYjNCbGJtVmtYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTI5dWRHRnBibVZ5TG5KbGJXOTJaVU5zWVhOektGd2ljMlZzWldOME1pMWtjbTl3TFdGaWIzWmxYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtUnliM0JrYjNkdUxuSmxiVzkyWlVOc1lYTnpLRndpYzJWc1pXTjBNaTFrY205d0xXRmliM1psWENJcE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzhxS2x4eVhHNGdJQ0FnSUNBZ0lDQXFJRTl3Wlc1eklIUm9aU0JrY205d1pHOTNibHh5WEc0Z0lDQWdJQ0FnSUNBcVhISmNiaUFnSUNBZ0lDQWdJQ29nUUhKbGRIVnliaUI3UW05dmJHVmhibjBnZDJobGRHaGxjaUJ2Y2lCdWIzUWdaSEp2Y0dSdmQyNGdkMkZ6SUc5d1pXNWxaQzRnVkdocGN5QnRaWFJvYjJRZ2QybHNiQ0J5WlhSMWNtNGdabUZzYzJVZ2FXWXNJR1p2Y2lCbGVHRnRjR3hsTEZ4eVhHNGdJQ0FnSUNBZ0lDQXFJSFJvWlNCa2NtOXdaRzkzYmlCcGN5QmhiSEpsWVdSNUlHOXdaVzRzSUc5eUlHbG1JSFJvWlNBbmIzQmxiaWNnWlhabGJuUWdiR2x6ZEdWdVpYSWdiMjRnZEdobElHVnNaVzFsYm5RZ1kyRnNiR1ZrSUhCeVpYWmxiblJFWldaaGRXeDBLQ2t1WEhKY2JpQWdJQ0FnSUNBZ0lDb3ZYSEpjYmlBZ0lDQWdJQ0FnTHk4Z1lXSnpkSEpoWTNSY2NseHVJQ0FnSUNBZ0lDQnZjR1Z1T2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lYUm9hWE11YzJodmRXeGtUM0JsYmlncEtTQnlaWFIxY200Z1ptRnNjMlU3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3Wlc1cGJtY29LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIwY25WbE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzhxS2x4eVhHNGdJQ0FnSUNBZ0lDQXFJRkJsY21admNtMXpJSFJvWlNCdmNHVnVhVzVuSUc5bUlIUm9aU0JrY205d1pHOTNibHh5WEc0Z0lDQWdJQ0FnSUNBcUwxeHlYRzRnSUNBZ0lDQWdJQzh2SUdGaWMzUnlZV04wWEhKY2JpQWdJQ0FnSUNBZ2IzQmxibWx1WnpvZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJqYVdRZ1BTQjBhR2x6TG1OdmJuUmhhVzVsY2tsa0xGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMk55YjJ4c0lEMGdYQ0p6WTNKdmJHd3VYQ0lnS3lCamFXUXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOcGVtVWdQU0JjSW5KbGMybDZaUzVjSWl0amFXUXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2Y21sbGJuUWdQU0JjSW05eWFXVnVkR0YwYVc5dVkyaGhibWRsTGx3aUsyTnBaQ3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGMyc3NJRzFoYzJ0RGMzTTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnZiblJoYVc1bGNpNWhaR1JEYkdGemN5aGNJbk5sYkdWamRESXRaSEp2Y0dSdmQyNHRiM0JsYmx3aUtTNWhaR1JEYkdGemN5aGNJbk5sYkdWamRESXRZMjl1ZEdGcGJtVnlMV0ZqZEdsMlpWd2lLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMnhsWVhKRWNtOXdaRzkzYmtGc2FXZHViV1Z1ZEZCeVpXWmxjbVZ1WTJVb0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtS0hSb2FYTXVaSEp2Y0dSdmQyNWJNRjBnSVQwOUlIUm9hWE11WW05a2VTZ3BMbU5vYVd4a2NtVnVLQ2t1YkdGemRDZ3BXekJkS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1SeWIzQmtiM2R1TG1SbGRHRmphQ2dwTG1Gd2NHVnVaRlJ2S0hSb2FYTXVZbTlrZVNncEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnWTNKbFlYUmxJSFJvWlNCa2NtOXdaRzkzYmlCdFlYTnJJR2xtSUdSdlpYTnVkQ0JoYkhKbFlXUjVJR1Y0YVhOMFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUcxaGMyc2dQU0FrS0Z3aUkzTmxiR1ZqZERJdFpISnZjQzF0WVhOclhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYldGemF5NXNaVzVuZEdnZ1BUMGdNQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXRnpheUE5SUNRb1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ2hjSW1ScGRsd2lLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYTnJMbUYwZEhJb1hDSnBaRndpTEZ3aWMyVnNaV04wTWkxa2NtOXdMVzFoYzJ0Y0lpa3VZWFIwY2loY0ltTnNZWE56WENJc1hDSnpaV3hsWTNReUxXUnliM0F0YldGemExd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGMyc3VhR2xrWlNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Z6YXk1aGNIQmxibVJVYnloMGFHbHpMbUp2Wkhrb0tTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhOckxtOXVLRndpYlc5MWMyVmtiM2R1SUhSdmRXTm9jM1JoY25RZ1kyeHBZMnRjSWl3Z1puVnVZM1JwYjI0Z0tHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWkhKdmNHUnZkMjRnUFNBa0tGd2lJM05sYkdWamRESXRaSEp2Y0Z3aUtTd2djMlZzWmp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pISnZjR1J2ZDI0dWJHVnVaM1JvSUQ0Z01Da2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6Wld4bVBXUnliM0JrYjNkdUxtUmhkR0VvWENKelpXeGxZM1F5WENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYzJWc1ppNXZjSFJ6TG5ObGJHVmpkRTl1UW14MWNpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaaTV6Wld4bFkzUklhV2RvYkdsbmFIUmxaQ2g3Ym05R2IyTjFjem9nZEhKMVpYMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGJHWXVZMnh2YzJVb2UyWnZZM1Z6T21aaGJITmxmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdVdWNISmxkbVZ1ZEVSbFptRjFiSFFvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pTNXpkRzl3VUhKdmNHRm5ZWFJwYjI0b0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1pXNXpkWEpsSUhSb1pTQnRZWE5ySUdseklHRnNkMkY1Y3lCeWFXZG9kQ0JpWldadmNtVWdkR2hsSUdSeWIzQmtiM2R1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbVJ5YjNCa2IzZHVMbkJ5WlhZb0tWc3dYU0FoUFQwZ2JXRnphMXN3WFNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1a2NtOXdaRzkzYmk1aVpXWnZjbVVvYldGemF5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUcxdmRtVWdkR2hsSUdkc2IySmhiQ0JwWkNCMGJ5QjBhR1VnWTI5eWNtVmpkQ0JrY205d1pHOTNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWtLRndpSTNObGJHVmpkREl0WkhKdmNGd2lLUzV5WlcxdmRtVkJkSFJ5S0Z3aWFXUmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpISnZjR1J2ZDI0dVlYUjBjaWhjSW1sa1hDSXNJRndpYzJWc1pXTjBNaTFrY205d1hDSXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2MyaHZkeUIwYUdVZ1pXeGxiV1Z1ZEhOY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYldGemF5NXphRzkzS0NrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5CdmMybDBhVzl1UkhKdmNHUnZkMjRvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWtjbTl3Wkc5M2JpNXphRzkzS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjRzl6YVhScGIyNUVjbTl3Wkc5M2JpZ3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWtjbTl3Wkc5M2JpNWhaR1JEYkdGemN5aGNJbk5sYkdWamRESXRaSEp2Y0MxaFkzUnBkbVZjSWlrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJoZEhSaFkyZ2diR2x6ZEdWdVpYSnpJSFJ2SUdWMlpXNTBjeUIwYUdGMElHTmhiaUJqYUdGdVoyVWdkR2hsSUhCdmMybDBhVzl1SUc5bUlIUm9aU0JqYjI1MFlXbHVaWElnWVc1a0lIUm9kWE1nY21WeGRXbHlaVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUIwYUdVZ2NHOXphWFJwYjI0Z2IyWWdkR2hsSUdSeWIzQmtiM2R1SUhSdklHSmxJSFZ3WkdGMFpXUWdZWE1nZDJWc2JDQnpieUJwZENCa2IyVnpJRzV2ZENCamIyMWxJSFZ1WjJ4MVpXUWdabkp2YlNCMGFHVWdZMjl1ZEdGcGJtVnlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUIwYUdGMElEMGdkR2hwY3p0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiMjUwWVdsdVpYSXVjR0Z5Wlc1MGN5Z3BMbUZrWkNoM2FXNWtiM2NwTG1WaFkyZ29ablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pDaDBhR2x6S1M1dmJpaHlaWE5wZW1VclhDSWdYQ0lyYzJOeWIyeHNLMXdpSUZ3aUsyOXlhV1Z1ZEN3Z1puVnVZM1JwYjI0Z0tHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR0YwTG5CdmMybDBhVzl1UkhKdmNHUnZkMjRvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjY2x4dVhISmNibHh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklHRmljM1J5WVdOMFhISmNiaUFnSUNBZ0lDQWdZMnh2YzJVNklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMGFHbHpMbTl3Wlc1bFpDZ3BLU0J5WlhSMWNtNDdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1kybGtJRDBnZEdocGN5NWpiMjUwWVdsdVpYSkpaQ3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOamNtOXNiQ0E5SUZ3aWMyTnliMnhzTGx3aUlDc2dZMmxrTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnphWHBsSUQwZ1hDSnlaWE5wZW1VdVhDSXJZMmxrTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzSnBaVzUwSUQwZ1hDSnZjbWxsYm5SaGRHbHZibU5vWVc1blpTNWNJaXRqYVdRN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUIxYm1KcGJtUWdaWFpsYm5RZ2JHbHpkR1Z1WlhKelhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdGcGJtVnlMbkJoY21WdWRITW9LUzVoWkdRb2QybHVaRzkzS1M1bFlXTm9LR1oxYm1OMGFXOXVJQ2dwSUhzZ0pDaDBhR2x6S1M1dlptWW9jMk55YjJ4c0tTNXZabVlvY21WemFYcGxLUzV2Wm1Zb2IzSnBaVzUwS1RzZ2ZTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNaV0Z5UkhKdmNHUnZkMjVCYkdsbmJtMWxiblJRY21WbVpYSmxibU5sS0NrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWtLRndpSTNObGJHVmpkREl0WkhKdmNDMXRZWE5yWENJcExtaHBaR1VvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWtjbTl3Wkc5M2JpNXlaVzF2ZG1WQmRIUnlLRndpYVdSY0lpazdJQzh2SUc5dWJIa2dkR2hsSUdGamRHbDJaU0JrY205d1pHOTNiaUJvWVhNZ2RHaGxJSE5sYkdWamRESXRaSEp2Y0NCcFpGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVJ5YjNCa2IzZHVMbWhwWkdVb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjI1MFlXbHVaWEl1Y21WdGIzWmxRMnhoYzNNb1hDSnpaV3hsWTNReUxXUnliM0JrYjNkdUxXOXdaVzVjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjbVZ6ZFd4MGN5NWxiWEIwZVNncE8xeHlYRzVjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMnhsWVhKVFpXRnlZMmdvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV0Z5WTJndWNtVnRiM1psUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV0ZqZEdsMlpWd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmNIUnpMbVZzWlcxbGJuUXVkSEpwWjJkbGNpZ2tMa1YyWlc1MEtGd2ljMlZzWldOME1pMWpiRzl6WlZ3aUtTazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHlvcVhISmNiaUFnSUNBZ0lDQWdJQ29nVDNCbGJuTWdZMjl1ZEhKdmJDd2djMlYwY3lCcGJuQjFkQ0IyWVd4MVpTd2dZVzVrSUhWd1pHRjBaWE1nY21WemRXeDBjeTVjY2x4dUlDQWdJQ0FnSUNBZ0tpOWNjbHh1SUNBZ0lDQWdJQ0F2THlCaFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lHVjRkR1Z5Ym1Gc1UyVmhjbU5vT2lCbWRXNWpkR2x2YmlBb2RHVnliU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdaVzRvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV0Z5WTJndWRtRnNLSFJsY20wcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblZ3WkdGMFpWSmxjM1ZzZEhNb1ptRnNjMlVwTzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJR0ZpYzNSeVlXTjBYSEpjYmlBZ0lDQWdJQ0FnWTJ4bFlYSlRaV0Z5WTJnNklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeTloWW5OMGNtRmpkRnh5WEc0Z0lDQWdJQ0FnSUdkbGRFMWhlR2x0ZFcxVFpXeGxZM1JwYjI1VGFYcGxPaUJtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1YyWVd4MVlYUmxLSFJvYVhNdWIzQjBjeTV0WVhocGJYVnRVMlZzWldOMGFXOXVVMmw2WlNrN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnWVdKemRISmhZM1JjY2x4dUlDQWdJQ0FnSUNCbGJuTjFjbVZJYVdkb2JHbG5hSFJXYVhOcFlteGxPaUJtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnlaWE4xYkhSeklEMGdkR2hwY3k1eVpYTjFiSFJ6TENCamFHbHNaSEpsYml3Z2FXNWtaWGdzSUdOb2FXeGtMQ0JvWWl3Z2NtSXNJSGtzSUcxdmNtVTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwYm1SbGVDQTlJSFJvYVhNdWFHbG5hR3hwWjJoMEtDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXNWtaWGdnUENBd0tTQnlaWFIxY200N1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVc1a1pYZ2dQVDBnTUNrZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHbG1JSFJvWlNCbWFYSnpkQ0JsYkdWdFpXNTBJR2x6SUdocFoyaHNhV2RvZEdWa0lITmpjbTlzYkNCaGJHd2dkR2hsSUhkaGVTQjBieUIwYUdVZ2RHOXdMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2RHaGhkQ0IzWVhrZ1lXNTVJSFZ1YzJWc1pXTjBZV0pzWlNCb1pXRmtaWEp6SUdGaWIzWmxJR2wwSUhkcGJHd2dZV3h6YnlCaVpTQnpZM0p2Ykd4bFpGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnYVc1MGJ5QjJhV1YzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MGN5NXpZM0p2Ykd4VWIzQW9NQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdOb2FXeGtjbVZ1SUQwZ2RHaHBjeTVtYVc1a1NHbG5hR3hwWjJoMFlXSnNaVU5vYjJsalpYTW9LUzVtYVc1a0tDY3VjMlZzWldOME1pMXlaWE4xYkhRdGJHRmlaV3duS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTm9hV3hrSUQwZ0pDaGphR2xzWkhKbGJsdHBibVJsZUYwcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhR0lnUFNCamFHbHNaQzV2Wm1aelpYUW9LUzUwYjNBZ0t5QmphR2xzWkM1dmRYUmxja2hsYVdkb2RDaDBjblZsS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJR2xtSUhSb2FYTWdhWE1nZEdobElHeGhjM1FnWTJocGJHUWdiR1YwY3lCaGJITnZJRzFoYTJVZ2MzVnlaU0J6Wld4bFkzUXlMVzF2Y21VdGNtVnpkV3gwY3lCcGN5QjJhWE5wWW14bFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBibVJsZUNBOVBUMGdZMmhwYkdSeVpXNHViR1Z1WjNSb0lDMGdNU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXOXlaU0E5SUhKbGMzVnNkSE11Wm1sdVpDaGNJbXhwTG5ObGJHVmpkREl0Ylc5eVpTMXlaWE4xYkhSelhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHMXZjbVV1YkdWdVozUm9JRDRnTUNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdoaUlEMGdiVzl5WlM1dlptWnpaWFFvS1M1MGIzQWdLeUJ0YjNKbExtOTFkR1Z5U0dWcFoyaDBLSFJ5ZFdVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WWlBOUlISmxjM1ZzZEhNdWIyWm1jMlYwS0NrdWRHOXdJQ3NnY21WemRXeDBjeTV2ZFhSbGNraGxhV2RvZENoMGNuVmxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0doaUlENGdjbUlwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEhNdWMyTnliMnhzVkc5d0tISmxjM1ZzZEhNdWMyTnliMnhzVkc5d0tDa2dLeUFvYUdJZ0xTQnlZaWtwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSGtnUFNCamFHbHNaQzV2Wm1aelpYUW9LUzUwYjNBZ0xTQnlaWE4xYkhSekxtOW1abk5sZENncExuUnZjRHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHMWhhMlVnYzNWeVpTQjBhR1VnZEc5d0lHOW1JSFJvWlNCbGJHVnRaVzUwSUdseklIWnBjMmxpYkdWY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIa2dQQ0F3SUNZbUlHTm9hV3hrTG1OemN5Z25aR2x6Y0d4aGVTY3BJQ0U5SUNkdWIyNWxKeUFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEhNdWMyTnliMnhzVkc5d0tISmxjM1ZzZEhNdWMyTnliMnhzVkc5d0tDa2dLeUI1S1RzZ0x5OGdlU0JwY3lCdVpXZGhkR2wyWlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdZV0p6ZEhKaFkzUmNjbHh1SUNBZ0lDQWdJQ0JtYVc1a1NHbG5hR3hwWjJoMFlXSnNaVU5vYjJsalpYTTZJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1eVpYTjFiSFJ6TG1acGJtUW9YQ0l1YzJWc1pXTjBNaTF5WlhOMWJIUXRjMlZzWldOMFlXSnNaVHB1YjNRb0xuTmxiR1ZqZERJdGMyVnNaV04wWldRcE9tNXZkQ2d1YzJWc1pXTjBNaTFrYVhOaFlteGxaQ2xjSWlrN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnWVdKemRISmhZM1JjY2x4dUlDQWdJQ0FnSUNCdGIzWmxTR2xuYUd4cFoyaDBPaUJtZFc1amRHbHZiaUFvWkdWc2RHRXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdOb2IybGpaWE1nUFNCMGFHbHpMbVpwYm1SSWFXZG9iR2xuYUhSaFlteGxRMmh2YVdObGN5Z3BMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVc1a1pYZ2dQU0IwYUdsekxtaHBaMmhzYVdkb2RDZ3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZDJocGJHVWdLR2x1WkdWNElENGdMVEVnSmlZZ2FXNWtaWGdnUENCamFHOXBZMlZ6TG14bGJtZDBhQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXNWtaWGdnS3owZ1pHVnNkR0U3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdZMmh2YVdObElEMGdKQ2hqYUc5cFkyVnpXMmx1WkdWNFhTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1kyaHZhV05sTG1oaGMwTnNZWE56S0Z3aWMyVnNaV04wTWkxeVpYTjFiSFF0YzJWc1pXTjBZV0pzWlZ3aUtTQW1KaUFoWTJodmFXTmxMbWhoYzBOc1lYTnpLRndpYzJWc1pXTjBNaTFrYVhOaFlteGxaRndpS1NBbUppQWhZMmh2YVdObExtaGhjME5zWVhOektGd2ljMlZzWldOME1pMXpaV3hsWTNSbFpGd2lLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWFHbG5hR3hwWjJoMEtHbHVaR1Y0S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklHRmljM1J5WVdOMFhISmNiaUFnSUNBZ0lDQWdhR2xuYUd4cFoyaDBPaUJtZFc1amRHbHZiaUFvYVc1a1pYZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdOb2IybGpaWE1nUFNCMGFHbHpMbVpwYm1SSWFXZG9iR2xuYUhSaFlteGxRMmh2YVdObGN5Z3BMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJodmFXTmxMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdGMFlUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQwOVBTQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYVc1a1pYaFBaaWhqYUc5cFkyVnpMbVpwYkhSbGNpaGNJaTV6Wld4bFkzUXlMV2hwWjJoc2FXZG9kR1ZrWENJcFd6QmRMQ0JqYUc5cFkyVnpMbWRsZENncEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dsdVpHVjRJRDQ5SUdOb2IybGpaWE11YkdWdVozUm9LU0JwYm1SbGVDQTlJR05vYjJsalpYTXViR1Z1WjNSb0lDMGdNVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dsdVpHVjRJRHdnTUNrZ2FXNWtaWGdnUFNBd08xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1eVpXMXZkbVZJYVdkb2JHbG5hSFFvS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTm9iMmxqWlNBOUlDUW9ZMmh2YVdObGMxdHBibVJsZUYwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCamFHOXBZMlV1WVdSa1EyeGhjM01vWENKelpXeGxZM1F5TFdocFoyaHNhV2RvZEdWa1hDSXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWxibk4xY21WSWFXZG9iR2xuYUhSV2FYTnBZbXhsS0NrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtZWFJoSUQwZ1kyaHZhV05sTG1SaGRHRW9YQ0p6Wld4bFkzUXlMV1JoZEdGY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hrWVhSaEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11Wld4bGJXVnVkQzUwY21sbloyVnlLSHNnZEhsd1pUb2dYQ0p6Wld4bFkzUXlMV2hwWjJoc2FXZG9kRndpTENCMllXdzZJSFJvYVhNdWFXUW9aR0YwWVNrc0lHTm9iMmxqWlRvZ1pHRjBZU0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lISmxiVzkyWlVocFoyaHNhV2RvZERvZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y21WemRXeDBjeTVtYVc1a0tGd2lMbk5sYkdWamRESXRhR2xuYUd4cFoyaDBaV1JjSWlrdWNtVnRiM1psUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV2hwWjJoc2FXZG9kR1ZrWENJcE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzh2SUdGaWMzUnlZV04wWEhKY2JpQWdJQ0FnSUNBZ1kyOTFiblJUWld4bFkzUmhZbXhsVW1WemRXeDBjem9nWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtWnBibVJJYVdkb2JHbG5hSFJoWW14bFEyaHZhV05sY3lncExteGxibWQwYUR0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJoWW5OMGNtRmpkRnh5WEc0Z0lDQWdJQ0FnSUdocFoyaHNhV2RvZEZWdVpHVnlSWFpsYm5RNklHWjFibU4wYVc5dUlDaGxkbVZ1ZENrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdaV3dnUFNBa0tHVjJaVzUwTG5SaGNtZGxkQ2t1WTJ4dmMyVnpkQ2hjSWk1elpXeGxZM1F5TFhKbGMzVnNkQzF6Wld4bFkzUmhZbXhsWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aV3d1YkdWdVozUm9JRDRnTUNBbUppQWhaV3d1YVhNb1hDSXVjMlZzWldOME1pMW9hV2RvYkdsbmFIUmxaRndpS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdOb2IybGpaWE1nUFNCMGFHbHpMbVpwYm1SSWFXZG9iR2xuYUhSaFlteGxRMmh2YVdObGN5Z3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW9hV2RvYkdsbmFIUW9ZMmh2YVdObGN5NXBibVJsZUNobGJDa3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLR1ZzTG14bGJtZDBhQ0E5UFNBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCcFppQjNaU0JoY21VZ2IzWmxjaUJoYmlCMWJuTmxiR1ZqZEdGaWJHVWdhWFJsYlNCeVpXMXZkbVVnWVd4c0lHaHBaMmhzYVdkb2RITmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNtVnRiM1psU0dsbmFHeHBaMmgwS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJoWW5OMGNtRmpkRnh5WEc0Z0lDQWdJQ0FnSUd4dllXUk5iM0psU1daT1pXVmtaV1E2SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RITWdQU0IwYUdsekxuSmxjM1ZzZEhNc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRiM0psSUQwZ2NtVnpkV3gwY3k1bWFXNWtLRndpYkdrdWMyVnNaV04wTWkxdGIzSmxMWEpsYzNWc2RITmNJaWtzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVpXeHZkeXdnTHk4Z2NHbDRaV3h6SUhSb1pTQmxiR1Z0Wlc1MElHbHpJR0psYkc5M0lIUm9aU0J6WTNKdmJHd2dabTlzWkN3Z1ltVnNiM2M5UFRBZ2FYTWdkMmhsYmlCMGFHVWdaV3hsYldWdWRDQnBjeUJ6ZEdGeWRHbHVaeUIwYnlCaVpTQjJhWE5wWW14bFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZabVp6WlhRZ1BTQXRNU3dnTHk4Z2FXNWtaWGdnYjJZZ1ptbHljM1FnWld4bGJXVnVkQ0IzYVhSb2IzVjBJR1JoZEdGY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmhaMlVnUFNCMGFHbHpMbkpsYzNWc2RITlFZV2RsSUNzZ01TeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sYkdZOWRHaHBjeXhjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSbGNtMDlkR2hwY3k1elpXRnlZMmd1ZG1Gc0tDa3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjI1MFpYaDBQWFJvYVhNdVkyOXVkR1Y0ZER0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h0YjNKbExteGxibWQwYUNBOVBUMGdNQ2tnY21WMGRYSnVPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmlaV3h2ZHlBOUlHMXZjbVV1YjJabWMyVjBLQ2t1ZEc5d0lDMGdjbVZ6ZFd4MGN5NXZabVp6WlhRb0tTNTBiM0FnTFNCeVpYTjFiSFJ6TG1obGFXZG9kQ2dwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR0psYkc5M0lEdzlJSFJvYVhNdWIzQjBjeTVzYjJGa1RXOXlaVkJoWkdScGJtY3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxdmNtVXVZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV0ZqZEdsMlpWd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0IwY3k1eGRXVnllU2g3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWc1pXMWxiblE2SUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMFpYSnRPaUIwWlhKdExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndZV2RsT2lCd1lXZGxMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjI1MFpYaDBPaUJqYjI1MFpYaDBMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhSamFHVnlPaUIwYUdsekxtOXdkSE11YldGMFkyaGxjaXhjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGc2JHSmhZMnM2SUhSb2FYTXVZbWx1WkNobWRXNWpkR2x2YmlBb1pHRjBZU2tnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnBaMjV2Y21VZ1lTQnlaWE53YjI1elpTQnBaaUIwYUdVZ2MyVnNaV04wTWlCb1lYTWdZbVZsYmlCamJHOXpaV1FnWW1WbWIzSmxJR2wwSUhkaGN5QnlaV05sYVhabFpGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2hjMlZzWmk1dmNHVnVaV1FvS1NrZ2NtVjBkWEp1TzF4eVhHNWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWmk1dmNIUnpMbkJ2Y0hWc1lYUmxVbVZ6ZFd4MGN5NWpZV3hzS0hSb2FYTXNJSEpsYzNWc2RITXNJR1JoZEdFdWNtVnpkV3gwY3l3Z2UzUmxjbTA2SUhSbGNtMHNJSEJoWjJVNklIQmhaMlVzSUdOdmJuUmxlSFE2WTI5dWRHVjRkSDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sYkdZdWNHOXpkSEJ5YjJObGMzTlNaWE4xYkhSektHUmhkR0VzSUdaaGJITmxMQ0JtWVd4elpTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoa1lYUmhMbTF2Y21VOVBUMTBjblZsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMXZjbVV1WkdWMFlXTm9LQ2t1WVhCd1pXNWtWRzhvY21WemRXeDBjeWt1ZEdWNGRDaHpaV3htTG05d2RITXVabTl5YldGMFRHOWhaRTF2Y21Vb2NHRm5aU3N4S1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIZHBibVJ2ZHk1elpYUlVhVzFsYjNWMEtHWjFibU4wYVc5dUtDa2dleUJ6Wld4bUxteHZZV1JOYjNKbFNXWk9aV1ZrWldRb0tUc2dmU3dnTVRBcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxdmNtVXVjbVZ0YjNabEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGJHWXVjRzl6YVhScGIyNUVjbTl3Wkc5M2JpZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxiR1l1Y21WemRXeDBjMUJoWjJVZ1BTQndZV2RsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sYkdZdVkyOXVkR1Y0ZENBOUlHUmhkR0V1WTI5dWRHVjRkRHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG05d2RITXVaV3hsYldWdWRDNTBjbWxuWjJWeUtIc2dkSGx3WlRvZ1hDSnpaV3hsWTNReUxXeHZZV1JsWkZ3aUxDQnBkR1Z0Y3pvZ1pHRjBZU0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHBmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdktpcGNjbHh1SUNBZ0lDQWdJQ0FnS2lCRVpXWmhkV3gwSUhSdmEyVnVhWHBsY2lCbWRXNWpkR2x2YmlCM2FHbGphQ0JrYjJWeklHNXZkR2hwYm1kY2NseHVJQ0FnSUNBZ0lDQWdLaTljY2x4dUlDQWdJQ0FnSUNCMGIydGxibWw2WlRvZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHFLbHh5WEc0Z0lDQWdJQ0FnSUNBcUlFQndZWEpoYlNCcGJtbDBhV0ZzSUhkb1pYUm9aWElnYjNJZ2JtOTBJSFJvYVhNZ2FYTWdkR2hsSUdOaGJHd2dkRzhnZEdocGN5QnRaWFJvYjJRZ2NtbG5hSFFnWVdaMFpYSWdkR2hsSUdSeWIzQmtiM2R1SUdoaGN5QmlaV1Z1SUc5d1pXNWxaRnh5WEc0Z0lDQWdJQ0FnSUNBcUwxeHlYRzRnSUNBZ0lDQWdJQzh2SUdGaWMzUnlZV04wWEhKY2JpQWdJQ0FnSUNBZ2RYQmtZWFJsVW1WemRXeDBjem9nWm5WdVkzUnBiMjRnS0dsdWFYUnBZV3dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlITmxZWEpqYUNBOUlIUm9hWE11YzJWaGNtTm9MRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBjeUE5SUhSb2FYTXVjbVZ6ZFd4MGN5eGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzl3ZEhNZ1BTQjBhR2x6TG05d2RITXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrWVhSaExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWmlBOUlIUm9hWE1zWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcGJuQjFkQ3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSbGNtMGdQU0J6WldGeVkyZ3VkbUZzS0Nrc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNZWE4wVkdWeWJTQTlJQ1F1WkdGMFlTaDBhR2x6TG1OdmJuUmhhVzVsY2l3Z1hDSnpaV3hsWTNReUxXeGhjM1F0ZEdWeWJWd2lLU3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklITmxjWFZsYm1ObElHNTFiV0psY2lCMWMyVmtJSFJ2SUdSeWIzQWdiM1YwTFc5bUxXOXlaR1Z5SUhKbGMzQnZibk5sYzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NYVmxjbmxPZFcxaVpYSTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCd2NtVjJaVzUwSUdSMWNHeHBZMkYwWlNCeGRXVnlhV1Z6SUdGbllXbHVjM1FnZEdobElITmhiV1VnZEdWeWJWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hVzVwZEdsaGJDQWhQVDBnZEhKMVpTQW1KaUJzWVhOMFZHVnliU0FtSmlCbGNYVmhiQ2gwWlhKdExDQnNZWE4wVkdWeWJTa3BJSEpsZEhWeWJqdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ1F1WkdGMFlTaDBhR2x6TG1OdmJuUmhhVzVsY2l3Z1hDSnpaV3hsWTNReUxXeGhjM1F0ZEdWeWJWd2lMQ0IwWlhKdEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdsbUlIUm9aU0J6WldGeVkyZ2dhWE1nWTNWeWNtVnVkR3g1SUdocFpHUmxiaUIzWlNCa2J5QnViM1FnWVd4MFpYSWdkR2hsSUhKbGMzVnNkSE5jY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dsdWFYUnBZV3dnSVQwOUlIUnlkV1VnSmlZZ0tIUm9hWE11YzJodmQxTmxZWEpqYUVsdWNIVjBJRDA5UFNCbVlXeHpaU0I4ZkNBaGRHaHBjeTV2Y0dWdVpXUW9LU2twSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1puVnVZM1JwYjI0Z2NHOXpkRkpsYm1SbGNpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObFlYSmphQzV5WlcxdmRtVkRiR0Z6Y3loY0luTmxiR1ZqZERJdFlXTjBhWFpsWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWmk1d2IzTnBkR2x2YmtSeWIzQmtiM2R1S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHWjFibU4wYVc5dUlISmxibVJsY2lob2RHMXNLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFJ6TG1oMGJXd29hSFJ0YkNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndiM04wVW1WdVpHVnlLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhGMVpYSjVUblZ0WW1WeUlEMGdLeXQwYUdsekxuRjFaWEo1UTI5MWJuUTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2JXRjRVMlZzVTJsNlpTQTlJSFJvYVhNdVoyVjBUV0Y0YVcxMWJWTmxiR1ZqZEdsdmJsTnBlbVVvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHMWhlRk5sYkZOcGVtVWdQajB4S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtZWFJoSUQwZ2RHaHBjeTVrWVhSaEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0pDNXBjMEZ5Y21GNUtHUmhkR0VwSUNZbUlHUmhkR0V1YkdWdVozUm9JRDQ5SUcxaGVGTmxiRk5wZW1VZ0ppWWdZMmhsWTJ0R2IzSnRZWFIwWlhJb2IzQjBjeTVtYjNKdFlYUlRaV3hsWTNScGIyNVViMjlDYVdjc0lGd2labTl5YldGMFUyVnNaV04wYVc5dVZHOXZRbWxuWENJcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnVaR1Z5S0Z3aVBHeHBJR05zWVhOelBTZHpaV3hsWTNReUxYTmxiR1ZqZEdsdmJpMXNhVzFwZENjK1hDSWdLeUJ2Y0hSekxtWnZjbTFoZEZObGJHVmpkR2x2YmxSdmIwSnBaeWh0WVhoVFpXeFRhWHBsS1NBcklGd2lQQzlzYVQ1Y0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYzJWaGNtTm9MblpoYkNncExteGxibWQwYUNBOElHOXdkSE11YldsdWFXMTFiVWx1Y0hWMFRHVnVaM1JvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWTJobFkydEdiM0p0WVhSMFpYSW9iM0IwY3k1bWIzSnRZWFJKYm5CMWRGUnZiMU5vYjNKMExDQmNJbVp2Y20xaGRFbHVjSFYwVkc5dlUyaHZjblJjSWlrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpXNWtaWElvWENJOGJHa2dZMnhoYzNNOUozTmxiR1ZqZERJdGJtOHRjbVZ6ZFd4MGN5YytYQ0lnS3lCdmNIUnpMbVp2Y20xaGRFbHVjSFYwVkc5dlUyaHZjblFvYzJWaGNtTm9MblpoYkNncExDQnZjSFJ6TG0xcGJtbHRkVzFKYm5CMWRFeGxibWQwYUNrZ0t5QmNJand2YkdrK1hDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaVzVrWlhJb1hDSmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVc1cGRHbGhiQ0FtSmlCMGFHbHpMbk5vYjNkVFpXRnlZMmdwSUhSb2FYTXVjMmh2ZDFObFlYSmphQ2gwY25WbEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0c5d2RITXViV0Y0YVcxMWJVbHVjSFYwVEdWdVozUm9JQ1ltSUhObFlYSmphQzUyWVd3b0tTNXNaVzVuZEdnZ1BpQnZjSFJ6TG0xaGVHbHRkVzFKYm5CMWRFeGxibWQwYUNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dOb1pXTnJSbTl5YldGMGRHVnlLRzl3ZEhNdVptOXliV0YwU1c1d2RYUlViMjlNYjI1bkxDQmNJbVp2Y20xaGRFbHVjSFYwVkc5dlRHOXVaMXdpS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGJtUmxjaWhjSWp4c2FTQmpiR0Z6Y3owbmMyVnNaV04wTWkxdWJ5MXlaWE4xYkhSekp6NWNJaUFySUc5d2RITXVabTl5YldGMFNXNXdkWFJVYjI5TWIyNW5LSE5sWVhKamFDNTJZV3dvS1N3Z2IzQjBjeTV0WVhocGJYVnRTVzV3ZFhSTVpXNW5kR2dwSUNzZ1hDSThMMnhwUGx3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnVaR1Z5S0Z3aVhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9iM0IwY3k1bWIzSnRZWFJUWldGeVkyaHBibWNnSmlZZ2RHaHBjeTVtYVc1a1NHbG5hR3hwWjJoMFlXSnNaVU5vYjJsalpYTW9LUzVzWlc1bmRHZ2dQVDA5SURBcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYm1SbGNpaGNJanhzYVNCamJHRnpjejBuYzJWc1pXTjBNaTF6WldGeVkyaHBibWNuUGx3aUlDc2diM0IwY3k1bWIzSnRZWFJUWldGeVkyaHBibWNvS1NBcklGd2lQQzlzYVQ1Y0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSE5sWVhKamFDNWhaR1JEYkdGemN5aGNJbk5sYkdWamRESXRZV04wYVhabFhDSXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXlaVzF2ZG1WSWFXZG9iR2xuYUhRb0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdkcGRtVWdkR2hsSUhSdmEyVnVhWHBsY2lCaElHTm9ZVzVqWlNCMGJ5QndjbVV0Y0hKdlkyVnpjeUIwYUdVZ2FXNXdkWFJjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhVzV3ZFhRZ1BTQjBhR2x6TG5SdmEyVnVhWHBsS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBibkIxZENBaFBTQjFibVJsWm1sdVpXUWdKaVlnYVc1d2RYUWdJVDBnYm5Wc2JDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWaGNtTm9MblpoYkNocGJuQjFkQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjbVZ6ZFd4MGMxQmhaMlVnUFNBeE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdiM0IwY3k1eGRXVnllU2g3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJHVnRaVzUwT2lCdmNIUnpMbVZzWlcxbGJuUXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHVnliVG9nYzJWaGNtTm9MblpoYkNncExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCaFoyVTZJSFJvYVhNdWNtVnpkV3gwYzFCaFoyVXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXVkR1Y0ZERvZ2JuVnNiQ3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRZWFJqYUdWeU9pQnZjSFJ6TG0xaGRHTm9aWElzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMkZzYkdKaFkyczZJSFJvYVhNdVltbHVaQ2htZFc1amRHbHZiaUFvWkdGMFlTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHUmxaanNnTHk4Z1pHVm1ZWFZzZENCamFHOXBZMlZjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJwWjI1dmNtVWdiMnhrSUhKbGMzQnZibk5sYzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEYxWlhKNVRuVnRZbVZ5SUNFOUlIUm9hWE11Y1hWbGNubERiM1Z1ZENrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnYVdkdWIzSmxJR0VnY21WemNHOXVjMlVnYVdZZ2RHaGxJSE5sYkdWamRESWdhR0Z6SUdKbFpXNGdZMnh2YzJWa0lHSmxabTl5WlNCcGRDQjNZWE1nY21WalpXbDJaV1JjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1dmNHVnVaV1FvS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZoY21Ob0xuSmxiVzkyWlVOc1lYTnpLRndpYzJWc1pXTjBNaTFoWTNScGRtVmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSE5oZG1VZ1kyOXVkR1Y0ZEN3Z2FXWWdZVzU1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU52Ym5SbGVIUWdQU0FvWkdGMFlTNWpiMjUwWlhoMFBUMDlkVzVrWldacGJtVmtLU0EvSUc1MWJHd2dPaUJrWVhSaExtTnZiblJsZUhRN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJqY21WaGRHVWdZU0JrWldaaGRXeDBJR05vYjJsalpTQmhibVFnY0hKbGNHVnVaQ0JwZENCMGJ5QjBhR1VnYkdsemRGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXViM0IwY3k1amNtVmhkR1ZUWldGeVkyaERhRzlwWTJVZ0ppWWdjMlZoY21Ob0xuWmhiQ2dwSUNFOVBTQmNJbHdpS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdWbUlEMGdkR2hwY3k1dmNIUnpMbU55WldGMFpWTmxZWEpqYUVOb2IybGpaUzVqWVd4c0tITmxiR1lzSUhObFlYSmphQzUyWVd3b0tTd2daR0YwWVM1eVpYTjFiSFJ6S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pHVm1JQ0U5UFNCMWJtUmxabWx1WldRZ0ppWWdaR1ZtSUNFOVBTQnVkV3hzSUNZbUlITmxiR1l1YVdRb1pHVm1LU0FoUFQwZ2RXNWtaV1pwYm1Wa0lDWW1JSE5sYkdZdWFXUW9aR1ZtS1NBaFBUMGdiblZzYkNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSkNoa1lYUmhMbkpsYzNWc2RITXBMbVpwYkhSbGNpaGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1pYRjFZV3dvYzJWc1ppNXBaQ2gwYUdsektTd2djMlZzWmk1cFpDaGtaV1lwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTG14bGJtZDBhQ0E5UFQwZ01Da2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHRjBZUzV5WlhOMWJIUnpMblZ1YzJocFpuUW9aR1ZtS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aR0YwWVM1eVpYTjFiSFJ6TG14bGJtZDBhQ0E5UFQwZ01DQW1KaUJqYUdWamEwWnZjbTFoZEhSbGNpaHZjSFJ6TG1admNtMWhkRTV2VFdGMFkyaGxjeXdnWENKbWIzSnRZWFJPYjAxaGRHTm9aWE5jSWlrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpXNWtaWElvWENJOGJHa2dZMnhoYzNNOUozTmxiR1ZqZERJdGJtOHRjbVZ6ZFd4MGN5YytYQ0lnS3lCdmNIUnpMbVp2Y20xaGRFNXZUV0YwWTJobGN5aHpaV0Z5WTJndWRtRnNLQ2twSUNzZ1hDSThMMnhwUGx3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBjeTVsYlhCMGVTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNXZjSFJ6TG5CdmNIVnNZWFJsVW1WemRXeDBjeTVqWVd4c0tIUm9hWE1zSUhKbGMzVnNkSE1zSUdSaGRHRXVjbVZ6ZFd4MGN5d2dlM1JsY20wNklITmxZWEpqYUM1MllXd29LU3dnY0dGblpUb2dkR2hwY3k1eVpYTjFiSFJ6VUdGblpTd2dZMjl1ZEdWNGREcHVkV3hzZlNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHUmhkR0V1Ylc5eVpTQTlQVDBnZEhKMVpTQW1KaUJqYUdWamEwWnZjbTFoZEhSbGNpaHZjSFJ6TG1admNtMWhkRXh2WVdSTmIzSmxMQ0JjSW1admNtMWhkRXh2WVdSTmIzSmxYQ0lwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBjeTVoY0hCbGJtUW9YQ0k4YkdrZ1kyeGhjM005SjNObGJHVmpkREl0Ylc5eVpTMXlaWE4xYkhSekp6NWNJaUFySUhObGJHWXViM0IwY3k1bGMyTmhjR1ZOWVhKcmRYQW9iM0IwY3k1bWIzSnRZWFJNYjJGa1RXOXlaU2gwYUdsekxuSmxjM1ZzZEhOUVlXZGxLU2tnS3lCY0lqd3ZiR2srWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhkcGJtUnZkeTV6WlhSVWFXMWxiM1YwS0daMWJtTjBhVzl1S0NrZ2V5QnpaV3htTG14dllXUk5iM0psU1daT1pXVmtaV1FvS1RzZ2ZTd2dNVEFwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjRzl6ZEhCeWIyTmxjM05TWlhOMWJIUnpLR1JoZEdFc0lHbHVhWFJwWVd3cE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCdmMzUlNaVzVrWlhJb0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1MGNtbG5aMlZ5S0hzZ2RIbHdaVG9nWENKelpXeGxZM1F5TFd4dllXUmxaRndpTENCcGRHVnRjem9nWkdGMFlTQjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU2w5S1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJoWW5OMGNtRmpkRnh5WEc0Z0lDQWdJQ0FnSUdOaGJtTmxiRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU5zYjNObEtDazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z1lXSnpkSEpoWTNSY2NseHVJQ0FnSUNBZ0lDQmliSFZ5T2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJR2xtSUhObGJHVmpkRTl1UW14MWNpQTlQU0IwY25WbExDQnpaV3hsWTNRZ2RHaGxJR04xY25KbGJuUnNlU0JvYVdkb2JHbG5hSFJsWkNCdmNIUnBiMjVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXViM0IwY3k1elpXeGxZM1JQYmtKc2RYSXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxiR1ZqZEVocFoyaHNhV2RvZEdWa0tIdHViMFp2WTNWek9pQjBjblZsZlNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Oc2IzTmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyOXVkR0ZwYm1WeUxuSmxiVzkyWlVOc1lYTnpLRndpYzJWc1pXTjBNaTFqYjI1MFlXbHVaWEl0WVdOMGFYWmxYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCemVXNXZibmx0YjNWeklIUnZJQzVwY3lnbk9tWnZZM1Z6Snlrc0lIZG9hV05vSUdseklHRjJZV2xzWVdKc1pTQnBiaUJxY1hWbGNua2dQajBnTVM0MlhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG5ObFlYSmphRnN3WFNBOVBUMGdaRzlqZFcxbGJuUXVZV04wYVhabFJXeGxiV1Z1ZENrZ2V5QjBhR2x6TG5ObFlYSmphQzVpYkhWeUtDazdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1amJHVmhjbE5sWVhKamFDZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGJHVmpkR2x2Ymk1bWFXNWtLRndpTG5ObGJHVmpkREl0YzJWaGNtTm9MV05vYjJsalpTMW1iMk4xYzF3aUtTNXlaVzF2ZG1WRGJHRnpjeWhjSW5ObGJHVmpkREl0YzJWaGNtTm9MV05vYjJsalpTMW1iMk4xYzF3aUtUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCaFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lHWnZZM1Z6VTJWaGNtTm9PaUJtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdadlkzVnpLSFJvYVhNdWMyVmhjbU5vS1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJoWW5OMGNtRmpkRnh5WEc0Z0lDQWdJQ0FnSUhObGJHVmpkRWhwWjJoc2FXZG9kR1ZrT2lCbWRXNWpkR2x2YmlBb2IzQjBhVzl1Y3lrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdhVzVrWlhnOWRHaHBjeTVvYVdkb2JHbG5hSFFvS1N4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHaHBaMmhzYVdkb2RHVmtQWFJvYVhNdWNtVnpkV3gwY3k1bWFXNWtLRndpTG5ObGJHVmpkREl0YUdsbmFHeHBaMmgwWldSY0lpa3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrWVhSaElEMGdhR2xuYUd4cFoyaDBaV1F1WTJ4dmMyVnpkQ2duTG5ObGJHVmpkREl0Y21WemRXeDBKeWt1WkdGMFlTaGNJbk5sYkdWamRESXRaR0YwWVZ3aUtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoa1lYUmhLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbWhwWjJoc2FXZG9kQ2hwYm1SbGVDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXVVMlZzWldOMEtHUmhkR0VzSUc5d2RHbHZibk1wTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0c5d2RHbHZibk1nSmlZZ2IzQjBhVzl1Y3k1dWIwWnZZM1Z6S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Oc2IzTmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QmhZbk4wY21GamRGeHlYRzRnSUNBZ0lDQWdJR2RsZEZCc1lXTmxhRzlzWkdWeU9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCd2JHRmpaV2h2YkdSbGNrOXdkR2x2Ymp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMbUYwZEhJb1hDSndiR0ZqWldodmJHUmxjbHdpS1NCOGZGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmNIUnpMbVZzWlcxbGJuUXVZWFIwY2loY0ltUmhkR0V0Y0d4aFkyVm9iMnhrWlhKY0lpa2dmSHdnTHk4Z2FuRjFaWEo1SURFdU5DQmpiMjF3WVhSY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExtUmhkR0VvWENKd2JHRmpaV2h2YkdSbGNsd2lLU0I4ZkZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSekxuQnNZV05sYUc5c1pHVnlJSHg4WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBb0tIQnNZV05sYUc5c1pHVnlUM0IwYVc5dUlEMGdkR2hwY3k1blpYUlFiR0ZqWldodmJHUmxjazl3ZEdsdmJpZ3BLU0FoUFQwZ2RXNWtaV1pwYm1Wa0lEOGdjR3hoWTJWb2IyeGtaWEpQY0hScGIyNHVkR1Y0ZENncElEb2dkVzVrWldacGJtVmtLVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QmhZbk4wY21GamRGeHlYRzRnSUNBZ0lDQWdJR2RsZEZCc1lXTmxhRzlzWkdWeVQzQjBhVzl1T2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWMyVnNaV04wS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWm1seWMzUlBjSFJwYjI0Z1BTQjBhR2x6TG5ObGJHVmpkQzVqYUdsc1pISmxiaWdwTG1acGNuTjBLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1dmNIUnpMbkJzWVdObGFHOXNaR1Z5VDNCMGFXOXVJQ0U5UFNCMWJtUmxabWx1WldRZ0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OUVaWFJsY20xcGJtVWdkR2hsSUhCc1lXTmxhRzlzWkdWeUlHOXdkR2x2YmlCaVlYTmxaQ0J2YmlCMGFHVWdjM0JsWTJsbWFXVmtJSEJzWVdObGFHOXNaR1Z5VDNCMGFXOXVJSE5sZEhScGJtZGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnS0hSb2FYTXViM0IwY3k1d2JHRmpaV2h2YkdSbGNrOXdkR2x2YmlBOVBUMGdYQ0ptYVhKemRGd2lJQ1ltSUdacGNuTjBUM0IwYVc5dUtTQjhmRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBb2RIbHdaVzltSUhSb2FYTXViM0IwY3k1d2JHRmpaV2h2YkdSbGNrOXdkR2x2YmlBOVBUMGdYQ0ptZFc1amRHbHZibHdpSUNZbUlIUm9hWE11YjNCMGN5NXdiR0ZqWldodmJHUmxjazl3ZEdsdmJpaDBhR2x6TG5ObGJHVmpkQ2twTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaG1hWEp6ZEU5d2RHbHZiaTUwWlhoMEtDa2dQVDA5SUZ3aVhDSWdKaVlnWm1seWMzUlBjSFJwYjI0dWRtRnNLQ2tnUFQwOUlGd2lYQ0lwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2TDA1dklHVjRjR3hwWTJsMElIQnNZV05sYUc5c1pHVnlJRzl3ZEdsdmJpQnpjR1ZqYVdacFpXUXNJSFZ6WlNCMGFHVWdabWx5YzNRZ2FXWWdhWFFuY3lCaWJHRnVhMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCbWFYSnpkRTl3ZEdsdmJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4cUtseHlYRzRnSUNBZ0lDQWdJQ0FxSUVkbGRDQjBhR1VnWkdWemFYSmxaQ0IzYVdSMGFDQm1iM0lnZEdobElHTnZiblJoYVc1bGNpQmxiR1Z0Wlc1MExpQWdWR2hwY3lCcGMxeHlYRzRnSUNBZ0lDQWdJQ0FxSUdSbGNtbDJaV1FnWm1seWMzUWdabkp2YlNCdmNIUnBiMjRnWUhkcFpIUm9ZQ0J3WVhOelpXUWdkRzhnYzJWc1pXTjBNaXdnZEdobGJseHlYRzRnSUNBZ0lDQWdJQ0FxSUhSb1pTQnBibXhwYm1VZ0ozTjBlV3hsSnlCdmJpQjBhR1VnYjNKcFoybHVZV3dnWld4bGJXVnVkQ3dnWVc1a0lHWnBibUZzYkhsY2NseHVJQ0FnSUNBZ0lDQWdLaUJtWVd4c2N5QmlZV05ySUhSdklIUm9aU0JxVVhWbGNua2dZMkZzWTNWc1lYUmxaQ0JsYkdWdFpXNTBJSGRwWkhSb0xseHlYRzRnSUNBZ0lDQWdJQ0FxTDF4eVhHNGdJQ0FnSUNBZ0lDOHZJR0ZpYzNSeVlXTjBYSEpjYmlBZ0lDQWdJQ0FnYVc1cGRFTnZiblJoYVc1bGNsZHBaSFJvT2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHWjFibU4wYVc5dUlISmxjMjlzZG1WRGIyNTBZV2x1WlhKWGFXUjBhQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ6ZEhsc1pTd2dZWFIwY25Nc0lHMWhkR05vWlhNc0lHa3NJR3c3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXViM0IwY3k1M2FXUjBhQ0E5UFQwZ1hDSnZabVpjSWlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ1ZFd4c08xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2gwYUdsekxtOXdkSE11ZDJsa2RHZ2dQVDA5SUZ3aVpXeGxiV1Z1ZEZ3aUtYdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1YjNWMFpYSlhhV1IwYUNobVlXeHpaU2tnUFQwOUlEQWdQeUFuWVhWMGJ5Y2dPaUIwYUdsekxtOXdkSE11Wld4bGJXVnVkQzV2ZFhSbGNsZHBaSFJvS0daaGJITmxLU0FySUNkd2VDYzdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hSb2FYTXViM0IwY3k1M2FXUjBhQ0E5UFQwZ1hDSmpiM0I1WENJZ2ZId2dkR2hwY3k1dmNIUnpMbmRwWkhSb0lEMDlQU0JjSW5KbGMyOXNkbVZjSWlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHTm9aV05ySUdsbUlIUm9aWEpsSUdseklHbHViR2x1WlNCemRIbHNaU0J2YmlCMGFHVWdaV3hsYldWdWRDQjBhR0YwSUdOdmJuUmhhVzV6SUhkcFpIUm9YSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzUjViR1VnUFNCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1aGRIUnlLQ2R6ZEhsc1pTY3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h6ZEhsc1pTQWhQVDBnZFc1a1pXWnBibVZrS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRjBkSEp6SUQwZ2MzUjViR1V1YzNCc2FYUW9KenNuS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptOXlJQ2hwSUQwZ01Dd2diQ0E5SUdGMGRISnpMbXhsYm1kMGFEc2dhU0E4SUd3N0lHa2dQU0JwSUNzZ01Ta2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JXRjBZMmhsY3lBOUlHRjBkSEp6VzJsZExuSmxjR3hoWTJVb0wxeGNjeTluTENBbkp5bGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXViV0YwWTJnb0wxdGVMVjEzYVdSMGFEb29LRnN0SzEwL0tGc3dMVGxkS2x4Y0xpay9XekF0T1YwcktTaHdlSHhsYlh4bGVId2xmR2x1ZkdOdGZHMXRmSEIwZkhCaktTa3ZhU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYldGMFkyaGxjeUFoUFQwZ2JuVnNiQ0FtSmlCdFlYUmphR1Z6TG14bGJtZDBhQ0ErUFNBeEtWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCdFlYUmphR1Z6V3pGZE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXZjSFJ6TG5kcFpIUm9JRDA5UFNCY0luSmxjMjlzZG1WY0lpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCdVpYaDBJR05vWldOcklHbG1JR056Y3lnbmQybGtkR2duS1NCallXNGdjbVZ6YjJ4MlpTQmhJSGRwWkhSb0lIUm9ZWFFnYVhNZ2NHVnlZMlZ1ZENCaVlYTmxaQ3dnZEdocGN5QnBjeUJ6YjIxbGRHbHRaWE1nY0c5emMybGliR1ZjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2QyaGxiaUJoZEhSaFkyaGxaQ0IwYnlCcGJuQjFkQ0IwZVhCbFBXaHBaR1JsYmlCdmNpQmxiR1Z0Wlc1MGN5Qm9hV1JrWlc0Z2RtbGhJR056YzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRIbHNaU0E5SUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG1OemN5Z25kMmxrZEdnbktUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hOMGVXeGxMbWx1WkdWNFQyWW9YQ0lsWENJcElENGdNQ2tnY21WMGRYSnVJSE4wZVd4bE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1ptbHVZV3hzZVN3Z1ptRnNiR0poWTJzZ2IyNGdkR2hsSUdOaGJHTjFiR0YwWldRZ2QybGtkR2dnYjJZZ2RHaGxJR1ZzWlcxbGJuUmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlDaDBhR2x6TG05d2RITXVaV3hsYldWdWRDNXZkWFJsY2xkcFpIUm9LR1poYkhObEtTQTlQVDBnTUNBL0lDZGhkWFJ2SnlBNklIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExtOTFkR1Z5VjJsa2RHZ29abUZzYzJVcElDc2dKM0I0SnlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYm5Wc2JEdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvSkM1cGMwWjFibU4wYVc5dUtIUm9hWE11YjNCMGN5NTNhV1IwYUNrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXZjSFJ6TG5kcFpIUm9LQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG05d2RITXVkMmxrZEdnN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCM2FXUjBhQ0E5SUhKbGMyOXNkbVZEYjI1MFlXbHVaWEpYYVdSMGFDNWpZV3hzS0hSb2FYTXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZDJsa2RHZ2dJVDA5SUc1MWJHd3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdGcGJtVnlMbU56Y3loY0luZHBaSFJvWENJc0lIZHBaSFJvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lIMHBPMXh5WEc1Y2NseHVJQ0FnSUZOcGJtZHNaVk5sYkdWamRESWdQU0JqYkdGNmVpaEJZbk4wY21GamRGTmxiR1ZqZERJc0lIdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdjMmx1WjJ4bFhISmNibHh5WEc0Z0lDQWdJQ0FnSUdOeVpXRjBaVU52Ym5SaGFXNWxjam9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdZMjl1ZEdGcGJtVnlJRDBnSkNoa2IyTjFiV1Z1ZEM1amNtVmhkR1ZGYkdWdFpXNTBLRndpWkdsMlhDSXBLUzVoZEhSeUtIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpWTJ4aGMzTmNJam9nWENKelpXeGxZM1F5TFdOdmJuUmhhVzVsY2x3aVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcExtaDBiV3dvVzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSThZU0JvY21WbVBTZHFZWFpoYzJOeWFYQjBPblp2YVdRb01Da25JRzl1WTJ4cFkyczlKM0psZEhWeWJpQm1ZV3h6WlRzbklHTnNZWE56UFNkelpXeGxZM1F5TFdOb2IybGpaU2NnZEdGaWFXNWtaWGc5SnkweEp6NWNJaXhjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aUlDQWdQSE53WVc0Z1kyeGhjM005SjNObGJHVmpkREl0WTJodmMyVnVKejRtYm1KemNEczhMM053WVc0K1BHRmlZbklnWTJ4aGMzTTlKM05sYkdWamRESXRjMlZoY21Ob0xXTm9iMmxqWlMxamJHOXpaU2MrUEM5aFltSnlQbHdpTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSWdJQ0E4YzNCaGJpQmpiR0Z6Y3owbmMyVnNaV04wTWkxaGNuSnZkeWMrUEdrZ1kyeGhjM005SjJaaElHWmhMWE52Y25RZ1luSmhibVF0YVc1bWJ5QnpaV3hsWTNReUxXWmhKejQ4TDJrK1BDOXpjR0Z1UGx3aUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0k4TDJFK1hDSXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWp4cGJuQjFkQ0JqYkdGemN6MG5jMlZzWldOME1pMW1iMk4xYzNObGNpQnpaV3hsWTNReUxXOW1abk5qY21WbGJpY2dkSGx3WlQwbmRHVjRkQ2N2UGx3aUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0k4WkdsMklHTnNZWE56UFNkelpXeGxZM1F5TFdSeWIzQWdjMlZzWldOME1pMWthWE53YkdGNUxXNXZibVVuUGx3aUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0lnSUNBOFpHbDJJR05zWVhOelBTZHpaV3hsWTNReUxYTmxZWEpqYUNjK1hDSXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWlBZ0lDQWdJQ0E4YVc1d2RYUWdkSGx3WlQwbmRHVjRkQ2NnWVhWMGIyTnZiWEJzWlhSbFBTZHZabVluSUdGMWRHOWpiM0p5WldOMFBTZHZabVluSUdGMWRHOWpZWEJwZEdGc2FYcGxQU2R2Wm1ZbklITndaV3hzWTJobFkyczlKMlpoYkhObEp5QmpiR0Z6Y3owbmMyVnNaV04wTWkxcGJuQjFkQ2N2UGx3aUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0lnSUNBOEwyUnBkajVjSWl4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lJQ0FnUEhWc0lHTnNZWE56UFNkelpXeGxZM1F5TFhKbGMzVnNkSE1uUGx3aUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0lnSUNBOEwzVnNQbHdpTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSThMMlJwZGo1Y0lsMHVhbTlwYmloY0lsd2lLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmpiMjUwWVdsdVpYSTdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2MybHVaMnhsWEhKY2JpQWdJQ0FnSUNBZ1pXNWhZbXhsU1c1MFpYSm1ZV05sT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWNHRnlaVzUwTG1WdVlXSnNaVWx1ZEdWeVptRmpaUzVoY0hCc2VTaDBhR2x6TENCaGNtZDFiV1Z1ZEhNcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtWnZZM1Z6YzJWeUxuQnliM0FvWENKa2FYTmhZbXhsWkZ3aUxDQWhkR2hwY3k1cGMwbHVkR1Z5Wm1GalpVVnVZV0pzWldRb0tTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCemFXNW5iR1ZjY2x4dUlDQWdJQ0FnSUNCdmNHVnVhVzVuT2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJsYkN3Z2NtRnVaMlVzSUd4bGJqdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEhNdWJXbHVhVzExYlZKbGMzVnNkSE5HYjNKVFpXRnlZMmdnUGowZ01Da2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXphRzkzVTJWaGNtTm9LSFJ5ZFdVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5CaGNtVnVkQzV2Y0dWdWFXNW5MbUZ3Y0d4NUtIUm9hWE1zSUdGeVozVnRaVzUwY3lrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXphRzkzVTJWaGNtTm9TVzV3ZFhRZ0lUMDlJR1poYkhObEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCSlJTQmhjSEJsYm1SeklHWnZZM1Z6YzJWeUxuWmhiQ2dwSUdGMElIUm9aU0JsYm1RZ2IyWWdabWxsYkdRZ09pOGdjMjhnZDJVZ2JXRnVkV0ZzYkhrZ2FXNXpaWEowSUdsMElHRjBJSFJvWlNCaVpXZHBibTVwYm1jZ2RYTnBibWNnWVNCeVlXNW5aVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1lXeHNJRzkwYUdWeUlHSnliM2R6WlhKeklHaGhibVJzWlNCMGFHbHpJR3AxYzNRZ1ptbHVaVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWaGNtTm9MblpoYkNoMGFHbHpMbVp2WTNWemMyVnlMblpoYkNncEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sWVhKamFDNW1iMk4xY3lncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QnRiM1psSUhSb1pTQmpkWEp6YjNJZ2RHOGdkR2hsSUdWdVpDQmhablJsY2lCbWIyTjFjM05wYm1jc0lHOTBhR1Z5ZDJselpTQnBkQ0IzYVd4c0lHSmxJR0YwSUhSb1pTQmlaV2RwYm01cGJtY2dZVzVrWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUc1bGR5QjBaWGgwSUhkcGJHd2dZWEJ3WldGeUlDcGlaV1p2Y21VcUlHWnZZM1Z6YzJWeUxuWmhiQ2dwWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR1ZzSUQwZ2RHaHBjeTV6WldGeVkyZ3VaMlYwS0RBcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aV3d1WTNKbFlYUmxWR1Y0ZEZKaGJtZGxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVlXNW5aU0E5SUdWc0xtTnlaV0YwWlZSbGVIUlNZVzVuWlNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbUZ1WjJVdVkyOXNiR0Z3YzJVb1ptRnNjMlVwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtRnVaMlV1YzJWc1pXTjBLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvWld3dWMyVjBVMlZzWldOMGFXOXVVbUZ1WjJVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hsYmlBOUlIUm9hWE11YzJWaGNtTm9MblpoYkNncExteGxibWQwYUR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnNMbk5sZEZObGJHVmpkR2x2YmxKaGJtZGxLR3hsYml3Z2JHVnVLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FXNXBkR2xoYkdsNlpYTWdjMlZoY21Ob0ozTWdkbUZzZFdVZ2QybDBhQ0J1WlhoMFUyVmhjbU5vVkdWeWJTQW9hV1lnWkdWbWFXNWxaQ0JpZVNCMWMyVnlLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJwWjI1dmNtVWdibVY0ZEZObFlYSmphRlJsY20wZ2FXWWdkR2hsSUdSeWIzQmtiM2R1SUdseklHOXdaVzVsWkNCaWVTQjBhR1VnZFhObGNpQndjbVZ6YzJsdVp5QmhJR3hsZEhSbGNseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppaDBhR2x6TG5ObFlYSmphQzUyWVd3b0tTQTlQVDBnWENKY0lpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZb2RHaHBjeTV1WlhoMFUyVmhjbU5vVkdWeWJTQWhQU0IxYm1SbFptbHVaV1FwZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG5aaGJDaDBhR2x6TG01bGVIUlRaV0Z5WTJoVVpYSnRLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphQzV6Wld4bFkzUW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVtYjJOMWMzTmxjaTV3Y205d0tGd2laR2x6WVdKc1pXUmNJaXdnZEhKMVpTa3VkbUZzS0Z3aVhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5Wd1pHRjBaVkpsYzNWc2RITW9kSEoxWlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG5SeWFXZG5aWElvSkM1RmRtVnVkQ2hjSW5ObGJHVmpkREl0YjNCbGJsd2lLU2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdjMmx1WjJ4bFhISmNiaUFnSUNBZ0lDQWdZMnh2YzJVNklHWjFibU4wYVc5dUlDaHdZWEpoYlhNcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0YwYUdsekxtOXdaVzVsWkNncEtTQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjR0Z5Wlc1MExtTnNiM05sTG1Gd2NHeDVLSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5azdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J3WVhKaGJYTWdQU0J3WVhKaGJYTWdmSHdnZTJadlkzVnpPaUIwY25WbGZUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVtYjJOMWMzTmxjaTV5WlcxdmRtVkJkSFJ5S0Z3aVpHbHpZV0pzWldSY0lpazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2NHRnlZVzF6TG1adlkzVnpLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVp2WTNWemMyVnlMbVp2WTNWektDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCemFXNW5iR1ZjY2x4dUlDQWdJQ0FnSUNCbWIyTjFjem9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1dmNHVnVaV1FvS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1amJHOXpaU2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW1iMk4xYzNObGNpNXlaVzF2ZG1WQmRIUnlLRndpWkdsellXSnNaV1JjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1adlkzVnpjMlZ5TG1adlkzVnpLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QnphVzVuYkdWY2NseHVJQ0FnSUNBZ0lDQnBjMFp2WTNWelpXUTZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVkyOXVkR0ZwYm1WeUxtaGhjME5zWVhOektGd2ljMlZzWldOME1pMWpiMjUwWVdsdVpYSXRZV04wYVhabFhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklITnBibWRzWlZ4eVhHNGdJQ0FnSUNBZ0lHTmhibU5sYkRvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5CaGNtVnVkQzVqWVc1alpXd3VZWEJ3Ykhrb2RHaHBjeXdnWVhKbmRXMWxiblJ6S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW1iMk4xYzNObGNpNXlaVzF2ZG1WQmRIUnlLRndpWkdsellXSnNaV1JjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVabTlqZFhOelpYSXVabTlqZFhNb0tUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCemFXNW5iR1ZjY2x4dUlDQWdJQ0FnSUNCa1pYTjBjbTk1T2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0pDaGNJbXhoWW1Wc1cyWnZjajBuWENJZ0t5QjBhR2x6TG1adlkzVnpjMlZ5TG1GMGRISW9KMmxrSnlrZ0t5QmNJaWRkWENJcFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXVZWFIwY2lnblptOXlKeXdnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1WVhSMGNpaGNJbWxrWENJcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV3WVhKbGJuUXVaR1Z6ZEhKdmVTNWhjSEJzZVNoMGFHbHpMQ0JoY21kMWJXVnVkSE1wTzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJSE5wYm1kc1pWeHlYRzRnSUNBZ0lDQWdJR2x1YVhSRGIyNTBZV2x1WlhJNklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnpaV3hsWTNScGIyNHNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjI1MFlXbHVaWElnUFNCMGFHbHpMbU52Ym5SaGFXNWxjaXhjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdSeWIzQmtiM2R1SUQwZ2RHaHBjeTVrY205d1pHOTNianRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG05d2RITXViV2x1YVcxMWJWSmxjM1ZzZEhOR2IzSlRaV0Z5WTJnZ1BDQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5vYjNkVFpXRnlZMmdvWm1Gc2MyVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1emFHOTNVMlZoY21Ob0tIUnlkV1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sYkdWamRHbHZiaUE5SUhObGJHVmpkR2x2YmlBOUlHTnZiblJoYVc1bGNpNW1hVzVrS0Z3aUxuTmxiR1ZqZERJdFkyaHZhV05sWENJcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1bWIyTjFjM05sY2lBOUlHTnZiblJoYVc1bGNpNW1hVzVrS0Z3aUxuTmxiR1ZqZERJdFptOWpkWE56WlhKY0lpazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCeVpYZHlhWFJsSUd4aFltVnNjeUJtY205dElHOXlhV2RwYm1Gc0lHVnNaVzFsYm5RZ2RHOGdabTlqZFhOelpYSmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVtYjJOMWMzTmxjaTVoZEhSeUtGd2lhV1JjSWl3Z1hDSnpNbWxrWDJGMWRHOW5aVzVjSWl0dVpYaDBWV2xrS0NrcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdKQ2hjSW14aFltVnNXMlp2Y2owblhDSWdLeUIwYUdsekxtOXdkSE11Wld4bGJXVnVkQzVoZEhSeUtGd2lhV1JjSWlrZ0t5QmNJaWRkWENJcFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXVZWFIwY2lnblptOXlKeXdnZEdocGN5NW1iMk4xYzNObGNpNWhkSFJ5S0NkcFpDY3BLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVabTlqZFhOelpYSXVZWFIwY2loY0luUmhZbWx1WkdWNFhDSXNJSFJvYVhNdVpXeGxiV1Z1ZEZSaFlrbHVaR1Y0S1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWaGNtTm9MbTl1S0Z3aWEyVjVaRzkzYmx3aUxDQjBhR2x6TG1KcGJtUW9ablZ1WTNScGIyNGdLR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doZEdocGN5NXBjMGx1ZEdWeVptRmpaVVZ1WVdKc1pXUW9LU2tnY21WMGRYSnVPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsTG5kb2FXTm9JRDA5UFNCTFJWa3VVRUZIUlY5VlVDQjhmQ0JsTG5kb2FXTm9JRDA5UFNCTFJWa3VVRUZIUlY5RVQxZE9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnY0hKbGRtVnVkQ0IwYUdVZ2NHRm5aU0JtY205dElITmpjbTlzYkdsdVoxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd0cGJHeEZkbVZ1ZENobEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNkcGRHTm9JQ2hsTG5kb2FXTm9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMkZ6WlNCTFJWa3VWVkE2WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMkZ6WlNCTFJWa3VSRTlYVGpwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV0YjNabFNHbG5hR3hwWjJoMEtDaGxMbmRvYVdOb0lEMDlQU0JMUlZrdVZWQXBJRDhnTFRFZ09pQXhLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYTJsc2JFVjJaVzUwS0dVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGelpTQkxSVmt1UlU1VVJWSTZYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVnNaV04wU0dsbmFHeHBaMmgwWldRb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhMmxzYkVWMlpXNTBLR1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMkZ6WlNCTFJWa3VWRUZDT2x4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnBaaUJ6Wld4bFkzUlBia0pzZFhJZ1BUMGdkSEoxWlN3Z2MyVnNaV04wSUhSb1pTQmpkWEp5Wlc1MGJIa2dhR2xuYUd4cFoyaDBaV1FnYjNCMGFXOXVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEhNdWMyVnNaV04wVDI1Q2JIVnlLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGJHVmpkRWhwWjJoc2FXZG9kR1ZrS0h0dWIwWnZZM1Z6T2lCMGNuVmxmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ1MwVlpMa1ZUUXpwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqWVc1alpXd29aU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd0cGJHeEZkbVZ1ZENobEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sWVhKamFDNXZiaWhjSW1Kc2RYSmNJaXdnZEdocGN5NWlhVzVrS0daMWJtTjBhVzl1S0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUdFZ2QyOXlhMkZ5YjNWdVpDQm1iM0lnWTJoeWIyMWxJSFJ2SUd0bFpYQWdkR2hsSUhObFlYSmphQ0JtYVdWc1pDQm1iMk4xYzNObFpDQjNhR1Z1SUhSb1pTQnpZM0p2Ykd3Z1ltRnlJR2x6SUhWelpXUWdkRzhnYzJOeWIyeHNJSFJvWlNCa2NtOXdaRzkzYmk1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSGRwZEdodmRYUWdkR2hwY3lCMGFHVWdjMlZoY21Ob0lHWnBaV3hrSUd4dmMyVnpJR1p2WTNWeklIZG9hV05vSUdseklHRnVibTk1YVc1blhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWkc5amRXMWxiblF1WVdOMGFYWmxSV3hsYldWdWRDQTlQVDBnZEdocGN5NWliMlI1S0NrdVoyVjBLREFwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZDJsdVpHOTNMbk5sZEZScGJXVnZkWFFvZEdocGN5NWlhVzVrS0daMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphQzVtYjJOMWN5Z3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHBMQ0F3S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTa3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW1iMk4xYzNObGNpNXZiaWhjSW10bGVXUnZkMjVjSWl3Z2RHaHBjeTVpYVc1a0tHWjFibU4wYVc5dUlDaGxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWFJvYVhNdWFYTkpiblJsY21aaFkyVkZibUZpYkdWa0tDa3BJSEpsZEhWeWJqdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aUzUzYUdsamFDQTlQVDBnUzBWWkxsUkJRaUI4ZkNCTFJWa3VhWE5EYjI1MGNtOXNLR1VwSUh4OElFdEZXUzVwYzBaMWJtTjBhVzl1UzJWNUtHVXBJSHg4SUdVdWQyaHBZMmdnUFQwOUlFdEZXUzVGVTBNcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YjNCMGN5NXZjR1Z1VDI1RmJuUmxjaUE5UFQwZ1ptRnNjMlVnSmlZZ1pTNTNhR2xqYUNBOVBUMGdTMFZaTGtWT1ZFVlNLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhMmxzYkVWMlpXNTBLR1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWlM1M2FHbGphQ0E5UFNCTFJWa3VSRTlYVGlCOGZDQmxMbmRvYVdOb0lEMDlJRXRGV1M1VlVGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUh4OElDaGxMbmRvYVdOb0lEMDlJRXRGV1M1RlRsUkZVaUFtSmlCMGFHbHpMbTl3ZEhNdWIzQmxiazl1Ulc1MFpYSXBLU0I3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxMbUZzZEV0bGVTQjhmQ0JsTG1OMGNteExaWGtnZkh3Z1pTNXphR2xtZEV0bGVTQjhmQ0JsTG0xbGRHRkxaWGtwSUhKbGRIVnlianRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjR1Z1S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYTJsc2JFVjJaVzUwS0dVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnlianRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pTNTNhR2xqYUNBOVBTQkxSVmt1UkVWTVJWUkZJSHg4SUdVdWQyaHBZMmdnUFQwZ1MwVlpMa0pCUTB0VFVFRkRSU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEhNdVlXeHNiM2REYkdWaGNpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNaV0Z5S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3RwYkd4RmRtVnVkQ2hsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwS1R0Y2NseHVYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwYm5OMFlXeHNTMlY1VlhCRGFHRnVaMlZGZG1WdWRDaDBhR2x6TG1adlkzVnpjMlZ5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW1iMk4xYzNObGNpNXZiaWhjSW10bGVYVndMV05vWVc1blpTQnBibkIxZEZ3aUxDQjBhR2x6TG1KcGJtUW9ablZ1WTNScGIyNG9aU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWIzQjBjeTV0YVc1cGJYVnRVbVZ6ZFd4MGMwWnZjbE5sWVhKamFDQStQU0F3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlM1emRHOXdVSEp2Y0dGbllYUnBiMjRvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV2Y0dWdVpXUW9LU2tnY21WMGRYSnVPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCbGJpZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1NrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnpaV3hsWTNScGIyNHViMjRvWENKdGIzVnpaV1J2ZDI1Y0lpd2dYQ0poWW1KeVhDSXNJSFJvYVhNdVltbHVaQ2htZFc1amRHbHZiaUFvWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMGFHbHpMbWx6U1c1MFpYSm1ZV05sUlc1aFlteGxaQ2dwS1NCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU5zWldGeUtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JyYVd4c1JYWmxiblJKYlcxbFpHbGhkR1ZzZVNobEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyeHZjMlVvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWc1pXTjBhVzl1TG1adlkzVnpLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lITmxiR1ZqZEdsdmJpNXZiaWhjSW0xdmRYTmxaRzkzYmx3aUxDQjBhR2x6TG1KcGJtUW9ablZ1WTNScGIyNGdLR1VwSUh0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lYUm9hWE11WTI5dWRHRnBibVZ5TG1oaGMwTnNZWE56S0Z3aWMyVnNaV04wTWkxamIyNTBZV2x1WlhJdFlXTjBhWFpsWENJcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWRISnBaMmRsY2lna0xrVjJaVzUwS0Z3aWMyVnNaV04wTWkxbWIyTjFjMXdpS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWIzQmxibVZrS0NrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU5zYjNObEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hSb2FYTXVhWE5KYm5SbGNtWmhZMlZGYm1GaWJHVmtLQ2twSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdaVzRvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcmFXeHNSWFpsYm5Rb1pTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdSeWIzQmtiM2R1TG05dUtGd2liVzkxYzJWa2IzZHVYQ0lzSUhSb2FYTXVZbWx1WkNobWRXNWpkR2x2YmlncElIc2dkR2hwY3k1elpXRnlZMmd1Wm05amRYTW9LVHNnZlNrcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjMlZzWldOMGFXOXVMbTl1S0Z3aVptOWpkWE5jSWl3Z2RHaHBjeTVpYVc1a0tHWjFibU4wYVc5dUtHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd0cGJHeEZkbVZ1ZENobEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTa3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW1iMk4xYzNObGNpNXZiaWhjSW1adlkzVnpYQ0lzSUhSb2FYTXVZbWx1WkNobWRXNWpkR2x2YmlncGUxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMGFHbHpMbU52Ym5SaGFXNWxjaTVvWVhORGJHRnpjeWhjSW5ObGJHVmpkREl0WTI5dWRHRnBibVZ5TFdGamRHbDJaVndpS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG5SeWFXZG5aWElvSkM1RmRtVnVkQ2hjSW5ObGJHVmpkREl0Wm05amRYTmNJaWtwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1amIyNTBZV2x1WlhJdVlXUmtRMnhoYzNNb1hDSnpaV3hsWTNReUxXTnZiblJoYVc1bGNpMWhZM1JwZG1WY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBLUzV2YmloY0ltSnNkWEpjSWl3Z2RHaHBjeTVpYVc1a0tHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TG05d1pXNWxaQ2dwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiMjUwWVdsdVpYSXVjbVZ0YjNabFEyeGhjM01vWENKelpXeGxZM1F5TFdOdmJuUmhhVzVsY2kxaFkzUnBkbVZjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1ZEhKcFoyZGxjaWdrTGtWMlpXNTBLRndpYzJWc1pXTjBNaTFpYkhWeVhDSXBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sWVhKamFDNXZiaWhjSW1adlkzVnpYQ0lzSUhSb2FYTXVZbWx1WkNobWRXNWpkR2x2YmlncGUxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMGFHbHpMbU52Ym5SaGFXNWxjaTVvWVhORGJHRnpjeWhjSW5ObGJHVmpkREl0WTI5dWRHRnBibVZ5TFdGamRHbDJaVndpS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG5SeWFXZG5aWElvSkM1RmRtVnVkQ2hjSW5ObGJHVmpkREl0Wm05amRYTmNJaWtwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1amIyNTBZV2x1WlhJdVlXUmtRMnhoYzNNb1hDSnpaV3hsWTNReUxXTnZiblJoYVc1bGNpMWhZM1JwZG1WY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVhVzVwZEVOdmJuUmhhVzVsY2xkcFpIUm9LQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMbUZrWkVOc1lYTnpLRndpYzJWc1pXTjBNaTF2Wm1aelkzSmxaVzVjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlYwVUd4aFkyVm9iMnhrWlhJb0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdjMmx1WjJ4bFhISmNiaUFnSUNBZ0lDQWdZMnhsWVhJNklHWjFibU4wYVc5dUtIUnlhV2RuWlhKRGFHRnVaMlVwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHUmhkR0U5ZEdocGN5NXpaV3hsWTNScGIyNHVaR0YwWVNoY0luTmxiR1ZqZERJdFpHRjBZVndpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHUmhkR0VwSUhzZ0x5OGdaM1ZoY21RZ1lXZGhhVzV6ZENCeGRXVjFaV1FnY1hWcFkyc2dZMjl1YzJWamRYUnBkbVVnWTJ4cFkydHpYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2NHeGhZMlZvYjJ4a1pYSlBjSFJwYjI0Z1BTQjBhR2x6TG1kbGRGQnNZV05sYUc5c1pHVnlUM0IwYVc5dUtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11Wld4bGJXVnVkQzUyWVd3b2NHeGhZMlZvYjJ4a1pYSlBjSFJwYjI0Z1B5QndiR0ZqWldodmJHUmxjazl3ZEdsdmJpNTJZV3dvS1NBNklGd2lYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6Wld4bFkzUnBiMjR1Wm1sdVpDaGNJaTV6Wld4bFkzUXlMV05vYjNObGJsd2lLUzVsYlhCMGVTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV3hsWTNScGIyNHVjbVZ0YjNabFJHRjBZU2hjSW5ObGJHVmpkREl0WkdGMFlWd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlYwVUd4aFkyVm9iMnhrWlhJb0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kSEpwWjJkbGNrTm9ZVzVuWlNBaFBUMGdabUZzYzJVcGUxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG5SeWFXZG5aWElvZXlCMGVYQmxPaUJjSW5ObGJHVmpkREl0Y21WdGIzWmxaRndpTENCMllXdzZJSFJvYVhNdWFXUW9aR0YwWVNrc0lHTm9iMmxqWlRvZ1pHRjBZU0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuUnlhV2RuWlhKRGFHRnVaMlVvZTNKbGJXOTJaV1E2WkdGMFlYMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5b3FYSEpjYmlBZ0lDQWdJQ0FnSUNvZ1UyVjBjeUJ6Wld4bFkzUnBiMjRnWW1GelpXUWdiMjRnYzI5MWNtTmxJR1ZzWlcxbGJuUW5jeUIyWVd4MVpWeHlYRzRnSUNBZ0lDQWdJQ0FxTDF4eVhHNGdJQ0FnSUNBZ0lDOHZJSE5wYm1kc1pWeHlYRzRnSUNBZ0lDQWdJR2x1YVhSVFpXeGxZM1JwYjI0NklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhObGJHVmpkR1ZrTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTVwYzFCc1lXTmxhRzlzWkdWeVQzQjBhVzl1VTJWc1pXTjBaV1FvS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MWNHUmhkR1ZUWld4bFkzUnBiMjRvYm5Wc2JDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNiM05sS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGRGQnNZV05sYUc5c1pHVnlLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2MyVnNaaUE5SUhSb2FYTTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11YVc1cGRGTmxiR1ZqZEdsdmJpNWpZV3hzS0c1MWJHd3NJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMQ0JtZFc1amRHbHZiaWh6Wld4bFkzUmxaQ2w3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hObGJHVmpkR1ZrSUNFOVBTQjFibVJsWm1sdVpXUWdKaVlnYzJWc1pXTjBaV1FnSVQwOUlHNTFiR3dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaaTUxY0dSaGRHVlRaV3hsWTNScGIyNG9jMlZzWldOMFpXUXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6Wld4bUxtTnNiM05sS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxiR1l1YzJWMFVHeGhZMlZvYjJ4a1pYSW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lHbHpVR3hoWTJWb2IyeGtaWEpQY0hScGIyNVRaV3hsWTNSbFpEb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCd2JHRmpaV2h2YkdSbGNrOXdkR2x2Ymp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TG05d2RITXVjR3hoWTJWb2IyeGtaWElwSUhKbGRIVnliaUJtWVd4elpUc2dMeThnYm04Z2NHeGhZMlZvYjJ4a1pYSWdjM0JsWTJsbWFXVmtJSE52SUc1dklHOXdkR2x2YmlCemFHOTFiR1FnWW1VZ1kyOXVjMmxrWlhKbFpGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnS0Nod2JHRmpaV2h2YkdSbGNrOXdkR2x2YmlBOUlIUm9hWE11WjJWMFVHeGhZMlZvYjJ4a1pYSlBjSFJwYjI0b0tTa2dJVDA5SUhWdVpHVm1hVzVsWkNBbUppQndiR0ZqWldodmJHUmxjazl3ZEdsdmJpNXBjeWduT25ObGJHVmpkR1ZrSnlrcFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjhmQ0FvZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1ZG1Gc0tDa2dQVDA5SUZ3aVhDSXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I4ZkNBb2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWRtRnNLQ2tnUFQwOUlIVnVaR1ZtYVc1bFpDbGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSHg4SUNoMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1MllXd29LU0E5UFQwZ2JuVnNiQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdjMmx1WjJ4bFhISmNiaUFnSUNBZ0lDQWdjSEpsY0dGeVpVOXdkSE02SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzl3ZEhNZ1BTQjBhR2x6TG5CaGNtVnVkQzV3Y21Wd1lYSmxUM0IwY3k1aGNIQnNlU2gwYUdsekxDQmhjbWQxYldWdWRITXBMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1pqMTBhR2x6TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLRzl3ZEhNdVpXeGxiV1Z1ZEM1blpYUW9NQ2t1ZEdGblRtRnRaUzUwYjB4dmQyVnlRMkZ6WlNncElEMDlQU0JjSW5ObGJHVmpkRndpS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJwYm5OMFlXeHNJSFJvWlNCelpXeGxZM1JwYjI0Z2FXNXBkR2xoYkdsNlpYSmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzl3ZEhNdWFXNXBkRk5sYkdWamRHbHZiaUE5SUdaMWJtTjBhVzl1SUNobGJHVnRaVzUwTENCallXeHNZbUZqYXlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnpaV3hsWTNSbFpDQTlJR1ZzWlcxbGJuUXVabWx1WkNoY0lqcHpaV3hsWTNSbFpGd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJoSUhOcGJtZHNaU0J6Wld4bFkzUWdZbTk0SUdGc2QyRjVjeUJvWVhNZ1lTQjJZV3gxWlN3Z2JtOGdibVZsWkNCMGJ5QnVkV3hzSUdOb1pXTnJJQ2R6Wld4bFkzUmxaQ2RjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZV3hzWW1GamF5aHpaV3htTG05d2RHbHZibFJ2UkdGMFlTaHpaV3hsWTNSbFpDa3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoY0ltUmhkR0ZjSWlCcGJpQnZjSFJ6S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJwYm5OMFlXeHNJR1JsWm1GMWJIUWdhVzVwZEZObGJHVmpkR2x2YmlCM2FHVnVJR0Z3Y0d4cFpXUWdkRzhnYUdsa1pHVnVJR2x1Y0hWMElHRnVaQ0JrWVhSaElHbHpJR3h2WTJGc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZjSFJ6TG1sdWFYUlRaV3hsWTNScGIyNGdQU0J2Y0hSekxtbHVhWFJUWld4bFkzUnBiMjRnZkh3Z1puVnVZM1JwYjI0Z0tHVnNaVzFsYm5Rc0lHTmhiR3hpWVdOcktTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR2xrSUQwZ1pXeGxiV1Z1ZEM1MllXd29LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMM05sWVhKamFDQnBiaUJrWVhSaElHSjVJR2xrTENCemRHOXlhVzVuSUhSb1pTQmhZM1IxWVd3Z2JXRjBZMmhwYm1jZ2FYUmxiVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ0WVhSamFDQTlJRzUxYkd3N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjNCMGN5NXhkV1Z5ZVNoN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhkR05vWlhJNklHWjFibU4wYVc5dUtIUmxjbTBzSUhSbGVIUXNJR1ZzS1h0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCcGMxOXRZWFJqYUNBOUlHVnhkV0ZzS0dsa0xDQnZjSFJ6TG1sa0tHVnNLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVhOZmJXRjBZMmdwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYUmphQ0E5SUdWc08xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHbHpYMjFoZEdOb08xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVd4c1ltRmphem9nSVNRdWFYTkdkVzVqZEdsdmJpaGpZV3hzWW1GamF5a2dQeUFrTG01dmIzQWdPaUJtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05oYkd4aVlXTnJLRzFoZEdOb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUc5d2RITTdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2MybHVaMnhsWEhKY2JpQWdJQ0FnSUNBZ1oyVjBVR3hoWTJWb2IyeGtaWEk2SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QnBaaUJoSUhCc1lXTmxhRzlzWkdWeUlHbHpJSE53WldOcFptbGxaQ0J2YmlCaElITnBibWRzWlNCelpXeGxZM1FnZDJsMGFHOTFkQ0JoSUhaaGJHbGtJSEJzWVdObGFHOXNaR1Z5SUc5d2RHbHZiaUJwWjI1dmNtVWdhWFJjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVjMlZzWldOMEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTVuWlhSUWJHRmpaV2h2YkdSbGNrOXdkR2x2YmlncElEMDlQU0IxYm1SbFptbHVaV1FwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdkVzVrWldacGJtVmtPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXdZWEpsYm5RdVoyVjBVR3hoWTJWb2IyeGtaWEl1WVhCd2JIa29kR2hwY3l3Z1lYSm5kVzFsYm5SektUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCemFXNW5iR1ZjY2x4dUlDQWdJQ0FnSUNCelpYUlFiR0ZqWldodmJHUmxjam9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjR3hoWTJWb2IyeGtaWElnUFNCMGFHbHpMbWRsZEZCc1lXTmxhRzlzWkdWeUtDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTVwYzFCc1lXTmxhRzlzWkdWeVQzQjBhVzl1VTJWc1pXTjBaV1FvS1NBbUppQndiR0ZqWldodmJHUmxjaUFoUFQwZ2RXNWtaV1pwYm1Wa0tTQjdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdZMmhsWTJzZ1ptOXlJR0VnY0d4aFkyVm9iMnhrWlhJZ2IzQjBhVzl1SUdsbUlHRjBkR0ZqYUdWa0lIUnZJR0VnYzJWc1pXTjBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV6Wld4bFkzUWdKaVlnZEdocGN5NW5aWFJRYkdGalpXaHZiR1JsY2s5d2RHbHZiaWdwSUQwOVBTQjFibVJsWm1sdVpXUXBJSEpsZEhWeWJqdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sYkdWamRHbHZiaTVtYVc1a0tGd2lMbk5sYkdWamRESXRZMmh2YzJWdVhDSXBMbWgwYld3b2RHaHBjeTV2Y0hSekxtVnpZMkZ3WlUxaGNtdDFjQ2h3YkdGalpXaHZiR1JsY2lrcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZzWldOMGFXOXVMbUZrWkVOc1lYTnpLRndpYzJWc1pXTjBNaTFrWldaaGRXeDBYQ0lwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyOXVkR0ZwYm1WeUxuSmxiVzkyWlVOc1lYTnpLRndpYzJWc1pXTjBNaTFoYkd4dmQyTnNaV0Z5WENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYzJsdVoyeGxYSEpjYmlBZ0lDQWdJQ0FnY0c5emRIQnliMk5sYzNOU1pYTjFiSFJ6T2lCbWRXNWpkR2x2YmlBb1pHRjBZU3dnYVc1cGRHbGhiQ3dnYm05SWFXZG9iR2xuYUhSVmNHUmhkR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlITmxiR1ZqZEdWa0lEMGdNQ3dnYzJWc1ppQTlJSFJvYVhNc0lITm9iM2RUWldGeVkyaEpibkIxZENBOUlIUnlkV1U3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5Qm1hVzVrSUhSb1pTQnpaV3hsWTNSbFpDQmxiR1Z0Wlc1MElHbHVJSFJvWlNCeVpYTjFiSFFnYkdsemRGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1bWFXNWtTR2xuYUd4cFoyaDBZV0pzWlVOb2IybGpaWE1vS1M1bFlXTm9NaWhtZFc1amRHbHZiaUFvYVN3Z1pXeHRLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aWEYxWVd3b2MyVnNaaTVwWkNobGJHMHVaR0YwWVNoY0luTmxiR1ZqZERJdFpHRjBZVndpS1Nrc0lITmxiR1l1YjNCMGN5NWxiR1Z0Wlc1MExuWmhiQ2dwS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGJHVmpkR1ZrSUQwZ2FUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdZVzVrSUdocFoyaHNhV2RvZENCcGRGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ibTlJYVdkb2JHbG5hSFJWY0dSaGRHVWdJVDA5SUdaaGJITmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hVzVwZEdsaGJDQTlQVDBnZEhKMVpTQW1KaUJ6Wld4bFkzUmxaQ0ErUFNBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVvYVdkb2JHbG5hSFFvYzJWc1pXTjBaV1FwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtaHBaMmhzYVdkb2RDZ3dLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhR2xrWlNCMGFHVWdjMlZoY21Ob0lHSnZlQ0JwWmlCMGFHbHpJR2x6SUhSb1pTQm1hWEp6ZENCM1pTQm5iM1FnZEdobElISmxjM1ZzZEhNZ1lXNWtJSFJvWlhKbElHRnlaU0JsYm05MVoyZ2diMllnZEdobGJTQm1iM0lnYzJWaGNtTm9YSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXNXBkR2xoYkNBOVBUMGdkSEoxWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUcxcGJpQTlJSFJvYVhNdWIzQjBjeTV0YVc1cGJYVnRVbVZ6ZFd4MGMwWnZjbE5sWVhKamFEdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodGFXNGdQajBnTUNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMmh2ZDFObFlYSmphQ2hqYjNWdWRGSmxjM1ZzZEhNb1pHRjBZUzV5WlhOMWJIUnpLU0ErUFNCdGFXNHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdjMmx1WjJ4bFhISmNiaUFnSUNBZ0lDQWdjMmh2ZDFObFlYSmphRG9nWm5WdVkzUnBiMjRvYzJodmQxTmxZWEpqYUVsdWNIVjBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbk5vYjNkVFpXRnlZMmhKYm5CMWRDQTlQVDBnYzJodmQxTmxZWEpqYUVsdWNIVjBLU0J5WlhSMWNtNDdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTm9iM2RUWldGeVkyaEpibkIxZENBOUlITm9iM2RUWldGeVkyaEpibkIxZER0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WkhKdmNHUnZkMjR1Wm1sdVpDaGNJaTV6Wld4bFkzUXlMWE5sWVhKamFGd2lLUzUwYjJkbmJHVkRiR0Z6Y3loY0luTmxiR1ZqZERJdGMyVmhjbU5vTFdocFpHUmxibHdpTENBaGMyaHZkMU5sWVhKamFFbHVjSFYwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWtjbTl3Wkc5M2JpNW1hVzVrS0Z3aUxuTmxiR1ZqZERJdGMyVmhjbU5vWENJcExuUnZaMmRzWlVOc1lYTnpLRndpYzJWc1pXTjBNaTF2Wm1aelkzSmxaVzVjSWl3Z0lYTm9iM2RUWldGeVkyaEpibkIxZENrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dllXUmtJRndpYzJWc1pXTjBNaTEzYVhSb0xYTmxZWEpqYUdKdmVGd2lJSFJ2SUhSb1pTQmpiMjUwWVdsdVpYSWdhV1lnYzJWaGNtTm9JR0p2ZUNCcGN5QnphRzkzYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FrS0hSb2FYTXVaSEp2Y0dSdmQyNHNJSFJvYVhNdVkyOXVkR0ZwYm1WeUtTNTBiMmRuYkdWRGJHRnpjeWhjSW5ObGJHVmpkREl0ZDJsMGFDMXpaV0Z5WTJoaWIzaGNJaXdnYzJodmQxTmxZWEpqYUVsdWNIVjBLVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QnphVzVuYkdWY2NseHVJQ0FnSUNBZ0lDQnZibE5sYkdWamREb2dablZ1WTNScGIyNGdLR1JoZEdFc0lHOXdkR2x2Ym5NcElIdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTUwY21sbloyVnlVMlZzWldOMEtHUmhkR0VwS1NCN0lISmxkSFZ5YmpzZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUc5c1pDQTlJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMblpoYkNncExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMnhrUkdGMFlTQTlJSFJvYVhNdVpHRjBZU2dwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWRtRnNLSFJvYVhNdWFXUW9aR0YwWVNrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblZ3WkdGMFpWTmxiR1ZqZEdsdmJpaGtZWFJoS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExuUnlhV2RuWlhJb2V5QjBlWEJsT2lCY0luTmxiR1ZqZERJdGMyVnNaV04wWldSY0lpd2dkbUZzT2lCMGFHbHpMbWxrS0dSaGRHRXBMQ0JqYUc5cFkyVTZJR1JoZEdFZ2ZTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtNWxlSFJUWldGeVkyaFVaWEp0SUQwZ2RHaHBjeTV2Y0hSekxtNWxlSFJUWldGeVkyaFVaWEp0S0dSaGRHRXNJSFJvYVhNdWMyVmhjbU5vTG5aaGJDZ3BLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1amJHOXpaU2dwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0Z2Y0hScGIyNXpJSHg4SUNGdmNIUnBiMjV6TG01dlJtOWpkWE1wWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sYkdWamRHbHZiaTVtYjJOMWN5Z3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmxjWFZoYkNodmJHUXNJSFJvYVhNdWFXUW9aR0YwWVNrcEtTQjdJSFJvYVhNdWRISnBaMmRsY2tOb1lXNW5aU2g3WVdSa1pXUTZaR0YwWVN4eVpXMXZkbVZrT205c1pFUmhkR0Y5S1RzZ2ZWeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzh2SUhOcGJtZHNaVnh5WEc0Z0lDQWdJQ0FnSUhWd1pHRjBaVk5sYkdWamRHbHZiam9nWm5WdVkzUnBiMjRnS0dSaGRHRXBJSHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQmpiMjUwWVdsdVpYSTlkR2hwY3k1elpXeGxZM1JwYjI0dVptbHVaQ2hjSWk1elpXeGxZM1F5TFdOb2IzTmxibHdpS1N3Z1ptOXliV0YwZEdWa0xDQmpjM05EYkdGemN6dGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVnNaV04wYVc5dUxtUmhkR0VvWENKelpXeGxZM1F5TFdSaGRHRmNJaXdnWkdGMFlTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JqYjI1MFlXbHVaWEl1Wlcxd2RIa29LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dSaGRHRWdJVDA5SUc1MWJHd3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdadmNtMWhkSFJsWkQxMGFHbHpMbTl3ZEhNdVptOXliV0YwVTJWc1pXTjBhVzl1S0dSaGRHRXNJR052Ym5SaGFXNWxjaXdnZEdocGN5NXZjSFJ6TG1WelkyRndaVTFoY210MWNDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1p2Y20xaGRIUmxaQ0FoUFQwZ2RXNWtaV1pwYm1Wa0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjI1MFlXbHVaWEl1WVhCd1pXNWtLR1p2Y20xaGRIUmxaQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdZM056UTJ4aGMzTTlkR2hwY3k1dmNIUnpMbVp2Y20xaGRGTmxiR1ZqZEdsdmJrTnpjME5zWVhOektHUmhkR0VzSUdOdmJuUmhhVzVsY2lrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGpjM05EYkdGemN5QWhQVDBnZFc1a1pXWnBibVZrS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMjUwWVdsdVpYSXVZV1JrUTJ4aGMzTW9ZM056UTJ4aGMzTXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxiR1ZqZEdsdmJpNXlaVzF2ZG1WRGJHRnpjeWhjSW5ObGJHVmpkREl0WkdWbVlYVnNkRndpS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtOXdkSE11WVd4c2IzZERiR1ZoY2lBbUppQjBhR2x6TG1kbGRGQnNZV05sYUc5c1pHVnlLQ2tnSVQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiMjUwWVdsdVpYSXVZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV0ZzYkc5M1kyeGxZWEpjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ6YVc1bmJHVmNjbHh1SUNBZ0lDQWdJQ0IyWVd3NklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhaaGJDeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJ5YVdkblpYSkRhR0Z1WjJVZ1BTQm1ZV3h6WlN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUmhkR0VnUFNCdWRXeHNMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppQTlJSFJvYVhNc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZiR1JFWVhSaElEMGdkR2hwY3k1a1lYUmhLQ2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZWEpuZFcxbGJuUnpMbXhsYm1kMGFDQTlQVDBnTUNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExuWmhiQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllXd2dQU0JoY21kMWJXVnVkSE5iTUYwN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0ErSURFcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJ5YVdkblpYSkRhR0Z1WjJVZ1BTQmhjbWQxYldWdWRITmJNVjA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG5ObGJHVmpkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6Wld4bFkzUmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdWRtRnNLSFpoYkNsY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F1Wm1sdVpDaGNJanB6Wld4bFkzUmxaRndpS1M1bFlXTm9NaWhtZFc1amRHbHZiaUFvYVN3Z1pXeHRLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdSaGRHRWdQU0J6Wld4bUxtOXdkR2x2YmxSdlJHRjBZU2hsYkcwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblZ3WkdGMFpWTmxiR1ZqZEdsdmJpaGtZWFJoS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWMFVHeGhZMlZvYjJ4a1pYSW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBjbWxuWjJWeVEyaGhibWRsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NTBjbWxuWjJWeVEyaGhibWRsS0h0aFpHUmxaRG9nWkdGMFlTd2djbVZ0YjNabFpEcHZiR1JFWVhSaGZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCMllXd2dhWE1nWVc0Z2FXUXVJQ0YyWVd3Z2FYTWdkSEoxWlNCbWIzSWdXM1Z1WkdWbWFXNWxaQ3h1ZFd4c0xDY25MREJkSUMwZ01DQnBjeUJzWldkaGJGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMllXd2dKaVlnZG1Gc0lDRTlQU0F3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiR1ZoY2loMGNtbG5aMlZ5UTJoaGJtZGxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV2Y0hSekxtbHVhWFJUWld4bFkzUnBiMjRnUFQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2loY0ltTmhibTV2ZENCallXeHNJSFpoYkNncElHbG1JR2x1YVhSVFpXeGxZM1JwYjI0b0tTQnBjeUJ1YjNRZ1pHVm1hVzVsWkZ3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG5aaGJDaDJZV3dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSekxtbHVhWFJUWld4bFkzUnBiMjRvZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblFzSUdaMWJtTjBhVzl1S0dSaGRHRXBlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxiR1l1YjNCMGN5NWxiR1Z0Wlc1MExuWmhiQ2doWkdGMFlTQS9JRndpWENJZ09pQnpaV3htTG1sa0tHUmhkR0VwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6Wld4bUxuVndaR0YwWlZObGJHVmpkR2x2Ymloa1lYUmhLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpaV3htTG5ObGRGQnNZV05sYUc5c1pHVnlLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSeWFXZG5aWEpEYUdGdVoyVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNTBjbWxuWjJWeVEyaGhibWRsS0h0aFpHUmxaRG9nWkdGMFlTd2djbVZ0YjNabFpEcHZiR1JFWVhSaGZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QnphVzVuYkdWY2NseHVJQ0FnSUNBZ0lDQmpiR1ZoY2xObFlYSmphRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sWVhKamFDNTJZV3dvWENKY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Wm05amRYTnpaWEl1ZG1Gc0tGd2lYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJSE5wYm1kc1pWeHlYRzRnSUNBZ0lDQWdJR1JoZEdFNklHWjFibU4wYVc5dUtIWmhiSFZsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQmtZWFJoTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RISnBaMmRsY2tOb1lXNW5aU0E5SUdaaGJITmxPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnZ1BUMDlJREFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUmhkR0VnUFNCMGFHbHpMbk5sYkdWamRHbHZiaTVrWVhSaEtGd2ljMlZzWldOME1pMWtZWFJoWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dSaGRHRWdQVDBnZFc1a1pXWnBibVZrS1NCa1lYUmhJRDBnYm5Wc2JEdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmtZWFJoTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnZ1BpQXhLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkSEpwWjJkbGNrTm9ZVzVuWlNBOUlHRnlaM1Z0Wlc1MGMxc3hYVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doZG1Gc2RXVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Oc1pXRnlLSFJ5YVdkblpYSkRhR0Z1WjJVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1lYUmhJRDBnZEdocGN5NWtZWFJoS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1ZG1Gc0tDRjJZV3gxWlNBL0lGd2lYQ0lnT2lCMGFHbHpMbWxrS0haaGJIVmxLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MWNHUmhkR1ZUWld4bFkzUnBiMjRvZG1Gc2RXVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwY21sbloyVnlRMmhoYm1kbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWRISnBaMmRsY2tOb1lXNW5aU2g3WVdSa1pXUTZJSFpoYkhWbExDQnlaVzF2ZG1Wa09tUmhkR0Y5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlLVHRjY2x4dVhISmNiaUFnSUNCTmRXeDBhVk5sYkdWamRESWdQU0JqYkdGNmVpaEJZbk4wY21GamRGTmxiR1ZqZERJc0lIdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiWFZzZEdsY2NseHVJQ0FnSUNBZ0lDQmpjbVZoZEdWRGIyNTBZV2x1WlhJNklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdOdmJuUmhhVzVsY2lBOUlDUW9aRzlqZFcxbGJuUXVZM0psWVhSbFJXeGxiV1Z1ZENoY0ltUnBkbHdpS1NrdVlYUjBjaWg3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0ltTnNZWE56WENJNklGd2ljMlZzWldOME1pMWpiMjUwWVdsdVpYSWdjMlZzWldOME1pMWpiMjUwWVdsdVpYSXRiWFZzZEdsY0lseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtTNW9kRzFzS0Z0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lQSFZzSUdOc1lYTnpQU2R6Wld4bFkzUXlMV05vYjJsalpYTW5QbHdpTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSWdJRHhzYVNCamJHRnpjejBuYzJWc1pXTjBNaTF6WldGeVkyZ3RabWxsYkdRblBsd2lMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENJZ0lDQWdQR2x1Y0hWMElIUjVjR1U5SjNSbGVIUW5JR0YxZEc5amIyMXdiR1YwWlQwbmIyWm1KeUJoZFhSdlkyOXljbVZqZEQwbmIyWm1KeUJoZFhSdlkyRndhWFJoYkdsNlpUMG5iMlptSnlCemNHVnNiR05vWldOclBTZG1ZV3h6WlNjZ1kyeGhjM005SjNObGJHVmpkREl0YVc1d2RYUW5QbHdpTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSWdJRHd2YkdrK1hDSXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWp3dmRXdytYQ0lzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lqeGthWFlnWTJ4aGMzTTlKM05sYkdWamRESXRaSEp2Y0NCelpXeGxZM1F5TFdSeWIzQXRiWFZzZEdrZ2MyVnNaV04wTWkxa2FYTndiR0Y1TFc1dmJtVW5QbHdpTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSWdJQ0E4ZFd3Z1kyeGhjM005SjNObGJHVmpkREl0Y21WemRXeDBjeWMrWENJc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJaUFnSUR3dmRXdytYQ0lzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lqd3ZaR2wyUGx3aVhTNXFiMmx1S0Z3aVhDSXBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHTnZiblJoYVc1bGNqdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCdGRXeDBhVnh5WEc0Z0lDQWdJQ0FnSUhCeVpYQmhjbVZQY0hSek9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCdmNIUnpJRDBnZEdocGN5NXdZWEpsYm5RdWNISmxjR0Z5WlU5d2RITXVZWEJ3Ykhrb2RHaHBjeXdnWVhKbmRXMWxiblJ6S1N4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxiR1k5ZEdocGN6dGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUZSUFJFOGdkbUZzYVdSaGRHVWdjR3hoWTJWb2IyeGtaWElnYVhNZ1lTQnpkSEpwYm1jZ2FXWWdjM0JsWTJsbWFXVmtYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2IzQjBjeTVsYkdWdFpXNTBMbWRsZENnd0tTNTBZV2RPWVcxbExuUnZURzkzWlhKRFlYTmxLQ2tnUFQwOUlGd2ljMlZzWldOMFhDSXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHbHVjM1JoYkd3Z2MzUm9aU0J6Wld4bFkzUnBiMjRnYVc1cGRHbGhiR2w2WlhKY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOXdkSE11YVc1cGRGTmxiR1ZqZEdsdmJpQTlJR1oxYm1OMGFXOXVJQ2hsYkdWdFpXNTBMQ0JqWVd4c1ltRmpheWtnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdaR0YwWVNBOUlGdGRPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYkdWdFpXNTBMbVpwYm1Rb1hDSTZjMlZzWldOMFpXUmNJaWt1WldGamFESW9ablZ1WTNScGIyNGdLR2tzSUdWc2JTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrWVhSaExuQjFjMmdvYzJWc1ppNXZjSFJwYjI1VWIwUmhkR0VvWld4dEtTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyRnNiR0poWTJzb1pHRjBZU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tGd2laR0YwWVZ3aUlHbHVJRzl3ZEhNcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUdsdWMzUmhiR3dnWkdWbVlYVnNkQ0JwYm1sMFUyVnNaV04wYVc5dUlIZG9aVzRnWVhCd2JHbGxaQ0IwYnlCb2FXUmtaVzRnYVc1d2RYUWdZVzVrSUdSaGRHRWdhWE1nYkc5allXeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzl3ZEhNdWFXNXBkRk5sYkdWamRHbHZiaUE5SUc5d2RITXVhVzVwZEZObGJHVmpkR2x2YmlCOGZDQm1kVzVqZEdsdmJpQW9aV3hsYldWdWRDd2dZMkZzYkdKaFkyc3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnYVdSeklEMGdjM0JzYVhSV1lXd29aV3hsYldWdWRDNTJZV3dvS1N3Z2IzQjBjeTV6WlhCaGNtRjBiM0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2YzJWaGNtTm9JR2x1SUdSaGRHRWdZbmtnWVhKeVlYa2diMllnYVdSekxDQnpkRzl5YVc1bklHMWhkR05vYVc1bklHbDBaVzF6SUdsdUlHRWdiR2x6ZEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCdFlYUmphR1Z6SUQwZ1cxMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzQjBjeTV4ZFdWeWVTaDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzFoZEdOb1pYSTZJR1oxYm1OMGFXOXVLSFJsY20wc0lIUmxlSFFzSUdWc0tYdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnBjMTl0WVhSamFDQTlJQ1F1WjNKbGNDaHBaSE1zSUdaMWJtTjBhVzl1S0dsa0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHVnhkV0ZzS0dsa0xDQnZjSFJ6TG1sa0tHVnNLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlLUzVzWlc1bmRHZzdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hWE5mYldGMFkyZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhSamFHVnpMbkIxYzJnb1pXd3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR2x6WDIxaGRHTm9PMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCallXeHNZbUZqYXpvZ0lTUXVhWE5HZFc1amRHbHZiaWhqWVd4c1ltRmpheWtnUHlBa0xtNXZiM0FnT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklISmxiM0prWlhJZ2JXRjBZMmhsY3lCaVlYTmxaQ0J2YmlCMGFHVWdiM0prWlhJZ2RHaGxlU0JoY0hCbFlYSWdhVzRnZEdobElHbGtjeUJoY25KaGVTQmlaV05oZFhObElISnBaMmgwSUc1dmQxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2RHaGxlU0JoY21VZ2FXNGdkR2hsSUc5eVpHVnlJR2x1SUhkb2FXTm9JSFJvWlhrZ1lYQndaV0Z5SUdsdUlHUmhkR0VnWVhKeVlYbGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnZjbVJsY21Wa0lEMGdXMTA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR2xrY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCcFpDQTlJR2xrYzF0cFhUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1iM0lnS0haaGNpQnFJRDBnTURzZ2FpQThJRzFoZEdOb1pYTXViR1Z1WjNSb095QnFLeXNwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUcxaGRHTm9JRDBnYldGMFkyaGxjMXRxWFR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dWeGRXRnNLR2xrTENCdmNIUnpMbWxrS0cxaGRHTm9LU2twSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5eVpHVnlaV1F1Y0hWemFDaHRZWFJqYUNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYUmphR1Z6TG5Od2JHbGpaU2hxTENBeEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSnlaV0ZyTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGc2JHSmhZMnNvYjNKa1pYSmxaQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnZjSFJ6TzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lITmxiR1ZqZEVOb2IybGpaVG9nWm5WdVkzUnBiMjRnS0dOb2IybGpaU2tnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSE5sYkdWamRHVmtJRDBnZEdocGN5NWpiMjUwWVdsdVpYSXVabWx1WkNoY0lpNXpaV3hsWTNReUxYTmxZWEpqYUMxamFHOXBZMlV0Wm05amRYTmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoelpXeGxZM1JsWkM1c1pXNW5kR2dnSmlZZ1kyaHZhV05sSUNZbUlHTm9iMmxqWlZzd1hTQTlQU0J6Wld4bFkzUmxaRnN3WFNrZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoelpXeGxZM1JsWkM1c1pXNW5kR2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11Wld4bGJXVnVkQzUwY21sbloyVnlLRndpWTJodmFXTmxMV1JsYzJWc1pXTjBaV1JjSWl3Z2MyVnNaV04wWldRcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1pXTjBaV1F1Y21WdGIzWmxRMnhoYzNNb1hDSnpaV3hsWTNReUxYTmxZWEpqYUMxamFHOXBZMlV0Wm05amRYTmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZMmh2YVdObElDWW1JR05vYjJsalpTNXNaVzVuZEdncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU5zYjNObEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyaHZhV05sTG1Ga1pFTnNZWE56S0Z3aWMyVnNaV04wTWkxelpXRnlZMmd0WTJodmFXTmxMV1p2WTNWelhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExuUnlhV2RuWlhJb1hDSmphRzlwWTJVdGMyVnNaV04wWldSY0lpd2dZMmh2YVdObEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklHMTFiSFJwWEhKY2JpQWdJQ0FnSUNBZ1pHVnpkSEp2ZVRvZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDUW9YQ0pzWVdKbGJGdG1iM0k5SjF3aUlDc2dkR2hwY3k1elpXRnlZMmd1WVhSMGNpZ25hV1FuS1NBcklGd2lKMTFjSWlsY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDNWhkSFJ5S0NkbWIzSW5MQ0IwYUdsekxtOXdkSE11Wld4bGJXVnVkQzVoZEhSeUtGd2lhV1JjSWlrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbkJoY21WdWRDNWtaWE4wY205NUxtRndjR3g1S0hSb2FYTXNJR0Z5WjNWdFpXNTBjeWs3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiWFZzZEdsY2NseHVJQ0FnSUNBZ0lDQnBibWwwUTI5dWRHRnBibVZ5T2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2MyVnNaV04wYjNJZ1BTQmNJaTV6Wld4bFkzUXlMV05vYjJsalpYTmNJaXdnYzJWc1pXTjBhVzl1TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WldGeVkyaERiMjUwWVdsdVpYSWdQU0IwYUdsekxtTnZiblJoYVc1bGNpNW1hVzVrS0Z3aUxuTmxiR1ZqZERJdGMyVmhjbU5vTFdacFpXeGtYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxiR1ZqZEdsdmJpQTlJSE5sYkdWamRHbHZiaUE5SUhSb2FYTXVZMjl1ZEdGcGJtVnlMbVpwYm1Rb2MyVnNaV04wYjNJcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUY5MGFHbHpJRDBnZEdocGN6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6Wld4bFkzUnBiMjR1YjI0b1hDSmpiR2xqYTF3aUxDQmNJaTV6Wld4bFkzUXlMWE5sWVhKamFDMWphRzlwWTJWY0lpd2dablZ1WTNScGIyNGdLR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZhMmxzYkVWMlpXNTBLR1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1gzUm9hWE11YzJWaGNtTm9XekJkTG1adlkzVnpLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCZmRHaHBjeTV6Wld4bFkzUkRhRzlwWTJVb0pDaDBhR2x6S1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnY21WM2NtbDBaU0JzWVdKbGJITWdabkp2YlNCdmNtbG5hVzVoYkNCbGJHVnRaVzUwSUhSdklHWnZZM1Z6YzJWeVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZoY21Ob0xtRjBkSElvWENKcFpGd2lMQ0JjSW5NeWFXUmZZWFYwYjJkbGJsd2lLMjVsZUhSVmFXUW9LU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ1FvWENKc1lXSmxiRnRtYjNJOUoxd2lJQ3NnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1WVhSMGNpaGNJbWxrWENJcElDc2dYQ0luWFZ3aUtWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMbUYwZEhJb0oyWnZjaWNzSUhSb2FYTXVjMlZoY21Ob0xtRjBkSElvSjJsa0p5a3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV0Z5WTJndWIyNG9YQ0pwYm5CMWRDQndZWE4wWlZ3aUxDQjBhR2x6TG1KcGJtUW9ablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWFJvYVhNdWFYTkpiblJsY21aaFkyVkZibUZpYkdWa0tDa3BJSEpsZEhWeWJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTV2Y0dWdVpXUW9LU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQmxiaWdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxZWEpqYUM1aGRIUnlLRndpZEdGaWFXNWtaWGhjSWl3Z2RHaHBjeTVsYkdWdFpXNTBWR0ZpU1c1a1pYZ3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXJaWGxrYjNkdWN5QTlJREE3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG05dUtGd2lhMlY1Wkc5M2Jsd2lMQ0IwYUdsekxtSnBibVFvWm5WdVkzUnBiMjRnS0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTVwYzBsdWRHVnlabUZqWlVWdVlXSnNaV1FvS1NrZ2NtVjBkWEp1TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ3NyZEdocGN5NXJaWGxrYjNkdWN6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCelpXeGxZM1JsWkNBOUlITmxiR1ZqZEdsdmJpNW1hVzVrS0Z3aUxuTmxiR1ZqZERJdGMyVmhjbU5vTFdOb2IybGpaUzFtYjJOMWMxd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQndjbVYySUQwZ2MyVnNaV04wWldRdWNISmxkaWhjSWk1elpXeGxZM1F5TFhObFlYSmphQzFqYUc5cFkyVTZibTkwS0M1elpXeGxZM1F5TFd4dlkydGxaQ2xjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnYm1WNGRDQTlJSE5sYkdWamRHVmtMbTVsZUhRb1hDSXVjMlZzWldOME1pMXpaV0Z5WTJndFkyaHZhV05sT201dmRDZ3VjMlZzWldOME1pMXNiMk5yWldRcFhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlIQnZjeUE5SUdkbGRFTjFjbk52Y2tsdVptOG9kR2hwY3k1elpXRnlZMmdwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoelpXeGxZM1JsWkM1c1pXNW5kR2dnSmlaY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FvWlM1M2FHbGphQ0E5UFNCTFJWa3VURVZHVkNCOGZDQmxMbmRvYVdOb0lEMDlJRXRGV1M1U1NVZElWQ0I4ZkNCbExuZG9hV05vSUQwOUlFdEZXUzVDUVVOTFUxQkJRMFVnZkh3Z1pTNTNhR2xqYUNBOVBTQkxSVmt1UkVWTVJWUkZJSHg4SUdVdWQyaHBZMmdnUFQwZ1MwVlpMa1ZPVkVWU0tTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ6Wld4bFkzUmxaRU5vYjJsalpTQTlJSE5sYkdWamRHVmtPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsTG5kb2FXTm9JRDA5SUV0RldTNU1SVVpVSUNZbUlIQnlaWFl1YkdWdVozUm9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGJHVmpkR1ZrUTJodmFXTmxJRDBnY0hKbGRqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWld4elpTQnBaaUFvWlM1M2FHbGphQ0E5UFNCTFJWa3VVa2xIU0ZRcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWldOMFpXUkRhRzlwWTJVZ1BTQnVaWGgwTG14bGJtZDBhQ0EvSUc1bGVIUWdPaUJ1ZFd4c08xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYkhObElHbG1JQ2hsTG5kb2FXTm9JRDA5UFNCTFJWa3VRa0ZEUzFOUVFVTkZLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkVzV6Wld4bFkzUW9jMlZzWldOMFpXUXVabWx5YzNRb0tTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG5kcFpIUm9LREV3S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaV04wWldSRGFHOXBZMlVnUFNCd2NtVjJMbXhsYm1kMGFDQS9JSEJ5WlhZZ09pQnVaWGgwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvWlM1M2FHbGphQ0E5UFNCTFJWa3VSRVZNUlZSRktTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWRXNXpaV3hsWTNRb2MyVnNaV04wWldRdVptbHljM1FvS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWaGNtTm9MbmRwWkhSb0tERXdLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1pXTjBaV1JEYUc5cFkyVWdQU0J1WlhoMExteGxibWQwYUNBL0lHNWxlSFFnT2lCdWRXeHNPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9aUzUzYUdsamFDQTlQU0JMUlZrdVJVNVVSVklwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaV04wWldSRGFHOXBZMlVnUFNCdWRXeHNPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXeGxZM1JEYUc5cFkyVW9jMlZzWldOMFpXUkRhRzlwWTJVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd0cGJHeEZkbVZ1ZENobEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWE5sYkdWamRHVmtRMmh2YVdObElIeDhJQ0Z6Wld4bFkzUmxaRU5vYjJsalpTNXNaVzVuZEdncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmNHVnVLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9LQ2hsTG5kb2FXTm9JRDA5UFNCTFJWa3VRa0ZEUzFOUVFVTkZJQ1ltSUhSb2FYTXVhMlY1Wkc5M2JuTWdQVDBnTVNsY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I4ZkNCbExuZG9hV05vSUQwOUlFdEZXUzVNUlVaVUtTQW1KaUFvY0c5ekxtOW1abk5sZENBOVBTQXdJQ1ltSUNGd2IzTXViR1Z1WjNSb0tTa2dlMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxiR1ZqZEVOb2IybGpaU2h6Wld4bFkzUnBiMjR1Wm1sdVpDaGNJaTV6Wld4bFkzUXlMWE5sWVhKamFDMWphRzlwWTJVNmJtOTBLQzV6Wld4bFkzUXlMV3h2WTJ0bFpDbGNJaWt1YkdGemRDZ3BLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnJhV3hzUlhabGJuUW9aU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sYkdWamRFTm9iMmxqWlNodWRXeHNLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV2Y0dWdVpXUW9LU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE4zYVhSamFDQW9aUzUzYUdsamFDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmhjMlVnUzBWWkxsVlFPbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmhjMlVnUzBWWkxrUlBWMDQ2WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViVzkyWlVocFoyaHNhV2RvZENnb1pTNTNhR2xqYUNBOVBUMGdTMFZaTGxWUUtTQS9JQzB4SURvZ01TazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3RwYkd4RmRtVnVkQ2hsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ1MwVlpMa1ZPVkVWU09seHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGJHVmpkRWhwWjJoc2FXZG9kR1ZrS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHdHBiR3hGZG1WdWRDaGxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmhjMlVnUzBWWkxsUkJRanBjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FXWWdjMlZzWldOMFQyNUNiSFZ5SUQwOUlIUnlkV1VzSUhObGJHVmpkQ0IwYUdVZ1kzVnljbVZ1ZEd4NUlHaHBaMmhzYVdkb2RHVmtJRzl3ZEdsdmJseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXZjSFJ6TG5ObGJHVmpkRTl1UW14MWNpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6Wld4bFkzUklhV2RvYkdsbmFIUmxaQ2g3Ym05R2IyTjFjenAwY25WbGZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiRzl6WlNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGelpTQkxSVmt1UlZORE9seHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1OaGJtTmxiQ2hsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2EybHNiRVYyWlc1MEtHVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsTG5kb2FXTm9JRDA5UFNCTFJWa3VWRUZDSUh4OElFdEZXUzVwYzBOdmJuUnliMndvWlNrZ2ZId2dTMFZaTG1selJuVnVZM1JwYjI1TFpYa29aU2xjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOGZDQmxMbmRvYVdOb0lEMDlQU0JMUlZrdVFrRkRTMU5RUVVORklIeDhJR1V1ZDJocFkyZ2dQVDA5SUV0RldTNUZVME1wSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dVdWQyaHBZMmdnUFQwOUlFdEZXUzVGVGxSRlVpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtOXdkSE11YjNCbGJrOXVSVzUwWlhJZ1BUMDlJR1poYkhObEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHVXVZV3gwUzJWNUlIeDhJR1V1WTNSeWJFdGxlU0I4ZkNCbExuTm9hV1owUzJWNUlIeDhJR1V1YldWMFlVdGxlU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQmxiaWdwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobExuZG9hV05vSUQwOVBTQkxSVmt1VUVGSFJWOVZVQ0I4ZkNCbExuZG9hV05vSUQwOVBTQkxSVmt1VUVGSFJWOUVUMWRPS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2NISmxkbVZ1ZENCMGFHVWdjR0ZuWlNCbWNtOXRJSE5qY205c2JHbHVaMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHdHBiR3hGZG1WdWRDaGxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pTNTNhR2xqYUNBOVBUMGdTMFZaTGtWT1ZFVlNLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnY0hKbGRtVnVkQ0JtYjNKdElHWnliMjBnWW1WcGJtY2djM1ZpYldsMGRHVmtYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2EybHNiRVYyWlc1MEtHVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTa3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV0Z5WTJndWIyNG9YQ0pyWlhsMWNGd2lMQ0IwYUdsekxtSnBibVFvWm5WdVkzUnBiMjRnS0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWEyVjVaRzkzYm5NZ1BTQXdPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXlaWE5wZW1WVFpXRnlZMmdvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNsY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWaGNtTm9MbTl1S0Z3aVlteDFjbHdpTENCMGFHbHpMbUpwYm1Rb1puVnVZM1JwYjI0b1pTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiMjUwWVdsdVpYSXVjbVZ0YjNabFEyeGhjM01vWENKelpXeGxZM1F5TFdOdmJuUmhhVzVsY2kxaFkzUnBkbVZjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphQzV5WlcxdmRtVkRiR0Z6Y3loY0luTmxiR1ZqZERJdFptOWpkWE5sWkZ3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVnNaV04wUTJodmFXTmxLRzUxYkd3cE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMGFHbHpMbTl3Wlc1bFpDZ3BLU0IwYUdsekxtTnNaV0Z5VTJWaGNtTm9LQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbExuTjBiM0JKYlcxbFpHbGhkR1ZRY205d1lXZGhkR2x2YmlncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmNIUnpMbVZzWlcxbGJuUXVkSEpwWjJkbGNpZ2tMa1YyWlc1MEtGd2ljMlZzWldOME1pMWliSFZ5WENJcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTa3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiMjUwWVdsdVpYSXViMjRvWENKamJHbGphMXdpTENCelpXeGxZM1J2Y2l3Z2RHaHBjeTVpYVc1a0tHWjFibU4wYVc5dUlDaGxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWFJvYVhNdWFYTkpiblJsY21aaFkyVkZibUZpYkdWa0tDa3BJSEpsZEhWeWJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNna0tHVXVkR0Z5WjJWMEtTNWpiRzl6WlhOMEtGd2lMbk5sYkdWamRESXRjMlZoY21Ob0xXTm9iMmxqWlZ3aUtTNXNaVzVuZEdnZ1BpQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnWTJ4cFkydGxaQ0JwYm5OcFpHVWdZU0J6Wld4bFkzUXlJSE5sWVhKamFDQmphRzlwWTJVc0lHUnZJRzV2ZENCdmNHVnVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXeGxZM1JEYUc5cFkyVW9iblZzYkNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Oc1pXRnlVR3hoWTJWb2IyeGtaWElvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doZEdocGN5NWpiMjUwWVdsdVpYSXVhR0Z6UTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV052Ym5SaGFXNWxjaTFoWTNScGRtVmNJaWtwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11Wld4bGJXVnVkQzUwY21sbloyVnlLQ1F1UlhabGJuUW9YQ0p6Wld4bFkzUXlMV1p2WTNWelhDSXBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCbGJpZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW1iMk4xYzFObFlYSmphQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pTNXdjbVYyWlc1MFJHVm1ZWFZzZENncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnZiblJoYVc1bGNpNXZiaWhjSW1adlkzVnpYQ0lzSUhObGJHVmpkRzl5TENCMGFHbHpMbUpwYm1Rb1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TG1selNXNTBaWEptWVdObFJXNWhZbXhsWkNncEtTQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVhSb2FYTXVZMjl1ZEdGcGJtVnlMbWhoYzBOc1lYTnpLRndpYzJWc1pXTjBNaTFqYjI1MFlXbHVaWEl0WVdOMGFYWmxYQ0lwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1ZEhKcFoyZGxjaWdrTGtWMlpXNTBLRndpYzJWc1pXTjBNaTFtYjJOMWMxd2lLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1OdmJuUmhhVzVsY2k1aFpHUkRiR0Z6Y3loY0luTmxiR1ZqZERJdFkyOXVkR0ZwYm1WeUxXRmpkR2wyWlZ3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpISnZjR1J2ZDI0dVlXUmtRMnhoYzNNb1hDSnpaV3hsWTNReUxXUnliM0F0WVdOMGFYWmxYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYkdWaGNsQnNZV05sYUc5c1pHVnlLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YVc1cGRFTnZiblJoYVc1bGNsZHBaSFJvS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG1Ga1pFTnNZWE56S0Z3aWMyVnNaV04wTWkxdlptWnpZM0psWlc1Y0lpazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCelpYUWdkR2hsSUhCc1lXTmxhRzlzWkdWeUlHbG1JRzVsWTJWemMyRnllVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Oc1pXRnlVMlZoY21Ob0tDazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2JYVnNkR2xjY2x4dUlDQWdJQ0FnSUNCbGJtRmliR1ZKYm5SbGNtWmhZMlU2SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1d1lYSmxiblF1Wlc1aFlteGxTVzUwWlhKbVlXTmxMbUZ3Y0d4NUtIUm9hWE1zSUdGeVozVnRaVzUwY3lrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG5CeWIzQW9YQ0prYVhOaFlteGxaRndpTENBaGRHaHBjeTVwYzBsdWRHVnlabUZqWlVWdVlXSnNaV1FvS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ0ZFd4MGFWeHlYRzRnSUNBZ0lDQWdJR2x1YVhSVFpXeGxZM1JwYjI0NklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdSaGRHRTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtOXdkSE11Wld4bGJXVnVkQzUyWVd3b0tTQTlQVDBnWENKY0lpQW1KaUIwYUdsekxtOXdkSE11Wld4bGJXVnVkQzUwWlhoMEtDa2dQVDA5SUZ3aVhDSXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkWEJrWVhSbFUyVnNaV04wYVc5dUtGdGRLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMnh2YzJVb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUhObGRDQjBhR1VnY0d4aFkyVm9iMnhrWlhJZ2FXWWdibVZqWlhOellYSjVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNaV0Z5VTJWaGNtTm9LQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVjMlZzWldOMElIeDhJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMblpoYkNncElDRTlQU0JjSWx3aUtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2MyVnNaaUE5SUhSb2FYTTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11YVc1cGRGTmxiR1ZqZEdsdmJpNWpZV3hzS0c1MWJHd3NJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMQ0JtZFc1amRHbHZiaWhrWVhSaEtYdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aR0YwWVNBaFBUMGdkVzVrWldacGJtVmtJQ1ltSUdSaGRHRWdJVDA5SUc1MWJHd3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNTFjR1JoZEdWVFpXeGxZM1JwYjI0b1pHRjBZU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGJHWXVZMnh2YzJVb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnYzJWMElIUm9aU0J3YkdGalpXaHZiR1JsY2lCcFppQnVaV05sYzNOaGNubGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWmk1amJHVmhjbE5sWVhKamFDZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiWFZzZEdsY2NseHVJQ0FnSUNBZ0lDQmpiR1ZoY2xObFlYSmphRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjR3hoWTJWb2IyeGtaWElnUFNCMGFHbHpMbWRsZEZCc1lXTmxhRzlzWkdWeUtDa3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhoWGFXUjBhQ0E5SUhSb2FYTXVaMlYwVFdGNFUyVmhjbU5vVjJsa2RHZ29LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHdiR0ZqWldodmJHUmxjaUFoUFQwZ2RXNWtaV1pwYm1Wa0lDQW1KaUIwYUdsekxtZGxkRlpoYkNncExteGxibWQwYUNBOVBUMGdNQ0FtSmlCMGFHbHpMbk5sWVhKamFDNW9ZWE5EYkdGemN5aGNJbk5sYkdWamRESXRabTlqZFhObFpGd2lLU0E5UFQwZ1ptRnNjMlVwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWaGNtTm9MblpoYkNod2JHRmpaV2h2YkdSbGNpa3VZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV1JsWm1GMWJIUmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnpkSEpsZEdOb0lIUm9aU0J6WldGeVkyZ2dZbTk0SUhSdklHWjFiR3dnZDJsa2RHZ2diMllnZEdobElHTnZiblJoYVc1bGNpQnpieUJoY3lCdGRXTm9JRzltSUhSb1pTQndiR0ZqWldodmJHUmxjaUJwY3lCMmFYTnBZbXhsSUdGeklIQnZjM05wWW14bFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUIzWlNCamIzVnNaQ0JqWVd4c0lIUm9hWE11Y21WemFYcGxVMlZoY21Ob0tDa3NJR0oxZENCM1pTQmtieUJ1YjNRZ1ltVmpZWFZ6WlNCMGFHRjBJSEpsY1hWcGNtVnpJR0VnYzJsNlpYSWdZVzVrSUhkbElHUnZJRzV2ZENCM1lXNTBJSFJ2SUdOeVpXRjBaU0J2Ym1VZ2MyOGdaV0Z5YkhrZ1ltVmpZWFZ6WlNCdlppQmhJR1pwY21WbWIzZ2dZblZuTENCelpXVWdJemswTkZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WldGeVkyZ3VkMmxrZEdnb2JXRjRWMmxrZEdnZ1BpQXdJRDhnYldGNFYybGtkR2dnT2lCMGFHbHpMbU52Ym5SaGFXNWxjaTVqYzNNb1hDSjNhV1IwYUZ3aUtTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphQzUyWVd3b1hDSmNJaWt1ZDJsa2RHZ29NVEFwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiWFZzZEdsY2NseHVJQ0FnSUNBZ0lDQmpiR1ZoY2xCc1lXTmxhRzlzWkdWeU9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbk5sWVhKamFDNW9ZWE5EYkdGemN5aGNJbk5sYkdWamRESXRaR1ZtWVhWc2RGd2lLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WldGeVkyZ3VkbUZzS0Z3aVhDSXBMbkpsYlc5MlpVTnNZWE56S0Z3aWMyVnNaV04wTWkxa1pXWmhkV3gwWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYlhWc2RHbGNjbHh1SUNBZ0lDQWdJQ0J2Y0dWdWFXNW5PaUJtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMnhsWVhKUWJHRmpaV2h2YkdSbGNpZ3BPeUF2THlCemFHOTFiR1FnWW1VZ1pHOXVaU0JpWldadmNtVWdjM1Z3WlhJZ2MyOGdjR3hoWTJWb2IyeGtaWElnYVhNZ2JtOTBJSFZ6WldRZ2RHOGdjMlZoY21Ob1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjbVZ6YVhwbFUyVmhjbU5vS0NrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5CaGNtVnVkQzV2Y0dWdWFXNW5MbUZ3Y0d4NUtIUm9hWE1zSUdGeVozVnRaVzUwY3lrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1adlkzVnpVMlZoY21Ob0tDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuVndaR0YwWlZKbGMzVnNkSE1vZEhKMVpTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWaGNtTm9MbVp2WTNWektDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExuUnlhV2RuWlhJb0pDNUZkbVZ1ZENoY0luTmxiR1ZqZERJdGIzQmxibHdpS1NrN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYlhWc2RHbGNjbHh1SUNBZ0lDQWdJQ0JqYkc5elpUb2dablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lYUm9hWE11YjNCbGJtVmtLQ2twSUhKbGRIVnlianRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1d1lYSmxiblF1WTJ4dmMyVXVZWEJ3Ykhrb2RHaHBjeXdnWVhKbmRXMWxiblJ6S1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ0ZFd4MGFWeHlYRzRnSUNBZ0lDQWdJR1p2WTNWek9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyeHZjMlVvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV0Z5WTJndVptOWpkWE1vS1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ0ZFd4MGFWeHlYRzRnSUNBZ0lDQWdJR2x6Um05amRYTmxaRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXpaV0Z5WTJndWFHRnpRMnhoYzNNb1hDSnpaV3hsWTNReUxXWnZZM1Z6WldSY0lpazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2JYVnNkR2xjY2x4dUlDQWdJQ0FnSUNCMWNHUmhkR1ZUWld4bFkzUnBiMjQ2SUdaMWJtTjBhVzl1SUNoa1lYUmhLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCcFpITWdQU0JiWFN3Z1ptbHNkR1Z5WldRZ1BTQmJYU3dnYzJWc1ppQTlJSFJvYVhNN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJtYVd4MFpYSWdiM1YwSUdSMWNHeHBZMkYwWlhOY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSkNoa1lYUmhLUzVsWVdOb0tHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBibVJsZUU5bUtITmxiR1l1YVdRb2RHaHBjeWtzSUdsa2N5a2dQQ0F3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdSekxuQjFjMmdvYzJWc1ppNXBaQ2gwYUdsektTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptbHNkR1Z5WldRdWNIVnphQ2gwYUdsektUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR1JoZEdFZ1BTQm1hV3gwWlhKbFpEdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVnNaV04wYVc5dUxtWnBibVFvWENJdWMyVnNaV04wTWkxelpXRnlZMmd0WTJodmFXTmxYQ0lwTG5KbGJXOTJaU2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FrS0dSaGRHRXBMbVZoWTJnb1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNWhaR1JUWld4bFkzUmxaRU5vYjJsalpTaDBhR2x6S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhObGJHWXVjRzl6ZEhCeWIyTmxjM05TWlhOMWJIUnpLQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiWFZzZEdsY2NseHVJQ0FnSUNBZ0lDQjBiMnRsYm1sNlpUb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCcGJuQjFkQ0E5SUhSb2FYTXVjMlZoY21Ob0xuWmhiQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwYm5CMWRDQTlJSFJvYVhNdWIzQjBjeTUwYjJ0bGJtbDZaWEl1WTJGc2JDaDBhR2x6TENCcGJuQjFkQ3dnZEdocGN5NWtZWFJoS0Nrc0lIUm9hWE11WW1sdVpDaDBhR2x6TG05dVUyVnNaV04wS1N3Z2RHaHBjeTV2Y0hSektUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR2x1Y0hWMElDRTlJRzUxYkd3Z0ppWWdhVzV3ZFhRZ0lUMGdkVzVrWldacGJtVmtLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sWVhKamFDNTJZV3dvYVc1d2RYUXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHbHVjSFYwTG14bGJtZDBhQ0ErSURBcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3Wlc0b0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ0ZFd4MGFWeHlYRzRnSUNBZ0lDQWdJRzl1VTJWc1pXTjBPaUJtZFc1amRHbHZiaUFvWkdGMFlTd2diM0IwYVc5dWN5a2dlMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TG5SeWFXZG5aWEpUWld4bFkzUW9aR0YwWVNrcElIc2djbVYwZFhKdU95QjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtRmtaRk5sYkdWamRHVmtRMmh2YVdObEtHUmhkR0VwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWRISnBaMmRsY2loN0lIUjVjR1U2SUZ3aWMyVnNaV04wWldSY0lpd2dkbUZzT2lCMGFHbHpMbWxrS0dSaGRHRXBMQ0JqYUc5cFkyVTZJR1JoZEdFZ2ZTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV6Wld4bFkzUWdmSHdnSVhSb2FYTXViM0IwY3k1amJHOXpaVTl1VTJWc1pXTjBLU0IwYUdsekxuQnZjM1J3Y205alpYTnpVbVZ6ZFd4MGN5aGtZWFJoTENCbVlXeHpaU3dnZEdocGN5NXZjSFJ6TG1Oc2IzTmxUMjVUWld4bFkzUTlQVDEwY25WbEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEhNdVkyeHZjMlZQYmxObGJHVmpkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYkc5elpTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV0Z5WTJndWQybGtkR2dvTVRBcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdVkyOTFiblJUWld4bFkzUmhZbXhsVW1WemRXeDBjeWdwUGpBcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sWVhKamFDNTNhV1IwYUNneE1DazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV5WlhOcGVtVlRaV0Z5WTJnb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1blpYUk5ZWGhwYlhWdFUyVnNaV04wYVc5dVUybDZaU2dwSUQ0Z01DQW1KaUIwYUdsekxuWmhiQ2dwTG14bGJtZDBhQ0ErUFNCMGFHbHpMbWRsZEUxaGVHbHRkVzFUWld4bFkzUnBiMjVUYVhwbEtDa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FXWWdkMlVnY21WaFkyaGxaQ0J0WVhnZ2MyVnNaV04wYVc5dUlITnBlbVVnY21Wd1lXbHVkQ0IwYUdVZ2NtVnpkV3gwY3lCemJ5QmphRzlwWTJWelhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJR0Z5WlNCeVpYQnNZV05sWkNCM2FYUm9JSFJvWlNCdFlYZ2djMlZzWldOMGFXOXVJSEpsWVdOb1pXUWdiV1Z6YzJGblpWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5Wd1pHRjBaVkpsYzNWc2RITW9kSEoxWlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNHOXphWFJwYjI1RWNtOXdaRzkzYmlncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnBaaUJ1YjNSb2FXNW5JR3hsWm5RZ2RHOGdjMlZzWldOMElHTnNiM05sWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1amJHOXpaU2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG5kcFpIUm9LREV3S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnYzJsdVkyVWdhWFJ6SUc1dmRDQndiM056YVdKc1pTQjBieUJ6Wld4bFkzUWdZVzRnWld4bGJXVnVkQ0IwYUdGMElHaGhjeUJoYkhKbFlXUjVJR0psWlc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1lXUmtaV1FnZDJVZ1pHOGdibTkwSUc1bFpXUWdkRzhnWTJobFkyc2dhV1lnZEdocGN5QnBjeUJoSUc1bGR5QmxiR1Z0Wlc1MElHSmxabTl5WlNCbWFYSnBibWNnWTJoaGJtZGxYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11ZEhKcFoyZGxja05vWVc1blpTaDdJR0ZrWkdWa09pQmtZWFJoSUgwcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGdmNIUnBiMjV6SUh4OElDRnZjSFJwYjI1ekxtNXZSbTlqZFhNcFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1adlkzVnpVMlZoY21Ob0tDazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2JYVnNkR2xjY2x4dUlDQWdJQ0FnSUNCallXNWpaV3c2SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYkc5elpTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1adlkzVnpVMlZoY21Ob0tDazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnWVdSa1UyVnNaV04wWldSRGFHOXBZMlU2SUdaMWJtTjBhVzl1SUNoa1lYUmhLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCbGJtRmliR1ZEYUc5cFkyVWdQU0FoWkdGMFlTNXNiMk5yWldRc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxibUZpYkdWa1NYUmxiU0E5SUNRb1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENJOGJHa2dZMnhoYzNNOUozTmxiR1ZqZERJdGMyVmhjbU5vTFdOb2IybGpaU2MrWENJZ0sxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aUlDQWdJRHhrYVhZK1BDOWthWFkrWENJZ0sxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aUlDQWdJRHhoSUdoeVpXWTlKeU1uSUc5dVkyeHBZMnM5SjNKbGRIVnliaUJtWVd4elpUc25JR05zWVhOelBTZHpaV3hsWTNReUxYTmxZWEpqYUMxamFHOXBZMlV0WTJ4dmMyVW5JSFJoWW1sdVpHVjRQU2N0TVNjK1BDOWhQbHdpSUN0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWp3dmJHaytYQ0lwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHbHpZV0pzWldSSmRHVnRJRDBnSkNoY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWp4c2FTQmpiR0Z6Y3owbmMyVnNaV04wTWkxelpXRnlZMmd0WTJodmFXTmxJSE5sYkdWamRESXRiRzlqYTJWa0p6NWNJaUFyWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0k4WkdsMlBqd3ZaR2wyUGx3aUlDdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lqd3ZiR2srWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdZMmh2YVdObElEMGdaVzVoWW14bFEyaHZhV05sSUQ4Z1pXNWhZbXhsWkVsMFpXMGdPaUJrYVhOaFlteGxaRWwwWlcwc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUhSb2FYTXVhV1FvWkdGMFlTa3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVd3Z1BTQjBhR2x6TG1kbGRGWmhiQ2dwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptOXliV0YwZEdWa0xGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZM056UTJ4aGMzTTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JtYjNKdFlYUjBaV1E5ZEdocGN5NXZjSFJ6TG1admNtMWhkRk5sYkdWamRHbHZiaWhrWVhSaExDQmphRzlwWTJVdVptbHVaQ2hjSW1ScGRsd2lLU3dnZEdocGN5NXZjSFJ6TG1WelkyRndaVTFoY210MWNDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2htYjNKdFlYUjBaV1FnSVQwZ2RXNWtaV1pwYm1Wa0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYUc5cFkyVXVabWx1WkNoY0ltUnBkbHdpS1M1eVpYQnNZV05sVjJsMGFDaGNJanhrYVhZK1hDSXJabTl5YldGMGRHVmtLMXdpUEM5a2FYWStYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR056YzBOc1lYTnpQWFJvYVhNdWIzQjBjeTVtYjNKdFlYUlRaV3hsWTNScGIyNURjM05EYkdGemN5aGtZWFJoTENCamFHOXBZMlV1Wm1sdVpDaGNJbVJwZGx3aUtTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hqYzNORGJHRnpjeUFoUFNCMWJtUmxabWx1WldRcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05vYjJsalpTNWhaR1JEYkdGemN5aGpjM05EYkdGemN5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtS0dWdVlXSnNaVU5vYjJsalpTbDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdZMmh2YVdObExtWnBibVFvWENJdWMyVnNaV04wTWkxelpXRnlZMmd0WTJodmFXTmxMV05zYjNObFhDSXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM1dmJpaGNJbTF2ZFhObFpHOTNibHdpTENCcmFXeHNSWFpsYm5RcFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzV2YmloY0ltTnNhV05ySUdSaWJHTnNhV05yWENJc0lIUm9hWE11WW1sdVpDaG1kVzVqZEdsdmJpQW9aU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVhSb2FYTXVhWE5KYm5SbGNtWmhZMlZGYm1GaWJHVmtLQ2twSUhKbGRIVnlianRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1FvWlM1MFlYSm5aWFFwTG1Oc2IzTmxjM1FvWENJdWMyVnNaV04wTWkxelpXRnlZMmd0WTJodmFXTmxYQ0lwTG1aaFpHVlBkWFFvSjJaaGMzUW5MQ0IwYUdsekxtSnBibVFvWm5WdVkzUnBiMjRvS1h0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkVzV6Wld4bFkzUW9KQ2hsTG5SaGNtZGxkQ2twTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV3hsWTNScGIyNHVabWx1WkNoY0lpNXpaV3hsWTNReUxYTmxZWEpqYUMxamFHOXBZMlV0Wm05amRYTmNJaWt1Y21WdGIzWmxRMnhoYzNNb1hDSnpaV3hsWTNReUxYTmxZWEpqYUMxamFHOXBZMlV0Wm05amRYTmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNiM05sS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVp2WTNWelUyVmhjbU5vS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwS1M1a1pYRjFaWFZsS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3RwYkd4RmRtVnVkQ2hsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUtTa3ViMjRvWENKbWIyTjFjMXdpTENCMGFHbHpMbUpwYm1Rb1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWFJvYVhNdWFYTkpiblJsY21aaFkyVkZibUZpYkdWa0tDa3BJSEpsZEhWeWJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiMjUwWVdsdVpYSXVZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV052Ym5SaGFXNWxjaTFoWTNScGRtVmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WkhKdmNHUnZkMjR1WVdSa1EyeGhjM01vWENKelpXeGxZM1F5TFdSeWIzQXRZV04wYVhabFhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSDBwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1kyaHZhV05sTG1SaGRHRW9YQ0p6Wld4bFkzUXlMV1JoZEdGY0lpd2daR0YwWVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdOb2IybGpaUzVwYm5ObGNuUkNaV1p2Y21Vb2RHaHBjeTV6WldGeVkyaERiMjUwWVdsdVpYSXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc0xuQjFjMmdvYVdRcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sZEZaaGJDaDJZV3dwTzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJRzExYkhScFhISmNiaUFnSUNBZ0lDQWdkVzV6Wld4bFkzUTZJR1oxYm1OMGFXOXVJQ2h6Wld4bFkzUmxaQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2RtRnNJRDBnZEdocGN5NW5aWFJXWVd3b0tTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JoZEdFc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBibVJsZUR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lITmxiR1ZqZEdWa0lEMGdjMlZzWldOMFpXUXVZMnh2YzJWemRDaGNJaTV6Wld4bFkzUXlMWE5sWVhKamFDMWphRzlwWTJWY0lpazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2MyVnNaV04wWldRdWJHVnVaM1JvSUQwOVBTQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFISnZkeUJjSWtsdWRtRnNhV1FnWVhKbmRXMWxiblE2SUZ3aUlDc2djMlZzWldOMFpXUWdLeUJjSWk0Z1RYVnpkQ0JpWlNBdWMyVnNaV04wTWkxelpXRnlZMmd0WTJodmFXTmxYQ0k3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdSaGRHRWdQU0J6Wld4bFkzUmxaQzVrWVhSaEtGd2ljMlZzWldOME1pMWtZWFJoWENJcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGa1lYUmhLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QndjbVYyWlc1MElHRWdjbUZqWlNCamIyNWthWFJwYjI0Z2QyaGxiaUIwYUdVZ0ozZ25JR2x6SUdOc2FXTnJaV1FnY21WaGJHeDVJR1poYzNRZ2NtVndaV0YwWldSc2VTQjBhR1VnWlhabGJuUWdZMkZ1SUdKbElIRjFaWFZsWkZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdZVzVrSUdsdWRtOXJaV1FnYjI0Z1lXNGdaV3hsYldWdWRDQmhiSEpsWVdSNUlISmxiVzkyWldSY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXNWtaWGdnUFNCcGJtUmxlRTltS0hSb2FYTXVhV1FvWkdGMFlTa3NJSFpoYkNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVc1a1pYZ2dQajBnTUNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZzTG5Od2JHbGpaU2hwYm1SbGVDd2dNU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sZEZaaGJDaDJZV3dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWMyVnNaV04wS1NCMGFHbHpMbkJ2YzNSd2NtOWpaWE56VW1WemRXeDBjeWdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSE5sYkdWamRHVmtMbkpsYlc5MlpTZ3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1ZEhKcFoyZGxjaWg3SUhSNWNHVTZJRndpY21WdGIzWmxaRndpTENCMllXdzZJSFJvYVhNdWFXUW9aR0YwWVNrc0lHTm9iMmxqWlRvZ1pHRjBZU0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NTBjbWxuWjJWeVEyaGhibWRsS0hzZ2NtVnRiM1psWkRvZ1pHRjBZU0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ0ZFd4MGFWeHlYRzRnSUNBZ0lDQWdJSEJ2YzNSd2NtOWpaWE56VW1WemRXeDBjem9nWm5WdVkzUnBiMjRnS0dSaGRHRXNJR2x1YVhScFlXd3NJRzV2U0dsbmFHeHBaMmgwVlhCa1lYUmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCMllXd2dQU0IwYUdsekxtZGxkRlpoYkNncExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMmh2YVdObGN5QTlJSFJvYVhNdWNtVnpkV3gwY3k1bWFXNWtLRndpTG5ObGJHVmpkREl0Y21WemRXeDBYQ0lwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXRjRzkxYm1RZ1BTQjBhR2x6TG5KbGMzVnNkSE11Wm1sdVpDaGNJaTV6Wld4bFkzUXlMWEpsYzNWc2RDMTNhWFJvTFdOb2FXeGtjbVZ1WENJcExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWmlBOUlIUm9hWE03WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCamFHOXBZMlZ6TG1WaFkyZ3lLR1oxYm1OMGFXOXVJQ2hwTENCamFHOXBZMlVwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJwWkNBOUlITmxiR1l1YVdRb1kyaHZhV05sTG1SaGRHRW9YQ0p6Wld4bFkzUXlMV1JoZEdGY0lpa3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHbHVaR1Y0VDJZb2FXUXNJSFpoYkNrZ1BqMGdNQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05vYjJsalpTNWhaR1JEYkdGemN5aGNJbk5sYkdWamRESXRjMlZzWldOMFpXUmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnYldGeWF5QmhiR3dnWTJocGJHUnlaVzRnYjJZZ2RHaGxJSE5sYkdWamRHVmtJSEJoY21WdWRDQmhjeUJ6Wld4bFkzUmxaRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTm9iMmxqWlM1bWFXNWtLRndpTG5ObGJHVmpkREl0Y21WemRXeDBMWE5sYkdWamRHRmliR1ZjSWlrdVlXUmtRMnhoYzNNb1hDSnpaV3hsWTNReUxYTmxiR1ZqZEdWa1hDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnZiWEJ2ZFc1a0xtVmhZMmd5S0daMWJtTjBhVzl1S0drc0lHTm9iMmxqWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnYUdsa1pTQmhiaUJ2Y0hSbmNtOTFjQ0JwWmlCcGRDQmtiMlZ6Ym5RZ2FHRjJaU0JoYm5rZ2MyVnNaV04wWVdKc1pTQmphR2xzWkhKbGJseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGamFHOXBZMlV1YVhNb0p5NXpaV3hsWTNReUxYSmxjM1ZzZEMxelpXeGxZM1JoWW14bEp5bGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBbUppQmphRzlwWTJVdVptbHVaQ2hjSWk1elpXeGxZM1F5TFhKbGMzVnNkQzF6Wld4bFkzUmhZbXhsT201dmRDZ3VjMlZzWldOME1pMXpaV3hsWTNSbFpDbGNJaWt1YkdWdVozUm9JRDA5UFNBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyaHZhV05sTG1Ga1pFTnNZWE56S0Z3aWMyVnNaV04wTWkxelpXeGxZM1JsWkZ3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1b2FXZG9iR2xuYUhRb0tTQTlQU0F0TVNBbUppQnViMGhwWjJoc2FXZG9kRlZ3WkdGMFpTQWhQVDBnWm1Gc2MyVXBlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNW9hV2RvYkdsbmFIUW9NQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dlNXWWdZV3hzSUhKbGMzVnNkSE1nWVhKbElHTm9iM05sYmlCeVpXNWtaWElnWm05eWJXRjBUbTlOUVhSamFHVnpYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1LQ0YwYUdsekxtOXdkSE11WTNKbFlYUmxVMlZoY21Ob1EyaHZhV05sSUNZbUlDRmphRzlwWTJWekxtWnBiSFJsY2lnbkxuTmxiR1ZqZERJdGNtVnpkV3gwT201dmRDZ3VjMlZzWldOME1pMXpaV3hsWTNSbFpDa25LUzVzWlc1bmRHZ2dQaUF3S1h0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1LQ0ZrWVhSaElIeDhJR1JoZEdFZ0ppWWdJV1JoZEdFdWJXOXlaU0FtSmlCMGFHbHpMbkpsYzNWc2RITXVabWx1WkNoY0lpNXpaV3hsWTNReUxXNXZMWEpsYzNWc2RITmNJaWt1YkdWdVozUm9JRDA5UFNBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR05vWldOclJtOXliV0YwZEdWeUtITmxiR1l1YjNCMGN5NW1iM0p0WVhST2IwMWhkR05vWlhNc0lGd2labTl5YldGMFRtOU5ZWFJqYUdWelhDSXBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjbVZ6ZFd4MGN5NWhjSEJsYm1Rb1hDSThiR2tnWTJ4aGMzTTlKM05sYkdWamRESXRibTh0Y21WemRXeDBjeWMrWENJZ0t5QnpaV3htTG05d2RITXVabTl5YldGMFRtOU5ZWFJqYUdWektITmxiR1l1YzJWaGNtTm9MblpoYkNncEtTQXJJRndpUEM5c2FUNWNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzh2SUcxMWJIUnBYSEpjYmlBZ0lDQWdJQ0FnWjJWMFRXRjRVMlZoY21Ob1YybGtkR2c2SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXpaV3hsWTNScGIyNHVkMmxrZEdnb0tTQXRJR2RsZEZOcFpHVkNiM0prWlhKUVlXUmthVzVuS0hSb2FYTXVjMlZoY21Ob0tUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCdGRXeDBhVnh5WEc0Z0lDQWdJQ0FnSUhKbGMybDZaVk5sWVhKamFEb2dablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2JXbHVhVzExYlZkcFpIUm9MQ0JzWldaMExDQnRZWGhYYVdSMGFDd2dZMjl1ZEdGcGJtVnlUR1ZtZEN3Z2MyVmhjbU5vVjJsa2RHZ3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YVdSbFFtOXlaR1Z5VUdGa1pHbHVaeUE5SUdkbGRGTnBaR1ZDYjNKa1pYSlFZV1JrYVc1bktIUm9hWE11YzJWaGNtTm9LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUcxcGJtbHRkVzFYYVdSMGFDQTlJRzFsWVhOMWNtVlVaWGgwVjJsa2RHZ29kR2hwY3k1elpXRnlZMmdwSUNzZ01UQTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JzWldaMElEMGdkR2hwY3k1elpXRnlZMmd1YjJabWMyVjBLQ2t1YkdWbWREdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJRzFoZUZkcFpIUm9JRDBnZEdocGN5NXpaV3hsWTNScGIyNHVkMmxrZEdnb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1kyOXVkR0ZwYm1WeVRHVm1kQ0E5SUhSb2FYTXVjMlZzWldOMGFXOXVMbTltWm5ObGRDZ3BMbXhsWm5RN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnpaV0Z5WTJoWGFXUjBhQ0E5SUcxaGVGZHBaSFJvSUMwZ0tHeGxablFnTFNCamIyNTBZV2x1WlhKTVpXWjBLU0F0SUhOcFpHVkNiM0prWlhKUVlXUmthVzVuTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSE5sWVhKamFGZHBaSFJvSUR3Z2JXbHVhVzExYlZkcFpIUm9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXRnlZMmhYYVdSMGFDQTlJRzFoZUZkcFpIUm9JQzBnYzJsa1pVSnZjbVJsY2xCaFpHUnBibWM3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHpaV0Z5WTJoWGFXUjBhQ0E4SURRd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6WldGeVkyaFhhV1IwYUNBOUlHMWhlRmRwWkhSb0lDMGdjMmxrWlVKdmNtUmxjbEJoWkdScGJtYzdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoelpXRnlZMmhYYVdSMGFDQThQU0F3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2MyVmhjbU5vVjJsa2RHZ2dQU0J0YVc1cGJYVnRWMmxrZEdnN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWaGNtTm9MbmRwWkhSb0tITmxZWEpqYUZkcFpIUm9LVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QnRkV3gwYVZ4eVhHNGdJQ0FnSUNBZ0lHZGxkRlpoYkRvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnZG1Gc08xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1elpXeGxZM1FwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhiQ0E5SUhSb2FYTXVjMlZzWldOMExuWmhiQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhaaGJDQTlQVDBnYm5Wc2JDQS9JRnRkSURvZ2RtRnNPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZzSUQwZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWRtRnNLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYzNCc2FYUldZV3dvZG1Gc0xDQjBhR2x6TG05d2RITXVjMlZ3WVhKaGRHOXlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklHMTFiSFJwWEhKY2JpQWdJQ0FnSUNBZ2MyVjBWbUZzT2lCbWRXNWpkR2x2YmlBb2RtRnNLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCMWJtbHhkV1U3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbk5sYkdWamRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV3hsWTNRdWRtRnNLSFpoYkNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMWJtbHhkV1VnUFNCYlhUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUdacGJIUmxjaUJ2ZFhRZ1pIVndiR2xqWVhSbGMxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKQ2gyWVd3cExtVmhZMmdvWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBibVJsZUU5bUtIUm9hWE1zSUhWdWFYRjFaU2tnUENBd0tTQjFibWx4ZFdVdWNIVnphQ2gwYUdsektUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWRtRnNLSFZ1YVhGMVpTNXNaVzVuZEdnZ1BUMDlJREFnUHlCY0lsd2lJRG9nZFc1cGNYVmxMbXB2YVc0b2RHaHBjeTV2Y0hSekxuTmxjR0Z5WVhSdmNpa3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2JYVnNkR2xjY2x4dUlDQWdJQ0FnSUNCaWRXbHNaRU5vWVc1blpVUmxkR0ZwYkhNNklHWjFibU4wYVc5dUlDaHZiR1FzSUdOMWNuSmxiblFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHTjFjbkpsYm5RZ1BTQmpkWEp5Wlc1MExuTnNhV05sS0RBcExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMnhrSUQwZ2IyeGtMbk5zYVdObEtEQXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2NtVnRiM1psSUdsdWRHVnljMlZqZEdsdmJpQm1jbTl0SUdWaFkyZ2dZWEp5WVhsY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCamRYSnlaVzUwTG14bGJtZDBhRHNnYVNzcktTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYjNJZ0tIWmhjaUJxSUQwZ01Ec2dhaUE4SUc5c1pDNXNaVzVuZEdnN0lHb3JLeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobGNYVmhiQ2gwYUdsekxtOXdkSE11YVdRb1kzVnljbVZ1ZEZ0cFhTa3NJSFJvYVhNdWIzQjBjeTVwWkNodmJHUmJhbDBwS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpkWEp5Wlc1MExuTndiR2xqWlNocExDQXhLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVMwdE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZiR1F1YzNCc2FXTmxLR29zSURFcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnFMUzA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZTJGa1pHVmtPaUJqZFhKeVpXNTBMQ0J5WlcxdmRtVmtPaUJ2YkdSOU8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QnRkV3gwYVZ4eVhHNGdJQ0FnSUNBZ0lIWmhiRG9nWm5WdVkzUnBiMjRnS0haaGJDd2dkSEpwWjJkbGNrTm9ZVzVuWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdiMnhrUkdGMFlTd2djMlZzWmoxMGFHbHpMQ0JqYUdGdVoyVkVaWFJoYVd4ek8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dGeVozVnRaVzUwY3k1c1pXNW5kR2dnUFQwOUlEQXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtZGxkRlpoYkNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnZiR1JFWVhSaFBYUm9hWE11WkdGMFlTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVc5c1pFUmhkR0V1YkdWdVozUm9LU0J2YkdSRVlYUmhQVnRkTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdkbUZzSUdseklHRnVJR2xrTGlBaGRtRnNJR2x6SUhSeWRXVWdabTl5SUZ0MWJtUmxabWx1WldRc2JuVnNiQ3duSnl3d1hTQXRJREFnYVhNZ2JHVm5ZV3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMllXd2dKaVlnZG1Gc0lDRTlQU0F3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG05d2RITXVaV3hsYldWdWRDNTJZV3dvWENKY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuVndaR0YwWlZObGJHVmpkR2x2YmloYlhTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNaV0Z5VTJWaGNtTm9LQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kSEpwWjJkbGNrTm9ZVzVuWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkSEpwWjJkbGNrTm9ZVzVuWlNoN1lXUmtaV1E2SUhSb2FYTXVaR0YwWVNncExDQnlaVzF2ZG1Wa09pQnZiR1JFWVhSaGZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklIWmhiQ0JwY3lCaElHeHBjM1FnYjJZZ2FXUnpYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWMFZtRnNLSFpoYkNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXpaV3hsWTNRcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQjBjeTVwYm1sMFUyVnNaV04wYVc5dUtIUm9hWE11YzJWc1pXTjBMQ0IwYUdsekxtSnBibVFvZEdocGN5NTFjR1JoZEdWVFpXeGxZM1JwYjI0cEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGNtbG5aMlZ5UTJoaGJtZGxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MGNtbG5aMlZ5UTJoaGJtZGxLSFJvYVhNdVluVnBiR1JEYUdGdVoyVkVaWFJoYVd4ektHOXNaRVJoZEdFc0lIUm9hWE11WkdGMFlTZ3BLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1dmNIUnpMbWx1YVhSVFpXeGxZM1JwYjI0Z1BUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGNJblpoYkNncElHTmhibTV2ZENCaVpTQmpZV3hzWldRZ2FXWWdhVzVwZEZObGJHVmpkR2x2YmlncElHbHpJRzV2ZENCa1pXWnBibVZrWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NXBibWwwVTJWc1pXTjBhVzl1S0hSb2FYTXViM0IwY3k1bGJHVnRaVzUwTENCbWRXNWpkR2x2Ymloa1lYUmhLWHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnYVdSelBTUXViV0Z3S0dSaGRHRXNJSE5sYkdZdWFXUXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxiR1l1YzJWMFZtRnNLR2xrY3lrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNTFjR1JoZEdWVFpXeGxZM1JwYjI0b1pHRjBZU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWmk1amJHVmhjbE5sWVhKamFDZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwY21sbloyVnlRMmhoYm1kbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sYkdZdWRISnBaMmRsY2tOb1lXNW5aU2h6Wld4bUxtSjFhV3hrUTJoaGJtZGxSR1YwWVdsc2N5aHZiR1JFWVhSaExDQjBhR2x6TG1SaGRHRW9LU2twTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMnhsWVhKVFpXRnlZMmdvS1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ0ZFd4MGFWeHlYRzRnSUNBZ0lDQWdJRzl1VTI5eWRGTjBZWEowT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWMyVnNaV04wS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb1hDSlRiM0owYVc1bklHOW1JR1ZzWlcxbGJuUnpJR2x6SUc1dmRDQnpkWEJ3YjNKMFpXUWdkMmhsYmlCaGRIUmhZMmhsWkNCMGJ5QThjMlZzWldOMFBpNGdRWFIwWVdOb0lIUnZJRHhwYm5CMWRDQjBlWEJsUFNkb2FXUmtaVzRuTHo0Z2FXNXpkR1ZoWkM1Y0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdOdmJHeGhjSE5sSUhObFlYSmphQ0JtYVdWc1pDQnBiblJ2SURBZ2QybGtkR2dnYzI4Z2FYUnpJR052Ym5SaGFXNWxjaUJqWVc0Z1ltVWdZMjlzYkdGd2MyVmtJR0Z6SUhkbGJHeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WldGeVkyZ3VkMmxrZEdnb01DazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJR2hwWkdVZ2RHaGxJR052Ym5SaGFXNWxjbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphRU52Ym5SaGFXNWxjaTVvYVdSbEtDazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2JYVnNkR2xjY2x4dUlDQWdJQ0FnSUNCdmJsTnZjblJGYm1RNlpuVnVZM1JwYjI0b0tTQjdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2RtRnNQVnRkTENCelpXeG1QWFJvYVhNN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJ6YUc5M0lITmxZWEpqYUNCaGJtUWdiVzkyWlNCcGRDQjBieUIwYUdVZ1pXNWtJRzltSUhSb1pTQnNhWE4wWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vUTI5dWRHRnBibVZ5TG5Ob2IzY29LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnYldGclpTQnpkWEpsSUhSb1pTQnpaV0Z5WTJnZ1kyOXVkR0ZwYm1WeUlHbHpJSFJvWlNCc1lYTjBJR2wwWlcwZ2FXNGdkR2hsSUd4cGMzUmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WldGeVkyaERiMjUwWVdsdVpYSXVZWEJ3Wlc1a1ZHOG9kR2hwY3k1elpXRnlZMmhEYjI1MFlXbHVaWEl1Y0dGeVpXNTBLQ2twTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCemFXNWpaU0IzWlNCamIyeHNZWEJ6WldRZ2RHaGxJSGRwWkhSb0lHbHVJR1J5WVdkVGRHRnlkR1ZrTENCM1pTQnlaWE5wZW1VZ2FYUWdhR1Z5WlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuSmxjMmw2WlZObFlYSmphQ2dwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdkWEJrWVhSbElITmxiR1ZqZEdsdmJseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sYkdWamRHbHZiaTVtYVc1a0tGd2lMbk5sYkdWamRESXRjMlZoY21Ob0xXTm9iMmxqWlZ3aUtTNWxZV05vS0daMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZzTG5CMWMyZ29jMlZzWmk1dmNIUnpMbWxrS0NRb2RHaHBjeWt1WkdGMFlTaGNJbk5sYkdWamRESXRaR0YwWVZ3aUtTa3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpYUldZV3dvZG1Gc0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTUwY21sbloyVnlRMmhoYm1kbEtDazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2JYVnNkR2xjY2x4dUlDQWdJQ0FnSUNCa1lYUmhPaUJtZFc1amRHbHZiaWgyWVd4MVpYTXNJSFJ5YVdkblpYSkRhR0Z1WjJVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSE5sYkdZOWRHaHBjeXdnYVdSekxDQnZiR1E3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQwOVBTQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjMlZzWldOMGFXOXVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDNW1hVzVrS0Z3aUxuTmxiR1ZqZERJdGMyVmhjbU5vTFdOb2IybGpaVndpS1Z4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F1YldGd0tHWjFibU4wYVc5dUtDa2dleUJ5WlhSMWNtNGdKQ2gwYUdsektTNWtZWFJoS0Z3aWMyVnNaV04wTWkxa1lYUmhYQ0lwT3lCOUtWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdVoyVjBLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2YkdRZ1BTQjBhR2x6TG1SaGRHRW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2hkbUZzZFdWektTQjdJSFpoYkhWbGN5QTlJRnRkT3lCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaSE1nUFNBa0xtMWhjQ2gyWVd4MVpYTXNJR1oxYm1OMGFXOXVLR1VwSUhzZ2NtVjBkWEp1SUhObGJHWXViM0IwY3k1cFpDaGxLVHNnZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGRGWmhiQ2hwWkhNcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MWNHUmhkR1ZUWld4bFkzUnBiMjRvZG1Gc2RXVnpLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMnhsWVhKVFpXRnlZMmdvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwY21sbloyVnlRMmhoYm1kbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTUwY21sbloyVnlRMmhoYm1kbEtIUm9hWE11WW5WcGJHUkRhR0Z1WjJWRVpYUmhhV3h6S0c5c1pDd2dkR2hwY3k1a1lYUmhLQ2twS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJSDBwTzF4eVhHNWNjbHh1SUNBZ0lDUXVabTR1YzJWc1pXTjBNaUE5SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ2RtRnlJR0Z5WjNNZ1BTQkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWMyeHBZMlV1WTJGc2JDaGhjbWQxYldWdWRITXNJREFwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J2Y0hSekxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCelpXeGxZM1F5TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J0WlhSb2IyUXNJSFpoYkhWbExDQnRkV3gwYVhCc1pTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1lXeHNiM2RsWkUxbGRHaHZaSE1nUFNCYlhDSjJZV3hjSWl3Z1hDSmtaWE4wY205NVhDSXNJRndpYjNCbGJtVmtYQ0lzSUZ3aWIzQmxibHdpTENCY0ltTnNiM05sWENJc0lGd2labTlqZFhOY0lpd2dYQ0pwYzBadlkzVnpaV1JjSWl3Z1hDSmpiMjUwWVdsdVpYSmNJaXdnWENKa2NtOXdaRzkzYmx3aUxDQmNJbTl1VTI5eWRGTjBZWEowWENJc0lGd2liMjVUYjNKMFJXNWtYQ0lzSUZ3aVpXNWhZbXhsWENJc0lGd2laR2x6WVdKc1pWd2lMQ0JjSW5KbFlXUnZibXg1WENJc0lGd2ljRzl6YVhScGIyNUVjbTl3Wkc5M2Jsd2lMQ0JjSW1SaGRHRmNJaXdnWENKelpXRnlZMmhjSWwwc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGJIVmxUV1YwYUc5a2N5QTlJRnRjSW05d1pXNWxaRndpTENCY0ltbHpSbTlqZFhObFpGd2lMQ0JjSW1OdmJuUmhhVzVsY2x3aUxDQmNJbVJ5YjNCa2IzZHVYQ0pkTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J3Y205d1pYSjBlVTFsZEdodlpITWdQU0JiWENKMllXeGNJaXdnWENKa1lYUmhYQ0pkTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J0WlhSb2IyUnpUV0Z3SUQwZ2V5QnpaV0Z5WTJnNklGd2laWGgwWlhKdVlXeFRaV0Z5WTJoY0lpQjlPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQjBhR2x6TG1WaFkyZ29ablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1lYSm5jeTVzWlc1bmRHZ2dQVDA5SURBZ2ZId2dkSGx3Wlc5bUtHRnlaM05iTUYwcElEMDlQU0JjSW05aWFtVmpkRndpS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZjSFJ6SUQwZ1lYSm5jeTVzWlc1bmRHZ2dQVDA5SURBZ1B5QjdmU0E2SUNRdVpYaDBaVzVrS0h0OUxDQmhjbWR6V3pCZEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzl3ZEhNdVpXeGxiV1Z1ZENBOUlDUW9kR2hwY3lrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHOXdkSE11Wld4bGJXVnVkQzVuWlhRb01Da3VkR0ZuVG1GdFpTNTBiMHh2ZDJWeVEyRnpaU2dwSUQwOVBTQmNJbk5sYkdWamRGd2lLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiWFZzZEdsd2JHVWdQU0J2Y0hSekxtVnNaVzFsYm5RdWNISnZjQ2hjSW0xMWJIUnBjR3hsWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdGRXeDBhWEJzWlNBOUlHOXdkSE11YlhWc2RHbHdiR1VnZkh3Z1ptRnNjMlU3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0Z3aWRHRm5jMXdpSUdsdUlHOXdkSE1wSUh0dmNIUnpMbTExYkhScGNHeGxJRDBnYlhWc2RHbHdiR1VnUFNCMGNuVmxPMzFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6Wld4bFkzUXlJRDBnYlhWc2RHbHdiR1VnUHlCdVpYY2dUWFZzZEdsVFpXeGxZM1F5S0NrZ09pQnVaWGNnVTJsdVoyeGxVMlZzWldOME1pZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1pXTjBNaTVwYm1sMEtHOXdkSE1wTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVnZaaWhoY21keld6QmRLU0E5UFQwZ1hDSnpkSEpwYm1kY0lpa2dlMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwYm1SbGVFOW1LR0Z5WjNOYk1GMHNJR0ZzYkc5M1pXUk5aWFJvYjJSektTQThJREFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUhKdmR5QmNJbFZ1YTI1dmQyNGdiV1YwYUc5a09pQmNJaUFySUdGeVozTmJNRjA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc2RXVWdQU0IxYm1SbFptbHVaV1E3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXeGxZM1F5SUQwZ0pDaDBhR2x6S1M1a1lYUmhLRndpYzJWc1pXTjBNbHdpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h6Wld4bFkzUXlJRDA5UFNCMWJtUmxabWx1WldRcElISmxkSFZ5Ymp0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WlhSb2IyUTlZWEpuYzFzd1hUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9iV1YwYUc5a0lEMDlQU0JjSW1OdmJuUmhhVzVsY2x3aUtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnNkV1VnUFNCelpXeGxZM1F5TG1OdmJuUmhhVzVsY2p0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9iV1YwYUc5a0lEMDlQU0JjSW1SeWIzQmtiM2R1WENJcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllXeDFaU0E5SUhObGJHVmpkREl1WkhKdmNHUnZkMjQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodFpYUm9iMlJ6VFdGd1cyMWxkR2h2WkYwcElHMWxkR2h2WkNBOUlHMWxkR2h2WkhOTllYQmJiV1YwYUc5a1hUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZzZFdVZ1BTQnpaV3hsWTNReVcyMWxkR2h2WkYwdVlYQndiSGtvYzJWc1pXTjBNaXdnWVhKbmN5NXpiR2xqWlNneEtTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hVzVrWlhoUFppaGhjbWR6V3pCZExDQjJZV3gxWlUxbGRHaHZaSE1wSUQ0OUlEQmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOGZDQW9hVzVrWlhoUFppaGhjbWR6V3pCZExDQndjbTl3WlhKMGVVMWxkR2h2WkhNcElDWW1JR0Z5WjNNdWJHVnVaM1JvSUQwOUlERXBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sT3lBdkx5QmhZbTl5ZENCMGFHVWdhWFJsY21GMGFXOXVMQ0J5WldGa2VTQjBieUJ5WlhSMWNtNGdabWx5YzNRZ2JXRjBZMmhsWkNCMllXeDFaVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdoeWIzY2dYQ0pKYm5aaGJHbGtJR0Z5WjNWdFpXNTBjeUIwYnlCelpXeGxZM1F5SUhCc2RXZHBiam9nWENJZ0t5QmhjbWR6TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJQ2gyWVd4MVpTQTlQVDBnZFc1a1pXWnBibVZrS1NBL0lIUm9hWE1nT2lCMllXeDFaVHRjY2x4dUlDQWdJSDA3WEhKY2JseHlYRzRnSUNBZ0x5OGdjR3gxWjJsdUlHUmxabUYxYkhSekxDQmhZMk5sYzNOcFlteGxJSFJ2SUhWelpYSnpYSEpjYmlBZ0lDQWtMbVp1TG5ObGJHVmpkREl1WkdWbVlYVnNkSE1nUFNCN1hISmNiaUFnSUNBZ0lDQWdkMmxrZEdnNklGd2lZMjl3ZVZ3aUxGeHlYRzRnSUNBZ0lDQWdJR3h2WVdSTmIzSmxVR0ZrWkdsdVp6b2dNQ3hjY2x4dUlDQWdJQ0FnSUNCamJHOXpaVTl1VTJWc1pXTjBPaUIwY25WbExGeHlYRzRnSUNBZ0lDQWdJRzl3Wlc1UGJrVnVkR1Z5T2lCMGNuVmxMRnh5WEc0Z0lDQWdJQ0FnSUdOdmJuUmhhVzVsY2tOemN6b2dlMzBzWEhKY2JpQWdJQ0FnSUNBZ1pISnZjR1J2ZDI1RGMzTTZJSHQ5TEZ4eVhHNGdJQ0FnSUNBZ0lHTnZiblJoYVc1bGNrTnpjME5zWVhOek9pQmNJbHdpTEZ4eVhHNGdJQ0FnSUNBZ0lHUnliM0JrYjNkdVEzTnpRMnhoYzNNNklGd2lYQ0lzWEhKY2JpQWdJQ0FnSUNBZ1ptOXliV0YwVW1WemRXeDBPaUJtZFc1amRHbHZiaWh5WlhOMWJIUXNJR052Ym5SaGFXNWxjaXdnY1hWbGNua3NJR1Z6WTJGd1pVMWhjbXQxY0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdiV0Z5YTNWd1BWdGRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnRZWEpyVFdGMFkyZ29jbVZ6ZFd4MExuUmxlSFFzSUhGMVpYSjVMblJsY20wc0lHMWhjbXQxY0N3Z1pYTmpZWEJsVFdGeWEzVndLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHMWhjbXQxY0M1cWIybHVLRndpWENJcE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JpQWdJQ0FnSUNBZ1ptOXliV0YwVTJWc1pXTjBhVzl1T2lCbWRXNWpkR2x2YmlBb1pHRjBZU3dnWTI5dWRHRnBibVZ5TENCbGMyTmhjR1ZOWVhKcmRYQXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHUmhkR0VnUHlCbGMyTmhjR1ZOWVhKcmRYQW9aR0YwWVM1MFpYaDBLU0E2SUhWdVpHVm1hVzVsWkR0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc0Z0lDQWdJQ0FnSUhOdmNuUlNaWE4xYkhSek9pQm1kVzVqZEdsdmJpQW9jbVZ6ZFd4MGN5d2dZMjl1ZEdGcGJtVnlMQ0J4ZFdWeWVTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwY3p0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc0Z0lDQWdJQ0FnSUdadmNtMWhkRkpsYzNWc2RFTnpjME5zWVhOek9pQm1kVzVqZEdsdmJpaGtZWFJoS1NCN2NtVjBkWEp1SUhWdVpHVm1hVzVsWkR0OUxGeHlYRzRnSUNBZ0lDQWdJR1p2Y20xaGRGTmxiR1ZqZEdsdmJrTnpjME5zWVhOek9pQm1kVzVqZEdsdmJpaGtZWFJoTENCamIyNTBZV2x1WlhJcElIdHlaWFIxY200Z2RXNWtaV1pwYm1Wa08zMHNYSEpjYmlBZ0lDQWdJQ0FnWm05eWJXRjBUbTlOWVhSamFHVnpPaUJtZFc1amRHbHZiaUFvS1NCN0lISmxkSFZ5YmlCY0lrNXZJRzFoZEdOb1pYTWdabTkxYm1SY0lqc2dmU3hjY2x4dUlDQWdJQ0FnSUNCbWIzSnRZWFJKYm5CMWRGUnZiMU5vYjNKME9pQm1kVzVqZEdsdmJpQW9hVzV3ZFhRc0lHMXBiaWtnZXlCMllYSWdiaUE5SUcxcGJpQXRJR2x1Y0hWMExteGxibWQwYURzZ2NtVjBkWEp1SUZ3aVVHeGxZWE5sSUdWdWRHVnlJRndpSUNzZ2JpQXJJRndpSUcxdmNtVWdZMmhoY21GamRHVnlYQ0lnS3lBb2JpQTlQU0F4UHlCY0lsd2lJRG9nWENKelhDSXBPeUI5TEZ4eVhHNGdJQ0FnSUNBZ0lHWnZjbTFoZEVsdWNIVjBWRzl2VEc5dVp6b2dablZ1WTNScGIyNGdLR2x1Y0hWMExDQnRZWGdwSUhzZ2RtRnlJRzRnUFNCcGJuQjFkQzVzWlc1bmRHZ2dMU0J0WVhnN0lISmxkSFZ5YmlCY0lsQnNaV0Z6WlNCa1pXeGxkR1VnWENJZ0t5QnVJQ3NnWENJZ1kyaGhjbUZqZEdWeVhDSWdLeUFvYmlBOVBTQXhQeUJjSWx3aUlEb2dYQ0p6WENJcE95QjlMRnh5WEc0Z0lDQWdJQ0FnSUdadmNtMWhkRk5sYkdWamRHbHZibFJ2YjBKcFp6b2dablZ1WTNScGIyNGdLR3hwYldsMEtTQjdJSEpsZEhWeWJpQmNJbGx2ZFNCallXNGdiMjVzZVNCelpXeGxZM1FnWENJZ0t5QnNhVzFwZENBcklGd2lJR2wwWlcxY0lpQXJJQ2hzYVcxcGRDQTlQU0F4SUQ4Z1hDSmNJaUE2SUZ3aWMxd2lLVHNnZlN4Y2NseHVJQ0FnSUNBZ0lDQm1iM0p0WVhSTWIyRmtUVzl5WlRvZ1puVnVZM1JwYjI0Z0tIQmhaMlZPZFcxaVpYSXBJSHNnY21WMGRYSnVJRndpVEc5aFpHbHVaeUJ0YjNKbElISmxjM1ZzZEhNdUxpNWNJanNnZlN4Y2NseHVJQ0FnSUNBZ0lDQm1iM0p0WVhSVFpXRnlZMmhwYm1jNklHWjFibU4wYVc5dUlDZ3BJSHNnY21WMGRYSnVJRndpVTJWaGNtTm9hVzVuTGk0dVhDSTdJSDBzWEhKY2JpQWdJQ0FnSUNBZ2JXbHVhVzExYlZKbGMzVnNkSE5HYjNKVFpXRnlZMmc2SURBc1hISmNiaUFnSUNBZ0lDQWdiV2x1YVcxMWJVbHVjSFYwVEdWdVozUm9PaUF3TEZ4eVhHNGdJQ0FnSUNBZ0lHMWhlR2x0ZFcxSmJuQjFkRXhsYm1kMGFEb2diblZzYkN4Y2NseHVJQ0FnSUNBZ0lDQnRZWGhwYlhWdFUyVnNaV04wYVc5dVUybDZaVG9nTUN4Y2NseHVJQ0FnSUNBZ0lDQnBaRG9nWm5WdVkzUnBiMjRnS0dVcElIc2djbVYwZFhKdUlHVXVhV1E3SUgwc1hISmNiaUFnSUNBZ0lDQWdiV0YwWTJobGNqb2dablZ1WTNScGIyNG9kR1Z5YlN3Z2RHVjRkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjM1J5YVhCRWFXRmpjbWwwYVdOektDY25LM1JsZUhRcExuUnZWWEJ3WlhKRFlYTmxLQ2t1YVc1a1pYaFBaaWh6ZEhKcGNFUnBZV055YVhScFkzTW9KeWNyZEdWeWJTa3VkRzlWY0hCbGNrTmhjMlVvS1NrZ1BqMGdNRHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzRnSUNBZ0lDQWdJSE5sY0dGeVlYUnZjam9nWENJc1hDSXNYSEpjYmlBZ0lDQWdJQ0FnZEc5clpXNVRaWEJoY21GMGIzSnpPaUJiWFN4Y2NseHVJQ0FnSUNBZ0lDQjBiMnRsYm1sNlpYSTZJR1JsWm1GMWJIUlViMnRsYm1sNlpYSXNYSEpjYmlBZ0lDQWdJQ0FnWlhOallYQmxUV0Z5YTNWd09pQmtaV1poZFd4MFJYTmpZWEJsVFdGeWEzVndMRnh5WEc0Z0lDQWdJQ0FnSUdKc2RYSlBia05vWVc1blpUb2dabUZzYzJVc1hISmNiaUFnSUNBZ0lDQWdjMlZzWldOMFQyNUNiSFZ5T2lCbVlXeHpaU3hjY2x4dUlDQWdJQ0FnSUNCaFpHRndkRU52Ym5SaGFXNWxja056YzBOc1lYTnpPaUJtZFc1amRHbHZiaWhqS1NCN0lISmxkSFZ5YmlCak95QjlMRnh5WEc0Z0lDQWdJQ0FnSUdGa1lYQjBSSEp2Y0dSdmQyNURjM05EYkdGemN6b2dablZ1WTNScGIyNG9ZeWtnZXlCeVpYUjFjbTRnYm5Wc2JEc2dmU3hjY2x4dUlDQWdJQ0FnSUNCdVpYaDBVMlZoY21Ob1ZHVnliVG9nWm5WdVkzUnBiMjRvYzJWc1pXTjBaV1JQWW1wbFkzUXNJR04xY25KbGJuUlRaV0Z5WTJoVVpYSnRLU0I3SUhKbGRIVnliaUIxYm1SbFptbHVaV1E3SUgxY2NseHVJQ0FnSUgwN1hISmNibHh5WEc0Z0lDQWdKQzVtYmk1elpXeGxZM1F5TG1GcVlYaEVaV1poZFd4MGN5QTlJSHRjY2x4dUlDQWdJQ0FnSUNCMGNtRnVjM0J2Y25RNklDUXVZV3BoZUN4Y2NseHVJQ0FnSUNBZ0lDQndZWEpoYlhNNklIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RIbHdaVG9nWENKSFJWUmNJaXhjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdZMkZqYUdVNklHWmhiSE5sTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JrWVhSaFZIbHdaVG9nWENKcWMyOXVYQ0pjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNCOU8xeHlYRzVjY2x4dUlDQWdJQzh2SUdWNGNHOXlkSE5jY2x4dUlDQWdJSGRwYm1SdmR5NVRaV3hsWTNReUlEMGdlMXh5WEc0Z0lDQWdJQ0FnSUhGMVpYSjVPaUI3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR0ZxWVhnNklHRnFZWGdzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR3h2WTJGc09pQnNiMk5oYkN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdGbmN6b2dkR0ZuYzF4eVhHNGdJQ0FnSUNBZ0lIMHNJSFYwYVd3NklIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pHVmliM1Z1WTJVNklHUmxZbTkxYm1ObExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCdFlYSnJUV0YwWTJnNklHMWhjbXROWVhSamFDeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pYTmpZWEJsVFdGeWEzVndPaUJrWldaaGRXeDBSWE5qWVhCbFRXRnlhM1Z3TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J6ZEhKcGNFUnBZV055YVhScFkzTTZJSE4wY21sd1JHbGhZM0pwZEdsamMxeHlYRzRnSUNBZ0lDQWdJSDBzSUZ3aVkyeGhjM05jSWpvZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCY0ltRmljM1J5WVdOMFhDSTZJRUZpYzNSeVlXTjBVMlZzWldOME1peGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1hDSnphVzVuYkdWY0lqb2dVMmx1WjJ4bFUyVnNaV04wTWl4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWENKdGRXeDBhVndpT2lCTmRXeDBhVk5sYkdWamRESmNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0I5TzF4eVhHNWNjbHh1ZlNocVVYVmxjbmtwS1R0Y2NseHVYSEpjYmx4dWZTa3VZMkZzYkNobmJHOWlZV3dzSUcxdlpIVnNaU3dnZFc1a1pXWnBibVZrTENCMWJtUmxabWx1WldRcE8xeHVJbDE5IiwiKGZ1bmN0aW9uIChnbG9iYWwpe1xuXG47IGpRdWVyeSA9IGdsb2JhbC5qUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuOyB2YXIgX19icm93c2VyaWZ5X3NoaW1fcmVxdWlyZV9fPXJlcXVpcmU7KGZ1bmN0aW9uIGJyb3dzZXJpZnlTaGltKG1vZHVsZSwgZGVmaW5lLCByZXF1aXJlKSB7XG4vKipcbiAqIFN1cGVyIHNpbXBsZSB3eXNpd3lnIGVkaXRvciBvbiBCb290c3RyYXAgdjAuNi4zXG4gKiBodHRwOi8vc3VtbWVybm90ZS5vcmcvXG4gKlxuICogc3VtbWVybm90ZS5qc1xuICogQ29weXJpZ2h0IDIwMTMtMjAxNSBBbGFuIEhvbmcuIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIHN1bW1lcm5vdGUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuL1xuICpcbiAqIERhdGU6IDIwMTUtMDQtMDhUMTM6MjhaXG4gKi9cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuXHQvKiBnbG9iYWwgZGVmaW5lICovXG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG5cdFx0ZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEJyb3dzZXIgZ2xvYmFsczogalF1ZXJ5XG5cdFx0ZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTtcblx0fVxufShmdW5jdGlvbiAoJCkge1xuXG5cblxuXHRpZiAoIUFycmF5LnByb3RvdHlwZS5yZWR1Y2UpIHtcblx0XHQvKipcblx0XHQgKiBBcnJheS5wcm90b3R5cGUucmVkdWNlIHBvbHlmaWxsXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuXHRcdCAqIEBwYXJhbSB7VmFsdWV9IFtpbml0aWFsVmFsdWVdXG5cdFx0ICogQHJldHVybiB7VmFsdWV9XG5cdFx0ICpcblx0XHQgKiBAc2VlIGh0dHA6Ly9nb28uZ2wvV05yaVFEXG5cdFx0ICovXG5cdFx0QXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHRcdFx0dmFyIHQgPSBPYmplY3QodGhpcyksIGxlbiA9IHQubGVuZ3RoID4+PiAwLCBrID0gMCwgdmFsdWU7XG5cdFx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuXHRcdFx0XHR2YWx1ZSA9IGFyZ3VtZW50c1sxXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlIChrIDwgbGVuICYmICEoayBpbiB0KSkge1xuXHRcdFx0XHRcdGsrKztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoayA+PSBsZW4pIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFsdWUgPSB0W2srK107XG5cdFx0XHR9XG5cdFx0XHRmb3IgKDsgayA8IGxlbjsgaysrKSB7XG5cdFx0XHRcdGlmIChrIGluIHQpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKHZhbHVlLCB0W2tdLCBrLCB0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH07XG5cdH1cblxuXHRpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIEFycmF5LnByb3RvdHlwZS5maWx0ZXIpIHtcblx0XHQvKipcblx0XHQgKiBBcnJheS5wcm90b3R5cGUuZmlsdGVyIHBvbHlmaWxsXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG5cdFx0ICogQHJldHVybiB7QXJyYXl9XG5cdFx0ICpcblx0XHQgKiBAc2VlIGh0dHA6Ly9nb28uZ2wvVDFLRm5xXG5cdFx0ICovXG5cdFx0QXJyYXkucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIChmdW5jKSB7XG5cdFx0XHR2YXIgdCA9IE9iamVjdCh0aGlzKSwgbGVuID0gdC5sZW5ndGggPj4+IDA7XG5cblx0XHRcdHZhciByZXMgPSBbXTtcblx0XHRcdHZhciB0aGlzQXJnID0gYXJndW1lbnRzLmxlbmd0aCA+PSAyID8gYXJndW1lbnRzWzFdIDogdm9pZCAwO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRpZiAoaSBpbiB0KSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IHRbaV07XG5cdFx0XHRcdFx0aWYgKGZ1bmMuY2FsbCh0aGlzQXJnLCB2YWwsIGksIHQpKSB7XG5cdFx0XHRcdFx0XHRyZXMucHVzaCh2YWwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzO1xuXHRcdH07XG5cdH1cblxuXHR2YXIgaXNTdXBwb3J0QW1kID0gdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kO1xuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHdoZXRoZXIgZm9udCBpcyBpbnN0YWxsZWQgb3Igbm90LlxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZm9udE5hbWVcblx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0ICovXG5cdHZhciBpc0ZvbnRJbnN0YWxsZWQgPSBmdW5jdGlvbiAoZm9udE5hbWUpIHtcblx0XHR2YXIgdGVzdEZvbnROYW1lID0gZm9udE5hbWUgPT09ICdDb21pYyBTYW5zIE1TJyA/ICdDb3VyaWVyIE5ldycgOiAnQ29taWMgU2FucyBNUyc7XG5cdFx0dmFyICR0ZXN0ZXIgPSAkKCc8ZGl2PicpLmNzcyh7XG5cdFx0XHRwb3NpdGlvbjogJ2Fic29sdXRlJyxcblx0XHRcdGxlZnQ6ICctOTk5OXB4Jyxcblx0XHRcdHRvcDogJy05OTk5cHgnLFxuXHRcdFx0Zm9udFNpemU6ICcyMDBweCdcblx0XHR9KS50ZXh0KCdtbW1tbW1tbW13d3d3d3d3JykuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7XG5cblx0XHR2YXIgb3JpZ2luYWxXaWR0aCA9ICR0ZXN0ZXIuY3NzKCdmb250RmFtaWx5JywgdGVzdEZvbnROYW1lKS53aWR0aCgpO1xuXHRcdHZhciB3aWR0aCA9ICR0ZXN0ZXIuY3NzKCdmb250RmFtaWx5JywgZm9udE5hbWUgKyAnLCcgKyB0ZXN0Rm9udE5hbWUpLndpZHRoKCk7XG5cblx0XHQkdGVzdGVyLnJlbW92ZSgpO1xuXG5cdFx0cmV0dXJuIG9yaWdpbmFsV2lkdGggIT09IHdpZHRoO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgY29yZS5hZ2VudFxuXHQgKlxuXHQgKiBPYmplY3Qgd2hpY2ggY2hlY2sgcGxhdGZvcm0gYW5kIGFnZW50XG5cdCAqXG5cdCAqIEBzaW5nbGV0b25cblx0ICogQGFsdGVybmF0ZUNsYXNzTmFtZSBhZ2VudFxuXHQgKi9cblx0dmFyIGFnZW50ID0ge1xuXHRcdC8qKiBAcHJvcGVydHkge0Jvb2xlYW59IFtpc01hYz1mYWxzZV0gdHJ1ZSBpZiB0aGlzIGFnZW50IGlzIE1hYyAgKi9cblx0XHRpc01hYzogbmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZignTWFjJykgPiAtMSxcblx0XHQvKiogQHByb3BlcnR5IHtCb29sZWFufSBbaXNNU0lFPWZhbHNlXSB0cnVlIGlmIHRoaXMgYWdlbnQgaXMgYSBJbnRlcm5ldCBFeHBsb3JlciAgKi9cblx0XHRpc01TSUU6IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTVNJRScpID4gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdUcmlkZW50JykgPiAtMSxcblx0XHQvKiogQHByb3BlcnR5IHtCb29sZWFufSBbaXNGRj1mYWxzZV0gdHJ1ZSBpZiB0aGlzIGFnZW50IGlzIGEgRmlyZWZveCAgKi9cblx0XHRpc0ZGOiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xLFxuXHRcdC8qKiBAcHJvcGVydHkge1N0cmluZ30ganF1ZXJ5VmVyc2lvbiBjdXJyZW50IGpRdWVyeSB2ZXJzaW9uIHN0cmluZyAgKi9cblx0XHRqcXVlcnlWZXJzaW9uOiBwYXJzZUZsb2F0KCQuZm4uanF1ZXJ5KSxcblx0XHRpc1N1cHBvcnRBbWQ6IGlzU3VwcG9ydEFtZCxcblx0XHRoYXNDb2RlTWlycm9yOiBpc1N1cHBvcnRBbWQgPyByZXF1aXJlLnNwZWNpZmllZCgnQ29kZU1pcnJvcicpIDogISF3aW5kb3cuQ29kZU1pcnJvcixcblx0XHRpc0ZvbnRJbnN0YWxsZWQ6IGlzRm9udEluc3RhbGxlZCxcblx0XHRpc1czQ1JhbmdlU3VwcG9ydDogISFkb2N1bWVudC5jcmVhdGVSYW5nZVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgY29yZS5mdW5jXG5cdCAqXG5cdCAqIGZ1bmMgdXRpbHMgKGZvciBoaWdoLW9yZGVyIGZ1bmMncyBhcmcpXG5cdCAqXG5cdCAqIEBzaW5nbGV0b25cblx0ICogQGFsdGVybmF0ZUNsYXNzTmFtZSBmdW5jXG5cdCAqL1xuXHR2YXIgZnVuYyA9IChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGVxID0gZnVuY3Rpb24gKGl0ZW1BKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGl0ZW1CKSB7XG5cdFx0XHRcdHJldHVybiBpdGVtQSA9PT0gaXRlbUI7XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHR2YXIgZXEyID0gZnVuY3Rpb24gKGl0ZW1BLCBpdGVtQikge1xuXHRcdFx0cmV0dXJuIGl0ZW1BID09PSBpdGVtQjtcblx0XHR9O1xuXG5cdFx0dmFyIHBlcTIgPSBmdW5jdGlvbiAocHJvcE5hbWUpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoaXRlbUEsIGl0ZW1CKSB7XG5cdFx0XHRcdHJldHVybiBpdGVtQVtwcm9wTmFtZV0gPT09IGl0ZW1CW3Byb3BOYW1lXTtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdHZhciBvayA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cblx0XHR2YXIgZmFpbCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0dmFyIG5vdCA9IGZ1bmN0aW9uIChmKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gIWYuYXBwbHkoZiwgYXJndW1lbnRzKTtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdHZhciBhbmQgPSBmdW5jdGlvbiAoZkEsIGZCKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGl0ZW0pIHtcblx0XHRcdFx0cmV0dXJuIGZBKGl0ZW0pICYmIGZCKGl0ZW0pO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0dmFyIHNlbGYgPSBmdW5jdGlvbiAoYSkge1xuXHRcdFx0cmV0dXJuIGE7XG5cdFx0fTtcblxuXHRcdHZhciBpZENvdW50ZXIgPSAwO1xuXG5cdFx0LyoqXG5cdFx0ICogZ2VuZXJhdGUgYSBnbG9iYWxseS11bmlxdWUgaWRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbcHJlZml4XVxuXHRcdCAqL1xuXHRcdHZhciB1bmlxdWVJZCA9IGZ1bmN0aW9uIChwcmVmaXgpIHtcblx0XHRcdHZhciBpZCA9ICsraWRDb3VudGVyICsgJyc7XG5cdFx0XHRyZXR1cm4gcHJlZml4ID8gcHJlZml4ICsgaWQgOiBpZDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBibmQgKGJvdW5kcykgZnJvbSByZWN0XG5cdFx0ICpcblx0XHQgKiAtIElFIENvbXBhdGFiaWxpdHkgSXNzdWU6IGh0dHA6Ly9nb28uZ2wvc1JMT0FvXG5cdFx0ICogLSBTY3JvbGwgSXNzdWU6IGh0dHA6Ly9nb28uZ2wvc05qVWNcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7UmVjdH0gcmVjdFxuXHRcdCAqIEByZXR1cm4ge09iamVjdH0gYm91bmRzXG5cdFx0ICogQHJldHVybiB7TnVtYmVyfSBib3VuZHMudG9wXG5cdFx0ICogQHJldHVybiB7TnVtYmVyfSBib3VuZHMubGVmdFxuXHRcdCAqIEByZXR1cm4ge051bWJlcn0gYm91bmRzLndpZHRoXG5cdFx0ICogQHJldHVybiB7TnVtYmVyfSBib3VuZHMuaGVpZ2h0XG5cdFx0ICovXG5cdFx0dmFyIHJlY3QyYm5kID0gZnVuY3Rpb24gKHJlY3QpIHtcblx0XHRcdHZhciAkZG9jdW1lbnQgPSAkKGRvY3VtZW50KTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRvcDogcmVjdC50b3AgKyAkZG9jdW1lbnQuc2Nyb2xsVG9wKCksXG5cdFx0XHRcdGxlZnQ6IHJlY3QubGVmdCArICRkb2N1bWVudC5zY3JvbGxMZWZ0KCksXG5cdFx0XHRcdHdpZHRoOiByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LFxuXHRcdFx0XHRoZWlnaHQ6IHJlY3QuYm90dG9tIC0gcmVjdC50b3Bcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgYSBjb3B5IG9mIHRoZSBvYmplY3Qgd2hlcmUgdGhlIGtleXMgaGF2ZSBiZWNvbWUgdGhlIHZhbHVlcyBhbmQgdGhlIHZhbHVlcyB0aGUga2V5cy5cblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb2JqXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHZhciBpbnZlcnRPYmplY3QgPSBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHR2YXIgaW52ZXJ0ZWQgPSB7fTtcblx0XHRcdGZvciAodmFyIGtleSBpbiBvYmopIHtcblx0XHRcdFx0aWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdFx0aW52ZXJ0ZWRbb2JqW2tleV1dID0ga2V5O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gaW52ZXJ0ZWQ7XG5cdFx0fTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRlcTogZXEsXG5cdFx0XHRlcTI6IGVxMixcblx0XHRcdHBlcTI6IHBlcTIsXG5cdFx0XHRvazogb2ssXG5cdFx0XHRmYWlsOiBmYWlsLFxuXHRcdFx0c2VsZjogc2VsZixcblx0XHRcdG5vdDogbm90LFxuXHRcdFx0YW5kOiBhbmQsXG5cdFx0XHR1bmlxdWVJZDogdW5pcXVlSWQsXG5cdFx0XHRyZWN0MmJuZDogcmVjdDJibmQsXG5cdFx0XHRpbnZlcnRPYmplY3Q6IGludmVydE9iamVjdFxuXHRcdH07XG5cdH0pKCk7XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBjb3JlLmxpc3Rcblx0ICpcblx0ICogbGlzdCB1dGlsc1xuXHQgKlxuXHQgKiBAc2luZ2xldG9uXG5cdCAqIEBhbHRlcm5hdGVDbGFzc05hbWUgbGlzdFxuXHQgKi9cblx0dmFyIGxpc3QgPSAoZnVuY3Rpb24gKCkge1xuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgdGhlIGZpcnN0IGl0ZW0gb2YgYW4gYXJyYXkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuXHRcdCAqL1xuXHRcdHZhciBoZWFkID0gZnVuY3Rpb24gKGFycmF5KSB7XG5cdFx0XHRyZXR1cm4gYXJyYXlbMF07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgdGhlIGxhc3QgaXRlbSBvZiBhbiBhcnJheS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG5cdFx0ICovXG5cdFx0dmFyIGxhc3QgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0XHRcdHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgbGFzdCBlbnRyeSBvZiB0aGUgYXJyYXkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuXHRcdCAqL1xuXHRcdHZhciBpbml0aWFsID0gZnVuY3Rpb24gKGFycmF5KSB7XG5cdFx0XHRyZXR1cm4gYXJyYXkuc2xpY2UoMCwgYXJyYXkubGVuZ3RoIC0gMSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgdGhlIHJlc3Qgb2YgdGhlIGl0ZW1zIGluIGFuIGFycmF5LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXlcblx0XHQgKi9cblx0XHR2YXIgdGFpbCA9IGZ1bmN0aW9uIChhcnJheSkge1xuXHRcdFx0cmV0dXJuIGFycmF5LnNsaWNlKDEpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGl0ZW0gb2YgYXJyYXlcblx0XHQgKi9cblx0XHR2YXIgZmluZCA9IGZ1bmN0aW9uIChhcnJheSwgcHJlZCkge1xuXHRcdFx0Zm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHRcdHZhciBpdGVtID0gYXJyYXlbaWR4XTtcblx0XHRcdFx0aWYgKHByZWQoaXRlbSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gaXRlbTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IHBhc3MgdGhlIHByZWRpY2F0ZSB0cnV0aCB0ZXN0LlxuXHRcdCAqL1xuXHRcdHZhciBhbGwgPSBmdW5jdGlvbiAoYXJyYXksIHByZWQpIHtcblx0XHRcdGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuXHRcdFx0XHRpZiAoIXByZWQoYXJyYXlbaWR4XSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIHByZXNlbnQgaW4gdGhlIGxpc3QuXG5cdFx0ICovXG5cdFx0dmFyIGNvbnRhaW5zID0gZnVuY3Rpb24gKGFycmF5LCBpdGVtKSB7XG5cdFx0XHRyZXR1cm4gJC5pbkFycmF5KGl0ZW0sIGFycmF5KSAhPT0gLTE7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGdldCBzdW0gZnJvbSBhIGxpc3Rcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IC0gYXJyYXlcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIGl0ZXJhdG9yXG5cdFx0ICovXG5cdFx0dmFyIHN1bSA9IGZ1bmN0aW9uIChhcnJheSwgZm4pIHtcblx0XHRcdGZuID0gZm4gfHwgZnVuYy5zZWxmO1xuXHRcdFx0cmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbiAobWVtbywgdikge1xuXHRcdFx0XHRyZXR1cm4gbWVtbyArIGZuKHYpO1xuXHRcdFx0fSwgMCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgYSBjb3B5IG9mIHRoZSBjb2xsZWN0aW9uIHdpdGggYXJyYXkgdHlwZS5cblx0XHQgKiBAcGFyYW0ge0NvbGxlY3Rpb259IGNvbGxlY3Rpb24gLSBjb2xsZWN0aW9uIGVnKSBub2RlLmNoaWxkTm9kZXMsIC4uLlxuXHRcdCAqL1xuXHRcdHZhciBmcm9tID0gZnVuY3Rpb24gKGNvbGxlY3Rpb24pIHtcblx0XHRcdHZhciByZXN1bHQgPSBbXSwgaWR4ID0gLTEsIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCsraWR4IDwgbGVuZ3RoKSB7XG5cdFx0XHRcdHJlc3VsdFtpZHhdID0gY29sbGVjdGlvbltpZHhdO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogY2x1c3RlciBlbGVtZW50cyBieSBwcmVkaWNhdGUgZnVuY3Rpb24uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheSAtIGFycmF5XG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBwcmVkaWNhdGUgZnVuY3Rpb24gZm9yIGNsdXN0ZXIgcnVsZVxuXHRcdCAqIEBwYXJhbSB7QXJyYXlbXX1cblx0XHQgKi9cblx0XHR2YXIgY2x1c3RlckJ5ID0gZnVuY3Rpb24gKGFycmF5LCBmbikge1xuXHRcdFx0aWYgKCFhcnJheS5sZW5ndGgpIHsgcmV0dXJuIFtdOyB9XG5cdFx0XHR2YXIgYVRhaWwgPSB0YWlsKGFycmF5KTtcblx0XHRcdHJldHVybiBhVGFpbC5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIHYpIHtcblx0XHRcdFx0dmFyIGFMYXN0ID0gbGFzdChtZW1vKTtcblx0XHRcdFx0aWYgKGZuKGxhc3QoYUxhc3QpLCB2KSkge1xuXHRcdFx0XHRcdGFMYXN0W2FMYXN0Lmxlbmd0aF0gPSB2O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1lbW9bbWVtby5sZW5ndGhdID0gW3ZdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtZW1vO1xuXHRcdFx0fSwgW1toZWFkKGFycmF5KV1dKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBhIGNvcHkgb2YgdGhlIGFycmF5IHdpdGggYWxsIGZhbHN5IHZhbHVlcyByZW1vdmVkXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheSAtIGFycmF5XG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBwcmVkaWNhdGUgZnVuY3Rpb24gZm9yIGNsdXN0ZXIgcnVsZVxuXHRcdCAqL1xuXHRcdHZhciBjb21wYWN0ID0gZnVuY3Rpb24gKGFycmF5KSB7XG5cdFx0XHR2YXIgYVJlc3VsdCA9IFtdO1xuXHRcdFx0Zm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHRcdGlmIChhcnJheVtpZHhdKSB7IGFSZXN1bHQucHVzaChhcnJheVtpZHhdKTsgfVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFSZXN1bHQ7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHByb2R1Y2VzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiB0aGUgYXJyYXlcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG5cdFx0ICovXG5cdFx0dmFyIHVuaXF1ZSA9IGZ1bmN0aW9uIChhcnJheSkge1xuXHRcdFx0dmFyIHJlc3VsdHMgPSBbXTtcblxuXHRcdFx0Zm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHRcdGlmICghY29udGFpbnMocmVzdWx0cywgYXJyYXlbaWR4XSkpIHtcblx0XHRcdFx0XHRyZXN1bHRzLnB1c2goYXJyYXlbaWR4XSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgbmV4dCBpdGVtLlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG5cdFx0ICovXG5cdFx0dmFyIG5leHQgPSBmdW5jdGlvbiAoYXJyYXksIGl0ZW0pIHtcblx0XHRcdHZhciBpZHggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuXHRcdFx0aWYgKGlkeCA9PT0gLTEpIHsgcmV0dXJuIG51bGw7IH1cblxuXHRcdFx0cmV0dXJuIGFycmF5W2lkeCArIDFdO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHByZXYgaXRlbS5cblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuXHRcdCAqL1xuXHRcdHZhciBwcmV2ID0gZnVuY3Rpb24gKGFycmF5LCBpdGVtKSB7XG5cdFx0XHR2YXIgaWR4ID0gYXJyYXkuaW5kZXhPZihpdGVtKTtcblx0XHRcdGlmIChpZHggPT09IC0xKSB7IHJldHVybiBudWxsOyB9XG5cblx0XHRcdHJldHVybiBhcnJheVtpZHggLSAxXTtcblx0XHR9O1xuXG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0aGVhZDogaGVhZCwgbGFzdDogbGFzdCwgaW5pdGlhbDogaW5pdGlhbCwgdGFpbDogdGFpbCxcblx0XHRcdHByZXY6IHByZXYsIG5leHQ6IG5leHQsIGZpbmQ6IGZpbmQsIGNvbnRhaW5zOiBjb250YWlucyxcblx0XHRcdGFsbDogYWxsLCBzdW06IHN1bSwgZnJvbTogZnJvbSxcblx0XHRcdGNsdXN0ZXJCeTogY2x1c3RlckJ5LCBjb21wYWN0OiBjb21wYWN0LCB1bmlxdWU6IHVuaXF1ZVxuXHRcdH07XG5cdH0pKCk7XG5cblxuXHR2YXIgTkJTUF9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApO1xuXHR2YXIgWkVST19XSURUSF9OQlNQX0NIQVIgPSAnXFx1ZmVmZic7XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBjb3JlLmRvbVxuXHQgKlxuXHQgKiBEb20gZnVuY3Rpb25zXG5cdCAqXG5cdCAqIEBzaW5nbGV0b25cblx0ICogQGFsdGVybmF0ZUNsYXNzTmFtZSBkb21cblx0ICovXG5cdHZhciBkb20gPSAoZnVuY3Rpb24gKCkge1xuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaXNFZGl0YWJsZVxuXHRcdCAqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIG5vZGUgaXMgYG5vdGUtZWRpdGFibGVgIG9yIG5vdC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzRWRpdGFibGUgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIG5vZGUgJiYgJChub2RlKS5oYXNDbGFzcygnbm90ZS1lZGl0YWJsZScpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGlzQ29udHJvbFNpemluZ1xuXHRcdCAqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIG5vZGUgaXMgYG5vdGUtY29udHJvbC1zaXppbmdgIG9yIG5vdC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzQ29udHJvbFNpemluZyA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gbm9kZSAmJiAkKG5vZGUpLmhhc0NsYXNzKCdub3RlLWNvbnRyb2wtc2l6aW5nJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgIGJ1aWxkTGF5b3V0SW5mb1xuXHRcdCAqXG5cdFx0ICogYnVpbGQgbGF5b3V0SW5mbyBmcm9tICRlZGl0b3IoLm5vdGUtZWRpdG9yKVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0b3Jcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICogQHJldHVybiB7RnVuY3Rpb259IHJldHVybi5lZGl0b3Jcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByZXR1cm4uZHJvcHpvbmVcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByZXR1cm4udG9vbGJhclxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJldHVybi5lZGl0YWJsZVxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJldHVybi5jb2RhYmxlXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gcmV0dXJuLnBvcG92ZXJcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByZXR1cm4uaGFuZGxlXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gcmV0dXJuLmRpYWxvZ1xuXHRcdCAqL1xuXHRcdHZhciBidWlsZExheW91dEluZm8gPSBmdW5jdGlvbiAoJGVkaXRvcikge1xuXHRcdFx0dmFyIG1ha2VGaW5kZXI7XG5cblx0XHRcdC8vIGFpciBtb2RlXG5cdFx0XHRpZiAoJGVkaXRvci5oYXNDbGFzcygnbm90ZS1haXItZWRpdG9yJykpIHtcblx0XHRcdFx0dmFyIGlkID0gbGlzdC5sYXN0KCRlZGl0b3IuYXR0cignaWQnKS5zcGxpdCgnLScpKTtcblx0XHRcdFx0bWFrZUZpbmRlciA9IGZ1bmN0aW9uIChzSWRQcmVmaXgpIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gJChzSWRQcmVmaXggKyBpZCk7IH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRlZGl0b3I6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICRlZGl0b3I7IH0sXG5cdFx0XHRcdFx0aG9sZGVyOiBmdW5jdGlvbiAoKSB7IHJldHVybiAkZWRpdG9yLmRhdGEoJ2hvbGRlcicpOyB9LFxuXHRcdFx0XHRcdGVkaXRhYmxlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAkZWRpdG9yOyB9LFxuXHRcdFx0XHRcdHBvcG92ZXI6IG1ha2VGaW5kZXIoJyNub3RlLXBvcG92ZXItJyksXG5cdFx0XHRcdFx0aGFuZGxlOiBtYWtlRmluZGVyKCcjbm90ZS1oYW5kbGUtJyksXG5cdFx0XHRcdFx0ZGlhbG9nOiBtYWtlRmluZGVyKCcjbm90ZS1kaWFsb2ctJylcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBmcmFtZSBtb2RlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYWtlRmluZGVyID0gZnVuY3Rpb24gKHNDbGFzc05hbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gJGVkaXRvci5maW5kKHNDbGFzc05hbWUpOyB9O1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGVkaXRvcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gJGVkaXRvcjsgfSxcblx0XHRcdFx0XHRob2xkZXI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICRlZGl0b3IuZGF0YSgnaG9sZGVyJyk7IH0sXG5cdFx0XHRcdFx0ZHJvcHpvbmU6IG1ha2VGaW5kZXIoJy5ub3RlLWRyb3B6b25lJyksXG5cdFx0XHRcdFx0dG9vbGJhcjogbWFrZUZpbmRlcignLm5vdGUtdG9vbGJhcicpLFxuXHRcdFx0XHRcdGVkaXRhYmxlOiBtYWtlRmluZGVyKCcubm90ZS1lZGl0YWJsZScpLFxuXHRcdFx0XHRcdGNvZGFibGU6IG1ha2VGaW5kZXIoJy5ub3RlLWNvZGFibGUnKSxcblx0XHRcdFx0XHRzdGF0dXNiYXI6IG1ha2VGaW5kZXIoJy5ub3RlLXN0YXR1c2JhcicpLFxuXHRcdFx0XHRcdHBvcG92ZXI6IG1ha2VGaW5kZXIoJy5ub3RlLXBvcG92ZXInKSxcblx0XHRcdFx0XHRoYW5kbGU6IG1ha2VGaW5kZXIoJy5ub3RlLWhhbmRsZScpLFxuXHRcdFx0XHRcdGRpYWxvZzogbWFrZUZpbmRlcignLm5vdGUtZGlhbG9nJylcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBtYWtlTGF5b3V0SW5mbyBmcm9tIGVkaXRvcidzIGRlc2NlbmRhbnQgbm9kZS5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBkZXNjZW5kYW50XG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHZhciBtYWtlTGF5b3V0SW5mbyA9IGZ1bmN0aW9uIChkZXNjZW5kYW50KSB7XG5cdFx0XHR2YXIgJHRhcmdldCA9ICQoZGVzY2VuZGFudCkuY2xvc2VzdCgnLm5vdGUtZWRpdG9yLCAubm90ZS1haXItZWRpdG9yLCAubm90ZS1haXItbGF5b3V0Jyk7XG5cblx0XHRcdGlmICghJHRhcmdldC5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdHZhciAkZWRpdG9yO1xuXHRcdFx0aWYgKCR0YXJnZXQuaXMoJy5ub3RlLWVkaXRvciwgLm5vdGUtYWlyLWVkaXRvcicpKSB7XG5cdFx0XHRcdCRlZGl0b3IgPSAkdGFyZ2V0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JGVkaXRvciA9ICQoJyNub3RlLWVkaXRvci0nICsgbGlzdC5sYXN0KCR0YXJnZXQuYXR0cignaWQnKS5zcGxpdCgnLScpKSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBidWlsZExheW91dEluZm8oJGVkaXRvcik7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgbWFrZVByZWRCeU5vZGVOYW1lXG5cdFx0ICpcblx0XHQgKiByZXR1cm5zIHByZWRpY2F0ZSB3aGljaCBqdWRnZSB3aGV0aGVyIG5vZGVOYW1lIGlzIHNhbWVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBub2RlTmFtZVxuXHRcdCAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHRcdCAqL1xuXHRcdHZhciBtYWtlUHJlZEJ5Tm9kZU5hbWUgPSBmdW5jdGlvbiAobm9kZU5hbWUpIHtcblx0XHRcdG5vZGVOYW1lID0gbm9kZU5hbWUudG9VcHBlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHRyZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpc1RleHRcblx0XHQgKlxuXHRcdCAqXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIG5vZGUncyB0eXBlIGlzIHRleHQoMylcblx0XHQgKi9cblx0XHR2YXIgaXNUZXh0ID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IDM7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGV4KSBiciwgY29sLCBlbWJlZCwgaHIsIGltZywgaW5wdXQsIC4uLlxuXHRcdCAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvaHRtbC93Zy9kcmFmdHMvaHRtbC9tYXN0ZXIvc3ludGF4Lmh0bWwjdm9pZC1lbGVtZW50c1xuXHRcdCAqL1xuXHRcdHZhciBpc1ZvaWQgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIG5vZGUgJiYgL15CUnxeSU1HfF5IUi8udGVzdChub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpO1xuXHRcdH07XG5cblx0XHR2YXIgaXNQYXJhID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdGlmIChpc0VkaXRhYmxlKG5vZGUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2hyb21lKHYzMS4wKSwgRkYodjI1LjAuMSkgdXNlIERJViBmb3IgcGFyYWdyYXBoXG5cdFx0XHRyZXR1cm4gbm9kZSAmJiAvXkRJVnxeUHxeTEl8XkhbMS03XS8udGVzdChub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpO1xuXHRcdH07XG5cblx0XHR2YXIgaXNMaSA9IG1ha2VQcmVkQnlOb2RlTmFtZSgnTEknKTtcblxuXHRcdHZhciBpc1B1cmVQYXJhID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBpc1BhcmEobm9kZSkgJiYgIWlzTGkobm9kZSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc1RhYmxlID0gbWFrZVByZWRCeU5vZGVOYW1lKCdUQUJMRScpO1xuXG5cdFx0dmFyIGlzSW5saW5lID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiAhaXNCb2R5Q29udGFpbmVyKG5vZGUpICYmXG5cdFx0XHRcdCAgICFpc0xpc3Qobm9kZSkgJiZcblx0XHRcdFx0ICAgIWlzUGFyYShub2RlKSAmJlxuXHRcdFx0XHQgICAhaXNUYWJsZShub2RlKSAmJlxuXHRcdFx0XHQgICAhaXNCbG9ja3F1b3RlKG5vZGUpO1xuXHRcdH07XG5cblx0XHR2YXIgaXNMaXN0ID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBub2RlICYmIC9eVUx8Xk9MLy50ZXN0KG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc0NlbGwgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIG5vZGUgJiYgL15URHxeVEgvLnRlc3Qobm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzQmxvY2txdW90ZSA9IG1ha2VQcmVkQnlOb2RlTmFtZSgnQkxPQ0tRVU9URScpO1xuXG5cdFx0dmFyIGlzQm9keUNvbnRhaW5lciA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gaXNDZWxsKG5vZGUpIHx8IGlzQmxvY2txdW90ZShub2RlKSB8fCBpc0VkaXRhYmxlKG5vZGUpO1xuXHRcdH07XG5cblx0XHR2YXIgaXNBbmNob3IgPSBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0EnKTtcblxuXHRcdHZhciBpc1BhcmFJbmxpbmUgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIGlzSW5saW5lKG5vZGUpICYmICEhYW5jZXN0b3Iobm9kZSwgaXNQYXJhKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzQm9keUlubGluZSA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gaXNJbmxpbmUobm9kZSkgJiYgIWFuY2VzdG9yKG5vZGUsIGlzUGFyYSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc0JvZHkgPSBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0JPRFknKTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgd2hldGhlciBub2RlQiBpcyBjbG9zZXN0IHNpYmxpbmcgb2Ygbm9kZUFcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZUFcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVCXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNDbG9zZXN0U2libGluZyA9IGZ1bmN0aW9uIChub2RlQSwgbm9kZUIpIHtcblx0XHRcdHJldHVybiBub2RlQS5uZXh0U2libGluZyA9PT0gbm9kZUIgfHxcblx0XHRcdFx0ICAgbm9kZUEucHJldmlvdXNTaWJsaW5nID09PSBub2RlQjtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBhcnJheSBvZiBjbG9zZXN0IHNpYmxpbmdzIHdpdGggbm9kZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbn0gW3ByZWRdIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0ICogQHJldHVybiB7Tm9kZVtdfVxuXHRcdCAqL1xuXHRcdHZhciB3aXRoQ2xvc2VzdFNpYmxpbmdzID0gZnVuY3Rpb24gKG5vZGUsIHByZWQpIHtcblx0XHRcdHByZWQgPSBwcmVkIHx8IGZ1bmMub2s7XG5cblx0XHRcdHZhciBzaWJsaW5ncyA9IFtdO1xuXHRcdFx0aWYgKG5vZGUucHJldmlvdXNTaWJsaW5nICYmIHByZWQobm9kZS5wcmV2aW91c1NpYmxpbmcpKSB7XG5cdFx0XHRcdHNpYmxpbmdzLnB1c2gobm9kZS5wcmV2aW91c1NpYmxpbmcpO1xuXHRcdFx0fVxuXHRcdFx0c2libGluZ3MucHVzaChub2RlKTtcblx0XHRcdGlmIChub2RlLm5leHRTaWJsaW5nICYmIHByZWQobm9kZS5uZXh0U2libGluZykpIHtcblx0XHRcdFx0c2libGluZ3MucHVzaChub2RlLm5leHRTaWJsaW5nKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzaWJsaW5ncztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYmxhbmsgSFRNTCBmb3IgY3Vyc29yIHBvc2l0aW9uXG5cdFx0ICovXG5cdFx0dmFyIGJsYW5rSFRNTCA9IGFnZW50LmlzTVNJRSA/ICcmbmJzcDsnIDogJzxicj4nO1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBub2RlTGVuZ3RoXG5cdFx0ICpcblx0XHQgKiByZXR1cm5zICN0ZXh0J3MgdGV4dCBzaXplIG9yIGVsZW1lbnQncyBjaGlsZE5vZGVzIHNpemVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqL1xuXHRcdHZhciBub2RlTGVuZ3RoID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdGlmIChpc1RleHQobm9kZSkpIHtcblx0XHRcdFx0cmV0dXJuIG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgd2hldGhlciBub2RlIGlzIGVtcHR5IG9yIG5vdC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzRW1wdHkgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0dmFyIGxlbiA9IG5vZGVMZW5ndGgobm9kZSk7XG5cblx0XHRcdGlmIChsZW4gPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9IGVsc2UgaWYgKCFkb20uaXNUZXh0KG5vZGUpICYmIGxlbiA9PT0gMSAmJiBub2RlLmlubmVySFRNTCA9PT0gYmxhbmtIVE1MKSB7XG5cdFx0XHRcdC8vIGV4KSA8cD48YnI+PC9wPiwgPHNwYW4+PGJyPjwvc3Bhbj5cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcGFkZGluZyBibGFua0hUTUwgaWYgbm9kZSBpcyBlbXB0eSAoZm9yIGN1cnNvciBwb3NpdGlvbilcblx0XHQgKi9cblx0XHR2YXIgcGFkZGluZ0JsYW5rSFRNTCA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRpZiAoIWlzVm9pZChub2RlKSAmJiAhbm9kZUxlbmd0aChub2RlKSkge1xuXHRcdFx0XHRub2RlLmlubmVySFRNTCA9IGJsYW5rSFRNTDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZmluZCBuZWFyZXN0IGFuY2VzdG9yIHByZWRpY2F0ZSBoaXRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHQgKi9cblx0XHR2YXIgYW5jZXN0b3IgPSBmdW5jdGlvbiAobm9kZSwgcHJlZCkge1xuXHRcdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdFx0aWYgKHByZWQobm9kZSkpIHsgcmV0dXJuIG5vZGU7IH1cblx0XHRcdFx0aWYgKGlzRWRpdGFibGUobm9kZSkpIHsgYnJlYWs7IH1cblxuXHRcdFx0XHRub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGZpbmQgbmVhcmVzdCBhbmNlc3RvciBvbmx5IHNpbmdsZSBjaGlsZCBibG9vZCBsaW5lIGFuZCBwcmVkaWNhdGUgaGl0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0dmFyIHNpbmdsZUNoaWxkQW5jZXN0b3IgPSBmdW5jdGlvbiAobm9kZSwgcHJlZCkge1xuXHRcdFx0bm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcblxuXHRcdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdFx0aWYgKG5vZGVMZW5ndGgobm9kZSkgIT09IDEpIHsgYnJlYWs7IH1cblx0XHRcdFx0aWYgKHByZWQobm9kZSkpIHsgcmV0dXJuIG5vZGU7IH1cblx0XHRcdFx0aWYgKGlzRWRpdGFibGUobm9kZSkpIHsgYnJlYWs7IH1cblxuXHRcdFx0XHRub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgbmV3IGFycmF5IG9mIGFuY2VzdG9yIG5vZGVzICh1bnRpbCBwcmVkaWNhdGUgaGl0KS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25hbF0gcHJlZCAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdHZhciBsaXN0QW5jZXN0b3IgPSBmdW5jdGlvbiAobm9kZSwgcHJlZCkge1xuXHRcdFx0cHJlZCA9IHByZWQgfHwgZnVuYy5mYWlsO1xuXG5cdFx0XHR2YXIgYW5jZXN0b3JzID0gW107XG5cdFx0XHRhbmNlc3Rvcihub2RlLCBmdW5jdGlvbiAoZWwpIHtcblx0XHRcdFx0aWYgKCFpc0VkaXRhYmxlKGVsKSkge1xuXHRcdFx0XHRcdGFuY2VzdG9ycy5wdXNoKGVsKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBwcmVkKGVsKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGFuY2VzdG9ycztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZmluZCBmYXJ0aGVzdCBhbmNlc3RvciBwcmVkaWNhdGUgaGl0XG5cdFx0ICovXG5cdFx0dmFyIGxhc3RBbmNlc3RvciA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHR2YXIgYW5jZXN0b3JzID0gbGlzdEFuY2VzdG9yKG5vZGUpO1xuXHRcdFx0cmV0dXJuIGxpc3QubGFzdChhbmNlc3RvcnMuZmlsdGVyKHByZWQpKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBjb21tb24gYW5jZXN0b3Igbm9kZSBiZXR3ZWVuIHR3byBub2Rlcy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZUFcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVCXG5cdFx0ICovXG5cdFx0dmFyIGNvbW1vbkFuY2VzdG9yID0gZnVuY3Rpb24gKG5vZGVBLCBub2RlQikge1xuXHRcdFx0dmFyIGFuY2VzdG9ycyA9IGxpc3RBbmNlc3Rvcihub2RlQSk7XG5cdFx0XHRmb3IgKHZhciBuID0gbm9kZUI7IG47IG4gPSBuLnBhcmVudE5vZGUpIHtcblx0XHRcdFx0aWYgKCQuaW5BcnJheShuLCBhbmNlc3RvcnMpID4gLTEpIHsgcmV0dXJuIG47IH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsOyAvLyBkaWZmZXJlbmNlIGRvY3VtZW50IGFyZWFcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogbGlzdGluZyBhbGwgcHJldmlvdXMgc2libGluZ3MgKHVudGlsIHByZWRpY2F0ZSBoaXQpLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbmFsXSBwcmVkIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0dmFyIGxpc3RQcmV2ID0gZnVuY3Rpb24gKG5vZGUsIHByZWQpIHtcblx0XHRcdHByZWQgPSBwcmVkIHx8IGZ1bmMuZmFpbDtcblxuXHRcdFx0dmFyIG5vZGVzID0gW107XG5cdFx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0XHRpZiAocHJlZChub2RlKSkgeyBicmVhazsgfVxuXHRcdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0XHRub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbm9kZXM7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGxpc3RpbmcgbmV4dCBzaWJsaW5ncyAodW50aWwgcHJlZGljYXRlIGhpdCkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZF0gLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHQgKi9cblx0XHR2YXIgbGlzdE5leHQgPSBmdW5jdGlvbiAobm9kZSwgcHJlZCkge1xuXHRcdFx0cHJlZCA9IHByZWQgfHwgZnVuYy5mYWlsO1xuXG5cdFx0XHR2YXIgbm9kZXMgPSBbXTtcblx0XHRcdHdoaWxlIChub2RlKSB7XG5cdFx0XHRcdGlmIChwcmVkKG5vZGUpKSB7IGJyZWFrOyB9XG5cdFx0XHRcdG5vZGVzLnB1c2gobm9kZSk7XG5cdFx0XHRcdG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5vZGVzO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBsaXN0aW5nIGRlc2NlbmRhbnQgbm9kZXNcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkXSAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdHZhciBsaXN0RGVzY2VuZGFudCA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHR2YXIgZGVzY2VuZGVudHMgPSBbXTtcblx0XHRcdHByZWQgPSBwcmVkIHx8IGZ1bmMub2s7XG5cblx0XHRcdC8vIHN0YXJ0IERGUyhkZXB0aCBmaXJzdCBzZWFyY2gpIHdpdGggbm9kZVxuXHRcdFx0KGZ1bmN0aW9uIGZuV2FsayhjdXJyZW50KSB7XG5cdFx0XHRcdGlmIChub2RlICE9PSBjdXJyZW50ICYmIHByZWQoY3VycmVudCkpIHtcblx0XHRcdFx0XHRkZXNjZW5kZW50cy5wdXNoKGN1cnJlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGN1cnJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcblx0XHRcdFx0XHRmbldhbGsoY3VycmVudC5jaGlsZE5vZGVzW2lkeF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KShub2RlKTtcblxuXHRcdFx0cmV0dXJuIGRlc2NlbmRlbnRzO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiB3cmFwIG5vZGUgd2l0aCBuZXcgdGFnLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSB0YWdOYW1lIG9mIHdyYXBwZXJcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSAtIHdyYXBwZXJcblx0XHQgKi9cblx0XHR2YXIgd3JhcCA9IGZ1bmN0aW9uIChub2RlLCB3cmFwcGVyTmFtZSkge1xuXHRcdFx0dmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdHZhciB3cmFwcGVyID0gJCgnPCcgKyB3cmFwcGVyTmFtZSArICc+JylbMF07XG5cblx0XHRcdHBhcmVudC5pbnNlcnRCZWZvcmUod3JhcHBlciwgbm9kZSk7XG5cdFx0XHR3cmFwcGVyLmFwcGVuZENoaWxkKG5vZGUpO1xuXG5cdFx0XHRyZXR1cm4gd3JhcHBlcjtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaW5zZXJ0IG5vZGUgYWZ0ZXIgcHJlY2VkaW5nXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge05vZGV9IHByZWNlZGluZyAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdHZhciBpbnNlcnRBZnRlciA9IGZ1bmN0aW9uIChub2RlLCBwcmVjZWRpbmcpIHtcblx0XHRcdHZhciBuZXh0ID0gcHJlY2VkaW5nLm5leHRTaWJsaW5nLCBwYXJlbnQgPSBwcmVjZWRpbmcucGFyZW50Tm9kZTtcblx0XHRcdGlmIChuZXh0KSB7XG5cdFx0XHRcdHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwYXJlbnQuYXBwZW5kQ2hpbGQobm9kZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYXBwZW5kIGVsZW1lbnRzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtDb2xsZWN0aW9ufSBhQ2hpbGRcblx0XHQgKi9cblx0XHR2YXIgYXBwZW5kQ2hpbGROb2RlcyA9IGZ1bmN0aW9uIChub2RlLCBhQ2hpbGQpIHtcblx0XHRcdCQuZWFjaChhQ2hpbGQsIGZ1bmN0aW9uIChpZHgsIGNoaWxkKSB7XG5cdFx0XHRcdG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIGJvdW5kYXJ5UG9pbnQgaXMgbGVmdCBlZGdlIG9yIG5vdC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc0xlZnRFZGdlUG9pbnQgPSBmdW5jdGlvbiAocG9pbnQpIHtcblx0XHRcdHJldHVybiBwb2ludC5vZmZzZXQgPT09IDA7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgd2hldGhlciBib3VuZGFyeVBvaW50IGlzIHJpZ2h0IGVkZ2Ugb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzUmlnaHRFZGdlUG9pbnQgPSBmdW5jdGlvbiAocG9pbnQpIHtcblx0XHRcdHJldHVybiBwb2ludC5vZmZzZXQgPT09IG5vZGVMZW5ndGgocG9pbnQubm9kZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgd2hldGhlciBib3VuZGFyeVBvaW50IGlzIGVkZ2Ugb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzRWRnZVBvaW50ID0gZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHRyZXR1cm4gaXNMZWZ0RWRnZVBvaW50KHBvaW50KSB8fCBpc1JpZ2h0RWRnZVBvaW50KHBvaW50KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0ZXIgbm9kZSBpcyBsZWZ0IGVkZ2Ugb2YgYW5jZXN0b3Igb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBhbmNlc3RvclxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzTGVmdEVkZ2VPZiA9IGZ1bmN0aW9uIChub2RlLCBhbmNlc3Rvcikge1xuXHRcdFx0d2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gYW5jZXN0b3IpIHtcblx0XHRcdFx0aWYgKHBvc2l0aW9uKG5vZGUpICE9PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgbm9kZSBpcyByaWdodCBlZGdlIG9mIGFuY2VzdG9yIG9yIG5vdC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gYW5jZXN0b3Jcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc1JpZ2h0RWRnZU9mID0gZnVuY3Rpb24gKG5vZGUsIGFuY2VzdG9yKSB7XG5cdFx0XHR3aGlsZSAobm9kZSAmJiBub2RlICE9PSBhbmNlc3Rvcikge1xuXHRcdFx0XHRpZiAocG9zaXRpb24obm9kZSkgIT09IG5vZGVMZW5ndGgobm9kZS5wYXJlbnROb2RlKSAtIDEpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0bm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgb2Zmc2V0IGZyb20gcGFyZW50LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICovXG5cdFx0dmFyIHBvc2l0aW9uID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHZhciBvZmZzZXQgPSAwO1xuXHRcdFx0d2hpbGUgKChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpKSB7XG5cdFx0XHRcdG9mZnNldCArPSAxO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9mZnNldDtcblx0XHR9O1xuXG5cdFx0dmFyIGhhc0NoaWxkcmVuID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiAhIShub2RlICYmIG5vZGUuY2hpbGROb2RlcyAmJiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBwcmV2aW91cyBib3VuZGFyeVBvaW50XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc1NraXBJbm5lck9mZnNldFxuXHRcdCAqIEByZXR1cm4ge0JvdW5kYXJ5UG9pbnR9XG5cdFx0ICovXG5cdFx0dmFyIHByZXZQb2ludCA9IGZ1bmN0aW9uIChwb2ludCwgaXNTa2lwSW5uZXJPZmZzZXQpIHtcblx0XHRcdHZhciBub2RlLCBvZmZzZXQ7XG5cblx0XHRcdGlmIChwb2ludC5vZmZzZXQgPT09IDApIHtcblx0XHRcdFx0aWYgKGlzRWRpdGFibGUocG9pbnQubm9kZSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG5vZGUgPSBwb2ludC5ub2RlLnBhcmVudE5vZGU7XG5cdFx0XHRcdG9mZnNldCA9IHBvc2l0aW9uKHBvaW50Lm5vZGUpO1xuXHRcdFx0fSBlbHNlIGlmIChoYXNDaGlsZHJlbihwb2ludC5ub2RlKSkge1xuXHRcdFx0XHRub2RlID0gcG9pbnQubm9kZS5jaGlsZE5vZGVzW3BvaW50Lm9mZnNldCAtIDFdO1xuXHRcdFx0XHRvZmZzZXQgPSBub2RlTGVuZ3RoKG5vZGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bm9kZSA9IHBvaW50Lm5vZGU7XG5cdFx0XHRcdG9mZnNldCA9IGlzU2tpcElubmVyT2Zmc2V0ID8gMCA6IHBvaW50Lm9mZnNldCAtIDE7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG5vZGU6IG5vZGUsXG5cdFx0XHRcdG9mZnNldDogb2Zmc2V0XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIG5leHQgYm91bmRhcnlQb2ludFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNTa2lwSW5uZXJPZmZzZXRcblx0XHQgKiBAcmV0dXJuIHtCb3VuZGFyeVBvaW50fVxuXHRcdCAqL1xuXHRcdHZhciBuZXh0UG9pbnQgPSBmdW5jdGlvbiAocG9pbnQsIGlzU2tpcElubmVyT2Zmc2V0KSB7XG5cdFx0XHR2YXIgbm9kZSwgb2Zmc2V0O1xuXG5cdFx0XHRpZiAobm9kZUxlbmd0aChwb2ludC5ub2RlKSA9PT0gcG9pbnQub2Zmc2V0KSB7XG5cdFx0XHRcdGlmIChpc0VkaXRhYmxlKHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRub2RlID0gcG9pbnQubm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0XHRvZmZzZXQgPSBwb3NpdGlvbihwb2ludC5ub2RlKSArIDE7XG5cdFx0XHR9IGVsc2UgaWYgKGhhc0NoaWxkcmVuKHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdG5vZGUgPSBwb2ludC5ub2RlLmNoaWxkTm9kZXNbcG9pbnQub2Zmc2V0XTtcblx0XHRcdFx0b2Zmc2V0ID0gMDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5vZGUgPSBwb2ludC5ub2RlO1xuXHRcdFx0XHRvZmZzZXQgPSBpc1NraXBJbm5lck9mZnNldCA/IG5vZGVMZW5ndGgocG9pbnQubm9kZSkgOiBwb2ludC5vZmZzZXQgKyAxO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRub2RlOiBub2RlLFxuXHRcdFx0XHRvZmZzZXQ6IG9mZnNldFxuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIHBvaW50QSBhbmQgcG9pbnRCIGlzIHNhbWUgb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludEFcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50QlxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzU2FtZVBvaW50ID0gZnVuY3Rpb24gKHBvaW50QSwgcG9pbnRCKSB7XG5cdFx0XHRyZXR1cm4gcG9pbnRBLm5vZGUgPT09IHBvaW50Qi5ub2RlICYmIHBvaW50QS5vZmZzZXQgPT09IHBvaW50Qi5vZmZzZXQ7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgd2hldGhlciBwb2ludCBpcyB2aXNpYmxlIChjYW4gc2V0IGN1cnNvcikgb3Igbm90LlxuXHRcdCAqIFxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc1Zpc2libGVQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuXHRcdFx0aWYgKGlzVGV4dChwb2ludC5ub2RlKSB8fCAhaGFzQ2hpbGRyZW4ocG9pbnQubm9kZSkgfHwgaXNFbXB0eShwb2ludC5ub2RlKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGxlZnROb2RlID0gcG9pbnQubm9kZS5jaGlsZE5vZGVzW3BvaW50Lm9mZnNldCAtIDFdO1xuXHRcdFx0dmFyIHJpZ2h0Tm9kZSA9IHBvaW50Lm5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXRdO1xuXHRcdFx0aWYgKCghbGVmdE5vZGUgfHwgaXNWb2lkKGxlZnROb2RlKSkgJiYgKCFyaWdodE5vZGUgfHwgaXNWb2lkKHJpZ2h0Tm9kZSkpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcHJldlBvaW50VXRpbFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcblx0XHQgKiBAcmV0dXJuIHtCb3VuZGFyeVBvaW50fVxuXHRcdCAqL1xuXHRcdHZhciBwcmV2UG9pbnRVbnRpbCA9IGZ1bmN0aW9uIChwb2ludCwgcHJlZCkge1xuXHRcdFx0d2hpbGUgKHBvaW50KSB7XG5cdFx0XHRcdGlmIChwcmVkKHBvaW50KSkge1xuXHRcdFx0XHRcdHJldHVybiBwb2ludDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHBvaW50ID0gcHJldlBvaW50KHBvaW50KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgbmV4dFBvaW50VW50aWxcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG5cdFx0ICogQHJldHVybiB7Qm91bmRhcnlQb2ludH1cblx0XHQgKi9cblx0XHR2YXIgbmV4dFBvaW50VW50aWwgPSBmdW5jdGlvbiAocG9pbnQsIHByZWQpIHtcblx0XHRcdHdoaWxlIChwb2ludCkge1xuXHRcdFx0XHRpZiAocHJlZChwb2ludCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gcG9pbnQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwb2ludCA9IG5leHRQb2ludChwb2ludCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHdhbGtQb2ludFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBzdGFydFBvaW50XG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBlbmRQb2ludFxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzU2tpcElubmVyT2Zmc2V0XG5cdFx0ICovXG5cdFx0dmFyIHdhbGtQb2ludCA9IGZ1bmN0aW9uIChzdGFydFBvaW50LCBlbmRQb2ludCwgaGFuZGxlciwgaXNTa2lwSW5uZXJPZmZzZXQpIHtcblx0XHRcdHZhciBwb2ludCA9IHN0YXJ0UG9pbnQ7XG5cblx0XHRcdHdoaWxlIChwb2ludCkge1xuXHRcdFx0XHRoYW5kbGVyKHBvaW50KTtcblxuXHRcdFx0XHRpZiAoaXNTYW1lUG9pbnQocG9pbnQsIGVuZFBvaW50KSkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGlzU2tpcE9mZnNldCA9IGlzU2tpcElubmVyT2Zmc2V0ICYmXG5cdFx0XHRcdFx0XHRcdFx0ICAgc3RhcnRQb2ludC5ub2RlICE9PSBwb2ludC5ub2RlICYmXG5cdFx0XHRcdFx0XHRcdFx0ICAgZW5kUG9pbnQubm9kZSAhPT0gcG9pbnQubm9kZTtcblx0XHRcdFx0cG9pbnQgPSBuZXh0UG9pbnQocG9pbnQsIGlzU2tpcE9mZnNldCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgbWFrZU9mZnNldFBhdGhcblx0XHQgKlxuXHRcdCAqIHJldHVybiBvZmZzZXRQYXRoKGFycmF5IG9mIG9mZnNldCkgZnJvbSBhbmNlc3RvclxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBhbmNlc3RvciAtIGFuY2VzdG9yIG5vZGVcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKi9cblx0XHR2YXIgbWFrZU9mZnNldFBhdGggPSBmdW5jdGlvbiAoYW5jZXN0b3IsIG5vZGUpIHtcblx0XHRcdHZhciBhbmNlc3RvcnMgPSBsaXN0QW5jZXN0b3Iobm9kZSwgZnVuYy5lcShhbmNlc3RvcikpO1xuXHRcdFx0cmV0dXJuICQubWFwKGFuY2VzdG9ycywgcG9zaXRpb24pLnJldmVyc2UoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBmcm9tT2Zmc2V0UGF0aFxuXHRcdCAqXG5cdFx0ICogcmV0dXJuIGVsZW1lbnQgZnJvbSBvZmZzZXRQYXRoKGFycmF5IG9mIG9mZnNldClcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gYW5jZXN0b3IgLSBhbmNlc3RvciBub2RlXG5cdFx0ICogQHBhcmFtIHthcnJheX0gb2Zmc2V0cyAtIG9mZnNldFBhdGhcblx0XHQgKi9cblx0XHR2YXIgZnJvbU9mZnNldFBhdGggPSBmdW5jdGlvbiAoYW5jZXN0b3IsIG9mZnNldHMpIHtcblx0XHRcdHZhciBjdXJyZW50ID0gYW5jZXN0b3I7XG5cdFx0XHRmb3IgKHZhciBpID0gMCwgbGVuID0gb2Zmc2V0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRpZiAoY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aCA8PSBvZmZzZXRzW2ldKSB7XG5cdFx0XHRcdFx0Y3VycmVudCA9IGN1cnJlbnQuY2hpbGROb2Rlc1tjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoIC0gMV07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudCA9IGN1cnJlbnQuY2hpbGROb2Rlc1tvZmZzZXRzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGN1cnJlbnQ7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgc3BsaXROb2RlXG5cdFx0ICpcblx0XHQgKiBzcGxpdCBlbGVtZW50IG9yICN0ZXh0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbaXNTa2lwUGFkZGluZ0JsYW5rSFRNTF1cblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByaWdodCBub2RlIG9mIGJvdW5kYXJ5UG9pbnRcblx0XHQgKi9cblx0XHR2YXIgc3BsaXROb2RlID0gZnVuY3Rpb24gKHBvaW50LCBpc1NraXBQYWRkaW5nQmxhbmtIVE1MKSB7XG5cdFx0XHQvLyBzcGxpdCAjdGV4dFxuXHRcdFx0aWYgKGlzVGV4dChwb2ludC5ub2RlKSkge1xuXHRcdFx0XHQvLyBlZGdlIGNhc2Vcblx0XHRcdFx0aWYgKGlzTGVmdEVkZ2VQb2ludChwb2ludCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gcG9pbnQubm9kZTtcblx0XHRcdFx0fSBlbHNlIGlmIChpc1JpZ2h0RWRnZVBvaW50KHBvaW50KSkge1xuXHRcdFx0XHRcdHJldHVybiBwb2ludC5ub2RlLm5leHRTaWJsaW5nO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHBvaW50Lm5vZGUuc3BsaXRUZXh0KHBvaW50Lm9mZnNldCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHNwbGl0IGVsZW1lbnRcblx0XHRcdHZhciBjaGlsZE5vZGUgPSBwb2ludC5ub2RlLmNoaWxkTm9kZXNbcG9pbnQub2Zmc2V0XTtcblx0XHRcdHZhciBjbG9uZSA9IGluc2VydEFmdGVyKHBvaW50Lm5vZGUuY2xvbmVOb2RlKGZhbHNlKSwgcG9pbnQubm9kZSk7XG5cdFx0XHRhcHBlbmRDaGlsZE5vZGVzKGNsb25lLCBsaXN0TmV4dChjaGlsZE5vZGUpKTtcblxuXHRcdFx0aWYgKCFpc1NraXBQYWRkaW5nQmxhbmtIVE1MKSB7XG5cdFx0XHRcdHBhZGRpbmdCbGFua0hUTUwocG9pbnQubm9kZSk7XG5cdFx0XHRcdHBhZGRpbmdCbGFua0hUTUwoY2xvbmUpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gY2xvbmU7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgc3BsaXRUcmVlXG5cdFx0ICpcblx0XHQgKiBzcGxpdCB0cmVlIGJ5IHBvaW50XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IHJvb3QgLSBzcGxpdCByb290XG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzU2tpcFBhZGRpbmdCbGFua0hUTUxdXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gcmlnaHQgbm9kZSBvZiBib3VuZGFyeVBvaW50XG5cdFx0ICovXG5cdFx0dmFyIHNwbGl0VHJlZSA9IGZ1bmN0aW9uIChyb290LCBwb2ludCwgaXNTa2lwUGFkZGluZ0JsYW5rSFRNTCkge1xuXHRcdFx0Ly8gZXgpIFsjdGV4dCwgPHNwYW4+LCA8cD5dXG5cdFx0XHR2YXIgYW5jZXN0b3JzID0gbGlzdEFuY2VzdG9yKHBvaW50Lm5vZGUsIGZ1bmMuZXEocm9vdCkpO1xuXG5cdFx0XHRpZiAoIWFuY2VzdG9ycy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9IGVsc2UgaWYgKGFuY2VzdG9ycy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmV0dXJuIHNwbGl0Tm9kZShwb2ludCwgaXNTa2lwUGFkZGluZ0JsYW5rSFRNTCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhbmNlc3RvcnMucmVkdWNlKGZ1bmN0aW9uIChub2RlLCBwYXJlbnQpIHtcblx0XHRcdFx0dmFyIGNsb25lID0gaW5zZXJ0QWZ0ZXIocGFyZW50LmNsb25lTm9kZShmYWxzZSksIHBhcmVudCk7XG5cblx0XHRcdFx0aWYgKG5vZGUgPT09IHBvaW50Lm5vZGUpIHtcblx0XHRcdFx0XHRub2RlID0gc3BsaXROb2RlKHBvaW50LCBpc1NraXBQYWRkaW5nQmxhbmtIVE1MKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFwcGVuZENoaWxkTm9kZXMoY2xvbmUsIGxpc3ROZXh0KG5vZGUpKTtcblxuXHRcdFx0XHRpZiAoIWlzU2tpcFBhZGRpbmdCbGFua0hUTUwpIHtcblx0XHRcdFx0XHRwYWRkaW5nQmxhbmtIVE1MKHBhcmVudCk7XG5cdFx0XHRcdFx0cGFkZGluZ0JsYW5rSFRNTChjbG9uZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGNsb25lO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHNwbGl0IHBvaW50XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1BvaW50fSBwb2ludFxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbmxpbmVcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dmFyIHNwbGl0UG9pbnQgPSBmdW5jdGlvbiAocG9pbnQsIGlzSW5saW5lKSB7XG5cdFx0XHQvLyBmaW5kIHNwbGl0Um9vdCwgY29udGFpbmVyXG5cdFx0XHQvLyAgLSBpbmxpbmU6IHNwbGl0Um9vdCBpcyBhIGNoaWxkIG9mIHBhcmFncmFwaFxuXHRcdFx0Ly8gIC0gYmxvY2s6IHNwbGl0Um9vdCBpcyBhIGNoaWxkIG9mIGJvZHlDb250YWluZXJcblx0XHRcdHZhciBwcmVkID0gaXNJbmxpbmUgPyBpc1BhcmEgOiBpc0JvZHlDb250YWluZXI7XG5cdFx0XHR2YXIgYW5jZXN0b3JzID0gbGlzdEFuY2VzdG9yKHBvaW50Lm5vZGUsIHByZWQpO1xuXHRcdFx0dmFyIHRvcEFuY2VzdG9yID0gbGlzdC5sYXN0KGFuY2VzdG9ycykgfHwgcG9pbnQubm9kZTtcblxuXHRcdFx0dmFyIHNwbGl0Um9vdCwgY29udGFpbmVyO1xuXHRcdFx0aWYgKHByZWQodG9wQW5jZXN0b3IpKSB7XG5cdFx0XHRcdHNwbGl0Um9vdCA9IGFuY2VzdG9yc1thbmNlc3RvcnMubGVuZ3RoIC0gMl07XG5cdFx0XHRcdGNvbnRhaW5lciA9IHRvcEFuY2VzdG9yO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3BsaXRSb290ID0gdG9wQW5jZXN0b3I7XG5cdFx0XHRcdGNvbnRhaW5lciA9IHNwbGl0Um9vdC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzcGxpdCB3aXRoIHNwbGl0VHJlZVxuXHRcdFx0dmFyIHBpdm90ID0gc3BsaXRSb290ICYmIHNwbGl0VHJlZShzcGxpdFJvb3QsIHBvaW50LCBpc0lubGluZSk7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJpZ2h0Tm9kZTogcGl2b3QsXG5cdFx0XHRcdGNvbnRhaW5lcjogY29udGFpbmVyXG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHR2YXIgY3JlYXRlID0gZnVuY3Rpb24gKG5vZGVOYW1lKSB7XG5cdFx0XHRyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7XG5cdFx0fTtcblxuXHRcdHZhciBjcmVhdGVUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZW1vdmVcblx0XHQgKlxuXHRcdCAqIHJlbW92ZSBub2RlLCAoaXNSZW1vdmVDaGlsZDogcmVtb3ZlIGNoaWxkIG9yIG5vdClcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNSZW1vdmVDaGlsZFxuXHRcdCAqL1xuXHRcdHZhciByZW1vdmUgPSBmdW5jdGlvbiAobm9kZSwgaXNSZW1vdmVDaGlsZCkge1xuXHRcdFx0aWYgKCFub2RlIHx8ICFub2RlLnBhcmVudE5vZGUpIHsgcmV0dXJuOyB9XG5cdFx0XHRpZiAobm9kZS5yZW1vdmVOb2RlKSB7IHJldHVybiBub2RlLnJlbW92ZU5vZGUoaXNSZW1vdmVDaGlsZCk7IH1cblxuXHRcdFx0dmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdGlmICghaXNSZW1vdmVDaGlsZCkge1xuXHRcdFx0XHR2YXIgbm9kZXMgPSBbXTtcblx0XHRcdFx0dmFyIGksIGxlbjtcblx0XHRcdFx0Zm9yIChpID0gMCwgbGVuID0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdFx0bm9kZXMucHVzaChub2RlLmNoaWxkTm9kZXNbaV0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yIChpID0gMCwgbGVuID0gbm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0XHRwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGVzW2ldLCBub2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVtb3ZlV2hpbGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcblx0XHQgKi9cblx0XHR2YXIgcmVtb3ZlV2hpbGUgPSBmdW5jdGlvbiAobm9kZSwgcHJlZCkge1xuXHRcdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdFx0aWYgKGlzRWRpdGFibGUobm9kZSkgfHwgIXByZWQobm9kZSkpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHRcdHJlbW92ZShub2RlKTtcblx0XHRcdFx0bm9kZSA9IHBhcmVudDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZXBsYWNlXG5cdFx0ICpcblx0XHQgKiByZXBsYWNlIG5vZGUgd2l0aCBwcm92aWRlZCBub2RlTmFtZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5vZGVOYW1lXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gLSBuZXcgbm9kZVxuXHRcdCAqL1xuXHRcdHZhciByZXBsYWNlID0gZnVuY3Rpb24gKG5vZGUsIG5vZGVOYW1lKSB7XG5cdFx0XHRpZiAobm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBub2RlTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG5cdFx0XHRcdHJldHVybiBub2RlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbmV3Tm9kZSA9IGNyZWF0ZShub2RlTmFtZSk7XG5cblx0XHRcdGlmIChub2RlLnN0eWxlLmNzc1RleHQpIHtcblx0XHRcdFx0bmV3Tm9kZS5zdHlsZS5jc3NUZXh0ID0gbm9kZS5zdHlsZS5jc3NUZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHRhcHBlbmRDaGlsZE5vZGVzKG5ld05vZGUsIGxpc3QuZnJvbShub2RlLmNoaWxkTm9kZXMpKTtcblx0XHRcdGluc2VydEFmdGVyKG5ld05vZGUsIG5vZGUpO1xuXHRcdFx0cmVtb3ZlKG5vZGUpO1xuXG5cdFx0XHRyZXR1cm4gbmV3Tm9kZTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzVGV4dGFyZWEgPSBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ1RFWFRBUkVBJyk7XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGh0bWxcblx0XHQgKlxuXHRcdCAqIGdldCB0aGUgSFRNTCBjb250ZW50cyBvZiBub2RlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJG5vZGVcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtpc05ld2xpbmVPbkJsb2NrXVxuXHRcdCAqL1xuXHRcdHZhciBodG1sID0gZnVuY3Rpb24gKCRub2RlLCBpc05ld2xpbmVPbkJsb2NrKSB7XG5cdFx0XHR2YXIgbWFya3VwID0gaXNUZXh0YXJlYSgkbm9kZVswXSkgPyAkbm9kZS52YWwoKSA6ICRub2RlLmh0bWwoKTtcblxuXHRcdFx0aWYgKGlzTmV3bGluZU9uQmxvY2spIHtcblx0XHRcdFx0dmFyIHJlZ2V4VGFnID0gLzwoXFwvPykoXFxiKD8hISlbXj5cXHNdKikoLio/KShcXHMqXFwvPz4pL2c7XG5cdFx0XHRcdG1hcmt1cCA9IG1hcmt1cC5yZXBsYWNlKHJlZ2V4VGFnLCBmdW5jdGlvbiAobWF0Y2gsIGVuZFNsYXNoLCBuYW1lKSB7XG5cdFx0XHRcdFx0bmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTtcblx0XHRcdFx0XHR2YXIgaXNFbmRPZklubGluZUNvbnRhaW5lciA9IC9eRElWfF5URHxeVEh8XlB8XkxJfF5IWzEtN10vLnRlc3QobmFtZSkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAhIWVuZFNsYXNoO1xuXHRcdFx0XHRcdHZhciBpc0Jsb2NrTm9kZSA9IC9eQkxPQ0tRVU9URXxeVEFCTEV8XlRCT0RZfF5UUnxeSFJ8XlVMfF5PTC8udGVzdChuYW1lKTtcblxuXHRcdFx0XHRcdHJldHVybiBtYXRjaCArICgoaXNFbmRPZklubGluZUNvbnRhaW5lciB8fCBpc0Jsb2NrTm9kZSkgPyAnXFxuJyA6ICcnKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG1hcmt1cCA9ICQudHJpbShtYXJrdXApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWFya3VwO1xuXHRcdH07XG5cblx0XHR2YXIgdmFsdWUgPSBmdW5jdGlvbiAoJHRleHRhcmVhLCBzdHJpcExpbmVicmVha3MpIHtcblx0XHRcdHZhciB2YWwgPSAkdGV4dGFyZWEudmFsKCk7XG5cdFx0XHRpZiAoc3RyaXBMaW5lYnJlYWtzKSB7XG5cdFx0XHRcdHJldHVybiB2YWwucmVwbGFjZSgvW1xcblxccl0vZywgJycpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbDtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdC8qKiBAcHJvcGVydHkge1N0cmluZ30gTkJTUF9DSEFSICovXG5cdFx0XHROQlNQX0NIQVI6IE5CU1BfQ0hBUixcblx0XHRcdC8qKiBAcHJvcGVydHkge1N0cmluZ30gWkVST19XSURUSF9OQlNQX0NIQVIgKi9cblx0XHRcdFpFUk9fV0lEVEhfTkJTUF9DSEFSOiBaRVJPX1dJRFRIX05CU1BfQ0hBUixcblx0XHRcdC8qKiBAcHJvcGVydHkge1N0cmluZ30gYmxhbmsgKi9cblx0XHRcdGJsYW5rOiBibGFua0hUTUwsXG5cdFx0XHQvKiogQHByb3BlcnR5IHtTdHJpbmd9IGVtcHR5UGFyYSAqL1xuXHRcdFx0ZW1wdHlQYXJhOiAnPHA+JyArIGJsYW5rSFRNTCArICc8L3A+Jyxcblx0XHRcdG1ha2VQcmVkQnlOb2RlTmFtZTogbWFrZVByZWRCeU5vZGVOYW1lLFxuXHRcdFx0aXNFZGl0YWJsZTogaXNFZGl0YWJsZSxcblx0XHRcdGlzQ29udHJvbFNpemluZzogaXNDb250cm9sU2l6aW5nLFxuXHRcdFx0YnVpbGRMYXlvdXRJbmZvOiBidWlsZExheW91dEluZm8sXG5cdFx0XHRtYWtlTGF5b3V0SW5mbzogbWFrZUxheW91dEluZm8sXG5cdFx0XHRpc1RleHQ6IGlzVGV4dCxcblx0XHRcdGlzVm9pZDogaXNWb2lkLFxuXHRcdFx0aXNQYXJhOiBpc1BhcmEsXG5cdFx0XHRpc1B1cmVQYXJhOiBpc1B1cmVQYXJhLFxuXHRcdFx0aXNJbmxpbmU6IGlzSW5saW5lLFxuXHRcdFx0aXNCb2R5SW5saW5lOiBpc0JvZHlJbmxpbmUsXG5cdFx0XHRpc0JvZHk6IGlzQm9keSxcblx0XHRcdGlzUGFyYUlubGluZTogaXNQYXJhSW5saW5lLFxuXHRcdFx0aXNMaXN0OiBpc0xpc3QsXG5cdFx0XHRpc1RhYmxlOiBpc1RhYmxlLFxuXHRcdFx0aXNDZWxsOiBpc0NlbGwsXG5cdFx0XHRpc0Jsb2NrcXVvdGU6IGlzQmxvY2txdW90ZSxcblx0XHRcdGlzQm9keUNvbnRhaW5lcjogaXNCb2R5Q29udGFpbmVyLFxuXHRcdFx0aXNBbmNob3I6IGlzQW5jaG9yLFxuXHRcdFx0aXNEaXY6IG1ha2VQcmVkQnlOb2RlTmFtZSgnRElWJyksXG5cdFx0XHRpc0xpOiBpc0xpLFxuXHRcdFx0aXNCUjogbWFrZVByZWRCeU5vZGVOYW1lKCdCUicpLFxuXHRcdFx0aXNTcGFuOiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ1NQQU4nKSxcblx0XHRcdGlzQjogbWFrZVByZWRCeU5vZGVOYW1lKCdCJyksXG5cdFx0XHRpc1U6IG1ha2VQcmVkQnlOb2RlTmFtZSgnVScpLFxuXHRcdFx0aXNTOiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ1MnKSxcblx0XHRcdGlzSTogbWFrZVByZWRCeU5vZGVOYW1lKCdJJyksXG5cdFx0XHRpc0ltZzogbWFrZVByZWRCeU5vZGVOYW1lKCdJTUcnKSxcblx0XHRcdGlzVGV4dGFyZWE6IGlzVGV4dGFyZWEsXG5cdFx0XHRpc0VtcHR5OiBpc0VtcHR5LFxuXHRcdFx0aXNFbXB0eUFuY2hvcjogZnVuYy5hbmQoaXNBbmNob3IsIGlzRW1wdHkpLFxuXHRcdFx0aXNDbG9zZXN0U2libGluZzogaXNDbG9zZXN0U2libGluZyxcblx0XHRcdHdpdGhDbG9zZXN0U2libGluZ3M6IHdpdGhDbG9zZXN0U2libGluZ3MsXG5cdFx0XHRub2RlTGVuZ3RoOiBub2RlTGVuZ3RoLFxuXHRcdFx0aXNMZWZ0RWRnZVBvaW50OiBpc0xlZnRFZGdlUG9pbnQsXG5cdFx0XHRpc1JpZ2h0RWRnZVBvaW50OiBpc1JpZ2h0RWRnZVBvaW50LFxuXHRcdFx0aXNFZGdlUG9pbnQ6IGlzRWRnZVBvaW50LFxuXHRcdFx0aXNMZWZ0RWRnZU9mOiBpc0xlZnRFZGdlT2YsXG5cdFx0XHRpc1JpZ2h0RWRnZU9mOiBpc1JpZ2h0RWRnZU9mLFxuXHRcdFx0cHJldlBvaW50OiBwcmV2UG9pbnQsXG5cdFx0XHRuZXh0UG9pbnQ6IG5leHRQb2ludCxcblx0XHRcdGlzU2FtZVBvaW50OiBpc1NhbWVQb2ludCxcblx0XHRcdGlzVmlzaWJsZVBvaW50OiBpc1Zpc2libGVQb2ludCxcblx0XHRcdHByZXZQb2ludFVudGlsOiBwcmV2UG9pbnRVbnRpbCxcblx0XHRcdG5leHRQb2ludFVudGlsOiBuZXh0UG9pbnRVbnRpbCxcblx0XHRcdHdhbGtQb2ludDogd2Fsa1BvaW50LFxuXHRcdFx0YW5jZXN0b3I6IGFuY2VzdG9yLFxuXHRcdFx0c2luZ2xlQ2hpbGRBbmNlc3Rvcjogc2luZ2xlQ2hpbGRBbmNlc3Rvcixcblx0XHRcdGxpc3RBbmNlc3RvcjogbGlzdEFuY2VzdG9yLFxuXHRcdFx0bGFzdEFuY2VzdG9yOiBsYXN0QW5jZXN0b3IsXG5cdFx0XHRsaXN0TmV4dDogbGlzdE5leHQsXG5cdFx0XHRsaXN0UHJldjogbGlzdFByZXYsXG5cdFx0XHRsaXN0RGVzY2VuZGFudDogbGlzdERlc2NlbmRhbnQsXG5cdFx0XHRjb21tb25BbmNlc3RvcjogY29tbW9uQW5jZXN0b3IsXG5cdFx0XHR3cmFwOiB3cmFwLFxuXHRcdFx0aW5zZXJ0QWZ0ZXI6IGluc2VydEFmdGVyLFxuXHRcdFx0YXBwZW5kQ2hpbGROb2RlczogYXBwZW5kQ2hpbGROb2Rlcyxcblx0XHRcdHBvc2l0aW9uOiBwb3NpdGlvbixcblx0XHRcdGhhc0NoaWxkcmVuOiBoYXNDaGlsZHJlbixcblx0XHRcdG1ha2VPZmZzZXRQYXRoOiBtYWtlT2Zmc2V0UGF0aCxcblx0XHRcdGZyb21PZmZzZXRQYXRoOiBmcm9tT2Zmc2V0UGF0aCxcblx0XHRcdHNwbGl0VHJlZTogc3BsaXRUcmVlLFxuXHRcdFx0c3BsaXRQb2ludDogc3BsaXRQb2ludCxcblx0XHRcdGNyZWF0ZTogY3JlYXRlLFxuXHRcdFx0Y3JlYXRlVGV4dDogY3JlYXRlVGV4dCxcblx0XHRcdHJlbW92ZTogcmVtb3ZlLFxuXHRcdFx0cmVtb3ZlV2hpbGU6IHJlbW92ZVdoaWxlLFxuXHRcdFx0cmVwbGFjZTogcmVwbGFjZSxcblx0XHRcdGh0bWw6IGh0bWwsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9O1xuXHR9KSgpO1xuXG5cblx0dmFyIHJhbmdlID0gKGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybiBib3VuZGFyeVBvaW50IGZyb20gVGV4dFJhbmdlLCBpbnNwaXJlZCBieSBBbmR5IE5hJ3MgSHVza3lSYW5nZS5qc1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtUZXh0UmFuZ2V9IHRleHRSYW5nZVxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNTdGFydFxuXHRcdCAqIEByZXR1cm4ge0JvdW5kYXJ5UG9pbnR9XG5cdFx0ICpcblx0XHQgKiBAc2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9tczUzNTg3Mih2PXZzLjg1KS5hc3B4XG5cdFx0ICovXG5cdFx0dmFyIHRleHRSYW5nZVRvUG9pbnQgPSBmdW5jdGlvbiAodGV4dFJhbmdlLCBpc1N0YXJ0KSB7XG5cdFx0XHR2YXIgY29udGFpbmVyID0gdGV4dFJhbmdlLnBhcmVudEVsZW1lbnQoKSwgb2Zmc2V0O1xuXG5cdFx0XHR2YXIgdGVzdGVyID0gZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKSwgcHJldkNvbnRhaW5lcjtcblx0XHRcdHZhciBjaGlsZE5vZGVzID0gbGlzdC5mcm9tKGNvbnRhaW5lci5jaGlsZE5vZGVzKTtcblx0XHRcdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgY2hpbGROb2Rlcy5sZW5ndGg7IG9mZnNldCsrKSB7XG5cdFx0XHRcdGlmIChkb20uaXNUZXh0KGNoaWxkTm9kZXNbb2Zmc2V0XSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0ZXN0ZXIubW92ZVRvRWxlbWVudFRleHQoY2hpbGROb2Rlc1tvZmZzZXRdKTtcblx0XHRcdFx0aWYgKHRlc3Rlci5jb21wYXJlRW5kUG9pbnRzKCdTdGFydFRvU3RhcnQnLCB0ZXh0UmFuZ2UpID49IDApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRwcmV2Q29udGFpbmVyID0gY2hpbGROb2Rlc1tvZmZzZXRdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob2Zmc2V0ICE9PSAwICYmIGRvbS5pc1RleHQoY2hpbGROb2Rlc1tvZmZzZXQgLSAxXSkpIHtcblx0XHRcdFx0dmFyIHRleHRSYW5nZVN0YXJ0ID0gZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKSwgY3VyVGV4dE5vZGUgPSBudWxsO1xuXHRcdFx0XHR0ZXh0UmFuZ2VTdGFydC5tb3ZlVG9FbGVtZW50VGV4dChwcmV2Q29udGFpbmVyIHx8IGNvbnRhaW5lcik7XG5cdFx0XHRcdHRleHRSYW5nZVN0YXJ0LmNvbGxhcHNlKCFwcmV2Q29udGFpbmVyKTtcblx0XHRcdFx0Y3VyVGV4dE5vZGUgPSBwcmV2Q29udGFpbmVyID8gcHJldkNvbnRhaW5lci5uZXh0U2libGluZyA6IGNvbnRhaW5lci5maXJzdENoaWxkO1xuXG5cdFx0XHRcdHZhciBwb2ludFRlc3RlciA9IHRleHRSYW5nZS5kdXBsaWNhdGUoKTtcblx0XHRcdFx0cG9pbnRUZXN0ZXIuc2V0RW5kUG9pbnQoJ1N0YXJ0VG9TdGFydCcsIHRleHRSYW5nZVN0YXJ0KTtcblx0XHRcdFx0dmFyIHRleHRDb3VudCA9IHBvaW50VGVzdGVyLnRleHQucmVwbGFjZSgvW1xcclxcbl0vZywgJycpLmxlbmd0aDtcblxuXHRcdFx0XHR3aGlsZSAodGV4dENvdW50ID4gY3VyVGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aCAmJiBjdXJUZXh0Tm9kZS5uZXh0U2libGluZykge1xuXHRcdFx0XHRcdHRleHRDb3VudCAtPSBjdXJUZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuXHRcdFx0XHRcdGN1clRleHROb2RlID0gY3VyVGV4dE5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdFx0XHRcdHZhciBkdW1teSA9IGN1clRleHROb2RlLm5vZGVWYWx1ZTsgLy8gZW5mb3JjZSBJRSB0byByZS1yZWZlcmVuY2UgY3VyVGV4dE5vZGUsIGhhY2tcblx0XHRcdFx0LyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuXHRcdFx0XHRpZiAoaXNTdGFydCAmJiBjdXJUZXh0Tm9kZS5uZXh0U2libGluZyAmJiBkb20uaXNUZXh0KGN1clRleHROb2RlLm5leHRTaWJsaW5nKSAmJlxuXHRcdFx0XHRcdHRleHRDb3VudCA9PT0gY3VyVGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aCkge1xuXHRcdFx0XHRcdHRleHRDb3VudCAtPSBjdXJUZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuXHRcdFx0XHRcdGN1clRleHROb2RlID0gY3VyVGV4dE5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb250YWluZXIgPSBjdXJUZXh0Tm9kZTtcblx0XHRcdFx0b2Zmc2V0ID0gdGV4dENvdW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjb250OiBjb250YWluZXIsXG5cdFx0XHRcdG9mZnNldDogb2Zmc2V0XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm4gVGV4dFJhbmdlIGZyb20gYm91bmRhcnkgcG9pbnQgKGluc3BpcmVkIGJ5IGdvb2dsZSBjbG9zdXJlLWxpYnJhcnkpXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEByZXR1cm4ge1RleHRSYW5nZX1cblx0XHQgKi9cblx0XHR2YXIgcG9pbnRUb1RleHRSYW5nZSA9IGZ1bmN0aW9uIChwb2ludCkge1xuXHRcdFx0dmFyIHRleHRSYW5nZUluZm8gPSBmdW5jdGlvbiAoY29udGFpbmVyLCBvZmZzZXQpIHtcblx0XHRcdFx0dmFyIG5vZGUsIGlzQ29sbGFwc2VUb1N0YXJ0O1xuXG5cdFx0XHRcdGlmIChkb20uaXNUZXh0KGNvbnRhaW5lcikpIHtcblx0XHRcdFx0XHR2YXIgcHJldlRleHROb2RlcyA9IGRvbS5saXN0UHJldihjb250YWluZXIsIGZ1bmMubm90KGRvbS5pc1RleHQpKTtcblx0XHRcdFx0XHR2YXIgcHJldkNvbnRhaW5lciA9IGxpc3QubGFzdChwcmV2VGV4dE5vZGVzKS5wcmV2aW91c1NpYmxpbmc7XG5cdFx0XHRcdFx0bm9kZSA9IHByZXZDb250YWluZXIgfHwgY29udGFpbmVyLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0b2Zmc2V0ICs9IGxpc3Quc3VtKGxpc3QudGFpbChwcmV2VGV4dE5vZGVzKSwgZG9tLm5vZGVMZW5ndGgpO1xuXHRcdFx0XHRcdGlzQ29sbGFwc2VUb1N0YXJ0ID0gIXByZXZDb250YWluZXI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bm9kZSA9IGNvbnRhaW5lci5jaGlsZE5vZGVzW29mZnNldF0gfHwgY29udGFpbmVyO1xuXHRcdFx0XHRcdGlmIChkb20uaXNUZXh0KG5vZGUpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGV4dFJhbmdlSW5mbyhub2RlLCAwKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRvZmZzZXQgPSAwO1xuXHRcdFx0XHRcdGlzQ29sbGFwc2VUb1N0YXJ0ID0gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG5vZGU6IG5vZGUsXG5cdFx0XHRcdFx0Y29sbGFwc2VUb1N0YXJ0OiBpc0NvbGxhcHNlVG9TdGFydCxcblx0XHRcdFx0XHRvZmZzZXQ6IG9mZnNldFxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdFx0dmFyIHRleHRSYW5nZSA9IGRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7XG5cdFx0XHR2YXIgaW5mbyA9IHRleHRSYW5nZUluZm8ocG9pbnQubm9kZSwgcG9pbnQub2Zmc2V0KTtcblxuXHRcdFx0dGV4dFJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KGluZm8ubm9kZSk7XG5cdFx0XHR0ZXh0UmFuZ2UuY29sbGFwc2UoaW5mby5jb2xsYXBzZVRvU3RhcnQpO1xuXHRcdFx0dGV4dFJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgaW5mby5vZmZzZXQpO1xuXHRcdFx0cmV0dXJuIHRleHRSYW5nZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogV3JhcHBlZCBSYW5nZVxuXHRcdCAqXG5cdFx0ICogQGNvbnN0cnVjdG9yXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBzYyAtIHN0YXJ0IGNvbnRhaW5lclxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBzbyAtIHN0YXJ0IG9mZnNldFxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gZWMgLSBlbmQgY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IGVvIC0gZW5kIG9mZnNldFxuXHRcdCAqL1xuXHRcdHZhciBXcmFwcGVkUmFuZ2UgPSBmdW5jdGlvbiAoc2MsIHNvLCBlYywgZW8pIHtcblx0XHRcdHRoaXMuc2MgPSBzYztcblx0XHRcdHRoaXMuc28gPSBzbztcblx0XHRcdHRoaXMuZWMgPSBlYztcblx0XHRcdHRoaXMuZW8gPSBlbztcblxuXHRcdFx0Ly8gbmF0aXZlUmFuZ2U6IGdldCBuYXRpdmVSYW5nZSBmcm9tIHNjLCBzbywgZWMsIGVvXG5cdFx0XHR2YXIgbmF0aXZlUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmIChhZ2VudC5pc1czQ1JhbmdlU3VwcG9ydCkge1xuXHRcdFx0XHRcdHZhciB3M2NSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cdFx0XHRcdFx0dzNjUmFuZ2Uuc2V0U3RhcnQoc2MsIHNvKTtcblx0XHRcdFx0XHR3M2NSYW5nZS5zZXRFbmQoZWMsIGVvKTtcblxuXHRcdFx0XHRcdHJldHVybiB3M2NSYW5nZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgdGV4dFJhbmdlID0gcG9pbnRUb1RleHRSYW5nZSh7XG5cdFx0XHRcdFx0XHRub2RlOiBzYyxcblx0XHRcdFx0XHRcdG9mZnNldDogc29cblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRleHRSYW5nZS5zZXRFbmRQb2ludCgnRW5kVG9FbmQnLCBwb2ludFRvVGV4dFJhbmdlKHtcblx0XHRcdFx0XHRcdG5vZGU6IGVjLFxuXHRcdFx0XHRcdFx0b2Zmc2V0OiBlb1xuXHRcdFx0XHRcdH0pKTtcblxuXHRcdFx0XHRcdHJldHVybiB0ZXh0UmFuZ2U7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdHRoaXMuZ2V0UG9pbnRzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHNjOiBzYyxcblx0XHRcdFx0XHRzbzogc28sXG5cdFx0XHRcdFx0ZWM6IGVjLFxuXHRcdFx0XHRcdGVvOiBlb1xuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5nZXRTdGFydFBvaW50ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG5vZGU6IHNjLFxuXHRcdFx0XHRcdG9mZnNldDogc29cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuZ2V0RW5kUG9pbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bm9kZTogZWMsXG5cdFx0XHRcdFx0b2Zmc2V0OiBlb1xuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBzZWxlY3QgdXBkYXRlIHZpc2libGUgcmFuZ2Vcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5zZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBuYXRpdmVSbmcgPSBuYXRpdmVSYW5nZSgpO1xuXHRcdFx0XHRpZiAoYWdlbnQuaXNXM0NSYW5nZVN1cHBvcnQpIHtcblx0XHRcdFx0XHR2YXIgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRcdFx0aWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZWxlY3Rpb24uYWRkUmFuZ2UobmF0aXZlUm5nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRuYXRpdmVSbmcuc2VsZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdFx0XHQgKiBAcmV0dXJuIHtCb3VuZGFyeVBvaW50fVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dmFyIGdldFZpc2libGVQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuXHRcdFx0XHRcdGlmICghZG9tLmlzVmlzaWJsZVBvaW50KHBvaW50KSkge1xuXHRcdFx0XHRcdFx0aWYgKGRvbS5pc0xlZnRFZGdlUG9pbnQocG9pbnQpKSB7XG5cdFx0XHRcdFx0XHRcdHBvaW50ID0gZG9tLm5leHRQb2ludFVudGlsKHBvaW50LCBkb20uaXNWaXNpYmxlUG9pbnQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cG9pbnQgPSBkb20ucHJldlBvaW50VW50aWwocG9pbnQsIGRvbS5pc1Zpc2libGVQb2ludCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBwb2ludDtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHR2YXIgc3RhcnRQb2ludCA9IGdldFZpc2libGVQb2ludCh0aGlzLmdldFN0YXJ0UG9pbnQoKSk7XG5cdFx0XHRcdHZhciBlbmRQb2ludCA9IGdldFZpc2libGVQb2ludCh0aGlzLmdldEVuZFBvaW50KCkpO1xuXG5cdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKFxuXHRcdFx0XHQgIHN0YXJ0UG9pbnQubm9kZSxcblx0XHRcdFx0ICBzdGFydFBvaW50Lm9mZnNldCxcblx0XHRcdFx0ICBlbmRQb2ludC5ub2RlLFxuXHRcdFx0XHQgIGVuZFBvaW50Lm9mZnNldFxuXHRcdFx0XHQpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiByZXR1cm5zIG1hdGNoZWQgbm9kZXMgb24gcmFuZ2Vcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZF0gLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cblx0XHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW5jbHVkZUFuY2VzdG9yXVxuXHRcdFx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5mdWxseUNvbnRhaW5zXVxuXHRcdFx0ICogQHJldHVybiB7Tm9kZVtdfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLm5vZGVzID0gZnVuY3Rpb24gKHByZWQsIG9wdGlvbnMpIHtcblx0XHRcdFx0cHJlZCA9IHByZWQgfHwgZnVuYy5vaztcblxuXHRcdFx0XHR2YXIgaW5jbHVkZUFuY2VzdG9yID0gb3B0aW9ucyAmJiBvcHRpb25zLmluY2x1ZGVBbmNlc3Rvcjtcblx0XHRcdFx0dmFyIGZ1bGx5Q29udGFpbnMgPSBvcHRpb25zICYmIG9wdGlvbnMuZnVsbHlDb250YWlucztcblxuXHRcdFx0XHQvLyBUT0RPIGNvbXBhcmUgcG9pbnRzIGFuZCBzb3J0XG5cdFx0XHRcdHZhciBzdGFydFBvaW50ID0gdGhpcy5nZXRTdGFydFBvaW50KCk7XG5cdFx0XHRcdHZhciBlbmRQb2ludCA9IHRoaXMuZ2V0RW5kUG9pbnQoKTtcblxuXHRcdFx0XHR2YXIgbm9kZXMgPSBbXTtcblx0XHRcdFx0dmFyIGxlZnRFZGdlTm9kZXMgPSBbXTtcblxuXHRcdFx0XHRkb20ud2Fsa1BvaW50KHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBmdW5jdGlvbiAocG9pbnQpIHtcblx0XHRcdFx0XHRpZiAoZG9tLmlzRWRpdGFibGUocG9pbnQubm9kZSkpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgbm9kZTtcblx0XHRcdFx0XHRpZiAoZnVsbHlDb250YWlucykge1xuXHRcdFx0XHRcdFx0aWYgKGRvbS5pc0xlZnRFZGdlUG9pbnQocG9pbnQpKSB7XG5cdFx0XHRcdFx0XHRcdGxlZnRFZGdlTm9kZXMucHVzaChwb2ludC5ub2RlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChkb20uaXNSaWdodEVkZ2VQb2ludChwb2ludCkgJiYgbGlzdC5jb250YWlucyhsZWZ0RWRnZU5vZGVzLCBwb2ludC5ub2RlKSkge1xuXHRcdFx0XHRcdFx0XHRub2RlID0gcG9pbnQubm9kZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGluY2x1ZGVBbmNlc3Rvcikge1xuXHRcdFx0XHRcdFx0bm9kZSA9IGRvbS5hbmNlc3Rvcihwb2ludC5ub2RlLCBwcmVkKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bm9kZSA9IHBvaW50Lm5vZGU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG5vZGUgJiYgcHJlZChub2RlKSkge1xuXHRcdFx0XHRcdFx0bm9kZXMucHVzaChub2RlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIHRydWUpO1xuXG5cdFx0XHRcdHJldHVybiBsaXN0LnVuaXF1ZShub2Rlcyk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHJldHVybnMgY29tbW9uQW5jZXN0b3Igb2YgcmFuZ2Vcblx0XHRcdCAqIEByZXR1cm4ge0VsZW1lbnR9IC0gY29tbW9uQW5jZXN0b3Jcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5jb21tb25BbmNlc3RvciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIGRvbS5jb21tb25BbmNlc3RvcihzYywgZWMpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiByZXR1cm5zIGV4cGFuZGVkIHJhbmdlIGJ5IHByZWRcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuZXhwYW5kID0gZnVuY3Rpb24gKHByZWQpIHtcblx0XHRcdFx0dmFyIHN0YXJ0QW5jZXN0b3IgPSBkb20uYW5jZXN0b3Ioc2MsIHByZWQpO1xuXHRcdFx0XHR2YXIgZW5kQW5jZXN0b3IgPSBkb20uYW5jZXN0b3IoZWMsIHByZWQpO1xuXG5cdFx0XHRcdGlmICghc3RhcnRBbmNlc3RvciAmJiAhZW5kQW5jZXN0b3IpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShzYywgc28sIGVjLCBlbyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgYm91bmRhcnlQb2ludHMgPSB0aGlzLmdldFBvaW50cygpO1xuXG5cdFx0XHRcdGlmIChzdGFydEFuY2VzdG9yKSB7XG5cdFx0XHRcdFx0Ym91bmRhcnlQb2ludHMuc2MgPSBzdGFydEFuY2VzdG9yO1xuXHRcdFx0XHRcdGJvdW5kYXJ5UG9pbnRzLnNvID0gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChlbmRBbmNlc3Rvcikge1xuXHRcdFx0XHRcdGJvdW5kYXJ5UG9pbnRzLmVjID0gZW5kQW5jZXN0b3I7XG5cdFx0XHRcdFx0Ym91bmRhcnlQb2ludHMuZW8gPSBkb20ubm9kZUxlbmd0aChlbmRBbmNlc3Rvcik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShcblx0XHRcdFx0ICBib3VuZGFyeVBvaW50cy5zYyxcblx0XHRcdFx0ICBib3VuZGFyeVBvaW50cy5zbyxcblx0XHRcdFx0ICBib3VuZGFyeVBvaW50cy5lYyxcblx0XHRcdFx0ICBib3VuZGFyeVBvaW50cy5lb1xuXHRcdFx0XHQpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzQ29sbGFwc2VUb1N0YXJ0XG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuY29sbGFwc2UgPSBmdW5jdGlvbiAoaXNDb2xsYXBzZVRvU3RhcnQpIHtcblx0XHRcdFx0aWYgKGlzQ29sbGFwc2VUb1N0YXJ0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2Uoc2MsIHNvLCBzYywgc28pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKGVjLCBlbywgZWMsIGVvKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBzcGxpdFRleHQgb24gcmFuZ2Vcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5zcGxpdFRleHQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBpc1NhbWVDb250YWluZXIgPSBzYyA9PT0gZWM7XG5cdFx0XHRcdHZhciBib3VuZGFyeVBvaW50cyA9IHRoaXMuZ2V0UG9pbnRzKCk7XG5cblx0XHRcdFx0aWYgKGRvbS5pc1RleHQoZWMpICYmICFkb20uaXNFZGdlUG9pbnQodGhpcy5nZXRFbmRQb2ludCgpKSkge1xuXHRcdFx0XHRcdGVjLnNwbGl0VGV4dChlbyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZG9tLmlzVGV4dChzYykgJiYgIWRvbS5pc0VkZ2VQb2ludCh0aGlzLmdldFN0YXJ0UG9pbnQoKSkpIHtcblx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5zYyA9IHNjLnNwbGl0VGV4dChzbyk7XG5cdFx0XHRcdFx0Ym91bmRhcnlQb2ludHMuc28gPSAwO1xuXG5cdFx0XHRcdFx0aWYgKGlzU2FtZUNvbnRhaW5lcikge1xuXHRcdFx0XHRcdFx0Ym91bmRhcnlQb2ludHMuZWMgPSBib3VuZGFyeVBvaW50cy5zYztcblx0XHRcdFx0XHRcdGJvdW5kYXJ5UG9pbnRzLmVvID0gZW8gLSBzbztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShcblx0XHRcdFx0ICBib3VuZGFyeVBvaW50cy5zYyxcblx0XHRcdFx0ICBib3VuZGFyeVBvaW50cy5zbyxcblx0XHRcdFx0ICBib3VuZGFyeVBvaW50cy5lYyxcblx0XHRcdFx0ICBib3VuZGFyeVBvaW50cy5lb1xuXHRcdFx0XHQpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBkZWxldGUgY29udGVudHMgb24gcmFuZ2Vcblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5kZWxldGVDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKHRoaXMuaXNDb2xsYXBzZWQoKSkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHJuZyA9IHRoaXMuc3BsaXRUZXh0KCk7XG5cdFx0XHRcdHZhciBub2RlcyA9IHJuZy5ub2RlcyhudWxsLCB7XG5cdFx0XHRcdFx0ZnVsbHlDb250YWluczogdHJ1ZVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyBmaW5kIG5ldyBjdXJzb3IgcG9pbnRcblx0XHRcdFx0dmFyIHBvaW50ID0gZG9tLnByZXZQb2ludFVudGlsKHJuZy5nZXRTdGFydFBvaW50KCksIGZ1bmN0aW9uIChwb2ludCkge1xuXHRcdFx0XHRcdHJldHVybiAhbGlzdC5jb250YWlucyhub2RlcywgcG9pbnQubm9kZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHZhciBlbXB0eVBhcmVudHMgPSBbXTtcblx0XHRcdFx0JC5lYWNoKG5vZGVzLCBmdW5jdGlvbiAoaWR4LCBub2RlKSB7XG5cdFx0XHRcdFx0Ly8gZmluZCBlbXB0eSBwYXJlbnRzXG5cdFx0XHRcdFx0dmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRpZiAocG9pbnQubm9kZSAhPT0gcGFyZW50ICYmIGRvbS5ub2RlTGVuZ3RoKHBhcmVudCkgPT09IDEpIHtcblx0XHRcdFx0XHRcdGVtcHR5UGFyZW50cy5wdXNoKHBhcmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRvbS5yZW1vdmUobm9kZSwgZmFsc2UpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyByZW1vdmUgZW1wdHkgcGFyZW50c1xuXHRcdFx0XHQkLmVhY2goZW1wdHlQYXJlbnRzLCBmdW5jdGlvbiAoaWR4LCBub2RlKSB7XG5cdFx0XHRcdFx0ZG9tLnJlbW92ZShub2RlLCBmYWxzZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKFxuXHRcdFx0XHQgIHBvaW50Lm5vZGUsXG5cdFx0XHRcdCAgcG9pbnQub2Zmc2V0LFxuXHRcdFx0XHQgIHBvaW50Lm5vZGUsXG5cdFx0XHRcdCAgcG9pbnQub2Zmc2V0XG5cdFx0XHRcdCkubm9ybWFsaXplKCk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIG1ha2VJc09uOiByZXR1cm4gaXNPbihwcmVkKSBmdW5jdGlvblxuXHRcdFx0ICovXG5cdFx0XHR2YXIgbWFrZUlzT24gPSBmdW5jdGlvbiAocHJlZCkge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHZhciBhbmNlc3RvciA9IGRvbS5hbmNlc3RvcihzYywgcHJlZCk7XG5cdFx0XHRcdFx0cmV0dXJuICEhYW5jZXN0b3IgJiYgKGFuY2VzdG9yID09PSBkb20uYW5jZXN0b3IoZWMsIHByZWQpKTtcblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHRcdC8vIGlzT25FZGl0YWJsZToganVkZ2Ugd2hldGhlciByYW5nZSBpcyBvbiBlZGl0YWJsZSBvciBub3Rcblx0XHRcdHRoaXMuaXNPbkVkaXRhYmxlID0gbWFrZUlzT24oZG9tLmlzRWRpdGFibGUpO1xuXHRcdFx0Ly8gaXNPbkxpc3Q6IGp1ZGdlIHdoZXRoZXIgcmFuZ2UgaXMgb24gbGlzdCBub2RlIG9yIG5vdFxuXHRcdFx0dGhpcy5pc09uTGlzdCA9IG1ha2VJc09uKGRvbS5pc0xpc3QpO1xuXHRcdFx0Ly8gaXNPbkFuY2hvcjoganVkZ2Ugd2hldGhlciByYW5nZSBpcyBvbiBhbmNob3Igbm9kZSBvciBub3Rcblx0XHRcdHRoaXMuaXNPbkFuY2hvciA9IG1ha2VJc09uKGRvbS5pc0FuY2hvcik7XG5cdFx0XHQvLyBpc09uQW5jaG9yOiBqdWRnZSB3aGV0aGVyIHJhbmdlIGlzIG9uIGNlbGwgbm9kZSBvciBub3Rcblx0XHRcdHRoaXMuaXNPbkNlbGwgPSBtYWtlSXNPbihkb20uaXNDZWxsKTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG5cdFx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmlzTGVmdEVkZ2VPZiA9IGZ1bmN0aW9uIChwcmVkKSB7XG5cdFx0XHRcdGlmICghZG9tLmlzTGVmdEVkZ2VQb2ludCh0aGlzLmdldFN0YXJ0UG9pbnQoKSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgbm9kZSA9IGRvbS5hbmNlc3Rvcih0aGlzLnNjLCBwcmVkKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgZG9tLmlzTGVmdEVkZ2VPZih0aGlzLnNjLCBub2RlKTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogcmV0dXJucyB3aGV0aGVyIHJhbmdlIHdhcyBjb2xsYXBzZWQgb3Igbm90XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuaXNDb2xsYXBzZWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzYyA9PT0gZWMgJiYgc28gPT09IGVvO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiB3cmFwIGlubGluZSBub2RlcyB3aGljaCBjaGlsZHJlbiBvZiBib2R5IHdpdGggcGFyYWdyYXBoXG5cdFx0XHQgKlxuXHRcdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLndyYXBCb2R5SW5saW5lV2l0aFBhcmEgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmIChkb20uaXNCb2R5Q29udGFpbmVyKHNjKSAmJiBkb20uaXNFbXB0eShzYykpIHtcblx0XHRcdFx0XHRzYy5pbm5lckhUTUwgPSBkb20uZW1wdHlQYXJhO1xuXHRcdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKHNjLmZpcnN0Q2hpbGQsIDAsIHNjLmZpcnN0Q2hpbGQsIDApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRvbS5pc1BhcmFJbmxpbmUoc2MpIHx8IGRvbS5pc1BhcmEoc2MpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBmaW5kIGlubGluZSB0b3AgYW5jZXN0b3Jcblx0XHRcdFx0dmFyIHRvcEFuY2VzdG9yO1xuXHRcdFx0XHRpZiAoZG9tLmlzSW5saW5lKHNjKSkge1xuXHRcdFx0XHRcdHZhciBhbmNlc3RvcnMgPSBkb20ubGlzdEFuY2VzdG9yKHNjLCBmdW5jLm5vdChkb20uaXNJbmxpbmUpKTtcblx0XHRcdFx0XHR0b3BBbmNlc3RvciA9IGxpc3QubGFzdChhbmNlc3RvcnMpO1xuXHRcdFx0XHRcdGlmICghZG9tLmlzSW5saW5lKHRvcEFuY2VzdG9yKSkge1xuXHRcdFx0XHRcdFx0dG9wQW5jZXN0b3IgPSBhbmNlc3RvcnNbYW5jZXN0b3JzLmxlbmd0aCAtIDJdIHx8IHNjLmNoaWxkTm9kZXNbc29dO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0b3BBbmNlc3RvciA9IHNjLmNoaWxkTm9kZXNbc28gPiAwID8gc28gLSAxIDogMF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBzaWJsaW5ncyBub3QgaW4gcGFyYWdyYXBoXG5cdFx0XHRcdHZhciBpbmxpbmVTaWJsaW5ncyA9IGRvbS5saXN0UHJldih0b3BBbmNlc3RvciwgZG9tLmlzUGFyYUlubGluZSkucmV2ZXJzZSgpO1xuXHRcdFx0XHRpbmxpbmVTaWJsaW5ncyA9IGlubGluZVNpYmxpbmdzLmNvbmNhdChkb20ubGlzdE5leHQodG9wQW5jZXN0b3IubmV4dFNpYmxpbmcsIGRvbS5pc1BhcmFJbmxpbmUpKTtcblxuXHRcdFx0XHQvLyB3cmFwIHdpdGggcGFyYWdyYXBoXG5cdFx0XHRcdGlmIChpbmxpbmVTaWJsaW5ncy5sZW5ndGgpIHtcblx0XHRcdFx0XHR2YXIgcGFyYSA9IGRvbS53cmFwKGxpc3QuaGVhZChpbmxpbmVTaWJsaW5ncyksICdwJyk7XG5cdFx0XHRcdFx0ZG9tLmFwcGVuZENoaWxkTm9kZXMocGFyYSwgbGlzdC50YWlsKGlubGluZVNpYmxpbmdzKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogaW5zZXJ0IG5vZGUgYXQgY3VycmVudCBjdXJzb3Jcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHRcdCAqIEByZXR1cm4ge05vZGV9XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuaW5zZXJ0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdHZhciBybmcgPSB0aGlzLndyYXBCb2R5SW5saW5lV2l0aFBhcmEoKS5kZWxldGVDb250ZW50cygpO1xuXHRcdFx0XHR2YXIgaW5mbyA9IGRvbS5zcGxpdFBvaW50KHJuZy5nZXRTdGFydFBvaW50KCksIGRvbS5pc0lubGluZShub2RlKSk7XG5cblx0XHRcdFx0aWYgKGluZm8ucmlnaHROb2RlKSB7XG5cdFx0XHRcdFx0aW5mby5yaWdodE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgaW5mby5yaWdodE5vZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGluZm8uY29udGFpbmVyLmFwcGVuZENoaWxkKG5vZGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG5vZGU7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHJldHVybnMgdGV4dCBpbiByYW5nZVxuXHRcdFx0ICpcblx0XHRcdCAqIEByZXR1cm4ge1N0cmluZ31cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIG5hdGl2ZVJuZyA9IG5hdGl2ZVJhbmdlKCk7XG5cdFx0XHRcdHJldHVybiBhZ2VudC5pc1czQ1JhbmdlU3VwcG9ydCA/IG5hdGl2ZVJuZy50b1N0cmluZygpIDogbmF0aXZlUm5nLnRleHQ7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIGNyZWF0ZSBvZmZzZXRQYXRoIGJvb2ttYXJrXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtOb2RlfSBlZGl0YWJsZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmJvb2ttYXJrID0gZnVuY3Rpb24gKGVkaXRhYmxlKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0czoge1xuXHRcdFx0XHRcdFx0cGF0aDogZG9tLm1ha2VPZmZzZXRQYXRoKGVkaXRhYmxlLCBzYyksXG5cdFx0XHRcdFx0XHRvZmZzZXQ6IHNvXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlOiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBkb20ubWFrZU9mZnNldFBhdGgoZWRpdGFibGUsIGVjKSxcblx0XHRcdFx0XHRcdG9mZnNldDogZW9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIGNyZWF0ZSBvZmZzZXRQYXRoIGJvb2ttYXJrIGJhc2Ugb24gcGFyYWdyYXBoXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtOb2RlW119IHBhcmFzXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMucGFyYUJvb2ttYXJrID0gZnVuY3Rpb24gKHBhcmFzKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0czoge1xuXHRcdFx0XHRcdFx0cGF0aDogbGlzdC50YWlsKGRvbS5tYWtlT2Zmc2V0UGF0aChsaXN0LmhlYWQocGFyYXMpLCBzYykpLFxuXHRcdFx0XHRcdFx0b2Zmc2V0OiBzb1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZToge1xuXHRcdFx0XHRcdFx0cGF0aDogbGlzdC50YWlsKGRvbS5tYWtlT2Zmc2V0UGF0aChsaXN0Lmxhc3QocGFyYXMpLCBlYykpLFxuXHRcdFx0XHRcdFx0b2Zmc2V0OiBlb1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogZ2V0Q2xpZW50UmVjdHNcblx0XHRcdCAqIEByZXR1cm4ge1JlY3RbXX1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5nZXRDbGllbnRSZWN0cyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIG5hdGl2ZVJuZyA9IG5hdGl2ZVJhbmdlKCk7XG5cdFx0XHRcdHJldHVybiBuYXRpdmVSbmcuZ2V0Q2xpZW50UmVjdHMoKTtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBjbGFzcyBjb3JlLnJhbmdlXG5cdFx0ICpcblx0XHQgKiBEYXRhIHN0cnVjdHVyZVxuXHRcdCAqICAqIEJvdW5kYXJ5UG9pbnQ6IGEgcG9pbnQgb2YgZG9tIHRyZWVcblx0XHQgKiAgKiBCb3VuZGFyeVBvaW50czogdHdvIGJvdW5kYXJ5UG9pbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBSYW5nZVxuXHRcdCAqXG5cdFx0ICogU2VlIHRvIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLVRyYXZlcnNhbC1SYW5nZS9yYW5nZXMuaHRtbCNMZXZlbC0yLVJhbmdlLVBvc2l0aW9uXG5cdFx0ICpcblx0XHQgKiBAc2luZ2xldG9uXG5cdFx0ICogQGFsdGVybmF0ZUNsYXNzTmFtZSByYW5nZVxuXHRcdCAqL1xuXHRcdHJldHVybiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIEBtZXRob2Rcblx0XHRcdCAqIFxuXHRcdFx0ICogY3JlYXRlIFJhbmdlIE9iamVjdCBGcm9tIGFyZ3VtZW50cyBvciBCcm93c2VyIFNlbGVjdGlvblxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7Tm9kZX0gc2MgLSBzdGFydCBjb250YWluZXJcblx0XHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBzbyAtIHN0YXJ0IG9mZnNldFxuXHRcdFx0ICogQHBhcmFtIHtOb2RlfSBlYyAtIGVuZCBjb250YWluZXJcblx0XHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBlbyAtIGVuZCBvZmZzZXRcblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0Y3JlYXRlOiBmdW5jdGlvbiAoc2MsIHNvLCBlYywgZW8pIHtcblx0XHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7IC8vIGZyb20gQnJvd3NlciBTZWxlY3Rpb25cblx0XHRcdFx0XHRpZiAoYWdlbnQuaXNXM0NSYW5nZVN1cHBvcnQpIHtcblx0XHRcdFx0XHRcdHZhciBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcblx0XHRcdFx0XHRcdGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZG9tLmlzQm9keShzZWxlY3Rpb24uYW5jaG9yTm9kZSkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gRmlyZWZveDogcmV0dXJucyBlbnRpcmUgYm9keSBhcyByYW5nZSBvbiBpbml0aWFsaXphdGlvbi4gV2Ugd29uJ3QgbmV2ZXIgbmVlZCBpdC5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHZhciBuYXRpdmVSbmcgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcblx0XHRcdFx0XHRcdHNjID0gbmF0aXZlUm5nLnN0YXJ0Q29udGFpbmVyO1xuXHRcdFx0XHRcdFx0c28gPSBuYXRpdmVSbmcuc3RhcnRPZmZzZXQ7XG5cdFx0XHRcdFx0XHRlYyA9IG5hdGl2ZVJuZy5lbmRDb250YWluZXI7XG5cdFx0XHRcdFx0XHRlbyA9IG5hdGl2ZVJuZy5lbmRPZmZzZXQ7XG5cdFx0XHRcdFx0fSBlbHNlIHsgLy8gSUU4OiBUZXh0UmFuZ2Vcblx0XHRcdFx0XHRcdHZhciB0ZXh0UmFuZ2UgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcblx0XHRcdFx0XHRcdHZhciB0ZXh0UmFuZ2VFbmQgPSB0ZXh0UmFuZ2UuZHVwbGljYXRlKCk7XG5cdFx0XHRcdFx0XHR0ZXh0UmFuZ2VFbmQuY29sbGFwc2UoZmFsc2UpO1xuXHRcdFx0XHRcdFx0dmFyIHRleHRSYW5nZVN0YXJ0ID0gdGV4dFJhbmdlO1xuXHRcdFx0XHRcdFx0dGV4dFJhbmdlU3RhcnQuY29sbGFwc2UodHJ1ZSk7XG5cblx0XHRcdFx0XHRcdHZhciBzdGFydFBvaW50ID0gdGV4dFJhbmdlVG9Qb2ludCh0ZXh0UmFuZ2VTdGFydCwgdHJ1ZSksXG5cdFx0XHRcdFx0XHRlbmRQb2ludCA9IHRleHRSYW5nZVRvUG9pbnQodGV4dFJhbmdlRW5kLCBmYWxzZSk7XG5cblx0XHRcdFx0XHRcdC8vIHNhbWUgdmlzaWJsZSBwb2ludCBjYXNlOiByYW5nZSB3YXMgY29sbGFwc2VkLlxuXHRcdFx0XHRcdFx0aWYgKGRvbS5pc1RleHQoc3RhcnRQb2ludC5ub2RlKSAmJiBkb20uaXNMZWZ0RWRnZVBvaW50KHN0YXJ0UG9pbnQpICYmXG5cdFx0XHRcdFx0XHRcdGRvbS5pc1RleHROb2RlKGVuZFBvaW50Lm5vZGUpICYmIGRvbS5pc1JpZ2h0RWRnZVBvaW50KGVuZFBvaW50KSAmJlxuXHRcdFx0XHRcdFx0XHRlbmRQb2ludC5ub2RlLm5leHRTaWJsaW5nID09PSBzdGFydFBvaW50Lm5vZGUpIHtcblx0XHRcdFx0XHRcdFx0c3RhcnRQb2ludCA9IGVuZFBvaW50O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzYyA9IHN0YXJ0UG9pbnQuY29udDtcblx0XHRcdFx0XHRcdHNvID0gc3RhcnRQb2ludC5vZmZzZXQ7XG5cdFx0XHRcdFx0XHRlYyA9IGVuZFBvaW50LmNvbnQ7XG5cdFx0XHRcdFx0XHRlbyA9IGVuZFBvaW50Lm9mZnNldDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgeyAvL2NvbGxhcHNlZFxuXHRcdFx0XHRcdGVjID0gc2M7XG5cdFx0XHRcdFx0ZW8gPSBzbztcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShzYywgc28sIGVjLCBlbyk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBtZXRob2QgXG5cdFx0XHQgKiBcblx0XHRcdCAqIGNyZWF0ZSBXcmFwcGVkUmFuZ2UgZnJvbSBub2RlXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdGNyZWF0ZUZyb21Ob2RlOiBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHR2YXIgc2MgPSBub2RlO1xuXHRcdFx0XHR2YXIgc28gPSAwO1xuXHRcdFx0XHR2YXIgZWMgPSBub2RlO1xuXHRcdFx0XHR2YXIgZW8gPSBkb20ubm9kZUxlbmd0aChlYyk7XG5cblx0XHRcdFx0Ly8gYnJvd3NlcnMgY2FuJ3QgdGFyZ2V0IGEgcGljdHVyZSBvciB2b2lkIG5vZGVcblx0XHRcdFx0aWYgKGRvbS5pc1ZvaWQoc2MpKSB7XG5cdFx0XHRcdFx0c28gPSBkb20ubGlzdFByZXYoc2MpLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0c2MgPSBzYy5wYXJlbnROb2RlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChkb20uaXNCUihlYykpIHtcblx0XHRcdFx0XHRlbyA9IGRvbS5saXN0UHJldihlYykubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRlYyA9IGVjLnBhcmVudE5vZGU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoZG9tLmlzVm9pZChlYykpIHtcblx0XHRcdFx0XHRlbyA9IGRvbS5saXN0UHJldihlYykubGVuZ3RoO1xuXHRcdFx0XHRcdGVjID0gZWMucGFyZW50Tm9kZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZShzYywgc28sIGVjLCBlbyk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBtZXRob2QgXG5cdFx0XHQgKiBcblx0XHRcdCAqIGNyZWF0ZSBXcmFwcGVkUmFuZ2UgZnJvbSBib29rbWFya1xuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7Tm9kZX0gZWRpdGFibGVcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBib29rbWFya1xuXHRcdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdFx0ICovXG5cdFx0XHRjcmVhdGVGcm9tQm9va21hcms6IGZ1bmN0aW9uIChlZGl0YWJsZSwgYm9va21hcmspIHtcblx0XHRcdFx0dmFyIHNjID0gZG9tLmZyb21PZmZzZXRQYXRoKGVkaXRhYmxlLCBib29rbWFyay5zLnBhdGgpO1xuXHRcdFx0XHR2YXIgc28gPSBib29rbWFyay5zLm9mZnNldDtcblx0XHRcdFx0dmFyIGVjID0gZG9tLmZyb21PZmZzZXRQYXRoKGVkaXRhYmxlLCBib29rbWFyay5lLnBhdGgpO1xuXHRcdFx0XHR2YXIgZW8gPSBib29rbWFyay5lLm9mZnNldDtcblx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2Uoc2MsIHNvLCBlYywgZW8pO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAbWV0aG9kIFxuXHRcdFx0ICpcblx0XHRcdCAqIGNyZWF0ZSBXcmFwcGVkUmFuZ2UgZnJvbSBwYXJhQm9va21hcmtcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gYm9va21hcmtcblx0XHRcdCAqIEBwYXJhbSB7Tm9kZVtdfSBwYXJhc1xuXHRcdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdFx0ICovXG5cdFx0XHRjcmVhdGVGcm9tUGFyYUJvb2ttYXJrOiBmdW5jdGlvbiAoYm9va21hcmssIHBhcmFzKSB7XG5cdFx0XHRcdHZhciBzbyA9IGJvb2ttYXJrLnMub2Zmc2V0O1xuXHRcdFx0XHR2YXIgZW8gPSBib29rbWFyay5lLm9mZnNldDtcblx0XHRcdFx0dmFyIHNjID0gZG9tLmZyb21PZmZzZXRQYXRoKGxpc3QuaGVhZChwYXJhcyksIGJvb2ttYXJrLnMucGF0aCk7XG5cdFx0XHRcdHZhciBlYyA9IGRvbS5mcm9tT2Zmc2V0UGF0aChsaXN0Lmxhc3QocGFyYXMpLCBib29rbWFyay5lLnBhdGgpO1xuXG5cdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKHNjLCBzbywgZWMsIGVvKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9KSgpO1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgZGVmYXVsdHMgXG5cdCAqIFxuXHQgKiBAc2luZ2xldG9uXG5cdCAqL1xuXHR2YXIgZGVmYXVsdHMgPSB7XG5cdFx0LyoqIEBwcm9wZXJ0eSAqL1xuXHRcdHZlcnNpb246ICcwLjYuMycsXG5cblx0XHQvKipcblx0XHQgKiBcblx0XHQgKiBmb3IgZXZlbnQgb3B0aW9ucywgcmVmZXJlbmNlIHRvIEV2ZW50SGFuZGxlci5hdHRhY2hcblx0XHQgKiBcblx0XHQgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucyBcblx0XHQgKiBAcHJvcGVydHkge1N0cmluZy9OdW1iZXJ9IFtvcHRpb25zLndpZHRoPW51bGxdIHNldCBlZGl0b3Igd2lkdGggXG5cdFx0ICogQHByb3BlcnR5IHtTdHJpbmcvTnVtYmVyfSBbb3B0aW9ucy5oZWlnaHQ9bnVsbF0gc2V0IGVkaXRvciBoZWlnaHQsIGV4KSAzMDBcblx0XHQgKiBAcHJvcGVydHkge1N0cmluZy9OdW1iZXJ9IG9wdGlvbnMubWluSGVpZ2h0IHNldCBtaW5pbXVtIGhlaWdodCBvZiBlZGl0b3Jcblx0XHQgKiBAcHJvcGVydHkge1N0cmluZy9OdW1iZXJ9IG9wdGlvbnMubWF4SGVpZ2h0XG5cdFx0ICogQHByb3BlcnR5IHtTdHJpbmcvTnVtYmVyfSBvcHRpb25zLmZvY3VzIFxuXHRcdCAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBvcHRpb25zLnRhYnNpemUgXG5cdFx0ICogQHByb3BlcnR5IHtCb29sZWFufSBvcHRpb25zLnN0eWxlV2l0aFNwYW5cblx0XHQgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5jb2RlbWlycm9yXG5cdFx0ICogQHByb3BlcnR5IHtPYmplY3R9IFtvcHRpb25zLmNvZGVtaXJyb3IubW9kZT0ndGV4dC9odG1sJ11cblx0XHQgKiBAcHJvcGVydHkge09iamVjdH0gW29wdGlvbnMuY29kZW1pcnJvci5odG1sTW9kZT10cnVlXVxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbb3B0aW9ucy5jb2RlbWlycm9yLmxpbmVOdW1iZXJzPXRydWVdXG5cdFx0ICogQHByb3BlcnR5IHtTdHJpbmd9IFtvcHRpb25zLmxhbmc9ZW4tVVNdIGxhbmd1YWdlICdlbi1VUycsICdrby1LUicsIC4uLlxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbb3B0aW9ucy5kaXJlY3Rpb249bnVsbF0gdGV4dCBkaXJlY3Rpb24sIGV4KSAncnRsJ1xuXHRcdCAqIEBwcm9wZXJ0eSB7QXJyYXl9IFtvcHRpb25zLnRvb2xiYXJdXG5cdFx0ICogQHByb3BlcnR5IHtCb29sZWFufSBbb3B0aW9ucy5haXJNb2RlPWZhbHNlXVxuXHRcdCAqIEBwcm9wZXJ0eSB7QXJyYXl9IFtvcHRpb25zLmFpclBvcG92ZXJdXG5cdFx0ICogQHByb3BlcnR5IHtGdWNudGlvbn0gW29wdGlvbnMub25Jbml0XSBpbml0aWFsaXplXG5cdFx0ICogQHByb3BlcnR5IHtGdWNudGlvbn0gW29wdGlvbnMub25zdWJtaXRdXG5cdFx0ICovXG5cdFx0b3B0aW9uczoge1xuXHRcdFx0d2lkdGg6IG51bGwsICAgICAgICAgICAgICAgICAgLy8gc2V0IGVkaXRvciB3aWR0aFxuXHRcdFx0aGVpZ2h0OiBudWxsLCAgICAgICAgICAgICAgICAgLy8gc2V0IGVkaXRvciBoZWlnaHQsIGV4KSAzMDBcblxuXHRcdFx0bWluSGVpZ2h0OiBudWxsLCAgICAgICAgICAgICAgLy8gc2V0IG1pbmltdW0gaGVpZ2h0IG9mIGVkaXRvclxuXHRcdFx0bWF4SGVpZ2h0OiBudWxsLCAgICAgICAgICAgICAgLy8gc2V0IG1heGltdW0gaGVpZ2h0IG9mIGVkaXRvclxuXG5cdFx0XHRmb2N1czogZmFsc2UsICAgICAgICAgICAgICAgICAvLyBzZXQgZm9jdXMgdG8gZWRpdGFibGUgYXJlYSBhZnRlciBpbml0aWFsaXppbmcgc3VtbWVybm90ZVxuXG5cdFx0XHR0YWJzaXplOiA0LCAgICAgICAgICAgICAgICAgICAvLyBzaXplIG9mIHRhYiBleCkgMiBvciA0XG5cdFx0XHRzdHlsZVdpdGhTcGFuOiB0cnVlLCAgICAgICAgICAvLyBzdHlsZSB3aXRoIHNwYW4gKENocm9tZSBhbmQgRkYgb25seSlcblxuXHRcdFx0ZGlzYWJsZUxpbmtUYXJnZXQ6IGZhbHNlLCAgICAgLy8gaGlkZSBsaW5rIFRhcmdldCBDaGVja2JveFxuXHRcdFx0ZGlzYWJsZURyYWdBbmREcm9wOiBmYWxzZSwgICAgLy8gZGlzYWJsZSBkcmFnIGFuZCBkcm9wIGV2ZW50XG5cdFx0XHRkaXNhYmxlUmVzaXplRWRpdG9yOiBmYWxzZSwgICAvLyBkaXNhYmxlIHJlc2l6aW5nIGVkaXRvclxuXG5cdFx0XHRzaG9ydGN1dHM6IHRydWUsICAgICAgICAgICAgICAvLyBlbmFibGUga2V5Ym9hcmQgc2hvcnRjdXRzXG5cblx0XHRcdHBsYWNlaG9sZGVyOiBmYWxzZSwgICAgICAgICAgIC8vIGVuYWJsZSBwbGFjZWhvbGRlciB0ZXh0XG5cdFx0XHRwcmV0dGlmeUh0bWw6IHRydWUsICAgICAgICAgICAvLyBlbmFibGUgcHJldHRpZnlpbmcgaHRtbCB3aGlsZSB0b2dnbGluZyBjb2Rldmlld1xuXG5cdFx0XHRpY29uUHJlZml4OiAnZmEgZmEtJywgICAgICAgICAvLyBwcmVmaXggZm9yIGNzcyBpY29uIGNsYXNzZXNcblxuXHRcdFx0Y29kZW1pcnJvcjogeyAgICAgICAgICAgICAgICAgLy8gY29kZW1pcnJvciBvcHRpb25zXG5cdFx0XHRcdG1vZGU6ICd0ZXh0L2h0bWwnLFxuXHRcdFx0XHRodG1sTW9kZTogdHJ1ZSxcblx0XHRcdFx0bGluZU51bWJlcnM6IHRydWVcblx0XHRcdH0sXG5cblx0XHRcdC8vIGxhbmd1YWdlXG5cdFx0XHRsYW5nOiAnZW4tVVMnLCAgICAgICAgICAgICAgICAvLyBsYW5ndWFnZSAnZW4tVVMnLCAna28tS1InLCAuLi5cblx0XHRcdGRpcmVjdGlvbjogbnVsbCwgICAgICAgICAgICAgIC8vIHRleHQgZGlyZWN0aW9uLCBleCkgJ3J0bCdcblxuXHRcdFx0Ly8gdG9vbGJhclxuXHRcdFx0dG9vbGJhcjogW1xuXHRcdFx0ICBbJ3N0eWxlJywgWydzdHlsZSddXSxcblx0XHRcdCAgWydmb250JywgWydib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnY2xlYXInXV0sXG5cdFx0XHQgIFsnZm9udG5hbWUnLCBbJ2ZvbnRuYW1lJ11dLFxuXHRcdFx0ICBbJ2NvbG9yJywgWydjb2xvciddXSxcblx0XHRcdCAgWydwYXJhJywgWyd1bCcsICdvbCcsICdwYXJhZ3JhcGgnXV0sXG5cdFx0XHQgIFsnaGVpZ2h0JywgWydoZWlnaHQnXV0sXG5cdFx0XHQgIFsndGFibGUnLCBbJ3RhYmxlJ11dLFxuXHRcdFx0ICBbJ2luc2VydCcsIFsnbGluaycsICdwaWN0dXJlJywgJ2hyJ11dLFxuXHRcdFx0ICBbJ3ZpZXcnLCBbJ2Z1bGxzY3JlZW4nLCAnY29kZXZpZXcnXV0sXG5cdFx0XHQgIFsnaGVscCcsIFsnaGVscCddXVxuXHRcdFx0XSxcblxuXHRcdFx0Ly8gYWlyIG1vZGU6IGlubGluZSBlZGl0b3Jcblx0XHRcdGFpck1vZGU6IGZhbHNlLFxuXHRcdFx0Ly8gYWlyUG9wb3ZlcjogW1xuXHRcdFx0Ly8gICBbJ3N0eWxlJywgWydzdHlsZSddXSxcblx0XHRcdC8vICAgWydmb250JywgWydib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnY2xlYXInXV0sXG5cdFx0XHQvLyAgIFsnZm9udG5hbWUnLCBbJ2ZvbnRuYW1lJ11dLFxuXHRcdFx0Ly8gICBbJ2NvbG9yJywgWydjb2xvciddXSxcblx0XHRcdC8vICAgWydwYXJhJywgWyd1bCcsICdvbCcsICdwYXJhZ3JhcGgnXV0sXG5cdFx0XHQvLyAgIFsnaGVpZ2h0JywgWydoZWlnaHQnXV0sXG5cdFx0XHQvLyAgIFsndGFibGUnLCBbJ3RhYmxlJ11dLFxuXHRcdFx0Ly8gICBbJ2luc2VydCcsIFsnbGluaycsICdwaWN0dXJlJ11dLFxuXHRcdFx0Ly8gICBbJ2hlbHAnLCBbJ2hlbHAnXV1cblx0XHRcdC8vIF0sXG5cdFx0XHRhaXJQb3BvdmVyOiBbXG5cdFx0XHQgIFsnY29sb3InLCBbJ2NvbG9yJ11dLFxuXHRcdFx0ICBbJ2ZvbnQnLCBbJ2JvbGQnLCAndW5kZXJsaW5lJywgJ2NsZWFyJ11dLFxuXHRcdFx0ICBbJ3BhcmEnLCBbJ3VsJywgJ3BhcmFncmFwaCddXSxcblx0XHRcdCAgWyd0YWJsZScsIFsndGFibGUnXV0sXG5cdFx0XHQgIFsnaW5zZXJ0JywgWydsaW5rJywgJ3BpY3R1cmUnXV1cblx0XHRcdF0sXG5cblx0XHRcdC8vIHN0eWxlIHRhZ1xuXHRcdFx0c3R5bGVUYWdzOiBbJ3AnLCAnYmxvY2txdW90ZScsICdwcmUnLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnXSxcblxuXHRcdFx0Ly8gZGVmYXVsdCBmb250TmFtZVxuXHRcdFx0ZGVmYXVsdEZvbnROYW1lOiAnSGVsdmV0aWNhIE5ldWUnLFxuXG5cdFx0XHQvLyBmb250TmFtZVxuXHRcdFx0Zm9udE5hbWVzOiBbXG5cdFx0XHQgICdBcmlhbCcsICdBcmlhbCBCbGFjaycsICdDb21pYyBTYW5zIE1TJywgJ0NvdXJpZXIgTmV3Jyxcblx0XHRcdCAgJ0hlbHZldGljYSBOZXVlJywgJ0hlbHZldGljYScsICdJbXBhY3QnLCAnTHVjaWRhIEdyYW5kZScsXG5cdFx0XHQgICdUYWhvbWEnLCAnVGltZXMgTmV3IFJvbWFuJywgJ1ZlcmRhbmEnXG5cdFx0XHRdLFxuXHRcdFx0Zm9udE5hbWVzSWdub3JlQ2hlY2s6IFtdLFxuXG5cdFx0XHQvLyBwYWxsZXRlIGNvbG9ycyhuIHggbilcblx0XHRcdGNvbG9yczogW1xuXHRcdFx0ICBbJyMwMDAwMDAnLCAnIzQyNDI0MicsICcjNjM2MzYzJywgJyM5QzlDOTQnLCAnI0NFQzZDRScsICcjRUZFRkVGJywgJyNGN0Y3RjcnLCAnI0ZGRkZGRiddLFxuXHRcdFx0ICBbJyNGRjAwMDAnLCAnI0ZGOUMwMCcsICcjRkZGRjAwJywgJyMwMEZGMDAnLCAnIzAwRkZGRicsICcjMDAwMEZGJywgJyM5QzAwRkYnLCAnI0ZGMDBGRiddLFxuXHRcdFx0ICBbJyNGN0M2Q0UnLCAnI0ZGRTdDRScsICcjRkZFRkM2JywgJyNENkVGRDYnLCAnI0NFREVFNycsICcjQ0VFN0Y3JywgJyNENkQ2RTcnLCAnI0U3RDZERSddLFxuXHRcdFx0ICBbJyNFNzlDOUMnLCAnI0ZGQzY5QycsICcjRkZFNzlDJywgJyNCNUQ2QTUnLCAnI0E1QzZDRScsICcjOUNDNkVGJywgJyNCNUE1RDYnLCAnI0Q2QTVCRCddLFxuXHRcdFx0ICBbJyNFNzYzNjMnLCAnI0Y3QUQ2QicsICcjRkZENjYzJywgJyM5NEJEN0InLCAnIzczQTVBRCcsICcjNkJBRERFJywgJyM4QzdCQzYnLCAnI0M2N0JBNSddLFxuXHRcdFx0ICBbJyNDRTAwMDAnLCAnI0U3OTQzOScsICcjRUZDNjMxJywgJyM2QkE1NEEnLCAnIzRBN0I4QycsICcjMzk4NEM2JywgJyM2MzRBQTUnLCAnI0E1NEE3QiddLFxuXHRcdFx0ICBbJyM5QzAwMDAnLCAnI0I1NjMwOCcsICcjQkQ5NDAwJywgJyMzOTdCMjEnLCAnIzEwNEE1QScsICcjMDg1Mjk0JywgJyMzMTE4NzMnLCAnIzczMTg0MiddLFxuXHRcdFx0ICBbJyM2MzAwMDAnLCAnIzdCMzkwMCcsICcjODQ2MzAwJywgJyMyOTUyMTgnLCAnIzA4MzEzOScsICcjMDAzMTYzJywgJyMyMTEwNEEnLCAnIzRBMTAzMSddXG5cdFx0XHRdLFxuXG5cdFx0XHQvLyBsaW5lSGVpZ2h0XG5cdFx0XHRsaW5lSGVpZ2h0czogWycxLjAnLCAnMS4yJywgJzEuNCcsICcxLjUnLCAnMS42JywgJzEuOCcsICcyLjAnLCAnMy4wJ10sXG5cblx0XHRcdC8vIGluc2VydFRhYmxlIG1heCBzaXplXG5cdFx0XHRpbnNlcnRUYWJsZU1heFNpemU6IHtcblx0XHRcdFx0Y29sOiAxMCxcblx0XHRcdFx0cm93OiAxMFxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gaW1hZ2Vcblx0XHRcdG1heGltdW1JbWFnZUZpbGVTaXplOiBudWxsLCAvLyBzaXplIGluIGJ5dGVzLCBudWxsID0gbm8gbGltaXRcblxuXHRcdFx0Ly8gY2FsbGJhY2tzXG5cdFx0XHRvbmluaXQ6IG51bGwsICAgICAgICAgICAgIC8vIGluaXRpYWxpemVcblx0XHRcdG9uZm9jdXM6IG51bGwsICAgICAgICAgICAgLy8gZWRpdGFibGUgaGFzIGZvY3VzXG5cdFx0XHRvbmJsdXI6IG51bGwsICAgICAgICAgICAgIC8vIGVkaXRhYmxlIG91dCBvZiBmb2N1c1xuXHRcdFx0b25lbnRlcjogbnVsbCwgICAgICAgICAgICAvLyBlbnRlciBrZXkgcHJlc3NlZFxuXHRcdFx0b25rZXl1cDogbnVsbCwgICAgICAgICAgICAvLyBrZXl1cFxuXHRcdFx0b25rZXlkb3duOiBudWxsLCAgICAgICAgICAvLyBrZXlkb3duXG5cdFx0XHRvbkltYWdlVXBsb2FkOiBudWxsLCAgICAgIC8vIGltYWdlVXBsb2FkXG5cdFx0XHRvbkltYWdlVXBsb2FkRXJyb3I6IG51bGwsIC8vIGltYWdlVXBsb2FkRXJyb3Jcblx0XHRcdG9uTWVkaWFEZWxldGU6IG51bGwsICAgICAgLy8gbWVkaWEgZGVsZXRlXG5cdFx0XHRvblRvb2xiYXJDbGljazogbnVsbCxcblx0XHRcdG9uc3VibWl0OiBudWxsLFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIG1hbmlwdWxhdGUgbGluayBhZGRyZXNzIHdoZW4gdXNlciBjcmVhdGUgbGlua1xuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IHNMaW5rVXJsXG5cdFx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdFx0XHQgKi9cblx0XHRcdG9uQ3JlYXRlTGluazogZnVuY3Rpb24gKHNMaW5rVXJsKSB7XG5cdFx0XHRcdGlmIChzTGlua1VybC5pbmRleE9mKCdAJykgIT09IC0xICYmIHNMaW5rVXJsLmluZGV4T2YoJzonKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRzTGlua1VybCA9ICdtYWlsdG86JyArIHNMaW5rVXJsO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNMaW5rVXJsLmluZGV4T2YoJzovLycpID09PSAtMSkge1xuXHRcdFx0XHRcdHNMaW5rVXJsID0gJ2h0dHA6Ly8nICsgc0xpbmtVcmw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gc0xpbmtVcmw7XG5cdFx0XHR9LFxuXG5cdFx0XHRrZXlNYXA6IHtcblx0XHRcdFx0cGM6IHtcblx0XHRcdFx0XHQnRU5URVInOiAnaW5zZXJ0UGFyYWdyYXBoJyxcblx0XHRcdFx0XHQnQ1RSTCtaJzogJ3VuZG8nLFxuXHRcdFx0XHRcdCdDVFJMK1knOiAncmVkbycsXG5cdFx0XHRcdFx0J1RBQic6ICd0YWInLFxuXHRcdFx0XHRcdCdTSElGVCtUQUInOiAndW50YWInLFxuXHRcdFx0XHRcdCdDVFJMK0InOiAnYm9sZCcsXG5cdFx0XHRcdFx0J0NUUkwrSSc6ICdpdGFsaWMnLFxuXHRcdFx0XHRcdCdDVFJMK1UnOiAndW5kZXJsaW5lJyxcblx0XHRcdFx0XHQnQ1RSTCtTSElGVCtTJzogJ3N0cmlrZXRocm91Z2gnLFxuXHRcdFx0XHRcdCdDVFJMK0JBQ0tTTEFTSCc6ICdyZW1vdmVGb3JtYXQnLFxuXHRcdFx0XHRcdCdDVFJMK1NISUZUK0wnOiAnanVzdGlmeUxlZnQnLFxuXHRcdFx0XHRcdCdDVFJMK1NISUZUK0UnOiAnanVzdGlmeUNlbnRlcicsXG5cdFx0XHRcdFx0J0NUUkwrU0hJRlQrUic6ICdqdXN0aWZ5UmlnaHQnLFxuXHRcdFx0XHRcdCdDVFJMK1NISUZUK0onOiAnanVzdGlmeUZ1bGwnLFxuXHRcdFx0XHRcdCdDVFJMK1NISUZUK05VTTcnOiAnaW5zZXJ0VW5vcmRlcmVkTGlzdCcsXG5cdFx0XHRcdFx0J0NUUkwrU0hJRlQrTlVNOCc6ICdpbnNlcnRPcmRlcmVkTGlzdCcsXG5cdFx0XHRcdFx0J0NUUkwrTEVGVEJSQUNLRVQnOiAnb3V0ZGVudCcsXG5cdFx0XHRcdFx0J0NUUkwrUklHSFRCUkFDS0VUJzogJ2luZGVudCcsXG5cdFx0XHRcdFx0J0NUUkwrTlVNMCc6ICdmb3JtYXRQYXJhJyxcblx0XHRcdFx0XHQnQ1RSTCtOVU0xJzogJ2Zvcm1hdEgxJyxcblx0XHRcdFx0XHQnQ1RSTCtOVU0yJzogJ2Zvcm1hdEgyJyxcblx0XHRcdFx0XHQnQ1RSTCtOVU0zJzogJ2Zvcm1hdEgzJyxcblx0XHRcdFx0XHQnQ1RSTCtOVU00JzogJ2Zvcm1hdEg0Jyxcblx0XHRcdFx0XHQnQ1RSTCtOVU01JzogJ2Zvcm1hdEg1Jyxcblx0XHRcdFx0XHQnQ1RSTCtOVU02JzogJ2Zvcm1hdEg2Jyxcblx0XHRcdFx0XHQnQ1RSTCtFTlRFUic6ICdpbnNlcnRIb3Jpem9udGFsUnVsZScsXG5cdFx0XHRcdFx0J0NUUkwrSyc6ICdzaG93TGlua0RpYWxvZydcblx0XHRcdFx0fSxcblxuXHRcdFx0XHRtYWM6IHtcblx0XHRcdFx0XHQnRU5URVInOiAnaW5zZXJ0UGFyYWdyYXBoJyxcblx0XHRcdFx0XHQnQ01EK1onOiAndW5kbycsXG5cdFx0XHRcdFx0J0NNRCtTSElGVCtaJzogJ3JlZG8nLFxuXHRcdFx0XHRcdCdUQUInOiAndGFiJyxcblx0XHRcdFx0XHQnU0hJRlQrVEFCJzogJ3VudGFiJyxcblx0XHRcdFx0XHQnQ01EK0InOiAnYm9sZCcsXG5cdFx0XHRcdFx0J0NNRCtJJzogJ2l0YWxpYycsXG5cdFx0XHRcdFx0J0NNRCtVJzogJ3VuZGVybGluZScsXG5cdFx0XHRcdFx0J0NNRCtTSElGVCtTJzogJ3N0cmlrZXRocm91Z2gnLFxuXHRcdFx0XHRcdCdDTUQrQkFDS1NMQVNIJzogJ3JlbW92ZUZvcm1hdCcsXG5cdFx0XHRcdFx0J0NNRCtTSElGVCtMJzogJ2p1c3RpZnlMZWZ0Jyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK0UnOiAnanVzdGlmeUNlbnRlcicsXG5cdFx0XHRcdFx0J0NNRCtTSElGVCtSJzogJ2p1c3RpZnlSaWdodCcsXG5cdFx0XHRcdFx0J0NNRCtTSElGVCtKJzogJ2p1c3RpZnlGdWxsJyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK05VTTcnOiAnaW5zZXJ0VW5vcmRlcmVkTGlzdCcsXG5cdFx0XHRcdFx0J0NNRCtTSElGVCtOVU04JzogJ2luc2VydE9yZGVyZWRMaXN0Jyxcblx0XHRcdFx0XHQnQ01EK0xFRlRCUkFDS0VUJzogJ291dGRlbnQnLFxuXHRcdFx0XHRcdCdDTUQrUklHSFRCUkFDS0VUJzogJ2luZGVudCcsXG5cdFx0XHRcdFx0J0NNRCtOVU0wJzogJ2Zvcm1hdFBhcmEnLFxuXHRcdFx0XHRcdCdDTUQrTlVNMSc6ICdmb3JtYXRIMScsXG5cdFx0XHRcdFx0J0NNRCtOVU0yJzogJ2Zvcm1hdEgyJyxcblx0XHRcdFx0XHQnQ01EK05VTTMnOiAnZm9ybWF0SDMnLFxuXHRcdFx0XHRcdCdDTUQrTlVNNCc6ICdmb3JtYXRINCcsXG5cdFx0XHRcdFx0J0NNRCtOVU01JzogJ2Zvcm1hdEg1Jyxcblx0XHRcdFx0XHQnQ01EK05VTTYnOiAnZm9ybWF0SDYnLFxuXHRcdFx0XHRcdCdDTUQrRU5URVInOiAnaW5zZXJ0SG9yaXpvbnRhbFJ1bGUnLFxuXHRcdFx0XHRcdCdDTUQrSyc6ICdzaG93TGlua0RpYWxvZydcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBkZWZhdWx0IGxhbmd1YWdlOiBlbi1VU1xuXHRcdGxhbmc6IHtcblx0XHRcdCdlbi1VUyc6IHtcblx0XHRcdFx0Zm9udDoge1xuXHRcdFx0XHRcdGJvbGQ6ICdCb2xkJyxcblx0XHRcdFx0XHRpdGFsaWM6ICdJdGFsaWMnLFxuXHRcdFx0XHRcdHVuZGVybGluZTogJ1VuZGVybGluZScsXG5cdFx0XHRcdFx0Y2xlYXI6ICdSZW1vdmUgRm9udCBTdHlsZScsXG5cdFx0XHRcdFx0aGVpZ2h0OiAnTGluZSBIZWlnaHQnLFxuXHRcdFx0XHRcdG5hbWU6ICdGb250IEZhbWlseSdcblx0XHRcdFx0fSxcblx0XHRcdFx0aW1hZ2U6IHtcblx0XHRcdFx0XHRpbWFnZTogJ1BpY3R1cmUnLFxuXHRcdFx0XHRcdGluc2VydDogJ0luc2VydCBJbWFnZScsXG5cdFx0XHRcdFx0cmVzaXplRnVsbDogJ1Jlc2l6ZSBGdWxsJyxcblx0XHRcdFx0XHRyZXNpemVIYWxmOiAnUmVzaXplIEhhbGYnLFxuXHRcdFx0XHRcdHJlc2l6ZVF1YXJ0ZXI6ICdSZXNpemUgUXVhcnRlcicsXG5cdFx0XHRcdFx0ZmxvYXRMZWZ0OiAnRmxvYXQgTGVmdCcsXG5cdFx0XHRcdFx0ZmxvYXRSaWdodDogJ0Zsb2F0IFJpZ2h0Jyxcblx0XHRcdFx0XHRmbG9hdE5vbmU6ICdGbG9hdCBOb25lJyxcblx0XHRcdFx0XHRzaGFwZVJvdW5kZWQ6ICdTaGFwZTogUm91bmRlZCcsXG5cdFx0XHRcdFx0c2hhcGVDaXJjbGU6ICdTaGFwZTogQ2lyY2xlJyxcblx0XHRcdFx0XHRzaGFwZVRodW1ibmFpbDogJ1NoYXBlOiBUaHVtYm5haWwnLFxuXHRcdFx0XHRcdHNoYXBlTm9uZTogJ1NoYXBlOiBOb25lJyxcblx0XHRcdFx0XHRkcmFnSW1hZ2VIZXJlOiAnRHJhZyBpbWFnZSBvciB0ZXh0IGhlcmUnLFxuXHRcdFx0XHRcdGRyb3BJbWFnZTogJ0Ryb3AgaW1hZ2Ugb3IgVGV4dCcsXG5cdFx0XHRcdFx0c2VsZWN0RnJvbUZpbGVzOiAnU2VsZWN0IGZyb20gZmlsZXMnLFxuXHRcdFx0XHRcdG1heGltdW1GaWxlU2l6ZTogJ01heGltdW0gZmlsZSBzaXplJyxcblx0XHRcdFx0XHRtYXhpbXVtRmlsZVNpemVFcnJvcjogJ01heGltdW0gZmlsZSBzaXplIGV4Y2VlZGVkLicsXG5cdFx0XHRcdFx0dXJsOiAnSW1hZ2UgVVJMJyxcblx0XHRcdFx0XHRyZW1vdmU6ICdSZW1vdmUgSW1hZ2UnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxpbms6IHtcblx0XHRcdFx0XHRsaW5rOiAnTGluaycsXG5cdFx0XHRcdFx0aW5zZXJ0OiAnSW5zZXJ0IExpbmsnLFxuXHRcdFx0XHRcdHVubGluazogJ1VubGluaycsXG5cdFx0XHRcdFx0ZWRpdDogJ0VkaXQnLFxuXHRcdFx0XHRcdHRleHRUb0Rpc3BsYXk6ICdUZXh0IHRvIGRpc3BsYXknLFxuXHRcdFx0XHRcdHVybDogJ1RvIHdoYXQgVVJMIHNob3VsZCB0aGlzIGxpbmsgZ28/Jyxcblx0XHRcdFx0XHRvcGVuSW5OZXdXaW5kb3c6ICdPcGVuIGluIG5ldyB3aW5kb3cnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRhYmxlOiB7XG5cdFx0XHRcdFx0dGFibGU6ICdUYWJsZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0aHI6IHtcblx0XHRcdFx0XHRpbnNlcnQ6ICdJbnNlcnQgSG9yaXpvbnRhbCBSdWxlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzdHlsZToge1xuXHRcdFx0XHRcdHN0eWxlOiAnU3R5bGUnLFxuXHRcdFx0XHRcdG5vcm1hbDogJ05vcm1hbCcsXG5cdFx0XHRcdFx0YmxvY2txdW90ZTogJ1F1b3RlJyxcblx0XHRcdFx0XHRwcmU6ICdDb2RlJyxcblx0XHRcdFx0XHRoMTogJ0hlYWRlciAxJyxcblx0XHRcdFx0XHRoMjogJ0hlYWRlciAyJyxcblx0XHRcdFx0XHRoMzogJ0hlYWRlciAzJyxcblx0XHRcdFx0XHRoNDogJ0hlYWRlciA0Jyxcblx0XHRcdFx0XHRoNTogJ0hlYWRlciA1Jyxcblx0XHRcdFx0XHRoNjogJ0hlYWRlciA2J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRsaXN0czoge1xuXHRcdFx0XHRcdHVub3JkZXJlZDogJ1Vub3JkZXJlZCBsaXN0Jyxcblx0XHRcdFx0XHRvcmRlcmVkOiAnT3JkZXJlZCBsaXN0J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0aGVscDogJ0hlbHAnLFxuXHRcdFx0XHRcdGZ1bGxzY3JlZW46ICdGdWxsIFNjcmVlbicsXG5cdFx0XHRcdFx0Y29kZXZpZXc6ICdDb2RlIFZpZXcnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHBhcmFncmFwaDoge1xuXHRcdFx0XHRcdHBhcmFncmFwaDogJ1BhcmFncmFwaCcsXG5cdFx0XHRcdFx0b3V0ZGVudDogJ091dGRlbnQnLFxuXHRcdFx0XHRcdGluZGVudDogJ0luZGVudCcsXG5cdFx0XHRcdFx0bGVmdDogJ0FsaWduIGxlZnQnLFxuXHRcdFx0XHRcdGNlbnRlcjogJ0FsaWduIGNlbnRlcicsXG5cdFx0XHRcdFx0cmlnaHQ6ICdBbGlnbiByaWdodCcsXG5cdFx0XHRcdFx0anVzdGlmeTogJ0p1c3RpZnkgZnVsbCdcblx0XHRcdFx0fSxcblx0XHRcdFx0Y29sb3I6IHtcblx0XHRcdFx0XHRyZWNlbnQ6ICdSZWNlbnQgQ29sb3InLFxuXHRcdFx0XHRcdG1vcmU6ICdNb3JlIENvbG9yJyxcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAnQmFja2dyb3VuZCBDb2xvcicsXG5cdFx0XHRcdFx0Zm9yZWdyb3VuZDogJ0ZvcmVncm91bmQgQ29sb3InLFxuXHRcdFx0XHRcdHRyYW5zcGFyZW50OiAnVHJhbnNwYXJlbnQnLFxuXHRcdFx0XHRcdHNldFRyYW5zcGFyZW50OiAnU2V0IHRyYW5zcGFyZW50Jyxcblx0XHRcdFx0XHRyZXNldDogJ1Jlc2V0Jyxcblx0XHRcdFx0XHRyZXNldFRvRGVmYXVsdDogJ1Jlc2V0IHRvIGRlZmF1bHQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNob3J0Y3V0OiB7XG5cdFx0XHRcdFx0c2hvcnRjdXRzOiAnS2V5Ym9hcmQgc2hvcnRjdXRzJyxcblx0XHRcdFx0XHRjbG9zZTogJ0Nsb3NlJyxcblx0XHRcdFx0XHR0ZXh0Rm9ybWF0dGluZzogJ1RleHQgZm9ybWF0dGluZycsXG5cdFx0XHRcdFx0YWN0aW9uOiAnQWN0aW9uJyxcblx0XHRcdFx0XHRwYXJhZ3JhcGhGb3JtYXR0aW5nOiAnUGFyYWdyYXBoIGZvcm1hdHRpbmcnLFxuXHRcdFx0XHRcdGRvY3VtZW50U3R5bGU6ICdEb2N1bWVudCBTdHlsZScsXG5cdFx0XHRcdFx0ZXh0cmFLZXlzOiAnRXh0cmEga2V5cydcblx0XHRcdFx0fSxcblx0XHRcdFx0aGlzdG9yeToge1xuXHRcdFx0XHRcdHVuZG86ICdVbmRvJyxcblx0XHRcdFx0XHRyZWRvOiAnUmVkbydcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIGNvcmUuYXN5bmNcblx0ICpcblx0ICogQXN5bmMgZnVuY3Rpb25zIHdoaWNoIHJldHVybnMgYFByb21pc2VgXG5cdCAqXG5cdCAqIEBzaW5nbGV0b25cblx0ICogQGFsdGVybmF0ZUNsYXNzTmFtZSBhc3luY1xuXHQgKi9cblx0dmFyIGFzeW5jID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHJlYWRGaWxlQXNEYXRhVVJMXG5cdFx0ICpcblx0XHQgKiByZWFkIGNvbnRlbnRzIG9mIGZpbGUgYXMgcmVwcmVzZW50aW5nIFVSTFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtGaWxlfSBmaWxlXG5cdFx0ICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGVuOiBzRGF0YVVybFxuXHRcdCAqL1xuXHRcdHZhciByZWFkRmlsZUFzRGF0YVVSTCA9IGZ1bmN0aW9uIChmaWxlKSB7XG5cdFx0XHRyZXR1cm4gJC5EZWZlcnJlZChmdW5jdGlvbiAoZGVmZXJyZWQpIHtcblx0XHRcdFx0JC5leHRlbmQobmV3IEZpbGVSZWFkZXIoKSwge1xuXHRcdFx0XHRcdG9ubG9hZDogZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRcdHZhciBzRGF0YVVSTCA9IGUudGFyZ2V0LnJlc3VsdDtcblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmUoc0RhdGFVUkwpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b25lcnJvcjogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0KHRoaXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkucmVhZEFzRGF0YVVSTChmaWxlKTtcblx0XHRcdH0pLnByb21pc2UoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBjcmVhdGVJbWFnZVxuXHRcdCAqXG5cdFx0ICogY3JlYXRlIGA8aW1hZ2U+YCBmcm9tIHVybCBzdHJpbmdcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBzVXJsXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lXG5cdFx0ICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGVuOiAkaW1hZ2Vcblx0XHQgKi9cblx0XHR2YXIgY3JlYXRlSW1hZ2UgPSBmdW5jdGlvbiAoc1VybCwgZmlsZW5hbWUpIHtcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKGZ1bmN0aW9uIChkZWZlcnJlZCkge1xuXHRcdFx0XHR2YXIgJGltZyA9ICQoJzxpbWc+Jyk7XG5cblx0XHRcdFx0JGltZy5vbmUoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0JGltZy5vZmYoJ2Vycm9yIGFib3J0Jyk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZSgkaW1nKTtcblx0XHRcdFx0fSkub25lKCdlcnJvciBhYm9ydCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQkaW1nLm9mZignbG9hZCcpLmRldGFjaCgpO1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdCgkaW1nKTtcblx0XHRcdFx0fSkuY3NzKHtcblx0XHRcdFx0XHRkaXNwbGF5OiAnbm9uZSdcblx0XHRcdFx0fSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuYXR0cih7XG5cdFx0XHRcdFx0J3NyYyc6IHNVcmwsXG5cdFx0XHRcdFx0J2RhdGEtZmlsZW5hbWUnOiBmaWxlbmFtZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pLnByb21pc2UoKTtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlYWRGaWxlQXNEYXRhVVJMOiByZWFkRmlsZUFzRGF0YVVSTCxcblx0XHRcdGNyZWF0ZUltYWdlOiBjcmVhdGVJbWFnZVxuXHRcdH07XG5cdH0pKCk7XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBjb3JlLmtleVxuXHQgKlxuXHQgKiBPYmplY3QgZm9yIGtleWNvZGVzLlxuXHQgKlxuXHQgKiBAc2luZ2xldG9uXG5cdCAqIEBhbHRlcm5hdGVDbGFzc05hbWUga2V5XG5cdCAqL1xuXHR2YXIga2V5ID0ge1xuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaXNFZGl0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge051bWJlcn0ga2V5Q29kZVxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0aXNFZGl0OiBmdW5jdGlvbiAoa2V5Q29kZSkge1xuXHRcdFx0cmV0dXJuIGxpc3QuY29udGFpbnMoWzgsIDksIDEzLCAzMl0sIGtleUNvZGUpO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogQHByb3BlcnR5IHtPYmplY3R9IG5hbWVGcm9tQ29kZVxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lRnJvbUNvZGUuOCBcIkJBQ0tTUEFDRVwiXG5cdFx0ICovXG5cdFx0bmFtZUZyb21Db2RlOiB7XG5cdFx0XHQnOCc6ICdCQUNLU1BBQ0UnLFxuXHRcdFx0JzknOiAnVEFCJyxcblx0XHRcdCcxMyc6ICdFTlRFUicsXG5cdFx0XHQnMzInOiAnU1BBQ0UnLFxuXG5cdFx0XHQvLyBOdW1iZXI6IDAtOVxuXHRcdFx0JzQ4JzogJ05VTTAnLFxuXHRcdFx0JzQ5JzogJ05VTTEnLFxuXHRcdFx0JzUwJzogJ05VTTInLFxuXHRcdFx0JzUxJzogJ05VTTMnLFxuXHRcdFx0JzUyJzogJ05VTTQnLFxuXHRcdFx0JzUzJzogJ05VTTUnLFxuXHRcdFx0JzU0JzogJ05VTTYnLFxuXHRcdFx0JzU1JzogJ05VTTcnLFxuXHRcdFx0JzU2JzogJ05VTTgnLFxuXG5cdFx0XHQvLyBBbHBoYWJldDogYS16XG5cdFx0XHQnNjYnOiAnQicsXG5cdFx0XHQnNjknOiAnRScsXG5cdFx0XHQnNzMnOiAnSScsXG5cdFx0XHQnNzQnOiAnSicsXG5cdFx0XHQnNzUnOiAnSycsXG5cdFx0XHQnNzYnOiAnTCcsXG5cdFx0XHQnODInOiAnUicsXG5cdFx0XHQnODMnOiAnUycsXG5cdFx0XHQnODUnOiAnVScsXG5cdFx0XHQnODknOiAnWScsXG5cdFx0XHQnOTAnOiAnWicsXG5cblx0XHRcdCcxOTEnOiAnU0xBU0gnLFxuXHRcdFx0JzIxOSc6ICdMRUZUQlJBQ0tFVCcsXG5cdFx0XHQnMjIwJzogJ0JBQ0tTTEFTSCcsXG5cdFx0XHQnMjIxJzogJ1JJR0hUQlJBQ0tFVCdcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBlZGl0aW5nLkhpc3Rvcnlcblx0ICpcblx0ICogRWRpdG9yIEhpc3Rvcnlcblx0ICpcblx0ICovXG5cdHZhciBIaXN0b3J5ID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdHZhciBzdGFjayA9IFtdLCBzdGFja09mZnNldCA9IC0xO1xuXHRcdHZhciBlZGl0YWJsZSA9ICRlZGl0YWJsZVswXTtcblxuXHRcdHZhciBtYWtlU25hcHNob3QgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCk7XG5cdFx0XHR2YXIgZW1wdHlCb29rbWFyayA9IHsgczogeyBwYXRoOiBbXSwgb2Zmc2V0OiAwIH0sIGU6IHsgcGF0aDogW10sIG9mZnNldDogMCB9IH07XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNvbnRlbnRzOiAkZWRpdGFibGUuaHRtbCgpLFxuXHRcdFx0XHRib29rbWFyazogKHJuZyA/IHJuZy5ib29rbWFyayhlZGl0YWJsZSkgOiBlbXB0eUJvb2ttYXJrKVxuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0dmFyIGFwcGx5U25hcHNob3QgPSBmdW5jdGlvbiAoc25hcHNob3QpIHtcblx0XHRcdGlmIChzbmFwc2hvdC5jb250ZW50cyAhPT0gbnVsbCkge1xuXHRcdFx0XHQkZWRpdGFibGUuaHRtbChzbmFwc2hvdC5jb250ZW50cyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc25hcHNob3QuYm9va21hcmsgIT09IG51bGwpIHtcblx0XHRcdFx0cmFuZ2UuY3JlYXRlRnJvbUJvb2ttYXJrKGVkaXRhYmxlLCBzbmFwc2hvdC5ib29rbWFyaykuc2VsZWN0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHVuZG9cblx0XHQgKi9cblx0XHR0aGlzLnVuZG8gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoMCA8IHN0YWNrT2Zmc2V0KSB7XG5cdFx0XHRcdHN0YWNrT2Zmc2V0LS07XG5cdFx0XHRcdGFwcGx5U25hcHNob3Qoc3RhY2tbc3RhY2tPZmZzZXRdKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmVkb1xuXHRcdCAqL1xuXHRcdHRoaXMucmVkbyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChzdGFjay5sZW5ndGggLSAxID4gc3RhY2tPZmZzZXQpIHtcblx0XHRcdFx0c3RhY2tPZmZzZXQrKztcblx0XHRcdFx0YXBwbHlTbmFwc2hvdChzdGFja1tzdGFja09mZnNldF0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZWNvcmRlZCB1bmRvXG5cdFx0ICovXG5cdFx0dGhpcy5yZWNvcmRVbmRvID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0c3RhY2tPZmZzZXQrKztcblxuXHRcdFx0Ly8gV2FzaCBvdXQgc3RhY2sgYWZ0ZXIgc3RhY2tPZmZzZXRcblx0XHRcdGlmIChzdGFjay5sZW5ndGggPiBzdGFja09mZnNldCkge1xuXHRcdFx0XHRzdGFjayA9IHN0YWNrLnNsaWNlKDAsIHN0YWNrT2Zmc2V0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ3JlYXRlIG5ldyBzbmFwc2hvdCBhbmQgcHVzaCBpdCB0byB0aGUgZW5kXG5cdFx0XHRzdGFjay5wdXNoKG1ha2VTbmFwc2hvdCgpKTtcblx0XHR9O1xuXG5cdFx0Ly8gQ3JlYXRlIGZpcnN0IHVuZG8gc3RhY2tcblx0XHR0aGlzLnJlY29yZFVuZG8oKTtcblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIGVkaXRpbmcuU3R5bGVcblx0ICpcblx0ICogU3R5bGVcblx0ICpcblx0ICovXG5cdHZhciBTdHlsZSA9IGZ1bmN0aW9uICgpIHtcblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGpRdWVyeUNTU1xuXHRcdCAqXG5cdFx0ICogcGFzc2luZyBhbiBhcnJheSBvZiBzdHlsZSBwcm9wZXJ0aWVzIHRvIC5jc3MoKVxuXHRcdCAqIHdpbGwgcmVzdWx0IGluIGFuIG9iamVjdCBvZiBwcm9wZXJ0eS12YWx1ZSBwYWlycy5cblx0XHQgKiAoY29tcGFiaWxpdHkgd2l0aCB2ZXJzaW9uIDwgMS45KVxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0gIHtqUXVlcnl9ICRvYmpcblx0XHQgKiBAcGFyYW0gIHtBcnJheX0gcHJvcGVydHlOYW1lcyAtIEFuIGFycmF5IG9mIG9uZSBvciBtb3JlIENTUyBwcm9wZXJ0aWVzLlxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKi9cblx0XHR2YXIgalF1ZXJ5Q1NTID0gZnVuY3Rpb24gKCRvYmosIHByb3BlcnR5TmFtZXMpIHtcblx0XHRcdGlmIChhZ2VudC5qcXVlcnlWZXJzaW9uIDwgMS45KSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSB7fTtcblx0XHRcdFx0JC5lYWNoKHByb3BlcnR5TmFtZXMsIGZ1bmN0aW9uIChpZHgsIHByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdHJlc3VsdFtwcm9wZXJ0eU5hbWVdID0gJG9iai5jc3MocHJvcGVydHlOYW1lKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJG9iai5jc3MuY2FsbCgkb2JqLCBwcm9wZXJ0eU5hbWVzKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcGFyYWdyYXBoIGxldmVsIHN0eWxlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1dyYXBwZWRSYW5nZX0gcm5nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHN0eWxlSW5mb1xuXHRcdCAqL1xuXHRcdHRoaXMuc3R5bGVQYXJhID0gZnVuY3Rpb24gKHJuZywgc3R5bGVJbmZvKSB7XG5cdFx0XHQkLmVhY2gocm5nLm5vZGVzKGRvbS5pc1BhcmEsIHtcblx0XHRcdFx0aW5jbHVkZUFuY2VzdG9yOiB0cnVlXG5cdFx0XHR9KSwgZnVuY3Rpb24gKGlkeCwgcGFyYSkge1xuXHRcdFx0XHQkKHBhcmEpLmNzcyhzdHlsZUluZm8pO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGluc2VydCBhbmQgcmV0dXJucyBzdHlsZU5vZGVzIG9uIHJhbmdlLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtXcmFwcGVkUmFuZ2V9IHJuZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBvcHRpb25zIGZvciBzdHlsZU5vZGVzXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm5vZGVOYW1lXSAtIGRlZmF1bHQ6IGBTUEFOYFxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZXhwYW5kQ2xvc2VzdFNpYmxpbmddIC0gZGVmYXVsdDogYGZhbHNlYFxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMub25seVBhcnRpYWxDb250YWluc10gLSBkZWZhdWx0OiBgZmFsc2VgXG5cdFx0ICogQHJldHVybiB7Tm9kZVtdfVxuXHRcdCAqL1xuXHRcdHRoaXMuc3R5bGVOb2RlcyA9IGZ1bmN0aW9uIChybmcsIG9wdGlvbnMpIHtcblx0XHRcdHJuZyA9IHJuZy5zcGxpdFRleHQoKTtcblxuXHRcdFx0dmFyIG5vZGVOYW1lID0gb3B0aW9ucyAmJiBvcHRpb25zLm5vZGVOYW1lIHx8ICdTUEFOJztcblx0XHRcdHZhciBleHBhbmRDbG9zZXN0U2libGluZyA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5leHBhbmRDbG9zZXN0U2libGluZyk7XG5cdFx0XHR2YXIgb25seVBhcnRpYWxDb250YWlucyA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5vbmx5UGFydGlhbENvbnRhaW5zKTtcblxuXHRcdFx0aWYgKHJuZy5pc0NvbGxhcHNlZCgpKSB7XG5cdFx0XHRcdHJldHVybiBybmcuaW5zZXJ0Tm9kZShkb20uY3JlYXRlKG5vZGVOYW1lKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBwcmVkID0gZG9tLm1ha2VQcmVkQnlOb2RlTmFtZShub2RlTmFtZSk7XG5cdFx0XHR2YXIgbm9kZXMgPSAkLm1hcChybmcubm9kZXMoZG9tLmlzVGV4dCwge1xuXHRcdFx0XHRmdWxseUNvbnRhaW5zOiB0cnVlXG5cdFx0XHR9KSwgZnVuY3Rpb24gKHRleHQpIHtcblx0XHRcdFx0cmV0dXJuIGRvbS5zaW5nbGVDaGlsZEFuY2VzdG9yKHRleHQsIHByZWQpIHx8IGRvbS53cmFwKHRleHQsIG5vZGVOYW1lKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoZXhwYW5kQ2xvc2VzdFNpYmxpbmcpIHtcblx0XHRcdFx0aWYgKG9ubHlQYXJ0aWFsQ29udGFpbnMpIHtcblx0XHRcdFx0XHR2YXIgbm9kZXNJblJhbmdlID0gcm5nLm5vZGVzKCk7XG5cdFx0XHRcdFx0Ly8gY29tcG9zZSB3aXRoIHBhcnRpYWwgY29udGFpbnMgcHJlZGljYXRpb25cblx0XHRcdFx0XHRwcmVkID0gZnVuYy5hbmQocHJlZCwgZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBsaXN0LmNvbnRhaW5zKG5vZGVzSW5SYW5nZSwgbm9kZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gJC5tYXAobm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdFx0dmFyIHNpYmxpbmdzID0gZG9tLndpdGhDbG9zZXN0U2libGluZ3Mobm9kZSwgcHJlZCk7XG5cdFx0XHRcdFx0dmFyIGhlYWQgPSBsaXN0LmhlYWQoc2libGluZ3MpO1xuXHRcdFx0XHRcdHZhciB0YWlscyA9IGxpc3QudGFpbChzaWJsaW5ncyk7XG5cdFx0XHRcdFx0JC5lYWNoKHRhaWxzLCBmdW5jdGlvbiAoaWR4LCBlbGVtKSB7XG5cdFx0XHRcdFx0XHRkb20uYXBwZW5kQ2hpbGROb2RlcyhoZWFkLCBlbGVtLmNoaWxkTm9kZXMpO1xuXHRcdFx0XHRcdFx0ZG9tLnJlbW92ZShlbGVtKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm4gbGlzdC5oZWFkKHNpYmxpbmdzKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gbm9kZXM7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGdldCBjdXJyZW50IHN0eWxlIG9uIGN1cnNvclxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtXcmFwcGVkUmFuZ2V9IHJuZ1xuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0IC0gdGFyZ2V0IGVsZW1lbnQgb24gZXZlbnRcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9IC0gb2JqZWN0IGNvbnRhaW5zIHN0eWxlIHByb3BlcnRpZXMuXG5cdFx0ICovXG5cdFx0dGhpcy5jdXJyZW50ID0gZnVuY3Rpb24gKHJuZywgdGFyZ2V0KSB7XG5cdFx0XHR2YXIgJGNvbnQgPSAkKGRvbS5pc1RleHQocm5nLnNjKSA/IHJuZy5zYy5wYXJlbnROb2RlIDogcm5nLnNjKTtcblx0XHRcdHZhciBwcm9wZXJ0aWVzID0gWydmb250LWZhbWlseScsICdmb250LXNpemUnLCAndGV4dC1hbGlnbicsICdsaXN0LXN0eWxlLXR5cGUnLCAnbGluZS1oZWlnaHQnXTtcblx0XHRcdHZhciBzdHlsZUluZm8gPSBqUXVlcnlDU1MoJGNvbnQsIHByb3BlcnRpZXMpIHx8IHt9O1xuXG5cdFx0XHRzdHlsZUluZm9bJ2ZvbnQtc2l6ZSddID0gcGFyc2VJbnQoc3R5bGVJbmZvWydmb250LXNpemUnXSwgMTApO1xuXG5cdFx0XHQvLyBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSBmb3IgdG9nZ2xlIHN0YXRlXG5cdFx0XHRzdHlsZUluZm9bJ2ZvbnQtYm9sZCddID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ2JvbGQnKSA/ICdib2xkJyA6ICdub3JtYWwnO1xuXHRcdFx0c3R5bGVJbmZvWydmb250LWl0YWxpYyddID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpID8gJ2l0YWxpYycgOiAnbm9ybWFsJztcblx0XHRcdHN0eWxlSW5mb1snZm9udC11bmRlcmxpbmUnXSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCd1bmRlcmxpbmUnKSA/ICd1bmRlcmxpbmUnIDogJ25vcm1hbCc7XG5cdFx0XHRzdHlsZUluZm9bJ2ZvbnQtc3RyaWtldGhyb3VnaCddID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3N0cmlrZVRocm91Z2gnKSA/ICdzdHJpa2V0aHJvdWdoJyA6ICdub3JtYWwnO1xuXHRcdFx0c3R5bGVJbmZvWydmb250LXN1cGVyc2NyaXB0J10gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnc3VwZXJzY3JpcHQnKSA/ICdzdXBlcnNjcmlwdCcgOiAnbm9ybWFsJztcblx0XHRcdHN0eWxlSW5mb1snZm9udC1zdWJzY3JpcHQnXSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCdzdWJzY3JpcHQnKSA/ICdzdWJzY3JpcHQnIDogJ25vcm1hbCc7XG5cblx0XHRcdC8vIGxpc3Qtc3R5bGUtdHlwZSB0byBsaXN0LXN0eWxlKHVub3JkZXJlZCwgb3JkZXJlZClcblx0XHRcdGlmICghcm5nLmlzT25MaXN0KCkpIHtcblx0XHRcdFx0c3R5bGVJbmZvWydsaXN0LXN0eWxlJ10gPSAnbm9uZSc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgYU9yZGVyZWRUeXBlID0gWydjaXJjbGUnLCAnZGlzYycsICdkaXNjLWxlYWRpbmctemVybycsICdzcXVhcmUnXTtcblx0XHRcdFx0dmFyIGlzVW5vcmRlcmVkID0gJC5pbkFycmF5KHN0eWxlSW5mb1snbGlzdC1zdHlsZS10eXBlJ10sIGFPcmRlcmVkVHlwZSkgPiAtMTtcblx0XHRcdFx0c3R5bGVJbmZvWydsaXN0LXN0eWxlJ10gPSBpc1Vub3JkZXJlZCA/ICd1bm9yZGVyZWQnIDogJ29yZGVyZWQnO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcGFyYSA9IGRvbS5hbmNlc3Rvcihybmcuc2MsIGRvbS5pc1BhcmEpO1xuXHRcdFx0aWYgKHBhcmEgJiYgcGFyYS5zdHlsZVsnbGluZS1oZWlnaHQnXSkge1xuXHRcdFx0XHRzdHlsZUluZm9bJ2xpbmUtaGVpZ2h0J10gPSBwYXJhLnN0eWxlLmxpbmVIZWlnaHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgbGluZUhlaWdodCA9IHBhcnNlSW50KHN0eWxlSW5mb1snbGluZS1oZWlnaHQnXSwgMTApIC8gcGFyc2VJbnQoc3R5bGVJbmZvWydmb250LXNpemUnXSwgMTApO1xuXHRcdFx0XHRzdHlsZUluZm9bJ2xpbmUtaGVpZ2h0J10gPSBsaW5lSGVpZ2h0LnRvRml4ZWQoMSk7XG5cdFx0XHR9XG5cblx0XHRcdHN0eWxlSW5mby5pbWFnZSA9IGRvbS5pc0ltZyh0YXJnZXQpICYmIHRhcmdldDtcblx0XHRcdHN0eWxlSW5mby5hbmNob3IgPSBybmcuaXNPbkFuY2hvcigpICYmIGRvbS5hbmNlc3Rvcihybmcuc2MsIGRvbS5pc0FuY2hvcik7XG5cdFx0XHRzdHlsZUluZm8uYW5jZXN0b3JzID0gZG9tLmxpc3RBbmNlc3Rvcihybmcuc2MsIGRvbS5pc0VkaXRhYmxlKTtcblx0XHRcdHN0eWxlSW5mby5yYW5nZSA9IHJuZztcblxuXHRcdFx0cmV0dXJuIHN0eWxlSW5mbztcblx0XHR9O1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIEBjbGFzcyBlZGl0aW5nLlR5cGluZ1xuXHQgKlxuXHQgKiBUeXBpbmdcblx0ICpcblx0ICovXG5cdHZhciBUeXBpbmcgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgdGFiXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtXcmFwcGVkUmFuZ2V9IHJuZ1xuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSB0YWJzaXplXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRUYWIgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBybmcsIHRhYnNpemUpIHtcblx0XHRcdHZhciB0YWIgPSBkb20uY3JlYXRlVGV4dChuZXcgQXJyYXkodGFic2l6ZSArIDEpLmpvaW4oZG9tLk5CU1BfQ0hBUikpO1xuXHRcdFx0cm5nID0gcm5nLmRlbGV0ZUNvbnRlbnRzKCk7XG5cdFx0XHRybmcuaW5zZXJ0Tm9kZSh0YWIsIHRydWUpO1xuXG5cdFx0XHRybmcgPSByYW5nZS5jcmVhdGUodGFiLCB0YWJzaXplKTtcblx0XHRcdHJuZy5zZWxlY3QoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaW5zZXJ0IHBhcmFncmFwaFxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0UGFyYWdyYXBoID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpO1xuXG5cdFx0XHQvLyBkZWxldGVDb250ZW50cyBvbiByYW5nZS5cblx0XHRcdHJuZyA9IHJuZy5kZWxldGVDb250ZW50cygpO1xuXG5cdFx0XHQvLyBXcmFwIHJhbmdlIGlmIGl0IG5lZWRzIHRvIGJlIHdyYXBwZWQgYnkgcGFyYWdyYXBoXG5cdFx0XHRybmcgPSBybmcud3JhcEJvZHlJbmxpbmVXaXRoUGFyYSgpO1xuXG5cdFx0XHQvLyBmaW5kaW5nIHBhcmFncmFwaFxuXHRcdFx0dmFyIHNwbGl0Um9vdCA9IGRvbS5hbmNlc3Rvcihybmcuc2MsIGRvbS5pc1BhcmEpO1xuXG5cdFx0XHR2YXIgbmV4dFBhcmE7XG5cdFx0XHQvLyBvbiBwYXJhZ3JhcGg6IHNwbGl0IHBhcmFncmFwaFxuXHRcdFx0aWYgKHNwbGl0Um9vdCkge1xuXHRcdFx0XHRuZXh0UGFyYSA9IGRvbS5zcGxpdFRyZWUoc3BsaXRSb290LCBybmcuZ2V0U3RhcnRQb2ludCgpKTtcblxuXHRcdFx0XHR2YXIgZW1wdHlBbmNob3JzID0gZG9tLmxpc3REZXNjZW5kYW50KHNwbGl0Um9vdCwgZG9tLmlzRW1wdHlBbmNob3IpO1xuXHRcdFx0XHRlbXB0eUFuY2hvcnMgPSBlbXB0eUFuY2hvcnMuY29uY2F0KGRvbS5saXN0RGVzY2VuZGFudChuZXh0UGFyYSwgZG9tLmlzRW1wdHlBbmNob3IpKTtcblxuXHRcdFx0XHQkLmVhY2goZW1wdHlBbmNob3JzLCBmdW5jdGlvbiAoaWR4LCBhbmNob3IpIHtcblx0XHRcdFx0XHRkb20ucmVtb3ZlKGFuY2hvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHQvLyBubyBwYXJhZ3JhcGg6IGluc2VydCBlbXB0eSBwYXJhZ3JhcGhcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBuZXh0ID0gcm5nLnNjLmNoaWxkTm9kZXNbcm5nLnNvXTtcblx0XHRcdFx0bmV4dFBhcmEgPSAkKGRvbS5lbXB0eVBhcmEpWzBdO1xuXHRcdFx0XHRpZiAobmV4dCkge1xuXHRcdFx0XHRcdHJuZy5zYy5pbnNlcnRCZWZvcmUobmV4dFBhcmEsIG5leHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJuZy5zYy5hcHBlbmRDaGlsZChuZXh0UGFyYSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmFuZ2UuY3JlYXRlKG5leHRQYXJhLCAwKS5ub3JtYWxpemUoKS5zZWxlY3QoKTtcblx0XHR9O1xuXG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBlZGl0aW5nLlRhYmxlXG5cdCAqXG5cdCAqIFRhYmxlXG5cdCAqXG5cdCAqL1xuXHR2YXIgVGFibGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0LyoqXG5cdFx0ICogaGFuZGxlIHRhYiBrZXlcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7V3JhcHBlZFJhbmdlfSBybmdcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzU2hpZnRcblx0XHQgKi9cblx0XHR0aGlzLnRhYiA9IGZ1bmN0aW9uIChybmcsIGlzU2hpZnQpIHtcblx0XHRcdHZhciBjZWxsID0gZG9tLmFuY2VzdG9yKHJuZy5jb21tb25BbmNlc3RvcigpLCBkb20uaXNDZWxsKTtcblx0XHRcdHZhciB0YWJsZSA9IGRvbS5hbmNlc3RvcihjZWxsLCBkb20uaXNUYWJsZSk7XG5cdFx0XHR2YXIgY2VsbHMgPSBkb20ubGlzdERlc2NlbmRhbnQodGFibGUsIGRvbS5pc0NlbGwpO1xuXG5cdFx0XHR2YXIgbmV4dENlbGwgPSBsaXN0W2lzU2hpZnQgPyAncHJldicgOiAnbmV4dCddKGNlbGxzLCBjZWxsKTtcblx0XHRcdGlmIChuZXh0Q2VsbCkge1xuXHRcdFx0XHRyYW5nZS5jcmVhdGUobmV4dENlbGwsIDApLnNlbGVjdCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBjcmVhdGUgZW1wdHkgdGFibGUgZWxlbWVudFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHJvd0NvdW50XG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IGNvbENvdW50XG5cdFx0ICogQHJldHVybiB7Tm9kZX1cblx0XHQgKi9cblx0XHR0aGlzLmNyZWF0ZVRhYmxlID0gZnVuY3Rpb24gKGNvbENvdW50LCByb3dDb3VudCkge1xuXHRcdFx0dmFyIHRkcyA9IFtdLCB0ZEhUTUw7XG5cdFx0XHRmb3IgKHZhciBpZHhDb2wgPSAwOyBpZHhDb2wgPCBjb2xDb3VudDsgaWR4Q29sKyspIHtcblx0XHRcdFx0dGRzLnB1c2goJzx0ZD4nICsgZG9tLmJsYW5rICsgJzwvdGQ+Jyk7XG5cdFx0XHR9XG5cdFx0XHR0ZEhUTUwgPSB0ZHMuam9pbignJyk7XG5cblx0XHRcdHZhciB0cnMgPSBbXSwgdHJIVE1MO1xuXHRcdFx0Zm9yICh2YXIgaWR4Um93ID0gMDsgaWR4Um93IDwgcm93Q291bnQ7IGlkeFJvdysrKSB7XG5cdFx0XHRcdHRycy5wdXNoKCc8dHI+JyArIHRkSFRNTCArICc8L3RyPicpO1xuXHRcdFx0fVxuXHRcdFx0dHJIVE1MID0gdHJzLmpvaW4oJycpO1xuXHRcdFx0cmV0dXJuICQoJzx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWJvcmRlcmVkXCI+JyArIHRySFRNTCArICc8L3RhYmxlPicpWzBdO1xuXHRcdH07XG5cdH07XG5cblxuXHQvKipcblx0ICogQGNsYXNzIGVkaXRpbmcuQnVsbGV0XG5cdCAqXG5cdCAqIEBhbHRlcm5hdGVDbGFzc05hbWUgQnVsbGV0XG5cdCAqL1xuXHR2YXIgQnVsbGV0ID0gZnVuY3Rpb24gKCkge1xuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaW5zZXJ0T3JkZXJlZExpc3Rcblx0XHQgKlxuXHRcdCAqIHRvZ2dsZSBvcmRlcmVkIGxpc3Rcblx0XHQgKlxuXHRcdCAqIEB0eXBlIGNvbW1hbmRcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydE9yZGVyZWRMaXN0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dGhpcy50b2dnbGVMaXN0KCdPTCcpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGluc2VydFVub3JkZXJlZExpc3Rcblx0XHQgKlxuXHRcdCAqIHRvZ2dsZSB1bm9yZGVyZWQgbGlzdFxuXHRcdCAqXG5cdFx0ICogQHR5cGUgY29tbWFuZFxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0VW5vcmRlcmVkTGlzdCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHRoaXMudG9nZ2xlTGlzdCgnVUwnKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpbmRlbnRcblx0XHQgKlxuXHRcdCAqIGluZGVudFxuXHRcdCAqXG5cdFx0ICogQHR5cGUgY29tbWFuZFxuXHRcdCAqL1xuXHRcdHRoaXMuaW5kZW50ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpLndyYXBCb2R5SW5saW5lV2l0aFBhcmEoKTtcblxuXHRcdFx0dmFyIHBhcmFzID0gcm5nLm5vZGVzKGRvbS5pc1BhcmEsIHsgaW5jbHVkZUFuY2VzdG9yOiB0cnVlIH0pO1xuXHRcdFx0dmFyIGNsdXN0ZXJlZHMgPSBsaXN0LmNsdXN0ZXJCeShwYXJhcywgZnVuYy5wZXEyKCdwYXJlbnROb2RlJykpO1xuXG5cdFx0XHQkLmVhY2goY2x1c3RlcmVkcywgZnVuY3Rpb24gKGlkeCwgcGFyYXMpIHtcblx0XHRcdFx0dmFyIGhlYWQgPSBsaXN0LmhlYWQocGFyYXMpO1xuXHRcdFx0XHRpZiAoZG9tLmlzTGkoaGVhZCkpIHtcblx0XHRcdFx0XHRzZWxmLndyYXBMaXN0KHBhcmFzLCBoZWFkLnBhcmVudE5vZGUubm9kZU5hbWUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCQuZWFjaChwYXJhcywgZnVuY3Rpb24gKGlkeCwgcGFyYSkge1xuXHRcdFx0XHRcdFx0JChwYXJhKS5jc3MoJ21hcmdpbkxlZnQnLCBmdW5jdGlvbiAoaWR4LCB2YWwpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIChwYXJzZUludCh2YWwsIDEwKSB8fCAwKSArIDI1O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRybmcuc2VsZWN0KCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgb3V0ZGVudFxuXHRcdCAqXG5cdFx0ICogb3V0ZGVudFxuXHRcdCAqXG5cdFx0ICogQHR5cGUgY29tbWFuZFxuXHRcdCAqL1xuXHRcdHRoaXMub3V0ZGVudCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKS53cmFwQm9keUlubGluZVdpdGhQYXJhKCk7XG5cblx0XHRcdHZhciBwYXJhcyA9IHJuZy5ub2Rlcyhkb20uaXNQYXJhLCB7IGluY2x1ZGVBbmNlc3RvcjogdHJ1ZSB9KTtcblx0XHRcdHZhciBjbHVzdGVyZWRzID0gbGlzdC5jbHVzdGVyQnkocGFyYXMsIGZ1bmMucGVxMigncGFyZW50Tm9kZScpKTtcblxuXHRcdFx0JC5lYWNoKGNsdXN0ZXJlZHMsIGZ1bmN0aW9uIChpZHgsIHBhcmFzKSB7XG5cdFx0XHRcdHZhciBoZWFkID0gbGlzdC5oZWFkKHBhcmFzKTtcblx0XHRcdFx0aWYgKGRvbS5pc0xpKGhlYWQpKSB7XG5cdFx0XHRcdFx0c2VsZi5yZWxlYXNlTGlzdChbcGFyYXNdKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkLmVhY2gocGFyYXMsIGZ1bmN0aW9uIChpZHgsIHBhcmEpIHtcblx0XHRcdFx0XHRcdCQocGFyYSkuY3NzKCdtYXJnaW5MZWZ0JywgZnVuY3Rpb24gKGlkeCwgdmFsKSB7XG5cdFx0XHRcdFx0XHRcdHZhbCA9IChwYXJzZUludCh2YWwsIDEwKSB8fCAwKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbCA+IDI1ID8gdmFsIC0gMjUgOiAnJztcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0cm5nLnNlbGVjdCgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHRvZ2dsZUxpc3Rcblx0XHQgKlxuXHRcdCAqIHRvZ2dsZSBsaXN0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbGlzdE5hbWUgLSBPTCBvciBVTFxuXHRcdCAqL1xuXHRcdHRoaXMudG9nZ2xlTGlzdCA9IGZ1bmN0aW9uIChsaXN0TmFtZSkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpLndyYXBCb2R5SW5saW5lV2l0aFBhcmEoKTtcblxuXHRcdFx0dmFyIHBhcmFzID0gcm5nLm5vZGVzKGRvbS5pc1BhcmEsIHsgaW5jbHVkZUFuY2VzdG9yOiB0cnVlIH0pO1xuXHRcdFx0dmFyIGJvb2ttYXJrID0gcm5nLnBhcmFCb29rbWFyayhwYXJhcyk7XG5cdFx0XHR2YXIgY2x1c3RlcmVkcyA9IGxpc3QuY2x1c3RlckJ5KHBhcmFzLCBmdW5jLnBlcTIoJ3BhcmVudE5vZGUnKSk7XG5cblx0XHRcdC8vIHBhcmFncmFwaCB0byBsaXN0XG5cdFx0XHRpZiAobGlzdC5maW5kKHBhcmFzLCBkb20uaXNQdXJlUGFyYSkpIHtcblx0XHRcdFx0dmFyIHdyYXBwZWRQYXJhcyA9IFtdO1xuXHRcdFx0XHQkLmVhY2goY2x1c3RlcmVkcywgZnVuY3Rpb24gKGlkeCwgcGFyYXMpIHtcblx0XHRcdFx0XHR3cmFwcGVkUGFyYXMgPSB3cmFwcGVkUGFyYXMuY29uY2F0KHNlbGYud3JhcExpc3QocGFyYXMsIGxpc3ROYW1lKSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRwYXJhcyA9IHdyYXBwZWRQYXJhcztcblx0XHRcdFx0Ly8gbGlzdCB0byBwYXJhZ3JhcGggb3IgY2hhbmdlIGxpc3Qgc3R5bGVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBkaWZmTGlzdHMgPSBybmcubm9kZXMoZG9tLmlzTGlzdCwge1xuXHRcdFx0XHRcdGluY2x1ZGVBbmNlc3RvcjogdHJ1ZVxuXHRcdFx0XHR9KS5maWx0ZXIoZnVuY3Rpb24gKGxpc3ROb2RlKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEkLm5vZGVOYW1lKGxpc3ROb2RlLCBsaXN0TmFtZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChkaWZmTGlzdHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0JC5lYWNoKGRpZmZMaXN0cywgZnVuY3Rpb24gKGlkeCwgbGlzdE5vZGUpIHtcblx0XHRcdFx0XHRcdGRvbS5yZXBsYWNlKGxpc3ROb2RlLCBsaXN0TmFtZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cGFyYXMgPSB0aGlzLnJlbGVhc2VMaXN0KGNsdXN0ZXJlZHMsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJhbmdlLmNyZWF0ZUZyb21QYXJhQm9va21hcmsoYm9va21hcmssIHBhcmFzKS5zZWxlY3QoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCB3cmFwTGlzdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlW119IHBhcmFzXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGxpc3ROYW1lXG5cdFx0ICogQHJldHVybiB7Tm9kZVtdfVxuXHRcdCAqL1xuXHRcdHRoaXMud3JhcExpc3QgPSBmdW5jdGlvbiAocGFyYXMsIGxpc3ROYW1lKSB7XG5cdFx0XHR2YXIgaGVhZCA9IGxpc3QuaGVhZChwYXJhcyk7XG5cdFx0XHR2YXIgbGFzdCA9IGxpc3QubGFzdChwYXJhcyk7XG5cblx0XHRcdHZhciBwcmV2TGlzdCA9IGRvbS5pc0xpc3QoaGVhZC5wcmV2aW91c1NpYmxpbmcpICYmIGhlYWQucHJldmlvdXNTaWJsaW5nO1xuXHRcdFx0dmFyIG5leHRMaXN0ID0gZG9tLmlzTGlzdChsYXN0Lm5leHRTaWJsaW5nKSAmJiBsYXN0Lm5leHRTaWJsaW5nO1xuXG5cdFx0XHR2YXIgbGlzdE5vZGUgPSBwcmV2TGlzdCB8fCBkb20uaW5zZXJ0QWZ0ZXIoZG9tLmNyZWF0ZShsaXN0TmFtZSB8fCAnVUwnKSwgbGFzdCk7XG5cblx0XHRcdC8vIFAgdG8gTElcblx0XHRcdHBhcmFzID0gJC5tYXAocGFyYXMsIGZ1bmN0aW9uIChwYXJhKSB7XG5cdFx0XHRcdHJldHVybiBkb20uaXNQdXJlUGFyYShwYXJhKSA/IGRvbS5yZXBsYWNlKHBhcmEsICdMSScpIDogcGFyYTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBhcHBlbmQgdG8gbGlzdCg8dWw+LCA8b2w+KVxuXHRcdFx0ZG9tLmFwcGVuZENoaWxkTm9kZXMobGlzdE5vZGUsIHBhcmFzKTtcblxuXHRcdFx0aWYgKG5leHRMaXN0KSB7XG5cdFx0XHRcdGRvbS5hcHBlbmRDaGlsZE5vZGVzKGxpc3ROb2RlLCBsaXN0LmZyb20obmV4dExpc3QuY2hpbGROb2RlcykpO1xuXHRcdFx0XHRkb20ucmVtb3ZlKG5leHRMaXN0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHBhcmFzO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHJlbGVhc2VMaXN0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5W119IGNsdXN0ZXJlZHNcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRXNjYXBzZVRvQm9keVxuXHRcdCAqIEByZXR1cm4ge05vZGVbXX1cblx0XHQgKi9cblx0XHR0aGlzLnJlbGVhc2VMaXN0ID0gZnVuY3Rpb24gKGNsdXN0ZXJlZHMsIGlzRXNjYXBzZVRvQm9keSkge1xuXHRcdFx0dmFyIHJlbGVhc2VkUGFyYXMgPSBbXTtcblxuXHRcdFx0JC5lYWNoKGNsdXN0ZXJlZHMsIGZ1bmN0aW9uIChpZHgsIHBhcmFzKSB7XG5cdFx0XHRcdHZhciBoZWFkID0gbGlzdC5oZWFkKHBhcmFzKTtcblx0XHRcdFx0dmFyIGxhc3QgPSBsaXN0Lmxhc3QocGFyYXMpO1xuXG5cdFx0XHRcdHZhciBoZWFkTGlzdCA9IGlzRXNjYXBzZVRvQm9keSA/IGRvbS5sYXN0QW5jZXN0b3IoaGVhZCwgZG9tLmlzTGlzdCkgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IGhlYWQucGFyZW50Tm9kZTtcblx0XHRcdFx0dmFyIGxhc3RMaXN0ID0gaGVhZExpc3QuY2hpbGROb2Rlcy5sZW5ndGggPiAxID8gZG9tLnNwbGl0VHJlZShoZWFkTGlzdCwge1xuXHRcdFx0XHRcdG5vZGU6IGxhc3QucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRvZmZzZXQ6IGRvbS5wb3NpdGlvbihsYXN0KSArIDFcblx0XHRcdFx0fSwgdHJ1ZSkgOiBudWxsO1xuXG5cdFx0XHRcdHZhciBtaWRkbGVMaXN0ID0gZG9tLnNwbGl0VHJlZShoZWFkTGlzdCwge1xuXHRcdFx0XHRcdG5vZGU6IGhlYWQucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRvZmZzZXQ6IGRvbS5wb3NpdGlvbihoZWFkKVxuXHRcdFx0XHR9LCB0cnVlKTtcblxuXHRcdFx0XHRwYXJhcyA9IGlzRXNjYXBzZVRvQm9keSA/IGRvbS5saXN0RGVzY2VuZGFudChtaWRkbGVMaXN0LCBkb20uaXNMaSkgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQgIGxpc3QuZnJvbShtaWRkbGVMaXN0LmNoaWxkTm9kZXMpLmZpbHRlcihkb20uaXNMaSk7XG5cblx0XHRcdFx0Ly8gTEkgdG8gUFxuXHRcdFx0XHRpZiAoaXNFc2NhcHNlVG9Cb2R5IHx8ICFkb20uaXNMaXN0KGhlYWRMaXN0LnBhcmVudE5vZGUpKSB7XG5cdFx0XHRcdFx0cGFyYXMgPSAkLm1hcChwYXJhcywgZnVuY3Rpb24gKHBhcmEpIHtcblx0XHRcdFx0XHRcdHJldHVybiBkb20ucmVwbGFjZShwYXJhLCAnUCcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0JC5lYWNoKGxpc3QuZnJvbShwYXJhcykucmV2ZXJzZSgpLCBmdW5jdGlvbiAoaWR4LCBwYXJhKSB7XG5cdFx0XHRcdFx0ZG9tLmluc2VydEFmdGVyKHBhcmEsIGhlYWRMaXN0KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gcmVtb3ZlIGVtcHR5IGxpc3RzXG5cdFx0XHRcdHZhciByb290TGlzdHMgPSBsaXN0LmNvbXBhY3QoW2hlYWRMaXN0LCBtaWRkbGVMaXN0LCBsYXN0TGlzdF0pO1xuXHRcdFx0XHQkLmVhY2gocm9vdExpc3RzLCBmdW5jdGlvbiAoaWR4LCByb290TGlzdCkge1xuXHRcdFx0XHRcdHZhciBsaXN0Tm9kZXMgPSBbcm9vdExpc3RdLmNvbmNhdChkb20ubGlzdERlc2NlbmRhbnQocm9vdExpc3QsIGRvbS5pc0xpc3QpKTtcblx0XHRcdFx0XHQkLmVhY2gobGlzdE5vZGVzLnJldmVyc2UoKSwgZnVuY3Rpb24gKGlkeCwgbGlzdE5vZGUpIHtcblx0XHRcdFx0XHRcdGlmICghZG9tLm5vZGVMZW5ndGgobGlzdE5vZGUpKSB7XG5cdFx0XHRcdFx0XHRcdGRvbS5yZW1vdmUobGlzdE5vZGUsIHRydWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZWxlYXNlZFBhcmFzID0gcmVsZWFzZWRQYXJhcy5jb25jYXQocGFyYXMpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiByZWxlYXNlZFBhcmFzO1xuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBlZGl0aW5nLkVkaXRvclxuXHQgKlxuXHQgKiBFZGl0b3Jcblx0ICpcblx0ICovXG5cdHZhciBFZGl0b3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3R5bGUgPSBuZXcgU3R5bGUoKTtcblx0XHR2YXIgdGFibGUgPSBuZXcgVGFibGUoKTtcblx0XHR2YXIgdHlwaW5nID0gbmV3IFR5cGluZygpO1xuXHRcdHZhciBidWxsZXQgPSBuZXcgQnVsbGV0KCk7XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGNyZWF0ZVJhbmdlXG5cdFx0ICpcblx0XHQgKiBjcmVhdGUgcmFuZ2Vcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0ICovXG5cdFx0dGhpcy5jcmVhdGVSYW5nZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXHRcdFx0cmV0dXJuIHJhbmdlLmNyZWF0ZSgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHNhdmVSYW5nZVxuXHRcdCAqXG5cdFx0ICogc2F2ZSBjdXJyZW50IHJhbmdlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbdGhlbkNvbGxhcHNlPWZhbHNlXVxuXHRcdCAqL1xuXHRcdHRoaXMuc2F2ZVJhbmdlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdGhlbkNvbGxhcHNlKSB7XG5cdFx0XHQkZWRpdGFibGUuZm9jdXMoKTtcblx0XHRcdCRlZGl0YWJsZS5kYXRhKCdyYW5nZScsIHJhbmdlLmNyZWF0ZSgpKTtcblx0XHRcdGlmICh0aGVuQ29sbGFwc2UpIHtcblx0XHRcdFx0cmFuZ2UuY3JlYXRlKCkuY29sbGFwc2UoKS5zZWxlY3QoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBzYXZlUmFuZ2Vcblx0XHQgKlxuXHRcdCAqIHNhdmUgY3VycmVudCBub2RlIGxpc3QgdG8gJGVkaXRhYmxlLmRhdGEoJ2NoaWxkTm9kZXMnKVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMuc2F2ZU5vZGUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHQvLyBjb3B5IGNoaWxkIG5vZGUgcmVmZXJlbmNlXG5cdFx0XHR2YXIgY29weSA9IFtdO1xuXHRcdFx0Zm9yICh2YXIga2V5ID0gMCwgbGVuID0gJGVkaXRhYmxlWzBdLmNoaWxkTm9kZXMubGVuZ3RoOyBrZXkgPCBsZW47IGtleSsrKSB7XG5cdFx0XHRcdGNvcHkucHVzaCgkZWRpdGFibGVbMF0uY2hpbGROb2Rlc1trZXldKTtcblx0XHRcdH1cblx0XHRcdCRlZGl0YWJsZS5kYXRhKCdjaGlsZE5vZGVzJywgY29weSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVzdG9yZVJhbmdlXG5cdFx0ICpcblx0XHQgKiByZXN0b3JlIGxhdGVseSByYW5nZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMucmVzdG9yZVJhbmdlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0dmFyIHJuZyA9ICRlZGl0YWJsZS5kYXRhKCdyYW5nZScpO1xuXHRcdFx0aWYgKHJuZykge1xuXHRcdFx0XHRybmcuc2VsZWN0KCk7XG5cdFx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHJlc3RvcmVOb2RlXG5cdFx0ICpcblx0XHQgKiByZXN0b3JlIGxhdGVseSBub2RlIGxpc3Rcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLnJlc3RvcmVOb2RlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0JGVkaXRhYmxlLmh0bWwoJycpO1xuXHRcdFx0dmFyIGNoaWxkID0gJGVkaXRhYmxlLmRhdGEoJ2NoaWxkTm9kZXMnKTtcblx0XHRcdGZvciAodmFyIGluZGV4ID0gMCwgbGVuID0gY2hpbGQubGVuZ3RoOyBpbmRleCA8IGxlbjsgaW5kZXgrKykge1xuXHRcdFx0XHQkZWRpdGFibGVbMF0uYXBwZW5kQ2hpbGQoY2hpbGRbaW5kZXhdKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgY3VycmVudFN0eWxlXG5cdFx0ICpcblx0XHQgKiBjdXJyZW50IHN0eWxlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59IGZhbHNlIGlmIHJhbmdlIGlzIG5vXG5cdFx0ICovXG5cdFx0dGhpcy5jdXJyZW50U3R5bGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCk7XG5cdFx0XHRyZXR1cm4gcm5nID8gcm5nLmlzT25FZGl0YWJsZSgpICYmIHN0eWxlLmN1cnJlbnQocm5nLCB0YXJnZXQpIDogZmFsc2U7XG5cdFx0fTtcblxuXHRcdHZhciB0cmlnZ2VyT25CZWZvcmVDaGFuZ2UgPSB0aGlzLnRyaWdnZXJPbkJlZm9yZUNoYW5nZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdHZhciBvbkJlZm9yZUNoYW5nZSA9ICRlZGl0YWJsZS5kYXRhKCdjYWxsYmFja3MnKS5vbkJlZm9yZUNoYW5nZTtcblx0XHRcdGlmIChvbkJlZm9yZUNoYW5nZSkge1xuXHRcdFx0XHRvbkJlZm9yZUNoYW5nZSgkZWRpdGFibGUuaHRtbCgpLCAkZWRpdGFibGUpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgdHJpZ2dlck9uQ2hhbmdlID0gdGhpcy50cmlnZ2VyT25DaGFuZ2UgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHR2YXIgb25DaGFuZ2UgPSAkZWRpdGFibGUuZGF0YSgnY2FsbGJhY2tzJykub25DaGFuZ2U7XG5cdFx0XHRpZiAob25DaGFuZ2UpIHtcblx0XHRcdFx0b25DaGFuZ2UoJGVkaXRhYmxlLmh0bWwoKSwgJGVkaXRhYmxlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCB1bmRvXG5cdFx0ICogdW5kb1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLnVuZG8gPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHR0cmlnZ2VyT25CZWZvcmVDaGFuZ2UoJGVkaXRhYmxlKTtcblx0XHRcdCRlZGl0YWJsZS5kYXRhKCdOb3RlSGlzdG9yeScpLnVuZG8oKTtcblx0XHRcdHRyaWdnZXJPbkNoYW5nZSgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHJlZG9cblx0XHQgKiByZWRvXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMucmVkbyA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdHRyaWdnZXJPbkJlZm9yZUNoYW5nZSgkZWRpdGFibGUpO1xuXHRcdFx0JGVkaXRhYmxlLmRhdGEoJ05vdGVIaXN0b3J5JykucmVkbygpO1xuXHRcdFx0dHJpZ2dlck9uQ2hhbmdlKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgYmVmb3JlQ29tbWFuZFxuXHRcdCAqIGJlZm9yZSBjb21tYW5kXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHZhciBiZWZvcmVDb21tYW5kID0gdGhpcy5iZWZvcmVDb21tYW5kID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0dHJpZ2dlck9uQmVmb3JlQ2hhbmdlKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgYWZ0ZXJDb21tYW5kXG5cdFx0ICogYWZ0ZXIgY29tbWFuZFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR2YXIgYWZ0ZXJDb21tYW5kID0gdGhpcy5hZnRlckNvbW1hbmQgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHQkZWRpdGFibGUuZGF0YSgnTm90ZUhpc3RvcnknKS5yZWNvcmRVbmRvKCk7XG5cdFx0XHR0cmlnZ2VyT25DaGFuZ2UoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBib2xkXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGl0YWxpY1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCB1bmRlcmxpbmVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgc3RyaWtldGhyb3VnaFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBmb3JtYXRCbG9ja1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBzdXBlcnNjcmlwdFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBzdWJzY3JpcHRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QganVzdGlmeUxlZnRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QganVzdGlmeUNlbnRlclxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBqdXN0aWZ5UmlnaHRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QganVzdGlmeUZ1bGxcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgZm9ybWF0QmxvY2tcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVtb3ZlRm9ybWF0XG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGJhY2tDb2xvclxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBmb3JlQ29sb3Jcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaW5zZXJ0SG9yaXpvbnRhbFJ1bGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgZm9udE5hbWVcblx0XHQgKlxuXHRcdCAqIGNoYW5nZSBmb250IG5hbWVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuXHRcdC8vIG5hdGl2ZSBjb21tYW5kcyh3aXRoIGV4ZWNDb21tYW5kKSwgZ2VuZXJhdGUgZnVuY3Rpb24gZm9yIGV4ZWNDb21tYW5kXG5cdFx0dmFyIGNvbW1hbmRzID0gWydib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnc3RyaWtldGhyb3VnaCcsICdzdXBlcnNjcmlwdCcsICdzdWJzY3JpcHQnLFxuXHRcdFx0XHRcdFx0J2p1c3RpZnlMZWZ0JywgJ2p1c3RpZnlDZW50ZXInLCAnanVzdGlmeVJpZ2h0JywgJ2p1c3RpZnlGdWxsJyxcblx0XHRcdFx0XHRcdCdmb3JtYXRCbG9jaycsICdyZW1vdmVGb3JtYXQnLFxuXHRcdFx0XHRcdFx0J2JhY2tDb2xvcicsICdmb3JlQ29sb3InLCAnaW5zZXJ0SG9yaXpvbnRhbFJ1bGUnLCAnZm9udE5hbWUnXTtcblxuXHRcdGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGNvbW1hbmRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuXHRcdFx0dGhpc1tjb21tYW5kc1tpZHhdXSA9IChmdW5jdGlvbiAoc0NtZCkge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdmFsdWUpIHtcblx0XHRcdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cblx0XHRcdFx0XHRkb2N1bWVudC5leGVjQ29tbWFuZChzQ21kLCBmYWxzZSwgdmFsdWUpO1xuXG5cdFx0XHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9KShjb21tYW5kc1tpZHhdKTtcblx0XHR9XG5cdFx0LyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgdGFiXG5cdFx0ICpcblx0XHQgKiBoYW5kbGUgdGFiIGtleVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICovXG5cdFx0dGhpcy50YWIgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCk7XG5cdFx0XHRpZiAocm5nLmlzQ29sbGFwc2VkKCkgJiYgcm5nLmlzT25DZWxsKCkpIHtcblx0XHRcdFx0dGFibGUudGFiKHJuZyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRcdHR5cGluZy5pbnNlcnRUYWIoJGVkaXRhYmxlLCBybmcsIG9wdGlvbnMudGFic2l6ZSk7XG5cdFx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHVudGFiXG5cdFx0ICpcblx0XHQgKiBoYW5kbGUgc2hpZnQrdGFiIGtleVxuXHRcdCAqXG5cdFx0ICovXG5cdFx0dGhpcy51bnRhYiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKTtcblx0XHRcdGlmIChybmcuaXNDb2xsYXBzZWQoKSAmJiBybmcuaXNPbkNlbGwoKSkge1xuXHRcdFx0XHR0YWJsZS50YWIocm5nLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpbnNlcnRQYXJhZ3JhcGhcblx0XHQgKlxuXHRcdCAqIGluc2VydCBwYXJhZ3JhcGhcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRQYXJhZ3JhcGggPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHR0eXBpbmcuaW5zZXJ0UGFyYWdyYXBoKCRlZGl0YWJsZSk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpbnNlcnRPcmRlcmVkTGlzdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0T3JkZXJlZExpc3QgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRidWxsZXQuaW5zZXJ0T3JkZXJlZExpc3QoJGVkaXRhYmxlKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRVbm9yZGVyZWRMaXN0ID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0YnVsbGV0Lmluc2VydFVub3JkZXJlZExpc3QoJGVkaXRhYmxlKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5pbmRlbnQgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRidWxsZXQuaW5kZW50KCRlZGl0YWJsZSk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMub3V0ZGVudCA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdGJ1bGxldC5vdXRkZW50KCRlZGl0YWJsZSk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaW5zZXJ0IGltYWdlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHNVcmxcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydEltYWdlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgc1VybCwgZmlsZW5hbWUpIHtcblx0XHRcdGFzeW5jLmNyZWF0ZUltYWdlKHNVcmwsIGZpbGVuYW1lKS50aGVuKGZ1bmN0aW9uICgkaW1hZ2UpIHtcblx0XHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0XHQkaW1hZ2UuY3NzKHtcblx0XHRcdFx0XHRkaXNwbGF5OiAnJyxcblx0XHRcdFx0XHR3aWR0aDogTWF0aC5taW4oJGVkaXRhYmxlLndpZHRoKCksICRpbWFnZS53aWR0aCgpKVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmFuZ2UuY3JlYXRlKCkuaW5zZXJ0Tm9kZSgkaW1hZ2VbMF0pO1xuXHRcdFx0XHRyYW5nZS5jcmVhdGVGcm9tTm9kZSgkaW1hZ2VbMF0pLmNvbGxhcHNlKCkuc2VsZWN0KCk7XG5cdFx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0fSkuZmFpbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBjYWxsYmFja3MgPSAkZWRpdGFibGUuZGF0YSgnY2FsbGJhY2tzJyk7XG5cdFx0XHRcdGlmIChjYWxsYmFja3Mub25JbWFnZVVwbG9hZEVycm9yKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWRFcnJvcigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpbnNlcnROb2RlXG5cdFx0ICogaW5zZXJ0IG5vZGVcblx0XHQgKiBAcGFyYW0ge05vZGV9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0Tm9kZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIG5vZGUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdHZhciBybmcgPSB0aGlzLmNyZWF0ZVJhbmdlKCRlZGl0YWJsZSk7XG5cdFx0XHRybmcuaW5zZXJ0Tm9kZShub2RlKTtcblx0XHRcdHJhbmdlLmNyZWF0ZUZyb21Ob2RlKG5vZGUpLmNvbGxhcHNlKCkuc2VsZWN0KCk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaW5zZXJ0IHRleHRcblx0XHQgKiBAcGFyYW0ge05vZGV9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0XG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRUZXh0ID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdGV4dCkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0dmFyIHJuZyA9IHRoaXMuY3JlYXRlUmFuZ2UoJGVkaXRhYmxlKTtcblx0XHRcdHZhciB0ZXh0Tm9kZSA9IHJuZy5pbnNlcnROb2RlKGRvbS5jcmVhdGVUZXh0KHRleHQpKTtcblx0XHRcdHJhbmdlLmNyZWF0ZSh0ZXh0Tm9kZSwgZG9tLm5vZGVMZW5ndGgodGV4dE5vZGUpKS5zZWxlY3QoKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBmb3JtYXRCbG9ja1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB0YWdOYW1lXG5cdFx0ICovXG5cdFx0dGhpcy5mb3JtYXRCbG9jayA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHRhZ05hbWUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdHRhZ05hbWUgPSBhZ2VudC5pc01TSUUgPyAnPCcgKyB0YWdOYW1lICsgJz4nIDogdGFnTmFtZTtcblx0XHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKCdGb3JtYXRCbG9jaycsIGZhbHNlLCB0YWdOYW1lKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHR0aGlzLmZvcm1hdFBhcmEgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHR0aGlzLmZvcm1hdEJsb2NrKCRlZGl0YWJsZSwgJ1AnKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdFx0Zm9yICh2YXIgaWR4ID0gMTsgaWR4IDw9IDY7IGlkeCsrKSB7XG5cdFx0XHR0aGlzWydmb3JtYXRIJyArIGlkeF0gPSBmdW5jdGlvbiAoaWR4KSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHRcdFx0dGhpcy5mb3JtYXRCbG9jaygkZWRpdGFibGUsICdIJyArIGlkeCk7XG5cdFx0XHRcdH07XG5cdFx0XHR9KGlkeCk7XG5cdFx0fTtcblx0XHQvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogZm9udHNpemVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgLSBweFxuXHRcdCAqL1xuXHRcdHRoaXMuZm9udFNpemUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB2YWx1ZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXG5cdFx0XHR2YXIgcm5nID0gdGhpcy5jcmVhdGVSYW5nZSgkZWRpdGFibGUpO1xuXHRcdFx0dmFyIHNwYW5zID0gc3R5bGUuc3R5bGVOb2RlcyhybmcpO1xuXHRcdFx0JC5lYWNoKHNwYW5zLCBmdW5jdGlvbiAoaWR4LCBzcGFuKSB7XG5cdFx0XHRcdCQoc3BhbikuY3NzKHtcblx0XHRcdFx0XHQnZm9udC1zaXplJzogdmFsdWUgKyAncHgnXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBsaW5lSGVpZ2h0XG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuXHRcdCAqL1xuXHRcdHRoaXMubGluZUhlaWdodCA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHZhbHVlKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRzdHlsZS5zdHlsZVBhcmEocmFuZ2UuY3JlYXRlKCksIHtcblx0XHRcdFx0bGluZUhlaWdodDogdmFsdWVcblx0XHRcdH0pO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHVubGlua1xuXHRcdCAqXG5cdFx0ICogQHR5cGUgY29tbWFuZFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMudW5saW5rID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpO1xuXHRcdFx0aWYgKHJuZy5pc09uQW5jaG9yKCkpIHtcblx0XHRcdFx0dmFyIGFuY2hvciA9IGRvbS5hbmNlc3Rvcihybmcuc2MsIGRvbS5pc0FuY2hvcik7XG5cdFx0XHRcdHJuZyA9IHJhbmdlLmNyZWF0ZUZyb21Ob2RlKGFuY2hvcik7XG5cdFx0XHRcdHJuZy5zZWxlY3QoKTtcblxuXHRcdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKCd1bmxpbmsnKTtcblx0XHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNyZWF0ZSBsaW5rIChjb21tYW5kKVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsaW5rSW5mb1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICovXG5cdFx0dGhpcy5jcmVhdGVMaW5rID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgbGlua0luZm8sIG9wdGlvbnMpIHtcblx0XHRcdHZhciBsaW5rVXJsID0gbGlua0luZm8udXJsO1xuXHRcdFx0dmFyIGxpbmtUZXh0ID0gbGlua0luZm8udGV4dDtcblx0XHRcdHZhciBpc05ld1dpbmRvdyA9IGxpbmtJbmZvLm5ld1dpbmRvdztcblx0XHRcdHZhciBybmcgPSBsaW5rSW5mby5yYW5nZTtcblx0XHRcdHZhciBpc1RleHRDaGFuZ2VkID0gcm5nLnRvU3RyaW5nKCkgIT09IGxpbmtUZXh0O1xuXG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cblx0XHRcdGlmIChvcHRpb25zLm9uQ3JlYXRlTGluaykge1xuXHRcdFx0XHRsaW5rVXJsID0gb3B0aW9ucy5vbkNyZWF0ZUxpbmsobGlua1VybCk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBhbmNob3JzO1xuXHRcdFx0aWYgKGlzVGV4dENoYW5nZWQpIHtcblx0XHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IGxpbmsgd2hlbiB0ZXh0IGNoYW5nZWQuXG5cdFx0XHRcdHZhciBhbmNob3IgPSBybmcuaW5zZXJ0Tm9kZSgkKCc8QT4nICsgbGlua1RleHQgKyAnPC9BPicpWzBdKTtcblx0XHRcdFx0YW5jaG9ycyA9IFthbmNob3JdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YW5jaG9ycyA9IHN0eWxlLnN0eWxlTm9kZXMocm5nLCB7XG5cdFx0XHRcdFx0bm9kZU5hbWU6ICdBJyxcblx0XHRcdFx0XHRleHBhbmRDbG9zZXN0U2libGluZzogdHJ1ZSxcblx0XHRcdFx0XHRvbmx5UGFydGlhbENvbnRhaW5zOiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQkLmVhY2goYW5jaG9ycywgZnVuY3Rpb24gKGlkeCwgYW5jaG9yKSB7XG5cdFx0XHRcdCQoYW5jaG9yKS5hdHRyKCdocmVmJywgbGlua1VybCk7XG5cdFx0XHRcdGlmIChpc05ld1dpbmRvdykge1xuXHRcdFx0XHRcdCQoYW5jaG9yKS5hdHRyKCd0YXJnZXQnLCAnX2JsYW5rJyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JChhbmNob3IpLnJlbW92ZUF0dHIoJ3RhcmdldCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0dmFyIHN0YXJ0UmFuZ2UgPSByYW5nZS5jcmVhdGVGcm9tTm9kZShsaXN0LmhlYWQoYW5jaG9ycykpLmNvbGxhcHNlKHRydWUpO1xuXHRcdFx0dmFyIHN0YXJ0UG9pbnQgPSBzdGFydFJhbmdlLmdldFN0YXJ0UG9pbnQoKTtcblx0XHRcdHZhciBlbmRSYW5nZSA9IHJhbmdlLmNyZWF0ZUZyb21Ob2RlKGxpc3QubGFzdChhbmNob3JzKSkuY29sbGFwc2UoKTtcblx0XHRcdHZhciBlbmRQb2ludCA9IGVuZFJhbmdlLmdldEVuZFBvaW50KCk7XG5cblx0XHRcdHJhbmdlLmNyZWF0ZShcblx0XHRcdCAgc3RhcnRQb2ludC5ub2RlLFxuXHRcdFx0ICBzdGFydFBvaW50Lm9mZnNldCxcblx0XHRcdCAgZW5kUG9pbnQubm9kZSxcblx0XHRcdCAgZW5kUG9pbnQub2Zmc2V0XG5cdFx0XHQpLnNlbGVjdCgpO1xuXG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBsaW5rIGluZm9cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9IHJldHVybi5yYW5nZVxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJuLnRleHRcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufSBbcmV0dXJuLmlzTmV3V2luZG93PXRydWVdXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfSBbcmV0dXJuLnVybD1cIlwiXVxuXHRcdCAqL1xuXHRcdHRoaXMuZ2V0TGlua0luZm8gPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHQkZWRpdGFibGUuZm9jdXMoKTtcblxuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpLmV4cGFuZChkb20uaXNBbmNob3IpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIGZpcnN0IGFuY2hvciBvbiByYW5nZShmb3IgZWRpdCkuXG5cdFx0XHR2YXIgJGFuY2hvciA9ICQobGlzdC5oZWFkKHJuZy5ub2Rlcyhkb20uaXNBbmNob3IpKSk7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJhbmdlOiBybmcsXG5cdFx0XHRcdHRleHQ6IHJuZy50b1N0cmluZygpLFxuXHRcdFx0XHRpc05ld1dpbmRvdzogJGFuY2hvci5sZW5ndGggPyAkYW5jaG9yLmF0dHIoJ3RhcmdldCcpID09PSAnX2JsYW5rJyA6IGZhbHNlLFxuXHRcdFx0XHR1cmw6ICRhbmNob3IubGVuZ3RoID8gJGFuY2hvci5hdHRyKCdocmVmJykgOiAnJ1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogc2V0dGluZyBjb2xvclxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc09iakNvbG9yICBjb2xvciBjb2RlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHNPYmpDb2xvci5mb3JlQ29sb3IgZm9yZWdyb3VuZCBjb2xvclxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBzT2JqQ29sb3IuYmFja0NvbG9yIGJhY2tncm91bmQgY29sb3Jcblx0XHQgKi9cblx0XHR0aGlzLmNvbG9yID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgc09iakNvbG9yKSB7XG5cdFx0XHR2YXIgb0NvbG9yID0gSlNPTi5wYXJzZShzT2JqQ29sb3IpO1xuXHRcdFx0dmFyIGZvcmVDb2xvciA9IG9Db2xvci5mb3JlQ29sb3IsIGJhY2tDb2xvciA9IG9Db2xvci5iYWNrQ29sb3I7XG5cblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblxuXHRcdFx0aWYgKGZvcmVDb2xvcikgeyBkb2N1bWVudC5leGVjQ29tbWFuZCgnZm9yZUNvbG9yJywgZmFsc2UsIGZvcmVDb2xvcik7IH1cblx0XHRcdGlmIChiYWNrQ29sb3IpIHsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2JhY2tDb2xvcicsIGZhbHNlLCBiYWNrQ29sb3IpOyB9XG5cblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgVGFibGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHNEaW0gZGltZW5zaW9uIG9mIHRhYmxlIChleCA6IFwiNXg1XCIpXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRUYWJsZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHNEaW0pIHtcblx0XHRcdHZhciBkaW1lbnNpb24gPSBzRGltLnNwbGl0KCd4Jyk7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKTtcblx0XHRcdHJuZyA9IHJuZy5kZWxldGVDb250ZW50cygpO1xuXHRcdFx0cm5nLmluc2VydE5vZGUodGFibGUuY3JlYXRlVGFibGUoZGltZW5zaW9uWzBdLCBkaW1lbnNpb25bMV0pKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBmbG9hdCBtZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkdGFyZ2V0XG5cdFx0ICovXG5cdFx0dGhpcy5mbG9hdE1lID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdmFsdWUsICR0YXJnZXQpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdCR0YXJnZXQuY3NzKCdmbG9hdCcsIHZhbHVlKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBjaGFuZ2UgaW1hZ2Ugc2hhcGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgY3NzIGNsYXNzXG5cdFx0ICogQHBhcmFtIHtOb2RlfSAkdGFyZ2V0XG5cdFx0ICovXG5cdFx0dGhpcy5pbWFnZVNoYXBlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdmFsdWUsICR0YXJnZXQpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblxuXHRcdFx0JHRhcmdldC5yZW1vdmVDbGFzcygnaW1nLXJvdW5kZWQgaW1nLWNpcmNsZSBpbWctdGh1bWJuYWlsJyk7XG5cblx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHQkdGFyZ2V0LmFkZENsYXNzKHZhbHVlKTtcblx0XHRcdH1cblxuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJlc2l6ZSBvdmVybGF5IGVsZW1lbnRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICR0YXJnZXQgLSB0YXJnZXQgZWxlbWVudFxuXHRcdCAqL1xuXHRcdHRoaXMucmVzaXplID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdmFsdWUsICR0YXJnZXQpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblxuXHRcdFx0JHRhcmdldC5jc3Moe1xuXHRcdFx0XHR3aWR0aDogdmFsdWUgKiAxMDAgKyAnJScsXG5cdFx0XHRcdGhlaWdodDogJydcblx0XHRcdH0pO1xuXG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICR0YXJnZXQgLSB0YXJnZXQgZWxlbWVudFxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW2JLZWVwUmF0aW9dIC0ga2VlcCByYXRpb1xuXHRcdCAqL1xuXHRcdHRoaXMucmVzaXplVG8gPSBmdW5jdGlvbiAocG9zLCAkdGFyZ2V0LCBiS2VlcFJhdGlvKSB7XG5cdFx0XHR2YXIgaW1hZ2VTaXplO1xuXHRcdFx0aWYgKGJLZWVwUmF0aW8pIHtcblx0XHRcdFx0dmFyIG5ld1JhdGlvID0gcG9zLnkgLyBwb3MueDtcblx0XHRcdFx0dmFyIHJhdGlvID0gJHRhcmdldC5kYXRhKCdyYXRpbycpO1xuXHRcdFx0XHRpbWFnZVNpemUgPSB7XG5cdFx0XHRcdFx0d2lkdGg6IHJhdGlvID4gbmV3UmF0aW8gPyBwb3MueCA6IHBvcy55IC8gcmF0aW8sXG5cdFx0XHRcdFx0aGVpZ2h0OiByYXRpbyA+IG5ld1JhdGlvID8gcG9zLnggKiByYXRpbyA6IHBvcy55XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbWFnZVNpemUgPSB7XG5cdFx0XHRcdFx0d2lkdGg6IHBvcy54LFxuXHRcdFx0XHRcdGhlaWdodDogcG9zLnlcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0JHRhcmdldC5jc3MoaW1hZ2VTaXplKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmVtb3ZlIG1lZGlhIG9iamVjdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtIGR1bW15IGFyZ3VtZW50IChmb3Iga2VlcCBpbnRlcmZhY2UpXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICR0YXJnZXQgLSB0YXJnZXQgZWxlbWVudFxuXHRcdCAqL1xuXHRcdHRoaXMucmVtb3ZlTWVkaWEgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB2YWx1ZSwgJHRhcmdldCkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0JHRhcmdldC5kZXRhY2goKTtcblxuXHRcdFx0dmFyIGNhbGxiYWNrcyA9ICRlZGl0YWJsZS5kYXRhKCdjYWxsYmFja3MnKTtcblx0XHRcdGlmIChjYWxsYmFja3MgJiYgY2FsbGJhY2tzLm9uTWVkaWFEZWxldGUpIHtcblx0XHRcdFx0Y2FsbGJhY2tzLm9uTWVkaWFEZWxldGUoJHRhcmdldCwgdGhpcywgJGVkaXRhYmxlKTtcblx0XHRcdH1cblxuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHNldCBmb2N1c1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMuZm9jdXMgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHQkZWRpdGFibGUuZm9jdXMoKTtcblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgbW9kdWxlLkJ1dHRvblxuXHQgKlxuXHQgKiBCdXR0b25cblx0ICovXG5cdHZhciBCdXR0b24gPSBmdW5jdGlvbiAoKSB7XG5cdFx0LyoqXG5cdFx0ICogdXBkYXRlIGJ1dHRvbiBzdGF0dXNcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHN0eWxlSW5mb1xuXHRcdCAqL1xuXHRcdHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCRjb250YWluZXIsIHN0eWxlSW5mbykge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBoYW5kbGUgZHJvcGRvd24ncyBjaGVjayBtYXJrIChmb3IgZm9udG5hbWUsIGZvbnRzaXplLCBsaW5lSGVpZ2h0KS5cblx0XHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkYnRuXG5cdFx0XHQgKiBAcGFyYW0ge051bWJlcn0gdmFsdWVcblx0XHRcdCAqL1xuXHRcdFx0dmFyIGNoZWNrRHJvcGRvd25NZW51ID0gZnVuY3Rpb24gKCRidG4sIHZhbHVlKSB7XG5cdFx0XHRcdCRidG4uZmluZCgnLmRyb3Bkb3duLW1lbnUgbGkgYScpLmVhY2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIGFsd2F5cyBjb21wYXJlIHN0cmluZyB0byBhdm9pZCBjcmVhdGluZyBhbm90aGVyIGZ1bmMuXG5cdFx0XHRcdFx0dmFyIGlzQ2hlY2tlZCA9ICgkKHRoaXMpLmRhdGEoJ3ZhbHVlJykgKyAnJykgPT09ICh2YWx1ZSArICcnKTtcblx0XHRcdFx0XHR0aGlzLmNsYXNzTmFtZSA9IGlzQ2hlY2tlZCA/ICdjaGVja2VkJyA6ICcnO1xuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogdXBkYXRlIGJ1dHRvbiBzdGF0ZShhY3RpdmUgb3Igbm90KS5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG5cdFx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG5cdFx0XHQgKi9cblx0XHRcdHZhciBidG5TdGF0ZSA9IGZ1bmN0aW9uIChzZWxlY3RvciwgcHJlZCkge1xuXHRcdFx0XHR2YXIgJGJ0biA9ICRjb250YWluZXIuZmluZChzZWxlY3Rvcik7XG5cdFx0XHRcdCRidG4udG9nZ2xlQ2xhc3MoJ2FjdGl2ZScsIHByZWQoKSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAoc3R5bGVJbmZvLmltYWdlKSB7XG5cdFx0XHRcdHZhciAkaW1nID0gJChzdHlsZUluZm8uaW1hZ2UpO1xuXG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImltYWdlU2hhcGVcIl1bZGF0YS12YWx1ZT1cImltZy1yb3VuZGVkXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiAkaW1nLmhhc0NsYXNzKCdpbWctcm91bmRlZCcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiaW1hZ2VTaGFwZVwiXVtkYXRhLXZhbHVlPVwiaW1nLWNpcmNsZVwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gJGltZy5oYXNDbGFzcygnaW1nLWNpcmNsZScpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiaW1hZ2VTaGFwZVwiXVtkYXRhLXZhbHVlPVwiaW1nLXRodW1ibmFpbFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gJGltZy5oYXNDbGFzcygnaW1nLXRodW1ibmFpbCcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiaW1hZ2VTaGFwZVwiXTpub3QoW2RhdGEtdmFsdWVdKScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gISRpbWcuaXMoJy5pbWctcm91bmRlZCwgLmltZy1jaXJjbGUsIC5pbWctdGh1bWJuYWlsJyk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHZhciBpbWdGbG9hdCA9ICRpbWcuY3NzKCdmbG9hdCcpO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJmbG9hdE1lXCJdW2RhdGEtdmFsdWU9XCJsZWZ0XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBpbWdGbG9hdCA9PT0gJ2xlZnQnO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiZmxvYXRNZVwiXVtkYXRhLXZhbHVlPVwicmlnaHRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGltZ0Zsb2F0ID09PSAncmlnaHQnO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiZmxvYXRNZVwiXVtkYXRhLXZhbHVlPVwibm9uZVwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gaW1nRmxvYXQgIT09ICdsZWZ0JyAmJiBpbWdGbG9hdCAhPT0gJ3JpZ2h0Jztcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIHN0eWxlID0gJGltZy5hdHRyKCdzdHlsZScpO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJyZXNpemVcIl1bZGF0YS12YWx1ZT1cIjFcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhLyhefFxccykobWF4LSk/d2lkdGhcXHMqOlxccyoxMDAlLy50ZXN0KHN0eWxlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cInJlc2l6ZVwiXVtkYXRhLXZhbHVlPVwiMC41XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiAhIS8oXnxcXHMpKG1heC0pP3dpZHRoXFxzKjpcXHMqNTAlLy50ZXN0KHN0eWxlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cInJlc2l6ZVwiXVtkYXRhLXZhbHVlPVwiMC4yNVwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gISEvKF58XFxzKShtYXgtKT93aWR0aFxccyo6XFxzKjI1JS8udGVzdChzdHlsZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIGZvbnRuYW1lXG5cdFx0XHR2YXIgJGZvbnRuYW1lID0gJGNvbnRhaW5lci5maW5kKCcubm90ZS1mb250bmFtZScpO1xuXHRcdFx0aWYgKCRmb250bmFtZS5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIHNlbGVjdGVkRm9udCA9IHN0eWxlSW5mb1snZm9udC1mYW1pbHknXTtcblx0XHRcdFx0aWYgKCEhc2VsZWN0ZWRGb250KSB7XG5cblx0XHRcdFx0XHR2YXIgbGlzdCA9IHNlbGVjdGVkRm9udC5zcGxpdCgnLCcpO1xuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwLCBsZW4gPSBsaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3RlZEZvbnQgPSBsaXN0W2ldLnJlcGxhY2UoL1tcXCdcXFwiXS9nLCAnJykucmVwbGFjZSgvXFxzKyQvLCAnJykucmVwbGFjZSgvXlxccysvLCAnJyk7XG5cdFx0XHRcdFx0XHRpZiAoYWdlbnQuaXNGb250SW5zdGFsbGVkKHNlbGVjdGVkRm9udCkpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0JGZvbnRuYW1lLmZpbmQoJy5ub3RlLWN1cnJlbnQtZm9udG5hbWUnKS50ZXh0KHNlbGVjdGVkRm9udCk7XG5cdFx0XHRcdFx0Y2hlY2tEcm9wZG93bk1lbnUoJGZvbnRuYW1lLCBzZWxlY3RlZEZvbnQpO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gZm9udHNpemVcblx0XHRcdHZhciAkZm9udHNpemUgPSAkY29udGFpbmVyLmZpbmQoJy5ub3RlLWZvbnRzaXplJyk7XG5cdFx0XHQkZm9udHNpemUuZmluZCgnLm5vdGUtY3VycmVudC1mb250c2l6ZScpLnRleHQoc3R5bGVJbmZvWydmb250LXNpemUnXSk7XG5cdFx0XHRjaGVja0Ryb3Bkb3duTWVudSgkZm9udHNpemUsIHBhcnNlRmxvYXQoc3R5bGVJbmZvWydmb250LXNpemUnXSkpO1xuXG5cdFx0XHQvLyBsaW5laGVpZ2h0XG5cdFx0XHR2YXIgJGxpbmVIZWlnaHQgPSAkY29udGFpbmVyLmZpbmQoJy5ub3RlLWhlaWdodCcpO1xuXHRcdFx0Y2hlY2tEcm9wZG93bk1lbnUoJGxpbmVIZWlnaHQsIHBhcnNlRmxvYXQoc3R5bGVJbmZvWydsaW5lLWhlaWdodCddKSk7XG5cblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImJvbGRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ2ZvbnQtYm9sZCddID09PSAnYm9sZCc7XG5cdFx0XHR9KTtcblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cIml0YWxpY1wiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1snZm9udC1pdGFsaWMnXSA9PT0gJ2l0YWxpYyc7XG5cdFx0XHR9KTtcblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cInVuZGVybGluZVwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1snZm9udC11bmRlcmxpbmUnXSA9PT0gJ3VuZGVybGluZSc7XG5cdFx0XHR9KTtcblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cInN0cmlrZXRocm91Z2hcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ2ZvbnQtc3RyaWtldGhyb3VnaCddID09PSAnc3RyaWtldGhyb3VnaCc7XG5cdFx0XHR9KTtcblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cInN1cGVyc2NyaXB0XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydmb250LXN1cGVyc2NyaXB0J10gPT09ICdzdXBlcnNjcmlwdCc7XG5cdFx0XHR9KTtcblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cInN1YnNjcmlwdFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1snZm9udC1zdWJzY3JpcHQnXSA9PT0gJ3N1YnNjcmlwdCc7XG5cdFx0XHR9KTtcblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImp1c3RpZnlMZWZ0XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWyd0ZXh0LWFsaWduJ10gPT09ICdsZWZ0JyB8fCBzdHlsZUluZm9bJ3RleHQtYWxpZ24nXSA9PT0gJ3N0YXJ0Jztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwianVzdGlmeUNlbnRlclwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1sndGV4dC1hbGlnbiddID09PSAnY2VudGVyJztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwianVzdGlmeVJpZ2h0XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWyd0ZXh0LWFsaWduJ10gPT09ICdyaWdodCc7XG5cdFx0XHR9KTtcblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImp1c3RpZnlGdWxsXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWyd0ZXh0LWFsaWduJ10gPT09ICdqdXN0aWZ5Jztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiaW5zZXJ0VW5vcmRlcmVkTGlzdFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1snbGlzdC1zdHlsZSddID09PSAndW5vcmRlcmVkJztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiaW5zZXJ0T3JkZXJlZExpc3RcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ2xpc3Qtc3R5bGUnXSA9PT0gJ29yZGVyZWQnO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHVwZGF0ZSByZWNlbnQgY29sb3Jcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gYnV0dG9uXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGVSZWNlbnRDb2xvciA9IGZ1bmN0aW9uIChidXR0b24sIGV2ZW50TmFtZSwgdmFsdWUpIHtcblx0XHRcdHZhciAkY29sb3IgPSAkKGJ1dHRvbikuY2xvc2VzdCgnLm5vdGUtY29sb3InKTtcblx0XHRcdHZhciAkcmVjZW50Q29sb3IgPSAkY29sb3IuZmluZCgnLm5vdGUtcmVjZW50LWNvbG9yJyk7XG5cdFx0XHR2YXIgY29sb3JJbmZvID0gSlNPTi5wYXJzZSgkcmVjZW50Q29sb3IuYXR0cignZGF0YS12YWx1ZScpKTtcblx0XHRcdGNvbG9ySW5mb1tldmVudE5hbWVdID0gdmFsdWU7XG5cdFx0XHQkcmVjZW50Q29sb3IuYXR0cignZGF0YS12YWx1ZScsIEpTT04uc3RyaW5naWZ5KGNvbG9ySW5mbykpO1xuXHRcdFx0dmFyIHNLZXkgPSBldmVudE5hbWUgPT09ICdiYWNrQ29sb3InID8gJ2JhY2tncm91bmQtY29sb3InIDogJ2NvbG9yJztcblx0XHRcdCRyZWNlbnRDb2xvci5maW5kKCdpJykuY3NzKHNLZXksIHZhbHVlKTtcblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgbW9kdWxlLlRvb2xiYXJcblx0ICpcblx0ICogVG9vbGJhclxuXHQgKi9cblx0dmFyIFRvb2xiYXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGJ1dHRvbiA9IG5ldyBCdXR0b24oKTtcblxuXHRcdHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCR0b29sYmFyLCBzdHlsZUluZm8pIHtcblx0XHRcdGJ1dHRvbi51cGRhdGUoJHRvb2xiYXIsIHN0eWxlSW5mbyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gYnV0dG9uXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuXHRcdCAqL1xuXHRcdHRoaXMudXBkYXRlUmVjZW50Q29sb3IgPSBmdW5jdGlvbiAoYnV0dG9uTm9kZSwgZXZlbnROYW1lLCB2YWx1ZSkge1xuXHRcdFx0YnV0dG9uLnVwZGF0ZVJlY2VudENvbG9yKGJ1dHRvbk5vZGUsIGV2ZW50TmFtZSwgdmFsdWUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBhY3RpdmF0ZSBidXR0b25zIGV4Y2x1ZGUgY29kZXZpZXdcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJHRvb2xiYXJcblx0XHQgKi9cblx0XHR0aGlzLmFjdGl2YXRlID0gZnVuY3Rpb24gKCR0b29sYmFyKSB7XG5cdFx0XHQkdG9vbGJhci5maW5kKCdidXR0b24nKVxuXHRcdFx0XHRcdC5ub3QoJ2J1dHRvbltkYXRhLWV2ZW50PVwiY29kZXZpZXdcIl0nKVxuXHRcdFx0XHRcdC5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZGVhY3RpdmF0ZSBidXR0b25zIGV4Y2x1ZGUgY29kZXZpZXdcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJHRvb2xiYXJcblx0XHQgKi9cblx0XHR0aGlzLmRlYWN0aXZhdGUgPSBmdW5jdGlvbiAoJHRvb2xiYXIpIHtcblx0XHRcdCR0b29sYmFyLmZpbmQoJ2J1dHRvbicpXG5cdFx0XHRcdFx0Lm5vdCgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJjb2Rldmlld1wiXScpXG5cdFx0XHRcdFx0LmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGNvbnRhaW5lclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW2JGdWxsc2NyZWVuPWZhbHNlXVxuXHRcdCAqL1xuXHRcdHRoaXMudXBkYXRlRnVsbHNjcmVlbiA9IGZ1bmN0aW9uICgkY29udGFpbmVyLCBiRnVsbHNjcmVlbikge1xuXHRcdFx0dmFyICRidG4gPSAkY29udGFpbmVyLmZpbmQoJ2J1dHRvbltkYXRhLWV2ZW50PVwiZnVsbHNjcmVlblwiXScpO1xuXHRcdFx0JGJ0bi50b2dnbGVDbGFzcygnYWN0aXZlJywgYkZ1bGxzY3JlZW4pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGNvbnRhaW5lclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzQ29kZXZpZXc9ZmFsc2VdXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGVDb2RldmlldyA9IGZ1bmN0aW9uICgkY29udGFpbmVyLCBpc0NvZGV2aWV3KSB7XG5cdFx0XHR2YXIgJGJ0biA9ICRjb250YWluZXIuZmluZCgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJjb2Rldmlld1wiXScpO1xuXHRcdFx0JGJ0bi50b2dnbGVDbGFzcygnYWN0aXZlJywgaXNDb2Rldmlldyk7XG5cblx0XHRcdGlmIChpc0NvZGV2aWV3KSB7XG5cdFx0XHRcdHRoaXMuZGVhY3RpdmF0ZSgkY29udGFpbmVyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYWN0aXZhdGUoJGNvbnRhaW5lcik7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGdldCBidXR0b24gaW4gdG9vbGJhciBcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHRcdCAqIEByZXR1cm4ge2pRdWVyeX1cblx0XHQgKi9cblx0XHR0aGlzLmdldCA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIG5hbWUpIHtcblx0XHRcdHZhciAkdG9vbGJhciA9IGRvbS5tYWtlTGF5b3V0SW5mbygkZWRpdGFibGUpLnRvb2xiYXIoKTtcblxuXHRcdFx0cmV0dXJuICR0b29sYmFyLmZpbmQoJ1tkYXRhLW5hbWU9JyArIG5hbWUgKyAnXScpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBzZXQgYnV0dG9uIHN0YXRlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbaXNBY3RpdmU9dHJ1ZV1cblx0XHQgKi9cblx0XHR0aGlzLnNldEJ1dHRvblN0YXRlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgbmFtZSwgaXNBY3RpdmUpIHtcblx0XHRcdGlzQWN0aXZlID0gKGlzQWN0aXZlID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7XG5cblx0XHRcdHZhciAkYnV0dG9uID0gdGhpcy5nZXQoJGVkaXRhYmxlLCBuYW1lKTtcblx0XHRcdCRidXR0b24udG9nZ2xlQ2xhc3MoJ2FjdGl2ZScsIGlzQWN0aXZlKTtcblx0XHR9O1xuXHR9O1xuXG5cdHZhciBFRElUQUJMRV9QQURESU5HID0gMjQ7XG5cblx0dmFyIFN0YXR1c2JhciA9IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XG5cblx0XHR0aGlzLmF0dGFjaCA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG5cdFx0XHRpZiAoIW9wdGlvbnMuZGlzYWJsZVJlc2l6ZUVkaXRvcikge1xuXHRcdFx0XHRsYXlvdXRJbmZvLnN0YXR1c2JhcigpLm9uKCdtb3VzZWRvd24nLCBoU3RhdHVzYmFyTW91c2Vkb3duKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYG1vdXNlZG93bmAgZXZlbnQgaGFuZGxlciBvbiBzdGF0dXNiYXJcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcblx0XHQgKi9cblx0XHR2YXIgaFN0YXR1c2Jhck1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHR2YXIgJGVkaXRhYmxlID0gZG9tLm1ha2VMYXlvdXRJbmZvKGV2ZW50LnRhcmdldCkuZWRpdGFibGUoKTtcblx0XHRcdHZhciBlZGl0YWJsZVRvcCA9ICRlZGl0YWJsZS5vZmZzZXQoKS50b3AgLSAkZG9jdW1lbnQuc2Nyb2xsVG9wKCk7XG5cblx0XHRcdHZhciBsYXlvdXRJbmZvID0gZG9tLm1ha2VMYXlvdXRJbmZvKGV2ZW50LmN1cnJlbnRUYXJnZXQgfHwgZXZlbnQudGFyZ2V0KTtcblx0XHRcdHZhciBvcHRpb25zID0gbGF5b3V0SW5mby5lZGl0b3IoKS5kYXRhKCdvcHRpb25zJyk7XG5cblx0XHRcdCRkb2N1bWVudC5vbignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdHZhciBuSGVpZ2h0ID0gZXZlbnQuY2xpZW50WSAtIChlZGl0YWJsZVRvcCArIEVESVRBQkxFX1BBRERJTkcpO1xuXG5cdFx0XHRcdG5IZWlnaHQgPSAob3B0aW9ucy5taW5IZWlnaHQgPiAwKSA/IE1hdGgubWF4KG5IZWlnaHQsIG9wdGlvbnMubWluSGVpZ2h0KSA6IG5IZWlnaHQ7XG5cdFx0XHRcdG5IZWlnaHQgPSAob3B0aW9ucy5tYXhIZWlnaHQgPiAwKSA/IE1hdGgubWluKG5IZWlnaHQsIG9wdGlvbnMubWF4SGVpZ2h0KSA6IG5IZWlnaHQ7XG5cblx0XHRcdFx0JGVkaXRhYmxlLmhlaWdodChuSGVpZ2h0KTtcblx0XHRcdH0pLm9uZSgnbW91c2V1cCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0JGRvY3VtZW50Lm9mZignbW91c2Vtb3ZlJyk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgbW9kdWxlLlBvcG92ZXJcblx0ICpcblx0ICogUG9wb3ZlciAoaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jcG9wb3ZlcnMpXG5cdCAqXG5cdCAqL1xuXHR2YXIgUG9wb3ZlciA9IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgYnV0dG9uID0gbmV3IEJ1dHRvbigpO1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBwb3NpdGlvbiBmcm9tIHBsYWNlaG9sZGVyXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gcGxhY2Vob2xkZXJcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzQWlyTW9kZVxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKiBAcmV0dXJuIHtOdW1iZXJ9IHJldHVybi5sZWZ0XG5cdFx0ICogQHJldHVybiB7TnVtYmVyfSByZXR1cm4udG9wXG5cdFx0ICovXG5cdFx0dmFyIHBvc0Zyb21QbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwbGFjZWhvbGRlciwgaXNBaXJNb2RlKSB7XG5cdFx0XHR2YXIgJHBsYWNlaG9sZGVyID0gJChwbGFjZWhvbGRlcik7XG5cdFx0XHR2YXIgcG9zID0gaXNBaXJNb2RlID8gJHBsYWNlaG9sZGVyLm9mZnNldCgpIDogJHBsYWNlaG9sZGVyLnBvc2l0aW9uKCk7XG5cdFx0XHR2YXIgaGVpZ2h0ID0gJHBsYWNlaG9sZGVyLm91dGVySGVpZ2h0KHRydWUpOyAvLyBpbmNsdWRlIG1hcmdpblxuXG5cdFx0XHQvLyBwb3BvdmVyIGJlbG93IHBsYWNlaG9sZGVyLlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bGVmdDogcG9zLmxlZnQsXG5cdFx0XHRcdHRvcDogcG9zLnRvcCArIGhlaWdodFxuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogc2hvdyBwb3BvdmVyXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSBwb3BvdmVyXG5cdFx0ICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zXG5cdFx0ICovXG5cdFx0dmFyIHNob3dQb3BvdmVyID0gZnVuY3Rpb24gKCRwb3BvdmVyLCBwb3MpIHtcblx0XHRcdCRwb3BvdmVyLmNzcyh7XG5cdFx0XHRcdGRpc3BsYXk6ICdibG9jaycsXG5cdFx0XHRcdGxlZnQ6IHBvcy5sZWZ0LFxuXHRcdFx0XHR0b3A6IHBvcy50b3Bcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHR2YXIgUFhfUE9QT1ZFUl9BUlJPV19PRkZTRVRfWCA9IDIwO1xuXG5cdFx0LyoqXG5cdFx0ICogdXBkYXRlIGN1cnJlbnQgc3RhdGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJHBvcG92ZXIgLSBwb3BvdmVyIGNvbnRhaW5lclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZUluZm8gLSBzdHlsZSBvYmplY3Rcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzQWlyTW9kZVxuXHRcdCAqL1xuXHRcdHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCRwb3BvdmVyLCBzdHlsZUluZm8sIGlzQWlyTW9kZSkge1xuXHRcdFx0YnV0dG9uLnVwZGF0ZSgkcG9wb3Zlciwgc3R5bGVJbmZvKTtcblxuXHRcdFx0dmFyICRsaW5rUG9wb3ZlciA9ICRwb3BvdmVyLmZpbmQoJy5ub3RlLWxpbmstcG9wb3ZlcicpO1xuXHRcdFx0aWYgKHN0eWxlSW5mby5hbmNob3IpIHtcblx0XHRcdFx0dmFyICRhbmNob3IgPSAkbGlua1BvcG92ZXIuZmluZCgnYScpO1xuXHRcdFx0XHR2YXIgaHJlZiA9ICQoc3R5bGVJbmZvLmFuY2hvcikuYXR0cignaHJlZicpO1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gJChzdHlsZUluZm8uYW5jaG9yKS5hdHRyKCd0YXJnZXQnKTtcblx0XHRcdFx0JGFuY2hvci5hdHRyKCdocmVmJywgaHJlZikuaHRtbChocmVmKTtcblx0XHRcdFx0aWYgKCF0YXJnZXQpIHtcblx0XHRcdFx0XHQkYW5jaG9yLnJlbW92ZUF0dHIoJ3RhcmdldCcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCRhbmNob3IuYXR0cigndGFyZ2V0JywgJ19ibGFuaycpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNob3dQb3BvdmVyKCRsaW5rUG9wb3ZlciwgcG9zRnJvbVBsYWNlaG9sZGVyKHN0eWxlSW5mby5hbmNob3IsIGlzQWlyTW9kZSkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JGxpbmtQb3BvdmVyLmhpZGUoKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyICRpbWFnZVBvcG92ZXIgPSAkcG9wb3Zlci5maW5kKCcubm90ZS1pbWFnZS1wb3BvdmVyJyk7XG5cdFx0XHRpZiAoc3R5bGVJbmZvLmltYWdlKSB7XG5cdFx0XHRcdHNob3dQb3BvdmVyKCRpbWFnZVBvcG92ZXIsIHBvc0Zyb21QbGFjZWhvbGRlcihzdHlsZUluZm8uaW1hZ2UsIGlzQWlyTW9kZSkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JGltYWdlUG9wb3Zlci5oaWRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciAkYWlyUG9wb3ZlciA9ICRwb3BvdmVyLmZpbmQoJy5ub3RlLWFpci1wb3BvdmVyJyk7XG5cdFx0XHRpZiAoaXNBaXJNb2RlICYmICFzdHlsZUluZm8ucmFuZ2UuaXNDb2xsYXBzZWQoKSkge1xuXHRcdFx0XHR2YXIgcmVjdCA9IGxpc3QubGFzdChzdHlsZUluZm8ucmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKSk7XG5cdFx0XHRcdGlmIChyZWN0KSB7XG5cdFx0XHRcdFx0dmFyIGJuZCA9IGZ1bmMucmVjdDJibmQocmVjdCk7XG5cdFx0XHRcdFx0c2hvd1BvcG92ZXIoJGFpclBvcG92ZXIsIHtcblx0XHRcdFx0XHRcdGxlZnQ6IE1hdGgubWF4KGJuZC5sZWZ0ICsgYm5kLndpZHRoIC8gMiAtIFBYX1BPUE9WRVJfQVJST1dfT0ZGU0VUX1gsIDApLFxuXHRcdFx0XHRcdFx0dG9wOiBibmQudG9wICsgYm5kLmhlaWdodFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkYWlyUG9wb3Zlci5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gYnV0dG9uXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuXHRcdCAqL1xuXHRcdHRoaXMudXBkYXRlUmVjZW50Q29sb3IgPSBmdW5jdGlvbiAoYnV0dG9uLCBldmVudE5hbWUsIHZhbHVlKSB7XG5cdFx0XHRidXR0b24udXBkYXRlUmVjZW50Q29sb3IoYnV0dG9uLCBldmVudE5hbWUsIHZhbHVlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaGlkZSBhbGwgcG9wb3ZlcnNcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJHBvcG92ZXIgLSBwb3BvdmVyIGNvbnRhaW5lclxuXHRcdCAqL1xuXHRcdHRoaXMuaGlkZSA9IGZ1bmN0aW9uICgkcG9wb3Zlcikge1xuXHRcdFx0JHBvcG92ZXIuY2hpbGRyZW4oKS5oaWRlKCk7XG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIG1vZHVsZS5IYW5kbGVcblx0ICpcblx0ICogSGFuZGxlXG5cdCAqL1xuXHR2YXIgSGFuZGxlID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblx0XHR2YXIgJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XG5cblx0XHQvKipcblx0XHQgKiBgbW91c2Vkb3duYCBldmVudCBoYW5kbGVyIG9uICRoYW5kbGVcblx0XHQgKiAgLSBjb250cm9sU2l6aW5nOiByZXNpemUgaW1hZ2Vcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcblx0XHQgKi9cblx0XHR2YXIgaEhhbmRsZU1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0aWYgKGRvbS5pc0NvbnRyb2xTaXppbmcoZXZlbnQudGFyZ2V0KSkge1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IGRvbS5tYWtlTGF5b3V0SW5mbyhldmVudC50YXJnZXQpLFxuXHRcdFx0XHRcdCRoYW5kbGUgPSBsYXlvdXRJbmZvLmhhbmRsZSgpLFxuXHRcdFx0XHRcdCRwb3BvdmVyID0gbGF5b3V0SW5mby5wb3BvdmVyKCksXG5cdFx0XHRcdFx0JGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpLFxuXHRcdFx0XHRcdCRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpO1xuXG5cdFx0XHRcdHZhciB0YXJnZXQgPSAkaGFuZGxlLmZpbmQoJy5ub3RlLWNvbnRyb2wtc2VsZWN0aW9uJykuZGF0YSgndGFyZ2V0JyksXG5cdFx0XHRcdFx0JHRhcmdldCA9ICQodGFyZ2V0KSwgcG9zU3RhcnQgPSAkdGFyZ2V0Lm9mZnNldCgpLFxuXHRcdFx0XHRcdHNjcm9sbFRvcCA9ICRkb2N1bWVudC5zY3JvbGxUb3AoKTtcblxuXHRcdFx0XHR2YXIgaXNBaXJNb2RlID0gJGVkaXRvci5kYXRhKCdvcHRpb25zJykuYWlyTW9kZTtcblxuXHRcdFx0XHQkZG9jdW1lbnQub24oJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IucmVzaXplVG8nLCB7XG5cdFx0XHRcdFx0XHR4OiBldmVudC5jbGllbnRYIC0gcG9zU3RhcnQubGVmdCxcblx0XHRcdFx0XHRcdHk6IGV2ZW50LmNsaWVudFkgLSAocG9zU3RhcnQudG9wIC0gc2Nyb2xsVG9wKVxuXHRcdFx0XHRcdH0sICR0YXJnZXQsICFldmVudC5zaGlmdEtleSk7XG5cblx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnaGFuZGxlLnVwZGF0ZScsICRoYW5kbGUsIHsgaW1hZ2U6IHRhcmdldCB9LCBpc0Fpck1vZGUpO1xuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdwb3BvdmVyLnVwZGF0ZScsICRwb3BvdmVyLCB7IGltYWdlOiB0YXJnZXQgfSwgaXNBaXJNb2RlKTtcblx0XHRcdFx0fSkub25lKCdtb3VzZXVwJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCRkb2N1bWVudC5vZmYoJ21vdXNlbW92ZScpO1xuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuYWZ0ZXJDb21tYW5kJywgJGVkaXRhYmxlKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKCEkdGFyZ2V0LmRhdGEoJ3JhdGlvJykpIHsgLy8gb3JpZ2luYWwgcmF0aW8uXG5cdFx0XHRcdFx0JHRhcmdldC5kYXRhKCdyYXRpbycsICR0YXJnZXQuaGVpZ2h0KCkgLyAkdGFyZ2V0LndpZHRoKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRoaXMuYXR0YWNoID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdGxheW91dEluZm8uaGFuZGxlKCkub24oJ21vdXNlZG93bicsIGhIYW5kbGVNb3VzZWRvd24pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiB1cGRhdGUgaGFuZGxlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRoYW5kbGVcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc3R5bGVJbmZvXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc0Fpck1vZGVcblx0XHQgKi9cblx0XHR0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uICgkaGFuZGxlLCBzdHlsZUluZm8sIGlzQWlyTW9kZSkge1xuXHRcdFx0dmFyICRzZWxlY3Rpb24gPSAkaGFuZGxlLmZpbmQoJy5ub3RlLWNvbnRyb2wtc2VsZWN0aW9uJyk7XG5cdFx0XHRpZiAoc3R5bGVJbmZvLmltYWdlKSB7XG5cdFx0XHRcdHZhciAkaW1hZ2UgPSAkKHN0eWxlSW5mby5pbWFnZSk7XG5cdFx0XHRcdHZhciBwb3MgPSBpc0Fpck1vZGUgPyAkaW1hZ2Uub2Zmc2V0KCkgOiAkaW1hZ2UucG9zaXRpb24oKTtcblxuXHRcdFx0XHQvLyBpbmNsdWRlIG1hcmdpblxuXHRcdFx0XHR2YXIgaW1hZ2VTaXplID0ge1xuXHRcdFx0XHRcdHc6ICRpbWFnZS5vdXRlcldpZHRoKHRydWUpLFxuXHRcdFx0XHRcdGg6ICRpbWFnZS5vdXRlckhlaWdodCh0cnVlKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdCRzZWxlY3Rpb24uY3NzKHtcblx0XHRcdFx0XHRkaXNwbGF5OiAnYmxvY2snLFxuXHRcdFx0XHRcdGxlZnQ6IHBvcy5sZWZ0LFxuXHRcdFx0XHRcdHRvcDogcG9zLnRvcCxcblx0XHRcdFx0XHR3aWR0aDogaW1hZ2VTaXplLncsXG5cdFx0XHRcdFx0aGVpZ2h0OiBpbWFnZVNpemUuaFxuXHRcdFx0XHR9KS5kYXRhKCd0YXJnZXQnLCBzdHlsZUluZm8uaW1hZ2UpOyAvLyBzYXZlIGN1cnJlbnQgaW1hZ2UgZWxlbWVudC5cblx0XHRcdFx0dmFyIHNpemluZ1RleHQgPSBpbWFnZVNpemUudyArICd4JyArIGltYWdlU2l6ZS5oO1xuXHRcdFx0XHQkc2VsZWN0aW9uLmZpbmQoJy5ub3RlLWNvbnRyb2wtc2VsZWN0aW9uLWluZm8nKS50ZXh0KHNpemluZ1RleHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JHNlbGVjdGlvbi5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGhpZGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkaGFuZGxlXG5cdFx0ICovXG5cdFx0dGhpcy5oaWRlID0gZnVuY3Rpb24gKCRoYW5kbGUpIHtcblx0XHRcdCRoYW5kbGUuY2hpbGRyZW4oKS5oaWRlKCk7XG5cdFx0fTtcblx0fTtcblxuXHR2YXIgRnVsbHNjcmVlbiA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG5cdFx0dmFyICR3aW5kb3cgPSAkKHdpbmRvdyk7XG5cdFx0dmFyICRzY3JvbGxiYXIgPSAkKCdodG1sLCBib2R5Jyk7XG5cblx0XHQvKipcblx0XHQgKiB0b2dnbGUgZnVsbHNjcmVlblxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHQgKi9cblx0XHR0aGlzLnRvZ2dsZSA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cblx0XHRcdHZhciAkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKSxcblx0XHRcdFx0JHRvb2xiYXIgPSBsYXlvdXRJbmZvLnRvb2xiYXIoKSxcblx0XHRcdFx0JGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpLFxuXHRcdFx0XHQkY29kYWJsZSA9IGxheW91dEluZm8uY29kYWJsZSgpO1xuXG5cdFx0XHR2YXIgcmVzaXplID0gZnVuY3Rpb24gKHNpemUpIHtcblx0XHRcdFx0JGVkaXRhYmxlLmNzcygnaGVpZ2h0Jywgc2l6ZS5oKTtcblx0XHRcdFx0JGNvZGFibGUuY3NzKCdoZWlnaHQnLCBzaXplLmgpO1xuXHRcdFx0XHRpZiAoJGNvZGFibGUuZGF0YSgnY21lZGl0b3InKSkge1xuXHRcdFx0XHRcdCRjb2RhYmxlLmRhdGEoJ2NtZWRpdG9yJykuc2V0c2l6ZShudWxsLCBzaXplLmgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHQkZWRpdG9yLnRvZ2dsZUNsYXNzKCdmdWxsc2NyZWVuJyk7XG5cdFx0XHR2YXIgaXNGdWxsc2NyZWVuID0gJGVkaXRvci5oYXNDbGFzcygnZnVsbHNjcmVlbicpO1xuXHRcdFx0aWYgKGlzRnVsbHNjcmVlbikge1xuXHRcdFx0XHQkZWRpdGFibGUuZGF0YSgnb3JnaGVpZ2h0JywgJGVkaXRhYmxlLmNzcygnaGVpZ2h0JykpO1xuXG5cdFx0XHRcdCR3aW5kb3cub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXNpemUoe1xuXHRcdFx0XHRcdFx0aDogJHdpbmRvdy5oZWlnaHQoKSAtICR0b29sYmFyLm91dGVySGVpZ2h0KCkgLSAxNDJcblx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pLnRyaWdnZXIoJ3Jlc2l6ZScpO1xuXG5cdFx0XHRcdCRzY3JvbGxiYXIuY3NzKCdvdmVyZmxvdycsICdoaWRkZW4nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCR3aW5kb3cub2ZmKCdyZXNpemUnKTtcblx0XHRcdFx0cmVzaXplKHtcblx0XHRcdFx0XHRoOiAkZWRpdGFibGUuZGF0YSgnb3JnaGVpZ2h0Jylcblx0XHRcdFx0fSk7XG5cdFx0XHRcdCRzY3JvbGxiYXIuY3NzKCdvdmVyZmxvdycsICd2aXNpYmxlJyk7XG5cdFx0XHR9XG5cblx0XHRcdGhhbmRsZXIuaW52b2tlKCd0b29sYmFyLnVwZGF0ZUZ1bGxzY3JlZW4nLCAkdG9vbGJhciwgaXNGdWxsc2NyZWVuKTtcblx0XHR9O1xuXHR9O1xuXG5cblx0dmFyIENvZGVNaXJyb3I7XG5cdGlmIChhZ2VudC5oYXNDb2RlTWlycm9yKSB7XG5cdFx0aWYgKGFnZW50LmlzU3VwcG9ydEFtZCkge1xuXHRcdFx0X19icm93c2VyaWZ5X3NoaW1fcmVxdWlyZV9fKFsnQ29kZU1pcnJvciddLCBmdW5jdGlvbiAoY20pIHtcblx0XHRcdFx0Q29kZU1pcnJvciA9IGNtO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdENvZGVNaXJyb3IgPSB3aW5kb3cuQ29kZU1pcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGNsYXNzIENvZGV2aWV3XG5cdCAqL1xuXHR2YXIgQ29kZXZpZXcgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuXG5cdFx0dGhpcy5zeW5jID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdHZhciBpc0NvZGV2aWV3ID0gaGFuZGxlci5pbnZva2UoJ2NvZGV2aWV3LmlzQWN0aXZhdGVkJywgbGF5b3V0SW5mbyk7XG5cdFx0XHRpZiAoaXNDb2RldmlldyAmJiBhZ2VudC5oYXNDb2RlTWlycm9yKSB7XG5cdFx0XHRcdGxheW91dEluZm8uY29kYWJsZSgpLmRhdGEoJ2NtRWRpdG9yJykuc2F2ZSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dGhpcy5pc0FjdGl2YXRlZCA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHR2YXIgJGVkaXRvciA9IGxheW91dEluZm8uZWRpdG9yKCk7XG5cdFx0XHRyZXR1cm4gJGVkaXRvci5oYXNDbGFzcygnY29kZXZpZXcnKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogdG9nZ2xlIGNvZGV2aWV3XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqL1xuXHRcdHRoaXMudG9nZ2xlID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdGlmICh0aGlzLmlzQWN0aXZhdGVkKGxheW91dEluZm8pKSB7XG5cdFx0XHRcdHRoaXMuZGVhY3RpdmF0ZShsYXlvdXRJbmZvKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYWN0aXZhdGUobGF5b3V0SW5mbyk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGFjdGl2YXRlIGNvZGUgdmlld1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHQgKi9cblx0XHR0aGlzLmFjdGl2YXRlID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdHZhciAkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKSxcblx0XHRcdFx0JHRvb2xiYXIgPSBsYXlvdXRJbmZvLnRvb2xiYXIoKSxcblx0XHRcdFx0JGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpLFxuXHRcdFx0XHQkY29kYWJsZSA9IGxheW91dEluZm8uY29kYWJsZSgpLFxuXHRcdFx0XHQkcG9wb3ZlciA9IGxheW91dEluZm8ucG9wb3ZlcigpLFxuXHRcdFx0XHQkaGFuZGxlID0gbGF5b3V0SW5mby5oYW5kbGUoKTtcblxuXHRcdFx0dmFyIG9wdGlvbnMgPSAkZWRpdG9yLmRhdGEoJ29wdGlvbnMnKTtcblxuXHRcdFx0JGNvZGFibGUudmFsKGRvbS5odG1sKCRlZGl0YWJsZSwgb3B0aW9ucy5wcmV0dGlmeUh0bWwpKTtcblxuICAgICAgICAgICAgLy8gdW5jb21tZW50IHNjcmlwdCB0YWdzIHNvIHRoZXkncmUgY29ycmVjdCBpbiBjb2RlIHZpZXdcblx0XHRcdCRjb2RhYmxlLnZhbCgkY29kYWJsZS52YWwoKS5yZXBsYWNlKCc8IS0tPHNjcmlwdCcsICc8c2NyaXB0JykpO1xyXG5cdFx0XHQkY29kYWJsZS52YWwoJGNvZGFibGUudmFsKCkucmVwbGFjZSgnPC9zY3JpcHQ+LS0+JywgJzwvc2NyaXB0PicpKTtcblxuXHRcdFx0JGNvZGFibGUuaGVpZ2h0KCRlZGl0YWJsZS5oZWlnaHQoKSk7XG5cblx0XHRcdGhhbmRsZXIuaW52b2tlKCd0b29sYmFyLnVwZGF0ZUNvZGV2aWV3JywgJHRvb2xiYXIsIHRydWUpO1xuXHRcdFx0aGFuZGxlci5pbnZva2UoJ3BvcG92ZXIuaGlkZScsICRwb3BvdmVyKTtcblx0XHRcdGhhbmRsZXIuaW52b2tlKCdoYW5kbGUuaGlkZScsICRoYW5kbGUpO1xuXG5cdFx0XHQkZWRpdG9yLmFkZENsYXNzKCdjb2RldmlldycpO1xuXG5cdFx0XHQkY29kYWJsZS5mb2N1cygpO1xuXG5cdFx0XHQvLyBhY3RpdmF0ZSBDb2RlTWlycm9yIGFzIGNvZGFibGVcblx0XHRcdGlmIChhZ2VudC5oYXNDb2RlTWlycm9yKSB7XG5cdFx0XHRcdHZhciBjbUVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCRjb2RhYmxlWzBdLCBvcHRpb25zLmNvZGVtaXJyb3IpO1xuXG5cdFx0XHRcdC8vIENvZGVNaXJyb3IgVGVyblNlcnZlclxuXHRcdFx0XHRpZiAob3B0aW9ucy5jb2RlbWlycm9yLnRlcm4pIHtcblx0XHRcdFx0XHR2YXIgc2VydmVyID0gbmV3IENvZGVNaXJyb3IuVGVyblNlcnZlcihvcHRpb25zLmNvZGVtaXJyb3IudGVybik7XG5cdFx0XHRcdFx0Y21FZGl0b3IudGVyblNlcnZlciA9IHNlcnZlcjtcblx0XHRcdFx0XHRjbUVkaXRvci5vbignY3Vyc29yQWN0aXZpdHknLCBmdW5jdGlvbiAoY20pIHtcblx0XHRcdFx0XHRcdHNlcnZlci51cGRhdGVBcmdIaW50cyhjbSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDb2RlTWlycm9yIGhhc24ndCBQYWRkaW5nLlxuXHRcdFx0XHRjbUVkaXRvci5zZXRTaXplKG51bGwsICRlZGl0YWJsZS5vdXRlckhlaWdodCgpKTtcblx0XHRcdFx0JGNvZGFibGUuZGF0YSgnY21FZGl0b3InLCBjbUVkaXRvcik7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGRlYWN0aXZhdGUgY29kZSB2aWV3XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqL1xuXHRcdHRoaXMuZGVhY3RpdmF0ZSA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHR2YXIgJGVkaXRvciA9IGxheW91dEluZm8uZWRpdG9yKCksXG5cdFx0XHRcdCR0b29sYmFyID0gbGF5b3V0SW5mby50b29sYmFyKCksXG5cdFx0XHRcdCRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKSxcblx0XHRcdFx0JGNvZGFibGUgPSBsYXlvdXRJbmZvLmNvZGFibGUoKTtcblxuXHRcdFx0dmFyIG9wdGlvbnMgPSAkZWRpdG9yLmRhdGEoJ29wdGlvbnMnKTtcblxuXHRcdFx0Ly8gZGVhY3RpdmF0ZSBDb2RlTWlycm9yIGFzIGNvZGFibGVcblx0XHRcdGlmIChhZ2VudC5oYXNDb2RlTWlycm9yKSB7XG5cdFx0XHRcdHZhciBjbUVkaXRvciA9ICRjb2RhYmxlLmRhdGEoJ2NtRWRpdG9yJyk7XG5cdFx0XHRcdCRjb2RhYmxlLnZhbChjbUVkaXRvci5nZXRWYWx1ZSgpKTtcblx0XHRcdFx0Y21FZGl0b3IudG9UZXh0QXJlYSgpO1xuXHRcdFx0fVxuXG5cdFx0XHQkZWRpdGFibGUuaHRtbChkb20udmFsdWUoJGNvZGFibGUsIG9wdGlvbnMucHJldHRpZnlIdG1sKSB8fCBkb20uZW1wdHlQYXJhKTtcblxuXHRcdCAgICAvLyByZXBsYWNlIHNjcmlwdCB0YWdzIHNvIHRoZXkncmUgbm90IGV4ZWN1dGVkIHdoZW4gbG9hZGVkIGluIGFkbWluXG5cdFx0XHR2YXIgY29kZVRvUmVwbGFjZSA9ICRlZGl0YWJsZS5odG1sKCk7XHJcblxyXG5cdFx0XHRjb2RlVG9SZXBsYWNlID0gY29kZVRvUmVwbGFjZS5yZXBsYWNlKCc8c2NyaXB0JywgJzwhLS08c2NyaXB0Jyk7XHJcblx0XHRcdGNvZGVUb1JlcGxhY2UgPSBjb2RlVG9SZXBsYWNlLnJlcGxhY2UoJzwvc2NyaXB0PicsICc8L3NjcmlwdD4tLT4nKTtcclxuXHJcblx0XHRcdCRlZGl0YWJsZS5odG1sKGNvZGVUb1JlcGxhY2UpO1xuXG5cdFx0XHQkZWRpdGFibGUuaGVpZ2h0KG9wdGlvbnMuaGVpZ2h0ID8gJGNvZGFibGUuaGVpZ2h0KCkgOiAnYXV0bycpO1xuXHRcdFx0JGVkaXRvci5yZW1vdmVDbGFzcygnY29kZXZpZXcnKTtcblxuXHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cblx0XHRcdGhhbmRsZXIuaW52b2tlKCd0b29sYmFyLnVwZGF0ZUNvZGV2aWV3JywgJHRvb2xiYXIsIGZhbHNlKTtcblxuICAgICAgICAgICAgd2luZG93LnN0b3AoKTtcblx0XHR9O1xuXHR9O1xuXG5cdHZhciBEcmFnQW5kRHJvcCA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG5cdFx0dmFyICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xuXG5cdFx0LyoqXG5cdFx0ICogYXR0YWNoIERyYWcgYW5kIERyb3AgRXZlbnRzXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mbyAtIGxheW91dCBJbmZvcm1hdGlvbnNcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHRcdCAqL1xuXHRcdHRoaXMuYXR0YWNoID0gZnVuY3Rpb24gKGxheW91dEluZm8sIG9wdGlvbnMpIHtcblx0XHRcdGlmIChvcHRpb25zLmFpck1vZGUgfHwgb3B0aW9ucy5kaXNhYmxlRHJhZ0FuZERyb3ApIHtcblx0XHRcdFx0Ly8gcHJldmVudCBkZWZhdWx0IGRyb3AgZXZlbnRcblx0XHRcdFx0JGRvY3VtZW50Lm9uKCdkcm9wJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5hdHRhY2hEcmFnQW5kRHJvcEV2ZW50KGxheW91dEluZm8sIG9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBhdHRhY2ggRHJhZyBhbmQgRHJvcCBFdmVudHNcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvIC0gbGF5b3V0IEluZm9ybWF0aW9uc1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICovXG5cdFx0dGhpcy5hdHRhY2hEcmFnQW5kRHJvcEV2ZW50ID0gZnVuY3Rpb24gKGxheW91dEluZm8sIG9wdGlvbnMpIHtcblx0XHRcdHZhciBjb2xsZWN0aW9uID0gJCgpLFxuXHRcdFx0XHQkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKSxcblx0XHRcdFx0JGRyb3B6b25lID0gbGF5b3V0SW5mby5kcm9wem9uZSgpLFxuXHRcdFx0XHQkZHJvcHpvbmVNZXNzYWdlID0gJGRyb3B6b25lLmZpbmQoJy5ub3RlLWRyb3B6b25lLW1lc3NhZ2UnKTtcblxuXHRcdFx0Ly8gc2hvdyBkcm9wem9uZSBvbiBkcmFnZW50ZXIgd2hlbiBkcmFnZ2luZyBhIG9iamVjdCB0byBkb2N1bWVudFxuXHRcdFx0Ly8gLWJ1dCBvbmx5IGlmIHRoZSBlZGl0b3IgaXMgdmlzaWJsZSwgaS5lLiBoYXMgYSBwb3NpdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0XG5cdFx0XHQkZG9jdW1lbnQub24oJ2RyYWdlbnRlcicsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdHZhciBpc0NvZGV2aWV3ID0gaGFuZGxlci5pbnZva2UoJ2NvZGV2aWV3LmlzQWN0aXZhdGVkJywgbGF5b3V0SW5mbyk7XG5cdFx0XHRcdHZhciBoYXNFZGl0b3JTaXplID0gJGVkaXRvci53aWR0aCgpID4gMCAmJiAkZWRpdG9yLmhlaWdodCgpID4gMDtcblx0XHRcdFx0aWYgKCFpc0NvZGV2aWV3ICYmICFjb2xsZWN0aW9uLmxlbmd0aCAmJiBoYXNFZGl0b3JTaXplKSB7XG5cdFx0XHRcdFx0JGVkaXRvci5hZGRDbGFzcygnZHJhZ292ZXInKTtcblx0XHRcdFx0XHQkZHJvcHpvbmUud2lkdGgoJGVkaXRvci53aWR0aCgpKTtcblx0XHRcdFx0XHQkZHJvcHpvbmUuaGVpZ2h0KCRlZGl0b3IuaGVpZ2h0KCkpO1xuXHRcdFx0XHRcdCRkcm9wem9uZU1lc3NhZ2UudGV4dChvcHRpb25zLmxhbmdJbmZvLmltYWdlLmRyYWdJbWFnZUhlcmUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uLmFkZChlLnRhcmdldCk7XG5cdFx0XHR9KS5vbignZHJhZ2xlYXZlJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0Y29sbGVjdGlvbiA9IGNvbGxlY3Rpb24ubm90KGUudGFyZ2V0KTtcblx0XHRcdFx0aWYgKCFjb2xsZWN0aW9uLmxlbmd0aCkge1xuXHRcdFx0XHRcdCRlZGl0b3IucmVtb3ZlQ2xhc3MoJ2RyYWdvdmVyJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLm9uKCdkcm9wJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjb2xsZWN0aW9uID0gJCgpO1xuXHRcdFx0XHQkZWRpdG9yLnJlbW92ZUNsYXNzKCdkcmFnb3ZlcicpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIGNoYW5nZSBkcm9wem9uZSdzIG1lc3NhZ2Ugb24gaG92ZXIuXG5cdFx0XHQkZHJvcHpvbmUub24oJ2RyYWdlbnRlcicsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0JGRyb3B6b25lLmFkZENsYXNzKCdob3ZlcicpO1xuXHRcdFx0XHQkZHJvcHpvbmVNZXNzYWdlLnRleHQob3B0aW9ucy5sYW5nSW5mby5pbWFnZS5kcm9wSW1hZ2UpO1xuXHRcdFx0fSkub24oJ2RyYWdsZWF2ZScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0JGRyb3B6b25lLnJlbW92ZUNsYXNzKCdob3ZlcicpO1xuXHRcdFx0XHQkZHJvcHpvbmVNZXNzYWdlLnRleHQob3B0aW9ucy5sYW5nSW5mby5pbWFnZS5kcmFnSW1hZ2VIZXJlKTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBhdHRhY2ggZHJvcEltYWdlXG5cdFx0XHQkZHJvcHpvbmUub24oJ2Ryb3AnLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHR2YXIgZGF0YVRyYW5zZmVyID0gZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7XG5cdFx0XHRcdHZhciBodG1sID0gZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQvaHRtbCcpO1xuXHRcdFx0XHR2YXIgdGV4dCA9IGRhdGFUcmFuc2Zlci5nZXREYXRhKCd0ZXh0L3BsYWluJyk7XG5cblx0XHRcdFx0dmFyIGxheW91dEluZm8gPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQuY3VycmVudFRhcmdldCB8fCBldmVudC50YXJnZXQpO1xuXG5cdFx0XHRcdGlmIChkYXRhVHJhbnNmZXIgJiYgZGF0YVRyYW5zZmVyLmZpbGVzICYmIGRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkuZm9jdXMoKTtcblx0XHRcdFx0XHRoYW5kbGVyLmluc2VydEltYWdlcyhsYXlvdXRJbmZvLCBkYXRhVHJhbnNmZXIuZmlsZXMpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGh0bWwpIHtcblx0XHRcdFx0XHQkKGh0bWwpLmVhY2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLmZvY3VzKCk7XG5cdFx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmluc2VydE5vZGUnLCBsYXlvdXRJbmZvLmVkaXRhYmxlKCksIHRoaXMpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRleHQpIHtcblx0XHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkuZm9jdXMoKTtcblx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmluc2VydFRleHQnLCBsYXlvdXRJbmZvLmVkaXRhYmxlKCksIHRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KS5vbignZHJhZ292ZXInLCBmYWxzZSk7IC8vIHByZXZlbnQgZGVmYXVsdCBkcmFnb3ZlciBldmVudFxuXHRcdH07XG5cdH07XG5cblx0dmFyIENsaXBib2FyZCA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG5cblx0XHR0aGlzLmF0dGFjaCA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkub24oJ3Bhc3RlJywgaFBhc3RlQ2xpcGJvYXJkSW1hZ2UpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBwYXN0ZSBjbGlwYm9hcmQgaW1hZ2Vcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdFx0ICovXG5cdFx0dmFyIGhQYXN0ZUNsaXBib2FyZEltYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHR2YXIgY2xpcGJvYXJkRGF0YSA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YTtcblx0XHRcdHZhciBsYXlvdXRJbmZvID0gZG9tLm1ha2VMYXlvdXRJbmZvKGV2ZW50LmN1cnJlbnRUYXJnZXQgfHwgZXZlbnQudGFyZ2V0KTtcblx0XHRcdHZhciAkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cblx0XHRcdGlmICghY2xpcGJvYXJkRGF0YSB8fCAhY2xpcGJvYXJkRGF0YS5pdGVtcyB8fCAhY2xpcGJvYXJkRGF0YS5pdGVtcy5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGNhbGxiYWNrcyA9ICRlZGl0YWJsZS5kYXRhKCdjYWxsYmFja3MnKTtcblx0XHRcdFx0Ly8gb25seSBjYW4gcnVuIGlmIGl0IGhhcyBvbkltYWdlVXBsb2FkIG1ldGhvZFxuXHRcdFx0XHRpZiAoIWNhbGxiYWNrcy5vbkltYWdlVXBsb2FkKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gc2F2ZSBjdXJzb3Jcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5zYXZlTm9kZScsICRlZGl0YWJsZSk7XG5cdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3Iuc2F2ZVJhbmdlJywgJGVkaXRhYmxlKTtcblxuXHRcdFx0XHQkZWRpdGFibGUuaHRtbCgnJyk7XG5cblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0dmFyICRpbWcgPSAkZWRpdGFibGUuZmluZCgnaW1nJyk7XG5cblx0XHRcdFx0XHQvLyBpZiBpbWcgaXMgbm8gaW4gY2xpcGJvYXJkLCBpbnNlcnQgdGV4dCBvciBkb21cblx0XHRcdFx0XHRpZiAoISRpbWcubGVuZ3RoIHx8ICRpbWdbMF0uc3JjLmluZGV4T2YoJ2RhdGE6JykgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR2YXIgaHRtbCA9ICRlZGl0YWJsZS5odG1sKCk7XG5cblx0XHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IucmVzdG9yZU5vZGUnLCAkZWRpdGFibGUpO1xuXHRcdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHQvLyBpbnNlcnQgbm9ybWFsIGRvbSBjb2RlXG5cdFx0XHRcdFx0XHRcdCQoaHRtbCkuZWFjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5pbnNlcnROb2RlJywgJGVkaXRhYmxlLCB0aGlzKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChleCkge1xuXHRcdFx0XHRcdFx0XHQvLyBpbnNlcnQgdGV4dFxuXHRcdFx0XHRcdFx0XHQkZWRpdGFibGUuZm9jdXMoKTtcblx0XHRcdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5pbnNlcnRUZXh0JywgJGVkaXRhYmxlLCBodG1sKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgZGF0YXVyaSA9ICRpbWdbMF0uc3JjO1xuXG5cdFx0XHRcdFx0dmFyIGRhdGEgPSBhdG9iKGRhdGF1cmkuc3BsaXQoJywnKVsxXSk7XG5cdFx0XHRcdFx0dmFyIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0YXJyYXlbaV0gPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGJsb2IgPSBuZXcgQmxvYihbYXJyYXldLCB7IHR5cGU6ICdpbWFnZS9wbmcnIH0pO1xuXHRcdFx0XHRcdGJsb2IubmFtZSA9ICdjbGlwYm9hcmQucG5nJztcblxuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IucmVzdG9yZU5vZGUnLCAkZWRpdGFibGUpO1xuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IucmVzdG9yZVJhbmdlJywgJGVkaXRhYmxlKTtcblx0XHRcdFx0XHRoYW5kbGVyLmluc2VydEltYWdlcyhsYXlvdXRJbmZvLCBbYmxvYl0pO1xuXG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5hZnRlckNvbW1hbmQnLCAkZWRpdGFibGUpO1xuXHRcdFx0XHR9LCAwKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpdGVtID0gbGlzdC5oZWFkKGNsaXBib2FyZERhdGEuaXRlbXMpO1xuXHRcdFx0dmFyIGlzQ2xpcGJvYXJkSW1hZ2UgPSBpdGVtLmtpbmQgPT09ICdmaWxlJyAmJiBpdGVtLnR5cGUuaW5kZXhPZignaW1hZ2UvJykgIT09IC0xO1xuXG5cdFx0XHRpZiAoaXNDbGlwYm9hcmRJbWFnZSkge1xuXHRcdFx0XHRoYW5kbGVyLmluc2VydEltYWdlcyhsYXlvdXRJbmZvLCBbaXRlbS5nZXRBc0ZpbGUoKV0pO1xuXHRcdFx0fVxuXG5cdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmFmdGVyQ29tbWFuZCcsICRlZGl0YWJsZSk7XG5cdFx0fTtcblx0fTtcblxuXHR2YXIgTGlua0RpYWxvZyA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG5cblx0XHQvKipcblx0XHQgKiB0b2dnbGUgYnV0dG9uIHN0YXR1c1xuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGJ0blxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNFbmFibGVcblx0XHQgKi9cblx0XHR2YXIgdG9nZ2xlQnRuID0gZnVuY3Rpb24gKCRidG4sIGlzRW5hYmxlKSB7XG5cdFx0XHQkYnRuLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsICFpc0VuYWJsZSk7XG5cdFx0XHQkYnRuLmF0dHIoJ2Rpc2FibGVkJywgIWlzRW5hYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogU2hvdyBsaW5rIGRpYWxvZyBhbmQgc2V0IGV2ZW50IGhhbmRsZXJzIG9uIGRpYWxvZyBjb250cm9scy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGRpYWxvZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsaW5rSW5mb1xuXHRcdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0dGhpcy5zaG93TGlua0RpYWxvZyA9IGZ1bmN0aW9uICgkZWRpdGFibGUsICRkaWFsb2csIGxpbmtJbmZvKSB7XG5cdFx0XHRyZXR1cm4gJC5EZWZlcnJlZChmdW5jdGlvbiAoZGVmZXJyZWQpIHtcblx0XHRcdFx0dmFyICRsaW5rRGlhbG9nID0gJGRpYWxvZy5maW5kKCcubm90ZS1saW5rLWRpYWxvZycpO1xuXG5cdFx0XHRcdHZhciAkbGlua1RleHQgPSAkbGlua0RpYWxvZy5maW5kKCcubm90ZS1saW5rLXRleHQnKSxcblx0XHRcdFx0JGxpbmtVcmwgPSAkbGlua0RpYWxvZy5maW5kKCcubm90ZS1saW5rLXVybCcpLFxuXHRcdFx0XHQkbGlua0J0biA9ICRsaW5rRGlhbG9nLmZpbmQoJy5ub3RlLWxpbmstYnRuJyksXG5cdFx0XHRcdCRvcGVuSW5OZXdXaW5kb3cgPSAkbGlua0RpYWxvZy5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XScpO1xuXG5cdFx0XHRcdCRsaW5rRGlhbG9nLm9uZSgnc2hvd24uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0JGxpbmtUZXh0LnZhbChsaW5rSW5mby50ZXh0KTtcblxuXHRcdFx0XHRcdCRsaW5rVGV4dC5vbignaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBpZiBsaW5rdGV4dCB3YXMgbW9kaWZpZWQgYnkga2V5dXAsXG5cdFx0XHRcdFx0XHQvLyBzdG9wIGNsb25pbmcgdGV4dCBmcm9tIGxpbmtVcmxcblx0XHRcdFx0XHRcdGxpbmtJbmZvLnRleHQgPSAkbGlua1RleHQudmFsKCk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHQvLyBpZiBubyB1cmwgd2FzIGdpdmVuLCBjb3B5IHRleHQgdG8gdXJsXG5cdFx0XHRcdFx0aWYgKCFsaW5rSW5mby51cmwpIHtcblx0XHRcdFx0XHRcdGxpbmtJbmZvLnVybCA9IGxpbmtJbmZvLnRleHQ7XG5cdFx0XHRcdFx0XHR0b2dnbGVCdG4oJGxpbmtCdG4sIGxpbmtJbmZvLnRleHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCRsaW5rVXJsLm9uKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHRvZ2dsZUJ0bigkbGlua0J0biwgJGxpbmtVcmwudmFsKCkpO1xuXHRcdFx0XHRcdFx0Ly8gZGlzcGxheSBzYW1lIGxpbmsgb24gYFRleHQgdG8gZGlzcGxheWAgaW5wdXRcblx0XHRcdFx0XHRcdC8vIHdoZW4gY3JlYXRlIGEgbmV3IGxpbmtcblx0XHRcdFx0XHRcdGlmICghbGlua0luZm8udGV4dCkge1xuXHRcdFx0XHRcdFx0XHQkbGlua1RleHQudmFsKCRsaW5rVXJsLnZhbCgpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KS52YWwobGlua0luZm8udXJsKS50cmlnZ2VyKCdmb2N1cycpLnRyaWdnZXIoJ3NlbGVjdCcpO1xuXG5cdFx0XHRcdFx0JG9wZW5Jbk5ld1dpbmRvdy5wcm9wKCdjaGVja2VkJywgbGlua0luZm8ubmV3V2luZG93KTtcblxuXHRcdFx0XHRcdCRsaW5rQnRuLm9uZSgnY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmUoe1xuXHRcdFx0XHRcdFx0XHRyYW5nZTogbGlua0luZm8ucmFuZ2UsXG5cdFx0XHRcdFx0XHRcdHVybDogJGxpbmtVcmwudmFsKCksXG5cdFx0XHRcdFx0XHRcdHRleHQ6ICRsaW5rVGV4dC52YWwoKSxcblx0XHRcdFx0XHRcdFx0bmV3V2luZG93OiAkb3BlbkluTmV3V2luZG93LmlzKCc6Y2hlY2tlZCcpXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdCRsaW5rRGlhbG9nLm1vZGFsKCdoaWRlJyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pLm9uZSgnaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIGRldGFjaCBldmVudHNcblx0XHRcdFx0XHQkbGlua1RleHQub2ZmKCdpbnB1dCcpO1xuXHRcdFx0XHRcdCRsaW5rVXJsLm9mZignaW5wdXQnKTtcblx0XHRcdFx0XHQkbGlua0J0bi5vZmYoJ2NsaWNrJyk7XG5cblx0XHRcdFx0XHRpZiAoZGVmZXJyZWQuc3RhdGUoKSA9PT0gJ3BlbmRpbmcnKSB7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLm1vZGFsKCdzaG93Jyk7XG5cdFx0XHR9KS5wcm9taXNlKCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy5zaG93ID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdHZhciAkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKSxcblx0XHRcdFx0JGRpYWxvZyA9IGxheW91dEluZm8uZGlhbG9nKCksXG5cdFx0XHRcdCRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKSxcblx0XHRcdFx0JHBvcG92ZXIgPSBsYXlvdXRJbmZvLnBvcG92ZXIoKSxcblx0XHRcdFx0bGlua0luZm8gPSBoYW5kbGVyLmludm9rZSgnZWRpdG9yLmdldExpbmtJbmZvJywgJGVkaXRhYmxlKTtcblxuXHRcdFx0dmFyIG9wdGlvbnMgPSAkZWRpdG9yLmRhdGEoJ29wdGlvbnMnKTtcblxuXHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5zYXZlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXHRcdFx0dGhpcy5zaG93TGlua0RpYWxvZygkZWRpdGFibGUsICRkaWFsb2csIGxpbmtJbmZvKS50aGVuKGZ1bmN0aW9uIChsaW5rSW5mbykge1xuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVSYW5nZScsICRlZGl0YWJsZSk7XG5cdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuY3JlYXRlTGluaycsICRlZGl0YWJsZSwgbGlua0luZm8sIG9wdGlvbnMpO1xuXHRcdFx0XHQvLyBoaWRlIHBvcG92ZXIgYWZ0ZXIgY3JlYXRpbmcgbGlua1xuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgncG9wb3Zlci5oaWRlJywgJHBvcG92ZXIpO1xuXHRcdFx0fSkuZmFpbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IucmVzdG9yZVJhbmdlJywgJGVkaXRhYmxlKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cdH07XG5cblx0dmFyIEltYWdlRGlhbG9nID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblx0XHQvKipcblx0XHQgKiB0b2dnbGUgYnV0dG9uIHN0YXR1c1xuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGJ0blxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNFbmFibGVcblx0XHQgKi9cblx0XHR2YXIgdG9nZ2xlQnRuID0gZnVuY3Rpb24gKCRidG4sIGlzRW5hYmxlKSB7XG5cdFx0XHQkYnRuLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsICFpc0VuYWJsZSk7XG5cdFx0XHQkYnRuLmF0dHIoJ2Rpc2FibGVkJywgIWlzRW5hYmxlKTtcblx0XHR9O1xuXG5cdFx0dGhpcy5zaG93ID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdHZhciAkZGlhbG9nID0gbGF5b3V0SW5mby5kaWFsb2coKSxcblx0XHRcdFx0JGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpO1xuXG5cdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnNhdmVSYW5nZScsICRlZGl0YWJsZSk7XG5cdFx0XHR0aGlzLnNob3dJbWFnZURpYWxvZygkZWRpdGFibGUsICRkaWFsb2cpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHQvLyBpbWFnZSB1cmxcblx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmluc2VydEltYWdlJywgJGVkaXRhYmxlLCBkYXRhKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhcnJheSBvZiBmaWxlc1xuXHRcdFx0XHRcdGhhbmRsZXIuaW5zZXJ0SW1hZ2VzKGxheW91dEluZm8sIGRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KS5mYWlsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHNob3cgaW1hZ2UgZGlhbG9nXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRkaWFsb2dcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHRcdCAqL1xuXHRcdHRoaXMuc2hvd0ltYWdlRGlhbG9nID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgJGRpYWxvZykge1xuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoZnVuY3Rpb24gKGRlZmVycmVkKSB7XG5cdFx0XHRcdHZhciAkaW1hZ2VEaWFsb2cgPSAkZGlhbG9nLmZpbmQoJy5ub3RlLWltYWdlLWRpYWxvZycpO1xuXG5cdFx0XHRcdHZhciAkaW1hZ2VJbnB1dCA9ICRkaWFsb2cuZmluZCgnLm5vdGUtaW1hZ2UtaW5wdXQnKSxcblx0XHRcdFx0XHQkaW1hZ2VVcmwgPSAkZGlhbG9nLmZpbmQoJy5ub3RlLWltYWdlLXVybCcpLFxuXHRcdFx0XHRcdCRpbWFnZUJ0biA9ICRkaWFsb2cuZmluZCgnLm5vdGUtaW1hZ2UtYnRuJyk7XG5cblx0XHRcdFx0JGltYWdlRGlhbG9nLm9uZSgnc2hvd24uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gQ2xvbmluZyBpbWFnZUlucHV0IHRvIGNsZWFyIGVsZW1lbnQuXG5cdFx0XHRcdFx0JGltYWdlSW5wdXQucmVwbGFjZVdpdGgoJGltYWdlSW5wdXQuY2xvbmUoKVxuXHRcdFx0XHRcdCAgLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0ICBcdGRlZmVycmVkLnJlc29sdmUodGhpcy5maWxlcyB8fCB0aGlzLnZhbHVlKTtcblx0XHRcdFx0XHQgIFx0JGltYWdlRGlhbG9nLm1vZGFsKCdoaWRlJyk7XG5cdFx0XHRcdFx0ICB9KVxuXHRcdFx0XHRcdCAgLnZhbCgnJylcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0JGltYWdlQnRuLmNsaWNrKGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZSgkaW1hZ2VVcmwudmFsKCkpO1xuXHRcdFx0XHRcdFx0JGltYWdlRGlhbG9nLm1vZGFsKCdoaWRlJyk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHQkaW1hZ2VVcmwub24oJ2tleXVwIHBhc3RlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdFx0XHR2YXIgdXJsO1xuXG5cdFx0XHRcdFx0XHRpZiAoZXZlbnQudHlwZSA9PT0gJ3Bhc3RlJykge1xuXHRcdFx0XHRcdFx0XHR1cmwgPSBldmVudC5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dXJsID0gJGltYWdlVXJsLnZhbCgpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR0b2dnbGVCdG4oJGltYWdlQnRuLCB1cmwpO1xuXHRcdFx0XHRcdH0pLnZhbCgnJykudHJpZ2dlcignZm9jdXMnKTtcblx0XHRcdFx0fSkub25lKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0JGltYWdlSW5wdXQub2ZmKCdjaGFuZ2UnKTtcblx0XHRcdFx0XHQkaW1hZ2VVcmwub2ZmKCdrZXl1cCBwYXN0ZScpO1xuXHRcdFx0XHRcdCRpbWFnZUJ0bi5vZmYoJ2NsaWNrJyk7XG5cblx0XHRcdFx0XHRpZiAoZGVmZXJyZWQuc3RhdGUoKSA9PT0gJ3BlbmRpbmcnKSB7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLm1vZGFsKCdzaG93Jyk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHR9O1xuXG5cdHZhciBIZWxwRGlhbG9nID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblx0XHQvKipcblx0XHQgKiBzaG93IGhlbHAgZGlhbG9nXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRkaWFsb2dcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHRcdCAqL1xuXHRcdHRoaXMuc2hvd0hlbHBEaWFsb2cgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCAkZGlhbG9nKSB7XG5cdFx0XHRyZXR1cm4gJC5EZWZlcnJlZChmdW5jdGlvbiAoZGVmZXJyZWQpIHtcblx0XHRcdFx0dmFyICRoZWxwRGlhbG9nID0gJGRpYWxvZy5maW5kKCcubm90ZS1oZWxwLWRpYWxvZycpO1xuXG5cdFx0XHRcdCRoZWxwRGlhbG9nLm9uZSgnaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmUoKTtcblx0XHRcdFx0fSkubW9kYWwoJ3Nob3cnKTtcblx0XHRcdH0pLnByb21pc2UoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHQgKi9cblx0XHR0aGlzLnNob3cgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0dmFyICRkaWFsb2cgPSBsYXlvdXRJbmZvLmRpYWxvZygpLFxuXHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cblx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3Iuc2F2ZVJhbmdlJywgJGVkaXRhYmxlLCB0cnVlKTtcblx0XHRcdHRoaXMuc2hvd0hlbHBEaWFsb2coJGVkaXRhYmxlLCAkZGlhbG9nKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBAY2xhc3MgRXZlbnRIYW5kbGVyXG5cdCAqXG5cdCAqIEV2ZW50SGFuZGxlclxuXHQgKiAgLSBUT0RPOiBuZXcgaW5zdGFuY2UgcGVyIGEgZWRpdG9yXG5cdCAqICAtIFRPRE86IHJlbmFtZSBFdmVudEhhbmRsZXJcblx0ICovXG5cdHZhciBFdmVudEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0LyoqXG5cdFx0ICogTW9kdWxlc1xuXHRcdCAqL1xuXHRcdHZhciBtb2R1bGVzID0gdGhpcy5tb2R1bGVzID0ge1xuXHRcdFx0ZWRpdG9yOiBuZXcgRWRpdG9yKHRoaXMpLFxuXHRcdFx0dG9vbGJhcjogbmV3IFRvb2xiYXIodGhpcyksXG5cdFx0XHRzdGF0dXNiYXI6IG5ldyBTdGF0dXNiYXIodGhpcyksXG5cdFx0XHRwb3BvdmVyOiBuZXcgUG9wb3Zlcih0aGlzKSxcblx0XHRcdGhhbmRsZTogbmV3IEhhbmRsZSh0aGlzKSxcblx0XHRcdGZ1bGxzY3JlZW46IG5ldyBGdWxsc2NyZWVuKHRoaXMpLFxuXHRcdFx0Y29kZXZpZXc6IG5ldyBDb2Rldmlldyh0aGlzKSxcblx0XHRcdGRyYWdBbmREcm9wOiBuZXcgRHJhZ0FuZERyb3AodGhpcyksXG5cdFx0XHRjbGlwYm9hcmQ6IG5ldyBDbGlwYm9hcmQodGhpcyksXG5cdFx0XHRsaW5rRGlhbG9nOiBuZXcgTGlua0RpYWxvZyh0aGlzKSxcblx0XHRcdGltYWdlRGlhbG9nOiBuZXcgSW1hZ2VEaWFsb2codGhpcyksXG5cdFx0XHRoZWxwRGlhbG9nOiBuZXcgSGVscERpYWxvZyh0aGlzKVxuXHRcdH07XG5cblx0XHQvLyBUT0RPIHJlZmFjdG9yIG1vZHVsZXMgYW5kIGV2ZW50SGFuZGxlclxuXHRcdC8vICAtIHJlbW92ZSB0aGlzIG1ldGhvZCBhbmQgdXNlIGN1c3RvbSBldmVudCBmcm9tICRob2xkZXIgaW5zdGVhZFxuXHRcdHRoaXMuaW52b2tlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIG1vZHVsZUFuZE1ldGhvZCA9IGxpc3QuaGVhZChsaXN0LmZyb20oYXJndW1lbnRzKSk7XG5cdFx0XHR2YXIgYXJncyA9IGxpc3QudGFpbChsaXN0LmZyb20oYXJndW1lbnRzKSk7XG5cblx0XHRcdHZhciBzcGxpdHMgPSBtb2R1bGVBbmRNZXRob2Quc3BsaXQoJy4nKTtcblx0XHRcdHZhciBoYXNTZXBhcmF0b3IgPSBzcGxpdHMubGVuZ3RoID4gMTtcblx0XHRcdHZhciBtb2R1bGVOYW1lID0gaGFzU2VwYXJhdG9yICYmIGxpc3QuaGVhZChzcGxpdHMpO1xuXHRcdFx0dmFyIG1ldGhvZE5hbWUgPSBoYXNTZXBhcmF0b3IgPyBsaXN0Lmxhc3Qoc3BsaXRzKSA6IGxpc3QuaGVhZChzcGxpdHMpO1xuXG5cdFx0XHR2YXIgbW9kdWxlID0gdGhpcy5nZXRNb2R1bGUobW9kdWxlTmFtZSk7XG5cdFx0XHR2YXIgbWV0aG9kID0gbW9kdWxlW21ldGhvZE5hbWVdO1xuXG5cdFx0XHRyZXR1cm4gbWV0aG9kICYmIG1ldGhvZC5hcHBseShtb2R1bGUsIGFyZ3MpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIG1vZHVsZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgLSBuYW1lIG9mIG1vZHVsZVxuXHRcdCAqIEByZXR1cm4ge01vZHVsZX0gLSBkZWZhdWx0cyBpcyBlZGl0b3Jcblx0XHQgKi9cblx0XHR0aGlzLmdldE1vZHVsZSA9IGZ1bmN0aW9uIChtb2R1bGVOYW1lKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdIHx8IHRoaXMubW9kdWxlcy5lZGl0b3I7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGluc2VydCBJbWFnZXMgZnJvbSBmaWxlIGFycmF5LlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqIEBwYXJhbSB7RmlsZVtdfSBmaWxlc1xuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0SW1hZ2VzID0gZnVuY3Rpb24gKGxheW91dEluZm8sIGZpbGVzKSB7XG5cdFx0XHR2YXIgJGVkaXRvciA9IGxheW91dEluZm8uZWRpdG9yKCksXG5cdFx0XHRcdCRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKSxcblx0XHRcdFx0JGhvbGRlciA9IGxheW91dEluZm8uaG9sZGVyKCk7XG5cblx0XHRcdHZhciBjYWxsYmFja3MgPSAkZWRpdGFibGUuZGF0YSgnY2FsbGJhY2tzJyk7XG5cdFx0XHR2YXIgb3B0aW9ucyA9ICRlZGl0b3IuZGF0YSgnb3B0aW9ucycpO1xuXG5cdFx0XHQvLyBJZiBvbkltYWdlVXBsb2FkIG9wdGlvbnMgc2V0dGVkXG5cdFx0XHRpZiAoY2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWQpIHtcblx0XHRcdFx0Y2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWQoZmlsZXMsIG1vZHVsZXMuZWRpdG9yLCAkZWRpdGFibGUpO1xuXHRcdFx0XHRiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2ltYWdlLnVwbG9hZCcpKFtmaWxlc10pO1xuXHRcdFx0XHQvLyBlbHNlIGluc2VydCBJbWFnZSBhcyBkYXRhVVJMXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkLmVhY2goZmlsZXMsIGZ1bmN0aW9uIChpZHgsIGZpbGUpIHtcblx0XHRcdFx0XHR2YXIgZmlsZW5hbWUgPSBmaWxlLm5hbWU7XG5cdFx0XHRcdFx0aWYgKG9wdGlvbnMubWF4aW11bUltYWdlRmlsZVNpemUgJiYgb3B0aW9ucy5tYXhpbXVtSW1hZ2VGaWxlU2l6ZSA8IGZpbGUuc2l6ZSkge1xuXHRcdFx0XHRcdFx0aWYgKGNhbGxiYWNrcy5vbkltYWdlVXBsb2FkRXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWRFcnJvcihvcHRpb25zLmxhbmdJbmZvLmltYWdlLm1heGltdW1GaWxlU2l6ZUVycm9yKTtcblx0XHRcdFx0XHRcdFx0YmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdpbWFnZS51cGxvYWQuZXJyb3InKShvcHRpb25zLmxhbmdJbmZvLmltYWdlLm1heGltdW1GaWxlU2l6ZUVycm9yKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGFsZXJ0KG9wdGlvbnMubGFuZ0luZm8uaW1hZ2UubWF4aW11bUZpbGVTaXplRXJyb3IpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhc3luYy5yZWFkRmlsZUFzRGF0YVVSTChmaWxlKS50aGVuKGZ1bmN0aW9uIChzRGF0YVVSTCkge1xuXHRcdFx0XHRcdFx0XHRtb2R1bGVzLmVkaXRvci5pbnNlcnRJbWFnZSgkZWRpdGFibGUsIHNEYXRhVVJMLCBmaWxlbmFtZSk7XG5cdFx0XHRcdFx0XHR9KS5mYWlsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGNhbGxiYWNrcy5vbkltYWdlVXBsb2FkRXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRjYWxsYmFja3Mub25JbWFnZVVwbG9hZEVycm9yKCk7XG5cdFx0XHRcdFx0XHRcdFx0YmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdpbWFnZS51cGxvYWQuZXJyb3InKShvcHRpb25zLmxhbmdJbmZvLmltYWdlLm1heGltdW1GaWxlU2l6ZUVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmFyIGNvbW1hbmRzID0ge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdFx0ICovXG5cdFx0XHRzaG93TGlua0RpYWxvZzogZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdFx0bW9kdWxlcy5saW5rRGlhbG9nLnNob3cobGF5b3V0SW5mbyk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0XHQgKi9cblx0XHRcdHNob3dJbWFnZURpYWxvZzogZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdFx0bW9kdWxlcy5pbWFnZURpYWxvZy5zaG93KGxheW91dEluZm8pO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdFx0ICovXG5cdFx0XHRzaG93SGVscERpYWxvZzogZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdFx0bW9kdWxlcy5oZWxwRGlhbG9nLnNob3cobGF5b3V0SW5mbyk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0XHQgKi9cblx0XHRcdGZ1bGxzY3JlZW46IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHRcdG1vZHVsZXMuZnVsbHNjcmVlbi50b2dnbGUobGF5b3V0SW5mbyk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0XHQgKi9cblx0XHRcdGNvZGV2aWV3OiBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0XHRtb2R1bGVzLmNvZGV2aWV3LnRvZ2dsZShsYXlvdXRJbmZvKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmFyIGhNb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdC8vcHJldmVudERlZmF1bHQgU2VsZWN0aW9uIGZvciBGRiwgSUU4K1xuXHRcdFx0aWYgKGRvbS5pc0ltZyhldmVudC50YXJnZXQpKSB7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBoVG9vbGJhckFuZFBvcG92ZXJVcGRhdGUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdC8vIGRlbGF5IGZvciByYW5nZSBhZnRlciBtb3VzZXVwXG5cdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIGxheW91dEluZm8gPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQuY3VycmVudFRhcmdldCB8fCBldmVudC50YXJnZXQpO1xuXHRcdFx0XHR2YXIgc3R5bGVJbmZvID0gbW9kdWxlcy5lZGl0b3IuY3VycmVudFN0eWxlKGV2ZW50LnRhcmdldCk7XG5cdFx0XHRcdGlmICghc3R5bGVJbmZvKSB7IHJldHVybjsgfVxuXG5cdFx0XHRcdHZhciBpc0Fpck1vZGUgPSBsYXlvdXRJbmZvLmVkaXRvcigpLmRhdGEoJ29wdGlvbnMnKS5haXJNb2RlO1xuXHRcdFx0XHRpZiAoIWlzQWlyTW9kZSkge1xuXHRcdFx0XHRcdG1vZHVsZXMudG9vbGJhci51cGRhdGUobGF5b3V0SW5mby50b29sYmFyKCksIHN0eWxlSW5mbyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtb2R1bGVzLnBvcG92ZXIudXBkYXRlKGxheW91dEluZm8ucG9wb3ZlcigpLCBzdHlsZUluZm8sIGlzQWlyTW9kZSk7XG5cdFx0XHRcdG1vZHVsZXMuaGFuZGxlLnVwZGF0ZShsYXlvdXRJbmZvLmhhbmRsZSgpLCBzdHlsZUluZm8sIGlzQWlyTW9kZSk7XG5cdFx0XHR9LCAwKTtcblx0XHR9O1xuXG5cdFx0dmFyIGhTY3JvbGwgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdHZhciBsYXlvdXRJbmZvID0gZG9tLm1ha2VMYXlvdXRJbmZvKGV2ZW50LmN1cnJlbnRUYXJnZXQgfHwgZXZlbnQudGFyZ2V0KTtcblx0XHRcdC8vaGlkZSBwb3BvdmVyIGFuZCBoYW5kbGUgd2hlbiBzY3JvbGxlZFxuXHRcdFx0bW9kdWxlcy5wb3BvdmVyLmhpZGUobGF5b3V0SW5mby5wb3BvdmVyKCkpO1xuXHRcdFx0bW9kdWxlcy5oYW5kbGUuaGlkZShsYXlvdXRJbmZvLmhhbmRsZSgpKTtcblx0XHR9O1xuXG5cdFx0dmFyIGhUb29sYmFyQW5kUG9wb3Zlck1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0Ly8gcHJldmVudCBkZWZhdWx0IGV2ZW50IHdoZW4gaW5zZXJ0VGFibGUgKEZGLCBXZWJraXQpXG5cdFx0XHR2YXIgJGJ0biA9ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1ldmVudF0nKTtcblx0XHRcdGlmICgkYnRuLmxlbmd0aCkge1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgaFRvb2xiYXJBbmRQb3BvdmVyQ2xpY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdHZhciAkYnRuID0gJChldmVudC50YXJnZXQpLmNsb3Nlc3QoJ1tkYXRhLWV2ZW50XScpO1xuXG5cdFx0XHRpZiAoJGJ0bi5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGV2ZW50TmFtZSA9ICRidG4uYXR0cignZGF0YS1ldmVudCcpLFxuXHRcdFx0XHRcdHZhbHVlID0gJGJ0bi5hdHRyKCdkYXRhLXZhbHVlJyksXG5cdFx0XHRcdFx0aGlkZSA9ICRidG4uYXR0cignZGF0YS1oaWRlJyk7XG5cblx0XHRcdFx0dmFyIGxheW91dEluZm8gPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQudGFyZ2V0KTtcblxuXHRcdFx0XHQvLyBiZWZvcmUgY29tbWFuZDogZGV0ZWN0IGNvbnRyb2wgc2VsZWN0aW9uIGVsZW1lbnQoJHRhcmdldClcblx0XHRcdFx0dmFyICR0YXJnZXQ7XG5cdFx0XHRcdGlmICgkLmluQXJyYXkoZXZlbnROYW1lLCBbJ3Jlc2l6ZScsICdmbG9hdE1lJywgJ3JlbW92ZU1lZGlhJywgJ2ltYWdlU2hhcGUnXSkgIT09IC0xKSB7XG5cdFx0XHRcdFx0dmFyICRzZWxlY3Rpb24gPSBsYXlvdXRJbmZvLmhhbmRsZSgpLmZpbmQoJy5ub3RlLWNvbnRyb2wtc2VsZWN0aW9uJyk7XG5cdFx0XHRcdFx0JHRhcmdldCA9ICQoJHNlbGVjdGlvbi5kYXRhKCd0YXJnZXQnKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiByZXF1ZXN0ZWQsIGhpZGUgdGhlIHBvcG92ZXIgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQuXG5cdFx0XHRcdC8vIFVzZWZ1bCBmb3IgdGhpbmdzIGxpa2Ugc2hvd0hlbHBEaWFsb2cuXG5cdFx0XHRcdGlmIChoaWRlKSB7XG5cdFx0XHRcdFx0JGJ0bi5wYXJlbnRzKCcucG9wb3ZlcicpLmhpZGUoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICgkLmlzRnVuY3Rpb24oJC5zdW1tZXJub3RlLnBsdWdpbkV2ZW50c1tldmVudE5hbWVdKSkge1xuXHRcdFx0XHRcdCQuc3VtbWVybm90ZS5wbHVnaW5FdmVudHNbZXZlbnROYW1lXShldmVudCwgbW9kdWxlcy5lZGl0b3IsIGxheW91dEluZm8sIHZhbHVlKTtcblx0XHRcdFx0fSBlbHNlIGlmIChtb2R1bGVzLmVkaXRvcltldmVudE5hbWVdKSB7IC8vIG9uIGNvbW1hbmRcblx0XHRcdFx0XHR2YXIgJGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpO1xuXHRcdFx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXHRcdFx0XHRcdG1vZHVsZXMuZWRpdG9yW2V2ZW50TmFtZV0oJGVkaXRhYmxlLCB2YWx1ZSwgJHRhcmdldCk7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fSBlbHNlIGlmIChjb21tYW5kc1tldmVudE5hbWVdKSB7XG5cdFx0XHRcdFx0Y29tbWFuZHNbZXZlbnROYW1lXS5jYWxsKHRoaXMsIGxheW91dEluZm8pO1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBhZnRlciBjb21tYW5kXG5cdFx0XHRcdGlmICgkLmluQXJyYXkoZXZlbnROYW1lLCBbJ2JhY2tDb2xvcicsICdmb3JlQ29sb3InXSkgIT09IC0xKSB7XG5cdFx0XHRcdFx0dmFyIG9wdGlvbnMgPSBsYXlvdXRJbmZvLmVkaXRvcigpLmRhdGEoJ29wdGlvbnMnLCBvcHRpb25zKTtcblx0XHRcdFx0XHR2YXIgbW9kdWxlID0gb3B0aW9ucy5haXJNb2RlID8gbW9kdWxlcy5wb3BvdmVyIDogbW9kdWxlcy50b29sYmFyO1xuXHRcdFx0XHRcdG1vZHVsZS51cGRhdGVSZWNlbnRDb2xvcihsaXN0LmhlYWQoJGJ0biksIGV2ZW50TmFtZSwgdmFsdWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aFRvb2xiYXJBbmRQb3BvdmVyVXBkYXRlKGV2ZW50KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmFyIFBYX1BFUl9FTSA9IDE4O1xuXHRcdHZhciBoRGltZW5zaW9uUGlja2VyTW92ZSA9IGZ1bmN0aW9uIChldmVudCwgb3B0aW9ucykge1xuXHRcdFx0dmFyICRwaWNrZXIgPSAkKGV2ZW50LnRhcmdldC5wYXJlbnROb2RlKTsgLy8gdGFyZ2V0IGlzIG1vdXNlY2F0Y2hlclxuXHRcdFx0dmFyICRkaW1lbnNpb25EaXNwbGF5ID0gJHBpY2tlci5uZXh0KCk7XG5cdFx0XHR2YXIgJGNhdGNoZXIgPSAkcGlja2VyLmZpbmQoJy5ub3RlLWRpbWVuc2lvbi1waWNrZXItbW91c2VjYXRjaGVyJyk7XG5cdFx0XHR2YXIgJGhpZ2hsaWdodGVkID0gJHBpY2tlci5maW5kKCcubm90ZS1kaW1lbnNpb24tcGlja2VyLWhpZ2hsaWdodGVkJyk7XG5cdFx0XHR2YXIgJHVuaGlnaGxpZ2h0ZWQgPSAkcGlja2VyLmZpbmQoJy5ub3RlLWRpbWVuc2lvbi1waWNrZXItdW5oaWdobGlnaHRlZCcpO1xuXG5cdFx0XHR2YXIgcG9zT2Zmc2V0O1xuXHRcdFx0Ly8gSFRNTDUgd2l0aCBqUXVlcnkgLSBlLm9mZnNldFggaXMgdW5kZWZpbmVkIGluIEZpcmVmb3hcblx0XHRcdGlmIChldmVudC5vZmZzZXRYID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dmFyIHBvc0NhdGNoZXIgPSAkKGV2ZW50LnRhcmdldCkub2Zmc2V0KCk7XG5cdFx0XHRcdHBvc09mZnNldCA9IHtcblx0XHRcdFx0XHR4OiBldmVudC5wYWdlWCAtIHBvc0NhdGNoZXIubGVmdCxcblx0XHRcdFx0XHR5OiBldmVudC5wYWdlWSAtIHBvc0NhdGNoZXIudG9wXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwb3NPZmZzZXQgPSB7XG5cdFx0XHRcdFx0eDogZXZlbnQub2Zmc2V0WCxcblx0XHRcdFx0XHR5OiBldmVudC5vZmZzZXRZXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHZhciBkaW0gPSB7XG5cdFx0XHRcdGM6IE1hdGguY2VpbChwb3NPZmZzZXQueCAvIFBYX1BFUl9FTSkgfHwgMSxcblx0XHRcdFx0cjogTWF0aC5jZWlsKHBvc09mZnNldC55IC8gUFhfUEVSX0VNKSB8fCAxXG5cdFx0XHR9O1xuXG5cdFx0XHQkaGlnaGxpZ2h0ZWQuY3NzKHsgd2lkdGg6IGRpbS5jICsgJ2VtJywgaGVpZ2h0OiBkaW0uciArICdlbScgfSk7XG5cdFx0XHQkY2F0Y2hlci5hdHRyKCdkYXRhLXZhbHVlJywgZGltLmMgKyAneCcgKyBkaW0ucik7XG5cblx0XHRcdGlmICgzIDwgZGltLmMgJiYgZGltLmMgPCBvcHRpb25zLmluc2VydFRhYmxlTWF4U2l6ZS5jb2wpIHtcblx0XHRcdFx0JHVuaGlnaGxpZ2h0ZWQuY3NzKHsgd2lkdGg6IGRpbS5jICsgMSArICdlbScgfSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICgzIDwgZGltLnIgJiYgZGltLnIgPCBvcHRpb25zLmluc2VydFRhYmxlTWF4U2l6ZS5yb3cpIHtcblx0XHRcdFx0JHVuaGlnaGxpZ2h0ZWQuY3NzKHsgaGVpZ2h0OiBkaW0uciArIDEgKyAnZW0nIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQkZGltZW5zaW9uRGlzcGxheS5odG1sKGRpbS5jICsgJyB4ICcgKyBkaW0ucik7XG5cdFx0fTtcblxuXHRcdHZhciBiaW5kQ3VzdG9tRXZlbnQgPSBmdW5jdGlvbiAoJGhvbGRlciwgZXZlbnROYW1lKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gJGhvbGRlci50cmlnZ2VyKCdzdW1tZXJub3RlLicgKyBldmVudE5hbWUsIGFyZ3VtZW50cyk7XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBiaW5kIEtleU1hcCBvbiBrZXlkb3duXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBrZXlNYXBcblx0XHQgKi9cblx0XHR0aGlzLmJpbmRLZXlNYXAgPSBmdW5jdGlvbiAobGF5b3V0SW5mbywga2V5TWFwKSB7XG5cdFx0XHR2YXIgJGVkaXRvciA9IGxheW91dEluZm8uZWRpdG9yKCk7XG5cdFx0XHR2YXIgJGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpO1xuXG5cdFx0XHQkZWRpdGFibGUub24oJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0dmFyIGtleXMgPSBbXTtcblxuXHRcdFx0XHQvLyBtb2RpZmllclxuXHRcdFx0XHRpZiAoZXZlbnQubWV0YUtleSkgeyBrZXlzLnB1c2goJ0NNRCcpOyB9XG5cdFx0XHRcdGlmIChldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkpIHsga2V5cy5wdXNoKCdDVFJMJyk7IH1cblx0XHRcdFx0aWYgKGV2ZW50LnNoaWZ0S2V5KSB7IGtleXMucHVzaCgnU0hJRlQnKTsgfVxuXG5cdFx0XHRcdC8vIGtleWNvZGVcblx0XHRcdFx0dmFyIGtleU5hbWUgPSBrZXkubmFtZUZyb21Db2RlW2V2ZW50LmtleUNvZGVdO1xuXHRcdFx0XHRpZiAoa2V5TmFtZSkge1xuXHRcdFx0XHRcdGtleXMucHVzaChrZXlOYW1lKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBldmVudE5hbWUgPSBrZXlNYXBba2V5cy5qb2luKCcrJyldO1xuXHRcdFx0XHRpZiAoZXZlbnROYW1lKSB7XG5cdFx0XHRcdFx0aWYgKCQuc3VtbWVybm90ZS5wbHVnaW5FdmVudHNbZXZlbnROYW1lXSkge1xuXHRcdFx0XHRcdFx0dmFyIHBsdWdpbiA9ICQuc3VtbWVybm90ZS5wbHVnaW5FdmVudHNbZXZlbnROYW1lXTtcblx0XHRcdFx0XHRcdGlmICgkLmlzRnVuY3Rpb24ocGx1Z2luKSkge1xuXHRcdFx0XHRcdFx0XHRwbHVnaW4oZXZlbnQsIG1vZHVsZXMuZWRpdG9yLCBsYXlvdXRJbmZvKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKG1vZHVsZXMuZWRpdG9yW2V2ZW50TmFtZV0pIHtcblx0XHRcdFx0XHRcdG1vZHVsZXMuZWRpdG9yW2V2ZW50TmFtZV0oJGVkaXRhYmxlLCAkZWRpdG9yLmRhdGEoJ29wdGlvbnMnKSk7XG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoY29tbWFuZHNbZXZlbnROYW1lXSkge1xuXHRcdFx0XHRcdFx0Y29tbWFuZHNbZXZlbnROYW1lXS5jYWxsKHRoaXMsIGxheW91dEluZm8pO1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoa2V5LmlzRWRpdChldmVudC5rZXlDb2RlKSkge1xuXHRcdFx0XHRcdG1vZHVsZXMuZWRpdG9yLmFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYXR0YWNoIGV2ZW50aGFuZGxlclxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm8gLSBsYXlvdXQgSW5mb3JtYXRpb25zXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSB1c2VyIG9wdGlvbnMgaW5jbHVkZSBjdXN0b20gZXZlbnQgaGFuZGxlcnNcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50KX0gW29wdGlvbnMub25lbnRlcl0gLSBlbnRlciBrZXkgaGFuZGxlclxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQpfSBbb3B0aW9ucy5vbmZvY3VzXVxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQpfSBbb3B0aW9ucy5vbmJsdXJdXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihldmVudCl9IFtvcHRpb25zLm9ua2V5dXBdXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihldmVudCl9IFtvcHRpb25zLm9ua2V5ZG93bl1cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50KX0gW29wdGlvbnMub25wYXN0ZV1cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50KX0gW29wdGlvbnMub25Ub29sQmFyY2xpY2tdXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihldmVudCl9IFtvcHRpb25zLm9uQ2hhbmdlXVxuXHRcdCAqL1xuXHRcdHRoaXMuYXR0YWNoID0gZnVuY3Rpb24gKGxheW91dEluZm8sIG9wdGlvbnMpIHtcblx0XHRcdC8vIGhhbmRsZXJzIGZvciBlZGl0YWJsZVxuXHRcdFx0aWYgKG9wdGlvbnMuc2hvcnRjdXRzKSB7XG5cdFx0XHRcdHRoaXMuYmluZEtleU1hcChsYXlvdXRJbmZvLCBvcHRpb25zLmtleU1hcFthZ2VudC5pc01hYyA/ICdtYWMnIDogJ3BjJ10pO1xuXHRcdFx0fVxuXHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLm9uKCdtb3VzZWRvd24nLCBoTW91c2Vkb3duKTtcblx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5vbigna2V5dXAgbW91c2V1cCcsIGhUb29sYmFyQW5kUG9wb3ZlclVwZGF0ZSk7XG5cdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkub24oJ3Njcm9sbCcsIGhTY3JvbGwpO1xuXHRcdFx0bW9kdWxlcy5jbGlwYm9hcmQuYXR0YWNoKGxheW91dEluZm8sIG9wdGlvbnMpO1xuXG5cdFx0XHQvLyBoYW5kbGVyIGZvciBoYW5kbGUgYW5kIHBvcG92ZXJcblx0XHRcdG1vZHVsZXMuaGFuZGxlLmF0dGFjaChsYXlvdXRJbmZvLCBvcHRpb25zKTtcblx0XHRcdGxheW91dEluZm8ucG9wb3ZlcigpLm9uKCdjbGljaycsIGhUb29sYmFyQW5kUG9wb3ZlckNsaWNrKTtcblx0XHRcdGxheW91dEluZm8ucG9wb3ZlcigpLm9uKCdtb3VzZWRvd24nLCBoVG9vbGJhckFuZFBvcG92ZXJNb3VzZWRvd24pO1xuXG5cdFx0XHQvLyBoYW5kbGVyIGZvciBkcmFnIGFuZCBkcm9wXG5cdFx0XHRtb2R1bGVzLmRyYWdBbmREcm9wLmF0dGFjaChsYXlvdXRJbmZvLCBvcHRpb25zKTtcblxuXHRcdFx0Ly8gaGFuZGxlcnMgZm9yIGZyYW1lIG1vZGUgKHRvb2xiYXIsIHN0YXR1c2Jhcilcblx0XHRcdGlmICghb3B0aW9ucy5haXJNb2RlKSB7XG5cdFx0XHRcdC8vIGhhbmRsZXIgZm9yIHRvb2xiYXJcblx0XHRcdFx0bGF5b3V0SW5mby50b29sYmFyKCkub24oJ2NsaWNrJywgaFRvb2xiYXJBbmRQb3BvdmVyQ2xpY2spO1xuXHRcdFx0XHRsYXlvdXRJbmZvLnRvb2xiYXIoKS5vbignbW91c2Vkb3duJywgaFRvb2xiYXJBbmRQb3BvdmVyTW91c2Vkb3duKTtcblxuXHRcdFx0XHQvLyBoYW5kbGVyIGZvciBzdGF0dXNiYXJcblx0XHRcdFx0bW9kdWxlcy5zdGF0dXNiYXIuYXR0YWNoKGxheW91dEluZm8sIG9wdGlvbnMpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBoYW5kbGVyIGZvciB0YWJsZSBkaW1lbnNpb25cblx0XHRcdHZhciAkY2F0Y2hlckNvbnRhaW5lciA9IG9wdGlvbnMuYWlyTW9kZSA/IGxheW91dEluZm8ucG9wb3ZlcigpIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBsYXlvdXRJbmZvLnRvb2xiYXIoKTtcblx0XHRcdHZhciAkY2F0Y2hlciA9ICRjYXRjaGVyQ29udGFpbmVyLmZpbmQoJy5ub3RlLWRpbWVuc2lvbi1waWNrZXItbW91c2VjYXRjaGVyJyk7XG5cdFx0XHQkY2F0Y2hlci5jc3Moe1xuXHRcdFx0XHR3aWR0aDogb3B0aW9ucy5pbnNlcnRUYWJsZU1heFNpemUuY29sICsgJ2VtJyxcblx0XHRcdFx0aGVpZ2h0OiBvcHRpb25zLmluc2VydFRhYmxlTWF4U2l6ZS5yb3cgKyAnZW0nXG5cdFx0XHR9KS5vbignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdGhEaW1lbnNpb25QaWNrZXJNb3ZlKGV2ZW50LCBvcHRpb25zKTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBzYXZlIG9wdGlvbnMgb24gZWRpdG9yXG5cdFx0XHRsYXlvdXRJbmZvLmVkaXRvcigpLmRhdGEoJ29wdGlvbnMnLCBvcHRpb25zKTtcblxuXHRcdFx0Ly8gcmV0IHN0eWxlV2l0aENTUyBmb3IgYmFja0NvbG9yIC8gZm9yZUNvbG9yIGNsZWFyaW5nIHdpdGggJ2luaGVyaXQnLlxuXHRcdFx0aWYgKCFhZ2VudC5pc01TSUUpIHtcblx0XHRcdFx0Ly8gcHJvdGVjdCBGRiBFcnJvcjogTlNfRVJST1JfRkFJTFVSRTogRmFpbHVyZVxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRkb2N1bWVudC5leGVjQ29tbWFuZCgnc3R5bGVXaXRoQ1NTJywgMCwgb3B0aW9ucy5zdHlsZVdpdGhTcGFuKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhpc3Rvcnlcblx0XHRcdHZhciBoaXN0b3J5ID0gbmV3IEhpc3RvcnkobGF5b3V0SW5mby5lZGl0YWJsZSgpKTtcblx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5kYXRhKCdOb3RlSGlzdG9yeScsIGhpc3RvcnkpO1xuXG5cdFx0XHQvLyBiYXNpYyBldmVudCBjYWxsYmFja3MgKGxvd2VyY2FzZSlcblx0XHRcdC8vIGVudGVyLCBmb2N1cywgYmx1ciwga2V5dXAsIGtleWRvd25cblx0XHRcdGlmIChvcHRpb25zLm9uZW50ZXIpIHtcblx0XHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLmtleXByZXNzKGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHRcdGlmIChldmVudC5rZXlDb2RlID09PSBrZXkuRU5URVIpIHsgb3B0aW9ucy5vbmVudGVyKGV2ZW50KTsgfVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9wdGlvbnMub25mb2N1cykgeyBsYXlvdXRJbmZvLmVkaXRhYmxlKCkuZm9jdXMob3B0aW9ucy5vbmZvY3VzKTsgfVxuXHRcdFx0aWYgKG9wdGlvbnMub25ibHVyKSB7IGxheW91dEluZm8uZWRpdGFibGUoKS5ibHVyKG9wdGlvbnMub25ibHVyKTsgfVxuXHRcdFx0aWYgKG9wdGlvbnMub25rZXl1cCkgeyBsYXlvdXRJbmZvLmVkaXRhYmxlKCkua2V5dXAob3B0aW9ucy5vbmtleXVwKTsgfVxuXHRcdFx0aWYgKG9wdGlvbnMub25rZXlkb3duKSB7IGxheW91dEluZm8uZWRpdGFibGUoKS5rZXlkb3duKG9wdGlvbnMub25rZXlkb3duKTsgfVxuXHRcdFx0aWYgKG9wdGlvbnMub25wYXN0ZSkgeyBsYXlvdXRJbmZvLmVkaXRhYmxlKCkub24oJ3Bhc3RlJywgb3B0aW9ucy5vbnBhc3RlKTsgfVxuXG5cdFx0XHQvLyBjYWxsYmFja3MgZm9yIGFkdmFuY2VkIGZlYXR1cmVzIChjYW1lbClcblxuXHRcdFx0Ly8gb25Ub29sYmFyQ2xpY2tcblx0XHRcdGlmIChvcHRpb25zLm9uVG9vbGJhckNsaWNrKSB7XG5cdFx0XHRcdGxheW91dEluZm8udG9vbGJhcigpLmNsaWNrKG9wdGlvbnMub25Ub29sYmFyQ2xpY2spO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBvbkNoYW5nZVxuXHRcdFx0aWYgKG9wdGlvbnMub25DaGFuZ2UpIHtcblx0XHRcdFx0dmFyIGhDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0bW9kdWxlcy5lZGl0b3IudHJpZ2dlck9uQ2hhbmdlKGxheW91dEluZm8uZWRpdGFibGUoKSk7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0aWYgKGFnZW50LmlzTVNJRSkge1xuXHRcdFx0XHRcdHZhciBzRG9tRXZlbnRzID0gJ0RPTUNoYXJhY3RlckRhdGFNb2RpZmllZCBET01TdWJ0cmVlTW9kaWZpZWQgRE9NTm9kZUluc2VydGVkJztcblx0XHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkub24oc0RvbUV2ZW50cywgaENoYW5nZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLm9uKCdpbnB1dCcsIGhDaGFuZ2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFsbCBlZGl0b3Igc3RhdHVzIHdpbGwgYmUgc2F2ZWQgb24gZWRpdGFibGUgd2l0aCBqcXVlcnkncyBkYXRhXG5cdFx0XHQvLyBmb3Igc3VwcG9ydCBtdWx0aXBsZSBlZGl0b3Igd2l0aCBzaW5nbGV0b24gb2JqZWN0LlxuXHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLmRhdGEoJ2NhbGxiYWNrcycsIHtcblx0XHRcdFx0b25CZWZvcmVDaGFuZ2U6IG9wdGlvbnMub25CZWZvcmVDaGFuZ2UsXG5cdFx0XHRcdG9uQ2hhbmdlOiBvcHRpb25zLm9uQ2hhbmdlLFxuXHRcdFx0XHRvbkF1dG9TYXZlOiBvcHRpb25zLm9uQXV0b1NhdmUsXG5cdFx0XHRcdG9uSW1hZ2VVcGxvYWQ6IG9wdGlvbnMub25JbWFnZVVwbG9hZCxcblx0XHRcdFx0b25JbWFnZVVwbG9hZEVycm9yOiBvcHRpb25zLm9uSW1hZ2VVcGxvYWRFcnJvcixcblx0XHRcdFx0b25GaWxlVXBsb2FkOiBvcHRpb25zLm9uRmlsZVVwbG9hZCxcblx0XHRcdFx0b25GaWxlVXBsb2FkRXJyb3I6IG9wdGlvbnMub25GaWxlVXBsb2FkLFxuXHRcdFx0XHRvbk1lZGlhRGVsZXRlOiBvcHRpb25zLm9uTWVkaWFEZWxldGVcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBUZXh0YXJlYTogYXV0byBmaWxsaW5nIHRoZSBjb2RlIGJlZm9yZSBmb3JtIHN1Ym1pdC5cblx0XHRcdGlmIChkb20uaXNUZXh0YXJlYShsaXN0LmhlYWQobGF5b3V0SW5mby5ob2xkZXIoKSkpKSB7XG5cdFx0XHRcdGxheW91dEluZm8uaG9sZGVyKCkuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0dmFyIGNvbnRlbnRzID0gbGF5b3V0SW5mby5ob2xkZXIoKS5jb2RlKCk7XG5cdFx0XHRcdFx0bGF5b3V0SW5mby5ob2xkZXIoKS52YWwoY29udGVudHMpO1xuXG5cdFx0XHRcdFx0Ly8gY2FsbGJhY2sgb24gc3VibWl0XG5cdFx0XHRcdFx0aWYgKG9wdGlvbnMub25zdWJtaXQpIHtcblx0XHRcdFx0XHRcdG9wdGlvbnMub25zdWJtaXQoY29udGVudHMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGF0dGFjaCBqcXVlcnkgY3VzdG9tIGV2ZW50XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mbyAtIGxheW91dCBJbmZvcm1hdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzLmF0dGFjaEN1c3RvbUV2ZW50ID0gZnVuY3Rpb24gKGxheW91dEluZm8sIG9wdGlvbnMpIHtcblx0XHRcdHZhciAkaG9sZGVyID0gbGF5b3V0SW5mby5ob2xkZXIoKTtcblx0XHRcdHZhciAkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cblx0XHRcdCRlZGl0YWJsZS5vbignbW91c2Vkb3duJywgYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdtb3VzZWRvd24nKSk7XG5cdFx0XHQkZWRpdGFibGUub24oJ2tleXVwIG1vdXNldXAnLCBiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ3VwZGF0ZScpKTtcblx0XHRcdCRlZGl0YWJsZS5vbignc2Nyb2xsJywgYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdzY3JvbGwnKSk7XG5cblx0XHRcdC8vIGJhc2ljIGV2ZW50IGNhbGxiYWNrcyAobG93ZXJjYXNlKVxuXHRcdFx0Ly8gZW50ZXIsIGZvY3VzLCBibHVyLCBrZXl1cCwga2V5ZG93blxuXHRcdFx0JGVkaXRhYmxlLmtleXByZXNzKGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHRpZiAoZXZlbnQua2V5Q29kZSA9PT0ga2V5LkVOVEVSKSB7XG5cdFx0XHRcdFx0YmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdlbnRlcicpLmNhbGwodGhpcywgZXZlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0JGVkaXRhYmxlLmZvY3VzKGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnZm9jdXMnKSk7XG5cdFx0XHQkZWRpdGFibGUuYmx1cihiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2JsdXInKSk7XG5cdFx0XHQkZWRpdGFibGUua2V5dXAoYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdrZXl1cCcpKTtcblx0XHRcdCRlZGl0YWJsZS5rZXlkb3duKGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAna2V5ZG93bicpKTtcblx0XHRcdCRlZGl0YWJsZS5vbigncGFzdGUnLCBiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ3Bhc3RlJykpO1xuXG5cdFx0XHQvLyBjYWxsYmFja3MgZm9yIGFkdmFuY2VkIGZlYXR1cmVzIChjYW1lbClcblx0XHRcdGlmICghb3B0aW9ucy5haXJNb2RlKSB7XG5cdFx0XHRcdGxheW91dEluZm8udG9vbGJhcigpLmNsaWNrKGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAndG9vbGJhci5jbGljaycpKTtcblx0XHRcdFx0bGF5b3V0SW5mby5wb3BvdmVyKCkuY2xpY2soYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdwb3BvdmVyLmNsaWNrJykpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWdlbnQuaXNNU0lFKSB7XG5cdFx0XHRcdHZhciBzRG9tRXZlbnRzID0gJ0RPTUNoYXJhY3RlckRhdGFNb2RpZmllZCBET01TdWJ0cmVlTW9kaWZpZWQgRE9NTm9kZUluc2VydGVkJztcblx0XHRcdFx0JGVkaXRhYmxlLm9uKHNEb21FdmVudHMsIGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnY2hhbmdlJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JGVkaXRhYmxlLm9uKCdpbnB1dCcsIGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnY2hhbmdlJykpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUZXh0YXJlYTogYXV0byBmaWxsaW5nIHRoZSBjb2RlIGJlZm9yZSBmb3JtIHN1Ym1pdC5cblx0XHRcdGlmIChkb20uaXNUZXh0YXJlYShsaXN0LmhlYWQoJGhvbGRlcikpKSB7XG5cdFx0XHRcdCRob2xkZXIuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdChmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdHZhciBjb250ZW50cyA9ICRob2xkZXIuY29kZSgpO1xuXHRcdFx0XHRcdGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnc3VibWl0JykuY2FsbCh0aGlzLCBlLCBjb250ZW50cyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBmaXJlIGluaXQgZXZlbnRcblx0XHRcdGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnaW5pdCcpKCk7XG5cblx0XHRcdC8vIGZpcmUgcGx1Z2luIGluaXQgZXZlbnRcblx0XHRcdGZvciAodmFyIGkgPSAwLCBsZW4gPSAkLnN1bW1lcm5vdGUucGx1Z2lucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRpZiAoJC5pc0Z1bmN0aW9uKCQuc3VtbWVybm90ZS5wbHVnaW5zW2ldLmluaXQpKSB7XG5cdFx0XHRcdFx0JC5zdW1tZXJub3RlLnBsdWdpbnNbaV0uaW5pdChsYXlvdXRJbmZvKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0aGlzLmRldGFjaCA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG5cdFx0XHRsYXlvdXRJbmZvLmhvbGRlcigpLm9mZigpO1xuXHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLm9mZigpO1xuXG5cdFx0XHRsYXlvdXRJbmZvLnBvcG92ZXIoKS5vZmYoKTtcblx0XHRcdGxheW91dEluZm8uaGFuZGxlKCkub2ZmKCk7XG5cdFx0XHRsYXlvdXRJbmZvLmRpYWxvZygpLm9mZigpO1xuXG5cdFx0XHRpZiAoIW9wdGlvbnMuYWlyTW9kZSkge1xuXHRcdFx0XHRsYXlvdXRJbmZvLmRyb3B6b25lKCkub2ZmKCk7XG5cdFx0XHRcdGxheW91dEluZm8udG9vbGJhcigpLm9mZigpO1xuXHRcdFx0XHRsYXlvdXRJbmZvLnN0YXR1c2JhcigpLm9mZigpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBSZW5kZXJlclxuXHQgKlxuXHQgKiByZW5kZXJlclxuXHQgKlxuXHQgKiByZW5kZXJpbmcgdG9vbGJhciBhbmQgZWRpdGFibGVcblx0ICovXG5cdHZhciBSZW5kZXJlciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qKlxuXHRcdCAqIGJvb3RzdHJhcCBidXR0b24gdGVtcGxhdGVcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBidXR0b24gbmFtZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gYnV0dG9uIG9wdGlvbnNcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZXZlbnRdIGRhdGEtZXZlbnRcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2xhc3NOYW1lXSBidXR0b24ncyBjbGFzcyBuYW1lXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnZhbHVlXSBkYXRhLXZhbHVlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpdGxlXSBidXR0b24ncyB0aXRsZSBmb3IgcG9wdXBcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZHJvcGRvd25dIGRyb3Bkb3duIGh0bWxcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaGlkZV0gZGF0YS1oaWRlXG5cdFx0ICovXG5cdFx0dmFyIHRwbEJ1dHRvbiA9IGZ1bmN0aW9uIChsYWJlbCwgb3B0aW9ucykge1xuXHRcdFx0dmFyIGV2ZW50ID0gb3B0aW9ucy5ldmVudDtcblx0XHRcdHZhciB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG5cdFx0XHR2YXIgdGl0bGUgPSBvcHRpb25zLnRpdGxlO1xuXHRcdFx0dmFyIGNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3NOYW1lO1xuXHRcdFx0dmFyIGRyb3Bkb3duID0gb3B0aW9ucy5kcm9wZG93bjtcblx0XHRcdHZhciBoaWRlID0gb3B0aW9ucy5oaWRlO1xuXG5cdFx0XHRyZXR1cm4gJzxidXR0b24gdHlwZT1cImJ1dHRvblwiJyArXG5cdFx0XHRcdFx0ICAgJyBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc20gYnRuLXNtYWxsJyArXG5cdFx0XHRcdFx0XHQgKGNsYXNzTmFtZSA/ICcgJyArIGNsYXNzTmFtZSA6ICcnKSArXG5cdFx0XHRcdFx0XHQgKGRyb3Bkb3duID8gJyBkcm9wZG93bi10b2dnbGUnIDogJycpICtcblx0XHRcdFx0XHQgICAnXCInICtcblx0XHRcdFx0XHQgICAoZHJvcGRvd24gPyAnIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIicgOiAnJykgK1xuXHRcdFx0XHRcdCAgICh0aXRsZSA/ICcgdGl0bGU9XCInICsgdGl0bGUgKyAnXCInIDogJycpICtcblx0XHRcdFx0XHQgICAoZXZlbnQgPyAnIGRhdGEtZXZlbnQ9XCInICsgZXZlbnQgKyAnXCInIDogJycpICtcblx0XHRcdFx0XHQgICAodmFsdWUgPyAnIGRhdGEtdmFsdWU9XFwnJyArIHZhbHVlICsgJ1xcJycgOiAnJykgK1xuXHRcdFx0XHRcdCAgIChoaWRlID8gJyBkYXRhLWhpZGU9XFwnJyArIGhpZGUgKyAnXFwnJyA6ICcnKSArXG5cdFx0XHRcdFx0ICAgJyB0YWJpbmRleD1cIi0xXCI+JyArXG5cdFx0XHRcdFx0IGxhYmVsICtcblx0XHRcdFx0XHQgKGRyb3Bkb3duID8gJyA8c3BhbiBjbGFzcz1cImNhcmV0XCI+PC9zcGFuPicgOiAnJykgK1xuXHRcdFx0XHQgICAnPC9idXR0b24+JyArXG5cdFx0XHRcdCAgIChkcm9wZG93biB8fCAnJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGJvb3RzdHJhcCBpY29uIGJ1dHRvbiB0ZW1wbGF0ZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGljb25DbGFzc05hbWVcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmV2ZW50XVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy52YWx1ZV1cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudGl0bGVdXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRyb3Bkb3duXVxuXHRcdCAqL1xuXHRcdHZhciB0cGxJY29uQnV0dG9uID0gZnVuY3Rpb24gKGljb25DbGFzc05hbWUsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBsYWJlbCA9ICc8aSBjbGFzcz1cIicgKyBpY29uQ2xhc3NOYW1lICsgJ1wiPjwvaT4nO1xuXHRcdFx0cmV0dXJuIHRwbEJ1dHRvbihsYWJlbCwgb3B0aW9ucyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGJvb3RzdHJhcCBwb3BvdmVyIHRlbXBsYXRlXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnRcblx0XHQgKi9cblx0XHR2YXIgdHBsUG9wb3ZlciA9IGZ1bmN0aW9uIChjbGFzc05hbWUsIGNvbnRlbnQpIHtcblx0XHRcdHZhciAkcG9wb3ZlciA9ICQoJzxkaXYgY2xhc3M9XCInICsgY2xhc3NOYW1lICsgJyBwb3BvdmVyIGJvdHRvbSBpblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj4nICtcblx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJhcnJvd1wiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudFwiPicgK1xuXHRcdFx0XHRcdCAnPC9kaXY+JyArXG5cdFx0XHRcdCAgICc8L2Rpdj4nKTtcblxuXHRcdFx0JHBvcG92ZXIuZmluZCgnLnBvcG92ZXItY29udGVudCcpLmFwcGVuZChjb250ZW50KTtcblx0XHRcdHJldHVybiAkcG9wb3Zlcjtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYm9vdHN0cmFwIGRpYWxvZyB0ZW1wbGF0ZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbdGl0bGU9JyddXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGJvZHlcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW2Zvb3Rlcj0nJ11cblx0XHQgKi9cblx0XHR2YXIgdHBsRGlhbG9nID0gZnVuY3Rpb24gKGNsYXNzTmFtZSwgdGl0bGUsIGJvZHksIGZvb3Rlcikge1xuXHRcdFx0cmV0dXJuICc8ZGl2IGNsYXNzPVwiJyArIGNsYXNzTmFtZSArICcgbW9kYWxcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCI+JyArXG5cdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCI+JyArXG5cdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+JyArXG5cdFx0XHRcdFx0XHQgKHRpdGxlID9cblx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPicgK1xuXHRcdFx0XHRcdFx0ICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0YWJpbmRleD1cIi0xXCI+JnRpbWVzOzwvYnV0dG9uPicgK1xuXHRcdFx0XHRcdFx0ICAgJzxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+JyArIHRpdGxlICsgJzwvaDQ+JyArXG5cdFx0XHRcdFx0XHQgJzwvZGl2PicgOiAnJ1xuXHRcdFx0XHRcdFx0ICkgK1xuXHRcdFx0XHRcdFx0ICc8Zm9ybSBjbGFzcz1cIm5vdGUtbW9kYWwtZm9ybVwiPicgK1xuXHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+JyArIGJvZHkgKyAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHQgICAoZm9vdGVyID9cblx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+JyArIGZvb3RlciArICc8L2Rpdj4nIDogJydcblx0XHRcdFx0XHRcdCAgICkgK1xuXHRcdFx0XHRcdFx0ICc8L2Zvcm0+JyArXG5cdFx0XHRcdFx0ICAgJzwvZGl2PicgK1xuXHRcdFx0XHRcdCAnPC9kaXY+JyArXG5cdFx0XHRcdCAgICc8L2Rpdj4nO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsQnV0dG9uSW5mbyA9IHtcblx0XHRcdHBpY3R1cmU6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdwaWN0dXJlLW8nLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdzaG93SW1hZ2VEaWFsb2cnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLmltYWdlLFxuXHRcdFx0XHRcdGhpZGU6IHRydWVcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0bGluazogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2xpbmsnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdzaG93TGlua0RpYWxvZycsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcubGluay5saW5rLFxuXHRcdFx0XHRcdGhpZGU6IHRydWVcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0dGFibGU6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBkcm9wZG93biA9ICc8dWwgY2xhc3M9XCJub3RlLXRhYmxlIGRyb3Bkb3duLW1lbnVcIj4nICtcblx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWRpbWVuc2lvbi1waWNrZXJcIj4nICtcblx0XHRcdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtZGltZW5zaW9uLXBpY2tlci1tb3VzZWNhdGNoZXJcIiBkYXRhLWV2ZW50PVwiaW5zZXJ0VGFibGVcIiBkYXRhLXZhbHVlPVwiMXgxXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLWRpbWVuc2lvbi1waWNrZXItaGlnaGxpZ2h0ZWRcIj48L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtZGltZW5zaW9uLXBpY2tlci11bmhpZ2hsaWdodGVkXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWRpbWVuc2lvbi1kaXNwbGF5XCI+IDEgeCAxIDwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHQgICAnPC91bD4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAndGFibGUnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcudGFibGUudGFibGUsXG5cdFx0XHRcdFx0ZHJvcGRvd246IGRyb3Bkb3duXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHN0eWxlOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgaXRlbXMgPSBvcHRpb25zLnN0eWxlVGFncy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIHYpIHtcblx0XHRcdFx0XHR2YXIgbGFiZWwgPSBsYW5nLnN0eWxlW3YgPT09ICdwJyA/ICdub3JtYWwnIDogdl07XG5cdFx0XHRcdFx0cmV0dXJuIG1lbW8gKyAnPGxpPjxhIGRhdGEtZXZlbnQ9XCJmb3JtYXRCbG9ja1wiIGhyZWY9XCIjXCIgZGF0YS12YWx1ZT1cIicgKyB2ICsgJ1wiPicgK1xuXHRcdFx0XHRcdFx0XHQgKFxuXHRcdFx0XHRcdFx0XHQgICAodiA9PT0gJ3AnIHx8IHYgPT09ICdwcmUnKSA/IGxhYmVsIDpcblx0XHRcdFx0XHRcdFx0ICAgJzwnICsgdiArICc+JyArIGxhYmVsICsgJzwvJyArIHYgKyAnPidcblx0XHRcdFx0XHRcdFx0ICkgK1xuXHRcdFx0XHRcdFx0ICAgJzwvYT48L2xpPic7XG5cdFx0XHRcdH0sICcnKTtcblxuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnbWFnaWMnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuc3R5bGUuc3R5bGUsXG5cdFx0XHRcdFx0ZHJvcGRvd246ICc8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+JyArIGl0ZW1zICsgJzwvdWw+J1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRmb250bmFtZTogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0dmFyIHJlYWxGb250TGlzdCA9IFtdO1xuXHRcdFx0XHR2YXIgaXRlbXMgPSBvcHRpb25zLmZvbnROYW1lcy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIHYpIHtcblx0XHRcdFx0XHRpZiAoIWFnZW50LmlzRm9udEluc3RhbGxlZCh2KSAmJiBvcHRpb25zLmZvbnROYW1lc0lnbm9yZUNoZWNrLmluZGV4T2YodikgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbWVtbztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmVhbEZvbnRMaXN0LnB1c2godik7XG5cdFx0XHRcdFx0cmV0dXJuIG1lbW8gKyAnPGxpPjxhIGRhdGEtZXZlbnQ9XCJmb250TmFtZVwiIGhyZWY9XCIjXCIgZGF0YS12YWx1ZT1cIicgKyB2ICsgJ1wiIHN0eWxlPVwiZm9udC1mYW1pbHk6XFwnJyArIHYgKyAnXFwnXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQnPGkgY2xhc3M9XCInICsgb3B0aW9ucy5pY29uUHJlZml4ICsgJ2NoZWNrXCI+PC9pPiAnICsgdiArXG5cdFx0XHRcdFx0XHRcdFx0ICAnPC9hPjwvbGk+Jztcblx0XHRcdFx0fSwgJycpO1xuXG5cdFx0XHRcdHZhciBoYXNEZWZhdWx0Rm9udCA9IGFnZW50LmlzRm9udEluc3RhbGxlZChvcHRpb25zLmRlZmF1bHRGb250TmFtZSk7XG5cdFx0XHRcdHZhciBkZWZhdWx0Rm9udE5hbWUgPSAoaGFzRGVmYXVsdEZvbnQpID8gb3B0aW9ucy5kZWZhdWx0Rm9udE5hbWUgOiByZWFsRm9udExpc3RbMF07XG5cblx0XHRcdFx0dmFyIGxhYmVsID0gJzxzcGFuIGNsYXNzPVwibm90ZS1jdXJyZW50LWZvbnRuYW1lXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdEZvbnROYW1lICtcblx0XHRcdFx0XHRcdFx0ICc8L3NwYW4+Jztcblx0XHRcdFx0cmV0dXJuIHRwbEJ1dHRvbihsYWJlbCwge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmZvbnQubmFtZSxcblx0XHRcdFx0XHRkcm9wZG93bjogJzx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj4nICsgaXRlbXMgKyAnPC91bD4nXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGNvbG9yOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgY29sb3JCdXR0b25MYWJlbCA9ICc8aSBjbGFzcz1cIicgKyBvcHRpb25zLmljb25QcmVmaXggKyAnZm9udFwiIHN0eWxlPVwiY29sb3I6YmxhY2s7YmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7XCI+PC9pPic7XG5cdFx0XHRcdHZhciBjb2xvckJ1dHRvbiA9IHRwbEJ1dHRvbihjb2xvckJ1dHRvbkxhYmVsLCB7XG5cdFx0XHRcdFx0Y2xhc3NOYW1lOiAnbm90ZS1yZWNlbnQtY29sb3InLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmNvbG9yLnJlY2VudCxcblx0XHRcdFx0XHRldmVudDogJ2NvbG9yJyxcblx0XHRcdFx0XHR2YWx1ZTogJ3tcImJhY2tDb2xvclwiOlwieWVsbG93XCJ9J1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgZHJvcGRvd24gPSAnPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdCAnPGxpPicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLXBhbGV0dGUtdGl0bGVcIj4nICsgbGFuZy5jb2xvci5iYWNrZ3JvdW5kICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1jb2xvci1yZXNldFwiIGRhdGEtZXZlbnQ9XCJiYWNrQ29sb3JcIicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICAgJyBkYXRhLXZhbHVlPVwiaW5oZXJpdFwiIHRpdGxlPVwiJyArIGxhbmcuY29sb3IudHJhbnNwYXJlbnQgKyAnXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgICBsYW5nLmNvbG9yLnNldFRyYW5zcGFyZW50ICtcblx0XHRcdFx0XHRcdFx0XHRcdCAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWNvbG9yLXBhbGV0dGVcIiBkYXRhLXRhcmdldC1ldmVudD1cImJhY2tDb2xvclwiPjwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1wYWxldHRlLXRpdGxlXCI+JyArIGxhbmcuY29sb3IuZm9yZWdyb3VuZCArICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtY29sb3ItcmVzZXRcIiBkYXRhLWV2ZW50PVwiZm9yZUNvbG9yXCIgZGF0YS12YWx1ZT1cImluaGVyaXRcIiB0aXRsZT1cIicgKyBsYW5nLmNvbG9yLnJlc2V0ICsgJ1wiPicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICAgbGFuZy5jb2xvci5yZXNldFRvRGVmYXVsdCArXG5cdFx0XHRcdFx0XHRcdFx0XHQgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1jb2xvci1wYWxldHRlXCIgZGF0YS10YXJnZXQtZXZlbnQ9XCJmb3JlQ29sb3JcIj48L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgICAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICc8L2xpPicgK1xuXHRcdFx0XHRcdFx0XHQgICAnPC91bD4nO1xuXG5cdFx0XHRcdHZhciBtb3JlQnV0dG9uID0gdHBsQnV0dG9uKCcnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuY29sb3IubW9yZSxcblx0XHRcdFx0XHRkcm9wZG93bjogZHJvcGRvd25cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIGNvbG9yQnV0dG9uICsgbW9yZUJ1dHRvbjtcblx0XHRcdH0sXG5cdFx0XHRib2xkOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnYm9sZCcsIHtcblx0XHRcdFx0XHRldmVudDogJ2JvbGQnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmZvbnQuYm9sZFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRpdGFsaWM6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdpdGFsaWMnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdpdGFsaWMnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmZvbnQuaXRhbGljXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHVuZGVybGluZTogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3VuZGVybGluZScsIHtcblx0XHRcdFx0XHRldmVudDogJ3VuZGVybGluZScsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuZm9udC51bmRlcmxpbmVcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0Y2xlYXI6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdlcmFzZXInLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdyZW1vdmVGb3JtYXQnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmZvbnQuY2xlYXJcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0dWw6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdsaXN0LXVsJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnaW5zZXJ0VW5vcmRlcmVkTGlzdCcsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcubGlzdHMudW5vcmRlcmVkXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdG9sOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnbGlzdC1vbCcsIHtcblx0XHRcdFx0XHRldmVudDogJ2luc2VydE9yZGVyZWRMaXN0Jyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5saXN0cy5vcmRlcmVkXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHBhcmFncmFwaDogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0dmFyIGxlZnRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1sZWZ0Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLnBhcmFncmFwaC5sZWZ0LFxuXHRcdFx0XHRcdGV2ZW50OiAnanVzdGlmeUxlZnQnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgY2VudGVyQnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnYWxpZ24tY2VudGVyJywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLnBhcmFncmFwaC5jZW50ZXIsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdqdXN0aWZ5Q2VudGVyJ1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIHJpZ2h0QnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnYWxpZ24tcmlnaHQnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcucGFyYWdyYXBoLnJpZ2h0LFxuXHRcdFx0XHRcdGV2ZW50OiAnanVzdGlmeVJpZ2h0J1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIGp1c3RpZnlCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1qdXN0aWZ5Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLnBhcmFncmFwaC5qdXN0aWZ5LFxuXHRcdFx0XHRcdGV2ZW50OiAnanVzdGlmeUZ1bGwnXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHZhciBvdXRkZW50QnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnb3V0ZGVudCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5wYXJhZ3JhcGgub3V0ZGVudCxcblx0XHRcdFx0XHRldmVudDogJ291dGRlbnQnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgaW5kZW50QnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnaW5kZW50Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLnBhcmFncmFwaC5pbmRlbnQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdpbmRlbnQnXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHZhciBkcm9wZG93biA9ICc8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtYWxpZ24gYnRuLWdyb3VwXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICAgbGVmdEJ1dHRvbiArIGNlbnRlckJ1dHRvbiArIHJpZ2h0QnV0dG9uICsganVzdGlmeUJ1dHRvbiArXG5cdFx0XHRcdFx0XHRcdFx0ICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWxpc3QgYnRuLWdyb3VwXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICAgaW5kZW50QnV0dG9uICsgb3V0ZGVudEJ1dHRvbiArXG5cdFx0XHRcdFx0XHRcdFx0ICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0ICAgJzwvZGl2Pic7XG5cblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2FsaWduLWxlZnQnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcucGFyYWdyYXBoLnBhcmFncmFwaCxcblx0XHRcdFx0XHRkcm9wZG93bjogZHJvcGRvd25cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0aGVpZ2h0OiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgaXRlbXMgPSBvcHRpb25zLmxpbmVIZWlnaHRzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgdikge1xuXHRcdFx0XHRcdHJldHVybiBtZW1vICsgJzxsaT48YSBkYXRhLWV2ZW50PVwibGluZUhlaWdodFwiIGhyZWY9XCIjXCIgZGF0YS12YWx1ZT1cIicgKyBwYXJzZUZsb2F0KHYpICsgJ1wiPicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0JzxpIGNsYXNzPVwiJyArIG9wdGlvbnMuaWNvblByZWZpeCArICdjaGVja1wiPjwvaT4gJyArIHYgK1xuXHRcdFx0XHRcdFx0XHRcdCAgJzwvYT48L2xpPic7XG5cdFx0XHRcdH0sICcnKTtcblxuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAndGV4dC1oZWlnaHQnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuZm9udC5oZWlnaHQsXG5cdFx0XHRcdFx0ZHJvcGRvd246ICc8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+JyArIGl0ZW1zICsgJzwvdWw+J1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0fSxcblx0XHRcdGhlbHA6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdxdWVzdGlvbicsIHtcblx0XHRcdFx0XHRldmVudDogJ3Nob3dIZWxwRGlhbG9nJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5vcHRpb25zLmhlbHAsXG5cdFx0XHRcdFx0aGlkZTogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRmdWxsc2NyZWVuOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnYXJyb3dzLWFsdCcsIHtcblx0XHRcdFx0XHRldmVudDogJ2Z1bGxzY3JlZW4nLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLm9wdGlvbnMuZnVsbHNjcmVlblxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRjb2RldmlldzogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2NvZGUnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdjb2RldmlldycsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcub3B0aW9ucy5jb2Rldmlld1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHR1bmRvOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAndW5kbycsIHtcblx0XHRcdFx0XHRldmVudDogJ3VuZG8nLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmhpc3RvcnkudW5kb1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRyZWRvOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAncmVwZWF0Jywge1xuXHRcdFx0XHRcdGV2ZW50OiAncmVkbycsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaGlzdG9yeS5yZWRvXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGhyOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnbWludXMnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdpbnNlcnRIb3Jpem9udGFsUnVsZScsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaHIuaW5zZXJ0XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgdHBsUG9wb3ZlcnMgPSBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0dmFyIHRwbExpbmtQb3BvdmVyID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgbGlua0J1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2VkaXQnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcubGluay5lZGl0LFxuXHRcdFx0XHRcdGV2ZW50OiAnc2hvd0xpbmtEaWFsb2cnLFxuXHRcdFx0XHRcdGhpZGU6IHRydWVcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciB1bmxpbmtCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICd1bmxpbmsnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcubGluay51bmxpbmssXG5cdFx0XHRcdFx0ZXZlbnQ6ICd1bmxpbmsnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgY29udGVudCA9ICc8YSBocmVmPVwiaHR0cDovL3d3dy5nb29nbGUuY29tXCIgdGFyZ2V0PVwiX2JsYW5rXCI+d3d3Lmdvb2dsZS5jb208L2E+Jm5ic3A7Jm5ic3A7JyArXG5cdFx0XHRcdFx0XHRcdCAgJzxkaXYgY2xhc3M9XCJub3RlLWluc2VydCBidG4tZ3JvdXBcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRsaW5rQnV0dG9uICsgdW5saW5rQnV0dG9uICtcblx0XHRcdFx0XHRcdFx0ICAnPC9kaXY+Jztcblx0XHRcdFx0cmV0dXJuIHRwbFBvcG92ZXIoJ25vdGUtbGluay1wb3BvdmVyJywgY29udGVudCk7XG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgdHBsSW1hZ2VQb3BvdmVyID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgZnVsbEJ1dHRvbiA9IHRwbEJ1dHRvbignPHNwYW4gY2xhc3M9XCJub3RlLWZvbnRzaXplLTEwXCI+MTAwJTwvc3Bhbj4nLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2UucmVzaXplRnVsbCxcblx0XHRcdFx0XHRldmVudDogJ3Jlc2l6ZScsXG5cdFx0XHRcdFx0dmFsdWU6ICcxJ1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIGhhbGZCdXR0b24gPSB0cGxCdXR0b24oJzxzcGFuIGNsYXNzPVwibm90ZS1mb250c2l6ZS0xMFwiPjUwJTwvc3Bhbj4nLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2UucmVzaXplSGFsZixcblx0XHRcdFx0XHRldmVudDogJ3Jlc2l6ZScsXG5cdFx0XHRcdFx0dmFsdWU6ICcwLjUnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgcXVhcnRlckJ1dHRvbiA9IHRwbEJ1dHRvbignPHNwYW4gY2xhc3M9XCJub3RlLWZvbnRzaXplLTEwXCI+MjUlPC9zcGFuPicsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5yZXNpemVRdWFydGVyLFxuXHRcdFx0XHRcdGV2ZW50OiAncmVzaXplJyxcblx0XHRcdFx0XHR2YWx1ZTogJzAuMjUnXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHZhciBsZWZ0QnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnYWxpZ24tbGVmdCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5mbG9hdExlZnQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdmbG9hdE1lJyxcblx0XHRcdFx0XHR2YWx1ZTogJ2xlZnQnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgcmlnaHRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1yaWdodCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5mbG9hdFJpZ2h0LFxuXHRcdFx0XHRcdGV2ZW50OiAnZmxvYXRNZScsXG5cdFx0XHRcdFx0dmFsdWU6ICdyaWdodCdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBqdXN0aWZ5QnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnYWxpZ24tanVzdGlmeScsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5mbG9hdE5vbmUsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdmbG9hdE1lJyxcblx0XHRcdFx0XHR2YWx1ZTogJ25vbmUnXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHZhciByb3VuZGVkQnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnc3F1YXJlJywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLnNoYXBlUm91bmRlZCxcblx0XHRcdFx0XHRldmVudDogJ2ltYWdlU2hhcGUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnaW1nLXJvdW5kZWQnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgY2lyY2xlQnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnY2lyY2xlLW8nLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2Uuc2hhcGVDaXJjbGUsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdpbWFnZVNoYXBlJyxcblx0XHRcdFx0XHR2YWx1ZTogJ2ltZy1jaXJjbGUnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgdGh1bWJuYWlsQnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAncGljdHVyZS1vJywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLnNoYXBlVGh1bWJuYWlsLFxuXHRcdFx0XHRcdGV2ZW50OiAnaW1hZ2VTaGFwZScsXG5cdFx0XHRcdFx0dmFsdWU6ICdpbWctdGh1bWJuYWlsJ1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIG5vbmVCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICd0aW1lcycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5zaGFwZU5vbmUsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdpbWFnZVNoYXBlJyxcblx0XHRcdFx0XHR2YWx1ZTogJydcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIHJlbW92ZUJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3RyYXNoLW8nLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2UucmVtb3ZlLFxuXHRcdFx0XHRcdGV2ZW50OiAncmVtb3ZlTWVkaWEnLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm9uZSdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIGNvbnRlbnQgPSAnPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPicgKyBmdWxsQnV0dG9uICsgaGFsZkJ1dHRvbiArIHF1YXJ0ZXJCdXR0b24gKyAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdCAgJzxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj4nICsgbGVmdEJ1dHRvbiArIHJpZ2h0QnV0dG9uICsganVzdGlmeUJ1dHRvbiArICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0ICAnPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPicgKyByb3VuZGVkQnV0dG9uICsgY2lyY2xlQnV0dG9uICsgdGh1bWJuYWlsQnV0dG9uICsgbm9uZUJ1dHRvbiArICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0ICAnPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPicgKyByZW1vdmVCdXR0b24gKyAnPC9kaXY+Jztcblx0XHRcdFx0cmV0dXJuIHRwbFBvcG92ZXIoJ25vdGUtaW1hZ2UtcG9wb3ZlcicsIGNvbnRlbnQpO1xuXHRcdFx0fTtcblxuXHRcdFx0dmFyIHRwbEFpclBvcG92ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciAkY29udGVudCA9ICQoJzxkaXYgLz4nKTtcblx0XHRcdFx0Zm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5haXJQb3BvdmVyLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuXHRcdFx0XHRcdHZhciBncm91cCA9IG9wdGlvbnMuYWlyUG9wb3ZlcltpZHhdO1xuXG5cdFx0XHRcdFx0dmFyICRncm91cCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLScgKyBncm91cFswXSArICcgYnRuLWdyb3VwXCI+Jyk7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDAsIGxlbkdyb3VwID0gZ3JvdXBbMV0ubGVuZ3RoOyBpIDwgbGVuR3JvdXA7IGkrKykge1xuXHRcdFx0XHRcdFx0dmFyICRidXR0b24gPSAkKHRwbEJ1dHRvbkluZm9bZ3JvdXBbMV1baV1dKGxhbmcsIG9wdGlvbnMpKTtcblxuXHRcdFx0XHRcdFx0JGJ1dHRvbi5hdHRyKCdkYXRhLW5hbWUnLCBncm91cFsxXVtpXSk7XG5cblx0XHRcdFx0XHRcdCRncm91cC5hcHBlbmQoJGJ1dHRvbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCRjb250ZW50LmFwcGVuZCgkZ3JvdXApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRwbFBvcG92ZXIoJ25vdGUtYWlyLXBvcG92ZXInLCAkY29udGVudC5jaGlsZHJlbigpKTtcblx0XHRcdH07XG5cblx0XHRcdHZhciAkbm90ZVBvcG92ZXIgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS1wb3BvdmVyXCIgLz4nKTtcblxuXHRcdFx0JG5vdGVQb3BvdmVyLmFwcGVuZCh0cGxMaW5rUG9wb3ZlcigpKTtcblx0XHRcdCRub3RlUG9wb3Zlci5hcHBlbmQodHBsSW1hZ2VQb3BvdmVyKCkpO1xuXG5cdFx0XHRpZiAob3B0aW9ucy5haXJNb2RlKSB7XG5cdFx0XHRcdCRub3RlUG9wb3Zlci5hcHBlbmQodHBsQWlyUG9wb3ZlcigpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICRub3RlUG9wb3Zlcjtcblx0XHR9O1xuXG5cdFx0dmFyIHRwbEhhbmRsZXMgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCJub3RlLWhhbmRsZVwiPicgK1xuXHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtY29udHJvbC1zZWxlY3Rpb25cIj4nICtcblx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtY29udHJvbC1zZWxlY3Rpb24tYmdcIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtY29udHJvbC1ob2xkZXIgbm90ZS1jb250cm9sLW53XCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLWNvbnRyb2wtaG9sZGVyIG5vdGUtY29udHJvbC1uZVwiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1jb250cm9sLWhvbGRlciBub3RlLWNvbnRyb2wtc3dcIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtY29udHJvbC1zaXppbmcgbm90ZS1jb250cm9sLXNlXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLWNvbnRyb2wtc2VsZWN0aW9uLWluZm9cIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgJzwvZGl2PicgK1xuXHRcdFx0XHQgICAnPC9kaXY+Jztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogc2hvcnRjdXQgdGFibGUgdGVtcGxhdGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdGl0bGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gYm9keVxuXHRcdCAqL1xuXHRcdHZhciB0cGxTaG9ydGN1dCA9IGZ1bmN0aW9uICh0aXRsZSwga2V5cykge1xuXHRcdFx0dmFyIGtleUNsYXNzID0gJ25vdGUtc2hvcnRjdXQtY29sIGNvbC14cy02IG5vdGUtc2hvcnRjdXQtJztcblx0XHRcdHZhciBib2R5ID0gW107XG5cblx0XHRcdGZvciAodmFyIGkgaW4ga2V5cykge1xuXHRcdFx0XHRpZiAoa2V5cy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdFx0XHRcdGJvZHkucHVzaChcblx0XHRcdFx0XHQgICc8ZGl2IGNsYXNzPVwiJyArIGtleUNsYXNzICsgJ2tleVwiPicgKyBrZXlzW2ldLmtiZCArICc8L2Rpdj4nICtcblx0XHRcdFx0XHQgICc8ZGl2IGNsYXNzPVwiJyArIGtleUNsYXNzICsgJ25hbWVcIj4nICsga2V5c1tpXS50ZXh0ICsgJzwvZGl2Pidcblx0XHRcdFx0XHQgICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICc8ZGl2IGNsYXNzPVwibm90ZS1zaG9ydGN1dC1yb3cgcm93XCI+PGRpdiBjbGFzcz1cIicgKyBrZXlDbGFzcyArICd0aXRsZSBjb2wteHMtb2Zmc2V0LTZcIj4nICsgdGl0bGUgKyAnPC9kaXY+PC9kaXY+JyArXG5cdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1zaG9ydGN1dC1yb3cgcm93XCI+JyArIGJvZHkuam9pbignPC9kaXY+PGRpdiBjbGFzcz1cIm5vdGUtc2hvcnRjdXQtcm93IHJvd1wiPicpICsgJzwvZGl2Pic7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxTaG9ydGN1dFRleHQgPSBmdW5jdGlvbiAobGFuZykge1xuXHRcdFx0dmFyIGtleXMgPSBbXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgQicsIHRleHQ6IGxhbmcuZm9udC5ib2xkIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgSScsIHRleHQ6IGxhbmcuZm9udC5pdGFsaWMgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBVJywgdGV4dDogbGFuZy5mb250LnVuZGVybGluZSB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIFxcXFwnLCB0ZXh0OiBsYW5nLmZvbnQuY2xlYXIgfVxuXHRcdFx0XTtcblxuXHRcdFx0cmV0dXJuIHRwbFNob3J0Y3V0KGxhbmcuc2hvcnRjdXQudGV4dEZvcm1hdHRpbmcsIGtleXMpO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsU2hvcnRjdXRBY3Rpb24gPSBmdW5jdGlvbiAobGFuZykge1xuXHRcdFx0dmFyIGtleXMgPSBbXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgWicsIHRleHQ6IGxhbmcuaGlzdG9yeS51bmRvIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsg4oenICsgWicsIHRleHQ6IGxhbmcuaGlzdG9yeS5yZWRvIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgXScsIHRleHQ6IGxhbmcucGFyYWdyYXBoLmluZGVudCB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIFsnLCB0ZXh0OiBsYW5nLnBhcmFncmFwaC5vdXRkZW50IH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgRU5URVInLCB0ZXh0OiBsYW5nLmhyLmluc2VydCB9XG5cdFx0XHRdO1xuXG5cdFx0XHRyZXR1cm4gdHBsU2hvcnRjdXQobGFuZy5zaG9ydGN1dC5hY3Rpb24sIGtleXMpO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsU2hvcnRjdXRQYXJhID0gZnVuY3Rpb24gKGxhbmcpIHtcblx0XHRcdHZhciBrZXlzID0gW1xuXHRcdFx0ICB7IGtiZDogJ+KMmCArIOKHpyArIEwnLCB0ZXh0OiBsYW5nLnBhcmFncmFwaC5sZWZ0IH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsg4oenICsgRScsIHRleHQ6IGxhbmcucGFyYWdyYXBoLmNlbnRlciB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIOKHpyArIFInLCB0ZXh0OiBsYW5nLnBhcmFncmFwaC5yaWdodCB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIOKHpyArIEonLCB0ZXh0OiBsYW5nLnBhcmFncmFwaC5qdXN0aWZ5IH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsg4oenICsgTlVNNycsIHRleHQ6IGxhbmcubGlzdHMub3JkZXJlZCB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIOKHpyArIE5VTTgnLCB0ZXh0OiBsYW5nLmxpc3RzLnVub3JkZXJlZCB9XG5cdFx0XHRdO1xuXG5cdFx0XHRyZXR1cm4gdHBsU2hvcnRjdXQobGFuZy5zaG9ydGN1dC5wYXJhZ3JhcGhGb3JtYXR0aW5nLCBrZXlzKTtcblx0XHR9O1xuXG5cdFx0dmFyIHRwbFNob3J0Y3V0U3R5bGUgPSBmdW5jdGlvbiAobGFuZykge1xuXHRcdFx0dmFyIGtleXMgPSBbXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgTlVNMCcsIHRleHQ6IGxhbmcuc3R5bGUubm9ybWFsIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgTlVNMScsIHRleHQ6IGxhbmcuc3R5bGUuaDEgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBOVU0yJywgdGV4dDogbGFuZy5zdHlsZS5oMiB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIE5VTTMnLCB0ZXh0OiBsYW5nLnN0eWxlLmgzIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgTlVNNCcsIHRleHQ6IGxhbmcuc3R5bGUuaDQgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBOVU01JywgdGV4dDogbGFuZy5zdHlsZS5oNSB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIE5VTTYnLCB0ZXh0OiBsYW5nLnN0eWxlLmg2IH1cblx0XHRcdF07XG5cblx0XHRcdHJldHVybiB0cGxTaG9ydGN1dChsYW5nLnNob3J0Y3V0LmRvY3VtZW50U3R5bGUsIGtleXMpO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsRXh0cmFTaG9ydGN1dHMgPSBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0dmFyIGV4dHJhS2V5cyA9IG9wdGlvbnMuZXh0cmFLZXlzO1xuXHRcdFx0dmFyIGtleXMgPSBbXTtcblxuXHRcdFx0Zm9yICh2YXIga2V5IGluIGV4dHJhS2V5cykge1xuXHRcdFx0XHRpZiAoZXh0cmFLZXlzLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0XHRrZXlzLnB1c2goeyBrYmQ6IGtleSwgdGV4dDogZXh0cmFLZXlzW2tleV0gfSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRwbFNob3J0Y3V0KGxhbmcuc2hvcnRjdXQuZXh0cmFLZXlzLCBrZXlzKTtcblx0XHR9O1xuXG5cdFx0dmFyIHRwbFNob3J0Y3V0VGFibGUgPSBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0dmFyIGNvbENsYXNzID0gJ2NsYXNzPVwibm90ZS1zaG9ydGN1dCBub3RlLXNob3J0Y3V0LWNvbCBjb2wtc20tNiBjb2wteHMtMTJcIic7XG5cdFx0XHR2YXIgdGVtcGxhdGUgPSBbXG5cdFx0XHQgICc8ZGl2ICcgKyBjb2xDbGFzcyArICc+JyArIHRwbFNob3J0Y3V0QWN0aW9uKGxhbmcsIG9wdGlvbnMpICsgJzwvZGl2PicgK1xuXHRcdFx0ICAnPGRpdiAnICsgY29sQ2xhc3MgKyAnPicgKyB0cGxTaG9ydGN1dFRleHQobGFuZywgb3B0aW9ucykgKyAnPC9kaXY+Jyxcblx0XHRcdCAgJzxkaXYgJyArIGNvbENsYXNzICsgJz4nICsgdHBsU2hvcnRjdXRTdHlsZShsYW5nLCBvcHRpb25zKSArICc8L2Rpdj4nICtcblx0XHRcdCAgJzxkaXYgJyArIGNvbENsYXNzICsgJz4nICsgdHBsU2hvcnRjdXRQYXJhKGxhbmcsIG9wdGlvbnMpICsgJzwvZGl2Pidcblx0XHRcdF07XG5cblx0XHRcdGlmIChvcHRpb25zLmV4dHJhS2V5cykge1xuXHRcdFx0XHR0ZW1wbGF0ZS5wdXNoKCc8ZGl2ICcgKyBjb2xDbGFzcyArICc+JyArIHRwbEV4dHJhU2hvcnRjdXRzKGxhbmcsIG9wdGlvbnMpICsgJzwvZGl2PicpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCJub3RlLXNob3J0Y3V0LXJvdyByb3dcIj4nICtcblx0XHRcdFx0XHQgdGVtcGxhdGUuam9pbignPC9kaXY+PGRpdiBjbGFzcz1cIm5vdGUtc2hvcnRjdXQtcm93IHJvd1wiPicpICtcblx0XHRcdFx0ICAgJzwvZGl2Pic7XG5cdFx0fTtcblxuXHRcdHZhciByZXBsYWNlTWFjS2V5cyA9IGZ1bmN0aW9uIChzSHRtbCkge1xuXHRcdFx0cmV0dXJuIHNIdG1sLnJlcGxhY2UoL+KMmC9nLCAnQ3RybCcpLnJlcGxhY2UoL+KHpy9nLCAnU2hpZnQnKTtcblx0XHR9O1xuXG5cdFx0dmFyIHRwbERpYWxvZ0luZm8gPSB7XG5cdFx0XHRpbWFnZTogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0dmFyIGltYWdlTGltaXRhdGlvbiA9ICcnO1xuXHRcdFx0XHRpZiAob3B0aW9ucy5tYXhpbXVtSW1hZ2VGaWxlU2l6ZSkge1xuXHRcdFx0XHRcdHZhciB1bml0ID0gTWF0aC5mbG9vcihNYXRoLmxvZyhvcHRpb25zLm1heGltdW1JbWFnZUZpbGVTaXplKSAvIE1hdGgubG9nKDEwMjQpKTtcblx0XHRcdFx0XHR2YXIgcmVhZGFibGVTaXplID0gKG9wdGlvbnMubWF4aW11bUltYWdlRmlsZVNpemUgLyBNYXRoLnBvdygxMDI0LCB1bml0KSkudG9GaXhlZCgyKSAqIDEgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICAgJyAnICsgJyBLTUdUUCdbdW5pdF0gKyAnQic7XG5cdFx0XHRcdFx0aW1hZ2VMaW1pdGF0aW9uID0gJzxzbWFsbD4nICsgbGFuZy5pbWFnZS5tYXhpbXVtRmlsZVNpemUgKyAnIDogJyArIHJlYWRhYmxlU2l6ZSArICc8L3NtYWxsPic7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgYm9keSA9ICc8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3ctZmx1aWQgbm90ZS1ncm91cC1zZWxlY3QtZnJvbS1maWxlc1wiPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxsYWJlbD4nICsgbGFuZy5pbWFnZS5zZWxlY3RGcm9tRmlsZXMgKyAnPC9sYWJlbD4nICtcblx0XHRcdFx0XHRcdFx0ICc8aW5wdXQgY2xhc3M9XCJub3RlLWltYWdlLWlucHV0XCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZXNcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgbXVsdGlwbGU9XCJtdWx0aXBsZVwiIC8+JyArXG5cdFx0XHRcdFx0XHRcdCBpbWFnZUxpbWl0YXRpb24gK1xuXHRcdFx0XHRcdFx0ICAgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdy1mbHVpZFwiPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxsYWJlbD4nICsgbGFuZy5pbWFnZS51cmwgKyAnPC9sYWJlbD4nICtcblx0XHRcdFx0XHRcdFx0ICc8aW5wdXQgY2xhc3M9XCJub3RlLWltYWdlLXVybCBmb3JtLWNvbnRyb2wgc3BhbjEyXCIgdHlwZT1cInRleHRcIiAvPicgK1xuXHRcdFx0XHRcdFx0ICAgJzwvZGl2Pic7XG5cdFx0XHRcdHZhciBmb290ZXIgPSAnPGJ1dHRvbiBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG5vdGUtaW1hZ2UtYnRuIGRpc2FibGVkXCIgZGlzYWJsZWQ+JyArIGxhbmcuaW1hZ2UuaW5zZXJ0ICsgJzwvYnV0dG9uPic7XG5cdFx0XHRcdHJldHVybiB0cGxEaWFsb2coJ25vdGUtaW1hZ2UtZGlhbG9nJywgbGFuZy5pbWFnZS5pbnNlcnQsIGJvZHksIGZvb3Rlcik7XG5cdFx0XHR9LFxuXG5cdFx0XHRsaW5rOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgYm9keSA9ICc8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3ctZmx1aWRcIj4nICtcblx0XHRcdFx0XHRcdFx0ICc8bGFiZWw+JyArIGxhbmcubGluay50ZXh0VG9EaXNwbGF5ICsgJzwvbGFiZWw+JyArXG5cdFx0XHRcdFx0XHRcdCAnPGlucHV0IGNsYXNzPVwibm90ZS1saW5rLXRleHQgZm9ybS1jb250cm9sIHNwYW4xMlwiIHR5cGU9XCJ0ZXh0XCIgLz4nICtcblx0XHRcdFx0XHRcdCAgICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3ctZmx1aWRcIj4nICtcblx0XHRcdFx0XHRcdFx0ICc8bGFiZWw+JyArIGxhbmcubGluay51cmwgKyAnPC9sYWJlbD4nICtcblx0XHRcdFx0XHRcdFx0ICc8aW5wdXQgY2xhc3M9XCJub3RlLWxpbmstdXJsIGZvcm0tY29udHJvbCBzcGFuMTJcIiB0eXBlPVwidGV4dFwiIC8+JyArXG5cdFx0XHRcdFx0XHQgICAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHQgICAoIW9wdGlvbnMuZGlzYWJsZUxpbmtUYXJnZXQgP1xuXHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJjaGVja2JveFwiPicgK1xuXHRcdFx0XHRcdFx0XHQgICAnPGxhYmVsPicgKyAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNoZWNrZWQ+ICcgK1xuXHRcdFx0XHRcdFx0XHRcdCBsYW5nLmxpbmsub3BlbkluTmV3V2luZG93ICtcblx0XHRcdFx0XHRcdFx0ICAgJzwvbGFiZWw+JyArXG5cdFx0XHRcdFx0XHRcdCAnPC9kaXY+JyA6ICcnXG5cdFx0XHRcdFx0XHQgICApO1xuXHRcdFx0XHR2YXIgZm9vdGVyID0gJzxidXR0b24gaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBub3RlLWxpbmstYnRuIGRpc2FibGVkXCIgZGlzYWJsZWQ+JyArIGxhbmcubGluay5pbnNlcnQgKyAnPC9idXR0b24+Jztcblx0XHRcdFx0cmV0dXJuIHRwbERpYWxvZygnbm90ZS1saW5rLWRpYWxvZycsIGxhbmcubGluay5pbnNlcnQsIGJvZHksIGZvb3Rlcik7XG5cdFx0XHR9LFxuXG5cdFx0XHRoZWxwOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgYm9keSA9ICc8YSBjbGFzcz1cIm1vZGFsLWNsb3NlIHB1bGwtcmlnaHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0YWJpbmRleD1cIi0xXCI+JyArIGxhbmcuc2hvcnRjdXQuY2xvc2UgKyAnPC9hPicgK1xuXHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJ0aXRsZVwiPicgKyBsYW5nLnNob3J0Y3V0LnNob3J0Y3V0cyArICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdCAgIChhZ2VudC5pc01hYyA/IHRwbFNob3J0Y3V0VGFibGUobGFuZywgb3B0aW9ucykgOiByZXBsYWNlTWFjS2V5cyh0cGxTaG9ydGN1dFRhYmxlKGxhbmcsIG9wdGlvbnMpKSkgK1xuXHRcdFx0XHRcdFx0ICAgJzxwIGNsYXNzPVwidGV4dC1jZW50ZXJcIj4nICtcblx0XHRcdFx0XHRcdFx0ICc8YSBocmVmPVwiLy9zdW1tZXJub3RlLm9yZy9cIiB0YXJnZXQ9XCJfYmxhbmtcIj5TdW1tZXJub3RlIDAuNi4zPC9hPiDCtyAnICtcblx0XHRcdFx0XHRcdFx0ICc8YSBocmVmPVwiLy9naXRodWIuY29tL3N1bW1lcm5vdGUvc3VtbWVybm90ZVwiIHRhcmdldD1cIl9ibGFua1wiPlByb2plY3Q8L2E+IMK3ICcgK1xuXHRcdFx0XHRcdFx0XHQgJzxhIGhyZWY9XCIvL2dpdGh1Yi5jb20vc3VtbWVybm90ZS9zdW1tZXJub3RlL2lzc3Vlc1wiIHRhcmdldD1cIl9ibGFua1wiPklzc3VlczwvYT4nICtcblx0XHRcdFx0XHRcdCAgICc8L3A+Jztcblx0XHRcdFx0cmV0dXJuIHRwbERpYWxvZygnbm90ZS1oZWxwLWRpYWxvZycsICcnLCBib2R5LCAnJyk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB0cGxEaWFsb2dzID0gZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBkaWFsb2dzID0gJyc7XG5cblx0XHRcdCQuZWFjaCh0cGxEaWFsb2dJbmZvLCBmdW5jdGlvbiAoaWR4LCB0cGxEaWFsb2cpIHtcblx0XHRcdFx0ZGlhbG9ncyArPSB0cGxEaWFsb2cobGFuZywgb3B0aW9ucyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuICc8ZGl2IGNsYXNzPVwibm90ZS1kaWFsb2dcIj4nICsgZGlhbG9ncyArICc8L2Rpdj4nO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsU3RhdHVzYmFyID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuICc8ZGl2IGNsYXNzPVwibm90ZS1yZXNpemViYXJcIj4nICtcblx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWljb24tYmFyXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1pY29uLWJhclwiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtaWNvbi1iYXJcIj48L2Rpdj4nICtcblx0XHRcdFx0ICAgJzwvZGl2Pic7XG5cdFx0fTtcblxuXHRcdHZhciByZXByZXNlbnRTaG9ydGN1dCA9IGZ1bmN0aW9uIChzdHIpIHtcblx0XHRcdGlmIChhZ2VudC5pc01hYykge1xuXHRcdFx0XHRzdHIgPSBzdHIucmVwbGFjZSgnQ01EJywgJ+KMmCcpLnJlcGxhY2UoJ1NISUZUJywgJ+KHpycpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc3RyLnJlcGxhY2UoJ0JBQ0tTTEFTSCcsICdcXFxcJylcblx0XHRcdFx0XHQgIC5yZXBsYWNlKCdTTEFTSCcsICcvJylcblx0XHRcdFx0XHQgIC5yZXBsYWNlKCdMRUZUQlJBQ0tFVCcsICdbJylcblx0XHRcdFx0XHQgIC5yZXBsYWNlKCdSSUdIVEJSQUNLRVQnLCAnXScpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBjcmVhdGVUb29sdGlwXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGNvbnRhaW5lclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBrZXlNYXBcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW3NQbGFjZW1lbnRdXG5cdFx0ICovXG5cdFx0dmFyIGNyZWF0ZVRvb2x0aXAgPSBmdW5jdGlvbiAoJGNvbnRhaW5lciwga2V5TWFwLCBzUGxhY2VtZW50KSB7XG5cdFx0XHR2YXIgaW52ZXJ0ZWRLZXlNYXAgPSBmdW5jLmludmVydE9iamVjdChrZXlNYXApO1xuXHRcdFx0dmFyICRidXR0b25zID0gJGNvbnRhaW5lci5maW5kKCdidXR0b24nKTtcblxuXHRcdFx0JGJ1dHRvbnMuZWFjaChmdW5jdGlvbiAoaSwgZWxCdG4pIHtcblx0XHRcdFx0dmFyICRidG4gPSAkKGVsQnRuKTtcblx0XHRcdFx0dmFyIHNTaG9ydGN1dCA9IGludmVydGVkS2V5TWFwWyRidG4uZGF0YSgnZXZlbnQnKV07XG5cdFx0XHRcdGlmIChzU2hvcnRjdXQpIHtcblx0XHRcdFx0XHQkYnRuLmF0dHIoJ3RpdGxlJywgZnVuY3Rpb24gKGksIHYpIHtcblx0XHRcdFx0XHRcdHJldHVybiB2ICsgJyAoJyArIHJlcHJlc2VudFNob3J0Y3V0KHNTaG9ydGN1dCkgKyAnKSc7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gYm9vdHN0cmFwIHRvb2x0aXAgb24gYnRuLWdyb3VwIGJ1Z1xuXHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzU2ODdcblx0XHRcdH0pLnRvb2x0aXAoe1xuXHRcdFx0XHRjb250YWluZXI6ICdib2R5Jyxcblx0XHRcdFx0dHJpZ2dlcjogJ2hvdmVyJyxcblx0XHRcdFx0cGxhY2VtZW50OiBzUGxhY2VtZW50IHx8ICd0b3AnXG5cdFx0XHR9KS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdCQodGhpcykudG9vbHRpcCgnaGlkZScpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdC8vIGNyZWF0ZVBhbGV0dGVcblx0XHR2YXIgY3JlYXRlUGFsZXR0ZSA9IGZ1bmN0aW9uICgkY29udGFpbmVyLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgY29sb3JJbmZvID0gb3B0aW9ucy5jb2xvcnM7XG5cdFx0XHQkY29udGFpbmVyLmZpbmQoJy5ub3RlLWNvbG9yLXBhbGV0dGUnKS5lYWNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyICRwYWxldHRlID0gJCh0aGlzKSwgZXZlbnROYW1lID0gJHBhbGV0dGUuYXR0cignZGF0YS10YXJnZXQtZXZlbnQnKTtcblx0XHRcdFx0dmFyIHBhbGV0dGVDb250ZW50cyA9IFtdO1xuXHRcdFx0XHRmb3IgKHZhciByb3cgPSAwLCBsZW5Sb3cgPSBjb2xvckluZm8ubGVuZ3RoOyByb3cgPCBsZW5Sb3c7IHJvdysrKSB7XG5cdFx0XHRcdFx0dmFyIGNvbG9ycyA9IGNvbG9ySW5mb1tyb3ddO1xuXHRcdFx0XHRcdHZhciBidXR0b25zID0gW107XG5cdFx0XHRcdFx0Zm9yICh2YXIgY29sID0gMCwgbGVuQ29sID0gY29sb3JzLmxlbmd0aDsgY29sIDwgbGVuQ29sOyBjb2wrKykge1xuXHRcdFx0XHRcdFx0dmFyIGNvbG9yID0gY29sb3JzW2NvbF07XG5cdFx0XHRcdFx0XHRidXR0b25zLnB1c2goWyc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5vdGUtY29sb3ItYnRuXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOicsIGNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdFx0ICAgJztcIiBkYXRhLWV2ZW50PVwiJywgZXZlbnROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0ICAgJ1wiIGRhdGEtdmFsdWU9XCInLCBjb2xvcixcblx0XHRcdFx0XHRcdFx0XHRcdCAgICdcIiB0aXRsZT1cIicsIGNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdFx0ICAgJ1wiIGRhdGEtdG9nZ2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiPjwvYnV0dG9uPiddLmpvaW4oJycpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cGFsZXR0ZUNvbnRlbnRzLnB1c2goJzxkaXYgY2xhc3M9XCJub3RlLWNvbG9yLXJvd1wiPicgKyBidXR0b25zLmpvaW4oJycpICsgJzwvZGl2PicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCRwYWxldHRlLmh0bWwocGFsZXR0ZUNvbnRlbnRzLmpvaW4oJycpKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBjcmVhdGUgc3VtbWVybm90ZSBsYXlvdXQgKGFpciBtb2RlKVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRob2xkZXJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHRcdCAqL1xuXHRcdHRoaXMuY3JlYXRlTGF5b3V0QnlBaXJNb2RlID0gZnVuY3Rpb24gKCRob2xkZXIsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBsYW5nSW5mbyA9IG9wdGlvbnMubGFuZ0luZm87XG5cdFx0XHR2YXIga2V5TWFwID0gb3B0aW9ucy5rZXlNYXBbYWdlbnQuaXNNYWMgPyAnbWFjJyA6ICdwYyddO1xuXHRcdFx0dmFyIGlkID0gZnVuYy51bmlxdWVJZCgpO1xuXG5cdFx0XHQkaG9sZGVyLmFkZENsYXNzKCdub3RlLWFpci1lZGl0b3Igbm90ZS1lZGl0YWJsZScpO1xuXHRcdFx0JGhvbGRlci5hdHRyKHtcblx0XHRcdFx0J2lkJzogJ25vdGUtZWRpdG9yLScgKyBpZCxcblx0XHRcdFx0J2NvbnRlbnRFZGl0YWJsZSc6IHRydWVcblx0XHRcdH0pO1xuXG5cdFx0XHR2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cblx0XHRcdC8vIGNyZWF0ZSBQb3BvdmVyXG5cdFx0XHR2YXIgJHBvcG92ZXIgPSAkKHRwbFBvcG92ZXJzKGxhbmdJbmZvLCBvcHRpb25zKSk7XG5cdFx0XHQkcG9wb3Zlci5hZGRDbGFzcygnbm90ZS1haXItbGF5b3V0Jyk7XG5cdFx0XHQkcG9wb3Zlci5hdHRyKCdpZCcsICdub3RlLXBvcG92ZXItJyArIGlkKTtcblx0XHRcdCRwb3BvdmVyLmFwcGVuZFRvKGJvZHkpO1xuXHRcdFx0Y3JlYXRlVG9vbHRpcCgkcG9wb3Zlciwga2V5TWFwKTtcblx0XHRcdGNyZWF0ZVBhbGV0dGUoJHBvcG92ZXIsIG9wdGlvbnMpO1xuXG5cdFx0XHQvLyBjcmVhdGUgSGFuZGxlXG5cdFx0XHR2YXIgJGhhbmRsZSA9ICQodHBsSGFuZGxlcygpKTtcblx0XHRcdCRoYW5kbGUuYWRkQ2xhc3MoJ25vdGUtYWlyLWxheW91dCcpO1xuXHRcdFx0JGhhbmRsZS5hdHRyKCdpZCcsICdub3RlLWhhbmRsZS0nICsgaWQpO1xuXHRcdFx0JGhhbmRsZS5hcHBlbmRUbyhib2R5KTtcblxuXHRcdFx0Ly8gY3JlYXRlIERpYWxvZ1xuXHRcdFx0dmFyICRkaWFsb2cgPSAkKHRwbERpYWxvZ3MobGFuZ0luZm8sIG9wdGlvbnMpKTtcblx0XHRcdCRkaWFsb2cuYWRkQ2xhc3MoJ25vdGUtYWlyLWxheW91dCcpO1xuXHRcdFx0JGRpYWxvZy5hdHRyKCdpZCcsICdub3RlLWRpYWxvZy0nICsgaWQpO1xuXHRcdFx0JGRpYWxvZy5maW5kKCdidXR0b24uY2xvc2UsIGEubW9kYWwtY2xvc2UnKS5jbGljayhmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdCQodGhpcykuY2xvc2VzdCgnLm1vZGFsJykubW9kYWwoJ2hpZGUnKTtcblx0XHRcdH0pO1xuXHRcdFx0JGRpYWxvZy5hcHBlbmRUbyhib2R5KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogY3JlYXRlIHN1bW1lcm5vdGUgbGF5b3V0IChub3JtYWwgbW9kZSlcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkaG9sZGVyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzLmNyZWF0ZUxheW91dEJ5RnJhbWUgPSBmdW5jdGlvbiAoJGhvbGRlciwgb3B0aW9ucykge1xuXHRcdFx0dmFyIGxhbmdJbmZvID0gb3B0aW9ucy5sYW5nSW5mbztcblxuXHRcdFx0dmFyIGlzQ29udGVudEVkaXRhYmxlID0gISRob2xkZXIuaXMoJzpkaXNhYmxlZCcpO1xuXG5cdFx0XHQvLzAxLiBjcmVhdGUgRWRpdG9yXG5cdFx0XHR2YXIgJGVkaXRvciA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRvciBlZGl0YWJsZS0nICsgaXNDb250ZW50RWRpdGFibGUgKyAnXCI+PC9kaXY+Jyk7XG5cdFx0XHRpZiAob3B0aW9ucy53aWR0aCkge1xuXHRcdFx0XHQkZWRpdG9yLndpZHRoKG9wdGlvbnMud2lkdGgpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLzAyLiBzdGF0dXNiYXIgKHJlc2l6ZWJhcilcblx0XHRcdGlmIChvcHRpb25zLmhlaWdodCA+IDApIHtcblx0XHRcdFx0JCgnPGRpdiBjbGFzcz1cIm5vdGUtc3RhdHVzYmFyXCI+JyArIChvcHRpb25zLmRpc2FibGVSZXNpemVFZGl0b3IgPyAnJyA6IHRwbFN0YXR1c2JhcigpKSArICc8L2Rpdj4nKS5wcmVwZW5kVG8oJGVkaXRvcik7XG5cdFx0XHR9XG5cblx0XHRcdC8vMDMuIGNyZWF0ZSBFZGl0YWJsZVxuXG5cdFx0XHR2YXIgJGVkaXRhYmxlID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtZWRpdGFibGVcIiBjb250ZW50RWRpdGFibGU9XCInICsgaXNDb250ZW50RWRpdGFibGUgKyAnXCI+PC9kaXY+Jylcblx0XHRcdFx0LnByZXBlbmRUbygkZWRpdG9yKTtcblx0XHRcdGlmIChvcHRpb25zLmhlaWdodCkge1xuXHRcdFx0XHQkZWRpdGFibGUuaGVpZ2h0KG9wdGlvbnMuaGVpZ2h0KTtcblx0XHRcdH1cblx0XHRcdGlmIChvcHRpb25zLmRpcmVjdGlvbikge1xuXHRcdFx0XHQkZWRpdGFibGUuYXR0cignZGlyJywgb3B0aW9ucy5kaXJlY3Rpb24pO1xuXHRcdFx0fVxuXHRcdFx0dmFyIHBsYWNlaG9sZGVyID0gJGhvbGRlci5hdHRyKCdwbGFjZWhvbGRlcicpIHx8IG9wdGlvbnMucGxhY2Vob2xkZXI7XG5cdFx0XHRpZiAocGxhY2Vob2xkZXIpIHtcblx0XHRcdFx0JGVkaXRhYmxlLmF0dHIoJ2RhdGEtcGxhY2Vob2xkZXInLCBwbGFjZWhvbGRlcik7XG5cdFx0XHR9XG5cblx0XHRcdCRlZGl0YWJsZS5odG1sKGRvbS5odG1sKCRob2xkZXIpKTtcblxuXHRcdFx0Ly8wMzEuIGNyZWF0ZSBjb2RhYmxlXG5cdFx0XHQkKCc8dGV4dGFyZWEgY2xhc3M9XCJub3RlLWNvZGFibGVcIj48L3RleHRhcmVhPicpLnByZXBlbmRUbygkZWRpdG9yKTtcblxuXHRcdFx0Ly8wNC4gY3JlYXRlIFRvb2xiYXJcblx0XHRcdHZhciAkdG9vbGJhciA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLXRvb2xiYXIgYnRuLXRvb2xiYXJcIiAvPicpO1xuXHRcdFx0Zm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy50b29sYmFyLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuXHRcdFx0XHR2YXIgZ3JvdXBOYW1lID0gb3B0aW9ucy50b29sYmFyW2lkeF1bMF07XG5cdFx0XHRcdHZhciBncm91cEJ1dHRvbnMgPSBvcHRpb25zLnRvb2xiYXJbaWR4XVsxXTtcblxuXHRcdFx0XHR2YXIgJGdyb3VwID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtJyArIGdyb3VwTmFtZSArICcgYnRuLWdyb3VwXCIgLz4nKTtcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDAsIGJ0bkxlbmd0aCA9IGdyb3VwQnV0dG9ucy5sZW5ndGg7IGkgPCBidG5MZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdHZhciBidXR0b25JbmZvID0gdHBsQnV0dG9uSW5mb1tncm91cEJ1dHRvbnNbaV1dO1xuXHRcdFx0XHRcdC8vIGNvbnRpbnVlIGNyZWF0aW5nIHRvb2xiYXIgZXZlbiBpZiBhIGJ1dHRvbiBkb2Vzbid0IGV4aXN0XG5cdFx0XHRcdFx0aWYgKCEkLmlzRnVuY3Rpb24oYnV0dG9uSW5mbykpIHsgY29udGludWU7IH1cblxuXHRcdFx0XHRcdHZhciAkYnV0dG9uID0gJChidXR0b25JbmZvKGxhbmdJbmZvLCBvcHRpb25zKSk7XG5cdFx0XHRcdFx0JGJ1dHRvbi5hdHRyKCdkYXRhLW5hbWUnLCBncm91cEJ1dHRvbnNbaV0pOyAgLy8gc2V0IGJ1dHRvbidzIGFsaWFzLCBiZWN1YXNlIHRvIGdldCBidXR0b24gZWxlbWVudCBmcm9tICR0b29sYmFyXG5cdFx0XHRcdFx0JGdyb3VwLmFwcGVuZCgkYnV0dG9uKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkdG9vbGJhci5hcHBlbmQoJGdyb3VwKTtcblx0XHRcdH1cblxuXHRcdFx0JHRvb2xiYXIucHJlcGVuZFRvKCRlZGl0b3IpO1xuXHRcdFx0dmFyIGtleU1hcCA9IG9wdGlvbnMua2V5TWFwW2FnZW50LmlzTWFjID8gJ21hYycgOiAncGMnXTtcblx0XHRcdGNyZWF0ZVBhbGV0dGUoJHRvb2xiYXIsIG9wdGlvbnMpO1xuXHRcdFx0Y3JlYXRlVG9vbHRpcCgkdG9vbGJhciwga2V5TWFwLCAnYm90dG9tJyk7XG5cblx0XHRcdC8vMDUuIGNyZWF0ZSBQb3BvdmVyXG5cdFx0XHR2YXIgJHBvcG92ZXIgPSAkKHRwbFBvcG92ZXJzKGxhbmdJbmZvLCBvcHRpb25zKSkucHJlcGVuZFRvKCRlZGl0b3IpO1xuXHRcdFx0Y3JlYXRlUGFsZXR0ZSgkcG9wb3Zlciwgb3B0aW9ucyk7XG5cdFx0XHRjcmVhdGVUb29sdGlwKCRwb3BvdmVyLCBrZXlNYXApO1xuXG5cdFx0XHQvLzA2LiBoYW5kbGUoY29udHJvbCBzZWxlY3Rpb24sIC4uLilcblx0XHRcdCQodHBsSGFuZGxlcygpKS5wcmVwZW5kVG8oJGVkaXRvcik7XG5cblx0XHRcdC8vMDcuIGNyZWF0ZSBEaWFsb2dcblx0XHRcdHZhciAkZGlhbG9nID0gJCh0cGxEaWFsb2dzKGxhbmdJbmZvLCBvcHRpb25zKSkucHJlcGVuZFRvKCRlZGl0b3IpO1xuXHRcdFx0JGRpYWxvZy5maW5kKCdidXR0b24uY2xvc2UsIGEubW9kYWwtY2xvc2UnKS5jbGljayhmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdCQodGhpcykuY2xvc2VzdCgnLm1vZGFsJykubW9kYWwoJ2hpZGUnKTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLzA4LiBjcmVhdGUgRHJvcHpvbmVcblx0XHRcdCQoJzxkaXYgY2xhc3M9XCJub3RlLWRyb3B6b25lXCI+PGRpdiBjbGFzcz1cIm5vdGUtZHJvcHpvbmUtbWVzc2FnZVwiPjwvZGl2PjwvZGl2PicpLnByZXBlbmRUbygkZWRpdG9yKTtcblxuXHRcdFx0Ly8wOS4gRWRpdG9yL0hvbGRlciBzd2l0Y2hcblx0XHRcdCRlZGl0b3IuaW5zZXJ0QWZ0ZXIoJGhvbGRlcik7XG5cdFx0XHQkaG9sZGVyLmhpZGUoKTtcblx0XHR9O1xuXG5cdFx0dGhpcy5oYXNOb3RlRWRpdG9yID0gZnVuY3Rpb24gKCRob2xkZXIpIHtcblx0XHRcdHJldHVybiB0aGlzLm5vdGVFZGl0b3JGcm9tSG9sZGVyKCRob2xkZXIpLmxlbmd0aCA+IDA7XG5cdFx0fTtcblxuXHRcdHRoaXMubm90ZUVkaXRvckZyb21Ib2xkZXIgPSBmdW5jdGlvbiAoJGhvbGRlcikge1xuXHRcdFx0aWYgKCRob2xkZXIuaGFzQ2xhc3MoJ25vdGUtYWlyLWVkaXRvcicpKSB7XG5cdFx0XHRcdHJldHVybiAkaG9sZGVyO1xuXHRcdFx0fSBlbHNlIGlmICgkaG9sZGVyLm5leHQoKS5oYXNDbGFzcygnbm90ZS1lZGl0b3InKSkge1xuXHRcdFx0XHRyZXR1cm4gJGhvbGRlci5uZXh0KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gJCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBjcmVhdGUgc3VtbWVybm90ZSBsYXlvdXRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkaG9sZGVyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzLmNyZWF0ZUxheW91dCA9IGZ1bmN0aW9uICgkaG9sZGVyLCBvcHRpb25zKSB7XG5cdFx0XHRpZiAob3B0aW9ucy5haXJNb2RlKSB7XG5cdFx0XHRcdHRoaXMuY3JlYXRlTGF5b3V0QnlBaXJNb2RlKCRob2xkZXIsIG9wdGlvbnMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5jcmVhdGVMYXlvdXRCeUZyYW1lKCRob2xkZXIsIG9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGxheW91dEluZm8gZnJvbSBob2xkZXJcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkaG9sZGVyIC0gcGxhY2Vob2xkZXJcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5sYXlvdXRJbmZvRnJvbUhvbGRlciA9IGZ1bmN0aW9uICgkaG9sZGVyKSB7XG5cdFx0XHR2YXIgJGVkaXRvciA9IHRoaXMubm90ZUVkaXRvckZyb21Ib2xkZXIoJGhvbGRlcik7XG5cdFx0XHRpZiAoISRlZGl0b3IubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gY29ubmVjdCAkaG9sZGVyIHRvICRlZGl0b3Jcblx0XHRcdCRlZGl0b3IuZGF0YSgnaG9sZGVyJywgJGhvbGRlcik7XG5cblx0XHRcdHJldHVybiBkb20uYnVpbGRMYXlvdXRJbmZvKCRlZGl0b3IpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZW1vdmVMYXlvdXRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkaG9sZGVyIC0gcGxhY2Vob2xkZXJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICpcblx0XHQgKi9cblx0XHR0aGlzLnJlbW92ZUxheW91dCA9IGZ1bmN0aW9uICgkaG9sZGVyLCBsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG5cdFx0XHRpZiAob3B0aW9ucy5haXJNb2RlKSB7XG5cdFx0XHRcdCRob2xkZXIucmVtb3ZlQ2xhc3MoJ25vdGUtYWlyLWVkaXRvciBub3RlLWVkaXRhYmxlJylcblx0XHRcdFx0XHQgICAucmVtb3ZlQXR0cignaWQgY29udGVudEVkaXRhYmxlJyk7XG5cblx0XHRcdFx0bGF5b3V0SW5mby5wb3BvdmVyKCkucmVtb3ZlKCk7XG5cdFx0XHRcdGxheW91dEluZm8uaGFuZGxlKCkucmVtb3ZlKCk7XG5cdFx0XHRcdGxheW91dEluZm8uZGlhbG9nKCkucmVtb3ZlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkaG9sZGVyLmh0bWwobGF5b3V0SW5mby5lZGl0YWJsZSgpLmh0bWwoKSk7XG5cblx0XHRcdFx0bGF5b3V0SW5mby5lZGl0b3IoKS5yZW1vdmUoKTtcblx0XHRcdFx0JGhvbGRlci5zaG93KCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqIEByZXR1cm4ge2Z1bmN0aW9uKGxhYmVsLCBvcHRpb25zPSk6c3RyaW5nfSByZXR1cm4uYnV0dG9uIHtAbGluayAjdHBsQnV0dG9uIGZ1bmN0aW9uIHRvIG1ha2UgdGV4dCBidXR0b259XG5cdFx0ICogQHJldHVybiB7ZnVuY3Rpb24oaWNvbkNsYXNzLCBvcHRpb25zPSk6c3RyaW5nfSByZXR1cm4uaWNvbkJ1dHRvbiB7QGxpbmsgI3RwbEljb25CdXR0b24gZnVuY3Rpb24gdG8gbWFrZSBpY29uIGJ1dHRvbn1cblx0XHQgKiBAcmV0dXJuIHtmdW5jdGlvbihjbGFzc05hbWUsIHRpdGxlPSwgYm9keT0sIGZvb3Rlcj0pOnN0cmluZ30gcmV0dXJuLmRpYWxvZyB7QGxpbmsgI3RwbERpYWxvZyBmdW5jdGlvbiB0byBtYWtlIGRpYWxvZ31cblx0XHQgKi9cblx0XHR0aGlzLmdldFRlbXBsYXRlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0YnV0dG9uOiB0cGxCdXR0b24sXG5cdFx0XHRcdGljb25CdXR0b246IHRwbEljb25CdXR0b24sXG5cdFx0XHRcdGRpYWxvZzogdHBsRGlhbG9nXG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBhZGQgYnV0dG9uIGluZm9ybWF0aW9uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBidXR0b24gbmFtZVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGJ1dHRvbkluZm8gZnVuY3Rpb24gdG8gbWFrZSBidXR0b24sIHJlZmVyZW5jZSB0byB7QGxpbmsgI3RwbEJ1dHRvbn0se0BsaW5rICN0cGxJY29uQnV0dG9ufVxuXHRcdCAqL1xuXHRcdHRoaXMuYWRkQnV0dG9uSW5mbyA9IGZ1bmN0aW9uIChuYW1lLCBidXR0b25JbmZvKSB7XG5cdFx0XHR0cGxCdXR0b25JbmZvW25hbWVdID0gYnV0dG9uSW5mbztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGRpYWxvZ0luZm8gZnVuY3Rpb24gdG8gbWFrZSBkaWFsb2csIHJlZmVyZW5jZSB0byB7QGxpbmsgI3RwbERpYWxvZ31cblx0XHQgKi9cblx0XHR0aGlzLmFkZERpYWxvZ0luZm8gPSBmdW5jdGlvbiAobmFtZSwgZGlhbG9nSW5mbykge1xuXHRcdFx0dHBsRGlhbG9nSW5mb1tuYW1lXSA9IGRpYWxvZ0luZm87XG5cdFx0fTtcblx0fTtcblxuXG5cdC8vIGpRdWVyeSBuYW1lc3BhY2UgZm9yIHN1bW1lcm5vdGVcblx0LyoqXG5cdCAqIEBjbGFzcyAkLnN1bW1lcm5vdGUgXG5cdCAqIFxuXHQgKiBzdW1tZXJub3RlIGF0dHJpYnV0ZSAgXG5cdCAqIFxuXHQgKiBAbWl4aW4gZGVmYXVsdHNcblx0ICogQHNpbmdsZXRvbiAgXG5cdCAqIFxuXHQgKi9cblx0JC5zdW1tZXJub3RlID0gJC5zdW1tZXJub3RlIHx8IHt9O1xuXG5cdC8vIGV4dGVuZHMgZGVmYXVsdCBzZXR0aW5nc1xuXHQvLyAgLSAkLnN1bW1lcm5vdGUudmVyc2lvblxuXHQvLyAgLSAkLnN1bW1lcm5vdGUub3B0aW9uc1xuXHQvLyAgLSAkLnN1bW1lcm5vdGUubGFuZ1xuXHQkLmV4dGVuZCgkLnN1bW1lcm5vdGUsIGRlZmF1bHRzKTtcblxuXHR2YXIgcmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIoKTtcblx0dmFyIGV2ZW50SGFuZGxlciA9IG5ldyBFdmVudEhhbmRsZXIoKTtcblxuXHQkLmV4dGVuZCgkLnN1bW1lcm5vdGUsIHtcblx0XHQvKiogQHByb3BlcnR5IHtSZW5kZXJlcn0gKi9cblx0XHRyZW5kZXJlcjogcmVuZGVyZXIsXG5cdFx0LyoqIEBwcm9wZXJ0eSB7RXZlbnRIYW5kbGVyfSAqL1xuXHRcdGV2ZW50SGFuZGxlcjogZXZlbnRIYW5kbGVyLFxuXHRcdC8qKiBcblx0XHQgKiBAcHJvcGVydHkge09iamVjdH0gY29yZSBcblx0XHQgKiBAcHJvcGVydHkge2NvcmUuYWdlbnR9IGNvcmUuYWdlbnQgXG5cdFx0ICogQHByb3BlcnR5IHtjb3JlLmRvbX0gY29yZS5kb21cblx0XHQgKiBAcHJvcGVydHkge2NvcmUucmFuZ2V9IGNvcmUucmFuZ2UgXG5cdFx0ICovXG5cdFx0Y29yZToge1xuXHRcdFx0YWdlbnQ6IGFnZW50LFxuXHRcdFx0ZG9tOiBkb20sXG5cdFx0XHRyYW5nZTogcmFuZ2Vcblx0XHR9LFxuXHRcdC8qKiBcblx0XHQgKiBAcHJvcGVydHkge09iamVjdH0gXG5cdFx0ICogcGx1Z2luRXZlbnRzIGV2ZW50IGxpc3QgZm9yIHBsdWdpbnNcblx0XHQgKiBldmVudCBoYXMgbmFtZSBhbmQgY2FsbGJhY2sgZnVuY3Rpb24uXG5cdFx0ICogXG5cdFx0ICogYGBgIFxuXHRcdCAqICQuc3VtbWVybm90ZS5hZGRQbHVnaW4oe1xuXHRcdCAqICAgICBldmVudHMgOiB7XG5cdFx0ICogICAgICAgICAgJ2hlbGxvJyA6IGZ1bmN0aW9uKGxheW91dEluZm8sIHZhbHVlLCAkdGFyZ2V0KSB7XG5cdFx0ICogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdldmVudCBuYW1lIGlzIGhlbGxvLCB2YWx1ZSBpcyAnICsgdmFsdWUgKTtcblx0XHQgKiAgICAgICAgICB9XG5cdFx0ICogICAgIH0gICAgIFxuXHRcdCAqIH0pXG5cdFx0ICogYGBgXG5cdFx0ICogXG5cdFx0ICogKiBldmVudCBuYW1lIGlzIGRhdGEtZXZlbnQgcHJvcGVydHkuXG5cdFx0ICogKiBsYXlvdXRJbmZvIGlzIGEgc3VtbWVybm90ZSBsYXlvdXQgaW5mb3JtYXRpb24uXG5cdFx0ICogKiB2YWx1ZSBpcyBkYXRhLXZhbHVlIHByb3BlcnR5LlxuXHRcdCAqL1xuXHRcdHBsdWdpbkV2ZW50czoge30sXG5cblx0XHRwbHVnaW5zOiBbXVxuXHR9KTtcblxuXHQvKipcblx0ICogQG1ldGhvZCBhZGRQbHVnaW5cblx0ICpcblx0ICogYWRkIFBsdWdpbiBpbiBTdW1tZXJub3RlIFxuXHQgKiBcblx0ICogU3VtbWVybm90ZSBjYW4gbWFrZSBhIG93biBwbHVnaW4uXG5cdCAqXG5cdCAqICMjIyBEZWZpbmUgcGx1Z2luXG5cdCAqIGBgYFxuXHQgKiAvLyBnZXQgdGVtcGxhdGUgZnVuY3Rpb24gIFxuXHQgKiB2YXIgdG1wbCA9ICQuc3VtbWVybm90ZS5yZW5kZXJlci5nZXRUZW1wbGF0ZSgpO1xuXHQgKiBcblx0ICogLy8gYWRkIGEgYnV0dG9uICAgXG5cdCAqICQuc3VtbWVybm90ZS5hZGRQbHVnaW4oe1xuXHQgKiAgICAgYnV0dG9ucyA6IHtcblx0ICogICAgICAgIC8vIFwiaGVsbG9cIiAgaXMgYnV0dG9uJ3MgbmFtZXNwYWNlLiAgICAgIFxuXHQgKiAgICAgICAgXCJoZWxsb1wiIDogZnVuY3Rpb24obGFuZywgb3B0aW9ucykge1xuXHQgKiAgICAgICAgICAgIC8vIG1ha2UgaWNvbiBidXR0b24gYnkgdGVtcGxhdGUgZnVuY3Rpb24gICAgICAgICAgXG5cdCAqICAgICAgICAgICAgcmV0dXJuIHRtcGwuaWNvbkJ1dHRvbignZmEgZmEtaGVhZGVyJywge1xuXHQgKiAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBuYW1lIHdoZW4gYnV0dG9uIGNsaWNrZWQgXG5cdCAqICAgICAgICAgICAgICAgIGV2ZW50IDogJ2hlbGxvJyxcblx0ICogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEtdmFsdWUgcHJvcGVydHkgICAgICAgICAgICAgICAgIFxuXHQgKiAgICAgICAgICAgICAgICB2YWx1ZSA6ICdoZWxsbycsICAgICAgICAgICAgICAgIFxuXHQgKiAgICAgICAgICAgICAgICBoaWRlIDogdHJ1ZVxuXHQgKiAgICAgICAgICAgIH0pOyAgICAgICAgICAgXG5cdCAqICAgICAgICB9XG5cdCAqICAgICBcblx0ICogICAgIH0sIFxuXHQgKiAgICAgXG5cdCAqICAgICBldmVudHMgOiB7XG5cdCAqICAgICAgICBcImhlbGxvXCIgOiBmdW5jdGlvbihsYXlvdXRJbmZvLCB2YWx1ZSkge1xuXHQgKiAgICAgICAgICAgIC8vIGhlcmUgaXMgZXZlbnQgY29kZSBcblx0ICogICAgICAgIH1cblx0ICogICAgIH0gICAgIFxuXHQgKiB9KTtcblx0ICogYGBgIFxuXHQgKiAjIyMgVXNlIGEgcGx1Z2luIGluIHRvb2xiYXJcblx0ICogXG5cdCAqIGBgYCBcblx0ICogICAgJChcIiNlZGl0b3JcIikuc3VtbWVybm90ZSh7XG5cdCAqICAgIC4uLlxuXHQgKiAgICB0b29sYmFyIDogW1xuXHQgKiAgICAgICAgLy8gZGlzcGxheSBoZWxsbyBwbHVnaW4gaW4gdG9vbGJhciAgICAgXG5cdCAqICAgICAgICBbJ2dyb3VwJywgWyAnaGVsbG8nIF1dXG5cdCAqICAgIF1cblx0ICogICAgLi4uICAgIFxuXHQgKiAgICB9KTtcblx0ICogYGBgXG5cdCAqICBcblx0ICogIFxuXHQgKiBAcGFyYW0ge09iamVjdH0gcGx1Z2luXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGx1Z2luLmJ1dHRvbnNdIGRlZmluZSBwbHVnaW4gYnV0dG9uLiBmb3IgZGV0YWlsLCBzZWUgdG8gUmVuZGVyZXIuYWRkQnV0dG9uSW5mb1xuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BsdWdpbi5kaWFsb2dzXSBkZWZpbmUgcGx1Z2luIGRpYWxvZy4gZm9yIGRldGFpbCwgc2VlIHRvIFJlbmRlcmVyLmFkZERpYWxvZ0luZm9cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwbHVnaW4uZXZlbnRzXSBhZGQgZXZlbnQgaW4gJC5zdW1tZXJub3RlLnBsdWdpbkV2ZW50cyBcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwbHVnaW4ubGFuZ3NdIHVwZGF0ZSAkLnN1bW1lcm5vdGUubGFuZ1xuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BsdWdpbi5vcHRpb25zXSB1cGRhdGUgJC5zdW1tZXJub3RlLm9wdGlvbnNcblx0ICovXG5cdCQuc3VtbWVybm90ZS5hZGRQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luKSB7XG5cblx0XHQvLyBzYXZlIHBsdWdpbiBsaXN0XG5cdFx0JC5zdW1tZXJub3RlLnBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG5cdFx0aWYgKHBsdWdpbi5idXR0b25zKSB7XG5cdFx0XHQkLmVhY2gocGx1Z2luLmJ1dHRvbnMsIGZ1bmN0aW9uIChuYW1lLCBidXR0b24pIHtcblx0XHRcdFx0cmVuZGVyZXIuYWRkQnV0dG9uSW5mbyhuYW1lLCBidXR0b24pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKHBsdWdpbi5kaWFsb2dzKSB7XG5cdFx0XHQkLmVhY2gocGx1Z2luLmRpYWxvZ3MsIGZ1bmN0aW9uIChuYW1lLCBkaWFsb2cpIHtcblx0XHRcdFx0cmVuZGVyZXIuYWRkRGlhbG9nSW5mbyhuYW1lLCBkaWFsb2cpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKHBsdWdpbi5ldmVudHMpIHtcblx0XHRcdCQuZWFjaChwbHVnaW4uZXZlbnRzLCBmdW5jdGlvbiAobmFtZSwgZXZlbnQpIHtcblx0XHRcdFx0JC5zdW1tZXJub3RlLnBsdWdpbkV2ZW50c1tuYW1lXSA9IGV2ZW50O1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKHBsdWdpbi5sYW5ncykge1xuXHRcdFx0JC5lYWNoKHBsdWdpbi5sYW5ncywgZnVuY3Rpb24gKGxvY2FsZSwgbGFuZykge1xuXHRcdFx0XHRpZiAoJC5zdW1tZXJub3RlLmxhbmdbbG9jYWxlXSkge1xuXHRcdFx0XHRcdCQuZXh0ZW5kKCQuc3VtbWVybm90ZS5sYW5nW2xvY2FsZV0sIGxhbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAocGx1Z2luLm9wdGlvbnMpIHtcblx0XHRcdCQuZXh0ZW5kKCQuc3VtbWVybm90ZS5vcHRpb25zLCBwbHVnaW4ub3B0aW9ucyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qXG5cdCAqIGV4dGVuZCAkLmZuXG5cdCAqL1xuXHQkLmZuLmV4dGVuZCh7XG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZFxuXHRcdCAqIEluaXRpYWxpemUgc3VtbWVybm90ZVxuXHRcdCAqICAtIGNyZWF0ZSBlZGl0b3IgbGF5b3V0IGFuZCBhdHRhY2ggTW91c2UgYW5kIGtleWJvYXJkIGV2ZW50cy5cblx0XHQgKiBcblx0XHQgKiBgYGBcblx0XHQgKiAkKFwiI3N1bW1lcm5vdGVcIikuc3VtbWVybm90ZSggeyBvcHRpb25zIC4ufSApO1xuXHRcdCAqIGBgYFxuXHRcdCAqICAgXG5cdFx0ICogQG1lbWJlciAkLmZuXG5cdFx0ICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBvcHRpb25zIHJlZmVyZW5jZSB0byAkLnN1bW1lcm5vdGUub3B0aW9uc1xuXHRcdCAqIEByZXR1cm4ge3RoaXN9XG5cdFx0ICovXG5cdFx0c3VtbWVybm90ZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gY2hlY2sgZmlyc3QgYXJndW1lbnQncyB0eXBlXG5cdFx0XHQvLyAgLSB7U3RyaW5nfTogRXh0ZXJuYWwgQVBJIGNhbGwge3ttb2R1bGV9fS57e21ldGhvZH19XG5cdFx0XHQvLyAgLSB7T2JqZWN0fTogaW5pdCBvcHRpb25zXG5cdFx0XHR2YXIgdHlwZSA9ICQudHlwZShsaXN0LmhlYWQoYXJndW1lbnRzKSk7XG5cdFx0XHR2YXIgaXNFeHRlcm5hbEFQSUNhbGxlZCA9IHR5cGUgPT09ICdzdHJpbmcnO1xuXHRcdFx0dmFyIGlzSW5pdE9wdGlvbnMgPSB0eXBlID09PSAnb2JqZWN0JztcblxuXHRcdFx0Ly8gZXh0ZW5kIGRlZmF1bHQgb3B0aW9ucyB3aXRoIGN1c3RvbSB1c2VyIG9wdGlvbnNcblx0XHRcdHZhciBvcHRpb25zID0gaXNJbml0T3B0aW9ucyA/IGxpc3QuaGVhZChhcmd1bWVudHMpIDoge307XG5cdFx0XHRvcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sICQuc3VtbWVybm90ZS5vcHRpb25zLCBvcHRpb25zKTtcblxuXHRcdFx0Ly8gSW5jbHVkZSBsYW5nSW5mbyBpbiBvcHRpb25zIGZvciBsYXRlciB1c2UsIGUuZy4gZm9yIGltYWdlIGRyYWctbi1kcm9wXG5cdFx0XHQvLyBTZXR1cCBsYW5ndWFnZSBpbmZvIHdpdGggZW4tVVMgYXMgZGVmYXVsdFxuXHRcdFx0b3B0aW9ucy5sYW5nSW5mbyA9ICQuZXh0ZW5kKHRydWUsIHt9LCAkLnN1bW1lcm5vdGUubGFuZ1snZW4tVVMnXSwgJC5zdW1tZXJub3RlLmxhbmdbb3B0aW9ucy5sYW5nXSk7XG5cblx0XHRcdHRoaXMuZWFjaChmdW5jdGlvbiAoaWR4LCBob2xkZXIpIHtcblx0XHRcdFx0dmFyICRob2xkZXIgPSAkKGhvbGRlcik7XG5cblx0XHRcdFx0Ly8gaWYgbGF5b3V0IGlzbid0IGNyZWF0ZWQgeWV0LCBjcmVhdGVMYXlvdXQgYW5kIGF0dGFjaCBldmVudHNcblx0XHRcdFx0aWYgKCFyZW5kZXJlci5oYXNOb3RlRWRpdG9yKCRob2xkZXIpKSB7XG5cdFx0XHRcdFx0cmVuZGVyZXIuY3JlYXRlTGF5b3V0KCRob2xkZXIsIG9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0dmFyIGxheW91dEluZm8gPSByZW5kZXJlci5sYXlvdXRJbmZvRnJvbUhvbGRlcigkaG9sZGVyKTtcblxuXHRcdFx0XHRcdGV2ZW50SGFuZGxlci5hdHRhY2gobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cdFx0XHRcdFx0ZXZlbnRIYW5kbGVyLmF0dGFjaEN1c3RvbUV2ZW50KGxheW91dEluZm8sIG9wdGlvbnMpO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBjYWxsYmFjayBvbiBpbml0XG5cdFx0XHRpZiAoIWlzRXh0ZXJuYWxBUElDYWxsZWQgJiYgdGhpcy5sZW5ndGggJiYgb3B0aW9ucy5vbmluaXQpIHtcblx0XHRcdFx0b3B0aW9ucy5vbmluaXQoKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyICRmaXJzdCA9IHRoaXMuZmlyc3QoKTtcblx0XHRcdGlmICgkZmlyc3QubGVuZ3RoKSB7XG5cdFx0XHRcdHZhciBsYXlvdXRJbmZvID0gcmVuZGVyZXIubGF5b3V0SW5mb0Zyb21Ib2xkZXIoJGZpcnN0KTtcblxuXHRcdFx0XHQvLyBleHRlcm5hbCBBUElcblx0XHRcdFx0aWYgKGlzRXh0ZXJuYWxBUElDYWxsZWQpIHtcblx0XHRcdFx0XHR2YXIgbW9kdWxlQW5kTWV0aG9kID0gbGlzdC5oZWFkKGxpc3QuZnJvbShhcmd1bWVudHMpKTtcblx0XHRcdFx0XHR2YXIgYXJncyA9IGxpc3QudGFpbChsaXN0LmZyb20oYXJndW1lbnRzKSk7XG5cblx0XHRcdFx0XHQvLyBUT0RPIG5vdyBleHRlcm5hbCBBUEkgb25seSB3b3JrcyBmb3IgZWRpdG9yXG5cdFx0XHRcdFx0dmFyIHBhcmFtcyA9IFttb2R1bGVBbmRNZXRob2QsIGxheW91dEluZm8uZWRpdGFibGUoKV0uY29uY2F0KGFyZ3MpO1xuXHRcdFx0XHRcdHJldHVybiBldmVudEhhbmRsZXIuaW52b2tlLmFwcGx5KGV2ZW50SGFuZGxlciwgcGFyYW1zKTtcblx0XHRcdFx0fSBlbHNlIGlmIChvcHRpb25zLmZvY3VzKSB7XG5cdFx0XHRcdFx0Ly8gZm9jdXMgb24gZmlyc3QgZWRpdGFibGUgZWxlbWVudCBmb3IgaW5pdGlhbGl6ZSBlZGl0b3Jcblx0XHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkuZm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBcblx0XHQgKiBcblx0XHQgKiBnZXQgdGhlIEhUTUwgY29udGVudHMgb2Ygbm90ZSBvciBzZXQgdGhlIEhUTUwgY29udGVudHMgb2Ygbm90ZS5cblx0XHQgKlxuXHRcdCAqICogZ2V0IGNvbnRlbnRzIFxuXHRcdCAqIGBgYFxuXHRcdCAqIHZhciBjb250ZW50ID0gJChcIiNzdW1tZXJub3RlXCIpLmNvZGUoKTtcblx0XHQgKiBgYGBcblx0XHQgKiAqIHNldCBjb250ZW50cyBcblx0XHQgKlxuXHRcdCAqIGBgYFxuXHRcdCAqICQoXCIjc3VtbWVybm90ZVwiKS5jb2RlKGh0bWwpO1xuXHRcdCAqIGBgYFxuXHRcdCAqXG5cdFx0ICogQG1lbWJlciAkLmZuIFxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbaHRtbF0gLSBIVE1MIGNvbnRlbnRzKG9wdGlvbmFsLCBzZXQpXG5cdFx0ICogQHJldHVybiB7dGhpc3xTdHJpbmd9IC0gY29udGV4dChzZXQpIG9yIEhUTUwgY29udGVudHMgb2Ygbm90ZShnZXQpLlxuXHRcdCAqL1xuXHRcdGNvZGU6IGZ1bmN0aW9uIChodG1sKSB7XG5cdFx0XHQvLyBnZXQgdGhlIEhUTUwgY29udGVudHMgb2Ygbm90ZVxuXHRcdFx0aWYgKGh0bWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR2YXIgJGhvbGRlciA9IHRoaXMuZmlyc3QoKTtcblx0XHRcdFx0aWYgKCEkaG9sZGVyLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBsYXlvdXRJbmZvID0gcmVuZGVyZXIubGF5b3V0SW5mb0Zyb21Ib2xkZXIoJGhvbGRlcik7XG5cdFx0XHRcdHZhciAkZWRpdGFibGUgPSBsYXlvdXRJbmZvICYmIGxheW91dEluZm8uZWRpdGFibGUoKTtcblxuXHRcdFx0XHRpZiAoJGVkaXRhYmxlICYmICRlZGl0YWJsZS5sZW5ndGgpIHtcblx0XHRcdFx0XHR2YXIgaXNDb2RldmlldyA9IGV2ZW50SGFuZGxlci5pbnZva2UoJ2NvZGV2aWV3LmlzQWN0aXZhdGVkJywgbGF5b3V0SW5mbyk7XG5cdFx0XHRcdFx0ZXZlbnRIYW5kbGVyLmludm9rZSgnY29kZXZpZXcuc3luYycsIGxheW91dEluZm8pO1xuXHRcdFx0XHRcdHJldHVybiBpc0NvZGV2aWV3ID8gbGF5b3V0SW5mby5jb2RhYmxlKCkudmFsKCkgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkuaHRtbCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBkb20uaXNUZXh0YXJlYSgkaG9sZGVyWzBdKSA/ICRob2xkZXIudmFsKCkgOiAkaG9sZGVyLmh0bWwoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gc2V0IHRoZSBIVE1MIGNvbnRlbnRzIG9mIG5vdGVcblx0XHRcdHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgaG9sZGVyKSB7XG5cdFx0XHRcdHZhciBsYXlvdXRJbmZvID0gcmVuZGVyZXIubGF5b3V0SW5mb0Zyb21Ib2xkZXIoJChob2xkZXIpKTtcblx0XHRcdFx0dmFyICRlZGl0YWJsZSA9IGxheW91dEluZm8gJiYgbGF5b3V0SW5mby5lZGl0YWJsZSgpO1xuXHRcdFx0XHRpZiAoJGVkaXRhYmxlKSB7XG5cdFx0XHRcdFx0JGVkaXRhYmxlLmh0bWwoaHRtbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZFxuXHRcdCAqIFxuXHRcdCAqIGRlc3Ryb3kgRWRpdG9yIExheW91dCBhbmQgZGV0YWNoIEtleSBhbmQgTW91c2UgRXZlbnRcblx0XHQgKlxuXHRcdCAqIEBtZW1iZXIgJC5mblxuXHRcdCAqIEByZXR1cm4ge3RoaXN9XG5cdFx0ICovXG5cdFx0ZGVzdHJveTogZnVuY3Rpb24gKCkge1xuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uIChpZHgsIGhvbGRlcikge1xuXHRcdFx0XHR2YXIgJGhvbGRlciA9ICQoaG9sZGVyKTtcblxuXHRcdFx0XHRpZiAoIXJlbmRlcmVyLmhhc05vdGVFZGl0b3IoJGhvbGRlcikpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgaW5mbyA9IHJlbmRlcmVyLmxheW91dEluZm9Gcm9tSG9sZGVyKCRob2xkZXIpO1xuXHRcdFx0XHR2YXIgb3B0aW9ucyA9IGluZm8uZWRpdG9yKCkuZGF0YSgnb3B0aW9ucycpO1xuXG5cdFx0XHRcdGV2ZW50SGFuZGxlci5kZXRhY2goaW5mbywgb3B0aW9ucyk7XG5cdFx0XHRcdHJlbmRlcmVyLnJlbW92ZUxheW91dCgkaG9sZGVyLCBpbmZvLCBvcHRpb25zKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH0pO1xufSkpO1xuXG59KS5jYWxsKGdsb2JhbCwgbW9kdWxlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWxOamNtbHdkSE12YkdsaUwzTjFiVzFsY201dmRHVXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CSWl3aVptbHNaU0k2SW1kbGJtVnlZWFJsWkM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SmNianNnYWxGMVpYSjVJRDBnWjJ4dlltRnNMbXBSZFdWeWVTQTlJSEpsY1hWcGNtVW9YQ0pxY1hWbGNubGNJaWs3WEc0N0lIWmhjaUJmWDJKeWIzZHpaWEpwWm5sZmMyaHBiVjl5WlhGMWFYSmxYMTg5Y21WeGRXbHlaVHNvWm5WdVkzUnBiMjRnWW5KdmQzTmxjbWxtZVZOb2FXMG9iVzlrZFd4bExDQmtaV1pwYm1Vc0lISmxjWFZwY21VcElIdGNiaThxS2x4dUlDb2dVM1Z3WlhJZ2MybHRjR3hsSUhkNWMybDNlV2NnWldScGRHOXlJRzl1SUVKdmIzUnpkSEpoY0NCMk1DNDJMak5jYmlBcUlHaDBkSEE2THk5emRXMXRaWEp1YjNSbExtOXlaeTljYmlBcVhHNGdLaUJ6ZFcxdFpYSnViM1JsTG1welhHNGdLaUJEYjNCNWNtbG5hSFFnTWpBeE15MHlNREUxSUVGc1lXNGdTRzl1Wnk0Z1lXNWtJRzkwYUdWeUlHTnZiblJ5YVdKMWRHOXljMXh1SUNvZ2MzVnRiV1Z5Ym05MFpTQnRZWGtnWW1VZ1puSmxaV3g1SUdScGMzUnlhV0oxZEdWa0lIVnVaR1Z5SUhSb1pTQk5TVlFnYkdsalpXNXpaUzR2WEc0Z0tseHVJQ29nUkdGMFpUb2dNakF4TlMwd05DMHdPRlF4TXpveU9GcGNiaUFxTDF4dUtHWjFibU4wYVc5dUlDaG1ZV04wYjNKNUtTQjdYRzVjZEM4cUlHZHNiMkpoYkNCa1pXWnBibVVnS2k5Y2JseDBhV1lnS0hSNWNHVnZaaUJrWldacGJtVWdQVDA5SUNkbWRXNWpkR2x2YmljZ0ppWWdaR1ZtYVc1bExtRnRaQ2tnZTF4dVhIUmNkQzh2SUVGTlJDNGdVbVZuYVhOMFpYSWdZWE1nWVc0Z1lXNXZibmx0YjNWeklHMXZaSFZzWlM1Y2JseDBYSFJrWldacGJtVW9XeWRxY1hWbGNua25YU3dnWm1GamRHOXllU2s3WEc1Y2RIMGdaV3h6WlNCN1hHNWNkRngwTHk4Z1FuSnZkM05sY2lCbmJHOWlZV3h6T2lCcVVYVmxjbmxjYmx4MFhIUm1ZV04wYjNKNUtIZHBibVJ2ZHk1cVVYVmxjbmtwTzF4dVhIUjlYRzU5S0daMWJtTjBhVzl1SUNna0tTQjdYRzVjYmx4dVhHNWNkR2xtSUNnaFFYSnlZWGt1Y0hKdmRHOTBlWEJsTG5KbFpIVmpaU2tnZTF4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVGeWNtRjVMbkJ5YjNSdmRIbHdaUzV5WldSMVkyVWdjRzlzZVdacGJHeGNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlHTmhiR3hpWVdOclhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0V1lXeDFaWDBnVzJsdWFYUnBZV3hXWVd4MVpWMWNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdFdZV3gxWlgxY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCelpXVWdhSFIwY0RvdkwyZHZieTVuYkM5WFRuSnBVVVJjYmx4MFhIUWdLaTljYmx4MFhIUkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWNtVmtkV05sSUQwZ1puVnVZM1JwYjI0Z0tHTmhiR3hpWVdOcktTQjdYRzVjZEZ4MFhIUjJZWElnZENBOUlFOWlhbVZqZENoMGFHbHpLU3dnYkdWdUlEMGdkQzVzWlc1bmRHZ2dQajQrSURBc0lHc2dQU0F3TENCMllXeDFaVHRjYmx4MFhIUmNkR2xtSUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQwOVBTQXlLU0I3WEc1Y2RGeDBYSFJjZEhaaGJIVmxJRDBnWVhKbmRXMWxiblJ6V3pGZE8xeHVYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MGQyaHBiR1VnS0dzZ1BDQnNaVzRnSmlZZ0lTaHJJR2x1SUhRcEtTQjdYRzVjZEZ4MFhIUmNkRngwYXlzck8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkR2xtSUNocklENDlJR3hsYmlrZ2UxeHVYSFJjZEZ4MFhIUmNkSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvSjFKbFpIVmpaU0J2WmlCbGJYQjBlU0JoY25KaGVTQjNhWFJvSUc1dklHbHVhWFJwWVd3Z2RtRnNkV1VuS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUjJZV3gxWlNBOUlIUmJheXNyWFR0Y2JseDBYSFJjZEgxY2JseDBYSFJjZEdadmNpQW9PeUJySUR3Z2JHVnVPeUJyS3lzcElIdGNibHgwWEhSY2RGeDBhV1lnS0dzZ2FXNGdkQ2tnZTF4dVhIUmNkRngwWEhSY2RIWmhiSFZsSUQwZ1kyRnNiR0poWTJzb2RtRnNkV1VzSUhSYmExMHNJR3NzSUhRcE8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlYRzVjZEZ4MFhIUnlaWFIxY200Z2RtRnNkV1U3WEc1Y2RGeDBmVHRjYmx4MGZWeHVYRzVjZEdsbUlDZ25ablZ1WTNScGIyNG5JQ0U5UFNCMGVYQmxiMllnUVhKeVlYa3VjSEp2ZEc5MGVYQmxMbVpwYkhSbGNpa2dlMXh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUZ5Y21GNUxuQnliM1J2ZEhsd1pTNW1hV3gwWlhJZ2NHOXNlV1pwYkd4Y2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUdaMWJtTmNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdEJjbkpoZVgxY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCelpXVWdhSFIwY0RvdkwyZHZieTVuYkM5VU1VdEdibkZjYmx4MFhIUWdLaTljYmx4MFhIUkJjbkpoZVM1d2NtOTBiM1I1Y0dVdVptbHNkR1Z5SUQwZ1puVnVZM1JwYjI0Z0tHWjFibU1wSUh0Y2JseDBYSFJjZEhaaGNpQjBJRDBnVDJKcVpXTjBLSFJvYVhNcExDQnNaVzRnUFNCMExteGxibWQwYUNBK1BqNGdNRHRjYmx4dVhIUmNkRngwZG1GeUlISmxjeUE5SUZ0ZE8xeHVYSFJjZEZ4MGRtRnlJSFJvYVhOQmNtY2dQU0JoY21kMWJXVnVkSE11YkdWdVozUm9JRDQ5SURJZ1B5QmhjbWQxYldWdWRITmJNVjBnT2lCMmIybGtJREE3WEc1Y2RGeDBYSFJtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4bGJqc2dhU3NyS1NCN1hHNWNkRngwWEhSY2RHbG1JQ2hwSUdsdUlIUXBJSHRjYmx4MFhIUmNkRngwWEhSMllYSWdkbUZzSUQwZ2RGdHBYVHRjYmx4MFhIUmNkRngwWEhScFppQW9ablZ1WXk1allXeHNLSFJvYVhOQmNtY3NJSFpoYkN3Z2FTd2dkQ2twSUh0Y2JseDBYSFJjZEZ4MFhIUmNkSEpsY3k1d2RYTm9LSFpoYkNrN1hHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEhKbGRIVnliaUJ5WlhNN1hHNWNkRngwZlR0Y2JseDBmVnh1WEc1Y2RIWmhjaUJwYzFOMWNIQnZjblJCYldRZ1BTQjBlWEJsYjJZZ1pHVm1hVzVsSUQwOVBTQW5ablZ1WTNScGIyNG5JQ1ltSUdSbFptbHVaUzVoYldRN1hHNWNibHgwTHlvcVhHNWNkQ0FxSUhKbGRIVnlibk1nZDJobGRHaGxjaUJtYjI1MElHbHpJR2x1YzNSaGJHeGxaQ0J2Y2lCdWIzUXVYRzVjZENBcVhHNWNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JtYjI1MFRtRnRaVnh1WEhRZ0tpQkFjbVYwZFhKdUlIdENiMjlzWldGdWZWeHVYSFFnS2k5Y2JseDBkbUZ5SUdselJtOXVkRWx1YzNSaGJHeGxaQ0E5SUdaMWJtTjBhVzl1SUNobWIyNTBUbUZ0WlNrZ2UxeHVYSFJjZEhaaGNpQjBaWE4wUm05dWRFNWhiV1VnUFNCbWIyNTBUbUZ0WlNBOVBUMGdKME52YldsaklGTmhibk1nVFZNbklEOGdKME52ZFhKcFpYSWdUbVYzSnlBNklDZERiMjFwWXlCVFlXNXpJRTFUSnp0Y2JseDBYSFIyWVhJZ0pIUmxjM1JsY2lBOUlDUW9KenhrYVhZK0p5a3VZM056S0h0Y2JseDBYSFJjZEhCdmMybDBhVzl1T2lBbllXSnpiMngxZEdVbkxGeHVYSFJjZEZ4MGJHVm1kRG9nSnkwNU9UazVjSGduTEZ4dVhIUmNkRngwZEc5d09pQW5MVGs1T1Rsd2VDY3NYRzVjZEZ4MFhIUm1iMjUwVTJsNlpUb2dKekl3TUhCNEoxeHVYSFJjZEgwcExuUmxlSFFvSjIxdGJXMXRiVzF0YlhkM2QzZDNkM2NuS1M1aGNIQmxibVJVYnloa2IyTjFiV1Z1ZEM1aWIyUjVLVHRjYmx4dVhIUmNkSFpoY2lCdmNtbG5hVzVoYkZkcFpIUm9JRDBnSkhSbGMzUmxjaTVqYzNNb0oyWnZiblJHWVcxcGJIa25MQ0IwWlhOMFJtOXVkRTVoYldVcExuZHBaSFJvS0NrN1hHNWNkRngwZG1GeUlIZHBaSFJvSUQwZ0pIUmxjM1JsY2k1amMzTW9KMlp2Ym5SR1lXMXBiSGtuTENCbWIyNTBUbUZ0WlNBcklDY3NKeUFySUhSbGMzUkdiMjUwVG1GdFpTa3VkMmxrZEdnb0tUdGNibHh1WEhSY2RDUjBaWE4wWlhJdWNtVnRiM1psS0NrN1hHNWNibHgwWEhSeVpYUjFjbTRnYjNKcFoybHVZV3hYYVdSMGFDQWhQVDBnZDJsa2RHZzdYRzVjZEgwN1hHNWNibHgwTHlvcVhHNWNkQ0FxSUVCamJHRnpjeUJqYjNKbExtRm5aVzUwWEc1Y2RDQXFYRzVjZENBcUlFOWlhbVZqZENCM2FHbGphQ0JqYUdWamF5QndiR0YwWm05eWJTQmhibVFnWVdkbGJuUmNibHgwSUNwY2JseDBJQ29nUUhOcGJtZHNaWFJ2Ymx4dVhIUWdLaUJBWVd4MFpYSnVZWFJsUTJ4aGMzTk9ZVzFsSUdGblpXNTBYRzVjZENBcUwxeHVYSFIyWVhJZ1lXZGxiblFnUFNCN1hHNWNkRngwTHlvcUlFQndjbTl3WlhKMGVTQjdRbTl2YkdWaGJuMGdXMmx6VFdGalBXWmhiSE5sWFNCMGNuVmxJR2xtSUhSb2FYTWdZV2RsYm5RZ2FYTWdUV0ZqSUNBcUwxeHVYSFJjZEdselRXRmpPaUJ1WVhacFoyRjBiM0l1WVhCd1ZtVnljMmx2Ymk1cGJtUmxlRTltS0NkTllXTW5LU0ErSUMweExGeHVYSFJjZEM4cUtpQkFjSEp2Y0dWeWRIa2dlMEp2YjJ4bFlXNTlJRnRwYzAxVFNVVTlabUZzYzJWZElIUnlkV1VnYVdZZ2RHaHBjeUJoWjJWdWRDQnBjeUJoSUVsdWRHVnlibVYwSUVWNGNHeHZjbVZ5SUNBcUwxeHVYSFJjZEdselRWTkpSVG9nYm1GMmFXZGhkRzl5TG5WelpYSkJaMlZ1ZEM1cGJtUmxlRTltS0NkTlUwbEZKeWtnUGlBdE1TQjhmQ0J1WVhacFoyRjBiM0l1ZFhObGNrRm5aVzUwTG1sdVpHVjRUMllvSjFSeWFXUmxiblFuS1NBK0lDMHhMRnh1WEhSY2RDOHFLaUJBY0hKdmNHVnlkSGtnZTBKdmIyeGxZVzU5SUZ0cGMwWkdQV1poYkhObFhTQjBjblZsSUdsbUlIUm9hWE1nWVdkbGJuUWdhWE1nWVNCR2FYSmxabTk0SUNBcUwxeHVYSFJjZEdselJrWTZJRzVoZG1sbllYUnZjaTUxYzJWeVFXZGxiblF1YVc1a1pYaFBaaWduUm1seVpXWnZlQ2NwSUQ0Z0xURXNYRzVjZEZ4MEx5b3FJRUJ3Y205d1pYSjBlU0I3VTNSeWFXNW5mU0JxY1hWbGNubFdaWEp6YVc5dUlHTjFjbkpsYm5RZ2FsRjFaWEo1SUhabGNuTnBiMjRnYzNSeWFXNW5JQ0FxTDF4dVhIUmNkR3B4ZFdWeWVWWmxjbk5wYjI0NklIQmhjbk5sUm14dllYUW9KQzVtYmk1cWNYVmxjbmtwTEZ4dVhIUmNkR2x6VTNWd2NHOXlkRUZ0WkRvZ2FYTlRkWEJ3YjNKMFFXMWtMRnh1WEhSY2RHaGhjME52WkdWTmFYSnliM0k2SUdselUzVndjRzl5ZEVGdFpDQS9JSEpsY1hWcGNtVXVjM0JsWTJsbWFXVmtLQ2REYjJSbFRXbHljbTl5SnlrZ09pQWhJWGRwYm1SdmR5NURiMlJsVFdseWNtOXlMRnh1WEhSY2RHbHpSbTl1ZEVsdWMzUmhiR3hsWkRvZ2FYTkdiMjUwU1c1emRHRnNiR1ZrTEZ4dVhIUmNkR2x6VnpORFVtRnVaMlZUZFhCd2IzSjBPaUFoSVdSdlkzVnRaVzUwTG1OeVpXRjBaVkpoYm1kbFhHNWNkSDA3WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRUJqYkdGemN5QmpiM0psTG1aMWJtTmNibHgwSUNwY2JseDBJQ29nWm5WdVl5QjFkR2xzY3lBb1ptOXlJR2hwWjJndGIzSmtaWElnWm5WdVl5ZHpJR0Z5WnlsY2JseDBJQ3BjYmx4MElDb2dRSE5wYm1kc1pYUnZibHh1WEhRZ0tpQkFZV3gwWlhKdVlYUmxRMnhoYzNOT1lXMWxJR1oxYm1OY2JseDBJQ292WEc1Y2RIWmhjaUJtZFc1aklEMGdLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFIyWVhJZ1pYRWdQU0JtZFc1amRHbHZiaUFvYVhSbGJVRXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9hWFJsYlVJcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlHbDBaVzFCSUQwOVBTQnBkR1Z0UWp0Y2JseDBYSFJjZEgwN1hHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQmxjVElnUFNCbWRXNWpkR2x2YmlBb2FYUmxiVUVzSUdsMFpXMUNLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdhWFJsYlVFZ1BUMDlJR2wwWlcxQ08xeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdjR1Z4TWlBOUlHWjFibU4wYVc5dUlDaHdjbTl3VG1GdFpTa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHWjFibU4wYVc5dUlDaHBkR1Z0UVN3Z2FYUmxiVUlwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUdsMFpXMUJXM0J5YjNCT1lXMWxYU0E5UFQwZ2FYUmxiVUpiY0hKdmNFNWhiV1ZkTzF4dVhIUmNkRngwZlR0Y2JseDBYSFI5TzF4dVhHNWNkRngwZG1GeUlHOXJJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUhSeWRXVTdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUJtWVdsc0lEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJR1poYkhObE8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdibTkwSUQwZ1puVnVZM1JwYjI0Z0tHWXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUFoWmk1aGNIQnNlU2htTENCaGNtZDFiV1Z1ZEhNcE8xeHVYSFJjZEZ4MGZUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MGRtRnlJR0Z1WkNBOUlHWjFibU4wYVc5dUlDaG1RU3dnWmtJcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCbWRXNWpkR2x2YmlBb2FYUmxiU2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnWmtFb2FYUmxiU2tnSmlZZ1prSW9hWFJsYlNrN1hHNWNkRngwWEhSOU8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdjMlZzWmlBOUlHWjFibU4wYVc5dUlDaGhLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdZVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBkbUZ5SUdsa1EyOTFiblJsY2lBOUlEQTdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJuWlc1bGNtRjBaU0JoSUdkc2IySmhiR3g1TFhWdWFYRjFaU0JwWkZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJRnR3Y21WbWFYaGRYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJSFZ1YVhGMVpVbGtJRDBnWm5WdVkzUnBiMjRnS0hCeVpXWnBlQ2tnZTF4dVhIUmNkRngwZG1GeUlHbGtJRDBnS3l0cFpFTnZkVzUwWlhJZ0t5QW5KenRjYmx4MFhIUmNkSEpsZEhWeWJpQndjbVZtYVhnZ1B5QndjbVZtYVhnZ0t5QnBaQ0E2SUdsa08xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnlaWFIxY201eklHSnVaQ0FvWW05MWJtUnpLU0JtY205dElISmxZM1JjYmx4MFhIUWdLbHh1WEhSY2RDQXFJQzBnU1VVZ1EyOXRjR0YwWVdKcGJHbDBlU0JKYzNOMVpUb2dhSFIwY0RvdkwyZHZieTVuYkM5elVreFBRVzljYmx4MFhIUWdLaUF0SUZOamNtOXNiQ0JKYzNOMVpUb2dhSFIwY0RvdkwyZHZieTVuYkM5elRtcFZZMXh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdFNaV04wZlNCeVpXTjBYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdUMkpxWldOMGZTQmliM1Z1WkhOY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0T2RXMWlaWEo5SUdKdmRXNWtjeTUwYjNCY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0T2RXMWlaWEo5SUdKdmRXNWtjeTVzWldaMFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1RuVnRZbVZ5ZlNCaWIzVnVaSE11ZDJsa2RHaGNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdE9kVzFpWlhKOUlHSnZkVzVrY3k1b1pXbG5hSFJjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnY21WamRESmlibVFnUFNCbWRXNWpkR2x2YmlBb2NtVmpkQ2tnZTF4dVhIUmNkRngwZG1GeUlDUmtiMk4xYldWdWRDQTlJQ1FvWkc5amRXMWxiblFwTzF4dVhIUmNkRngwY21WMGRYSnVJSHRjYmx4MFhIUmNkRngwZEc5d09pQnlaV04wTG5SdmNDQXJJQ1JrYjJOMWJXVnVkQzV6WTNKdmJHeFViM0FvS1N4Y2JseDBYSFJjZEZ4MGJHVm1kRG9nY21WamRDNXNaV1owSUNzZ0pHUnZZM1Z0Wlc1MExuTmpjbTlzYkV4bFpuUW9LU3hjYmx4MFhIUmNkRngwZDJsa2RHZzZJSEpsWTNRdWNtbG5hSFFnTFNCeVpXTjBMbXhsWm5Rc1hHNWNkRngwWEhSY2RHaGxhV2RvZERvZ2NtVmpkQzVpYjNSMGIyMGdMU0J5WldOMExuUnZjRnh1WEhSY2RGeDBmVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nY21WMGRYSnVjeUJoSUdOdmNIa2diMllnZEdobElHOWlhbVZqZENCM2FHVnlaU0IwYUdVZ2EyVjVjeUJvWVhabElHSmxZMjl0WlNCMGFHVWdkbUZzZFdWeklHRnVaQ0IwYUdVZ2RtRnNkV1Z6SUhSb1pTQnJaWGx6TGx4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0J2WW1wY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0UFltcGxZM1I5WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUdsdWRtVnlkRTlpYW1WamRDQTlJR1oxYm1OMGFXOXVJQ2h2WW1vcElIdGNibHgwWEhSY2RIWmhjaUJwYm5abGNuUmxaQ0E5SUh0OU8xeHVYSFJjZEZ4MFptOXlJQ2gyWVhJZ2EyVjVJR2x1SUc5aWFpa2dlMXh1WEhSY2RGeDBYSFJwWmlBb2IySnFMbWhoYzA5M2JsQnliM0JsY25SNUtHdGxlU2twSUh0Y2JseDBYSFJjZEZ4MFhIUnBiblpsY25SbFpGdHZZbXBiYTJWNVhWMGdQU0JyWlhrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMWNibHgwWEhSY2RISmxkSFZ5YmlCcGJuWmxjblJsWkR0Y2JseDBYSFI5TzF4dVhHNWNkRngwY21WMGRYSnVJSHRjYmx4MFhIUmNkR1Z4T2lCbGNTeGNibHgwWEhSY2RHVnhNam9nWlhFeUxGeHVYSFJjZEZ4MGNHVnhNam9nY0dWeE1peGNibHgwWEhSY2RHOXJPaUJ2YXl4Y2JseDBYSFJjZEdaaGFXdzZJR1poYVd3c1hHNWNkRngwWEhSelpXeG1PaUJ6Wld4bUxGeHVYSFJjZEZ4MGJtOTBPaUJ1YjNRc1hHNWNkRngwWEhSaGJtUTZJR0Z1WkN4Y2JseDBYSFJjZEhWdWFYRjFaVWxrT2lCMWJtbHhkV1ZKWkN4Y2JseDBYSFJjZEhKbFkzUXlZbTVrT2lCeVpXTjBNbUp1WkN4Y2JseDBYSFJjZEdsdWRtVnlkRTlpYW1WamREb2dhVzUyWlhKMFQySnFaV04wWEc1Y2RGeDBmVHRjYmx4MGZTa29LVHRjYmx4dVhIUXZLaXBjYmx4MElDb2dRR05zWVhOeklHTnZjbVV1YkdsemRGeHVYSFFnS2x4dVhIUWdLaUJzYVhOMElIVjBhV3h6WEc1Y2RDQXFYRzVjZENBcUlFQnphVzVuYkdWMGIyNWNibHgwSUNvZ1FHRnNkR1Z5Ym1GMFpVTnNZWE56VG1GdFpTQnNhWE4wWEc1Y2RDQXFMMXh1WEhSMllYSWdiR2x6ZENBOUlDaG1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nY21WMGRYSnVjeUIwYUdVZ1ptbHljM1FnYVhSbGJTQnZaaUJoYmlCaGNuSmhlUzVjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlHRnljbUY1WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUdobFlXUWdQU0JtZFc1amRHbHZiaUFvWVhKeVlYa3BJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQmhjbkpoZVZzd1hUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djbVYwZFhKdWN5QjBhR1VnYkdGemRDQnBkR1Z0SUc5bUlHRnVJR0Z5Y21GNUxseHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWDBnWVhKeVlYbGNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdiR0Z6ZENBOUlHWjFibU4wYVc5dUlDaGhjbkpoZVNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUdGeWNtRjVXMkZ5Y21GNUxteGxibWQwYUNBdElERmRPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ5WlhSMWNtNXpJR1YyWlhKNWRHaHBibWNnWW5WMElIUm9aU0JzWVhOMElHVnVkSEo1SUc5bUlIUm9aU0JoY25KaGVTNWNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUdGeWNtRjVYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR2x1YVhScFlXd2dQU0JtZFc1amRHbHZiaUFvWVhKeVlYa3BJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQmhjbkpoZVM1emJHbGpaU2d3TENCaGNuSmhlUzVzWlc1bmRHZ2dMU0F4S1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVjBkWEp1Y3lCMGFHVWdjbVZ6ZENCdlppQjBhR1VnYVhSbGJYTWdhVzRnWVc0Z1lYSnlZWGt1WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMEZ5Y21GNWZTQmhjbkpoZVZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCMFlXbHNJRDBnWm5WdVkzUnBiMjRnS0dGeWNtRjVLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdZWEp5WVhrdWMyeHBZMlVvTVNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlISmxkSFZ5Ym5NZ2FYUmxiU0J2WmlCaGNuSmhlVnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJtYVc1a0lEMGdablZ1WTNScGIyNGdLR0Z5Y21GNUxDQndjbVZrS1NCN1hHNWNkRngwWEhSbWIzSWdLSFpoY2lCcFpIZ2dQU0F3TENCc1pXNGdQU0JoY25KaGVTNXNaVzVuZEdnN0lHbGtlQ0E4SUd4bGJqc2dhV1I0S3lzcElIdGNibHgwWEhSY2RGeDBkbUZ5SUdsMFpXMGdQU0JoY25KaGVWdHBaSGhkTzF4dVhIUmNkRngwWEhScFppQW9jSEpsWkNocGRHVnRLU2tnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCcGRHVnRPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhKbGRIVnlibk1nZEhKMVpTQnBaaUJoYkd3Z2IyWWdkR2hsSUhaaGJIVmxjeUJwYmlCMGFHVWdZWEp5WVhrZ2NHRnpjeUIwYUdVZ2NISmxaR2xqWVhSbElIUnlkWFJvSUhSbGMzUXVYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR0ZzYkNBOUlHWjFibU4wYVc5dUlDaGhjbkpoZVN3Z2NISmxaQ2tnZTF4dVhIUmNkRngwWm05eUlDaDJZWElnYVdSNElEMGdNQ3dnYkdWdUlEMGdZWEp5WVhrdWJHVnVaM1JvT3lCcFpIZ2dQQ0JzWlc0N0lHbGtlQ3NyS1NCN1hHNWNkRngwWEhSY2RHbG1JQ2doY0hKbFpDaGhjbkpoZVZ0cFpIaGRLU2tnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCbVlXeHpaVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhIUmNkRngwY21WMGRYSnVJSFJ5ZFdVN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlISmxkSFZ5Ym5NZ2RISjFaU0JwWmlCMGFHVWdkbUZzZFdVZ2FYTWdjSEpsYzJWdWRDQnBiaUIwYUdVZ2JHbHpkQzVjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnWTI5dWRHRnBibk1nUFNCbWRXNWpkR2x2YmlBb1lYSnlZWGtzSUdsMFpXMHBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQWtMbWx1UVhKeVlYa29hWFJsYlN3Z1lYSnlZWGtwSUNFOVBTQXRNVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nWjJWMElITjFiU0JtY205dElHRWdiR2x6ZEZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdZWEp5WVhrZ0xTQmhjbkpoZVZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUdadUlDMGdhWFJsY21GMGIzSmNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdjM1Z0SUQwZ1puVnVZM1JwYjI0Z0tHRnljbUY1TENCbWJpa2dlMXh1WEhSY2RGeDBabTRnUFNCbWJpQjhmQ0JtZFc1akxuTmxiR1k3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdZWEp5WVhrdWNtVmtkV05sS0daMWJtTjBhVzl1SUNodFpXMXZMQ0IyS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCdFpXMXZJQ3NnWm00b2RpazdYRzVjZEZ4MFhIUjlMQ0F3S1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVjBkWEp1Y3lCaElHTnZjSGtnYjJZZ2RHaGxJR052Ykd4bFkzUnBiMjRnZDJsMGFDQmhjbkpoZVNCMGVYQmxMbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRMjlzYkdWamRHbHZibjBnWTI5c2JHVmpkR2x2YmlBdElHTnZiR3hsWTNScGIyNGdaV2NwSUc1dlpHVXVZMmhwYkdST2IyUmxjeXdnTGk0dVhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHWnliMjBnUFNCbWRXNWpkR2x2YmlBb1kyOXNiR1ZqZEdsdmJpa2dlMXh1WEhSY2RGeDBkbUZ5SUhKbGMzVnNkQ0E5SUZ0ZExDQnBaSGdnUFNBdE1Td2diR1Z1WjNSb0lEMGdZMjlzYkdWamRHbHZiaTVzWlc1bmRHZzdYRzVjZEZ4MFhIUjNhR2xzWlNBb0t5dHBaSGdnUENCc1pXNW5kR2dwSUh0Y2JseDBYSFJjZEZ4MGNtVnpkV3gwVzJsa2VGMGdQU0JqYjJ4c1pXTjBhVzl1VzJsa2VGMDdYRzVjZEZ4MFhIUjlYRzVjZEZ4MFhIUnlaWFIxY200Z2NtVnpkV3gwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCamJIVnpkR1Z5SUdWc1pXMWxiblJ6SUdKNUlIQnlaV1JwWTJGMFpTQm1kVzVqZEdsdmJpNWNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUdGeWNtRjVJQzBnWVhKeVlYbGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQm1iaUF0SUhCeVpXUnBZMkYwWlNCbWRXNWpkR2x2YmlCbWIzSWdZMngxYzNSbGNpQnlkV3hsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRCY25KaGVWdGRmVnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJqYkhWemRHVnlRbmtnUFNCbWRXNWpkR2x2YmlBb1lYSnlZWGtzSUdadUtTQjdYRzVjZEZ4MFhIUnBaaUFvSVdGeWNtRjVMbXhsYm1kMGFDa2dleUJ5WlhSMWNtNGdXMTA3SUgxY2JseDBYSFJjZEhaaGNpQmhWR0ZwYkNBOUlIUmhhV3dvWVhKeVlYa3BPMXh1WEhSY2RGeDBjbVYwZFhKdUlHRlVZV2xzTG5KbFpIVmpaU2htZFc1amRHbHZiaUFvYldWdGJ5d2dkaWtnZTF4dVhIUmNkRngwWEhSMllYSWdZVXhoYzNRZ1BTQnNZWE4wS0cxbGJXOHBPMXh1WEhSY2RGeDBYSFJwWmlBb1ptNG9iR0Z6ZENoaFRHRnpkQ2tzSUhZcEtTQjdYRzVjZEZ4MFhIUmNkRngwWVV4aGMzUmJZVXhoYzNRdWJHVnVaM1JvWFNBOUlIWTdYRzVjZEZ4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkRngwYldWdGIxdHRaVzF2TG14bGJtZDBhRjBnUFNCYmRsMDdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwY21WMGRYSnVJRzFsYlc4N1hHNWNkRngwWEhSOUxDQmJXMmhsWVdRb1lYSnlZWGtwWFYwcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnlaWFIxY201eklHRWdZMjl3ZVNCdlppQjBhR1VnWVhKeVlYa2dkMmwwYUNCaGJHd2dabUZzYzNrZ2RtRnNkV1Z6SUhKbGJXOTJaV1JjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlHRnljbUY1SUMwZ1lYSnlZWGxjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JtYmlBdElIQnlaV1JwWTJGMFpTQm1kVzVqZEdsdmJpQm1iM0lnWTJ4MWMzUmxjaUJ5ZFd4bFhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHTnZiWEJoWTNRZ1BTQm1kVzVqZEdsdmJpQW9ZWEp5WVhrcElIdGNibHgwWEhSY2RIWmhjaUJoVW1WemRXeDBJRDBnVzEwN1hHNWNkRngwWEhSbWIzSWdLSFpoY2lCcFpIZ2dQU0F3TENCc1pXNGdQU0JoY25KaGVTNXNaVzVuZEdnN0lHbGtlQ0E4SUd4bGJqc2dhV1I0S3lzcElIdGNibHgwWEhSY2RGeDBhV1lnS0dGeWNtRjVXMmxrZUYwcElIc2dZVkpsYzNWc2RDNXdkWE5vS0dGeWNtRjVXMmxrZUYwcE95QjlYRzVjZEZ4MFhIUjlYRzVjZEZ4MFhIUnlaWFIxY200Z1lWSmxjM1ZzZER0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NISnZaSFZqWlhNZ1lTQmtkWEJzYVdOaGRHVXRabkpsWlNCMlpYSnphVzl1SUc5bUlIUm9aU0JoY25KaGVWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWDBnWVhKeVlYbGNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdkVzVwY1hWbElEMGdablZ1WTNScGIyNGdLR0Z5Y21GNUtTQjdYRzVjZEZ4MFhIUjJZWElnY21WemRXeDBjeUE5SUZ0ZE8xeHVYRzVjZEZ4MFhIUm1iM0lnS0haaGNpQnBaSGdnUFNBd0xDQnNaVzRnUFNCaGNuSmhlUzVzWlc1bmRHZzdJR2xrZUNBOElHeGxianNnYVdSNEt5c3BJSHRjYmx4MFhIUmNkRngwYVdZZ0tDRmpiMjUwWVdsdWN5aHlaWE4xYkhSekxDQmhjbkpoZVZ0cFpIaGRLU2tnZTF4dVhIUmNkRngwWEhSY2RISmxjM1ZzZEhNdWNIVnphQ2hoY25KaGVWdHBaSGhkS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUnlaWFIxY200Z2NtVnpkV3gwY3p0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVjBkWEp1Y3lCdVpYaDBJR2wwWlcwdVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWDBnWVhKeVlYbGNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdibVY0ZENBOUlHWjFibU4wYVc5dUlDaGhjbkpoZVN3Z2FYUmxiU2tnZTF4dVhIUmNkRngwZG1GeUlHbGtlQ0E5SUdGeWNtRjVMbWx1WkdWNFQyWW9hWFJsYlNrN1hHNWNkRngwWEhScFppQW9hV1I0SUQwOVBTQXRNU2tnZXlCeVpYUjFjbTRnYm5Wc2JEc2dmVnh1WEc1Y2RGeDBYSFJ5WlhSMWNtNGdZWEp5WVhsYmFXUjRJQ3NnTVYwN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlISmxkSFZ5Ym5NZ2NISmxkaUJwZEdWdExseHVYSFJjZENBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUdGeWNtRjVYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJSEJ5WlhZZ1BTQm1kVzVqZEdsdmJpQW9ZWEp5WVhrc0lHbDBaVzBwSUh0Y2JseDBYSFJjZEhaaGNpQnBaSGdnUFNCaGNuSmhlUzVwYm1SbGVFOW1LR2wwWlcwcE8xeHVYSFJjZEZ4MGFXWWdLR2xrZUNBOVBUMGdMVEVwSUhzZ2NtVjBkWEp1SUc1MWJHdzdJSDFjYmx4dVhIUmNkRngwY21WMGRYSnVJR0Z5Y21GNVcybGtlQ0F0SURGZE8xeHVYSFJjZEgwN1hHNWNibHh1WEhSY2RISmxkSFZ5YmlCN1hHNWNkRngwWEhSb1pXRmtPaUJvWldGa0xDQnNZWE4wT2lCc1lYTjBMQ0JwYm1sMGFXRnNPaUJwYm1sMGFXRnNMQ0IwWVdsc09pQjBZV2xzTEZ4dVhIUmNkRngwY0hKbGRqb2djSEpsZGl3Z2JtVjRkRG9nYm1WNGRDd2dabWx1WkRvZ1ptbHVaQ3dnWTI5dWRHRnBibk02SUdOdmJuUmhhVzV6TEZ4dVhIUmNkRngwWVd4c09pQmhiR3dzSUhOMWJUb2djM1Z0TENCbWNtOXRPaUJtY205dExGeHVYSFJjZEZ4MFkyeDFjM1JsY2tKNU9pQmpiSFZ6ZEdWeVFua3NJR052YlhCaFkzUTZJR052YlhCaFkzUXNJSFZ1YVhGMVpUb2dkVzVwY1hWbFhHNWNkRngwZlR0Y2JseDBmU2tvS1R0Y2JseHVYRzVjZEhaaGNpQk9RbE5RWDBOSVFWSWdQU0JUZEhKcGJtY3Vabkp2YlVOb1lYSkRiMlJsS0RFMk1DazdYRzVjZEhaaGNpQmFSVkpQWDFkSlJGUklYMDVDVTFCZlEwaEJVaUE5SUNkY1hIVm1aV1ptSnp0Y2JseHVYSFF2S2lwY2JseDBJQ29nUUdOc1lYTnpJR052Y21VdVpHOXRYRzVjZENBcVhHNWNkQ0FxSUVSdmJTQm1kVzVqZEdsdmJuTmNibHgwSUNwY2JseDBJQ29nUUhOcGJtZHNaWFJ2Ymx4dVhIUWdLaUJBWVd4MFpYSnVZWFJsUTJ4aGMzTk9ZVzFsSUdSdmJWeHVYSFFnS2k5Y2JseDBkbUZ5SUdSdmJTQTlJQ2htZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCcGMwVmthWFJoWW14bFhHNWNkRngwSUNwY2JseDBYSFFnS2lCeVpYUjFjbTV6SUhkb1pYUm9aWElnYm05a1pTQnBjeUJnYm05MFpTMWxaR2wwWVdKc1pXQWdiM0lnYm05MExseHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J1YjJSbFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1FtOXZiR1ZoYm4xY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2FYTkZaR2wwWVdKc1pTQTlJR1oxYm1OMGFXOXVJQ2h1YjJSbEtTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z2JtOWtaU0FtSmlBa0tHNXZaR1VwTG1oaGMwTnNZWE56S0NkdWIzUmxMV1ZrYVhSaFlteGxKeWs3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnYVhORGIyNTBjbTlzVTJsNmFXNW5YRzVjZEZ4MElDcGNibHgwWEhRZ0tpQnlaWFIxY201eklIZG9aWFJvWlhJZ2JtOWtaU0JwY3lCZ2JtOTBaUzFqYjI1MGNtOXNMWE5wZW1sdVoyQWdiM0lnYm05MExseHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J1YjJSbFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1FtOXZiR1ZoYm4xY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2FYTkRiMjUwY205c1UybDZhVzVuSUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1VwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJ1YjJSbElDWW1JQ1FvYm05a1pTa3VhR0Z6UTJ4aGMzTW9KMjV2ZEdVdFkyOXVkSEp2YkMxemFYcHBibWNuS1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNBZ1luVnBiR1JNWVhsdmRYUkpibVp2WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJpZFdsc1pDQnNZWGx2ZFhSSmJtWnZJR1p5YjIwZ0pHVmthWFJ2Y2lndWJtOTBaUzFsWkdsMGIzSXBYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHVmthWFJ2Y2x4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTA5aWFtVmpkSDFjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRHZFc1amRHbHZibjBnY21WMGRYSnVMbVZrYVhSdmNseHVYSFJjZENBcUlFQnlaWFIxY200Z2UwNXZaR1Y5SUhKbGRIVnliaTVrY205d2VtOXVaVnh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMDV2WkdWOUlISmxkSFZ5Ymk1MGIyOXNZbUZ5WEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3VG05a1pYMGdjbVYwZFhKdUxtVmthWFJoWW14bFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1RtOWtaWDBnY21WMGRYSnVMbU52WkdGaWJHVmNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdE9iMlJsZlNCeVpYUjFjbTR1Y0c5d2IzWmxjbHh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMDV2WkdWOUlISmxkSFZ5Ymk1b1lXNWtiR1ZjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRPYjJSbGZTQnlaWFIxY200dVpHbGhiRzluWEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUdKMWFXeGtUR0Y1YjNWMFNXNW1ieUE5SUdaMWJtTjBhVzl1SUNna1pXUnBkRzl5S1NCN1hHNWNkRngwWEhSMllYSWdiV0ZyWlVacGJtUmxjanRjYmx4dVhIUmNkRngwTHk4Z1lXbHlJRzF2WkdWY2JseDBYSFJjZEdsbUlDZ2taV1JwZEc5eUxtaGhjME5zWVhOektDZHViM1JsTFdGcGNpMWxaR2wwYjNJbktTa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2FXUWdQU0JzYVhOMExteGhjM1FvSkdWa2FYUnZjaTVoZEhSeUtDZHBaQ2NwTG5Od2JHbDBLQ2N0SnlrcE8xeHVYSFJjZEZ4MFhIUnRZV3RsUm1sdVpHVnlJRDBnWm5WdVkzUnBiMjRnS0hOSlpGQnlaV1pwZUNrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9LU0I3SUhKbGRIVnliaUFrS0hOSlpGQnlaV1pwZUNBcklHbGtLVHNnZlR0Y2JseDBYSFJjZEZ4MGZUdGNibHh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdlMXh1WEhSY2RGeDBYSFJjZEdWa2FYUnZjam9nWm5WdVkzUnBiMjRnS0NrZ2V5QnlaWFIxY200Z0pHVmthWFJ2Y2pzZ2ZTeGNibHgwWEhSY2RGeDBYSFJvYjJ4a1pYSTZJR1oxYm1OMGFXOXVJQ2dwSUhzZ2NtVjBkWEp1SUNSbFpHbDBiM0l1WkdGMFlTZ25hRzlzWkdWeUp5azdJSDBzWEc1Y2RGeDBYSFJjZEZ4MFpXUnBkR0ZpYkdVNklHWjFibU4wYVc5dUlDZ3BJSHNnY21WMGRYSnVJQ1JsWkdsMGIzSTdJSDBzWEc1Y2RGeDBYSFJjZEZ4MGNHOXdiM1psY2pvZ2JXRnJaVVpwYm1SbGNpZ25JMjV2ZEdVdGNHOXdiM1psY2kwbktTeGNibHgwWEhSY2RGeDBYSFJvWVc1a2JHVTZJRzFoYTJWR2FXNWtaWElvSnlOdWIzUmxMV2hoYm1Sc1pTMG5LU3hjYmx4MFhIUmNkRngwWEhSa2FXRnNiMmM2SUcxaGEyVkdhVzVrWlhJb0p5TnViM1JsTFdScFlXeHZaeTBuS1Z4dVhIUmNkRngwWEhSOU8xeHVYRzVjZEZ4MFhIUmNkQzh2SUdaeVlXMWxJRzF2WkdWY2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEcxaGEyVkdhVzVrWlhJZ1BTQm1kVzVqZEdsdmJpQW9jME5zWVhOelRtRnRaU2tnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCbWRXNWpkR2x2YmlBb0tTQjdJSEpsZEhWeWJpQWtaV1JwZEc5eUxtWnBibVFvYzBOc1lYTnpUbUZ0WlNrN0lIMDdYRzVjZEZ4MFhIUmNkSDA3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUI3WEc1Y2RGeDBYSFJjZEZ4MFpXUnBkRzl5T2lCbWRXNWpkR2x2YmlBb0tTQjdJSEpsZEhWeWJpQWtaV1JwZEc5eU95QjlMRnh1WEhSY2RGeDBYSFJjZEdodmJHUmxjam9nWm5WdVkzUnBiMjRnS0NrZ2V5QnlaWFIxY200Z0pHVmthWFJ2Y2k1a1lYUmhLQ2RvYjJ4a1pYSW5LVHNnZlN4Y2JseDBYSFJjZEZ4MFhIUmtjbTl3ZW05dVpUb2diV0ZyWlVacGJtUmxjaWduTG01dmRHVXRaSEp2Y0hwdmJtVW5LU3hjYmx4MFhIUmNkRngwWEhSMGIyOXNZbUZ5T2lCdFlXdGxSbWx1WkdWeUtDY3VibTkwWlMxMGIyOXNZbUZ5Snlrc1hHNWNkRngwWEhSY2RGeDBaV1JwZEdGaWJHVTZJRzFoYTJWR2FXNWtaWElvSnk1dWIzUmxMV1ZrYVhSaFlteGxKeWtzWEc1Y2RGeDBYSFJjZEZ4MFkyOWtZV0pzWlRvZ2JXRnJaVVpwYm1SbGNpZ25MbTV2ZEdVdFkyOWtZV0pzWlNjcExGeHVYSFJjZEZ4MFhIUmNkSE4wWVhSMWMySmhjam9nYldGclpVWnBibVJsY2lnbkxtNXZkR1V0YzNSaGRIVnpZbUZ5Snlrc1hHNWNkRngwWEhSY2RGeDBjRzl3YjNabGNqb2diV0ZyWlVacGJtUmxjaWduTG01dmRHVXRjRzl3YjNabGNpY3BMRnh1WEhSY2RGeDBYSFJjZEdoaGJtUnNaVG9nYldGclpVWnBibVJsY2lnbkxtNXZkR1V0YUdGdVpHeGxKeWtzWEc1Y2RGeDBYSFJjZEZ4MFpHbGhiRzluT2lCdFlXdGxSbWx1WkdWeUtDY3VibTkwWlMxa2FXRnNiMmNuS1Z4dVhIUmNkRngwWEhSOU8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnlaWFIxY201eklHMWhhMlZNWVhsdmRYUkpibVp2SUdaeWIyMGdaV1JwZEc5eUozTWdaR1Z6WTJWdVpHRnVkQ0J1YjJSbExseHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQnlhWFpoZEdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA1dlpHVjlJR1JsYzJObGJtUmhiblJjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRQWW1wbFkzUjlYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJRzFoYTJWTVlYbHZkWFJKYm1adklEMGdablZ1WTNScGIyNGdLR1JsYzJObGJtUmhiblFwSUh0Y2JseDBYSFJjZEhaaGNpQWtkR0Z5WjJWMElEMGdKQ2hrWlhOalpXNWtZVzUwS1M1amJHOXpaWE4wS0NjdWJtOTBaUzFsWkdsMGIzSXNJQzV1YjNSbExXRnBjaTFsWkdsMGIzSXNJQzV1YjNSbExXRnBjaTFzWVhsdmRYUW5LVHRjYmx4dVhIUmNkRngwYVdZZ0tDRWtkR0Z5WjJWMExteGxibWQwYUNrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2JuVnNiRHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwZG1GeUlDUmxaR2wwYjNJN1hHNWNkRngwWEhScFppQW9KSFJoY21kbGRDNXBjeWduTG01dmRHVXRaV1JwZEc5eUxDQXVibTkwWlMxaGFYSXRaV1JwZEc5eUp5a3BJSHRjYmx4MFhIUmNkRngwSkdWa2FYUnZjaUE5SUNSMFlYSm5aWFE3WEc1Y2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFFrWldScGRHOXlJRDBnSkNnbkkyNXZkR1V0WldScGRHOXlMU2NnS3lCc2FYTjBMbXhoYzNRb0pIUmhjbWRsZEM1aGRIUnlLQ2RwWkNjcExuTndiR2wwS0NjdEp5a3BLVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwY21WMGRYSnVJR0oxYVd4a1RHRjViM1YwU1c1bWJ5Z2taV1JwZEc5eUtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnRZV3RsVUhKbFpFSjVUbTlrWlU1aGJXVmNibHgwWEhRZ0tseHVYSFJjZENBcUlISmxkSFZ5Ym5NZ2NISmxaR2xqWVhSbElIZG9hV05vSUdwMVpHZGxJSGRvWlhSb1pYSWdibTlrWlU1aGJXVWdhWE1nYzJGdFpWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUc1dlpHVk9ZVzFsWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3Um5WdVkzUnBiMjU5WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUcxaGEyVlFjbVZrUW5sT2IyUmxUbUZ0WlNBOUlHWjFibU4wYVc5dUlDaHViMlJsVG1GdFpTa2dlMXh1WEhSY2RGeDBibTlrWlU1aGJXVWdQU0J1YjJSbFRtRnRaUzUwYjFWd2NHVnlRMkZ6WlNncE8xeHVYSFJjZEZ4MGNtVjBkWEp1SUdaMWJtTjBhVzl1SUNodWIyUmxLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJ1YjJSbElDWW1JRzV2WkdVdWJtOWtaVTVoYldVdWRHOVZjSEJsY2tOaGMyVW9LU0E5UFQwZ2JtOWtaVTVoYldVN1hHNWNkRngwWEhSOU8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lHbHpWR1Y0ZEZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ2JtOWtaVnh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMEp2YjJ4bFlXNTlJSFJ5ZFdVZ2FXWWdibTlrWlNkeklIUjVjR1VnYVhNZ2RHVjRkQ2d6S1Z4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCcGMxUmxlSFFnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU2tnZTF4dVhIUmNkRngwY21WMGRYSnVJRzV2WkdVZ0ppWWdibTlrWlM1dWIyUmxWSGx3WlNBOVBUMGdNenRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nWlhncElHSnlMQ0JqYjJ3c0lHVnRZbVZrTENCb2Npd2dhVzFuTENCcGJuQjFkQ3dnTGk0dVhHNWNkRngwSUNvZ1FITmxaU0JvZEhSd09pOHZkM2QzTG5jekxtOXlaeTlvZEcxc0wzZG5MMlJ5WVdaMGN5OW9kRzFzTDIxaGMzUmxjaTl6ZVc1MFlYZ3VhSFJ0YkNOMmIybGtMV1ZzWlcxbGJuUnpYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR2x6Vm05cFpDQTlJR1oxYm1OMGFXOXVJQ2h1YjJSbEtTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z2JtOWtaU0FtSmlBdlhrSlNmRjVKVFVkOFhraFNMeTUwWlhOMEtHNXZaR1V1Ym05a1pVNWhiV1V1ZEc5VmNIQmxja05oYzJVb0tTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUJwYzFCaGNtRWdQU0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1WEhSY2RGeDBhV1lnS0dselJXUnBkR0ZpYkdVb2JtOWtaU2twSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUdaaGJITmxPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFF2THlCRGFISnZiV1VvZGpNeExqQXBMQ0JHUmloMk1qVXVNQzR4S1NCMWMyVWdSRWxXSUdadmNpQndZWEpoWjNKaGNHaGNibHgwWEhSY2RISmxkSFZ5YmlCdWIyUmxJQ1ltSUM5ZVJFbFdmRjVRZkY1TVNYeGVTRnN4TFRkZEx5NTBaWE4wS0c1dlpHVXVibTlrWlU1aGJXVXVkRzlWY0hCbGNrTmhjMlVvS1NrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQnBjMHhwSUQwZ2JXRnJaVkJ5WldSQ2VVNXZaR1ZPWVcxbEtDZE1TU2NwTzF4dVhHNWNkRngwZG1GeUlHbHpVSFZ5WlZCaGNtRWdQU0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHbHpVR0Z5WVNodWIyUmxLU0FtSmlBaGFYTk1hU2h1YjJSbEtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MGRtRnlJR2x6VkdGaWJHVWdQU0J0WVd0bFVISmxaRUo1VG05a1pVNWhiV1VvSjFSQlFreEZKeWs3WEc1Y2JseDBYSFIyWVhJZ2FYTkpibXhwYm1VZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUNGcGMwSnZaSGxEYjI1MFlXbHVaWElvYm05a1pTa2dKaVpjYmx4MFhIUmNkRngwSUNBZ0lXbHpUR2x6ZENodWIyUmxLU0FtSmx4dVhIUmNkRngwWEhRZ0lDQWhhWE5RWVhKaEtHNXZaR1VwSUNZbVhHNWNkRngwWEhSY2RDQWdJQ0ZwYzFSaFlteGxLRzV2WkdVcElDWW1YRzVjZEZ4MFhIUmNkQ0FnSUNGcGMwSnNiMk5yY1hWdmRHVW9ibTlrWlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQnBjMHhwYzNRZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUc1dlpHVWdKaVlnTDE1VlRIeGVUMHd2TG5SbGMzUW9ibTlrWlM1dWIyUmxUbUZ0WlM1MGIxVndjR1Z5UTJGelpTZ3BLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBkbUZ5SUdselEyVnNiQ0E5SUdaMWJtTjBhVzl1SUNodWIyUmxLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdibTlrWlNBbUppQXZYbFJFZkY1VVNDOHVkR1Z6ZENodWIyUmxMbTV2WkdWT1lXMWxMblJ2VlhCd1pYSkRZWE5sS0NrcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdhWE5DYkc5amEzRjFiM1JsSUQwZ2JXRnJaVkJ5WldSQ2VVNXZaR1ZPWVcxbEtDZENURTlEUzFGVlQxUkZKeWs3WEc1Y2JseDBYSFIyWVhJZ2FYTkNiMlI1UTI5dWRHRnBibVZ5SUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1VwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJwYzBObGJHd29ibTlrWlNrZ2ZId2dhWE5DYkc5amEzRjFiM1JsS0c1dlpHVXBJSHg4SUdselJXUnBkR0ZpYkdVb2JtOWtaU2s3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkSFpoY2lCcGMwRnVZMmh2Y2lBOUlHMWhhMlZRY21Wa1FubE9iMlJsVG1GdFpTZ25RU2NwTzF4dVhHNWNkRngwZG1GeUlHbHpVR0Z5WVVsdWJHbHVaU0E5SUdaMWJtTjBhVzl1SUNodWIyUmxLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdhWE5KYm14cGJtVW9ibTlrWlNrZ0ppWWdJU0ZoYm1ObGMzUnZjaWh1YjJSbExDQnBjMUJoY21FcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdhWE5DYjJSNVNXNXNhVzVsSUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1VwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJwYzBsdWJHbHVaU2h1YjJSbEtTQW1KaUFoWVc1alpYTjBiM0lvYm05a1pTd2dhWE5RWVhKaEtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MGRtRnlJR2x6UW05a2VTQTlJRzFoYTJWUWNtVmtRbmxPYjJSbFRtRnRaU2duUWs5RVdTY3BPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nY21WMGRYSnVjeUIzYUdWMGFHVnlJRzV2WkdWQ0lHbHpJR05zYjNObGMzUWdjMmxpYkdsdVp5QnZaaUJ1YjJSbFFWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J1YjJSbFFWeHVYSFJjZENBcUlFQndZWEpoYlNCN1RtOWtaWDBnYm05a1pVSmNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdENiMjlzWldGdWZWeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQnBjME5zYjNObGMzUlRhV0pzYVc1bklEMGdablZ1WTNScGIyNGdLRzV2WkdWQkxDQnViMlJsUWlrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUc1dlpHVkJMbTVsZUhSVGFXSnNhVzVuSUQwOVBTQnViMlJsUWlCOGZGeHVYSFJjZEZ4MFhIUWdJQ0J1YjJSbFFTNXdjbVYyYVc5MWMxTnBZbXhwYm1jZ1BUMDlJRzV2WkdWQ08xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnlaWFIxY201eklHRnljbUY1SUc5bUlHTnNiM05sYzNRZ2MybGliR2x1WjNNZ2QybDBhQ0J1YjJSbFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA1dlpHVjlJRzV2WkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJaMWJtTjBhVzl1ZlNCYmNISmxaRjBnTFNCd2NtVmthV05oZEdVZ1puVnVZM1JwYjI1Y2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0T2IyUmxXMTE5WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUhkcGRHaERiRzl6WlhOMFUybGliR2x1WjNNZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlN3Z2NISmxaQ2tnZTF4dVhIUmNkRngwY0hKbFpDQTlJSEJ5WldRZ2ZId2dablZ1WXk1dmF6dGNibHh1WEhSY2RGeDBkbUZ5SUhOcFlteHBibWR6SUQwZ1cxMDdYRzVjZEZ4MFhIUnBaaUFvYm05a1pTNXdjbVYyYVc5MWMxTnBZbXhwYm1jZ0ppWWdjSEpsWkNodWIyUmxMbkJ5WlhacGIzVnpVMmxpYkdsdVp5a3BJSHRjYmx4MFhIUmNkRngwYzJsaWJHbHVaM011Y0hWemFDaHViMlJsTG5CeVpYWnBiM1Z6VTJsaWJHbHVaeWs3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ6YVdKc2FXNW5jeTV3ZFhOb0tHNXZaR1VwTzF4dVhIUmNkRngwYVdZZ0tHNXZaR1V1Ym1WNGRGTnBZbXhwYm1jZ0ppWWdjSEpsWkNodWIyUmxMbTVsZUhSVGFXSnNhVzVuS1NrZ2UxeHVYSFJjZEZ4MFhIUnphV0pzYVc1bmN5NXdkWE5vS0c1dlpHVXVibVY0ZEZOcFlteHBibWNwTzF4dVhIUmNkRngwZlZ4dVhIUmNkRngwY21WMGRYSnVJSE5wWW14cGJtZHpPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJpYkdGdWF5QklWRTFNSUdadmNpQmpkWEp6YjNJZ2NHOXphWFJwYjI1Y2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ1lteGhibXRJVkUxTUlEMGdZV2RsYm5RdWFYTk5VMGxGSUQ4Z0p5WnVZbk53T3ljZ09pQW5QR0p5UGljN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lHNXZaR1ZNWlc1bmRHaGNibHgwWEhRZ0tseHVYSFJjZENBcUlISmxkSFZ5Ym5NZ0kzUmxlSFFuY3lCMFpYaDBJSE5wZW1VZ2IzSWdaV3hsYldWdWRDZHpJR05vYVd4a1RtOWtaWE1nYzJsNlpWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J1YjJSbFhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHNXZaR1ZNWlc1bmRHZ2dQU0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1WEhSY2RGeDBhV1lnS0dselZHVjRkQ2h1YjJSbEtTa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdibTlrWlM1dWIyUmxWbUZzZFdVdWJHVnVaM1JvTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSeVpYUjFjbTRnYm05a1pTNWphR2xzWkU1dlpHVnpMbXhsYm1kMGFEdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djbVYwZFhKdWN5QjNhR1YwYUdWeUlHNXZaR1VnYVhNZ1pXMXdkSGtnYjNJZ2JtOTBMbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCdWIyUmxYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdRbTl2YkdWaGJuMWNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdhWE5GYlhCMGVTQTlJR1oxYm1OMGFXOXVJQ2h1YjJSbEtTQjdYRzVjZEZ4MFhIUjJZWElnYkdWdUlEMGdibTlrWlV4bGJtZDBhQ2h1YjJSbEtUdGNibHh1WEhSY2RGeDBhV1lnS0d4bGJpQTlQVDBnTUNrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RISjFaVHRjYmx4MFhIUmNkSDBnWld4elpTQnBaaUFvSVdSdmJTNXBjMVJsZUhRb2JtOWtaU2tnSmlZZ2JHVnVJRDA5UFNBeElDWW1JRzV2WkdVdWFXNXVaWEpJVkUxTUlEMDlQU0JpYkdGdWEwaFVUVXdwSUh0Y2JseDBYSFJjZEZ4MEx5OGdaWGdwSUR4d1BqeGljajQ4TDNBK0xDQThjM0JoYmo0OFluSStQQzl6Y0dGdVBseHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RISjFaVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwY21WMGRYSnVJR1poYkhObE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQndZV1JrYVc1bklHSnNZVzVyU0ZSTlRDQnBaaUJ1YjJSbElHbHpJR1Z0Y0hSNUlDaG1iM0lnWTNWeWMyOXlJSEJ2YzJsMGFXOXVLVnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJ3WVdSa2FXNW5RbXhoYm10SVZFMU1JRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXBJSHRjYmx4MFhIUmNkR2xtSUNnaGFYTldiMmxrS0c1dlpHVXBJQ1ltSUNGdWIyUmxUR1Z1WjNSb0tHNXZaR1VwS1NCN1hHNWNkRngwWEhSY2RHNXZaR1V1YVc1dVpYSklWRTFNSUQwZ1lteGhibXRJVkUxTU8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQm1hVzVrSUc1bFlYSmxjM1FnWVc1alpYTjBiM0lnY0hKbFpHbGpZWFJsSUdocGRGeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J1YjJSbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ2NISmxaQ0F0SUhCeVpXUnBZMkYwWlNCbWRXNWpkR2x2Ymx4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCaGJtTmxjM1J2Y2lBOUlHWjFibU4wYVc5dUlDaHViMlJsTENCd2NtVmtLU0I3WEc1Y2RGeDBYSFIzYUdsc1pTQW9ibTlrWlNrZ2UxeHVYSFJjZEZ4MFhIUnBaaUFvY0hKbFpDaHViMlJsS1NrZ2V5QnlaWFIxY200Z2JtOWtaVHNnZlZ4dVhIUmNkRngwWEhScFppQW9hWE5GWkdsMFlXSnNaU2h1YjJSbEtTa2dleUJpY21WaGF6c2dmVnh1WEc1Y2RGeDBYSFJjZEc1dlpHVWdQU0J1YjJSbExuQmhjbVZ1ZEU1dlpHVTdYRzVjZEZ4MFhIUjlYRzVjZEZ4MFhIUnlaWFIxY200Z2JuVnNiRHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nWm1sdVpDQnVaV0Z5WlhOMElHRnVZMlZ6ZEc5eUlHOXViSGtnYzJsdVoyeGxJR05vYVd4a0lHSnNiMjlrSUd4cGJtVWdZVzVrSUhCeVpXUnBZMkYwWlNCb2FYUmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1RtOWtaWDBnYm05a1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlIQnlaV1FnTFNCd2NtVmthV05oZEdVZ1puVnVZM1JwYjI1Y2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2MybHVaMnhsUTJocGJHUkJibU5sYzNSdmNpQTlJR1oxYm1OMGFXOXVJQ2h1YjJSbExDQndjbVZrS1NCN1hHNWNkRngwWEhSdWIyUmxJRDBnYm05a1pTNXdZWEpsYm5ST2IyUmxPMXh1WEc1Y2RGeDBYSFIzYUdsc1pTQW9ibTlrWlNrZ2UxeHVYSFJjZEZ4MFhIUnBaaUFvYm05a1pVeGxibWQwYUNodWIyUmxLU0FoUFQwZ01Ta2dleUJpY21WaGF6c2dmVnh1WEhSY2RGeDBYSFJwWmlBb2NISmxaQ2h1YjJSbEtTa2dleUJ5WlhSMWNtNGdibTlrWlRzZ2ZWeHVYSFJjZEZ4MFhIUnBaaUFvYVhORlpHbDBZV0pzWlNodWIyUmxLU2tnZXlCaWNtVmhhenNnZlZ4dVhHNWNkRngwWEhSY2RHNXZaR1VnUFNCdWIyUmxMbkJoY21WdWRFNXZaR1U3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ5WlhSMWNtNGdiblZzYkR0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVjBkWEp1Y3lCdVpYY2dZWEp5WVhrZ2IyWWdZVzVqWlhOMGIzSWdibTlrWlhNZ0tIVnVkR2xzSUhCeVpXUnBZMkYwWlNCb2FYUXBMbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCdWIyUmxYRzVjZEZ4MElDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdXMjl3ZEdsdmJtRnNYU0J3Y21Wa0lDMGdjSEpsWkdsallYUmxJR1oxYm1OMGFXOXVYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR3hwYzNSQmJtTmxjM1J2Y2lBOUlHWjFibU4wYVc5dUlDaHViMlJsTENCd2NtVmtLU0I3WEc1Y2RGeDBYSFJ3Y21Wa0lEMGdjSEpsWkNCOGZDQm1kVzVqTG1aaGFXdzdYRzVjYmx4MFhIUmNkSFpoY2lCaGJtTmxjM1J2Y25NZ1BTQmJYVHRjYmx4MFhIUmNkR0Z1WTJWemRHOXlLRzV2WkdVc0lHWjFibU4wYVc5dUlDaGxiQ2tnZTF4dVhIUmNkRngwWEhScFppQW9JV2x6UldScGRHRmliR1VvWld3cEtTQjdYRzVjZEZ4MFhIUmNkRngwWVc1alpYTjBiM0p6TG5CMWMyZ29aV3dwTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBjbVYwZFhKdUlIQnlaV1FvWld3cE8xeHVYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUnlaWFIxY200Z1lXNWpaWE4wYjNKek8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQm1hVzVrSUdaaGNuUm9aWE4wSUdGdVkyVnpkRzl5SUhCeVpXUnBZMkYwWlNCb2FYUmNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdiR0Z6ZEVGdVkyVnpkRzl5SUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1VzSUhCeVpXUXBJSHRjYmx4MFhIUmNkSFpoY2lCaGJtTmxjM1J2Y25NZ1BTQnNhWE4wUVc1alpYTjBiM0lvYm05a1pTazdYRzVjZEZ4MFhIUnlaWFIxY200Z2JHbHpkQzVzWVhOMEtHRnVZMlZ6ZEc5eWN5NW1hV3gwWlhJb2NISmxaQ2twTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCeVpYUjFjbTV6SUdOdmJXMXZiaUJoYm1ObGMzUnZjaUJ1YjJSbElHSmxkSGRsWlc0Z2RIZHZJRzV2WkdWekxseHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J1YjJSbFFWeHVYSFJjZENBcUlFQndZWEpoYlNCN1RtOWtaWDBnYm05a1pVSmNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdZMjl0Ylc5dVFXNWpaWE4wYjNJZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlVFc0lHNXZaR1ZDS1NCN1hHNWNkRngwWEhSMllYSWdZVzVqWlhOMGIzSnpJRDBnYkdsemRFRnVZMlZ6ZEc5eUtHNXZaR1ZCS1R0Y2JseDBYSFJjZEdadmNpQW9kbUZ5SUc0Z1BTQnViMlJsUWpzZ2Jqc2diaUE5SUc0dWNHRnlaVzUwVG05a1pTa2dlMXh1WEhSY2RGeDBYSFJwWmlBb0pDNXBia0Z5Y21GNUtHNHNJR0Z1WTJWemRHOXljeWtnUGlBdE1Ta2dleUJ5WlhSMWNtNGdianNnZlZ4dVhIUmNkRngwZlZ4dVhIUmNkRngwY21WMGRYSnVJRzUxYkd3N0lDOHZJR1JwWm1abGNtVnVZMlVnWkc5amRXMWxiblFnWVhKbFlWeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnNhWE4wYVc1bklHRnNiQ0J3Y21WMmFXOTFjeUJ6YVdKc2FXNW5jeUFvZFc1MGFXd2djSEpsWkdsallYUmxJR2hwZENrdVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA1dlpHVjlJRzV2WkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCYmIzQjBhVzl1WVd4ZElIQnlaV1FnTFNCd2NtVmthV05oZEdVZ1puVnVZM1JwYjI1Y2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2JHbHpkRkJ5WlhZZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlN3Z2NISmxaQ2tnZTF4dVhIUmNkRngwY0hKbFpDQTlJSEJ5WldRZ2ZId2dablZ1WXk1bVlXbHNPMXh1WEc1Y2RGeDBYSFIyWVhJZ2JtOWtaWE1nUFNCYlhUdGNibHgwWEhSY2RIZG9hV3hsSUNodWIyUmxLU0I3WEc1Y2RGeDBYSFJjZEdsbUlDaHdjbVZrS0c1dlpHVXBLU0I3SUdKeVpXRnJPeUI5WEc1Y2RGeDBYSFJjZEc1dlpHVnpMbkIxYzJnb2JtOWtaU2s3WEc1Y2RGeDBYSFJjZEc1dlpHVWdQU0J1YjJSbExuQnlaWFpwYjNWelUybGliR2x1Wnp0Y2JseDBYSFJjZEgxY2JseDBYSFJjZEhKbGRIVnliaUJ1YjJSbGN6dGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2diR2x6ZEdsdVp5QnVaWGgwSUhOcFlteHBibWR6SUNoMWJuUnBiQ0J3Y21Wa2FXTmhkR1VnYUdsMEtTNWNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1RtOWtaWDBnYm05a1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlGdHdjbVZrWFNBdElIQnlaV1JwWTJGMFpTQm1kVzVqZEdsdmJseHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQnNhWE4wVG1WNGRDQTlJR1oxYm1OMGFXOXVJQ2h1YjJSbExDQndjbVZrS1NCN1hHNWNkRngwWEhSd2NtVmtJRDBnY0hKbFpDQjhmQ0JtZFc1akxtWmhhV3c3WEc1Y2JseDBYSFJjZEhaaGNpQnViMlJsY3lBOUlGdGRPMXh1WEhSY2RGeDBkMmhwYkdVZ0tHNXZaR1VwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLSEJ5WldRb2JtOWtaU2twSUhzZ1luSmxZV3M3SUgxY2JseDBYSFJjZEZ4MGJtOWtaWE11Y0hWemFDaHViMlJsS1R0Y2JseDBYSFJjZEZ4MGJtOWtaU0E5SUc1dlpHVXVibVY0ZEZOcFlteHBibWM3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ5WlhSMWNtNGdibTlrWlhNN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHeHBjM1JwYm1jZ1pHVnpZMlZ1WkdGdWRDQnViMlJsYzF4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbGZTQnViMlJsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRHZFc1amRHbHZibjBnVzNCeVpXUmRJQzBnY0hKbFpHbGpZWFJsSUdaMWJtTjBhVzl1WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUd4cGMzUkVaWE5qWlc1a1lXNTBJRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXNJSEJ5WldRcElIdGNibHgwWEhSY2RIWmhjaUJrWlhOalpXNWtaVzUwY3lBOUlGdGRPMXh1WEhSY2RGeDBjSEpsWkNBOUlIQnlaV1FnZkh3Z1puVnVZeTV2YXp0Y2JseHVYSFJjZEZ4MEx5OGdjM1JoY25RZ1JFWlRLR1JsY0hSb0lHWnBjbk4wSUhObFlYSmphQ2tnZDJsMGFDQnViMlJsWEc1Y2RGeDBYSFFvWm5WdVkzUnBiMjRnWm01WFlXeHJLR04xY25KbGJuUXBJSHRjYmx4MFhIUmNkRngwYVdZZ0tHNXZaR1VnSVQwOUlHTjFjbkpsYm5RZ0ppWWdjSEpsWkNoamRYSnlaVzUwS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkR1JsYzJObGJtUmxiblJ6TG5CMWMyZ29ZM1Z5Y21WdWRDazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWm05eUlDaDJZWElnYVdSNElEMGdNQ3dnYkdWdUlEMGdZM1Z5Y21WdWRDNWphR2xzWkU1dlpHVnpMbXhsYm1kMGFEc2dhV1I0SUR3Z2JHVnVPeUJwWkhnckt5a2dlMXh1WEhSY2RGeDBYSFJjZEdadVYyRnNheWhqZFhKeVpXNTBMbU5vYVd4a1RtOWtaWE5iYVdSNFhTazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDBwS0c1dlpHVXBPMXh1WEc1Y2RGeDBYSFJ5WlhSMWNtNGdaR1Z6WTJWdVpHVnVkSE03WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhkeVlYQWdibTlrWlNCM2FYUm9JRzVsZHlCMFlXY3VYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUc1dlpHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUhSaFowNWhiV1VnYjJZZ2QzSmhjSEJsY2x4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTA1dlpHVjlJQzBnZDNKaGNIQmxjbHh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUIzY21Gd0lEMGdablZ1WTNScGIyNGdLRzV2WkdVc0lIZHlZWEJ3WlhKT1lXMWxLU0I3WEc1Y2RGeDBYSFIyWVhJZ2NHRnlaVzUwSUQwZ2JtOWtaUzV3WVhKbGJuUk9iMlJsTzF4dVhIUmNkRngwZG1GeUlIZHlZWEJ3WlhJZ1BTQWtLQ2M4SnlBcklIZHlZWEJ3WlhKT1lXMWxJQ3NnSno0bktWc3dYVHRjYmx4dVhIUmNkRngwY0dGeVpXNTBMbWx1YzJWeWRFSmxabTl5WlNoM2NtRndjR1Z5TENCdWIyUmxLVHRjYmx4MFhIUmNkSGR5WVhCd1pYSXVZWEJ3Wlc1a1EyaHBiR1FvYm05a1pTazdYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQjNjbUZ3Y0dWeU8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnBibk5sY25RZ2JtOWtaU0JoWm5SbGNpQndjbVZqWldScGJtZGNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1RtOWtaWDBnYm05a1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1RtOWtaWDBnY0hKbFkyVmthVzVuSUMwZ2NISmxaR2xqWVhSbElHWjFibU4wYVc5dVhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHbHVjMlZ5ZEVGbWRHVnlJRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXNJSEJ5WldObFpHbHVaeWtnZTF4dVhIUmNkRngwZG1GeUlHNWxlSFFnUFNCd2NtVmpaV1JwYm1jdWJtVjRkRk5wWW14cGJtY3NJSEJoY21WdWRDQTlJSEJ5WldObFpHbHVaeTV3WVhKbGJuUk9iMlJsTzF4dVhIUmNkRngwYVdZZ0tHNWxlSFFwSUh0Y2JseDBYSFJjZEZ4MGNHRnlaVzUwTG1sdWMyVnlkRUpsWm05eVpTaHViMlJsTENCdVpYaDBLVHRjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkSEJoY21WdWRDNWhjSEJsYm1SRGFHbHNaQ2h1YjJSbEtUdGNibHgwWEhSY2RIMWNibHgwWEhSY2RISmxkSFZ5YmlCdWIyUmxPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJoY0hCbGJtUWdaV3hsYldWdWRITXVYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUc1dlpHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwTnZiR3hsWTNScGIyNTlJR0ZEYUdsc1pGeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQmhjSEJsYm1SRGFHbHNaRTV2WkdWeklEMGdablZ1WTNScGIyNGdLRzV2WkdVc0lHRkRhR2xzWkNrZ2UxeHVYSFJjZEZ4MEpDNWxZV05vS0dGRGFHbHNaQ3dnWm5WdVkzUnBiMjRnS0dsa2VDd2dZMmhwYkdRcElIdGNibHgwWEhSY2RGeDBibTlrWlM1aGNIQmxibVJEYUdsc1pDaGphR2xzWkNrN1hHNWNkRngwWEhSOUtUdGNibHgwWEhSY2RISmxkSFZ5YmlCdWIyUmxPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ5WlhSMWNtNXpJSGRvWlhSb1pYSWdZbTkxYm1SaGNubFFiMmx1ZENCcGN5QnNaV1owSUdWa1oyVWdiM0lnYm05MExseHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IzVnVaR0Z5ZVZCdmFXNTBmU0J3YjJsdWRGeHVYSFJjZENBcUlFQnlaWFIxY200Z2UwSnZiMnhsWVc1OVhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHbHpUR1ZtZEVWa1oyVlFiMmx1ZENBOUlHWjFibU4wYVc5dUlDaHdiMmx1ZENrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUhCdmFXNTBMbTltWm5ObGRDQTlQVDBnTUR0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVjBkWEp1Y3lCM2FHVjBhR1Z5SUdKdmRXNWtZWEo1VUc5cGJuUWdhWE1nY21sbmFIUWdaV1JuWlNCdmNpQnViM1F1WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMEp2ZFc1a1lYSjVVRzlwYm5SOUlIQnZhVzUwWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3UW05dmJHVmhibjFjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnYVhOU2FXZG9kRVZrWjJWUWIybHVkQ0E5SUdaMWJtTjBhVzl1SUNod2IybHVkQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJSEJ2YVc1MExtOW1abk5sZENBOVBUMGdibTlrWlV4bGJtZDBhQ2h3YjJsdWRDNXViMlJsS1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVjBkWEp1Y3lCM2FHVjBhR1Z5SUdKdmRXNWtZWEo1VUc5cGJuUWdhWE1nWldSblpTQnZjaUJ1YjNRdVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBKdmRXNWtZWEo1VUc5cGJuUjlJSEJ2YVc1MFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1FtOXZiR1ZoYm4xY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2FYTkZaR2RsVUc5cGJuUWdQU0JtZFc1amRHbHZiaUFvY0c5cGJuUXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQnBjMHhsWm5SRlpHZGxVRzlwYm5Rb2NHOXBiblFwSUh4OElHbHpVbWxuYUhSRlpHZGxVRzlwYm5Rb2NHOXBiblFwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCeVpYUjFjbTV6SUhkb1pYUmxjaUJ1YjJSbElHbHpJR3hsWm5RZ1pXUm5aU0J2WmlCaGJtTmxjM1J2Y2lCdmNpQnViM1F1WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWOUlHNXZaR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWOUlHRnVZMlZ6ZEc5eVhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1FtOXZiR1ZoYm4xY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2FYTk1aV1owUldSblpVOW1JRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXNJR0Z1WTJWemRHOXlLU0I3WEc1Y2RGeDBYSFIzYUdsc1pTQW9ibTlrWlNBbUppQnViMlJsSUNFOVBTQmhibU5sYzNSdmNpa2dlMXh1WEhSY2RGeDBYSFJwWmlBb2NHOXphWFJwYjI0b2JtOWtaU2tnSVQwOUlEQXBJSHRjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTRnWm1Gc2MyVTdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwYm05a1pTQTlJRzV2WkdVdWNHRnlaVzUwVG05a1pUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjbVYwZFhKdUlIUnlkV1U3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhKbGRIVnlibk1nZDJobGRHaGxjaUJ1YjJSbElHbHpJSEpwWjJoMElHVmtaMlVnYjJZZ1lXNWpaWE4wYjNJZ2IzSWdibTkwTGx4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbGZTQnViMlJsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbGZTQmhibU5sYzNSdmNseHVYSFJjZENBcUlFQnlaWFIxY200Z2UwSnZiMnhsWVc1OVhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHbHpVbWxuYUhSRlpHZGxUMllnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU3dnWVc1alpYTjBiM0lwSUh0Y2JseDBYSFJjZEhkb2FXeGxJQ2h1YjJSbElDWW1JRzV2WkdVZ0lUMDlJR0Z1WTJWemRHOXlLU0I3WEc1Y2RGeDBYSFJjZEdsbUlDaHdiM05wZEdsdmJpaHViMlJsS1NBaFBUMGdibTlrWlV4bGJtZDBhQ2h1YjJSbExuQmhjbVZ1ZEU1dlpHVXBJQzBnTVNrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQm1ZV3h6WlR0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUnViMlJsSUQwZ2JtOWtaUzV3WVhKbGJuUk9iMlJsTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSeVpYUjFjbTRnZEhKMVpUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djbVYwZFhKdWN5QnZabVp6WlhRZ1puSnZiU0J3WVhKbGJuUXVYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUc1dlpHVmNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdjRzl6YVhScGIyNGdQU0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1WEhSY2RGeDBkbUZ5SUc5bVpuTmxkQ0E5SURBN1hHNWNkRngwWEhSM2FHbHNaU0FvS0c1dlpHVWdQU0J1YjJSbExuQnlaWFpwYjNWelUybGliR2x1WnlrcElIdGNibHgwWEhSY2RGeDBiMlptYzJWMElDczlJREU3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ5WlhSMWNtNGdiMlptYzJWME8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdhR0Z6UTJocGJHUnlaVzRnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU2tnZTF4dVhIUmNkRngwY21WMGRYSnVJQ0VoS0c1dlpHVWdKaVlnYm05a1pTNWphR2xzWkU1dlpHVnpJQ1ltSUc1dlpHVXVZMmhwYkdST2IyUmxjeTVzWlc1bmRHZ3BPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ5WlhSMWNtNXpJSEJ5WlhacGIzVnpJR0p2ZFc1a1lYSjVVRzlwYm5SY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UW05MWJtUmhjbmxRYjJsdWRIMGdjRzlwYm5SY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBKdmIyeGxZVzU5SUdselUydHBjRWx1Ym1WeVQyWm1jMlYwWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3UW05MWJtUmhjbmxRYjJsdWRIMWNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdjSEpsZGxCdmFXNTBJRDBnWm5WdVkzUnBiMjRnS0hCdmFXNTBMQ0JwYzFOcmFYQkpibTVsY2s5bVpuTmxkQ2tnZTF4dVhIUmNkRngwZG1GeUlHNXZaR1VzSUc5bVpuTmxkRHRjYmx4dVhIUmNkRngwYVdZZ0tIQnZhVzUwTG05bVpuTmxkQ0E5UFQwZ01Da2dlMXh1WEhSY2RGeDBYSFJwWmlBb2FYTkZaR2wwWVdKc1pTaHdiMmx1ZEM1dWIyUmxLU2tnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCdWRXeHNPMXh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MGJtOWtaU0E5SUhCdmFXNTBMbTV2WkdVdWNHRnlaVzUwVG05a1pUdGNibHgwWEhSY2RGeDBiMlptYzJWMElEMGdjRzl6YVhScGIyNG9jRzlwYm5RdWJtOWtaU2s3WEc1Y2RGeDBYSFI5SUdWc2MyVWdhV1lnS0doaGMwTm9hV3hrY21WdUtIQnZhVzUwTG01dlpHVXBLU0I3WEc1Y2RGeDBYSFJjZEc1dlpHVWdQU0J3YjJsdWRDNXViMlJsTG1Ob2FXeGtUbTlrWlhOYmNHOXBiblF1YjJabWMyVjBJQzBnTVYwN1hHNWNkRngwWEhSY2RHOW1abk5sZENBOUlHNXZaR1ZNWlc1bmRHZ29ibTlrWlNrN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSdWIyUmxJRDBnY0c5cGJuUXVibTlrWlR0Y2JseDBYSFJjZEZ4MGIyWm1jMlYwSUQwZ2FYTlRhMmx3U1c1dVpYSlBabVp6WlhRZ1B5QXdJRG9nY0c5cGJuUXViMlptYzJWMElDMGdNVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwY21WMGRYSnVJSHRjYmx4MFhIUmNkRngwYm05a1pUb2dibTlrWlN4Y2JseDBYSFJjZEZ4MGIyWm1jMlYwT2lCdlptWnpaWFJjYmx4MFhIUmNkSDA3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhKbGRIVnlibk1nYm1WNGRDQmliM1Z1WkdGeWVWQnZhVzUwWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMEp2ZFc1a1lYSjVVRzlwYm5SOUlIQnZhVzUwWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRDYjI5c1pXRnVmU0JwYzFOcmFYQkpibTVsY2s5bVpuTmxkRnh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMEp2ZFc1a1lYSjVVRzlwYm5SOVhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHNWxlSFJRYjJsdWRDQTlJR1oxYm1OMGFXOXVJQ2h3YjJsdWRDd2dhWE5UYTJsd1NXNXVaWEpQWm1aelpYUXBJSHRjYmx4MFhIUmNkSFpoY2lCdWIyUmxMQ0J2Wm1aelpYUTdYRzVjYmx4MFhIUmNkR2xtSUNodWIyUmxUR1Z1WjNSb0tIQnZhVzUwTG01dlpHVXBJRDA5UFNCd2IybHVkQzV2Wm1aelpYUXBJSHRjYmx4MFhIUmNkRngwYVdZZ0tHbHpSV1JwZEdGaWJHVW9jRzlwYm5RdWJtOWtaU2twSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z2JuVnNiRHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RHNXZaR1VnUFNCd2IybHVkQzV1YjJSbExuQmhjbVZ1ZEU1dlpHVTdYRzVjZEZ4MFhIUmNkRzltWm5ObGRDQTlJSEJ2YzJsMGFXOXVLSEJ2YVc1MExtNXZaR1VwSUNzZ01UdGNibHgwWEhSY2RIMGdaV3h6WlNCcFppQW9hR0Z6UTJocGJHUnlaVzRvY0c5cGJuUXVibTlrWlNrcElIdGNibHgwWEhSY2RGeDBibTlrWlNBOUlIQnZhVzUwTG01dlpHVXVZMmhwYkdST2IyUmxjMXR3YjJsdWRDNXZabVp6WlhSZE8xeHVYSFJjZEZ4MFhIUnZabVp6WlhRZ1BTQXdPMXh1WEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBibTlrWlNBOUlIQnZhVzUwTG01dlpHVTdYRzVjZEZ4MFhIUmNkRzltWm5ObGRDQTlJR2x6VTJ0cGNFbHVibVZ5VDJabWMyVjBJRDhnYm05a1pVeGxibWQwYUNod2IybHVkQzV1YjJSbEtTQTZJSEJ2YVc1MExtOW1abk5sZENBcklERTdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQjdYRzVjZEZ4MFhIUmNkRzV2WkdVNklHNXZaR1VzWEc1Y2RGeDBYSFJjZEc5bVpuTmxkRG9nYjJabWMyVjBYRzVjZEZ4MFhIUjlPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ5WlhSMWNtNXpJSGRvWlhSb1pYSWdjRzlwYm5SQklHRnVaQ0J3YjJsdWRFSWdhWE1nYzJGdFpTQnZjaUJ1YjNRdVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBKdmRXNWtZWEo1VUc5cGJuUjlJSEJ2YVc1MFFWeHVYSFJjZENBcUlFQndZWEpoYlNCN1FtOTFibVJoY25sUWIybHVkSDBnY0c5cGJuUkNYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdRbTl2YkdWaGJuMWNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdhWE5UWVcxbFVHOXBiblFnUFNCbWRXNWpkR2x2YmlBb2NHOXBiblJCTENCd2IybHVkRUlwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJ3YjJsdWRFRXVibTlrWlNBOVBUMGdjRzlwYm5SQ0xtNXZaR1VnSmlZZ2NHOXBiblJCTG05bVpuTmxkQ0E5UFQwZ2NHOXBiblJDTG05bVpuTmxkRHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nY21WMGRYSnVjeUIzYUdWMGFHVnlJSEJ2YVc1MElHbHpJSFpwYzJsaWJHVWdLR05oYmlCelpYUWdZM1Z5YzI5eUtTQnZjaUJ1YjNRdVhHNWNkRngwSUNvZ1hHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IzVnVaR0Z5ZVZCdmFXNTBmU0J3YjJsdWRGeHVYSFJjZENBcUlFQnlaWFIxY200Z2UwSnZiMnhsWVc1OVhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHbHpWbWx6YVdKc1pWQnZhVzUwSUQwZ1puVnVZM1JwYjI0Z0tIQnZhVzUwS1NCN1hHNWNkRngwWEhScFppQW9hWE5VWlhoMEtIQnZhVzUwTG01dlpHVXBJSHg4SUNGb1lYTkRhR2xzWkhKbGJpaHdiMmx1ZEM1dWIyUmxLU0I4ZkNCcGMwVnRjSFI1S0hCdmFXNTBMbTV2WkdVcEtTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjBjblZsTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSMllYSWdiR1ZtZEU1dlpHVWdQU0J3YjJsdWRDNXViMlJsTG1Ob2FXeGtUbTlrWlhOYmNHOXBiblF1YjJabWMyVjBJQzBnTVYwN1hHNWNkRngwWEhSMllYSWdjbWxuYUhST2IyUmxJRDBnY0c5cGJuUXVibTlrWlM1amFHbHNaRTV2WkdWelczQnZhVzUwTG05bVpuTmxkRjA3WEc1Y2RGeDBYSFJwWmlBb0tDRnNaV1owVG05a1pTQjhmQ0JwYzFadmFXUW9iR1ZtZEU1dlpHVXBLU0FtSmlBb0lYSnBaMmgwVG05a1pTQjhmQ0JwYzFadmFXUW9jbWxuYUhST2IyUmxLU2twSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhSeWRXVTdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQm1ZV3h6WlR0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCd2NtVjJVRzlwYm5SVmRHbHNYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwSnZkVzVrWVhKNVVHOXBiblI5SUhCdmFXNTBYRzVjZEZ4MElDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdjSEpsWkZ4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTBKdmRXNWtZWEo1VUc5cGJuUjlYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJSEJ5WlhaUWIybHVkRlZ1ZEdsc0lEMGdablZ1WTNScGIyNGdLSEJ2YVc1MExDQndjbVZrS1NCN1hHNWNkRngwWEhSM2FHbHNaU0FvY0c5cGJuUXBJSHRjYmx4MFhIUmNkRngwYVdZZ0tIQnlaV1FvY0c5cGJuUXBLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUhCdmFXNTBPMXh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MGNHOXBiblFnUFNCd2NtVjJVRzlwYm5Rb2NHOXBiblFwTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSeVpYUjFjbTRnYm5Wc2JEdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnVaWGgwVUc5cGJuUlZiblJwYkZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRDYjNWdVpHRnllVkJ2YVc1MGZTQndiMmx1ZEZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUhCeVpXUmNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdENiM1Z1WkdGeWVWQnZhVzUwZlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCdVpYaDBVRzlwYm5SVmJuUnBiQ0E5SUdaMWJtTjBhVzl1SUNod2IybHVkQ3dnY0hKbFpDa2dlMXh1WEhSY2RGeDBkMmhwYkdVZ0tIQnZhVzUwS1NCN1hHNWNkRngwWEhSY2RHbG1JQ2h3Y21Wa0tIQnZhVzUwS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQndiMmx1ZER0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkSEJ2YVc1MElEMGdibVY0ZEZCdmFXNTBLSEJ2YVc1MEtUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjbVYwZFhKdUlHNTFiR3c3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnZDJGc2ExQnZhVzUwWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMEp2ZFc1a1lYSjVVRzlwYm5SOUlITjBZWEowVUc5cGJuUmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwSnZkVzVrWVhKNVVHOXBiblI5SUdWdVpGQnZhVzUwWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRHZFc1amRHbHZibjBnYUdGdVpHeGxjbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRbTl2YkdWaGJuMGdhWE5UYTJsd1NXNXVaWEpQWm1aelpYUmNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdkMkZzYTFCdmFXNTBJRDBnWm5WdVkzUnBiMjRnS0hOMFlYSjBVRzlwYm5Rc0lHVnVaRkJ2YVc1MExDQm9ZVzVrYkdWeUxDQnBjMU5yYVhCSmJtNWxjazltWm5ObGRDa2dlMXh1WEhSY2RGeDBkbUZ5SUhCdmFXNTBJRDBnYzNSaGNuUlFiMmx1ZER0Y2JseHVYSFJjZEZ4MGQyaHBiR1VnS0hCdmFXNTBLU0I3WEc1Y2RGeDBYSFJjZEdoaGJtUnNaWElvY0c5cGJuUXBPMXh1WEc1Y2RGeDBYSFJjZEdsbUlDaHBjMU5oYldWUWIybHVkQ2h3YjJsdWRDd2daVzVrVUc5cGJuUXBLU0I3WEc1Y2RGeDBYSFJjZEZ4MFluSmxZV3M3WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUjJZWElnYVhOVGEybHdUMlptYzJWMElEMGdhWE5UYTJsd1NXNXVaWEpQWm1aelpYUWdKaVpjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFFnSUNCemRHRnlkRkJ2YVc1MExtNXZaR1VnSVQwOUlIQnZhVzUwTG01dlpHVWdKaVpjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFFnSUNCbGJtUlFiMmx1ZEM1dWIyUmxJQ0U5UFNCd2IybHVkQzV1YjJSbE8xeHVYSFJjZEZ4MFhIUndiMmx1ZENBOUlHNWxlSFJRYjJsdWRDaHdiMmx1ZEN3Z2FYTlRhMmx3VDJabWMyVjBLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0J0WVd0bFQyWm1jMlYwVUdGMGFGeHVYSFJjZENBcVhHNWNkRngwSUNvZ2NtVjBkWEp1SUc5bVpuTmxkRkJoZEdnb1lYSnlZWGtnYjJZZ2IyWm1jMlYwS1NCbWNtOXRJR0Z1WTJWemRHOXlYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUdGdVkyVnpkRzl5SUMwZ1lXNWpaWE4wYjNJZ2JtOWtaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ2JtOWtaVnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJ0WVd0bFQyWm1jMlYwVUdGMGFDQTlJR1oxYm1OMGFXOXVJQ2hoYm1ObGMzUnZjaXdnYm05a1pTa2dlMXh1WEhSY2RGeDBkbUZ5SUdGdVkyVnpkRzl5Y3lBOUlHeHBjM1JCYm1ObGMzUnZjaWh1YjJSbExDQm1kVzVqTG1WeEtHRnVZMlZ6ZEc5eUtTazdYRzVjZEZ4MFhIUnlaWFIxY200Z0pDNXRZWEFvWVc1alpYTjBiM0p6TENCd2IzTnBkR2x2YmlrdWNtVjJaWEp6WlNncE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lHWnliMjFQWm1aelpYUlFZWFJvWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJ5WlhSMWNtNGdaV3hsYldWdWRDQm1jbTl0SUc5bVpuTmxkRkJoZEdnb1lYSnlZWGtnYjJZZ2IyWm1jMlYwS1Z4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbGZTQmhibU5sYzNSdmNpQXRJR0Z1WTJWemRHOXlJRzV2WkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJGeWNtRjVmU0J2Wm1aelpYUnpJQzBnYjJabWMyVjBVR0YwYUZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCbWNtOXRUMlptYzJWMFVHRjBhQ0E5SUdaMWJtTjBhVzl1SUNoaGJtTmxjM1J2Y2l3Z2IyWm1jMlYwY3lrZ2UxeHVYSFJjZEZ4MGRtRnlJR04xY25KbGJuUWdQU0JoYm1ObGMzUnZjanRjYmx4MFhIUmNkR1p2Y2lBb2RtRnlJR2tnUFNBd0xDQnNaVzRnUFNCdlptWnpaWFJ6TG14bGJtZDBhRHNnYVNBOElHeGxianNnYVNzcktTQjdYRzVjZEZ4MFhIUmNkR2xtSUNoamRYSnlaVzUwTG1Ob2FXeGtUbTlrWlhNdWJHVnVaM1JvSUR3OUlHOW1abk5sZEhOYmFWMHBJSHRjYmx4MFhIUmNkRngwWEhSamRYSnlaVzUwSUQwZ1kzVnljbVZ1ZEM1amFHbHNaRTV2WkdWelcyTjFjbkpsYm5RdVkyaHBiR1JPYjJSbGN5NXNaVzVuZEdnZ0xTQXhYVHRjYmx4MFhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwWEhSamRYSnlaVzUwSUQwZ1kzVnljbVZ1ZEM1amFHbHNaRTV2WkdWelcyOW1abk5sZEhOYmFWMWRPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ5WlhSMWNtNGdZM1Z5Y21WdWREdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnpjR3hwZEU1dlpHVmNibHgwWEhRZ0tseHVYSFJjZENBcUlITndiR2wwSUdWc1pXMWxiblFnYjNJZ0kzUmxlSFJjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRbTkxYm1SaGNubFFiMmx1ZEgwZ2NHOXBiblJjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMEp2YjJ4bFlXNTlJRnRwYzFOcmFYQlFZV1JrYVc1blFteGhibXRJVkUxTVhWeHVYSFJjZENBcUlFQnlaWFIxY200Z2UwNXZaR1Y5SUhKcFoyaDBJRzV2WkdVZ2IyWWdZbTkxYm1SaGNubFFiMmx1ZEZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCemNHeHBkRTV2WkdVZ1BTQm1kVzVqZEdsdmJpQW9jRzlwYm5Rc0lHbHpVMnRwY0ZCaFpHUnBibWRDYkdGdWEwaFVUVXdwSUh0Y2JseDBYSFJjZEM4dklITndiR2wwSUNOMFpYaDBYRzVjZEZ4MFhIUnBaaUFvYVhOVVpYaDBLSEJ2YVc1MExtNXZaR1VwS1NCN1hHNWNkRngwWEhSY2RDOHZJR1ZrWjJVZ1kyRnpaVnh1WEhSY2RGeDBYSFJwWmlBb2FYTk1aV1owUldSblpWQnZhVzUwS0hCdmFXNTBLU2tnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCd2IybHVkQzV1YjJSbE8xeHVYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2FXWWdLR2x6VW1sbmFIUkZaR2RsVUc5cGJuUW9jRzlwYm5RcEtTQjdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJSEJ2YVc1MExtNXZaR1V1Ym1WNGRGTnBZbXhwYm1jN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdjRzlwYm5RdWJtOWtaUzV6Y0d4cGRGUmxlSFFvY0c5cGJuUXViMlptYzJWMEtUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeThnYzNCc2FYUWdaV3hsYldWdWRGeHVYSFJjZEZ4MGRtRnlJR05vYVd4a1RtOWtaU0E5SUhCdmFXNTBMbTV2WkdVdVkyaHBiR1JPYjJSbGMxdHdiMmx1ZEM1dlptWnpaWFJkTzF4dVhIUmNkRngwZG1GeUlHTnNiMjVsSUQwZ2FXNXpaWEowUVdaMFpYSW9jRzlwYm5RdWJtOWtaUzVqYkc5dVpVNXZaR1VvWm1Gc2MyVXBMQ0J3YjJsdWRDNXViMlJsS1R0Y2JseDBYSFJjZEdGd2NHVnVaRU5vYVd4a1RtOWtaWE1vWTJ4dmJtVXNJR3hwYzNST1pYaDBLR05vYVd4a1RtOWtaU2twTzF4dVhHNWNkRngwWEhScFppQW9JV2x6VTJ0cGNGQmhaR1JwYm1kQ2JHRnVhMGhVVFV3cElIdGNibHgwWEhSY2RGeDBjR0ZrWkdsdVowSnNZVzVyU0ZSTlRDaHdiMmx1ZEM1dWIyUmxLVHRjYmx4MFhIUmNkRngwY0dGa1pHbHVaMEpzWVc1clNGUk5UQ2hqYkc5dVpTazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQmpiRzl1WlR0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCemNHeHBkRlJ5WldWY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUhOd2JHbDBJSFJ5WldVZ1lua2djRzlwYm5SY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VG05a1pYMGdjbTl2ZENBdElITndiR2wwSUhKdmIzUmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwSnZkVzVrWVhKNVVHOXBiblI5SUhCdmFXNTBYRzVjZEZ4MElDb2dRSEJoY21GdElIdENiMjlzWldGdWZTQmJhWE5UYTJsd1VHRmtaR2x1WjBKc1lXNXJTRlJOVEYxY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0T2IyUmxmU0J5YVdkb2RDQnViMlJsSUc5bUlHSnZkVzVrWVhKNVVHOXBiblJjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnYzNCc2FYUlVjbVZsSUQwZ1puVnVZM1JwYjI0Z0tISnZiM1FzSUhCdmFXNTBMQ0JwYzFOcmFYQlFZV1JrYVc1blFteGhibXRJVkUxTUtTQjdYRzVjZEZ4MFhIUXZMeUJsZUNrZ1d5TjBaWGgwTENBOGMzQmhiajRzSUR4d1BsMWNibHgwWEhSY2RIWmhjaUJoYm1ObGMzUnZjbk1nUFNCc2FYTjBRVzVqWlhOMGIzSW9jRzlwYm5RdWJtOWtaU3dnWm5WdVl5NWxjU2h5YjI5MEtTazdYRzVjYmx4MFhIUmNkR2xtSUNnaFlXNWpaWE4wYjNKekxteGxibWQwYUNrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2JuVnNiRHRjYmx4MFhIUmNkSDBnWld4elpTQnBaaUFvWVc1alpYTjBiM0p6TG14bGJtZDBhQ0E5UFQwZ01Ta2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdjM0JzYVhST2IyUmxLSEJ2YVc1MExDQnBjMU5yYVhCUVlXUmthVzVuUW14aGJtdElWRTFNS1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGNtVjBkWEp1SUdGdVkyVnpkRzl5Y3k1eVpXUjFZMlVvWm5WdVkzUnBiMjRnS0c1dlpHVXNJSEJoY21WdWRDa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ1kyeHZibVVnUFNCcGJuTmxjblJCWm5SbGNpaHdZWEpsYm5RdVkyeHZibVZPYjJSbEtHWmhiSE5sS1N3Z2NHRnlaVzUwS1R0Y2JseHVYSFJjZEZ4MFhIUnBaaUFvYm05a1pTQTlQVDBnY0c5cGJuUXVibTlrWlNrZ2UxeHVYSFJjZEZ4MFhIUmNkRzV2WkdVZ1BTQnpjR3hwZEU1dlpHVW9jRzlwYm5Rc0lHbHpVMnRwY0ZCaFpHUnBibWRDYkdGdWEwaFVUVXdwTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBZWEJ3Wlc1a1EyaHBiR1JPYjJSbGN5aGpiRzl1WlN3Z2JHbHpkRTVsZUhRb2JtOWtaU2twTzF4dVhHNWNkRngwWEhSY2RHbG1JQ2doYVhOVGEybHdVR0ZrWkdsdVowSnNZVzVyU0ZSTlRDa2dlMXh1WEhSY2RGeDBYSFJjZEhCaFpHUnBibWRDYkdGdWEwaFVUVXdvY0dGeVpXNTBLVHRjYmx4MFhIUmNkRngwWEhSd1lXUmthVzVuUW14aGJtdElWRTFNS0dOc2IyNWxLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSeVpYUjFjbTRnWTJ4dmJtVTdYRzVjZEZ4MFhIUjlLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nYzNCc2FYUWdjRzlwYm5SY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VUc5cGJuUjlJSEJ2YVc1MFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IyOXNaV0Z1ZlNCcGMwbHViR2x1WlZ4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTA5aWFtVmpkSDFjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnYzNCc2FYUlFiMmx1ZENBOUlHWjFibU4wYVc5dUlDaHdiMmx1ZEN3Z2FYTkpibXhwYm1VcElIdGNibHgwWEhSY2RDOHZJR1pwYm1RZ2MzQnNhWFJTYjI5MExDQmpiMjUwWVdsdVpYSmNibHgwWEhSY2RDOHZJQ0F0SUdsdWJHbHVaVG9nYzNCc2FYUlNiMjkwSUdseklHRWdZMmhwYkdRZ2IyWWdjR0Z5WVdkeVlYQm9YRzVjZEZ4MFhIUXZMeUFnTFNCaWJHOWphem9nYzNCc2FYUlNiMjkwSUdseklHRWdZMmhwYkdRZ2IyWWdZbTlrZVVOdmJuUmhhVzVsY2x4dVhIUmNkRngwZG1GeUlIQnlaV1FnUFNCcGMwbHViR2x1WlNBL0lHbHpVR0Z5WVNBNklHbHpRbTlrZVVOdmJuUmhhVzVsY2p0Y2JseDBYSFJjZEhaaGNpQmhibU5sYzNSdmNuTWdQU0JzYVhOMFFXNWpaWE4wYjNJb2NHOXBiblF1Ym05a1pTd2djSEpsWkNrN1hHNWNkRngwWEhSMllYSWdkRzl3UVc1alpYTjBiM0lnUFNCc2FYTjBMbXhoYzNRb1lXNWpaWE4wYjNKektTQjhmQ0J3YjJsdWRDNXViMlJsTzF4dVhHNWNkRngwWEhSMllYSWdjM0JzYVhSU2IyOTBMQ0JqYjI1MFlXbHVaWEk3WEc1Y2RGeDBYSFJwWmlBb2NISmxaQ2gwYjNCQmJtTmxjM1J2Y2lrcElIdGNibHgwWEhSY2RGeDBjM0JzYVhSU2IyOTBJRDBnWVc1alpYTjBiM0p6VzJGdVkyVnpkRzl5Y3k1c1pXNW5kR2dnTFNBeVhUdGNibHgwWEhSY2RGeDBZMjl1ZEdGcGJtVnlJRDBnZEc5d1FXNWpaWE4wYjNJN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSemNHeHBkRkp2YjNRZ1BTQjBiM0JCYm1ObGMzUnZjanRjYmx4MFhIUmNkRngwWTI5dWRHRnBibVZ5SUQwZ2MzQnNhWFJTYjI5MExuQmhjbVZ1ZEU1dlpHVTdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQzh2SUhOd2JHbDBJSGRwZEdnZ2MzQnNhWFJVY21WbFhHNWNkRngwWEhSMllYSWdjR2wyYjNRZ1BTQnpjR3hwZEZKdmIzUWdKaVlnYzNCc2FYUlVjbVZsS0hOd2JHbDBVbTl2ZEN3Z2NHOXBiblFzSUdselNXNXNhVzVsS1R0Y2JseHVYSFJjZEZ4MGNtVjBkWEp1SUh0Y2JseDBYSFJjZEZ4MGNtbG5hSFJPYjJSbE9pQndhWFp2ZEN4Y2JseDBYSFJjZEZ4MFkyOXVkR0ZwYm1WeU9pQmpiMjUwWVdsdVpYSmNibHgwWEhSY2RIMDdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUJqY21WaGRHVWdQU0JtZFc1amRHbHZiaUFvYm05a1pVNWhiV1VwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJrYjJOMWJXVnVkQzVqY21WaGRHVkZiR1Z0Wlc1MEtHNXZaR1ZPWVcxbEtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MGRtRnlJR055WldGMFpWUmxlSFFnUFNCbWRXNWpkR2x2YmlBb2RHVjRkQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJR1J2WTNWdFpXNTBMbU55WldGMFpWUmxlSFJPYjJSbEtIUmxlSFFwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUhKbGJXOTJaVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2djbVZ0YjNabElHNXZaR1VzSUNocGMxSmxiVzkyWlVOb2FXeGtPaUJ5WlcxdmRtVWdZMmhwYkdRZ2IzSWdibTkwS1Z4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbGZTQnViMlJsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRDYjI5c1pXRnVmU0JwYzFKbGJXOTJaVU5vYVd4a1hHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlISmxiVzkyWlNBOUlHWjFibU4wYVc5dUlDaHViMlJsTENCcGMxSmxiVzkyWlVOb2FXeGtLU0I3WEc1Y2RGeDBYSFJwWmlBb0lXNXZaR1VnZkh3Z0lXNXZaR1V1Y0dGeVpXNTBUbTlrWlNrZ2V5QnlaWFIxY200N0lIMWNibHgwWEhSY2RHbG1JQ2h1YjJSbExuSmxiVzkyWlU1dlpHVXBJSHNnY21WMGRYSnVJRzV2WkdVdWNtVnRiM1psVG05a1pTaHBjMUpsYlc5MlpVTm9hV3hrS1RzZ2ZWeHVYRzVjZEZ4MFhIUjJZWElnY0dGeVpXNTBJRDBnYm05a1pTNXdZWEpsYm5ST2IyUmxPMXh1WEhSY2RGeDBhV1lnS0NGcGMxSmxiVzkyWlVOb2FXeGtLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQnViMlJsY3lBOUlGdGRPMXh1WEhSY2RGeDBYSFIyWVhJZ2FTd2diR1Z1TzF4dVhIUmNkRngwWEhSbWIzSWdLR2tnUFNBd0xDQnNaVzRnUFNCdWIyUmxMbU5vYVd4a1RtOWtaWE11YkdWdVozUm9PeUJwSUR3Z2JHVnVPeUJwS3lzcElIdGNibHgwWEhSY2RGeDBYSFJ1YjJSbGN5NXdkWE5vS0c1dlpHVXVZMmhwYkdST2IyUmxjMXRwWFNrN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJtYjNJZ0tHa2dQU0F3TENCc1pXNGdQU0J1YjJSbGN5NXNaVzVuZEdnN0lHa2dQQ0JzWlc0N0lHa3JLeWtnZTF4dVhIUmNkRngwWEhSY2RIQmhjbVZ1ZEM1cGJuTmxjblJDWldadmNtVW9ibTlrWlhOYmFWMHNJRzV2WkdVcE8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSEJoY21WdWRDNXlaVzF2ZG1WRGFHbHNaQ2h1YjJSbEtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnlaVzF2ZG1WWGFHbHNaVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCdWIyUmxYRzVjZEZ4MElDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdjSEpsWkZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCeVpXMXZkbVZYYUdsc1pTQTlJR1oxYm1OMGFXOXVJQ2h1YjJSbExDQndjbVZrS1NCN1hHNWNkRngwWEhSM2FHbHNaU0FvYm05a1pTa2dlMXh1WEhSY2RGeDBYSFJwWmlBb2FYTkZaR2wwWVdKc1pTaHViMlJsS1NCOGZDQWhjSEpsWkNodWIyUmxLU2tnZTF4dVhIUmNkRngwWEhSY2RHSnlaV0ZyTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBkbUZ5SUhCaGNtVnVkQ0E5SUc1dlpHVXVjR0Z5Wlc1MFRtOWtaVHRjYmx4MFhIUmNkRngwY21WdGIzWmxLRzV2WkdVcE8xeHVYSFJjZEZ4MFhIUnViMlJsSUQwZ2NHRnlaVzUwTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUhKbGNHeGhZMlZjYmx4MFhIUWdLbHh1WEhSY2RDQXFJSEpsY0d4aFkyVWdibTlrWlNCM2FYUm9JSEJ5YjNacFpHVmtJRzV2WkdWT1lXMWxYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUc1dlpHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ2JtOWtaVTVoYldWY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0T2IyUmxmU0F0SUc1bGR5QnViMlJsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUhKbGNHeGhZMlVnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU3dnYm05a1pVNWhiV1VwSUh0Y2JseDBYSFJjZEdsbUlDaHViMlJsTG01dlpHVk9ZVzFsTG5SdlZYQndaWEpEWVhObEtDa2dQVDA5SUc1dlpHVk9ZVzFsTG5SdlZYQndaWEpEWVhObEtDa3BJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJRzV2WkdVN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RIWmhjaUJ1WlhkT2IyUmxJRDBnWTNKbFlYUmxLRzV2WkdWT1lXMWxLVHRjYmx4dVhIUmNkRngwYVdZZ0tHNXZaR1V1YzNSNWJHVXVZM056VkdWNGRDa2dlMXh1WEhSY2RGeDBYSFJ1WlhkT2IyUmxMbk4wZVd4bExtTnpjMVJsZUhRZ1BTQnViMlJsTG5OMGVXeGxMbU56YzFSbGVIUTdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkR0Z3Y0dWdVpFTm9hV3hrVG05a1pYTW9ibVYzVG05a1pTd2diR2x6ZEM1bWNtOXRLRzV2WkdVdVkyaHBiR1JPYjJSbGN5a3BPMXh1WEhSY2RGeDBhVzV6WlhKMFFXWjBaWElvYm1WM1RtOWtaU3dnYm05a1pTazdYRzVjZEZ4MFhIUnlaVzF2ZG1Vb2JtOWtaU2s3WEc1Y2JseDBYSFJjZEhKbGRIVnliaUJ1WlhkT2IyUmxPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnYVhOVVpYaDBZWEpsWVNBOUlHMWhhMlZRY21Wa1FubE9iMlJsVG1GdFpTZ25WRVZZVkVGU1JVRW5LVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnYUhSdGJGeHVYSFJjZENBcVhHNWNkRngwSUNvZ1oyVjBJSFJvWlNCSVZFMU1JR052Ym5SbGJuUnpJRzltSUc1dlpHVmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa2JtOWtaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRbTl2YkdWaGJuMGdXMmx6VG1WM2JHbHVaVTl1UW14dlkydGRYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR2gwYld3Z1BTQm1kVzVqZEdsdmJpQW9KRzV2WkdVc0lHbHpUbVYzYkdsdVpVOXVRbXh2WTJzcElIdGNibHgwWEhSY2RIWmhjaUJ0WVhKcmRYQWdQU0JwYzFSbGVIUmhjbVZoS0NSdWIyUmxXekJkS1NBL0lDUnViMlJsTG5aaGJDZ3BJRG9nSkc1dlpHVXVhSFJ0YkNncE8xeHVYRzVjZEZ4MFhIUnBaaUFvYVhOT1pYZHNhVzVsVDI1Q2JHOWpheWtnZTF4dVhIUmNkRngwWEhSMllYSWdjbVZuWlhoVVlXY2dQU0F2UENoY1hDOC9LU2hjWEdJb1B5RWhLVnRlUGx4Y2MxMHFLU2d1S2o4cEtGeGNjeXBjWEM4L1Bpa3ZaenRjYmx4MFhIUmNkRngwYldGeWEzVndJRDBnYldGeWEzVndMbkpsY0d4aFkyVW9jbVZuWlhoVVlXY3NJR1oxYm1OMGFXOXVJQ2h0WVhSamFDd2daVzVrVTJ4aGMyZ3NJRzVoYldVcElIdGNibHgwWEhSY2RGeDBYSFJ1WVcxbElEMGdibUZ0WlM1MGIxVndjR1Z5UTJGelpTZ3BPMXh1WEhSY2RGeDBYSFJjZEhaaGNpQnBjMFZ1WkU5bVNXNXNhVzVsUTI5dWRHRnBibVZ5SUQwZ0wxNUVTVlo4WGxSRWZGNVVTSHhlVUh4ZVRFbDhYa2hiTVMwM1hTOHVkR1Z6ZENodVlXMWxLU0FtSmx4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkRngwSUNFaFpXNWtVMnhoYzJnN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUdselFteHZZMnRPYjJSbElEMGdMMTVDVEU5RFMxRlZUMVJGZkY1VVFVSk1SWHhlVkVKUFJGbDhYbFJTZkY1SVVueGVWVXg4WGs5TUx5NTBaWE4wS0c1aGJXVXBPMXh1WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUcxaGRHTm9JQ3NnS0NocGMwVnVaRTltU1c1c2FXNWxRMjl1ZEdGcGJtVnlJSHg4SUdselFteHZZMnRPYjJSbEtTQS9JQ2RjWEc0bklEb2dKeWNwTzF4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RGeDBiV0Z5YTNWd0lEMGdKQzUwY21sdEtHMWhjbXQxY0NrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RISmxkSFZ5YmlCdFlYSnJkWEE3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkSFpoY2lCMllXeDFaU0E5SUdaMWJtTjBhVzl1SUNna2RHVjRkR0Z5WldFc0lITjBjbWx3VEdsdVpXSnlaV0ZyY3lrZ2UxeHVYSFJjZEZ4MGRtRnlJSFpoYkNBOUlDUjBaWGgwWVhKbFlTNTJZV3dvS1R0Y2JseDBYSFJjZEdsbUlDaHpkSEpwY0V4cGJtVmljbVZoYTNNcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlIWmhiQzV5WlhCc1lXTmxLQzliWEZ4dVhGeHlYUzluTENBbkp5azdYRzVjZEZ4MFhIUjlYRzVjZEZ4MFhIUnlaWFIxY200Z2RtRnNPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUnlaWFIxY200Z2UxeHVYSFJjZEZ4MEx5b3FJRUJ3Y205d1pYSjBlU0I3VTNSeWFXNW5mU0JPUWxOUVgwTklRVklnS2k5Y2JseDBYSFJjZEU1Q1UxQmZRMGhCVWpvZ1RrSlRVRjlEU0VGU0xGeHVYSFJjZEZ4MEx5b3FJRUJ3Y205d1pYSjBlU0I3VTNSeWFXNW5mU0JhUlZKUFgxZEpSRlJJWDA1Q1UxQmZRMGhCVWlBcUwxeHVYSFJjZEZ4MFdrVlNUMTlYU1VSVVNGOU9RbE5RWDBOSVFWSTZJRnBGVWs5ZlYwbEVWRWhmVGtKVFVGOURTRUZTTEZ4dVhIUmNkRngwTHlvcUlFQndjbTl3WlhKMGVTQjdVM1J5YVc1bmZTQmliR0Z1YXlBcUwxeHVYSFJjZEZ4MFlteGhibXM2SUdKc1lXNXJTRlJOVEN4Y2JseDBYSFJjZEM4cUtpQkFjSEp2Y0dWeWRIa2dlMU4wY21sdVozMGdaVzF3ZEhsUVlYSmhJQ292WEc1Y2RGeDBYSFJsYlhCMGVWQmhjbUU2SUNjOGNENG5JQ3NnWW14aGJtdElWRTFNSUNzZ0p6d3ZjRDRuTEZ4dVhIUmNkRngwYldGclpWQnlaV1JDZVU1dlpHVk9ZVzFsT2lCdFlXdGxVSEpsWkVKNVRtOWtaVTVoYldVc1hHNWNkRngwWEhScGMwVmthWFJoWW14bE9pQnBjMFZrYVhSaFlteGxMRnh1WEhSY2RGeDBhWE5EYjI1MGNtOXNVMmw2YVc1bk9pQnBjME52Ym5SeWIyeFRhWHBwYm1jc1hHNWNkRngwWEhSaWRXbHNaRXhoZVc5MWRFbHVabTg2SUdKMWFXeGtUR0Y1YjNWMFNXNW1ieXhjYmx4MFhIUmNkRzFoYTJWTVlYbHZkWFJKYm1adk9pQnRZV3RsVEdGNWIzVjBTVzVtYnl4Y2JseDBYSFJjZEdselZHVjRkRG9nYVhOVVpYaDBMRnh1WEhSY2RGeDBhWE5XYjJsa09pQnBjMVp2YVdRc1hHNWNkRngwWEhScGMxQmhjbUU2SUdselVHRnlZU3hjYmx4MFhIUmNkR2x6VUhWeVpWQmhjbUU2SUdselVIVnlaVkJoY21Fc1hHNWNkRngwWEhScGMwbHViR2x1WlRvZ2FYTkpibXhwYm1Vc1hHNWNkRngwWEhScGMwSnZaSGxKYm14cGJtVTZJR2x6UW05a2VVbHViR2x1WlN4Y2JseDBYSFJjZEdselFtOWtlVG9nYVhOQ2IyUjVMRnh1WEhSY2RGeDBhWE5RWVhKaFNXNXNhVzVsT2lCcGMxQmhjbUZKYm14cGJtVXNYRzVjZEZ4MFhIUnBjMHhwYzNRNklHbHpUR2x6ZEN4Y2JseDBYSFJjZEdselZHRmliR1U2SUdselZHRmliR1VzWEc1Y2RGeDBYSFJwYzBObGJHdzZJR2x6UTJWc2JDeGNibHgwWEhSY2RHbHpRbXh2WTJ0eGRXOTBaVG9nYVhOQ2JHOWphM0YxYjNSbExGeHVYSFJjZEZ4MGFYTkNiMlI1UTI5dWRHRnBibVZ5T2lCcGMwSnZaSGxEYjI1MFlXbHVaWElzWEc1Y2RGeDBYSFJwYzBGdVkyaHZjam9nYVhOQmJtTm9iM0lzWEc1Y2RGeDBYSFJwYzBScGRqb2diV0ZyWlZCeVpXUkNlVTV2WkdWT1lXMWxLQ2RFU1ZZbktTeGNibHgwWEhSY2RHbHpUR2s2SUdselRHa3NYRzVjZEZ4MFhIUnBjMEpTT2lCdFlXdGxVSEpsWkVKNVRtOWtaVTVoYldVb0owSlNKeWtzWEc1Y2RGeDBYSFJwYzFOd1lXNDZJRzFoYTJWUWNtVmtRbmxPYjJSbFRtRnRaU2duVTFCQlRpY3BMRnh1WEhSY2RGeDBhWE5DT2lCdFlXdGxVSEpsWkVKNVRtOWtaVTVoYldVb0owSW5LU3hjYmx4MFhIUmNkR2x6VlRvZ2JXRnJaVkJ5WldSQ2VVNXZaR1ZPWVcxbEtDZFZKeWtzWEc1Y2RGeDBYSFJwYzFNNklHMWhhMlZRY21Wa1FubE9iMlJsVG1GdFpTZ25VeWNwTEZ4dVhIUmNkRngwYVhOSk9pQnRZV3RsVUhKbFpFSjVUbTlrWlU1aGJXVW9KMGtuS1N4Y2JseDBYSFJjZEdselNXMW5PaUJ0WVd0bFVISmxaRUo1VG05a1pVNWhiV1VvSjBsTlJ5Y3BMRnh1WEhSY2RGeDBhWE5VWlhoMFlYSmxZVG9nYVhOVVpYaDBZWEpsWVN4Y2JseDBYSFJjZEdselJXMXdkSGs2SUdselJXMXdkSGtzWEc1Y2RGeDBYSFJwYzBWdGNIUjVRVzVqYUc5eU9pQm1kVzVqTG1GdVpDaHBjMEZ1WTJodmNpd2dhWE5GYlhCMGVTa3NYRzVjZEZ4MFhIUnBjME5zYjNObGMzUlRhV0pzYVc1bk9pQnBjME5zYjNObGMzUlRhV0pzYVc1bkxGeHVYSFJjZEZ4MGQybDBhRU5zYjNObGMzUlRhV0pzYVc1bmN6b2dkMmwwYUVOc2IzTmxjM1JUYVdKc2FXNW5jeXhjYmx4MFhIUmNkRzV2WkdWTVpXNW5kR2c2SUc1dlpHVk1aVzVuZEdnc1hHNWNkRngwWEhScGMweGxablJGWkdkbFVHOXBiblE2SUdselRHVm1kRVZrWjJWUWIybHVkQ3hjYmx4MFhIUmNkR2x6VW1sbmFIUkZaR2RsVUc5cGJuUTZJR2x6VW1sbmFIUkZaR2RsVUc5cGJuUXNYRzVjZEZ4MFhIUnBjMFZrWjJWUWIybHVkRG9nYVhORlpHZGxVRzlwYm5Rc1hHNWNkRngwWEhScGMweGxablJGWkdkbFQyWTZJR2x6VEdWbWRFVmtaMlZQWml4Y2JseDBYSFJjZEdselVtbG5hSFJGWkdkbFQyWTZJR2x6VW1sbmFIUkZaR2RsVDJZc1hHNWNkRngwWEhSd2NtVjJVRzlwYm5RNklIQnlaWFpRYjJsdWRDeGNibHgwWEhSY2RHNWxlSFJRYjJsdWREb2dibVY0ZEZCdmFXNTBMRnh1WEhSY2RGeDBhWE5UWVcxbFVHOXBiblE2SUdselUyRnRaVkJ2YVc1MExGeHVYSFJjZEZ4MGFYTldhWE5wWW14bFVHOXBiblE2SUdselZtbHphV0pzWlZCdmFXNTBMRnh1WEhSY2RGeDBjSEpsZGxCdmFXNTBWVzUwYVd3NklIQnlaWFpRYjJsdWRGVnVkR2xzTEZ4dVhIUmNkRngwYm1WNGRGQnZhVzUwVlc1MGFXdzZJRzVsZUhSUWIybHVkRlZ1ZEdsc0xGeHVYSFJjZEZ4MGQyRnNhMUJ2YVc1ME9pQjNZV3hyVUc5cGJuUXNYRzVjZEZ4MFhIUmhibU5sYzNSdmNqb2dZVzVqWlhOMGIzSXNYRzVjZEZ4MFhIUnphVzVuYkdWRGFHbHNaRUZ1WTJWemRHOXlPaUJ6YVc1bmJHVkRhR2xzWkVGdVkyVnpkRzl5TEZ4dVhIUmNkRngwYkdsemRFRnVZMlZ6ZEc5eU9pQnNhWE4wUVc1alpYTjBiM0lzWEc1Y2RGeDBYSFJzWVhOMFFXNWpaWE4wYjNJNklHeGhjM1JCYm1ObGMzUnZjaXhjYmx4MFhIUmNkR3hwYzNST1pYaDBPaUJzYVhOMFRtVjRkQ3hjYmx4MFhIUmNkR3hwYzNSUWNtVjJPaUJzYVhOMFVISmxkaXhjYmx4MFhIUmNkR3hwYzNSRVpYTmpaVzVrWVc1ME9pQnNhWE4wUkdWelkyVnVaR0Z1ZEN4Y2JseDBYSFJjZEdOdmJXMXZia0Z1WTJWemRHOXlPaUJqYjIxdGIyNUJibU5sYzNSdmNpeGNibHgwWEhSY2RIZHlZWEE2SUhkeVlYQXNYRzVjZEZ4MFhIUnBibk5sY25SQlpuUmxjam9nYVc1elpYSjBRV1owWlhJc1hHNWNkRngwWEhSaGNIQmxibVJEYUdsc1pFNXZaR1Z6T2lCaGNIQmxibVJEYUdsc1pFNXZaR1Z6TEZ4dVhIUmNkRngwY0c5emFYUnBiMjQ2SUhCdmMybDBhVzl1TEZ4dVhIUmNkRngwYUdGelEyaHBiR1J5Wlc0NklHaGhjME5vYVd4a2NtVnVMRnh1WEhSY2RGeDBiV0ZyWlU5bVpuTmxkRkJoZEdnNklHMWhhMlZQWm1aelpYUlFZWFJvTEZ4dVhIUmNkRngwWm5KdmJVOW1abk5sZEZCaGRHZzZJR1p5YjIxUFptWnpaWFJRWVhSb0xGeHVYSFJjZEZ4MGMzQnNhWFJVY21WbE9pQnpjR3hwZEZSeVpXVXNYRzVjZEZ4MFhIUnpjR3hwZEZCdmFXNTBPaUJ6Y0d4cGRGQnZhVzUwTEZ4dVhIUmNkRngwWTNKbFlYUmxPaUJqY21WaGRHVXNYRzVjZEZ4MFhIUmpjbVZoZEdWVVpYaDBPaUJqY21WaGRHVlVaWGgwTEZ4dVhIUmNkRngwY21WdGIzWmxPaUJ5WlcxdmRtVXNYRzVjZEZ4MFhIUnlaVzF2ZG1WWGFHbHNaVG9nY21WdGIzWmxWMmhwYkdVc1hHNWNkRngwWEhSeVpYQnNZV05sT2lCeVpYQnNZV05sTEZ4dVhIUmNkRngwYUhSdGJEb2dhSFJ0YkN4Y2JseDBYSFJjZEhaaGJIVmxPaUIyWVd4MVpWeHVYSFJjZEgwN1hHNWNkSDBwS0NrN1hHNWNibHh1WEhSMllYSWdjbUZ1WjJVZ1BTQW9ablZ1WTNScGIyNGdLQ2tnZTF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVjBkWEp1SUdKdmRXNWtZWEo1VUc5cGJuUWdabkp2YlNCVVpYaDBVbUZ1WjJVc0lHbHVjM0JwY21Wa0lHSjVJRUZ1WkhrZ1RtRW5jeUJJZFhOcmVWSmhibWRsTG1welhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFSbGVIUlNZVzVuWlgwZ2RHVjRkRkpoYm1kbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IyOXNaV0Z1ZlNCcGMxTjBZWEowWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3UW05MWJtUmhjbmxRYjJsdWRIMWNibHgwWEhRZ0tseHVYSFJjZENBcUlFQnpaV1VnYUhSMGNEb3ZMMjF6Wkc0dWJXbGpjbTl6YjJaMExtTnZiUzlsYmkxMWN5OXNhV0p5WVhKNUwybGxMMjF6TlRNMU9EY3lLSFk5ZG5NdU9EVXBMbUZ6Y0hoY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2RHVjRkRkpoYm1kbFZHOVFiMmx1ZENBOUlHWjFibU4wYVc5dUlDaDBaWGgwVW1GdVoyVXNJR2x6VTNSaGNuUXBJSHRjYmx4MFhIUmNkSFpoY2lCamIyNTBZV2x1WlhJZ1BTQjBaWGgwVW1GdVoyVXVjR0Z5Wlc1MFJXeGxiV1Z1ZENncExDQnZabVp6WlhRN1hHNWNibHgwWEhSY2RIWmhjaUIwWlhOMFpYSWdQU0JrYjJOMWJXVnVkQzVpYjJSNUxtTnlaV0YwWlZSbGVIUlNZVzVuWlNncExDQndjbVYyUTI5dWRHRnBibVZ5TzF4dVhIUmNkRngwZG1GeUlHTm9hV3hrVG05a1pYTWdQU0JzYVhOMExtWnliMjBvWTI5dWRHRnBibVZ5TG1Ob2FXeGtUbTlrWlhNcE8xeHVYSFJjZEZ4MFptOXlJQ2h2Wm1aelpYUWdQU0F3T3lCdlptWnpaWFFnUENCamFHbHNaRTV2WkdWekxteGxibWQwYURzZ2IyWm1jMlYwS3lzcElIdGNibHgwWEhSY2RGeDBhV1lnS0dSdmJTNXBjMVJsZUhRb1kyaHBiR1JPYjJSbGMxdHZabVp6WlhSZEtTa2dlMXh1WEhSY2RGeDBYSFJjZEdOdmJuUnBiblZsTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RIUmxjM1JsY2k1dGIzWmxWRzlGYkdWdFpXNTBWR1Y0ZENoamFHbHNaRTV2WkdWelcyOW1abk5sZEYwcE8xeHVYSFJjZEZ4MFhIUnBaaUFvZEdWemRHVnlMbU52YlhCaGNtVkZibVJRYjJsdWRITW9KMU4wWVhKMFZHOVRkR0Z5ZENjc0lIUmxlSFJTWVc1blpTa2dQajBnTUNrZ2UxeHVYSFJjZEZ4MFhIUmNkR0p5WldGck8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkSEJ5WlhaRGIyNTBZV2x1WlhJZ1BTQmphR2xzWkU1dlpHVnpXMjltWm5ObGRGMDdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkR2xtSUNodlptWnpaWFFnSVQwOUlEQWdKaVlnWkc5dExtbHpWR1Y0ZENoamFHbHNaRTV2WkdWelcyOW1abk5sZENBdElERmRLU2tnZTF4dVhIUmNkRngwWEhSMllYSWdkR1Y0ZEZKaGJtZGxVM1JoY25RZ1BTQmtiMk4xYldWdWRDNWliMlI1TG1OeVpXRjBaVlJsZUhSU1lXNW5aU2dwTENCamRYSlVaWGgwVG05a1pTQTlJRzUxYkd3N1hHNWNkRngwWEhSY2RIUmxlSFJTWVc1blpWTjBZWEowTG0xdmRtVlViMFZzWlcxbGJuUlVaWGgwS0hCeVpYWkRiMjUwWVdsdVpYSWdmSHdnWTI5dWRHRnBibVZ5S1R0Y2JseDBYSFJjZEZ4MGRHVjRkRkpoYm1kbFUzUmhjblF1WTI5c2JHRndjMlVvSVhCeVpYWkRiMjUwWVdsdVpYSXBPMXh1WEhSY2RGeDBYSFJqZFhKVVpYaDBUbTlrWlNBOUlIQnlaWFpEYjI1MFlXbHVaWElnUHlCd2NtVjJRMjl1ZEdGcGJtVnlMbTVsZUhSVGFXSnNhVzVuSURvZ1kyOXVkR0ZwYm1WeUxtWnBjbk4wUTJocGJHUTdYRzVjYmx4MFhIUmNkRngwZG1GeUlIQnZhVzUwVkdWemRHVnlJRDBnZEdWNGRGSmhibWRsTG1SMWNHeHBZMkYwWlNncE8xeHVYSFJjZEZ4MFhIUndiMmx1ZEZSbGMzUmxjaTV6WlhSRmJtUlFiMmx1ZENnblUzUmhjblJVYjFOMFlYSjBKeXdnZEdWNGRGSmhibWRsVTNSaGNuUXBPMXh1WEhSY2RGeDBYSFIyWVhJZ2RHVjRkRU52ZFc1MElEMGdjRzlwYm5SVVpYTjBaWEl1ZEdWNGRDNXlaWEJzWVdObEtDOWJYRnh5WEZ4dVhTOW5MQ0FuSnlrdWJHVnVaM1JvTzF4dVhHNWNkRngwWEhSY2RIZG9hV3hsSUNoMFpYaDBRMjkxYm5RZ1BpQmpkWEpVWlhoMFRtOWtaUzV1YjJSbFZtRnNkV1V1YkdWdVozUm9JQ1ltSUdOMWNsUmxlSFJPYjJSbExtNWxlSFJUYVdKc2FXNW5LU0I3WEc1Y2RGeDBYSFJjZEZ4MGRHVjRkRU52ZFc1MElDMDlJR04xY2xSbGVIUk9iMlJsTG01dlpHVldZV3gxWlM1c1pXNW5kR2c3WEc1Y2RGeDBYSFJjZEZ4MFkzVnlWR1Y0ZEU1dlpHVWdQU0JqZFhKVVpYaDBUbTlrWlM1dVpYaDBVMmxpYkdsdVp6dGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEM4cUlHcHphR2x1ZENCcFoyNXZjbVU2YzNSaGNuUWdLaTljYmx4MFhIUmNkRngwZG1GeUlHUjFiVzE1SUQwZ1kzVnlWR1Y0ZEU1dlpHVXVibTlrWlZaaGJIVmxPeUF2THlCbGJtWnZjbU5sSUVsRklIUnZJSEpsTFhKbFptVnlaVzVqWlNCamRYSlVaWGgwVG05a1pTd2dhR0ZqYTF4dVhIUmNkRngwWEhRdktpQnFjMmhwYm5RZ2FXZHViM0psT21WdVpDQXFMMXh1WEc1Y2RGeDBYSFJjZEdsbUlDaHBjMU4wWVhKMElDWW1JR04xY2xSbGVIUk9iMlJsTG01bGVIUlRhV0pzYVc1bklDWW1JR1J2YlM1cGMxUmxlSFFvWTNWeVZHVjRkRTV2WkdVdWJtVjRkRk5wWW14cGJtY3BJQ1ltWEc1Y2RGeDBYSFJjZEZ4MGRHVjRkRU52ZFc1MElEMDlQU0JqZFhKVVpYaDBUbTlrWlM1dWIyUmxWbUZzZFdVdWJHVnVaM1JvS1NCN1hHNWNkRngwWEhSY2RGeDBkR1Y0ZEVOdmRXNTBJQzA5SUdOMWNsUmxlSFJPYjJSbExtNXZaR1ZXWVd4MVpTNXNaVzVuZEdnN1hHNWNkRngwWEhSY2RGeDBZM1Z5VkdWNGRFNXZaR1VnUFNCamRYSlVaWGgwVG05a1pTNXVaWGgwVTJsaWJHbHVaenRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RHTnZiblJoYVc1bGNpQTlJR04xY2xSbGVIUk9iMlJsTzF4dVhIUmNkRngwWEhSdlptWnpaWFFnUFNCMFpYaDBRMjkxYm5RN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RISmxkSFZ5YmlCN1hHNWNkRngwWEhSY2RHTnZiblE2SUdOdmJuUmhhVzVsY2l4Y2JseDBYSFJjZEZ4MGIyWm1jMlYwT2lCdlptWnpaWFJjYmx4MFhIUmNkSDA3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhKbGRIVnliaUJVWlhoMFVtRnVaMlVnWm5KdmJTQmliM1Z1WkdGeWVTQndiMmx1ZENBb2FXNXpjR2x5WldRZ1lua2daMjl2WjJ4bElHTnNiM04xY21VdGJHbGljbUZ5ZVNsY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBKdmRXNWtZWEo1VUc5cGJuUjlJSEJ2YVc1MFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1ZHVjRkRkpoYm1kbGZWeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQndiMmx1ZEZSdlZHVjRkRkpoYm1kbElEMGdablZ1WTNScGIyNGdLSEJ2YVc1MEtTQjdYRzVjZEZ4MFhIUjJZWElnZEdWNGRGSmhibWRsU1c1bWJ5QTlJR1oxYm1OMGFXOXVJQ2hqYjI1MFlXbHVaWElzSUc5bVpuTmxkQ2tnZTF4dVhIUmNkRngwWEhSMllYSWdibTlrWlN3Z2FYTkRiMnhzWVhCelpWUnZVM1JoY25RN1hHNWNibHgwWEhSY2RGeDBhV1lnS0dSdmJTNXBjMVJsZUhRb1kyOXVkR0ZwYm1WeUtTa2dlMXh1WEhSY2RGeDBYSFJjZEhaaGNpQndjbVYyVkdWNGRFNXZaR1Z6SUQwZ1pHOXRMbXhwYzNSUWNtVjJLR052Ym5SaGFXNWxjaXdnWm5WdVl5NXViM1FvWkc5dExtbHpWR1Y0ZENrcE8xeHVYSFJjZEZ4MFhIUmNkSFpoY2lCd2NtVjJRMjl1ZEdGcGJtVnlJRDBnYkdsemRDNXNZWE4wS0hCeVpYWlVaWGgwVG05a1pYTXBMbkJ5WlhacGIzVnpVMmxpYkdsdVp6dGNibHgwWEhSY2RGeDBYSFJ1YjJSbElEMGdjSEpsZGtOdmJuUmhhVzVsY2lCOGZDQmpiMjUwWVdsdVpYSXVjR0Z5Wlc1MFRtOWtaVHRjYmx4MFhIUmNkRngwWEhSdlptWnpaWFFnS3owZ2JHbHpkQzV6ZFcwb2JHbHpkQzUwWVdsc0tIQnlaWFpVWlhoMFRtOWtaWE1wTENCa2IyMHVibTlrWlV4bGJtZDBhQ2s3WEc1Y2RGeDBYSFJjZEZ4MGFYTkRiMnhzWVhCelpWUnZVM1JoY25RZ1BTQWhjSEpsZGtOdmJuUmhhVzVsY2p0Y2JseDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUnViMlJsSUQwZ1kyOXVkR0ZwYm1WeUxtTm9hV3hrVG05a1pYTmJiMlptYzJWMFhTQjhmQ0JqYjI1MFlXbHVaWEk3WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLR1J2YlM1cGMxUmxlSFFvYm05a1pTa3BJSHRjYmx4MFhIUmNkRngwWEhSY2RISmxkSFZ5YmlCMFpYaDBVbUZ1WjJWSmJtWnZLRzV2WkdVc0lEQXBPMXh1WEhSY2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUmNkRzltWm5ObGRDQTlJREE3WEc1Y2RGeDBYSFJjZEZ4MGFYTkRiMnhzWVhCelpWUnZVM1JoY25RZ1BTQm1ZV3h6WlR0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjdYRzVjZEZ4MFhIUmNkRngwYm05a1pUb2dibTlrWlN4Y2JseDBYSFJjZEZ4MFhIUmpiMnhzWVhCelpWUnZVM1JoY25RNklHbHpRMjlzYkdGd2MyVlViMU4wWVhKMExGeHVYSFJjZEZ4MFhIUmNkRzltWm5ObGREb2diMlptYzJWMFhHNWNkRngwWEhSY2RIMDdYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFIyWVhJZ2RHVjRkRkpoYm1kbElEMGdaRzlqZFcxbGJuUXVZbTlrZVM1amNtVmhkR1ZVWlhoMFVtRnVaMlVvS1R0Y2JseDBYSFJjZEhaaGNpQnBibVp2SUQwZ2RHVjRkRkpoYm1kbFNXNW1ieWh3YjJsdWRDNXViMlJsTENCd2IybHVkQzV2Wm1aelpYUXBPMXh1WEc1Y2RGeDBYSFIwWlhoMFVtRnVaMlV1Ylc5MlpWUnZSV3hsYldWdWRGUmxlSFFvYVc1bWJ5NXViMlJsS1R0Y2JseDBYSFJjZEhSbGVIUlNZVzVuWlM1amIyeHNZWEJ6WlNocGJtWnZMbU52Ykd4aGNITmxWRzlUZEdGeWRDazdYRzVjZEZ4MFhIUjBaWGgwVW1GdVoyVXViVzkyWlZOMFlYSjBLQ2RqYUdGeVlXTjBaWEluTENCcGJtWnZMbTltWm5ObGRDazdYRzVjZEZ4MFhIUnlaWFIxY200Z2RHVjRkRkpoYm1kbE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQlhjbUZ3Y0dWa0lGSmhibWRsWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBWTI5dWMzUnlkV04wYjNKY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA1dlpHVjlJSE5qSUMwZ2MzUmhjblFnWTI5dWRHRnBibVZ5WEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPZFcxaVpYSjlJSE52SUMwZ2MzUmhjblFnYjJabWMyVjBYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCbFl5QXRJR1Z1WkNCamIyNTBZV2x1WlhKY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA1MWJXSmxjbjBnWlc4Z0xTQmxibVFnYjJabWMyVjBYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJRmR5WVhCd1pXUlNZVzVuWlNBOUlHWjFibU4wYVc5dUlDaHpZeXdnYzI4c0lHVmpMQ0JsYnlrZ2UxeHVYSFJjZEZ4MGRHaHBjeTV6WXlBOUlITmpPMXh1WEhSY2RGeDBkR2hwY3k1emJ5QTlJSE52TzF4dVhIUmNkRngwZEdocGN5NWxZeUE5SUdWak8xeHVYSFJjZEZ4MGRHaHBjeTVsYnlBOUlHVnZPMXh1WEc1Y2RGeDBYSFF2THlCdVlYUnBkbVZTWVc1blpUb2daMlYwSUc1aGRHbDJaVkpoYm1kbElHWnliMjBnYzJNc0lITnZMQ0JsWXl3Z1pXOWNibHgwWEhSY2RIWmhjaUJ1WVhScGRtVlNZVzVuWlNBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwYVdZZ0tHRm5aVzUwTG1selZ6TkRVbUZ1WjJWVGRYQndiM0owS1NCN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUhjelkxSmhibWRsSUQwZ1pHOWpkVzFsYm5RdVkzSmxZWFJsVW1GdVoyVW9LVHRjYmx4MFhIUmNkRngwWEhSM00yTlNZVzVuWlM1elpYUlRkR0Z5ZENoell5d2djMjhwTzF4dVhIUmNkRngwWEhSY2RIY3pZMUpoYm1kbExuTmxkRVZ1WkNobFl5d2daVzhwTzF4dVhHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlIY3pZMUpoYm1kbE8xeHVYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmNkSFpoY2lCMFpYaDBVbUZ1WjJVZ1BTQndiMmx1ZEZSdlZHVjRkRkpoYm1kbEtIdGNibHgwWEhSY2RGeDBYSFJjZEc1dlpHVTZJSE5qTEZ4dVhIUmNkRngwWEhSY2RGeDBiMlptYzJWME9pQnpiMXh1WEhSY2RGeDBYSFJjZEgwcE8xeHVYRzVjZEZ4MFhIUmNkRngwZEdWNGRGSmhibWRsTG5ObGRFVnVaRkJ2YVc1MEtDZEZibVJVYjBWdVpDY3NJSEJ2YVc1MFZHOVVaWGgwVW1GdVoyVW9lMXh1WEhSY2RGeDBYSFJjZEZ4MGJtOWtaVG9nWldNc1hHNWNkRngwWEhSY2RGeDBYSFJ2Wm1aelpYUTZJR1Z2WEc1Y2RGeDBYSFJjZEZ4MGZTa3BPMXh1WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUhSbGVIUlNZVzVuWlR0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZUdGNibHh1WEhSY2RGeDBkR2hwY3k1blpYUlFiMmx1ZEhNZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUI3WEc1Y2RGeDBYSFJjZEZ4MGMyTTZJSE5qTEZ4dVhIUmNkRngwWEhSY2RITnZPaUJ6Ynl4Y2JseDBYSFJjZEZ4MFhIUmxZem9nWldNc1hHNWNkRngwWEhSY2RGeDBaVzg2SUdWdlhHNWNkRngwWEhSY2RIMDdYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFIwYUdsekxtZGxkRk4wWVhKMFVHOXBiblFnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjdYRzVjZEZ4MFhIUmNkRngwYm05a1pUb2djMk1zWEc1Y2RGeDBYSFJjZEZ4MGIyWm1jMlYwT2lCemIxeHVYSFJjZEZ4MFhIUjlPMXh1WEhSY2RGeDBmVHRjYmx4dVhIUmNkRngwZEdocGN5NW5aWFJGYm1SUWIybHVkQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlIdGNibHgwWEhSY2RGeDBYSFJ1YjJSbE9pQmxZeXhjYmx4MFhIUmNkRngwWEhSdlptWnpaWFE2SUdWdlhHNWNkRngwWEhSY2RIMDdYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFF2S2lwY2JseDBYSFJjZENBcUlITmxiR1ZqZENCMWNHUmhkR1VnZG1semFXSnNaU0J5WVc1blpWeHVYSFJjZEZ4MElDb3ZYRzVjZEZ4MFhIUjBhR2x6TG5ObGJHVmpkQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBkbUZ5SUc1aGRHbDJaVkp1WnlBOUlHNWhkR2wyWlZKaGJtZGxLQ2s3WEc1Y2RGeDBYSFJjZEdsbUlDaGhaMlZ1ZEM1cGMxY3pRMUpoYm1kbFUzVndjRzl5ZENrZ2UxeHVYSFJjZEZ4MFhIUmNkSFpoY2lCelpXeGxZM1JwYjI0Z1BTQmtiMk4xYldWdWRDNW5aWFJUWld4bFkzUnBiMjRvS1R0Y2JseDBYSFJjZEZ4MFhIUnBaaUFvYzJWc1pXTjBhVzl1TG5KaGJtZGxRMjkxYm5RZ1BpQXdLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUnpaV3hsWTNScGIyNHVjbVZ0YjNabFFXeHNVbUZ1WjJWektDazdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RITmxiR1ZqZEdsdmJpNWhaR1JTWVc1blpTaHVZWFJwZG1WU2JtY3BPMXh1WEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEc1aGRHbDJaVkp1Wnk1elpXeGxZM1FvS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZUdGNibHh1WEhSY2RGeDBMeW9xWEc1Y2RGeDBYSFFnS2lCQWNtVjBkWEp1SUh0WGNtRndjR1ZrVW1GdVoyVjlYRzVjZEZ4MFhIUWdLaTljYmx4MFhIUmNkSFJvYVhNdWJtOXliV0ZzYVhwbElEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhHNWNkRngwWEhSY2RDOHFLbHh1WEhSY2RGeDBYSFFnS2lCQWNHRnlZVzBnZTBKdmRXNWtZWEo1VUc5cGJuUjlJSEJ2YVc1MFhHNWNkRngwWEhSY2RDQXFJRUJ5WlhSMWNtNGdlMEp2ZFc1a1lYSjVVRzlwYm5SOVhHNWNkRngwWEhSY2RDQXFMMXh1WEhSY2RGeDBYSFIyWVhJZ1oyVjBWbWx6YVdKc1pWQnZhVzUwSUQwZ1puVnVZM1JwYjI0Z0tIQnZhVzUwS1NCN1hHNWNkRngwWEhSY2RGeDBhV1lnS0NGa2IyMHVhWE5XYVhOcFlteGxVRzlwYm5Rb2NHOXBiblFwS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJwWmlBb1pHOXRMbWx6VEdWbWRFVmtaMlZRYjJsdWRDaHdiMmx1ZENrcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGNHOXBiblFnUFNCa2IyMHVibVY0ZEZCdmFXNTBWVzUwYVd3b2NHOXBiblFzSUdSdmJTNXBjMVpwYzJsaWJHVlFiMmx1ZENrN1hHNWNkRngwWEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUndiMmx1ZENBOUlHUnZiUzV3Y21WMlVHOXBiblJWYm5ScGJDaHdiMmx1ZEN3Z1pHOXRMbWx6Vm1semFXSnNaVkJ2YVc1MEtUdGNibHgwWEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJSEJ2YVc1ME8xeHVYSFJjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFJjZEhaaGNpQnpkR0Z5ZEZCdmFXNTBJRDBnWjJWMFZtbHphV0pzWlZCdmFXNTBLSFJvYVhNdVoyVjBVM1JoY25SUWIybHVkQ2dwS1R0Y2JseDBYSFJjZEZ4MGRtRnlJR1Z1WkZCdmFXNTBJRDBnWjJWMFZtbHphV0pzWlZCdmFXNTBLSFJvYVhNdVoyVjBSVzVrVUc5cGJuUW9LU2s3WEc1Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUc1bGR5QlhjbUZ3Y0dWa1VtRnVaMlVvWEc1Y2RGeDBYSFJjZENBZ2MzUmhjblJRYjJsdWRDNXViMlJsTEZ4dVhIUmNkRngwWEhRZ0lITjBZWEowVUc5cGJuUXViMlptYzJWMExGeHVYSFJjZEZ4MFhIUWdJR1Z1WkZCdmFXNTBMbTV2WkdVc1hHNWNkRngwWEhSY2RDQWdaVzVrVUc5cGJuUXViMlptYzJWMFhHNWNkRngwWEhSY2RDazdYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFF2S2lwY2JseDBYSFJjZENBcUlISmxkSFZ5Ym5NZ2JXRjBZMmhsWkNCdWIyUmxjeUJ2YmlCeVlXNW5aVnh1WEhSY2RGeDBJQ3BjYmx4MFhIUmNkQ0FxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUZ0d2NtVmtYU0F0SUhCeVpXUnBZMkYwWlNCbWRXNWpkR2x2Ymx4dVhIUmNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUZ0dmNIUnBiMjV6WFZ4dVhIUmNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IyOXNaV0Z1ZlNCYmIzQjBhVzl1Y3k1cGJtTnNkV1JsUVc1alpYTjBiM0pkWEc1Y2RGeDBYSFFnS2lCQWNHRnlZVzBnZTBKdmIyeGxZVzU5SUZ0dmNIUnBiMjV6TG1aMWJHeDVRMjl1ZEdGcGJuTmRYRzVjZEZ4MFhIUWdLaUJBY21WMGRYSnVJSHRPYjJSbFcxMTlYRzVjZEZ4MFhIUWdLaTljYmx4MFhIUmNkSFJvYVhNdWJtOWtaWE1nUFNCbWRXNWpkR2x2YmlBb2NISmxaQ3dnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwWEhSd2NtVmtJRDBnY0hKbFpDQjhmQ0JtZFc1akxtOXJPMXh1WEc1Y2RGeDBYSFJjZEhaaGNpQnBibU5zZFdSbFFXNWpaWE4wYjNJZ1BTQnZjSFJwYjI1eklDWW1JRzl3ZEdsdmJuTXVhVzVqYkhWa1pVRnVZMlZ6ZEc5eU8xeHVYSFJjZEZ4MFhIUjJZWElnWm5Wc2JIbERiMjUwWVdsdWN5QTlJRzl3ZEdsdmJuTWdKaVlnYjNCMGFXOXVjeTVtZFd4c2VVTnZiblJoYVc1ek8xeHVYRzVjZEZ4MFhIUmNkQzh2SUZSUFJFOGdZMjl0Y0dGeVpTQndiMmx1ZEhNZ1lXNWtJSE52Y25SY2JseDBYSFJjZEZ4MGRtRnlJSE4wWVhKMFVHOXBiblFnUFNCMGFHbHpMbWRsZEZOMFlYSjBVRzlwYm5Rb0tUdGNibHgwWEhSY2RGeDBkbUZ5SUdWdVpGQnZhVzUwSUQwZ2RHaHBjeTVuWlhSRmJtUlFiMmx1ZENncE8xeHVYRzVjZEZ4MFhIUmNkSFpoY2lCdWIyUmxjeUE5SUZ0ZE8xeHVYSFJjZEZ4MFhIUjJZWElnYkdWbWRFVmtaMlZPYjJSbGN5QTlJRnRkTzF4dVhHNWNkRngwWEhSY2RHUnZiUzUzWVd4clVHOXBiblFvYzNSaGNuUlFiMmx1ZEN3Z1pXNWtVRzlwYm5Rc0lHWjFibU4wYVc5dUlDaHdiMmx1ZENrZ2UxeHVYSFJjZEZ4MFhIUmNkR2xtSUNoa2IyMHVhWE5GWkdsMFlXSnNaU2h3YjJsdWRDNXViMlJsS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUmNkSFpoY2lCdWIyUmxPMXh1WEhSY2RGeDBYSFJjZEdsbUlDaG1kV3hzZVVOdmJuUmhhVzV6S1NCN1hHNWNkRngwWEhSY2RGeDBYSFJwWmlBb1pHOXRMbWx6VEdWbWRFVmtaMlZRYjJsdWRDaHdiMmx1ZENrcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGJHVm1kRVZrWjJWT2IyUmxjeTV3ZFhOb0tIQnZhVzUwTG01dlpHVXBPMXh1WEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkRngwYVdZZ0tHUnZiUzVwYzFKcFoyaDBSV1JuWlZCdmFXNTBLSEJ2YVc1MEtTQW1KaUJzYVhOMExtTnZiblJoYVc1ektHeGxablJGWkdkbFRtOWtaWE1zSUhCdmFXNTBMbTV2WkdVcEtTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RHNXZaR1VnUFNCd2IybHVkQzV1YjJSbE8xeHVYSFJjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RIMGdaV3h6WlNCcFppQW9hVzVqYkhWa1pVRnVZMlZ6ZEc5eUtTQjdYRzVjZEZ4MFhIUmNkRngwWEhSdWIyUmxJRDBnWkc5dExtRnVZMlZ6ZEc5eUtIQnZhVzUwTG01dlpHVXNJSEJ5WldRcE8xeHVYSFJjZEZ4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkRngwWEhSdWIyUmxJRDBnY0c5cGJuUXVibTlrWlR0Y2JseDBYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwWEhScFppQW9ibTlrWlNBbUppQndjbVZrS0c1dlpHVXBLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUnViMlJsY3k1d2RYTm9LRzV2WkdVcE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlN3Z2RISjFaU2s3WEc1Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUd4cGMzUXVkVzVwY1hWbEtHNXZaR1Z6S1R0Y2JseDBYSFJjZEgwN1hHNWNibHgwWEhSY2RDOHFLbHh1WEhSY2RGeDBJQ29nY21WMGRYSnVjeUJqYjIxdGIyNUJibU5sYzNSdmNpQnZaaUJ5WVc1blpWeHVYSFJjZEZ4MElDb2dRSEpsZEhWeWJpQjdSV3hsYldWdWRIMGdMU0JqYjIxdGIyNUJibU5sYzNSdmNseHVYSFJjZEZ4MElDb3ZYRzVjZEZ4MFhIUjBhR2x6TG1OdmJXMXZia0Z1WTJWemRHOXlJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z1pHOXRMbU52YlcxdmJrRnVZMlZ6ZEc5eUtITmpMQ0JsWXlrN1hHNWNkRngwWEhSOU8xeHVYRzVjZEZ4MFhIUXZLaXBjYmx4MFhIUmNkQ0FxSUhKbGRIVnlibk1nWlhod1lXNWtaV1FnY21GdVoyVWdZbmtnY0hKbFpGeHVYSFJjZEZ4MElDcGNibHgwWEhSY2RDQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJSEJ5WldRZ0xTQndjbVZrYVdOaGRHVWdablZ1WTNScGIyNWNibHgwWEhSY2RDQXFJRUJ5WlhSMWNtNGdlMWR5WVhCd1pXUlNZVzVuWlgxY2JseDBYSFJjZENBcUwxeHVYSFJjZEZ4MGRHaHBjeTVsZUhCaGJtUWdQU0JtZFc1amRHbHZiaUFvY0hKbFpDa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2MzUmhjblJCYm1ObGMzUnZjaUE5SUdSdmJTNWhibU5sYzNSdmNpaHpZeXdnY0hKbFpDazdYRzVjZEZ4MFhIUmNkSFpoY2lCbGJtUkJibU5sYzNSdmNpQTlJR1J2YlM1aGJtTmxjM1J2Y2lobFl5d2djSEpsWkNrN1hHNWNibHgwWEhSY2RGeDBhV1lnS0NGemRHRnlkRUZ1WTJWemRHOXlJQ1ltSUNGbGJtUkJibU5sYzNSdmNpa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUJ1WlhjZ1YzSmhjSEJsWkZKaGJtZGxLSE5qTENCemJ5d2daV01zSUdWdktUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEhaaGNpQmliM1Z1WkdGeWVWQnZhVzUwY3lBOUlIUm9hWE11WjJWMFVHOXBiblJ6S0NrN1hHNWNibHgwWEhSY2RGeDBhV1lnS0hOMFlYSjBRVzVqWlhOMGIzSXBJSHRjYmx4MFhIUmNkRngwWEhSaWIzVnVaR0Z5ZVZCdmFXNTBjeTV6WXlBOUlITjBZWEowUVc1alpYTjBiM0k3WEc1Y2RGeDBYSFJjZEZ4MFltOTFibVJoY25sUWIybHVkSE11YzI4Z1BTQXdPMXh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MGFXWWdLR1Z1WkVGdVkyVnpkRzl5S1NCN1hHNWNkRngwWEhSY2RGeDBZbTkxYm1SaGNubFFiMmx1ZEhNdVpXTWdQU0JsYm1SQmJtTmxjM1J2Y2p0Y2JseDBYSFJjZEZ4MFhIUmliM1Z1WkdGeWVWQnZhVzUwY3k1bGJ5QTlJR1J2YlM1dWIyUmxUR1Z1WjNSb0tHVnVaRUZ1WTJWemRHOXlLVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RISmxkSFZ5YmlCdVpYY2dWM0poY0hCbFpGSmhibWRsS0Z4dVhIUmNkRngwWEhRZ0lHSnZkVzVrWVhKNVVHOXBiblJ6TG5OakxGeHVYSFJjZEZ4MFhIUWdJR0p2ZFc1a1lYSjVVRzlwYm5SekxuTnZMRnh1WEhSY2RGeDBYSFFnSUdKdmRXNWtZWEo1VUc5cGJuUnpMbVZqTEZ4dVhIUmNkRngwWEhRZ0lHSnZkVzVrWVhKNVVHOXBiblJ6TG1WdlhHNWNkRngwWEhSY2RDazdYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFF2S2lwY2JseDBYSFJjZENBcUlFQndZWEpoYlNCN1FtOXZiR1ZoYm4wZ2FYTkRiMnhzWVhCelpWUnZVM1JoY25SY2JseDBYSFJjZENBcUlFQnlaWFIxY200Z2UxZHlZWEJ3WldSU1lXNW5aWDFjYmx4MFhIUmNkQ0FxTDF4dVhIUmNkRngwZEdocGN5NWpiMnhzWVhCelpTQTlJR1oxYm1OMGFXOXVJQ2hwYzBOdmJHeGhjSE5sVkc5VGRHRnlkQ2tnZTF4dVhIUmNkRngwWEhScFppQW9hWE5EYjJ4c1lYQnpaVlJ2VTNSaGNuUXBJSHRjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTRnYm1WM0lGZHlZWEJ3WldSU1lXNW5aU2h6WXl3Z2MyOHNJSE5qTENCemJ5azdYRzVjZEZ4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJRzVsZHlCWGNtRndjR1ZrVW1GdVoyVW9aV01zSUdWdkxDQmxZeXdnWlc4cE8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFF2S2lwY2JseDBYSFJjZENBcUlITndiR2wwVkdWNGRDQnZiaUJ5WVc1blpWeHVYSFJjZEZ4MElDb3ZYRzVjZEZ4MFhIUjBhR2x6TG5Od2JHbDBWR1Y0ZENBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwZG1GeUlHbHpVMkZ0WlVOdmJuUmhhVzVsY2lBOUlITmpJRDA5UFNCbFl6dGNibHgwWEhSY2RGeDBkbUZ5SUdKdmRXNWtZWEo1VUc5cGJuUnpJRDBnZEdocGN5NW5aWFJRYjJsdWRITW9LVHRjYmx4dVhIUmNkRngwWEhScFppQW9aRzl0TG1selZHVjRkQ2hsWXlrZ0ppWWdJV1J2YlM1cGMwVmtaMlZRYjJsdWRDaDBhR2x6TG1kbGRFVnVaRkJ2YVc1MEtDa3BLU0I3WEc1Y2RGeDBYSFJjZEZ4MFpXTXVjM0JzYVhSVVpYaDBLR1Z2S1R0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkR2xtSUNoa2IyMHVhWE5VWlhoMEtITmpLU0FtSmlBaFpHOXRMbWx6UldSblpWQnZhVzUwS0hSb2FYTXVaMlYwVTNSaGNuUlFiMmx1ZENncEtTa2dlMXh1WEhSY2RGeDBYSFJjZEdKdmRXNWtZWEo1VUc5cGJuUnpMbk5qSUQwZ2MyTXVjM0JzYVhSVVpYaDBLSE52S1R0Y2JseDBYSFJjZEZ4MFhIUmliM1Z1WkdGeWVWQnZhVzUwY3k1emJ5QTlJREE3WEc1Y2JseDBYSFJjZEZ4MFhIUnBaaUFvYVhOVFlXMWxRMjl1ZEdGcGJtVnlLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmliM1Z1WkdGeWVWQnZhVzUwY3k1bFl5QTlJR0p2ZFc1a1lYSjVVRzlwYm5SekxuTmpPMXh1WEhSY2RGeDBYSFJjZEZ4MFltOTFibVJoY25sUWIybHVkSE11Wlc4Z1BTQmxieUF0SUhOdk8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RISmxkSFZ5YmlCdVpYY2dWM0poY0hCbFpGSmhibWRsS0Z4dVhIUmNkRngwWEhRZ0lHSnZkVzVrWVhKNVVHOXBiblJ6TG5OakxGeHVYSFJjZEZ4MFhIUWdJR0p2ZFc1a1lYSjVVRzlwYm5SekxuTnZMRnh1WEhSY2RGeDBYSFFnSUdKdmRXNWtZWEo1VUc5cGJuUnpMbVZqTEZ4dVhIUmNkRngwWEhRZ0lHSnZkVzVrWVhKNVVHOXBiblJ6TG1WdlhHNWNkRngwWEhSY2RDazdYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFF2S2lwY2JseDBYSFJjZENBcUlHUmxiR1YwWlNCamIyNTBaVzUwY3lCdmJpQnlZVzVuWlZ4dVhIUmNkRngwSUNvZ1FISmxkSFZ5YmlCN1YzSmhjSEJsWkZKaGJtZGxmVnh1WEhSY2RGeDBJQ292WEc1Y2RGeDBYSFIwYUdsekxtUmxiR1YwWlVOdmJuUmxiblJ6SUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFJwWmlBb2RHaHBjeTVwYzBOdmJHeGhjSE5sWkNncEtTQjdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJSFJvYVhNN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFIyWVhJZ2NtNW5JRDBnZEdocGN5NXpjR3hwZEZSbGVIUW9LVHRjYmx4MFhIUmNkRngwZG1GeUlHNXZaR1Z6SUQwZ2NtNW5MbTV2WkdWektHNTFiR3dzSUh0Y2JseDBYSFJjZEZ4MFhIUm1kV3hzZVVOdmJuUmhhVzV6T2lCMGNuVmxYRzVjZEZ4MFhIUmNkSDBwTzF4dVhHNWNkRngwWEhSY2RDOHZJR1pwYm1RZ2JtVjNJR04xY25OdmNpQndiMmx1ZEZ4dVhIUmNkRngwWEhSMllYSWdjRzlwYm5RZ1BTQmtiMjB1Y0hKbGRsQnZhVzUwVlc1MGFXd29jbTVuTG1kbGRGTjBZWEowVUc5cGJuUW9LU3dnWm5WdVkzUnBiMjRnS0hCdmFXNTBLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUNGc2FYTjBMbU52Ym5SaGFXNXpLRzV2WkdWekxDQndiMmx1ZEM1dWIyUmxLVHRjYmx4MFhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RGeDBkbUZ5SUdWdGNIUjVVR0Z5Wlc1MGN5QTlJRnRkTzF4dVhIUmNkRngwWEhRa0xtVmhZMmdvYm05a1pYTXNJR1oxYm1OMGFXOXVJQ2hwWkhnc0lHNXZaR1VwSUh0Y2JseDBYSFJjZEZ4MFhIUXZMeUJtYVc1a0lHVnRjSFI1SUhCaGNtVnVkSE5jYmx4MFhIUmNkRngwWEhSMllYSWdjR0Z5Wlc1MElEMGdibTlrWlM1d1lYSmxiblJPYjJSbE8xeHVYSFJjZEZ4MFhIUmNkR2xtSUNod2IybHVkQzV1YjJSbElDRTlQU0J3WVhKbGJuUWdKaVlnWkc5dExtNXZaR1ZNWlc1bmRHZ29jR0Z5Wlc1MEtTQTlQVDBnTVNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWlcxd2RIbFFZWEpsYm5SekxuQjFjMmdvY0dGeVpXNTBLVHRjYmx4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBaRzl0TG5KbGJXOTJaU2h1YjJSbExDQm1ZV3h6WlNrN1hHNWNkRngwWEhSY2RIMHBPMXh1WEc1Y2RGeDBYSFJjZEM4dklISmxiVzkyWlNCbGJYQjBlU0J3WVhKbGJuUnpYRzVjZEZ4MFhIUmNkQ1F1WldGamFDaGxiWEIwZVZCaGNtVnVkSE1zSUdaMWJtTjBhVzl1SUNocFpIZ3NJRzV2WkdVcElIdGNibHgwWEhSY2RGeDBYSFJrYjIwdWNtVnRiM1psS0c1dlpHVXNJR1poYkhObEtUdGNibHgwWEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUc1bGR5QlhjbUZ3Y0dWa1VtRnVaMlVvWEc1Y2RGeDBYSFJjZENBZ2NHOXBiblF1Ym05a1pTeGNibHgwWEhSY2RGeDBJQ0J3YjJsdWRDNXZabVp6WlhRc1hHNWNkRngwWEhSY2RDQWdjRzlwYm5RdWJtOWtaU3hjYmx4MFhIUmNkRngwSUNCd2IybHVkQzV2Wm1aelpYUmNibHgwWEhSY2RGeDBLUzV1YjNKdFlXeHBlbVVvS1R0Y2JseDBYSFJjZEgwN1hHNWNibHgwWEhSY2RDOHFLbHh1WEhSY2RGeDBJQ29nYldGclpVbHpUMjQ2SUhKbGRIVnliaUJwYzA5dUtIQnlaV1FwSUdaMWJtTjBhVzl1WEc1Y2RGeDBYSFFnS2k5Y2JseDBYSFJjZEhaaGNpQnRZV3RsU1hOUGJpQTlJR1oxYm1OMGFXOXVJQ2h3Y21Wa0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEZ4MGRtRnlJR0Z1WTJWemRHOXlJRDBnWkc5dExtRnVZMlZ6ZEc5eUtITmpMQ0J3Y21Wa0tUdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdJU0ZoYm1ObGMzUnZjaUFtSmlBb1lXNWpaWE4wYjNJZ1BUMDlJR1J2YlM1aGJtTmxjM1J2Y2lobFl5d2djSEpsWkNrcE8xeHVYSFJjZEZ4MFhIUjlPMXh1WEhSY2RGeDBmVHRjYmx4dVhIUmNkRngwTHk4Z2FYTlBia1ZrYVhSaFlteGxPaUJxZFdSblpTQjNhR1YwYUdWeUlISmhibWRsSUdseklHOXVJR1ZrYVhSaFlteGxJRzl5SUc1dmRGeHVYSFJjZEZ4MGRHaHBjeTVwYzA5dVJXUnBkR0ZpYkdVZ1BTQnRZV3RsU1hOUGJpaGtiMjB1YVhORlpHbDBZV0pzWlNrN1hHNWNkRngwWEhRdkx5QnBjMDl1VEdsemREb2dhblZrWjJVZ2QyaGxkR2hsY2lCeVlXNW5aU0JwY3lCdmJpQnNhWE4wSUc1dlpHVWdiM0lnYm05MFhHNWNkRngwWEhSMGFHbHpMbWx6VDI1TWFYTjBJRDBnYldGclpVbHpUMjRvWkc5dExtbHpUR2x6ZENrN1hHNWNkRngwWEhRdkx5QnBjMDl1UVc1amFHOXlPaUJxZFdSblpTQjNhR1YwYUdWeUlISmhibWRsSUdseklHOXVJR0Z1WTJodmNpQnViMlJsSUc5eUlHNXZkRnh1WEhSY2RGeDBkR2hwY3k1cGMwOXVRVzVqYUc5eUlEMGdiV0ZyWlVselQyNG9aRzl0TG1selFXNWphRzl5S1R0Y2JseDBYSFJjZEM4dklHbHpUMjVCYm1Ob2IzSTZJR3AxWkdkbElIZG9aWFJvWlhJZ2NtRnVaMlVnYVhNZ2IyNGdZMlZzYkNCdWIyUmxJRzl5SUc1dmRGeHVYSFJjZEZ4MGRHaHBjeTVwYzA5dVEyVnNiQ0E5SUcxaGEyVkpjMDl1S0dSdmJTNXBjME5sYkd3cE8xeHVYRzVjZEZ4MFhIUXZLaXBjYmx4MFhIUmNkQ0FxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUhCeVpXUmNibHgwWEhSY2RDQXFJRUJ5WlhSMWNtNGdlMEp2YjJ4bFlXNTlYRzVjZEZ4MFhIUWdLaTljYmx4MFhIUmNkSFJvYVhNdWFYTk1aV1owUldSblpVOW1JRDBnWm5WdVkzUnBiMjRnS0hCeVpXUXBJSHRjYmx4MFhIUmNkRngwYVdZZ0tDRmtiMjB1YVhOTVpXWjBSV1JuWlZCdmFXNTBLSFJvYVhNdVoyVjBVM1JoY25SUWIybHVkQ2dwS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQm1ZV3h6WlR0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkSFpoY2lCdWIyUmxJRDBnWkc5dExtRnVZMlZ6ZEc5eUtIUm9hWE11YzJNc0lIQnlaV1FwTzF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYm05a1pTQW1KaUJrYjIwdWFYTk1aV1owUldSblpVOW1LSFJvYVhNdWMyTXNJRzV2WkdVcE8xeHVYSFJjZEZ4MGZUdGNibHh1WEhSY2RGeDBMeW9xWEc1Y2RGeDBYSFFnS2lCeVpYUjFjbTV6SUhkb1pYUm9aWElnY21GdVoyVWdkMkZ6SUdOdmJHeGhjSE5sWkNCdmNpQnViM1JjYmx4MFhIUmNkQ0FxTDF4dVhIUmNkRngwZEdocGN5NXBjME52Ykd4aGNITmxaQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlITmpJRDA5UFNCbFl5QW1KaUJ6YnlBOVBUMGdaVzg3WEc1Y2RGeDBYSFI5TzF4dVhHNWNkRngwWEhRdktpcGNibHgwWEhSY2RDQXFJSGR5WVhBZ2FXNXNhVzVsSUc1dlpHVnpJSGRvYVdOb0lHTm9hV3hrY21WdUlHOW1JR0p2WkhrZ2QybDBhQ0J3WVhKaFozSmhjR2hjYmx4MFhIUmNkQ0FxWEc1Y2RGeDBYSFFnS2lCQWNtVjBkWEp1SUh0WGNtRndjR1ZrVW1GdVoyVjlYRzVjZEZ4MFhIUWdLaTljYmx4MFhIUmNkSFJvYVhNdWQzSmhjRUp2WkhsSmJteHBibVZYYVhSb1VHRnlZU0E5SUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBhV1lnS0dSdmJTNXBjMEp2WkhsRGIyNTBZV2x1WlhJb2MyTXBJQ1ltSUdSdmJTNXBjMFZ0Y0hSNUtITmpLU2tnZTF4dVhIUmNkRngwWEhSY2RITmpMbWx1Ym1WeVNGUk5UQ0E5SUdSdmJTNWxiWEIwZVZCaGNtRTdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJRzVsZHlCWGNtRndjR1ZrVW1GdVoyVW9jMk11Wm1seWMzUkRhR2xzWkN3Z01Dd2djMk11Wm1seWMzUkRhR2xzWkN3Z01DazdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhScFppQW9aRzl0TG1selVHRnlZVWx1YkdsdVpTaHpZeWtnZkh3Z1pHOXRMbWx6VUdGeVlTaHpZeWtwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z2RHaHBjeTV1YjNKdFlXeHBlbVVvS1R0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkQzh2SUdacGJtUWdhVzVzYVc1bElIUnZjQ0JoYm1ObGMzUnZjbHh1WEhSY2RGeDBYSFIyWVhJZ2RHOXdRVzVqWlhOMGIzSTdYRzVjZEZ4MFhIUmNkR2xtSUNoa2IyMHVhWE5KYm14cGJtVW9jMk1wS1NCN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUdGdVkyVnpkRzl5Y3lBOUlHUnZiUzVzYVhOMFFXNWpaWE4wYjNJb2MyTXNJR1oxYm1NdWJtOTBLR1J2YlM1cGMwbHViR2x1WlNrcE8xeHVYSFJjZEZ4MFhIUmNkSFJ2Y0VGdVkyVnpkRzl5SUQwZ2JHbHpkQzVzWVhOMEtHRnVZMlZ6ZEc5eWN5azdYRzVjZEZ4MFhIUmNkRngwYVdZZ0tDRmtiMjB1YVhOSmJteHBibVVvZEc5d1FXNWpaWE4wYjNJcEtTQjdYRzVjZEZ4MFhIUmNkRngwWEhSMGIzQkJibU5sYzNSdmNpQTlJR0Z1WTJWemRHOXljMXRoYm1ObGMzUnZjbk11YkdWdVozUm9JQzBnTWwwZ2ZId2djMk11WTJocGJHUk9iMlJsYzF0emIxMDdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSY2RIUnZjRUZ1WTJWemRHOXlJRDBnYzJNdVkyaHBiR1JPYjJSbGMxdHpieUErSURBZ1B5QnpieUF0SURFZ09pQXdYVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RDOHZJSE5wWW14cGJtZHpJRzV2ZENCcGJpQndZWEpoWjNKaGNHaGNibHgwWEhSY2RGeDBkbUZ5SUdsdWJHbHVaVk5wWW14cGJtZHpJRDBnWkc5dExteHBjM1JRY21WMktIUnZjRUZ1WTJWemRHOXlMQ0JrYjIwdWFYTlFZWEpoU1c1c2FXNWxLUzV5WlhabGNuTmxLQ2s3WEc1Y2RGeDBYSFJjZEdsdWJHbHVaVk5wWW14cGJtZHpJRDBnYVc1c2FXNWxVMmxpYkdsdVozTXVZMjl1WTJGMEtHUnZiUzVzYVhOMFRtVjRkQ2gwYjNCQmJtTmxjM1J2Y2k1dVpYaDBVMmxpYkdsdVp5d2daRzl0TG1selVHRnlZVWx1YkdsdVpTa3BPMXh1WEc1Y2RGeDBYSFJjZEM4dklIZHlZWEFnZDJsMGFDQndZWEpoWjNKaGNHaGNibHgwWEhSY2RGeDBhV1lnS0dsdWJHbHVaVk5wWW14cGJtZHpMbXhsYm1kMGFDa2dlMXh1WEhSY2RGeDBYSFJjZEhaaGNpQndZWEpoSUQwZ1pHOXRMbmR5WVhBb2JHbHpkQzVvWldGa0tHbHViR2x1WlZOcFlteHBibWR6S1N3Z0ozQW5LVHRjYmx4MFhIUmNkRngwWEhSa2IyMHVZWEJ3Wlc1a1EyaHBiR1JPYjJSbGN5aHdZWEpoTENCc2FYTjBMblJoYVd3b2FXNXNhVzVsVTJsaWJHbHVaM01wS1R0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjBhR2x6TG01dmNtMWhiR2w2WlNncE8xeHVYSFJjZEZ4MGZUdGNibHh1WEhSY2RGeDBMeW9xWEc1Y2RGeDBYSFFnS2lCcGJuTmxjblFnYm05a1pTQmhkQ0JqZFhKeVpXNTBJR04xY25OdmNseHVYSFJjZEZ4MElDcGNibHgwWEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ2JtOWtaVnh1WEhSY2RGeDBJQ29nUUhKbGRIVnliaUI3VG05a1pYMWNibHgwWEhSY2RDQXFMMXh1WEhSY2RGeDBkR2hwY3k1cGJuTmxjblJPYjJSbElEMGdablZ1WTNScGIyNGdLRzV2WkdVcElIdGNibHgwWEhSY2RGeDBkbUZ5SUhKdVp5QTlJSFJvYVhNdWQzSmhjRUp2WkhsSmJteHBibVZYYVhSb1VHRnlZU2dwTG1SbGJHVjBaVU52Ym5SbGJuUnpLQ2s3WEc1Y2RGeDBYSFJjZEhaaGNpQnBibVp2SUQwZ1pHOXRMbk53YkdsMFVHOXBiblFvY201bkxtZGxkRk4wWVhKMFVHOXBiblFvS1N3Z1pHOXRMbWx6U1c1c2FXNWxLRzV2WkdVcEtUdGNibHh1WEhSY2RGeDBYSFJwWmlBb2FXNW1ieTV5YVdkb2RFNXZaR1VwSUh0Y2JseDBYSFJjZEZ4MFhIUnBibVp2TG5KcFoyaDBUbTlrWlM1d1lYSmxiblJPYjJSbExtbHVjMlZ5ZEVKbFptOXlaU2h1YjJSbExDQnBibVp2TG5KcFoyaDBUbTlrWlNrN1hHNWNkRngwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RGeDBhVzVtYnk1amIyNTBZV2x1WlhJdVlYQndaVzVrUTJocGJHUW9ibTlrWlNrN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdibTlrWlR0Y2JseDBYSFJjZEgwN1hHNWNibHgwWEhSY2RDOHFLbHh1WEhSY2RGeDBJQ29nY21WMGRYSnVjeUIwWlhoMElHbHVJSEpoYm1kbFhHNWNkRngwWEhRZ0tseHVYSFJjZEZ4MElDb2dRSEpsZEhWeWJpQjdVM1J5YVc1bmZWeHVYSFJjZEZ4MElDb3ZYRzVjZEZ4MFhIUjBhR2x6TG5SdlUzUnlhVzVuSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2JtRjBhWFpsVW01bklEMGdibUYwYVhabFVtRnVaMlVvS1R0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUdGblpXNTBMbWx6VnpORFVtRnVaMlZUZFhCd2IzSjBJRDhnYm1GMGFYWmxVbTVuTG5SdlUzUnlhVzVuS0NrZ09pQnVZWFJwZG1WU2JtY3VkR1Y0ZER0Y2JseDBYSFJjZEgwN1hHNWNibHgwWEhSY2RDOHFLbHh1WEhSY2RGeDBJQ29nWTNKbFlYUmxJRzltWm5ObGRGQmhkR2dnWW05dmEyMWhjbXRjYmx4MFhIUmNkQ0FxWEc1Y2RGeDBYSFFnS2lCQWNHRnlZVzBnZTA1dlpHVjlJR1ZrYVhSaFlteGxYRzVjZEZ4MFhIUWdLaTljYmx4MFhIUmNkSFJvYVhNdVltOXZhMjFoY21zZ1BTQm1kVzVqZEdsdmJpQW9aV1JwZEdGaWJHVXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSHRjYmx4MFhIUmNkRngwWEhSek9pQjdYRzVjZEZ4MFhIUmNkRngwWEhSd1lYUm9PaUJrYjIwdWJXRnJaVTltWm5ObGRGQmhkR2dvWldScGRHRmliR1VzSUhOaktTeGNibHgwWEhSY2RGeDBYSFJjZEc5bVpuTmxkRG9nYzI5Y2JseDBYSFJjZEZ4MFhIUjlMRnh1WEhSY2RGeDBYSFJjZEdVNklIdGNibHgwWEhSY2RGeDBYSFJjZEhCaGRHZzZJR1J2YlM1dFlXdGxUMlptYzJWMFVHRjBhQ2hsWkdsMFlXSnNaU3dnWldNcExGeHVYSFJjZEZ4MFhIUmNkRngwYjJabWMyVjBPaUJsYjF4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBmVHRjYmx4MFhIUmNkSDA3WEc1Y2JseDBYSFJjZEM4cUtseHVYSFJjZEZ4MElDb2dZM0psWVhSbElHOW1abk5sZEZCaGRHZ2dZbTl2YTIxaGNtc2dZbUZ6WlNCdmJpQndZWEpoWjNKaGNHaGNibHgwWEhSY2RDQXFYRzVjZEZ4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWYlhYMGdjR0Z5WVhOY2JseDBYSFJjZENBcUwxeHVYSFJjZEZ4MGRHaHBjeTV3WVhKaFFtOXZhMjFoY21zZ1BTQm1kVzVqZEdsdmJpQW9jR0Z5WVhNcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlIdGNibHgwWEhSY2RGeDBYSFJ6T2lCN1hHNWNkRngwWEhSY2RGeDBYSFJ3WVhSb09pQnNhWE4wTG5SaGFXd29aRzl0TG0xaGEyVlBabVp6WlhSUVlYUm9LR3hwYzNRdWFHVmhaQ2h3WVhKaGN5a3NJSE5qS1Nrc1hHNWNkRngwWEhSY2RGeDBYSFJ2Wm1aelpYUTZJSE52WEc1Y2RGeDBYSFJjZEZ4MGZTeGNibHgwWEhSY2RGeDBYSFJsT2lCN1hHNWNkRngwWEhSY2RGeDBYSFJ3WVhSb09pQnNhWE4wTG5SaGFXd29aRzl0TG0xaGEyVlBabVp6WlhSUVlYUm9LR3hwYzNRdWJHRnpkQ2h3WVhKaGN5a3NJR1ZqS1Nrc1hHNWNkRngwWEhSY2RGeDBYSFJ2Wm1aelpYUTZJR1Z2WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUjlPMXh1WEhSY2RGeDBmVHRjYmx4dVhIUmNkRngwTHlvcVhHNWNkRngwWEhRZ0tpQm5aWFJEYkdsbGJuUlNaV04wYzF4dVhIUmNkRngwSUNvZ1FISmxkSFZ5YmlCN1VtVmpkRnRkZlZ4dVhIUmNkRngwSUNvdlhHNWNkRngwWEhSMGFHbHpMbWRsZEVOc2FXVnVkRkpsWTNSeklEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSMllYSWdibUYwYVhabFVtNW5JRDBnYm1GMGFYWmxVbUZ1WjJVb0tUdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlHNWhkR2wyWlZKdVp5NW5aWFJEYkdsbGJuUlNaV04wY3lncE8xeHVYSFJjZEZ4MGZUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRR05zWVhOeklHTnZjbVV1Y21GdVoyVmNibHgwWEhRZ0tseHVYSFJjZENBcUlFUmhkR0VnYzNSeWRXTjBkWEpsWEc1Y2RGeDBJQ29nSUNvZ1FtOTFibVJoY25sUWIybHVkRG9nWVNCd2IybHVkQ0J2WmlCa2IyMGdkSEpsWlZ4dVhIUmNkQ0FxSUNBcUlFSnZkVzVrWVhKNVVHOXBiblJ6T2lCMGQyOGdZbTkxYm1SaGNubFFiMmx1ZEhNZ1kyOXljbVZ6Y0c5dVpHbHVaeUIwYnlCMGFHVWdjM1JoY25RZ1lXNWtJSFJvWlNCbGJtUWdiMllnZEdobElGSmhibWRsWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJUWldVZ2RHOGdhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZWRkl2UkU5TkxVeGxkbVZzTFRJdFZISmhkbVZ5YzJGc0xWSmhibWRsTDNKaGJtZGxjeTVvZEcxc0kweGxkbVZzTFRJdFVtRnVaMlV0VUc5emFYUnBiMjVjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ6YVc1bmJHVjBiMjVjYmx4MFhIUWdLaUJBWVd4MFpYSnVZWFJsUTJ4aGMzTk9ZVzFsSUhKaGJtZGxYRzVjZEZ4MElDb3ZYRzVjZEZ4MGNtVjBkWEp1SUh0Y2JseDBYSFJjZEM4cUtseHVYSFJjZEZ4MElDb2dRRzFsZEdodlpGeHVYSFJjZEZ4MElDb2dYRzVjZEZ4MFhIUWdLaUJqY21WaGRHVWdVbUZ1WjJVZ1QySnFaV04wSUVaeWIyMGdZWEpuZFcxbGJuUnpJRzl5SUVKeWIzZHpaWElnVTJWc1pXTjBhVzl1WEc1Y2RGeDBYSFFnS2x4dVhIUmNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J6WXlBdElITjBZWEowSUdOdmJuUmhhVzVsY2x4dVhIUmNkRngwSUNvZ1FIQmhjbUZ0SUh0T2RXMWlaWEo5SUhOdklDMGdjM1JoY25RZ2IyWm1jMlYwWEc1Y2RGeDBYSFFnS2lCQWNHRnlZVzBnZTA1dlpHVjlJR1ZqSUMwZ1pXNWtJR052Ym5SaGFXNWxjbHh1WEhSY2RGeDBJQ29nUUhCaGNtRnRJSHRPZFcxaVpYSjlJR1Z2SUMwZ1pXNWtJRzltWm5ObGRGeHVYSFJjZEZ4MElDb2dRSEpsZEhWeWJpQjdWM0poY0hCbFpGSmhibWRsZlZ4dVhIUmNkRngwSUNvdlhHNWNkRngwWEhSamNtVmhkR1U2SUdaMWJtTjBhVzl1SUNoell5d2djMjhzSUdWakxDQmxieWtnZTF4dVhIUmNkRngwWEhScFppQW9JV0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ3BJSHNnTHk4Z1puSnZiU0JDY205M2MyVnlJRk5sYkdWamRHbHZibHh1WEhSY2RGeDBYSFJjZEdsbUlDaGhaMlZ1ZEM1cGMxY3pRMUpoYm1kbFUzVndjRzl5ZENrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwZG1GeUlITmxiR1ZqZEdsdmJpQTlJR1J2WTNWdFpXNTBMbWRsZEZObGJHVmpkR2x2YmlncE8xeHVYSFJjZEZ4MFhIUmNkRngwYVdZZ0tITmxiR1ZqZEdsdmJpNXlZVzVuWlVOdmRXNTBJRDA5UFNBd0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RISmxkSFZ5YmlCdWRXeHNPMXh1WEhSY2RGeDBYSFJjZEZ4MGZTQmxiSE5sSUdsbUlDaGtiMjB1YVhOQ2IyUjVLSE5sYkdWamRHbHZiaTVoYm1Ob2IzSk9iMlJsS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhRdkx5QkdhWEpsWm05NE9pQnlaWFIxY201eklHVnVkR2x5WlNCaWIyUjVJR0Z6SUhKaGJtZGxJRzl1SUdsdWFYUnBZV3hwZW1GMGFXOXVMaUJYWlNCM2IyNG5kQ0J1WlhabGNpQnVaV1ZrSUdsMExseHVYSFJjZEZ4MFhIUmNkRngwWEhSeVpYUjFjbTRnYm5Wc2JEdGNibHgwWEhSY2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUmNkRngwZG1GeUlHNWhkR2wyWlZKdVp5QTlJSE5sYkdWamRHbHZiaTVuWlhSU1lXNW5aVUYwS0RBcE8xeHVYSFJjZEZ4MFhIUmNkRngwYzJNZ1BTQnVZWFJwZG1WU2JtY3VjM1JoY25SRGIyNTBZV2x1WlhJN1hHNWNkRngwWEhSY2RGeDBYSFJ6YnlBOUlHNWhkR2wyWlZKdVp5NXpkR0Z5ZEU5bVpuTmxkRHRjYmx4MFhIUmNkRngwWEhSY2RHVmpJRDBnYm1GMGFYWmxVbTVuTG1WdVpFTnZiblJoYVc1bGNqdGNibHgwWEhSY2RGeDBYSFJjZEdWdklEMGdibUYwYVhabFVtNW5MbVZ1WkU5bVpuTmxkRHRjYmx4MFhIUmNkRngwWEhSOUlHVnNjMlVnZXlBdkx5QkpSVGc2SUZSbGVIUlNZVzVuWlZ4dVhIUmNkRngwWEhSY2RGeDBkbUZ5SUhSbGVIUlNZVzVuWlNBOUlHUnZZM1Z0Wlc1MExuTmxiR1ZqZEdsdmJpNWpjbVZoZEdWU1lXNW5aU2dwTzF4dVhIUmNkRngwWEhSY2RGeDBkbUZ5SUhSbGVIUlNZVzVuWlVWdVpDQTlJSFJsZUhSU1lXNW5aUzVrZFhCc2FXTmhkR1VvS1R0Y2JseDBYSFJjZEZ4MFhIUmNkSFJsZUhSU1lXNW5aVVZ1WkM1amIyeHNZWEJ6WlNobVlXeHpaU2s3WEc1Y2RGeDBYSFJjZEZ4MFhIUjJZWElnZEdWNGRGSmhibWRsVTNSaGNuUWdQU0IwWlhoMFVtRnVaMlU3WEc1Y2RGeDBYSFJjZEZ4MFhIUjBaWGgwVW1GdVoyVlRkR0Z5ZEM1amIyeHNZWEJ6WlNoMGNuVmxLVHRjYmx4dVhIUmNkRngwWEhSY2RGeDBkbUZ5SUhOMFlYSjBVRzlwYm5RZ1BTQjBaWGgwVW1GdVoyVlViMUJ2YVc1MEtIUmxlSFJTWVc1blpWTjBZWEowTENCMGNuVmxLU3hjYmx4MFhIUmNkRngwWEhSY2RHVnVaRkJ2YVc1MElEMGdkR1Y0ZEZKaGJtZGxWRzlRYjJsdWRDaDBaWGgwVW1GdVoyVkZibVFzSUdaaGJITmxLVHRjYmx4dVhIUmNkRngwWEhSY2RGeDBMeThnYzJGdFpTQjJhWE5wWW14bElIQnZhVzUwSUdOaGMyVTZJSEpoYm1kbElIZGhjeUJqYjJ4c1lYQnpaV1F1WEc1Y2RGeDBYSFJjZEZ4MFhIUnBaaUFvWkc5dExtbHpWR1Y0ZENoemRHRnlkRkJ2YVc1MExtNXZaR1VwSUNZbUlHUnZiUzVwYzB4bFpuUkZaR2RsVUc5cGJuUW9jM1JoY25SUWIybHVkQ2tnSmlaY2JseDBYSFJjZEZ4MFhIUmNkRngwWkc5dExtbHpWR1Y0ZEU1dlpHVW9aVzVrVUc5cGJuUXVibTlrWlNrZ0ppWWdaRzl0TG1selVtbG5hSFJGWkdkbFVHOXBiblFvWlc1a1VHOXBiblFwSUNZbVhHNWNkRngwWEhSY2RGeDBYSFJjZEdWdVpGQnZhVzUwTG01dlpHVXVibVY0ZEZOcFlteHBibWNnUFQwOUlITjBZWEowVUc5cGJuUXVibTlrWlNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSemRHRnlkRkJ2YVc1MElEMGdaVzVrVUc5cGJuUTdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBYSFJjZEhOaklEMGdjM1JoY25SUWIybHVkQzVqYjI1ME8xeHVYSFJjZEZ4MFhIUmNkRngwYzI4Z1BTQnpkR0Z5ZEZCdmFXNTBMbTltWm5ObGREdGNibHgwWEhSY2RGeDBYSFJjZEdWaklEMGdaVzVrVUc5cGJuUXVZMjl1ZER0Y2JseDBYSFJjZEZ4MFhIUmNkR1Z2SUQwZ1pXNWtVRzlwYm5RdWIyWm1jMlYwTzF4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBmU0JsYkhObElHbG1JQ2hoY21kMWJXVnVkSE11YkdWdVozUm9JRDA5UFNBeUtTQjdJQzh2WTI5c2JHRndjMlZrWEc1Y2RGeDBYSFJjZEZ4MFpXTWdQU0J6WXp0Y2JseDBYSFJjZEZ4MFhIUmxieUE5SUhOdk8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnVaWGNnVjNKaGNIQmxaRkpoYm1kbEtITmpMQ0J6Ynl3Z1pXTXNJR1Z2S1R0Y2JseDBYSFJjZEgwc1hHNWNibHgwWEhSY2RDOHFLbHh1WEhSY2RGeDBJQ29nUUcxbGRHaHZaQ0JjYmx4MFhIUmNkQ0FxSUZ4dVhIUmNkRngwSUNvZ1kzSmxZWFJsSUZkeVlYQndaV1JTWVc1blpTQm1jbTl0SUc1dlpHVmNibHgwWEhSY2RDQXFYRzVjZEZ4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWOUlHNXZaR1ZjYmx4MFhIUmNkQ0FxSUVCeVpYUjFjbTRnZTFkeVlYQndaV1JTWVc1blpYMWNibHgwWEhSY2RDQXFMMXh1WEhSY2RGeDBZM0psWVhSbFJuSnZiVTV2WkdVNklHWjFibU4wYVc5dUlDaHViMlJsS1NCN1hHNWNkRngwWEhSY2RIWmhjaUJ6WXlBOUlHNXZaR1U3WEc1Y2RGeDBYSFJjZEhaaGNpQnpieUE5SURBN1hHNWNkRngwWEhSY2RIWmhjaUJsWXlBOUlHNXZaR1U3WEc1Y2RGeDBYSFJjZEhaaGNpQmxieUE5SUdSdmJTNXViMlJsVEdWdVozUm9LR1ZqS1R0Y2JseHVYSFJjZEZ4MFhIUXZMeUJpY205M2MyVnljeUJqWVc0bmRDQjBZWEpuWlhRZ1lTQndhV04wZFhKbElHOXlJSFp2YVdRZ2JtOWtaVnh1WEhSY2RGeDBYSFJwWmlBb1pHOXRMbWx6Vm05cFpDaHpZeWtwSUh0Y2JseDBYSFJjZEZ4MFhIUnpieUE5SUdSdmJTNXNhWE4wVUhKbGRpaHpZeWt1YkdWdVozUm9JQzBnTVR0Y2JseDBYSFJjZEZ4MFhIUnpZeUE5SUhOakxuQmhjbVZ1ZEU1dlpHVTdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwYVdZZ0tHUnZiUzVwYzBKU0tHVmpLU2tnZTF4dVhIUmNkRngwWEhSY2RHVnZJRDBnWkc5dExteHBjM1JRY21WMktHVmpLUzVzWlc1bmRHZ2dMU0F4TzF4dVhIUmNkRngwWEhSY2RHVmpJRDBnWldNdWNHRnlaVzUwVG05a1pUdGNibHgwWEhSY2RGeDBmU0JsYkhObElHbG1JQ2hrYjIwdWFYTldiMmxrS0dWaktTa2dlMXh1WEhSY2RGeDBYSFJjZEdWdklEMGdaRzl0TG14cGMzUlFjbVYyS0dWaktTNXNaVzVuZEdnN1hHNWNkRngwWEhSY2RGeDBaV01nUFNCbFl5NXdZWEpsYm5ST2IyUmxPMXh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhSb2FYTXVZM0psWVhSbEtITmpMQ0J6Ynl3Z1pXTXNJR1Z2S1R0Y2JseDBYSFJjZEgwc1hHNWNibHgwWEhSY2RDOHFLbHh1WEhSY2RGeDBJQ29nUUcxbGRHaHZaQ0JjYmx4MFhIUmNkQ0FxSUZ4dVhIUmNkRngwSUNvZ1kzSmxZWFJsSUZkeVlYQndaV1JTWVc1blpTQm1jbTl0SUdKdmIydHRZWEpyWEc1Y2RGeDBYSFFnS2x4dVhIUmNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0JsWkdsMFlXSnNaVnh1WEhSY2RGeDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJR0p2YjJ0dFlYSnJYRzVjZEZ4MFhIUWdLaUJBY21WMGRYSnVJSHRYY21Gd2NHVmtVbUZ1WjJWOVhHNWNkRngwWEhRZ0tpOWNibHgwWEhSY2RHTnlaV0YwWlVaeWIyMUNiMjlyYldGeWF6b2dablZ1WTNScGIyNGdLR1ZrYVhSaFlteGxMQ0JpYjI5cmJXRnlheWtnZTF4dVhIUmNkRngwWEhSMllYSWdjMk1nUFNCa2IyMHVabkp2YlU5bVpuTmxkRkJoZEdnb1pXUnBkR0ZpYkdVc0lHSnZiMnR0WVhKckxuTXVjR0YwYUNrN1hHNWNkRngwWEhSY2RIWmhjaUJ6YnlBOUlHSnZiMnR0WVhKckxuTXViMlptYzJWME8xeHVYSFJjZEZ4MFhIUjJZWElnWldNZ1BTQmtiMjB1Wm5KdmJVOW1abk5sZEZCaGRHZ29aV1JwZEdGaWJHVXNJR0p2YjJ0dFlYSnJMbVV1Y0dGMGFDazdYRzVjZEZ4MFhIUmNkSFpoY2lCbGJ5QTlJR0p2YjJ0dFlYSnJMbVV1YjJabWMyVjBPMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdibVYzSUZkeVlYQndaV1JTWVc1blpTaHpZeXdnYzI4c0lHVmpMQ0JsYnlrN1hHNWNkRngwWEhSOUxGeHVYRzVjZEZ4MFhIUXZLaXBjYmx4MFhIUmNkQ0FxSUVCdFpYUm9iMlFnWEc1Y2RGeDBYSFFnS2x4dVhIUmNkRngwSUNvZ1kzSmxZWFJsSUZkeVlYQndaV1JTWVc1blpTQm1jbTl0SUhCaGNtRkNiMjlyYldGeWExeHVYSFJjZEZ4MElDcGNibHgwWEhSY2RDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQmliMjlyYldGeWExeHVYSFJjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsVzExOUlIQmhjbUZ6WEc1Y2RGeDBYSFFnS2lCQWNtVjBkWEp1SUh0WGNtRndjR1ZrVW1GdVoyVjlYRzVjZEZ4MFhIUWdLaTljYmx4MFhIUmNkR055WldGMFpVWnliMjFRWVhKaFFtOXZhMjFoY21zNklHWjFibU4wYVc5dUlDaGliMjlyYldGeWF5d2djR0Z5WVhNcElIdGNibHgwWEhSY2RGeDBkbUZ5SUhOdklEMGdZbTl2YTIxaGNtc3VjeTV2Wm1aelpYUTdYRzVjZEZ4MFhIUmNkSFpoY2lCbGJ5QTlJR0p2YjJ0dFlYSnJMbVV1YjJabWMyVjBPMXh1WEhSY2RGeDBYSFIyWVhJZ2MyTWdQU0JrYjIwdVpuSnZiVTltWm5ObGRGQmhkR2dvYkdsemRDNW9aV0ZrS0hCaGNtRnpLU3dnWW05dmEyMWhjbXN1Y3k1d1lYUm9LVHRjYmx4MFhIUmNkRngwZG1GeUlHVmpJRDBnWkc5dExtWnliMjFQWm1aelpYUlFZWFJvS0d4cGMzUXViR0Z6ZENod1lYSmhjeWtzSUdKdmIydHRZWEpyTG1VdWNHRjBhQ2s3WEc1Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUc1bGR5QlhjbUZ3Y0dWa1VtRnVaMlVvYzJNc0lITnZMQ0JsWXl3Z1pXOHBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMDdYRzVjZEgwcEtDazdYRzVjYmx4MEx5b3FYRzVjZENBcUlFQmpiR0Z6Y3lCa1pXWmhkV3gwY3lCY2JseDBJQ29nWEc1Y2RDQXFJRUJ6YVc1bmJHVjBiMjVjYmx4MElDb3ZYRzVjZEhaaGNpQmtaV1poZFd4MGN5QTlJSHRjYmx4MFhIUXZLaW9nUUhCeWIzQmxjblI1SUNvdlhHNWNkRngwZG1WeWMybHZiam9nSnpBdU5pNHpKeXhjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUZ4dVhIUmNkQ0FxSUdadmNpQmxkbVZ1ZENCdmNIUnBiMjV6TENCeVpXWmxjbVZ1WTJVZ2RHOGdSWFpsYm5SSVlXNWtiR1Z5TG1GMGRHRmphRnh1WEhSY2RDQXFJRnh1WEhSY2RDQXFJRUJ3Y205d1pYSjBlU0I3VDJKcVpXTjBmU0J2Y0hScGIyNXpJRnh1WEhSY2RDQXFJRUJ3Y205d1pYSjBlU0I3VTNSeWFXNW5MMDUxYldKbGNuMGdXMjl3ZEdsdmJuTXVkMmxrZEdnOWJuVnNiRjBnYzJWMElHVmthWFJ2Y2lCM2FXUjBhQ0JjYmx4MFhIUWdLaUJBY0hKdmNHVnlkSGtnZTFOMGNtbHVaeTlPZFcxaVpYSjlJRnR2Y0hScGIyNXpMbWhsYVdkb2REMXVkV3hzWFNCelpYUWdaV1JwZEc5eUlHaGxhV2RvZEN3Z1pYZ3BJRE13TUZ4dVhIUmNkQ0FxSUVCd2NtOXdaWEowZVNCN1UzUnlhVzVuTDA1MWJXSmxjbjBnYjNCMGFXOXVjeTV0YVc1SVpXbG5hSFFnYzJWMElHMXBibWx0ZFcwZ2FHVnBaMmgwSUc5bUlHVmthWFJ2Y2x4dVhIUmNkQ0FxSUVCd2NtOXdaWEowZVNCN1UzUnlhVzVuTDA1MWJXSmxjbjBnYjNCMGFXOXVjeTV0WVhoSVpXbG5hSFJjYmx4MFhIUWdLaUJBY0hKdmNHVnlkSGtnZTFOMGNtbHVaeTlPZFcxaVpYSjlJRzl3ZEdsdmJuTXVabTlqZFhNZ1hHNWNkRngwSUNvZ1FIQnliM0JsY25SNUlIdE9kVzFpWlhKOUlHOXdkR2x2Ym5NdWRHRmljMmw2WlNCY2JseDBYSFFnS2lCQWNISnZjR1Z5ZEhrZ2UwSnZiMnhsWVc1OUlHOXdkR2x2Ym5NdWMzUjViR1ZYYVhSb1UzQmhibHh1WEhSY2RDQXFJRUJ3Y205d1pYSjBlU0I3VDJKcVpXTjBmU0J2Y0hScGIyNXpMbU52WkdWdGFYSnliM0pjYmx4MFhIUWdLaUJBY0hKdmNHVnlkSGtnZTA5aWFtVmpkSDBnVzI5d2RHbHZibk11WTI5a1pXMXBjbkp2Y2k1dGIyUmxQU2QwWlhoMEwyaDBiV3duWFZ4dVhIUmNkQ0FxSUVCd2NtOXdaWEowZVNCN1QySnFaV04wZlNCYmIzQjBhVzl1Y3k1amIyUmxiV2x5Y205eUxtaDBiV3hOYjJSbFBYUnlkV1ZkWEc1Y2RGeDBJQ29nUUhCeWIzQmxjblI1SUh0UFltcGxZM1I5SUZ0dmNIUnBiMjV6TG1OdlpHVnRhWEp5YjNJdWJHbHVaVTUxYldKbGNuTTlkSEoxWlYxY2JseDBYSFFnS2lCQWNISnZjR1Z5ZEhrZ2UxTjBjbWx1WjMwZ1cyOXdkR2x2Ym5NdWJHRnVaejFsYmkxVlUxMGdiR0Z1WjNWaFoyVWdKMlZ1TFZWVEp5d2dKMnR2TFV0U0p5d2dMaTR1WEc1Y2RGeDBJQ29nUUhCeWIzQmxjblI1SUh0VGRISnBibWQ5SUZ0dmNIUnBiMjV6TG1ScGNtVmpkR2x2YmoxdWRXeHNYU0IwWlhoMElHUnBjbVZqZEdsdmJpd2daWGdwSUNkeWRHd25YRzVjZEZ4MElDb2dRSEJ5YjNCbGNuUjVJSHRCY25KaGVYMGdXMjl3ZEdsdmJuTXVkRzl2YkdKaGNsMWNibHgwWEhRZ0tpQkFjSEp2Y0dWeWRIa2dlMEp2YjJ4bFlXNTlJRnR2Y0hScGIyNXpMbUZwY2sxdlpHVTlabUZzYzJWZFhHNWNkRngwSUNvZ1FIQnliM0JsY25SNUlIdEJjbkpoZVgwZ1cyOXdkR2x2Ym5NdVlXbHlVRzl3YjNabGNsMWNibHgwWEhRZ0tpQkFjSEp2Y0dWeWRIa2dlMFoxWTI1MGFXOXVmU0JiYjNCMGFXOXVjeTV2YmtsdWFYUmRJR2x1YVhScFlXeHBlbVZjYmx4MFhIUWdLaUJBY0hKdmNHVnlkSGtnZTBaMVkyNTBhVzl1ZlNCYmIzQjBhVzl1Y3k1dmJuTjFZbTFwZEYxY2JseDBYSFFnS2k5Y2JseDBYSFJ2Y0hScGIyNXpPaUI3WEc1Y2RGeDBYSFIzYVdSMGFEb2diblZzYkN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnpaWFFnWldScGRHOXlJSGRwWkhSb1hHNWNkRngwWEhSb1pXbG5hSFE2SUc1MWJHd3NJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJ6WlhRZ1pXUnBkRzl5SUdobGFXZG9kQ3dnWlhncElETXdNRnh1WEc1Y2RGeDBYSFJ0YVc1SVpXbG5hSFE2SUc1MWJHd3NJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnpaWFFnYldsdWFXMTFiU0JvWldsbmFIUWdiMllnWldScGRHOXlYRzVjZEZ4MFhIUnRZWGhJWldsbmFIUTZJRzUxYkd3c0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCelpYUWdiV0Y0YVcxMWJTQm9aV2xuYUhRZ2IyWWdaV1JwZEc5eVhHNWNibHgwWEhSY2RHWnZZM1Z6T2lCbVlXeHpaU3dnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUhObGRDQm1iMk4xY3lCMGJ5QmxaR2wwWVdKc1pTQmhjbVZoSUdGbWRHVnlJR2x1YVhScFlXeHBlbWx1WnlCemRXMXRaWEp1YjNSbFhHNWNibHgwWEhSY2RIUmhZbk5wZW1VNklEUXNJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUhOcGVtVWdiMllnZEdGaUlHVjRLU0F5SUc5eUlEUmNibHgwWEhSY2RITjBlV3hsVjJsMGFGTndZVzQ2SUhSeWRXVXNJQ0FnSUNBZ0lDQWdJQzh2SUhOMGVXeGxJSGRwZEdnZ2MzQmhiaUFvUTJoeWIyMWxJR0Z1WkNCR1JpQnZibXg1S1Z4dVhHNWNkRngwWEhSa2FYTmhZbXhsVEdsdWExUmhjbWRsZERvZ1ptRnNjMlVzSUNBZ0lDQXZMeUJvYVdSbElHeHBibXNnVkdGeVoyVjBJRU5vWldOclltOTRYRzVjZEZ4MFhIUmthWE5oWW14bFJISmhaMEZ1WkVSeWIzQTZJR1poYkhObExDQWdJQ0F2THlCa2FYTmhZbXhsSUdSeVlXY2dZVzVrSUdSeWIzQWdaWFpsYm5SY2JseDBYSFJjZEdScGMyRmliR1ZTWlhOcGVtVkZaR2wwYjNJNklHWmhiSE5sTENBZ0lDOHZJR1JwYzJGaWJHVWdjbVZ6YVhwcGJtY2daV1JwZEc5eVhHNWNibHgwWEhSY2RITm9iM0owWTNWMGN6b2dkSEoxWlN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUdWdVlXSnNaU0JyWlhsaWIyRnlaQ0J6YUc5eWRHTjFkSE5jYmx4dVhIUmNkRngwY0d4aFkyVm9iMnhrWlhJNklHWmhiSE5sTENBZ0lDQWdJQ0FnSUNBZ0x5OGdaVzVoWW14bElIQnNZV05sYUc5c1pHVnlJSFJsZUhSY2JseDBYSFJjZEhCeVpYUjBhV1o1U0hSdGJEb2dkSEoxWlN3Z0lDQWdJQ0FnSUNBZ0lDOHZJR1Z1WVdKc1pTQndjbVYwZEdsbWVXbHVaeUJvZEcxc0lIZG9hV3hsSUhSdloyZHNhVzVuSUdOdlpHVjJhV1YzWEc1Y2JseDBYSFJjZEdsamIyNVFjbVZtYVhnNklDZG1ZU0JtWVMwbkxDQWdJQ0FnSUNBZ0lDOHZJSEJ5WldacGVDQm1iM0lnWTNOeklHbGpiMjRnWTJ4aGMzTmxjMXh1WEc1Y2RGeDBYSFJqYjJSbGJXbHljbTl5T2lCN0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QmpiMlJsYldseWNtOXlJRzl3ZEdsdmJuTmNibHgwWEhSY2RGeDBiVzlrWlRvZ0ozUmxlSFF2YUhSdGJDY3NYRzVjZEZ4MFhIUmNkR2gwYld4TmIyUmxPaUIwY25WbExGeHVYSFJjZEZ4MFhIUnNhVzVsVG5WdFltVnljem9nZEhKMVpWeHVYSFJjZEZ4MGZTeGNibHh1WEhSY2RGeDBMeThnYkdGdVozVmhaMlZjYmx4MFhIUmNkR3hoYm1jNklDZGxiaTFWVXljc0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHeGhibWQxWVdkbElDZGxiaTFWVXljc0lDZHJieTFMVWljc0lDNHVMbHh1WEhSY2RGeDBaR2x5WldOMGFXOXVPaUJ1ZFd4c0xDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2RHVjRkQ0JrYVhKbFkzUnBiMjRzSUdWNEtTQW5jblJzSjF4dVhHNWNkRngwWEhRdkx5QjBiMjlzWW1GeVhHNWNkRngwWEhSMGIyOXNZbUZ5T2lCYlhHNWNkRngwWEhRZ0lGc25jM1I1YkdVbkxDQmJKM04wZVd4bEoxMWRMRnh1WEhSY2RGeDBJQ0JiSjJadmJuUW5MQ0JiSjJKdmJHUW5MQ0FuYVhSaGJHbGpKeXdnSjNWdVpHVnliR2x1WlNjc0lDZGpiR1ZoY2lkZFhTeGNibHgwWEhSY2RDQWdXeWRtYjI1MGJtRnRaU2NzSUZzblptOXVkRzVoYldVblhWMHNYRzVjZEZ4MFhIUWdJRnNuWTI5c2IzSW5MQ0JiSjJOdmJHOXlKMTFkTEZ4dVhIUmNkRngwSUNCYkozQmhjbUVuTENCYkozVnNKeXdnSjI5c0p5d2dKM0JoY21GbmNtRndhQ2RkWFN4Y2JseDBYSFJjZENBZ1d5ZG9aV2xuYUhRbkxDQmJKMmhsYVdkb2RDZGRYU3hjYmx4MFhIUmNkQ0FnV3lkMFlXSnNaU2NzSUZzbmRHRmliR1VuWFYwc1hHNWNkRngwWEhRZ0lGc25hVzV6WlhKMEp5d2dXeWRzYVc1ckp5d2dKM0JwWTNSMWNtVW5MQ0FuYUhJblhWMHNYRzVjZEZ4MFhIUWdJRnNuZG1sbGR5Y3NJRnNuWm5Wc2JITmpjbVZsYmljc0lDZGpiMlJsZG1sbGR5ZGRYU3hjYmx4MFhIUmNkQ0FnV3lkb1pXeHdKeXdnV3lkb1pXeHdKMTFkWEc1Y2RGeDBYSFJkTEZ4dVhHNWNkRngwWEhRdkx5QmhhWElnYlc5a1pUb2dhVzVzYVc1bElHVmthWFJ2Y2x4dVhIUmNkRngwWVdseVRXOWtaVG9nWm1Gc2MyVXNYRzVjZEZ4MFhIUXZMeUJoYVhKUWIzQnZkbVZ5T2lCYlhHNWNkRngwWEhRdkx5QWdJRnNuYzNSNWJHVW5MQ0JiSjNOMGVXeGxKMTFkTEZ4dVhIUmNkRngwTHk4Z0lDQmJKMlp2Ym5RbkxDQmJKMkp2YkdRbkxDQW5hWFJoYkdsakp5d2dKM1Z1WkdWeWJHbHVaU2NzSUNkamJHVmhjaWRkWFN4Y2JseDBYSFJjZEM4dklDQWdXeWRtYjI1MGJtRnRaU2NzSUZzblptOXVkRzVoYldVblhWMHNYRzVjZEZ4MFhIUXZMeUFnSUZzblkyOXNiM0luTENCYkoyTnZiRzl5SjExZExGeHVYSFJjZEZ4MEx5OGdJQ0JiSjNCaGNtRW5MQ0JiSjNWc0p5d2dKMjlzSnl3Z0ozQmhjbUZuY21Gd2FDZGRYU3hjYmx4MFhIUmNkQzh2SUNBZ1d5ZG9aV2xuYUhRbkxDQmJKMmhsYVdkb2RDZGRYU3hjYmx4MFhIUmNkQzh2SUNBZ1d5ZDBZV0pzWlNjc0lGc25kR0ZpYkdVblhWMHNYRzVjZEZ4MFhIUXZMeUFnSUZzbmFXNXpaWEowSnl3Z1d5ZHNhVzVySnl3Z0ozQnBZM1IxY21VblhWMHNYRzVjZEZ4MFhIUXZMeUFnSUZzbmFHVnNjQ2NzSUZzbmFHVnNjQ2RkWFZ4dVhIUmNkRngwTHk4Z1hTeGNibHgwWEhSY2RHRnBjbEJ2Y0c5MlpYSTZJRnRjYmx4MFhIUmNkQ0FnV3lkamIyeHZjaWNzSUZzblkyOXNiM0luWFYwc1hHNWNkRngwWEhRZ0lGc25abTl1ZENjc0lGc25ZbTlzWkNjc0lDZDFibVJsY214cGJtVW5MQ0FuWTJ4bFlYSW5YVjBzWEc1Y2RGeDBYSFFnSUZzbmNHRnlZU2NzSUZzbmRXd25MQ0FuY0dGeVlXZHlZWEJvSjExZExGeHVYSFJjZEZ4MElDQmJKM1JoWW14bEp5d2dXeWQwWVdKc1pTZGRYU3hjYmx4MFhIUmNkQ0FnV3lkcGJuTmxjblFuTENCYkoyeHBibXNuTENBbmNHbGpkSFZ5WlNkZFhWeHVYSFJjZEZ4MFhTeGNibHh1WEhSY2RGeDBMeThnYzNSNWJHVWdkR0ZuWEc1Y2RGeDBYSFJ6ZEhsc1pWUmhaM002SUZzbmNDY3NJQ2RpYkc5amEzRjFiM1JsSnl3Z0ozQnlaU2NzSUNkb01TY3NJQ2RvTWljc0lDZG9NeWNzSUNkb05DY3NJQ2RvTlNjc0lDZG9OaWRkTEZ4dVhHNWNkRngwWEhRdkx5QmtaV1poZFd4MElHWnZiblJPWVcxbFhHNWNkRngwWEhSa1pXWmhkV3gwUm05dWRFNWhiV1U2SUNkSVpXeDJaWFJwWTJFZ1RtVjFaU2NzWEc1Y2JseDBYSFJjZEM4dklHWnZiblJPWVcxbFhHNWNkRngwWEhSbWIyNTBUbUZ0WlhNNklGdGNibHgwWEhSY2RDQWdKMEZ5YVdGc0p5d2dKMEZ5YVdGc0lFSnNZV05ySnl3Z0owTnZiV2xqSUZOaGJuTWdUVk1uTENBblEyOTFjbWxsY2lCT1pYY25MRnh1WEhSY2RGeDBJQ0FuU0dWc2RtVjBhV05oSUU1bGRXVW5MQ0FuU0dWc2RtVjBhV05oSnl3Z0owbHRjR0ZqZENjc0lDZE1kV05wWkdFZ1IzSmhibVJsSnl4Y2JseDBYSFJjZENBZ0oxUmhhRzl0WVNjc0lDZFVhVzFsY3lCT1pYY2dVbTl0WVc0bkxDQW5WbVZ5WkdGdVlTZGNibHgwWEhSY2RGMHNYRzVjZEZ4MFhIUm1iMjUwVG1GdFpYTkpaMjV2Y21WRGFHVmphem9nVzEwc1hHNWNibHgwWEhSY2RDOHZJSEJoYkd4bGRHVWdZMjlzYjNKektHNGdlQ0J1S1Z4dVhIUmNkRngwWTI5c2IzSnpPaUJiWEc1Y2RGeDBYSFFnSUZzbkl6QXdNREF3TUNjc0lDY2pOREkwTWpReUp5d2dKeU0yTXpZek5qTW5MQ0FuSXpsRE9VTTVOQ2NzSUNjalEwVkROa05GSnl3Z0p5TkZSa1ZHUlVZbkxDQW5JMFkzUmpkR055Y3NJQ2NqUmtaR1JrWkdKMTBzWEc1Y2RGeDBYSFFnSUZzbkkwWkdNREF3TUNjc0lDY2pSa1k1UXpBd0p5d2dKeU5HUmtaR01EQW5MQ0FuSXpBd1JrWXdNQ2NzSUNjak1EQkdSa1pHSnl3Z0p5TXdNREF3UmtZbkxDQW5JemxETURCR1JpY3NJQ2NqUmtZd01FWkdKMTBzWEc1Y2RGeDBYSFFnSUZzbkkwWTNRelpEUlNjc0lDY2pSa1pGTjBORkp5d2dKeU5HUmtWR1F6WW5MQ0FuSTBRMlJVWkVOaWNzSUNjalEwVkVSVVUzSnl3Z0p5TkRSVVUzUmpjbkxDQW5JMFEyUkRaRk55Y3NJQ2NqUlRkRU5rUkZKMTBzWEc1Y2RGeDBYSFFnSUZzbkkwVTNPVU01UXljc0lDY2pSa1pETmpsREp5d2dKeU5HUmtVM09VTW5MQ0FuSTBJMVJEWkJOU2NzSUNjalFUVkROa05GSnl3Z0p5TTVRME0yUlVZbkxDQW5JMEkxUVRWRU5pY3NJQ2NqUkRaQk5VSkVKMTBzWEc1Y2RGeDBYSFFnSUZzbkkwVTNOak0yTXljc0lDY2pSamRCUkRaQ0p5d2dKeU5HUmtRMk5qTW5MQ0FuSXprMFFrUTNRaWNzSUNjak56TkJOVUZFSnl3Z0p5TTJRa0ZFUkVVbkxDQW5JemhETjBKRE5pY3NJQ2NqUXpZM1FrRTFKMTBzWEc1Y2RGeDBYSFFnSUZzbkkwTkZNREF3TUNjc0lDY2pSVGM1TkRNNUp5d2dKeU5GUmtNMk16RW5MQ0FuSXpaQ1FUVTBRU2NzSUNjak5FRTNRamhESnl3Z0p5TXpPVGcwUXpZbkxDQW5Jell6TkVGQk5TY3NJQ2NqUVRVMFFUZENKMTBzWEc1Y2RGeDBYSFFnSUZzbkl6bERNREF3TUNjc0lDY2pRalUyTXpBNEp5d2dKeU5DUkRrME1EQW5MQ0FuSXpNNU4wSXlNU2NzSUNjak1UQTBRVFZCSnl3Z0p5TXdPRFV5T1RRbkxDQW5Jek14TVRnM015Y3NJQ2NqTnpNeE9EUXlKMTBzWEc1Y2RGeDBYSFFnSUZzbkl6WXpNREF3TUNjc0lDY2pOMEl6T1RBd0p5d2dKeU00TkRZek1EQW5MQ0FuSXpJNU5USXhPQ2NzSUNjak1EZ3pNVE01Snl3Z0p5TXdNRE14TmpNbkxDQW5Jekl4TVRBMFFTY3NJQ2NqTkVFeE1ETXhKMTFjYmx4MFhIUmNkRjBzWEc1Y2JseDBYSFJjZEM4dklHeHBibVZJWldsbmFIUmNibHgwWEhSY2RHeHBibVZJWldsbmFIUnpPaUJiSnpFdU1DY3NJQ2N4TGpJbkxDQW5NUzQwSnl3Z0p6RXVOU2NzSUNjeExqWW5MQ0FuTVM0NEp5d2dKekl1TUNjc0lDY3pMakFuWFN4Y2JseHVYSFJjZEZ4MEx5OGdhVzV6WlhKMFZHRmliR1VnYldGNElITnBlbVZjYmx4MFhIUmNkR2x1YzJWeWRGUmhZbXhsVFdGNFUybDZaVG9nZTF4dVhIUmNkRngwWEhSamIydzZJREV3TEZ4dVhIUmNkRngwWEhSeWIzYzZJREV3WEc1Y2RGeDBYSFI5TEZ4dVhHNWNkRngwWEhRdkx5QnBiV0ZuWlZ4dVhIUmNkRngwYldGNGFXMTFiVWx0WVdkbFJtbHNaVk5wZW1VNklHNTFiR3dzSUM4dklITnBlbVVnYVc0Z1lubDBaWE1zSUc1MWJHd2dQU0J1YnlCc2FXMXBkRnh1WEc1Y2RGeDBYSFF2THlCallXeHNZbUZqYTNOY2JseDBYSFJjZEc5dWFXNXBkRG9nYm5Wc2JDd2dJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FXNXBkR2xoYkdsNlpWeHVYSFJjZEZ4MGIyNW1iMk4xY3pvZ2JuVnNiQ3dnSUNBZ0lDQWdJQ0FnSUNBdkx5QmxaR2wwWVdKc1pTQm9ZWE1nWm05amRYTmNibHgwWEhSY2RHOXVZbXgxY2pvZ2JuVnNiQ3dnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdaV1JwZEdGaWJHVWdiM1YwSUc5bUlHWnZZM1Z6WEc1Y2RGeDBYSFJ2Ym1WdWRHVnlPaUJ1ZFd4c0xDQWdJQ0FnSUNBZ0lDQWdJQzh2SUdWdWRHVnlJR3RsZVNCd2NtVnpjMlZrWEc1Y2RGeDBYSFJ2Ym10bGVYVndPaUJ1ZFd4c0xDQWdJQ0FnSUNBZ0lDQWdJQzh2SUd0bGVYVndYRzVjZEZ4MFhIUnZibXRsZVdSdmQyNDZJRzUxYkd3c0lDQWdJQ0FnSUNBZ0lDOHZJR3RsZVdSdmQyNWNibHgwWEhSY2RHOXVTVzFoWjJWVmNHeHZZV1E2SUc1MWJHd3NJQ0FnSUNBZ0x5OGdhVzFoWjJWVmNHeHZZV1JjYmx4MFhIUmNkRzl1U1cxaFoyVlZjR3h2WVdSRmNuSnZjam9nYm5Wc2JDd2dMeThnYVcxaFoyVlZjR3h2WVdSRmNuSnZjbHh1WEhSY2RGeDBiMjVOWldScFlVUmxiR1YwWlRvZ2JuVnNiQ3dnSUNBZ0lDQXZMeUJ0WldScFlTQmtaV3hsZEdWY2JseDBYSFJjZEc5dVZHOXZiR0poY2tOc2FXTnJPaUJ1ZFd4c0xGeHVYSFJjZEZ4MGIyNXpkV0p0YVhRNklHNTFiR3dzWEc1Y2JseDBYSFJjZEM4cUtseHVYSFJjZEZ4MElDb2diV0Z1YVhCMWJHRjBaU0JzYVc1cklHRmtaSEpsYzNNZ2QyaGxiaUIxYzJWeUlHTnlaV0YwWlNCc2FXNXJYRzVjZEZ4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdjMHhwYm10VmNteGNibHgwWEhSY2RDQXFJRUJ5WlhSMWNtNGdlMU4wY21sdVozMWNibHgwWEhSY2RDQXFMMXh1WEhSY2RGeDBiMjVEY21WaGRHVk1hVzVyT2lCbWRXNWpkR2x2YmlBb2MweHBibXRWY213cElIdGNibHgwWEhSY2RGeDBhV1lnS0hOTWFXNXJWWEpzTG1sdVpHVjRUMllvSjBBbktTQWhQVDBnTFRFZ0ppWWdjMHhwYm10VmNtd3VhVzVrWlhoUFppZ25PaWNwSUQwOVBTQXRNU2tnZTF4dVhIUmNkRngwWEhSY2RITk1hVzVyVlhKc0lEMGdKMjFoYVd4MGJ6b25JQ3NnYzB4cGJtdFZjbXc3WEc1Y2RGeDBYSFJjZEgwZ1pXeHpaU0JwWmlBb2MweHBibXRWY213dWFXNWtaWGhQWmlnbk9pOHZKeWtnUFQwOUlDMHhLU0I3WEc1Y2RGeDBYSFJjZEZ4MGMweHBibXRWY213Z1BTQW5hSFIwY0Rvdkx5Y2dLeUJ6VEdsdWExVnliRHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RISmxkSFZ5YmlCelRHbHVhMVZ5YkR0Y2JseDBYSFJjZEgwc1hHNWNibHgwWEhSY2RHdGxlVTFoY0RvZ2UxeHVYSFJjZEZ4MFhIUndZem9nZTF4dVhIUmNkRngwWEhSY2RDZEZUbFJGVWljNklDZHBibk5sY25SUVlYSmhaM0poY0dnbkxGeHVYSFJjZEZ4MFhIUmNkQ2REVkZKTUsxb25PaUFuZFc1a2J5Y3NYRzVjZEZ4MFhIUmNkRngwSjBOVVVrd3JXU2M2SUNkeVpXUnZKeXhjYmx4MFhIUmNkRngwWEhRblZFRkNKem9nSjNSaFlpY3NYRzVjZEZ4MFhIUmNkRngwSjFOSVNVWlVLMVJCUWljNklDZDFiblJoWWljc1hHNWNkRngwWEhSY2RGeDBKME5VVWt3clFpYzZJQ2RpYjJ4a0p5eGNibHgwWEhSY2RGeDBYSFFuUTFSU1RDdEpKem9nSjJsMFlXeHBZeWNzWEc1Y2RGeDBYSFJjZEZ4MEowTlVVa3dyVlNjNklDZDFibVJsY214cGJtVW5MRnh1WEhSY2RGeDBYSFJjZENkRFZGSk1LMU5JU1VaVUsxTW5PaUFuYzNSeWFXdGxkR2h5YjNWbmFDY3NYRzVjZEZ4MFhIUmNkRngwSjBOVVVrd3JRa0ZEUzFOTVFWTklKem9nSjNKbGJXOTJaVVp2Y20xaGRDY3NYRzVjZEZ4MFhIUmNkRngwSjBOVVVrd3JVMGhKUmxRclRDYzZJQ2RxZFhOMGFXWjVUR1ZtZENjc1hHNWNkRngwWEhSY2RGeDBKME5VVWt3clUwaEpSbFFyUlNjNklDZHFkWE4wYVdaNVEyVnVkR1Z5Snl4Y2JseDBYSFJjZEZ4MFhIUW5RMVJTVEN0VFNFbEdWQ3RTSnpvZ0oycDFjM1JwWm5sU2FXZG9kQ2NzWEc1Y2RGeDBYSFJjZEZ4MEowTlVVa3dyVTBoSlJsUXJTaWM2SUNkcWRYTjBhV1o1Um5Wc2JDY3NYRzVjZEZ4MFhIUmNkRngwSjBOVVVrd3JVMGhKUmxRclRsVk5OeWM2SUNkcGJuTmxjblJWYm05eVpHVnlaV1JNYVhOMEp5eGNibHgwWEhSY2RGeDBYSFFuUTFSU1RDdFRTRWxHVkN0T1ZVMDRKem9nSjJsdWMyVnlkRTl5WkdWeVpXUk1hWE4wSnl4Y2JseDBYSFJjZEZ4MFhIUW5RMVJTVEN0TVJVWlVRbEpCUTB0RlZDYzZJQ2R2ZFhSa1pXNTBKeXhjYmx4MFhIUmNkRngwWEhRblExUlNUQ3RTU1VkSVZFSlNRVU5MUlZRbk9pQW5hVzVrWlc1MEp5eGNibHgwWEhSY2RGeDBYSFFuUTFSU1RDdE9WVTB3SnpvZ0oyWnZjbTFoZEZCaGNtRW5MRnh1WEhSY2RGeDBYSFJjZENkRFZGSk1LMDVWVFRFbk9pQW5abTl5YldGMFNERW5MRnh1WEhSY2RGeDBYSFJjZENkRFZGSk1LMDVWVFRJbk9pQW5abTl5YldGMFNESW5MRnh1WEhSY2RGeDBYSFJjZENkRFZGSk1LMDVWVFRNbk9pQW5abTl5YldGMFNETW5MRnh1WEhSY2RGeDBYSFJjZENkRFZGSk1LMDVWVFRRbk9pQW5abTl5YldGMFNEUW5MRnh1WEhSY2RGeDBYSFJjZENkRFZGSk1LMDVWVFRVbk9pQW5abTl5YldGMFNEVW5MRnh1WEhSY2RGeDBYSFJjZENkRFZGSk1LMDVWVFRZbk9pQW5abTl5YldGMFNEWW5MRnh1WEhSY2RGeDBYSFJjZENkRFZGSk1LMFZPVkVWU0p6b2dKMmx1YzJWeWRFaHZjbWw2YjI1MFlXeFNkV3hsSnl4Y2JseDBYSFJjZEZ4MFhIUW5RMVJTVEN0TEp6b2dKM05vYjNkTWFXNXJSR2xoYkc5bkoxeHVYSFJjZEZ4MFhIUjlMRnh1WEc1Y2RGeDBYSFJjZEcxaFl6b2dlMXh1WEhSY2RGeDBYSFJjZENkRlRsUkZVaWM2SUNkcGJuTmxjblJRWVhKaFozSmhjR2duTEZ4dVhIUmNkRngwWEhSY2RDZERUVVFyV2ljNklDZDFibVJ2Snl4Y2JseDBYSFJjZEZ4MFhIUW5RMDFFSzFOSVNVWlVLMW9uT2lBbmNtVmtieWNzWEc1Y2RGeDBYSFJjZEZ4MEoxUkJRaWM2SUNkMFlXSW5MRnh1WEhSY2RGeDBYSFJjZENkVFNFbEdWQ3RVUVVJbk9pQW5kVzUwWVdJbkxGeHVYSFJjZEZ4MFhIUmNkQ2REVFVRclFpYzZJQ2RpYjJ4a0p5eGNibHgwWEhSY2RGeDBYSFFuUTAxRUswa25PaUFuYVhSaGJHbGpKeXhjYmx4MFhIUmNkRngwWEhRblEwMUVLMVVuT2lBbmRXNWtaWEpzYVc1bEp5eGNibHgwWEhSY2RGeDBYSFFuUTAxRUsxTklTVVpVSzFNbk9pQW5jM1J5YVd0bGRHaHliM1ZuYUNjc1hHNWNkRngwWEhSY2RGeDBKME5OUkN0Q1FVTkxVMHhCVTBnbk9pQW5jbVZ0YjNabFJtOXliV0YwSnl4Y2JseDBYSFJjZEZ4MFhIUW5RMDFFSzFOSVNVWlVLMHduT2lBbmFuVnpkR2xtZVV4bFpuUW5MRnh1WEhSY2RGeDBYSFJjZENkRFRVUXJVMGhKUmxRclJTYzZJQ2RxZFhOMGFXWjVRMlZ1ZEdWeUp5eGNibHgwWEhSY2RGeDBYSFFuUTAxRUsxTklTVVpVSzFJbk9pQW5hblZ6ZEdsbWVWSnBaMmgwSnl4Y2JseDBYSFJjZEZ4MFhIUW5RMDFFSzFOSVNVWlVLMG9uT2lBbmFuVnpkR2xtZVVaMWJHd25MRnh1WEhSY2RGeDBYSFJjZENkRFRVUXJVMGhKUmxRclRsVk5OeWM2SUNkcGJuTmxjblJWYm05eVpHVnlaV1JNYVhOMEp5eGNibHgwWEhSY2RGeDBYSFFuUTAxRUsxTklTVVpVSzA1VlRUZ25PaUFuYVc1elpYSjBUM0prWlhKbFpFeHBjM1FuTEZ4dVhIUmNkRngwWEhSY2RDZERUVVFyVEVWR1ZFSlNRVU5MUlZRbk9pQW5iM1YwWkdWdWRDY3NYRzVjZEZ4MFhIUmNkRngwSjBOTlJDdFNTVWRJVkVKU1FVTkxSVlFuT2lBbmFXNWtaVzUwSnl4Y2JseDBYSFJjZEZ4MFhIUW5RMDFFSzA1VlRUQW5PaUFuWm05eWJXRjBVR0Z5WVNjc1hHNWNkRngwWEhSY2RGeDBKME5OUkN0T1ZVMHhKem9nSjJadmNtMWhkRWd4Snl4Y2JseDBYSFJjZEZ4MFhIUW5RMDFFSzA1VlRUSW5PaUFuWm05eWJXRjBTREluTEZ4dVhIUmNkRngwWEhSY2RDZERUVVFyVGxWTk15YzZJQ2RtYjNKdFlYUklNeWNzWEc1Y2RGeDBYSFJjZEZ4MEowTk5SQ3RPVlUwMEp6b2dKMlp2Y20xaGRFZzBKeXhjYmx4MFhIUmNkRngwWEhRblEwMUVLMDVWVFRVbk9pQW5abTl5YldGMFNEVW5MRnh1WEhSY2RGeDBYSFJjZENkRFRVUXJUbFZOTmljNklDZG1iM0p0WVhSSU5pY3NYRzVjZEZ4MFhIUmNkRngwSjBOTlJDdEZUbFJGVWljNklDZHBibk5sY25SSWIzSnBlbTl1ZEdGc1VuVnNaU2NzWEc1Y2RGeDBYSFJjZEZ4MEowTk5SQ3RMSnpvZ0ozTm9iM2RNYVc1clJHbGhiRzluSjF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNkRngwZlN4Y2JseHVYSFJjZEM4dklHUmxabUYxYkhRZ2JHRnVaM1ZoWjJVNklHVnVMVlZUWEc1Y2RGeDBiR0Z1WnpvZ2UxeHVYSFJjZEZ4MEoyVnVMVlZUSnpvZ2UxeHVYSFJjZEZ4MFhIUm1iMjUwT2lCN1hHNWNkRngwWEhSY2RGeDBZbTlzWkRvZ0owSnZiR1FuTEZ4dVhIUmNkRngwWEhSY2RHbDBZV3hwWXpvZ0owbDBZV3hwWXljc1hHNWNkRngwWEhSY2RGeDBkVzVrWlhKc2FXNWxPaUFuVlc1a1pYSnNhVzVsSnl4Y2JseDBYSFJjZEZ4MFhIUmpiR1ZoY2pvZ0oxSmxiVzkyWlNCR2IyNTBJRk4wZVd4bEp5eGNibHgwWEhSY2RGeDBYSFJvWldsbmFIUTZJQ2RNYVc1bElFaGxhV2RvZENjc1hHNWNkRngwWEhSY2RGeDBibUZ0WlRvZ0owWnZiblFnUm1GdGFXeDVKMXh1WEhSY2RGeDBYSFI5TEZ4dVhIUmNkRngwWEhScGJXRm5aVG9nZTF4dVhIUmNkRngwWEhSY2RHbHRZV2RsT2lBblVHbGpkSFZ5WlNjc1hHNWNkRngwWEhSY2RGeDBhVzV6WlhKME9pQW5TVzV6WlhKMElFbHRZV2RsSnl4Y2JseDBYSFJjZEZ4MFhIUnlaWE5wZW1WR2RXeHNPaUFuVW1WemFYcGxJRVoxYkd3bkxGeHVYSFJjZEZ4MFhIUmNkSEpsYzJsNlpVaGhiR1k2SUNkU1pYTnBlbVVnU0dGc1ppY3NYRzVjZEZ4MFhIUmNkRngwY21WemFYcGxVWFZoY25SbGNqb2dKMUpsYzJsNlpTQlJkV0Z5ZEdWeUp5eGNibHgwWEhSY2RGeDBYSFJtYkc5aGRFeGxablE2SUNkR2JHOWhkQ0JNWldaMEp5eGNibHgwWEhSY2RGeDBYSFJtYkc5aGRGSnBaMmgwT2lBblJteHZZWFFnVW1sbmFIUW5MRnh1WEhSY2RGeDBYSFJjZEdac2IyRjBUbTl1WlRvZ0owWnNiMkYwSUU1dmJtVW5MRnh1WEhSY2RGeDBYSFJjZEhOb1lYQmxVbTkxYm1SbFpEb2dKMU5vWVhCbE9pQlNiM1Z1WkdWa0p5eGNibHgwWEhSY2RGeDBYSFJ6YUdGd1pVTnBjbU5zWlRvZ0oxTm9ZWEJsT2lCRGFYSmpiR1VuTEZ4dVhIUmNkRngwWEhSY2RITm9ZWEJsVkdoMWJXSnVZV2xzT2lBblUyaGhjR1U2SUZSb2RXMWlibUZwYkNjc1hHNWNkRngwWEhSY2RGeDBjMmhoY0dWT2IyNWxPaUFuVTJoaGNHVTZJRTV2Ym1VbkxGeHVYSFJjZEZ4MFhIUmNkR1J5WVdkSmJXRm5aVWhsY21VNklDZEVjbUZuSUdsdFlXZGxJRzl5SUhSbGVIUWdhR1Z5WlNjc1hHNWNkRngwWEhSY2RGeDBaSEp2Y0VsdFlXZGxPaUFuUkhKdmNDQnBiV0ZuWlNCdmNpQlVaWGgwSnl4Y2JseDBYSFJjZEZ4MFhIUnpaV3hsWTNSR2NtOXRSbWxzWlhNNklDZFRaV3hsWTNRZ1puSnZiU0JtYVd4bGN5Y3NYRzVjZEZ4MFhIUmNkRngwYldGNGFXMTFiVVpwYkdWVGFYcGxPaUFuVFdGNGFXMTFiU0JtYVd4bElITnBlbVVuTEZ4dVhIUmNkRngwWEhSY2RHMWhlR2x0ZFcxR2FXeGxVMmw2WlVWeWNtOXlPaUFuVFdGNGFXMTFiU0JtYVd4bElITnBlbVVnWlhoalpXVmtaV1F1Snl4Y2JseDBYSFJjZEZ4MFhIUjFjbXc2SUNkSmJXRm5aU0JWVWt3bkxGeHVYSFJjZEZ4MFhIUmNkSEpsYlc5MlpUb2dKMUpsYlc5MlpTQkpiV0ZuWlNkY2JseDBYSFJjZEZ4MGZTeGNibHgwWEhSY2RGeDBiR2x1YXpvZ2UxeHVYSFJjZEZ4MFhIUmNkR3hwYm1zNklDZE1hVzVySnl4Y2JseDBYSFJjZEZ4MFhIUnBibk5sY25RNklDZEpibk5sY25RZ1RHbHVheWNzWEc1Y2RGeDBYSFJjZEZ4MGRXNXNhVzVyT2lBblZXNXNhVzVySnl4Y2JseDBYSFJjZEZ4MFhIUmxaR2wwT2lBblJXUnBkQ2NzWEc1Y2RGeDBYSFJjZEZ4MGRHVjRkRlJ2UkdsemNHeGhlVG9nSjFSbGVIUWdkRzhnWkdsemNHeGhlU2NzWEc1Y2RGeDBYSFJjZEZ4MGRYSnNPaUFuVkc4Z2QyaGhkQ0JWVWt3Z2MyaHZkV3hrSUhSb2FYTWdiR2x1YXlCbmJ6OG5MRnh1WEhSY2RGeDBYSFJjZEc5d1pXNUpiazVsZDFkcGJtUnZkem9nSjA5d1pXNGdhVzRnYm1WM0lIZHBibVJ2ZHlkY2JseDBYSFJjZEZ4MGZTeGNibHgwWEhSY2RGeDBkR0ZpYkdVNklIdGNibHgwWEhSY2RGeDBYSFIwWVdKc1pUb2dKMVJoWW14bEoxeHVYSFJjZEZ4MFhIUjlMRnh1WEhSY2RGeDBYSFJvY2pvZ2UxeHVYSFJjZEZ4MFhIUmNkR2x1YzJWeWREb2dKMGx1YzJWeWRDQkliM0pwZW05dWRHRnNJRkoxYkdVblhHNWNkRngwWEhSY2RIMHNYRzVjZEZ4MFhIUmNkSE4wZVd4bE9pQjdYRzVjZEZ4MFhIUmNkRngwYzNSNWJHVTZJQ2RUZEhsc1pTY3NYRzVjZEZ4MFhIUmNkRngwYm05eWJXRnNPaUFuVG05eWJXRnNKeXhjYmx4MFhIUmNkRngwWEhSaWJHOWphM0YxYjNSbE9pQW5VWFZ2ZEdVbkxGeHVYSFJjZEZ4MFhIUmNkSEJ5WlRvZ0owTnZaR1VuTEZ4dVhIUmNkRngwWEhSY2RHZ3hPaUFuU0dWaFpHVnlJREVuTEZ4dVhIUmNkRngwWEhSY2RHZ3lPaUFuU0dWaFpHVnlJREluTEZ4dVhIUmNkRngwWEhSY2RHZ3pPaUFuU0dWaFpHVnlJRE1uTEZ4dVhIUmNkRngwWEhSY2RHZzBPaUFuU0dWaFpHVnlJRFFuTEZ4dVhIUmNkRngwWEhSY2RHZzFPaUFuU0dWaFpHVnlJRFVuTEZ4dVhIUmNkRngwWEhSY2RHZzJPaUFuU0dWaFpHVnlJRFluWEc1Y2RGeDBYSFJjZEgwc1hHNWNkRngwWEhSY2RHeHBjM1J6T2lCN1hHNWNkRngwWEhSY2RGeDBkVzV2Y21SbGNtVmtPaUFuVlc1dmNtUmxjbVZrSUd4cGMzUW5MRnh1WEhSY2RGeDBYSFJjZEc5eVpHVnlaV1E2SUNkUGNtUmxjbVZrSUd4cGMzUW5YRzVjZEZ4MFhIUmNkSDBzWEc1Y2RGeDBYSFJjZEc5d2RHbHZibk02SUh0Y2JseDBYSFJjZEZ4MFhIUm9aV3h3T2lBblNHVnNjQ2NzWEc1Y2RGeDBYSFJjZEZ4MFpuVnNiSE5qY21WbGJqb2dKMFoxYkd3Z1UyTnlaV1Z1Snl4Y2JseDBYSFJjZEZ4MFhIUmpiMlJsZG1sbGR6b2dKME52WkdVZ1ZtbGxkeWRjYmx4MFhIUmNkRngwZlN4Y2JseDBYSFJjZEZ4MGNHRnlZV2R5WVhCb09pQjdYRzVjZEZ4MFhIUmNkRngwY0dGeVlXZHlZWEJvT2lBblVHRnlZV2R5WVhCb0p5eGNibHgwWEhSY2RGeDBYSFJ2ZFhSa1pXNTBPaUFuVDNWMFpHVnVkQ2NzWEc1Y2RGeDBYSFJjZEZ4MGFXNWtaVzUwT2lBblNXNWtaVzUwSnl4Y2JseDBYSFJjZEZ4MFhIUnNaV1owT2lBblFXeHBaMjRnYkdWbWRDY3NYRzVjZEZ4MFhIUmNkRngwWTJWdWRHVnlPaUFuUVd4cFoyNGdZMlZ1ZEdWeUp5eGNibHgwWEhSY2RGeDBYSFJ5YVdkb2REb2dKMEZzYVdkdUlISnBaMmgwSnl4Y2JseDBYSFJjZEZ4MFhIUnFkWE4wYVdaNU9pQW5TblZ6ZEdsbWVTQm1kV3hzSjF4dVhIUmNkRngwWEhSOUxGeHVYSFJjZEZ4MFhIUmpiMnh2Y2pvZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsWTJWdWREb2dKMUpsWTJWdWRDQkRiMnh2Y2ljc1hHNWNkRngwWEhSY2RGeDBiVzl5WlRvZ0owMXZjbVVnUTI5c2IzSW5MRnh1WEhSY2RGeDBYSFJjZEdKaFkydG5jbTkxYm1RNklDZENZV05yWjNKdmRXNWtJRU52Ykc5eUp5eGNibHgwWEhSY2RGeDBYSFJtYjNKbFozSnZkVzVrT2lBblJtOXlaV2R5YjNWdVpDQkRiMnh2Y2ljc1hHNWNkRngwWEhSY2RGeDBkSEpoYm5Od1lYSmxiblE2SUNkVWNtRnVjM0JoY21WdWRDY3NYRzVjZEZ4MFhIUmNkRngwYzJWMFZISmhibk53WVhKbGJuUTZJQ2RUWlhRZ2RISmhibk53WVhKbGJuUW5MRnh1WEhSY2RGeDBYSFJjZEhKbGMyVjBPaUFuVW1WelpYUW5MRnh1WEhSY2RGeDBYSFJjZEhKbGMyVjBWRzlFWldaaGRXeDBPaUFuVW1WelpYUWdkRzhnWkdWbVlYVnNkQ2RjYmx4MFhIUmNkRngwZlN4Y2JseDBYSFJjZEZ4MGMyaHZjblJqZFhRNklIdGNibHgwWEhSY2RGeDBYSFJ6YUc5eWRHTjFkSE02SUNkTFpYbGliMkZ5WkNCemFHOXlkR04xZEhNbkxGeHVYSFJjZEZ4MFhIUmNkR05zYjNObE9pQW5RMnh2YzJVbkxGeHVYSFJjZEZ4MFhIUmNkSFJsZUhSR2IzSnRZWFIwYVc1bk9pQW5WR1Y0ZENCbWIzSnRZWFIwYVc1bkp5eGNibHgwWEhSY2RGeDBYSFJoWTNScGIyNDZJQ2RCWTNScGIyNG5MRnh1WEhSY2RGeDBYSFJjZEhCaGNtRm5jbUZ3YUVadmNtMWhkSFJwYm1jNklDZFFZWEpoWjNKaGNHZ2dabTl5YldGMGRHbHVaeWNzWEc1Y2RGeDBYSFJjZEZ4MFpHOWpkVzFsYm5SVGRIbHNaVG9nSjBSdlkzVnRaVzUwSUZOMGVXeGxKeXhjYmx4MFhIUmNkRngwWEhSbGVIUnlZVXRsZVhNNklDZEZlSFJ5WVNCclpYbHpKMXh1WEhSY2RGeDBYSFI5TEZ4dVhIUmNkRngwWEhSb2FYTjBiM0o1T2lCN1hHNWNkRngwWEhSY2RGeDBkVzVrYnpvZ0oxVnVaRzhuTEZ4dVhIUmNkRngwWEhSY2RISmxaRzg2SUNkU1pXUnZKMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVnh1WEhSOU8xeHVYRzVjZEM4cUtseHVYSFFnS2lCQVkyeGhjM01nWTI5eVpTNWhjM2x1WTF4dVhIUWdLbHh1WEhRZ0tpQkJjM2x1WXlCbWRXNWpkR2x2Ym5NZ2QyaHBZMmdnY21WMGRYSnVjeUJnVUhKdmJXbHpaV0JjYmx4MElDcGNibHgwSUNvZ1FITnBibWRzWlhSdmJseHVYSFFnS2lCQVlXeDBaWEp1WVhSbFEyeGhjM05PWVcxbElHRnplVzVqWEc1Y2RDQXFMMXh1WEhSMllYSWdZWE41Ym1NZ1BTQW9ablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnY21WaFpFWnBiR1ZCYzBSaGRHRlZVa3hjYmx4MFhIUWdLbHh1WEhSY2RDQXFJSEpsWVdRZ1kyOXVkR1Z1ZEhNZ2IyWWdabWxzWlNCaGN5QnlaWEJ5WlhObGJuUnBibWNnVlZKTVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBacGJHVjlJR1pwYkdWY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0UWNtOXRhWE5sZlNBdElIUm9aVzQ2SUhORVlYUmhWWEpzWEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUhKbFlXUkdhV3hsUVhORVlYUmhWVkpNSUQwZ1puVnVZM1JwYjI0Z0tHWnBiR1VwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUFrTGtSbFptVnljbVZrS0daMWJtTjBhVzl1SUNoa1pXWmxjbkpsWkNrZ2UxeHVYSFJjZEZ4MFhIUWtMbVY0ZEdWdVpDaHVaWGNnUm1sc1pWSmxZV1JsY2lncExDQjdYRzVjZEZ4MFhIUmNkRngwYjI1c2IyRmtPaUJtZFc1amRHbHZiaUFvWlNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwZG1GeUlITkVZWFJoVlZKTUlEMGdaUzUwWVhKblpYUXVjbVZ6ZFd4ME8xeHVYSFJjZEZ4MFhIUmNkRngwWkdWbVpYSnlaV1F1Y21WemIyeDJaU2h6UkdGMFlWVlNUQ2s3WEc1Y2RGeDBYSFJjZEZ4MGZTeGNibHgwWEhSY2RGeDBYSFJ2Ym1WeWNtOXlPaUJtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJrWldabGNuSmxaQzV5WldwbFkzUW9kR2hwY3lrN1hHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5S1M1eVpXRmtRWE5FWVhSaFZWSk1LR1pwYkdVcE8xeHVYSFJjZEZ4MGZTa3VjSEp2YldselpTZ3BPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJR055WldGMFpVbHRZV2RsWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJqY21WaGRHVWdZRHhwYldGblpUNWdJR1p5YjIwZ2RYSnNJSE4wY21sdVoxeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUhOVmNteGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1ptbHNaVzVoYldWY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0UWNtOXRhWE5sZlNBdElIUm9aVzQ2SUNScGJXRm5aVnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJqY21WaGRHVkpiV0ZuWlNBOUlHWjFibU4wYVc5dUlDaHpWWEpzTENCbWFXeGxibUZ0WlNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUNRdVJHVm1aWEp5WldRb1puVnVZM1JwYjI0Z0tHUmxabVZ5Y21Wa0tTQjdYRzVjZEZ4MFhIUmNkSFpoY2lBa2FXMW5JRDBnSkNnblBHbHRaejRuS1R0Y2JseHVYSFJjZEZ4MFhIUWthVzFuTG05dVpTZ25iRzloWkNjc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwWEhRa2FXMW5MbTltWmlnblpYSnliM0lnWVdKdmNuUW5LVHRjYmx4MFhIUmNkRngwWEhSa1pXWmxjbkpsWkM1eVpYTnZiSFpsS0NScGJXY3BPMXh1WEhSY2RGeDBYSFI5S1M1dmJtVW9KMlZ5Y205eUlHRmliM0owSnl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFJjZENScGJXY3ViMlptS0Nkc2IyRmtKeWt1WkdWMFlXTm9LQ2s3WEc1Y2RGeDBYSFJjZEZ4MFpHVm1aWEp5WldRdWNtVnFaV04wS0NScGJXY3BPMXh1WEhSY2RGeDBYSFI5S1M1amMzTW9lMXh1WEhSY2RGeDBYSFJjZEdScGMzQnNZWGs2SUNkdWIyNWxKMXh1WEhSY2RGeDBYSFI5S1M1aGNIQmxibVJVYnloa2IyTjFiV1Z1ZEM1aWIyUjVLUzVoZEhSeUtIdGNibHgwWEhSY2RGeDBYSFFuYzNKakp6b2djMVZ5YkN4Y2JseDBYSFJjZEZ4MFhIUW5aR0YwWVMxbWFXeGxibUZ0WlNjNklHWnBiR1Z1WVcxbFhHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBmU2t1Y0hKdmJXbHpaU2dwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFJ5WlhSMWNtNGdlMXh1WEhSY2RGeDBjbVZoWkVacGJHVkJjMFJoZEdGVlVrdzZJSEpsWVdSR2FXeGxRWE5FWVhSaFZWSk1MRnh1WEhSY2RGeDBZM0psWVhSbFNXMWhaMlU2SUdOeVpXRjBaVWx0WVdkbFhHNWNkRngwZlR0Y2JseDBmU2tvS1R0Y2JseHVYSFF2S2lwY2JseDBJQ29nUUdOc1lYTnpJR052Y21VdWEyVjVYRzVjZENBcVhHNWNkQ0FxSUU5aWFtVmpkQ0JtYjNJZ2EyVjVZMjlrWlhNdVhHNWNkQ0FxWEc1Y2RDQXFJRUJ6YVc1bmJHVjBiMjVjYmx4MElDb2dRR0ZzZEdWeWJtRjBaVU5zWVhOelRtRnRaU0JyWlhsY2JseDBJQ292WEc1Y2RIWmhjaUJyWlhrZ1BTQjdYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnBjMFZrYVhSY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VG5WdFltVnlmU0JyWlhsRGIyUmxYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdRbTl2YkdWaGJuMWNibHgwWEhRZ0tpOWNibHgwWEhScGMwVmthWFE2SUdaMWJtTjBhVzl1SUNoclpYbERiMlJsS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnYkdsemRDNWpiMjUwWVdsdWN5aGJPQ3dnT1N3Z01UTXNJRE15WFN3Z2EyVjVRMjlrWlNrN1hHNWNkRngwZlN4Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWNISnZjR1Z5ZEhrZ2UwOWlhbVZqZEgwZ2JtRnRaVVp5YjIxRGIyUmxYRzVjZEZ4MElDb2dRSEJ5YjNCbGNuUjVJSHRUZEhKcGJtZDlJRzVoYldWR2NtOXRRMjlrWlM0NElGd2lRa0ZEUzFOUVFVTkZYQ0pjYmx4MFhIUWdLaTljYmx4MFhIUnVZVzFsUm5KdmJVTnZaR1U2SUh0Y2JseDBYSFJjZENjNEp6b2dKMEpCUTB0VFVFRkRSU2NzWEc1Y2RGeDBYSFFuT1NjNklDZFVRVUluTEZ4dVhIUmNkRngwSnpFekp6b2dKMFZPVkVWU0p5eGNibHgwWEhSY2RDY3pNaWM2SUNkVFVFRkRSU2NzWEc1Y2JseDBYSFJjZEM4dklFNTFiV0psY2pvZ01DMDVYRzVjZEZ4MFhIUW5ORGduT2lBblRsVk5NQ2NzWEc1Y2RGeDBYSFFuTkRrbk9pQW5UbFZOTVNjc1hHNWNkRngwWEhRbk5UQW5PaUFuVGxWTk1pY3NYRzVjZEZ4MFhIUW5OVEVuT2lBblRsVk5NeWNzWEc1Y2RGeDBYSFFuTlRJbk9pQW5UbFZOTkNjc1hHNWNkRngwWEhRbk5UTW5PaUFuVGxWTk5TY3NYRzVjZEZ4MFhIUW5OVFFuT2lBblRsVk5OaWNzWEc1Y2RGeDBYSFFuTlRVbk9pQW5UbFZOTnljc1hHNWNkRngwWEhRbk5UWW5PaUFuVGxWTk9DY3NYRzVjYmx4MFhIUmNkQzh2SUVGc2NHaGhZbVYwT2lCaExYcGNibHgwWEhSY2RDYzJOaWM2SUNkQ0p5eGNibHgwWEhSY2RDYzJPU2M2SUNkRkp5eGNibHgwWEhSY2RDYzNNeWM2SUNkSkp5eGNibHgwWEhSY2RDYzNOQ2M2SUNkS0p5eGNibHgwWEhSY2RDYzNOU2M2SUNkTEp5eGNibHgwWEhSY2RDYzNOaWM2SUNkTUp5eGNibHgwWEhSY2RDYzRNaWM2SUNkU0p5eGNibHgwWEhSY2RDYzRNeWM2SUNkVEp5eGNibHgwWEhSY2RDYzROU2M2SUNkVkp5eGNibHgwWEhSY2RDYzRPU2M2SUNkWkp5eGNibHgwWEhSY2RDYzVNQ2M2SUNkYUp5eGNibHh1WEhSY2RGeDBKekU1TVNjNklDZFRURUZUU0Njc1hHNWNkRngwWEhRbk1qRTVKem9nSjB4RlJsUkNVa0ZEUzBWVUp5eGNibHgwWEhSY2RDY3lNakFuT2lBblFrRkRTMU5NUVZOSUp5eGNibHgwWEhSY2RDY3lNakVuT2lBblVrbEhTRlJDVWtGRFMwVlVKMXh1WEhSY2RIMWNibHgwZlR0Y2JseHVYSFF2S2lwY2JseDBJQ29nUUdOc1lYTnpJR1ZrYVhScGJtY3VTR2x6ZEc5eWVWeHVYSFFnS2x4dVhIUWdLaUJGWkdsMGIzSWdTR2x6ZEc5eWVWeHVYSFFnS2x4dVhIUWdLaTljYmx4MGRtRnlJRWhwYzNSdmNua2dQU0JtZFc1amRHbHZiaUFvSkdWa2FYUmhZbXhsS1NCN1hHNWNkRngwZG1GeUlITjBZV05ySUQwZ1cxMHNJSE4wWVdOclQyWm1jMlYwSUQwZ0xURTdYRzVjZEZ4MGRtRnlJR1ZrYVhSaFlteGxJRDBnSkdWa2FYUmhZbXhsV3pCZE8xeHVYRzVjZEZ4MGRtRnlJRzFoYTJWVGJtRndjMmh2ZENBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkSFpoY2lCeWJtY2dQU0J5WVc1blpTNWpjbVZoZEdVb0tUdGNibHgwWEhSY2RIWmhjaUJsYlhCMGVVSnZiMnR0WVhKcklEMGdleUJ6T2lCN0lIQmhkR2c2SUZ0ZExDQnZabVp6WlhRNklEQWdmU3dnWlRvZ2V5QndZWFJvT2lCYlhTd2diMlptYzJWME9pQXdJSDBnZlR0Y2JseHVYSFJjZEZ4MGNtVjBkWEp1SUh0Y2JseDBYSFJjZEZ4MFkyOXVkR1Z1ZEhNNklDUmxaR2wwWVdKc1pTNW9kRzFzS0Nrc1hHNWNkRngwWEhSY2RHSnZiMnR0WVhKck9pQW9jbTVuSUQ4Z2NtNW5MbUp2YjJ0dFlYSnJLR1ZrYVhSaFlteGxLU0E2SUdWdGNIUjVRbTl2YTIxaGNtc3BYRzVjZEZ4MFhIUjlPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnWVhCd2JIbFRibUZ3YzJodmRDQTlJR1oxYm1OMGFXOXVJQ2h6Ym1Gd2MyaHZkQ2tnZTF4dVhIUmNkRngwYVdZZ0tITnVZWEJ6YUc5MExtTnZiblJsYm5SeklDRTlQU0J1ZFd4c0tTQjdYRzVjZEZ4MFhIUmNkQ1JsWkdsMFlXSnNaUzVvZEcxc0tITnVZWEJ6YUc5MExtTnZiblJsYm5SektUdGNibHgwWEhSY2RIMWNibHgwWEhSY2RHbG1JQ2h6Ym1Gd2MyaHZkQzVpYjI5cmJXRnlheUFoUFQwZ2JuVnNiQ2tnZTF4dVhIUmNkRngwWEhSeVlXNW5aUzVqY21WaGRHVkdjbTl0UW05dmEyMWhjbXNvWldScGRHRmliR1VzSUhOdVlYQnphRzkwTG1KdmIydHRZWEpyS1M1elpXeGxZM1FvS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2RXNWtiMXh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11ZFc1a2J5QTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEdsbUlDZ3dJRHdnYzNSaFkydFBabVp6WlhRcElIdGNibHgwWEhSY2RGeDBjM1JoWTJ0UFptWnpaWFF0TFR0Y2JseDBYSFJjZEZ4MFlYQndiSGxUYm1Gd2MyaHZkQ2h6ZEdGamExdHpkR0ZqYTA5bVpuTmxkRjBwTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCeVpXUnZYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTV5WldSdklEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwYVdZZ0tITjBZV05yTG14bGJtZDBhQ0F0SURFZ1BpQnpkR0ZqYTA5bVpuTmxkQ2tnZTF4dVhIUmNkRngwWEhSemRHRmphMDltWm5ObGRDc3JPMXh1WEhSY2RGeDBYSFJoY0hCc2VWTnVZWEJ6YUc5MEtITjBZV05yVzNOMFlXTnJUMlptYzJWMFhTazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJSEpsWTI5eVpHVmtJSFZ1Wkc5Y2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxuSmxZMjl5WkZWdVpHOGdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSemRHRmphMDltWm5ObGRDc3JPMXh1WEc1Y2RGeDBYSFF2THlCWFlYTm9JRzkxZENCemRHRmpheUJoWm5SbGNpQnpkR0ZqYTA5bVpuTmxkRnh1WEhSY2RGeDBhV1lnS0hOMFlXTnJMbXhsYm1kMGFDQStJSE4wWVdOclQyWm1jMlYwS1NCN1hHNWNkRngwWEhSY2RITjBZV05ySUQwZ2MzUmhZMnN1YzJ4cFkyVW9NQ3dnYzNSaFkydFBabVp6WlhRcE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZMeUJEY21WaGRHVWdibVYzSUhOdVlYQnphRzkwSUdGdVpDQndkWE5vSUdsMElIUnZJSFJvWlNCbGJtUmNibHgwWEhSY2RITjBZV05yTG5CMWMyZ29iV0ZyWlZOdVlYQnphRzkwS0NrcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdkx5QkRjbVZoZEdVZ1ptbHljM1FnZFc1a2J5QnpkR0ZqYTF4dVhIUmNkSFJvYVhNdWNtVmpiM0prVlc1a2J5Z3BPMXh1WEhSOU8xeHVYRzVjZEM4cUtseHVYSFFnS2lCQVkyeGhjM01nWldScGRHbHVaeTVUZEhsc1pWeHVYSFFnS2x4dVhIUWdLaUJUZEhsc1pWeHVYSFFnS2x4dVhIUWdLaTljYmx4MGRtRnlJRk4wZVd4bElEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnYWxGMVpYSjVRMU5UWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJ3WVhOemFXNW5JR0Z1SUdGeWNtRjVJRzltSUhOMGVXeGxJSEJ5YjNCbGNuUnBaWE1nZEc4Z0xtTnpjeWdwWEc1Y2RGeDBJQ29nZDJsc2JDQnlaWE4xYkhRZ2FXNGdZVzRnYjJKcVpXTjBJRzltSUhCeWIzQmxjblI1TFhaaGJIVmxJSEJoYVhKekxseHVYSFJjZENBcUlDaGpiMjF3WVdKcGJHbDBlU0IzYVhSb0lIWmxjbk5wYjI0Z1BDQXhMamtwWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0hKcGRtRjBaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQWdlMnBSZFdWeWVYMGdKRzlpYWx4dVhIUmNkQ0FxSUVCd1lYSmhiU0FnZTBGeWNtRjVmU0J3Y205d1pYSjBlVTVoYldWeklDMGdRVzRnWVhKeVlYa2diMllnYjI1bElHOXlJRzF2Y21VZ1ExTlRJSEJ5YjNCbGNuUnBaWE11WEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3VDJKcVpXTjBmVnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJxVVhWbGNubERVMU1nUFNCbWRXNWpkR2x2YmlBb0pHOWlhaXdnY0hKdmNHVnlkSGxPWVcxbGN5a2dlMXh1WEhSY2RGeDBhV1lnS0dGblpXNTBMbXB4ZFdWeWVWWmxjbk5wYjI0Z1BDQXhMamtwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJSEpsYzNWc2RDQTlJSHQ5TzF4dVhIUmNkRngwWEhRa0xtVmhZMmdvY0hKdmNHVnlkSGxPWVcxbGN5d2dablZ1WTNScGIyNGdLR2xrZUN3Z2NISnZjR1Z5ZEhsT1lXMWxLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVnpkV3gwVzNCeWIzQmxjblI1VG1GdFpWMGdQU0FrYjJKcUxtTnpjeWh3Y205d1pYSjBlVTVoYldVcE8xeHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSEpsYzNWc2REdGNibHgwWEhSY2RIMWNibHgwWEhSY2RISmxkSFZ5YmlBa2IySnFMbU56Y3k1allXeHNLQ1J2WW1vc0lIQnliM0JsY25SNVRtRnRaWE1wTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCd1lYSmhaM0poY0dnZ2JHVjJaV3dnYzNSNWJHVmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1YzSmhjSEJsWkZKaGJtZGxmU0J5Ym1kY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYzNSNWJHVkpibVp2WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1emRIbHNaVkJoY21FZ1BTQm1kVzVqZEdsdmJpQW9jbTVuTENCemRIbHNaVWx1Wm04cElIdGNibHgwWEhSY2RDUXVaV0ZqYUNoeWJtY3VibTlrWlhNb1pHOXRMbWx6VUdGeVlTd2dlMXh1WEhSY2RGeDBYSFJwYm1Oc2RXUmxRVzVqWlhOMGIzSTZJSFJ5ZFdWY2JseDBYSFJjZEgwcExDQm1kVzVqZEdsdmJpQW9hV1I0TENCd1lYSmhLU0I3WEc1Y2RGeDBYSFJjZENRb2NHRnlZU2t1WTNOektITjBlV3hsU1c1bWJ5azdYRzVjZEZ4MFhIUjlLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nYVc1elpYSjBJR0Z1WkNCeVpYUjFjbTV6SUhOMGVXeGxUbTlrWlhNZ2IyNGdjbUZ1WjJVdVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFkeVlYQndaV1JTWVc1blpYMGdjbTVuWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJRnR2Y0hScGIyNXpYU0F0SUc5d2RHbHZibk1nWm05eUlITjBlV3hsVG05a1pYTmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1cyOXdkR2x2Ym5NdWJtOWtaVTVoYldWZElDMGdaR1ZtWVhWc2REb2dZRk5RUVU1Z1hHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IyOXNaV0Z1ZlNCYmIzQjBhVzl1Y3k1bGVIQmhibVJEYkc5elpYTjBVMmxpYkdsdVoxMGdMU0JrWldaaGRXeDBPaUJnWm1Gc2MyVmdYRzVjZEZ4MElDb2dRSEJoY21GdElIdENiMjlzWldGdWZTQmJiM0IwYVc5dWN5NXZibXg1VUdGeWRHbGhiRU52Ym5SaGFXNXpYU0F0SUdSbFptRjFiSFE2SUdCbVlXeHpaV0JjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRPYjJSbFcxMTlYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTV6ZEhsc1pVNXZaR1Z6SUQwZ1puVnVZM1JwYjI0Z0tISnVaeXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwY201bklEMGdjbTVuTG5Od2JHbDBWR1Y0ZENncE8xeHVYRzVjZEZ4MFhIUjJZWElnYm05a1pVNWhiV1VnUFNCdmNIUnBiMjV6SUNZbUlHOXdkR2x2Ym5NdWJtOWtaVTVoYldVZ2ZId2dKMU5RUVU0bk8xeHVYSFJjZEZ4MGRtRnlJR1Y0Y0dGdVpFTnNiM05sYzNSVGFXSnNhVzVuSUQwZ0lTRW9iM0IwYVc5dWN5QW1KaUJ2Y0hScGIyNXpMbVY0Y0dGdVpFTnNiM05sYzNSVGFXSnNhVzVuS1R0Y2JseDBYSFJjZEhaaGNpQnZibXg1VUdGeWRHbGhiRU52Ym5SaGFXNXpJRDBnSVNFb2IzQjBhVzl1Y3lBbUppQnZjSFJwYjI1ekxtOXViSGxRWVhKMGFXRnNRMjl1ZEdGcGJuTXBPMXh1WEc1Y2RGeDBYSFJwWmlBb2NtNW5MbWx6UTI5c2JHRndjMlZrS0NrcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlISnVaeTVwYm5ObGNuUk9iMlJsS0dSdmJTNWpjbVZoZEdVb2JtOWtaVTVoYldVcEtUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBkbUZ5SUhCeVpXUWdQU0JrYjIwdWJXRnJaVkJ5WldSQ2VVNXZaR1ZPWVcxbEtHNXZaR1ZPWVcxbEtUdGNibHgwWEhSY2RIWmhjaUJ1YjJSbGN5QTlJQ1F1YldGd0tISnVaeTV1YjJSbGN5aGtiMjB1YVhOVVpYaDBMQ0I3WEc1Y2RGeDBYSFJjZEdaMWJHeDVRMjl1ZEdGcGJuTTZJSFJ5ZFdWY2JseDBYSFJjZEgwcExDQm1kVzVqZEdsdmJpQW9kR1Y0ZENrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z1pHOXRMbk5wYm1kc1pVTm9hV3hrUVc1alpYTjBiM0lvZEdWNGRDd2djSEpsWkNrZ2ZId2daRzl0TG5keVlYQW9kR1Y0ZEN3Z2JtOWtaVTVoYldVcE8xeHVYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkR2xtSUNobGVIQmhibVJEYkc5elpYTjBVMmxpYkdsdVp5a2dlMXh1WEhSY2RGeDBYSFJwWmlBb2IyNXNlVkJoY25ScFlXeERiMjUwWVdsdWN5a2dlMXh1WEhSY2RGeDBYSFJjZEhaaGNpQnViMlJsYzBsdVVtRnVaMlVnUFNCeWJtY3VibTlrWlhNb0tUdGNibHgwWEhSY2RGeDBYSFF2THlCamIyMXdiM05sSUhkcGRHZ2djR0Z5ZEdsaGJDQmpiMjUwWVdsdWN5QndjbVZrYVdOaGRHbHZibHh1WEhSY2RGeDBYSFJjZEhCeVpXUWdQU0JtZFc1akxtRnVaQ2h3Y21Wa0xDQm1kVzVqZEdsdmJpQW9ibTlrWlNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwY21WMGRYSnVJR3hwYzNRdVkyOXVkR0ZwYm5Nb2JtOWtaWE5KYmxKaGJtZGxMQ0J1YjJSbEtUdGNibHgwWEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQWtMbTFoY0NodWIyUmxjeXdnWm5WdVkzUnBiMjRnS0c1dlpHVXBJSHRjYmx4MFhIUmNkRngwWEhSMllYSWdjMmxpYkdsdVozTWdQU0JrYjIwdWQybDBhRU5zYjNObGMzUlRhV0pzYVc1bmN5aHViMlJsTENCd2NtVmtLVHRjYmx4MFhIUmNkRngwWEhSMllYSWdhR1ZoWkNBOUlHeHBjM1F1YUdWaFpDaHphV0pzYVc1bmN5azdYRzVjZEZ4MFhIUmNkRngwZG1GeUlIUmhhV3h6SUQwZ2JHbHpkQzUwWVdsc0tITnBZbXhwYm1kektUdGNibHgwWEhSY2RGeDBYSFFrTG1WaFkyZ29kR0ZwYkhNc0lHWjFibU4wYVc5dUlDaHBaSGdzSUdWc1pXMHBJSHRjYmx4MFhIUmNkRngwWEhSY2RHUnZiUzVoY0hCbGJtUkRhR2xzWkU1dlpHVnpLR2hsWVdRc0lHVnNaVzB1WTJocGJHUk9iMlJsY3lrN1hHNWNkRngwWEhSY2RGeDBYSFJrYjIwdWNtVnRiM1psS0dWc1pXMHBPMXh1WEhSY2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQnNhWE4wTG1obFlXUW9jMmxpYkdsdVozTXBPMXh1WEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJ1YjJSbGN6dGNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2daMlYwSUdOMWNuSmxiblFnYzNSNWJHVWdiMjRnWTNWeWMyOXlYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxZHlZWEJ3WldSU1lXNW5aWDBnY201blhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0IwWVhKblpYUWdMU0IwWVhKblpYUWdaV3hsYldWdWRDQnZiaUJsZG1WdWRGeHVYSFJjZENBcUlFQnlaWFIxY200Z2UwOWlhbVZqZEgwZ0xTQnZZbXBsWTNRZ1kyOXVkR0ZwYm5NZ2MzUjViR1VnY0hKdmNHVnlkR2xsY3k1Y2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxtTjFjbkpsYm5RZ1BTQm1kVzVqZEdsdmJpQW9jbTVuTENCMFlYSm5aWFFwSUh0Y2JseDBYSFJjZEhaaGNpQWtZMjl1ZENBOUlDUW9aRzl0TG1selZHVjRkQ2h5Ym1jdWMyTXBJRDhnY201bkxuTmpMbkJoY21WdWRFNXZaR1VnT2lCeWJtY3VjMk1wTzF4dVhIUmNkRngwZG1GeUlIQnliM0JsY25ScFpYTWdQU0JiSjJadmJuUXRabUZ0YVd4NUp5d2dKMlp2Ym5RdGMybDZaU2NzSUNkMFpYaDBMV0ZzYVdkdUp5d2dKMnhwYzNRdGMzUjViR1V0ZEhsd1pTY3NJQ2RzYVc1bExXaGxhV2RvZENkZE8xeHVYSFJjZEZ4MGRtRnlJSE4wZVd4bFNXNW1ieUE5SUdwUmRXVnllVU5UVXlna1kyOXVkQ3dnY0hKdmNHVnlkR2xsY3lrZ2ZId2dlMzA3WEc1Y2JseDBYSFJjZEhOMGVXeGxTVzVtYjFzblptOXVkQzF6YVhwbEoxMGdQU0J3WVhKelpVbHVkQ2h6ZEhsc1pVbHVabTliSjJadmJuUXRjMmw2WlNkZExDQXhNQ2s3WEc1Y2JseDBYSFJjZEM4dklHUnZZM1Z0Wlc1MExuRjFaWEo1UTI5dGJXRnVaRk4wWVhSbElHWnZjaUIwYjJkbmJHVWdjM1JoZEdWY2JseDBYSFJjZEhOMGVXeGxTVzVtYjFzblptOXVkQzFpYjJ4a0oxMGdQU0JrYjJOMWJXVnVkQzV4ZFdWeWVVTnZiVzFoYm1SVGRHRjBaU2duWW05c1pDY3BJRDhnSjJKdmJHUW5JRG9nSjI1dmNtMWhiQ2M3WEc1Y2RGeDBYSFJ6ZEhsc1pVbHVabTliSjJadmJuUXRhWFJoYkdsakoxMGdQU0JrYjJOMWJXVnVkQzV4ZFdWeWVVTnZiVzFoYm1SVGRHRjBaU2duYVhSaGJHbGpKeWtnUHlBbmFYUmhiR2xqSnlBNklDZHViM0p0WVd3bk8xeHVYSFJjZEZ4MGMzUjViR1ZKYm1adld5ZG1iMjUwTFhWdVpHVnliR2x1WlNkZElEMGdaRzlqZFcxbGJuUXVjWFZsY25sRGIyMXRZVzVrVTNSaGRHVW9KM1Z1WkdWeWJHbHVaU2NwSUQ4Z0ozVnVaR1Z5YkdsdVpTY2dPaUFuYm05eWJXRnNKenRjYmx4MFhIUmNkSE4wZVd4bFNXNW1iMXNuWm05dWRDMXpkSEpwYTJWMGFISnZkV2RvSjEwZ1BTQmtiMk4xYldWdWRDNXhkV1Z5ZVVOdmJXMWhibVJUZEdGMFpTZ25jM1J5YVd0bFZHaHliM1ZuYUNjcElEOGdKM04wY21sclpYUm9jbTkxWjJnbklEb2dKMjV2Y20xaGJDYzdYRzVjZEZ4MFhIUnpkSGxzWlVsdVptOWJKMlp2Ym5RdGMzVndaWEp6WTNKcGNIUW5YU0E5SUdSdlkzVnRaVzUwTG5GMVpYSjVRMjl0YldGdVpGTjBZWFJsS0NkemRYQmxjbk5qY21sd2RDY3BJRDhnSjNOMWNHVnljMk55YVhCMEp5QTZJQ2R1YjNKdFlXd25PMXh1WEhSY2RGeDBjM1I1YkdWSmJtWnZXeWRtYjI1MExYTjFZbk5qY21sd2RDZGRJRDBnWkc5amRXMWxiblF1Y1hWbGNubERiMjF0WVc1a1UzUmhkR1VvSjNOMVluTmpjbWx3ZENjcElEOGdKM04xWW5OamNtbHdkQ2NnT2lBbmJtOXliV0ZzSnp0Y2JseHVYSFJjZEZ4MEx5OGdiR2x6ZEMxemRIbHNaUzEwZVhCbElIUnZJR3hwYzNRdGMzUjViR1VvZFc1dmNtUmxjbVZrTENCdmNtUmxjbVZrS1Z4dVhIUmNkRngwYVdZZ0tDRnlibWN1YVhOUGJreHBjM1FvS1NrZ2UxeHVYSFJjZEZ4MFhIUnpkSGxzWlVsdVptOWJKMnhwYzNRdGMzUjViR1VuWFNBOUlDZHViMjVsSnp0Y2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQmhUM0prWlhKbFpGUjVjR1VnUFNCYkoyTnBjbU5zWlNjc0lDZGthWE5qSnl3Z0oyUnBjMk10YkdWaFpHbHVaeTE2WlhKdkp5d2dKM054ZFdGeVpTZGRPMXh1WEhSY2RGeDBYSFIyWVhJZ2FYTlZibTl5WkdWeVpXUWdQU0FrTG1sdVFYSnlZWGtvYzNSNWJHVkpibVp2V3lkc2FYTjBMWE4wZVd4bExYUjVjR1VuWFN3Z1lVOXlaR1Z5WldSVWVYQmxLU0ErSUMweE8xeHVYSFJjZEZ4MFhIUnpkSGxzWlVsdVptOWJKMnhwYzNRdGMzUjViR1VuWFNBOUlHbHpWVzV2Y21SbGNtVmtJRDhnSjNWdWIzSmtaWEpsWkNjZ09pQW5iM0prWlhKbFpDYzdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSFpoY2lCd1lYSmhJRDBnWkc5dExtRnVZMlZ6ZEc5eUtISnVaeTV6WXl3Z1pHOXRMbWx6VUdGeVlTazdYRzVjZEZ4MFhIUnBaaUFvY0dGeVlTQW1KaUJ3WVhKaExuTjBlV3hsV3lkc2FXNWxMV2hsYVdkb2RDZGRLU0I3WEc1Y2RGeDBYSFJjZEhOMGVXeGxTVzVtYjFzbmJHbHVaUzFvWldsbmFIUW5YU0E5SUhCaGNtRXVjM1I1YkdVdWJHbHVaVWhsYVdkb2REdGNibHgwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RIWmhjaUJzYVc1bFNHVnBaMmgwSUQwZ2NHRnljMlZKYm5Rb2MzUjViR1ZKYm1adld5ZHNhVzVsTFdobGFXZG9kQ2RkTENBeE1Da2dMeUJ3WVhKelpVbHVkQ2h6ZEhsc1pVbHVabTliSjJadmJuUXRjMmw2WlNkZExDQXhNQ2s3WEc1Y2RGeDBYSFJjZEhOMGVXeGxTVzVtYjFzbmJHbHVaUzFvWldsbmFIUW5YU0E5SUd4cGJtVklaV2xuYUhRdWRHOUdhWGhsWkNneEtUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjM1I1YkdWSmJtWnZMbWx0WVdkbElEMGdaRzl0TG1selNXMW5LSFJoY21kbGRDa2dKaVlnZEdGeVoyVjBPMXh1WEhSY2RGeDBjM1I1YkdWSmJtWnZMbUZ1WTJodmNpQTlJSEp1Wnk1cGMwOXVRVzVqYUc5eUtDa2dKaVlnWkc5dExtRnVZMlZ6ZEc5eUtISnVaeTV6WXl3Z1pHOXRMbWx6UVc1amFHOXlLVHRjYmx4MFhIUmNkSE4wZVd4bFNXNW1ieTVoYm1ObGMzUnZjbk1nUFNCa2IyMHViR2x6ZEVGdVkyVnpkRzl5S0hKdVp5NXpZeXdnWkc5dExtbHpSV1JwZEdGaWJHVXBPMXh1WEhSY2RGeDBjM1I1YkdWSmJtWnZMbkpoYm1kbElEMGdjbTVuTzF4dVhHNWNkRngwWEhSeVpYUjFjbTRnYzNSNWJHVkpibVp2TzF4dVhIUmNkSDA3WEc1Y2RIMDdYRzVjYmx4dVhIUXZLaXBjYmx4MElDb2dRR05zWVhOeklHVmthWFJwYm1jdVZIbHdhVzVuWEc1Y2RDQXFYRzVjZENBcUlGUjVjR2x1WjF4dVhIUWdLbHh1WEhRZ0tpOWNibHgwZG1GeUlGUjVjR2x1WnlBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUdsdWMyVnlkQ0IwWVdKY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMWR5WVhCd1pXUlNZVzVuWlgwZ2NtNW5YRzVjZEZ4MElDb2dRSEJoY21GdElIdE9kVzFpWlhKOUlIUmhZbk5wZW1WY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxtbHVjMlZ5ZEZSaFlpQTlJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VzSUhKdVp5d2dkR0ZpYzJsNlpTa2dlMXh1WEhSY2RGeDBkbUZ5SUhSaFlpQTlJR1J2YlM1amNtVmhkR1ZVWlhoMEtHNWxkeUJCY25KaGVTaDBZV0p6YVhwbElDc2dNU2t1YW05cGJpaGtiMjB1VGtKVFVGOURTRUZTS1NrN1hHNWNkRngwWEhSeWJtY2dQU0J5Ym1jdVpHVnNaWFJsUTI5dWRHVnVkSE1vS1R0Y2JseDBYSFJjZEhKdVp5NXBibk5sY25ST2IyUmxLSFJoWWl3Z2RISjFaU2s3WEc1Y2JseDBYSFJjZEhKdVp5QTlJSEpoYm1kbExtTnlaV0YwWlNoMFlXSXNJSFJoWW5OcGVtVXBPMXh1WEhSY2RGeDBjbTVuTG5ObGJHVmpkQ2dwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCcGJuTmxjblFnY0dGeVlXZHlZWEJvWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1cGJuTmxjblJRWVhKaFozSmhjR2dnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUjJZWElnY201bklEMGdjbUZ1WjJVdVkzSmxZWFJsS0NrN1hHNWNibHgwWEhSY2RDOHZJR1JsYkdWMFpVTnZiblJsYm5SeklHOXVJSEpoYm1kbExseHVYSFJjZEZ4MGNtNW5JRDBnY201bkxtUmxiR1YwWlVOdmJuUmxiblJ6S0NrN1hHNWNibHgwWEhSY2RDOHZJRmR5WVhBZ2NtRnVaMlVnYVdZZ2FYUWdibVZsWkhNZ2RHOGdZbVVnZDNKaGNIQmxaQ0JpZVNCd1lYSmhaM0poY0doY2JseDBYSFJjZEhKdVp5QTlJSEp1Wnk1M2NtRndRbTlrZVVsdWJHbHVaVmRwZEdoUVlYSmhLQ2s3WEc1Y2JseDBYSFJjZEM4dklHWnBibVJwYm1jZ2NHRnlZV2R5WVhCb1hHNWNkRngwWEhSMllYSWdjM0JzYVhSU2IyOTBJRDBnWkc5dExtRnVZMlZ6ZEc5eUtISnVaeTV6WXl3Z1pHOXRMbWx6VUdGeVlTazdYRzVjYmx4MFhIUmNkSFpoY2lCdVpYaDBVR0Z5WVR0Y2JseDBYSFJjZEM4dklHOXVJSEJoY21GbmNtRndhRG9nYzNCc2FYUWdjR0Z5WVdkeVlYQm9YRzVjZEZ4MFhIUnBaaUFvYzNCc2FYUlNiMjkwS1NCN1hHNWNkRngwWEhSY2RHNWxlSFJRWVhKaElEMGdaRzl0TG5Od2JHbDBWSEpsWlNoemNHeHBkRkp2YjNRc0lISnVaeTVuWlhSVGRHRnlkRkJ2YVc1MEtDa3BPMXh1WEc1Y2RGeDBYSFJjZEhaaGNpQmxiWEIwZVVGdVkyaHZjbk1nUFNCa2IyMHViR2x6ZEVSbGMyTmxibVJoYm5Rb2MzQnNhWFJTYjI5MExDQmtiMjB1YVhORmJYQjBlVUZ1WTJodmNpazdYRzVjZEZ4MFhIUmNkR1Z0Y0hSNVFXNWphRzl5Y3lBOUlHVnRjSFI1UVc1amFHOXljeTVqYjI1allYUW9aRzl0TG14cGMzUkVaWE5qWlc1a1lXNTBLRzVsZUhSUVlYSmhMQ0JrYjIwdWFYTkZiWEIwZVVGdVkyaHZjaWtwTzF4dVhHNWNkRngwWEhSY2RDUXVaV0ZqYUNobGJYQjBlVUZ1WTJodmNuTXNJR1oxYm1OMGFXOXVJQ2hwWkhnc0lHRnVZMmh2Y2lrZ2UxeHVYSFJjZEZ4MFhIUmNkR1J2YlM1eVpXMXZkbVVvWVc1amFHOXlLVHRjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSY2RDOHZJRzV2SUhCaGNtRm5jbUZ3YURvZ2FXNXpaWEowSUdWdGNIUjVJSEJoY21GbmNtRndhRnh1WEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBkbUZ5SUc1bGVIUWdQU0J5Ym1jdWMyTXVZMmhwYkdST2IyUmxjMXR5Ym1jdWMyOWRPMXh1WEhSY2RGeDBYSFJ1WlhoMFVHRnlZU0E5SUNRb1pHOXRMbVZ0Y0hSNVVHRnlZU2xiTUYwN1hHNWNkRngwWEhSY2RHbG1JQ2h1WlhoMEtTQjdYRzVjZEZ4MFhIUmNkRngwY201bkxuTmpMbWx1YzJWeWRFSmxabTl5WlNodVpYaDBVR0Z5WVN3Z2JtVjRkQ2s3WEc1Y2RGeDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtNW5Mbk5qTG1Gd2NHVnVaRU5vYVd4a0tHNWxlSFJRWVhKaEtUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJ5WVc1blpTNWpjbVZoZEdVb2JtVjRkRkJoY21Fc0lEQXBMbTV2Y20xaGJHbDZaU2dwTG5ObGJHVmpkQ2dwTzF4dVhIUmNkSDA3WEc1Y2JseDBmVHRjYmx4dVhIUXZLaXBjYmx4MElDb2dRR05zWVhOeklHVmthWFJwYm1jdVZHRmliR1ZjYmx4MElDcGNibHgwSUNvZ1ZHRmliR1ZjYmx4MElDcGNibHgwSUNvdlhHNWNkSFpoY2lCVVlXSnNaU0E5SUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhRdktpcGNibHgwWEhRZ0tpQm9ZVzVrYkdVZ2RHRmlJR3RsZVZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRYY21Gd2NHVmtVbUZ1WjJWOUlISnVaMXh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRbTl2YkdWaGJuMGdhWE5UYUdsbWRGeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVkR0ZpSUQwZ1puVnVZM1JwYjI0Z0tISnVaeXdnYVhOVGFHbG1kQ2tnZTF4dVhIUmNkRngwZG1GeUlHTmxiR3dnUFNCa2IyMHVZVzVqWlhOMGIzSW9jbTVuTG1OdmJXMXZia0Z1WTJWemRHOXlLQ2tzSUdSdmJTNXBjME5sYkd3cE8xeHVYSFJjZEZ4MGRtRnlJSFJoWW14bElEMGdaRzl0TG1GdVkyVnpkRzl5S0dObGJHd3NJR1J2YlM1cGMxUmhZbXhsS1R0Y2JseDBYSFJjZEhaaGNpQmpaV3hzY3lBOUlHUnZiUzVzYVhOMFJHVnpZMlZ1WkdGdWRDaDBZV0pzWlN3Z1pHOXRMbWx6UTJWc2JDazdYRzVjYmx4MFhIUmNkSFpoY2lCdVpYaDBRMlZzYkNBOUlHeHBjM1JiYVhOVGFHbG1kQ0EvSUNkd2NtVjJKeUE2SUNkdVpYaDBKMTBvWTJWc2JITXNJR05sYkd3cE8xeHVYSFJjZEZ4MGFXWWdLRzVsZUhSRFpXeHNLU0I3WEc1Y2RGeDBYSFJjZEhKaGJtZGxMbU55WldGMFpTaHVaWGgwUTJWc2JDd2dNQ2t1YzJWc1pXTjBLQ2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUdOeVpXRjBaU0JsYlhCMGVTQjBZV0pzWlNCbGJHVnRaVzUwWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDUxYldKbGNuMGdjbTkzUTI5MWJuUmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNTFiV0psY24wZ1kyOXNRMjkxYm5SY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0T2IyUmxmVnh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11WTNKbFlYUmxWR0ZpYkdVZ1BTQm1kVzVqZEdsdmJpQW9ZMjlzUTI5MWJuUXNJSEp2ZDBOdmRXNTBLU0I3WEc1Y2RGeDBYSFIyWVhJZ2RHUnpJRDBnVzEwc0lIUmtTRlJOVER0Y2JseDBYSFJjZEdadmNpQW9kbUZ5SUdsa2VFTnZiQ0E5SURBN0lHbGtlRU52YkNBOElHTnZiRU52ZFc1ME95QnBaSGhEYjJ3ckt5a2dlMXh1WEhSY2RGeDBYSFIwWkhNdWNIVnphQ2duUEhSa1BpY2dLeUJrYjIwdVlteGhibXNnS3lBblBDOTBaRDRuS1R0Y2JseDBYSFJjZEgxY2JseDBYSFJjZEhSa1NGUk5UQ0E5SUhSa2N5NXFiMmx1S0NjbktUdGNibHh1WEhSY2RGeDBkbUZ5SUhSeWN5QTlJRnRkTENCMGNraFVUVXc3WEc1Y2RGeDBYSFJtYjNJZ0tIWmhjaUJwWkhoU2IzY2dQU0F3T3lCcFpIaFNiM2NnUENCeWIzZERiM1Z1ZERzZ2FXUjRVbTkzS3lzcElIdGNibHgwWEhSY2RGeDBkSEp6TG5CMWMyZ29KengwY2o0bklDc2dkR1JJVkUxTUlDc2dKend2ZEhJK0p5azdYRzVjZEZ4MFhIUjlYRzVjZEZ4MFhIUjBja2hVVFV3Z1BTQjBjbk11YW05cGJpZ25KeWs3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdKQ2duUEhSaFlteGxJR05zWVhOelBWd2lkR0ZpYkdVZ2RHRmliR1V0WW05eVpHVnlaV1JjSWo0bklDc2dkSEpJVkUxTUlDc2dKend2ZEdGaWJHVStKeWxiTUYwN1hHNWNkRngwZlR0Y2JseDBmVHRjYmx4dVhHNWNkQzhxS2x4dVhIUWdLaUJBWTJ4aGMzTWdaV1JwZEdsdVp5NUNkV3hzWlhSY2JseDBJQ3BjYmx4MElDb2dRR0ZzZEdWeWJtRjBaVU5zWVhOelRtRnRaU0JDZFd4c1pYUmNibHgwSUNvdlhHNWNkSFpoY2lCQ2RXeHNaWFFnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnBibk5sY25SUGNtUmxjbVZrVEdsemRGeHVYSFJjZENBcVhHNWNkRngwSUNvZ2RHOW5aMnhsSUc5eVpHVnlaV1FnYkdsemRGeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIUjVjR1VnWTI5dGJXRnVaRnh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11YVc1elpYSjBUM0prWlhKbFpFeHBjM1FnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUjBhR2x6TG5SdloyZHNaVXhwYzNRb0owOU1KeWs3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnYVc1elpYSjBWVzV2Y21SbGNtVmtUR2x6ZEZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nZEc5bloyeGxJSFZ1YjNKa1pYSmxaQ0JzYVhOMFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWRIbHdaU0JqYjIxdFlXNWtYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTVwYm5ObGNuUlZibTl5WkdWeVpXUk1hWE4wSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBkR2hwY3k1MGIyZG5iR1ZNYVhOMEtDZFZUQ2NwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUdsdVpHVnVkRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dhVzVrWlc1MFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWRIbHdaU0JqYjIxdFlXNWtYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTVwYm1SbGJuUWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSMllYSWdjMlZzWmlBOUlIUm9hWE03WEc1Y2RGeDBYSFIyWVhJZ2NtNW5JRDBnY21GdVoyVXVZM0psWVhSbEtDa3VkM0poY0VKdlpIbEpibXhwYm1WWGFYUm9VR0Z5WVNncE8xeHVYRzVjZEZ4MFhIUjJZWElnY0dGeVlYTWdQU0J5Ym1jdWJtOWtaWE1vWkc5dExtbHpVR0Z5WVN3Z2V5QnBibU5zZFdSbFFXNWpaWE4wYjNJNklIUnlkV1VnZlNrN1hHNWNkRngwWEhSMllYSWdZMngxYzNSbGNtVmtjeUE5SUd4cGMzUXVZMngxYzNSbGNrSjVLSEJoY21GekxDQm1kVzVqTG5CbGNUSW9KM0JoY21WdWRFNXZaR1VuS1NrN1hHNWNibHgwWEhSY2RDUXVaV0ZqYUNoamJIVnpkR1Z5WldSekxDQm1kVzVqZEdsdmJpQW9hV1I0TENCd1lYSmhjeWtnZTF4dVhIUmNkRngwWEhSMllYSWdhR1ZoWkNBOUlHeHBjM1F1YUdWaFpDaHdZWEpoY3lrN1hHNWNkRngwWEhSY2RHbG1JQ2hrYjIwdWFYTk1hU2hvWldGa0tTa2dlMXh1WEhSY2RGeDBYSFJjZEhObGJHWXVkM0poY0V4cGMzUW9jR0Z5WVhNc0lHaGxZV1F1Y0dGeVpXNTBUbTlrWlM1dWIyUmxUbUZ0WlNrN1hHNWNkRngwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RGeDBKQzVsWVdOb0tIQmhjbUZ6TENCbWRXNWpkR2x2YmlBb2FXUjRMQ0J3WVhKaEtTQjdYRzVjZEZ4MFhIUmNkRngwWEhRa0tIQmhjbUVwTG1OemN5Z25iV0Z5WjJsdVRHVm1kQ2NzSUdaMWJtTjBhVzl1SUNocFpIZ3NJSFpoYkNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSeVpYUjFjbTRnS0hCaGNuTmxTVzUwS0haaGJDd2dNVEFwSUh4OElEQXBJQ3NnTWpVN1hHNWNkRngwWEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RISnVaeTV6Wld4bFkzUW9LVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0J2ZFhSa1pXNTBYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQnZkWFJrWlc1MFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWRIbHdaU0JqYjIxdFlXNWtYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTV2ZFhSa1pXNTBJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MGRtRnlJSE5sYkdZZ1BTQjBhR2x6TzF4dVhIUmNkRngwZG1GeUlISnVaeUE5SUhKaGJtZGxMbU55WldGMFpTZ3BMbmR5WVhCQ2IyUjVTVzVzYVc1bFYybDBhRkJoY21Fb0tUdGNibHh1WEhSY2RGeDBkbUZ5SUhCaGNtRnpJRDBnY201bkxtNXZaR1Z6S0dSdmJTNXBjMUJoY21Fc0lIc2dhVzVqYkhWa1pVRnVZMlZ6ZEc5eU9pQjBjblZsSUgwcE8xeHVYSFJjZEZ4MGRtRnlJR05zZFhOMFpYSmxaSE1nUFNCc2FYTjBMbU5zZFhOMFpYSkNlU2h3WVhKaGN5d2dablZ1WXk1d1pYRXlLQ2R3WVhKbGJuUk9iMlJsSnlrcE8xeHVYRzVjZEZ4MFhIUWtMbVZoWTJnb1kyeDFjM1JsY21Wa2N5d2dablZ1WTNScGIyNGdLR2xrZUN3Z2NHRnlZWE1wSUh0Y2JseDBYSFJjZEZ4MGRtRnlJR2hsWVdRZ1BTQnNhWE4wTG1obFlXUW9jR0Z5WVhNcE8xeHVYSFJjZEZ4MFhIUnBaaUFvWkc5dExtbHpUR2tvYUdWaFpDa3BJSHRjYmx4MFhIUmNkRngwWEhSelpXeG1MbkpsYkdWaGMyVk1hWE4wS0Z0d1lYSmhjMTBwTzF4dVhIUmNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSY2RDUXVaV0ZqYUNod1lYSmhjeXdnWm5WdVkzUnBiMjRnS0dsa2VDd2djR0Z5WVNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwSkNod1lYSmhLUzVqYzNNb0oyMWhjbWRwYmt4bFpuUW5MQ0JtZFc1amRHbHZiaUFvYVdSNExDQjJZV3dwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwZG1Gc0lEMGdLSEJoY25ObFNXNTBLSFpoYkN3Z01UQXBJSHg4SURBcE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSeVpYUjFjbTRnZG1Gc0lENGdNalVnUHlCMllXd2dMU0F5TlNBNklDY25PMXh1WEhSY2RGeDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMHBPMXh1WEc1Y2RGeDBYSFJ5Ym1jdWMyVnNaV04wS0NrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQnRaWFJvYjJRZ2RHOW5aMnhsVEdsemRGeHVYSFJjZENBcVhHNWNkRngwSUNvZ2RHOW5aMnhsSUd4cGMzUmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCc2FYTjBUbUZ0WlNBdElFOU1JRzl5SUZWTVhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NTBiMmRuYkdWTWFYTjBJRDBnWm5WdVkzUnBiMjRnS0d4cGMzUk9ZVzFsS1NCN1hHNWNkRngwWEhSMllYSWdjMlZzWmlBOUlIUm9hWE03WEc1Y2RGeDBYSFIyWVhJZ2NtNW5JRDBnY21GdVoyVXVZM0psWVhSbEtDa3VkM0poY0VKdlpIbEpibXhwYm1WWGFYUm9VR0Z5WVNncE8xeHVYRzVjZEZ4MFhIUjJZWElnY0dGeVlYTWdQU0J5Ym1jdWJtOWtaWE1vWkc5dExtbHpVR0Z5WVN3Z2V5QnBibU5zZFdSbFFXNWpaWE4wYjNJNklIUnlkV1VnZlNrN1hHNWNkRngwWEhSMllYSWdZbTl2YTIxaGNtc2dQU0J5Ym1jdWNHRnlZVUp2YjJ0dFlYSnJLSEJoY21GektUdGNibHgwWEhSY2RIWmhjaUJqYkhWemRHVnlaV1J6SUQwZ2JHbHpkQzVqYkhWemRHVnlRbmtvY0dGeVlYTXNJR1oxYm1NdWNHVnhNaWduY0dGeVpXNTBUbTlrWlNjcEtUdGNibHh1WEhSY2RGeDBMeThnY0dGeVlXZHlZWEJvSUhSdklHeHBjM1JjYmx4MFhIUmNkR2xtSUNoc2FYTjBMbVpwYm1Rb2NHRnlZWE1zSUdSdmJTNXBjMUIxY21WUVlYSmhLU2tnZTF4dVhIUmNkRngwWEhSMllYSWdkM0poY0hCbFpGQmhjbUZ6SUQwZ1cxMDdYRzVjZEZ4MFhIUmNkQ1F1WldGamFDaGpiSFZ6ZEdWeVpXUnpMQ0JtZFc1amRHbHZiaUFvYVdSNExDQndZWEpoY3lrZ2UxeHVYSFJjZEZ4MFhIUmNkSGR5WVhCd1pXUlFZWEpoY3lBOUlIZHlZWEJ3WldSUVlYSmhjeTVqYjI1allYUW9jMlZzWmk1M2NtRndUR2x6ZENod1lYSmhjeXdnYkdsemRFNWhiV1VwS1R0Y2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkSEJoY21GeklEMGdkM0poY0hCbFpGQmhjbUZ6TzF4dVhIUmNkRngwWEhRdkx5QnNhWE4wSUhSdklIQmhjbUZuY21Gd2FDQnZjaUJqYUdGdVoyVWdiR2x6ZENCemRIbHNaVnh1WEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBkbUZ5SUdScFptWk1hWE4wY3lBOUlISnVaeTV1YjJSbGN5aGtiMjB1YVhOTWFYTjBMQ0I3WEc1Y2RGeDBYSFJjZEZ4MGFXNWpiSFZrWlVGdVkyVnpkRzl5T2lCMGNuVmxYRzVjZEZ4MFhIUmNkSDBwTG1acGJIUmxjaWhtZFc1amRHbHZiaUFvYkdsemRFNXZaR1VwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z0lTUXVibTlrWlU1aGJXVW9iR2x6ZEU1dlpHVXNJR3hwYzNST1lXMWxLVHRjYmx4MFhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RGeDBhV1lnS0dScFptWk1hWE4wY3k1c1pXNW5kR2dwSUh0Y2JseDBYSFJjZEZ4MFhIUWtMbVZoWTJnb1pHbG1aa3hwYzNSekxDQm1kVzVqZEdsdmJpQW9hV1I0TENCc2FYTjBUbTlrWlNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWkc5dExuSmxjR3hoWTJVb2JHbHpkRTV2WkdVc0lHeHBjM1JPWVcxbEtUdGNibHgwWEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUndZWEpoY3lBOUlIUm9hWE11Y21Wc1pXRnpaVXhwYzNRb1kyeDFjM1JsY21Wa2N5d2dkSEoxWlNrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjbUZ1WjJVdVkzSmxZWFJsUm5KdmJWQmhjbUZDYjI5cmJXRnlheWhpYjI5cmJXRnlheXdnY0dGeVlYTXBMbk5sYkdWamRDZ3BPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJSGR5WVhCTWFYTjBYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1ZiWFgwZ2NHRnlZWE5jYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdiR2x6ZEU1aGJXVmNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdE9iMlJsVzExOVhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NTNjbUZ3VEdsemRDQTlJR1oxYm1OMGFXOXVJQ2h3WVhKaGN5d2diR2x6ZEU1aGJXVXBJSHRjYmx4MFhIUmNkSFpoY2lCb1pXRmtJRDBnYkdsemRDNW9aV0ZrS0hCaGNtRnpLVHRjYmx4MFhIUmNkSFpoY2lCc1lYTjBJRDBnYkdsemRDNXNZWE4wS0hCaGNtRnpLVHRjYmx4dVhIUmNkRngwZG1GeUlIQnlaWFpNYVhOMElEMGdaRzl0TG1selRHbHpkQ2hvWldGa0xuQnlaWFpwYjNWelUybGliR2x1WnlrZ0ppWWdhR1ZoWkM1d2NtVjJhVzkxYzFOcFlteHBibWM3WEc1Y2RGeDBYSFIyWVhJZ2JtVjRkRXhwYzNRZ1BTQmtiMjB1YVhOTWFYTjBLR3hoYzNRdWJtVjRkRk5wWW14cGJtY3BJQ1ltSUd4aGMzUXVibVY0ZEZOcFlteHBibWM3WEc1Y2JseDBYSFJjZEhaaGNpQnNhWE4wVG05a1pTQTlJSEJ5WlhaTWFYTjBJSHg4SUdSdmJTNXBibk5sY25SQlpuUmxjaWhrYjIwdVkzSmxZWFJsS0d4cGMzUk9ZVzFsSUh4OElDZFZUQ2NwTENCc1lYTjBLVHRjYmx4dVhIUmNkRngwTHk4Z1VDQjBieUJNU1Z4dVhIUmNkRngwY0dGeVlYTWdQU0FrTG0xaGNDaHdZWEpoY3l3Z1puVnVZM1JwYjI0Z0tIQmhjbUVwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUdSdmJTNXBjMUIxY21WUVlYSmhLSEJoY21FcElEOGdaRzl0TG5KbGNHeGhZMlVvY0dGeVlTd2dKMHhKSnlrZ09pQndZWEpoTzF4dVhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RDOHZJR0Z3Y0dWdVpDQjBieUJzYVhOMEtEeDFiRDRzSUR4dmJENHBYRzVjZEZ4MFhIUmtiMjB1WVhCd1pXNWtRMmhwYkdST2IyUmxjeWhzYVhOMFRtOWtaU3dnY0dGeVlYTXBPMXh1WEc1Y2RGeDBYSFJwWmlBb2JtVjRkRXhwYzNRcElIdGNibHgwWEhSY2RGeDBaRzl0TG1Gd2NHVnVaRU5vYVd4a1RtOWtaWE1vYkdsemRFNXZaR1VzSUd4cGMzUXVabkp2YlNodVpYaDBUR2x6ZEM1amFHbHNaRTV2WkdWektTazdYRzVjZEZ4MFhIUmNkR1J2YlM1eVpXMXZkbVVvYm1WNGRFeHBjM1FwTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSeVpYUjFjbTRnY0dGeVlYTTdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUJ0WlhSb2IyUWdjbVZzWldGelpVeHBjM1JjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRWEp5WVhsYlhYMGdZMngxYzNSbGNtVmtjMXh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRbTl2YkdWaGJuMGdhWE5GYzJOaGNITmxWRzlDYjJSNVhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1RtOWtaVnRkZlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdWNtVnNaV0Z6WlV4cGMzUWdQU0JtZFc1amRHbHZiaUFvWTJ4MWMzUmxjbVZrY3l3Z2FYTkZjMk5oY0hObFZHOUNiMlI1S1NCN1hHNWNkRngwWEhSMllYSWdjbVZzWldGelpXUlFZWEpoY3lBOUlGdGRPMXh1WEc1Y2RGeDBYSFFrTG1WaFkyZ29ZMngxYzNSbGNtVmtjeXdnWm5WdVkzUnBiMjRnS0dsa2VDd2djR0Z5WVhNcElIdGNibHgwWEhSY2RGeDBkbUZ5SUdobFlXUWdQU0JzYVhOMExtaGxZV1FvY0dGeVlYTXBPMXh1WEhSY2RGeDBYSFIyWVhJZ2JHRnpkQ0E5SUd4cGMzUXViR0Z6ZENod1lYSmhjeWs3WEc1Y2JseDBYSFJjZEZ4MGRtRnlJR2hsWVdSTWFYTjBJRDBnYVhORmMyTmhjSE5sVkc5Q2IyUjVJRDhnWkc5dExteGhjM1JCYm1ObGMzUnZjaWhvWldGa0xDQmtiMjB1YVhOTWFYTjBLU0E2WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFFnYUdWaFpDNXdZWEpsYm5ST2IyUmxPMXh1WEhSY2RGeDBYSFIyWVhJZ2JHRnpkRXhwYzNRZ1BTQm9aV0ZrVEdsemRDNWphR2xzWkU1dlpHVnpMbXhsYm1kMGFDQStJREVnUHlCa2IyMHVjM0JzYVhSVWNtVmxLR2hsWVdSTWFYTjBMQ0I3WEc1Y2RGeDBYSFJjZEZ4MGJtOWtaVG9nYkdGemRDNXdZWEpsYm5ST2IyUmxMRnh1WEhSY2RGeDBYSFJjZEc5bVpuTmxkRG9nWkc5dExuQnZjMmwwYVc5dUtHeGhjM1FwSUNzZ01WeHVYSFJjZEZ4MFhIUjlMQ0IwY25WbEtTQTZJRzUxYkd3N1hHNWNibHgwWEhSY2RGeDBkbUZ5SUcxcFpHUnNaVXhwYzNRZ1BTQmtiMjB1YzNCc2FYUlVjbVZsS0dobFlXUk1hWE4wTENCN1hHNWNkRngwWEhSY2RGeDBibTlrWlRvZ2FHVmhaQzV3WVhKbGJuUk9iMlJsTEZ4dVhIUmNkRngwWEhSY2RHOW1abk5sZERvZ1pHOXRMbkJ2YzJsMGFXOXVLR2hsWVdRcFhHNWNkRngwWEhSY2RIMHNJSFJ5ZFdVcE8xeHVYRzVjZEZ4MFhIUmNkSEJoY21GeklEMGdhWE5GYzJOaGNITmxWRzlDYjJSNUlEOGdaRzl0TG14cGMzUkVaWE5qWlc1a1lXNTBLRzFwWkdSc1pVeHBjM1FzSUdSdmJTNXBjMHhwS1NBNlhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkQ0FnYkdsemRDNW1jbTl0S0cxcFpHUnNaVXhwYzNRdVkyaHBiR1JPYjJSbGN5a3VabWxzZEdWeUtHUnZiUzVwYzB4cEtUdGNibHh1WEhSY2RGeDBYSFF2THlCTVNTQjBieUJRWEc1Y2RGeDBYSFJjZEdsbUlDaHBjMFZ6WTJGd2MyVlViMEp2WkhrZ2ZId2dJV1J2YlM1cGMweHBjM1FvYUdWaFpFeHBjM1F1Y0dGeVpXNTBUbTlrWlNrcElIdGNibHgwWEhSY2RGeDBYSFJ3WVhKaGN5QTlJQ1F1YldGd0tIQmhjbUZ6TENCbWRXNWpkR2x2YmlBb2NHRnlZU2tnZTF4dVhIUmNkRngwWEhSY2RGeDBjbVYwZFhKdUlHUnZiUzV5WlhCc1lXTmxLSEJoY21Fc0lDZFFKeWs3WEc1Y2RGeDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhRa0xtVmhZMmdvYkdsemRDNW1jbTl0S0hCaGNtRnpLUzV5WlhabGNuTmxLQ2tzSUdaMWJtTjBhVzl1SUNocFpIZ3NJSEJoY21FcElIdGNibHgwWEhSY2RGeDBYSFJrYjIwdWFXNXpaWEowUVdaMFpYSW9jR0Z5WVN3Z2FHVmhaRXhwYzNRcE8xeHVYSFJjZEZ4MFhIUjlLVHRjYmx4dVhIUmNkRngwWEhRdkx5QnlaVzF2ZG1VZ1pXMXdkSGtnYkdsemRITmNibHgwWEhSY2RGeDBkbUZ5SUhKdmIzUk1hWE4wY3lBOUlHeHBjM1F1WTI5dGNHRmpkQ2hiYUdWaFpFeHBjM1FzSUcxcFpHUnNaVXhwYzNRc0lHeGhjM1JNYVhOMFhTazdYRzVjZEZ4MFhIUmNkQ1F1WldGamFDaHliMjkwVEdsemRITXNJR1oxYm1OMGFXOXVJQ2hwWkhnc0lISnZiM1JNYVhOMEtTQjdYRzVjZEZ4MFhIUmNkRngwZG1GeUlHeHBjM1JPYjJSbGN5QTlJRnR5YjI5MFRHbHpkRjB1WTI5dVkyRjBLR1J2YlM1c2FYTjBSR1Z6WTJWdVpHRnVkQ2h5YjI5MFRHbHpkQ3dnWkc5dExtbHpUR2x6ZENrcE8xeHVYSFJjZEZ4MFhIUmNkQ1F1WldGamFDaHNhWE4wVG05a1pYTXVjbVYyWlhKelpTZ3BMQ0JtZFc1amRHbHZiaUFvYVdSNExDQnNhWE4wVG05a1pTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGFXWWdLQ0ZrYjIwdWJtOWtaVXhsYm1kMGFDaHNhWE4wVG05a1pTa3BJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBaRzl0TG5KbGJXOTJaU2hzYVhOMFRtOWtaU3dnZEhKMVpTazdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJjZEgwcE8xeHVYRzVjZEZ4MFhIUmNkSEpsYkdWaGMyVmtVR0Z5WVhNZ1BTQnlaV3hsWVhObFpGQmhjbUZ6TG1OdmJtTmhkQ2h3WVhKaGN5azdYRzVjZEZ4MFhIUjlLVHRjYmx4dVhIUmNkRngwY21WMGRYSnVJSEpsYkdWaGMyVmtVR0Z5WVhNN1hHNWNkRngwZlR0Y2JseDBmVHRjYmx4dVhIUXZLaXBjYmx4MElDb2dRR05zWVhOeklHVmthWFJwYm1jdVJXUnBkRzl5WEc1Y2RDQXFYRzVjZENBcUlFVmthWFJ2Y2x4dVhIUWdLbHh1WEhRZ0tpOWNibHgwZG1GeUlFVmthWFJ2Y2lBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4dVhIUmNkSFpoY2lCemRIbHNaU0E5SUc1bGR5QlRkSGxzWlNncE8xeHVYSFJjZEhaaGNpQjBZV0pzWlNBOUlHNWxkeUJVWVdKc1pTZ3BPMXh1WEhSY2RIWmhjaUIwZVhCcGJtY2dQU0J1WlhjZ1ZIbHdhVzVuS0NrN1hHNWNkRngwZG1GeUlHSjFiR3hsZENBOUlHNWxkeUJDZFd4c1pYUW9LVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnWTNKbFlYUmxVbUZ1WjJWY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUdOeVpXRjBaU0J5WVc1blpWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSbFpHbDBZV0pzWlZ4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTFkeVlYQndaV1JTWVc1blpYMWNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbU55WldGMFpWSmhibWRsSUQwZ1puVnVZM1JwYjI0Z0tDUmxaR2wwWVdKc1pTa2dlMXh1WEhSY2RGeDBKR1ZrYVhSaFlteGxMbVp2WTNWektDazdYRzVjZEZ4MFhIUnlaWFIxY200Z2NtRnVaMlV1WTNKbFlYUmxLQ2s3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnYzJGMlpWSmhibWRsWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJ6WVhabElHTjFjbkpsYm5RZ2NtRnVaMlZjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwSnZiMnhsWVc1OUlGdDBhR1Z1UTI5c2JHRndjMlU5Wm1Gc2MyVmRYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTV6WVhabFVtRnVaMlVnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bExDQjBhR1Z1UTI5c2JHRndjMlVwSUh0Y2JseDBYSFJjZENSbFpHbDBZV0pzWlM1bWIyTjFjeWdwTzF4dVhIUmNkRngwSkdWa2FYUmhZbXhsTG1SaGRHRW9KM0poYm1kbEp5d2djbUZ1WjJVdVkzSmxZWFJsS0NrcE8xeHVYSFJjZEZ4MGFXWWdLSFJvWlc1RGIyeHNZWEJ6WlNrZ2UxeHVYSFJjZEZ4MFhIUnlZVzVuWlM1amNtVmhkR1VvS1M1amIyeHNZWEJ6WlNncExuTmxiR1ZqZENncE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lITmhkbVZTWVc1blpWeHVYSFJjZENBcVhHNWNkRngwSUNvZ2MyRjJaU0JqZFhKeVpXNTBJRzV2WkdVZ2JHbHpkQ0IwYnlBa1pXUnBkR0ZpYkdVdVpHRjBZU2duWTJocGJHUk9iMlJsY3ljcFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1ellYWmxUbTlrWlNBOUlHWjFibU4wYVc5dUlDZ2taV1JwZEdGaWJHVXBJSHRjYmx4MFhIUmNkQzh2SUdOdmNIa2dZMmhwYkdRZ2JtOWtaU0J5WldabGNtVnVZMlZjYmx4MFhIUmNkSFpoY2lCamIzQjVJRDBnVzEwN1hHNWNkRngwWEhSbWIzSWdLSFpoY2lCclpYa2dQU0F3TENCc1pXNGdQU0FrWldScGRHRmliR1ZiTUYwdVkyaHBiR1JPYjJSbGN5NXNaVzVuZEdnN0lHdGxlU0E4SUd4bGJqc2dhMlY1S3lzcElIdGNibHgwWEhSY2RGeDBZMjl3ZVM1d2RYTm9LQ1JsWkdsMFlXSnNaVnN3WFM1amFHbHNaRTV2WkdWelcydGxlVjBwTzF4dVhIUmNkRngwZlZ4dVhIUmNkRngwSkdWa2FYUmhZbXhsTG1SaGRHRW9KMk5vYVd4a1RtOWtaWE1uTENCamIzQjVLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0J5WlhOMGIzSmxVbUZ1WjJWY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUhKbGMzUnZjbVVnYkdGMFpXeDVJSEpoYm1kbFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1eVpYTjBiM0psVW1GdVoyVWdQU0JtZFc1amRHbHZiaUFvSkdWa2FYUmhZbXhsS1NCN1hHNWNkRngwWEhSMllYSWdjbTVuSUQwZ0pHVmthWFJoWW14bExtUmhkR0VvSjNKaGJtZGxKeWs3WEc1Y2RGeDBYSFJwWmlBb2NtNW5LU0I3WEc1Y2RGeDBYSFJjZEhKdVp5NXpaV3hsWTNRb0tUdGNibHgwWEhSY2RGeDBKR1ZrYVhSaFlteGxMbVp2WTNWektDazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUJ0WlhSb2IyUWdjbVZ6ZEc5eVpVNXZaR1ZjYmx4MFhIUWdLbHh1WEhSY2RDQXFJSEpsYzNSdmNtVWdiR0YwWld4NUlHNXZaR1VnYkdsemRGeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSbFpHbDBZV0pzWlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdWNtVnpkRzl5WlU1dlpHVWdQU0JtZFc1amRHbHZiaUFvSkdWa2FYUmhZbXhsS1NCN1hHNWNkRngwWEhRa1pXUnBkR0ZpYkdVdWFIUnRiQ2duSnlrN1hHNWNkRngwWEhSMllYSWdZMmhwYkdRZ1BTQWtaV1JwZEdGaWJHVXVaR0YwWVNnblkyaHBiR1JPYjJSbGN5Y3BPMXh1WEhSY2RGeDBabTl5SUNoMllYSWdhVzVrWlhnZ1BTQXdMQ0JzWlc0Z1BTQmphR2xzWkM1c1pXNW5kR2c3SUdsdVpHVjRJRHdnYkdWdU95QnBibVJsZUNzcktTQjdYRzVjZEZ4MFhIUmNkQ1JsWkdsMFlXSnNaVnN3WFM1aGNIQmxibVJEYUdsc1pDaGphR2xzWkZ0cGJtUmxlRjBwTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDA3WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0JqZFhKeVpXNTBVM1I1YkdWY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUdOMWNuSmxiblFnYzNSNWJHVmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1RtOWtaWDBnZEdGeVoyVjBYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdRbTl2YkdWaGJuMGdabUZzYzJVZ2FXWWdjbUZ1WjJVZ2FYTWdibTljYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG1OMWNuSmxiblJUZEhsc1pTQTlJR1oxYm1OMGFXOXVJQ2gwWVhKblpYUXBJSHRjYmx4MFhIUmNkSFpoY2lCeWJtY2dQU0J5WVc1blpTNWpjbVZoZEdVb0tUdGNibHgwWEhSY2RISmxkSFZ5YmlCeWJtY2dQeUJ5Ym1jdWFYTlBia1ZrYVhSaFlteGxLQ2tnSmlZZ2MzUjViR1V1WTNWeWNtVnVkQ2h5Ym1jc0lIUmhjbWRsZENrZ09pQm1ZV3h6WlR0Y2JseDBYSFI5TzF4dVhHNWNkRngwZG1GeUlIUnlhV2RuWlhKUGJrSmxabTl5WlVOb1lXNW5aU0E5SUhSb2FYTXVkSEpwWjJkbGNrOXVRbVZtYjNKbFEyaGhibWRsSUQwZ1puVnVZM1JwYjI0Z0tDUmxaR2wwWVdKc1pTa2dlMXh1WEhSY2RGeDBkbUZ5SUc5dVFtVm1iM0psUTJoaGJtZGxJRDBnSkdWa2FYUmhZbXhsTG1SaGRHRW9KMk5oYkd4aVlXTnJjeWNwTG05dVFtVm1iM0psUTJoaGJtZGxPMXh1WEhSY2RGeDBhV1lnS0c5dVFtVm1iM0psUTJoaGJtZGxLU0I3WEc1Y2RGeDBYSFJjZEc5dVFtVm1iM0psUTJoaGJtZGxLQ1JsWkdsMFlXSnNaUzVvZEcxc0tDa3NJQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVHRjYmx4dVhIUmNkSFpoY2lCMGNtbG5aMlZ5VDI1RGFHRnVaMlVnUFNCMGFHbHpMblJ5YVdkblpYSlBia05vWVc1blpTQTlJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VwSUh0Y2JseDBYSFJjZEhaaGNpQnZia05vWVc1blpTQTlJQ1JsWkdsMFlXSnNaUzVrWVhSaEtDZGpZV3hzWW1GamEzTW5LUzV2YmtOb1lXNW5aVHRjYmx4MFhIUmNkR2xtSUNodmJrTm9ZVzVuWlNrZ2UxeHVYSFJjZEZ4MFhIUnZia05vWVc1blpTZ2taV1JwZEdGaWJHVXVhSFJ0YkNncExDQWtaV1JwZEdGaWJHVXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJSFZ1Wkc5Y2JseDBYSFFnS2lCMWJtUnZYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVkVzVrYnlBOUlHWjFibU4wYVc5dUlDZ2taV1JwZEdGaWJHVXBJSHRjYmx4MFhIUmNkSFJ5YVdkblpYSlBia0psWm05eVpVTm9ZVzVuWlNna1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEZ4MEpHVmthWFJoWW14bExtUmhkR0VvSjA1dmRHVklhWE4wYjNKNUp5a3VkVzVrYnlncE8xeHVYSFJjZEZ4MGRISnBaMmRsY2s5dVEyaGhibWRsS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQnRaWFJvYjJRZ2NtVmtiMXh1WEhSY2RDQXFJSEpsWkc5Y2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1eVpXUnZJRDBnWm5WdVkzUnBiMjRnS0NSbFpHbDBZV0pzWlNrZ2UxeHVYSFJjZEZ4MGRISnBaMmRsY2s5dVFtVm1iM0psUTJoaGJtZGxLQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFFrWldScGRHRmliR1V1WkdGMFlTZ25UbTkwWlVocGMzUnZjbmtuS1M1eVpXUnZLQ2s3WEc1Y2RGeDBYSFIwY21sbloyVnlUMjVEYUdGdVoyVW9KR1ZrYVhSaFlteGxLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0JpWldadmNtVkRiMjF0WVc1a1hHNWNkRngwSUNvZ1ltVm1iM0psSUdOdmJXMWhibVJjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1ZrYVhSaFlteGxYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR0psWm05eVpVTnZiVzFoYm1RZ1BTQjBhR2x6TG1KbFptOXlaVU52YlcxaGJtUWdQU0JtZFc1amRHbHZiaUFvSkdWa2FYUmhZbXhsS1NCN1hHNWNkRngwWEhSMGNtbG5aMlZ5VDI1Q1pXWnZjbVZEYUdGdVoyVW9KR1ZrYVhSaFlteGxLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0JoWm5SbGNrTnZiVzFoYm1SY2JseDBYSFFnS2lCaFpuUmxjaUJqYjIxdFlXNWtYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQmhablJsY2tOdmJXMWhibVFnUFNCMGFHbHpMbUZtZEdWeVEyOXRiV0Z1WkNBOUlHWjFibU4wYVc5dUlDZ2taV1JwZEdGaWJHVXBJSHRjYmx4MFhIUmNkQ1JsWkdsMFlXSnNaUzVrWVhSaEtDZE9iM1JsU0dsemRHOXllU2NwTG5KbFkyOXlaRlZ1Wkc4b0tUdGNibHgwWEhSY2RIUnlhV2RuWlhKUGJrTm9ZVzVuWlNna1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lHSnZiR1JjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1ZrYVhSaFlteGxYRzVjZEZ4MElDb2dRSEJoY21GdElIdE5hWGhsWkgwZ2RtRnNkV1ZjYmx4MFhIUWdLaTljYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnYVhSaGJHbGpYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1RXbDRaV1I5SUhaaGJIVmxYRzVjZEZ4MElDb3ZYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJSFZ1WkdWeWJHbHVaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwMXBlR1ZrZlNCMllXeDFaVnh1WEhSY2RDQXFMMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0J6ZEhKcGEyVjBhSEp2ZFdkb1hHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSbFpHbDBZV0pzWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VFdsNFpXUjlJSFpoYkhWbFhHNWNkRngwSUNvdlhHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lHWnZjbTFoZEVKc2IyTnJYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1RXbDRaV1I5SUhaaGJIVmxYRzVjZEZ4MElDb3ZYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJSE4xY0dWeWMyTnlhWEIwWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUV2w0WldSOUlIWmhiSFZsWEc1Y2RGeDBJQ292WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUhOMVluTmpjbWx3ZEZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDFwZUdWa2ZTQjJZV3gxWlZ4dVhIUmNkQ0FxTDF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCcWRYTjBhV1o1VEdWbWRGeHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa1pXUnBkR0ZpYkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTAxcGVHVmtmU0IyWVd4MVpWeHVYSFJjZENBcUwxeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnFkWE4wYVdaNVEyVnVkR1Z5WEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUV2w0WldSOUlIWmhiSFZsWEc1Y2RGeDBJQ292WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUdwMWMzUnBabmxTYVdkb2RGeHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa1pXUnBkR0ZpYkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTAxcGVHVmtmU0IyWVd4MVpWeHVYSFJjZENBcUwxeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnFkWE4wYVdaNVJuVnNiRnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwMXBlR1ZrZlNCMllXeDFaVnh1WEhSY2RDQXFMMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0JtYjNKdFlYUkNiRzlqYTF4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDFwZUdWa2ZTQjJZV3gxWlZ4dVhIUmNkQ0FxTDF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCeVpXMXZkbVZHYjNKdFlYUmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0TmFYaGxaSDBnZG1Gc2RXVmNibHgwWEhRZ0tpOWNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUJ0WlhSb2IyUWdZbUZqYTBOdmJHOXlYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1RXbDRaV1I5SUhaaGJIVmxYRzVjZEZ4MElDb3ZYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJR1p2Y21WRGIyeHZjbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwMXBlR1ZrZlNCMllXeDFaVnh1WEhSY2RDQXFMMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0JwYm5ObGNuUkliM0pwZW05dWRHRnNVblZzWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDFwZUdWa2ZTQjJZV3gxWlZ4dVhIUmNkQ0FxTDF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCbWIyNTBUbUZ0WlZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nWTJoaGJtZGxJR1p2Ym5RZ2JtRnRaVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1RXbDRaV1I5SUhaaGJIVmxYRzVjZEZ4MElDb3ZYRzVjYmx4MFhIUXZLaUJxYzJocGJuUWdhV2R1YjNKbE9uTjBZWEowSUNvdlhHNWNkRngwTHk4Z2JtRjBhWFpsSUdOdmJXMWhibVJ6S0hkcGRHZ2daWGhsWTBOdmJXMWhibVFwTENCblpXNWxjbUYwWlNCbWRXNWpkR2x2YmlCbWIzSWdaWGhsWTBOdmJXMWhibVJjYmx4MFhIUjJZWElnWTI5dGJXRnVaSE1nUFNCYkoySnZiR1FuTENBbmFYUmhiR2xqSnl3Z0ozVnVaR1Z5YkdsdVpTY3NJQ2R6ZEhKcGEyVjBhSEp2ZFdkb0p5d2dKM04xY0dWeWMyTnlhWEIwSnl3Z0ozTjFZbk5qY21sd2RDY3NYRzVjZEZ4MFhIUmNkRngwWEhRbmFuVnpkR2xtZVV4bFpuUW5MQ0FuYW5WemRHbG1lVU5sYm5SbGNpY3NJQ2RxZFhOMGFXWjVVbWxuYUhRbkxDQW5hblZ6ZEdsbWVVWjFiR3duTEZ4dVhIUmNkRngwWEhSY2RGeDBKMlp2Y20xaGRFSnNiMk5ySnl3Z0ozSmxiVzkyWlVadmNtMWhkQ2NzWEc1Y2RGeDBYSFJjZEZ4MFhIUW5ZbUZqYTBOdmJHOXlKeXdnSjJadmNtVkRiMnh2Y2ljc0lDZHBibk5sY25SSWIzSnBlbTl1ZEdGc1VuVnNaU2NzSUNkbWIyNTBUbUZ0WlNkZE8xeHVYRzVjZEZ4MFptOXlJQ2gyWVhJZ2FXUjRJRDBnTUN3Z2JHVnVJRDBnWTI5dGJXRnVaSE11YkdWdVozUm9PeUJwWkhnZ1BDQnNaVzQ3SUdsa2VDc3JLU0I3WEc1Y2RGeDBYSFIwYUdselcyTnZiVzFoYm1SelcybGtlRjFkSUQwZ0tHWjFibU4wYVc5dUlDaHpRMjFrS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bExDQjJZV3gxWlNrZ2UxeHVYSFJjZEZ4MFhIUmNkR0psWm05eVpVTnZiVzFoYm1Rb0pHVmthWFJoWW14bEtUdGNibHh1WEhSY2RGeDBYSFJjZEdSdlkzVnRaVzUwTG1WNFpXTkRiMjF0WVc1a0tITkRiV1FzSUdaaGJITmxMQ0IyWVd4MVpTazdYRzVjYmx4MFhIUmNkRngwWEhSaFpuUmxja052YlcxaGJtUW9KR1ZrYVhSaFlteGxLVHRjYmx4MFhIUmNkRngwZlR0Y2JseDBYSFJjZEgwcEtHTnZiVzFoYm1SelcybGtlRjBwTzF4dVhIUmNkSDFjYmx4MFhIUXZLaUJxYzJocGJuUWdhV2R1YjNKbE9tVnVaQ0FxTDF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCMFlXSmNibHgwWEhRZ0tseHVYSFJjZENBcUlHaGhibVJzWlNCMFlXSWdhMlY1WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1ZrYVhSaFlteGxYRzVjZEZ4MElDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHOXdkR2x2Ym5OY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxuUmhZaUE5SUdaMWJtTjBhVzl1SUNna1pXUnBkR0ZpYkdVc0lHOXdkR2x2Ym5NcElIdGNibHgwWEhSY2RIWmhjaUJ5Ym1jZ1BTQnlZVzVuWlM1amNtVmhkR1VvS1R0Y2JseDBYSFJjZEdsbUlDaHlibWN1YVhORGIyeHNZWEJ6WldRb0tTQW1KaUJ5Ym1jdWFYTlBia05sYkd3b0tTa2dlMXh1WEhSY2RGeDBYSFIwWVdKc1pTNTBZV0lvY201bktUdGNibHgwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RHSmxabTl5WlVOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEZ4MGRIbHdhVzVuTG1sdWMyVnlkRlJoWWlna1pXUnBkR0ZpYkdVc0lISnVaeXdnYjNCMGFXOXVjeTUwWVdKemFYcGxLVHRjYmx4MFhIUmNkRngwWVdaMFpYSkRiMjF0WVc1a0tDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUJ0WlhSb2IyUWdkVzUwWVdKY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUdoaGJtUnNaU0J6YUdsbWRDdDBZV0lnYTJWNVhHNWNkRngwSUNwY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxuVnVkR0ZpSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBkbUZ5SUhKdVp5QTlJSEpoYm1kbExtTnlaV0YwWlNncE8xeHVYSFJjZEZ4MGFXWWdLSEp1Wnk1cGMwTnZiR3hoY0hObFpDZ3BJQ1ltSUhKdVp5NXBjMDl1UTJWc2JDZ3BLU0I3WEc1Y2RGeDBYSFJjZEhSaFlteGxMblJoWWloeWJtY3NJSFJ5ZFdVcE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lHbHVjMlZ5ZEZCaGNtRm5jbUZ3YUZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nYVc1elpYSjBJSEJoY21GbmNtRndhRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNBa1pXUnBkR0ZpYkdWY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxtbHVjMlZ5ZEZCaGNtRm5jbUZ3YUNBOUlHWjFibU4wYVc5dUlDZ2taV1JwZEdGaWJHVXBJSHRjYmx4MFhIUmNkR0psWm05eVpVTnZiVzFoYm1Rb0pHVmthWFJoWW14bEtUdGNibHgwWEhSY2RIUjVjR2x1Wnk1cGJuTmxjblJRWVhKaFozSmhjR2dvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEdGbWRHVnlRMjl0YldGdVpDZ2taV1JwZEdGaWJHVXBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJR2x1YzJWeWRFOXlaR1Z5WldSTWFYTjBYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NXBibk5sY25SUGNtUmxjbVZrVEdsemRDQTlJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VwSUh0Y2JseDBYSFJjZEdKbFptOXlaVU52YlcxaGJtUW9KR1ZrYVhSaFlteGxLVHRjYmx4MFhIUmNkR0oxYkd4bGRDNXBibk5sY25SUGNtUmxjbVZrVEdsemRDZ2taV1JwZEdGaWJHVXBPMXh1WEhSY2RGeDBZV1owWlhKRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa1pXUnBkR0ZpYkdWY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxtbHVjMlZ5ZEZWdWIzSmtaWEpsWkV4cGMzUWdQU0JtZFc1amRHbHZiaUFvSkdWa2FYUmhZbXhsS1NCN1hHNWNkRngwWEhSaVpXWnZjbVZEYjIxdFlXNWtLQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFJpZFd4c1pYUXVhVzV6WlhKMFZXNXZjbVJsY21Wa1RHbHpkQ2drWldScGRHRmliR1VwTzF4dVhIUmNkRngwWVdaMFpYSkRiMjF0WVc1a0tDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbWx1WkdWdWRDQTlJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VwSUh0Y2JseDBYSFJjZEdKbFptOXlaVU52YlcxaGJtUW9KR1ZrYVhSaFlteGxLVHRjYmx4MFhIUmNkR0oxYkd4bGRDNXBibVJsYm5Rb0pHVmthWFJoWW14bEtUdGNibHgwWEhSY2RHRm1kR1Z5UTI5dGJXRnVaQ2drWldScGRHRmliR1VwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1dmRYUmtaVzUwSUQwZ1puVnVZM1JwYjI0Z0tDUmxaR2wwWVdKc1pTa2dlMXh1WEhSY2RGeDBZbVZtYjNKbFEyOXRiV0Z1WkNna1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEZ4MFluVnNiR1YwTG05MWRHUmxiblFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEdGbWRHVnlRMjl0YldGdVpDZ2taV1JwZEdGaWJHVXBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJwYm5ObGNuUWdhVzFoWjJWY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdjMVZ5YkZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdWFXNXpaWEowU1cxaFoyVWdQU0JtZFc1amRHbHZiaUFvSkdWa2FYUmhZbXhsTENCelZYSnNMQ0JtYVd4bGJtRnRaU2tnZTF4dVhIUmNkRngwWVhONWJtTXVZM0psWVhSbFNXMWhaMlVvYzFWeWJDd2dabWxzWlc1aGJXVXBMblJvWlc0b1puVnVZM1JwYjI0Z0tDUnBiV0ZuWlNrZ2UxeHVYSFJjZEZ4MFhIUmlaV1p2Y21WRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwWEhSY2RDUnBiV0ZuWlM1amMzTW9lMXh1WEhSY2RGeDBYSFJjZEdScGMzQnNZWGs2SUNjbkxGeHVYSFJjZEZ4MFhIUmNkSGRwWkhSb09pQk5ZWFJvTG0xcGJpZ2taV1JwZEdGaWJHVXVkMmxrZEdnb0tTd2dKR2x0WVdkbExuZHBaSFJvS0NrcFhHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBYSFJ5WVc1blpTNWpjbVZoZEdVb0tTNXBibk5sY25ST2IyUmxLQ1JwYldGblpWc3dYU2s3WEc1Y2RGeDBYSFJjZEhKaGJtZGxMbU55WldGMFpVWnliMjFPYjJSbEtDUnBiV0ZuWlZzd1hTa3VZMjlzYkdGd2MyVW9LUzV6Wld4bFkzUW9LVHRjYmx4MFhIUmNkRngwWVdaMFpYSkRiMjF0WVc1a0tDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUjlLUzVtWVdsc0tHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwZG1GeUlHTmhiR3hpWVdOcmN5QTlJQ1JsWkdsMFlXSnNaUzVrWVhSaEtDZGpZV3hzWW1GamEzTW5LVHRjYmx4MFhIUmNkRngwYVdZZ0tHTmhiR3hpWVdOcmN5NXZia2x0WVdkbFZYQnNiMkZrUlhKeWIzSXBJSHRjYmx4MFhIUmNkRngwWEhSallXeHNZbUZqYTNNdWIyNUpiV0ZuWlZWd2JHOWhaRVZ5Y205eUtDazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDBwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUdsdWMyVnlkRTV2WkdWY2JseDBYSFFnS2lCcGJuTmxjblFnYm05a1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1RtOWtaWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbGZTQnViMlJsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1cGJuTmxjblJPYjJSbElEMGdablZ1WTNScGIyNGdLQ1JsWkdsMFlXSnNaU3dnYm05a1pTa2dlMXh1WEhSY2RGeDBZbVZtYjNKbFEyOXRiV0Z1WkNna1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEZ4MGRtRnlJSEp1WnlBOUlIUm9hWE11WTNKbFlYUmxVbUZ1WjJVb0pHVmthWFJoWW14bEtUdGNibHgwWEhSY2RISnVaeTVwYm5ObGNuUk9iMlJsS0c1dlpHVXBPMXh1WEhSY2RGeDBjbUZ1WjJVdVkzSmxZWFJsUm5KdmJVNXZaR1VvYm05a1pTa3VZMjlzYkdGd2MyVW9LUzV6Wld4bFkzUW9LVHRjYmx4MFhIUmNkR0ZtZEdWeVEyOXRiV0Z1WkNna1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnBibk5sY25RZ2RHVjRkRnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUhSbGVIUmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbWx1YzJWeWRGUmxlSFFnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bExDQjBaWGgwS1NCN1hHNWNkRngwWEhSaVpXWnZjbVZEYjIxdFlXNWtLQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFIyWVhJZ2NtNW5JRDBnZEdocGN5NWpjbVZoZEdWU1lXNW5aU2drWldScGRHRmliR1VwTzF4dVhIUmNkRngwZG1GeUlIUmxlSFJPYjJSbElEMGdjbTVuTG1sdWMyVnlkRTV2WkdVb1pHOXRMbU55WldGMFpWUmxlSFFvZEdWNGRDa3BPMXh1WEhSY2RGeDBjbUZ1WjJVdVkzSmxZWFJsS0hSbGVIUk9iMlJsTENCa2IyMHVibTlrWlV4bGJtZDBhQ2gwWlhoMFRtOWtaU2twTG5ObGJHVmpkQ2dwTzF4dVhIUmNkRngwWVdaMFpYSkRiMjF0WVc1a0tDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJR1p2Y20xaGRFSnNiMk5yWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1ZrYVhSaFlteGxYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlIUmhaMDVoYldWY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxtWnZjbTFoZEVKc2IyTnJJRDBnWm5WdVkzUnBiMjRnS0NSbFpHbDBZV0pzWlN3Z2RHRm5UbUZ0WlNrZ2UxeHVYSFJjZEZ4MFltVm1iM0psUTI5dGJXRnVaQ2drWldScGRHRmliR1VwTzF4dVhIUmNkRngwZEdGblRtRnRaU0E5SUdGblpXNTBMbWx6VFZOSlJTQS9JQ2M4SnlBcklIUmhaMDVoYldVZ0t5QW5QaWNnT2lCMFlXZE9ZVzFsTzF4dVhIUmNkRngwWkc5amRXMWxiblF1WlhobFkwTnZiVzFoYm1Rb0owWnZjbTFoZEVKc2IyTnJKeXdnWm1Gc2MyVXNJSFJoWjA1aGJXVXBPMXh1WEhSY2RGeDBZV1owWlhKRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEhSb2FYTXVabTl5YldGMFVHRnlZU0E5SUdaMWJtTjBhVzl1SUNna1pXUnBkR0ZpYkdVcElIdGNibHgwWEhSY2RHSmxabTl5WlVOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEhSb2FYTXVabTl5YldGMFFteHZZMnNvSkdWa2FYUmhZbXhsTENBblVDY3BPMXh1WEhSY2RGeDBZV1owWlhKRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUlHcHphR2x1ZENCcFoyNXZjbVU2YzNSaGNuUWdLaTljYmx4MFhIUm1iM0lnS0haaGNpQnBaSGdnUFNBeE95QnBaSGdnUEQwZ05qc2dhV1I0S3lzcElIdGNibHgwWEhSY2RIUm9hWE5iSjJadmNtMWhkRWduSUNzZ2FXUjRYU0E5SUdaMWJtTjBhVzl1SUNocFpIZ3BJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VwSUh0Y2JseDBYSFJjZEZ4MFhIUjBhR2x6TG1admNtMWhkRUpzYjJOcktDUmxaR2wwWVdKc1pTd2dKMGduSUNzZ2FXUjRLVHRjYmx4MFhIUmNkRngwZlR0Y2JseDBYSFJjZEgwb2FXUjRLVHRjYmx4MFhIUjlPMXh1WEhSY2RDOHFJR3B6YUdsdWRDQnBaMjV2Y21VNlpXNWtJQ292WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCbWIyNTBjMmw2WlZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQjJZV3gxWlNBdElIQjRYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTVtYjI1MFUybDZaU0E5SUdaMWJtTjBhVzl1SUNna1pXUnBkR0ZpYkdVc0lIWmhiSFZsS1NCN1hHNWNkRngwWEhSaVpXWnZjbVZEYjIxdFlXNWtLQ1JsWkdsMFlXSnNaU2s3WEc1Y2JseDBYSFJjZEhaaGNpQnlibWNnUFNCMGFHbHpMbU55WldGMFpWSmhibWRsS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwWEhSMllYSWdjM0JoYm5NZ1BTQnpkSGxzWlM1emRIbHNaVTV2WkdWektISnVaeWs3WEc1Y2RGeDBYSFFrTG1WaFkyZ29jM0JoYm5Nc0lHWjFibU4wYVc5dUlDaHBaSGdzSUhOd1lXNHBJSHRjYmx4MFhIUmNkRngwSkNoemNHRnVLUzVqYzNNb2UxeHVYSFJjZEZ4MFhIUmNkQ2RtYjI1MExYTnBlbVVuT2lCMllXeDFaU0FySUNkd2VDZGNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFI5S1R0Y2JseHVYSFJjZEZ4MFlXWjBaWEpEYjIxdFlXNWtLQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUd4cGJtVklaV2xuYUhSY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJSFpoYkhWbFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NXNhVzVsU0dWcFoyaDBJRDBnWm5WdVkzUnBiMjRnS0NSbFpHbDBZV0pzWlN3Z2RtRnNkV1VwSUh0Y2JseDBYSFJjZEdKbFptOXlaVU52YlcxaGJtUW9KR1ZrYVhSaFlteGxLVHRjYmx4MFhIUmNkSE4wZVd4bExuTjBlV3hsVUdGeVlTaHlZVzVuWlM1amNtVmhkR1VvS1N3Z2UxeHVYSFJjZEZ4MFhIUnNhVzVsU0dWcFoyaDBPaUIyWVd4MVpWeHVYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmhablJsY2tOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2RXNXNhVzVyWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBZEhsd1pTQmpiMjF0WVc1a1hHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1MWJteHBibXNnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bEtTQjdYRzVjZEZ4MFhIUjJZWElnY201bklEMGdjbUZ1WjJVdVkzSmxZWFJsS0NrN1hHNWNkRngwWEhScFppQW9jbTVuTG1selQyNUJibU5vYjNJb0tTa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ1lXNWphRzl5SUQwZ1pHOXRMbUZ1WTJWemRHOXlLSEp1Wnk1ell5d2daRzl0TG1selFXNWphRzl5S1R0Y2JseDBYSFJjZEZ4MGNtNW5JRDBnY21GdVoyVXVZM0psWVhSbFJuSnZiVTV2WkdVb1lXNWphRzl5S1R0Y2JseDBYSFJjZEZ4MGNtNW5Mbk5sYkdWamRDZ3BPMXh1WEc1Y2RGeDBYSFJjZEdKbFptOXlaVU52YlcxaGJtUW9KR1ZrYVhSaFlteGxLVHRjYmx4MFhIUmNkRngwWkc5amRXMWxiblF1WlhobFkwTnZiVzFoYm1Rb0ozVnViR2x1YXljcE8xeHVYSFJjZEZ4MFhIUmhablJsY2tOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1kzSmxZWFJsSUd4cGJtc2dLR052YlcxaGJtUXBYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUd4cGJtdEpibVp2WEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJRzl3ZEdsdmJuTmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbU55WldGMFpVeHBibXNnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bExDQnNhVzVyU1c1bWJ5d2diM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBkbUZ5SUd4cGJtdFZjbXdnUFNCc2FXNXJTVzVtYnk1MWNtdzdYRzVjZEZ4MFhIUjJZWElnYkdsdWExUmxlSFFnUFNCc2FXNXJTVzVtYnk1MFpYaDBPMXh1WEhSY2RGeDBkbUZ5SUdselRtVjNWMmx1Wkc5M0lEMGdiR2x1YTBsdVptOHVibVYzVjJsdVpHOTNPMXh1WEhSY2RGeDBkbUZ5SUhKdVp5QTlJR3hwYm10SmJtWnZMbkpoYm1kbE8xeHVYSFJjZEZ4MGRtRnlJR2x6VkdWNGRFTm9ZVzVuWldRZ1BTQnlibWN1ZEc5VGRISnBibWNvS1NBaFBUMGdiR2x1YTFSbGVIUTdYRzVjYmx4MFhIUmNkR0psWm05eVpVTnZiVzFoYm1Rb0pHVmthWFJoWW14bEtUdGNibHh1WEhSY2RGeDBhV1lnS0c5d2RHbHZibk11YjI1RGNtVmhkR1ZNYVc1cktTQjdYRzVjZEZ4MFhIUmNkR3hwYm10VmNtd2dQU0J2Y0hScGIyNXpMbTl1UTNKbFlYUmxUR2x1YXloc2FXNXJWWEpzS1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGRtRnlJR0Z1WTJodmNuTTdYRzVjZEZ4MFhIUnBaaUFvYVhOVVpYaDBRMmhoYm1kbFpDa2dlMXh1WEhSY2RGeDBYSFF2THlCRGNtVmhkR1VnWVNCdVpYY2diR2x1YXlCM2FHVnVJSFJsZUhRZ1kyaGhibWRsWkM1Y2JseDBYSFJjZEZ4MGRtRnlJR0Z1WTJodmNpQTlJSEp1Wnk1cGJuTmxjblJPYjJSbEtDUW9KenhCUGljZ0t5QnNhVzVyVkdWNGRDQXJJQ2M4TDBFK0p5bGJNRjBwTzF4dVhIUmNkRngwWEhSaGJtTm9iM0p6SUQwZ1cyRnVZMmh2Y2wwN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSaGJtTm9iM0p6SUQwZ2MzUjViR1V1YzNSNWJHVk9iMlJsY3loeWJtY3NJSHRjYmx4MFhIUmNkRngwWEhSdWIyUmxUbUZ0WlRvZ0owRW5MRnh1WEhSY2RGeDBYSFJjZEdWNGNHRnVaRU5zYjNObGMzUlRhV0pzYVc1bk9pQjBjblZsTEZ4dVhIUmNkRngwWEhSY2RHOXViSGxRWVhKMGFXRnNRMjl1ZEdGcGJuTTZJSFJ5ZFdWY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQ1F1WldGamFDaGhibU5vYjNKekxDQm1kVzVqZEdsdmJpQW9hV1I0TENCaGJtTm9iM0lwSUh0Y2JseDBYSFJjZEZ4MEpDaGhibU5vYjNJcExtRjBkSElvSjJoeVpXWW5MQ0JzYVc1clZYSnNLVHRjYmx4MFhIUmNkRngwYVdZZ0tHbHpUbVYzVjJsdVpHOTNLU0I3WEc1Y2RGeDBYSFJjZEZ4MEpDaGhibU5vYjNJcExtRjBkSElvSjNSaGNtZGxkQ2NzSUNkZllteGhibXNuS1R0Y2JseDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUWtLR0Z1WTJodmNpa3VjbVZ0YjNabFFYUjBjaWduZEdGeVoyVjBKeWs3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgwcE8xeHVYRzVjZEZ4MFhIUjJZWElnYzNSaGNuUlNZVzVuWlNBOUlISmhibWRsTG1OeVpXRjBaVVp5YjIxT2IyUmxLR3hwYzNRdWFHVmhaQ2hoYm1Ob2IzSnpLU2t1WTI5c2JHRndjMlVvZEhKMVpTazdYRzVjZEZ4MFhIUjJZWElnYzNSaGNuUlFiMmx1ZENBOUlITjBZWEowVW1GdVoyVXVaMlYwVTNSaGNuUlFiMmx1ZENncE8xeHVYSFJjZEZ4MGRtRnlJR1Z1WkZKaGJtZGxJRDBnY21GdVoyVXVZM0psWVhSbFJuSnZiVTV2WkdVb2JHbHpkQzVzWVhOMEtHRnVZMmh2Y25NcEtTNWpiMnhzWVhCelpTZ3BPMXh1WEhSY2RGeDBkbUZ5SUdWdVpGQnZhVzUwSUQwZ1pXNWtVbUZ1WjJVdVoyVjBSVzVrVUc5cGJuUW9LVHRjYmx4dVhIUmNkRngwY21GdVoyVXVZM0psWVhSbEtGeHVYSFJjZEZ4MElDQnpkR0Z5ZEZCdmFXNTBMbTV2WkdVc1hHNWNkRngwWEhRZ0lITjBZWEowVUc5cGJuUXViMlptYzJWMExGeHVYSFJjZEZ4MElDQmxibVJRYjJsdWRDNXViMlJsTEZ4dVhIUmNkRngwSUNCbGJtUlFiMmx1ZEM1dlptWnpaWFJjYmx4MFhIUmNkQ2t1YzJWc1pXTjBLQ2s3WEc1Y2JseDBYSFJjZEdGbWRHVnlRMjl0YldGdVpDZ2taV1JwZEdGaWJHVXBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ5WlhSMWNtNXpJR3hwYm1zZ2FXNW1iMXh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdUMkpxWldOMGZWeHVYSFJjZENBcUlFQnlaWFIxY200Z2UxZHlZWEJ3WldSU1lXNW5aWDBnY21WMGRYSnVMbkpoYm1kbFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1UzUnlhVzVuZlNCeVpYUjFjbTR1ZEdWNGRGeHVYSFJjZENBcUlFQnlaWFIxY200Z2UwSnZiMnhsWVc1OUlGdHlaWFIxY200dWFYTk9aWGRYYVc1a2IzYzlkSEoxWlYxY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0VGRISnBibWQ5SUZ0eVpYUjFjbTR1ZFhKc1BWd2lYQ0pkWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1blpYUk1hVzVyU1c1bWJ5QTlJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VwSUh0Y2JseDBYSFJjZENSbFpHbDBZV0pzWlM1bWIyTjFjeWdwTzF4dVhHNWNkRngwWEhSMllYSWdjbTVuSUQwZ2NtRnVaMlV1WTNKbFlYUmxLQ2t1Wlhod1lXNWtLR1J2YlM1cGMwRnVZMmh2Y2lrN1hHNWNibHgwWEhSY2RDOHZJRWRsZENCMGFHVWdabWx5YzNRZ1lXNWphRzl5SUc5dUlISmhibWRsS0dadmNpQmxaR2wwS1M1Y2JseDBYSFJjZEhaaGNpQWtZVzVqYUc5eUlEMGdKQ2hzYVhOMExtaGxZV1FvY201bkxtNXZaR1Z6S0dSdmJTNXBjMEZ1WTJodmNpa3BLVHRjYmx4dVhIUmNkRngwY21WMGRYSnVJSHRjYmx4MFhIUmNkRngwY21GdVoyVTZJSEp1Wnl4Y2JseDBYSFJjZEZ4MGRHVjRkRG9nY201bkxuUnZVM1J5YVc1bktDa3NYRzVjZEZ4MFhIUmNkR2x6VG1WM1YybHVaRzkzT2lBa1lXNWphRzl5TG14bGJtZDBhQ0EvSUNSaGJtTm9iM0l1WVhSMGNpZ25kR0Z5WjJWMEp5a2dQVDA5SUNkZllteGhibXNuSURvZ1ptRnNjMlVzWEc1Y2RGeDBYSFJjZEhWeWJEb2dKR0Z1WTJodmNpNXNaVzVuZEdnZ1B5QWtZVzVqYUc5eUxtRjBkSElvSjJoeVpXWW5LU0E2SUNjblhHNWNkRngwWEhSOU8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnpaWFIwYVc1bklHTnZiRzl5WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCelQySnFRMjlzYjNJZ0lHTnZiRzl5SUdOdlpHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ2MwOWlha052Ykc5eUxtWnZjbVZEYjJ4dmNpQm1iM0psWjNKdmRXNWtJR052Ykc5eVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUhOUFltcERiMnh2Y2k1aVlXTnJRMjlzYjNJZ1ltRmphMmR5YjNWdVpDQmpiMnh2Y2x4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdVkyOXNiM0lnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bExDQnpUMkpxUTI5c2IzSXBJSHRjYmx4MFhIUmNkSFpoY2lCdlEyOXNiM0lnUFNCS1UwOU9MbkJoY25ObEtITlBZbXBEYjJ4dmNpazdYRzVjZEZ4MFhIUjJZWElnWm05eVpVTnZiRzl5SUQwZ2IwTnZiRzl5TG1admNtVkRiMnh2Y2l3Z1ltRmphME52Ykc5eUlEMGdiME52Ykc5eUxtSmhZMnREYjJ4dmNqdGNibHh1WEhSY2RGeDBZbVZtYjNKbFEyOXRiV0Z1WkNna1pXUnBkR0ZpYkdVcE8xeHVYRzVjZEZ4MFhIUnBaaUFvWm05eVpVTnZiRzl5S1NCN0lHUnZZM1Z0Wlc1MExtVjRaV05EYjIxdFlXNWtLQ2RtYjNKbFEyOXNiM0luTENCbVlXeHpaU3dnWm05eVpVTnZiRzl5S1RzZ2ZWeHVYSFJjZEZ4MGFXWWdLR0poWTJ0RGIyeHZjaWtnZXlCa2IyTjFiV1Z1ZEM1bGVHVmpRMjl0YldGdVpDZ25ZbUZqYTBOdmJHOXlKeXdnWm1Gc2MyVXNJR0poWTJ0RGIyeHZjaWs3SUgxY2JseHVYSFJjZEZ4MFlXWjBaWEpEYjIxdFlXNWtLQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUdsdWMyVnlkQ0JVWVdKc1pWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdjMFJwYlNCa2FXMWxibk5wYjI0Z2IyWWdkR0ZpYkdVZ0tHVjRJRG9nWENJMWVEVmNJaWxjYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG1sdWMyVnlkRlJoWW14bElEMGdablZ1WTNScGIyNGdLQ1JsWkdsMFlXSnNaU3dnYzBScGJTa2dlMXh1WEhSY2RGeDBkbUZ5SUdScGJXVnVjMmx2YmlBOUlITkVhVzB1YzNCc2FYUW9KM2duS1R0Y2JseDBYSFJjZEdKbFptOXlaVU52YlcxaGJtUW9KR1ZrYVhSaFlteGxLVHRjYmx4dVhIUmNkRngwZG1GeUlISnVaeUE5SUhKaGJtZGxMbU55WldGMFpTZ3BPMXh1WEhSY2RGeDBjbTVuSUQwZ2NtNW5MbVJsYkdWMFpVTnZiblJsYm5SektDazdYRzVjZEZ4MFhIUnlibWN1YVc1elpYSjBUbTlrWlNoMFlXSnNaUzVqY21WaGRHVlVZV0pzWlNoa2FXMWxibk5wYjI1Yk1GMHNJR1JwYldWdWMybHZibHN4WFNrcE8xeHVYSFJjZEZ4MFlXWjBaWEpEYjIxdFlXNWtLQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUdac2IyRjBJRzFsWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1ZrYVhSaFlteGxYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlIWmhiSFZsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1IwWVhKblpYUmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbVpzYjJGMFRXVWdQU0JtZFc1amRHbHZiaUFvSkdWa2FYUmhZbXhsTENCMllXeDFaU3dnSkhSaGNtZGxkQ2tnZTF4dVhIUmNkRngwWW1WbWIzSmxRMjl0YldGdVpDZ2taV1JwZEdGaWJHVXBPMXh1WEhSY2RGeDBKSFJoY21kbGRDNWpjM01vSjJac2IyRjBKeXdnZG1Gc2RXVXBPMXh1WEhSY2RGeDBZV1owWlhKRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHTm9ZVzVuWlNCcGJXRm5aU0J6YUdGd1pWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSbFpHbDBZV0pzWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0IyWVd4MVpTQmpjM01nWTJ4aGMzTmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUNSMFlYSm5aWFJjYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG1sdFlXZGxVMmhoY0dVZ1BTQm1kVzVqZEdsdmJpQW9KR1ZrYVhSaFlteGxMQ0IyWVd4MVpTd2dKSFJoY21kbGRDa2dlMXh1WEhSY2RGeDBZbVZtYjNKbFEyOXRiV0Z1WkNna1pXUnBkR0ZpYkdVcE8xeHVYRzVjZEZ4MFhIUWtkR0Z5WjJWMExuSmxiVzkyWlVOc1lYTnpLQ2RwYldjdGNtOTFibVJsWkNCcGJXY3RZMmx5WTJ4bElHbHRaeTEwYUhWdFltNWhhV3duS1R0Y2JseHVYSFJjZEZ4MGFXWWdLSFpoYkhWbEtTQjdYRzVjZEZ4MFhIUmNkQ1IwWVhKblpYUXVZV1JrUTJ4aGMzTW9kbUZzZFdVcE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmhablJsY2tOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVnphWHBsSUc5MlpYSnNZWGtnWld4bGJXVnVkRnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ2RtRnNkV1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKSFJoY21kbGRDQXRJSFJoY21kbGRDQmxiR1Z0Wlc1MFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NXlaWE5wZW1VZ1BTQm1kVzVqZEdsdmJpQW9KR1ZrYVhSaFlteGxMQ0IyWVd4MVpTd2dKSFJoY21kbGRDa2dlMXh1WEhSY2RGeDBZbVZtYjNKbFEyOXRiV0Z1WkNna1pXUnBkR0ZpYkdVcE8xeHVYRzVjZEZ4MFhIUWtkR0Z5WjJWMExtTnpjeWg3WEc1Y2RGeDBYSFJjZEhkcFpIUm9PaUIyWVd4MVpTQXFJREV3TUNBcklDY2xKeXhjYmx4MFhIUmNkRngwYUdWcFoyaDBPaUFuSjF4dVhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RHRm1kR1Z5UTI5dGJXRnVaQ2drWldScGRHRmliR1VwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFCdmMybDBhVzl1ZlNCd2IzTmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pIUmhjbWRsZENBdElIUmhjbWRsZENCbGJHVnRaVzUwWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRDYjI5c1pXRnVmU0JiWWt0bFpYQlNZWFJwYjEwZ0xTQnJaV1Z3SUhKaGRHbHZYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTV5WlhOcGVtVlVieUE5SUdaMWJtTjBhVzl1SUNod2IzTXNJQ1IwWVhKblpYUXNJR0pMWldWd1VtRjBhVzhwSUh0Y2JseDBYSFJjZEhaaGNpQnBiV0ZuWlZOcGVtVTdYRzVjZEZ4MFhIUnBaaUFvWWt0bFpYQlNZWFJwYnlrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnYm1WM1VtRjBhVzhnUFNCd2IzTXVlU0F2SUhCdmN5NTRPMXh1WEhSY2RGeDBYSFIyWVhJZ2NtRjBhVzhnUFNBa2RHRnlaMlYwTG1SaGRHRW9KM0poZEdsdkp5azdYRzVjZEZ4MFhIUmNkR2x0WVdkbFUybDZaU0E5SUh0Y2JseDBYSFJjZEZ4MFhIUjNhV1IwYURvZ2NtRjBhVzhnUGlCdVpYZFNZWFJwYnlBL0lIQnZjeTU0SURvZ2NHOXpMbmtnTHlCeVlYUnBieXhjYmx4MFhIUmNkRngwWEhSb1pXbG5hSFE2SUhKaGRHbHZJRDRnYm1WM1VtRjBhVzhnUHlCd2IzTXVlQ0FxSUhKaGRHbHZJRG9nY0c5ekxubGNibHgwWEhSY2RGeDBmVHRjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkR2x0WVdkbFUybDZaU0E5SUh0Y2JseDBYSFJjZEZ4MFhIUjNhV1IwYURvZ2NHOXpMbmdzWEc1Y2RGeDBYSFJjZEZ4MGFHVnBaMmgwT2lCd2IzTXVlVnh1WEhSY2RGeDBYSFI5TzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRa2RHRnlaMlYwTG1OemN5aHBiV0ZuWlZOcGVtVXBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ5WlcxdmRtVWdiV1ZrYVdFZ2IySnFaV04wWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1ZrYVhSaFlteGxYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlIWmhiSFZsSUMwZ1pIVnRiWGtnWVhKbmRXMWxiblFnS0dadmNpQnJaV1Z3SUdsdWRHVnlabUZqWlNsY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkhSaGNtZGxkQ0F0SUhSaGNtZGxkQ0JsYkdWdFpXNTBYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTV5WlcxdmRtVk5aV1JwWVNBOUlHWjFibU4wYVc5dUlDZ2taV1JwZEdGaWJHVXNJSFpoYkhWbExDQWtkR0Z5WjJWMEtTQjdYRzVjZEZ4MFhIUmlaV1p2Y21WRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwWEhRa2RHRnlaMlYwTG1SbGRHRmphQ2dwTzF4dVhHNWNkRngwWEhSMllYSWdZMkZzYkdKaFkydHpJRDBnSkdWa2FYUmhZbXhsTG1SaGRHRW9KMk5oYkd4aVlXTnJjeWNwTzF4dVhIUmNkRngwYVdZZ0tHTmhiR3hpWVdOcmN5QW1KaUJqWVd4c1ltRmphM011YjI1TlpXUnBZVVJsYkdWMFpTa2dlMXh1WEhSY2RGeDBYSFJqWVd4c1ltRmphM011YjI1TlpXUnBZVVJsYkdWMFpTZ2tkR0Z5WjJWMExDQjBhR2x6TENBa1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmhablJsY2tOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2MyVjBJR1p2WTNWelhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1bWIyTjFjeUE5SUdaMWJtTjBhVzl1SUNna1pXUnBkR0ZpYkdVcElIdGNibHgwWEhSY2RDUmxaR2wwWVdKc1pTNW1iMk4xY3lncE8xeHVYSFJjZEgwN1hHNWNkSDA3WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRUJqYkdGemN5QnRiMlIxYkdVdVFuVjBkRzl1WEc1Y2RDQXFYRzVjZENBcUlFSjFkSFJ2Ymx4dVhIUWdLaTljYmx4MGRtRnlJRUoxZEhSdmJpQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCMWNHUmhkR1VnWW5WMGRHOXVJSE4wWVhSMWMxeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSamIyNTBZV2x1WlhKY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYzNSNWJHVkpibVp2WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1MWNHUmhkR1VnUFNCbWRXNWpkR2x2YmlBb0pHTnZiblJoYVc1bGNpd2djM1I1YkdWSmJtWnZLU0I3WEc1Y2RGeDBYSFF2S2lwY2JseDBYSFJjZENBcUlHaGhibVJzWlNCa2NtOXdaRzkzYmlkeklHTm9aV05ySUcxaGNtc2dLR1p2Y2lCbWIyNTBibUZ0WlN3Z1ptOXVkSE5wZW1Vc0lHeHBibVZJWldsbmFIUXBMbHh1WEhSY2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JpZEc1Y2JseDBYSFJjZENBcUlFQndZWEpoYlNCN1RuVnRZbVZ5ZlNCMllXeDFaVnh1WEhSY2RGeDBJQ292WEc1Y2RGeDBYSFIyWVhJZ1kyaGxZMnRFY205d1pHOTNiazFsYm5VZ1BTQm1kVzVqZEdsdmJpQW9KR0owYml3Z2RtRnNkV1VwSUh0Y2JseDBYSFJjZEZ4MEpHSjBiaTVtYVc1a0tDY3VaSEp2Y0dSdmQyNHRiV1Z1ZFNCc2FTQmhKeWt1WldGamFDaG1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEZ4MEx5OGdZV3gzWVhseklHTnZiWEJoY21VZ2MzUnlhVzVuSUhSdklHRjJiMmxrSUdOeVpXRjBhVzVuSUdGdWIzUm9aWElnWm5WdVl5NWNibHgwWEhSY2RGeDBYSFIyWVhJZ2FYTkRhR1ZqYTJWa0lEMGdLQ1FvZEdocGN5a3VaR0YwWVNnbmRtRnNkV1VuS1NBcklDY25LU0E5UFQwZ0tIWmhiSFZsSUNzZ0p5Y3BPMXh1WEhSY2RGeDBYSFJjZEhSb2FYTXVZMnhoYzNOT1lXMWxJRDBnYVhORGFHVmphMlZrSUQ4Z0oyTm9aV05yWldRbklEb2dKeWM3WEc1Y2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MGZUdGNibHh1WEhSY2RGeDBMeW9xWEc1Y2RGeDBYSFFnS2lCMWNHUmhkR1VnWW5WMGRHOXVJSE4wWVhSbEtHRmpkR2wyWlNCdmNpQnViM1FwTGx4dVhIUmNkRngwSUNwY2JseDBYSFJjZENBcUlFQndjbWwyWVhSbFhHNWNkRngwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ2MyVnNaV04wYjNKY2JseDBYSFJjZENBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlIQnlaV1JjYmx4MFhIUmNkQ0FxTDF4dVhIUmNkRngwZG1GeUlHSjBibE4wWVhSbElEMGdablZ1WTNScGIyNGdLSE5sYkdWamRHOXlMQ0J3Y21Wa0tTQjdYRzVjZEZ4MFhIUmNkSFpoY2lBa1luUnVJRDBnSkdOdmJuUmhhVzVsY2k1bWFXNWtLSE5sYkdWamRHOXlLVHRjYmx4MFhIUmNkRngwSkdKMGJpNTBiMmRuYkdWRGJHRnpjeWduWVdOMGFYWmxKeXdnY0hKbFpDZ3BLVHRjYmx4MFhIUmNkSDA3WEc1Y2JseDBYSFJjZEdsbUlDaHpkSGxzWlVsdVptOHVhVzFoWjJVcElIdGNibHgwWEhSY2RGeDBkbUZ5SUNScGJXY2dQU0FrS0hOMGVXeGxTVzVtYnk1cGJXRm5aU2s3WEc1Y2JseDBYSFJjZEZ4MFluUnVVM1JoZEdVb0oySjFkSFJ2Ymx0a1lYUmhMV1YyWlc1MFBWd2lhVzFoWjJWVGFHRndaVndpWFZ0a1lYUmhMWFpoYkhWbFBWd2lhVzFuTFhKdmRXNWtaV1JjSWwwbkxDQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUNScGJXY3VhR0Z6UTJ4aGMzTW9KMmx0WnkxeWIzVnVaR1ZrSnlrN1hHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBYSFJpZEc1VGRHRjBaU2duWW5WMGRHOXVXMlJoZEdFdFpYWmxiblE5WENKcGJXRm5aVk5vWVhCbFhDSmRXMlJoZEdFdGRtRnNkV1U5WENKcGJXY3RZMmx5WTJ4bFhDSmRKeXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQWthVzFuTG1oaGMwTnNZWE56S0NkcGJXY3RZMmx5WTJ4bEp5azdYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwWEhSaWRHNVRkR0YwWlNnblluVjBkRzl1VzJSaGRHRXRaWFpsYm5ROVhDSnBiV0ZuWlZOb1lYQmxYQ0pkVzJSaGRHRXRkbUZzZFdVOVhDSnBiV2N0ZEdoMWJXSnVZV2xzWENKZEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlBa2FXMW5MbWhoYzBOc1lYTnpLQ2RwYldjdGRHaDFiV0p1WVdsc0p5azdYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwWEhSaWRHNVRkR0YwWlNnblluVjBkRzl1VzJSaGRHRXRaWFpsYm5ROVhDSnBiV0ZuWlZOb1lYQmxYQ0pkT201dmRDaGJaR0YwWVMxMllXeDFaVjBwSnl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUFoSkdsdFp5NXBjeWduTG1sdFp5MXliM1Z1WkdWa0xDQXVhVzFuTFdOcGNtTnNaU3dnTG1sdFp5MTBhSFZ0WW01aGFXd25LVHRjYmx4MFhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RGeDBkbUZ5SUdsdFowWnNiMkYwSUQwZ0pHbHRaeTVqYzNNb0oyWnNiMkYwSnlrN1hHNWNkRngwWEhSY2RHSjBibE4wWVhSbEtDZGlkWFIwYjI1YlpHRjBZUzFsZG1WdWREMWNJbVpzYjJGMFRXVmNJbDFiWkdGMFlTMTJZV3gxWlQxY0lteGxablJjSWwwbkxDQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUdsdFowWnNiMkYwSUQwOVBTQW5iR1ZtZENjN1hHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBYSFJpZEc1VGRHRjBaU2duWW5WMGRHOXVXMlJoZEdFdFpYWmxiblE5WENKbWJHOWhkRTFsWENKZFcyUmhkR0V0ZG1Gc2RXVTlYQ0p5YVdkb2RGd2lYU2NzSUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdhVzFuUm14dllYUWdQVDA5SUNkeWFXZG9kQ2M3WEc1Y2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MFhIUmlkRzVUZEdGMFpTZ25ZblYwZEc5dVcyUmhkR0V0WlhabGJuUTlYQ0ptYkc5aGRFMWxYQ0pkVzJSaGRHRXRkbUZzZFdVOVhDSnViMjVsWENKZEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCcGJXZEdiRzloZENBaFBUMGdKMnhsWm5RbklDWW1JR2x0WjBac2IyRjBJQ0U5UFNBbmNtbG5hSFFuTzF4dVhIUmNkRngwWEhSOUtUdGNibHh1WEhSY2RGeDBYSFIyWVhJZ2MzUjViR1VnUFNBa2FXMW5MbUYwZEhJb0ozTjBlV3hsSnlrN1hHNWNkRngwWEhSY2RHSjBibE4wWVhSbEtDZGlkWFIwYjI1YlpHRjBZUzFsZG1WdWREMWNJbkpsYzJsNlpWd2lYVnRrWVhSaExYWmhiSFZsUFZ3aU1Wd2lYU2NzSUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdJU0V2S0Y1OFhGeHpLU2h0WVhndEtUOTNhV1IwYUZ4Y2N5bzZYRnh6S2pFd01DVXZMblJsYzNRb2MzUjViR1VwTzF4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RGeDBZblJ1VTNSaGRHVW9KMkoxZEhSdmJsdGtZWFJoTFdWMlpXNTBQVndpY21WemFYcGxYQ0pkVzJSaGRHRXRkbUZzZFdVOVhDSXdMalZjSWwwbkxDQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUNFaEx5aGVmRnhjY3lrb2JXRjRMU2svZDJsa2RHaGNYSE1xT2x4Y2N5bzFNQ1V2TG5SbGMzUW9jM1I1YkdVcE8xeHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwWW5SdVUzUmhkR1VvSjJKMWRIUnZibHRrWVhSaExXVjJaVzUwUFZ3aWNtVnphWHBsWENKZFcyUmhkR0V0ZG1Gc2RXVTlYQ0l3TGpJMVhDSmRKeXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQWhJUzhvWG54Y1hITXBLRzFoZUMwcFAzZHBaSFJvWEZ4ektqcGNYSE1xTWpVbEx5NTBaWE4wS0hOMGVXeGxLVHRjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSY2RISmxkSFZ5Ymp0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MEx5OGdabTl1ZEc1aGJXVmNibHgwWEhSY2RIWmhjaUFrWm05dWRHNWhiV1VnUFNBa1kyOXVkR0ZwYm1WeUxtWnBibVFvSnk1dWIzUmxMV1p2Ym5SdVlXMWxKeWs3WEc1Y2RGeDBYSFJwWmlBb0pHWnZiblJ1WVcxbExteGxibWQwYUNrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnYzJWc1pXTjBaV1JHYjI1MElEMGdjM1I1YkdWSmJtWnZXeWRtYjI1MExXWmhiV2xzZVNkZE8xeHVYSFJjZEZ4MFhIUnBaaUFvSVNGelpXeGxZM1JsWkVadmJuUXBJSHRjYmx4dVhIUmNkRngwWEhSY2RIWmhjaUJzYVhOMElEMGdjMlZzWldOMFpXUkdiMjUwTG5Od2JHbDBLQ2NzSnlrN1hHNWNkRngwWEhSY2RGeDBabTl5SUNoMllYSWdhU0E5SURBc0lHeGxiaUE5SUd4cGMzUXViR1Z1WjNSb095QnBJRHdnYkdWdU95QnBLeXNwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkSE5sYkdWamRHVmtSbTl1ZENBOUlHeHBjM1JiYVYwdWNtVndiR0ZqWlNndlcxeGNKMXhjWENKZEwyY3NJQ2NuS1M1eVpYQnNZV05sS0M5Y1hITXJKQzhzSUNjbktTNXlaWEJzWVdObEtDOWVYRnh6S3k4c0lDY25LVHRjYmx4MFhIUmNkRngwWEhSY2RHbG1JQ2hoWjJWdWRDNXBjMFp2Ym5SSmJuTjBZV3hzWldRb2MyVnNaV04wWldSR2IyNTBLU2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJpY21WaGF6dGNibHgwWEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwWEhRa1ptOXVkRzVoYldVdVptbHVaQ2duTG01dmRHVXRZM1Z5Y21WdWRDMW1iMjUwYm1GdFpTY3BMblJsZUhRb2MyVnNaV04wWldSR2IyNTBLVHRjYmx4MFhIUmNkRngwWEhSamFHVmphMFJ5YjNCa2IzZHVUV1Z1ZFNna1ptOXVkRzVoYldVc0lITmxiR1ZqZEdWa1JtOXVkQ2s3WEc1Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZMeUJtYjI1MGMybDZaVnh1WEhSY2RGeDBkbUZ5SUNSbWIyNTBjMmw2WlNBOUlDUmpiMjUwWVdsdVpYSXVabWx1WkNnbkxtNXZkR1V0Wm05dWRITnBlbVVuS1R0Y2JseDBYSFJjZENSbWIyNTBjMmw2WlM1bWFXNWtLQ2N1Ym05MFpTMWpkWEp5Wlc1MExXWnZiblJ6YVhwbEp5a3VkR1Y0ZENoemRIbHNaVWx1Wm05YkoyWnZiblF0YzJsNlpTZGRLVHRjYmx4MFhIUmNkR05vWldOclJISnZjR1J2ZDI1TlpXNTFLQ1JtYjI1MGMybDZaU3dnY0dGeWMyVkdiRzloZENoemRIbHNaVWx1Wm05YkoyWnZiblF0YzJsNlpTZGRLU2s3WEc1Y2JseDBYSFJjZEM4dklHeHBibVZvWldsbmFIUmNibHgwWEhSY2RIWmhjaUFrYkdsdVpVaGxhV2RvZENBOUlDUmpiMjUwWVdsdVpYSXVabWx1WkNnbkxtNXZkR1V0YUdWcFoyaDBKeWs3WEc1Y2RGeDBYSFJqYUdWamEwUnliM0JrYjNkdVRXVnVkU2drYkdsdVpVaGxhV2RvZEN3Z2NHRnljMlZHYkc5aGRDaHpkSGxzWlVsdVptOWJKMnhwYm1VdGFHVnBaMmgwSjEwcEtUdGNibHh1WEhSY2RGeDBZblJ1VTNSaGRHVW9KMkoxZEhSdmJsdGtZWFJoTFdWMlpXNTBQVndpWW05c1pGd2lYU2NzSUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlITjBlV3hsU1c1bWIxc25abTl1ZEMxaWIyeGtKMTBnUFQwOUlDZGliMnhrSnp0Y2JseDBYSFJjZEgwcE8xeHVYSFJjZEZ4MFluUnVVM1JoZEdVb0oySjFkSFJ2Ymx0a1lYUmhMV1YyWlc1MFBWd2lhWFJoYkdsalhDSmRKeXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2MzUjViR1ZKYm1adld5ZG1iMjUwTFdsMFlXeHBZeWRkSUQwOVBTQW5hWFJoYkdsakp6dGNibHgwWEhSY2RIMHBPMXh1WEhSY2RGeDBZblJ1VTNSaGRHVW9KMkoxZEhSdmJsdGtZWFJoTFdWMlpXNTBQVndpZFc1a1pYSnNhVzVsWENKZEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYzNSNWJHVkpibVp2V3lkbWIyNTBMWFZ1WkdWeWJHbHVaU2RkSUQwOVBTQW5kVzVrWlhKc2FXNWxKenRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkRngwWW5SdVUzUmhkR1VvSjJKMWRIUnZibHRrWVhSaExXVjJaVzUwUFZ3aWMzUnlhV3RsZEdoeWIzVm5hRndpWFNjc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSE4wZVd4bFNXNW1iMXNuWm05dWRDMXpkSEpwYTJWMGFISnZkV2RvSjEwZ1BUMDlJQ2R6ZEhKcGEyVjBhSEp2ZFdkb0p6dGNibHgwWEhSY2RIMHBPMXh1WEhSY2RGeDBZblJ1VTNSaGRHVW9KMkoxZEhSdmJsdGtZWFJoTFdWMlpXNTBQVndpYzNWd1pYSnpZM0pwY0hSY0lsMG5MQ0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCemRIbHNaVWx1Wm05YkoyWnZiblF0YzNWd1pYSnpZM0pwY0hRblhTQTlQVDBnSjNOMWNHVnljMk55YVhCMEp6dGNibHgwWEhSY2RIMHBPMXh1WEhSY2RGeDBZblJ1VTNSaGRHVW9KMkoxZEhSdmJsdGtZWFJoTFdWMlpXNTBQVndpYzNWaWMyTnlhWEIwWENKZEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYzNSNWJHVkpibVp2V3lkbWIyNTBMWE4xWW5OamNtbHdkQ2RkSUQwOVBTQW5jM1ZpYzJOeWFYQjBKenRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkRngwWW5SdVUzUmhkR1VvSjJKMWRIUnZibHRrWVhSaExXVjJaVzUwUFZ3aWFuVnpkR2xtZVV4bFpuUmNJbDBuTENCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnpkSGxzWlVsdVptOWJKM1JsZUhRdFlXeHBaMjRuWFNBOVBUMGdKMnhsWm5RbklIeDhJSE4wZVd4bFNXNW1iMXNuZEdWNGRDMWhiR2xuYmlkZElEMDlQU0FuYzNSaGNuUW5PMXh1WEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJpZEc1VGRHRjBaU2duWW5WMGRHOXVXMlJoZEdFdFpYWmxiblE5WENKcWRYTjBhV1o1UTJWdWRHVnlYQ0pkSnl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdjM1I1YkdWSmJtWnZXeWQwWlhoMExXRnNhV2R1SjEwZ1BUMDlJQ2RqWlc1MFpYSW5PMXh1WEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJpZEc1VGRHRjBaU2duWW5WMGRHOXVXMlJoZEdFdFpYWmxiblE5WENKcWRYTjBhV1o1VW1sbmFIUmNJbDBuTENCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnpkSGxzWlVsdVptOWJKM1JsZUhRdFlXeHBaMjRuWFNBOVBUMGdKM0pwWjJoMEp6dGNibHgwWEhSY2RIMHBPMXh1WEhSY2RGeDBZblJ1VTNSaGRHVW9KMkoxZEhSdmJsdGtZWFJoTFdWMlpXNTBQVndpYW5WemRHbG1lVVoxYkd4Y0lsMG5MQ0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCemRIbHNaVWx1Wm05YkozUmxlSFF0WVd4cFoyNG5YU0E5UFQwZ0oycDFjM1JwWm5rbk8xeHVYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmlkRzVUZEdGMFpTZ25ZblYwZEc5dVcyUmhkR0V0WlhabGJuUTlYQ0pwYm5ObGNuUlZibTl5WkdWeVpXUk1hWE4wWENKZEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYzNSNWJHVkpibVp2V3lkc2FYTjBMWE4wZVd4bEoxMGdQVDA5SUNkMWJtOXlaR1Z5WldRbk8xeHVYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmlkRzVUZEdGMFpTZ25ZblYwZEc5dVcyUmhkR0V0WlhabGJuUTlYQ0pwYm5ObGNuUlBjbVJsY21Wa1RHbHpkRndpWFNjc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSE4wZVd4bFNXNW1iMXNuYkdsemRDMXpkSGxzWlNkZElEMDlQU0FuYjNKa1pYSmxaQ2M3WEc1Y2RGeDBYSFI5S1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2RYQmtZWFJsSUhKbFkyVnVkQ0JqYjJ4dmNseHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0JpZFhSMGIyNWNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1pYWmxiblJPWVcxbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0TmFYaGxaSDBnZG1Gc2RXVmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMblZ3WkdGMFpWSmxZMlZ1ZEVOdmJHOXlJRDBnWm5WdVkzUnBiMjRnS0dKMWRIUnZiaXdnWlhabGJuUk9ZVzFsTENCMllXeDFaU2tnZTF4dVhIUmNkRngwZG1GeUlDUmpiMnh2Y2lBOUlDUW9ZblYwZEc5dUtTNWpiRzl6WlhOMEtDY3VibTkwWlMxamIyeHZjaWNwTzF4dVhIUmNkRngwZG1GeUlDUnlaV05sYm5SRGIyeHZjaUE5SUNSamIyeHZjaTVtYVc1a0tDY3VibTkwWlMxeVpXTmxiblF0WTI5c2IzSW5LVHRjYmx4MFhIUmNkSFpoY2lCamIyeHZja2x1Wm04Z1BTQktVMDlPTG5CaGNuTmxLQ1J5WldObGJuUkRiMnh2Y2k1aGRIUnlLQ2RrWVhSaExYWmhiSFZsSnlrcE8xeHVYSFJjZEZ4MFkyOXNiM0pKYm1adlcyVjJaVzUwVG1GdFpWMGdQU0IyWVd4MVpUdGNibHgwWEhSY2RDUnlaV05sYm5SRGIyeHZjaTVoZEhSeUtDZGtZWFJoTFhaaGJIVmxKeXdnU2xOUFRpNXpkSEpwYm1kcFpua29ZMjlzYjNKSmJtWnZLU2s3WEc1Y2RGeDBYSFIyWVhJZ2MwdGxlU0E5SUdWMlpXNTBUbUZ0WlNBOVBUMGdKMkpoWTJ0RGIyeHZjaWNnUHlBblltRmphMmR5YjNWdVpDMWpiMnh2Y2ljZ09pQW5ZMjlzYjNJbk8xeHVYSFJjZEZ4MEpISmxZMlZ1ZEVOdmJHOXlMbVpwYm1Rb0oya25LUzVqYzNNb2MwdGxlU3dnZG1Gc2RXVXBPMXh1WEhSY2RIMDdYRzVjZEgwN1hHNWNibHgwTHlvcVhHNWNkQ0FxSUVCamJHRnpjeUJ0YjJSMWJHVXVWRzl2YkdKaGNseHVYSFFnS2x4dVhIUWdLaUJVYjI5c1ltRnlYRzVjZENBcUwxeHVYSFIyWVhJZ1ZHOXZiR0poY2lBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUjJZWElnWW5WMGRHOXVJRDBnYm1WM0lFSjFkSFJ2YmlncE8xeHVYRzVjZEZ4MGRHaHBjeTUxY0dSaGRHVWdQU0JtZFc1amRHbHZiaUFvSkhSdmIyeGlZWElzSUhOMGVXeGxTVzVtYnlrZ2UxeHVYSFJjZEZ4MFluVjBkRzl1TG5Wd1pHRjBaU2drZEc5dmJHSmhjaXdnYzNSNWJHVkpibVp2S1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0JpZFhSMGIyNWNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1pYWmxiblJPWVcxbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUhaaGJIVmxYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTUxY0dSaGRHVlNaV05sYm5SRGIyeHZjaUE5SUdaMWJtTjBhVzl1SUNoaWRYUjBiMjVPYjJSbExDQmxkbVZ1ZEU1aGJXVXNJSFpoYkhWbEtTQjdYRzVjZEZ4MFhIUmlkWFIwYjI0dWRYQmtZWFJsVW1WalpXNTBRMjlzYjNJb1luVjBkRzl1VG05a1pTd2daWFpsYm5ST1lXMWxMQ0IyWVd4MVpTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJR0ZqZEdsMllYUmxJR0oxZEhSdmJuTWdaWGhqYkhWa1pTQmpiMlJsZG1sbGQxeHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa2RHOXZiR0poY2x4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdVlXTjBhWFpoZEdVZ1BTQm1kVzVqZEdsdmJpQW9KSFJ2YjJ4aVlYSXBJSHRjYmx4MFhIUmNkQ1IwYjI5c1ltRnlMbVpwYm1Rb0oySjFkSFJ2YmljcFhHNWNkRngwWEhSY2RGeDBMbTV2ZENnblluVjBkRzl1VzJSaGRHRXRaWFpsYm5ROVhDSmpiMlJsZG1sbGQxd2lYU2NwWEc1Y2RGeDBYSFJjZEZ4MExuSmxiVzkyWlVOc1lYTnpLQ2RrYVhOaFlteGxaQ2NwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCa1pXRmpkR2wyWVhSbElHSjFkSFJ2Ym5NZ1pYaGpiSFZrWlNCamIyUmxkbWxsZDF4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrZEc5dmJHSmhjbHh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11WkdWaFkzUnBkbUYwWlNBOUlHWjFibU4wYVc5dUlDZ2tkRzl2YkdKaGNpa2dlMXh1WEhSY2RGeDBKSFJ2YjJ4aVlYSXVabWx1WkNnblluVjBkRzl1SnlsY2JseDBYSFJjZEZ4MFhIUXVibTkwS0NkaWRYUjBiMjViWkdGMFlTMWxkbVZ1ZEQxY0ltTnZaR1YyYVdWM1hDSmRKeWxjYmx4MFhIUmNkRngwWEhRdVlXUmtRMnhoYzNNb0oyUnBjMkZpYkdWa0p5azdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtZMjl1ZEdGcGJtVnlYRzVjZEZ4MElDb2dRSEJoY21GdElIdENiMjlzWldGdWZTQmJZa1oxYkd4elkzSmxaVzQ5Wm1Gc2MyVmRYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTUxY0dSaGRHVkdkV3hzYzJOeVpXVnVJRDBnWm5WdVkzUnBiMjRnS0NSamIyNTBZV2x1WlhJc0lHSkdkV3hzYzJOeVpXVnVLU0I3WEc1Y2RGeDBYSFIyWVhJZ0pHSjBiaUE5SUNSamIyNTBZV2x1WlhJdVptbHVaQ2duWW5WMGRHOXVXMlJoZEdFdFpYWmxiblE5WENKbWRXeHNjMk55WldWdVhDSmRKeWs3WEc1Y2RGeDBYSFFrWW5SdUxuUnZaMmRzWlVOc1lYTnpLQ2RoWTNScGRtVW5MQ0JpUm5Wc2JITmpjbVZsYmlrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa1kyOXVkR0ZwYm1WeVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IyOXNaV0Z1ZlNCYmFYTkRiMlJsZG1sbGR6MW1ZV3h6WlYxY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxuVndaR0YwWlVOdlpHVjJhV1YzSUQwZ1puVnVZM1JwYjI0Z0tDUmpiMjUwWVdsdVpYSXNJR2x6UTI5a1pYWnBaWGNwSUh0Y2JseDBYSFJjZEhaaGNpQWtZblJ1SUQwZ0pHTnZiblJoYVc1bGNpNW1hVzVrS0NkaWRYUjBiMjViWkdGMFlTMWxkbVZ1ZEQxY0ltTnZaR1YyYVdWM1hDSmRKeWs3WEc1Y2RGeDBYSFFrWW5SdUxuUnZaMmRzWlVOc1lYTnpLQ2RoWTNScGRtVW5MQ0JwYzBOdlpHVjJhV1YzS1R0Y2JseHVYSFJjZEZ4MGFXWWdLR2x6UTI5a1pYWnBaWGNwSUh0Y2JseDBYSFJjZEZ4MGRHaHBjeTVrWldGamRHbDJZWFJsS0NSamIyNTBZV2x1WlhJcE8xeHVYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MGRHaHBjeTVoWTNScGRtRjBaU2drWTI5dWRHRnBibVZ5S1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1oyVjBJR0oxZEhSdmJpQnBiaUIwYjI5c1ltRnlJRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCdVlXMWxYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdhbEYxWlhKNWZWeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVaMlYwSUQwZ1puVnVZM1JwYjI0Z0tDUmxaR2wwWVdKc1pTd2dibUZ0WlNrZ2UxeHVYSFJjZEZ4MGRtRnlJQ1IwYjI5c1ltRnlJRDBnWkc5dExtMWhhMlZNWVhsdmRYUkpibVp2S0NSbFpHbDBZV0pzWlNrdWRHOXZiR0poY2lncE8xeHVYRzVjZEZ4MFhIUnlaWFIxY200Z0pIUnZiMnhpWVhJdVptbHVaQ2duVzJSaGRHRXRibUZ0WlQwbklDc2dibUZ0WlNBcklDZGRKeWs3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhObGRDQmlkWFIwYjI0Z2MzUmhkR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1ZrYVhSaFlteGxYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlHNWhiV1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMEp2YjJ4bFlXNTlJRnRwYzBGamRHbDJaVDEwY25WbFhWeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVjMlYwUW5WMGRHOXVVM1JoZEdVZ1BTQm1kVzVqZEdsdmJpQW9KR1ZrYVhSaFlteGxMQ0J1WVcxbExDQnBjMEZqZEdsMlpTa2dlMXh1WEhSY2RGeDBhWE5CWTNScGRtVWdQU0FvYVhOQlkzUnBkbVVnUFQwOUlHWmhiSE5sS1NBL0lHWmhiSE5sSURvZ2RISjFaVHRjYmx4dVhIUmNkRngwZG1GeUlDUmlkWFIwYjI0Z1BTQjBhR2x6TG1kbGRDZ2taV1JwZEdGaWJHVXNJRzVoYldVcE8xeHVYSFJjZEZ4MEpHSjFkSFJ2Ymk1MGIyZG5iR1ZEYkdGemN5Z25ZV04wYVhabEp5d2dhWE5CWTNScGRtVXBPMXh1WEhSY2RIMDdYRzVjZEgwN1hHNWNibHgwZG1GeUlFVkVTVlJCUWt4RlgxQkJSRVJKVGtjZ1BTQXlORHRjYmx4dVhIUjJZWElnVTNSaGRIVnpZbUZ5SUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RIWmhjaUFrWkc5amRXMWxiblFnUFNBa0tHUnZZM1Z0Wlc1MEtUdGNibHh1WEhSY2RIUm9hWE11WVhSMFlXTm9JRDBnWm5WdVkzUnBiMjRnS0d4aGVXOTFkRWx1Wm04c0lHOXdkR2x2Ym5NcElIdGNibHgwWEhSY2RHbG1JQ2doYjNCMGFXOXVjeTVrYVhOaFlteGxVbVZ6YVhwbFJXUnBkRzl5S1NCN1hHNWNkRngwWEhSY2RHeGhlVzkxZEVsdVptOHVjM1JoZEhWelltRnlLQ2t1YjI0b0oyMXZkWE5sWkc5M2JpY3NJR2hUZEdGMGRYTmlZWEpOYjNWelpXUnZkMjRwTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCZ2JXOTFjMlZrYjNkdVlDQmxkbVZ1ZENCb1lXNWtiR1Z5SUc5dUlITjBZWFIxYzJKaGNseHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0TmIzVnpaVVYyWlc1MGZTQmxkbVZ1ZEZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCb1UzUmhkSFZ6WW1GeVRXOTFjMlZrYjNkdUlEMGdablZ1WTNScGIyNGdLR1YyWlc1MEtTQjdYRzVjZEZ4MFhIUmxkbVZ1ZEM1d2NtVjJaVzUwUkdWbVlYVnNkQ2dwTzF4dVhIUmNkRngwWlhabGJuUXVjM1J2Y0ZCeWIzQmhaMkYwYVc5dUtDazdYRzVjYmx4MFhIUmNkSFpoY2lBa1pXUnBkR0ZpYkdVZ1BTQmtiMjB1YldGclpVeGhlVzkxZEVsdVptOG9aWFpsYm5RdWRHRnlaMlYwS1M1bFpHbDBZV0pzWlNncE8xeHVYSFJjZEZ4MGRtRnlJR1ZrYVhSaFlteGxWRzl3SUQwZ0pHVmthWFJoWW14bExtOW1abk5sZENncExuUnZjQ0F0SUNSa2IyTjFiV1Z1ZEM1elkzSnZiR3hVYjNBb0tUdGNibHh1WEhSY2RGeDBkbUZ5SUd4aGVXOTFkRWx1Wm04Z1BTQmtiMjB1YldGclpVeGhlVzkxZEVsdVptOG9aWFpsYm5RdVkzVnljbVZ1ZEZSaGNtZGxkQ0I4ZkNCbGRtVnVkQzUwWVhKblpYUXBPMXh1WEhSY2RGeDBkbUZ5SUc5d2RHbHZibk1nUFNCc1lYbHZkWFJKYm1adkxtVmthWFJ2Y2lncExtUmhkR0VvSjI5d2RHbHZibk1uS1R0Y2JseHVYSFJjZEZ4MEpHUnZZM1Z0Wlc1MExtOXVLQ2R0YjNWelpXMXZkbVVuTENCbWRXNWpkR2x2YmlBb1pYWmxiblFwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJRzVJWldsbmFIUWdQU0JsZG1WdWRDNWpiR2xsYm5SWklDMGdLR1ZrYVhSaFlteGxWRzl3SUNzZ1JVUkpWRUZDVEVWZlVFRkVSRWxPUnlrN1hHNWNibHgwWEhSY2RGeDBia2hsYVdkb2RDQTlJQ2h2Y0hScGIyNXpMbTFwYmtobGFXZG9kQ0ErSURBcElEOGdUV0YwYUM1dFlYZ29ia2hsYVdkb2RDd2diM0IwYVc5dWN5NXRhVzVJWldsbmFIUXBJRG9nYmtobGFXZG9kRHRjYmx4MFhIUmNkRngwYmtobGFXZG9kQ0E5SUNodmNIUnBiMjV6TG0xaGVFaGxhV2RvZENBK0lEQXBJRDhnVFdGMGFDNXRhVzRvYmtobGFXZG9kQ3dnYjNCMGFXOXVjeTV0WVhoSVpXbG5hSFFwSURvZ2JraGxhV2RvZER0Y2JseHVYSFJjZEZ4MFhIUWtaV1JwZEdGaWJHVXVhR1ZwWjJoMEtHNUlaV2xuYUhRcE8xeHVYSFJjZEZ4MGZTa3ViMjVsS0NkdGIzVnpaWFZ3Snl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFFrWkc5amRXMWxiblF1YjJabUtDZHRiM1Z6WlcxdmRtVW5LVHRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkSDA3WEc1Y2RIMDdYRzVjYmx4MEx5b3FYRzVjZENBcUlFQmpiR0Z6Y3lCdGIyUjFiR1V1VUc5d2IzWmxjbHh1WEhRZ0tseHVYSFFnS2lCUWIzQnZkbVZ5SUNob2RIUndPaTh2WjJWMFltOXZkSE4wY21Gd0xtTnZiUzlxWVhaaGMyTnlhWEIwTHlOd2IzQnZkbVZ5Y3lsY2JseDBJQ3BjYmx4MElDb3ZYRzVjZEhaaGNpQlFiM0J2ZG1WeUlEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkSFpoY2lCaWRYUjBiMjRnUFNCdVpYY2dRblYwZEc5dUtDazdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ5WlhSMWNtNXpJSEJ2YzJsMGFXOXVJR1p5YjIwZ2NHeGhZMlZvYjJ4a1pYSmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndjbWwyWVhSbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J3YkdGalpXaHZiR1JsY2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UW05dmJHVmhibjBnYVhOQmFYSk5iMlJsWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3VDJKcVpXTjBmVnh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMDUxYldKbGNuMGdjbVYwZFhKdUxteGxablJjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRPZFcxaVpYSjlJSEpsZEhWeWJpNTBiM0JjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnY0c5elJuSnZiVkJzWVdObGFHOXNaR1Z5SUQwZ1puVnVZM1JwYjI0Z0tIQnNZV05sYUc5c1pHVnlMQ0JwYzBGcGNrMXZaR1VwSUh0Y2JseDBYSFJjZEhaaGNpQWtjR3hoWTJWb2IyeGtaWElnUFNBa0tIQnNZV05sYUc5c1pHVnlLVHRjYmx4MFhIUmNkSFpoY2lCd2IzTWdQU0JwYzBGcGNrMXZaR1VnUHlBa2NHeGhZMlZvYjJ4a1pYSXViMlptYzJWMEtDa2dPaUFrY0d4aFkyVm9iMnhrWlhJdWNHOXphWFJwYjI0b0tUdGNibHgwWEhSY2RIWmhjaUJvWldsbmFIUWdQU0FrY0d4aFkyVm9iMnhrWlhJdWIzVjBaWEpJWldsbmFIUW9kSEoxWlNrN0lDOHZJR2x1WTJ4MVpHVWdiV0Z5WjJsdVhHNWNibHgwWEhSY2RDOHZJSEJ2Y0c5MlpYSWdZbVZzYjNjZ2NHeGhZMlZvYjJ4a1pYSXVYRzVjZEZ4MFhIUnlaWFIxY200Z2UxeHVYSFJjZEZ4MFhIUnNaV1owT2lCd2IzTXViR1ZtZEN4Y2JseDBYSFJjZEZ4MGRHOXdPaUJ3YjNNdWRHOXdJQ3NnYUdWcFoyaDBYRzVjZEZ4MFhIUjlPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ6YUc5M0lIQnZjRzkyWlhKY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd2NtbDJZWFJsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJSEJ2Y0c5MlpYSmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxQnZjMmwwYVc5dWZTQndiM05jYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnYzJodmQxQnZjRzkyWlhJZ1BTQm1kVzVqZEdsdmJpQW9KSEJ2Y0c5MlpYSXNJSEJ2Y3lrZ2UxeHVYSFJjZEZ4MEpIQnZjRzkyWlhJdVkzTnpLSHRjYmx4MFhIUmNkRngwWkdsemNHeGhlVG9nSjJKc2IyTnJKeXhjYmx4MFhIUmNkRngwYkdWbWREb2djRzl6TG14bFpuUXNYRzVjZEZ4MFhIUmNkSFJ2Y0RvZ2NHOXpMblJ2Y0Z4dVhIUmNkRngwZlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQlFXRjlRVDFCUFZrVlNYMEZTVWs5WFgwOUdSbE5GVkY5WUlEMGdNakE3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCMWNHUmhkR1VnWTNWeWNtVnVkQ0J6ZEdGMFpWeHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa2NHOXdiM1psY2lBdElIQnZjRzkyWlhJZ1kyOXVkR0ZwYm1WeVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUhOMGVXeGxTVzVtYnlBdElITjBlV3hsSUc5aWFtVmpkRnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRbTl2YkdWaGJuMGdhWE5CYVhKTmIyUmxYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTUxY0dSaGRHVWdQU0JtZFc1amRHbHZiaUFvSkhCdmNHOTJaWElzSUhOMGVXeGxTVzVtYnl3Z2FYTkJhWEpOYjJSbEtTQjdYRzVjZEZ4MFhIUmlkWFIwYjI0dWRYQmtZWFJsS0NSd2IzQnZkbVZ5TENCemRIbHNaVWx1Wm04cE8xeHVYRzVjZEZ4MFhIUjJZWElnSkd4cGJtdFFiM0J2ZG1WeUlEMGdKSEJ2Y0c5MlpYSXVabWx1WkNnbkxtNXZkR1V0YkdsdWF5MXdiM0J2ZG1WeUp5azdYRzVjZEZ4MFhIUnBaaUFvYzNSNWJHVkpibVp2TG1GdVkyaHZjaWtnZTF4dVhIUmNkRngwWEhSMllYSWdKR0Z1WTJodmNpQTlJQ1JzYVc1clVHOXdiM1psY2k1bWFXNWtLQ2RoSnlrN1hHNWNkRngwWEhSY2RIWmhjaUJvY21WbUlEMGdKQ2h6ZEhsc1pVbHVabTh1WVc1amFHOXlLUzVoZEhSeUtDZG9jbVZtSnlrN1hHNWNkRngwWEhSY2RIWmhjaUIwWVhKblpYUWdQU0FrS0hOMGVXeGxTVzVtYnk1aGJtTm9iM0lwTG1GMGRISW9KM1JoY21kbGRDY3BPMXh1WEhSY2RGeDBYSFFrWVc1amFHOXlMbUYwZEhJb0oyaHlaV1luTENCb2NtVm1LUzVvZEcxc0tHaHlaV1lwTzF4dVhIUmNkRngwWEhScFppQW9JWFJoY21kbGRDa2dlMXh1WEhSY2RGeDBYSFJjZENSaGJtTm9iM0l1Y21WdGIzWmxRWFIwY2lnbmRHRnlaMlYwSnlrN1hHNWNkRngwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RGeDBKR0Z1WTJodmNpNWhkSFJ5S0NkMFlYSm5aWFFuTENBblgySnNZVzVySnlrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBjMmh2ZDFCdmNHOTJaWElvSkd4cGJtdFFiM0J2ZG1WeUxDQndiM05HY205dFVHeGhZMlZvYjJ4a1pYSW9jM1I1YkdWSmJtWnZMbUZ1WTJodmNpd2dhWE5CYVhKTmIyUmxLU2s3WEc1Y2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFFrYkdsdWExQnZjRzkyWlhJdWFHbGtaU2dwTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSMllYSWdKR2x0WVdkbFVHOXdiM1psY2lBOUlDUndiM0J2ZG1WeUxtWnBibVFvSnk1dWIzUmxMV2x0WVdkbExYQnZjRzkyWlhJbktUdGNibHgwWEhSY2RHbG1JQ2h6ZEhsc1pVbHVabTh1YVcxaFoyVXBJSHRjYmx4MFhIUmNkRngwYzJodmQxQnZjRzkyWlhJb0pHbHRZV2RsVUc5d2IzWmxjaXdnY0c5elJuSnZiVkJzWVdObGFHOXNaR1Z5S0hOMGVXeGxTVzVtYnk1cGJXRm5aU3dnYVhOQmFYSk5iMlJsS1NrN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhRa2FXMWhaMlZRYjNCdmRtVnlMbWhwWkdVb0tUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBkbUZ5SUNSaGFYSlFiM0J2ZG1WeUlEMGdKSEJ2Y0c5MlpYSXVabWx1WkNnbkxtNXZkR1V0WVdseUxYQnZjRzkyWlhJbktUdGNibHgwWEhSY2RHbG1JQ2hwYzBGcGNrMXZaR1VnSmlZZ0lYTjBlV3hsU1c1bWJ5NXlZVzVuWlM1cGMwTnZiR3hoY0hObFpDZ3BLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQnlaV04wSUQwZ2JHbHpkQzVzWVhOMEtITjBlV3hsU1c1bWJ5NXlZVzVuWlM1blpYUkRiR2xsYm5SU1pXTjBjeWdwS1R0Y2JseDBYSFJjZEZ4MGFXWWdLSEpsWTNRcElIdGNibHgwWEhSY2RGeDBYSFIyWVhJZ1ltNWtJRDBnWm5WdVl5NXlaV04wTW1KdVpDaHlaV04wS1R0Y2JseDBYSFJjZEZ4MFhIUnphRzkzVUc5d2IzWmxjaWdrWVdseVVHOXdiM1psY2l3Z2UxeHVYSFJjZEZ4MFhIUmNkRngwYkdWbWREb2dUV0YwYUM1dFlYZ29ZbTVrTG14bFpuUWdLeUJpYm1RdWQybGtkR2dnTHlBeUlDMGdVRmhmVUU5UVQxWkZVbDlCVWxKUFYxOVBSa1pUUlZSZldDd2dNQ2tzWEc1Y2RGeDBYSFJjZEZ4MFhIUjBiM0E2SUdKdVpDNTBiM0FnS3lCaWJtUXVhR1ZwWjJoMFhHNWNkRngwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZENSaGFYSlFiM0J2ZG1WeUxtaHBaR1VvS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0JpZFhSMGIyNWNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1pYWmxiblJPWVcxbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUhaaGJIVmxYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTUxY0dSaGRHVlNaV05sYm5SRGIyeHZjaUE5SUdaMWJtTjBhVzl1SUNoaWRYUjBiMjRzSUdWMlpXNTBUbUZ0WlN3Z2RtRnNkV1VwSUh0Y2JseDBYSFJjZEdKMWRIUnZiaTUxY0dSaGRHVlNaV05sYm5SRGIyeHZjaWhpZFhSMGIyNHNJR1YyWlc1MFRtRnRaU3dnZG1Gc2RXVXBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJvYVdSbElHRnNiQ0J3YjNCdmRtVnljMXh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtjRzl3YjNabGNpQXRJSEJ2Y0c5MlpYSWdZMjl1ZEdGcGJtVnlYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTVvYVdSbElEMGdablZ1WTNScGIyNGdLQ1J3YjNCdmRtVnlLU0I3WEc1Y2RGeDBYSFFrY0c5d2IzWmxjaTVqYUdsc1pISmxiaWdwTG1ocFpHVW9LVHRjYmx4MFhIUjlPMXh1WEhSOU8xeHVYRzVjZEM4cUtseHVYSFFnS2lCQVkyeGhjM01nYlc5a2RXeGxMa2hoYm1Sc1pWeHVYSFFnS2x4dVhIUWdLaUJJWVc1a2JHVmNibHgwSUNvdlhHNWNkSFpoY2lCSVlXNWtiR1VnUFNCbWRXNWpkR2x2YmlBb2FHRnVaR3hsY2lrZ2UxeHVYSFJjZEhaaGNpQWtaRzlqZFcxbGJuUWdQU0FrS0dSdlkzVnRaVzUwS1R0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHQnRiM1Z6WldSdmQyNWdJR1YyWlc1MElHaGhibVJzWlhJZ2IyNGdKR2hoYm1Sc1pWeHVYSFJjZENBcUlDQXRJR052Ym5SeWIyeFRhWHBwYm1jNklISmxjMmw2WlNCcGJXRm5aVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE5iM1Z6WlVWMlpXNTBmU0JsZG1WdWRGeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQm9TR0Z1Wkd4bFRXOTFjMlZrYjNkdUlEMGdablZ1WTNScGIyNGdLR1YyWlc1MEtTQjdYRzVjZEZ4MFhIUnBaaUFvWkc5dExtbHpRMjl1ZEhKdmJGTnBlbWx1WnlobGRtVnVkQzUwWVhKblpYUXBLU0I3WEc1Y2RGeDBYSFJjZEdWMlpXNTBMbkJ5WlhabGJuUkVaV1poZFd4MEtDazdYRzVjZEZ4MFhIUmNkR1YyWlc1MExuTjBiM0JRY205d1lXZGhkR2x2YmlncE8xeHVYRzVjZEZ4MFhIUmNkSFpoY2lCc1lYbHZkWFJKYm1adklEMGdaRzl0TG0xaGEyVk1ZWGx2ZFhSSmJtWnZLR1YyWlc1MExuUmhjbWRsZENrc1hHNWNkRngwWEhSY2RGeDBKR2hoYm1Sc1pTQTlJR3hoZVc5MWRFbHVabTh1YUdGdVpHeGxLQ2tzWEc1Y2RGeDBYSFJjZEZ4MEpIQnZjRzkyWlhJZ1BTQnNZWGx2ZFhSSmJtWnZMbkJ2Y0c5MlpYSW9LU3hjYmx4MFhIUmNkRngwWEhRa1pXUnBkR0ZpYkdVZ1BTQnNZWGx2ZFhSSmJtWnZMbVZrYVhSaFlteGxLQ2tzWEc1Y2RGeDBYSFJjZEZ4MEpHVmthWFJ2Y2lBOUlHeGhlVzkxZEVsdVptOHVaV1JwZEc5eUtDazdYRzVjYmx4MFhIUmNkRngwZG1GeUlIUmhjbWRsZENBOUlDUm9ZVzVrYkdVdVptbHVaQ2duTG01dmRHVXRZMjl1ZEhKdmJDMXpaV3hsWTNScGIyNG5LUzVrWVhSaEtDZDBZWEpuWlhRbktTeGNibHgwWEhSY2RGeDBYSFFrZEdGeVoyVjBJRDBnSkNoMFlYSm5aWFFwTENCd2IzTlRkR0Z5ZENBOUlDUjBZWEpuWlhRdWIyWm1jMlYwS0Nrc1hHNWNkRngwWEhSY2RGeDBjMk55YjJ4c1ZHOXdJRDBnSkdSdlkzVnRaVzUwTG5OamNtOXNiRlJ2Y0NncE8xeHVYRzVjZEZ4MFhIUmNkSFpoY2lCcGMwRnBjazF2WkdVZ1BTQWtaV1JwZEc5eUxtUmhkR0VvSjI5d2RHbHZibk1uS1M1aGFYSk5iMlJsTzF4dVhHNWNkRngwWEhSY2RDUmtiMk4xYldWdWRDNXZiaWduYlc5MWMyVnRiM1psSnl3Z1puVnVZM1JwYjI0Z0tHVjJaVzUwS1NCN1hHNWNkRngwWEhSY2RGeDBhR0Z1Wkd4bGNpNXBiblp2YTJVb0oyVmthWFJ2Y2k1eVpYTnBlbVZVYnljc0lIdGNibHgwWEhSY2RGeDBYSFJjZEhnNklHVjJaVzUwTG1Oc2FXVnVkRmdnTFNCd2IzTlRkR0Z5ZEM1c1pXWjBMRnh1WEhSY2RGeDBYSFJjZEZ4MGVUb2daWFpsYm5RdVkyeHBaVzUwV1NBdElDaHdiM05UZEdGeWRDNTBiM0FnTFNCelkzSnZiR3hVYjNBcFhHNWNkRngwWEhSY2RGeDBmU3dnSkhSaGNtZGxkQ3dnSVdWMlpXNTBMbk5vYVdaMFMyVjVLVHRjYmx4dVhIUmNkRngwWEhSY2RHaGhibVJzWlhJdWFXNTJiMnRsS0Nkb1lXNWtiR1V1ZFhCa1lYUmxKeXdnSkdoaGJtUnNaU3dnZXlCcGJXRm5aVG9nZEdGeVoyVjBJSDBzSUdselFXbHlUVzlrWlNrN1hHNWNkRngwWEhSY2RGeDBhR0Z1Wkd4bGNpNXBiblp2YTJVb0ozQnZjRzkyWlhJdWRYQmtZWFJsSnl3Z0pIQnZjRzkyWlhJc0lIc2dhVzFoWjJVNklIUmhjbWRsZENCOUxDQnBjMEZwY2sxdlpHVXBPMXh1WEhSY2RGeDBYSFI5S1M1dmJtVW9KMjF2ZFhObGRYQW5MQ0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RGeDBKR1J2WTNWdFpXNTBMbTltWmlnbmJXOTFjMlZ0YjNabEp5azdYRzVjZEZ4MFhIUmNkRngwYUdGdVpHeGxjaTVwYm5admEyVW9KMlZrYVhSdmNpNWhablJsY2tOdmJXMWhibVFuTENBa1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEZ4MFhIUjlLVHRjYmx4dVhIUmNkRngwWEhScFppQW9JU1IwWVhKblpYUXVaR0YwWVNnbmNtRjBhVzhuS1NrZ2V5QXZMeUJ2Y21sbmFXNWhiQ0J5WVhScGJ5NWNibHgwWEhSY2RGeDBYSFFrZEdGeVoyVjBMbVJoZEdFb0ozSmhkR2x2Snl3Z0pIUmhjbWRsZEM1b1pXbG5hSFFvS1NBdklDUjBZWEpuWlhRdWQybGtkR2dvS1NrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYRzVjZEZ4MGRHaHBjeTVoZEhSaFkyZ2dQU0JtZFc1amRHbHZiaUFvYkdGNWIzVjBTVzVtYnlrZ2UxeHVYSFJjZEZ4MGJHRjViM1YwU1c1bWJ5NW9ZVzVrYkdVb0tTNXZiaWduYlc5MWMyVmtiM2R1Snl3Z2FFaGhibVJzWlUxdmRYTmxaRzkzYmlrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlIVndaR0YwWlNCb1lXNWtiR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR2hoYm1Sc1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCemRIbHNaVWx1Wm05Y2JseDBYSFFnS2lCQWNHRnlZVzBnZTBKdmIyeGxZVzU5SUdselFXbHlUVzlrWlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdWRYQmtZWFJsSUQwZ1puVnVZM1JwYjI0Z0tDUm9ZVzVrYkdVc0lITjBlV3hsU1c1bWJ5d2dhWE5CYVhKTmIyUmxLU0I3WEc1Y2RGeDBYSFIyWVhJZ0pITmxiR1ZqZEdsdmJpQTlJQ1JvWVc1a2JHVXVabWx1WkNnbkxtNXZkR1V0WTI5dWRISnZiQzF6Wld4bFkzUnBiMjRuS1R0Y2JseDBYSFJjZEdsbUlDaHpkSGxzWlVsdVptOHVhVzFoWjJVcElIdGNibHgwWEhSY2RGeDBkbUZ5SUNScGJXRm5aU0E5SUNRb2MzUjViR1ZKYm1adkxtbHRZV2RsS1R0Y2JseDBYSFJjZEZ4MGRtRnlJSEJ2Y3lBOUlHbHpRV2x5VFc5a1pTQS9JQ1JwYldGblpTNXZabVp6WlhRb0tTQTZJQ1JwYldGblpTNXdiM05wZEdsdmJpZ3BPMXh1WEc1Y2RGeDBYSFJjZEM4dklHbHVZMngxWkdVZ2JXRnlaMmx1WEc1Y2RGeDBYSFJjZEhaaGNpQnBiV0ZuWlZOcGVtVWdQU0I3WEc1Y2RGeDBYSFJjZEZ4MGR6b2dKR2x0WVdkbExtOTFkR1Z5VjJsa2RHZ29kSEoxWlNrc1hHNWNkRngwWEhSY2RGeDBhRG9nSkdsdFlXZGxMbTkxZEdWeVNHVnBaMmgwS0hSeWRXVXBYRzVjZEZ4MFhIUmNkSDA3WEc1Y2JseDBYSFJjZEZ4MEpITmxiR1ZqZEdsdmJpNWpjM01vZTF4dVhIUmNkRngwWEhSY2RHUnBjM0JzWVhrNklDZGliRzlqYXljc1hHNWNkRngwWEhSY2RGeDBiR1ZtZERvZ2NHOXpMbXhsWm5Rc1hHNWNkRngwWEhSY2RGeDBkRzl3T2lCd2IzTXVkRzl3TEZ4dVhIUmNkRngwWEhSY2RIZHBaSFJvT2lCcGJXRm5aVk5wZW1VdWR5eGNibHgwWEhSY2RGeDBYSFJvWldsbmFIUTZJR2x0WVdkbFUybDZaUzVvWEc1Y2RGeDBYSFJjZEgwcExtUmhkR0VvSjNSaGNtZGxkQ2NzSUhOMGVXeGxTVzVtYnk1cGJXRm5aU2s3SUM4dklITmhkbVVnWTNWeWNtVnVkQ0JwYldGblpTQmxiR1Z0Wlc1MExseHVYSFJjZEZ4MFhIUjJZWElnYzJsNmFXNW5WR1Y0ZENBOUlHbHRZV2RsVTJsNlpTNTNJQ3NnSjNnbklDc2dhVzFoWjJWVGFYcGxMbWc3WEc1Y2RGeDBYSFJjZENSelpXeGxZM1JwYjI0dVptbHVaQ2duTG01dmRHVXRZMjl1ZEhKdmJDMXpaV3hsWTNScGIyNHRhVzVtYnljcExuUmxlSFFvYzJsNmFXNW5WR1Y0ZENrN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhRa2MyVnNaV04wYVc5dUxtaHBaR1VvS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2FHbGtaVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUm9ZVzVrYkdWY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxtaHBaR1VnUFNCbWRXNWpkR2x2YmlBb0pHaGhibVJzWlNrZ2UxeHVYSFJjZEZ4MEpHaGhibVJzWlM1amFHbHNaSEpsYmlncExtaHBaR1VvS1R0Y2JseDBYSFI5TzF4dVhIUjlPMXh1WEc1Y2RIWmhjaUJHZFd4c2MyTnlaV1Z1SUQwZ1puVnVZM1JwYjI0Z0tHaGhibVJzWlhJcElIdGNibHgwWEhSMllYSWdKSGRwYm1SdmR5QTlJQ1FvZDJsdVpHOTNLVHRjYmx4MFhIUjJZWElnSkhOamNtOXNiR0poY2lBOUlDUW9KMmgwYld3c0lHSnZaSGtuS1R0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlIUnZaMmRzWlNCbWRXeHNjMk55WldWdVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYkdGNWIzVjBTVzVtYjF4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdWRHOW5aMnhsSUQwZ1puVnVZM1JwYjI0Z0tHeGhlVzkxZEVsdVptOHBJSHRjYmx4dVhIUmNkRngwZG1GeUlDUmxaR2wwYjNJZ1BTQnNZWGx2ZFhSSmJtWnZMbVZrYVhSdmNpZ3BMRnh1WEhSY2RGeDBYSFFrZEc5dmJHSmhjaUE5SUd4aGVXOTFkRWx1Wm04dWRHOXZiR0poY2lncExGeHVYSFJjZEZ4MFhIUWtaV1JwZEdGaWJHVWdQU0JzWVhsdmRYUkpibVp2TG1Wa2FYUmhZbXhsS0Nrc1hHNWNkRngwWEhSY2RDUmpiMlJoWW14bElEMGdiR0Y1YjNWMFNXNW1ieTVqYjJSaFlteGxLQ2s3WEc1Y2JseDBYSFJjZEhaaGNpQnlaWE5wZW1VZ1BTQm1kVzVqZEdsdmJpQW9jMmw2WlNrZ2UxeHVYSFJjZEZ4MFhIUWtaV1JwZEdGaWJHVXVZM056S0Nkb1pXbG5hSFFuTENCemFYcGxMbWdwTzF4dVhIUmNkRngwWEhRa1kyOWtZV0pzWlM1amMzTW9KMmhsYVdkb2RDY3NJSE5wZW1VdWFDazdYRzVjZEZ4MFhIUmNkR2xtSUNna1kyOWtZV0pzWlM1a1lYUmhLQ2RqYldWa2FYUnZjaWNwS1NCN1hHNWNkRngwWEhSY2RGeDBKR052WkdGaWJHVXVaR0YwWVNnblkyMWxaR2wwYjNJbktTNXpaWFJ6YVhwbEtHNTFiR3dzSUhOcGVtVXVhQ2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgwN1hHNWNibHgwWEhSY2RDUmxaR2wwYjNJdWRHOW5aMnhsUTJ4aGMzTW9KMloxYkd4elkzSmxaVzRuS1R0Y2JseDBYSFJjZEhaaGNpQnBjMFoxYkd4elkzSmxaVzRnUFNBa1pXUnBkRzl5TG1oaGMwTnNZWE56S0NkbWRXeHNjMk55WldWdUp5azdYRzVjZEZ4MFhIUnBaaUFvYVhOR2RXeHNjMk55WldWdUtTQjdYRzVjZEZ4MFhIUmNkQ1JsWkdsMFlXSnNaUzVrWVhSaEtDZHZjbWRvWldsbmFIUW5MQ0FrWldScGRHRmliR1V1WTNOektDZG9aV2xuYUhRbktTazdYRzVjYmx4MFhIUmNkRngwSkhkcGJtUnZkeTV2YmlnbmNtVnphWHBsSnl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGMybDZaU2g3WEc1Y2RGeDBYSFJjZEZ4MFhIUm9PaUFrZDJsdVpHOTNMbWhsYVdkb2RDZ3BJQzBnSkhSdmIyeGlZWEl1YjNWMFpYSklaV2xuYUhRb0tTQXRJREUwTWx4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RGeDBmU2t1ZEhKcFoyZGxjaWduY21WemFYcGxKeWs3WEc1Y2JseDBYSFJjZEZ4MEpITmpjbTlzYkdKaGNpNWpjM01vSjI5MlpYSm1iRzkzSnl3Z0oyaHBaR1JsYmljcE8xeHVYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MEpIZHBibVJ2ZHk1dlptWW9KM0psYzJsNlpTY3BPMXh1WEhSY2RGeDBYSFJ5WlhOcGVtVW9lMXh1WEhSY2RGeDBYSFJjZEdnNklDUmxaR2wwWVdKc1pTNWtZWFJoS0NkdmNtZG9aV2xuYUhRbktWeHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwSkhOamNtOXNiR0poY2k1amMzTW9KMjkyWlhKbWJHOTNKeXdnSjNacGMybGliR1VuS1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGFHRnVaR3hsY2k1cGJuWnZhMlVvSjNSdmIyeGlZWEl1ZFhCa1lYUmxSblZzYkhOamNtVmxiaWNzSUNSMGIyOXNZbUZ5TENCcGMwWjFiR3h6WTNKbFpXNHBPMXh1WEhSY2RIMDdYRzVjZEgwN1hHNWNibHh1WEhSMllYSWdRMjlrWlUxcGNuSnZjanRjYmx4MGFXWWdLR0ZuWlc1MExtaGhjME52WkdWTmFYSnliM0lwSUh0Y2JseDBYSFJwWmlBb1lXZGxiblF1YVhOVGRYQndiM0owUVcxa0tTQjdYRzVjZEZ4MFhIUmZYMkp5YjNkelpYSnBabmxmYzJocGJWOXlaWEYxYVhKbFgxOG9XeWREYjJSbFRXbHljbTl5SjEwc0lHWjFibU4wYVc5dUlDaGpiU2tnZTF4dVhIUmNkRngwWEhSRGIyUmxUV2x5Y205eUlEMGdZMjA3WEc1Y2RGeDBYSFI5S1R0Y2JseDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBRMjlrWlUxcGNuSnZjaUE5SUhkcGJtUnZkeTVEYjJSbFRXbHljbTl5TzF4dVhIUmNkSDFjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFnS2lCQVkyeGhjM01nUTI5a1pYWnBaWGRjYmx4MElDb3ZYRzVjZEhaaGNpQkRiMlJsZG1sbGR5QTlJR1oxYm1OMGFXOXVJQ2hvWVc1a2JHVnlLU0I3WEc1Y2JseDBYSFIwYUdsekxuTjVibU1nUFNCbWRXNWpkR2x2YmlBb2JHRjViM1YwU1c1bWJ5a2dlMXh1WEhSY2RGeDBkbUZ5SUdselEyOWtaWFpwWlhjZ1BTQm9ZVzVrYkdWeUxtbHVkbTlyWlNnblkyOWtaWFpwWlhjdWFYTkJZM1JwZG1GMFpXUW5MQ0JzWVhsdmRYUkpibVp2S1R0Y2JseDBYSFJjZEdsbUlDaHBjME52WkdWMmFXVjNJQ1ltSUdGblpXNTBMbWhoYzBOdlpHVk5hWEp5YjNJcElIdGNibHgwWEhSY2RGeDBiR0Y1YjNWMFNXNW1ieTVqYjJSaFlteGxLQ2t1WkdGMFlTZ25ZMjFGWkdsMGIzSW5LUzV6WVhabEtDazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnNZWGx2ZFhSSmJtWnZYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdRbTl2YkdWaGJuMWNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbWx6UVdOMGFYWmhkR1ZrSUQwZ1puVnVZM1JwYjI0Z0tHeGhlVzkxZEVsdVptOHBJSHRjYmx4MFhIUmNkSFpoY2lBa1pXUnBkRzl5SUQwZ2JHRjViM1YwU1c1bWJ5NWxaR2wwYjNJb0tUdGNibHgwWEhSY2RISmxkSFZ5YmlBa1pXUnBkRzl5TG1oaGMwTnNZWE56S0NkamIyUmxkbWxsZHljcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQjBiMmRuYkdVZ1kyOWtaWFpwWlhkY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JzWVhsdmRYUkpibVp2WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1MGIyZG5iR1VnUFNCbWRXNWpkR2x2YmlBb2JHRjViM1YwU1c1bWJ5a2dlMXh1WEhSY2RGeDBhV1lnS0hSb2FYTXVhWE5CWTNScGRtRjBaV1FvYkdGNWIzVjBTVzVtYnlrcElIdGNibHgwWEhSY2RGeDBkR2hwY3k1a1pXRmpkR2wyWVhSbEtHeGhlVzkxZEVsdVptOHBPMXh1WEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBkR2hwY3k1aFkzUnBkbUYwWlNoc1lYbHZkWFJKYm1adktUdGNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dZV04wYVhaaGRHVWdZMjlrWlNCMmFXVjNYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2JHRjViM1YwU1c1bWIxeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVZV04wYVhaaGRHVWdQU0JtZFc1amRHbHZiaUFvYkdGNWIzVjBTVzVtYnlrZ2UxeHVYSFJjZEZ4MGRtRnlJQ1JsWkdsMGIzSWdQU0JzWVhsdmRYUkpibVp2TG1Wa2FYUnZjaWdwTEZ4dVhIUmNkRngwWEhRa2RHOXZiR0poY2lBOUlHeGhlVzkxZEVsdVptOHVkRzl2YkdKaGNpZ3BMRnh1WEhSY2RGeDBYSFFrWldScGRHRmliR1VnUFNCc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDa3NYRzVjZEZ4MFhIUmNkQ1JqYjJSaFlteGxJRDBnYkdGNWIzVjBTVzVtYnk1amIyUmhZbXhsS0Nrc1hHNWNkRngwWEhSY2RDUndiM0J2ZG1WeUlEMGdiR0Y1YjNWMFNXNW1ieTV3YjNCdmRtVnlLQ2tzWEc1Y2RGeDBYSFJjZENSb1lXNWtiR1VnUFNCc1lYbHZkWFJKYm1adkxtaGhibVJzWlNncE8xeHVYRzVjZEZ4MFhIUjJZWElnYjNCMGFXOXVjeUE5SUNSbFpHbDBiM0l1WkdGMFlTZ25iM0IwYVc5dWN5Y3BPMXh1WEc1Y2RGeDBYSFFrWTI5a1lXSnNaUzUyWVd3b1pHOXRMbWgwYld3b0pHVmthWFJoWW14bExDQnZjSFJwYjI1ekxuQnlaWFIwYVdaNVNIUnRiQ2twTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCMWJtTnZiVzFsYm5RZ2MyTnlhWEIwSUhSaFozTWdjMjhnZEdobGVTZHlaU0JqYjNKeVpXTjBJR2x1SUdOdlpHVWdkbWxsZDF4dVhIUmNkRngwSkdOdlpHRmliR1V1ZG1Gc0tDUmpiMlJoWW14bExuWmhiQ2dwTG5KbGNHeGhZMlVvSnp3aExTMDhjMk55YVhCMEp5d2dKenh6WTNKcGNIUW5LU2s3WEhKY2JseDBYSFJjZENSamIyUmhZbXhsTG5aaGJDZ2tZMjlrWVdKc1pTNTJZV3dvS1M1eVpYQnNZV05sS0NjOEwzTmpjbWx3ZEQ0dExUNG5MQ0FuUEM5elkzSnBjSFErSnlrcE8xeHVYRzVjZEZ4MFhIUWtZMjlrWVdKc1pTNW9aV2xuYUhRb0pHVmthWFJoWW14bExtaGxhV2RvZENncEtUdGNibHh1WEhSY2RGeDBhR0Z1Wkd4bGNpNXBiblp2YTJVb0ozUnZiMnhpWVhJdWRYQmtZWFJsUTI5a1pYWnBaWGNuTENBa2RHOXZiR0poY2l3Z2RISjFaU2s3WEc1Y2RGeDBYSFJvWVc1a2JHVnlMbWx1ZG05clpTZ25jRzl3YjNabGNpNW9hV1JsSnl3Z0pIQnZjRzkyWlhJcE8xeHVYSFJjZEZ4MGFHRnVaR3hsY2k1cGJuWnZhMlVvSjJoaGJtUnNaUzVvYVdSbEp5d2dKR2hoYm1Sc1pTazdYRzVjYmx4MFhIUmNkQ1JsWkdsMGIzSXVZV1JrUTJ4aGMzTW9KMk52WkdWMmFXVjNKeWs3WEc1Y2JseDBYSFJjZENSamIyUmhZbXhsTG1adlkzVnpLQ2s3WEc1Y2JseDBYSFJjZEM4dklHRmpkR2wyWVhSbElFTnZaR1ZOYVhKeWIzSWdZWE1nWTI5a1lXSnNaVnh1WEhSY2RGeDBhV1lnS0dGblpXNTBMbWhoYzBOdlpHVk5hWEp5YjNJcElIdGNibHgwWEhSY2RGeDBkbUZ5SUdOdFJXUnBkRzl5SUQwZ1EyOWtaVTFwY25KdmNpNW1jbTl0VkdWNGRFRnlaV0VvSkdOdlpHRmliR1ZiTUYwc0lHOXdkR2x2Ym5NdVkyOWtaVzFwY25KdmNpazdYRzVjYmx4MFhIUmNkRngwTHk4Z1EyOWtaVTFwY25KdmNpQlVaWEp1VTJWeWRtVnlYRzVjZEZ4MFhIUmNkR2xtSUNodmNIUnBiMjV6TG1OdlpHVnRhWEp5YjNJdWRHVnliaWtnZTF4dVhIUmNkRngwWEhSY2RIWmhjaUJ6WlhKMlpYSWdQU0J1WlhjZ1EyOWtaVTFwY25KdmNpNVVaWEp1VTJWeWRtVnlLRzl3ZEdsdmJuTXVZMjlrWlcxcGNuSnZjaTUwWlhKdUtUdGNibHgwWEhSY2RGeDBYSFJqYlVWa2FYUnZjaTUwWlhKdVUyVnlkbVZ5SUQwZ2MyVnlkbVZ5TzF4dVhIUmNkRngwWEhSY2RHTnRSV1JwZEc5eUxtOXVLQ2RqZFhKemIzSkJZM1JwZG1sMGVTY3NJR1oxYm1OMGFXOXVJQ2hqYlNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwYzJWeWRtVnlMblZ3WkdGMFpVRnlaMGhwYm5SektHTnRLVHRjYmx4MFhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEM4dklFTnZaR1ZOYVhKeWIzSWdhR0Z6YmlkMElGQmhaR1JwYm1jdVhHNWNkRngwWEhSY2RHTnRSV1JwZEc5eUxuTmxkRk5wZW1Vb2JuVnNiQ3dnSkdWa2FYUmhZbXhsTG05MWRHVnlTR1ZwWjJoMEtDa3BPMXh1WEhSY2RGeDBYSFFrWTI5a1lXSnNaUzVrWVhSaEtDZGpiVVZrYVhSdmNpY3NJR050UldScGRHOXlLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nWkdWaFkzUnBkbUYwWlNCamIyUmxJSFpwWlhkY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JzWVhsdmRYUkpibVp2WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1a1pXRmpkR2wyWVhSbElEMGdablZ1WTNScGIyNGdLR3hoZVc5MWRFbHVabThwSUh0Y2JseDBYSFJjZEhaaGNpQWtaV1JwZEc5eUlEMGdiR0Y1YjNWMFNXNW1ieTVsWkdsMGIzSW9LU3hjYmx4MFhIUmNkRngwSkhSdmIyeGlZWElnUFNCc1lYbHZkWFJKYm1adkxuUnZiMnhpWVhJb0tTeGNibHgwWEhSY2RGeDBKR1ZrYVhSaFlteGxJRDBnYkdGNWIzVjBTVzVtYnk1bFpHbDBZV0pzWlNncExGeHVYSFJjZEZ4MFhIUWtZMjlrWVdKc1pTQTlJR3hoZVc5MWRFbHVabTh1WTI5a1lXSnNaU2dwTzF4dVhHNWNkRngwWEhSMllYSWdiM0IwYVc5dWN5QTlJQ1JsWkdsMGIzSXVaR0YwWVNnbmIzQjBhVzl1Y3ljcE8xeHVYRzVjZEZ4MFhIUXZMeUJrWldGamRHbDJZWFJsSUVOdlpHVk5hWEp5YjNJZ1lYTWdZMjlrWVdKc1pWeHVYSFJjZEZ4MGFXWWdLR0ZuWlc1MExtaGhjME52WkdWTmFYSnliM0lwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJR050UldScGRHOXlJRDBnSkdOdlpHRmliR1V1WkdGMFlTZ25ZMjFGWkdsMGIzSW5LVHRjYmx4MFhIUmNkRngwSkdOdlpHRmliR1V1ZG1Gc0tHTnRSV1JwZEc5eUxtZGxkRlpoYkhWbEtDa3BPMXh1WEhSY2RGeDBYSFJqYlVWa2FYUnZjaTUwYjFSbGVIUkJjbVZoS0NrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDUmxaR2wwWVdKc1pTNW9kRzFzS0dSdmJTNTJZV3gxWlNna1kyOWtZV0pzWlN3Z2IzQjBhVzl1Y3k1d2NtVjBkR2xtZVVoMGJXd3BJSHg4SUdSdmJTNWxiWEIwZVZCaGNtRXBPMXh1WEc1Y2RGeDBJQ0FnSUM4dklISmxjR3hoWTJVZ2MyTnlhWEIwSUhSaFozTWdjMjhnZEdobGVTZHlaU0J1YjNRZ1pYaGxZM1YwWldRZ2QyaGxiaUJzYjJGa1pXUWdhVzRnWVdSdGFXNWNibHgwWEhSY2RIWmhjaUJqYjJSbFZHOVNaWEJzWVdObElEMGdKR1ZrYVhSaFlteGxMbWgwYld3b0tUdGNjbHh1WEhKY2JseDBYSFJjZEdOdlpHVlViMUpsY0d4aFkyVWdQU0JqYjJSbFZHOVNaWEJzWVdObExuSmxjR3hoWTJVb0p6eHpZM0pwY0hRbkxDQW5QQ0V0TFR4elkzSnBjSFFuS1R0Y2NseHVYSFJjZEZ4MFkyOWtaVlJ2VW1Wd2JHRmpaU0E5SUdOdlpHVlViMUpsY0d4aFkyVXVjbVZ3YkdGalpTZ25QQzl6WTNKcGNIUStKeXdnSnp3dmMyTnlhWEIwUGkwdFBpY3BPMXh5WEc1Y2NseHVYSFJjZEZ4MEpHVmthWFJoWW14bExtaDBiV3dvWTI5a1pWUnZVbVZ3YkdGalpTazdYRzVjYmx4MFhIUmNkQ1JsWkdsMFlXSnNaUzVvWldsbmFIUW9iM0IwYVc5dWN5NW9aV2xuYUhRZ1B5QWtZMjlrWVdKc1pTNW9aV2xuYUhRb0tTQTZJQ2RoZFhSdkp5azdYRzVjZEZ4MFhIUWtaV1JwZEc5eUxuSmxiVzkyWlVOc1lYTnpLQ2RqYjJSbGRtbGxkeWNwTzF4dVhHNWNkRngwWEhRa1pXUnBkR0ZpYkdVdVptOWpkWE1vS1R0Y2JseHVYSFJjZEZ4MGFHRnVaR3hsY2k1cGJuWnZhMlVvSjNSdmIyeGlZWEl1ZFhCa1lYUmxRMjlrWlhacFpYY25MQ0FrZEc5dmJHSmhjaXdnWm1Gc2MyVXBPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQjNhVzVrYjNjdWMzUnZjQ2dwTzF4dVhIUmNkSDA3WEc1Y2RIMDdYRzVjYmx4MGRtRnlJRVJ5WVdkQmJtUkVjbTl3SUQwZ1puVnVZM1JwYjI0Z0tHaGhibVJzWlhJcElIdGNibHgwWEhSMllYSWdKR1J2WTNWdFpXNTBJRDBnSkNoa2IyTjFiV1Z1ZENrN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQmhkSFJoWTJnZ1JISmhaeUJoYm1RZ1JISnZjQ0JGZG1WdWRITmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCc1lYbHZkWFJKYm1adklDMGdiR0Y1YjNWMElFbHVabTl5YldGMGFXOXVjMXh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnZjSFJwYjI1elhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NWhkSFJoWTJnZ1BTQm1kVzVqZEdsdmJpQW9iR0Y1YjNWMFNXNW1ieXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwYVdZZ0tHOXdkR2x2Ym5NdVlXbHlUVzlrWlNCOGZDQnZjSFJwYjI1ekxtUnBjMkZpYkdWRWNtRm5RVzVrUkhKdmNDa2dlMXh1WEhSY2RGeDBYSFF2THlCd2NtVjJaVzUwSUdSbFptRjFiSFFnWkhKdmNDQmxkbVZ1ZEZ4dVhIUmNkRngwWEhRa1pHOWpkVzFsYm5RdWIyNG9KMlJ5YjNBbkxDQm1kVzVqZEdsdmJpQW9aU2tnZTF4dVhIUmNkRngwWEhSY2RHVXVjSEpsZG1WdWRFUmxabUYxYkhRb0tUdGNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFIwYUdsekxtRjBkR0ZqYUVSeVlXZEJibVJFY205d1JYWmxiblFvYkdGNWIzVjBTVzVtYnl3Z2IzQjBhVzl1Y3lrN1hHNWNkRngwWEhSOVhHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHRjBkR0ZqYUNCRWNtRm5JR0Z1WkNCRWNtOXdJRVYyWlc1MGMxeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUd4aGVXOTFkRWx1Wm04Z0xTQnNZWGx2ZFhRZ1NXNW1iM0p0WVhScGIyNXpYRzVjZEZ4MElDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHOXdkR2x2Ym5OY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxtRjBkR0ZqYUVSeVlXZEJibVJFY205d1JYWmxiblFnUFNCbWRXNWpkR2x2YmlBb2JHRjViM1YwU1c1bWJ5d2diM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBkbUZ5SUdOdmJHeGxZM1JwYjI0Z1BTQWtLQ2tzWEc1Y2RGeDBYSFJjZENSbFpHbDBiM0lnUFNCc1lYbHZkWFJKYm1adkxtVmthWFJ2Y2lncExGeHVYSFJjZEZ4MFhIUWtaSEp2Y0hwdmJtVWdQU0JzWVhsdmRYUkpibVp2TG1SeWIzQjZiMjVsS0Nrc1hHNWNkRngwWEhSY2RDUmtjbTl3ZW05dVpVMWxjM05oWjJVZ1BTQWtaSEp2Y0hwdmJtVXVabWx1WkNnbkxtNXZkR1V0WkhKdmNIcHZibVV0YldWemMyRm5aU2NwTzF4dVhHNWNkRngwWEhRdkx5QnphRzkzSUdSeWIzQjZiMjVsSUc5dUlHUnlZV2RsYm5SbGNpQjNhR1Z1SUdSeVlXZG5hVzVuSUdFZ2IySnFaV04wSUhSdklHUnZZM1Z0Wlc1MFhHNWNkRngwWEhRdkx5QXRZblYwSUc5dWJIa2dhV1lnZEdobElHVmthWFJ2Y2lCcGN5QjJhWE5wWW14bExDQnBMbVV1SUdoaGN5QmhJSEJ2YzJsMGFYWmxJSGRwWkhSb0lHRnVaQ0JvWldsbmFIUmNibHgwWEhSY2RDUmtiMk4xYldWdWRDNXZiaWduWkhKaFoyVnVkR1Z5Snl3Z1puVnVZM1JwYjI0Z0tHVXBJSHRjYmx4MFhIUmNkRngwZG1GeUlHbHpRMjlrWlhacFpYY2dQU0JvWVc1a2JHVnlMbWx1ZG05clpTZ25ZMjlrWlhacFpYY3VhWE5CWTNScGRtRjBaV1FuTENCc1lYbHZkWFJKYm1adktUdGNibHgwWEhSY2RGeDBkbUZ5SUdoaGMwVmthWFJ2Y2xOcGVtVWdQU0FrWldScGRHOXlMbmRwWkhSb0tDa2dQaUF3SUNZbUlDUmxaR2wwYjNJdWFHVnBaMmgwS0NrZ1BpQXdPMXh1WEhSY2RGeDBYSFJwWmlBb0lXbHpRMjlrWlhacFpYY2dKaVlnSVdOdmJHeGxZM1JwYjI0dWJHVnVaM1JvSUNZbUlHaGhjMFZrYVhSdmNsTnBlbVVwSUh0Y2JseDBYSFJjZEZ4MFhIUWtaV1JwZEc5eUxtRmtaRU5zWVhOektDZGtjbUZuYjNabGNpY3BPMXh1WEhSY2RGeDBYSFJjZENSa2NtOXdlbTl1WlM1M2FXUjBhQ2drWldScGRHOXlMbmRwWkhSb0tDa3BPMXh1WEhSY2RGeDBYSFJjZENSa2NtOXdlbTl1WlM1b1pXbG5hSFFvSkdWa2FYUnZjaTVvWldsbmFIUW9LU2s3WEc1Y2RGeDBYSFJjZEZ4MEpHUnliM0I2YjI1bFRXVnpjMkZuWlM1MFpYaDBLRzl3ZEdsdmJuTXViR0Z1WjBsdVptOHVhVzFoWjJVdVpISmhaMGx0WVdkbFNHVnlaU2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFkyOXNiR1ZqZEdsdmJpQTlJR052Ykd4bFkzUnBiMjR1WVdSa0tHVXVkR0Z5WjJWMEtUdGNibHgwWEhSY2RIMHBMbTl1S0Nka2NtRm5iR1ZoZG1VbkxDQm1kVzVqZEdsdmJpQW9aU2tnZTF4dVhIUmNkRngwWEhSamIyeHNaV04wYVc5dUlEMGdZMjlzYkdWamRHbHZiaTV1YjNRb1pTNTBZWEpuWlhRcE8xeHVYSFJjZEZ4MFhIUnBaaUFvSVdOdmJHeGxZM1JwYjI0dWJHVnVaM1JvS1NCN1hHNWNkRngwWEhSY2RGeDBKR1ZrYVhSdmNpNXlaVzF2ZG1WRGJHRnpjeWduWkhKaFoyOTJaWEluS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZTa3ViMjRvSjJSeWIzQW5MQ0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RHTnZiR3hsWTNScGIyNGdQU0FrS0NrN1hHNWNkRngwWEhSY2RDUmxaR2wwYjNJdWNtVnRiM1psUTJ4aGMzTW9KMlJ5WVdkdmRtVnlKeWs3WEc1Y2RGeDBYSFI5S1R0Y2JseHVYSFJjZEZ4MEx5OGdZMmhoYm1kbElHUnliM0I2YjI1bEozTWdiV1Z6YzJGblpTQnZiaUJvYjNabGNpNWNibHgwWEhSY2RDUmtjbTl3ZW05dVpTNXZiaWduWkhKaFoyVnVkR1Z5Snl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFFrWkhKdmNIcHZibVV1WVdSa1EyeGhjM01vSjJodmRtVnlKeWs3WEc1Y2RGeDBYSFJjZENSa2NtOXdlbTl1WlUxbGMzTmhaMlV1ZEdWNGRDaHZjSFJwYjI1ekxteGhibWRKYm1adkxtbHRZV2RsTG1SeWIzQkpiV0ZuWlNrN1hHNWNkRngwWEhSOUtTNXZiaWduWkhKaFoyeGxZWFpsSnl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFFrWkhKdmNIcHZibVV1Y21WdGIzWmxRMnhoYzNNb0oyaHZkbVZ5SnlrN1hHNWNkRngwWEhSY2RDUmtjbTl3ZW05dVpVMWxjM05oWjJVdWRHVjRkQ2h2Y0hScGIyNXpMbXhoYm1kSmJtWnZMbWx0WVdkbExtUnlZV2RKYldGblpVaGxjbVVwTzF4dVhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RDOHZJR0YwZEdGamFDQmtjbTl3U1cxaFoyVmNibHgwWEhSY2RDUmtjbTl3ZW05dVpTNXZiaWduWkhKdmNDY3NJR1oxYm1OMGFXOXVJQ2hsZG1WdWRDa2dlMXh1WEhSY2RGeDBYSFJsZG1WdWRDNXdjbVYyWlc1MFJHVm1ZWFZzZENncE8xeHVYRzVjZEZ4MFhIUmNkSFpoY2lCa1lYUmhWSEpoYm5ObVpYSWdQU0JsZG1WdWRDNXZjbWxuYVc1aGJFVjJaVzUwTG1SaGRHRlVjbUZ1YzJabGNqdGNibHgwWEhSY2RGeDBkbUZ5SUdoMGJXd2dQU0JrWVhSaFZISmhibk5tWlhJdVoyVjBSR0YwWVNnbmRHVjRkQzlvZEcxc0p5azdYRzVjZEZ4MFhIUmNkSFpoY2lCMFpYaDBJRDBnWkdGMFlWUnlZVzV6Wm1WeUxtZGxkRVJoZEdFb0ozUmxlSFF2Y0d4aGFXNG5LVHRjYmx4dVhIUmNkRngwWEhSMllYSWdiR0Y1YjNWMFNXNW1ieUE5SUdSdmJTNXRZV3RsVEdGNWIzVjBTVzVtYnlobGRtVnVkQzVqZFhKeVpXNTBWR0Z5WjJWMElIeDhJR1YyWlc1MExuUmhjbWRsZENrN1hHNWNibHgwWEhSY2RGeDBhV1lnS0dSaGRHRlVjbUZ1YzJabGNpQW1KaUJrWVhSaFZISmhibk5tWlhJdVptbHNaWE1nSmlZZ1pHRjBZVlJ5WVc1elptVnlMbVpwYkdWekxteGxibWQwYUNrZ2UxeHVYSFJjZEZ4MFhIUmNkR3hoZVc5MWRFbHVabTh1WldScGRHRmliR1VvS1M1bWIyTjFjeWdwTzF4dVhIUmNkRngwWEhSY2RHaGhibVJzWlhJdWFXNXpaWEowU1cxaFoyVnpLR3hoZVc5MWRFbHVabThzSUdSaGRHRlVjbUZ1YzJabGNpNW1hV3hsY3lrN1hHNWNkRngwWEhSY2RIMGdaV3h6WlNCcFppQW9hSFJ0YkNrZ2UxeHVYSFJjZEZ4MFhIUmNkQ1FvYUhSdGJDa3VaV0ZqYUNobWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDa3VabTlqZFhNb0tUdGNibHgwWEhSY2RGeDBYSFJjZEdoaGJtUnNaWEl1YVc1MmIydGxLQ2RsWkdsMGIzSXVhVzV6WlhKMFRtOWtaU2NzSUd4aGVXOTFkRWx1Wm04dVpXUnBkR0ZpYkdVb0tTd2dkR2hwY3lrN1hHNWNkRngwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJjZEgwZ1pXeHpaU0JwWmlBb2RHVjRkQ2tnZTF4dVhIUmNkRngwWEhSY2RHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LUzVtYjJOMWN5Z3BPMXh1WEhSY2RGeDBYSFJjZEdoaGJtUnNaWEl1YVc1MmIydGxLQ2RsWkdsMGIzSXVhVzV6WlhKMFZHVjRkQ2NzSUd4aGVXOTFkRWx1Wm04dVpXUnBkR0ZpYkdVb0tTd2dkR1Y0ZENrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMHBMbTl1S0Nka2NtRm5iM1psY2ljc0lHWmhiSE5sS1RzZ0x5OGdjSEpsZG1WdWRDQmtaV1poZFd4MElHUnlZV2R2ZG1WeUlHVjJaVzUwWEc1Y2RGeDBmVHRjYmx4MGZUdGNibHh1WEhSMllYSWdRMnhwY0dKdllYSmtJRDBnWm5WdVkzUnBiMjRnS0doaGJtUnNaWElwSUh0Y2JseHVYSFJjZEhSb2FYTXVZWFIwWVdOb0lEMGdablZ1WTNScGIyNGdLR3hoZVc5MWRFbHVabThwSUh0Y2JseDBYSFJjZEd4aGVXOTFkRWx1Wm04dVpXUnBkR0ZpYkdVb0tTNXZiaWduY0dGemRHVW5MQ0JvVUdGemRHVkRiR2x3WW05aGNtUkpiV0ZuWlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlIQmhjM1JsSUdOc2FYQmliMkZ5WkNCcGJXRm5aVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdEZkbVZ1ZEgwZ1pYWmxiblJjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnYUZCaGMzUmxRMnhwY0dKdllYSmtTVzFoWjJVZ1BTQm1kVzVqZEdsdmJpQW9aWFpsYm5RcElIdGNibHgwWEhSY2RIWmhjaUJqYkdsd1ltOWhjbVJFWVhSaElEMGdaWFpsYm5RdWIzSnBaMmx1WVd4RmRtVnVkQzVqYkdsd1ltOWhjbVJFWVhSaE8xeHVYSFJjZEZ4MGRtRnlJR3hoZVc5MWRFbHVabThnUFNCa2IyMHViV0ZyWlV4aGVXOTFkRWx1Wm04b1pYWmxiblF1WTNWeWNtVnVkRlJoY21kbGRDQjhmQ0JsZG1WdWRDNTBZWEpuWlhRcE8xeHVYSFJjZEZ4MGRtRnlJQ1JsWkdsMFlXSnNaU0E5SUd4aGVXOTFkRWx1Wm04dVpXUnBkR0ZpYkdVb0tUdGNibHh1WEhSY2RGeDBhV1lnS0NGamJHbHdZbTloY21SRVlYUmhJSHg4SUNGamJHbHdZbTloY21SRVlYUmhMbWwwWlcxeklIeDhJQ0ZqYkdsd1ltOWhjbVJFWVhSaExtbDBaVzF6TG14bGJtZDBhQ2tnZTF4dVhIUmNkRngwWEhSMllYSWdZMkZzYkdKaFkydHpJRDBnSkdWa2FYUmhZbXhsTG1SaGRHRW9KMk5oYkd4aVlXTnJjeWNwTzF4dVhIUmNkRngwWEhRdkx5QnZibXg1SUdOaGJpQnlkVzRnYVdZZ2FYUWdhR0Z6SUc5dVNXMWhaMlZWY0d4dllXUWdiV1YwYUc5a1hHNWNkRngwWEhSY2RHbG1JQ2doWTJGc2JHSmhZMnR6TG05dVNXMWhaMlZWY0d4dllXUXBJSHRjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTQ3WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUXZMeUJ6WVhabElHTjFjbk52Y2x4dVhIUmNkRngwWEhSb1lXNWtiR1Z5TG1sdWRtOXJaU2duWldScGRHOXlMbk5oZG1WT2IyUmxKeXdnSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEZ4MGFHRnVaR3hsY2k1cGJuWnZhMlVvSjJWa2FYUnZjaTV6WVhabFVtRnVaMlVuTENBa1pXUnBkR0ZpYkdVcE8xeHVYRzVjZEZ4MFhIUmNkQ1JsWkdsMFlXSnNaUzVvZEcxc0tDY25LVHRjYmx4dVhIUmNkRngwWEhSelpYUlVhVzFsYjNWMEtHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwWEhSMllYSWdKR2x0WnlBOUlDUmxaR2wwWVdKc1pTNW1hVzVrS0NkcGJXY25LVHRjYmx4dVhIUmNkRngwWEhSY2RDOHZJR2xtSUdsdFp5QnBjeUJ1YnlCcGJpQmpiR2x3WW05aGNtUXNJR2x1YzJWeWRDQjBaWGgwSUc5eUlHUnZiVnh1WEhSY2RGeDBYSFJjZEdsbUlDZ2hKR2x0Wnk1c1pXNW5kR2dnZkh3Z0pHbHRaMXN3WFM1emNtTXVhVzVrWlhoUFppZ25aR0YwWVRvbktTQTlQVDBnTFRFcElIdGNibHgwWEhSY2RGeDBYSFJjZEhaaGNpQm9kRzFzSUQwZ0pHVmthWFJoWW14bExtaDBiV3dvS1R0Y2JseHVYSFJjZEZ4MFhIUmNkRngwYUdGdVpHeGxjaTVwYm5admEyVW9KMlZrYVhSdmNpNXlaWE4wYjNKbFRtOWtaU2NzSUNSbFpHbDBZV0pzWlNrN1hHNWNkRngwWEhSY2RGeDBYSFJvWVc1a2JHVnlMbWx1ZG05clpTZ25aV1JwZEc5eUxuSmxjM1J2Y21WU1lXNW5aU2NzSUNSbFpHbDBZV0pzWlNrN1hHNWNibHgwWEhSY2RGeDBYSFJjZEhSeWVTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RDOHZJR2x1YzJWeWRDQnViM0p0WVd3Z1pHOXRJR052WkdWY2JseDBYSFJjZEZ4MFhIUmNkRngwSkNob2RHMXNLUzVsWVdOb0tHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFFrWldScGRHRmliR1V1Wm05amRYTW9LVHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJvWVc1a2JHVnlMbWx1ZG05clpTZ25aV1JwZEc5eUxtbHVjMlZ5ZEU1dlpHVW5MQ0FrWldScGRHRmliR1VzSUhSb2FYTXBPMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwWEhSY2RIMGdZMkYwWTJnZ0tHVjRLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQzh2SUdsdWMyVnlkQ0IwWlhoMFhHNWNkRngwWEhSY2RGeDBYSFJjZENSbFpHbDBZV0pzWlM1bWIyTjFjeWdwTzF4dVhIUmNkRngwWEhSY2RGeDBYSFJvWVc1a2JHVnlMbWx1ZG05clpTZ25aV1JwZEc5eUxtbHVjMlZ5ZEZSbGVIUW5MQ0FrWldScGRHRmliR1VzSUdoMGJXd3BPMXh1WEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUmNkSFpoY2lCa1lYUmhkWEpwSUQwZ0pHbHRaMXN3WFM1emNtTTdYRzVjYmx4MFhIUmNkRngwWEhSMllYSWdaR0YwWVNBOUlHRjBiMklvWkdGMFlYVnlhUzV6Y0d4cGRDZ25MQ2NwV3pGZEtUdGNibHgwWEhSY2RGeDBYSFIyWVhJZ1lYSnlZWGtnUFNCdVpYY2dWV2x1ZERoQmNuSmhlU2hrWVhSaExteGxibWQwYUNrN1hHNWNkRngwWEhSY2RGeDBabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQQ0JrWVhSaExteGxibWQwYURzZ2FTc3JLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmhjbkpoZVZ0cFhTQTlJR1JoZEdFdVkyaGhja052WkdWQmRDaHBLVHRjYmx4MFhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBYSFIyWVhJZ1lteHZZaUE5SUc1bGR5QkNiRzlpS0Z0aGNuSmhlVjBzSUhzZ2RIbHdaVG9nSjJsdFlXZGxMM0J1WnljZ2ZTazdYRzVjZEZ4MFhIUmNkRngwWW14dllpNXVZVzFsSUQwZ0oyTnNhWEJpYjJGeVpDNXdibWNuTzF4dVhHNWNkRngwWEhSY2RGeDBhR0Z1Wkd4bGNpNXBiblp2YTJVb0oyVmthWFJ2Y2k1eVpYTjBiM0psVG05a1pTY3NJQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFJjZEZ4MGFHRnVaR3hsY2k1cGJuWnZhMlVvSjJWa2FYUnZjaTV5WlhOMGIzSmxVbUZ1WjJVbkxDQWtaV1JwZEdGaWJHVXBPMXh1WEhSY2RGeDBYSFJjZEdoaGJtUnNaWEl1YVc1elpYSjBTVzFoWjJWektHeGhlVzkxZEVsdVptOHNJRnRpYkc5aVhTazdYRzVjYmx4MFhIUmNkRngwWEhSb1lXNWtiR1Z5TG1sdWRtOXJaU2duWldScGRHOXlMbUZtZEdWeVEyOXRiV0Z1WkNjc0lDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUmNkSDBzSURBcE8xeHVYRzVjZEZ4MFhIUmNkSEpsZEhWeWJqdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBkbUZ5SUdsMFpXMGdQU0JzYVhOMExtaGxZV1FvWTJ4cGNHSnZZWEprUkdGMFlTNXBkR1Z0Y3lrN1hHNWNkRngwWEhSMllYSWdhWE5EYkdsd1ltOWhjbVJKYldGblpTQTlJR2wwWlcwdWEybHVaQ0E5UFQwZ0oyWnBiR1VuSUNZbUlHbDBaVzB1ZEhsd1pTNXBibVJsZUU5bUtDZHBiV0ZuWlM4bktTQWhQVDBnTFRFN1hHNWNibHgwWEhSY2RHbG1JQ2hwYzBOc2FYQmliMkZ5WkVsdFlXZGxLU0I3WEc1Y2RGeDBYSFJjZEdoaGJtUnNaWEl1YVc1elpYSjBTVzFoWjJWektHeGhlVzkxZEVsdVptOHNJRnRwZEdWdExtZGxkRUZ6Um1sc1pTZ3BYU2s3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEdoaGJtUnNaWEl1YVc1MmIydGxLQ2RsWkdsMGIzSXVZV1owWlhKRGIyMXRZVzVrSnl3Z0pHVmthWFJoWW14bEtUdGNibHgwWEhSOU8xeHVYSFI5TzF4dVhHNWNkSFpoY2lCTWFXNXJSR2xoYkc5bklEMGdablZ1WTNScGIyNGdLR2hoYm1Sc1pYSXBJSHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhSdloyZHNaU0JpZFhSMGIyNGdjM1JoZEhWelhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNISnBkbUYwWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWW5SdVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IyOXNaV0Z1ZlNCcGMwVnVZV0pzWlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCMGIyZG5iR1ZDZEc0Z1BTQm1kVzVqZEdsdmJpQW9KR0owYml3Z2FYTkZibUZpYkdVcElIdGNibHgwWEhSY2RDUmlkRzR1ZEc5bloyeGxRMnhoYzNNb0oyUnBjMkZpYkdWa0p5d2dJV2x6Ulc1aFlteGxLVHRjYmx4MFhIUmNkQ1JpZEc0dVlYUjBjaWduWkdsellXSnNaV1FuTENBaGFYTkZibUZpYkdVcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQlRhRzkzSUd4cGJtc2daR2xoYkc5bklHRnVaQ0J6WlhRZ1pYWmxiblFnYUdGdVpHeGxjbk1nYjI0Z1pHbGhiRzluSUdOdmJuUnliMnh6TGx4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaR2xoYkc5blhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUd4cGJtdEpibVp2WEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3VUhKdmJXbHpaWDFjYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG5Ob2IzZE1hVzVyUkdsaGJHOW5JRDBnWm5WdVkzUnBiMjRnS0NSbFpHbDBZV0pzWlN3Z0pHUnBZV3h2Wnl3Z2JHbHVhMGx1Wm04cElIdGNibHgwWEhSY2RISmxkSFZ5YmlBa0xrUmxabVZ5Y21Wa0tHWjFibU4wYVc5dUlDaGtaV1psY25KbFpDa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ0pHeHBibXRFYVdGc2IyY2dQU0FrWkdsaGJHOW5MbVpwYm1Rb0p5NXViM1JsTFd4cGJtc3RaR2xoYkc5bkp5azdYRzVjYmx4MFhIUmNkRngwZG1GeUlDUnNhVzVyVkdWNGRDQTlJQ1JzYVc1clJHbGhiRzluTG1acGJtUW9KeTV1YjNSbExXeHBibXN0ZEdWNGRDY3BMRnh1WEhSY2RGeDBYSFFrYkdsdWExVnliQ0E5SUNSc2FXNXJSR2xoYkc5bkxtWnBibVFvSnk1dWIzUmxMV3hwYm1zdGRYSnNKeWtzWEc1Y2RGeDBYSFJjZENSc2FXNXJRblJ1SUQwZ0pHeHBibXRFYVdGc2IyY3VabWx1WkNnbkxtNXZkR1V0YkdsdWF5MWlkRzRuS1N4Y2JseDBYSFJjZEZ4MEpHOXdaVzVKYms1bGQxZHBibVJ2ZHlBOUlDUnNhVzVyUkdsaGJHOW5MbVpwYm1Rb0oybHVjSFYwVzNSNWNHVTlZMmhsWTJ0aWIzaGRKeWs3WEc1Y2JseDBYSFJjZEZ4MEpHeHBibXRFYVdGc2IyY3ViMjVsS0NkemFHOTNiaTVpY3k1dGIyUmhiQ2NzSUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBYSFFrYkdsdWExUmxlSFF1ZG1Gc0tHeHBibXRKYm1adkxuUmxlSFFwTzF4dVhHNWNkRngwWEhSY2RGeDBKR3hwYm10VVpYaDBMbTl1S0NkcGJuQjFkQ2NzSUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBYSFJjZEM4dklHbG1JR3hwYm10MFpYaDBJSGRoY3lCdGIyUnBabWxsWkNCaWVTQnJaWGwxY0N4Y2JseDBYSFJjZEZ4MFhIUmNkQzh2SUhOMGIzQWdZMnh2Ym1sdVp5QjBaWGgwSUdaeWIyMGdiR2x1YTFWeWJGeHVYSFJjZEZ4MFhIUmNkRngwYkdsdWEwbHVabTh1ZEdWNGRDQTlJQ1JzYVc1clZHVjRkQzUyWVd3b0tUdGNibHgwWEhSY2RGeDBYSFI5S1R0Y2JseHVYSFJjZEZ4MFhIUmNkQzh2SUdsbUlHNXZJSFZ5YkNCM1lYTWdaMmwyWlc0c0lHTnZjSGtnZEdWNGRDQjBieUIxY214Y2JseDBYSFJjZEZ4MFhIUnBaaUFvSVd4cGJtdEpibVp2TG5WeWJDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGJHbHVhMGx1Wm04dWRYSnNJRDBnYkdsdWEwbHVabTh1ZEdWNGREdGNibHgwWEhSY2RGeDBYSFJjZEhSdloyZHNaVUowYmlna2JHbHVhMEowYml3Z2JHbHVhMGx1Wm04dWRHVjRkQ2s3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkRngwSkd4cGJtdFZjbXd1YjI0b0oybHVjSFYwSnl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGRHOW5aMnhsUW5SdUtDUnNhVzVyUW5SdUxDQWtiR2x1YTFWeWJDNTJZV3dvS1NrN1hHNWNkRngwWEhSY2RGeDBYSFF2THlCa2FYTndiR0Y1SUhOaGJXVWdiR2x1YXlCdmJpQmdWR1Y0ZENCMGJ5QmthWE53YkdGNVlDQnBibkIxZEZ4dVhIUmNkRngwWEhSY2RGeDBMeThnZDJobGJpQmpjbVZoZEdVZ1lTQnVaWGNnYkdsdWExeHVYSFJjZEZ4MFhIUmNkRngwYVdZZ0tDRnNhVzVyU1c1bWJ5NTBaWGgwS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZENSc2FXNXJWR1Y0ZEM1MllXd29KR3hwYm10VmNtd3VkbUZzS0NrcE8xeHVYSFJjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RIMHBMblpoYkNoc2FXNXJTVzVtYnk1MWNtd3BMblJ5YVdkblpYSW9KMlp2WTNWekp5a3VkSEpwWjJkbGNpZ25jMlZzWldOMEp5azdYRzVjYmx4MFhIUmNkRngwWEhRa2IzQmxia2x1VG1WM1YybHVaRzkzTG5CeWIzQW9KMk5vWldOclpXUW5MQ0JzYVc1clNXNW1ieTV1WlhkWGFXNWtiM2NwTzF4dVhHNWNkRngwWEhSY2RGeDBKR3hwYm10Q2RHNHViMjVsS0NkamJHbGpheWNzSUdaMWJtTjBhVzl1SUNobGRtVnVkQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBaWFpsYm5RdWNISmxkbVZ1ZEVSbFptRjFiSFFvS1R0Y2JseHVYSFJjZEZ4MFhIUmNkRngwWkdWbVpYSnlaV1F1Y21WemIyeDJaU2g3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSEpoYm1kbE9pQnNhVzVyU1c1bWJ5NXlZVzVuWlN4Y2JseDBYSFJjZEZ4MFhIUmNkRngwZFhKc09pQWtiR2x1YTFWeWJDNTJZV3dvS1N4Y2JseDBYSFJjZEZ4MFhIUmNkRngwZEdWNGREb2dKR3hwYm10VVpYaDBMblpoYkNncExGeHVYSFJjZEZ4MFhIUmNkRngwWEhSdVpYZFhhVzVrYjNjNklDUnZjR1Z1U1c1T1pYZFhhVzVrYjNjdWFYTW9KenBqYUdWamEyVmtKeWxjYmx4MFhIUmNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBYSFJjZEZ4MEpHeHBibXRFYVdGc2IyY3ViVzlrWVd3b0oyaHBaR1VuS1R0Y2JseDBYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwZlNrdWIyNWxLQ2RvYVdSa1pXNHVZbk11Ylc5a1lXd25MQ0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RGeDBMeThnWkdWMFlXTm9JR1YyWlc1MGMxeHVYSFJjZEZ4MFhIUmNkQ1JzYVc1clZHVjRkQzV2Wm1Zb0oybHVjSFYwSnlrN1hHNWNkRngwWEhSY2RGeDBKR3hwYm10VmNtd3ViMlptS0NkcGJuQjFkQ2NwTzF4dVhIUmNkRngwWEhSY2RDUnNhVzVyUW5SdUxtOW1aaWduWTJ4cFkyc25LVHRjYmx4dVhIUmNkRngwWEhSY2RHbG1JQ2hrWldabGNuSmxaQzV6ZEdGMFpTZ3BJRDA5UFNBbmNHVnVaR2x1WnljcElIdGNibHgwWEhSY2RGeDBYSFJjZEdSbFptVnljbVZrTG5KbGFtVmpkQ2dwTzF4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBmU2t1Ylc5a1lXd29KM05vYjNjbktUdGNibHgwWEhSY2RIMHBMbkJ5YjIxcGMyVW9LVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJR3hoZVc5MWRFbHVabTljYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG5Ob2IzY2dQU0JtZFc1amRHbHZiaUFvYkdGNWIzVjBTVzVtYnlrZ2UxeHVYSFJjZEZ4MGRtRnlJQ1JsWkdsMGIzSWdQU0JzWVhsdmRYUkpibVp2TG1Wa2FYUnZjaWdwTEZ4dVhIUmNkRngwWEhRa1pHbGhiRzluSUQwZ2JHRjViM1YwU1c1bWJ5NWthV0ZzYjJjb0tTeGNibHgwWEhSY2RGeDBKR1ZrYVhSaFlteGxJRDBnYkdGNWIzVjBTVzVtYnk1bFpHbDBZV0pzWlNncExGeHVYSFJjZEZ4MFhIUWtjRzl3YjNabGNpQTlJR3hoZVc5MWRFbHVabTh1Y0c5d2IzWmxjaWdwTEZ4dVhIUmNkRngwWEhSc2FXNXJTVzVtYnlBOUlHaGhibVJzWlhJdWFXNTJiMnRsS0NkbFpHbDBiM0l1WjJWMFRHbHVhMGx1Wm04bkxDQWtaV1JwZEdGaWJHVXBPMXh1WEc1Y2RGeDBYSFIyWVhJZ2IzQjBhVzl1Y3lBOUlDUmxaR2wwYjNJdVpHRjBZU2duYjNCMGFXOXVjeWNwTzF4dVhHNWNkRngwWEhSb1lXNWtiR1Z5TG1sdWRtOXJaU2duWldScGRHOXlMbk5oZG1WU1lXNW5aU2NzSUNSbFpHbDBZV0pzWlNrN1hHNWNkRngwWEhSMGFHbHpMbk5vYjNkTWFXNXJSR2xoYkc5bktDUmxaR2wwWVdKc1pTd2dKR1JwWVd4dlp5d2diR2x1YTBsdVptOHBMblJvWlc0b1puVnVZM1JwYjI0Z0tHeHBibXRKYm1adktTQjdYRzVjZEZ4MFhIUmNkR2hoYm1Sc1pYSXVhVzUyYjJ0bEtDZGxaR2wwYjNJdWNtVnpkRzl5WlZKaGJtZGxKeXdnSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEZ4MGFHRnVaR3hsY2k1cGJuWnZhMlVvSjJWa2FYUnZjaTVqY21WaGRHVk1hVzVySnl3Z0pHVmthWFJoWW14bExDQnNhVzVyU1c1bWJ5d2diM0IwYVc5dWN5azdYRzVjZEZ4MFhIUmNkQzh2SUdocFpHVWdjRzl3YjNabGNpQmhablJsY2lCamNtVmhkR2x1WnlCc2FXNXJYRzVjZEZ4MFhIUmNkR2hoYm1Sc1pYSXVhVzUyYjJ0bEtDZHdiM0J2ZG1WeUxtaHBaR1VuTENBa2NHOXdiM1psY2lrN1hHNWNkRngwWEhSOUtTNW1ZV2xzS0daMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBhR0Z1Wkd4bGNpNXBiblp2YTJVb0oyVmthWFJ2Y2k1eVpYTjBiM0psVW1GdVoyVW5MQ0FrWldScGRHRmliR1VwTzF4dVhIUmNkRngwZlNrN1hHNWNkRngwZlR0Y2JseDBmVHRjYmx4dVhIUjJZWElnU1cxaFoyVkVhV0ZzYjJjZ1BTQm1kVzVqZEdsdmJpQW9hR0Z1Wkd4bGNpa2dlMXh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJSFJ2WjJkc1pTQmlkWFIwYjI0Z2MzUmhkSFZ6WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0hKcGRtRjBaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtZblJ1WEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRDYjI5c1pXRnVmU0JwYzBWdVlXSnNaVnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUIwYjJkbmJHVkNkRzRnUFNCbWRXNWpkR2x2YmlBb0pHSjBiaXdnYVhORmJtRmliR1VwSUh0Y2JseDBYSFJjZENSaWRHNHVkRzluWjJ4bFEyeGhjM01vSjJScGMyRmliR1ZrSnl3Z0lXbHpSVzVoWW14bEtUdGNibHgwWEhSY2RDUmlkRzR1WVhSMGNpZ25aR2x6WVdKc1pXUW5MQ0FoYVhORmJtRmliR1VwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFIwYUdsekxuTm9iM2NnUFNCbWRXNWpkR2x2YmlBb2JHRjViM1YwU1c1bWJ5a2dlMXh1WEhSY2RGeDBkbUZ5SUNSa2FXRnNiMmNnUFNCc1lYbHZkWFJKYm1adkxtUnBZV3h2WnlncExGeHVYSFJjZEZ4MFhIUWtaV1JwZEdGaWJHVWdQU0JzWVhsdmRYUkpibVp2TG1Wa2FYUmhZbXhsS0NrN1hHNWNibHgwWEhSY2RHaGhibVJzWlhJdWFXNTJiMnRsS0NkbFpHbDBiM0l1YzJGMlpWSmhibWRsSnl3Z0pHVmthWFJoWW14bEtUdGNibHgwWEhSY2RIUm9hWE11YzJodmQwbHRZV2RsUkdsaGJHOW5LQ1JsWkdsMFlXSnNaU3dnSkdScFlXeHZaeWt1ZEdobGJpaG1kVzVqZEdsdmJpQW9aR0YwWVNrZ2UxeHVYSFJjZEZ4MFhIUm9ZVzVrYkdWeUxtbHVkbTlyWlNnblpXUnBkRzl5TG5KbGMzUnZjbVZTWVc1blpTY3NJQ1JsWkdsMFlXSnNaU2s3WEc1Y2JseDBYSFJjZEZ4MGFXWWdLSFI1Y0dWdlppQmtZWFJoSUQwOVBTQW5jM1J5YVc1bkp5a2dlMXh1WEhSY2RGeDBYSFJjZEM4dklHbHRZV2RsSUhWeWJGeHVYSFJjZEZ4MFhIUmNkR2hoYm1Sc1pYSXVhVzUyYjJ0bEtDZGxaR2wwYjNJdWFXNXpaWEowU1cxaFoyVW5MQ0FrWldScGRHRmliR1VzSUdSaGRHRXBPMXh1WEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEM4dklHRnljbUY1SUc5bUlHWnBiR1Z6WEc1Y2RGeDBYSFJjZEZ4MGFHRnVaR3hsY2k1cGJuTmxjblJKYldGblpYTW9iR0Y1YjNWMFNXNW1ieXdnWkdGMFlTazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDBwTG1aaGFXd29ablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSb1lXNWtiR1Z5TG1sdWRtOXJaU2duWldScGRHOXlMbkpsYzNSdmNtVlNZVzVuWlNjc0lDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUjlLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nYzJodmR5QnBiV0ZuWlNCa2FXRnNiMmRjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHUnBZV3h2WjF4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTFCeWIyMXBjMlY5WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1emFHOTNTVzFoWjJWRWFXRnNiMmNnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bExDQWtaR2xoYkc5bktTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z0pDNUVaV1psY25KbFpDaG1kVzVqZEdsdmJpQW9aR1ZtWlhKeVpXUXBJSHRjYmx4MFhIUmNkRngwZG1GeUlDUnBiV0ZuWlVScFlXeHZaeUE5SUNSa2FXRnNiMmN1Wm1sdVpDZ25MbTV2ZEdVdGFXMWhaMlV0WkdsaGJHOW5KeWs3WEc1Y2JseDBYSFJjZEZ4MGRtRnlJQ1JwYldGblpVbHVjSFYwSUQwZ0pHUnBZV3h2Wnk1bWFXNWtLQ2N1Ym05MFpTMXBiV0ZuWlMxcGJuQjFkQ2NwTEZ4dVhIUmNkRngwWEhSY2RDUnBiV0ZuWlZWeWJDQTlJQ1JrYVdGc2IyY3VabWx1WkNnbkxtNXZkR1V0YVcxaFoyVXRkWEpzSnlrc1hHNWNkRngwWEhSY2RGeDBKR2x0WVdkbFFuUnVJRDBnSkdScFlXeHZaeTVtYVc1a0tDY3VibTkwWlMxcGJXRm5aUzFpZEc0bktUdGNibHh1WEhSY2RGeDBYSFFrYVcxaFoyVkVhV0ZzYjJjdWIyNWxLQ2R6YUc5M2JpNWljeTV0YjJSaGJDY3NJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MFhIUXZMeUJEYkc5dWFXNW5JR2x0WVdkbFNXNXdkWFFnZEc4Z1kyeGxZWElnWld4bGJXVnVkQzVjYmx4MFhIUmNkRngwWEhRa2FXMWhaMlZKYm5CMWRDNXlaWEJzWVdObFYybDBhQ2drYVcxaFoyVkpibkIxZEM1amJHOXVaU2dwWEc1Y2RGeDBYSFJjZEZ4MElDQXViMjRvSjJOb1lXNW5aU2NzSUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBYSFFnSUZ4MFpHVm1aWEp5WldRdWNtVnpiMngyWlNoMGFHbHpMbVpwYkdWeklIeDhJSFJvYVhNdWRtRnNkV1VwTzF4dVhIUmNkRngwWEhSY2RDQWdYSFFrYVcxaFoyVkVhV0ZzYjJjdWJXOWtZV3dvSjJocFpHVW5LVHRjYmx4MFhIUmNkRngwWEhRZ0lIMHBYRzVjZEZ4MFhIUmNkRngwSUNBdWRtRnNLQ2NuS1Z4dVhIUmNkRngwWEhSY2RDazdYRzVjYmx4MFhIUmNkRngwWEhRa2FXMWhaMlZDZEc0dVkyeHBZMnNvWm5WdVkzUnBiMjRnS0dWMlpXNTBLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmxkbVZ1ZEM1d2NtVjJaVzUwUkdWbVlYVnNkQ2dwTzF4dVhHNWNkRngwWEhSY2RGeDBYSFJrWldabGNuSmxaQzV5WlhOdmJIWmxLQ1JwYldGblpWVnliQzUyWVd3b0tTazdYRzVjZEZ4MFhIUmNkRngwWEhRa2FXMWhaMlZFYVdGc2IyY3ViVzlrWVd3b0oyaHBaR1VuS1R0Y2JseDBYSFJjZEZ4MFhIUjlLVHRjYmx4dVhIUmNkRngwWEhSY2RDUnBiV0ZuWlZWeWJDNXZiaWduYTJWNWRYQWdjR0Z6ZEdVbkxDQm1kVzVqZEdsdmJpQW9aWFpsYm5RcElIdGNibHgwWEhSY2RGeDBYSFJjZEhaaGNpQjFjbXc3WEc1Y2JseDBYSFJjZEZ4MFhIUmNkR2xtSUNobGRtVnVkQzUwZVhCbElEMDlQU0FuY0dGemRHVW5LU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSFZ5YkNBOUlHVjJaVzUwTG05eWFXZHBibUZzUlhabGJuUXVZMnhwY0dKdllYSmtSR0YwWVM1blpYUkVZWFJoS0NkMFpYaDBKeWs3WEc1Y2RGeDBYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSMWNtd2dQU0FrYVcxaFoyVlZjbXd1ZG1Gc0tDazdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBYSFJjZEhSdloyZHNaVUowYmlna2FXMWhaMlZDZEc0c0lIVnliQ2s3WEc1Y2RGeDBYSFJjZEZ4MGZTa3VkbUZzS0NjbktTNTBjbWxuWjJWeUtDZG1iMk4xY3ljcE8xeHVYSFJjZEZ4MFhIUjlLUzV2Ym1Vb0oyaHBaR1JsYmk1aWN5NXRiMlJoYkNjc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwWEhRa2FXMWhaMlZKYm5CMWRDNXZabVlvSjJOb1lXNW5aU2NwTzF4dVhIUmNkRngwWEhSY2RDUnBiV0ZuWlZWeWJDNXZabVlvSjJ0bGVYVndJSEJoYzNSbEp5azdYRzVjZEZ4MFhIUmNkRngwSkdsdFlXZGxRblJ1TG05bVppZ25ZMnhwWTJzbktUdGNibHh1WEhSY2RGeDBYSFJjZEdsbUlDaGtaV1psY25KbFpDNXpkR0YwWlNncElEMDlQU0FuY0dWdVpHbHVaeWNwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR1JsWm1WeWNtVmtMbkpsYW1WamRDZ3BPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZTa3ViVzlrWVd3b0ozTm9iM2NuS1R0Y2JseDBYSFJjZEgwcE8xeHVYSFJjZEgwN1hHNWNkSDA3WEc1Y2JseDBkbUZ5SUVobGJIQkVhV0ZzYjJjZ1BTQm1kVzVqZEdsdmJpQW9hR0Z1Wkd4bGNpa2dlMXh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJSE5vYjNjZ2FHVnNjQ0JrYVdGc2IyZGNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa1pXUnBkR0ZpYkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdScFlXeHZaMXh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMUJ5YjIxcGMyVjlYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTV6YUc5M1NHVnNjRVJwWVd4dlp5QTlJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VzSUNSa2FXRnNiMmNwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUFrTGtSbFptVnljbVZrS0daMWJtTjBhVzl1SUNoa1pXWmxjbkpsWkNrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnSkdobGJIQkVhV0ZzYjJjZ1BTQWtaR2xoYkc5bkxtWnBibVFvSnk1dWIzUmxMV2hsYkhBdFpHbGhiRzluSnlrN1hHNWNibHgwWEhSY2RGeDBKR2hsYkhCRWFXRnNiMmN1YjI1bEtDZG9hV1JrWlc0dVluTXViVzlrWVd3bkxDQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEZ4MFpHVm1aWEp5WldRdWNtVnpiMngyWlNncE8xeHVYSFJjZEZ4MFhIUjlLUzV0YjJSaGJDZ25jMmh2ZHljcE8xeHVYSFJjZEZ4MGZTa3VjSEp2YldselpTZ3BPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdiR0Y1YjNWMFNXNW1iMXh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11YzJodmR5QTlJR1oxYm1OMGFXOXVJQ2hzWVhsdmRYUkpibVp2S1NCN1hHNWNkRngwWEhSMllYSWdKR1JwWVd4dlp5QTlJR3hoZVc5MWRFbHVabTh1WkdsaGJHOW5LQ2tzWEc1Y2RGeDBYSFJjZENSbFpHbDBZV0pzWlNBOUlHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LVHRjYmx4dVhIUmNkRngwYUdGdVpHeGxjaTVwYm5admEyVW9KMlZrYVhSdmNpNXpZWFpsVW1GdVoyVW5MQ0FrWldScGRHRmliR1VzSUhSeWRXVXBPMXh1WEhSY2RGeDBkR2hwY3k1emFHOTNTR1ZzY0VScFlXeHZaeWdrWldScGRHRmliR1VzSUNSa2FXRnNiMmNwTG5Sb1pXNG9ablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSb1lXNWtiR1Z5TG1sdWRtOXJaU2duWldScGRHOXlMbkpsYzNSdmNtVlNZVzVuWlNjc0lDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUjlLVHRjYmx4MFhIUjlPMXh1WEhSOU8xeHVYRzVjYmx4MEx5b3FYRzVjZENBcUlFQmpiR0Z6Y3lCRmRtVnVkRWhoYm1Sc1pYSmNibHgwSUNwY2JseDBJQ29nUlhabGJuUklZVzVrYkdWeVhHNWNkQ0FxSUNBdElGUlBSRTg2SUc1bGR5QnBibk4wWVc1alpTQndaWElnWVNCbFpHbDBiM0pjYmx4MElDb2dJQzBnVkU5RVR6b2djbVZ1WVcxbElFVjJaVzUwU0dGdVpHeGxjbHh1WEhRZ0tpOWNibHgwZG1GeUlFVjJaVzUwU0dGdVpHeGxjaUE5SUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhRdktpcGNibHgwWEhRZ0tpQk5iMlIxYkdWelhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHMXZaSFZzWlhNZ1BTQjBhR2x6TG0xdlpIVnNaWE1nUFNCN1hHNWNkRngwWEhSbFpHbDBiM0k2SUc1bGR5QkZaR2wwYjNJb2RHaHBjeWtzWEc1Y2RGeDBYSFIwYjI5c1ltRnlPaUJ1WlhjZ1ZHOXZiR0poY2loMGFHbHpLU3hjYmx4MFhIUmNkSE4wWVhSMWMySmhjam9nYm1WM0lGTjBZWFIxYzJKaGNpaDBhR2x6S1N4Y2JseDBYSFJjZEhCdmNHOTJaWEk2SUc1bGR5QlFiM0J2ZG1WeUtIUm9hWE1wTEZ4dVhIUmNkRngwYUdGdVpHeGxPaUJ1WlhjZ1NHRnVaR3hsS0hSb2FYTXBMRnh1WEhSY2RGeDBablZzYkhOamNtVmxiam9nYm1WM0lFWjFiR3h6WTNKbFpXNG9kR2hwY3lrc1hHNWNkRngwWEhSamIyUmxkbWxsZHpvZ2JtVjNJRU52WkdWMmFXVjNLSFJvYVhNcExGeHVYSFJjZEZ4MFpISmhaMEZ1WkVSeWIzQTZJRzVsZHlCRWNtRm5RVzVrUkhKdmNDaDBhR2x6S1N4Y2JseDBYSFJjZEdOc2FYQmliMkZ5WkRvZ2JtVjNJRU5zYVhCaWIyRnlaQ2gwYUdsektTeGNibHgwWEhSY2RHeHBibXRFYVdGc2IyYzZJRzVsZHlCTWFXNXJSR2xoYkc5bktIUm9hWE1wTEZ4dVhIUmNkRngwYVcxaFoyVkVhV0ZzYjJjNklHNWxkeUJKYldGblpVUnBZV3h2WnloMGFHbHpLU3hjYmx4MFhIUmNkR2hsYkhCRWFXRnNiMmM2SUc1bGR5QklaV3h3UkdsaGJHOW5LSFJvYVhNcFhHNWNkRngwZlR0Y2JseHVYSFJjZEM4dklGUlBSRThnY21WbVlXTjBiM0lnYlc5a2RXeGxjeUJoYm1RZ1pYWmxiblJJWVc1a2JHVnlYRzVjZEZ4MEx5OGdJQzBnY21WdGIzWmxJSFJvYVhNZ2JXVjBhRzlrSUdGdVpDQjFjMlVnWTNWemRHOXRJR1YyWlc1MElHWnliMjBnSkdodmJHUmxjaUJwYm5OMFpXRmtYRzVjZEZ4MGRHaHBjeTVwYm5admEyVWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSMllYSWdiVzlrZFd4bFFXNWtUV1YwYUc5a0lEMGdiR2x6ZEM1b1pXRmtLR3hwYzNRdVpuSnZiU2hoY21kMWJXVnVkSE1wS1R0Y2JseDBYSFJjZEhaaGNpQmhjbWR6SUQwZ2JHbHpkQzUwWVdsc0tHeHBjM1F1Wm5KdmJTaGhjbWQxYldWdWRITXBLVHRjYmx4dVhIUmNkRngwZG1GeUlITndiR2wwY3lBOUlHMXZaSFZzWlVGdVpFMWxkR2h2WkM1emNHeHBkQ2duTGljcE8xeHVYSFJjZEZ4MGRtRnlJR2hoYzFObGNHRnlZWFJ2Y2lBOUlITndiR2wwY3k1c1pXNW5kR2dnUGlBeE8xeHVYSFJjZEZ4MGRtRnlJRzF2WkhWc1pVNWhiV1VnUFNCb1lYTlRaWEJoY21GMGIzSWdKaVlnYkdsemRDNW9aV0ZrS0hOd2JHbDBjeWs3WEc1Y2RGeDBYSFIyWVhJZ2JXVjBhRzlrVG1GdFpTQTlJR2hoYzFObGNHRnlZWFJ2Y2lBL0lHeHBjM1F1YkdGemRDaHpjR3hwZEhNcElEb2diR2x6ZEM1b1pXRmtLSE53YkdsMGN5azdYRzVjYmx4MFhIUmNkSFpoY2lCdGIyUjFiR1VnUFNCMGFHbHpMbWRsZEUxdlpIVnNaU2h0YjJSMWJHVk9ZVzFsS1R0Y2JseDBYSFJjZEhaaGNpQnRaWFJvYjJRZ1BTQnRiMlIxYkdWYmJXVjBhRzlrVG1GdFpWMDdYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQnRaWFJvYjJRZ0ppWWdiV1YwYUc5a0xtRndjR3g1S0cxdlpIVnNaU3dnWVhKbmN5azdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJSEpsZEhWeWJuTWdiVzlrZFd4bFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnYlc5a2RXeGxUbUZ0WlNBdElHNWhiV1VnYjJZZ2JXOWtkV3hsWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3VFc5a2RXeGxmU0F0SUdSbFptRjFiSFJ6SUdseklHVmthWFJ2Y2x4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdVoyVjBUVzlrZFd4bElEMGdablZ1WTNScGIyNGdLRzF2WkhWc1pVNWhiV1VwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUIwYUdsekxtMXZaSFZzWlhOYmJXOWtkV3hsVG1GdFpWMGdmSHdnZEdocGN5NXRiMlIxYkdWekxtVmthWFJ2Y2p0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2FXNXpaWEowSUVsdFlXZGxjeUJtY205dElHWnBiR1VnWVhKeVlYa3VYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjSEpwZG1GMFpWeHVYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCc1lYbHZkWFJKYm1adlhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0R2FXeGxXMTE5SUdacGJHVnpYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTVwYm5ObGNuUkpiV0ZuWlhNZ1BTQm1kVzVqZEdsdmJpQW9iR0Y1YjNWMFNXNW1ieXdnWm1sc1pYTXBJSHRjYmx4MFhIUmNkSFpoY2lBa1pXUnBkRzl5SUQwZ2JHRjViM1YwU1c1bWJ5NWxaR2wwYjNJb0tTeGNibHgwWEhSY2RGeDBKR1ZrYVhSaFlteGxJRDBnYkdGNWIzVjBTVzVtYnk1bFpHbDBZV0pzWlNncExGeHVYSFJjZEZ4MFhIUWthRzlzWkdWeUlEMGdiR0Y1YjNWMFNXNW1ieTVvYjJ4a1pYSW9LVHRjYmx4dVhIUmNkRngwZG1GeUlHTmhiR3hpWVdOcmN5QTlJQ1JsWkdsMFlXSnNaUzVrWVhSaEtDZGpZV3hzWW1GamEzTW5LVHRjYmx4MFhIUmNkSFpoY2lCdmNIUnBiMjV6SUQwZ0pHVmthWFJ2Y2k1a1lYUmhLQ2R2Y0hScGIyNXpKeWs3WEc1Y2JseDBYSFJjZEM4dklFbG1JRzl1U1cxaFoyVlZjR3h2WVdRZ2IzQjBhVzl1Y3lCelpYUjBaV1JjYmx4MFhIUmNkR2xtSUNoallXeHNZbUZqYTNNdWIyNUpiV0ZuWlZWd2JHOWhaQ2tnZTF4dVhIUmNkRngwWEhSallXeHNZbUZqYTNNdWIyNUpiV0ZuWlZWd2JHOWhaQ2htYVd4bGN5d2diVzlrZFd4bGN5NWxaR2wwYjNJc0lDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUmNkR0pwYm1SRGRYTjBiMjFGZG1WdWRDZ2thRzlzWkdWeUxDQW5hVzFoWjJVdWRYQnNiMkZrSnlrb1cyWnBiR1Z6WFNrN1hHNWNkRngwWEhSY2RDOHZJR1ZzYzJVZ2FXNXpaWEowSUVsdFlXZGxJR0Z6SUdSaGRHRlZVa3hjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkQ1F1WldGamFDaG1hV3hsY3l3Z1puVnVZM1JwYjI0Z0tHbGtlQ3dnWm1sc1pTa2dlMXh1WEhSY2RGeDBYSFJjZEhaaGNpQm1hV3hsYm1GdFpTQTlJR1pwYkdVdWJtRnRaVHRjYmx4MFhIUmNkRngwWEhScFppQW9iM0IwYVc5dWN5NXRZWGhwYlhWdFNXMWhaMlZHYVd4bFUybDZaU0FtSmlCdmNIUnBiMjV6TG0xaGVHbHRkVzFKYldGblpVWnBiR1ZUYVhwbElEd2dabWxzWlM1emFYcGxLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUnBaaUFvWTJGc2JHSmhZMnR6TG05dVNXMWhaMlZWY0d4dllXUkZjbkp2Y2lrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSallXeHNZbUZqYTNNdWIyNUpiV0ZuWlZWd2JHOWhaRVZ5Y205eUtHOXdkR2x2Ym5NdWJHRnVaMGx1Wm04dWFXMWhaMlV1YldGNGFXMTFiVVpwYkdWVGFYcGxSWEp5YjNJcE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSaWFXNWtRM1Z6ZEc5dFJYWmxiblFvSkdodmJHUmxjaXdnSjJsdFlXZGxMblZ3Ykc5aFpDNWxjbkp2Y2ljcEtHOXdkR2x2Ym5NdWJHRnVaMGx1Wm04dWFXMWhaMlV1YldGNGFXMTFiVVpwYkdWVGFYcGxSWEp5YjNJcE8xeHVYSFJjZEZ4MFhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBZV3hsY25Rb2IzQjBhVzl1Y3k1c1lXNW5TVzVtYnk1cGJXRm5aUzV0WVhocGJYVnRSbWxzWlZOcGVtVkZjbkp2Y2lrN1hHNWNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR0Z6ZVc1akxuSmxZV1JHYVd4bFFYTkVZWFJoVlZKTUtHWnBiR1VwTG5Sb1pXNG9ablZ1WTNScGIyNGdLSE5FWVhSaFZWSk1LU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRzF2WkhWc1pYTXVaV1JwZEc5eUxtbHVjMlZ5ZEVsdFlXZGxLQ1JsWkdsMFlXSnNaU3dnYzBSaGRHRlZVa3dzSUdacGJHVnVZVzFsS1R0Y2JseDBYSFJjZEZ4MFhIUmNkSDBwTG1aaGFXd29ablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJwWmlBb1kyRnNiR0poWTJ0ekxtOXVTVzFoWjJWVmNHeHZZV1JGY25KdmNpa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkR05oYkd4aVlXTnJjeTV2YmtsdFlXZGxWWEJzYjJGa1JYSnliM0lvS1R0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSaWFXNWtRM1Z6ZEc5dFJYWmxiblFvSkdodmJHUmxjaXdnSjJsdFlXZGxMblZ3Ykc5aFpDNWxjbkp2Y2ljcEtHOXdkR2x2Ym5NdWJHRnVaMGx1Wm04dWFXMWhaMlV1YldGNGFXMTFiVVpwYkdWVGFYcGxSWEp5YjNJcE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDA3WEc1Y2JseDBYSFIyWVhJZ1kyOXRiV0Z1WkhNZ1BTQjdYRzVjZEZ4MFhIUXZLaXBjYmx4MFhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JzWVhsdmRYUkpibVp2WEc1Y2RGeDBYSFFnS2k5Y2JseDBYSFJjZEhOb2IzZE1hVzVyUkdsaGJHOW5PaUJtZFc1amRHbHZiaUFvYkdGNWIzVjBTVzVtYnlrZ2UxeHVYSFJjZEZ4MFhIUnRiMlIxYkdWekxteHBibXRFYVdGc2IyY3VjMmh2ZHloc1lYbHZkWFJKYm1adktUdGNibHgwWEhSY2RIMHNYRzVjYmx4MFhIUmNkQzhxS2x4dVhIUmNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUd4aGVXOTFkRWx1Wm05Y2JseDBYSFJjZENBcUwxeHVYSFJjZEZ4MGMyaHZkMGx0WVdkbFJHbGhiRzluT2lCbWRXNWpkR2x2YmlBb2JHRjViM1YwU1c1bWJ5a2dlMXh1WEhSY2RGeDBYSFJ0YjJSMWJHVnpMbWx0WVdkbFJHbGhiRzluTG5Ob2IzY29iR0Y1YjNWMFNXNW1ieWs3WEc1Y2RGeDBYSFI5TEZ4dVhHNWNkRngwWEhRdktpcGNibHgwWEhSY2RDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnNZWGx2ZFhSSmJtWnZYRzVjZEZ4MFhIUWdLaTljYmx4MFhIUmNkSE5vYjNkSVpXeHdSR2xoYkc5bk9pQm1kVzVqZEdsdmJpQW9iR0Y1YjNWMFNXNW1ieWtnZTF4dVhIUmNkRngwWEhSdGIyUjFiR1Z6TG1obGJIQkVhV0ZzYjJjdWMyaHZkeWhzWVhsdmRYUkpibVp2S1R0Y2JseDBYSFJjZEgwc1hHNWNibHgwWEhSY2RDOHFLbHh1WEhSY2RGeDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJR3hoZVc5MWRFbHVabTljYmx4MFhIUmNkQ0FxTDF4dVhIUmNkRngwWm5Wc2JITmpjbVZsYmpvZ1puVnVZM1JwYjI0Z0tHeGhlVzkxZEVsdVptOHBJSHRjYmx4MFhIUmNkRngwYlc5a2RXeGxjeTVtZFd4c2MyTnlaV1Z1TG5SdloyZHNaU2hzWVhsdmRYUkpibVp2S1R0Y2JseDBYSFJjZEgwc1hHNWNibHgwWEhSY2RDOHFLbHh1WEhSY2RGeDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJR3hoZVc5MWRFbHVabTljYmx4MFhIUmNkQ0FxTDF4dVhIUmNkRngwWTI5a1pYWnBaWGM2SUdaMWJtTjBhVzl1SUNoc1lYbHZkWFJKYm1adktTQjdYRzVjZEZ4MFhIUmNkRzF2WkhWc1pYTXVZMjlrWlhacFpYY3VkRzluWjJ4bEtHeGhlVzkxZEVsdVptOHBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnYUUxdmRYTmxaRzkzYmlBOUlHWjFibU4wYVc5dUlDaGxkbVZ1ZENrZ2UxeHVYSFJjZEZ4MEx5OXdjbVYyWlc1MFJHVm1ZWFZzZENCVFpXeGxZM1JwYjI0Z1ptOXlJRVpHTENCSlJUZ3JYRzVjZEZ4MFhIUnBaaUFvWkc5dExtbHpTVzFuS0dWMlpXNTBMblJoY21kbGRDa3BJSHRjYmx4MFhIUmNkRngwWlhabGJuUXVjSEpsZG1WdWRFUmxabUYxYkhRb0tUdGNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYRzVjZEZ4MGRtRnlJR2hVYjI5c1ltRnlRVzVrVUc5d2IzWmxjbFZ3WkdGMFpTQTlJR1oxYm1OMGFXOXVJQ2hsZG1WdWRDa2dlMXh1WEhSY2RGeDBMeThnWkdWc1lYa2dabTl5SUhKaGJtZGxJR0ZtZEdWeUlHMXZkWE5sZFhCY2JseDBYSFJjZEhObGRGUnBiV1Z2ZFhRb1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2JHRjViM1YwU1c1bWJ5QTlJR1J2YlM1dFlXdGxUR0Y1YjNWMFNXNW1ieWhsZG1WdWRDNWpkWEp5Wlc1MFZHRnlaMlYwSUh4OElHVjJaVzUwTG5SaGNtZGxkQ2s3WEc1Y2RGeDBYSFJjZEhaaGNpQnpkSGxzWlVsdVptOGdQU0J0YjJSMWJHVnpMbVZrYVhSdmNpNWpkWEp5Wlc1MFUzUjViR1VvWlhabGJuUXVkR0Z5WjJWMEtUdGNibHgwWEhSY2RGeDBhV1lnS0NGemRIbHNaVWx1Wm04cElIc2djbVYwZFhKdU95QjlYRzVjYmx4MFhIUmNkRngwZG1GeUlHbHpRV2x5VFc5a1pTQTlJR3hoZVc5MWRFbHVabTh1WldScGRHOXlLQ2t1WkdGMFlTZ25iM0IwYVc5dWN5Y3BMbUZwY2sxdlpHVTdYRzVjZEZ4MFhIUmNkR2xtSUNnaGFYTkJhWEpOYjJSbEtTQjdYRzVjZEZ4MFhIUmNkRngwYlc5a2RXeGxjeTUwYjI5c1ltRnlMblZ3WkdGMFpTaHNZWGx2ZFhSSmJtWnZMblJ2YjJ4aVlYSW9LU3dnYzNSNWJHVkpibVp2S1R0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkRzF2WkhWc1pYTXVjRzl3YjNabGNpNTFjR1JoZEdVb2JHRjViM1YwU1c1bWJ5NXdiM0J2ZG1WeUtDa3NJSE4wZVd4bFNXNW1ieXdnYVhOQmFYSk5iMlJsS1R0Y2JseDBYSFJjZEZ4MGJXOWtkV3hsY3k1b1lXNWtiR1V1ZFhCa1lYUmxLR3hoZVc5MWRFbHVabTh1YUdGdVpHeGxLQ2tzSUhOMGVXeGxTVzVtYnl3Z2FYTkJhWEpOYjJSbEtUdGNibHgwWEhSY2RIMHNJREFwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFIyWVhJZ2FGTmpjbTlzYkNBOUlHWjFibU4wYVc5dUlDaGxkbVZ1ZENrZ2UxeHVYSFJjZEZ4MGRtRnlJR3hoZVc5MWRFbHVabThnUFNCa2IyMHViV0ZyWlV4aGVXOTFkRWx1Wm04b1pYWmxiblF1WTNWeWNtVnVkRlJoY21kbGRDQjhmQ0JsZG1WdWRDNTBZWEpuWlhRcE8xeHVYSFJjZEZ4MEx5OW9hV1JsSUhCdmNHOTJaWElnWVc1a0lHaGhibVJzWlNCM2FHVnVJSE5qY205c2JHVmtYRzVjZEZ4MFhIUnRiMlIxYkdWekxuQnZjRzkyWlhJdWFHbGtaU2hzWVhsdmRYUkpibVp2TG5CdmNHOTJaWElvS1NrN1hHNWNkRngwWEhSdGIyUjFiR1Z6TG1oaGJtUnNaUzVvYVdSbEtHeGhlVzkxZEVsdVptOHVhR0Z1Wkd4bEtDa3BPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnYUZSdmIyeGlZWEpCYm1SUWIzQnZkbVZ5VFc5MWMyVmtiM2R1SUQwZ1puVnVZM1JwYjI0Z0tHVjJaVzUwS1NCN1hHNWNkRngwWEhRdkx5QndjbVYyWlc1MElHUmxabUYxYkhRZ1pYWmxiblFnZDJobGJpQnBibk5sY25SVVlXSnNaU0FvUmtZc0lGZGxZbXRwZENsY2JseDBYSFJjZEhaaGNpQWtZblJ1SUQwZ0pDaGxkbVZ1ZEM1MFlYSm5aWFFwTG1Oc2IzTmxjM1FvSjF0a1lYUmhMV1YyWlc1MFhTY3BPMXh1WEhSY2RGeDBhV1lnS0NSaWRHNHViR1Z1WjNSb0tTQjdYRzVjZEZ4MFhIUmNkR1YyWlc1MExuQnlaWFpsYm5SRVpXWmhkV3gwS0NrN1hHNWNkRngwWEhSOVhHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQm9WRzl2YkdKaGNrRnVaRkJ2Y0c5MlpYSkRiR2xqYXlBOUlHWjFibU4wYVc5dUlDaGxkbVZ1ZENrZ2UxeHVYSFJjZEZ4MGRtRnlJQ1JpZEc0Z1BTQWtLR1YyWlc1MExuUmhjbWRsZENrdVkyeHZjMlZ6ZENnblcyUmhkR0V0WlhabGJuUmRKeWs3WEc1Y2JseDBYSFJjZEdsbUlDZ2tZblJ1TG14bGJtZDBhQ2tnZTF4dVhIUmNkRngwWEhSMllYSWdaWFpsYm5ST1lXMWxJRDBnSkdKMGJpNWhkSFJ5S0Nka1lYUmhMV1YyWlc1MEp5a3NYRzVjZEZ4MFhIUmNkRngwZG1Gc2RXVWdQU0FrWW5SdUxtRjBkSElvSjJSaGRHRXRkbUZzZFdVbktTeGNibHgwWEhSY2RGeDBYSFJvYVdSbElEMGdKR0owYmk1aGRIUnlLQ2RrWVhSaExXaHBaR1VuS1R0Y2JseHVYSFJjZEZ4MFhIUjJZWElnYkdGNWIzVjBTVzVtYnlBOUlHUnZiUzV0WVd0bFRHRjViM1YwU1c1bWJ5aGxkbVZ1ZEM1MFlYSm5aWFFwTzF4dVhHNWNkRngwWEhSY2RDOHZJR0psWm05eVpTQmpiMjF0WVc1a09pQmtaWFJsWTNRZ1kyOXVkSEp2YkNCelpXeGxZM1JwYjI0Z1pXeGxiV1Z1ZENna2RHRnlaMlYwS1Z4dVhIUmNkRngwWEhSMllYSWdKSFJoY21kbGREdGNibHgwWEhSY2RGeDBhV1lnS0NRdWFXNUJjbkpoZVNobGRtVnVkRTVoYldVc0lGc25jbVZ6YVhwbEp5d2dKMlpzYjJGMFRXVW5MQ0FuY21WdGIzWmxUV1ZrYVdFbkxDQW5hVzFoWjJWVGFHRndaU2RkS1NBaFBUMGdMVEVwSUh0Y2JseDBYSFJjZEZ4MFhIUjJZWElnSkhObGJHVmpkR2x2YmlBOUlHeGhlVzkxZEVsdVptOHVhR0Z1Wkd4bEtDa3VabWx1WkNnbkxtNXZkR1V0WTI5dWRISnZiQzF6Wld4bFkzUnBiMjRuS1R0Y2JseDBYSFJjZEZ4MFhIUWtkR0Z5WjJWMElEMGdKQ2drYzJWc1pXTjBhVzl1TG1SaGRHRW9KM1JoY21kbGRDY3BLVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RDOHZJRWxtSUhKbGNYVmxjM1JsWkN3Z2FHbGtaU0IwYUdVZ2NHOXdiM1psY2lCM2FHVnVJSFJvWlNCaWRYUjBiMjRnYVhNZ1kyeHBZMnRsWkM1Y2JseDBYSFJjZEZ4MEx5OGdWWE5sWm5Wc0lHWnZjaUIwYUdsdVozTWdiR2xyWlNCemFHOTNTR1ZzY0VScFlXeHZaeTVjYmx4MFhIUmNkRngwYVdZZ0tHaHBaR1VwSUh0Y2JseDBYSFJjZEZ4MFhIUWtZblJ1TG5CaGNtVnVkSE1vSnk1d2IzQnZkbVZ5SnlrdWFHbGtaU2dwTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBhV1lnS0NRdWFYTkdkVzVqZEdsdmJpZ2tMbk4xYlcxbGNtNXZkR1V1Y0d4MVoybHVSWFpsYm5SelcyVjJaVzUwVG1GdFpWMHBLU0I3WEc1Y2RGeDBYSFJjZEZ4MEpDNXpkVzF0WlhKdWIzUmxMbkJzZFdkcGJrVjJaVzUwYzF0bGRtVnVkRTVoYldWZEtHVjJaVzUwTENCdGIyUjFiR1Z6TG1Wa2FYUnZjaXdnYkdGNWIzVjBTVzVtYnl3Z2RtRnNkV1VwTzF4dVhIUmNkRngwWEhSOUlHVnNjMlVnYVdZZ0tHMXZaSFZzWlhNdVpXUnBkRzl5VzJWMlpXNTBUbUZ0WlYwcElIc2dMeThnYjI0Z1kyOXRiV0Z1WkZ4dVhIUmNkRngwWEhSY2RIWmhjaUFrWldScGRHRmliR1VnUFNCc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDazdYRzVjZEZ4MFhIUmNkRngwSkdWa2FYUmhZbXhsTG1adlkzVnpLQ2s3WEc1Y2RGeDBYSFJjZEZ4MGJXOWtkV3hsY3k1bFpHbDBiM0piWlhabGJuUk9ZVzFsWFNna1pXUnBkR0ZpYkdVc0lIWmhiSFZsTENBa2RHRnlaMlYwS1R0Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZEM1d2NtVjJaVzUwUkdWbVlYVnNkQ2dwTzF4dVhIUmNkRngwWEhSOUlHVnNjMlVnYVdZZ0tHTnZiVzFoYm1SelcyVjJaVzUwVG1GdFpWMHBJSHRjYmx4MFhIUmNkRngwWEhSamIyMXRZVzVrYzF0bGRtVnVkRTVoYldWZExtTmhiR3dvZEdocGN5d2diR0Y1YjNWMFNXNW1ieWs3WEc1Y2RGeDBYSFJjZEZ4MFpYWmxiblF1Y0hKbGRtVnVkRVJsWm1GMWJIUW9LVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RDOHZJR0ZtZEdWeUlHTnZiVzFoYm1SY2JseDBYSFJjZEZ4MGFXWWdLQ1F1YVc1QmNuSmhlU2hsZG1WdWRFNWhiV1VzSUZzblltRmphME52Ykc5eUp5d2dKMlp2Y21WRGIyeHZjaWRkS1NBaFBUMGdMVEVwSUh0Y2JseDBYSFJjZEZ4MFhIUjJZWElnYjNCMGFXOXVjeUE5SUd4aGVXOTFkRWx1Wm04dVpXUnBkRzl5S0NrdVpHRjBZU2duYjNCMGFXOXVjeWNzSUc5d2RHbHZibk1wTzF4dVhIUmNkRngwWEhSY2RIWmhjaUJ0YjJSMWJHVWdQU0J2Y0hScGIyNXpMbUZwY2sxdlpHVWdQeUJ0YjJSMWJHVnpMbkJ2Y0c5MlpYSWdPaUJ0YjJSMWJHVnpMblJ2YjJ4aVlYSTdYRzVjZEZ4MFhIUmNkRngwYlc5a2RXeGxMblZ3WkdGMFpWSmxZMlZ1ZEVOdmJHOXlLR3hwYzNRdWFHVmhaQ2drWW5SdUtTd2daWFpsYm5ST1lXMWxMQ0IyWVd4MVpTazdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSb1ZHOXZiR0poY2tGdVpGQnZjRzkyWlhKVmNHUmhkR1VvWlhabGJuUXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnVUZoZlVFVlNYMFZOSUQwZ01UZzdYRzVjZEZ4MGRtRnlJR2hFYVcxbGJuTnBiMjVRYVdOclpYSk5iM1psSUQwZ1puVnVZM1JwYjI0Z0tHVjJaVzUwTENCdmNIUnBiMjV6S1NCN1hHNWNkRngwWEhSMllYSWdKSEJwWTJ0bGNpQTlJQ1FvWlhabGJuUXVkR0Z5WjJWMExuQmhjbVZ1ZEU1dlpHVXBPeUF2THlCMFlYSm5aWFFnYVhNZ2JXOTFjMlZqWVhSamFHVnlYRzVjZEZ4MFhIUjJZWElnSkdScGJXVnVjMmx2YmtScGMzQnNZWGtnUFNBa2NHbGphMlZ5TG01bGVIUW9LVHRjYmx4MFhIUmNkSFpoY2lBa1kyRjBZMmhsY2lBOUlDUndhV05yWlhJdVptbHVaQ2duTG01dmRHVXRaR2x0Wlc1emFXOXVMWEJwWTJ0bGNpMXRiM1Z6WldOaGRHTm9aWEluS1R0Y2JseDBYSFJjZEhaaGNpQWthR2xuYUd4cFoyaDBaV1FnUFNBa2NHbGphMlZ5TG1acGJtUW9KeTV1YjNSbExXUnBiV1Z1YzJsdmJpMXdhV05yWlhJdGFHbG5hR3hwWjJoMFpXUW5LVHRjYmx4MFhIUmNkSFpoY2lBa2RXNW9hV2RvYkdsbmFIUmxaQ0E5SUNSd2FXTnJaWEl1Wm1sdVpDZ25MbTV2ZEdVdFpHbHRaVzV6YVc5dUxYQnBZMnRsY2kxMWJtaHBaMmhzYVdkb2RHVmtKeWs3WEc1Y2JseDBYSFJjZEhaaGNpQndiM05QWm1aelpYUTdYRzVjZEZ4MFhIUXZMeUJJVkUxTU5TQjNhWFJvSUdwUmRXVnllU0F0SUdVdWIyWm1jMlYwV0NCcGN5QjFibVJsWm1sdVpXUWdhVzRnUm1seVpXWnZlRnh1WEhSY2RGeDBhV1lnS0dWMlpXNTBMbTltWm5ObGRGZ2dQVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnY0c5elEyRjBZMmhsY2lBOUlDUW9aWFpsYm5RdWRHRnlaMlYwS1M1dlptWnpaWFFvS1R0Y2JseDBYSFJjZEZ4MGNHOXpUMlptYzJWMElEMGdlMXh1WEhSY2RGeDBYSFJjZEhnNklHVjJaVzUwTG5CaFoyVllJQzBnY0c5elEyRjBZMmhsY2k1c1pXWjBMRnh1WEhSY2RGeDBYSFJjZEhrNklHVjJaVzUwTG5CaFoyVlpJQzBnY0c5elEyRjBZMmhsY2k1MGIzQmNibHgwWEhSY2RGeDBmVHRjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkSEJ2YzA5bVpuTmxkQ0E5SUh0Y2JseDBYSFJjZEZ4MFhIUjRPaUJsZG1WdWRDNXZabVp6WlhSWUxGeHVYSFJjZEZ4MFhIUmNkSGs2SUdWMlpXNTBMbTltWm5ObGRGbGNibHgwWEhSY2RGeDBmVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwZG1GeUlHUnBiU0E5SUh0Y2JseDBYSFJjZEZ4MFl6b2dUV0YwYUM1alpXbHNLSEJ2YzA5bVpuTmxkQzU0SUM4Z1VGaGZVRVZTWDBWTktTQjhmQ0F4TEZ4dVhIUmNkRngwWEhSeU9pQk5ZWFJvTG1ObGFXd29jRzl6VDJabWMyVjBMbmtnTHlCUVdGOVFSVkpmUlUwcElIeDhJREZjYmx4MFhIUmNkSDA3WEc1Y2JseDBYSFJjZENSb2FXZG9iR2xuYUhSbFpDNWpjM01vZXlCM2FXUjBhRG9nWkdsdExtTWdLeUFuWlcwbkxDQm9aV2xuYUhRNklHUnBiUzV5SUNzZ0oyVnRKeUI5S1R0Y2JseDBYSFJjZENSallYUmphR1Z5TG1GMGRISW9KMlJoZEdFdGRtRnNkV1VuTENCa2FXMHVZeUFySUNkNEp5QXJJR1JwYlM1eUtUdGNibHh1WEhSY2RGeDBhV1lnS0RNZ1BDQmthVzB1WXlBbUppQmthVzB1WXlBOElHOXdkR2x2Ym5NdWFXNXpaWEowVkdGaWJHVk5ZWGhUYVhwbExtTnZiQ2tnZTF4dVhIUmNkRngwWEhRa2RXNW9hV2RvYkdsbmFIUmxaQzVqYzNNb2V5QjNhV1IwYURvZ1pHbHRMbU1nS3lBeElDc2dKMlZ0SnlCOUtUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBhV1lnS0RNZ1BDQmthVzB1Y2lBbUppQmthVzB1Y2lBOElHOXdkR2x2Ym5NdWFXNXpaWEowVkdGaWJHVk5ZWGhUYVhwbExuSnZkeWtnZTF4dVhIUmNkRngwWEhRa2RXNW9hV2RvYkdsbmFIUmxaQzVqYzNNb2V5Qm9aV2xuYUhRNklHUnBiUzV5SUNzZ01TQXJJQ2RsYlNjZ2ZTazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQ1JrYVcxbGJuTnBiMjVFYVhOd2JHRjVMbWgwYld3b1pHbHRMbU1nS3lBbklIZ2dKeUFySUdScGJTNXlLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBkbUZ5SUdKcGJtUkRkWE4wYjIxRmRtVnVkQ0E5SUdaMWJtTjBhVzl1SUNna2FHOXNaR1Z5TENCbGRtVnVkRTVoYldVcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQWthRzlzWkdWeUxuUnlhV2RuWlhJb0ozTjFiVzFsY201dmRHVXVKeUFySUdWMlpXNTBUbUZ0WlN3Z1lYSm5kVzFsYm5SektUdGNibHgwWEhSY2RIMDdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJR0pwYm1RZ1MyVjVUV0Z3SUc5dUlHdGxlV1J2ZDI1Y2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JzWVhsdmRYUkpibVp2WEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJR3RsZVUxaGNGeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVZbWx1WkV0bGVVMWhjQ0E5SUdaMWJtTjBhVzl1SUNoc1lYbHZkWFJKYm1adkxDQnJaWGxOWVhBcElIdGNibHgwWEhSY2RIWmhjaUFrWldScGRHOXlJRDBnYkdGNWIzVjBTVzVtYnk1bFpHbDBiM0lvS1R0Y2JseDBYSFJjZEhaaGNpQWtaV1JwZEdGaWJHVWdQU0JzWVhsdmRYUkpibVp2TG1Wa2FYUmhZbXhsS0NrN1hHNWNibHgwWEhSY2RDUmxaR2wwWVdKc1pTNXZiaWduYTJWNVpHOTNiaWNzSUdaMWJtTjBhVzl1SUNobGRtVnVkQ2tnZTF4dVhIUmNkRngwWEhSMllYSWdhMlY1Y3lBOUlGdGRPMXh1WEc1Y2RGeDBYSFJjZEM4dklHMXZaR2xtYVdWeVhHNWNkRngwWEhSY2RHbG1JQ2hsZG1WdWRDNXRaWFJoUzJWNUtTQjdJR3RsZVhNdWNIVnphQ2duUTAxRUp5azdJSDFjYmx4MFhIUmNkRngwYVdZZ0tHVjJaVzUwTG1OMGNteExaWGtnSmlZZ0lXVjJaVzUwTG1Gc2RFdGxlU2tnZXlCclpYbHpMbkIxYzJnb0owTlVVa3duS1RzZ2ZWeHVYSFJjZEZ4MFhIUnBaaUFvWlhabGJuUXVjMmhwWm5STFpYa3BJSHNnYTJWNWN5NXdkWE5vS0NkVFNFbEdWQ2NwT3lCOVhHNWNibHgwWEhSY2RGeDBMeThnYTJWNVkyOWtaVnh1WEhSY2RGeDBYSFIyWVhJZ2EyVjVUbUZ0WlNBOUlHdGxlUzV1WVcxbFJuSnZiVU52WkdWYlpYWmxiblF1YTJWNVEyOWtaVjA3WEc1Y2RGeDBYSFJjZEdsbUlDaHJaWGxPWVcxbEtTQjdYRzVjZEZ4MFhIUmNkRngwYTJWNWN5NXdkWE5vS0d0bGVVNWhiV1VwTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBkbUZ5SUdWMlpXNTBUbUZ0WlNBOUlHdGxlVTFoY0Z0clpYbHpMbXB2YVc0b0p5c25LVjA3WEc1Y2RGeDBYSFJjZEdsbUlDaGxkbVZ1ZEU1aGJXVXBJSHRjYmx4MFhIUmNkRngwWEhScFppQW9KQzV6ZFcxdFpYSnViM1JsTG5Cc2RXZHBia1YyWlc1MGMxdGxkbVZ1ZEU1aGJXVmRLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUjJZWElnY0d4MVoybHVJRDBnSkM1emRXMXRaWEp1YjNSbExuQnNkV2RwYmtWMlpXNTBjMXRsZG1WdWRFNWhiV1ZkTzF4dVhIUmNkRngwWEhSY2RGeDBhV1lnS0NRdWFYTkdkVzVqZEdsdmJpaHdiSFZuYVc0cEtTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RIQnNkV2RwYmlobGRtVnVkQ3dnYlc5a2RXeGxjeTVsWkdsMGIzSXNJR3hoZVc5MWRFbHVabThwTzF4dVhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEgwZ1pXeHpaU0JwWmlBb2JXOWtkV3hsY3k1bFpHbDBiM0piWlhabGJuUk9ZVzFsWFNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwYlc5a2RXeGxjeTVsWkdsMGIzSmJaWFpsYm5ST1lXMWxYU2drWldScGRHRmliR1VzSUNSbFpHbDBiM0l1WkdGMFlTZ25iM0IwYVc5dWN5Y3BLVHRjYmx4MFhIUmNkRngwWEhSY2RHVjJaVzUwTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3WEc1Y2RGeDBYSFJjZEZ4MGZTQmxiSE5sSUdsbUlDaGpiMjF0WVc1a2MxdGxkbVZ1ZEU1aGJXVmRLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmpiMjF0WVc1a2MxdGxkbVZ1ZEU1aGJXVmRMbU5oYkd3b2RHaHBjeXdnYkdGNWIzVjBTVzVtYnlrN1hHNWNkRngwWEhSY2RGeDBYSFJsZG1WdWRDNXdjbVYyWlc1MFJHVm1ZWFZzZENncE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlNCbGJITmxJR2xtSUNoclpYa3VhWE5GWkdsMEtHVjJaVzUwTG10bGVVTnZaR1VwS1NCN1hHNWNkRngwWEhSY2RGeDBiVzlrZFd4bGN5NWxaR2wwYjNJdVlXWjBaWEpEYjIxdFlXNWtLQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgwcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQmhkSFJoWTJnZ1pYWmxiblJvWVc1a2JHVnlYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2JHRjViM1YwU1c1bWJ5QXRJR3hoZVc5MWRDQkpibVp2Y20xaGRHbHZibk5jYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdiM0IwYVc5dWN5QXRJSFZ6WlhJZ2IzQjBhVzl1Y3lCcGJtTnNkV1JsSUdOMWMzUnZiU0JsZG1WdWRDQm9ZVzVrYkdWeWMxeHVYSFJjZENBcUlFQndZWEpoYlNCN1puVnVZM1JwYjI0b1pYWmxiblFwZlNCYmIzQjBhVzl1Y3k1dmJtVnVkR1Z5WFNBdElHVnVkR1Z5SUd0bGVTQm9ZVzVrYkdWeVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0bWRXNWpkR2x2YmlobGRtVnVkQ2w5SUZ0dmNIUnBiMjV6TG05dVptOWpkWE5kWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRtZFc1amRHbHZiaWhsZG1WdWRDbDlJRnR2Y0hScGIyNXpMbTl1WW14MWNsMWNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UyWjFibU4wYVc5dUtHVjJaVzUwS1gwZ1cyOXdkR2x2Ym5NdWIyNXJaWGwxY0YxY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJaMWJtTjBhVzl1S0dWMlpXNTBLWDBnVzI5d2RHbHZibk11YjI1clpYbGtiM2R1WFZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3Wm5WdVkzUnBiMjRvWlhabGJuUXBmU0JiYjNCMGFXOXVjeTV2Ym5CaGMzUmxYVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdablZ1WTNScGIyNG9aWFpsYm5RcGZTQmJiM0IwYVc5dWN5NXZibFJ2YjJ4Q1lYSmpiR2xqYTExY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJaMWJtTjBhVzl1S0dWMlpXNTBLWDBnVzI5d2RHbHZibk11YjI1RGFHRnVaMlZkWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1aGRIUmhZMmdnUFNCbWRXNWpkR2x2YmlBb2JHRjViM1YwU1c1bWJ5d2diM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBMeThnYUdGdVpHeGxjbk1nWm05eUlHVmthWFJoWW14bFhHNWNkRngwWEhScFppQW9iM0IwYVc5dWN5NXphRzl5ZEdOMWRITXBJSHRjYmx4MFhIUmNkRngwZEdocGN5NWlhVzVrUzJWNVRXRndLR3hoZVc5MWRFbHVabThzSUc5d2RHbHZibk11YTJWNVRXRndXMkZuWlc1MExtbHpUV0ZqSUQ4Z0oyMWhZeWNnT2lBbmNHTW5YU2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJzWVhsdmRYUkpibVp2TG1Wa2FYUmhZbXhsS0NrdWIyNG9KMjF2ZFhObFpHOTNiaWNzSUdoTmIzVnpaV1J2ZDI0cE8xeHVYSFJjZEZ4MGJHRjViM1YwU1c1bWJ5NWxaR2wwWVdKc1pTZ3BMbTl1S0NkclpYbDFjQ0J0YjNWelpYVndKeXdnYUZSdmIyeGlZWEpCYm1SUWIzQnZkbVZ5VlhCa1lYUmxLVHRjYmx4MFhIUmNkR3hoZVc5MWRFbHVabTh1WldScGRHRmliR1VvS1M1dmJpZ25jMk55YjJ4c0p5d2dhRk5qY205c2JDazdYRzVjZEZ4MFhIUnRiMlIxYkdWekxtTnNhWEJpYjJGeVpDNWhkSFJoWTJnb2JHRjViM1YwU1c1bWJ5d2diM0IwYVc5dWN5azdYRzVjYmx4MFhIUmNkQzh2SUdoaGJtUnNaWElnWm05eUlHaGhibVJzWlNCaGJtUWdjRzl3YjNabGNseHVYSFJjZEZ4MGJXOWtkV3hsY3k1b1lXNWtiR1V1WVhSMFlXTm9LR3hoZVc5MWRFbHVabThzSUc5d2RHbHZibk1wTzF4dVhIUmNkRngwYkdGNWIzVjBTVzVtYnk1d2IzQnZkbVZ5S0NrdWIyNG9KMk5zYVdOckp5d2dhRlJ2YjJ4aVlYSkJibVJRYjNCdmRtVnlRMnhwWTJzcE8xeHVYSFJjZEZ4MGJHRjViM1YwU1c1bWJ5NXdiM0J2ZG1WeUtDa3ViMjRvSjIxdmRYTmxaRzkzYmljc0lHaFViMjlzWW1GeVFXNWtVRzl3YjNabGNrMXZkWE5sWkc5M2JpazdYRzVjYmx4MFhIUmNkQzh2SUdoaGJtUnNaWElnWm05eUlHUnlZV2NnWVc1a0lHUnliM0JjYmx4MFhIUmNkRzF2WkhWc1pYTXVaSEpoWjBGdVpFUnliM0F1WVhSMFlXTm9LR3hoZVc5MWRFbHVabThzSUc5d2RHbHZibk1wTzF4dVhHNWNkRngwWEhRdkx5Qm9ZVzVrYkdWeWN5Qm1iM0lnWm5KaGJXVWdiVzlrWlNBb2RHOXZiR0poY2l3Z2MzUmhkSFZ6WW1GeUtWeHVYSFJjZEZ4MGFXWWdLQ0Z2Y0hScGIyNXpMbUZwY2sxdlpHVXBJSHRjYmx4MFhIUmNkRngwTHk4Z2FHRnVaR3hsY2lCbWIzSWdkRzl2YkdKaGNseHVYSFJjZEZ4MFhIUnNZWGx2ZFhSSmJtWnZMblJ2YjJ4aVlYSW9LUzV2YmlnblkyeHBZMnNuTENCb1ZHOXZiR0poY2tGdVpGQnZjRzkyWlhKRGJHbGpheWs3WEc1Y2RGeDBYSFJjZEd4aGVXOTFkRWx1Wm04dWRHOXZiR0poY2lncExtOXVLQ2R0YjNWelpXUnZkMjRuTENCb1ZHOXZiR0poY2tGdVpGQnZjRzkyWlhKTmIzVnpaV1J2ZDI0cE8xeHVYRzVjZEZ4MFhIUmNkQzh2SUdoaGJtUnNaWElnWm05eUlITjBZWFIxYzJKaGNseHVYSFJjZEZ4MFhIUnRiMlIxYkdWekxuTjBZWFIxYzJKaGNpNWhkSFJoWTJnb2JHRjViM1YwU1c1bWJ5d2diM0IwYVc5dWN5azdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQzh2SUdoaGJtUnNaWElnWm05eUlIUmhZbXhsSUdScGJXVnVjMmx2Ymx4dVhIUmNkRngwZG1GeUlDUmpZWFJqYUdWeVEyOXVkR0ZwYm1WeUlEMGdiM0IwYVc5dWN5NWhhWEpOYjJSbElEOGdiR0Y1YjNWMFNXNW1ieTV3YjNCdmRtVnlLQ2tnT2x4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0lHeGhlVzkxZEVsdVptOHVkRzl2YkdKaGNpZ3BPMXh1WEhSY2RGeDBkbUZ5SUNSallYUmphR1Z5SUQwZ0pHTmhkR05vWlhKRGIyNTBZV2x1WlhJdVptbHVaQ2duTG01dmRHVXRaR2x0Wlc1emFXOXVMWEJwWTJ0bGNpMXRiM1Z6WldOaGRHTm9aWEluS1R0Y2JseDBYSFJjZENSallYUmphR1Z5TG1OemN5aDdYRzVjZEZ4MFhIUmNkSGRwWkhSb09pQnZjSFJwYjI1ekxtbHVjMlZ5ZEZSaFlteGxUV0Y0VTJsNlpTNWpiMndnS3lBblpXMG5MRnh1WEhSY2RGeDBYSFJvWldsbmFIUTZJRzl3ZEdsdmJuTXVhVzV6WlhKMFZHRmliR1ZOWVhoVGFYcGxMbkp2ZHlBcklDZGxiU2RjYmx4MFhIUmNkSDBwTG05dUtDZHRiM1Z6WlcxdmRtVW5MQ0JtZFc1amRHbHZiaUFvWlhabGJuUXBJSHRjYmx4MFhIUmNkRngwYUVScGJXVnVjMmx2YmxCcFkydGxjazF2ZG1Vb1pYWmxiblFzSUc5d2RHbHZibk1wTzF4dVhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RDOHZJSE5oZG1VZ2IzQjBhVzl1Y3lCdmJpQmxaR2wwYjNKY2JseDBYSFJjZEd4aGVXOTFkRWx1Wm04dVpXUnBkRzl5S0NrdVpHRjBZU2duYjNCMGFXOXVjeWNzSUc5d2RHbHZibk1wTzF4dVhHNWNkRngwWEhRdkx5QnlaWFFnYzNSNWJHVlhhWFJvUTFOVElHWnZjaUJpWVdOclEyOXNiM0lnTHlCbWIzSmxRMjlzYjNJZ1kyeGxZWEpwYm1jZ2QybDBhQ0FuYVc1b1pYSnBkQ2N1WEc1Y2RGeDBYSFJwWmlBb0lXRm5aVzUwTG1selRWTkpSU2tnZTF4dVhIUmNkRngwWEhRdkx5QndjbTkwWldOMElFWkdJRVZ5Y205eU9pQk9VMTlGVWxKUFVsOUdRVWxNVlZKRk9pQkdZV2xzZFhKbFhHNWNkRngwWEhSY2RITmxkRlJwYldWdmRYUW9ablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSY2RHUnZZM1Z0Wlc1MExtVjRaV05EYjIxdFlXNWtLQ2R6ZEhsc1pWZHBkR2hEVTFNbkxDQXdMQ0J2Y0hScGIyNXpMbk4wZVd4bFYybDBhRk53WVc0cE8xeHVYSFJjZEZ4MFhIUjlMQ0F3S1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MEx5OGdTR2x6ZEc5eWVWeHVYSFJjZEZ4MGRtRnlJR2hwYzNSdmNua2dQU0J1WlhjZ1NHbHpkRzl5ZVNoc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDa3BPMXh1WEhSY2RGeDBiR0Y1YjNWMFNXNW1ieTVsWkdsMFlXSnNaU2dwTG1SaGRHRW9KMDV2ZEdWSWFYTjBiM0o1Snl3Z2FHbHpkRzl5ZVNrN1hHNWNibHgwWEhSY2RDOHZJR0poYzJsaklHVjJaVzUwSUdOaGJHeGlZV05yY3lBb2JHOTNaWEpqWVhObEtWeHVYSFJjZEZ4MEx5OGdaVzUwWlhJc0lHWnZZM1Z6TENCaWJIVnlMQ0JyWlhsMWNDd2dhMlY1Wkc5M2JseHVYSFJjZEZ4MGFXWWdLRzl3ZEdsdmJuTXViMjVsYm5SbGNpa2dlMXh1WEhSY2RGeDBYSFJzWVhsdmRYUkpibVp2TG1Wa2FYUmhZbXhsS0NrdWEyVjVjSEpsYzNNb1puVnVZM1JwYjI0Z0tHVjJaVzUwS1NCN1hHNWNkRngwWEhSY2RGeDBhV1lnS0dWMlpXNTBMbXRsZVVOdlpHVWdQVDA5SUd0bGVTNUZUbFJGVWlrZ2V5QnZjSFJwYjI1ekxtOXVaVzUwWlhJb1pYWmxiblFwT3lCOVhHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJwWmlBb2IzQjBhVzl1Y3k1dmJtWnZZM1Z6S1NCN0lHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LUzVtYjJOMWN5aHZjSFJwYjI1ekxtOXVabTlqZFhNcE95QjlYRzVjZEZ4MFhIUnBaaUFvYjNCMGFXOXVjeTV2Ym1Kc2RYSXBJSHNnYkdGNWIzVjBTVzVtYnk1bFpHbDBZV0pzWlNncExtSnNkWElvYjNCMGFXOXVjeTV2Ym1Kc2RYSXBPeUI5WEc1Y2RGeDBYSFJwWmlBb2IzQjBhVzl1Y3k1dmJtdGxlWFZ3S1NCN0lHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LUzVyWlhsMWNDaHZjSFJwYjI1ekxtOXVhMlY1ZFhBcE95QjlYRzVjZEZ4MFhIUnBaaUFvYjNCMGFXOXVjeTV2Ym10bGVXUnZkMjRwSUhzZ2JHRjViM1YwU1c1bWJ5NWxaR2wwWVdKc1pTZ3BMbXRsZVdSdmQyNG9iM0IwYVc5dWN5NXZibXRsZVdSdmQyNHBPeUI5WEc1Y2RGeDBYSFJwWmlBb2IzQjBhVzl1Y3k1dmJuQmhjM1JsS1NCN0lHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LUzV2YmlnbmNHRnpkR1VuTENCdmNIUnBiMjV6TG05dWNHRnpkR1VwT3lCOVhHNWNibHgwWEhSY2RDOHZJR05oYkd4aVlXTnJjeUJtYjNJZ1lXUjJZVzVqWldRZ1ptVmhkSFZ5WlhNZ0tHTmhiV1ZzS1Z4dVhHNWNkRngwWEhRdkx5QnZibFJ2YjJ4aVlYSkRiR2xqYTF4dVhIUmNkRngwYVdZZ0tHOXdkR2x2Ym5NdWIyNVViMjlzWW1GeVEyeHBZMnNwSUh0Y2JseDBYSFJjZEZ4MGJHRjViM1YwU1c1bWJ5NTBiMjlzWW1GeUtDa3VZMnhwWTJzb2IzQjBhVzl1Y3k1dmJsUnZiMnhpWVhKRGJHbGpheWs3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4dklHOXVRMmhoYm1kbFhHNWNkRngwWEhScFppQW9iM0IwYVc5dWN5NXZia05vWVc1blpTa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2FFTm9ZVzVuWlNBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwWEhSdGIyUjFiR1Z6TG1Wa2FYUnZjaTUwY21sbloyVnlUMjVEYUdGdVoyVW9iR0Y1YjNWMFNXNW1ieTVsWkdsMFlXSnNaU2dwS1R0Y2JseDBYSFJjZEZ4MGZUdGNibHh1WEhSY2RGeDBYSFJwWmlBb1lXZGxiblF1YVhOTlUwbEZLU0I3WEc1Y2RGeDBYSFJjZEZ4MGRtRnlJSE5FYjIxRmRtVnVkSE1nUFNBblJFOU5RMmhoY21GamRHVnlSR0YwWVUxdlpHbG1hV1ZrSUVSUFRWTjFZblJ5WldWTmIyUnBabWxsWkNCRVQwMU9iMlJsU1c1elpYSjBaV1FuTzF4dVhIUmNkRngwWEhSY2RHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LUzV2YmloelJHOXRSWFpsYm5SekxDQm9RMmhoYm1kbEtUdGNibHgwWEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBYSFJzWVhsdmRYUkpibVp2TG1Wa2FYUmhZbXhsS0NrdWIyNG9KMmx1Y0hWMEp5d2dhRU5vWVc1blpTazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwTHk4Z1FXeHNJR1ZrYVhSdmNpQnpkR0YwZFhNZ2QybHNiQ0JpWlNCellYWmxaQ0J2YmlCbFpHbDBZV0pzWlNCM2FYUm9JR3B4ZFdWeWVTZHpJR1JoZEdGY2JseDBYSFJjZEM4dklHWnZjaUJ6ZFhCd2IzSjBJRzExYkhScGNHeGxJR1ZrYVhSdmNpQjNhWFJvSUhOcGJtZHNaWFJ2YmlCdlltcGxZM1F1WEc1Y2RGeDBYSFJzWVhsdmRYUkpibVp2TG1Wa2FYUmhZbXhsS0NrdVpHRjBZU2duWTJGc2JHSmhZMnR6Snl3Z2UxeHVYSFJjZEZ4MFhIUnZia0psWm05eVpVTm9ZVzVuWlRvZ2IzQjBhVzl1Y3k1dmJrSmxabTl5WlVOb1lXNW5aU3hjYmx4MFhIUmNkRngwYjI1RGFHRnVaMlU2SUc5d2RHbHZibk11YjI1RGFHRnVaMlVzWEc1Y2RGeDBYSFJjZEc5dVFYVjBiMU5oZG1VNklHOXdkR2x2Ym5NdWIyNUJkWFJ2VTJGMlpTeGNibHgwWEhSY2RGeDBiMjVKYldGblpWVndiRzloWkRvZ2IzQjBhVzl1Y3k1dmJrbHRZV2RsVlhCc2IyRmtMRnh1WEhSY2RGeDBYSFJ2YmtsdFlXZGxWWEJzYjJGa1JYSnliM0k2SUc5d2RHbHZibk11YjI1SmJXRm5aVlZ3Ykc5aFpFVnljbTl5TEZ4dVhIUmNkRngwWEhSdmJrWnBiR1ZWY0d4dllXUTZJRzl3ZEdsdmJuTXViMjVHYVd4bFZYQnNiMkZrTEZ4dVhIUmNkRngwWEhSdmJrWnBiR1ZWY0d4dllXUkZjbkp2Y2pvZ2IzQjBhVzl1Y3k1dmJrWnBiR1ZWY0d4dllXUXNYRzVjZEZ4MFhIUmNkRzl1VFdWa2FXRkVaV3hsZEdVNklHOXdkR2x2Ym5NdWIyNU5aV1JwWVVSbGJHVjBaVnh1WEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEM4dklGUmxlSFJoY21WaE9pQmhkWFJ2SUdacGJHeHBibWNnZEdobElHTnZaR1VnWW1WbWIzSmxJR1p2Y20wZ2MzVmliV2wwTGx4dVhIUmNkRngwYVdZZ0tHUnZiUzVwYzFSbGVIUmhjbVZoS0d4cGMzUXVhR1ZoWkNoc1lYbHZkWFJKYm1adkxtaHZiR1JsY2lncEtTa3BJSHRjYmx4MFhIUmNkRngwYkdGNWIzVjBTVzVtYnk1b2IyeGtaWElvS1M1amJHOXpaWE4wS0NkbWIzSnRKeWt1YzNWaWJXbDBLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MFhIUjJZWElnWTI5dWRHVnVkSE1nUFNCc1lYbHZkWFJKYm1adkxtaHZiR1JsY2lncExtTnZaR1VvS1R0Y2JseDBYSFJjZEZ4MFhIUnNZWGx2ZFhSSmJtWnZMbWh2YkdSbGNpZ3BMblpoYkNoamIyNTBaVzUwY3lrN1hHNWNibHgwWEhSY2RGeDBYSFF2THlCallXeHNZbUZqYXlCdmJpQnpkV0p0YVhSY2JseDBYSFJjZEZ4MFhIUnBaaUFvYjNCMGFXOXVjeTV2Ym5OMVltMXBkQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBiM0IwYVc5dWN5NXZibk4xWW0xcGRDaGpiMjUwWlc1MGN5azdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dZWFIwWVdOb0lHcHhkV1Z5ZVNCamRYTjBiMjBnWlhabGJuUmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCc1lYbHZkWFJKYm1adklDMGdiR0Y1YjNWMElFbHVabTl5YldGMGFXOXVjMXh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11WVhSMFlXTm9RM1Z6ZEc5dFJYWmxiblFnUFNCbWRXNWpkR2x2YmlBb2JHRjViM1YwU1c1bWJ5d2diM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBkbUZ5SUNSb2IyeGtaWElnUFNCc1lYbHZkWFJKYm1adkxtaHZiR1JsY2lncE8xeHVYSFJjZEZ4MGRtRnlJQ1JsWkdsMFlXSnNaU0E5SUd4aGVXOTFkRWx1Wm04dVpXUnBkR0ZpYkdVb0tUdGNibHh1WEhSY2RGeDBKR1ZrYVhSaFlteGxMbTl1S0NkdGIzVnpaV1J2ZDI0bkxDQmlhVzVrUTNWemRHOXRSWFpsYm5Rb0pHaHZiR1JsY2l3Z0oyMXZkWE5sWkc5M2JpY3BLVHRjYmx4MFhIUmNkQ1JsWkdsMFlXSnNaUzV2YmlnbmEyVjVkWEFnYlc5MWMyVjFjQ2NzSUdKcGJtUkRkWE4wYjIxRmRtVnVkQ2drYUc5c1pHVnlMQ0FuZFhCa1lYUmxKeWtwTzF4dVhIUmNkRngwSkdWa2FYUmhZbXhsTG05dUtDZHpZM0p2Ykd3bkxDQmlhVzVrUTNWemRHOXRSWFpsYm5Rb0pHaHZiR1JsY2l3Z0ozTmpjbTlzYkNjcEtUdGNibHh1WEhSY2RGeDBMeThnWW1GemFXTWdaWFpsYm5RZ1kyRnNiR0poWTJ0eklDaHNiM2RsY21OaGMyVXBYRzVjZEZ4MFhIUXZMeUJsYm5SbGNpd2dabTlqZFhNc0lHSnNkWElzSUd0bGVYVndMQ0JyWlhsa2IzZHVYRzVjZEZ4MFhIUWtaV1JwZEdGaWJHVXVhMlY1Y0hKbGMzTW9ablZ1WTNScGIyNGdLR1YyWlc1MEtTQjdYRzVjZEZ4MFhIUmNkR2xtSUNobGRtVnVkQzVyWlhsRGIyUmxJRDA5UFNCclpYa3VSVTVVUlZJcElIdGNibHgwWEhSY2RGeDBYSFJpYVc1a1EzVnpkRzl0UlhabGJuUW9KR2h2YkdSbGNpd2dKMlZ1ZEdWeUp5a3VZMkZzYkNoMGFHbHpMQ0JsZG1WdWRDazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDBwTzF4dVhHNWNkRngwWEhRa1pXUnBkR0ZpYkdVdVptOWpkWE1vWW1sdVpFTjFjM1J2YlVWMlpXNTBLQ1JvYjJ4a1pYSXNJQ2RtYjJOMWN5Y3BLVHRjYmx4MFhIUmNkQ1JsWkdsMFlXSnNaUzVpYkhWeUtHSnBibVJEZFhOMGIyMUZkbVZ1ZENna2FHOXNaR1Z5TENBbllteDFjaWNwS1R0Y2JseDBYSFJjZENSbFpHbDBZV0pzWlM1clpYbDFjQ2hpYVc1a1EzVnpkRzl0UlhabGJuUW9KR2h2YkdSbGNpd2dKMnRsZVhWd0p5a3BPMXh1WEhSY2RGeDBKR1ZrYVhSaFlteGxMbXRsZVdSdmQyNG9ZbWx1WkVOMWMzUnZiVVYyWlc1MEtDUm9iMnhrWlhJc0lDZHJaWGxrYjNkdUp5a3BPMXh1WEhSY2RGeDBKR1ZrYVhSaFlteGxMbTl1S0Nkd1lYTjBaU2NzSUdKcGJtUkRkWE4wYjIxRmRtVnVkQ2drYUc5c1pHVnlMQ0FuY0dGemRHVW5LU2s3WEc1Y2JseDBYSFJjZEM4dklHTmhiR3hpWVdOcmN5Qm1iM0lnWVdSMllXNWpaV1FnWm1WaGRIVnlaWE1nS0dOaGJXVnNLVnh1WEhSY2RGeDBhV1lnS0NGdmNIUnBiMjV6TG1GcGNrMXZaR1VwSUh0Y2JseDBYSFJjZEZ4MGJHRjViM1YwU1c1bWJ5NTBiMjlzWW1GeUtDa3VZMnhwWTJzb1ltbHVaRU4xYzNSdmJVVjJaVzUwS0NSb2IyeGtaWElzSUNkMGIyOXNZbUZ5TG1Oc2FXTnJKeWtwTzF4dVhIUmNkRngwWEhSc1lYbHZkWFJKYm1adkxuQnZjRzkyWlhJb0tTNWpiR2xqYXloaWFXNWtRM1Z6ZEc5dFJYWmxiblFvSkdodmJHUmxjaXdnSjNCdmNHOTJaWEl1WTJ4cFkyc25LU2s3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEdsbUlDaGhaMlZ1ZEM1cGMwMVRTVVVwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJSE5FYjIxRmRtVnVkSE1nUFNBblJFOU5RMmhoY21GamRHVnlSR0YwWVUxdlpHbG1hV1ZrSUVSUFRWTjFZblJ5WldWTmIyUnBabWxsWkNCRVQwMU9iMlJsU1c1elpYSjBaV1FuTzF4dVhIUmNkRngwWEhRa1pXUnBkR0ZpYkdVdWIyNG9jMFJ2YlVWMlpXNTBjeXdnWW1sdVpFTjFjM1J2YlVWMlpXNTBLQ1JvYjJ4a1pYSXNJQ2RqYUdGdVoyVW5LU2s3WEc1Y2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFFrWldScGRHRmliR1V1YjI0b0oybHVjSFYwSnl3Z1ltbHVaRU4xYzNSdmJVVjJaVzUwS0NSb2IyeGtaWElzSUNkamFHRnVaMlVuS1NrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZJRlJsZUhSaGNtVmhPaUJoZFhSdklHWnBiR3hwYm1jZ2RHaGxJR052WkdVZ1ltVm1iM0psSUdadmNtMGdjM1ZpYldsMExseHVYSFJjZEZ4MGFXWWdLR1J2YlM1cGMxUmxlSFJoY21WaEtHeHBjM1F1YUdWaFpDZ2thRzlzWkdWeUtTa3BJSHRjYmx4MFhIUmNkRngwSkdodmJHUmxjaTVqYkc5elpYTjBLQ2RtYjNKdEp5a3VjM1ZpYldsMEtHWjFibU4wYVc5dUlDaGxLU0I3WEc1Y2RGeDBYSFJjZEZ4MGRtRnlJR052Ym5SbGJuUnpJRDBnSkdodmJHUmxjaTVqYjJSbEtDazdYRzVjZEZ4MFhIUmNkRngwWW1sdVpFTjFjM1J2YlVWMlpXNTBLQ1JvYjJ4a1pYSXNJQ2R6ZFdKdGFYUW5LUzVqWVd4c0tIUm9hWE1zSUdVc0lHTnZiblJsYm5SektUdGNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4dklHWnBjbVVnYVc1cGRDQmxkbVZ1ZEZ4dVhIUmNkRngwWW1sdVpFTjFjM1J2YlVWMlpXNTBLQ1JvYjJ4a1pYSXNJQ2RwYm1sMEp5a29LVHRjYmx4dVhIUmNkRngwTHk4Z1ptbHlaU0J3YkhWbmFXNGdhVzVwZENCbGRtVnVkRnh1WEhSY2RGeDBabTl5SUNoMllYSWdhU0E5SURBc0lHeGxiaUE5SUNRdWMzVnRiV1Z5Ym05MFpTNXdiSFZuYVc1ekxteGxibWQwYURzZ2FTQThJR3hsYmpzZ2FTc3JLU0I3WEc1Y2RGeDBYSFJjZEdsbUlDZ2tMbWx6Um5WdVkzUnBiMjRvSkM1emRXMXRaWEp1YjNSbExuQnNkV2RwYm5OYmFWMHVhVzVwZENrcElIdGNibHgwWEhSY2RGeDBYSFFrTG5OMWJXMWxjbTV2ZEdVdWNHeDFaMmx1YzF0cFhTNXBibWwwS0d4aGVXOTFkRWx1Wm04cE8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZUdGNibHh1WEhSY2RIUm9hWE11WkdWMFlXTm9JRDBnWm5WdVkzUnBiMjRnS0d4aGVXOTFkRWx1Wm04c0lHOXdkR2x2Ym5NcElIdGNibHgwWEhSY2RHeGhlVzkxZEVsdVptOHVhRzlzWkdWeUtDa3ViMlptS0NrN1hHNWNkRngwWEhSc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDa3ViMlptS0NrN1hHNWNibHgwWEhSY2RHeGhlVzkxZEVsdVptOHVjRzl3YjNabGNpZ3BMbTltWmlncE8xeHVYSFJjZEZ4MGJHRjViM1YwU1c1bWJ5NW9ZVzVrYkdVb0tTNXZabVlvS1R0Y2JseDBYSFJjZEd4aGVXOTFkRWx1Wm04dVpHbGhiRzluS0NrdWIyWm1LQ2s3WEc1Y2JseDBYSFJjZEdsbUlDZ2hiM0IwYVc5dWN5NWhhWEpOYjJSbEtTQjdYRzVjZEZ4MFhIUmNkR3hoZVc5MWRFbHVabTh1WkhKdmNIcHZibVVvS1M1dlptWW9LVHRjYmx4MFhIUmNkRngwYkdGNWIzVjBTVzVtYnk1MGIyOXNZbUZ5S0NrdWIyWm1LQ2s3WEc1Y2RGeDBYSFJjZEd4aGVXOTFkRWx1Wm04dWMzUmhkSFZ6WW1GeUtDa3ViMlptS0NrN1hHNWNkRngwWEhSOVhHNWNkRngwZlR0Y2JseDBmVHRjYmx4dVhIUXZLaXBjYmx4MElDb2dRR05zWVhOeklGSmxibVJsY21WeVhHNWNkQ0FxWEc1Y2RDQXFJSEpsYm1SbGNtVnlYRzVjZENBcVhHNWNkQ0FxSUhKbGJtUmxjbWx1WnlCMGIyOXNZbUZ5SUdGdVpDQmxaR2wwWVdKc1pWeHVYSFFnS2k5Y2JseDBkbUZ5SUZKbGJtUmxjbVZ5SUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nWW05dmRITjBjbUZ3SUdKMWRIUnZiaUIwWlcxd2JHRjBaVnh1WEhSY2RDQXFJRUJ3Y21sMllYUmxYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlHeGhZbVZzSUdKMWRIUnZiaUJ1WVcxbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUZ0dmNIUnBiMjV6WFNCaWRYUjBiMjRnYjNCMGFXOXVjMXh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQmJiM0IwYVc5dWN5NWxkbVZ1ZEYwZ1pHRjBZUzFsZG1WdWRGeHVYSFJjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCYmIzQjBhVzl1Y3k1amJHRnpjMDVoYldWZElHSjFkSFJ2YmlkeklHTnNZWE56SUc1aGJXVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1cyOXdkR2x2Ym5NdWRtRnNkV1ZkSUdSaGRHRXRkbUZzZFdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnVzI5d2RHbHZibk11ZEdsMGJHVmRJR0oxZEhSdmJpZHpJSFJwZEd4bElHWnZjaUJ3YjNCMWNGeHVYSFJjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCYmIzQjBhVzl1Y3k1a2NtOXdaRzkzYmwwZ1pISnZjR1J2ZDI0Z2FIUnRiRnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQmJiM0IwYVc5dWN5NW9hV1JsWFNCa1lYUmhMV2hwWkdWY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2RIQnNRblYwZEc5dUlEMGdablZ1WTNScGIyNGdLR3hoWW1Wc0xDQnZjSFJwYjI1ektTQjdYRzVjZEZ4MFhIUjJZWElnWlhabGJuUWdQU0J2Y0hScGIyNXpMbVYyWlc1ME8xeHVYSFJjZEZ4MGRtRnlJSFpoYkhWbElEMGdiM0IwYVc5dWN5NTJZV3gxWlR0Y2JseDBYSFJjZEhaaGNpQjBhWFJzWlNBOUlHOXdkR2x2Ym5NdWRHbDBiR1U3WEc1Y2RGeDBYSFIyWVhJZ1kyeGhjM05PWVcxbElEMGdiM0IwYVc5dWN5NWpiR0Z6YzA1aGJXVTdYRzVjZEZ4MFhIUjJZWElnWkhKdmNHUnZkMjRnUFNCdmNIUnBiMjV6TG1SeWIzQmtiM2R1TzF4dVhIUmNkRngwZG1GeUlHaHBaR1VnUFNCdmNIUnBiMjV6TG1ocFpHVTdYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQW5QR0oxZEhSdmJpQjBlWEJsUFZ3aVluVjBkRzl1WENJbklDdGNibHgwWEhSY2RGeDBYSFFnSUNBbklHTnNZWE56UFZ3aVluUnVJR0owYmkxa1pXWmhkV3gwSUdKMGJpMXpiU0JpZEc0dGMyMWhiR3duSUN0Y2JseDBYSFJjZEZ4MFhIUmNkQ0FvWTJ4aGMzTk9ZVzFsSUQ4Z0p5QW5JQ3NnWTJ4aGMzTk9ZVzFsSURvZ0p5Y3BJQ3RjYmx4MFhIUmNkRngwWEhSY2RDQW9aSEp2Y0dSdmQyNGdQeUFuSUdSeWIzQmtiM2R1TFhSdloyZHNaU2NnT2lBbkp5a2dLMXh1WEhSY2RGeDBYSFJjZENBZ0lDZGNJaWNnSzF4dVhIUmNkRngwWEhSY2RDQWdJQ2hrY205d1pHOTNiaUEvSUNjZ1pHRjBZUzEwYjJkbmJHVTlYQ0prY205d1pHOTNibHdpSnlBNklDY25LU0FyWEc1Y2RGeDBYSFJjZEZ4MElDQWdLSFJwZEd4bElEOGdKeUIwYVhSc1pUMWNJaWNnS3lCMGFYUnNaU0FySUNkY0lpY2dPaUFuSnlrZ0sxeHVYSFJjZEZ4MFhIUmNkQ0FnSUNobGRtVnVkQ0EvSUNjZ1pHRjBZUzFsZG1WdWREMWNJaWNnS3lCbGRtVnVkQ0FySUNkY0lpY2dPaUFuSnlrZ0sxeHVYSFJjZEZ4MFhIUmNkQ0FnSUNoMllXeDFaU0EvSUNjZ1pHRjBZUzEyWVd4MVpUMWNYQ2NuSUNzZ2RtRnNkV1VnS3lBblhGd25KeUE2SUNjbktTQXJYRzVjZEZ4MFhIUmNkRngwSUNBZ0tHaHBaR1VnUHlBbklHUmhkR0V0YUdsa1pUMWNYQ2NuSUNzZ2FHbGtaU0FySUNkY1hDY25JRG9nSnljcElDdGNibHgwWEhSY2RGeDBYSFFnSUNBbklIUmhZbWx1WkdWNFBWd2lMVEZjSWo0bklDdGNibHgwWEhSY2RGeDBYSFFnYkdGaVpXd2dLMXh1WEhSY2RGeDBYSFJjZENBb1pISnZjR1J2ZDI0Z1B5QW5JRHh6Y0dGdUlHTnNZWE56UFZ3aVkyRnlaWFJjSWo0OEwzTndZVzQrSnlBNklDY25LU0FyWEc1Y2RGeDBYSFJjZENBZ0lDYzhMMkoxZEhSdmJqNG5JQ3RjYmx4MFhIUmNkRngwSUNBZ0tHUnliM0JrYjNkdUlIeDhJQ2NuS1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1ltOXZkSE4wY21Gd0lHbGpiMjRnWW5WMGRHOXVJSFJsYlhCc1lYUmxYRzVjZEZ4MElDb2dRSEJ5YVhaaGRHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ2FXTnZia05zWVhOelRtRnRaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQmJiM0IwYVc5dWMxMWNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1cyOXdkR2x2Ym5NdVpYWmxiblJkWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJRnR2Y0hScGIyNXpMblpoYkhWbFhWeHVYSFJjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCYmIzQjBhVzl1Y3k1MGFYUnNaVjFjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdXMjl3ZEdsdmJuTXVaSEp2Y0dSdmQyNWRYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJSFJ3YkVsamIyNUNkWFIwYjI0Z1BTQm1kVzVqZEdsdmJpQW9hV052YmtOc1lYTnpUbUZ0WlN3Z2IzQjBhVzl1Y3lrZ2UxeHVYSFJjZEZ4MGRtRnlJR3hoWW1Wc0lEMGdKenhwSUdOc1lYTnpQVndpSnlBcklHbGpiMjVEYkdGemMwNWhiV1VnS3lBblhDSStQQzlwUGljN1hHNWNkRngwWEhSeVpYUjFjbTRnZEhCc1FuVjBkRzl1S0d4aFltVnNMQ0J2Y0hScGIyNXpLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nWW05dmRITjBjbUZ3SUhCdmNHOTJaWElnZEdWdGNHeGhkR1ZjYmx4MFhIUWdLaUJBY0hKcGRtRjBaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQmpiR0Z6YzA1aGJXVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1kyOXVkR1Z1ZEZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCMGNHeFFiM0J2ZG1WeUlEMGdablZ1WTNScGIyNGdLR05zWVhOelRtRnRaU3dnWTI5dWRHVnVkQ2tnZTF4dVhIUmNkRngwZG1GeUlDUndiM0J2ZG1WeUlEMGdKQ2duUEdScGRpQmpiR0Z6Y3oxY0lpY2dLeUJqYkdGemMwNWhiV1VnS3lBbklIQnZjRzkyWlhJZ1ltOTBkRzl0SUdsdVhDSWdjM1I1YkdVOVhDSmthWE53YkdGNU9pQnViMjVsTzF3aVBpY2dLMXh1WEhSY2RGeDBYSFJjZENBblBHUnBkaUJqYkdGemN6MWNJbUZ5Y205M1hDSStQQzlrYVhZK0p5QXJYRzVjZEZ4MFhIUmNkRngwSUNjOFpHbDJJR05zWVhOelBWd2ljRzl3YjNabGNpMWpiMjUwWlc1MFhDSStKeUFyWEc1Y2RGeDBYSFJjZEZ4MElDYzhMMlJwZGo0bklDdGNibHgwWEhSY2RGeDBJQ0FnSnp3dlpHbDJQaWNwTzF4dVhHNWNkRngwWEhRa2NHOXdiM1psY2k1bWFXNWtLQ2N1Y0c5d2IzWmxjaTFqYjI1MFpXNTBKeWt1WVhCd1pXNWtLR052Ym5SbGJuUXBPMXh1WEhSY2RGeDBjbVYwZFhKdUlDUndiM0J2ZG1WeU8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQmliMjkwYzNSeVlYQWdaR2xoYkc5bklIUmxiWEJzWVhSbFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnWTJ4aGMzTk9ZVzFsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJRnQwYVhSc1pUMG5KMTFjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdZbTlrZVZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JiWm05dmRHVnlQU2NuWFZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCMGNHeEVhV0ZzYjJjZ1BTQm1kVzVqZEdsdmJpQW9ZMnhoYzNOT1lXMWxMQ0IwYVhSc1pTd2dZbTlrZVN3Z1ptOXZkR1Z5S1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnSnp4a2FYWWdZMnhoYzNNOVhDSW5JQ3NnWTJ4aGMzTk9ZVzFsSUNzZ0p5QnRiMlJoYkZ3aUlHRnlhV0V0YUdsa1pHVnVQVndpWm1Gc2MyVmNJajRuSUN0Y2JseDBYSFJjZEZ4MFhIUWdKenhrYVhZZ1kyeGhjM005WENKdGIyUmhiQzFrYVdGc2IyZGNJajRuSUN0Y2JseDBYSFJjZEZ4MFhIUWdJQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltMXZaR0ZzTFdOdmJuUmxiblJjSWo0bklDdGNibHgwWEhSY2RGeDBYSFJjZENBb2RHbDBiR1VnUDF4dVhIUmNkRngwWEhSY2RGeDBJQ2M4WkdsMklHTnNZWE56UFZ3aWJXOWtZV3d0YUdWaFpHVnlYQ0krSnlBclhHNWNkRngwWEhSY2RGeDBYSFFnSUNBblBHSjFkSFJ2YmlCMGVYQmxQVndpWW5WMGRHOXVYQ0lnWTJ4aGMzTTlYQ0pqYkc5elpWd2lJR0Z5YVdFdGFHbGtaR1Z1UFZ3aWRISjFaVndpSUhSaFltbHVaR1Y0UFZ3aUxURmNJajRtZEdsdFpYTTdQQzlpZFhSMGIyNCtKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUWdJQ0FuUEdnMElHTnNZWE56UFZ3aWJXOWtZV3d0ZEdsMGJHVmNJajRuSUNzZ2RHbDBiR1VnS3lBblBDOW9ORDRuSUN0Y2JseDBYSFJjZEZ4MFhIUmNkQ0FuUEM5a2FYWStKeUE2SUNjblhHNWNkRngwWEhSY2RGeDBYSFFnS1NBclhHNWNkRngwWEhSY2RGeDBYSFFnSnp4bWIzSnRJR05zWVhOelBWd2libTkwWlMxdGIyUmhiQzFtYjNKdFhDSStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUWdJQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltMXZaR0ZzTFdKdlpIbGNJajRuSUNzZ1ltOWtlU0FySUNjOEwyUnBkajRuSUN0Y2JseDBYSFJjZEZ4MFhIUmNkQ0FnSUNobWIyOTBaWElnUDF4dVhIUmNkRngwWEhSY2RGeDBJQ0FnSnp4a2FYWWdZMnhoYzNNOVhDSnRiMlJoYkMxbWIyOTBaWEpjSWo0bklDc2dabTl2ZEdWeUlDc2dKend2WkdsMlBpY2dPaUFuSjF4dVhIUmNkRngwWEhSY2RGeDBJQ0FnS1NBclhHNWNkRngwWEhSY2RGeDBYSFFnSnp3dlptOXliVDRuSUN0Y2JseDBYSFJjZEZ4MFhIUWdJQ0FuUEM5a2FYWStKeUFyWEc1Y2RGeDBYSFJjZEZ4MElDYzhMMlJwZGo0bklDdGNibHgwWEhSY2RGeDBJQ0FnSnp3dlpHbDJQaWM3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkSFpoY2lCMGNHeENkWFIwYjI1SmJtWnZJRDBnZTF4dVhIUmNkRngwY0dsamRIVnlaVG9nWm5WdVkzUnBiMjRnS0d4aGJtY3NJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSFJ3YkVsamIyNUNkWFIwYjI0b2IzQjBhVzl1Y3k1cFkyOXVVSEpsWm1sNElDc2dKM0JwWTNSMWNtVXRieWNzSUh0Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZERvZ0ozTm9iM2RKYldGblpVUnBZV3h2Wnljc1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1YVcxaFoyVXVhVzFoWjJVc1hHNWNkRngwWEhSY2RGeDBhR2xrWlRvZ2RISjFaVnh1WEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEgwc1hHNWNkRngwWEhSc2FXNXJPaUJtZFc1amRHbHZiaUFvYkdGdVp5d2diM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkSEJzU1dOdmJrSjFkSFJ2YmlodmNIUnBiMjV6TG1samIyNVFjbVZtYVhnZ0t5QW5iR2x1YXljc0lIdGNibHgwWEhSY2RGeDBYSFJsZG1WdWREb2dKM05vYjNkTWFXNXJSR2xoYkc5bkp5eGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1c2FXNXJMbXhwYm1zc1hHNWNkRngwWEhSY2RGeDBhR2xrWlRvZ2RISjFaVnh1WEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEgwc1hHNWNkRngwWEhSMFlXSnNaVG9nWm5WdVkzUnBiMjRnS0d4aGJtY3NJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkRngwZG1GeUlHUnliM0JrYjNkdUlEMGdKengxYkNCamJHRnpjejFjSW01dmRHVXRkR0ZpYkdVZ1pISnZjR1J2ZDI0dGJXVnVkVndpUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDQW5QR1JwZGlCamJHRnpjejFjSW01dmRHVXRaR2x0Wlc1emFXOXVMWEJwWTJ0bGNsd2lQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZENBZ0lDYzhaR2wySUdOc1lYTnpQVndpYm05MFpTMWthVzFsYm5OcGIyNHRjR2xqYTJWeUxXMXZkWE5sWTJGMFkyaGxjbHdpSUdSaGRHRXRaWFpsYm5ROVhDSnBibk5sY25SVVlXSnNaVndpSUdSaGRHRXRkbUZzZFdVOVhDSXhlREZjSWo0OEwyUnBkajRuSUN0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQW5QR1JwZGlCamJHRnpjejFjSW01dmRHVXRaR2x0Wlc1emFXOXVMWEJwWTJ0bGNpMW9hV2RvYkdsbmFIUmxaRndpUGp3dlpHbDJQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZENBZ0lDYzhaR2wySUdOc1lYTnpQVndpYm05MFpTMWthVzFsYm5OcGIyNHRjR2xqYTJWeUxYVnVhR2xuYUd4cFoyaDBaV1JjSWo0OEwyUnBkajRuSUN0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6d3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDQW5QR1JwZGlCamJHRnpjejFjSW01dmRHVXRaR2x0Wlc1emFXOXVMV1JwYzNCc1lYbGNJajRnTVNCNElERWdQQzlrYVhZK0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhSY2RDQWdJQ2M4TDNWc1BpYzdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjBjR3hKWTI5dVFuVjBkRzl1S0c5d2RHbHZibk11YVdOdmJsQnlaV1pwZUNBcklDZDBZV0pzWlNjc0lIdGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1MFlXSnNaUzUwWVdKc1pTeGNibHgwWEhSY2RGeDBYSFJrY205d1pHOTNiam9nWkhKdmNHUnZkMjVjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSOUxGeHVYSFJjZEZ4MGMzUjViR1U2SUdaMWJtTjBhVzl1SUNoc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQnBkR1Z0Y3lBOUlHOXdkR2x2Ym5NdWMzUjViR1ZVWVdkekxuSmxaSFZqWlNobWRXNWpkR2x2YmlBb2JXVnRieXdnZGlrZ2UxeHVYSFJjZEZ4MFhIUmNkSFpoY2lCc1lXSmxiQ0E5SUd4aGJtY3VjM1I1YkdWYmRpQTlQVDBnSjNBbklEOGdKMjV2Y20xaGJDY2dPaUIyWFR0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z2JXVnRieUFySUNjOGJHaytQR0VnWkdGMFlTMWxkbVZ1ZEQxY0ltWnZjbTFoZEVKc2IyTnJYQ0lnYUhKbFpqMWNJaU5jSWlCa1lYUmhMWFpoYkhWbFBWd2lKeUFySUhZZ0t5QW5YQ0krSnlBclhHNWNkRngwWEhSY2RGeDBYSFJjZENBb1hHNWNkRngwWEhSY2RGeDBYSFJjZENBZ0lDaDJJRDA5UFNBbmNDY2dmSHdnZGlBOVBUMGdKM0J5WlNjcElEOGdiR0ZpWld3Z09seHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQW5QQ2NnS3lCMklDc2dKejRuSUNzZ2JHRmlaV3dnS3lBblBDOG5JQ3NnZGlBcklDYytKMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdLU0FyWEc1Y2RGeDBYSFJjZEZ4MFhIUWdJQ0FuUEM5aFBqd3ZiR2srSnp0Y2JseDBYSFJjZEZ4MGZTd2dKeWNwTzF4dVhHNWNkRngwWEhSY2RISmxkSFZ5YmlCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkdFlXZHBZeWNzSUh0Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTV6ZEhsc1pTNXpkSGxzWlN4Y2JseDBYSFJjZEZ4MFhIUmtjbTl3Wkc5M2Jqb2dKengxYkNCamJHRnpjejFjSW1SeWIzQmtiM2R1TFcxbGJuVmNJajRuSUNzZ2FYUmxiWE1nS3lBblBDOTFiRDRuWEc1Y2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MGZTeGNibHgwWEhSY2RHWnZiblJ1WVcxbE9pQm1kVzVqZEdsdmJpQW9iR0Z1Wnl3Z2IzQjBhVzl1Y3lrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnY21WaGJFWnZiblJNYVhOMElEMGdXMTA3WEc1Y2RGeDBYSFJjZEhaaGNpQnBkR1Z0Y3lBOUlHOXdkR2x2Ym5NdVptOXVkRTVoYldWekxuSmxaSFZqWlNobWRXNWpkR2x2YmlBb2JXVnRieXdnZGlrZ2UxeHVYSFJjZEZ4MFhIUmNkR2xtSUNnaFlXZGxiblF1YVhOR2IyNTBTVzV6ZEdGc2JHVmtLSFlwSUNZbUlHOXdkR2x2Ym5NdVptOXVkRTVoYldWelNXZHViM0psUTJobFkyc3VhVzVrWlhoUFppaDJLU0E5UFQwZ0xURXBJSHRjYmx4MFhIUmNkRngwWEhSY2RISmxkSFZ5YmlCdFpXMXZPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUnlaV0ZzUm05dWRFeHBjM1F1Y0hWemFDaDJLVHRjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTRnYldWdGJ5QXJJQ2M4YkdrK1BHRWdaR0YwWVMxbGRtVnVkRDFjSW1admJuUk9ZVzFsWENJZ2FISmxaajFjSWlOY0lpQmtZWFJoTFhaaGJIVmxQVndpSnlBcklIWWdLeUFuWENJZ2MzUjViR1U5WENKbWIyNTBMV1poYldsc2VUcGNYQ2NuSUNzZ2RpQXJJQ2RjWENkY0lqNG5JQ3RjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZENjOGFTQmpiR0Z6Y3oxY0lpY2dLeUJ2Y0hScGIyNXpMbWxqYjI1UWNtVm1hWGdnS3lBblkyaGxZMnRjSWo0OEwyaytJQ2NnS3lCMklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ2M4TDJFK1BDOXNhVDRuTzF4dVhIUmNkRngwWEhSOUxDQW5KeWs3WEc1Y2JseDBYSFJjZEZ4MGRtRnlJR2hoYzBSbFptRjFiSFJHYjI1MElEMGdZV2RsYm5RdWFYTkdiMjUwU1c1emRHRnNiR1ZrS0c5d2RHbHZibk11WkdWbVlYVnNkRVp2Ym5ST1lXMWxLVHRjYmx4MFhIUmNkRngwZG1GeUlHUmxabUYxYkhSR2IyNTBUbUZ0WlNBOUlDaG9ZWE5FWldaaGRXeDBSbTl1ZENrZ1B5QnZjSFJwYjI1ekxtUmxabUYxYkhSR2IyNTBUbUZ0WlNBNklISmxZV3hHYjI1MFRHbHpkRnN3WFR0Y2JseHVYSFJjZEZ4MFhIUjJZWElnYkdGaVpXd2dQU0FuUEhOd1lXNGdZMnhoYzNNOVhDSnViM1JsTFdOMWNuSmxiblF0Wm05dWRHNWhiV1ZjSWo0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmtaV1poZFd4MFJtOXVkRTVoYldVZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6d3ZjM0JoYmo0bk8xeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RIQnNRblYwZEc5dUtHeGhZbVZzTENCN1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1Wm05dWRDNXVZVzFsTEZ4dVhIUmNkRngwWEhSY2RHUnliM0JrYjNkdU9pQW5QSFZzSUdOc1lYTnpQVndpWkhKdmNHUnZkMjR0YldWdWRWd2lQaWNnS3lCcGRHVnRjeUFySUNjOEwzVnNQaWRjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSOUxGeHVYSFJjZEZ4MFkyOXNiM0k2SUdaMWJtTjBhVzl1SUNoc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQmpiMnh2Y2tKMWRIUnZia3hoWW1Wc0lEMGdKenhwSUdOc1lYTnpQVndpSnlBcklHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2RtYjI1MFhDSWdjM1I1YkdVOVhDSmpiMnh2Y2pwaWJHRmphenRpWVdOclozSnZkVzVrTFdOdmJHOXlPbmxsYkd4dmR6dGNJajQ4TDJrK0p6dGNibHgwWEhSY2RGeDBkbUZ5SUdOdmJHOXlRblYwZEc5dUlEMGdkSEJzUW5WMGRHOXVLR052Ykc5eVFuVjBkRzl1VEdGaVpXd3NJSHRjYmx4MFhIUmNkRngwWEhSamJHRnpjMDVoYldVNklDZHViM1JsTFhKbFkyVnVkQzFqYjJ4dmNpY3NYRzVjZEZ4MFhIUmNkRngwZEdsMGJHVTZJR3hoYm1jdVkyOXNiM0l1Y21WalpXNTBMRnh1WEhSY2RGeDBYSFJjZEdWMlpXNTBPaUFuWTI5c2IzSW5MRnh1WEhSY2RGeDBYSFJjZEhaaGJIVmxPaUFuZTF3aVltRmphME52Ykc5eVhDSTZYQ0o1Wld4c2IzZGNJbjBuWEc1Y2RGeDBYSFJjZEgwcE8xeHVYRzVjZEZ4MFhIUmNkSFpoY2lCa2NtOXdaRzkzYmlBOUlDYzhkV3dnWTJ4aGMzTTlYQ0prY205d1pHOTNiaTF0Wlc1MVhDSStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwSUNjOGJHaytKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwSUNBZ0p6eGthWFlnWTJ4aGMzTTlYQ0ppZEc0dFozSnZkWEJjSWo0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0Y0dGc1pYUjBaUzEwYVhSc1pWd2lQaWNnS3lCc1lXNW5MbU52Ykc5eUxtSmhZMnRuY205MWJtUWdLeUFuUEM5a2FYWStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6eGthWFlnWTJ4aGMzTTlYQ0p1YjNSbExXTnZiRzl5TFhKbGMyVjBYQ0lnWkdGMFlTMWxkbVZ1ZEQxY0ltSmhZMnREYjJ4dmNsd2lKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQW5JR1JoZEdFdGRtRnNkV1U5WENKcGJtaGxjbWwwWENJZ2RHbDBiR1U5WENJbklDc2diR0Z1Wnk1amIyeHZjaTUwY21GdWMzQmhjbVZ1ZENBcklDZGNJajRuSUN0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RDQWdJR3hoYm1jdVkyOXNiM0l1YzJWMFZISmhibk53WVhKbGJuUWdLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkRngwSUNjOEwyUnBkajRuSUN0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RDQW5QR1JwZGlCamJHRnpjejFjSW01dmRHVXRZMjlzYjNJdGNHRnNaWFIwWlZ3aUlHUmhkR0V0ZEdGeVoyVjBMV1YyWlc1MFBWd2lZbUZqYTBOdmJHOXlYQ0krUEM5a2FYWStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwSUNBZ0p6d3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDQWdJQ2M4WkdsMklHTnNZWE56UFZ3aVluUnVMV2R5YjNWd1hDSStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6eGthWFlnWTJ4aGMzTTlYQ0p1YjNSbExYQmhiR1YwZEdVdGRHbDBiR1ZjSWo0bklDc2diR0Z1Wnk1amIyeHZjaTVtYjNKbFozSnZkVzVrSUNzZ0p6d3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RGeDBJQ2M4WkdsMklHTnNZWE56UFZ3aWJtOTBaUzFqYjJ4dmNpMXlaWE5sZEZ3aUlHUmhkR0V0WlhabGJuUTlYQ0ptYjNKbFEyOXNiM0pjSWlCa1lYUmhMWFpoYkhWbFBWd2lhVzVvWlhKcGRGd2lJSFJwZEd4bFBWd2lKeUFySUd4aGJtY3VZMjlzYjNJdWNtVnpaWFFnS3lBblhDSStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQnNZVzVuTG1OdmJHOXlMbkpsYzJWMFZHOUVaV1poZFd4MElDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkQ0FuUEM5a2FYWStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6eGthWFlnWTJ4aGMzTTlYQ0p1YjNSbExXTnZiRzl5TFhCaGJHVjBkR1ZjSWlCa1lYUmhMWFJoY21kbGRDMWxkbVZ1ZEQxY0ltWnZjbVZEYjJ4dmNsd2lQand2WkdsMlBpY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkQ0FnSUNjOEwyUnBkajRuSUN0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6d3ZiR2srSnlBclhHNWNkRngwWEhSY2RGeDBYSFJjZENBZ0lDYzhMM1ZzUGljN1hHNWNibHgwWEhSY2RGeDBkbUZ5SUcxdmNtVkNkWFIwYjI0Z1BTQjBjR3hDZFhSMGIyNG9KeWNzSUh0Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTVqYjJ4dmNpNXRiM0psTEZ4dVhIUmNkRngwWEhSY2RHUnliM0JrYjNkdU9pQmtjbTl3Wkc5M2JseHVYSFJjZEZ4MFhIUjlLVHRjYmx4dVhIUmNkRngwWEhSeVpYUjFjbTRnWTI5c2IzSkNkWFIwYjI0Z0t5QnRiM0psUW5WMGRHOXVPMXh1WEhSY2RGeDBmU3hjYmx4MFhIUmNkR0p2YkdRNklHWjFibU4wYVc5dUlDaHNZVzVuTENCdmNIUnBiMjV6S1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkaWIyeGtKeXdnZTF4dVhIUmNkRngwWEhSY2RHVjJaVzUwT2lBblltOXNaQ2NzWEc1Y2RGeDBYSFJjZEZ4MGRHbDBiR1U2SUd4aGJtY3VabTl1ZEM1aWIyeGtYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwZlN4Y2JseDBYSFJjZEdsMFlXeHBZem9nWm5WdVkzUnBiMjRnS0d4aGJtY3NJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSFJ3YkVsamIyNUNkWFIwYjI0b2IzQjBhVzl1Y3k1cFkyOXVVSEpsWm1sNElDc2dKMmwwWVd4cFl5Y3NJSHRjYmx4MFhIUmNkRngwWEhSbGRtVnVkRG9nSjJsMFlXeHBZeWNzWEc1Y2RGeDBYSFJjZEZ4MGRHbDBiR1U2SUd4aGJtY3VabTl1ZEM1cGRHRnNhV05jYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSOUxGeHVYSFJjZEZ4MGRXNWtaWEpzYVc1bE9pQm1kVzVqZEdsdmJpQW9iR0Z1Wnl3Z2IzQjBhVzl1Y3lrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RIQnNTV052YmtKMWRIUnZiaWh2Y0hScGIyNXpMbWxqYjI1UWNtVm1hWGdnS3lBbmRXNWtaWEpzYVc1bEp5d2dlMXh1WEhSY2RGeDBYSFJjZEdWMlpXNTBPaUFuZFc1a1pYSnNhVzVsSnl4Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTVtYjI1MExuVnVaR1Z5YkdsdVpWeHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkSDBzWEc1Y2RGeDBYSFJqYkdWaGNqb2dablZ1WTNScGIyNGdLR3hoYm1jc0lHOXdkR2x2Ym5NcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlIUndiRWxqYjI1Q2RYUjBiMjRvYjNCMGFXOXVjeTVwWTI5dVVISmxabWw0SUNzZ0oyVnlZWE5sY2ljc0lIdGNibHgwWEhSY2RGeDBYSFJsZG1WdWREb2dKM0psYlc5MlpVWnZjbTFoZENjc1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1Wm05dWRDNWpiR1ZoY2x4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RIMHNYRzVjZEZ4MFhIUjFiRG9nWm5WdVkzUnBiMjRnS0d4aGJtY3NJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSFJ3YkVsamIyNUNkWFIwYjI0b2IzQjBhVzl1Y3k1cFkyOXVVSEpsWm1sNElDc2dKMnhwYzNRdGRXd25MQ0I3WEc1Y2RGeDBYSFJjZEZ4MFpYWmxiblE2SUNkcGJuTmxjblJWYm05eVpHVnlaV1JNYVhOMEp5eGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1c2FYTjBjeTUxYm05eVpHVnlaV1JjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSOUxGeHVYSFJjZEZ4MGIydzZJR1oxYm1OMGFXOXVJQ2hzWVc1bkxDQnZjSFJwYjI1ektTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjBjR3hKWTI5dVFuVjBkRzl1S0c5d2RHbHZibk11YVdOdmJsQnlaV1pwZUNBcklDZHNhWE4wTFc5c0p5d2dlMXh1WEhSY2RGeDBYSFJjZEdWMlpXNTBPaUFuYVc1elpYSjBUM0prWlhKbFpFeHBjM1FuTEZ4dVhIUmNkRngwWEhSY2RIUnBkR3hsT2lCc1lXNW5MbXhwYzNSekxtOXlaR1Z5WldSY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUjlMRnh1WEhSY2RGeDBjR0Z5WVdkeVlYQm9PaUJtZFc1amRHbHZiaUFvYkdGdVp5d2diM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2JHVm1kRUoxZEhSdmJpQTlJSFJ3YkVsamIyNUNkWFIwYjI0b2IzQjBhVzl1Y3k1cFkyOXVVSEpsWm1sNElDc2dKMkZzYVdkdUxXeGxablFuTENCN1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1Y0dGeVlXZHlZWEJvTG14bFpuUXNYRzVjZEZ4MFhIUmNkRngwWlhabGJuUTZJQ2RxZFhOMGFXWjVUR1ZtZENkY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkSFpoY2lCalpXNTBaWEpDZFhSMGIyNGdQU0IwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2RoYkdsbmJpMWpaVzUwWlhJbkxDQjdYRzVjZEZ4MFhIUmNkRngwZEdsMGJHVTZJR3hoYm1jdWNHRnlZV2R5WVhCb0xtTmxiblJsY2l4Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZERvZ0oycDFjM1JwWm5sRFpXNTBaWEluWEc1Y2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MFhIUjJZWElnY21sbmFIUkNkWFIwYjI0Z1BTQjBjR3hKWTI5dVFuVjBkRzl1S0c5d2RHbHZibk11YVdOdmJsQnlaV1pwZUNBcklDZGhiR2xuYmkxeWFXZG9kQ2NzSUh0Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTV3WVhKaFozSmhjR2d1Y21sbmFIUXNYRzVjZEZ4MFhIUmNkRngwWlhabGJuUTZJQ2RxZFhOMGFXWjVVbWxuYUhRblhHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBYSFIyWVhJZ2FuVnpkR2xtZVVKMWRIUnZiaUE5SUhSd2JFbGpiMjVDZFhSMGIyNG9iM0IwYVc5dWN5NXBZMjl1VUhKbFptbDRJQ3NnSjJGc2FXZHVMV3AxYzNScFpua25MQ0I3WEc1Y2RGeDBYSFJjZEZ4MGRHbDBiR1U2SUd4aGJtY3VjR0Z5WVdkeVlYQm9MbXAxYzNScFpua3NYRzVjZEZ4MFhIUmNkRngwWlhabGJuUTZJQ2RxZFhOMGFXWjVSblZzYkNkY2JseDBYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkRngwZG1GeUlHOTFkR1JsYm5SQ2RYUjBiMjRnUFNCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkdmRYUmtaVzUwSnl3Z2UxeHVYSFJjZEZ4MFhIUmNkSFJwZEd4bE9pQnNZVzVuTG5CaGNtRm5jbUZ3YUM1dmRYUmtaVzUwTEZ4dVhIUmNkRngwWEhSY2RHVjJaVzUwT2lBbmIzVjBaR1Z1ZENkY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkSFpoY2lCcGJtUmxiblJDZFhSMGIyNGdQU0IwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2RwYm1SbGJuUW5MQ0I3WEc1Y2RGeDBYSFJjZEZ4MGRHbDBiR1U2SUd4aGJtY3VjR0Z5WVdkeVlYQm9MbWx1WkdWdWRDeGNibHgwWEhSY2RGeDBYSFJsZG1WdWREb2dKMmx1WkdWdWRDZGNibHgwWEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEZ4MGRtRnlJR1J5YjNCa2IzZHVJRDBnSnp4a2FYWWdZMnhoYzNNOVhDSmtjbTl3Wkc5M2JpMXRaVzUxWENJK0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBJQ2M4WkdsMklHTnNZWE56UFZ3aWJtOTBaUzFoYkdsbmJpQmlkRzR0WjNKdmRYQmNJajRuSUN0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQnNaV1owUW5WMGRHOXVJQ3NnWTJWdWRHVnlRblYwZEc5dUlDc2djbWxuYUhSQ2RYUjBiMjRnS3lCcWRYTjBhV1o1UW5WMGRHOXVJQ3RjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFFnSnp3dlpHbDJQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZENBblBHUnBkaUJqYkdGemN6MWNJbTV2ZEdVdGJHbHpkQ0JpZEc0dFozSnZkWEJjSWo0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0JwYm1SbGJuUkNkWFIwYjI0Z0t5QnZkWFJrWlc1MFFuVjBkRzl1SUN0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6d3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQW5QQzlrYVhZK0p6dGNibHh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkSEJzU1dOdmJrSjFkSFJ2YmlodmNIUnBiMjV6TG1samIyNVFjbVZtYVhnZ0t5QW5ZV3hwWjI0dGJHVm1kQ2NzSUh0Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTV3WVhKaFozSmhjR2d1Y0dGeVlXZHlZWEJvTEZ4dVhIUmNkRngwWEhSY2RHUnliM0JrYjNkdU9pQmtjbTl3Wkc5M2JseHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkSDBzWEc1Y2RGeDBYSFJvWldsbmFIUTZJR1oxYm1OMGFXOXVJQ2hzWVc1bkxDQnZjSFJwYjI1ektTQjdYRzVjZEZ4MFhIUmNkSFpoY2lCcGRHVnRjeUE5SUc5d2RHbHZibk11YkdsdVpVaGxhV2RvZEhNdWNtVmtkV05sS0daMWJtTjBhVzl1SUNodFpXMXZMQ0IyS1NCN1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlHMWxiVzhnS3lBblBHeHBQanhoSUdSaGRHRXRaWFpsYm5ROVhDSnNhVzVsU0dWcFoyaDBYQ0lnYUhKbFpqMWNJaU5jSWlCa1lYUmhMWFpoYkhWbFBWd2lKeUFySUhCaGNuTmxSbXh2WVhRb2Rpa2dLeUFuWENJK0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFFuUEdrZ1kyeGhjM005WENJbklDc2diM0IwYVc5dWN5NXBZMjl1VUhKbFptbDRJQ3NnSjJOb1pXTnJYQ0krUEM5cFBpQW5JQ3NnZGlBclhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MElDQW5QQzloUGp3dmJHaytKenRjYmx4MFhIUmNkRngwZlN3Z0p5Y3BPMXh1WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2QwWlhoMExXaGxhV2RvZENjc0lIdGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1bWIyNTBMbWhsYVdkb2RDeGNibHgwWEhSY2RGeDBYSFJrY205d1pHOTNiam9nSnp4MWJDQmpiR0Z6Y3oxY0ltUnliM0JrYjNkdUxXMWxiblZjSWo0bklDc2dhWFJsYlhNZ0t5QW5QQzkxYkQ0blhHNWNkRngwWEhSY2RIMHBPMXh1WEc1Y2RGeDBYSFI5TEZ4dVhIUmNkRngwYUdWc2NEb2dablZ1WTNScGIyNGdLR3hoYm1jc0lHOXdkR2x2Ym5NcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlIUndiRWxqYjI1Q2RYUjBiMjRvYjNCMGFXOXVjeTVwWTI5dVVISmxabWw0SUNzZ0ozRjFaWE4wYVc5dUp5d2dlMXh1WEhSY2RGeDBYSFJjZEdWMlpXNTBPaUFuYzJodmQwaGxiSEJFYVdGc2IyY25MRnh1WEhSY2RGeDBYSFJjZEhScGRHeGxPaUJzWVc1bkxtOXdkR2x2Ym5NdWFHVnNjQ3hjYmx4MFhIUmNkRngwWEhSb2FXUmxPaUIwY25WbFhHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBmU3hjYmx4MFhIUmNkR1oxYkd4elkzSmxaVzQ2SUdaMWJtTjBhVzl1SUNoc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2RoY25KdmQzTXRZV3gwSnl3Z2UxeHVYSFJjZEZ4MFhIUmNkR1YyWlc1ME9pQW5ablZzYkhOamNtVmxiaWNzWEc1Y2RGeDBYSFJjZEZ4MGRHbDBiR1U2SUd4aGJtY3ViM0IwYVc5dWN5NW1kV3hzYzJOeVpXVnVYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwZlN4Y2JseDBYSFJjZEdOdlpHVjJhV1YzT2lCbWRXNWpkR2x2YmlBb2JHRnVaeXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEhCc1NXTnZia0oxZEhSdmJpaHZjSFJwYjI1ekxtbGpiMjVRY21WbWFYZ2dLeUFuWTI5a1pTY3NJSHRjYmx4MFhIUmNkRngwWEhSbGRtVnVkRG9nSjJOdlpHVjJhV1YzSnl4Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTV2Y0hScGIyNXpMbU52WkdWMmFXVjNYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwZlN4Y2JseDBYSFJjZEhWdVpHODZJR1oxYm1OMGFXOXVJQ2hzWVc1bkxDQnZjSFJwYjI1ektTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjBjR3hKWTI5dVFuVjBkRzl1S0c5d2RHbHZibk11YVdOdmJsQnlaV1pwZUNBcklDZDFibVJ2Snl3Z2UxeHVYSFJjZEZ4MFhIUmNkR1YyWlc1ME9pQW5kVzVrYnljc1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1YUdsemRHOXllUzUxYm1SdlhHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBmU3hjYmx4MFhIUmNkSEpsWkc4NklHWjFibU4wYVc5dUlDaHNZVzVuTENCdmNIUnBiMjV6S1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkeVpYQmxZWFFuTENCN1hHNWNkRngwWEhSY2RGeDBaWFpsYm5RNklDZHlaV1J2Snl4Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTVvYVhOMGIzSjVMbkpsWkc5Y2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUjlMRnh1WEhSY2RGeDBhSEk2SUdaMWJtTjBhVzl1SUNoc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2R0YVc1MWN5Y3NJSHRjYmx4MFhIUmNkRngwWEhSbGRtVnVkRG9nSjJsdWMyVnlkRWh2Y21sNmIyNTBZV3hTZFd4bEp5eGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1b2NpNXBibk5sY25SY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUIwY0d4UWIzQnZkbVZ5Y3lBOUlHWjFibU4wYVc5dUlDaHNZVzVuTENCdmNIUnBiMjV6S1NCN1hHNWNkRngwWEhSMllYSWdkSEJzVEdsdWExQnZjRzkyWlhJZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQnNhVzVyUW5WMGRHOXVJRDBnZEhCc1NXTnZia0oxZEhSdmJpaHZjSFJwYjI1ekxtbGpiMjVRY21WbWFYZ2dLeUFuWldScGRDY3NJSHRjYmx4MFhIUmNkRngwWEhSMGFYUnNaVG9nYkdGdVp5NXNhVzVyTG1Wa2FYUXNYRzVjZEZ4MFhIUmNkRngwWlhabGJuUTZJQ2R6YUc5M1RHbHVhMFJwWVd4dlp5Y3NYRzVjZEZ4MFhIUmNkRngwYUdsa1pUb2dkSEoxWlZ4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RGeDBkbUZ5SUhWdWJHbHVhMEoxZEhSdmJpQTlJSFJ3YkVsamIyNUNkWFIwYjI0b2IzQjBhVzl1Y3k1cFkyOXVVSEpsWm1sNElDc2dKM1Z1YkdsdWF5Y3NJSHRjYmx4MFhIUmNkRngwWEhSMGFYUnNaVG9nYkdGdVp5NXNhVzVyTG5WdWJHbHVheXhjYmx4MFhIUmNkRngwWEhSbGRtVnVkRG9nSjNWdWJHbHVheWRjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSY2RIWmhjaUJqYjI1MFpXNTBJRDBnSnp4aElHaHlaV1k5WENKb2RIUndPaTh2ZDNkM0xtZHZiMmRzWlM1amIyMWNJaUIwWVhKblpYUTlYQ0pmWW14aGJtdGNJajUzZDNjdVoyOXZaMnhsTG1OdmJUd3ZZVDRtYm1KemNEc21ibUp6Y0RzbklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MElDQW5QR1JwZGlCamJHRnpjejFjSW01dmRHVXRhVzV6WlhKMElHSjBiaTFuY205MWNGd2lQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEd4cGJtdENkWFIwYjI0Z0t5QjFibXhwYm10Q2RYUjBiMjRnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFFnSUNjOEwyUnBkajRuTzF4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEhCc1VHOXdiM1psY2lnbmJtOTBaUzFzYVc1ckxYQnZjRzkyWlhJbkxDQmpiMjUwWlc1MEtUdGNibHgwWEhSY2RIMDdYRzVjYmx4MFhIUmNkSFpoY2lCMGNHeEpiV0ZuWlZCdmNHOTJaWElnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkSFpoY2lCbWRXeHNRblYwZEc5dUlEMGdkSEJzUW5WMGRHOXVLQ2M4YzNCaGJpQmpiR0Z6Y3oxY0ltNXZkR1V0Wm05dWRITnBlbVV0TVRCY0lqNHhNREFsUEM5emNHRnVQaWNzSUh0Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTVwYldGblpTNXlaWE5wZW1WR2RXeHNMRnh1WEhSY2RGeDBYSFJjZEdWMlpXNTBPaUFuY21WemFYcGxKeXhjYmx4MFhIUmNkRngwWEhSMllXeDFaVG9nSnpFblhHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBYSFIyWVhJZ2FHRnNaa0oxZEhSdmJpQTlJSFJ3YkVKMWRIUnZiaWduUEhOd1lXNGdZMnhoYzNNOVhDSnViM1JsTFdadmJuUnphWHBsTFRFd1hDSStOVEFsUEM5emNHRnVQaWNzSUh0Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTVwYldGblpTNXlaWE5wZW1WSVlXeG1MRnh1WEhSY2RGeDBYSFJjZEdWMlpXNTBPaUFuY21WemFYcGxKeXhjYmx4MFhIUmNkRngwWEhSMllXeDFaVG9nSnpBdU5TZGNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJjZEhaaGNpQnhkV0Z5ZEdWeVFuVjBkRzl1SUQwZ2RIQnNRblYwZEc5dUtDYzhjM0JoYmlCamJHRnpjejFjSW01dmRHVXRabTl1ZEhOcGVtVXRNVEJjSWo0eU5TVThMM053WVc0K0p5d2dlMXh1WEhSY2RGeDBYSFJjZEhScGRHeGxPaUJzWVc1bkxtbHRZV2RsTG5KbGMybDZaVkYxWVhKMFpYSXNYRzVjZEZ4MFhIUmNkRngwWlhabGJuUTZJQ2R5WlhOcGVtVW5MRnh1WEhSY2RGeDBYSFJjZEhaaGJIVmxPaUFuTUM0eU5TZGNibHgwWEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEZ4MGRtRnlJR3hsWm5SQ2RYUjBiMjRnUFNCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkaGJHbG5iaTFzWldaMEp5d2dlMXh1WEhSY2RGeDBYSFJjZEhScGRHeGxPaUJzWVc1bkxtbHRZV2RsTG1ac2IyRjBUR1ZtZEN4Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZERvZ0oyWnNiMkYwVFdVbkxGeHVYSFJjZEZ4MFhIUmNkSFpoYkhWbE9pQW5iR1ZtZENkY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkSFpoY2lCeWFXZG9kRUoxZEhSdmJpQTlJSFJ3YkVsamIyNUNkWFIwYjI0b2IzQjBhVzl1Y3k1cFkyOXVVSEpsWm1sNElDc2dKMkZzYVdkdUxYSnBaMmgwSnl3Z2UxeHVYSFJjZEZ4MFhIUmNkSFJwZEd4bE9pQnNZVzVuTG1sdFlXZGxMbVpzYjJGMFVtbG5hSFFzWEc1Y2RGeDBYSFJjZEZ4MFpYWmxiblE2SUNkbWJHOWhkRTFsSnl4Y2JseDBYSFJjZEZ4MFhIUjJZV3gxWlRvZ0ozSnBaMmgwSjF4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RGeDBkbUZ5SUdwMWMzUnBabmxDZFhSMGIyNGdQU0IwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2RoYkdsbmJpMXFkWE4wYVdaNUp5d2dlMXh1WEhSY2RGeDBYSFJjZEhScGRHeGxPaUJzWVc1bkxtbHRZV2RsTG1ac2IyRjBUbTl1WlN4Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZERvZ0oyWnNiMkYwVFdVbkxGeHVYSFJjZEZ4MFhIUmNkSFpoYkhWbE9pQW5ibTl1WlNkY2JseDBYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkRngwZG1GeUlISnZkVzVrWldSQ2RYUjBiMjRnUFNCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkemNYVmhjbVVuTENCN1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1YVcxaFoyVXVjMmhoY0dWU2IzVnVaR1ZrTEZ4dVhIUmNkRngwWEhSY2RHVjJaVzUwT2lBbmFXMWhaMlZUYUdGd1pTY3NYRzVjZEZ4MFhIUmNkRngwZG1Gc2RXVTZJQ2RwYldjdGNtOTFibVJsWkNkY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkSFpoY2lCamFYSmpiR1ZDZFhSMGIyNGdQU0IwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2RqYVhKamJHVXRieWNzSUh0Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTVwYldGblpTNXphR0Z3WlVOcGNtTnNaU3hjYmx4MFhIUmNkRngwWEhSbGRtVnVkRG9nSjJsdFlXZGxVMmhoY0dVbkxGeHVYSFJjZEZ4MFhIUmNkSFpoYkhWbE9pQW5hVzFuTFdOcGNtTnNaU2RjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSY2RIWmhjaUIwYUhWdFltNWhhV3hDZFhSMGIyNGdQU0IwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2R3YVdOMGRYSmxMVzhuTENCN1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1YVcxaFoyVXVjMmhoY0dWVWFIVnRZbTVoYVd3c1hHNWNkRngwWEhSY2RGeDBaWFpsYm5RNklDZHBiV0ZuWlZOb1lYQmxKeXhjYmx4MFhIUmNkRngwWEhSMllXeDFaVG9nSjJsdFp5MTBhSFZ0WW01aGFXd25YRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwWEhSMllYSWdibTl1WlVKMWRIUnZiaUE5SUhSd2JFbGpiMjVDZFhSMGIyNG9iM0IwYVc5dWN5NXBZMjl1VUhKbFptbDRJQ3NnSjNScGJXVnpKeXdnZTF4dVhIUmNkRngwWEhSY2RIUnBkR3hsT2lCc1lXNW5MbWx0WVdkbExuTm9ZWEJsVG05dVpTeGNibHgwWEhSY2RGeDBYSFJsZG1WdWREb2dKMmx0WVdkbFUyaGhjR1VuTEZ4dVhIUmNkRngwWEhSY2RIWmhiSFZsT2lBbkoxeHVYSFJjZEZ4MFhIUjlLVHRjYmx4dVhIUmNkRngwWEhSMllYSWdjbVZ0YjNabFFuVjBkRzl1SUQwZ2RIQnNTV052YmtKMWRIUnZiaWh2Y0hScGIyNXpMbWxqYjI1UWNtVm1hWGdnS3lBbmRISmhjMmd0Ynljc0lIdGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1cGJXRm5aUzV5WlcxdmRtVXNYRzVjZEZ4MFhIUmNkRngwWlhabGJuUTZJQ2R5WlcxdmRtVk5aV1JwWVNjc1hHNWNkRngwWEhSY2RGeDBkbUZzZFdVNklDZHViMjVsSjF4dVhIUmNkRngwWEhSOUtUdGNibHh1WEhSY2RGeDBYSFIyWVhJZ1kyOXVkR1Z1ZENBOUlDYzhaR2wySUdOc1lYTnpQVndpWW5SdUxXZHliM1Z3WENJK0p5QXJJR1oxYkd4Q2RYUjBiMjRnS3lCb1lXeG1RblYwZEc5dUlDc2djWFZoY25SbGNrSjFkSFJ2YmlBcklDYzhMMlJwZGo0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MElDQW5QR1JwZGlCamJHRnpjejFjSW1KMGJpMW5jbTkxY0Z3aVBpY2dLeUJzWldaMFFuVjBkRzl1SUNzZ2NtbG5hSFJDZFhSMGIyNGdLeUJxZFhOMGFXWjVRblYwZEc5dUlDc2dKend2WkdsMlBpY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ2M4WkdsMklHTnNZWE56UFZ3aVluUnVMV2R5YjNWd1hDSStKeUFySUhKdmRXNWtaV1JDZFhSMGIyNGdLeUJqYVhKamJHVkNkWFIwYjI0Z0t5QjBhSFZ0WW01aGFXeENkWFIwYjI0Z0t5QnViMjVsUW5WMGRHOXVJQ3NnSnp3dlpHbDJQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFFnSUNjOFpHbDJJR05zWVhOelBWd2lZblJ1TFdkeWIzVndYQ0krSnlBcklISmxiVzkyWlVKMWRIUnZiaUFySUNjOEwyUnBkajRuTzF4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEhCc1VHOXdiM1psY2lnbmJtOTBaUzFwYldGblpTMXdiM0J2ZG1WeUp5d2dZMjl1ZEdWdWRDazdYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFIyWVhJZ2RIQnNRV2x5VUc5d2IzWmxjaUE5SUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBkbUZ5SUNSamIyNTBaVzUwSUQwZ0pDZ25QR1JwZGlBdlBpY3BPMXh1WEhSY2RGeDBYSFJtYjNJZ0tIWmhjaUJwWkhnZ1BTQXdMQ0JzWlc0Z1BTQnZjSFJwYjI1ekxtRnBjbEJ2Y0c5MlpYSXViR1Z1WjNSb095QnBaSGdnUENCc1pXNDdJR2xrZUNzcktTQjdYRzVjZEZ4MFhIUmNkRngwZG1GeUlHZHliM1Z3SUQwZ2IzQjBhVzl1Y3k1aGFYSlFiM0J2ZG1WeVcybGtlRjA3WEc1Y2JseDBYSFJjZEZ4MFhIUjJZWElnSkdkeWIzVndJRDBnSkNnblBHUnBkaUJqYkdGemN6MWNJbTV2ZEdVdEp5QXJJR2R5YjNWd1d6QmRJQ3NnSnlCaWRHNHRaM0p2ZFhCY0lqNG5LVHRjYmx4MFhIUmNkRngwWEhSbWIzSWdLSFpoY2lCcElEMGdNQ3dnYkdWdVIzSnZkWEFnUFNCbmNtOTFjRnN4WFM1c1pXNW5kR2c3SUdrZ1BDQnNaVzVIY205MWNEc2dhU3NyS1NCN1hHNWNkRngwWEhSY2RGeDBYSFIyWVhJZ0pHSjFkSFJ2YmlBOUlDUW9kSEJzUW5WMGRHOXVTVzVtYjF0bmNtOTFjRnN4WFZ0cFhWMG9iR0Z1Wnl3Z2IzQjBhVzl1Y3lrcE8xeHVYRzVjZEZ4MFhIUmNkRngwWEhRa1luVjBkRzl1TG1GMGRISW9KMlJoZEdFdGJtRnRaU2NzSUdkeWIzVndXekZkVzJsZEtUdGNibHh1WEhSY2RGeDBYSFJjZEZ4MEpHZHliM1Z3TG1Gd2NHVnVaQ2drWW5WMGRHOXVLVHRjYmx4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBKR052Ym5SbGJuUXVZWEJ3Wlc1a0tDUm5jbTkxY0NrN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkSEJzVUc5d2IzWmxjaWduYm05MFpTMWhhWEl0Y0c5d2IzWmxjaWNzSUNSamIyNTBaVzUwTG1Ob2FXeGtjbVZ1S0NrcE8xeHVYSFJjZEZ4MGZUdGNibHh1WEhSY2RGeDBkbUZ5SUNSdWIzUmxVRzl3YjNabGNpQTlJQ1FvSnp4a2FYWWdZMnhoYzNNOVhDSnViM1JsTFhCdmNHOTJaWEpjSWlBdlBpY3BPMXh1WEc1Y2RGeDBYSFFrYm05MFpWQnZjRzkyWlhJdVlYQndaVzVrS0hSd2JFeHBibXRRYjNCdmRtVnlLQ2twTzF4dVhIUmNkRngwSkc1dmRHVlFiM0J2ZG1WeUxtRndjR1Z1WkNoMGNHeEpiV0ZuWlZCdmNHOTJaWElvS1NrN1hHNWNibHgwWEhSY2RHbG1JQ2h2Y0hScGIyNXpMbUZwY2sxdlpHVXBJSHRjYmx4MFhIUmNkRngwSkc1dmRHVlFiM0J2ZG1WeUxtRndjR1Z1WkNoMGNHeEJhWEpRYjNCdmRtVnlLQ2twTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSeVpYUjFjbTRnSkc1dmRHVlFiM0J2ZG1WeU8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdkSEJzU0dGdVpHeGxjeUE5SUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RISmxkSFZ5YmlBblBHUnBkaUJqYkdGemN6MWNJbTV2ZEdVdGFHRnVaR3hsWENJK0p5QXJYRzVjZEZ4MFhIUmNkRngwSUNjOFpHbDJJR05zWVhOelBWd2libTkwWlMxamIyNTBjbTlzTFhObGJHVmpkR2x2Ymx3aVBpY2dLMXh1WEhSY2RGeDBYSFJjZENBZ0lDYzhaR2wySUdOc1lYTnpQVndpYm05MFpTMWpiMjUwY205c0xYTmxiR1ZqZEdsdmJpMWlaMXdpUGp3dlpHbDJQaWNnSzF4dVhIUmNkRngwWEhSY2RDQWdJQ2M4WkdsMklHTnNZWE56UFZ3aWJtOTBaUzFqYjI1MGNtOXNMV2h2YkdSbGNpQnViM1JsTFdOdmJuUnliMnd0Ym5kY0lqNDhMMlJwZGo0bklDdGNibHgwWEhSY2RGeDBYSFFnSUNBblBHUnBkaUJqYkdGemN6MWNJbTV2ZEdVdFkyOXVkSEp2YkMxb2IyeGtaWElnYm05MFpTMWpiMjUwY205c0xXNWxYQ0krUEM5a2FYWStKeUFyWEc1Y2RGeDBYSFJjZEZ4MElDQWdKenhrYVhZZ1kyeGhjM005WENKdWIzUmxMV052Ym5SeWIyd3RhRzlzWkdWeUlHNXZkR1V0WTI5dWRISnZiQzF6ZDF3aVBqd3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkQ0FnSUNjOFpHbDJJR05zWVhOelBWd2libTkwWlMxamIyNTBjbTlzTFhOcGVtbHVaeUJ1YjNSbExXTnZiblJ5YjJ3dGMyVmNJajQ4TDJScGRqNG5JQ3RjYmx4MFhIUmNkRngwWEhRZ0lDQW5QR1JwZGlCamJHRnpjejFjSW01dmRHVXRZMjl1ZEhKdmJDMXpaV3hsWTNScGIyNHRhVzVtYjF3aVBqd3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkQ0FuUEM5a2FYWStKeUFyWEc1Y2RGeDBYSFJjZENBZ0lDYzhMMlJwZGo0bk8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnphRzl5ZEdOMWRDQjBZV0pzWlNCMFpXMXdiR0YwWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0IwYVhSc1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCaWIyUjVYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJSFJ3YkZOb2IzSjBZM1YwSUQwZ1puVnVZM1JwYjI0Z0tIUnBkR3hsTENCclpYbHpLU0I3WEc1Y2RGeDBYSFIyWVhJZ2EyVjVRMnhoYzNNZ1BTQW5ibTkwWlMxemFHOXlkR04xZEMxamIyd2dZMjlzTFhoekxUWWdibTkwWlMxemFHOXlkR04xZEMwbk8xeHVYSFJjZEZ4MGRtRnlJR0p2WkhrZ1BTQmJYVHRjYmx4dVhIUmNkRngwWm05eUlDaDJZWElnYVNCcGJpQnJaWGx6S1NCN1hHNWNkRngwWEhSY2RHbG1JQ2hyWlhsekxtaGhjMDkzYmxCeWIzQmxjblI1S0drcEtTQjdYRzVjZEZ4MFhIUmNkRngwWW05a2VTNXdkWE5vS0Z4dVhIUmNkRngwWEhSY2RDQWdKenhrYVhZZ1kyeGhjM005WENJbklDc2dhMlY1UTJ4aGMzTWdLeUFuYTJWNVhDSStKeUFySUd0bGVYTmJhVjB1YTJKa0lDc2dKend2WkdsMlBpY2dLMXh1WEhSY2RGeDBYSFJjZENBZ0p6eGthWFlnWTJ4aGMzTTlYQ0luSUNzZ2EyVjVRMnhoYzNNZ0t5QW5ibUZ0WlZ3aVBpY2dLeUJyWlhselcybGRMblJsZUhRZ0t5QW5QQzlrYVhZK0oxeHVYSFJjZEZ4MFhIUmNkQ0FnS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUnlaWFIxY200Z0p6eGthWFlnWTJ4aGMzTTlYQ0p1YjNSbExYTm9iM0owWTNWMExYSnZkeUJ5YjNkY0lqNDhaR2wySUdOc1lYTnpQVndpSnlBcklHdGxlVU5zWVhOeklDc2dKM1JwZEd4bElHTnZiQzE0Y3kxdlptWnpaWFF0Tmx3aVBpY2dLeUIwYVhSc1pTQXJJQ2M4TDJScGRqNDhMMlJwZGo0bklDdGNibHgwWEhSY2RGeDBJQ0FnSnp4a2FYWWdZMnhoYzNNOVhDSnViM1JsTFhOb2IzSjBZM1YwTFhKdmR5QnliM2RjSWo0bklDc2dZbTlrZVM1cWIybHVLQ2M4TDJScGRqNDhaR2wySUdOc1lYTnpQVndpYm05MFpTMXphRzl5ZEdOMWRDMXliM2NnY205M1hDSStKeWtnS3lBblBDOWthWFkrSnp0Y2JseDBYSFI5TzF4dVhHNWNkRngwZG1GeUlIUndiRk5vYjNKMFkzVjBWR1Y0ZENBOUlHWjFibU4wYVc5dUlDaHNZVzVuS1NCN1hHNWNkRngwWEhSMllYSWdhMlY1Y3lBOUlGdGNibHgwWEhSY2RDQWdleUJyWW1RNklDZmlqSmdnS3lCQ0p5d2dkR1Y0ZERvZ2JHRnVaeTVtYjI1MExtSnZiR1FnZlN4Y2JseDBYSFJjZENBZ2V5QnJZbVE2SUNmaWpKZ2dLeUJKSnl3Z2RHVjRkRG9nYkdGdVp5NW1iMjUwTG1sMFlXeHBZeUI5TEZ4dVhIUmNkRngwSUNCN0lHdGlaRG9nSitLTW1DQXJJRlVuTENCMFpYaDBPaUJzWVc1bkxtWnZiblF1ZFc1a1pYSnNhVzVsSUgwc1hHNWNkRngwWEhRZ0lIc2dhMkprT2lBbjRveVlJQ3NnWEZ4Y1hDY3NJSFJsZUhRNklHeGhibWN1Wm05dWRDNWpiR1ZoY2lCOVhHNWNkRngwWEhSZE8xeHVYRzVjZEZ4MFhIUnlaWFIxY200Z2RIQnNVMmh2Y25SamRYUW9iR0Z1Wnk1emFHOXlkR04xZEM1MFpYaDBSbTl5YldGMGRHbHVaeXdnYTJWNWN5azdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUIwY0d4VGFHOXlkR04xZEVGamRHbHZiaUE5SUdaMWJtTjBhVzl1SUNoc1lXNW5LU0I3WEc1Y2RGeDBYSFIyWVhJZ2EyVjVjeUE5SUZ0Y2JseDBYSFJjZENBZ2V5QnJZbVE2SUNmaWpKZ2dLeUJhSnl3Z2RHVjRkRG9nYkdGdVp5NW9hWE4wYjNKNUxuVnVaRzhnZlN4Y2JseDBYSFJjZENBZ2V5QnJZbVE2SUNmaWpKZ2dLeURpaDZjZ0t5QmFKeXdnZEdWNGREb2diR0Z1Wnk1b2FYTjBiM0o1TG5KbFpHOGdmU3hjYmx4MFhIUmNkQ0FnZXlCclltUTZJQ2ZpakpnZ0t5QmRKeXdnZEdWNGREb2diR0Z1Wnk1d1lYSmhaM0poY0dndWFXNWtaVzUwSUgwc1hHNWNkRngwWEhRZ0lIc2dhMkprT2lBbjRveVlJQ3NnV3ljc0lIUmxlSFE2SUd4aGJtY3VjR0Z5WVdkeVlYQm9MbTkxZEdSbGJuUWdmU3hjYmx4MFhIUmNkQ0FnZXlCclltUTZJQ2ZpakpnZ0t5QkZUbFJGVWljc0lIUmxlSFE2SUd4aGJtY3VhSEl1YVc1elpYSjBJSDFjYmx4MFhIUmNkRjA3WEc1Y2JseDBYSFJjZEhKbGRIVnliaUIwY0d4VGFHOXlkR04xZENoc1lXNW5Mbk5vYjNKMFkzVjBMbUZqZEdsdmJpd2dhMlY1Y3lrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQjBjR3hUYUc5eWRHTjFkRkJoY21FZ1BTQm1kVzVqZEdsdmJpQW9iR0Z1WnlrZ2UxeHVYSFJjZEZ4MGRtRnlJR3RsZVhNZ1BTQmJYRzVjZEZ4MFhIUWdJSHNnYTJKa09pQW40b3lZSUNzZzRvZW5JQ3NnVENjc0lIUmxlSFE2SUd4aGJtY3VjR0Z5WVdkeVlYQm9MbXhsWm5RZ2ZTeGNibHgwWEhSY2RDQWdleUJyWW1RNklDZmlqSmdnS3lEaWg2Y2dLeUJGSnl3Z2RHVjRkRG9nYkdGdVp5NXdZWEpoWjNKaGNHZ3VZMlZ1ZEdWeUlIMHNYRzVjZEZ4MFhIUWdJSHNnYTJKa09pQW40b3lZSUNzZzRvZW5JQ3NnVWljc0lIUmxlSFE2SUd4aGJtY3VjR0Z5WVdkeVlYQm9MbkpwWjJoMElIMHNYRzVjZEZ4MFhIUWdJSHNnYTJKa09pQW40b3lZSUNzZzRvZW5JQ3NnU2ljc0lIUmxlSFE2SUd4aGJtY3VjR0Z5WVdkeVlYQm9MbXAxYzNScFpua2dmU3hjYmx4MFhIUmNkQ0FnZXlCclltUTZJQ2ZpakpnZ0t5RGloNmNnS3lCT1ZVMDNKeXdnZEdWNGREb2diR0Z1Wnk1c2FYTjBjeTV2Y21SbGNtVmtJSDBzWEc1Y2RGeDBYSFFnSUhzZ2EySmtPaUFuNG95WUlDc2c0b2VuSUNzZ1RsVk5PQ2NzSUhSbGVIUTZJR3hoYm1jdWJHbHpkSE11ZFc1dmNtUmxjbVZrSUgxY2JseDBYSFJjZEYwN1hHNWNibHgwWEhSY2RISmxkSFZ5YmlCMGNHeFRhRzl5ZEdOMWRDaHNZVzVuTG5Ob2IzSjBZM1YwTG5CaGNtRm5jbUZ3YUVadmNtMWhkSFJwYm1jc0lHdGxlWE1wTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFIyWVhJZ2RIQnNVMmh2Y25SamRYUlRkSGxzWlNBOUlHWjFibU4wYVc5dUlDaHNZVzVuS1NCN1hHNWNkRngwWEhSMllYSWdhMlY1Y3lBOUlGdGNibHgwWEhSY2RDQWdleUJyWW1RNklDZmlqSmdnS3lCT1ZVMHdKeXdnZEdWNGREb2diR0Z1Wnk1emRIbHNaUzV1YjNKdFlXd2dmU3hjYmx4MFhIUmNkQ0FnZXlCclltUTZJQ2ZpakpnZ0t5Qk9WVTB4Snl3Z2RHVjRkRG9nYkdGdVp5NXpkSGxzWlM1b01TQjlMRnh1WEhSY2RGeDBJQ0I3SUd0aVpEb2dKK0tNbUNBcklFNVZUVEluTENCMFpYaDBPaUJzWVc1bkxuTjBlV3hsTG1neUlIMHNYRzVjZEZ4MFhIUWdJSHNnYTJKa09pQW40b3lZSUNzZ1RsVk5NeWNzSUhSbGVIUTZJR3hoYm1jdWMzUjViR1V1YURNZ2ZTeGNibHgwWEhSY2RDQWdleUJyWW1RNklDZmlqSmdnS3lCT1ZVMDBKeXdnZEdWNGREb2diR0Z1Wnk1emRIbHNaUzVvTkNCOUxGeHVYSFJjZEZ4MElDQjdJR3RpWkRvZ0orS01tQ0FySUU1VlRUVW5MQ0IwWlhoME9pQnNZVzVuTG5OMGVXeGxMbWcxSUgwc1hHNWNkRngwWEhRZ0lIc2dhMkprT2lBbjRveVlJQ3NnVGxWTk5pY3NJSFJsZUhRNklHeGhibWN1YzNSNWJHVXVhRFlnZlZ4dVhIUmNkRngwWFR0Y2JseHVYSFJjZEZ4MGNtVjBkWEp1SUhSd2JGTm9iM0owWTNWMEtHeGhibWN1YzJodmNuUmpkWFF1Wkc5amRXMWxiblJUZEhsc1pTd2dhMlY1Y3lrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQjBjR3hGZUhSeVlWTm9iM0owWTNWMGN5QTlJR1oxYm1OMGFXOXVJQ2hzWVc1bkxDQnZjSFJwYjI1ektTQjdYRzVjZEZ4MFhIUjJZWElnWlhoMGNtRkxaWGx6SUQwZ2IzQjBhVzl1Y3k1bGVIUnlZVXRsZVhNN1hHNWNkRngwWEhSMllYSWdhMlY1Y3lBOUlGdGRPMXh1WEc1Y2RGeDBYSFJtYjNJZ0tIWmhjaUJyWlhrZ2FXNGdaWGgwY21GTFpYbHpLU0I3WEc1Y2RGeDBYSFJjZEdsbUlDaGxlSFJ5WVV0bGVYTXVhR0Z6VDNkdVVISnZjR1Z5ZEhrb2EyVjVLU2tnZTF4dVhIUmNkRngwWEhSY2RHdGxlWE11Y0hWemFDaDdJR3RpWkRvZ2EyVjVMQ0IwWlhoME9pQmxlSFJ5WVV0bGVYTmJhMlY1WFNCOUtUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJ5WlhSMWNtNGdkSEJzVTJodmNuUmpkWFFvYkdGdVp5NXphRzl5ZEdOMWRDNWxlSFJ5WVV0bGVYTXNJR3RsZVhNcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdkSEJzVTJodmNuUmpkWFJVWVdKc1pTQTlJR1oxYm1OMGFXOXVJQ2hzWVc1bkxDQnZjSFJwYjI1ektTQjdYRzVjZEZ4MFhIUjJZWElnWTI5c1EyeGhjM01nUFNBblkyeGhjM005WENKdWIzUmxMWE5vYjNKMFkzVjBJRzV2ZEdVdGMyaHZjblJqZFhRdFkyOXNJR052YkMxemJTMDJJR052YkMxNGN5MHhNbHdpSnp0Y2JseDBYSFJjZEhaaGNpQjBaVzF3YkdGMFpTQTlJRnRjYmx4MFhIUmNkQ0FnSnp4a2FYWWdKeUFySUdOdmJFTnNZWE56SUNzZ0p6NG5JQ3NnZEhCc1UyaHZjblJqZFhSQlkzUnBiMjRvYkdGdVp5d2diM0IwYVc5dWN5a2dLeUFuUEM5a2FYWStKeUFyWEc1Y2RGeDBYSFFnSUNjOFpHbDJJQ2NnS3lCamIyeERiR0Z6Y3lBcklDYytKeUFySUhSd2JGTm9iM0owWTNWMFZHVjRkQ2hzWVc1bkxDQnZjSFJwYjI1ektTQXJJQ2M4TDJScGRqNG5MRnh1WEhSY2RGeDBJQ0FuUEdScGRpQW5JQ3NnWTI5c1EyeGhjM01nS3lBblBpY2dLeUIwY0d4VGFHOXlkR04xZEZOMGVXeGxLR3hoYm1jc0lHOXdkR2x2Ym5NcElDc2dKend2WkdsMlBpY2dLMXh1WEhSY2RGeDBJQ0FuUEdScGRpQW5JQ3NnWTI5c1EyeGhjM01nS3lBblBpY2dLeUIwY0d4VGFHOXlkR04xZEZCaGNtRW9iR0Z1Wnl3Z2IzQjBhVzl1Y3lrZ0t5QW5QQzlrYVhZK0oxeHVYSFJjZEZ4MFhUdGNibHh1WEhSY2RGeDBhV1lnS0c5d2RHbHZibk11WlhoMGNtRkxaWGx6S1NCN1hHNWNkRngwWEhSY2RIUmxiWEJzWVhSbExuQjFjMmdvSnp4a2FYWWdKeUFySUdOdmJFTnNZWE56SUNzZ0p6NG5JQ3NnZEhCc1JYaDBjbUZUYUc5eWRHTjFkSE1vYkdGdVp5d2diM0IwYVc5dWN5a2dLeUFuUEM5a2FYWStKeWs3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEhKbGRIVnliaUFuUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0YzJodmNuUmpkWFF0Y205M0lISnZkMXdpUGljZ0sxeHVYSFJjZEZ4MFhIUmNkQ0IwWlcxd2JHRjBaUzVxYjJsdUtDYzhMMlJwZGo0OFpHbDJJR05zWVhOelBWd2libTkwWlMxemFHOXlkR04xZEMxeWIzY2djbTkzWENJK0p5a2dLMXh1WEhSY2RGeDBYSFFnSUNBblBDOWthWFkrSnp0Y2JseDBYSFI5TzF4dVhHNWNkRngwZG1GeUlISmxjR3hoWTJWTllXTkxaWGx6SUQwZ1puVnVZM1JwYjI0Z0tITklkRzFzS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnYzBoMGJXd3VjbVZ3YkdGalpTZ3Y0b3lZTDJjc0lDZERkSEpzSnlrdWNtVndiR0ZqWlNndjRvZW5MMmNzSUNkVGFHbG1kQ2NwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFIyWVhJZ2RIQnNSR2xoYkc5blNXNW1ieUE5SUh0Y2JseDBYSFJjZEdsdFlXZGxPaUJtZFc1amRHbHZiaUFvYkdGdVp5d2diM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2FXMWhaMlZNYVcxcGRHRjBhVzl1SUQwZ0p5YzdYRzVjZEZ4MFhIUmNkR2xtSUNodmNIUnBiMjV6TG0xaGVHbHRkVzFKYldGblpVWnBiR1ZUYVhwbEtTQjdYRzVjZEZ4MFhIUmNkRngwZG1GeUlIVnVhWFFnUFNCTllYUm9MbVpzYjI5eUtFMWhkR2d1Ykc5bktHOXdkR2x2Ym5NdWJXRjRhVzExYlVsdFlXZGxSbWxzWlZOcGVtVXBJQzhnVFdGMGFDNXNiMmNvTVRBeU5Da3BPMXh1WEhSY2RGeDBYSFJjZEhaaGNpQnlaV0ZrWVdKc1pWTnBlbVVnUFNBb2IzQjBhVzl1Y3k1dFlYaHBiWFZ0U1cxaFoyVkdhV3hsVTJsNlpTQXZJRTFoZEdndWNHOTNLREV3TWpRc0lIVnVhWFFwS1M1MGIwWnBlR1ZrS0RJcElDb2dNU0FyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQW5JQ2NnS3lBbklFdE5SMVJRSjF0MWJtbDBYU0FySUNkQ0p6dGNibHgwWEhSY2RGeDBYSFJwYldGblpVeHBiV2wwWVhScGIyNGdQU0FuUEhOdFlXeHNQaWNnS3lCc1lXNW5MbWx0WVdkbExtMWhlR2x0ZFcxR2FXeGxVMmw2WlNBcklDY2dPaUFuSUNzZ2NtVmhaR0ZpYkdWVGFYcGxJQ3NnSnp3dmMyMWhiR3crSnp0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkSFpoY2lCaWIyUjVJRDBnSnp4a2FYWWdZMnhoYzNNOVhDSm1iM0p0TFdkeWIzVndJSEp2ZHkxbWJIVnBaQ0J1YjNSbExXZHliM1Z3TFhObGJHVmpkQzFtY205dExXWnBiR1Z6WENJK0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhSY2RDQW5QR3hoWW1Wc1BpY2dLeUJzWVc1bkxtbHRZV2RsTG5ObGJHVmpkRVp5YjIxR2FXeGxjeUFySUNjOEwyeGhZbVZzUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6eHBibkIxZENCamJHRnpjejFjSW01dmRHVXRhVzFoWjJVdGFXNXdkWFJjSWlCMGVYQmxQVndpWm1sc1pWd2lJRzVoYldVOVhDSm1hV3hsYzF3aUlHRmpZMlZ3ZEQxY0ltbHRZV2RsTHlwY0lpQnRkV3gwYVhCc1pUMWNJbTExYkhScGNHeGxYQ0lnTHo0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MElHbHRZV2RsVEdsdGFYUmhkR2x2YmlBclhHNWNkRngwWEhSY2RGeDBYSFFnSUNBblBDOWthWFkrSnlBclhHNWNkRngwWEhSY2RGeDBYSFFnSUNBblBHUnBkaUJqYkdGemN6MWNJbVp2Y20wdFozSnZkWEFnY205M0xXWnNkV2xrWENJK0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhSY2RDQW5QR3hoWW1Wc1BpY2dLeUJzWVc1bkxtbHRZV2RsTG5WeWJDQXJJQ2M4TDJ4aFltVnNQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFFnSnp4cGJuQjFkQ0JqYkdGemN6MWNJbTV2ZEdVdGFXMWhaMlV0ZFhKc0lHWnZjbTB0WTI5dWRISnZiQ0J6Y0dGdU1USmNJaUIwZVhCbFBWd2lkR1Y0ZEZ3aUlDOCtKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUWdJQ0FuUEM5a2FYWStKenRjYmx4MFhIUmNkRngwZG1GeUlHWnZiM1JsY2lBOUlDYzhZblYwZEc5dUlHaHlaV1k5WENJalhDSWdZMnhoYzNNOVhDSmlkRzRnWW5SdUxYQnlhVzFoY25rZ2JtOTBaUzFwYldGblpTMWlkRzRnWkdsellXSnNaV1JjSWlCa2FYTmhZbXhsWkQ0bklDc2diR0Z1Wnk1cGJXRm5aUzVwYm5ObGNuUWdLeUFuUEM5aWRYUjBiMjQrSnp0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhSd2JFUnBZV3h2WnlnbmJtOTBaUzFwYldGblpTMWthV0ZzYjJjbkxDQnNZVzVuTG1sdFlXZGxMbWx1YzJWeWRDd2dZbTlrZVN3Z1ptOXZkR1Z5S1R0Y2JseDBYSFJjZEgwc1hHNWNibHgwWEhSY2RHeHBibXM2SUdaMWJtTjBhVzl1SUNoc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQmliMlI1SUQwZ0p6eGthWFlnWTJ4aGMzTTlYQ0ptYjNKdExXZHliM1Z3SUhKdmR5MW1iSFZwWkZ3aVBpY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdKenhzWVdKbGJENG5JQ3NnYkdGdVp5NXNhVzVyTG5SbGVIUlViMFJwYzNCc1lYa2dLeUFuUEM5c1lXSmxiRDRuSUN0Y2JseDBYSFJjZEZ4MFhIUmNkRngwSUNjOGFXNXdkWFFnWTJ4aGMzTTlYQ0p1YjNSbExXeHBibXN0ZEdWNGRDQm1iM0p0TFdOdmJuUnliMndnYzNCaGJqRXlYQ0lnZEhsd1pUMWNJblJsZUhSY0lpQXZQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBJQ0FnSnp3dlpHbDJQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBJQ0FnSnp4a2FYWWdZMnhoYzNNOVhDSm1iM0p0TFdkeWIzVndJSEp2ZHkxbWJIVnBaRndpUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6eHNZV0psYkQ0bklDc2diR0Z1Wnk1c2FXNXJMblZ5YkNBcklDYzhMMnhoWW1Wc1BpY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdKenhwYm5CMWRDQmpiR0Z6Y3oxY0ltNXZkR1V0YkdsdWF5MTFjbXdnWm05eWJTMWpiMjUwY205c0lITndZVzR4TWx3aUlIUjVjR1U5WENKMFpYaDBYQ0lnTHo0bklDdGNibHgwWEhSY2RGeDBYSFJjZENBZ0lDYzhMMlJwZGo0bklDdGNibHgwWEhSY2RGeDBYSFJjZENBZ0lDZ2hiM0IwYVc5dWN5NWthWE5oWW14bFRHbHVhMVJoY21kbGRDQS9YRzVjZEZ4MFhIUmNkRngwWEhSY2RDQW5QR1JwZGlCamJHRnpjejFjSW1Ob1pXTnJZbTk0WENJK0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhSY2RDQWdJQ2M4YkdGaVpXdytKeUFySUNjOGFXNXdkWFFnZEhsd1pUMWNJbU5vWldOclltOTRYQ0lnWTJobFkydGxaRDRnSnlBclhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MElHeGhibWN1YkdsdWF5NXZjR1Z1U1c1T1pYZFhhVzVrYjNjZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQW5QQzlzWVdKbGJENG5JQ3RjYmx4MFhIUmNkRngwWEhSY2RGeDBJQ2M4TDJScGRqNG5JRG9nSnlkY2JseDBYSFJjZEZ4MFhIUmNkQ0FnSUNrN1hHNWNkRngwWEhSY2RIWmhjaUJtYjI5MFpYSWdQU0FuUEdKMWRIUnZiaUJvY21WbVBWd2lJMXdpSUdOc1lYTnpQVndpWW5SdUlHSjBiaTF3Y21sdFlYSjVJRzV2ZEdVdGJHbHVheTFpZEc0Z1pHbHpZV0pzWldSY0lpQmthWE5oWW14bFpENG5JQ3NnYkdGdVp5NXNhVzVyTG1sdWMyVnlkQ0FySUNjOEwySjFkSFJ2Ymo0bk8xeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RIQnNSR2xoYkc5bktDZHViM1JsTFd4cGJtc3RaR2xoYkc5bkp5d2diR0Z1Wnk1c2FXNXJMbWx1YzJWeWRDd2dZbTlrZVN3Z1ptOXZkR1Z5S1R0Y2JseDBYSFJjZEgwc1hHNWNibHgwWEhSY2RHaGxiSEE2SUdaMWJtTjBhVzl1SUNoc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQmliMlI1SUQwZ0p6eGhJR05zWVhOelBWd2liVzlrWVd3dFkyeHZjMlVnY0hWc2JDMXlhV2RvZEZ3aUlHRnlhV0V0YUdsa1pHVnVQVndpZEhKMVpWd2lJSFJoWW1sdVpHVjRQVndpTFRGY0lqNG5JQ3NnYkdGdVp5NXphRzl5ZEdOMWRDNWpiRzl6WlNBcklDYzhMMkUrSnlBclhHNWNkRngwWEhSY2RGeDBYSFFnSUNBblBHUnBkaUJqYkdGemN6MWNJblJwZEd4bFhDSStKeUFySUd4aGJtY3VjMmh2Y25SamRYUXVjMmh2Y25SamRYUnpJQ3NnSnp3dlpHbDJQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBJQ0FnS0dGblpXNTBMbWx6VFdGaklEOGdkSEJzVTJodmNuUmpkWFJVWVdKc1pTaHNZVzVuTENCdmNIUnBiMjV6S1NBNklISmxjR3hoWTJWTllXTkxaWGx6S0hSd2JGTm9iM0owWTNWMFZHRmliR1VvYkdGdVp5d2diM0IwYVc5dWN5a3BLU0FyWEc1Y2RGeDBYSFJjZEZ4MFhIUWdJQ0FuUEhBZ1kyeGhjM005WENKMFpYaDBMV05sYm5SbGNsd2lQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFFnSnp4aElHaHlaV1k5WENJdkwzTjFiVzFsY201dmRHVXViM0puTDF3aUlIUmhjbWRsZEQxY0lsOWliR0Z1YTF3aVBsTjFiVzFsY201dmRHVWdNQzQyTGpNOEwyRStJTUszSUNjZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6eGhJR2h5WldZOVhDSXZMMmRwZEdoMVlpNWpiMjB2YzNWdGJXVnlibTkwWlM5emRXMXRaWEp1YjNSbFhDSWdkR0Z5WjJWMFBWd2lYMkpzWVc1clhDSStVSEp2YW1WamREd3ZZVDRnd3JjZ0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhSY2RDQW5QR0VnYUhKbFpqMWNJaTh2WjJsMGFIVmlMbU52YlM5emRXMXRaWEp1YjNSbEwzTjFiVzFsY201dmRHVXZhWE56ZFdWelhDSWdkR0Z5WjJWMFBWd2lYMkpzWVc1clhDSStTWE56ZFdWelBDOWhQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBJQ0FnSnp3dmNENG5PMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkSEJzUkdsaGJHOW5LQ2R1YjNSbExXaGxiSEF0WkdsaGJHOW5KeXdnSnljc0lHSnZaSGtzSUNjbktUdGNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYRzVjZEZ4MGRtRnlJSFJ3YkVScFlXeHZaM01nUFNCbWRXNWpkR2x2YmlBb2JHRnVaeXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwZG1GeUlHUnBZV3h2WjNNZ1BTQW5KenRjYmx4dVhIUmNkRngwSkM1bFlXTm9LSFJ3YkVScFlXeHZaMGx1Wm04c0lHWjFibU4wYVc5dUlDaHBaSGdzSUhSd2JFUnBZV3h2WnlrZ2UxeHVYSFJjZEZ4MFhIUmthV0ZzYjJkeklDczlJSFJ3YkVScFlXeHZaeWhzWVc1bkxDQnZjSFJwYjI1ektUdGNibHgwWEhSY2RIMHBPMXh1WEc1Y2RGeDBYSFJ5WlhSMWNtNGdKenhrYVhZZ1kyeGhjM005WENKdWIzUmxMV1JwWVd4dloxd2lQaWNnS3lCa2FXRnNiMmR6SUNzZ0p6d3ZaR2wyUGljN1hHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQjBjR3hUZEdGMGRYTmlZWElnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z0p6eGthWFlnWTJ4aGMzTTlYQ0p1YjNSbExYSmxjMmw2WldKaGNsd2lQaWNnSzF4dVhIUmNkRngwWEhSY2RDQW5QR1JwZGlCamJHRnpjejFjSW01dmRHVXRhV052YmkxaVlYSmNJajQ4TDJScGRqNG5JQ3RjYmx4MFhIUmNkRngwWEhRZ0p6eGthWFlnWTJ4aGMzTTlYQ0p1YjNSbExXbGpiMjR0WW1GeVhDSStQQzlrYVhZK0p5QXJYRzVjZEZ4MFhIUmNkRngwSUNjOFpHbDJJR05zWVhOelBWd2libTkwWlMxcFkyOXVMV0poY2x3aVBqd3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUWdJQ0FuUEM5a2FYWStKenRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBkbUZ5SUhKbGNISmxjMlZ1ZEZOb2IzSjBZM1YwSUQwZ1puVnVZM1JwYjI0Z0tITjBjaWtnZTF4dVhIUmNkRngwYVdZZ0tHRm5aVzUwTG1selRXRmpLU0I3WEc1Y2RGeDBYSFJjZEhOMGNpQTlJSE4wY2k1eVpYQnNZV05sS0NkRFRVUW5MQ0FuNG95WUp5a3VjbVZ3YkdGalpTZ25VMGhKUmxRbkxDQW40b2VuSnlrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RISmxkSFZ5YmlCemRISXVjbVZ3YkdGalpTZ25Ra0ZEUzFOTVFWTklKeXdnSjF4Y1hGd25LVnh1WEhSY2RGeDBYSFJjZENBZ0xuSmxjR3hoWTJVb0oxTk1RVk5JSnl3Z0p5OG5LVnh1WEhSY2RGeDBYSFJjZENBZ0xuSmxjR3hoWTJVb0oweEZSbFJDVWtGRFMwVlVKeXdnSjFzbktWeHVYSFJjZEZ4MFhIUmNkQ0FnTG5KbGNHeGhZMlVvSjFKSlIwaFVRbEpCUTB0RlZDY3NJQ2RkSnlrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHTnlaV0YwWlZSdmIyeDBhWEJjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtZMjl1ZEdGcGJtVnlYRzVjZEZ4MElDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHdGxlVTFoY0Z4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JiYzFCc1lXTmxiV1Z1ZEYxY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ1kzSmxZWFJsVkc5dmJIUnBjQ0E5SUdaMWJtTjBhVzl1SUNna1kyOXVkR0ZwYm1WeUxDQnJaWGxOWVhBc0lITlFiR0ZqWlcxbGJuUXBJSHRjYmx4MFhIUmNkSFpoY2lCcGJuWmxjblJsWkV0bGVVMWhjQ0E5SUdaMWJtTXVhVzUyWlhKMFQySnFaV04wS0d0bGVVMWhjQ2s3WEc1Y2RGeDBYSFIyWVhJZ0pHSjFkSFJ2Ym5NZ1BTQWtZMjl1ZEdGcGJtVnlMbVpwYm1Rb0oySjFkSFJ2YmljcE8xeHVYRzVjZEZ4MFhIUWtZblYwZEc5dWN5NWxZV05vS0daMWJtTjBhVzl1SUNocExDQmxiRUowYmlrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnSkdKMGJpQTlJQ1FvWld4Q2RHNHBPMXh1WEhSY2RGeDBYSFIyWVhJZ2MxTm9iM0owWTNWMElEMGdhVzUyWlhKMFpXUkxaWGxOWVhCYkpHSjBiaTVrWVhSaEtDZGxkbVZ1ZENjcFhUdGNibHgwWEhSY2RGeDBhV1lnS0hOVGFHOXlkR04xZENrZ2UxeHVYSFJjZEZ4MFhIUmNkQ1JpZEc0dVlYUjBjaWduZEdsMGJHVW5MQ0JtZFc1amRHbHZiaUFvYVN3Z2Rpa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUhZZ0t5QW5JQ2duSUNzZ2NtVndjbVZ6Wlc1MFUyaHZjblJqZFhRb2MxTm9iM0owWTNWMEtTQXJJQ2NwSnp0Y2JseDBYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhRdkx5QmliMjkwYzNSeVlYQWdkRzl2YkhScGNDQnZiaUJpZEc0dFozSnZkWEFnWW5WblhHNWNkRngwWEhSY2RDOHZJR2gwZEhCek9pOHZaMmwwYUhWaUxtTnZiUzkwZDJKekwySnZiM1J6ZEhKaGNDOXBjM04xWlhNdk5UWTROMXh1WEhSY2RGeDBmU2t1ZEc5dmJIUnBjQ2g3WEc1Y2RGeDBYSFJjZEdOdmJuUmhhVzVsY2pvZ0oySnZaSGtuTEZ4dVhIUmNkRngwWEhSMGNtbG5aMlZ5T2lBbmFHOTJaWEluTEZ4dVhIUmNkRngwWEhSd2JHRmpaVzFsYm5RNklITlFiR0ZqWlcxbGJuUWdmSHdnSjNSdmNDZGNibHgwWEhSY2RIMHBMbTl1S0NkamJHbGpheWNzSUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBKQ2gwYUdsektTNTBiMjlzZEdsd0tDZG9hV1JsSnlrN1hHNWNkRngwWEhSOUtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5OGdZM0psWVhSbFVHRnNaWFIwWlZ4dVhIUmNkSFpoY2lCamNtVmhkR1ZRWVd4bGRIUmxJRDBnWm5WdVkzUnBiMjRnS0NSamIyNTBZV2x1WlhJc0lHOXdkR2x2Ym5NcElIdGNibHgwWEhSY2RIWmhjaUJqYjJ4dmNrbHVabThnUFNCdmNIUnBiMjV6TG1OdmJHOXljenRjYmx4MFhIUmNkQ1JqYjI1MFlXbHVaWEl1Wm1sdVpDZ25MbTV2ZEdVdFkyOXNiM0l0Y0dGc1pYUjBaU2NwTG1WaFkyZ29ablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSMllYSWdKSEJoYkdWMGRHVWdQU0FrS0hSb2FYTXBMQ0JsZG1WdWRFNWhiV1VnUFNBa2NHRnNaWFIwWlM1aGRIUnlLQ2RrWVhSaExYUmhjbWRsZEMxbGRtVnVkQ2NwTzF4dVhIUmNkRngwWEhSMllYSWdjR0ZzWlhSMFpVTnZiblJsYm5SeklEMGdXMTA3WEc1Y2RGeDBYSFJjZEdadmNpQW9kbUZ5SUhKdmR5QTlJREFzSUd4bGJsSnZkeUE5SUdOdmJHOXlTVzVtYnk1c1pXNW5kR2c3SUhKdmR5QThJR3hsYmxKdmR6c2djbTkzS3lzcElIdGNibHgwWEhSY2RGeDBYSFIyWVhJZ1kyOXNiM0p6SUQwZ1kyOXNiM0pKYm1adlczSnZkMTA3WEc1Y2RGeDBYSFJjZEZ4MGRtRnlJR0oxZEhSdmJuTWdQU0JiWFR0Y2JseDBYSFJjZEZ4MFhIUm1iM0lnS0haaGNpQmpiMndnUFNBd0xDQnNaVzVEYjJ3Z1BTQmpiMnh2Y25NdWJHVnVaM1JvT3lCamIyd2dQQ0JzWlc1RGIydzdJR052YkNzcktTQjdYRzVjZEZ4MFhIUmNkRngwWEhSMllYSWdZMjlzYjNJZ1BTQmpiMnh2Y25OYlkyOXNYVHRjYmx4MFhIUmNkRngwWEhSY2RHSjFkSFJ2Ym5NdWNIVnphQ2hiSnp4aWRYUjBiMjRnZEhsd1pUMWNJbUoxZEhSdmJsd2lJR05zWVhOelBWd2libTkwWlMxamIyeHZjaTFpZEc1Y0lpQnpkSGxzWlQxY0ltSmhZMnRuY205MWJtUXRZMjlzYjNJNkp5d2dZMjlzYjNJc1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0FuTzF3aUlHUmhkR0V0WlhabGJuUTlYQ0luTENCbGRtVnVkRTVoYldVc1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0FuWENJZ1pHRjBZUzEyWVd4MVpUMWNJaWNzSUdOdmJHOXlMRnh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkRngwSUNBZ0oxd2lJSFJwZEd4bFBWd2lKeXdnWTI5c2IzSXNYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFFnSUNBblhDSWdaR0YwWVMxMGIyZG5iR1U5WENKaWRYUjBiMjVjSWlCMFlXSnBibVJsZUQxY0lpMHhYQ0krUEM5aWRYUjBiMjQrSjEwdWFtOXBiaWduSnlrcE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSd1lXeGxkSFJsUTI5dWRHVnVkSE11Y0hWemFDZ25QR1JwZGlCamJHRnpjejFjSW01dmRHVXRZMjlzYjNJdGNtOTNYQ0krSnlBcklHSjFkSFJ2Ym5NdWFtOXBiaWduSnlrZ0t5QW5QQzlrYVhZK0p5azdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwSkhCaGJHVjBkR1V1YUhSdGJDaHdZV3hsZEhSbFEyOXVkR1Z1ZEhNdWFtOXBiaWduSnlrcE8xeHVYSFJjZEZ4MGZTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJR055WldGMFpTQnpkVzF0WlhKdWIzUmxJR3hoZVc5MWRDQW9ZV2x5SUcxdlpHVXBYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHaHZiR1JsY2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0J2Y0hScGIyNXpYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTVqY21WaGRHVk1ZWGx2ZFhSQ2VVRnBjazF2WkdVZ1BTQm1kVzVqZEdsdmJpQW9KR2h2YkdSbGNpd2diM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBkbUZ5SUd4aGJtZEpibVp2SUQwZ2IzQjBhVzl1Y3k1c1lXNW5TVzVtYnp0Y2JseDBYSFJjZEhaaGNpQnJaWGxOWVhBZ1BTQnZjSFJwYjI1ekxtdGxlVTFoY0Z0aFoyVnVkQzVwYzAxaFl5QS9JQ2R0WVdNbklEb2dKM0JqSjEwN1hHNWNkRngwWEhSMllYSWdhV1FnUFNCbWRXNWpMblZ1YVhGMVpVbGtLQ2s3WEc1Y2JseDBYSFJjZENSb2IyeGtaWEl1WVdSa1EyeGhjM01vSjI1dmRHVXRZV2x5TFdWa2FYUnZjaUJ1YjNSbExXVmthWFJoWW14bEp5azdYRzVjZEZ4MFhIUWthRzlzWkdWeUxtRjBkSElvZTF4dVhIUmNkRngwWEhRbmFXUW5PaUFuYm05MFpTMWxaR2wwYjNJdEp5QXJJR2xrTEZ4dVhIUmNkRngwWEhRblkyOXVkR1Z1ZEVWa2FYUmhZbXhsSnpvZ2RISjFaVnh1WEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEhaaGNpQmliMlI1SUQwZ1pHOWpkVzFsYm5RdVltOWtlVHRjYmx4dVhIUmNkRngwTHk4Z1kzSmxZWFJsSUZCdmNHOTJaWEpjYmx4MFhIUmNkSFpoY2lBa2NHOXdiM1psY2lBOUlDUW9kSEJzVUc5d2IzWmxjbk1vYkdGdVowbHVabThzSUc5d2RHbHZibk1wS1R0Y2JseDBYSFJjZENSd2IzQnZkbVZ5TG1Ga1pFTnNZWE56S0NkdWIzUmxMV0ZwY2kxc1lYbHZkWFFuS1R0Y2JseDBYSFJjZENSd2IzQnZkbVZ5TG1GMGRISW9KMmxrSnl3Z0oyNXZkR1V0Y0c5d2IzWmxjaTBuSUNzZ2FXUXBPMXh1WEhSY2RGeDBKSEJ2Y0c5MlpYSXVZWEJ3Wlc1a1ZHOG9ZbTlrZVNrN1hHNWNkRngwWEhSamNtVmhkR1ZVYjI5c2RHbHdLQ1J3YjNCdmRtVnlMQ0JyWlhsTllYQXBPMXh1WEhSY2RGeDBZM0psWVhSbFVHRnNaWFIwWlNna2NHOXdiM1psY2l3Z2IzQjBhVzl1Y3lrN1hHNWNibHgwWEhSY2RDOHZJR055WldGMFpTQklZVzVrYkdWY2JseDBYSFJjZEhaaGNpQWthR0Z1Wkd4bElEMGdKQ2gwY0d4SVlXNWtiR1Z6S0NrcE8xeHVYSFJjZEZ4MEpHaGhibVJzWlM1aFpHUkRiR0Z6Y3lnbmJtOTBaUzFoYVhJdGJHRjViM1YwSnlrN1hHNWNkRngwWEhRa2FHRnVaR3hsTG1GMGRISW9KMmxrSnl3Z0oyNXZkR1V0YUdGdVpHeGxMU2NnS3lCcFpDazdYRzVjZEZ4MFhIUWthR0Z1Wkd4bExtRndjR1Z1WkZSdktHSnZaSGtwTzF4dVhHNWNkRngwWEhRdkx5QmpjbVZoZEdVZ1JHbGhiRzluWEc1Y2RGeDBYSFIyWVhJZ0pHUnBZV3h2WnlBOUlDUW9kSEJzUkdsaGJHOW5jeWhzWVc1blNXNW1ieXdnYjNCMGFXOXVjeWtwTzF4dVhIUmNkRngwSkdScFlXeHZaeTVoWkdSRGJHRnpjeWduYm05MFpTMWhhWEl0YkdGNWIzVjBKeWs3WEc1Y2RGeDBYSFFrWkdsaGJHOW5MbUYwZEhJb0oybGtKeXdnSjI1dmRHVXRaR2xoYkc5bkxTY2dLeUJwWkNrN1hHNWNkRngwWEhRa1pHbGhiRzluTG1acGJtUW9KMkoxZEhSdmJpNWpiRzl6WlN3Z1lTNXRiMlJoYkMxamJHOXpaU2NwTG1Oc2FXTnJLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MEpDaDBhR2x6S1M1amJHOXpaWE4wS0NjdWJXOWtZV3duS1M1dGIyUmhiQ2duYUdsa1pTY3BPMXh1WEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFFrWkdsaGJHOW5MbUZ3Y0dWdVpGUnZLR0p2WkhrcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQmpjbVZoZEdVZ2MzVnRiV1Z5Ym05MFpTQnNZWGx2ZFhRZ0tHNXZjbTFoYkNCdGIyUmxLVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUm9iMnhrWlhKY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYjNCMGFXOXVjMXh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11WTNKbFlYUmxUR0Y1YjNWMFFubEdjbUZ0WlNBOUlHWjFibU4wYVc5dUlDZ2thRzlzWkdWeUxDQnZjSFJwYjI1ektTQjdYRzVjZEZ4MFhIUjJZWElnYkdGdVowbHVabThnUFNCdmNIUnBiMjV6TG14aGJtZEpibVp2TzF4dVhHNWNkRngwWEhSMllYSWdhWE5EYjI1MFpXNTBSV1JwZEdGaWJHVWdQU0FoSkdodmJHUmxjaTVwY3lnbk9tUnBjMkZpYkdWa0p5azdYRzVjYmx4MFhIUmNkQzh2TURFdUlHTnlaV0YwWlNCRlpHbDBiM0pjYmx4MFhIUmNkSFpoY2lBa1pXUnBkRzl5SUQwZ0pDZ25QR1JwZGlCamJHRnpjejFjSW01dmRHVXRaV1JwZEc5eUlHVmthWFJoWW14bExTY2dLeUJwYzBOdmJuUmxiblJGWkdsMFlXSnNaU0FySUNkY0lqNDhMMlJwZGo0bktUdGNibHgwWEhSY2RHbG1JQ2h2Y0hScGIyNXpMbmRwWkhSb0tTQjdYRzVjZEZ4MFhIUmNkQ1JsWkdsMGIzSXVkMmxrZEdnb2IzQjBhVzl1Y3k1M2FXUjBhQ2s3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4dk1ESXVJSE4wWVhSMWMySmhjaUFvY21WemFYcGxZbUZ5S1Z4dVhIUmNkRngwYVdZZ0tHOXdkR2x2Ym5NdWFHVnBaMmgwSUQ0Z01Da2dlMXh1WEhSY2RGeDBYSFFrS0NjOFpHbDJJR05zWVhOelBWd2libTkwWlMxemRHRjBkWE5pWVhKY0lqNG5JQ3NnS0c5d2RHbHZibk11WkdsellXSnNaVkpsYzJsNlpVVmthWFJ2Y2lBL0lDY25JRG9nZEhCc1UzUmhkSFZ6WW1GeUtDa3BJQ3NnSnp3dlpHbDJQaWNwTG5CeVpYQmxibVJVYnlna1pXUnBkRzl5S1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MEx5OHdNeTRnWTNKbFlYUmxJRVZrYVhSaFlteGxYRzVjYmx4MFhIUmNkSFpoY2lBa1pXUnBkR0ZpYkdVZ1BTQWtLQ2M4WkdsMklHTnNZWE56UFZ3aWJtOTBaUzFsWkdsMFlXSnNaVndpSUdOdmJuUmxiblJGWkdsMFlXSnNaVDFjSWljZ0t5QnBjME52Ym5SbGJuUkZaR2wwWVdKc1pTQXJJQ2RjSWo0OEwyUnBkajRuS1Z4dVhIUmNkRngwWEhRdWNISmxjR1Z1WkZSdktDUmxaR2wwYjNJcE8xeHVYSFJjZEZ4MGFXWWdLRzl3ZEdsdmJuTXVhR1ZwWjJoMEtTQjdYRzVjZEZ4MFhIUmNkQ1JsWkdsMFlXSnNaUzVvWldsbmFIUW9iM0IwYVc5dWN5NW9aV2xuYUhRcE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEZ4MGFXWWdLRzl3ZEdsdmJuTXVaR2x5WldOMGFXOXVLU0I3WEc1Y2RGeDBYSFJjZENSbFpHbDBZV0pzWlM1aGRIUnlLQ2RrYVhJbkxDQnZjSFJwYjI1ekxtUnBjbVZqZEdsdmJpazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MFhIUjJZWElnY0d4aFkyVm9iMnhrWlhJZ1BTQWthRzlzWkdWeUxtRjBkSElvSjNCc1lXTmxhRzlzWkdWeUp5a2dmSHdnYjNCMGFXOXVjeTV3YkdGalpXaHZiR1JsY2p0Y2JseDBYSFJjZEdsbUlDaHdiR0ZqWldodmJHUmxjaWtnZTF4dVhIUmNkRngwWEhRa1pXUnBkR0ZpYkdVdVlYUjBjaWduWkdGMFlTMXdiR0ZqWldodmJHUmxjaWNzSUhCc1lXTmxhRzlzWkdWeUtUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBKR1ZrYVhSaFlteGxMbWgwYld3b1pHOXRMbWgwYld3b0pHaHZiR1JsY2lrcE8xeHVYRzVjZEZ4MFhIUXZMekF6TVM0Z1kzSmxZWFJsSUdOdlpHRmliR1ZjYmx4MFhIUmNkQ1FvSnp4MFpYaDBZWEpsWVNCamJHRnpjejFjSW01dmRHVXRZMjlrWVdKc1pWd2lQand2ZEdWNGRHRnlaV0UrSnlrdWNISmxjR1Z1WkZSdktDUmxaR2wwYjNJcE8xeHVYRzVjZEZ4MFhIUXZMekEwTGlCamNtVmhkR1VnVkc5dmJHSmhjbHh1WEhSY2RGeDBkbUZ5SUNSMGIyOXNZbUZ5SUQwZ0pDZ25QR1JwZGlCamJHRnpjejFjSW01dmRHVXRkRzl2YkdKaGNpQmlkRzR0ZEc5dmJHSmhjbHdpSUM4K0p5azdYRzVjZEZ4MFhIUm1iM0lnS0haaGNpQnBaSGdnUFNBd0xDQnNaVzRnUFNCdmNIUnBiMjV6TG5SdmIyeGlZWEl1YkdWdVozUm9PeUJwWkhnZ1BDQnNaVzQ3SUdsa2VDc3JLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQm5jbTkxY0U1aGJXVWdQU0J2Y0hScGIyNXpMblJ2YjJ4aVlYSmJhV1I0WFZzd1hUdGNibHgwWEhSY2RGeDBkbUZ5SUdkeWIzVndRblYwZEc5dWN5QTlJRzl3ZEdsdmJuTXVkRzl2YkdKaGNsdHBaSGhkV3pGZE8xeHVYRzVjZEZ4MFhIUmNkSFpoY2lBa1ozSnZkWEFnUFNBa0tDYzhaR2wySUdOc1lYTnpQVndpYm05MFpTMG5JQ3NnWjNKdmRYQk9ZVzFsSUNzZ0p5QmlkRzR0WjNKdmRYQmNJaUF2UGljcE8xeHVYSFJjZEZ4MFhIUm1iM0lnS0haaGNpQnBJRDBnTUN3Z1luUnVUR1Z1WjNSb0lEMGdaM0p2ZFhCQ2RYUjBiMjV6TG14bGJtZDBhRHNnYVNBOElHSjBia3hsYm1kMGFEc2dhU3NyS1NCN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUdKMWRIUnZia2x1Wm04Z1BTQjBjR3hDZFhSMGIyNUpibVp2VzJkeWIzVndRblYwZEc5dWMxdHBYVjA3WEc1Y2RGeDBYSFJjZEZ4MEx5OGdZMjl1ZEdsdWRXVWdZM0psWVhScGJtY2dkRzl2YkdKaGNpQmxkbVZ1SUdsbUlHRWdZblYwZEc5dUlHUnZaWE51SjNRZ1pYaHBjM1JjYmx4MFhIUmNkRngwWEhScFppQW9JU1F1YVhOR2RXNWpkR2x2YmloaWRYUjBiMjVKYm1adktTa2dleUJqYjI1MGFXNTFaVHNnZlZ4dVhHNWNkRngwWEhSY2RGeDBkbUZ5SUNSaWRYUjBiMjRnUFNBa0tHSjFkSFJ2YmtsdVptOG9iR0Z1WjBsdVptOHNJRzl3ZEdsdmJuTXBLVHRjYmx4MFhIUmNkRngwWEhRa1luVjBkRzl1TG1GMGRISW9KMlJoZEdFdGJtRnRaU2NzSUdkeWIzVndRblYwZEc5dWMxdHBYU2s3SUNBdkx5QnpaWFFnWW5WMGRHOXVKM01nWVd4cFlYTXNJR0psWTNWaGMyVWdkRzhnWjJWMElHSjFkSFJ2YmlCbGJHVnRaVzUwSUdaeWIyMGdKSFJ2YjJ4aVlYSmNibHgwWEhSY2RGeDBYSFFrWjNKdmRYQXVZWEJ3Wlc1a0tDUmlkWFIwYjI0cE8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkQ1IwYjI5c1ltRnlMbUZ3Y0dWdVpDZ2taM0p2ZFhBcE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUWtkRzl2YkdKaGNpNXdjbVZ3Wlc1a1ZHOG9KR1ZrYVhSdmNpazdYRzVjZEZ4MFhIUjJZWElnYTJWNVRXRndJRDBnYjNCMGFXOXVjeTVyWlhsTllYQmJZV2RsYm5RdWFYTk5ZV01nUHlBbmJXRmpKeUE2SUNkd1l5ZGRPMXh1WEhSY2RGeDBZM0psWVhSbFVHRnNaWFIwWlNna2RHOXZiR0poY2l3Z2IzQjBhVzl1Y3lrN1hHNWNkRngwWEhSamNtVmhkR1ZVYjI5c2RHbHdLQ1IwYjI5c1ltRnlMQ0JyWlhsTllYQXNJQ2RpYjNSMGIyMG5LVHRjYmx4dVhIUmNkRngwTHk4d05TNGdZM0psWVhSbElGQnZjRzkyWlhKY2JseDBYSFJjZEhaaGNpQWtjRzl3YjNabGNpQTlJQ1FvZEhCc1VHOXdiM1psY25Nb2JHRnVaMGx1Wm04c0lHOXdkR2x2Ym5NcEtTNXdjbVZ3Wlc1a1ZHOG9KR1ZrYVhSdmNpazdYRzVjZEZ4MFhIUmpjbVZoZEdWUVlXeGxkSFJsS0NSd2IzQnZkbVZ5TENCdmNIUnBiMjV6S1R0Y2JseDBYSFJjZEdOeVpXRjBaVlJ2YjJ4MGFYQW9KSEJ2Y0c5MlpYSXNJR3RsZVUxaGNDazdYRzVjYmx4MFhIUmNkQzh2TURZdUlHaGhibVJzWlNoamIyNTBjbTlzSUhObGJHVmpkR2x2Yml3Z0xpNHVLVnh1WEhSY2RGeDBKQ2gwY0d4SVlXNWtiR1Z6S0NrcExuQnlaWEJsYm1SVWJ5Z2taV1JwZEc5eUtUdGNibHh1WEhSY2RGeDBMeTh3Tnk0Z1kzSmxZWFJsSUVScFlXeHZaMXh1WEhSY2RGeDBkbUZ5SUNSa2FXRnNiMmNnUFNBa0tIUndiRVJwWVd4dlozTW9iR0Z1WjBsdVptOHNJRzl3ZEdsdmJuTXBLUzV3Y21Wd1pXNWtWRzhvSkdWa2FYUnZjaWs3WEc1Y2RGeDBYSFFrWkdsaGJHOW5MbVpwYm1Rb0oySjFkSFJ2Ymk1amJHOXpaU3dnWVM1dGIyUmhiQzFqYkc5elpTY3BMbU5zYVdOcktHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwSkNoMGFHbHpLUzVqYkc5elpYTjBLQ2N1Ylc5a1lXd25LUzV0YjJSaGJDZ25hR2xrWlNjcE8xeHVYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkQzh2TURndUlHTnlaV0YwWlNCRWNtOXdlbTl1WlZ4dVhIUmNkRngwSkNnblBHUnBkaUJqYkdGemN6MWNJbTV2ZEdVdFpISnZjSHB2Ym1WY0lqNDhaR2wySUdOc1lYTnpQVndpYm05MFpTMWtjbTl3ZW05dVpTMXRaWE56WVdkbFhDSStQQzlrYVhZK1BDOWthWFkrSnlrdWNISmxjR1Z1WkZSdktDUmxaR2wwYjNJcE8xeHVYRzVjZEZ4MFhIUXZMekE1TGlCRlpHbDBiM0l2U0c5c1pHVnlJSE4zYVhSamFGeHVYSFJjZEZ4MEpHVmthWFJ2Y2k1cGJuTmxjblJCWm5SbGNpZ2thRzlzWkdWeUtUdGNibHgwWEhSY2RDUm9iMnhrWlhJdWFHbGtaU2dwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFIwYUdsekxtaGhjMDV2ZEdWRlpHbDBiM0lnUFNCbWRXNWpkR2x2YmlBb0pHaHZiR1JsY2lrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUhSb2FYTXVibTkwWlVWa2FYUnZja1p5YjIxSWIyeGtaWElvSkdodmJHUmxjaWt1YkdWdVozUm9JRDRnTUR0Y2JseDBYSFI5TzF4dVhHNWNkRngwZEdocGN5NXViM1JsUldScGRHOXlSbkp2YlVodmJHUmxjaUE5SUdaMWJtTjBhVzl1SUNna2FHOXNaR1Z5S1NCN1hHNWNkRngwWEhScFppQW9KR2h2YkdSbGNpNW9ZWE5EYkdGemN5Z25ibTkwWlMxaGFYSXRaV1JwZEc5eUp5a3BJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJQ1JvYjJ4a1pYSTdYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2FXWWdLQ1JvYjJ4a1pYSXVibVY0ZENncExtaGhjME5zWVhOektDZHViM1JsTFdWa2FYUnZjaWNwS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlBa2FHOXNaR1Z5TG01bGVIUW9LVHRjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQWtLQ2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUdOeVpXRjBaU0J6ZFcxdFpYSnViM1JsSUd4aGVXOTFkRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUm9iMnhrWlhKY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYjNCMGFXOXVjMXh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11WTNKbFlYUmxUR0Y1YjNWMElEMGdablZ1WTNScGIyNGdLQ1JvYjJ4a1pYSXNJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkR2xtSUNodmNIUnBiMjV6TG1GcGNrMXZaR1VwSUh0Y2JseDBYSFJjZEZ4MGRHaHBjeTVqY21WaGRHVk1ZWGx2ZFhSQ2VVRnBjazF2WkdVb0pHaHZiR1JsY2l3Z2IzQjBhVzl1Y3lrN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSMGFHbHpMbU55WldGMFpVeGhlVzkxZEVKNVJuSmhiV1VvSkdodmJHUmxjaXdnYjNCMGFXOXVjeWs3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhKbGRIVnlibk1nYkdGNWIzVjBTVzVtYnlCbWNtOXRJR2h2YkdSbGNseHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSb2IyeGtaWElnTFNCd2JHRmpaV2h2YkdSbGNseHVYSFJjZENBcUlFQnlaWFIxY200Z2UwOWlhbVZqZEgxY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxteGhlVzkxZEVsdVptOUdjbTl0U0c5c1pHVnlJRDBnWm5WdVkzUnBiMjRnS0NSb2IyeGtaWElwSUh0Y2JseDBYSFJjZEhaaGNpQWtaV1JwZEc5eUlEMGdkR2hwY3k1dWIzUmxSV1JwZEc5eVJuSnZiVWh2YkdSbGNpZ2thRzlzWkdWeUtUdGNibHgwWEhSY2RHbG1JQ2doSkdWa2FYUnZjaTVzWlc1bmRHZ3BJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFF2THlCamIyNXVaV04wSUNSb2IyeGtaWElnZEc4Z0pHVmthWFJ2Y2x4dVhIUmNkRngwSkdWa2FYUnZjaTVrWVhSaEtDZG9iMnhrWlhJbkxDQWthRzlzWkdWeUtUdGNibHh1WEhSY2RGeDBjbVYwZFhKdUlHUnZiUzVpZFdsc1pFeGhlVzkxZEVsdVptOG9KR1ZrYVhSdmNpazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJSEpsYlc5MlpVeGhlVzkxZEZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JvYjJ4a1pYSWdMU0J3YkdGalpXaHZiR1JsY2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JzWVhsdmRYUkpibVp2WEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJRzl3ZEdsdmJuTmNibHgwWEhRZ0tseHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVjbVZ0YjNabFRHRjViM1YwSUQwZ1puVnVZM1JwYjI0Z0tDUm9iMnhrWlhJc0lHeGhlVzkxZEVsdVptOHNJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkR2xtSUNodmNIUnBiMjV6TG1GcGNrMXZaR1VwSUh0Y2JseDBYSFJjZEZ4MEpHaHZiR1JsY2k1eVpXMXZkbVZEYkdGemN5Z25ibTkwWlMxaGFYSXRaV1JwZEc5eUlHNXZkR1V0WldScGRHRmliR1VuS1Z4dVhIUmNkRngwWEhSY2RDQWdJQzV5WlcxdmRtVkJkSFJ5S0NkcFpDQmpiMjUwWlc1MFJXUnBkR0ZpYkdVbktUdGNibHh1WEhSY2RGeDBYSFJzWVhsdmRYUkpibVp2TG5CdmNHOTJaWElvS1M1eVpXMXZkbVVvS1R0Y2JseDBYSFJjZEZ4MGJHRjViM1YwU1c1bWJ5NW9ZVzVrYkdVb0tTNXlaVzF2ZG1Vb0tUdGNibHgwWEhSY2RGeDBiR0Y1YjNWMFNXNW1ieTVrYVdGc2IyY29LUzV5WlcxdmRtVW9LVHRjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkQ1JvYjJ4a1pYSXVhSFJ0YkNoc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDa3VhSFJ0YkNncEtUdGNibHh1WEhSY2RGeDBYSFJzWVhsdmRYUkpibVp2TG1Wa2FYUnZjaWdwTG5KbGJXOTJaU2dwTzF4dVhIUmNkRngwWEhRa2FHOXNaR1Z5TG5Ob2IzY29LVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRQWW1wbFkzUjlYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdablZ1WTNScGIyNG9iR0ZpWld3c0lHOXdkR2x2Ym5NOUtUcHpkSEpwYm1kOUlISmxkSFZ5Ymk1aWRYUjBiMjRnZTBCc2FXNXJJQ04wY0d4Q2RYUjBiMjRnWm5WdVkzUnBiMjRnZEc4Z2JXRnJaU0IwWlhoMElHSjFkSFJ2Ym4xY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0bWRXNWpkR2x2YmlocFkyOXVRMnhoYzNNc0lHOXdkR2x2Ym5NOUtUcHpkSEpwYm1kOUlISmxkSFZ5Ymk1cFkyOXVRblYwZEc5dUlIdEFiR2x1YXlBamRIQnNTV052YmtKMWRIUnZiaUJtZFc1amRHbHZiaUIwYnlCdFlXdGxJR2xqYjI0Z1luVjBkRzl1ZlZ4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTJaMWJtTjBhVzl1S0dOc1lYTnpUbUZ0WlN3Z2RHbDBiR1U5TENCaWIyUjVQU3dnWm05dmRHVnlQU2s2YzNSeWFXNW5mU0J5WlhSMWNtNHVaR2xoYkc5bklIdEFiR2x1YXlBamRIQnNSR2xoYkc5bklHWjFibU4wYVc5dUlIUnZJRzFoYTJVZ1pHbGhiRzluZlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdVoyVjBWR1Z0Y0d4aGRHVWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnZTF4dVhIUmNkRngwWEhSaWRYUjBiMjQ2SUhSd2JFSjFkSFJ2Yml4Y2JseDBYSFJjZEZ4MGFXTnZia0oxZEhSdmJqb2dkSEJzU1dOdmJrSjFkSFJ2Yml4Y2JseDBYSFJjZEZ4MFpHbGhiRzluT2lCMGNHeEVhV0ZzYjJkY2JseDBYSFJjZEgwN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHRmtaQ0JpZFhSMGIyNGdhVzVtYjNKdFlYUnBiMjVjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQnVZVzFsSUdKMWRIUnZiaUJ1WVcxbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ1luVjBkRzl1U1c1bWJ5Qm1kVzVqZEdsdmJpQjBieUJ0WVd0bElHSjFkSFJ2Yml3Z2NtVm1aWEpsYm1ObElIUnZJSHRBYkdsdWF5QWpkSEJzUW5WMGRHOXVmU3g3UUd4cGJtc2dJM1J3YkVsamIyNUNkWFIwYjI1OVhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NWhaR1JDZFhSMGIyNUpibVp2SUQwZ1puVnVZM1JwYjI0Z0tHNWhiV1VzSUdKMWRIUnZia2x1Wm04cElIdGNibHgwWEhSY2RIUndiRUoxZEhSdmJrbHVabTliYm1GdFpWMGdQU0JpZFhSMGIyNUpibVp2TzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0J1WVcxbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ1pHbGhiRzluU1c1bWJ5Qm1kVzVqZEdsdmJpQjBieUJ0WVd0bElHUnBZV3h2Wnl3Z2NtVm1aWEpsYm1ObElIUnZJSHRBYkdsdWF5QWpkSEJzUkdsaGJHOW5mVnh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11WVdSa1JHbGhiRzluU1c1bWJ5QTlJR1oxYm1OMGFXOXVJQ2h1WVcxbExDQmthV0ZzYjJkSmJtWnZLU0I3WEc1Y2RGeDBYSFIwY0d4RWFXRnNiMmRKYm1adlcyNWhiV1ZkSUQwZ1pHbGhiRzluU1c1bWJ6dGNibHgwWEhSOU8xeHVYSFI5TzF4dVhHNWNibHgwTHk4Z2FsRjFaWEo1SUc1aGJXVnpjR0ZqWlNCbWIzSWdjM1Z0YldWeWJtOTBaVnh1WEhRdktpcGNibHgwSUNvZ1FHTnNZWE56SUNRdWMzVnRiV1Z5Ym05MFpTQmNibHgwSUNvZ1hHNWNkQ0FxSUhOMWJXMWxjbTV2ZEdVZ1lYUjBjbWxpZFhSbElDQmNibHgwSUNvZ1hHNWNkQ0FxSUVCdGFYaHBiaUJrWldaaGRXeDBjMXh1WEhRZ0tpQkFjMmx1WjJ4bGRHOXVJQ0JjYmx4MElDb2dYRzVjZENBcUwxeHVYSFFrTG5OMWJXMWxjbTV2ZEdVZ1BTQWtMbk4xYlcxbGNtNXZkR1VnZkh3Z2UzMDdYRzVjYmx4MEx5OGdaWGgwWlc1a2N5QmtaV1poZFd4MElITmxkSFJwYm1kelhHNWNkQzh2SUNBdElDUXVjM1Z0YldWeWJtOTBaUzUyWlhKemFXOXVYRzVjZEM4dklDQXRJQ1F1YzNWdGJXVnlibTkwWlM1dmNIUnBiMjV6WEc1Y2RDOHZJQ0F0SUNRdWMzVnRiV1Z5Ym05MFpTNXNZVzVuWEc1Y2RDUXVaWGgwWlc1a0tDUXVjM1Z0YldWeWJtOTBaU3dnWkdWbVlYVnNkSE1wTzF4dVhHNWNkSFpoY2lCeVpXNWtaWEpsY2lBOUlHNWxkeUJTWlc1a1pYSmxjaWdwTzF4dVhIUjJZWElnWlhabGJuUklZVzVrYkdWeUlEMGdibVYzSUVWMlpXNTBTR0Z1Wkd4bGNpZ3BPMXh1WEc1Y2RDUXVaWGgwWlc1a0tDUXVjM1Z0YldWeWJtOTBaU3dnZTF4dVhIUmNkQzhxS2lCQWNISnZjR1Z5ZEhrZ2UxSmxibVJsY21WeWZTQXFMMXh1WEhSY2RISmxibVJsY21WeU9pQnlaVzVrWlhKbGNpeGNibHgwWEhRdktpb2dRSEJ5YjNCbGNuUjVJSHRGZG1WdWRFaGhibVJzWlhKOUlDb3ZYRzVjZEZ4MFpYWmxiblJJWVc1a2JHVnlPaUJsZG1WdWRFaGhibVJzWlhJc1hHNWNkRngwTHlvcUlGeHVYSFJjZENBcUlFQndjbTl3WlhKMGVTQjdUMkpxWldOMGZTQmpiM0psSUZ4dVhIUmNkQ0FxSUVCd2NtOXdaWEowZVNCN1kyOXlaUzVoWjJWdWRIMGdZMjl5WlM1aFoyVnVkQ0JjYmx4MFhIUWdLaUJBY0hKdmNHVnlkSGtnZTJOdmNtVXVaRzl0ZlNCamIzSmxMbVJ2YlZ4dVhIUmNkQ0FxSUVCd2NtOXdaWEowZVNCN1kyOXlaUzV5WVc1blpYMGdZMjl5WlM1eVlXNW5aU0JjYmx4MFhIUWdLaTljYmx4MFhIUmpiM0psT2lCN1hHNWNkRngwWEhSaFoyVnVkRG9nWVdkbGJuUXNYRzVjZEZ4MFhIUmtiMjA2SUdSdmJTeGNibHgwWEhSY2RISmhibWRsT2lCeVlXNW5aVnh1WEhSY2RIMHNYRzVjZEZ4MEx5b3FJRnh1WEhSY2RDQXFJRUJ3Y205d1pYSjBlU0I3VDJKcVpXTjBmU0JjYmx4MFhIUWdLaUJ3YkhWbmFXNUZkbVZ1ZEhNZ1pYWmxiblFnYkdsemRDQm1iM0lnY0d4MVoybHVjMXh1WEhSY2RDQXFJR1YyWlc1MElHaGhjeUJ1WVcxbElHRnVaQ0JqWVd4c1ltRmpheUJtZFc1amRHbHZiaTVjYmx4MFhIUWdLaUJjYmx4MFhIUWdLaUJnWUdBZ1hHNWNkRngwSUNvZ0pDNXpkVzF0WlhKdWIzUmxMbUZrWkZCc2RXZHBiaWg3WEc1Y2RGeDBJQ29nSUNBZ0lHVjJaVzUwY3lBNklIdGNibHgwWEhRZ0tpQWdJQ0FnSUNBZ0lDQW5hR1ZzYkc4bklEb2dablZ1WTNScGIyNG9iR0Y1YjNWMFNXNW1ieXdnZG1Gc2RXVXNJQ1IwWVhKblpYUXBJSHRjYmx4MFhIUWdLaUFnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1c2IyY29KMlYyWlc1MElHNWhiV1VnYVhNZ2FHVnNiRzhzSUhaaGJIVmxJR2x6SUNjZ0t5QjJZV3gxWlNBcE8xeHVYSFJjZENBcUlDQWdJQ0FnSUNBZ0lIMWNibHgwWEhRZ0tpQWdJQ0FnZlNBZ0lDQWdYRzVjZEZ4MElDb2dmU2xjYmx4MFhIUWdLaUJnWUdCY2JseDBYSFFnS2lCY2JseDBYSFFnS2lBcUlHVjJaVzUwSUc1aGJXVWdhWE1nWkdGMFlTMWxkbVZ1ZENCd2NtOXdaWEowZVM1Y2JseDBYSFFnS2lBcUlHeGhlVzkxZEVsdVptOGdhWE1nWVNCemRXMXRaWEp1YjNSbElHeGhlVzkxZENCcGJtWnZjbTFoZEdsdmJpNWNibHgwWEhRZ0tpQXFJSFpoYkhWbElHbHpJR1JoZEdFdGRtRnNkV1VnY0hKdmNHVnlkSGt1WEc1Y2RGeDBJQ292WEc1Y2RGeDBjR3gxWjJsdVJYWmxiblJ6T2lCN2ZTeGNibHh1WEhSY2RIQnNkV2RwYm5NNklGdGRYRzVjZEgwcE8xeHVYRzVjZEM4cUtseHVYSFFnS2lCQWJXVjBhRzlrSUdGa1pGQnNkV2RwYmx4dVhIUWdLbHh1WEhRZ0tpQmhaR1FnVUd4MVoybHVJR2x1SUZOMWJXMWxjbTV2ZEdVZ1hHNWNkQ0FxSUZ4dVhIUWdLaUJUZFcxdFpYSnViM1JsSUdOaGJpQnRZV3RsSUdFZ2IzZHVJSEJzZFdkcGJpNWNibHgwSUNwY2JseDBJQ29nSXlNaklFUmxabWx1WlNCd2JIVm5hVzVjYmx4MElDb2dZR0JnWEc1Y2RDQXFJQzh2SUdkbGRDQjBaVzF3YkdGMFpTQm1kVzVqZEdsdmJpQWdYRzVjZENBcUlIWmhjaUIwYlhCc0lEMGdKQzV6ZFcxdFpYSnViM1JsTG5KbGJtUmxjbVZ5TG1kbGRGUmxiWEJzWVhSbEtDazdYRzVjZENBcUlGeHVYSFFnS2lBdkx5QmhaR1FnWVNCaWRYUjBiMjRnSUNCY2JseDBJQ29nSkM1emRXMXRaWEp1YjNSbExtRmtaRkJzZFdkcGJpaDdYRzVjZENBcUlDQWdJQ0JpZFhSMGIyNXpJRG9nZTF4dVhIUWdLaUFnSUNBZ0lDQWdMeThnWENKb1pXeHNiMXdpSUNCcGN5QmlkWFIwYjI0bmN5QnVZVzFsYzNCaFkyVXVJQ0FnSUNBZ1hHNWNkQ0FxSUNBZ0lDQWdJQ0JjSW1obGJHeHZYQ0lnT2lCbWRXNWpkR2x2Ymloc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RDQXFJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2JXRnJaU0JwWTI5dUlHSjFkSFJ2YmlCaWVTQjBaVzF3YkdGMFpTQm1kVzVqZEdsdmJpQWdJQ0FnSUNBZ0lDQmNibHgwSUNvZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHMXdiQzVwWTI5dVFuVjBkRzl1S0NkbVlTQm1ZUzFvWldGa1pYSW5MQ0I3WEc1Y2RDQXFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJR05oYkd4aVlXTnJJR1oxYm1OMGFXOXVJRzVoYldVZ2QyaGxiaUJpZFhSMGIyNGdZMnhwWTJ0bFpDQmNibHgwSUNvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWlhabGJuUWdPaUFuYUdWc2JHOG5MRnh1WEhRZ0tpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnpaWFFnWkdGMFlTMTJZV3gxWlNCd2NtOXdaWEowZVNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEc1Y2RDQXFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhiSFZsSURvZ0oyaGxiR3h2Snl3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWEc1Y2RDQXFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHaHBaR1VnT2lCMGNuVmxYRzVjZENBcUlDQWdJQ0FnSUNBZ0lDQWdmU2s3SUNBZ0lDQWdJQ0FnSUNCY2JseDBJQ29nSUNBZ0lDQWdJSDFjYmx4MElDb2dJQ0FnSUZ4dVhIUWdLaUFnSUNBZ2ZTd2dYRzVjZENBcUlDQWdJQ0JjYmx4MElDb2dJQ0FnSUdWMlpXNTBjeUE2SUh0Y2JseDBJQ29nSUNBZ0lDQWdJRndpYUdWc2JHOWNJaUE2SUdaMWJtTjBhVzl1S0d4aGVXOTFkRWx1Wm04c0lIWmhiSFZsS1NCN1hHNWNkQ0FxSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhR1Z5WlNCcGN5QmxkbVZ1ZENCamIyUmxJRnh1WEhRZ0tpQWdJQ0FnSUNBZ2ZWeHVYSFFnS2lBZ0lDQWdmU0FnSUNBZ1hHNWNkQ0FxSUgwcE8xeHVYSFFnS2lCZ1lHQWdYRzVjZENBcUlDTWpJeUJWYzJVZ1lTQndiSFZuYVc0Z2FXNGdkRzl2YkdKaGNseHVYSFFnS2lCY2JseDBJQ29nWUdCZ0lGeHVYSFFnS2lBZ0lDQWtLRndpSTJWa2FYUnZjbHdpS1M1emRXMXRaWEp1YjNSbEtIdGNibHgwSUNvZ0lDQWdMaTR1WEc1Y2RDQXFJQ0FnSUhSdmIyeGlZWElnT2lCYlhHNWNkQ0FxSUNBZ0lDQWdJQ0F2THlCa2FYTndiR0Y1SUdobGJHeHZJSEJzZFdkcGJpQnBiaUIwYjI5c1ltRnlJQ0FnSUNCY2JseDBJQ29nSUNBZ0lDQWdJRnNuWjNKdmRYQW5MQ0JiSUNkb1pXeHNieWNnWFYxY2JseDBJQ29nSUNBZ1hWeHVYSFFnS2lBZ0lDQXVMaTRnSUNBZ1hHNWNkQ0FxSUNBZ0lIMHBPMXh1WEhRZ0tpQmdZR0JjYmx4MElDb2dJRnh1WEhRZ0tpQWdYRzVjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCd2JIVm5hVzVjYmx4MElDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlGdHdiSFZuYVc0dVluVjBkRzl1YzEwZ1pHVm1hVzVsSUhCc2RXZHBiaUJpZFhSMGIyNHVJR1p2Y2lCa1pYUmhhV3dzSUhObFpTQjBieUJTWlc1a1pYSmxjaTVoWkdSQ2RYUjBiMjVKYm1adlhHNWNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JiY0d4MVoybHVMbVJwWVd4dlozTmRJR1JsWm1sdVpTQndiSFZuYVc0Z1pHbGhiRzluTGlCbWIzSWdaR1YwWVdsc0xDQnpaV1VnZEc4Z1VtVnVaR1Z5WlhJdVlXUmtSR2xoYkc5blNXNW1iMXh1WEhRZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ1czQnNkV2RwYmk1bGRtVnVkSE5kSUdGa1pDQmxkbVZ1ZENCcGJpQWtMbk4xYlcxbGNtNXZkR1V1Y0d4MVoybHVSWFpsYm5SeklGeHVYSFFnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnVzNCc2RXZHBiaTVzWVc1bmMxMGdkWEJrWVhSbElDUXVjM1Z0YldWeWJtOTBaUzVzWVc1blhHNWNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JiY0d4MVoybHVMbTl3ZEdsdmJuTmRJSFZ3WkdGMFpTQWtMbk4xYlcxbGNtNXZkR1V1YjNCMGFXOXVjMXh1WEhRZ0tpOWNibHgwSkM1emRXMXRaWEp1YjNSbExtRmtaRkJzZFdkcGJpQTlJR1oxYm1OMGFXOXVJQ2h3YkhWbmFXNHBJSHRjYmx4dVhIUmNkQzh2SUhOaGRtVWdjR3gxWjJsdUlHeHBjM1JjYmx4MFhIUWtMbk4xYlcxbGNtNXZkR1V1Y0d4MVoybHVjeTV3ZFhOb0tIQnNkV2RwYmlrN1hHNWNibHgwWEhScFppQW9jR3gxWjJsdUxtSjFkSFJ2Ym5NcElIdGNibHgwWEhSY2RDUXVaV0ZqYUNod2JIVm5hVzR1WW5WMGRHOXVjeXdnWm5WdVkzUnBiMjRnS0c1aGJXVXNJR0oxZEhSdmJpa2dlMXh1WEhSY2RGeDBYSFJ5Wlc1a1pYSmxjaTVoWkdSQ2RYUjBiMjVKYm1adktHNWhiV1VzSUdKMWRIUnZiaWs3WEc1Y2RGeDBYSFI5S1R0Y2JseDBYSFI5WEc1Y2JseDBYSFJwWmlBb2NHeDFaMmx1TG1ScFlXeHZaM01wSUh0Y2JseDBYSFJjZENRdVpXRmphQ2h3YkhWbmFXNHVaR2xoYkc5bmN5d2dablZ1WTNScGIyNGdLRzVoYldVc0lHUnBZV3h2WnlrZ2UxeHVYSFJjZEZ4MFhIUnlaVzVrWlhKbGNpNWhaR1JFYVdGc2IyZEpibVp2S0c1aGJXVXNJR1JwWVd4dlp5azdYRzVjZEZ4MFhIUjlLVHRjYmx4MFhIUjlYRzVjYmx4MFhIUnBaaUFvY0d4MVoybHVMbVYyWlc1MGN5a2dlMXh1WEhSY2RGeDBKQzVsWVdOb0tIQnNkV2RwYmk1bGRtVnVkSE1zSUdaMWJtTjBhVzl1SUNodVlXMWxMQ0JsZG1WdWRDa2dlMXh1WEhSY2RGeDBYSFFrTG5OMWJXMWxjbTV2ZEdVdWNHeDFaMmx1UlhabGJuUnpXMjVoYldWZElEMGdaWFpsYm5RN1hHNWNkRngwWEhSOUtUdGNibHgwWEhSOVhHNWNibHgwWEhScFppQW9jR3gxWjJsdUxteGhibWR6S1NCN1hHNWNkRngwWEhRa0xtVmhZMmdvY0d4MVoybHVMbXhoYm1kekxDQm1kVzVqZEdsdmJpQW9iRzlqWVd4bExDQnNZVzVuS1NCN1hHNWNkRngwWEhSY2RHbG1JQ2drTG5OMWJXMWxjbTV2ZEdVdWJHRnVaMXRzYjJOaGJHVmRLU0I3WEc1Y2RGeDBYSFJjZEZ4MEpDNWxlSFJsYm1Rb0pDNXpkVzF0WlhKdWIzUmxMbXhoYm1kYmJHOWpZV3hsWFN3Z2JHRnVaeWs3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgwcE8xeHVYSFJjZEgxY2JseHVYSFJjZEdsbUlDaHdiSFZuYVc0dWIzQjBhVzl1Y3lrZ2UxeHVYSFJjZEZ4MEpDNWxlSFJsYm1Rb0pDNXpkVzF0WlhKdWIzUmxMbTl3ZEdsdmJuTXNJSEJzZFdkcGJpNXZjSFJwYjI1ektUdGNibHgwWEhSOVhHNWNkSDA3WEc1Y2JseDBMeXBjYmx4MElDb2daWGgwWlc1a0lDUXVabTVjYmx4MElDb3ZYRzVjZENRdVptNHVaWGgwWlc1a0tIdGNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a1hHNWNkRngwSUNvZ1NXNXBkR2xoYkdsNlpTQnpkVzF0WlhKdWIzUmxYRzVjZEZ4MElDb2dJQzBnWTNKbFlYUmxJR1ZrYVhSdmNpQnNZWGx2ZFhRZ1lXNWtJR0YwZEdGamFDQk5iM1Z6WlNCaGJtUWdhMlY1WW05aGNtUWdaWFpsYm5SekxseHVYSFJjZENBcUlGeHVYSFJjZENBcUlHQmdZRnh1WEhSY2RDQXFJQ1FvWENJamMzVnRiV1Z5Ym05MFpWd2lLUzV6ZFcxdFpYSnViM1JsS0NCN0lHOXdkR2x2Ym5NZ0xpNTlJQ2s3WEc1Y2RGeDBJQ29nWUdCZ1hHNWNkRngwSUNvZ0lDQmNibHgwWEhRZ0tpQkFiV1Z0WW1WeUlDUXVabTVjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDlpYW1WamRIeFRkSEpwYm1kOUlHOXdkR2x2Ym5NZ2NtVm1aWEpsYm1ObElIUnZJQ1F1YzNWdGJXVnlibTkwWlM1dmNIUnBiMjV6WEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3ZEdocGMzMWNibHgwWEhRZ0tpOWNibHgwWEhSemRXMXRaWEp1YjNSbE9pQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFF2THlCamFHVmpheUJtYVhKemRDQmhjbWQxYldWdWRDZHpJSFI1Y0dWY2JseDBYSFJjZEM4dklDQXRJSHRUZEhKcGJtZDlPaUJGZUhSbGNtNWhiQ0JCVUVrZ1kyRnNiQ0I3ZTIxdlpIVnNaWDE5TG50N2JXVjBhRzlrZlgxY2JseDBYSFJjZEM4dklDQXRJSHRQWW1wbFkzUjlPaUJwYm1sMElHOXdkR2x2Ym5OY2JseDBYSFJjZEhaaGNpQjBlWEJsSUQwZ0pDNTBlWEJsS0d4cGMzUXVhR1ZoWkNoaGNtZDFiV1Z1ZEhNcEtUdGNibHgwWEhSY2RIWmhjaUJwYzBWNGRHVnlibUZzUVZCSlEyRnNiR1ZrSUQwZ2RIbHdaU0E5UFQwZ0ozTjBjbWx1WnljN1hHNWNkRngwWEhSMllYSWdhWE5KYm1sMFQzQjBhVzl1Y3lBOUlIUjVjR1VnUFQwOUlDZHZZbXBsWTNRbk8xeHVYRzVjZEZ4MFhIUXZMeUJsZUhSbGJtUWdaR1ZtWVhWc2RDQnZjSFJwYjI1eklIZHBkR2dnWTNWemRHOXRJSFZ6WlhJZ2IzQjBhVzl1YzF4dVhIUmNkRngwZG1GeUlHOXdkR2x2Ym5NZ1BTQnBjMGx1YVhSUGNIUnBiMjV6SUQ4Z2JHbHpkQzVvWldGa0tHRnlaM1Z0Wlc1MGN5a2dPaUI3ZlR0Y2JseDBYSFJjZEc5d2RHbHZibk1nUFNBa0xtVjRkR1Z1WkNoMGNuVmxMQ0I3ZlN3Z0pDNXpkVzF0WlhKdWIzUmxMbTl3ZEdsdmJuTXNJRzl3ZEdsdmJuTXBPMXh1WEc1Y2RGeDBYSFF2THlCSmJtTnNkV1JsSUd4aGJtZEpibVp2SUdsdUlHOXdkR2x2Ym5NZ1ptOXlJR3hoZEdWeUlIVnpaU3dnWlM1bkxpQm1iM0lnYVcxaFoyVWdaSEpoWnkxdUxXUnliM0JjYmx4MFhIUmNkQzh2SUZObGRIVndJR3hoYm1kMVlXZGxJR2x1Wm04Z2QybDBhQ0JsYmkxVlV5QmhjeUJrWldaaGRXeDBYRzVjZEZ4MFhIUnZjSFJwYjI1ekxteGhibWRKYm1adklEMGdKQzVsZUhSbGJtUW9kSEoxWlN3Z2UzMHNJQ1F1YzNWdGJXVnlibTkwWlM1c1lXNW5XeWRsYmkxVlV5ZGRMQ0FrTG5OMWJXMWxjbTV2ZEdVdWJHRnVaMXR2Y0hScGIyNXpMbXhoYm1kZEtUdGNibHh1WEhSY2RGeDBkR2hwY3k1bFlXTm9LR1oxYm1OMGFXOXVJQ2hwWkhnc0lHaHZiR1JsY2lrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnSkdodmJHUmxjaUE5SUNRb2FHOXNaR1Z5S1R0Y2JseHVYSFJjZEZ4MFhIUXZMeUJwWmlCc1lYbHZkWFFnYVhOdUozUWdZM0psWVhSbFpDQjVaWFFzSUdOeVpXRjBaVXhoZVc5MWRDQmhibVFnWVhSMFlXTm9JR1YyWlc1MGMxeHVYSFJjZEZ4MFhIUnBaaUFvSVhKbGJtUmxjbVZ5TG1oaGMwNXZkR1ZGWkdsMGIzSW9KR2h2YkdSbGNpa3BJSHRjYmx4MFhIUmNkRngwWEhSeVpXNWtaWEpsY2k1amNtVmhkR1ZNWVhsdmRYUW9KR2h2YkdSbGNpd2diM0IwYVc5dWN5azdYRzVjYmx4MFhIUmNkRngwWEhSMllYSWdiR0Y1YjNWMFNXNW1ieUE5SUhKbGJtUmxjbVZ5TG14aGVXOTFkRWx1Wm05R2NtOXRTRzlzWkdWeUtDUm9iMnhrWlhJcE8xeHVYRzVjZEZ4MFhIUmNkRngwWlhabGJuUklZVzVrYkdWeUxtRjBkR0ZqYUNoc1lYbHZkWFJKYm1adkxDQnZjSFJwYjI1ektUdGNibHgwWEhSY2RGeDBYSFJsZG1WdWRFaGhibVJzWlhJdVlYUjBZV05vUTNWemRHOXRSWFpsYm5Rb2JHRjViM1YwU1c1bWJ5d2diM0IwYVc5dWN5azdYRzVjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RDOHZJR05oYkd4aVlXTnJJRzl1SUdsdWFYUmNibHgwWEhSY2RHbG1JQ2doYVhORmVIUmxjbTVoYkVGUVNVTmhiR3hsWkNBbUppQjBhR2x6TG14bGJtZDBhQ0FtSmlCdmNIUnBiMjV6TG05dWFXNXBkQ2tnZTF4dVhIUmNkRngwWEhSdmNIUnBiMjV6TG05dWFXNXBkQ2dwTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSMllYSWdKR1pwY25OMElEMGdkR2hwY3k1bWFYSnpkQ2dwTzF4dVhIUmNkRngwYVdZZ0tDUm1hWEp6ZEM1c1pXNW5kR2dwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJR3hoZVc5MWRFbHVabThnUFNCeVpXNWtaWEpsY2k1c1lYbHZkWFJKYm1adlJuSnZiVWh2YkdSbGNpZ2tabWx5YzNRcE8xeHVYRzVjZEZ4MFhIUmNkQzh2SUdWNGRHVnlibUZzSUVGUVNWeHVYSFJjZEZ4MFhIUnBaaUFvYVhORmVIUmxjbTVoYkVGUVNVTmhiR3hsWkNrZ2UxeHVYSFJjZEZ4MFhIUmNkSFpoY2lCdGIyUjFiR1ZCYm1STlpYUm9iMlFnUFNCc2FYTjBMbWhsWVdRb2JHbHpkQzVtY205dEtHRnlaM1Z0Wlc1MGN5a3BPMXh1WEhSY2RGeDBYSFJjZEhaaGNpQmhjbWR6SUQwZ2JHbHpkQzUwWVdsc0tHeHBjM1F1Wm5KdmJTaGhjbWQxYldWdWRITXBLVHRjYmx4dVhIUmNkRngwWEhSY2RDOHZJRlJQUkU4Z2JtOTNJR1Y0ZEdWeWJtRnNJRUZRU1NCdmJteDVJSGR2Y210eklHWnZjaUJsWkdsMGIzSmNibHgwWEhSY2RGeDBYSFIyWVhJZ2NHRnlZVzF6SUQwZ1cyMXZaSFZzWlVGdVpFMWxkR2h2WkN3Z2JHRjViM1YwU1c1bWJ5NWxaR2wwWVdKc1pTZ3BYUzVqYjI1allYUW9ZWEpuY3lrN1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlHVjJaVzUwU0dGdVpHeGxjaTVwYm5admEyVXVZWEJ3Ykhrb1pYWmxiblJJWVc1a2JHVnlMQ0J3WVhKaGJYTXBPMXh1WEhSY2RGeDBYSFI5SUdWc2MyVWdhV1lnS0c5d2RHbHZibk11Wm05amRYTXBJSHRjYmx4MFhIUmNkRngwWEhRdkx5Qm1iMk4xY3lCdmJpQm1hWEp6ZENCbFpHbDBZV0pzWlNCbGJHVnRaVzUwSUdadmNpQnBibWwwYVdGc2FYcGxJR1ZrYVhSdmNseHVYSFJjZEZ4MFhIUmNkR3hoZVc5MWRFbHVabTh1WldScGRHRmliR1VvS1M1bWIyTjFjeWdwTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RISmxkSFZ5YmlCMGFHbHpPMXh1WEhSY2RIMHNYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJRnh1WEhSY2RDQXFJRnh1WEhSY2RDQXFJR2RsZENCMGFHVWdTRlJOVENCamIyNTBaVzUwY3lCdlppQnViM1JsSUc5eUlITmxkQ0IwYUdVZ1NGUk5UQ0JqYjI1MFpXNTBjeUJ2WmlCdWIzUmxMbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dLaUJuWlhRZ1kyOXVkR1Z1ZEhNZ1hHNWNkRngwSUNvZ1lHQmdYRzVjZEZ4MElDb2dkbUZ5SUdOdmJuUmxiblFnUFNBa0tGd2lJM04xYlcxbGNtNXZkR1ZjSWlrdVkyOWtaU2dwTzF4dVhIUmNkQ0FxSUdCZ1lGeHVYSFJjZENBcUlDb2djMlYwSUdOdmJuUmxiblJ6SUZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nWUdCZ1hHNWNkRngwSUNvZ0pDaGNJaU56ZFcxdFpYSnViM1JsWENJcExtTnZaR1VvYUhSdGJDazdYRzVjZEZ4MElDb2dZR0JnWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBYldWdFltVnlJQ1F1Wm00Z1hHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUZ0b2RHMXNYU0F0SUVoVVRVd2dZMjl1ZEdWdWRITW9iM0IwYVc5dVlXd3NJSE5sZENsY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0MGFHbHpmRk4wY21sdVozMGdMU0JqYjI1MFpYaDBLSE5sZENrZ2IzSWdTRlJOVENCamIyNTBaVzUwY3lCdlppQnViM1JsS0dkbGRDa3VYRzVjZEZ4MElDb3ZYRzVjZEZ4MFkyOWtaVG9nWm5WdVkzUnBiMjRnS0doMGJXd3BJSHRjYmx4MFhIUmNkQzh2SUdkbGRDQjBhR1VnU0ZSTlRDQmpiMjUwWlc1MGN5QnZaaUJ1YjNSbFhHNWNkRngwWEhScFppQW9hSFJ0YkNBOVBUMGdkVzVrWldacGJtVmtLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQWthRzlzWkdWeUlEMGdkR2hwY3k1bWFYSnpkQ2dwTzF4dVhIUmNkRngwWEhScFppQW9JU1JvYjJ4a1pYSXViR1Z1WjNSb0tTQjdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MGRtRnlJR3hoZVc5MWRFbHVabThnUFNCeVpXNWtaWEpsY2k1c1lYbHZkWFJKYm1adlJuSnZiVWh2YkdSbGNpZ2thRzlzWkdWeUtUdGNibHgwWEhSY2RGeDBkbUZ5SUNSbFpHbDBZV0pzWlNBOUlHeGhlVzkxZEVsdVptOGdKaVlnYkdGNWIzVjBTVzVtYnk1bFpHbDBZV0pzWlNncE8xeHVYRzVjZEZ4MFhIUmNkR2xtSUNna1pXUnBkR0ZpYkdVZ0ppWWdKR1ZrYVhSaFlteGxMbXhsYm1kMGFDa2dlMXh1WEhSY2RGeDBYSFJjZEhaaGNpQnBjME52WkdWMmFXVjNJRDBnWlhabGJuUklZVzVrYkdWeUxtbHVkbTlyWlNnblkyOWtaWFpwWlhjdWFYTkJZM1JwZG1GMFpXUW5MQ0JzWVhsdmRYUkpibVp2S1R0Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZEVoaGJtUnNaWEl1YVc1MmIydGxLQ2RqYjJSbGRtbGxkeTV6ZVc1akp5d2diR0Y1YjNWMFNXNW1ieWs3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUdselEyOWtaWFpwWlhjZ1B5QnNZWGx2ZFhSSmJtWnZMbU52WkdGaWJHVW9LUzUyWVd3b0tTQTZYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEd4aGVXOTFkRWx1Wm04dVpXUnBkR0ZpYkdVb0tTNW9kRzFzS0NrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBjbVYwZFhKdUlHUnZiUzVwYzFSbGVIUmhjbVZoS0NSb2IyeGtaWEpiTUYwcElEOGdKR2h2YkdSbGNpNTJZV3dvS1NBNklDUm9iMnhrWlhJdWFIUnRiQ2dwTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5QnpaWFFnZEdobElFaFVUVXdnWTI5dWRHVnVkSE1nYjJZZ2JtOTBaVnh1WEhSY2RGeDBkR2hwY3k1bFlXTm9LR1oxYm1OMGFXOXVJQ2hwTENCb2IyeGtaWElwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJR3hoZVc5MWRFbHVabThnUFNCeVpXNWtaWEpsY2k1c1lYbHZkWFJKYm1adlJuSnZiVWh2YkdSbGNpZ2tLR2h2YkdSbGNpa3BPMXh1WEhSY2RGeDBYSFIyWVhJZ0pHVmthWFJoWW14bElEMGdiR0Y1YjNWMFNXNW1ieUFtSmlCc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDazdYRzVjZEZ4MFhIUmNkR2xtSUNna1pXUnBkR0ZpYkdVcElIdGNibHgwWEhSY2RGeDBYSFFrWldScGRHRmliR1V1YUhSdGJDaG9kRzFzS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQjBhR2x6TzF4dVhIUmNkSDBzWEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrWEc1Y2RGeDBJQ29nWEc1Y2RGeDBJQ29nWkdWemRISnZlU0JGWkdsMGIzSWdUR0Y1YjNWMElHRnVaQ0JrWlhSaFkyZ2dTMlY1SUdGdVpDQk5iM1Z6WlNCRmRtVnVkRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRRzFsYldKbGNpQWtMbVp1WEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3ZEdocGMzMWNibHgwWEhRZ0tpOWNibHgwWEhSa1pYTjBjbTk1T2lCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUjBhR2x6TG1WaFkyZ29ablZ1WTNScGIyNGdLR2xrZUN3Z2FHOXNaR1Z5S1NCN1hHNWNkRngwWEhSY2RIWmhjaUFrYUc5c1pHVnlJRDBnSkNob2IyeGtaWElwTzF4dVhHNWNkRngwWEhSY2RHbG1JQ2doY21WdVpHVnlaWEl1YUdGelRtOTBaVVZrYVhSdmNpZ2thRzlzWkdWeUtTa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnlianRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RIWmhjaUJwYm1adklEMGdjbVZ1WkdWeVpYSXViR0Y1YjNWMFNXNW1iMFp5YjIxSWIyeGtaWElvSkdodmJHUmxjaWs3WEc1Y2RGeDBYSFJjZEhaaGNpQnZjSFJwYjI1eklEMGdhVzVtYnk1bFpHbDBiM0lvS1M1a1lYUmhLQ2R2Y0hScGIyNXpKeWs3WEc1Y2JseDBYSFJjZEZ4MFpYWmxiblJJWVc1a2JHVnlMbVJsZEdGamFDaHBibVp2TENCdmNIUnBiMjV6S1R0Y2JseDBYSFJjZEZ4MGNtVnVaR1Z5WlhJdWNtVnRiM1psVEdGNWIzVjBLQ1JvYjJ4a1pYSXNJR2x1Wm04c0lHOXdkR2x2Ym5NcE8xeHVYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQjBhR2x6TzF4dVhIUmNkSDFjYmx4MGZTazdYRzU5S1NrN1hHNWNibjBwTG1OaGJHd29aMnh2WW1Gc0xDQnRiMlIxYkdVc0lIVnVaR1ZtYVc1bFpDd2dkVzVrWldacGJtVmtLVHRjYmlKZGZRPT0iLCIvLyBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCB2aWEgdGhlIGBjb21tb25qc2AgR3J1bnQgdGFzay4gWW91IGNhbiByZXF1aXJlKCkgdGhpcyBmaWxlIGluIGEgQ29tbW9uSlMgZW52aXJvbm1lbnQuXG5yZXF1aXJlKCcuLi8uLi9qcy90cmFuc2l0aW9uLmpzJylcbnJlcXVpcmUoJy4uLy4uL2pzL2FsZXJ0LmpzJylcbnJlcXVpcmUoJy4uLy4uL2pzL2J1dHRvbi5qcycpXG5yZXF1aXJlKCcuLi8uLi9qcy9jYXJvdXNlbC5qcycpXG5yZXF1aXJlKCcuLi8uLi9qcy9jb2xsYXBzZS5qcycpXG5yZXF1aXJlKCcuLi8uLi9qcy9kcm9wZG93bi5qcycpXG5yZXF1aXJlKCcuLi8uLi9qcy9tb2RhbC5qcycpXG5yZXF1aXJlKCcuLi8uLi9qcy90b29sdGlwLmpzJylcbnJlcXVpcmUoJy4uLy4uL2pzL3BvcG92ZXIuanMnKVxucmVxdWlyZSgnLi4vLi4vanMvc2Nyb2xsc3B5LmpzJylcbnJlcXVpcmUoJy4uLy4uL2pzL3RhYi5qcycpXG5yZXF1aXJlKCcuLi8uLi9qcy9hZmZpeC5qcycpIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCb290c3RyYXA6IGFmZml4LmpzIHYzLjMuN1xuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jYWZmaXhcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBBRkZJWCBDTEFTUyBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgQWZmaXggPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBBZmZpeC5ERUZBVUxUUywgb3B0aW9ucylcblxuICAgIHRoaXMuJHRhcmdldCA9ICQodGhpcy5vcHRpb25zLnRhcmdldClcbiAgICAgIC5vbignc2Nyb2xsLmJzLmFmZml4LmRhdGEtYXBpJywgJC5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb24sIHRoaXMpKVxuICAgICAgLm9uKCdjbGljay5icy5hZmZpeC5kYXRhLWFwaScsICAkLnByb3h5KHRoaXMuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3AsIHRoaXMpKVxuXG4gICAgdGhpcy4kZWxlbWVudCAgICAgPSAkKGVsZW1lbnQpXG4gICAgdGhpcy5hZmZpeGVkICAgICAgPSBudWxsXG4gICAgdGhpcy51bnBpbiAgICAgICAgPSBudWxsXG4gICAgdGhpcy5waW5uZWRPZmZzZXQgPSBudWxsXG5cbiAgICB0aGlzLmNoZWNrUG9zaXRpb24oKVxuICB9XG5cbiAgQWZmaXguVkVSU0lPTiAgPSAnMy4zLjcnXG5cbiAgQWZmaXguUkVTRVQgICAgPSAnYWZmaXggYWZmaXgtdG9wIGFmZml4LWJvdHRvbSdcblxuICBBZmZpeC5ERUZBVUxUUyA9IHtcbiAgICBvZmZzZXQ6IDAsXG4gICAgdGFyZ2V0OiB3aW5kb3dcbiAgfVxuXG4gIEFmZml4LnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uIChzY3JvbGxIZWlnaHQsIGhlaWdodCwgb2Zmc2V0VG9wLCBvZmZzZXRCb3R0b20pIHtcbiAgICB2YXIgc2Nyb2xsVG9wICAgID0gdGhpcy4kdGFyZ2V0LnNjcm9sbFRvcCgpXG4gICAgdmFyIHBvc2l0aW9uICAgICA9IHRoaXMuJGVsZW1lbnQub2Zmc2V0KClcbiAgICB2YXIgdGFyZ2V0SGVpZ2h0ID0gdGhpcy4kdGFyZ2V0LmhlaWdodCgpXG5cbiAgICBpZiAob2Zmc2V0VG9wICE9IG51bGwgJiYgdGhpcy5hZmZpeGVkID09ICd0b3AnKSByZXR1cm4gc2Nyb2xsVG9wIDwgb2Zmc2V0VG9wID8gJ3RvcCcgOiBmYWxzZVxuXG4gICAgaWYgKHRoaXMuYWZmaXhlZCA9PSAnYm90dG9tJykge1xuICAgICAgaWYgKG9mZnNldFRvcCAhPSBudWxsKSByZXR1cm4gKHNjcm9sbFRvcCArIHRoaXMudW5waW4gPD0gcG9zaXRpb24udG9wKSA/IGZhbHNlIDogJ2JvdHRvbSdcbiAgICAgIHJldHVybiAoc2Nyb2xsVG9wICsgdGFyZ2V0SGVpZ2h0IDw9IHNjcm9sbEhlaWdodCAtIG9mZnNldEJvdHRvbSkgPyBmYWxzZSA6ICdib3R0b20nXG4gICAgfVxuXG4gICAgdmFyIGluaXRpYWxpemluZyAgID0gdGhpcy5hZmZpeGVkID09IG51bGxcbiAgICB2YXIgY29sbGlkZXJUb3AgICAgPSBpbml0aWFsaXppbmcgPyBzY3JvbGxUb3AgOiBwb3NpdGlvbi50b3BcbiAgICB2YXIgY29sbGlkZXJIZWlnaHQgPSBpbml0aWFsaXppbmcgPyB0YXJnZXRIZWlnaHQgOiBoZWlnaHRcblxuICAgIGlmIChvZmZzZXRUb3AgIT0gbnVsbCAmJiBzY3JvbGxUb3AgPD0gb2Zmc2V0VG9wKSByZXR1cm4gJ3RvcCdcbiAgICBpZiAob2Zmc2V0Qm90dG9tICE9IG51bGwgJiYgKGNvbGxpZGVyVG9wICsgY29sbGlkZXJIZWlnaHQgPj0gc2Nyb2xsSGVpZ2h0IC0gb2Zmc2V0Qm90dG9tKSkgcmV0dXJuICdib3R0b20nXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIEFmZml4LnByb3RvdHlwZS5nZXRQaW5uZWRPZmZzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMucGlubmVkT2Zmc2V0KSByZXR1cm4gdGhpcy5waW5uZWRPZmZzZXRcbiAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKEFmZml4LlJFU0VUKS5hZGRDbGFzcygnYWZmaXgnKVxuICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLiR0YXJnZXQuc2Nyb2xsVG9wKClcbiAgICB2YXIgcG9zaXRpb24gID0gdGhpcy4kZWxlbWVudC5vZmZzZXQoKVxuICAgIHJldHVybiAodGhpcy5waW5uZWRPZmZzZXQgPSBwb3NpdGlvbi50b3AgLSBzY3JvbGxUb3ApXG4gIH1cblxuICBBZmZpeC5wcm90b3R5cGUuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dCgkLnByb3h5KHRoaXMuY2hlY2tQb3NpdGlvbiwgdGhpcyksIDEpXG4gIH1cblxuICBBZmZpeC5wcm90b3R5cGUuY2hlY2tQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuJGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHJldHVyblxuXG4gICAgdmFyIGhlaWdodCAgICAgICA9IHRoaXMuJGVsZW1lbnQuaGVpZ2h0KClcbiAgICB2YXIgb2Zmc2V0ICAgICAgID0gdGhpcy5vcHRpb25zLm9mZnNldFxuICAgIHZhciBvZmZzZXRUb3AgICAgPSBvZmZzZXQudG9wXG4gICAgdmFyIG9mZnNldEJvdHRvbSA9IG9mZnNldC5ib3R0b21cbiAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gTWF0aC5tYXgoJChkb2N1bWVudCkuaGVpZ2h0KCksICQoZG9jdW1lbnQuYm9keSkuaGVpZ2h0KCkpXG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCAhPSAnb2JqZWN0JykgICAgICAgICBvZmZzZXRCb3R0b20gPSBvZmZzZXRUb3AgPSBvZmZzZXRcbiAgICBpZiAodHlwZW9mIG9mZnNldFRvcCA9PSAnZnVuY3Rpb24nKSAgICBvZmZzZXRUb3AgICAgPSBvZmZzZXQudG9wKHRoaXMuJGVsZW1lbnQpXG4gICAgaWYgKHR5cGVvZiBvZmZzZXRCb3R0b20gPT0gJ2Z1bmN0aW9uJykgb2Zmc2V0Qm90dG9tID0gb2Zmc2V0LmJvdHRvbSh0aGlzLiRlbGVtZW50KVxuXG4gICAgdmFyIGFmZml4ID0gdGhpcy5nZXRTdGF0ZShzY3JvbGxIZWlnaHQsIGhlaWdodCwgb2Zmc2V0VG9wLCBvZmZzZXRCb3R0b20pXG5cbiAgICBpZiAodGhpcy5hZmZpeGVkICE9IGFmZml4KSB7XG4gICAgICBpZiAodGhpcy51bnBpbiAhPSBudWxsKSB0aGlzLiRlbGVtZW50LmNzcygndG9wJywgJycpXG5cbiAgICAgIHZhciBhZmZpeFR5cGUgPSAnYWZmaXgnICsgKGFmZml4ID8gJy0nICsgYWZmaXggOiAnJylcbiAgICAgIHZhciBlICAgICAgICAgPSAkLkV2ZW50KGFmZml4VHlwZSArICcuYnMuYWZmaXgnKVxuXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSlcblxuICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgICB0aGlzLmFmZml4ZWQgPSBhZmZpeFxuICAgICAgdGhpcy51bnBpbiA9IGFmZml4ID09ICdib3R0b20nID8gdGhpcy5nZXRQaW5uZWRPZmZzZXQoKSA6IG51bGxcblxuICAgICAgdGhpcy4kZWxlbWVudFxuICAgICAgICAucmVtb3ZlQ2xhc3MoQWZmaXguUkVTRVQpXG4gICAgICAgIC5hZGRDbGFzcyhhZmZpeFR5cGUpXG4gICAgICAgIC50cmlnZ2VyKGFmZml4VHlwZS5yZXBsYWNlKCdhZmZpeCcsICdhZmZpeGVkJykgKyAnLmJzLmFmZml4JylcbiAgICB9XG5cbiAgICBpZiAoYWZmaXggPT0gJ2JvdHRvbScpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQub2Zmc2V0KHtcbiAgICAgICAgdG9wOiBzY3JvbGxIZWlnaHQgLSBoZWlnaHQgLSBvZmZzZXRCb3R0b21cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cblxuICAvLyBBRkZJWCBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkdGhpcyAgID0gJCh0aGlzKVxuICAgICAgdmFyIGRhdGEgICAgPSAkdGhpcy5kYXRhKCdicy5hZmZpeCcpXG4gICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXG5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMuYWZmaXgnLCAoZGF0YSA9IG5ldyBBZmZpeCh0aGlzLCBvcHRpb25zKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG9sZCA9ICQuZm4uYWZmaXhcblxuICAkLmZuLmFmZml4ICAgICAgICAgICAgID0gUGx1Z2luXG4gICQuZm4uYWZmaXguQ29uc3RydWN0b3IgPSBBZmZpeFxuXG5cbiAgLy8gQUZGSVggTk8gQ09ORkxJQ1RcbiAgLy8gPT09PT09PT09PT09PT09PT1cblxuICAkLmZuLmFmZml4Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi5hZmZpeCA9IG9sZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIC8vIEFGRklYIERBVEEtQVBJXG4gIC8vID09PT09PT09PT09PT09XG5cbiAgJCh3aW5kb3cpLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICQoJ1tkYXRhLXNweT1cImFmZml4XCJdJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHNweSA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhID0gJHNweS5kYXRhKClcblxuICAgICAgZGF0YS5vZmZzZXQgPSBkYXRhLm9mZnNldCB8fCB7fVxuXG4gICAgICBpZiAoZGF0YS5vZmZzZXRCb3R0b20gIT0gbnVsbCkgZGF0YS5vZmZzZXQuYm90dG9tID0gZGF0YS5vZmZzZXRCb3R0b21cbiAgICAgIGlmIChkYXRhLm9mZnNldFRvcCAgICAhPSBudWxsKSBkYXRhLm9mZnNldC50b3AgICAgPSBkYXRhLm9mZnNldFRvcFxuXG4gICAgICBQbHVnaW4uY2FsbCgkc3B5LCBkYXRhKVxuICAgIH0pXG4gIH0pXG5cbn0oalF1ZXJ5KTtcbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiBhbGVydC5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI2FsZXJ0c1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4rZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIEFMRVJUIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBkaXNtaXNzID0gJ1tkYXRhLWRpc21pc3M9XCJhbGVydFwiXSdcbiAgdmFyIEFsZXJ0ICAgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAkKGVsKS5vbignY2xpY2snLCBkaXNtaXNzLCB0aGlzLmNsb3NlKVxuICB9XG5cbiAgQWxlcnQuVkVSU0lPTiA9ICczLjMuNydcblxuICBBbGVydC5UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwXG5cbiAgQWxlcnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgJHRoaXMgICAgPSAkKHRoaXMpXG4gICAgdmFyIHNlbGVjdG9yID0gJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKVxuXG4gICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdocmVmJylcbiAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IgJiYgc2VsZWN0b3IucmVwbGFjZSgvLiooPz0jW15cXHNdKiQpLywgJycpIC8vIHN0cmlwIGZvciBpZTdcbiAgICB9XG5cbiAgICB2YXIgJHBhcmVudCA9ICQoc2VsZWN0b3IgPT09ICcjJyA/IFtdIDogc2VsZWN0b3IpXG5cbiAgICBpZiAoZSkgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICBpZiAoISRwYXJlbnQubGVuZ3RoKSB7XG4gICAgICAkcGFyZW50ID0gJHRoaXMuY2xvc2VzdCgnLmFsZXJ0JylcbiAgICB9XG5cbiAgICAkcGFyZW50LnRyaWdnZXIoZSA9ICQuRXZlbnQoJ2Nsb3NlLmJzLmFsZXJ0JykpXG5cbiAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXG5cbiAgICAkcGFyZW50LnJlbW92ZUNsYXNzKCdpbicpXG5cbiAgICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KCkge1xuICAgICAgLy8gZGV0YWNoIGZyb20gcGFyZW50LCBmaXJlIGV2ZW50IHRoZW4gY2xlYW4gdXAgZGF0YVxuICAgICAgJHBhcmVudC5kZXRhY2goKS50cmlnZ2VyKCdjbG9zZWQuYnMuYWxlcnQnKS5yZW1vdmUoKVxuICAgIH1cblxuICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmICRwYXJlbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/XG4gICAgICAkcGFyZW50XG4gICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIHJlbW92ZUVsZW1lbnQpXG4gICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChBbGVydC5UUkFOU0lUSU9OX0RVUkFUSU9OKSA6XG4gICAgICByZW1vdmVFbGVtZW50KClcbiAgfVxuXG5cbiAgLy8gQUxFUlQgUExVR0lOIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgPSAkdGhpcy5kYXRhKCdicy5hbGVydCcpXG5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMuYWxlcnQnLCAoZGF0YSA9IG5ldyBBbGVydCh0aGlzKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dLmNhbGwoJHRoaXMpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLmFsZXJ0XG5cbiAgJC5mbi5hbGVydCAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLmFsZXJ0LkNvbnN0cnVjdG9yID0gQWxlcnRcblxuXG4gIC8vIEFMRVJUIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5hbGVydC5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm4uYWxlcnQgPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBBTEVSVCBEQVRBLUFQSVxuICAvLyA9PT09PT09PT09PT09PVxuXG4gICQoZG9jdW1lbnQpLm9uKCdjbGljay5icy5hbGVydC5kYXRhLWFwaScsIGRpc21pc3MsIEFsZXJ0LnByb3RvdHlwZS5jbG9zZSlcblxufShqUXVlcnkpO1xuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCb290c3RyYXA6IGJ1dHRvbi5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI2J1dHRvbnNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBCVVRUT04gUFVCTElDIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIEJ1dHRvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCAgPSAkKGVsZW1lbnQpXG4gICAgdGhpcy5vcHRpb25zICAgPSAkLmV4dGVuZCh7fSwgQnV0dG9uLkRFRkFVTFRTLCBvcHRpb25zKVxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcbiAgfVxuXG4gIEJ1dHRvbi5WRVJTSU9OICA9ICczLjMuNydcblxuICBCdXR0b24uREVGQVVMVFMgPSB7XG4gICAgbG9hZGluZ1RleHQ6ICdsb2FkaW5nLi4uJ1xuICB9XG5cbiAgQnV0dG9uLnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgIHZhciBkICAgID0gJ2Rpc2FibGVkJ1xuICAgIHZhciAkZWwgID0gdGhpcy4kZWxlbWVudFxuICAgIHZhciB2YWwgID0gJGVsLmlzKCdpbnB1dCcpID8gJ3ZhbCcgOiAnaHRtbCdcbiAgICB2YXIgZGF0YSA9ICRlbC5kYXRhKClcblxuICAgIHN0YXRlICs9ICdUZXh0J1xuXG4gICAgaWYgKGRhdGEucmVzZXRUZXh0ID09IG51bGwpICRlbC5kYXRhKCdyZXNldFRleHQnLCAkZWxbdmFsXSgpKVxuXG4gICAgLy8gcHVzaCB0byBldmVudCBsb29wIHRvIGFsbG93IGZvcm1zIHRvIHN1Ym1pdFxuICAgIHNldFRpbWVvdXQoJC5wcm94eShmdW5jdGlvbiAoKSB7XG4gICAgICAkZWxbdmFsXShkYXRhW3N0YXRlXSA9PSBudWxsID8gdGhpcy5vcHRpb25zW3N0YXRlXSA6IGRhdGFbc3RhdGVdKVxuXG4gICAgICBpZiAoc3RhdGUgPT0gJ2xvYWRpbmdUZXh0Jykge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcbiAgICAgICAgJGVsLmFkZENsYXNzKGQpLmF0dHIoZCwgZCkucHJvcChkLCB0cnVlKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTG9hZGluZykge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICRlbC5yZW1vdmVDbGFzcyhkKS5yZW1vdmVBdHRyKGQpLnByb3AoZCwgZmFsc2UpXG4gICAgICB9XG4gICAgfSwgdGhpcyksIDApXG4gIH1cblxuICBCdXR0b24ucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2hhbmdlZCA9IHRydWVcbiAgICB2YXIgJHBhcmVudCA9IHRoaXMuJGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtdG9nZ2xlPVwiYnV0dG9uc1wiXScpXG5cbiAgICBpZiAoJHBhcmVudC5sZW5ndGgpIHtcbiAgICAgIHZhciAkaW5wdXQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJ2lucHV0JylcbiAgICAgIGlmICgkaW5wdXQucHJvcCgndHlwZScpID09ICdyYWRpbycpIHtcbiAgICAgICAgaWYgKCRpbnB1dC5wcm9wKCdjaGVja2VkJykpIGNoYW5nZWQgPSBmYWxzZVxuICAgICAgICAkcGFyZW50LmZpbmQoJy5hY3RpdmUnKS5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICAgICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcygnYWN0aXZlJylcbiAgICAgIH0gZWxzZSBpZiAoJGlucHV0LnByb3AoJ3R5cGUnKSA9PSAnY2hlY2tib3gnKSB7XG4gICAgICAgIGlmICgoJGlucHV0LnByb3AoJ2NoZWNrZWQnKSkgIT09IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2FjdGl2ZScpKSBjaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcygnYWN0aXZlJylcbiAgICAgIH1cbiAgICAgICRpbnB1dC5wcm9wKCdjaGVja2VkJywgdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnYWN0aXZlJykpXG4gICAgICBpZiAoY2hhbmdlZCkgJGlucHV0LnRyaWdnZXIoJ2NoYW5nZScpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQuYXR0cignYXJpYS1wcmVzc2VkJywgIXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2FjdGl2ZScpKVxuICAgICAgdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcygnYWN0aXZlJylcbiAgICB9XG4gIH1cblxuXG4gIC8vIEJVVFRPTiBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMuYnV0dG9uJylcbiAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cblxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdicy5idXR0b24nLCAoZGF0YSA9IG5ldyBCdXR0b24odGhpcywgb3B0aW9ucykpKVxuXG4gICAgICBpZiAob3B0aW9uID09ICd0b2dnbGUnKSBkYXRhLnRvZ2dsZSgpXG4gICAgICBlbHNlIGlmIChvcHRpb24pIGRhdGEuc2V0U3RhdGUob3B0aW9uKVxuICAgIH0pXG4gIH1cblxuICB2YXIgb2xkID0gJC5mbi5idXR0b25cblxuICAkLmZuLmJ1dHRvbiAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLmJ1dHRvbi5Db25zdHJ1Y3RvciA9IEJ1dHRvblxuXG5cbiAgLy8gQlVUVE9OIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09PVxuXG4gICQuZm4uYnV0dG9uLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi5idXR0b24gPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBCVVRUT04gREFUQS1BUElcbiAgLy8gPT09PT09PT09PT09PT09XG5cbiAgJChkb2N1bWVudClcbiAgICAub24oJ2NsaWNrLmJzLmJ1dHRvbi5kYXRhLWFwaScsICdbZGF0YS10b2dnbGVePVwiYnV0dG9uXCJdJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciAkYnRuID0gJChlLnRhcmdldCkuY2xvc2VzdCgnLmJ0bicpXG4gICAgICBQbHVnaW4uY2FsbCgkYnRuLCAndG9nZ2xlJylcbiAgICAgIGlmICghKCQoZS50YXJnZXQpLmlzKCdpbnB1dFt0eXBlPVwicmFkaW9cIl0sIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpKSkge1xuICAgICAgICAvLyBQcmV2ZW50IGRvdWJsZSBjbGljayBvbiByYWRpb3MsIGFuZCB0aGUgZG91YmxlIHNlbGVjdGlvbnMgKHNvIGNhbmNlbGxhdGlvbikgb24gY2hlY2tib3hlc1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgLy8gVGhlIHRhcmdldCBjb21wb25lbnQgc3RpbGwgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICAgICAgaWYgKCRidG4uaXMoJ2lucHV0LGJ1dHRvbicpKSAkYnRuLnRyaWdnZXIoJ2ZvY3VzJylcbiAgICAgICAgZWxzZSAkYnRuLmZpbmQoJ2lucHV0OnZpc2libGUsYnV0dG9uOnZpc2libGUnKS5maXJzdCgpLnRyaWdnZXIoJ2ZvY3VzJylcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbignZm9jdXMuYnMuYnV0dG9uLmRhdGEtYXBpIGJsdXIuYnMuYnV0dG9uLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZV49XCJidXR0b25cIl0nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgJChlLnRhcmdldCkuY2xvc2VzdCgnLmJ0bicpLnRvZ2dsZUNsYXNzKCdmb2N1cycsIC9eZm9jdXMoaW4pPyQvLnRlc3QoZS50eXBlKSlcbiAgICB9KVxuXG59KGpRdWVyeSk7XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogY2Fyb3VzZWwuanMgdjMuMy43XG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNjYXJvdXNlbFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4rZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIENBUk9VU0VMIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBDYXJvdXNlbCA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCAgICA9ICQoZWxlbWVudClcbiAgICB0aGlzLiRpbmRpY2F0b3JzID0gdGhpcy4kZWxlbWVudC5maW5kKCcuY2Fyb3VzZWwtaW5kaWNhdG9ycycpXG4gICAgdGhpcy5vcHRpb25zICAgICA9IG9wdGlvbnNcbiAgICB0aGlzLnBhdXNlZCAgICAgID0gbnVsbFxuICAgIHRoaXMuc2xpZGluZyAgICAgPSBudWxsXG4gICAgdGhpcy5pbnRlcnZhbCAgICA9IG51bGxcbiAgICB0aGlzLiRhY3RpdmUgICAgID0gbnVsbFxuICAgIHRoaXMuJGl0ZW1zICAgICAgPSBudWxsXG5cbiAgICB0aGlzLm9wdGlvbnMua2V5Ym9hcmQgJiYgdGhpcy4kZWxlbWVudC5vbigna2V5ZG93bi5icy5jYXJvdXNlbCcsICQucHJveHkodGhpcy5rZXlkb3duLCB0aGlzKSlcblxuICAgIHRoaXMub3B0aW9ucy5wYXVzZSA9PSAnaG92ZXInICYmICEoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSAmJiB0aGlzLiRlbGVtZW50XG4gICAgICAub24oJ21vdXNlZW50ZXIuYnMuY2Fyb3VzZWwnLCAkLnByb3h5KHRoaXMucGF1c2UsIHRoaXMpKVxuICAgICAgLm9uKCdtb3VzZWxlYXZlLmJzLmNhcm91c2VsJywgJC5wcm94eSh0aGlzLmN5Y2xlLCB0aGlzKSlcbiAgfVxuXG4gIENhcm91c2VsLlZFUlNJT04gID0gJzMuMy43J1xuXG4gIENhcm91c2VsLlRSQU5TSVRJT05fRFVSQVRJT04gPSA2MDBcblxuICBDYXJvdXNlbC5ERUZBVUxUUyA9IHtcbiAgICBpbnRlcnZhbDogNTAwMCxcbiAgICBwYXVzZTogJ2hvdmVyJyxcbiAgICB3cmFwOiB0cnVlLFxuICAgIGtleWJvYXJkOiB0cnVlXG4gIH1cblxuICBDYXJvdXNlbC5wcm90b3R5cGUua2V5ZG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZS50YXJnZXQudGFnTmFtZSkpIHJldHVyblxuICAgIHN3aXRjaCAoZS53aGljaCkge1xuICAgICAgY2FzZSAzNzogdGhpcy5wcmV2KCk7IGJyZWFrXG4gICAgICBjYXNlIDM5OiB0aGlzLm5leHQoKTsgYnJlYWtcbiAgICAgIGRlZmF1bHQ6IHJldHVyblxuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmN5Y2xlID0gZnVuY3Rpb24gKGUpIHtcbiAgICBlIHx8ICh0aGlzLnBhdXNlZCA9IGZhbHNlKVxuXG4gICAgdGhpcy5pbnRlcnZhbCAmJiBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpXG5cbiAgICB0aGlzLm9wdGlvbnMuaW50ZXJ2YWxcbiAgICAgICYmICF0aGlzLnBhdXNlZFxuICAgICAgJiYgKHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgkLnByb3h5KHRoaXMubmV4dCwgdGhpcyksIHRoaXMub3B0aW9ucy5pbnRlcnZhbCkpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmdldEl0ZW1JbmRleCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdGhpcy4kaXRlbXMgPSBpdGVtLnBhcmVudCgpLmNoaWxkcmVuKCcuaXRlbScpXG4gICAgcmV0dXJuIHRoaXMuJGl0ZW1zLmluZGV4KGl0ZW0gfHwgdGhpcy4kYWN0aXZlKVxuICB9XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmdldEl0ZW1Gb3JEaXJlY3Rpb24gPSBmdW5jdGlvbiAoZGlyZWN0aW9uLCBhY3RpdmUpIHtcbiAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLmdldEl0ZW1JbmRleChhY3RpdmUpXG4gICAgdmFyIHdpbGxXcmFwID0gKGRpcmVjdGlvbiA9PSAncHJldicgJiYgYWN0aXZlSW5kZXggPT09IDApXG4gICAgICAgICAgICAgICAgfHwgKGRpcmVjdGlvbiA9PSAnbmV4dCcgJiYgYWN0aXZlSW5kZXggPT0gKHRoaXMuJGl0ZW1zLmxlbmd0aCAtIDEpKVxuICAgIGlmICh3aWxsV3JhcCAmJiAhdGhpcy5vcHRpb25zLndyYXApIHJldHVybiBhY3RpdmVcbiAgICB2YXIgZGVsdGEgPSBkaXJlY3Rpb24gPT0gJ3ByZXYnID8gLTEgOiAxXG4gICAgdmFyIGl0ZW1JbmRleCA9IChhY3RpdmVJbmRleCArIGRlbHRhKSAlIHRoaXMuJGl0ZW1zLmxlbmd0aFxuICAgIHJldHVybiB0aGlzLiRpdGVtcy5lcShpdGVtSW5kZXgpXG4gIH1cblxuICBDYXJvdXNlbC5wcm90b3R5cGUudG8gPSBmdW5jdGlvbiAocG9zKSB7XG4gICAgdmFyIHRoYXQgICAgICAgID0gdGhpc1xuICAgIHZhciBhY3RpdmVJbmRleCA9IHRoaXMuZ2V0SXRlbUluZGV4KHRoaXMuJGFjdGl2ZSA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLml0ZW0uYWN0aXZlJykpXG5cbiAgICBpZiAocG9zID4gKHRoaXMuJGl0ZW1zLmxlbmd0aCAtIDEpIHx8IHBvcyA8IDApIHJldHVyblxuXG4gICAgaWYgKHRoaXMuc2xpZGluZykgICAgICAgcmV0dXJuIHRoaXMuJGVsZW1lbnQub25lKCdzbGlkLmJzLmNhcm91c2VsJywgZnVuY3Rpb24gKCkgeyB0aGF0LnRvKHBvcykgfSkgLy8geWVzLCBcInNsaWRcIlxuICAgIGlmIChhY3RpdmVJbmRleCA9PSBwb3MpIHJldHVybiB0aGlzLnBhdXNlKCkuY3ljbGUoKVxuXG4gICAgcmV0dXJuIHRoaXMuc2xpZGUocG9zID4gYWN0aXZlSW5kZXggPyAnbmV4dCcgOiAncHJldicsIHRoaXMuJGl0ZW1zLmVxKHBvcykpXG4gIH1cblxuICBDYXJvdXNlbC5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoZSkge1xuICAgIGUgfHwgKHRoaXMucGF1c2VkID0gdHJ1ZSlcblxuICAgIGlmICh0aGlzLiRlbGVtZW50LmZpbmQoJy5uZXh0LCAucHJldicpLmxlbmd0aCAmJiAkLnN1cHBvcnQudHJhbnNpdGlvbikge1xuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZClcbiAgICAgIHRoaXMuY3ljbGUodHJ1ZSlcbiAgICB9XG5cbiAgICB0aGlzLmludGVydmFsID0gY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIENhcm91c2VsLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnNsaWRpbmcpIHJldHVyblxuICAgIHJldHVybiB0aGlzLnNsaWRlKCduZXh0JylcbiAgfVxuXG4gIENhcm91c2VsLnByb3RvdHlwZS5wcmV2ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnNsaWRpbmcpIHJldHVyblxuICAgIHJldHVybiB0aGlzLnNsaWRlKCdwcmV2JylcbiAgfVxuXG4gIENhcm91c2VsLnByb3RvdHlwZS5zbGlkZSA9IGZ1bmN0aW9uICh0eXBlLCBuZXh0KSB7XG4gICAgdmFyICRhY3RpdmUgICA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLml0ZW0uYWN0aXZlJylcbiAgICB2YXIgJG5leHQgICAgID0gbmV4dCB8fCB0aGlzLmdldEl0ZW1Gb3JEaXJlY3Rpb24odHlwZSwgJGFjdGl2ZSlcbiAgICB2YXIgaXNDeWNsaW5nID0gdGhpcy5pbnRlcnZhbFxuICAgIHZhciBkaXJlY3Rpb24gPSB0eXBlID09ICduZXh0JyA/ICdsZWZ0JyA6ICdyaWdodCdcbiAgICB2YXIgdGhhdCAgICAgID0gdGhpc1xuXG4gICAgaWYgKCRuZXh0Lmhhc0NsYXNzKCdhY3RpdmUnKSkgcmV0dXJuICh0aGlzLnNsaWRpbmcgPSBmYWxzZSlcblxuICAgIHZhciByZWxhdGVkVGFyZ2V0ID0gJG5leHRbMF1cbiAgICB2YXIgc2xpZGVFdmVudCA9ICQuRXZlbnQoJ3NsaWRlLmJzLmNhcm91c2VsJywge1xuICAgICAgcmVsYXRlZFRhcmdldDogcmVsYXRlZFRhcmdldCxcbiAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgfSlcbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoc2xpZGVFdmVudClcbiAgICBpZiAoc2xpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXG5cbiAgICB0aGlzLnNsaWRpbmcgPSB0cnVlXG5cbiAgICBpc0N5Y2xpbmcgJiYgdGhpcy5wYXVzZSgpXG5cbiAgICBpZiAodGhpcy4kaW5kaWNhdG9ycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuJGluZGljYXRvcnMuZmluZCgnLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICAgICAgdmFyICRuZXh0SW5kaWNhdG9yID0gJCh0aGlzLiRpbmRpY2F0b3JzLmNoaWxkcmVuKClbdGhpcy5nZXRJdGVtSW5kZXgoJG5leHQpXSlcbiAgICAgICRuZXh0SW5kaWNhdG9yICYmICRuZXh0SW5kaWNhdG9yLmFkZENsYXNzKCdhY3RpdmUnKVxuICAgIH1cblxuICAgIHZhciBzbGlkRXZlbnQgPSAkLkV2ZW50KCdzbGlkLmJzLmNhcm91c2VsJywgeyByZWxhdGVkVGFyZ2V0OiByZWxhdGVkVGFyZ2V0LCBkaXJlY3Rpb246IGRpcmVjdGlvbiB9KSAvLyB5ZXMsIFwic2xpZFwiXG4gICAgaWYgKCQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ3NsaWRlJykpIHtcbiAgICAgICRuZXh0LmFkZENsYXNzKHR5cGUpXG4gICAgICAkbmV4dFswXS5vZmZzZXRXaWR0aCAvLyBmb3JjZSByZWZsb3dcbiAgICAgICRhY3RpdmUuYWRkQ2xhc3MoZGlyZWN0aW9uKVxuICAgICAgJG5leHQuYWRkQ2xhc3MoZGlyZWN0aW9uKVxuICAgICAgJGFjdGl2ZVxuICAgICAgICAub25lKCdic1RyYW5zaXRpb25FbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgJG5leHQucmVtb3ZlQ2xhc3MoW3R5cGUsIGRpcmVjdGlvbl0uam9pbignICcpKS5hZGRDbGFzcygnYWN0aXZlJylcbiAgICAgICAgICAkYWN0aXZlLnJlbW92ZUNsYXNzKFsnYWN0aXZlJywgZGlyZWN0aW9uXS5qb2luKCcgJykpXG4gICAgICAgICAgdGhhdC5zbGlkaW5nID0gZmFsc2VcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcihzbGlkRXZlbnQpXG4gICAgICAgICAgfSwgMClcbiAgICAgICAgfSlcbiAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKENhcm91c2VsLlRSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgfSBlbHNlIHtcbiAgICAgICRhY3RpdmUucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAkbmV4dC5hZGRDbGFzcygnYWN0aXZlJylcbiAgICAgIHRoaXMuc2xpZGluZyA9IGZhbHNlXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoc2xpZEV2ZW50KVxuICAgIH1cblxuICAgIGlzQ3ljbGluZyAmJiB0aGlzLmN5Y2xlKClcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIC8vIENBUk9VU0VMIFBMVUdJTiBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgICA9ICR0aGlzLmRhdGEoJ2JzLmNhcm91c2VsJylcbiAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIENhcm91c2VsLkRFRkFVTFRTLCAkdGhpcy5kYXRhKCksIHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uKVxuICAgICAgdmFyIGFjdGlvbiAgPSB0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnID8gb3B0aW9uIDogb3B0aW9ucy5zbGlkZVxuXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLmNhcm91c2VsJywgKGRhdGEgPSBuZXcgQ2Fyb3VzZWwodGhpcywgb3B0aW9ucykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ251bWJlcicpIGRhdGEudG8ob3B0aW9uKVxuICAgICAgZWxzZSBpZiAoYWN0aW9uKSBkYXRhW2FjdGlvbl0oKVxuICAgICAgZWxzZSBpZiAob3B0aW9ucy5pbnRlcnZhbCkgZGF0YS5wYXVzZSgpLmN5Y2xlKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG9sZCA9ICQuZm4uY2Fyb3VzZWxcblxuICAkLmZuLmNhcm91c2VsICAgICAgICAgICAgID0gUGx1Z2luXG4gICQuZm4uY2Fyb3VzZWwuQ29uc3RydWN0b3IgPSBDYXJvdXNlbFxuXG5cbiAgLy8gQ0FST1VTRUwgTk8gQ09ORkxJQ1RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT1cblxuICAkLmZuLmNhcm91c2VsLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi5jYXJvdXNlbCA9IG9sZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIC8vIENBUk9VU0VMIERBVEEtQVBJXG4gIC8vID09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGNsaWNrSGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIGhyZWZcbiAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcbiAgICB2YXIgJHRhcmdldCA9ICQoJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKSB8fCAoaHJlZiA9ICR0aGlzLmF0dHIoJ2hyZWYnKSkgJiYgaHJlZi5yZXBsYWNlKC8uKig/PSNbXlxcc10rJCkvLCAnJykpIC8vIHN0cmlwIGZvciBpZTdcbiAgICBpZiAoISR0YXJnZXQuaGFzQ2xhc3MoJ2Nhcm91c2VsJykpIHJldHVyblxuICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sICR0YXJnZXQuZGF0YSgpLCAkdGhpcy5kYXRhKCkpXG4gICAgdmFyIHNsaWRlSW5kZXggPSAkdGhpcy5hdHRyKCdkYXRhLXNsaWRlLXRvJylcbiAgICBpZiAoc2xpZGVJbmRleCkgb3B0aW9ucy5pbnRlcnZhbCA9IGZhbHNlXG5cbiAgICBQbHVnaW4uY2FsbCgkdGFyZ2V0LCBvcHRpb25zKVxuXG4gICAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICAgICR0YXJnZXQuZGF0YSgnYnMuY2Fyb3VzZWwnKS50byhzbGlkZUluZGV4KVxuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgJChkb2N1bWVudClcbiAgICAub24oJ2NsaWNrLmJzLmNhcm91c2VsLmRhdGEtYXBpJywgJ1tkYXRhLXNsaWRlXScsIGNsaWNrSGFuZGxlcilcbiAgICAub24oJ2NsaWNrLmJzLmNhcm91c2VsLmRhdGEtYXBpJywgJ1tkYXRhLXNsaWRlLXRvXScsIGNsaWNrSGFuZGxlcilcblxuICAkKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgJCgnW2RhdGEtcmlkZT1cImNhcm91c2VsXCJdJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJGNhcm91c2VsID0gJCh0aGlzKVxuICAgICAgUGx1Z2luLmNhbGwoJGNhcm91c2VsLCAkY2Fyb3VzZWwuZGF0YSgpKVxuICAgIH0pXG4gIH0pXG5cbn0oalF1ZXJ5KTtcbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiBjb2xsYXBzZS5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI2NvbGxhcHNlXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiBqc2hpbnQgbGF0ZWRlZjogZmFsc2UgKi9cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBDT0xMQVBTRSBQVUJMSUMgQ0xBU1MgREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBDb2xsYXBzZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCAgICAgID0gJChlbGVtZW50KVxuICAgIHRoaXMub3B0aW9ucyAgICAgICA9ICQuZXh0ZW5kKHt9LCBDb2xsYXBzZS5ERUZBVUxUUywgb3B0aW9ucylcbiAgICB0aGlzLiR0cmlnZ2VyICAgICAgPSAkKCdbZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiXVtocmVmPVwiIycgKyBlbGVtZW50LmlkICsgJ1wiXSwnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICdbZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiXVtkYXRhLXRhcmdldD1cIiMnICsgZWxlbWVudC5pZCArICdcIl0nKVxuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IG51bGxcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGFyZW50KSB7XG4gICAgICB0aGlzLiRwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuJGVsZW1lbnQsIHRoaXMuJHRyaWdnZXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50b2dnbGUpIHRoaXMudG9nZ2xlKClcbiAgfVxuXG4gIENvbGxhcHNlLlZFUlNJT04gID0gJzMuMy43J1xuXG4gIENvbGxhcHNlLlRSQU5TSVRJT05fRFVSQVRJT04gPSAzNTBcblxuICBDb2xsYXBzZS5ERUZBVUxUUyA9IHtcbiAgICB0b2dnbGU6IHRydWVcbiAgfVxuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5kaW1lbnNpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhc1dpZHRoID0gdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnd2lkdGgnKVxuICAgIHJldHVybiBoYXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVpZ2h0J1xuICB9XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMudHJhbnNpdGlvbmluZyB8fCB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdpbicpKSByZXR1cm5cblxuICAgIHZhciBhY3RpdmVzRGF0YVxuICAgIHZhciBhY3RpdmVzID0gdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5jaGlsZHJlbignLnBhbmVsJykuY2hpbGRyZW4oJy5pbiwgLmNvbGxhcHNpbmcnKVxuXG4gICAgaWYgKGFjdGl2ZXMgJiYgYWN0aXZlcy5sZW5ndGgpIHtcbiAgICAgIGFjdGl2ZXNEYXRhID0gYWN0aXZlcy5kYXRhKCdicy5jb2xsYXBzZScpXG4gICAgICBpZiAoYWN0aXZlc0RhdGEgJiYgYWN0aXZlc0RhdGEudHJhbnNpdGlvbmluZykgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0RXZlbnQgPSAkLkV2ZW50KCdzaG93LmJzLmNvbGxhcHNlJylcbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoc3RhcnRFdmVudClcbiAgICBpZiAoc3RhcnRFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXG5cbiAgICBpZiAoYWN0aXZlcyAmJiBhY3RpdmVzLmxlbmd0aCkge1xuICAgICAgUGx1Z2luLmNhbGwoYWN0aXZlcywgJ2hpZGUnKVxuICAgICAgYWN0aXZlc0RhdGEgfHwgYWN0aXZlcy5kYXRhKCdicy5jb2xsYXBzZScsIG51bGwpXG4gICAgfVxuXG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuZGltZW5zaW9uKClcblxuICAgIHRoaXMuJGVsZW1lbnRcbiAgICAgIC5yZW1vdmVDbGFzcygnY29sbGFwc2UnKVxuICAgICAgLmFkZENsYXNzKCdjb2xsYXBzaW5nJylbZGltZW5zaW9uXSgwKVxuICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxuXG4gICAgdGhpcy4kdHJpZ2dlclxuICAgICAgLnJlbW92ZUNsYXNzKCdjb2xsYXBzZWQnKVxuICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxuXG4gICAgdGhpcy50cmFuc2l0aW9uaW5nID0gMVxuXG4gICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy4kZWxlbWVudFxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNpbmcnKVxuICAgICAgICAuYWRkQ2xhc3MoJ2NvbGxhcHNlIGluJylbZGltZW5zaW9uXSgnJylcbiAgICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IDBcbiAgICAgIHRoaXMuJGVsZW1lbnRcbiAgICAgICAgLnRyaWdnZXIoJ3Nob3duLmJzLmNvbGxhcHNlJylcbiAgICB9XG5cbiAgICBpZiAoISQuc3VwcG9ydC50cmFuc2l0aW9uKSByZXR1cm4gY29tcGxldGUuY2FsbCh0aGlzKVxuXG4gICAgdmFyIHNjcm9sbFNpemUgPSAkLmNhbWVsQ2FzZShbJ3Njcm9sbCcsIGRpbWVuc2lvbl0uam9pbignLScpKVxuXG4gICAgdGhpcy4kZWxlbWVudFxuICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgJC5wcm94eShjb21wbGV0ZSwgdGhpcykpXG4gICAgICAuZW11bGF0ZVRyYW5zaXRpb25FbmQoQ29sbGFwc2UuVFJBTlNJVElPTl9EVVJBVElPTilbZGltZW5zaW9uXSh0aGlzLiRlbGVtZW50WzBdW3Njcm9sbFNpemVdKVxuICB9XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMudHJhbnNpdGlvbmluZyB8fCAhdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnaW4nKSkgcmV0dXJuXG5cbiAgICB2YXIgc3RhcnRFdmVudCA9ICQuRXZlbnQoJ2hpZGUuYnMuY29sbGFwc2UnKVxuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihzdGFydEV2ZW50KVxuICAgIGlmIChzdGFydEV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cblxuICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvbigpXG5cbiAgICB0aGlzLiRlbGVtZW50W2RpbWVuc2lvbl0odGhpcy4kZWxlbWVudFtkaW1lbnNpb25dKCkpWzBdLm9mZnNldEhlaWdodFxuXG4gICAgdGhpcy4kZWxlbWVudFxuICAgICAgLmFkZENsYXNzKCdjb2xsYXBzaW5nJylcbiAgICAgIC5yZW1vdmVDbGFzcygnY29sbGFwc2UgaW4nKVxuICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSlcblxuICAgIHRoaXMuJHRyaWdnZXJcbiAgICAgIC5hZGRDbGFzcygnY29sbGFwc2VkJylcbiAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpXG5cbiAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSAxXG5cbiAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSAwXG4gICAgICB0aGlzLiRlbGVtZW50XG4gICAgICAgIC5yZW1vdmVDbGFzcygnY29sbGFwc2luZycpXG4gICAgICAgIC5hZGRDbGFzcygnY29sbGFwc2UnKVxuICAgICAgICAudHJpZ2dlcignaGlkZGVuLmJzLmNvbGxhcHNlJylcbiAgICB9XG5cbiAgICBpZiAoISQuc3VwcG9ydC50cmFuc2l0aW9uKSByZXR1cm4gY29tcGxldGUuY2FsbCh0aGlzKVxuXG4gICAgdGhpcy4kZWxlbWVudFxuICAgICAgW2RpbWVuc2lvbl0oMClcbiAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsICQucHJveHkoY29tcGxldGUsIHRoaXMpKVxuICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKENvbGxhcHNlLlRSQU5TSVRJT05fRFVSQVRJT04pXG4gIH1cblxuICBDb2xsYXBzZS5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXNbdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnaW4nKSA/ICdoaWRlJyA6ICdzaG93J10oKVxuICB9XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMucGFyZW50KVxuICAgICAgLmZpbmQoJ1tkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCJdW2RhdGEtcGFyZW50PVwiJyArIHRoaXMub3B0aW9ucy5wYXJlbnQgKyAnXCJdJylcbiAgICAgIC5lYWNoKCQucHJveHkoZnVuY3Rpb24gKGksIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJChlbGVtZW50KVxuICAgICAgICB0aGlzLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhnZXRUYXJnZXRGcm9tVHJpZ2dlcigkZWxlbWVudCksICRlbGVtZW50KVxuICAgICAgfSwgdGhpcykpXG4gICAgICAuZW5kKClcbiAgfVxuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MgPSBmdW5jdGlvbiAoJGVsZW1lbnQsICR0cmlnZ2VyKSB7XG4gICAgdmFyIGlzT3BlbiA9ICRlbGVtZW50Lmhhc0NsYXNzKCdpbicpXG5cbiAgICAkZWxlbWVudC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgaXNPcGVuKVxuICAgICR0cmlnZ2VyXG4gICAgICAudG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZCcsICFpc09wZW4pXG4gICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIGlzT3BlbilcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRhcmdldEZyb21UcmlnZ2VyKCR0cmlnZ2VyKSB7XG4gICAgdmFyIGhyZWZcbiAgICB2YXIgdGFyZ2V0ID0gJHRyaWdnZXIuYXR0cignZGF0YS10YXJnZXQnKVxuICAgICAgfHwgKGhyZWYgPSAkdHJpZ2dlci5hdHRyKCdocmVmJykpICYmIGhyZWYucmVwbGFjZSgvLiooPz0jW15cXHNdKyQpLywgJycpIC8vIHN0cmlwIGZvciBpZTdcblxuICAgIHJldHVybiAkKHRhcmdldClcbiAgfVxuXG5cbiAgLy8gQ09MTEFQU0UgUExVR0lOIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMuY29sbGFwc2UnKVxuICAgICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgQ29sbGFwc2UuREVGQVVMVFMsICR0aGlzLmRhdGEoKSwgdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb24pXG5cbiAgICAgIGlmICghZGF0YSAmJiBvcHRpb25zLnRvZ2dsZSAmJiAvc2hvd3xoaWRlLy50ZXN0KG9wdGlvbikpIG9wdGlvbnMudG9nZ2xlID0gZmFsc2VcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMuY29sbGFwc2UnLCAoZGF0YSA9IG5ldyBDb2xsYXBzZSh0aGlzLCBvcHRpb25zKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG9sZCA9ICQuZm4uY29sbGFwc2VcblxuICAkLmZuLmNvbGxhcHNlICAgICAgICAgICAgID0gUGx1Z2luXG4gICQuZm4uY29sbGFwc2UuQ29uc3RydWN0b3IgPSBDb2xsYXBzZVxuXG5cbiAgLy8gQ09MTEFQU0UgTk8gQ09ORkxJQ1RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT1cblxuICAkLmZuLmNvbGxhcHNlLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi5jb2xsYXBzZSA9IG9sZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIC8vIENPTExBUFNFIERBVEEtQVBJXG4gIC8vID09PT09PT09PT09PT09PT09XG5cbiAgJChkb2N1bWVudCkub24oJ2NsaWNrLmJzLmNvbGxhcHNlLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCJdJywgZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcblxuICAgIGlmICghJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKSkgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICB2YXIgJHRhcmdldCA9IGdldFRhcmdldEZyb21UcmlnZ2VyKCR0aGlzKVxuICAgIHZhciBkYXRhICAgID0gJHRhcmdldC5kYXRhKCdicy5jb2xsYXBzZScpXG4gICAgdmFyIG9wdGlvbiAgPSBkYXRhID8gJ3RvZ2dsZScgOiAkdGhpcy5kYXRhKClcblxuICAgIFBsdWdpbi5jYWxsKCR0YXJnZXQsIG9wdGlvbilcbiAgfSlcblxufShqUXVlcnkpO1xuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCb290c3RyYXA6IGRyb3Bkb3duLmpzIHYzLjMuN1xuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jZHJvcGRvd25zXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbitmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gRFJPUERPV04gQ0xBU1MgREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGJhY2tkcm9wID0gJy5kcm9wZG93bi1iYWNrZHJvcCdcbiAgdmFyIHRvZ2dsZSAgID0gJ1tkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCJdJ1xuICB2YXIgRHJvcGRvd24gPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICQoZWxlbWVudCkub24oJ2NsaWNrLmJzLmRyb3Bkb3duJywgdGhpcy50b2dnbGUpXG4gIH1cblxuICBEcm9wZG93bi5WRVJTSU9OID0gJzMuMy43J1xuXG4gIGZ1bmN0aW9uIGdldFBhcmVudCgkdGhpcykge1xuICAgIHZhciBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JylcblxuICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgIHNlbGVjdG9yID0gJHRoaXMuYXR0cignaHJlZicpXG4gICAgICBzZWxlY3RvciA9IHNlbGVjdG9yICYmIC8jW0EtWmEtel0vLnRlc3Qoc2VsZWN0b3IpICYmIHNlbGVjdG9yLnJlcGxhY2UoLy4qKD89I1teXFxzXSokKS8sICcnKSAvLyBzdHJpcCBmb3IgaWU3XG4gICAgfVxuXG4gICAgdmFyICRwYXJlbnQgPSBzZWxlY3RvciAmJiAkKHNlbGVjdG9yKVxuXG4gICAgcmV0dXJuICRwYXJlbnQgJiYgJHBhcmVudC5sZW5ndGggPyAkcGFyZW50IDogJHRoaXMucGFyZW50KClcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyTWVudXMoZSkge1xuICAgIGlmIChlICYmIGUud2hpY2ggPT09IDMpIHJldHVyblxuICAgICQoYmFja2Ryb3ApLnJlbW92ZSgpXG4gICAgJCh0b2dnbGUpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzICAgICAgICAgPSAkKHRoaXMpXG4gICAgICB2YXIgJHBhcmVudCAgICAgICA9IGdldFBhcmVudCgkdGhpcylcbiAgICAgIHZhciByZWxhdGVkVGFyZ2V0ID0geyByZWxhdGVkVGFyZ2V0OiB0aGlzIH1cblxuICAgICAgaWYgKCEkcGFyZW50Lmhhc0NsYXNzKCdvcGVuJykpIHJldHVyblxuXG4gICAgICBpZiAoZSAmJiBlLnR5cGUgPT0gJ2NsaWNrJyAmJiAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGUudGFyZ2V0LnRhZ05hbWUpICYmICQuY29udGFpbnMoJHBhcmVudFswXSwgZS50YXJnZXQpKSByZXR1cm5cblxuICAgICAgJHBhcmVudC50cmlnZ2VyKGUgPSAkLkV2ZW50KCdoaWRlLmJzLmRyb3Bkb3duJywgcmVsYXRlZFRhcmdldCkpXG5cbiAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cblxuICAgICAgJHRoaXMuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgICAkcGFyZW50LnJlbW92ZUNsYXNzKCdvcGVuJykudHJpZ2dlcigkLkV2ZW50KCdoaWRkZW4uYnMuZHJvcGRvd24nLCByZWxhdGVkVGFyZ2V0KSlcbiAgICB9KVxuICB9XG5cbiAgRHJvcGRvd24ucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyICR0aGlzID0gJCh0aGlzKVxuXG4gICAgaWYgKCR0aGlzLmlzKCcuZGlzYWJsZWQsIDpkaXNhYmxlZCcpKSByZXR1cm5cblxuICAgIHZhciAkcGFyZW50ICA9IGdldFBhcmVudCgkdGhpcylcbiAgICB2YXIgaXNBY3RpdmUgPSAkcGFyZW50Lmhhc0NsYXNzKCdvcGVuJylcblxuICAgIGNsZWFyTWVudXMoKVxuXG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiAhJHBhcmVudC5jbG9zZXN0KCcubmF2YmFyLW5hdicpLmxlbmd0aCkge1xuICAgICAgICAvLyBpZiBtb2JpbGUgd2UgdXNlIGEgYmFja2Ryb3AgYmVjYXVzZSBjbGljayBldmVudHMgZG9uJ3QgZGVsZWdhdGVcbiAgICAgICAgJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSlcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2Ryb3Bkb3duLWJhY2tkcm9wJylcbiAgICAgICAgICAuaW5zZXJ0QWZ0ZXIoJCh0aGlzKSlcbiAgICAgICAgICAub24oJ2NsaWNrJywgY2xlYXJNZW51cylcbiAgICAgIH1cblxuICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSB7IHJlbGF0ZWRUYXJnZXQ6IHRoaXMgfVxuICAgICAgJHBhcmVudC50cmlnZ2VyKGUgPSAkLkV2ZW50KCdzaG93LmJzLmRyb3Bkb3duJywgcmVsYXRlZFRhcmdldCkpXG5cbiAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cblxuICAgICAgJHRoaXNcbiAgICAgICAgLnRyaWdnZXIoJ2ZvY3VzJylcbiAgICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpXG5cbiAgICAgICRwYXJlbnRcbiAgICAgICAgLnRvZ2dsZUNsYXNzKCdvcGVuJylcbiAgICAgICAgLnRyaWdnZXIoJC5FdmVudCgnc2hvd24uYnMuZHJvcGRvd24nLCByZWxhdGVkVGFyZ2V0KSlcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5rZXlkb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIS8oMzh8NDB8Mjd8MzIpLy50ZXN0KGUud2hpY2gpIHx8IC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZS50YXJnZXQudGFnTmFtZSkpIHJldHVyblxuXG4gICAgdmFyICR0aGlzID0gJCh0aGlzKVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICAgaWYgKCR0aGlzLmlzKCcuZGlzYWJsZWQsIDpkaXNhYmxlZCcpKSByZXR1cm5cblxuICAgIHZhciAkcGFyZW50ICA9IGdldFBhcmVudCgkdGhpcylcbiAgICB2YXIgaXNBY3RpdmUgPSAkcGFyZW50Lmhhc0NsYXNzKCdvcGVuJylcblxuICAgIGlmICghaXNBY3RpdmUgJiYgZS53aGljaCAhPSAyNyB8fCBpc0FjdGl2ZSAmJiBlLndoaWNoID09IDI3KSB7XG4gICAgICBpZiAoZS53aGljaCA9PSAyNykgJHBhcmVudC5maW5kKHRvZ2dsZSkudHJpZ2dlcignZm9jdXMnKVxuICAgICAgcmV0dXJuICR0aGlzLnRyaWdnZXIoJ2NsaWNrJylcbiAgICB9XG5cbiAgICB2YXIgZGVzYyA9ICcgbGk6bm90KC5kaXNhYmxlZCk6dmlzaWJsZSBhJ1xuICAgIHZhciAkaXRlbXMgPSAkcGFyZW50LmZpbmQoJy5kcm9wZG93bi1tZW51JyArIGRlc2MpXG5cbiAgICBpZiAoISRpdGVtcy5sZW5ndGgpIHJldHVyblxuXG4gICAgdmFyIGluZGV4ID0gJGl0ZW1zLmluZGV4KGUudGFyZ2V0KVxuXG4gICAgaWYgKGUud2hpY2ggPT0gMzggJiYgaW5kZXggPiAwKSAgICAgICAgICAgICAgICAgaW5kZXgtLSAgICAgICAgIC8vIHVwXG4gICAgaWYgKGUud2hpY2ggPT0gNDAgJiYgaW5kZXggPCAkaXRlbXMubGVuZ3RoIC0gMSkgaW5kZXgrKyAgICAgICAgIC8vIGRvd25cbiAgICBpZiAoIX5pbmRleCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDBcblxuICAgICRpdGVtcy5lcShpbmRleCkudHJpZ2dlcignZm9jdXMnKVxuICB9XG5cblxuICAvLyBEUk9QRE9XTiBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICA9ICR0aGlzLmRhdGEoJ2JzLmRyb3Bkb3duJylcblxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdicy5kcm9wZG93bicsIChkYXRhID0gbmV3IERyb3Bkb3duKHRoaXMpKSlcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0uY2FsbCgkdGhpcylcbiAgICB9KVxuICB9XG5cbiAgdmFyIG9sZCA9ICQuZm4uZHJvcGRvd25cblxuICAkLmZuLmRyb3Bkb3duICAgICAgICAgICAgID0gUGx1Z2luXG4gICQuZm4uZHJvcGRvd24uQ29uc3RydWN0b3IgPSBEcm9wZG93blxuXG5cbiAgLy8gRFJPUERPV04gTk8gQ09ORkxJQ1RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT1cblxuICAkLmZuLmRyb3Bkb3duLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi5kcm9wZG93biA9IG9sZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIC8vIEFQUExZIFRPIFNUQU5EQVJEIERST1BET1dOIEVMRU1FTlRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgJChkb2N1bWVudClcbiAgICAub24oJ2NsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpJywgY2xlYXJNZW51cylcbiAgICAub24oJ2NsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpJywgJy5kcm9wZG93biBmb3JtJywgZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKSB9KVxuICAgIC5vbignY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGknLCB0b2dnbGUsIERyb3Bkb3duLnByb3RvdHlwZS50b2dnbGUpXG4gICAgLm9uKCdrZXlkb3duLmJzLmRyb3Bkb3duLmRhdGEtYXBpJywgdG9nZ2xlLCBEcm9wZG93bi5wcm90b3R5cGUua2V5ZG93bilcbiAgICAub24oJ2tleWRvd24uYnMuZHJvcGRvd24uZGF0YS1hcGknLCAnLmRyb3Bkb3duLW1lbnUnLCBEcm9wZG93bi5wcm90b3R5cGUua2V5ZG93bilcblxufShqUXVlcnkpO1xuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCb290c3RyYXA6IG1vZGFsLmpzIHYzLjMuN1xuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jbW9kYWxzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbitmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gTU9EQUwgQ0xBU1MgREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIE1vZGFsID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgICAgICAgICAgICAgPSBvcHRpb25zXG4gICAgdGhpcy4kYm9keSAgICAgICAgICAgICAgID0gJChkb2N1bWVudC5ib2R5KVxuICAgIHRoaXMuJGVsZW1lbnQgICAgICAgICAgICA9ICQoZWxlbWVudClcbiAgICB0aGlzLiRkaWFsb2cgICAgICAgICAgICAgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5tb2RhbC1kaWFsb2cnKVxuICAgIHRoaXMuJGJhY2tkcm9wICAgICAgICAgICA9IG51bGxcbiAgICB0aGlzLmlzU2hvd24gICAgICAgICAgICAgPSBudWxsXG4gICAgdGhpcy5vcmlnaW5hbEJvZHlQYWQgICAgID0gbnVsbFxuICAgIHRoaXMuc2Nyb2xsYmFyV2lkdGggICAgICA9IDBcbiAgICB0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2sgPSBmYWxzZVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZW1vdGUpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnRcbiAgICAgICAgLmZpbmQoJy5tb2RhbC1jb250ZW50JylcbiAgICAgICAgLmxvYWQodGhpcy5vcHRpb25zLnJlbW90ZSwgJC5wcm94eShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdsb2FkZWQuYnMubW9kYWwnKVxuICAgICAgICB9LCB0aGlzKSlcbiAgICB9XG4gIH1cblxuICBNb2RhbC5WRVJTSU9OICA9ICczLjMuNydcblxuICBNb2RhbC5UUkFOU0lUSU9OX0RVUkFUSU9OID0gMzAwXG4gIE1vZGFsLkJBQ0tEUk9QX1RSQU5TSVRJT05fRFVSQVRJT04gPSAxNTBcblxuICBNb2RhbC5ERUZBVUxUUyA9IHtcbiAgICBiYWNrZHJvcDogdHJ1ZSxcbiAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICBzaG93OiB0cnVlXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKF9yZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KF9yZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbiAoX3JlbGF0ZWRUYXJnZXQpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICB2YXIgZSAgICA9ICQuRXZlbnQoJ3Nob3cuYnMubW9kYWwnLCB7IHJlbGF0ZWRUYXJnZXQ6IF9yZWxhdGVkVGFyZ2V0IH0pXG5cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSlcblxuICAgIGlmICh0aGlzLmlzU2hvd24gfHwgZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXG5cbiAgICB0aGlzLmlzU2hvd24gPSB0cnVlXG5cbiAgICB0aGlzLmNoZWNrU2Nyb2xsYmFyKClcbiAgICB0aGlzLnNldFNjcm9sbGJhcigpXG4gICAgdGhpcy4kYm9keS5hZGRDbGFzcygnbW9kYWwtb3BlbicpXG5cbiAgICB0aGlzLmVzY2FwZSgpXG4gICAgdGhpcy5yZXNpemUoKVxuXG4gICAgdGhpcy4kZWxlbWVudC5vbignY2xpY2suZGlzbWlzcy5icy5tb2RhbCcsICdbZGF0YS1kaXNtaXNzPVwibW9kYWxcIl0nLCAkLnByb3h5KHRoaXMuaGlkZSwgdGhpcykpXG5cbiAgICB0aGlzLiRkaWFsb2cub24oJ21vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgdGhhdC4kZWxlbWVudC5vbmUoJ21vdXNldXAuZGlzbWlzcy5icy5tb2RhbCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICgkKGUudGFyZ2V0KS5pcyh0aGF0LiRlbGVtZW50KSkgdGhhdC5pZ25vcmVCYWNrZHJvcENsaWNrID0gdHJ1ZVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgdGhpcy5iYWNrZHJvcChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9ICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoYXQuJGVsZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKVxuXG4gICAgICBpZiAoIXRoYXQuJGVsZW1lbnQucGFyZW50KCkubGVuZ3RoKSB7XG4gICAgICAgIHRoYXQuJGVsZW1lbnQuYXBwZW5kVG8odGhhdC4kYm9keSkgLy8gZG9uJ3QgbW92ZSBtb2RhbHMgZG9tIHBvc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIHRoYXQuJGVsZW1lbnRcbiAgICAgICAgLnNob3coKVxuICAgICAgICAuc2Nyb2xsVG9wKDApXG5cbiAgICAgIHRoYXQuYWRqdXN0RGlhbG9nKClcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgdGhhdC4kZWxlbWVudFswXS5vZmZzZXRXaWR0aCAvLyBmb3JjZSByZWZsb3dcbiAgICAgIH1cblxuICAgICAgdGhhdC4kZWxlbWVudC5hZGRDbGFzcygnaW4nKVxuXG4gICAgICB0aGF0LmVuZm9yY2VGb2N1cygpXG5cbiAgICAgIHZhciBlID0gJC5FdmVudCgnc2hvd24uYnMubW9kYWwnLCB7IHJlbGF0ZWRUYXJnZXQ6IF9yZWxhdGVkVGFyZ2V0IH0pXG5cbiAgICAgIHRyYW5zaXRpb24gP1xuICAgICAgICB0aGF0LiRkaWFsb2cgLy8gd2FpdCBmb3IgbW9kYWwgdG8gc2xpZGUgaW5cbiAgICAgICAgICAub25lKCdic1RyYW5zaXRpb25FbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGF0LiRlbGVtZW50LnRyaWdnZXIoJ2ZvY3VzJykudHJpZ2dlcihlKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKE1vZGFsLlRSQU5TSVRJT05fRFVSQVRJT04pIDpcbiAgICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdmb2N1cycpLnRyaWdnZXIoZSlcbiAgICB9KVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChlKSBlLnByZXZlbnREZWZhdWx0KClcblxuICAgIGUgPSAkLkV2ZW50KCdoaWRlLmJzLm1vZGFsJylcblxuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKVxuXG4gICAgaWYgKCF0aGlzLmlzU2hvd24gfHwgZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXG5cbiAgICB0aGlzLmlzU2hvd24gPSBmYWxzZVxuXG4gICAgdGhpcy5lc2NhcGUoKVxuICAgIHRoaXMucmVzaXplKClcblxuICAgICQoZG9jdW1lbnQpLm9mZignZm9jdXNpbi5icy5tb2RhbCcpXG5cbiAgICB0aGlzLiRlbGVtZW50XG4gICAgICAucmVtb3ZlQ2xhc3MoJ2luJylcbiAgICAgIC5vZmYoJ2NsaWNrLmRpc21pc3MuYnMubW9kYWwnKVxuICAgICAgLm9mZignbW91c2V1cC5kaXNtaXNzLmJzLm1vZGFsJylcblxuICAgIHRoaXMuJGRpYWxvZy5vZmYoJ21vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsJylcblxuICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/XG4gICAgICB0aGlzLiRlbGVtZW50XG4gICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsICQucHJveHkodGhpcy5oaWRlTW9kYWwsIHRoaXMpKVxuICAgICAgICAuZW11bGF0ZVRyYW5zaXRpb25FbmQoTW9kYWwuVFJBTlNJVElPTl9EVVJBVElPTikgOlxuICAgICAgdGhpcy5oaWRlTW9kYWwoKVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLmVuZm9yY2VGb2N1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAkKGRvY3VtZW50KVxuICAgICAgLm9mZignZm9jdXNpbi5icy5tb2RhbCcpIC8vIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgICAgLm9uKCdmb2N1c2luLmJzLm1vZGFsJywgJC5wcm94eShmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZG9jdW1lbnQgIT09IGUudGFyZ2V0ICYmXG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50WzBdICE9PSBlLnRhcmdldCAmJlxuICAgICAgICAgICAgIXRoaXMuJGVsZW1lbnQuaGFzKGUudGFyZ2V0KS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2ZvY3VzJylcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcykpXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmlzU2hvd24gJiYgdGhpcy5vcHRpb25zLmtleWJvYXJkKSB7XG4gICAgICB0aGlzLiRlbGVtZW50Lm9uKCdrZXlkb3duLmRpc21pc3MuYnMubW9kYWwnLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUud2hpY2ggPT0gMjcgJiYgdGhpcy5oaWRlKClcbiAgICAgIH0sIHRoaXMpKVxuICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNTaG93bikge1xuICAgICAgdGhpcy4kZWxlbWVudC5vZmYoJ2tleWRvd24uZGlzbWlzcy5icy5tb2RhbCcpXG4gICAgfVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5pc1Nob3duKSB7XG4gICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZS5icy5tb2RhbCcsICQucHJveHkodGhpcy5oYW5kbGVVcGRhdGUsIHRoaXMpKVxuICAgIH0gZWxzZSB7XG4gICAgICAkKHdpbmRvdykub2ZmKCdyZXNpemUuYnMubW9kYWwnKVxuICAgIH1cbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5oaWRlTW9kYWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgdGhpcy4kZWxlbWVudC5oaWRlKClcbiAgICB0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoYXQuJGJvZHkucmVtb3ZlQ2xhc3MoJ21vZGFsLW9wZW4nKVxuICAgICAgdGhhdC5yZXNldEFkanVzdG1lbnRzKClcbiAgICAgIHRoYXQucmVzZXRTY3JvbGxiYXIoKVxuICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdoaWRkZW4uYnMubW9kYWwnKVxuICAgIH0pXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUucmVtb3ZlQmFja2Ryb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy4kYmFja2Ryb3AgJiYgdGhpcy4kYmFja2Ryb3AucmVtb3ZlKClcbiAgICB0aGlzLiRiYWNrZHJvcCA9IG51bGxcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5iYWNrZHJvcCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIHZhciBhbmltYXRlID0gdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZmFkZScpID8gJ2ZhZGUnIDogJydcblxuICAgIGlmICh0aGlzLmlzU2hvd24gJiYgdGhpcy5vcHRpb25zLmJhY2tkcm9wKSB7XG4gICAgICB2YXIgZG9BbmltYXRlID0gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgYW5pbWF0ZVxuXG4gICAgICB0aGlzLiRiYWNrZHJvcCA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpXG4gICAgICAgIC5hZGRDbGFzcygnbW9kYWwtYmFja2Ryb3AgJyArIGFuaW1hdGUpXG4gICAgICAgIC5hcHBlbmRUbyh0aGlzLiRib2R5KVxuXG4gICAgICB0aGlzLiRlbGVtZW50Lm9uKCdjbGljay5kaXNtaXNzLmJzLm1vZGFsJywgJC5wcm94eShmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5pZ25vcmVCYWNrZHJvcENsaWNrKSB7XG4gICAgICAgICAgdGhpcy5pZ25vcmVCYWNrZHJvcENsaWNrID0gZmFsc2VcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCkgcmV0dXJuXG4gICAgICAgIHRoaXMub3B0aW9ucy5iYWNrZHJvcCA9PSAnc3RhdGljJ1xuICAgICAgICAgID8gdGhpcy4kZWxlbWVudFswXS5mb2N1cygpXG4gICAgICAgICAgOiB0aGlzLmhpZGUoKVxuICAgICAgfSwgdGhpcykpXG5cbiAgICAgIGlmIChkb0FuaW1hdGUpIHRoaXMuJGJhY2tkcm9wWzBdLm9mZnNldFdpZHRoIC8vIGZvcmNlIHJlZmxvd1xuXG4gICAgICB0aGlzLiRiYWNrZHJvcC5hZGRDbGFzcygnaW4nKVxuXG4gICAgICBpZiAoIWNhbGxiYWNrKSByZXR1cm5cblxuICAgICAgZG9BbmltYXRlID9cbiAgICAgICAgdGhpcy4kYmFja2Ryb3BcbiAgICAgICAgICAub25lKCdic1RyYW5zaXRpb25FbmQnLCBjYWxsYmFjaylcbiAgICAgICAgICAuZW11bGF0ZVRyYW5zaXRpb25FbmQoTW9kYWwuQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTikgOlxuICAgICAgICBjYWxsYmFjaygpXG5cbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU2hvd24gJiYgdGhpcy4kYmFja2Ryb3ApIHtcbiAgICAgIHRoaXMuJGJhY2tkcm9wLnJlbW92ZUNsYXNzKCdpbicpXG5cbiAgICAgIHZhciBjYWxsYmFja1JlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhhdC5yZW1vdmVCYWNrZHJvcCgpXG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgICAgIH1cbiAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/XG4gICAgICAgIHRoaXMuJGJhY2tkcm9wXG4gICAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgY2FsbGJhY2tSZW1vdmUpXG4gICAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKE1vZGFsLkJBQ0tEUk9QX1RSQU5TSVRJT05fRFVSQVRJT04pIDpcbiAgICAgICAgY2FsbGJhY2tSZW1vdmUoKVxuXG4gICAgfSBlbHNlIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuXG4gIC8vIHRoZXNlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcblxuICBNb2RhbC5wcm90b3R5cGUuaGFuZGxlVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYWRqdXN0RGlhbG9nKClcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5hZGp1c3REaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1vZGFsSXNPdmVyZmxvd2luZyA9IHRoaXMuJGVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodFxuXG4gICAgdGhpcy4kZWxlbWVudC5jc3Moe1xuICAgICAgcGFkZGluZ0xlZnQ6ICAhdGhpcy5ib2R5SXNPdmVyZmxvd2luZyAmJiBtb2RhbElzT3ZlcmZsb3dpbmcgPyB0aGlzLnNjcm9sbGJhcldpZHRoIDogJycsXG4gICAgICBwYWRkaW5nUmlnaHQ6IHRoaXMuYm9keUlzT3ZlcmZsb3dpbmcgJiYgIW1vZGFsSXNPdmVyZmxvd2luZyA/IHRoaXMuc2Nyb2xsYmFyV2lkdGggOiAnJ1xuICAgIH0pXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUucmVzZXRBZGp1c3RtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLiRlbGVtZW50LmNzcyh7XG4gICAgICBwYWRkaW5nTGVmdDogJycsXG4gICAgICBwYWRkaW5nUmlnaHQ6ICcnXG4gICAgfSlcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5jaGVja1Njcm9sbGJhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZnVsbFdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGhcbiAgICBpZiAoIWZ1bGxXaW5kb3dXaWR0aCkgeyAvLyB3b3JrYXJvdW5kIGZvciBtaXNzaW5nIHdpbmRvdy5pbm5lcldpZHRoIGluIElFOFxuICAgICAgdmFyIGRvY3VtZW50RWxlbWVudFJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIGZ1bGxXaW5kb3dXaWR0aCA9IGRvY3VtZW50RWxlbWVudFJlY3QucmlnaHQgLSBNYXRoLmFicyhkb2N1bWVudEVsZW1lbnRSZWN0LmxlZnQpXG4gICAgfVxuICAgIHRoaXMuYm9keUlzT3ZlcmZsb3dpbmcgPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgZnVsbFdpbmRvd1dpZHRoXG4gICAgdGhpcy5zY3JvbGxiYXJXaWR0aCA9IHRoaXMubWVhc3VyZVNjcm9sbGJhcigpXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUuc2V0U2Nyb2xsYmFyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBib2R5UGFkID0gcGFyc2VJbnQoKHRoaXMuJGJvZHkuY3NzKCdwYWRkaW5nLXJpZ2h0JykgfHwgMCksIDEwKVxuICAgIHRoaXMub3JpZ2luYWxCb2R5UGFkID0gZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgfHwgJydcbiAgICBpZiAodGhpcy5ib2R5SXNPdmVyZmxvd2luZykgdGhpcy4kYm9keS5jc3MoJ3BhZGRpbmctcmlnaHQnLCBib2R5UGFkICsgdGhpcy5zY3JvbGxiYXJXaWR0aClcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5yZXNldFNjcm9sbGJhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLiRib2R5LmNzcygncGFkZGluZy1yaWdodCcsIHRoaXMub3JpZ2luYWxCb2R5UGFkKVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLm1lYXN1cmVTY3JvbGxiYXIgPSBmdW5jdGlvbiAoKSB7IC8vIHRoeCB3YWxzaFxuICAgIHZhciBzY3JvbGxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIHNjcm9sbERpdi5jbGFzc05hbWUgPSAnbW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmUnXG4gICAgdGhpcy4kYm9keS5hcHBlbmQoc2Nyb2xsRGl2KVxuICAgIHZhciBzY3JvbGxiYXJXaWR0aCA9IHNjcm9sbERpdi5vZmZzZXRXaWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aFxuICAgIHRoaXMuJGJvZHlbMF0ucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KVxuICAgIHJldHVybiBzY3JvbGxiYXJXaWR0aFxuICB9XG5cblxuICAvLyBNT0RBTCBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24sIF9yZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMubW9kYWwnKVxuICAgICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgTW9kYWwuREVGQVVMVFMsICR0aGlzLmRhdGEoKSwgdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb24pXG5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMubW9kYWwnLCAoZGF0YSA9IG5ldyBNb2RhbCh0aGlzLCBvcHRpb25zKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKF9yZWxhdGVkVGFyZ2V0KVxuICAgICAgZWxzZSBpZiAob3B0aW9ucy5zaG93KSBkYXRhLnNob3coX3JlbGF0ZWRUYXJnZXQpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLm1vZGFsXG5cbiAgJC5mbi5tb2RhbCAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLm1vZGFsLkNvbnN0cnVjdG9yID0gTW9kYWxcblxuXG4gIC8vIE1PREFMIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5tb2RhbC5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm4ubW9kYWwgPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBNT0RBTCBEQVRBLUFQSVxuICAvLyA9PT09PT09PT09PT09PVxuXG4gICQoZG9jdW1lbnQpLm9uKCdjbGljay5icy5tb2RhbC5kYXRhLWFwaScsICdbZGF0YS10b2dnbGU9XCJtb2RhbFwiXScsIGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgdmFyIGhyZWYgICAgPSAkdGhpcy5hdHRyKCdocmVmJylcbiAgICB2YXIgJHRhcmdldCA9ICQoJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKSB8fCAoaHJlZiAmJiBocmVmLnJlcGxhY2UoLy4qKD89I1teXFxzXSskKS8sICcnKSkpIC8vIHN0cmlwIGZvciBpZTdcbiAgICB2YXIgb3B0aW9uICA9ICR0YXJnZXQuZGF0YSgnYnMubW9kYWwnKSA/ICd0b2dnbGUnIDogJC5leHRlbmQoeyByZW1vdGU6ICEvIy8udGVzdChocmVmKSAmJiBocmVmIH0sICR0YXJnZXQuZGF0YSgpLCAkdGhpcy5kYXRhKCkpXG5cbiAgICBpZiAoJHRoaXMuaXMoJ2EnKSkgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAkdGFyZ2V0Lm9uZSgnc2hvdy5icy5tb2RhbCcsIGZ1bmN0aW9uIChzaG93RXZlbnQpIHtcbiAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVybiAvLyBvbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICAkdGFyZ2V0Lm9uZSgnaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAkdGhpcy5pcygnOnZpc2libGUnKSAmJiAkdGhpcy50cmlnZ2VyKCdmb2N1cycpXG4gICAgICB9KVxuICAgIH0pXG4gICAgUGx1Z2luLmNhbGwoJHRhcmdldCwgb3B0aW9uLCB0aGlzKVxuICB9KVxuXG59KGpRdWVyeSk7XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogcG9wb3Zlci5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI3BvcG92ZXJzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbitmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gUE9QT1ZFUiBQVUJMSUMgQ0xBU1MgREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIFBvcG92ZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuaW5pdCgncG9wb3ZlcicsIGVsZW1lbnQsIG9wdGlvbnMpXG4gIH1cblxuICBpZiAoISQuZm4udG9vbHRpcCkgdGhyb3cgbmV3IEVycm9yKCdQb3BvdmVyIHJlcXVpcmVzIHRvb2x0aXAuanMnKVxuXG4gIFBvcG92ZXIuVkVSU0lPTiAgPSAnMy4zLjcnXG5cbiAgUG9wb3Zlci5ERUZBVUxUUyA9ICQuZXh0ZW5kKHt9LCAkLmZuLnRvb2x0aXAuQ29uc3RydWN0b3IuREVGQVVMVFMsIHtcbiAgICBwbGFjZW1lbnQ6ICdyaWdodCcsXG4gICAgdHJpZ2dlcjogJ2NsaWNrJyxcbiAgICBjb250ZW50OiAnJyxcbiAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJwb3BvdmVyXCIgcm9sZT1cInRvb2x0aXBcIj48ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj48aDMgY2xhc3M9XCJwb3BvdmVyLXRpdGxlXCI+PC9oMz48ZGl2IGNsYXNzPVwicG9wb3Zlci1jb250ZW50XCI+PC9kaXY+PC9kaXY+J1xuICB9KVxuXG5cbiAgLy8gTk9URTogUE9QT1ZFUiBFWFRFTkRTIHRvb2x0aXAuanNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBQb3BvdmVyLnByb3RvdHlwZSA9ICQuZXh0ZW5kKHt9LCAkLmZuLnRvb2x0aXAuQ29uc3RydWN0b3IucHJvdG90eXBlKVxuXG4gIFBvcG92ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9wb3ZlclxuXG4gIFBvcG92ZXIucHJvdG90eXBlLmdldERlZmF1bHRzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBQb3BvdmVyLkRFRkFVTFRTXG4gIH1cblxuICBQb3BvdmVyLnByb3RvdHlwZS5zZXRDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciAkdGlwICAgID0gdGhpcy50aXAoKVxuICAgIHZhciB0aXRsZSAgID0gdGhpcy5nZXRUaXRsZSgpXG4gICAgdmFyIGNvbnRlbnQgPSB0aGlzLmdldENvbnRlbnQoKVxuXG4gICAgJHRpcC5maW5kKCcucG9wb3Zlci10aXRsZScpW3RoaXMub3B0aW9ucy5odG1sID8gJ2h0bWwnIDogJ3RleHQnXSh0aXRsZSlcbiAgICAkdGlwLmZpbmQoJy5wb3BvdmVyLWNvbnRlbnQnKS5jaGlsZHJlbigpLmRldGFjaCgpLmVuZCgpWyAvLyB3ZSB1c2UgYXBwZW5kIGZvciBodG1sIG9iamVjdHMgdG8gbWFpbnRhaW4ganMgZXZlbnRzXG4gICAgICB0aGlzLm9wdGlvbnMuaHRtbCA/ICh0eXBlb2YgY29udGVudCA9PSAnc3RyaW5nJyA/ICdodG1sJyA6ICdhcHBlbmQnKSA6ICd0ZXh0J1xuICAgIF0oY29udGVudClcblxuICAgICR0aXAucmVtb3ZlQ2xhc3MoJ2ZhZGUgdG9wIGJvdHRvbSBsZWZ0IHJpZ2h0IGluJylcblxuICAgIC8vIElFOCBkb2Vzbid0IGFjY2VwdCBoaWRpbmcgdmlhIHRoZSBgOmVtcHR5YCBwc2V1ZG8gc2VsZWN0b3IsIHdlIGhhdmUgdG8gZG9cbiAgICAvLyB0aGlzIG1hbnVhbGx5IGJ5IGNoZWNraW5nIHRoZSBjb250ZW50cy5cbiAgICBpZiAoISR0aXAuZmluZCgnLnBvcG92ZXItdGl0bGUnKS5odG1sKCkpICR0aXAuZmluZCgnLnBvcG92ZXItdGl0bGUnKS5oaWRlKClcbiAgfVxuXG4gIFBvcG92ZXIucHJvdG90eXBlLmhhc0NvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VGl0bGUoKSB8fCB0aGlzLmdldENvbnRlbnQoKVxuICB9XG5cbiAgUG9wb3Zlci5wcm90b3R5cGUuZ2V0Q29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJGUgPSB0aGlzLiRlbGVtZW50XG4gICAgdmFyIG8gID0gdGhpcy5vcHRpb25zXG5cbiAgICByZXR1cm4gJGUuYXR0cignZGF0YS1jb250ZW50JylcbiAgICAgIHx8ICh0eXBlb2Ygby5jb250ZW50ID09ICdmdW5jdGlvbicgP1xuICAgICAgICAgICAgby5jb250ZW50LmNhbGwoJGVbMF0pIDpcbiAgICAgICAgICAgIG8uY29udGVudClcbiAgfVxuXG4gIFBvcG92ZXIucHJvdG90eXBlLmFycm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAodGhpcy4kYXJyb3cgPSB0aGlzLiRhcnJvdyB8fCB0aGlzLnRpcCgpLmZpbmQoJy5hcnJvdycpKVxuICB9XG5cblxuICAvLyBQT1BPVkVSIFBMVUdJTiBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMucG9wb3ZlcicpXG4gICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXG5cbiAgICAgIGlmICghZGF0YSAmJiAvZGVzdHJveXxoaWRlLy50ZXN0KG9wdGlvbikpIHJldHVyblxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdicy5wb3BvdmVyJywgKGRhdGEgPSBuZXcgUG9wb3Zlcih0aGlzLCBvcHRpb25zKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG9sZCA9ICQuZm4ucG9wb3ZlclxuXG4gICQuZm4ucG9wb3ZlciAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLnBvcG92ZXIuQ29uc3RydWN0b3IgPSBQb3BvdmVyXG5cblxuICAvLyBQT1BPVkVSIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09PT1cblxuICAkLmZuLnBvcG92ZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuLnBvcG92ZXIgPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbn0oalF1ZXJ5KTtcbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiBzY3JvbGxzcHkuanMgdjMuMy43XG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNzY3JvbGxzcHlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBTQ1JPTExTUFkgQ0xBU1MgREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIFNjcm9sbFNweShlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kYm9keSAgICAgICAgICA9ICQoZG9jdW1lbnQuYm9keSlcbiAgICB0aGlzLiRzY3JvbGxFbGVtZW50ID0gJChlbGVtZW50KS5pcyhkb2N1bWVudC5ib2R5KSA/ICQod2luZG93KSA6ICQoZWxlbWVudClcbiAgICB0aGlzLm9wdGlvbnMgICAgICAgID0gJC5leHRlbmQoe30sIFNjcm9sbFNweS5ERUZBVUxUUywgb3B0aW9ucylcbiAgICB0aGlzLnNlbGVjdG9yICAgICAgID0gKHRoaXMub3B0aW9ucy50YXJnZXQgfHwgJycpICsgJyAubmF2IGxpID4gYSdcbiAgICB0aGlzLm9mZnNldHMgICAgICAgID0gW11cbiAgICB0aGlzLnRhcmdldHMgICAgICAgID0gW11cbiAgICB0aGlzLmFjdGl2ZVRhcmdldCAgID0gbnVsbFxuICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ICAgPSAwXG5cbiAgICB0aGlzLiRzY3JvbGxFbGVtZW50Lm9uKCdzY3JvbGwuYnMuc2Nyb2xsc3B5JywgJC5wcm94eSh0aGlzLnByb2Nlc3MsIHRoaXMpKVxuICAgIHRoaXMucmVmcmVzaCgpXG4gICAgdGhpcy5wcm9jZXNzKClcbiAgfVxuXG4gIFNjcm9sbFNweS5WRVJTSU9OICA9ICczLjMuNydcblxuICBTY3JvbGxTcHkuREVGQVVMVFMgPSB7XG4gICAgb2Zmc2V0OiAxMFxuICB9XG5cbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5nZXRTY3JvbGxIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuJHNjcm9sbEVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0IHx8IE1hdGgubWF4KHRoaXMuJGJvZHlbMF0uc2Nyb2xsSGVpZ2h0LCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KVxuICB9XG5cbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aGF0ICAgICAgICAgID0gdGhpc1xuICAgIHZhciBvZmZzZXRNZXRob2QgID0gJ29mZnNldCdcbiAgICB2YXIgb2Zmc2V0QmFzZSAgICA9IDBcblxuICAgIHRoaXMub2Zmc2V0cyAgICAgID0gW11cbiAgICB0aGlzLnRhcmdldHMgICAgICA9IFtdXG4gICAgdGhpcy5zY3JvbGxIZWlnaHQgPSB0aGlzLmdldFNjcm9sbEhlaWdodCgpXG5cbiAgICBpZiAoISQuaXNXaW5kb3codGhpcy4kc2Nyb2xsRWxlbWVudFswXSkpIHtcbiAgICAgIG9mZnNldE1ldGhvZCA9ICdwb3NpdGlvbidcbiAgICAgIG9mZnNldEJhc2UgICA9IHRoaXMuJHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wKClcbiAgICB9XG5cbiAgICB0aGlzLiRib2R5XG4gICAgICAuZmluZCh0aGlzLnNlbGVjdG9yKVxuICAgICAgLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkZWwgICA9ICQodGhpcylcbiAgICAgICAgdmFyIGhyZWYgID0gJGVsLmRhdGEoJ3RhcmdldCcpIHx8ICRlbC5hdHRyKCdocmVmJylcbiAgICAgICAgdmFyICRocmVmID0gL14jLi8udGVzdChocmVmKSAmJiAkKGhyZWYpXG5cbiAgICAgICAgcmV0dXJuICgkaHJlZlxuICAgICAgICAgICYmICRocmVmLmxlbmd0aFxuICAgICAgICAgICYmICRocmVmLmlzKCc6dmlzaWJsZScpXG4gICAgICAgICAgJiYgW1skaHJlZltvZmZzZXRNZXRob2RdKCkudG9wICsgb2Zmc2V0QmFzZSwgaHJlZl1dKSB8fCBudWxsXG4gICAgICB9KVxuICAgICAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGFbMF0gLSBiWzBdIH0pXG4gICAgICAuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoYXQub2Zmc2V0cy5wdXNoKHRoaXNbMF0pXG4gICAgICAgIHRoYXQudGFyZ2V0cy5wdXNoKHRoaXNbMV0pXG4gICAgICB9KVxuICB9XG5cbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzY3JvbGxUb3AgICAgPSB0aGlzLiRzY3JvbGxFbGVtZW50LnNjcm9sbFRvcCgpICsgdGhpcy5vcHRpb25zLm9mZnNldFxuICAgIHZhciBzY3JvbGxIZWlnaHQgPSB0aGlzLmdldFNjcm9sbEhlaWdodCgpXG4gICAgdmFyIG1heFNjcm9sbCAgICA9IHRoaXMub3B0aW9ucy5vZmZzZXQgKyBzY3JvbGxIZWlnaHQgLSB0aGlzLiRzY3JvbGxFbGVtZW50LmhlaWdodCgpXG4gICAgdmFyIG9mZnNldHMgICAgICA9IHRoaXMub2Zmc2V0c1xuICAgIHZhciB0YXJnZXRzICAgICAgPSB0aGlzLnRhcmdldHNcbiAgICB2YXIgYWN0aXZlVGFyZ2V0ID0gdGhpcy5hY3RpdmVUYXJnZXRcbiAgICB2YXIgaVxuXG4gICAgaWYgKHRoaXMuc2Nyb2xsSGVpZ2h0ICE9IHNjcm9sbEhlaWdodCkge1xuICAgICAgdGhpcy5yZWZyZXNoKClcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsVG9wID49IG1heFNjcm9sbCkge1xuICAgICAgcmV0dXJuIGFjdGl2ZVRhcmdldCAhPSAoaSA9IHRhcmdldHNbdGFyZ2V0cy5sZW5ndGggLSAxXSkgJiYgdGhpcy5hY3RpdmF0ZShpKVxuICAgIH1cblxuICAgIGlmIChhY3RpdmVUYXJnZXQgJiYgc2Nyb2xsVG9wIDwgb2Zmc2V0c1swXSkge1xuICAgICAgdGhpcy5hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgICByZXR1cm4gdGhpcy5jbGVhcigpXG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0cy5sZW5ndGg7IGktLTspIHtcbiAgICAgIGFjdGl2ZVRhcmdldCAhPSB0YXJnZXRzW2ldXG4gICAgICAgICYmIHNjcm9sbFRvcCA+PSBvZmZzZXRzW2ldXG4gICAgICAgICYmIChvZmZzZXRzW2kgKyAxXSA9PT0gdW5kZWZpbmVkIHx8IHNjcm9sbFRvcCA8IG9mZnNldHNbaSArIDFdKVxuICAgICAgICAmJiB0aGlzLmFjdGl2YXRlKHRhcmdldHNbaV0pXG4gICAgfVxuICB9XG5cbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICB0aGlzLmFjdGl2ZVRhcmdldCA9IHRhcmdldFxuXG4gICAgdGhpcy5jbGVhcigpXG5cbiAgICB2YXIgc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICtcbiAgICAgICdbZGF0YS10YXJnZXQ9XCInICsgdGFyZ2V0ICsgJ1wiXSwnICtcbiAgICAgIHRoaXMuc2VsZWN0b3IgKyAnW2hyZWY9XCInICsgdGFyZ2V0ICsgJ1wiXSdcblxuICAgIHZhciBhY3RpdmUgPSAkKHNlbGVjdG9yKVxuICAgICAgLnBhcmVudHMoJ2xpJylcbiAgICAgIC5hZGRDbGFzcygnYWN0aXZlJylcblxuICAgIGlmIChhY3RpdmUucGFyZW50KCcuZHJvcGRvd24tbWVudScpLmxlbmd0aCkge1xuICAgICAgYWN0aXZlID0gYWN0aXZlXG4gICAgICAgIC5jbG9zZXN0KCdsaS5kcm9wZG93bicpXG4gICAgICAgIC5hZGRDbGFzcygnYWN0aXZlJylcbiAgICB9XG5cbiAgICBhY3RpdmUudHJpZ2dlcignYWN0aXZhdGUuYnMuc2Nyb2xsc3B5JylcbiAgfVxuXG4gIFNjcm9sbFNweS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgJCh0aGlzLnNlbGVjdG9yKVxuICAgICAgLnBhcmVudHNVbnRpbCh0aGlzLm9wdGlvbnMudGFyZ2V0LCAnLmFjdGl2ZScpXG4gICAgICAucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gIH1cblxuXG4gIC8vIFNDUk9MTFNQWSBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMuc2Nyb2xsc3B5JylcbiAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cblxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdicy5zY3JvbGxzcHknLCAoZGF0YSA9IG5ldyBTY3JvbGxTcHkodGhpcywgb3B0aW9ucykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLnNjcm9sbHNweVxuXG4gICQuZm4uc2Nyb2xsc3B5ICAgICAgICAgICAgID0gUGx1Z2luXG4gICQuZm4uc2Nyb2xsc3B5LkNvbnN0cnVjdG9yID0gU2Nyb2xsU3B5XG5cblxuICAvLyBTQ1JPTExTUFkgTk8gQ09ORkxJQ1RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5zY3JvbGxzcHkubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuLnNjcm9sbHNweSA9IG9sZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIC8vIFNDUk9MTFNQWSBEQVRBLUFQSVxuICAvLyA9PT09PT09PT09PT09PT09PT1cblxuICAkKHdpbmRvdykub24oJ2xvYWQuYnMuc2Nyb2xsc3B5LmRhdGEtYXBpJywgZnVuY3Rpb24gKCkge1xuICAgICQoJ1tkYXRhLXNweT1cInNjcm9sbFwiXScpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRzcHkgPSAkKHRoaXMpXG4gICAgICBQbHVnaW4uY2FsbCgkc3B5LCAkc3B5LmRhdGEoKSlcbiAgICB9KVxuICB9KVxuXG59KGpRdWVyeSk7XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogdGFiLmpzIHYzLjMuN1xuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jdGFic1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4rZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIFRBQiBDTEFTUyBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIFRhYiA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgLy8ganNjczpkaXNhYmxlIHJlcXVpcmVEb2xsYXJCZWZvcmVqUXVlcnlBc3NpZ25tZW50XG4gICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KVxuICAgIC8vIGpzY3M6ZW5hYmxlIHJlcXVpcmVEb2xsYXJCZWZvcmVqUXVlcnlBc3NpZ25tZW50XG4gIH1cblxuICBUYWIuVkVSU0lPTiA9ICczLjMuNydcblxuICBUYWIuVFJBTlNJVElPTl9EVVJBVElPTiA9IDE1MFxuXG4gIFRhYi5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJHRoaXMgICAgPSB0aGlzLmVsZW1lbnRcbiAgICB2YXIgJHVsICAgICAgPSAkdGhpcy5jbG9zZXN0KCd1bDpub3QoLmRyb3Bkb3duLW1lbnUpJylcbiAgICB2YXIgc2VsZWN0b3IgPSAkdGhpcy5kYXRhKCd0YXJnZXQnKVxuXG4gICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdocmVmJylcbiAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IgJiYgc2VsZWN0b3IucmVwbGFjZSgvLiooPz0jW15cXHNdKiQpLywgJycpIC8vIHN0cmlwIGZvciBpZTdcbiAgICB9XG5cbiAgICBpZiAoJHRoaXMucGFyZW50KCdsaScpLmhhc0NsYXNzKCdhY3RpdmUnKSkgcmV0dXJuXG5cbiAgICB2YXIgJHByZXZpb3VzID0gJHVsLmZpbmQoJy5hY3RpdmU6bGFzdCBhJylcbiAgICB2YXIgaGlkZUV2ZW50ID0gJC5FdmVudCgnaGlkZS5icy50YWInLCB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiAkdGhpc1swXVxuICAgIH0pXG4gICAgdmFyIHNob3dFdmVudCA9ICQuRXZlbnQoJ3Nob3cuYnMudGFiJywge1xuICAgICAgcmVsYXRlZFRhcmdldDogJHByZXZpb3VzWzBdXG4gICAgfSlcblxuICAgICRwcmV2aW91cy50cmlnZ2VyKGhpZGVFdmVudClcbiAgICAkdGhpcy50cmlnZ2VyKHNob3dFdmVudClcblxuICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cblxuICAgIHZhciAkdGFyZ2V0ID0gJChzZWxlY3RvcilcblxuICAgIHRoaXMuYWN0aXZhdGUoJHRoaXMuY2xvc2VzdCgnbGknKSwgJHVsKVxuICAgIHRoaXMuYWN0aXZhdGUoJHRhcmdldCwgJHRhcmdldC5wYXJlbnQoKSwgZnVuY3Rpb24gKCkge1xuICAgICAgJHByZXZpb3VzLnRyaWdnZXIoe1xuICAgICAgICB0eXBlOiAnaGlkZGVuLmJzLnRhYicsXG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6ICR0aGlzWzBdXG4gICAgICB9KVxuICAgICAgJHRoaXMudHJpZ2dlcih7XG4gICAgICAgIHR5cGU6ICdzaG93bi5icy50YWInLFxuICAgICAgICByZWxhdGVkVGFyZ2V0OiAkcHJldmlvdXNbMF1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIFRhYi5wcm90b3R5cGUuYWN0aXZhdGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgIHZhciAkYWN0aXZlICAgID0gY29udGFpbmVyLmZpbmQoJz4gLmFjdGl2ZScpXG4gICAgdmFyIHRyYW5zaXRpb24gPSBjYWxsYmFja1xuICAgICAgJiYgJC5zdXBwb3J0LnRyYW5zaXRpb25cbiAgICAgICYmICgkYWN0aXZlLmxlbmd0aCAmJiAkYWN0aXZlLmhhc0NsYXNzKCdmYWRlJykgfHwgISFjb250YWluZXIuZmluZCgnPiAuZmFkZScpLmxlbmd0aClcblxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAkYWN0aXZlXG4gICAgICAgIC5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICAgICAgLmZpbmQoJz4gLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlJylcbiAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAgIC5lbmQoKVxuICAgICAgICAuZmluZCgnW2RhdGEtdG9nZ2xlPVwidGFiXCJdJylcbiAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKVxuXG4gICAgICBlbGVtZW50XG4gICAgICAgIC5hZGRDbGFzcygnYWN0aXZlJylcbiAgICAgICAgLmZpbmQoJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXScpXG4gICAgICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxuXG4gICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICBlbGVtZW50WzBdLm9mZnNldFdpZHRoIC8vIHJlZmxvdyBmb3IgdHJhbnNpdGlvblxuICAgICAgICBlbGVtZW50LmFkZENsYXNzKCdpbicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUNsYXNzKCdmYWRlJylcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQucGFyZW50KCcuZHJvcGRvd24tbWVudScpLmxlbmd0aCkge1xuICAgICAgICBlbGVtZW50XG4gICAgICAgICAgLmNsb3Nlc3QoJ2xpLmRyb3Bkb3duJylcbiAgICAgICAgICAgIC5hZGRDbGFzcygnYWN0aXZlJylcbiAgICAgICAgICAuZW5kKClcbiAgICAgICAgICAuZmluZCgnW2RhdGEtdG9nZ2xlPVwidGFiXCJdJylcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSlcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH1cblxuICAgICRhY3RpdmUubGVuZ3RoICYmIHRyYW5zaXRpb24gP1xuICAgICAgJGFjdGl2ZVxuICAgICAgICAub25lKCdic1RyYW5zaXRpb25FbmQnLCBuZXh0KVxuICAgICAgICAuZW11bGF0ZVRyYW5zaXRpb25FbmQoVGFiLlRSQU5TSVRJT05fRFVSQVRJT04pIDpcbiAgICAgIG5leHQoKVxuXG4gICAgJGFjdGl2ZS5yZW1vdmVDbGFzcygnaW4nKVxuICB9XG5cblxuICAvLyBUQUIgUExVR0lOIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzID0gJCh0aGlzKVxuICAgICAgdmFyIGRhdGEgID0gJHRoaXMuZGF0YSgnYnMudGFiJylcblxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdicy50YWInLCAoZGF0YSA9IG5ldyBUYWIodGhpcykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLnRhYlxuXG4gICQuZm4udGFiICAgICAgICAgICAgID0gUGx1Z2luXG4gICQuZm4udGFiLkNvbnN0cnVjdG9yID0gVGFiXG5cblxuICAvLyBUQUIgTk8gQ09ORkxJQ1RcbiAgLy8gPT09PT09PT09PT09PT09XG5cbiAgJC5mbi50YWIubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuLnRhYiA9IG9sZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIC8vIFRBQiBEQVRBLUFQSVxuICAvLyA9PT09PT09PT09PT1cblxuICB2YXIgY2xpY2tIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBQbHVnaW4uY2FsbCgkKHRoaXMpLCAnc2hvdycpXG4gIH1cblxuICAkKGRvY3VtZW50KVxuICAgIC5vbignY2xpY2suYnMudGFiLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXScsIGNsaWNrSGFuZGxlcilcbiAgICAub24oJ2NsaWNrLmJzLnRhYi5kYXRhLWFwaScsICdbZGF0YS10b2dnbGU9XCJwaWxsXCJdJywgY2xpY2tIYW5kbGVyKVxuXG59KGpRdWVyeSk7XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogdG9vbHRpcC5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI3Rvb2x0aXBcbiAqIEluc3BpcmVkIGJ5IHRoZSBvcmlnaW5hbCBqUXVlcnkudGlwc3kgYnkgSmFzb24gRnJhbWVcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBUT09MVElQIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgVG9vbHRpcCA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy50eXBlICAgICAgID0gbnVsbFxuICAgIHRoaXMub3B0aW9ucyAgICA9IG51bGxcbiAgICB0aGlzLmVuYWJsZWQgICAgPSBudWxsXG4gICAgdGhpcy50aW1lb3V0ICAgID0gbnVsbFxuICAgIHRoaXMuaG92ZXJTdGF0ZSA9IG51bGxcbiAgICB0aGlzLiRlbGVtZW50ICAgPSBudWxsXG4gICAgdGhpcy5pblN0YXRlICAgID0gbnVsbFxuXG4gICAgdGhpcy5pbml0KCd0b29sdGlwJywgZWxlbWVudCwgb3B0aW9ucylcbiAgfVxuXG4gIFRvb2x0aXAuVkVSU0lPTiAgPSAnMy4zLjcnXG5cbiAgVG9vbHRpcC5UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwXG5cbiAgVG9vbHRpcC5ERUZBVUxUUyA9IHtcbiAgICBhbmltYXRpb246IHRydWUsXG4gICAgcGxhY2VtZW50OiAndG9wJyxcbiAgICBzZWxlY3RvcjogZmFsc2UsXG4gICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwidG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+PGRpdiBjbGFzcz1cInRvb2x0aXAtYXJyb3dcIj48L2Rpdj48ZGl2IGNsYXNzPVwidG9vbHRpcC1pbm5lclwiPjwvZGl2PjwvZGl2PicsXG4gICAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJyxcbiAgICB0aXRsZTogJycsXG4gICAgZGVsYXk6IDAsXG4gICAgaHRtbDogZmFsc2UsXG4gICAgY29udGFpbmVyOiBmYWxzZSxcbiAgICB2aWV3cG9ydDoge1xuICAgICAgc2VsZWN0b3I6ICdib2R5JyxcbiAgICAgIHBhZGRpbmc6IDBcbiAgICB9XG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKHR5cGUsIGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmVuYWJsZWQgICA9IHRydWVcbiAgICB0aGlzLnR5cGUgICAgICA9IHR5cGVcbiAgICB0aGlzLiRlbGVtZW50ICA9ICQoZWxlbWVudClcbiAgICB0aGlzLm9wdGlvbnMgICA9IHRoaXMuZ2V0T3B0aW9ucyhvcHRpb25zKVxuICAgIHRoaXMuJHZpZXdwb3J0ID0gdGhpcy5vcHRpb25zLnZpZXdwb3J0ICYmICQoJC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy52aWV3cG9ydCkgPyB0aGlzLm9wdGlvbnMudmlld3BvcnQuY2FsbCh0aGlzLCB0aGlzLiRlbGVtZW50KSA6ICh0aGlzLm9wdGlvbnMudmlld3BvcnQuc2VsZWN0b3IgfHwgdGhpcy5vcHRpb25zLnZpZXdwb3J0KSlcbiAgICB0aGlzLmluU3RhdGUgICA9IHsgY2xpY2s6IGZhbHNlLCBob3ZlcjogZmFsc2UsIGZvY3VzOiBmYWxzZSB9XG5cbiAgICBpZiAodGhpcy4kZWxlbWVudFswXSBpbnN0YW5jZW9mIGRvY3VtZW50LmNvbnN0cnVjdG9yICYmICF0aGlzLm9wdGlvbnMuc2VsZWN0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYHNlbGVjdG9yYCBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBpbml0aWFsaXppbmcgJyArIHRoaXMudHlwZSArICcgb24gdGhlIHdpbmRvdy5kb2N1bWVudCBvYmplY3QhJylcbiAgICB9XG5cbiAgICB2YXIgdHJpZ2dlcnMgPSB0aGlzLm9wdGlvbnMudHJpZ2dlci5zcGxpdCgnICcpXG5cbiAgICBmb3IgKHZhciBpID0gdHJpZ2dlcnMubGVuZ3RoOyBpLS07KSB7XG4gICAgICB2YXIgdHJpZ2dlciA9IHRyaWdnZXJzW2ldXG5cbiAgICAgIGlmICh0cmlnZ2VyID09ICdjbGljaycpIHtcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbignY2xpY2suJyArIHRoaXMudHlwZSwgdGhpcy5vcHRpb25zLnNlbGVjdG9yLCAkLnByb3h5KHRoaXMudG9nZ2xlLCB0aGlzKSlcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPSAnbWFudWFsJykge1xuICAgICAgICB2YXIgZXZlbnRJbiAgPSB0cmlnZ2VyID09ICdob3ZlcicgPyAnbW91c2VlbnRlcicgOiAnZm9jdXNpbidcbiAgICAgICAgdmFyIGV2ZW50T3V0ID0gdHJpZ2dlciA9PSAnaG92ZXInID8gJ21vdXNlbGVhdmUnIDogJ2ZvY3Vzb3V0J1xuXG4gICAgICAgIHRoaXMuJGVsZW1lbnQub24oZXZlbnRJbiAgKyAnLicgKyB0aGlzLnR5cGUsIHRoaXMub3B0aW9ucy5zZWxlY3RvciwgJC5wcm94eSh0aGlzLmVudGVyLCB0aGlzKSlcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbihldmVudE91dCArICcuJyArIHRoaXMudHlwZSwgdGhpcy5vcHRpb25zLnNlbGVjdG9yLCAkLnByb3h5KHRoaXMubGVhdmUsIHRoaXMpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy5zZWxlY3RvciA/XG4gICAgICAodGhpcy5fb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMsIHsgdHJpZ2dlcjogJ21hbnVhbCcsIHNlbGVjdG9yOiAnJyB9KSkgOlxuICAgICAgdGhpcy5maXhUaXRsZSgpXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5nZXREZWZhdWx0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVG9vbHRpcC5ERUZBVUxUU1xuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmdldERlZmF1bHRzKCksIHRoaXMuJGVsZW1lbnQuZGF0YSgpLCBvcHRpb25zKVxuXG4gICAgaWYgKG9wdGlvbnMuZGVsYXkgJiYgdHlwZW9mIG9wdGlvbnMuZGVsYXkgPT0gJ251bWJlcicpIHtcbiAgICAgIG9wdGlvbnMuZGVsYXkgPSB7XG4gICAgICAgIHNob3c6IG9wdGlvbnMuZGVsYXksXG4gICAgICAgIGhpZGU6IG9wdGlvbnMuZGVsYXlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uc1xuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZ2V0RGVsZWdhdGVPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvcHRpb25zICA9IHt9XG4gICAgdmFyIGRlZmF1bHRzID0gdGhpcy5nZXREZWZhdWx0cygpXG5cbiAgICB0aGlzLl9vcHRpb25zICYmICQuZWFjaCh0aGlzLl9vcHRpb25zLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGRlZmF1bHRzW2tleV0gIT0gdmFsdWUpIG9wdGlvbnNba2V5XSA9IHZhbHVlXG4gICAgfSlcblxuICAgIHJldHVybiBvcHRpb25zXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5lbnRlciA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgc2VsZiA9IG9iaiBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IgP1xuICAgICAgb2JqIDogJChvYmouY3VycmVudFRhcmdldCkuZGF0YSgnYnMuJyArIHRoaXMudHlwZSlcblxuICAgIGlmICghc2VsZikge1xuICAgICAgc2VsZiA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKG9iai5jdXJyZW50VGFyZ2V0LCB0aGlzLmdldERlbGVnYXRlT3B0aW9ucygpKVxuICAgICAgJChvYmouY3VycmVudFRhcmdldCkuZGF0YSgnYnMuJyArIHRoaXMudHlwZSwgc2VsZilcbiAgICB9XG5cbiAgICBpZiAob2JqIGluc3RhbmNlb2YgJC5FdmVudCkge1xuICAgICAgc2VsZi5pblN0YXRlW29iai50eXBlID09ICdmb2N1c2luJyA/ICdmb2N1cycgOiAnaG92ZXInXSA9IHRydWVcbiAgICB9XG5cbiAgICBpZiAoc2VsZi50aXAoKS5oYXNDbGFzcygnaW4nKSB8fCBzZWxmLmhvdmVyU3RhdGUgPT0gJ2luJykge1xuICAgICAgc2VsZi5ob3ZlclN0YXRlID0gJ2luJ1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHNlbGYudGltZW91dClcblxuICAgIHNlbGYuaG92ZXJTdGF0ZSA9ICdpbidcblxuICAgIGlmICghc2VsZi5vcHRpb25zLmRlbGF5IHx8ICFzZWxmLm9wdGlvbnMuZGVsYXkuc2hvdykgcmV0dXJuIHNlbGYuc2hvdygpXG5cbiAgICBzZWxmLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLmhvdmVyU3RhdGUgPT0gJ2luJykgc2VsZi5zaG93KClcbiAgICB9LCBzZWxmLm9wdGlvbnMuZGVsYXkuc2hvdylcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmlzSW5TdGF0ZVRydWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuaW5TdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuaW5TdGF0ZVtrZXldKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUubGVhdmUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgdmFyIHNlbGYgPSBvYmogaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yID9cbiAgICAgIG9iaiA6ICQob2JqLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2JzLicgKyB0aGlzLnR5cGUpXG5cbiAgICBpZiAoIXNlbGYpIHtcbiAgICAgIHNlbGYgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihvYmouY3VycmVudFRhcmdldCwgdGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSlcbiAgICAgICQob2JqLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2JzLicgKyB0aGlzLnR5cGUsIHNlbGYpXG4gICAgfVxuXG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mICQuRXZlbnQpIHtcbiAgICAgIHNlbGYuaW5TdGF0ZVtvYmoudHlwZSA9PSAnZm9jdXNvdXQnID8gJ2ZvY3VzJyA6ICdob3ZlciddID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5pc0luU3RhdGVUcnVlKCkpIHJldHVyblxuXG4gICAgY2xlYXJUaW1lb3V0KHNlbGYudGltZW91dClcblxuICAgIHNlbGYuaG92ZXJTdGF0ZSA9ICdvdXQnXG5cbiAgICBpZiAoIXNlbGYub3B0aW9ucy5kZWxheSB8fCAhc2VsZi5vcHRpb25zLmRlbGF5LmhpZGUpIHJldHVybiBzZWxmLmhpZGUoKVxuXG4gICAgc2VsZi50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc2VsZi5ob3ZlclN0YXRlID09ICdvdXQnKSBzZWxmLmhpZGUoKVxuICAgIH0sIHNlbGYub3B0aW9ucy5kZWxheS5oaWRlKVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZSA9ICQuRXZlbnQoJ3Nob3cuYnMuJyArIHRoaXMudHlwZSlcblxuICAgIGlmICh0aGlzLmhhc0NvbnRlbnQoKSAmJiB0aGlzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKVxuXG4gICAgICB2YXIgaW5Eb20gPSAkLmNvbnRhaW5zKHRoaXMuJGVsZW1lbnRbMF0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHRoaXMuJGVsZW1lbnRbMF0pXG4gICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSB8fCAhaW5Eb20pIHJldHVyblxuICAgICAgdmFyIHRoYXQgPSB0aGlzXG5cbiAgICAgIHZhciAkdGlwID0gdGhpcy50aXAoKVxuXG4gICAgICB2YXIgdGlwSWQgPSB0aGlzLmdldFVJRCh0aGlzLnR5cGUpXG5cbiAgICAgIHRoaXMuc2V0Q29udGVudCgpXG4gICAgICAkdGlwLmF0dHIoJ2lkJywgdGlwSWQpXG4gICAgICB0aGlzLiRlbGVtZW50LmF0dHIoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXBJZClcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb24pICR0aXAuYWRkQ2xhc3MoJ2ZhZGUnKVxuXG4gICAgICB2YXIgcGxhY2VtZW50ID0gdHlwZW9mIHRoaXMub3B0aW9ucy5wbGFjZW1lbnQgPT0gJ2Z1bmN0aW9uJyA/XG4gICAgICAgIHRoaXMub3B0aW9ucy5wbGFjZW1lbnQuY2FsbCh0aGlzLCAkdGlwWzBdLCB0aGlzLiRlbGVtZW50WzBdKSA6XG4gICAgICAgIHRoaXMub3B0aW9ucy5wbGFjZW1lbnRcblxuICAgICAgdmFyIGF1dG9Ub2tlbiA9IC9cXHM/YXV0bz9cXHM/L2lcbiAgICAgIHZhciBhdXRvUGxhY2UgPSBhdXRvVG9rZW4udGVzdChwbGFjZW1lbnQpXG4gICAgICBpZiAoYXV0b1BsYWNlKSBwbGFjZW1lbnQgPSBwbGFjZW1lbnQucmVwbGFjZShhdXRvVG9rZW4sICcnKSB8fCAndG9wJ1xuXG4gICAgICAkdGlwXG4gICAgICAgIC5kZXRhY2goKVxuICAgICAgICAuY3NzKHsgdG9wOiAwLCBsZWZ0OiAwLCBkaXNwbGF5OiAnYmxvY2snIH0pXG4gICAgICAgIC5hZGRDbGFzcyhwbGFjZW1lbnQpXG4gICAgICAgIC5kYXRhKCdicy4nICsgdGhpcy50eXBlLCB0aGlzKVxuXG4gICAgICB0aGlzLm9wdGlvbnMuY29udGFpbmVyID8gJHRpcC5hcHBlbmRUbyh0aGlzLm9wdGlvbnMuY29udGFpbmVyKSA6ICR0aXAuaW5zZXJ0QWZ0ZXIodGhpcy4kZWxlbWVudClcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignaW5zZXJ0ZWQuYnMuJyArIHRoaXMudHlwZSlcblxuICAgICAgdmFyIHBvcyAgICAgICAgICA9IHRoaXMuZ2V0UG9zaXRpb24oKVxuICAgICAgdmFyIGFjdHVhbFdpZHRoICA9ICR0aXBbMF0ub2Zmc2V0V2lkdGhcbiAgICAgIHZhciBhY3R1YWxIZWlnaHQgPSAkdGlwWzBdLm9mZnNldEhlaWdodFxuXG4gICAgICBpZiAoYXV0b1BsYWNlKSB7XG4gICAgICAgIHZhciBvcmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRcbiAgICAgICAgdmFyIHZpZXdwb3J0RGltID0gdGhpcy5nZXRQb3NpdGlvbih0aGlzLiR2aWV3cG9ydClcblxuICAgICAgICBwbGFjZW1lbnQgPSBwbGFjZW1lbnQgPT0gJ2JvdHRvbScgJiYgcG9zLmJvdHRvbSArIGFjdHVhbEhlaWdodCA+IHZpZXdwb3J0RGltLmJvdHRvbSA/ICd0b3AnICAgIDpcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50ID09ICd0b3AnICAgICYmIHBvcy50b3AgICAgLSBhY3R1YWxIZWlnaHQgPCB2aWV3cG9ydERpbS50b3AgICAgPyAnYm90dG9tJyA6XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudCA9PSAncmlnaHQnICAmJiBwb3MucmlnaHQgICsgYWN0dWFsV2lkdGggID4gdmlld3BvcnREaW0ud2lkdGggID8gJ2xlZnQnICAgOlxuICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQgPT0gJ2xlZnQnICAgJiYgcG9zLmxlZnQgICAtIGFjdHVhbFdpZHRoICA8IHZpZXdwb3J0RGltLmxlZnQgICA/ICdyaWdodCcgIDpcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50XG5cbiAgICAgICAgJHRpcFxuICAgICAgICAgIC5yZW1vdmVDbGFzcyhvcmdQbGFjZW1lbnQpXG4gICAgICAgICAgLmFkZENsYXNzKHBsYWNlbWVudClcbiAgICAgIH1cblxuICAgICAgdmFyIGNhbGN1bGF0ZWRPZmZzZXQgPSB0aGlzLmdldENhbGN1bGF0ZWRPZmZzZXQocGxhY2VtZW50LCBwb3MsIGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQpXG5cbiAgICAgIHRoaXMuYXBwbHlQbGFjZW1lbnQoY2FsY3VsYXRlZE9mZnNldCwgcGxhY2VtZW50KVxuXG4gICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcmV2SG92ZXJTdGF0ZSA9IHRoYXQuaG92ZXJTdGF0ZVxuICAgICAgICB0aGF0LiRlbGVtZW50LnRyaWdnZXIoJ3Nob3duLmJzLicgKyB0aGF0LnR5cGUpXG4gICAgICAgIHRoYXQuaG92ZXJTdGF0ZSA9IG51bGxcblxuICAgICAgICBpZiAocHJldkhvdmVyU3RhdGUgPT0gJ291dCcpIHRoYXQubGVhdmUodGhhdClcbiAgICAgIH1cblxuICAgICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhpcy4kdGlwLmhhc0NsYXNzKCdmYWRlJykgP1xuICAgICAgICAkdGlwXG4gICAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgY29tcGxldGUpXG4gICAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKFRvb2x0aXAuVFJBTlNJVElPTl9EVVJBVElPTikgOlxuICAgICAgICBjb21wbGV0ZSgpXG4gICAgfVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuYXBwbHlQbGFjZW1lbnQgPSBmdW5jdGlvbiAob2Zmc2V0LCBwbGFjZW1lbnQpIHtcbiAgICB2YXIgJHRpcCAgID0gdGhpcy50aXAoKVxuICAgIHZhciB3aWR0aCAgPSAkdGlwWzBdLm9mZnNldFdpZHRoXG4gICAgdmFyIGhlaWdodCA9ICR0aXBbMF0ub2Zmc2V0SGVpZ2h0XG5cbiAgICAvLyBtYW51YWxseSByZWFkIG1hcmdpbnMgYmVjYXVzZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaW5jbHVkZXMgZGlmZmVyZW5jZVxuICAgIHZhciBtYXJnaW5Ub3AgPSBwYXJzZUludCgkdGlwLmNzcygnbWFyZ2luLXRvcCcpLCAxMClcbiAgICB2YXIgbWFyZ2luTGVmdCA9IHBhcnNlSW50KCR0aXAuY3NzKCdtYXJnaW4tbGVmdCcpLCAxMClcblxuICAgIC8vIHdlIG11c3QgY2hlY2sgZm9yIE5hTiBmb3IgaWUgOC85XG4gICAgaWYgKGlzTmFOKG1hcmdpblRvcCkpICBtYXJnaW5Ub3AgID0gMFxuICAgIGlmIChpc05hTihtYXJnaW5MZWZ0KSkgbWFyZ2luTGVmdCA9IDBcblxuICAgIG9mZnNldC50b3AgICs9IG1hcmdpblRvcFxuICAgIG9mZnNldC5sZWZ0ICs9IG1hcmdpbkxlZnRcblxuICAgIC8vICQuZm4ub2Zmc2V0IGRvZXNuJ3Qgcm91bmQgcGl4ZWwgdmFsdWVzXG4gICAgLy8gc28gd2UgdXNlIHNldE9mZnNldCBkaXJlY3RseSB3aXRoIG91ciBvd24gZnVuY3Rpb24gQi0wXG4gICAgJC5vZmZzZXQuc2V0T2Zmc2V0KCR0aXBbMF0sICQuZXh0ZW5kKHtcbiAgICAgIHVzaW5nOiBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgJHRpcC5jc3Moe1xuICAgICAgICAgIHRvcDogTWF0aC5yb3VuZChwcm9wcy50b3ApLFxuICAgICAgICAgIGxlZnQ6IE1hdGgucm91bmQocHJvcHMubGVmdClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LCBvZmZzZXQpLCAwKVxuXG4gICAgJHRpcC5hZGRDbGFzcygnaW4nKVxuXG4gICAgLy8gY2hlY2sgdG8gc2VlIGlmIHBsYWNpbmcgdGlwIGluIG5ldyBvZmZzZXQgY2F1c2VkIHRoZSB0aXAgdG8gcmVzaXplIGl0c2VsZlxuICAgIHZhciBhY3R1YWxXaWR0aCAgPSAkdGlwWzBdLm9mZnNldFdpZHRoXG4gICAgdmFyIGFjdHVhbEhlaWdodCA9ICR0aXBbMF0ub2Zmc2V0SGVpZ2h0XG5cbiAgICBpZiAocGxhY2VtZW50ID09ICd0b3AnICYmIGFjdHVhbEhlaWdodCAhPSBoZWlnaHQpIHtcbiAgICAgIG9mZnNldC50b3AgPSBvZmZzZXQudG9wICsgaGVpZ2h0IC0gYWN0dWFsSGVpZ2h0XG4gICAgfVxuXG4gICAgdmFyIGRlbHRhID0gdGhpcy5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGEocGxhY2VtZW50LCBvZmZzZXQsIGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQpXG5cbiAgICBpZiAoZGVsdGEubGVmdCkgb2Zmc2V0LmxlZnQgKz0gZGVsdGEubGVmdFxuICAgIGVsc2Ugb2Zmc2V0LnRvcCArPSBkZWx0YS50b3BcblxuICAgIHZhciBpc1ZlcnRpY2FsICAgICAgICAgID0gL3RvcHxib3R0b20vLnRlc3QocGxhY2VtZW50KVxuICAgIHZhciBhcnJvd0RlbHRhICAgICAgICAgID0gaXNWZXJ0aWNhbCA/IGRlbHRhLmxlZnQgKiAyIC0gd2lkdGggKyBhY3R1YWxXaWR0aCA6IGRlbHRhLnRvcCAqIDIgLSBoZWlnaHQgKyBhY3R1YWxIZWlnaHRcbiAgICB2YXIgYXJyb3dPZmZzZXRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyAnb2Zmc2V0V2lkdGgnIDogJ29mZnNldEhlaWdodCdcblxuICAgICR0aXAub2Zmc2V0KG9mZnNldClcbiAgICB0aGlzLnJlcGxhY2VBcnJvdyhhcnJvd0RlbHRhLCAkdGlwWzBdW2Fycm93T2Zmc2V0UG9zaXRpb25dLCBpc1ZlcnRpY2FsKVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUucmVwbGFjZUFycm93ID0gZnVuY3Rpb24gKGRlbHRhLCBkaW1lbnNpb24sIGlzVmVydGljYWwpIHtcbiAgICB0aGlzLmFycm93KClcbiAgICAgIC5jc3MoaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnLCA1MCAqICgxIC0gZGVsdGEgLyBkaW1lbnNpb24pICsgJyUnKVxuICAgICAgLmNzcyhpc1ZlcnRpY2FsID8gJ3RvcCcgOiAnbGVmdCcsICcnKVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuc2V0Q29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJHRpcCAgPSB0aGlzLnRpcCgpXG4gICAgdmFyIHRpdGxlID0gdGhpcy5nZXRUaXRsZSgpXG5cbiAgICAkdGlwLmZpbmQoJy50b29sdGlwLWlubmVyJylbdGhpcy5vcHRpb25zLmh0bWwgPyAnaHRtbCcgOiAndGV4dCddKHRpdGxlKVxuICAgICR0aXAucmVtb3ZlQ2xhc3MoJ2ZhZGUgaW4gdG9wIGJvdHRvbSBsZWZ0IHJpZ2h0JylcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICB2YXIgJHRpcCA9ICQodGhpcy4kdGlwKVxuICAgIHZhciBlICAgID0gJC5FdmVudCgnaGlkZS5icy4nICsgdGhpcy50eXBlKVxuXG4gICAgZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICBpZiAodGhhdC5ob3ZlclN0YXRlICE9ICdpbicpICR0aXAuZGV0YWNoKClcbiAgICAgIGlmICh0aGF0LiRlbGVtZW50KSB7IC8vIFRPRE86IENoZWNrIHdoZXRoZXIgZ3VhcmRpbmcgdGhpcyBjb2RlIHdpdGggdGhpcyBgaWZgIGlzIHJlYWxseSBuZWNlc3NhcnkuXG4gICAgICAgIHRoYXQuJGVsZW1lbnRcbiAgICAgICAgICAucmVtb3ZlQXR0cignYXJpYS1kZXNjcmliZWRieScpXG4gICAgICAgICAgLnRyaWdnZXIoJ2hpZGRlbi5icy4nICsgdGhhdC50eXBlKVxuICAgICAgfVxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH1cblxuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKVxuXG4gICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgJHRpcC5yZW1vdmVDbGFzcygnaW4nKVxuXG4gICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgJHRpcC5oYXNDbGFzcygnZmFkZScpID9cbiAgICAgICR0aXBcbiAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgY29tcGxldGUpXG4gICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChUb29sdGlwLlRSQU5TSVRJT05fRFVSQVRJT04pIDpcbiAgICAgIGNvbXBsZXRlKClcblxuICAgIHRoaXMuaG92ZXJTdGF0ZSA9IG51bGxcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5maXhUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJGUgPSB0aGlzLiRlbGVtZW50XG4gICAgaWYgKCRlLmF0dHIoJ3RpdGxlJykgfHwgdHlwZW9mICRlLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKSAhPSAnc3RyaW5nJykge1xuICAgICAgJGUuYXR0cignZGF0YS1vcmlnaW5hbC10aXRsZScsICRlLmF0dHIoJ3RpdGxlJykgfHwgJycpLmF0dHIoJ3RpdGxlJywgJycpXG4gICAgfVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuaGFzQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUaXRsZSgpXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgkZWxlbWVudCkge1xuICAgICRlbGVtZW50ICAgPSAkZWxlbWVudCB8fCB0aGlzLiRlbGVtZW50XG5cbiAgICB2YXIgZWwgICAgID0gJGVsZW1lbnRbMF1cbiAgICB2YXIgaXNCb2R5ID0gZWwudGFnTmFtZSA9PSAnQk9EWSdcblxuICAgIHZhciBlbFJlY3QgICAgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGlmIChlbFJlY3Qud2lkdGggPT0gbnVsbCkge1xuICAgICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgbWlzc2luZyBpbiBJRTgsIHNvIGNvbXB1dGUgdGhlbSBtYW51YWxseTsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTQwOTNcbiAgICAgIGVsUmVjdCA9ICQuZXh0ZW5kKHt9LCBlbFJlY3QsIHsgd2lkdGg6IGVsUmVjdC5yaWdodCAtIGVsUmVjdC5sZWZ0LCBoZWlnaHQ6IGVsUmVjdC5ib3R0b20gLSBlbFJlY3QudG9wIH0pXG4gICAgfVxuICAgIHZhciBpc1N2ZyA9IHdpbmRvdy5TVkdFbGVtZW50ICYmIGVsIGluc3RhbmNlb2Ygd2luZG93LlNWR0VsZW1lbnRcbiAgICAvLyBBdm9pZCB1c2luZyAkLm9mZnNldCgpIG9uIFNWR3Mgc2luY2UgaXQgZ2l2ZXMgaW5jb3JyZWN0IHJlc3VsdHMgaW4galF1ZXJ5IDMuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMjAyODBcbiAgICB2YXIgZWxPZmZzZXQgID0gaXNCb2R5ID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IChpc1N2ZyA/IG51bGwgOiAkZWxlbWVudC5vZmZzZXQoKSlcbiAgICB2YXIgc2Nyb2xsICAgID0geyBzY3JvbGw6IGlzQm9keSA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgOiAkZWxlbWVudC5zY3JvbGxUb3AoKSB9XG4gICAgdmFyIG91dGVyRGltcyA9IGlzQm9keSA/IHsgd2lkdGg6ICQod2luZG93KS53aWR0aCgpLCBoZWlnaHQ6ICQod2luZG93KS5oZWlnaHQoKSB9IDogbnVsbFxuXG4gICAgcmV0dXJuICQuZXh0ZW5kKHt9LCBlbFJlY3QsIHNjcm9sbCwgb3V0ZXJEaW1zLCBlbE9mZnNldClcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmdldENhbGN1bGF0ZWRPZmZzZXQgPSBmdW5jdGlvbiAocGxhY2VtZW50LCBwb3MsIGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQpIHtcbiAgICByZXR1cm4gcGxhY2VtZW50ID09ICdib3R0b20nID8geyB0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0LCAgIGxlZnQ6IHBvcy5sZWZ0ICsgcG9zLndpZHRoIC8gMiAtIGFjdHVhbFdpZHRoIC8gMiB9IDpcbiAgICAgICAgICAgcGxhY2VtZW50ID09ICd0b3AnICAgID8geyB0b3A6IHBvcy50b3AgLSBhY3R1YWxIZWlnaHQsIGxlZnQ6IHBvcy5sZWZ0ICsgcG9zLndpZHRoIC8gMiAtIGFjdHVhbFdpZHRoIC8gMiB9IDpcbiAgICAgICAgICAgcGxhY2VtZW50ID09ICdsZWZ0JyAgID8geyB0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0IC8gMiAtIGFjdHVhbEhlaWdodCAvIDIsIGxlZnQ6IHBvcy5sZWZ0IC0gYWN0dWFsV2lkdGggfSA6XG4gICAgICAgIC8qIHBsYWNlbWVudCA9PSAncmlnaHQnICovIHsgdG9wOiBwb3MudG9wICsgcG9zLmhlaWdodCAvIDIgLSBhY3R1YWxIZWlnaHQgLyAyLCBsZWZ0OiBwb3MubGVmdCArIHBvcy53aWR0aCB9XG5cbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmdldFZpZXdwb3J0QWRqdXN0ZWREZWx0YSA9IGZ1bmN0aW9uIChwbGFjZW1lbnQsIHBvcywgYWN0dWFsV2lkdGgsIGFjdHVhbEhlaWdodCkge1xuICAgIHZhciBkZWx0YSA9IHsgdG9wOiAwLCBsZWZ0OiAwIH1cbiAgICBpZiAoIXRoaXMuJHZpZXdwb3J0KSByZXR1cm4gZGVsdGFcblxuICAgIHZhciB2aWV3cG9ydFBhZGRpbmcgPSB0aGlzLm9wdGlvbnMudmlld3BvcnQgJiYgdGhpcy5vcHRpb25zLnZpZXdwb3J0LnBhZGRpbmcgfHwgMFxuICAgIHZhciB2aWV3cG9ydERpbWVuc2lvbnMgPSB0aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KVxuXG4gICAgaWYgKC9yaWdodHxsZWZ0Ly50ZXN0KHBsYWNlbWVudCkpIHtcbiAgICAgIHZhciB0b3BFZGdlT2Zmc2V0ICAgID0gcG9zLnRvcCAtIHZpZXdwb3J0UGFkZGluZyAtIHZpZXdwb3J0RGltZW5zaW9ucy5zY3JvbGxcbiAgICAgIHZhciBib3R0b21FZGdlT2Zmc2V0ID0gcG9zLnRvcCArIHZpZXdwb3J0UGFkZGluZyAtIHZpZXdwb3J0RGltZW5zaW9ucy5zY3JvbGwgKyBhY3R1YWxIZWlnaHRcbiAgICAgIGlmICh0b3BFZGdlT2Zmc2V0IDwgdmlld3BvcnREaW1lbnNpb25zLnRvcCkgeyAvLyB0b3Agb3ZlcmZsb3dcbiAgICAgICAgZGVsdGEudG9wID0gdmlld3BvcnREaW1lbnNpb25zLnRvcCAtIHRvcEVkZ2VPZmZzZXRcbiAgICAgIH0gZWxzZSBpZiAoYm90dG9tRWRnZU9mZnNldCA+IHZpZXdwb3J0RGltZW5zaW9ucy50b3AgKyB2aWV3cG9ydERpbWVuc2lvbnMuaGVpZ2h0KSB7IC8vIGJvdHRvbSBvdmVyZmxvd1xuICAgICAgICBkZWx0YS50b3AgPSB2aWV3cG9ydERpbWVuc2lvbnMudG9wICsgdmlld3BvcnREaW1lbnNpb25zLmhlaWdodCAtIGJvdHRvbUVkZ2VPZmZzZXRcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGxlZnRFZGdlT2Zmc2V0ICA9IHBvcy5sZWZ0IC0gdmlld3BvcnRQYWRkaW5nXG4gICAgICB2YXIgcmlnaHRFZGdlT2Zmc2V0ID0gcG9zLmxlZnQgKyB2aWV3cG9ydFBhZGRpbmcgKyBhY3R1YWxXaWR0aFxuICAgICAgaWYgKGxlZnRFZGdlT2Zmc2V0IDwgdmlld3BvcnREaW1lbnNpb25zLmxlZnQpIHsgLy8gbGVmdCBvdmVyZmxvd1xuICAgICAgICBkZWx0YS5sZWZ0ID0gdmlld3BvcnREaW1lbnNpb25zLmxlZnQgLSBsZWZ0RWRnZU9mZnNldFxuICAgICAgfSBlbHNlIGlmIChyaWdodEVkZ2VPZmZzZXQgPiB2aWV3cG9ydERpbWVuc2lvbnMucmlnaHQpIHsgLy8gcmlnaHQgb3ZlcmZsb3dcbiAgICAgICAgZGVsdGEubGVmdCA9IHZpZXdwb3J0RGltZW5zaW9ucy5sZWZ0ICsgdmlld3BvcnREaW1lbnNpb25zLndpZHRoIC0gcmlnaHRFZGdlT2Zmc2V0XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbHRhXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5nZXRUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGl0bGVcbiAgICB2YXIgJGUgPSB0aGlzLiRlbGVtZW50XG4gICAgdmFyIG8gID0gdGhpcy5vcHRpb25zXG5cbiAgICB0aXRsZSA9ICRlLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKVxuICAgICAgfHwgKHR5cGVvZiBvLnRpdGxlID09ICdmdW5jdGlvbicgPyBvLnRpdGxlLmNhbGwoJGVbMF0pIDogIG8udGl0bGUpXG5cbiAgICByZXR1cm4gdGl0bGVcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmdldFVJRCA9IGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBkbyBwcmVmaXggKz0gfn4oTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApXG4gICAgd2hpbGUgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZWZpeCkpXG4gICAgcmV0dXJuIHByZWZpeFxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUudGlwID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy4kdGlwKSB7XG4gICAgICB0aGlzLiR0aXAgPSAkKHRoaXMub3B0aW9ucy50ZW1wbGF0ZSlcbiAgICAgIGlmICh0aGlzLiR0aXAubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudHlwZSArICcgYHRlbXBsYXRlYCBvcHRpb24gbXVzdCBjb25zaXN0IG9mIGV4YWN0bHkgMSB0b3AtbGV2ZWwgZWxlbWVudCEnKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy4kdGlwXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5hcnJvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKHRoaXMuJGFycm93ID0gdGhpcy4kYXJyb3cgfHwgdGhpcy50aXAoKS5maW5kKCcudG9vbHRpcC1hcnJvdycpKVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLnRvZ2dsZUVuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lbmFibGVkID0gIXRoaXMuZW5hYmxlZFxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICBpZiAoZSkge1xuICAgICAgc2VsZiA9ICQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCdicy4nICsgdGhpcy50eXBlKVxuICAgICAgaWYgKCFzZWxmKSB7XG4gICAgICAgIHNlbGYgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihlLmN1cnJlbnRUYXJnZXQsIHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpXG4gICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCdicy4nICsgdGhpcy50eXBlLCBzZWxmKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlKSB7XG4gICAgICBzZWxmLmluU3RhdGUuY2xpY2sgPSAhc2VsZi5pblN0YXRlLmNsaWNrXG4gICAgICBpZiAoc2VsZi5pc0luU3RhdGVUcnVlKCkpIHNlbGYuZW50ZXIoc2VsZilcbiAgICAgIGVsc2Ugc2VsZi5sZWF2ZShzZWxmKVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnRpcCgpLmhhc0NsYXNzKCdpbicpID8gc2VsZi5sZWF2ZShzZWxmKSA6IHNlbGYuZW50ZXIoc2VsZilcbiAgICB9XG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpXG4gICAgdGhpcy5oaWRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoYXQuJGVsZW1lbnQub2ZmKCcuJyArIHRoYXQudHlwZSkucmVtb3ZlRGF0YSgnYnMuJyArIHRoYXQudHlwZSlcbiAgICAgIGlmICh0aGF0LiR0aXApIHtcbiAgICAgICAgdGhhdC4kdGlwLmRldGFjaCgpXG4gICAgICB9XG4gICAgICB0aGF0LiR0aXAgPSBudWxsXG4gICAgICB0aGF0LiRhcnJvdyA9IG51bGxcbiAgICAgIHRoYXQuJHZpZXdwb3J0ID0gbnVsbFxuICAgICAgdGhhdC4kZWxlbWVudCA9IG51bGxcbiAgICB9KVxuICB9XG5cblxuICAvLyBUT09MVElQIFBMVUdJTiBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMudG9vbHRpcCcpXG4gICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXG5cbiAgICAgIGlmICghZGF0YSAmJiAvZGVzdHJveXxoaWRlLy50ZXN0KG9wdGlvbikpIHJldHVyblxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdicy50b29sdGlwJywgKGRhdGEgPSBuZXcgVG9vbHRpcCh0aGlzLCBvcHRpb25zKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG9sZCA9ICQuZm4udG9vbHRpcFxuXG4gICQuZm4udG9vbHRpcCAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLnRvb2x0aXAuQ29uc3RydWN0b3IgPSBUb29sdGlwXG5cblxuICAvLyBUT09MVElQIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09PT1cblxuICAkLmZuLnRvb2x0aXAubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuLnRvb2x0aXAgPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbn0oalF1ZXJ5KTtcbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiB0cmFuc2l0aW9uLmpzIHYzLjMuN1xuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jdHJhbnNpdGlvbnNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBDU1MgVFJBTlNJVElPTiBTVVBQT1JUIChTaG91dG91dDogaHR0cDovL3d3dy5tb2Rlcm5penIuY29tLylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gdHJhbnNpdGlvbkVuZCgpIHtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib290c3RyYXAnKVxuXG4gICAgdmFyIHRyYW5zRW5kRXZlbnROYW1lcyA9IHtcbiAgICAgIFdlYmtpdFRyYW5zaXRpb24gOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG4gICAgICBNb3pUcmFuc2l0aW9uICAgIDogJ3RyYW5zaXRpb25lbmQnLFxuICAgICAgT1RyYW5zaXRpb24gICAgICA6ICdvVHJhbnNpdGlvbkVuZCBvdHJhbnNpdGlvbmVuZCcsXG4gICAgICB0cmFuc2l0aW9uICAgICAgIDogJ3RyYW5zaXRpb25lbmQnXG4gICAgfVxuXG4gICAgZm9yICh2YXIgbmFtZSBpbiB0cmFuc0VuZEV2ZW50TmFtZXMpIHtcbiAgICAgIGlmIChlbC5zdHlsZVtuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB7IGVuZDogdHJhbnNFbmRFdmVudE5hbWVzW25hbWVdIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2UgLy8gZXhwbGljaXQgZm9yIGllOCAoICAuXy4pXG4gIH1cblxuICAvLyBodHRwOi8vYmxvZy5hbGV4bWFjY2F3LmNvbS9jc3MtdHJhbnNpdGlvbnNcbiAgJC5mbi5lbXVsYXRlVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uIChkdXJhdGlvbikge1xuICAgIHZhciBjYWxsZWQgPSBmYWxzZVxuICAgIHZhciAkZWwgPSB0aGlzXG4gICAgJCh0aGlzKS5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIGZ1bmN0aW9uICgpIHsgY2FsbGVkID0gdHJ1ZSB9KVxuICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsgaWYgKCFjYWxsZWQpICQoJGVsKS50cmlnZ2VyKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCkgfVxuICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIGR1cmF0aW9uKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAkKGZ1bmN0aW9uICgpIHtcbiAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25FbmQoKVxuXG4gICAgaWYgKCEkLnN1cHBvcnQudHJhbnNpdGlvbikgcmV0dXJuXG5cbiAgICAkLmV2ZW50LnNwZWNpYWwuYnNUcmFuc2l0aW9uRW5kID0ge1xuICAgICAgYmluZFR5cGU6ICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxcbiAgICAgIGRlbGVnYXRlVHlwZTogJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLFxuICAgICAgaGFuZGxlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoJChlLnRhcmdldCkuaXModGhpcykpIHJldHVybiBlLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbn0oalF1ZXJ5KTtcbiIsIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2MS4xMi40XG4gKiBodHRwOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTYtMDUtMjBUMTc6MTdaXG4gKi9cblxuKGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7XG5cblx0aWYgKCB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgP1xuXHRcdFx0ZmFjdG9yeSggZ2xvYmFsLCB0cnVlICkgOlxuXHRcdFx0ZnVuY3Rpb24oIHcgKSB7XG5cdFx0XHRcdGlmICggIXcuZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KCB3ICk7XG5cdFx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoIGdsb2JhbCApO1xuXHR9XG5cbi8vIFBhc3MgdGhpcyBpZiB3aW5kb3cgaXMgbm90IGRlZmluZWQgeWV0XG59KHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHtcblxuLy8gU3VwcG9ydDogRmlyZWZveCAxOCtcbi8vIENhbid0IGJlIGluIHN0cmljdCBtb2RlLCBzZXZlcmFsIGxpYnMgaW5jbHVkaW5nIEFTUC5ORVQgdHJhY2Vcbi8vIHRoZSBzdGFjayB2aWEgYXJndW1lbnRzLmNhbGxlci5jYWxsZWUgYW5kIEZpcmVmb3ggZGllcyBpZlxuLy8geW91IHRyeSB0byB0cmFjZSB0aHJvdWdoIFwidXNlIHN0cmljdFwiIGNhbGwgY2hhaW5zLiAoIzEzMzM1KVxuLy9cInVzZSBzdHJpY3RcIjtcbnZhciBkZWxldGVkSWRzID0gW107XG5cbnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxudmFyIHNsaWNlID0gZGVsZXRlZElkcy5zbGljZTtcblxudmFyIGNvbmNhdCA9IGRlbGV0ZWRJZHMuY29uY2F0O1xuXG52YXIgcHVzaCA9IGRlbGV0ZWRJZHMucHVzaDtcblxudmFyIGluZGV4T2YgPSBkZWxldGVkSWRzLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgc3VwcG9ydCA9IHt9O1xuXG5cblxudmFyXG5cdHZlcnNpb24gPSBcIjEuMTIuNFwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMSwgSUU8OVxuXHQvLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1Bcblx0cnRyaW0gPSAvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csXG5cblx0Ly8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nXG5cdHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbXFxkYS16XSkvZ2ksXG5cblx0Ly8gVXNlZCBieSBqUXVlcnkuY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKVxuXHRmY2FtZWxDYXNlID0gZnVuY3Rpb24oIGFsbCwgbGV0dGVyICkge1xuXHRcdHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcblx0fTtcblxualF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHtcblxuXHQvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkXG5cdGpxdWVyeTogdmVyc2lvbixcblxuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LFxuXG5cdC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3Jcblx0c2VsZWN0b3I6IFwiXCIsXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXHRcdHJldHVybiBudW0gIT0gbnVsbCA/XG5cblx0XHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRcdCggbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXSApIDpcblxuXHRcdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdFx0c2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2tcblx0Ly8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpXG5cdHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkge1xuXG5cdFx0Ly8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXRcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7XG5cblx0XHQvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKVxuXHRcdHJldC5wcmV2T2JqZWN0ID0gdGhpcztcblx0XHRyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuXHRcdC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LlxuXHRlYWNoOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjayApO1xuXHR9LFxuXG5cdG1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdHNsaWNlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApO1xuXHR9LFxuXG5cdGZpcnN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggMCApO1xuXHR9LFxuXG5cdGxhc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAtMSApO1xuXHR9LFxuXG5cdGVxOiBmdW5jdGlvbiggaSApIHtcblx0XHR2YXIgbGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRqID0gK2kgKyAoIGkgPCAwID8gbGVuIDogMCApO1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggaiA+PSAwICYmIGogPCBsZW4gPyBbIHRoaXNbIGogXSBdIDogW10gKTtcblx0fSxcblxuXHRlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpO1xuXHR9LFxuXG5cdC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cblx0Ly8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuXG5cdHB1c2g6IHB1c2gsXG5cdHNvcnQ6IGRlbGV0ZWRJZHMuc29ydCxcblx0c3BsaWNlOiBkZWxldGVkSWRzLnNwbGljZVxufTtcblxualF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHtcblx0dmFyIHNyYywgY29weUlzQXJyYXksIGNvcHksIG5hbWUsIG9wdGlvbnMsIGNsb25lLFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgMCBdIHx8IHt9LFxuXHRcdGkgPSAxLFxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0ZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKCB0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXG5cdFx0Ly8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgaSBdIHx8IHt9O1xuXHRcdGkrKztcblx0fVxuXG5cdC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KVxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCB0YXJnZXQgKSApIHtcblx0XHR0YXJnZXQgPSB7fTtcblx0fVxuXG5cdC8vIGV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZFxuXHRpZiAoIGkgPT09IGxlbmd0aCApIHtcblx0XHR0YXJnZXQgPSB0aGlzO1xuXHRcdGktLTtcblx0fVxuXG5cdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXG5cdFx0Ly8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlc1xuXHRcdGlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkge1xuXG5cdFx0XHQvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG5cdFx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRcdHNyYyA9IHRhcmdldFsgbmFtZSBdO1xuXHRcdFx0XHRjb3B5ID0gb3B0aW9uc1sgbmFtZSBdO1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0aWYgKCBkZWVwICYmIGNvcHkgJiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29weSApIHx8XG5cdFx0XHRcdFx0KCBjb3B5SXNBcnJheSA9IGpRdWVyeS5pc0FycmF5KCBjb3B5ICkgKSApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcblx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggc3JjICkgPyBzcmMgOiB7fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW1cblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlc1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBjb3B5O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3Rcblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2Vcblx0ZXhwYW5kbzogXCJqUXVlcnlcIiArICggdmVyc2lvbiArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXFxEL2csIFwiXCIgKSxcblxuXHQvLyBBc3N1bWUgalF1ZXJ5IGlzIHJlYWR5IHdpdGhvdXQgdGhlIHJlYWR5IG1vZHVsZVxuXHRpc1JlYWR5OiB0cnVlLFxuXG5cdGVycm9yOiBmdW5jdGlvbiggbXNnICkge1xuXHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cdH0sXG5cblx0bm9vcDogZnVuY3Rpb24oKSB7fSxcblxuXHQvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLlxuXHQvLyBTaW5jZSB2ZXJzaW9uIDEuMywgRE9NIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBsaWtlIGFsZXJ0XG5cdC8vIGFyZW4ndCBzdXBwb3J0ZWQuIFRoZXkgcmV0dXJuIGZhbHNlIG9uIElFICgjMjk2OCkuXG5cdGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJmdW5jdGlvblwiO1xuXHR9LFxuXG5cdGlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LnR5cGUoIG9iaiApID09PSBcImFycmF5XCI7XG5cdH0sXG5cblx0aXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0LyoganNoaW50IGVxZXFlcTogZmFsc2UgKi9cblx0XHRyZXR1cm4gb2JqICE9IG51bGwgJiYgb2JqID09IG9iai53aW5kb3c7XG5cdH0sXG5cblx0aXNOdW1lcmljOiBmdW5jdGlvbiggb2JqICkge1xuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKG51bGx8dHJ1ZXxmYWxzZXxcIlwiKVxuXHRcdC8vIC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJseSBoZXggbGl0ZXJhbHMgKFwiMHguLi5cIilcblx0XHQvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU5cblx0XHQvLyBhZGRpbmcgMSBjb3JyZWN0cyBsb3NzIG9mIHByZWNpc2lvbiBmcm9tIHBhcnNlRmxvYXQgKCMxNTEwMClcblx0XHR2YXIgcmVhbFN0cmluZ09iaiA9IG9iaiAmJiBvYmoudG9TdHJpbmcoKTtcblx0XHRyZXR1cm4gIWpRdWVyeS5pc0FycmF5KCBvYmogKSAmJiAoIHJlYWxTdHJpbmdPYmogLSBwYXJzZUZsb2F0KCByZWFsU3RyaW5nT2JqICkgKyAxICkgPj0gMDtcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBuYW1lO1xuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBrZXk7XG5cblx0XHQvLyBNdXN0IGJlIGFuIE9iamVjdC5cblx0XHQvLyBCZWNhdXNlIG9mIElFLCB3ZSBhbHNvIGhhdmUgdG8gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHRoZSBjb25zdHJ1Y3RvciBwcm9wZXJ0eS5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCBET00gbm9kZXMgYW5kIHdpbmRvdyBvYmplY3RzIGRvbid0IHBhc3MgdGhyb3VnaCwgYXMgd2VsbFxuXHRcdGlmICggIW9iaiB8fCBqUXVlcnkudHlwZSggb2JqICkgIT09IFwib2JqZWN0XCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblxuXHRcdFx0Ly8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdFxuXHRcdFx0aWYgKCBvYmouY29uc3RydWN0b3IgJiZcblx0XHRcdFx0IWhhc093bi5jYWxsKCBvYmosIFwiY29uc3RydWN0b3JcIiApICYmXG5cdFx0XHRcdCFoYXNPd24uY2FsbCggb2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJpc1Byb3RvdHlwZU9mXCIgKSApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHQvLyBJRTgsOSBXaWxsIHRocm93IGV4Y2VwdGlvbnMgb24gY2VydGFpbiBob3N0IG9iamVjdHMgIzk4OTdcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gSGFuZGxlIGl0ZXJhdGlvbiBvdmVyIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGJlZm9yZSBvd24gcHJvcGVydGllcy5cblx0XHRpZiAoICFzdXBwb3J0Lm93bkZpcnN0ICkge1xuXHRcdFx0Zm9yICgga2V5IGluIG9iaiApIHtcblx0XHRcdFx0cmV0dXJuIGhhc093bi5jYWxsKCBvYmosIGtleSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLFxuXHRcdC8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLlxuXHRcdGZvciAoIGtleSBpbiBvYmogKSB7fVxuXG5cdFx0cmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkIHx8IGhhc093bi5jYWxsKCBvYmosIGtleSApO1xuXHR9LFxuXG5cdHR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0aWYgKCBvYmogPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCBcIm9iamVjdFwiIDpcblx0XHRcdHR5cGVvZiBvYmo7XG5cdH0sXG5cblx0Ly8gV29ya2Fyb3VuZHMgYmFzZWQgb24gZmluZGluZ3MgYnkgSmltIERyaXNjb2xsXG5cdC8vIGh0dHA6Ly93ZWJsb2dzLmphdmEubmV0L2Jsb2cvZHJpc2NvbGwvYXJjaGl2ZS8yMDA5LzA5LzA4L2V2YWwtamF2YXNjcmlwdC1nbG9iYWwtY29udGV4dFxuXHRnbG9iYWxFdmFsOiBmdW5jdGlvbiggZGF0YSApIHtcblx0XHRpZiAoIGRhdGEgJiYgalF1ZXJ5LnRyaW0oIGRhdGEgKSApIHtcblxuXHRcdFx0Ly8gV2UgdXNlIGV4ZWNTY3JpcHQgb24gSW50ZXJuZXQgRXhwbG9yZXJcblx0XHRcdC8vIFdlIHVzZSBhbiBhbm9ueW1vdXMgZnVuY3Rpb24gc28gdGhhdCBjb250ZXh0IGlzIHdpbmRvd1xuXHRcdFx0Ly8gcmF0aGVyIHRoYW4galF1ZXJ5IGluIEZpcmVmb3hcblx0XHRcdCggd2luZG93LmV4ZWNTY3JpcHQgfHwgZnVuY3Rpb24oIGRhdGEgKSB7XG5cdFx0XHRcdHdpbmRvd1sgXCJldmFsXCIgXS5jYWxsKCB3aW5kb3csIGRhdGEgKTsgLy8ganNjczppZ25vcmUgcmVxdWlyZURvdE5vdGF0aW9uXG5cdFx0XHR9ICkoIGRhdGEgKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuXHQvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5cdGNhbWVsQ2FzZTogZnVuY3Rpb24oIHN0cmluZyApIHtcblx0XHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgXCJtcy1cIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTtcblx0fSxcblxuXHRub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdH0sXG5cblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGxlbmd0aCwgaSA9IDA7XG5cblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHtcblx0XHRcdGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMSwgSUU8OVxuXHR0cmltOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRyZXR1cm4gdGV4dCA9PSBudWxsID9cblx0XHRcdFwiXCIgOlxuXHRcdFx0KCB0ZXh0ICsgXCJcIiApLnJlcGxhY2UoIHJ0cmltLCBcIlwiICk7XG5cdH0sXG5cblx0Ly8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7XG5cdFx0dmFyIHJldCA9IHJlc3VsdHMgfHwgW107XG5cblx0XHRpZiAoIGFyciAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBpc0FycmF5TGlrZSggT2JqZWN0KCBhcnIgKSApICkge1xuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHJldCxcblx0XHRcdFx0XHR0eXBlb2YgYXJyID09PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRbIGFyciBdIDogYXJyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmNhbGwoIHJldCwgYXJyICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHRpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkge1xuXHRcdHZhciBsZW47XG5cblx0XHRpZiAoIGFyciApIHtcblx0XHRcdGlmICggaW5kZXhPZiApIHtcblx0XHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XG5cdFx0XHR9XG5cblx0XHRcdGxlbiA9IGFyci5sZW5ndGg7XG5cdFx0XHRpID0gaSA/IGkgPCAwID8gTWF0aC5tYXgoIDAsIGxlbiArIGkgKSA6IGkgOiAwO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblxuXHRcdFx0XHQvLyBTa2lwIGFjY2Vzc2luZyBpbiBzcGFyc2UgYXJyYXlzXG5cdFx0XHRcdGlmICggaSBpbiBhcnIgJiYgYXJyWyBpIF0gPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gLTE7XG5cdH0sXG5cblx0bWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkge1xuXHRcdHZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCxcblx0XHRcdGogPSAwLFxuXHRcdFx0aSA9IGZpcnN0Lmxlbmd0aDtcblxuXHRcdHdoaWxlICggaiA8IGxlbiApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaisrIF07XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdC8vIFdvcmthcm91bmQgY2FzdGluZyBvZiAubGVuZ3RoIHRvIE5hTiBvbiBvdGhlcndpc2UgYXJyYXlsaWtlIG9iamVjdHMgKGUuZy4sIE5vZGVMaXN0cylcblx0XHRpZiAoIGxlbiAhPT0gbGVuICkge1xuXHRcdFx0d2hpbGUgKCBzZWNvbmRbIGogXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGorKyBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuXHQvLyBhcmd1bWVudHMuXG5cdHByb3h5OiBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdFx0dmFyIGFyZ3MsIHByb3h5LCB0bXA7XG5cblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRcdGNvbnRleHQgPSBmbjtcblx0XHRcdGZuID0gdG1wO1xuXHRcdH1cblxuXHRcdC8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjXG5cdFx0Ly8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC5cblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gU2ltdWxhdGVkIGJpbmRcblx0XHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdFx0cHJveHkgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApO1xuXHRcdH07XG5cblx0XHQvLyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwgaGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWRcblx0XHRwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKztcblxuXHRcdHJldHVybiBwcm94eTtcblx0fSxcblxuXHRub3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiArKCBuZXcgRGF0ZSgpICk7XG5cdH0sXG5cblx0Ly8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyXG5cdC8vIHByb3BlcnRpZXMgdG8gaXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuXG5cdHN1cHBvcnQ6IHN1cHBvcnRcbn0gKTtcblxuLy8gSlNIaW50IHdvdWxkIGVycm9yIG9uIHRoaXMgY29kZSBkdWUgdG8gdGhlIFN5bWJvbCBub3QgYmVpbmcgZGVmaW5lZCBpbiBFUzUuXG4vLyBEZWZpbmluZyB0aGlzIGdsb2JhbCBpbiAuanNoaW50cmMgd291bGQgY3JlYXRlIGEgZGFuZ2VyIG9mIHVzaW5nIHRoZSBnbG9iYWxcbi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBqdXN0IGRpc2FibGUgSlNIaW50IGZvciB0aGVzZVxuLy8gdGhyZWUgbGluZXMuXG4vKiBqc2hpbnQgaWdub3JlOiBzdGFydCAqL1xuaWYgKCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cdGpRdWVyeS5mblsgU3ltYm9sLml0ZXJhdG9yIF0gPSBkZWxldGVkSWRzWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cbi8qIGpzaGludCBpZ25vcmU6IGVuZCAqL1xuXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcbmpRdWVyeS5lYWNoKCBcIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sXCIuc3BsaXQoIFwiIFwiICksXG5mdW5jdGlvbiggaSwgbmFtZSApIHtcblx0Y2xhc3MydHlwZVsgXCJbb2JqZWN0IFwiICsgbmFtZSArIFwiXVwiIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG59ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogaU9TIDguMiAobm90IHJlcHJvZHVjaWJsZSBpbiBzaW11bGF0b3IpXG5cdC8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSlcblx0Ly8gaGFzT3duIGlzbid0IHVzZWQgaGVyZSBkdWUgdG8gZmFsc2UgbmVnYXRpdmVzXG5cdC8vIHJlZ2FyZGluZyBOb2RlbGlzdCBsZW5ndGggaW4gSUVcblx0dmFyIGxlbmd0aCA9ICEhb2JqICYmIFwibGVuZ3RoXCIgaW4gb2JqICYmIG9iai5sZW5ndGgsXG5cdFx0dHlwZSA9IGpRdWVyeS50eXBlKCBvYmogKTtcblxuXHRpZiAoIHR5cGUgPT09IFwiZnVuY3Rpb25cIiB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cbnZhciBTaXp6bGUgPVxuLyohXG4gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4yLjFcbiAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTUtMTAtMTdcbiAqL1xuKGZ1bmN0aW9uKCB3aW5kb3cgKSB7XG5cbnZhciBpLFxuXHRzdXBwb3J0LFxuXHRFeHByLFxuXHRnZXRUZXh0LFxuXHRpc1hNTCxcblx0dG9rZW5pemUsXG5cdGNvbXBpbGUsXG5cdHNlbGVjdCxcblx0b3V0ZXJtb3N0Q29udGV4dCxcblx0c29ydElucHV0LFxuXHRoYXNEdXBsaWNhdGUsXG5cblx0Ly8gTG9jYWwgZG9jdW1lbnQgdmFyc1xuXHRzZXREb2N1bWVudCxcblx0ZG9jdW1lbnQsXG5cdGRvY0VsZW0sXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdHJidWdneU1hdGNoZXMsXG5cdG1hdGNoZXMsXG5cdGNvbnRhaW5zLFxuXG5cdC8vIEluc3RhbmNlLXNwZWNpZmljIGRhdGFcblx0ZXhwYW5kbyA9IFwic2l6emxlXCIgKyAxICogbmV3IERhdGUoKSxcblx0cHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LFxuXHRkaXJydW5zID0gMCxcblx0ZG9uZSA9IDAsXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHR0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0Y29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEdlbmVyYWwtcHVycG9zZSBjb25zdGFudHNcblx0TUFYX05FR0FUSVZFID0gMSA8PCAzMSxcblxuXHQvLyBJbnN0YW5jZSBtZXRob2RzXG5cdGhhc093biA9ICh7fSkuaGFzT3duUHJvcGVydHksXG5cdGFyciA9IFtdLFxuXHRwb3AgPSBhcnIucG9wLFxuXHRwdXNoX25hdGl2ZSA9IGFyci5wdXNoLFxuXHRwdXNoID0gYXJyLnB1c2gsXG5cdHNsaWNlID0gYXJyLnNsaWNlLFxuXHQvLyBVc2UgYSBzdHJpcHBlZC1kb3duIGluZGV4T2YgYXMgaXQncyBmYXN0ZXIgdGhhbiBuYXRpdmVcblx0Ly8gaHR0cDovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFtpXSA9PT0gZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fSxcblxuXHRib29sZWFucyA9IFwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixcblxuXHQvLyBSZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3doaXRlc3BhY2Vcblx0d2hpdGVzcGFjZSA9IFwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIixcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXJcblx0aWRlbnRpZmllciA9IFwiKD86XFxcXFxcXFwufFtcXFxcdy1dfFteXFxcXHgwMC1cXFxceGEwXSkrXCIsXG5cblx0Ly8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgaWRlbnRpZmllciArIFwiKSg/OlwiICsgd2hpdGVzcGFjZSArXG5cdFx0Ly8gT3BlcmF0b3IgKGNhcHR1cmUgMilcblx0XHRcIiooWypeJHwhfl0/PSlcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIFwiQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIENTUyBpZGVudGlmaWVycyBbY2FwdHVyZSA1XSBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcXFxcKChcIiArXG5cdFx0Ly8gVG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIG5lZWRpbmcgdG9rZW5pemUgaW4gdGhlIHByZUZpbHRlciwgcHJlZmVyIGFyZ3VtZW50czpcblx0XHQvLyAxLiBxdW90ZWQgKGNhcHR1cmUgMzsgY2FwdHVyZSA0IG9yIGNhcHR1cmUgNSlcblx0XHRcIignKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCIpfFwiICtcblx0XHQvLyAyLiBzaW1wbGUgKGNhcHR1cmUgNilcblx0XHRcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpW1xcXFxdXXxcIiArIGF0dHJpYnV0ZXMgKyBcIikqKXxcIiArXG5cdFx0Ly8gMy4gYW55dGhpbmcgZWxzZSAoY2FwdHVyZSAyKVxuXHRcdFwiLipcIiArXG5cdFx0XCIpXFxcXCl8KVwiLFxuXG5cdC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXJcblx0cndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgXCIrXCIsIFwiZ1wiICksXG5cdHJ0cmltID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIrfCgoPzpefFteXFxcXFxcXFxdKSg/OlxcXFxcXFxcLikqKVwiICsgd2hpdGVzcGFjZSArIFwiKyRcIiwgXCJnXCIgKSxcblxuXHRyY29tbWEgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiosXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcblx0cmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFs+K35dfFwiICsgd2hpdGVzcGFjZSArIFwiKVwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cblx0cmF0dHJpYnV0ZVF1b3RlcyA9IG5ldyBSZWdFeHAoIFwiPVwiICsgd2hpdGVzcGFjZSArIFwiKihbXlxcXFxdJ1xcXCJdKj8pXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXF1cIiwgXCJnXCIgKSxcblxuXHRycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLFxuXHRyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgaWRlbnRpZmllciArIFwiJFwiICksXG5cblx0bWF0Y2hFeHByID0ge1xuXHRcdFwiSURcIjogbmV3IFJlZ0V4cCggXCJeIyhcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiQ0xBU1NcIjogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBpZGVudGlmaWVyICsgXCJ8WypdKVwiICksXG5cdFx0XCJBVFRSXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgYXR0cmlidXRlcyApLFxuXHRcdFwiUFNFVURPXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgcHNldWRvcyApLFxuXHRcdFwiQ0hJTERcIjogbmV3IFJlZ0V4cCggXCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiICsgd2hpdGVzcGFjZSArIFwiKig/OihbKy1dfClcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKFxcXFxkKyl8KSlcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpXCIsIFwiaVwiICksXG5cdFx0XCJib29sXCI6IG5ldyBSZWdFeHAoIFwiXig/OlwiICsgYm9vbGVhbnMgKyBcIikkXCIsIFwiaVwiICksXG5cdFx0Ly8gRm9yIHVzZSBpbiBsaWJyYXJpZXMgaW1wbGVtZW50aW5nIC5pcygpXG5cdFx0Ly8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGluZyBpbiBgc2VsZWN0YFxuXHRcdFwibmVlZHNDb250ZXh0XCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFxcXChcIiArXG5cdFx0XHR3aGl0ZXNwYWNlICsgXCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfCkoPz1bXi1dfCQpXCIsIFwiaVwiIClcblx0fSxcblxuXHRyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmhlYWRlciA9IC9eaFxcZCQvaSxcblxuXHRybmF0aXZlID0gL15bXntdK1xce1xccypcXFtuYXRpdmUgXFx3LyxcblxuXHQvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnNcblx0cnF1aWNrRXhwciA9IC9eKD86IyhbXFx3LV0rKXwoXFx3Kyl8XFwuKFtcXHctXSspKSQvLFxuXG5cdHJzaWJsaW5nID0gL1srfl0vLFxuXHRyZXNjYXBlID0gLyd8XFxcXC9nLFxuXG5cdC8vIENTUyBlc2NhcGVzIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnNcblx0cnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggXCJcXFxcXFxcXChbXFxcXGRhLWZdezEsNn1cIiArIHdoaXRlc3BhY2UgKyBcIj98KFwiICsgd2hpdGVzcGFjZSArIFwiKXwuKVwiLCBcImlnXCIgKSxcblx0ZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkge1xuXHRcdHZhciBoaWdoID0gXCIweFwiICsgZXNjYXBlZCAtIDB4MTAwMDA7XG5cdFx0Ly8gTmFOIG1lYW5zIG5vbi1jb2RlcG9pbnRcblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94PDI0XG5cdFx0Ly8gV29ya2Fyb3VuZCBlcnJvbmVvdXMgbnVtZXJpYyBpbnRlcnByZXRhdGlvbiBvZiArXCIweFwiXG5cdFx0cmV0dXJuIGhpZ2ggIT09IGhpZ2ggfHwgZXNjYXBlZFdoaXRlc3BhY2UgP1xuXHRcdFx0ZXNjYXBlZCA6XG5cdFx0XHRoaWdoIDwgMCA/XG5cdFx0XHRcdC8vIEJNUCBjb2RlcG9pbnRcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCArIDB4MTAwMDAgKSA6XG5cdFx0XHRcdC8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKVxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fTtcblxuLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0IClcbnRyeSB7XG5cdHB1c2guYXBwbHkoXG5cdFx0KGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLFxuXHRcdHByZWZlcnJlZERvYy5jaGlsZE5vZGVzXG5cdCk7XG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wXG5cdC8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHlcblx0YXJyWyBwcmVmZXJyZWREb2MuY2hpbGROb2Rlcy5sZW5ndGggXS5ub2RlVHlwZTtcbn0gY2F0Y2ggKCBlICkge1xuXHRwdXNoID0geyBhcHBseTogYXJyLmxlbmd0aCA/XG5cblx0XHQvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHB1c2hfbmF0aXZlLmFwcGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoZWxzKSApO1xuXHRcdH0gOlxuXG5cdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdC8vIE90aGVyd2lzZSBhcHBlbmQgZGlyZWN0bHlcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHR2YXIgaiA9IHRhcmdldC5sZW5ndGgsXG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0Ly8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoXG5cdFx0XHR3aGlsZSAoICh0YXJnZXRbaisrXSA9IGVsc1tpKytdKSApIHt9XG5cdFx0XHR0YXJnZXQubGVuZ3RoID0gaiAtIDE7XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgbSwgaSwgZWxlbSwgbmlkLCBuaWRzZWxlY3QsIG1hdGNoLCBncm91cHMsIG5ld1NlbGVjdG9yLFxuXHRcdG5ld0NvbnRleHQgPSBjb250ZXh0ICYmIGNvbnRleHQub3duZXJEb2N1bWVudCxcblxuXHRcdC8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnRcblx0XHRub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dFxuXHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiB8fCAhc2VsZWN0b3IgfHxcblx0XHRub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSAmJiBub2RlVHlwZSAhPT0gMTEgKSB7XG5cblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgKGFzIG9wcG9zZWQgdG8gZmlsdGVycykgaW4gSFRNTCBkb2N1bWVudHNcblx0aWYgKCAhc2VlZCApIHtcblxuXHRcdGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHRcdH1cblx0XHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblxuXHRcdGlmICggZG9jdW1lbnRJc0hUTUwgKSB7XG5cblx0XHRcdC8vIElmIHRoZSBzZWxlY3RvciBpcyBzdWZmaWNpZW50bHkgc2ltcGxlLCB0cnkgdXNpbmcgYSBcImdldCpCeSpcIiBET00gbWV0aG9kXG5cdFx0XHQvLyAoZXhjZXB0aW5nIERvY3VtZW50RnJhZ21lbnQgY29udGV4dCwgd2hlcmUgdGhlIG1ldGhvZHMgZG9uJ3QgZXhpc3QpXG5cdFx0XHRpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKG0gPSBtYXRjaFsxXSkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb2N1bWVudCBjb250ZXh0XG5cdFx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEVsZW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICYmIChlbGVtID0gbmV3Q29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApKSAmJlxuXHRcdFx0XHRcdFx0XHRjb250YWlucyggY29udGV4dCwgZWxlbSApICYmXG5cdFx0XHRcdFx0XHRcdGVsZW0uaWQgPT09IG0gKSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUeXBlIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzJdICkge1xuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHNlbGVjdG9yICkgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0XHQvLyBDbGFzcyBzZWxlY3RvclxuXHRcdFx0XHR9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiZcblx0XHRcdFx0XHRjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdGlmICggc3VwcG9ydC5xc2EgJiZcblx0XHRcdFx0IWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXSAmJlxuXHRcdFx0XHQoIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkpICkge1xuXG5cdFx0XHRcdGlmICggbm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHRcdFx0bmV3U2VsZWN0b3IgPSBzZWxlY3RvcjtcblxuXHRcdFx0XHQvLyBxU0EgbG9va3Mgb3V0c2lkZSBFbGVtZW50IGNvbnRleHQsIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnRcblx0XHRcdFx0Ly8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWVcblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgb2JqZWN0IGVsZW1lbnRzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0aWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApKSApIHtcblx0XHRcdFx0XHRcdG5pZCA9IG5pZC5yZXBsYWNlKCByZXNjYXBlLCBcIlxcXFwkJlwiICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnRleHQuc2V0QXR0cmlidXRlKCBcImlkXCIsIChuaWQgPSBleHBhbmRvKSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdG5pZHNlbGVjdCA9IHJpZGVudGlmaWVyLnRlc3QoIG5pZCApID8gXCIjXCIgKyBuaWQgOiBcIltpZD0nXCIgKyBuaWQgKyBcIiddXCI7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBuaWRzZWxlY3QgKyBcIiBcIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXG5cdFx0XHRcdFx0Ly8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzXG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8XG5cdFx0XHRcdFx0XHRjb250ZXh0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBuZXdTZWxlY3RvciApIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cyxcblx0XHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoIFwiaWRcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEFsbCBvdGhlcnNcblx0cmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oc3RyaW5nLCBvYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoXG4gKlx0cHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aClcbiAqXHRkZWxldGluZyB0aGUgb2xkZXN0IGVudHJ5XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKCkge1xuXHR2YXIga2V5cyA9IFtdO1xuXG5cdGZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkge1xuXHRcdC8vIFVzZSAoa2V5ICsgXCIgXCIpIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIG5hdGl2ZSBwcm90b3R5cGUgcHJvcGVydGllcyAoc2VlIElzc3VlICMxNTcpXG5cdFx0aWYgKCBrZXlzLnB1c2goIGtleSArIFwiIFwiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkge1xuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXG5cdFx0XHRkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdO1xuXHRcdH1cblx0XHRyZXR1cm4gKGNhY2hlWyBrZXkgKyBcIiBcIiBdID0gdmFsdWUpO1xuXHR9XG5cdHJldHVybiBjYWNoZTtcbn1cblxuLyoqXG4gKiBNYXJrIGEgZnVuY3Rpb24gZm9yIHNwZWNpYWwgdXNlIGJ5IFNpenpsZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIG1hcmtcbiAqL1xuZnVuY3Rpb24gbWFya0Z1bmN0aW9uKCBmbiApIHtcblx0Zm5bIGV4cGFuZG8gXSA9IHRydWU7XG5cdHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGRpdiBhbmQgZXhwZWN0cyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuICEhZm4oIGRpdiApO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZGl2LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZGl2ICk7XG5cdFx0fVxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxufVxuXG4vKipcbiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBhdHRycyBQaXBlLXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgVGhlIG1ldGhvZCB0aGF0IHdpbGwgYmUgYXBwbGllZFxuICovXG5mdW5jdGlvbiBhZGRIYW5kbGUoIGF0dHJzLCBoYW5kbGVyICkge1xuXHR2YXIgYXJyID0gYXR0cnMuc3BsaXQoXCJ8XCIpLFxuXHRcdGkgPSBhcnIubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyO1xuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGRvY3VtZW50IG9yZGVyIG9mIHR3byBzaWJsaW5nc1xuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFJldHVybnMgbGVzcyB0aGFuIDAgaWYgYSBwcmVjZWRlcyBiLCBncmVhdGVyIHRoYW4gMCBpZiBhIGZvbGxvd3MgYlxuICovXG5mdW5jdGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIgKSB7XG5cdHZhciBjdXIgPSBiICYmIGEsXG5cdFx0ZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdCggfmIuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICkgLVxuXHRcdFx0KCB+YS5zb3VyY2VJbmRleCB8fCBNQVhfTkVHQVRJVkUgKTtcblxuXHQvLyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXNcblx0aWYgKCBkaWZmICkge1xuXHRcdHJldHVybiBkaWZmO1xuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgYiBmb2xsb3dzIGFcblx0aWYgKCBjdXIgKSB7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLm5leHRTaWJsaW5nKSApIHtcblx0XHRcdGlmICggY3VyID09PSBiICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGEgPyAxIDogLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAobmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgcGFyZW50LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCAocGFyZW50ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHBhcmVudC50b3AgIT09IHBhcmVudCApIHtcblx0XHQvLyBTdXBwb3J0OiBJRSAxMVxuXHRcdGlmICggcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggcGFyZW50LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0cGFyZW50LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0ZGl2LmNsYXNzTmFtZSA9IFwiaVwiO1xuXHRcdHJldHVybiAhZGl2LmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0ZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwiXCIpICk7XG5cdFx0cmV0dXJuICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbWF0aWNhbGx5LXNldCBuYW1lcyxcblx0Ly8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0XG5cdHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlkID0gZXhwYW5kbztcblx0XHRyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gSUQgZmluZCBhbmQgZmlsdGVyXG5cdGlmICggc3VwcG9ydC5nZXRCeUlkICkge1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gbSA/IFsgbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0Ly8gU3VwcG9ydDogSUU2Lzdcblx0XHQvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0XG5cdFx0ZGVsZXRlIEV4cHIuZmluZFtcIklEXCJdO1xuXG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0fVxuXG5cdC8vIFRhZ1xuXHRFeHByLmZpbmRbXCJUQUdcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID9cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHRcdH0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgKTtcblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0dG1wID0gW10sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHQvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwgYSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vXG5cdFx0XHRcdHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50c1xuXHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHR0bXAucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0bXA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZFtcIkNMQVNTXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIFFTQS9tYXRjaGVzU2VsZWN0b3Jcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnRcblxuXHQvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KVxuXHRyYnVnZ3lNYXRjaGVzID0gW107XG5cblx0Ly8gcVNhKDpmb2N1cykgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSlcblx0Ly8gV2UgYWxsb3cgdGhpcyBiZWNhdXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yXG5cdC8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWVcblx0Ly8gU28sIHdlIGFsbG93IDpmb2N1cyB0byBwYXNzIHRocm91Z2ggUVNBIGFsbCB0aGUgdGltZSB0byBhdm9pZCB0aGUgSUUgZXJyb3Jcblx0Ly8gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2Vcblx0XHRcdC8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseVxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXG5cdFx0XHQvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaFxuXHRcdFx0Ly8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlubmVySFRNTCA9IFwiPGEgaWQ9J1wiICsgZXhwYW5kbyArIFwiJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgaWQ9J1wiICsgZXhwYW5kbyArIFwiLVxcclxcXFwnIG1zYWxsb3djYXB0dXJlPScnPlwiICtcblx0XHRcdFx0XCI8b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDExLTEyLjE2XG5cdFx0XHQvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9XG5cdFx0XHQvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCBcInNhZmVcIiBmb3IgV2luUlRcblx0XHRcdC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW21zYWxsb3djYXB0dXJlXj0nJ11cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgXCJ2YWx1ZVwiIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW3NlbGVjdGVkXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86dmFsdWV8XCIgKyBib29sZWFucyArIFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44K1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiOmNoZWNrZWRcIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIjpjaGVja2VkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCssIGlPUyA4K1xuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdFx0Ly8gSW4tcGFnZSBgc2VsZWN0b3IjaWQgc2liaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCggXCJhI1wiICsgZXhwYW5kbyArIFwiKypcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIuIy4rWyt+XVwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzXG5cdFx0XHQvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnRcblx0XHRcdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwiaGlkZGVuXCIgKTtcblx0XHRcdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKS5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcIkRcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZVxuXHRcdFx0aWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiOmVuYWJsZWRcIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCI6ZW5hYmxlZFwiLCBcIjpkaXNhYmxlZFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zXG5cdFx0XHRkaXYucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvclxuXHRcdFx0Ly8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSlcblx0XHRcdHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGRpdiwgXCJkaXZcIiApO1xuXG5cdFx0XHQvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uXG5cdFx0XHQvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkXG5cdFx0XHRtYXRjaGVzLmNhbGwoIGRpdiwgXCJbcyE9JyddOnhcIiApO1xuXHRcdFx0cmJ1Z2d5TWF0Y2hlcy5wdXNoKCBcIiE9XCIsIHBzZXVkb3MgKTtcblx0XHR9KTtcblx0fVxuXG5cdHJidWdneVFTQSA9IHJidWdneVFTQS5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5UVNBLmpvaW4oXCJ8XCIpICk7XG5cdHJidWdneU1hdGNoZXMgPSByYnVnZ3lNYXRjaGVzLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oXCJ8XCIpICk7XG5cblx0LyogQ29udGFpbnNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXHRoYXNDb21wYXJlID0gcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICk7XG5cblx0Ly8gRWxlbWVudCBjb250YWlucyBhbm90aGVyXG5cdC8vIFB1cnBvc2VmdWxseSBzZWxmLWV4Y2x1c2l2ZVxuXHQvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZlxuXHRjb250YWlucyA9IGhhc0NvbXBhcmUgfHwgcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbnRhaW5zICkgP1xuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0dmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSxcblx0XHRcdFx0YnVwID0gYiAmJiBiLnBhcmVudE5vZGU7XG5cdFx0XHRyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0YWRvd24uY29udGFpbnMgP1xuXHRcdFx0XHRcdGFkb3duLmNvbnRhaW5zKCBidXAgKSA6XG5cdFx0XHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2XG5cdFx0XHQpKTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdGlmICggYiApIHtcblx0XHRcdFx0d2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBiID09PSBhICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHQvKiBTb3J0aW5nXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nXG5cdHNvcnRPcmRlciA9IGhhc0NvbXBhcmUgP1xuXHRmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb25cblx0XHR2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247XG5cdFx0aWYgKCBjb21wYXJlICkge1xuXHRcdFx0cmV0dXJuIGNvbXBhcmU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudFxuXHRcdGNvbXBhcmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBhICkgPT09ICggYi5vd25lckRvY3VtZW50IHx8IGIgKSA/XG5cdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugd2Uga25vdyB0aGV5IGFyZSBkaXNjb25uZWN0ZWRcblx0XHRcdDE7XG5cblx0XHQvLyBEaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRpZiAoIGNvbXBhcmUgJiAxIHx8XG5cdFx0XHQoIXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9PT0gY29tcGFyZSkgKSB7XG5cblx0XHRcdC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudFxuXHRcdFx0aWYgKCBhID09PSBkb2N1bWVudCB8fCBhLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGEpICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWludGFpbiBvcmlnaW5hbCBvcmRlclxuXHRcdFx0cmV0dXJuIHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29tcGFyZSAmIDQgPyAtMSA6IDE7XG5cdH0gOlxuXHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHQvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGF1cCA9IGEucGFyZW50Tm9kZSxcblx0XHRcdGJ1cCA9IGIucGFyZW50Tm9kZSxcblx0XHRcdGFwID0gWyBhIF0sXG5cdFx0XHRicCA9IFsgYiBdO1xuXG5cdFx0Ly8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWRcblx0XHRpZiAoICFhdXAgfHwgIWJ1cCApIHtcblx0XHRcdHJldHVybiBhID09PSBkb2N1bWVudCA/IC0xIDpcblx0XHRcdFx0YiA9PT0gZG9jdW1lbnQgPyAxIDpcblx0XHRcdFx0YXVwID8gLTEgOlxuXHRcdFx0XHRidXAgPyAxIDpcblx0XHRcdFx0c29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXG5cdFx0Ly8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2tcblx0XHR9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHtcblx0XHRcdHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvblxuXHRcdGN1ciA9IGE7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YXAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXHRcdGN1ciA9IGI7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YnAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2FsayBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3lcblx0XHR3aGlsZSAoIGFwW2ldID09PSBicFtpXSApIHtcblx0XHRcdGkrKztcblx0XHR9XG5cblx0XHRyZXR1cm4gaSA/XG5cdFx0XHQvLyBEbyBhIHNpYmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhhdmUgYSBjb21tb24gYW5jZXN0b3Jcblx0XHRcdHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmlyc3Rcblx0XHRcdGFwW2ldID09PSBwcmVmZXJyZWREb2MgPyAtMSA6XG5cdFx0XHRicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6XG5cdFx0XHQwO1xuXHR9O1xuXG5cdHJldHVybiBkb2N1bWVudDtcbn07XG5cblNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkge1xuXHRyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBlbGVtZW50cyApO1xufTtcblxuU2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHQvLyBNYWtlIHN1cmUgdGhhdCBhdHRyaWJ1dGUgc2VsZWN0b3JzIGFyZSBxdW90ZWRcblx0ZXhwciA9IGV4cHIucmVwbGFjZSggcmF0dHJpYnV0ZVF1b3RlcywgXCI9JyQxJ11cIiApO1xuXG5cdGlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiZcblx0XHQhY29tcGlsZXJDYWNoZVsgZXhwciArIFwiIFwiIF0gJiZcblx0XHQoICFyYnVnZ3lNYXRjaGVzIHx8ICFyYnVnZ3lNYXRjaGVzLnRlc3QoIGV4cHIgKSApICYmXG5cdFx0KCAhcmJ1Z2d5UVNBICAgICB8fCAhcmJ1Z2d5UVNBLnRlc3QoIGV4cHIgKSApICkge1xuXG5cdFx0dHJ5IHtcblx0XHRcdHZhciByZXQgPSBtYXRjaGVzLmNhbGwoIGVsZW0sIGV4cHIgKTtcblxuXHRcdFx0Ly8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdFx0aWYgKCByZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCB8fFxuXHRcdFx0XHRcdC8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50XG5cdFx0XHRcdFx0Ly8gZnJhZ21lbnQgaW4gSUUgOVxuXHRcdFx0XHRcdGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge31cblx0fVxuXG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7XG59O1xuXG5TaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHR9XG5cdHJldHVybiBjb250YWlucyggY29udGV4dCwgZWxlbSApO1xufTtcblxuU2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0dmFyIGZuID0gRXhwci5hdHRySGFuZGxlWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSxcblx0XHQvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoalF1ZXJ5ICMxMzgwNylcblx0XHR2YWwgPSBmbiAmJiBoYXNPd24uY2FsbCggRXhwci5hdHRySGFuZGxlLCBuYW1lLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOlxuXHRcdFx0dW5kZWZpbmVkO1xuXG5cdHJldHVybiB2YWwgIT09IHVuZGVmaW5lZCA/XG5cdFx0dmFsIDpcblx0XHRzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWRvY3VtZW50SXNIVE1MID9cblx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICkgOlxuXHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/XG5cdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdG51bGw7XG59O1xuXG5TaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkge1xuXHR0aHJvdyBuZXcgRXJyb3IoIFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIgKyBtc2cgKTtcbn07XG5cbi8qKlxuICogRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlc1xuICogQHBhcmFtIHtBcnJheUxpa2V9IHJlc3VsdHNcbiAqL1xuU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHtcblx0dmFyIGVsZW0sXG5cdFx0ZHVwbGljYXRlcyA9IFtdLFxuXHRcdGogPSAwLFxuXHRcdGkgPSAwO1xuXG5cdC8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2Vcblx0aGFzRHVwbGljYXRlID0gIXN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcztcblx0c29ydElucHV0ID0gIXN1cHBvcnQuc29ydFN0YWJsZSAmJiByZXN1bHRzLnNsaWNlKCAwICk7XG5cdHJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7XG5cblx0aWYgKCBoYXNEdXBsaWNhdGUgKSB7XG5cdFx0d2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7XG5cdFx0XHRpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHtcblx0XHRcdFx0aiA9IGR1cGxpY2F0ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdHJlc3VsdHMuc3BsaWNlKCBkdXBsaWNhdGVzWyBqIF0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0c1xuXHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjVcblx0c29ydElucHV0ID0gbnVsbDtcblxuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXNcbiAqIEBwYXJhbSB7QXJyYXl8RWxlbWVudH0gZWxlbVxuICovXG5nZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0dmFyIG5vZGUsXG5cdFx0cmV0ID0gXCJcIixcblx0XHRpID0gMCxcblx0XHRub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0aWYgKCAhbm9kZVR5cGUgKSB7XG5cdFx0Ly8gSWYgbm8gbm9kZVR5cGUsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXlcblx0XHR3aGlsZSAoIChub2RlID0gZWxlbVtpKytdKSApIHtcblx0XHRcdC8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzXG5cdFx0XHRyZXQgKz0gZ2V0VGV4dCggbm9kZSApO1xuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDEgfHwgbm9kZVR5cGUgPT09IDkgfHwgbm9kZVR5cGUgPT09IDExICkge1xuXHRcdC8vIFVzZSB0ZXh0Q29udGVudCBmb3IgZWxlbWVudHNcblx0XHQvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxpbmVzIChqUXVlcnkgIzExMTUzKVxuXHRcdGlmICggdHlwZW9mIGVsZW0udGV4dENvbnRlbnQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS50ZXh0Q29udGVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0cmV0ICs9IGdldFRleHQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVWYWx1ZTtcblx0fVxuXHQvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXNcblxuXHRyZXR1cm4gcmV0O1xufTtcblxuRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7XG5cblx0Ly8gQ2FuIGJlIGFkanVzdGVkIGJ5IHRoZSB1c2VyXG5cdGNhY2hlTGVuZ3RoOiA1MCxcblxuXHRjcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbixcblxuXHRtYXRjaDogbWF0Y2hFeHByLFxuXG5cdGF0dHJIYW5kbGU6IHt9LFxuXG5cdGZpbmQ6IHt9LFxuXG5cdHJlbGF0aXZlOiB7XG5cdFx0XCI+XCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIiBcIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiIH0sXG5cdFx0XCIrXCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiflwiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiB9XG5cdH0sXG5cblx0cHJlRmlsdGVyOiB7XG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdG1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblxuXHRcdFx0Ly8gTW92ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8gbWF0Y2hbM10gd2hldGhlciBxdW90ZWQgb3IgdW5xdW90ZWRcblx0XHRcdG1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiICkucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsyXSA9PT0gXCJ+PVwiICkge1xuXHRcdFx0XHRtYXRjaFszXSA9IFwiIFwiICsgbWF0Y2hbM10gKyBcIiBcIjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0LyogbWF0Y2hlcyBmcm9tIG1hdGNoRXhwcltcIkNISUxEXCJdXG5cdFx0XHRcdDEgdHlwZSAob25seXxudGh8Li4uKVxuXHRcdFx0XHQyIHdoYXQgKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdDMgYXJndW1lbnQgKGV2ZW58b2RkfFxcZCp8XFxkKm4oWystXVxcZCspP3wuLi4pXG5cdFx0XHRcdDQgeG4tY29tcG9uZW50IG9mIHhuK3kgYXJndW1lbnQgKFsrLV0/XFxkKm58KVxuXHRcdFx0XHQ1IHNpZ24gb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDYgeCBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NyBzaWduIG9mIHktY29tcG9uZW50XG5cdFx0XHRcdDggeSBvZiB5LWNvbXBvbmVudFxuXHRcdFx0Ki9cblx0XHRcdG1hdGNoWzFdID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSBcIm50aFwiICkge1xuXHRcdFx0XHQvLyBudGgtKiByZXF1aXJlcyBhcmd1bWVudFxuXHRcdFx0XHRpZiAoICFtYXRjaFszXSApIHtcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTERcblx0XHRcdFx0Ly8gcmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMVxuXHRcdFx0XHRtYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gXCJldmVuXCIgfHwgbWF0Y2hbM10gPT09IFwib2RkXCIgKSApO1xuXHRcdFx0XHRtYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICk7XG5cblx0XHRcdC8vIG90aGVyIHR5cGVzIHByb2hpYml0IGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHR2YXIgZXhjZXNzLFxuXHRcdFx0XHR1bnF1b3RlZCA9ICFtYXRjaFs2XSAmJiBtYXRjaFsyXTtcblxuXHRcdFx0aWYgKCBtYXRjaEV4cHJbXCJDSElMRFwiXS50ZXN0KCBtYXRjaFswXSApICkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWNjZXB0IHF1b3RlZCBhcmd1bWVudHMgYXMtaXNcblx0XHRcdGlmICggbWF0Y2hbM10gKSB7XG5cdFx0XHRcdG1hdGNoWzJdID0gbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIjtcblxuXHRcdFx0Ly8gU3RyaXAgZXhjZXNzIGNoYXJhY3RlcnMgZnJvbSB1bnF1b3RlZCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJlxuXHRcdFx0XHQvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KVxuXHRcdFx0XHQoZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkpICYmXG5cdFx0XHRcdC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpc1xuXHRcdFx0XHQoZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggXCIpXCIsIHVucXVvdGVkLmxlbmd0aCAtIGV4Y2VzcyApIC0gdW5xdW90ZWQubGVuZ3RoKSApIHtcblxuXHRcdFx0XHQvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleFxuXHRcdFx0XHRtYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdFx0bWF0Y2hbMl0gPSB1bnF1b3RlZC5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHVybiBvbmx5IGNhcHR1cmVzIG5lZWRlZCBieSB0aGUgcHNldWRvIGZpbHRlciBtZXRob2QgKHR5cGUgYW5kIGFyZ3VtZW50KVxuXHRcdFx0cmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7XG5cdFx0fVxuXHR9LFxuXG5cdGZpbHRlcjoge1xuXG5cdFx0XCJUQUdcIjogZnVuY3Rpb24oIG5vZGVOYW1lU2VsZWN0b3IgKSB7XG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBub2RlTmFtZVNlbGVjdG9yID09PSBcIipcIiA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9kZU5hbWU7XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0xBU1NcIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHtcblx0XHRcdHZhciBwYXR0ZXJuID0gY2xhc3NDYWNoZVsgY2xhc3NOYW1lICsgXCIgXCIgXTtcblxuXHRcdFx0cmV0dXJuIHBhdHRlcm4gfHxcblx0XHRcdFx0KHBhdHRlcm4gPSBuZXcgUmVnRXhwKCBcIihefFwiICsgd2hpdGVzcGFjZSArIFwiKVwiICsgY2xhc3NOYW1lICsgXCIoXCIgKyB3aGl0ZXNwYWNlICsgXCJ8JClcIiApKSAmJlxuXHRcdFx0XHRjbGFzc0NhY2hlKCBjbGFzc05hbWUsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXR0ZXJuLnRlc3QoIHR5cGVvZiBlbGVtLmNsYXNzTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBlbGVtLmNsYXNzTmFtZSB8fCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiICk7XG5cdFx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHRcdFx0aWYgKCByZXN1bHQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiIT1cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoICFvcGVyYXRvciApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdCArPSBcIlwiO1xuXG5cdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCI9XCIgPyByZXN1bHQgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIhPVwiID8gcmVzdWx0ICE9PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiXj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID09PSAwIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIqPVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiJD1cIiA/IGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0aCApID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwifj1cIiA/ICggXCIgXCIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsIFwiIFwiICkgKyBcIiBcIiApLmluZGV4T2YoIGNoZWNrICkgPiAtMSA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwifD1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgXCItXCIgOlxuXHRcdFx0XHRcdGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkge1xuXHRcdFx0dmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gXCJudGhcIixcblx0XHRcdFx0Zm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09IFwibGFzdFwiLFxuXHRcdFx0XHRvZlR5cGUgPSB3aGF0ID09PSBcIm9mLXR5cGVcIjtcblxuXHRcdFx0cmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgP1xuXG5cdFx0XHRcdC8vIFNob3J0Y3V0IGZvciA6bnRoLSoobilcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHR9IDpcblxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBjYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIG5vZGVJbmRleCwgc3RhcnQsXG5cdFx0XHRcdFx0XHRkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyBcIm5leHRTaWJsaW5nXCIgOiBcInByZXZpb3VzU2libGluZ1wiLFxuXHRcdFx0XHRcdFx0cGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0bmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdFx0XHR1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZSxcblx0XHRcdFx0XHRcdGRpZmYgPSBmYWxzZTtcblxuXHRcdFx0XHRcdGlmICggcGFyZW50ICkge1xuXG5cdFx0XHRcdFx0XHQvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdFx0XHRpZiAoIHNpbXBsZSApIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCBkaXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9IG5vZGVbIGRpciBdKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdC8vIFJldmVyc2UgZGlyZWN0aW9uIGZvciA6b25seS0qIChpZiB3ZSBoYXZlbid0IHlldCBkb25lIHNvKVxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0ID0gZGlyID0gdHlwZSA9PT0gXCJvbmx5XCIgJiYgIXN0YXJ0ICYmIFwibmV4dFNpYmxpbmdcIjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0c3RhcnQgPSBbIGZvcndhcmQgPyBwYXJlbnQuZmlyc3RDaGlsZCA6IHBhcmVudC5sYXN0Q2hpbGQgXTtcblxuXHRcdFx0XHRcdFx0Ly8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGBcblx0XHRcdFx0XHRcdGlmICggZm9yd2FyZCAmJiB1c2VDYWNoZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXhcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBwYXJlbnQ7XG5cdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXggJiYgY2FjaGVbIDIgXTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIHNlZWtpbmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVha1xuXHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiArK2RpZmYgJiYgbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXlcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRjYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXg7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB4bWwgOm50aC1jaGlsZCguLi4pXG5cdFx0XHRcdFx0XHRcdC8vIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLilcblx0XHRcdFx0XHRcdFx0aWYgKCBkaWZmID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrK2RpZmYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZVxuXHRcdFx0XHRcdFx0ZGlmZiAtPSBsYXN0O1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRpZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHtcblx0XHRcdC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZVxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlc1xuXHRcdFx0Ly8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnNcblx0XHRcdC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3Ncblx0XHRcdHZhciBhcmdzLFxuXHRcdFx0XHRmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIHBzZXVkbzogXCIgKyBwc2V1ZG8gKTtcblxuXHRcdFx0Ly8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdFxuXHRcdFx0Ly8gYXJndW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb25cblx0XHRcdC8vIGp1c3QgYXMgU2l6emxlIGRvZXNcblx0XHRcdGlmICggZm5bIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0cmV0dXJuIGZuKCBhcmd1bWVudCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXNcblx0XHRcdGlmICggZm4ubGVuZ3RoID4gMSApIHtcblx0XHRcdFx0YXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sIFwiXCIsIGFyZ3VtZW50IF07XG5cdFx0XHRcdHJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdFx0XHRcdHZhciBpZHgsXG5cdFx0XHRcdFx0XHRcdG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSxcblx0XHRcdFx0XHRcdFx0aSA9IG1hdGNoZWQubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlkeCA9IGluZGV4T2YoIHNlZWQsIG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSA6XG5cdFx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm47XG5cdFx0fVxuXHR9LFxuXG5cdHBzZXVkb3M6IHtcblx0XHQvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3Ncblx0XHRcIm5vdFwiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0Ly8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGVcblx0XHRcdC8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG5cdFx0XHQvLyBzcGFjZXMgYXMgY29tYmluYXRvcnNcblx0XHRcdHZhciBpbnB1dCA9IFtdLFxuXHRcdFx0XHRyZXN1bHRzID0gW10sXG5cdFx0XHRcdG1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICkgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/XG5cdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHRcdFx0dW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLFxuXHRcdFx0XHRcdFx0aSA9IHNlZWQubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYFxuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdHNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pIDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHRpbnB1dFswXSA9IGVsZW07XG5cdFx0XHRcdFx0bWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApO1xuXHRcdFx0XHRcdC8vIERvbid0IGtlZXAgdGhlIGVsZW1lbnQgKGlzc3VlICMyOTkpXG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBudWxsO1xuXHRcdFx0XHRcdHJldHVybiAhcmVzdWx0cy5wb3AoKTtcblx0XHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiaGFzXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImNvbnRhaW5zXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gXCJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yXG5cdFx0Ly8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWVcblx0XHQvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLFxuXHRcdC8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgXCItXCIuXG5cdFx0Ly8gVGhlIG1hdGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuXG5cdFx0Ly8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS5cIlxuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG9cblx0XHRcImxhbmdcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHtcblx0XHRcdC8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXJcblx0XHRcdGlmICggIXJpZGVudGlmaWVyLnRlc3QobGFuZyB8fCBcIlwiKSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIGxhbmc6IFwiICsgbGFuZyApO1xuXHRcdFx0fVxuXHRcdFx0bGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgZWxlbUxhbmc7XG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID9cblx0XHRcdFx0XHRcdGVsZW0ubGFuZyA6XG5cdFx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSkgKSB7XG5cblx0XHRcdFx0XHRcdGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtTGFuZyA9PT0gbGFuZyB8fCBlbGVtTGFuZy5pbmRleE9mKCBsYW5nICsgXCItXCIgKSA9PT0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gTWlzY2VsbGFuZW91c1xuXHRcdFwidGFyZ2V0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRyZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7XG5cdFx0fSxcblxuXHRcdFwicm9vdFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2NFbGVtO1xuXHRcdH0sXG5cblx0XHRcImZvY3VzXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgKCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVtLnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTtcblx0XHR9LFxuXG5cdFx0Ly8gQm9vbGVhbiBwcm9wZXJ0aWVzXG5cdFx0XCJlbmFibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlO1xuXHRcdH0sXG5cblx0XHRcImRpc2FibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdFwiY2hlY2tlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSBcIm9wdGlvblwiICYmICEhZWxlbS5zZWxlY3RlZCk7XG5cdFx0fSxcblxuXHRcdFwic2VsZWN0ZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0XG5cdFx0XHQvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5XG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBDb250ZW50c1xuXHRcdFwiZW1wdHlcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5LXBzZXVkb1xuXHRcdFx0Ly8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLFxuXHRcdFx0Ly8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjogNzsgZXRjLilcblx0XHRcdC8vIG5vZGVUeXBlIDwgNiB3b3JrcyBiZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPCA2ICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdFwicGFyZW50XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICFFeHByLnBzZXVkb3NbXCJlbXB0eVwiXSggZWxlbSApO1xuXHRcdH0sXG5cblx0XHQvLyBFbGVtZW50L2lucHV0IHR5cGVzXG5cdFx0XCJoZWFkZXJcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiaW5wdXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiYnV0dG9uXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gXCJidXR0b25cIiB8fCBuYW1lID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cblx0XHRcInRleHRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgYXR0cjtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJlxuXHRcdFx0XHRlbGVtLnR5cGUgPT09IFwidGV4dFwiICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8OFxuXHRcdFx0XHQvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgXCJzZWFyY2hcIikgYXBwZWFyIHdpdGggZWxlbS50eXBlID09PSBcInRleHRcIlxuXHRcdFx0XHQoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIgKTtcblx0XHR9LFxuXG5cdFx0Ly8gUG9zaXRpb24taW4tY29sbGVjdGlvblxuXHRcdFwiZmlyc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIDAgXTtcblx0XHR9KSxcblxuXHRcdFwibGFzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHJldHVybiBbIGxlbmd0aCAtIDEgXTtcblx0XHR9KSxcblxuXHRcdFwiZXFcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0cmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJldmVuXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJvZGRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDE7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImx0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgLS1pID49IDA7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwiZ3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyArK2kgPCBsZW5ndGg7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KVxuXHR9XG59O1xuXG5FeHByLnBzZXVkb3NbXCJudGhcIl0gPSBFeHByLnBzZXVkb3NbXCJlcVwiXTtcblxuLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3NcbmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUlucHV0UHNldWRvKCBpICk7XG59XG5mb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApO1xufVxuXG4vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnNcbmZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fVxuc2V0RmlsdGVycy5wcm90b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7XG5FeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpO1xuXG50b2tlbml6ZSA9IFNpenpsZS50b2tlbml6ZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkge1xuXHR2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSxcblx0XHRzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLFxuXHRcdGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoIGNhY2hlZCApIHtcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApO1xuXHR9XG5cblx0c29GYXIgPSBzZWxlY3Rvcjtcblx0Z3JvdXBzID0gW107XG5cdHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjtcblxuXHR3aGlsZSAoIHNvRmFyICkge1xuXG5cdFx0Ly8gQ29tbWEgYW5kIGZpcnN0IHJ1blxuXHRcdGlmICggIW1hdGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0aWYgKCBtYXRjaCApIHtcblx0XHRcdFx0Ly8gRG9uJ3QgY29uc3VtZSB0cmFpbGluZyBjb21tYXMgYXMgdmFsaWRcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7XG5cdFx0XHR9XG5cdFx0XHRncm91cHMucHVzaCggKHRva2VucyA9IFtdKSApO1xuXHRcdH1cblxuXHRcdG1hdGNoZWQgPSBmYWxzZTtcblxuXHRcdC8vIENvbWJpbmF0b3JzXG5cdFx0aWYgKCAobWF0Y2ggPSByY29tYmluYXRvcnMuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdC8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZVxuXHRcdFx0XHR0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgXCIgXCIgKVxuXHRcdFx0fSk7XG5cdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZpbHRlcnNcblx0XHRmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkge1xuXHRcdFx0aWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fFxuXHRcdFx0XHQobWF0Y2ggPSBwcmVGaWx0ZXJzWyB0eXBlIF0oIG1hdGNoICkpKSApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRcdG1hdGNoZXM6IG1hdGNoXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggIW1hdGNoZWQgKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3Ncblx0Ly8gaWYgd2UncmUganVzdCBwYXJzaW5nXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xuXHRyZXR1cm4gcGFyc2VPbmx5ID9cblx0XHRzb0Zhci5sZW5ndGggOlxuXHRcdHNvRmFyID9cblx0XHRcdFNpenpsZS5lcnJvciggc2VsZWN0b3IgKSA6XG5cdFx0XHQvLyBDYWNoZSB0aGUgdG9rZW5zXG5cdFx0XHR0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTtcbn07XG5cbmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0c2VsZWN0b3IgPSBcIlwiO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7XG5cdH1cblx0cmV0dXJuIHNlbGVjdG9yO1xufVxuXG5mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBiYXNlICkge1xuXHR2YXIgZGlyID0gY29tYmluYXRvci5kaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGRpciBdKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgZGlyIF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0c3VwcG9ydC5nZXRCeUlkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiZcblx0XHRcdFx0RXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kW1wiSURcIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdO1xuXHRcdFx0aWYgKCAhY29udGV4dCApIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWxcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBpbGVkICkge1xuXHRcdFx0XHRjb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nXG5cdFx0aSA9IG1hdGNoRXhwcltcIm5lZWRzQ29udGV4dFwiXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvclxuXHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHtcblx0XHRcdFx0Ly8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzXG5cdFx0XHRcdGlmICggKHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0XHRyc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdFx0XHRcdCkpICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0IWNvbnRleHQgfHwgcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIE9uZS10aW1lIGFzc2lnbm1lbnRzXG5cbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KFwiXCIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oXCJcIikgPT09IGV4cGFuZG87XG5cbi8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNStcbi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25cbnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYxICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGRpdjEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHhcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XG5cdHJldHVybiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpID09PSBcIiNcIiA7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInR5cGV8aHJlZnxoZWlnaHR8d2lkdGhcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidHlwZVwiID8gMSA6IDIgKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG5pZiAoICFzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8aW5wdXQvPlwiO1xuXHRkaXYuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiwgXCJcIiApO1xuXHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRyZXR1cm4gZGl2LmdldEF0dHJpYnV0ZShcImRpc2FibGVkXCIpID09IG51bGw7XG59KSApIHtcblx0YWRkSGFuZGxlKCBib29sZWFucywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciB2YWw7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgpIDpcblx0XHRcdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0fVxuXHR9KTtcbn1cblxucmV0dXJuIFNpenpsZTtcblxufSkoIHdpbmRvdyApO1xuXG5cblxualF1ZXJ5LmZpbmQgPSBTaXp6bGU7XG5qUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7XG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG52YXIgcnNpbmdsZVRhZyA9ICggL148KFtcXHctXSspXFxzKlxcLz8+KD86PFxcL1xcMT58KSQvICk7XG5cblxuXG52YXIgcmlzU2ltcGxlID0gL14uW146I1xcW1xcLixdKiQvO1xuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHF1YWxpZmllciApICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXG5cdH1cblxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSApO1xuXG5cdH1cblxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0aWYgKCByaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG5cdFx0fVxuXG5cdFx0cXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyApO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuICggalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHF1YWxpZmllciApID4gLTEgKSAhPT0gbm90O1xuXHR9ICk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRyZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgP1xuXHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXSA6XG5cdFx0alF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxO1xuXHRcdH0gKSApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdHNlbGYgPSB0aGlzLFxuXHRcdFx0bGVuID0gc2VsZi5sZW5ndGg7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApO1xuXHRcdH1cblxuXHRcdC8vIE5lZWRlZCBiZWNhdXNlICQoIHNlbGVjdG9yLCBjb250ZXh0ICkgYmVjb21lcyAkKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKVxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQgKTtcblx0XHRyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yID8gdGhpcy5zZWxlY3RvciArIFwiIFwiICsgc2VsZWN0b3IgOiBzZWxlY3Rvcjtcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXHRmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIGZhbHNlICkgKTtcblx0fSxcblx0bm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTtcblx0fSxcblx0aXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gISF3aW5ub3coXG5cdFx0XHR0aGlzLFxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0XG5cdFx0XHQvLyBzbyAkKFwicDpmaXJzdFwiKS5pcyhcInA6bGFzdFwiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gXCJwXCIuXG5cdFx0XHR0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID9cblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0c2VsZWN0b3IgfHwgW10sXG5cdFx0XHRmYWxzZVxuXHRcdCkubGVuZ3RoO1xuXHR9XG59ICk7XG5cblxuLy8gSW5pdGlhbGl6ZSBhIGpRdWVyeSBvYmplY3RcblxuXG4vLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudClcbnZhciByb290alF1ZXJ5LFxuXG5cdC8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzXG5cdC8vIFByaW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoICgjOTUyMSlcblx0Ly8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpXG5cdHJxdWlja0V4cHIgPSAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0qKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBpbml0IGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3IuY2hhckF0KCAwICkgPT09IFwiPFwiICYmXG5cdFx0XHRcdHNlbGVjdG9yLmNoYXJBdCggc2VsZWN0b3IubGVuZ3RoIC0gMSApID09PSBcIj5cIiAmJlxuXHRcdFx0XHRzZWxlY3Rvci5sZW5ndGggPj0gMyApIHtcblxuXHRcdFx0XHQvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVja1xuXHRcdFx0XHRtYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWRcblx0XHRcdGlmICggbWF0Y2ggJiYgKCBtYXRjaFsgMSBdIHx8ICFjb250ZXh0ICkgKSB7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpXG5cdFx0XHRcdGlmICggbWF0Y2hbIDEgXSApIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbIDAgXSA6IGNvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsgMiBdICk7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJuc1xuXHRcdFx0XHRcdC8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjNcblx0XHRcdFx0XHRpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtc1xuXHRcdFx0XHRcdFx0Ly8gYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgIT09IG1hdGNoWyAyIF0gKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByb290alF1ZXJ5LmZpbmQoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXMubGVuZ3RoID0gMTtcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7XG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpcy5jb250ZXh0ID0gdGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiB0eXBlb2Ygcm9vdC5yZWFkeSAhPT0gXCJ1bmRlZmluZWRcIiA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdGlmICggc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3Rvcjtcblx0XHRcdHRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yLCB0aGlzICk7XG5cdH07XG5cbi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb25cbmluaXQucHJvdG90eXBlID0galF1ZXJ5LmZuO1xuXG4vLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlXG5yb290alF1ZXJ5ID0galF1ZXJ5KCBkb2N1bWVudCApO1xuXG5cbnZhciBycGFyZW50c3ByZXYgPSAvXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxcblxuXHQvLyBtZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldFxuXHRndWFyYW50ZWVkVW5pcXVlID0ge1xuXHRcdGNoaWxkcmVuOiB0cnVlLFxuXHRcdGNvbnRlbnRzOiB0cnVlLFxuXHRcdG5leHQ6IHRydWUsXG5cdFx0cHJldjogdHJ1ZVxuXHR9O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhhczogZnVuY3Rpb24oIHRhcmdldCApIHtcblx0XHR2YXIgaSxcblx0XHRcdHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bGVuID0gdGFyZ2V0cy5sZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0cG9zID0gcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSB8fCB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiID9cblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOlxuXHRcdFx0XHQwO1xuXG5cdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0Zm9yICggY3VyID0gdGhpc1sgaSBdOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHQvLyBBbHdheXMgc2tpcCBkb2N1bWVudCBmcmFnbWVudHNcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHBvcyA/XG5cdFx0XHRcdFx0cG9zLmluZGV4KCBjdXIgKSA+IC0xIDpcblxuXHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBjdXIsIHNlbGVjdG9ycyApICkgKSB7XG5cblx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW5cblx0Ly8gdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzXG5cdGluZGV4OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50XG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcblx0XHR9XG5cblx0XHQvLyBpbmRleCBpbiBzZWxlY3RvclxuXHRcdGlmICggdHlwZW9mIGVsZW0gPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbIDAgXSwgalF1ZXJ5KCBlbGVtICkgKTtcblx0XHR9XG5cblx0XHQvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRcblx0XHRyZXR1cm4galF1ZXJ5LmluQXJyYXkoXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtLCB0aGlzICk7XG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKFxuXHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKVxuXHRcdCk7XG5cdH1cbn0gKTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdGRvIHtcblx0XHRjdXIgPSBjdXJbIGRpciBdO1xuXHR9IHdoaWxlICggY3VyICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApO1xuXG5cdHJldHVybiBjdXI7XG59XG5cbmpRdWVyeS5lYWNoKCB7XG5cdHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xuXHR9LFxuXHRwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiApO1xuXHR9LFxuXHRwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiwgdW50aWwgKTtcblx0fSxcblx0bmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xuXHR9LFxuXHRjaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCBlbGVtLmZpcnN0Q2hpbGQgKTtcblx0fSxcblx0Y29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwiaWZyYW1lXCIgKSA/XG5cdFx0XHRlbGVtLmNvbnRlbnREb2N1bWVudCB8fCBlbGVtLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQgOlxuXHRcdFx0alF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7XG5cdH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkge1xuXHRcdHZhciByZXQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcblx0XHRcdGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHtcblx0XHRcdFx0cmV0ID0galF1ZXJ5LnVuaXF1ZVNvcnQoIHJldCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRyZXQgPSByZXQucmV2ZXJzZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm5vdHdoaXRlID0gKCAvXFxTKy9nICk7XG5cblxuXG4vLyBDb252ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lc1xuZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHtcblx0dmFyIG9iamVjdCA9IHt9O1xuXHRqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkge1xuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcblx0fSApO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6XG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcblxuXHR2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblxuXHRcdC8vIExhc3QgZmlyZSB2YWx1ZSBmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzXG5cdFx0bWVtb3J5LFxuXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblxuXHRcdC8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmdcblx0XHRsb2NrZWQsXG5cblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblxuXHRcdC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0cXVldWUgPSBbXSxcblxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4ID0gLTEsXG5cblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xuXHRcdGZpcmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nXG5cdFx0XHRsb2NrZWQgPSBvcHRpb25zLm9uY2U7XG5cblx0XHRcdC8vIEV4ZWN1dGUgY2FsbGJhY2tzIGZvciBhbGwgcGVuZGluZyBleGVjdXRpb25zLFxuXHRcdFx0Ly8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlc1xuXHRcdFx0ZmlyZWQgPSBmaXJpbmcgPSB0cnVlO1xuXHRcdFx0Zm9yICggOyBxdWV1ZS5sZW5ndGg7IGZpcmluZ0luZGV4ID0gLTEgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRcdHdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0Ly8gUnVuIGNhbGxiYWNrIGFuZCBjaGVjayBmb3IgZWFybHkgdGVybWluYXRpb25cblx0XHRcdFx0XHRpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIG1lbW9yeVsgMCBdLCBtZW1vcnlbIDEgXSApID09PSBmYWxzZSAmJlxuXHRcdFx0XHRcdFx0b3B0aW9ucy5zdG9wT25GYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSnVtcCB0byBlbmQgYW5kIGZvcmdldCB0aGUgZGF0YSBzbyAuYWRkIGRvZXNuJ3QgcmUtZmlyZVxuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aDtcblx0XHRcdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3JnZXQgdGhlIGRhdGEgaWYgd2UncmUgZG9uZSB3aXRoIGl0XG5cdFx0XHRpZiAoICFvcHRpb25zLm1lbW9yeSApIHtcblx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGZpcmluZyA9IGZhbHNlO1xuXG5cdFx0XHQvLyBDbGVhbiB1cCBpZiB3ZSdyZSBkb25lIGZpcmluZyBmb3IgZ29vZFxuXHRcdFx0aWYgKCBsb2NrZWQgKSB7XG5cblx0XHRcdFx0Ly8gS2VlcCBhbiBlbXB0eSBsaXN0IGlmIHdlIGhhdmUgZGF0YSBmb3IgZnV0dXJlIGFkZCBjYWxsc1xuXHRcdFx0XHRpZiAoIG1lbW9yeSApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCB0aGlzIG9iamVjdCBpcyBzcGVudFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxpc3QgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0XG5cdFx0c2VsZiA9IHtcblxuXHRcdFx0Ly8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdFxuXHRcdFx0YWRkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmdcblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBtZW1vcnkgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQoIGZ1bmN0aW9uIGFkZCggYXJncyApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIGpRdWVyeS50eXBlKCBhcmcgKSAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEluc3BlY3QgcmVjdXJzaXZlbHlcblx0XHRcdFx0XHRcdFx0XHRhZGQoIGFyZyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0fSApKCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdFxuXHRcdFx0cmVtb3ZlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHR2YXIgaW5kZXg7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRsaXN0LnNwbGljZSggaW5kZXgsIDEgKTtcblxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGZpcmluZyBpbmRleGVzXG5cdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkge1xuXHRcdFx0XHRcdFx0XHRmaXJpbmdJbmRleC0tO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxpc3QuXG5cdFx0XHQvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC5cblx0XHRcdGhhczogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRyZXR1cm4gZm4gP1xuXHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOlxuXHRcdFx0XHRcdGxpc3QubGVuZ3RoID4gMDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3Rcblx0XHRcdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmUgYW5kIC5hZGRcblx0XHRcdC8vIEFib3J0IGFueSBjdXJyZW50L3BlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0Ly8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzXG5cdFx0XHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGRpc2FibGVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFsaXN0O1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZVxuXHRcdFx0Ly8gQWxzbyBkaXNhYmxlIC5hZGQgdW5sZXNzIHdlIGhhdmUgbWVtb3J5IChzaW5jZSBpdCB3b3VsZCBoYXZlIG5vIGVmZmVjdClcblx0XHRcdC8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdGxvY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSB0cnVlO1xuXHRcdFx0XHRpZiAoICFtZW1vcnkgKSB7XG5cdFx0XHRcdFx0c2VsZi5kaXNhYmxlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhbG9ja2VkO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoICFsb2NrZWQgKSB7XG5cdFx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XG5cdFx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0aWYgKCAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblxuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgbGlzdGVuZXIgbGlzdCwgZmluYWwgc3RhdGVcblx0XHRcdFx0WyBcInJlc29sdmVcIiwgXCJkb25lXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCBcInJlc29sdmVkXCIgXSxcblx0XHRcdFx0WyBcInJlamVjdFwiLCBcImZhaWxcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIFwicmVqZWN0ZWRcIiBdLFxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgZm4gPSBqUXVlcnkuaXNGdW5jdGlvbiggZm5zWyBpIF0gKSAmJiBmbnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZFsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdIGZvciBmb3J3YXJkaW5nIGFjdGlvbnMgdG8gbmV3RGVmZXJcblx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIG5ld0RlZmVyLm5vdGlmeSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5kb25lKCBuZXdEZWZlci5yZXNvbHZlIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmZhaWwoIG5ld0RlZmVyLnJlamVjdCApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlclsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMgPT09IHByb21pc2UgPyBuZXdEZWZlci5wcm9taXNlKCkgOiB0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdFxuXHRcdHByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDMgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZVsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGVcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XG5cdFx0XHRcdGxpc3QuYWRkKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdC8vIHN0YXRlID0gWyByZXNvbHZlZCB8IHJlamVjdGVkIF1cblx0XHRcdFx0XHRzdGF0ZSA9IHN0YXRlU3RyaW5nO1xuXG5cdFx0XHRcdC8vIFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxlOyBwcm9ncmVzc19saXN0LmxvY2tcblx0XHRcdFx0fSwgdHVwbGVzWyBpIF4gMSBdWyAyIF0uZGlzYWJsZSwgdHVwbGVzWyAyIF1bIDIgXS5sb2NrICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlZmVycmVkWyByZXNvbHZlIHwgcmVqZWN0IHwgbm90aWZ5IF1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHByb21pc2UgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdID0gbGlzdC5maXJlV2l0aDtcblx0XHR9ICk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzdWJvcmRpbmF0ZSAvKiAsIC4uLiwgc3Vib3JkaW5hdGVOICovICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblx0XHRcdGxlbmd0aCA9IHJlc29sdmVWYWx1ZXMubGVuZ3RoLFxuXG5cdFx0XHQvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBsZW5ndGggIT09IDEgfHxcblx0XHRcdFx0KCBzdWJvcmRpbmF0ZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggc3Vib3JkaW5hdGUucHJvbWlzZSApICkgPyBsZW5ndGggOiAwLFxuXG5cdFx0XHQvLyB0aGUgbWFzdGVyIERlZmVycmVkLlxuXHRcdFx0Ly8gSWYgcmVzb2x2ZVZhbHVlcyBjb25zaXN0IG9mIG9ubHkgYSBzaW5nbGUgRGVmZXJyZWQsIGp1c3QgdXNlIHRoYXQuXG5cdFx0XHRkZWZlcnJlZCA9IHJlbWFpbmluZyA9PT0gMSA/IHN1Ym9yZGluYXRlIDogalF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIFVwZGF0ZSBmdW5jdGlvbiBmb3IgYm90aCByZXNvbHZlIGFuZCBwcm9ncmVzcyB2YWx1ZXNcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSwgY29udGV4dHMsIHZhbHVlcyApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRjb250ZXh0c1sgaSBdID0gdGhpcztcblx0XHRcdFx0XHR2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoIHZhbHVlcyA9PT0gcHJvZ3Jlc3NWYWx1ZXMgKSB7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XG5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhKCAtLXJlbWFpbmluZyApICkge1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXG5cdFx0XHRwcm9ncmVzc1ZhbHVlcywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2ZUNvbnRleHRzO1xuXG5cdFx0Ly8gYWRkIGxpc3RlbmVycyB0byBEZWZlcnJlZCBzdWJvcmRpbmF0ZXM7IHRyZWF0IG90aGVycyBhcyByZXNvbHZlZFxuXHRcdGlmICggbGVuZ3RoID4gMSApIHtcblx0XHRcdHByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdHByb2dyZXNzQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApO1xuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRyZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIHVwZGF0ZUZ1bmMoIGksIHByb2dyZXNzQ29udGV4dHMsIHByb2dyZXNzVmFsdWVzICkgKVxuXHRcdFx0XHRcdFx0LmRvbmUoIHVwZGF0ZUZ1bmMoIGksIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApIClcblx0XHRcdFx0XHRcdC5mYWlsKCBkZWZlcnJlZC5yZWplY3QgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQtLXJlbWFpbmluZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIGlmIHdlJ3JlIG5vdCB3YWl0aW5nIG9uIGFueXRoaW5nLCByZXNvbHZlIHRoZSBtYXN0ZXJcblx0XHRpZiAoICFyZW1haW5pbmcgKSB7XG5cdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcblx0fVxufSApO1xuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdDtcblxualF1ZXJ5LmZuLnJlYWR5ID0gZnVuY3Rpb24oIGZuICkge1xuXG5cdC8vIEFkZCB0aGUgY2FsbGJhY2tcblx0alF1ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBmbiApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhvbGQgKG9yIHJlbGVhc2UpIHRoZSByZWFkeSBldmVudFxuXHRob2xkUmVhZHk6IGZ1bmN0aW9uKCBob2xkICkge1xuXHRcdGlmICggaG9sZCApIHtcblx0XHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0XHR9IGVsc2Uge1xuXHRcdFx0alF1ZXJ5LnJlYWR5KCB0cnVlICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblxuXHRcdC8vIFRyaWdnZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50c1xuXHRcdGlmICggalF1ZXJ5LmZuLnRyaWdnZXJIYW5kbGVyICkge1xuXHRcdFx0alF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXJIYW5kbGVyKCBcInJlYWR5XCIgKTtcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS5vZmYoIFwicmVhZHlcIiApO1xuXHRcdH1cblx0fVxufSApO1xuXG4vKipcbiAqIENsZWFuLXVwIG1ldGhvZCBmb3IgZG9tIHJlYWR5IGV2ZW50c1xuICovXG5mdW5jdGlvbiBkZXRhY2goKSB7XG5cdGlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQgKTtcblxuXHR9IGVsc2Uge1xuXHRcdGRvY3VtZW50LmRldGFjaEV2ZW50KCBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiLCBjb21wbGV0ZWQgKTtcblx0XHR3aW5kb3cuZGV0YWNoRXZlbnQoIFwib25sb2FkXCIsIGNvbXBsZXRlZCApO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXG5cdC8vIHJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiBpcyBnb29kIGVub3VnaCBmb3IgdXMgdG8gY2FsbCB0aGUgZG9tIHJlYWR5IGluIG9sZElFXG5cdGlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciB8fFxuXHRcdHdpbmRvdy5ldmVudC50eXBlID09PSBcImxvYWRcIiB8fFxuXHRcdGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiApIHtcblxuXHRcdGRldGFjaCgpO1xuXHRcdGpRdWVyeS5yZWFkeSgpO1xuXHR9XG59XG5cbmpRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHtcblx0aWYgKCAhcmVhZHlMaXN0ICkge1xuXG5cdFx0cmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cblx0XHQvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZFxuXHRcdC8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuXHRcdC8vIFN1cHBvcnQ6IElFNi0xMFxuXHRcdC8vIE9sZGVyIElFIHNvbWV0aW1lcyBzaWduYWxzIFwiaW50ZXJhY3RpdmVcIiB0b28gc29vblxuXHRcdGlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8XG5cdFx0XHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHRcdFx0Ly8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5XG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7XG5cblx0XHQvLyBTdGFuZGFyZHMtYmFzZWQgYnJvd3NlcnMgc3VwcG9ydCBET01Db250ZW50TG9hZGVkXG5cdFx0fSBlbHNlIGlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHtcblxuXHRcdFx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdFx0XHQvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29ya1xuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQgKTtcblxuXHRcdC8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWRcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBFbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lc1xuXHRcdFx0ZG9jdW1lbnQuYXR0YWNoRXZlbnQoIFwib25yZWFkeXN0YXRlY2hhbmdlXCIsIGNvbXBsZXRlZCApO1xuXG5cdFx0XHQvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29ya1xuXHRcdFx0d2luZG93LmF0dGFjaEV2ZW50KCBcIm9ubG9hZFwiLCBjb21wbGV0ZWQgKTtcblxuXHRcdFx0Ly8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lXG5cdFx0XHQvLyBjb250aW51YWxseSBjaGVjayB0byBzZWUgaWYgdGhlIGRvY3VtZW50IGlzIHJlYWR5XG5cdFx0XHR2YXIgdG9wID0gZmFsc2U7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRvcCA9IHdpbmRvdy5mcmFtZUVsZW1lbnQgPT0gbnVsbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cblx0XHRcdGlmICggdG9wICYmIHRvcC5kb1Njcm9sbCApIHtcblx0XHRcdFx0KCBmdW5jdGlvbiBkb1Njcm9sbENoZWNrKCkge1xuXHRcdFx0XHRcdGlmICggIWpRdWVyeS5pc1JlYWR5ICkge1xuXG5cdFx0XHRcdFx0XHR0cnkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pXG5cdFx0XHRcdFx0XHRcdC8vIGh0dHA6Ly9qYXZhc2NyaXB0Lm53Ym94LmNvbS9JRUNvbnRlbnRMb2FkZWQvXG5cdFx0XHRcdFx0XHRcdHRvcC5kb1Njcm9sbCggXCJsZWZ0XCIgKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoIGRvU2Nyb2xsQ2hlY2ssIDUwICk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIGRldGFjaCBhbGwgZG9tIHJlYWR5IGV2ZW50c1xuXHRcdFx0XHRcdFx0ZGV0YWNoKCk7XG5cblx0XHRcdFx0XHRcdC8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9uc1xuXHRcdFx0XHRcdFx0alF1ZXJ5LnJlYWR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICkoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlYWR5TGlzdC5wcm9taXNlKCBvYmogKTtcbn07XG5cbi8vIEtpY2sgb2ZmIHRoZSBET00gcmVhZHkgY2hlY2sgZXZlbiBpZiB0aGUgdXNlciBkb2VzIG5vdFxualF1ZXJ5LnJlYWR5LnByb21pc2UoKTtcblxuXG5cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gSXRlcmF0aW9uIG92ZXIgb2JqZWN0J3MgaW5oZXJpdGVkIHByb3BlcnRpZXMgYmVmb3JlIGl0cyBvd25cbnZhciBpO1xuZm9yICggaSBpbiBqUXVlcnkoIHN1cHBvcnQgKSApIHtcblx0YnJlYWs7XG59XG5zdXBwb3J0Lm93bkZpcnN0ID0gaSA9PT0gXCIwXCI7XG5cbi8vIE5vdGU6IG1vc3Qgc3VwcG9ydCB0ZXN0cyBhcmUgZGVmaW5lZCBpbiB0aGVpciByZXNwZWN0aXZlIG1vZHVsZXMuXG4vLyBmYWxzZSB1bnRpbCB0aGUgdGVzdCBpcyBydW5cbnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCA9IGZhbHNlO1xuXG4vLyBFeGVjdXRlIEFTQVAgaW4gY2FzZSB3ZSBuZWVkIHRvIHNldCBib2R5LnN0eWxlLnpvb21cbmpRdWVyeSggZnVuY3Rpb24oKSB7XG5cblx0Ly8gTWluaWZpZWQ6IHZhciBhLGIsYyxkXG5cdHZhciB2YWwsIGRpdiwgYm9keSwgY29udGFpbmVyO1xuXG5cdGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJib2R5XCIgKVsgMCBdO1xuXHRpZiAoICFib2R5IHx8ICFib2R5LnN0eWxlICkge1xuXG5cdFx0Ly8gUmV0dXJuIGZvciBmcmFtZXNldCBkb2NzIHRoYXQgZG9uJ3QgaGF2ZSBhIGJvZHlcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTZXR1cFxuXHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4XCI7XG5cdGJvZHkuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApLmFwcGVuZENoaWxkKCBkaXYgKTtcblxuXHRpZiAoIHR5cGVvZiBkaXYuc3R5bGUuem9vbSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHQvLyBDaGVjayBpZiBuYXRpdmVseSBibG9jay1sZXZlbCBlbGVtZW50cyBhY3QgbGlrZSBpbmxpbmUtYmxvY2tcblx0XHQvLyBlbGVtZW50cyB3aGVuIHNldHRpbmcgdGhlaXIgZGlzcGxheSB0byAnaW5saW5lJyBhbmQgZ2l2aW5nXG5cdFx0Ly8gdGhlbSBsYXlvdXRcblx0XHRkaXYuc3R5bGUuY3NzVGV4dCA9IFwiZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MVwiO1xuXG5cdFx0c3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ID0gdmFsID0gZGl2Lm9mZnNldFdpZHRoID09PSAzO1xuXHRcdGlmICggdmFsICkge1xuXG5cdFx0XHQvLyBQcmV2ZW50IElFIDYgZnJvbSBhZmZlY3RpbmcgbGF5b3V0IGZvciBwb3NpdGlvbmVkIGVsZW1lbnRzICMxMTA0OFxuXHRcdFx0Ly8gUHJldmVudCBJRSBmcm9tIHNocmlua2luZyB0aGUgYm9keSBpbiBJRSA3IG1vZGUgIzEyODY5XG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw4XG5cdFx0XHRib2R5LnN0eWxlLnpvb20gPSAxO1xuXHRcdH1cblx0fVxuXG5cdGJvZHkucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xufSApO1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmRlbGV0ZUV4cGFuZG8gPSB0cnVlO1xuXHR0cnkge1xuXHRcdGRlbGV0ZSBkaXYudGVzdDtcblx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0c3VwcG9ydC5kZWxldGVFeHBhbmRvID0gZmFsc2U7XG5cdH1cblxuXHQvLyBOdWxsIGVsZW1lbnRzIHRvIGF2b2lkIGxlYWtzIGluIElFLlxuXHRkaXYgPSBudWxsO1xufSApKCk7XG52YXIgYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHR2YXIgbm9EYXRhID0galF1ZXJ5Lm5vRGF0YVsgKCBlbGVtLm5vZGVOYW1lICsgXCIgXCIgKS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0bm9kZVR5cGUgPSArZWxlbS5ub2RlVHlwZSB8fCAxO1xuXG5cdC8vIERvIG5vdCBzZXQgZGF0YSBvbiBub24tZWxlbWVudCBET00gbm9kZXMgYmVjYXVzZSBpdCB3aWxsIG5vdCBiZSBjbGVhcmVkICgjODMzNSkuXG5cdHJldHVybiBub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSA/XG5cdFx0ZmFsc2UgOlxuXG5cdFx0Ly8gTm9kZXMgYWNjZXB0IGRhdGEgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQ7IHJlamVjdGlvbiBjYW4gYmUgY29uZGl0aW9uYWxcblx0XHQhbm9EYXRhIHx8IG5vRGF0YSAhPT0gdHJ1ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZSggXCJjbGFzc2lkXCIgKSA9PT0gbm9EYXRhO1xufTtcblxuXG5cblxudmFyIHJicmFjZSA9IC9eKD86XFx7W1xcd1xcV10qXFx9fFxcW1tcXHdcXFddKlxcXSkkLyxcblx0cm11bHRpRGFzaCA9IC8oW0EtWl0pL2c7XG5cbmZ1bmN0aW9uIGRhdGFBdHRyKCBlbGVtLCBrZXksIGRhdGEgKSB7XG5cblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxuXHQvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGVcblx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdHZhciBuYW1lID0gXCJkYXRhLVwiICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsIFwiLSQxXCIgKS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGRhdGEgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6XG5cdFx0XHRcdFx0ZGF0YSA9PT0gXCJmYWxzZVwiID8gZmFsc2UgOlxuXHRcdFx0XHRcdGRhdGEgPT09IFwibnVsbFwiID8gbnVsbCA6XG5cblx0XHRcdFx0XHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRcdFx0XHRcdCtkYXRhICsgXCJcIiA9PT0gZGF0YSA/ICtkYXRhIDpcblx0XHRcdFx0XHRyYnJhY2UudGVzdCggZGF0YSApID8galF1ZXJ5LnBhcnNlSlNPTiggZGF0YSApIDpcblx0XHRcdFx0XHRkYXRhO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXJcblx0XHRcdGpRdWVyeS5kYXRhKCBlbGVtLCBrZXksIGRhdGEgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG4vLyBjaGVja3MgYSBjYWNoZSBvYmplY3QgZm9yIGVtcHRpbmVzc1xuZnVuY3Rpb24gaXNFbXB0eURhdGFPYmplY3QoIG9iaiApIHtcblx0dmFyIG5hbWU7XG5cdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXG5cdFx0Ly8gaWYgdGhlIHB1YmxpYyBkYXRhIG9iamVjdCBpcyBlbXB0eSwgdGhlIHByaXZhdGUgaXMgc3RpbGwgZW1wdHlcblx0XHRpZiAoIG5hbWUgPT09IFwiZGF0YVwiICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvYmpbIG5hbWUgXSApICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGlmICggbmFtZSAhPT0gXCJ0b0pTT05cIiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaW50ZXJuYWxEYXRhKCBlbGVtLCBuYW1lLCBkYXRhLCBwdnQgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdGlmICggIWFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR2YXIgcmV0LCB0aGlzQ2FjaGUsXG5cdFx0aW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbyxcblxuXHRcdC8vIFdlIGhhdmUgdG8gaGFuZGxlIERPTSBub2RlcyBhbmQgSlMgb2JqZWN0cyBkaWZmZXJlbnRseSBiZWNhdXNlIElFNi03XG5cdFx0Ly8gY2FuJ3QgR0Mgb2JqZWN0IHJlZmVyZW5jZXMgcHJvcGVybHkgYWNyb3NzIHRoZSBET00tSlMgYm91bmRhcnlcblx0XHRpc05vZGUgPSBlbGVtLm5vZGVUeXBlLFxuXG5cdFx0Ly8gT25seSBET00gbm9kZXMgbmVlZCB0aGUgZ2xvYmFsIGpRdWVyeSBjYWNoZTsgSlMgb2JqZWN0IGRhdGEgaXNcblx0XHQvLyBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUgb2JqZWN0IHNvIEdDIGNhbiBvY2N1ciBhdXRvbWF0aWNhbGx5XG5cdFx0Y2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLFxuXG5cdFx0Ly8gT25seSBkZWZpbmluZyBhbiBJRCBmb3IgSlMgb2JqZWN0cyBpZiBpdHMgY2FjaGUgYWxyZWFkeSBleGlzdHMgYWxsb3dzXG5cdFx0Ly8gdGhlIGNvZGUgdG8gc2hvcnRjdXQgb24gdGhlIHNhbWUgcGF0aCBhcyBhIERPTSBub2RlIHdpdGggbm8gY2FjaGVcblx0XHRpZCA9IGlzTm9kZSA/IGVsZW1bIGludGVybmFsS2V5IF0gOiBlbGVtWyBpbnRlcm5hbEtleSBdICYmIGludGVybmFsS2V5O1xuXG5cdC8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuXG5cdC8vIG9iamVjdCB0aGF0IGhhcyBubyBkYXRhIGF0IGFsbFxuXHRpZiAoICggIWlkIHx8ICFjYWNoZVsgaWQgXSB8fCAoICFwdnQgJiYgIWNhY2hlWyBpZCBdLmRhdGEgKSApICYmXG5cdFx0ZGF0YSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmICggIWlkICkge1xuXG5cdFx0Ly8gT25seSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVhY2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhXG5cdFx0Ly8gZW5kcyB1cCBpbiB0aGUgZ2xvYmFsIGNhY2hlXG5cdFx0aWYgKCBpc05vZGUgKSB7XG5cdFx0XHRpZCA9IGVsZW1bIGludGVybmFsS2V5IF0gPSBkZWxldGVkSWRzLnBvcCgpIHx8IGpRdWVyeS5ndWlkKys7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlkID0gaW50ZXJuYWxLZXk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCAhY2FjaGVbIGlkIF0gKSB7XG5cblx0XHQvLyBBdm9pZCBleHBvc2luZyBqUXVlcnkgbWV0YWRhdGEgb24gcGxhaW4gSlMgb2JqZWN0cyB3aGVuIHRoZSBvYmplY3Rcblx0XHQvLyBpcyBzZXJpYWxpemVkIHVzaW5nIEpTT04uc3RyaW5naWZ5XG5cdFx0Y2FjaGVbIGlkIF0gPSBpc05vZGUgPyB7fSA6IHsgdG9KU09OOiBqUXVlcnkubm9vcCB9O1xuXHR9XG5cblx0Ly8gQW4gb2JqZWN0IGNhbiBiZSBwYXNzZWQgdG8galF1ZXJ5LmRhdGEgaW5zdGVhZCBvZiBhIGtleS92YWx1ZSBwYWlyOyB0aGlzIGdldHNcblx0Ly8gc2hhbGxvdyBjb3BpZWQgb3ZlciBvbnRvIHRoZSBleGlzdGluZyBjYWNoZVxuXHRpZiAoIHR5cGVvZiBuYW1lID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cdFx0aWYgKCBwdnQgKSB7XG5cdFx0XHRjYWNoZVsgaWQgXSA9IGpRdWVyeS5leHRlbmQoIGNhY2hlWyBpZCBdLCBuYW1lICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNhY2hlWyBpZCBdLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCBjYWNoZVsgaWQgXS5kYXRhLCBuYW1lICk7XG5cdFx0fVxuXHR9XG5cblx0dGhpc0NhY2hlID0gY2FjaGVbIGlkIF07XG5cblx0Ly8galF1ZXJ5IGRhdGEoKSBpcyBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBvYmplY3QgaW5zaWRlIHRoZSBvYmplY3QncyBpbnRlcm5hbCBkYXRhXG5cdC8vIGNhY2hlIGluIG9yZGVyIHRvIGF2b2lkIGtleSBjb2xsaXNpb25zIGJldHdlZW4gaW50ZXJuYWwgZGF0YSBhbmQgdXNlci1kZWZpbmVkXG5cdC8vIGRhdGEuXG5cdGlmICggIXB2dCApIHtcblx0XHRpZiAoICF0aGlzQ2FjaGUuZGF0YSApIHtcblx0XHRcdHRoaXNDYWNoZS5kYXRhID0ge307XG5cdFx0fVxuXG5cdFx0dGhpc0NhY2hlID0gdGhpc0NhY2hlLmRhdGE7XG5cdH1cblxuXHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHR0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdID0gZGF0YTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciBib3RoIGNvbnZlcnRlZC10by1jYW1lbCBhbmQgbm9uLWNvbnZlcnRlZCBkYXRhIHByb3BlcnR5IG5hbWVzXG5cdC8vIElmIGEgZGF0YSBwcm9wZXJ0eSB3YXMgc3BlY2lmaWVkXG5cdGlmICggdHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHQvLyBGaXJzdCBUcnkgdG8gZmluZCBhcy1pcyBwcm9wZXJ0eSBkYXRhXG5cdFx0cmV0ID0gdGhpc0NhY2hlWyBuYW1lIF07XG5cblx0XHQvLyBUZXN0IGZvciBudWxsfHVuZGVmaW5lZCBwcm9wZXJ0eSBkYXRhXG5cdFx0aWYgKCByZXQgPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gVHJ5IHRvIGZpbmQgdGhlIGNhbWVsQ2FzZWQgcHJvcGVydHlcblx0XHRcdHJldCA9IHRoaXNDYWNoZVsgalF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApIF07XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldCA9IHRoaXNDYWNoZTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGludGVybmFsUmVtb3ZlRGF0YSggZWxlbSwgbmFtZSwgcHZ0ICkge1xuXHRpZiAoICFhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIHRoaXNDYWNoZSwgaSxcblx0XHRpc05vZGUgPSBlbGVtLm5vZGVUeXBlLFxuXG5cdFx0Ly8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uXG5cdFx0Y2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLFxuXHRcdGlkID0gaXNOb2RlID8gZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXSA6IGpRdWVyeS5leHBhbmRvO1xuXG5cdC8vIElmIHRoZXJlIGlzIGFscmVhZHkgbm8gY2FjaGUgZW50cnkgZm9yIHRoaXMgb2JqZWN0LCB0aGVyZSBpcyBub1xuXHQvLyBwdXJwb3NlIGluIGNvbnRpbnVpbmdcblx0aWYgKCAhY2FjaGVbIGlkIF0gKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKCBuYW1lICkge1xuXG5cdFx0dGhpc0NhY2hlID0gcHZ0ID8gY2FjaGVbIGlkIF0gOiBjYWNoZVsgaWQgXS5kYXRhO1xuXG5cdFx0aWYgKCB0aGlzQ2FjaGUgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBuYW1lcyBmb3IgZGF0YSBrZXlzXG5cdFx0XHRpZiAoICFqUXVlcnkuaXNBcnJheSggbmFtZSApICkge1xuXG5cdFx0XHRcdC8vIHRyeSB0aGUgc3RyaW5nIGFzIGEga2V5IGJlZm9yZSBhbnkgbWFuaXB1bGF0aW9uXG5cdFx0XHRcdGlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7XG5cdFx0XHRcdFx0bmFtZSA9IFsgbmFtZSBdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gc3BsaXQgdGhlIGNhbWVsIGNhc2VkIHZlcnNpb24gYnkgc3BhY2VzIHVubGVzcyBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzXG5cdFx0XHRcdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTtcblx0XHRcdFx0XHRpZiAoIG5hbWUgaW4gdGhpc0NhY2hlICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IFsgbmFtZSBdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gbmFtZS5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gSWYgXCJuYW1lXCIgaXMgYW4gYXJyYXkgb2Yga2V5cy4uLlxuXHRcdFx0XHQvLyBXaGVuIGRhdGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAoXCJrZXlcIiwgXCJ2YWxcIikgc2lnbmF0dXJlLFxuXHRcdFx0XHQvLyBrZXlzIHdpbGwgYmUgY29udmVydGVkIHRvIGNhbWVsQ2FzZS5cblx0XHRcdFx0Ly8gU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2FzIGFkZGVkLCByZW1vdmVcblx0XHRcdFx0Ly8gYm90aCBwbGFpbiBrZXkgYW5kIGNhbWVsQ2FzZSBrZXkuICMxMjc4NlxuXHRcdFx0XHQvLyBUaGlzIHdpbGwgb25seSBwZW5hbGl6ZSB0aGUgYXJyYXkgYXJndW1lbnQgcGF0aC5cblx0XHRcdFx0bmFtZSA9IG5hbWUuY29uY2F0KCBqUXVlcnkubWFwKCBuYW1lLCBqUXVlcnkuY2FtZWxDYXNlICkgKTtcblx0XHRcdH1cblxuXHRcdFx0aSA9IG5hbWUubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzQ2FjaGVbIG5hbWVbIGkgXSBdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGxlZnQgaW4gdGhlIGNhY2hlLCB3ZSB3YW50IHRvIGNvbnRpbnVlXG5cdFx0XHQvLyBhbmQgbGV0IHRoZSBjYWNoZSBvYmplY3QgaXRzZWxmIGdldCBkZXN0cm95ZWRcblx0XHRcdGlmICggcHZ0ID8gIWlzRW1wdHlEYXRhT2JqZWN0KCB0aGlzQ2FjaGUgKSA6ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggdGhpc0NhY2hlICkgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZWUgalF1ZXJ5LmRhdGEgZm9yIG1vcmUgaW5mb3JtYXRpb25cblx0aWYgKCAhcHZ0ICkge1xuXHRcdGRlbGV0ZSBjYWNoZVsgaWQgXS5kYXRhO1xuXG5cdFx0Ly8gRG9uJ3QgZGVzdHJveSB0aGUgcGFyZW50IGNhY2hlIHVubGVzcyB0aGUgaW50ZXJuYWwgZGF0YSBvYmplY3Rcblx0XHQvLyBoYWQgYmVlbiB0aGUgb25seSB0aGluZyBsZWZ0IGluIGl0XG5cdFx0aWYgKCAhaXNFbXB0eURhdGFPYmplY3QoIGNhY2hlWyBpZCBdICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0Ly8gRGVzdHJveSB0aGUgY2FjaGVcblx0aWYgKCBpc05vZGUgKSB7XG5cdFx0alF1ZXJ5LmNsZWFuRGF0YSggWyBlbGVtIF0sIHRydWUgKTtcblxuXHQvLyBVc2UgZGVsZXRlIHdoZW4gc3VwcG9ydGVkIGZvciBleHBhbmRvcyBvciBgY2FjaGVgIGlzIG5vdCBhIHdpbmRvdyBwZXIgaXNXaW5kb3cgKCMxMDA4MClcblx0LyoganNoaW50IGVxZXFlcTogZmFsc2UgKi9cblx0fSBlbHNlIGlmICggc3VwcG9ydC5kZWxldGVFeHBhbmRvIHx8IGNhY2hlICE9IGNhY2hlLndpbmRvdyApIHtcblx0XHQvKiBqc2hpbnQgZXFlcWVxOiB0cnVlICovXG5cdFx0ZGVsZXRlIGNhY2hlWyBpZCBdO1xuXG5cdC8vIFdoZW4gYWxsIGVsc2UgZmFpbHMsIHVuZGVmaW5lZFxuXHR9IGVsc2Uge1xuXHRcdGNhY2hlWyBpZCBdID0gdW5kZWZpbmVkO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0Y2FjaGU6IHt9LFxuXG5cdC8vIFRoZSBmb2xsb3dpbmcgZWxlbWVudHMgKHNwYWNlLXN1ZmZpeGVkIHRvIGF2b2lkIE9iamVjdC5wcm90b3R5cGUgY29sbGlzaW9ucylcblx0Ly8gdGhyb3cgdW5jYXRjaGFibGUgZXhjZXB0aW9ucyBpZiB5b3UgYXR0ZW1wdCB0byBzZXQgZXhwYW5kbyBwcm9wZXJ0aWVzXG5cdG5vRGF0YToge1xuXHRcdFwiYXBwbGV0IFwiOiB0cnVlLFxuXHRcdFwiZW1iZWQgXCI6IHRydWUsXG5cblx0XHQvLyAuLi5idXQgRmxhc2ggb2JqZWN0cyAod2hpY2ggaGF2ZSB0aGlzIGNsYXNzaWQpICpjYW4qIGhhbmRsZSBleHBhbmRvc1xuXHRcdFwib2JqZWN0IFwiOiBcImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMFwiXG5cdH0sXG5cblx0aGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0ZWxlbSA9IGVsZW0ubm9kZVR5cGUgPyBqUXVlcnkuY2FjaGVbIGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gXSA6IGVsZW1bIGpRdWVyeS5leHBhbmRvIF07XG5cdFx0cmV0dXJuICEhZWxlbSAmJiAhaXNFbXB0eURhdGFPYmplY3QoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gaW50ZXJuYWxEYXRhKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0cmV0dXJuIGludGVybmFsUmVtb3ZlRGF0YSggZWxlbSwgbmFtZSApO1xuXHR9LFxuXG5cdC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cblx0X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBpbnRlcm5hbERhdGEoIGVsZW0sIG5hbWUsIGRhdGEsIHRydWUgKTtcblx0fSxcblxuXHRfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0cmV0dXJuIGludGVybmFsUmVtb3ZlRGF0YSggZWxlbSwgbmFtZSwgdHJ1ZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIFNwZWNpYWwgZXhwZWN0aW9ucyBvZiAuZGF0YSBiYXNpY2FsbHkgdGh3YXJ0IGpRdWVyeS5hY2Nlc3MsXG5cdFx0Ly8gc28gaW1wbGVtZW50IHRoZSByZWxldmFudCBiZWhhdmlvciBvdXJzZWx2ZXNcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0galF1ZXJ5LmRhdGEoIGVsZW0gKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWpRdWVyeS5fZGF0YSggZWxlbSwgXCJwYXJzZWRBdHRyc1wiICkgKSB7XG5cdFx0XHRcdFx0aSA9IGF0dHJzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUxMStcblx0XHRcdFx0XHRcdC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KVxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyc1sgaSBdICkge1xuXHRcdFx0XHRcdFx0XHRuYW1lID0gYXR0cnNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5hbWUuaW5kZXhPZiggXCJkYXRhLVwiICkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRqUXVlcnkuX2RhdGEoIGVsZW0sIFwicGFyc2VkQXR0cnNcIiwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH1cblxuXHRcdC8vIFNldHMgbXVsdGlwbGUgdmFsdWVzXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5kYXRhKCB0aGlzLCBrZXkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgP1xuXG5cdFx0XHQvLyBTZXRzIG9uZSB2YWx1ZVxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdH0gKSA6XG5cblx0XHRcdC8vIEdldHMgb25lIHZhbHVlXG5cdFx0XHQvLyBUcnkgdG8gZmV0Y2ggYW55IGludGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3Rcblx0XHRcdGVsZW0gPyBkYXRhQXR0ciggZWxlbSwga2V5LCBqUXVlcnkuZGF0YSggZWxlbSwga2V5ICkgKSA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZURhdGEoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBqUXVlcnkuX2RhdGEoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBjbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIG5vdCBpbnRlbmRlZCBmb3IgcHVibGljIGNvbnN1bXB0aW9uIC0gZ2VuZXJhdGVzIGEgcXVldWVIb29rcyBvYmplY3QsXG5cdC8vIG9yIHJldHVybnMgdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBqUXVlcnkuX2RhdGEoIGVsZW0sIGtleSApIHx8IGpRdWVyeS5fZGF0YSggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5Ll9yZW1vdmVEYXRhKCBlbGVtLCB0eXBlICsgXCJxdWV1ZVwiICk7XG5cdFx0XHRcdGpRdWVyeS5fcmVtb3ZlRGF0YSggZWxlbSwga2V5ICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIGVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0galF1ZXJ5Ll9kYXRhKCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIHNocmlua1dyYXBCbG9ja3NWYWw7XG5cblx0c3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCBzaHJpbmtXcmFwQmxvY2tzVmFsICE9IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2hyaW5rV3JhcEJsb2Nrc1ZhbDtcblx0XHR9XG5cblx0XHQvLyBXaWxsIGJlIGNoYW5nZWQgbGF0ZXIgaWYgbmVlZGVkLlxuXHRcdHNocmlua1dyYXBCbG9ja3NWYWwgPSBmYWxzZTtcblxuXHRcdC8vIE1pbmlmaWVkOiB2YXIgYixjLGRcblx0XHR2YXIgZGl2LCBib2R5LCBjb250YWluZXI7XG5cblx0XHRib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwiYm9keVwiIClbIDAgXTtcblx0XHRpZiAoICFib2R5IHx8ICFib2R5LnN0eWxlICkge1xuXG5cdFx0XHQvLyBUZXN0IGZpcmVkIHRvbyBlYXJseSBvciBpbiBhbiB1bnN1cHBvcnRlZCBlbnZpcm9ubWVudCwgZXhpdC5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBTZXR1cFxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cdFx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4XCI7XG5cdFx0Ym9keS5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0Ly8gU3VwcG9ydDogSUU2XG5cdFx0Ly8gQ2hlY2sgaWYgZWxlbWVudHMgd2l0aCBsYXlvdXQgc2hyaW5rLXdyYXAgdGhlaXIgY2hpbGRyZW5cblx0XHRpZiAoIHR5cGVvZiBkaXYuc3R5bGUuem9vbSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblxuXHRcdFx0Ly8gUmVzZXQgQ1NTOiBib3gtc2l6aW5nOyBkaXNwbGF5OyBtYXJnaW47IGJvcmRlclxuXHRcdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjksIEFuZHJvaWQgMi4zXG5cdFx0XHRcdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRcdFx0XHRcIi13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7XCIgK1xuXHRcdFx0XHRcImJveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtcIiArXG5cdFx0XHRcdFwicGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MVwiO1xuXHRcdFx0ZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKS5zdHlsZS53aWR0aCA9IFwiNXB4XCI7XG5cdFx0XHRzaHJpbmtXcmFwQmxvY2tzVmFsID0gZGl2Lm9mZnNldFdpZHRoICE9PSAzO1xuXHRcdH1cblxuXHRcdGJvZHkucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xuXG5cdFx0cmV0dXJuIHNocmlua1dyYXBCbG9ja3NWYWw7XG5cdH07XG5cbn0gKSgpO1xudmFyIHBudW0gPSAoIC9bKy1dPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdWystXT9cXGQrfCkvICkuc291cmNlO1xuXG52YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoIFwiXig/OihbKy1dKT18KShcIiArIHBudW0gKyBcIikoW2EteiVdKikkXCIsIFwiaVwiICk7XG5cblxudmFyIGNzc0V4cGFuZCA9IFsgXCJUb3BcIiwgXCJSaWdodFwiLCBcIkJvdHRvbVwiLCBcIkxlZnRcIiBdO1xuXG52YXIgaXNIaWRkZW4gPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXHRcdHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApID09PSBcIm5vbmVcIiB8fFxuXHRcdFx0IWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cdH07XG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsXG5cdFx0c2NhbGUgPSAxLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHR3ZWVuLmN1cigpOyB9IDpcblx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgcHJvcCwgXCJcIiApOyB9LFxuXHRcdGluaXRpYWwgPSBjdXJyZW50VmFsdWUoKSxcblx0XHR1bml0ID0gdmFsdWVQYXJ0cyAmJiB2YWx1ZVBhcnRzWyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICksXG5cblx0XHQvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlc1xuXHRcdGluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSBcInB4XCIgJiYgK2luaXRpYWwgKSAmJlxuXHRcdFx0cmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTtcblxuXHRpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkge1xuXG5cdFx0Ly8gVHJ1c3QgdW5pdHMgcmVwb3J0ZWQgYnkgalF1ZXJ5LmNzc1xuXHRcdHVuaXQgPSB1bml0IHx8IGluaXRpYWxJblVuaXRbIDMgXTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhlIHR3ZWVuIHByb3BlcnRpZXMgbGF0ZXIgb25cblx0XHR2YWx1ZVBhcnRzID0gdmFsdWVQYXJ0cyB8fCBbXTtcblxuXHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsIHx8IDE7XG5cblx0XHRkbyB7XG5cblx0XHRcdC8vIElmIHByZXZpb3VzIGl0ZXJhdGlvbiB6ZXJvZWQgb3V0LCBkb3VibGUgdW50aWwgd2UgZ2V0ICpzb21ldGhpbmcqLlxuXHRcdFx0Ly8gVXNlIHN0cmluZyBmb3IgZG91Ymxpbmcgc28gd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IHNlZSBzY2FsZSBhcyB1bmNoYW5nZWQgYmVsb3dcblx0XHRcdHNjYWxlID0gc2NhbGUgfHwgXCIuNVwiO1xuXG5cdFx0XHQvLyBBZGp1c3QgYW5kIGFwcGx5XG5cdFx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAvIHNjYWxlO1xuXHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXG5cdFx0Ly8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm8gb3IgTmFOIGZyb20gdHdlZW4uY3VyKClcblx0XHQvLyBCcmVhayB0aGUgbG9vcCBpZiBzY2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwgb3IgaWYgd2UndmUganVzdCBoYWQgZW5vdWdoLlxuXHRcdH0gd2hpbGUgKFxuXHRcdFx0c2NhbGUgIT09ICggc2NhbGUgPSBjdXJyZW50VmFsdWUoKSAvIGluaXRpYWwgKSAmJiBzY2FsZSAhPT0gMSAmJiAtLW1heEl0ZXJhdGlvbnNcblx0XHQpO1xuXHR9XG5cblx0aWYgKCB2YWx1ZVBhcnRzICkge1xuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbEluVW5pdCB8fCAraW5pdGlhbCB8fCAwO1xuXG5cdFx0Ly8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkXG5cdFx0YWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gP1xuXHRcdFx0aW5pdGlhbEluVW5pdCArICggdmFsdWVQYXJ0c1sgMSBdICsgMSApICogdmFsdWVQYXJ0c1sgMiBdIDpcblx0XHRcdCt2YWx1ZVBhcnRzWyAyIF07XG5cdFx0aWYgKCB0d2VlbiApIHtcblx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0dHdlZW4uc3RhcnQgPSBpbml0aWFsSW5Vbml0O1xuXHRcdFx0dHdlZW4uZW5kID0gYWRqdXN0ZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhZGp1c3RlZDtcbn1cblxuXG4vLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb25cbi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvblxudmFyIGFjY2VzcyA9IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRidWxrID0ga2V5ID09IG51bGw7XG5cblx0Ly8gU2V0cyBtYW55IHZhbHVlc1xuXHRpZiAoIGpRdWVyeS50eXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmF3ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGJ1bGsgKSB7XG5cblx0XHRcdC8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldFxuXHRcdFx0aWYgKCByYXcgKSB7XG5cdFx0XHRcdGZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApO1xuXHRcdFx0XHRmbiA9IG51bGw7XG5cblx0XHRcdC8vIC4uLmV4Y2VwdCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvbiB2YWx1ZXNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ1bGsgPSBmbjtcblx0XHRcdFx0Zm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGZuKFxuXHRcdFx0XHRcdGVsZW1zWyBpIF0sXG5cdFx0XHRcdFx0a2V5LFxuXHRcdFx0XHRcdHJhdyA/IHZhbHVlIDogdmFsdWUuY2FsbCggZWxlbXNbIGkgXSwgaSwgZm4oIGVsZW1zWyBpIF0sIGtleSApIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY2hhaW5hYmxlID9cblx0XHRlbGVtcyA6XG5cblx0XHQvLyBHZXRzXG5cdFx0YnVsayA/XG5cdFx0XHRmbi5jYWxsKCBlbGVtcyApIDpcblx0XHRcdGxlbmd0aCA/IGZuKCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbXFx3Oi1dKykvICk7XG5cbnZhciByc2NyaXB0VHlwZSA9ICggL14kfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApO1xuXG52YXIgcmxlYWRpbmdXaGl0ZXNwYWNlID0gKCAvXlxccysvICk7XG5cbnZhciBub2RlTmFtZXMgPSBcImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8Y2FudmFzfGRhdGF8ZGF0YWxpc3R8XCIgK1xuXHRcdFwiZGV0YWlsc3xkaWFsb2d8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFpbnxcIiArXG5cdFx0XCJtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cGljdHVyZXxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGVtcGxhdGV8dGltZXx2aWRlb1wiO1xuXG5cblxuZnVuY3Rpb24gY3JlYXRlU2FmZUZyYWdtZW50KCBkb2N1bWVudCApIHtcblx0dmFyIGxpc3QgPSBub2RlTmFtZXMuc3BsaXQoIFwifFwiICksXG5cdFx0c2FmZUZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cblx0aWYgKCBzYWZlRnJhZy5jcmVhdGVFbGVtZW50ICkge1xuXHRcdHdoaWxlICggbGlzdC5sZW5ndGggKSB7XG5cdFx0XHRzYWZlRnJhZy5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRsaXN0LnBvcCgpXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gc2FmZUZyYWc7XG59XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFNldHVwXG5cdGRpdi5pbm5lckhUTUwgPSBcIiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPlwiO1xuXG5cdC8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWRcblx0c3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSA9IGRpdi5maXJzdENoaWxkLm5vZGVUeXBlID09PSAzO1xuXG5cdC8vIE1ha2Ugc3VyZSB0aGF0IHRib2R5IGVsZW1lbnRzIGFyZW4ndCBhdXRvbWF0aWNhbGx5IGluc2VydGVkXG5cdC8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50byBlbXB0eSB0YWJsZXNcblx0c3VwcG9ydC50Ym9keSA9ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwidGJvZHlcIiApLmxlbmd0aDtcblxuXHQvLyBNYWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5lckhUTUxcblx0Ly8gVGhpcyByZXF1aXJlcyBhIHdyYXBwZXIgZWxlbWVudCBpbiBJRVxuXHRzdXBwb3J0Lmh0bWxTZXJpYWxpemUgPSAhIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJsaW5rXCIgKS5sZW5ndGg7XG5cblx0Ly8gTWFrZXMgc3VyZSBjbG9uaW5nIGFuIGh0bWw1IGVsZW1lbnQgZG9lcyBub3QgY2F1c2UgcHJvYmxlbXNcblx0Ly8gV2hlcmUgb3V0ZXJIVE1MIGlzIHVuZGVmaW5lZCwgdGhpcyBzdGlsbCB3b3Jrc1xuXHRzdXBwb3J0Lmh0bWw1Q2xvbmUgPVxuXHRcdGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwibmF2XCIgKS5jbG9uZU5vZGUoIHRydWUgKS5vdXRlckhUTUwgIT09IFwiPDpuYXY+PC86bmF2PlwiO1xuXG5cdC8vIENoZWNrIGlmIGEgZGlzY29ubmVjdGVkIGNoZWNrYm94IHdpbGwgcmV0YWluIGl0cyBjaGVja2VkXG5cdC8vIHZhbHVlIG9mIHRydWUgYWZ0ZXIgYXBwZW5kZWQgdG8gdGhlIERPTSAoSUU2LzcpXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cdGlucHV0LmNoZWNrZWQgPSB0cnVlO1xuXHRmcmFnbWVudC5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblx0c3VwcG9ydC5hcHBlbmRDaGVja2VkID0gaW5wdXQuY2hlY2tlZDtcblxuXHQvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZFxuXHQvLyBTdXBwb3J0OiBJRTYtSUUxMStcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcblxuXHQvLyAjMTEyMTcgLSBXZWJLaXQgbG9zZXMgY2hlY2sgd2hlbiB0aGUgbmFtZSBpcyBhZnRlciB0aGUgY2hlY2tlZCBhdHRyaWJ1dGVcblx0ZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBTYWZhcmkgNS4xLCBpT1MgNS4xLCBBbmRyb2lkIDQueCwgQW5kcm9pZCAyLjNcblx0Ly8gb2xkIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50c1xuXHRzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHQvLyBDbG9uZWQgZWxlbWVudHMga2VlcCBhdHRhY2hFdmVudCBoYW5kbGVycywgd2UgdXNlIGFkZEV2ZW50TGlzdGVuZXIgb24gSUU5K1xuXHRzdXBwb3J0Lm5vQ2xvbmVFdmVudCA9ICEhZGl2LmFkZEV2ZW50TGlzdGVuZXI7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHQvLyBTaW5jZSBhdHRyaWJ1dGVzIGFuZCBwcm9wZXJ0aWVzIGFyZSB0aGUgc2FtZSBpbiBJRSxcblx0Ly8gY2xlYW5EYXRhIG11c3Qgc2V0IHByb3BlcnRpZXMgdG8gdW5kZWZpbmVkIHJhdGhlciB0aGFuIHVzZSByZW1vdmVBdHRyaWJ1dGVcblx0ZGl2WyBqUXVlcnkuZXhwYW5kbyBdID0gMTtcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gIWRpdi5nZXRBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7XG59ICkoKTtcblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cdG9wdGlvbjogWyAxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIiBdLFxuXHRsZWdlbmQ6IFsgMSwgXCI8ZmllbGRzZXQ+XCIsIFwiPC9maWVsZHNldD5cIiBdLFxuXHRhcmVhOiBbIDEsIFwiPG1hcD5cIiwgXCI8L21hcD5cIiBdLFxuXG5cdC8vIFN1cHBvcnQ6IElFOFxuXHRwYXJhbTogWyAxLCBcIjxvYmplY3Q+XCIsIFwiPC9vYmplY3Q+XCIgXSxcblx0dGhlYWQ6IFsgMSwgXCI8dGFibGU+XCIsIFwiPC90YWJsZT5cIiBdLFxuXHR0cjogWyAyLCBcIjx0YWJsZT48dGJvZHk+XCIsIFwiPC90Ym9keT48L3RhYmxlPlwiIF0sXG5cdGNvbDogWyAyLCBcIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+XCIsIFwiPC9jb2xncm91cD48L3RhYmxlPlwiIF0sXG5cdHRkOiBbIDMsIFwiPHRhYmxlPjx0Ym9keT48dHI+XCIsIFwiPC90cj48L3Rib2R5PjwvdGFibGU+XCIgXSxcblxuXHQvLyBJRTYtOCBjYW4ndCBzZXJpYWxpemUgbGluaywgc2NyaXB0LCBzdHlsZSwgb3IgYW55IGh0bWw1IChOb1Njb3BlKSB0YWdzLFxuXHQvLyB1bmxlc3Mgd3JhcHBlZCBpbiBhIGRpdiB3aXRoIG5vbi1icmVha2luZyBjaGFyYWN0ZXJzIGluIGZyb250IG9mIGl0LlxuXHRfZGVmYXVsdDogc3VwcG9ydC5odG1sU2VyaWFsaXplID8gWyAwLCBcIlwiLCBcIlwiIF0gOiBbIDEsIFwiWDxkaXY+XCIsIFwiPC9kaXY+XCIgXVxufTtcblxuLy8gU3VwcG9ydDogSUU4LUlFOVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cdHZhciBlbGVtcywgZWxlbSxcblx0XHRpID0gMCxcblx0XHRmb3VuZCA9IHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiID9cblx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCBcIipcIiApIDpcblx0XHRcdHR5cGVvZiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgIT09IFwidW5kZWZpbmVkXCIgP1xuXHRcdFx0XHRjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCBcIipcIiApIDpcblx0XHRcdFx0dW5kZWZpbmVkO1xuXG5cdGlmICggIWZvdW5kICkge1xuXHRcdGZvciAoIGZvdW5kID0gW10sIGVsZW1zID0gY29udGV4dC5jaGlsZE5vZGVzIHx8IGNvbnRleHQ7XG5cdFx0XHQoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT0gbnVsbDtcblx0XHRcdGkrK1xuXHRcdCkge1xuXHRcdFx0aWYgKCAhdGFnIHx8IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgdGFnICkgKSB7XG5cdFx0XHRcdGZvdW5kLnB1c2goIGVsZW0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggZm91bmQsIGdldEFsbCggZWxlbSwgdGFnICkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIGpRdWVyeS5ub2RlTmFtZSggY29udGV4dCwgdGFnICkgP1xuXHRcdGpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0sIGZvdW5kICkgOlxuXHRcdGZvdW5kO1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgZWxlbSxcblx0XHRpID0gMDtcblx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGpRdWVyeS5fZGF0YShcblx0XHRcdGVsZW0sXG5cdFx0XHRcImdsb2JhbEV2YWxcIixcblx0XHRcdCFyZWZFbGVtZW50cyB8fCBqUXVlcnkuX2RhdGEoIHJlZkVsZW1lbnRzWyBpIF0sIFwiZ2xvYmFsRXZhbFwiIClcblx0XHQpO1xuXHR9XG59XG5cblxudmFyIHJodG1sID0gLzx8JiM/XFx3KzsvLFxuXHRydGJvZHkgPSAvPHRib2R5L2k7XG5cbmZ1bmN0aW9uIGZpeERlZmF1bHRDaGVja2VkKCBlbGVtICkge1xuXHRpZiAoIHJjaGVja2FibGVUeXBlLnRlc3QoIGVsZW0udHlwZSApICkge1xuXHRcdGVsZW0uZGVmYXVsdENoZWNrZWQgPSBlbGVtLmNoZWNrZWQ7XG5cdH1cbn1cblxuZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHtcblx0dmFyIGosIGVsZW0sIGNvbnRhaW5zLFxuXHRcdHRtcCwgdGFnLCB0Ym9keSwgd3JhcCxcblx0XHRsID0gZWxlbXMubGVuZ3RoLFxuXG5cdFx0Ly8gRW5zdXJlIGEgc2FmZSBmcmFnbWVudFxuXHRcdHNhZmUgPSBjcmVhdGVTYWZlRnJhZ21lbnQoIGNvbnRleHQgKSxcblxuXHRcdG5vZGVzID0gW10sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCBqUXVlcnkudHlwZSggZWxlbSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IHNhZmUuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0d3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7XG5cblx0XHRcdFx0dG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07XG5cblx0XHRcdFx0Ly8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50XG5cdFx0XHRcdGogPSB3cmFwWyAwIF07XG5cdFx0XHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0XHRcdHRtcCA9IHRtcC5sYXN0Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBNYW51YWxseSBhZGQgbGVhZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQgYnkgSUVcblx0XHRcdFx0aWYgKCAhc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiBybGVhZGluZ1doaXRlc3BhY2UudGVzdCggZWxlbSApICkge1xuXHRcdFx0XHRcdG5vZGVzLnB1c2goIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIHJsZWFkaW5nV2hpdGVzcGFjZS5leGVjKCBlbGVtIClbIDAgXSApICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50c1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnRib2R5ICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RyaW5nIHdhcyBhIDx0YWJsZT4sICptYXkqIGhhdmUgc3B1cmlvdXMgPHRib2R5PlxuXHRcdFx0XHRcdGVsZW0gPSB0YWcgPT09IFwidGFibGVcIiAmJiAhcnRib2R5LnRlc3QoIGVsZW0gKSA/XG5cdFx0XHRcdFx0XHR0bXAuZmlyc3RDaGlsZCA6XG5cblx0XHRcdFx0XHRcdC8vIFN0cmluZyB3YXMgYSBiYXJlIDx0aGVhZD4gb3IgPHRmb290PlxuXHRcdFx0XHRcdFx0d3JhcFsgMSBdID09PSBcIjx0YWJsZT5cIiAmJiAhcnRib2R5LnRlc3QoIGVsZW0gKSA/XG5cdFx0XHRcdFx0XHRcdHRtcCA6XG5cdFx0XHRcdFx0XHRcdDA7XG5cblx0XHRcdFx0XHRqID0gZWxlbSAmJiBlbGVtLmNoaWxkTm9kZXMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkubm9kZU5hbWUoICggdGJvZHkgPSBlbGVtLmNoaWxkTm9kZXNbIGogXSApLCBcInRib2R5XCIgKSAmJlxuXHRcdFx0XHRcdFx0XHQhdGJvZHkuY2hpbGROb2Rlcy5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHRcdFx0ZWxlbS5yZW1vdmVDaGlsZCggdGJvZHkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCB0bXAuY2hpbGROb2RlcyApO1xuXG5cdFx0XHRcdC8vIEZpeCAjMTIzOTIgZm9yIFdlYktpdCBhbmQgSUUgPiA5XG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0XHRcdFx0Ly8gRml4ICMxMjM5MiBmb3Igb2xkSUVcblx0XHRcdFx0d2hpbGUgKCB0bXAuZmlyc3RDaGlsZCApIHtcblx0XHRcdFx0XHR0bXAucmVtb3ZlQ2hpbGQoIHRtcC5maXJzdENoaWxkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgcHJvcGVyIGNsZWFudXBcblx0XHRcdFx0dG1wID0gc2FmZS5sYXN0Q2hpbGQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gRml4ICMxMTM1NjogQ2xlYXIgZWxlbWVudHMgZnJvbSBmcmFnbWVudFxuXHRpZiAoIHRtcCApIHtcblx0XHRzYWZlLnJlbW92ZUNoaWxkKCB0bXAgKTtcblx0fVxuXG5cdC8vIFJlc2V0IGRlZmF1bHRDaGVja2VkIGZvciBhbnkgcmFkaW9zIGFuZCBjaGVja2JveGVzXG5cdC8vIGFib3V0IHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBET00gaW4gSUUgNi83ICgjODA2MClcblx0aWYgKCAhc3VwcG9ydC5hcHBlbmRDaGVja2VkICkge1xuXHRcdGpRdWVyeS5ncmVwKCBnZXRBbGwoIG5vZGVzLCBcImlucHV0XCIgKSwgZml4RGVmYXVsdENoZWNrZWQgKTtcblx0fVxuXG5cdGkgPSAwO1xuXHR3aGlsZSAoICggZWxlbSA9IG5vZGVzWyBpKysgXSApICkge1xuXG5cdFx0Ly8gU2tpcCBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBjb250ZXh0IGNvbGxlY3Rpb24gKHRyYWMtNDA4Nylcblx0XHRpZiAoIHNlbGVjdGlvbiAmJiBqUXVlcnkuaW5BcnJheSggZWxlbSwgc2VsZWN0aW9uICkgPiAtMSApIHtcblx0XHRcdGlmICggaWdub3JlZCApIHtcblx0XHRcdFx0aWdub3JlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggc2FmZS5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0aWYgKCBjb250YWlucyApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdH1cblxuXHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdG1wWyBqKysgXSApICkge1xuXHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHR0bXAgPSBudWxsO1xuXG5cdHJldHVybiBzYWZlO1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpLCBldmVudE5hbWUsXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDkgKGxhY2sgc3VibWl0L2NoYW5nZSBidWJibGUpLCBGaXJlZm94IChsYWNrIGZvY3VzKGluIHwgb3V0KSBldmVudHMpXG5cdGZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIGNoYW5nZTogdHJ1ZSwgZm9jdXNpbjogdHJ1ZSB9ICkge1xuXHRcdGV2ZW50TmFtZSA9IFwib25cIiArIGk7XG5cblx0XHRpZiAoICEoIHN1cHBvcnRbIGkgXSA9IGV2ZW50TmFtZSBpbiB3aW5kb3cgKSApIHtcblxuXHRcdFx0Ly8gQmV3YXJlIG9mIENTUCByZXN0cmljdGlvbnMgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL1NlY3VyaXR5L0NTUClcblx0XHRcdGRpdi5zZXRBdHRyaWJ1dGUoIGV2ZW50TmFtZSwgXCJ0XCIgKTtcblx0XHRcdHN1cHBvcnRbIGkgXSA9IGRpdi5hdHRyaWJ1dGVzWyBldmVudE5hbWUgXS5leHBhbmRvID09PSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvLyBOdWxsIGVsZW1lbnRzIHRvIGF2b2lkIGxlYWtzIGluIElFLlxuXHRkaXYgPSBudWxsO1xufSApKCk7XG5cblxudmFyIHJmb3JtRWxlbXMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksXG5cdHJrZXlFdmVudCA9IC9ea2V5Lyxcblx0cm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sXG5cdHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFxuXHRydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRTlcbi8vIFNlZSAjMTMzOTMgZm9yIG1vcmUgaW5mb1xuZnVuY3Rpb24gc2FmZUFjdGl2ZUVsZW1lbnQoKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cdH0gY2F0Y2ggKCBlcnIgKSB7IH1cbn1cblxuZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHtcblx0dmFyIG9yaWdGbiwgdHlwZTtcblxuXHQvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnNcblx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyAoIHR5cGVzLU9iamVjdCwgc2VsZWN0b3IsIGRhdGEgKVxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApXG5cdFx0XHRkYXRhID0gZGF0YSB8fCBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0b24oIGVsZW0sIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIGRhdGEgPT0gbnVsbCAmJiBmbiA9PSBudWxsICkge1xuXG5cdFx0Ly8gKCB0eXBlcywgZm4gKVxuXHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0ZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKCBmbiA9PSBudWxsICkge1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBkYXRhLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0fSBlbHNlIGlmICggIWZuICkge1xuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBvbmUgPT09IDEgKSB7XG5cdFx0b3JpZ0ZuID0gZm47XG5cdFx0Zm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mb1xuXHRcdFx0alF1ZXJ5KCkub2ZmKCBldmVudCApO1xuXHRcdFx0cmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fTtcblxuXHRcdC8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuXG5cdFx0Zm4uZ3VpZCA9IG9yaWdGbi5ndWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7XG5cdH1cblx0cmV0dXJuIGVsZW0uZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApO1xuXHR9ICk7XG59XG5cbi8qXG4gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVudHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuXG4gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLlxuICovXG5qUXVlcnkuZXZlbnQgPSB7XG5cblx0Z2xvYmFsOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIHRtcCwgZXZlbnRzLCB0LCBoYW5kbGVPYmpJbixcblx0XHRcdHNwZWNpYWwsIGV2ZW50SGFuZGxlLCBoYW5kbGVPYmosXG5cdFx0XHRoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGpRdWVyeS5fZGF0YSggZWxlbSApO1xuXG5cdFx0Ly8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21tZW50IG5vZGVzIChidXQgYWxsb3cgcGxhaW4gb2JqZWN0cylcblx0XHRpZiAoICFlbGVtRGF0YSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0XHRcdCggIWUgfHwgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlICkgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZXZlbnRIYW5kbGUuZWxlbSwgYXJndW1lbnRzICkgOlxuXHRcdFx0XHRcdHVuZGVmaW5lZDtcblx0XHRcdH07XG5cblx0XHRcdC8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmbiB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWtcblx0XHRcdC8vIHdpdGggSUUgbm9uLW5hdGl2ZSBldmVudHNcblx0XHRcdGV2ZW50SGFuZGxlLmVsZW0gPSBlbGVtO1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWyAxIF07XG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bXBbIDIgXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnNcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGVcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblxuXHRcdFx0Ly8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzXG5cdFx0XHRoYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdG9yaWdUeXBlOiBvcmlnVHlwZSxcblx0XHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdFx0aGFuZGxlcjogaGFuZGxlcixcblx0XHRcdFx0Z3VpZDogaGFuZGxlci5ndWlkLFxuXHRcdFx0XHRzZWxlY3Rvcjogc2VsZWN0b3IsXG5cdFx0XHRcdG5lZWRzQ29udGV4dDogc2VsZWN0b3IgJiYgalF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICksXG5cdFx0XHRcdG5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApXG5cdFx0XHR9LCBoYW5kbGVPYmpJbiApO1xuXG5cdFx0XHQvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdFxuXHRcdFx0aWYgKCAhKCBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdICkgKSB7XG5cdFx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTtcblx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7XG5cblx0XHRcdFx0Ly8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlXG5cdFx0XHRcdGlmICggIXNwZWNpYWwuc2V0dXAgfHxcblx0XHRcdFx0XHRzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0Ly8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7XG5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBlbGVtLmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hdHRhY2hFdmVudCggXCJvblwiICsgdHlwZSwgZXZlbnRIYW5kbGUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzcGVjaWFsLmFkZCApIHtcblx0XHRcdFx0c3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cblx0XHRcdFx0aWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdCwgZGVsZWdhdGVzIGluIGZyb250XG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBldmVyIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvblxuXHRcdFx0alF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBOdWxsaWZ5IGVsZW0gdG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUVcblx0XHRlbGVtID0gbnVsbDtcblx0fSxcblxuXHQvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnRcblx0cmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHtcblx0XHR2YXIgaiwgaGFuZGxlT2JqLCB0bXAsXG5cdFx0XHRvcmlnQ291bnQsIHQsIGV2ZW50cyxcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLFxuXHRcdFx0bmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGpRdWVyeS5oYXNEYXRhKCBlbGVtICkgJiYgalF1ZXJ5Ll9kYXRhKCBlbGVtICk7XG5cblx0XHRpZiAoICFlbGVtRGF0YSB8fCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGVsZXRlIGVsZW1EYXRhLmhhbmRsZTtcblxuXHRcdFx0Ly8gcmVtb3ZlRGF0YSBhbHNvIGNoZWNrcyBmb3IgZW1wdGluZXNzIGFuZCBjbGVhcnMgdGhlIGV4cGFuZG8gaWYgZW1wdHlcblx0XHRcdC8vIHNvIHVzZSBpdCBpbnN0ZWFkIG9mIGRlbGV0ZVxuXHRcdFx0alF1ZXJ5Ll9yZW1vdmVEYXRhKCBlbGVtLCBcImV2ZW50c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkge1xuXHRcdHZhciBoYW5kbGUsIG9udHlwZSwgY3VyLFxuXHRcdFx0YnViYmxlVHlwZSwgc3BlY2lhbCwgdG1wLCBpLFxuXHRcdFx0ZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sXG5cdFx0XHR0eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcInR5cGVcIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LFxuXHRcdFx0bmFtZXNwYWNlcyA9IGhhc093bi5jYWxsKCBldmVudCwgXCJuYW1lc3BhY2VcIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCBcIi5cIiApIDogW107XG5cblx0XHRjdXIgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTtcblx0XHRcdGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7XG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggY3VyICk7XG5cdFx0XHRcdHRtcCA9IGN1cjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pXG5cdFx0XHRpZiAoIHRtcCA9PT0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggY3VyID0gZXZlbnRQYXRoWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRldmVudC50eXBlID0gaSA+IDEgP1xuXHRcdFx0XHRidWJibGVUeXBlIDpcblx0XHRcdFx0c3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBqUXVlcnkgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gKCBqUXVlcnkuX2RhdGEoIGN1ciwgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJlxuXHRcdFx0XHRqUXVlcnkuX2RhdGEoIGN1ciwgXCJoYW5kbGVcIiApO1xuXG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0IHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZVxuXHRcdFx0XHQpICYmIGFjY2VwdERhdGEoIGVsZW0gKVxuXHRcdFx0KSB7XG5cblx0XHRcdFx0Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LlxuXHRcdFx0XHQvLyBDYW4ndCB1c2UgYW4gLmlzRnVuY3Rpb24oKSBjaGVjayBoZXJlIGJlY2F1c2UgSUU2LzcgZmFpbHMgdGhhdCB0ZXN0LlxuXHRcdFx0XHQvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApXG5cdFx0XHRcdGlmICggb250eXBlICYmIGVsZW1bIHR5cGUgXSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSUU8OSBkaWVzIG9uIGZvY3VzL2JsdXIgdG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2LCMxMjUxOClcblx0XHRcdFx0XHRcdC8vIG9ubHkgcmVwcm9kdWNpYmxlIG9uIHdpblhQIElFOCBuYXRpdmUsIG5vdCBJRTkgaW4gSUU4IG1vZGVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApO1xuXG5cdFx0dmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cdFx0XHRoYW5kbGVycyA9ICggalF1ZXJ5Ll9kYXRhKCB0aGlzLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdIHx8IFtdLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307XG5cblx0XHQvLyBVc2UgdGhlIGZpeC1lZCBqUXVlcnkuRXZlbnQgcmF0aGVyIHRoYW4gdGhlIChyZWFkLW9ubHkpIG5hdGl2ZSBldmVudFxuXHRcdGFyZ3NbIDAgXSA9IGV2ZW50O1xuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0gKSAmJlxuXHRcdFx0XHQhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0XHQvLyBUcmlnZ2VyZWQgZXZlbnQgbXVzdCBlaXRoZXIgMSkgaGF2ZSBubyBuYW1lc3BhY2UsIG9yIDIpIGhhdmUgbmFtZXNwYWNlKHMpXG5cdFx0XHRcdC8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLlxuXHRcdFx0XHRpZiAoICFldmVudC5ybmFtZXNwYWNlIHx8IGV2ZW50LnJuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkge1xuXG5cdFx0XHRcdFx0ZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqO1xuXHRcdFx0XHRcdGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTtcblxuXHRcdFx0XHRcdHJldCA9ICggKCBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgaGFuZGxlT2JqLm9yaWdUeXBlIF0gfHwge30gKS5oYW5kbGUgfHxcblx0XHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyICkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdGlmICggKCBldmVudC5yZXN1bHQgPSByZXQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGwgdGhlIHBvc3REaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGVcblx0XHRpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkge1xuXHRcdFx0c3BlY2lhbC5wb3N0RGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQucmVzdWx0O1xuXHR9LFxuXG5cdGhhbmRsZXJzOiBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXJzICkge1xuXHRcdHZhciBpLCBtYXRjaGVzLCBzZWwsIGhhbmRsZU9iaixcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0ZGVsZWdhdGVDb3VudCA9IGhhbmRsZXJzLmRlbGVnYXRlQ291bnQsXG5cdFx0XHRjdXIgPSBldmVudC50YXJnZXQ7XG5cblx0XHQvLyBTdXBwb3J0IChhdCBsZWFzdCk6IENocm9tZSwgSUU5XG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICgjMTMxODApXG5cdFx0Ly9cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94PD00Mitcblx0XHQvLyBBdm9pZCBub24tbGVmdC1jbGljayBpbiBGRiBidXQgZG9uJ3QgYmxvY2sgSUUgcmFkaW8gZXZlbnRzICgjMzg2MSwgZ2gtMjM0Mylcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgJiYgY3VyLm5vZGVUeXBlICYmXG5cdFx0XHQoIGV2ZW50LnR5cGUgIT09IFwiY2xpY2tcIiB8fCBpc05hTiggZXZlbnQuYnV0dG9uICkgfHwgZXZlbnQuYnV0dG9uIDwgMSApICkge1xuXG5cdFx0XHQvKiBqc2hpbnQgZXFlcWVxOiBmYWxzZSAqL1xuXHRcdFx0Zm9yICggOyBjdXIgIT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHtcblx0XHRcdFx0LyoganNoaW50IGVxZXFlcTogdHJ1ZSAqL1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgKCBjdXIuZGlzYWJsZWQgIT09IHRydWUgfHwgZXZlbnQudHlwZSAhPT0gXCJjbGlja1wiICkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlcyA9IFtdO1xuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0Ly8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMylcblx0XHRcdFx0XHRcdHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArIFwiIFwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZXNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4dCA/XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPiAtMSA6XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQoIHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlc1sgc2VsIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZXMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlcy5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVzIH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogdGhpcywgaGFuZGxlcnM6IGhhbmRsZXJzLnNsaWNlKCBkZWxlZ2F0ZUNvdW50ICkgfSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBoYW5kbGVyUXVldWU7XG5cdH0sXG5cblx0Zml4OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0aWYgKCBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSApIHtcblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXNcblx0XHR2YXIgaSwgcHJvcCwgY29weSxcblx0XHRcdHR5cGUgPSBldmVudC50eXBlLFxuXHRcdFx0b3JpZ2luYWxFdmVudCA9IGV2ZW50LFxuXHRcdFx0Zml4SG9vayA9IHRoaXMuZml4SG9va3NbIHR5cGUgXTtcblxuXHRcdGlmICggIWZpeEhvb2sgKSB7XG5cdFx0XHR0aGlzLmZpeEhvb2tzWyB0eXBlIF0gPSBmaXhIb29rID1cblx0XHRcdFx0cm1vdXNlRXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5tb3VzZUhvb2tzIDpcblx0XHRcdFx0cmtleUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMua2V5SG9va3MgOlxuXHRcdFx0XHR7fTtcblx0XHR9XG5cdFx0Y29weSA9IGZpeEhvb2sucHJvcHMgPyB0aGlzLnByb3BzLmNvbmNhdCggZml4SG9vay5wcm9wcyApIDogdGhpcy5wcm9wcztcblxuXHRcdGV2ZW50ID0gbmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXG5cdFx0aSA9IGNvcHkubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0cHJvcCA9IGNvcHlbIGkgXTtcblx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdC8vIEZpeCB0YXJnZXQgcHJvcGVydHkgKCMxOTI1KVxuXHRcdGlmICggIWV2ZW50LnRhcmdldCApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IG9yaWdpbmFsRXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgNi04K1xuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0aWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gRm9yIG1vdXNlL2tleSBldmVudHMsIG1ldGFLZXk9PWZhbHNlIGlmIGl0J3MgdW5kZWZpbmVkICgjMzM2OCwgIzExMzI4KVxuXHRcdGV2ZW50Lm1ldGFLZXkgPSAhIWV2ZW50Lm1ldGFLZXk7XG5cblx0XHRyZXR1cm4gZml4SG9vay5maWx0ZXIgPyBmaXhIb29rLmZpbHRlciggZXZlbnQsIG9yaWdpbmFsRXZlbnQgKSA6IGV2ZW50O1xuXHR9LFxuXG5cdC8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMgc2hhcmVkIGJ5IEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50XG5cdHByb3BzOiAoIFwiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGV0YWlsIGV2ZW50UGhhc2UgXCIgK1xuXHRcdFwibWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaFwiICkuc3BsaXQoIFwiIFwiICksXG5cblx0Zml4SG9va3M6IHt9LFxuXG5cdGtleUhvb2tzOiB7XG5cdFx0cHJvcHM6IFwiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZVwiLnNwbGl0KCBcIiBcIiApLFxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcblxuXHRcdFx0Ly8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzXG5cdFx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgKSB7XG5cdFx0XHRcdGV2ZW50LndoaWNoID0gb3JpZ2luYWwuY2hhckNvZGUgIT0gbnVsbCA/IG9yaWdpbmFsLmNoYXJDb2RlIDogb3JpZ2luYWwua2V5Q29kZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV2ZW50O1xuXHRcdH1cblx0fSxcblxuXHRtb3VzZUhvb2tzOiB7XG5cdFx0cHJvcHM6ICggXCJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIFwiICtcblx0XHRcdFwicGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudFwiICkuc3BsaXQoIFwiIFwiICksXG5cdFx0ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkge1xuXHRcdFx0dmFyIGJvZHksIGV2ZW50RG9jLCBkb2MsXG5cdFx0XHRcdGJ1dHRvbiA9IG9yaWdpbmFsLmJ1dHRvbixcblx0XHRcdFx0ZnJvbUVsZW1lbnQgPSBvcmlnaW5hbC5mcm9tRWxlbWVudDtcblxuXHRcdFx0Ly8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZVxuXHRcdFx0aWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIG9yaWdpbmFsLmNsaWVudFggIT0gbnVsbCApIHtcblx0XHRcdFx0ZXZlbnREb2MgPSBldmVudC50YXJnZXQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcblx0XHRcdFx0ZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0XHRib2R5ID0gZXZlbnREb2MuYm9keTtcblxuXHRcdFx0XHRldmVudC5wYWdlWCA9IG9yaWdpbmFsLmNsaWVudFggK1xuXHRcdFx0XHRcdCggZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDAgKSAtXG5cdFx0XHRcdFx0KCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApO1xuXHRcdFx0XHRldmVudC5wYWdlWSA9IG9yaWdpbmFsLmNsaWVudFkgK1xuXHRcdFx0XHRcdCggZG9jICYmIGRvYy5zY3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtXG5cdFx0XHRcdFx0KCBkb2MgJiYgZG9jLmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5XG5cdFx0XHRpZiAoICFldmVudC5yZWxhdGVkVGFyZ2V0ICYmIGZyb21FbGVtZW50ICkge1xuXHRcdFx0XHRldmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbUVsZW1lbnQgPT09IGV2ZW50LnRhcmdldCA/XG5cdFx0XHRcdFx0b3JpZ2luYWwudG9FbGVtZW50IDpcblx0XHRcdFx0XHRmcm9tRWxlbWVudDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodFxuXHRcdFx0Ly8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXRcblx0XHRcdGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRldmVudC53aGljaCA9ICggYnV0dG9uICYgMSA/IDEgOiAoIGJ1dHRvbiAmIDIgPyAzIDogKCBidXR0b24gJiA0ID8gMiA6IDAgKSApICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGZvY3VzOiB7XG5cblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHR0aGlzLmZvY3VzKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHRcdFx0XHRcdC8vIElmIHdlIGVycm9yIG9uIGZvY3VzIHRvIGhpZGRlbiBlbGVtZW50ICgjMTQ4NiwgIzEyNTE4KSxcblx0XHRcdFx0XHRcdC8vIGxldCAudHJpZ2dlcigpIHJ1biB0aGUgaGFuZGxlcnNcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJpbnB1dFwiICkgJiYgdGhpcy50eXBlID09PSBcImNoZWNrYm94XCIgJiYgdGhpcy5jbGljayApIHtcblx0XHRcdFx0XHR0aGlzLmNsaWNrKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgZG9uJ3QgZmlyZSBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3Ncblx0XHRcdF9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgXCJhXCIgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0YmVmb3JldW5sb2FkOiB7XG5cdFx0XHRwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDIwK1xuXHRcdFx0XHQvLyBGaXJlZm94IGRvZXNuJ3QgYWxlcnQgaWYgdGhlIHJldHVyblZhbHVlIGZpZWxkIGlzIG5vdCBzZXQuXG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZVxuXHRzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkge1xuXHRcdHZhciBlID0galF1ZXJ5LmV4dGVuZChcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoKSxcblx0XHRcdGV2ZW50LFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRpc1NpbXVsYXRlZDogdHJ1ZVxuXG5cdFx0XHRcdC8vIFByZXZpb3VzbHksIGBvcmlnaW5hbEV2ZW50OiB7fWAgd2FzIHNldCBoZXJlLCBzbyBzdG9wUHJvcGFnYXRpb24gY2FsbFxuXHRcdFx0XHQvLyB3b3VsZCBub3QgYmUgdHJpZ2dlcmVkIG9uIGRvbm9yIGV2ZW50LCBzaW5jZSBpbiBvdXIgb3duXG5cdFx0XHRcdC8vIGpRdWVyeS5ldmVudC5zdG9wUHJvcGFnYXRpb24gZnVuY3Rpb24gd2UgaGFkIGEgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZlxuXHRcdFx0XHQvLyBvcmlnaW5hbEV2ZW50LnN0b3BQcm9wYWdhdGlvbiBtZXRob2QsIHNvLCBjb25zZXF1ZW50bHkgaXQgd291bGQgYmUgYSBub29wLlxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBHdWFyZCBmb3Igc2ltdWxhdGVkIGV2ZW50cyB3YXMgbW92ZWQgdG8galF1ZXJ5LmV2ZW50LnN0b3BQcm9wYWdhdGlvbiBmdW5jdGlvblxuXHRcdFx0XHQvLyBzaW5jZSBgb3JpZ2luYWxFdmVudGAgc2hvdWxkIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBldmVudCBmb3IgdGhlXG5cdFx0XHRcdC8vIGNvbnN0YW5jeSB3aXRoIG90aGVyIGV2ZW50cyBhbmQgZm9yIG1vcmUgZm9jdXNlZCBsb2dpY1xuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApO1xuXG5cdFx0aWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5yZW1vdmVFdmVudCA9IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgP1xuXHRmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkge1xuXG5cdFx0Ly8gVGhpcyBcImlmXCIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzXG5cdFx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApO1xuXHRcdH1cblx0fSA6XG5cdGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7XG5cdFx0dmFyIG5hbWUgPSBcIm9uXCIgKyB0eXBlO1xuXG5cdFx0aWYgKCBlbGVtLmRldGFjaEV2ZW50ICkge1xuXG5cdFx0XHQvLyAjODU0NSwgIzcwNTQsIHByZXZlbnRpbmcgbWVtb3J5IGxlYWtzIGZvciBjdXN0b20gZXZlbnRzIGluIElFNi04XG5cdFx0XHQvLyBkZXRhY2hFdmVudCBuZWVkZWQgcHJvcGVydHkgb24gZWxlbWVudCwgYnkgbmFtZSBvZiB0aGF0IGV2ZW50LFxuXHRcdFx0Ly8gdG8gcHJvcGVybHkgZXhwb3NlIGl0IHRvIEdDXG5cdFx0XHRpZiAoIHR5cGVvZiBlbGVtWyBuYW1lIF0gPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRcdGVsZW1bIG5hbWUgXSA9IG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGVsZW0uZGV0YWNoRXZlbnQoIG5hbWUsIGhhbmRsZSApO1xuXHRcdH1cblx0fTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8IDksIEFuZHJvaWQgPCA0LjBcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IGpRdWVyeS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBqUXVlcnkuRXZlbnQsXG5cdGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cdGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblx0XHRpZiAoICFlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHByZXZlbnREZWZhdWx0IGV4aXN0cywgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudFxuXHRcdGlmICggZS5wcmV2ZW50RGVmYXVsdCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0Ly8gT3RoZXJ3aXNlIHNldCB0aGUgcmV0dXJuVmFsdWUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGZhbHNlXG5cdFx0fSBlbHNlIHtcblx0XHRcdGUucmV0dXJuVmFsdWUgPSBmYWxzZTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggIWUgfHwgdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzLCBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50XG5cdFx0aWYgKCBlLnN0b3BQcm9wYWdhdGlvbiApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUVcblx0XHQvLyBTZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZVxuXHRcdGUuY2FuY2VsQnViYmxlID0gdHJ1ZTtcblx0fSxcblx0c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICkge1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG59O1xuXG4vLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3Ncbi8vIHNvIHRoYXQgZXZlbnQgZGVsZWdhdGlvbiB3b3JrcyBpbiBqUXVlcnkuXG4vLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dFxuLy9cbi8vIFN1cHBvcnQ6IFNhZmFyaSA3IG9ubHlcbi8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOlxuLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ3MDI1OFxuLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS5cbmpRdWVyeS5lYWNoKCB7XG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXG5cdG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIixcblx0cG9pbnRlcmVudGVyOiBcInBvaW50ZXJvdmVyXCIsXG5cdHBvaW50ZXJsZWF2ZTogXCJwb2ludGVyb3V0XCJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7XG5cdFx0ZGVsZWdhdGVUeXBlOiBmaXgsXG5cdFx0YmluZFR5cGU6IGZpeCxcblxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJldCxcblx0XHRcdFx0dGFyZ2V0ID0gdGhpcyxcblx0XHRcdFx0cmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajtcblxuXHRcdFx0Ly8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cblx0XHRcdC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG5cdFx0XHRpZiAoICFyZWxhdGVkIHx8ICggcmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwgcmVsYXRlZCApICkgKSB7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7XG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGZpeDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9O1xufSApO1xuXG4vLyBJRSBzdWJtaXQgZGVsZWdhdGlvblxuaWYgKCAhc3VwcG9ydC5zdWJtaXQgKSB7XG5cblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWwuc3VibWl0ID0ge1xuXHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gT25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHNcblx0XHRcdGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImZvcm1cIiApICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExhenktYWRkIGEgc3VibWl0IGhhbmRsZXIgd2hlbiBhIGRlc2NlbmRhbnQgZm9ybSBtYXkgcG90ZW50aWFsbHkgYmUgc3VibWl0dGVkXG5cdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCBcImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdFwiLCBmdW5jdGlvbiggZSApIHtcblxuXHRcdFx0XHQvLyBOb2RlIG5hbWUgY2hlY2sgYXZvaWRzIGEgVk1MLXJlbGF0ZWQgY3Jhc2ggaW4gSUUgKCM5ODA3KVxuXHRcdFx0XHR2YXIgZWxlbSA9IGUudGFyZ2V0LFxuXHRcdFx0XHRcdGZvcm0gPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApIHx8IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJidXR0b25cIiApID9cblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04XG5cdFx0XHRcdFx0XHQvLyBXZSB1c2UgalF1ZXJ5LnByb3AgaW5zdGVhZCBvZiBlbGVtLmZvcm1cblx0XHRcdFx0XHRcdC8vIHRvIGFsbG93IGZpeGluZyB0aGUgSUU4IGRlbGVnYXRlZCBzdWJtaXQgaXNzdWUgKGdoLTIzMzIpXG5cdFx0XHRcdFx0XHQvLyBieSAzcmQgcGFydHkgcG9seWZpbGxzL3dvcmthcm91bmRzLlxuXHRcdFx0XHRcdFx0alF1ZXJ5LnByb3AoIGVsZW0sIFwiZm9ybVwiICkgOlxuXHRcdFx0XHRcdFx0dW5kZWZpbmVkO1xuXG5cdFx0XHRcdGlmICggZm9ybSAmJiAhalF1ZXJ5Ll9kYXRhKCBmb3JtLCBcInN1Ym1pdFwiICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZm9ybSwgXCJzdWJtaXQuX3N1Ym1pdFwiLCBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRldmVudC5fc3VibWl0QnViYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0alF1ZXJ5Ll9kYXRhKCBmb3JtLCBcInN1Ym1pdFwiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblxuXHRcdFx0Ly8gcmV0dXJuIHVuZGVmaW5lZCBzaW5jZSB3ZSBkb24ndCBuZWVkIGFuIGV2ZW50IGxpc3RlbmVyXG5cdFx0fSxcblxuXHRcdHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHQvLyBJZiBmb3JtIHdhcyBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGJ1YmJsZSB0aGUgZXZlbnQgdXAgdGhlIHRyZWVcblx0XHRcdGlmICggZXZlbnQuX3N1Ym1pdEJ1YmJsZSApIHtcblx0XHRcdFx0ZGVsZXRlIGV2ZW50Ll9zdWJtaXRCdWJibGU7XG5cdFx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICYmICFldmVudC5pc1RyaWdnZXIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBcInN1Ym1pdFwiLCB0aGlzLnBhcmVudE5vZGUsIGV2ZW50ICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBPbmx5IG5lZWQgdGhpcyBmb3IgZGVsZWdhdGVkIGZvcm0gc3VibWl0IGV2ZW50c1xuXHRcdFx0aWYgKCBqUXVlcnkubm9kZU5hbWUoIHRoaXMsIFwiZm9ybVwiICkgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIGRlbGVnYXRlZCBoYW5kbGVyczsgY2xlYW5EYXRhIGV2ZW50dWFsbHkgcmVhcHMgc3VibWl0IGhhbmRsZXJzIGF0dGFjaGVkIGFib3ZlXG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCBcIi5fc3VibWl0XCIgKTtcblx0XHR9XG5cdH07XG59XG5cbi8vIElFIGNoYW5nZSBkZWxlZ2F0aW9uIGFuZCBjaGVja2JveC9yYWRpbyBmaXhcbmlmICggIXN1cHBvcnQuY2hhbmdlICkge1xuXG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsLmNoYW5nZSA9IHtcblxuXHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0aWYgKCByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKSApIHtcblxuXHRcdFx0XHQvLyBJRSBkb2Vzbid0IGZpcmUgY2hhbmdlIG9uIGEgY2hlY2svcmFkaW8gdW50aWwgYmx1cjsgdHJpZ2dlciBpdCBvbiBjbGlja1xuXHRcdFx0XHQvLyBhZnRlciBhIHByb3BlcnR5Y2hhbmdlLiBFYXQgdGhlIGJsdXItY2hhbmdlIGluIHNwZWNpYWwuY2hhbmdlLmhhbmRsZS5cblx0XHRcdFx0Ly8gVGhpcyBzdGlsbCBmaXJlcyBvbmNoYW5nZSBhIHNlY29uZCB0aW1lIGZvciBjaGVjay9yYWRpbyBhZnRlciBibHVyLlxuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiIHx8IHRoaXMudHlwZSA9PT0gXCJyYWRpb1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIFwicHJvcGVydHljaGFuZ2UuX2NoYW5nZVwiLCBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lID09PSBcImNoZWNrZWRcIiApIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fanVzdENoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCBcImNsaWNrLl9jaGFuZ2VcIiwgZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLl9qdXN0Q2hhbmdlZCAmJiAhZXZlbnQuaXNUcmlnZ2VyICkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9qdXN0Q2hhbmdlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBBbGxvdyB0cmlnZ2VyZWQsIHNpbXVsYXRlZCBjaGFuZ2UgZXZlbnRzICgjMTE1MDApXG5cdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIFwiY2hhbmdlXCIsIHRoaXMsIGV2ZW50ICk7XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVsZWdhdGVkIGV2ZW50OyBsYXp5LWFkZCBhIGNoYW5nZSBoYW5kbGVyIG9uIGRlc2NlbmRhbnQgaW5wdXRzXG5cdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCBcImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2VcIiwgZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gZS50YXJnZXQ7XG5cblx0XHRcdFx0aWYgKCByZm9ybUVsZW1zLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiAhalF1ZXJ5Ll9kYXRhKCBlbGVtLCBcImNoYW5nZVwiICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZWxlbSwgXCJjaGFuZ2UuX2NoYW5nZVwiLCBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSAmJiAhZXZlbnQuaXNTaW11bGF0ZWQgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHtcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBcImNoYW5nZVwiLCB0aGlzLnBhcmVudE5vZGUsIGV2ZW50ICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdGpRdWVyeS5fZGF0YSggZWxlbSwgXCJjaGFuZ2VcIiwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSxcblxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIGVsZW0gPSBldmVudC50YXJnZXQ7XG5cblx0XHRcdC8vIFN3YWxsb3cgbmF0aXZlIGNoYW5nZSBldmVudHMgZnJvbSBjaGVja2JveC9yYWRpbywgd2UgYWxyZWFkeSB0cmlnZ2VyZWQgdGhlbSBhYm92ZVxuXHRcdFx0aWYgKCB0aGlzICE9PSBlbGVtIHx8IGV2ZW50LmlzU2ltdWxhdGVkIHx8IGV2ZW50LmlzVHJpZ2dlciB8fFxuXHRcdFx0XHQoIGVsZW0udHlwZSAhPT0gXCJyYWRpb1wiICYmIGVsZW0udHlwZSAhPT0gXCJjaGVja2JveFwiICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV2ZW50LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgXCIuX2NoYW5nZVwiICk7XG5cblx0XHRcdHJldHVybiAhcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyBTdXBwb3J0OiBGaXJlZm94XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSwgU2FmYXJpXG4vLyBmb2N1cyhpbiB8IG91dCkgZXZlbnRzIGZpcmUgYWZ0ZXIgZm9jdXMgJiBibHVyIGV2ZW50cyxcbi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlclxuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGpRdWVyeS5fZGF0YSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGpRdWVyeS5fZGF0YSggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0galF1ZXJ5Ll9kYXRhKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGpRdWVyeS5fcmVtb3ZlRGF0YSggZG9jLCBmaXggKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRqUXVlcnkuX2RhdGEoIGRvYywgZml4LCBhdHRhY2hlcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSApO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0b246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHRvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cblx0XHRcdC8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnRcblx0XHRcdGhhbmRsZU9iaiA9IHR5cGVzLmhhbmRsZU9iajtcblx0XHRcdGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoXG5cdFx0XHRcdGhhbmRsZU9iai5uYW1lc3BhY2UgP1xuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xuXHRcdH0gKTtcblx0fSxcblx0dHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBlbGVtID0gdGhpc1sgMCBdO1xuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApO1xuXHRcdH1cblx0fVxufSApO1xuXG5cbnZhciByaW5saW5lalF1ZXJ5ID0gLyBqUXVlcnlcXGQrPVwiKD86bnVsbHxcXGQrKVwiL2csXG5cdHJub3NoaW1jYWNoZSA9IG5ldyBSZWdFeHAoIFwiPCg/OlwiICsgbm9kZU5hbWVzICsgXCIpW1xcXFxzLz5dXCIsIFwiaVwiICksXG5cdHJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcXHc6LV0rKVtePl0qKVxcLz4vZ2ksXG5cblx0Ly8gU3VwcG9ydDogSUUgMTAtMTEsIEVkZ2UgMTAyNDArXG5cdC8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuXG5cdC8vIFNlZSBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzE3MzY1MTIvXG5cdHJub0lubmVyaHRtbCA9IC88c2NyaXB0fDxzdHlsZXw8bGluay9pLFxuXG5cdC8vIGNoZWNrZWQ9XCJjaGVja2VkXCIgb3IgY2hlY2tlZFxuXHRyY2hlY2tlZCA9IC9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksXG5cdHJzY3JpcHRUeXBlTWFza2VkID0gL150cnVlXFwvKC4qKS8sXG5cdHJjbGVhblNjcmlwdCA9IC9eXFxzKjwhKD86XFxbQ0RBVEFcXFt8LS0pfCg/OlxcXVxcXXwtLSk+XFxzKiQvZyxcblx0c2FmZUZyYWdtZW50ID0gY3JlYXRlU2FmZUZyYWdtZW50KCBkb2N1bWVudCApLFxuXHRmcmFnbWVudERpdiA9IHNhZmVGcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cbi8vIFN1cHBvcnQ6IElFPDhcbi8vIE1hbmlwdWxhdGluZyB0YWJsZXMgcmVxdWlyZXMgYSB0Ym9keVxuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdGpRdWVyeS5ub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCBcInRyXCIgKSA/XG5cblx0XHRlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInRib2R5XCIgKVsgMCBdIHx8XG5cdFx0XHRlbGVtLmFwcGVuZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJ0Ym9keVwiICkgKSA6XG5cdFx0ZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKCBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInR5cGVcIiApICE9PSBudWxsICkgKyBcIi9cIiArIGVsZW0udHlwZTtcblx0cmV0dXJuIGVsZW07XG59XG5mdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkge1xuXHR2YXIgbWF0Y2ggPSByc2NyaXB0VHlwZU1hc2tlZC5leGVjKCBlbGVtLnR5cGUgKTtcblx0aWYgKCBtYXRjaCApIHtcblx0XHRlbGVtLnR5cGUgPSBtYXRjaFsgMSBdO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBcInR5cGVcIiApO1xuXHR9XG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgfHwgIWpRdWVyeS5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR2YXIgdHlwZSwgaSwgbCxcblx0XHRvbGREYXRhID0galF1ZXJ5Ll9kYXRhKCBzcmMgKSxcblx0XHRjdXJEYXRhID0galF1ZXJ5Ll9kYXRhKCBkZXN0LCBvbGREYXRhICksXG5cdFx0ZXZlbnRzID0gb2xkRGF0YS5ldmVudHM7XG5cblx0aWYgKCBldmVudHMgKSB7XG5cdFx0ZGVsZXRlIGN1ckRhdGEuaGFuZGxlO1xuXHRcdGN1ckRhdGEuZXZlbnRzID0ge307XG5cblx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gbWFrZSB0aGUgY2xvbmVkIHB1YmxpYyBkYXRhIG9iamVjdCBhIGNvcHkgZnJvbSB0aGUgb3JpZ2luYWxcblx0aWYgKCBjdXJEYXRhLmRhdGEgKSB7XG5cdFx0Y3VyRGF0YS5kYXRhID0galF1ZXJ5LmV4dGVuZCgge30sIGN1ckRhdGEuZGF0YSApO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGZpeENsb25lTm9kZUlzc3Vlcyggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUsIGUsIGRhdGE7XG5cblx0Ly8gV2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIG5vbi1FbGVtZW50c1xuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0bm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gSUU2LTggY29waWVzIGV2ZW50cyBib3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbiB1c2luZyBjbG9uZU5vZGUuXG5cdGlmICggIXN1cHBvcnQubm9DbG9uZUV2ZW50ICYmIGRlc3RbIGpRdWVyeS5leHBhbmRvIF0gKSB7XG5cdFx0ZGF0YSA9IGpRdWVyeS5fZGF0YSggZGVzdCApO1xuXG5cdFx0Zm9yICggZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZGVzdCwgZSwgZGF0YS5oYW5kbGUgKTtcblx0XHR9XG5cblx0XHQvLyBFdmVudCBkYXRhIGdldHMgcmVmZXJlbmNlZCBpbnN0ZWFkIG9mIGNvcGllZCBpZiB0aGUgZXhwYW5kbyBnZXRzIGNvcGllZCB0b29cblx0XHRkZXN0LnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTtcblx0fVxuXG5cdC8vIElFIGJsYW5rcyBjb250ZW50cyB3aGVuIGNsb25pbmcgc2NyaXB0cywgYW5kIHRyaWVzIHRvIGV2YWx1YXRlIG5ld2x5LXNldCB0ZXh0XG5cdGlmICggbm9kZU5hbWUgPT09IFwic2NyaXB0XCIgJiYgZGVzdC50ZXh0ICE9PSBzcmMudGV4dCApIHtcblx0XHRkaXNhYmxlU2NyaXB0KCBkZXN0ICkudGV4dCA9IHNyYy50ZXh0O1xuXHRcdHJlc3RvcmVTY3JpcHQoIGRlc3QgKTtcblxuXHQvLyBJRTYtMTAgaW1wcm9wZXJseSBjbG9uZXMgY2hpbGRyZW4gb2Ygb2JqZWN0IGVsZW1lbnRzIHVzaW5nIGNsYXNzaWQuXG5cdC8vIElFMTAgdGhyb3dzIE5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycm9yIGlmIHBhcmVudCBpcyBudWxsLCAjMTIxMzIuXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcIm9iamVjdFwiICkge1xuXHRcdGlmICggZGVzdC5wYXJlbnROb2RlICkge1xuXHRcdFx0ZGVzdC5vdXRlckhUTUwgPSBzcmMub3V0ZXJIVE1MO1xuXHRcdH1cblxuXHRcdC8vIFRoaXMgcGF0aCBhcHBlYXJzIHVuYXZvaWRhYmxlIGZvciBJRTkuIFdoZW4gY2xvbmluZyBhbiBvYmplY3Rcblx0XHQvLyBlbGVtZW50IGluIElFOSwgdGhlIG91dGVySFRNTCBzdHJhdGVneSBhYm92ZSBpcyBub3Qgc3VmZmljaWVudC5cblx0XHQvLyBJZiB0aGUgc3JjIGhhcyBpbm5lckhUTUwgYW5kIHRoZSBkZXN0aW5hdGlvbiBkb2VzIG5vdCxcblx0XHQvLyBjb3B5IHRoZSBzcmMuaW5uZXJIVE1MIGludG8gdGhlIGRlc3QuaW5uZXJIVE1MLiAjMTAzMjRcblx0XHRpZiAoIHN1cHBvcnQuaHRtbDVDbG9uZSAmJiAoIHNyYy5pbm5lckhUTUwgJiYgIWpRdWVyeS50cmltKCBkZXN0LmlubmVySFRNTCApICkgKSB7XG5cdFx0XHRkZXN0LmlubmVySFRNTCA9IHNyYy5pbm5lckhUTUw7XG5cdFx0fVxuXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHtcblxuXHRcdC8vIElFNi04IGZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3hcblx0XHQvLyBvciByYWRpbyBidXR0b24uIFdvcnNlLCBJRTYtNyBmYWlsIHRvIGdpdmUgdGhlIGNsb25lZCBlbGVtZW50XG5cdFx0Ly8gYSBjaGVja2VkIGFwcGVhcmFuY2UgaWYgdGhlIGRlZmF1bHRDaGVja2VkIHZhbHVlIGlzbid0IGFsc28gc2V0XG5cblx0XHRkZXN0LmRlZmF1bHRDaGVja2VkID0gZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7XG5cblx0XHQvLyBJRTYtNyBnZXQgY29uZnVzZWQgYW5kIGVuZCB1cCBzZXR0aW5nIHRoZSB2YWx1ZSBvZiBhIGNsb25lZFxuXHRcdC8vIGNoZWNrYm94L3JhZGlvIGJ1dHRvbiB0byBhbiBlbXB0eSBzdHJpbmcgaW5zdGVhZCBvZiBcIm9uXCJcblx0XHRpZiAoIGRlc3QudmFsdWUgIT09IHNyYy52YWx1ZSApIHtcblx0XHRcdGRlc3QudmFsdWUgPSBzcmMudmFsdWU7XG5cdFx0fVxuXG5cdC8vIElFNi04IGZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkXG5cdC8vIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcIm9wdGlvblwiICkge1xuXHRcdGRlc3QuZGVmYXVsdFNlbGVjdGVkID0gZGVzdC5zZWxlY3RlZCA9IHNyYy5kZWZhdWx0U2VsZWN0ZWQ7XG5cblx0Ly8gSUU2LTggZmFpbHMgdG8gc2V0IHRoZSBkZWZhdWx0VmFsdWUgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlblxuXHQvLyBjbG9uaW5nIG90aGVyIHR5cGVzIG9mIGlucHV0IGZpZWxkc1xuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgKSB7XG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRvbU1hbmlwKCBjb2xsZWN0aW9uLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApIHtcblxuXHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdGFyZ3MgPSBjb25jYXQuYXBwbHkoIFtdLCBhcmdzICk7XG5cblx0dmFyIGZpcnN0LCBub2RlLCBoYXNTY3JpcHRzLFxuXHRcdHNjcmlwdHMsIGRvYywgZnJhZ21lbnQsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0aXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdC8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdFxuXHRpZiAoIGlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggaXNGdW5jdGlvbiApIHtcblx0XHRcdFx0YXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7XG5cdFx0XHR9XG5cdFx0XHRkb21NYW5pcCggc2VsZiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKTtcblx0XHR9ICk7XG5cdH1cblxuXHRpZiAoIGwgKSB7XG5cdFx0ZnJhZ21lbnQgPSBidWlsZEZyYWdtZW50KCBhcmdzLCBjb2xsZWN0aW9uWyAwIF0ub3duZXJEb2N1bWVudCwgZmFsc2UsIGNvbGxlY3Rpb24sIGlnbm9yZWQgKTtcblx0XHRmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG5cblx0XHRpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0ZnJhZ21lbnQgPSBmaXJzdDtcblx0XHR9XG5cblx0XHQvLyBSZXF1aXJlIGVpdGhlciBuZXcgY29udGVudCBvciBhbiBpbnRlcmVzdCBpbiBpZ25vcmVkIGVsZW1lbnRzIHRvIGludm9rZSB0aGUgY2FsbGJhY2tcblx0XHRpZiAoIGZpcnN0IHx8IGlnbm9yZWQgKSB7XG5cdFx0XHRzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwgXCJzY3JpcHRcIiApLCBkaXNhYmxlU2NyaXB0ICk7XG5cdFx0XHRoYXNTY3JpcHRzID0gc2NyaXB0cy5sZW5ndGg7XG5cblx0XHRcdC8vIFVzZSB0aGUgb3JpZ2luYWwgZnJhZ21lbnQgZm9yIHRoZSBsYXN0IGl0ZW1cblx0XHRcdC8vIGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVuZCB1cFxuXHRcdFx0Ly8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS5cblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0bm9kZSA9IGZyYWdtZW50O1xuXG5cdFx0XHRcdGlmICggaSAhPT0gaU5vQ2xvbmUgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Ly8gS2VlcCByZWZlcmVuY2VzIHRvIGNsb25lZCBzY3JpcHRzIGZvciBsYXRlciByZXN0b3JhdGlvblxuXHRcdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjEsIFBoYW50b21KUzwyXG5cdFx0XHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0ZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDtcblxuXHRcdFx0XHQvLyBSZWVuYWJsZSBzY3JpcHRzXG5cdFx0XHRcdGpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTtcblxuXHRcdFx0XHQvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlwdHMgb24gZmlyc3QgZG9jdW1lbnQgaW5zZXJ0aW9uXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkge1xuXHRcdFx0XHRcdG5vZGUgPSBzY3JpcHRzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgXCJcIiApICYmXG5cdFx0XHRcdFx0XHQhalF1ZXJ5Ll9kYXRhKCBub2RlLCBcImdsb2JhbEV2YWxcIiApICYmXG5cdFx0XHRcdFx0XHRqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIG5vZGUuc3JjICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoXG5cdFx0XHRcdFx0XHRcdFx0KCBub2RlLnRleHQgfHwgbm9kZS50ZXh0Q29udGVudCB8fCBub2RlLmlubmVySFRNTCB8fCBcIlwiIClcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBGaXggIzExODA5OiBBdm9pZCBsZWFraW5nIG1lbW9yeVxuXHRcdFx0ZnJhZ21lbnQgPSBmaXJzdCA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRlbGVtcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBlbGVtc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXG5cdFx0aWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggbm9kZSApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBub2RlLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7XG5cdFx0XHRcdHNldEdsb2JhbEV2YWwoIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHR9XG5cdFx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRodG1sUHJlZmlsdGVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRyZXR1cm4gaHRtbC5yZXBsYWNlKCByeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIgKTtcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdHZhciBkZXN0RWxlbWVudHMsIG5vZGUsIGNsb25lLCBpLCBzcmNFbGVtZW50cyxcblx0XHRcdGluUGFnZSA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHRpZiAoIHN1cHBvcnQuaHRtbDVDbG9uZSB8fCBqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSB8fFxuXHRcdFx0IXJub3NoaW1jYWNoZS50ZXN0KCBcIjxcIiArIGVsZW0ubm9kZU5hbWUgKyBcIj5cIiApICkge1xuXG5cdFx0XHRjbG9uZSA9IGVsZW0uY2xvbmVOb2RlKCB0cnVlICk7XG5cblx0XHQvLyBJRTw9OCBkb2VzIG5vdCBwcm9wZXJseSBjbG9uZSBkZXRhY2hlZCwgdW5rbm93biBlbGVtZW50IG5vZGVzXG5cdFx0fSBlbHNlIHtcblx0XHRcdGZyYWdtZW50RGl2LmlubmVySFRNTCA9IGVsZW0ub3V0ZXJIVE1MO1xuXHRcdFx0ZnJhZ21lbnREaXYucmVtb3ZlQ2hpbGQoIGNsb25lID0gZnJhZ21lbnREaXYuZmlyc3RDaGlsZCApO1xuXHRcdH1cblxuXHRcdGlmICggKCAhc3VwcG9ydC5ub0Nsb25lRXZlbnQgfHwgIXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgKSAmJlxuXHRcdFx0XHQoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAmJiAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0cDovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHQvLyBGaXggYWxsIElFIGNsb25pbmcgaXNzdWVzXG5cdFx0XHRmb3IgKCBpID0gMDsgKCBub2RlID0gc3JjRWxlbWVudHNbIGkgXSApICE9IG51bGw7ICsraSApIHtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gbm9kZSBpcyBub3QgbnVsbDsgRml4ZXMgIzk1ODdcblx0XHRcdFx0aWYgKCBkZXN0RWxlbWVudHNbIGkgXSApIHtcblx0XHRcdFx0XHRmaXhDbG9uZU5vZGVJc3N1ZXMoIG5vZGUsIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lXG5cdFx0aWYgKCBkYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0aWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdFx0c3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTtcblx0XHRcdFx0ZGVzdEVsZW1lbnRzID0gZGVzdEVsZW1lbnRzIHx8IGdldEFsbCggY2xvbmUgKTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgKCBub2RlID0gc3JjRWxlbWVudHNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdFx0XHRjbG9uZUNvcHlFdmVudCggbm9kZSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsIFwic2NyaXB0XCIgKTtcblx0XHRpZiAoIGRlc3RFbGVtZW50cy5sZW5ndGggPiAwICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0fVxuXG5cdFx0ZGVzdEVsZW1lbnRzID0gc3JjRWxlbWVudHMgPSBub2RlID0gbnVsbDtcblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcywgLyogaW50ZXJuYWwgKi8gZm9yY2VBY2NlcHREYXRhICkge1xuXHRcdHZhciBlbGVtLCB0eXBlLCBpZCwgZGF0YSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0aW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbyxcblx0XHRcdGNhY2hlID0galF1ZXJ5LmNhY2hlLFxuXHRcdFx0YXR0cmlidXRlcyA9IHN1cHBvcnQuYXR0cmlidXRlcyxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZm9yY2VBY2NlcHREYXRhIHx8IGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblxuXHRcdFx0XHRpZCA9IGVsZW1bIGludGVybmFsS2V5IF07XG5cdFx0XHRcdGRhdGEgPSBpZCAmJiBjYWNoZVsgaWQgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGNhY2hlIG9ubHkgaWYgaXQgd2FzIG5vdCBhbHJlYWR5IHJlbW92ZWQgYnkgalF1ZXJ5LmV2ZW50LnJlbW92ZVxuXHRcdFx0XHRcdGlmICggY2FjaGVbIGlkIF0gKSB7XG5cblx0XHRcdFx0XHRcdGRlbGV0ZSBjYWNoZVsgaWQgXTtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdFx0XHRcdFx0Ly8gSUUgZG9lcyBub3QgYWxsb3cgdXMgdG8gZGVsZXRlIGV4cGFuZG8gcHJvcGVydGllcyBmcm9tIG5vZGVzXG5cdFx0XHRcdFx0XHQvLyBJRSBjcmVhdGVzIGV4cGFuZG8gYXR0cmlidXRlcyBhbG9uZyB3aXRoIHRoZSBwcm9wZXJ0eVxuXHRcdFx0XHRcdFx0Ly8gSUUgZG9lcyBub3QgaGF2ZSBhIHJlbW92ZUF0dHJpYnV0ZSBmdW5jdGlvbiBvbiBEb2N1bWVudCBub2Rlc1xuXHRcdFx0XHRcdFx0aWYgKCAhYXR0cmlidXRlcyAmJiB0eXBlb2YgZWxlbS5yZW1vdmVBdHRyaWJ1dGUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBpbnRlcm5hbEtleSApO1xuXG5cdFx0XHRcdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0XHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM3ODYwN1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0ZWxlbVsgaW50ZXJuYWxLZXkgXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0ZGVsZXRlZElkcy5wdXNoKCBpZCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gS2VlcCBkb21NYW5pcCBleHBvc2VkIHVudGlsIDMuMCAoZ2gtMjIyNSlcblx0ZG9tTWFuaXA6IGRvbU1hbmlwLFxuXG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZChcblx0XHRcdFx0XHQoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApLmNyZWF0ZVRleHROb2RlKCB2YWx1ZSApXG5cdFx0XHRcdCk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRhcHBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRwcmVwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0YXJnZXQuZmlyc3RDaGlsZCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRiZWZvcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGFmdGVyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzXG5cdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApIHtcblx0XHRcdFx0ZWxlbS5yZW1vdmVDaGlsZCggZWxlbS5maXJzdENoaWxkICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBzZWxlY3QsIGVuc3VyZSB0aGF0IGl0IGRpc3BsYXlzIGVtcHR5ICgjMTIzMzYpXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0XHRpZiAoIGVsZW0ub3B0aW9ucyAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwic2VsZWN0XCIgKSApIHtcblx0XHRcdFx0ZWxlbS5vcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzO1xuXHRcdGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50cztcblxuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApO1xuXHRcdH0gKTtcblx0fSxcblxuXHRodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgP1xuXHRcdFx0XHRcdGVsZW0uaW5uZXJIVE1MLnJlcGxhY2UoIHJpbmxpbmVqUXVlcnksIFwiXCIgKSA6XG5cdFx0XHRcdFx0dW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiZcblx0XHRcdFx0KCBzdXBwb3J0Lmh0bWxTZXJpYWxpemUgfHwgIXJub3NoaW1jYWNoZS50ZXN0KCB2YWx1ZSApICApICYmXG5cdFx0XHRcdCggc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSB8fCAhcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIHZhbHVlICkgKSAmJlxuXHRcdFx0XHQhd3JhcE1hcFsgKCBydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7XG5cblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuaHRtbFByZWZpbHRlciggdmFsdWUgKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdIHx8IHt9O1xuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblx0XHRcdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtID0gMDtcblxuXHRcdFx0XHQvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2Rcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7XG5cdFx0XHR9XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRyZXBsYWNlV2l0aDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlnbm9yZWQgPSBbXTtcblxuXHRcdC8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIG5vbi1pZ25vcmVkIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudFxuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG5cblx0XHRcdGlmICggalF1ZXJ5LmluQXJyYXkoIHRoaXMsIGlnbm9yZWQgKSA8IDAgKSB7XG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggdGhpcyApICk7XG5cdFx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRcdHBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gRm9yY2UgY2FsbGJhY2sgaW52b2NhdGlvblxuXHRcdH0sIGlnbm9yZWQgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCgge1xuXHRhcHBlbmRUbzogXCJhcHBlbmRcIixcblx0cHJlcGVuZFRvOiBcInByZXBlbmRcIixcblx0aW5zZXJ0QmVmb3JlOiBcImJlZm9yZVwiLFxuXHRpbnNlcnRBZnRlcjogXCJhZnRlclwiLFxuXHRyZXBsYWNlQWxsOiBcInJlcGxhY2VXaXRoXCJcbn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGVsZW1zLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMTtcblxuXHRcdGZvciAoIDsgaSA8PSBsYXN0OyBpKysgKSB7XG5cdFx0XHRlbGVtcyA9IGkgPT09IGxhc3QgPyB0aGlzIDogdGhpcy5jbG9uZSggdHJ1ZSApO1xuXHRcdFx0alF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApO1xuXG5cdFx0XHQvLyBNb2Rlcm4gYnJvd3NlcnMgY2FuIGFwcGx5IGpRdWVyeSBjb2xsZWN0aW9ucyBhcyBhcnJheXMsIGJ1dCBvbGRJRSBuZWVkcyBhIC5nZXQoKVxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG5cblxudmFyIGlmcmFtZSxcblx0ZWxlbWRpc3BsYXkgPSB7XG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94XG5cdFx0Ly8gV2UgaGF2ZSB0byBwcmUtZGVmaW5lIHRoZXNlIHZhbHVlcyBmb3IgRkYgKCMxMDIyNylcblx0XHRIVE1MOiBcImJsb2NrXCIsXG5cdFx0Qk9EWTogXCJibG9ja1wiXG5cdH07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGFjdHVhbCBkaXNwbGF5IG9mIGEgZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBkb2MgRG9jdW1lbnQgb2JqZWN0XG4gKi9cblxuLy8gQ2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gZGVmYXVsdERpc3BsYXlcbmZ1bmN0aW9uIGFjdHVhbERpc3BsYXkoIG5hbWUsIGRvYyApIHtcblx0dmFyIGVsZW0gPSBqUXVlcnkoIGRvYy5jcmVhdGVFbGVtZW50KCBuYW1lICkgKS5hcHBlbmRUbyggZG9jLmJvZHkgKSxcblxuXHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtWyAwIF0sIFwiZGlzcGxheVwiICk7XG5cblx0Ly8gV2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSBzdG9yZWQgb24gdGhlIGVsZW1lbnQsXG5cdC8vIHNvIHVzZSBcImRldGFjaFwiIG1ldGhvZCBhcyBmYXN0IHdheSB0byBnZXQgcmlkIG9mIHRoZSBlbGVtZW50XG5cdGVsZW0uZGV0YWNoKCk7XG5cblx0cmV0dXJuIGRpc3BsYXk7XG59XG5cbi8qKlxuICogVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVlIG9mIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBub2RlTmFtZVxuICovXG5mdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7XG5cdHZhciBkb2MgPSBkb2N1bWVudCxcblx0XHRkaXNwbGF5ID0gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07XG5cblx0aWYgKCAhZGlzcGxheSApIHtcblx0XHRkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApO1xuXG5cdFx0Ly8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMsIHJlYWQgZnJvbSBpbnNpZGUgYW4gaWZyYW1lXG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiB8fCAhZGlzcGxheSApIHtcblxuXHRcdFx0Ly8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgaWZyYW1lIGlmIHBvc3NpYmxlXG5cdFx0XHRpZnJhbWUgPSAoIGlmcmFtZSB8fCBqUXVlcnkoIFwiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPlwiICkgKVxuXHRcdFx0XHQuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVsZW1lbnQgKTtcblxuXHRcdFx0Ly8gQWx3YXlzIHdyaXRlIGEgbmV3IEhUTUwgc2tlbGV0b24gc28gV2Via2l0IGFuZCBGaXJlZm94IGRvbid0IGNob2tlIG9uIHJldXNlXG5cdFx0XHRkb2MgPSAoIGlmcmFtZVsgMCBdLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lWyAwIF0uY29udGVudERvY3VtZW50ICkuZG9jdW1lbnQ7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0XHRkb2Mud3JpdGUoKTtcblx0XHRcdGRvYy5jbG9zZSgpO1xuXG5cdFx0XHRkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApO1xuXHRcdFx0aWZyYW1lLmRldGFjaCgpO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheVxuXHRcdGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTtcblx0fVxuXG5cdHJldHVybiBkaXNwbGF5O1xufVxudmFyIHJtYXJnaW4gPSAoIC9ebWFyZ2luLyApO1xuXG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBwaXhlbFBvc2l0aW9uVmFsLCBwaXhlbE1hcmdpblJpZ2h0VmFsLCBib3hTaXppbmdSZWxpYWJsZVZhbCxcblx0XHRyZWxpYWJsZUhpZGRlbk9mZnNldHNWYWwsIHJlbGlhYmxlTWFyZ2luUmlnaHRWYWwsIHJlbGlhYmxlTWFyZ2luTGVmdFZhbCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdC8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRkaXYuc3R5bGUuY3NzVGV4dCA9IFwiZmxvYXQ6bGVmdDtvcGFjaXR5Oi41XCI7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHQvLyBNYWtlIHN1cmUgdGhhdCBlbGVtZW50IG9wYWNpdHkgZXhpc3RzIChhcyBvcHBvc2VkIHRvIGZpbHRlcilcblx0c3VwcG9ydC5vcGFjaXR5ID0gZGl2LnN0eWxlLm9wYWNpdHkgPT09IFwiMC41XCI7XG5cblx0Ly8gVmVyaWZ5IHN0eWxlIGZsb2F0IGV4aXN0ZW5jZVxuXHQvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpXG5cdHN1cHBvcnQuY3NzRmxvYXQgPSAhIWRpdi5zdHlsZS5jc3NGbG9hdDtcblxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwiYm9yZGVyOjA7d2lkdGg6OHB4O2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweDtcIiArXG5cdFx0XCJwYWRkaW5nOjA7bWFyZ2luLXRvcDoxcHg7cG9zaXRpb246YWJzb2x1dGVcIjtcblx0ZGl2LmlubmVySFRNTCA9IFwiXCI7XG5cdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0Ly8gU3VwcG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAyLjNcblx0Ly8gVmVuZG9yLXByZWZpeCBib3gtc2l6aW5nXG5cdHN1cHBvcnQuYm94U2l6aW5nID0gZGl2LnN0eWxlLmJveFNpemluZyA9PT0gXCJcIiB8fCBkaXYuc3R5bGUuTW96Qm94U2l6aW5nID09PSBcIlwiIHx8XG5cdFx0ZGl2LnN0eWxlLldlYmtpdEJveFNpemluZyA9PT0gXCJcIjtcblxuXHRqUXVlcnkuZXh0ZW5kKCBzdXBwb3J0LCB7XG5cdFx0cmVsaWFibGVIaWRkZW5PZmZzZXRzOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggcGl4ZWxQb3NpdGlvblZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlbGlhYmxlSGlkZGVuT2Zmc2V0c1ZhbDtcblx0XHR9LFxuXG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBXZSdyZSBjaGVja2luZyBmb3IgcGl4ZWxQb3NpdGlvblZhbCBoZXJlIGluc3RlYWQgb2YgYm94U2l6aW5nUmVsaWFibGVWYWxcblx0XHRcdC8vIHNpbmNlIHRoYXQgY29tcHJlc3NlcyBiZXR0ZXIgYW5kIHRoZXkncmUgY29tcHV0ZWQgdG9nZXRoZXIgYW55d2F5LlxuXHRcdFx0aWYgKCBwaXhlbFBvc2l0aW9uVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYm94U2l6aW5nUmVsaWFibGVWYWw7XG5cdFx0fSxcblxuXHRcdHBpeGVsTWFyZ2luUmlnaHQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMC00LjNcblx0XHRcdGlmICggcGl4ZWxQb3NpdGlvblZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHBpeGVsTWFyZ2luUmlnaHRWYWw7XG5cdFx0fSxcblxuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBwaXhlbFBvc2l0aW9uVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcGl4ZWxQb3NpdGlvblZhbDtcblx0XHR9LFxuXG5cdFx0cmVsaWFibGVNYXJnaW5SaWdodDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0XHRpZiAoIHBpeGVsUG9zaXRpb25WYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZWxpYWJsZU1hcmdpblJpZ2h0VmFsO1xuXHRcdH0sXG5cblx0XHRyZWxpYWJsZU1hcmdpbkxlZnQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggb25seSwgQW5kcm9pZCA0LjAgLSA0LjMgb25seSwgRmlyZWZveCA8PTMgLSAzN1xuXHRcdFx0aWYgKCBwaXhlbFBvc2l0aW9uVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH1cblx0fSApO1xuXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXHRcdHZhciBjb250ZW50cywgZGl2U3R5bGUsXG5cdFx0XHRkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHQvLyBTZXR1cFxuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHRkaXYuc3R5bGUuY3NzVGV4dCA9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0XHQvLyBWZW5kb3ItcHJlZml4IGJveC1zaXppbmdcblx0XHRcdFwiLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O1wiICtcblx0XHRcdFwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztcIiArXG5cdFx0XHRcIm1hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7XCIgK1xuXHRcdFx0XCJ0b3A6MSU7d2lkdGg6NTAlXCI7XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gQXNzdW1lIHJlYXNvbmFibGUgdmFsdWVzIGluIHRoZSBhYnNlbmNlIG9mIGdldENvbXB1dGVkU3R5bGVcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gYm94U2l6aW5nUmVsaWFibGVWYWwgPSByZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSBmYWxzZTtcblx0XHRwaXhlbE1hcmdpblJpZ2h0VmFsID0gcmVsaWFibGVNYXJnaW5SaWdodFZhbCA9IHRydWU7XG5cblx0XHQvLyBDaGVjayBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzbyB0aGF0IHRoaXMgY29kZSBpcyBub3QgcnVuIGluIElFPDkuXG5cdFx0aWYgKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSApIHtcblx0XHRcdGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdFx0cGl4ZWxQb3NpdGlvblZhbCA9ICggZGl2U3R5bGUgfHwge30gKS50b3AgIT09IFwiMSVcIjtcblx0XHRcdHJlbGlhYmxlTWFyZ2luTGVmdFZhbCA9ICggZGl2U3R5bGUgfHwge30gKS5tYXJnaW5MZWZ0ID09PSBcIjJweFwiO1xuXHRcdFx0Ym94U2l6aW5nUmVsaWFibGVWYWwgPSAoIGRpdlN0eWxlIHx8IHsgd2lkdGg6IFwiNHB4XCIgfSApLndpZHRoID09PSBcIjRweFwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdFx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRcdGRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IFwiNTAlXCI7XG5cdFx0XHRwaXhlbE1hcmdpblJpZ2h0VmFsID0gKCBkaXZTdHlsZSB8fCB7IG1hcmdpblJpZ2h0OiBcIjRweFwiIH0gKS5tYXJnaW5SaWdodCA9PT0gXCI0cHhcIjtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjMgb25seVxuXHRcdFx0Ly8gRGl2IHdpdGggZXhwbGljaXQgd2lkdGggYW5kIG5vIG1hcmdpbi1yaWdodCBpbmNvcnJlY3RseVxuXHRcdFx0Ly8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyICgjMzMzMylcblx0XHRcdC8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodFxuXHRcdFx0Y29udGVudHMgPSBkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHQvLyBSZXNldCBDU1M6IGJveC1zaXppbmc7IGRpc3BsYXk7IG1hcmdpbjsgYm9yZGVyOyBwYWRkaW5nXG5cdFx0XHRjb250ZW50cy5zdHlsZS5jc3NUZXh0ID0gZGl2LnN0eWxlLmNzc1RleHQgPVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0XHRcdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRcdFx0XHRcIi13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7XCIgK1xuXHRcdFx0XHRcImJveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjBcIjtcblx0XHRcdGNvbnRlbnRzLnN0eWxlLm1hcmdpblJpZ2h0ID0gY29udGVudHMuc3R5bGUud2lkdGggPSBcIjBcIjtcblx0XHRcdGRpdi5zdHlsZS53aWR0aCA9IFwiMXB4XCI7XG5cblx0XHRcdHJlbGlhYmxlTWFyZ2luUmlnaHRWYWwgPVxuXHRcdFx0XHQhcGFyc2VGbG9hdCggKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggY29udGVudHMgKSB8fCB7fSApLm1hcmdpblJpZ2h0ICk7XG5cblx0XHRcdGRpdi5yZW1vdmVDaGlsZCggY29udGVudHMgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRTYtOFxuXHRcdC8vIEZpcnN0IGNoZWNrIHRoYXQgZ2V0Q2xpZW50UmVjdHMgd29ya3MgYXMgZXhwZWN0ZWRcblx0XHQvLyBDaGVjayBpZiB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodCB3aGVuIHRoZXkgYXJlIHNldFxuXHRcdC8vIHRvIGRpc3BsYXk6bm9uZSBhbmQgdGhlcmUgYXJlIHN0aWxsIG90aGVyIHZpc2libGUgdGFibGUgY2VsbHMgaW4gYVxuXHRcdC8vIHRhYmxlIHJvdzsgaWYgc28sIG9mZnNldFdpZHRoL0hlaWdodCBhcmUgbm90IHJlbGlhYmxlIGZvciB1c2Ugd2hlblxuXHRcdC8vIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaGFzIGJlZW4gaGlkZGVuIGRpcmVjdGx5IHVzaW5nXG5cdFx0Ly8gZGlzcGxheTpub25lIChpdCBpcyBzdGlsbCBzYWZlIHRvIHVzZSBvZmZzZXRzIGlmIGEgcGFyZW50IGVsZW1lbnQgaXNcblx0XHQvLyBoaWRkZW47IGRvbiBzYWZldHkgZ29nZ2xlcyBhbmQgc2VlIGJ1ZyAjNDUxMiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuXG5cdFx0ZGl2LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0XHRyZWxpYWJsZUhpZGRlbk9mZnNldHNWYWwgPSBkaXYuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPT09IDA7XG5cdFx0aWYgKCByZWxpYWJsZUhpZGRlbk9mZnNldHNWYWwgKSB7XG5cdFx0XHRkaXYuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRkaXYuaW5uZXJIVE1MID0gXCI8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+XCI7XG5cdFx0XHRkaXYuY2hpbGROb2Rlc1sgMCBdLnN0eWxlLmJvcmRlckNvbGxhcHNlID0gXCJzZXBhcmF0ZVwiO1xuXHRcdFx0Y29udGVudHMgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwidGRcIiApO1xuXHRcdFx0Y29udGVudHNbIDAgXS5zdHlsZS5jc3NUZXh0ID0gXCJtYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjA7ZGlzcGxheTpub25lXCI7XG5cdFx0XHRyZWxpYWJsZUhpZGRlbk9mZnNldHNWYWwgPSBjb250ZW50c1sgMCBdLm9mZnNldEhlaWdodCA9PT0gMDtcblx0XHRcdGlmICggcmVsaWFibGVIaWRkZW5PZmZzZXRzVmFsICkge1xuXHRcdFx0XHRjb250ZW50c1sgMCBdLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0XHRjb250ZW50c1sgMSBdLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0XHRcdFx0cmVsaWFibGVIaWRkZW5PZmZzZXRzVmFsID0gY29udGVudHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVGVhcmRvd25cblx0XHRkb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xuXHR9XG5cbn0gKSgpO1xuXG5cbnZhciBnZXRTdHlsZXMsIGN1ckNTUyxcblx0cnBvc2l0aW9uID0gL14odG9wfHJpZ2h0fGJvdHRvbXxsZWZ0KSQvO1xuXG5pZiAoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICkge1xuXHRnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFPD0xMSssIEZpcmVmb3g8PTMwKyAoIzE1MDk4LCAjMTQxNTApXG5cdFx0Ly8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzXG5cdFx0Ly8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoIFwiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZVwiXG5cdFx0dmFyIHZpZXcgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cblx0XHRpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHtcblx0XHRcdHZpZXcgPSB3aW5kb3c7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuXHR9O1xuXG5cdGN1ckNTUyA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0XHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXHRcdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdFx0Y29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTtcblxuXHRcdC8vIGdldFByb3BlcnR5VmFsdWUgaXMgb25seSBuZWVkZWQgZm9yIC5jc3MoJ2ZpbHRlcicpIGluIElFOSwgc2VlICMxMjUzN1xuXHRcdHJldCA9IGNvbXB1dGVkID8gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF0gOiB1bmRlZmluZWQ7XG5cblx0XHQvLyBTdXBwb3J0OiBPcGVyYSAxMi4xeCBvbmx5XG5cdFx0Ly8gRmFsbCBiYWNrIHRvIHN0eWxlIGV2ZW4gd2l0aG91dCBjb21wdXRlZFxuXHRcdC8vIGNvbXB1dGVkIGlzIHVuZGVmaW5lZCBmb3IgZWxlbXMgb24gZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0aWYgKCAoIHJldCA9PT0gXCJcIiB8fCByZXQgPT09IHVuZGVmaW5lZCApICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkge1xuXHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0Ly8gQSB0cmlidXRlIHRvIHRoZSBcImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcIlxuXHRcdFx0Ly8gQ2hyb21lIDwgMTcgYW5kIFNhZmFyaSA1LjAgdXNlcyBcImNvbXB1dGVkIHZhbHVlXCJcblx0XHRcdC8vIGluc3RlYWQgb2YgXCJ1c2VkIHZhbHVlXCIgZm9yIG1hcmdpbi1yaWdodFxuXHRcdFx0Ly8gU2FmYXJpIDUuMS43IChhdCBsZWFzdCkgcmV0dXJucyBwZXJjZW50YWdlIGZvciBhIGxhcmdlciBzZXQgb2YgdmFsdWVzLFxuXHRcdFx0Ly8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVsc1xuXHRcdFx0Ly8gdGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOlxuXHRcdFx0Ly8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5waXhlbE1hcmdpblJpZ2h0KCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJtYXJnaW4udGVzdCggbmFtZSApICkge1xuXG5cdFx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdFx0bWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDtcblx0XHRcdFx0bWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDtcblxuXHRcdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcblx0XHRcdFx0cmV0ID0gY29tcHV0ZWQud2lkdGg7XG5cblx0XHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0XHRzdHlsZS53aWR0aCA9IHdpZHRoO1xuXHRcdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xuXHRcdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXR1cm4gcmV0ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0cmV0IDpcblx0XHRcdHJldCArIFwiXCI7XG5cdH07XG59IGVsc2UgaWYgKCBkb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlICkge1xuXHRnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5jdXJyZW50U3R5bGU7XG5cdH07XG5cblx0Y3VyQ1NTID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHRcdHZhciBsZWZ0LCBycywgcnNMZWZ0LCByZXQsXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHRjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdHJldCA9IGNvbXB1dGVkID8gY29tcHV0ZWRbIG5hbWUgXSA6IHVuZGVmaW5lZDtcblxuXHRcdC8vIEF2b2lkIHNldHRpbmcgcmV0IHRvIGVtcHR5IHN0cmluZyBoZXJlXG5cdFx0Ly8gc28gd2UgZG9uJ3QgZGVmYXVsdCB0byBhdXRvXG5cdFx0aWYgKCByZXQgPT0gbnVsbCAmJiBzdHlsZSAmJiBzdHlsZVsgbmFtZSBdICkge1xuXHRcdFx0cmV0ID0gc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXG5cdFx0Ly8gaHR0cDovL2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MVxuXG5cdFx0Ly8gSWYgd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIHJlZ3VsYXIgcGl4ZWwgbnVtYmVyXG5cdFx0Ly8gYnV0IGEgbnVtYmVyIHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5nLCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxzXG5cdFx0Ly8gYnV0IG5vdCBwb3NpdGlvbiBjc3MgYXR0cmlidXRlcywgYXMgdGhvc2UgYXJlXG5cdFx0Ly8gcHJvcG9ydGlvbmFsIHRvIHRoZSBwYXJlbnQgZWxlbWVudCBpbnN0ZWFkXG5cdFx0Ly8gYW5kIHdlIGNhbid0IG1lYXN1cmUgdGhlIHBhcmVudCBpbnN0ZWFkIGJlY2F1c2UgaXRcblx0XHQvLyBtaWdodCB0cmlnZ2VyIGEgXCJzdGFja2luZyBkb2xsc1wiIHByb2JsZW1cblx0XHRpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiAhcnBvc2l0aW9uLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0bGVmdCA9IHN0eWxlLmxlZnQ7XG5cdFx0XHRycyA9IGVsZW0ucnVudGltZVN0eWxlO1xuXHRcdFx0cnNMZWZ0ID0gcnMgJiYgcnMubGVmdDtcblxuXHRcdFx0Ly8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXHRcdFx0aWYgKCByc0xlZnQgKSB7XG5cdFx0XHRcdHJzLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0O1xuXHRcdFx0fVxuXHRcdFx0c3R5bGUubGVmdCA9IG5hbWUgPT09IFwiZm9udFNpemVcIiA/IFwiMWVtXCIgOiByZXQ7XG5cdFx0XHRyZXQgPSBzdHlsZS5waXhlbExlZnQgKyBcInB4XCI7XG5cblx0XHRcdC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcblx0XHRcdHN0eWxlLmxlZnQgPSBsZWZ0O1xuXHRcdFx0aWYgKCByc0xlZnQgKSB7XG5cdFx0XHRcdHJzLmxlZnQgPSByc0xlZnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUVcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldHVybiByZXQgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRyZXQgOlxuXHRcdFx0cmV0ICsgXCJcIiB8fCBcImF1dG9cIjtcblx0fTtcbn1cblxuXG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblxuXHRcdFx0XHQvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWVcblx0XHRcdFx0Ly8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRkZWxldGUgdGhpcy5nZXQ7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uXG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldCA9IGhvb2tGbiApLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxudmFyXG5cblx0XHRyYWxwaGEgPSAvYWxwaGFcXChbXildKlxcKS9pLFxuXHRyb3BhY2l0eSA9IC9vcGFjaXR5XFxzKj1cXHMqKFteKV0qKS9pLFxuXG5cdC8vIHN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUgZXhjZXB0XG5cdC8vIFwidGFibGVcIiwgXCJ0YWJsZS1jZWxsXCIsIG9yIFwidGFibGUtY2FwdGlvblwiXG5cdC8vIHNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczpcblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheVxuXHRyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sXG5cdHJudW1zcGxpdCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoLiopJFwiLCBcImlcIiApLFxuXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9LFxuXG5cdGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk9cIiwgXCJNb3pcIiwgXCJtc1wiIF0sXG5cdGVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkuc3R5bGU7XG5cblxuLy8gcmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxuZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB7XG5cblx0Ly8gc2hvcnRjdXQgZm9yIG5hbWVzIHRoYXQgYXJlIG5vdCB2ZW5kb3IgcHJlZml4ZWRcblx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblxuXHQvLyBjaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZS5jaGFyQXQoIDAgKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSggMSApLFxuXHRcdGkgPSBjc3NQcmVmaXhlcy5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0bmFtZSA9IGNzc1ByZWZpeGVzWyBpIF0gKyBjYXBOYW1lO1xuXHRcdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdFx0cmV0dXJuIG5hbWU7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHNob3dIaWRlKCBlbGVtZW50cywgc2hvdyApIHtcblx0dmFyIGRpc3BsYXksIGVsZW0sIGhpZGRlbixcblx0XHR2YWx1ZXMgPSBbXSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHR2YWx1ZXNbIGluZGV4IF0gPSBqUXVlcnkuX2RhdGEoIGVsZW0sIFwib2xkZGlzcGxheVwiICk7XG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cblx0XHRcdC8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXNcblx0XHRcdC8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxlcyBvciBub3Rcblx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGVsZW1lbnRzIHdoaWNoIGhhdmUgYmVlbiBvdmVycmlkZGVuIHdpdGggZGlzcGxheTogbm9uZVxuXHRcdFx0Ly8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXNcblx0XHRcdC8vIGZvciBzdWNoIGFuIGVsZW1lbnRcblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuKCBlbGVtICkgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9XG5cdFx0XHRcdFx0alF1ZXJ5Ll9kYXRhKCBlbGVtLCBcIm9sZGRpc3BsYXlcIiwgZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRoaWRkZW4gPSBpc0hpZGRlbiggZWxlbSApO1xuXG5cdFx0XHRpZiAoIGRpc3BsYXkgJiYgZGlzcGxheSAhPT0gXCJub25lXCIgfHwgIWhpZGRlbiApIHtcblx0XHRcdFx0alF1ZXJ5Ll9kYXRhKFxuXHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0XCJvbGRkaXNwbGF5XCIsXG5cdFx0XHRcdFx0aGlkZGVuID8gZGlzcGxheSA6IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcFxuXHQvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0aWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2YWx1ZXNbIGluZGV4IF0gfHwgXCJcIiA6IFwibm9uZVwiO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxuZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHtcblx0dmFyIG1hdGNoZXMgPSBybnVtc3BsaXQuZXhlYyggdmFsdWUgKTtcblx0cmV0dXJuIG1hdGNoZXMgP1xuXG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMSBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMiBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCwgc3R5bGVzICkge1xuXHR2YXIgaSA9IGV4dHJhID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgP1xuXG5cdFx0Ly8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSByaWdodCBtZWFzdXJlbWVudCwgYXZvaWQgYXVnbWVudGF0aW9uXG5cdFx0NCA6XG5cblx0XHQvLyBPdGhlcndpc2UgaW5pdGlhbGl6ZSBmb3IgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBwcm9wZXJ0aWVzXG5cdFx0bmFtZSA9PT0gXCJ3aWR0aFwiID8gMSA6IDAsXG5cblx0XHR2YWwgPSAwO1xuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHtcblxuXHRcdC8vIGJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXRcblx0XHRpZiAoIGV4dHJhID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdGlmICggaXNCb3JkZXJCb3ggKSB7XG5cblx0XHRcdC8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudFxuXHRcdFx0aWYgKCBleHRyYSA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgYm9yZGVyIG5vciBtYXJnaW4sIHNvIHJlbW92ZSBib3JkZXJcblx0XHRcdGlmICggZXh0cmEgIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQsIHNvIGFkZCBwYWRkaW5nXG5cdFx0XHR2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQgbm9yIHBhZGRpbmcsIHNvIGFkZCBib3JkZXJcblx0XHRcdGlmICggZXh0cmEgIT09IFwicGFkZGluZ1wiICkge1xuXHRcdFx0XHR2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApIHtcblxuXHQvLyBTdGFydCB3aXRoIG9mZnNldCBwcm9wZXJ0eSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYm9yZGVyLWJveCB2YWx1ZVxuXHR2YXIgdmFsdWVJc0JvcmRlckJveCA9IHRydWUsXG5cdFx0dmFsID0gbmFtZSA9PT0gXCJ3aWR0aFwiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0LFxuXHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLFxuXHRcdGlzQm9yZGVyQm94ID0gc3VwcG9ydC5ib3hTaXppbmcgJiZcblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0Ly8gc29tZSBub24taHRtbCBlbGVtZW50cyByZXR1cm4gdW5kZWZpbmVkIGZvciBvZmZzZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5kZWZpbmVkXG5cdC8vIHN2ZyAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTI4NVxuXHQvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00OTE2Njhcblx0aWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0gbnVsbCApIHtcblxuXHRcdC8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeVxuXHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7XG5cdFx0aWYgKCB2YWwgPCAwIHx8IHZhbCA9PSBudWxsICkge1xuXHRcdFx0dmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIENvbXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4uXG5cdFx0aWYgKCBybnVtbm9ucHgudGVzdCggdmFsICkgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblxuXHRcdC8vIHdlIG5lZWQgdGhlIGNoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGljaCByZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzXG5cdFx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJlxuXHRcdFx0KCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTtcblxuXHRcdC8vIE5vcm1hbGl6ZSBcIlwiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmFcblx0XHR2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwO1xuXHR9XG5cblx0Ly8gdXNlIHRoZSBhY3RpdmUgYm94LXNpemluZyBtb2RlbCB0byBhZGQvc3VidHJhY3QgaXJyZWxldmFudCBzdHlsZXNcblx0cmV0dXJuICggdmFsICtcblx0XHRhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdGVsZW0sXG5cdFx0XHRuYW1lLFxuXHRcdFx0ZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApLFxuXHRcdFx0dmFsdWVJc0JvcmRlckJveCxcblx0XHRcdHN0eWxlc1xuXHRcdClcblx0KSArIFwicHhcIjtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdFxuXHQvLyBiZWhhdmlvciBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIGEgc3R5bGUgcHJvcGVydHlcblx0Y3NzSG9va3M6IHtcblx0XHRvcGFjaXR5OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHRcdC8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5XG5cdFx0XHRcdFx0dmFyIHJldCA9IGN1ckNTUyggZWxlbSwgXCJvcGFjaXR5XCIgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmV0ID09PSBcIlwiID8gXCIxXCIgOiByZXQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgXCJweFwiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRpZXNcblx0Y3NzTnVtYmVyOiB7XG5cdFx0XCJhbmltYXRpb25JdGVyYXRpb25Db3VudFwiOiB0cnVlLFxuXHRcdFwiY29sdW1uQ291bnRcIjogdHJ1ZSxcblx0XHRcImZpbGxPcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJmbGV4R3Jvd1wiOiB0cnVlLFxuXHRcdFwiZmxleFNocmlua1wiOiB0cnVlLFxuXHRcdFwiZm9udFdlaWdodFwiOiB0cnVlLFxuXHRcdFwibGluZUhlaWdodFwiOiB0cnVlLFxuXHRcdFwib3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwib3JkZXJcIjogdHJ1ZSxcblx0XHRcIm9ycGhhbnNcIjogdHJ1ZSxcblx0XHRcIndpZG93c1wiOiB0cnVlLFxuXHRcdFwiekluZGV4XCI6IHRydWUsXG5cdFx0XCJ6b29tXCI6IHRydWVcblx0fSxcblxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXG5cdC8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWVcblx0Y3NzUHJvcHM6IHtcblxuXHRcdC8vIG5vcm1hbGl6ZSBmbG9hdCBjc3MgcHJvcGVydHlcblx0XHRcImZsb2F0XCI6IHN1cHBvcnQuY3NzRmxvYXQgPyBcImNzc0Zsb2F0XCIgOiBcInN0eWxlRmxvYXRcIlxuXHR9LFxuXG5cdC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xuXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdG5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHxcblx0XHRcdCggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIG9yaWdOYW1lICkgfHwgb3JpZ05hbWUgKTtcblxuXHRcdC8vIGdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb25cblx0XHQvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWVcblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0XHQvLyBDb252ZXJ0IFwiKz1cIiBvciBcIi09XCIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHtcblx0XHRcdFx0dmFsdWUgPSBhZGp1c3RDU1MoIGVsZW0sIG5hbWUsIHJldCApO1xuXG5cdFx0XHRcdC8vIEZpeGVzIGJ1ZyAjOTIzN1xuXHRcdFx0XHR0eXBlID0gXCJudW1iZXJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2XG5cdFx0XHRpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCB0aGUgdW5pdCAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0aWYgKCB0eXBlID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gXCJcIiA6IFwicHhcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGaXhlcyAjODkwOCwgaXQgY2FuIGJlIGRvbmUgbW9yZSBjb3JyZWN0bHkgYnkgc3BlY2lmaW5nIHNldHRlcnMgaW4gY3NzSG9va3MsXG5cdFx0XHQvLyBidXQgaXQgd291bGQgbWVhbiB0byBkZWZpbmUgZWlnaHRcblx0XHRcdC8vIChmb3IgZXZlcnkgcHJvYmxlbWF0aWMgcHJvcGVydHkpIGlkZW50aWNhbCBmdW5jdGlvbnNcblx0XHRcdGlmICggIXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlICYmIHZhbHVlID09PSBcIlwiICYmIG5hbWUuaW5kZXhPZiggXCJiYWNrZ3JvdW5kXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IFwiaW5oZXJpdFwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWVcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fFxuXHRcdFx0XHQoIHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUVcblx0XHRcdFx0Ly8gU3dhbGxvdyBlcnJvcnMgZnJvbSAnaW52YWxpZCcgQ1NTIHZhbHVlcyAoIzU1MDkpXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0XG5cdFx0XHRyZXR1cm4gc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0Y3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHtcblx0XHR2YXIgbnVtLCB2YWwsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8XG5cdFx0XHQoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBvcmlnTmFtZSApIHx8IG9yaWdOYW1lICk7XG5cblx0XHQvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uXG5cdFx0Ly8gZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvL2NvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuLCBjb252ZXJ0aW5nIHRvIG51bWJlciBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImhlaWdodFwiLCBcIndpZHRoXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gY2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGhvd2V2ZXIsIGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXQgZnJvbSB0aGlzXG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cdFx0XHRcdFx0ZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCA/XG5cdFx0XHRcdFx0XHRzd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgZXh0cmEgP1xuXHRcdFx0XHRhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0c3VwcG9ydC5ib3hTaXppbmcgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdCkgOiAwXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcbn0gKTtcblxuaWYgKCAhc3VwcG9ydC5vcGFjaXR5ICkge1xuXHRqUXVlcnkuY3NzSG9va3Mub3BhY2l0eSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblxuXHRcdFx0Ly8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5XG5cdFx0XHRyZXR1cm4gcm9wYWNpdHkudGVzdCggKCBjb21wdXRlZCAmJiBlbGVtLmN1cnJlbnRTdHlsZSA/XG5cdFx0XHRcdGVsZW0uY3VycmVudFN0eWxlLmZpbHRlciA6XG5cdFx0XHRcdGVsZW0uc3R5bGUuZmlsdGVyICkgfHwgXCJcIiApID9cblx0XHRcdFx0XHQoIDAuMDEgKiBwYXJzZUZsb2F0KCBSZWdFeHAuJDEgKSApICsgXCJcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQgPyBcIjFcIiA6IFwiXCI7XG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0dmFyIHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRcdFx0Y3VycmVudFN0eWxlID0gZWxlbS5jdXJyZW50U3R5bGUsXG5cdFx0XHRcdG9wYWNpdHkgPSBqUXVlcnkuaXNOdW1lcmljKCB2YWx1ZSApID8gXCJhbHBoYShvcGFjaXR5PVwiICsgdmFsdWUgKiAxMDAgKyBcIilcIiA6IFwiXCIsXG5cdFx0XHRcdGZpbHRlciA9IGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUuZmlsdGVyIHx8IHN0eWxlLmZpbHRlciB8fCBcIlwiO1xuXG5cdFx0XHQvLyBJRSBoYXMgdHJvdWJsZSB3aXRoIG9wYWNpdHkgaWYgaXQgZG9lcyBub3QgaGF2ZSBsYXlvdXRcblx0XHRcdC8vIEZvcmNlIGl0IGJ5IHNldHRpbmcgdGhlIHpvb20gbGV2ZWxcblx0XHRcdHN0eWxlLnpvb20gPSAxO1xuXG5cdFx0XHQvLyBpZiBzZXR0aW5nIG9wYWNpdHkgdG8gMSwgYW5kIG5vIG90aGVyIGZpbHRlcnMgZXhpc3QgLVxuXHRcdFx0Ly8gYXR0ZW1wdCB0byByZW1vdmUgZmlsdGVyIGF0dHJpYnV0ZSAjNjY1MlxuXHRcdFx0Ly8gaWYgdmFsdWUgPT09IFwiXCIsIHRoZW4gcmVtb3ZlIGlubGluZSBvcGFjaXR5ICMxMjY4NVxuXHRcdFx0aWYgKCAoIHZhbHVlID49IDEgfHwgdmFsdWUgPT09IFwiXCIgKSAmJlxuXHRcdFx0XHRcdGpRdWVyeS50cmltKCBmaWx0ZXIucmVwbGFjZSggcmFscGhhLCBcIlwiICkgKSA9PT0gXCJcIiAmJlxuXHRcdFx0XHRcdHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHQvLyBTZXR0aW5nIHN0eWxlLmZpbHRlciB0byBudWxsLCBcIlwiICYgXCIgXCIgc3RpbGwgbGVhdmUgXCJmaWx0ZXI6XCIgaW4gdGhlIGNzc1RleHRcblx0XHRcdFx0Ly8gaWYgXCJmaWx0ZXI6XCIgaXMgcHJlc2VudCBhdCBhbGwsIGNsZWFyVHlwZSBpcyBkaXNhYmxlZCwgd2Ugd2FudCB0byBhdm9pZCB0aGlzXG5cdFx0XHRcdC8vIHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSBpcyBJRSBPbmx5LCBidXQgc28gYXBwYXJlbnRseSBpcyB0aGlzIGNvZGUgcGF0aC4uLlxuXHRcdFx0XHRzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoIFwiZmlsdGVyXCIgKTtcblxuXHRcdFx0XHQvLyBpZiB0aGVyZSBpcyBubyBmaWx0ZXIgc3R5bGUgYXBwbGllZCBpbiBhIGNzcyBydWxlXG5cdFx0XHRcdC8vIG9yIHVuc2V0IGlubGluZSBvcGFjaXR5LCB3ZSBhcmUgZG9uZVxuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcIlwiIHx8IGN1cnJlbnRTdHlsZSAmJiAhY3VycmVudFN0eWxlLmZpbHRlciApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gb3RoZXJ3aXNlLCBzZXQgbmV3IGZpbHRlciB2YWx1ZXNcblx0XHRcdHN0eWxlLmZpbHRlciA9IHJhbHBoYS50ZXN0KCBmaWx0ZXIgKSA/XG5cdFx0XHRcdGZpbHRlci5yZXBsYWNlKCByYWxwaGEsIG9wYWNpdHkgKSA6XG5cdFx0XHRcdGZpbHRlciArIFwiIFwiICsgb3BhY2l0eTtcblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5SaWdodCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiBzd2FwKCBlbGVtLCB7IFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiIH0sXG5cdFx0XHRcdGN1ckNTUywgWyBlbGVtLCBcIm1hcmdpblJpZ2h0XCIgXSApO1xuXHRcdH1cblx0fVxuKTtcblxualF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIgKSApIHx8XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHRcdFx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvclxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTggb25seVxuXHRcdFx0XHQvLyBnZXRDbGllbnRSZWN0cygpIGVycm9ycyBvbiBkaXNjb25uZWN0ZWQgZWxlbXNcblx0XHRcdFx0KCBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApID9cblx0XHRcdFx0XHRlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXHRcdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHQwXG5cdFx0XHRcdClcblx0XHRcdCkgKyBcInB4XCI7XG5cdFx0fVxuXHR9XG4pO1xuXG4vLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzXG5qUXVlcnkuZWFjaCgge1xuXHRtYXJnaW46IFwiXCIsXG5cdHBhZGRpbmc6IFwiXCIsXG5cdGJvcmRlcjogXCJXaWR0aFwiXG59LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XG5cdFx0ZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgaSA9IDAsXG5cdFx0XHRcdGV4cGFuZGVkID0ge30sXG5cblx0XHRcdFx0Ly8gYXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoIFwiIFwiICkgOiBbIHZhbHVlIF07XG5cblx0XHRcdGZvciAoIDsgaSA8IDQ7IGkrKyApIHtcblx0XHRcdFx0ZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPVxuXHRcdFx0XHRcdHBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4cGFuZGVkO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggbmFtZSApICkge1xuXHRcdFx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKTtcblx0XHRcdFx0bGVuID0gbmFtZS5sZW5ndGg7XG5cblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0bWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG1hcDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOlxuXHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7XG5cdFx0fSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW4oIHRoaXMgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuc2hvdygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIHBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlsc1xuXHRcdFx0Ly8gc28sIHNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0LlxuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcyBpcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyB1c2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdCAtIHVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZSAtIHVzZSAuc3R5bGUgaWYgaXRzXG5cdFx0XHQvLyBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZVxuXHRcdFx0aWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkge1xuXHRcdFx0XHRqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApO1xuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fFxuXHRcdFx0XHRcdGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUUgPD05XG4vLyBQYW5pYyBiYXNlZCBhcHByb2FjaCB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblxuVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4uZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmVhc2luZyA9IHtcblx0bGluZWFyOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gcDtcblx0fSxcblx0c3dpbmc6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgKSAvIDI7XG5cdH0sXG5cdF9kZWZhdWx0OiBcInN3aW5nXCJcbn07XG5cbmpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0O1xuXG4vLyBCYWNrIENvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludFxualF1ZXJ5LmZ4LnN0ZXAgPSB7fTtcblxuXG5cblxudmFyXG5cdGZ4Tm93LCB0aW1lcklkLFxuXHRyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxcblx0cnJ1biA9IC9xdWV1ZUhvb2tzJC87XG5cbi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHlcbmZ1bmN0aW9uIGNyZWF0ZUZ4Tm93KCkge1xuXHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0ZnhOb3cgPSB1bmRlZmluZWQ7XG5cdH0gKTtcblx0cmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkgKTtcbn1cblxuLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb25cbmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7XG5cdHZhciB3aGljaCxcblx0XHRhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH0sXG5cdFx0aSA9IDA7XG5cblx0Ly8gaWYgd2UgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLFxuXHQvLyBpZiB3ZSBkb24ndCBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0IDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkge1xuXHRcdHdoaWNoID0gY3NzRXhwYW5kWyBpIF07XG5cdFx0YXR0cnNbIFwibWFyZ2luXCIgKyB3aGljaCBdID0gYXR0cnNbIFwicGFkZGluZ1wiICsgd2hpY2ggXSA9IHR5cGU7XG5cdH1cblxuXHRpZiAoIGluY2x1ZGVXaWR0aCApIHtcblx0XHRhdHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlO1xuXHR9XG5cblx0cmV0dXJuIGF0dHJzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHtcblx0dmFyIHR3ZWVuLFxuXHRcdGNvbGxlY3Rpb24gPSAoIEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCBBbmltYXRpb24udHdlZW5lcnNbIFwiKlwiIF0gKSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHtcblxuXHRcdFx0Ly8gd2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHlcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XG5cdC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIHR3ZWVuLCBob29rcywgb2xkZmlyZSwgZGlzcGxheSwgY2hlY2tEaXNwbGF5LFxuXHRcdGFuaW0gPSB0aGlzLFxuXHRcdG9yaWcgPSB7fSxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXG5cdFx0aGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gaGFuZGxlIHF1ZXVlOiBmYWxzZSBwcm9taXNlc1xuXHRpZiAoICFvcHRzLnF1ZXVlICkge1xuXHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCBcImZ4XCIgKTtcblx0XHRpZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7XG5cdFx0XHRob29rcy51bnF1ZXVlZCA9IDA7XG5cdFx0XHRvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhaG9va3MudW5xdWV1ZWQgKSB7XG5cdFx0XHRcdFx0b2xkZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRob29rcy51bnF1ZXVlZCsrO1xuXG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBkb2luZyB0aGlzIG1ha2VzIHN1cmUgdGhhdCB0aGUgY29tcGxldGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZFxuXHRcdFx0Ly8gYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIGhlaWdodC93aWR0aCBvdmVyZmxvdyBwYXNzXG5cdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiaGVpZ2h0XCIgaW4gcHJvcHMgfHwgXCJ3aWR0aFwiIGluIHByb3BzICkgKSB7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXRcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90XG5cdFx0Ly8gY2hhbmdlIHRoZSBvdmVyZmxvdyBhdHRyaWJ1dGUgd2hlbiBvdmVyZmxvd1ggYW5kXG5cdFx0Ly8gb3ZlcmZsb3dZIGFyZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWVcblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcblxuXHRcdC8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoXG5cdFx0Ly8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodCBhbmltYXRlZFxuXHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXG5cdFx0Ly8gVGVzdCBkZWZhdWx0IGRpc3BsYXkgaWYgZGlzcGxheSBpcyBjdXJyZW50bHkgXCJub25lXCJcblx0XHRjaGVja0Rpc3BsYXkgPSBkaXNwbGF5ID09PSBcIm5vbmVcIiA/XG5cdFx0XHRqUXVlcnkuX2RhdGEoIGVsZW0sIFwib2xkZGlzcGxheVwiICkgfHwgZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXk7XG5cblx0XHRpZiAoIGNoZWNrRGlzcGxheSA9PT0gXCJpbmxpbmVcIiAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImZsb2F0XCIgKSA9PT0gXCJub25lXCIgKSB7XG5cblx0XHRcdC8vIGlubGluZS1sZXZlbCBlbGVtZW50cyBhY2NlcHQgaW5saW5lLWJsb2NrO1xuXHRcdFx0Ly8gYmxvY2stbGV2ZWwgZWxlbWVudHMgbmVlZCB0byBiZSBpbmxpbmUgd2l0aCBsYXlvdXRcblx0XHRcdGlmICggIXN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCB8fCBkZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApID09PSBcImlubGluZVwiICkge1xuXHRcdFx0XHRzdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0eWxlLnpvb20gPSAxO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0aWYgKCAhc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzKCkgKSB7XG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHN0eWxlLm92ZXJmbG93ID0gb3B0cy5vdmVyZmxvd1sgMCBdO1xuXHRcdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRcdHN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cblxuXHQvLyBzaG93L2hpZGUgcGFzc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGRhdGFTaG93IGxlZnQgb3ZlciBmcm9tIGEgc3RvcHBlZCBoaWRlIG9yIHNob3dcblx0XHRcdFx0Ly8gYW5kIHdlIGFyZSBnb2luZyB0byBwcm9jZWVkIHdpdGggc2hvdywgd2Ugc2hvdWxkIHByZXRlbmQgdG8gYmUgaGlkZGVuXG5cdFx0XHRcdGlmICggdmFsdWUgPT09IFwic2hvd1wiICYmIGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXG5cdFx0Ly8gQW55IG5vbi1meCB2YWx1ZSBzdG9wcyB1cyBmcm9tIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXNwbGF5ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0aWYgKCBkYXRhU2hvdyApIHtcblx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhU2hvdyA9IGpRdWVyeS5fZGF0YSggZWxlbSwgXCJmeHNob3dcIiwge30gKTtcblx0XHR9XG5cblx0XHQvLyBzdG9yZSBzdGF0ZSBpZiBpdHMgdG9nZ2xlIC0gZW5hYmxlcyAuc3RvcCgpLnRvZ2dsZSgpIHRvIFwicmV2ZXJzZVwiXG5cdFx0aWYgKCB0b2dnbGUgKSB7XG5cdFx0XHRkYXRhU2hvdy5oaWRkZW4gPSAhaGlkZGVuO1xuXHRcdH1cblx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdGpRdWVyeSggZWxlbSApLnNob3coKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5KCBlbGVtICkuaGlkZSgpO1xuXHRcdFx0fSApO1xuXHRcdH1cblx0XHRhbmltLmRvbmUoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHByb3A7XG5cdFx0XHRqUXVlcnkuX3JlbW92ZURhdGEoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0dHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblxuXHRcdFx0aWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7XG5cdFx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDtcblx0XHRcdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRcdFx0dHdlZW4uZW5kID0gdHdlZW4uc3RhcnQ7XG5cdFx0XHRcdFx0dHdlZW4uc3RhcnQgPSBwcm9wID09PSBcIndpZHRoXCIgfHwgcHJvcCA9PT0gXCJoZWlnaHRcIiA/IDEgOiAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdC8vIElmIHRoaXMgaXMgYSBub29wIGxpa2UgLmhpZGUoKS5oaWRlKCksIHJlc3RvcmUgYW4gb3ZlcndyaXR0ZW4gZGlzcGxheSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCAoIGRpc3BsYXkgPT09IFwibm9uZVwiID8gZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXkgKSA9PT0gXCJpbmxpbmVcIiApIHtcblx0XHRzdHlsZS5kaXNwbGF5ID0gZGlzcGxheTtcblx0fVxufVxuXG5mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHtcblx0dmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rcztcblxuXHQvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3Ncblx0Zm9yICggaW5kZXggaW4gcHJvcHMgKSB7XG5cdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdGVhc2luZyA9IHZhbHVlWyAxIF07XG5cdFx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTtcblx0XHR9XG5cblx0XHRpZiAoIGluZGV4ICE9PSBuYW1lICkge1xuXHRcdFx0cHJvcHNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBpbmRleCBdO1xuXHRcdH1cblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07XG5cdFx0aWYgKCBob29rcyAmJiBcImV4cGFuZFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsdWUgPSBob29rcy5leHBhbmQoIHZhbHVlICk7XG5cdFx0XHRkZWxldGUgcHJvcHNbIG5hbWUgXTtcblxuXHRcdFx0Ly8gbm90IHF1aXRlICQuZXh0ZW5kLCB0aGlzIHdvbnQgb3ZlcndyaXRlIGtleXMgYWxyZWFkeSBwcmVzZW50LlxuXHRcdFx0Ly8gYWxzbyAtIHJldXNpbmcgJ2luZGV4JyBmcm9tIGFib3ZlIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCBcIm5hbWVcIlxuXHRcdFx0Zm9yICggaW5kZXggaW4gdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggISggaW5kZXggaW4gcHJvcHMgKSApIHtcblx0XHRcdFx0XHRwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdO1xuXHRcdFx0XHRcdHNwZWNpYWxFYXNpbmdbIGluZGV4IF0gPSBlYXNpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c3BlY2lhbEVhc2luZ1sgbmFtZSBdID0gZWFzaW5nO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBBbmltYXRpb24oIGVsZW0sIHByb3BlcnRpZXMsIG9wdGlvbnMgKSB7XG5cdHZhciByZXN1bHQsXG5cdFx0c3RvcHBlZCxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLFxuXHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gZG9uJ3QgbWF0Y2ggZWxlbSBpbiB0aGUgOmFuaW1hdGVkIHNlbGVjdG9yXG5cdFx0XHRkZWxldGUgdGljay5lbGVtO1xuXHRcdH0gKSxcblx0XHR0aWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRcdHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSxcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0XHQvLyBBcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgYDEgLSAoIDAuNSB8fCAwIClgICgjMTI0OTcpXG5cdFx0XHRcdHRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCxcblx0XHRcdFx0cGVyY2VudCA9IDEgLSB0ZW1wLFxuXHRcdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRcdGxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0YW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSgge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdHByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLFxuXHRcdFx0b3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwge1xuXHRcdFx0XHRzcGVjaWFsRWFzaW5nOiB7fSxcblx0XHRcdFx0ZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0XG5cdFx0XHR9LCBvcHRpb25zICksXG5cdFx0XHRvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsXG5cdFx0XHRvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsXG5cdFx0XHRzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcblx0XHRcdHR3ZWVuczogW10sXG5cdFx0XHRjcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCApIHtcblx0XHRcdFx0dmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLFxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApO1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7XG5cdFx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHRcdH0sXG5cdFx0XHRzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHtcblx0XHRcdFx0dmFyIGluZGV4ID0gMCxcblxuXHRcdFx0XHRcdC8vIGlmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVuc1xuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydFxuXHRcdFx0XHRcdGxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdlZW5zLmxlbmd0aCA6IDA7XG5cdFx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0XHRzdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWVcblx0XHRcdFx0Ly8gb3RoZXJ3aXNlLCByZWplY3Rcblx0XHRcdFx0aWYgKCBnb3RvRW5kICkge1xuXHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCAxLCAwIF0gKTtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9ICksXG5cdFx0cHJvcHMgPSBhbmltYXRpb24ucHJvcHM7XG5cblx0cHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcmVzdWx0LnN0b3AgKSApIHtcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCBhbmltYXRpb24uZWxlbSwgYW5pbWF0aW9uLm9wdHMucXVldWUgKS5zdG9wID1cblx0XHRcdFx0XHRqUXVlcnkucHJveHkoIHJlc3VsdC5zdG9wLCByZXN1bHQgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkge1xuXHRcdGFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApO1xuXHR9XG5cblx0alF1ZXJ5LmZ4LnRpbWVyKFxuXHRcdGpRdWVyeS5leHRlbmQoIHRpY2ssIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRhbmltOiBhbmltYXRpb24sXG5cdFx0XHRxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWVcblx0XHR9IClcblx0KTtcblxuXHQvLyBhdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9uc1xuXHRyZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApXG5cdFx0LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlIClcblx0XHQuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApXG5cdFx0LmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7XG59XG5cbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcblxuXHR0d2VlbmVyczoge1xuXHRcdFwiKlwiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcblx0XHRcdHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICk7XG5cdFx0XHRhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTtcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9IF1cblx0fSxcblxuXHR0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7XG5cdFx0XHRjYWxsYmFjayA9IHByb3BzO1xuXHRcdFx0cHJvcHMgPSBbIFwiKlwiIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BzID0gcHJvcHMubWF0Y2goIHJub3R3aGl0ZSApO1xuXHRcdH1cblxuXHRcdHZhciBwcm9wLFxuXHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRwcm9wID0gcHJvcHNbIGluZGV4IF07XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH0sXG5cblx0cHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sXG5cblx0cHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7XG5cdFx0aWYgKCBwcmVwZW5kICkge1xuXHRcdFx0QW5pbWF0aW9uLnByZWZpbHRlcnMudW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QW5pbWF0aW9uLnByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LnNwZWVkID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkge1xuXHR2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7XG5cdFx0Y29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHxcblx0XHRcdGpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmdcblx0fTtcblxuXHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRpb24gPT09IFwibnVtYmVyXCIgPyBvcHQuZHVyYXRpb24gOlxuXHRcdG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID9cblx0XHRcdGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcblxuXHQvLyBub3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiBcImZ4XCJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XG5cdFx0b3B0LnF1ZXVlID0gXCJmeFwiO1xuXHR9XG5cblx0Ly8gUXVldWVpbmdcblx0b3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTtcblxuXHRvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7XG5cdFx0XHRvcHQub2xkLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdC5xdWV1ZSApIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIG9wdDtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gc2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcblxuXHRcdFx0Ly8gYW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSggeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSxcblx0XHRcdG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSxcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3Rcblx0XHRcdFx0dmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApO1xuXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlhdGVseVxuXHRcdFx0XHRpZiAoIGVtcHR5IHx8IGpRdWVyeS5fZGF0YSggdGhpcywgXCJmaW5pc2hcIiApICkge1xuXHRcdFx0XHRcdGFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0ZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247XG5cblx0XHRyZXR1cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/XG5cdFx0XHR0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOlxuXHRcdFx0dGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApO1xuXHR9LFxuXHRzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHtcblx0XHR2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkge1xuXHRcdFx0dmFyIHN0b3AgPSBob29rcy5zdG9wO1xuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRzdG9wKCBnb3RvRW5kICk7XG5cdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRnb3RvRW5kID0gY2xlYXJRdWV1ZTtcblx0XHRcdGNsZWFyUXVldWUgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBjbGVhclF1ZXVlICYmIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXG5cdFx0XHRcdGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyBcInF1ZXVlSG9va3NcIixcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0ZGF0YSA9IGpRdWVyeS5fZGF0YSggdGhpcyApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkge1xuXHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpbmRleCBpbiBkYXRhICkge1xuXHRcdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkge1xuXHRcdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiZcblx0XHRcdFx0XHQoIHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSApIHtcblxuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTtcblx0XHRcdFx0XHRkZXF1ZXVlID0gZmFsc2U7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkXG5cdFx0XHQvLyB0aW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1ZVxuXHRcdFx0Ly8gYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmRcblx0XHRcdGlmICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cdGZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0aWYgKCB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5kZXgsXG5cdFx0XHRcdGRhdGEgPSBqUXVlcnkuX2RhdGEoIHRoaXMgKSxcblx0XHRcdFx0cXVldWUgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZVwiIF0sXG5cdFx0XHRcdGhvb2tzID0gZGF0YVsgdHlwZSArIFwicXVldWVIb29rc1wiIF0sXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDtcblxuXHRcdFx0Ly8gZW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YVxuXHRcdFx0ZGF0YS5maW5pc2ggPSB0cnVlO1xuXG5cdFx0XHQvLyBlbXB0eSB0aGUgcXVldWUgZmlyc3Rcblx0XHRcdGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTtcblxuXHRcdFx0aWYgKCBob29rcyAmJiBob29rcy5zdG9wICkge1xuXHRcdFx0XHRob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gbG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkge1xuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGxvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHtcblx0XHRcdFx0XHRxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIHR1cm4gb2ZmIGZpbmlzaGluZyBmbGFnXG5cdFx0XHRkZWxldGUgZGF0YS5maW5pc2g7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwidG9nZ2xlXCIsIFwic2hvd1wiLCBcImhpZGVcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxuLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9uc1xualF1ZXJ5LmVhY2goIHtcblx0c2xpZGVEb3duOiBnZW5GeCggXCJzaG93XCIgKSxcblx0c2xpZGVVcDogZ2VuRngoIFwiaGlkZVwiICksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeCggXCJ0b2dnbGVcIiApLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0aSA9IDA7XG5cblx0ZnhOb3cgPSBqUXVlcnkubm93KCk7XG5cblx0Zm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkge1xuXHRcdHRpbWVyID0gdGltZXJzWyBpIF07XG5cblx0XHQvLyBDaGVja3MgdGhlIHRpbWVyIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlbW92ZWRcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRpZiAoIHRpbWVyKCkgKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0YXJ0KCk7XG5cdH0gZWxzZSB7XG5cdFx0alF1ZXJ5LnRpbWVycy5wb3AoKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5cbmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkge1xuXHRpZiAoICF0aW1lcklkICkge1xuXHRcdHRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0d2luZG93LmNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTtcblx0dGltZXJJZCA9IG51bGw7XG59O1xuXG5qUXVlcnkuZnguc3BlZWRzID0ge1xuXHRzbG93OiA2MDAsXG5cdGZhc3Q6IDIwMCxcblxuXHQvLyBEZWZhdWx0IHNwZWVkXG5cdF9kZWZhdWx0OiA0MDBcbn07XG5cblxuLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLlxuLy8gaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxMDAzMjQwMTQ3NDcvaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5L1xualF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7XG5cdHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7XG5cdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xuXHRcdHZhciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTtcblx0XHRob29rcy5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cdFx0fTtcblx0fSApO1xufTtcblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgYSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInNlbGVjdFwiICksXG5cdFx0b3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9wdGlvblwiICkgKTtcblxuXHQvLyBTZXR1cFxuXHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cdGRpdi5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NOYW1lXCIsIFwidFwiICk7XG5cdGRpdi5pbm5lckhUTUwgPSBcIiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPlwiO1xuXHRhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcImFcIiApWyAwIF07XG5cblx0Ly8gU3VwcG9ydDogV2luZG93cyBXZWIgQXBwcyAoV1dBKVxuXHQvLyBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwiY2hlY2tib3hcIiApO1xuXHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cblx0YSA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJhXCIgKVsgMCBdO1xuXG5cdC8vIEZpcnN0IGJhdGNoIG9mIHRlc3RzLlxuXHRhLnN0eWxlLmNzc1RleHQgPSBcInRvcDoxcHhcIjtcblxuXHQvLyBUZXN0IHNldEF0dHJpYnV0ZSBvbiBjYW1lbENhc2UgY2xhc3MuXG5cdC8vIElmIGl0IHdvcmtzLCB3ZSBuZWVkIGF0dHJGaXhlcyB3aGVuIGRvaW5nIGdldC9zZXRBdHRyaWJ1dGUgKGllNi83KVxuXHRzdXBwb3J0LmdldFNldEF0dHJpYnV0ZSA9IGRpdi5jbGFzc05hbWUgIT09IFwidFwiO1xuXG5cdC8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGVcblx0Ly8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVhZClcblx0c3VwcG9ydC5zdHlsZSA9IC90b3AvLnRlc3QoIGEuZ2V0QXR0cmlidXRlKCBcInN0eWxlXCIgKSApO1xuXG5cdC8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkXG5cdC8vIChJRSBub3JtYWxpemVzIGl0IGJ5IGRlZmF1bHQpXG5cdHN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgPSBhLmdldEF0dHJpYnV0ZSggXCJocmVmXCIgKSA9PT0gXCIvYVwiO1xuXG5cdC8vIENoZWNrIHRoZSBkZWZhdWx0IGNoZWNrYm94L3JhZGlvIHZhbHVlIChcIlwiIG9uIFdlYktpdDsgXCJvblwiIGVsc2V3aGVyZSlcblx0c3VwcG9ydC5jaGVja09uID0gISFpbnB1dC52YWx1ZTtcblxuXHQvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGVkLWJ5LWRlZmF1bHQgb3B0aW9uIGhhcyBhIHdvcmtpbmcgc2VsZWN0ZWQgcHJvcGVydHkuXG5cdC8vIChXZWJLaXQgZGVmYXVsdHMgdG8gZmFsc2UgaW5zdGVhZCBvZiB0cnVlLCBJRSB0b28sIGlmIGl0J3MgaW4gYW4gb3B0Z3JvdXApXG5cdHN1cHBvcnQub3B0U2VsZWN0ZWQgPSBvcHQuc2VsZWN0ZWQ7XG5cblx0Ly8gVGVzdHMgZm9yIGVuY3R5cGUgc3VwcG9ydCBvbiBhIGZvcm0gKCM2NzQzKVxuXHRzdXBwb3J0LmVuY3R5cGUgPSAhIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZm9ybVwiICkuZW5jdHlwZTtcblxuXHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgb3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmVuJ3QgbWFya2VkIGFzIGRpc2FibGVkXG5cdC8vIChXZWJLaXQgbWFya3MgdGhlbSBhcyBkaXNhYmxlZClcblx0c2VsZWN0LmRpc2FibGVkID0gdHJ1ZTtcblx0c3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUU4IG9ubHlcblx0Ly8gQ2hlY2sgaWYgd2UgY2FuIHRydXN0IGdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG5cdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiLCBcIlwiICk7XG5cdHN1cHBvcnQuaW5wdXQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBcIlwiO1xuXG5cdC8vIENoZWNrIGlmIGFuIGlucHV0IG1haW50YWlucyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpb1xuXHRpbnB1dC52YWx1ZSA9IFwidFwiO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcInJhZGlvXCIgKTtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIHJyZXR1cm4gPSAvXFxyL2csXG5cdHJzcGFjZXMgPSAvW1xceDIwXFx0XFxyXFxuXFxmXSsvZztcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgaG9va3MsIHJldCwgaXNGdW5jdGlvbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHxcblx0XHRcdFx0XHRqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRob29rcyAmJlxuXHRcdFx0XHRcdFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgXCJ2YWx1ZVwiICkgKSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXQgPSBlbGVtLnZhbHVlO1xuXG5cdFx0XHRcdHJldHVybiB0eXBlb2YgcmV0ID09PSBcInN0cmluZ1wiID9cblxuXHRcdFx0XHRcdC8vIGhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXNcblx0XHRcdFx0XHRyZXQucmVwbGFjZSggcnJldHVybiwgXCJcIiApIDpcblxuXHRcdFx0XHRcdC8vIGhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlclxuXHRcdFx0XHRcdHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsICs9IFwiXCI7XG5cdFx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIFwidmFsdWVcIiApO1xuXHRcdFx0XHRyZXR1cm4gdmFsICE9IG51bGwgP1xuXHRcdFx0XHRcdHZhbCA6XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTEwLTExK1xuXHRcdFx0XHRcdC8vIG9wdGlvbi50ZXh0IHRocm93cyBleGNlcHRpb25zICgjMTQ2ODYsICMxNDg1OClcblx0XHRcdFx0XHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0alF1ZXJ5LnRyaW0oIGpRdWVyeS50ZXh0KCBlbGVtICkgKS5yZXBsYWNlKCByc3BhY2VzLCBcIiBcIiApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIgfHwgaW5kZXggPCAwLFxuXHRcdFx0XHRcdHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSxcblx0XHRcdFx0XHRtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aCxcblx0XHRcdFx0XHRpID0gaW5kZXggPCAwID9cblx0XHRcdFx0XHRcdG1heCA6XG5cdFx0XHRcdFx0XHRvbmUgPyBpbmRleCA6IDA7XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBvbGRJRSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSlcblx0XHRcdFx0XHRpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiZcblxuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHRcdFx0XHRcdCggc3VwcG9ydC5vcHREaXNhYmxlZCA/XG5cdFx0XHRcdFx0XHRcdFx0IW9wdGlvbi5kaXNhYmxlZCA6XG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uLmdldEF0dHJpYnV0ZSggXCJkaXNhYmxlZFwiICkgPT09IG51bGwgKSAmJlxuXHRcdFx0XHRcdFx0XHQoICFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZCB8fFxuXHRcdFx0XHRcdFx0XHRcdCFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCBcIm9wdGdyb3VwXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheVxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgb3B0aW9uU2V0LCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHR2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLFxuXHRcdFx0XHRcdGkgPSBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTEgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFNlxuXHRcdFx0XHRcdFx0Ly8gV2hlbiBuZXcgb3B0aW9uIGVsZW1lbnQgaXMgYWRkZWQgdG8gc2VsZWN0IGJveCB3ZSBuZWVkIHRvXG5cdFx0XHRcdFx0XHQvLyBmb3JjZSByZWZsb3cgb2YgbmV3bHkgYWRkZWQgbm9kZSBpbiBvcmRlciB0byB3b3JrYXJvdW5kIGRlbGF5XG5cdFx0XHRcdFx0XHQvLyBvZiBpbml0aWFsaXphdGlvbiBwcm9wZXJ0aWVzXG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRvcHRpb24uc2VsZWN0ZWQgPSBvcHRpb25TZXQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHR9IGNhdGNoICggXyApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBXaWxsIGJlIGV4ZWN1dGVkIG9ubHkgaW4gSUU2XG5cdFx0XHRcdFx0XHRcdG9wdGlvbi5zY3JvbGxIZWlnaHQ7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b3B0aW9uLnNlbGVjdGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG9wdGlvbnM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KCBlbGVtICkudmFsKCksIHZhbHVlICkgPiAtMSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKCAhc3VwcG9ydC5jaGVja09uICkge1xuXHRcdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gbnVsbCA/IFwib25cIiA6IGVsZW0udmFsdWU7XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgbm9kZUhvb2ssIGJvb2xIb29rLFxuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZSxcblx0cnVzZURlZmF1bHQgPSAvXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLFxuXHRnZXRTZXRBdHRyaWJ1dGUgPSBzdXBwb3J0LmdldFNldEF0dHJpYnV0ZSxcblx0Z2V0U2V0SW5wdXQgPSBzdXBwb3J0LmlucHV0O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGF0dHJpYnV0ZXMgYXJlIGxvd2VyY2FzZVxuXHRcdC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWRcblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblx0XHRcdG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cblx0XHRcdFx0XHQvLyBTZXR0aW5nIHRoZSB0eXBlIG9uIGEgcmFkaW8gYnV0dG9uIGFmdGVyIHRoZSB2YWx1ZSByZXNldHMgdGhlIHZhbHVlIGluIElFOC05XG5cdFx0XHRcdFx0Ly8gUmVzZXQgdmFsdWUgdG8gZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVyIHZhbHVlIGR1cmluZyBjcmVhdGlvblxuXHRcdFx0XHRcdHZhciB2YWwgPSBlbGVtLnZhbHVlO1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgdmFsdWUgKTtcblx0XHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRcdGVsZW0udmFsdWUgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0dmFyIG5hbWUsIHByb3BOYW1lLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAoIG5hbWUgPSBhdHRyTmFtZXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdHByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXG5cdFx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgKCMxMDg3MClcblx0XHRcdFx0aWYgKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0XHRcdC8vIFNldCBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHRvIGZhbHNlXG5cdFx0XHRcdFx0aWYgKCBnZXRTZXRJbnB1dCAmJiBnZXRTZXRBdHRyaWJ1dGUgfHwgIXJ1c2VEZWZhdWx0LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0XHRcdGVsZW1bIHByb3BOYW1lIF0gPSBmYWxzZTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHRcdFx0XHQvLyBBbHNvIGNsZWFyIGRlZmF1bHRDaGVja2VkL2RlZmF1bHRTZWxlY3RlZCAoaWYgYXBwcm9wcmlhdGUpXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGVsZW1bIGpRdWVyeS5jYW1lbENhc2UoIFwiZGVmYXVsdC1cIiArIG5hbWUgKSBdID1cblx0XHRcdFx0XHRcdFx0ZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZWUgIzk2OTkgZm9yIGV4cGxhbmF0aW9uIG9mIHRoaXMgYXBwcm9hY2ggKHNldHRpbmcgZmlyc3QsIHRoZW4gcmVtb3ZhbClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRqUXVlcnkuYXR0ciggZWxlbSwgbmFtZSwgXCJcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGdldFNldEF0dHJpYnV0ZSA/IG5hbWUgOiBwcm9wTmFtZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIb29rcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXG5ib29sSG9vayA9IHtcblx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2Vcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0fSBlbHNlIGlmICggZ2V0U2V0SW5wdXQgJiYgZ2V0U2V0QXR0cmlidXRlIHx8ICFydXNlRGVmYXVsdC50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdC8vIElFPDggbmVlZHMgdGhlICpwcm9wZXJ0eSogbmFtZVxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoICFnZXRTZXRBdHRyaWJ1dGUgJiYgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lLCBuYW1lICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0XHQvLyBVc2UgZGVmYXVsdENoZWNrZWQgYW5kIGRlZmF1bHRTZWxlY3RlZCBmb3Igb2xkSUVcblx0XHRcdGVsZW1bIGpRdWVyeS5jYW1lbENhc2UoIFwiZGVmYXVsdC1cIiArIG5hbWUgKSBdID0gZWxlbVsgbmFtZSBdID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5cbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyO1xuXG5cdGlmICggZ2V0U2V0SW5wdXQgJiYgZ2V0U2V0QXR0cmlidXRlIHx8ICFydXNlRGVmYXVsdC50ZXN0KCBuYW1lICkgKSB7XG5cdFx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdFx0dmFyIHJldCwgaGFuZGxlO1xuXHRcdFx0aWYgKCAhaXNYTUwgKSB7XG5cblx0XHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0XHRoYW5kbGUgPSBhdHRySGFuZGxlWyBuYW1lIF07XG5cdFx0XHRcdGF0dHJIYW5kbGVbIG5hbWUgXSA9IHJldDtcblx0XHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRcdG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0bnVsbDtcblx0XHRcdFx0YXR0ckhhbmRsZVsgbmFtZSBdID0gaGFuZGxlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbVsgalF1ZXJ5LmNhbWVsQ2FzZSggXCJkZWZhdWx0LVwiICsgbmFtZSApIF0gP1xuXHRcdFx0XHRcdG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0bnVsbDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cbi8vIGZpeCBvbGRJRSBhdHRyb3BlcnRpZXNcbmlmICggIWdldFNldElucHV0IHx8ICFnZXRTZXRBdHRyaWJ1dGUgKSB7XG5cdGpRdWVyeS5hdHRySG9va3MudmFsdWUgPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cblx0XHRcdFx0Ly8gRG9lcyBub3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmlidXRlIGlzIGFsc28gdXNlZFxuXHRcdFx0XHRlbGVtLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBVc2Ugbm9kZUhvb2sgaWYgZGVmaW5lZCAoIzE5NTQpOyBvdGhlcndpc2Ugc2V0QXR0cmlidXRlIGlzIGZpbmVcblx0XHRcdFx0cmV0dXJuIG5vZGVIb29rICYmIG5vZGVIb29rLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIElFNi83IGRvIG5vdCBzdXBwb3J0IGdldHRpbmcvc2V0dGluZyBzb21lIGF0dHJpYnV0ZXMgd2l0aCBnZXQvc2V0QXR0cmlidXRlXG5pZiAoICFnZXRTZXRBdHRyaWJ1dGUgKSB7XG5cblx0Ly8gVXNlIHRoaXMgZm9yIGFueSBhdHRyaWJ1dGUgaW4gSUU2Lzdcblx0Ly8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWVcblx0bm9kZUhvb2sgPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cblx0XHRcdC8vIFNldCB0aGUgZXhpc3Rpbmcgb3IgY3JlYXRlIGEgbmV3IGF0dHJpYnV0ZSBub2RlXG5cdFx0XHR2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7XG5cdFx0XHRpZiAoICFyZXQgKSB7XG5cdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlTm9kZShcblx0XHRcdFx0XHQoIHJldCA9IGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoIG5hbWUgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldC52YWx1ZSA9IHZhbHVlICs9IFwiXCI7XG5cblx0XHRcdC8vIEJyZWFrIGFzc29jaWF0aW9uIHdpdGggY2xvbmVkIGVsZW1lbnRzIGJ5IGFsc28gdXNpbmcgc2V0QXR0cmlidXRlICgjOTY0Nilcblx0XHRcdGlmICggbmFtZSA9PT0gXCJ2YWx1ZVwiIHx8IHZhbHVlID09PSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApICkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8vIFNvbWUgYXR0cmlidXRlcyBhcmUgY29uc3RydWN0ZWQgd2l0aCBlbXB0eS1zdHJpbmcgdmFsdWVzIHdoZW4gbm90IGRlZmluZWRcblx0YXR0ckhhbmRsZS5pZCA9IGF0dHJIYW5kbGUubmFtZSA9IGF0dHJIYW5kbGUuY29vcmRzID1cblx0XHRmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0XHR2YXIgcmV0O1xuXHRcdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRcdHJldHVybiAoIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApICkgJiYgcmV0LnZhbHVlICE9PSBcIlwiID9cblx0XHRcdFx0XHRyZXQudmFsdWUgOlxuXHRcdFx0XHRcdG51bGw7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHQvLyBGaXhpbmcgdmFsdWUgcmV0cmlldmFsIG9uIGEgYnV0dG9uIHJlcXVpcmVzIHRoaXMgbW9kdWxlXG5cdGpRdWVyeS52YWxIb29rcy5idXR0b24gPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRcdHZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTtcblx0XHRcdGlmICggcmV0ICYmIHJldC5zcGVjaWZpZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQudmFsdWU7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZXQ6IG5vZGVIb29rLnNldFxuXHR9O1xuXG5cdC8vIFNldCBjb250ZW50ZWRpdGFibGUgdG8gZmFsc2Ugb24gcmVtb3ZhbHMoIzEwNDI5KVxuXHQvLyBTZXR0aW5nIHRvIGVtcHR5IHN0cmluZyB0aHJvd3MgYW4gZXJyb3IgYXMgYW4gaW52YWxpZCB2YWx1ZVxuXHRqUXVlcnkuYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZSA9IHtcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcblx0XHRcdG5vZGVIb29rLnNldCggZWxlbSwgdmFsdWUgPT09IFwiXCIgPyBmYWxzZSA6IHZhbHVlLCBuYW1lICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIFNldCB3aWR0aCBhbmQgaGVpZ2h0IHRvIGF1dG8gaW5zdGVhZCBvZiAwIG9uIGVtcHR5IHN0cmluZyggQnVnICM4MTUwIClcblx0Ly8gVGhpcyBpcyBmb3IgcmVtb3ZhbHNcblx0alF1ZXJ5LmVhY2goIFsgXCJ3aWR0aFwiLCBcImhlaWdodFwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHRcdGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcIlwiICkge1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBcImF1dG9cIiApO1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH0gKTtcbn1cblxuaWYgKCAhc3VwcG9ydC5zdHlsZSApIHtcblx0alF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBSZXR1cm4gdW5kZWZpbmVkIGluIHRoZSBjYXNlIG9mIGVtcHR5IHN0cmluZ1xuXHRcdFx0Ly8gTm90ZTogSUUgdXBwZXJjYXNlcyBjc3MgcHJvcGVydHkgbmFtZXMsIGJ1dCBpZiB3ZSB3ZXJlIHRvIC50b0xvd2VyQ2FzZSgpXG5cdFx0XHQvLyAuY3NzVGV4dCwgdGhhdCB3b3VsZCBkZXN0cm95IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gVVJMJ3MsIGxpa2UgaW4gXCJiYWNrZ3JvdW5kXCJcblx0XHRcdHJldHVybiBlbGVtLnN0eWxlLmNzc1RleHQgfHwgdW5kZWZpbmVkO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtLnN0eWxlLmNzc1RleHQgPSB2YWx1ZSArIFwiXCIgKTtcblx0XHR9XG5cdH07XG59XG5cblxuXG5cbnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksXG5cdHJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRuYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyB0cnkvY2F0Y2ggaGFuZGxlcyBjYXNlcyB3aGVyZSBJRSBiYWxrcyAoc3VjaCBhcyByZW1vdmluZyBhIHByb3BlcnR5IG9uIHdpbmRvdylcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXNbIG5hbWUgXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0ZGVsZXRlIHRoaXNbIG5hbWUgXTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rc1xuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVsZW1bIG5hbWUgXTtcblx0fSxcblxuXHRwcm9wSG9va3M6IHtcblx0XHR0YWJJbmRleDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvXG5cdFx0XHRcdC8vIFVzZSBwcm9wZXIgYXR0cmlidXRlIHJldHJpZXZhbCgjMTIwNzIpXG5cdFx0XHRcdHZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIFwidGFiaW5kZXhcIiApO1xuXG5cdFx0XHRcdHJldHVybiB0YWJpbmRleCA/XG5cdFx0XHRcdFx0cGFyc2VJbnQoIHRhYmluZGV4LCAxMCApIDpcblx0XHRcdFx0XHRyZm9jdXNhYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSB8fFxuXHRcdFx0XHRcdFx0cmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgZWxlbS5ocmVmID9cblx0XHRcdFx0XHRcdFx0MCA6XG5cdFx0XHRcdFx0XHRcdC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRwcm9wRml4OiB7XG5cdFx0XCJmb3JcIjogXCJodG1sRm9yXCIsXG5cdFx0XCJjbGFzc1wiOiBcImNsYXNzTmFtZVwiXG5cdH1cbn0gKTtcblxuLy8gU29tZSBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBzcGVjaWFsIGNhbGwgb24gSUVcbi8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHhcbmlmICggIXN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgKSB7XG5cblx0Ly8gaHJlZi9zcmMgcHJvcGVydHkgc2hvdWxkIGdldCB0aGUgZnVsbCBub3JtYWxpemVkIFVSTCAoIzEwMjk5LyMxMjkxNSlcblx0alF1ZXJ5LmVhY2goIFsgXCJocmVmXCIsIFwic3JjXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdFx0alF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdID0ge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCA0ICk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSApO1xufVxuXG4vLyBTdXBwb3J0OiBTYWZhcmksIElFOStcbi8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eVxuLy8gZm9yY2VzIHRoZSBicm93c2VyIHRvIHJlc3BlY3Qgc2V0dGluZyBzZWxlY3RlZFxuLy8gb24gdGhlIG9wdGlvblxuLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWRcbi8vIHdoZW4gaW4gYW4gb3B0Z3JvdXBcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBpdCBhbHNvIHdvcmtzIHdpdGggb3B0Z3JvdXBzLCBzZWUgIzU3MDFcblx0XHRcdFx0aWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdHBhcmVudC5zZWxlY3RlZEluZGV4O1xuXG5cdFx0XHRcdGlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxualF1ZXJ5LmVhY2goIFtcblx0XCJ0YWJJbmRleFwiLFxuXHRcInJlYWRPbmx5XCIsXG5cdFwibWF4TGVuZ3RoXCIsXG5cdFwiY2VsbFNwYWNpbmdcIixcblx0XCJjZWxsUGFkZGluZ1wiLFxuXHRcInJvd1NwYW5cIixcblx0XCJjb2xTcGFuXCIsXG5cdFwidXNlTWFwXCIsXG5cdFwiZnJhbWVCb3JkZXJcIixcblx0XCJjb250ZW50RWRpdGFibGVcIlxuXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS5wcm9wRml4WyB0aGlzLnRvTG93ZXJDYXNlKCkgXSA9IHRoaXM7XG59ICk7XG5cbi8vIElFNi83IGNhbGwgZW5jdHlwZSBlbmNvZGluZ1xuaWYgKCAhc3VwcG9ydC5lbmN0eXBlICkge1xuXHRqUXVlcnkucHJvcEZpeC5lbmN0eXBlID0gXCJlbmNvZGluZ1wiO1xufVxuXG5cblxuXG52YXIgcmNsYXNzID0gL1tcXHRcXHJcXG5cXGZdL2c7XG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmF0dHIoIGVsZW0sIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlICkge1xuXHRcdFx0Y2xhc3NlcyA9IHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHQoIFwiIFwiICsgY3VyVmFsdWUgKyBcIiBcIiApLnJlcGxhY2UoIHJjbGFzcywgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBvbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBqUXVlcnkudHJpbSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5hdHRyKCBlbGVtLCBcImNsYXNzXCIsIGZpbmFsVmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmF0dHIoIFwiY2xhc3NcIiwgXCJcIiApO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlICkge1xuXHRcdFx0Y2xhc3NlcyA9IHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdCggXCIgXCIgKyBjdXJWYWx1ZSArIFwiIFwiICkucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXNcblx0XHRcdFx0XHRcdHdoaWxlICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciA9IGN1ci5yZXBsYWNlKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIsIFwiIFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0galF1ZXJ5LnRyaW0oIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuYXR0ciggZWxlbSwgXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCIgJiYgdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoXG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggdGhpcywgaSwgZ2V0Q2xhc3MoIHRoaXMgKSwgc3RhdGVWYWwgKSxcblx0XHRcdFx0XHRzdGF0ZVZhbFxuXHRcdFx0XHQpO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lcztcblxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdC8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzXG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICk7XG5cdFx0XHRcdGNsYXNzTmFtZXMgPSB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0alF1ZXJ5Ll9kYXRhKCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBcImZhbHNlXCIsXG5cdFx0XHRcdC8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksXG5cdFx0XHRcdC8vIGZhbGxpbmcgYmFjayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cblx0XHRcdFx0alF1ZXJ5LmF0dHIoIHRoaXMsIFwiY2xhc3NcIixcblx0XHRcdFx0XHRjbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID9cblx0XHRcdFx0XHRcIlwiIDpcblx0XHRcdFx0XHRqUXVlcnkuX2RhdGEoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBjbGFzc05hbWUsIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGNsYXNzTmFtZSA9IFwiIFwiICsgc2VsZWN0b3IgKyBcIiBcIjtcblx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0KCBcIiBcIiArIGdldENsYXNzKCBlbGVtICkgKyBcIiBcIiApLnJlcGxhY2UoIHJjbGFzcywgXCIgXCIgKVxuXHRcdFx0XHRcdC5pbmRleE9mKCBjbGFzc05hbWUgKSA+IC0xXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5cbnZhciBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcblxudmFyIG5vbmNlID0galF1ZXJ5Lm5vdygpO1xuXG52YXIgcnF1ZXJ5ID0gKCAvXFw/LyApO1xuXG5cblxudmFyIHJ2YWxpZHRva2VucyA9IC8oLCl8KFxcW3x7KXwofXxdKXxcIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcW1wiXFxcXFxcL2JmbnJ0XXxcXFxcdVtcXGRhLWZBLUZdezR9KSpcIlxccyo6P3x0cnVlfGZhbHNlfG51bGx8LT8oPyEwXFxkKVxcZCsoPzpcXC5cXGQrfCkoPzpbZUVdWystXT9cXGQrfCkvZztcblxualF1ZXJ5LnBhcnNlSlNPTiA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXG5cdC8vIEF0dGVtcHQgdG8gcGFyc2UgdXNpbmcgdGhlIG5hdGl2ZSBKU09OIHBhcnNlciBmaXJzdFxuXHRpZiAoIHdpbmRvdy5KU09OICYmIHdpbmRvdy5KU09OLnBhcnNlICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjNcblx0XHQvLyBXb3JrYXJvdW5kIGZhaWx1cmUgdG8gc3RyaW5nLWNhc3QgbnVsbCBpbnB1dFxuXHRcdHJldHVybiB3aW5kb3cuSlNPTi5wYXJzZSggZGF0YSArIFwiXCIgKTtcblx0fVxuXG5cdHZhciByZXF1aXJlTm9uQ29tbWEsXG5cdFx0ZGVwdGggPSBudWxsLFxuXHRcdHN0ciA9IGpRdWVyeS50cmltKCBkYXRhICsgXCJcIiApO1xuXG5cdC8vIEd1YXJkIGFnYWluc3QgaW52YWxpZCAoYW5kIHBvc3NpYmx5IGRhbmdlcm91cykgaW5wdXQgYnkgZW5zdXJpbmcgdGhhdCBub3RoaW5nIHJlbWFpbnNcblx0Ly8gYWZ0ZXIgcmVtb3ZpbmcgdmFsaWQgdG9rZW5zXG5cdHJldHVybiBzdHIgJiYgIWpRdWVyeS50cmltKCBzdHIucmVwbGFjZSggcnZhbGlkdG9rZW5zLCBmdW5jdGlvbiggdG9rZW4sIGNvbW1hLCBvcGVuLCBjbG9zZSApIHtcblxuXHRcdC8vIEZvcmNlIHRlcm1pbmF0aW9uIGlmIHdlIHNlZSBhIG1pc3BsYWNlZCBjb21tYVxuXHRcdGlmICggcmVxdWlyZU5vbkNvbW1hICYmIGNvbW1hICkge1xuXHRcdFx0ZGVwdGggPSAwO1xuXHRcdH1cblxuXHRcdC8vIFBlcmZvcm0gbm8gbW9yZSByZXBsYWNlbWVudHMgYWZ0ZXIgcmV0dXJuaW5nIHRvIG91dGVybW9zdCBkZXB0aFxuXHRcdGlmICggZGVwdGggPT09IDAgKSB7XG5cdFx0XHRyZXR1cm4gdG9rZW47XG5cdFx0fVxuXG5cdFx0Ly8gQ29tbWFzIG11c3Qgbm90IGZvbGxvdyBcIltcIiwgXCJ7XCIsIG9yIFwiLFwiXG5cdFx0cmVxdWlyZU5vbkNvbW1hID0gb3BlbiB8fCBjb21tYTtcblxuXHRcdC8vIERldGVybWluZSBuZXcgZGVwdGhcblx0XHQvLyBhcnJheS9vYmplY3Qgb3BlbiAoXCJbXCIgb3IgXCJ7XCIpOiBkZXB0aCArPSB0cnVlIC0gZmFsc2UgKGluY3JlbWVudClcblx0XHQvLyBhcnJheS9vYmplY3QgY2xvc2UgKFwiXVwiIG9yIFwifVwiKTogZGVwdGggKz0gZmFsc2UgLSB0cnVlIChkZWNyZW1lbnQpXG5cdFx0Ly8gb3RoZXIgY2FzZXMgKFwiLFwiIG9yIHByaW1pdGl2ZSk6IGRlcHRoICs9IHRydWUgLSB0cnVlIChudW1lcmljIGNhc3QpXG5cdFx0ZGVwdGggKz0gIWNsb3NlIC0gIW9wZW47XG5cblx0XHQvLyBSZW1vdmUgdGhpcyB0b2tlblxuXHRcdHJldHVybiBcIlwiO1xuXHR9ICkgKSA/XG5cdFx0KCBGdW5jdGlvbiggXCJyZXR1cm4gXCIgKyBzdHIgKSApKCkgOlxuXHRcdGpRdWVyeS5lcnJvciggXCJJbnZhbGlkIEpTT046IFwiICsgZGF0YSApO1xufTtcblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbCwgdG1wO1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdHRyeSB7XG5cdFx0aWYgKCB3aW5kb3cuRE9NUGFyc2VyICkgeyAvLyBTdGFuZGFyZFxuXHRcdFx0dG1wID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcblx0XHRcdHhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHRcdH0gZWxzZSB7IC8vIElFXG5cdFx0XHR4bWwgPSBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoIFwiTWljcm9zb2Z0LlhNTERPTVwiICk7XG5cdFx0XHR4bWwuYXN5bmMgPSBcImZhbHNlXCI7XG5cdFx0XHR4bWwubG9hZFhNTCggZGF0YSApO1xuXHRcdH1cblx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0eG1sID0gdW5kZWZpbmVkO1xuXHR9XG5cdGlmICggIXhtbCB8fCAheG1sLmRvY3VtZW50RWxlbWVudCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyaGFzaCA9IC8jLiokLyxcblx0cnRzID0gLyhbPyZdKV89W14mXSovLFxuXG5cdC8vIElFIGxlYXZlcyBhbiBcXHIgY2hhcmFjdGVyIGF0IEVPTFxuXHRyaGVhZGVycyA9IC9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKVxccj8kL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXHRydXJsID0gL14oW1xcdy4rLV0rOikoPzpcXC9cXC8oPzpbXlxcLz8jXSpAfCkoW15cXC8/IzpdKikoPzo6KFxcZCspfCl8KS8sXG5cblx0LyogUHJlZmlsdGVyc1xuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxuXHQgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOlxuXHQgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0XG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcblx0ICogMykga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHRwcmVmaWx0ZXJzID0ge30sXG5cblx0LyogVHJhbnNwb3J0cyBiaW5kaW5nc1xuXHQgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHR0cmFuc3BvcnRzID0ge30sXG5cblx0Ly8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uXG5cdGFsbFR5cGVzID0gXCIqL1wiLmNvbmNhdCggXCIqXCIgKSxcblxuXHQvLyBEb2N1bWVudCBsb2NhdGlvblxuXHRhamF4TG9jYXRpb24gPSBsb2NhdGlvbi5ocmVmLFxuXG5cdC8vIFNlZ21lbnQgbG9jYXRpb24gaW50byBwYXJ0c1xuXHRhamF4TG9jUGFydHMgPSBydXJsLmV4ZWMoIGFqYXhMb2NhdGlvbi50b0xvd2VyQ2FzZSgpICkgfHwgW107XG5cbi8vIEJhc2UgXCJjb25zdHJ1Y3RvclwiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnRcbmZ1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkge1xuXG5cdC8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gXCIqXCJcblx0cmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uO1xuXHRcdFx0ZGF0YVR5cGVFeHByZXNzaW9uID0gXCIqXCI7XG5cdFx0fVxuXG5cdFx0dmFyIGRhdGFUeXBlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7XG5cblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKCBkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlLmNoYXJBdCggMCApID09PSBcIitcIiApIHtcblx0XHRcdFx0XHRkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgXCIqXCI7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS51bnNoaWZ0KCBmdW5jICk7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkucHVzaCggZnVuYyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG4vLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHNcbmZ1bmN0aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKSB7XG5cblx0dmFyIGluc3BlY3RlZCA9IHt9LFxuXHRcdHNlZWtpbmdUcmFuc3BvcnQgPSAoIHN0cnVjdHVyZSA9PT0gdHJhbnNwb3J0cyApO1xuXG5cdGZ1bmN0aW9uIGluc3BlY3QoIGRhdGFUeXBlICkge1xuXHRcdHZhciBzZWxlY3RlZDtcblx0XHRpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlO1xuXHRcdGpRdWVyeS5lYWNoKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10sIGZ1bmN0aW9uKCBfLCBwcmVmaWx0ZXJPckZhY3RvcnkgKSB7XG5cdFx0XHR2YXIgZGF0YVR5cGVPclRyYW5zcG9ydCA9IHByZWZpbHRlck9yRmFjdG9yeSggb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApO1xuXHRcdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQhc2Vla2luZ1RyYW5zcG9ydCAmJiAhaW5zcGVjdGVkWyBkYXRhVHlwZU9yVHJhbnNwb3J0IF0gKSB7XG5cblx0XHRcdFx0b3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7XG5cdFx0XHRcdHJldHVybiAhKCBzZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdFx0cmV0dXJuIHNlbGVjdGVkO1xuXHR9XG5cblx0cmV0dXJuIGluc3BlY3QoIG9wdGlvbnMuZGF0YVR5cGVzWyAwIF0gKSB8fCAhaW5zcGVjdGVkWyBcIipcIiBdICYmIGluc3BlY3QoIFwiKlwiICk7XG59XG5cbi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9uc1xuLy8gdGhhdCB0YWtlcyBcImZsYXRcIiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZClcbi8vIEZpeGVzICM5ODg3XG5mdW5jdGlvbiBhamF4RXh0ZW5kKCB0YXJnZXQsIHNyYyApIHtcblx0dmFyIGRlZXAsIGtleSxcblx0XHRmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMgfHwge307XG5cblx0Zm9yICgga2V5IGluIHNyYyApIHtcblx0XHRpZiAoIHNyY1sga2V5IF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdCggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07XG5cdFx0fVxuXHR9XG5cdGlmICggZGVlcCApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDpcbiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpXG4gKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VcbiAqL1xuZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHtcblx0dmFyIGZpcnN0RGF0YVR5cGUsIGN0LCBmaW5hbERhdGFUeXBlLCB0eXBlLFxuXHRcdGNvbnRlbnRzID0gcy5jb250ZW50cyxcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcztcblxuXHQvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzc1xuXHR3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcblx0XHRkYXRhVHlwZXMuc2hpZnQoKTtcblx0XHRpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblxuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWyAwIF0gXSApIHtcblx0XHRcdFx0ZmluYWxEYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhZmlyc3REYXRhVHlwZSApIHtcblx0XHRcdFx0Zmlyc3REYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHRcdC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG9cblx0XHRcdGlmICggY3VycmVudCA9PT0gXCIqXCIgKSB7XG5cblx0XHRcdFx0Y3VycmVudCA9IHByZXY7XG5cblx0XHRcdC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnRcblx0XHRcdH0gZWxzZSBpZiAoIHByZXYgIT09IFwiKlwiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXJcblx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyBcIiogXCIgKyBjdXJyZW50IF07XG5cblx0XHRcdFx0Ly8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXJcblx0XHRcdFx0aWYgKCAhY29udiApIHtcblx0XHRcdFx0XHRmb3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnRcblx0XHRcdFx0XHRcdHRtcCA9IGNvbnYyLnNwbGl0KCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0aWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXRcblx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIHRtcFsgMCBdIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJzWyBcIiogXCIgKyB0bXBbIDAgXSBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHNbIFwidGhyb3dzXCIgXSApIHsgLy8ganNjczppZ25vcmUgcmVxdWlyZURvdE5vdGF0aW9uXG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlOiBcInBhcnNlcmVycm9yXCIsXG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGNvbnYgPyBlIDogXCJObyBjb252ZXJzaW9uIGZyb20gXCIgKyBwcmV2ICsgXCIgdG8gXCIgKyBjdXJyZW50XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzXG5cdGFjdGl2ZTogMCxcblxuXHQvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0XG5cdGxhc3RNb2RpZmllZDoge30sXG5cdGV0YWc6IHt9LFxuXG5cdGFqYXhTZXR0aW5nczoge1xuXHRcdHVybDogYWpheExvY2F0aW9uLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggYWpheExvY1BhcnRzWyAxIF0gKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cdFx0Lypcblx0XHR0aW1lb3V0OiAwLFxuXHRcdGRhdGE6IG51bGwsXG5cdFx0ZGF0YVR5cGU6IG51bGwsXG5cdFx0dXNlcm5hbWU6IG51bGwsXG5cdFx0cGFzc3dvcmQ6IG51bGwsXG5cdFx0Y2FjaGU6IG51bGwsXG5cdFx0dGhyb3dzOiBmYWxzZSxcblx0XHR0cmFkaXRpb25hbDogZmFsc2UsXG5cdFx0aGVhZGVyczoge30sXG5cdFx0Ki9cblxuXHRcdGFjY2VwdHM6IHtcblx0XHRcdFwiKlwiOiBhbGxUeXBlcyxcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxuXHRcdFx0aHRtbDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiXG5cdFx0fSxcblxuXHRcdGNvbnRlbnRzOiB7XG5cdFx0XHR4bWw6IC9cXGJ4bWxcXGIvLFxuXHRcdFx0aHRtbDogL1xcYmh0bWwvLFxuXHRcdFx0anNvbjogL1xcYmpzb25cXGIvXG5cdFx0fSxcblxuXHRcdHJlc3BvbnNlRmllbGRzOiB7XG5cdFx0XHR4bWw6IFwicmVzcG9uc2VYTUxcIixcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCIsXG5cdFx0XHRqc29uOiBcInJlc3BvbnNlSlNPTlwiXG5cdFx0fSxcblxuXHRcdC8vIERhdGEgY29udmVydGVyc1xuXHRcdC8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCBcIipcIikgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIHdpdGggYSBzaW5nbGUgc3BhY2Vcblx0XHRjb252ZXJ0ZXJzOiB7XG5cblx0XHRcdC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dFxuXHRcdFx0XCIqIHRleHRcIjogU3RyaW5nLFxuXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcblx0XHRcdFwidGV4dCBodG1sXCI6IHRydWUsXG5cblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cblx0XHRcdFwidGV4dCBqc29uXCI6IGpRdWVyeS5wYXJzZUpTT04sXG5cblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXG5cdFx0XHRcInRleHQgeG1sXCI6IGpRdWVyeS5wYXJzZVhNTFxuXHRcdH0sXG5cblx0XHQvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOlxuXHRcdC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWZcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxuXHRcdC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKVxuXHRcdGZsYXRPcHRpb25zOiB7XG5cdFx0XHR1cmw6IHRydWUsXG5cdFx0XHRjb250ZXh0OiB0cnVlXG5cdFx0fVxuXHR9LFxuXG5cdC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0XG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cblx0Ly8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy5cblx0YWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MgP1xuXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxuXHRcdFx0YWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOlxuXG5cdFx0XHQvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzXG5cdFx0XHRhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTtcblx0fSxcblxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcblx0YWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksXG5cblx0Ly8gTWFpbiBtZXRob2Rcblx0YWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHtcblxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXG5cdFx0aWYgKCB0eXBlb2YgdXJsID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0b3B0aW9ucyA9IHVybDtcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dmFyXG5cblx0XHRcdC8vIENyb3NzLWRvbWFpbiBkZXRlY3Rpb24gdmFyc1xuXHRcdFx0cGFydHMsXG5cblx0XHRcdC8vIExvb3AgdmFyaWFibGVcblx0XHRcdGksXG5cblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzIGFzIHN0cmluZ1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHR0cmFuc3BvcnQsXG5cblx0XHRcdC8vIFJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVycyxcblxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxuXHRcdFx0cyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksXG5cblx0XHRcdC8vIENhbGxiYWNrcyBjb250ZXh0XG5cdFx0XHRjYWxsYmFja0NvbnRleHQgPSBzLmNvbnRleHQgfHwgcyxcblxuXHRcdFx0Ly8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvblxuXHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmXG5cdFx0XHRcdCggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/XG5cdFx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LFxuXG5cdFx0XHQvLyBEZWZlcnJlZHNcblx0XHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LFxuXG5cdFx0XHQvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFsbCBhdCBvbmNlKVxuXHRcdFx0cmVxdWVzdEhlYWRlcnMgPSB7fSxcblx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSxcblxuXHRcdFx0Ly8gVGhlIGpxWEhSIHN0YXRlXG5cdFx0XHRzdGF0ZSA9IDAsXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRcdFx0aWYgKCAhcmVzcG9uc2VIZWFkZXJzICkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnMgPSB7fTtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bWF0Y2ggPSByZXNwb25zZUhlYWRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBtYXRjaCA9PSBudWxsID8gbnVsbCA6IG1hdGNoO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFJhdyBzdHJpbmdcblx0XHRcdFx0Z2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGUgPT09IDIgPyByZXNwb25zZUhlYWRlcnNTdHJpbmcgOiBudWxsO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhY2hlcyB0aGUgaGVhZGVyXG5cdFx0XHRcdHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdFx0XHR2YXIgbG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0aWYgKCAhc3RhdGUgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gfHwgbmFtZTtcblx0XHRcdFx0XHRcdHJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQtdHlwZSBoZWFkZXJcblx0XHRcdFx0b3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0aWYgKCAhc3RhdGUgKSB7XG5cdFx0XHRcdFx0XHRzLm1pbWVUeXBlID0gdHlwZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdFx0c3RhdHVzQ29kZTogZnVuY3Rpb24oIG1hcCApIHtcblx0XHRcdFx0XHR2YXIgY29kZTtcblx0XHRcdFx0XHRpZiAoIG1hcCApIHtcblx0XHRcdFx0XHRcdGlmICggc3RhdGUgPCAyICkge1xuXHRcdFx0XHRcdFx0XHRmb3IgKCBjb2RlIGluIG1hcCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2sgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgb2xkIG9uZXNcblx0XHRcdFx0XHRcdFx0XHRzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApLmNvbXBsZXRlID0gY29tcGxldGVEZWZlcnJlZC5hZGQ7XG5cdFx0anFYSFIuc3VjY2VzcyA9IGpxWEhSLmRvbmU7XG5cdFx0anFYSFIuZXJyb3IgPSBqcVhIUi5mYWlsO1xuXG5cdFx0Ly8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUzMTogYW5kIHN0cmluZyBwcm9tb3Rpb24pXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAoIzU4NjY6IElFNyBpc3N1ZSB3aXRoIHByb3RvY29sLWxlc3MgdXJscylcblx0XHQvLyBIYW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVuY3kgd2l0aCBvbGQgc2lnbmF0dXJlKVxuXHRcdC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1ldGVyIGlmIGF2YWlsYWJsZVxuXHRcdHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBhamF4TG9jYXRpb24gKSArIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJoYXNoLCBcIlwiIClcblx0XHRcdC5yZXBsYWNlKCBycHJvdG9jb2wsIGFqYXhMb2NQYXJ0c1sgMSBdICsgXCIvL1wiICk7XG5cblx0XHQvLyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMgcGVyIHRpY2tldCAjMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0galF1ZXJ5LnRyaW0oIHMuZGF0YVR5cGUgfHwgXCIqXCIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB3ZSBoYXZlIGEgcHJvdG9jb2w6aG9zdDpwb3J0IG1pc21hdGNoXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHRwYXJ0cyA9IHJ1cmwuZXhlYyggcy51cmwudG9Mb3dlckNhc2UoKSApO1xuXHRcdFx0cy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAmJlxuXHRcdFx0XHQoIHBhcnRzWyAxIF0gIT09IGFqYXhMb2NQYXJ0c1sgMSBdIHx8IHBhcnRzWyAyIF0gIT09IGFqYXhMb2NQYXJ0c1sgMiBdIHx8XG5cdFx0XHRcdFx0KCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gXCJodHRwOlwiID8gXCI4MFwiIDogXCI0NDNcIiApICkgIT09XG5cdFx0XHRcdFx0XHQoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09IFwiaHR0cDpcIiA/IFwiODBcIiA6IFwiNDQzXCIgKSApIClcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nXG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwcmVmaWx0ZXJzXG5cdFx0aW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZVxuXHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHRjYWNoZVVSTCA9IHMudXJsO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9ICggcy51cmwgKz0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuZGF0YSApO1xuXG5cdFx0XHRcdC8vICM5NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnlcblx0XHRcdFx0ZGVsZXRlIHMuZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGFudGktY2FjaGUgaW4gdXJsIGlmIG5lZWRlZFxuXHRcdFx0aWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHtcblx0XHRcdFx0cy51cmwgPSBydHMudGVzdCggY2FjaGVVUkwgKSA/XG5cblx0XHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgJ18nIHBhcmFtZXRlciwgc2V0IGl0cyB2YWx1ZVxuXHRcdFx0XHRcdGNhY2hlVVJMLnJlcGxhY2UoIHJ0cywgXCIkMV89XCIgKyBub25jZSsrICkgOlxuXG5cdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGFkZCBvbmUgdG8gdGhlIGVuZFxuXHRcdFx0XHRcdGNhY2hlVVJMICsgKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIFwiXz1cIiArIG5vbmNlKys7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Nb2RpZmllZC1TaW5jZVwiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU5vbmUtTWF0Y2hcIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnRcblx0XHRpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIsIHMuY29udGVudFR5cGUgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlXG5cdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlcihcblx0XHRcdFwiQWNjZXB0XCIsXG5cdFx0XHRzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gK1xuXHRcdFx0XHRcdCggcy5kYXRhVHlwZXNbIDAgXSAhPT0gXCIqXCIgPyBcIiwgXCIgKyBhbGxUeXBlcyArIFwiOyBxPTAuMDFcIiA6IFwiXCIgKSA6XG5cdFx0XHRcdHMuYWNjZXB0c1sgXCIqXCIgXVxuXHRcdCk7XG5cblx0XHQvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb25cblx0XHRmb3IgKCBpIGluIHMuaGVhZGVycyApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydFxuXHRcdGlmICggcy5iZWZvcmVTZW5kICYmXG5cdFx0XHQoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IHN0YXRlID09PSAyICkgKSB7XG5cblx0XHRcdC8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVyblxuXHRcdFx0cmV0dXJuIGpxWEhSLmFib3J0KCk7XG5cdFx0fVxuXG5cdFx0Ly8gYWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uXG5cdFx0c3RyQWJvcnQgPSBcImFib3J0XCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrcyBvbiBkZWZlcnJlZHNcblx0XHRmb3IgKCBpIGluIHsgc3VjY2VzczogMSwgZXJyb3I6IDEsIGNvbXBsZXRlOiAxIH0gKSB7XG5cdFx0XHRqcVhIUlsgaSBdKCBzWyBpIF0gKTtcblx0XHR9XG5cblx0XHQvLyBHZXQgdHJhbnNwb3J0XG5cdFx0dHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnRcblx0XHRpZiAoICF0cmFuc3BvcnQgKSB7XG5cdFx0XHRkb25lKCAtMSwgXCJObyBUcmFuc3BvcnRcIiApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gMTtcblxuXHRcdFx0Ly8gU2VuZCBnbG9iYWwgZXZlbnRcblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhTZW5kXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhamF4U2VuZCwgc3RvcCB0aGVyZVxuXHRcdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcblx0XHRcdFx0cmV0dXJuIGpxWEhSO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaW1lb3V0XG5cdFx0XHRpZiAoIHMuYXN5bmMgJiYgcy50aW1lb3V0ID4gMCApIHtcblx0XHRcdFx0dGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGpxWEhSLmFib3J0KCBcInRpbWVvdXRcIiApO1xuXHRcdFx0XHR9LCBzLnRpbWVvdXQgKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0c3RhdGUgPSAxO1xuXHRcdFx0XHR0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBleGNlcHRpb24gYXMgZXJyb3IgaWYgbm90IGRvbmVcblx0XHRcdFx0aWYgKCBzdGF0ZSA8IDIgKSB7XG5cdFx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblxuXHRcdFx0XHQvLyBTaW1wbHkgcmV0aHJvdyBvdGhlcndpc2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGJhY2sgZm9yIHdoZW4gZXZlcnl0aGluZyBpcyBkb25lXG5cdFx0ZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7XG5cdFx0XHR2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLFxuXHRcdFx0XHRzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dDtcblxuXHRcdFx0Ly8gQ2FsbGVkIG9uY2Vcblx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdGUgaXMgXCJkb25lXCIgbm93XG5cdFx0XHRzdGF0ZSA9IDI7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldClcblx0XHRcdHJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7XG5cblx0XHRcdC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkxhc3QtTW9kaWZpZWRcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiZXRhZ1wiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaWYgbm8gY29udGVudFxuXHRcdFx0XHRpZiAoIHN0YXR1cyA9PT0gMjA0IHx8IHMudHlwZSA9PT0gXCJIRUFEXCIgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm9jb250ZW50XCI7XG5cblx0XHRcdFx0Ly8gaWYgbm90IG1vZGlmaWVkXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vdG1vZGlmaWVkXCI7XG5cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBkYXRhLCBsZXQncyBjb252ZXJ0IGl0XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlO1xuXHRcdFx0XHRcdHN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdGVycm9yID0gcmVzcG9uc2UuZXJyb3I7XG5cdFx0XHRcdFx0aXNTdWNjZXNzID0gIWVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIFdlIGV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0XG5cdFx0XHRcdC8vIHRoZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlclxuXHRcdFx0XHRpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdG9wXCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImdldFwiLCBcInBvc3RcIiBdLCBmdW5jdGlvbiggaSwgbWV0aG9kICkge1xuXHRqUXVlcnlbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7XG5cblx0XHQvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZFxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBUaGUgdXJsIGNhbiBiZSBhbiBvcHRpb25zIG9iamVjdCAod2hpY2ggdGhlbiBtdXN0IGhhdmUgLnVybClcblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoIGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdHVybDogdXJsLFxuXHRcdFx0dHlwZTogbWV0aG9kLFxuXHRcdFx0ZGF0YVR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0c3VjY2VzczogY2FsbGJhY2tcblx0XHR9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTtcblx0fTtcbn0gKTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkge1xuXHRyZXR1cm4galF1ZXJ5LmFqYXgoIHtcblx0XHR1cmw6IHVybCxcblxuXHRcdC8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KVxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0Y2FjaGU6IHRydWUsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cdFx0XCJ0aHJvd3NcIjogdHJ1ZVxuXHR9ICk7XG59O1xuXG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0d3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwuY2FsbCggdGhpcywgaSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7XG5cblx0XHRcdGlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0d3JhcC5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgJiYgZWxlbS5maXJzdENoaWxkLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLFxuXHRcdFx0XHRjb250ZW50cyA9IHNlbGYuY29udGVudHMoKTtcblxuXHRcdFx0aWYgKCBjb250ZW50cy5sZW5ndGggKSB7XG5cdFx0XHRcdGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi5hcHBlbmQoIGh0bWwgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0d3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsIFwiYm9keVwiICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHRcdH1cblx0XHR9ICkuZW5kKCk7XG5cdH1cbn0gKTtcblxuXG5mdW5jdGlvbiBnZXREaXNwbGF5KCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5zdHlsZSAmJiBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVySGlkZGVuKCBlbGVtICkge1xuXG5cdC8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCBoaWRkZW5cblx0aWYgKCAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQsIGVsZW0gKSApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHR3aGlsZSAoIGVsZW0gJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRpZiAoIGdldERpc3BsYXkoIGVsZW0gKSA9PT0gXCJub25lXCIgfHwgZWxlbS50eXBlID09PSBcImhpZGRlblwiICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5qUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdC8vIFN1cHBvcnQ6IE9wZXJhIDw9IDEyLjEyXG5cdC8vIE9wZXJhIHJlcG9ydHMgb2Zmc2V0V2lkdGhzIGFuZCBvZmZzZXRIZWlnaHRzIGxlc3MgdGhhbiB6ZXJvIG9uIHNvbWUgZWxlbWVudHNcblx0cmV0dXJuIHN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzKCkgP1xuXHRcdCggZWxlbS5vZmZzZXRXaWR0aCA8PSAwICYmIGVsZW0ub2Zmc2V0SGVpZ2h0IDw9IDAgJiZcblx0XHRcdCFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICkgOlxuXHRcdFx0ZmlsdGVySGlkZGVuKCBlbGVtICk7XG59O1xuXG5qUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiggZWxlbSApO1xufTtcblxuXG5cblxudmFyIHIyMCA9IC8lMjAvZyxcblx0cmJyYWNrZXQgPSAvXFxbXFxdJC8sXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcblx0cnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFxuXHRyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7XG5cbmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHtcblx0dmFyIG5hbWU7XG5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggb2JqICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS5cblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcblx0XHRcdGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7XG5cblx0XHRcdFx0Ly8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLlxuXHRcdFx0XHRhZGQoIHByZWZpeCwgdiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LlxuXHRcdFx0XHRidWlsZFBhcmFtcyhcblx0XHRcdFx0XHRwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPSBudWxsID8gaSA6IFwiXCIgKSArIFwiXVwiLFxuXHRcdFx0XHRcdHYsXG5cdFx0XHRcdFx0dHJhZGl0aW9uYWwsXG5cdFx0XHRcdFx0YWRkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSggb2JqICkgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyBuYW1lICsgXCJdXCIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uXG5cdFx0YWRkKCBwcmVmaXgsIG9iaiApO1xuXHR9XG59XG5cbi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mXG4vLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmdcbmpRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0cmFkaXRpb25hbCApIHtcblx0dmFyIHByZWZpeCxcblx0XHRzID0gW10sXG5cdFx0YWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZVxuXHRcdFx0dmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlICk7XG5cdFx0fTtcblxuXHQvLyBTZXQgdHJhZGl0aW9uYWwgdG8gdHJ1ZSBmb3IgalF1ZXJ5IDw9IDEuMy4yIGJlaGF2aW9yLlxuXHRpZiAoIHRyYWRpdGlvbmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0dHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzICYmIGpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7XG5cdH1cblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIGpRdWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XG5cdH0sXG5cdHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDYW4gYWRkIHByb3BIb29rIGZvciBcImVsZW1lbnRzXCIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzXG5cdFx0XHR2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgXCJlbGVtZW50c1wiICk7XG5cdFx0XHRyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpcztcblx0XHR9IClcblx0XHQuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKFwiOmRpc2FibGVkXCIpIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzXG5cdFx0XHRyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggXCI6ZGlzYWJsZWRcIiApICYmXG5cdFx0XHRcdHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiZcblx0XHRcdFx0KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApO1xuXHRcdH0gKVxuXHRcdC5tYXAoIGZ1bmN0aW9uKCBpLCBlbGVtICkge1xuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xuXG5cdFx0XHRyZXR1cm4gdmFsID09IG51bGwgP1xuXHRcdFx0XHRudWxsIDpcblx0XHRcdFx0alF1ZXJ5LmlzQXJyYXkoIHZhbCApID9cblx0XHRcdFx0XHRqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdFx0XHRcdH0gKSA6XG5cdFx0XHRcdFx0eyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdH0gKS5nZXQoKTtcblx0fVxufSApO1xuXG5cbi8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3Rcbi8vIChUaGlzIGlzIHN0aWxsIGF0dGFjaGVkIHRvIGFqYXhTZXR0aW5ncyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gd2luZG93LkFjdGl2ZVhPYmplY3QgIT09IHVuZGVmaW5lZCA/XG5cblx0Ly8gU3VwcG9ydDogSUU2LUlFOFxuXHRmdW5jdGlvbigpIHtcblxuXHRcdC8vIFhIUiBjYW5ub3QgYWNjZXNzIGxvY2FsIGZpbGVzLCBhbHdheXMgdXNlIEFjdGl2ZVggZm9yIHRoYXQgY2FzZVxuXHRcdGlmICggdGhpcy5pc0xvY2FsICkge1xuXHRcdFx0cmV0dXJuIGNyZWF0ZUFjdGl2ZVhIUigpO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IElFIDktMTFcblx0XHQvLyBJRSBzZWVtcyB0byBlcnJvciBvbiBjcm9zcy1kb21haW4gUEFUQ0ggcmVxdWVzdHMgd2hlbiBBY3RpdmVYIFhIUlxuXHRcdC8vIGlzIHVzZWQuIEluIElFIDkrIGFsd2F5cyB1c2UgdGhlIG5hdGl2ZSBYSFIuXG5cdFx0Ly8gTm90ZTogdGhpcyBjb25kaXRpb24gd29uJ3QgY2F0Y2ggRWRnZSBhcyBpdCBkb2Vzbid0IGRlZmluZVxuXHRcdC8vIGRvY3VtZW50LmRvY3VtZW50TW9kZSBidXQgaXQgYWxzbyBkb2Vzbid0IHN1cHBvcnQgQWN0aXZlWCBzbyBpdCB3b24ndFxuXHRcdC8vIHJlYWNoIHRoaXMgY29kZS5cblx0XHRpZiAoIGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDggKSB7XG5cdFx0XHRyZXR1cm4gY3JlYXRlU3RhbmRhcmRYSFIoKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gb2xkSUUgWEhSIGRvZXMgbm90IHN1cHBvcnQgbm9uLVJGQzI2MTYgbWV0aG9kcyAoIzEzMjQwKVxuXHRcdC8vIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvbXM1MzY2NDgodj12cy44NSkuYXNweFxuXHRcdC8vIGFuZCBodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzkuaHRtbCNzZWM5XG5cdFx0Ly8gQWx0aG91Z2ggdGhpcyBjaGVjayBmb3Igc2l4IG1ldGhvZHMgaW5zdGVhZCBvZiBlaWdodFxuXHRcdC8vIHNpbmNlIElFIGFsc28gZG9lcyBub3Qgc3VwcG9ydCBcInRyYWNlXCIgYW5kIFwiY29ubmVjdFwiXG5cdFx0cmV0dXJuIC9eKGdldHxwb3N0fGhlYWR8cHV0fGRlbGV0ZXxvcHRpb25zKSQvaS50ZXN0KCB0aGlzLnR5cGUgKSAmJlxuXHRcdFx0Y3JlYXRlU3RhbmRhcmRYSFIoKSB8fCBjcmVhdGVBY3RpdmVYSFIoKTtcblx0fSA6XG5cblx0Ly8gRm9yIGFsbCBvdGhlciBicm93c2VycywgdXNlIHRoZSBzdGFuZGFyZCBYTUxIdHRwUmVxdWVzdCBvYmplY3Rcblx0Y3JlYXRlU3RhbmRhcmRYSFI7XG5cbnZhciB4aHJJZCA9IDAsXG5cdHhockNhbGxiYWNrcyA9IHt9LFxuXHR4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpO1xuXG4vLyBTdXBwb3J0OiBJRTwxMFxuLy8gT3BlbiByZXF1ZXN0cyBtdXN0IGJlIG1hbnVhbGx5IGFib3J0ZWQgb24gdW5sb2FkICgjNTI4MClcbi8vIFNlZSBodHRwczovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8yODU2NzQ2IGZvciBtb3JlIGluZm9cbmlmICggd2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHR3aW5kb3cuYXR0YWNoRXZlbnQoIFwib251bmxvYWRcIiwgZnVuY3Rpb24oKSB7XG5cdFx0Zm9yICggdmFyIGtleSBpbiB4aHJDYWxsYmFja3MgKSB7XG5cdFx0XHR4aHJDYWxsYmFja3NbIGtleSBdKCB1bmRlZmluZWQsIHRydWUgKTtcblx0XHR9XG5cdH0gKTtcbn1cblxuLy8gRGV0ZXJtaW5lIHN1cHBvcnQgcHJvcGVydGllc1xuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xueGhyU3VwcG9ydGVkID0gc3VwcG9ydC5hamF4ID0gISF4aHJTdXBwb3J0ZWQ7XG5cbi8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyXG5pZiAoIHhoclN1cHBvcnRlZCApIHtcblxuXHRqUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiB8fCBzdXBwb3J0LmNvcnMgKSB7XG5cblx0XHRcdHZhciBjYWxsYmFjaztcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdFx0eGhyID0gb3B0aW9ucy54aHIoKSxcblx0XHRcdFx0XHRcdGlkID0gKyt4aHJJZDtcblxuXHRcdFx0XHRcdC8vIE9wZW4gdGhlIHNvY2tldFxuXHRcdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdFx0b3B0aW9ucy50eXBlLFxuXHRcdFx0XHRcdFx0b3B0aW9ucy51cmwsXG5cdFx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdFx0b3B0aW9ucy51c2VybmFtZSxcblx0XHRcdFx0XHRcdG9wdGlvbnMucGFzc3dvcmRcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRcdGlmICggb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRcdGlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHtcblx0XHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXJcblx0XHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0XHQvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhTZXR1cClcblx0XHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdICkge1xuXHRcdFx0XHRcdFx0aGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSA9IFwiWE1MSHR0cFJlcXVlc3RcIjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTZXQgaGVhZGVyc1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gaGVhZGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdFx0XHRcdFx0Ly8gSUUncyBBY3RpdmVYT2JqZWN0IHRocm93cyBhICdUeXBlIE1pc21hdGNoJyBleGNlcHRpb24gd2hlbiBzZXR0aW5nXG5cdFx0XHRcdFx0XHQvLyByZXF1ZXN0IGhlYWRlciB0byBhIG51bGwtdmFsdWUuXG5cdFx0XHRcdFx0XHQvL1xuXHRcdFx0XHRcdFx0Ly8gVG8ga2VlcCBjb25zaXN0ZW50IHdpdGggb3RoZXIgWEhSIGltcGxlbWVudGF0aW9ucywgY2FzdCB0aGUgdmFsdWVcblx0XHRcdFx0XHRcdC8vIHRvIHN0cmluZyBhbmQgaWdub3JlIGB1bmRlZmluZWRgLlxuXHRcdFx0XHRcdFx0aWYgKCBoZWFkZXJzWyBpIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSArIFwiXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0XG5cdFx0XHRcdFx0Ly8gVGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uIHdoaWNoIGlzIGFjdHVhbGx5XG5cdFx0XHRcdFx0Ly8gaGFuZGxlZCBpbiBqUXVlcnkuYWpheCAoc28gbm8gdHJ5L2NhdGNoIGhlcmUpXG5cdFx0XHRcdFx0eGhyLnNlbmQoICggb3B0aW9ucy5oYXNDb250ZW50ICYmIG9wdGlvbnMuZGF0YSApIHx8IG51bGwgKTtcblxuXHRcdFx0XHRcdC8vIExpc3RlbmVyXG5cdFx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHtcblx0XHRcdFx0XHRcdHZhciBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcztcblxuXHRcdFx0XHRcdFx0Ly8gV2FzIG5ldmVyIGNhbGxlZCBhbmQgaXMgYWJvcnRlZCBvciBjb21wbGV0ZVxuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayAmJiAoIGlzQWJvcnQgfHwgeGhyLnJlYWR5U3RhdGUgPT09IDQgKSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBDbGVhbiB1cFxuXHRcdFx0XHRcdFx0XHRkZWxldGUgeGhyQ2FsbGJhY2tzWyBpZCBdO1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGpRdWVyeS5ub29wO1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFib3J0IG1hbnVhbGx5IGlmIG5lZWRlZFxuXHRcdFx0XHRcdFx0XHRpZiAoIGlzQWJvcnQgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB4aHIucmVhZHlTdGF0ZSAhPT0gNCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZXMgPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRzdGF0dXMgPSB4aHIuc3RhdHVzO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8MTBcblx0XHRcdFx0XHRcdFx0XHQvLyBBY2Nlc3NpbmcgYmluYXJ5LWRhdGEgcmVzcG9uc2VUZXh0IHRocm93cyBhbiBleGNlcHRpb25cblx0XHRcdFx0XHRcdFx0XHQvLyAoIzExNDI2KVxuXHRcdFx0XHRcdFx0XHRcdGlmICggdHlwZW9mIHhoci5yZXNwb25zZVRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZXMudGV4dCA9IHhoci5yZXNwb25zZVRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmlyZWZveCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gYWNjZXNzaW5nXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc3RhdHVzVGV4dCBmb3IgZmF1bHR5IGNyb3NzLWRvbWFpbiByZXF1ZXN0c1xuXHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0dXNUZXh0ID0geGhyLnN0YXR1c1RleHQ7XG5cdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFdlIG5vcm1hbGl6ZSB3aXRoIFdlYmtpdCBnaXZpbmcgYW4gZW1wdHkgc3RhdHVzVGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmlsdGVyIHN0YXR1cyBmb3Igbm9uIHN0YW5kYXJkIGJlaGF2aW9yc1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHJlcXVlc3QgaXMgbG9jYWwgYW5kIHdlIGhhdmUgZGF0YTogYXNzdW1lIGEgc3VjY2Vzc1xuXHRcdFx0XHRcdFx0XHRcdC8vIChzdWNjZXNzIHdpdGggbm8gZGF0YSB3b24ndCBnZXQgbm90aWZpZWQsIHRoYXQncyB0aGUgYmVzdCB3ZVxuXHRcdFx0XHRcdFx0XHRcdC8vIGNhbiBkbyBnaXZlbiBjdXJyZW50IGltcGxlbWVudGF0aW9ucylcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFzdGF0dXMgJiYgb3B0aW9ucy5pc0xvY2FsICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdHVzID0gcmVzcG9uc2VzLnRleHQgPyAyMDAgOiA0MDQ7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJRSAtICMxNDUwOiBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNFxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMTIyMyApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXR1cyA9IDIwNDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gQ2FsbCBjb21wbGV0ZSBpZiBuZWVkZWRcblx0XHRcdFx0XHRcdGlmICggcmVzcG9uc2VzICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggc3RhdHVzLCBzdGF0dXNUZXh0LCByZXNwb25zZXMsIHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0XG5cdFx0XHRcdFx0Ly8gYHhoci5zZW5kYCBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLCBidXQgaXQgd2lsbCBiZVxuXHRcdFx0XHRcdC8vIGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKVxuXHRcdFx0XHRcdGlmICggIW9wdGlvbnMuYXN5bmMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIElmIHdlJ3JlIGluIHN5bmMgbW9kZSB3ZSBmaXJlIHRoZSBjYWxsYmFja1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gKElFNiAmIElFNykgaWYgaXQncyBpbiBjYWNoZSBhbmQgaGFzIGJlZW5cblx0XHRcdFx0XHRcdC8vIHJldHJpZXZlZCBkaXJlY3RseSB3ZSBuZWVkIHRvIGZpcmUgdGhlIGNhbGxiYWNrXG5cdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggY2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyBSZWdpc3RlciB0aGUgY2FsbGJhY2ssIGJ1dCBkZWxheSBpdCBpbiBjYXNlIGB4aHIuc2VuZGAgdGhyb3dzXG5cdFx0XHRcdFx0XHQvLyBBZGQgdG8gdGhlIGxpc3Qgb2YgYWN0aXZlIHhociBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB4aHJDYWxsYmFja3NbIGlkIF0gPSBjYWxsYmFjaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRjYWxsYmFjayggdW5kZWZpbmVkLCB0cnVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0fSApO1xufVxuXG4vLyBGdW5jdGlvbnMgdG8gY3JlYXRlIHhocnNcbmZ1bmN0aW9uIGNyZWF0ZVN0YW5kYXJkWEhSKCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cdH0gY2F0Y2ggKCBlICkge31cbn1cblxuZnVuY3Rpb24gY3JlYXRlQWN0aXZlWEhSKCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoIFwiTWljcm9zb2Z0LlhNTEhUVFBcIiApO1xuXHR9IGNhdGNoICggZSApIHt9XG59XG5cblxuXG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBcIiArXG5cdFx0XHRcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgZ2xvYmFsXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHMuY2FjaGUgPSBmYWxzZTtcblx0fVxuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cy50eXBlID0gXCJHRVRcIjtcblx0XHRzLmdsb2JhbCA9IGZhbHNlO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydFxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHNcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXG5cdFx0dmFyIHNjcmlwdCxcblx0XHRcdGhlYWQgPSBkb2N1bWVudC5oZWFkIHx8IGpRdWVyeSggXCJoZWFkXCIgKVsgMCBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXHRcdHJldHVybiB7XG5cblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjYWxsYmFjayApIHtcblxuXHRcdFx0XHRzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInNjcmlwdFwiICk7XG5cblx0XHRcdFx0c2NyaXB0LmFzeW5jID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHtcblx0XHRcdFx0XHRzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNjcmlwdC5zcmMgPSBzLnVybDtcblxuXHRcdFx0XHQvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBicm93c2Vyc1xuXHRcdFx0XHRzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCBfLCBpc0Fib3J0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCBpc0Fib3J0IHx8ICFzY3JpcHQucmVhZHlTdGF0ZSB8fCAvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KCBzY3JpcHQucmVhZHlTdGF0ZSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgbWVtb3J5IGxlYWsgaW4gSUVcblx0XHRcdFx0XHRcdHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBzY3JpcHRcblx0XHRcdFx0XHRcdGlmICggc2NyaXB0LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0XHRcdHNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gRGVyZWZlcmVuY2UgdGhlIHNjcmlwdFxuXHRcdFx0XHRcdFx0c2NyaXB0ID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0Ly8gQ2FsbGJhY2sgaWYgbm90IGFib3J0XG5cdFx0XHRcdFx0XHRpZiAoICFpc0Fib3J0ICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayggMjAwLCBcInN1Y2Nlc3NcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBDaXJjdW12ZW50IElFNiBidWdzIHdpdGggYmFzZSBlbGVtZW50cyAoIzI3MDkgYW5kICM0Mzc4KSBieSBwcmVwZW5kaW5nXG5cdFx0XHRcdC8vIFVzZSBuYXRpdmUgRE9NIG1hbmlwdWxhdGlvbiB0byBhdm9pZCBvdXIgZG9tTWFuaXAgQUpBWCB0cmlja2VyeVxuXHRcdFx0XHRoZWFkLmluc2VydEJlZm9yZSggc2NyaXB0LCBoZWFkLmZpcnN0Q2hpbGQgKTtcblx0XHRcdH0sXG5cblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBzY3JpcHQgKSB7XG5cdFx0XHRcdFx0c2NyaXB0Lm9ubG9hZCggdW5kZWZpbmVkLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0galF1ZXJ5LmlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID9cblx0XHRcdHMuanNvbnBDYWxsYmFjaygpIDpcblx0XHRcdHMuanNvbnBDYWxsYmFjaztcblxuXHRcdC8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGFcblx0XHRpZiAoIGpzb25Qcm9wICkge1xuXHRcdFx0c1sganNvblByb3AgXSA9IHNbIGpzb25Qcm9wIF0ucmVwbGFjZSggcmpzb25wLCBcIiQxXCIgKyBjYWxsYmFja05hbWUgKTtcblx0XHR9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHtcblx0XHRcdHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmpzb25wICsgXCI9XCIgKyBjYWxsYmFja05hbWU7XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvblxuXHRcdHMuY29udmVydGVyc1sgXCJzY3JpcHQganNvblwiIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkge1xuXHRcdFx0XHRqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArIFwiIHdhcyBub3QgY2FsbGVkXCIgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdO1xuXHRcdH07XG5cblx0XHQvLyBmb3JjZSBqc29uIGRhdGFUeXBlXG5cdFx0cy5kYXRhVHlwZXNbIDAgXSA9IFwianNvblwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja1xuXHRcdG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTtcblx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50cztcblx0XHR9O1xuXG5cdFx0Ly8gQ2xlYW4tdXAgZnVuY3Rpb24gKGZpcmVzIGFmdGVyIGNvbnZlcnRlcnMpXG5cdFx0anFYSFIuYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gSWYgcHJldmlvdXMgdmFsdWUgZGlkbid0IGV4aXN0IC0gcmVtb3ZlIGl0XG5cdFx0XHRpZiAoIG92ZXJ3cml0dGVuID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdGpRdWVyeSggd2luZG93ICkucmVtb3ZlUHJvcCggY2FsbGJhY2tOYW1lICk7XG5cblx0XHRcdC8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNhdmUgYmFjayBhcyBmcmVlXG5cdFx0XHRpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkge1xuXG5cdFx0XHRcdC8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZFxuXHRcdFx0XHRzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHRcdFx0Ly8gc2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZVxuXHRcdFx0XHRvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZVxuXHRcdFx0aWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHtcblx0XHRcdFx0b3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDtcblx0XHR9ICk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSApO1xuXG5cblxuXG4vLyBkYXRhOiBzdHJpbmcgb2YgaHRtbFxuLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LFxuLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnRcbi8vIGtlZXBTY3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBhc3NlZCBpbiB0aGUgaHRtbCBzdHJpbmdcbmpRdWVyeS5wYXJzZUhUTUwgPSBmdW5jdGlvbiggZGF0YSwgY29udGV4dCwga2VlcFNjcmlwdHMgKSB7XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblxuXHR2YXIgcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICksXG5cdFx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZFxudmFyIF9sb2FkID0galF1ZXJ5LmZuLmxvYWQ7XG5cbi8qKlxuICogTG9hZCBhIHVybCBpbnRvIGEgcGFnZVxuICovXG5qUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7XG5cdGlmICggdHlwZW9mIHVybCAhPT0gXCJzdHJpbmdcIiAmJiBfbG9hZCApIHtcblx0XHRyZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9XG5cblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0galF1ZXJ5LnRyaW0oIHVybC5zbGljZSggb2ZmLCB1cmwubGVuZ3RoICkgKTtcblx0XHR1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApO1xuXHR9XG5cblx0Ly8gSWYgaXQncyBhIGZ1bmN0aW9uXG5cdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkge1xuXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcblx0XHRjYWxsYmFjayA9IHBhcmFtcztcblx0XHRwYXJhbXMgPSB1bmRlZmluZWQ7XG5cblx0Ly8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZ1xuXHR9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHR0eXBlID0gXCJQT1NUXCI7XG5cdH1cblxuXHQvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdFxuXHRpZiAoIHNlbGYubGVuZ3RoID4gMCApIHtcblx0XHRqUXVlcnkuYWpheCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIElmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWQuXG5cdFx0XHQvLyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2Vcblx0XHRcdC8vIHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZFxuXHRcdFx0dHlwZTogdHlwZSB8fCBcIkdFVFwiLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KCBcIjxkaXY+XCIgKS5hcHBlbmQoIGpRdWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHRcblx0XHRcdFx0cmVzcG9uc2VUZXh0ICk7XG5cblx0XHQvLyBJZiB0aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzIFwiZGF0YVwiLCBcInN0YXR1c1wiLCBcImpxWEhSXCJcblx0XHQvLyBidXQgdGhleSBhcmUgaWdub3JlZCBiZWNhdXNlIHJlc3BvbnNlIHdhcyBzZXQgYWJvdmUuXG5cdFx0Ly8gSWYgaXQgZmFpbHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImpxWEhSXCIsIFwic3RhdHVzXCIsIFwiZXJyb3JcIlxuXHRcdH0gKS5hbHdheXMoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y2FsbGJhY2suYXBwbHkoIHRoaXMsIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cblxuXG5cbi8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzXG5qUXVlcnkuZWFjaCggW1xuXHRcImFqYXhTdGFydFwiLFxuXHRcImFqYXhTdG9wXCIsXG5cdFwiYWpheENvbXBsZXRlXCIsXG5cdFwiYWpheEVycm9yXCIsXG5cdFwiYWpheFN1Y2Nlc3NcIixcblx0XCJhamF4U2VuZFwiXG5dLCBmdW5jdGlvbiggaSwgdHlwZSApIHtcblx0alF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7XG5cdH07XG59ICk7XG5cblxuXG5cbmpRdWVyeS5leHByLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XG5cdH0gKS5sZW5ndGg7XG59O1xuXG5cblxuXG5cbi8qKlxuICogR2V0cyBhIHdpbmRvdyBmcm9tIGFuIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgP1xuXHRcdGVsZW0gOlxuXHRcdGVsZW0ubm9kZVR5cGUgPT09IDkgP1xuXHRcdFx0ZWxlbS5kZWZhdWx0VmlldyB8fCBlbGVtLnBhcmVudFdpbmRvdyA6XG5cdFx0XHRmYWxzZTtcbn1cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBzZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHRqUXVlcnkuaW5BcnJheSggXCJhdXRvXCIsIFsgY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0IF0gKSA+IC0xO1xuXG5cdFx0Ly8gbmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXIgdG9wIG9yIGxlZnRcblx0XHQvLyBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWRcblx0XHRpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkge1xuXHRcdFx0Y3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7XG5cdFx0XHRjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7XG5cdFx0XHRjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcblx0XHRcdGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDtcblx0XHR9XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1ckVsZW0uY3NzKCBwcm9wcyApO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHR0aGlzIDpcblx0XHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0XHRqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApO1xuXHRcdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0dmFyIGRvY0VsZW0sIHdpbixcblx0XHRcdGJveCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0ZG9jID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRpZiAoICFkb2MgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHQvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGVcblx0XHRpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHtcblx0XHRcdHJldHVybiBib3g7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZG9uJ3QgaGF2ZSBnQkNSLCBqdXN0IHVzZSAwLDAgcmF0aGVyIHRoYW4gZXJyb3Jcblx0XHQvLyBCbGFja0JlcnJ5IDUsIGlPUyAzIChvcmlnaW5hbCBpUGhvbmUpXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdH1cblx0XHR3aW4gPSBnZXRXaW5kb3coIGRvYyApO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IGJveC50b3AgICsgKCB3aW4ucGFnZVlPZmZzZXQgfHwgZG9jRWxlbS5zY3JvbGxUb3AgKSAgLSAoIGRvY0VsZW0uY2xpZW50VG9wICB8fCAwICksXG5cdFx0XHRsZWZ0OiBib3gubGVmdCArICggd2luLnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdCApIC0gKCBkb2NFbGVtLmNsaWVudExlZnQgfHwgMCApXG5cdFx0fTtcblx0fSxcblxuXHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhdGhpc1sgMCBdICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCxcblx0XHRcdHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0Ly8gRml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHdpbmRvdyAocGFyZW50T2Zmc2V0ID0ge3RvcDowLCBsZWZ0OiAwfSxcblx0XHQvLyBiZWNhdXNlIGl0IGlzIGl0cyBvbmx5IG9mZnNldCBwYXJlbnRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIHdlIGFzc3VtZSB0aGF0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBpcyBhdmFpbGFibGUgd2hlbiBjb21wdXRlZCBwb3NpdGlvbiBpcyBmaXhlZFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudFxuXHRcdFx0b2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKTtcblxuXHRcdFx0Ly8gR2V0IGNvcnJlY3Qgb2Zmc2V0c1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50WyAwIF0sIFwiaHRtbFwiICkgKSB7XG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5vZmZzZXQoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzXG5cdFx0XHRwYXJlbnRPZmZzZXQudG9wICArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRwYXJlbnRPZmZzZXQubGVmdCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHQvLyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdFxuXHRcdC8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQ7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50LCBcImh0bWxcIiApICYmXG5cdFx0XHRcdGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSApIHtcblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnRFbGVtZW50O1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG4vLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IHNjcm9sbExlZnQ6IFwicGFnZVhPZmZzZXRcIiwgc2Nyb2xsVG9wOiBcInBhZ2VZT2Zmc2V0XCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHtcblx0dmFyIHRvcCA9IC9ZLy50ZXN0KCBwcm9wICk7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXHRcdFx0dmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApO1xuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gKCBwcm9wIGluIHdpbiApID8gd2luWyBwcm9wIF0gOlxuXHRcdFx0XHRcdHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIDpcblx0XHRcdFx0XHRlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxMZWZ0KCksXG5cdFx0XHRcdFx0dG9wID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxUb3AoKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmk8Ny04KywgQ2hyb21lPDM3LTQ0K1xuLy8gQWRkIHRoZSB0b3AvbGVmdCBjc3NIb29rcyB1c2luZyBqUXVlcnkuZm4ucG9zaXRpb25cbi8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTA4NFxuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodFxuLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIHdlIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcbmpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBpLCBwcm9wICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5waXhlbFBvc2l0aW9uLFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGNvbXB1dGVkID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7XG5cblx0XHRcdFx0Ly8gaWYgY3VyQ1NTIHJldHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8gb2Zmc2V0XG5cdFx0XHRcdHJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/XG5cdFx0XHRcdFx0alF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgXCJweFwiIDpcblx0XHRcdFx0XHRjb21wdXRlZDtcblx0XHRcdH1cblx0XHR9XG5cdCk7XG59ICk7XG5cblxuLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBIZWlnaHQ6IFwiaGVpZ2h0XCIsIFdpZHRoOiBcIndpZHRoXCIgfSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7XG5cdGpRdWVyeS5lYWNoKCB7IHBhZGRpbmc6IFwiaW5uZXJcIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsIFwiXCI6IFwib3V0ZXJcIiArIG5hbWUgfSxcblx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBtYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZVxuXHRcdFx0XHRcdC8vIGlzbid0IGEgd2hvbGUgbG90IHdlIGNhbiBkby4gU2VlIHB1bGwgcmVxdWVzdCBhdCB0aGlzIFVSTCBmb3IgZGlzY3Vzc2lvbjpcblx0XHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzc2NFxuXHRcdFx0XHRcdHJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdC8vIHVuZm9ydHVuYXRlbHksIHRoaXMgY2F1c2VzIGJ1ZyAjMzgzOCBpbiBJRTYvOCBvbmx5LFxuXHRcdFx0XHRcdC8vIGJ1dCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gZ29vZCwgc21hbGwgd2F5IHRvIGZpeCBpdC5cblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fVxufSApO1xuXG4vLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldFxualF1ZXJ5LmZuLnNpemUgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMubGVuZ3RoO1xufTtcblxualF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4uYWRkQmFjaztcblxuXG5cblxuLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyXG4vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0XG4vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Rcbi8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmVcbi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZVxuLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzXG4vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXG5cbi8vIE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkXG4vLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9pZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuXG4vLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGlicmFyaWVzI3dpa2ktYW5vblxuXG5pZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRkZWZpbmUoIFwianF1ZXJ5XCIsIFtdLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5O1xuXHR9ICk7XG59XG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW5cbi8vIEFNRCAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoICFub0dsb2JhbCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5yZXR1cm4galF1ZXJ5O1xufSkpO1xuIiwiKGZ1bmN0aW9uIChmYWN0b3J5KSB7XHJcbiAgICAvLyBNb2R1bGUgc3lzdGVtcyBtYWdpYyBkYW5jZS5cclxuXHJcbiAgICBpZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgLy8gQ29tbW9uSlMgb3IgTm9kZTogaGFyZC1jb2RlZCBkZXBlbmRlbmN5IG9uIFwia25vY2tvdXRcIlxyXG4gICAgICAgIGZhY3RvcnkocmVxdWlyZShcImtub2Nrb3V0XCIpLCBleHBvcnRzKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZVtcImFtZFwiXSkge1xyXG4gICAgICAgIC8vIEFNRCBhbm9ueW1vdXMgbW9kdWxlIHdpdGggaGFyZC1jb2RlZCBkZXBlbmRlbmN5IG9uIFwia25vY2tvdXRcIlxyXG4gICAgICAgIGRlZmluZShbXCJrbm9ja291dFwiLCBcImV4cG9ydHNcIl0sIGZhY3RvcnkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyA8c2NyaXB0PiB0YWc6IHVzZSB0aGUgZ2xvYmFsIGBrb2Agb2JqZWN0LCBhdHRhY2hpbmcgYSBgbWFwcGluZ2AgcHJvcGVydHlcclxuICAgICAgICBmYWN0b3J5KGtvLCBrby5tYXBwaW5nID0ge30pO1xyXG4gICAgfVxyXG59KGZ1bmN0aW9uIChrbywgZXhwb3J0cykge1xyXG4gICAgdmFyIERFQlVHID0gdHJ1ZTtcclxuICAgIHZhciBtYXBwaW5nUHJvcGVydHkgPSBcIl9fa29fbWFwcGluZ19fXCI7XHJcbiAgICB2YXIgcmVhbEtvRGVwZW5kZW50T2JzZXJ2YWJsZSA9IGtvLmRlcGVuZGVudE9ic2VydmFibGU7XHJcbiAgICB2YXIgbWFwcGluZ05lc3RpbmcgPSAwO1xyXG4gICAgdmFyIGRlcGVuZGVudE9ic2VydmFibGVzO1xyXG4gICAgdmFyIHZpc2l0ZWRPYmplY3RzO1xyXG4gICAgdmFyIHJlY29nbml6ZWRSb290UHJvcGVydGllcyA9IFtcImNyZWF0ZVwiLCBcInVwZGF0ZVwiLCBcImtleVwiLCBcImFycmF5Q2hhbmdlZFwiXTtcclxuICAgIHZhciBlbXB0eVJldHVybiA9IHt9O1xyXG5cclxuICAgIHZhciBfZGVmYXVsdE9wdGlvbnMgPSB7XHJcbiAgICAgICAgaW5jbHVkZTogW1wiX2Rlc3Ryb3lcIl0sXHJcbiAgICAgICAgaWdub3JlOiBbXSxcclxuICAgICAgICBjb3B5OiBbXSxcclxuICAgICAgICBvYnNlcnZlOiBbXVxyXG4gICAgfTtcclxuICAgIHZhciBkZWZhdWx0T3B0aW9ucyA9IF9kZWZhdWx0T3B0aW9ucztcclxuXHJcbiAgICBmdW5jdGlvbiB1bmlvbkFycmF5cygpIHtcclxuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcclxuICAgICAgICBsID0gYXJncy5sZW5ndGgsXHJcbiAgICAgICAgb2JqID0ge30sXHJcbiAgICAgICAgcmVzID0gW10sXHJcbiAgICAgICAgaSwgaiwgaztcclxuXHJcbiAgICAgICAgd2hpbGUgKGwtLSkge1xyXG4gICAgICAgICAgICBrID0gYXJnc1tsXTtcclxuICAgICAgICAgICAgaSA9IGsubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgICAgICAgaiA9IGtbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9ialtqXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialtqXSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goaik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZXh0ZW5kT2JqZWN0KGRlc3RpbmF0aW9uLCBzb3VyY2UpIHtcclxuICAgICAgICB2YXIgZGVzdFR5cGU7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHNvdXJjZVtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICBkZXN0VHlwZSA9IGV4cG9ydHMuZ2V0VHlwZShkZXN0aW5hdGlvbltrZXldKTtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgJiYgZGVzdGluYXRpb25ba2V5XSAmJiBkZXN0VHlwZSAhPT0gXCJhcnJheVwiICYmIGRlc3RUeXBlICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kT2JqZWN0KGRlc3RpbmF0aW9uW2tleV0sIHNvdXJjZVtrZXldKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJvdGhBcnJheXMgPSBleHBvcnRzLmdldFR5cGUoZGVzdGluYXRpb25ba2V5XSkgPT09IFwiYXJyYXlcIiAmJiBleHBvcnRzLmdldFR5cGUoc291cmNlW2tleV0pID09PSBcImFycmF5XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvdGhBcnJheXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHVuaW9uQXJyYXlzKGRlc3RpbmF0aW9uW2tleV0sIHNvdXJjZVtrZXldKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbltrZXldID0gc291cmNlW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1lcmdlKG9iajEsIG9iajIpIHtcclxuICAgICAgICB2YXIgbWVyZ2VkID0ge307XHJcbiAgICAgICAgZXh0ZW5kT2JqZWN0KG1lcmdlZCwgb2JqMSk7XHJcbiAgICAgICAgZXh0ZW5kT2JqZWN0KG1lcmdlZCwgb2JqMik7XHJcblxyXG4gICAgICAgIHJldHVybiBtZXJnZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0cy5pc01hcHBlZCA9IGZ1bmN0aW9uICh2aWV3TW9kZWwpIHtcclxuICAgICAgICB2YXIgdW53cmFwcGVkID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2aWV3TW9kZWwpO1xyXG4gICAgICAgIHJldHVybiB1bndyYXBwZWQgJiYgdW53cmFwcGVkW21hcHBpbmdQcm9wZXJ0eV07XHJcbiAgICB9O1xyXG5cclxuICAgIGV4cG9ydHMuZnJvbUpTID0gZnVuY3Rpb24gKGpzT2JqZWN0IC8qLCBpbnB1dE9wdGlvbnMsIHRhcmdldCovICkge1xyXG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKFwiV2hlbiBjYWxsaW5nIGtvLm1hcHBpbmcuZnJvbUpTLCBwYXNzIHRoZSBvYmplY3QgeW91IHdhbnQgdG8gY29udmVydC5cIik7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghbWFwcGluZ05lc3RpbmcrKykge1xyXG4gICAgICAgICAgICAgICAgZGVwZW5kZW50T2JzZXJ2YWJsZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHZpc2l0ZWRPYmplY3RzID0gbmV3IG9iamVjdExvb2t1cCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgb3B0aW9ucztcclxuICAgICAgICAgICAgdmFyIHRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHNbMV1bbWFwcGluZ1Byb3BlcnR5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAzKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzWzFdO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gYXJndW1lbnRzWzJdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gbWVyZ2Uob3B0aW9ucywgdGFyZ2V0W21hcHBpbmdQcm9wZXJ0eV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSBmaWxsT3B0aW9ucyhvcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB1cGRhdGVWaWV3TW9kZWwodGFyZ2V0LCBqc09iamVjdCwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRhcmdldDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gRXZhbHVhdGUgYW55IGRlcGVuZGVudCBvYnNlcnZhYmxlcyB0aGF0IHdlcmUgcHJveGllZC5cclxuICAgICAgICAgICAgLy8gRG8gdGhpcyBhZnRlciB0aGUgbW9kZWwncyBvYnNlcnZhYmxlcyBoYXZlIGJlZW4gY3JlYXRlZFxyXG4gICAgICAgICAgICBpZiAoIS0tbWFwcGluZ05lc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChkZXBlbmRlbnRPYnNlcnZhYmxlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgRE8gPSBkZXBlbmRlbnRPYnNlcnZhYmxlcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoRE8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgRE8oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdGhpcyBtYWdpYyBwcm9wZXJ0eSB0byB0aGUgdW5kZXJseWluZyBkZXBlbmRlbnQgb2JzZXJ2YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBETy5fX0RPW1widGhyb3R0bGVFdmFsdWF0aW9uXCJdID0gRE9bXCJ0aHJvdHRsZUV2YWx1YXRpb25cIl07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTYXZlIGFueSBuZXcgbWFwcGluZyBvcHRpb25zIGluIHRoZSB2aWV3IG1vZGVsLCBzbyB0aGF0IHVwZGF0ZUZyb21KUyBjYW4gdXNlIHRoZW0gbGF0ZXIuXHJcbiAgICAgICAgICAgIHJlc3VsdFttYXBwaW5nUHJvcGVydHldID0gbWVyZ2UocmVzdWx0W21hcHBpbmdQcm9wZXJ0eV0sIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9IGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgbWFwcGluZ05lc3RpbmcgPSAwO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgZXhwb3J0cy5mcm9tSlNPTiA9IGZ1bmN0aW9uIChqc29uU3RyaW5nIC8qLCBvcHRpb25zLCB0YXJnZXQqLyApIHtcclxuICAgICAgICB2YXIgcGFyc2VkID0ga28udXRpbHMucGFyc2VKc29uKGpzb25TdHJpbmcpO1xyXG4gICAgICAgIHZhciBhcmdBcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XHJcbiAgICAgICAgYXJnQXJyYXlbMF0gPSBwYXJzZWQ7XHJcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuZnJvbUpTLmFwcGx5KHRoaXMsIGFyZ0FycmF5KTtcclxuICAgIH07XHJcblxyXG4gICAgZXhwb3J0cy51cGRhdGVGcm9tSlMgPSBmdW5jdGlvbiAodmlld01vZGVsKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwia28ubWFwcGluZy51cGRhdGVGcm9tSlMsIHVzZSBrby5tYXBwaW5nLmZyb21KUyBpbnN0ZWFkLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBvcmRlciBvZiBwYXJhbWV0ZXJzIGlzIGRpZmZlcmVudCFcIik7XHJcbiAgICB9O1xyXG5cclxuICAgIGV4cG9ydHMudXBkYXRlRnJvbUpTT04gPSBmdW5jdGlvbiAodmlld01vZGVsKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwia28ubWFwcGluZy51cGRhdGVGcm9tSlNPTiwgdXNlIGtvLm1hcHBpbmcuZnJvbUpTT04gaW5zdGVhZC4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgcGFyYW1ldGVycyBpcyBkaWZmZXJlbnQhXCIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnRzLnRvSlMgPSBmdW5jdGlvbiAocm9vdE9iamVjdCwgb3B0aW9ucykge1xyXG4gICAgICAgIGlmICghZGVmYXVsdE9wdGlvbnMpIGV4cG9ydHMucmVzZXREZWZhdWx0T3B0aW9ucygpO1xyXG5cclxuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcihcIldoZW4gY2FsbGluZyBrby5tYXBwaW5nLnRvSlMsIHBhc3MgdGhlIG9iamVjdCB5b3Ugd2FudCB0byBjb252ZXJ0LlwiKTtcclxuICAgICAgICBpZiAoZXhwb3J0cy5nZXRUeXBlKGRlZmF1bHRPcHRpb25zLmlnbm9yZSkgIT09IFwiYXJyYXlcIikgdGhyb3cgbmV3IEVycm9yKFwia28ubWFwcGluZy5kZWZhdWx0T3B0aW9ucygpLmlnbm9yZSBzaG91bGQgYmUgYW4gYXJyYXkuXCIpO1xyXG4gICAgICAgIGlmIChleHBvcnRzLmdldFR5cGUoZGVmYXVsdE9wdGlvbnMuaW5jbHVkZSkgIT09IFwiYXJyYXlcIikgdGhyb3cgbmV3IEVycm9yKFwia28ubWFwcGluZy5kZWZhdWx0T3B0aW9ucygpLmluY2x1ZGUgc2hvdWxkIGJlIGFuIGFycmF5LlwiKTtcclxuICAgICAgICBpZiAoZXhwb3J0cy5nZXRUeXBlKGRlZmF1bHRPcHRpb25zLmNvcHkpICE9PSBcImFycmF5XCIpIHRocm93IG5ldyBFcnJvcihcImtvLm1hcHBpbmcuZGVmYXVsdE9wdGlvbnMoKS5jb3B5IHNob3VsZCBiZSBhbiBhcnJheS5cIik7XHJcblxyXG4gICAgICAgIC8vIE1lcmdlIGluIHRoZSBvcHRpb25zIHVzZWQgaW4gZnJvbUpTXHJcbiAgICAgICAgb3B0aW9ucyA9IGZpbGxPcHRpb25zKG9wdGlvbnMsIHJvb3RPYmplY3RbbWFwcGluZ1Byb3BlcnR5XSk7XHJcblxyXG4gICAgICAgIC8vIFdlIGp1c3QgdW53cmFwIGV2ZXJ5dGhpbmcgYXQgZXZlcnkgbGV2ZWwgaW4gdGhlIG9iamVjdCBncmFwaFxyXG4gICAgICAgIHJldHVybiBleHBvcnRzLnZpc2l0TW9kZWwocm9vdE9iamVjdCwgZnVuY3Rpb24gKHgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoeCk7XHJcbiAgICAgICAgfSwgb3B0aW9ucyk7XHJcbiAgICB9O1xyXG5cclxuICAgIGV4cG9ydHMudG9KU09OID0gZnVuY3Rpb24gKHJvb3RPYmplY3QsIG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgcGxhaW5KYXZhU2NyaXB0T2JqZWN0ID0gZXhwb3J0cy50b0pTKHJvb3RPYmplY3QsIG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBrby51dGlscy5zdHJpbmdpZnlKc29uKHBsYWluSmF2YVNjcmlwdE9iamVjdCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGV4cG9ydHMuZGVmYXVsdE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zID0gYXJndW1lbnRzWzBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0T3B0aW9ucztcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGV4cG9ydHMucmVzZXREZWZhdWx0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBkZWZhdWx0T3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgaW5jbHVkZTogX2RlZmF1bHRPcHRpb25zLmluY2x1ZGUuc2xpY2UoMCksXHJcbiAgICAgICAgICAgIGlnbm9yZTogX2RlZmF1bHRPcHRpb25zLmlnbm9yZS5zbGljZSgwKSxcclxuICAgICAgICAgICAgY29weTogX2RlZmF1bHRPcHRpb25zLmNvcHkuc2xpY2UoMCksXHJcbiAgICAgICAgICAgIG9ic2VydmU6IF9kZWZhdWx0T3B0aW9ucy5vYnNlcnZlLnNsaWNlKDApXHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcblxyXG4gICAgZXhwb3J0cy5nZXRUeXBlID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICAgIGlmICgoeCkgJiYgKHR5cGVvZiAoeCkgPT09IFwib2JqZWN0XCIpKSB7XHJcbiAgICAgICAgICAgIGlmICh4LmNvbnN0cnVjdG9yID09PSBEYXRlKSByZXR1cm4gXCJkYXRlXCI7XHJcbiAgICAgICAgICAgIGlmICh4LmNvbnN0cnVjdG9yID09PSBBcnJheSkgcmV0dXJuIFwiYXJyYXlcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB4O1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBmaWxsT3B0aW9ucyhyYXdPcHRpb25zLCBvdGhlck9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgb3B0aW9ucyA9IG1lcmdlKHt9LCByYXdPcHRpb25zKTtcclxuXHJcbiAgICAgICAgLy8gTW92ZSByZWNvZ25pemVkIHJvb3QtbGV2ZWwgcHJvcGVydGllcyBpbnRvIGEgcm9vdCBuYW1lc3BhY2VcclxuICAgICAgICBmb3IgKHZhciBpID0gcmVjb2duaXplZFJvb3RQcm9wZXJ0aWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IHJlY29nbml6ZWRSb290UHJvcGVydGllc1tpXTtcclxuXHJcbiAgICAgICAgICAgIC8vIENhcnJ5IG9uLCB1bmxlc3MgdGhpcyBwcm9wZXJ0eSBpcyBwcmVzZW50XHJcbiAgICAgICAgICAgIGlmICghb3B0aW9uc1twcm9wZXJ0eV0pIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgLy8gTW92ZSB0aGUgcHJvcGVydHkgaW50byB0aGUgcm9vdCBuYW1lc3BhY2VcclxuICAgICAgICAgICAgaWYgKCEob3B0aW9uc1tcIlwiXSBpbnN0YW5jZW9mIE9iamVjdCkpIG9wdGlvbnNbXCJcIl0gPSB7fTtcclxuICAgICAgICAgICAgb3B0aW9uc1tcIlwiXVtwcm9wZXJ0eV0gPSBvcHRpb25zW3Byb3BlcnR5XTtcclxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnNbcHJvcGVydHldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG90aGVyT3B0aW9ucykge1xyXG4gICAgICAgICAgICBvcHRpb25zLmlnbm9yZSA9IG1lcmdlQXJyYXlzKG90aGVyT3B0aW9ucy5pZ25vcmUsIG9wdGlvbnMuaWdub3JlKTtcclxuICAgICAgICAgICAgb3B0aW9ucy5pbmNsdWRlID0gbWVyZ2VBcnJheXMob3RoZXJPcHRpb25zLmluY2x1ZGUsIG9wdGlvbnMuaW5jbHVkZSk7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuY29weSA9IG1lcmdlQXJyYXlzKG90aGVyT3B0aW9ucy5jb3B5LCBvcHRpb25zLmNvcHkpO1xyXG4gICAgICAgICAgICBvcHRpb25zLm9ic2VydmUgPSBtZXJnZUFycmF5cyhvdGhlck9wdGlvbnMub2JzZXJ2ZSwgb3B0aW9ucy5vYnNlcnZlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3B0aW9ucy5pZ25vcmUgPSBtZXJnZUFycmF5cyhvcHRpb25zLmlnbm9yZSwgZGVmYXVsdE9wdGlvbnMuaWdub3JlKTtcclxuICAgICAgICBvcHRpb25zLmluY2x1ZGUgPSBtZXJnZUFycmF5cyhvcHRpb25zLmluY2x1ZGUsIGRlZmF1bHRPcHRpb25zLmluY2x1ZGUpO1xyXG4gICAgICAgIG9wdGlvbnMuY29weSA9IG1lcmdlQXJyYXlzKG9wdGlvbnMuY29weSwgZGVmYXVsdE9wdGlvbnMuY29weSk7XHJcbiAgICAgICAgb3B0aW9ucy5vYnNlcnZlID0gbWVyZ2VBcnJheXMob3B0aW9ucy5vYnNlcnZlLCBkZWZhdWx0T3B0aW9ucy5vYnNlcnZlKTtcclxuXHJcbiAgICAgICAgb3B0aW9ucy5tYXBwZWRQcm9wZXJ0aWVzID0gb3B0aW9ucy5tYXBwZWRQcm9wZXJ0aWVzIHx8IHt9O1xyXG4gICAgICAgIG9wdGlvbnMuY29waWVkUHJvcGVydGllcyA9IG9wdGlvbnMuY29waWVkUHJvcGVydGllcyB8fCB7fTtcclxuICAgICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtZXJnZUFycmF5cyhhLCBiKSB7XHJcbiAgICAgICAgaWYgKGV4cG9ydHMuZ2V0VHlwZShhKSAhPT0gXCJhcnJheVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChleHBvcnRzLmdldFR5cGUoYSkgPT09IFwidW5kZWZpbmVkXCIpIGEgPSBbXTtcclxuICAgICAgICAgICAgZWxzZSBhID0gW2FdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXhwb3J0cy5nZXRUeXBlKGIpICE9PSBcImFycmF5XCIpIHtcclxuICAgICAgICAgICAgaWYgKGV4cG9ydHMuZ2V0VHlwZShiKSA9PT0gXCJ1bmRlZmluZWRcIikgYiA9IFtdO1xyXG4gICAgICAgICAgICBlbHNlIGIgPSBbYl07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlHZXREaXN0aW5jdFZhbHVlcyhhLmNvbmNhdChiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2hlbiB1c2luZyBhICdjcmVhdGUnIGNhbGxiYWNrLCB3ZSBwcm94eSB0aGUgZGVwZW5kZW50IG9ic2VydmFibGUgc28gdGhhdCBpdCBkb2Vzbid0IGltbWVkaWF0ZWx5IGV2YWx1YXRlIG9uIGNyZWF0aW9uLlxyXG4gICAgLy8gVGhlIHJlYXNvbiBpcyB0aGF0IHRoZSBkZXBlbmRlbnQgb2JzZXJ2YWJsZXMgaW4gdGhlIHVzZXItc3BlY2lmaWVkIGNhbGxiYWNrIG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gcHJvcGVydGllcyB0aGF0IGhhdmUgbm90IGJlZW4gbWFwcGVkIHlldC5cclxuICAgIGZ1bmN0aW9uIHdpdGhQcm94eURlcGVuZGVudE9ic2VydmFibGUoZGVwZW5kZW50T2JzZXJ2YWJsZXMsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgdmFyIGxvY2FsRE8gPSBrby5kZXBlbmRlbnRPYnNlcnZhYmxlO1xyXG4gICAgICAgIGtvLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbiAocmVhZCwgb3duZXIsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblxyXG4gICAgICAgICAgICBpZiAocmVhZCAmJiB0eXBlb2YgcmVhZCA9PSBcIm9iamVjdFwiKSB7IC8vIG1pcnJvcnMgY29uZGl0aW9uIGluIGtub2Nrb3V0IGltcGxlbWVudGF0aW9uIG9mIERPJ3NcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSByZWFkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVhbERlZmVyRXZhbHVhdGlvbiA9IG9wdGlvbnMuZGVmZXJFdmFsdWF0aW9uO1xyXG5cclxuICAgICAgICAgICAgdmFyIGlzUmVtb3ZlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gV2Ugd3JhcCB0aGUgb3JpZ2luYWwgZGVwZW5kZW50IG9ic2VydmFibGUgc28gdGhhdCB3ZSBjYW4gcmVtb3ZlIGl0IGZyb20gdGhlICdkZXBlbmRlbnRPYnNlcnZhYmxlcycgbGlzdCB3ZSBuZWVkIHRvIGV2YWx1YXRlIGFmdGVyIG1hcHBpbmcgaGFzXHJcbiAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBpZiB0aGUgdXNlciBhbHJlYWR5IGV2YWx1YXRlZCB0aGUgRE8gdGhlbXNlbHZlcyBpbiB0aGUgbWVhbnRpbWUuXHJcbiAgICAgICAgICAgIHZhciB3cmFwID0gZnVuY3Rpb24gKERPKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUZW1wb3JhcmlseSByZXZlcnQga28uZGVwZW5kZW50T2JzZXJ2YWJsZSwgc2luY2UgaXQgaXMgdXNlZCBpbiBrby5pc1dyaXRlYWJsZU9ic2VydmFibGVcclxuICAgICAgICAgICAgICAgIHZhciB0bXAgPSBrby5kZXBlbmRlbnRPYnNlcnZhYmxlO1xyXG4gICAgICAgICAgICAgICAga28uZGVwZW5kZW50T2JzZXJ2YWJsZSA9IHJlYWxLb0RlcGVuZGVudE9ic2VydmFibGU7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXNXcml0ZWFibGUgPSBrby5pc1dyaXRlYWJsZU9ic2VydmFibGUoRE8pO1xyXG4gICAgICAgICAgICAgICAga28uZGVwZW5kZW50T2JzZXJ2YWJsZSA9IHRtcDtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgd3JhcHBlZCA9IHJlYWxLb0RlcGVuZGVudE9ic2VydmFibGUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1JlbW92ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5UmVtb3ZlSXRlbShkZXBlbmRlbnRPYnNlcnZhYmxlcywgRE8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRE8uYXBwbHkoRE8sIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB3cml0ZTogaXNXcml0ZWFibGUgJiYgZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRE8odmFsKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVyRXZhbHVhdGlvbjogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHdyYXBwZWQuX3dyYXBwZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgd3JhcHBlZC5fX0RPID0gRE87XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZDtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIG9wdGlvbnMuZGVmZXJFdmFsdWF0aW9uID0gdHJ1ZTsgLy8gd2lsbCBlaXRoZXIgc2V0IGZvciBqdXN0IG9wdGlvbnMsIG9yIGJvdGggcmVhZC9vcHRpb25zLlxyXG4gICAgICAgICAgICB2YXIgcmVhbERlcGVuZGVudE9ic2VydmFibGUgPSBuZXcgcmVhbEtvRGVwZW5kZW50T2JzZXJ2YWJsZShyZWFkLCBvd25lciwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJlYWxEZWZlckV2YWx1YXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHJlYWxEZXBlbmRlbnRPYnNlcnZhYmxlID0gd3JhcChyZWFsRGVwZW5kZW50T2JzZXJ2YWJsZSk7XHJcbiAgICAgICAgICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlcy5wdXNoKHJlYWxEZXBlbmRlbnRPYnNlcnZhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlYWxEZXBlbmRlbnRPYnNlcnZhYmxlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAga28uZGVwZW5kZW50T2JzZXJ2YWJsZS5mbiA9IHJlYWxLb0RlcGVuZGVudE9ic2VydmFibGUuZm47XHJcbiAgICAgICAga28uY29tcHV0ZWQgPSBrby5kZXBlbmRlbnRPYnNlcnZhYmxlO1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBjYWxsYmFjaygpO1xyXG4gICAgICAgIGtvLmRlcGVuZGVudE9ic2VydmFibGUgPSBsb2NhbERPO1xyXG4gICAgICAgIGtvLmNvbXB1dGVkID0ga28uZGVwZW5kZW50T2JzZXJ2YWJsZTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZVZpZXdNb2RlbChtYXBwZWRSb290T2JqZWN0LCByb290T2JqZWN0LCBvcHRpb25zLCBwYXJlbnROYW1lLCBwYXJlbnQsIHBhcmVudFByb3BlcnR5TmFtZSwgbWFwcGVkUGFyZW50KSB7XHJcbiAgICAgICAgdmFyIGlzQXJyYXkgPSBleHBvcnRzLmdldFR5cGUoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShyb290T2JqZWN0KSkgPT09IFwiYXJyYXlcIjtcclxuXHJcbiAgICAgICAgcGFyZW50UHJvcGVydHlOYW1lID0gcGFyZW50UHJvcGVydHlOYW1lIHx8IFwiXCI7XHJcblxyXG4gICAgICAgIC8vIElmIHRoaXMgb2JqZWN0IHdhcyBhbHJlYWR5IG1hcHBlZCBwcmV2aW91c2x5LCB0YWtlIHRoZSBvcHRpb25zIGZyb20gdGhlcmUgYW5kIG1lcmdlIHRoZW0gd2l0aCBvdXIgZXhpc3Rpbmcgb25lcy5cclxuICAgICAgICBpZiAoZXhwb3J0cy5pc01hcHBlZChtYXBwZWRSb290T2JqZWN0KSkge1xyXG4gICAgICAgICAgICB2YXIgcHJldmlvdXNNYXBwaW5nID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShtYXBwZWRSb290T2JqZWN0KVttYXBwaW5nUHJvcGVydHldO1xyXG4gICAgICAgICAgICBvcHRpb25zID0gbWVyZ2UocHJldmlvdXNNYXBwaW5nLCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjYWxsYmFja1BhcmFtcyA9IHtcclxuICAgICAgICAgICAgZGF0YTogcm9vdE9iamVjdCxcclxuICAgICAgICAgICAgcGFyZW50OiBtYXBwZWRQYXJlbnQgfHwgcGFyZW50XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIGhhc0NyZWF0ZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uc1twYXJlbnROYW1lXSAmJiBvcHRpb25zW3BhcmVudE5hbWVdLmNyZWF0ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciBjcmVhdGVDYWxsYmFjayA9IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB3aXRoUHJveHlEZXBlbmRlbnRPYnNlcnZhYmxlKGRlcGVuZGVudE9ic2VydmFibGVzLCBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUocGFyZW50KSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNbcGFyZW50TmFtZV0uY3JlYXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSB8fCBjYWxsYmFja1BhcmFtcy5kYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGNhbGxiYWNrUGFyYW1zLnBhcmVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcDogZW1wdHlSZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNbcGFyZW50TmFtZV0uY3JlYXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSB8fCBjYWxsYmFja1BhcmFtcy5kYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGNhbGxiYWNrUGFyYW1zLnBhcmVudFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2YXIgaGFzVXBkYXRlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zW3BhcmVudE5hbWVdICYmIG9wdGlvbnNbcGFyZW50TmFtZV0udXBkYXRlIGluc3RhbmNlb2YgRnVuY3Rpb247XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIHVwZGF0ZUNhbGxiYWNrID0gZnVuY3Rpb24gKG9iaiwgZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YSB8fCBjYWxsYmFja1BhcmFtcy5kYXRhLFxyXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjYWxsYmFja1BhcmFtcy5wYXJlbnQsXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUob2JqKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZShvYmopKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXMub2JzZXJ2YWJsZSA9IG9iajtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNbcGFyZW50TmFtZV0udXBkYXRlKHBhcmFtcyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIGFscmVhZHlNYXBwZWQgPSB2aXNpdGVkT2JqZWN0cy5nZXQocm9vdE9iamVjdCk7XHJcbiAgICAgICAgaWYgKGFscmVhZHlNYXBwZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFscmVhZHlNYXBwZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYXJlbnROYW1lID0gcGFyZW50TmFtZSB8fCBcIlwiO1xyXG5cclxuICAgICAgICBpZiAoIWlzQXJyYXkpIHtcclxuICAgICAgICAgICAgLy8gRm9yIGF0b21pYyB0eXBlcywgZG8gYSBkaXJlY3QgdXBkYXRlIG9uIHRoZSBvYnNlcnZhYmxlXHJcbiAgICAgICAgICAgIGlmICghY2FuSGF2ZVByb3BlcnRpZXMocm9vdE9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZXhwb3J0cy5nZXRUeXBlKHJvb3RPYmplY3QpKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVXBkYXRlQ2FsbGJhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKHJvb3RPYmplY3QpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290T2JqZWN0KHVwZGF0ZUNhbGxiYWNrKHJvb3RPYmplY3QpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QgPSByb290T2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdCA9IHVwZGF0ZUNhbGxiYWNrKHJvb3RPYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdCA9IHJvb3RPYmplY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVUb1dyaXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrby5pc1dyaXRlYWJsZU9ic2VydmFibGUobWFwcGVkUm9vdE9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1VwZGF0ZUNhbGxiYWNrKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVG9Xcml0ZSA9IHVwZGF0ZUNhbGxiYWNrKG1hcHBlZFJvb3RPYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdCh2YWx1ZVRvV3JpdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlVG9Xcml0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVG9Xcml0ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUocm9vdE9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0KHZhbHVlVG9Xcml0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVUb1dyaXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhhc0NyZWF0ZU9yVXBkYXRlQ2FsbGJhY2sgPSBoYXNDcmVhdGVDYWxsYmFjaygpIHx8IGhhc1VwZGF0ZUNhbGxiYWNrKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQ3JlYXRlQ2FsbGJhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdCA9IGNyZWF0ZUNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0ID0ga28ub2JzZXJ2YWJsZShrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHJvb3RPYmplY3QpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1VwZGF0ZUNhbGxiYWNrKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QodXBkYXRlQ2FsbGJhY2sobWFwcGVkUm9vdE9iamVjdCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQ3JlYXRlT3JVcGRhdGVDYWxsYmFjaykgcmV0dXJuIG1hcHBlZFJvb3RPYmplY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG1hcHBlZFJvb3RPYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXBwZWRSb290T2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NyZWF0ZUNhbGxiYWNrKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUNhbGxiYWNrKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVXBkYXRlQ2FsbGJhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdXBkYXRlQ2FsbGJhY2socmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVXBkYXRlQ2FsbGJhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGhhc1VwZGF0ZUNhbGxiYWNrKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0ID0gdXBkYXRlQ2FsbGJhY2sobWFwcGVkUm9vdE9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmlzaXRlZE9iamVjdHMuc2F2ZShyb290T2JqZWN0LCBtYXBwZWRSb290T2JqZWN0KTtcclxuICAgICAgICAgICAgICAgIGlmIChoYXNVcGRhdGVDYWxsYmFjaygpKSByZXR1cm4gbWFwcGVkUm9vdE9iamVjdDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBGb3Igbm9uLWF0b21pYyB0eXBlcywgdmlzaXQgYWxsIHByb3BlcnRpZXMgYW5kIHVwZGF0ZSByZWN1cnNpdmVseVxyXG4gICAgICAgICAgICAgICAgdmlzaXRQcm9wZXJ0aWVzT3JBcnJheUVudHJpZXMocm9vdE9iamVjdCwgZnVuY3Rpb24gKGluZGV4ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZnVsbFByb3BlcnR5TmFtZSA9IHBhcmVudFByb3BlcnR5TmFtZS5sZW5ndGggPyBwYXJlbnRQcm9wZXJ0eU5hbWUgKyBcIi5cIiArIGluZGV4ZXIgOiBpbmRleGVyO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoa28udXRpbHMuYXJyYXlJbmRleE9mKG9wdGlvbnMuaWdub3JlLCBmdWxsUHJvcGVydHlOYW1lKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoa28udXRpbHMuYXJyYXlJbmRleE9mKG9wdGlvbnMuY29weSwgZnVsbFByb3BlcnR5TmFtZSkgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdFtpbmRleGVyXSA9IHJvb3RPYmplY3RbaW5kZXhlcl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiByb290T2JqZWN0W2luZGV4ZXJdICE9IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJvb3RPYmplY3RbaW5kZXhlcl0gIT0gXCJhcnJheVwiICYmIG9wdGlvbnMub2JzZXJ2ZS5sZW5ndGggPiAwICYmIGtvLnV0aWxzLmFycmF5SW5kZXhPZihvcHRpb25zLm9ic2VydmUsIGZ1bGxQcm9wZXJ0eU5hbWUpID09IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdFtpbmRleGVyXSA9IHJvb3RPYmplY3RbaW5kZXhlcl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29waWVkUHJvcGVydGllc1tmdWxsUHJvcGVydHlOYW1lXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugd2UgYXJlIGFkZGluZyBhbiBhbHJlYWR5IG1hcHBlZCBwcm9wZXJ0eSwgZmlsbCBpdCB3aXRoIHRoZSBwcmV2aW91c2x5IG1hcHBlZCBwcm9wZXJ0eSB2YWx1ZSB0byBwcmV2ZW50IHJlY3Vyc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJvcGVydHkgdGhhdCB3YXMgZ2VuZXJhdGVkIGJ5IGZyb21KUywgd2Ugc2hvdWxkIHVzZSB0aGUgb3B0aW9ucyBzcGVjaWZpZWQgdGhlcmVcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJldk1hcHBlZFByb3BlcnR5ID0gdmlzaXRlZE9iamVjdHMuZ2V0KHJvb3RPYmplY3RbaW5kZXhlcl0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXR2YWwgPSB1cGRhdGVWaWV3TW9kZWwobWFwcGVkUm9vdE9iamVjdFtpbmRleGVyXSwgcm9vdE9iamVjdFtpbmRleGVyXSwgb3B0aW9ucywgaW5kZXhlciwgbWFwcGVkUm9vdE9iamVjdCwgZnVsbFByb3BlcnR5TmFtZSwgbWFwcGVkUm9vdE9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcHJldk1hcHBlZFByb3BlcnR5IHx8IHJldHZhbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYob3B0aW9ucy5vYnNlcnZlLmxlbmd0aCA+IDAgJiYga28udXRpbHMuYXJyYXlJbmRleE9mKG9wdGlvbnMub2JzZXJ2ZSwgZnVsbFByb3BlcnR5TmFtZSkgPT0gLTEpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0W2luZGV4ZXJdID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29waWVkUHJvcGVydGllc1tmdWxsUHJvcGVydHlOYW1lXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrby5pc1dyaXRlYWJsZU9ic2VydmFibGUobWFwcGVkUm9vdE9iamVjdFtpbmRleGVyXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBlZFJvb3RPYmplY3RbaW5kZXhlcl0oKSAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3RbaW5kZXhlcl0odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXBwZWRSb290T2JqZWN0W2luZGV4ZXJdID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0W2luZGV4ZXJdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm1hcHBlZFByb3BlcnRpZXNbZnVsbFByb3BlcnR5TmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgeyAvL21hcHBlZFJvb3RPYmplY3QgaXMgYW4gYXJyYXlcclxuICAgICAgICAgICAgdmFyIGNoYW5nZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIHZhciBoYXNLZXlDYWxsYmFjayA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YXIga2V5Q2FsbGJhY2sgPSBmdW5jdGlvbiAoeCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHg7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zW3BhcmVudE5hbWVdICYmIG9wdGlvbnNbcGFyZW50TmFtZV0ua2V5KSB7XHJcbiAgICAgICAgICAgICAgICBrZXlDYWxsYmFjayA9IG9wdGlvbnNbcGFyZW50TmFtZV0ua2V5O1xyXG4gICAgICAgICAgICAgICAgaGFzS2V5Q2FsbGJhY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWtvLmlzT2JzZXJ2YWJsZShtYXBwZWRSb290T2JqZWN0KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gV2hlbiBjcmVhdGluZyB0aGUgbmV3IG9ic2VydmFibGUgYXJyYXksIGFsc28gYWRkIGEgYnVuY2ggb2YgdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCB0YWtlIHRoZSAna2V5JyBvZiB0aGUgYXJyYXkgaXRlbXMgaW50byBhY2NvdW50LlxyXG4gICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdCA9IGtvLm9ic2VydmFibGVBcnJheShbXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdC5tYXBwZWRSZW1vdmUgPSBmdW5jdGlvbiAodmFsdWVPclByZWRpY2F0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmVkaWNhdGUgPSB0eXBlb2YgdmFsdWVPclByZWRpY2F0ZSA9PSBcImZ1bmN0aW9uXCIgPyB2YWx1ZU9yUHJlZGljYXRlIDogZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IGtleUNhbGxiYWNrKHZhbHVlT3JQcmVkaWNhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBwZWRSb290T2JqZWN0LnJlbW92ZShmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlKGtleUNhbGxiYWNrKGl0ZW0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdC5tYXBwZWRSZW1vdmVBbGwgPSBmdW5jdGlvbiAoYXJyYXlPZlZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhcnJheU9mS2V5cyA9IGZpbHRlckFycmF5QnlLZXkoYXJyYXlPZlZhbHVlcywga2V5Q2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBwZWRSb290T2JqZWN0LnJlbW92ZShmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlJbmRleE9mKGFycmF5T2ZLZXlzLCBrZXlDYWxsYmFjayhpdGVtKSkgIT0gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QubWFwcGVkRGVzdHJveSA9IGZ1bmN0aW9uICh2YWx1ZU9yUHJlZGljYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZWRpY2F0ZSA9IHR5cGVvZiB2YWx1ZU9yUHJlZGljYXRlID09IFwiZnVuY3Rpb25cIiA/IHZhbHVlT3JQcmVkaWNhdGUgOiBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0ga2V5Q2FsbGJhY2sodmFsdWVPclByZWRpY2F0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBlZFJvb3RPYmplY3QuZGVzdHJveShmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlKGtleUNhbGxiYWNrKGl0ZW0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdC5tYXBwZWREZXN0cm95QWxsID0gZnVuY3Rpb24gKGFycmF5T2ZWYWx1ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXlPZktleXMgPSBmaWx0ZXJBcnJheUJ5S2V5KGFycmF5T2ZWYWx1ZXMsIGtleUNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGVkUm9vdE9iamVjdC5kZXN0cm95KGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrby51dGlscy5hcnJheUluZGV4T2YoYXJyYXlPZktleXMsIGtleUNhbGxiYWNrKGl0ZW0pKSAhPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdC5tYXBwZWRJbmRleE9mID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIga2V5cyA9IGZpbHRlckFycmF5QnlLZXkobWFwcGVkUm9vdE9iamVjdCgpLCBrZXlDYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleUNhbGxiYWNrKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrby51dGlscy5hcnJheUluZGV4T2Yoa2V5cywga2V5KTtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdC5tYXBwZWRHZXQgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBwZWRSb290T2JqZWN0KClbbWFwcGVkUm9vdE9iamVjdC5tYXBwZWRJbmRleE9mKGl0ZW0pXTtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdC5tYXBwZWRDcmVhdGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGVkUm9vdE9iamVjdC5tYXBwZWRJbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgYWxyZWFkeSBpcyBhbiBvYmplY3Qgd2l0aCB0aGUga2V5IHRoYXQgeW91IHNwZWNpZmllZC5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGhhc0NyZWF0ZUNhbGxiYWNrKCkgPyBjcmVhdGVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVXBkYXRlQ2FsbGJhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSB1cGRhdGVDYWxsYmFjayhpdGVtLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrby5pc1dyaXRlYWJsZU9ic2VydmFibGUoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0obmV3VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50QXJyYXlLZXlzID0gZmlsdGVyQXJyYXlCeUtleShrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG1hcHBlZFJvb3RPYmplY3QpLCBrZXlDYWxsYmFjaykuc29ydCgpO1xyXG4gICAgICAgICAgICB2YXIgbmV3QXJyYXlLZXlzID0gZmlsdGVyQXJyYXlCeUtleShyb290T2JqZWN0LCBrZXlDYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGlmIChoYXNLZXlDYWxsYmFjaykgbmV3QXJyYXlLZXlzLnNvcnQoKTtcclxuICAgICAgICAgICAgdmFyIGVkaXRTY3JpcHQgPSBrby51dGlscy5jb21wYXJlQXJyYXlzKGN1cnJlbnRBcnJheUtleXMsIG5ld0FycmF5S2V5cyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgaWdub3JlSW5kZXhPZiA9IHt9O1xyXG5cclxuICAgICAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgICAgIHZhciBqO1xyXG5cclxuICAgICAgICAgICAgdmFyIGtleTtcclxuICAgICAgICAgICAgdmFyIHVud3JhcHBlZFJvb3RPYmplY3QgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHJvb3RPYmplY3QpO1xyXG4gICAgICAgICAgICB2YXIgaXRlbXNCeUtleSA9IHt9O1xyXG4gICAgICAgICAgICB2YXIgb3B0aW1pemVkS2V5cyA9IHRydWU7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGogPSB1bndyYXBwZWRSb290T2JqZWN0Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG4gICAgICAgICAgICAgICAga2V5ID0ga2V5Q2FsbGJhY2sodW53cmFwcGVkUm9vdE9iamVjdFtpXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5IGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVkS2V5cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaXRlbXNCeUtleVtrZXldID0gdW53cmFwcGVkUm9vdE9iamVjdFtpXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIG5ld0NvbnRlbnRzID0gW107XHJcbiAgICAgICAgICAgIHZhciBwYXNzZWRPdmVyID0gMDtcclxuICAgICAgICAgICAgZm9yIChpID0gMCwgaiA9IGVkaXRTY3JpcHQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBlZGl0U2NyaXB0W2ldO1xyXG4gICAgICAgICAgICAgICAgdmFyIG1hcHBlZEl0ZW07XHJcbiAgICAgICAgICAgICAgICB2YXIgZnVsbFByb3BlcnR5TmFtZSA9IHBhcmVudFByb3BlcnR5TmFtZSArIFwiW1wiICsgaSArIFwiXVwiO1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW07XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXg7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleS5zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJhZGRlZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBvcHRpbWl6ZWRLZXlzID8gaXRlbXNCeUtleVtrZXkudmFsdWVdIDogZ2V0SXRlbUJ5S2V5KGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUocm9vdE9iamVjdCksIGtleS52YWx1ZSwga2V5Q2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcHBlZEl0ZW0gPSB1cGRhdGVWaWV3TW9kZWwodW5kZWZpbmVkLCBpdGVtLCBvcHRpb25zLCBwYXJlbnROYW1lLCBtYXBwZWRSb290T2JqZWN0LCBmdWxsUHJvcGVydHlOYW1lLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCFoYXNDcmVhdGVDYWxsYmFjaygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZEl0ZW0gPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG1hcHBlZEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpZ25vcmFibGVJbmRleE9mKGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUocm9vdE9iamVjdCksIGl0ZW0sIGlnbm9yZUluZGV4T2YpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGVkSXRlbSA9PT0gZW1wdHlSZXR1cm4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkT3ZlcisrO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRzW2luZGV4IC0gcGFzc2VkT3Zlcl0gPSBtYXBwZWRJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWdub3JlSW5kZXhPZltpbmRleF0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInJldGFpbmVkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG9wdGltaXplZEtleXMgPyBpdGVtc0J5S2V5W2tleS52YWx1ZV0gOiBnZXRJdGVtQnlLZXkoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShyb290T2JqZWN0KSwga2V5LnZhbHVlLCBrZXlDYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFwcGVkSXRlbSA9IGdldEl0ZW1CeUtleShtYXBwZWRSb290T2JqZWN0LCBrZXkudmFsdWUsIGtleUNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaWV3TW9kZWwobWFwcGVkSXRlbSwgaXRlbSwgb3B0aW9ucywgcGFyZW50TmFtZSwgbWFwcGVkUm9vdE9iamVjdCwgZnVsbFByb3BlcnR5TmFtZSwgcGFyZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpZ25vcmFibGVJbmRleE9mKGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUocm9vdE9iamVjdCksIGl0ZW0sIGlnbm9yZUluZGV4T2YpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRzW2luZGV4XSA9IG1hcHBlZEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgaWdub3JlSW5kZXhPZltpbmRleF0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZWRcIjpcclxuICAgICAgICAgICAgICAgICAgICBtYXBwZWRJdGVtID0gZ2V0SXRlbUJ5S2V5KG1hcHBlZFJvb3RPYmplY3QsIGtleS52YWx1ZSwga2V5Q2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IGtleS5zdGF0dXMsXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbTogbWFwcGVkSXRlbVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QobmV3Q29udGVudHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnNbcGFyZW50TmFtZV0gJiYgb3B0aW9uc1twYXJlbnROYW1lXS5hcnJheUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5Rm9yRWFjaChjaGFuZ2VzLCBmdW5jdGlvbiAoY2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1twYXJlbnROYW1lXS5hcnJheUNoYW5nZWQoY2hhbmdlLmV2ZW50LCBjaGFuZ2UuaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1hcHBlZFJvb3RPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaWdub3JhYmxlSW5kZXhPZihhcnJheSwgaXRlbSwgaWdub3JlSW5kaWNlcykge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChpZ25vcmVJbmRpY2VzW2ldID09PSB0cnVlKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKSByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWFwS2V5KGl0ZW0sIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgdmFyIG1hcHBlZEl0ZW07XHJcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBtYXBwZWRJdGVtID0gY2FsbGJhY2soaXRlbSk7XHJcbiAgICAgICAgaWYgKGV4cG9ydHMuZ2V0VHlwZShtYXBwZWRJdGVtKSA9PT0gXCJ1bmRlZmluZWRcIikgbWFwcGVkSXRlbSA9IGl0ZW07XHJcblxyXG4gICAgICAgIHJldHVybiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG1hcHBlZEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEl0ZW1CeUtleShhcnJheSwga2V5LCBjYWxsYmFjaykge1xyXG4gICAgICAgIGFycmF5ID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShhcnJheSk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW0gPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgaWYgKG1hcEtleShpdGVtLCBjYWxsYmFjaykgPT09IGtleSkgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXaGVuIGNhbGxpbmcga28udXBkYXRlKiwgdGhlIGtleSAnXCIgKyBrZXkgKyBcIicgd2FzIG5vdCBmb3VuZCFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZmlsdGVyQXJyYXlCeUtleShhcnJheSwgY2FsbGJhY2spIHtcclxuICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlNYXAoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShhcnJheSksIGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcEtleShpdGVtLCBjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHZpc2l0UHJvcGVydGllc09yQXJyYXlFbnRyaWVzKHJvb3RPYmplY3QsIHZpc2l0b3JDYWxsYmFjaykge1xyXG4gICAgICAgIGlmIChleHBvcnRzLmdldFR5cGUocm9vdE9iamVjdCkgPT09IFwiYXJyYXlcIikge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvb3RPYmplY3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHZpc2l0b3JDYWxsYmFjayhpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eU5hbWUgaW4gcm9vdE9iamVjdClcclxuICAgICAgICAgICAgdmlzaXRvckNhbGxiYWNrKHByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNhbkhhdmVQcm9wZXJ0aWVzKG9iamVjdCkge1xyXG4gICAgICAgIHZhciB0eXBlID0gZXhwb3J0cy5nZXRUeXBlKG9iamVjdCk7XHJcbiAgICAgICAgcmV0dXJuICgodHlwZSA9PT0gXCJvYmplY3RcIikgfHwgKHR5cGUgPT09IFwiYXJyYXlcIikpICYmIChvYmplY3QgIT09IG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEJhc2VkIG9uIHRoZSBwYXJlbnROYW1lLCB0aGlzIGNyZWF0ZXMgYSBmdWxseSBjbGFzc2lmaWVkIG5hbWUgb2YgYSBwcm9wZXJ0eVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFByb3BlcnR5TmFtZShwYXJlbnROYW1lLCBwYXJlbnQsIGluZGV4ZXIpIHtcclxuICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gcGFyZW50TmFtZSB8fCBcIlwiO1xyXG4gICAgICAgIGlmIChleHBvcnRzLmdldFR5cGUocGFyZW50KSA9PT0gXCJhcnJheVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnROYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgKz0gXCJbXCIgKyBpbmRleGVyICsgXCJdXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lICs9IFwiLlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZSArPSBpbmRleGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvcGVydHlOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydHMudmlzaXRNb2RlbCA9IGZ1bmN0aW9uIChyb290T2JqZWN0LCBjYWxsYmFjaywgb3B0aW9ucykge1xyXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG4gICAgICAgIG9wdGlvbnMudmlzaXRlZE9iamVjdHMgPSBvcHRpb25zLnZpc2l0ZWRPYmplY3RzIHx8IG5ldyBvYmplY3RMb29rdXAoKTtcclxuXHJcbiAgICAgICAgdmFyIG1hcHBlZFJvb3RPYmplY3Q7XHJcbiAgICAgICAgdmFyIHVud3JhcHBlZFJvb3RPYmplY3QgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHJvb3RPYmplY3QpO1xyXG5cclxuICAgICAgICBpZiAoIWNhbkhhdmVQcm9wZXJ0aWVzKHVud3JhcHBlZFJvb3RPYmplY3QpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhyb290T2JqZWN0LCBvcHRpb25zLnBhcmVudE5hbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSBmaWxsT3B0aW9ucyhvcHRpb25zLCB1bndyYXBwZWRSb290T2JqZWN0W21hcHBpbmdQcm9wZXJ0eV0pO1xyXG5cclxuICAgICAgICAgICAgLy8gT25seSBkbyBhIGNhbGxiYWNrLCBidXQgaWdub3JlIHRoZSByZXN1bHRzXHJcbiAgICAgICAgICAgIGNhbGxiYWNrKHJvb3RPYmplY3QsIG9wdGlvbnMucGFyZW50TmFtZSk7XHJcbiAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QgPSBleHBvcnRzLmdldFR5cGUodW53cmFwcGVkUm9vdE9iamVjdCkgPT09IFwiYXJyYXlcIiA/IFtdIDoge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvcHRpb25zLnZpc2l0ZWRPYmplY3RzLnNhdmUocm9vdE9iamVjdCwgbWFwcGVkUm9vdE9iamVjdCk7XHJcblxyXG4gICAgICAgIHZhciBwYXJlbnROYW1lID0gb3B0aW9ucy5wYXJlbnROYW1lO1xyXG4gICAgICAgIHZpc2l0UHJvcGVydGllc09yQXJyYXlFbnRyaWVzKHVud3JhcHBlZFJvb3RPYmplY3QsIGZ1bmN0aW9uIChpbmRleGVyKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmlnbm9yZSAmJiBrby51dGlscy5hcnJheUluZGV4T2Yob3B0aW9ucy5pZ25vcmUsIGluZGV4ZXIpICE9IC0xKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHVud3JhcHBlZFJvb3RPYmplY3RbaW5kZXhlcl07XHJcbiAgICAgICAgICAgIG9wdGlvbnMucGFyZW50TmFtZSA9IGdldFByb3BlcnR5TmFtZShwYXJlbnROYW1lLCB1bndyYXBwZWRSb290T2JqZWN0LCBpbmRleGVyKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IHdhbnQgdG8gZXhwbGljaXRseSBjb3B5IHRoZSB1bm1hcHBlZCBwcm9wZXJ0eS4uLlxyXG4gICAgICAgICAgICBpZiAoa28udXRpbHMuYXJyYXlJbmRleE9mKG9wdGlvbnMuY29weSwgaW5kZXhlcikgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAuLi5maW5kIG91dCBpZiBpdCdzIGEgcHJvcGVydHkgd2Ugd2FudCB0byBleHBsaWNpdGx5IGluY2x1ZGVcclxuICAgICAgICAgICAgICAgIGlmIChrby51dGlscy5hcnJheUluZGV4T2Yob3B0aW9ucy5pbmNsdWRlLCBpbmRleGVyKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbWFwcGVkIHByb3BlcnRpZXMgb2JqZWN0IGNvbnRhaW5zIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgb3JpZ2luYWwgb2JqZWN0LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGEgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsIGFuZCBpdCBpcyBub3QgYmVjYXVzZSBpdCBpcyBwYXJ0IG9mIGFuIGFycmF5IChlLmcuIFwibXlQcm9wWzNdXCIpLCB0aGVuIGl0IHNob3VsZCBub3QgYmUgdW5tYXBwZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVud3JhcHBlZFJvb3RPYmplY3RbbWFwcGluZ1Byb3BlcnR5XSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1bndyYXBwZWRSb290T2JqZWN0W21hcHBpbmdQcm9wZXJ0eV0ubWFwcGVkUHJvcGVydGllcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAhdW53cmFwcGVkUm9vdE9iamVjdFttYXBwaW5nUHJvcGVydHldLm1hcHBlZFByb3BlcnRpZXNbaW5kZXhlcl0gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwcGVkUm9vdE9iamVjdFttYXBwaW5nUHJvcGVydHldLmNvcGllZFByb3BlcnRpZXMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgIXVud3JhcHBlZFJvb3RPYmplY3RbbWFwcGluZ1Byb3BlcnR5XS5jb3BpZWRQcm9wZXJ0aWVzW2luZGV4ZXJdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMuZ2V0VHlwZSh1bndyYXBwZWRSb290T2JqZWN0KSAhPT0gXCJhcnJheVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIG91dHB1dFByb3BlcnR5O1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGV4cG9ydHMuZ2V0VHlwZShrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHByb3BlcnR5VmFsdWUpKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxyXG4gICAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseU1hcHBlZFZhbHVlID0gb3B0aW9ucy52aXNpdGVkT2JqZWN0cy5nZXQocHJvcGVydHlWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0W2luZGV4ZXJdID0gKGV4cG9ydHMuZ2V0VHlwZShwcmV2aW91c2x5TWFwcGVkVmFsdWUpICE9PSBcInVuZGVmaW5lZFwiKSA/IHByZXZpb3VzbHlNYXBwZWRWYWx1ZSA6IGV4cG9ydHMudmlzaXRNb2RlbChwcm9wZXJ0eVZhbHVlLCBjYWxsYmFjaywgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3RbaW5kZXhlcl0gPSBjYWxsYmFjayhwcm9wZXJ0eVZhbHVlLCBvcHRpb25zLnBhcmVudE5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBtYXBwZWRSb290T2JqZWN0O1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBzaW1wbGVPYmplY3RMb29rdXAoKSB7XHJcbiAgICAgICAgdmFyIGtleXMgPSBbXTtcclxuICAgICAgICB2YXIgdmFsdWVzID0gW107XHJcbiAgICAgICAgdGhpcy5zYXZlID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgdmFyIGV4aXN0aW5nSW5kZXggPSBrby51dGlscy5hcnJheUluZGV4T2Yoa2V5cywga2V5KTtcclxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nSW5kZXggPj0gMCkgdmFsdWVzW2V4aXN0aW5nSW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdJbmRleCA9IGtvLnV0aWxzLmFycmF5SW5kZXhPZihrZXlzLCBrZXkpO1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSAoZXhpc3RpbmdJbmRleCA+PSAwKSA/IHZhbHVlc1tleGlzdGluZ0luZGV4XSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb2JqZWN0TG9va3VwKCkge1xyXG4gICAgICAgIHZhciBidWNrZXRzID0ge307XHJcblxyXG4gICAgICAgIHZhciBmaW5kQnVja2V0ID0gZnVuY3Rpb24oa2V5KSB7XHJcbiAgICAgICAgICAgIHZhciBidWNrZXRLZXk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBidWNrZXRLZXkgPSBrZXk7Ly9KU09OLnN0cmluZ2lmeShrZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBidWNrZXRLZXkgPSBcIiQkJFwiO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgYnVja2V0ID0gYnVja2V0c1tidWNrZXRLZXldO1xyXG4gICAgICAgICAgICBpZiAoYnVja2V0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGJ1Y2tldCA9IG5ldyBzaW1wbGVPYmplY3RMb29rdXAoKTtcclxuICAgICAgICAgICAgICAgIGJ1Y2tldHNbYnVja2V0S2V5XSA9IGJ1Y2tldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYnVja2V0O1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc2F2ZSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGZpbmRCdWNrZXQoa2V5KS5zYXZlKGtleSwgdmFsdWUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmaW5kQnVja2V0KGtleSkuZ2V0KGtleSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufSkpO1xyXG4iLCIvKiFcbiAqIEtub2Nrb3V0IEphdmFTY3JpcHQgbGlicmFyeSB2My4zLjBcbiAqIChjKSBTdGV2ZW4gU2FuZGVyc29uIC0gaHR0cDovL2tub2Nrb3V0anMuY29tL1xuICogTGljZW5zZTogTUlUIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocClcbiAqL1xuXG4oZnVuY3Rpb24oKXtcbnZhciBERUJVRz10cnVlO1xuKGZ1bmN0aW9uKHVuZGVmaW5lZCl7XG4gICAgLy8gKDAsIGV2YWwpKCd0aGlzJykgaXMgYSByb2J1c3Qgd2F5IG9mIGdldHRpbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3RcbiAgICAvLyBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQxMTk5ODgvcmV0dXJuLXRoaXMtMC1ldmFsdGhpcy8xNDEyMDAyMyMxNDEyMDAyM1xuICAgIHZhciB3aW5kb3cgPSB0aGlzIHx8ICgwLCBldmFsKSgndGhpcycpLFxuICAgICAgICBkb2N1bWVudCA9IHdpbmRvd1snZG9jdW1lbnQnXSxcbiAgICAgICAgbmF2aWdhdG9yID0gd2luZG93WyduYXZpZ2F0b3InXSxcbiAgICAgICAgalF1ZXJ5SW5zdGFuY2UgPSB3aW5kb3dbXCJqUXVlcnlcIl0sXG4gICAgICAgIEpTT04gPSB3aW5kb3dbXCJKU09OXCJdO1xuKGZ1bmN0aW9uKGZhY3RvcnkpIHtcbiAgICAvLyBTdXBwb3J0IHRocmVlIG1vZHVsZSBsb2FkaW5nIHNjZW5hcmlvc1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pIHtcbiAgICAgICAgLy8gWzFdIEFNRCBhbm9ueW1vdXMgbW9kdWxlXG4gICAgICAgIGRlZmluZShbJ2V4cG9ydHMnLCAncmVxdWlyZSddLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBbMl0gQ29tbW9uSlMvTm9kZS5qc1xuICAgICAgICBmYWN0b3J5KG1vZHVsZVsnZXhwb3J0cyddIHx8IGV4cG9ydHMpOyAgLy8gbW9kdWxlLmV4cG9ydHMgaXMgZm9yIE5vZGUuanNcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBbM10gTm8gbW9kdWxlIGxvYWRlciAocGxhaW4gPHNjcmlwdD4gdGFnKSAtIHB1dCBkaXJlY3RseSBpbiBnbG9iYWwgbmFtZXNwYWNlXG4gICAgICAgIGZhY3Rvcnkod2luZG93WydrbyddID0ge30pO1xuICAgIH1cbn0oZnVuY3Rpb24oa29FeHBvcnRzLCBhbWRSZXF1aXJlKXtcbi8vIEludGVybmFsbHksIGFsbCBLTyBvYmplY3RzIGFyZSBhdHRhY2hlZCB0byBrb0V4cG9ydHMgKGV2ZW4gdGhlIG5vbi1leHBvcnRlZCBvbmVzIHdob3NlIG5hbWVzIHdpbGwgYmUgbWluaWZpZWQgYnkgdGhlIGNsb3N1cmUgY29tcGlsZXIpLlxuLy8gSW4gdGhlIGZ1dHVyZSwgdGhlIGZvbGxvd2luZyBcImtvXCIgdmFyaWFibGUgbWF5IGJlIG1hZGUgZGlzdGluY3QgZnJvbSBcImtvRXhwb3J0c1wiIHNvIHRoYXQgcHJpdmF0ZSBvYmplY3RzIGFyZSBub3QgZXh0ZXJuYWxseSByZWFjaGFibGUuXG52YXIga28gPSB0eXBlb2Yga29FeHBvcnRzICE9PSAndW5kZWZpbmVkJyA/IGtvRXhwb3J0cyA6IHt9O1xuLy8gR29vZ2xlIENsb3N1cmUgQ29tcGlsZXIgaGVscGVycyAodXNlZCBvbmx5IHRvIG1ha2UgdGhlIG1pbmlmaWVkIGZpbGUgc21hbGxlcilcbmtvLmV4cG9ydFN5bWJvbCA9IGZ1bmN0aW9uKGtvUGF0aCwgb2JqZWN0KSB7XG4gICAgdmFyIHRva2VucyA9IGtvUGF0aC5zcGxpdChcIi5cIik7XG5cbiAgICAvLyBJbiB0aGUgZnV0dXJlLCBcImtvXCIgbWF5IGJlY29tZSBkaXN0aW5jdCBmcm9tIFwia29FeHBvcnRzXCIgKHNvIHRoYXQgbm9uLWV4cG9ydGVkIG9iamVjdHMgYXJlIG5vdCByZWFjaGFibGUpXG4gICAgLy8gQXQgdGhhdCBwb2ludCwgXCJ0YXJnZXRcIiB3b3VsZCBiZSBzZXQgdG86ICh0eXBlb2Yga29FeHBvcnRzICE9PSBcInVuZGVmaW5lZFwiID8ga29FeHBvcnRzIDoga28pXG4gICAgdmFyIHRhcmdldCA9IGtvO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoIC0gMTsgaSsrKVxuICAgICAgICB0YXJnZXQgPSB0YXJnZXRbdG9rZW5zW2ldXTtcbiAgICB0YXJnZXRbdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXV0gPSBvYmplY3Q7XG59O1xua28uZXhwb3J0UHJvcGVydHkgPSBmdW5jdGlvbihvd25lciwgcHVibGljTmFtZSwgb2JqZWN0KSB7XG4gICAgb3duZXJbcHVibGljTmFtZV0gPSBvYmplY3Q7XG59O1xua28udmVyc2lvbiA9IFwiMy4zLjBcIjtcblxua28uZXhwb3J0U3ltYm9sKCd2ZXJzaW9uJywga28udmVyc2lvbik7XG5rby51dGlscyA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gb2JqZWN0Rm9yRWFjaChvYmosIGFjdGlvbikge1xuICAgICAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbihwcm9wLCBvYmpbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGZvcih2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZihzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKG9iaiwgcHJvdG8pIHtcbiAgICAgICAgb2JqLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHZhciBjYW5TZXRQcm90b3R5cGUgPSAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSk7XG5cbiAgICAvLyBSZXByZXNlbnQgdGhlIGtub3duIGV2ZW50IHR5cGVzIGluIGEgY29tcGFjdCB3YXksIHRoZW4gYXQgcnVudGltZSB0cmFuc2Zvcm0gaXQgaW50byBhIGhhc2ggd2l0aCBldmVudCBuYW1lIGFzIGtleSAoZm9yIGZhc3QgbG9va3VwKVxuICAgIHZhciBrbm93bkV2ZW50cyA9IHt9LCBrbm93bkV2ZW50VHlwZXNCeUV2ZW50TmFtZSA9IHt9O1xuICAgIHZhciBrZXlFdmVudFR5cGVOYW1lID0gKG5hdmlnYXRvciAmJiAvRmlyZWZveFxcLzIvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSA/ICdLZXlib2FyZEV2ZW50JyA6ICdVSUV2ZW50cyc7XG4gICAga25vd25FdmVudHNba2V5RXZlbnRUeXBlTmFtZV0gPSBbJ2tleXVwJywgJ2tleWRvd24nLCAna2V5cHJlc3MnXTtcbiAgICBrbm93bkV2ZW50c1snTW91c2VFdmVudHMnXSA9IFsnY2xpY2snLCAnZGJsY2xpY2snLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLCAnbW91c2Vtb3ZlJywgJ21vdXNlb3ZlcicsICdtb3VzZW91dCcsICdtb3VzZWVudGVyJywgJ21vdXNlbGVhdmUnXTtcbiAgICBvYmplY3RGb3JFYWNoKGtub3duRXZlbnRzLCBmdW5jdGlvbihldmVudFR5cGUsIGtub3duRXZlbnRzRm9yVHlwZSkge1xuICAgICAgICBpZiAoa25vd25FdmVudHNGb3JUeXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBrbm93bkV2ZW50c0ZvclR5cGUubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgIGtub3duRXZlbnRUeXBlc0J5RXZlbnROYW1lW2tub3duRXZlbnRzRm9yVHlwZVtpXV0gPSBldmVudFR5cGU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgZXZlbnRzVGhhdE11c3RCZVJlZ2lzdGVyZWRVc2luZ0F0dGFjaEV2ZW50ID0geyAncHJvcGVydHljaGFuZ2UnOiB0cnVlIH07IC8vIFdvcmthcm91bmQgZm9yIGFuIElFOSBpc3N1ZSAtIGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZVNhbmRlcnNvbi9rbm9ja291dC9pc3N1ZXMvNDA2XG5cbiAgICAvLyBEZXRlY3QgSUUgdmVyc2lvbnMgZm9yIGJ1ZyB3b3JrYXJvdW5kcyAodXNlcyBJRSBjb25kaXRpb25hbHMsIG5vdCBVQSBzdHJpbmcsIGZvciByb2J1c3RuZXNzKVxuICAgIC8vIE5vdGUgdGhhdCwgc2luY2UgSUUgMTAgZG9lcyBub3Qgc3VwcG9ydCBjb25kaXRpb25hbCBjb21tZW50cywgdGhlIGZvbGxvd2luZyBsb2dpYyBvbmx5IGRldGVjdHMgSUUgPCAxMC5cbiAgICAvLyBDdXJyZW50bHkgdGhpcyBpcyBieSBkZXNpZ24sIHNpbmNlIElFIDEwKyBiZWhhdmVzIGNvcnJlY3RseSB3aGVuIHRyZWF0ZWQgYXMgYSBzdGFuZGFyZCBicm93c2VyLlxuICAgIC8vIElmIHRoZXJlIGlzIGEgZnV0dXJlIG5lZWQgdG8gZGV0ZWN0IHNwZWNpZmljIHZlcnNpb25zIG9mIElFMTArLCB3ZSB3aWxsIGFtZW5kIHRoaXMuXG4gICAgdmFyIGllVmVyc2lvbiA9IGRvY3VtZW50ICYmIChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZlcnNpb24gPSAzLCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgaUVsZW1zID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpJyk7XG5cbiAgICAgICAgLy8gS2VlcCBjb25zdHJ1Y3RpbmcgY29uZGl0aW9uYWwgSFRNTCBibG9ja3MgdW50aWwgd2UgaGl0IG9uZSB0aGF0IHJlc29sdmVzIHRvIGFuIGVtcHR5IGZyYWdtZW50XG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSAnPCEtLVtpZiBndCBJRSAnICsgKCsrdmVyc2lvbikgKyAnXT48aT48L2k+PCFbZW5kaWZdLS0+JyxcbiAgICAgICAgICAgIGlFbGVtc1swXVxuICAgICAgICApIHt9XG4gICAgICAgIHJldHVybiB2ZXJzaW9uID4gNCA/IHZlcnNpb24gOiB1bmRlZmluZWQ7XG4gICAgfSgpKTtcbiAgICB2YXIgaXNJZTYgPSBpZVZlcnNpb24gPT09IDYsXG4gICAgICAgIGlzSWU3ID0gaWVWZXJzaW9uID09PSA3O1xuXG4gICAgZnVuY3Rpb24gaXNDbGlja09uQ2hlY2thYmxlRWxlbWVudChlbGVtZW50LCBldmVudFR5cGUpIHtcbiAgICAgICAgaWYgKChrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCkgIT09IFwiaW5wdXRcIikgfHwgIWVsZW1lbnQudHlwZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZXZlbnRUeXBlLnRvTG93ZXJDYXNlKCkgIT0gXCJjbGlja1wiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBpbnB1dFR5cGUgPSBlbGVtZW50LnR5cGU7XG4gICAgICAgIHJldHVybiAoaW5wdXRUeXBlID09IFwiY2hlY2tib3hcIikgfHwgKGlucHV0VHlwZSA9PSBcInJhZGlvXCIpO1xuICAgIH1cblxuICAgIC8vIEZvciBkZXRhaWxzIG9uIHRoZSBwYXR0ZXJuIGZvciBjaGFuZ2luZyBub2RlIGNsYXNzZXNcbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9rbm9ja291dC9rbm9ja291dC9pc3N1ZXMvMTU5N1xuICAgIHZhciBjc3NDbGFzc05hbWVSZWdleCA9IC9cXFMrL2c7XG5cbiAgICBmdW5jdGlvbiB0b2dnbGVEb21Ob2RlQ3NzQ2xhc3Mobm9kZSwgY2xhc3NOYW1lcywgc2hvdWxkSGF2ZUNsYXNzKSB7XG4gICAgICAgIHZhciBhZGRPclJlbW92ZUZuO1xuICAgICAgICBpZiAoY2xhc3NOYW1lcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmNsYXNzTGlzdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBhZGRPclJlbW92ZUZuID0gbm9kZS5jbGFzc0xpc3Rbc2hvdWxkSGF2ZUNsYXNzID8gJ2FkZCcgOiAncmVtb3ZlJ107XG4gICAgICAgICAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGNsYXNzTmFtZXMubWF0Y2goY3NzQ2xhc3NOYW1lUmVnZXgpLCBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkT3JSZW1vdmVGbi5jYWxsKG5vZGUuY2xhc3NMaXN0LCBjbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygbm9kZS5jbGFzc05hbWVbJ2Jhc2VWYWwnXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBTVkcgdGFnIC5jbGFzc05hbWVzIGlzIGFuIFNWR0FuaW1hdGVkU3RyaW5nIGluc3RhbmNlXG4gICAgICAgICAgICAgICAgdG9nZ2xlT2JqZWN0Q2xhc3NQcm9wZXJ0eVN0cmluZyhub2RlLmNsYXNzTmFtZSwgJ2Jhc2VWYWwnLCBjbGFzc05hbWVzLCBzaG91bGRIYXZlQ2xhc3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBub2RlLmNsYXNzTmFtZSBvdWdodCB0byBiZSBhIHN0cmluZy5cbiAgICAgICAgICAgICAgICB0b2dnbGVPYmplY3RDbGFzc1Byb3BlcnR5U3RyaW5nKG5vZGUsICdjbGFzc05hbWUnLCBjbGFzc05hbWVzLCBzaG91bGRIYXZlQ2xhc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9nZ2xlT2JqZWN0Q2xhc3NQcm9wZXJ0eVN0cmluZyhvYmosIHByb3AsIGNsYXNzTmFtZXMsIHNob3VsZEhhdmVDbGFzcykge1xuICAgICAgICAvLyBvYmovcHJvcCBpcyBlaXRoZXIgYSBub2RlLydjbGFzc05hbWUnIG9yIGEgU1ZHQW5pbWF0ZWRTdHJpbmcvJ2Jhc2VWYWwnLlxuICAgICAgICB2YXIgY3VycmVudENsYXNzTmFtZXMgPSBvYmpbcHJvcF0ubWF0Y2goY3NzQ2xhc3NOYW1lUmVnZXgpIHx8IFtdO1xuICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goY2xhc3NOYW1lcy5tYXRjaChjc3NDbGFzc05hbWVSZWdleCksIGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAga28udXRpbHMuYWRkT3JSZW1vdmVJdGVtKGN1cnJlbnRDbGFzc05hbWVzLCBjbGFzc05hbWUsIHNob3VsZEhhdmVDbGFzcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBvYmpbcHJvcF0gPSBjdXJyZW50Q2xhc3NOYW1lcy5qb2luKFwiIFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBmaWVsZHNJbmNsdWRlZFdpdGhKc29uUG9zdDogWydhdXRoZW50aWNpdHlfdG9rZW4nLCAvXl9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuKF8uKik/JC9dLFxuXG4gICAgICAgIGFycmF5Rm9yRWFjaDogZnVuY3Rpb24gKGFycmF5LCBhY3Rpb24pIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgIGFjdGlvbihhcnJheVtpXSwgaSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXJyYXlJbmRleE9mOiBmdW5jdGlvbiAoYXJyYXksIGl0ZW0pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGFycmF5LCBpdGVtKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXJyYXlGaXJzdDogZnVuY3Rpb24gKGFycmF5LCBwcmVkaWNhdGUsIHByZWRpY2F0ZU93bmVyKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwocHJlZGljYXRlT3duZXIsIGFycmF5W2ldLCBpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5W2ldO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXJyYXlSZW1vdmVJdGVtOiBmdW5jdGlvbiAoYXJyYXksIGl0ZW1Ub1JlbW92ZSkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0ga28udXRpbHMuYXJyYXlJbmRleE9mKGFycmF5LCBpdGVtVG9SZW1vdmUpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGFycmF5LnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXJyYXlHZXREaXN0aW5jdFZhbHVlczogZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgICAgICBhcnJheSA9IGFycmF5IHx8IFtdO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoa28udXRpbHMuYXJyYXlJbmRleE9mKHJlc3VsdCwgYXJyYXlbaV0pIDwgMClcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBhcnJheU1hcDogZnVuY3Rpb24gKGFycmF5LCBtYXBwaW5nKSB7XG4gICAgICAgICAgICBhcnJheSA9IGFycmF5IHx8IFtdO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWFwcGluZyhhcnJheVtpXSwgaSkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBhcnJheUZpbHRlcjogZnVuY3Rpb24gKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIGFycmF5ID0gYXJyYXkgfHwgW107XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAocHJlZGljYXRlKGFycmF5W2ldLCBpKSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyYXlbaV0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBhcnJheVB1c2hBbGw6IGZ1bmN0aW9uIChhcnJheSwgdmFsdWVzVG9QdXNoKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzVG9QdXNoIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICAgICAgICAgICAgYXJyYXkucHVzaC5hcHBseShhcnJheSwgdmFsdWVzVG9QdXNoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IHZhbHVlc1RvUHVzaC5sZW5ndGg7IGkgPCBqOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzVG9QdXNoW2ldKTtcbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgfSxcblxuICAgICAgICBhZGRPclJlbW92ZUl0ZW06IGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSwgaW5jbHVkZWQpIHtcbiAgICAgICAgICAgIHZhciBleGlzdGluZ0VudHJ5SW5kZXggPSBrby51dGlscy5hcnJheUluZGV4T2Yoa28udXRpbHMucGVla09ic2VydmFibGUoYXJyYXkpLCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdFbnRyeUluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlZClcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZWQpXG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShleGlzdGluZ0VudHJ5SW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGNhblNldFByb3RvdHlwZTogY2FuU2V0UHJvdG90eXBlLFxuXG4gICAgICAgIGV4dGVuZDogZXh0ZW5kLFxuXG4gICAgICAgIHNldFByb3RvdHlwZU9mOiBzZXRQcm90b3R5cGVPZixcblxuICAgICAgICBzZXRQcm90b3R5cGVPZk9yRXh0ZW5kOiBjYW5TZXRQcm90b3R5cGUgPyBzZXRQcm90b3R5cGVPZiA6IGV4dGVuZCxcblxuICAgICAgICBvYmplY3RGb3JFYWNoOiBvYmplY3RGb3JFYWNoLFxuXG4gICAgICAgIG9iamVjdE1hcDogZnVuY3Rpb24oc291cmNlLCBtYXBwaW5nKSB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IG1hcHBpbmcoc291cmNlW3Byb3BdLCBwcm9wLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW1wdHlEb21Ob2RlOiBmdW5jdGlvbiAoZG9tTm9kZSkge1xuICAgICAgICAgICAgd2hpbGUgKGRvbU5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIGtvLnJlbW92ZU5vZGUoZG9tTm9kZS5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBtb3ZlQ2xlYW5lZE5vZGVzVG9Db250YWluZXJFbGVtZW50OiBmdW5jdGlvbihub2Rlcykge1xuICAgICAgICAgICAgLy8gRW5zdXJlIGl0J3MgYSByZWFsIGFycmF5LCBhcyB3ZSdyZSBhYm91dCB0byByZXBhcmVudCB0aGUgbm9kZXMgYW5kXG4gICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gdG8gY2hhbmdlIHdoaWxlIHdlJ3JlIGRvaW5nIHRoYXQuXG4gICAgICAgICAgICB2YXIgbm9kZXNBcnJheSA9IGtvLnV0aWxzLm1ha2VBcnJheShub2Rlcyk7XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVEb2N1bWVudCA9IChub2Rlc0FycmF5WzBdICYmIG5vZGVzQXJyYXlbMF0ub3duZXJEb2N1bWVudCkgfHwgZG9jdW1lbnQ7XG5cbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSB0ZW1wbGF0ZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBub2Rlc0FycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChrby5jbGVhbk5vZGUobm9kZXNBcnJheVtpXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICAgICAgfSxcblxuICAgICAgICBjbG9uZU5vZGVzOiBmdW5jdGlvbiAobm9kZXNBcnJheSwgc2hvdWxkQ2xlYW5Ob2Rlcykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBub2Rlc0FycmF5Lmxlbmd0aCwgbmV3Tm9kZXNBcnJheSA9IFtdOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsb25lZE5vZGUgPSBub2Rlc0FycmF5W2ldLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBuZXdOb2Rlc0FycmF5LnB1c2goc2hvdWxkQ2xlYW5Ob2RlcyA/IGtvLmNsZWFuTm9kZShjbG9uZWROb2RlKSA6IGNsb25lZE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld05vZGVzQXJyYXk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0RG9tTm9kZUNoaWxkcmVuOiBmdW5jdGlvbiAoZG9tTm9kZSwgY2hpbGROb2Rlcykge1xuICAgICAgICAgICAga28udXRpbHMuZW1wdHlEb21Ob2RlKGRvbU5vZGUpO1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHJlcGxhY2VEb21Ob2RlczogZnVuY3Rpb24gKG5vZGVUb1JlcGxhY2VPck5vZGVBcnJheSwgbmV3Tm9kZXNBcnJheSkge1xuICAgICAgICAgICAgdmFyIG5vZGVzVG9SZXBsYWNlQXJyYXkgPSBub2RlVG9SZXBsYWNlT3JOb2RlQXJyYXkubm9kZVR5cGUgPyBbbm9kZVRvUmVwbGFjZU9yTm9kZUFycmF5XSA6IG5vZGVUb1JlcGxhY2VPck5vZGVBcnJheTtcbiAgICAgICAgICAgIGlmIChub2Rlc1RvUmVwbGFjZUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBub2Rlc1RvUmVwbGFjZUFycmF5WzBdO1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBpbnNlcnRpb25Qb2ludC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gbmV3Tm9kZXNBcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZXNBcnJheVtpXSwgaW5zZXJ0aW9uUG9pbnQpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gbm9kZXNUb1JlcGxhY2VBcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAga28ucmVtb3ZlTm9kZShub2Rlc1RvUmVwbGFjZUFycmF5W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZml4VXBDb250aW51b3VzTm9kZUFycmF5OiBmdW5jdGlvbihjb250aW51b3VzTm9kZUFycmF5LCBwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAvLyBCZWZvcmUgYWN0aW5nIG9uIGEgc2V0IG9mIG5vZGVzIHRoYXQgd2VyZSBwcmV2aW91c2x5IG91dHB1dHRlZCBieSBhIHRlbXBsYXRlIGZ1bmN0aW9uLCB3ZSBoYXZlIHRvIHJlY29uY2lsZVxuICAgICAgICAgICAgLy8gdGhlbSBhZ2FpbnN0IHdoYXQgaXMgaW4gdGhlIERPTSByaWdodCBub3cuIEl0IG1heSBiZSB0aGF0IHNvbWUgb2YgdGhlIG5vZGVzIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQsIG9yIHRoYXRcbiAgICAgICAgICAgIC8vIG5ldyBub2RlcyBtaWdodCBoYXZlIGJlZW4gaW5zZXJ0ZWQgaW4gdGhlIG1pZGRsZSwgZm9yIGV4YW1wbGUgYnkgYSBiaW5kaW5nLiBBbHNvLCB0aGVyZSBtYXkgcHJldmlvdXNseSBoYXZlIGJlZW5cbiAgICAgICAgICAgIC8vIGxlYWRpbmcgY29tbWVudCBub2RlcyAoY3JlYXRlZCBieSByZXdyaXR0ZW4gc3RyaW5nLWJhc2VkIHRlbXBsYXRlcykgdGhhdCBoYXZlIHNpbmNlIGJlZW4gcmVtb3ZlZCBkdXJpbmcgYmluZGluZy5cbiAgICAgICAgICAgIC8vIFNvLCB0aGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIG9sZCBcIm1hcFwiIG91dHB1dCBhcnJheSBpbnRvIGl0cyBiZXN0IGd1ZXNzIG9mIHRoZSBzZXQgb2YgY3VycmVudCBET00gbm9kZXMuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gUnVsZXM6XG4gICAgICAgICAgICAvLyAgIFtBXSBBbnkgbGVhZGluZyBub2RlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgICAgICAgICAvLyAgICAgICBUaGVzZSBtb3N0IGxpa2VseSBjb3JyZXNwb25kIHRvIG1lbW9pemF0aW9uIG5vZGVzIHRoYXQgd2VyZSBhbHJlYWR5IHJlbW92ZWQgZHVyaW5nIGJpbmRpbmdcbiAgICAgICAgICAgIC8vICAgICAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvcHVsbC80NDBcbiAgICAgICAgICAgIC8vICAgW0JdIFdlIHdhbnQgdG8gb3V0cHV0IGEgY29udGludW91cyBzZXJpZXMgb2Ygbm9kZXMuIFNvLCBpZ25vcmUgYW55IG5vZGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCxcbiAgICAgICAgICAgIC8vICAgICAgIGFuZCBpbmNsdWRlIGFueSBub2RlcyB0aGF0IGhhdmUgYmVlbiBpbnNlcnRlZCBhbW9uZyB0aGUgcHJldmlvdXMgY29sbGVjdGlvblxuXG4gICAgICAgICAgICBpZiAoY29udGludW91c05vZGVBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcGFyZW50IG5vZGUgY2FuIGJlIGEgdmlydHVhbCBlbGVtZW50OyBzbyBnZXQgdGhlIHJlYWwgcGFyZW50IG5vZGVcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gKHBhcmVudE5vZGUubm9kZVR5cGUgPT09IDggJiYgcGFyZW50Tm9kZS5wYXJlbnROb2RlKSB8fCBwYXJlbnROb2RlO1xuXG4gICAgICAgICAgICAgICAgLy8gUnVsZSBbQV1cbiAgICAgICAgICAgICAgICB3aGlsZSAoY29udGludW91c05vZGVBcnJheS5sZW5ndGggJiYgY29udGludW91c05vZGVBcnJheVswXS5wYXJlbnROb2RlICE9PSBwYXJlbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzTm9kZUFycmF5LnNwbGljZSgwLCAxKTtcblxuICAgICAgICAgICAgICAgIC8vIFJ1bGUgW0JdXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IGNvbnRpbnVvdXNOb2RlQXJyYXlbMF0sIGxhc3QgPSBjb250aW51b3VzTm9kZUFycmF5W2NvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2Ugd2l0aCB0aGUgYWN0dWFsIG5ldyBjb250aW51b3VzIG5vZGUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT09IGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNOb2RlQXJyYXkucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50KSAvLyBXb24ndCBoYXBwZW4sIGV4Y2VwdCBpZiB0aGUgZGV2ZWxvcGVyIGhhcyBtYW51YWxseSByZW1vdmVkIHNvbWUgRE9NIGVsZW1lbnRzICh0aGVuIHdlJ3JlIGluIGFuIHVuZGVmaW5lZCBzY2VuYXJpbylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludW91c05vZGVBcnJheS5wdXNoKGxhc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb250aW51b3VzTm9kZUFycmF5O1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldE9wdGlvbk5vZGVTZWxlY3Rpb25TdGF0ZTogZnVuY3Rpb24gKG9wdGlvbk5vZGUsIGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIElFNiBzb21ldGltZXMgdGhyb3dzIFwidW5rbm93biBlcnJvclwiIGlmIHlvdSB0cnkgdG8gd3JpdGUgdG8gLnNlbGVjdGVkIGRpcmVjdGx5LCB3aGVyZWFzIEZpcmVmb3ggc3RydWdnbGVzIHdpdGggc2V0QXR0cmlidXRlLiBQaWNrIG9uZSBiYXNlZCBvbiBicm93c2VyLlxuICAgICAgICAgICAgaWYgKGllVmVyc2lvbiA8IDcpXG4gICAgICAgICAgICAgICAgb3B0aW9uTm9kZS5zZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiLCBpc1NlbGVjdGVkKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBvcHRpb25Ob2RlLnNlbGVjdGVkID0gaXNTZWxlY3RlZDtcbiAgICAgICAgfSxcblxuICAgICAgICBzdHJpbmdUcmltOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nID09PSBudWxsIHx8IHN0cmluZyA9PT0gdW5kZWZpbmVkID8gJycgOlxuICAgICAgICAgICAgICAgIHN0cmluZy50cmltID9cbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nLnRyaW0oKSA6XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZy50b1N0cmluZygpLnJlcGxhY2UoL15bXFxzXFx4YTBdK3xbXFxzXFx4YTBdKyQvZywgJycpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHN0cmluZ1N0YXJ0c1dpdGg6IGZ1bmN0aW9uIChzdHJpbmcsIHN0YXJ0c1dpdGgpIHtcbiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiO1xuICAgICAgICAgICAgaWYgKHN0YXJ0c1dpdGgubGVuZ3RoID4gc3RyaW5nLmxlbmd0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBzdGFydHNXaXRoLmxlbmd0aCkgPT09IHN0YXJ0c1dpdGg7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZG9tTm9kZUlzQ29udGFpbmVkQnk6IGZ1bmN0aW9uIChub2RlLCBjb250YWluZWRCeU5vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSBjb250YWluZWRCeU5vZGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMTEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGaXhlcyBpc3N1ZSAjMTE2MiAtIGNhbid0IHVzZSBub2RlLmNvbnRhaW5zIGZvciBkb2N1bWVudCBmcmFnbWVudHMgb24gSUU4XG4gICAgICAgICAgICBpZiAoY29udGFpbmVkQnlOb2RlLmNvbnRhaW5zKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZWRCeU5vZGUuY29udGFpbnMobm9kZS5ub2RlVHlwZSA9PT0gMyA/IG5vZGUucGFyZW50Tm9kZSA6IG5vZGUpO1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lZEJ5Tm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm4gKGNvbnRhaW5lZEJ5Tm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKSAmIDE2KSA9PSAxNjtcbiAgICAgICAgICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT0gY29udGFpbmVkQnlOb2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhIW5vZGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZG9tTm9kZUlzQXR0YWNoZWRUb0RvY3VtZW50OiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLmRvbU5vZGVJc0NvbnRhaW5lZEJ5KG5vZGUsIG5vZGUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFueURvbU5vZGVJc0F0dGFjaGVkVG9Eb2N1bWVudDogZnVuY3Rpb24obm9kZXMpIHtcbiAgICAgICAgICAgIHJldHVybiAhIWtvLnV0aWxzLmFycmF5Rmlyc3Qobm9kZXMsIGtvLnV0aWxzLmRvbU5vZGVJc0F0dGFjaGVkVG9Eb2N1bWVudCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdGFnTmFtZUxvd2VyOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBGb3IgSFRNTCBlbGVtZW50cywgdGFnTmFtZSB3aWxsIGFsd2F5cyBiZSB1cHBlciBjYXNlOyBmb3IgWEhUTUwgZWxlbWVudHMsIGl0J2xsIGJlIGxvd2VyIGNhc2UuXG4gICAgICAgICAgICAvLyBQb3NzaWJsZSBmdXR1cmUgb3B0aW1pemF0aW9uOiBJZiB3ZSBrbm93IGl0J3MgYW4gZWxlbWVudCBmcm9tIGFuIFhIVE1MIGRvY3VtZW50IChub3QgSFRNTCksXG4gICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoZSAudG9Mb3dlckNhc2UoKSBhcyBpdCB3aWxsIGFsd2F5cyBiZSBsb3dlciBjYXNlIGFueXdheS5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQudGFnTmFtZSAmJiBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZWdpc3RlckV2ZW50SGFuZGxlcjogZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50VHlwZSwgaGFuZGxlcikge1xuICAgICAgICAgICAgdmFyIG11c3RVc2VBdHRhY2hFdmVudCA9IGllVmVyc2lvbiAmJiBldmVudHNUaGF0TXVzdEJlUmVnaXN0ZXJlZFVzaW5nQXR0YWNoRXZlbnRbZXZlbnRUeXBlXTtcbiAgICAgICAgICAgIGlmICghbXVzdFVzZUF0dGFjaEV2ZW50ICYmIGpRdWVyeUluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgalF1ZXJ5SW5zdGFuY2UoZWxlbWVudClbJ2JpbmQnXShldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghbXVzdFVzZUF0dGFjaEV2ZW50ICYmIHR5cGVvZiBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50LmF0dGFjaEV2ZW50ICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXR0YWNoRXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7IGhhbmRsZXIuY2FsbChlbGVtZW50LCBldmVudCk7IH0sXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaEV2ZW50TmFtZSA9IFwib25cIiArIGV2ZW50VHlwZTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KGF0dGFjaEV2ZW50TmFtZSwgYXR0YWNoRXZlbnRIYW5kbGVyKTtcblxuICAgICAgICAgICAgICAgIC8vIElFIGRvZXMgbm90IGRpc3Bvc2UgYXR0YWNoRXZlbnQgaGFuZGxlcnMgYXV0b21hdGljYWxseSAodW5saWtlIHdpdGggYWRkRXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICAgICAgICAvLyBzbyB0byBhdm9pZCBsZWFrcywgd2UgaGF2ZSB0byByZW1vdmUgdGhlbSBtYW51YWxseS4gU2VlIGJ1ZyAjODU2XG4gICAgICAgICAgICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhlbGVtZW50LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kZXRhY2hFdmVudChhdHRhY2hFdmVudE5hbWUsIGF0dGFjaEV2ZW50SGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCcm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBhZGRFdmVudExpc3RlbmVyIG9yIGF0dGFjaEV2ZW50XCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRyaWdnZXJFdmVudDogZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgaWYgKCEoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbGVtZW50IG11c3QgYmUgYSBET00gbm9kZSB3aGVuIGNhbGxpbmcgdHJpZ2dlckV2ZW50XCIpO1xuXG4gICAgICAgICAgICAvLyBGb3IgY2xpY2sgZXZlbnRzIG9uIGNoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMsIGpRdWVyeSB0b2dnbGVzIHRoZSBlbGVtZW50IGNoZWNrZWQgc3RhdGUgKmFmdGVyKiB0aGVcbiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXIgcnVucyBpbnN0ZWFkIG9mICpiZWZvcmUqLiAoVGhpcyB3YXMgZml4ZWQgaW4gMS45IGZvciBjaGVja2JveGVzIGJ1dCBub3QgZm9yIHJhZGlvIGJ1dHRvbnMuKVxuICAgICAgICAgICAgLy8gSUUgZG9lc24ndCBjaGFuZ2UgdGhlIGNoZWNrZWQgc3RhdGUgd2hlbiB5b3UgdHJpZ2dlciB0aGUgY2xpY2sgZXZlbnQgdXNpbmcgXCJmaXJlRXZlbnRcIi5cbiAgICAgICAgICAgIC8vIEluIGJvdGggY2FzZXMsIHdlJ2xsIHVzZSB0aGUgY2xpY2sgbWV0aG9kIGluc3RlYWQuXG4gICAgICAgICAgICB2YXIgdXNlQ2xpY2tXb3JrYXJvdW5kID0gaXNDbGlja09uQ2hlY2thYmxlRWxlbWVudChlbGVtZW50LCBldmVudFR5cGUpO1xuXG4gICAgICAgICAgICBpZiAoalF1ZXJ5SW5zdGFuY2UgJiYgIXVzZUNsaWNrV29ya2Fyb3VuZCkge1xuICAgICAgICAgICAgICAgIGpRdWVyeUluc3RhbmNlKGVsZW1lbnQpWyd0cmlnZ2VyJ10oZXZlbnRUeXBlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5kaXNwYXRjaEV2ZW50ID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXZlbnRDYXRlZ29yeSA9IGtub3duRXZlbnRUeXBlc0J5RXZlbnROYW1lW2V2ZW50VHlwZV0gfHwgXCJIVE1MRXZlbnRzXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KGV2ZW50Q2F0ZWdvcnkpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5pbml0RXZlbnQoZXZlbnRUeXBlLCB0cnVlLCB0cnVlLCB3aW5kb3csIDAsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3VwcGxpZWQgZWxlbWVudCBkb2Vzbid0IHN1cHBvcnQgZGlzcGF0Y2hFdmVudFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlQ2xpY2tXb3JrYXJvdW5kICYmIGVsZW1lbnQuY2xpY2spIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsaWNrKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50LmZpcmVFdmVudCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5maXJlRXZlbnQoXCJvblwiICsgZXZlbnRUeXBlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdHJpZ2dlcmluZyBldmVudHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW53cmFwT2JzZXJ2YWJsZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ga28uaXNPYnNlcnZhYmxlKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBwZWVrT2JzZXJ2YWJsZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ga28uaXNPYnNlcnZhYmxlKHZhbHVlKSA/IHZhbHVlLnBlZWsoKSA6IHZhbHVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvZ2dsZURvbU5vZGVDc3NDbGFzczogdG9nZ2xlRG9tTm9kZUNzc0NsYXNzLFxuXG4gICAgICAgIHNldFRleHRDb250ZW50OiBmdW5jdGlvbihlbGVtZW50LCB0ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh0ZXh0Q29udGVudCk7XG4gICAgICAgICAgICBpZiAoKHZhbHVlID09PSBudWxsKSB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBcIlwiO1xuXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRoZXJlIHRvIGJlIGV4YWN0bHkgb25lIGNoaWxkOiBhIHRleHQgbm9kZS5cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBjaGlsZHJlbiwgbW9yZSB0aGFuIG9uZSwgb3IgaWYgaXQncyBub3QgYSB0ZXh0IG5vZGUsXG4gICAgICAgICAgICAvLyB3ZSdsbCBjbGVhciBldmVyeXRoaW5nIGFuZCBjcmVhdGUgYSBzaW5nbGUgdGV4dCBub2RlLlxuICAgICAgICAgICAgdmFyIGlubmVyVGV4dE5vZGUgPSBrby52aXJ0dWFsRWxlbWVudHMuZmlyc3RDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICghaW5uZXJUZXh0Tm9kZSB8fCBpbm5lclRleHROb2RlLm5vZGVUeXBlICE9IDMgfHwga28udmlydHVhbEVsZW1lbnRzLm5leHRTaWJsaW5nKGlubmVyVGV4dE5vZGUpKSB7XG4gICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLnNldERvbU5vZGVDaGlsZHJlbihlbGVtZW50LCBbZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbm5lclRleHROb2RlLmRhdGEgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAga28udXRpbHMuZm9yY2VSZWZyZXNoKGVsZW1lbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldEVsZW1lbnROYW1lOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lKSB7XG4gICAgICAgICAgICBlbGVtZW50Lm5hbWUgPSBuYW1lO1xuXG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIElFIDYvNyBpc3N1ZVxuICAgICAgICAgICAgLy8gLSBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzE5N1xuICAgICAgICAgICAgLy8gLSBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L3NldHRpbmdfdGhlX25hbWVfYXR0cmlidXRlX2luX2llX2RvbS9cbiAgICAgICAgICAgIGlmIChpZVZlcnNpb24gPD0gNykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubWVyZ2VBdHRyaWJ1dGVzKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCI8aW5wdXQgbmFtZT0nXCIgKyBlbGVtZW50Lm5hbWUgKyBcIicvPlwiKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlKSB7fSAvLyBGb3IgSUU5IHdpdGggZG9jIG1vZGUgXCJJRTkgU3RhbmRhcmRzXCIgYW5kIGJyb3dzZXIgbW9kZSBcIklFOSBDb21wYXRpYmlsaXR5IFZpZXdcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGZvcmNlUmVmcmVzaDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgYW4gSUU5IHJlbmRlcmluZyBidWcgLSBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzIwOVxuICAgICAgICAgICAgaWYgKGllVmVyc2lvbiA+PSA5KSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHRleHQgbm9kZXMgYW5kIGNvbW1lbnQgbm9kZXMgKG1vc3QgbGlrZWx5IHZpcnR1YWwgZWxlbWVudHMpLCB3ZSB3aWxsIGhhdmUgdG8gcmVmcmVzaCB0aGUgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgdmFyIGVsZW0gPSBub2RlLm5vZGVUeXBlID09IDEgPyBub2RlIDogbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLnN0eWxlKVxuICAgICAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLnpvb20gPSBlbGVtLnN0eWxlLnpvb207XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW5zdXJlU2VsZWN0RWxlbWVudElzUmVuZGVyZWRDb3JyZWN0bHk6IGZ1bmN0aW9uKHNlbGVjdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIElFOSByZW5kZXJpbmcgYnVnIC0gaXQgZG9lc24ndCByZWxpYWJseSBkaXNwbGF5IGFsbCB0aGUgdGV4dCBpbiBkeW5hbWljYWxseS1hZGRlZCBzZWxlY3QgYm94ZXMgdW5sZXNzIHlvdSBmb3JjZSBpdCB0byByZS1yZW5kZXIgYnkgdXBkYXRpbmcgdGhlIHdpZHRoLlxuICAgICAgICAgICAgLy8gKFNlZSBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzMxMiwgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81OTA4NDk0L3NlbGVjdC1vbmx5LXNob3dzLWZpcnN0LWNoYXItb2Ytc2VsZWN0ZWQtb3B0aW9uKVxuICAgICAgICAgICAgLy8gQWxzbyBmaXhlcyBJRTcgYW5kIElFOCBidWcgdGhhdCBjYXVzZXMgc2VsZWN0cyB0byBiZSB6ZXJvIHdpZHRoIGlmIGVuY2xvc2VkIGJ5ICdpZicgb3IgJ3dpdGgnLiAoU2VlIGlzc3VlICM4MzkpXG4gICAgICAgICAgICBpZiAoaWVWZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsV2lkdGggPSBzZWxlY3RFbGVtZW50LnN0eWxlLndpZHRoO1xuICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuc3R5bGUud2lkdGggPSAwO1xuICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuc3R5bGUud2lkdGggPSBvcmlnaW5hbFdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHJhbmdlOiBmdW5jdGlvbiAobWluLCBtYXgpIHtcbiAgICAgICAgICAgIG1pbiA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUobWluKTtcbiAgICAgICAgICAgIG1heCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUobWF4KTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBtaW47IGkgPD0gbWF4OyBpKyspXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIG1ha2VBcnJheTogZnVuY3Rpb24oYXJyYXlMaWtlT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFycmF5TGlrZU9iamVjdC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChhcnJheUxpa2VPYmplY3RbaV0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNJZTYgOiBpc0llNixcbiAgICAgICAgaXNJZTcgOiBpc0llNyxcbiAgICAgICAgaWVWZXJzaW9uIDogaWVWZXJzaW9uLFxuXG4gICAgICAgIGdldEZvcm1GaWVsZHM6IGZ1bmN0aW9uKGZvcm0sIGZpZWxkTmFtZSkge1xuICAgICAgICAgICAgdmFyIGZpZWxkcyA9IGtvLnV0aWxzLm1ha2VBcnJheShmb3JtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIikpLmNvbmNhdChrby51dGlscy5tYWtlQXJyYXkoZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRleHRhcmVhXCIpKSk7XG4gICAgICAgICAgICB2YXIgaXNNYXRjaGluZ0ZpZWxkID0gKHR5cGVvZiBmaWVsZE5hbWUgPT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbihmaWVsZCkgeyByZXR1cm4gZmllbGQubmFtZSA9PT0gZmllbGROYW1lIH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uKGZpZWxkKSB7IHJldHVybiBmaWVsZE5hbWUudGVzdChmaWVsZC5uYW1lKSB9OyAvLyBUcmVhdCBmaWVsZE5hbWUgYXMgcmVnZXggb3Igb2JqZWN0IGNvbnRhaW5pbmcgcHJlZGljYXRlXG4gICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGZpZWxkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGlmIChpc01hdGNoaW5nRmllbGQoZmllbGRzW2ldKSlcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGZpZWxkc1tpXSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2VKc29uOiBmdW5jdGlvbiAoanNvblN0cmluZykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uU3RyaW5nID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBqc29uU3RyaW5nID0ga28udXRpbHMuc3RyaW5nVHJpbShqc29uU3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoanNvblN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTiAmJiBKU09OLnBhcnNlKSAvLyBVc2UgbmF0aXZlIHBhcnNpbmcgd2hlcmUgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgRnVuY3Rpb24oXCJyZXR1cm4gXCIgKyBqc29uU3RyaW5nKSkoKTsgLy8gRmFsbGJhY2sgb24gbGVzcyBzYWZlIHBhcnNpbmcgZm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3RyaW5naWZ5SnNvbjogZnVuY3Rpb24gKGRhdGEsIHJlcGxhY2VyLCBzcGFjZSkgeyAgIC8vIHJlcGxhY2VyIGFuZCBzcGFjZSBhcmUgb3B0aW9uYWxcbiAgICAgICAgICAgIGlmICghSlNPTiB8fCAhSlNPTi5zdHJpbmdpZnkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgSlNPTi5zdHJpbmdpZnkoKS4gU29tZSBicm93c2VycyAoZS5nLiwgSUUgPCA4KSBkb24ndCBzdXBwb3J0IGl0IG5hdGl2ZWx5LCBidXQgeW91IGNhbiBvdmVyY29tZSB0aGlzIGJ5IGFkZGluZyBhIHNjcmlwdCByZWZlcmVuY2UgdG8ganNvbjIuanMsIGRvd25sb2FkYWJsZSBmcm9tIGh0dHA6Ly93d3cuanNvbi5vcmcvanNvbjIuanNcIik7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShkYXRhKSwgcmVwbGFjZXIsIHNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBwb3N0SnNvbjogZnVuY3Rpb24gKHVybE9yRm9ybSwgZGF0YSwgb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICB2YXIgcGFyYW1zID0gb3B0aW9uc1sncGFyYW1zJ10gfHwge307XG4gICAgICAgICAgICB2YXIgaW5jbHVkZUZpZWxkcyA9IG9wdGlvbnNbJ2luY2x1ZGVGaWVsZHMnXSB8fCB0aGlzLmZpZWxkc0luY2x1ZGVkV2l0aEpzb25Qb3N0O1xuICAgICAgICAgICAgdmFyIHVybCA9IHVybE9yRm9ybTtcblxuICAgICAgICAgICAgLy8gSWYgd2Ugd2VyZSBnaXZlbiBhIGZvcm0sIHVzZSBpdHMgJ2FjdGlvbicgVVJMIGFuZCBwaWNrIG91dCBhbnkgcmVxdWVzdGVkIGZpZWxkIHZhbHVlc1xuICAgICAgICAgICAgaWYoKHR5cGVvZiB1cmxPckZvcm0gPT0gJ29iamVjdCcpICYmIChrby51dGlscy50YWdOYW1lTG93ZXIodXJsT3JGb3JtKSA9PT0gXCJmb3JtXCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsRm9ybSA9IHVybE9yRm9ybTtcbiAgICAgICAgICAgICAgICB1cmwgPSBvcmlnaW5hbEZvcm0uYWN0aW9uO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBpbmNsdWRlRmllbGRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBrby51dGlscy5nZXRGb3JtRmllbGRzKG9yaWdpbmFsRm9ybSwgaW5jbHVkZUZpZWxkc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSBmaWVsZHMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbZmllbGRzW2pdLm5hbWVdID0gZmllbGRzW2pdLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0YSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoZGF0YSk7XG4gICAgICAgICAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpO1xuICAgICAgICAgICAgZm9ybS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICBmb3JtLmFjdGlvbiA9IHVybDtcbiAgICAgICAgICAgIGZvcm0ubWV0aG9kID0gXCJwb3N0XCI7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIFNpbmNlICdkYXRhJyB0aGlzIGlzIGEgbW9kZWwgb2JqZWN0LCB3ZSBpbmNsdWRlIGFsbCBwcm9wZXJ0aWVzIGluY2x1ZGluZyB0aG9zZSBpbmhlcml0ZWQgZnJvbSBpdHMgcHJvdG90eXBlXG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgICAgIGlucHV0LnR5cGUgPSBcImhpZGRlblwiO1xuICAgICAgICAgICAgICAgIGlucHV0Lm5hbWUgPSBrZXk7XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBrby51dGlscy5zdHJpbmdpZnlKc29uKGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoZGF0YVtrZXldKSk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYmplY3RGb3JFYWNoKHBhcmFtcywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgICAgICAgICBpbnB1dC50eXBlID0gXCJoaWRkZW5cIjtcbiAgICAgICAgICAgICAgICBpbnB1dC5uYW1lID0ga2V5O1xuICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZm9ybSk7XG4gICAgICAgICAgICBvcHRpb25zWydzdWJtaXR0ZXInXSA/IG9wdGlvbnNbJ3N1Ym1pdHRlciddKGZvcm0pIDogZm9ybS5zdWJtaXQoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBmb3JtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZm9ybSk7IH0sIDApO1xuICAgICAgICB9XG4gICAgfVxufSgpKTtcblxua28uZXhwb3J0U3ltYm9sKCd1dGlscycsIGtvLnV0aWxzKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuYXJyYXlGb3JFYWNoJywga28udXRpbHMuYXJyYXlGb3JFYWNoKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuYXJyYXlGaXJzdCcsIGtvLnV0aWxzLmFycmF5Rmlyc3QpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5hcnJheUZpbHRlcicsIGtvLnV0aWxzLmFycmF5RmlsdGVyKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuYXJyYXlHZXREaXN0aW5jdFZhbHVlcycsIGtvLnV0aWxzLmFycmF5R2V0RGlzdGluY3RWYWx1ZXMpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5hcnJheUluZGV4T2YnLCBrby51dGlscy5hcnJheUluZGV4T2YpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5hcnJheU1hcCcsIGtvLnV0aWxzLmFycmF5TWFwKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuYXJyYXlQdXNoQWxsJywga28udXRpbHMuYXJyYXlQdXNoQWxsKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuYXJyYXlSZW1vdmVJdGVtJywga28udXRpbHMuYXJyYXlSZW1vdmVJdGVtKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuZXh0ZW5kJywga28udXRpbHMuZXh0ZW5kKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuZmllbGRzSW5jbHVkZWRXaXRoSnNvblBvc3QnLCBrby51dGlscy5maWVsZHNJbmNsdWRlZFdpdGhKc29uUG9zdCk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmdldEZvcm1GaWVsZHMnLCBrby51dGlscy5nZXRGb3JtRmllbGRzKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMucGVla09ic2VydmFibGUnLCBrby51dGlscy5wZWVrT2JzZXJ2YWJsZSk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLnBvc3RKc29uJywga28udXRpbHMucG9zdEpzb24pO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5wYXJzZUpzb24nLCBrby51dGlscy5wYXJzZUpzb24pO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcicsIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuc3RyaW5naWZ5SnNvbicsIGtvLnV0aWxzLnN0cmluZ2lmeUpzb24pO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5yYW5nZScsIGtvLnV0aWxzLnJhbmdlKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMudG9nZ2xlRG9tTm9kZUNzc0NsYXNzJywga28udXRpbHMudG9nZ2xlRG9tTm9kZUNzc0NsYXNzKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMudHJpZ2dlckV2ZW50Jywga28udXRpbHMudHJpZ2dlckV2ZW50KTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMudW53cmFwT2JzZXJ2YWJsZScsIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5vYmplY3RGb3JFYWNoJywga28udXRpbHMub2JqZWN0Rm9yRWFjaCk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmFkZE9yUmVtb3ZlSXRlbScsIGtvLnV0aWxzLmFkZE9yUmVtb3ZlSXRlbSk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLnNldFRleHRDb250ZW50Jywga28udXRpbHMuc2V0VGV4dENvbnRlbnQpO1xua28uZXhwb3J0U3ltYm9sKCd1bndyYXAnLCBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKTsgLy8gQ29udmVuaWVudCBzaG9ydGhhbmQsIGJlY2F1c2UgdGhpcyBpcyB1c2VkIHNvIGNvbW1vbmx5XG5cbmlmICghRnVuY3Rpb24ucHJvdG90eXBlWydiaW5kJ10pIHtcbiAgICAvLyBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBpcyBhIHN0YW5kYXJkIHBhcnQgb2YgRUNNQVNjcmlwdCA1dGggRWRpdGlvbiAoRGVjZW1iZXIgMjAwOSwgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VDTUEtMjYyLnBkZilcbiAgICAvLyBJbiBjYXNlIHRoZSBicm93c2VyIGRvZXNuJ3QgaW1wbGVtZW50IGl0IG5hdGl2ZWx5LCBwcm92aWRlIGEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgb25lIGluIHByb3RvdHlwZS5qc1xuICAgIEZ1bmN0aW9uLnByb3RvdHlwZVsnYmluZCddID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICB2YXIgb3JpZ2luYWxGdW5jdGlvbiA9IHRoaXM7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uLmFwcGx5KG9iamVjdCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcGFydGlhbEFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IHBhcnRpYWxBcmdzLnNsaWNlKDApO1xuICAgICAgICAgICAgICAgIGFyZ3MucHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uLmFwcGx5KG9iamVjdCwgYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfTtcbn1cblxua28udXRpbHMuZG9tRGF0YSA9IG5ldyAoZnVuY3Rpb24gKCkge1xuICAgIHZhciB1bmlxdWVJZCA9IDA7XG4gICAgdmFyIGRhdGFTdG9yZUtleUV4cGFuZG9Qcm9wZXJ0eU5hbWUgPSBcIl9fa29fX1wiICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7XG4gICAgdmFyIGRhdGFTdG9yZSA9IHt9O1xuXG4gICAgZnVuY3Rpb24gZ2V0QWxsKG5vZGUsIGNyZWF0ZUlmTm90Rm91bmQpIHtcbiAgICAgICAgdmFyIGRhdGFTdG9yZUtleSA9IG5vZGVbZGF0YVN0b3JlS2V5RXhwYW5kb1Byb3BlcnR5TmFtZV07XG4gICAgICAgIHZhciBoYXNFeGlzdGluZ0RhdGFTdG9yZSA9IGRhdGFTdG9yZUtleSAmJiAoZGF0YVN0b3JlS2V5ICE9PSBcIm51bGxcIikgJiYgZGF0YVN0b3JlW2RhdGFTdG9yZUtleV07XG4gICAgICAgIGlmICghaGFzRXhpc3RpbmdEYXRhU3RvcmUpIHtcbiAgICAgICAgICAgIGlmICghY3JlYXRlSWZOb3RGb3VuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZGF0YVN0b3JlS2V5ID0gbm9kZVtkYXRhU3RvcmVLZXlFeHBhbmRvUHJvcGVydHlOYW1lXSA9IFwia29cIiArIHVuaXF1ZUlkKys7XG4gICAgICAgICAgICBkYXRhU3RvcmVbZGF0YVN0b3JlS2V5XSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhU3RvcmVbZGF0YVN0b3JlS2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIChub2RlLCBrZXkpIHtcbiAgICAgICAgICAgIHZhciBhbGxEYXRhRm9yTm9kZSA9IGdldEFsbChub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gYWxsRGF0YUZvck5vZGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGFsbERhdGFGb3JOb2RlW2tleV07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5vZGUsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGFjdHVhbGx5IGNyZWF0ZSBhIG5ldyBkb21EYXRhIGtleSBpZiB3ZSBhcmUgYWN0dWFsbHkgZGVsZXRpbmcgYSB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChnZXRBbGwobm9kZSwgZmFsc2UpID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhbGxEYXRhRm9yTm9kZSA9IGdldEFsbChub2RlLCB0cnVlKTtcbiAgICAgICAgICAgIGFsbERhdGFGb3JOb2RlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICB2YXIgZGF0YVN0b3JlS2V5ID0gbm9kZVtkYXRhU3RvcmVLZXlFeHBhbmRvUHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIGlmIChkYXRhU3RvcmVLZXkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YVN0b3JlW2RhdGFTdG9yZUtleV07XG4gICAgICAgICAgICAgICAgbm9kZVtkYXRhU3RvcmVLZXlFeHBhbmRvUHJvcGVydHlOYW1lXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEV4cG9zaW5nIFwiZGlkIGNsZWFuXCIgZmxhZyBwdXJlbHkgc28gc3BlY3MgY2FuIGluZmVyIHdoZXRoZXIgdGhpbmdzIGhhdmUgYmVlbiBjbGVhbmVkIHVwIGFzIGludGVuZGVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbmV4dEtleTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICh1bmlxdWVJZCsrKSArIGRhdGFTdG9yZUtleUV4cGFuZG9Qcm9wZXJ0eU5hbWU7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCd1dGlscy5kb21EYXRhJywga28udXRpbHMuZG9tRGF0YSk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmRvbURhdGEuY2xlYXInLCBrby51dGlscy5kb21EYXRhLmNsZWFyKTsgLy8gRXhwb3J0aW5nIG9ubHkgc28gc3BlY3MgY2FuIGNsZWFyIHVwIGFmdGVyIHRoZW1zZWx2ZXMgZnVsbHlcblxua28udXRpbHMuZG9tTm9kZURpc3Bvc2FsID0gbmV3IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRvbURhdGFLZXkgPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKTtcbiAgICB2YXIgY2xlYW5hYmxlTm9kZVR5cGVzID0geyAxOiB0cnVlLCA4OiB0cnVlLCA5OiB0cnVlIH07ICAgICAgIC8vIEVsZW1lbnQsIENvbW1lbnQsIERvY3VtZW50XG4gICAgdmFyIGNsZWFuYWJsZU5vZGVUeXBlc1dpdGhEZXNjZW5kYW50cyA9IHsgMTogdHJ1ZSwgOTogdHJ1ZSB9OyAvLyBFbGVtZW50LCBEb2N1bWVudFxuXG4gICAgZnVuY3Rpb24gZ2V0RGlzcG9zZUNhbGxiYWNrc0NvbGxlY3Rpb24obm9kZSwgY3JlYXRlSWZOb3RGb3VuZCkge1xuICAgICAgICB2YXIgYWxsRGlzcG9zZUNhbGxiYWNrcyA9IGtvLnV0aWxzLmRvbURhdGEuZ2V0KG5vZGUsIGRvbURhdGFLZXkpO1xuICAgICAgICBpZiAoKGFsbERpc3Bvc2VDYWxsYmFja3MgPT09IHVuZGVmaW5lZCkgJiYgY3JlYXRlSWZOb3RGb3VuZCkge1xuICAgICAgICAgICAgYWxsRGlzcG9zZUNhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQobm9kZSwgZG9tRGF0YUtleSwgYWxsRGlzcG9zZUNhbGxiYWNrcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsbERpc3Bvc2VDYWxsYmFja3M7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc3Ryb3lDYWxsYmFja3NDb2xsZWN0aW9uKG5vZGUpIHtcbiAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQobm9kZSwgZG9tRGF0YUtleSwgdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhblNpbmdsZU5vZGUobm9kZSkge1xuICAgICAgICAvLyBSdW4gYWxsIHRoZSBkaXNwb3NlIGNhbGxiYWNrc1xuICAgICAgICB2YXIgY2FsbGJhY2tzID0gZ2V0RGlzcG9zZUNhbGxiYWNrc0NvbGxlY3Rpb24obm9kZSwgZmFsc2UpO1xuICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7IC8vIENsb25lLCBhcyB0aGUgYXJyYXkgbWF5IGJlIG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24gKHR5cGljYWxseSwgY2FsbGJhY2tzIHdpbGwgcmVtb3ZlIHRoZW1zZWx2ZXMpXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBjYWxsYmFja3NbaV0obm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFcmFzZSB0aGUgRE9NIGRhdGFcbiAgICAgICAga28udXRpbHMuZG9tRGF0YS5jbGVhcihub2RlKTtcblxuICAgICAgICAvLyBQZXJmb3JtIGNsZWFudXAgbmVlZGVkIGJ5IGV4dGVybmFsIGxpYnJhcmllcyAoY3VycmVudGx5IG9ubHkgalF1ZXJ5LCBidXQgY2FuIGJlIGV4dGVuZGVkKVxuICAgICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWxbXCJjbGVhbkV4dGVybmFsRGF0YVwiXShub2RlKTtcblxuICAgICAgICAvLyBDbGVhciBhbnkgaW1tZWRpYXRlLWNoaWxkIGNvbW1lbnQgbm9kZXMsIGFzIHRoZXNlIHdvdWxkbid0IGhhdmUgYmVlbiBmb3VuZCBieVxuICAgICAgICAvLyBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSBpbiBjbGVhbk5vZGUoKSAoY29tbWVudCBub2RlcyBhcmVuJ3QgZWxlbWVudHMpXG4gICAgICAgIGlmIChjbGVhbmFibGVOb2RlVHlwZXNXaXRoRGVzY2VuZGFudHNbbm9kZS5ub2RlVHlwZV0pXG4gICAgICAgICAgICBjbGVhbkltbWVkaWF0ZUNvbW1lbnRUeXBlQ2hpbGRyZW4obm9kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW5JbW1lZGlhdGVDb21tZW50VHlwZUNoaWxkcmVuKG5vZGVXaXRoQ2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGNoaWxkLCBuZXh0Q2hpbGQgPSBub2RlV2l0aENoaWxkcmVuLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChjaGlsZCA9IG5leHRDaGlsZCkge1xuICAgICAgICAgICAgbmV4dENoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDgpXG4gICAgICAgICAgICAgICAgY2xlYW5TaW5nbGVOb2RlKGNoaWxkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGFkZERpc3Bvc2VDYWxsYmFjayA6IGZ1bmN0aW9uKG5vZGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICAgICAgICBnZXREaXNwb3NlQ2FsbGJhY2tzQ29sbGVjdGlvbihub2RlLCB0cnVlKS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmVEaXNwb3NlQ2FsbGJhY2sgOiBmdW5jdGlvbihub2RlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrc0NvbGxlY3Rpb24gPSBnZXREaXNwb3NlQ2FsbGJhY2tzQ29sbGVjdGlvbihub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tzQ29sbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5UmVtb3ZlSXRlbShjYWxsYmFja3NDb2xsZWN0aW9uLCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrc0NvbGxlY3Rpb24ubGVuZ3RoID09IDApXG4gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lDYWxsYmFja3NDb2xsZWN0aW9uKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGNsZWFuTm9kZSA6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIEZpcnN0IGNsZWFuIHRoaXMgbm9kZSwgd2hlcmUgYXBwbGljYWJsZVxuICAgICAgICAgICAgaWYgKGNsZWFuYWJsZU5vZGVUeXBlc1tub2RlLm5vZGVUeXBlXSkge1xuICAgICAgICAgICAgICAgIGNsZWFuU2luZ2xlTm9kZShub2RlKTtcblxuICAgICAgICAgICAgICAgIC8vIC4uLiB0aGVuIGl0cyBkZXNjZW5kYW50cywgd2hlcmUgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgIGlmIChjbGVhbmFibGVOb2RlVHlwZXNXaXRoRGVzY2VuZGFudHNbbm9kZS5ub2RlVHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIGRlc2NlbmRhbnRzIGxpc3QgaW4gY2FzZSBpdCBjaGFuZ2VzIGR1cmluZyBpdGVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlc2NlbmRhbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5UHVzaEFsbChkZXNjZW5kYW50cywgbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGRlc2NlbmRhbnRzLmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuU2luZ2xlTm9kZShkZXNjZW5kYW50c1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVtb3ZlTm9kZSA6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGtvLmNsZWFuTm9kZShub2RlKTtcbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUpXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFwiY2xlYW5FeHRlcm5hbERhdGFcIiA6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAvLyBTcGVjaWFsIHN1cHBvcnQgZm9yIGpRdWVyeSBoZXJlIGJlY2F1c2UgaXQncyBzbyBjb21tb25seSB1c2VkLlxuICAgICAgICAgICAgLy8gTWFueSBqUXVlcnkgcGx1Z2lucyAoaW5jbHVkaW5nIGpxdWVyeS50bXBsKSBzdG9yZSBkYXRhIHVzaW5nIGpRdWVyeSdzIGVxdWl2YWxlbnQgb2YgZG9tRGF0YVxuICAgICAgICAgICAgLy8gc28gbm90aWZ5IGl0IHRvIHRlYXIgZG93biBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZSAmIGRlc2NlbmRhbnRzIGhlcmUuXG4gICAgICAgICAgICBpZiAoalF1ZXJ5SW5zdGFuY2UgJiYgKHR5cGVvZiBqUXVlcnlJbnN0YW5jZVsnY2xlYW5EYXRhJ10gPT0gXCJmdW5jdGlvblwiKSlcbiAgICAgICAgICAgICAgICBqUXVlcnlJbnN0YW5jZVsnY2xlYW5EYXRhJ10oW25vZGVdKTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xua28uY2xlYW5Ob2RlID0ga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmNsZWFuTm9kZTsgLy8gU2hvcnRoYW5kIG5hbWUgZm9yIGNvbnZlbmllbmNlXG5rby5yZW1vdmVOb2RlID0ga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLnJlbW92ZU5vZGU7IC8vIFNob3J0aGFuZCBuYW1lIGZvciBjb252ZW5pZW5jZVxua28uZXhwb3J0U3ltYm9sKCdjbGVhbk5vZGUnLCBrby5jbGVhbk5vZGUpO1xua28uZXhwb3J0U3ltYm9sKCdyZW1vdmVOb2RlJywga28ucmVtb3ZlTm9kZSk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmRvbU5vZGVEaXNwb3NhbCcsIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbCk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2snLCBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuZG9tTm9kZURpc3Bvc2FsLnJlbW92ZURpc3Bvc2VDYWxsYmFjaycsIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5yZW1vdmVEaXNwb3NlQ2FsbGJhY2spO1xuKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVhZGluZ0NvbW1lbnRSZWdleCA9IC9eKFxccyopPCEtLSguKj8pLS0+LztcblxuICAgIGZ1bmN0aW9uIHNpbXBsZUh0bWxQYXJzZShodG1sLCBkb2N1bWVudENvbnRleHQpIHtcbiAgICAgICAgZG9jdW1lbnRDb250ZXh0IHx8IChkb2N1bWVudENvbnRleHQgPSBkb2N1bWVudCk7XG4gICAgICAgIHZhciB3aW5kb3dDb250ZXh0ID0gZG9jdW1lbnRDb250ZXh0WydwYXJlbnRXaW5kb3cnXSB8fCBkb2N1bWVudENvbnRleHRbJ2RlZmF1bHRWaWV3J10gfHwgd2luZG93O1xuXG4gICAgICAgIC8vIEJhc2VkIG9uIGpRdWVyeSdzIFwiY2xlYW5cIiBmdW5jdGlvbiwgYnV0IG9ubHkgYWNjb3VudGluZyBmb3IgdGFibGUtcmVsYXRlZCBlbGVtZW50cy5cbiAgICAgICAgLy8gSWYgeW91IGhhdmUgcmVmZXJlbmNlZCBqUXVlcnksIHRoaXMgd29uJ3QgYmUgdXNlZCBhbnl3YXkgLSBLTyB3aWxsIHVzZSBqUXVlcnkncyBcImNsZWFuXCIgZnVuY3Rpb24gZGlyZWN0bHlcblxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhlcmUncyBzdGlsbCBhbiBpc3N1ZSBpbiBJRSA8IDkgd2hlcmVieSBpdCB3aWxsIGRpc2NhcmQgY29tbWVudCBub2RlcyB0aGF0IGFyZSB0aGUgZmlyc3QgY2hpbGQgb2ZcbiAgICAgICAgLy8gYSBkZXNjZW5kYW50IG5vZGUuIEZvciBleGFtcGxlOiBcIjxkaXY+PCEtLSBteWNvbW1lbnQgLS0+YWJjPC9kaXY+XCIgd2lsbCBnZXQgcGFyc2VkIGFzIFwiPGRpdj5hYmM8L2Rpdj5cIlxuICAgICAgICAvLyBUaGlzIHdvbid0IGFmZmVjdCBhbnlvbmUgd2hvIGhhcyByZWZlcmVuY2VkIGpRdWVyeSwgYW5kIHRoZXJlJ3MgYWx3YXlzIHRoZSB3b3JrYXJvdW5kIG9mIGluc2VydGluZyBhIGR1bW15IG5vZGVcbiAgICAgICAgLy8gKHBvc3NpYmx5IGEgdGV4dCBub2RlKSBpbiBmcm9udCBvZiB0aGUgY29tbWVudC4gU28sIEtPIGRvZXMgbm90IGF0dGVtcHQgdG8gd29ya2Fyb3VuZCB0aGlzIElFIGlzc3VlIGF1dG9tYXRpY2FsbHkgYXQgcHJlc2VudC5cblxuICAgICAgICAvLyBUcmltIHdoaXRlc3BhY2UsIG90aGVyd2lzZSBpbmRleE9mIHdvbid0IHdvcmsgYXMgZXhwZWN0ZWRcbiAgICAgICAgdmFyIHRhZ3MgPSBrby51dGlscy5zdHJpbmdUcmltKGh0bWwpLnRvTG93ZXJDYXNlKCksIGRpdiA9IGRvY3VtZW50Q29udGV4dC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgICAgIC8vIEZpbmRzIHRoZSBmaXJzdCBtYXRjaCBmcm9tIHRoZSBsZWZ0IGNvbHVtbiwgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgXCJ3cmFwXCIgZGF0YSBmcm9tIHRoZSByaWdodCBjb2x1bW5cbiAgICAgICAgdmFyIHdyYXAgPSB0YWdzLm1hdGNoKC9ePCh0aGVhZHx0Ym9keXx0Zm9vdCkvKSAgICAgICAgICAgICAgJiYgWzEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCJdIHx8XG4gICAgICAgICAgICAgICAgICAgIXRhZ3MuaW5kZXhPZihcIjx0clwiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgWzIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCJdIHx8XG4gICAgICAgICAgICAgICAgICAgKCF0YWdzLmluZGV4T2YoXCI8dGRcIikgfHwgIXRhZ3MuaW5kZXhPZihcIjx0aFwiKSkgICAmJiBbMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIl0gfHxcbiAgICAgICAgICAgICAgICAgICAvKiBhbnl0aGluZyBlbHNlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIFwiXCIsIFwiXCJdO1xuXG4gICAgICAgIC8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnNcbiAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGFsd2F5cyBwcmVmaXggd2l0aCBzb21lIGR1bW15IHRleHQsIGJlY2F1c2Ugb3RoZXJ3aXNlLCBJRTw5IHdpbGwgc3RyaXAgb3V0IGxlYWRpbmcgY29tbWVudCBub2RlcyBpbiBkZXNjZW5kYW50cy4gVG90YWwgbWFkbmVzcy5cbiAgICAgICAgdmFyIG1hcmt1cCA9IFwiaWdub3JlZDxkaXY+XCIgKyB3cmFwWzFdICsgaHRtbCArIHdyYXBbMl0gKyBcIjwvZGl2PlwiO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvd0NvbnRleHRbJ2lubmVyU2hpdiddID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHdpbmRvd0NvbnRleHRbJ2lubmVyU2hpdiddKG1hcmt1cCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IG1hcmt1cDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgdG8gdGhlIHJpZ2h0IGRlcHRoXG4gICAgICAgIHdoaWxlICh3cmFwWzBdLS0pXG4gICAgICAgICAgICBkaXYgPSBkaXYubGFzdENoaWxkO1xuXG4gICAgICAgIHJldHVybiBrby51dGlscy5tYWtlQXJyYXkoZGl2Lmxhc3RDaGlsZC5jaGlsZE5vZGVzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBqUXVlcnlIdG1sUGFyc2UoaHRtbCwgZG9jdW1lbnRDb250ZXh0KSB7XG4gICAgICAgIC8vIGpRdWVyeSdzIFwicGFyc2VIVE1MXCIgZnVuY3Rpb24gd2FzIGludHJvZHVjZWQgaW4galF1ZXJ5IDEuOC4wIGFuZCBpcyBhIGRvY3VtZW50ZWQgcHVibGljIEFQSS5cbiAgICAgICAgaWYgKGpRdWVyeUluc3RhbmNlWydwYXJzZUhUTUwnXSkge1xuICAgICAgICAgICAgcmV0dXJuIGpRdWVyeUluc3RhbmNlWydwYXJzZUhUTUwnXShodG1sLCBkb2N1bWVudENvbnRleHQpIHx8IFtdOyAvLyBFbnN1cmUgd2UgYWx3YXlzIHJldHVybiBhbiBhcnJheSBhbmQgbmV2ZXIgbnVsbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIGpRdWVyeSA8IDEuOC4wLCB3ZSBmYWxsIGJhY2sgb24gdGhlIHVuZG9jdW1lbnRlZCBpbnRlcm5hbCBcImNsZWFuXCIgZnVuY3Rpb24uXG4gICAgICAgICAgICB2YXIgZWxlbXMgPSBqUXVlcnlJbnN0YW5jZVsnY2xlYW4nXShbaHRtbF0sIGRvY3VtZW50Q29udGV4dCk7XG5cbiAgICAgICAgICAgIC8vIEFzIG9mIGpRdWVyeSAxLjcuMSwgalF1ZXJ5IHBhcnNlcyB0aGUgSFRNTCBieSBhcHBlbmRpbmcgaXQgdG8gc29tZSBkdW1teSBwYXJlbnQgbm9kZXMgaGVsZCBpbiBhbiBpbi1tZW1vcnkgZG9jdW1lbnQgZnJhZ21lbnQuXG4gICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBpdCBuZXZlciBjbGVhcnMgdGhlIGR1bW15IHBhcmVudCBub2RlcyBmcm9tIHRoZSBkb2N1bWVudCBmcmFnbWVudCwgc28gaXQgbGVha3MgbWVtb3J5IG92ZXIgdGltZS5cbiAgICAgICAgICAgIC8vIEZpeCB0aGlzIGJ5IGZpbmRpbmcgdGhlIHRvcC1tb3N0IGR1bW15IHBhcmVudCBlbGVtZW50LCBhbmQgZGV0YWNoaW5nIGl0IGZyb20gaXRzIG93bmVyIGZyYWdtZW50LlxuICAgICAgICAgICAgaWYgKGVsZW1zICYmIGVsZW1zWzBdKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdG9wLW1vc3QgcGFyZW50IGVsZW1lbnQgdGhhdCdzIGEgZGlyZWN0IGNoaWxkIG9mIGEgZG9jdW1lbnQgZnJhZ21lbnRcbiAgICAgICAgICAgICAgICB2YXIgZWxlbSA9IGVsZW1zWzBdO1xuICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtLnBhcmVudE5vZGUgJiYgZWxlbS5wYXJlbnROb2RlLm5vZGVUeXBlICE9PSAxMSAvKiBpLmUuLCBEb2N1bWVudEZyYWdtZW50ICovKVxuICAgICAgICAgICAgICAgICAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIC8vIC4uLiB0aGVuIGRldGFjaCBpdFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLnBhcmVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgIGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1zO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAga28udXRpbHMucGFyc2VIdG1sRnJhZ21lbnQgPSBmdW5jdGlvbihodG1sLCBkb2N1bWVudENvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGpRdWVyeUluc3RhbmNlID8galF1ZXJ5SHRtbFBhcnNlKGh0bWwsIGRvY3VtZW50Q29udGV4dCkgICAvLyBBcyBiZWxvdywgYmVuZWZpdCBmcm9tIGpRdWVyeSdzIG9wdGltaXNhdGlvbnMgd2hlcmUgcG9zc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2ltcGxlSHRtbFBhcnNlKGh0bWwsIGRvY3VtZW50Q29udGV4dCk7ICAvLyAuLi4gb3RoZXJ3aXNlLCB0aGlzIHNpbXBsZSBsb2dpYyB3aWxsIGRvIGluIG1vc3QgY29tbW9uIGNhc2VzLlxuICAgIH07XG5cbiAgICBrby51dGlscy5zZXRIdG1sID0gZnVuY3Rpb24obm9kZSwgaHRtbCkge1xuICAgICAgICBrby51dGlscy5lbXB0eURvbU5vZGUobm9kZSk7XG5cbiAgICAgICAgLy8gVGhlcmUncyBubyBsZWdpdGltYXRlIHJlYXNvbiB0byBkaXNwbGF5IGEgc3RyaW5naWZpZWQgb2JzZXJ2YWJsZSB3aXRob3V0IHVud3JhcHBpbmcgaXQsIHNvIHdlJ2xsIHVud3JhcCBpdFxuICAgICAgICBodG1sID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShodG1sKTtcblxuICAgICAgICBpZiAoKGh0bWwgIT09IG51bGwpICYmIChodG1sICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGh0bWwgIT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgLy8galF1ZXJ5IGNvbnRhaW5zIGEgbG90IG9mIHNvcGhpc3RpY2F0ZWQgY29kZSB0byBwYXJzZSBhcmJpdHJhcnkgSFRNTCBmcmFnbWVudHMsXG4gICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSA8dHI+IGVsZW1lbnRzIHdoaWNoIGFyZSBub3Qgbm9ybWFsbHkgYWxsb3dlZCB0byBleGlzdCBvbiB0aGVpciBvd24uXG4gICAgICAgICAgICAvLyBJZiB5b3UndmUgcmVmZXJlbmNlZCBqUXVlcnkgd2UnbGwgdXNlIHRoYXQgcmF0aGVyIHRoYW4gZHVwbGljYXRpbmcgaXRzIGNvZGUuXG4gICAgICAgICAgICBpZiAoalF1ZXJ5SW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBqUXVlcnlJbnN0YW5jZShub2RlKVsnaHRtbCddKGh0bWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAuLi4gb3RoZXJ3aXNlLCB1c2UgS08ncyBvd24gcGFyc2luZyBsb2dpYy5cbiAgICAgICAgICAgICAgICB2YXIgcGFyc2VkTm9kZXMgPSBrby51dGlscy5wYXJzZUh0bWxGcmFnbWVudChodG1sLCBub2RlLm93bmVyRG9jdW1lbnQpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyc2VkTm9kZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQocGFyc2VkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMucGFyc2VIdG1sRnJhZ21lbnQnLCBrby51dGlscy5wYXJzZUh0bWxGcmFnbWVudCk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLnNldEh0bWwnLCBrby51dGlscy5zZXRIdG1sKTtcblxua28ubWVtb2l6YXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBtZW1vcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gcmFuZG9tTWF4OEhleENoYXJzKCkge1xuICAgICAgICByZXR1cm4gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMDAwMDApIHwgMCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21JZCgpIHtcbiAgICAgICAgcmV0dXJuIHJhbmRvbU1heDhIZXhDaGFycygpICsgcmFuZG9tTWF4OEhleENoYXJzKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRNZW1vTm9kZXMocm9vdE5vZGUsIGFwcGVuZFRvQXJyYXkpIHtcbiAgICAgICAgaWYgKCFyb290Tm9kZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHJvb3ROb2RlLm5vZGVUeXBlID09IDgpIHtcbiAgICAgICAgICAgIHZhciBtZW1vSWQgPSBrby5tZW1vaXphdGlvbi5wYXJzZU1lbW9UZXh0KHJvb3ROb2RlLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICBpZiAobWVtb0lkICE9IG51bGwpXG4gICAgICAgICAgICAgICAgYXBwZW5kVG9BcnJheS5wdXNoKHsgZG9tTm9kZTogcm9vdE5vZGUsIG1lbW9JZDogbWVtb0lkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHJvb3ROb2RlLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBjaGlsZE5vZGVzID0gcm9vdE5vZGUuY2hpbGROb2RlcywgaiA9IGNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgIGZpbmRNZW1vTm9kZXMoY2hpbGROb2Rlc1tpXSwgYXBwZW5kVG9BcnJheSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBtZW1vaXplOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBjYW4gb25seSBwYXNzIGEgZnVuY3Rpb24gdG8ga28ubWVtb2l6YXRpb24ubWVtb2l6ZSgpXCIpO1xuICAgICAgICAgICAgdmFyIG1lbW9JZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICAgICAgICAgIG1lbW9zW21lbW9JZF0gPSBjYWxsYmFjaztcbiAgICAgICAgICAgIHJldHVybiBcIjwhLS1ba29fbWVtbzpcIiArIG1lbW9JZCArIFwiXS0tPlwiO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVubWVtb2l6ZTogZnVuY3Rpb24gKG1lbW9JZCwgY2FsbGJhY2tQYXJhbXMpIHtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IG1lbW9zW21lbW9JZF07XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGFueSBtZW1vIHdpdGggSUQgXCIgKyBtZW1vSWQgKyBcIi4gUGVyaGFwcyBpdCdzIGFscmVhZHkgYmVlbiB1bm1lbW9pemVkLlwiKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgY2FsbGJhY2tQYXJhbXMgfHwgW10pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGRlbGV0ZSBtZW1vc1ttZW1vSWRdOyB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW5tZW1vaXplRG9tTm9kZUFuZERlc2NlbmRhbnRzOiBmdW5jdGlvbiAoZG9tTm9kZSwgZXh0cmFDYWxsYmFja1BhcmFtc0FycmF5KSB7XG4gICAgICAgICAgICB2YXIgbWVtb3MgPSBbXTtcbiAgICAgICAgICAgIGZpbmRNZW1vTm9kZXMoZG9tTm9kZSwgbWVtb3MpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBtZW1vcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IG1lbW9zW2ldLmRvbU5vZGU7XG4gICAgICAgICAgICAgICAgdmFyIGNvbWJpbmVkUGFyYW1zID0gW25vZGVdO1xuICAgICAgICAgICAgICAgIGlmIChleHRyYUNhbGxiYWNrUGFyYW1zQXJyYXkpXG4gICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5UHVzaEFsbChjb21iaW5lZFBhcmFtcywgZXh0cmFDYWxsYmFja1BhcmFtc0FycmF5KTtcbiAgICAgICAgICAgICAgICBrby5tZW1vaXphdGlvbi51bm1lbW9pemUobWVtb3NbaV0ubWVtb0lkLCBjb21iaW5lZFBhcmFtcyk7XG4gICAgICAgICAgICAgICAgbm9kZS5ub2RlVmFsdWUgPSBcIlwiOyAvLyBOZXV0ZXIgdGhpcyBub2RlIHNvIHdlIGRvbid0IHRyeSB0byB1bm1lbW9pemUgaXQgYWdhaW5cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7IC8vIElmIHBvc3NpYmxlLCBlcmFzZSBpdCB0b3RhbGx5IChub3QgYWx3YXlzIHBvc3NpYmxlIC0gc29tZW9uZSBlbHNlIG1pZ2h0IGp1c3QgaG9sZCBhIHJlZmVyZW5jZSB0byBpdCB0aGVuIGNhbGwgdW5tZW1vaXplRG9tTm9kZUFuZERlc2NlbmRhbnRzIGFnYWluKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHBhcnNlTWVtb1RleHQ6IGZ1bmN0aW9uIChtZW1vVGV4dCkge1xuICAgICAgICAgICAgdmFyIG1hdGNoID0gbWVtb1RleHQubWF0Y2goL15cXFtrb19tZW1vXFw6KC4qPylcXF0kLyk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCdtZW1vaXphdGlvbicsIGtvLm1lbW9pemF0aW9uKTtcbmtvLmV4cG9ydFN5bWJvbCgnbWVtb2l6YXRpb24ubWVtb2l6ZScsIGtvLm1lbW9pemF0aW9uLm1lbW9pemUpO1xua28uZXhwb3J0U3ltYm9sKCdtZW1vaXphdGlvbi51bm1lbW9pemUnLCBrby5tZW1vaXphdGlvbi51bm1lbW9pemUpO1xua28uZXhwb3J0U3ltYm9sKCdtZW1vaXphdGlvbi5wYXJzZU1lbW9UZXh0Jywga28ubWVtb2l6YXRpb24ucGFyc2VNZW1vVGV4dCk7XG5rby5leHBvcnRTeW1ib2woJ21lbW9pemF0aW9uLnVubWVtb2l6ZURvbU5vZGVBbmREZXNjZW5kYW50cycsIGtvLm1lbW9pemF0aW9uLnVubWVtb2l6ZURvbU5vZGVBbmREZXNjZW5kYW50cyk7XG5rby5leHRlbmRlcnMgPSB7XG4gICAgJ3Rocm90dGxlJzogZnVuY3Rpb24odGFyZ2V0LCB0aW1lb3V0KSB7XG4gICAgICAgIC8vIFRocm90dGxpbmcgbWVhbnMgdHdvIHRoaW5nczpcblxuICAgICAgICAvLyAoMSkgRm9yIGRlcGVuZGVudCBvYnNlcnZhYmxlcywgd2UgdGhyb3R0bGUgKmV2YWx1YXRpb25zKiBzbyB0aGF0LCBubyBtYXR0ZXIgaG93IGZhc3QgaXRzIGRlcGVuZGVuY2llc1xuICAgICAgICAvLyAgICAgbm90aWZ5IHVwZGF0ZXMsIHRoZSB0YXJnZXQgZG9lc24ndCByZS1ldmFsdWF0ZSAoYW5kIGhlbmNlIGRvZXNuJ3Qgbm90aWZ5KSBmYXN0ZXIgdGhhbiBhIGNlcnRhaW4gcmF0ZVxuICAgICAgICB0YXJnZXRbJ3Rocm90dGxlRXZhbHVhdGlvbiddID0gdGltZW91dDtcblxuICAgICAgICAvLyAoMikgRm9yIHdyaXRhYmxlIHRhcmdldHMgKG9ic2VydmFibGVzLCBvciB3cml0YWJsZSBkZXBlbmRlbnQgb2JzZXJ2YWJsZXMpLCB3ZSB0aHJvdHRsZSAqd3JpdGVzKlxuICAgICAgICAvLyAgICAgc28gdGhlIHRhcmdldCBjYW5ub3QgY2hhbmdlIHZhbHVlIHN5bmNocm9ub3VzbHkgb3IgZmFzdGVyIHRoYW4gYSBjZXJ0YWluIHJhdGVcbiAgICAgICAgdmFyIHdyaXRlVGltZW91dEluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGtvLmRlcGVuZGVudE9ic2VydmFibGUoe1xuICAgICAgICAgICAgJ3JlYWQnOiB0YXJnZXQsXG4gICAgICAgICAgICAnd3JpdGUnOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh3cml0ZVRpbWVvdXRJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgd3JpdGVUaW1lb3V0SW5zdGFuY2UgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgJ3JhdGVMaW1pdCc6IGZ1bmN0aW9uKHRhcmdldCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgdGltZW91dCwgbWV0aG9kLCBsaW1pdEZ1bmN0aW9uO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGltZW91dCA9IG9wdGlvbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gb3B0aW9uc1sndGltZW91dCddO1xuICAgICAgICAgICAgbWV0aG9kID0gb3B0aW9uc1snbWV0aG9kJ107XG4gICAgICAgIH1cblxuICAgICAgICBsaW1pdEZ1bmN0aW9uID0gbWV0aG9kID09ICdub3RpZnlXaGVuQ2hhbmdlc1N0b3AnID8gIGRlYm91bmNlIDogdGhyb3R0bGU7XG4gICAgICAgIHRhcmdldC5saW1pdChmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIGxpbWl0RnVuY3Rpb24oY2FsbGJhY2ssIHRpbWVvdXQpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgJ25vdGlmeSc6IGZ1bmN0aW9uKHRhcmdldCwgbm90aWZ5V2hlbikge1xuICAgICAgICB0YXJnZXRbXCJlcXVhbGl0eUNvbXBhcmVyXCJdID0gbm90aWZ5V2hlbiA9PSBcImFsd2F5c1wiID9cbiAgICAgICAgICAgIG51bGwgOiAgLy8gbnVsbCBlcXVhbGl0eUNvbXBhcmVyIG1lYW5zIHRvIGFsd2F5cyBub3RpZnlcbiAgICAgICAgICAgIHZhbHVlc0FyZVByaW1pdGl2ZUFuZEVxdWFsO1xuICAgIH1cbn07XG5cbnZhciBwcmltaXRpdmVUeXBlcyA9IHsgJ3VuZGVmaW5lZCc6MSwgJ2Jvb2xlYW4nOjEsICdudW1iZXInOjEsICdzdHJpbmcnOjEgfTtcbmZ1bmN0aW9uIHZhbHVlc0FyZVByaW1pdGl2ZUFuZEVxdWFsKGEsIGIpIHtcbiAgICB2YXIgb2xkVmFsdWVJc1ByaW1pdGl2ZSA9IChhID09PSBudWxsKSB8fCAodHlwZW9mKGEpIGluIHByaW1pdGl2ZVR5cGVzKTtcbiAgICByZXR1cm4gb2xkVmFsdWVJc1ByaW1pdGl2ZSA/IChhID09PSBiKSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0aHJvdHRsZShjYWxsYmFjaywgdGltZW91dCkge1xuICAgIHZhciB0aW1lb3V0SW5zdGFuY2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aW1lb3V0SW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRpbWVvdXRJbnN0YW5jZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGltZW91dEluc3RhbmNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGRlYm91bmNlKGNhbGxiYWNrLCB0aW1lb3V0KSB7XG4gICAgdmFyIHRpbWVvdXRJbnN0YW5jZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEluc3RhbmNlKTtcbiAgICAgICAgdGltZW91dEluc3RhbmNlID0gc2V0VGltZW91dChjYWxsYmFjaywgdGltZW91dCk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYXBwbHlFeHRlbmRlcnMocmVxdWVzdGVkRXh0ZW5kZXJzKSB7XG4gICAgdmFyIHRhcmdldCA9IHRoaXM7XG4gICAgaWYgKHJlcXVlc3RlZEV4dGVuZGVycykge1xuICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKHJlcXVlc3RlZEV4dGVuZGVycywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIGV4dGVuZGVySGFuZGxlciA9IGtvLmV4dGVuZGVyc1trZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHRlbmRlckhhbmRsZXIgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IGV4dGVuZGVySGFuZGxlcih0YXJnZXQsIHZhbHVlKSB8fCB0YXJnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuXG5rby5leHBvcnRTeW1ib2woJ2V4dGVuZGVycycsIGtvLmV4dGVuZGVycyk7XG5cbmtvLnN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uICh0YXJnZXQsIGNhbGxiYWNrLCBkaXNwb3NlQ2FsbGJhY2spIHtcbiAgICB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuZGlzcG9zZUNhbGxiYWNrID0gZGlzcG9zZUNhbGxiYWNrO1xuICAgIHRoaXMuaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgIGtvLmV4cG9ydFByb3BlcnR5KHRoaXMsICdkaXNwb3NlJywgdGhpcy5kaXNwb3NlKTtcbn07XG5rby5zdWJzY3JpcHRpb24ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmRpc3Bvc2VDYWxsYmFjaygpO1xufTtcblxua28uc3Vic2NyaWJhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIGtvLnV0aWxzLnNldFByb3RvdHlwZU9mT3JFeHRlbmQodGhpcywga28uc3Vic2NyaWJhYmxlWydmbiddKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zID0ge307XG4gICAgdGhpcy5fdmVyc2lvbk51bWJlciA9IDE7XG59XG5cbnZhciBkZWZhdWx0RXZlbnQgPSBcImNoYW5nZVwiO1xuXG52YXIga29fc3Vic2NyaWJhYmxlX2ZuID0ge1xuICAgIHN1YnNjcmliZTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjYWxsYmFja1RhcmdldCwgZXZlbnQpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGV2ZW50ID0gZXZlbnQgfHwgZGVmYXVsdEV2ZW50O1xuICAgICAgICB2YXIgYm91bmRDYWxsYmFjayA9IGNhbGxiYWNrVGFyZ2V0ID8gY2FsbGJhY2suYmluZChjYWxsYmFja1RhcmdldCkgOiBjYWxsYmFjaztcblxuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gbmV3IGtvLnN1YnNjcmlwdGlvbihzZWxmLCBib3VuZENhbGxiYWNrLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBrby51dGlscy5hcnJheVJlbW92ZUl0ZW0oc2VsZi5fc3Vic2NyaXB0aW9uc1tldmVudF0sIHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICBpZiAoc2VsZi5hZnRlclN1YnNjcmlwdGlvblJlbW92ZSlcbiAgICAgICAgICAgICAgICBzZWxmLmFmdGVyU3Vic2NyaXB0aW9uUmVtb3ZlKGV2ZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNlbGYuYmVmb3JlU3Vic2NyaXB0aW9uQWRkKVxuICAgICAgICAgICAgc2VsZi5iZWZvcmVTdWJzY3JpcHRpb25BZGQoZXZlbnQpO1xuXG4gICAgICAgIGlmICghc2VsZi5fc3Vic2NyaXB0aW9uc1tldmVudF0pXG4gICAgICAgICAgICBzZWxmLl9zdWJzY3JpcHRpb25zW2V2ZW50XSA9IFtdO1xuICAgICAgICBzZWxmLl9zdWJzY3JpcHRpb25zW2V2ZW50XS5wdXNoKHN1YnNjcmlwdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9LFxuXG4gICAgXCJub3RpZnlTdWJzY3JpYmVyc1wiOiBmdW5jdGlvbiAodmFsdWVUb05vdGlmeSwgZXZlbnQpIHtcbiAgICAgICAgZXZlbnQgPSBldmVudCB8fCBkZWZhdWx0RXZlbnQ7XG4gICAgICAgIGlmIChldmVudCA9PT0gZGVmYXVsdEV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZlcnNpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNTdWJzY3JpcHRpb25zRm9yRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uYmVnaW4oKTsgLy8gQmVnaW4gc3VwcHJlc3NpbmcgZGVwZW5kZW5jeSBkZXRlY3Rpb24gKGJ5IHNldHRpbmcgdGhlIHRvcCBmcmFtZSB0byB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IHRoaXMuX3N1YnNjcmlwdGlvbnNbZXZlbnRdLnNsaWNlKDApLCBpID0gMCwgc3Vic2NyaXB0aW9uOyBzdWJzY3JpcHRpb24gPSBhW2ldOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBhIHN1YnNjcmlwdGlvbiB3YXMgZGlzcG9zZWQgZHVyaW5nIHRoZSBhcnJheUZvckVhY2ggY3ljbGUsIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBpc0Rpc3Bvc2VkIG9uIGVhY2ggc3Vic2NyaXB0aW9uIGJlZm9yZSBpbnZva2luZyBpdHMgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24uaXNEaXNwb3NlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5jYWxsYmFjayh2YWx1ZVRvTm90aWZ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uZW5kKCk7IC8vIEVuZCBzdXBwcmVzc2luZyBkZXBlbmRlbmN5IGRldGVjdGlvblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFZlcnNpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb25OdW1iZXI7XG4gICAgfSxcblxuICAgIGhhc0NoYW5nZWQ6IGZ1bmN0aW9uICh2ZXJzaW9uVG9DaGVjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRWZXJzaW9uKCkgIT09IHZlcnNpb25Ub0NoZWNrO1xuICAgIH0sXG5cbiAgICB1cGRhdGVWZXJzaW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICsrdGhpcy5fdmVyc2lvbk51bWJlcjtcbiAgICB9LFxuXG4gICAgbGltaXQ6IGZ1bmN0aW9uKGxpbWl0RnVuY3Rpb24pIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLCBzZWxmSXNPYnNlcnZhYmxlID0ga28uaXNPYnNlcnZhYmxlKHNlbGYpLFxuICAgICAgICAgICAgaXNQZW5kaW5nLCBwcmV2aW91c1ZhbHVlLCBwZW5kaW5nVmFsdWUsIGJlZm9yZUNoYW5nZSA9ICdiZWZvcmVDaGFuZ2UnO1xuXG4gICAgICAgIGlmICghc2VsZi5fb3JpZ05vdGlmeVN1YnNjcmliZXJzKSB7XG4gICAgICAgICAgICBzZWxmLl9vcmlnTm90aWZ5U3Vic2NyaWJlcnMgPSBzZWxmW1wibm90aWZ5U3Vic2NyaWJlcnNcIl07XG4gICAgICAgICAgICBzZWxmW1wibm90aWZ5U3Vic2NyaWJlcnNcIl0gPSBmdW5jdGlvbih2YWx1ZSwgZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50IHx8IGV2ZW50ID09PSBkZWZhdWx0RXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmF0ZUxpbWl0ZWRDaGFuZ2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IGJlZm9yZUNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9yYXRlTGltaXRlZEJlZm9yZUNoYW5nZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3JpZ05vdGlmeVN1YnNjcmliZXJzKHZhbHVlLCBldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmaW5pc2ggPSBsaW1pdEZ1bmN0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gSWYgYW4gb2JzZXJ2YWJsZSBwcm92aWRlZCBhIHJlZmVyZW5jZSB0byBpdHNlbGYsIGFjY2VzcyBpdCB0byBnZXQgdGhlIGxhdGVzdCB2YWx1ZS5cbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGNvbXB1dGVkIG9ic2VydmFibGVzIHRvIGRlbGF5IGNhbGN1bGF0aW5nIHRoZWlyIHZhbHVlIHVudGlsIG5lZWRlZC5cbiAgICAgICAgICAgIGlmIChzZWxmSXNPYnNlcnZhYmxlICYmIHBlbmRpbmdWYWx1ZSA9PT0gc2VsZikge1xuICAgICAgICAgICAgICAgIHBlbmRpbmdWYWx1ZSA9IHNlbGYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzUGVuZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHNlbGYuaXNEaWZmZXJlbnQocHJldmlvdXNWYWx1ZSwgcGVuZGluZ1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHNlbGYuX29yaWdOb3RpZnlTdWJzY3JpYmVycyhwcmV2aW91c1ZhbHVlID0gcGVuZGluZ1ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VsZi5fcmF0ZUxpbWl0ZWRDaGFuZ2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaXNQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHBlbmRpbmdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgZmluaXNoKCk7XG4gICAgICAgIH07XG4gICAgICAgIHNlbGYuX3JhdGVMaW1pdGVkQmVmb3JlQ2hhbmdlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghaXNQZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHNlbGYuX29yaWdOb3RpZnlTdWJzY3JpYmVycyh2YWx1ZSwgYmVmb3JlQ2hhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgaGFzU3Vic2NyaXB0aW9uc0ZvckV2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaXB0aW9uc1tldmVudF0gJiYgdGhpcy5fc3Vic2NyaXB0aW9uc1tldmVudF0ubGVuZ3RoO1xuICAgIH0sXG5cbiAgICBnZXRTdWJzY3JpcHRpb25zQ291bnQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpcHRpb25zW2V2ZW50XSAmJiB0aGlzLl9zdWJzY3JpcHRpb25zW2V2ZW50XS5sZW5ndGggfHwgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7XG4gICAgICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKHRoaXMuX3N1YnNjcmlwdGlvbnMsIGZ1bmN0aW9uKGV2ZW50TmFtZSwgc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgICAgICAgIHRvdGFsICs9IHN1YnNjcmlwdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaXNEaWZmZXJlbnQ6IGZ1bmN0aW9uKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gIXRoaXNbJ2VxdWFsaXR5Q29tcGFyZXInXSB8fCAhdGhpc1snZXF1YWxpdHlDb21wYXJlciddKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgfSxcblxuICAgIGV4dGVuZDogYXBwbHlFeHRlbmRlcnNcbn07XG5cbmtvLmV4cG9ydFByb3BlcnR5KGtvX3N1YnNjcmliYWJsZV9mbiwgJ3N1YnNjcmliZScsIGtvX3N1YnNjcmliYWJsZV9mbi5zdWJzY3JpYmUpO1xua28uZXhwb3J0UHJvcGVydHkoa29fc3Vic2NyaWJhYmxlX2ZuLCAnZXh0ZW5kJywga29fc3Vic2NyaWJhYmxlX2ZuLmV4dGVuZCk7XG5rby5leHBvcnRQcm9wZXJ0eShrb19zdWJzY3JpYmFibGVfZm4sICdnZXRTdWJzY3JpcHRpb25zQ291bnQnLCBrb19zdWJzY3JpYmFibGVfZm4uZ2V0U3Vic2NyaXB0aW9uc0NvdW50KTtcblxuLy8gRm9yIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBwcm90byBhc3NpZ25tZW50LCB3ZSBvdmVyd3JpdGUgdGhlIHByb3RvdHlwZSBvZiBlYWNoXG4vLyBvYnNlcnZhYmxlIGluc3RhbmNlLiBTaW5jZSBvYnNlcnZhYmxlcyBhcmUgZnVuY3Rpb25zLCB3ZSBuZWVkIEZ1bmN0aW9uLnByb3RvdHlwZVxuLy8gdG8gc3RpbGwgYmUgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi5cbmlmIChrby51dGlscy5jYW5TZXRQcm90b3R5cGUpIHtcbiAgICBrby51dGlscy5zZXRQcm90b3R5cGVPZihrb19zdWJzY3JpYmFibGVfZm4sIEZ1bmN0aW9uLnByb3RvdHlwZSk7XG59XG5cbmtvLnN1YnNjcmliYWJsZVsnZm4nXSA9IGtvX3N1YnNjcmliYWJsZV9mbjtcblxuXG5rby5pc1N1YnNjcmliYWJsZSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAhPSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5zdWJzY3JpYmUgPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBpbnN0YW5jZVtcIm5vdGlmeVN1YnNjcmliZXJzXCJdID09IFwiZnVuY3Rpb25cIjtcbn07XG5cbmtvLmV4cG9ydFN5bWJvbCgnc3Vic2NyaWJhYmxlJywga28uc3Vic2NyaWJhYmxlKTtcbmtvLmV4cG9ydFN5bWJvbCgnaXNTdWJzY3JpYmFibGUnLCBrby5pc1N1YnNjcmliYWJsZSk7XG5cbmtvLmNvbXB1dGVkQ29udGV4dCA9IGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvdXRlckZyYW1lcyA9IFtdLFxuICAgICAgICBjdXJyZW50RnJhbWUsXG4gICAgICAgIGxhc3RJZCA9IDA7XG5cbiAgICAvLyBSZXR1cm4gYSB1bmlxdWUgSUQgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gYW4gb2JzZXJ2YWJsZSBmb3IgZGVwZW5kZW5jeSB0cmFja2luZy5cbiAgICAvLyBUaGVvcmV0aWNhbGx5LCB5b3UgY291bGQgZXZlbnR1YWxseSBvdmVyZmxvdyB0aGUgbnVtYmVyIHN0b3JhZ2Ugc2l6ZSwgcmVzdWx0aW5nXG4gICAgLy8gaW4gZHVwbGljYXRlIElEcy4gQnV0IGluIEphdmFTY3JpcHQsIHRoZSBsYXJnZXN0IGV4YWN0IGludGVncmFsIHZhbHVlIGlzIDJeNTNcbiAgICAvLyBvciA5LDAwNywxOTksMjU0LDc0MCw5OTIuIElmIHlvdSBjcmVhdGVkIDEsMDAwLDAwMCBJRHMgcGVyIHNlY29uZCwgaXQgd291bGRcbiAgICAvLyB0YWtlIG92ZXIgMjg1IHllYXJzIHRvIHJlYWNoIHRoYXQgbnVtYmVyLlxuICAgIC8vIFJlZmVyZW5jZSBodHRwOi8vYmxvZy52amV1eC5jb20vMjAxMC9qYXZhc2NyaXB0L2phdmFzY3JpcHQtbWF4X2ludC1udW1iZXItbGltaXRzLmh0bWxcbiAgICBmdW5jdGlvbiBnZXRJZCgpIHtcbiAgICAgICAgcmV0dXJuICsrbGFzdElkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJlZ2luKG9wdGlvbnMpIHtcbiAgICAgICAgb3V0ZXJGcmFtZXMucHVzaChjdXJyZW50RnJhbWUpO1xuICAgICAgICBjdXJyZW50RnJhbWUgPSBvcHRpb25zO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgICAgY3VycmVudEZyYW1lID0gb3V0ZXJGcmFtZXMucG9wKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmVnaW46IGJlZ2luLFxuXG4gICAgICAgIGVuZDogZW5kLFxuXG4gICAgICAgIHJlZ2lzdGVyRGVwZW5kZW5jeTogZnVuY3Rpb24gKHN1YnNjcmliYWJsZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRGcmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICgha28uaXNTdWJzY3JpYmFibGUoc3Vic2NyaWJhYmxlKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT25seSBzdWJzY3JpYmFibGUgdGhpbmdzIGNhbiBhY3QgYXMgZGVwZW5kZW5jaWVzXCIpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRGcmFtZS5jYWxsYmFjayhzdWJzY3JpYmFibGUsIHN1YnNjcmliYWJsZS5faWQgfHwgKHN1YnNjcmliYWJsZS5faWQgPSBnZXRJZCgpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgaWdub3JlOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxiYWNrVGFyZ2V0LCBjYWxsYmFja0FyZ3MpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYmVnaW4oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkoY2FsbGJhY2tUYXJnZXQsIGNhbGxiYWNrQXJncyB8fCBbXSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGdldERlcGVuZGVuY2llc0NvdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEZyYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RnJhbWUuY29tcHV0ZWQuZ2V0RGVwZW5kZW5jaWVzQ291bnQoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc0luaXRpYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRGcmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEZyYW1lLmlzSW5pdGlhbDtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG5rby5leHBvcnRTeW1ib2woJ2NvbXB1dGVkQ29udGV4dCcsIGtvLmNvbXB1dGVkQ29udGV4dCk7XG5rby5leHBvcnRTeW1ib2woJ2NvbXB1dGVkQ29udGV4dC5nZXREZXBlbmRlbmNpZXNDb3VudCcsIGtvLmNvbXB1dGVkQ29udGV4dC5nZXREZXBlbmRlbmNpZXNDb3VudCk7XG5rby5leHBvcnRTeW1ib2woJ2NvbXB1dGVkQ29udGV4dC5pc0luaXRpYWwnLCBrby5jb21wdXRlZENvbnRleHQuaXNJbml0aWFsKTtcbmtvLmV4cG9ydFN5bWJvbCgnY29tcHV0ZWRDb250ZXh0LmlzU2xlZXBpbmcnLCBrby5jb21wdXRlZENvbnRleHQuaXNTbGVlcGluZyk7XG5cbmtvLmV4cG9ydFN5bWJvbCgnaWdub3JlRGVwZW5kZW5jaWVzJywga28uaWdub3JlRGVwZW5kZW5jaWVzID0ga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUpO1xua28ub2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICB2YXIgX2xhdGVzdFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuXG4gICAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBXcml0ZVxuXG4gICAgICAgICAgICAvLyBJZ25vcmUgd3JpdGVzIGlmIHRoZSB2YWx1ZSBoYXNuJ3QgY2hhbmdlZFxuICAgICAgICAgICAgaWYgKG9ic2VydmFibGUuaXNEaWZmZXJlbnQoX2xhdGVzdFZhbHVlLCBhcmd1bWVudHNbMF0pKSB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS52YWx1ZVdpbGxNdXRhdGUoKTtcbiAgICAgICAgICAgICAgICBfbGF0ZXN0VmFsdWUgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBvYnNlcnZhYmxlLl9sYXRlc3RWYWx1ZSA9IF9sYXRlc3RWYWx1ZTtcbiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlLnZhbHVlSGFzTXV0YXRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7IC8vIFBlcm1pdHMgY2hhaW5lZCBhc3NpZ25tZW50c1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVhZFxuICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5yZWdpc3RlckRlcGVuZGVuY3kob2JzZXJ2YWJsZSk7IC8vIFRoZSBjYWxsZXIgb25seSBuZWVkcyB0byBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIGlmIHRoZXkgZGlkIGEgXCJyZWFkXCIgb3BlcmF0aW9uXG4gICAgICAgICAgICByZXR1cm4gX2xhdGVzdFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGtvLnN1YnNjcmliYWJsZS5jYWxsKG9ic2VydmFibGUpO1xuICAgIGtvLnV0aWxzLnNldFByb3RvdHlwZU9mT3JFeHRlbmQob2JzZXJ2YWJsZSwga28ub2JzZXJ2YWJsZVsnZm4nXSk7XG5cbiAgICBpZiAoREVCVUcpIG9ic2VydmFibGUuX2xhdGVzdFZhbHVlID0gX2xhdGVzdFZhbHVlO1xuICAgIG9ic2VydmFibGUucGVlayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gX2xhdGVzdFZhbHVlIH07XG4gICAgb2JzZXJ2YWJsZS52YWx1ZUhhc011dGF0ZWQgPSBmdW5jdGlvbiAoKSB7IG9ic2VydmFibGVbXCJub3RpZnlTdWJzY3JpYmVyc1wiXShfbGF0ZXN0VmFsdWUpOyB9XG4gICAgb2JzZXJ2YWJsZS52YWx1ZVdpbGxNdXRhdGUgPSBmdW5jdGlvbiAoKSB7IG9ic2VydmFibGVbXCJub3RpZnlTdWJzY3JpYmVyc1wiXShfbGF0ZXN0VmFsdWUsIFwiYmVmb3JlQ2hhbmdlXCIpOyB9XG5cbiAgICBrby5leHBvcnRQcm9wZXJ0eShvYnNlcnZhYmxlLCAncGVlaycsIG9ic2VydmFibGUucGVlayk7XG4gICAga28uZXhwb3J0UHJvcGVydHkob2JzZXJ2YWJsZSwgXCJ2YWx1ZUhhc011dGF0ZWRcIiwgb2JzZXJ2YWJsZS52YWx1ZUhhc011dGF0ZWQpO1xuICAgIGtvLmV4cG9ydFByb3BlcnR5KG9ic2VydmFibGUsIFwidmFsdWVXaWxsTXV0YXRlXCIsIG9ic2VydmFibGUudmFsdWVXaWxsTXV0YXRlKTtcblxuICAgIHJldHVybiBvYnNlcnZhYmxlO1xufVxuXG5rby5vYnNlcnZhYmxlWydmbiddID0ge1xuICAgIFwiZXF1YWxpdHlDb21wYXJlclwiOiB2YWx1ZXNBcmVQcmltaXRpdmVBbmRFcXVhbFxufTtcblxudmFyIHByb3RvUHJvcGVydHkgPSBrby5vYnNlcnZhYmxlLnByb3RvUHJvcGVydHkgPSBcIl9fa29fcHJvdG9fX1wiO1xua28ub2JzZXJ2YWJsZVsnZm4nXVtwcm90b1Byb3BlcnR5XSA9IGtvLm9ic2VydmFibGU7XG5cbi8vIE5vdGUgdGhhdCBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHByb3RvIGFzc2lnbm1lbnQsIHRoZVxuLy8gaW5oZXJpdGFuY2UgY2hhaW4gaXMgY3JlYXRlZCBtYW51YWxseSBpbiB0aGUga28ub2JzZXJ2YWJsZSBjb25zdHJ1Y3RvclxuaWYgKGtvLnV0aWxzLmNhblNldFByb3RvdHlwZSkge1xuICAgIGtvLnV0aWxzLnNldFByb3RvdHlwZU9mKGtvLm9ic2VydmFibGVbJ2ZuJ10sIGtvLnN1YnNjcmliYWJsZVsnZm4nXSk7XG59XG5cbmtvLmhhc1Byb3RvdHlwZSA9IGZ1bmN0aW9uKGluc3RhbmNlLCBwcm90b3R5cGUpIHtcbiAgICBpZiAoKGluc3RhbmNlID09PSBudWxsKSB8fCAoaW5zdGFuY2UgPT09IHVuZGVmaW5lZCkgfHwgKGluc3RhbmNlW3Byb3RvUHJvcGVydHldID09PSB1bmRlZmluZWQpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGluc3RhbmNlW3Byb3RvUHJvcGVydHldID09PSBwcm90b3R5cGUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBrby5oYXNQcm90b3R5cGUoaW5zdGFuY2VbcHJvdG9Qcm9wZXJ0eV0sIHByb3RvdHlwZSk7IC8vIFdhbGsgdGhlIHByb3RvdHlwZSBjaGFpblxufTtcblxua28uaXNPYnNlcnZhYmxlID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGtvLmhhc1Byb3RvdHlwZShpbnN0YW5jZSwga28ub2JzZXJ2YWJsZSk7XG59XG5rby5pc1dyaXRlYWJsZU9ic2VydmFibGUgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAvLyBPYnNlcnZhYmxlXG4gICAgaWYgKCh0eXBlb2YgaW5zdGFuY2UgPT0gXCJmdW5jdGlvblwiKSAmJiBpbnN0YW5jZVtwcm90b1Byb3BlcnR5XSA9PT0ga28ub2JzZXJ2YWJsZSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gV3JpdGVhYmxlIGRlcGVuZGVudCBvYnNlcnZhYmxlXG4gICAgaWYgKCh0eXBlb2YgaW5zdGFuY2UgPT0gXCJmdW5jdGlvblwiKSAmJiAoaW5zdGFuY2VbcHJvdG9Qcm9wZXJ0eV0gPT09IGtvLmRlcGVuZGVudE9ic2VydmFibGUpICYmIChpbnN0YW5jZS5oYXNXcml0ZUZ1bmN0aW9uKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gQW55dGhpbmcgZWxzZVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuXG5rby5leHBvcnRTeW1ib2woJ29ic2VydmFibGUnLCBrby5vYnNlcnZhYmxlKTtcbmtvLmV4cG9ydFN5bWJvbCgnaXNPYnNlcnZhYmxlJywga28uaXNPYnNlcnZhYmxlKTtcbmtvLmV4cG9ydFN5bWJvbCgnaXNXcml0ZWFibGVPYnNlcnZhYmxlJywga28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKTtcbmtvLmV4cG9ydFN5bWJvbCgnaXNXcml0YWJsZU9ic2VydmFibGUnLCBrby5pc1dyaXRlYWJsZU9ic2VydmFibGUpO1xua28ub2JzZXJ2YWJsZUFycmF5ID0gZnVuY3Rpb24gKGluaXRpYWxWYWx1ZXMpIHtcbiAgICBpbml0aWFsVmFsdWVzID0gaW5pdGlhbFZhbHVlcyB8fCBbXTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFZhbHVlcyAhPSAnb2JqZWN0JyB8fCAhKCdsZW5ndGgnIGluIGluaXRpYWxWYWx1ZXMpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYXJndW1lbnQgcGFzc2VkIHdoZW4gaW5pdGlhbGl6aW5nIGFuIG9ic2VydmFibGUgYXJyYXkgbXVzdCBiZSBhbiBhcnJheSwgb3IgbnVsbCwgb3IgdW5kZWZpbmVkLlwiKTtcblxuICAgIHZhciByZXN1bHQgPSBrby5vYnNlcnZhYmxlKGluaXRpYWxWYWx1ZXMpO1xuICAgIGtvLnV0aWxzLnNldFByb3RvdHlwZU9mT3JFeHRlbmQocmVzdWx0LCBrby5vYnNlcnZhYmxlQXJyYXlbJ2ZuJ10pO1xuICAgIHJldHVybiByZXN1bHQuZXh0ZW5kKHsndHJhY2tBcnJheUNoYW5nZXMnOnRydWV9KTtcbn07XG5cbmtvLm9ic2VydmFibGVBcnJheVsnZm4nXSA9IHtcbiAgICAncmVtb3ZlJzogZnVuY3Rpb24gKHZhbHVlT3JQcmVkaWNhdGUpIHtcbiAgICAgICAgdmFyIHVuZGVybHlpbmdBcnJheSA9IHRoaXMucGVlaygpO1xuICAgICAgICB2YXIgcmVtb3ZlZFZhbHVlcyA9IFtdO1xuICAgICAgICB2YXIgcHJlZGljYXRlID0gdHlwZW9mIHZhbHVlT3JQcmVkaWNhdGUgPT0gXCJmdW5jdGlvblwiICYmICFrby5pc09ic2VydmFibGUodmFsdWVPclByZWRpY2F0ZSkgPyB2YWx1ZU9yUHJlZGljYXRlIDogZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZSA9PT0gdmFsdWVPclByZWRpY2F0ZTsgfTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bmRlcmx5aW5nQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHVuZGVybHlpbmdBcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWRWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVXaWxsTXV0YXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlbW92ZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdW5kZXJseWluZ0FycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbW92ZWRWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlSGFzTXV0YXRlZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZW1vdmVkVmFsdWVzO1xuICAgIH0sXG5cbiAgICAncmVtb3ZlQWxsJzogZnVuY3Rpb24gKGFycmF5T2ZWYWx1ZXMpIHtcbiAgICAgICAgLy8gSWYgeW91IHBhc3NlZCB6ZXJvIGFyZ3MsIHdlIHJlbW92ZSBldmVyeXRoaW5nXG4gICAgICAgIGlmIChhcnJheU9mVmFsdWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciB1bmRlcmx5aW5nQXJyYXkgPSB0aGlzLnBlZWsoKTtcbiAgICAgICAgICAgIHZhciBhbGxWYWx1ZXMgPSB1bmRlcmx5aW5nQXJyYXkuc2xpY2UoMCk7XG4gICAgICAgICAgICB0aGlzLnZhbHVlV2lsbE11dGF0ZSgpO1xuICAgICAgICAgICAgdW5kZXJseWluZ0FycmF5LnNwbGljZSgwLCB1bmRlcmx5aW5nQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVIYXNNdXRhdGVkKCk7XG4gICAgICAgICAgICByZXR1cm4gYWxsVmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHlvdSBwYXNzZWQgYW4gYXJnLCB3ZSBpbnRlcnByZXQgaXQgYXMgYW4gYXJyYXkgb2YgZW50cmllcyB0byByZW1vdmVcbiAgICAgICAgaWYgKCFhcnJheU9mVmFsdWVzKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gdGhpc1sncmVtb3ZlJ10oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlJbmRleE9mKGFycmF5T2ZWYWx1ZXMsIHZhbHVlKSA+PSAwO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgJ2Rlc3Ryb3knOiBmdW5jdGlvbiAodmFsdWVPclByZWRpY2F0ZSkge1xuICAgICAgICB2YXIgdW5kZXJseWluZ0FycmF5ID0gdGhpcy5wZWVrKCk7XG4gICAgICAgIHZhciBwcmVkaWNhdGUgPSB0eXBlb2YgdmFsdWVPclByZWRpY2F0ZSA9PSBcImZ1bmN0aW9uXCIgJiYgIWtvLmlzT2JzZXJ2YWJsZSh2YWx1ZU9yUHJlZGljYXRlKSA/IHZhbHVlT3JQcmVkaWNhdGUgOiBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlID09PSB2YWx1ZU9yUHJlZGljYXRlOyB9O1xuICAgICAgICB0aGlzLnZhbHVlV2lsbE11dGF0ZSgpO1xuICAgICAgICBmb3IgKHZhciBpID0gdW5kZXJseWluZ0FycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB1bmRlcmx5aW5nQXJyYXlbaV07XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlKSlcbiAgICAgICAgICAgICAgICB1bmRlcmx5aW5nQXJyYXlbaV1bXCJfZGVzdHJveVwiXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZUhhc011dGF0ZWQoKTtcbiAgICB9LFxuXG4gICAgJ2Rlc3Ryb3lBbGwnOiBmdW5jdGlvbiAoYXJyYXlPZlZhbHVlcykge1xuICAgICAgICAvLyBJZiB5b3UgcGFzc2VkIHplcm8gYXJncywgd2UgZGVzdHJveSBldmVyeXRoaW5nXG4gICAgICAgIGlmIChhcnJheU9mVmFsdWVzID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1snZGVzdHJveSddKGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KTtcblxuICAgICAgICAvLyBJZiB5b3UgcGFzc2VkIGFuIGFyZywgd2UgaW50ZXJwcmV0IGl0IGFzIGFuIGFycmF5IG9mIGVudHJpZXMgdG8gZGVzdHJveVxuICAgICAgICBpZiAoIWFycmF5T2ZWYWx1ZXMpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIHJldHVybiB0aGlzWydkZXN0cm95J10oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlJbmRleE9mKGFycmF5T2ZWYWx1ZXMsIHZhbHVlKSA+PSAwO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgJ2luZGV4T2YnOiBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICB2YXIgdW5kZXJseWluZ0FycmF5ID0gdGhpcygpO1xuICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlJbmRleE9mKHVuZGVybHlpbmdBcnJheSwgaXRlbSk7XG4gICAgfSxcblxuICAgICdyZXBsYWNlJzogZnVuY3Rpb24ob2xkSXRlbSwgbmV3SXRlbSkge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzWydpbmRleE9mJ10ob2xkSXRlbSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlV2lsbE11dGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5wZWVrKClbaW5kZXhdID0gbmV3SXRlbTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVIYXNNdXRhdGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vLyBQb3B1bGF0ZSBrby5vYnNlcnZhYmxlQXJyYXkuZm4gd2l0aCByZWFkL3dyaXRlIGZ1bmN0aW9ucyBmcm9tIG5hdGl2ZSBhcnJheXNcbi8vIEltcG9ydGFudDogRG8gbm90IGFkZCBhbnkgYWRkaXRpb25hbCBmdW5jdGlvbnMgaGVyZSB0aGF0IG1heSByZWFzb25hYmx5IGJlIHVzZWQgdG8gKnJlYWQqIGRhdGEgZnJvbSB0aGUgYXJyYXlcbi8vIGJlY2F1c2Ugd2UnbGwgZXZhbCB0aGVtIHdpdGhvdXQgY2F1c2luZyBzdWJzY3JpcHRpb25zLCBzbyBrby5jb21wdXRlZCBvdXRwdXQgY291bGQgZW5kIHVwIGdldHRpbmcgc3RhbGVcbmtvLnV0aWxzLmFycmF5Rm9yRWFjaChbXCJwb3BcIiwgXCJwdXNoXCIsIFwicmV2ZXJzZVwiLCBcInNoaWZ0XCIsIFwic29ydFwiLCBcInNwbGljZVwiLCBcInVuc2hpZnRcIl0sIGZ1bmN0aW9uIChtZXRob2ROYW1lKSB7XG4gICAga28ub2JzZXJ2YWJsZUFycmF5WydmbiddW21ldGhvZE5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBVc2UgXCJwZWVrXCIgdG8gYXZvaWQgY3JlYXRpbmcgYSBzdWJzY3JpcHRpb24gaW4gYW55IGNvbXB1dGVkIHRoYXQgd2UncmUgZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mXG4gICAgICAgIC8vIChmb3IgY29uc2lzdGVuY3kgd2l0aCBtdXRhdGluZyByZWd1bGFyIG9ic2VydmFibGVzKVxuICAgICAgICB2YXIgdW5kZXJseWluZ0FycmF5ID0gdGhpcy5wZWVrKCk7XG4gICAgICAgIHRoaXMudmFsdWVXaWxsTXV0YXRlKCk7XG4gICAgICAgIHRoaXMuY2FjaGVEaWZmRm9yS25vd25PcGVyYXRpb24odW5kZXJseWluZ0FycmF5LCBtZXRob2ROYW1lLCBhcmd1bWVudHMpO1xuICAgICAgICB2YXIgbWV0aG9kQ2FsbFJlc3VsdCA9IHVuZGVybHlpbmdBcnJheVttZXRob2ROYW1lXS5hcHBseSh1bmRlcmx5aW5nQXJyYXksIGFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudmFsdWVIYXNNdXRhdGVkKCk7XG4gICAgICAgIHJldHVybiBtZXRob2RDYWxsUmVzdWx0O1xuICAgIH07XG59KTtcblxuLy8gUG9wdWxhdGUga28ub2JzZXJ2YWJsZUFycmF5LmZuIHdpdGggcmVhZC1vbmx5IGZ1bmN0aW9ucyBmcm9tIG5hdGl2ZSBhcnJheXNcbmtvLnV0aWxzLmFycmF5Rm9yRWFjaChbXCJzbGljZVwiXSwgZnVuY3Rpb24gKG1ldGhvZE5hbWUpIHtcbiAgICBrby5vYnNlcnZhYmxlQXJyYXlbJ2ZuJ11bbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB1bmRlcmx5aW5nQXJyYXkgPSB0aGlzKCk7XG4gICAgICAgIHJldHVybiB1bmRlcmx5aW5nQXJyYXlbbWV0aG9kTmFtZV0uYXBwbHkodW5kZXJseWluZ0FycmF5LCBhcmd1bWVudHMpO1xuICAgIH07XG59KTtcblxuLy8gTm90ZSB0aGF0IGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgcHJvdG8gYXNzaWdubWVudCwgdGhlXG4vLyBpbmhlcml0YW5jZSBjaGFpbiBpcyBjcmVhdGVkIG1hbnVhbGx5IGluIHRoZSBrby5vYnNlcnZhYmxlQXJyYXkgY29uc3RydWN0b3JcbmlmIChrby51dGlscy5jYW5TZXRQcm90b3R5cGUpIHtcbiAgICBrby51dGlscy5zZXRQcm90b3R5cGVPZihrby5vYnNlcnZhYmxlQXJyYXlbJ2ZuJ10sIGtvLm9ic2VydmFibGVbJ2ZuJ10pO1xufVxuXG5rby5leHBvcnRTeW1ib2woJ29ic2VydmFibGVBcnJheScsIGtvLm9ic2VydmFibGVBcnJheSk7XG52YXIgYXJyYXlDaGFuZ2VFdmVudE5hbWUgPSAnYXJyYXlDaGFuZ2UnO1xua28uZXh0ZW5kZXJzWyd0cmFja0FycmF5Q2hhbmdlcyddID0gZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgLy8gT25seSBtb2RpZnkgdGhlIHRhcmdldCBvYnNlcnZhYmxlIG9uY2VcbiAgICBpZiAodGFyZ2V0LmNhY2hlRGlmZkZvcktub3duT3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRyYWNraW5nQ2hhbmdlcyA9IGZhbHNlLFxuICAgICAgICBjYWNoZWREaWZmID0gbnVsbCxcbiAgICAgICAgYXJyYXlDaGFuZ2VTdWJzY3JpcHRpb24sXG4gICAgICAgIHBlbmRpbmdOb3RpZmljYXRpb25zID0gMCxcbiAgICAgICAgdW5kZXJseWluZ0JlZm9yZVN1YnNjcmlwdGlvbkFkZEZ1bmN0aW9uID0gdGFyZ2V0LmJlZm9yZVN1YnNjcmlwdGlvbkFkZCxcbiAgICAgICAgdW5kZXJseWluZ0FmdGVyU3Vic2NyaXB0aW9uUmVtb3ZlRnVuY3Rpb24gPSB0YXJnZXQuYWZ0ZXJTdWJzY3JpcHRpb25SZW1vdmU7XG5cbiAgICAvLyBXYXRjaCBcInN1YnNjcmliZVwiIGNhbGxzLCBhbmQgZm9yIGFycmF5IGNoYW5nZSBldmVudHMsIGVuc3VyZSBjaGFuZ2UgdHJhY2tpbmcgaXMgZW5hYmxlZFxuICAgIHRhcmdldC5iZWZvcmVTdWJzY3JpcHRpb25BZGQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKHVuZGVybHlpbmdCZWZvcmVTdWJzY3JpcHRpb25BZGRGdW5jdGlvbilcbiAgICAgICAgICAgIHVuZGVybHlpbmdCZWZvcmVTdWJzY3JpcHRpb25BZGRGdW5jdGlvbi5jYWxsKHRhcmdldCwgZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnQgPT09IGFycmF5Q2hhbmdlRXZlbnROYW1lKSB7XG4gICAgICAgICAgICB0cmFja0NoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gV2F0Y2ggXCJkaXNwb3NlXCIgY2FsbHMsIGFuZCBmb3IgYXJyYXkgY2hhbmdlIGV2ZW50cywgZW5zdXJlIGNoYW5nZSB0cmFja2luZyBpcyBkaXNhYmxlZCB3aGVuIGFsbCBhcmUgZGlzcG9zZWRcbiAgICB0YXJnZXQuYWZ0ZXJTdWJzY3JpcHRpb25SZW1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKHVuZGVybHlpbmdBZnRlclN1YnNjcmlwdGlvblJlbW92ZUZ1bmN0aW9uKVxuICAgICAgICAgICAgdW5kZXJseWluZ0FmdGVyU3Vic2NyaXB0aW9uUmVtb3ZlRnVuY3Rpb24uY2FsbCh0YXJnZXQsIGV2ZW50KTtcbiAgICAgICAgaWYgKGV2ZW50ID09PSBhcnJheUNoYW5nZUV2ZW50TmFtZSAmJiAhdGFyZ2V0Lmhhc1N1YnNjcmlwdGlvbnNGb3JFdmVudChhcnJheUNoYW5nZUV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIGFycmF5Q2hhbmdlU3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRyYWNraW5nQ2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHRyYWNrQ2hhbmdlcygpIHtcbiAgICAgICAgLy8gQ2FsbGluZyAndHJhY2tDaGFuZ2VzJyBtdWx0aXBsZSB0aW1lcyBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIGl0IG9uY2VcbiAgICAgICAgaWYgKHRyYWNraW5nQ2hhbmdlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhY2tpbmdDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAvLyBJbnRlcmNlcHQgXCJub3RpZnlTdWJzY3JpYmVyc1wiIHRvIHRyYWNrIGhvdyBtYW55IHRpbWVzIGl0IHdhcyBjYWxsZWQuXG4gICAgICAgIHZhciB1bmRlcmx5aW5nTm90aWZ5U3Vic2NyaWJlcnNGdW5jdGlvbiA9IHRhcmdldFsnbm90aWZ5U3Vic2NyaWJlcnMnXTtcbiAgICAgICAgdGFyZ2V0Wydub3RpZnlTdWJzY3JpYmVycyddID0gZnVuY3Rpb24odmFsdWVUb05vdGlmeSwgZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghZXZlbnQgfHwgZXZlbnQgPT09IGRlZmF1bHRFdmVudCkge1xuICAgICAgICAgICAgICAgICsrcGVuZGluZ05vdGlmaWNhdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZXJseWluZ05vdGlmeVN1YnNjcmliZXJzRnVuY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFYWNoIHRpbWUgdGhlIGFycmF5IGNoYW5nZXMgdmFsdWUsIGNhcHR1cmUgYSBjbG9uZSBzbyB0aGF0IG9uIHRoZSBuZXh0XG4gICAgICAgIC8vIGNoYW5nZSBpdCdzIHBvc3NpYmxlIHRvIHByb2R1Y2UgYSBkaWZmXG4gICAgICAgIHZhciBwcmV2aW91c0NvbnRlbnRzID0gW10uY29uY2F0KHRhcmdldC5wZWVrKCkgfHwgW10pO1xuICAgICAgICBjYWNoZWREaWZmID0gbnVsbDtcbiAgICAgICAgYXJyYXlDaGFuZ2VTdWJzY3JpcHRpb24gPSB0YXJnZXQuc3Vic2NyaWJlKGZ1bmN0aW9uKGN1cnJlbnRDb250ZW50cykge1xuICAgICAgICAgICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29udGVudHMgYW5kIGVuc3VyZSBpdCdzIGFuIGFycmF5XG4gICAgICAgICAgICBjdXJyZW50Q29udGVudHMgPSBbXS5jb25jYXQoY3VycmVudENvbnRlbnRzIHx8IFtdKTtcblxuICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZGlmZiBhbmQgaXNzdWUgbm90aWZpY2F0aW9ucywgYnV0IG9ubHkgaWYgc29tZW9uZSBpcyBsaXN0ZW5pbmdcbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzU3Vic2NyaXB0aW9uc0ZvckV2ZW50KGFycmF5Q2hhbmdlRXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIHZhciBjaGFuZ2VzID0gZ2V0Q2hhbmdlcyhwcmV2aW91c0NvbnRlbnRzLCBjdXJyZW50Q29udGVudHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbGltaW5hdGUgcmVmZXJlbmNlcyB0byB0aGUgb2xkLCByZW1vdmVkIGl0ZW1zLCBzbyB0aGV5IGNhbiBiZSBHQ2VkXG4gICAgICAgICAgICBwcmV2aW91c0NvbnRlbnRzID0gY3VycmVudENvbnRlbnRzO1xuICAgICAgICAgICAgY2FjaGVkRGlmZiA9IG51bGw7XG4gICAgICAgICAgICBwZW5kaW5nTm90aWZpY2F0aW9ucyA9IDA7XG5cbiAgICAgICAgICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Wydub3RpZnlTdWJzY3JpYmVycyddKGNoYW5nZXMsIGFycmF5Q2hhbmdlRXZlbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2hhbmdlcyhwcmV2aW91c0NvbnRlbnRzLCBjdXJyZW50Q29udGVudHMpIHtcbiAgICAgICAgLy8gV2UgdHJ5IHRvIHJlLXVzZSBjYWNoZWQgZGlmZnMuXG4gICAgICAgIC8vIFRoZSBzY2VuYXJpb3Mgd2hlcmUgcGVuZGluZ05vdGlmaWNhdGlvbnMgPiAxIGFyZSB3aGVuIHVzaW5nIHJhdGUtbGltaXRpbmcgb3IgdGhlIERlZmVycmVkIFVwZGF0ZXNcbiAgICAgICAgLy8gcGx1Z2luLCB3aGljaCB3aXRob3V0IHRoaXMgY2hlY2sgd291bGQgbm90IGJlIGNvbXBhdGlibGUgd2l0aCBhcnJheUNoYW5nZSBub3RpZmljYXRpb25zLiBOb3JtYWxseSxcbiAgICAgICAgLy8gbm90aWZpY2F0aW9ucyBhcmUgaXNzdWVkIGltbWVkaWF0ZWx5IHNvIHdlIHdvdWxkbid0IGJlIHF1ZXVlaW5nIHVwIG1vcmUgdGhhbiBvbmUuXG4gICAgICAgIGlmICghY2FjaGVkRGlmZiB8fCBwZW5kaW5nTm90aWZpY2F0aW9ucyA+IDEpIHtcbiAgICAgICAgICAgIGNhY2hlZERpZmYgPSBrby51dGlscy5jb21wYXJlQXJyYXlzKHByZXZpb3VzQ29udGVudHMsIGN1cnJlbnRDb250ZW50cywgeyAnc3BhcnNlJzogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWNoZWREaWZmO1xuICAgIH1cblxuICAgIHRhcmdldC5jYWNoZURpZmZGb3JLbm93bk9wZXJhdGlvbiA9IGZ1bmN0aW9uKHJhd0FycmF5LCBvcGVyYXRpb25OYW1lLCBhcmdzKSB7XG4gICAgICAgIC8vIE9ubHkgcnVuIGlmIHdlJ3JlIGN1cnJlbnRseSB0cmFja2luZyBjaGFuZ2VzIGZvciB0aGlzIG9ic2VydmFibGUgYXJyYXlcbiAgICAgICAgLy8gYW5kIHRoZXJlIGFyZW4ndCBhbnkgcGVuZGluZyBkZWZlcnJlZCBub3RpZmljYXRpb25zLlxuICAgICAgICBpZiAoIXRyYWNraW5nQ2hhbmdlcyB8fCBwZW5kaW5nTm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkaWZmID0gW10sXG4gICAgICAgICAgICBhcnJheUxlbmd0aCA9IHJhd0FycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG5cbiAgICAgICAgZnVuY3Rpb24gcHVzaERpZmYoc3RhdHVzLCB2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBkaWZmW2RpZmYubGVuZ3RoXSA9IHsgJ3N0YXR1cyc6IHN0YXR1cywgJ3ZhbHVlJzogdmFsdWUsICdpbmRleCc6IGluZGV4IH07XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChvcGVyYXRpb25OYW1lKSB7XG4gICAgICAgICAgICBjYXNlICdwdXNoJzpcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBhcnJheUxlbmd0aDtcbiAgICAgICAgICAgIGNhc2UgJ3Vuc2hpZnQnOlxuICAgICAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBhcmdzTGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hEaWZmKCdhZGRlZCcsIGFyZ3NbaW5kZXhdLCBvZmZzZXQgKyBpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdwb3AnOlxuICAgICAgICAgICAgICAgIG9mZnNldCA9IGFycmF5TGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGNhc2UgJ3NoaWZ0JzpcbiAgICAgICAgICAgICAgICBpZiAoYXJyYXlMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaERpZmYoJ2RlbGV0ZWQnLCByYXdBcnJheVtvZmZzZXRdLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnc3BsaWNlJzpcbiAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBzdGFydCBpbmRleCBtZWFucyAnZnJvbSBlbmQgb2YgYXJyYXknLiBBZnRlciB0aGF0IHdlIGNsYW1wIHRvIFswLi4uYXJyYXlMZW5ndGhdLlxuICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zcGxpY2VcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRJbmRleCA9IE1hdGgubWluKE1hdGgubWF4KDAsIGFyZ3NbMF0gPCAwID8gYXJyYXlMZW5ndGggKyBhcmdzWzBdIDogYXJnc1swXSksIGFycmF5TGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kRGVsZXRlSW5kZXggPSBhcmdzTGVuZ3RoID09PSAxID8gYXJyYXlMZW5ndGggOiBNYXRoLm1pbihzdGFydEluZGV4ICsgKGFyZ3NbMV0gfHwgMCksIGFycmF5TGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kQWRkSW5kZXggPSBzdGFydEluZGV4ICsgYXJnc0xlbmd0aCAtIDIsXG4gICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gTWF0aC5tYXgoZW5kRGVsZXRlSW5kZXgsIGVuZEFkZEluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25zID0gW10sIGRlbGV0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gc3RhcnRJbmRleCwgYXJnc0luZGV4ID0gMjsgaW5kZXggPCBlbmRJbmRleDsgKytpbmRleCwgKythcmdzSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgZW5kRGVsZXRlSW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvbnMucHVzaChwdXNoRGlmZignZGVsZXRlZCcsIHJhd0FycmF5W2luZGV4XSwgaW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgZW5kQWRkSW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbnMucHVzaChwdXNoRGlmZignYWRkZWQnLCBhcmdzW2FyZ3NJbmRleF0sIGluZGV4KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGtvLnV0aWxzLmZpbmRNb3Zlc0luQXJyYXlDb21wYXJpc29uKGRlbGV0aW9ucywgYWRkaXRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FjaGVkRGlmZiA9IGRpZmY7XG4gICAgfTtcbn07XG5rby5jb21wdXRlZCA9IGtvLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbiAoZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMsIGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgdmFyIF9sYXRlc3RWYWx1ZSxcbiAgICAgICAgX25lZWRzRXZhbHVhdGlvbiA9IHRydWUsXG4gICAgICAgIF9pc0JlaW5nRXZhbHVhdGVkID0gZmFsc2UsXG4gICAgICAgIF9zdXBwcmVzc0Rpc3Bvc2FsVW50aWxEaXNwb3NlV2hlblJldHVybnNGYWxzZSA9IGZhbHNlLFxuICAgICAgICBfaXNEaXNwb3NlZCA9IGZhbHNlLFxuICAgICAgICByZWFkRnVuY3Rpb24gPSBldmFsdWF0b3JGdW5jdGlvbk9yT3B0aW9ucyxcbiAgICAgICAgcHVyZSA9IGZhbHNlLFxuICAgICAgICBpc1NsZWVwaW5nID0gZmFsc2U7XG5cbiAgICBpZiAocmVhZEZ1bmN0aW9uICYmIHR5cGVvZiByZWFkRnVuY3Rpb24gPT0gXCJvYmplY3RcIikge1xuICAgICAgICAvLyBTaW5nbGUtcGFyYW1ldGVyIHN5bnRheCAtIGV2ZXJ5dGhpbmcgaXMgb24gdGhpcyBcIm9wdGlvbnNcIiBwYXJhbVxuICAgICAgICBvcHRpb25zID0gcmVhZEZ1bmN0aW9uO1xuICAgICAgICByZWFkRnVuY3Rpb24gPSBvcHRpb25zW1wicmVhZFwiXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNdWx0aS1wYXJhbWV0ZXIgc3ludGF4IC0gY29uc3RydWN0IHRoZSBvcHRpb25zIGFjY29yZGluZyB0byB0aGUgcGFyYW1zIHBhc3NlZFxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKCFyZWFkRnVuY3Rpb24pXG4gICAgICAgICAgICByZWFkRnVuY3Rpb24gPSBvcHRpb25zW1wicmVhZFwiXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWFkRnVuY3Rpb24gIT0gXCJmdW5jdGlvblwiKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXNzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUga28uY29tcHV0ZWRcIik7XG5cbiAgICBmdW5jdGlvbiBhZGREZXBlbmRlbmN5VHJhY2tpbmcoaWQsIHRhcmdldCwgdHJhY2tpbmdPYmopIHtcbiAgICAgICAgaWYgKHB1cmUgJiYgdGFyZ2V0ID09PSBkZXBlbmRlbnRPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIkEgJ3B1cmUnIGNvbXB1dGVkIG11c3Qgbm90IGJlIGNhbGxlZCByZWN1cnNpdmVseVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlcGVuZGVuY3lUcmFja2luZ1tpZF0gPSB0cmFja2luZ09iajtcbiAgICAgICAgdHJhY2tpbmdPYmouX29yZGVyID0gX2RlcGVuZGVuY2llc0NvdW50Kys7XG4gICAgICAgIHRyYWNraW5nT2JqLl92ZXJzaW9uID0gdGFyZ2V0LmdldFZlcnNpb24oKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXZlRGVwZW5kZW5jaWVzQ2hhbmdlZCgpIHtcbiAgICAgICAgdmFyIGlkLCBkZXBlbmRlbmN5O1xuICAgICAgICBmb3IgKGlkIGluIGRlcGVuZGVuY3lUcmFja2luZykge1xuICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lUcmFja2luZy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jeVRyYWNraW5nW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeS5fdGFyZ2V0Lmhhc0NoYW5nZWQoZGVwZW5kZW5jeS5fdmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlzcG9zZUNvbXB1dGVkKCkge1xuICAgICAgICBpZiAoIWlzU2xlZXBpbmcgJiYgZGVwZW5kZW5jeVRyYWNraW5nKSB7XG4gICAgICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKGRlcGVuZGVuY3lUcmFja2luZywgZnVuY3Rpb24gKGlkLCBkZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3kuZGlzcG9zZSlcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkZXBlbmRlbmN5VHJhY2tpbmcgPSBudWxsO1xuICAgICAgICBfZGVwZW5kZW5jaWVzQ291bnQgPSAwO1xuICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIF9uZWVkc0V2YWx1YXRpb24gPSBmYWxzZTtcbiAgICAgICAgaXNTbGVlcGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV2YWx1YXRlUG9zc2libHlBc3luYygpIHtcbiAgICAgICAgdmFyIHRocm90dGxlRXZhbHVhdGlvblRpbWVvdXQgPSBkZXBlbmRlbnRPYnNlcnZhYmxlWyd0aHJvdHRsZUV2YWx1YXRpb24nXTtcbiAgICAgICAgaWYgKHRocm90dGxlRXZhbHVhdGlvblRpbWVvdXQgJiYgdGhyb3R0bGVFdmFsdWF0aW9uVGltZW91dCA+PSAwKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZXZhbHVhdGlvblRpbWVvdXRJbnN0YW5jZSk7XG4gICAgICAgICAgICBldmFsdWF0aW9uVGltZW91dEluc3RhbmNlID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXZhbHVhdGVJbW1lZGlhdGUodHJ1ZSAvKm5vdGlmeUNoYW5nZSovKTtcbiAgICAgICAgICAgIH0sIHRocm90dGxlRXZhbHVhdGlvblRpbWVvdXQpO1xuICAgICAgICB9IGVsc2UgaWYgKGRlcGVuZGVudE9ic2VydmFibGUuX2V2YWxSYXRlTGltaXRlZCkge1xuICAgICAgICAgICAgZGVwZW5kZW50T2JzZXJ2YWJsZS5fZXZhbFJhdGVMaW1pdGVkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmFsdWF0ZUltbWVkaWF0ZSh0cnVlIC8qbm90aWZ5Q2hhbmdlKi8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXZhbHVhdGVJbW1lZGlhdGUobm90aWZ5Q2hhbmdlKSB7XG4gICAgICAgIGlmIChfaXNCZWluZ0V2YWx1YXRlZCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGV2YWx1YXRpb24gb2YgYSBrby5jb21wdXRlZCBjYXVzZXMgc2lkZSBlZmZlY3RzLCBpdCdzIHBvc3NpYmxlIHRoYXQgaXQgd2lsbCB0cmlnZ2VyIGl0cyBvd24gcmUtZXZhbHVhdGlvbi5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGRlc2lyYWJsZSAoaXQncyBoYXJkIGZvciBhIGRldmVsb3BlciB0byByZWFsaXNlIGEgY2hhaW4gb2YgZGVwZW5kZW5jaWVzIG1pZ2h0IGNhdXNlIHRoaXMsIGFuZCB0aGV5IGFsbW9zdFxuICAgICAgICAgICAgLy8gY2VydGFpbmx5IGRpZG4ndCBpbnRlbmQgaW5maW5pdGUgcmUtZXZhbHVhdGlvbnMpLiBTbywgZm9yIHByZWRpY3RhYmlsaXR5LCB3ZSBzaW1wbHkgcHJldmVudCBrby5jb21wdXRlZHMgZnJvbSBjYXVzaW5nXG4gICAgICAgICAgICAvLyB0aGVpciBvd24gcmUtZXZhbHVhdGlvbi4gRnVydGhlciBkaXNjdXNzaW9uIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZVNhbmRlcnNvbi9rbm9ja291dC9wdWxsLzM4N1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gbm90IGV2YWx1YXRlIChhbmQgcG9zc2libHkgY2FwdHVyZSBuZXcgZGVwZW5kZW5jaWVzKSBpZiBkaXNwb3NlZFxuICAgICAgICBpZiAoX2lzRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaXNwb3NlV2hlbiAmJiBkaXNwb3NlV2hlbigpKSB7XG4gICAgICAgICAgICAvLyBTZWUgY29tbWVudCBiZWxvdyBhYm91dCBfc3VwcHJlc3NEaXNwb3NhbFVudGlsRGlzcG9zZVdoZW5SZXR1cm5zRmFsc2VcbiAgICAgICAgICAgIGlmICghX3N1cHByZXNzRGlzcG9zYWxVbnRpbERpc3Bvc2VXaGVuUmV0dXJuc0ZhbHNlKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEl0IGp1c3QgZGlkIHJldHVybiBmYWxzZSwgc28gd2UgY2FuIHN0b3Agc3VwcHJlc3Npbmcgbm93XG4gICAgICAgICAgICBfc3VwcHJlc3NEaXNwb3NhbFVudGlsRGlzcG9zZVdoZW5SZXR1cm5zRmFsc2UgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9pc0JlaW5nRXZhbHVhdGVkID0gdHJ1ZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gSW5pdGlhbGx5LCB3ZSBhc3N1bWUgdGhhdCBub25lIG9mIHRoZSBzdWJzY3JpcHRpb25zIGFyZSBzdGlsbCBiZWluZyB1c2VkIChpLmUuLCBhbGwgYXJlIGNhbmRpZGF0ZXMgZm9yIGRpc3Bvc2FsKS5cbiAgICAgICAgICAgIC8vIFRoZW4sIGR1cmluZyBldmFsdWF0aW9uLCB3ZSBjcm9zcyBvZmYgYW55IHRoYXQgYXJlIGluIGZhY3Qgc3RpbGwgYmVpbmcgdXNlZC5cbiAgICAgICAgICAgIHZhciBkaXNwb3NhbENhbmRpZGF0ZXMgPSBkZXBlbmRlbmN5VHJhY2tpbmcsXG4gICAgICAgICAgICAgICAgZGlzcG9zYWxDb3VudCA9IF9kZXBlbmRlbmNpZXNDb3VudCxcbiAgICAgICAgICAgICAgICBpc0luaXRpYWwgPSBwdXJlID8gdW5kZWZpbmVkIDogIV9kZXBlbmRlbmNpZXNDb3VudDsgICAvLyBJZiB3ZSdyZSBldmFsdWF0aW5nIHdoZW4gdGhlcmUgYXJlIG5vIHByZXZpb3VzIGRlcGVuZGVuY2llcywgaXQgbXVzdCBiZSB0aGUgZmlyc3QgdGltZVxuXG4gICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmJlZ2luKHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oc3Vic2NyaWJhYmxlLCBpZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcG9zYWxDb3VudCAmJiBkaXNwb3NhbENhbmRpZGF0ZXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3Qgd2FudCB0byBkaXNwb3NlIHRoaXMgc3Vic2NyaXB0aW9uLCBhcyBpdCdzIHN0aWxsIGJlaW5nIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGREZXBlbmRlbmN5VHJhY2tpbmcoaWQsIHN1YnNjcmliYWJsZSwgZGlzcG9zYWxDYW5kaWRhdGVzW2lkXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRpc3Bvc2FsQ2FuZGlkYXRlc1tpZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1kaXNwb3NhbENvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZGVwZW5kZW5jeVRyYWNraW5nW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJyYW5kIG5ldyBzdWJzY3JpcHRpb24gLSBhZGQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGREZXBlbmRlbmN5VHJhY2tpbmcoaWQsIHN1YnNjcmliYWJsZSwgaXNTbGVlcGluZyA/IHsgX3RhcmdldDogc3Vic2NyaWJhYmxlIH0gOiBzdWJzY3JpYmFibGUuc3Vic2NyaWJlKGV2YWx1YXRlUG9zc2libHlBc3luYykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb21wdXRlZDogZGVwZW5kZW50T2JzZXJ2YWJsZSxcbiAgICAgICAgICAgICAgICBpc0luaXRpYWw6IGlzSW5pdGlhbFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRlcGVuZGVuY3lUcmFja2luZyA9IHt9O1xuICAgICAgICAgICAgX2RlcGVuZGVuY2llc0NvdW50ID0gMDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBldmFsdWF0b3JGdW5jdGlvblRhcmdldCA/IHJlYWRGdW5jdGlvbi5jYWxsKGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0KSA6IHJlYWRGdW5jdGlvbigpO1xuXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uZW5kKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBzdWJzY3JpcHRpb24gbm8gbG9uZ2VyIGJlaW5nIHVzZWQsIHJlbW92ZSBpdCBmcm9tIHRoZSBhY3RpdmUgc3Vic2NyaXB0aW9ucyBsaXN0IGFuZCBkaXNwb3NlIGl0XG4gICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2FsQ291bnQgJiYgIWlzU2xlZXBpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaChkaXNwb3NhbENhbmRpZGF0ZXMsIGZ1bmN0aW9uKGlkLCB0b0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0Rpc3Bvc2UuZGlzcG9zZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0Rpc3Bvc2UuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfbmVlZHNFdmFsdWF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPYnNlcnZhYmxlLmlzRGlmZmVyZW50KF9sYXRlc3RWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1NsZWVwaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmeShfbGF0ZXN0VmFsdWUsIFwiYmVmb3JlQ2hhbmdlXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF9sYXRlc3RWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChERUJVRykgZGVwZW5kZW50T2JzZXJ2YWJsZS5fbGF0ZXN0VmFsdWUgPSBfbGF0ZXN0VmFsdWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNTbGVlcGluZykge1xuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlLnVwZGF0ZVZlcnNpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vdGlmeUNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBub3RpZnkoX2xhdGVzdFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0luaXRpYWwpIHtcbiAgICAgICAgICAgICAgICBub3RpZnkoX2xhdGVzdFZhbHVlLCBcImF3YWtlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgX2lzQmVpbmdFdmFsdWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghX2RlcGVuZGVuY2llc0NvdW50KVxuICAgICAgICAgICAgZGlzcG9zZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcGVuZGVudE9ic2VydmFibGUoKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3cml0ZUZ1bmN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBXcml0aW5nIGEgdmFsdWVcbiAgICAgICAgICAgICAgICB3cml0ZUZ1bmN0aW9uLmFwcGx5KGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0LCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgd3JpdGUgYSB2YWx1ZSB0byBhIGtvLmNvbXB1dGVkIHVubGVzcyB5b3Ugc3BlY2lmeSBhICd3cml0ZScgb3B0aW9uLiBJZiB5b3Ugd2lzaCB0byByZWFkIHRoZSBjdXJyZW50IHZhbHVlLCBkb24ndCBwYXNzIGFueSBwYXJhbWV0ZXJzLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBQZXJtaXRzIGNoYWluZWQgYXNzaWdubWVudHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlYWRpbmcgdGhlIHZhbHVlXG4gICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLnJlZ2lzdGVyRGVwZW5kZW5jeShkZXBlbmRlbnRPYnNlcnZhYmxlKTtcbiAgICAgICAgICAgIGlmIChfbmVlZHNFdmFsdWF0aW9uIHx8IChpc1NsZWVwaW5nICYmIGhhdmVEZXBlbmRlbmNpZXNDaGFuZ2VkKCkpKSB7XG4gICAgICAgICAgICAgICAgZXZhbHVhdGVJbW1lZGlhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfbGF0ZXN0VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWVrKCkge1xuICAgICAgICAvLyBQZWVrIHdvbid0IHJlLWV2YWx1YXRlLCBleGNlcHQgd2hpbGUgdGhlIGNvbXB1dGVkIGlzIHNsZWVwaW5nIG9yIHRvIGdldCB0aGUgaW5pdGlhbCB2YWx1ZSB3aGVuIFwiZGVmZXJFdmFsdWF0aW9uXCIgaXMgc2V0LlxuICAgICAgICBpZiAoKF9uZWVkc0V2YWx1YXRpb24gJiYgIV9kZXBlbmRlbmNpZXNDb3VudCkgfHwgKGlzU2xlZXBpbmcgJiYgaGF2ZURlcGVuZGVuY2llc0NoYW5nZWQoKSkpIHtcbiAgICAgICAgICAgIGV2YWx1YXRlSW1tZWRpYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9sYXRlc3RWYWx1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIF9uZWVkc0V2YWx1YXRpb24gfHwgX2RlcGVuZGVuY2llc0NvdW50ID4gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3RpZnkodmFsdWUsIGV2ZW50KSB7XG4gICAgICAgIGRlcGVuZGVudE9ic2VydmFibGVbXCJub3RpZnlTdWJzY3JpYmVyc1wiXSh2YWx1ZSwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8vIEJ5IGhlcmUsIFwib3B0aW9uc1wiIGlzIGFsd2F5cyBub24tbnVsbFxuICAgIHZhciB3cml0ZUZ1bmN0aW9uID0gb3B0aW9uc1tcIndyaXRlXCJdLFxuICAgICAgICBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQgPSBvcHRpb25zW1wiZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkXCJdIHx8IG9wdGlvbnMuZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkIHx8IG51bGwsXG4gICAgICAgIGRpc3Bvc2VXaGVuT3B0aW9uID0gb3B0aW9uc1tcImRpc3Bvc2VXaGVuXCJdIHx8IG9wdGlvbnMuZGlzcG9zZVdoZW4sXG4gICAgICAgIGRpc3Bvc2VXaGVuID0gZGlzcG9zZVdoZW5PcHRpb24sXG4gICAgICAgIGRpc3Bvc2UgPSBkaXNwb3NlQ29tcHV0ZWQsXG4gICAgICAgIGRlcGVuZGVuY3lUcmFja2luZyA9IHt9LFxuICAgICAgICBfZGVwZW5kZW5jaWVzQ291bnQgPSAwLFxuICAgICAgICBldmFsdWF0aW9uVGltZW91dEluc3RhbmNlID0gbnVsbDtcblxuICAgIGlmICghZXZhbHVhdG9yRnVuY3Rpb25UYXJnZXQpXG4gICAgICAgIGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0ID0gb3B0aW9uc1tcIm93bmVyXCJdO1xuXG4gICAga28uc3Vic2NyaWJhYmxlLmNhbGwoZGVwZW5kZW50T2JzZXJ2YWJsZSk7XG4gICAga28udXRpbHMuc2V0UHJvdG90eXBlT2ZPckV4dGVuZChkZXBlbmRlbnRPYnNlcnZhYmxlLCBrby5kZXBlbmRlbnRPYnNlcnZhYmxlWydmbiddKTtcblxuICAgIGRlcGVuZGVudE9ic2VydmFibGUucGVlayA9IHBlZWs7XG4gICAgZGVwZW5kZW50T2JzZXJ2YWJsZS5nZXREZXBlbmRlbmNpZXNDb3VudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9kZXBlbmRlbmNpZXNDb3VudDsgfTtcbiAgICBkZXBlbmRlbnRPYnNlcnZhYmxlLmhhc1dyaXRlRnVuY3Rpb24gPSB0eXBlb2Ygd3JpdGVGdW5jdGlvbiA9PT0gXCJmdW5jdGlvblwiO1xuICAgIGRlcGVuZGVudE9ic2VydmFibGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsgZGlzcG9zZSgpOyB9O1xuICAgIGRlcGVuZGVudE9ic2VydmFibGUuaXNBY3RpdmUgPSBpc0FjdGl2ZTtcblxuICAgIC8vIFJlcGxhY2UgdGhlIGxpbWl0IGZ1bmN0aW9uIHdpdGggb25lIHRoYXQgZGVsYXlzIGV2YWx1YXRpb24gYXMgd2VsbC5cbiAgICB2YXIgb3JpZ2luYWxMaW1pdCA9IGRlcGVuZGVudE9ic2VydmFibGUubGltaXQ7XG4gICAgZGVwZW5kZW50T2JzZXJ2YWJsZS5saW1pdCA9IGZ1bmN0aW9uKGxpbWl0RnVuY3Rpb24pIHtcbiAgICAgICAgb3JpZ2luYWxMaW1pdC5jYWxsKGRlcGVuZGVudE9ic2VydmFibGUsIGxpbWl0RnVuY3Rpb24pO1xuICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlLl9ldmFsUmF0ZUxpbWl0ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRlcGVuZGVudE9ic2VydmFibGUuX3JhdGVMaW1pdGVkQmVmb3JlQ2hhbmdlKF9sYXRlc3RWYWx1ZSk7XG5cbiAgICAgICAgICAgIF9uZWVkc0V2YWx1YXRpb24gPSB0cnVlOyAgICAvLyBNYXJrIGFzIGRpcnR5XG5cbiAgICAgICAgICAgIC8vIFBhc3MgdGhlIG9ic2VydmFibGUgdG8gdGhlIHJhdGUtbGltaXQgY29kZSwgd2hpY2ggd2lsbCBhY2Nlc3MgaXQgd2hlblxuICAgICAgICAgICAgLy8gaXQncyB0aW1lIHRvIGRvIHRoZSBub3RpZmljYXRpb24uXG4gICAgICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlLl9yYXRlTGltaXRlZENoYW5nZShkZXBlbmRlbnRPYnNlcnZhYmxlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAob3B0aW9uc1sncHVyZSddKSB7XG4gICAgICAgIHB1cmUgPSB0cnVlO1xuICAgICAgICBpc1NsZWVwaW5nID0gdHJ1ZTsgICAgIC8vIFN0YXJ0cyBvZmYgc2xlZXBpbmc7IHdpbGwgYXdha2Ugb24gdGhlIGZpcnN0IHN1YnNjcmlwdGlvblxuICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlLmJlZm9yZVN1YnNjcmlwdGlvbkFkZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgLy8gSWYgYXNsZWVwLCB3YWtlIHVwIHRoZSBjb21wdXRlZCBieSBzdWJzY3JpYmluZyB0byBhbnkgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCAmJiBpc1NsZWVwaW5nICYmIGV2ZW50ID09ICdjaGFuZ2UnKSB7XG4gICAgICAgICAgICAgICAgaXNTbGVlcGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChfbmVlZHNFdmFsdWF0aW9uIHx8IGhhdmVEZXBlbmRlbmNpZXNDaGFuZ2VkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeVRyYWNraW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgX2RlcGVuZGVuY2llc0NvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgX25lZWRzRXZhbHVhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlSW1tZWRpYXRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4gb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVjaWVzT3JkZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaChkZXBlbmRlbmN5VHJhY2tpbmcsIGZ1bmN0aW9uIChpZCwgZGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZWNpZXNPcmRlcltkZXBlbmRlbmN5Ll9vcmRlcl0gPSBpZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5leHQsIHN1YnNjcmliZSB0byBlYWNoIG9uZVxuICAgICAgICAgICAgICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goZGVwZW5kZWNpZXNPcmRlciwgZnVuY3Rpb24oaWQsIG9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3lUcmFja2luZ1tpZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gZGVwZW5kZW5jeS5fdGFyZ2V0LnN1YnNjcmliZShldmFsdWF0ZVBvc3NpYmx5QXN5bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLl9vcmRlciA9IG9yZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLl92ZXJzaW9uID0gZGVwZW5kZW5jeS5fdmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lUcmFja2luZ1tpZF0gPSBzdWJzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKSB7ICAgICAvLyB0ZXN0IHNpbmNlIGV2YWx1YXRpbmcgY291bGQgdHJpZ2dlciBkaXNwb3NhbFxuICAgICAgICAgICAgICAgICAgICBub3RpZnkoX2xhdGVzdFZhbHVlLCBcImF3YWtlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlLmFmdGVyU3Vic2NyaXB0aW9uUmVtb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkICYmIGV2ZW50ID09ICdjaGFuZ2UnICYmICFkZXBlbmRlbnRPYnNlcnZhYmxlLmhhc1N1YnNjcmlwdGlvbnNGb3JFdmVudCgnY2hhbmdlJykpIHtcbiAgICAgICAgICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKGRlcGVuZGVuY3lUcmFja2luZywgZnVuY3Rpb24gKGlkLCBkZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5LmRpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lUcmFja2luZ1tpZF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhcmdldDogZGVwZW5kZW5jeS5fdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcmRlcjogZGVwZW5kZW5jeS5fb3JkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb246IGRlcGVuZGVuY3kuX3ZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlzU2xlZXBpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG5vdGlmeSh1bmRlZmluZWQsIFwiYXNsZWVwXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEJlY2F1c2UgYSBwdXJlIGNvbXB1dGVkIGlzIG5vdCBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2hpbGUgaXQgaXMgc2xlZXBpbmcsIHdlIGNhbid0XG4gICAgICAgIC8vIHNpbXBseSByZXR1cm4gdGhlIHZlcnNpb24gbnVtYmVyLiBJbnN0ZWFkLCB3ZSBjaGVjayBpZiBhbnkgb2YgdGhlIGRlcGVuZGVuY2llcyBoYXZlXG4gICAgICAgIC8vIGNoYW5nZWQgYW5kIGNvbmRpdGlvbmFsbHkgcmUtZXZhbHVhdGUgdGhlIGNvbXB1dGVkIG9ic2VydmFibGUuXG4gICAgICAgIGRlcGVuZGVudE9ic2VydmFibGUuX29yaWdpbmFsR2V0VmVyc2lvbiA9IGRlcGVuZGVudE9ic2VydmFibGUuZ2V0VmVyc2lvbjtcbiAgICAgICAgZGVwZW5kZW50T2JzZXJ2YWJsZS5nZXRWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGlzU2xlZXBpbmcgJiYgKF9uZWVkc0V2YWx1YXRpb24gfHwgaGF2ZURlcGVuZGVuY2llc0NoYW5nZWQoKSkpIHtcbiAgICAgICAgICAgICAgICBldmFsdWF0ZUltbWVkaWF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlcGVuZGVudE9ic2VydmFibGUuX29yaWdpbmFsR2V0VmVyc2lvbigpO1xuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAob3B0aW9uc1snZGVmZXJFdmFsdWF0aW9uJ10pIHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIGZvcmNlIGEgY29tcHV0ZWQgd2l0aCBkZWZlckV2YWx1YXRpb24gdG8gZXZhbHVhdGUgd2hlbiB0aGUgZmlyc3Qgc3Vic2NyaXB0aW9ucyBpcyByZWdpc3RlcmVkLlxuICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlLmJlZm9yZVN1YnNjcmlwdGlvbkFkZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50ID09ICdjaGFuZ2UnIHx8IGV2ZW50ID09ICdiZWZvcmVDaGFuZ2UnKSB7XG4gICAgICAgICAgICAgICAgcGVlaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAga28uZXhwb3J0UHJvcGVydHkoZGVwZW5kZW50T2JzZXJ2YWJsZSwgJ3BlZWsnLCBkZXBlbmRlbnRPYnNlcnZhYmxlLnBlZWspO1xuICAgIGtvLmV4cG9ydFByb3BlcnR5KGRlcGVuZGVudE9ic2VydmFibGUsICdkaXNwb3NlJywgZGVwZW5kZW50T2JzZXJ2YWJsZS5kaXNwb3NlKTtcbiAgICBrby5leHBvcnRQcm9wZXJ0eShkZXBlbmRlbnRPYnNlcnZhYmxlLCAnaXNBY3RpdmUnLCBkZXBlbmRlbnRPYnNlcnZhYmxlLmlzQWN0aXZlKTtcbiAgICBrby5leHBvcnRQcm9wZXJ0eShkZXBlbmRlbnRPYnNlcnZhYmxlLCAnZ2V0RGVwZW5kZW5jaWVzQ291bnQnLCBkZXBlbmRlbnRPYnNlcnZhYmxlLmdldERlcGVuZGVuY2llc0NvdW50KTtcblxuICAgIC8vIEFkZCBhIFwiZGlzcG9zZVdoZW5cIiBjYWxsYmFjayB0aGF0LCBvbiBlYWNoIGV2YWx1YXRpb24sIGRpc3Bvc2VzIGlmIHRoZSBub2RlIHdhcyByZW1vdmVkIHdpdGhvdXQgdXNpbmcga28ucmVtb3ZlTm9kZS5cbiAgICBpZiAoZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkKSB7XG4gICAgICAgIC8vIFNpbmNlIHRoaXMgY29tcHV0ZWQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRE9NIG5vZGUsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGRpc3Bvc2UgdGhlIGNvbXB1dGVkXG4gICAgICAgIC8vIHVudGlsIHRoZSBET00gbm9kZSBpcyAqcmVtb3ZlZCogZnJvbSB0aGUgZG9jdW1lbnQgKGFzIG9wcG9zZWQgdG8gbmV2ZXIgaGF2aW5nIGJlZW4gaW4gdGhlIGRvY3VtZW50KSxcbiAgICAgICAgLy8gd2UnbGwgcHJldmVudCBkaXNwb3NhbCB1bnRpbCBcImRpc3Bvc2VXaGVuXCIgZmlyc3QgcmV0dXJucyBmYWxzZS5cbiAgICAgICAgX3N1cHByZXNzRGlzcG9zYWxVbnRpbERpc3Bvc2VXaGVuUmV0dXJuc0ZhbHNlID0gdHJ1ZTtcblxuICAgICAgICAvLyBPbmx5IHdhdGNoIGZvciB0aGUgbm9kZSdzIGRpc3Bvc2FsIGlmIHRoZSB2YWx1ZSByZWFsbHkgaXMgYSBub2RlLiBJdCBtaWdodCBub3QgYmUsXG4gICAgICAgIC8vIGUuZy4sIHsgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiB0cnVlIH0gY2FuIGJlIHVzZWQgdG8gb3B0IGludG8gdGhlIFwib25seSBkaXNwb3NlXG4gICAgICAgIC8vIGFmdGVyIGZpcnN0IGZhbHNlIHJlc3VsdFwiIGJlaGF2aW91ciBldmVuIGlmIHRoZXJlJ3Mgbm8gc3BlY2lmaWMgbm9kZSB0byB3YXRjaC4gVGhpc1xuICAgICAgICAvLyB0ZWNobmlxdWUgaXMgaW50ZW5kZWQgZm9yIEtPJ3MgaW50ZXJuYWwgdXNlIG9ubHkgYW5kIHNob3VsZG4ndCBiZSBkb2N1bWVudGVkIG9yIHVzZWRcbiAgICAgICAgLy8gYnkgYXBwbGljYXRpb24gY29kZSwgYXMgaXQncyBsaWtlbHkgdG8gY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgS08uXG4gICAgICAgIGlmIChkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQubm9kZVR5cGUpIHtcbiAgICAgICAgICAgIGRpc3Bvc2VXaGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAha28udXRpbHMuZG9tTm9kZUlzQXR0YWNoZWRUb0RvY3VtZW50KGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCkgfHwgKGRpc3Bvc2VXaGVuT3B0aW9uICYmIGRpc3Bvc2VXaGVuT3B0aW9uKCkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV2YWx1YXRlLCB1bmxlc3Mgc2xlZXBpbmcgb3IgZGVmZXJFdmFsdWF0aW9uIGlzIHRydWVcbiAgICBpZiAoIWlzU2xlZXBpbmcgJiYgIW9wdGlvbnNbJ2RlZmVyRXZhbHVhdGlvbiddKVxuICAgICAgICBldmFsdWF0ZUltbWVkaWF0ZSgpO1xuXG4gICAgLy8gQXR0YWNoIGEgRE9NIG5vZGUgZGlzcG9zYWwgY2FsbGJhY2sgc28gdGhhdCB0aGUgY29tcHV0ZWQgd2lsbCBiZSBwcm9hY3RpdmVseSBkaXNwb3NlZCBhcyBzb29uIGFzIHRoZSBub2RlIGlzXG4gICAgLy8gcmVtb3ZlZCB1c2luZyBrby5yZW1vdmVOb2RlLiBCdXQgc2tpcCBpZiBpc0FjdGl2ZSBpcyBmYWxzZSAodGhlcmUgd2lsbCBuZXZlciBiZSBhbnkgZGVwZW5kZW5jaWVzIHRvIGRpc3Bvc2UpLlxuICAgIGlmIChkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQgJiYgaXNBY3RpdmUoKSAmJiBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQubm9kZVR5cGUpIHtcbiAgICAgICAgZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLnJlbW92ZURpc3Bvc2VDYWxsYmFjayhkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQsIGRpc3Bvc2UpO1xuICAgICAgICAgICAgZGlzcG9zZUNvbXB1dGVkKCk7XG4gICAgICAgIH07XG4gICAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2soZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkLCBkaXNwb3NlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVwZW5kZW50T2JzZXJ2YWJsZTtcbn07XG5cbmtvLmlzQ29tcHV0ZWQgPSBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgIHJldHVybiBrby5oYXNQcm90b3R5cGUoaW5zdGFuY2UsIGtvLmRlcGVuZGVudE9ic2VydmFibGUpO1xufTtcblxudmFyIHByb3RvUHJvcCA9IGtvLm9ic2VydmFibGUucHJvdG9Qcm9wZXJ0eTsgLy8gPT0gXCJfX2tvX3Byb3RvX19cIlxua28uZGVwZW5kZW50T2JzZXJ2YWJsZVtwcm90b1Byb3BdID0ga28ub2JzZXJ2YWJsZTtcblxua28uZGVwZW5kZW50T2JzZXJ2YWJsZVsnZm4nXSA9IHtcbiAgICBcImVxdWFsaXR5Q29tcGFyZXJcIjogdmFsdWVzQXJlUHJpbWl0aXZlQW5kRXF1YWxcbn07XG5rby5kZXBlbmRlbnRPYnNlcnZhYmxlWydmbiddW3Byb3RvUHJvcF0gPSBrby5kZXBlbmRlbnRPYnNlcnZhYmxlO1xuXG4vLyBOb3RlIHRoYXQgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBwcm90byBhc3NpZ25tZW50LCB0aGVcbi8vIGluaGVyaXRhbmNlIGNoYWluIGlzIGNyZWF0ZWQgbWFudWFsbHkgaW4gdGhlIGtvLmRlcGVuZGVudE9ic2VydmFibGUgY29uc3RydWN0b3JcbmlmIChrby51dGlscy5jYW5TZXRQcm90b3R5cGUpIHtcbiAgICBrby51dGlscy5zZXRQcm90b3R5cGVPZihrby5kZXBlbmRlbnRPYnNlcnZhYmxlWydmbiddLCBrby5zdWJzY3JpYmFibGVbJ2ZuJ10pO1xufVxuXG5rby5leHBvcnRTeW1ib2woJ2RlcGVuZGVudE9ic2VydmFibGUnLCBrby5kZXBlbmRlbnRPYnNlcnZhYmxlKTtcbmtvLmV4cG9ydFN5bWJvbCgnY29tcHV0ZWQnLCBrby5kZXBlbmRlbnRPYnNlcnZhYmxlKTsgLy8gTWFrZSBcImtvLmNvbXB1dGVkXCIgYW4gYWxpYXMgZm9yIFwia28uZGVwZW5kZW50T2JzZXJ2YWJsZVwiXG5rby5leHBvcnRTeW1ib2woJ2lzQ29tcHV0ZWQnLCBrby5pc0NvbXB1dGVkKTtcblxua28ucHVyZUNvbXB1dGVkID0gZnVuY3Rpb24gKGV2YWx1YXRvckZ1bmN0aW9uT3JPcHRpb25zLCBldmFsdWF0b3JGdW5jdGlvblRhcmdldCkge1xuICAgIGlmICh0eXBlb2YgZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGtvLmNvbXB1dGVkKGV2YWx1YXRvckZ1bmN0aW9uT3JPcHRpb25zLCBldmFsdWF0b3JGdW5jdGlvblRhcmdldCwgeydwdXJlJzp0cnVlfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMgPSBrby51dGlscy5leHRlbmQoe30sIGV2YWx1YXRvckZ1bmN0aW9uT3JPcHRpb25zKTsgICAvLyBtYWtlIGEgY29weSBvZiB0aGUgcGFyYW1ldGVyIG9iamVjdFxuICAgICAgICBldmFsdWF0b3JGdW5jdGlvbk9yT3B0aW9uc1sncHVyZSddID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGtvLmNvbXB1dGVkKGV2YWx1YXRvckZ1bmN0aW9uT3JPcHRpb25zLCBldmFsdWF0b3JGdW5jdGlvblRhcmdldCk7XG4gICAgfVxufVxua28uZXhwb3J0U3ltYm9sKCdwdXJlQ29tcHV0ZWQnLCBrby5wdXJlQ29tcHV0ZWQpO1xuXG4oZnVuY3Rpb24oKSB7XG4gICAgdmFyIG1heE5lc3RlZE9ic2VydmFibGVEZXB0aCA9IDEwOyAvLyBFc2NhcGUgdGhlICh1bmxpa2VseSkgcGF0aGFsb2dpY2FsIGNhc2Ugd2hlcmUgYW4gb2JzZXJ2YWJsZSdzIGN1cnJlbnQgdmFsdWUgaXMgaXRzZWxmIChvciBzaW1pbGFyIHJlZmVyZW5jZSBjeWNsZSlcblxuICAgIGtvLnRvSlMgPSBmdW5jdGlvbihyb290T2JqZWN0KSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXaGVuIGNhbGxpbmcga28udG9KUywgcGFzcyB0aGUgb2JqZWN0IHlvdSB3YW50IHRvIGNvbnZlcnQuXCIpO1xuXG4gICAgICAgIC8vIFdlIGp1c3QgdW53cmFwIGV2ZXJ5dGhpbmcgYXQgZXZlcnkgbGV2ZWwgaW4gdGhlIG9iamVjdCBncmFwaFxuICAgICAgICByZXR1cm4gbWFwSnNPYmplY3RHcmFwaChyb290T2JqZWN0LCBmdW5jdGlvbih2YWx1ZVRvTWFwKSB7XG4gICAgICAgICAgICAvLyBMb29wIGJlY2F1c2UgYW4gb2JzZXJ2YWJsZSdzIHZhbHVlIG1pZ2h0IGluIHR1cm4gYmUgYW5vdGhlciBvYnNlcnZhYmxlIHdyYXBwZXJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBrby5pc09ic2VydmFibGUodmFsdWVUb01hcCkgJiYgKGkgPCBtYXhOZXN0ZWRPYnNlcnZhYmxlRGVwdGgpOyBpKyspXG4gICAgICAgICAgICAgICAgdmFsdWVUb01hcCA9IHZhbHVlVG9NYXAoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVRvTWFwO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAga28udG9KU09OID0gZnVuY3Rpb24ocm9vdE9iamVjdCwgcmVwbGFjZXIsIHNwYWNlKSB7ICAgICAvLyByZXBsYWNlciBhbmQgc3BhY2UgYXJlIG9wdGlvbmFsXG4gICAgICAgIHZhciBwbGFpbkphdmFTY3JpcHRPYmplY3QgPSBrby50b0pTKHJvb3RPYmplY3QpO1xuICAgICAgICByZXR1cm4ga28udXRpbHMuc3RyaW5naWZ5SnNvbihwbGFpbkphdmFTY3JpcHRPYmplY3QsIHJlcGxhY2VyLCBzcGFjZSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG1hcEpzT2JqZWN0R3JhcGgocm9vdE9iamVjdCwgbWFwSW5wdXRDYWxsYmFjaywgdmlzaXRlZE9iamVjdHMpIHtcbiAgICAgICAgdmlzaXRlZE9iamVjdHMgPSB2aXNpdGVkT2JqZWN0cyB8fCBuZXcgb2JqZWN0TG9va3VwKCk7XG5cbiAgICAgICAgcm9vdE9iamVjdCA9IG1hcElucHV0Q2FsbGJhY2socm9vdE9iamVjdCk7XG4gICAgICAgIHZhciBjYW5IYXZlUHJvcGVydGllcyA9ICh0eXBlb2Ygcm9vdE9iamVjdCA9PSBcIm9iamVjdFwiKSAmJiAocm9vdE9iamVjdCAhPT0gbnVsbCkgJiYgKHJvb3RPYmplY3QgIT09IHVuZGVmaW5lZCkgJiYgKCEocm9vdE9iamVjdCBpbnN0YW5jZW9mIERhdGUpKSAmJiAoIShyb290T2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSkgJiYgKCEocm9vdE9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikpICYmICghKHJvb3RPYmplY3QgaW5zdGFuY2VvZiBCb29sZWFuKSk7XG4gICAgICAgIGlmICghY2FuSGF2ZVByb3BlcnRpZXMpXG4gICAgICAgICAgICByZXR1cm4gcm9vdE9iamVjdDtcblxuICAgICAgICB2YXIgb3V0cHV0UHJvcGVydGllcyA9IHJvb3RPYmplY3QgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDoge307XG4gICAgICAgIHZpc2l0ZWRPYmplY3RzLnNhdmUocm9vdE9iamVjdCwgb3V0cHV0UHJvcGVydGllcyk7XG5cbiAgICAgICAgdmlzaXRQcm9wZXJ0aWVzT3JBcnJheUVudHJpZXMocm9vdE9iamVjdCwgZnVuY3Rpb24oaW5kZXhlcikge1xuICAgICAgICAgICAgdmFyIHByb3BlcnR5VmFsdWUgPSBtYXBJbnB1dENhbGxiYWNrKHJvb3RPYmplY3RbaW5kZXhlcl0pO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wZXJ0eVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzW2luZGV4ZXJdID0gcHJvcGVydHlWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzbHlNYXBwZWRWYWx1ZSA9IHZpc2l0ZWRPYmplY3RzLmdldChwcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvcGVydGllc1tpbmRleGVyXSA9IChwcmV2aW91c2x5TWFwcGVkVmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcHJldmlvdXNseU1hcHBlZFZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG1hcEpzT2JqZWN0R3JhcGgocHJvcGVydHlWYWx1ZSwgbWFwSW5wdXRDYWxsYmFjaywgdmlzaXRlZE9iamVjdHMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmlzaXRQcm9wZXJ0aWVzT3JBcnJheUVudHJpZXMocm9vdE9iamVjdCwgdmlzaXRvckNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm9vdE9iamVjdC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB2aXNpdG9yQ2FsbGJhY2soaSk7XG5cbiAgICAgICAgICAgIC8vIEZvciBhcnJheXMsIGFsc28gcmVzcGVjdCB0b0pTT04gcHJvcGVydHkgZm9yIGN1c3RvbSBtYXBwaW5ncyAoZml4ZXMgIzI3OClcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygcm9vdE9iamVjdFsndG9KU09OJ10gPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICB2aXNpdG9yQ2FsbGJhY2soJ3RvSlNPTicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlOYW1lIGluIHJvb3RPYmplY3QpIHtcbiAgICAgICAgICAgICAgICB2aXNpdG9yQ2FsbGJhY2socHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvYmplY3RMb29rdXAoKSB7XG4gICAgICAgIHRoaXMua2V5cyA9IFtdO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IFtdO1xuICAgIH07XG5cbiAgICBvYmplY3RMb29rdXAucHJvdG90eXBlID0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcjogb2JqZWN0TG9va3VwLFxuICAgICAgICBzYXZlOiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdJbmRleCA9IGtvLnV0aWxzLmFycmF5SW5kZXhPZih0aGlzLmtleXMsIGtleSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKVxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzW2V4aXN0aW5nSW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nSW5kZXggPSBrby51dGlscy5hcnJheUluZGV4T2YodGhpcy5rZXlzLCBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIChleGlzdGluZ0luZGV4ID49IDApID8gdGhpcy52YWx1ZXNbZXhpc3RpbmdJbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCd0b0pTJywga28udG9KUyk7XG5rby5leHBvcnRTeW1ib2woJ3RvSlNPTicsIGtvLnRvSlNPTik7XG4oZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYXNEb21EYXRhRXhwYW5kb1Byb3BlcnR5ID0gJ19fa29fX2hhc0RvbURhdGFPcHRpb25WYWx1ZV9fJztcblxuICAgIC8vIE5vcm1hbGx5LCBTRUxFQ1QgZWxlbWVudHMgYW5kIHRoZWlyIE9QVElPTnMgY2FuIG9ubHkgdGFrZSB2YWx1ZSBvZiB0eXBlICdzdHJpbmcnIChiZWNhdXNlIHRoZSB2YWx1ZXNcbiAgICAvLyBhcmUgc3RvcmVkIG9uIERPTSBhdHRyaWJ1dGVzKS4ga28uc2VsZWN0RXh0ZW5zaW9ucyBwcm92aWRlcyBhIHdheSBmb3IgU0VMRUNUcy9PUFRJT05zIHRvIGhhdmUgdmFsdWVzXG4gICAgLy8gdGhhdCBhcmUgYXJiaXRyYXJ5IG9iamVjdHMuIFRoaXMgaXMgdmVyeSBjb252ZW5pZW50IHdoZW4gaW1wbGVtZW50aW5nIHRoaW5ncyBsaWtlIGNhc2NhZGluZyBkcm9wZG93bnMuXG4gICAga28uc2VsZWN0RXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgcmVhZFZhbHVlIDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFtoYXNEb21EYXRhRXhwYW5kb1Byb3BlcnR5XSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrby51dGlscy5kb21EYXRhLmdldChlbGVtZW50LCBrby5iaW5kaW5nSGFuZGxlcnMub3B0aW9ucy5vcHRpb25WYWx1ZURvbURhdGFLZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMuaWVWZXJzaW9uIDw9IDdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgndmFsdWUnKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3ZhbHVlJykuc3BlY2lmaWVkID8gZWxlbWVudC52YWx1ZSA6IGVsZW1lbnQudGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZWxlbWVudC52YWx1ZTtcbiAgICAgICAgICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5zZWxlY3RlZEluZGV4ID49IDAgPyBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShlbGVtZW50Lm9wdGlvbnNbZWxlbWVudC5zZWxlY3RlZEluZGV4XSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgd3JpdGVWYWx1ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUsIGFsbG93VW5zZXQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoa28udXRpbHMudGFnTmFtZUxvd2VyKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmRvbURhdGEuc2V0KGVsZW1lbnQsIGtvLmJpbmRpbmdIYW5kbGVycy5vcHRpb25zLm9wdGlvblZhbHVlRG9tRGF0YUtleSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRG9tRGF0YUV4cGFuZG9Qcm9wZXJ0eSBpbiBlbGVtZW50KSB7IC8vIElFIDw9IDggdGhyb3dzIGVycm9ycyBpZiB5b3UgZGVsZXRlIG5vbi1leGlzdGVudCBwcm9wZXJ0aWVzIGZyb20gYSBET00gbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZWxlbWVudFtoYXNEb21EYXRhRXhwYW5kb1Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBhcmJpdHJhcnkgb2JqZWN0IHVzaW5nIERvbURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrby51dGlscy5kb21EYXRhLnNldChlbGVtZW50LCBrby5iaW5kaW5nSGFuZGxlcnMub3B0aW9ucy5vcHRpb25WYWx1ZURvbURhdGFLZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50W2hhc0RvbURhdGFFeHBhbmRvUHJvcGVydHldID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgdHJlYXRtZW50IG9mIG51bWJlcnMgaXMganVzdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gS08gMS4yLjEgd3JvdGUgbnVtZXJpY2FsIHZhbHVlcyB0byBlbGVtZW50LnZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09PSBudWxsKSAgICAgICAvLyBBIGJsYW5rIHN0cmluZyBvciBudWxsIHZhbHVlIHdpbGwgc2VsZWN0IHRoZSBjYXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IC0xO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGVsZW1lbnQub3B0aW9ucy5sZW5ndGgsIG9wdGlvblZhbHVlOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZSA9IGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQub3B0aW9uc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmNsdWRlIHNwZWNpYWwgY2hlY2sgdG8gaGFuZGxlIHNlbGVjdGluZyBhIGNhcHRpb24gd2l0aCBhIGJsYW5rIHN0cmluZyB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvblZhbHVlID09IHZhbHVlIHx8IChvcHRpb25WYWx1ZSA9PSBcIlwiICYmIHZhbHVlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dVbnNldCB8fCBzZWxlY3Rpb24gPj0gMCB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtZW50LnNpemUgPiAxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZWxlY3RlZEluZGV4ID0gc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPT09IG51bGwpIHx8ICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG5rby5leHBvcnRTeW1ib2woJ3NlbGVjdEV4dGVuc2lvbnMnLCBrby5zZWxlY3RFeHRlbnNpb25zKTtcbmtvLmV4cG9ydFN5bWJvbCgnc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUnLCBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZSk7XG5rby5leHBvcnRTeW1ib2woJ3NlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZScsIGtvLnNlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZSk7XG5rby5leHByZXNzaW9uUmV3cml0aW5nID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgamF2YVNjcmlwdFJlc2VydmVkV29yZHMgPSBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJudWxsXCIsIFwidW5kZWZpbmVkXCJdO1xuXG4gICAgLy8gTWF0Y2hlcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8tLWVpdGhlciBhbiBpc29sYXRlZCBpZGVudGlmaWVyIG9yIHNvbWV0aGluZyBlbmRpbmcgd2l0aCBhIHByb3BlcnR5IGFjY2Vzc29yXG4gICAgLy8gVGhpcyBpcyBkZXNpZ25lZCB0byBiZSBzaW1wbGUgYW5kIGF2b2lkIGZhbHNlIG5lZ2F0aXZlcywgYnV0IGNvdWxkIHByb2R1Y2UgZmFsc2UgcG9zaXRpdmVzIChlLmcuLCBhK2IuYykuXG4gICAgLy8gVGhpcyBhbHNvIHdpbGwgbm90IHByb3Blcmx5IGhhbmRsZSBuZXN0ZWQgYnJhY2tldHMgKGUuZy4sIG9iajFbb2JqMlsncHJvcCddXTsgc2VlICM5MTEpLlxuICAgIHZhciBqYXZhU2NyaXB0QXNzaWdubWVudFRhcmdldCA9IC9eKD86WyRfYS16XVskXFx3XSp8KC4rKShcXC5cXHMqWyRfYS16XVskXFx3XSp8XFxbLitcXF0pKSQvaTtcblxuICAgIGZ1bmN0aW9uIGdldFdyaXRlYWJsZVZhbHVlKGV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGtvLnV0aWxzLmFycmF5SW5kZXhPZihqYXZhU2NyaXB0UmVzZXJ2ZWRXb3JkcywgZXhwcmVzc2lvbikgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIG1hdGNoID0gZXhwcmVzc2lvbi5tYXRjaChqYXZhU2NyaXB0QXNzaWdubWVudFRhcmdldCk7XG4gICAgICAgIHJldHVybiBtYXRjaCA9PT0gbnVsbCA/IGZhbHNlIDogbWF0Y2hbMV0gPyAoJ09iamVjdCgnICsgbWF0Y2hbMV0gKyAnKScgKyBtYXRjaFsyXSkgOiBleHByZXNzaW9uO1xuICAgIH1cblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aWxsIGJlIHVzZWQgdG8gc3BsaXQgYW4gb2JqZWN0LWxpdGVyYWwgc3RyaW5nIGludG8gdG9rZW5zXG5cbiAgICAgICAgLy8gVGhlc2UgdHdvIG1hdGNoIHN0cmluZ3MsIGVpdGhlciB3aXRoIGRvdWJsZSBxdW90ZXMgb3Igc2luZ2xlIHF1b3Rlc1xuICAgIHZhciBzdHJpbmdEb3VibGUgPSAnXCIoPzpbXlwiXFxcXFxcXFxdfFxcXFxcXFxcLikqXCInLFxuICAgICAgICBzdHJpbmdTaW5nbGUgPSBcIicoPzpbXidcXFxcXFxcXF18XFxcXFxcXFwuKSonXCIsXG4gICAgICAgIC8vIE1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gKHRleHQgZW5jbG9zZWQgYnkgc2xhc2hlcyksIGJ1dCB3aWxsIGFsc28gbWF0Y2ggc2V0cyBvZiBkaXZpc2lvbnNcbiAgICAgICAgLy8gYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gKHRoaXMgaXMgaGFuZGxlZCBieSB0aGUgcGFyc2luZyBsb29wIGJlbG93KS5cbiAgICAgICAgc3RyaW5nUmVnZXhwID0gJy8oPzpbXi9cXFxcXFxcXF18XFxcXFxcXFwuKSovXFx3KicsXG4gICAgICAgIC8vIFRoZXNlIGNoYXJhY3RlcnMgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgdG8gdGhlIHBhcnNlciBhbmQgbXVzdCBub3QgYXBwZWFyIGluIHRoZSBtaWRkbGUgb2YgYVxuICAgICAgICAvLyB0b2tlbiwgZXhjZXB0IGFzIHBhcnQgb2YgYSBzdHJpbmcuXG4gICAgICAgIHNwZWNpYWxzID0gJyxcIlxcJ3t9KCkvOltcXFxcXScsXG4gICAgICAgIC8vIE1hdGNoIHRleHQgKGF0IGxlYXN0IHR3byBjaGFyYWN0ZXJzKSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW55IG9mIHRoZSBhYm92ZSBzcGVjaWFsIGNoYXJhY3RlcnMsXG4gICAgICAgIC8vIGFsdGhvdWdoIHNvbWUgb2YgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUgYWxsb3dlZCB0byBzdGFydCBpdCAoYWxsIGJ1dCB0aGUgY29sb24gYW5kIGNvbW1hKS5cbiAgICAgICAgLy8gVGhlIHRleHQgY2FuIGNvbnRhaW4gc3BhY2VzLCBidXQgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYXJlIHNraXBwZWQuXG4gICAgICAgIGV2ZXJ5VGhpbmdFbHNlID0gJ1teXFxcXHM6LC9dW14nICsgc3BlY2lhbHMgKyAnXSpbXlxcXFxzJyArIHNwZWNpYWxzICsgJ10nLFxuICAgICAgICAvLyBNYXRjaCBhbnkgbm9uLXNwYWNlIGNoYXJhY3RlciBub3QgbWF0Y2hlZCBhbHJlYWR5LiBUaGlzIHdpbGwgbWF0Y2ggY29sb25zIGFuZCBjb21tYXMsIHNpbmNlIHRoZXkncmVcbiAgICAgICAgLy8gbm90IG1hdGNoZWQgYnkgXCJldmVyeVRoaW5nRWxzZVwiLCBidXQgd2lsbCBhbHNvIG1hdGNoIGFueSBvdGhlciBzaW5nbGUgY2hhcmFjdGVyIHRoYXQgd2Fzbid0IGFscmVhZHlcbiAgICAgICAgLy8gbWF0Y2hlZCAoZm9yIGV4YW1wbGU6IGluIFwiYTogMSwgYjogMlwiLCBlYWNoIG9mIHRoZSBub24tc3BhY2UgY2hhcmFjdGVycyB3aWxsIGJlIG1hdGNoZWQgYnkgb25lTm90U3BhY2UpLlxuICAgICAgICBvbmVOb3RTcGFjZSA9ICdbXlxcXFxzXScsXG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBhY3R1YWwgcmVndWxhciBleHByZXNzaW9uIGJ5IG9yLWluZyB0aGUgYWJvdmUgc3RyaW5ncy4gVGhlIG9yZGVyIGlzIGltcG9ydGFudC5cbiAgICAgICAgYmluZGluZ1Rva2VuID0gUmVnRXhwKHN0cmluZ0RvdWJsZSArICd8JyArIHN0cmluZ1NpbmdsZSArICd8JyArIHN0cmluZ1JlZ2V4cCArICd8JyArIGV2ZXJ5VGhpbmdFbHNlICsgJ3wnICsgb25lTm90U3BhY2UsICdnJyksXG5cbiAgICAgICAgLy8gTWF0Y2ggZW5kIG9mIHByZXZpb3VzIHRva2VuIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc2xhc2ggaXMgYSBkaXZpc2lvbiBvciByZWdleC5cbiAgICAgICAgZGl2aXNpb25Mb29rQmVoaW5kID0gL1tcXF0pXCInQS1aYS16MC05XyRdKyQvLFxuICAgICAgICBrZXl3b3JkUmVnZXhMb29rQmVoaW5kID0geydpbic6MSwncmV0dXJuJzoxLCd0eXBlb2YnOjF9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWxTdHJpbmcpIHtcbiAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgZnJvbSB0aGUgc3RyaW5nXG4gICAgICAgIHZhciBzdHIgPSBrby51dGlscy5zdHJpbmdUcmltKG9iamVjdExpdGVyYWxTdHJpbmcpO1xuXG4gICAgICAgIC8vIFRyaW0gYnJhY2VzICd7JyBzdXJyb3VuZGluZyB0aGUgd2hvbGUgb2JqZWN0IGxpdGVyYWxcbiAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KDApID09PSAxMjMpIHN0ciA9IHN0ci5zbGljZSgxLCAtMSk7XG5cbiAgICAgICAgLy8gU3BsaXQgaW50byB0b2tlbnNcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdLCB0b2tzID0gc3RyLm1hdGNoKGJpbmRpbmdUb2tlbiksIGtleSwgdmFsdWVzID0gW10sIGRlcHRoID0gMDtcblxuICAgICAgICBpZiAodG9rcykge1xuICAgICAgICAgICAgLy8gQXBwZW5kIGEgY29tbWEgc28gdGhhdCB3ZSBkb24ndCBuZWVkIGEgc2VwYXJhdGUgY29kZSBibG9jayB0byBkZWFsIHdpdGggdGhlIGxhc3QgaXRlbVxuICAgICAgICAgICAgdG9rcy5wdXNoKCcsJyk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCB0b2s7IHRvayA9IHRva3NbaV07ICsraSkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gdG9rLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgLy8gQSBjb21tYSBzaWduYWxzIHRoZSBlbmQgb2YgYSBrZXkvdmFsdWUgcGFpciBpZiBkZXB0aCBpcyB6ZXJvXG4gICAgICAgICAgICAgICAgaWYgKGMgPT09IDQ0KSB7IC8vIFwiLFwiXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgoa2V5ICYmIHZhbHVlcy5sZW5ndGgpID8ge2tleToga2V5LCB2YWx1ZTogdmFsdWVzLmpvaW4oJycpfSA6IHsndW5rbm93bic6IGtleSB8fCB2YWx1ZXMuam9pbignJyl9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGRlcHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTaW1wbHkgc2tpcCB0aGUgY29sb24gdGhhdCBzZXBhcmF0ZXMgdGhlIG5hbWUgYW5kIHZhbHVlXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSA1OCkgeyAvLyBcIjpcIlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcHRoICYmICFrZXkgJiYgdmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gdmFsdWVzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBIHNldCBvZiBzbGFzaGVzIGlzIGluaXRpYWxseSBtYXRjaGVkIGFzIGEgcmVndWxhciBleHByZXNzaW9uLCBidXQgY291bGQgYmUgZGl2aXNpb25cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09IDQ3ICYmIGkgJiYgdG9rLmxlbmd0aCA+IDEpIHsgIC8vIFwiL1wiXG4gICAgICAgICAgICAgICAgICAgIC8vIExvb2sgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgdG9rZW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBzbGFzaCBpcyBhY3R1YWxseSBkaXZpc2lvblxuICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0b2tzW2ktMV0ubWF0Y2goZGl2aXNpb25Mb29rQmVoaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoICYmICFrZXl3b3JkUmVnZXhMb29rQmVoaW5kW21hdGNoWzBdXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNsYXNoIGlzIGFjdHVhbGx5IGEgZGl2aXNpb24gcHVuY3R1YXRvcjsgcmUtcGFyc2UgdGhlIHJlbWFpbmRlciBvZiB0aGUgc3RyaW5nIChub3QgaW5jbHVkaW5nIHRoZSBzbGFzaClcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoc3RyLmluZGV4T2YodG9rKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rcyA9IHN0ci5tYXRjaChiaW5kaW5nVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rcy5wdXNoKCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZSB3aXRoIGp1c3QgdGhlIHNsYXNoXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSAnLyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgZGVwdGggZm9yIHBhcmVudGhlc2VzLCBicmFjZXMsIGFuZCBicmFja2V0cyBzbyB0aGF0IGludGVyaW9yIGNvbW1hcyBhcmUgaWdub3JlZFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gNDAgfHwgYyA9PT0gMTIzIHx8IGMgPT09IDkxKSB7IC8vICcoJywgJ3snLCAnWydcbiAgICAgICAgICAgICAgICAgICAgKytkZXB0aDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09IDQxIHx8IGMgPT09IDEyNSB8fCBjID09PSA5MykgeyAvLyAnKScsICd9JywgJ10nXG4gICAgICAgICAgICAgICAgICAgIC0tZGVwdGg7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGtleSB3aWxsIGJlIHRoZSBmaXJzdCB0b2tlbjsgaWYgaXQncyBhIHN0cmluZywgdHJpbSB0aGUgcXVvdGVzXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgha2V5ICYmICF2YWx1ZXMubGVuZ3RoICYmIChjID09PSAzNCB8fCBjID09PSAzOSkpIHsgLy8gJ1wiJywgXCInXCJcbiAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godG9rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIFR3by13YXkgYmluZGluZ3MgaW5jbHVkZSBhIHdyaXRlIGZ1bmN0aW9uIHRoYXQgYWxsb3cgdGhlIGhhbmRsZXIgdG8gdXBkYXRlIHRoZSB2YWx1ZSBldmVuIGlmIGl0J3Mgbm90IGFuIG9ic2VydmFibGUuXG4gICAgdmFyIHR3b1dheUJpbmRpbmdzID0ge307XG5cbiAgICBmdW5jdGlvbiBwcmVQcm9jZXNzQmluZGluZ3MoYmluZGluZ3NTdHJpbmdPcktleVZhbHVlQXJyYXksIGJpbmRpbmdPcHRpb25zKSB7XG4gICAgICAgIGJpbmRpbmdPcHRpb25zID0gYmluZGluZ09wdGlvbnMgfHwge307XG5cbiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc0tleVZhbHVlKGtleSwgdmFsKSB7XG4gICAgICAgICAgICB2YXIgd3JpdGFibGVWYWw7XG4gICAgICAgICAgICBmdW5jdGlvbiBjYWxsUHJlcHJvY2Vzc0hvb2sob2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChvYmogJiYgb2JqWydwcmVwcm9jZXNzJ10pID8gKHZhbCA9IG9ialsncHJlcHJvY2VzcyddKHZhbCwga2V5LCBwcm9jZXNzS2V5VmFsdWUpKSA6IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWJpbmRpbmdQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhbGxQcmVwcm9jZXNzSG9vayhrb1snZ2V0QmluZGluZ0hhbmRsZXInXShrZXkpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR3b1dheUJpbmRpbmdzW2tleV0gJiYgKHdyaXRhYmxlVmFsID0gZ2V0V3JpdGVhYmxlVmFsdWUodmFsKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHR3by13YXkgYmluZGluZ3MsIHByb3ZpZGUgYSB3cml0ZSBtZXRob2QgaW4gY2FzZSB0aGUgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLy8gaXNuJ3QgYSB3cml0YWJsZSBvYnNlcnZhYmxlLlxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUFjY2Vzc29yUmVzdWx0U3RyaW5ncy5wdXNoKFwiJ1wiICsga2V5ICsgXCInOmZ1bmN0aW9uKF96KXtcIiArIHdyaXRhYmxlVmFsICsgXCI9X3p9XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFZhbHVlcyBhcmUgd3JhcHBlZCBpbiBhIGZ1bmN0aW9uIHNvIHRoYXQgZWFjaCB2YWx1ZSBjYW4gYmUgYWNjZXNzZWQgaW5kZXBlbmRlbnRseVxuICAgICAgICAgICAgaWYgKG1ha2VWYWx1ZUFjY2Vzc29ycykge1xuICAgICAgICAgICAgICAgIHZhbCA9ICdmdW5jdGlvbigpe3JldHVybiAnICsgdmFsICsgJyB9JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdFN0cmluZ3MucHVzaChcIidcIiArIGtleSArIFwiJzpcIiArIHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVzdWx0U3RyaW5ncyA9IFtdLFxuICAgICAgICAgICAgcHJvcGVydHlBY2Nlc3NvclJlc3VsdFN0cmluZ3MgPSBbXSxcbiAgICAgICAgICAgIG1ha2VWYWx1ZUFjY2Vzc29ycyA9IGJpbmRpbmdPcHRpb25zWyd2YWx1ZUFjY2Vzc29ycyddLFxuICAgICAgICAgICAgYmluZGluZ1BhcmFtcyA9IGJpbmRpbmdPcHRpb25zWydiaW5kaW5nUGFyYW1zJ10sXG4gICAgICAgICAgICBrZXlWYWx1ZUFycmF5ID0gdHlwZW9mIGJpbmRpbmdzU3RyaW5nT3JLZXlWYWx1ZUFycmF5ID09PSBcInN0cmluZ1wiID9cbiAgICAgICAgICAgICAgICBwYXJzZU9iamVjdExpdGVyYWwoYmluZGluZ3NTdHJpbmdPcktleVZhbHVlQXJyYXkpIDogYmluZGluZ3NTdHJpbmdPcktleVZhbHVlQXJyYXk7XG5cbiAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGtleVZhbHVlQXJyYXksIGZ1bmN0aW9uKGtleVZhbHVlKSB7XG4gICAgICAgICAgICBwcm9jZXNzS2V5VmFsdWUoa2V5VmFsdWUua2V5IHx8IGtleVZhbHVlWyd1bmtub3duJ10sIGtleVZhbHVlLnZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5QWNjZXNzb3JSZXN1bHRTdHJpbmdzLmxlbmd0aClcbiAgICAgICAgICAgIHByb2Nlc3NLZXlWYWx1ZSgnX2tvX3Byb3BlcnR5X3dyaXRlcnMnLCBcIntcIiArIHByb3BlcnR5QWNjZXNzb3JSZXN1bHRTdHJpbmdzLmpvaW4oXCIsXCIpICsgXCIgfVwiKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0U3RyaW5ncy5qb2luKFwiLFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBiaW5kaW5nUmV3cml0ZVZhbGlkYXRvcnM6IFtdLFxuXG4gICAgICAgIHR3b1dheUJpbmRpbmdzOiB0d29XYXlCaW5kaW5ncyxcblxuICAgICAgICBwYXJzZU9iamVjdExpdGVyYWw6IHBhcnNlT2JqZWN0TGl0ZXJhbCxcblxuICAgICAgICBwcmVQcm9jZXNzQmluZGluZ3M6IHByZVByb2Nlc3NCaW5kaW5ncyxcblxuICAgICAgICBrZXlWYWx1ZUFycmF5Q29udGFpbnNLZXk6IGZ1bmN0aW9uKGtleVZhbHVlQXJyYXksIGtleSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZUFycmF5Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZUFycmF5W2ldWydrZXknXSA9PSBrZXkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEludGVybmFsLCBwcml2YXRlIEtPIHV0aWxpdHkgZm9yIHVwZGF0aW5nIG1vZGVsIHByb3BlcnRpZXMgZnJvbSB3aXRoaW4gYmluZGluZ3NcbiAgICAgICAgLy8gcHJvcGVydHk6ICAgICAgICAgICAgSWYgdGhlIHByb3BlcnR5IGJlaW5nIHVwZGF0ZWQgaXMgKG9yIG1pZ2h0IGJlKSBhbiBvYnNlcnZhYmxlLCBwYXNzIGl0IGhlcmVcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgSWYgaXQgdHVybnMgb3V0IHRvIGJlIGEgd3JpdGFibGUgb2JzZXJ2YWJsZSwgaXQgd2lsbCBiZSB3cml0dGVuIHRvIGRpcmVjdGx5XG4gICAgICAgIC8vIGFsbEJpbmRpbmdzOiAgICAgICAgIEFuIG9iamVjdCB3aXRoIGEgZ2V0IG1ldGhvZCB0byByZXRyaWV2ZSBiaW5kaW5ncyBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dC5cbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBhICdfa29fcHJvcGVydHlfd3JpdGVycycgcHJvcGVydHkgaW4gY2FzZSB5b3UncmUgd3JpdGluZyB0byBhIG5vbi1vYnNlcnZhYmxlXG4gICAgICAgIC8vIGtleTogICAgICAgICAgICAgICAgIFRoZSBrZXkgaWRlbnRpZnlpbmcgdGhlIHByb3BlcnR5IHRvIGJlIHdyaXR0ZW4uIEV4YW1wbGU6IGZvciB7IGhhc0ZvY3VzOiBteVZhbHVlIH0sIHdyaXRlIHRvICdteVZhbHVlJyBieSBzcGVjaWZ5aW5nIHRoZSBrZXkgJ2hhc0ZvY3VzJ1xuICAgICAgICAvLyB2YWx1ZTogICAgICAgICAgICAgICBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlblxuICAgICAgICAvLyBjaGVja0lmRGlmZmVyZW50OiAgICBJZiB0cnVlLCBhbmQgaWYgdGhlIHByb3BlcnR5IGJlaW5nIHdyaXR0ZW4gaXMgYSB3cml0YWJsZSBvYnNlcnZhYmxlLCB0aGUgdmFsdWUgd2lsbCBvbmx5IGJlIHdyaXR0ZW4gaWZcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgaXQgaXMgIT09IGV4aXN0aW5nIHZhbHVlIG9uIHRoYXQgd3JpdGFibGUgb2JzZXJ2YWJsZVxuICAgICAgICB3cml0ZVZhbHVlVG9Qcm9wZXJ0eTogZnVuY3Rpb24ocHJvcGVydHksIGFsbEJpbmRpbmdzLCBrZXksIHZhbHVlLCBjaGVja0lmRGlmZmVyZW50KSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5IHx8ICFrby5pc09ic2VydmFibGUocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BXcml0ZXJzID0gYWxsQmluZGluZ3MuZ2V0KCdfa29fcHJvcGVydHlfd3JpdGVycycpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wV3JpdGVycyAmJiBwcm9wV3JpdGVyc1trZXldKVxuICAgICAgICAgICAgICAgICAgICBwcm9wV3JpdGVyc1trZXldKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKHByb3BlcnR5KSAmJiAoIWNoZWNrSWZEaWZmZXJlbnQgfHwgcHJvcGVydHkucGVlaygpICE9PSB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCdleHByZXNzaW9uUmV3cml0aW5nJywga28uZXhwcmVzc2lvblJld3JpdGluZyk7XG5rby5leHBvcnRTeW1ib2woJ2V4cHJlc3Npb25SZXdyaXRpbmcuYmluZGluZ1Jld3JpdGVWYWxpZGF0b3JzJywga28uZXhwcmVzc2lvblJld3JpdGluZy5iaW5kaW5nUmV3cml0ZVZhbGlkYXRvcnMpO1xua28uZXhwb3J0U3ltYm9sKCdleHByZXNzaW9uUmV3cml0aW5nLnBhcnNlT2JqZWN0TGl0ZXJhbCcsIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcucGFyc2VPYmplY3RMaXRlcmFsKTtcbmtvLmV4cG9ydFN5bWJvbCgnZXhwcmVzc2lvblJld3JpdGluZy5wcmVQcm9jZXNzQmluZGluZ3MnLCBrby5leHByZXNzaW9uUmV3cml0aW5nLnByZVByb2Nlc3NCaW5kaW5ncyk7XG5cbi8vIE1ha2luZyBiaW5kaW5ncyBleHBsaWNpdGx5IGRlY2xhcmUgdGhlbXNlbHZlcyBhcyBcInR3byB3YXlcIiBpc24ndCBpZGVhbCBpbiB0aGUgbG9uZyB0ZXJtIChpdCB3b3VsZCBiZSBiZXR0ZXIgaWZcbi8vIGFsbCBiaW5kaW5ncyBjb3VsZCB1c2UgYW4gb2ZmaWNpYWwgJ3Byb3BlcnR5IHdyaXRlcicgQVBJIHdpdGhvdXQgbmVlZGluZyB0byBkZWNsYXJlIHRoYXQgdGhleSBtaWdodCkuIEhvd2V2ZXIsXG4vLyBzaW5jZSB0aGlzIGlzIG5vdCwgYW5kIGhhcyBuZXZlciBiZWVuLCBhIHB1YmxpYyBBUEkgKF9rb19wcm9wZXJ0eV93cml0ZXJzIHdhcyBuZXZlciBkb2N1bWVudGVkKSwgaXQncyBhY2NlcHRhYmxlXG4vLyBhcyBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgaW4gdGhlIHNob3J0IHRlcm0uXG4vLyBGb3IgdGhvc2UgZGV2ZWxvcGVycyB3aG8gcmVseSBvbiBfa29fcHJvcGVydHlfd3JpdGVycyBpbiB0aGVpciBjdXN0b20gYmluZGluZ3MsIHdlIGV4cG9zZSBfdHdvV2F5QmluZGluZ3MgYXMgYW5cbi8vIHVuZG9jdW1lbnRlZCBmZWF0dXJlIHRoYXQgbWFrZXMgaXQgcmVsYXRpdmVseSBlYXN5IHRvIHVwZ3JhZGUgdG8gS08gMy4wLiBIb3dldmVyLCB0aGlzIGlzIHN0aWxsIG5vdCBhbiBvZmZpY2lhbFxuLy8gcHVibGljIEFQSSwgYW5kIHdlIHJlc2VydmUgdGhlIHJpZ2h0IHRvIHJlbW92ZSBpdCBhdCBhbnkgdGltZSBpZiB3ZSBjcmVhdGUgYSByZWFsIHB1YmxpYyBwcm9wZXJ0eSB3cml0ZXJzIEFQSS5cbmtvLmV4cG9ydFN5bWJvbCgnZXhwcmVzc2lvblJld3JpdGluZy5fdHdvV2F5QmluZGluZ3MnLCBrby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzKTtcblxuLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGRlZmluZSB0aGUgZm9sbG93aW5nIGFsaWFzZXMuIChQcmV2aW91c2x5LCB0aGVzZSBmdW5jdGlvbiBuYW1lcyB3ZXJlIG1pc2xlYWRpbmcgYmVjYXVzZVxuLy8gdGhleSByZWZlcnJlZCB0byBKU09OIHNwZWNpZmljYWxseSwgZXZlbiB0aG91Z2ggdGhleSBhY3R1YWxseSB3b3JrIHdpdGggYXJiaXRyYXJ5IEphdmFTY3JpcHQgb2JqZWN0IGxpdGVyYWwgZXhwcmVzc2lvbnMuKVxua28uZXhwb3J0U3ltYm9sKCdqc29uRXhwcmVzc2lvblJld3JpdGluZycsIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcpO1xua28uZXhwb3J0U3ltYm9sKCdqc29uRXhwcmVzc2lvblJld3JpdGluZy5pbnNlcnRQcm9wZXJ0eUFjY2Vzc29yc0ludG9Kc29uJywga28uZXhwcmVzc2lvblJld3JpdGluZy5wcmVQcm9jZXNzQmluZGluZ3MpO1xuKGZ1bmN0aW9uKCkge1xuICAgIC8vIFwiVmlydHVhbCBlbGVtZW50c1wiIGlzIGFuIGFic3RyYWN0aW9uIG9uIHRvcCBvZiB0aGUgdXN1YWwgRE9NIEFQSSB3aGljaCB1bmRlcnN0YW5kcyB0aGUgbm90aW9uIHRoYXQgY29tbWVudCBub2Rlc1xuICAgIC8vIG1heSBiZSB1c2VkIHRvIHJlcHJlc2VudCBoaWVyYXJjaHkgKGluIGFkZGl0aW9uIHRvIHRoZSBET00ncyBuYXR1cmFsIGhpZXJhcmNoeSkuXG4gICAgLy8gSWYgeW91IGNhbGwgdGhlIERPTS1tYW5pcHVsYXRpbmcgZnVuY3Rpb25zIG9uIGtvLnZpcnR1YWxFbGVtZW50cywgeW91IHdpbGwgYmUgYWJsZSB0byByZWFkIGFuZCB3cml0ZSB0aGUgc3RhdGVcbiAgICAvLyBvZiB0aGF0IHZpcnR1YWwgaGllcmFyY2h5XG4gICAgLy9cbiAgICAvLyBUaGUgcG9pbnQgb2YgYWxsIHRoaXMgaXMgdG8gc3VwcG9ydCBjb250YWluZXJsZXNzIHRlbXBsYXRlcyAoZS5nLiwgPCEtLSBrbyBmb3JlYWNoOnNvbWVDb2xsZWN0aW9uIC0tPmJsYWg8IS0tIC9rbyAtLT4pXG4gICAgLy8gd2l0aG91dCBoYXZpbmcgdG8gc2NhdHRlciBzcGVjaWFsIGNhc2VzIGFsbCBvdmVyIHRoZSBiaW5kaW5nIGFuZCB0ZW1wbGF0aW5nIGNvZGUuXG5cbiAgICAvLyBJRSA5IGNhbm5vdCByZWxpYWJseSByZWFkIHRoZSBcIm5vZGVWYWx1ZVwiIHByb3BlcnR5IG9mIGEgY29tbWVudCBub2RlIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L2lzc3Vlcy8xODYpXG4gICAgLy8gYnV0IGl0IGRvZXMgZ2l2ZSB0aGVtIGEgbm9uc3RhbmRhcmQgYWx0ZXJuYXRpdmUgcHJvcGVydHkgY2FsbGVkIFwidGV4dFwiIHRoYXQgaXQgY2FuIHJlYWQgcmVsaWFibHkuIE90aGVyIGJyb3dzZXJzIGRvbid0IGhhdmUgdGhhdCBwcm9wZXJ0eS5cbiAgICAvLyBTbywgdXNlIG5vZGUudGV4dCB3aGVyZSBhdmFpbGFibGUsIGFuZCBub2RlLm5vZGVWYWx1ZSBlbHNld2hlcmVcbiAgICB2YXIgY29tbWVudE5vZGVzSGF2ZVRleHRQcm9wZXJ0eSA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCJ0ZXN0XCIpLnRleHQgPT09IFwiPCEtLXRlc3QtLT5cIjtcblxuICAgIHZhciBzdGFydENvbW1lbnRSZWdleCA9IGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyAvXjwhLS1cXHMqa28oPzpcXHMrKFtcXHNcXFNdKykpP1xccyotLT4kLyA6IC9eXFxzKmtvKD86XFxzKyhbXFxzXFxTXSspKT9cXHMqJC87XG4gICAgdmFyIGVuZENvbW1lbnRSZWdleCA9ICAgY29tbWVudE5vZGVzSGF2ZVRleHRQcm9wZXJ0eSA/IC9ePCEtLVxccypcXC9rb1xccyotLT4kLyA6IC9eXFxzKlxcL2tvXFxzKiQvO1xuICAgIHZhciBodG1sVGFnc1dpdGhPcHRpb25hbGx5Q2xvc2luZ0NoaWxkcmVuID0geyAndWwnOiB0cnVlLCAnb2wnOiB0cnVlIH07XG5cbiAgICBmdW5jdGlvbiBpc1N0YXJ0Q29tbWVudChub2RlKSB7XG4gICAgICAgIHJldHVybiAobm9kZS5ub2RlVHlwZSA9PSA4KSAmJiBzdGFydENvbW1lbnRSZWdleC50ZXN0KGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyBub2RlLnRleHQgOiBub2RlLm5vZGVWYWx1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNFbmRDb21tZW50KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIChub2RlLm5vZGVUeXBlID09IDgpICYmIGVuZENvbW1lbnRSZWdleC50ZXN0KGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyBub2RlLnRleHQgOiBub2RlLm5vZGVWYWx1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VmlydHVhbENoaWxkcmVuKHN0YXJ0Q29tbWVudCwgYWxsb3dVbmJhbGFuY2VkKSB7XG4gICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHN0YXJ0Q29tbWVudDtcbiAgICAgICAgdmFyIGRlcHRoID0gMTtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gW107XG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBpZiAoaXNFbmRDb21tZW50KGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY3VycmVudE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoaXNTdGFydENvbW1lbnQoY3VycmVudE5vZGUpKVxuICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhbGxvd1VuYmFsYW5jZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBjbG9zaW5nIGNvbW1lbnQgdGFnIHRvIG1hdGNoOiBcIiArIHN0YXJ0Q29tbWVudC5ub2RlVmFsdWUpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRNYXRjaGluZ0VuZENvbW1lbnQoc3RhcnRDb21tZW50LCBhbGxvd1VuYmFsYW5jZWQpIHtcbiAgICAgICAgdmFyIGFsbFZpcnR1YWxDaGlsZHJlbiA9IGdldFZpcnR1YWxDaGlsZHJlbihzdGFydENvbW1lbnQsIGFsbG93VW5iYWxhbmNlZCk7XG4gICAgICAgIGlmIChhbGxWaXJ0dWFsQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChhbGxWaXJ0dWFsQ2hpbGRyZW4ubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gYWxsVmlydHVhbENoaWxkcmVuW2FsbFZpcnR1YWxDaGlsZHJlbi5sZW5ndGggLSAxXS5uZXh0U2libGluZztcbiAgICAgICAgICAgIHJldHVybiBzdGFydENvbW1lbnQubmV4dFNpYmxpbmc7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIE11c3QgaGF2ZSBubyBtYXRjaGluZyBlbmQgY29tbWVudCwgYW5kIGFsbG93VW5iYWxhbmNlZCBpcyB0cnVlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VW5iYWxhbmNlZENoaWxkVGFncyhub2RlKSB7XG4gICAgICAgIC8vIGUuZy4sIGZyb20gPGRpdj5PSzwvZGl2PjwhLS0ga28gYmxhaCAtLT48c3Bhbj5Bbm90aGVyPC9zcGFuPiwgcmV0dXJuczogPCEtLSBrbyBibGFoIC0tPjxzcGFuPkFub3RoZXI8L3NwYW4+XG4gICAgICAgIC8vICAgICAgIGZyb20gPGRpdj5PSzwvZGl2PjwhLS0gL2tvIC0tPjwhLS0gL2tvIC0tPiwgICAgICAgICAgICAgcmV0dXJuczogPCEtLSAva28gLS0+PCEtLSAva28gLS0+XG4gICAgICAgIHZhciBjaGlsZE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQsIGNhcHR1cmVSZW1haW5pbmcgPSBudWxsO1xuICAgICAgICBpZiAoY2hpbGROb2RlKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVSZW1haW5pbmcpICAgICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGl0IGFuIHVuYmFsYW5jZWQgbm9kZSBhbmQgYXJlIG5vdyBqdXN0IHNjb29waW5nIHVwIGFsbCBzdWJzZXF1ZW50IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZW1haW5pbmcucHVzaChjaGlsZE5vZGUpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzU3RhcnRDb21tZW50KGNoaWxkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nRW5kQ29tbWVudCA9IGdldE1hdGNoaW5nRW5kQ29tbWVudChjaGlsZE5vZGUsIC8qIGFsbG93VW5iYWxhbmNlZDogKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ0VuZENvbW1lbnQpICAgICAgICAgICAgIC8vIEl0J3MgYSBiYWxhbmNlZCB0YWcsIHNvIHNraXAgaW1tZWRpYXRlbHkgdG8gdGhlIGVuZCBvZiB0aGlzIHZpcnR1YWwgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUgPSBtYXRjaGluZ0VuZENvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZW1haW5pbmcgPSBbY2hpbGROb2RlXTsgLy8gSXQncyB1bmJhbGFuY2VkLCBzbyBzdGFydCBjYXB0dXJpbmcgZnJvbSB0aGlzIHBvaW50XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0VuZENvbW1lbnQoY2hpbGROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVtYWluaW5nID0gW2NoaWxkTm9kZV07ICAgICAvLyBJdCdzIHVuYmFsYW5jZWQgKGlmIGl0IHdhc24ndCwgd2UnZCBoYXZlIHNraXBwZWQgb3ZlciBpdCBhbHJlYWR5KSwgc28gc3RhcnQgY2FwdHVyaW5nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAoY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FwdHVyZVJlbWFpbmluZztcbiAgICB9XG5cbiAgICBrby52aXJ0dWFsRWxlbWVudHMgPSB7XG4gICAgICAgIGFsbG93ZWRCaW5kaW5nczoge30sXG5cbiAgICAgICAgY2hpbGROb2RlczogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzU3RhcnRDb21tZW50KG5vZGUpID8gZ2V0VmlydHVhbENoaWxkcmVuKG5vZGUpIDogbm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVtcHR5Tm9kZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgaWYgKCFpc1N0YXJ0Q29tbWVudChub2RlKSlcbiAgICAgICAgICAgICAgICBrby51dGlscy5lbXB0eURvbU5vZGUobm9kZSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmlydHVhbENoaWxkcmVuID0ga28udmlydHVhbEVsZW1lbnRzLmNoaWxkTm9kZXMobm9kZSk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSB2aXJ0dWFsQ2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBrby5yZW1vdmVOb2RlKHZpcnR1YWxDaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0RG9tTm9kZUNoaWxkcmVuOiBmdW5jdGlvbihub2RlLCBjaGlsZE5vZGVzKSB7XG4gICAgICAgICAgICBpZiAoIWlzU3RhcnRDb21tZW50KG5vZGUpKVxuICAgICAgICAgICAgICAgIGtvLnV0aWxzLnNldERvbU5vZGVDaGlsZHJlbihub2RlLCBjaGlsZE5vZGVzKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5lbXB0eU5vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgdmFyIGVuZENvbW1lbnROb2RlID0gbm9kZS5uZXh0U2libGluZzsgLy8gTXVzdCBiZSB0aGUgbmV4dCBzaWJsaW5nLCBhcyB3ZSBqdXN0IGVtcHRpZWQgdGhlIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgZW5kQ29tbWVudE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2Rlc1tpXSwgZW5kQ29tbWVudE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHByZXBlbmQ6IGZ1bmN0aW9uKGNvbnRhaW5lck5vZGUsIG5vZGVUb1ByZXBlbmQpIHtcbiAgICAgICAgICAgIGlmICghaXNTdGFydENvbW1lbnQoY29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTm9kZS5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJOb2RlLmluc2VydEJlZm9yZShub2RlVG9QcmVwZW5kLCBjb250YWluZXJOb2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChub2RlVG9QcmVwZW5kKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgY29tbWVudHMgbXVzdCBhbHdheXMgaGF2ZSBhIHBhcmVudCBhbmQgYXQgbGVhc3Qgb25lIGZvbGxvd2luZyBzaWJsaW5nICh0aGUgZW5kIGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlVG9QcmVwZW5kLCBjb250YWluZXJOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBpbnNlcnRBZnRlcjogZnVuY3Rpb24oY29udGFpbmVyTm9kZSwgbm9kZVRvSW5zZXJ0LCBpbnNlcnRBZnRlck5vZGUpIHtcbiAgICAgICAgICAgIGlmICghaW5zZXJ0QWZ0ZXJOb2RlKSB7XG4gICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLnByZXBlbmQoY29udGFpbmVyTm9kZSwgbm9kZVRvSW5zZXJ0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzU3RhcnRDb21tZW50KGNvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGFmdGVyIGluc2VydGlvbiBwb2ludFxuICAgICAgICAgICAgICAgIGlmIChpbnNlcnRBZnRlck5vZGUubmV4dFNpYmxpbmcpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lck5vZGUuaW5zZXJ0QmVmb3JlKG5vZGVUb0luc2VydCwgaW5zZXJ0QWZ0ZXJOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lck5vZGUuYXBwZW5kQ2hpbGQobm9kZVRvSW5zZXJ0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hpbGRyZW4gb2Ygc3RhcnQgY29tbWVudHMgbXVzdCBhbHdheXMgaGF2ZSBhIHBhcmVudCBhbmQgYXQgbGVhc3Qgb25lIGZvbGxvd2luZyBzaWJsaW5nICh0aGUgZW5kIGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlVG9JbnNlcnQsIGluc2VydEFmdGVyTm9kZS5uZXh0U2libGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgaWYgKCFpc1N0YXJ0Q29tbWVudChub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKCFub2RlLm5leHRTaWJsaW5nIHx8IGlzRW5kQ29tbWVudChub2RlLm5leHRTaWJsaW5nKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9LFxuXG4gICAgICAgIG5leHRTaWJsaW5nOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAoaXNTdGFydENvbW1lbnQobm9kZSkpXG4gICAgICAgICAgICAgICAgbm9kZSA9IGdldE1hdGNoaW5nRW5kQ29tbWVudChub2RlKTtcbiAgICAgICAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nICYmIGlzRW5kQ29tbWVudChub2RlLm5leHRTaWJsaW5nKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9LFxuXG4gICAgICAgIGhhc0JpbmRpbmdWYWx1ZTogaXNTdGFydENvbW1lbnQsXG5cbiAgICAgICAgdmlydHVhbE5vZGVCaW5kaW5nVmFsdWU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIHZhciByZWdleE1hdGNoID0gKGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyBub2RlLnRleHQgOiBub2RlLm5vZGVWYWx1ZSkubWF0Y2goc3RhcnRDb21tZW50UmVnZXgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4TWF0Y2ggPyByZWdleE1hdGNoWzFdIDogbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICBub3JtYWxpc2VWaXJ0dWFsRWxlbWVudERvbVN0cnVjdHVyZTogZnVuY3Rpb24oZWxlbWVudFZlcmlmaWVkKSB7XG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzE1NVxuICAgICAgICAgICAgLy8gKElFIDw9IDggb3IgSUUgOSBxdWlya3MgbW9kZSBwYXJzZXMgeW91ciBIVE1MIHdlaXJkbHksIHRyZWF0aW5nIGNsb3NpbmcgPC9saT4gdGFncyBhcyBpZiB0aGV5IGRvbid0IGV4aXN0LCB0aGVyZWJ5IG1vdmluZyBjb21tZW50IG5vZGVzXG4gICAgICAgICAgICAvLyB0aGF0IGFyZSBkaXJlY3QgZGVzY2VuZGFudHMgb2YgPHVsPiBpbnRvIHRoZSBwcmVjZWRpbmcgPGxpPilcbiAgICAgICAgICAgIGlmICghaHRtbFRhZ3NXaXRoT3B0aW9uYWxseUNsb3NpbmdDaGlsZHJlbltrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudFZlcmlmaWVkKV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBTY2FuIGltbWVkaWF0ZSBjaGlsZHJlbiB0byBzZWUgaWYgdGhleSBjb250YWluIHVuYmFsYW5jZWQgY29tbWVudCB0YWdzLiBJZiB0aGV5IGRvLCB0aG9zZSBjb21tZW50IHRhZ3NcbiAgICAgICAgICAgIC8vIG11c3QgYmUgaW50ZW5kZWQgdG8gYXBwZWFyICphZnRlciogdGhhdCBjaGlsZCwgc28gbW92ZSB0aGVtIHRoZXJlLlxuICAgICAgICAgICAgdmFyIGNoaWxkTm9kZSA9IGVsZW1lbnRWZXJpZmllZC5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZSkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVuYmFsYW5jZWRUYWdzID0gZ2V0VW5iYWxhbmNlZENoaWxkVGFncyhjaGlsZE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuYmFsYW5jZWRUYWdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4IHVwIHRoZSBET00gYnkgbW92aW5nIHRoZSB1bmJhbGFuY2VkIHRhZ3MgdG8gd2hlcmUgdGhleSBtb3N0IGxpa2VseSB3ZXJlIGludGVuZGVkIHRvIGJlIHBsYWNlZCAtICphZnRlciogdGhlIGNoaWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVUb0luc2VydEJlZm9yZSA9IGNoaWxkTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVuYmFsYW5jZWRUYWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVG9JbnNlcnRCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmVyaWZpZWQuaW5zZXJ0QmVmb3JlKHVuYmFsYW5jZWRUYWdzW2ldLCBub2RlVG9JbnNlcnRCZWZvcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmVyaWZpZWQuYXBwZW5kQ2hpbGQodW5iYWxhbmNlZFRhZ3NbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNoaWxkTm9kZSA9IGNoaWxkTm9kZS5uZXh0U2libGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmtvLmV4cG9ydFN5bWJvbCgndmlydHVhbEVsZW1lbnRzJywga28udmlydHVhbEVsZW1lbnRzKTtcbmtvLmV4cG9ydFN5bWJvbCgndmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5ncycsIGtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3MpO1xua28uZXhwb3J0U3ltYm9sKCd2aXJ0dWFsRWxlbWVudHMuZW1wdHlOb2RlJywga28udmlydHVhbEVsZW1lbnRzLmVtcHR5Tm9kZSk7XG4vL2tvLmV4cG9ydFN5bWJvbCgndmlydHVhbEVsZW1lbnRzLmZpcnN0Q2hpbGQnLCBrby52aXJ0dWFsRWxlbWVudHMuZmlyc3RDaGlsZCk7ICAgICAvLyBmaXJzdENoaWxkIGlzIG5vdCBtaW5pZmllZFxua28uZXhwb3J0U3ltYm9sKCd2aXJ0dWFsRWxlbWVudHMuaW5zZXJ0QWZ0ZXInLCBrby52aXJ0dWFsRWxlbWVudHMuaW5zZXJ0QWZ0ZXIpO1xuLy9rby5leHBvcnRTeW1ib2woJ3ZpcnR1YWxFbGVtZW50cy5uZXh0U2libGluZycsIGtvLnZpcnR1YWxFbGVtZW50cy5uZXh0U2libGluZyk7ICAgLy8gbmV4dFNpYmxpbmcgaXMgbm90IG1pbmlmaWVkXG5rby5leHBvcnRTeW1ib2woJ3ZpcnR1YWxFbGVtZW50cy5wcmVwZW5kJywga28udmlydHVhbEVsZW1lbnRzLnByZXBlbmQpO1xua28uZXhwb3J0U3ltYm9sKCd2aXJ0dWFsRWxlbWVudHMuc2V0RG9tTm9kZUNoaWxkcmVuJywga28udmlydHVhbEVsZW1lbnRzLnNldERvbU5vZGVDaGlsZHJlbik7XG4oZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRlZmF1bHRCaW5kaW5nQXR0cmlidXRlTmFtZSA9IFwiZGF0YS1iaW5kXCI7XG5cbiAgICBrby5iaW5kaW5nUHJvdmlkZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5iaW5kaW5nQ2FjaGUgPSB7fTtcbiAgICB9O1xuXG4gICAga28udXRpbHMuZXh0ZW5kKGtvLmJpbmRpbmdQcm92aWRlci5wcm90b3R5cGUsIHtcbiAgICAgICAgJ25vZGVIYXNCaW5kaW5ncyc6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoZGVmYXVsdEJpbmRpbmdBdHRyaWJ1dGVOYW1lKSAhPSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBrby5jb21wb25lbnRzWydnZXRDb21wb25lbnROYW1lRm9yTm9kZSddKG5vZGUpO1xuICAgICAgICAgICAgICAgIGNhc2UgODogLy8gQ29tbWVudCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrby52aXJ0dWFsRWxlbWVudHMuaGFzQmluZGluZ1ZhbHVlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAnZ2V0QmluZGluZ3MnOiBmdW5jdGlvbihub2RlLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdzU3RyaW5nID0gdGhpc1snZ2V0QmluZGluZ3NTdHJpbmcnXShub2RlLCBiaW5kaW5nQ29udGV4dCksXG4gICAgICAgICAgICAgICAgcGFyc2VkQmluZGluZ3MgPSBiaW5kaW5nc1N0cmluZyA/IHRoaXNbJ3BhcnNlQmluZGluZ3NTdHJpbmcnXShiaW5kaW5nc1N0cmluZywgYmluZGluZ0NvbnRleHQsIG5vZGUpIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBrby5jb21wb25lbnRzLmFkZEJpbmRpbmdzRm9yQ3VzdG9tRWxlbWVudChwYXJzZWRCaW5kaW5ncywgbm9kZSwgYmluZGluZ0NvbnRleHQsIC8qIHZhbHVlQWNjZXNzb3JzICovIGZhbHNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnZ2V0QmluZGluZ0FjY2Vzc29ycyc6IGZ1bmN0aW9uKG5vZGUsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgYmluZGluZ3NTdHJpbmcgPSB0aGlzWydnZXRCaW5kaW5nc1N0cmluZyddKG5vZGUsIGJpbmRpbmdDb250ZXh0KSxcbiAgICAgICAgICAgICAgICBwYXJzZWRCaW5kaW5ncyA9IGJpbmRpbmdzU3RyaW5nID8gdGhpc1sncGFyc2VCaW5kaW5nc1N0cmluZyddKGJpbmRpbmdzU3RyaW5nLCBiaW5kaW5nQ29udGV4dCwgbm9kZSwgeyAndmFsdWVBY2Nlc3NvcnMnOiB0cnVlIH0pIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBrby5jb21wb25lbnRzLmFkZEJpbmRpbmdzRm9yQ3VzdG9tRWxlbWVudChwYXJzZWRCaW5kaW5ncywgbm9kZSwgYmluZGluZ0NvbnRleHQsIC8qIHZhbHVlQWNjZXNzb3JzICovIHRydWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgb25seSB1c2VkIGludGVybmFsbHkgYnkgdGhpcyBkZWZhdWx0IHByb3ZpZGVyLlxuICAgICAgICAvLyBJdCdzIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBnZW5lcmFsIGJpbmRpbmcgcHJvdmlkZXIuXG4gICAgICAgICdnZXRCaW5kaW5nc1N0cmluZyc6IGZ1bmN0aW9uKG5vZGUsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5vZGUubm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShkZWZhdWx0QmluZGluZ0F0dHJpYnV0ZU5hbWUpOyAgIC8vIEVsZW1lbnRcbiAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBrby52aXJ0dWFsRWxlbWVudHMudmlydHVhbE5vZGVCaW5kaW5nVmFsdWUobm9kZSk7IC8vIENvbW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgb25seSB1c2VkIGludGVybmFsbHkgYnkgdGhpcyBkZWZhdWx0IHByb3ZpZGVyLlxuICAgICAgICAvLyBJdCdzIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBnZW5lcmFsIGJpbmRpbmcgcHJvdmlkZXIuXG4gICAgICAgICdwYXJzZUJpbmRpbmdzU3RyaW5nJzogZnVuY3Rpb24oYmluZGluZ3NTdHJpbmcsIGJpbmRpbmdDb250ZXh0LCBub2RlLCBvcHRpb25zKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBiaW5kaW5nRnVuY3Rpb24gPSBjcmVhdGVCaW5kaW5nc1N0cmluZ0V2YWx1YXRvclZpYUNhY2hlKGJpbmRpbmdzU3RyaW5nLCB0aGlzLmJpbmRpbmdDYWNoZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdGdW5jdGlvbihiaW5kaW5nQ29udGV4dCwgbm9kZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgIGV4Lm1lc3NhZ2UgPSBcIlVuYWJsZSB0byBwYXJzZSBiaW5kaW5ncy5cXG5CaW5kaW5ncyB2YWx1ZTogXCIgKyBiaW5kaW5nc1N0cmluZyArIFwiXFxuTWVzc2FnZTogXCIgKyBleC5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBrby5iaW5kaW5nUHJvdmlkZXJbJ2luc3RhbmNlJ10gPSBuZXcga28uYmluZGluZ1Byb3ZpZGVyKCk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVCaW5kaW5nc1N0cmluZ0V2YWx1YXRvclZpYUNhY2hlKGJpbmRpbmdzU3RyaW5nLCBjYWNoZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgY2FjaGVLZXkgPSBiaW5kaW5nc1N0cmluZyArIChvcHRpb25zICYmIG9wdGlvbnNbJ3ZhbHVlQWNjZXNzb3JzJ10gfHwgJycpO1xuICAgICAgICByZXR1cm4gY2FjaGVbY2FjaGVLZXldXG4gICAgICAgICAgICB8fCAoY2FjaGVbY2FjaGVLZXldID0gY3JlYXRlQmluZGluZ3NTdHJpbmdFdmFsdWF0b3IoYmluZGluZ3NTdHJpbmcsIG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVCaW5kaW5nc1N0cmluZ0V2YWx1YXRvcihiaW5kaW5nc1N0cmluZywgb3B0aW9ucykge1xuICAgICAgICAvLyBCdWlsZCB0aGUgc291cmNlIGZvciBhIGZ1bmN0aW9uIHRoYXQgZXZhbHVhdGVzIFwiZXhwcmVzc2lvblwiXG4gICAgICAgIC8vIEZvciBlYWNoIHNjb3BlIHZhcmlhYmxlLCBhZGQgYW4gZXh0cmEgbGV2ZWwgb2YgXCJ3aXRoXCIgbmVzdGluZ1xuICAgICAgICAvLyBFeGFtcGxlIHJlc3VsdDogd2l0aChzYzEpIHsgd2l0aChzYzApIHsgcmV0dXJuIChleHByZXNzaW9uKSB9IH1cbiAgICAgICAgdmFyIHJld3JpdHRlbkJpbmRpbmdzID0ga28uZXhwcmVzc2lvblJld3JpdGluZy5wcmVQcm9jZXNzQmluZGluZ3MoYmluZGluZ3NTdHJpbmcsIG9wdGlvbnMpLFxuICAgICAgICAgICAgZnVuY3Rpb25Cb2R5ID0gXCJ3aXRoKCRjb250ZXh0KXt3aXRoKCRkYXRhfHx7fSl7cmV0dXJue1wiICsgcmV3cml0dGVuQmluZGluZ3MgKyBcIn19fVwiO1xuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKFwiJGNvbnRleHRcIiwgXCIkZWxlbWVudFwiLCBmdW5jdGlvbkJvZHkpO1xuICAgIH1cbn0pKCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgnYmluZGluZ1Byb3ZpZGVyJywga28uYmluZGluZ1Byb3ZpZGVyKTtcbihmdW5jdGlvbiAoKSB7XG4gICAga28uYmluZGluZ0hhbmRsZXJzID0ge307XG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnQgdHlwZXMgd2lsbCBub3QgYmUgcmVjdXJzZWQgaW50byBkdXJpbmcgYmluZGluZy4gSW4gdGhlIGZ1dHVyZSwgd2VcbiAgICAvLyBtYXkgY29uc2lkZXIgYWRkaW5nIDx0ZW1wbGF0ZT4gdG8gdGhpcyBsaXN0LCBiZWNhdXNlIHN1Y2ggZWxlbWVudHMnIGNvbnRlbnRzIGFyZSBhbHdheXNcbiAgICAvLyBpbnRlbmRlZCB0byBiZSBib3VuZCBpbiBhIGRpZmZlcmVudCBjb250ZXh0IGZyb20gd2hlcmUgdGhleSBhcHBlYXIgaW4gdGhlIGRvY3VtZW50LlxuICAgIHZhciBiaW5kaW5nRG9lc05vdFJlY3Vyc2VJbnRvRWxlbWVudFR5cGVzID0ge1xuICAgICAgICAvLyBEb24ndCB3YW50IGJpbmRpbmdzIHRoYXQgb3BlcmF0ZSBvbiB0ZXh0IG5vZGVzIHRvIG11dGF0ZSA8c2NyaXB0PiBhbmQgPHRleHRhcmVhPiBjb250ZW50cyxcbiAgICAgICAgLy8gYmVjYXVzZSBpdCdzIHVuZXhwZWN0ZWQgYW5kIGEgcG90ZW50aWFsIFhTUyBpc3N1ZVxuICAgICAgICAnc2NyaXB0JzogdHJ1ZSxcbiAgICAgICAgJ3RleHRhcmVhJzogdHJ1ZVxuICAgIH07XG5cbiAgICAvLyBVc2UgYW4gb3ZlcnJpZGFibGUgbWV0aG9kIGZvciByZXRyaWV2aW5nIGJpbmRpbmcgaGFuZGxlcnMgc28gdGhhdCBhIHBsdWdpbnMgbWF5IHN1cHBvcnQgZHluYW1pY2FsbHkgY3JlYXRlZCBoYW5kbGVyc1xuICAgIGtvWydnZXRCaW5kaW5nSGFuZGxlciddID0gZnVuY3Rpb24oYmluZGluZ0tleSkge1xuICAgICAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzW2JpbmRpbmdLZXldO1xuICAgIH07XG5cbiAgICAvLyBUaGUga28uYmluZGluZ0NvbnRleHQgY29uc3RydWN0b3IgaXMgb25seSBjYWxsZWQgZGlyZWN0bHkgdG8gY3JlYXRlIHRoZSByb290IGNvbnRleHQuIEZvciBjaGlsZFxuICAgIC8vIGNvbnRleHRzLCB1c2UgYmluZGluZ0NvbnRleHQuY3JlYXRlQ2hpbGRDb250ZXh0IG9yIGJpbmRpbmdDb250ZXh0LmV4dGVuZC5cbiAgICBrby5iaW5kaW5nQ29udGV4dCA9IGZ1bmN0aW9uKGRhdGFJdGVtT3JBY2Nlc3NvciwgcGFyZW50Q29udGV4dCwgZGF0YUl0ZW1BbGlhcywgZXh0ZW5kQ2FsbGJhY2spIHtcblxuICAgICAgICAvLyBUaGUgYmluZGluZyBjb250ZXh0IG9iamVjdCBpbmNsdWRlcyBzdGF0aWMgcHJvcGVydGllcyBmb3IgdGhlIGN1cnJlbnQsIHBhcmVudCwgYW5kIHJvb3QgdmlldyBtb2RlbHMuXG4gICAgICAgIC8vIElmIGEgdmlldyBtb2RlbCBpcyBhY3R1YWxseSBzdG9yZWQgaW4gYW4gb2JzZXJ2YWJsZSwgdGhlIGNvcnJlc3BvbmRpbmcgYmluZGluZyBjb250ZXh0IG9iamVjdCwgYW5kXG4gICAgICAgIC8vIGFueSBjaGlsZCBjb250ZXh0cywgbXVzdCBiZSB1cGRhdGVkIHdoZW4gdGhlIHZpZXcgbW9kZWwgaXMgY2hhbmdlZC5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ29udGV4dCgpIHtcbiAgICAgICAgICAgIC8vIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZSBjb250ZXh0IHdpbGwgZGlyZWN0bHkgZ2V0IGEgdmlldyBtb2RlbCBvYmplY3QsIGJ1dCBpZiBhIGZ1bmN0aW9uIGlzIGdpdmVuLFxuICAgICAgICAgICAgLy8gd2UgY2FsbCB0aGUgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIHZpZXcgbW9kZWwuIElmIHRoZSBmdW5jdGlvbiBhY2Nlc3NlcyBhbnkgb2JzZXZhYmxlcyBvciByZXR1cm5zXG4gICAgICAgICAgICAvLyBhbiBvYnNlcnZhYmxlLCB0aGUgZGVwZW5kZW5jeSBpcyB0cmFja2VkLCBhbmQgdGhvc2Ugb2JzZXJ2YWJsZXMgY2FuIGxhdGVyIGNhdXNlIHRoZSBiaW5kaW5nXG4gICAgICAgICAgICAvLyBjb250ZXh0IHRvIGJlIHVwZGF0ZWQuXG4gICAgICAgICAgICB2YXIgZGF0YUl0ZW1Pck9ic2VydmFibGUgPSBpc0Z1bmMgPyBkYXRhSXRlbU9yQWNjZXNzb3IoKSA6IGRhdGFJdGVtT3JBY2Nlc3NvcixcbiAgICAgICAgICAgICAgICBkYXRhSXRlbSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoZGF0YUl0ZW1Pck9ic2VydmFibGUpO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50Q29udGV4dCkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gYSBcInBhcmVudFwiIGNvbnRleHQgaXMgZ2l2ZW4sIHJlZ2lzdGVyIGEgZGVwZW5kZW5jeSBvbiB0aGUgcGFyZW50IGNvbnRleHQuIFRodXMgd2hlbmV2ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gcGFyZW50IGNvbnRleHQgaXMgdXBkYXRlZCwgdGhpcyBjb250ZXh0IHdpbGwgYWxzbyBiZSB1cGRhdGVkLlxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRDb250ZXh0Ll9zdWJzY3JpYmFibGUpXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbnRleHQuX3N1YnNjcmliYWJsZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ29weSAkcm9vdCBhbmQgYW55IGN1c3RvbSBwcm9wZXJ0aWVzIGZyb20gdGhlIHBhcmVudCBjb250ZXh0XG4gICAgICAgICAgICAgICAga28udXRpbHMuZXh0ZW5kKHNlbGYsIHBhcmVudENvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGUgYWJvdmUgY29weSBvdmVyd3JpdGVzIG91ciBvd24gcHJvcGVydGllcywgd2UgbmVlZCB0byByZXNldCB0aGVtLlxuICAgICAgICAgICAgICAgIC8vIER1cmluZyB0aGUgZmlyc3QgZXhlY3V0aW9uLCBcInN1YnNjcmliYWJsZVwiIGlzbid0IHNldCwgc28gZG9uJ3QgYm90aGVyIGRvaW5nIHRoZSB1cGRhdGUgdGhlbi5cbiAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaWJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3N1YnNjcmliYWJsZSA9IHN1YnNjcmliYWJsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGZbJyRwYXJlbnRzJ10gPSBbXTtcbiAgICAgICAgICAgICAgICBzZWxmWyckcm9vdCddID0gZGF0YUl0ZW07XG5cbiAgICAgICAgICAgICAgICAvLyBFeHBvcnQgJ2tvJyBpbiB0aGUgYmluZGluZyBjb250ZXh0IHNvIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGluIGJpbmRpbmdzIGFuZCB0ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAvLyBldmVuIGlmICdrbycgaXNuJ3QgZXhwb3J0ZWQgYXMgYSBnbG9iYWwsIHN1Y2ggYXMgd2hlbiB1c2luZyBhbiBBTUQgbG9hZGVyLlxuICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzQ5MFxuICAgICAgICAgICAgICAgIHNlbGZbJ2tvJ10gPSBrbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGZbJyRyYXdEYXRhJ10gPSBkYXRhSXRlbU9yT2JzZXJ2YWJsZTtcbiAgICAgICAgICAgIHNlbGZbJyRkYXRhJ10gPSBkYXRhSXRlbTtcbiAgICAgICAgICAgIGlmIChkYXRhSXRlbUFsaWFzKVxuICAgICAgICAgICAgICAgIHNlbGZbZGF0YUl0ZW1BbGlhc10gPSBkYXRhSXRlbTtcblxuICAgICAgICAgICAgLy8gVGhlIGV4dGVuZENhbGxiYWNrIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdoZW4gY3JlYXRpbmcgYSBjaGlsZCBjb250ZXh0IG9yIGV4dGVuZGluZyBhIGNvbnRleHQuXG4gICAgICAgICAgICAvLyBJdCBoYW5kbGVzIHRoZSBzcGVjaWZpYyBhY3Rpb25zIG5lZWRlZCB0byBmaW5pc2ggc2V0dGluZyB1cCB0aGUgYmluZGluZyBjb250ZXh0LiBBY3Rpb25zIGluIHRoaXNcbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGNvdWxkIGFsc28gYWRkIGRlcGVuZGVuY2llcyB0byB0aGlzIGJpbmRpbmcgY29udGV4dC5cbiAgICAgICAgICAgIGlmIChleHRlbmRDYWxsYmFjaylcbiAgICAgICAgICAgICAgICBleHRlbmRDYWxsYmFjayhzZWxmLCBwYXJlbnRDb250ZXh0LCBkYXRhSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxmWyckZGF0YSddO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGRpc3Bvc2VXaGVuKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVzICYmICFrby51dGlscy5hbnlEb21Ob2RlSXNBdHRhY2hlZFRvRG9jdW1lbnQobm9kZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgICAgaXNGdW5jID0gdHlwZW9mKGRhdGFJdGVtT3JBY2Nlc3NvcikgPT0gXCJmdW5jdGlvblwiICYmICFrby5pc09ic2VydmFibGUoZGF0YUl0ZW1PckFjY2Vzc29yKSxcbiAgICAgICAgICAgIG5vZGVzLFxuICAgICAgICAgICAgc3Vic2NyaWJhYmxlID0ga28uZGVwZW5kZW50T2JzZXJ2YWJsZSh1cGRhdGVDb250ZXh0LCBudWxsLCB7IGRpc3Bvc2VXaGVuOiBkaXNwb3NlV2hlbiwgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBiaW5kaW5nIGNvbnRleHQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGFuZCB0aGUgXCJzdWJzY3JpYmFibGVcIiBjb21wdXRlZCBvYnNlcnZhYmxlIGlzXG4gICAgICAgIC8vIHN1YnNjcmliZWQgdG8gYW55IG9ic2VydmFibGVzIHRoYXQgd2VyZSBhY2Nlc3NlZCBpbiB0aGUgcHJvY2Vzcy4gSWYgdGhlcmUgaXMgbm90aGluZyB0byB0cmFjaywgdGhlXG4gICAgICAgIC8vIGNvbXB1dGVkIHdpbGwgYmUgaW5hY3RpdmUsIGFuZCB3ZSBjYW4gc2FmZWx5IHRocm93IGl0IGF3YXkuIElmIGl0J3MgYWN0aXZlLCB0aGUgY29tcHV0ZWQgaXMgc3RvcmVkIGluXG4gICAgICAgIC8vIHRoZSBjb250ZXh0IG9iamVjdC5cbiAgICAgICAgaWYgKHN1YnNjcmliYWJsZS5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICBzZWxmLl9zdWJzY3JpYmFibGUgPSBzdWJzY3JpYmFibGU7XG5cbiAgICAgICAgICAgIC8vIEFsd2F5cyBub3RpZnkgYmVjYXVzZSBldmVuIGlmIHRoZSBtb2RlbCAoJGRhdGEpIGhhc24ndCBjaGFuZ2VkLCBvdGhlciBjb250ZXh0IHByb3BlcnRpZXMgbWlnaHQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICAgICBzdWJzY3JpYmFibGVbJ2VxdWFsaXR5Q29tcGFyZXInXSA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBkaXNwb3NlIG9mIHRoaXMgY29tcHV0ZWQgb2JzZXJ2YWJsZSB3aGVuIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC4gVGhpcyB3b3VsZCBiZVxuICAgICAgICAgICAgLy8gZWFzeSBpZiB3ZSBoYWQgYSBzaW5nbGUgbm9kZSB0byB3YXRjaCwgYnV0IGJpbmRpbmcgY29udGV4dHMgY2FuIGJlIHVzZWQgYnkgbWFueSBkaWZmZXJlbnQgbm9kZXMsIGFuZFxuICAgICAgICAgICAgLy8gd2UgY2Fubm90IGFzc3VtZSB0aGF0IHRob3NlIG5vZGVzIGhhdmUgYW55IHJlbGF0aW9uIHRvIGVhY2ggb3RoZXIuIFNvIGluc3RlYWQgd2UgdHJhY2sgYW55IG5vZGUgdGhhdFxuICAgICAgICAgICAgLy8gdGhlIGNvbnRleHQgaXMgYXR0YWNoZWQgdG8sIGFuZCBkaXNwb3NlIHRoZSBjb21wdXRlZCB3aGVuIGFsbCBvZiB0aG9zZSBub2RlcyBoYXZlIGJlZW4gY2xlYW5lZC5cblxuICAgICAgICAgICAgLy8gQWRkIHByb3BlcnRpZXMgdG8gKnN1YnNjcmliYWJsZSogaW5zdGVhZCBvZiAqc2VsZiogYmVjYXVzZSBhbnkgcHJvcGVydGllcyBhZGRlZCB0byAqc2VsZiogbWF5IGJlIG92ZXJ3cml0dGVuIG9uIHVwZGF0ZXNcbiAgICAgICAgICAgIG5vZGVzID0gW107XG4gICAgICAgICAgICBzdWJzY3JpYmFibGUuX2FkZE5vZGUgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKG5vZGUsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAga28udXRpbHMuYXJyYXlSZW1vdmVJdGVtKG5vZGVzLCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliYWJsZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdWJzY3JpYmFibGUgPSBzdWJzY3JpYmFibGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFeHRlbmQgdGhlIGJpbmRpbmcgY29udGV4dCBoaWVyYXJjaHkgd2l0aCBhIG5ldyB2aWV3IG1vZGVsIG9iamVjdC4gSWYgdGhlIHBhcmVudCBjb250ZXh0IGlzIHdhdGNoaW5nXG4gICAgLy8gYW55IG9ic2V2YWJsZXMsIHRoZSBuZXcgY2hpbGQgY29udGV4dCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0IGEgZGVwZW5kZW5jeSBvbiB0aGUgcGFyZW50IGNvbnRleHQuXG4gICAgLy8gQnV0IHRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSAkZGF0YSB2YWx1ZSBvZiB0aGUgY2hpbGQgY29udGV4dCB3aWxsIGFsc28gZ2V0IHVwZGF0ZWQuIElmIHRoZSBjaGlsZFxuICAgIC8vIHZpZXcgbW9kZWwgYWxzbyBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgdmlldyBtb2RlbCwgeW91IG11c3QgcHJvdmlkZSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY29ycmVjdFxuICAgIC8vIHZpZXcgbW9kZWwgb24gZWFjaCB1cGRhdGUuXG4gICAga28uYmluZGluZ0NvbnRleHQucHJvdG90eXBlWydjcmVhdGVDaGlsZENvbnRleHQnXSA9IGZ1bmN0aW9uIChkYXRhSXRlbU9yQWNjZXNzb3IsIGRhdGFJdGVtQWxpYXMsIGV4dGVuZENhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcga28uYmluZGluZ0NvbnRleHQoZGF0YUl0ZW1PckFjY2Vzc29yLCB0aGlzLCBkYXRhSXRlbUFsaWFzLCBmdW5jdGlvbihzZWxmLCBwYXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICAvLyBFeHRlbmQgdGhlIGNvbnRleHQgaGllcmFyY2h5IGJ5IHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlIHBvaW50ZXJzXG4gICAgICAgICAgICBzZWxmWyckcGFyZW50Q29udGV4dCddID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgICAgIHNlbGZbJyRwYXJlbnQnXSA9IHBhcmVudENvbnRleHRbJyRkYXRhJ107XG4gICAgICAgICAgICBzZWxmWyckcGFyZW50cyddID0gKHBhcmVudENvbnRleHRbJyRwYXJlbnRzJ10gfHwgW10pLnNsaWNlKDApO1xuICAgICAgICAgICAgc2VsZlsnJHBhcmVudHMnXS51bnNoaWZ0KHNlbGZbJyRwYXJlbnQnXSk7XG4gICAgICAgICAgICBpZiAoZXh0ZW5kQ2FsbGJhY2spXG4gICAgICAgICAgICAgICAgZXh0ZW5kQ2FsbGJhY2soc2VsZik7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBFeHRlbmQgdGhlIGJpbmRpbmcgY29udGV4dCB3aXRoIG5ldyBjdXN0b20gcHJvcGVydGllcy4gVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgY29udGV4dCBoaWVyYXJjaHkuXG4gICAgLy8gU2ltaWxhcmx5IHRvIFwiY2hpbGRcIiBjb250ZXh0cywgcHJvdmlkZSBhIGZ1bmN0aW9uIGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvcnJlY3QgdmFsdWVzIGFyZSBzZXRcbiAgICAvLyB3aGVuIGFuIG9ic2VydmFibGUgdmlldyBtb2RlbCBpcyB1cGRhdGVkLlxuICAgIGtvLmJpbmRpbmdDb250ZXh0LnByb3RvdHlwZVsnZXh0ZW5kJ10gPSBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7XG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgY29udGV4dCByZWZlcmVuY2VzIGFuIG9ic2VydmFibGUgdmlldyBtb2RlbCwgXCJfc3Vic2NyaWJhYmxlXCIgd2lsbCBhbHdheXMgYmUgdGhlXG4gICAgICAgIC8vIGxhdGVzdCB2aWV3IG1vZGVsIG9iamVjdC4gSWYgbm90LCBcIl9zdWJzY3JpYmFibGVcIiBpc24ndCBzZXQsIGFuZCB3ZSBjYW4gdXNlIHRoZSBzdGF0aWMgXCIkZGF0YVwiIHZhbHVlLlxuICAgICAgICByZXR1cm4gbmV3IGtvLmJpbmRpbmdDb250ZXh0KHRoaXMuX3N1YnNjcmliYWJsZSB8fCB0aGlzWyckZGF0YSddLCB0aGlzLCBudWxsLCBmdW5jdGlvbihzZWxmLCBwYXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICAvLyBUaGlzIFwiY2hpbGRcIiBjb250ZXh0IGRvZXNuJ3QgZGlyZWN0bHkgdHJhY2sgYSBwYXJlbnQgb2JzZXJ2YWJsZSB2aWV3IG1vZGVsLFxuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBtYW51YWxseSBzZXQgdGhlICRyYXdEYXRhIHZhbHVlIHRvIG1hdGNoIHRoZSBwYXJlbnQuXG4gICAgICAgICAgICBzZWxmWyckcmF3RGF0YSddID0gcGFyZW50Q29udGV4dFsnJHJhd0RhdGEnXTtcbiAgICAgICAgICAgIGtvLnV0aWxzLmV4dGVuZChzZWxmLCB0eXBlb2YocHJvcGVydGllcykgPT0gXCJmdW5jdGlvblwiID8gcHJvcGVydGllcygpIDogcHJvcGVydGllcyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBSZXR1cm5zIHRoZSB2YWx1ZUFjY2Vzb3IgZnVuY3Rpb24gZm9yIGEgYmluZGluZyB2YWx1ZVxuICAgIGZ1bmN0aW9uIG1ha2VWYWx1ZUFjY2Vzc29yKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlQWNjZXNzb3IgZnVuY3Rpb25cbiAgICBmdW5jdGlvbiBldmFsdWF0ZVZhbHVlQWNjZXNzb3IodmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICByZXR1cm4gdmFsdWVBY2Nlc3NvcigpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGJpbmRpbmdzLCBjcmVhdGUgYW5kIHJldHVybiBhIG5ldyBvYmplY3QgdGhhdCBjb250YWluc1xuICAgIC8vIGJpbmRpbmcgdmFsdWUtYWNjZXNzb3JzIGZ1bmN0aW9ucy4gRWFjaCBhY2Nlc3NvciBmdW5jdGlvbiBjYWxscyB0aGUgb3JpZ2luYWwgZnVuY3Rpb25cbiAgICAvLyBzbyB0aGF0IGl0IGFsd2F5cyBnZXRzIHRoZSBsYXRlc3QgdmFsdWUgYW5kIGFsbCBkZXBlbmRlbmNpZXMgYXJlIGNhcHR1cmVkLiBUaGlzIGlzIHVzZWRcbiAgICAvLyBieSBrby5hcHBseUJpbmRpbmdzVG9Ob2RlIGFuZCBnZXRCaW5kaW5nc0FuZE1ha2VBY2Nlc3NvcnMuXG4gICAgZnVuY3Rpb24gbWFrZUFjY2Vzc29yc0Zyb21GdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4ga28udXRpbHMub2JqZWN0TWFwKGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uaWdub3JlKGNhbGxiYWNrKSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpW2tleV07XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhIGJpbmRpbmdzIGZ1bmN0aW9uIG9yIG9iamVjdCwgY3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgb2JqZWN0IHRoYXQgY29udGFpbnNcbiAgICAvLyBiaW5kaW5nIHZhbHVlLWFjY2Vzc29ycyBmdW5jdGlvbnMuIFRoaXMgaXMgdXNlZCBieSBrby5hcHBseUJpbmRpbmdzVG9Ob2RlLlxuICAgIGZ1bmN0aW9uIG1ha2VCaW5kaW5nQWNjZXNzb3JzKGJpbmRpbmdzLCBjb250ZXh0LCBub2RlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYmluZGluZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlQWNjZXNzb3JzRnJvbUZ1bmN0aW9uKGJpbmRpbmdzLmJpbmQobnVsbCwgY29udGV4dCwgbm9kZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLm9iamVjdE1hcChiaW5kaW5ncywgbWFrZVZhbHVlQWNjZXNzb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGlmIHRoZSBiaW5kaW5nIHByb3ZpZGVyIGRvZXNuJ3QgaW5jbHVkZSBhIGdldEJpbmRpbmdBY2Nlc3NvcnMgZnVuY3Rpb24uXG4gICAgLy8gSXQgbXVzdCBiZSBjYWxsZWQgd2l0aCAndGhpcycgc2V0IHRvIHRoZSBwcm92aWRlciBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBnZXRCaW5kaW5nc0FuZE1ha2VBY2Nlc3NvcnMobm9kZSwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbWFrZUFjY2Vzc29yc0Zyb21GdW5jdGlvbih0aGlzWydnZXRCaW5kaW5ncyddLmJpbmQodGhpcywgbm9kZSwgY29udGV4dCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlVGhhdEJpbmRpbmdJc0FsbG93ZWRGb3JWaXJ0dWFsRWxlbWVudHMoYmluZGluZ05hbWUpIHtcbiAgICAgICAgdmFyIHZhbGlkYXRvciA9IGtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3NbYmluZGluZ05hbWVdO1xuICAgICAgICBpZiAoIXZhbGlkYXRvcilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBiaW5kaW5nICdcIiArIGJpbmRpbmdOYW1lICsgXCInIGNhbm5vdCBiZSB1c2VkIHdpdGggdmlydHVhbCBlbGVtZW50c1wiKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzSW50ZXJuYWwgKGJpbmRpbmdDb250ZXh0LCBlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgYmluZGluZ0NvbnRleHRzTWF5RGlmZmVyRnJvbURvbVBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRDaGlsZCxcbiAgICAgICAgICAgIG5leHRJblF1ZXVlID0ga28udmlydHVhbEVsZW1lbnRzLmZpcnN0Q2hpbGQoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQpLFxuICAgICAgICAgICAgcHJvdmlkZXIgPSBrby5iaW5kaW5nUHJvdmlkZXJbJ2luc3RhbmNlJ10sXG4gICAgICAgICAgICBwcmVwcm9jZXNzTm9kZSA9IHByb3ZpZGVyWydwcmVwcm9jZXNzTm9kZSddO1xuXG4gICAgICAgIC8vIFByZXByb2Nlc3NpbmcgYWxsb3dzIGEgYmluZGluZyBwcm92aWRlciB0byBtdXRhdGUgYSBub2RlIGJlZm9yZSBiaW5kaW5ncyBhcmUgYXBwbGllZCB0byBpdC4gRm9yIGV4YW1wbGUgaXQnc1xuICAgICAgICAvLyBwb3NzaWJsZSB0byBpbnNlcnQgbmV3IHNpYmxpbmdzIGFmdGVyIGl0LCBhbmQvb3IgcmVwbGFjZSB0aGUgbm9kZSB3aXRoIGEgZGlmZmVyZW50IG9uZS4gVGhpcyBjYW4gYmUgdXNlZCB0b1xuICAgICAgICAvLyBpbXBsZW1lbnQgY3VzdG9tIGJpbmRpbmcgc3ludGF4ZXMsIHN1Y2ggYXMge3sgdmFsdWUgfX0gZm9yIHN0cmluZyBpbnRlcnBvbGF0aW9uLCBvciBjdXN0b20gZWxlbWVudCB0eXBlcyB0aGF0XG4gICAgICAgIC8vIHRyaWdnZXIgaW5zZXJ0aW9uIG9mIDx0ZW1wbGF0ZT4gY29udGVudHMgYXQgdGhhdCBwb2ludCBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICAgIGlmIChwcmVwcm9jZXNzTm9kZSkge1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDaGlsZCA9IG5leHRJblF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgbmV4dEluUXVldWUgPSBrby52aXJ0dWFsRWxlbWVudHMubmV4dFNpYmxpbmcoY3VycmVudENoaWxkKTtcbiAgICAgICAgICAgICAgICBwcmVwcm9jZXNzTm9kZS5jYWxsKHByb3ZpZGVyLCBjdXJyZW50Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVzZXQgbmV4dEluUXVldWUgZm9yIHRoZSBuZXh0IGxvb3BcbiAgICAgICAgICAgIG5leHRJblF1ZXVlID0ga28udmlydHVhbEVsZW1lbnRzLmZpcnN0Q2hpbGQoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRDaGlsZCA9IG5leHRJblF1ZXVlKSB7XG4gICAgICAgICAgICAvLyBLZWVwIGEgcmVjb3JkIG9mIHRoZSBuZXh0IGNoaWxkICpiZWZvcmUqIGFwcGx5aW5nIGJpbmRpbmdzLCBpbiBjYXNlIHRoZSBiaW5kaW5nIHJlbW92ZXMgdGhlIGN1cnJlbnQgY2hpbGQgZnJvbSBpdHMgcG9zaXRpb25cbiAgICAgICAgICAgIG5leHRJblF1ZXVlID0ga28udmlydHVhbEVsZW1lbnRzLm5leHRTaWJsaW5nKGN1cnJlbnRDaGlsZCk7XG4gICAgICAgICAgICBhcHBseUJpbmRpbmdzVG9Ob2RlQW5kRGVzY2VuZGFudHNJbnRlcm5hbChiaW5kaW5nQ29udGV4dCwgY3VycmVudENoaWxkLCBiaW5kaW5nQ29udGV4dHNNYXlEaWZmZXJGcm9tRG9tUGFyZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseUJpbmRpbmdzVG9Ob2RlQW5kRGVzY2VuZGFudHNJbnRlcm5hbCAoYmluZGluZ0NvbnRleHQsIG5vZGVWZXJpZmllZCwgYmluZGluZ0NvbnRleHRNYXlEaWZmZXJGcm9tRG9tUGFyZW50RWxlbWVudCkge1xuICAgICAgICB2YXIgc2hvdWxkQmluZERlc2NlbmRhbnRzID0gdHJ1ZTtcblxuICAgICAgICAvLyBQZXJmIG9wdGltaXNhdGlvbjogQXBwbHkgYmluZGluZ3Mgb25seSBpZi4uLlxuICAgICAgICAvLyAoMSkgV2UgbmVlZCB0byBzdG9yZSB0aGUgYmluZGluZyBjb250ZXh0IG9uIHRoaXMgbm9kZSAoYmVjYXVzZSBpdCBtYXkgZGlmZmVyIGZyb20gdGhlIERPTSBwYXJlbnQgbm9kZSdzIGJpbmRpbmcgY29udGV4dClcbiAgICAgICAgLy8gICAgIE5vdGUgdGhhdCB3ZSBjYW4ndCBzdG9yZSBiaW5kaW5nIGNvbnRleHRzIG9uIG5vbi1lbGVtZW50cyAoZS5nLiwgdGV4dCBub2RlcyksIGFzIElFIGRvZXNuJ3QgYWxsb3cgZXhwYW5kbyBwcm9wZXJ0aWVzIGZvciB0aG9zZVxuICAgICAgICAvLyAoMikgSXQgbWlnaHQgaGF2ZSBiaW5kaW5ncyAoZS5nLiwgaXQgaGFzIGEgZGF0YS1iaW5kIGF0dHJpYnV0ZSwgb3IgaXQncyBhIG1hcmtlciBmb3IgYSBjb250YWluZXJsZXNzIHRlbXBsYXRlKVxuICAgICAgICB2YXIgaXNFbGVtZW50ID0gKG5vZGVWZXJpZmllZC5ub2RlVHlwZSA9PT0gMSk7XG4gICAgICAgIGlmIChpc0VsZW1lbnQpIC8vIFdvcmthcm91bmQgSUUgPD0gOCBIVE1MIHBhcnNpbmcgd2VpcmRuZXNzXG4gICAgICAgICAgICBrby52aXJ0dWFsRWxlbWVudHMubm9ybWFsaXNlVmlydHVhbEVsZW1lbnREb21TdHJ1Y3R1cmUobm9kZVZlcmlmaWVkKTtcblxuICAgICAgICB2YXIgc2hvdWxkQXBwbHlCaW5kaW5ncyA9IChpc0VsZW1lbnQgJiYgYmluZGluZ0NvbnRleHRNYXlEaWZmZXJGcm9tRG9tUGFyZW50RWxlbWVudCkgICAgICAgICAgICAgLy8gQ2FzZSAoMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBrby5iaW5kaW5nUHJvdmlkZXJbJ2luc3RhbmNlJ11bJ25vZGVIYXNCaW5kaW5ncyddKG5vZGVWZXJpZmllZCk7ICAgICAgIC8vIENhc2UgKDIpXG4gICAgICAgIGlmIChzaG91bGRBcHBseUJpbmRpbmdzKVxuICAgICAgICAgICAgc2hvdWxkQmluZERlc2NlbmRhbnRzID0gYXBwbHlCaW5kaW5nc1RvTm9kZUludGVybmFsKG5vZGVWZXJpZmllZCwgbnVsbCwgYmluZGluZ0NvbnRleHQsIGJpbmRpbmdDb250ZXh0TWF5RGlmZmVyRnJvbURvbVBhcmVudEVsZW1lbnQpWydzaG91bGRCaW5kRGVzY2VuZGFudHMnXTtcblxuICAgICAgICBpZiAoc2hvdWxkQmluZERlc2NlbmRhbnRzICYmICFiaW5kaW5nRG9lc05vdFJlY3Vyc2VJbnRvRWxlbWVudFR5cGVzW2tvLnV0aWxzLnRhZ05hbWVMb3dlcihub2RlVmVyaWZpZWQpXSkge1xuICAgICAgICAgICAgLy8gV2UncmUgcmVjdXJzaW5nIGF1dG9tYXRpY2FsbHkgaW50byAocmVhbCBvciB2aXJ0dWFsKSBjaGlsZCBub2RlcyB3aXRob3V0IGNoYW5naW5nIGJpbmRpbmcgY29udGV4dHMuIFNvLFxuICAgICAgICAgICAgLy8gICogRm9yIGNoaWxkcmVuIG9mIGEgKnJlYWwqIGVsZW1lbnQsIHRoZSBiaW5kaW5nIGNvbnRleHQgaXMgY2VydGFpbmx5IHRoZSBzYW1lIGFzIG9uIHRoZWlyIERPTSAucGFyZW50Tm9kZSxcbiAgICAgICAgICAgIC8vICAgIGhlbmNlIGJpbmRpbmdDb250ZXh0c01heURpZmZlckZyb21Eb21QYXJlbnRFbGVtZW50IGlzIGZhbHNlXG4gICAgICAgICAgICAvLyAgKiBGb3IgY2hpbGRyZW4gb2YgYSAqdmlydHVhbCogZWxlbWVudCwgd2UgY2FuJ3QgYmUgc3VyZS4gRXZhbHVhdGluZyAucGFyZW50Tm9kZSBvbiB0aG9zZSBjaGlsZHJlbiBtYXlcbiAgICAgICAgICAgIC8vICAgIHNraXAgb3ZlciBhbnkgbnVtYmVyIG9mIGludGVybWVkaWF0ZSB2aXJ0dWFsIGVsZW1lbnRzLCBhbnkgb2Ygd2hpY2ggbWlnaHQgZGVmaW5lIGEgY3VzdG9tIGJpbmRpbmcgY29udGV4dCxcbiAgICAgICAgICAgIC8vICAgIGhlbmNlIGJpbmRpbmdDb250ZXh0c01heURpZmZlckZyb21Eb21QYXJlbnRFbGVtZW50IGlzIHRydWVcbiAgICAgICAgICAgIGFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzSW50ZXJuYWwoYmluZGluZ0NvbnRleHQsIG5vZGVWZXJpZmllZCwgLyogYmluZGluZ0NvbnRleHRzTWF5RGlmZmVyRnJvbURvbVBhcmVudEVsZW1lbnQ6ICovICFpc0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJvdW5kRWxlbWVudERvbURhdGFLZXkgPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKTtcblxuXG4gICAgZnVuY3Rpb24gdG9wb2xvZ2ljYWxTb3J0QmluZGluZ3MoYmluZGluZ3MpIHtcbiAgICAgICAgLy8gRGVwdGgtZmlyc3Qgc29ydFxuICAgICAgICB2YXIgcmVzdWx0ID0gW10sICAgICAgICAgICAgICAgIC8vIFRoZSBsaXN0IG9mIGtleS9oYW5kbGVyIHBhaXJzIHRoYXQgd2Ugd2lsbCByZXR1cm5cbiAgICAgICAgICAgIGJpbmRpbmdzQ29uc2lkZXJlZCA9IHt9LCAgICAvLyBBIHRlbXBvcmFyeSByZWNvcmQgb2Ygd2hpY2ggYmluZGluZ3MgYXJlIGFscmVhZHkgaW4gJ3Jlc3VsdCdcbiAgICAgICAgICAgIGN5Y2xpY0RlcGVuZGVuY3lTdGFjayA9IFtdOyAvLyBLZWVwcyB0cmFjayBvZiBhIGRlcHRoLXNlYXJjaCBzbyB0aGF0LCBpZiB0aGVyZSdzIGEgY3ljbGUsIHdlIGtub3cgd2hpY2ggYmluZGluZ3MgY2F1c2VkIGl0XG4gICAgICAgIGtvLnV0aWxzLm9iamVjdEZvckVhY2goYmluZGluZ3MsIGZ1bmN0aW9uIHB1c2hCaW5kaW5nKGJpbmRpbmdLZXkpIHtcbiAgICAgICAgICAgIGlmICghYmluZGluZ3NDb25zaWRlcmVkW2JpbmRpbmdLZXldKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJpbmRpbmcgPSBrb1snZ2V0QmluZGluZ0hhbmRsZXInXShiaW5kaW5nS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoYmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBhZGQgZGVwZW5kZW5jaWVzIChpZiBhbnkpIG9mIHRoZSBjdXJyZW50IGJpbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdbJ2FmdGVyJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xpY0RlcGVuZGVuY3lTdGFjay5wdXNoKGJpbmRpbmdLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGJpbmRpbmdbJ2FmdGVyJ10sIGZ1bmN0aW9uKGJpbmRpbmdEZXBlbmRlbmN5S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdzW2JpbmRpbmdEZXBlbmRlbmN5S2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa28udXRpbHMuYXJyYXlJbmRleE9mKGN5Y2xpY0RlcGVuZGVuY3lTdGFjaywgYmluZGluZ0RlcGVuZGVuY3lLZXkpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJDYW5ub3QgY29tYmluZSB0aGUgZm9sbG93aW5nIGJpbmRpbmdzLCBiZWNhdXNlIHRoZXkgaGF2ZSBhIGN5Y2xpYyBkZXBlbmRlbmN5OiBcIiArIGN5Y2xpY0RlcGVuZGVuY3lTdGFjay5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEJpbmRpbmcoYmluZGluZ0RlcGVuZGVuY3lLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjeWNsaWNEZXBlbmRlbmN5U3RhY2subGVuZ3RoLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gTmV4dCBhZGQgdGhlIGN1cnJlbnQgYmluZGluZ1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGtleTogYmluZGluZ0tleSwgaGFuZGxlcjogYmluZGluZyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmluZGluZ3NDb25zaWRlcmVkW2JpbmRpbmdLZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseUJpbmRpbmdzVG9Ob2RlSW50ZXJuYWwobm9kZSwgc291cmNlQmluZGluZ3MsIGJpbmRpbmdDb250ZXh0LCBiaW5kaW5nQ29udGV4dE1heURpZmZlckZyb21Eb21QYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIC8vIFByZXZlbnQgbXVsdGlwbGUgYXBwbHlCaW5kaW5ncyBjYWxscyBmb3IgdGhlIHNhbWUgbm9kZSwgZXhjZXB0IHdoZW4gYSBiaW5kaW5nIHZhbHVlIGlzIHNwZWNpZmllZFxuICAgICAgICB2YXIgYWxyZWFkeUJvdW5kID0ga28udXRpbHMuZG9tRGF0YS5nZXQobm9kZSwgYm91bmRFbGVtZW50RG9tRGF0YUtleSk7XG4gICAgICAgIGlmICghc291cmNlQmluZGluZ3MpIHtcbiAgICAgICAgICAgIGlmIChhbHJlYWR5Qm91bmQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIllvdSBjYW5ub3QgYXBwbHkgYmluZGluZ3MgbXVsdGlwbGUgdGltZXMgdG8gdGhlIHNhbWUgZWxlbWVudC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrby51dGlscy5kb21EYXRhLnNldChub2RlLCBib3VuZEVsZW1lbnREb21EYXRhS2V5LCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGltaXphdGlvbjogRG9uJ3Qgc3RvcmUgdGhlIGJpbmRpbmcgY29udGV4dCBvbiB0aGlzIG5vZGUgaWYgaXQncyBkZWZpbml0ZWx5IHRoZSBzYW1lIGFzIG9uIG5vZGUucGFyZW50Tm9kZSwgYmVjYXVzZVxuICAgICAgICAvLyB3ZSBjYW4gZWFzaWx5IHJlY292ZXIgaXQganVzdCBieSBzY2FubmluZyB1cCB0aGUgbm9kZSdzIGFuY2VzdG9ycyBpbiB0aGUgRE9NXG4gICAgICAgIC8vIChub3RlOiBoZXJlLCBwYXJlbnQgbm9kZSBtZWFucyBcInJlYWwgRE9NIHBhcmVudFwiIG5vdCBcInZpcnR1YWwgcGFyZW50XCIsIGFzIHRoZXJlJ3Mgbm8gTygxKSB3YXkgdG8gZmluZCB0aGUgdmlydHVhbCBwYXJlbnQpXG4gICAgICAgIGlmICghYWxyZWFkeUJvdW5kICYmIGJpbmRpbmdDb250ZXh0TWF5RGlmZmVyRnJvbURvbVBhcmVudEVsZW1lbnQpXG4gICAgICAgICAgICBrby5zdG9yZWRCaW5kaW5nQ29udGV4dEZvck5vZGUobm9kZSwgYmluZGluZ0NvbnRleHQpO1xuXG4gICAgICAgIC8vIFVzZSBiaW5kaW5ncyBpZiBnaXZlbiwgb3RoZXJ3aXNlIGZhbGwgYmFjayBvbiBhc2tpbmcgdGhlIGJpbmRpbmdzIHByb3ZpZGVyIHRvIGdpdmUgdXMgc29tZSBiaW5kaW5nc1xuICAgICAgICB2YXIgYmluZGluZ3M7XG4gICAgICAgIGlmIChzb3VyY2VCaW5kaW5ncyAmJiB0eXBlb2Ygc291cmNlQmluZGluZ3MgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGJpbmRpbmdzID0gc291cmNlQmluZGluZ3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBrby5iaW5kaW5nUHJvdmlkZXJbJ2luc3RhbmNlJ10sXG4gICAgICAgICAgICAgICAgZ2V0QmluZGluZ3MgPSBwcm92aWRlclsnZ2V0QmluZGluZ0FjY2Vzc29ycyddIHx8IGdldEJpbmRpbmdzQW5kTWFrZUFjY2Vzc29ycztcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBiaW5kaW5nIGZyb20gdGhlIHByb3ZpZGVyIHdpdGhpbiBhIGNvbXB1dGVkIG9ic2VydmFibGUgc28gdGhhdCB3ZSBjYW4gdXBkYXRlIHRoZSBiaW5kaW5ncyB3aGVuZXZlclxuICAgICAgICAgICAgLy8gdGhlIGJpbmRpbmcgY29udGV4dCBpcyB1cGRhdGVkIG9yIGlmIHRoZSBiaW5kaW5nIHByb3ZpZGVyIGFjY2Vzc2VzIG9ic2VydmFibGVzLlxuICAgICAgICAgICAgdmFyIGJpbmRpbmdzVXBkYXRlciA9IGtvLmRlcGVuZGVudE9ic2VydmFibGUoXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzID0gc291cmNlQmluZGluZ3MgPyBzb3VyY2VCaW5kaW5ncyhiaW5kaW5nQ29udGV4dCwgbm9kZSkgOiBnZXRCaW5kaW5ncy5jYWxsKHByb3ZpZGVyLCBub2RlLCBiaW5kaW5nQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGEgZGVwZW5kZW5jeSBvbiB0aGUgYmluZGluZyBjb250ZXh0IHRvIHN1cHBvcnQgb2JzZXZhYmxlIHZpZXcgbW9kZWxzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ3MgJiYgYmluZGluZ0NvbnRleHQuX3N1YnNjcmliYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb250ZXh0Ll9zdWJzY3JpYmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IG5vZGUgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCFiaW5kaW5ncyB8fCAhYmluZGluZ3NVcGRhdGVyLmlzQWN0aXZlKCkpXG4gICAgICAgICAgICAgICAgYmluZGluZ3NVcGRhdGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBiaW5kaW5nSGFuZGxlclRoYXRDb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncztcbiAgICAgICAgaWYgKGJpbmRpbmdzKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGFjY2Vzc29yIGZvciBhIGdpdmVuIGJpbmRpbmcuIFdoZW4gYmluZGluZ3MgYXJlIHN0YXRpYyAod29uJ3QgYmUgdXBkYXRlZCBiZWNhdXNlIG9mIGEgYmluZGluZ1xuICAgICAgICAgICAgLy8gY29udGV4dCB1cGRhdGUpLCBqdXN0IHJldHVybiB0aGUgdmFsdWUgYWNjZXNzb3IgZnJvbSB0aGUgYmluZGluZy4gT3RoZXJ3aXNlLCByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyBnZXRzXG4gICAgICAgICAgICAvLyB0aGUgbGF0ZXN0IGJpbmRpbmcgdmFsdWUgYW5kIHJlZ2lzdGVycyBhIGRlcGVuZGVuY3kgb24gdGhlIGJpbmRpbmcgdXBkYXRlci5cbiAgICAgICAgICAgIHZhciBnZXRWYWx1ZUFjY2Vzc29yID0gYmluZGluZ3NVcGRhdGVyXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbihiaW5kaW5nS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZVZhbHVlQWNjZXNzb3IoYmluZGluZ3NVcGRhdGVyKClbYmluZGluZ0tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbihiaW5kaW5nS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nc1tiaW5kaW5nS2V5XTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBVc2Ugb2YgYWxsQmluZGluZ3MgYXMgYSBmdW5jdGlvbiBpcyBtYWludGFpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0cyB1c2UgaXMgZGVwcmVjYXRlZFxuICAgICAgICAgICAgZnVuY3Rpb24gYWxsQmluZGluZ3MoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLm9iamVjdE1hcChiaW5kaW5nc1VwZGF0ZXIgPyBiaW5kaW5nc1VwZGF0ZXIoKSA6IGJpbmRpbmdzLCBldmFsdWF0ZVZhbHVlQWNjZXNzb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyB0aGUgMy54IGFsbEJpbmRpbmdzIEFQSVxuICAgICAgICAgICAgYWxsQmluZGluZ3NbJ2dldCddID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzW2tleV0gJiYgZXZhbHVhdGVWYWx1ZUFjY2Vzc29yKGdldFZhbHVlQWNjZXNzb3Ioa2V5KSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWxsQmluZGluZ3NbJ2hhcyddID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleSBpbiBiaW5kaW5ncztcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZpcnN0IHB1dCB0aGUgYmluZGluZ3MgaW50byB0aGUgcmlnaHQgb3JkZXJcbiAgICAgICAgICAgIHZhciBvcmRlcmVkQmluZGluZ3MgPSB0b3BvbG9naWNhbFNvcnRCaW5kaW5ncyhiaW5kaW5ncyk7XG5cbiAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIHNvcnRlZCBiaW5kaW5ncywgY2FsbGluZyBpbml0IGFuZCB1cGRhdGUgZm9yIGVhY2hcbiAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5Rm9yRWFjaChvcmRlcmVkQmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmdLZXlBbmRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRvcG9sb2dpY2FsU29ydEJpbmRpbmdzIGhhcyBhbHJlYWR5IGZpbHRlcmVkIG91dCBhbnkgbm9uZXhpc3RlbnQgYmluZGluZyBoYW5kbGVycyxcbiAgICAgICAgICAgICAgICAvLyBzbyBiaW5kaW5nS2V5QW5kSGFuZGxlci5oYW5kbGVyIHdpbGwgYWx3YXlzIGJlIG5vbm51bGwuXG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZXJJbml0Rm4gPSBiaW5kaW5nS2V5QW5kSGFuZGxlci5oYW5kbGVyW1wiaW5pdFwiXSxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlclVwZGF0ZUZuID0gYmluZGluZ0tleUFuZEhhbmRsZXIuaGFuZGxlcltcInVwZGF0ZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgYmluZGluZ0tleSA9IGJpbmRpbmdLZXlBbmRIYW5kbGVyLmtleTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlVGhhdEJpbmRpbmdJc0FsbG93ZWRGb3JWaXJ0dWFsRWxlbWVudHMoYmluZGluZ0tleSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUnVuIGluaXQsIGlnbm9yaW5nIGFueSBkZXBlbmRlbmNpZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVySW5pdEZuID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRSZXN1bHQgPSBoYW5kbGVySW5pdEZuKG5vZGUsIGdldFZhbHVlQWNjZXNzb3IoYmluZGluZ0tleSksIGFsbEJpbmRpbmdzLCBiaW5kaW5nQ29udGV4dFsnJGRhdGEnXSwgYmluZGluZ0NvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBiaW5kaW5nIGhhbmRsZXIgY2xhaW1zIHRvIGNvbnRyb2wgZGVzY2VuZGFudCBiaW5kaW5ncywgbWFrZSBhIG5vdGUgb2YgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbml0UmVzdWx0ICYmIGluaXRSZXN1bHRbJ2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdIYW5kbGVyVGhhdENvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdWx0aXBsZSBiaW5kaW5ncyAoXCIgKyBiaW5kaW5nSGFuZGxlclRoYXRDb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncyArIFwiIGFuZCBcIiArIGJpbmRpbmdLZXkgKyBcIikgYXJlIHRyeWluZyB0byBjb250cm9sIGRlc2NlbmRhbnQgYmluZGluZ3Mgb2YgdGhlIHNhbWUgZWxlbWVudC4gWW91IGNhbm5vdCB1c2UgdGhlc2UgYmluZGluZ3MgdG9nZXRoZXIgb24gdGhlIHNhbWUgZWxlbWVudC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdIYW5kbGVyVGhhdENvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzID0gYmluZGluZ0tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJ1biB1cGRhdGUgaW4gaXRzIG93biBjb21wdXRlZCB3cmFwcGVyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlclVwZGF0ZUZuID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAga28uZGVwZW5kZW50T2JzZXJ2YWJsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclVwZGF0ZUZuKG5vZGUsIGdldFZhbHVlQWNjZXNzb3IoYmluZGluZ0tleSksIGFsbEJpbmRpbmdzLCBiaW5kaW5nQ29udGV4dFsnJGRhdGEnXSwgYmluZGluZ0NvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogbm9kZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXgubWVzc2FnZSA9IFwiVW5hYmxlIHRvIHByb2Nlc3MgYmluZGluZyBcXFwiXCIgKyBiaW5kaW5nS2V5ICsgXCI6IFwiICsgYmluZGluZ3NbYmluZGluZ0tleV0gKyBcIlxcXCJcXG5NZXNzYWdlOiBcIiArIGV4Lm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdzaG91bGRCaW5kRGVzY2VuZGFudHMnOiBiaW5kaW5nSGFuZGxlclRoYXRDb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncyA9PT0gdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBzdG9yZWRCaW5kaW5nQ29udGV4dERvbURhdGFLZXkgPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKTtcbiAgICBrby5zdG9yZWRCaW5kaW5nQ29udGV4dEZvck5vZGUgPSBmdW5jdGlvbiAobm9kZSwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikge1xuICAgICAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQobm9kZSwgc3RvcmVkQmluZGluZ0NvbnRleHREb21EYXRhS2V5LCBiaW5kaW5nQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAoYmluZGluZ0NvbnRleHQuX3N1YnNjcmliYWJsZSlcbiAgICAgICAgICAgICAgICBiaW5kaW5nQ29udGV4dC5fc3Vic2NyaWJhYmxlLl9hZGROb2RlKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLmRvbURhdGEuZ2V0KG5vZGUsIHN0b3JlZEJpbmRpbmdDb250ZXh0RG9tRGF0YUtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRCaW5kaW5nQ29udGV4dCh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0ICYmICh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0IGluc3RhbmNlb2Yga28uYmluZGluZ0NvbnRleHQpXG4gICAgICAgICAgICA/IHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHRcbiAgICAgICAgICAgIDogbmV3IGtvLmJpbmRpbmdDb250ZXh0KHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQpO1xuICAgIH1cblxuICAgIGtvLmFwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZSA9IGZ1bmN0aW9uIChub2RlLCBiaW5kaW5ncywgdmlld01vZGVsT3JCaW5kaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgLy8gSWYgaXQncyBhbiBlbGVtZW50LCB3b3JrYXJvdW5kIElFIDw9IDggSFRNTCBwYXJzaW5nIHdlaXJkbmVzc1xuICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLm5vcm1hbGlzZVZpcnR1YWxFbGVtZW50RG9tU3RydWN0dXJlKG5vZGUpO1xuICAgICAgICByZXR1cm4gYXBwbHlCaW5kaW5nc1RvTm9kZUludGVybmFsKG5vZGUsIGJpbmRpbmdzLCBnZXRCaW5kaW5nQ29udGV4dCh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0KSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIGtvLmFwcGx5QmluZGluZ3NUb05vZGUgPSBmdW5jdGlvbiAobm9kZSwgYmluZGluZ3MsIHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSBnZXRCaW5kaW5nQ29udGV4dCh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGtvLmFwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZShub2RlLCBtYWtlQmluZGluZ0FjY2Vzc29ycyhiaW5kaW5ncywgY29udGV4dCwgbm9kZSksIGNvbnRleHQpO1xuICAgIH07XG5cbiAgICBrby5hcHBseUJpbmRpbmdzVG9EZXNjZW5kYW50cyA9IGZ1bmN0aW9uKHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQsIHJvb3ROb2RlKSB7XG4gICAgICAgIGlmIChyb290Tm9kZS5ub2RlVHlwZSA9PT0gMSB8fCByb290Tm9kZS5ub2RlVHlwZSA9PT0gOClcbiAgICAgICAgICAgIGFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzSW50ZXJuYWwoZ2V0QmluZGluZ0NvbnRleHQodmlld01vZGVsT3JCaW5kaW5nQ29udGV4dCksIHJvb3ROb2RlLCB0cnVlKTtcbiAgICB9O1xuXG4gICAga28uYXBwbHlCaW5kaW5ncyA9IGZ1bmN0aW9uICh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0LCByb290Tm9kZSkge1xuICAgICAgICAvLyBJZiBqUXVlcnkgaXMgbG9hZGVkIGFmdGVyIEtub2Nrb3V0LCB3ZSB3b24ndCBpbml0aWFsbHkgaGF2ZSBhY2Nlc3MgdG8gaXQuIFNvIHNhdmUgaXQgaGVyZS5cbiAgICAgICAgaWYgKCFqUXVlcnlJbnN0YW5jZSAmJiB3aW5kb3dbJ2pRdWVyeSddKSB7XG4gICAgICAgICAgICBqUXVlcnlJbnN0YW5jZSA9IHdpbmRvd1snalF1ZXJ5J107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm9vdE5vZGUgJiYgKHJvb3ROb2RlLm5vZGVUeXBlICE9PSAxKSAmJiAocm9vdE5vZGUubm9kZVR5cGUgIT09IDgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwia28uYXBwbHlCaW5kaW5nczogZmlyc3QgcGFyYW1ldGVyIHNob3VsZCBiZSB5b3VyIHZpZXcgbW9kZWw7IHNlY29uZCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgRE9NIG5vZGVcIik7XG4gICAgICAgIHJvb3ROb2RlID0gcm9vdE5vZGUgfHwgd2luZG93LmRvY3VtZW50LmJvZHk7IC8vIE1ha2UgXCJyb290Tm9kZVwiIHBhcmFtZXRlciBvcHRpb25hbFxuXG4gICAgICAgIGFwcGx5QmluZGluZ3NUb05vZGVBbmREZXNjZW5kYW50c0ludGVybmFsKGdldEJpbmRpbmdDb250ZXh0KHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQpLCByb290Tm9kZSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8vIFJldHJpZXZpbmcgYmluZGluZyBjb250ZXh0IGZyb20gYXJiaXRyYXJ5IG5vZGVzXG4gICAga28uY29udGV4dEZvciA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgLy8gV2UgY2FuIG9ubHkgZG8gc29tZXRoaW5nIG1lYW5pbmdmdWwgZm9yIGVsZW1lbnRzIGFuZCBjb21tZW50IG5vZGVzIChpbiBwYXJ0aWN1bGFyLCBub3QgdGV4dCBub2RlcywgYXMgSUUgY2FuJ3Qgc3RvcmUgZG9tZGF0YSBmb3IgdGhlbSlcbiAgICAgICAgc3dpdGNoIChub2RlLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBrby5zdG9yZWRCaW5kaW5nQ29udGV4dEZvck5vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQpIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHJldHVybiBrby5jb250ZXh0Rm9yKG5vZGUucGFyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIGtvLmRhdGFGb3IgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0ga28uY29udGV4dEZvcihub2RlKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQgPyBjb250ZXh0WyckZGF0YSddIDogdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICBrby5leHBvcnRTeW1ib2woJ2JpbmRpbmdIYW5kbGVycycsIGtvLmJpbmRpbmdIYW5kbGVycyk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdhcHBseUJpbmRpbmdzJywga28uYXBwbHlCaW5kaW5ncyk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdhcHBseUJpbmRpbmdzVG9EZXNjZW5kYW50cycsIGtvLmFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzKTtcbiAgICBrby5leHBvcnRTeW1ib2woJ2FwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZScsIGtvLmFwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZSk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdhcHBseUJpbmRpbmdzVG9Ob2RlJywga28uYXBwbHlCaW5kaW5nc1RvTm9kZSk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdjb250ZXh0Rm9yJywga28uY29udGV4dEZvcik7XG4gICAga28uZXhwb3J0U3ltYm9sKCdkYXRhRm9yJywga28uZGF0YUZvcik7XG59KSgpO1xuKGZ1bmN0aW9uKHVuZGVmaW5lZCkge1xuICAgIHZhciBsb2FkaW5nU3Vic2NyaWJhYmxlc0NhY2hlID0ge30sIC8vIFRyYWNrcyBjb21wb25lbnQgbG9hZHMgdGhhdCBhcmUgY3VycmVudGx5IGluIGZsaWdodFxuICAgICAgICBsb2FkZWREZWZpbml0aW9uc0NhY2hlID0ge307ICAgIC8vIFRyYWNrcyBjb21wb25lbnQgbG9hZHMgdGhhdCBoYXZlIGFscmVhZHkgY29tcGxldGVkXG5cbiAgICBrby5jb21wb25lbnRzID0ge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgY2FjaGVkRGVmaW5pdGlvbiA9IGdldE9iamVjdE93blByb3BlcnR5KGxvYWRlZERlZmluaXRpb25zQ2FjaGUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIGFscmVhZHkgbG9hZGVkIGFuZCBjYWNoZWQuIFJldXNlIHRoZSBzYW1lIGRlZmluaXRpb24gb2JqZWN0LlxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBmb3IgQVBJIGNvbnNpc3RlbmN5LCBldmVuIGNhY2hlIGhpdHMgY29tcGxldGUgYXN5bmNocm9ub3VzbHkgYnkgZGVmYXVsdC5cbiAgICAgICAgICAgICAgICAvLyBZb3UgY2FuIGJ5cGFzcyB0aGlzIGJ5IHB1dHRpbmcgc3luY2hyb25vdXM6dHJ1ZSBvbiB5b3VyIGNvbXBvbmVudCBjb25maWcuXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlZERlZmluaXRpb24uaXNTeW5jaHJvbm91c0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZShmdW5jdGlvbigpIHsgLy8gU2VlIGNvbW1lbnQgaW4gbG9hZGVyUmVnaXN0cnlCZWhhdmlvcnMuanMgZm9yIHJlYXNvbmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soY2FjaGVkRGVmaW5pdGlvbi5kZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgY2FsbGJhY2soY2FjaGVkRGVmaW5pdGlvbi5kZWZpbml0aW9uKTsgfSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBKb2luIHRoZSBsb2FkaW5nIHByb2Nlc3MgdGhhdCBpcyBhbHJlYWR5IHVuZGVyd2F5LCBvciBzdGFydCBhIG5ldyBvbmUuXG4gICAgICAgICAgICAgICAgbG9hZENvbXBvbmVudEFuZE5vdGlmeShjb21wb25lbnROYW1lLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2xlYXJDYWNoZWREZWZpbml0aW9uOiBmdW5jdGlvbihjb21wb25lbnROYW1lKSB7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGVkRGVmaW5pdGlvbnNDYWNoZVtjb21wb25lbnROYW1lXTtcbiAgICAgICAgfSxcblxuICAgICAgICBfZ2V0Rmlyc3RSZXN1bHRGcm9tTG9hZGVyczogZ2V0Rmlyc3RSZXN1bHRGcm9tTG9hZGVyc1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRPYmplY3RPd25Qcm9wZXJ0eShvYmosIHByb3BOYW1lKSB7XG4gICAgICAgIHJldHVybiBvYmouaGFzT3duUHJvcGVydHkocHJvcE5hbWUpID8gb2JqW3Byb3BOYW1lXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkQ29tcG9uZW50QW5kTm90aWZ5KGNvbXBvbmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBzdWJzY3JpYmFibGUgPSBnZXRPYmplY3RPd25Qcm9wZXJ0eShsb2FkaW5nU3Vic2NyaWJhYmxlc0NhY2hlLCBjb21wb25lbnROYW1lKSxcbiAgICAgICAgICAgIGNvbXBsZXRlZEFzeW5jO1xuICAgICAgICBpZiAoIXN1YnNjcmliYWJsZSkge1xuICAgICAgICAgICAgLy8gSXQncyBub3Qgc3RhcnRlZCBsb2FkaW5nIHlldC4gU3RhcnQgbG9hZGluZywgYW5kIHdoZW4gaXQncyBkb25lLCBtb3ZlIGl0IHRvIGxvYWRlZERlZmluaXRpb25zQ2FjaGUuXG4gICAgICAgICAgICBzdWJzY3JpYmFibGUgPSBsb2FkaW5nU3Vic2NyaWJhYmxlc0NhY2hlW2NvbXBvbmVudE5hbWVdID0gbmV3IGtvLnN1YnNjcmliYWJsZSgpO1xuICAgICAgICAgICAgc3Vic2NyaWJhYmxlLnN1YnNjcmliZShjYWxsYmFjayk7XG5cbiAgICAgICAgICAgIGJlZ2luTG9hZGluZ0NvbXBvbmVudChjb21wb25lbnROYW1lLCBmdW5jdGlvbihkZWZpbml0aW9uLCBjb25maWcpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNTeW5jaHJvbm91c0NvbXBvbmVudCA9ICEhKGNvbmZpZyAmJiBjb25maWdbJ3N5bmNocm9ub3VzJ10pO1xuICAgICAgICAgICAgICAgIGxvYWRlZERlZmluaXRpb25zQ2FjaGVbY29tcG9uZW50TmFtZV0gPSB7IGRlZmluaXRpb246IGRlZmluaXRpb24sIGlzU3luY2hyb25vdXNDb21wb25lbnQ6IGlzU3luY2hyb25vdXNDb21wb25lbnQgfTtcbiAgICAgICAgICAgICAgICBkZWxldGUgbG9hZGluZ1N1YnNjcmliYWJsZXNDYWNoZVtjb21wb25lbnROYW1lXTtcblxuICAgICAgICAgICAgICAgIC8vIEZvciBBUEkgY29uc2lzdGVuY3ksIGFsbCBsb2FkcyBjb21wbGV0ZSBhc3luY2hyb25vdXNseS4gSG93ZXZlciB3ZSB3YW50IHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgLy8gYWRkaW5nIGFuIGV4dHJhIHNldFRpbWVvdXQgaWYgaXQncyB1bm5lY2Vzc2FyeSAoaS5lLiwgdGhlIGNvbXBsZXRpb24gaXMgYWxyZWFkeVxuICAgICAgICAgICAgICAgIC8vIGFzeW5jKSBzaW5jZSBzZXRUaW1lb3V0KC4uLiwgMCkgc3RpbGwgdGFrZXMgYWJvdXQgMTZtcyBvciBtb3JlIG9uIG1vc3QgYnJvd3NlcnMuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBZb3UgY2FuIGJ5cGFzcyB0aGUgJ2Fsd2F5cyBzeW5jaHJvbm91cycgZmVhdHVyZSBieSBwdXR0aW5nIHRoZSBzeW5jaHJvbm91czp0cnVlXG4gICAgICAgICAgICAgICAgLy8gZmxhZyBvbiB5b3VyIGNvbXBvbmVudCBjb25maWd1cmF0aW9uIHdoZW4geW91IHJlZ2lzdGVyIGl0LlxuICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWRBc3luYyB8fCBpc1N5bmNocm9ub3VzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBub3RpZnlTdWJzY3JpYmVycyBpZ25vcmVzIGFueSBkZXBlbmRlbmNpZXMgcmVhZCB3aXRoaW4gdGhlIGNhbGxiYWNrLlxuICAgICAgICAgICAgICAgICAgICAvLyBTZWUgY29tbWVudCBpbiBsb2FkZXJSZWdpc3RyeUJlaGF2aW9ycy5qcyBmb3IgcmVhc29uaW5nXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliYWJsZVsnbm90aWZ5U3Vic2NyaWJlcnMnXShkZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJhYmxlWydub3RpZnlTdWJzY3JpYmVycyddKGRlZmluaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbXBsZXRlZEFzeW5jID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YnNjcmliYWJsZS5zdWJzY3JpYmUoY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYmVnaW5Mb2FkaW5nQ29tcG9uZW50KGNvbXBvbmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGdldEZpcnN0UmVzdWx0RnJvbUxvYWRlcnMoJ2dldENvbmZpZycsIFtjb21wb25lbnROYW1lXSwgZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIGNvbmZpZywgc28gbm93IGxvYWQgaXRzIGRlZmluaXRpb25cbiAgICAgICAgICAgICAgICBnZXRGaXJzdFJlc3VsdEZyb21Mb2FkZXJzKCdsb2FkQ29tcG9uZW50JywgW2NvbXBvbmVudE5hbWUsIGNvbmZpZ10sIGZ1bmN0aW9uKGRlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGVmaW5pdGlvbiwgY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBoYXMgbm8gY29uZmlnIC0gaXQncyB1bmtub3duIHRvIGFsbCB0aGUgbG9hZGVycy5cbiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYW4gZXJyb3IgKGUuZy4sIGEgbW9kdWxlIGxvYWRpbmcgZXJyb3IpIC0gdGhhdCB3b3VsZCBhYm9ydCB0aGVcbiAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGFuZCB0aGlzIGNhbGxiYWNrIHdvdWxkIG5vdCBydW4uIEZvciB0aGlzIGNhbGxiYWNrIHRvIHJ1biwgYWxsIGxvYWRlcnMgbXVzdFxuICAgICAgICAgICAgICAgIC8vIGhhdmUgY29uZmlybWVkIHRoZXkgZG9uJ3Qga25vdyBhYm91dCB0aGlzIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Rmlyc3RSZXN1bHRGcm9tTG9hZGVycyhtZXRob2ROYW1lLCBhcmdzRXhjZXB0Q2FsbGJhY2ssIGNhbGxiYWNrLCBjYW5kaWRhdGVMb2FkZXJzKSB7XG4gICAgICAgIC8vIE9uIHRoZSBmaXJzdCBjYWxsIGluIHRoZSBzdGFjaywgc3RhcnQgd2l0aCB0aGUgZnVsbCBzZXQgb2YgbG9hZGVyc1xuICAgICAgICBpZiAoIWNhbmRpZGF0ZUxvYWRlcnMpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZUxvYWRlcnMgPSBrby5jb21wb25lbnRzWydsb2FkZXJzJ10uc2xpY2UoMCk7IC8vIFVzZSBhIGNvcHksIGJlY2F1c2Ugd2UnbGwgYmUgbXV0YXRpbmcgdGhpcyBhcnJheVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IHRoZSBuZXh0IGNhbmRpZGF0ZVxuICAgICAgICB2YXIgY3VycmVudENhbmRpZGF0ZUxvYWRlciA9IGNhbmRpZGF0ZUxvYWRlcnMuc2hpZnQoKTtcbiAgICAgICAgaWYgKGN1cnJlbnRDYW5kaWRhdGVMb2FkZXIpIHtcbiAgICAgICAgICAgIHZhciBtZXRob2RJbnN0YW5jZSA9IGN1cnJlbnRDYW5kaWRhdGVMb2FkZXJbbWV0aG9kTmFtZV07XG4gICAgICAgICAgICBpZiAobWV0aG9kSW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgd2FzQWJvcnRlZCA9IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbm91c1JldHVyblZhbHVlID0gbWV0aG9kSW5zdGFuY2UuYXBwbHkoY3VycmVudENhbmRpZGF0ZUxvYWRlciwgYXJnc0V4Y2VwdENhbGxiYWNrLmNvbmNhdChmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YXNBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuZGlkYXRlIHJldHVybmVkIGEgdmFsdWUuIFVzZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdGhlIG5leHQgY2FuZGlkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rmlyc3RSZXN1bHRGcm9tTG9hZGVycyhtZXRob2ROYW1lLCBhcmdzRXhjZXB0Q2FsbGJhY2ssIGNhbGxiYWNrLCBjYW5kaWRhdGVMb2FkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5LCBsb2FkZXJzIG1heSBub3QgcmV0dXJuIGFueXRoaW5nIHN5bmNocm9ub3VzbHkuIFRoaXMgbGVhdmVzIG9wZW4gdGhlIHBvc3NpYmlsaXR5XG4gICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSdsbCBleHRlbmQgdGhlIEFQSSB0byBzdXBwb3J0IHN5bmNocm9ub3VzIHJldHVybiB2YWx1ZXMgaW4gdGhlIGZ1dHVyZS4gSXQgd29uJ3QgYmVcbiAgICAgICAgICAgICAgICAvLyBhIGJyZWFraW5nIGNoYW5nZSwgYmVjYXVzZSBjdXJyZW50bHkgbm8gbG9hZGVyIGlzIGFsbG93ZWQgdG8gcmV0dXJuIGFueXRoaW5nIGV4Y2VwdCB1bmRlZmluZWQuXG4gICAgICAgICAgICAgICAgaWYgKHN5bmNocm9ub3VzUmV0dXJuVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNZXRob2QgdG8gc3VwcHJlc3MgZXhjZXB0aW9ucyB3aWxsIHJlbWFpbiB1bmRvY3VtZW50ZWQuIFRoaXMgaXMgb25seSB0byBrZWVwXG4gICAgICAgICAgICAgICAgICAgIC8vIEtPJ3Mgc3BlY3MgcnVubmluZyB0aWRpbHksIHNpbmNlIHdlIGNhbiBvYnNlcnZlIHRoZSBsb2FkaW5nIGdvdCBhYm9ydGVkIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgLy8gaGF2aW5nIGV4Y2VwdGlvbnMgY2x1dHRlcmluZyB1cCB0aGUgY29uc29sZSB0b28uXG4gICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudENhbmRpZGF0ZUxvYWRlclsnc3VwcHJlc3NMb2FkZXJFeGNlcHRpb25zJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcG9uZW50IGxvYWRlcnMgbXVzdCBzdXBwbHkgdmFsdWVzIGJ5IGludm9raW5nIHRoZSBjYWxsYmFjaywgbm90IGJ5IHJldHVybmluZyB2YWx1ZXMgc3luY2hyb25vdXNseS4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBjYW5kaWRhdGUgZG9lc24ndCBoYXZlIHRoZSByZWxldmFudCBoYW5kbGVyLiBTeW5jaHJvbm91c2x5IG1vdmUgb24gdG8gdGhlIG5leHQgb25lLlxuICAgICAgICAgICAgICAgIGdldEZpcnN0UmVzdWx0RnJvbUxvYWRlcnMobWV0aG9kTmFtZSwgYXJnc0V4Y2VwdENhbGxiYWNrLCBjYWxsYmFjaywgY2FuZGlkYXRlTG9hZGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBjYW5kaWRhdGVzIHJldHVybmVkIGEgdmFsdWVcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVmZXJlbmNlIHRoZSBsb2FkZXJzIHZpYSBzdHJpbmcgbmFtZSBzbyBpdCdzIHBvc3NpYmxlIGZvciBkZXZlbG9wZXJzXG4gICAgLy8gdG8gcmVwbGFjZSB0aGUgd2hvbGUgYXJyYXkgYnkgYXNzaWduaW5nIHRvIGtvLmNvbXBvbmVudHMubG9hZGVyc1xuICAgIGtvLmNvbXBvbmVudHNbJ2xvYWRlcnMnXSA9IFtdO1xuXG4gICAga28uZXhwb3J0U3ltYm9sKCdjb21wb25lbnRzJywga28uY29tcG9uZW50cyk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdjb21wb25lbnRzLmdldCcsIGtvLmNvbXBvbmVudHMuZ2V0KTtcbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMuY2xlYXJDYWNoZWREZWZpbml0aW9uJywga28uY29tcG9uZW50cy5jbGVhckNhY2hlZERlZmluaXRpb24pO1xufSkoKTtcbihmdW5jdGlvbih1bmRlZmluZWQpIHtcblxuICAgIC8vIFRoZSBkZWZhdWx0IGxvYWRlciBpcyByZXNwb25zaWJsZSBmb3IgdHdvIHRoaW5nczpcbiAgICAvLyAxLiBNYWludGFpbmluZyB0aGUgZGVmYXVsdCBpbi1tZW1vcnkgcmVnaXN0cnkgb2YgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gb2JqZWN0c1xuICAgIC8vICAgIChpLmUuLCB0aGUgdGhpbmcgeW91J3JlIHdyaXRpbmcgdG8gd2hlbiB5b3UgY2FsbCBrby5jb21wb25lbnRzLnJlZ2lzdGVyKHNvbWVOYW1lLCAuLi4pKVxuICAgIC8vIDIuIEFuc3dlcmluZyByZXF1ZXN0cyBmb3IgY29tcG9uZW50cyBieSBmZXRjaGluZyBjb25maWd1cmF0aW9uIG9iamVjdHNcbiAgICAvLyAgICBmcm9tIHRoYXQgZGVmYXVsdCBpbi1tZW1vcnkgcmVnaXN0cnkgYW5kIHJlc29sdmluZyB0aGVtIGludG8gc3RhbmRhcmRcbiAgICAvLyAgICBjb21wb25lbnQgZGVmaW5pdGlvbiBvYmplY3RzIChvZiB0aGUgZm9ybSB7IGNyZWF0ZVZpZXdNb2RlbDogLi4uLCB0ZW1wbGF0ZTogLi4uIH0pXG4gICAgLy8gQ3VzdG9tIGxvYWRlcnMgbWF5IG92ZXJyaWRlIGVpdGhlciBvZiB0aGVzZSBmYWNpbGl0aWVzLCBpLmUuLFxuICAgIC8vIDEuIFRvIHN1cHBseSBjb25maWd1cmF0aW9uIG9iamVjdHMgZnJvbSBzb21lIG90aGVyIHNvdXJjZSAoZS5nLiwgY29udmVudGlvbnMpXG4gICAgLy8gMi4gT3IsIHRvIHJlc29sdmUgY29uZmlndXJhdGlvbiBvYmplY3RzIGJ5IGxvYWRpbmcgdmlld21vZGVscy90ZW1wbGF0ZXMgdmlhIGFyYml0cmFyeSBsb2dpYy5cblxuICAgIHZhciBkZWZhdWx0Q29uZmlnUmVnaXN0cnkgPSB7fTtcblxuICAgIGtvLmNvbXBvbmVudHMucmVnaXN0ZXIgPSBmdW5jdGlvbihjb21wb25lbnROYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25maWd1cmF0aW9uIGZvciAnICsgY29tcG9uZW50TmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa28uY29tcG9uZW50cy5pc1JlZ2lzdGVyZWQoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcG9uZW50ICcgKyBjb21wb25lbnROYW1lICsgJyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHRDb25maWdSZWdpc3RyeVtjb21wb25lbnROYW1lXSA9IGNvbmZpZztcbiAgICB9XG5cbiAgICBrby5jb21wb25lbnRzLmlzUmVnaXN0ZXJlZCA9IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWUgaW4gZGVmYXVsdENvbmZpZ1JlZ2lzdHJ5O1xuICAgIH1cblxuICAgIGtvLmNvbXBvbmVudHMudW5yZWdpc3RlciA9IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgZGVsZXRlIGRlZmF1bHRDb25maWdSZWdpc3RyeVtjb21wb25lbnROYW1lXTtcbiAgICAgICAga28uY29tcG9uZW50cy5jbGVhckNhY2hlZERlZmluaXRpb24oY29tcG9uZW50TmFtZSk7XG4gICAgfVxuXG4gICAga28uY29tcG9uZW50cy5kZWZhdWx0TG9hZGVyID0ge1xuICAgICAgICAnZ2V0Q29uZmlnJzogZnVuY3Rpb24oY29tcG9uZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBkZWZhdWx0Q29uZmlnUmVnaXN0cnkuaGFzT3duUHJvcGVydHkoY29tcG9uZW50TmFtZSlcbiAgICAgICAgICAgICAgICA/IGRlZmF1bHRDb25maWdSZWdpc3RyeVtjb21wb25lbnROYW1lXVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ2xvYWRDb21wb25lbnQnOiBmdW5jdGlvbihjb21wb25lbnROYW1lLCBjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG1ha2VFcnJvckNhbGxiYWNrKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgcG9zc2libHlHZXRDb25maWdGcm9tQW1kKGVycm9yQ2FsbGJhY2ssIGNvbmZpZywgZnVuY3Rpb24obG9hZGVkQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZUNvbmZpZyhjb21wb25lbnROYW1lLCBlcnJvckNhbGxiYWNrLCBsb2FkZWRDb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgICdsb2FkVGVtcGxhdGUnOiBmdW5jdGlvbihjb21wb25lbnROYW1lLCB0ZW1wbGF0ZUNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlc29sdmVUZW1wbGF0ZShtYWtlRXJyb3JDYWxsYmFjayhjb21wb25lbnROYW1lKSwgdGVtcGxhdGVDb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnbG9hZFZpZXdNb2RlbCc6IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUsIHZpZXdNb2RlbENvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlc29sdmVWaWV3TW9kZWwobWFrZUVycm9yQ2FsbGJhY2soY29tcG9uZW50TmFtZSksIHZpZXdNb2RlbENvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBjcmVhdGVWaWV3TW9kZWxLZXkgPSAnY3JlYXRlVmlld01vZGVsJztcblxuICAgIC8vIFRha2VzIGEgY29uZmlnIG9iamVjdCBvZiB0aGUgZm9ybSB7IHRlbXBsYXRlOiAuLi4sIHZpZXdNb2RlbDogLi4uIH0sIGFuZCBhc3luY2hyb25vdXNseSBjb252ZXJ0IGl0XG4gICAgLy8gaW50byB0aGUgc3RhbmRhcmQgY29tcG9uZW50IGRlZmluaXRpb24gZm9ybWF0OlxuICAgIC8vICAgIHsgdGVtcGxhdGU6IDxBcnJheU9mRG9tTm9kZXM+LCBjcmVhdGVWaWV3TW9kZWw6IGZ1bmN0aW9uKHBhcmFtcywgY29tcG9uZW50SW5mbykgeyAuLi4gfSB9LlxuICAgIC8vIFNpbmNlIGJvdGggdGVtcGxhdGUgYW5kIHZpZXdNb2RlbCBtYXkgbmVlZCB0byBiZSByZXNvbHZlZCBhc3luY2hyb25vdXNseSwgYm90aCB0YXNrcyBhcmUgcGVyZm9ybWVkXG4gICAgLy8gaW4gcGFyYWxsZWwsIGFuZCB0aGUgcmVzdWx0cyBqb2luZWQgd2hlbiBib3RoIGFyZSByZWFkeS4gV2UgZG9uJ3QgZGVwZW5kIG9uIGFueSBwcm9taXNlcyBpbmZyYXN0cnVjdHVyZSxcbiAgICAvLyBzbyB0aGlzIGlzIGltcGxlbWVudGVkIG1hbnVhbGx5IGJlbG93LlxuICAgIGZ1bmN0aW9uIHJlc29sdmVDb25maWcoY29tcG9uZW50TmFtZSwgZXJyb3JDYWxsYmFjaywgY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcmVzdWx0ID0ge30sXG4gICAgICAgICAgICBtYWtlQ2FsbEJhY2tXaGVuWmVybyA9IDIsXG4gICAgICAgICAgICB0cnlJc3N1ZUNhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKC0tbWFrZUNhbGxCYWNrV2hlblplcm8gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGVDb25maWcgPSBjb25maWdbJ3RlbXBsYXRlJ10sXG4gICAgICAgICAgICB2aWV3TW9kZWxDb25maWcgPSBjb25maWdbJ3ZpZXdNb2RlbCddO1xuXG4gICAgICAgIGlmICh0ZW1wbGF0ZUNvbmZpZykge1xuICAgICAgICAgICAgcG9zc2libHlHZXRDb25maWdGcm9tQW1kKGVycm9yQ2FsbGJhY2ssIHRlbXBsYXRlQ29uZmlnLCBmdW5jdGlvbihsb2FkZWRDb25maWcpIHtcbiAgICAgICAgICAgICAgICBrby5jb21wb25lbnRzLl9nZXRGaXJzdFJlc3VsdEZyb21Mb2FkZXJzKCdsb2FkVGVtcGxhdGUnLCBbY29tcG9uZW50TmFtZSwgbG9hZGVkQ29uZmlnXSwgZnVuY3Rpb24ocmVzb2x2ZWRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3RlbXBsYXRlJ10gPSByZXNvbHZlZFRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICB0cnlJc3N1ZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeUlzc3VlQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2aWV3TW9kZWxDb25maWcpIHtcbiAgICAgICAgICAgIHBvc3NpYmx5R2V0Q29uZmlnRnJvbUFtZChlcnJvckNhbGxiYWNrLCB2aWV3TW9kZWxDb25maWcsIGZ1bmN0aW9uKGxvYWRlZENvbmZpZykge1xuICAgICAgICAgICAgICAgIGtvLmNvbXBvbmVudHMuX2dldEZpcnN0UmVzdWx0RnJvbUxvYWRlcnMoJ2xvYWRWaWV3TW9kZWwnLCBbY29tcG9uZW50TmFtZSwgbG9hZGVkQ29uZmlnXSwgZnVuY3Rpb24ocmVzb2x2ZWRWaWV3TW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2NyZWF0ZVZpZXdNb2RlbEtleV0gPSByZXNvbHZlZFZpZXdNb2RlbDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5SXNzdWVDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnlJc3N1ZUNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlVGVtcGxhdGUoZXJyb3JDYWxsYmFjaywgdGVtcGxhdGVDb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGVDb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvLyBNYXJrdXAgLSBwYXJzZSBpdFxuICAgICAgICAgICAgY2FsbGJhY2soa28udXRpbHMucGFyc2VIdG1sRnJhZ21lbnQodGVtcGxhdGVDb25maWcpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZUNvbmZpZyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAvLyBBc3N1bWUgYWxyZWFkeSBhbiBhcnJheSBvZiBET00gbm9kZXMgLSBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkXG4gICAgICAgICAgICBjYWxsYmFjayh0ZW1wbGF0ZUNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEb2N1bWVudEZyYWdtZW50KHRlbXBsYXRlQ29uZmlnKSkge1xuICAgICAgICAgICAgLy8gRG9jdW1lbnQgZnJhZ21lbnQgLSB1c2UgaXRzIGNoaWxkIG5vZGVzXG4gICAgICAgICAgICBjYWxsYmFjayhrby51dGlscy5tYWtlQXJyYXkodGVtcGxhdGVDb25maWcuY2hpbGROb2RlcykpO1xuICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlQ29uZmlnWydlbGVtZW50J10pIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGVtcGxhdGVDb25maWdbJ2VsZW1lbnQnXTtcbiAgICAgICAgICAgIGlmIChpc0RvbUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGluc3RhbmNlIC0gY29weSBpdHMgY2hpbGQgbm9kZXNcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhjbG9uZU5vZGVzRnJvbVRlbXBsYXRlU291cmNlRWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgSUQgLSBmaW5kIGl0LCB0aGVuIGNvcHkgaXRzIGNoaWxkIG5vZGVzXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1JbnN0YW5jZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtSW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soY2xvbmVOb2Rlc0Zyb21UZW1wbGF0ZVNvdXJjZUVsZW1lbnQoZWxlbUluc3RhbmNlKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjaygnQ2Fubm90IGZpbmQgZWxlbWVudCB3aXRoIElEICcgKyBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soJ1Vua25vd24gZWxlbWVudCB0eXBlOiAnICsgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrKCdVbmtub3duIHRlbXBsYXRlIHZhbHVlOiAnICsgdGVtcGxhdGVDb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVZpZXdNb2RlbChlcnJvckNhbGxiYWNrLCB2aWV3TW9kZWxDb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygdmlld01vZGVsQ29uZmlnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciAtIGNvbnZlcnQgdG8gc3RhbmRhcmQgZmFjdG9yeSBmdW5jdGlvbiBmb3JtYXRcbiAgICAgICAgICAgIC8vIEJ5IGRlc2lnbiwgdGhpcyBkb2VzICpub3QqIHN1cHBseSBjb21wb25lbnRJbmZvIHRvIHRoZSBjb25zdHJ1Y3RvciwgYXMgdGhlIGludGVudCBpcyB0aGF0XG4gICAgICAgICAgICAvLyBjb21wb25lbnRJbmZvIGNvbnRhaW5zIG5vbi12aWV3bW9kZWwgZGF0YSAoZS5nLiwgdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQpIHRoYXQgc2hvdWxkIG9ubHlcbiAgICAgICAgICAgIC8vIGJlIHVzZWQgaW4gZmFjdG9yeSBmdW5jdGlvbnMsIG5vdCB2aWV3bW9kZWwgY29uc3RydWN0b3JzLlxuICAgICAgICAgICAgY2FsbGJhY2soZnVuY3Rpb24gKHBhcmFtcyAvKiwgY29tcG9uZW50SW5mbyAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdmlld01vZGVsQ29uZmlnKHBhcmFtcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygdmlld01vZGVsQ29uZmlnW2NyZWF0ZVZpZXdNb2RlbEtleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgYSBmYWN0b3J5IGZ1bmN0aW9uIC0gdXNlIGl0IGFzLWlzXG4gICAgICAgICAgICBjYWxsYmFjayh2aWV3TW9kZWxDb25maWdbY3JlYXRlVmlld01vZGVsS2V5XSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ2luc3RhbmNlJyBpbiB2aWV3TW9kZWxDb25maWcpIHtcbiAgICAgICAgICAgIC8vIEZpeGVkIG9iamVjdCBpbnN0YW5jZSAtIHByb21vdGUgdG8gY3JlYXRlVmlld01vZGVsIGZvcm1hdCBmb3IgQVBJIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICB2YXIgZml4ZWRJbnN0YW5jZSA9IHZpZXdNb2RlbENvbmZpZ1snaW5zdGFuY2UnXTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGZ1bmN0aW9uIChwYXJhbXMsIGNvbXBvbmVudEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZml4ZWRJbnN0YW5jZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCd2aWV3TW9kZWwnIGluIHZpZXdNb2RlbENvbmZpZykge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZWQgQU1EIG1vZHVsZSB3aG9zZSB2YWx1ZSBpcyBvZiB0aGUgZm9ybSB7IHZpZXdNb2RlbDogLi4uIH1cbiAgICAgICAgICAgIHJlc29sdmVWaWV3TW9kZWwoZXJyb3JDYWxsYmFjaywgdmlld01vZGVsQ29uZmlnWyd2aWV3TW9kZWwnXSwgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JDYWxsYmFjaygnVW5rbm93biB2aWV3TW9kZWwgdmFsdWU6ICcgKyB2aWV3TW9kZWxDb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmVOb2Rlc0Zyb21UZW1wbGF0ZVNvdXJjZUVsZW1lbnQoZWxlbUluc3RhbmNlKSB7XG4gICAgICAgIHN3aXRjaCAoa28udXRpbHMudGFnTmFtZUxvd2VyKGVsZW1JbnN0YW5jZSkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NjcmlwdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLnBhcnNlSHRtbEZyYWdtZW50KGVsZW1JbnN0YW5jZS50ZXh0KTtcbiAgICAgICAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMucGFyc2VIdG1sRnJhZ21lbnQoZWxlbUluc3RhbmNlLnZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgJ3RlbXBsYXRlJzpcbiAgICAgICAgICAgICAgICAvLyBGb3IgYnJvd3NlcnMgd2l0aCBwcm9wZXIgPHRlbXBsYXRlPiBlbGVtZW50IHN1cHBvcnQgKGkuZS4sIHdoZXJlIHRoZSAuY29udGVudCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIC8vIGdpdmVzIGEgZG9jdW1lbnQgZnJhZ21lbnQpLCB1c2UgdGhhdCBkb2N1bWVudCBmcmFnbWVudC5cbiAgICAgICAgICAgICAgICBpZiAoaXNEb2N1bWVudEZyYWdtZW50KGVsZW1JbnN0YW5jZS5jb250ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMuY2xvbmVOb2RlcyhlbGVtSW5zdGFuY2UuY29udGVudC5jaGlsZE5vZGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWd1bGFyIGVsZW1lbnRzIHN1Y2ggYXMgPGRpdj4sIGFuZCA8dGVtcGxhdGU+IGVsZW1lbnRzIG9uIG9sZCBicm93c2VycyB0aGF0IGRvbid0IHJlYWxseVxuICAgICAgICAvLyB1bmRlcnN0YW5kIDx0ZW1wbGF0ZT4gYW5kIGp1c3QgdHJlYXQgaXQgYXMgYSByZWd1bGFyIGNvbnRhaW5lclxuICAgICAgICByZXR1cm4ga28udXRpbHMuY2xvbmVOb2RlcyhlbGVtSW5zdGFuY2UuY2hpbGROb2Rlcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEb21FbGVtZW50KG9iaikge1xuICAgICAgICBpZiAod2luZG93WydIVE1MRWxlbWVudCddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai50YWdOYW1lICYmIG9iai5ub2RlVHlwZSA9PT0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRG9jdW1lbnRGcmFnbWVudChvYmopIHtcbiAgICAgICAgaWYgKHdpbmRvd1snRG9jdW1lbnRGcmFnbWVudCddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLm5vZGVUeXBlID09PSAxMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvc3NpYmx5R2V0Q29uZmlnRnJvbUFtZChlcnJvckNhbGxiYWNrLCBjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnWydyZXF1aXJlJ10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvLyBUaGUgY29uZmlnIGlzIHRoZSB2YWx1ZSBvZiBhbiBBTUQgbW9kdWxlXG4gICAgICAgICAgICBpZiAoYW1kUmVxdWlyZSB8fCB3aW5kb3dbJ3JlcXVpcmUnXSkge1xuICAgICAgICAgICAgICAgIChhbWRSZXF1aXJlIHx8IHdpbmRvd1sncmVxdWlyZSddKShbY29uZmlnWydyZXF1aXJlJ11dLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soJ1VzZXMgcmVxdWlyZSwgYnV0IG5vIEFNRCBsb2FkZXIgaXMgcHJlc2VudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VFcnJvckNhbGxiYWNrKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudCBcXCcnICsgY29tcG9uZW50TmFtZSArICdcXCc6ICcgKyBtZXNzYWdlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMucmVnaXN0ZXInLCBrby5jb21wb25lbnRzLnJlZ2lzdGVyKTtcbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMuaXNSZWdpc3RlcmVkJywga28uY29tcG9uZW50cy5pc1JlZ2lzdGVyZWQpO1xuICAgIGtvLmV4cG9ydFN5bWJvbCgnY29tcG9uZW50cy51bnJlZ2lzdGVyJywga28uY29tcG9uZW50cy51bnJlZ2lzdGVyKTtcblxuICAgIC8vIEV4cG9zZSB0aGUgZGVmYXVsdCBsb2FkZXIgc28gdGhhdCBkZXZlbG9wZXJzIGNhbiBkaXJlY3RseSBhc2sgaXQgZm9yIGNvbmZpZ3VyYXRpb25cbiAgICAvLyBvciB0byByZXNvbHZlIGNvbmZpZ3VyYXRpb25cbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMuZGVmYXVsdExvYWRlcicsIGtvLmNvbXBvbmVudHMuZGVmYXVsdExvYWRlcik7XG5cbiAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZGVmYXVsdCBsb2FkZXIgaXMgdGhlIG9ubHkgcmVnaXN0ZXJlZCBjb21wb25lbnQgbG9hZGVyXG4gICAga28uY29tcG9uZW50c1snbG9hZGVycyddLnB1c2goa28uY29tcG9uZW50cy5kZWZhdWx0TG9hZGVyKTtcblxuICAgIC8vIFByaXZhdGVseSBleHBvc2UgdGhlIHVuZGVybHlpbmcgY29uZmlnIHJlZ2lzdHJ5IGZvciB1c2UgaW4gb2xkLUlFIHNoaW1cbiAgICBrby5jb21wb25lbnRzLl9hbGxSZWdpc3RlcmVkQ29tcG9uZW50cyA9IGRlZmF1bHRDb25maWdSZWdpc3RyeTtcbn0pKCk7XG4oZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuICAgIC8vIE92ZXJyaWRhYmxlIEFQSSBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggY29tcG9uZW50IG5hbWUgYXBwbGllcyB0byBhIGdpdmVuIG5vZGUuIEJ5IG92ZXJyaWRpbmcgdGhpcyxcbiAgICAvLyB5b3UgY2FuIGZvciBleGFtcGxlIG1hcCBzcGVjaWZpYyB0YWdOYW1lcyB0byBjb21wb25lbnRzIHRoYXQgYXJlIG5vdCBwcmVyZWdpc3RlcmVkLlxuICAgIGtvLmNvbXBvbmVudHNbJ2dldENvbXBvbmVudE5hbWVGb3JOb2RlJ10gPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHZhciB0YWdOYW1lTG93ZXIgPSBrby51dGlscy50YWdOYW1lTG93ZXIobm9kZSk7XG4gICAgICAgIHJldHVybiBrby5jb21wb25lbnRzLmlzUmVnaXN0ZXJlZCh0YWdOYW1lTG93ZXIpICYmIHRhZ05hbWVMb3dlcjtcbiAgICB9O1xuXG4gICAga28uY29tcG9uZW50cy5hZGRCaW5kaW5nc0ZvckN1c3RvbUVsZW1lbnQgPSBmdW5jdGlvbihhbGxCaW5kaW5ncywgbm9kZSwgYmluZGluZ0NvbnRleHQsIHZhbHVlQWNjZXNzb3JzKSB7XG4gICAgICAgIC8vIERldGVybWluZSBpZiBpdCdzIHJlYWxseSBhIGN1c3RvbSBlbGVtZW50IG1hdGNoaW5nIGEgY29tcG9uZW50XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGtvLmNvbXBvbmVudHNbJ2dldENvbXBvbmVudE5hbWVGb3JOb2RlJ10obm9kZSk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50TmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIEl0IGRvZXMgcmVwcmVzZW50IGEgY29tcG9uZW50LCBzbyBhZGQgYSBjb21wb25lbnQgYmluZGluZyBmb3IgaXRcbiAgICAgICAgICAgICAgICBhbGxCaW5kaW5ncyA9IGFsbEJpbmRpbmdzIHx8IHt9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGFsbEJpbmRpbmdzWydjb21wb25lbnQnXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdm9pZCBzaWxlbnRseSBvdmVyd3JpdGluZyBzb21lIG90aGVyICdjb21wb25lbnQnIGJpbmRpbmcgdGhhdCBtYXkgYWxyZWFkeSBiZSBvbiB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgdGhlIFwiY29tcG9uZW50XCIgYmluZGluZyBvbiBhIGN1c3RvbSBlbGVtZW50IG1hdGNoaW5nIGEgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudEJpbmRpbmdWYWx1ZSA9IHsgJ25hbWUnOiBjb21wb25lbnROYW1lLCAncGFyYW1zJzogZ2V0Q29tcG9uZW50UGFyYW1zRnJvbUN1c3RvbUVsZW1lbnQobm9kZSwgYmluZGluZ0NvbnRleHQpIH07XG5cbiAgICAgICAgICAgICAgICBhbGxCaW5kaW5nc1snY29tcG9uZW50J10gPSB2YWx1ZUFjY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29tcG9uZW50QmluZGluZ1ZhbHVlOyB9XG4gICAgICAgICAgICAgICAgICAgIDogY29tcG9uZW50QmluZGluZ1ZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFsbEJpbmRpbmdzO1xuICAgIH1cblxuICAgIHZhciBuYXRpdmVCaW5kaW5nUHJvdmlkZXJJbnN0YW5jZSA9IG5ldyBrby5iaW5kaW5nUHJvdmlkZXIoKTtcblxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudFBhcmFtc0Zyb21DdXN0b21FbGVtZW50KGVsZW0sIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgIHZhciBwYXJhbXNBdHRyaWJ1dGUgPSBlbGVtLmdldEF0dHJpYnV0ZSgncGFyYW1zJyk7XG5cbiAgICAgICAgaWYgKHBhcmFtc0F0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IG5hdGl2ZUJpbmRpbmdQcm92aWRlckluc3RhbmNlWydwYXJzZUJpbmRpbmdzU3RyaW5nJ10ocGFyYW1zQXR0cmlidXRlLCBiaW5kaW5nQ29udGV4dCwgZWxlbSwgeyAndmFsdWVBY2Nlc3NvcnMnOiB0cnVlLCAnYmluZGluZ1BhcmFtcyc6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgcmF3UGFyYW1Db21wdXRlZFZhbHVlcyA9IGtvLnV0aWxzLm9iamVjdE1hcChwYXJhbXMsIGZ1bmN0aW9uKHBhcmFtVmFsdWUsIHBhcmFtTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28uY29tcHV0ZWQocGFyYW1WYWx1ZSwgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IGVsZW0gfSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ga28udXRpbHMub2JqZWN0TWFwKHJhd1BhcmFtQ29tcHV0ZWRWYWx1ZXMsIGZ1bmN0aW9uKHBhcmFtVmFsdWVDb21wdXRlZCwgcGFyYW1OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gcGFyYW1WYWx1ZUNvbXB1dGVkLnBlZWsoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9lcyB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlIHVud3JhcCBhbnkgb2JzZXJ2YWJsZXM/XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1WYWx1ZUNvbXB1dGVkLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGl0IGRvZXNuJ3QsIHNvIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgYW55IGNvbXB1dGVkIHdyYXBwZXIuIEp1c3QgcGFzcyB0aHJvdWdoIHRoZSBzdXBwbGllZCB2YWx1ZSBkaXJlY3RseS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4YW1wbGU6IFwic29tZVZhbDogZmlyc3ROYW1lLCBhZ2U6IDEyM1wiICh3aGV0aGVyIG9yIG5vdCBmaXJzdE5hbWUgaXMgYW4gb2JzZXJ2YWJsZS9jb21wdXRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gWWVzIGl0IGRvZXMuIFN1cHBseSBhIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgdW53cmFwcyBib3RoIHRoZSBvdXRlciAoYmluZGluZyBleHByZXNzaW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV2ZWwgb2Ygb2JzZXJ2YWJpbGl0eSwgYW5kIGFueSBpbm5lciAocmVzdWx0aW5nIG1vZGVsIHZhbHVlKSBsZXZlbCBvZiBvYnNlcnZhYmlsaXR5LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGUgY29tcG9uZW50IGRvZXNuJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBtdWx0aXBsZSB1bndyYXBwaW5nLiBJZiB0aGUgdmFsdWUgaXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGFibGUgb2JzZXJ2YWJsZSwgdGhlIGNvbXB1dGVkIHdpbGwgYWxzbyBiZSB3cml0YWJsZSBhbmQgcGFzcyB0aGUgdmFsdWUgb24gdG8gdGhlIG9ic2VydmFibGUuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28uY29tcHV0ZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWFkJzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHBhcmFtVmFsdWVDb21wdXRlZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3cml0ZSc6IGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZShwYXJhbVZhbHVlKSAmJiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlQ29tcHV0ZWQoKSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IGVsZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEdpdmUgYWNjZXNzIHRvIHRoZSByYXcgY29tcHV0ZWRzLCBhcyBsb25nIGFzIHRoYXQgd291bGRuJ3Qgb3ZlcndyaXRlIGFueSBjdXN0b20gcGFyYW0gYWxzbyBjYWxsZWQgJyRyYXcnXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGluIGNhc2UgdGhlIGRldmVsb3BlciB3YW50cyB0byByZWFjdCB0byBvdXRlciAoYmluZGluZykgb2JzZXJ2YWJpbGl0eSBzZXBhcmF0ZWx5IGZyb20gaW5uZXJcbiAgICAgICAgICAgIC8vIChtb2RlbCB2YWx1ZSkgb2JzZXJ2YWJpbGl0eSwgb3IgaW4gY2FzZSB0aGUgbW9kZWwgdmFsdWUgb2JzZXJ2YWJsZSBoYXMgc3Vib2JzZXJ2YWJsZXMuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5oYXNPd25Qcm9wZXJ0eSgnJHJhdycpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0WyckcmF3J10gPSByYXdQYXJhbUNvbXB1dGVkVmFsdWVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIGNvbnNpc3RlbmN5LCBhYnNlbmNlIG9mIGEgXCJwYXJhbXNcIiBhdHRyaWJ1dGUgaXMgdHJlYXRlZCB0aGUgc2FtZSBhcyB0aGUgcHJlc2VuY2Ugb2ZcbiAgICAgICAgICAgIC8vIGFueSBlbXB0eSBvbmUuIE90aGVyd2lzZSBjb21wb25lbnQgdmlld21vZGVscyBuZWVkIHNwZWNpYWwgY29kZSB0byBjaGVjayB3aGV0aGVyIG9yIG5vdFxuICAgICAgICAgICAgLy8gJ3BhcmFtcycgb3IgJ3BhcmFtcy4kcmF3JyBpcyBudWxsL3VuZGVmaW5lZCBiZWZvcmUgcmVhZGluZyBzdWJwcm9wZXJ0aWVzLCB3aGljaCBpcyBhbm5veWluZy5cbiAgICAgICAgICAgIHJldHVybiB7ICckcmF3Jzoge30gfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29tcGF0aWJpbGl0eSBjb2RlIGZvciBvbGRlciAocHJlLUhUTUw1KSBJRSBicm93c2Vyc1xuXG4gICAgaWYgKGtvLnV0aWxzLmllVmVyc2lvbiA8IDkpIHtcbiAgICAgICAgLy8gV2hlbmV2ZXIgeW91IHByZXJlZ2lzdGVyIGEgY29tcG9uZW50LCBlbmFibGUgaXQgYXMgYSBjdXN0b20gZWxlbWVudCBpbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICAgICAgICBrby5jb21wb25lbnRzWydyZWdpc3RlciddID0gKGZ1bmN0aW9uKG9yaWdpbmFsRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjb21wb25lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjb21wb25lbnROYW1lKTsgLy8gQWxsb3dzIElFPDkgdG8gcGFyc2UgbWFya3VwIGNvbnRhaW5pbmcgdGhlIGN1c3RvbSBlbGVtZW50XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoa28uY29tcG9uZW50c1sncmVnaXN0ZXInXSk7XG5cbiAgICAgICAgLy8gV2hlbmV2ZXIgeW91IGNyZWF0ZSBhIGRvY3VtZW50IGZyYWdtZW50LCBlbmFibGUgYWxsIHByZXJlZ2lzdGVyZWQgY29tcG9uZW50IG5hbWVzIGFzIGN1c3RvbSBlbGVtZW50c1xuICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBtYWtlIGlubmVyU2hpdi9qUXVlcnkgSFRNTCBwYXJzaW5nIGNvcnJlY3RseSBoYW5kbGUgdGhlIGN1c3RvbSBlbGVtZW50c1xuICAgICAgICBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50ID0gKGZ1bmN0aW9uKG9yaWdpbmFsRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3RG9jRnJhZyA9IG9yaWdpbmFsRnVuY3Rpb24oKSxcbiAgICAgICAgICAgICAgICAgICAgYWxsQ29tcG9uZW50cyA9IGtvLmNvbXBvbmVudHMuX2FsbFJlZ2lzdGVyZWRDb21wb25lbnRzO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGNvbXBvbmVudE5hbWUgaW4gYWxsQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsQ29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eShjb21wb25lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RG9jRnJhZy5jcmVhdGVFbGVtZW50KGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXdEb2NGcmFnO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCk7XG4gICAgfVxufSkoKTsoZnVuY3Rpb24odW5kZWZpbmVkKSB7XG5cbiAgICB2YXIgY29tcG9uZW50TG9hZGluZ09wZXJhdGlvblVuaXF1ZUlkID0gMDtcblxuICAgIGtvLmJpbmRpbmdIYW5kbGVyc1snY29tcG9uZW50J10gPSB7XG4gICAgICAgICdpbml0JzogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgaWdub3JlZDEsIGlnbm9yZWQyLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRWaWV3TW9kZWwsXG4gICAgICAgICAgICAgICAgY3VycmVudExvYWRpbmdPcGVyYXRpb25JZCxcbiAgICAgICAgICAgICAgICBkaXNwb3NlQXNzb2NpYXRlZENvbXBvbmVudFZpZXdNb2RlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWaWV3TW9kZWxEaXNwb3NlID0gY3VycmVudFZpZXdNb2RlbCAmJiBjdXJyZW50Vmlld01vZGVsWydkaXNwb3NlJ107XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudFZpZXdNb2RlbERpc3Bvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3TW9kZWxEaXNwb3NlLmNhbGwoY3VycmVudFZpZXdNb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBBbnkgaW4tZmxpZ2h0IGxvYWRpbmcgb3BlcmF0aW9uIGlzIG5vIGxvbmdlciByZWxldmFudCwgc28gbWFrZSBzdXJlIHdlIGlnbm9yZSBpdHMgY29tcGxldGlvblxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGluZ09wZXJhdGlvbklkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsQ2hpbGROb2RlcyA9IGtvLnV0aWxzLm1ha2VBcnJheShrby52aXJ0dWFsRWxlbWVudHMuY2hpbGROb2RlcyhlbGVtZW50KSk7XG5cbiAgICAgICAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2soZWxlbWVudCwgZGlzcG9zZUFzc29jaWF0ZWRDb21wb25lbnRWaWV3TW9kZWwpO1xuXG4gICAgICAgICAgICBrby5jb21wdXRlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLCBjb21wb25lbnRQYXJhbXM7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVbJ25hbWUnXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFBhcmFtcyA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVbJ3BhcmFtcyddKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb21wb25lbnQgbmFtZSBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgbG9hZGluZ09wZXJhdGlvbklkID0gY3VycmVudExvYWRpbmdPcGVyYXRpb25JZCA9ICsrY29tcG9uZW50TG9hZGluZ09wZXJhdGlvblVuaXF1ZUlkO1xuICAgICAgICAgICAgICAgIGtvLmNvbXBvbmVudHMuZ2V0KGNvbXBvbmVudE5hbWUsIGZ1bmN0aW9uKGNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGN1cnJlbnQgbG9hZCBvcGVyYXRpb24gZm9yIHRoaXMgZWxlbWVudCwgaWdub3JlIGl0LlxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudExvYWRpbmdPcGVyYXRpb25JZCAhPT0gbG9hZGluZ09wZXJhdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBwcmV2aW91cyBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICBkaXNwb3NlQXNzb2NpYXRlZENvbXBvbmVudFZpZXdNb2RlbCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEluc3RhbnRpYXRlIGFuZCBiaW5kIG5ldyBjb21wb25lbnQuIEltcGxpY2l0bHkgdGhpcyBjbGVhbnMgYW55IG9sZCBET00gbm9kZXMuXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGNvbXBvbmVudCBcXCcnICsgY29tcG9uZW50TmFtZSArICdcXCcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbG9uZVRlbXBsYXRlSW50b0VsZW1lbnQoY29tcG9uZW50TmFtZSwgY29tcG9uZW50RGVmaW5pdGlvbiwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb21wb25lbnRWaWV3TW9kZWwgPSBjcmVhdGVWaWV3TW9kZWwoY29tcG9uZW50RGVmaW5pdGlvbiwgZWxlbWVudCwgb3JpZ2luYWxDaGlsZE5vZGVzLCBjb21wb25lbnRQYXJhbXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRCaW5kaW5nQ29udGV4dCA9IGJpbmRpbmdDb250ZXh0WydjcmVhdGVDaGlsZENvbnRleHQnXShjb21wb25lbnRWaWV3TW9kZWwsIC8qIGRhdGFJdGVtQWxpYXMgKi8gdW5kZWZpbmVkLCBmdW5jdGlvbihjdHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHhbJyRjb21wb25lbnQnXSA9IGNvbXBvbmVudFZpZXdNb2RlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHhbJyRjb21wb25lbnRUZW1wbGF0ZU5vZGVzJ10gPSBvcmlnaW5hbENoaWxkTm9kZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFZpZXdNb2RlbCA9IGNvbXBvbmVudFZpZXdNb2RlbDtcbiAgICAgICAgICAgICAgICAgICAga28uYXBwbHlCaW5kaW5nc1RvRGVzY2VuZGFudHMoY2hpbGRCaW5kaW5nQ29udGV4dCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBudWxsLCB7IGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogZWxlbWVudCB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgJ2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzJzogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3NbJ2NvbXBvbmVudCddID0gdHJ1ZTtcblxuICAgIGZ1bmN0aW9uIGNsb25lVGVtcGxhdGVJbnRvRWxlbWVudChjb21wb25lbnROYW1lLCBjb21wb25lbnREZWZpbml0aW9uLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IGNvbXBvbmVudERlZmluaXRpb25bJ3RlbXBsYXRlJ107XG4gICAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcG9uZW50IFxcJycgKyBjb21wb25lbnROYW1lICsgJ1xcJyBoYXMgbm8gdGVtcGxhdGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjbG9uZWROb2Rlc0FycmF5ID0ga28udXRpbHMuY2xvbmVOb2Rlcyh0ZW1wbGF0ZSk7XG4gICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5zZXREb21Ob2RlQ2hpbGRyZW4oZWxlbWVudCwgY2xvbmVkTm9kZXNBcnJheSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVmlld01vZGVsKGNvbXBvbmVudERlZmluaXRpb24sIGVsZW1lbnQsIG9yaWdpbmFsQ2hpbGROb2RlcywgY29tcG9uZW50UGFyYW1zKSB7XG4gICAgICAgIHZhciBjb21wb25lbnRWaWV3TW9kZWxGYWN0b3J5ID0gY29tcG9uZW50RGVmaW5pdGlvblsnY3JlYXRlVmlld01vZGVsJ107XG4gICAgICAgIHJldHVybiBjb21wb25lbnRWaWV3TW9kZWxGYWN0b3J5XG4gICAgICAgICAgICA/IGNvbXBvbmVudFZpZXdNb2RlbEZhY3RvcnkuY2FsbChjb21wb25lbnREZWZpbml0aW9uLCBjb21wb25lbnRQYXJhbXMsIHsgJ2VsZW1lbnQnOiBlbGVtZW50LCAndGVtcGxhdGVOb2Rlcyc6IG9yaWdpbmFsQ2hpbGROb2RlcyB9KVxuICAgICAgICAgICAgOiBjb21wb25lbnRQYXJhbXM7IC8vIFRlbXBsYXRlLW9ubHkgY29tcG9uZW50XG4gICAgfVxuXG59KSgpO1xudmFyIGF0dHJIdG1sVG9KYXZhc2NyaXB0TWFwID0geyAnY2xhc3MnOiAnY2xhc3NOYW1lJywgJ2Zvcic6ICdodG1sRm9yJyB9O1xua28uYmluZGluZ0hhbmRsZXJzWydhdHRyJ10gPSB7XG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKSB8fCB7fTtcbiAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24oYXR0ck5hbWUsIGF0dHJWYWx1ZSkge1xuICAgICAgICAgICAgYXR0clZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShhdHRyVmFsdWUpO1xuXG4gICAgICAgICAgICAvLyBUbyBjb3ZlciBjYXNlcyBsaWtlIFwiYXR0cjogeyBjaGVja2VkOnNvbWVQcm9wIH1cIiwgd2Ugd2FudCB0byByZW1vdmUgdGhlIGF0dHJpYnV0ZSBlbnRpcmVseVxuICAgICAgICAgICAgLy8gd2hlbiBzb21lUHJvcCBpcyBhIFwibm8gdmFsdWVcIi1saWtlIHZhbHVlIChzdHJpY3RseSBudWxsLCBmYWxzZSwgb3IgdW5kZWZpbmVkKVxuICAgICAgICAgICAgLy8gKGJlY2F1c2UgdGhlIGFic2VuY2Ugb2YgdGhlIFwiY2hlY2tlZFwiIGF0dHIgaXMgaG93IHRvIG1hcmsgYW4gZWxlbWVudCBhcyBub3QgY2hlY2tlZCwgZXRjLilcbiAgICAgICAgICAgIHZhciB0b1JlbW92ZSA9IChhdHRyVmFsdWUgPT09IGZhbHNlKSB8fCAoYXR0clZhbHVlID09PSBudWxsKSB8fCAoYXR0clZhbHVlID09PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgaWYgKHRvUmVtb3ZlKVxuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgICAgICAgICAgLy8gSW4gSUUgPD0gNyBhbmQgSUU4IFF1aXJrcyBNb2RlLCB5b3UgaGF2ZSB0byB1c2UgdGhlIEphdmFzY3JpcHQgcHJvcGVydHkgbmFtZSBpbnN0ZWFkIG9mIHRoZVxuICAgICAgICAgICAgLy8gSFRNTCBhdHRyaWJ1dGUgbmFtZSBmb3IgY2VydGFpbiBhdHRyaWJ1dGVzLiBJRTggU3RhbmRhcmRzIE1vZGUgc3VwcG9ydHMgdGhlIGNvcnJlY3QgYmVoYXZpb3IsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCBvZiBmaWd1cmluZyBvdXQgdGhlIG1vZGUsIHdlJ2xsIGp1c3Qgc2V0IHRoZSBhdHRyaWJ1dGUgdGhyb3VnaCB0aGUgSmF2YXNjcmlwdFxuICAgICAgICAgICAgLy8gcHJvcGVydHkgZm9yIElFIDw9IDguXG4gICAgICAgICAgICBpZiAoa28udXRpbHMuaWVWZXJzaW9uIDw9IDggJiYgYXR0ck5hbWUgaW4gYXR0ckh0bWxUb0phdmFzY3JpcHRNYXApIHtcbiAgICAgICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHJIdG1sVG9KYXZhc2NyaXB0TWFwW2F0dHJOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodG9SZW1vdmUpXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRbYXR0ck5hbWVdID0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdG9SZW1vdmUpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmVhdCBcIm5hbWVcIiBzcGVjaWFsbHkgLSBhbHRob3VnaCB5b3UgY2FuIHRoaW5rIG9mIGl0IGFzIGFuIGF0dHJpYnV0ZSwgaXQgYWxzbyBuZWVkc1xuICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyBvbiBvbGRlciB2ZXJzaW9ucyBvZiBJRSAoaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L3B1bGwvMzMzKVxuICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGJlaW5nIGNhc2Utc2Vuc2l0aXZlIGhlcmUgYmVjYXVzZSBYSFRNTCB3b3VsZCByZWdhcmQgXCJOYW1lXCIgYXMgYSBkaWZmZXJlbnQgdGhpbmdcbiAgICAgICAgICAgIC8vIGVudGlyZWx5LCBhbmQgdGhlcmUncyBubyBzdHJvbmcgcmVhc29uIHRvIGFsbG93IGZvciBzdWNoIGNhc2luZyBpbiBIVE1MLlxuICAgICAgICAgICAgaWYgKGF0dHJOYW1lID09PSBcIm5hbWVcIikge1xuICAgICAgICAgICAgICAgIGtvLnV0aWxzLnNldEVsZW1lbnROYW1lKGVsZW1lbnQsIHRvUmVtb3ZlID8gXCJcIiA6IGF0dHJWYWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcbihmdW5jdGlvbigpIHtcblxua28uYmluZGluZ0hhbmRsZXJzWydjaGVja2VkJ10gPSB7XG4gICAgJ2FmdGVyJzogWyd2YWx1ZScsICdhdHRyJ10sXG4gICAgJ2luaXQnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MpIHtcbiAgICAgICAgdmFyIGNoZWNrZWRWYWx1ZSA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIFRyZWF0IFwidmFsdWVcIiBsaWtlIFwiY2hlY2tlZFZhbHVlXCIgd2hlbiBpdCBpcyBpbmNsdWRlZCB3aXRoIFwiY2hlY2tlZFwiIGJpbmRpbmdcbiAgICAgICAgICAgIGlmIChhbGxCaW5kaW5nc1snaGFzJ10oJ2NoZWNrZWRWYWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYWxsQmluZGluZ3MuZ2V0KCdjaGVja2VkVmFsdWUnKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFsbEJpbmRpbmdzWydoYXMnXSgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGFsbEJpbmRpbmdzLmdldCgndmFsdWUnKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVNb2RlbCgpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlcyB0aGUgbW9kZWwgdmFsdWUgZnJvbSB0aGUgdmlldyB2YWx1ZS5cbiAgICAgICAgICAgIC8vIEl0IHJ1bnMgaW4gcmVzcG9uc2UgdG8gRE9NIGV2ZW50cyAoY2xpY2spIGFuZCBjaGFuZ2VzIGluIGNoZWNrZWRWYWx1ZS5cbiAgICAgICAgICAgIHZhciBpc0NoZWNrZWQgPSBlbGVtZW50LmNoZWNrZWQsXG4gICAgICAgICAgICAgICAgZWxlbVZhbHVlID0gdXNlQ2hlY2tlZFZhbHVlID8gY2hlY2tlZFZhbHVlKCkgOiBpc0NoZWNrZWQ7XG5cbiAgICAgICAgICAgIC8vIFdoZW4gd2UncmUgZmlyc3Qgc2V0dGluZyB1cCB0aGlzIGNvbXB1dGVkLCBkb24ndCBjaGFuZ2UgYW55IG1vZGVsIHN0YXRlLlxuICAgICAgICAgICAgaWYgKGtvLmNvbXB1dGVkQ29udGV4dC5pc0luaXRpYWwoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgY2FuIGlnbm9yZSB1bmNoZWNrZWQgcmFkaW8gYnV0dG9ucywgYmVjYXVzZSBzb21lIG90aGVyIHJhZGlvXG4gICAgICAgICAgICAvLyBidXR0b24gd2lsbCBiZSBnZXR0aW5nIGNoZWNrZWQsIGFuZCB0aGF0IG9uZSBjYW4gdGFrZSBjYXJlIG9mIHVwZGF0aW5nIHN0YXRlLlxuICAgICAgICAgICAgaWYgKGlzUmFkaW8gJiYgIWlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG1vZGVsVmFsdWUgPSBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZSh2YWx1ZUFjY2Vzc29yKTtcbiAgICAgICAgICAgIGlmIChpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkRWxlbVZhbHVlICE9PSBlbGVtVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB3ZSdyZSByZXNwb25kaW5nIHRvIHRoZSBjaGVja2VkVmFsdWUgY2hhbmdpbmcsIGFuZCB0aGUgZWxlbWVudCBpc1xuICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgY2hlY2tlZCwgcmVwbGFjZSB0aGUgb2xkIGVsZW0gdmFsdWUgd2l0aCB0aGUgbmV3IGVsZW0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1vZGVsIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrby51dGlscy5hZGRPclJlbW92ZUl0ZW0obW9kZWxWYWx1ZSwgZWxlbVZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFkZE9yUmVtb3ZlSXRlbShtb2RlbFZhbHVlLCBvbGRFbGVtVmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG9sZEVsZW1WYWx1ZSA9IGVsZW1WYWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHdlJ3JlIHJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgaGF2aW5nIGNoZWNrZWQvdW5jaGVja2VkIGEgY2hlY2tib3gsXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZC9yZW1vdmUgdGhlIGVsZW1lbnQgdmFsdWUgdG8gdGhlIG1vZGVsIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICBrby51dGlscy5hZGRPclJlbW92ZUl0ZW0obW9kZWxWYWx1ZSwgZWxlbVZhbHVlLCBpc0NoZWNrZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAga28uZXhwcmVzc2lvblJld3JpdGluZy53cml0ZVZhbHVlVG9Qcm9wZXJ0eShtb2RlbFZhbHVlLCBhbGxCaW5kaW5ncywgJ2NoZWNrZWQnLCBlbGVtVmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVZpZXcoKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZXMgdGhlIHZpZXcgdmFsdWUgZnJvbSB0aGUgbW9kZWwgdmFsdWUuXG4gICAgICAgICAgICAvLyBJdCBydW5zIGluIHJlc3BvbnNlIHRvIGNoYW5nZXMgaW4gdGhlIGJvdW5kIChjaGVja2VkKSB2YWx1ZS5cbiAgICAgICAgICAgIHZhciBtb2RlbFZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuXG4gICAgICAgICAgICBpZiAoaXNWYWx1ZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBhIGNoZWNrYm94IGlzIGJvdW5kIHRvIGFuIGFycmF5LCBiZWluZyBjaGVja2VkIHJlcHJlc2VudHMgaXRzIHZhbHVlIGJlaW5nIHByZXNlbnQgaW4gdGhhdCBhcnJheVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IGtvLnV0aWxzLmFycmF5SW5kZXhPZihtb2RlbFZhbHVlLCBjaGVja2VkVmFsdWUoKSkgPj0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDaGVja2JveCkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gYSBjaGVja2JveCBpcyBib3VuZCB0byBhbnkgb3RoZXIgdmFsdWUgKG5vdCBhbiBhcnJheSksIGJlaW5nIGNoZWNrZWQgcmVwcmVzZW50cyB0aGUgdmFsdWUgYmVpbmcgdHJ1ZWlzaFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IG1vZGVsVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZvciByYWRpbyBidXR0b25zLCBiZWluZyBjaGVja2VkIG1lYW5zIHRoYXQgdGhlIHJhZGlvIGJ1dHRvbidzIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBtb2RlbCB2YWx1ZVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IChjaGVja2VkVmFsdWUoKSA9PT0gbW9kZWxWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGlzQ2hlY2tib3ggPSBlbGVtZW50LnR5cGUgPT0gXCJjaGVja2JveFwiLFxuICAgICAgICAgICAgaXNSYWRpbyA9IGVsZW1lbnQudHlwZSA9PSBcInJhZGlvXCI7XG5cbiAgICAgICAgLy8gT25seSBiaW5kIHRvIGNoZWNrIGJveGVzIGFuZCByYWRpbyBidXR0b25zXG4gICAgICAgIGlmICghaXNDaGVja2JveCAmJiAhaXNSYWRpbykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGlzVmFsdWVBcnJheSA9IGlzQ2hlY2tib3ggJiYgKGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKSBpbnN0YW5jZW9mIEFycmF5KSxcbiAgICAgICAgICAgIG9sZEVsZW1WYWx1ZSA9IGlzVmFsdWVBcnJheSA/IGNoZWNrZWRWYWx1ZSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdXNlQ2hlY2tlZFZhbHVlID0gaXNSYWRpbyB8fCBpc1ZhbHVlQXJyYXk7XG5cbiAgICAgICAgLy8gSUUgNiB3b24ndCBhbGxvdyByYWRpbyBidXR0b25zIHRvIGJlIHNlbGVjdGVkIHVubGVzcyB0aGV5IGhhdmUgYSBuYW1lXG4gICAgICAgIGlmIChpc1JhZGlvICYmICFlbGVtZW50Lm5hbWUpXG4gICAgICAgICAgICBrby5iaW5kaW5nSGFuZGxlcnNbJ3VuaXF1ZU5hbWUnXVsnaW5pdCddKGVsZW1lbnQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KTtcblxuICAgICAgICAvLyBTZXQgdXAgdHdvIGNvbXB1dGVkcyB0byB1cGRhdGUgdGhlIGJpbmRpbmc6XG5cbiAgICAgICAgLy8gVGhlIGZpcnN0IHJlc3BvbmRzIHRvIGNoYW5nZXMgaW4gdGhlIGNoZWNrZWRWYWx1ZSB2YWx1ZSBhbmQgdG8gZWxlbWVudCBjbGlja3NcbiAgICAgICAga28uY29tcHV0ZWQodXBkYXRlTW9kZWwsIG51bGwsIHsgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBlbGVtZW50IH0pO1xuICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcImNsaWNrXCIsIHVwZGF0ZU1vZGVsKTtcblxuICAgICAgICAvLyBUaGUgc2Vjb25kIHJlc3BvbmRzIHRvIGNoYW5nZXMgaW4gdGhlIG1vZGVsIHZhbHVlICh0aGUgb25lIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2hlY2tlZCBiaW5kaW5nKVxuICAgICAgICBrby5jb21wdXRlZCh1cGRhdGVWaWV3LCBudWxsLCB7IGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogZWxlbWVudCB9KTtcbiAgICB9XG59O1xua28uZXhwcmVzc2lvblJld3JpdGluZy50d29XYXlCaW5kaW5nc1snY2hlY2tlZCddID0gdHJ1ZTtcblxua28uYmluZGluZ0hhbmRsZXJzWydjaGVja2VkVmFsdWUnXSA9IHtcbiAgICAndXBkYXRlJzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgZWxlbWVudC52YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcbiAgICB9XG59O1xuXG59KSgpO3ZhciBjbGFzc2VzV3JpdHRlbkJ5QmluZGluZ0tleSA9ICdfX2tvX19jc3NWYWx1ZSc7XG5rby5iaW5kaW5nSGFuZGxlcnNbJ2NzcyddID0ge1xuICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24oY2xhc3NOYW1lLCBzaG91bGRIYXZlQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICBzaG91bGRIYXZlQ2xhc3MgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHNob3VsZEhhdmVDbGFzcyk7XG4gICAgICAgICAgICAgICAga28udXRpbHMudG9nZ2xlRG9tTm9kZUNzc0NsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSwgc2hvdWxkSGF2ZUNsYXNzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUgfHwgJycpOyAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHN0b3JlIG9yIHNldCBhIG5vbi1zdHJpbmcgdmFsdWVcbiAgICAgICAgICAgIGtvLnV0aWxzLnRvZ2dsZURvbU5vZGVDc3NDbGFzcyhlbGVtZW50LCBlbGVtZW50W2NsYXNzZXNXcml0dGVuQnlCaW5kaW5nS2V5XSwgZmFsc2UpO1xuICAgICAgICAgICAgZWxlbWVudFtjbGFzc2VzV3JpdHRlbkJ5QmluZGluZ0tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGtvLnV0aWxzLnRvZ2dsZURvbU5vZGVDc3NDbGFzcyhlbGVtZW50LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xua28uYmluZGluZ0hhbmRsZXJzWydlbmFibGUnXSA9IHtcbiAgICAndXBkYXRlJzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgdmFyIHZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuICAgICAgICBpZiAodmFsdWUgJiYgZWxlbWVudC5kaXNhYmxlZClcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIGVsc2UgaWYgKCghdmFsdWUpICYmICghZWxlbWVudC5kaXNhYmxlZCkpXG4gICAgICAgICAgICBlbGVtZW50LmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG59O1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ2Rpc2FibGUnXSA9IHtcbiAgICAndXBkYXRlJzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAga28uYmluZGluZ0hhbmRsZXJzWydlbmFibGUnXVsndXBkYXRlJ10oZWxlbWVudCwgZnVuY3Rpb24oKSB7IHJldHVybiAha28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpIH0pO1xuICAgIH1cbn07XG4vLyBGb3IgY2VydGFpbiBjb21tb24gZXZlbnRzIChjdXJyZW50bHkganVzdCAnY2xpY2snKSwgYWxsb3cgYSBzaW1wbGlmaWVkIGRhdGEtYmluZGluZyBzeW50YXhcbi8vIGUuZy4gY2xpY2s6aGFuZGxlciBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBmdWxsLWxlbmd0aCBldmVudDp7Y2xpY2s6aGFuZGxlcn1cbmZ1bmN0aW9uIG1ha2VFdmVudEhhbmRsZXJTaG9ydGN1dChldmVudE5hbWUpIHtcbiAgICBrby5iaW5kaW5nSGFuZGxlcnNbZXZlbnROYW1lXSA9IHtcbiAgICAgICAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdmFyIG5ld1ZhbHVlQWNjZXNzb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgICAgIHJlc3VsdFtldmVudE5hbWVdID0gdmFsdWVBY2Nlc3NvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGtvLmJpbmRpbmdIYW5kbGVyc1snZXZlbnQnXVsnaW5pdCddLmNhbGwodGhpcywgZWxlbWVudCwgbmV3VmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ2V2ZW50J10gPSB7XG4gICAgJ2luaXQnIDogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgIHZhciBldmVudHNUb0hhbmRsZSA9IHZhbHVlQWNjZXNzb3IoKSB8fCB7fTtcbiAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaChldmVudHNUb0hhbmRsZSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50TmFtZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgZXZlbnROYW1lLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZXJSZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZXJGdW5jdGlvbiA9IHZhbHVlQWNjZXNzb3IoKVtldmVudE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJGdW5jdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFrZSBhbGwgdGhlIGV2ZW50IGFyZ3MsIGFuZCBwcmVmaXggd2l0aCB0aGUgdmlld21vZGVsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJnc0ZvckhhbmRsZXIgPSBrby51dGlscy5tYWtlQXJyYXkoYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlbCA9IGJpbmRpbmdDb250ZXh0WyckZGF0YSddO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc0ZvckhhbmRsZXIudW5zaGlmdCh2aWV3TW9kZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJldHVyblZhbHVlID0gaGFuZGxlckZ1bmN0aW9uLmFwcGx5KHZpZXdNb2RlbCwgYXJnc0ZvckhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJSZXR1cm5WYWx1ZSAhPT0gdHJ1ZSkgeyAvLyBOb3JtYWxseSB3ZSB3YW50IHRvIHByZXZlbnQgZGVmYXVsdCBhY3Rpb24uIERldmVsb3BlciBjYW4gb3ZlcnJpZGUgdGhpcyBiZSBleHBsaWNpdGx5IHJldHVybmluZyB0cnVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgYnViYmxlID0gYWxsQmluZGluZ3MuZ2V0KGV2ZW50TmFtZSArICdCdWJibGUnKSAhPT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYnViYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuLy8gXCJmb3JlYWNoOiBzb21lRXhwcmVzc2lvblwiIGlzIGVxdWl2YWxlbnQgdG8gXCJ0ZW1wbGF0ZTogeyBmb3JlYWNoOiBzb21lRXhwcmVzc2lvbiB9XCJcbi8vIFwiZm9yZWFjaDogeyBkYXRhOiBzb21lRXhwcmVzc2lvbiwgYWZ0ZXJBZGQ6IG15Zm4gfVwiIGlzIGVxdWl2YWxlbnQgdG8gXCJ0ZW1wbGF0ZTogeyBmb3JlYWNoOiBzb21lRXhwcmVzc2lvbiwgYWZ0ZXJBZGQ6IG15Zm4gfVwiXG5rby5iaW5kaW5nSGFuZGxlcnNbJ2ZvcmVhY2gnXSA9IHtcbiAgICBtYWtlVGVtcGxhdGVWYWx1ZUFjY2Vzc29yOiBmdW5jdGlvbih2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBtb2RlbFZhbHVlID0gdmFsdWVBY2Nlc3NvcigpLFxuICAgICAgICAgICAgICAgIHVud3JhcHBlZFZhbHVlID0ga28udXRpbHMucGVla09ic2VydmFibGUobW9kZWxWYWx1ZSk7ICAgIC8vIFVud3JhcCB3aXRob3V0IHNldHRpbmcgYSBkZXBlbmRlbmN5IGhlcmVcblxuICAgICAgICAgICAgLy8gSWYgdW53cmFwcGVkVmFsdWUgaXMgdGhlIGFycmF5LCBwYXNzIGluIHRoZSB3cmFwcGVkIHZhbHVlIG9uIGl0cyBvd25cbiAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSB3aWxsIGJlIHVud3JhcHBlZCBhbmQgdHJhY2tlZCB3aXRoaW4gdGhlIHRlbXBsYXRlIGJpbmRpbmdcbiAgICAgICAgICAgIC8vIChTZWUgaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L2lzc3Vlcy81MjMpXG4gICAgICAgICAgICBpZiAoKCF1bndyYXBwZWRWYWx1ZSkgfHwgdHlwZW9mIHVud3JhcHBlZFZhbHVlLmxlbmd0aCA9PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIHJldHVybiB7ICdmb3JlYWNoJzogbW9kZWxWYWx1ZSwgJ3RlbXBsYXRlRW5naW5lJzoga28ubmF0aXZlVGVtcGxhdGVFbmdpbmUuaW5zdGFuY2UgfTtcblxuICAgICAgICAgICAgLy8gSWYgdW53cmFwcGVkVmFsdWUuZGF0YSBpcyB0aGUgYXJyYXksIHByZXNlcnZlIGFsbCByZWxldmFudCBvcHRpb25zIGFuZCB1bndyYXAgYWdhaW4gdmFsdWUgc28gd2UgZ2V0IHVwZGF0ZXNcbiAgICAgICAgICAgIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUobW9kZWxWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICdmb3JlYWNoJzogdW53cmFwcGVkVmFsdWVbJ2RhdGEnXSxcbiAgICAgICAgICAgICAgICAnYXMnOiB1bndyYXBwZWRWYWx1ZVsnYXMnXSxcbiAgICAgICAgICAgICAgICAnaW5jbHVkZURlc3Ryb3llZCc6IHVud3JhcHBlZFZhbHVlWydpbmNsdWRlRGVzdHJveWVkJ10sXG4gICAgICAgICAgICAgICAgJ2FmdGVyQWRkJzogdW53cmFwcGVkVmFsdWVbJ2FmdGVyQWRkJ10sXG4gICAgICAgICAgICAgICAgJ2JlZm9yZVJlbW92ZSc6IHVud3JhcHBlZFZhbHVlWydiZWZvcmVSZW1vdmUnXSxcbiAgICAgICAgICAgICAgICAnYWZ0ZXJSZW5kZXInOiB1bndyYXBwZWRWYWx1ZVsnYWZ0ZXJSZW5kZXInXSxcbiAgICAgICAgICAgICAgICAnYmVmb3JlTW92ZSc6IHVud3JhcHBlZFZhbHVlWydiZWZvcmVNb3ZlJ10sXG4gICAgICAgICAgICAgICAgJ2FmdGVyTW92ZSc6IHVud3JhcHBlZFZhbHVlWydhZnRlck1vdmUnXSxcbiAgICAgICAgICAgICAgICAndGVtcGxhdGVFbmdpbmUnOiBrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZS5pbnN0YW5jZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICB9LFxuICAgICdpbml0JzogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGtvLmJpbmRpbmdIYW5kbGVyc1sndGVtcGxhdGUnXVsnaW5pdCddKGVsZW1lbnQsIGtvLmJpbmRpbmdIYW5kbGVyc1snZm9yZWFjaCddLm1ha2VUZW1wbGF0ZVZhbHVlQWNjZXNzb3IodmFsdWVBY2Nlc3NvcikpO1xuICAgIH0sXG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBrby5iaW5kaW5nSGFuZGxlcnNbJ3RlbXBsYXRlJ11bJ3VwZGF0ZSddKGVsZW1lbnQsIGtvLmJpbmRpbmdIYW5kbGVyc1snZm9yZWFjaCddLm1ha2VUZW1wbGF0ZVZhbHVlQWNjZXNzb3IodmFsdWVBY2Nlc3NvciksIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KTtcbiAgICB9XG59O1xua28uZXhwcmVzc2lvblJld3JpdGluZy5iaW5kaW5nUmV3cml0ZVZhbGlkYXRvcnNbJ2ZvcmVhY2gnXSA9IGZhbHNlOyAvLyBDYW4ndCByZXdyaXRlIGNvbnRyb2wgZmxvdyBiaW5kaW5nc1xua28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1snZm9yZWFjaCddID0gdHJ1ZTtcbnZhciBoYXNmb2N1c1VwZGF0aW5nUHJvcGVydHkgPSAnX19rb19oYXNmb2N1c1VwZGF0aW5nJztcbnZhciBoYXNmb2N1c0xhc3RWYWx1ZSA9ICdfX2tvX2hhc2ZvY3VzTGFzdFZhbHVlJztcbmtvLmJpbmRpbmdIYW5kbGVyc1snaGFzZm9jdXMnXSA9IHtcbiAgICAnaW5pdCc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzKSB7XG4gICAgICAgIHZhciBoYW5kbGVFbGVtZW50Rm9jdXNDaGFuZ2UgPSBmdW5jdGlvbihpc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgIC8vIFdoZXJlIHBvc3NpYmxlLCBpZ25vcmUgd2hpY2ggZXZlbnQgd2FzIHJhaXNlZCBhbmQgZGV0ZXJtaW5lIGZvY3VzIHN0YXRlIHVzaW5nIGFjdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAvLyBhcyB0aGlzIGF2b2lkcyBwaGFudG9tIGZvY3VzL2JsdXIgZXZlbnRzIHJhaXNlZCB3aGVuIGNoYW5naW5nIHRhYnMgaW4gbW9kZXJuIGJyb3dzZXJzLlxuICAgICAgICAgICAgLy8gSG93ZXZlciwgbm90IGFsbCBLTy10YXJnZXRlZCBicm93c2VycyAoRmlyZWZveCAyKSBzdXBwb3J0IGFjdGl2ZUVsZW1lbnQuIEZvciB0aG9zZSBicm93c2VycyxcbiAgICAgICAgICAgIC8vIHByZXZlbnQgYSBsb3NzIG9mIGZvY3VzIHdoZW4gY2hhbmdpbmcgdGFicy93aW5kb3dzIGJ5IHNldHRpbmcgYSBmbGFnIHRoYXQgcHJldmVudHMgaGFzZm9jdXNcbiAgICAgICAgICAgIC8vIGZyb20gY2FsbGluZyAnYmx1cigpJyBvbiB0aGUgZWxlbWVudCB3aGVuIGl0IGxvc2VzIGZvY3VzLlxuICAgICAgICAgICAgLy8gRGlzY3Vzc2lvbiBhdCBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvcHVsbC8zNTJcbiAgICAgICAgICAgIGVsZW1lbnRbaGFzZm9jdXNVcGRhdGluZ1Byb3BlcnR5XSA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb3duZXJEb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICBpZiAoXCJhY3RpdmVFbGVtZW50XCIgaW4gb3duZXJEb2MpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWN0aXZlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZSA9IG93bmVyRG9jLmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElFOSB0aHJvd3MgaWYgeW91IGFjY2VzcyBhY3RpdmVFbGVtZW50IGR1cmluZyBwYWdlIGxvYWQgKHNlZSBpc3N1ZSAjNzAzKVxuICAgICAgICAgICAgICAgICAgICBhY3RpdmUgPSBvd25lckRvYy5ib2R5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpc0ZvY3VzZWQgPSAoYWN0aXZlID09PSBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtb2RlbFZhbHVlID0gdmFsdWVBY2Nlc3NvcigpO1xuICAgICAgICAgICAga28uZXhwcmVzc2lvblJld3JpdGluZy53cml0ZVZhbHVlVG9Qcm9wZXJ0eShtb2RlbFZhbHVlLCBhbGxCaW5kaW5ncywgJ2hhc2ZvY3VzJywgaXNGb2N1c2VkLCB0cnVlKTtcblxuICAgICAgICAgICAgLy9jYWNoZSB0aGUgbGF0ZXN0IHZhbHVlLCBzbyB3ZSBjYW4gYXZvaWQgdW5uZWNlc3NhcmlseSBjYWxsaW5nIGZvY3VzL2JsdXIgaW4gdGhlIHVwZGF0ZSBmdW5jdGlvblxuICAgICAgICAgICAgZWxlbWVudFtoYXNmb2N1c0xhc3RWYWx1ZV0gPSBpc0ZvY3VzZWQ7XG4gICAgICAgICAgICBlbGVtZW50W2hhc2ZvY3VzVXBkYXRpbmdQcm9wZXJ0eV0gPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGhhbmRsZUVsZW1lbnRGb2N1c0luID0gaGFuZGxlRWxlbWVudEZvY3VzQ2hhbmdlLmJpbmQobnVsbCwgdHJ1ZSk7XG4gICAgICAgIHZhciBoYW5kbGVFbGVtZW50Rm9jdXNPdXQgPSBoYW5kbGVFbGVtZW50Rm9jdXNDaGFuZ2UuYmluZChudWxsLCBmYWxzZSk7XG5cbiAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgXCJmb2N1c1wiLCBoYW5kbGVFbGVtZW50Rm9jdXNJbik7XG4gICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwiZm9jdXNpblwiLCBoYW5kbGVFbGVtZW50Rm9jdXNJbik7IC8vIEZvciBJRVxuICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcImJsdXJcIiwgIGhhbmRsZUVsZW1lbnRGb2N1c091dCk7XG4gICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwiZm9jdXNvdXRcIiwgIGhhbmRsZUVsZW1lbnRGb2N1c091dCk7IC8vIEZvciBJRVxuICAgIH0sXG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gISFrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSk7IC8vZm9yY2UgYm9vbGVhbiB0byBjb21wYXJlIHdpdGggbGFzdCB2YWx1ZVxuICAgICAgICBpZiAoIWVsZW1lbnRbaGFzZm9jdXNVcGRhdGluZ1Byb3BlcnR5XSAmJiBlbGVtZW50W2hhc2ZvY3VzTGFzdFZhbHVlXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlID8gZWxlbWVudC5mb2N1cygpIDogZWxlbWVudC5ibHVyKCk7XG4gICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZShrby51dGlscy50cmlnZ2VyRXZlbnQsIG51bGwsIFtlbGVtZW50LCB2YWx1ZSA/IFwiZm9jdXNpblwiIDogXCJmb2N1c291dFwiXSk7IC8vIEZvciBJRSwgd2hpY2ggZG9lc24ndCByZWxpYWJseSBmaXJlIFwiZm9jdXNcIiBvciBcImJsdXJcIiBldmVudHMgc3luY2hyb25vdXNseVxuICAgICAgICB9XG4gICAgfVxufTtcbmtvLmV4cHJlc3Npb25SZXdyaXRpbmcudHdvV2F5QmluZGluZ3NbJ2hhc2ZvY3VzJ10gPSB0cnVlO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ2hhc0ZvY3VzJ10gPSBrby5iaW5kaW5nSGFuZGxlcnNbJ2hhc2ZvY3VzJ107IC8vIE1ha2UgXCJoYXNGb2N1c1wiIGFuIGFsaWFzXG5rby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzWydoYXNGb2N1cyddID0gdHJ1ZTtcbmtvLmJpbmRpbmdIYW5kbGVyc1snaHRtbCddID0ge1xuICAgICdpbml0JzogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFByZXZlbnQgYmluZGluZyBvbiB0aGUgZHluYW1pY2FsbHktaW5qZWN0ZWQgSFRNTCAoYXMgZGV2ZWxvcGVycyBhcmUgdW5saWtlbHkgdG8gZXhwZWN0IHRoYXQsIGFuZCBpdCBoYXMgc2VjdXJpdHkgaW1wbGljYXRpb25zKVxuICAgICAgICByZXR1cm4geyAnY29udHJvbHNEZXNjZW5kYW50QmluZGluZ3MnOiB0cnVlIH07XG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgLy8gc2V0SHRtbCB3aWxsIHVud3JhcCB0aGUgdmFsdWUgaWYgbmVlZGVkXG4gICAgICAgIGtvLnV0aWxzLnNldEh0bWwoZWxlbWVudCwgdmFsdWVBY2Nlc3NvcigpKTtcbiAgICB9XG59O1xuLy8gTWFrZXMgYSBiaW5kaW5nIGxpa2Ugd2l0aCBvciBpZlxuZnVuY3Rpb24gbWFrZVdpdGhJZkJpbmRpbmcoYmluZGluZ0tleSwgaXNXaXRoLCBpc05vdCwgbWFrZUNvbnRleHRDYWxsYmFjaykge1xuICAgIGtvLmJpbmRpbmdIYW5kbGVyc1tiaW5kaW5nS2V5XSA9IHtcbiAgICAgICAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdmFyIGRpZERpc3BsYXlPbkxhc3RVcGRhdGUsXG4gICAgICAgICAgICAgICAgc2F2ZWROb2RlcztcbiAgICAgICAgICAgIGtvLmNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSksXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZERpc3BsYXkgPSAhaXNOb3QgIT09ICFkYXRhVmFsdWUsIC8vIGVxdWl2YWxlbnQgdG8gaXNOb3QgPyAhZGF0YVZhbHVlIDogISFkYXRhVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgaXNGaXJzdFJlbmRlciA9ICFzYXZlZE5vZGVzLFxuICAgICAgICAgICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSBpc0ZpcnN0UmVuZGVyIHx8IGlzV2l0aCB8fCAoc2hvdWxkRGlzcGxheSAhPT0gZGlkRGlzcGxheU9uTGFzdFVwZGF0ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobmVlZHNSZWZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgYSBjb3B5IG9mIHRoZSBpbm5lciBub2RlcyBvbiB0aGUgaW5pdGlhbCB1cGRhdGUsIGJ1dCBvbmx5IGlmIHdlIGhhdmUgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdFJlbmRlciAmJiBrby5jb21wdXRlZENvbnRleHQuZ2V0RGVwZW5kZW5jaWVzQ291bnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWROb2RlcyA9IGtvLnV0aWxzLmNsb25lTm9kZXMoa28udmlydHVhbEVsZW1lbnRzLmNoaWxkTm9kZXMoZWxlbWVudCksIHRydWUgLyogc2hvdWxkQ2xlYW5Ob2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0ZpcnN0UmVuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLnNldERvbU5vZGVDaGlsZHJlbihlbGVtZW50LCBrby51dGlscy5jbG9uZU5vZGVzKHNhdmVkTm9kZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGtvLmFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzKG1ha2VDb250ZXh0Q2FsbGJhY2sgPyBtYWtlQ29udGV4dENhbGxiYWNrKGJpbmRpbmdDb250ZXh0LCBkYXRhVmFsdWUpIDogYmluZGluZ0NvbnRleHQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLmVtcHR5Tm9kZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRpZERpc3BsYXlPbkxhc3RVcGRhdGUgPSBzaG91bGREaXNwbGF5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIG51bGwsIHsgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBlbGVtZW50IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgJ2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzJzogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBrby5leHByZXNzaW9uUmV3cml0aW5nLmJpbmRpbmdSZXdyaXRlVmFsaWRhdG9yc1tiaW5kaW5nS2V5XSA9IGZhbHNlOyAvLyBDYW4ndCByZXdyaXRlIGNvbnRyb2wgZmxvdyBiaW5kaW5nc1xuICAgIGtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3NbYmluZGluZ0tleV0gPSB0cnVlO1xufVxuXG4vLyBDb25zdHJ1Y3QgdGhlIGFjdHVhbCBiaW5kaW5nIGhhbmRsZXJzXG5tYWtlV2l0aElmQmluZGluZygnaWYnKTtcbm1ha2VXaXRoSWZCaW5kaW5nKCdpZm5vdCcsIGZhbHNlIC8qIGlzV2l0aCAqLywgdHJ1ZSAvKiBpc05vdCAqLyk7XG5tYWtlV2l0aElmQmluZGluZygnd2l0aCcsIHRydWUgLyogaXNXaXRoICovLCBmYWxzZSAvKiBpc05vdCAqLyxcbiAgICBmdW5jdGlvbihiaW5kaW5nQ29udGV4dCwgZGF0YVZhbHVlKSB7XG4gICAgICAgIHJldHVybiBiaW5kaW5nQ29udGV4dFsnY3JlYXRlQ2hpbGRDb250ZXh0J10oZGF0YVZhbHVlKTtcbiAgICB9XG4pO1xudmFyIGNhcHRpb25QbGFjZWhvbGRlciA9IHt9O1xua28uYmluZGluZ0hhbmRsZXJzWydvcHRpb25zJ10gPSB7XG4gICAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgIGlmIChrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCkgIT09IFwic2VsZWN0XCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zIGJpbmRpbmcgYXBwbGllcyBvbmx5IHRvIFNFTEVDVCBlbGVtZW50c1wiKTtcblxuICAgICAgICAvLyBSZW1vdmUgYWxsIGV4aXN0aW5nIDxvcHRpb24+cy5cbiAgICAgICAgd2hpbGUgKGVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmVzIHRoYXQgdGhlIGJpbmRpbmcgcHJvY2Vzc29yIGRvZXNuJ3QgdHJ5IHRvIGJpbmQgdGhlIG9wdGlvbnNcbiAgICAgICAgcmV0dXJuIHsgJ2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzJzogdHJ1ZSB9O1xuICAgIH0sXG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncykge1xuICAgICAgICBmdW5jdGlvbiBzZWxlY3RlZE9wdGlvbnMoKSB7XG4gICAgICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlGaWx0ZXIoZWxlbWVudC5vcHRpb25zLCBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5zZWxlY3RlZDsgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VsZWN0V2FzUHJldmlvdXNseUVtcHR5ID0gZWxlbWVudC5sZW5ndGggPT0gMCxcbiAgICAgICAgICAgIG11bHRpcGxlID0gZWxlbWVudC5tdWx0aXBsZSxcbiAgICAgICAgICAgIHByZXZpb3VzU2Nyb2xsVG9wID0gKCFzZWxlY3RXYXNQcmV2aW91c2x5RW1wdHkgJiYgbXVsdGlwbGUpID8gZWxlbWVudC5zY3JvbGxUb3AgOiBudWxsLFxuICAgICAgICAgICAgdW53cmFwcGVkQXJyYXkgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSksXG4gICAgICAgICAgICB2YWx1ZUFsbG93VW5zZXQgPSBhbGxCaW5kaW5ncy5nZXQoJ3ZhbHVlQWxsb3dVbnNldCcpICYmIGFsbEJpbmRpbmdzWydoYXMnXSgndmFsdWUnKSxcbiAgICAgICAgICAgIGluY2x1ZGVEZXN0cm95ZWQgPSBhbGxCaW5kaW5ncy5nZXQoJ29wdGlvbnNJbmNsdWRlRGVzdHJveWVkJyksXG4gICAgICAgICAgICBhcnJheVRvRG9tTm9kZUNoaWxkcmVuT3B0aW9ucyA9IHt9LFxuICAgICAgICAgICAgY2FwdGlvblZhbHVlLFxuICAgICAgICAgICAgZmlsdGVyZWRBcnJheSxcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZXMgPSBbXTtcblxuICAgICAgICBpZiAoIXZhbHVlQWxsb3dVbnNldCkge1xuICAgICAgICAgICAgaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFZhbHVlcyA9IGtvLnV0aWxzLmFycmF5TWFwKHNlbGVjdGVkT3B0aW9ucygpLCBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc2VsZWN0ZWRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFZhbHVlcy5wdXNoKGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQub3B0aW9uc1tlbGVtZW50LnNlbGVjdGVkSW5kZXhdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW53cmFwcGVkQXJyYXkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdW53cmFwcGVkQXJyYXkubGVuZ3RoID09IFwidW5kZWZpbmVkXCIpIC8vIENvZXJjZSBzaW5nbGUgdmFsdWUgaW50byBhcnJheVxuICAgICAgICAgICAgICAgIHVud3JhcHBlZEFycmF5ID0gW3Vud3JhcHBlZEFycmF5XTtcblxuICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBhbnkgZW50cmllcyBtYXJrZWQgYXMgZGVzdHJveWVkXG4gICAgICAgICAgICBmaWx0ZXJlZEFycmF5ID0ga28udXRpbHMuYXJyYXlGaWx0ZXIodW53cmFwcGVkQXJyYXksIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5jbHVkZURlc3Ryb3llZCB8fCBpdGVtID09PSB1bmRlZmluZWQgfHwgaXRlbSA9PT0gbnVsbCB8fCAha28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShpdGVtWydfZGVzdHJveSddKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBJZiBjYXB0aW9uIGlzIGluY2x1ZGVkLCBhZGQgaXQgdG8gdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAoYWxsQmluZGluZ3NbJ2hhcyddKCdvcHRpb25zQ2FwdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgY2FwdGlvblZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShhbGxCaW5kaW5ncy5nZXQoJ29wdGlvbnNDYXB0aW9uJykpO1xuICAgICAgICAgICAgICAgIC8vIElmIGNhcHRpb24gdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQsIGRvbid0IHNob3cgYSBjYXB0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGNhcHRpb25WYWx1ZSAhPT0gbnVsbCAmJiBjYXB0aW9uVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEFycmF5LnVuc2hpZnQoY2FwdGlvblBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBhIGZhbHN5IHZhbHVlIGlzIHByb3ZpZGVkIChlLmcuIG51bGwpLCB3ZSdsbCBzaW1wbHkgZW1wdHkgdGhlIHNlbGVjdCBlbGVtZW50XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhcHBseVRvT2JqZWN0KG9iamVjdCwgcHJlZGljYXRlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBwcmVkaWNhdGVUeXBlID0gdHlwZW9mIHByZWRpY2F0ZTtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGVUeXBlID09IFwiZnVuY3Rpb25cIikgICAgLy8gR2l2ZW4gYSBmdW5jdGlvbjsgcnVuIGl0IGFnYWluc3QgdGhlIGRhdGEgdmFsdWVcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlKG9iamVjdCk7XG4gICAgICAgICAgICBlbHNlIGlmIChwcmVkaWNhdGVUeXBlID09IFwic3RyaW5nXCIpIC8vIEdpdmVuIGEgc3RyaW5nOyB0cmVhdCBpdCBhcyBhIHByb3BlcnR5IG5hbWUgb24gdGhlIGRhdGEgdmFsdWVcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W3ByZWRpY2F0ZV07XG4gICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHaXZlbiBubyBvcHRpb25zVGV4dCBhcmc7IHVzZSB0aGUgZGF0YSB2YWx1ZSBpdHNlbGZcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY2FuIHJ1biBhdCB0d28gZGlmZmVyZW50IHRpbWVzOlxuICAgICAgICAvLyBUaGUgZmlyc3QgaXMgd2hlbiB0aGUgd2hvbGUgYXJyYXkgaXMgYmVpbmcgdXBkYXRlZCBkaXJlY3RseSBmcm9tIHRoaXMgYmluZGluZyBoYW5kbGVyLlxuICAgICAgICAvLyBUaGUgc2Vjb25kIGlzIHdoZW4gYW4gb2JzZXJ2YWJsZSB2YWx1ZSBmb3IgYSBzcGVjaWZpYyBhcnJheSBlbnRyeSBpcyB1cGRhdGVkLlxuICAgICAgICAvLyBvbGRPcHRpb25zIHdpbGwgYmUgZW1wdHkgaW4gdGhlIGZpcnN0IGNhc2UsIGJ1dCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBvcHRpb24gaW4gdGhlIHNlY29uZC5cbiAgICAgICAgdmFyIGl0ZW1VcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgZnVuY3Rpb24gb3B0aW9uRm9yQXJyYXlJdGVtKGFycmF5RW50cnksIGluZGV4LCBvbGRPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob2xkT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWVzID0gIXZhbHVlQWxsb3dVbnNldCAmJiBvbGRPcHRpb25zWzBdLnNlbGVjdGVkID8gWyBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShvbGRPcHRpb25zWzBdKSBdIDogW107XG4gICAgICAgICAgICAgICAgaXRlbVVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgb3B0aW9uID0gZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgICAgICBpZiAoYXJyYXlFbnRyeSA9PT0gY2FwdGlvblBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgICAga28udXRpbHMuc2V0VGV4dENvbnRlbnQob3B0aW9uLCBhbGxCaW5kaW5ncy5nZXQoJ29wdGlvbnNDYXB0aW9uJykpO1xuICAgICAgICAgICAgICAgIGtvLnNlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZShvcHRpb24sIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFwcGx5IGEgdmFsdWUgdG8gdGhlIG9wdGlvbiBlbGVtZW50XG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvblZhbHVlID0gYXBwbHlUb09iamVjdChhcnJheUVudHJ5LCBhbGxCaW5kaW5ncy5nZXQoJ29wdGlvbnNWYWx1ZScpLCBhcnJheUVudHJ5KTtcbiAgICAgICAgICAgICAgICBrby5zZWxlY3RFeHRlbnNpb25zLndyaXRlVmFsdWUob3B0aW9uLCBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG9wdGlvblZhbHVlKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBBcHBseSBzb21lIHRleHQgdG8gdGhlIG9wdGlvbiBlbGVtZW50XG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvblRleHQgPSBhcHBseVRvT2JqZWN0KGFycmF5RW50cnksIGFsbEJpbmRpbmdzLmdldCgnb3B0aW9uc1RleHQnKSwgb3B0aW9uVmFsdWUpO1xuICAgICAgICAgICAgICAgIGtvLnV0aWxzLnNldFRleHRDb250ZW50KG9wdGlvbiwgb3B0aW9uVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW29wdGlvbl07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCeSB1c2luZyBhIGJlZm9yZVJlbW92ZSBjYWxsYmFjaywgd2UgZGVsYXkgdGhlIHJlbW92YWwgdW50aWwgYWZ0ZXIgbmV3IGl0ZW1zIGFyZSBhZGRlZC4gVGhpcyBmaXhlcyBhIHNlbGVjdGlvblxuICAgICAgICAvLyBwcm9ibGVtIGluIElFPD04IGFuZCBGaXJlZm94LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2tub2Nrb3V0L2tub2Nrb3V0L2lzc3Vlcy8xMjA4XG4gICAgICAgIGFycmF5VG9Eb21Ob2RlQ2hpbGRyZW5PcHRpb25zWydiZWZvcmVSZW1vdmUnXSA9XG4gICAgICAgICAgICBmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChvcHRpb24pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBzZXRTZWxlY3Rpb25DYWxsYmFjayhhcnJheUVudHJ5LCBuZXdPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoaXRlbVVwZGF0ZSAmJiB2YWx1ZUFsbG93VW5zZXQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgbW9kZWwgdmFsdWUgaXMgYXV0aG9yaXRhdGl2ZSwgc28gbWFrZSBzdXJlIGl0cyB2YWx1ZSBpcyB0aGUgb25lIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUgc2luY2Ugc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyBkb2VzIHNvIGFscmVhZHkuXG4gICAgICAgICAgICAgICAga28uc2VsZWN0RXh0ZW5zaW9ucy53cml0ZVZhbHVlKGVsZW1lbnQsIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYWxsQmluZGluZ3MuZ2V0KCd2YWx1ZScpKSwgdHJ1ZSAvKiBhbGxvd1Vuc2V0ICovKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNTZWxlY3RlZFZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBJRTYgZG9lc24ndCBsaWtlIHVzIHRvIGFzc2lnbiBzZWxlY3Rpb24gdG8gT1BUSU9OIG5vZGVzIGJlZm9yZSB0aGV5J3JlIGFkZGVkIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgICAgICAgICAgICAvLyBUaGF0J3Mgd2h5IHdlIGZpcnN0IGFkZGVkIHRoZW0gd2l0aG91dCBzZWxlY3Rpb24uIE5vdyBpdCdzIHRpbWUgdG8gc2V0IHRoZSBzZWxlY3Rpb24uXG4gICAgICAgICAgICAgICAgdmFyIGlzU2VsZWN0ZWQgPSBrby51dGlscy5hcnJheUluZGV4T2YocHJldmlvdXNTZWxlY3RlZFZhbHVlcywga28uc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUobmV3T3B0aW9uc1swXSkpID49IDA7XG4gICAgICAgICAgICAgICAga28udXRpbHMuc2V0T3B0aW9uTm9kZVNlbGVjdGlvblN0YXRlKG5ld09wdGlvbnNbMF0sIGlzU2VsZWN0ZWQpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBvcHRpb24gd2FzIGNoYW5nZWQgZnJvbSBiZWluZyBzZWxlY3RlZCBkdXJpbmcgYSBzaW5nbGUtaXRlbSB1cGRhdGUsIG5vdGlmeSB0aGUgY2hhbmdlXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1VcGRhdGUgJiYgIWlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoa28udXRpbHMudHJpZ2dlckV2ZW50LCBudWxsLCBbZWxlbWVudCwgXCJjaGFuZ2VcIl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjYWxsYmFjayA9IHNldFNlbGVjdGlvbkNhbGxiYWNrO1xuICAgICAgICBpZiAoYWxsQmluZGluZ3NbJ2hhcyddKCdvcHRpb25zQWZ0ZXJSZW5kZXInKSAmJiB0eXBlb2YgYWxsQmluZGluZ3MuZ2V0KCdvcHRpb25zQWZ0ZXJSZW5kZXInKSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oYXJyYXlFbnRyeSwgbmV3T3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHNldFNlbGVjdGlvbkNhbGxiYWNrKGFycmF5RW50cnksIG5ld09wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uaWdub3JlKGFsbEJpbmRpbmdzLmdldCgnb3B0aW9uc0FmdGVyUmVuZGVyJyksIG51bGwsIFtuZXdPcHRpb25zWzBdLCBhcnJheUVudHJ5ICE9PSBjYXB0aW9uUGxhY2Vob2xkZXIgPyBhcnJheUVudHJ5IDogdW5kZWZpbmVkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrby51dGlscy5zZXREb21Ob2RlQ2hpbGRyZW5Gcm9tQXJyYXlNYXBwaW5nKGVsZW1lbnQsIGZpbHRlcmVkQXJyYXksIG9wdGlvbkZvckFycmF5SXRlbSwgYXJyYXlUb0RvbU5vZGVDaGlsZHJlbk9wdGlvbnMsIGNhbGxiYWNrKTtcblxuICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVBbGxvd1Vuc2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG1vZGVsIHZhbHVlIGlzIGF1dGhvcml0YXRpdmUsIHNvIG1ha2Ugc3VyZSBpdHMgdmFsdWUgaXMgdGhlIG9uZSBzZWxlY3RlZFxuICAgICAgICAgICAgICAgIGtvLnNlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZShlbGVtZW50LCBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGFsbEJpbmRpbmdzLmdldCgndmFsdWUnKSksIHRydWUgLyogYWxsb3dVbnNldCAqLyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHVwZGF0aW5nIHRoZSBvcHRpb25zIGxpc3RcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0aW9uQ2hhbmdlZDtcbiAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGEgbXVsdGlwbGUtc2VsZWN0IGJveCwgY29tcGFyZSB0aGUgbmV3IHNlbGVjdGlvbiBjb3VudCB0byB0aGUgcHJldmlvdXMgb25lXG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1dCBpZiBub3RoaW5nIHdhcyBzZWxlY3RlZCBiZWZvcmUsIHRoZSBzZWxlY3Rpb24gY2FuJ3QgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkNoYW5nZWQgPSBwcmV2aW91c1NlbGVjdGVkVmFsdWVzLmxlbmd0aCAmJiBzZWxlY3RlZE9wdGlvbnMoKS5sZW5ndGggPCBwcmV2aW91c1NlbGVjdGVkVmFsdWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgYSBzaW5nbGUtc2VsZWN0IGJveCwgY29tcGFyZSB0aGUgY3VycmVudCB2YWx1ZSB0byB0aGUgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLy8gQnV0IGlmIG5vdGhpbmcgd2FzIHNlbGVjdGVkIGJlZm9yZSBvciBub3RoaW5nIGlzIHNlbGVjdGVkIG5vdywganVzdCBsb29rIGZvciBhIGNoYW5nZSBpbiBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCA9IChwcmV2aW91c1NlbGVjdGVkVmFsdWVzLmxlbmd0aCAmJiBlbGVtZW50LnNlbGVjdGVkSW5kZXggPj0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQub3B0aW9uc1tlbGVtZW50LnNlbGVjdGVkSW5kZXhdKSAhPT0gcHJldmlvdXNTZWxlY3RlZFZhbHVlc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKHByZXZpb3VzU2VsZWN0ZWRWYWx1ZXMubGVuZ3RoIHx8IGVsZW1lbnQuc2VsZWN0ZWRJbmRleCA+PSAwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgY29uc2lzdGVuY3kgYmV0d2VlbiBtb2RlbCB2YWx1ZSBhbmQgc2VsZWN0ZWQgb3B0aW9uLlxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkcm9wZG93biB3YXMgY2hhbmdlZCBzbyB0aGF0IHNlbGVjdGlvbiBpcyBubyBsb25nZXIgdGhlIHNhbWUsXG4gICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSB2YWx1ZSBvciBzZWxlY3RlZE9wdGlvbnMgYmluZGluZy5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICBrby51dGlscy50cmlnZ2VyRXZlbnQoZWxlbWVudCwgXCJjaGFuZ2VcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBJRSBidWdcbiAgICAgICAga28udXRpbHMuZW5zdXJlU2VsZWN0RWxlbWVudElzUmVuZGVyZWRDb3JyZWN0bHkoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzU2Nyb2xsVG9wICYmIE1hdGguYWJzKHByZXZpb3VzU2Nyb2xsVG9wIC0gZWxlbWVudC5zY3JvbGxUb3ApID4gMjApXG4gICAgICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHByZXZpb3VzU2Nyb2xsVG9wO1xuICAgIH1cbn07XG5rby5iaW5kaW5nSGFuZGxlcnNbJ29wdGlvbnMnXS5vcHRpb25WYWx1ZURvbURhdGFLZXkgPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKTtcbmtvLmJpbmRpbmdIYW5kbGVyc1snc2VsZWN0ZWRPcHRpb25zJ10gPSB7XG4gICAgJ2FmdGVyJzogWydvcHRpb25zJywgJ2ZvcmVhY2gnXSxcbiAgICAnaW5pdCc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncykge1xuICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcImNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCksIHZhbHVlVG9Xcml0ZSA9IFtdO1xuICAgICAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJvcHRpb25cIiksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5zZWxlY3RlZClcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVUb1dyaXRlLnB1c2goa28uc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUobm9kZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBrby5leHByZXNzaW9uUmV3cml0aW5nLndyaXRlVmFsdWVUb1Byb3BlcnR5KHZhbHVlLCBhbGxCaW5kaW5ncywgJ3NlbGVjdGVkT3B0aW9ucycsIHZhbHVlVG9Xcml0ZSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIGlmIChrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCkgIT0gXCJzZWxlY3RcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZhbHVlcyBiaW5kaW5nIGFwcGxpZXMgb25seSB0byBTRUxFQ1QgZWxlbWVudHNcIik7XG5cbiAgICAgICAgdmFyIG5ld1ZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuICAgICAgICBpZiAobmV3VmFsdWUgJiYgdHlwZW9mIG5ld1ZhbHVlLmxlbmd0aCA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcIm9wdGlvblwiKSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBpc1NlbGVjdGVkID0ga28udXRpbHMuYXJyYXlJbmRleE9mKG5ld1ZhbHVlLCBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShub2RlKSkgPj0gMDtcbiAgICAgICAgICAgICAgICBrby51dGlscy5zZXRPcHRpb25Ob2RlU2VsZWN0aW9uU3RhdGUobm9kZSwgaXNTZWxlY3RlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5rby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzWydzZWxlY3RlZE9wdGlvbnMnXSA9IHRydWU7XG5rby5iaW5kaW5nSGFuZGxlcnNbJ3N0eWxlJ10gPSB7XG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpIHx8IHt9KTtcbiAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24oc3R5bGVOYW1lLCBzdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICBzdHlsZVZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShzdHlsZVZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKHN0eWxlVmFsdWUgPT09IG51bGwgfHwgc3R5bGVWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gRW1wdHkgc3RyaW5nIHJlbW92ZXMgdGhlIHZhbHVlLCB3aGVyZWFzIG51bGwvdW5kZWZpbmVkIGhhdmUgbm8gZWZmZWN0XG4gICAgICAgICAgICAgICAgc3R5bGVWYWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5rby5iaW5kaW5nSGFuZGxlcnNbJ3N1Ym1pdCddID0ge1xuICAgICdpbml0JzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWVBY2Nlc3NvcigpICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSB2YWx1ZSBmb3IgYSBzdWJtaXQgYmluZGluZyBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwic3VibWl0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZXJSZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlQWNjZXNzb3IoKTtcbiAgICAgICAgICAgIHRyeSB7IGhhbmRsZXJSZXR1cm5WYWx1ZSA9IHZhbHVlLmNhbGwoYmluZGluZ0NvbnRleHRbJyRkYXRhJ10sIGVsZW1lbnQpOyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlclJldHVyblZhbHVlICE9PSB0cnVlKSB7IC8vIE5vcm1hbGx5IHdlIHdhbnQgdG8gcHJldmVudCBkZWZhdWx0IGFjdGlvbi4gRGV2ZWxvcGVyIGNhbiBvdmVycmlkZSB0aGlzIGJlIGV4cGxpY2l0bHkgcmV0dXJuaW5nIHRydWUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdClcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xua28uYmluZGluZ0hhbmRsZXJzWyd0ZXh0J10gPSB7XG4gICAgJ2luaXQnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gUHJldmVudCBiaW5kaW5nIG9uIHRoZSBkeW5hbWljYWxseS1pbmplY3RlZCB0ZXh0IG5vZGUgKGFzIGRldmVsb3BlcnMgYXJlIHVubGlrZWx5IHRvIGV4cGVjdCB0aGF0LCBhbmQgaXQgaGFzIHNlY3VyaXR5IGltcGxpY2F0aW9ucykuXG4gICAgICAgIC8vIEl0IHNob3VsZCBhbHNvIG1ha2UgdGhpbmdzIGZhc3RlciwgYXMgd2Ugbm8gbG9uZ2VyIGhhdmUgdG8gY29uc2lkZXIgd2hldGhlciB0aGUgdGV4dCBub2RlIG1pZ2h0IGJlIGJpbmRhYmxlLlxuICAgICAgICByZXR1cm4geyAnY29udHJvbHNEZXNjZW5kYW50QmluZGluZ3MnOiB0cnVlIH07XG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAga28udXRpbHMuc2V0VGV4dENvbnRlbnQoZWxlbWVudCwgdmFsdWVBY2Nlc3NvcigpKTtcbiAgICB9XG59O1xua28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1sndGV4dCddID0gdHJ1ZTtcbihmdW5jdGlvbiAoKSB7XG5cbmlmICh3aW5kb3cgJiYgd2luZG93Lm5hdmlnYXRvcikge1xuICAgIHZhciBwYXJzZVZlcnNpb24gPSBmdW5jdGlvbiAobWF0Y2hlcykge1xuICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQobWF0Y2hlc1sxXSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRGV0ZWN0IHZhcmlvdXMgYnJvd3NlciB2ZXJzaW9ucyBiZWNhdXNlIHNvbWUgb2xkIHZlcnNpb25zIGRvbid0IGZ1bGx5IHN1cHBvcnQgdGhlICdpbnB1dCcgZXZlbnRcbiAgICB2YXIgb3BlcmFWZXJzaW9uID0gd2luZG93Lm9wZXJhICYmIHdpbmRvdy5vcGVyYS52ZXJzaW9uICYmIHBhcnNlSW50KHdpbmRvdy5vcGVyYS52ZXJzaW9uKCkpLFxuICAgICAgICB1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgc2FmYXJpVmVyc2lvbiA9IHBhcnNlVmVyc2lvbih1c2VyQWdlbnQubWF0Y2goL14oPzooPyFjaHJvbWUpLikqdmVyc2lvblxcLyhbXiBdKikgc2FmYXJpL2kpKSxcbiAgICAgICAgZmlyZWZveFZlcnNpb24gPSBwYXJzZVZlcnNpb24odXNlckFnZW50Lm1hdGNoKC9GaXJlZm94XFwvKFteIF0qKS8pKTtcbn1cblxuLy8gSUUgOCBhbmQgOSBoYXZlIGJ1Z3MgdGhhdCBwcmV2ZW50IHRoZSBub3JtYWwgZXZlbnRzIGZyb20gZmlyaW5nIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4vLyBCdXQgaXQgZG9lcyBmaXJlIHRoZSAnc2VsZWN0aW9uY2hhbmdlJyBldmVudCBvbiBtYW55IG9mIHRob3NlLCBwcmVzdW1hYmx5IGJlY2F1c2UgdGhlXG4vLyBjdXJzb3IgaXMgbW92aW5nIGFuZCB0aGF0IGNvdW50cyBhcyB0aGUgc2VsZWN0aW9uIGNoYW5naW5nLiBUaGUgJ3NlbGVjdGlvbmNoYW5nZScgZXZlbnQgaXNcbi8vIGZpcmVkIGF0IHRoZSBkb2N1bWVudCBsZXZlbCBvbmx5IGFuZCBkb2Vzbid0IGRpcmVjdGx5IGluZGljYXRlIHdoaWNoIGVsZW1lbnQgY2hhbmdlZC4gV2Vcbi8vIHNldCB1cCBqdXN0IG9uZSBldmVudCBoYW5kbGVyIGZvciB0aGUgZG9jdW1lbnQgYW5kIHVzZSAnYWN0aXZlRWxlbWVudCcgdG8gZGV0ZXJtaW5lIHdoaWNoXG4vLyBlbGVtZW50IHdhcyBjaGFuZ2VkLlxuaWYgKGtvLnV0aWxzLmllVmVyc2lvbiA8IDEwKSB7XG4gICAgdmFyIHNlbGVjdGlvbkNoYW5nZVJlZ2lzdGVyZWROYW1lID0ga28udXRpbHMuZG9tRGF0YS5uZXh0S2V5KCksXG4gICAgICAgIHNlbGVjdGlvbkNoYW5nZUhhbmRsZXJOYW1lID0ga28udXRpbHMuZG9tRGF0YS5uZXh0S2V5KCk7XG4gICAgdmFyIHNlbGVjdGlvbkNoYW5nZUhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5hY3RpdmVFbGVtZW50LFxuICAgICAgICAgICAgaGFuZGxlciA9IHRhcmdldCAmJiBrby51dGlscy5kb21EYXRhLmdldCh0YXJnZXQsIHNlbGVjdGlvbkNoYW5nZUhhbmRsZXJOYW1lKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgcmVnaXN0ZXJGb3JTZWxlY3Rpb25DaGFuZ2VFdmVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBoYW5kbGVyKSB7XG4gICAgICAgIHZhciBvd25lckRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFrby51dGlscy5kb21EYXRhLmdldChvd25lckRvYywgc2VsZWN0aW9uQ2hhbmdlUmVnaXN0ZXJlZE5hbWUpKSB7XG4gICAgICAgICAgICBrby51dGlscy5kb21EYXRhLnNldChvd25lckRvYywgc2VsZWN0aW9uQ2hhbmdlUmVnaXN0ZXJlZE5hbWUsIHRydWUpO1xuICAgICAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIob3duZXJEb2MsICdzZWxlY3Rpb25jaGFuZ2UnLCBzZWxlY3Rpb25DaGFuZ2VIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBrby51dGlscy5kb21EYXRhLnNldChlbGVtZW50LCBzZWxlY3Rpb25DaGFuZ2VIYW5kbGVyTmFtZSwgaGFuZGxlcik7XG4gICAgfTtcbn1cblxua28uYmluZGluZ0hhbmRsZXJzWyd0ZXh0SW5wdXQnXSA9IHtcbiAgICAnaW5pdCc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncykge1xuXG4gICAgICAgIHZhciBwcmV2aW91c0VsZW1lbnRWYWx1ZSA9IGVsZW1lbnQudmFsdWUsXG4gICAgICAgICAgICB0aW1lb3V0SGFuZGxlLFxuICAgICAgICAgICAgZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQ7XG5cbiAgICAgICAgdmFyIHVwZGF0ZU1vZGVsID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICAgICAgICBlbGVtZW50VmFsdWVCZWZvcmVFdmVudCA9IHRpbWVvdXRIYW5kbGUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIHZhciBlbGVtZW50VmFsdWUgPSBlbGVtZW50LnZhbHVlO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudFZhbHVlICE9PSBlbGVtZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyBQcm92aWRlIGEgd2F5IGZvciB0ZXN0cyB0byBrbm93IGV4YWN0bHkgd2hpY2ggZXZlbnQgd2FzIHByb2Nlc3NlZFxuICAgICAgICAgICAgICAgIGlmIChERUJVRyAmJiBldmVudCkgZWxlbWVudFsnX2tvX3RleHRJbnB1dFByb2Nlc3NlZEV2ZW50J10gPSBldmVudC50eXBlO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudFZhbHVlID0gZWxlbWVudFZhbHVlO1xuICAgICAgICAgICAgICAgIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcud3JpdGVWYWx1ZVRvUHJvcGVydHkodmFsdWVBY2Nlc3NvcigpLCBhbGxCaW5kaW5ncywgJ3RleHRJbnB1dCcsIGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGRlZmVyVXBkYXRlTW9kZWwgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghdGltZW91dEhhbmRsZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBlbGVtZW50VmFsdWVCZWZvcmVFdmVudCB2YXJpYWJsZSBpcyBzZXQgKm9ubHkqIGR1cmluZyB0aGUgYnJpZWYgZ2FwIGJldHdlZW4gYW5cbiAgICAgICAgICAgICAgICAvLyBldmVudCBmaXJpbmcgYW5kIHRoZSB1cGRhdGVNb2RlbCBmdW5jdGlvbiBydW5uaW5nLiBUaGlzIGFsbG93cyB1cyB0byBpZ25vcmUgbW9kZWxcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIHRoYXQgYXJlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBlbGVtZW50LCB1c3VhbGx5IGR1ZSB0byB0ZWNobmlxdWVzXG4gICAgICAgICAgICAgICAgLy8gc3VjaCBhcyByYXRlTGltaXQuIFN1Y2ggdXBkYXRlcywgaWYgbm90IGlnbm9yZWQsIGNhbiBjYXVzZSBrZXlzdHJva2VzIHRvIGJlIGxvc3QuXG4gICAgICAgICAgICAgICAgZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQgPSBlbGVtZW50LnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gREVCVUcgPyB1cGRhdGVNb2RlbC5iaW5kKGVsZW1lbnQsIHt0eXBlOiBldmVudC50eXBlfSkgOiB1cGRhdGVNb2RlbDtcbiAgICAgICAgICAgICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChoYW5kbGVyLCA0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgdXBkYXRlVmlldyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtb2RlbFZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuXG4gICAgICAgICAgICBpZiAobW9kZWxWYWx1ZSA9PT0gbnVsbCB8fCBtb2RlbFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFZhbHVlID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50VmFsdWVCZWZvcmVFdmVudCAhPT0gdW5kZWZpbmVkICYmIG1vZGVsVmFsdWUgPT09IGVsZW1lbnRWYWx1ZUJlZm9yZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCh1cGRhdGVWaWV3LCA0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZWxlbWVudCBvbmx5IGlmIHRoZSBlbGVtZW50IGFuZCBtb2RlbCBhcmUgZGlmZmVyZW50LiBPbiBzb21lIGJyb3dzZXJzLCB1cGRhdGluZyB0aGUgdmFsdWVcbiAgICAgICAgICAgIC8vIHdpbGwgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0LCB3aGljaCB3b3VsZCBiZSBiYWQgd2hpbGUgdGhlIHVzZXIgaXMgdHlwaW5nLlxuICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUgIT09IG1vZGVsVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRWYWx1ZSA9IG1vZGVsVmFsdWU7ICAvLyBNYWtlIHN1cmUgd2UgaWdub3JlIGV2ZW50cyAocHJvcGVydHljaGFuZ2UpIHRoYXQgcmVzdWx0IGZyb20gdXBkYXRpbmcgdGhlIHZhbHVlXG4gICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IG1vZGVsVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIG9uRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoREVCVUcgJiYga28uYmluZGluZ0hhbmRsZXJzWyd0ZXh0SW5wdXQnXVsnX2ZvcmNlVXBkYXRlT24nXSkge1xuICAgICAgICAgICAgLy8gUHJvdmlkZSBhIHdheSBmb3IgdGVzdHMgdG8gc3BlY2lmeSBleGFjdGx5IHdoaWNoIGV2ZW50cyBhcmUgYm91bmRcbiAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5Rm9yRWFjaChrby5iaW5kaW5nSGFuZGxlcnNbJ3RleHRJbnB1dCddWydfZm9yY2VVcGRhdGVPbiddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnROYW1lLnNsaWNlKDAsNSkgPT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KGV2ZW50TmFtZS5zbGljZSg1KSwgZGVmZXJVcGRhdGVNb2RlbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb25FdmVudChldmVudE5hbWUsIHVwZGF0ZU1vZGVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChrby51dGlscy5pZVZlcnNpb24gPCAxMCkge1xuICAgICAgICAgICAgICAgIC8vIEludGVybmV0IEV4cGxvcmVyIDw9IDggZG9lc24ndCBzdXBwb3J0IHRoZSAnaW5wdXQnIGV2ZW50LCBidXQgZG9lcyBpbmNsdWRlICdwcm9wZXJ0eWNoYW5nZScgdGhhdCBmaXJlcyB3aGVuZXZlclxuICAgICAgICAgICAgICAgIC8vIGFueSBwcm9wZXJ0eSBvZiBhbiBlbGVtZW50IGNoYW5nZXMuIFVubGlrZSAnaW5wdXQnLCBpdCBhbHNvIGZpcmVzIGlmIGEgcHJvcGVydHkgaXMgY2hhbmdlZCBmcm9tIEphdmFTY3JpcHQgY29kZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgdGhhdCdzIGFuIGFjY2VwdGFibGUgY29tcHJvbWlzZSBmb3IgdGhpcyBiaW5kaW5nLiBJRSA5IGRvZXMgc3VwcG9ydCAnaW5wdXQnLCBidXQgc2luY2UgaXQgZG9lc24ndCBmaXJlIGl0XG4gICAgICAgICAgICAgICAgLy8gd2hlbiB1c2luZyBhdXRvY29tcGxldGUsIHdlJ2xsIHVzZSAncHJvcGVydHljaGFuZ2UnIGZvciBpdCBhbHNvLlxuICAgICAgICAgICAgICAgIG9uRXZlbnQoJ3Byb3BlcnR5Y2hhbmdlJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnByb3BlcnR5TmFtZSA9PT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTW9kZWwoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoa28udXRpbHMuaWVWZXJzaW9uID09IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSUUgOCBoYXMgYSBidWcgd2hlcmUgaXQgZmFpbHMgdG8gZmlyZSAncHJvcGVydHljaGFuZ2UnIG9uIHRoZSBmaXJzdCB1cGRhdGUgZm9sbG93aW5nIGEgdmFsdWUgY2hhbmdlIGZyb21cbiAgICAgICAgICAgICAgICAgICAgLy8gSmF2YVNjcmlwdCBjb2RlLiBJdCBhbHNvIGRvZXNuJ3QgZmlyZSBpZiB5b3UgY2xlYXIgdGhlIGVudGlyZSB2YWx1ZS4gVG8gZml4IHRoaXMsIHdlIGJpbmQgdG8gdGhlIGZvbGxvd2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgdG9vLlxuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdrZXl1cCcsIHVwZGF0ZU1vZGVsKTsgICAgICAvLyBBIHNpbmdsZSBrZXlzdG9rZVxuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdrZXlkb3duJywgdXBkYXRlTW9kZWwpOyAgICAvLyBUaGUgZmlyc3QgY2hhcmFjdGVyIHdoZW4gYSBrZXkgaXMgaGVsZCBkb3duXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrby51dGlscy5pZVZlcnNpb24gPj0gOCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciA5IGRvZXNuJ3QgZmlyZSB0aGUgJ2lucHV0JyBldmVudCB3aGVuIGRlbGV0aW5nIHRleHQsIGluY2x1ZGluZyB1c2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYmFja3NwYWNlLCBkZWxldGUsIG9yIGN0cmwteCBrZXlzLCBjbGlja2luZyB0aGUgJ3gnIHRvIGNsZWFyIHRoZSBpbnB1dCwgZHJhZ2dpbmcgdGV4dFxuICAgICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgdGhlIGZpZWxkLCBhbmQgY3V0dGluZyBvciBkZWxldGluZyB0ZXh0IHVzaW5nIHRoZSBjb250ZXh0IG1lbnUuICdzZWxlY3Rpb25jaGFuZ2UnXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBkZXRlY3QgYWxsIG9mIHRob3NlIGV4Y2VwdCBkcmFnZ2luZyB0ZXh0IG91dCBvZiB0aGUgZmllbGQsIGZvciB3aGljaCB3ZSB1c2UgJ2RyYWdlbmQnLlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgYWxzbyBuZWVkZWQgaW4gSUU4IGJlY2F1c2Ugb2YgdGhlIGJ1ZyBkZXNjcmliZWQgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRm9yU2VsZWN0aW9uQ2hhbmdlRXZlbnQoZWxlbWVudCwgdXBkYXRlTW9kZWwpOyAgLy8gJ3NlbGVjdGlvbmNoYW5nZScgY292ZXJzIGN1dCwgcGFzdGUsIGRyb3AsIGRlbGV0ZSwgZXRjLlxuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdkcmFnZW5kJywgZGVmZXJVcGRhdGVNb2RlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBbGwgb3RoZXIgc3VwcG9ydGVkIGJyb3dzZXJzIHN1cHBvcnQgdGhlICdpbnB1dCcgZXZlbnQsIHdoaWNoIGZpcmVzIHdoZW5ldmVyIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50IGlzIGNoYW5nZWRcbiAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSB1c2VyIGludGVyZmFjZS5cbiAgICAgICAgICAgICAgICBvbkV2ZW50KCdpbnB1dCcsIHVwZGF0ZU1vZGVsKTtcblxuICAgICAgICAgICAgICAgIGlmIChzYWZhcmlWZXJzaW9uIDwgNSAmJiBrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCkgPT09IFwidGV4dGFyZWFcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBTYWZhcmkgPDUgZG9lc24ndCBmaXJlIHRoZSAnaW5wdXQnIGV2ZW50IGZvciA8dGV4dGFyZWE+IGVsZW1lbnRzIChpdCBkb2VzIGZpcmUgJ3RleHRJbnB1dCdcbiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG9ubHkgd2hlbiB0eXBpbmcpLiBTbyB3ZSdsbCBqdXN0IGNhdGNoIGFzIG11Y2ggYXMgd2UgY2FuIHdpdGgga2V5ZG93biwgY3V0LCBhbmQgcGFzdGUuXG4gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoJ2tleWRvd24nLCBkZWZlclVwZGF0ZU1vZGVsKTtcbiAgICAgICAgICAgICAgICAgICAgb25FdmVudCgncGFzdGUnLCBkZWZlclVwZGF0ZU1vZGVsKTtcbiAgICAgICAgICAgICAgICAgICAgb25FdmVudCgnY3V0JywgZGVmZXJVcGRhdGVNb2RlbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcGVyYVZlcnNpb24gPCAxMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBPcGVyYSAxMCBkb2Vzbid0IGFsd2F5cyBmaXJlIHRoZSAnaW5wdXQnIGV2ZW50IGZvciBjdXQsIHBhc3RlLCB1bmRvICYgZHJvcCBvcGVyYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4gdHJ5IHRvIGNhdGNoIHNvbWUgb2YgdGhvc2UgdXNpbmcgJ2tleWRvd24nLlxuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdrZXlkb3duJywgZGVmZXJVcGRhdGVNb2RlbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJlZm94VmVyc2lvbiA8IDQuMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaXJlZm94IDw9IDMuNiBkb2Vzbid0IGZpcmUgdGhlICdpbnB1dCcgZXZlbnQgd2hlbiB0ZXh0IGlzIGZpbGxlZCBpbiB0aHJvdWdoIGF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdET01BdXRvQ29tcGxldGUnLCB1cGRhdGVNb2RlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRmlyZWZveCA8PTMuNSBkb2Vzbid0IGZpcmUgdGhlICdpbnB1dCcgZXZlbnQgd2hlbiB0ZXh0IGlzIGRyb3BwZWQgaW50byB0aGUgaW5wdXQuXG4gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoJ2RyYWdkcm9wJywgdXBkYXRlTW9kZWwpOyAgICAgICAvLyA8My41XG4gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoJ2Ryb3AnLCB1cGRhdGVNb2RlbCk7ICAgICAgICAgICAvLyAzLjVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCaW5kIHRvIHRoZSBjaGFuZ2UgZXZlbnQgc28gdGhhdCB3ZSBjYW4gY2F0Y2ggcHJvZ3JhbW1hdGljIHVwZGF0ZXMgb2YgdGhlIHZhbHVlIHRoYXQgZmlyZSB0aGlzIGV2ZW50LlxuICAgICAgICBvbkV2ZW50KCdjaGFuZ2UnLCB1cGRhdGVNb2RlbCk7XG5cbiAgICAgICAga28uY29tcHV0ZWQodXBkYXRlVmlldywgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IGVsZW1lbnQgfSk7XG4gICAgfVxufTtcbmtvLmV4cHJlc3Npb25SZXdyaXRpbmcudHdvV2F5QmluZGluZ3NbJ3RleHRJbnB1dCddID0gdHJ1ZTtcblxuLy8gdGV4dGlucHV0IGlzIGFuIGFsaWFzIGZvciB0ZXh0SW5wdXRcbmtvLmJpbmRpbmdIYW5kbGVyc1sndGV4dGlucHV0J10gPSB7XG4gICAgLy8gcHJlcHJvY2VzcyBpcyB0aGUgb25seSB3YXkgdG8gc2V0IHVwIGEgZnVsbCBhbGlhc1xuICAgICdwcmVwcm9jZXNzJzogZnVuY3Rpb24gKHZhbHVlLCBuYW1lLCBhZGRCaW5kaW5nKSB7XG4gICAgICAgIGFkZEJpbmRpbmcoJ3RleHRJbnB1dCcsIHZhbHVlKTtcbiAgICB9XG59O1xuXG59KSgpO2tvLmJpbmRpbmdIYW5kbGVyc1sndW5pcXVlTmFtZSddID0ge1xuICAgICdpbml0JzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgaWYgKHZhbHVlQWNjZXNzb3IoKSkge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBcImtvX3VuaXF1ZV9cIiArICgrK2tvLmJpbmRpbmdIYW5kbGVyc1sndW5pcXVlTmFtZSddLmN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICBrby51dGlscy5zZXRFbGVtZW50TmFtZShlbGVtZW50LCBuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5rby5iaW5kaW5nSGFuZGxlcnNbJ3VuaXF1ZU5hbWUnXS5jdXJyZW50SW5kZXggPSAwO1xua28uYmluZGluZ0hhbmRsZXJzWyd2YWx1ZSddID0ge1xuICAgICdhZnRlcic6IFsnb3B0aW9ucycsICdmb3JlYWNoJ10sXG4gICAgJ2luaXQnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MpIHtcbiAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGJpbmRpbmcgaXMgcGxhY2VkIG9uIGEgcmFkaW8vY2hlY2tib3gsIHRoZW4ganVzdCBwYXNzIHRocm91Z2ggdG8gY2hlY2tlZFZhbHVlIGFuZCBxdWl0XG4gICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgKGVsZW1lbnQudHlwZSA9PSBcImNoZWNrYm94XCIgfHwgZWxlbWVudC50eXBlID09IFwicmFkaW9cIikpIHtcbiAgICAgICAgICAgIGtvLmFwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZShlbGVtZW50LCB7ICdjaGVja2VkVmFsdWUnOiB2YWx1ZUFjY2Vzc29yIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWx3YXlzIGNhdGNoIFwiY2hhbmdlXCIgZXZlbnQ7IHBvc3NpYmx5IG90aGVyIGV2ZW50cyB0b28gaWYgYXNrZWRcbiAgICAgICAgdmFyIGV2ZW50c1RvQ2F0Y2ggPSBbXCJjaGFuZ2VcIl07XG4gICAgICAgIHZhciByZXF1ZXN0ZWRFdmVudHNUb0NhdGNoID0gYWxsQmluZGluZ3MuZ2V0KFwidmFsdWVVcGRhdGVcIik7XG4gICAgICAgIHZhciBwcm9wZXJ0eUNoYW5nZWRGaXJlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQgPSBudWxsO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRFdmVudHNUb0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3RlZEV2ZW50c1RvQ2F0Y2ggPT0gXCJzdHJpbmdcIikgLy8gQWxsb3cgYm90aCBpbmRpdmlkdWFsIGV2ZW50IG5hbWVzLCBhbmQgYXJyYXlzIG9mIGV2ZW50IG5hbWVzXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkRXZlbnRzVG9DYXRjaCA9IFtyZXF1ZXN0ZWRFdmVudHNUb0NhdGNoXTtcbiAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5UHVzaEFsbChldmVudHNUb0NhdGNoLCByZXF1ZXN0ZWRFdmVudHNUb0NhdGNoKTtcbiAgICAgICAgICAgIGV2ZW50c1RvQ2F0Y2ggPSBrby51dGlscy5hcnJheUdldERpc3RpbmN0VmFsdWVzKGV2ZW50c1RvQ2F0Y2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHZhbHVlVXBkYXRlSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgcHJvcGVydHlDaGFuZ2VkRmlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBtb2RlbFZhbHVlID0gdmFsdWVBY2Nlc3NvcigpO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRWYWx1ZSA9IGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQpO1xuICAgICAgICAgICAga28uZXhwcmVzc2lvblJld3JpdGluZy53cml0ZVZhbHVlVG9Qcm9wZXJ0eShtb2RlbFZhbHVlLCBhbGxCaW5kaW5ncywgJ3ZhbHVlJywgZWxlbWVudFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZVNhbmRlcnNvbi9rbm9ja291dC9pc3N1ZXMvMTIyXG4gICAgICAgIC8vIElFIGRvZXNuJ3QgZmlyZSBcImNoYW5nZVwiIGV2ZW50cyBvbiB0ZXh0Ym94ZXMgaWYgdGhlIHVzZXIgc2VsZWN0cyBhIHZhbHVlIGZyb20gaXRzIGF1dG9jb21wbGV0ZSBsaXN0XG4gICAgICAgIHZhciBpZUF1dG9Db21wbGV0ZUhhY2tOZWVkZWQgPSBrby51dGlscy5pZVZlcnNpb24gJiYgZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIGVsZW1lbnQudHlwZSA9PSBcInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudC5hdXRvY29tcGxldGUgIT0gXCJvZmZcIiAmJiAoIWVsZW1lbnQuZm9ybSB8fCBlbGVtZW50LmZvcm0uYXV0b2NvbXBsZXRlICE9IFwib2ZmXCIpO1xuICAgICAgICBpZiAoaWVBdXRvQ29tcGxldGVIYWNrTmVlZGVkICYmIGtvLnV0aWxzLmFycmF5SW5kZXhPZihldmVudHNUb0NhdGNoLCBcInByb3BlcnR5Y2hhbmdlXCIpID09IC0xKSB7XG4gICAgICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcInByb3BlcnR5Y2hhbmdlXCIsIGZ1bmN0aW9uICgpIHsgcHJvcGVydHlDaGFuZ2VkRmlyZWQgPSB0cnVlIH0pO1xuICAgICAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgXCJmb2N1c1wiLCBmdW5jdGlvbiAoKSB7IHByb3BlcnR5Q2hhbmdlZEZpcmVkID0gZmFsc2UgfSk7XG4gICAgICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcImJsdXJcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Q2hhbmdlZEZpcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlVXBkYXRlSGFuZGxlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGV2ZW50c1RvQ2F0Y2gsIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgICAgICAgLy8gVGhlIHN5bnRheCBcImFmdGVyPGV2ZW50bmFtZT5cIiBtZWFucyBcInJ1biB0aGUgaGFuZGxlciBhc3luY2hyb25vdXNseSBhZnRlciB0aGUgZXZlbnRcIlxuICAgICAgICAgICAgLy8gVGhpcyBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCB0byBjYXRjaCBcImtleWRvd25cIiBldmVudHMgYWZ0ZXIgdGhlIGJyb3dzZXIgaGFzIHVwZGF0ZWQgdGhlIGNvbnRyb2xcbiAgICAgICAgICAgIC8vIChvdGhlcndpc2UsIGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKHRoaXMpIHdpbGwgcmVjZWl2ZSB0aGUgY29udHJvbCdzIHZhbHVlICpiZWZvcmUqIHRoZSBrZXkgZXZlbnQpXG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IHZhbHVlVXBkYXRlSGFuZGxlcjtcbiAgICAgICAgICAgIGlmIChrby51dGlscy5zdHJpbmdTdGFydHNXaXRoKGV2ZW50TmFtZSwgXCJhZnRlclwiKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVsZW1lbnRWYWx1ZUJlZm9yZUV2ZW50IHZhcmlhYmxlIGlzIG5vbi1udWxsICpvbmx5KiBkdXJpbmcgdGhlIGJyaWVmIGdhcCBiZXR3ZWVuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEga2V5WCBldmVudCBmaXJpbmcgYW5kIHRoZSB2YWx1ZVVwZGF0ZUhhbmRsZXIgcnVubmluZywgd2hpY2ggaXMgc2NoZWR1bGVkIHRvIGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZWFybGllc3QgYXN5bmNocm9ub3VzIG9wcG9ydHVuaXR5LiBXZSBzdG9yZSB0aGlzIHRlbXBvcmFyeSBpbmZvcm1hdGlvbiBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmLCBiZXR3ZWVuIGtleVggYW5kIHZhbHVlVXBkYXRlSGFuZGxlciwgdGhlIHVuZGVybHlpbmcgbW9kZWwgdmFsdWUgY2hhbmdlcyBzZXBhcmF0ZWx5LFxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gb3ZlcndyaXRlIHRoYXQgbW9kZWwgdmFsdWUgY2hhbmdlIHdpdGggdGhlIHZhbHVlIHRoZSB1c2VyIGp1c3QgdHlwZWQuIE90aGVyd2lzZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gdGVjaG5pcXVlcyBsaWtlIHJhdGVMaW1pdCBjYW4gdHJpZ2dlciBtb2RlbCBjaGFuZ2VzIGF0IGNyaXRpY2FsIG1vbWVudHMgdGhhdCB3aWxsXG4gICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRoZSB1c2VyJ3MgaW5wdXRzLCBjYXVzaW5nIGtleXN0cm9rZXMgdG8gYmUgbG9zdC5cbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQgPSBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCh2YWx1ZVVwZGF0ZUhhbmRsZXIsIDApO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZXZlbnROYW1lID0gZXZlbnROYW1lLnN1YnN0cmluZyhcImFmdGVyXCIubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciB1cGRhdGVGcm9tTW9kZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSk7XG4gICAgICAgICAgICB2YXIgZWxlbWVudFZhbHVlID0ga28uc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUoZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50VmFsdWVCZWZvcmVFdmVudCAhPT0gbnVsbCAmJiBuZXdWYWx1ZSA9PT0gZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHVwZGF0ZUZyb21Nb2RlbCwgMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdmFsdWVIYXNDaGFuZ2VkID0gKG5ld1ZhbHVlICE9PSBlbGVtZW50VmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWVIYXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtvLnV0aWxzLnRhZ05hbWVMb3dlcihlbGVtZW50KSA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWxsb3dVbnNldCA9IGFsbEJpbmRpbmdzLmdldCgndmFsdWVBbGxvd1Vuc2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBseVZhbHVlQWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAga28uc2VsZWN0RXh0ZW5zaW9ucy53cml0ZVZhbHVlKGVsZW1lbnQsIG5ld1ZhbHVlLCBhbGxvd1Vuc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlWYWx1ZUFjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghYWxsb3dVbnNldCAmJiBuZXdWYWx1ZSAhPT0ga28uc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHlvdSB0cnkgdG8gc2V0IGEgbW9kZWwgdmFsdWUgdGhhdCBjYW4ndCBiZSByZXByZXNlbnRlZCBpbiBhbiBhbHJlYWR5LXBvcHVsYXRlZCBkcm9wZG93biwgcmVqZWN0IHRoYXQgY2hhbmdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB5b3UncmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBhIG1vZGVsIHZhbHVlIHRoYXQgZGlzYWdyZWVzIHdpdGggYSB2aXNpYmxlIFVJIHNlbGVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uaWdub3JlKGtvLnV0aWxzLnRyaWdnZXJFdmVudCwgbnVsbCwgW2VsZW1lbnQsIFwiY2hhbmdlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIElFNiBidWc6IEl0IHdvbid0IHJlbGlhYmx5IGFwcGx5IHZhbHVlcyB0byBTRUxFQ1Qgbm9kZXMgZHVyaW5nIHRoZSBzYW1lIGV4ZWN1dGlvbiB0aHJlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0IGFmdGVyIHlvdSd2ZSBjaGFuZ2VkIHRoZSBzZXQgb2YgT1BUSU9OIG5vZGVzIG9uIGl0LiBTbyBmb3IgdGhhdCBub2RlIHR5cGUsIHdlJ2xsIHNjaGVkdWxlIGEgc2Vjb25kIHRocmVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYXBwbHkgdGhlIHZhbHVlIGFzIHdlbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGFwcGx5VmFsdWVBY3Rpb24sIDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAga28uc2VsZWN0RXh0ZW5zaW9ucy53cml0ZVZhbHVlKGVsZW1lbnQsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAga28uY29tcHV0ZWQodXBkYXRlRnJvbU1vZGVsLCBudWxsLCB7IGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogZWxlbWVudCB9KTtcbiAgICB9LFxuICAgICd1cGRhdGUnOiBmdW5jdGlvbigpIHt9IC8vIEtlZXAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggY29kZSB0aGF0IG1heSBoYXZlIHdyYXBwZWQgdmFsdWUgYmluZGluZ1xufTtcbmtvLmV4cHJlc3Npb25SZXdyaXRpbmcudHdvV2F5QmluZGluZ3NbJ3ZhbHVlJ10gPSB0cnVlO1xua28uYmluZGluZ0hhbmRsZXJzWyd2aXNpYmxlJ10gPSB7XG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcbiAgICAgICAgdmFyIGlzQ3VycmVudGx5VmlzaWJsZSA9ICEoZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09IFwibm9uZVwiKTtcbiAgICAgICAgaWYgKHZhbHVlICYmICFpc0N1cnJlbnRseVZpc2libGUpXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgICAgICBlbHNlIGlmICgoIXZhbHVlKSAmJiBpc0N1cnJlbnRseVZpc2libGUpXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB9XG59O1xuLy8gJ2NsaWNrJyBpcyBqdXN0IGEgc2hvcnRoYW5kIGZvciB0aGUgdXN1YWwgZnVsbC1sZW5ndGggZXZlbnQ6e2NsaWNrOmhhbmRsZXJ9XG5tYWtlRXZlbnRIYW5kbGVyU2hvcnRjdXQoJ2NsaWNrJyk7XG4vLyBJZiB5b3Ugd2FudCB0byBtYWtlIGEgY3VzdG9tIHRlbXBsYXRlIGVuZ2luZSxcbi8vXG4vLyBbMV0gSW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MgKGxpa2Uga28ubmF0aXZlVGVtcGxhdGVFbmdpbmUgZG9lcylcbi8vIFsyXSBPdmVycmlkZSAncmVuZGVyVGVtcGxhdGVTb3VyY2UnLCBzdXBwbHlpbmcgYSBmdW5jdGlvbiB3aXRoIHRoaXMgc2lnbmF0dXJlOlxuLy9cbi8vICAgICAgICBmdW5jdGlvbiAodGVtcGxhdGVTb3VyY2UsIGJpbmRpbmdDb250ZXh0LCBvcHRpb25zKSB7XG4vLyAgICAgICAgICAgIC8vIC0gdGVtcGxhdGVTb3VyY2UudGV4dCgpIGlzIHRoZSB0ZXh0IG9mIHRoZSB0ZW1wbGF0ZSB5b3Ugc2hvdWxkIHJlbmRlclxuLy8gICAgICAgICAgICAvLyAtIGJpbmRpbmdDb250ZXh0LiRkYXRhIGlzIHRoZSBkYXRhIHlvdSBzaG91bGQgcGFzcyBpbnRvIHRoZSB0ZW1wbGF0ZVxuLy8gICAgICAgICAgICAvLyAgIC0geW91IG1pZ2h0IGFsc28gd2FudCB0byBtYWtlIGJpbmRpbmdDb250ZXh0LiRwYXJlbnQsIGJpbmRpbmdDb250ZXh0LiRwYXJlbnRzLFxuLy8gICAgICAgICAgICAvLyAgICAgYW5kIGJpbmRpbmdDb250ZXh0LiRyb290IGF2YWlsYWJsZSBpbiB0aGUgdGVtcGxhdGUgdG9vXG4vLyAgICAgICAgICAgIC8vIC0gb3B0aW9ucyBnaXZlcyB5b3UgYWNjZXNzIHRvIGFueSBvdGhlciBwcm9wZXJ0aWVzIHNldCBvbiBcImRhdGEtYmluZDogeyB0ZW1wbGF0ZTogb3B0aW9ucyB9XCJcbi8vICAgICAgICAgICAgLy8gLSB0ZW1wbGF0ZURvY3VtZW50IGlzIHRoZSBkb2N1bWVudCBvYmplY3Qgb2YgdGhlIHRlbXBsYXRlXG4vLyAgICAgICAgICAgIC8vXG4vLyAgICAgICAgICAgIC8vIFJldHVybiB2YWx1ZTogYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4vLyAgICAgICAgfVxuLy9cbi8vIFszXSBPdmVycmlkZSAnY3JlYXRlSmF2YVNjcmlwdEV2YWx1YXRvckJsb2NrJywgc3VwcGx5aW5nIGEgZnVuY3Rpb24gd2l0aCB0aGlzIHNpZ25hdHVyZTpcbi8vXG4vLyAgICAgICAgZnVuY3Rpb24gKHNjcmlwdCkge1xuLy8gICAgICAgICAgICAvLyBSZXR1cm4gdmFsdWU6IFdoYXRldmVyIHN5bnRheCBtZWFucyBcIkV2YWx1YXRlIHRoZSBKYXZhU2NyaXB0IHN0YXRlbWVudCAnc2NyaXB0JyBhbmQgb3V0cHV0IHRoZSByZXN1bHRcIlxuLy8gICAgICAgICAgICAvLyAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUganF1ZXJ5LnRtcGwgdGVtcGxhdGUgZW5naW5lIGNvbnZlcnRzICdzb21lU2NyaXB0JyB0byAnJHsgc29tZVNjcmlwdCB9J1xuLy8gICAgICAgIH1cbi8vXG4vLyAgICAgVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3Ugd2FudCB0byBhbGxvdyBkYXRhLWJpbmQgYXR0cmlidXRlcyB0byByZWZlcmVuY2UgYXJiaXRyYXJ5IHRlbXBsYXRlIHZhcmlhYmxlcy5cbi8vICAgICBJZiB5b3UgZG9uJ3Qgd2FudCB0byBhbGxvdyB0aGF0LCB5b3UgY2FuIHNldCB0aGUgcHJvcGVydHkgJ2FsbG93VGVtcGxhdGVSZXdyaXRpbmcnIHRvIGZhbHNlIChsaWtlIGtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lIGRvZXMpXG4vLyAgICAgYW5kIHRoZW4geW91IGRvbid0IG5lZWQgdG8gb3ZlcnJpZGUgJ2NyZWF0ZUphdmFTY3JpcHRFdmFsdWF0b3JCbG9jaycuXG5cbmtvLnRlbXBsYXRlRW5naW5lID0gZnVuY3Rpb24gKCkgeyB9O1xuXG5rby50ZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGVbJ3JlbmRlclRlbXBsYXRlU291cmNlJ10gPSBmdW5jdGlvbiAodGVtcGxhdGVTb3VyY2UsIGJpbmRpbmdDb250ZXh0LCBvcHRpb25zLCB0ZW1wbGF0ZURvY3VtZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiT3ZlcnJpZGUgcmVuZGVyVGVtcGxhdGVTb3VyY2VcIik7XG59O1xuXG5rby50ZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGVbJ2NyZWF0ZUphdmFTY3JpcHRFdmFsdWF0b3JCbG9jayddID0gZnVuY3Rpb24gKHNjcmlwdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk92ZXJyaWRlIGNyZWF0ZUphdmFTY3JpcHRFdmFsdWF0b3JCbG9ja1wiKTtcbn07XG5cbmtvLnRlbXBsYXRlRW5naW5lLnByb3RvdHlwZVsnbWFrZVRlbXBsYXRlU291cmNlJ10gPSBmdW5jdGlvbih0ZW1wbGF0ZSwgdGVtcGxhdGVEb2N1bWVudCkge1xuICAgIC8vIE5hbWVkIHRlbXBsYXRlXG4gICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRlbXBsYXRlRG9jdW1lbnQgPSB0ZW1wbGF0ZURvY3VtZW50IHx8IGRvY3VtZW50O1xuICAgICAgICB2YXIgZWxlbSA9IHRlbXBsYXRlRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGVtcGxhdGUpO1xuICAgICAgICBpZiAoIWVsZW0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCB0ZW1wbGF0ZSB3aXRoIElEIFwiICsgdGVtcGxhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IGtvLnRlbXBsYXRlU291cmNlcy5kb21FbGVtZW50KGVsZW0pO1xuICAgIH0gZWxzZSBpZiAoKHRlbXBsYXRlLm5vZGVUeXBlID09IDEpIHx8ICh0ZW1wbGF0ZS5ub2RlVHlwZSA9PSA4KSkge1xuICAgICAgICAvLyBBbm9ueW1vdXMgdGVtcGxhdGVcbiAgICAgICAgcmV0dXJuIG5ldyBrby50ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzVGVtcGxhdGUodGVtcGxhdGUpO1xuICAgIH0gZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHRlbXBsYXRlIHR5cGU6IFwiICsgdGVtcGxhdGUpO1xufTtcblxua28udGVtcGxhdGVFbmdpbmUucHJvdG90eXBlWydyZW5kZXJUZW1wbGF0ZSddID0gZnVuY3Rpb24gKHRlbXBsYXRlLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgdGVtcGxhdGVEb2N1bWVudCkge1xuICAgIHZhciB0ZW1wbGF0ZVNvdXJjZSA9IHRoaXNbJ21ha2VUZW1wbGF0ZVNvdXJjZSddKHRlbXBsYXRlLCB0ZW1wbGF0ZURvY3VtZW50KTtcbiAgICByZXR1cm4gdGhpc1sncmVuZGVyVGVtcGxhdGVTb3VyY2UnXSh0ZW1wbGF0ZVNvdXJjZSwgYmluZGluZ0NvbnRleHQsIG9wdGlvbnMsIHRlbXBsYXRlRG9jdW1lbnQpO1xufTtcblxua28udGVtcGxhdGVFbmdpbmUucHJvdG90eXBlWydpc1RlbXBsYXRlUmV3cml0dGVuJ10gPSBmdW5jdGlvbiAodGVtcGxhdGUsIHRlbXBsYXRlRG9jdW1lbnQpIHtcbiAgICAvLyBTa2lwIHJld3JpdGluZyBpZiByZXF1ZXN0ZWRcbiAgICBpZiAodGhpc1snYWxsb3dUZW1wbGF0ZVJld3JpdGluZyddID09PSBmYWxzZSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXNbJ21ha2VUZW1wbGF0ZVNvdXJjZSddKHRlbXBsYXRlLCB0ZW1wbGF0ZURvY3VtZW50KVsnZGF0YSddKFwiaXNSZXdyaXR0ZW5cIik7XG59O1xuXG5rby50ZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGVbJ3Jld3JpdGVUZW1wbGF0ZSddID0gZnVuY3Rpb24gKHRlbXBsYXRlLCByZXdyaXRlckNhbGxiYWNrLCB0ZW1wbGF0ZURvY3VtZW50KSB7XG4gICAgdmFyIHRlbXBsYXRlU291cmNlID0gdGhpc1snbWFrZVRlbXBsYXRlU291cmNlJ10odGVtcGxhdGUsIHRlbXBsYXRlRG9jdW1lbnQpO1xuICAgIHZhciByZXdyaXR0ZW4gPSByZXdyaXRlckNhbGxiYWNrKHRlbXBsYXRlU291cmNlWyd0ZXh0J10oKSk7XG4gICAgdGVtcGxhdGVTb3VyY2VbJ3RleHQnXShyZXdyaXR0ZW4pO1xuICAgIHRlbXBsYXRlU291cmNlWydkYXRhJ10oXCJpc1Jld3JpdHRlblwiLCB0cnVlKTtcbn07XG5cbmtvLmV4cG9ydFN5bWJvbCgndGVtcGxhdGVFbmdpbmUnLCBrby50ZW1wbGF0ZUVuZ2luZSk7XG5cbmtvLnRlbXBsYXRlUmV3cml0aW5nID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWVtb2l6ZURhdGFCaW5kaW5nQXR0cmlidXRlU3ludGF4UmVnZXggPSAvKDwoW2Etel0rXFxkKikoPzpcXHMrKD8hZGF0YS1iaW5kXFxzKj1cXHMqKVthLXowLTlcXC1dKyg/Oj0oPzpcXFwiW15cXFwiXSpcXFwifFxcJ1teXFwnXSpcXCd8W14+XSopKT8pKlxccyspZGF0YS1iaW5kXFxzKj1cXHMqKFtcIiddKShbXFxzXFxTXSo/KVxcMy9naTtcbiAgICB2YXIgbWVtb2l6ZVZpcnR1YWxDb250YWluZXJCaW5kaW5nU3ludGF4UmVnZXggPSAvPCEtLVxccyprb1xcYlxccyooW1xcc1xcU10qPylcXHMqLS0+L2c7XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZURhdGFCaW5kVmFsdWVzRm9yUmV3cml0aW5nKGtleVZhbHVlQXJyYXkpIHtcbiAgICAgICAgdmFyIGFsbFZhbGlkYXRvcnMgPSBrby5leHByZXNzaW9uUmV3cml0aW5nLmJpbmRpbmdSZXdyaXRlVmFsaWRhdG9ycztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0ga2V5VmFsdWVBcnJheVtpXVsna2V5J107XG4gICAgICAgICAgICBpZiAoYWxsVmFsaWRhdG9ycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbGlkYXRvciA9IGFsbFZhbGlkYXRvcnNba2V5XTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsaWRhdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc3NpYmxlRXJyb3JNZXNzYWdlID0gdmFsaWRhdG9yKGtleVZhbHVlQXJyYXlbaV1bJ3ZhbHVlJ10pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zc2libGVFcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocG9zc2libGVFcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHRlbXBsYXRlIGVuZ2luZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSAnXCIgKyBrZXkgKyBcIicgYmluZGluZyB3aXRoaW4gaXRzIHRlbXBsYXRlc1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RNZW1vaXplZFRhZ1JlcGxhY2VtZW50KGRhdGFCaW5kQXR0cmlidXRlVmFsdWUsIHRhZ1RvUmV0YWluLCBub2RlTmFtZSwgdGVtcGxhdGVFbmdpbmUpIHtcbiAgICAgICAgdmFyIGRhdGFCaW5kS2V5VmFsdWVBcnJheSA9IGtvLmV4cHJlc3Npb25SZXdyaXRpbmcucGFyc2VPYmplY3RMaXRlcmFsKGRhdGFCaW5kQXR0cmlidXRlVmFsdWUpO1xuICAgICAgICB2YWxpZGF0ZURhdGFCaW5kVmFsdWVzRm9yUmV3cml0aW5nKGRhdGFCaW5kS2V5VmFsdWVBcnJheSk7XG4gICAgICAgIHZhciByZXdyaXR0ZW5EYXRhQmluZEF0dHJpYnV0ZVZhbHVlID0ga28uZXhwcmVzc2lvblJld3JpdGluZy5wcmVQcm9jZXNzQmluZGluZ3MoZGF0YUJpbmRLZXlWYWx1ZUFycmF5LCB7J3ZhbHVlQWNjZXNzb3JzJzp0cnVlfSk7XG5cbiAgICAgICAgLy8gRm9yIG5vIG9idmlvdXMgcmVhc29uLCBPcGVyYSBmYWlscyB0byBldmFsdWF0ZSByZXdyaXR0ZW5EYXRhQmluZEF0dHJpYnV0ZVZhbHVlIHVubGVzcyBpdCdzIHdyYXBwZWQgaW4gYW4gYWRkaXRpb25hbFxuICAgICAgICAvLyBhbm9ueW1vdXMgZnVuY3Rpb24sIGV2ZW4gdGhvdWdoIE9wZXJhJ3MgYnVpbHQtaW4gZGVidWdnZXIgY2FuIGV2YWx1YXRlIGl0IGFueXdheS4gTm8gb3RoZXIgYnJvd3NlciByZXF1aXJlcyB0aGlzXG4gICAgICAgIC8vIGV4dHJhIGluZGlyZWN0aW9uLlxuICAgICAgICB2YXIgYXBwbHlCaW5kaW5nc1RvTmV4dFNpYmxpbmdTY3JpcHQgPVxuICAgICAgICAgICAgXCJrby5fX3RyX2FtYnRucyhmdW5jdGlvbigkY29udGV4dCwkZWxlbWVudCl7cmV0dXJuKGZ1bmN0aW9uKCl7cmV0dXJueyBcIiArIHJld3JpdHRlbkRhdGFCaW5kQXR0cmlidXRlVmFsdWUgKyBcIiB9IH0pKCl9LCdcIiArIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKyBcIicpXCI7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZUVuZ2luZVsnY3JlYXRlSmF2YVNjcmlwdEV2YWx1YXRvckJsb2NrJ10oYXBwbHlCaW5kaW5nc1RvTmV4dFNpYmxpbmdTY3JpcHQpICsgdGFnVG9SZXRhaW47XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZW5zdXJlVGVtcGxhdGVJc1Jld3JpdHRlbjogZnVuY3Rpb24gKHRlbXBsYXRlLCB0ZW1wbGF0ZUVuZ2luZSwgdGVtcGxhdGVEb2N1bWVudCkge1xuICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUVuZ2luZVsnaXNUZW1wbGF0ZVJld3JpdHRlbiddKHRlbXBsYXRlLCB0ZW1wbGF0ZURvY3VtZW50KSlcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUVuZ2luZVsncmV3cml0ZVRlbXBsYXRlJ10odGVtcGxhdGUsIGZ1bmN0aW9uIChodG1sU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrby50ZW1wbGF0ZVJld3JpdGluZy5tZW1vaXplQmluZGluZ0F0dHJpYnV0ZVN5bnRheChodG1sU3RyaW5nLCB0ZW1wbGF0ZUVuZ2luZSk7XG4gICAgICAgICAgICAgICAgfSwgdGVtcGxhdGVEb2N1bWVudCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWVtb2l6ZUJpbmRpbmdBdHRyaWJ1dGVTeW50YXg6IGZ1bmN0aW9uIChodG1sU3RyaW5nLCB0ZW1wbGF0ZUVuZ2luZSkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWxTdHJpbmcucmVwbGFjZShtZW1vaXplRGF0YUJpbmRpbmdBdHRyaWJ1dGVTeW50YXhSZWdleCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3RNZW1vaXplZFRhZ1JlcGxhY2VtZW50KC8qIGRhdGFCaW5kQXR0cmlidXRlVmFsdWU6ICovIGFyZ3VtZW50c1s0XSwgLyogdGFnVG9SZXRhaW46ICovIGFyZ3VtZW50c1sxXSwgLyogbm9kZU5hbWU6ICovIGFyZ3VtZW50c1syXSwgdGVtcGxhdGVFbmdpbmUpO1xuICAgICAgICAgICAgfSkucmVwbGFjZShtZW1vaXplVmlydHVhbENvbnRhaW5lckJpbmRpbmdTeW50YXhSZWdleCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdE1lbW9pemVkVGFnUmVwbGFjZW1lbnQoLyogZGF0YUJpbmRBdHRyaWJ1dGVWYWx1ZTogKi8gYXJndW1lbnRzWzFdLCAvKiB0YWdUb1JldGFpbjogKi8gXCI8IS0tIGtvIC0tPlwiLCAvKiBub2RlTmFtZTogKi8gXCIjY29tbWVudFwiLCB0ZW1wbGF0ZUVuZ2luZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhcHBseU1lbW9pemVkQmluZGluZ3NUb05leHRTaWJsaW5nOiBmdW5jdGlvbiAoYmluZGluZ3MsIG5vZGVOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ga28ubWVtb2l6YXRpb24ubWVtb2l6ZShmdW5jdGlvbiAoZG9tTm9kZSwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZVRvQmluZCA9IGRvbU5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVUb0JpbmQgJiYgbm9kZVRvQmluZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBrby5hcHBseUJpbmRpbmdBY2Nlc3NvcnNUb05vZGUobm9kZVRvQmluZCwgYmluZGluZ3MsIGJpbmRpbmdDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn0pKCk7XG5cblxuLy8gRXhwb3J0ZWQgb25seSBiZWNhdXNlIGl0IGhhcyB0byBiZSByZWZlcmVuY2VkIGJ5IHN0cmluZyBsb29rdXAgZnJvbSB3aXRoaW4gcmV3cml0dGVuIHRlbXBsYXRlXG5rby5leHBvcnRTeW1ib2woJ19fdHJfYW1idG5zJywga28udGVtcGxhdGVSZXdyaXRpbmcuYXBwbHlNZW1vaXplZEJpbmRpbmdzVG9OZXh0U2libGluZyk7XG4oZnVuY3Rpb24oKSB7XG4gICAgLy8gQSB0ZW1wbGF0ZSBzb3VyY2UgcmVwcmVzZW50cyBhIHJlYWQvd3JpdGUgd2F5IG9mIGFjY2Vzc2luZyBhIHRlbXBsYXRlLiBUaGlzIGlzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgdGVtcGxhdGUgbG9hZGluZy9zYXZpbmdcbiAgICAvLyBsb2dpYyB0byBiZSBkdXBsaWNhdGVkIGluIGV2ZXJ5IHRlbXBsYXRlIGVuZ2luZSAoYW5kIG1lYW5zIHRoZXkgY2FuIGFsbCB3b3JrIHdpdGggYW5vbnltb3VzIHRlbXBsYXRlcywgZXRjLilcbiAgICAvL1xuICAgIC8vIFR3byBhcmUgcHJvdmlkZWQgYnkgZGVmYXVsdDpcbiAgICAvLyAgMS4ga28udGVtcGxhdGVTb3VyY2VzLmRvbUVsZW1lbnQgICAgICAgLSByZWFkcy93cml0ZXMgdGhlIHRleHQgY29udGVudCBvZiBhbiBhcmJpdHJhcnkgRE9NIGVsZW1lbnRcbiAgICAvLyAgMi4ga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c0VsZW1lbnQgLSB1c2VzIGtvLnV0aWxzLmRvbURhdGEgdG8gcmVhZC93cml0ZSB0ZXh0ICphc3NvY2lhdGVkKiB3aXRoIHRoZSBET00gZWxlbWVudCwgYnV0XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCByZWFkaW5nL3dyaXRpbmcgdGhlIGFjdHVhbCBlbGVtZW50IHRleHQgY29udGVudCwgc2luY2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlblxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIHJlbmRlcmVkIHRlbXBsYXRlIG91dHB1dC5cbiAgICAvLyBZb3UgY2FuIGltcGxlbWVudCB5b3VyIG93biB0ZW1wbGF0ZSBzb3VyY2UgaWYgeW91IHdhbnQgdG8gZmV0Y2gvc3RvcmUgdGVtcGxhdGVzIHNvbWV3aGVyZSBvdGhlciB0aGFuIGluIERPTSBlbGVtZW50cy5cbiAgICAvLyBUZW1wbGF0ZSBzb3VyY2VzIG5lZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczpcbiAgICAvLyAgIHRleHQoKSBcdFx0XHQtIHJldHVybnMgdGhlIHRlbXBsYXRlIHRleHQgZnJvbSB5b3VyIHN0b3JhZ2UgbG9jYXRpb25cbiAgICAvLyAgIHRleHQodmFsdWUpXHRcdC0gd3JpdGVzIHRoZSBzdXBwbGllZCB0ZW1wbGF0ZSB0ZXh0IHRvIHlvdXIgc3RvcmFnZSBsb2NhdGlvblxuICAgIC8vICAgZGF0YShrZXkpXHRcdFx0LSByZWFkcyB2YWx1ZXMgc3RvcmVkIHVzaW5nIGRhdGEoa2V5LCB2YWx1ZSkgLSBzZWUgYmVsb3dcbiAgICAvLyAgIGRhdGEoa2V5LCB2YWx1ZSlcdC0gYXNzb2NpYXRlcyBcInZhbHVlXCIgd2l0aCB0aGlzIHRlbXBsYXRlIGFuZCB0aGUga2V5IFwia2V5XCIuIElzIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb24gbGlrZSBcImlzUmV3cml0dGVuXCIuXG4gICAgLy9cbiAgICAvLyBPcHRpb25hbGx5LCB0ZW1wbGF0ZSBzb3VyY2VzIGNhbiBhbHNvIGhhdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6XG4gICAgLy8gICBub2RlcygpICAgICAgICAgICAgLSByZXR1cm5zIGEgRE9NIGVsZW1lbnQgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgdGhpcyB0ZW1wbGF0ZSwgd2hlcmUgYXZhaWxhYmxlXG4gICAgLy8gICBub2Rlcyh2YWx1ZSkgICAgICAgLSB3cml0ZXMgdGhlIGdpdmVuIERPTSBlbGVtZW50IHRvIHlvdXIgc3RvcmFnZSBsb2NhdGlvblxuICAgIC8vIElmIGEgRE9NIGVsZW1lbnQgaXMgYXZhaWxhYmxlIGZvciBhIGdpdmVuIHRlbXBsYXRlIHNvdXJjZSwgdGVtcGxhdGUgZW5naW5lcyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgaXQgaW4gcHJlZmVyZW5jZSBvdmVyIHRleHQoKVxuICAgIC8vIGZvciBpbXByb3ZlZCBzcGVlZC4gSG93ZXZlciwgYWxsIHRlbXBsYXRlU291cmNlcyBtdXN0IHN1cHBseSB0ZXh0KCkgZXZlbiBpZiB0aGV5IGRvbid0IHN1cHBseSBub2RlcygpLlxuICAgIC8vXG4gICAgLy8gT25jZSB5b3UndmUgaW1wbGVtZW50ZWQgYSB0ZW1wbGF0ZVNvdXJjZSwgbWFrZSB5b3VyIHRlbXBsYXRlIGVuZ2luZSB1c2UgaXQgYnkgc3ViY2xhc3Npbmcgd2hhdGV2ZXIgdGVtcGxhdGUgZW5naW5lIHlvdSB3ZXJlXG4gICAgLy8gdXNpbmcgYW5kIG92ZXJyaWRpbmcgXCJtYWtlVGVtcGxhdGVTb3VyY2VcIiB0byByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgeW91ciBjdXN0b20gdGVtcGxhdGUgc291cmNlLlxuXG4gICAga28udGVtcGxhdGVTb3VyY2VzID0ge307XG5cbiAgICAvLyAtLS0tIGtvLnRlbXBsYXRlU291cmNlcy5kb21FbGVtZW50IC0tLS0tXG5cbiAgICBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5kb21FbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudC5wcm90b3R5cGVbJ3RleHQnXSA9IGZ1bmN0aW9uKC8qIHZhbHVlVG9Xcml0ZSAqLykge1xuICAgICAgICB2YXIgdGFnTmFtZUxvd2VyID0ga28udXRpbHMudGFnTmFtZUxvd2VyKHRoaXMuZG9tRWxlbWVudCksXG4gICAgICAgICAgICBlbGVtQ29udGVudHNQcm9wZXJ0eSA9IHRhZ05hbWVMb3dlciA9PT0gXCJzY3JpcHRcIiA/IFwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRhZ05hbWVMb3dlciA9PT0gXCJ0ZXh0YXJlYVwiID8gXCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiaW5uZXJIVE1MXCI7XG5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG9tRWxlbWVudFtlbGVtQ29udGVudHNQcm9wZXJ0eV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVUb1dyaXRlID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgaWYgKGVsZW1Db250ZW50c1Byb3BlcnR5ID09PSBcImlubmVySFRNTFwiKVxuICAgICAgICAgICAgICAgIGtvLnV0aWxzLnNldEh0bWwodGhpcy5kb21FbGVtZW50LCB2YWx1ZVRvV3JpdGUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tRWxlbWVudFtlbGVtQ29udGVudHNQcm9wZXJ0eV0gPSB2YWx1ZVRvV3JpdGU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGRhdGFEb21EYXRhUHJlZml4ID0ga28udXRpbHMuZG9tRGF0YS5uZXh0S2V5KCkgKyBcIl9cIjtcbiAgICBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudC5wcm90b3R5cGVbJ2RhdGEnXSA9IGZ1bmN0aW9uKGtleSAvKiwgdmFsdWVUb1dyaXRlICovKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4ga28udXRpbHMuZG9tRGF0YS5nZXQodGhpcy5kb21FbGVtZW50LCBkYXRhRG9tRGF0YVByZWZpeCArIGtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrby51dGlscy5kb21EYXRhLnNldCh0aGlzLmRvbUVsZW1lbnQsIGRhdGFEb21EYXRhUHJlZml4ICsga2V5LCBhcmd1bWVudHNbMV0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIC0tLS0ga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c1RlbXBsYXRlIC0tLS0tXG4gICAgLy8gQW5vbnltb3VzIHRlbXBsYXRlcyBhcmUgbm9ybWFsbHkgc2F2ZWQvcmV0cmlldmVkIGFzIERPTSBub2RlcyB0aHJvdWdoIFwibm9kZXNcIi5cbiAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSwgeW91IGNhbiBhbHNvIHJlYWQgXCJ0ZXh0XCI7IGl0IHdpbGwgYmUgc2VyaWFsaXplZCBmcm9tIHRoZSBub2RlcyBvbiBkZW1hbmQuXG4gICAgLy8gV3JpdGluZyB0byBcInRleHRcIiBpcyBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCB0aGVuIHRoZSB0ZW1wbGF0ZSBkYXRhIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBhcyBET00gbm9kZXMuXG5cbiAgICB2YXIgYW5vbnltb3VzVGVtcGxhdGVzRG9tRGF0YUtleSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpO1xuICAgIGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5kb21FbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG4gICAga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c1RlbXBsYXRlLnByb3RvdHlwZSA9IG5ldyBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudCgpO1xuICAgIGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBrby50ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzVGVtcGxhdGU7XG4gICAga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c1RlbXBsYXRlLnByb3RvdHlwZVsndGV4dCddID0gZnVuY3Rpb24oLyogdmFsdWVUb1dyaXRlICovKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURhdGEgPSBrby51dGlscy5kb21EYXRhLmdldCh0aGlzLmRvbUVsZW1lbnQsIGFub255bW91c1RlbXBsYXRlc0RvbURhdGFLZXkpIHx8IHt9O1xuICAgICAgICAgICAgaWYgKHRlbXBsYXRlRGF0YS50ZXh0RGF0YSA9PT0gdW5kZWZpbmVkICYmIHRlbXBsYXRlRGF0YS5jb250YWluZXJEYXRhKVxuICAgICAgICAgICAgICAgIHRlbXBsYXRlRGF0YS50ZXh0RGF0YSA9IHRlbXBsYXRlRGF0YS5jb250YWluZXJEYXRhLmlubmVySFRNTDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZURhdGEudGV4dERhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVUb1dyaXRlID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQodGhpcy5kb21FbGVtZW50LCBhbm9ueW1vdXNUZW1wbGF0ZXNEb21EYXRhS2V5LCB7dGV4dERhdGE6IHZhbHVlVG9Xcml0ZX0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudC5wcm90b3R5cGVbJ25vZGVzJ10gPSBmdW5jdGlvbigvKiB2YWx1ZVRvV3JpdGUgKi8pIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGF0YSA9IGtvLnV0aWxzLmRvbURhdGEuZ2V0KHRoaXMuZG9tRWxlbWVudCwgYW5vbnltb3VzVGVtcGxhdGVzRG9tRGF0YUtleSkgfHwge307XG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVEYXRhLmNvbnRhaW5lckRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVUb1dyaXRlID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQodGhpcy5kb21FbGVtZW50LCBhbm9ueW1vdXNUZW1wbGF0ZXNEb21EYXRhS2V5LCB7Y29udGFpbmVyRGF0YTogdmFsdWVUb1dyaXRlfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAga28uZXhwb3J0U3ltYm9sKCd0ZW1wbGF0ZVNvdXJjZXMnLCBrby50ZW1wbGF0ZVNvdXJjZXMpO1xuICAgIGtvLmV4cG9ydFN5bWJvbCgndGVtcGxhdGVTb3VyY2VzLmRvbUVsZW1lbnQnLCBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudCk7XG4gICAga28uZXhwb3J0U3ltYm9sKCd0ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzVGVtcGxhdGUnLCBrby50ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzVGVtcGxhdGUpO1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90ZW1wbGF0ZUVuZ2luZTtcbiAgICBrby5zZXRUZW1wbGF0ZUVuZ2luZSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZUVuZ2luZSkge1xuICAgICAgICBpZiAoKHRlbXBsYXRlRW5naW5lICE9IHVuZGVmaW5lZCkgJiYgISh0ZW1wbGF0ZUVuZ2luZSBpbnN0YW5jZW9mIGtvLnRlbXBsYXRlRW5naW5lKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRlbXBsYXRlRW5naW5lIG11c3QgaW5oZXJpdCBmcm9tIGtvLnRlbXBsYXRlRW5naW5lXCIpO1xuICAgICAgICBfdGVtcGxhdGVFbmdpbmUgPSB0ZW1wbGF0ZUVuZ2luZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnZva2VGb3JFYWNoTm9kZUluQ29udGludW91c1JhbmdlKGZpcnN0Tm9kZSwgbGFzdE5vZGUsIGFjdGlvbikge1xuICAgICAgICB2YXIgbm9kZSwgbmV4dEluUXVldWUgPSBmaXJzdE5vZGUsIGZpcnN0T3V0T2ZSYW5nZU5vZGUgPSBrby52aXJ0dWFsRWxlbWVudHMubmV4dFNpYmxpbmcobGFzdE5vZGUpO1xuICAgICAgICB3aGlsZSAobmV4dEluUXVldWUgJiYgKChub2RlID0gbmV4dEluUXVldWUpICE9PSBmaXJzdE91dE9mUmFuZ2VOb2RlKSkge1xuICAgICAgICAgICAgbmV4dEluUXVldWUgPSBrby52aXJ0dWFsRWxlbWVudHMubmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgICBhY3Rpb24obm9kZSwgbmV4dEluUXVldWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWN0aXZhdGVCaW5kaW5nc09uQ29udGludW91c05vZGVBcnJheShjb250aW51b3VzTm9kZUFycmF5LCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICAvLyBUbyBiZSB1c2VkIG9uIGFueSBub2RlcyB0aGF0IGhhdmUgYmVlbiByZW5kZXJlZCBieSBhIHRlbXBsYXRlIGFuZCBoYXZlIGJlZW4gaW5zZXJ0ZWQgaW50byBzb21lIHBhcmVudCBlbGVtZW50XG4gICAgICAgIC8vIFdhbGtzIHRocm91Z2ggY29udGludW91c05vZGVBcnJheSAod2hpY2ggKm11c3QqIGJlIGNvbnRpbnVvdXMsIGkuZS4sIGFuIHVuaW50ZXJydXB0ZWQgc2VxdWVuY2Ugb2Ygc2libGluZyBub2RlcywgYmVjYXVzZVxuICAgICAgICAvLyB0aGUgYWxnb3JpdGhtIGZvciB3YWxraW5nIHRoZW0gcmVsaWVzIG9uIHRoaXMpLCBhbmQgZm9yIGVhY2ggdG9wLWxldmVsIGl0ZW0gaW4gdGhlIHZpcnR1YWwtZWxlbWVudCBzZW5zZSxcbiAgICAgICAgLy8gKDEpIERvZXMgYSByZWd1bGFyIFwiYXBwbHlCaW5kaW5nc1wiIHRvIGFzc29jaWF0ZSBiaW5kaW5nQ29udGV4dCB3aXRoIHRoaXMgbm9kZSBhbmQgdG8gYWN0aXZhdGUgYW55IG5vbi1tZW1vaXplZCBiaW5kaW5nc1xuICAgICAgICAvLyAoMikgVW5tZW1vaXplcyBhbnkgbWVtb3MgaW4gdGhlIERPTSBzdWJ0cmVlIChlLmcuLCB0byBhY3RpdmF0ZSBiaW5kaW5ncyB0aGF0IGhhZCBiZWVuIG1lbW9pemVkIGR1cmluZyB0ZW1wbGF0ZSByZXdyaXRpbmcpXG5cbiAgICAgICAgaWYgKGNvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgZmlyc3ROb2RlID0gY29udGludW91c05vZGVBcnJheVswXSxcbiAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IGNvbnRpbnVvdXNOb2RlQXJyYXlbY29udGludW91c05vZGVBcnJheS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gZmlyc3ROb2RlLnBhcmVudE5vZGUsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBrby5iaW5kaW5nUHJvdmlkZXJbJ2luc3RhbmNlJ10sXG4gICAgICAgICAgICAgICAgcHJlcHJvY2Vzc05vZGUgPSBwcm92aWRlclsncHJlcHJvY2Vzc05vZGUnXTtcblxuICAgICAgICAgICAgaWYgKHByZXByb2Nlc3NOb2RlKSB7XG4gICAgICAgICAgICAgICAgaW52b2tlRm9yRWFjaE5vZGVJbkNvbnRpbnVvdXNSYW5nZShmaXJzdE5vZGUsIGxhc3ROb2RlLCBmdW5jdGlvbihub2RlLCBuZXh0Tm9kZUluUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVQcmV2aW91c1NpYmxpbmcgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld05vZGVzID0gcHJlcHJvY2Vzc05vZGUuY2FsbChwcm92aWRlciwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdOb2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgPT09IGZpcnN0Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE5vZGUgPSBuZXdOb2Rlc1swXSB8fCBuZXh0Tm9kZUluUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gbGFzdE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBuZXdOb2Rlc1tuZXdOb2Rlcy5sZW5ndGggLSAxXSB8fCBub2RlUHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHByZXByb2Nlc3NOb2RlIGNhbiBjaGFuZ2UgdGhlIG5vZGVzLCBpbmNsdWRpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGVzLCB1cGRhdGUgY29udGludW91c05vZGVBcnJheSB0byBtYXRjaC5cbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRoZSBmdWxsIHNldCwgaW5jbHVkaW5nIGlubmVyIG5vZGVzLCBiZWNhdXNlIHRoZSB1bm1lbW9pemUgc3RlcCBtaWdodCByZW1vdmUgdGhlIGZpcnN0IG5vZGUgKGFuZCBzbyB0aGUgcmVhbFxuICAgICAgICAgICAgICAgIC8vIGZpcnN0IG5vZGUgbmVlZHMgdG8gYmUgaW4gdGhlIGFycmF5KS5cbiAgICAgICAgICAgICAgICBjb250aW51b3VzTm9kZUFycmF5Lmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFmaXJzdE5vZGUpIHsgLy8gcHJlcHJvY2Vzc05vZGUgbWlnaHQgaGF2ZSByZW1vdmVkIGFsbCB0aGUgbm9kZXMsIGluIHdoaWNoIGNhc2UgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG9cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZmlyc3ROb2RlID09PSBsYXN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzTm9kZUFycmF5LnB1c2goZmlyc3ROb2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzTm9kZUFycmF5LnB1c2goZmlyc3ROb2RlLCBsYXN0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmZpeFVwQ29udGludW91c05vZGVBcnJheShjb250aW51b3VzTm9kZUFycmF5LCBwYXJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE5lZWQgdG8gYXBwbHlCaW5kaW5ncyAqYmVmb3JlKiB1bm1lbW96aWF0aW9uLCBiZWNhdXNlIHVubWVtb2l6YXRpb24gbWlnaHQgaW50cm9kdWNlIGV4dHJhIG5vZGVzICh0aGF0IHdlIGRvbid0IHdhbnQgdG8gcmUtYmluZClcbiAgICAgICAgICAgIC8vIHdoZXJlYXMgYSByZWd1bGFyIGFwcGx5QmluZGluZ3Mgd29uJ3QgaW50cm9kdWNlIG5ldyBtZW1vaXplZCBub2Rlc1xuICAgICAgICAgICAgaW52b2tlRm9yRWFjaE5vZGVJbkNvbnRpbnVvdXNSYW5nZShmaXJzdE5vZGUsIGxhc3ROb2RlLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgfHwgbm9kZS5ub2RlVHlwZSA9PT0gOClcbiAgICAgICAgICAgICAgICAgICAga28uYXBwbHlCaW5kaW5ncyhiaW5kaW5nQ29udGV4dCwgbm9kZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGludm9rZUZvckVhY2hOb2RlSW5Db250aW51b3VzUmFuZ2UoZmlyc3ROb2RlLCBsYXN0Tm9kZSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxIHx8IG5vZGUubm9kZVR5cGUgPT09IDgpXG4gICAgICAgICAgICAgICAgICAgIGtvLm1lbW9pemF0aW9uLnVubWVtb2l6ZURvbU5vZGVBbmREZXNjZW5kYW50cyhub2RlLCBbYmluZGluZ0NvbnRleHRdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgYW55IGNoYW5nZXMgZG9uZSBieSBhcHBseUJpbmRpbmdzIG9yIHVubWVtb2l6ZSBhcmUgcmVmbGVjdGVkIGluIHRoZSBhcnJheVxuICAgICAgICAgICAga28udXRpbHMuZml4VXBDb250aW51b3VzTm9kZUFycmF5KGNvbnRpbnVvdXNOb2RlQXJyYXksIHBhcmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Rmlyc3ROb2RlRnJvbVBvc3NpYmxlQXJyYXkobm9kZU9yTm9kZUFycmF5KSB7XG4gICAgICAgIHJldHVybiBub2RlT3JOb2RlQXJyYXkubm9kZVR5cGUgPyBub2RlT3JOb2RlQXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5vZGVPck5vZGVBcnJheS5sZW5ndGggPiAwID8gbm9kZU9yTm9kZUFycmF5WzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWN1dGVUZW1wbGF0ZSh0YXJnZXROb2RlT3JOb2RlQXJyYXksIHJlbmRlck1vZGUsIHRlbXBsYXRlLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgdmFyIGZpcnN0VGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGVPck5vZGVBcnJheSAmJiBnZXRGaXJzdE5vZGVGcm9tUG9zc2libGVBcnJheSh0YXJnZXROb2RlT3JOb2RlQXJyYXkpO1xuICAgICAgICB2YXIgdGVtcGxhdGVEb2N1bWVudCA9IChmaXJzdFRhcmdldE5vZGUgfHwgdGVtcGxhdGUgfHwge30pLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIHZhciB0ZW1wbGF0ZUVuZ2luZVRvVXNlID0gKG9wdGlvbnNbJ3RlbXBsYXRlRW5naW5lJ10gfHwgX3RlbXBsYXRlRW5naW5lKTtcbiAgICAgICAga28udGVtcGxhdGVSZXdyaXRpbmcuZW5zdXJlVGVtcGxhdGVJc1Jld3JpdHRlbih0ZW1wbGF0ZSwgdGVtcGxhdGVFbmdpbmVUb1VzZSwgdGVtcGxhdGVEb2N1bWVudCk7XG4gICAgICAgIHZhciByZW5kZXJlZE5vZGVzQXJyYXkgPSB0ZW1wbGF0ZUVuZ2luZVRvVXNlWydyZW5kZXJUZW1wbGF0ZSddKHRlbXBsYXRlLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgdGVtcGxhdGVEb2N1bWVudCk7XG5cbiAgICAgICAgLy8gTG9vc2VseSBjaGVjayByZXN1bHQgaXMgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gICAgICAgIGlmICgodHlwZW9mIHJlbmRlcmVkTm9kZXNBcnJheS5sZW5ndGggIT0gXCJudW1iZXJcIikgfHwgKHJlbmRlcmVkTm9kZXNBcnJheS5sZW5ndGggPiAwICYmIHR5cGVvZiByZW5kZXJlZE5vZGVzQXJyYXlbMF0ubm9kZVR5cGUgIT0gXCJudW1iZXJcIikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUZW1wbGF0ZSBlbmdpbmUgbXVzdCByZXR1cm4gYW4gYXJyYXkgb2YgRE9NIG5vZGVzXCIpO1xuXG4gICAgICAgIHZhciBoYXZlQWRkZWROb2Rlc1RvUGFyZW50ID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAocmVuZGVyTW9kZSkge1xuICAgICAgICAgICAgY2FzZSBcInJlcGxhY2VDaGlsZHJlblwiOlxuICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5zZXREb21Ob2RlQ2hpbGRyZW4odGFyZ2V0Tm9kZU9yTm9kZUFycmF5LCByZW5kZXJlZE5vZGVzQXJyYXkpO1xuICAgICAgICAgICAgICAgIGhhdmVBZGRlZE5vZGVzVG9QYXJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJlcGxhY2VOb2RlXCI6XG4gICAgICAgICAgICAgICAga28udXRpbHMucmVwbGFjZURvbU5vZGVzKHRhcmdldE5vZGVPck5vZGVBcnJheSwgcmVuZGVyZWROb2Rlc0FycmF5KTtcbiAgICAgICAgICAgICAgICBoYXZlQWRkZWROb2Rlc1RvUGFyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJpZ25vcmVUYXJnZXROb2RlXCI6IGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHJlbmRlck1vZGU6IFwiICsgcmVuZGVyTW9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGF2ZUFkZGVkTm9kZXNUb1BhcmVudCkge1xuICAgICAgICAgICAgYWN0aXZhdGVCaW5kaW5nc09uQ29udGludW91c05vZGVBcnJheShyZW5kZXJlZE5vZGVzQXJyYXksIGJpbmRpbmdDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zWydhZnRlclJlbmRlciddKVxuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uaWdub3JlKG9wdGlvbnNbJ2FmdGVyUmVuZGVyJ10sIG51bGwsIFtyZW5kZXJlZE5vZGVzQXJyYXksIGJpbmRpbmdDb250ZXh0WyckZGF0YSddXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyZWROb2Rlc0FycmF5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVUZW1wbGF0ZU5hbWUodGVtcGxhdGUsIGRhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gVGhlIHRlbXBsYXRlIGNhbiBiZSBzcGVjaWZpZWQgYXM6XG4gICAgICAgIGlmIChrby5pc09ic2VydmFibGUodGVtcGxhdGUpKSB7XG4gICAgICAgICAgICAvLyAxLiBBbiBvYnNlcnZhYmxlLCB3aXRoIHN0cmluZyB2YWx1ZVxuICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyAyLiBBIGZ1bmN0aW9uIG9mIChkYXRhLCBjb250ZXh0KSByZXR1cm5pbmcgYSBzdHJpbmdcbiAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZShkYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIDMuIEEgc3RyaW5nXG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBrby5yZW5kZXJUZW1wbGF0ZSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgZGF0YU9yQmluZGluZ0NvbnRleHQsIG9wdGlvbnMsIHRhcmdldE5vZGVPck5vZGVBcnJheSwgcmVuZGVyTW9kZSkge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKChvcHRpb25zWyd0ZW1wbGF0ZUVuZ2luZSddIHx8IF90ZW1wbGF0ZUVuZ2luZSkgPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2V0IGEgdGVtcGxhdGUgZW5naW5lIGJlZm9yZSBjYWxsaW5nIHJlbmRlclRlbXBsYXRlXCIpO1xuICAgICAgICByZW5kZXJNb2RlID0gcmVuZGVyTW9kZSB8fCBcInJlcGxhY2VDaGlsZHJlblwiO1xuXG4gICAgICAgIGlmICh0YXJnZXROb2RlT3JOb2RlQXJyYXkpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdFRhcmdldE5vZGUgPSBnZXRGaXJzdE5vZGVGcm9tUG9zc2libGVBcnJheSh0YXJnZXROb2RlT3JOb2RlQXJyYXkpO1xuXG4gICAgICAgICAgICB2YXIgd2hlblRvRGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICghZmlyc3RUYXJnZXROb2RlKSB8fCAha28udXRpbHMuZG9tTm9kZUlzQXR0YWNoZWRUb0RvY3VtZW50KGZpcnN0VGFyZ2V0Tm9kZSk7IH07IC8vIFBhc3NpdmUgZGlzcG9zYWwgKG9uIG5leHQgZXZhbHVhdGlvbilcbiAgICAgICAgICAgIHZhciBhY3RpdmVseURpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCA9IChmaXJzdFRhcmdldE5vZGUgJiYgcmVuZGVyTW9kZSA9PSBcInJlcGxhY2VOb2RlXCIpID8gZmlyc3RUYXJnZXROb2RlLnBhcmVudE5vZGUgOiBmaXJzdFRhcmdldE5vZGU7XG5cbiAgICAgICAgICAgIHJldHVybiBrby5kZXBlbmRlbnRPYnNlcnZhYmxlKCAvLyBTbyB0aGUgRE9NIGlzIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB3aGVuIGFueSBkZXBlbmRlbmN5IGNoYW5nZXNcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB3ZSd2ZSBnb3QgYSBwcm9wZXIgYmluZGluZyBjb250ZXh0IHRvIHdvcmsgd2l0aFxuICAgICAgICAgICAgICAgICAgICB2YXIgYmluZGluZ0NvbnRleHQgPSAoZGF0YU9yQmluZGluZ0NvbnRleHQgJiYgKGRhdGFPckJpbmRpbmdDb250ZXh0IGluc3RhbmNlb2Yga28uYmluZGluZ0NvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBkYXRhT3JCaW5kaW5nQ29udGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcga28uYmluZGluZ0NvbnRleHQoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShkYXRhT3JCaW5kaW5nQ29udGV4dCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSByZXNvbHZlVGVtcGxhdGVOYW1lKHRlbXBsYXRlLCBiaW5kaW5nQ29udGV4dFsnJGRhdGEnXSwgYmluZGluZ0NvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWROb2Rlc0FycmF5ID0gZXhlY3V0ZVRlbXBsYXRlKHRhcmdldE5vZGVPck5vZGVBcnJheSwgcmVuZGVyTW9kZSwgdGVtcGxhdGVOYW1lLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbmRlck1vZGUgPT0gXCJyZXBsYWNlTm9kZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlT3JOb2RlQXJyYXkgPSByZW5kZXJlZE5vZGVzQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhcmdldE5vZGUgPSBnZXRGaXJzdE5vZGVGcm9tUG9zc2libGVBcnJheSh0YXJnZXROb2RlT3JOb2RlQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHsgZGlzcG9zZVdoZW46IHdoZW5Ub0Rpc3Bvc2UsIGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogYWN0aXZlbHlEaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHlldCBoYXZlIGEgRE9NIG5vZGUgdG8gZXZhbHVhdGUsIHNvIHVzZSBhIG1lbW8gYW5kIHJlbmRlciB0aGUgdGVtcGxhdGUgbGF0ZXIgd2hlbiB0aGVyZSBpcyBhIERPTSBub2RlXG4gICAgICAgICAgICByZXR1cm4ga28ubWVtb2l6YXRpb24ubWVtb2l6ZShmdW5jdGlvbiAoZG9tTm9kZSkge1xuICAgICAgICAgICAgICAgIGtvLnJlbmRlclRlbXBsYXRlKHRlbXBsYXRlLCBkYXRhT3JCaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgZG9tTm9kZSwgXCJyZXBsYWNlTm9kZVwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGtvLnJlbmRlclRlbXBsYXRlRm9yRWFjaCA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgYXJyYXlPck9ic2VydmFibGVBcnJheSwgb3B0aW9ucywgdGFyZ2V0Tm9kZSwgcGFyZW50QmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgLy8gU2luY2Ugc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyBhbHdheXMgY2FsbHMgZXhlY3V0ZVRlbXBsYXRlRm9yQXJyYXlJdGVtIGFuZCB0aGVuXG4gICAgICAgIC8vIGFjdGl2YXRlQmluZGluZ3NDYWxsYmFjayBmb3IgYWRkZWQgaXRlbXMsIHdlIGNhbiBzdG9yZSB0aGUgYmluZGluZyBjb250ZXh0IGluIHRoZSBmb3JtZXIgdG8gdXNlIGluIHRoZSBsYXR0ZXIuXG4gICAgICAgIHZhciBhcnJheUl0ZW1Db250ZXh0O1xuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyB0byBnZXQgdGhlIG5vZGVzIHRvIGFkZCB0byB0YXJnZXROb2RlXG4gICAgICAgIHZhciBleGVjdXRlVGVtcGxhdGVGb3JBcnJheUl0ZW0gPSBmdW5jdGlvbiAoYXJyYXlWYWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIC8vIFN1cHBvcnQgc2VsZWN0aW5nIHRlbXBsYXRlIGFzIGEgZnVuY3Rpb24gb2YgdGhlIGRhdGEgYmVpbmcgcmVuZGVyZWRcbiAgICAgICAgICAgIGFycmF5SXRlbUNvbnRleHQgPSBwYXJlbnRCaW5kaW5nQ29udGV4dFsnY3JlYXRlQ2hpbGRDb250ZXh0J10oYXJyYXlWYWx1ZSwgb3B0aW9uc1snYXMnXSwgZnVuY3Rpb24oY29udGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHRbJyRpbmRleCddID0gaW5kZXg7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlTmFtZSA9IHJlc29sdmVUZW1wbGF0ZU5hbWUodGVtcGxhdGUsIGFycmF5VmFsdWUsIGFycmF5SXRlbUNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVUZW1wbGF0ZShudWxsLCBcImlnbm9yZVRhcmdldE5vZGVcIiwgdGVtcGxhdGVOYW1lLCBhcnJheUl0ZW1Db250ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyBoYXMgYWRkZWQgbm9kZXMgdG8gdGFyZ2V0Tm9kZVxuICAgICAgICB2YXIgYWN0aXZhdGVCaW5kaW5nc0NhbGxiYWNrID0gZnVuY3Rpb24oYXJyYXlWYWx1ZSwgYWRkZWROb2Rlc0FycmF5LCBpbmRleCkge1xuICAgICAgICAgICAgYWN0aXZhdGVCaW5kaW5nc09uQ29udGludW91c05vZGVBcnJheShhZGRlZE5vZGVzQXJyYXksIGFycmF5SXRlbUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnNbJ2FmdGVyUmVuZGVyJ10pXG4gICAgICAgICAgICAgICAgb3B0aW9uc1snYWZ0ZXJSZW5kZXInXShhZGRlZE5vZGVzQXJyYXksIGFycmF5VmFsdWUpO1xuXG4gICAgICAgICAgICAvLyByZWxlYXNlIHRoZSBcImNhY2hlXCIgdmFyaWFibGUsIHNvIHRoYXQgaXQgY2FuIGJlIGNvbGxlY3RlZCBieVxuICAgICAgICAgICAgLy8gdGhlIEdDIHdoZW4gaXRzIHZhbHVlIGlzbid0IHVzZWQgZnJvbSB3aXRoaW4gdGhlIGJpbmRpbmdzIGFueW1vcmUuXG4gICAgICAgICAgICBhcnJheUl0ZW1Db250ZXh0ID0gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ga28uZGVwZW5kZW50T2JzZXJ2YWJsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdW53cmFwcGVkQXJyYXkgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGFycmF5T3JPYnNlcnZhYmxlQXJyYXkpIHx8IFtdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1bndyYXBwZWRBcnJheS5sZW5ndGggPT0gXCJ1bmRlZmluZWRcIikgLy8gQ29lcmNlIHNpbmdsZSB2YWx1ZSBpbnRvIGFycmF5XG4gICAgICAgICAgICAgICAgdW53cmFwcGVkQXJyYXkgPSBbdW53cmFwcGVkQXJyYXldO1xuXG4gICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGFueSBlbnRyaWVzIG1hcmtlZCBhcyBkZXN0cm95ZWRcbiAgICAgICAgICAgIHZhciBmaWx0ZXJlZEFycmF5ID0ga28udXRpbHMuYXJyYXlGaWx0ZXIodW53cmFwcGVkQXJyYXksIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uc1snaW5jbHVkZURlc3Ryb3llZCddIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCB8fCBpdGVtID09PSBudWxsIHx8ICFrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGl0ZW1bJ19kZXN0cm95J10pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIENhbGwgc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZywgaWdub3JpbmcgYW55IG9ic2VydmFibGVzIHVud3JhcHBlZCB3aXRoaW4gKG1vc3QgbGlrZWx5IGZyb20gYSBjYWxsYmFjayBmdW5jdGlvbikuXG4gICAgICAgICAgICAvLyBJZiB0aGUgYXJyYXkgaXRlbXMgYXJlIG9ic2VydmFibGVzLCB0aG91Z2gsIHRoZXkgd2lsbCBiZSB1bndyYXBwZWQgaW4gZXhlY3V0ZVRlbXBsYXRlRm9yQXJyYXlJdGVtIGFuZCBtYW5hZ2VkIHdpdGhpbiBzZXREb21Ob2RlQ2hpbGRyZW5Gcm9tQXJyYXlNYXBwaW5nLlxuICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoa28udXRpbHMuc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZywgbnVsbCwgW3RhcmdldE5vZGUsIGZpbHRlcmVkQXJyYXksIGV4ZWN1dGVUZW1wbGF0ZUZvckFycmF5SXRlbSwgb3B0aW9ucywgYWN0aXZhdGVCaW5kaW5nc0NhbGxiYWNrXSk7XG5cbiAgICAgICAgfSwgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IHRhcmdldE5vZGUgfSk7XG4gICAgfTtcblxuICAgIHZhciB0ZW1wbGF0ZUNvbXB1dGVkRG9tRGF0YUtleSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpO1xuICAgIGZ1bmN0aW9uIGRpc3Bvc2VPbGRDb21wdXRlZEFuZFN0b3JlTmV3T25lKGVsZW1lbnQsIG5ld0NvbXB1dGVkKSB7XG4gICAgICAgIHZhciBvbGRDb21wdXRlZCA9IGtvLnV0aWxzLmRvbURhdGEuZ2V0KGVsZW1lbnQsIHRlbXBsYXRlQ29tcHV0ZWREb21EYXRhS2V5KTtcbiAgICAgICAgaWYgKG9sZENvbXB1dGVkICYmICh0eXBlb2Yob2xkQ29tcHV0ZWQuZGlzcG9zZSkgPT0gJ2Z1bmN0aW9uJykpXG4gICAgICAgICAgICBvbGRDb21wdXRlZC5kaXNwb3NlKCk7XG4gICAgICAgIGtvLnV0aWxzLmRvbURhdGEuc2V0KGVsZW1lbnQsIHRlbXBsYXRlQ29tcHV0ZWREb21EYXRhS2V5LCAobmV3Q29tcHV0ZWQgJiYgbmV3Q29tcHV0ZWQuaXNBY3RpdmUoKSkgPyBuZXdDb21wdXRlZCA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAga28uYmluZGluZ0hhbmRsZXJzWyd0ZW1wbGF0ZSddID0ge1xuICAgICAgICAnaW5pdCc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgICAgIC8vIFN1cHBvcnQgYW5vbnltb3VzIHRlbXBsYXRlc1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYmluZGluZ1ZhbHVlID09IFwic3RyaW5nXCIgfHwgYmluZGluZ1ZhbHVlWyduYW1lJ10pIHtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIGEgbmFtZWQgdGVtcGxhdGUgLSBjbGVhciB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5lbXB0eU5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCdub2RlcycgaW4gYmluZGluZ1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UndmUgYmVlbiBnaXZlbiBhbiBhcnJheSBvZiBET00gbm9kZXMuIFNhdmUgdGhlbSBhcyB0aGUgdGVtcGxhdGUgc291cmNlLlxuICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGtub3duIHVzZSBjYXNlIGZvciB0aGUgbm9kZSBhcnJheSBiZWluZyBhbiBvYnNlcnZhYmxlIGFycmF5IChpZiB0aGUgb3V0cHV0XG4gICAgICAgICAgICAgICAgLy8gdmFyaWVzLCBwdXQgdGhhdCBiZWhhdmlvciAqaW50byogeW91ciB0ZW1wbGF0ZSAtIHRoYXQncyB3aGF0IHRlbXBsYXRlcyBhcmUgZm9yKSwgYW5kXG4gICAgICAgICAgICAgICAgLy8gdGhlIGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIGEgbWVzcywgc28gYXNzZXJ0IHRoYXQgaXQncyBub3Qgb2JzZXJ2YWJsZS5cbiAgICAgICAgICAgICAgICB2YXIgbm9kZXMgPSBiaW5kaW5nVmFsdWVbJ25vZGVzJ10gfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKGtvLmlzT2JzZXJ2YWJsZShub2RlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJub2Rlc1wiIG9wdGlvbiBtdXN0IGJlIGEgcGxhaW4sIG5vbi1vYnNlcnZhYmxlIGFycmF5LicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0ga28udXRpbHMubW92ZUNsZWFuZWROb2Rlc1RvQ29udGFpbmVyRWxlbWVudChub2Rlcyk7IC8vIFRoaXMgYWxzbyByZW1vdmVzIHRoZSBub2RlcyBmcm9tIHRoZWlyIGN1cnJlbnQgcGFyZW50XG4gICAgICAgICAgICAgICAgbmV3IGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZShlbGVtZW50KVsnbm9kZXMnXShjb250YWluZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIGFuIGFub255bW91cyB0ZW1wbGF0ZSAtIHN0b3JlIHRoZSBlbGVtZW50IGNvbnRlbnRzLCB0aGVuIGNsZWFyIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlTm9kZXMgPSBrby52aXJ0dWFsRWxlbWVudHMuY2hpbGROb2RlcyhlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0ga28udXRpbHMubW92ZUNsZWFuZWROb2Rlc1RvQ29udGFpbmVyRWxlbWVudCh0ZW1wbGF0ZU5vZGVzKTsgLy8gVGhpcyBhbHNvIHJlbW92ZXMgdGhlIG5vZGVzIGZyb20gdGhlaXIgY3VycmVudCBwYXJlbnRcbiAgICAgICAgICAgICAgICBuZXcga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c1RlbXBsYXRlKGVsZW1lbnQpWydub2RlcyddKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyAnY29udHJvbHNEZXNjZW5kYW50QmluZGluZ3MnOiB0cnVlIH07XG4gICAgICAgIH0sXG4gICAgICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlQWNjZXNzb3IoKSxcbiAgICAgICAgICAgICAgICBkYXRhVmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNob3VsZERpc3BsYXkgPSB0cnVlLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29tcHV0ZWQgPSBudWxsLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlTmFtZTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZU5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlTmFtZSA9IG9wdGlvbnNbJ25hbWUnXTtcblxuICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgXCJpZlwiL1wiaWZub3RcIiBjb25kaXRpb25zXG4gICAgICAgICAgICAgICAgaWYgKCdpZicgaW4gb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkRGlzcGxheSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUob3B0aW9uc1snaWYnXSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZERpc3BsYXkgJiYgJ2lmbm90JyBpbiBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICBzaG91bGREaXNwbGF5ID0gIWtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUob3B0aW9uc1snaWZub3QnXSk7XG5cbiAgICAgICAgICAgICAgICBkYXRhVmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG9wdGlvbnNbJ2RhdGEnXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgnZm9yZWFjaCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIC8vIFJlbmRlciBvbmNlIGZvciBlYWNoIGRhdGEgcG9pbnQgKHRyZWF0aW5nIGRhdGEgc2V0IGFzIGVtcHR5IGlmIHNob3VsZERpc3BsYXk9PWZhbHNlKVxuICAgICAgICAgICAgICAgIHZhciBkYXRhQXJyYXkgPSAoc2hvdWxkRGlzcGxheSAmJiBvcHRpb25zWydmb3JlYWNoJ10pIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29tcHV0ZWQgPSBrby5yZW5kZXJUZW1wbGF0ZUZvckVhY2godGVtcGxhdGVOYW1lIHx8IGVsZW1lbnQsIGRhdGFBcnJheSwgb3B0aW9ucywgZWxlbWVudCwgYmluZGluZ0NvbnRleHQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc2hvdWxkRGlzcGxheSkge1xuICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5lbXB0eU5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJlbmRlciBvbmNlIGZvciB0aGlzIHNpbmdsZSBkYXRhIHBvaW50IChvciB1c2UgdGhlIHZpZXdNb2RlbCBpZiBubyBkYXRhIHdhcyBwcm92aWRlZClcbiAgICAgICAgICAgICAgICB2YXIgaW5uZXJCaW5kaW5nQ29udGV4dCA9ICgnZGF0YScgaW4gb3B0aW9ucykgP1xuICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ29udGV4dFsnY3JlYXRlQ2hpbGRDb250ZXh0J10oZGF0YVZhbHVlLCBvcHRpb25zWydhcyddKSA6ICAvLyBHaXZlbiBhbiBleHBsaXRpdCAnZGF0YScgdmFsdWUsIHdlIGNyZWF0ZSBhIGNoaWxkIGJpbmRpbmcgY29udGV4dCBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHaXZlbiBubyBleHBsaWNpdCAnZGF0YScgdmFsdWUsIHdlIHJldGFpbiB0aGUgc2FtZSBiaW5kaW5nIGNvbnRleHRcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbXB1dGVkID0ga28ucmVuZGVyVGVtcGxhdGUodGVtcGxhdGVOYW1lIHx8IGVsZW1lbnQsIGlubmVyQmluZGluZ0NvbnRleHQsIG9wdGlvbnMsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGhhdmUgYSBzaW5nbGUgdGVtcGxhdGUgY29tcHV0ZWQgcGVyIGVsZW1lbnQgKG90aGVyd2lzZSB3aGljaCBvbmUgc2hvdWxkIGhhdmUgaXRzIG91dHB1dCBkaXNwbGF5ZWQ/KVxuICAgICAgICAgICAgZGlzcG9zZU9sZENvbXB1dGVkQW5kU3RvcmVOZXdPbmUoZWxlbWVudCwgdGVtcGxhdGVDb21wdXRlZCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQW5vbnltb3VzIHRlbXBsYXRlcyBjYW4ndCBiZSByZXdyaXR0ZW4uIEdpdmUgYSBuaWNlIGVycm9yIG1lc3NhZ2UgaWYgeW91IHRyeSB0byBkbyBpdC5cbiAgICBrby5leHByZXNzaW9uUmV3cml0aW5nLmJpbmRpbmdSZXdyaXRlVmFsaWRhdG9yc1sndGVtcGxhdGUnXSA9IGZ1bmN0aW9uKGJpbmRpbmdWYWx1ZSkge1xuICAgICAgICB2YXIgcGFyc2VkQmluZGluZ1ZhbHVlID0ga28uZXhwcmVzc2lvblJld3JpdGluZy5wYXJzZU9iamVjdExpdGVyYWwoYmluZGluZ1ZhbHVlKTtcblxuICAgICAgICBpZiAoKHBhcnNlZEJpbmRpbmdWYWx1ZS5sZW5ndGggPT0gMSkgJiYgcGFyc2VkQmluZGluZ1ZhbHVlWzBdWyd1bmtub3duJ10pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gSXQgbG9va3MgbGlrZSBhIHN0cmluZyBsaXRlcmFsLCBub3QgYW4gb2JqZWN0IGxpdGVyYWwsIHNvIHRyZWF0IGl0IGFzIGEgbmFtZWQgdGVtcGxhdGUgKHdoaWNoIGlzIGFsbG93ZWQgZm9yIHJld3JpdGluZylcblxuICAgICAgICBpZiAoa28uZXhwcmVzc2lvblJld3JpdGluZy5rZXlWYWx1ZUFycmF5Q29udGFpbnNLZXkocGFyc2VkQmluZGluZ1ZhbHVlLCBcIm5hbWVcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTmFtZWQgdGVtcGxhdGVzIGNhbiBiZSByZXdyaXR0ZW4sIHNvIHJldHVybiBcIm5vIGVycm9yXCJcbiAgICAgICAgcmV0dXJuIFwiVGhpcyB0ZW1wbGF0ZSBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCBhbm9ueW1vdXMgdGVtcGxhdGVzIG5lc3RlZCB3aXRoaW4gaXRzIHRlbXBsYXRlc1wiO1xuICAgIH07XG5cbiAgICBrby52aXJ0dWFsRWxlbWVudHMuYWxsb3dlZEJpbmRpbmdzWyd0ZW1wbGF0ZSddID0gdHJ1ZTtcbn0pKCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgnc2V0VGVtcGxhdGVFbmdpbmUnLCBrby5zZXRUZW1wbGF0ZUVuZ2luZSk7XG5rby5leHBvcnRTeW1ib2woJ3JlbmRlclRlbXBsYXRlJywga28ucmVuZGVyVGVtcGxhdGUpO1xuLy8gR28gdGhyb3VnaCB0aGUgaXRlbXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYW5kIGRlbGV0ZWQgYW5kIHRyeSB0byBmaW5kIG1hdGNoZXMgYmV0d2VlbiB0aGVtLlxua28udXRpbHMuZmluZE1vdmVzSW5BcnJheUNvbXBhcmlzb24gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQsIGxpbWl0RmFpbGVkQ29tcGFyZXMpIHtcbiAgICBpZiAobGVmdC5sZW5ndGggJiYgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgIHZhciBmYWlsZWRDb21wYXJlcywgbCwgciwgbGVmdEl0ZW0sIHJpZ2h0SXRlbTtcbiAgICAgICAgZm9yIChmYWlsZWRDb21wYXJlcyA9IGwgPSAwOyAoIWxpbWl0RmFpbGVkQ29tcGFyZXMgfHwgZmFpbGVkQ29tcGFyZXMgPCBsaW1pdEZhaWxlZENvbXBhcmVzKSAmJiAobGVmdEl0ZW0gPSBsZWZ0W2xdKTsgKytsKSB7XG4gICAgICAgICAgICBmb3IgKHIgPSAwOyByaWdodEl0ZW0gPSByaWdodFtyXTsgKytyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnRJdGVtWyd2YWx1ZSddID09PSByaWdodEl0ZW1bJ3ZhbHVlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1bJ21vdmVkJ10gPSByaWdodEl0ZW1bJ2luZGV4J107XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0SXRlbVsnbW92ZWQnXSA9IGxlZnRJdGVtWydpbmRleCddO1xuICAgICAgICAgICAgICAgICAgICByaWdodC5zcGxpY2UociwgMSk7ICAgICAgICAgLy8gVGhpcyBpdGVtIGlzIG1hcmtlZCBhcyBtb3ZlZDsgc28gcmVtb3ZlIGl0IGZyb20gcmlnaHQgbGlzdFxuICAgICAgICAgICAgICAgICAgICBmYWlsZWRDb21wYXJlcyA9IHIgPSAwOyAgICAgLy8gUmVzZXQgZmFpbGVkIGNvbXBhcmVzIGNvdW50IGJlY2F1c2Ugd2UncmUgY2hlY2tpbmcgZm9yIGNvbnNlY3V0aXZlIGZhaWx1cmVzXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZhaWxlZENvbXBhcmVzICs9IHI7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5rby51dGlscy5jb21wYXJlQXJyYXlzID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdHVzTm90SW5PbGQgPSAnYWRkZWQnLCBzdGF0dXNOb3RJbk5ldyA9ICdkZWxldGVkJztcblxuICAgIC8vIFNpbXBsZSBjYWxjdWxhdGlvbiBiYXNlZCBvbiBMZXZlbnNodGVpbiBkaXN0YW5jZS5cbiAgICBmdW5jdGlvbiBjb21wYXJlQXJyYXlzKG9sZEFycmF5LCBuZXdBcnJheSwgb3B0aW9ucykge1xuICAgICAgICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgaWYgdGhlIHRoaXJkIGFyZyBpcyBhY3R1YWxseSBhIGJvb2wsIGludGVycHJldFxuICAgICAgICAvLyBpdCBhcyB0aGUgb2xkIHBhcmFtZXRlciAnZG9udExpbWl0TW92ZXMnLiBOZXdlciBjb2RlIHNob3VsZCB1c2UgeyBkb250TGltaXRNb3ZlczogdHJ1ZSB9LlxuICAgICAgICBvcHRpb25zID0gKHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicpID8geyAnZG9udExpbWl0TW92ZXMnOiBvcHRpb25zIH0gOiAob3B0aW9ucyB8fCB7fSk7XG4gICAgICAgIG9sZEFycmF5ID0gb2xkQXJyYXkgfHwgW107XG4gICAgICAgIG5ld0FycmF5ID0gbmV3QXJyYXkgfHwgW107XG5cbiAgICAgICAgaWYgKG9sZEFycmF5Lmxlbmd0aCA8PSBuZXdBcnJheS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gY29tcGFyZVNtYWxsQXJyYXlUb0JpZ0FycmF5KG9sZEFycmF5LCBuZXdBcnJheSwgc3RhdHVzTm90SW5PbGQsIHN0YXR1c05vdEluTmV3LCBvcHRpb25zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVTbWFsbEFycmF5VG9CaWdBcnJheShuZXdBcnJheSwgb2xkQXJyYXksIHN0YXR1c05vdEluTmV3LCBzdGF0dXNOb3RJbk9sZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcGFyZVNtYWxsQXJyYXlUb0JpZ0FycmF5KHNtbEFycmF5LCBiaWdBcnJheSwgc3RhdHVzTm90SW5TbWwsIHN0YXR1c05vdEluQmlnLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBteU1pbiA9IE1hdGgubWluLFxuICAgICAgICAgICAgbXlNYXggPSBNYXRoLm1heCxcbiAgICAgICAgICAgIGVkaXREaXN0YW5jZU1hdHJpeCA9IFtdLFxuICAgICAgICAgICAgc21sSW5kZXgsIHNtbEluZGV4TWF4ID0gc21sQXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgYmlnSW5kZXgsIGJpZ0luZGV4TWF4ID0gYmlnQXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgY29tcGFyZVJhbmdlID0gKGJpZ0luZGV4TWF4IC0gc21sSW5kZXhNYXgpIHx8IDEsXG4gICAgICAgICAgICBtYXhEaXN0YW5jZSA9IHNtbEluZGV4TWF4ICsgYmlnSW5kZXhNYXggKyAxLFxuICAgICAgICAgICAgdGhpc1JvdywgbGFzdFJvdyxcbiAgICAgICAgICAgIGJpZ0luZGV4TWF4Rm9yUm93LCBiaWdJbmRleE1pbkZvclJvdztcblxuICAgICAgICBmb3IgKHNtbEluZGV4ID0gMDsgc21sSW5kZXggPD0gc21sSW5kZXhNYXg7IHNtbEluZGV4KyspIHtcbiAgICAgICAgICAgIGxhc3RSb3cgPSB0aGlzUm93O1xuICAgICAgICAgICAgZWRpdERpc3RhbmNlTWF0cml4LnB1c2godGhpc1JvdyA9IFtdKTtcbiAgICAgICAgICAgIGJpZ0luZGV4TWF4Rm9yUm93ID0gbXlNaW4oYmlnSW5kZXhNYXgsIHNtbEluZGV4ICsgY29tcGFyZVJhbmdlKTtcbiAgICAgICAgICAgIGJpZ0luZGV4TWluRm9yUm93ID0gbXlNYXgoMCwgc21sSW5kZXggLSAxKTtcbiAgICAgICAgICAgIGZvciAoYmlnSW5kZXggPSBiaWdJbmRleE1pbkZvclJvdzsgYmlnSW5kZXggPD0gYmlnSW5kZXhNYXhGb3JSb3c7IGJpZ0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWJpZ0luZGV4KVxuICAgICAgICAgICAgICAgICAgICB0aGlzUm93W2JpZ0luZGV4XSA9IHNtbEluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghc21sSW5kZXgpICAvLyBUb3Agcm93IC0gdHJhbnNmb3JtIGVtcHR5IGFycmF5IGludG8gbmV3IGFycmF5IHZpYSBhZGRpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgdGhpc1Jvd1tiaWdJbmRleF0gPSBiaWdJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc21sQXJyYXlbc21sSW5kZXggLSAxXSA9PT0gYmlnQXJyYXlbYmlnSW5kZXggLSAxXSlcbiAgICAgICAgICAgICAgICAgICAgdGhpc1Jvd1tiaWdJbmRleF0gPSBsYXN0Um93W2JpZ0luZGV4IC0gMV07ICAgICAgICAgICAgICAgICAgLy8gY29weSB2YWx1ZSAobm8gZWRpdClcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vcnRoRGlzdGFuY2UgPSBsYXN0Um93W2JpZ0luZGV4XSB8fCBtYXhEaXN0YW5jZTsgICAgICAgLy8gbm90IGluIGJpZyAoZGVsZXRpb24pXG4gICAgICAgICAgICAgICAgICAgIHZhciB3ZXN0RGlzdGFuY2UgPSB0aGlzUm93W2JpZ0luZGV4IC0gMV0gfHwgbWF4RGlzdGFuY2U7ICAgIC8vIG5vdCBpbiBzbWFsbCAoYWRkaXRpb24pXG4gICAgICAgICAgICAgICAgICAgIHRoaXNSb3dbYmlnSW5kZXhdID0gbXlNaW4obm9ydGhEaXN0YW5jZSwgd2VzdERpc3RhbmNlKSArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGVkaXRTY3JpcHQgPSBbXSwgbWVNaW51c09uZSwgbm90SW5TbWwgPSBbXSwgbm90SW5CaWcgPSBbXTtcbiAgICAgICAgZm9yIChzbWxJbmRleCA9IHNtbEluZGV4TWF4LCBiaWdJbmRleCA9IGJpZ0luZGV4TWF4OyBzbWxJbmRleCB8fCBiaWdJbmRleDspIHtcbiAgICAgICAgICAgIG1lTWludXNPbmUgPSBlZGl0RGlzdGFuY2VNYXRyaXhbc21sSW5kZXhdW2JpZ0luZGV4XSAtIDE7XG4gICAgICAgICAgICBpZiAoYmlnSW5kZXggJiYgbWVNaW51c09uZSA9PT0gZWRpdERpc3RhbmNlTWF0cml4W3NtbEluZGV4XVtiaWdJbmRleC0xXSkge1xuICAgICAgICAgICAgICAgIG5vdEluU21sLnB1c2goZWRpdFNjcmlwdFtlZGl0U2NyaXB0Lmxlbmd0aF0gPSB7ICAgICAvLyBhZGRlZFxuICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJzogc3RhdHVzTm90SW5TbWwsXG4gICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IGJpZ0FycmF5Wy0tYmlnSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAnaW5kZXgnOiBiaWdJbmRleCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc21sSW5kZXggJiYgbWVNaW51c09uZSA9PT0gZWRpdERpc3RhbmNlTWF0cml4W3NtbEluZGV4IC0gMV1bYmlnSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgbm90SW5CaWcucHVzaChlZGl0U2NyaXB0W2VkaXRTY3JpcHQubGVuZ3RoXSA9IHsgICAgIC8vIGRlbGV0ZWRcbiAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cyc6IHN0YXR1c05vdEluQmlnLFxuICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiBzbWxBcnJheVstLXNtbEluZGV4XSxcbiAgICAgICAgICAgICAgICAgICAgJ2luZGV4Jzogc21sSW5kZXggfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC0tYmlnSW5kZXg7XG4gICAgICAgICAgICAgICAgLS1zbWxJbmRleDtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNbJ3NwYXJzZSddKSB7XG4gICAgICAgICAgICAgICAgICAgIGVkaXRTY3JpcHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJzogXCJyZXRhaW5lZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogYmlnQXJyYXlbYmlnSW5kZXhdIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgbm9uLW1hdGNoaW5nIGNvbXBhcmlzb25zOyBoYXZpbmcgaXQgYSBtdWx0aXBsZSBvZlxuICAgICAgICAvLyBzbWxJbmRleE1heCBrZWVwcyB0aGUgdGltZSBjb21wbGV4aXR5IG9mIHRoaXMgYWxnb3JpdGhtIGxpbmVhci5cbiAgICAgICAga28udXRpbHMuZmluZE1vdmVzSW5BcnJheUNvbXBhcmlzb24obm90SW5TbWwsIG5vdEluQmlnLCBzbWxJbmRleE1heCAqIDEwKTtcblxuICAgICAgICByZXR1cm4gZWRpdFNjcmlwdC5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhcmVBcnJheXM7XG59KSgpO1xuXG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmNvbXBhcmVBcnJheXMnLCBrby51dGlscy5jb21wYXJlQXJyYXlzKTtcbihmdW5jdGlvbiAoKSB7XG4gICAgLy8gT2JqZWN0aXZlOlxuICAgIC8vICogR2l2ZW4gYW4gaW5wdXQgYXJyYXksIGEgY29udGFpbmVyIERPTSBub2RlLCBhbmQgYSBmdW5jdGlvbiBmcm9tIGFycmF5IGVsZW1lbnRzIHRvIGFycmF5cyBvZiBET00gbm9kZXMsXG4gICAgLy8gICBtYXAgdGhlIGFycmF5IGVsZW1lbnRzIHRvIGFycmF5cyBvZiBET00gbm9kZXMsIGNvbmNhdGVuYXRlIHRvZ2V0aGVyIGFsbCB0aGVzZSBhcnJheXMsIGFuZCB1c2UgdGhlbSB0byBwb3B1bGF0ZSB0aGUgY29udGFpbmVyIERPTSBub2RlXG4gICAgLy8gKiBOZXh0IHRpbWUgd2UncmUgZ2l2ZW4gdGhlIHNhbWUgY29tYmluYXRpb24gb2YgdGhpbmdzICh3aXRoIHRoZSBhcnJheSBwb3NzaWJseSBoYXZpbmcgbXV0YXRlZCksIHVwZGF0ZSB0aGUgY29udGFpbmVyIERPTSBub2RlXG4gICAgLy8gICBzbyB0aGF0IGl0cyBjaGlsZHJlbiBpcyBhZ2FpbiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgbWFwcGluZ3Mgb2YgdGhlIGFycmF5IGVsZW1lbnRzLCBidXQgZG9uJ3QgcmUtbWFwIGFueSBhcnJheSBlbGVtZW50cyB0aGF0IHdlXG4gICAgLy8gICBwcmV2aW91c2x5IG1hcHBlZCAtIHJldGFpbiB0aG9zZSBub2RlcywgYW5kIGp1c3QgaW5zZXJ0L2RlbGV0ZSBvdGhlciBvbmVzXG5cbiAgICAvLyBcImNhbGxiYWNrQWZ0ZXJBZGRpbmdOb2Rlc1wiIHdpbGwgYmUgaW52b2tlZCBhZnRlciBhbnkgXCJtYXBwaW5nXCItZ2VuZXJhdGVkIG5vZGVzIGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgbm9kZVxuICAgIC8vIFlvdSBjYW4gdXNlIHRoaXMsIGZvciBleGFtcGxlLCB0byBhY3RpdmF0ZSBiaW5kaW5ncyBvbiB0aG9zZSBub2Rlcy5cblxuICAgIGZ1bmN0aW9uIG1hcE5vZGVBbmRSZWZyZXNoV2hlbkNoYW5nZWQoY29udGFpbmVyTm9kZSwgbWFwcGluZywgdmFsdWVUb01hcCwgY2FsbGJhY2tBZnRlckFkZGluZ05vZGVzLCBpbmRleCkge1xuICAgICAgICAvLyBNYXAgdGhpcyBhcnJheSB2YWx1ZSBpbnNpZGUgYSBkZXBlbmRlbnRPYnNlcnZhYmxlIHNvIHdlIHJlLW1hcCB3aGVuIGFueSBkZXBlbmRlbmN5IGNoYW5nZXNcbiAgICAgICAgdmFyIG1hcHBlZE5vZGVzID0gW107XG4gICAgICAgIHZhciBkZXBlbmRlbnRPYnNlcnZhYmxlID0ga28uZGVwZW5kZW50T2JzZXJ2YWJsZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBuZXdNYXBwZWROb2RlcyA9IG1hcHBpbmcodmFsdWVUb01hcCwgaW5kZXgsIGtvLnV0aWxzLmZpeFVwQ29udGludW91c05vZGVBcnJheShtYXBwZWROb2RlcywgY29udGFpbmVyTm9kZSkpIHx8IFtdO1xuXG4gICAgICAgICAgICAvLyBPbiBzdWJzZXF1ZW50IGV2YWx1YXRpb25zLCBqdXN0IHJlcGxhY2UgdGhlIHByZXZpb3VzbHktaW5zZXJ0ZWQgRE9NIG5vZGVzXG4gICAgICAgICAgICBpZiAobWFwcGVkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGtvLnV0aWxzLnJlcGxhY2VEb21Ob2RlcyhtYXBwZWROb2RlcywgbmV3TWFwcGVkTm9kZXMpO1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja0FmdGVyQWRkaW5nTm9kZXMpXG4gICAgICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uaWdub3JlKGNhbGxiYWNrQWZ0ZXJBZGRpbmdOb2RlcywgbnVsbCwgW3ZhbHVlVG9NYXAsIG5ld01hcHBlZE5vZGVzLCBpbmRleF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgbWFwcGVkTm9kZXMgYXJyYXksIHRoZXJlYnkgdXBkYXRpbmcgdGhlIHJlY29yZFxuICAgICAgICAgICAgLy8gb2Ygd2hpY2ggbm9kZXMgd291bGQgYmUgZGVsZXRlZCBpZiB2YWx1ZVRvTWFwIHdhcyBpdHNlbGYgbGF0ZXIgcmVtb3ZlZFxuICAgICAgICAgICAgbWFwcGVkTm9kZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5UHVzaEFsbChtYXBwZWROb2RlcywgbmV3TWFwcGVkTm9kZXMpO1xuICAgICAgICB9LCBudWxsLCB7IGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogY29udGFpbmVyTm9kZSwgZGlzcG9zZVdoZW46IGZ1bmN0aW9uKCkgeyByZXR1cm4gIWtvLnV0aWxzLmFueURvbU5vZGVJc0F0dGFjaGVkVG9Eb2N1bWVudChtYXBwZWROb2Rlcyk7IH0gfSk7XG4gICAgICAgIHJldHVybiB7IG1hcHBlZE5vZGVzIDogbWFwcGVkTm9kZXMsIGRlcGVuZGVudE9ic2VydmFibGUgOiAoZGVwZW5kZW50T2JzZXJ2YWJsZS5pc0FjdGl2ZSgpID8gZGVwZW5kZW50T2JzZXJ2YWJsZSA6IHVuZGVmaW5lZCkgfTtcbiAgICB9XG5cbiAgICB2YXIgbGFzdE1hcHBpbmdSZXN1bHREb21EYXRhS2V5ID0ga28udXRpbHMuZG9tRGF0YS5uZXh0S2V5KCk7XG5cbiAgICBrby51dGlscy5zZXREb21Ob2RlQ2hpbGRyZW5Gcm9tQXJyYXlNYXBwaW5nID0gZnVuY3Rpb24gKGRvbU5vZGUsIGFycmF5LCBtYXBwaW5nLCBvcHRpb25zLCBjYWxsYmFja0FmdGVyQWRkaW5nTm9kZXMpIHtcbiAgICAgICAgLy8gQ29tcGFyZSB0aGUgcHJvdmlkZWQgYXJyYXkgYWdhaW5zdCB0aGUgcHJldmlvdXMgb25lXG4gICAgICAgIGFycmF5ID0gYXJyYXkgfHwgW107XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB2YXIgaXNGaXJzdEV4ZWN1dGlvbiA9IGtvLnV0aWxzLmRvbURhdGEuZ2V0KGRvbU5vZGUsIGxhc3RNYXBwaW5nUmVzdWx0RG9tRGF0YUtleSkgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGxhc3RNYXBwaW5nUmVzdWx0ID0ga28udXRpbHMuZG9tRGF0YS5nZXQoZG9tTm9kZSwgbGFzdE1hcHBpbmdSZXN1bHREb21EYXRhS2V5KSB8fCBbXTtcbiAgICAgICAgdmFyIGxhc3RBcnJheSA9IGtvLnV0aWxzLmFycmF5TWFwKGxhc3RNYXBwaW5nUmVzdWx0LCBmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5hcnJheUVudHJ5OyB9KTtcbiAgICAgICAgdmFyIGVkaXRTY3JpcHQgPSBrby51dGlscy5jb21wYXJlQXJyYXlzKGxhc3RBcnJheSwgYXJyYXksIG9wdGlvbnNbJ2RvbnRMaW1pdE1vdmVzJ10pO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBuZXcgbWFwcGluZyByZXN1bHRcbiAgICAgICAgdmFyIG5ld01hcHBpbmdSZXN1bHQgPSBbXTtcbiAgICAgICAgdmFyIGxhc3RNYXBwaW5nUmVzdWx0SW5kZXggPSAwO1xuICAgICAgICB2YXIgbmV3TWFwcGluZ1Jlc3VsdEluZGV4ID0gMDtcblxuICAgICAgICB2YXIgbm9kZXNUb0RlbGV0ZSA9IFtdO1xuICAgICAgICB2YXIgaXRlbXNUb1Byb2Nlc3MgPSBbXTtcbiAgICAgICAgdmFyIGl0ZW1zRm9yQmVmb3JlUmVtb3ZlQ2FsbGJhY2tzID0gW107XG4gICAgICAgIHZhciBpdGVtc0Zvck1vdmVDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgdmFyIGl0ZW1zRm9yQWZ0ZXJBZGRDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgdmFyIG1hcERhdGE7XG5cbiAgICAgICAgZnVuY3Rpb24gaXRlbU1vdmVkT3JSZXRhaW5lZChlZGl0U2NyaXB0SW5kZXgsIG9sZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBtYXBEYXRhID0gbGFzdE1hcHBpbmdSZXN1bHRbb2xkUG9zaXRpb25dO1xuICAgICAgICAgICAgaWYgKG5ld01hcHBpbmdSZXN1bHRJbmRleCAhPT0gb2xkUG9zaXRpb24pXG4gICAgICAgICAgICAgICAgaXRlbXNGb3JNb3ZlQ2FsbGJhY2tzW2VkaXRTY3JpcHRJbmRleF0gPSBtYXBEYXRhO1xuICAgICAgICAgICAgLy8gU2luY2UgdXBkYXRpbmcgdGhlIGluZGV4IG1pZ2h0IGNoYW5nZSB0aGUgbm9kZXMsIGRvIHNvIGJlZm9yZSBjYWxsaW5nIGZpeFVwQ29udGludW91c05vZGVBcnJheVxuICAgICAgICAgICAgbWFwRGF0YS5pbmRleE9ic2VydmFibGUobmV3TWFwcGluZ1Jlc3VsdEluZGV4KyspO1xuICAgICAgICAgICAga28udXRpbHMuZml4VXBDb250aW51b3VzTm9kZUFycmF5KG1hcERhdGEubWFwcGVkTm9kZXMsIGRvbU5vZGUpO1xuICAgICAgICAgICAgbmV3TWFwcGluZ1Jlc3VsdC5wdXNoKG1hcERhdGEpO1xuICAgICAgICAgICAgaXRlbXNUb1Byb2Nlc3MucHVzaChtYXBEYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNhbGxDYWxsYmFjayhjYWxsYmFjaywgaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gaXRlbXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGl0ZW1zW2ldLm1hcHBlZE5vZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobm9kZSwgaSwgaXRlbXNbaV0uYXJyYXlFbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBlZGl0U2NyaXB0SXRlbSwgbW92ZWRJbmRleDsgZWRpdFNjcmlwdEl0ZW0gPSBlZGl0U2NyaXB0W2ldOyBpKyspIHtcbiAgICAgICAgICAgIG1vdmVkSW5kZXggPSBlZGl0U2NyaXB0SXRlbVsnbW92ZWQnXTtcbiAgICAgICAgICAgIHN3aXRjaCAoZWRpdFNjcmlwdEl0ZW1bJ3N0YXR1cyddKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVkSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwRGF0YSA9IGxhc3RNYXBwaW5nUmVzdWx0W2xhc3RNYXBwaW5nUmVzdWx0SW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIHRyYWNraW5nIGNoYW5nZXMgdG8gdGhlIG1hcHBpbmcgZm9yIHRoZXNlIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwRGF0YS5kZXBlbmRlbnRPYnNlcnZhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcERhdGEuZGVwZW5kZW50T2JzZXJ2YWJsZS5kaXNwb3NlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFF1ZXVlIHRoZXNlIG5vZGVzIGZvciBsYXRlciByZW1vdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvRGVsZXRlLnB1c2guYXBwbHkobm9kZXNUb0RlbGV0ZSwga28udXRpbHMuZml4VXBDb250aW51b3VzTm9kZUFycmF5KG1hcERhdGEubWFwcGVkTm9kZXMsIGRvbU5vZGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zWydiZWZvcmVSZW1vdmUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRm9yQmVmb3JlUmVtb3ZlQ2FsbGJhY2tzW2ldID0gbWFwRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1RvUHJvY2Vzcy5wdXNoKG1hcERhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RNYXBwaW5nUmVzdWx0SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFwicmV0YWluZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgaXRlbU1vdmVkT3JSZXRhaW5lZChpLCBsYXN0TWFwcGluZ1Jlc3VsdEluZGV4KyspO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgXCJhZGRlZFwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtTW92ZWRPclJldGFpbmVkKGksIG1vdmVkSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwRGF0YSA9IHsgYXJyYXlFbnRyeTogZWRpdFNjcmlwdEl0ZW1bJ3ZhbHVlJ10sIGluZGV4T2JzZXJ2YWJsZToga28ub2JzZXJ2YWJsZShuZXdNYXBwaW5nUmVzdWx0SW5kZXgrKykgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld01hcHBpbmdSZXN1bHQucHVzaChtYXBEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zVG9Qcm9jZXNzLnB1c2gobWFwRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmlyc3RFeGVjdXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGb3JBZnRlckFkZENhbGxiYWNrc1tpXSA9IG1hcERhdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIGJlZm9yZU1vdmUgZmlyc3QgYmVmb3JlIGFueSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBET01cbiAgICAgICAgY2FsbENhbGxiYWNrKG9wdGlvbnNbJ2JlZm9yZU1vdmUnXSwgaXRlbXNGb3JNb3ZlQ2FsbGJhY2tzKTtcblxuICAgICAgICAvLyBOZXh0IHJlbW92ZSBub2RlcyBmb3IgZGVsZXRlZCBpdGVtcyAob3IganVzdCBjbGVhbiBpZiB0aGVyZSdzIGEgYmVmb3JlUmVtb3ZlIGNhbGxiYWNrKVxuICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2gobm9kZXNUb0RlbGV0ZSwgb3B0aW9uc1snYmVmb3JlUmVtb3ZlJ10gPyBrby5jbGVhbk5vZGUgOiBrby5yZW1vdmVOb2RlKTtcblxuICAgICAgICAvLyBOZXh0IGFkZC9yZW9yZGVyIHRoZSByZW1haW5pbmcgaXRlbXMgKHdpbGwgaW5jbHVkZSBkZWxldGVkIGl0ZW1zIGlmIHRoZXJlJ3MgYSBiZWZvcmVSZW1vdmUgY2FsbGJhY2spXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBuZXh0Tm9kZSA9IGtvLnZpcnR1YWxFbGVtZW50cy5maXJzdENoaWxkKGRvbU5vZGUpLCBsYXN0Tm9kZSwgbm9kZTsgbWFwRGF0YSA9IGl0ZW1zVG9Qcm9jZXNzW2ldOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEdldCBub2RlcyBmb3IgbmV3bHkgYWRkZWQgaXRlbXNcbiAgICAgICAgICAgIGlmICghbWFwRGF0YS5tYXBwZWROb2RlcylcbiAgICAgICAgICAgICAgICBrby51dGlscy5leHRlbmQobWFwRGF0YSwgbWFwTm9kZUFuZFJlZnJlc2hXaGVuQ2hhbmdlZChkb21Ob2RlLCBtYXBwaW5nLCBtYXBEYXRhLmFycmF5RW50cnksIGNhbGxiYWNrQWZ0ZXJBZGRpbmdOb2RlcywgbWFwRGF0YS5pbmRleE9ic2VydmFibGUpKTtcblxuICAgICAgICAgICAgLy8gUHV0IG5vZGVzIGluIHRoZSByaWdodCBwbGFjZSBpZiB0aGV5IGFyZW4ndCB0aGVyZSBhbHJlYWR5XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgbm9kZSA9IG1hcERhdGEubWFwcGVkTm9kZXNbal07IG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZywgbGFzdE5vZGUgPSBub2RlLCBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSAhPT0gbmV4dE5vZGUpXG4gICAgICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5pbnNlcnRBZnRlcihkb21Ob2RlLCBub2RlLCBsYXN0Tm9kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJ1biB0aGUgY2FsbGJhY2tzIGZvciBuZXdseSBhZGRlZCBub2RlcyAoZm9yIGV4YW1wbGUsIHRvIGFwcGx5IGJpbmRpbmdzLCBldGMuKVxuICAgICAgICAgICAgaWYgKCFtYXBEYXRhLmluaXRpYWxpemVkICYmIGNhbGxiYWNrQWZ0ZXJBZGRpbmdOb2Rlcykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrQWZ0ZXJBZGRpbmdOb2RlcyhtYXBEYXRhLmFycmF5RW50cnksIG1hcERhdGEubWFwcGVkTm9kZXMsIG1hcERhdGEuaW5kZXhPYnNlcnZhYmxlKTtcbiAgICAgICAgICAgICAgICBtYXBEYXRhLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYSBiZWZvcmVSZW1vdmUgY2FsbGJhY2ssIGNhbGwgaXQgYWZ0ZXIgcmVvcmRlcmluZy5cbiAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGFzc3VtZSB0aGF0IHRoZSBiZWZvcmVSZW1vdmUgY2FsbGJhY2sgd2lsbCB1c3VhbGx5IGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBub2RlcyB1c2luZ1xuICAgICAgICAvLyBzb21lIHNvcnQgb2YgYW5pbWF0aW9uLCB3aGljaCBpcyB3aHkgd2UgZmlyc3QgcmVvcmRlciB0aGUgbm9kZXMgdGhhdCB3aWxsIGJlIHJlbW92ZWQuIElmIHRoZVxuICAgICAgICAvLyBjYWxsYmFjayBpbnN0ZWFkIHJlbW92ZXMgdGhlIG5vZGVzIHJpZ2h0IGF3YXksIGl0IHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHRvIHNraXAgcmVvcmRlcmluZyB0aGVtLlxuICAgICAgICAvLyBQZXJoYXBzIHdlJ2xsIG1ha2UgdGhhdCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSBpZiB0aGlzIHNjZW5hcmlvIGJlY29tZXMgbW9yZSBjb21tb24uXG4gICAgICAgIGNhbGxDYWxsYmFjayhvcHRpb25zWydiZWZvcmVSZW1vdmUnXSwgaXRlbXNGb3JCZWZvcmVSZW1vdmVDYWxsYmFja3MpO1xuXG4gICAgICAgIC8vIEZpbmFsbHkgY2FsbCBhZnRlck1vdmUgYW5kIGFmdGVyQWRkIGNhbGxiYWNrc1xuICAgICAgICBjYWxsQ2FsbGJhY2sob3B0aW9uc1snYWZ0ZXJNb3ZlJ10sIGl0ZW1zRm9yTW92ZUNhbGxiYWNrcyk7XG4gICAgICAgIGNhbGxDYWxsYmFjayhvcHRpb25zWydhZnRlckFkZCddLCBpdGVtc0ZvckFmdGVyQWRkQ2FsbGJhY2tzKTtcblxuICAgICAgICAvLyBTdG9yZSBhIGNvcHkgb2YgdGhlIGFycmF5IGl0ZW1zIHdlIGp1c3QgY29uc2lkZXJlZCBzbyB3ZSBjYW4gZGlmZmVyZW5jZSBpdCBuZXh0IHRpbWVcbiAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQoZG9tTm9kZSwgbGFzdE1hcHBpbmdSZXN1bHREb21EYXRhS2V5LCBuZXdNYXBwaW5nUmVzdWx0KTtcbiAgICB9XG59KSgpO1xuXG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLnNldERvbU5vZGVDaGlsZHJlbkZyb21BcnJheU1hcHBpbmcnLCBrby51dGlscy5zZXREb21Ob2RlQ2hpbGRyZW5Gcm9tQXJyYXlNYXBwaW5nKTtcbmtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXNbJ2FsbG93VGVtcGxhdGVSZXdyaXRpbmcnXSA9IGZhbHNlO1xufVxuXG5rby5uYXRpdmVUZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGUgPSBuZXcga28udGVtcGxhdGVFbmdpbmUoKTtcbmtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lO1xua28ubmF0aXZlVGVtcGxhdGVFbmdpbmUucHJvdG90eXBlWydyZW5kZXJUZW1wbGF0ZVNvdXJjZSddID0gZnVuY3Rpb24gKHRlbXBsYXRlU291cmNlLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgdGVtcGxhdGVEb2N1bWVudCkge1xuICAgIHZhciB1c2VOb2Rlc0lmQXZhaWxhYmxlID0gIShrby51dGlscy5pZVZlcnNpb24gPCA5KSwgLy8gSUU8OSBjbG9uZU5vZGUgZG9lc24ndCB3b3JrIHByb3Blcmx5XG4gICAgICAgIHRlbXBsYXRlTm9kZXNGdW5jID0gdXNlTm9kZXNJZkF2YWlsYWJsZSA/IHRlbXBsYXRlU291cmNlWydub2RlcyddIDogbnVsbCxcbiAgICAgICAgdGVtcGxhdGVOb2RlcyA9IHRlbXBsYXRlTm9kZXNGdW5jID8gdGVtcGxhdGVTb3VyY2VbJ25vZGVzJ10oKSA6IG51bGw7XG5cbiAgICBpZiAodGVtcGxhdGVOb2Rlcykge1xuICAgICAgICByZXR1cm4ga28udXRpbHMubWFrZUFycmF5KHRlbXBsYXRlTm9kZXMuY2xvbmVOb2RlKHRydWUpLmNoaWxkTm9kZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0ZW1wbGF0ZVRleHQgPSB0ZW1wbGF0ZVNvdXJjZVsndGV4dCddKCk7XG4gICAgICAgIHJldHVybiBrby51dGlscy5wYXJzZUh0bWxGcmFnbWVudCh0ZW1wbGF0ZVRleHQsIHRlbXBsYXRlRG9jdW1lbnQpO1xuICAgIH1cbn07XG5cbmtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lLmluc3RhbmNlID0gbmV3IGtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lKCk7XG5rby5zZXRUZW1wbGF0ZUVuZ2luZShrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZS5pbnN0YW5jZSk7XG5cbmtvLmV4cG9ydFN5bWJvbCgnbmF0aXZlVGVtcGxhdGVFbmdpbmUnLCBrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZSk7XG4oZnVuY3Rpb24oKSB7XG4gICAga28uanF1ZXJ5VG1wbFRlbXBsYXRlRW5naW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBEZXRlY3Qgd2hpY2ggdmVyc2lvbiBvZiBqcXVlcnktdG1wbCB5b3UncmUgdXNpbmcuIFVuZm9ydHVuYXRlbHkganF1ZXJ5LXRtcGxcbiAgICAgICAgLy8gZG9lc24ndCBleHBvc2UgYSB2ZXJzaW9uIG51bWJlciwgc28gd2UgaGF2ZSB0byBpbmZlciBpdC5cbiAgICAgICAgLy8gTm90ZSB0aGF0IGFzIG9mIEtub2Nrb3V0IDEuMywgd2Ugb25seSBzdXBwb3J0IGpRdWVyeS50bXBsIDEuMC4wcHJlIGFuZCBsYXRlcixcbiAgICAgICAgLy8gd2hpY2ggS08gaW50ZXJuYWxseSByZWZlcnMgdG8gYXMgdmVyc2lvbiBcIjJcIiwgc28gb2xkZXIgdmVyc2lvbnMgYXJlIG5vIGxvbmdlciBkZXRlY3RlZC5cbiAgICAgICAgdmFyIGpRdWVyeVRtcGxWZXJzaW9uID0gdGhpcy5qUXVlcnlUbXBsVmVyc2lvbiA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICghalF1ZXJ5SW5zdGFuY2UgfHwgIShqUXVlcnlJbnN0YW5jZVsndG1wbCddKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIC8vIFNpbmNlIGl0IGV4cG9zZXMgbm8gb2ZmaWNpYWwgdmVyc2lvbiBudW1iZXIsIHdlIHVzZSBvdXIgb3duIG51bWJlcmluZyBzeXN0ZW0uIFRvIGJlIHVwZGF0ZWQgYXMganF1ZXJ5LXRtcGwgZXZvbHZlcy5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGpRdWVyeUluc3RhbmNlWyd0bXBsJ11bJ3RhZyddWyd0bXBsJ11bJ29wZW4nXS50b1N0cmluZygpLmluZGV4T2YoJ19fJykgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSAxLjAuMHByZSwgY3VzdG9tIHRhZ3Mgc2hvdWxkIGFwcGVuZCBtYXJrdXAgdG8gYW4gYXJyYXkgY2FsbGVkIFwiX19cIlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsgLy8gRmluYWwgdmVyc2lvbiBvZiBqcXVlcnkudG1wbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2goZXgpIHsgLyogQXBwYXJlbnRseSBub3QgdGhlIHZlcnNpb24gd2Ugd2VyZSBsb29raW5nIGZvciAqLyB9XG5cbiAgICAgICAgICAgIHJldHVybiAxOyAvLyBBbnkgb2xkZXIgdmVyc2lvbiB0aGF0IHdlIGRvbid0IHN1cHBvcnRcbiAgICAgICAgfSkoKTtcblxuICAgICAgICBmdW5jdGlvbiBlbnN1cmVIYXNSZWZlcmVuY2VkSlF1ZXJ5VGVtcGxhdGVzKCkge1xuICAgICAgICAgICAgaWYgKGpRdWVyeVRtcGxWZXJzaW9uIDwgMilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3VyIHZlcnNpb24gb2YgalF1ZXJ5LnRtcGwgaXMgdG9vIG9sZC4gUGxlYXNlIHVwZ3JhZGUgdG8galF1ZXJ5LnRtcGwgMS4wLjBwcmUgb3IgbGF0ZXIuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZXhlY3V0ZVRlbXBsYXRlKGNvbXBpbGVkVGVtcGxhdGUsIGRhdGEsIGpRdWVyeVRlbXBsYXRlT3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGpRdWVyeUluc3RhbmNlWyd0bXBsJ10oY29tcGlsZWRUZW1wbGF0ZSwgZGF0YSwgalF1ZXJ5VGVtcGxhdGVPcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXNbJ3JlbmRlclRlbXBsYXRlU291cmNlJ10gPSBmdW5jdGlvbih0ZW1wbGF0ZVNvdXJjZSwgYmluZGluZ0NvbnRleHQsIG9wdGlvbnMsIHRlbXBsYXRlRG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlRG9jdW1lbnQgPSB0ZW1wbGF0ZURvY3VtZW50IHx8IGRvY3VtZW50O1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBlbnN1cmVIYXNSZWZlcmVuY2VkSlF1ZXJ5VGVtcGxhdGVzKCk7XG5cbiAgICAgICAgICAgIC8vIEVuc3VyZSB3ZSBoYXZlIHN0b3JlZCBhIHByZWNvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyB0ZW1wbGF0ZSAoZG9uJ3Qgd2FudCB0byByZXBhcnNlIG9uIGV2ZXJ5IHJlbmRlcilcbiAgICAgICAgICAgIHZhciBwcmVjb21waWxlZCA9IHRlbXBsYXRlU291cmNlWydkYXRhJ10oJ3ByZWNvbXBpbGVkJyk7XG4gICAgICAgICAgICBpZiAoIXByZWNvbXBpbGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlVGV4dCA9IHRlbXBsYXRlU291cmNlWyd0ZXh0J10oKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIC8vIFdyYXAgaW4gXCJ3aXRoKCR3aGF0ZXZlci5rb0JpbmRpbmdDb250ZXh0KSB7IC4uLiB9XCJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVRleHQgPSBcInt7a29fd2l0aCAkaXRlbS5rb0JpbmRpbmdDb250ZXh0fX1cIiArIHRlbXBsYXRlVGV4dCArIFwie3sva29fd2l0aH19XCI7XG5cbiAgICAgICAgICAgICAgICBwcmVjb21waWxlZCA9IGpRdWVyeUluc3RhbmNlWyd0ZW1wbGF0ZSddKG51bGwsIHRlbXBsYXRlVGV4dCk7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVTb3VyY2VbJ2RhdGEnXSgncHJlY29tcGlsZWQnLCBwcmVjb21waWxlZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBkYXRhID0gW2JpbmRpbmdDb250ZXh0WyckZGF0YSddXTsgLy8gUHJld3JhcCB0aGUgZGF0YSBpbiBhbiBhcnJheSB0byBzdG9wIGpxdWVyeS50bXBsIGZyb20gdHJ5aW5nIHRvIHVud3JhcCBhbnkgYXJyYXlzXG4gICAgICAgICAgICB2YXIgalF1ZXJ5VGVtcGxhdGVPcHRpb25zID0galF1ZXJ5SW5zdGFuY2VbJ2V4dGVuZCddKHsgJ2tvQmluZGluZ0NvbnRleHQnOiBiaW5kaW5nQ29udGV4dCB9LCBvcHRpb25zWyd0ZW1wbGF0ZU9wdGlvbnMnXSk7XG5cbiAgICAgICAgICAgIHZhciByZXN1bHROb2RlcyA9IGV4ZWN1dGVUZW1wbGF0ZShwcmVjb21waWxlZCwgZGF0YSwgalF1ZXJ5VGVtcGxhdGVPcHRpb25zKTtcbiAgICAgICAgICAgIHJlc3VsdE5vZGVzWydhcHBlbmRUbyddKHRlbXBsYXRlRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7IC8vIFVzaW5nIFwiYXBwZW5kVG9cIiBmb3JjZXMgalF1ZXJ5L2pRdWVyeS50bXBsIHRvIHBlcmZvcm0gbmVjZXNzYXJ5IGNsZWFudXAgd29ya1xuXG4gICAgICAgICAgICBqUXVlcnlJbnN0YW5jZVsnZnJhZ21lbnRzJ10gPSB7fTsgLy8gQ2xlYXIgalF1ZXJ5J3MgZnJhZ21lbnQgY2FjaGUgdG8gYXZvaWQgYSBtZW1vcnkgbGVhayBhZnRlciBhIGxhcmdlIG51bWJlciBvZiB0ZW1wbGF0ZSByZW5kZXJzXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Tm9kZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpc1snY3JlYXRlSmF2YVNjcmlwdEV2YWx1YXRvckJsb2NrJ10gPSBmdW5jdGlvbihzY3JpcHQpIHtcbiAgICAgICAgICAgIHJldHVybiBcInt7a29fY29kZSAoKGZ1bmN0aW9uKCkgeyByZXR1cm4gXCIgKyBzY3JpcHQgKyBcIiB9KSgpKSB9fVwiO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXNbJ2FkZFRlbXBsYXRlJ10gPSBmdW5jdGlvbih0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlTWFya3VwKSB7XG4gICAgICAgICAgICBkb2N1bWVudC53cml0ZShcIjxzY3JpcHQgdHlwZT0ndGV4dC9odG1sJyBpZD0nXCIgKyB0ZW1wbGF0ZU5hbWUgKyBcIic+XCIgKyB0ZW1wbGF0ZU1hcmt1cCArIFwiPFwiICsgXCIvc2NyaXB0PlwiKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoalF1ZXJ5VG1wbFZlcnNpb24gPiAwKSB7XG4gICAgICAgICAgICBqUXVlcnlJbnN0YW5jZVsndG1wbCddWyd0YWcnXVsna29fY29kZSddID0ge1xuICAgICAgICAgICAgICAgIG9wZW46IFwiX18ucHVzaCgkMSB8fCAnJyk7XCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBqUXVlcnlJbnN0YW5jZVsndG1wbCddWyd0YWcnXVsna29fd2l0aCddID0ge1xuICAgICAgICAgICAgICAgIG9wZW46IFwid2l0aCgkMSkge1wiLFxuICAgICAgICAgICAgICAgIGNsb3NlOiBcIn0gXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAga28uanF1ZXJ5VG1wbFRlbXBsYXRlRW5naW5lLnByb3RvdHlwZSA9IG5ldyBrby50ZW1wbGF0ZUVuZ2luZSgpO1xuICAgIGtvLmpxdWVyeVRtcGxUZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBrby5qcXVlcnlUbXBsVGVtcGxhdGVFbmdpbmU7XG5cbiAgICAvLyBVc2UgdGhpcyBvbmUgYnkgZGVmYXVsdCAqb25seSBpZiBqcXVlcnkudG1wbCBpcyByZWZlcmVuY2VkKlxuICAgIHZhciBqcXVlcnlUbXBsVGVtcGxhdGVFbmdpbmVJbnN0YW5jZSA9IG5ldyBrby5qcXVlcnlUbXBsVGVtcGxhdGVFbmdpbmUoKTtcbiAgICBpZiAoanF1ZXJ5VG1wbFRlbXBsYXRlRW5naW5lSW5zdGFuY2UualF1ZXJ5VG1wbFZlcnNpb24gPiAwKVxuICAgICAgICBrby5zZXRUZW1wbGF0ZUVuZ2luZShqcXVlcnlUbXBsVGVtcGxhdGVFbmdpbmVJbnN0YW5jZSk7XG5cbiAgICBrby5leHBvcnRTeW1ib2woJ2pxdWVyeVRtcGxUZW1wbGF0ZUVuZ2luZScsIGtvLmpxdWVyeVRtcGxUZW1wbGF0ZUVuZ2luZSk7XG59KSgpO1xufSkpO1xufSgpKTtcbn0pKCk7XG4iLCIvLyEgbW9tZW50LmpzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIGdsb2JhbC5tb21lbnQgPSBmYWN0b3J5KClcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGhvb2tDYWxsYmFjaztcblxuICAgIGZ1bmN0aW9uIGhvb2tzICgpIHtcbiAgICAgICAgcmV0dXJuIGhvb2tDYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byByZWdpc3RlciB0aGUgbWV0aG9kIGNhbGxlZCB3aXRoIG1vbWVudCgpXG4gICAgLy8gd2l0aG91dCBjcmVhdGluZyBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgZnVuY3Rpb24gc2V0SG9va0NhbGxiYWNrIChjYWxsYmFjaykge1xuICAgICAgICBob29rQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FycmF5KGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIEFycmF5IHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3QoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IHdpbGwgdHJlYXQgdW5kZWZpbmVkIGFuZCBudWxsIGFzIG9iamVjdCBpZiBpdCB3YXNuJ3QgZm9yXG4gICAgICAgIC8vIGlucHV0ICE9IG51bGxcbiAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoID09PSAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gICAgICAgIHZhciByZXMgPSBbXSwgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzLnB1c2goZm4oYXJyW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPd25Qcm9wKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmQoYSwgYikge1xuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGIsIGkpKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndG9TdHJpbmcnKSkge1xuICAgICAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndmFsdWVPZicpKSB7XG4gICAgICAgICAgICBhLnZhbHVlT2YgPSBiLnZhbHVlT2Y7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVEMgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCB0cnVlKS51dGMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZhdWx0UGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZXAgY2xvbmUgdGhpcyBvYmplY3QuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbXB0eSAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVudXNlZFRva2VucyAgICA6IFtdLFxuICAgICAgICAgICAgdW51c2VkSW5wdXQgICAgIDogW10sXG4gICAgICAgICAgICBvdmVyZmxvdyAgICAgICAgOiAtMixcbiAgICAgICAgICAgIGNoYXJzTGVmdE92ZXIgICA6IDAsXG4gICAgICAgICAgICBudWxsSW5wdXQgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGludmFsaWRNb250aCAgICA6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkRm9ybWF0ICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZCA6IGZhbHNlLFxuICAgICAgICAgICAgaXNvICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICBwYXJzZWREYXRlUGFydHMgOiBbXSxcbiAgICAgICAgICAgIG1lcmlkaWVtICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICByZmMyODIyICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHdlZWtkYXlNaXNtYXRjaCA6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2luZ0ZsYWdzKG0pIHtcbiAgICAgICAgaWYgKG0uX3BmID09IG51bGwpIHtcbiAgICAgICAgICAgIG0uX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9wZjtcbiAgICB9XG5cbiAgICB2YXIgc29tZTtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLnNvbWUpIHtcbiAgICAgICAgc29tZSA9IEFycmF5LnByb3RvdHlwZS5zb21lO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNvbWUgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgICAgICAgICB2YXIgdCA9IE9iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgICAgIGlmIChtLl9pc1ZhbGlkID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmbGFncyA9IGdldFBhcnNpbmdGbGFncyhtKTtcbiAgICAgICAgICAgIHZhciBwYXJzZWRQYXJ0cyA9IHNvbWUuY2FsbChmbGFncy5wYXJzZWREYXRlUGFydHMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgIT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGlzTm93VmFsaWQgPSAhaXNOYU4obS5fZC5nZXRUaW1lKCkpICYmXG4gICAgICAgICAgICAgICAgZmxhZ3Mub3ZlcmZsb3cgPCAwICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRNb250aCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkV2Vla2RheSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy53ZWVrZGF5TWlzbWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MubnVsbElucHV0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgKCFmbGFncy5tZXJpZGllbSB8fCAoZmxhZ3MubWVyaWRpZW0gJiYgcGFyc2VkUGFydHMpKTtcblxuICAgICAgICAgICAgaWYgKG0uX3N0cmljdCkge1xuICAgICAgICAgICAgICAgIGlzTm93VmFsaWQgPSBpc05vd1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNoYXJzTGVmdE92ZXIgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MudW51c2VkVG9rZW5zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4gPT0gbnVsbCB8fCAhT2JqZWN0LmlzRnJvemVuKG0pKSB7XG4gICAgICAgICAgICAgICAgbS5faXNWYWxpZCA9IGlzTm93VmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNOb3dWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkIChmbGFncykge1xuICAgICAgICB2YXIgbSA9IGNyZWF0ZVVUQyhOYU4pO1xuICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0ZW5kKGdldFBhcnNpbmdGbGFncyhtKSwgZmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLnVzZXJJbnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBQbHVnaW5zIHRoYXQgYWRkIHByb3BlcnRpZXMgc2hvdWxkIGFsc28gYWRkIHRoZSBrZXkgaGVyZSAobnVsbCB2YWx1ZSksXG4gICAgLy8gc28gd2UgY2FuIHByb3Blcmx5IGNsb25lIG91cnNlbHZlcy5cbiAgICB2YXIgbW9tZW50UHJvcGVydGllcyA9IGhvb2tzLm1vbWVudFByb3BlcnRpZXMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGksIHByb3AsIHZhbDtcblxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzQU1vbWVudE9iamVjdCkpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pKSkge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fZikpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2wpKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9zdHJpY3QpKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fdHptKSkge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzVVRDKSkge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9vZmZzZXQpKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fcGYpKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sb2NhbGUpKSB7XG4gICAgICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gbW9tZW50UHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICB2YWwgPSBmcm9tW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB0b1twcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgICAgICBjb3B5Q29uZmlnKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShjb25maWcuX2QgIT0gbnVsbCA/IGNvbmZpZy5fZC5nZXRUaW1lKCkgOiBOYU4pO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgICAgIC8vIG9iamVjdHMuXG4gICAgICAgIGlmICh1cGRhdGVJblByb2dyZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudCAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBNb21lbnQgfHwgKG9iaiAhPSBudWxsICYmIG9iai5faXNBTW9tZW50T2JqZWN0ICE9IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0Zsb29yIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIC0wIC0+IDBcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKSB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW50KGFyZ3VtZW50Rm9yQ29lcmNpb24pIHtcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcbiAgICAgICAgICAgIHZhbHVlID0gMDtcblxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBhYnNGbG9vcihjb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG4gICAgZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnJheTEsIGFycmF5MiwgZG9udENvbnZlcnQpIHtcbiAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGRpZmZzID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKChkb250Q29udmVydCAmJiBhcnJheTFbaV0gIT09IGFycmF5MltpXSkgfHxcbiAgICAgICAgICAgICAgICAoIWRvbnRDb252ZXJ0ICYmIHRvSW50KGFycmF5MVtpXSkgIT09IHRvSW50KGFycmF5MltpXSkpKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gICAgICAgIGlmIChob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEZXByZWNhdGlvbiB3YXJuaW5nOiAnICsgbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZShtc2csIGZuKSB7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgYXJnO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSAnXFxuWycgKyBpICsgJ10gJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0ga2V5ICsgJzogJyArIGFyZ3VtZW50c1swXVtrZXldICsgJywgJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fybihtc2cgKyAnXFxuQXJndW1lbnRzOiAnICsgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgKyAnXFxuJyArIChuZXcgRXJyb3IoKSkuc3RhY2spO1xuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIGZuKTtcbiAgICB9XG5cbiAgICB2YXIgZGVwcmVjYXRpb25zID0ge307XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVTaW1wbGUobmFtZSwgbXNnKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPSBmYWxzZTtcbiAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCAoY29uZmlnKSB7XG4gICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICBmb3IgKGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24ocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2ldID0gcHJvcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1snXycgKyBpXSA9IHByb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAvLyBMZW5pZW50IG9yZGluYWwgcGFyc2luZyBhY2NlcHRzIGp1c3QgYSBudW1iZXIgaW4gYWRkaXRpb24gdG9cbiAgICAgICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfZGF5T2ZNb250aE9yZGluYWxQYXJzZS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICB0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2UgfHwgdGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSkgK1xuICAgICAgICAgICAgICAgICd8JyArICgvXFxkezEsMn0vKS5zb3VyY2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBleHRlbmQoe30sIHBhcmVudENvbmZpZyksIHByb3A7XG4gICAgICAgIGZvciAocHJvcCBpbiBjaGlsZENvbmZpZykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkgJiYgaXNPYmplY3QoY2hpbGRDb25maWdbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBwYXJlbnRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBjaGlsZENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZENvbmZpZ1twcm9wXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGNoaWxkQ29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocHJvcCBpbiBwYXJlbnRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKHBhcmVudENvbmZpZywgcHJvcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgY2hhbmdlcyB0byBwcm9wZXJ0aWVzIGRvbid0IG1vZGlmeSBwYXJlbnQgY29uZmlnXG4gICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gZXh0ZW5kKHt9LCByZXNbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9jYWxlKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cztcblxuICAgIGlmIChPYmplY3Qua2V5cykge1xuICAgICAgICBrZXlzID0gT2JqZWN0LmtleXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAga2V5cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHZhciBpLCByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChvYmosIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRDYWxlbmRhciA9IHtcbiAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciAoa2V5LCBtb20sIG5vdykge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XSB8fCB0aGlzLl9jYWxlbmRhclsnc2FtZUVsc2UnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KSA/IG91dHB1dC5jYWxsKG1vbSwgbm93KSA6IG91dHB1dDtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvbmdEYXRlRm9ybWF0ID0ge1xuICAgICAgICBMVFMgIDogJ2g6bW06c3MgQScsXG4gICAgICAgIExUICAgOiAnaDptbSBBJyxcbiAgICAgICAgTCAgICA6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgTEwgICA6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICBMTEwgIDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgICAgICBMTExMIDogJ2RkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEEnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvbmdEYXRlRm9ybWF0IChrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0sXG4gICAgICAgICAgICBmb3JtYXRVcHBlciA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleS50b1VwcGVyQ2FzZSgpXTtcblxuICAgICAgICBpZiAoZm9ybWF0IHx8ICFmb3JtYXRVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBmb3JtYXRVcHBlci5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zbGljZSgxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRJbnZhbGlkRGF0ZSA9ICdJbnZhbGlkIGRhdGUnO1xuXG4gICAgZnVuY3Rpb24gaW52YWxpZERhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52YWxpZERhdGU7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRPcmRpbmFsID0gJyVkJztcbiAgICB2YXIgZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UgPSAvXFxkezEsMn0vO1xuXG4gICAgZnVuY3Rpb24gb3JkaW5hbCAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoJyVkJywgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFJlbGF0aXZlVGltZSA9IHtcbiAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgcGFzdCAgIDogJyVzIGFnbycsXG4gICAgICAgIHMgIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICBzcyA6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgbSAgOiAnYSBtaW51dGUnLFxuICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgaCAgOiAnYW4gaG91cicsXG4gICAgICAgIGhoIDogJyVkIGhvdXJzJyxcbiAgICAgICAgZCAgOiAnYSBkYXknLFxuICAgICAgICBkZCA6ICclZCBkYXlzJyxcbiAgICAgICAgTSAgOiAnYSBtb250aCcsXG4gICAgICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgICAgIHkgIDogJ2EgeWVhcicsXG4gICAgICAgIHl5IDogJyVkIHllYXJzJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUgKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgIHJldHVybiAoaXNGdW5jdGlvbihvdXRwdXQpKSA/XG4gICAgICAgICAgICBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSA6XG4gICAgICAgICAgICBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXN0RnV0dXJlIChkaWZmLCBvdXRwdXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFsaWFzZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFVuaXRBbGlhcyAodW5pdCwgc2hvcnRoYW5kKSB7XG4gICAgICAgIHZhciBsb3dlckNhc2UgPSB1bml0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGFsaWFzZXNbbG93ZXJDYXNlXSA9IGFsaWFzZXNbbG93ZXJDYXNlICsgJ3MnXSA9IGFsaWFzZXNbc2hvcnRoYW5kXSA9IHVuaXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplVW5pdHModW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB1bml0cyA9PT0gJ3N0cmluZycgPyBhbGlhc2VzW3VuaXRzXSB8fCBhbGlhc2VzW3VuaXRzLnRvTG93ZXJDYXNlKCldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdFVuaXRzKGlucHV0T2JqZWN0KSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSB7fSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wLFxuICAgICAgICAgICAgcHJvcDtcblxuICAgICAgICBmb3IgKHByb3AgaW4gaW5wdXRPYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGlucHV0T2JqZWN0LCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wID0gbm9ybWFsaXplVW5pdHMocHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dFtub3JtYWxpemVkUHJvcF0gPSBpbnB1dE9iamVjdFtwcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZElucHV0O1xuICAgIH1cblxuICAgIHZhciBwcmlvcml0aWVzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRVbml0UHJpb3JpdHkodW5pdCwgcHJpb3JpdHkpIHtcbiAgICAgICAgcHJpb3JpdGllc1t1bml0XSA9IHByaW9yaXR5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFByaW9yaXRpemVkVW5pdHModW5pdHNPYmopIHtcbiAgICAgICAgdmFyIHVuaXRzID0gW107XG4gICAgICAgIGZvciAodmFyIHUgaW4gdW5pdHNPYmopIHtcbiAgICAgICAgICAgIHVuaXRzLnB1c2goe3VuaXQ6IHUsIHByaW9yaXR5OiBwcmlvcml0aWVzW3VdfSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHplcm9GaWxsKG51bWJlciwgdGFyZ2V0TGVuZ3RoLCBmb3JjZVNpZ24pIHtcbiAgICAgICAgdmFyIGFic051bWJlciA9ICcnICsgTWF0aC5hYnMobnVtYmVyKSxcbiAgICAgICAgICAgIHplcm9zVG9GaWxsID0gdGFyZ2V0TGVuZ3RoIC0gYWJzTnVtYmVyLmxlbmd0aCxcbiAgICAgICAgICAgIHNpZ24gPSBudW1iZXIgPj0gMDtcbiAgICAgICAgcmV0dXJuIChzaWduID8gKGZvcmNlU2lnbiA/ICcrJyA6ICcnKSA6ICctJykgK1xuICAgICAgICAgICAgTWF0aC5wb3coMTAsIE1hdGgubWF4KDAsIHplcm9zVG9GaWxsKSkudG9TdHJpbmcoKS5zdWJzdHIoMSkgKyBhYnNOdW1iZXI7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nO1xuXG4gICAgdmFyIGxvY2FsRm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2c7XG5cbiAgICB2YXIgZm9ybWF0RnVuY3Rpb25zID0ge307XG5cbiAgICB2YXIgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7fTtcblxuICAgIC8vIHRva2VuOiAgICAnTSdcbiAgICAvLyBwYWRkZWQ6ICAgWydNTScsIDJdXG4gICAgLy8gb3JkaW5hbDogICdNbydcbiAgICAvLyBjYWxsYmFjazogZnVuY3Rpb24gKCkgeyB0aGlzLm1vbnRoKCkgKyAxIH1cbiAgICBmdW5jdGlvbiBhZGRGb3JtYXRUb2tlbiAodG9rZW4sIHBhZGRlZCwgb3JkaW5hbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGJhY2tdKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGVkKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1twYWRkZWRbMF1dID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvRmlsbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHBhZGRlZFsxXSwgcGFkZGVkWzJdKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yZGluYWwpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW29yZGluYWxdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5vcmRpbmFsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdG9rZW4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0Lm1hdGNoKC9cXFtbXFxzXFxTXS8pKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBmb3JtYXQubWF0Y2goZm9ybWF0dGluZ1Rva2VucyksIGksIGxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSAnJywgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBpc0Z1bmN0aW9uKGFycmF5W2ldKSA/IGFycmF5W2ldLmNhbGwobW9tLCBmb3JtYXQpIDogYXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCBkYXRlIHVzaW5nIG5hdGl2ZSBkYXRlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG0ubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxvY2FsZURhdGEoKSk7XG4gICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdID0gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gfHwgbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdKG0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGFuZEZvcm1hdChmb3JtYXQsIGxvY2FsZSkge1xuICAgICAgICB2YXIgaSA9IDU7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLmxvbmdEYXRlRm9ybWF0KGlucHV0KSB8fCBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKGxvY2FsRm9ybWF0dGluZ1Rva2VucywgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKTtcbiAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2gxICAgICAgICAgPSAvXFxkLzsgICAgICAgICAgICAvLyAgICAgICAwIC0gOVxuICAgIHZhciBtYXRjaDIgICAgICAgICA9IC9cXGRcXGQvOyAgICAgICAgICAvLyAgICAgIDAwIC0gOTlcbiAgICB2YXIgbWF0Y2gzICAgICAgICAgPSAvXFxkezN9LzsgICAgICAgICAvLyAgICAgMDAwIC0gOTk5XG4gICAgdmFyIG1hdGNoNCAgICAgICAgID0gL1xcZHs0fS87ICAgICAgICAgLy8gICAgMDAwMCAtIDk5OTlcbiAgICB2YXIgbWF0Y2g2ICAgICAgICAgPSAvWystXT9cXGR7Nn0vOyAgICAvLyAtOTk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMiAgICAgID0gL1xcZFxcZD8vOyAgICAgICAgIC8vICAgICAgIDAgLSA5OVxuICAgIHZhciBtYXRjaDN0bzQgICAgICA9IC9cXGRcXGRcXGRcXGQ/LzsgICAgIC8vICAgICA5OTkgLSA5OTk5XG4gICAgdmFyIG1hdGNoNXRvNiAgICAgID0gL1xcZFxcZFxcZFxcZFxcZFxcZD8vOyAvLyAgIDk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMyAgICAgID0gL1xcZHsxLDN9LzsgICAgICAgLy8gICAgICAgMCAtIDk5OVxuICAgIHZhciBtYXRjaDF0bzQgICAgICA9IC9cXGR7MSw0fS87ICAgICAgIC8vICAgICAgIDAgLSA5OTk5XG4gICAgdmFyIG1hdGNoMXRvNiAgICAgID0gL1srLV0/XFxkezEsNn0vOyAgLy8gLTk5OTk5OSAtIDk5OTk5OVxuXG4gICAgdmFyIG1hdGNoVW5zaWduZWQgID0gL1xcZCsvOyAgICAgICAgICAgLy8gICAgICAgMCAtIGluZlxuICAgIHZhciBtYXRjaFNpZ25lZCAgICA9IC9bKy1dP1xcZCsvOyAgICAgIC8vICAgIC1pbmYgLSBpbmZcblxuICAgIHZhciBtYXRjaE9mZnNldCAgICA9IC9afFsrLV1cXGRcXGQ6P1xcZFxcZC9naTsgLy8gKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgdmFyIG1hdGNoU2hvcnRPZmZzZXQgPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy9naTsgLy8gKzAwIC0wMCArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcblxuICAgIHZhciBtYXRjaFRpbWVzdGFtcCA9IC9bKy1dP1xcZCsoXFwuXFxkezEsM30pPy87IC8vIDEyMzQ1Njc4OSAxMjM0NTY3ODkuMTIzXG5cbiAgICAvLyBhbnkgd29yZCAob3IgdHdvKSBjaGFyYWN0ZXJzIG9yIG51bWJlcnMgaW5jbHVkaW5nIHR3by90aHJlZSB3b3JkIG1vbnRoIGluIGFyYWJpYy5cbiAgICAvLyBpbmNsdWRlcyBzY290dGlzaCBnYWVsaWMgdHdvIHdvcmQgYW5kIGh5cGhlbmF0ZWQgbW9udGhzXG4gICAgdmFyIG1hdGNoV29yZCA9IC9bMC05XXswLDI1Nn1bJ2EtelxcdTAwQTAtXFx1MDVGRlxcdTA3MDAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkYwN1xcdUZGMTAtXFx1RkZFRl17MSwyNTZ9fFtcXHUwNjAwLVxcdTA2RkZcXC9dezEsMjU2fShcXHMqP1tcXHUwNjAwLVxcdTA2RkZdezEsMjU2fSl7MSwyfS9pO1xuXG4gICAgdmFyIHJlZ2V4ZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFJlZ2V4VG9rZW4gKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICAgICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KSA/IHJlZ2V4IDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gKGlzU3RyaWN0ICYmIHN0cmljdFJlZ2V4KSA/IHN0cmljdFJlZ2V4IDogcmVnZXg7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuICh0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcmVnZXhFc2NhcGUocy5yZXBsYWNlKCdcXFxcJywgJycpLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZywgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICByZXR1cm4gcDEgfHwgcDIgfHwgcDMgfHwgcDQ7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWdleEVzY2FwZShzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuICAgIH1cblxuICAgIHZhciB0b2tlbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFBhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaSwgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdG9rZW4gPSBbdG9rZW5dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWJlcihjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbY2FsbGJhY2tdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbltpXV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1BhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgICAgICBjYWxsYmFjayhpbnB1dCwgY29uZmlnLl93LCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIGlucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaGFzT3duUHJvcCh0b2tlbnMsIHRva2VuKSkge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuXShpbnB1dCwgY29uZmlnLl9hLCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBZRUFSID0gMDtcbiAgICB2YXIgTU9OVEggPSAxO1xuICAgIHZhciBEQVRFID0gMjtcbiAgICB2YXIgSE9VUiA9IDM7XG4gICAgdmFyIE1JTlVURSA9IDQ7XG4gICAgdmFyIFNFQ09ORCA9IDU7XG4gICAgdmFyIE1JTExJU0VDT05EID0gNjtcbiAgICB2YXIgV0VFSyA9IDc7XG4gICAgdmFyIFdFRUtEQVkgPSA4O1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1knLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55ZWFyKCk7XG4gICAgICAgIHJldHVybiB5IDw9IDk5OTkgPyAnJyArIHkgOiAnKycgKyB5O1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWScsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWScsICAgNF0sICAgICAgIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsICA1XSwgICAgICAgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZWScsIDYsIHRydWVdLCAwLCAneWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd5ZWFyJywgJ3knKTtcblxuICAgIC8vIFBSSU9SSVRJRVNcblxuICAgIGFkZFVuaXRQcmlvcml0eSgneWVhcicsIDEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWScsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVknLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbignWVlZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBpbnB1dC5sZW5ndGggPT09IDIgPyBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCkgOiB0b0ludChpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1knLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICBob29rcy5wYXJzZVR3b0RpZ2l0WWVhciA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gdG9JbnQoaW5wdXQpICsgKHRvSW50KGlucHV0KSA+IDY4ID8gMTkwMCA6IDIwMDApO1xuICAgIH07XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0WWVhciA9IG1ha2VHZXRTZXQoJ0Z1bGxZZWFyJywgdHJ1ZSk7XG5cbiAgICBmdW5jdGlvbiBnZXRJc0xlYXBZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXRTZXQgKHVuaXQsIGtlZXBUaW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0JDEodGhpcywgdW5pdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCBrZWVwVGltZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChtb20sIHVuaXQpIHtcbiAgICAgICAgcmV0dXJuIG1vbS5pc1ZhbGlkKCkgP1xuICAgICAgICAgICAgbW9tLl9kWydnZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0JDEgKG1vbSwgdW5pdCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKG1vbS5pc1ZhbGlkKCkgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdGdWxsWWVhcicgJiYgaXNMZWFwWWVhcihtb20ueWVhcigpKSAmJiBtb20ubW9udGgoKSA9PT0gMSAmJiBtb20uZGF0ZSgpID09PSAyOSkge1xuICAgICAgICAgICAgICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSh2YWx1ZSwgbW9tLm1vbnRoKCksIGRheXNJbk1vbnRoKHZhbHVlLCBtb20ubW9udGgoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHN0cmluZ0dldCAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBzdHJpbmdTZXQgKHVuaXRzLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHVuaXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVPYmplY3RVbml0cyh1bml0cyk7XG4gICAgICAgICAgICB2YXIgcHJpb3JpdGl6ZWQgPSBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJpb3JpdGl6ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzW3ByaW9yaXRpemVkW2ldLnVuaXRdKHVuaXRzW3ByaW9yaXRpemVkW2ldLnVuaXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb2QobiwgeCkge1xuICAgICAgICByZXR1cm4gKChuICUgeCkgKyB4KSAlIHg7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4T2Y7XG5cbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgICAgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4T2YgPSBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgLy8gSSBrbm93XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1vZE1vbnRoID0gbW9kKG1vbnRoLCAxMik7XG4gICAgICAgIHllYXIgKz0gKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG4gICAgICAgIHJldHVybiBtb2RNb250aCA9PT0gMSA/IChpc0xlYXBZZWFyKHllYXIpID8gMjkgOiAyOCkgOiAoMzEgLSBtb2RNb250aCAlIDcgJSAyKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignTScsIFsnTU0nLCAyXSwgJ01vJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aCgpICsgMTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbW9udGgnLCAnTScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbW9udGgnLCA4KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ00nLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NJywgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NJywgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ00nLCAnTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSB0b0ludChpbnB1dCkgLSAxO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ01NTScsICdNTU1NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIG1vbnRoID0gY29uZmlnLl9sb2NhbGUubW9udGhzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgbW9udGggbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkLlxuICAgICAgICBpZiAobW9udGggIT0gbnVsbCkge1xuICAgICAgICAgICAgYXJyYXlbTU9OVEhdID0gbW9udGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkTW9udGggPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgdmFyIE1PTlRIU19JTl9GT1JNQVQgPSAvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NPy87XG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNb250aHMgPSAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHMgKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHMgOlxuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHNbbS5tb250aCgpXSA6XG4gICAgICAgICAgICB0aGlzLl9tb250aHNbKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0ID0gJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0IChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydCA6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydFttLm1vbnRoKCldIDpcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0W01PTlRIU19JTl9GT1JNQVQudGVzdChmb3JtYXQpID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSddW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgaWksIG1vbSwgbGxjID0gbW9udGhOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHVzZWRcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRocyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZSAobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgbW9tLCByZWdleDtcblxuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlLmNhbGwodGhpcywgbW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhZGQgc29ydGluZ1xuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyXG4gICAgICAgIC8vIHNlZSBzb3J0aW5nIGluIGNvbXB1dGVNb250aHNQYXJzZVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0cmljdCAmJiAhdGhpcy5fbW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU1NJyAmJiB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU0nICYmIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzZXRNb250aCAobW9tLCB2YWx1ZSkge1xuICAgICAgICB2YXIgZGF5T2ZNb250aDtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXlPZk1vbnRoID0gTWF0aC5taW4obW9tLmRhdGUoKSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgdmFsdWUpKTtcbiAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArICdNb250aCddKHZhbHVlLCBkYXlPZk1vbnRoKTtcbiAgICAgICAgcmV0dXJuIG1vbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRNb250aCAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCAnTW9udGgnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERheXNJbk1vbnRoICgpIHtcbiAgICAgICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TW9udGhzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNTaG9ydFJlZ2V4IChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1JlZ2V4ID0gZGVmYXVsdE1vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA6IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZU1vbnRoc1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNob3J0UGllY2VzID0gW10sIGxvbmdQaWVjZXMgPSBbXSwgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksIG1vbTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKHRoaXMubW9udGhzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaCh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgc2hvcnRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShzaG9ydFBpZWNlc1tpXSk7XG4gICAgICAgICAgICBsb25nUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobG9uZ1BpZWNlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEYXRlICh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xuICAgICAgICAvLyBjYW4ndCBqdXN0IGFwcGx5KCkgdG8gY3JlYXRlIGEgZGF0ZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE4MTM0OFxuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcblxuICAgICAgICAvLyB0aGUgZGF0ZSBjb25zdHJ1Y3RvciByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwICYmIGlzRmluaXRlKGRhdGUuZ2V0RnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDRGF0ZSAoeSkge1xuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xuXG4gICAgICAgIC8vIHRoZSBEYXRlLlVUQyBmdW5jdGlvbiByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwICYmIGlzRmluaXRlKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgLy8gc3RhcnQtb2YtZmlyc3Qtd2VlayAtIHN0YXJ0LW9mLXllYXJcbiAgICBmdW5jdGlvbiBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIC8vIGZpcnN0LXdlZWsgZGF5IC0tIHdoaWNoIGphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrICg0IGZvciBpc28sIDEgZm9yIG90aGVyKVxuICAgICAgICAgICAgZndkID0gNyArIGRvdyAtIGRveSxcbiAgICAgICAgICAgIC8vIGZpcnN0LXdlZWsgZGF5IGxvY2FsIHdlZWtkYXkgLS0gd2hpY2ggbG9jYWwgd2Vla2RheSBpcyBmd2RcbiAgICAgICAgICAgIGZ3ZGx3ID0gKDcgKyBjcmVhdGVVVENEYXRlKHllYXIsIDAsIGZ3ZCkuZ2V0VVRDRGF5KCkgLSBkb3cpICUgNztcblxuICAgICAgICByZXR1cm4gLWZ3ZGx3ICsgZndkIC0gMTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlI0NhbGN1bGF0aW5nX2FfZGF0ZV9naXZlbl90aGVfeWVhci4yQ193ZWVrX251bWJlcl9hbmRfd2Vla2RheVxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrcyh5ZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgbG9jYWxXZWVrZGF5ID0gKDcgKyB3ZWVrZGF5IC0gZG93KSAlIDcsXG4gICAgICAgICAgICB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRheU9mWWVhciA9IDEgKyA3ICogKHdlZWsgLSAxKSArIGxvY2FsV2Vla2RheSArIHdlZWtPZmZzZXQsXG4gICAgICAgICAgICByZXNZZWFyLCByZXNEYXlPZlllYXI7XG5cbiAgICAgICAgaWYgKGRheU9mWWVhciA8PSAwKSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhciAtIDE7XG4gICAgICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlzSW5ZZWFyKHJlc1llYXIpICsgZGF5T2ZZZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKGRheU9mWWVhciA+IGRheXNJblllYXIoeWVhcikpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyICsgMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheU9mWWVhciAtIGRheXNJblllYXIoeWVhcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhcjtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheU9mWWVhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyOiByZXNZZWFyLFxuICAgICAgICAgICAgZGF5T2ZZZWFyOiByZXNEYXlPZlllYXJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrT2ZZZWFyKG1vbSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQobW9tLnllYXIoKSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgd2VlayA9IE1hdGguZmxvb3IoKG1vbS5kYXlPZlllYXIoKSAtIHdlZWtPZmZzZXQgLSAxKSAvIDcpICsgMSxcbiAgICAgICAgICAgIHJlc1dlZWssIHJlc1llYXI7XG5cbiAgICAgICAgaWYgKHdlZWsgPCAxKSB7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSAtIDE7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlayArIHdlZWtzSW5ZZWFyKHJlc1llYXIsIGRvdywgZG95KTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrID4gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlayAtIHdlZWtzSW5ZZWFyKG1vbS55ZWFyKCksIGRvdywgZG95KTtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpO1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2VlazogcmVzV2VlayxcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrc0luWWVhcih5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrT2Zmc2V0TmV4dCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyICsgMSwgZG93LCBkb3kpO1xuICAgICAgICByZXR1cm4gKGRheXNJblllYXIoeWVhcikgLSB3ZWVrT2Zmc2V0ICsgd2Vla09mZnNldE5leHQpIC8gNztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigndycsIFsnd3cnLCAyXSwgJ3dvJywgJ3dlZWsnKTtcbiAgICBhZGRGb3JtYXRUb2tlbignVycsIFsnV1cnLCAyXSwgJ1dvJywgJ2lzb1dlZWsnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnd2VlaycsICd3Jyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrJywgJ1cnKTtcblxuICAgIC8vIFBSSU9SSVRJRVNcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnd2VlaycsIDUpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2VlaycsIDUpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigndycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3d3JywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1cnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdXVycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsndycsICd3dycsICdXJywgJ1dXJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAxKV0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrIChtb20pIHtcbiAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIobW9tLCB0aGlzLl93ZWVrLmRvdywgdGhpcy5fd2Vlay5kb3kpLndlZWs7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrID0ge1xuICAgICAgICBkb3cgOiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgZG95IDogNiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mV2VlayAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mWWVhciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRveTtcbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrIChpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKChpbnB1dCAtIHdlZWspICogNywgJ2QnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrIChpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHdlZWtPZlllYXIodGhpcywgMSwgNCkud2VlaztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkJywgMCwgJ2RvJywgJ2RheScpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGRkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZScsIDAsIDAsICd3ZWVrZGF5Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ0UnLCAwLCAwLCAnaXNvV2Vla2RheScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXknLCAnZCcpO1xuICAgIGFkZFVuaXRBbGlhcygnd2Vla2RheScsICdlJyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrZGF5JywgJ0UnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXknLCAxMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrZGF5JywgMTEpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2Vla2RheScsIDExKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2QnLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2UnLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0UnLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzTWluUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2RkJywgJ2RkZCcsICdkZGRkJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgd2Vla2RheSA9IGNvbmZpZy5fbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBnZXQgYSB3ZWVrZGF5IG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZFxuICAgICAgICBpZiAod2Vla2RheSAhPSBudWxsKSB7XG4gICAgICAgICAgICB3ZWVrLmQgPSB3ZWVrZGF5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZFdlZWtkYXkgPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydkJywgJ2UnLCAnRSddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICBmdW5jdGlvbiBwYXJzZVdlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05hTihpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbnB1dCwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQgPSBsb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCk7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KSAlIDcgfHwgNztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNOYU4oaW5wdXQpID8gbnVsbCA6IGlucHV0O1xuICAgIH1cblxuICAgIC8vIExPQ0FMRVNcblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXMgPSAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXMgKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX3dlZWtkYXlzKSA/IHRoaXMuX3dlZWtkYXlzIDpcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX3dlZWtkYXlzKSA/IHRoaXMuX3dlZWtkYXlzW20uZGF5KCldIDpcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzW3RoaXMuX3dlZWtkYXlzLmlzRm9ybWF0LnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXVttLmRheSgpXTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQgPSAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzU2hvcnQgKG0pIHtcbiAgICAgICAgcmV0dXJuIChtKSA/IHRoaXMuX3dlZWtkYXlzU2hvcnRbbS5kYXkoKV0gOiB0aGlzLl93ZWVrZGF5c1Nob3J0O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4gPSAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNNaW4gKG0pIHtcbiAgICAgICAgcmV0dXJuIChtKSA/IHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldIDogdGhpcy5fd2Vla2RheXNNaW47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UkMSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIGlpLCBtb20sIGxsYyA9IHdlZWtkYXlOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSAod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVTdHJpY3RQYXJzZSQxLmNhbGwodGhpcywgd2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG5cbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGRkZCcgJiYgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkZCcgJiYgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZCcgJiYgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mV2VlayAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXkgPSB0aGlzLl9pc1VUQyA/IHRoaXMuX2QuZ2V0VVRDRGF5KCkgOiB0aGlzLl9kLmdldERheSgpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaW5wdXQgPSBwYXJzZVdlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZChpbnB1dCAtIGRheSwgJ2QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRMb2NhbGVEYXlPZldlZWsgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2Vla2RheSA9ICh0aGlzLmRheSgpICsgNyAtIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdykgJSA3O1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWtkYXkgOiB0aGlzLmFkZChpbnB1dCAtIHdlZWtkYXksICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPRGF5T2ZXZWVrIChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgIC8vIGFzIGEgZ2V0dGVyLCByZXR1cm5zIDcgaW5zdGVhZCBvZiAwICgxLTcgcmFuZ2UgaW5zdGVhZCBvZiAwLTYpXG4gICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cblxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWtkYXkgOiB3ZWVrZGF5IC0gNyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKSB8fCA3O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c1JlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1Nob3J0UmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzTWluUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c01pblJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVXZWVrZGF5c1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1pblBpZWNlcyA9IFtdLCBzaG9ydFBpZWNlcyA9IFtdLCBsb25nUGllY2VzID0gW10sIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLCBtb20sIG1pbnAsIHNob3J0cCwgbG9uZ3A7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgbWlucCA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJyk7XG4gICAgICAgICAgICBzaG9ydHAgPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICBsb25ncCA9IHRoaXMud2Vla2RheXMobW9tLCAnJyk7XG4gICAgICAgICAgICBtaW5QaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSB3ZWVrZGF5IChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgbWluUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBzaG9ydFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKHNob3J0UGllY2VzW2ldKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaW5QaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIGhGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgJSAxMiB8fCAxMjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpIHx8IDI0O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdIJywgWydISCcsIDJdLCAwLCAnaG91cicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdoJywgWydoaCcsIDJdLCAwLCBoRm9ybWF0KTtcbiAgICBhZGRGb3JtYXRUb2tlbignaycsIFsna2snLCAyXSwgMCwga0Zvcm1hdCk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtICh0b2tlbiwgbG93ZXJjYXNlKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0odGhpcy5ob3VycygpLCB0aGlzLm1pbnV0ZXMoKSwgbG93ZXJjYXNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyaWRpZW0oJ2EnLCB0cnVlKTtcbiAgICBtZXJpZGllbSgnQScsIGZhbHNlKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnaG91cicsICdoJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnaG91cicsIDEzKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGZ1bmN0aW9uIG1hdGNoTWVyaWRpZW0gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fbWVyaWRpZW1QYXJzZTtcbiAgICB9XG5cbiAgICBhZGRSZWdleFRva2VuKCdhJywgIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0EnLCAgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignSCcsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2gnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdrJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignSEgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignaGgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbigna2snLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRSZWdleFRva2VuKCdobW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbXNzJywgbWF0Y2g1dG82KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbXNzJywgbWF0Y2g1dG82KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydIJywgJ0hIJ10sIEhPVVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydrJywgJ2trJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIga0lucHV0ID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBhcnJheVtIT1VSXSA9IGtJbnB1dCA9PT0gMjQgPyAwIDoga0lucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydhJywgJ0EnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgICAgICBjb25maWcuX21lcmlkaWVtID0gaW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQ7XG4gICAgICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgICAgICB2YXIgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlSXNQTSAoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IFF1aXJrcyBNb2RlICYgSUU3IFN0YW5kYXJkcyBNb2RlIGRvIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3RyaW5ncyBsaWtlIGFycmF5c1xuICAgICAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICAgICAgcmV0dXJuICgoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkgPT09ICdwJyk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2k7XG4gICAgZnVuY3Rpb24gbG9jYWxlTWVyaWRpZW0gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYW0nIDogJ0FNJztcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4gICAgLy8gc3BlY2lmaWVkIHdoaWNoIGhvdXIgdGhleSB3YW50LiBTbyB0cnlpbmcgdG8gbWFpbnRhaW4gdGhlIHNhbWUgaG91ciAoaW5cbiAgICAvLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbiAgICAvLyB0aGlzIHJ1bGUuXG4gICAgdmFyIGdldFNldEhvdXIgPSBtYWtlR2V0U2V0KCdIb3VycycsIHRydWUpO1xuXG4gICAgdmFyIGJhc2VDb25maWcgPSB7XG4gICAgICAgIGNhbGVuZGFyOiBkZWZhdWx0Q2FsZW5kYXIsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQsXG4gICAgICAgIGludmFsaWREYXRlOiBkZWZhdWx0SW52YWxpZERhdGUsXG4gICAgICAgIG9yZGluYWw6IGRlZmF1bHRPcmRpbmFsLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiBkZWZhdWx0UmVsYXRpdmVUaW1lLFxuXG4gICAgICAgIG1vbnRoczogZGVmYXVsdExvY2FsZU1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCxcblxuICAgICAgICB3ZWVrOiBkZWZhdWx0TG9jYWxlV2VlayxcblxuICAgICAgICB3ZWVrZGF5czogZGVmYXVsdExvY2FsZVdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZVxuICAgIH07XG5cbiAgICAvLyBpbnRlcm5hbCBzdG9yYWdlIGZvciBsb2NhbGUgY29uZmlnIGZpbGVzXG4gICAgdmFyIGxvY2FsZXMgPSB7fTtcbiAgICB2YXIgbG9jYWxlRmFtaWxpZXMgPSB7fTtcbiAgICB2YXIgZ2xvYmFsTG9jYWxlO1xuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4gICAgLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAvLyBzdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgICAgIHZhciBpID0gMCwgaiwgbmV4dCwgbG9jYWxlLCBzcGxpdDtcblxuICAgICAgICB3aGlsZSAoaSA8IG5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5sZW5ndGggPj0gaiAmJiBjb21wYXJlQXJyYXlzKHNwbGl0LCBuZXh0LCB0cnVlKSA+PSBqIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHRoYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkTG9jYWxlKG5hbWUpIHtcbiAgICAgICAgdmFyIG9sZExvY2FsZSA9IG51bGw7XG4gICAgICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHJlZ2lzdGVyIGFuZCBsb2FkIGFsbCB0aGUgbG9jYWxlcyBpbiBOb2RlXG4gICAgICAgIGlmICghbG9jYWxlc1tuYW1lXSAmJiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgbW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9sZExvY2FsZSA9IGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICAgICAgICAgICAgICB2YXIgYWxpYXNlZFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBmdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUgKGtleSwgdmFsdWVzKSB7XG4gICAgICAgIHZhciBkYXRhO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkZWZpbmVMb2NhbGUoa2V5LCB2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIG1vbWVudC5kdXJhdGlvbi5fbG9jYWxlID0gbW9tZW50Ll9sb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGdsb2JhbExvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICAvL3dhcm4gdXNlciBpZiBhcmd1bWVudHMgYXJlIHBhc3NlZCBidXQgdGhlIGxvY2FsZSBjb3VsZCBub3QgYmUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTG9jYWxlICcgKyBrZXkgKyAgJyBub3QgZm91bmQuIERpZCB5b3UgZm9yZ2V0IHRvIGxvYWQgaXQ/Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVMb2NhbGUgKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLCBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZSgnZGVmaW5lTG9jYWxlT3ZlcnJpZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBtb21lbnQudXBkYXRlTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgdG8gY2hhbmdlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kZWZpbmUtbG9jYWxlLyBmb3IgbW9yZSBpbmZvLicpO1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShjb25maWcucGFyZW50TG9jYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBuZXcgTG9jYWxlKG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZykpO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxlRmFtaWxpZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZUxvY2FsZSh4Lm5hbWUsIHguY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc2V0IHRoZSBsb2NhbGUgQUZURVIgYWxsIGNoaWxkIGxvY2FsZXMgaGF2ZSBiZWVuXG4gICAgICAgICAgICAvLyBjcmVhdGVkLCBzbyB3ZSB3b24ndCBlbmQgdXAgd2l0aCB0aGUgY2hpbGQgbG9jYWxlIHNldC5cbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcblxuXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZ1xuICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLCB0bXBMb2NhbGUsIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgICAgICAvLyBNRVJHRVxuICAgICAgICAgICAgdG1wTG9jYWxlID0gbG9hZExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgIGlmICh0bXBMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IHRtcExvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZS5wYXJlbnRMb2NhbGUgPSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZTtcblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGdldExvY2FsZSAoa2V5KSB7XG4gICAgICAgIHZhciBsb2NhbGU7XG5cbiAgICAgICAgaWYgKGtleSAmJiBrZXkuX2xvY2FsZSAmJiBrZXkuX2xvY2FsZS5fYWJicikge1xuICAgICAgICAgICAga2V5ID0ga2V5Ll9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICAvL3Nob3J0LWNpcmN1aXQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleSA9IFtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNob29zZUxvY2FsZShrZXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RMb2NhbGVzKCkge1xuICAgICAgICByZXR1cm4ga2V5cyhsb2NhbGVzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja092ZXJmbG93IChtKSB7XG4gICAgICAgIHZhciBvdmVyZmxvdztcbiAgICAgICAgdmFyIGEgPSBtLl9hO1xuXG4gICAgICAgIGlmIChhICYmIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9PT0gLTIpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID1cbiAgICAgICAgICAgICAgICBhW01PTlRIXSAgICAgICA8IDAgfHwgYVtNT05USF0gICAgICAgPiAxMSAgPyBNT05USCA6XG4gICAgICAgICAgICAgICAgYVtEQVRFXSAgICAgICAgPCAxIHx8IGFbREFURV0gICAgICAgID4gZGF5c0luTW9udGgoYVtZRUFSXSwgYVtNT05USF0pID8gREFURSA6XG4gICAgICAgICAgICAgICAgYVtIT1VSXSAgICAgICAgPCAwIHx8IGFbSE9VUl0gICAgICAgID4gMjQgfHwgKGFbSE9VUl0gPT09IDI0ICYmIChhW01JTlVURV0gIT09IDAgfHwgYVtTRUNPTkRdICE9PSAwIHx8IGFbTUlMTElTRUNPTkRdICE9PSAwKSkgPyBIT1VSIDpcbiAgICAgICAgICAgICAgICBhW01JTlVURV0gICAgICA8IDAgfHwgYVtNSU5VVEVdICAgICAgPiA1OSAgPyBNSU5VVEUgOlxuICAgICAgICAgICAgICAgIGFbU0VDT05EXSAgICAgIDwgMCB8fCBhW1NFQ09ORF0gICAgICA+IDU5ICA/IFNFQ09ORCA6XG4gICAgICAgICAgICAgICAgYVtNSUxMSVNFQ09ORF0gPCAwIHx8IGFbTUlMTElTRUNPTkRdID4gOTk5ID8gTUlMTElTRUNPTkQgOlxuICAgICAgICAgICAgICAgIC0xO1xuXG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd0RheU9mWWVhciAmJiAob3ZlcmZsb3cgPCBZRUFSIHx8IG92ZXJmbG93ID4gREFURSkpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IERBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtzICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla2RheSAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUtEQVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gUGljayB0aGUgZmlyc3QgZGVmaW5lZCBvZiB0d28gb3IgdGhyZWUgYXJndW1lbnRzLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRzKGEsIGIsIGMpIHtcbiAgICAgICAgaWYgKGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VycmVudERhdGVBcnJheShjb25maWcpIHtcbiAgICAgICAgLy8gaG9va3MgaXMgYWN0dWFsbHkgdGhlIGV4cG9ydGVkIG1vbWVudCBvYmplY3RcbiAgICAgICAgdmFyIG5vd1ZhbHVlID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0VVRDRnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0VVRDTW9udGgoKSwgbm93VmFsdWUuZ2V0VVRDRGF0ZSgpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25vd1ZhbHVlLmdldEZ1bGxZZWFyKCksIG5vd1ZhbHVlLmdldE1vbnRoKCksIG5vd1ZhbHVlLmdldERhdGUoKV07XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXG4gICAgLy8gdGhlIGFycmF5IHNob3VsZCBtaXJyb3IgdGhlIHBhcmFtZXRlcnMgYmVsb3dcbiAgICAvLyBub3RlOiBhbGwgdmFsdWVzIHBhc3QgdGhlIHllYXIgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cbiAgICAvLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tQXJyYXkgKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgZGF0ZSwgaW5wdXQgPSBbXSwgY3VycmVudERhdGUsIGV4cGVjdGVkV2Vla2RheSwgeWVhclRvVXNlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgZGF5IG9mIHRoZSB5ZWFyIGlzIHNldCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyVG9Vc2UpIHx8IGNvbmZpZy5fZGF5T2ZZZWFyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93RGF5T2ZZZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoeWVhclRvVXNlLCAwLCBjb25maWcuX2RheU9mWWVhcik7XG4gICAgICAgICAgICBjb25maWcuX2FbTU9OVEhdID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgICAgICAgICAgY29uZmlnLl9hW0RBVEVdID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgZGF0ZS5cbiAgICAgICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxuICAgICAgICAvLyAqIGlmIGRheSBvZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBtb250aCBhbmQgeWVhclxuICAgICAgICAvLyAqIGlmIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG9ubHkgeWVhclxuICAgICAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgJiYgY29uZmlnLl9hW2ldID09IG51bGw7ICsraSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSBjdXJyZW50RGF0ZVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFplcm8gb3V0IHdoYXRldmVyIHdhcyBub3QgZGVmYXVsdGVkLCBpbmNsdWRpbmcgdGltZVxuICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSAoY29uZmlnLl9hW2ldID09IG51bGwpID8gKGkgPT09IDIgPyAxIDogMCkgOiBjb25maWcuX2FbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgMjQ6MDA6MDAuMDAwXG4gICAgICAgIGlmIChjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW01JTlVURV0gPT09IDAgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbU0VDT05EXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5fbmV4dERheSA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLl9kID0gKGNvbmZpZy5fdXNlVVRDID8gY3JlYXRlVVRDRGF0ZSA6IGNyZWF0ZURhdGUpLmFwcGx5KG51bGwsIGlucHV0KTtcbiAgICAgICAgZXhwZWN0ZWRXZWVrZGF5ID0gY29uZmlnLl91c2VVVEMgPyBjb25maWcuX2QuZ2V0VVRDRGF5KCkgOiBjb25maWcuX2QuZ2V0RGF5KCk7XG5cbiAgICAgICAgLy8gQXBwbHkgdGltZXpvbmUgb2Zmc2V0IGZyb20gaW5wdXQuIFRoZSBhY3R1YWwgdXRjT2Zmc2V0IGNhbiBiZSBjaGFuZ2VkXG4gICAgICAgIC8vIHdpdGggcGFyc2Vab25lLlxuICAgICAgICBpZiAoY29uZmlnLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX25leHREYXkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDI0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZm9yIG1pc21hdGNoaW5nIGRheSBvZiB3ZWVrXG4gICAgICAgIGlmIChjb25maWcuX3cgJiYgdHlwZW9mIGNvbmZpZy5fdy5kICE9PSAndW5kZWZpbmVkJyAmJiBjb25maWcuX3cuZCAhPT0gZXhwZWN0ZWRXZWVrZGF5KSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZykge1xuICAgICAgICB2YXIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3c7XG5cbiAgICAgICAgdyA9IGNvbmZpZy5fdztcbiAgICAgICAgaWYgKHcuR0cgIT0gbnVsbCB8fCB3LlcgIT0gbnVsbCB8fCB3LkUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZG93ID0gMTtcbiAgICAgICAgICAgIGRveSA9IDQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gdGFrZSB0aGUgY3VycmVudCBpc29XZWVrWWVhciwgYnV0IHRoYXQgZGVwZW5kcyBvblxuICAgICAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYSBub3cgdmVyc2lvbiBvZiBjdXJyZW50IGNvbmZpZyAodGFrZSBsb2NhbC91dGMvb2Zmc2V0IGZsYWdzLCBhbmRcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBub3cpLlxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LkdHLCBjb25maWcuX2FbWUVBUl0sIHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgMSwgNCkueWVhcik7XG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody5XLCAxKTtcbiAgICAgICAgICAgIHdlZWtkYXkgPSBkZWZhdWx0cyh3LkUsIDEpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvdyA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRvdztcbiAgICAgICAgICAgIGRveSA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRveTtcblxuICAgICAgICAgICAgdmFyIGN1cldlZWsgPSB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIGRvdywgZG95KTtcblxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LmdnLCBjb25maWcuX2FbWUVBUl0sIGN1cldlZWsueWVhcik7XG5cbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCB3ZWVrLlxuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgY3VyV2Vlay53ZWVrKTtcblxuICAgICAgICAgICAgaWYgKHcuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gd2Vla2RheSAtLSBsb3cgZGF5IG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgbmV4dCB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgICAgICBpZiAod2Vla2RheSA8IDAgfHwgd2Vla2RheSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHcuZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9jYWwgd2Vla2RheSAtLSBjb3VudGluZyBzdGFydHMgZnJvbSBiZWdpbmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZSArIGRvdztcbiAgICAgICAgICAgICAgICBpZiAody5lIDwgMCB8fCB3LmUgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGJlZ2luaW5nIG9mIHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gZG93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh3ZWVrIDwgMSB8fCB3ZWVrID4gd2Vla3NJblllYXIod2Vla1llYXIsIGRvdywgZG95KSkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93V2Vla3MgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWtkYXlPdmVyZmxvdyAhPSBudWxsKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrZGF5ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRlbXAgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IHRlbXAueWVhcjtcbiAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdGVtcC5kYXlPZlllYXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpc28gODYwMSByZWdleFxuICAgIC8vIDAwMDAtMDAtMDAgMDAwMC1XMDAgb3IgMDAwMC1XMDAtMCArIFQgKyAwMCBvciAwMDowMCBvciAwMDowMDowMCBvciAwMDowMDowMC4wMDAgKyArMDA6MDAgb3IgKzAwMDAgb3IgKzAwKVxuICAgIHZhciBleHRlbmRlZElzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvO1xuICAgIHZhciBiYXNpY0lzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KSg/OlxcZFxcZFxcZFxcZHxXXFxkXFxkXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86XFxkXFxkKD86XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFtcXCtcXC1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLztcblxuICAgIHZhciB0elJlZ2V4ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vO1xuXG4gICAgdmFyIGlzb0RhdGVzID0gW1xuICAgICAgICBbJ1lZWVlZWS1NTS1ERCcsIC9bKy1dXFxkezZ9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgWydZWVlZLU1NLUREJywgL1xcZHs0fS1cXGRcXGQtXFxkXFxkL10sXG4gICAgICAgIFsnR0dHRy1bV11XVy1FJywgL1xcZHs0fS1XXFxkXFxkLVxcZC9dLFxuICAgICAgICBbJ0dHR0ctW1ddV1cnLCAvXFxkezR9LVdcXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgIFsnWVlZWS1EREQnLCAvXFxkezR9LVxcZHszfS9dLFxuICAgICAgICBbJ1lZWVktTU0nLCAvXFxkezR9LVxcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgWydZWVlZWVlNTUREJywgL1srLV1cXGR7MTB9L10sXG4gICAgICAgIFsnWVlZWU1NREQnLCAvXFxkezh9L10sXG4gICAgICAgIC8vIFlZWVlNTSBpcyBOT1QgYWxsb3dlZCBieSB0aGUgc3RhbmRhcmRcbiAgICAgICAgWydHR0dHW1ddV1dFJywgL1xcZHs0fVdcXGR7M30vXSxcbiAgICAgICAgWydHR0dHW1ddV1cnLCAvXFxkezR9V1xcZHsyfS8sIGZhbHNlXSxcbiAgICAgICAgWydZWVlZREREJywgL1xcZHs3fS9dXG4gICAgXTtcblxuICAgIC8vIGlzbyB0aW1lIGZvcm1hdHMgYW5kIHJlZ2V4ZXNcbiAgICB2YXIgaXNvVGltZXMgPSBbXG4gICAgICAgIFsnSEg6bW06c3MuU1NTUycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgWydISDptbTpzcyxTU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkLFxcZCsvXSxcbiAgICAgICAgWydISDptbTpzcycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICBbJ0hIOm1tJywgL1xcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgWydISG1tc3MuU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgIFsnSEhtbXNzLFNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkLFxcZCsvXSxcbiAgICAgICAgWydISG1tc3MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkL10sXG4gICAgICAgIFsnSEhtbScsIC9cXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgWydISCcsIC9cXGRcXGQvXVxuICAgIF07XG5cbiAgICB2YXIgYXNwTmV0SnNvblJlZ2V4ID0gL15cXC8/RGF0ZVxcKChcXC0/XFxkKykvaTtcblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlTTyhjb25maWcpIHtcbiAgICAgICAgdmFyIGksIGwsXG4gICAgICAgICAgICBzdHJpbmcgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBtYXRjaCA9IGV4dGVuZGVkSXNvUmVnZXguZXhlYyhzdHJpbmcpIHx8IGJhc2ljSXNvUmVnZXguZXhlYyhzdHJpbmcpLFxuICAgICAgICAgICAgYWxsb3dUaW1lLCBkYXRlRm9ybWF0LCB0aW1lRm9ybWF0LCB0ekZvcm1hdDtcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmlzbyA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29EYXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNvRGF0ZXNbaV1bMV0uZXhlYyhtYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdCA9IGlzb0RhdGVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBhbGxvd1RpbWUgPSBpc29EYXRlc1tpXVsyXSAhPT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRlRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvVGltZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc29UaW1lc1tpXVsxXS5leGVjKG1hdGNoWzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hbMl0gc2hvdWxkIGJlICdUJyBvciBzcGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZUZvcm1hdCA9IChtYXRjaFsyXSB8fCAnICcpICsgaXNvVGltZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGltZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhbGxvd1RpbWUgJiYgdGltZUZvcm1hdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR6UmVnZXguZXhlYyhtYXRjaFs0XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHpGb3JtYXQgPSAnWic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maWcuX2YgPSBkYXRlRm9ybWF0ICsgKHRpbWVGb3JtYXQgfHwgJycpICsgKHR6Rm9ybWF0IHx8ICcnKTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUkZDIDI4MjIgcmVnZXg6IEZvciBkZXRhaWxzIHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjgyMiNzZWN0aW9uLTMuM1xuICAgIHZhciByZmMyODIyID0gL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSw/XFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfChbKy1dXFxkezR9KSkkLztcblxuICAgIGZ1bmN0aW9uIGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MoeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtcbiAgICAgICAgICAgIHVudHJ1bmNhdGVZZWFyKHllYXJTdHIpLFxuICAgICAgICAgICAgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LmluZGV4T2YobW9udGhTdHIpLFxuICAgICAgICAgICAgcGFyc2VJbnQoZGF5U3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChob3VyU3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChtaW51dGVTdHIsIDEwKVxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChzZWNvbmRTdHIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlSW50KHNlY29uZFN0ciwgMTApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhclN0cikge1xuICAgICAgICB2YXIgeWVhciA9IHBhcnNlSW50KHllYXJTdHIsIDEwKTtcbiAgICAgICAgaWYgKHllYXIgPD0gNDkpIHtcbiAgICAgICAgICAgIHJldHVybiAyMDAwICsgeWVhcjtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyIDw9IDk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIDE5MDAgKyB5ZWFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5ZWFyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgJyAnKS5yZXBsYWNlKC8oXFxzXFxzKykvZywgJyAnKS5yZXBsYWNlKC9eXFxzXFxzKi8sICcnKS5yZXBsYWNlKC9cXHNcXHMqJC8sICcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja1dlZWtkYXkod2Vla2RheVN0ciwgcGFyc2VkSW5wdXQsIGNvbmZpZykge1xuICAgICAgICBpZiAod2Vla2RheVN0cikge1xuICAgICAgICAgICAgLy8gVE9ETzogUmVwbGFjZSB0aGUgdmFuaWxsYSBKUyBEYXRlIG9iamVjdCB3aXRoIGFuIGluZGVwZW50ZW50IGRheS1vZi13ZWVrIGNoZWNrLlxuICAgICAgICAgICAgdmFyIHdlZWtkYXlQcm92aWRlZCA9IGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0LmluZGV4T2Yod2Vla2RheVN0ciksXG4gICAgICAgICAgICAgICAgd2Vla2RheUFjdHVhbCA9IG5ldyBEYXRlKHBhcnNlZElucHV0WzBdLCBwYXJzZWRJbnB1dFsxXSwgcGFyc2VkSW5wdXRbMl0pLmdldERheSgpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXlQcm92aWRlZCAhPT0gd2Vla2RheUFjdHVhbCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLndlZWtkYXlNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBvYnNPZmZzZXRzID0ge1xuICAgICAgICBVVDogMCxcbiAgICAgICAgR01UOiAwLFxuICAgICAgICBFRFQ6IC00ICogNjAsXG4gICAgICAgIEVTVDogLTUgKiA2MCxcbiAgICAgICAgQ0RUOiAtNSAqIDYwLFxuICAgICAgICBDU1Q6IC02ICogNjAsXG4gICAgICAgIE1EVDogLTYgKiA2MCxcbiAgICAgICAgTVNUOiAtNyAqIDYwLFxuICAgICAgICBQRFQ6IC03ICogNjAsXG4gICAgICAgIFBTVDogLTggKiA2MFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVPZmZzZXQob2JzT2Zmc2V0LCBtaWxpdGFyeU9mZnNldCwgbnVtT2Zmc2V0KSB7XG4gICAgICAgIGlmIChvYnNPZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNPZmZzZXRzW29ic09mZnNldF07XG4gICAgICAgIH0gZWxzZSBpZiAobWlsaXRhcnlPZmZzZXQpIHtcbiAgICAgICAgICAgIC8vIHRoZSBvbmx5IGFsbG93ZWQgbWlsaXRhcnkgdHogaXMgWlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBwYXJzZUludChudW1PZmZzZXQsIDEwKTtcbiAgICAgICAgICAgIHZhciBtID0gaG0gJSAxMDAsIGggPSAoaG0gLSBtKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBoICogNjAgKyBtO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBhbmQgdGltZSBmcm9tIHJlZiAyODIyIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2ggPSByZmMyODIyLmV4ZWMocHJlcHJvY2Vzc1JGQzI4MjIoY29uZmlnLl9pKSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgdmFyIHBhcnNlZEFycmF5ID0gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyhtYXRjaFs0XSwgbWF0Y2hbM10sIG1hdGNoWzJdLCBtYXRjaFs1XSwgbWF0Y2hbNl0sIG1hdGNoWzddKTtcbiAgICAgICAgICAgIGlmICghY2hlY2tXZWVrZGF5KG1hdGNoWzFdLCBwYXJzZWRBcnJheSwgY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uZmlnLl9hID0gcGFyc2VkQXJyYXk7XG4gICAgICAgICAgICBjb25maWcuX3R6bSA9IGNhbGN1bGF0ZU9mZnNldChtYXRjaFs4XSwgbWF0Y2hbOV0sIG1hdGNoWzEwXSk7XG5cbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGNyZWF0ZVVUQ0RhdGUuYXBwbHkobnVsbCwgY29uZmlnLl9hKTtcbiAgICAgICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnJmYzI4MjIgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gaXNvIGZvcm1hdCBvciBmYWxsYmFja1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKSB7XG4gICAgICAgIHZhciBtYXRjaGVkID0gYXNwTmV0SnNvblJlZ2V4LmV4ZWMoY29uZmlnLl9pKTtcblxuICAgICAgICBpZiAobWF0Y2hlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoK21hdGNoZWRbMV0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluYWwgYXR0ZW1wdCwgdXNlIElucHV0IEZhbGxiYWNrXG4gICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgfVxuXG4gICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sgPSBkZXByZWNhdGUoXG4gICAgICAgICd2YWx1ZSBwcm92aWRlZCBpcyBub3QgaW4gYSByZWNvZ25pemVkIFJGQzI4MjIgb3IgSVNPIGZvcm1hdC4gbW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUoKSwgJyArXG4gICAgICAgICd3aGljaCBpcyBub3QgcmVsaWFibGUgYWNyb3NzIGFsbCBicm93c2VycyBhbmQgdmVyc2lvbnMuIE5vbiBSRkMyODIyL0lTTyBkYXRlIGZvcm1hdHMgYXJlICcgK1xuICAgICAgICAnZGlzY291cmFnZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhbiB1cGNvbWluZyBtYWpvciByZWxlYXNlLiBQbGVhc2UgcmVmZXIgdG8gJyArXG4gICAgICAgICdodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2pzLWRhdGUvIGZvciBtb3JlIGluZm8uJyxcbiAgICAgICAgZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoY29uZmlnLl9pICsgKGNvbmZpZy5fdXNlVVRDID8gJyBVVEMnIDogJycpKTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgSVNPIHN0YW5kYXJkXG4gICAgaG9va3MuSVNPXzg2MDEgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBSRkMgMjgyMiBmb3JtXG4gICAgaG9va3MuUkZDXzI4MjIgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGZvcm1hdCBzdHJpbmdcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZykge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSBjcmVhdGlvbiBmbG93IHRvIHByZXZlbnQgY2lyY3VsYXIgZGVwc1xuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5JU09fODYwMSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLlJGQ18yODIyKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tUkZDMjgyMihjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpZy5fYSA9IFtdO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IHRydWU7XG5cbiAgICAgICAgLy8gVGhpcyBhcnJheSBpcyB1c2VkIHRvIG1ha2UgYSBEYXRlLCBlaXRoZXIgd2l0aCBgbmV3IERhdGVgIG9yIGBEYXRlLlVUQ2BcbiAgICAgICAgdmFyIHN0cmluZyA9ICcnICsgY29uZmlnLl9pLFxuICAgICAgICAgICAgaSwgcGFyc2VkSW5wdXQsIHRva2VucywgdG9rZW4sIHNraXBwZWQsXG4gICAgICAgICAgICBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCA9IDA7XG5cbiAgICAgICAgdG9rZW5zID0gZXhwYW5kRm9ybWF0KGNvbmZpZy5fZiwgY29uZmlnLl9sb2NhbGUpLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpIHx8IFtdO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICAgICAgcGFyc2VkSW5wdXQgPSAoc3RyaW5nLm1hdGNoKGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSkgfHwgW10pWzBdO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3Rva2VuJywgdG9rZW4sICdwYXJzZWRJbnB1dCcsIHBhcnNlZElucHV0LFxuICAgICAgICAgICAgLy8gICAgICAgICAncmVnZXgnLCBnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc2tpcHBlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5zbGljZShzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkgKyBwYXJzZWRJbnB1dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggKz0gcGFyc2VkSW5wdXQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZG9uJ3QgcGFyc2UgaWYgaXQncyBub3QgYSBrbm93biB0b2tlblxuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgcGFyc2VkSW5wdXQsIGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb25maWcuX3N0cmljdCAmJiAhcGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgcmVtYWluaW5nIHVucGFyc2VkIGlucHV0IGxlbmd0aCB0byB0aGUgc3RyaW5nXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmNoYXJzTGVmdE92ZXIgPSBzdHJpbmdMZW5ndGggLSB0b3RhbFBhcnNlZElucHV0TGVuZ3RoO1xuICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIF8xMmggZmxhZyBpZiBob3VyIGlzIDw9IDEyXG4gICAgICAgIGlmIChjb25maWcuX2FbSE9VUl0gPD0gMTIgJiZcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPT09IHRydWUgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA+IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5wYXJzZWREYXRlUGFydHMgPSBjb25maWcuX2Euc2xpY2UoMCk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLm1lcmlkaWVtID0gY29uZmlnLl9tZXJpZGllbTtcbiAgICAgICAgLy8gaGFuZGxlIG1lcmlkaWVtXG4gICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IG1lcmlkaWVtRml4V3JhcChjb25maWcuX2xvY2FsZSwgY29uZmlnLl9hW0hPVVJdLCBjb25maWcuX21lcmlkaWVtKTtcblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgY2hlY2tPdmVyZmxvdyhjb25maWcpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW1GaXhXcmFwIChsb2NhbGUsIGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgIHZhciBpc1BtO1xuXG4gICAgICAgIGlmIChtZXJpZGllbSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxlLm1lcmlkaWVtSG91ciAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLm1lcmlkaWVtSG91cihob3VyLCBtZXJpZGllbSk7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWxlLmlzUE0gIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2tcbiAgICAgICAgICAgIGlzUG0gPSBsb2NhbGUuaXNQTShtZXJpZGllbSk7XG4gICAgICAgICAgICBpZiAoaXNQbSAmJiBob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyICs9IDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1BtICYmIGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlblxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBhcnJheSBvZiBmb3JtYXQgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpIHtcbiAgICAgICAgdmFyIHRlbXBDb25maWcsXG4gICAgICAgICAgICBiZXN0TW9tZW50LFxuXG4gICAgICAgICAgICBzY29yZVRvQmVhdCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fZi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRGb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWcuX2YubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSA9IDA7XG4gICAgICAgICAgICB0ZW1wQ29uZmlnID0gY29weUNvbmZpZyh7fSwgY29uZmlnKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuX3VzZVVUQyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVtcENvbmZpZy5fdXNlVVRDID0gY29uZmlnLl91c2VVVEM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZW1wQ29uZmlnLl9mID0gY29uZmlnLl9mW2ldO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcblxuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKHRlbXBDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFueSBpbnB1dCB0aGF0IHdhcyBub3QgcGFyc2VkIGFkZCBhIHBlbmFsdHkgZm9yIHRoYXQgZm9ybWF0XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLmNoYXJzTGVmdE92ZXI7XG5cbiAgICAgICAgICAgIC8vb3IgdG9rZW5zXG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnVudXNlZFRva2Vucy5sZW5ndGggKiAxMDtcblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnNjb3JlID0gY3VycmVudFNjb3JlO1xuXG4gICAgICAgICAgICBpZiAoc2NvcmVUb0JlYXQgPT0gbnVsbCB8fCBjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCkge1xuICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID0gY3VycmVudFNjb3JlO1xuICAgICAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXh0ZW5kKGNvbmZpZywgYmVzdE1vbWVudCB8fCB0ZW1wQ29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tT2JqZWN0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGNvbmZpZy5faSk7XG4gICAgICAgIGNvbmZpZy5fYSA9IG1hcChbaS55ZWFyLCBpLm1vbnRoLCBpLmRheSB8fCBpLmRhdGUsIGkuaG91ciwgaS5taW51dGUsIGkuc2Vjb25kLCBpLm1pbGxpc2Vjb25kXSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRnJvbUNvbmZpZyAoY29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3cocHJlcGFyZUNvbmZpZyhjb25maWcpKSk7XG4gICAgICAgIGlmIChyZXMuX25leHREYXkpIHtcbiAgICAgICAgICAgIC8vIEFkZGluZyBpcyBzbWFydCBlbm91Z2ggYXJvdW5kIERTVFxuICAgICAgICAgICAgcmVzLmFkZCgxLCAnZCcpO1xuICAgICAgICAgICAgcmVzLl9uZXh0RGF5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVwYXJlQ29uZmlnIChjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pLFxuICAgICAgICAgICAgZm9ybWF0ID0gY29uZmlnLl9mO1xuXG4gICAgICAgIGNvbmZpZy5fbG9jYWxlID0gY29uZmlnLl9sb2NhbGUgfHwgZ2V0TG9jYWxlKGNvbmZpZy5fbCk7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSBudWxsIHx8IChmb3JtYXQgPT09IHVuZGVmaW5lZCAmJiBpbnB1dCA9PT0gJycpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCh7bnVsbElucHV0OiB0cnVlfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnLl9pID0gaW5wdXQgPSBjb25maWcuX2xvY2FsZS5wcmVwYXJzZShpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNNb21lbnQoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vbWVudChjaGVja092ZXJmbG93KGlucHV0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gaW5wdXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShmb3JtYXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSAgZWxzZSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSW5wdXQoY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZChjb25maWcpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSW5wdXQoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0LnZhbHVlT2YoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZyhjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2EgPSBtYXAoaW5wdXQuc2xpY2UoMCksIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbU9iamVjdChjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgICAgICAgICAgLy8gZnJvbSBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbE9yVVRDIChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgaXNVVEMpIHtcbiAgICAgICAgdmFyIGMgPSB7fTtcblxuICAgICAgICBpZiAobG9jYWxlID09PSB0cnVlIHx8IGxvY2FsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGxvY2FsZTtcbiAgICAgICAgICAgIGxvY2FsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoaXNPYmplY3QoaW5wdXQpICYmIGlzT2JqZWN0RW1wdHkoaW5wdXQpKSB8fFxuICAgICAgICAgICAgICAgIChpc0FycmF5KGlucHV0KSAmJiBpbnB1dC5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgY29uc3RydWN0aW9uIG11c3QgYmUgZG9uZSB0aGlzIHdheS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE0MjNcbiAgICAgICAgYy5faXNBTW9tZW50T2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgYy5fdXNlVVRDID0gYy5faXNVVEMgPSBpc1VUQztcbiAgICAgICAgYy5fbCA9IGxvY2FsZTtcbiAgICAgICAgYy5faSA9IGlucHV0O1xuICAgICAgICBjLl9mID0gZm9ybWF0O1xuICAgICAgICBjLl9zdHJpY3QgPSBzdHJpY3Q7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21Db25maWcoYyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTG9jYWwgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvdHlwZU1pbiA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPCB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIHZhciBwcm90b3R5cGVNYXggPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5tYXggaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5taW4gaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LycsXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyID4gdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBQaWNrIGEgbW9tZW50IG0gZnJvbSBtb21lbnRzIHNvIHRoYXQgbVtmbl0ob3RoZXIpIGlzIHRydWUgZm9yIGFsbFxuICAgIC8vIG90aGVyLiBUaGlzIHJlbGllcyBvbiB0aGUgZnVuY3Rpb24gZm4gdG8gYmUgdHJhbnNpdGl2ZS5cbiAgICAvL1xuICAgIC8vIG1vbWVudHMgc2hvdWxkIGVpdGhlciBiZSBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cyBvciBhbiBhcnJheSwgd2hvc2VcbiAgICAvLyBmaXJzdCBlbGVtZW50IGlzIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzLlxuICAgIGZ1bmN0aW9uIHBpY2tCeShmbiwgbW9tZW50cykge1xuICAgICAgICB2YXIgcmVzLCBpO1xuICAgICAgICBpZiAobW9tZW50cy5sZW5ndGggPT09IDEgJiYgaXNBcnJheShtb21lbnRzWzBdKSkge1xuICAgICAgICAgICAgbW9tZW50cyA9IG1vbWVudHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzID0gbW9tZW50c1swXTtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IG1vbWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmICghbW9tZW50c1tpXS5pc1ZhbGlkKCkgfHwgbW9tZW50c1tpXVtmbl0ocmVzKSkge1xuICAgICAgICAgICAgICAgIHJlcyA9IG1vbWVudHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBVc2UgW10uc29ydCBpbnN0ZWFkP1xuICAgIGZ1bmN0aW9uIG1pbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQmVmb3JlJywgYXJncyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF4ICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNBZnRlcicsIGFyZ3MpO1xuICAgIH1cblxuICAgIHZhciBub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdyA/IERhdGUubm93KCkgOiArKG5ldyBEYXRlKCkpO1xuICAgIH07XG5cbiAgICB2YXIgb3JkZXJpbmcgPSBbJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCAnbWlsbGlzZWNvbmQnXTtcblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb25WYWxpZChtKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBtKSB7XG4gICAgICAgICAgICBpZiAoIShpbmRleE9mLmNhbGwob3JkZXJpbmcsIGtleSkgIT09IC0xICYmIChtW2tleV0gPT0gbnVsbCB8fCAhaXNOYU4obVtrZXldKSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHVuaXRIYXNEZWNpbWFsID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JkZXJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChtW29yZGVyaW5nW2ldXSkge1xuICAgICAgICAgICAgICAgIGlmICh1bml0SGFzRGVjaW1hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG9ubHkgYWxsb3cgbm9uLWludGVnZXJzIGZvciBzbWFsbGVzdCB1bml0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KG1bb3JkZXJpbmdbaV1dKSAhPT0gdG9JbnQobVtvcmRlcmluZ1tpXV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXRIYXNEZWNpbWFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKE5hTik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRHVyYXRpb24gKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSBub3JtYWxpemVPYmplY3RVbml0cyhkdXJhdGlvbiksXG4gICAgICAgICAgICB5ZWFycyA9IG5vcm1hbGl6ZWRJbnB1dC55ZWFyIHx8IDAsXG4gICAgICAgICAgICBxdWFydGVycyA9IG5vcm1hbGl6ZWRJbnB1dC5xdWFydGVyIHx8IDAsXG4gICAgICAgICAgICBtb250aHMgPSBub3JtYWxpemVkSW5wdXQubW9udGggfHwgMCxcbiAgICAgICAgICAgIHdlZWtzID0gbm9ybWFsaXplZElucHV0LndlZWsgfHwgMCxcbiAgICAgICAgICAgIGRheXMgPSBub3JtYWxpemVkSW5wdXQuZGF5IHx8IDAsXG4gICAgICAgICAgICBob3VycyA9IG5vcm1hbGl6ZWRJbnB1dC5ob3VyIHx8IDAsXG4gICAgICAgICAgICBtaW51dGVzID0gbm9ybWFsaXplZElucHV0Lm1pbnV0ZSB8fCAwLFxuICAgICAgICAgICAgc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5zZWNvbmQgfHwgMCxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5taWxsaXNlY29uZCB8fCAwO1xuXG4gICAgICAgIHRoaXMuX2lzVmFsaWQgPSBpc0R1cmF0aW9uVmFsaWQobm9ybWFsaXplZElucHV0KTtcblxuICAgICAgICAvLyByZXByZXNlbnRhdGlvbiBmb3IgZGF0ZUFkZFJlbW92ZVxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPSArbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHNlY29uZHMgKiAxZTMgKyAvLyAxMDAwXG4gICAgICAgICAgICBtaW51dGVzICogNmU0ICsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBob3VycyAqIDEwMDAgKiA2MCAqIDYwOyAvL3VzaW5nIDEwMDAgKiA2MCAqIDYwIGluc3RlYWQgb2YgMzZlNSB0byBhdm9pZCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnMgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzI5NzhcbiAgICAgICAgLy8gQmVjYXVzZSBvZiBkYXRlQWRkUmVtb3ZlIHRyZWF0cyAyNCBob3VycyBhcyBkaWZmZXJlbnQgZnJvbSBhXG4gICAgICAgIC8vIGRheSB3aGVuIHdvcmtpbmcgYXJvdW5kIERTVCwgd2UgbmVlZCB0byBzdG9yZSB0aGVtIHNlcGFyYXRlbHlcbiAgICAgICAgdGhpcy5fZGF5cyA9ICtkYXlzICtcbiAgICAgICAgICAgIHdlZWtzICogNztcbiAgICAgICAgLy8gSXQgaXMgaW1wb3NzaWJsZSB0byB0cmFuc2xhdGUgbW9udGhzIGludG8gZGF5cyB3aXRob3V0IGtub3dpbmdcbiAgICAgICAgLy8gd2hpY2ggbW9udGhzIHlvdSBhcmUgYXJlIHRhbGtpbmcgYWJvdXQsIHNvIHdlIGhhdmUgdG8gc3RvcmVcbiAgICAgICAgLy8gaXQgc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fbW9udGhzID0gK21vbnRocyArXG4gICAgICAgICAgICBxdWFydGVycyAqIDMgK1xuICAgICAgICAgICAgeWVhcnMgKiAxMjtcblxuICAgICAgICB0aGlzLl9kYXRhID0ge307XG5cbiAgICAgICAgdGhpcy5fbG9jYWxlID0gZ2V0TG9jYWxlKCk7XG5cbiAgICAgICAgdGhpcy5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNSb3VuZCAobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgtMSAqIG51bWJlcikgKiAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBmdW5jdGlvbiBvZmZzZXQgKHRva2VuLCBzZXBhcmF0b3IpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICAgICAgdmFyIHNpZ24gPSAnKyc7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7XG4gICAgICAgICAgICAgICAgc2lnbiA9ICctJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaWduICsgemVyb0ZpbGwofn4ob2Zmc2V0IC8gNjApLCAyKSArIHNlcGFyYXRvciArIHplcm9GaWxsKH5+KG9mZnNldCkgJSA2MCwgMik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9mZnNldCgnWicsICc6Jyk7XG4gICAgb2Zmc2V0KCdaWicsICcnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1onLCAgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUmVnZXhUb2tlbignWlonLCBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnWicsICdaWiddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl91c2VVVEMgPSB0cnVlO1xuICAgICAgICBjb25maWcuX3R6bSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gdGltZXpvbmUgY2h1bmtlclxuICAgIC8vICcrMTA6MDAnID4gWycxMCcsICAnMDAnXVxuICAgIC8vICctMTUzMCcgID4gWyctMTUnLCAnMzAnXVxuICAgIHZhciBjaHVua09mZnNldCA9IC8oW1xcK1xcLV18XFxkXFxkKS9naTtcblxuICAgIGZ1bmN0aW9uIG9mZnNldEZyb21TdHJpbmcobWF0Y2hlciwgc3RyaW5nKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gKHN0cmluZyB8fCAnJykubWF0Y2gobWF0Y2hlcik7XG5cbiAgICAgICAgaWYgKG1hdGNoZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNodW5rICAgPSBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0gfHwgW107XG4gICAgICAgIHZhciBwYXJ0cyAgID0gKGNodW5rICsgJycpLm1hdGNoKGNodW5rT2Zmc2V0KSB8fCBbJy0nLCAwLCAwXTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgICAgIHJldHVybiBtaW51dGVzID09PSAwID9cbiAgICAgICAgICAwIDpcbiAgICAgICAgICBwYXJ0c1swXSA9PT0gJysnID8gbWludXRlcyA6IC1taW51dGVzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhIG1vbWVudCBmcm9tIGlucHV0LCB0aGF0IGlzIGxvY2FsL3V0Yy96b25lIGVxdWl2YWxlbnQgdG8gbW9kZWwuXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCBtb2RlbCkge1xuICAgICAgICB2YXIgcmVzLCBkaWZmO1xuICAgICAgICBpZiAobW9kZWwuX2lzVVRDKSB7XG4gICAgICAgICAgICByZXMgPSBtb2RlbC5jbG9uZSgpO1xuICAgICAgICAgICAgZGlmZiA9IChpc01vbWVudChpbnB1dCkgfHwgaXNEYXRlKGlucHV0KSA/IGlucHV0LnZhbHVlT2YoKSA6IGNyZWF0ZUxvY2FsKGlucHV0KS52YWx1ZU9mKCkpIC0gcmVzLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIC8vIFVzZSBsb3ctbGV2ZWwgYXBpLCBiZWNhdXNlIHRoaXMgZm4gaXMgbG93LWxldmVsIGFwaS5cbiAgICAgICAgICAgIHJlcy5fZC5zZXRUaW1lKHJlcy5fZC52YWx1ZU9mKCkgKyBkaWZmKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChyZXMsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQpLmxvY2FsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXRlT2Zmc2V0IChtKSB7XG4gICAgICAgIC8vIE9uIEZpcmVmb3guMjQgRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L3B1bGwvMTg3MVxuICAgICAgICByZXR1cm4gLU1hdGgucm91bmQobS5fZC5nZXRUaW1lem9uZU9mZnNldCgpIC8gMTUpICogMTU7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBtb21lbnQgaXMgbXV0YXRlZC5cbiAgICAvLyBJdCBpcyBpbnRlbmRlZCB0byBrZWVwIHRoZSBvZmZzZXQgaW4gc3luYyB3aXRoIHRoZSB0aW1lem9uZS5cbiAgICBob29rcy51cGRhdGVPZmZzZXQgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIC8vIGtlZXBMb2NhbFRpbWUgPSB0cnVlIG1lYW5zIG9ubHkgY2hhbmdlIHRoZSB0aW1lem9uZSwgd2l0aG91dFxuICAgIC8vIGFmZmVjdGluZyB0aGUgbG9jYWwgaG91ci4gU28gNTozMToyNiArMDMwMCAtLVt1dGNPZmZzZXQoMiwgdHJ1ZSldLS0+XG4gICAgLy8gNTozMToyNiArMDIwMCBJdCBpcyBwb3NzaWJsZSB0aGF0IDU6MzE6MjYgZG9lc24ndCBleGlzdCB3aXRoIG9mZnNldFxuICAgIC8vICswMjAwLCBzbyB3ZSBhZGp1c3QgdGhlIHRpbWUgYXMgbmVlZGVkLCB0byBiZSB2YWxpZC5cbiAgICAvL1xuICAgIC8vIEtlZXBpbmcgdGhlIHRpbWUgYWN0dWFsbHkgYWRkcy9zdWJ0cmFjdHMgKG9uZSBob3VyKVxuICAgIC8vIGZyb20gdGhlIGFjdHVhbCByZXByZXNlbnRlZCB0aW1lLiBUaGF0IGlzIHdoeSB3ZSBjYWxsIHVwZGF0ZU9mZnNldFxuICAgIC8vIGEgc2Vjb25kIHRpbWUuIEluIGNhc2UgaXQgd2FudHMgdXMgdG8gY2hhbmdlIHRoZSBvZmZzZXQgYWdhaW5cbiAgICAvLyBfY2hhbmdlSW5Qcm9ncmVzcyA9PSB0cnVlIGNhc2UsIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QsIGJlY2F1c2VcbiAgICAvLyB0aGVyZSBpcyBubyBzdWNoIHRpbWUgaW4gdGhlIGdpdmVuIHRpbWV6b25lLlxuICAgIGZ1bmN0aW9uIGdldFNldE9mZnNldCAoaW5wdXQsIGtlZXBMb2NhbFRpbWUsIGtlZXBNaW51dGVzKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLl9vZmZzZXQgfHwgMCxcbiAgICAgICAgICAgIGxvY2FsQWRqdXN0O1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhpbnB1dCkgPCAxNiAmJiAha2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICogNjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzVVRDICYmIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICBsb2NhbEFkanVzdCA9IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vZmZzZXQgPSBpbnB1dDtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsb2NhbEFkanVzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQobG9jYWxBZGp1c3QsICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgIGlmICgha2VlcExvY2FsVGltZSB8fCB0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGNyZWF0ZUR1cmF0aW9uKGlucHV0IC0gb2Zmc2V0LCAnbScpLCAxLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/IG9mZnNldCA6IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRab25lIChpbnB1dCwga2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IC1pbnB1dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoaW5wdXQsIGtlZXBMb2NhbFRpbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAtdGhpcy51dGNPZmZzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvVVRDIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb0xvY2FsIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1VUQykge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VidHJhY3QoZ2V0RGF0ZU9mZnNldCh0aGlzKSwgJ20nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldCAoKSB7XG4gICAgICAgIGlmICh0aGlzLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodGhpcy5fdHptLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2kgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YXIgdFpvbmUgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoT2Zmc2V0LCB0aGlzLl9pKTtcbiAgICAgICAgICAgIGlmICh0Wm9uZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodFpvbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzQWxpZ25lZEhvdXJPZmZzZXQgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dCA9IGlucHV0ID8gY3JlYXRlTG9jYWwoaW5wdXQpLnV0Y09mZnNldCgpIDogMDtcblxuICAgICAgICByZXR1cm4gKHRoaXMudXRjT2Zmc2V0KCkgLSBpbnB1dCkgJSA2MCA9PT0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZSAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpIHx8XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkICgpIHtcbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9pc0RTVFNoaWZ0ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGMgPSB7fTtcblxuICAgICAgICBjb3B5Q29uZmlnKGMsIHRoaXMpO1xuICAgICAgICBjID0gcHJlcGFyZUNvbmZpZyhjKTtcblxuICAgICAgICBpZiAoYy5fYSkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gYy5faXNVVEMgPyBjcmVhdGVVVEMoYy5fYSkgOiBjcmVhdGVMb2NhbChjLl9hKTtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9IHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAgICAgY29tcGFyZUFycmF5cyhjLl9hLCBvdGhlci50b0FycmF5KCkpID4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xvY2FsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gIXRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGNPZmZzZXQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXRjICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgJiYgdGhpcy5fb2Zmc2V0ID09PSAwIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQVNQLk5FVCBqc29uIGRhdGUgZm9ybWF0IHJlZ2V4XG4gICAgdmFyIGFzcE5ldFJlZ2V4ID0gL14oXFwtfFxcKyk/KD86KFxcZCopWy4gXSk/KFxcZCspXFw6KFxcZCspKD86XFw6KFxcZCspKFxcLlxcZCopPyk/JC87XG5cbiAgICAvLyBmcm9tIGh0dHA6Ly9kb2NzLmNsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9naXQvY2xvc3VyZV9nb29nX2RhdGVfZGF0ZS5qcy5zb3VyY2UuaHRtbFxuICAgIC8vIHNvbWV3aGF0IG1vcmUgaW4gbGluZSB3aXRoIDQuNC4zLjIgMjAwNCBzcGVjLCBidXQgYWxsb3dzIGRlY2ltYWwgYW55d2hlcmVcbiAgICAvLyBhbmQgZnVydGhlciBtb2RpZmllZCB0byBhbGxvdyBmb3Igc3RyaW5ncyBjb250YWluaW5nIGJvdGggd2VlayBhbmQgZGF5XG4gICAgdmFyIGlzb1JlZ2V4ID0gL14oLXxcXCspP1AoPzooWy0rXT9bMC05LC5dKilZKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilXKT8oPzooWy0rXT9bMC05LC5dKilEKT8oPzpUKD86KFstK10/WzAtOSwuXSopSCk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopUyk/KT8kLztcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUR1cmF0aW9uIChpbnB1dCwga2V5KSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IGlucHV0LFxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgYWdhaW5zdCByZWdleHAgaXMgZXhwZW5zaXZlLCBkbyBpdCBvbiBkZW1hbmRcbiAgICAgICAgICAgIG1hdGNoID0gbnVsbCxcbiAgICAgICAgICAgIHNpZ24sXG4gICAgICAgICAgICByZXQsXG4gICAgICAgICAgICBkaWZmUmVzO1xuXG4gICAgICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbXMgOiBpbnB1dC5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgICAgIGQgIDogaW5wdXQuX2RheXMsXG4gICAgICAgICAgICAgICAgTSAgOiBpbnB1dC5fbW9udGhzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gaW5wdXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uLm1pbGxpc2Vjb25kcyA9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEhKG1hdGNoID0gYXNwTmV0UmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gKG1hdGNoWzFdID09PSAnLScpID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeSAgOiAwLFxuICAgICAgICAgICAgICAgIGQgIDogdG9JbnQobWF0Y2hbREFURV0pICAgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBoICA6IHRvSW50KG1hdGNoW0hPVVJdKSAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbSAgOiB0b0ludChtYXRjaFtNSU5VVEVdKSAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIHMgIDogdG9JbnQobWF0Y2hbU0VDT05EXSkgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBtcyA6IHRvSW50KGFic1JvdW5kKG1hdGNoW01JTExJU0VDT05EXSAqIDEwMDApKSAqIHNpZ24gLy8gdGhlIG1pbGxpc2Vjb25kIGRlY2ltYWwgcG9pbnQgaXMgaW5jbHVkZWQgaW4gdGhlIG1hdGNoXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKCEhKG1hdGNoID0gaXNvUmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gKG1hdGNoWzFdID09PSAnLScpID8gLTEgOiAobWF0Y2hbMV0gPT09ICcrJykgPyAxIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHkgOiBwYXJzZUlzbyhtYXRjaFsyXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgTSA6IHBhcnNlSXNvKG1hdGNoWzNdLCBzaWduKSxcbiAgICAgICAgICAgICAgICB3IDogcGFyc2VJc28obWF0Y2hbNF0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGQgOiBwYXJzZUlzbyhtYXRjaFs1XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgaCA6IHBhcnNlSXNvKG1hdGNoWzZdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBtIDogcGFyc2VJc28obWF0Y2hbN10sIHNpZ24pLFxuICAgICAgICAgICAgICAgIHMgOiBwYXJzZUlzbyhtYXRjaFs4XSwgc2lnbilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoZHVyYXRpb24gPT0gbnVsbCkgey8vIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGR1cmF0aW9uID09PSAnb2JqZWN0JyAmJiAoJ2Zyb20nIGluIGR1cmF0aW9uIHx8ICd0bycgaW4gZHVyYXRpb24pKSB7XG4gICAgICAgICAgICBkaWZmUmVzID0gbW9tZW50c0RpZmZlcmVuY2UoY3JlYXRlTG9jYWwoZHVyYXRpb24uZnJvbSksIGNyZWF0ZUxvY2FsKGR1cmF0aW9uLnRvKSk7XG5cbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBkdXJhdGlvbi5tcyA9IGRpZmZSZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgZHVyYXRpb24uTSA9IGRpZmZSZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkgJiYgaGFzT3duUHJvcChpbnB1dCwgJ19sb2NhbGUnKSkge1xuICAgICAgICAgICAgcmV0Ll9sb2NhbGUgPSBpbnB1dC5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjcmVhdGVEdXJhdGlvbi5mbiA9IER1cmF0aW9uLnByb3RvdHlwZTtcbiAgICBjcmVhdGVEdXJhdGlvbi5pbnZhbGlkID0gY3JlYXRlSW52YWxpZCQxO1xuXG4gICAgZnVuY3Rpb24gcGFyc2VJc28gKGlucCwgc2lnbikge1xuICAgICAgICAvLyBXZSdkIG5vcm1hbGx5IHVzZSB+fmlucCBmb3IgdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgYWxzb1xuICAgICAgICAvLyBjb252ZXJ0cyBmbG9hdHMgdG8gaW50cy5cbiAgICAgICAgLy8gaW5wIG1heSBiZSB1bmRlZmluZWQsIHNvIGNhcmVmdWwgY2FsbGluZyByZXBsYWNlIG9uIGl0LlxuICAgICAgICB2YXIgcmVzID0gaW5wICYmIHBhcnNlRmxvYXQoaW5wLnJlcGxhY2UoJywnLCAnLicpKTtcbiAgICAgICAgLy8gYXBwbHkgc2lnbiB3aGlsZSB3ZSdyZSBhdCBpdFxuICAgICAgICByZXR1cm4gKGlzTmFOKHJlcykgPyAwIDogcmVzKSAqIHNpZ247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzID0ge21pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwfTtcblxuICAgICAgICByZXMubW9udGhzID0gb3RoZXIubW9udGgoKSAtIGJhc2UubW9udGgoKSArXG4gICAgICAgICAgICAob3RoZXIueWVhcigpIC0gYmFzZS55ZWFyKCkpICogMTI7XG4gICAgICAgIGlmIChiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJykuaXNBZnRlcihvdGhlcikpIHtcbiAgICAgICAgICAgIC0tcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSArb3RoZXIgLSArKGJhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzO1xuICAgICAgICBpZiAoIShiYXNlLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4ge21pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwfTtcbiAgICAgICAgfVxuXG4gICAgICAgIG90aGVyID0gY2xvbmVXaXRoT2Zmc2V0KG90aGVyLCBiYXNlKTtcbiAgICAgICAgaWYgKGJhc2UuaXNCZWZvcmUob3RoZXIpKSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2Uob3RoZXIsIGJhc2UpO1xuICAgICAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9IC1yZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgcmVzLm1vbnRocyA9IC1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiByZW1vdmUgJ25hbWUnIGFyZyBhZnRlciBkZXByZWNhdGlvbiBpcyByZW1vdmVkXG4gICAgZnVuY3Rpb24gY3JlYXRlQWRkZXIoZGlyZWN0aW9uLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBkdXIsIHRtcDtcbiAgICAgICAgICAgIC8vaW52ZXJ0IHRoZSBhcmd1bWVudHMsIGJ1dCBjb21wbGFpbiBhYm91dCBpdFxuICAgICAgICAgICAgaWYgKHBlcmlvZCAhPT0gbnVsbCAmJiAhaXNOYU4oK3BlcmlvZCkpIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUobmFtZSwgJ21vbWVudCgpLicgKyBuYW1lICArICcocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuJyArIG5hbWUgKyAnKG51bWJlciwgcGVyaW9kKS4gJyArXG4gICAgICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2FkZC1pbnZlcnRlZC1wYXJhbS8gZm9yIG1vcmUgaW5mby4nKTtcbiAgICAgICAgICAgICAgICB0bXAgPSB2YWw7IHZhbCA9IHBlcmlvZDsgcGVyaW9kID0gdG1wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWwgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/ICt2YWwgOiB2YWw7XG4gICAgICAgICAgICBkdXIgPSBjcmVhdGVEdXJhdGlvbih2YWwsIHBlcmlvZCk7XG4gICAgICAgICAgICBhZGRTdWJ0cmFjdCh0aGlzLCBkdXIsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdCAobW9tLCBkdXJhdGlvbiwgaXNBZGRpbmcsIHVwZGF0ZU9mZnNldCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgIGRheXMgPSBhYnNSb3VuZChkdXJhdGlvbi5fZGF5cyksXG4gICAgICAgICAgICBtb250aHMgPSBhYnNSb3VuZChkdXJhdGlvbi5fbW9udGhzKTtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVPZmZzZXQgPSB1cGRhdGVPZmZzZXQgPT0gbnVsbCA/IHRydWUgOiB1cGRhdGVPZmZzZXQ7XG5cbiAgICAgICAgaWYgKG1vbnRocykge1xuICAgICAgICAgICAgc2V0TW9udGgobW9tLCBnZXQobW9tLCAnTW9udGgnKSArIG1vbnRocyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5cykge1xuICAgICAgICAgICAgc2V0JDEobW9tLCAnRGF0ZScsIGdldChtb20sICdEYXRlJykgKyBkYXlzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIG1vbS5fZC5zZXRUaW1lKG1vbS5fZC52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZU9mZnNldCkge1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KG1vbSwgZGF5cyB8fCBtb250aHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFkZCAgICAgID0gY3JlYXRlQWRkZXIoMSwgJ2FkZCcpO1xuICAgIHZhciBzdWJ0cmFjdCA9IGNyZWF0ZUFkZGVyKC0xLCAnc3VidHJhY3QnKTtcblxuICAgIGZ1bmN0aW9uIGdldENhbGVuZGFyRm9ybWF0KG15TW9tZW50LCBub3cpIHtcbiAgICAgICAgdmFyIGRpZmYgPSBteU1vbWVudC5kaWZmKG5vdywgJ2RheXMnLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGRpZmYgPCAtNiA/ICdzYW1lRWxzZScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAtMSA/ICdsYXN0V2VlaycgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAwID8gJ2xhc3REYXknIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgMSA/ICdzYW1lRGF5JyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDIgPyAnbmV4dERheScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCA3ID8gJ25leHRXZWVrJyA6ICdzYW1lRWxzZSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsZW5kYXIkMSAodGltZSwgZm9ybWF0cykge1xuICAgICAgICAvLyBXZSB3YW50IHRvIGNvbXBhcmUgdGhlIHN0YXJ0IG9mIHRvZGF5LCB2cyB0aGlzLlxuICAgICAgICAvLyBHZXR0aW5nIHN0YXJ0LW9mLXRvZGF5IGRlcGVuZHMgb24gd2hldGhlciB3ZSdyZSBsb2NhbC91dGMvb2Zmc2V0IG9yIG5vdC5cbiAgICAgICAgdmFyIG5vdyA9IHRpbWUgfHwgY3JlYXRlTG9jYWwoKSxcbiAgICAgICAgICAgIHNvZCA9IGNsb25lV2l0aE9mZnNldChub3csIHRoaXMpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgZm9ybWF0ID0gaG9va3MuY2FsZW5kYXJGb3JtYXQodGhpcywgc29kKSB8fCAnc2FtZUVsc2UnO1xuXG4gICAgICAgIHZhciBvdXRwdXQgPSBmb3JtYXRzICYmIChpc0Z1bmN0aW9uKGZvcm1hdHNbZm9ybWF0XSkgPyBmb3JtYXRzW2Zvcm1hdF0uY2FsbCh0aGlzLCBub3cpIDogZm9ybWF0c1tmb3JtYXRdKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQob3V0cHV0IHx8IHRoaXMubG9jYWxlRGF0YSgpLmNhbGVuZGFyKGZvcm1hdCwgdGhpcywgY3JlYXRlTG9jYWwobm93KSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsb25lICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBZnRlciAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHMoIWlzVW5kZWZpbmVkKHVuaXRzKSA/IHVuaXRzIDogJ21pbGxpc2Vjb25kJyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID4gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxJbnB1dC52YWx1ZU9mKCkgPCB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZWZvcmUgKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKCFpc1VuZGVmaW5lZCh1bml0cykgPyB1bml0cyA6ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA8IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0JldHdlZW4gKGZyb20sIHRvLCB1bml0cywgaW5jbHVzaXZpdHkpIHtcbiAgICAgICAgaW5jbHVzaXZpdHkgPSBpbmNsdXNpdml0eSB8fCAnKCknO1xuICAgICAgICByZXR1cm4gKGluY2x1c2l2aXR5WzBdID09PSAnKCcgPyB0aGlzLmlzQWZ0ZXIoZnJvbSwgdW5pdHMpIDogIXRoaXMuaXNCZWZvcmUoZnJvbSwgdW5pdHMpKSAmJlxuICAgICAgICAgICAgKGluY2x1c2l2aXR5WzFdID09PSAnKScgPyB0aGlzLmlzQmVmb3JlKHRvLCB1bml0cykgOiAhdGhpcy5pc0FmdGVyKHRvLCB1bml0cykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCksXG4gICAgICAgICAgICBpbnB1dE1zO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzIHx8ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA9PT0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dE1zID0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckFmdGVyIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lKGlucHV0LCB1bml0cykgfHwgdGhpcy5pc0FmdGVyKGlucHV0LHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckJlZm9yZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsdW5pdHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpZmYgKGlucHV0LCB1bml0cywgYXNGbG9hdCkge1xuICAgICAgICB2YXIgdGhhdCxcbiAgICAgICAgICAgIHpvbmVEZWx0YSxcbiAgICAgICAgICAgIG91dHB1dDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhhdCA9IGNsb25lV2l0aE9mZnNldChpbnB1dCwgdGhpcyk7XG5cbiAgICAgICAgaWYgKCF0aGF0LmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHpvbmVEZWx0YSA9ICh0aGF0LnV0Y09mZnNldCgpIC0gdGhpcy51dGNPZmZzZXQoKSkgKiA2ZTQ7XG5cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6IG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KSAvIDEyOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzogb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOiBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAzOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAxZTM7IGJyZWFrOyAvLyAxMDAwXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gNmU0OyBicmVhazsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBjYXNlICdob3VyJzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDM2ZTU7IGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnZGF5Jzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0IC0gem9uZURlbHRhKSAvIDg2NGU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCwgbmVnYXRlIGRzdFxuICAgICAgICAgICAgY2FzZSAnd2Vlayc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA2MDQ4ZTU7IGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MCAqIDI0ICogNywgbmVnYXRlIGRzdFxuICAgICAgICAgICAgZGVmYXVsdDogb3V0cHV0ID0gdGhpcyAtIHRoYXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXNGbG9hdCA/IG91dHB1dCA6IGFic0Zsb29yKG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhEaWZmIChhLCBiKSB7XG4gICAgICAgIC8vIGRpZmZlcmVuY2UgaW4gbW9udGhzXG4gICAgICAgIHZhciB3aG9sZU1vbnRoRGlmZiA9ICgoYi55ZWFyKCkgLSBhLnllYXIoKSkgKiAxMikgKyAoYi5tb250aCgpIC0gYS5tb250aCgpKSxcbiAgICAgICAgICAgIC8vIGIgaXMgaW4gKGFuY2hvciAtIDEgbW9udGgsIGFuY2hvciArIDEgbW9udGgpXG4gICAgICAgICAgICBhbmNob3IgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmLCAnbW9udGhzJyksXG4gICAgICAgICAgICBhbmNob3IyLCBhZGp1c3Q7XG5cbiAgICAgICAgaWYgKGIgLSBhbmNob3IgPCAwKSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiAtIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yIC0gYW5jaG9yMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiArIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yMiAtIGFuY2hvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGZvciBuZWdhdGl2ZSB6ZXJvLCByZXR1cm4gemVybyBpZiBuZWdhdGl2ZSB6ZXJvXG4gICAgICAgIHJldHVybiAtKHdob2xlTW9udGhEaWZmICsgYWRqdXN0KSB8fCAwO1xuICAgIH1cblxuICAgIGhvb2tzLmRlZmF1bHRGb3JtYXQgPSAnWVlZWS1NTS1ERFRISDptbTpzc1onO1xuICAgIGhvb2tzLmRlZmF1bHRGb3JtYXRVdGMgPSAnWVlZWS1NTS1ERFRISDptbTpzc1taXSc7XG5cbiAgICBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKCdlbicpLmZvcm1hdCgnZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWlonKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0lTT1N0cmluZyhrZWVwT2Zmc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1dGMgPSBrZWVwT2Zmc2V0ICE9PSB0cnVlO1xuICAgICAgICB2YXIgbSA9IHV0YyA/IHRoaXMuY2xvbmUoKS51dGMoKSA6IHRoaXM7XG4gICAgICAgIGlmIChtLnllYXIoKSA8IDAgfHwgbS55ZWFyKCkgPiA5OTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sIHV0YyA/ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nIDogJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1onKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGdW5jdGlvbihEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZykpIHtcbiAgICAgICAgICAgIC8vIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB+NTB4IGZhc3RlciwgdXNlIGl0IHdoZW4gd2UgY2FuXG4gICAgICAgICAgICBpZiAodXRjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpICsgdGhpcy51dGNPZmZzZXQoKSAqIDYwICogMTAwMCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKCdaJywgZm9ybWF0TW9tZW50KG0sICdaJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXRNb21lbnQobSwgdXRjID8gJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nIDogJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgaHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgYSBtb21lbnQgdGhhdCBjYW5cbiAgICAgKiBhbHNvIGJlIGV2YWx1YXRlZCB0byBnZXQgYSBuZXcgbW9tZW50IHdoaWNoIGlzIHRoZSBzYW1lXG4gICAgICpcbiAgICAgKiBAbGluayBodHRwczovL25vZGVqcy5vcmcvZGlzdC9sYXRlc3QvZG9jcy9hcGkvdXRpbC5odG1sI3V0aWxfY3VzdG9tX2luc3BlY3RfZnVuY3Rpb25fb25fb2JqZWN0c1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ21vbWVudC5pbnZhbGlkKC8qICcgKyB0aGlzLl9pICsgJyAqLyknO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdW5jID0gJ21vbWVudCc7XG4gICAgICAgIHZhciB6b25lID0gJyc7XG4gICAgICAgIGlmICghdGhpcy5pc0xvY2FsKCkpIHtcbiAgICAgICAgICAgIGZ1bmMgPSB0aGlzLnV0Y09mZnNldCgpID09PSAwID8gJ21vbWVudC51dGMnIDogJ21vbWVudC5wYXJzZVpvbmUnO1xuICAgICAgICAgICAgem9uZSA9ICdaJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJlZml4ID0gJ1snICsgZnVuYyArICcoXCJdJztcbiAgICAgICAgdmFyIHllYXIgPSAoMCA8PSB0aGlzLnllYXIoKSAmJiB0aGlzLnllYXIoKSA8PSA5OTk5KSA/ICdZWVlZJyA6ICdZWVlZWVknO1xuICAgICAgICB2YXIgZGF0ZXRpbWUgPSAnLU1NLUREW1RdSEg6bW06c3MuU1NTJztcbiAgICAgICAgdmFyIHN1ZmZpeCA9IHpvbmUgKyAnW1wiKV0nO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChwcmVmaXggKyB5ZWFyICsgZGF0ZXRpbWUgKyBzdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdCAoaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgaWYgKCFpbnB1dFN0cmluZykge1xuICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSB0aGlzLmlzVXRjKCkgPyBob29rcy5kZWZhdWx0Rm9ybWF0VXRjIDogaG9va3MuZGVmYXVsdEZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0TW9tZW50KHRoaXMsIGlucHV0U3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8XG4gICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7dG86IHRoaXMsIGZyb206IHRpbWV9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tTm93ICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb20oY3JlYXRlTG9jYWwoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG8gKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAgICAgKChpc01vbWVudCh0aW1lKSAmJiB0aW1lLmlzVmFsaWQoKSkgfHxcbiAgICAgICAgICAgICAgICAgY3JlYXRlTG9jYWwodGltZSkuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHtmcm9tOiB0aGlzLCB0bzogdGltZX0pLmxvY2FsZSh0aGlzLmxvY2FsZSgpKS5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvTm93ICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIC8vIElmIHBhc3NlZCBhIGxvY2FsZSBrZXksIGl0IHdpbGwgc2V0IHRoZSBsb2NhbGUgZm9yIHRoaXNcbiAgICAvLyBpbnN0YW5jZS4gIE90aGVyd2lzZSwgaXQgd2lsbCByZXR1cm4gdGhlIGxvY2FsZSBjb25maWd1cmF0aW9uXG4gICAgLy8gdmFyaWFibGVzIGZvciB0aGlzIGluc3RhbmNlLlxuICAgIGZ1bmN0aW9uIGxvY2FsZSAoa2V5KSB7XG4gICAgICAgIHZhciBuZXdMb2NhbGVEYXRhO1xuXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xvY2FsZURhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChuZXdMb2NhbGVEYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSBuZXdMb2NhbGVEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGFuZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLmxhbmcoKSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgbW9tZW50KCkubG9jYWxlRGF0YSgpIHRvIGdldCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbi4gVXNlIG1vbWVudCgpLmxvY2FsZSgpIHRvIGNoYW5nZSBsYW5ndWFnZXMuJyxcbiAgICAgICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGFydE9mICh1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBzd2l0Y2ggaW50ZW50aW9uYWxseSBvbWl0cyBicmVhayBrZXl3b3Jkc1xuICAgICAgICAvLyB0byB1dGlsaXplIGZhbGxpbmcgdGhyb3VnaCB0aGUgY2FzZXMuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRoaXMubW9udGgoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlKDEpO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgY2FzZSAnaXNvV2Vlayc6XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5ob3VycygwKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZXMoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNlY29uZHMoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1pbGxpc2Vjb25kcygwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlZWtzIGFyZSBhIHNwZWNpYWwgY2FzZVxuICAgICAgICBpZiAodW5pdHMgPT09ICd3ZWVrJykge1xuICAgICAgICAgICAgdGhpcy53ZWVrZGF5KDApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ2lzb1dlZWsnKSB7XG4gICAgICAgICAgICB0aGlzLmlzb1dlZWtkYXkoMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBxdWFydGVycyBhcmUgYWxzbyBzcGVjaWFsXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ3F1YXJ0ZXInKSB7XG4gICAgICAgICAgICB0aGlzLm1vbnRoKE1hdGguZmxvb3IodGhpcy5tb250aCgpIC8gMykgKiAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZE9mICh1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gJ2RhdGUnIGlzIGFuIGFsaWFzIGZvciAnZGF5Jywgc28gaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgc3VjaC5cbiAgICAgICAgaWYgKHVuaXRzID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIHVuaXRzID0gJ2RheSc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mKHVuaXRzKS5hZGQoMSwgKHVuaXRzID09PSAnaXNvV2VlaycgPyAnd2VlaycgOiB1bml0cykpLnN1YnRyYWN0KDEsICdtcycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlT2YgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZC52YWx1ZU9mKCkgLSAoKHRoaXMuX29mZnNldCB8fCAwKSAqIDYwMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bml4ICgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy52YWx1ZU9mKCkgLyAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0RhdGUgKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvQXJyYXkgKCkge1xuICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBbbS55ZWFyKCksIG0ubW9udGgoKSwgbS5kYXRlKCksIG0uaG91cigpLCBtLm1pbnV0ZSgpLCBtLnNlY29uZCgpLCBtLm1pbGxpc2Vjb25kKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvT2JqZWN0ICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcnM6IG0ueWVhcigpLFxuICAgICAgICAgICAgbW9udGhzOiBtLm1vbnRoKCksXG4gICAgICAgICAgICBkYXRlOiBtLmRhdGUoKSxcbiAgICAgICAgICAgIGhvdXJzOiBtLmhvdXJzKCksXG4gICAgICAgICAgICBtaW51dGVzOiBtLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHNlY29uZHM6IG0uc2Vjb25kcygpLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzOiBtLm1pbGxpc2Vjb25kcygpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgICAgICAgLy8gbmV3IERhdGUoTmFOKS50b0pTT04oKSA9PT0gbnVsbFxuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMiAoKSB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkKHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNpbmdGbGFncyAoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIGdldFBhcnNpbmdGbGFncyh0aGlzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52YWxpZEF0ICgpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcnNpbmdGbGFncyh0aGlzKS5vdmVyZmxvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGlvbkRhdGEoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnB1dDogdGhpcy5faSxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5fZixcbiAgICAgICAgICAgIGxvY2FsZTogdGhpcy5fbG9jYWxlLFxuICAgICAgICAgICAgaXNVVEM6IHRoaXMuX2lzVVRDLFxuICAgICAgICAgICAgc3RyaWN0OiB0aGlzLl9zdHJpY3RcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ2dnJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnR0cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1llYXJGb3JtYXRUb2tlbiAodG9rZW4sIGdldHRlcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbigwLCBbdG9rZW4sIHRva2VuLmxlbmd0aF0sIDAsIGdldHRlcik7XG4gICAgfVxuXG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZycsICAgICAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnZycsICAgICd3ZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0cnLCAgJ2lzb1dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHR0cnLCAnaXNvV2Vla1llYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnd2Vla1llYXInLCAnZ2cnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWtZZWFyJywgJ0dHJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrWWVhcicsIDEpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2Vla1llYXInLCAxKTtcblxuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRycsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2cnLCAgICAgIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdHRycsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2cnLCAgICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0cnLCAgIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHR0cnLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2dnJywgIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZ2dnZycsICdnZ2dnZycsICdHR0dHJywgJ0dHR0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAyKV0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnJywgJ0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFyIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbCh0aGlzLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMud2VlaygpLFxuICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheSgpLFxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyxcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWtZZWFyIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbCh0aGlzLFxuICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLmlzb1dlZWsoKSwgdGhpcy5pc29XZWVrZGF5KCksIDEsIDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldElTT1dlZWtzSW5ZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRXZWVrc0luWWVhciAoKSB7XG4gICAgICAgIHZhciB3ZWVrSW5mbyA9IHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrO1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIHdlZWtJbmZvLmRvdywgd2Vla0luZm8uZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhckhlbHBlcihpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtzVGFyZ2V0O1xuICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIodGhpcywgZG93LCBkb3kpLnllYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3ZWVrc1RhcmdldCA9IHdlZWtzSW5ZZWFyKGlucHV0LCBkb3csIGRveSk7XG4gICAgICAgICAgICBpZiAod2VlayA+IHdlZWtzVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgd2VlayA9IHdlZWtzVGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNldFdlZWtBbGwuY2FsbCh0aGlzLCBpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0V2Vla0FsbCh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhckRhdGEgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKGRheU9mWWVhckRhdGEueWVhciwgMCwgZGF5T2ZZZWFyRGF0YS5kYXlPZlllYXIpO1xuXG4gICAgICAgIHRoaXMueWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpO1xuICAgICAgICB0aGlzLm1vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSk7XG4gICAgICAgIHRoaXMuZGF0ZShkYXRlLmdldFVUQ0RhdGUoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdRJywgMCwgJ1FvJywgJ3F1YXJ0ZXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygncXVhcnRlcicsICdRJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdxdWFydGVyJywgNyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdRJywgbWF0Y2gxKTtcbiAgICBhZGRQYXJzZVRva2VuKCdRJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSAodG9JbnQoaW5wdXQpIC0gMSkgKiAzO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0UXVhcnRlciAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBNYXRoLmNlaWwoKHRoaXMubW9udGgoKSArIDEpIC8gMykgOiB0aGlzLm1vbnRoKChpbnB1dCAtIDEpICogMyArIHRoaXMubW9udGgoKSAlIDMpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEJywgWydERCcsIDJdLCAnRG8nLCAnZGF0ZScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXRlJywgJ0QnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXRlJywgOSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignREQnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignRG8nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHJldHVybiBpc1N0cmljdCA/XG4gICAgICAgICAgKGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZSB8fCBsb2NhbGUuX29yZGluYWxQYXJzZSkgOlxuICAgICAgICAgIGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZUxlbmllbnQ7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnRCcsICdERCddLCBEQVRFKTtcbiAgICBhZGRQYXJzZVRva2VuKCdEbycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbREFURV0gPSB0b0ludChpbnB1dC5tYXRjaChtYXRjaDF0bzIpWzBdKTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXREYXlPZk1vbnRoID0gbWFrZUdldFNldCgnRGF0ZScsIHRydWUpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0RERCcsIFsnRERERCcsIDNdLCAnREREbycsICdkYXlPZlllYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnZGF5T2ZZZWFyJywgJ0RERCcpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RheU9mWWVhcicsIDQpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignREREJywgIG1hdGNoMXRvMyk7XG4gICAgYWRkUmVnZXhUb2tlbignRERERCcsIG1hdGNoMyk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ0RERCcsICdEREREJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mWWVhciAoaW5wdXQpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhciA9IE1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKSAtIHRoaXMuY2xvbmUoKS5zdGFydE9mKCd5ZWFyJykpIC8gODY0ZTUpICsgMTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBkYXlPZlllYXIgOiB0aGlzLmFkZCgoaW5wdXQgLSBkYXlPZlllYXIpLCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdtJywgWydtbScsIDJdLCAwLCAnbWludXRlJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ21pbnV0ZScsICdtJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdtaW51dGUnLCAxNCk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdtJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignbW0nLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ20nLCAnbW0nXSwgTUlOVVRFKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRNaW51dGUgPSBtYWtlR2V0U2V0KCdNaW51dGVzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3MnLCBbJ3NzJywgMl0sIDAsICdzZWNvbmQnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnc2Vjb25kJywgJ3MnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3NlY29uZCcsIDE1KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3MnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdzcycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsncycsICdzcyddLCBTRUNPTkQpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFNlY29uZCA9IG1ha2VHZXRTZXQoJ1NlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTJywgM10sIDAsICdtaWxsaXNlY29uZCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTUycsIDRdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTJywgNV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTUycsIDZdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTUycsIDddLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTJywgOF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTUycsIDldLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDAwO1xuICAgIH0pO1xuXG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ21pbGxpc2Vjb25kJywgJ21zJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdtaWxsaXNlY29uZCcsIDE2KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1MnLCAgICBtYXRjaDF0bzMsIG1hdGNoMSk7XG4gICAgYWRkUmVnZXhUb2tlbignU1MnLCAgIG1hdGNoMXRvMywgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdTU1MnLCAgbWF0Y2gxdG8zLCBtYXRjaDMpO1xuXG4gICAgdmFyIHRva2VuO1xuICAgIGZvciAodG9rZW4gPSAnU1NTUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUmVnZXhUb2tlbih0b2tlbiwgbWF0Y2hVbnNpZ25lZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VNcyhpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTUlMTElTRUNPTkRdID0gdG9JbnQoKCcwLicgKyBpbnB1dCkgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmb3IgKHRva2VuID0gJ1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIHBhcnNlTXMpO1xuICAgIH1cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0TWlsbGlzZWNvbmQgPSBtYWtlR2V0U2V0KCdNaWxsaXNlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigneicsICAwLCAwLCAnem9uZUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignenonLCAwLCAwLCAnem9uZU5hbWUnKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFpvbmVBYmJyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gJ1VUQycgOiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRab25lTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZScgOiAnJztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8gPSBNb21lbnQucHJvdG90eXBlO1xuXG4gICAgcHJvdG8uYWRkICAgICAgICAgICAgICAgPSBhZGQ7XG4gICAgcHJvdG8uY2FsZW5kYXIgICAgICAgICAgPSBjYWxlbmRhciQxO1xuICAgIHByb3RvLmNsb25lICAgICAgICAgICAgID0gY2xvbmU7XG4gICAgcHJvdG8uZGlmZiAgICAgICAgICAgICAgPSBkaWZmO1xuICAgIHByb3RvLmVuZE9mICAgICAgICAgICAgID0gZW5kT2Y7XG4gICAgcHJvdG8uZm9ybWF0ICAgICAgICAgICAgPSBmb3JtYXQ7XG4gICAgcHJvdG8uZnJvbSAgICAgICAgICAgICAgPSBmcm9tO1xuICAgIHByb3RvLmZyb21Ob3cgICAgICAgICAgID0gZnJvbU5vdztcbiAgICBwcm90by50byAgICAgICAgICAgICAgICA9IHRvO1xuICAgIHByb3RvLnRvTm93ICAgICAgICAgICAgID0gdG9Ob3c7XG4gICAgcHJvdG8uZ2V0ICAgICAgICAgICAgICAgPSBzdHJpbmdHZXQ7XG4gICAgcHJvdG8uaW52YWxpZEF0ICAgICAgICAgPSBpbnZhbGlkQXQ7XG4gICAgcHJvdG8uaXNBZnRlciAgICAgICAgICAgPSBpc0FmdGVyO1xuICAgIHByb3RvLmlzQmVmb3JlICAgICAgICAgID0gaXNCZWZvcmU7XG4gICAgcHJvdG8uaXNCZXR3ZWVuICAgICAgICAgPSBpc0JldHdlZW47XG4gICAgcHJvdG8uaXNTYW1lICAgICAgICAgICAgPSBpc1NhbWU7XG4gICAgcHJvdG8uaXNTYW1lT3JBZnRlciAgICAgPSBpc1NhbWVPckFmdGVyO1xuICAgIHByb3RvLmlzU2FtZU9yQmVmb3JlICAgID0gaXNTYW1lT3JCZWZvcmU7XG4gICAgcHJvdG8uaXNWYWxpZCAgICAgICAgICAgPSBpc1ZhbGlkJDI7XG4gICAgcHJvdG8ubGFuZyAgICAgICAgICAgICAgPSBsYW5nO1xuICAgIHByb3RvLmxvY2FsZSAgICAgICAgICAgID0gbG9jYWxlO1xuICAgIHByb3RvLmxvY2FsZURhdGEgICAgICAgID0gbG9jYWxlRGF0YTtcbiAgICBwcm90by5tYXggICAgICAgICAgICAgICA9IHByb3RvdHlwZU1heDtcbiAgICBwcm90by5taW4gICAgICAgICAgICAgICA9IHByb3RvdHlwZU1pbjtcbiAgICBwcm90by5wYXJzaW5nRmxhZ3MgICAgICA9IHBhcnNpbmdGbGFncztcbiAgICBwcm90by5zZXQgICAgICAgICAgICAgICA9IHN0cmluZ1NldDtcbiAgICBwcm90by5zdGFydE9mICAgICAgICAgICA9IHN0YXJ0T2Y7XG4gICAgcHJvdG8uc3VidHJhY3QgICAgICAgICAgPSBzdWJ0cmFjdDtcbiAgICBwcm90by50b0FycmF5ICAgICAgICAgICA9IHRvQXJyYXk7XG4gICAgcHJvdG8udG9PYmplY3QgICAgICAgICAgPSB0b09iamVjdDtcbiAgICBwcm90by50b0RhdGUgICAgICAgICAgICA9IHRvRGF0ZTtcbiAgICBwcm90by50b0lTT1N0cmluZyAgICAgICA9IHRvSVNPU3RyaW5nO1xuICAgIHByb3RvLmluc3BlY3QgICAgICAgICAgID0gaW5zcGVjdDtcbiAgICBwcm90by50b0pTT04gICAgICAgICAgICA9IHRvSlNPTjtcbiAgICBwcm90by50b1N0cmluZyAgICAgICAgICA9IHRvU3RyaW5nO1xuICAgIHByb3RvLnVuaXggICAgICAgICAgICAgID0gdW5peDtcbiAgICBwcm90by52YWx1ZU9mICAgICAgICAgICA9IHZhbHVlT2Y7XG4gICAgcHJvdG8uY3JlYXRpb25EYXRhICAgICAgPSBjcmVhdGlvbkRhdGE7XG4gICAgcHJvdG8ueWVhciAgICAgICA9IGdldFNldFllYXI7XG4gICAgcHJvdG8uaXNMZWFwWWVhciA9IGdldElzTGVhcFllYXI7XG4gICAgcHJvdG8ud2Vla1llYXIgICAgPSBnZXRTZXRXZWVrWWVhcjtcbiAgICBwcm90by5pc29XZWVrWWVhciA9IGdldFNldElTT1dlZWtZZWFyO1xuICAgIHByb3RvLnF1YXJ0ZXIgPSBwcm90by5xdWFydGVycyA9IGdldFNldFF1YXJ0ZXI7XG4gICAgcHJvdG8ubW9udGggICAgICAgPSBnZXRTZXRNb250aDtcbiAgICBwcm90by5kYXlzSW5Nb250aCA9IGdldERheXNJbk1vbnRoO1xuICAgIHByb3RvLndlZWsgICAgICAgICAgID0gcHJvdG8ud2Vla3MgICAgICAgID0gZ2V0U2V0V2VlaztcbiAgICBwcm90by5pc29XZWVrICAgICAgICA9IHByb3RvLmlzb1dlZWtzICAgICA9IGdldFNldElTT1dlZWs7XG4gICAgcHJvdG8ud2Vla3NJblllYXIgICAgPSBnZXRXZWVrc0luWWVhcjtcbiAgICBwcm90by5pc29XZWVrc0luWWVhciA9IGdldElTT1dlZWtzSW5ZZWFyO1xuICAgIHByb3RvLmRhdGUgICAgICAgPSBnZXRTZXREYXlPZk1vbnRoO1xuICAgIHByb3RvLmRheSAgICAgICAgPSBwcm90by5kYXlzICAgICAgICAgICAgID0gZ2V0U2V0RGF5T2ZXZWVrO1xuICAgIHByb3RvLndlZWtkYXkgICAgPSBnZXRTZXRMb2NhbGVEYXlPZldlZWs7XG4gICAgcHJvdG8uaXNvV2Vla2RheSA9IGdldFNldElTT0RheU9mV2VlaztcbiAgICBwcm90by5kYXlPZlllYXIgID0gZ2V0U2V0RGF5T2ZZZWFyO1xuICAgIHByb3RvLmhvdXIgPSBwcm90by5ob3VycyA9IGdldFNldEhvdXI7XG4gICAgcHJvdG8ubWludXRlID0gcHJvdG8ubWludXRlcyA9IGdldFNldE1pbnV0ZTtcbiAgICBwcm90by5zZWNvbmQgPSBwcm90by5zZWNvbmRzID0gZ2V0U2V0U2Vjb25kO1xuICAgIHByb3RvLm1pbGxpc2Vjb25kID0gcHJvdG8ubWlsbGlzZWNvbmRzID0gZ2V0U2V0TWlsbGlzZWNvbmQ7XG4gICAgcHJvdG8udXRjT2Zmc2V0ICAgICAgICAgICAgPSBnZXRTZXRPZmZzZXQ7XG4gICAgcHJvdG8udXRjICAgICAgICAgICAgICAgICAgPSBzZXRPZmZzZXRUb1VUQztcbiAgICBwcm90by5sb2NhbCAgICAgICAgICAgICAgICA9IHNldE9mZnNldFRvTG9jYWw7XG4gICAgcHJvdG8ucGFyc2Vab25lICAgICAgICAgICAgPSBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldDtcbiAgICBwcm90by5oYXNBbGlnbmVkSG91ck9mZnNldCA9IGhhc0FsaWduZWRIb3VyT2Zmc2V0O1xuICAgIHByb3RvLmlzRFNUICAgICAgICAgICAgICAgID0gaXNEYXlsaWdodFNhdmluZ1RpbWU7XG4gICAgcHJvdG8uaXNMb2NhbCAgICAgICAgICAgICAgPSBpc0xvY2FsO1xuICAgIHByb3RvLmlzVXRjT2Zmc2V0ICAgICAgICAgID0gaXNVdGNPZmZzZXQ7XG4gICAgcHJvdG8uaXNVdGMgICAgICAgICAgICAgICAgPSBpc1V0YztcbiAgICBwcm90by5pc1VUQyAgICAgICAgICAgICAgICA9IGlzVXRjO1xuICAgIHByb3RvLnpvbmVBYmJyID0gZ2V0Wm9uZUFiYnI7XG4gICAgcHJvdG8uem9uZU5hbWUgPSBnZXRab25lTmFtZTtcbiAgICBwcm90by5kYXRlcyAgPSBkZXByZWNhdGUoJ2RhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuJywgZ2V0U2V0RGF5T2ZNb250aCk7XG4gICAgcHJvdG8ubW9udGhzID0gZGVwcmVjYXRlKCdtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQnLCBnZXRTZXRNb250aCk7XG4gICAgcHJvdG8ueWVhcnMgID0gZGVwcmVjYXRlKCd5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkJywgZ2V0U2V0WWVhcik7XG4gICAgcHJvdG8uem9uZSAgID0gZGVwcmVjYXRlKCdtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy96b25lLycsIGdldFNldFpvbmUpO1xuICAgIHByb3RvLmlzRFNUU2hpZnRlZCA9IGRlcHJlY2F0ZSgnaXNEU1RTaGlmdGVkIGlzIGRlcHJlY2F0ZWQuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RzdC1zaGlmdGVkLyBmb3IgbW9yZSBpbmZvcm1hdGlvbicsIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZCk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVbml4IChpbnB1dCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJblpvbmUgKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5wYXJzZVpvbmUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVQYXJzZVBvc3RGb3JtYXQgKHN0cmluZykge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH1cblxuICAgIHZhciBwcm90byQxID0gTG9jYWxlLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDEuY2FsZW5kYXIgICAgICAgID0gY2FsZW5kYXI7XG4gICAgcHJvdG8kMS5sb25nRGF0ZUZvcm1hdCAgPSBsb25nRGF0ZUZvcm1hdDtcbiAgICBwcm90byQxLmludmFsaWREYXRlICAgICA9IGludmFsaWREYXRlO1xuICAgIHByb3RvJDEub3JkaW5hbCAgICAgICAgID0gb3JkaW5hbDtcbiAgICBwcm90byQxLnByZXBhcnNlICAgICAgICA9IHByZVBhcnNlUG9zdEZvcm1hdDtcbiAgICBwcm90byQxLnBvc3Rmb3JtYXQgICAgICA9IHByZVBhcnNlUG9zdEZvcm1hdDtcbiAgICBwcm90byQxLnJlbGF0aXZlVGltZSAgICA9IHJlbGF0aXZlVGltZTtcbiAgICBwcm90byQxLnBhc3RGdXR1cmUgICAgICA9IHBhc3RGdXR1cmU7XG4gICAgcHJvdG8kMS5zZXQgICAgICAgICAgICAgPSBzZXQ7XG5cbiAgICBwcm90byQxLm1vbnRocyAgICAgICAgICAgID0gICAgICAgIGxvY2FsZU1vbnRocztcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0ICAgICAgID0gICAgICAgIGxvY2FsZU1vbnRoc1Nob3J0O1xuICAgIHByb3RvJDEubW9udGhzUGFyc2UgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzUGFyc2U7XG4gICAgcHJvdG8kMS5tb250aHNSZWdleCAgICAgICA9IG1vbnRoc1JlZ2V4O1xuICAgIHByb3RvJDEubW9udGhzU2hvcnRSZWdleCAgPSBtb250aHNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2VlayA9IGxvY2FsZVdlZWs7XG4gICAgcHJvdG8kMS5maXJzdERheU9mWWVhciA9IGxvY2FsZUZpcnN0RGF5T2ZZZWFyO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZldlZWsgPSBsb2NhbGVGaXJzdERheU9mV2VlaztcblxuICAgIHByb3RvJDEud2Vla2RheXMgICAgICAgPSAgICAgICAgbG9jYWxlV2Vla2RheXM7XG4gICAgcHJvdG8kMS53ZWVrZGF5c01pbiAgICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c01pbjtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnQgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzU2hvcnQ7XG4gICAgcHJvdG8kMS53ZWVrZGF5c1BhcnNlICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c1BhcnNlO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5c1JlZ2V4ICAgICAgID0gICAgICAgIHdlZWtkYXlzUmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0UmVnZXggID0gICAgICAgIHdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzTWluUmVnZXggICAgPSAgICAgICAgd2Vla2RheXNNaW5SZWdleDtcblxuICAgIHByb3RvJDEuaXNQTSA9IGxvY2FsZUlzUE07XG4gICAgcHJvdG8kMS5tZXJpZGllbSA9IGxvY2FsZU1lcmlkaWVtO1xuXG4gICAgZnVuY3Rpb24gZ2V0JDEgKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpO1xuICAgICAgICB2YXIgdXRjID0gY3JlYXRlVVRDKCkuc2V0KHNldHRlciwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gbG9jYWxlW2ZpZWxkXSh1dGMsIGZvcm1hdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRoc0ltcGwgKGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIGksIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIC8vICgpXG4gICAgLy8gKDUpXG4gICAgLy8gKGZtdCwgNSlcbiAgICAvLyAoZm10KVxuICAgIC8vICh0cnVlKVxuICAgIC8vICh0cnVlLCA1KVxuICAgIC8vICh0cnVlLCBmbXQsIDUpXG4gICAgLy8gKHRydWUsIGZtdClcbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNJbXBsIChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxlU29ydGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBsb2NhbGVTb3J0ZWQ7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGxvY2FsZVNvcnRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpLFxuICAgICAgICAgICAgc2hpZnQgPSBsb2NhbGVTb3J0ZWQgPyBsb2NhbGUuX3dlZWsuZG93IDogMDtcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgKGluZGV4ICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgKGkgKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRocyAoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRocycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNTaG9ydCAoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRoc1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzIChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNTaG9ydCAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNNaW4gKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c01pbicpO1xuICAgIH1cblxuICAgIGdldFNldEdsb2JhbExvY2FsZSgnZW4nLCB7XG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSh0aHxzdHxuZHxyZCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodG9JbnQobnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICd0aCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAxKSA/ICdzdCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAyKSA/ICduZCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdyZCcgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgaG9va3MubGFuZyA9IGRlcHJlY2F0ZSgnbW9tZW50LmxhbmcgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGUgaW5zdGVhZC4nLCBnZXRTZXRHbG9iYWxMb2NhbGUpO1xuICAgIGhvb2tzLmxhbmdEYXRhID0gZGVwcmVjYXRlKCdtb21lbnQubGFuZ0RhdGEgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGVEYXRhIGluc3RlYWQuJywgZ2V0TG9jYWxlKTtcblxuICAgIHZhciBtYXRoQWJzID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBhYnMgKCkge1xuICAgICAgICB2YXIgZGF0YSAgICAgICAgICAgPSB0aGlzLl9kYXRhO1xuXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9IG1hdGhBYnModGhpcy5fbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgdGhpcy5fZGF5cyAgICAgICAgID0gbWF0aEFicyh0aGlzLl9kYXlzKTtcbiAgICAgICAgdGhpcy5fbW9udGhzICAgICAgID0gbWF0aEFicyh0aGlzLl9tb250aHMpO1xuXG4gICAgICAgIGRhdGEubWlsbGlzZWNvbmRzICA9IG1hdGhBYnMoZGF0YS5taWxsaXNlY29uZHMpO1xuICAgICAgICBkYXRhLnNlY29uZHMgICAgICAgPSBtYXRoQWJzKGRhdGEuc2Vjb25kcyk7XG4gICAgICAgIGRhdGEubWludXRlcyAgICAgICA9IG1hdGhBYnMoZGF0YS5taW51dGVzKTtcbiAgICAgICAgZGF0YS5ob3VycyAgICAgICAgID0gbWF0aEFicyhkYXRhLmhvdXJzKTtcbiAgICAgICAgZGF0YS5tb250aHMgICAgICAgID0gbWF0aEFicyhkYXRhLm1vbnRocyk7XG4gICAgICAgIGRhdGEueWVhcnMgICAgICAgICA9IG1hdGhBYnMoZGF0YS55ZWFycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkU3VidHJhY3QkMSAoZHVyYXRpb24sIGlucHV0LCB2YWx1ZSwgZGlyZWN0aW9uKSB7XG4gICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUR1cmF0aW9uKGlucHV0LCB2YWx1ZSk7XG5cbiAgICAgICAgZHVyYXRpb24uX21pbGxpc2Vjb25kcyArPSBkaXJlY3Rpb24gKiBvdGhlci5fbWlsbGlzZWNvbmRzO1xuICAgICAgICBkdXJhdGlvbi5fZGF5cyAgICAgICAgICs9IGRpcmVjdGlvbiAqIG90aGVyLl9kYXlzO1xuICAgICAgICBkdXJhdGlvbi5fbW9udGhzICAgICAgICs9IGRpcmVjdGlvbiAqIG90aGVyLl9tb250aHM7XG5cbiAgICAgICAgcmV0dXJuIGR1cmF0aW9uLl9idWJibGUoKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBhZGQoMSwgJ3MnKSBvciBhZGQoZHVyYXRpb24pXG4gICAgZnVuY3Rpb24gYWRkJDEgKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIDEpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIHN1YnRyYWN0KDEsICdzJykgb3Igc3VidHJhY3QoZHVyYXRpb24pXG4gICAgZnVuY3Rpb24gc3VidHJhY3QkMSAoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgLTEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0NlaWwgKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJ1YmJsZSAoKSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHM7XG4gICAgICAgIHZhciBkYXlzICAgICAgICAgPSB0aGlzLl9kYXlzO1xuICAgICAgICB2YXIgbW9udGhzICAgICAgID0gdGhpcy5fbW9udGhzO1xuICAgICAgICB2YXIgZGF0YSAgICAgICAgID0gdGhpcy5fZGF0YTtcbiAgICAgICAgdmFyIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCB5ZWFycywgbW9udGhzRnJvbURheXM7XG5cbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIG1peCBvZiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgdmFsdWVzLCBidWJibGUgZG93biBmaXJzdFxuICAgICAgICAvLyBjaGVjazogaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzIxNjZcbiAgICAgICAgaWYgKCEoKG1pbGxpc2Vjb25kcyA+PSAwICYmIGRheXMgPj0gMCAmJiBtb250aHMgPj0gMCkgfHxcbiAgICAgICAgICAgICAgICAobWlsbGlzZWNvbmRzIDw9IDAgJiYgZGF5cyA8PSAwICYmIG1vbnRocyA8PSAwKSkpIHtcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyArPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHMpICsgZGF5cykgKiA4NjRlNTtcbiAgICAgICAgICAgIGRheXMgPSAwO1xuICAgICAgICAgICAgbW9udGhzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBidWJibGVzIHVwIHZhbHVlcywgc2VlIHRoZSB0ZXN0cyBmb3JcbiAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAlIDEwMDA7XG5cbiAgICAgICAgc2Vjb25kcyAgICAgICAgICAgPSBhYnNGbG9vcihtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzICAgICAgPSBzZWNvbmRzICUgNjA7XG5cbiAgICAgICAgbWludXRlcyAgICAgICAgICAgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgICAgICA9IG1pbnV0ZXMgJSA2MDtcblxuICAgICAgICBob3VycyAgICAgICAgICAgICA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIGRhdGEuaG91cnMgICAgICAgID0gaG91cnMgJSAyNDtcblxuICAgICAgICBkYXlzICs9IGFic0Zsb29yKGhvdXJzIC8gMjQpO1xuXG4gICAgICAgIC8vIGNvbnZlcnQgZGF5cyB0byBtb250aHNcbiAgICAgICAgbW9udGhzRnJvbURheXMgPSBhYnNGbG9vcihkYXlzVG9Nb250aHMoZGF5cykpO1xuICAgICAgICBtb250aHMgKz0gbW9udGhzRnJvbURheXM7XG4gICAgICAgIGRheXMgLT0gYWJzQ2VpbChtb250aHNUb0RheXMobW9udGhzRnJvbURheXMpKTtcblxuICAgICAgICAvLyAxMiBtb250aHMgLT4gMSB5ZWFyXG4gICAgICAgIHllYXJzID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cbiAgICAgICAgZGF0YS5kYXlzICAgPSBkYXlzO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1vbnRocztcbiAgICAgICAgZGF0YS55ZWFycyAgPSB5ZWFycztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlzVG9Nb250aHMgKGRheXMpIHtcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTQ2MDk3IGRheXMgKHRha2luZyBpbnRvIGFjY291bnQgbGVhcCB5ZWFyIHJ1bGVzKVxuICAgICAgICAvLyA0MDAgeWVhcnMgaGF2ZSAxMiBtb250aHMgPT09IDQ4MDBcbiAgICAgICAgcmV0dXJuIGRheXMgKiA0ODAwIC8gMTQ2MDk3O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1RvRGF5cyAobW9udGhzKSB7XG4gICAgICAgIC8vIHRoZSByZXZlcnNlIG9mIGRheXNUb01vbnRoc1xuICAgICAgICByZXR1cm4gbW9udGhzICogMTQ2MDk3IC8gNDgwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcyAodW5pdHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5cztcbiAgICAgICAgdmFyIG1vbnRocztcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcztcblxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICBpZiAodW5pdHMgPT09ICdtb250aCcgfHwgdW5pdHMgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgZGF5cyAgID0gdGhpcy5fZGF5cyAgICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMgKyBkYXlzVG9Nb250aHMoZGF5cyk7XG4gICAgICAgICAgICByZXR1cm4gdW5pdHMgPT09ICdtb250aCcgPyBtb250aHMgOiBtb250aHMgLyAxMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBtaWxsaXNlY29uZHMgc2VwYXJhdGVseSBiZWNhdXNlIG9mIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIChpc3N1ZSAjMTg2NylcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgTWF0aC5yb3VuZChtb250aHNUb0RheXModGhpcy5fbW9udGhzKSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2VlaycgICA6IHJldHVybiBkYXlzIC8gNyAgICAgKyBtaWxsaXNlY29uZHMgLyA2MDQ4ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGF5JyAgICA6IHJldHVybiBkYXlzICAgICAgICAgKyBtaWxsaXNlY29uZHMgLyA4NjRlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdob3VyJyAgIDogcmV0dXJuIGRheXMgKiAyNCAgICArIG1pbGxpc2Vjb25kcyAvIDM2ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWludXRlJyA6IHJldHVybiBkYXlzICogMTQ0MCAgKyBtaWxsaXNlY29uZHMgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2Vjb25kJyA6IHJldHVybiBkYXlzICogODY0MDAgKyBtaWxsaXNlY29uZHMgLyAxMDAwO1xuICAgICAgICAgICAgICAgIC8vIE1hdGguZmxvb3IgcHJldmVudHMgZmxvYXRpbmcgcG9pbnQgbWF0aCBlcnJvcnMgaGVyZVxuICAgICAgICAgICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzogcmV0dXJuIE1hdGguZmxvb3IoZGF5cyAqIDg2NGU1KSArIG1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdW5pdCAnICsgdW5pdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXNlIHRoaXMuYXMoJ21zJyk/XG4gICAgZnVuY3Rpb24gdmFsdWVPZiQxICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHRoaXMuX2RheXMgKiA4NjRlNSArXG4gICAgICAgICAgICAodGhpcy5fbW9udGhzICUgMTIpICogMjU5MmU2ICtcbiAgICAgICAgICAgIHRvSW50KHRoaXMuX21vbnRocyAvIDEyKSAqIDMxNTM2ZTZcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlQXMgKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcyhhbGlhcyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGFzTWlsbGlzZWNvbmRzID0gbWFrZUFzKCdtcycpO1xuICAgIHZhciBhc1NlY29uZHMgICAgICA9IG1ha2VBcygncycpO1xuICAgIHZhciBhc01pbnV0ZXMgICAgICA9IG1ha2VBcygnbScpO1xuICAgIHZhciBhc0hvdXJzICAgICAgICA9IG1ha2VBcygnaCcpO1xuICAgIHZhciBhc0RheXMgICAgICAgICA9IG1ha2VBcygnZCcpO1xuICAgIHZhciBhc1dlZWtzICAgICAgICA9IG1ha2VBcygndycpO1xuICAgIHZhciBhc01vbnRocyAgICAgICA9IG1ha2VBcygnTScpO1xuICAgIHZhciBhc1llYXJzICAgICAgICA9IG1ha2VBcygneScpO1xuXG4gICAgZnVuY3Rpb24gY2xvbmUkMSAoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQkMiAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXNbdW5pdHMgKyAncyddKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldHRlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9kYXRhW25hbWVdIDogTmFOO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtYWtlR2V0dGVyKCdtaWxsaXNlY29uZHMnKTtcbiAgICB2YXIgc2Vjb25kcyAgICAgID0gbWFrZUdldHRlcignc2Vjb25kcycpO1xuICAgIHZhciBtaW51dGVzICAgICAgPSBtYWtlR2V0dGVyKCdtaW51dGVzJyk7XG4gICAgdmFyIGhvdXJzICAgICAgICA9IG1ha2VHZXR0ZXIoJ2hvdXJzJyk7XG4gICAgdmFyIGRheXMgICAgICAgICA9IG1ha2VHZXR0ZXIoJ2RheXMnKTtcbiAgICB2YXIgbW9udGhzICAgICAgID0gbWFrZUdldHRlcignbW9udGhzJyk7XG4gICAgdmFyIHllYXJzICAgICAgICA9IG1ha2VHZXR0ZXIoJ3llYXJzJyk7XG5cbiAgICBmdW5jdGlvbiB3ZWVrcyAoKSB7XG4gICAgICAgIHJldHVybiBhYnNGbG9vcih0aGlzLmRheXMoKSAvIDcpO1xuICAgIH1cblxuICAgIHZhciByb3VuZCA9IE1hdGgucm91bmQ7XG4gICAgdmFyIHRocmVzaG9sZHMgPSB7XG4gICAgICAgIHNzOiA0NCwgICAgICAgICAvLyBhIGZldyBzZWNvbmRzIHRvIHNlY29uZHNcbiAgICAgICAgcyA6IDQ1LCAgICAgICAgIC8vIHNlY29uZHMgdG8gbWludXRlXG4gICAgICAgIG0gOiA0NSwgICAgICAgICAvLyBtaW51dGVzIHRvIGhvdXJcbiAgICAgICAgaCA6IDIyLCAgICAgICAgIC8vIGhvdXJzIHRvIGRheVxuICAgICAgICBkIDogMjYsICAgICAgICAgLy8gZGF5cyB0byBtb250aFxuICAgICAgICBNIDogMTEgICAgICAgICAgLy8gbW9udGhzIHRvIHllYXJcbiAgICB9O1xuXG4gICAgLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBtb21lbnQuZm4uZnJvbSwgbW9tZW50LmZuLmZyb21Ob3csIGFuZCBtb21lbnQuZHVyYXRpb24uZm4uaHVtYW5pemVcbiAgICBmdW5jdGlvbiBzdWJzdGl0dXRlVGltZUFnbyhzdHJpbmcsIG51bWJlciwgd2l0aG91dFN1ZmZpeCwgaXNGdXR1cmUsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLnJlbGF0aXZlVGltZShudW1iZXIgfHwgMSwgISF3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUkMSAocG9zTmVnRHVyYXRpb24sIHdpdGhvdXRTdWZmaXgsIGxvY2FsZSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBjcmVhdGVEdXJhdGlvbihwb3NOZWdEdXJhdGlvbikuYWJzKCk7XG4gICAgICAgIHZhciBzZWNvbmRzICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdzJykpO1xuICAgICAgICB2YXIgbWludXRlcyAgPSByb3VuZChkdXJhdGlvbi5hcygnbScpKTtcbiAgICAgICAgdmFyIGhvdXJzICAgID0gcm91bmQoZHVyYXRpb24uYXMoJ2gnKSk7XG4gICAgICAgIHZhciBkYXlzICAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdkJykpO1xuICAgICAgICB2YXIgbW9udGhzICAgPSByb3VuZChkdXJhdGlvbi5hcygnTScpKTtcbiAgICAgICAgdmFyIHllYXJzICAgID0gcm91bmQoZHVyYXRpb24uYXMoJ3knKSk7XG5cbiAgICAgICAgdmFyIGEgPSBzZWNvbmRzIDw9IHRocmVzaG9sZHMuc3MgJiYgWydzJywgc2Vjb25kc10gIHx8XG4gICAgICAgICAgICAgICAgc2Vjb25kcyA8IHRocmVzaG9sZHMucyAgICYmIFsnc3MnLCBzZWNvbmRzXSB8fFxuICAgICAgICAgICAgICAgIG1pbnV0ZXMgPD0gMSAgICAgICAgICAgICAmJiBbJ20nXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBtaW51dGVzIDwgdGhyZXNob2xkcy5tICAgJiYgWydtbScsIG1pbnV0ZXNdIHx8XG4gICAgICAgICAgICAgICAgaG91cnMgICA8PSAxICAgICAgICAgICAgICYmIFsnaCddICAgICAgICAgICB8fFxuICAgICAgICAgICAgICAgIGhvdXJzICAgPCB0aHJlc2hvbGRzLmggICAmJiBbJ2hoJywgaG91cnNdICAgfHxcbiAgICAgICAgICAgICAgICBkYXlzICAgIDw9IDEgICAgICAgICAgICAgJiYgWydkJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgZGF5cyAgICA8IHRocmVzaG9sZHMuZCAgICYmIFsnZGQnLCBkYXlzXSAgICB8fFxuICAgICAgICAgICAgICAgIG1vbnRocyAgPD0gMSAgICAgICAgICAgICAmJiBbJ00nXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBtb250aHMgIDwgdGhyZXNob2xkcy5NICAgJiYgWydNTScsIG1vbnRoc10gIHx8XG4gICAgICAgICAgICAgICAgeWVhcnMgICA8PSAxICAgICAgICAgICAgICYmIFsneSddICAgICAgICAgICB8fCBbJ3l5JywgeWVhcnNdO1xuXG4gICAgICAgIGFbMl0gPSB3aXRob3V0U3VmZml4O1xuICAgICAgICBhWzNdID0gK3Bvc05lZ0R1cmF0aW9uID4gMDtcbiAgICAgICAgYVs0XSA9IGxvY2FsZTtcbiAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGVUaW1lQWdvLmFwcGx5KG51bGwsIGEpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgdGhlIHJvdW5kaW5nIGZ1bmN0aW9uIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBmdW5jdGlvbiBnZXRTZXRSZWxhdGl2ZVRpbWVSb3VuZGluZyAocm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICBpZiAocm91bmRpbmdGdW5jdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZihyb3VuZGluZ0Z1bmN0aW9uKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcm91bmQgPSByb3VuZGluZ0Z1bmN0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYSB0aHJlc2hvbGQgZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZCAodGhyZXNob2xkLCBsaW1pdCkge1xuICAgICAgICBpZiAodGhyZXNob2xkc1t0aHJlc2hvbGRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZHNbdGhyZXNob2xkXTtcbiAgICAgICAgfVxuICAgICAgICB0aHJlc2hvbGRzW3RocmVzaG9sZF0gPSBsaW1pdDtcbiAgICAgICAgaWYgKHRocmVzaG9sZCA9PT0gJ3MnKSB7XG4gICAgICAgICAgICB0aHJlc2hvbGRzLnNzID0gbGltaXQgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGh1bWFuaXplICh3aXRoU3VmZml4KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxvY2FsZSA9IHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICB2YXIgb3V0cHV0ID0gcmVsYXRpdmVUaW1lJDEodGhpcywgIXdpdGhTdWZmaXgsIGxvY2FsZSk7XG5cbiAgICAgICAgaWYgKHdpdGhTdWZmaXgpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IGxvY2FsZS5wYXN0RnV0dXJlKCt0aGlzLCBvdXRwdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxvY2FsZS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFicyQxID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBzaWduKHgpIHtcbiAgICAgICAgcmV0dXJuICgoeCA+IDApIC0gKHggPCAwKSkgfHwgK3g7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmckMSgpIHtcbiAgICAgICAgLy8gZm9yIElTTyBzdHJpbmdzIHdlIGRvIG5vdCB1c2UgdGhlIG5vcm1hbCBidWJibGluZyBydWxlczpcbiAgICAgICAgLy8gICogbWlsbGlzZWNvbmRzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSBob3Vyc1xuICAgICAgICAvLyAgKiBkYXlzIGRvIG5vdCBidWJibGUgYXQgYWxsXG4gICAgICAgIC8vICAqIG1vbnRocyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgeWVhcnNcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbnRleHQtZnJlZSBjb252ZXJzaW9uIGJldHdlZW4gaG91cnMgYW5kIGRheXNcbiAgICAgICAgLy8gKHRoaW5rIG9mIGNsb2NrIGNoYW5nZXMpXG4gICAgICAgIC8vIGFuZCBhbHNvIG5vdCBiZXR3ZWVuIGRheXMgYW5kIG1vbnRocyAoMjgtMzEgZGF5cyBwZXIgbW9udGgpXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlY29uZHMgPSBhYnMkMSh0aGlzLl9taWxsaXNlY29uZHMpIC8gMTAwMDtcbiAgICAgICAgdmFyIGRheXMgICAgICAgICA9IGFicyQxKHRoaXMuX2RheXMpO1xuICAgICAgICB2YXIgbW9udGhzICAgICAgID0gYWJzJDEodGhpcy5fbW9udGhzKTtcbiAgICAgICAgdmFyIG1pbnV0ZXMsIGhvdXJzLCB5ZWFycztcblxuICAgICAgICAvLyAzNjAwIHNlY29uZHMgLT4gNjAgbWludXRlcyAtPiAxIGhvdXJcbiAgICAgICAgbWludXRlcyAgICAgICAgICAgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBob3VycyAgICAgICAgICAgICA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIHNlY29uZHMgJT0gNjA7XG4gICAgICAgIG1pbnV0ZXMgJT0gNjA7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyAgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuXG4gICAgICAgIC8vIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9kb3JkaWxsZS9tb21lbnQtaXNvZHVyYXRpb24vYmxvYi9tYXN0ZXIvbW9tZW50Lmlzb2R1cmF0aW9uLmpzXG4gICAgICAgIHZhciBZID0geWVhcnM7XG4gICAgICAgIHZhciBNID0gbW9udGhzO1xuICAgICAgICB2YXIgRCA9IGRheXM7XG4gICAgICAgIHZhciBoID0gaG91cnM7XG4gICAgICAgIHZhciBtID0gbWludXRlcztcbiAgICAgICAgdmFyIHMgPSBzZWNvbmRzID8gc2Vjb25kcy50b0ZpeGVkKDMpLnJlcGxhY2UoL1xcLj8wKyQvLCAnJykgOiAnJztcbiAgICAgICAgdmFyIHRvdGFsID0gdGhpcy5hc1NlY29uZHMoKTtcblxuICAgICAgICBpZiAoIXRvdGFsKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBzYW1lIGFzIEMjJ3MgKE5vZGEpIGFuZCBweXRob24gKGlzb2RhdGUpLi4uXG4gICAgICAgICAgICAvLyBidXQgbm90IG90aGVyIEpTIChnb29nLmRhdGUpXG4gICAgICAgICAgICByZXR1cm4gJ1AwRCc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG90YWxTaWduID0gdG90YWwgPCAwID8gJy0nIDogJyc7XG4gICAgICAgIHZhciB5bVNpZ24gPSBzaWduKHRoaXMuX21vbnRocykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIHZhciBkYXlzU2lnbiA9IHNpZ24odGhpcy5fZGF5cykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIHZhciBobXNTaWduID0gc2lnbih0aGlzLl9taWxsaXNlY29uZHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuXG4gICAgICAgIHJldHVybiB0b3RhbFNpZ24gKyAnUCcgK1xuICAgICAgICAgICAgKFkgPyB5bVNpZ24gKyBZICsgJ1knIDogJycpICtcbiAgICAgICAgICAgIChNID8geW1TaWduICsgTSArICdNJyA6ICcnKSArXG4gICAgICAgICAgICAoRCA/IGRheXNTaWduICsgRCArICdEJyA6ICcnKSArXG4gICAgICAgICAgICAoKGggfHwgbSB8fCBzKSA/ICdUJyA6ICcnKSArXG4gICAgICAgICAgICAoaCA/IGhtc1NpZ24gKyBoICsgJ0gnIDogJycpICtcbiAgICAgICAgICAgIChtID8gaG1zU2lnbiArIG0gKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKHMgPyBobXNTaWduICsgcyArICdTJyA6ICcnKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMiA9IER1cmF0aW9uLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDIuaXNWYWxpZCAgICAgICAgPSBpc1ZhbGlkJDE7XG4gICAgcHJvdG8kMi5hYnMgICAgICAgICAgICA9IGFicztcbiAgICBwcm90byQyLmFkZCAgICAgICAgICAgID0gYWRkJDE7XG4gICAgcHJvdG8kMi5zdWJ0cmFjdCAgICAgICA9IHN1YnRyYWN0JDE7XG4gICAgcHJvdG8kMi5hcyAgICAgICAgICAgICA9IGFzO1xuICAgIHByb3RvJDIuYXNNaWxsaXNlY29uZHMgPSBhc01pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLmFzU2Vjb25kcyAgICAgID0gYXNTZWNvbmRzO1xuICAgIHByb3RvJDIuYXNNaW51dGVzICAgICAgPSBhc01pbnV0ZXM7XG4gICAgcHJvdG8kMi5hc0hvdXJzICAgICAgICA9IGFzSG91cnM7XG4gICAgcHJvdG8kMi5hc0RheXMgICAgICAgICA9IGFzRGF5cztcbiAgICBwcm90byQyLmFzV2Vla3MgICAgICAgID0gYXNXZWVrcztcbiAgICBwcm90byQyLmFzTW9udGhzICAgICAgID0gYXNNb250aHM7XG4gICAgcHJvdG8kMi5hc1llYXJzICAgICAgICA9IGFzWWVhcnM7XG4gICAgcHJvdG8kMi52YWx1ZU9mICAgICAgICA9IHZhbHVlT2YkMTtcbiAgICBwcm90byQyLl9idWJibGUgICAgICAgID0gYnViYmxlO1xuICAgIHByb3RvJDIuY2xvbmUgICAgICAgICAgPSBjbG9uZSQxO1xuICAgIHByb3RvJDIuZ2V0ICAgICAgICAgICAgPSBnZXQkMjtcbiAgICBwcm90byQyLm1pbGxpc2Vjb25kcyAgID0gbWlsbGlzZWNvbmRzO1xuICAgIHByb3RvJDIuc2Vjb25kcyAgICAgICAgPSBzZWNvbmRzO1xuICAgIHByb3RvJDIubWludXRlcyAgICAgICAgPSBtaW51dGVzO1xuICAgIHByb3RvJDIuaG91cnMgICAgICAgICAgPSBob3VycztcbiAgICBwcm90byQyLmRheXMgICAgICAgICAgID0gZGF5cztcbiAgICBwcm90byQyLndlZWtzICAgICAgICAgID0gd2Vla3M7XG4gICAgcHJvdG8kMi5tb250aHMgICAgICAgICA9IG1vbnRocztcbiAgICBwcm90byQyLnllYXJzICAgICAgICAgID0geWVhcnM7XG4gICAgcHJvdG8kMi5odW1hbml6ZSAgICAgICA9IGh1bWFuaXplO1xuICAgIHByb3RvJDIudG9JU09TdHJpbmcgICAgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9TdHJpbmcgICAgICAgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9KU09OICAgICAgICAgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIubG9jYWxlICAgICAgICAgPSBsb2NhbGU7XG4gICAgcHJvdG8kMi5sb2NhbGVEYXRhICAgICA9IGxvY2FsZURhdGE7XG5cbiAgICBwcm90byQyLnRvSXNvU3RyaW5nID0gZGVwcmVjYXRlKCd0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKScsIHRvSVNPU3RyaW5nJDEpO1xuICAgIHByb3RvJDIubGFuZyA9IGxhbmc7XG5cbiAgICAvLyBTaWRlIGVmZmVjdCBpbXBvcnRzXG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWCcsIDAsIDAsICd1bml4Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3gnLCAwLCAwLCAndmFsdWVPZicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigneCcsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdYJywgbWF0Y2hUaW1lc3RhbXApO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUocGFyc2VGbG9hdChpbnB1dCwgMTApICogMTAwMCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbigneCcsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSh0b0ludChpbnB1dCkpO1xuICAgIH0pO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG5cbiAgICBob29rcy52ZXJzaW9uID0gJzIuMjIuMic7XG5cbiAgICBzZXRIb29rQ2FsbGJhY2soY3JlYXRlTG9jYWwpO1xuXG4gICAgaG9va3MuZm4gICAgICAgICAgICAgICAgICAgID0gcHJvdG87XG4gICAgaG9va3MubWluICAgICAgICAgICAgICAgICAgID0gbWluO1xuICAgIGhvb2tzLm1heCAgICAgICAgICAgICAgICAgICA9IG1heDtcbiAgICBob29rcy5ub3cgICAgICAgICAgICAgICAgICAgPSBub3c7XG4gICAgaG9va3MudXRjICAgICAgICAgICAgICAgICAgID0gY3JlYXRlVVRDO1xuICAgIGhvb2tzLnVuaXggICAgICAgICAgICAgICAgICA9IGNyZWF0ZVVuaXg7XG4gICAgaG9va3MubW9udGhzICAgICAgICAgICAgICAgID0gbGlzdE1vbnRocztcbiAgICBob29rcy5pc0RhdGUgICAgICAgICAgICAgICAgPSBpc0RhdGU7XG4gICAgaG9va3MubG9jYWxlICAgICAgICAgICAgICAgID0gZ2V0U2V0R2xvYmFsTG9jYWxlO1xuICAgIGhvb2tzLmludmFsaWQgICAgICAgICAgICAgICA9IGNyZWF0ZUludmFsaWQ7XG4gICAgaG9va3MuZHVyYXRpb24gICAgICAgICAgICAgID0gY3JlYXRlRHVyYXRpb247XG4gICAgaG9va3MuaXNNb21lbnQgICAgICAgICAgICAgID0gaXNNb21lbnQ7XG4gICAgaG9va3Mud2Vla2RheXMgICAgICAgICAgICAgID0gbGlzdFdlZWtkYXlzO1xuICAgIGhvb2tzLnBhcnNlWm9uZSAgICAgICAgICAgICA9IGNyZWF0ZUluWm9uZTtcbiAgICBob29rcy5sb2NhbGVEYXRhICAgICAgICAgICAgPSBnZXRMb2NhbGU7XG4gICAgaG9va3MuaXNEdXJhdGlvbiAgICAgICAgICAgID0gaXNEdXJhdGlvbjtcbiAgICBob29rcy5tb250aHNTaG9ydCAgICAgICAgICAgPSBsaXN0TW9udGhzU2hvcnQ7XG4gICAgaG9va3Mud2Vla2RheXNNaW4gICAgICAgICAgID0gbGlzdFdlZWtkYXlzTWluO1xuICAgIGhvb2tzLmRlZmluZUxvY2FsZSAgICAgICAgICA9IGRlZmluZUxvY2FsZTtcbiAgICBob29rcy51cGRhdGVMb2NhbGUgICAgICAgICAgPSB1cGRhdGVMb2NhbGU7XG4gICAgaG9va3MubG9jYWxlcyAgICAgICAgICAgICAgID0gbGlzdExvY2FsZXM7XG4gICAgaG9va3Mud2Vla2RheXNTaG9ydCAgICAgICAgID0gbGlzdFdlZWtkYXlzU2hvcnQ7XG4gICAgaG9va3Mubm9ybWFsaXplVW5pdHMgICAgICAgID0gbm9ybWFsaXplVW5pdHM7XG4gICAgaG9va3MucmVsYXRpdmVUaW1lUm91bmRpbmcgID0gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmc7XG4gICAgaG9va3MucmVsYXRpdmVUaW1lVGhyZXNob2xkID0gZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkO1xuICAgIGhvb2tzLmNhbGVuZGFyRm9ybWF0ICAgICAgICA9IGdldENhbGVuZGFyRm9ybWF0O1xuICAgIGhvb2tzLnByb3RvdHlwZSAgICAgICAgICAgICA9IHByb3RvO1xuXG4gICAgLy8gY3VycmVudGx5IEhUTUw1IGlucHV0IHR5cGUgb25seSBzdXBwb3J0cyAyNC1ob3VyIGZvcm1hdHNcbiAgICBob29rcy5IVE1MNV9GTVQgPSB7XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMOiAnWVlZWS1NTS1ERFRISDptbScsICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9TRUNPTkRTOiAnWVlZWS1NTS1ERFRISDptbTpzcycsICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9NUzogJ1lZWVktTU0tRERUSEg6bW06c3MuU1NTJywgICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgREFURTogJ1lZWVktTU0tREQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJkYXRlXCIgLz5cbiAgICAgICAgVElNRTogJ0hIOm1tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgLz5cbiAgICAgICAgVElNRV9TRUNPTkRTOiAnSEg6bW06c3MnLCAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICBUSU1FX01TOiAnSEg6bW06c3MuU1NTJywgICAgICAgICAgICAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cInRpbWVcIiBzdGVwPVwiMC4wMDFcIiAvPlxuICAgICAgICBXRUVLOiAnWVlZWS1bV11XVycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cIndlZWtcIiAvPlxuICAgICAgICBNT05USDogJ1lZWVktTU0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cIm1vbnRoXCIgLz5cbiAgICB9O1xuXG4gICAgcmV0dXJuIGhvb2tzO1xuXG59KSkpO1xuIiwiKGZ1bmN0aW9uIChnbG9iYWwpe1xuLy8gICAgIFVuZGVyc2NvcmUuanMgMS45LjFcbi8vICAgICBodHRwOi8vdW5kZXJzY29yZWpzLm9yZ1xuLy8gICAgIChjKSAyMDA5LTIwMTggSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbi8vICAgICBVbmRlcnNjb3JlIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuXG4oZnVuY3Rpb24oKSB7XG5cbiAgLy8gQmFzZWxpbmUgc2V0dXBcbiAgLy8gLS0tLS0tLS0tLS0tLS1cblxuICAvLyBFc3RhYmxpc2ggdGhlIHJvb3Qgb2JqZWN0LCBgd2luZG93YCAoYHNlbGZgKSBpbiB0aGUgYnJvd3NlciwgYGdsb2JhbGBcbiAgLy8gb24gdGhlIHNlcnZlciwgb3IgYHRoaXNgIGluIHNvbWUgdmlydHVhbCBtYWNoaW5lcy4gV2UgdXNlIGBzZWxmYFxuICAvLyBpbnN0ZWFkIG9mIGB3aW5kb3dgIGZvciBgV2ViV29ya2VyYCBzdXBwb3J0LlxuICB2YXIgcm9vdCA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYuc2VsZiA9PT0gc2VsZiAmJiBzZWxmIHx8XG4gICAgICAgICAgICB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbCAmJiBnbG9iYWwgfHxcbiAgICAgICAgICAgIHRoaXMgfHxcbiAgICAgICAgICAgIHt9O1xuXG4gIC8vIFNhdmUgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBgX2AgdmFyaWFibGUuXG4gIHZhciBwcmV2aW91c1VuZGVyc2NvcmUgPSByb290Ll87XG5cbiAgLy8gU2F2ZSBieXRlcyBpbiB0aGUgbWluaWZpZWQgKGJ1dCBub3QgZ3ppcHBlZCkgdmVyc2lvbjpcbiAgdmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsIE9ialByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIFN5bWJvbFByb3RvID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgPyBTeW1ib2wucHJvdG90eXBlIDogbnVsbDtcblxuICAvLyBDcmVhdGUgcXVpY2sgcmVmZXJlbmNlIHZhcmlhYmxlcyBmb3Igc3BlZWQgYWNjZXNzIHRvIGNvcmUgcHJvdG90eXBlcy5cbiAgdmFyIHB1c2ggPSBBcnJheVByb3RvLnB1c2gsXG4gICAgICBzbGljZSA9IEFycmF5UHJvdG8uc2xpY2UsXG4gICAgICB0b1N0cmluZyA9IE9ialByb3RvLnRvU3RyaW5nLFxuICAgICAgaGFzT3duUHJvcGVydHkgPSBPYmpQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuICAvLyBBbGwgKipFQ01BU2NyaXB0IDUqKiBuYXRpdmUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIHRoYXQgd2UgaG9wZSB0byB1c2VcbiAgLy8gYXJlIGRlY2xhcmVkIGhlcmUuXG4gIHZhciBuYXRpdmVJc0FycmF5ID0gQXJyYXkuaXNBcnJheSxcbiAgICAgIG5hdGl2ZUtleXMgPSBPYmplY3Qua2V5cyxcbiAgICAgIG5hdGl2ZUNyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG5cbiAgLy8gTmFrZWQgZnVuY3Rpb24gcmVmZXJlbmNlIGZvciBzdXJyb2dhdGUtcHJvdG90eXBlLXN3YXBwaW5nLlxuICB2YXIgQ3RvciA9IGZ1bmN0aW9uKCl7fTtcblxuICAvLyBDcmVhdGUgYSBzYWZlIHJlZmVyZW5jZSB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QgZm9yIHVzZSBiZWxvdy5cbiAgdmFyIF8gPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgXykgcmV0dXJuIG9iajtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgXykpIHJldHVybiBuZXcgXyhvYmopO1xuICAgIHRoaXMuX3dyYXBwZWQgPSBvYmo7XG4gIH07XG5cbiAgLy8gRXhwb3J0IHRoZSBVbmRlcnNjb3JlIG9iamVjdCBmb3IgKipOb2RlLmpzKiosIHdpdGhcbiAgLy8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgZm9yIHRoZWlyIG9sZCBtb2R1bGUgQVBJLiBJZiB3ZSdyZSBpblxuICAvLyB0aGUgYnJvd3NlciwgYWRkIGBfYCBhcyBhIGdsb2JhbCBvYmplY3QuXG4gIC8vIChgbm9kZVR5cGVgIGlzIGNoZWNrZWQgdG8gZW5zdXJlIHRoYXQgYG1vZHVsZWBcbiAgLy8gYW5kIGBleHBvcnRzYCBhcmUgbm90IEhUTUwgZWxlbWVudHMuKVxuICBpZiAodHlwZW9mIGV4cG9ydHMgIT0gJ3VuZGVmaW5lZCcgJiYgIWV4cG9ydHMubm9kZVR5cGUpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfO1xuICAgIH1cbiAgICBleHBvcnRzLl8gPSBfO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuXyA9IF87XG4gIH1cblxuICAvLyBDdXJyZW50IHZlcnNpb24uXG4gIF8uVkVSU0lPTiA9ICcxLjkuMSc7XG5cbiAgLy8gSW50ZXJuYWwgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGVmZmljaWVudCAoZm9yIGN1cnJlbnQgZW5naW5lcykgdmVyc2lvblxuICAvLyBvZiB0aGUgcGFzc2VkLWluIGNhbGxiYWNrLCB0byBiZSByZXBlYXRlZGx5IGFwcGxpZWQgaW4gb3RoZXIgVW5kZXJzY29yZVxuICAvLyBmdW5jdGlvbnMuXG4gIHZhciBvcHRpbWl6ZUNiID0gZnVuY3Rpb24oZnVuYywgY29udGV4dCwgYXJnQ291bnQpIHtcbiAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSByZXR1cm4gZnVuYztcbiAgICBzd2l0Y2ggKGFyZ0NvdW50ID09IG51bGwgPyAzIDogYXJnQ291bnQpIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIC8vIFRoZSAyLWFyZ3VtZW50IGNhc2UgaXMgb21pdHRlZCBiZWNhdXNlIHdl4oCZcmUgbm90IHVzaW5nIGl0LlxuICAgICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgIH07XG4gICAgICBjYXNlIDQ6IHJldHVybiBmdW5jdGlvbihhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZnVuYy5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH07XG5cbiAgdmFyIGJ1aWx0aW5JdGVyYXRlZTtcblxuICAvLyBBbiBpbnRlcm5hbCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBjYWxsYmFja3MgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBlYWNoXG4gIC8vIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uLCByZXR1cm5pbmcgdGhlIGRlc2lyZWQgcmVzdWx0IOKAlCBlaXRoZXIgYGlkZW50aXR5YCxcbiAgLy8gYW4gYXJiaXRyYXJ5IGNhbGxiYWNrLCBhIHByb3BlcnR5IG1hdGNoZXIsIG9yIGEgcHJvcGVydHkgYWNjZXNzb3IuXG4gIHZhciBjYiA9IGZ1bmN0aW9uKHZhbHVlLCBjb250ZXh0LCBhcmdDb3VudCkge1xuICAgIGlmIChfLml0ZXJhdGVlICE9PSBidWlsdGluSXRlcmF0ZWUpIHJldHVybiBfLml0ZXJhdGVlKHZhbHVlLCBjb250ZXh0KTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIF8uaWRlbnRpdHk7XG4gICAgaWYgKF8uaXNGdW5jdGlvbih2YWx1ZSkpIHJldHVybiBvcHRpbWl6ZUNiKHZhbHVlLCBjb250ZXh0LCBhcmdDb3VudCk7XG4gICAgaWYgKF8uaXNPYmplY3QodmFsdWUpICYmICFfLmlzQXJyYXkodmFsdWUpKSByZXR1cm4gXy5tYXRjaGVyKHZhbHVlKTtcbiAgICByZXR1cm4gXy5wcm9wZXJ0eSh2YWx1ZSk7XG4gIH07XG5cbiAgLy8gRXh0ZXJuYWwgd3JhcHBlciBmb3Igb3VyIGNhbGxiYWNrIGdlbmVyYXRvci4gVXNlcnMgbWF5IGN1c3RvbWl6ZVxuICAvLyBgXy5pdGVyYXRlZWAgaWYgdGhleSB3YW50IGFkZGl0aW9uYWwgcHJlZGljYXRlL2l0ZXJhdGVlIHNob3J0aGFuZCBzdHlsZXMuXG4gIC8vIFRoaXMgYWJzdHJhY3Rpb24gaGlkZXMgdGhlIGludGVybmFsLW9ubHkgYXJnQ291bnQgYXJndW1lbnQuXG4gIF8uaXRlcmF0ZWUgPSBidWlsdGluSXRlcmF0ZWUgPSBmdW5jdGlvbih2YWx1ZSwgY29udGV4dCkge1xuICAgIHJldHVybiBjYih2YWx1ZSwgY29udGV4dCwgSW5maW5pdHkpO1xuICB9O1xuXG4gIC8vIFNvbWUgZnVuY3Rpb25zIHRha2UgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLCBvciBhIGZldyBleHBlY3RlZFxuICAvLyBhcmd1bWVudHMgYXQgdGhlIGJlZ2lubmluZyBhbmQgdGhlbiBhIHZhcmlhYmxlIG51bWJlciBvZiB2YWx1ZXMgdG8gb3BlcmF0ZVxuICAvLyBvbi4gVGhpcyBoZWxwZXIgYWNjdW11bGF0ZXMgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgcGFzdCB0aGUgZnVuY3Rpb27igJlzXG4gIC8vIGFyZ3VtZW50IGxlbmd0aCAob3IgYW4gZXhwbGljaXQgYHN0YXJ0SW5kZXhgKSwgaW50byBhbiBhcnJheSB0aGF0IGJlY29tZXNcbiAgLy8gdGhlIGxhc3QgYXJndW1lbnQuIFNpbWlsYXIgdG8gRVM24oCZcyBcInJlc3QgcGFyYW1ldGVyXCIuXG4gIHZhciByZXN0QXJndW1lbnRzID0gZnVuY3Rpb24oZnVuYywgc3RhcnRJbmRleCkge1xuICAgIHN0YXJ0SW5kZXggPSBzdGFydEluZGV4ID09IG51bGwgPyBmdW5jLmxlbmd0aCAtIDEgOiArc3RhcnRJbmRleDtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gTWF0aC5tYXgoYXJndW1lbnRzLmxlbmd0aCAtIHN0YXJ0SW5kZXgsIDApLFxuICAgICAgICAgIHJlc3QgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgIGZvciAoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICByZXN0W2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleCArIHN0YXJ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChzdGFydEluZGV4KSB7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzLCByZXN0KTtcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXMsIGFyZ3VtZW50c1swXSwgcmVzdCk7XG4gICAgICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzLCBhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSwgcmVzdCk7XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IEFycmF5KHN0YXJ0SW5kZXggKyAxKTtcbiAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN0YXJ0SW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgfVxuICAgICAgYXJnc1tzdGFydEluZGV4XSA9IHJlc3Q7XG4gICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIG5ldyBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIGFub3RoZXIuXG4gIHZhciBiYXNlQ3JlYXRlID0gZnVuY3Rpb24ocHJvdG90eXBlKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KHByb3RvdHlwZSkpIHJldHVybiB7fTtcbiAgICBpZiAobmF0aXZlQ3JlYXRlKSByZXR1cm4gbmF0aXZlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgQ3Rvci5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBDdG9yO1xuICAgIEN0b3IucHJvdG90eXBlID0gbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciBzaGFsbG93UHJvcGVydHkgPSBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqID09IG51bGwgPyB2b2lkIDAgOiBvYmpba2V5XTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBoYXMgPSBmdW5jdGlvbihvYmosIHBhdGgpIHtcbiAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHBhdGgpO1xuICB9XG5cbiAgdmFyIGRlZXBHZXQgPSBmdW5jdGlvbihvYmosIHBhdGgpIHtcbiAgICB2YXIgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gdm9pZCAwO1xuICAgICAgb2JqID0gb2JqW3BhdGhbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gbGVuZ3RoID8gb2JqIDogdm9pZCAwO1xuICB9O1xuXG4gIC8vIEhlbHBlciBmb3IgY29sbGVjdGlvbiBtZXRob2RzIHRvIGRldGVybWluZSB3aGV0aGVyIGEgY29sbGVjdGlvblxuICAvLyBzaG91bGQgYmUgaXRlcmF0ZWQgYXMgYW4gYXJyYXkgb3IgYXMgYW4gb2JqZWN0LlxuICAvLyBSZWxhdGVkOiBodHRwOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2xlbmd0aFxuICAvLyBBdm9pZHMgYSB2ZXJ5IG5hc3R5IGlPUyA4IEpJVCBidWcgb24gQVJNLTY0LiAjMjA5NFxuICB2YXIgTUFYX0FSUkFZX0lOREVYID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbiAgdmFyIGdldExlbmd0aCA9IHNoYWxsb3dQcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gIHZhciBpc0FycmF5TGlrZSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgbGVuZ3RoID0gZ2V0TGVuZ3RoKGNvbGxlY3Rpb24pO1xuICAgIHJldHVybiB0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInICYmIGxlbmd0aCA+PSAwICYmIGxlbmd0aCA8PSBNQVhfQVJSQVlfSU5ERVg7XG4gIH07XG5cbiAgLy8gQ29sbGVjdGlvbiBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBUaGUgY29ybmVyc3RvbmUsIGFuIGBlYWNoYCBpbXBsZW1lbnRhdGlvbiwgYWthIGBmb3JFYWNoYC5cbiAgLy8gSGFuZGxlcyByYXcgb2JqZWN0cyBpbiBhZGRpdGlvbiB0byBhcnJheS1saWtlcy4gVHJlYXRzIGFsbFxuICAvLyBzcGFyc2UgYXJyYXktbGlrZXMgYXMgaWYgdGhleSB3ZXJlIGRlbnNlLlxuICBfLmVhY2ggPSBfLmZvckVhY2ggPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBvcHRpbWl6ZUNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB2YXIgaSwgbGVuZ3RoO1xuICAgIGlmIChpc0FycmF5TGlrZShvYmopKSB7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBvYmoubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlcmF0ZWUob2JqW2ldLCBpLCBvYmopO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVyYXRlZShvYmpba2V5c1tpXV0sIGtleXNbaV0sIG9iaik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSByZXN1bHRzIG9mIGFwcGx5aW5nIHRoZSBpdGVyYXRlZSB0byBlYWNoIGVsZW1lbnQuXG4gIF8ubWFwID0gXy5jb2xsZWN0ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYgXy5rZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IChrZXlzIHx8IG9iaikubGVuZ3RoLFxuICAgICAgICByZXN1bHRzID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgcmVzdWx0c1tpbmRleF0gPSBpdGVyYXRlZShvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIC8vIENyZWF0ZSBhIHJlZHVjaW5nIGZ1bmN0aW9uIGl0ZXJhdGluZyBsZWZ0IG9yIHJpZ2h0LlxuICB2YXIgY3JlYXRlUmVkdWNlID0gZnVuY3Rpb24oZGlyKSB7XG4gICAgLy8gV3JhcCBjb2RlIHRoYXQgcmVhc3NpZ25zIGFyZ3VtZW50IHZhcmlhYmxlcyBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRoYW5cbiAgICAvLyB0aGUgb25lIHRoYXQgYWNjZXNzZXMgYGFyZ3VtZW50cy5sZW5ndGhgIHRvIGF2b2lkIGEgcGVyZiBoaXQuICgjMTk5MSlcbiAgICB2YXIgcmVkdWNlciA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIG1lbW8sIGluaXRpYWwpIHtcbiAgICAgIHZhciBrZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYgXy5rZXlzKG9iaiksXG4gICAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGgsXG4gICAgICAgICAgaW5kZXggPSBkaXIgPiAwID8gMCA6IGxlbmd0aCAtIDE7XG4gICAgICBpZiAoIWluaXRpYWwpIHtcbiAgICAgICAgbWVtbyA9IG9ialtrZXlzID8ga2V5c1tpbmRleF0gOiBpbmRleF07XG4gICAgICAgIGluZGV4ICs9IGRpcjtcbiAgICAgIH1cbiAgICAgIGZvciAoOyBpbmRleCA+PSAwICYmIGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSBkaXIpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzID8ga2V5c1tpbmRleF0gOiBpbmRleDtcbiAgICAgICAgbWVtbyA9IGl0ZXJhdGVlKG1lbW8sIG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG5cbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgbWVtbywgY29udGV4dCkge1xuICAgICAgdmFyIGluaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoID49IDM7XG4gICAgICByZXR1cm4gcmVkdWNlcihvYmosIG9wdGltaXplQ2IoaXRlcmF0ZWUsIGNvbnRleHQsIDQpLCBtZW1vLCBpbml0aWFsKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vICoqUmVkdWNlKiogYnVpbGRzIHVwIGEgc2luZ2xlIHJlc3VsdCBmcm9tIGEgbGlzdCBvZiB2YWx1ZXMsIGFrYSBgaW5qZWN0YCxcbiAgLy8gb3IgYGZvbGRsYC5cbiAgXy5yZWR1Y2UgPSBfLmZvbGRsID0gXy5pbmplY3QgPSBjcmVhdGVSZWR1Y2UoMSk7XG5cbiAgLy8gVGhlIHJpZ2h0LWFzc29jaWF0aXZlIHZlcnNpb24gb2YgcmVkdWNlLCBhbHNvIGtub3duIGFzIGBmb2xkcmAuXG4gIF8ucmVkdWNlUmlnaHQgPSBfLmZvbGRyID0gY3JlYXRlUmVkdWNlKC0xKTtcblxuICAvLyBSZXR1cm4gdGhlIGZpcnN0IHZhbHVlIHdoaWNoIHBhc3NlcyBhIHRydXRoIHRlc3QuIEFsaWFzZWQgYXMgYGRldGVjdGAuXG4gIF8uZmluZCA9IF8uZGV0ZWN0ID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIga2V5RmluZGVyID0gaXNBcnJheUxpa2Uob2JqKSA/IF8uZmluZEluZGV4IDogXy5maW5kS2V5O1xuICAgIHZhciBrZXkgPSBrZXlGaW5kZXIob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIGlmIChrZXkgIT09IHZvaWQgMCAmJiBrZXkgIT09IC0xKSByZXR1cm4gb2JqW2tleV07XG4gIH07XG5cbiAgLy8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgdGhhdCBwYXNzIGEgdHJ1dGggdGVzdC5cbiAgLy8gQWxpYXNlZCBhcyBgc2VsZWN0YC5cbiAgXy5maWx0ZXIgPSBfLnNlbGVjdCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICBwcmVkaWNhdGUgPSBjYihwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgbGlzdCkge1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGxpc3QpKSByZXN1bHRzLnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGZvciB3aGljaCBhIHRydXRoIHRlc3QgZmFpbHMuXG4gIF8ucmVqZWN0ID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gXy5maWx0ZXIob2JqLCBfLm5lZ2F0ZShjYihwcmVkaWNhdGUpKSwgY29udGV4dCk7XG4gIH07XG5cbiAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYWxsIG9mIHRoZSBlbGVtZW50cyBtYXRjaCBhIHRydXRoIHRlc3QuXG4gIC8vIEFsaWFzZWQgYXMgYGFsbGAuXG4gIF8uZXZlcnkgPSBfLmFsbCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICB2YXIga2V5cyA9ICFpc0FycmF5TGlrZShvYmopICYmIF8ua2V5cyhvYmopLFxuICAgICAgICBsZW5ndGggPSAoa2V5cyB8fCBvYmopLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgaWYgKCFwcmVkaWNhdGUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8vIERldGVybWluZSBpZiBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiB0aGUgb2JqZWN0IG1hdGNoZXMgYSB0cnV0aCB0ZXN0LlxuICAvLyBBbGlhc2VkIGFzIGBhbnlgLlxuICBfLnNvbWUgPSBfLmFueSA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICB2YXIga2V5cyA9ICFpc0FycmF5TGlrZShvYmopICYmIF8ua2V5cyhvYmopLFxuICAgICAgICBsZW5ndGggPSAoa2V5cyB8fCBvYmopLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgaWYgKHByZWRpY2F0ZShvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaikpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBhcnJheSBvciBvYmplY3QgY29udGFpbnMgYSBnaXZlbiBpdGVtICh1c2luZyBgPT09YCkuXG4gIC8vIEFsaWFzZWQgYXMgYGluY2x1ZGVzYCBhbmQgYGluY2x1ZGVgLlxuICBfLmNvbnRhaW5zID0gXy5pbmNsdWRlcyA9IF8uaW5jbHVkZSA9IGZ1bmN0aW9uKG9iaiwgaXRlbSwgZnJvbUluZGV4LCBndWFyZCkge1xuICAgIGlmICghaXNBcnJheUxpa2Uob2JqKSkgb2JqID0gXy52YWx1ZXMob2JqKTtcbiAgICBpZiAodHlwZW9mIGZyb21JbmRleCAhPSAnbnVtYmVyJyB8fCBndWFyZCkgZnJvbUluZGV4ID0gMDtcbiAgICByZXR1cm4gXy5pbmRleE9mKG9iaiwgaXRlbSwgZnJvbUluZGV4KSA+PSAwO1xuICB9O1xuXG4gIC8vIEludm9rZSBhIG1ldGhvZCAod2l0aCBhcmd1bWVudHMpIG9uIGV2ZXJ5IGl0ZW0gaW4gYSBjb2xsZWN0aW9uLlxuICBfLmludm9rZSA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24ob2JqLCBwYXRoLCBhcmdzKSB7XG4gICAgdmFyIGNvbnRleHRQYXRoLCBmdW5jO1xuICAgIGlmIChfLmlzRnVuY3Rpb24ocGF0aCkpIHtcbiAgICAgIGZ1bmMgPSBwYXRoO1xuICAgIH0gZWxzZSBpZiAoXy5pc0FycmF5KHBhdGgpKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpO1xuICAgICAgcGF0aCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgcmV0dXJuIF8ubWFwKG9iaiwgZnVuY3Rpb24oY29udGV4dCkge1xuICAgICAgdmFyIG1ldGhvZCA9IGZ1bmM7XG4gICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICBpZiAoY29udGV4dFBhdGggJiYgY29udGV4dFBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgY29udGV4dCA9IGRlZXBHZXQoY29udGV4dCwgY29udGV4dFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHJldHVybiB2b2lkIDA7XG4gICAgICAgIG1ldGhvZCA9IGNvbnRleHRbcGF0aF07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWV0aG9kID09IG51bGwgPyBtZXRob2QgOiBtZXRob2QuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIENvbnZlbmllbmNlIHZlcnNpb24gb2YgYSBjb21tb24gdXNlIGNhc2Ugb2YgYG1hcGA6IGZldGNoaW5nIGEgcHJvcGVydHkuXG4gIF8ucGx1Y2sgPSBmdW5jdGlvbihvYmosIGtleSkge1xuICAgIHJldHVybiBfLm1hcChvYmosIF8ucHJvcGVydHkoa2V5KSk7XG4gIH07XG5cbiAgLy8gQ29udmVuaWVuY2UgdmVyc2lvbiBvZiBhIGNvbW1vbiB1c2UgY2FzZSBvZiBgZmlsdGVyYDogc2VsZWN0aW5nIG9ubHkgb2JqZWN0c1xuICAvLyBjb250YWluaW5nIHNwZWNpZmljIGBrZXk6dmFsdWVgIHBhaXJzLlxuICBfLndoZXJlID0gZnVuY3Rpb24ob2JqLCBhdHRycykge1xuICAgIHJldHVybiBfLmZpbHRlcihvYmosIF8ubWF0Y2hlcihhdHRycykpO1xuICB9O1xuXG4gIC8vIENvbnZlbmllbmNlIHZlcnNpb24gb2YgYSBjb21tb24gdXNlIGNhc2Ugb2YgYGZpbmRgOiBnZXR0aW5nIHRoZSBmaXJzdCBvYmplY3RcbiAgLy8gY29udGFpbmluZyBzcGVjaWZpYyBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy5maW5kV2hlcmUgPSBmdW5jdGlvbihvYmosIGF0dHJzKSB7XG4gICAgcmV0dXJuIF8uZmluZChvYmosIF8ubWF0Y2hlcihhdHRycykpO1xuICB9O1xuXG4gIC8vIFJldHVybiB0aGUgbWF4aW11bSBlbGVtZW50IChvciBlbGVtZW50LWJhc2VkIGNvbXB1dGF0aW9uKS5cbiAgXy5tYXggPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlc3VsdCA9IC1JbmZpbml0eSwgbGFzdENvbXB1dGVkID0gLUluZmluaXR5LFxuICAgICAgICB2YWx1ZSwgY29tcHV0ZWQ7XG4gICAgaWYgKGl0ZXJhdGVlID09IG51bGwgfHwgdHlwZW9mIGl0ZXJhdGVlID09ICdudW1iZXInICYmIHR5cGVvZiBvYmpbMF0gIT0gJ29iamVjdCcgJiYgb2JqICE9IG51bGwpIHtcbiAgICAgIG9iaiA9IGlzQXJyYXlMaWtlKG9iaikgPyBvYmogOiBfLnZhbHVlcyhvYmopO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IG9ialtpXTtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgPiByZXN1bHQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHYsIGluZGV4LCBsaXN0KSB7XG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodiwgaW5kZXgsIGxpc3QpO1xuICAgICAgICBpZiAoY29tcHV0ZWQgPiBsYXN0Q29tcHV0ZWQgfHwgY29tcHV0ZWQgPT09IC1JbmZpbml0eSAmJiByZXN1bHQgPT09IC1JbmZpbml0eSkge1xuICAgICAgICAgIHJlc3VsdCA9IHY7XG4gICAgICAgICAgbGFzdENvbXB1dGVkID0gY29tcHV0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFJldHVybiB0aGUgbWluaW11bSBlbGVtZW50IChvciBlbGVtZW50LWJhc2VkIGNvbXB1dGF0aW9uKS5cbiAgXy5taW4gPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlc3VsdCA9IEluZmluaXR5LCBsYXN0Q29tcHV0ZWQgPSBJbmZpbml0eSxcbiAgICAgICAgdmFsdWUsIGNvbXB1dGVkO1xuICAgIGlmIChpdGVyYXRlZSA9PSBudWxsIHx8IHR5cGVvZiBpdGVyYXRlZSA9PSAnbnVtYmVyJyAmJiB0eXBlb2Ygb2JqWzBdICE9ICdvYmplY3QnICYmIG9iaiAhPSBudWxsKSB7XG4gICAgICBvYmogPSBpc0FycmF5TGlrZShvYmopID8gb2JqIDogXy52YWx1ZXMob2JqKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBvYmoubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSBvYmpbaV07XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlIDwgcmVzdWx0KSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgICBfLmVhY2gob2JqLCBmdW5jdGlvbih2LCBpbmRleCwgbGlzdCkge1xuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHYsIGluZGV4LCBsaXN0KTtcbiAgICAgICAgaWYgKGNvbXB1dGVkIDwgbGFzdENvbXB1dGVkIHx8IGNvbXB1dGVkID09PSBJbmZpbml0eSAmJiByZXN1bHQgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmVzdWx0ID0gdjtcbiAgICAgICAgICBsYXN0Q29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gU2h1ZmZsZSBhIGNvbGxlY3Rpb24uXG4gIF8uc2h1ZmZsZSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBfLnNhbXBsZShvYmosIEluZmluaXR5KTtcbiAgfTtcblxuICAvLyBTYW1wbGUgKipuKiogcmFuZG9tIHZhbHVlcyBmcm9tIGEgY29sbGVjdGlvbiB1c2luZyB0aGUgbW9kZXJuIHZlcnNpb24gb2YgdGhlXG4gIC8vIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXLigJNZYXRlc19zaHVmZmxlKS5cbiAgLy8gSWYgKipuKiogaXMgbm90IHNwZWNpZmllZCwgcmV0dXJucyBhIHNpbmdsZSByYW5kb20gZWxlbWVudC5cbiAgLy8gVGhlIGludGVybmFsIGBndWFyZGAgYXJndW1lbnQgYWxsb3dzIGl0IHRvIHdvcmsgd2l0aCBgbWFwYC5cbiAgXy5zYW1wbGUgPSBmdW5jdGlvbihvYmosIG4sIGd1YXJkKSB7XG4gICAgaWYgKG4gPT0gbnVsbCB8fCBndWFyZCkge1xuICAgICAgaWYgKCFpc0FycmF5TGlrZShvYmopKSBvYmogPSBfLnZhbHVlcyhvYmopO1xuICAgICAgcmV0dXJuIG9ialtfLnJhbmRvbShvYmoubGVuZ3RoIC0gMSldO1xuICAgIH1cbiAgICB2YXIgc2FtcGxlID0gaXNBcnJheUxpa2Uob2JqKSA/IF8uY2xvbmUob2JqKSA6IF8udmFsdWVzKG9iaik7XG4gICAgdmFyIGxlbmd0aCA9IGdldExlbmd0aChzYW1wbGUpO1xuICAgIG4gPSBNYXRoLm1heChNYXRoLm1pbihuLCBsZW5ndGgpLCAwKTtcbiAgICB2YXIgbGFzdCA9IGxlbmd0aCAtIDE7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IG47IGluZGV4KyspIHtcbiAgICAgIHZhciByYW5kID0gXy5yYW5kb20oaW5kZXgsIGxhc3QpO1xuICAgICAgdmFyIHRlbXAgPSBzYW1wbGVbaW5kZXhdO1xuICAgICAgc2FtcGxlW2luZGV4XSA9IHNhbXBsZVtyYW5kXTtcbiAgICAgIHNhbXBsZVtyYW5kXSA9IHRlbXA7XG4gICAgfVxuICAgIHJldHVybiBzYW1wbGUuc2xpY2UoMCwgbik7XG4gIH07XG5cbiAgLy8gU29ydCB0aGUgb2JqZWN0J3MgdmFsdWVzIGJ5IGEgY3JpdGVyaW9uIHByb2R1Y2VkIGJ5IGFuIGl0ZXJhdGVlLlxuICBfLnNvcnRCeSA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHJldHVybiBfLnBsdWNrKF8ubWFwKG9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSwgbGlzdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBpbmRleDogaW5kZXgrKyxcbiAgICAgICAgY3JpdGVyaWE6IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGxpc3QpXG4gICAgICB9O1xuICAgIH0pLnNvcnQoZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgICAgIHZhciBhID0gbGVmdC5jcml0ZXJpYTtcbiAgICAgIHZhciBiID0gcmlnaHQuY3JpdGVyaWE7XG4gICAgICBpZiAoYSAhPT0gYikge1xuICAgICAgICBpZiAoYSA+IGIgfHwgYSA9PT0gdm9pZCAwKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKGEgPCBiIHx8IGIgPT09IHZvaWQgMCkgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxlZnQuaW5kZXggLSByaWdodC5pbmRleDtcbiAgICB9KSwgJ3ZhbHVlJyk7XG4gIH07XG5cbiAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBmb3IgYWdncmVnYXRlIFwiZ3JvdXAgYnlcIiBvcGVyYXRpb25zLlxuICB2YXIgZ3JvdXAgPSBmdW5jdGlvbihiZWhhdmlvciwgcGFydGl0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICAgIHZhciByZXN1bHQgPSBwYXJ0aXRpb24gPyBbW10sIFtdXSA6IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgICBfLmVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGtleSA9IGl0ZXJhdGVlKHZhbHVlLCBpbmRleCwgb2JqKTtcbiAgICAgICAgYmVoYXZpb3IocmVzdWx0LCB2YWx1ZSwga2V5KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9O1xuXG4gIC8vIEdyb3VwcyB0aGUgb2JqZWN0J3MgdmFsdWVzIGJ5IGEgY3JpdGVyaW9uLiBQYXNzIGVpdGhlciBhIHN0cmluZyBhdHRyaWJ1dGVcbiAgLy8gdG8gZ3JvdXAgYnksIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBjcml0ZXJpb24uXG4gIF8uZ3JvdXBCeSA9IGdyb3VwKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgIGlmIChoYXMocmVzdWx0LCBrZXkpKSByZXN1bHRba2V5XS5wdXNoKHZhbHVlKTsgZWxzZSByZXN1bHRba2V5XSA9IFt2YWx1ZV07XG4gIH0pO1xuXG4gIC8vIEluZGV4ZXMgdGhlIG9iamVjdCdzIHZhbHVlcyBieSBhIGNyaXRlcmlvbiwgc2ltaWxhciB0byBgZ3JvdXBCeWAsIGJ1dCBmb3JcbiAgLy8gd2hlbiB5b3Uga25vdyB0aGF0IHlvdXIgaW5kZXggdmFsdWVzIHdpbGwgYmUgdW5pcXVlLlxuICBfLmluZGV4QnkgPSBncm91cChmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICB9KTtcblxuICAvLyBDb3VudHMgaW5zdGFuY2VzIG9mIGFuIG9iamVjdCB0aGF0IGdyb3VwIGJ5IGEgY2VydGFpbiBjcml0ZXJpb24uIFBhc3NcbiAgLy8gZWl0aGVyIGEgc3RyaW5nIGF0dHJpYnV0ZSB0byBjb3VudCBieSwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlXG4gIC8vIGNyaXRlcmlvbi5cbiAgXy5jb3VudEJ5ID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgaWYgKGhhcyhyZXN1bHQsIGtleSkpIHJlc3VsdFtrZXldKys7IGVsc2UgcmVzdWx0W2tleV0gPSAxO1xuICB9KTtcblxuICB2YXIgcmVTdHJTeW1ib2wgPSAvW15cXHVkODAwLVxcdWRmZmZdfFtcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl18W1xcdWQ4MDAtXFx1ZGZmZl0vZztcbiAgLy8gU2FmZWx5IGNyZWF0ZSBhIHJlYWwsIGxpdmUgYXJyYXkgZnJvbSBhbnl0aGluZyBpdGVyYWJsZS5cbiAgXy50b0FycmF5ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFvYmopIHJldHVybiBbXTtcbiAgICBpZiAoXy5pc0FycmF5KG9iaikpIHJldHVybiBzbGljZS5jYWxsKG9iaik7XG4gICAgaWYgKF8uaXNTdHJpbmcob2JqKSkge1xuICAgICAgLy8gS2VlcCBzdXJyb2dhdGUgcGFpciBjaGFyYWN0ZXJzIHRvZ2V0aGVyXG4gICAgICByZXR1cm4gb2JqLm1hdGNoKHJlU3RyU3ltYm9sKTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXlMaWtlKG9iaikpIHJldHVybiBfLm1hcChvYmosIF8uaWRlbnRpdHkpO1xuICAgIHJldHVybiBfLnZhbHVlcyhvYmopO1xuICB9O1xuXG4gIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIG9iamVjdC5cbiAgXy5zaXplID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gMDtcbiAgICByZXR1cm4gaXNBcnJheUxpa2Uob2JqKSA/IG9iai5sZW5ndGggOiBfLmtleXMob2JqKS5sZW5ndGg7XG4gIH07XG5cbiAgLy8gU3BsaXQgYSBjb2xsZWN0aW9uIGludG8gdHdvIGFycmF5czogb25lIHdob3NlIGVsZW1lbnRzIGFsbCBzYXRpc2Z5IHRoZSBnaXZlblxuICAvLyBwcmVkaWNhdGUsIGFuZCBvbmUgd2hvc2UgZWxlbWVudHMgYWxsIGRvIG5vdCBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUuXG4gIF8ucGFydGl0aW9uID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwgcGFzcykge1xuICAgIHJlc3VsdFtwYXNzID8gMCA6IDFdLnB1c2godmFsdWUpO1xuICB9LCB0cnVlKTtcblxuICAvLyBBcnJheSBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gR2V0IHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFycmF5LiBQYXNzaW5nICoqbioqIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBOXG4gIC8vIHZhbHVlcyBpbiB0aGUgYXJyYXkuIEFsaWFzZWQgYXMgYGhlYWRgIGFuZCBgdGFrZWAuIFRoZSAqKmd1YXJkKiogY2hlY2tcbiAgLy8gYWxsb3dzIGl0IHRvIHdvcmsgd2l0aCBgXy5tYXBgLlxuICBfLmZpcnN0ID0gXy5oZWFkID0gXy50YWtlID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgaWYgKGFycmF5ID09IG51bGwgfHwgYXJyYXkubGVuZ3RoIDwgMSkgcmV0dXJuIG4gPT0gbnVsbCA/IHZvaWQgMCA6IFtdO1xuICAgIGlmIChuID09IG51bGwgfHwgZ3VhcmQpIHJldHVybiBhcnJheVswXTtcbiAgICByZXR1cm4gXy5pbml0aWFsKGFycmF5LCBhcnJheS5sZW5ndGggLSBuKTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGV2ZXJ5dGhpbmcgYnV0IHRoZSBsYXN0IGVudHJ5IG9mIHRoZSBhcnJheS4gRXNwZWNpYWxseSB1c2VmdWwgb25cbiAgLy8gdGhlIGFyZ3VtZW50cyBvYmplY3QuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gYWxsIHRoZSB2YWx1ZXMgaW5cbiAgLy8gdGhlIGFycmF5LCBleGNsdWRpbmcgdGhlIGxhc3QgTi5cbiAgXy5pbml0aWFsID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgcmV0dXJuIHNsaWNlLmNhbGwoYXJyYXksIDAsIE1hdGgubWF4KDAsIGFycmF5Lmxlbmd0aCAtIChuID09IG51bGwgfHwgZ3VhcmQgPyAxIDogbikpKTtcbiAgfTtcblxuICAvLyBHZXQgdGhlIGxhc3QgZWxlbWVudCBvZiBhbiBhcnJheS4gUGFzc2luZyAqKm4qKiB3aWxsIHJldHVybiB0aGUgbGFzdCBOXG4gIC8vIHZhbHVlcyBpbiB0aGUgYXJyYXkuXG4gIF8ubGFzdCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkge1xuICAgIGlmIChhcnJheSA9PSBudWxsIHx8IGFycmF5Lmxlbmd0aCA8IDEpIHJldHVybiBuID09IG51bGwgPyB2b2lkIDAgOiBbXTtcbiAgICBpZiAobiA9PSBudWxsIHx8IGd1YXJkKSByZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIF8ucmVzdChhcnJheSwgTWF0aC5tYXgoMCwgYXJyYXkubGVuZ3RoIC0gbikpO1xuICB9O1xuXG4gIC8vIFJldHVybnMgZXZlcnl0aGluZyBidXQgdGhlIGZpcnN0IGVudHJ5IG9mIHRoZSBhcnJheS4gQWxpYXNlZCBhcyBgdGFpbGAgYW5kIGBkcm9wYC5cbiAgLy8gRXNwZWNpYWxseSB1c2VmdWwgb24gdGhlIGFyZ3VtZW50cyBvYmplY3QuIFBhc3NpbmcgYW4gKipuKiogd2lsbCByZXR1cm5cbiAgLy8gdGhlIHJlc3QgTiB2YWx1ZXMgaW4gdGhlIGFycmF5LlxuICBfLnJlc3QgPSBfLnRhaWwgPSBfLmRyb3AgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICByZXR1cm4gc2xpY2UuY2FsbChhcnJheSwgbiA9PSBudWxsIHx8IGd1YXJkID8gMSA6IG4pO1xuICB9O1xuXG4gIC8vIFRyaW0gb3V0IGFsbCBmYWxzeSB2YWx1ZXMgZnJvbSBhbiBhcnJheS5cbiAgXy5jb21wYWN0ID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICByZXR1cm4gXy5maWx0ZXIoYXJyYXksIEJvb2xlYW4pO1xuICB9O1xuXG4gIC8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIGEgcmVjdXJzaXZlIGBmbGF0dGVuYCBmdW5jdGlvbi5cbiAgdmFyIGZsYXR0ZW4gPSBmdW5jdGlvbihpbnB1dCwgc2hhbGxvdywgc3RyaWN0LCBvdXRwdXQpIHtcbiAgICBvdXRwdXQgPSBvdXRwdXQgfHwgW107XG4gICAgdmFyIGlkeCA9IG91dHB1dC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGdldExlbmd0aChpbnB1dCk7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbHVlID0gaW5wdXRbaV07XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmIChfLmlzQXJyYXkodmFsdWUpIHx8IF8uaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgICAgICAvLyBGbGF0dGVuIGN1cnJlbnQgbGV2ZWwgb2YgYXJyYXkgb3IgYXJndW1lbnRzIG9iamVjdC5cbiAgICAgICAgaWYgKHNoYWxsb3cpIHtcbiAgICAgICAgICB2YXIgaiA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoaiA8IGxlbikgb3V0cHV0W2lkeCsrXSA9IHZhbHVlW2orK107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmxhdHRlbih2YWx1ZSwgc2hhbGxvdywgc3RyaWN0LCBvdXRwdXQpO1xuICAgICAgICAgIGlkeCA9IG91dHB1dC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCkge1xuICAgICAgICBvdXRwdXRbaWR4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH07XG5cbiAgLy8gRmxhdHRlbiBvdXQgYW4gYXJyYXksIGVpdGhlciByZWN1cnNpdmVseSAoYnkgZGVmYXVsdCksIG9yIGp1c3Qgb25lIGxldmVsLlxuICBfLmZsYXR0ZW4gPSBmdW5jdGlvbihhcnJheSwgc2hhbGxvdykge1xuICAgIHJldHVybiBmbGF0dGVuKGFycmF5LCBzaGFsbG93LCBmYWxzZSk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGEgdmVyc2lvbiBvZiB0aGUgYXJyYXkgdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZSBzcGVjaWZpZWQgdmFsdWUocykuXG4gIF8ud2l0aG91dCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oYXJyYXksIG90aGVyQXJyYXlzKSB7XG4gICAgcmV0dXJuIF8uZGlmZmVyZW5jZShhcnJheSwgb3RoZXJBcnJheXMpO1xuICB9KTtcblxuICAvLyBQcm9kdWNlIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiB0aGUgYXJyYXkuIElmIHRoZSBhcnJheSBoYXMgYWxyZWFkeVxuICAvLyBiZWVuIHNvcnRlZCwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiB1c2luZyBhIGZhc3RlciBhbGdvcml0aG0uXG4gIC8vIFRoZSBmYXN0ZXIgYWxnb3JpdGhtIHdpbGwgbm90IHdvcmsgd2l0aCBhbiBpdGVyYXRlZSBpZiB0aGUgaXRlcmF0ZWVcbiAgLy8gaXMgbm90IGEgb25lLXRvLW9uZSBmdW5jdGlvbiwgc28gcHJvdmlkaW5nIGFuIGl0ZXJhdGVlIHdpbGwgZGlzYWJsZVxuICAvLyB0aGUgZmFzdGVyIGFsZ29yaXRobS5cbiAgLy8gQWxpYXNlZCBhcyBgdW5pcXVlYC5cbiAgXy51bmlxID0gXy51bmlxdWUgPSBmdW5jdGlvbihhcnJheSwgaXNTb3J0ZWQsIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbihpc1NvcnRlZCkpIHtcbiAgICAgIGNvbnRleHQgPSBpdGVyYXRlZTtcbiAgICAgIGl0ZXJhdGVlID0gaXNTb3J0ZWQ7XG4gICAgICBpc1NvcnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaXRlcmF0ZWUgIT0gbnVsbCkgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBzZWVuID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGdldExlbmd0aChhcnJheSk7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaV0sXG4gICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlLCBpLCBhcnJheSkgOiB2YWx1ZTtcbiAgICAgIGlmIChpc1NvcnRlZCAmJiAhaXRlcmF0ZWUpIHtcbiAgICAgICAgaWYgKCFpIHx8IHNlZW4gIT09IGNvbXB1dGVkKSByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIHNlZW4gPSBjb21wdXRlZDtcbiAgICAgIH0gZWxzZSBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgaWYgKCFfLmNvbnRhaW5zKHNlZW4sIGNvbXB1dGVkKSkge1xuICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFfLmNvbnRhaW5zKHJlc3VsdCwgdmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBQcm9kdWNlIGFuIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHVuaW9uOiBlYWNoIGRpc3RpbmN0IGVsZW1lbnQgZnJvbSBhbGwgb2ZcbiAgLy8gdGhlIHBhc3NlZC1pbiBhcnJheXMuXG4gIF8udW5pb24gPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGFycmF5cykge1xuICAgIHJldHVybiBfLnVuaXEoZmxhdHRlbihhcnJheXMsIHRydWUsIHRydWUpKTtcbiAgfSk7XG5cbiAgLy8gUHJvZHVjZSBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGV2ZXJ5IGl0ZW0gc2hhcmVkIGJldHdlZW4gYWxsIHRoZVxuICAvLyBwYXNzZWQtaW4gYXJyYXlzLlxuICBfLmludGVyc2VjdGlvbiA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGFycmF5KTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IGFycmF5W2ldO1xuICAgICAgaWYgKF8uY29udGFpbnMocmVzdWx0LCBpdGVtKSkgY29udGludWU7XG4gICAgICB2YXIgajtcbiAgICAgIGZvciAoaiA9IDE7IGogPCBhcmdzTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKCFfLmNvbnRhaW5zKGFyZ3VtZW50c1tqXSwgaXRlbSkpIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGogPT09IGFyZ3NMZW5ndGgpIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFRha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvbmUgYXJyYXkgYW5kIGEgbnVtYmVyIG9mIG90aGVyIGFycmF5cy5cbiAgLy8gT25seSB0aGUgZWxlbWVudHMgcHJlc2VudCBpbiBqdXN0IHRoZSBmaXJzdCBhcnJheSB3aWxsIHJlbWFpbi5cbiAgXy5kaWZmZXJlbmNlID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihhcnJheSwgcmVzdCkge1xuICAgIHJlc3QgPSBmbGF0dGVuKHJlc3QsIHRydWUsIHRydWUpO1xuICAgIHJldHVybiBfLmZpbHRlcihhcnJheSwgZnVuY3Rpb24odmFsdWUpe1xuICAgICAgcmV0dXJuICFfLmNvbnRhaW5zKHJlc3QsIHZhbHVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gQ29tcGxlbWVudCBvZiBfLnppcC4gVW56aXAgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgYW5kIGdyb3Vwc1xuICAvLyBlYWNoIGFycmF5J3MgZWxlbWVudHMgb24gc2hhcmVkIGluZGljZXMuXG4gIF8udW56aXAgPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSAmJiBfLm1heChhcnJheSwgZ2V0TGVuZ3RoKS5sZW5ndGggfHwgMDtcbiAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHJlc3VsdFtpbmRleF0gPSBfLnBsdWNrKGFycmF5LCBpbmRleCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gWmlwIHRvZ2V0aGVyIG11bHRpcGxlIGxpc3RzIGludG8gYSBzaW5nbGUgYXJyYXkgLS0gZWxlbWVudHMgdGhhdCBzaGFyZVxuICAvLyBhbiBpbmRleCBnbyB0b2dldGhlci5cbiAgXy56aXAgPSByZXN0QXJndW1lbnRzKF8udW56aXApO1xuXG4gIC8vIENvbnZlcnRzIGxpc3RzIGludG8gb2JqZWN0cy4gUGFzcyBlaXRoZXIgYSBzaW5nbGUgYXJyYXkgb2YgYFtrZXksIHZhbHVlXWBcbiAgLy8gcGFpcnMsIG9yIHR3byBwYXJhbGxlbCBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIC0tIG9uZSBvZiBrZXlzLCBhbmQgb25lIG9mXG4gIC8vIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcy4gUGFzc2luZyBieSBwYWlycyBpcyB0aGUgcmV2ZXJzZSBvZiBfLnBhaXJzLlxuICBfLm9iamVjdCA9IGZ1bmN0aW9uKGxpc3QsIHZhbHVlcykge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGxpc3QpOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWx1ZXMpIHtcbiAgICAgICAgcmVzdWx0W2xpc3RbaV1dID0gdmFsdWVzW2ldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2xpc3RbaV1bMF1dID0gbGlzdFtpXVsxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBHZW5lcmF0b3IgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBmaW5kSW5kZXggYW5kIGZpbmRMYXN0SW5kZXggZnVuY3Rpb25zLlxuICB2YXIgY3JlYXRlUHJlZGljYXRlSW5kZXhGaW5kZXIgPSBmdW5jdGlvbihkaXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJyYXksIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICAgIHZhciBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpO1xuICAgICAgdmFyIGluZGV4ID0gZGlyID4gMCA/IDAgOiBsZW5ndGggLSAxO1xuICAgICAgZm9yICg7IGluZGV4ID49IDAgJiYgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IGRpcikge1xuICAgICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggb24gYW4gYXJyYXktbGlrZSB0aGF0IHBhc3NlcyBhIHByZWRpY2F0ZSB0ZXN0LlxuICBfLmZpbmRJbmRleCA9IGNyZWF0ZVByZWRpY2F0ZUluZGV4RmluZGVyKDEpO1xuICBfLmZpbmRMYXN0SW5kZXggPSBjcmVhdGVQcmVkaWNhdGVJbmRleEZpbmRlcigtMSk7XG5cbiAgLy8gVXNlIGEgY29tcGFyYXRvciBmdW5jdGlvbiB0byBmaWd1cmUgb3V0IHRoZSBzbWFsbGVzdCBpbmRleCBhdCB3aGljaFxuICAvLyBhbiBvYmplY3Qgc2hvdWxkIGJlIGluc2VydGVkIHNvIGFzIHRvIG1haW50YWluIG9yZGVyLiBVc2VzIGJpbmFyeSBzZWFyY2guXG4gIF8uc29ydGVkSW5kZXggPSBmdW5jdGlvbihhcnJheSwgb2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQsIDEpO1xuICAgIHZhciB2YWx1ZSA9IGl0ZXJhdGVlKG9iaik7XG4gICAgdmFyIGxvdyA9IDAsIGhpZ2ggPSBnZXRMZW5ndGgoYXJyYXkpO1xuICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICB2YXIgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVttaWRdKSA8IHZhbHVlKSBsb3cgPSBtaWQgKyAxOyBlbHNlIGhpZ2ggPSBtaWQ7XG4gICAgfVxuICAgIHJldHVybiBsb3c7XG4gIH07XG5cbiAgLy8gR2VuZXJhdG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgaW5kZXhPZiBhbmQgbGFzdEluZGV4T2YgZnVuY3Rpb25zLlxuICB2YXIgY3JlYXRlSW5kZXhGaW5kZXIgPSBmdW5jdGlvbihkaXIsIHByZWRpY2F0ZUZpbmQsIHNvcnRlZEluZGV4KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBpZHgpIHtcbiAgICAgIHZhciBpID0gMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGFycmF5KTtcbiAgICAgIGlmICh0eXBlb2YgaWR4ID09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChkaXIgPiAwKSB7XG4gICAgICAgICAgaSA9IGlkeCA+PSAwID8gaWR4IDogTWF0aC5tYXgoaWR4ICsgbGVuZ3RoLCBpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZW5ndGggPSBpZHggPj0gMCA/IE1hdGgubWluKGlkeCArIDEsIGxlbmd0aCkgOiBpZHggKyBsZW5ndGggKyAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNvcnRlZEluZGV4ICYmIGlkeCAmJiBsZW5ndGgpIHtcbiAgICAgICAgaWR4ID0gc29ydGVkSW5kZXgoYXJyYXksIGl0ZW0pO1xuICAgICAgICByZXR1cm4gYXJyYXlbaWR4XSA9PT0gaXRlbSA/IGlkeCA6IC0xO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0gIT09IGl0ZW0pIHtcbiAgICAgICAgaWR4ID0gcHJlZGljYXRlRmluZChzbGljZS5jYWxsKGFycmF5LCBpLCBsZW5ndGgpLCBfLmlzTmFOKTtcbiAgICAgICAgcmV0dXJuIGlkeCA+PSAwID8gaWR4ICsgaSA6IC0xO1xuICAgICAgfVxuICAgICAgZm9yIChpZHggPSBkaXIgPiAwID8gaSA6IGxlbmd0aCAtIDE7IGlkeCA+PSAwICYmIGlkeCA8IGxlbmd0aDsgaWR4ICs9IGRpcikge1xuICAgICAgICBpZiAoYXJyYXlbaWR4XSA9PT0gaXRlbSkgcmV0dXJuIGlkeDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYW4gaXRlbSBpbiBhbiBhcnJheSxcbiAgLy8gb3IgLTEgaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS5cbiAgLy8gSWYgdGhlIGFycmF5IGlzIGxhcmdlIGFuZCBhbHJlYWR5IGluIHNvcnQgb3JkZXIsIHBhc3MgYHRydWVgXG4gIC8vIGZvciAqKmlzU29ydGVkKiogdG8gdXNlIGJpbmFyeSBzZWFyY2guXG4gIF8uaW5kZXhPZiA9IGNyZWF0ZUluZGV4RmluZGVyKDEsIF8uZmluZEluZGV4LCBfLnNvcnRlZEluZGV4KTtcbiAgXy5sYXN0SW5kZXhPZiA9IGNyZWF0ZUluZGV4RmluZGVyKC0xLCBfLmZpbmRMYXN0SW5kZXgpO1xuXG4gIC8vIEdlbmVyYXRlIGFuIGludGVnZXIgQXJyYXkgY29udGFpbmluZyBhbiBhcml0aG1ldGljIHByb2dyZXNzaW9uLiBBIHBvcnQgb2ZcbiAgLy8gdGhlIG5hdGl2ZSBQeXRob24gYHJhbmdlKClgIGZ1bmN0aW9uLiBTZWVcbiAgLy8gW3RoZSBQeXRob24gZG9jdW1lbnRhdGlvbl0oaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L2Z1bmN0aW9ucy5odG1sI3JhbmdlKS5cbiAgXy5yYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7XG4gICAgaWYgKHN0b3AgPT0gbnVsbCkge1xuICAgICAgc3RvcCA9IHN0YXJ0IHx8IDA7XG4gICAgICBzdGFydCA9IDA7XG4gICAgfVxuICAgIGlmICghc3RlcCkge1xuICAgICAgc3RlcCA9IHN0b3AgPCBzdGFydCA/IC0xIDogMTtcbiAgICB9XG5cbiAgICB2YXIgbGVuZ3RoID0gTWF0aC5tYXgoTWF0aC5jZWlsKChzdG9wIC0gc3RhcnQpIC8gc3RlcCksIDApO1xuICAgIHZhciByYW5nZSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrLCBzdGFydCArPSBzdGVwKSB7XG4gICAgICByYW5nZVtpZHhdID0gc3RhcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmdlO1xuICB9O1xuXG4gIC8vIENodW5rIGEgc2luZ2xlIGFycmF5IGludG8gbXVsdGlwbGUgYXJyYXlzLCBlYWNoIGNvbnRhaW5pbmcgYGNvdW50YCBvciBmZXdlclxuICAvLyBpdGVtcy5cbiAgXy5jaHVuayA9IGZ1bmN0aW9uKGFycmF5LCBjb3VudCkge1xuICAgIGlmIChjb3VudCA9PSBudWxsIHx8IGNvdW50IDwgMSkgcmV0dXJuIFtdO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0LnB1c2goc2xpY2UuY2FsbChhcnJheSwgaSwgaSArPSBjb3VudCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIEZ1bmN0aW9uIChhaGVtKSBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiBhcyBhIGNvbnN0cnVjdG9yXG4gIC8vIG9yIGEgbm9ybWFsIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgdmFyIGV4ZWN1dGVCb3VuZCA9IGZ1bmN0aW9uKHNvdXJjZUZ1bmMsIGJvdW5kRnVuYywgY29udGV4dCwgY2FsbGluZ0NvbnRleHQsIGFyZ3MpIHtcbiAgICBpZiAoIShjYWxsaW5nQ29udGV4dCBpbnN0YW5jZW9mIGJvdW5kRnVuYykpIHJldHVybiBzb3VyY2VGdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIHZhciBzZWxmID0gYmFzZUNyZWF0ZShzb3VyY2VGdW5jLnByb3RvdHlwZSk7XG4gICAgdmFyIHJlc3VsdCA9IHNvdXJjZUZ1bmMuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgaWYgKF8uaXNPYmplY3QocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvLyBDcmVhdGUgYSBmdW5jdGlvbiBib3VuZCB0byBhIGdpdmVuIG9iamVjdCAoYXNzaWduaW5nIGB0aGlzYCwgYW5kIGFyZ3VtZW50cyxcbiAgLy8gb3B0aW9uYWxseSkuIERlbGVnYXRlcyB0byAqKkVDTUFTY3JpcHQgNSoqJ3MgbmF0aXZlIGBGdW5jdGlvbi5iaW5kYCBpZlxuICAvLyBhdmFpbGFibGUuXG4gIF8uYmluZCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oZnVuYywgY29udGV4dCwgYXJncykge1xuICAgIGlmICghXy5pc0Z1bmN0aW9uKGZ1bmMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdCaW5kIG11c3QgYmUgY2FsbGVkIG9uIGEgZnVuY3Rpb24nKTtcbiAgICB2YXIgYm91bmQgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGNhbGxBcmdzKSB7XG4gICAgICByZXR1cm4gZXhlY3V0ZUJvdW5kKGZ1bmMsIGJvdW5kLCBjb250ZXh0LCB0aGlzLCBhcmdzLmNvbmNhdChjYWxsQXJncykpO1xuICAgIH0pO1xuICAgIHJldHVybiBib3VuZDtcbiAgfSk7XG5cbiAgLy8gUGFydGlhbGx5IGFwcGx5IGEgZnVuY3Rpb24gYnkgY3JlYXRpbmcgYSB2ZXJzaW9uIHRoYXQgaGFzIGhhZCBzb21lIG9mIGl0c1xuICAvLyBhcmd1bWVudHMgcHJlLWZpbGxlZCwgd2l0aG91dCBjaGFuZ2luZyBpdHMgZHluYW1pYyBgdGhpc2AgY29udGV4dC4gXyBhY3RzXG4gIC8vIGFzIGEgcGxhY2Vob2xkZXIgYnkgZGVmYXVsdCwgYWxsb3dpbmcgYW55IGNvbWJpbmF0aW9uIG9mIGFyZ3VtZW50cyB0byBiZVxuICAvLyBwcmUtZmlsbGVkLiBTZXQgYF8ucGFydGlhbC5wbGFjZWhvbGRlcmAgZm9yIGEgY3VzdG9tIHBsYWNlaG9sZGVyIGFyZ3VtZW50LlxuICBfLnBhcnRpYWwgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGZ1bmMsIGJvdW5kQXJncykge1xuICAgIHZhciBwbGFjZWhvbGRlciA9IF8ucGFydGlhbC5wbGFjZWhvbGRlcjtcbiAgICB2YXIgYm91bmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwb3NpdGlvbiA9IDAsIGxlbmd0aCA9IGJvdW5kQXJncy5sZW5ndGg7XG4gICAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFyZ3NbaV0gPSBib3VuZEFyZ3NbaV0gPT09IHBsYWNlaG9sZGVyID8gYXJndW1lbnRzW3Bvc2l0aW9uKytdIDogYm91bmRBcmdzW2ldO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgYXJndW1lbnRzLmxlbmd0aCkgYXJncy5wdXNoKGFyZ3VtZW50c1twb3NpdGlvbisrXSk7XG4gICAgICByZXR1cm4gZXhlY3V0ZUJvdW5kKGZ1bmMsIGJvdW5kLCB0aGlzLCB0aGlzLCBhcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiBib3VuZDtcbiAgfSk7XG5cbiAgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyID0gXztcblxuICAvLyBCaW5kIGEgbnVtYmVyIG9mIGFuIG9iamVjdCdzIG1ldGhvZHMgdG8gdGhhdCBvYmplY3QuIFJlbWFpbmluZyBhcmd1bWVudHNcbiAgLy8gYXJlIHRoZSBtZXRob2QgbmFtZXMgdG8gYmUgYm91bmQuIFVzZWZ1bCBmb3IgZW5zdXJpbmcgdGhhdCBhbGwgY2FsbGJhY2tzXG4gIC8vIGRlZmluZWQgb24gYW4gb2JqZWN0IGJlbG9uZyB0byBpdC5cbiAgXy5iaW5kQWxsID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihvYmosIGtleXMpIHtcbiAgICBrZXlzID0gZmxhdHRlbihrZXlzLCBmYWxzZSwgZmFsc2UpO1xuICAgIHZhciBpbmRleCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChpbmRleCA8IDEpIHRocm93IG5ldyBFcnJvcignYmluZEFsbCBtdXN0IGJlIHBhc3NlZCBmdW5jdGlvbiBuYW1lcycpO1xuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICBvYmpba2V5XSA9IF8uYmluZChvYmpba2V5XSwgb2JqKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE1lbW9pemUgYW4gZXhwZW5zaXZlIGZ1bmN0aW9uIGJ5IHN0b3JpbmcgaXRzIHJlc3VsdHMuXG4gIF8ubWVtb2l6ZSA9IGZ1bmN0aW9uKGZ1bmMsIGhhc2hlcikge1xuICAgIHZhciBtZW1vaXplID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICB2YXIgY2FjaGUgPSBtZW1vaXplLmNhY2hlO1xuICAgICAgdmFyIGFkZHJlc3MgPSAnJyArIChoYXNoZXIgPyBoYXNoZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGtleSk7XG4gICAgICBpZiAoIWhhcyhjYWNoZSwgYWRkcmVzcykpIGNhY2hlW2FkZHJlc3NdID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIGNhY2hlW2FkZHJlc3NdO1xuICAgIH07XG4gICAgbWVtb2l6ZS5jYWNoZSA9IHt9O1xuICAgIHJldHVybiBtZW1vaXplO1xuICB9O1xuXG4gIC8vIERlbGF5cyBhIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgYW5kIHRoZW4gY2FsbHNcbiAgLy8gaXQgd2l0aCB0aGUgYXJndW1lbnRzIHN1cHBsaWVkLlxuICBfLmRlbGF5ID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZnVuYy5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9LCB3YWl0KTtcbiAgfSk7XG5cbiAgLy8gRGVmZXJzIGEgZnVuY3Rpb24sIHNjaGVkdWxpbmcgaXQgdG8gcnVuIGFmdGVyIHRoZSBjdXJyZW50IGNhbGwgc3RhY2sgaGFzXG4gIC8vIGNsZWFyZWQuXG4gIF8uZGVmZXIgPSBfLnBhcnRpYWwoXy5kZWxheSwgXywgMSk7XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uLCB0aGF0LCB3aGVuIGludm9rZWQsIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYXQgbW9zdCBvbmNlXG4gIC8vIGR1cmluZyBhIGdpdmVuIHdpbmRvdyBvZiB0aW1lLiBOb3JtYWxseSwgdGhlIHRocm90dGxlZCBmdW5jdGlvbiB3aWxsIHJ1blxuICAvLyBhcyBtdWNoIGFzIGl0IGNhbiwgd2l0aG91dCBldmVyIGdvaW5nIG1vcmUgdGhhbiBvbmNlIHBlciBgd2FpdGAgZHVyYXRpb247XG4gIC8vIGJ1dCBpZiB5b3UnZCBsaWtlIHRvIGRpc2FibGUgdGhlIGV4ZWN1dGlvbiBvbiB0aGUgbGVhZGluZyBlZGdlLCBwYXNzXG4gIC8vIGB7bGVhZGluZzogZmFsc2V9YC4gVG8gZGlzYWJsZSBleGVjdXRpb24gb24gdGhlIHRyYWlsaW5nIGVkZ2UsIGRpdHRvLlxuICBfLnRocm90dGxlID0gZnVuY3Rpb24oZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgIHZhciB0aW1lb3V0LCBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gICAgdmFyIHByZXZpb3VzID0gMDtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcblxuICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcHJldmlvdXMgPSBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlID8gMCA6IF8ubm93KCk7XG4gICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICBpZiAoIXRpbWVvdXQpIGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgICB9O1xuXG4gICAgdmFyIHRocm90dGxlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5vdyA9IF8ubm93KCk7XG4gICAgICBpZiAoIXByZXZpb3VzICYmIG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UpIHByZXZpb3VzID0gbm93O1xuICAgICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAobm93IC0gcHJldmlvdXMpO1xuICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgaWYgKHJlbWFpbmluZyA8PSAwIHx8IHJlbWFpbmluZyA+IHdhaXQpIHtcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcHJldmlvdXMgPSBub3c7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICghdGltZW91dCAmJiBvcHRpb25zLnRyYWlsaW5nICE9PSBmYWxzZSkge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHRocm90dGxlZC5jYW5jZWwgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHByZXZpb3VzID0gMDtcbiAgICAgIHRpbWVvdXQgPSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgfTtcblxuICAgIHJldHVybiB0aHJvdHRsZWQ7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uLCB0aGF0LCBhcyBsb25nIGFzIGl0IGNvbnRpbnVlcyB0byBiZSBpbnZva2VkLCB3aWxsIG5vdFxuICAvLyBiZSB0cmlnZ2VyZWQuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciBpdCBzdG9wcyBiZWluZyBjYWxsZWQgZm9yXG4gIC8vIE4gbWlsbGlzZWNvbmRzLiBJZiBgaW1tZWRpYXRlYCBpcyBwYXNzZWQsIHRyaWdnZXIgdGhlIGZ1bmN0aW9uIG9uIHRoZVxuICAvLyBsZWFkaW5nIGVkZ2UsIGluc3RlYWQgb2YgdGhlIHRyYWlsaW5nLlxuICBfLmRlYm91bmNlID0gZnVuY3Rpb24oZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgdmFyIHRpbWVvdXQsIHJlc3VsdDtcblxuICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uKGNvbnRleHQsIGFyZ3MpIHtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgaWYgKGFyZ3MpIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfTtcblxuICAgIHZhciBkZWJvdW5jZWQgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIGlmICh0aW1lb3V0KSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICAgIHZhciBjYWxsTm93ID0gIXRpbWVvdXQ7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0KTtcbiAgICAgICAgaWYgKGNhbGxOb3cpIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lb3V0ID0gXy5kZWxheShsYXRlciwgd2FpdCwgdGhpcywgYXJncyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBkZWJvdW5jZWQuY2FuY2VsID0gZnVuY3Rpb24oKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgfTtcblxuICAvLyBSZXR1cm5zIHRoZSBmaXJzdCBmdW5jdGlvbiBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIHNlY29uZCxcbiAgLy8gYWxsb3dpbmcgeW91IHRvIGFkanVzdCBhcmd1bWVudHMsIHJ1biBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIsIGFuZFxuICAvLyBjb25kaXRpb25hbGx5IGV4ZWN1dGUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLlxuICBfLndyYXAgPSBmdW5jdGlvbihmdW5jLCB3cmFwcGVyKSB7XG4gICAgcmV0dXJuIF8ucGFydGlhbCh3cmFwcGVyLCBmdW5jKTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgbmVnYXRlZCB2ZXJzaW9uIG9mIHRoZSBwYXNzZWQtaW4gcHJlZGljYXRlLlxuICBfLm5lZ2F0ZSA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAhcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgYSBsaXN0IG9mIGZ1bmN0aW9ucywgZWFjaFxuICAvLyBjb25zdW1pbmcgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCBmb2xsb3dzLlxuICBfLmNvbXBvc2UgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgc3RhcnQgPSBhcmdzLmxlbmd0aCAtIDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGkgPSBzdGFydDtcbiAgICAgIHZhciByZXN1bHQgPSBhcmdzW3N0YXJ0XS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgd2hpbGUgKGktLSkgcmVzdWx0ID0gYXJnc1tpXS5jYWxsKHRoaXMsIHJlc3VsdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIG9uIGFuZCBhZnRlciB0aGUgTnRoIGNhbGwuXG4gIF8uYWZ0ZXIgPSBmdW5jdGlvbih0aW1lcywgZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgtLXRpbWVzIDwgMSkge1xuICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgdGhlIE50aCBjYWxsLlxuICBfLmJlZm9yZSA9IGZ1bmN0aW9uKHRpbWVzLCBmdW5jKSB7XG4gICAgdmFyIG1lbW87XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGltZXMgPiAwKSB7XG4gICAgICAgIG1lbW8gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICBpZiAodGltZXMgPD0gMSkgZnVuYyA9IG51bGw7XG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYXQgbW9zdCBvbmUgdGltZSwgbm8gbWF0dGVyIGhvd1xuICAvLyBvZnRlbiB5b3UgY2FsbCBpdC4gVXNlZnVsIGZvciBsYXp5IGluaXRpYWxpemF0aW9uLlxuICBfLm9uY2UgPSBfLnBhcnRpYWwoXy5iZWZvcmUsIDIpO1xuXG4gIF8ucmVzdEFyZ3VtZW50cyA9IHJlc3RBcmd1bWVudHM7XG5cbiAgLy8gT2JqZWN0IEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gS2V5cyBpbiBJRSA8IDkgdGhhdCB3b24ndCBiZSBpdGVyYXRlZCBieSBgZm9yIGtleSBpbiAuLi5gIGFuZCB0aHVzIG1pc3NlZC5cbiAgdmFyIGhhc0VudW1CdWcgPSAhe3RvU3RyaW5nOiBudWxsfS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgndG9TdHJpbmcnKTtcbiAgdmFyIG5vbkVudW1lcmFibGVQcm9wcyA9IFsndmFsdWVPZicsICdpc1Byb3RvdHlwZU9mJywgJ3RvU3RyaW5nJyxcbiAgICAncHJvcGVydHlJc0VudW1lcmFibGUnLCAnaGFzT3duUHJvcGVydHknLCAndG9Mb2NhbGVTdHJpbmcnXTtcblxuICB2YXIgY29sbGVjdE5vbkVudW1Qcm9wcyA9IGZ1bmN0aW9uKG9iaiwga2V5cykge1xuICAgIHZhciBub25FbnVtSWR4ID0gbm9uRW51bWVyYWJsZVByb3BzLmxlbmd0aDtcbiAgICB2YXIgY29uc3RydWN0b3IgPSBvYmouY29uc3RydWN0b3I7XG4gICAgdmFyIHByb3RvID0gXy5pc0Z1bmN0aW9uKGNvbnN0cnVjdG9yKSAmJiBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgfHwgT2JqUHJvdG87XG5cbiAgICAvLyBDb25zdHJ1Y3RvciBpcyBhIHNwZWNpYWwgY2FzZS5cbiAgICB2YXIgcHJvcCA9ICdjb25zdHJ1Y3Rvcic7XG4gICAgaWYgKGhhcyhvYmosIHByb3ApICYmICFfLmNvbnRhaW5zKGtleXMsIHByb3ApKSBrZXlzLnB1c2gocHJvcCk7XG5cbiAgICB3aGlsZSAobm9uRW51bUlkeC0tKSB7XG4gICAgICBwcm9wID0gbm9uRW51bWVyYWJsZVByb3BzW25vbkVudW1JZHhdO1xuICAgICAgaWYgKHByb3AgaW4gb2JqICYmIG9ialtwcm9wXSAhPT0gcHJvdG9bcHJvcF0gJiYgIV8uY29udGFpbnMoa2V5cywgcHJvcCkpIHtcbiAgICAgICAga2V5cy5wdXNoKHByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBSZXRyaWV2ZSB0aGUgbmFtZXMgb2YgYW4gb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gIC8vIERlbGVnYXRlcyB0byAqKkVDTUFTY3JpcHQgNSoqJ3MgbmF0aXZlIGBPYmplY3Qua2V5c2AuXG4gIF8ua2V5cyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmICghXy5pc09iamVjdChvYmopKSByZXR1cm4gW107XG4gICAgaWYgKG5hdGl2ZUtleXMpIHJldHVybiBuYXRpdmVLZXlzKG9iaik7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSBpZiAoaGFzKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gICAgLy8gQWhlbSwgSUUgPCA5LlxuICAgIGlmIChoYXNFbnVtQnVnKSBjb2xsZWN0Tm9uRW51bVByb3BzKG9iaiwga2V5cyk7XG4gICAgcmV0dXJuIGtleXM7XG4gIH07XG5cbiAgLy8gUmV0cmlldmUgYWxsIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbiBvYmplY3QuXG4gIF8uYWxsS2V5cyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmICghXy5pc09iamVjdChvYmopKSByZXR1cm4gW107XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSBrZXlzLnB1c2goa2V5KTtcbiAgICAvLyBBaGVtLCBJRSA8IDkuXG4gICAgaWYgKGhhc0VudW1CdWcpIGNvbGxlY3ROb25FbnVtUHJvcHMob2JqLCBrZXlzKTtcbiAgICByZXR1cm4ga2V5cztcbiAgfTtcblxuICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWVzIG9mIGFuIG9iamVjdCdzIHByb3BlcnRpZXMuXG4gIF8udmFsdWVzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIGtleXMgPSBfLmtleXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIHZhbHVlcyA9IEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzW2ldID0gb2JqW2tleXNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9O1xuXG4gIC8vIFJldHVybnMgdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGl0ZXJhdGVlIHRvIGVhY2ggZWxlbWVudCBvZiB0aGUgb2JqZWN0LlxuICAvLyBJbiBjb250cmFzdCB0byBfLm1hcCBpdCByZXR1cm5zIGFuIG9iamVjdC5cbiAgXy5tYXBPYmplY3QgPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0ga2V5cy5sZW5ndGgsXG4gICAgICAgIHJlc3VsdHMgPSB7fTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgY3VycmVudEtleSA9IGtleXNbaW5kZXhdO1xuICAgICAgcmVzdWx0c1tjdXJyZW50S2V5XSA9IGl0ZXJhdGVlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG5cbiAgLy8gQ29udmVydCBhbiBvYmplY3QgaW50byBhIGxpc3Qgb2YgYFtrZXksIHZhbHVlXWAgcGFpcnMuXG4gIC8vIFRoZSBvcHBvc2l0ZSBvZiBfLm9iamVjdC5cbiAgXy5wYWlycyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBwYWlycyA9IEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgcGFpcnNbaV0gPSBba2V5c1tpXSwgb2JqW2tleXNbaV1dXTtcbiAgICB9XG4gICAgcmV0dXJuIHBhaXJzO1xuICB9O1xuXG4gIC8vIEludmVydCB0aGUga2V5cyBhbmQgdmFsdWVzIG9mIGFuIG9iamVjdC4gVGhlIHZhbHVlcyBtdXN0IGJlIHNlcmlhbGl6YWJsZS5cbiAgXy5pbnZlcnQgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgdmFyIGtleXMgPSBfLmtleXMob2JqKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W29ialtrZXlzW2ldXV0gPSBrZXlzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFJldHVybiBhIHNvcnRlZCBsaXN0IG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBhdmFpbGFibGUgb24gdGhlIG9iamVjdC5cbiAgLy8gQWxpYXNlZCBhcyBgbWV0aG9kc2AuXG4gIF8uZnVuY3Rpb25zID0gXy5tZXRob2RzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKF8uaXNGdW5jdGlvbihvYmpba2V5XSkpIG5hbWVzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzLnNvcnQoKTtcbiAgfTtcblxuICAvLyBBbiBpbnRlcm5hbCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYXNzaWduZXIgZnVuY3Rpb25zLlxuICB2YXIgY3JlYXRlQXNzaWduZXIgPSBmdW5jdGlvbihrZXlzRnVuYywgZGVmYXVsdHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGlmIChkZWZhdWx0cykgb2JqID0gT2JqZWN0KG9iaik7XG4gICAgICBpZiAobGVuZ3RoIDwgMiB8fCBvYmogPT0gbnVsbCkgcmV0dXJuIG9iajtcbiAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF0sXG4gICAgICAgICAgICBrZXlzID0ga2V5c0Z1bmMoc291cmNlKSxcbiAgICAgICAgICAgIGwgPSBrZXlzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoIWRlZmF1bHRzIHx8IG9ialtrZXldID09PSB2b2lkIDApIG9ialtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgfTtcblxuICAvLyBFeHRlbmQgYSBnaXZlbiBvYmplY3Qgd2l0aCBhbGwgdGhlIHByb3BlcnRpZXMgaW4gcGFzc2VkLWluIG9iamVjdChzKS5cbiAgXy5leHRlbmQgPSBjcmVhdGVBc3NpZ25lcihfLmFsbEtleXMpO1xuXG4gIC8vIEFzc2lnbnMgYSBnaXZlbiBvYmplY3Qgd2l0aCBhbGwgdGhlIG93biBwcm9wZXJ0aWVzIGluIHRoZSBwYXNzZWQtaW4gb2JqZWN0KHMpLlxuICAvLyAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnbilcbiAgXy5leHRlbmRPd24gPSBfLmFzc2lnbiA9IGNyZWF0ZUFzc2lnbmVyKF8ua2V5cyk7XG5cbiAgLy8gUmV0dXJucyB0aGUgZmlyc3Qga2V5IG9uIGFuIG9iamVjdCB0aGF0IHBhc3NlcyBhIHByZWRpY2F0ZSB0ZXN0LlxuICBfLmZpbmRLZXkgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHByZWRpY2F0ZSA9IGNiKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSBfLmtleXMob2JqKSwga2V5O1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKHByZWRpY2F0ZShvYmpba2V5XSwga2V5LCBvYmopKSByZXR1cm4ga2V5O1xuICAgIH1cbiAgfTtcblxuICAvLyBJbnRlcm5hbCBwaWNrIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYG9iamAgaGFzIGtleSBga2V5YC5cbiAgdmFyIGtleUluT2JqID0gZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqKSB7XG4gICAgcmV0dXJuIGtleSBpbiBvYmo7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgb2JqZWN0IG9ubHkgY29udGFpbmluZyB0aGUgd2hpdGVsaXN0ZWQgcHJvcGVydGllcy5cbiAgXy5waWNrID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihvYmosIGtleXMpIHtcbiAgICB2YXIgcmVzdWx0ID0ge30sIGl0ZXJhdGVlID0ga2V5c1swXTtcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiByZXN1bHQ7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihpdGVyYXRlZSkpIHtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIGl0ZXJhdGVlID0gb3B0aW1pemVDYihpdGVyYXRlZSwga2V5c1sxXSk7XG4gICAgICBrZXlzID0gXy5hbGxLZXlzKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJhdGVlID0ga2V5SW5PYmo7XG4gICAgICBrZXlzID0gZmxhdHRlbihrZXlzLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgb2JqID0gT2JqZWN0KG9iaik7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhciB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgaWYgKGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iaikpIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xuXG4gIC8vIFJldHVybiBhIGNvcHkgb2YgdGhlIG9iamVjdCB3aXRob3V0IHRoZSBibGFja2xpc3RlZCBwcm9wZXJ0aWVzLlxuICBfLm9taXQgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKG9iaiwga2V5cykge1xuICAgIHZhciBpdGVyYXRlZSA9IGtleXNbMF0sIGNvbnRleHQ7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihpdGVyYXRlZSkpIHtcbiAgICAgIGl0ZXJhdGVlID0gXy5uZWdhdGUoaXRlcmF0ZWUpO1xuICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkgY29udGV4dCA9IGtleXNbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleXMgPSBfLm1hcChmbGF0dGVuKGtleXMsIGZhbHNlLCBmYWxzZSksIFN0cmluZyk7XG4gICAgICBpdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuICFfLmNvbnRhaW5zKGtleXMsIGtleSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gXy5waWNrKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpO1xuICB9KTtcblxuICAvLyBGaWxsIGluIGEgZ2l2ZW4gb2JqZWN0IHdpdGggZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICBfLmRlZmF1bHRzID0gY3JlYXRlQXNzaWduZXIoXy5hbGxLZXlzLCB0cnVlKTtcblxuICAvLyBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhlIGdpdmVuIHByb3RvdHlwZSBvYmplY3QuXG4gIC8vIElmIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgcHJvdmlkZWQgdGhlbiB0aGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4gIC8vIGNyZWF0ZWQgb2JqZWN0LlxuICBfLmNyZWF0ZSA9IGZ1bmN0aW9uKHByb3RvdHlwZSwgcHJvcHMpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgIGlmIChwcm9wcykgXy5leHRlbmRPd24ocmVzdWx0LCBwcm9wcyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBDcmVhdGUgYSAoc2hhbGxvdy1jbG9uZWQpIGR1cGxpY2F0ZSBvZiBhbiBvYmplY3QuXG4gIF8uY2xvbmUgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgICByZXR1cm4gXy5pc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IF8uZXh0ZW5kKHt9LCBvYmopO1xuICB9O1xuXG4gIC8vIEludm9rZXMgaW50ZXJjZXB0b3Igd2l0aCB0aGUgb2JqLCBhbmQgdGhlbiByZXR1cm5zIG9iai5cbiAgLy8gVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInRhcCBpbnRvXCIgYSBtZXRob2QgY2hhaW4sIGluXG4gIC8vIG9yZGVyIHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiBpbnRlcm1lZGlhdGUgcmVzdWx0cyB3aXRoaW4gdGhlIGNoYWluLlxuICBfLnRhcCA9IGZ1bmN0aW9uKG9iaiwgaW50ZXJjZXB0b3IpIHtcbiAgICBpbnRlcmNlcHRvcihvYmopO1xuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBzZXQgb2YgYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8uaXNNYXRjaCA9IGZ1bmN0aW9uKG9iamVjdCwgYXR0cnMpIHtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhhdHRycyksIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChvYmplY3QgPT0gbnVsbCkgcmV0dXJuICFsZW5ndGg7XG4gICAgdmFyIG9iaiA9IE9iamVjdChvYmplY3QpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKGF0dHJzW2tleV0gIT09IG9ialtrZXldIHx8ICEoa2V5IGluIG9iaikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cblxuICAvLyBJbnRlcm5hbCByZWN1cnNpdmUgY29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgYGlzRXF1YWxgLlxuICB2YXIgZXEsIGRlZXBFcTtcbiAgZXEgPSBmdW5jdGlvbihhLCBiLCBhU3RhY2ssIGJTdGFjaykge1xuICAgIC8vIElkZW50aWNhbCBvYmplY3RzIGFyZSBlcXVhbC4gYDAgPT09IC0wYCwgYnV0IHRoZXkgYXJlbid0IGlkZW50aWNhbC5cbiAgICAvLyBTZWUgdGhlIFtIYXJtb255IGBlZ2FsYCBwcm9wb3NhbF0oaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9aGFybW9ueTplZ2FsKS5cbiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIGEgIT09IDAgfHwgMSAvIGEgPT09IDEgLyBiO1xuICAgIC8vIGBudWxsYCBvciBgdW5kZWZpbmVkYCBvbmx5IGVxdWFsIHRvIGl0c2VsZiAoc3RyaWN0IGNvbXBhcmlzb24pLlxuICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYE5hTmBzIGFyZSBlcXVpdmFsZW50LCBidXQgbm9uLXJlZmxleGl2ZS5cbiAgICBpZiAoYSAhPT0gYSkgcmV0dXJuIGIgIT09IGI7XG4gICAgLy8gRXhoYXVzdCBwcmltaXRpdmUgY2hlY2tzXG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgYTtcbiAgICBpZiAodHlwZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiAhPSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBkZWVwRXEoYSwgYiwgYVN0YWNrLCBiU3RhY2spO1xuICB9O1xuXG4gIC8vIEludGVybmFsIHJlY3Vyc2l2ZSBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciBgaXNFcXVhbGAuXG4gIGRlZXBFcSA9IGZ1bmN0aW9uKGEsIGIsIGFTdGFjaywgYlN0YWNrKSB7XG4gICAgLy8gVW53cmFwIGFueSB3cmFwcGVkIG9iamVjdHMuXG4gICAgaWYgKGEgaW5zdGFuY2VvZiBfKSBhID0gYS5fd3JhcHBlZDtcbiAgICBpZiAoYiBpbnN0YW5jZW9mIF8pIGIgPSBiLl93cmFwcGVkO1xuICAgIC8vIENvbXBhcmUgYFtbQ2xhc3NdXWAgbmFtZXMuXG4gICAgdmFyIGNsYXNzTmFtZSA9IHRvU3RyaW5nLmNhbGwoYSk7XG4gICAgaWYgKGNsYXNzTmFtZSAhPT0gdG9TdHJpbmcuY2FsbChiKSkgcmV0dXJuIGZhbHNlO1xuICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7XG4gICAgICAvLyBTdHJpbmdzLCBudW1iZXJzLCByZWd1bGFyIGV4cHJlc3Npb25zLCBkYXRlcywgYW5kIGJvb2xlYW5zIGFyZSBjb21wYXJlZCBieSB2YWx1ZS5cbiAgICAgIGNhc2UgJ1tvYmplY3QgUmVnRXhwXSc6XG4gICAgICAvLyBSZWdFeHBzIGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MgZm9yIGNvbXBhcmlzb24gKE5vdGU6ICcnICsgL2EvaSA9PT0gJy9hL2knKVxuICAgICAgY2FzZSAnW29iamVjdCBTdHJpbmddJzpcbiAgICAgICAgLy8gUHJpbWl0aXZlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBvYmplY3Qgd3JhcHBlcnMgYXJlIGVxdWl2YWxlbnQ7IHRodXMsIGBcIjVcImAgaXNcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byBgbmV3IFN0cmluZyhcIjVcIilgLlxuICAgICAgICByZXR1cm4gJycgKyBhID09PSAnJyArIGI7XG4gICAgICBjYXNlICdbb2JqZWN0IE51bWJlcl0nOlxuICAgICAgICAvLyBgTmFOYHMgYXJlIGVxdWl2YWxlbnQsIGJ1dCBub24tcmVmbGV4aXZlLlxuICAgICAgICAvLyBPYmplY3QoTmFOKSBpcyBlcXVpdmFsZW50IHRvIE5hTi5cbiAgICAgICAgaWYgKCthICE9PSArYSkgcmV0dXJuICtiICE9PSArYjtcbiAgICAgICAgLy8gQW4gYGVnYWxgIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkIGZvciBvdGhlciBudW1lcmljIHZhbHVlcy5cbiAgICAgICAgcmV0dXJuICthID09PSAwID8gMSAvICthID09PSAxIC8gYiA6ICthID09PSArYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgRGF0ZV0nOlxuICAgICAgY2FzZSAnW29iamVjdCBCb29sZWFuXSc6XG4gICAgICAgIC8vIENvZXJjZSBkYXRlcyBhbmQgYm9vbGVhbnMgdG8gbnVtZXJpYyBwcmltaXRpdmUgdmFsdWVzLiBEYXRlcyBhcmUgY29tcGFyZWQgYnkgdGhlaXJcbiAgICAgICAgLy8gbWlsbGlzZWNvbmQgcmVwcmVzZW50YXRpb25zLiBOb3RlIHRoYXQgaW52YWxpZCBkYXRlcyB3aXRoIG1pbGxpc2Vjb25kIHJlcHJlc2VudGF0aW9uc1xuICAgICAgICAvLyBvZiBgTmFOYCBhcmUgbm90IGVxdWl2YWxlbnQuXG4gICAgICAgIHJldHVybiArYSA9PT0gK2I7XG4gICAgICBjYXNlICdbb2JqZWN0IFN5bWJvbF0nOlxuICAgICAgICByZXR1cm4gU3ltYm9sUHJvdG8udmFsdWVPZi5jYWxsKGEpID09PSBTeW1ib2xQcm90by52YWx1ZU9mLmNhbGwoYik7XG4gICAgfVxuXG4gICAgdmFyIGFyZUFycmF5cyA9IGNsYXNzTmFtZSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICBpZiAoIWFyZUFycmF5cykge1xuICAgICAgaWYgKHR5cGVvZiBhICE9ICdvYmplY3QnIHx8IHR5cGVvZiBiICE9ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIE9iamVjdHMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1aXZhbGVudCwgYnV0IGBPYmplY3RgcyBvciBgQXJyYXlgc1xuICAgICAgLy8gZnJvbSBkaWZmZXJlbnQgZnJhbWVzIGFyZS5cbiAgICAgIHZhciBhQ3RvciA9IGEuY29uc3RydWN0b3IsIGJDdG9yID0gYi5jb25zdHJ1Y3RvcjtcbiAgICAgIGlmIChhQ3RvciAhPT0gYkN0b3IgJiYgIShfLmlzRnVuY3Rpb24oYUN0b3IpICYmIGFDdG9yIGluc3RhbmNlb2YgYUN0b3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmlzRnVuY3Rpb24oYkN0b3IpICYmIGJDdG9yIGluc3RhbmNlb2YgYkN0b3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICYmICgnY29uc3RydWN0b3InIGluIGEgJiYgJ2NvbnN0cnVjdG9yJyBpbiBiKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEFzc3VtZSBlcXVhbGl0eSBmb3IgY3ljbGljIHN0cnVjdHVyZXMuIFRoZSBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBjeWNsaWNcbiAgICAvLyBzdHJ1Y3R1cmVzIGlzIGFkYXB0ZWQgZnJvbSBFUyA1LjEgc2VjdGlvbiAxNS4xMi4zLCBhYnN0cmFjdCBvcGVyYXRpb24gYEpPYC5cblxuICAgIC8vIEluaXRpYWxpemluZyBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAvLyBJdCdzIGRvbmUgaGVyZSBzaW5jZSB3ZSBvbmx5IG5lZWQgdGhlbSBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIGNvbXBhcmlzb24uXG4gICAgYVN0YWNrID0gYVN0YWNrIHx8IFtdO1xuICAgIGJTdGFjayA9IGJTdGFjayB8fCBbXTtcbiAgICB2YXIgbGVuZ3RoID0gYVN0YWNrLmxlbmd0aDtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIC8vIExpbmVhciBzZWFyY2guIFBlcmZvcm1hbmNlIGlzIGludmVyc2VseSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZlxuICAgICAgLy8gdW5pcXVlIG5lc3RlZCBzdHJ1Y3R1cmVzLlxuICAgICAgaWYgKGFTdGFja1tsZW5ndGhdID09PSBhKSByZXR1cm4gYlN0YWNrW2xlbmd0aF0gPT09IGI7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBmaXJzdCBvYmplY3QgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgIGFTdGFjay5wdXNoKGEpO1xuICAgIGJTdGFjay5wdXNoKGIpO1xuXG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIGFuZCBhcnJheXMuXG4gICAgaWYgKGFyZUFycmF5cykge1xuICAgICAgLy8gQ29tcGFyZSBhcnJheSBsZW5ndGhzIHRvIGRldGVybWluZSBpZiBhIGRlZXAgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnkuXG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBEZWVwIGNvbXBhcmUgdGhlIGNvbnRlbnRzLCBpZ25vcmluZyBub24tbnVtZXJpYyBwcm9wZXJ0aWVzLlxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGlmICghZXEoYVtsZW5ndGhdLCBiW2xlbmd0aF0sIGFTdGFjaywgYlN0YWNrKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWVwIGNvbXBhcmUgb2JqZWN0cy5cbiAgICAgIHZhciBrZXlzID0gXy5rZXlzKGEpLCBrZXk7XG4gICAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICAgIC8vIEVuc3VyZSB0aGF0IGJvdGggb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBwcm9wZXJ0aWVzIGJlZm9yZSBjb21wYXJpbmcgZGVlcCBlcXVhbGl0eS5cbiAgICAgIGlmIChfLmtleXMoYikubGVuZ3RoICE9PSBsZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICAvLyBEZWVwIGNvbXBhcmUgZWFjaCBtZW1iZXJcbiAgICAgICAga2V5ID0ga2V5c1tsZW5ndGhdO1xuICAgICAgICBpZiAoIShoYXMoYiwga2V5KSAmJiBlcShhW2tleV0sIGJba2V5XSwgYVN0YWNrLCBiU3RhY2spKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IG9iamVjdCBmcm9tIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICBhU3RhY2sucG9wKCk7XG4gICAgYlN0YWNrLnBvcCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8vIFBlcmZvcm0gYSBkZWVwIGNvbXBhcmlzb24gdG8gY2hlY2sgaWYgdHdvIG9iamVjdHMgYXJlIGVxdWFsLlxuICBfLmlzRXF1YWwgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGVxKGEsIGIpO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gYXJyYXksIHN0cmluZywgb3Igb2JqZWN0IGVtcHR5P1xuICAvLyBBbiBcImVtcHR5XCIgb2JqZWN0IGhhcyBubyBlbnVtZXJhYmxlIG93bi1wcm9wZXJ0aWVzLlxuICBfLmlzRW1wdHkgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0FycmF5TGlrZShvYmopICYmIChfLmlzQXJyYXkob2JqKSB8fCBfLmlzU3RyaW5nKG9iaikgfHwgXy5pc0FyZ3VtZW50cyhvYmopKSkgcmV0dXJuIG9iai5sZW5ndGggPT09IDA7XG4gICAgcmV0dXJuIF8ua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhbHVlIGEgRE9NIGVsZW1lbnQ/XG4gIF8uaXNFbGVtZW50ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuICEhKG9iaiAmJiBvYmoubm9kZVR5cGUgPT09IDEpO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFsdWUgYW4gYXJyYXk/XG4gIC8vIERlbGVnYXRlcyB0byBFQ01BNSdzIG5hdGl2ZSBBcnJheS5pc0FycmF5XG4gIF8uaXNBcnJheSA9IG5hdGl2ZUlzQXJyYXkgfHwgZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhcmlhYmxlIGFuIG9iamVjdD9cbiAgXy5pc09iamVjdCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIG9iajtcbiAgICByZXR1cm4gdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlID09PSAnb2JqZWN0JyAmJiAhIW9iajtcbiAgfTtcblxuICAvLyBBZGQgc29tZSBpc1R5cGUgbWV0aG9kczogaXNBcmd1bWVudHMsIGlzRnVuY3Rpb24sIGlzU3RyaW5nLCBpc051bWJlciwgaXNEYXRlLCBpc1JlZ0V4cCwgaXNFcnJvciwgaXNNYXAsIGlzV2Vha01hcCwgaXNTZXQsIGlzV2Vha1NldC5cbiAgXy5lYWNoKFsnQXJndW1lbnRzJywgJ0Z1bmN0aW9uJywgJ1N0cmluZycsICdOdW1iZXInLCAnRGF0ZScsICdSZWdFeHAnLCAnRXJyb3InLCAnU3ltYm9sJywgJ01hcCcsICdXZWFrTWFwJywgJ1NldCcsICdXZWFrU2V0J10sIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBfWydpcycgKyBuYW1lXSA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIG5hbWUgKyAnXSc7XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gRGVmaW5lIGEgZmFsbGJhY2sgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIGluIGJyb3dzZXJzIChhaGVtLCBJRSA8IDkpLCB3aGVyZVxuICAvLyB0aGVyZSBpc24ndCBhbnkgaW5zcGVjdGFibGUgXCJBcmd1bWVudHNcIiB0eXBlLlxuICBpZiAoIV8uaXNBcmd1bWVudHMoYXJndW1lbnRzKSkge1xuICAgIF8uaXNBcmd1bWVudHMgPSBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBoYXMob2JqLCAnY2FsbGVlJyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIE9wdGltaXplIGBpc0Z1bmN0aW9uYCBpZiBhcHByb3ByaWF0ZS4gV29yayBhcm91bmQgc29tZSB0eXBlb2YgYnVncyBpbiBvbGQgdjgsXG4gIC8vIElFIDExICgjMTYyMSksIFNhZmFyaSA4ICgjMTkyOSksIGFuZCBQaGFudG9tSlMgKCMyMjM2KS5cbiAgdmFyIG5vZGVsaXN0ID0gcm9vdC5kb2N1bWVudCAmJiByb290LmRvY3VtZW50LmNoaWxkTm9kZXM7XG4gIGlmICh0eXBlb2YgLy4vICE9ICdmdW5jdGlvbicgJiYgdHlwZW9mIEludDhBcnJheSAhPSAnb2JqZWN0JyAmJiB0eXBlb2Ygbm9kZWxpc3QgIT0gJ2Z1bmN0aW9uJykge1xuICAgIF8uaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT0gJ2Z1bmN0aW9uJyB8fCBmYWxzZTtcbiAgICB9O1xuICB9XG5cbiAgLy8gSXMgYSBnaXZlbiBvYmplY3QgYSBmaW5pdGUgbnVtYmVyP1xuICBfLmlzRmluaXRlID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuICFfLmlzU3ltYm9sKG9iaikgJiYgaXNGaW5pdGUob2JqKSAmJiAhaXNOYU4ocGFyc2VGbG9hdChvYmopKTtcbiAgfTtcblxuICAvLyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYE5hTmA/XG4gIF8uaXNOYU4gPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gXy5pc051bWJlcihvYmopICYmIGlzTmFOKG9iaik7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBhIGJvb2xlYW4/XG4gIF8uaXNCb29sZWFuID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gdHJ1ZSB8fCBvYmogPT09IGZhbHNlIHx8IHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQm9vbGVhbl0nO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFsdWUgZXF1YWwgdG8gbnVsbD9cbiAgXy5pc051bGwgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSBudWxsO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFyaWFibGUgdW5kZWZpbmVkP1xuICBfLmlzVW5kZWZpbmVkID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gdm9pZCAwO1xuICB9O1xuXG4gIC8vIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBjaGVja2luZyBpZiBhbiBvYmplY3QgaGFzIGEgZ2l2ZW4gcHJvcGVydHkgZGlyZWN0bHlcbiAgLy8gb24gaXRzZWxmIChpbiBvdGhlciB3b3Jkcywgbm90IG9uIGEgcHJvdG90eXBlKS5cbiAgXy5oYXMgPSBmdW5jdGlvbihvYmosIHBhdGgpIHtcbiAgICBpZiAoIV8uaXNBcnJheShwYXRoKSkge1xuICAgICAgcmV0dXJuIGhhcyhvYmosIHBhdGgpO1xuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IHBhdGhbaV07XG4gICAgICBpZiAob2JqID09IG51bGwgfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gISFsZW5ndGg7XG4gIH07XG5cbiAgLy8gVXRpbGl0eSBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBSdW4gVW5kZXJzY29yZS5qcyBpbiAqbm9Db25mbGljdCogbW9kZSwgcmV0dXJuaW5nIHRoZSBgX2AgdmFyaWFibGUgdG8gaXRzXG4gIC8vIHByZXZpb3VzIG93bmVyLiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdC5cbiAgXy5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgcm9vdC5fID0gcHJldmlvdXNVbmRlcnNjb3JlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEtlZXAgdGhlIGlkZW50aXR5IGZ1bmN0aW9uIGFyb3VuZCBmb3IgZGVmYXVsdCBpdGVyYXRlZXMuXG4gIF8uaWRlbnRpdHkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICAvLyBQcmVkaWNhdGUtZ2VuZXJhdGluZyBmdW5jdGlvbnMuIE9mdGVuIHVzZWZ1bCBvdXRzaWRlIG9mIFVuZGVyc2NvcmUuXG4gIF8uY29uc3RhbnQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICB9O1xuXG4gIF8ubm9vcCA9IGZ1bmN0aW9uKCl7fTtcblxuICAvLyBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBwYXNzZWQgYW4gb2JqZWN0LCB3aWxsIHRyYXZlcnNlIHRoYXQgb2JqZWN04oCZc1xuICAvLyBwcm9wZXJ0aWVzIGRvd24gdGhlIGdpdmVuIGBwYXRoYCwgc3BlY2lmaWVkIGFzIGFuIGFycmF5IG9mIGtleXMgb3IgaW5kZXhlcy5cbiAgXy5wcm9wZXJ0eSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICBpZiAoIV8uaXNBcnJheShwYXRoKSkge1xuICAgICAgcmV0dXJuIHNoYWxsb3dQcm9wZXJ0eShwYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIGRlZXBHZXQob2JqLCBwYXRoKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIGZvciBhIGdpdmVuIG9iamVjdCB0aGF0IHJldHVybnMgYSBnaXZlbiBwcm9wZXJ0eS5cbiAgXy5wcm9wZXJ0eU9mID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKXt9O1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgcmV0dXJuICFfLmlzQXJyYXkocGF0aCkgPyBvYmpbcGF0aF0gOiBkZWVwR2V0KG9iaiwgcGF0aCk7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgcHJlZGljYXRlIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBzZXQgb2ZcbiAgLy8gYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8ubWF0Y2hlciA9IF8ubWF0Y2hlcyA9IGZ1bmN0aW9uKGF0dHJzKSB7XG4gICAgYXR0cnMgPSBfLmV4dGVuZE93bih7fSwgYXR0cnMpO1xuICAgIHJldHVybiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBfLmlzTWF0Y2gob2JqLCBhdHRycyk7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSdW4gYSBmdW5jdGlvbiAqKm4qKiB0aW1lcy5cbiAgXy50aW1lcyA9IGZ1bmN0aW9uKG4sIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgdmFyIGFjY3VtID0gQXJyYXkoTWF0aC5tYXgoMCwgbikpO1xuICAgIGl0ZXJhdGVlID0gb3B0aW1pemVDYihpdGVyYXRlZSwgY29udGV4dCwgMSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIGFjY3VtW2ldID0gaXRlcmF0ZWUoaSk7XG4gICAgcmV0dXJuIGFjY3VtO1xuICB9O1xuXG4gIC8vIFJldHVybiBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKGluY2x1c2l2ZSkuXG4gIF8ucmFuZG9tID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICBpZiAobWF4ID09IG51bGwpIHtcbiAgICAgIG1heCA9IG1pbjtcbiAgICAgIG1pbiA9IDA7XG4gICAgfVxuICAgIHJldHVybiBtaW4gKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpO1xuICB9O1xuXG4gIC8vIEEgKHBvc3NpYmx5IGZhc3Rlcikgd2F5IHRvIGdldCB0aGUgY3VycmVudCB0aW1lc3RhbXAgYXMgYW4gaW50ZWdlci5cbiAgXy5ub3cgPSBEYXRlLm5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH07XG5cbiAgLy8gTGlzdCBvZiBIVE1MIGVudGl0aWVzIGZvciBlc2NhcGluZy5cbiAgdmFyIGVzY2FwZU1hcCA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmI3gyNzsnLFxuICAgICdgJzogJyYjeDYwOydcbiAgfTtcbiAgdmFyIHVuZXNjYXBlTWFwID0gXy5pbnZlcnQoZXNjYXBlTWFwKTtcblxuICAvLyBGdW5jdGlvbnMgZm9yIGVzY2FwaW5nIGFuZCB1bmVzY2FwaW5nIHN0cmluZ3MgdG8vZnJvbSBIVE1MIGludGVycG9sYXRpb24uXG4gIHZhciBjcmVhdGVFc2NhcGVyID0gZnVuY3Rpb24obWFwKSB7XG4gICAgdmFyIGVzY2FwZXIgPSBmdW5jdGlvbihtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hcFttYXRjaF07XG4gICAgfTtcbiAgICAvLyBSZWdleGVzIGZvciBpZGVudGlmeWluZyBhIGtleSB0aGF0IG5lZWRzIHRvIGJlIGVzY2FwZWQuXG4gICAgdmFyIHNvdXJjZSA9ICcoPzonICsgXy5rZXlzKG1hcCkuam9pbignfCcpICsgJyknO1xuICAgIHZhciB0ZXN0UmVnZXhwID0gUmVnRXhwKHNvdXJjZSk7XG4gICAgdmFyIHJlcGxhY2VSZWdleHAgPSBSZWdFeHAoc291cmNlLCAnZycpO1xuICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHN0cmluZyA9PSBudWxsID8gJycgOiAnJyArIHN0cmluZztcbiAgICAgIHJldHVybiB0ZXN0UmVnZXhwLnRlc3Qoc3RyaW5nKSA/IHN0cmluZy5yZXBsYWNlKHJlcGxhY2VSZWdleHAsIGVzY2FwZXIpIDogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIF8uZXNjYXBlID0gY3JlYXRlRXNjYXBlcihlc2NhcGVNYXApO1xuICBfLnVuZXNjYXBlID0gY3JlYXRlRXNjYXBlcih1bmVzY2FwZU1hcCk7XG5cbiAgLy8gVHJhdmVyc2VzIHRoZSBjaGlsZHJlbiBvZiBgb2JqYCBhbG9uZyBgcGF0aGAuIElmIGEgY2hpbGQgaXMgYSBmdW5jdGlvbiwgaXRcbiAgLy8gaXMgaW52b2tlZCB3aXRoIGl0cyBwYXJlbnQgYXMgY29udGV4dC4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpbmFsXG4gIC8vIGNoaWxkLCBvciBgZmFsbGJhY2tgIGlmIGFueSBjaGlsZCBpcyB1bmRlZmluZWQuXG4gIF8ucmVzdWx0ID0gZnVuY3Rpb24ob2JqLCBwYXRoLCBmYWxsYmFjaykge1xuICAgIGlmICghXy5pc0FycmF5KHBhdGgpKSBwYXRoID0gW3BhdGhdO1xuICAgIHZhciBsZW5ndGggPSBwYXRoLmxlbmd0aDtcbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgcmV0dXJuIF8uaXNGdW5jdGlvbihmYWxsYmFjaykgPyBmYWxsYmFjay5jYWxsKG9iaikgOiBmYWxsYmFjaztcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBvYmogPT0gbnVsbCA/IHZvaWQgMCA6IG9ialtwYXRoW2ldXTtcbiAgICAgIGlmIChwcm9wID09PSB2b2lkIDApIHtcbiAgICAgICAgcHJvcCA9IGZhbGxiYWNrO1xuICAgICAgICBpID0gbGVuZ3RoOyAvLyBFbnN1cmUgd2UgZG9uJ3QgY29udGludWUgaXRlcmF0aW5nLlxuICAgICAgfVxuICAgICAgb2JqID0gXy5pc0Z1bmN0aW9uKHByb3ApID8gcHJvcC5jYWxsKG9iaikgOiBwcm9wO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9O1xuXG4gIC8vIEdlbmVyYXRlIGEgdW5pcXVlIGludGVnZXIgaWQgKHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSBjbGllbnQgc2Vzc2lvbikuXG4gIC8vIFVzZWZ1bCBmb3IgdGVtcG9yYXJ5IERPTSBpZHMuXG4gIHZhciBpZENvdW50ZXIgPSAwO1xuICBfLnVuaXF1ZUlkID0gZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIGlkID0gKytpZENvdW50ZXIgKyAnJztcbiAgICByZXR1cm4gcHJlZml4ID8gcHJlZml4ICsgaWQgOiBpZDtcbiAgfTtcblxuICAvLyBCeSBkZWZhdWx0LCBVbmRlcnNjb3JlIHVzZXMgRVJCLXN0eWxlIHRlbXBsYXRlIGRlbGltaXRlcnMsIGNoYW5nZSB0aGVcbiAgLy8gZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLlxuICBfLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG4gICAgZXZhbHVhdGU6IC88JShbXFxzXFxTXSs/KSU+L2csXG4gICAgaW50ZXJwb2xhdGU6IC88JT0oW1xcc1xcU10rPyklPi9nLFxuICAgIGVzY2FwZTogLzwlLShbXFxzXFxTXSs/KSU+L2dcbiAgfTtcblxuICAvLyBXaGVuIGN1c3RvbWl6aW5nIGB0ZW1wbGF0ZVNldHRpbmdzYCwgaWYgeW91IGRvbid0IHdhbnQgdG8gZGVmaW5lIGFuXG4gIC8vIGludGVycG9sYXRpb24sIGV2YWx1YXRpb24gb3IgZXNjYXBpbmcgcmVnZXgsIHdlIG5lZWQgb25lIHRoYXQgaXNcbiAgLy8gZ3VhcmFudGVlZCBub3QgdG8gbWF0Y2guXG4gIHZhciBub01hdGNoID0gLyguKV4vO1xuXG4gIC8vIENlcnRhaW4gY2hhcmFjdGVycyBuZWVkIHRvIGJlIGVzY2FwZWQgc28gdGhhdCB0aGV5IGNhbiBiZSBwdXQgaW50byBhXG4gIC8vIHN0cmluZyBsaXRlcmFsLlxuICB2YXIgZXNjYXBlcyA9IHtcbiAgICBcIidcIjogXCInXCIsXG4gICAgJ1xcXFwnOiAnXFxcXCcsXG4gICAgJ1xccic6ICdyJyxcbiAgICAnXFxuJzogJ24nLFxuICAgICdcXHUyMDI4JzogJ3UyMDI4JyxcbiAgICAnXFx1MjAyOSc6ICd1MjAyOSdcbiAgfTtcblxuICB2YXIgZXNjYXBlUmVnRXhwID0gL1xcXFx8J3xcXHJ8XFxufFxcdTIwMjh8XFx1MjAyOS9nO1xuXG4gIHZhciBlc2NhcGVDaGFyID0gZnVuY3Rpb24obWF0Y2gpIHtcbiAgICByZXR1cm4gJ1xcXFwnICsgZXNjYXBlc1ttYXRjaF07XG4gIH07XG5cbiAgLy8gSmF2YVNjcmlwdCBtaWNyby10ZW1wbGF0aW5nLCBzaW1pbGFyIHRvIEpvaG4gUmVzaWcncyBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gVW5kZXJzY29yZSB0ZW1wbGF0aW5nIGhhbmRsZXMgYXJiaXRyYXJ5IGRlbGltaXRlcnMsIHByZXNlcnZlcyB3aGl0ZXNwYWNlLFxuICAvLyBhbmQgY29ycmVjdGx5IGVzY2FwZXMgcXVvdGVzIHdpdGhpbiBpbnRlcnBvbGF0ZWQgY29kZS5cbiAgLy8gTkI6IGBvbGRTZXR0aW5nc2Agb25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICBfLnRlbXBsYXRlID0gZnVuY3Rpb24odGV4dCwgc2V0dGluZ3MsIG9sZFNldHRpbmdzKSB7XG4gICAgaWYgKCFzZXR0aW5ncyAmJiBvbGRTZXR0aW5ncykgc2V0dGluZ3MgPSBvbGRTZXR0aW5ncztcbiAgICBzZXR0aW5ncyA9IF8uZGVmYXVsdHMoe30sIHNldHRpbmdzLCBfLnRlbXBsYXRlU2V0dGluZ3MpO1xuXG4gICAgLy8gQ29tYmluZSBkZWxpbWl0ZXJzIGludG8gb25lIHJlZ3VsYXIgZXhwcmVzc2lvbiB2aWEgYWx0ZXJuYXRpb24uXG4gICAgdmFyIG1hdGNoZXIgPSBSZWdFeHAoW1xuICAgICAgKHNldHRpbmdzLmVzY2FwZSB8fCBub01hdGNoKS5zb3VyY2UsXG4gICAgICAoc2V0dGluZ3MuaW50ZXJwb2xhdGUgfHwgbm9NYXRjaCkuc291cmNlLFxuICAgICAgKHNldHRpbmdzLmV2YWx1YXRlIHx8IG5vTWF0Y2gpLnNvdXJjZVxuICAgIF0uam9pbignfCcpICsgJ3wkJywgJ2cnKTtcblxuICAgIC8vIENvbXBpbGUgdGhlIHRlbXBsYXRlIHNvdXJjZSwgZXNjYXBpbmcgc3RyaW5nIGxpdGVyYWxzIGFwcHJvcHJpYXRlbHkuXG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgc291cmNlID0gXCJfX3ArPSdcIjtcbiAgICB0ZXh0LnJlcGxhY2UobWF0Y2hlciwgZnVuY3Rpb24obWF0Y2gsIGVzY2FwZSwgaW50ZXJwb2xhdGUsIGV2YWx1YXRlLCBvZmZzZXQpIHtcbiAgICAgIHNvdXJjZSArPSB0ZXh0LnNsaWNlKGluZGV4LCBvZmZzZXQpLnJlcGxhY2UoZXNjYXBlUmVnRXhwLCBlc2NhcGVDaGFyKTtcbiAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoO1xuXG4gICAgICBpZiAoZXNjYXBlKSB7XG4gICAgICAgIHNvdXJjZSArPSBcIicrXFxuKChfX3Q9KFwiICsgZXNjYXBlICsgXCIpKT09bnVsbD8nJzpfLmVzY2FwZShfX3QpKStcXG4nXCI7XG4gICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRlKSB7XG4gICAgICAgIHNvdXJjZSArPSBcIicrXFxuKChfX3Q9KFwiICsgaW50ZXJwb2xhdGUgKyBcIikpPT1udWxsPycnOl9fdCkrXFxuJ1wiO1xuICAgICAgfSBlbHNlIGlmIChldmFsdWF0ZSkge1xuICAgICAgICBzb3VyY2UgKz0gXCInO1xcblwiICsgZXZhbHVhdGUgKyBcIlxcbl9fcCs9J1wiO1xuICAgICAgfVxuXG4gICAgICAvLyBBZG9iZSBWTXMgbmVlZCB0aGUgbWF0Y2ggcmV0dXJuZWQgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvZmZzZXQuXG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG4gICAgc291cmNlICs9IFwiJztcXG5cIjtcblxuICAgIC8vIElmIGEgdmFyaWFibGUgaXMgbm90IHNwZWNpZmllZCwgcGxhY2UgZGF0YSB2YWx1ZXMgaW4gbG9jYWwgc2NvcGUuXG4gICAgaWYgKCFzZXR0aW5ncy52YXJpYWJsZSkgc291cmNlID0gJ3dpdGgob2JqfHx7fSl7XFxuJyArIHNvdXJjZSArICd9XFxuJztcblxuICAgIHNvdXJjZSA9IFwidmFyIF9fdCxfX3A9JycsX19qPUFycmF5LnByb3RvdHlwZS5qb2luLFwiICtcbiAgICAgIFwicHJpbnQ9ZnVuY3Rpb24oKXtfX3ArPV9fai5jYWxsKGFyZ3VtZW50cywnJyk7fTtcXG5cIiArXG4gICAgICBzb3VyY2UgKyAncmV0dXJuIF9fcDtcXG4nO1xuXG4gICAgdmFyIHJlbmRlcjtcbiAgICB0cnkge1xuICAgICAgcmVuZGVyID0gbmV3IEZ1bmN0aW9uKHNldHRpbmdzLnZhcmlhYmxlIHx8ICdvYmonLCAnXycsIHNvdXJjZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZS5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHZhciB0ZW1wbGF0ZSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHJldHVybiByZW5kZXIuY2FsbCh0aGlzLCBkYXRhLCBfKTtcbiAgICB9O1xuXG4gICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgc291cmNlIGFzIGEgY29udmVuaWVuY2UgZm9yIHByZWNvbXBpbGF0aW9uLlxuICAgIHZhciBhcmd1bWVudCA9IHNldHRpbmdzLnZhcmlhYmxlIHx8ICdvYmonO1xuICAgIHRlbXBsYXRlLnNvdXJjZSA9ICdmdW5jdGlvbignICsgYXJndW1lbnQgKyAnKXtcXG4nICsgc291cmNlICsgJ30nO1xuXG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9O1xuXG4gIC8vIEFkZCBhIFwiY2hhaW5cIiBmdW5jdGlvbi4gU3RhcnQgY2hhaW5pbmcgYSB3cmFwcGVkIFVuZGVyc2NvcmUgb2JqZWN0LlxuICBfLmNoYWluID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIGluc3RhbmNlID0gXyhvYmopO1xuICAgIGluc3RhbmNlLl9jaGFpbiA9IHRydWU7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xuXG4gIC8vIE9PUFxuICAvLyAtLS0tLS0tLS0tLS0tLS1cbiAgLy8gSWYgVW5kZXJzY29yZSBpcyBjYWxsZWQgYXMgYSBmdW5jdGlvbiwgaXQgcmV0dXJucyBhIHdyYXBwZWQgb2JqZWN0IHRoYXRcbiAgLy8gY2FuIGJlIHVzZWQgT08tc3R5bGUuIFRoaXMgd3JhcHBlciBob2xkcyBhbHRlcmVkIHZlcnNpb25zIG9mIGFsbCB0aGVcbiAgLy8gdW5kZXJzY29yZSBmdW5jdGlvbnMuIFdyYXBwZWQgb2JqZWN0cyBtYXkgYmUgY2hhaW5lZC5cblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY29udGludWUgY2hhaW5pbmcgaW50ZXJtZWRpYXRlIHJlc3VsdHMuXG4gIHZhciBjaGFpblJlc3VsdCA9IGZ1bmN0aW9uKGluc3RhbmNlLCBvYmopIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuX2NoYWluID8gXyhvYmopLmNoYWluKCkgOiBvYmo7XG4gIH07XG5cbiAgLy8gQWRkIHlvdXIgb3duIGN1c3RvbSBmdW5jdGlvbnMgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0LlxuICBfLm1peGluID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgXy5lYWNoKF8uZnVuY3Rpb25zKG9iaiksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gX1tuYW1lXSA9IG9ialtuYW1lXTtcbiAgICAgIF8ucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gW3RoaXMuX3dyYXBwZWRdO1xuICAgICAgICBwdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiBjaGFpblJlc3VsdCh0aGlzLCBmdW5jLmFwcGx5KF8sIGFyZ3MpKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIF87XG4gIH07XG5cbiAgLy8gQWRkIGFsbCBvZiB0aGUgVW5kZXJzY29yZSBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXIgb2JqZWN0LlxuICBfLm1peGluKF8pO1xuXG4gIC8vIEFkZCBhbGwgbXV0YXRvciBBcnJheSBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXIuXG4gIF8uZWFjaChbJ3BvcCcsICdwdXNoJywgJ3JldmVyc2UnLCAnc2hpZnQnLCAnc29ydCcsICdzcGxpY2UnLCAndW5zaGlmdCddLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIG1ldGhvZCA9IEFycmF5UHJvdG9bbmFtZV07XG4gICAgXy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvYmogPSB0aGlzLl93cmFwcGVkO1xuICAgICAgbWV0aG9kLmFwcGx5KG9iaiwgYXJndW1lbnRzKTtcbiAgICAgIGlmICgobmFtZSA9PT0gJ3NoaWZ0JyB8fCBuYW1lID09PSAnc3BsaWNlJykgJiYgb2JqLmxlbmd0aCA9PT0gMCkgZGVsZXRlIG9ialswXTtcbiAgICAgIHJldHVybiBjaGFpblJlc3VsdCh0aGlzLCBvYmopO1xuICAgIH07XG4gIH0pO1xuXG4gIC8vIEFkZCBhbGwgYWNjZXNzb3IgQXJyYXkgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyLlxuICBfLmVhY2goWydjb25jYXQnLCAnam9pbicsICdzbGljZSddLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIG1ldGhvZCA9IEFycmF5UHJvdG9bbmFtZV07XG4gICAgXy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjaGFpblJlc3VsdCh0aGlzLCBtZXRob2QuYXBwbHkodGhpcy5fd3JhcHBlZCwgYXJndW1lbnRzKSk7XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gRXh0cmFjdHMgdGhlIHJlc3VsdCBmcm9tIGEgd3JhcHBlZCBhbmQgY2hhaW5lZCBvYmplY3QuXG4gIF8ucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyYXBwZWQ7XG4gIH07XG5cbiAgLy8gUHJvdmlkZSB1bndyYXBwaW5nIHByb3h5IGZvciBzb21lIG1ldGhvZHMgdXNlZCBpbiBlbmdpbmUgb3BlcmF0aW9uc1xuICAvLyBzdWNoIGFzIGFyaXRobWV0aWMgYW5kIEpTT04gc3RyaW5naWZpY2F0aW9uLlxuICBfLnByb3RvdHlwZS52YWx1ZU9mID0gXy5wcm90b3R5cGUudG9KU09OID0gXy5wcm90b3R5cGUudmFsdWU7XG5cbiAgXy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gU3RyaW5nKHRoaXMuX3dyYXBwZWQpO1xuICB9O1xuXG4gIC8vIEFNRCByZWdpc3RyYXRpb24gaGFwcGVucyBhdCB0aGUgZW5kIGZvciBjb21wYXRpYmlsaXR5IHdpdGggQU1EIGxvYWRlcnNcbiAgLy8gdGhhdCBtYXkgbm90IGVuZm9yY2UgbmV4dC10dXJuIHNlbWFudGljcyBvbiBtb2R1bGVzLiBFdmVuIHRob3VnaCBnZW5lcmFsXG4gIC8vIHByYWN0aWNlIGZvciBBTUQgcmVnaXN0cmF0aW9uIGlzIHRvIGJlIGFub255bW91cywgdW5kZXJzY29yZSByZWdpc3RlcnNcbiAgLy8gYXMgYSBuYW1lZCBtb2R1bGUgYmVjYXVzZSwgbGlrZSBqUXVlcnksIGl0IGlzIGEgYmFzZSBsaWJyYXJ5IHRoYXQgaXNcbiAgLy8gcG9wdWxhciBlbm91Z2ggdG8gYmUgYnVuZGxlZCBpbiBhIHRoaXJkIHBhcnR5IGxpYiwgYnV0IG5vdCBiZSBwYXJ0IG9mXG4gIC8vIGFuIEFNRCBsb2FkIHJlcXVlc3QuIFRob3NlIGNhc2VzIGNvdWxkIGdlbmVyYXRlIGFuIGVycm9yIHdoZW4gYW5cbiAgLy8gYW5vbnltb3VzIGRlZmluZSgpIGlzIGNhbGxlZCBvdXRzaWRlIG9mIGEgbG9hZGVyIHJlcXVlc3QuXG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZSgndW5kZXJzY29yZScsIFtdLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBfO1xuICAgIH0pO1xuICB9XG59KCkpO1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTkxYm1SbGNuTmpiM0psTDNWdVpHVnljMk52Y21VdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqdEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CSWl3aVptbHNaU0k2SW1kbGJtVnlZWFJsWkM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZMeUFnSUNBZ1ZXNWtaWEp6WTI5eVpTNXFjeUF4TGprdU1WeHVMeThnSUNBZ0lHaDBkSEE2THk5MWJtUmxjbk5qYjNKbGFuTXViM0puWEc0dkx5QWdJQ0FnS0dNcElESXdNRGt0TWpBeE9DQktaWEpsYlhrZ1FYTm9hMlZ1WVhNc0lFUnZZM1Z0Wlc1MFEyeHZkV1FnWVc1a0lFbHVkbVZ6ZEdsbllYUnBkbVVnVW1Wd2IzSjBaWEp6SUNZZ1JXUnBkRzl5YzF4dUx5OGdJQ0FnSUZWdVpHVnljMk52Y21VZ2JXRjVJR0psSUdaeVpXVnNlU0JrYVhOMGNtbGlkWFJsWkNCMWJtUmxjaUIwYUdVZ1RVbFVJR3hwWTJWdWMyVXVYRzVjYmlobWRXNWpkR2x2YmlncElIdGNibHh1SUNBdkx5QkNZWE5sYkdsdVpTQnpaWFIxY0Z4dUlDQXZMeUF0TFMwdExTMHRMUzB0TFMwdExWeHVYRzRnSUM4dklFVnpkR0ZpYkdsemFDQjBhR1VnY205dmRDQnZZbXBsWTNRc0lHQjNhVzVrYjNkZ0lDaGdjMlZzWm1BcElHbHVJSFJvWlNCaWNtOTNjMlZ5TENCZ1oyeHZZbUZzWUZ4dUlDQXZMeUJ2YmlCMGFHVWdjMlZ5ZG1WeUxDQnZjaUJnZEdocGMyQWdhVzRnYzI5dFpTQjJhWEowZFdGc0lHMWhZMmhwYm1WekxpQlhaU0IxYzJVZ1lITmxiR1pnWEc0Z0lDOHZJR2x1YzNSbFlXUWdiMllnWUhkcGJtUnZkMkFnWm05eUlHQlhaV0pYYjNKclpYSmdJSE4xY0hCdmNuUXVYRzRnSUhaaGNpQnliMjkwSUQwZ2RIbHdaVzltSUhObGJHWWdQVDBnSjI5aWFtVmpkQ2NnSmlZZ2MyVnNaaTV6Wld4bUlEMDlQU0J6Wld4bUlDWW1JSE5sYkdZZ2ZIeGNiaUFnSUNBZ0lDQWdJQ0FnSUhSNWNHVnZaaUJuYkc5aVlXd2dQVDBnSjI5aWFtVmpkQ2NnSmlZZ1oyeHZZbUZzTG1kc2IySmhiQ0E5UFQwZ1oyeHZZbUZzSUNZbUlHZHNiMkpoYkNCOGZGeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5QjhmRnh1SUNBZ0lDQWdJQ0FnSUNBZ2UzMDdYRzVjYmlBZ0x5OGdVMkYyWlNCMGFHVWdjSEpsZG1sdmRYTWdkbUZzZFdVZ2IyWWdkR2hsSUdCZllDQjJZWEpwWVdKc1pTNWNiaUFnZG1GeUlIQnlaWFpwYjNWelZXNWtaWEp6WTI5eVpTQTlJSEp2YjNRdVh6dGNibHh1SUNBdkx5QlRZWFpsSUdKNWRHVnpJR2x1SUhSb1pTQnRhVzVwWm1sbFpDQW9ZblYwSUc1dmRDQm5lbWx3Y0dWa0tTQjJaWEp6YVc5dU9seHVJQ0IyWVhJZ1FYSnlZWGxRY205MGJ5QTlJRUZ5Y21GNUxuQnliM1J2ZEhsd1pTd2dUMkpxVUhKdmRHOGdQU0JQWW1wbFkzUXVjSEp2ZEc5MGVYQmxPMXh1SUNCMllYSWdVM2x0WW05c1VISnZkRzhnUFNCMGVYQmxiMllnVTNsdFltOXNJQ0U5UFNBbmRXNWtaV1pwYm1Wa0p5QS9JRk41YldKdmJDNXdjbTkwYjNSNWNHVWdPaUJ1ZFd4c08xeHVYRzRnSUM4dklFTnlaV0YwWlNCeGRXbGpheUJ5WldabGNtVnVZMlVnZG1GeWFXRmliR1Z6SUdadmNpQnpjR1ZsWkNCaFkyTmxjM01nZEc4Z1kyOXlaU0J3Y205MGIzUjVjR1Z6TGx4dUlDQjJZWElnY0hWemFDQTlJRUZ5Y21GNVVISnZkRzh1Y0hWemFDeGNiaUFnSUNBZ0lITnNhV05sSUQwZ1FYSnlZWGxRY205MGJ5NXpiR2xqWlN4Y2JpQWdJQ0FnSUhSdlUzUnlhVzVuSUQwZ1QySnFVSEp2ZEc4dWRHOVRkSEpwYm1jc1hHNGdJQ0FnSUNCb1lYTlBkMjVRY205d1pYSjBlU0E5SUU5aWFsQnliM1J2TG1oaGMwOTNibEJ5YjNCbGNuUjVPMXh1WEc0Z0lDOHZJRUZzYkNBcUtrVkRUVUZUWTNKcGNIUWdOU29xSUc1aGRHbDJaU0JtZFc1amRHbHZiaUJwYlhCc1pXMWxiblJoZEdsdmJuTWdkR2hoZENCM1pTQm9iM0JsSUhSdklIVnpaVnh1SUNBdkx5QmhjbVVnWkdWamJHRnlaV1FnYUdWeVpTNWNiaUFnZG1GeUlHNWhkR2wyWlVselFYSnlZWGtnUFNCQmNuSmhlUzVwYzBGeWNtRjVMRnh1SUNBZ0lDQWdibUYwYVhabFMyVjVjeUE5SUU5aWFtVmpkQzVyWlhsekxGeHVJQ0FnSUNBZ2JtRjBhWFpsUTNKbFlYUmxJRDBnVDJKcVpXTjBMbU55WldGMFpUdGNibHh1SUNBdkx5Qk9ZV3RsWkNCbWRXNWpkR2x2YmlCeVpXWmxjbVZ1WTJVZ1ptOXlJSE4xY25KdloyRjBaUzF3Y205MGIzUjVjR1V0YzNkaGNIQnBibWN1WEc0Z0lIWmhjaUJEZEc5eUlEMGdablZ1WTNScGIyNG9LWHQ5TzF4dVhHNGdJQzh2SUVOeVpXRjBaU0JoSUhOaFptVWdjbVZtWlhKbGJtTmxJSFJ2SUhSb1pTQlZibVJsY25OamIzSmxJRzlpYW1WamRDQm1iM0lnZFhObElHSmxiRzkzTGx4dUlDQjJZWElnWHlBOUlHWjFibU4wYVc5dUtHOWlhaWtnZTF4dUlDQWdJR2xtSUNodlltb2dhVzV6ZEdGdVkyVnZaaUJmS1NCeVpYUjFjbTRnYjJKcU8xeHVJQ0FnSUdsbUlDZ2hLSFJvYVhNZ2FXNXpkR0Z1WTJWdlppQmZLU2tnY21WMGRYSnVJRzVsZHlCZktHOWlhaWs3WEc0Z0lDQWdkR2hwY3k1ZmQzSmhjSEJsWkNBOUlHOWlhanRjYmlBZ2ZUdGNibHh1SUNBdkx5QkZlSEJ2Y25RZ2RHaGxJRlZ1WkdWeWMyTnZjbVVnYjJKcVpXTjBJR1p2Y2lBcUtrNXZaR1V1YW5NcUtpd2dkMmwwYUZ4dUlDQXZMeUJpWVdOcmQyRnlaSE10WTI5dGNHRjBhV0pwYkdsMGVTQm1iM0lnZEdobGFYSWdiMnhrSUcxdlpIVnNaU0JCVUVrdUlFbG1JSGRsSjNKbElHbHVYRzRnSUM4dklIUm9aU0JpY205M2MyVnlMQ0JoWkdRZ1lGOWdJR0Z6SUdFZ1oyeHZZbUZzSUc5aWFtVmpkQzVjYmlBZ0x5OGdLR0J1YjJSbFZIbHdaV0FnYVhNZ1kyaGxZMnRsWkNCMGJ5Qmxibk4xY21VZ2RHaGhkQ0JnYlc5a2RXeGxZRnh1SUNBdkx5QmhibVFnWUdWNGNHOXlkSE5nSUdGeVpTQnViM1FnU0ZSTlRDQmxiR1Z0Wlc1MGN5NHBYRzRnSUdsbUlDaDBlWEJsYjJZZ1pYaHdiM0owY3lBaFBTQW5kVzVrWldacGJtVmtKeUFtSmlBaFpYaHdiM0owY3k1dWIyUmxWSGx3WlNrZ2UxeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ2JXOWtkV3hsSUNFOUlDZDFibVJsWm1sdVpXUW5JQ1ltSUNGdGIyUjFiR1V1Ym05a1pWUjVjR1VnSmlZZ2JXOWtkV3hsTG1WNGNHOXlkSE1wSUh0Y2JpQWdJQ0FnSUdWNGNHOXlkSE1nUFNCdGIyUjFiR1V1Wlhod2IzSjBjeUE5SUY4N1hHNGdJQ0FnZlZ4dUlDQWdJR1Y0Y0c5eWRITXVYeUE5SUY4N1hHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2NtOXZkQzVmSUQwZ1h6dGNiaUFnZlZ4dVhHNGdJQzh2SUVOMWNuSmxiblFnZG1WeWMybHZiaTVjYmlBZ1h5NVdSVkpUU1U5T0lEMGdKekV1T1M0eEp6dGNibHh1SUNBdkx5QkpiblJsY201aGJDQm1kVzVqZEdsdmJpQjBhR0YwSUhKbGRIVnlibk1nWVc0Z1pXWm1hV05wWlc1MElDaG1iM0lnWTNWeWNtVnVkQ0JsYm1kcGJtVnpLU0IyWlhKemFXOXVYRzRnSUM4dklHOW1JSFJvWlNCd1lYTnpaV1F0YVc0Z1kyRnNiR0poWTJzc0lIUnZJR0psSUhKbGNHVmhkR1ZrYkhrZ1lYQndiR2xsWkNCcGJpQnZkR2hsY2lCVmJtUmxjbk5qYjNKbFhHNGdJQzh2SUdaMWJtTjBhVzl1Y3k1Y2JpQWdkbUZ5SUc5d2RHbHRhWHBsUTJJZ1BTQm1kVzVqZEdsdmJpaG1kVzVqTENCamIyNTBaWGgwTENCaGNtZERiM1Z1ZENrZ2UxeHVJQ0FnSUdsbUlDaGpiMjUwWlhoMElEMDlQU0IyYjJsa0lEQXBJSEpsZEhWeWJpQm1kVzVqTzF4dUlDQWdJSE4zYVhSamFDQW9ZWEpuUTI5MWJuUWdQVDBnYm5Wc2JDQS9JRE1nT2lCaGNtZERiM1Z1ZENrZ2UxeHVJQ0FnSUNBZ1kyRnpaU0F4T2lCeVpYUjFjbTRnWm5WdVkzUnBiMjRvZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1oxYm1NdVkyRnNiQ2hqYjI1MFpYaDBMQ0IyWVd4MVpTazdYRzRnSUNBZ0lDQjlPMXh1SUNBZ0lDQWdMeThnVkdobElESXRZWEpuZFcxbGJuUWdZMkZ6WlNCcGN5QnZiV2wwZEdWa0lHSmxZMkYxYzJVZ2QyWGlnSmx5WlNCdWIzUWdkWE5wYm1jZ2FYUXVYRzRnSUNBZ0lDQmpZWE5sSURNNklISmxkSFZ5YmlCbWRXNWpkR2x2YmloMllXeDFaU3dnYVc1a1pYZ3NJR052Ykd4bFkzUnBiMjRwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTXVZMkZzYkNoamIyNTBaWGgwTENCMllXeDFaU3dnYVc1a1pYZ3NJR052Ykd4bFkzUnBiMjRwTzF4dUlDQWdJQ0FnZlR0Y2JpQWdJQ0FnSUdOaGMyVWdORG9nY21WMGRYSnVJR1oxYm1OMGFXOXVLR0ZqWTNWdGRXeGhkRzl5TENCMllXeDFaU3dnYVc1a1pYZ3NJR052Ykd4bFkzUnBiMjRwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTXVZMkZzYkNoamIyNTBaWGgwTENCaFkyTjFiWFZzWVhSdmNpd2dkbUZzZFdVc0lHbHVaR1Y0TENCamIyeHNaV04wYVc5dUtUdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJtZFc1amRHbHZiaWdwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJtZFc1akxtRndjR3g1S0dOdmJuUmxlSFFzSUdGeVozVnRaVzUwY3lrN1hHNGdJQ0FnZlR0Y2JpQWdmVHRjYmx4dUlDQjJZWElnWW5WcGJIUnBia2wwWlhKaGRHVmxPMXh1WEc0Z0lDOHZJRUZ1SUdsdWRHVnlibUZzSUdaMWJtTjBhVzl1SUhSdklHZGxibVZ5WVhSbElHTmhiR3hpWVdOcmN5QjBhR0YwSUdOaGJpQmlaU0JoY0hCc2FXVmtJSFJ2SUdWaFkyaGNiaUFnTHk4Z1pXeGxiV1Z1ZENCcGJpQmhJR052Ykd4bFkzUnBiMjRzSUhKbGRIVnlibWx1WnlCMGFHVWdaR1Z6YVhKbFpDQnlaWE4xYkhRZzRvQ1VJR1ZwZEdobGNpQmdhV1JsYm5ScGRIbGdMRnh1SUNBdkx5QmhiaUJoY21KcGRISmhjbmtnWTJGc2JHSmhZMnNzSUdFZ2NISnZjR1Z5ZEhrZ2JXRjBZMmhsY2l3Z2IzSWdZU0J3Y205d1pYSjBlU0JoWTJObGMzTnZjaTVjYmlBZ2RtRnlJR05pSUQwZ1puVnVZM1JwYjI0b2RtRnNkV1VzSUdOdmJuUmxlSFFzSUdGeVowTnZkVzUwS1NCN1hHNGdJQ0FnYVdZZ0tGOHVhWFJsY21GMFpXVWdJVDA5SUdKMWFXeDBhVzVKZEdWeVlYUmxaU2tnY21WMGRYSnVJRjh1YVhSbGNtRjBaV1VvZG1Gc2RXVXNJR052Ym5SbGVIUXBPMXh1SUNBZ0lHbG1JQ2gyWVd4MVpTQTlQU0J1ZFd4c0tTQnlaWFIxY200Z1h5NXBaR1Z1ZEdsMGVUdGNiaUFnSUNCcFppQW9YeTVwYzBaMWJtTjBhVzl1S0haaGJIVmxLU2tnY21WMGRYSnVJRzl3ZEdsdGFYcGxRMklvZG1Gc2RXVXNJR052Ym5SbGVIUXNJR0Z5WjBOdmRXNTBLVHRjYmlBZ0lDQnBaaUFvWHk1cGMwOWlhbVZqZENoMllXeDFaU2tnSmlZZ0lWOHVhWE5CY25KaGVTaDJZV3gxWlNrcElISmxkSFZ5YmlCZkxtMWhkR05vWlhJb2RtRnNkV1VwTzF4dUlDQWdJSEpsZEhWeWJpQmZMbkJ5YjNCbGNuUjVLSFpoYkhWbEtUdGNiaUFnZlR0Y2JseHVJQ0F2THlCRmVIUmxjbTVoYkNCM2NtRndjR1Z5SUdadmNpQnZkWElnWTJGc2JHSmhZMnNnWjJWdVpYSmhkRzl5TGlCVmMyVnljeUJ0WVhrZ1kzVnpkRzl0YVhwbFhHNGdJQzh2SUdCZkxtbDBaWEpoZEdWbFlDQnBaaUIwYUdWNUlIZGhiblFnWVdSa2FYUnBiMjVoYkNCd2NtVmthV05oZEdVdmFYUmxjbUYwWldVZ2MyaHZjblJvWVc1a0lITjBlV3hsY3k1Y2JpQWdMeThnVkdocGN5QmhZbk4wY21GamRHbHZiaUJvYVdSbGN5QjBhR1VnYVc1MFpYSnVZV3d0YjI1c2VTQmhjbWREYjNWdWRDQmhjbWQxYldWdWRDNWNiaUFnWHk1cGRHVnlZWFJsWlNBOUlHSjFhV3gwYVc1SmRHVnlZWFJsWlNBOUlHWjFibU4wYVc5dUtIWmhiSFZsTENCamIyNTBaWGgwS1NCN1hHNGdJQ0FnY21WMGRYSnVJR05pS0haaGJIVmxMQ0JqYjI1MFpYaDBMQ0JKYm1acGJtbDBlU2s3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdVMjl0WlNCbWRXNWpkR2x2Ym5NZ2RHRnJaU0JoSUhaaGNtbGhZbXhsSUc1MWJXSmxjaUJ2WmlCaGNtZDFiV1Z1ZEhNc0lHOXlJR0VnWm1WM0lHVjRjR1ZqZEdWa1hHNGdJQzh2SUdGeVozVnRaVzUwY3lCaGRDQjBhR1VnWW1WbmFXNXVhVzVuSUdGdVpDQjBhR1Z1SUdFZ2RtRnlhV0ZpYkdVZ2JuVnRZbVZ5SUc5bUlIWmhiSFZsY3lCMGJ5QnZjR1Z5WVhSbFhHNGdJQzh2SUc5dUxpQlVhR2x6SUdobGJIQmxjaUJoWTJOMWJYVnNZWFJsY3lCaGJHd2djbVZ0WVdsdWFXNW5JR0Z5WjNWdFpXNTBjeUJ3WVhOMElIUm9aU0JtZFc1amRHbHZidUtBbVhOY2JpQWdMeThnWVhKbmRXMWxiblFnYkdWdVozUm9JQ2h2Y2lCaGJpQmxlSEJzYVdOcGRDQmdjM1JoY25SSmJtUmxlR0FwTENCcGJuUnZJR0Z1SUdGeWNtRjVJSFJvWVhRZ1ltVmpiMjFsYzF4dUlDQXZMeUIwYUdVZ2JHRnpkQ0JoY21kMWJXVnVkQzRnVTJsdGFXeGhjaUIwYnlCRlV6YmlnSmx6SUZ3aWNtVnpkQ0J3WVhKaGJXVjBaWEpjSWk1Y2JpQWdkbUZ5SUhKbGMzUkJjbWQxYldWdWRITWdQU0JtZFc1amRHbHZiaWhtZFc1akxDQnpkR0Z5ZEVsdVpHVjRLU0I3WEc0Z0lDQWdjM1JoY25SSmJtUmxlQ0E5SUhOMFlYSjBTVzVrWlhnZ1BUMGdiblZzYkNBL0lHWjFibU11YkdWdVozUm9JQzBnTVNBNklDdHpkR0Z5ZEVsdVpHVjRPMXh1SUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlncElIdGNiaUFnSUNBZ0lIWmhjaUJzWlc1bmRHZ2dQU0JOWVhSb0xtMWhlQ2hoY21kMWJXVnVkSE11YkdWdVozUm9JQzBnYzNSaGNuUkpibVJsZUN3Z01Da3NYRzRnSUNBZ0lDQWdJQ0FnY21WemRDQTlJRUZ5Y21GNUtHeGxibWQwYUNrc1hHNGdJQ0FnSUNBZ0lDQWdhVzVrWlhnZ1BTQXdPMXh1SUNBZ0lDQWdabTl5SUNnN0lHbHVaR1Y0SUR3Z2JHVnVaM1JvT3lCcGJtUmxlQ3NyS1NCN1hHNGdJQ0FnSUNBZ0lISmxjM1JiYVc1a1pYaGRJRDBnWVhKbmRXMWxiblJ6VzJsdVpHVjRJQ3NnYzNSaGNuUkpibVJsZUYwN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCemQybDBZMmdnS0hOMFlYSjBTVzVrWlhncElIdGNiaUFnSUNBZ0lDQWdZMkZ6WlNBd09pQnlaWFIxY200Z1puVnVZeTVqWVd4c0tIUm9hWE1zSUhKbGMzUXBPMXh1SUNBZ0lDQWdJQ0JqWVhObElERTZJSEpsZEhWeWJpQm1kVzVqTG1OaGJHd29kR2hwY3l3Z1lYSm5kVzFsYm5Seld6QmRMQ0J5WlhOMEtUdGNiaUFnSUNBZ0lDQWdZMkZ6WlNBeU9pQnlaWFIxY200Z1puVnVZeTVqWVd4c0tIUm9hWE1zSUdGeVozVnRaVzUwYzFzd1hTd2dZWEpuZFcxbGJuUnpXekZkTENCeVpYTjBLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJSFpoY2lCaGNtZHpJRDBnUVhKeVlYa29jM1JoY25SSmJtUmxlQ0FySURFcE8xeHVJQ0FnSUNBZ1ptOXlJQ2hwYm1SbGVDQTlJREE3SUdsdVpHVjRJRHdnYzNSaGNuUkpibVJsZURzZ2FXNWtaWGdyS3lrZ2UxeHVJQ0FnSUNBZ0lDQmhjbWR6VzJsdVpHVjRYU0E5SUdGeVozVnRaVzUwYzF0cGJtUmxlRjA3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JoY21kelczTjBZWEowU1c1a1pYaGRJRDBnY21WemREdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbWRXNWpMbUZ3Y0d4NUtIUm9hWE1zSUdGeVozTXBPMXh1SUNBZ0lIMDdYRzRnSUgwN1hHNWNiaUFnTHk4Z1FXNGdhVzUwWlhKdVlXd2dablZ1WTNScGIyNGdabTl5SUdOeVpXRjBhVzVuSUdFZ2JtVjNJRzlpYW1WamRDQjBhR0YwSUdsdWFHVnlhWFJ6SUdaeWIyMGdZVzV2ZEdobGNpNWNiaUFnZG1GeUlHSmhjMlZEY21WaGRHVWdQU0JtZFc1amRHbHZiaWh3Y205MGIzUjVjR1VwSUh0Y2JpQWdJQ0JwWmlBb0lWOHVhWE5QWW1wbFkzUW9jSEp2ZEc5MGVYQmxLU2tnY21WMGRYSnVJSHQ5TzF4dUlDQWdJR2xtSUNodVlYUnBkbVZEY21WaGRHVXBJSEpsZEhWeWJpQnVZWFJwZG1WRGNtVmhkR1VvY0hKdmRHOTBlWEJsS1R0Y2JpQWdJQ0JEZEc5eUxuQnliM1J2ZEhsd1pTQTlJSEJ5YjNSdmRIbHdaVHRjYmlBZ0lDQjJZWElnY21WemRXeDBJRDBnYm1WM0lFTjBiM0k3WEc0Z0lDQWdRM1J2Y2k1d2NtOTBiM1I1Y0dVZ1BTQnVkV3hzTzF4dUlDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJSDA3WEc1Y2JpQWdkbUZ5SUhOb1lXeHNiM2RRY205d1pYSjBlU0E5SUdaMWJtTjBhVzl1S0d0bGVTa2dlMXh1SUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2Ymlodlltb3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnZZbW9nUFQwZ2JuVnNiQ0EvSUhadmFXUWdNQ0E2SUc5aWFsdHJaWGxkTzF4dUlDQWdJSDA3WEc0Z0lIMDdYRzVjYmlBZ2RtRnlJR2hoY3lBOUlHWjFibU4wYVc5dUtHOWlhaXdnY0dGMGFDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCdlltb2dJVDBnYm5Wc2JDQW1KaUJvWVhOUGQyNVFjbTl3WlhKMGVTNWpZV3hzS0c5aWFpd2djR0YwYUNrN1hHNGdJSDFjYmx4dUlDQjJZWElnWkdWbGNFZGxkQ0E5SUdaMWJtTjBhVzl1S0c5aWFpd2djR0YwYUNrZ2UxeHVJQ0FnSUhaaGNpQnNaVzVuZEdnZ1BTQndZWFJvTG14bGJtZDBhRHRjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCcFppQW9iMkpxSUQwOUlHNTFiR3dwSUhKbGRIVnliaUIyYjJsa0lEQTdYRzRnSUNBZ0lDQnZZbW9nUFNCdlltcGJjR0YwYUZ0cFhWMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJzWlc1bmRHZ2dQeUJ2WW1vZ09pQjJiMmxrSURBN1hHNGdJSDA3WEc1Y2JpQWdMeThnU0dWc2NHVnlJR1p2Y2lCamIyeHNaV04wYVc5dUlHMWxkR2h2WkhNZ2RHOGdaR1YwWlhKdGFXNWxJSGRvWlhSb1pYSWdZU0JqYjJ4c1pXTjBhVzl1WEc0Z0lDOHZJSE5vYjNWc1pDQmlaU0JwZEdWeVlYUmxaQ0JoY3lCaGJpQmhjbkpoZVNCdmNpQmhjeUJoYmlCdlltcGxZM1F1WEc0Z0lDOHZJRkpsYkdGMFpXUTZJR2gwZEhBNkx5OXdaVzl3YkdVdWJXOTZhV3hzWVM1dmNtY3ZmbXB2Y21WdVpHOXlabVl2WlhNMkxXUnlZV1owTG1oMGJXd2pjMlZqTFhSdmJHVnVaM1JvWEc0Z0lDOHZJRUYyYjJsa2N5QmhJSFpsY25rZ2JtRnpkSGtnYVU5VElEZ2dTa2xVSUdKMVp5QnZiaUJCVWswdE5qUXVJQ015TURrMFhHNGdJSFpoY2lCTlFWaGZRVkpTUVZsZlNVNUVSVmdnUFNCTllYUm9MbkJ2ZHlneUxDQTFNeWtnTFNBeE8xeHVJQ0IyWVhJZ1oyVjBUR1Z1WjNSb0lEMGdjMmhoYkd4dmQxQnliM0JsY25SNUtDZHNaVzVuZEdnbktUdGNiaUFnZG1GeUlHbHpRWEp5WVhsTWFXdGxJRDBnWm5WdVkzUnBiMjRvWTI5c2JHVmpkR2x2YmlrZ2UxeHVJQ0FnSUhaaGNpQnNaVzVuZEdnZ1BTQm5aWFJNWlc1bmRHZ29ZMjlzYkdWamRHbHZiaWs3WEc0Z0lDQWdjbVYwZFhKdUlIUjVjR1Z2WmlCc1pXNW5kR2dnUFQwZ0oyNTFiV0psY2ljZ0ppWWdiR1Z1WjNSb0lENDlJREFnSmlZZ2JHVnVaM1JvSUR3OUlFMUJXRjlCVWxKQldWOUpUa1JGV0R0Y2JpQWdmVHRjYmx4dUlDQXZMeUJEYjJ4c1pXTjBhVzl1SUVaMWJtTjBhVzl1YzF4dUlDQXZMeUF0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFZ4dVhHNGdJQzh2SUZSb1pTQmpiM0p1WlhKemRHOXVaU3dnWVc0Z1lHVmhZMmhnSUdsdGNHeGxiV1Z1ZEdGMGFXOXVMQ0JoYTJFZ1lHWnZja1ZoWTJoZ0xseHVJQ0F2THlCSVlXNWtiR1Z6SUhKaGR5QnZZbXBsWTNSeklHbHVJR0ZrWkdsMGFXOXVJSFJ2SUdGeWNtRjVMV3hwYTJWekxpQlVjbVZoZEhNZ1lXeHNYRzRnSUM4dklITndZWEp6WlNCaGNuSmhlUzFzYVd0bGN5QmhjeUJwWmlCMGFHVjVJSGRsY21VZ1pHVnVjMlV1WEc0Z0lGOHVaV0ZqYUNBOUlGOHVabTl5UldGamFDQTlJR1oxYm1OMGFXOXVLRzlpYWl3Z2FYUmxjbUYwWldVc0lHTnZiblJsZUhRcElIdGNiaUFnSUNCcGRHVnlZWFJsWlNBOUlHOXdkR2x0YVhwbFEySW9hWFJsY21GMFpXVXNJR052Ym5SbGVIUXBPMXh1SUNBZ0lIWmhjaUJwTENCc1pXNW5kR2c3WEc0Z0lDQWdhV1lnS0dselFYSnlZWGxNYVd0bEtHOWlhaWtwSUh0Y2JpQWdJQ0FnSUdadmNpQW9hU0E5SURBc0lHeGxibWQwYUNBOUlHOWlhaTVzWlc1bmRHZzdJR2tnUENCc1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lDQWdJQ0JwZEdWeVlYUmxaU2h2WW1wYmFWMHNJR2tzSUc5aWFpazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhaaGNpQnJaWGx6SUQwZ1h5NXJaWGx6S0c5aWFpazdYRzRnSUNBZ0lDQm1iM0lnS0drZ1BTQXdMQ0JzWlc1bmRHZ2dQU0JyWlhsekxteGxibWQwYURzZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNBZ0lHbDBaWEpoZEdWbEtHOWlhbHRyWlhselcybGRYU3dnYTJWNWMxdHBYU3dnYjJKcUtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJRzlpYWp0Y2JpQWdmVHRjYmx4dUlDQXZMeUJTWlhSMWNtNGdkR2hsSUhKbGMzVnNkSE1nYjJZZ1lYQndiSGxwYm1jZ2RHaGxJR2wwWlhKaGRHVmxJSFJ2SUdWaFkyZ2daV3hsYldWdWRDNWNiaUFnWHk1dFlYQWdQU0JmTG1OdmJHeGxZM1FnUFNCbWRXNWpkR2x2Ymlodlltb3NJR2wwWlhKaGRHVmxMQ0JqYjI1MFpYaDBLU0I3WEc0Z0lDQWdhWFJsY21GMFpXVWdQU0JqWWlocGRHVnlZWFJsWlN3Z1kyOXVkR1Y0ZENrN1hHNGdJQ0FnZG1GeUlHdGxlWE1nUFNBaGFYTkJjbkpoZVV4cGEyVW9iMkpxS1NBbUppQmZMbXRsZVhNb2IySnFLU3hjYmlBZ0lDQWdJQ0FnYkdWdVozUm9JRDBnS0d0bGVYTWdmSHdnYjJKcUtTNXNaVzVuZEdnc1hHNGdJQ0FnSUNBZ0lISmxjM1ZzZEhNZ1BTQkJjbkpoZVNoc1pXNW5kR2dwTzF4dUlDQWdJR1p2Y2lBb2RtRnlJR2x1WkdWNElEMGdNRHNnYVc1a1pYZ2dQQ0JzWlc1bmRHZzdJR2x1WkdWNEt5c3BJSHRjYmlBZ0lDQWdJSFpoY2lCamRYSnlaVzUwUzJWNUlEMGdhMlY1Y3lBL0lHdGxlWE5iYVc1a1pYaGRJRG9nYVc1a1pYZzdYRzRnSUNBZ0lDQnlaWE4xYkhSelcybHVaR1Y0WFNBOUlHbDBaWEpoZEdWbEtHOWlhbHRqZFhKeVpXNTBTMlY1WFN3Z1kzVnljbVZ1ZEV0bGVTd2diMkpxS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlISmxjM1ZzZEhNN1hHNGdJSDA3WEc1Y2JpQWdMeThnUTNKbFlYUmxJR0VnY21Wa2RXTnBibWNnWm5WdVkzUnBiMjRnYVhSbGNtRjBhVzVuSUd4bFpuUWdiM0lnY21sbmFIUXVYRzRnSUhaaGNpQmpjbVZoZEdWU1pXUjFZMlVnUFNCbWRXNWpkR2x2Ymloa2FYSXBJSHRjYmlBZ0lDQXZMeUJYY21Gd0lHTnZaR1VnZEdoaGRDQnlaV0Z6YzJsbmJuTWdZWEpuZFcxbGJuUWdkbUZ5YVdGaWJHVnpJR2x1SUdFZ2MyVndZWEpoZEdVZ1puVnVZM1JwYjI0Z2RHaGhibHh1SUNBZ0lDOHZJSFJvWlNCdmJtVWdkR2hoZENCaFkyTmxjM05sY3lCZ1lYSm5kVzFsYm5SekxteGxibWQwYUdBZ2RHOGdZWFp2YVdRZ1lTQndaWEptSUdocGRDNGdLQ014T1RreEtWeHVJQ0FnSUhaaGNpQnlaV1IxWTJWeUlEMGdablZ1WTNScGIyNG9iMkpxTENCcGRHVnlZWFJsWlN3Z2JXVnRieXdnYVc1cGRHbGhiQ2tnZTF4dUlDQWdJQ0FnZG1GeUlHdGxlWE1nUFNBaGFYTkJjbkpoZVV4cGEyVW9iMkpxS1NBbUppQmZMbXRsZVhNb2IySnFLU3hjYmlBZ0lDQWdJQ0FnSUNCc1pXNW5kR2dnUFNBb2EyVjVjeUI4ZkNCdlltb3BMbXhsYm1kMGFDeGNiaUFnSUNBZ0lDQWdJQ0JwYm1SbGVDQTlJR1JwY2lBK0lEQWdQeUF3SURvZ2JHVnVaM1JvSUMwZ01UdGNiaUFnSUNBZ0lHbG1JQ2doYVc1cGRHbGhiQ2tnZTF4dUlDQWdJQ0FnSUNCdFpXMXZJRDBnYjJKcVcydGxlWE1nUHlCclpYbHpXMmx1WkdWNFhTQTZJR2x1WkdWNFhUdGNiaUFnSUNBZ0lDQWdhVzVrWlhnZ0t6MGdaR2x5TzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnWm05eUlDZzdJR2x1WkdWNElENDlJREFnSmlZZ2FXNWtaWGdnUENCc1pXNW5kR2c3SUdsdVpHVjRJQ3M5SUdScGNpa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ1kzVnljbVZ1ZEV0bGVTQTlJR3RsZVhNZ1B5QnJaWGx6VzJsdVpHVjRYU0E2SUdsdVpHVjRPMXh1SUNBZ0lDQWdJQ0J0WlcxdklEMGdhWFJsY21GMFpXVW9iV1Z0Ynl3Z2IySnFXMk4xY25KbGJuUkxaWGxkTENCamRYSnlaVzUwUzJWNUxDQnZZbW9wTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnY21WMGRYSnVJRzFsYlc4N1hHNGdJQ0FnZlR0Y2JseHVJQ0FnSUhKbGRIVnliaUJtZFc1amRHbHZiaWh2WW1vc0lHbDBaWEpoZEdWbExDQnRaVzF2TENCamIyNTBaWGgwS1NCN1hHNGdJQ0FnSUNCMllYSWdhVzVwZEdsaGJDQTlJR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dQajBnTXp0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ5WldSMVkyVnlLRzlpYWl3Z2IzQjBhVzFwZW1WRFlpaHBkR1Z5WVhSbFpTd2dZMjl1ZEdWNGRDd2dOQ2tzSUcxbGJXOHNJR2x1YVhScFlXd3BPMXh1SUNBZ0lIMDdYRzRnSUgwN1hHNWNiaUFnTHk4Z0tpcFNaV1IxWTJVcUtpQmlkV2xzWkhNZ2RYQWdZU0J6YVc1bmJHVWdjbVZ6ZFd4MElHWnliMjBnWVNCc2FYTjBJRzltSUhaaGJIVmxjeXdnWVd0aElHQnBibXBsWTNSZ0xGeHVJQ0F2THlCdmNpQmdabTlzWkd4Z0xseHVJQ0JmTG5KbFpIVmpaU0E5SUY4dVptOXNaR3dnUFNCZkxtbHVhbVZqZENBOUlHTnlaV0YwWlZKbFpIVmpaU2d4S1R0Y2JseHVJQ0F2THlCVWFHVWdjbWxuYUhRdFlYTnpiMk5wWVhScGRtVWdkbVZ5YzJsdmJpQnZaaUJ5WldSMVkyVXNJR0ZzYzI4Z2EyNXZkMjRnWVhNZ1lHWnZiR1J5WUM1Y2JpQWdYeTV5WldSMVkyVlNhV2RvZENBOUlGOHVabTlzWkhJZ1BTQmpjbVZoZEdWU1pXUjFZMlVvTFRFcE8xeHVYRzRnSUM4dklGSmxkSFZ5YmlCMGFHVWdabWx5YzNRZ2RtRnNkV1VnZDJocFkyZ2djR0Z6YzJWeklHRWdkSEoxZEdnZ2RHVnpkQzRnUVd4cFlYTmxaQ0JoY3lCZ1pHVjBaV04wWUM1Y2JpQWdYeTVtYVc1a0lEMGdYeTVrWlhSbFkzUWdQU0JtZFc1amRHbHZiaWh2WW1vc0lIQnlaV1JwWTJGMFpTd2dZMjl1ZEdWNGRDa2dlMXh1SUNBZ0lIWmhjaUJyWlhsR2FXNWtaWElnUFNCcGMwRnljbUY1VEdsclpTaHZZbW9wSUQ4Z1h5NW1hVzVrU1c1a1pYZ2dPaUJmTG1acGJtUkxaWGs3WEc0Z0lDQWdkbUZ5SUd0bGVTQTlJR3RsZVVacGJtUmxjaWh2WW1vc0lIQnlaV1JwWTJGMFpTd2dZMjl1ZEdWNGRDazdYRzRnSUNBZ2FXWWdLR3RsZVNBaFBUMGdkbTlwWkNBd0lDWW1JR3RsZVNBaFBUMGdMVEVwSUhKbGRIVnliaUJ2WW1wYmEyVjVYVHRjYmlBZ2ZUdGNibHh1SUNBdkx5QlNaWFIxY200Z1lXeHNJSFJvWlNCbGJHVnRaVzUwY3lCMGFHRjBJSEJoYzNNZ1lTQjBjblYwYUNCMFpYTjBMbHh1SUNBdkx5QkJiR2xoYzJWa0lHRnpJR0J6Wld4bFkzUmdMbHh1SUNCZkxtWnBiSFJsY2lBOUlGOHVjMlZzWldOMElEMGdablZ1WTNScGIyNG9iMkpxTENCd2NtVmthV05oZEdVc0lHTnZiblJsZUhRcElIdGNiaUFnSUNCMllYSWdjbVZ6ZFd4MGN5QTlJRnRkTzF4dUlDQWdJSEJ5WldScFkyRjBaU0E5SUdOaUtIQnlaV1JwWTJGMFpTd2dZMjl1ZEdWNGRDazdYRzRnSUNBZ1h5NWxZV05vS0c5aWFpd2dablZ1WTNScGIyNG9kbUZzZFdVc0lHbHVaR1Y0TENCc2FYTjBLU0I3WEc0Z0lDQWdJQ0JwWmlBb2NISmxaR2xqWVhSbEtIWmhiSFZsTENCcGJtUmxlQ3dnYkdsemRDa3BJSEpsYzNWc2RITXVjSFZ6YUNoMllXeDFaU2s3WEc0Z0lDQWdmU2s3WEc0Z0lDQWdjbVYwZFhKdUlISmxjM1ZzZEhNN1hHNGdJSDA3WEc1Y2JpQWdMeThnVW1WMGRYSnVJR0ZzYkNCMGFHVWdaV3hsYldWdWRITWdabTl5SUhkb2FXTm9JR0VnZEhKMWRHZ2dkR1Z6ZENCbVlXbHNjeTVjYmlBZ1h5NXlaV3BsWTNRZ1BTQm1kVzVqZEdsdmJpaHZZbW9zSUhCeVpXUnBZMkYwWlN3Z1kyOXVkR1Y0ZENrZ2UxeHVJQ0FnSUhKbGRIVnliaUJmTG1acGJIUmxjaWh2WW1vc0lGOHVibVZuWVhSbEtHTmlLSEJ5WldScFkyRjBaU2twTENCamIyNTBaWGgwS1R0Y2JpQWdmVHRjYmx4dUlDQXZMeUJFWlhSbGNtMXBibVVnZDJobGRHaGxjaUJoYkd3Z2IyWWdkR2hsSUdWc1pXMWxiblJ6SUcxaGRHTm9JR0VnZEhKMWRHZ2dkR1Z6ZEM1Y2JpQWdMeThnUVd4cFlYTmxaQ0JoY3lCZ1lXeHNZQzVjYmlBZ1h5NWxkbVZ5ZVNBOUlGOHVZV3hzSUQwZ1puVnVZM1JwYjI0b2IySnFMQ0J3Y21Wa2FXTmhkR1VzSUdOdmJuUmxlSFFwSUh0Y2JpQWdJQ0J3Y21Wa2FXTmhkR1VnUFNCallpaHdjbVZrYVdOaGRHVXNJR052Ym5SbGVIUXBPMXh1SUNBZ0lIWmhjaUJyWlhseklEMGdJV2x6UVhKeVlYbE1hV3RsS0c5aWFpa2dKaVlnWHk1clpYbHpLRzlpYWlrc1hHNGdJQ0FnSUNBZ0lHeGxibWQwYUNBOUlDaHJaWGx6SUh4OElHOWlhaWt1YkdWdVozUm9PMXh1SUNBZ0lHWnZjaUFvZG1GeUlHbHVaR1Y0SUQwZ01Ec2dhVzVrWlhnZ1BDQnNaVzVuZEdnN0lHbHVaR1Y0S3lzcElIdGNiaUFnSUNBZ0lIWmhjaUJqZFhKeVpXNTBTMlY1SUQwZ2EyVjVjeUEvSUd0bGVYTmJhVzVrWlhoZElEb2dhVzVrWlhnN1hHNGdJQ0FnSUNCcFppQW9JWEJ5WldScFkyRjBaU2h2WW1wYlkzVnljbVZ1ZEV0bGVWMHNJR04xY25KbGJuUkxaWGtzSUc5aWFpa3BJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlIUnlkV1U3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdSR1YwWlhKdGFXNWxJR2xtSUdGMElHeGxZWE4wSUc5dVpTQmxiR1Z0Wlc1MElHbHVJSFJvWlNCdlltcGxZM1FnYldGMFkyaGxjeUJoSUhSeWRYUm9JSFJsYzNRdVhHNGdJQzh2SUVGc2FXRnpaV1FnWVhNZ1lHRnVlV0F1WEc0Z0lGOHVjMjl0WlNBOUlGOHVZVzU1SUQwZ1puVnVZM1JwYjI0b2IySnFMQ0J3Y21Wa2FXTmhkR1VzSUdOdmJuUmxlSFFwSUh0Y2JpQWdJQ0J3Y21Wa2FXTmhkR1VnUFNCallpaHdjbVZrYVdOaGRHVXNJR052Ym5SbGVIUXBPMXh1SUNBZ0lIWmhjaUJyWlhseklEMGdJV2x6UVhKeVlYbE1hV3RsS0c5aWFpa2dKaVlnWHk1clpYbHpLRzlpYWlrc1hHNGdJQ0FnSUNBZ0lHeGxibWQwYUNBOUlDaHJaWGx6SUh4OElHOWlhaWt1YkdWdVozUm9PMXh1SUNBZ0lHWnZjaUFvZG1GeUlHbHVaR1Y0SUQwZ01Ec2dhVzVrWlhnZ1BDQnNaVzVuZEdnN0lHbHVaR1Y0S3lzcElIdGNiaUFnSUNBZ0lIWmhjaUJqZFhKeVpXNTBTMlY1SUQwZ2EyVjVjeUEvSUd0bGVYTmJhVzVrWlhoZElEb2dhVzVrWlhnN1hHNGdJQ0FnSUNCcFppQW9jSEpsWkdsallYUmxLRzlpYWx0amRYSnlaVzUwUzJWNVhTd2dZM1Z5Y21WdWRFdGxlU3dnYjJKcUtTa2djbVYwZFhKdUlIUnlkV1U3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ2ZUdGNibHh1SUNBdkx5QkVaWFJsY20xcGJtVWdhV1lnZEdobElHRnljbUY1SUc5eUlHOWlhbVZqZENCamIyNTBZV2x1Y3lCaElHZHBkbVZ1SUdsMFpXMGdLSFZ6YVc1bklHQTlQVDFnS1M1Y2JpQWdMeThnUVd4cFlYTmxaQ0JoY3lCZ2FXNWpiSFZrWlhOZ0lHRnVaQ0JnYVc1amJIVmtaV0F1WEc0Z0lGOHVZMjl1ZEdGcGJuTWdQU0JmTG1sdVkyeDFaR1Z6SUQwZ1h5NXBibU5zZFdSbElEMGdablZ1WTNScGIyNG9iMkpxTENCcGRHVnRMQ0JtY205dFNXNWtaWGdzSUdkMVlYSmtLU0I3WEc0Z0lDQWdhV1lnS0NGcGMwRnljbUY1VEdsclpTaHZZbW9wS1NCdlltb2dQU0JmTG5aaGJIVmxjeWh2WW1vcE8xeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ1puSnZiVWx1WkdWNElDRTlJQ2R1ZFcxaVpYSW5JSHg4SUdkMVlYSmtLU0JtY205dFNXNWtaWGdnUFNBd08xeHVJQ0FnSUhKbGRIVnliaUJmTG1sdVpHVjRUMllvYjJKcUxDQnBkR1Z0TENCbWNtOXRTVzVrWlhncElENDlJREE3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdTVzUyYjJ0bElHRWdiV1YwYUc5a0lDaDNhWFJvSUdGeVozVnRaVzUwY3lrZ2IyNGdaWFpsY25rZ2FYUmxiU0JwYmlCaElHTnZiR3hsWTNScGIyNHVYRzRnSUY4dWFXNTJiMnRsSUQwZ2NtVnpkRUZ5WjNWdFpXNTBjeWhtZFc1amRHbHZiaWh2WW1vc0lIQmhkR2dzSUdGeVozTXBJSHRjYmlBZ0lDQjJZWElnWTI5dWRHVjRkRkJoZEdnc0lHWjFibU03WEc0Z0lDQWdhV1lnS0Y4dWFYTkdkVzVqZEdsdmJpaHdZWFJvS1NrZ2UxeHVJQ0FnSUNBZ1puVnVZeUE5SUhCaGRHZzdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaGZMbWx6UVhKeVlYa29jR0YwYUNrcElIdGNiaUFnSUNBZ0lHTnZiblJsZUhSUVlYUm9JRDBnY0dGMGFDNXpiR2xqWlNnd0xDQXRNU2s3WEc0Z0lDQWdJQ0J3WVhSb0lEMGdjR0YwYUZ0d1lYUm9MbXhsYm1kMGFDQXRJREZkTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z1h5NXRZWEFvYjJKcUxDQm1kVzVqZEdsdmJpaGpiMjUwWlhoMEtTQjdYRzRnSUNBZ0lDQjJZWElnYldWMGFHOWtJRDBnWm5WdVl6dGNiaUFnSUNBZ0lHbG1JQ2doYldWMGFHOWtLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaGpiMjUwWlhoMFVHRjBhQ0FtSmlCamIyNTBaWGgwVUdGMGFDNXNaVzVuZEdncElIdGNiaUFnSUNBZ0lDQWdJQ0JqYjI1MFpYaDBJRDBnWkdWbGNFZGxkQ2hqYjI1MFpYaDBMQ0JqYjI1MFpYaDBVR0YwYUNrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdhV1lnS0dOdmJuUmxlSFFnUFQwZ2JuVnNiQ2tnY21WMGRYSnVJSFp2YVdRZ01EdGNiaUFnSUNBZ0lDQWdiV1YwYUc5a0lEMGdZMjl1ZEdWNGRGdHdZWFJvWFR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUhKbGRIVnliaUJ0WlhSb2IyUWdQVDBnYm5Wc2JDQS9JRzFsZEdodlpDQTZJRzFsZEdodlpDNWhjSEJzZVNoamIyNTBaWGgwTENCaGNtZHpLVHRjYmlBZ0lDQjlLVHRjYmlBZ2ZTazdYRzVjYmlBZ0x5OGdRMjl1ZG1WdWFXVnVZMlVnZG1WeWMybHZiaUJ2WmlCaElHTnZiVzF2YmlCMWMyVWdZMkZ6WlNCdlppQmdiV0Z3WURvZ1ptVjBZMmhwYm1jZ1lTQndjbTl3WlhKMGVTNWNiaUFnWHk1d2JIVmpheUE5SUdaMWJtTjBhVzl1S0c5aWFpd2dhMlY1S1NCN1hHNGdJQ0FnY21WMGRYSnVJRjh1YldGd0tHOWlhaXdnWHk1d2NtOXdaWEowZVNoclpYa3BLVHRjYmlBZ2ZUdGNibHh1SUNBdkx5QkRiMjUyWlc1cFpXNWpaU0IyWlhKemFXOXVJRzltSUdFZ1kyOXRiVzl1SUhWelpTQmpZWE5sSUc5bUlHQm1hV3gwWlhKZ09pQnpaV3hsWTNScGJtY2diMjVzZVNCdlltcGxZM1J6WEc0Z0lDOHZJR052Ym5SaGFXNXBibWNnYzNCbFkybG1hV01nWUd0bGVUcDJZV3gxWldBZ2NHRnBjbk11WEc0Z0lGOHVkMmhsY21VZ1BTQm1kVzVqZEdsdmJpaHZZbW9zSUdGMGRISnpLU0I3WEc0Z0lDQWdjbVYwZFhKdUlGOHVabWxzZEdWeUtHOWlhaXdnWHk1dFlYUmphR1Z5S0dGMGRISnpLU2s3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdRMjl1ZG1WdWFXVnVZMlVnZG1WeWMybHZiaUJ2WmlCaElHTnZiVzF2YmlCMWMyVWdZMkZ6WlNCdlppQmdabWx1WkdBNklHZGxkSFJwYm1jZ2RHaGxJR1pwY25OMElHOWlhbVZqZEZ4dUlDQXZMeUJqYjI1MFlXbHVhVzVuSUhOd1pXTnBabWxqSUdCclpYazZkbUZzZFdWZ0lIQmhhWEp6TGx4dUlDQmZMbVpwYm1SWGFHVnlaU0E5SUdaMWJtTjBhVzl1S0c5aWFpd2dZWFIwY25NcElIdGNiaUFnSUNCeVpYUjFjbTRnWHk1bWFXNWtLRzlpYWl3Z1h5NXRZWFJqYUdWeUtHRjBkSEp6S1NrN1hHNGdJSDA3WEc1Y2JpQWdMeThnVW1WMGRYSnVJSFJvWlNCdFlYaHBiWFZ0SUdWc1pXMWxiblFnS0c5eUlHVnNaVzFsYm5RdFltRnpaV1FnWTI5dGNIVjBZWFJwYjI0cExseHVJQ0JmTG0xaGVDQTlJR1oxYm1OMGFXOXVLRzlpYWl3Z2FYUmxjbUYwWldVc0lHTnZiblJsZUhRcElIdGNiaUFnSUNCMllYSWdjbVZ6ZFd4MElEMGdMVWx1Wm1sdWFYUjVMQ0JzWVhOMFEyOXRjSFYwWldRZ1BTQXRTVzVtYVc1cGRIa3NYRzRnSUNBZ0lDQWdJSFpoYkhWbExDQmpiMjF3ZFhSbFpEdGNiaUFnSUNCcFppQW9hWFJsY21GMFpXVWdQVDBnYm5Wc2JDQjhmQ0IwZVhCbGIyWWdhWFJsY21GMFpXVWdQVDBnSjI1MWJXSmxjaWNnSmlZZ2RIbHdaVzltSUc5aWFsc3dYU0FoUFNBbmIySnFaV04wSnlBbUppQnZZbW9nSVQwZ2JuVnNiQ2tnZTF4dUlDQWdJQ0FnYjJKcUlEMGdhWE5CY25KaGVVeHBhMlVvYjJKcUtTQS9JRzlpYWlBNklGOHVkbUZzZFdWektHOWlhaWs3WEc0Z0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Dd2diR1Z1WjNSb0lEMGdiMkpxTG14bGJtZDBhRHNnYVNBOElHeGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0FnSUhaaGJIVmxJRDBnYjJKcVcybGRPMXh1SUNBZ0lDQWdJQ0JwWmlBb2RtRnNkV1VnSVQwZ2JuVnNiQ0FtSmlCMllXeDFaU0ErSUhKbGMzVnNkQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlIWmhiSFZsTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJR2wwWlhKaGRHVmxJRDBnWTJJb2FYUmxjbUYwWldVc0lHTnZiblJsZUhRcE8xeHVJQ0FnSUNBZ1h5NWxZV05vS0c5aWFpd2dablZ1WTNScGIyNG9kaXdnYVc1a1pYZ3NJR3hwYzNRcElIdGNiaUFnSUNBZ0lDQWdZMjl0Y0hWMFpXUWdQU0JwZEdWeVlYUmxaU2gyTENCcGJtUmxlQ3dnYkdsemRDazdYRzRnSUNBZ0lDQWdJR2xtSUNoamIyMXdkWFJsWkNBK0lHeGhjM1JEYjIxd2RYUmxaQ0I4ZkNCamIyMXdkWFJsWkNBOVBUMGdMVWx1Wm1sdWFYUjVJQ1ltSUhKbGMzVnNkQ0E5UFQwZ0xVbHVabWx1YVhSNUtTQjdYRzRnSUNBZ0lDQWdJQ0FnY21WemRXeDBJRDBnZGp0Y2JpQWdJQ0FnSUNBZ0lDQnNZWE4wUTI5dGNIVjBaV1FnUFNCamIyMXdkWFJsWkR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzRnSUgwN1hHNWNiaUFnTHk4Z1VtVjBkWEp1SUhSb1pTQnRhVzVwYlhWdElHVnNaVzFsYm5RZ0tHOXlJR1ZzWlcxbGJuUXRZbUZ6WldRZ1kyOXRjSFYwWVhScGIyNHBMbHh1SUNCZkxtMXBiaUE5SUdaMWJtTjBhVzl1S0c5aWFpd2dhWFJsY21GMFpXVXNJR052Ym5SbGVIUXBJSHRjYmlBZ0lDQjJZWElnY21WemRXeDBJRDBnU1c1bWFXNXBkSGtzSUd4aGMzUkRiMjF3ZFhSbFpDQTlJRWx1Wm1sdWFYUjVMRnh1SUNBZ0lDQWdJQ0IyWVd4MVpTd2dZMjl0Y0hWMFpXUTdYRzRnSUNBZ2FXWWdLR2wwWlhKaGRHVmxJRDA5SUc1MWJHd2dmSHdnZEhsd1pXOW1JR2wwWlhKaGRHVmxJRDA5SUNkdWRXMWlaWEluSUNZbUlIUjVjR1Z2WmlCdlltcGJNRjBnSVQwZ0oyOWlhbVZqZENjZ0ppWWdiMkpxSUNFOUlHNTFiR3dwSUh0Y2JpQWdJQ0FnSUc5aWFpQTlJR2x6UVhKeVlYbE1hV3RsS0c5aWFpa2dQeUJ2WW1vZ09pQmZMblpoYkhWbGN5aHZZbW9wTzF4dUlDQWdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQXNJR3hsYm1kMGFDQTlJRzlpYWk1c1pXNW5kR2c3SUdrZ1BDQnNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnSUNCMllXeDFaU0E5SUc5aWFsdHBYVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIWmhiSFZsSUNFOUlHNTFiR3dnSmlZZ2RtRnNkV1VnUENCeVpYTjFiSFFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JwZEdWeVlYUmxaU0E5SUdOaUtHbDBaWEpoZEdWbExDQmpiMjUwWlhoMEtUdGNiaUFnSUNBZ0lGOHVaV0ZqYUNodlltb3NJR1oxYm1OMGFXOXVLSFlzSUdsdVpHVjRMQ0JzYVhOMEtTQjdYRzRnSUNBZ0lDQWdJR052YlhCMWRHVmtJRDBnYVhSbGNtRjBaV1VvZGl3Z2FXNWtaWGdzSUd4cGMzUXBPMXh1SUNBZ0lDQWdJQ0JwWmlBb1kyOXRjSFYwWldRZ1BDQnNZWE4wUTI5dGNIVjBaV1FnZkh3Z1kyOXRjSFYwWldRZ1BUMDlJRWx1Wm1sdWFYUjVJQ1ltSUhKbGMzVnNkQ0E5UFQwZ1NXNW1hVzVwZEhrcElIdGNiaUFnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0IyTzF4dUlDQWdJQ0FnSUNBZ0lHeGhjM1JEYjIxd2RYUmxaQ0E5SUdOdmJYQjFkR1ZrTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUtUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnZlR0Y2JseHVJQ0F2THlCVGFIVm1abXhsSUdFZ1kyOXNiR1ZqZEdsdmJpNWNiaUFnWHk1emFIVm1abXhsSUQwZ1puVnVZM1JwYjI0b2IySnFLU0I3WEc0Z0lDQWdjbVYwZFhKdUlGOHVjMkZ0Y0d4bEtHOWlhaXdnU1c1bWFXNXBkSGtwTzF4dUlDQjlPMXh1WEc0Z0lDOHZJRk5oYlhCc1pTQXFLbTRxS2lCeVlXNWtiMjBnZG1Gc2RXVnpJR1p5YjIwZ1lTQmpiMnhzWldOMGFXOXVJSFZ6YVc1bklIUm9aU0J0YjJSbGNtNGdkbVZ5YzJsdmJpQnZaaUIwYUdWY2JpQWdMeThnVzBacGMyaGxjaTFaWVhSbGN5QnphSFZtWm14bFhTaG9kSFJ3T2k4dlpXNHVkMmxyYVhCbFpHbGhMbTl5Wnk5M2FXdHBMMFpwYzJobGN1S0FrMWxoZEdWelgzTm9kV1ptYkdVcExseHVJQ0F2THlCSlppQXFLbTRxS2lCcGN5QnViM1FnYzNCbFkybG1hV1ZrTENCeVpYUjFjbTV6SUdFZ2MybHVaMnhsSUhKaGJtUnZiU0JsYkdWdFpXNTBMbHh1SUNBdkx5QlVhR1VnYVc1MFpYSnVZV3dnWUdkMVlYSmtZQ0JoY21kMWJXVnVkQ0JoYkd4dmQzTWdhWFFnZEc4Z2QyOXlheUIzYVhSb0lHQnRZWEJnTGx4dUlDQmZMbk5oYlhCc1pTQTlJR1oxYm1OMGFXOXVLRzlpYWl3Z2Jpd2daM1ZoY21RcElIdGNiaUFnSUNCcFppQW9iaUE5UFNCdWRXeHNJSHg4SUdkMVlYSmtLU0I3WEc0Z0lDQWdJQ0JwWmlBb0lXbHpRWEp5WVhsTWFXdGxLRzlpYWlrcElHOWlhaUE5SUY4dWRtRnNkV1Z6S0c5aWFpazdYRzRnSUNBZ0lDQnlaWFIxY200Z2IySnFXMTh1Y21GdVpHOXRLRzlpYWk1c1pXNW5kR2dnTFNBeEtWMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhaaGNpQnpZVzF3YkdVZ1BTQnBjMEZ5Y21GNVRHbHJaU2h2WW1vcElEOGdYeTVqYkc5dVpTaHZZbW9wSURvZ1h5NTJZV3gxWlhNb2IySnFLVHRjYmlBZ0lDQjJZWElnYkdWdVozUm9JRDBnWjJWMFRHVnVaM1JvS0hOaGJYQnNaU2s3WEc0Z0lDQWdiaUE5SUUxaGRHZ3ViV0Y0S0UxaGRHZ3ViV2x1S0c0c0lHeGxibWQwYUNrc0lEQXBPMXh1SUNBZ0lIWmhjaUJzWVhOMElEMGdiR1Z1WjNSb0lDMGdNVHRjYmlBZ0lDQm1iM0lnS0haaGNpQnBibVJsZUNBOUlEQTdJR2x1WkdWNElEd2dianNnYVc1a1pYZ3JLeWtnZTF4dUlDQWdJQ0FnZG1GeUlISmhibVFnUFNCZkxuSmhibVJ2YlNocGJtUmxlQ3dnYkdGemRDazdYRzRnSUNBZ0lDQjJZWElnZEdWdGNDQTlJSE5oYlhCc1pWdHBibVJsZUYwN1hHNGdJQ0FnSUNCellXMXdiR1ZiYVc1a1pYaGRJRDBnYzJGdGNHeGxXM0poYm1SZE8xeHVJQ0FnSUNBZ2MyRnRjR3hsVzNKaGJtUmRJRDBnZEdWdGNEdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSE5oYlhCc1pTNXpiR2xqWlNnd0xDQnVLVHRjYmlBZ2ZUdGNibHh1SUNBdkx5QlRiM0owSUhSb1pTQnZZbXBsWTNRbmN5QjJZV3gxWlhNZ1lua2dZU0JqY21sMFpYSnBiMjRnY0hKdlpIVmpaV1FnWW5rZ1lXNGdhWFJsY21GMFpXVXVYRzRnSUY4dWMyOXlkRUo1SUQwZ1puVnVZM1JwYjI0b2IySnFMQ0JwZEdWeVlYUmxaU3dnWTI5dWRHVjRkQ2tnZTF4dUlDQWdJSFpoY2lCcGJtUmxlQ0E5SURBN1hHNGdJQ0FnYVhSbGNtRjBaV1VnUFNCallpaHBkR1Z5WVhSbFpTd2dZMjl1ZEdWNGRDazdYRzRnSUNBZ2NtVjBkWEp1SUY4dWNHeDFZMnNvWHk1dFlYQW9iMkpxTENCbWRXNWpkR2x2YmloMllXeDFaU3dnYTJWNUxDQnNhWE4wS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnZTF4dUlDQWdJQ0FnSUNCMllXeDFaVG9nZG1Gc2RXVXNYRzRnSUNBZ0lDQWdJR2x1WkdWNE9pQnBibVJsZUNzckxGeHVJQ0FnSUNBZ0lDQmpjbWwwWlhKcFlUb2dhWFJsY21GMFpXVW9kbUZzZFdVc0lHdGxlU3dnYkdsemRDbGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZTa3VjMjl5ZENobWRXNWpkR2x2Ymloc1pXWjBMQ0J5YVdkb2RDa2dlMXh1SUNBZ0lDQWdkbUZ5SUdFZ1BTQnNaV1owTG1OeWFYUmxjbWxoTzF4dUlDQWdJQ0FnZG1GeUlHSWdQU0J5YVdkb2RDNWpjbWwwWlhKcFlUdGNiaUFnSUNBZ0lHbG1JQ2hoSUNFOVBTQmlLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaGhJRDRnWWlCOGZDQmhJRDA5UFNCMmIybGtJREFwSUhKbGRIVnliaUF4TzF4dUlDQWdJQ0FnSUNCcFppQW9ZU0E4SUdJZ2ZId2dZaUE5UFQwZ2RtOXBaQ0F3S1NCeVpYUjFjbTRnTFRFN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCeVpYUjFjbTRnYkdWbWRDNXBibVJsZUNBdElISnBaMmgwTG1sdVpHVjRPMXh1SUNBZ0lIMHBMQ0FuZG1Gc2RXVW5LVHRjYmlBZ2ZUdGNibHh1SUNBdkx5QkJiaUJwYm5SbGNtNWhiQ0JtZFc1amRHbHZiaUIxYzJWa0lHWnZjaUJoWjJkeVpXZGhkR1VnWENKbmNtOTFjQ0JpZVZ3aUlHOXdaWEpoZEdsdmJuTXVYRzRnSUhaaGNpQm5jbTkxY0NBOUlHWjFibU4wYVc5dUtHSmxhR0YyYVc5eUxDQndZWEowYVhScGIyNHBJSHRjYmlBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0b2IySnFMQ0JwZEdWeVlYUmxaU3dnWTI5dWRHVjRkQ2tnZTF4dUlDQWdJQ0FnZG1GeUlISmxjM1ZzZENBOUlIQmhjblJwZEdsdmJpQS9JRnRiWFN3Z1cxMWRJRG9nZTMwN1hHNGdJQ0FnSUNCcGRHVnlZWFJsWlNBOUlHTmlLR2wwWlhKaGRHVmxMQ0JqYjI1MFpYaDBLVHRjYmlBZ0lDQWdJRjh1WldGamFDaHZZbW9zSUdaMWJtTjBhVzl1S0haaGJIVmxMQ0JwYm1SbGVDa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2EyVjVJRDBnYVhSbGNtRjBaV1VvZG1Gc2RXVXNJR2x1WkdWNExDQnZZbW9wTzF4dUlDQWdJQ0FnSUNCaVpXaGhkbWx2Y2loeVpYTjFiSFFzSUhaaGJIVmxMQ0JyWlhrcE8xeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQWdJSDA3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdSM0p2ZFhCeklIUm9aU0J2WW1wbFkzUW5jeUIyWVd4MVpYTWdZbmtnWVNCamNtbDBaWEpwYjI0dUlGQmhjM01nWldsMGFHVnlJR0VnYzNSeWFXNW5JR0YwZEhKcFluVjBaVnh1SUNBdkx5QjBieUJuY205MWNDQmllU3dnYjNJZ1lTQm1kVzVqZEdsdmJpQjBhR0YwSUhKbGRIVnlibk1nZEdobElHTnlhWFJsY21sdmJpNWNiaUFnWHk1bmNtOTFjRUo1SUQwZ1ozSnZkWEFvWm5WdVkzUnBiMjRvY21WemRXeDBMQ0IyWVd4MVpTd2dhMlY1S1NCN1hHNGdJQ0FnYVdZZ0tHaGhjeWh5WlhOMWJIUXNJR3RsZVNrcElISmxjM1ZzZEZ0clpYbGRMbkIxYzJnb2RtRnNkV1VwT3lCbGJITmxJSEpsYzNWc2RGdHJaWGxkSUQwZ1czWmhiSFZsWFR0Y2JpQWdmU2s3WEc1Y2JpQWdMeThnU1c1a1pYaGxjeUIwYUdVZ2IySnFaV04wSjNNZ2RtRnNkV1Z6SUdKNUlHRWdZM0pwZEdWeWFXOXVMQ0J6YVcxcGJHRnlJSFJ2SUdCbmNtOTFjRUo1WUN3Z1luVjBJR1p2Y2x4dUlDQXZMeUIzYUdWdUlIbHZkU0JyYm05M0lIUm9ZWFFnZVc5MWNpQnBibVJsZUNCMllXeDFaWE1nZDJsc2JDQmlaU0IxYm1seGRXVXVYRzRnSUY4dWFXNWtaWGhDZVNBOUlHZHliM1Z3S0daMWJtTjBhVzl1S0hKbGMzVnNkQ3dnZG1Gc2RXVXNJR3RsZVNrZ2UxeHVJQ0FnSUhKbGMzVnNkRnRyWlhsZElEMGdkbUZzZFdVN1hHNGdJSDBwTzF4dVhHNGdJQzh2SUVOdmRXNTBjeUJwYm5OMFlXNWpaWE1nYjJZZ1lXNGdiMkpxWldOMElIUm9ZWFFnWjNKdmRYQWdZbmtnWVNCalpYSjBZV2x1SUdOeWFYUmxjbWx2Ymk0Z1VHRnpjMXh1SUNBdkx5QmxhWFJvWlhJZ1lTQnpkSEpwYm1jZ1lYUjBjbWxpZFhSbElIUnZJR052ZFc1MElHSjVMQ0J2Y2lCaElHWjFibU4wYVc5dUlIUm9ZWFFnY21WMGRYSnVjeUIwYUdWY2JpQWdMeThnWTNKcGRHVnlhVzl1TGx4dUlDQmZMbU52ZFc1MFFua2dQU0JuY205MWNDaG1kVzVqZEdsdmJpaHlaWE4xYkhRc0lIWmhiSFZsTENCclpYa3BJSHRjYmlBZ0lDQnBaaUFvYUdGektISmxjM1ZzZEN3Z2EyVjVLU2tnY21WemRXeDBXMnRsZVYwckt6c2daV3h6WlNCeVpYTjFiSFJiYTJWNVhTQTlJREU3WEc0Z0lIMHBPMXh1WEc0Z0lIWmhjaUJ5WlZOMGNsTjViV0p2YkNBOUlDOWJYbHhjZFdRNE1EQXRYRngxWkdabVpsMThXMXhjZFdRNE1EQXRYRngxWkdKbVpsMWJYRngxWkdNd01DMWNYSFZrWm1abVhYeGJYRngxWkRnd01DMWNYSFZrWm1abVhTOW5PMXh1SUNBdkx5QlRZV1psYkhrZ1kzSmxZWFJsSUdFZ2NtVmhiQ3dnYkdsMlpTQmhjbkpoZVNCbWNtOXRJR0Z1ZVhSb2FXNW5JR2wwWlhKaFlteGxMbHh1SUNCZkxuUnZRWEp5WVhrZ1BTQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0JwWmlBb0lXOWlhaWtnY21WMGRYSnVJRnRkTzF4dUlDQWdJR2xtSUNoZkxtbHpRWEp5WVhrb2IySnFLU2tnY21WMGRYSnVJSE5zYVdObExtTmhiR3dvYjJKcUtUdGNiaUFnSUNCcFppQW9YeTVwYzFOMGNtbHVaeWh2WW1vcEtTQjdYRzRnSUNBZ0lDQXZMeUJMWldWd0lITjFjbkp2WjJGMFpTQndZV2x5SUdOb1lYSmhZM1JsY25NZ2RHOW5aWFJvWlhKY2JpQWdJQ0FnSUhKbGRIVnliaUJ2WW1vdWJXRjBZMmdvY21WVGRISlRlVzFpYjJ3cE8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb2FYTkJjbkpoZVV4cGEyVW9iMkpxS1NrZ2NtVjBkWEp1SUY4dWJXRndLRzlpYWl3Z1h5NXBaR1Z1ZEdsMGVTazdYRzRnSUNBZ2NtVjBkWEp1SUY4dWRtRnNkV1Z6S0c5aWFpazdYRzRnSUgwN1hHNWNiaUFnTHk4Z1VtVjBkWEp1SUhSb1pTQnVkVzFpWlhJZ2IyWWdaV3hsYldWdWRITWdhVzRnWVc0Z2IySnFaV04wTGx4dUlDQmZMbk5wZW1VZ1BTQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0JwWmlBb2IySnFJRDA5SUc1MWJHd3BJSEpsZEhWeWJpQXdPMXh1SUNBZ0lISmxkSFZ5YmlCcGMwRnljbUY1VEdsclpTaHZZbW9wSUQ4Z2IySnFMbXhsYm1kMGFDQTZJRjh1YTJWNWN5aHZZbW9wTG14bGJtZDBhRHRjYmlBZ2ZUdGNibHh1SUNBdkx5QlRjR3hwZENCaElHTnZiR3hsWTNScGIyNGdhVzUwYnlCMGQyOGdZWEp5WVhsek9pQnZibVVnZDJodmMyVWdaV3hsYldWdWRITWdZV3hzSUhOaGRHbHpabmtnZEdobElHZHBkbVZ1WEc0Z0lDOHZJSEJ5WldScFkyRjBaU3dnWVc1a0lHOXVaU0IzYUc5elpTQmxiR1Z0Wlc1MGN5QmhiR3dnWkc4Z2JtOTBJSE5oZEdselpua2dkR2hsSUhCeVpXUnBZMkYwWlM1Y2JpQWdYeTV3WVhKMGFYUnBiMjRnUFNCbmNtOTFjQ2htZFc1amRHbHZiaWh5WlhOMWJIUXNJSFpoYkhWbExDQndZWE56S1NCN1hHNGdJQ0FnY21WemRXeDBXM0JoYzNNZ1B5QXdJRG9nTVYwdWNIVnphQ2gyWVd4MVpTazdYRzRnSUgwc0lIUnlkV1VwTzF4dVhHNGdJQzh2SUVGeWNtRjVJRVoxYm1OMGFXOXVjMXh1SUNBdkx5QXRMUzB0TFMwdExTMHRMUzB0TFMxY2JseHVJQ0F2THlCSFpYUWdkR2hsSUdacGNuTjBJR1ZzWlcxbGJuUWdiMllnWVc0Z1lYSnlZWGt1SUZCaGMzTnBibWNnS2lwdUtpb2dkMmxzYkNCeVpYUjFjbTRnZEdobElHWnBjbk4wSUU1Y2JpQWdMeThnZG1Gc2RXVnpJR2x1SUhSb1pTQmhjbkpoZVM0Z1FXeHBZWE5sWkNCaGN5QmdhR1ZoWkdBZ1lXNWtJR0IwWVd0bFlDNGdWR2hsSUNvcVozVmhjbVFxS2lCamFHVmphMXh1SUNBdkx5QmhiR3h2ZDNNZ2FYUWdkRzhnZDI5eWF5QjNhWFJvSUdCZkxtMWhjR0F1WEc0Z0lGOHVabWx5YzNRZ1BTQmZMbWhsWVdRZ1BTQmZMblJoYTJVZ1BTQm1kVzVqZEdsdmJpaGhjbkpoZVN3Z2Jpd2daM1ZoY21RcElIdGNiaUFnSUNCcFppQW9ZWEp5WVhrZ1BUMGdiblZzYkNCOGZDQmhjbkpoZVM1c1pXNW5kR2dnUENBeEtTQnlaWFIxY200Z2JpQTlQU0J1ZFd4c0lEOGdkbTlwWkNBd0lEb2dXMTA3WEc0Z0lDQWdhV1lnS0c0Z1BUMGdiblZzYkNCOGZDQm5kV0Z5WkNrZ2NtVjBkWEp1SUdGeWNtRjVXekJkTzF4dUlDQWdJSEpsZEhWeWJpQmZMbWx1YVhScFlXd29ZWEp5WVhrc0lHRnljbUY1TG14bGJtZDBhQ0F0SUc0cE8xeHVJQ0I5TzF4dVhHNGdJQzh2SUZKbGRIVnlibk1nWlhabGNubDBhR2x1WnlCaWRYUWdkR2hsSUd4aGMzUWdaVzUwY25rZ2IyWWdkR2hsSUdGeWNtRjVMaUJGYzNCbFkybGhiR3g1SUhWelpXWjFiQ0J2Ymx4dUlDQXZMeUIwYUdVZ1lYSm5kVzFsYm5SeklHOWlhbVZqZEM0Z1VHRnpjMmx1WnlBcUttNHFLaUIzYVd4c0lISmxkSFZ5YmlCaGJHd2dkR2hsSUhaaGJIVmxjeUJwYmx4dUlDQXZMeUIwYUdVZ1lYSnlZWGtzSUdWNFkyeDFaR2x1WnlCMGFHVWdiR0Z6ZENCT0xseHVJQ0JmTG1sdWFYUnBZV3dnUFNCbWRXNWpkR2x2YmloaGNuSmhlU3dnYml3Z1ozVmhjbVFwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdjMnhwWTJVdVkyRnNiQ2hoY25KaGVTd2dNQ3dnVFdGMGFDNXRZWGdvTUN3Z1lYSnlZWGt1YkdWdVozUm9JQzBnS0c0Z1BUMGdiblZzYkNCOGZDQm5kV0Z5WkNBL0lERWdPaUJ1S1NrcE8xeHVJQ0I5TzF4dVhHNGdJQzh2SUVkbGRDQjBhR1VnYkdGemRDQmxiR1Z0Wlc1MElHOW1JR0Z1SUdGeWNtRjVMaUJRWVhOemFXNW5JQ29xYmlvcUlIZHBiR3dnY21WMGRYSnVJSFJvWlNCc1lYTjBJRTVjYmlBZ0x5OGdkbUZzZFdWeklHbHVJSFJvWlNCaGNuSmhlUzVjYmlBZ1h5NXNZWE4wSUQwZ1puVnVZM1JwYjI0b1lYSnlZWGtzSUc0c0lHZDFZWEprS1NCN1hHNGdJQ0FnYVdZZ0tHRnljbUY1SUQwOUlHNTFiR3dnZkh3Z1lYSnlZWGt1YkdWdVozUm9JRHdnTVNrZ2NtVjBkWEp1SUc0Z1BUMGdiblZzYkNBL0lIWnZhV1FnTUNBNklGdGRPMXh1SUNBZ0lHbG1JQ2h1SUQwOUlHNTFiR3dnZkh3Z1ozVmhjbVFwSUhKbGRIVnliaUJoY25KaGVWdGhjbkpoZVM1c1pXNW5kR2dnTFNBeFhUdGNiaUFnSUNCeVpYUjFjbTRnWHk1eVpYTjBLR0Z5Y21GNUxDQk5ZWFJvTG0xaGVDZ3dMQ0JoY25KaGVTNXNaVzVuZEdnZ0xTQnVLU2s3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdVbVYwZFhKdWN5QmxkbVZ5ZVhSb2FXNW5JR0oxZENCMGFHVWdabWx5YzNRZ1pXNTBjbmtnYjJZZ2RHaGxJR0Z5Y21GNUxpQkJiR2xoYzJWa0lHRnpJR0IwWVdsc1lDQmhibVFnWUdSeWIzQmdMbHh1SUNBdkx5QkZjM0JsWTJsaGJHeDVJSFZ6WldaMWJDQnZiaUIwYUdVZ1lYSm5kVzFsYm5SeklHOWlhbVZqZEM0Z1VHRnpjMmx1WnlCaGJpQXFLbTRxS2lCM2FXeHNJSEpsZEhWeWJseHVJQ0F2THlCMGFHVWdjbVZ6ZENCT0lIWmhiSFZsY3lCcGJpQjBhR1VnWVhKeVlYa3VYRzRnSUY4dWNtVnpkQ0E5SUY4dWRHRnBiQ0E5SUY4dVpISnZjQ0E5SUdaMWJtTjBhVzl1S0dGeWNtRjVMQ0J1TENCbmRXRnlaQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQnpiR2xqWlM1allXeHNLR0Z5Y21GNUxDQnVJRDA5SUc1MWJHd2dmSHdnWjNWaGNtUWdQeUF4SURvZ2JpazdYRzRnSUgwN1hHNWNiaUFnTHk4Z1ZISnBiU0J2ZFhRZ1lXeHNJR1poYkhONUlIWmhiSFZsY3lCbWNtOXRJR0Z1SUdGeWNtRjVMbHh1SUNCZkxtTnZiWEJoWTNRZ1BTQm1kVzVqZEdsdmJpaGhjbkpoZVNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJmTG1acGJIUmxjaWhoY25KaGVTd2dRbTl2YkdWaGJpazdYRzRnSUgwN1hHNWNiaUFnTHk4Z1NXNTBaWEp1WVd3Z2FXMXdiR1Z0Wlc1MFlYUnBiMjRnYjJZZ1lTQnlaV04xY25OcGRtVWdZR1pzWVhSMFpXNWdJR1oxYm1OMGFXOXVMbHh1SUNCMllYSWdabXhoZEhSbGJpQTlJR1oxYm1OMGFXOXVLR2x1Y0hWMExDQnphR0ZzYkc5M0xDQnpkSEpwWTNRc0lHOTFkSEIxZENrZ2UxeHVJQ0FnSUc5MWRIQjFkQ0E5SUc5MWRIQjFkQ0I4ZkNCYlhUdGNiaUFnSUNCMllYSWdhV1I0SUQwZ2IzVjBjSFYwTG14bGJtZDBhRHRjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTUN3Z2JHVnVaM1JvSUQwZ1oyVjBUR1Z1WjNSb0tHbHVjSFYwS1RzZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCMllYSWdkbUZzZFdVZ1BTQnBibkIxZEZ0cFhUdGNiaUFnSUNBZ0lHbG1JQ2hwYzBGeWNtRjVUR2xyWlNoMllXeDFaU2tnSmlZZ0tGOHVhWE5CY25KaGVTaDJZV3gxWlNrZ2ZId2dYeTVwYzBGeVozVnRaVzUwY3loMllXeDFaU2twS1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRVpzWVhSMFpXNGdZM1Z5Y21WdWRDQnNaWFpsYkNCdlppQmhjbkpoZVNCdmNpQmhjbWQxYldWdWRITWdiMkpxWldOMExseHVJQ0FnSUNBZ0lDQnBaaUFvYzJoaGJHeHZkeWtnZTF4dUlDQWdJQ0FnSUNBZ0lIWmhjaUJxSUQwZ01Dd2diR1Z1SUQwZ2RtRnNkV1V1YkdWdVozUm9PMXh1SUNBZ0lDQWdJQ0FnSUhkb2FXeGxJQ2hxSUR3Z2JHVnVLU0J2ZFhSd2RYUmJhV1I0S3l0ZElEMGdkbUZzZFdWYmFpc3JYVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCbWJHRjBkR1Z1S0haaGJIVmxMQ0J6YUdGc2JHOTNMQ0J6ZEhKcFkzUXNJRzkxZEhCMWRDazdYRzRnSUNBZ0lDQWdJQ0FnYVdSNElEMGdiM1YwY0hWMExteGxibWQwYUR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDZ2hjM1J5YVdOMEtTQjdYRzRnSUNBZ0lDQWdJRzkxZEhCMWRGdHBaSGdySzEwZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlHOTFkSEIxZER0Y2JpQWdmVHRjYmx4dUlDQXZMeUJHYkdGMGRHVnVJRzkxZENCaGJpQmhjbkpoZVN3Z1pXbDBhR1Z5SUhKbFkzVnljMmwyWld4NUlDaGllU0JrWldaaGRXeDBLU3dnYjNJZ2FuVnpkQ0J2Ym1VZ2JHVjJaV3d1WEc0Z0lGOHVabXhoZEhSbGJpQTlJR1oxYm1OMGFXOXVLR0Z5Y21GNUxDQnphR0ZzYkc5M0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUdac1lYUjBaVzRvWVhKeVlYa3NJSE5vWVd4c2IzY3NJR1poYkhObEtUdGNiaUFnZlR0Y2JseHVJQ0F2THlCU1pYUjFjbTRnWVNCMlpYSnphVzl1SUc5bUlIUm9aU0JoY25KaGVTQjBhR0YwSUdSdlpYTWdibTkwSUdOdmJuUmhhVzRnZEdobElITndaV05wWm1sbFpDQjJZV3gxWlNoektTNWNiaUFnWHk1M2FYUm9iM1YwSUQwZ2NtVnpkRUZ5WjNWdFpXNTBjeWhtZFc1amRHbHZiaWhoY25KaGVTd2diM1JvWlhKQmNuSmhlWE1wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdYeTVrYVdabVpYSmxibU5sS0dGeWNtRjVMQ0J2ZEdobGNrRnljbUY1Y3lrN1hHNGdJSDBwTzF4dVhHNGdJQzh2SUZCeWIyUjFZMlVnWVNCa2RYQnNhV05oZEdVdFpuSmxaU0IyWlhKemFXOXVJRzltSUhSb1pTQmhjbkpoZVM0Z1NXWWdkR2hsSUdGeWNtRjVJR2hoY3lCaGJISmxZV1I1WEc0Z0lDOHZJR0psWlc0Z2MyOXlkR1ZrTENCNWIzVWdhR0YyWlNCMGFHVWdiM0IwYVc5dUlHOW1JSFZ6YVc1bklHRWdabUZ6ZEdWeUlHRnNaMjl5YVhSb2JTNWNiaUFnTHk4Z1ZHaGxJR1poYzNSbGNpQmhiR2R2Y21sMGFHMGdkMmxzYkNCdWIzUWdkMjl5YXlCM2FYUm9JR0Z1SUdsMFpYSmhkR1ZsSUdsbUlIUm9aU0JwZEdWeVlYUmxaVnh1SUNBdkx5QnBjeUJ1YjNRZ1lTQnZibVV0ZEc4dGIyNWxJR1oxYm1OMGFXOXVMQ0J6YnlCd2NtOTJhV1JwYm1jZ1lXNGdhWFJsY21GMFpXVWdkMmxzYkNCa2FYTmhZbXhsWEc0Z0lDOHZJSFJvWlNCbVlYTjBaWElnWVd4bmIzSnBkR2h0TGx4dUlDQXZMeUJCYkdsaGMyVmtJR0Z6SUdCMWJtbHhkV1ZnTGx4dUlDQmZMblZ1YVhFZ1BTQmZMblZ1YVhGMVpTQTlJR1oxYm1OMGFXOXVLR0Z5Y21GNUxDQnBjMU52Y25SbFpDd2dhWFJsY21GMFpXVXNJR052Ym5SbGVIUXBJSHRjYmlBZ0lDQnBaaUFvSVY4dWFYTkNiMjlzWldGdUtHbHpVMjl5ZEdWa0tTa2dlMXh1SUNBZ0lDQWdZMjl1ZEdWNGRDQTlJR2wwWlhKaGRHVmxPMXh1SUNBZ0lDQWdhWFJsY21GMFpXVWdQU0JwYzFOdmNuUmxaRHRjYmlBZ0lDQWdJR2x6VTI5eWRHVmtJRDBnWm1Gc2MyVTdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaHBkR1Z5WVhSbFpTQWhQU0J1ZFd4c0tTQnBkR1Z5WVhSbFpTQTlJR05pS0dsMFpYSmhkR1ZsTENCamIyNTBaWGgwS1R0Y2JpQWdJQ0IyWVhJZ2NtVnpkV3gwSUQwZ1cxMDdYRzRnSUNBZ2RtRnlJSE5sWlc0Z1BTQmJYVHRjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTUN3Z2JHVnVaM1JvSUQwZ1oyVjBUR1Z1WjNSb0tHRnljbUY1S1RzZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCMllYSWdkbUZzZFdVZ1BTQmhjbkpoZVZ0cFhTeGNiaUFnSUNBZ0lDQWdJQ0JqYjIxd2RYUmxaQ0E5SUdsMFpYSmhkR1ZsSUQ4Z2FYUmxjbUYwWldVb2RtRnNkV1VzSUdrc0lHRnljbUY1S1NBNklIWmhiSFZsTzF4dUlDQWdJQ0FnYVdZZ0tHbHpVMjl5ZEdWa0lDWW1JQ0ZwZEdWeVlYUmxaU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9JV2tnZkh3Z2MyVmxiaUFoUFQwZ1kyOXRjSFYwWldRcElISmxjM1ZzZEM1d2RYTm9LSFpoYkhWbEtUdGNiaUFnSUNBZ0lDQWdjMlZsYmlBOUlHTnZiWEIxZEdWa08xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHBkR1Z5WVhSbFpTa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb0lWOHVZMjl1ZEdGcGJuTW9jMlZsYml3Z1kyOXRjSFYwWldRcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnYzJWbGJpNXdkWE5vS0dOdmJYQjFkR1ZrS1R0Y2JpQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2gyWVd4MVpTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDBnWld4elpTQnBaaUFvSVY4dVkyOXVkR0ZwYm5Nb2NtVnpkV3gwTENCMllXeDFaU2twSUh0Y2JpQWdJQ0FnSUNBZ2NtVnpkV3gwTG5CMWMyZ29kbUZzZFdVcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdjbVZ6ZFd4ME8xeHVJQ0I5TzF4dVhHNGdJQzh2SUZCeWIyUjFZMlVnWVc0Z1lYSnlZWGtnZEdoaGRDQmpiMjUwWVdsdWN5QjBhR1VnZFc1cGIyNDZJR1ZoWTJnZ1pHbHpkR2x1WTNRZ1pXeGxiV1Z1ZENCbWNtOXRJR0ZzYkNCdlpseHVJQ0F2THlCMGFHVWdjR0Z6YzJWa0xXbHVJR0Z5Y21GNWN5NWNiaUFnWHk1MWJtbHZiaUE5SUhKbGMzUkJjbWQxYldWdWRITW9ablZ1WTNScGIyNG9ZWEp5WVhsektTQjdYRzRnSUNBZ2NtVjBkWEp1SUY4dWRXNXBjU2htYkdGMGRHVnVLR0Z5Y21GNWN5d2dkSEoxWlN3Z2RISjFaU2twTzF4dUlDQjlLVHRjYmx4dUlDQXZMeUJRY205a2RXTmxJR0Z1SUdGeWNtRjVJSFJvWVhRZ1kyOXVkR0ZwYm5NZ1pYWmxjbmtnYVhSbGJTQnphR0Z5WldRZ1ltVjBkMlZsYmlCaGJHd2dkR2hsWEc0Z0lDOHZJSEJoYzNObFpDMXBiaUJoY25KaGVYTXVYRzRnSUY4dWFXNTBaWEp6WldOMGFXOXVJRDBnWm5WdVkzUnBiMjRvWVhKeVlYa3BJSHRjYmlBZ0lDQjJZWElnY21WemRXeDBJRDBnVzEwN1hHNGdJQ0FnZG1GeUlHRnlaM05NWlc1bmRHZ2dQU0JoY21kMWJXVnVkSE11YkdWdVozUm9PMXh1SUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0F3TENCc1pXNW5kR2dnUFNCblpYUk1aVzVuZEdnb1lYSnlZWGtwT3lCcElEd2diR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUhaaGNpQnBkR1Z0SUQwZ1lYSnlZWGxiYVYwN1hHNGdJQ0FnSUNCcFppQW9YeTVqYjI1MFlXbHVjeWh5WlhOMWJIUXNJR2wwWlcwcEtTQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lIWmhjaUJxTzF4dUlDQWdJQ0FnWm05eUlDaHFJRDBnTVRzZ2FpQThJR0Z5WjNOTVpXNW5kR2c3SUdvckt5a2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb0lWOHVZMjl1ZEdGcGJuTW9ZWEpuZFcxbGJuUnpXMnBkTENCcGRHVnRLU2tnWW5KbFlXczdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnBaaUFvYWlBOVBUMGdZWEpuYzB4bGJtZDBhQ2tnY21WemRXeDBMbkIxYzJnb2FYUmxiU2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCeVpYTjFiSFE3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdWR0ZyWlNCMGFHVWdaR2xtWm1WeVpXNWpaU0JpWlhSM1pXVnVJRzl1WlNCaGNuSmhlU0JoYm1RZ1lTQnVkVzFpWlhJZ2IyWWdiM1JvWlhJZ1lYSnlZWGx6TGx4dUlDQXZMeUJQYm14NUlIUm9aU0JsYkdWdFpXNTBjeUJ3Y21WelpXNTBJR2x1SUdwMWMzUWdkR2hsSUdacGNuTjBJR0Z5Y21GNUlIZHBiR3dnY21WdFlXbHVMbHh1SUNCZkxtUnBabVpsY21WdVkyVWdQU0J5WlhOMFFYSm5kVzFsYm5SektHWjFibU4wYVc5dUtHRnljbUY1TENCeVpYTjBLU0I3WEc0Z0lDQWdjbVZ6ZENBOUlHWnNZWFIwWlc0b2NtVnpkQ3dnZEhKMVpTd2dkSEoxWlNrN1hHNGdJQ0FnY21WMGRYSnVJRjh1Wm1sc2RHVnlLR0Z5Y21GNUxDQm1kVzVqZEdsdmJpaDJZV3gxWlNsN1hHNGdJQ0FnSUNCeVpYUjFjbTRnSVY4dVkyOXVkR0ZwYm5Nb2NtVnpkQ3dnZG1Gc2RXVXBPMXh1SUNBZ0lIMHBPMXh1SUNCOUtUdGNibHh1SUNBdkx5QkRiMjF3YkdWdFpXNTBJRzltSUY4dWVtbHdMaUJWYm5wcGNDQmhZMk5sY0hSeklHRnVJR0Z5Y21GNUlHOW1JR0Z5Y21GNWN5QmhibVFnWjNKdmRYQnpYRzRnSUM4dklHVmhZMmdnWVhKeVlYa25jeUJsYkdWdFpXNTBjeUJ2YmlCemFHRnlaV1FnYVc1a2FXTmxjeTVjYmlBZ1h5NTFibnBwY0NBOUlHWjFibU4wYVc5dUtHRnljbUY1S1NCN1hHNGdJQ0FnZG1GeUlHeGxibWQwYUNBOUlHRnljbUY1SUNZbUlGOHViV0Y0S0dGeWNtRjVMQ0JuWlhSTVpXNW5kR2dwTG14bGJtZDBhQ0I4ZkNBd08xeHVJQ0FnSUhaaGNpQnlaWE4xYkhRZ1BTQkJjbkpoZVNoc1pXNW5kR2dwTzF4dVhHNGdJQ0FnWm05eUlDaDJZWElnYVc1a1pYZ2dQU0F3T3lCcGJtUmxlQ0E4SUd4bGJtZDBhRHNnYVc1a1pYZ3JLeWtnZTF4dUlDQWdJQ0FnY21WemRXeDBXMmx1WkdWNFhTQTlJRjh1Y0d4MVkyc29ZWEp5WVhrc0lHbHVaR1Y0S1R0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JpQWdmVHRjYmx4dUlDQXZMeUJhYVhBZ2RHOW5aWFJvWlhJZ2JYVnNkR2x3YkdVZ2JHbHpkSE1nYVc1MGJ5QmhJSE5wYm1kc1pTQmhjbkpoZVNBdExTQmxiR1Z0Wlc1MGN5QjBhR0YwSUhOb1lYSmxYRzRnSUM4dklHRnVJR2x1WkdWNElHZHZJSFJ2WjJWMGFHVnlMbHh1SUNCZkxucHBjQ0E5SUhKbGMzUkJjbWQxYldWdWRITW9YeTUxYm5wcGNDazdYRzVjYmlBZ0x5OGdRMjl1ZG1WeWRITWdiR2x6ZEhNZ2FXNTBieUJ2WW1wbFkzUnpMaUJRWVhOeklHVnBkR2hsY2lCaElITnBibWRzWlNCaGNuSmhlU0J2WmlCZ1cydGxlU3dnZG1Gc2RXVmRZRnh1SUNBdkx5QndZV2x5Y3l3Z2IzSWdkSGR2SUhCaGNtRnNiR1ZzSUdGeWNtRjVjeUJ2WmlCMGFHVWdjMkZ0WlNCc1pXNW5kR2dnTFMwZ2IyNWxJRzltSUd0bGVYTXNJR0Z1WkNCdmJtVWdiMlpjYmlBZ0x5OGdkR2hsSUdOdmNuSmxjM0J2Ym1ScGJtY2dkbUZzZFdWekxpQlFZWE56YVc1bklHSjVJSEJoYVhKeklHbHpJSFJvWlNCeVpYWmxjbk5sSUc5bUlGOHVjR0ZwY25NdVhHNGdJRjh1YjJKcVpXTjBJRDBnWm5WdVkzUnBiMjRvYkdsemRDd2dkbUZzZFdWektTQjdYRzRnSUNBZ2RtRnlJSEpsYzNWc2RDQTlJSHQ5TzF4dUlDQWdJR1p2Y2lBb2RtRnlJR2tnUFNBd0xDQnNaVzVuZEdnZ1BTQm5aWFJNWlc1bmRHZ29iR2x6ZENrN0lHa2dQQ0JzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2FXWWdLSFpoYkhWbGN5a2dlMXh1SUNBZ0lDQWdJQ0J5WlhOMWJIUmJiR2x6ZEZ0cFhWMGdQU0IyWVd4MVpYTmJhVjA3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0J5WlhOMWJIUmJiR2x6ZEZ0cFhWc3dYVjBnUFNCc2FYTjBXMmxkV3pGZE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdjbVZ6ZFd4ME8xeHVJQ0I5TzF4dVhHNGdJQzh2SUVkbGJtVnlZWFJ2Y2lCbWRXNWpkR2x2YmlCMGJ5QmpjbVZoZEdVZ2RHaGxJR1pwYm1SSmJtUmxlQ0JoYm1RZ1ptbHVaRXhoYzNSSmJtUmxlQ0JtZFc1amRHbHZibk11WEc0Z0lIWmhjaUJqY21WaGRHVlFjbVZrYVdOaGRHVkpibVJsZUVacGJtUmxjaUE5SUdaMWJtTjBhVzl1S0dScGNpa2dlMXh1SUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2YmloaGNuSmhlU3dnY0hKbFpHbGpZWFJsTENCamIyNTBaWGgwS1NCN1hHNGdJQ0FnSUNCd2NtVmthV05oZEdVZ1BTQmpZaWh3Y21Wa2FXTmhkR1VzSUdOdmJuUmxlSFFwTzF4dUlDQWdJQ0FnZG1GeUlHeGxibWQwYUNBOUlHZGxkRXhsYm1kMGFDaGhjbkpoZVNrN1hHNGdJQ0FnSUNCMllYSWdhVzVrWlhnZ1BTQmthWElnUGlBd0lEOGdNQ0E2SUd4bGJtZDBhQ0F0SURFN1hHNGdJQ0FnSUNCbWIzSWdLRHNnYVc1a1pYZ2dQajBnTUNBbUppQnBibVJsZUNBOElHeGxibWQwYURzZ2FXNWtaWGdnS3owZ1pHbHlLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaHdjbVZrYVdOaGRHVW9ZWEp5WVhsYmFXNWtaWGhkTENCcGJtUmxlQ3dnWVhKeVlYa3BLU0J5WlhSMWNtNGdhVzVrWlhnN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCeVpYUjFjbTRnTFRFN1hHNGdJQ0FnZlR0Y2JpQWdmVHRjYmx4dUlDQXZMeUJTWlhSMWNtNXpJSFJvWlNCbWFYSnpkQ0JwYm1SbGVDQnZiaUJoYmlCaGNuSmhlUzFzYVd0bElIUm9ZWFFnY0dGemMyVnpJR0VnY0hKbFpHbGpZWFJsSUhSbGMzUXVYRzRnSUY4dVptbHVaRWx1WkdWNElEMGdZM0psWVhSbFVISmxaR2xqWVhSbFNXNWtaWGhHYVc1a1pYSW9NU2s3WEc0Z0lGOHVabWx1WkV4aGMzUkpibVJsZUNBOUlHTnlaV0YwWlZCeVpXUnBZMkYwWlVsdVpHVjRSbWx1WkdWeUtDMHhLVHRjYmx4dUlDQXZMeUJWYzJVZ1lTQmpiMjF3WVhKaGRHOXlJR1oxYm1OMGFXOXVJSFJ2SUdacFozVnlaU0J2ZFhRZ2RHaGxJSE50WVd4c1pYTjBJR2x1WkdWNElHRjBJSGRvYVdOb1hHNGdJQzh2SUdGdUlHOWlhbVZqZENCemFHOTFiR1FnWW1VZ2FXNXpaWEowWldRZ2MyOGdZWE1nZEc4Z2JXRnBiblJoYVc0Z2IzSmtaWEl1SUZWelpYTWdZbWx1WVhKNUlITmxZWEpqYUM1Y2JpQWdYeTV6YjNKMFpXUkpibVJsZUNBOUlHWjFibU4wYVc5dUtHRnljbUY1TENCdlltb3NJR2wwWlhKaGRHVmxMQ0JqYjI1MFpYaDBLU0I3WEc0Z0lDQWdhWFJsY21GMFpXVWdQU0JqWWlocGRHVnlZWFJsWlN3Z1kyOXVkR1Y0ZEN3Z01TazdYRzRnSUNBZ2RtRnlJSFpoYkhWbElEMGdhWFJsY21GMFpXVW9iMkpxS1R0Y2JpQWdJQ0IyWVhJZ2JHOTNJRDBnTUN3Z2FHbG5hQ0E5SUdkbGRFeGxibWQwYUNoaGNuSmhlU2s3WEc0Z0lDQWdkMmhwYkdVZ0tHeHZkeUE4SUdocFoyZ3BJSHRjYmlBZ0lDQWdJSFpoY2lCdGFXUWdQU0JOWVhSb0xtWnNiMjl5S0Noc2IzY2dLeUJvYVdkb0tTQXZJRElwTzF4dUlDQWdJQ0FnYVdZZ0tHbDBaWEpoZEdWbEtHRnljbUY1VzIxcFpGMHBJRHdnZG1Gc2RXVXBJR3h2ZHlBOUlHMXBaQ0FySURFN0lHVnNjMlVnYUdsbmFDQTlJRzFwWkR0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlHeHZkenRjYmlBZ2ZUdGNibHh1SUNBdkx5QkhaVzVsY21GMGIzSWdablZ1WTNScGIyNGdkRzhnWTNKbFlYUmxJSFJvWlNCcGJtUmxlRTltSUdGdVpDQnNZWE4wU1c1a1pYaFBaaUJtZFc1amRHbHZibk11WEc0Z0lIWmhjaUJqY21WaGRHVkpibVJsZUVacGJtUmxjaUE5SUdaMWJtTjBhVzl1S0dScGNpd2djSEpsWkdsallYUmxSbWx1WkN3Z2MyOXlkR1ZrU1c1a1pYZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0b1lYSnlZWGtzSUdsMFpXMHNJR2xrZUNrZ2UxeHVJQ0FnSUNBZ2RtRnlJR2tnUFNBd0xDQnNaVzVuZEdnZ1BTQm5aWFJNWlc1bmRHZ29ZWEp5WVhrcE8xeHVJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQnBaSGdnUFQwZ0oyNTFiV0psY2ljcElIdGNiaUFnSUNBZ0lDQWdhV1lnS0dScGNpQStJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnBJRDBnYVdSNElENDlJREFnUHlCcFpIZ2dPaUJOWVhSb0xtMWhlQ2hwWkhnZ0t5QnNaVzVuZEdnc0lHa3BPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUd4bGJtZDBhQ0E5SUdsa2VDQStQU0F3SUQ4Z1RXRjBhQzV0YVc0b2FXUjRJQ3NnTVN3Z2JHVnVaM1JvS1NBNklHbGtlQ0FySUd4bGJtZDBhQ0FySURFN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9jMjl5ZEdWa1NXNWtaWGdnSmlZZ2FXUjRJQ1ltSUd4bGJtZDBhQ2tnZTF4dUlDQWdJQ0FnSUNCcFpIZ2dQU0J6YjNKMFpXUkpibVJsZUNoaGNuSmhlU3dnYVhSbGJTazdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmhjbkpoZVZ0cFpIaGRJRDA5UFNCcGRHVnRJRDhnYVdSNElEb2dMVEU3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JwWmlBb2FYUmxiU0FoUFQwZ2FYUmxiU2tnZTF4dUlDQWdJQ0FnSUNCcFpIZ2dQU0J3Y21Wa2FXTmhkR1ZHYVc1a0tITnNhV05sTG1OaGJHd29ZWEp5WVhrc0lHa3NJR3hsYm1kMGFDa3NJRjh1YVhOT1lVNHBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdhV1I0SUQ0OUlEQWdQeUJwWkhnZ0t5QnBJRG9nTFRFN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCbWIzSWdLR2xrZUNBOUlHUnBjaUErSURBZ1B5QnBJRG9nYkdWdVozUm9JQzBnTVRzZ2FXUjRJRDQ5SURBZ0ppWWdhV1I0SUR3Z2JHVnVaM1JvT3lCcFpIZ2dLejBnWkdseUtTQjdYRzRnSUNBZ0lDQWdJR2xtSUNoaGNuSmhlVnRwWkhoZElEMDlQU0JwZEdWdEtTQnlaWFIxY200Z2FXUjRPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjbVYwZFhKdUlDMHhPMXh1SUNBZ0lIMDdYRzRnSUgwN1hHNWNiaUFnTHk4Z1VtVjBkWEp1SUhSb1pTQndiM05wZEdsdmJpQnZaaUIwYUdVZ1ptbHljM1FnYjJOamRYSnlaVzVqWlNCdlppQmhiaUJwZEdWdElHbHVJR0Z1SUdGeWNtRjVMRnh1SUNBdkx5QnZjaUF0TVNCcFppQjBhR1VnYVhSbGJTQnBjeUJ1YjNRZ2FXNWpiSFZrWldRZ2FXNGdkR2hsSUdGeWNtRjVMbHh1SUNBdkx5QkpaaUIwYUdVZ1lYSnlZWGtnYVhNZ2JHRnlaMlVnWVc1a0lHRnNjbVZoWkhrZ2FXNGdjMjl5ZENCdmNtUmxjaXdnY0dGemN5QmdkSEoxWldCY2JpQWdMeThnWm05eUlDb3FhWE5UYjNKMFpXUXFLaUIwYnlCMWMyVWdZbWx1WVhKNUlITmxZWEpqYUM1Y2JpQWdYeTVwYm1SbGVFOW1JRDBnWTNKbFlYUmxTVzVrWlhoR2FXNWtaWElvTVN3Z1h5NW1hVzVrU1c1a1pYZ3NJRjh1YzI5eWRHVmtTVzVrWlhncE8xeHVJQ0JmTG14aGMzUkpibVJsZUU5bUlEMGdZM0psWVhSbFNXNWtaWGhHYVc1a1pYSW9MVEVzSUY4dVptbHVaRXhoYzNSSmJtUmxlQ2s3WEc1Y2JpQWdMeThnUjJWdVpYSmhkR1VnWVc0Z2FXNTBaV2RsY2lCQmNuSmhlU0JqYjI1MFlXbHVhVzVuSUdGdUlHRnlhWFJvYldWMGFXTWdjSEp2WjNKbGMzTnBiMjR1SUVFZ2NHOXlkQ0J2Wmx4dUlDQXZMeUIwYUdVZ2JtRjBhWFpsSUZCNWRHaHZiaUJnY21GdVoyVW9LV0FnWm5WdVkzUnBiMjR1SUZObFpWeHVJQ0F2THlCYmRHaGxJRkI1ZEdodmJpQmtiMk4xYldWdWRHRjBhVzl1WFNob2RIUndPaTh2Wkc5amN5NXdlWFJvYjI0dWIzSm5MMnhwWW5KaGNua3ZablZ1WTNScGIyNXpMbWgwYld3amNtRnVaMlVwTGx4dUlDQmZMbkpoYm1kbElEMGdablZ1WTNScGIyNG9jM1JoY25Rc0lITjBiM0FzSUhOMFpYQXBJSHRjYmlBZ0lDQnBaaUFvYzNSdmNDQTlQU0J1ZFd4c0tTQjdYRzRnSUNBZ0lDQnpkRzl3SUQwZ2MzUmhjblFnZkh3Z01EdGNiaUFnSUNBZ0lITjBZWEowSUQwZ01EdGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tDRnpkR1Z3S1NCN1hHNGdJQ0FnSUNCemRHVndJRDBnYzNSdmNDQThJSE4wWVhKMElEOGdMVEVnT2lBeE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhaaGNpQnNaVzVuZEdnZ1BTQk5ZWFJvTG0xaGVDaE5ZWFJvTG1ObGFXd29LSE4wYjNBZ0xTQnpkR0Z5ZENrZ0x5QnpkR1Z3S1N3Z01DazdYRzRnSUNBZ2RtRnlJSEpoYm1kbElEMGdRWEp5WVhrb2JHVnVaM1JvS1R0Y2JseHVJQ0FnSUdadmNpQW9kbUZ5SUdsa2VDQTlJREE3SUdsa2VDQThJR3hsYm1kMGFEc2dhV1I0S3lzc0lITjBZWEowSUNzOUlITjBaWEFwSUh0Y2JpQWdJQ0FnSUhKaGJtZGxXMmxrZUYwZ1BTQnpkR0Z5ZER0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhSMWNtNGdjbUZ1WjJVN1hHNGdJSDA3WEc1Y2JpQWdMeThnUTJoMWJtc2dZU0J6YVc1bmJHVWdZWEp5WVhrZ2FXNTBieUJ0ZFd4MGFYQnNaU0JoY25KaGVYTXNJR1ZoWTJnZ1kyOXVkR0ZwYm1sdVp5QmdZMjkxYm5SZ0lHOXlJR1psZDJWeVhHNGdJQzh2SUdsMFpXMXpMbHh1SUNCZkxtTm9kVzVySUQwZ1puVnVZM1JwYjI0b1lYSnlZWGtzSUdOdmRXNTBLU0I3WEc0Z0lDQWdhV1lnS0dOdmRXNTBJRDA5SUc1MWJHd2dmSHdnWTI5MWJuUWdQQ0F4S1NCeVpYUjFjbTRnVzEwN1hHNGdJQ0FnZG1GeUlISmxjM1ZzZENBOUlGdGRPMXh1SUNBZ0lIWmhjaUJwSUQwZ01Dd2diR1Z1WjNSb0lEMGdZWEp5WVhrdWJHVnVaM1JvTzF4dUlDQWdJSGRvYVd4bElDaHBJRHdnYkdWdVozUm9LU0I3WEc0Z0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNoemJHbGpaUzVqWVd4c0tHRnljbUY1TENCcExDQnBJQ3M5SUdOdmRXNTBLU2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCeVpYTjFiSFE3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdSblZ1WTNScGIyNGdLR0ZvWlcwcElFWjFibU4wYVc5dWMxeHVJQ0F2THlBdExTMHRMUzB0TFMwdExTMHRMUzB0TFMxY2JseHVJQ0F2THlCRVpYUmxjbTFwYm1WeklIZG9aWFJvWlhJZ2RHOGdaWGhsWTNWMFpTQmhJR1oxYm1OMGFXOXVJR0Z6SUdFZ1kyOXVjM1J5ZFdOMGIzSmNiaUFnTHk4Z2IzSWdZU0J1YjNKdFlXd2dablZ1WTNScGIyNGdkMmwwYUNCMGFHVWdjSEp2ZG1sa1pXUWdZWEpuZFcxbGJuUnpMbHh1SUNCMllYSWdaWGhsWTNWMFpVSnZkVzVrSUQwZ1puVnVZM1JwYjI0b2MyOTFjbU5sUm5WdVl5d2dZbTkxYm1SR2RXNWpMQ0JqYjI1MFpYaDBMQ0JqWVd4c2FXNW5RMjl1ZEdWNGRDd2dZWEpuY3lrZ2UxeHVJQ0FnSUdsbUlDZ2hLR05oYkd4cGJtZERiMjUwWlhoMElHbHVjM1JoYm1ObGIyWWdZbTkxYm1SR2RXNWpLU2tnY21WMGRYSnVJSE52ZFhKalpVWjFibU11WVhCd2JIa29ZMjl1ZEdWNGRDd2dZWEpuY3lrN1hHNGdJQ0FnZG1GeUlITmxiR1lnUFNCaVlYTmxRM0psWVhSbEtITnZkWEpqWlVaMWJtTXVjSEp2ZEc5MGVYQmxLVHRjYmlBZ0lDQjJZWElnY21WemRXeDBJRDBnYzI5MWNtTmxSblZ1WXk1aGNIQnNlU2h6Wld4bUxDQmhjbWR6S1R0Y2JpQWdJQ0JwWmlBb1h5NXBjMDlpYW1WamRDaHlaWE4xYkhRcEtTQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQWdJSEpsZEhWeWJpQnpaV3htTzF4dUlDQjlPMXh1WEc0Z0lDOHZJRU55WldGMFpTQmhJR1oxYm1OMGFXOXVJR0p2ZFc1a0lIUnZJR0VnWjJsMlpXNGdiMkpxWldOMElDaGhjM05wWjI1cGJtY2dZSFJvYVhOZ0xDQmhibVFnWVhKbmRXMWxiblJ6TEZ4dUlDQXZMeUJ2Y0hScGIyNWhiR3g1S1M0Z1JHVnNaV2RoZEdWeklIUnZJQ29xUlVOTlFWTmpjbWx3ZENBMUtpb25jeUJ1WVhScGRtVWdZRVoxYm1OMGFXOXVMbUpwYm1SZ0lHbG1YRzRnSUM4dklHRjJZV2xzWVdKc1pTNWNiaUFnWHk1aWFXNWtJRDBnY21WemRFRnlaM1Z0Wlc1MGN5aG1kVzVqZEdsdmJpaG1kVzVqTENCamIyNTBaWGgwTENCaGNtZHpLU0I3WEc0Z0lDQWdhV1lnS0NGZkxtbHpSblZ1WTNScGIyNG9ablZ1WXlrcElIUm9jbTkzSUc1bGR5QlVlWEJsUlhKeWIzSW9KMEpwYm1RZ2JYVnpkQ0JpWlNCallXeHNaV1FnYjI0Z1lTQm1kVzVqZEdsdmJpY3BPMXh1SUNBZ0lIWmhjaUJpYjNWdVpDQTlJSEpsYzNSQmNtZDFiV1Z1ZEhNb1puVnVZM1JwYjI0b1kyRnNiRUZ5WjNNcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbGVHVmpkWFJsUW05MWJtUW9ablZ1WXl3Z1ltOTFibVFzSUdOdmJuUmxlSFFzSUhSb2FYTXNJR0Z5WjNNdVkyOXVZMkYwS0dOaGJHeEJjbWR6S1NrN1hHNGdJQ0FnZlNrN1hHNGdJQ0FnY21WMGRYSnVJR0p2ZFc1a08xeHVJQ0I5S1R0Y2JseHVJQ0F2THlCUVlYSjBhV0ZzYkhrZ1lYQndiSGtnWVNCbWRXNWpkR2x2YmlCaWVTQmpjbVZoZEdsdVp5QmhJSFpsY25OcGIyNGdkR2hoZENCb1lYTWdhR0ZrSUhOdmJXVWdiMllnYVhSelhHNGdJQzh2SUdGeVozVnRaVzUwY3lCd2NtVXRabWxzYkdWa0xDQjNhWFJvYjNWMElHTm9ZVzVuYVc1bklHbDBjeUJrZVc1aGJXbGpJR0IwYUdsellDQmpiMjUwWlhoMExpQmZJR0ZqZEhOY2JpQWdMeThnWVhNZ1lTQndiR0ZqWldodmJHUmxjaUJpZVNCa1pXWmhkV3gwTENCaGJHeHZkMmx1WnlCaGJua2dZMjl0WW1sdVlYUnBiMjRnYjJZZ1lYSm5kVzFsYm5SeklIUnZJR0psWEc0Z0lDOHZJSEJ5WlMxbWFXeHNaV1F1SUZObGRDQmdYeTV3WVhKMGFXRnNMbkJzWVdObGFHOXNaR1Z5WUNCbWIzSWdZU0JqZFhOMGIyMGdjR3hoWTJWb2IyeGtaWElnWVhKbmRXMWxiblF1WEc0Z0lGOHVjR0Z5ZEdsaGJDQTlJSEpsYzNSQmNtZDFiV1Z1ZEhNb1puVnVZM1JwYjI0b1puVnVZeXdnWW05MWJtUkJjbWR6S1NCN1hHNGdJQ0FnZG1GeUlIQnNZV05sYUc5c1pHVnlJRDBnWHk1d1lYSjBhV0ZzTG5Cc1lXTmxhRzlzWkdWeU8xeHVJQ0FnSUhaaGNpQmliM1Z1WkNBOUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lDQWdkbUZ5SUhCdmMybDBhVzl1SUQwZ01Dd2diR1Z1WjNSb0lEMGdZbTkxYm1SQmNtZHpMbXhsYm1kMGFEdGNiaUFnSUNBZ0lIWmhjaUJoY21keklEMGdRWEp5WVhrb2JHVnVaM1JvS1R0Y2JpQWdJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z2JHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnWVhKbmMxdHBYU0E5SUdKdmRXNWtRWEpuYzF0cFhTQTlQVDBnY0d4aFkyVm9iMnhrWlhJZ1B5QmhjbWQxYldWdWRITmJjRzl6YVhScGIyNHJLMTBnT2lCaWIzVnVaRUZ5WjNOYmFWMDdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQjNhR2xzWlNBb2NHOXphWFJwYjI0Z1BDQmhjbWQxYldWdWRITXViR1Z1WjNSb0tTQmhjbWR6TG5CMWMyZ29ZWEpuZFcxbGJuUnpXM0J2YzJsMGFXOXVLeXRkS1R0Y2JpQWdJQ0FnSUhKbGRIVnliaUJsZUdWamRYUmxRbTkxYm1Rb1puVnVZeXdnWW05MWJtUXNJSFJvYVhNc0lIUm9hWE1zSUdGeVozTXBPMXh1SUNBZ0lIMDdYRzRnSUNBZ2NtVjBkWEp1SUdKdmRXNWtPMXh1SUNCOUtUdGNibHh1SUNCZkxuQmhjblJwWVd3dWNHeGhZMlZvYjJ4a1pYSWdQU0JmTzF4dVhHNGdJQzh2SUVKcGJtUWdZU0J1ZFcxaVpYSWdiMllnWVc0Z2IySnFaV04wSjNNZ2JXVjBhRzlrY3lCMGJ5QjBhR0YwSUc5aWFtVmpkQzRnVW1WdFlXbHVhVzVuSUdGeVozVnRaVzUwYzF4dUlDQXZMeUJoY21VZ2RHaGxJRzFsZEdodlpDQnVZVzFsY3lCMGJ5QmlaU0JpYjNWdVpDNGdWWE5sWm5Wc0lHWnZjaUJsYm5OMWNtbHVaeUIwYUdGMElHRnNiQ0JqWVd4c1ltRmphM05jYmlBZ0x5OGdaR1ZtYVc1bFpDQnZiaUJoYmlCdlltcGxZM1FnWW1Wc2IyNW5JSFJ2SUdsMExseHVJQ0JmTG1KcGJtUkJiR3dnUFNCeVpYTjBRWEpuZFcxbGJuUnpLR1oxYm1OMGFXOXVLRzlpYWl3Z2EyVjVjeWtnZTF4dUlDQWdJR3RsZVhNZ1BTQm1iR0YwZEdWdUtHdGxlWE1zSUdaaGJITmxMQ0JtWVd4elpTazdYRzRnSUNBZ2RtRnlJR2x1WkdWNElEMGdhMlY1Y3k1c1pXNW5kR2c3WEc0Z0lDQWdhV1lnS0dsdVpHVjRJRHdnTVNrZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkaWFXNWtRV3hzSUcxMWMzUWdZbVVnY0dGemMyVmtJR1oxYm1OMGFXOXVJRzVoYldWekp5azdYRzRnSUNBZ2QyaHBiR1VnS0dsdVpHVjRMUzBwSUh0Y2JpQWdJQ0FnSUhaaGNpQnJaWGtnUFNCclpYbHpXMmx1WkdWNFhUdGNiaUFnSUNBZ0lHOWlhbHRyWlhsZElEMGdYeTVpYVc1a0tHOWlhbHRyWlhsZExDQnZZbW9wTzF4dUlDQWdJSDFjYmlBZ2ZTazdYRzVjYmlBZ0x5OGdUV1Z0YjJsNlpTQmhiaUJsZUhCbGJuTnBkbVVnWm5WdVkzUnBiMjRnWW5rZ2MzUnZjbWx1WnlCcGRITWdjbVZ6ZFd4MGN5NWNiaUFnWHk1dFpXMXZhWHBsSUQwZ1puVnVZM1JwYjI0b1puVnVZeXdnYUdGemFHVnlLU0I3WEc0Z0lDQWdkbUZ5SUcxbGJXOXBlbVVnUFNCbWRXNWpkR2x2YmloclpYa3BJSHRjYmlBZ0lDQWdJSFpoY2lCallXTm9aU0E5SUcxbGJXOXBlbVV1WTJGamFHVTdYRzRnSUNBZ0lDQjJZWElnWVdSa2NtVnpjeUE5SUNjbklDc2dLR2hoYzJobGNpQS9JR2hoYzJobGNpNWhjSEJzZVNoMGFHbHpMQ0JoY21kMWJXVnVkSE1wSURvZ2EyVjVLVHRjYmlBZ0lDQWdJR2xtSUNnaGFHRnpLR05oWTJobExDQmhaR1J5WlhOektTa2dZMkZqYUdWYllXUmtjbVZ6YzEwZ1BTQm1kVzVqTG1Gd2NHeDVLSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5azdYRzRnSUNBZ0lDQnlaWFIxY200Z1kyRmphR1ZiWVdSa2NtVnpjMTA3WEc0Z0lDQWdmVHRjYmlBZ0lDQnRaVzF2YVhwbExtTmhZMmhsSUQwZ2UzMDdYRzRnSUNBZ2NtVjBkWEp1SUcxbGJXOXBlbVU3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdSR1ZzWVhseklHRWdablZ1WTNScGIyNGdabTl5SUhSb1pTQm5hWFpsYmlCdWRXMWlaWElnYjJZZ2JXbHNiR2x6WldOdmJtUnpMQ0JoYm1RZ2RHaGxiaUJqWVd4c2MxeHVJQ0F2THlCcGRDQjNhWFJvSUhSb1pTQmhjbWQxYldWdWRITWdjM1Z3Y0d4cFpXUXVYRzRnSUY4dVpHVnNZWGtnUFNCeVpYTjBRWEpuZFcxbGJuUnpLR1oxYm1OMGFXOXVLR1oxYm1Nc0lIZGhhWFFzSUdGeVozTXBJSHRjYmlBZ0lDQnlaWFIxY200Z2MyVjBWR2x0Wlc5MWRDaG1kVzVqZEdsdmJpZ3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQm1kVzVqTG1Gd2NHeDVLRzUxYkd3c0lHRnlaM01wTzF4dUlDQWdJSDBzSUhkaGFYUXBPMXh1SUNCOUtUdGNibHh1SUNBdkx5QkVaV1psY25NZ1lTQm1kVzVqZEdsdmJpd2djMk5vWldSMWJHbHVaeUJwZENCMGJ5QnlkVzRnWVdaMFpYSWdkR2hsSUdOMWNuSmxiblFnWTJGc2JDQnpkR0ZqYXlCb1lYTmNiaUFnTHk4Z1kyeGxZWEpsWkM1Y2JpQWdYeTVrWldabGNpQTlJRjh1Y0dGeWRHbGhiQ2hmTG1SbGJHRjVMQ0JmTENBeEtUdGNibHh1SUNBdkx5QlNaWFIxY201eklHRWdablZ1WTNScGIyNHNJSFJvWVhRc0lIZG9aVzRnYVc1MmIydGxaQ3dnZDJsc2JDQnZibXg1SUdKbElIUnlhV2RuWlhKbFpDQmhkQ0J0YjNOMElHOXVZMlZjYmlBZ0x5OGdaSFZ5YVc1bklHRWdaMmwyWlc0Z2QybHVaRzkzSUc5bUlIUnBiV1V1SUU1dmNtMWhiR3g1TENCMGFHVWdkR2h5YjNSMGJHVmtJR1oxYm1OMGFXOXVJSGRwYkd3Z2NuVnVYRzRnSUM4dklHRnpJRzExWTJnZ1lYTWdhWFFnWTJGdUxDQjNhWFJvYjNWMElHVjJaWElnWjI5cGJtY2diVzl5WlNCMGFHRnVJRzl1WTJVZ2NHVnlJR0IzWVdsMFlDQmtkWEpoZEdsdmJqdGNiaUFnTHk4Z1luVjBJR2xtSUhsdmRTZGtJR3hwYTJVZ2RHOGdaR2x6WVdKc1pTQjBhR1VnWlhobFkzVjBhVzl1SUc5dUlIUm9aU0JzWldGa2FXNW5JR1ZrWjJVc0lIQmhjM05jYmlBZ0x5OGdZSHRzWldGa2FXNW5PaUJtWVd4elpYMWdMaUJVYnlCa2FYTmhZbXhsSUdWNFpXTjFkR2x2YmlCdmJpQjBhR1VnZEhKaGFXeHBibWNnWldSblpTd2daR2wwZEc4dVhHNGdJRjh1ZEdoeWIzUjBiR1VnUFNCbWRXNWpkR2x2YmlobWRXNWpMQ0IzWVdsMExDQnZjSFJwYjI1ektTQjdYRzRnSUNBZ2RtRnlJSFJwYldWdmRYUXNJR052Ym5SbGVIUXNJR0Z5WjNNc0lISmxjM1ZzZER0Y2JpQWdJQ0IyWVhJZ2NISmxkbWx2ZFhNZ1BTQXdPMXh1SUNBZ0lHbG1JQ2doYjNCMGFXOXVjeWtnYjNCMGFXOXVjeUE5SUh0OU8xeHVYRzRnSUNBZ2RtRnlJR3hoZEdWeUlEMGdablZ1WTNScGIyNG9LU0I3WEc0Z0lDQWdJQ0J3Y21WMmFXOTFjeUE5SUc5d2RHbHZibk11YkdWaFpHbHVaeUE5UFQwZ1ptRnNjMlVnUHlBd0lEb2dYeTV1YjNjb0tUdGNiaUFnSUNBZ0lIUnBiV1Z2ZFhRZ1BTQnVkV3hzTzF4dUlDQWdJQ0FnY21WemRXeDBJRDBnWm5WdVl5NWhjSEJzZVNoamIyNTBaWGgwTENCaGNtZHpLVHRjYmlBZ0lDQWdJR2xtSUNnaGRHbHRaVzkxZENrZ1kyOXVkR1Y0ZENBOUlHRnlaM01nUFNCdWRXeHNPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQjJZWElnZEdoeWIzUjBiR1ZrSUQwZ1puVnVZM1JwYjI0b0tTQjdYRzRnSUNBZ0lDQjJZWElnYm05M0lEMGdYeTV1YjNjb0tUdGNiaUFnSUNBZ0lHbG1JQ2doY0hKbGRtbHZkWE1nSmlZZ2IzQjBhVzl1Y3k1c1pXRmthVzVuSUQwOVBTQm1ZV3h6WlNrZ2NISmxkbWx2ZFhNZ1BTQnViM2M3WEc0Z0lDQWdJQ0IyWVhJZ2NtVnRZV2x1YVc1bklEMGdkMkZwZENBdElDaHViM2NnTFNCd2NtVjJhVzkxY3lrN1hHNGdJQ0FnSUNCamIyNTBaWGgwSUQwZ2RHaHBjenRjYmlBZ0lDQWdJR0Z5WjNNZ1BTQmhjbWQxYldWdWRITTdYRzRnSUNBZ0lDQnBaaUFvY21WdFlXbHVhVzVuSUR3OUlEQWdmSHdnY21WdFlXbHVhVzVuSUQ0Z2QyRnBkQ2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9kR2x0Wlc5MWRDa2dlMXh1SUNBZ0lDQWdJQ0FnSUdOc1pXRnlWR2x0Wlc5MWRDaDBhVzFsYjNWMEtUdGNiaUFnSUNBZ0lDQWdJQ0IwYVcxbGIzVjBJRDBnYm5Wc2JEdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0J3Y21WMmFXOTFjeUE5SUc1dmR6dGNiaUFnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdablZ1WXk1aGNIQnNlU2hqYjI1MFpYaDBMQ0JoY21kektUdGNiaUFnSUNBZ0lDQWdhV1lnS0NGMGFXMWxiM1YwS1NCamIyNTBaWGgwSUQwZ1lYSm5jeUE5SUc1MWJHdzdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLQ0YwYVcxbGIzVjBJQ1ltSUc5d2RHbHZibk11ZEhKaGFXeHBibWNnSVQwOUlHWmhiSE5sS1NCN1hHNGdJQ0FnSUNBZ0lIUnBiV1Z2ZFhRZ1BTQnpaWFJVYVcxbGIzVjBLR3hoZEdWeUxDQnlaVzFoYVc1cGJtY3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JpQWdJQ0I5TzF4dVhHNGdJQ0FnZEdoeWIzUjBiR1ZrTG1OaGJtTmxiQ0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ1kyeGxZWEpVYVcxbGIzVjBLSFJwYldWdmRYUXBPMXh1SUNBZ0lDQWdjSEpsZG1sdmRYTWdQU0F3TzF4dUlDQWdJQ0FnZEdsdFpXOTFkQ0E5SUdOdmJuUmxlSFFnUFNCaGNtZHpJRDBnYm5Wc2JEdGNiaUFnSUNCOU8xeHVYRzRnSUNBZ2NtVjBkWEp1SUhSb2NtOTBkR3hsWkR0Y2JpQWdmVHRjYmx4dUlDQXZMeUJTWlhSMWNtNXpJR0VnWm5WdVkzUnBiMjRzSUhSb1lYUXNJR0Z6SUd4dmJtY2dZWE1nYVhRZ1kyOXVkR2x1ZFdWeklIUnZJR0psSUdsdWRtOXJaV1FzSUhkcGJHd2dibTkwWEc0Z0lDOHZJR0psSUhSeWFXZG5aWEpsWkM0Z1ZHaGxJR1oxYm1OMGFXOXVJSGRwYkd3Z1ltVWdZMkZzYkdWa0lHRm1kR1Z5SUdsMElITjBiM0J6SUdKbGFXNW5JR05oYkd4bFpDQm1iM0pjYmlBZ0x5OGdUaUJ0YVd4c2FYTmxZMjl1WkhNdUlFbG1JR0JwYlcxbFpHbGhkR1ZnSUdseklIQmhjM05sWkN3Z2RISnBaMmRsY2lCMGFHVWdablZ1WTNScGIyNGdiMjRnZEdobFhHNGdJQzh2SUd4bFlXUnBibWNnWldSblpTd2dhVzV6ZEdWaFpDQnZaaUIwYUdVZ2RISmhhV3hwYm1jdVhHNGdJRjh1WkdWaWIzVnVZMlVnUFNCbWRXNWpkR2x2YmlobWRXNWpMQ0IzWVdsMExDQnBiVzFsWkdsaGRHVXBJSHRjYmlBZ0lDQjJZWElnZEdsdFpXOTFkQ3dnY21WemRXeDBPMXh1WEc0Z0lDQWdkbUZ5SUd4aGRHVnlJRDBnWm5WdVkzUnBiMjRvWTI5dWRHVjRkQ3dnWVhKbmN5a2dlMXh1SUNBZ0lDQWdkR2x0Wlc5MWRDQTlJRzUxYkd3N1hHNGdJQ0FnSUNCcFppQW9ZWEpuY3lrZ2NtVnpkV3gwSUQwZ1puVnVZeTVoY0hCc2VTaGpiMjUwWlhoMExDQmhjbWR6S1R0Y2JpQWdJQ0I5TzF4dVhHNGdJQ0FnZG1GeUlHUmxZbTkxYm1ObFpDQTlJSEpsYzNSQmNtZDFiV1Z1ZEhNb1puVnVZM1JwYjI0b1lYSm5jeWtnZTF4dUlDQWdJQ0FnYVdZZ0tIUnBiV1Z2ZFhRcElHTnNaV0Z5VkdsdFpXOTFkQ2gwYVcxbGIzVjBLVHRjYmlBZ0lDQWdJR2xtSUNocGJXMWxaR2xoZEdVcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdOaGJHeE9iM2NnUFNBaGRHbHRaVzkxZER0Y2JpQWdJQ0FnSUNBZ2RHbHRaVzkxZENBOUlITmxkRlJwYldWdmRYUW9iR0YwWlhJc0lIZGhhWFFwTzF4dUlDQWdJQ0FnSUNCcFppQW9ZMkZzYkU1dmR5a2djbVZ6ZFd4MElEMGdablZ1WXk1aGNIQnNlU2gwYUdsekxDQmhjbWR6S1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUhScGJXVnZkWFFnUFNCZkxtUmxiR0Y1S0d4aGRHVnlMQ0IzWVdsMExDQjBhR2x6TENCaGNtZHpLVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnSUNCOUtUdGNibHh1SUNBZ0lHUmxZbTkxYm1ObFpDNWpZVzVqWld3Z1BTQm1kVzVqZEdsdmJpZ3BJSHRjYmlBZ0lDQWdJR05zWldGeVZHbHRaVzkxZENoMGFXMWxiM1YwS1R0Y2JpQWdJQ0FnSUhScGJXVnZkWFFnUFNCdWRXeHNPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQnlaWFIxY200Z1pHVmliM1Z1WTJWa08xeHVJQ0I5TzF4dVhHNGdJQzh2SUZKbGRIVnlibk1nZEdobElHWnBjbk4wSUdaMWJtTjBhVzl1SUhCaGMzTmxaQ0JoY3lCaGJpQmhjbWQxYldWdWRDQjBieUIwYUdVZ2MyVmpiMjVrTEZ4dUlDQXZMeUJoYkd4dmQybHVaeUI1YjNVZ2RHOGdZV1JxZFhOMElHRnlaM1Z0Wlc1MGN5d2djblZ1SUdOdlpHVWdZbVZtYjNKbElHRnVaQ0JoWm5SbGNpd2dZVzVrWEc0Z0lDOHZJR052Ym1ScGRHbHZibUZzYkhrZ1pYaGxZM1YwWlNCMGFHVWdiM0pwWjJsdVlXd2dablZ1WTNScGIyNHVYRzRnSUY4dWQzSmhjQ0E5SUdaMWJtTjBhVzl1S0daMWJtTXNJSGR5WVhCd1pYSXBJSHRjYmlBZ0lDQnlaWFIxY200Z1h5NXdZWEowYVdGc0tIZHlZWEJ3WlhJc0lHWjFibU1wTzF4dUlDQjlPMXh1WEc0Z0lDOHZJRkpsZEhWeWJuTWdZU0J1WldkaGRHVmtJSFpsY25OcGIyNGdiMllnZEdobElIQmhjM05sWkMxcGJpQndjbVZrYVdOaGRHVXVYRzRnSUY4dWJtVm5ZWFJsSUQwZ1puVnVZM1JwYjI0b2NISmxaR2xqWVhSbEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUNGd2NtVmthV05oZEdVdVlYQndiSGtvZEdocGN5d2dZWEpuZFcxbGJuUnpLVHRjYmlBZ0lDQjlPMXh1SUNCOU8xeHVYRzRnSUM4dklGSmxkSFZ5Ym5NZ1lTQm1kVzVqZEdsdmJpQjBhR0YwSUdseklIUm9aU0JqYjIxd2IzTnBkR2x2YmlCdlppQmhJR3hwYzNRZ2IyWWdablZ1WTNScGIyNXpMQ0JsWVdOb1hHNGdJQzh2SUdOdmJuTjFiV2x1WnlCMGFHVWdjbVYwZFhKdUlIWmhiSFZsSUc5bUlIUm9aU0JtZFc1amRHbHZiaUIwYUdGMElHWnZiR3h2ZDNNdVhHNGdJRjh1WTI5dGNHOXpaU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUhaaGNpQmhjbWR6SUQwZ1lYSm5kVzFsYm5Sek8xeHVJQ0FnSUhaaGNpQnpkR0Z5ZENBOUlHRnlaM011YkdWdVozUm9JQzBnTVR0Y2JpQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9LU0I3WEc0Z0lDQWdJQ0IyWVhJZ2FTQTlJSE4wWVhKME8xeHVJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RDQTlJR0Z5WjNOYmMzUmhjblJkTG1Gd2NHeDVLSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5azdYRzRnSUNBZ0lDQjNhR2xzWlNBb2FTMHRLU0J5WlhOMWJIUWdQU0JoY21kelcybGRMbU5oYkd3b2RHaHBjeXdnY21WemRXeDBLVHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJQ0FnZlR0Y2JpQWdmVHRjYmx4dUlDQXZMeUJTWlhSMWNtNXpJR0VnWm5WdVkzUnBiMjRnZEdoaGRDQjNhV3hzSUc5dWJIa2dZbVVnWlhobFkzVjBaV1FnYjI0Z1lXNWtJR0ZtZEdWeUlIUm9aU0JPZEdnZ1kyRnNiQzVjYmlBZ1h5NWhablJsY2lBOUlHWjFibU4wYVc5dUtIUnBiV1Z6TENCbWRXNWpLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lDQWdhV1lnS0MwdGRHbHRaWE1nUENBeEtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQm1kVzVqTG1Gd2NHeDVLSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5azdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZUdGNiaUFnZlR0Y2JseHVJQ0F2THlCU1pYUjFjbTV6SUdFZ1puVnVZM1JwYjI0Z2RHaGhkQ0IzYVd4c0lHOXViSGtnWW1VZ1pYaGxZM1YwWldRZ2RYQWdkRzhnS0dKMWRDQnViM1FnYVc1amJIVmthVzVuS1NCMGFHVWdUblJvSUdOaGJHd3VYRzRnSUY4dVltVm1iM0psSUQwZ1puVnVZM1JwYjI0b2RHbHRaWE1zSUdaMWJtTXBJSHRjYmlBZ0lDQjJZWElnYldWdGJ6dGNiaUFnSUNCeVpYUjFjbTRnWm5WdVkzUnBiMjRvS1NCN1hHNGdJQ0FnSUNCcFppQW9MUzEwYVcxbGN5QStJREFwSUh0Y2JpQWdJQ0FnSUNBZ2JXVnRieUE5SUdaMWJtTXVZWEJ3Ykhrb2RHaHBjeXdnWVhKbmRXMWxiblJ6S1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdsbUlDaDBhVzFsY3lBOFBTQXhLU0JtZFc1aklEMGdiblZzYkR0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ0Wlcxdk8xeHVJQ0FnSUgwN1hHNGdJSDA3WEc1Y2JpQWdMeThnVW1WMGRYSnVjeUJoSUdaMWJtTjBhVzl1SUhSb1lYUWdkMmxzYkNCaVpTQmxlR1ZqZFhSbFpDQmhkQ0J0YjNOMElHOXVaU0IwYVcxbExDQnVieUJ0WVhSMFpYSWdhRzkzWEc0Z0lDOHZJRzltZEdWdUlIbHZkU0JqWVd4c0lHbDBMaUJWYzJWbWRXd2dabTl5SUd4aGVua2dhVzVwZEdsaGJHbDZZWFJwYjI0dVhHNGdJRjh1YjI1alpTQTlJRjh1Y0dGeWRHbGhiQ2hmTG1KbFptOXlaU3dnTWlrN1hHNWNiaUFnWHk1eVpYTjBRWEpuZFcxbGJuUnpJRDBnY21WemRFRnlaM1Z0Wlc1MGN6dGNibHh1SUNBdkx5QlBZbXBsWTNRZ1JuVnVZM1JwYjI1elhHNGdJQzh2SUMwdExTMHRMUzB0TFMwdExTMHRMUzFjYmx4dUlDQXZMeUJMWlhseklHbHVJRWxGSUR3Z09TQjBhR0YwSUhkdmJpZDBJR0psSUdsMFpYSmhkR1ZrSUdKNUlHQm1iM0lnYTJWNUlHbHVJQzR1TG1BZ1lXNWtJSFJvZFhNZ2JXbHpjMlZrTGx4dUlDQjJZWElnYUdGelJXNTFiVUoxWnlBOUlDRjdkRzlUZEhKcGJtYzZJRzUxYkd4OUxuQnliM0JsY25SNVNYTkZiblZ0WlhKaFlteGxLQ2QwYjFOMGNtbHVaeWNwTzF4dUlDQjJZWElnYm05dVJXNTFiV1Z5WVdKc1pWQnliM0J6SUQwZ1d5ZDJZV3gxWlU5bUp5d2dKMmx6VUhKdmRHOTBlWEJsVDJZbkxDQW5kRzlUZEhKcGJtY25MRnh1SUNBZ0lDZHdjbTl3WlhKMGVVbHpSVzUxYldWeVlXSnNaU2NzSUNkb1lYTlBkMjVRY205d1pYSjBlU2NzSUNkMGIweHZZMkZzWlZOMGNtbHVaeWRkTzF4dVhHNGdJSFpoY2lCamIyeHNaV04wVG05dVJXNTFiVkJ5YjNCeklEMGdablZ1WTNScGIyNG9iMkpxTENCclpYbHpLU0I3WEc0Z0lDQWdkbUZ5SUc1dmJrVnVkVzFKWkhnZ1BTQnViMjVGYm5WdFpYSmhZbXhsVUhKdmNITXViR1Z1WjNSb08xeHVJQ0FnSUhaaGNpQmpiMjV6ZEhKMVkzUnZjaUE5SUc5aWFpNWpiMjV6ZEhKMVkzUnZjanRjYmlBZ0lDQjJZWElnY0hKdmRHOGdQU0JmTG1selJuVnVZM1JwYjI0b1kyOXVjM1J5ZFdOMGIzSXBJQ1ltSUdOdmJuTjBjblZqZEc5eUxuQnliM1J2ZEhsd1pTQjhmQ0JQWW1wUWNtOTBienRjYmx4dUlDQWdJQzh2SUVOdmJuTjBjblZqZEc5eUlHbHpJR0VnYzNCbFkybGhiQ0JqWVhObExseHVJQ0FnSUhaaGNpQndjbTl3SUQwZ0oyTnZibk4wY25WamRHOXlKenRjYmlBZ0lDQnBaaUFvYUdGektHOWlhaXdnY0hKdmNDa2dKaVlnSVY4dVkyOXVkR0ZwYm5Nb2EyVjVjeXdnY0hKdmNDa3BJR3RsZVhNdWNIVnphQ2h3Y205d0tUdGNibHh1SUNBZ0lIZG9hV3hsSUNodWIyNUZiblZ0U1dSNExTMHBJSHRjYmlBZ0lDQWdJSEJ5YjNBZ1BTQnViMjVGYm5WdFpYSmhZbXhsVUhKdmNITmJibTl1Ulc1MWJVbGtlRjA3WEc0Z0lDQWdJQ0JwWmlBb2NISnZjQ0JwYmlCdlltb2dKaVlnYjJKcVczQnliM0JkSUNFOVBTQndjbTkwYjF0d2NtOXdYU0FtSmlBaFh5NWpiMjUwWVdsdWN5aHJaWGx6TENCd2NtOXdLU2tnZTF4dUlDQWdJQ0FnSUNCclpYbHpMbkIxYzJnb2NISnZjQ2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOU8xeHVYRzRnSUM4dklGSmxkSEpwWlhabElIUm9aU0J1WVcxbGN5QnZaaUJoYmlCdlltcGxZM1FuY3lCdmQyNGdjSEp2Y0dWeWRHbGxjeTVjYmlBZ0x5OGdSR1ZzWldkaGRHVnpJSFJ2SUNvcVJVTk5RVk5qY21sd2RDQTFLaW9uY3lCdVlYUnBkbVVnWUU5aWFtVmpkQzVyWlhsellDNWNiaUFnWHk1clpYbHpJRDBnWm5WdVkzUnBiMjRvYjJKcUtTQjdYRzRnSUNBZ2FXWWdLQ0ZmTG1selQySnFaV04wS0c5aWFpa3BJSEpsZEhWeWJpQmJYVHRjYmlBZ0lDQnBaaUFvYm1GMGFYWmxTMlY1Y3lrZ2NtVjBkWEp1SUc1aGRHbDJaVXRsZVhNb2IySnFLVHRjYmlBZ0lDQjJZWElnYTJWNWN5QTlJRnRkTzF4dUlDQWdJR1p2Y2lBb2RtRnlJR3RsZVNCcGJpQnZZbW9wSUdsbUlDaG9ZWE1vYjJKcUxDQnJaWGtwS1NCclpYbHpMbkIxYzJnb2EyVjVLVHRjYmlBZ0lDQXZMeUJCYUdWdExDQkpSU0E4SURrdVhHNGdJQ0FnYVdZZ0tHaGhjMFZ1ZFcxQ2RXY3BJR052Ykd4bFkzUk9iMjVGYm5WdFVISnZjSE1vYjJKcUxDQnJaWGx6S1R0Y2JpQWdJQ0J5WlhSMWNtNGdhMlY1Y3p0Y2JpQWdmVHRjYmx4dUlDQXZMeUJTWlhSeWFXVjJaU0JoYkd3Z2RHaGxJSEJ5YjNCbGNuUjVJRzVoYldWeklHOW1JR0Z1SUc5aWFtVmpkQzVjYmlBZ1h5NWhiR3hMWlhseklEMGdablZ1WTNScGIyNG9iMkpxS1NCN1hHNGdJQ0FnYVdZZ0tDRmZMbWx6VDJKcVpXTjBLRzlpYWlrcElISmxkSFZ5YmlCYlhUdGNiaUFnSUNCMllYSWdhMlY1Y3lBOUlGdGRPMXh1SUNBZ0lHWnZjaUFvZG1GeUlHdGxlU0JwYmlCdlltb3BJR3RsZVhNdWNIVnphQ2hyWlhrcE8xeHVJQ0FnSUM4dklFRm9aVzBzSUVsRklEd2dPUzVjYmlBZ0lDQnBaaUFvYUdGelJXNTFiVUoxWnlrZ1kyOXNiR1ZqZEU1dmJrVnVkVzFRY205d2N5aHZZbW9zSUd0bGVYTXBPMXh1SUNBZ0lISmxkSFZ5YmlCclpYbHpPMXh1SUNCOU8xeHVYRzRnSUM4dklGSmxkSEpwWlhabElIUm9aU0IyWVd4MVpYTWdiMllnWVc0Z2IySnFaV04wSjNNZ2NISnZjR1Z5ZEdsbGN5NWNiaUFnWHk1MllXeDFaWE1nUFNCbWRXNWpkR2x2Ymlodlltb3BJSHRjYmlBZ0lDQjJZWElnYTJWNWN5QTlJRjh1YTJWNWN5aHZZbW9wTzF4dUlDQWdJSFpoY2lCc1pXNW5kR2dnUFNCclpYbHpMbXhsYm1kMGFEdGNiaUFnSUNCMllYSWdkbUZzZFdWeklEMGdRWEp5WVhrb2JHVnVaM1JvS1R0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQjJZV3gxWlhOYmFWMGdQU0J2WW1wYmEyVjVjMXRwWFYwN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQjJZV3gxWlhNN1hHNGdJSDA3WEc1Y2JpQWdMeThnVW1WMGRYSnVjeUIwYUdVZ2NtVnpkV3gwY3lCdlppQmhjSEJzZVdsdVp5QjBhR1VnYVhSbGNtRjBaV1VnZEc4Z1pXRmphQ0JsYkdWdFpXNTBJRzltSUhSb1pTQnZZbXBsWTNRdVhHNGdJQzh2SUVsdUlHTnZiblJ5WVhOMElIUnZJRjh1YldGd0lHbDBJSEpsZEhWeWJuTWdZVzRnYjJKcVpXTjBMbHh1SUNCZkxtMWhjRTlpYW1WamRDQTlJR1oxYm1OMGFXOXVLRzlpYWl3Z2FYUmxjbUYwWldVc0lHTnZiblJsZUhRcElIdGNiaUFnSUNCcGRHVnlZWFJsWlNBOUlHTmlLR2wwWlhKaGRHVmxMQ0JqYjI1MFpYaDBLVHRjYmlBZ0lDQjJZWElnYTJWNWN5QTlJRjh1YTJWNWN5aHZZbW9wTEZ4dUlDQWdJQ0FnSUNCc1pXNW5kR2dnUFNCclpYbHpMbXhsYm1kMGFDeGNiaUFnSUNBZ0lDQWdjbVZ6ZFd4MGN5QTlJSHQ5TzF4dUlDQWdJR1p2Y2lBb2RtRnlJR2x1WkdWNElEMGdNRHNnYVc1a1pYZ2dQQ0JzWlc1bmRHZzdJR2x1WkdWNEt5c3BJSHRjYmlBZ0lDQWdJSFpoY2lCamRYSnlaVzUwUzJWNUlEMGdhMlY1YzF0cGJtUmxlRjA3WEc0Z0lDQWdJQ0J5WlhOMWJIUnpXMk4xY25KbGJuUkxaWGxkSUQwZ2FYUmxjbUYwWldVb2IySnFXMk4xY25KbGJuUkxaWGxkTENCamRYSnlaVzUwUzJWNUxDQnZZbW9wTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2NtVnpkV3gwY3p0Y2JpQWdmVHRjYmx4dUlDQXZMeUJEYjI1MlpYSjBJR0Z1SUc5aWFtVmpkQ0JwYm5SdklHRWdiR2x6ZENCdlppQmdXMnRsZVN3Z2RtRnNkV1ZkWUNCd1lXbHljeTVjYmlBZ0x5OGdWR2hsSUc5d2NHOXphWFJsSUc5bUlGOHViMkpxWldOMExseHVJQ0JmTG5CaGFYSnpJRDBnWm5WdVkzUnBiMjRvYjJKcUtTQjdYRzRnSUNBZ2RtRnlJR3RsZVhNZ1BTQmZMbXRsZVhNb2IySnFLVHRjYmlBZ0lDQjJZWElnYkdWdVozUm9JRDBnYTJWNWN5NXNaVzVuZEdnN1hHNGdJQ0FnZG1GeUlIQmhhWEp6SUQwZ1FYSnlZWGtvYkdWdVozUm9LVHRjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCd1lXbHljMXRwWFNBOUlGdHJaWGx6VzJsZExDQnZZbXBiYTJWNWMxdHBYVjFkTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2NHRnBjbk03WEc0Z0lIMDdYRzVjYmlBZ0x5OGdTVzUyWlhKMElIUm9aU0JyWlhseklHRnVaQ0IyWVd4MVpYTWdiMllnWVc0Z2IySnFaV04wTGlCVWFHVWdkbUZzZFdWeklHMTFjM1FnWW1VZ2MyVnlhV0ZzYVhwaFlteGxMbHh1SUNCZkxtbHVkbVZ5ZENBOUlHWjFibU4wYVc5dUtHOWlhaWtnZTF4dUlDQWdJSFpoY2lCeVpYTjFiSFFnUFNCN2ZUdGNiaUFnSUNCMllYSWdhMlY1Y3lBOUlGOHVhMlY1Y3lodlltb3BPMXh1SUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0F3TENCc1pXNW5kR2dnUFNCclpYbHpMbXhsYm1kMGFEc2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQnlaWE4xYkhSYmIySnFXMnRsZVhOYmFWMWRYU0E5SUd0bGVYTmJhVjA3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCeVpYTjFiSFE3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdVbVYwZFhKdUlHRWdjMjl5ZEdWa0lHeHBjM1FnYjJZZ2RHaGxJR1oxYm1OMGFXOXVJRzVoYldWeklHRjJZV2xzWVdKc1pTQnZiaUIwYUdVZ2IySnFaV04wTGx4dUlDQXZMeUJCYkdsaGMyVmtJR0Z6SUdCdFpYUm9iMlJ6WUM1Y2JpQWdYeTVtZFc1amRHbHZibk1nUFNCZkxtMWxkR2h2WkhNZ1BTQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0IyWVhJZ2JtRnRaWE1nUFNCYlhUdGNiaUFnSUNCbWIzSWdLSFpoY2lCclpYa2dhVzRnYjJKcUtTQjdYRzRnSUNBZ0lDQnBaaUFvWHk1cGMwWjFibU4wYVc5dUtHOWlhbHRyWlhsZEtTa2dibUZ0WlhNdWNIVnphQ2hyWlhrcE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdibUZ0WlhNdWMyOXlkQ2dwTzF4dUlDQjlPMXh1WEc0Z0lDOHZJRUZ1SUdsdWRHVnlibUZzSUdaMWJtTjBhVzl1SUdadmNpQmpjbVZoZEdsdVp5QmhjM05wWjI1bGNpQm1kVzVqZEdsdmJuTXVYRzRnSUhaaGNpQmpjbVZoZEdWQmMzTnBaMjVsY2lBOUlHWjFibU4wYVc5dUtHdGxlWE5HZFc1akxDQmtaV1poZFd4MGN5a2dlMXh1SUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2Ymlodlltb3BJSHRjYmlBZ0lDQWdJSFpoY2lCc1pXNW5kR2dnUFNCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvTzF4dUlDQWdJQ0FnYVdZZ0tHUmxabUYxYkhSektTQnZZbW9nUFNCUFltcGxZM1FvYjJKcUtUdGNiaUFnSUNBZ0lHbG1JQ2hzWlc1bmRHZ2dQQ0F5SUh4OElHOWlhaUE5UFNCdWRXeHNLU0J5WlhSMWNtNGdiMkpxTzF4dUlDQWdJQ0FnWm05eUlDaDJZWElnYVc1a1pYZ2dQU0F4T3lCcGJtUmxlQ0E4SUd4bGJtZDBhRHNnYVc1a1pYZ3JLeWtnZTF4dUlDQWdJQ0FnSUNCMllYSWdjMjkxY21ObElEMGdZWEpuZFcxbGJuUnpXMmx1WkdWNFhTeGNiaUFnSUNBZ0lDQWdJQ0FnSUd0bGVYTWdQU0JyWlhselJuVnVZeWh6YjNWeVkyVXBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2JDQTlJR3RsZVhNdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHdzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJSFpoY2lCclpYa2dQU0JyWlhselcybGRPMXh1SUNBZ0lDQWdJQ0FnSUdsbUlDZ2haR1ZtWVhWc2RITWdmSHdnYjJKcVcydGxlVjBnUFQwOUlIWnZhV1FnTUNrZ2IySnFXMnRsZVYwZ1BTQnpiM1Z5WTJWYmEyVjVYVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnY21WMGRYSnVJRzlpYWp0Y2JpQWdJQ0I5TzF4dUlDQjlPMXh1WEc0Z0lDOHZJRVY0ZEdWdVpDQmhJR2RwZG1WdUlHOWlhbVZqZENCM2FYUm9JR0ZzYkNCMGFHVWdjSEp2Y0dWeWRHbGxjeUJwYmlCd1lYTnpaV1F0YVc0Z2IySnFaV04wS0hNcExseHVJQ0JmTG1WNGRHVnVaQ0E5SUdOeVpXRjBaVUZ6YzJsbmJtVnlLRjh1WVd4c1MyVjVjeWs3WEc1Y2JpQWdMeThnUVhOemFXZHVjeUJoSUdkcGRtVnVJRzlpYW1WamRDQjNhWFJvSUdGc2JDQjBhR1VnYjNkdUlIQnliM0JsY25ScFpYTWdhVzRnZEdobElIQmhjM05sWkMxcGJpQnZZbXBsWTNRb2N5a3VYRzRnSUM4dklDaG9kSFJ3Y3pvdkwyUmxkbVZzYjNCbGNpNXRiM3BwYkd4aExtOXlaeTlrYjJOekwxZGxZaTlLWVhaaFUyTnlhWEIwTDFKbFptVnlaVzVqWlM5SGJHOWlZV3hmVDJKcVpXTjBjeTlQWW1wbFkzUXZZWE56YVdkdUtWeHVJQ0JmTG1WNGRHVnVaRTkzYmlBOUlGOHVZWE56YVdkdUlEMGdZM0psWVhSbFFYTnphV2R1WlhJb1h5NXJaWGx6S1R0Y2JseHVJQ0F2THlCU1pYUjFjbTV6SUhSb1pTQm1hWEp6ZENCclpYa2diMjRnWVc0Z2IySnFaV04wSUhSb1lYUWdjR0Z6YzJWeklHRWdjSEpsWkdsallYUmxJSFJsYzNRdVhHNGdJRjh1Wm1sdVpFdGxlU0E5SUdaMWJtTjBhVzl1S0c5aWFpd2djSEpsWkdsallYUmxMQ0JqYjI1MFpYaDBLU0I3WEc0Z0lDQWdjSEpsWkdsallYUmxJRDBnWTJJb2NISmxaR2xqWVhSbExDQmpiMjUwWlhoMEtUdGNiaUFnSUNCMllYSWdhMlY1Y3lBOUlGOHVhMlY1Y3lodlltb3BMQ0JyWlhrN1hHNGdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQXNJR3hsYm1kMGFDQTlJR3RsZVhNdWJHVnVaM1JvT3lCcElEd2diR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUd0bGVTQTlJR3RsZVhOYmFWMDdYRzRnSUNBZ0lDQnBaaUFvY0hKbFpHbGpZWFJsS0c5aWFsdHJaWGxkTENCclpYa3NJRzlpYWlrcElISmxkSFZ5YmlCclpYazdYRzRnSUNBZ2ZWeHVJQ0I5TzF4dVhHNGdJQzh2SUVsdWRHVnlibUZzSUhCcFkyc2dhR1ZzY0dWeUlHWjFibU4wYVc5dUlIUnZJR1JsZEdWeWJXbHVaU0JwWmlCZ2IySnFZQ0JvWVhNZ2EyVjVJR0JyWlhsZ0xseHVJQ0IyWVhJZ2EyVjVTVzVQWW1vZ1BTQm1kVzVqZEdsdmJpaDJZV3gxWlN3Z2EyVjVMQ0J2WW1vcElIdGNiaUFnSUNCeVpYUjFjbTRnYTJWNUlHbHVJRzlpYWp0Y2JpQWdmVHRjYmx4dUlDQXZMeUJTWlhSMWNtNGdZU0JqYjNCNUlHOW1JSFJvWlNCdlltcGxZM1FnYjI1c2VTQmpiMjUwWVdsdWFXNW5JSFJvWlNCM2FHbDBaV3hwYzNSbFpDQndjbTl3WlhKMGFXVnpMbHh1SUNCZkxuQnBZMnNnUFNCeVpYTjBRWEpuZFcxbGJuUnpLR1oxYm1OMGFXOXVLRzlpYWl3Z2EyVjVjeWtnZTF4dUlDQWdJSFpoY2lCeVpYTjFiSFFnUFNCN2ZTd2dhWFJsY21GMFpXVWdQU0JyWlhseld6QmRPMXh1SUNBZ0lHbG1JQ2h2WW1vZ1BUMGdiblZzYkNrZ2NtVjBkWEp1SUhKbGMzVnNkRHRjYmlBZ0lDQnBaaUFvWHk1cGMwWjFibU4wYVc5dUtHbDBaWEpoZEdWbEtTa2dlMXh1SUNBZ0lDQWdhV1lnS0d0bGVYTXViR1Z1WjNSb0lENGdNU2tnYVhSbGNtRjBaV1VnUFNCdmNIUnBiV2w2WlVOaUtHbDBaWEpoZEdWbExDQnJaWGx6V3pGZEtUdGNiaUFnSUNBZ0lHdGxlWE1nUFNCZkxtRnNiRXRsZVhNb2IySnFLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2FYUmxjbUYwWldVZ1BTQnJaWGxKYms5aWFqdGNiaUFnSUNBZ0lHdGxlWE1nUFNCbWJHRjBkR1Z1S0d0bGVYTXNJR1poYkhObExDQm1ZV3h6WlNrN1hHNGdJQ0FnSUNCdlltb2dQU0JQWW1wbFkzUW9iMkpxS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdabTl5SUNoMllYSWdhU0E5SURBc0lHeGxibWQwYUNBOUlHdGxlWE11YkdWdVozUm9PeUJwSUR3Z2JHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJSFpoY2lCclpYa2dQU0JyWlhselcybGRPMXh1SUNBZ0lDQWdkbUZ5SUhaaGJIVmxJRDBnYjJKcVcydGxlVjA3WEc0Z0lDQWdJQ0JwWmlBb2FYUmxjbUYwWldVb2RtRnNkV1VzSUd0bGVTd2diMkpxS1NrZ2NtVnpkV3gwVzJ0bGVWMGdQU0IyWVd4MVpUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnZlNrN1hHNWNiaUFnTHk4Z1VtVjBkWEp1SUdFZ1kyOXdlU0J2WmlCMGFHVWdiMkpxWldOMElIZHBkR2h2ZFhRZ2RHaGxJR0pzWVdOcmJHbHpkR1ZrSUhCeWIzQmxjblJwWlhNdVhHNGdJRjh1YjIxcGRDQTlJSEpsYzNSQmNtZDFiV1Z1ZEhNb1puVnVZM1JwYjI0b2IySnFMQ0JyWlhsektTQjdYRzRnSUNBZ2RtRnlJR2wwWlhKaGRHVmxJRDBnYTJWNWMxc3dYU3dnWTI5dWRHVjRkRHRjYmlBZ0lDQnBaaUFvWHk1cGMwWjFibU4wYVc5dUtHbDBaWEpoZEdWbEtTa2dlMXh1SUNBZ0lDQWdhWFJsY21GMFpXVWdQU0JmTG01bFoyRjBaU2hwZEdWeVlYUmxaU2s3WEc0Z0lDQWdJQ0JwWmlBb2EyVjVjeTVzWlc1bmRHZ2dQaUF4S1NCamIyNTBaWGgwSUQwZ2EyVjVjMXN4WFR0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdhMlY1Y3lBOUlGOHViV0Z3S0dac1lYUjBaVzRvYTJWNWN5d2dabUZzYzJVc0lHWmhiSE5sS1N3Z1UzUnlhVzVuS1R0Y2JpQWdJQ0FnSUdsMFpYSmhkR1ZsSUQwZ1puVnVZM1JwYjI0b2RtRnNkV1VzSUd0bGVTa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdJVjh1WTI5dWRHRnBibk1vYTJWNWN5d2dhMlY1S1R0Y2JpQWdJQ0FnSUgwN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQmZMbkJwWTJzb2IySnFMQ0JwZEdWeVlYUmxaU3dnWTI5dWRHVjRkQ2s3WEc0Z0lIMHBPMXh1WEc0Z0lDOHZJRVpwYkd3Z2FXNGdZU0JuYVhabGJpQnZZbXBsWTNRZ2QybDBhQ0JrWldaaGRXeDBJSEJ5YjNCbGNuUnBaWE11WEc0Z0lGOHVaR1ZtWVhWc2RITWdQU0JqY21WaGRHVkJjM05wWjI1bGNpaGZMbUZzYkV0bGVYTXNJSFJ5ZFdVcE8xeHVYRzRnSUM4dklFTnlaV0YwWlhNZ1lXNGdiMkpxWldOMElIUm9ZWFFnYVc1b1pYSnBkSE1nWm5KdmJTQjBhR1VnWjJsMlpXNGdjSEp2ZEc5MGVYQmxJRzlpYW1WamRDNWNiaUFnTHk4Z1NXWWdZV1JrYVhScGIyNWhiQ0J3Y205d1pYSjBhV1Z6SUdGeVpTQndjbTkyYVdSbFpDQjBhR1Z1SUhSb1pYa2dkMmxzYkNCaVpTQmhaR1JsWkNCMGJ5QjBhR1ZjYmlBZ0x5OGdZM0psWVhSbFpDQnZZbXBsWTNRdVhHNGdJRjh1WTNKbFlYUmxJRDBnWm5WdVkzUnBiMjRvY0hKdmRHOTBlWEJsTENCd2NtOXdjeWtnZTF4dUlDQWdJSFpoY2lCeVpYTjFiSFFnUFNCaVlYTmxRM0psWVhSbEtIQnliM1J2ZEhsd1pTazdYRzRnSUNBZ2FXWWdLSEJ5YjNCektTQmZMbVY0ZEdWdVpFOTNiaWh5WlhOMWJIUXNJSEJ5YjNCektUdGNiaUFnSUNCeVpYUjFjbTRnY21WemRXeDBPMXh1SUNCOU8xeHVYRzRnSUM4dklFTnlaV0YwWlNCaElDaHphR0ZzYkc5M0xXTnNiMjVsWkNrZ1pIVndiR2xqWVhSbElHOW1JR0Z1SUc5aWFtVmpkQzVjYmlBZ1h5NWpiRzl1WlNBOUlHWjFibU4wYVc5dUtHOWlhaWtnZTF4dUlDQWdJR2xtSUNnaFh5NXBjMDlpYW1WamRDaHZZbW9wS1NCeVpYUjFjbTRnYjJKcU8xeHVJQ0FnSUhKbGRIVnliaUJmTG1selFYSnlZWGtvYjJKcUtTQS9JRzlpYWk1emJHbGpaU2dwSURvZ1h5NWxlSFJsYm1Rb2UzMHNJRzlpYWlrN1hHNGdJSDA3WEc1Y2JpQWdMeThnU1c1MmIydGxjeUJwYm5SbGNtTmxjSFJ2Y2lCM2FYUm9JSFJvWlNCdlltb3NJR0Z1WkNCMGFHVnVJSEpsZEhWeWJuTWdiMkpxTGx4dUlDQXZMeUJVYUdVZ2NISnBiV0Z5ZVNCd2RYSndiM05sSUc5bUlIUm9hWE1nYldWMGFHOWtJR2x6SUhSdklGd2lkR0Z3SUdsdWRHOWNJaUJoSUcxbGRHaHZaQ0JqYUdGcGJpd2dhVzVjYmlBZ0x5OGdiM0prWlhJZ2RHOGdjR1Z5Wm05eWJTQnZjR1Z5WVhScGIyNXpJRzl1SUdsdWRHVnliV1ZrYVdGMFpTQnlaWE4xYkhSeklIZHBkR2hwYmlCMGFHVWdZMmhoYVc0dVhHNGdJRjh1ZEdGd0lEMGdablZ1WTNScGIyNG9iMkpxTENCcGJuUmxjbU5sY0hSdmNpa2dlMXh1SUNBZ0lHbHVkR1Z5WTJWd2RHOXlLRzlpYWlrN1hHNGdJQ0FnY21WMGRYSnVJRzlpYWp0Y2JpQWdmVHRjYmx4dUlDQXZMeUJTWlhSMWNtNXpJSGRvWlhSb1pYSWdZVzRnYjJKcVpXTjBJR2hoY3lCaElHZHBkbVZ1SUhObGRDQnZaaUJnYTJWNU9uWmhiSFZsWUNCd1lXbHljeTVjYmlBZ1h5NXBjMDFoZEdOb0lEMGdablZ1WTNScGIyNG9iMkpxWldOMExDQmhkSFJ5Y3lrZ2UxeHVJQ0FnSUhaaGNpQnJaWGx6SUQwZ1h5NXJaWGx6S0dGMGRISnpLU3dnYkdWdVozUm9JRDBnYTJWNWN5NXNaVzVuZEdnN1hHNGdJQ0FnYVdZZ0tHOWlhbVZqZENBOVBTQnVkV3hzS1NCeVpYUjFjbTRnSVd4bGJtZDBhRHRjYmlBZ0lDQjJZWElnYjJKcUlEMGdUMkpxWldOMEtHOWlhbVZqZENrN1hHNGdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCc1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lDQWdkbUZ5SUd0bGVTQTlJR3RsZVhOYmFWMDdYRzRnSUNBZ0lDQnBaaUFvWVhSMGNuTmJhMlY1WFNBaFBUMGdiMkpxVzJ0bGVWMGdmSHdnSVNoclpYa2dhVzRnYjJKcUtTa2djbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2RISjFaVHRjYmlBZ2ZUdGNibHh1WEc0Z0lDOHZJRWx1ZEdWeWJtRnNJSEpsWTNWeWMybDJaU0JqYjIxd1lYSnBjMjl1SUdaMWJtTjBhVzl1SUdadmNpQmdhWE5GY1hWaGJHQXVYRzRnSUhaaGNpQmxjU3dnWkdWbGNFVnhPMXh1SUNCbGNTQTlJR1oxYm1OMGFXOXVLR0VzSUdJc0lHRlRkR0ZqYXl3Z1lsTjBZV05yS1NCN1hHNGdJQ0FnTHk4Z1NXUmxiblJwWTJGc0lHOWlhbVZqZEhNZ1lYSmxJR1Z4ZFdGc0xpQmdNQ0E5UFQwZ0xUQmdMQ0JpZFhRZ2RHaGxlU0JoY21WdUozUWdhV1JsYm5ScFkyRnNMbHh1SUNBZ0lDOHZJRk5sWlNCMGFHVWdXMGhoY20xdmJua2dZR1ZuWVd4Z0lIQnliM0J2YzJGc1hTaG9kSFJ3T2k4dmQybHJhUzVsWTIxaGMyTnlhWEIwTG05eVp5OWtiMnQxTG5Cb2NEOXBaRDFvWVhKdGIyNTVPbVZuWVd3cExseHVJQ0FnSUdsbUlDaGhJRDA5UFNCaUtTQnlaWFIxY200Z1lTQWhQVDBnTUNCOGZDQXhJQzhnWVNBOVBUMGdNU0F2SUdJN1hHNGdJQ0FnTHk4Z1lHNTFiR3hnSUc5eUlHQjFibVJsWm1sdVpXUmdJRzl1YkhrZ1pYRjFZV3dnZEc4Z2FYUnpaV3htSUNoemRISnBZM1FnWTI5dGNHRnlhWE52YmlrdVhHNGdJQ0FnYVdZZ0tHRWdQVDBnYm5Wc2JDQjhmQ0JpSUQwOUlHNTFiR3dwSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNBdkx5QmdUbUZPWUhNZ1lYSmxJR1Z4ZFdsMllXeGxiblFzSUdKMWRDQnViMjR0Y21WbWJHVjRhWFpsTGx4dUlDQWdJR2xtSUNoaElDRTlQU0JoS1NCeVpYUjFjbTRnWWlBaFBUMGdZanRjYmlBZ0lDQXZMeUJGZUdoaGRYTjBJSEJ5YVcxcGRHbDJaU0JqYUdWamEzTmNiaUFnSUNCMllYSWdkSGx3WlNBOUlIUjVjR1Z2WmlCaE8xeHVJQ0FnSUdsbUlDaDBlWEJsSUNFOVBTQW5ablZ1WTNScGIyNG5JQ1ltSUhSNWNHVWdJVDA5SUNkdlltcGxZM1FuSUNZbUlIUjVjR1Z2WmlCaUlDRTlJQ2R2WW1wbFkzUW5LU0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnY21WMGRYSnVJR1JsWlhCRmNTaGhMQ0JpTENCaFUzUmhZMnNzSUdKVGRHRmpheWs3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdTVzUwWlhKdVlXd2djbVZqZFhKemFYWmxJR052YlhCaGNtbHpiMjRnWm5WdVkzUnBiMjRnWm05eUlHQnBjMFZ4ZFdGc1lDNWNiaUFnWkdWbGNFVnhJRDBnWm5WdVkzUnBiMjRvWVN3Z1lpd2dZVk4wWVdOckxDQmlVM1JoWTJzcElIdGNiaUFnSUNBdkx5QlZibmR5WVhBZ1lXNTVJSGR5WVhCd1pXUWdiMkpxWldOMGN5NWNiaUFnSUNCcFppQW9ZU0JwYm5OMFlXNWpaVzltSUY4cElHRWdQU0JoTGw5M2NtRndjR1ZrTzF4dUlDQWdJR2xtSUNoaUlHbHVjM1JoYm1ObGIyWWdYeWtnWWlBOUlHSXVYM2R5WVhCd1pXUTdYRzRnSUNBZ0x5OGdRMjl0Y0dGeVpTQmdXMXREYkdGemMxMWRZQ0J1WVcxbGN5NWNiaUFnSUNCMllYSWdZMnhoYzNOT1lXMWxJRDBnZEc5VGRISnBibWN1WTJGc2JDaGhLVHRjYmlBZ0lDQnBaaUFvWTJ4aGMzTk9ZVzFsSUNFOVBTQjBiMU4wY21sdVp5NWpZV3hzS0dJcEtTQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lDQWdjM2RwZEdOb0lDaGpiR0Z6YzA1aGJXVXBJSHRjYmlBZ0lDQWdJQzh2SUZOMGNtbHVaM01zSUc1MWJXSmxjbk1zSUhKbFozVnNZWElnWlhod2NtVnpjMmx2Ym5Nc0lHUmhkR1Z6TENCaGJtUWdZbTl2YkdWaGJuTWdZWEpsSUdOdmJYQmhjbVZrSUdKNUlIWmhiSFZsTGx4dUlDQWdJQ0FnWTJGelpTQW5XMjlpYW1WamRDQlNaV2RGZUhCZEp6cGNiaUFnSUNBZ0lDOHZJRkpsWjBWNGNITWdZWEpsSUdOdlpYSmpaV1FnZEc4Z2MzUnlhVzVuY3lCbWIzSWdZMjl0Y0dGeWFYTnZiaUFvVG05MFpUb2dKeWNnS3lBdllTOXBJRDA5UFNBbkwyRXZhU2NwWEc0Z0lDQWdJQ0JqWVhObElDZGJiMkpxWldOMElGTjBjbWx1WjEwbk9seHVJQ0FnSUNBZ0lDQXZMeUJRY21sdGFYUnBkbVZ6SUdGdVpDQjBhR1ZwY2lCamIzSnlaWE53YjI1a2FXNW5JRzlpYW1WamRDQjNjbUZ3Y0dWeWN5QmhjbVVnWlhGMWFYWmhiR1Z1ZERzZ2RHaDFjeXdnWUZ3aU5Wd2lZQ0JwYzF4dUlDQWdJQ0FnSUNBdkx5QmxjWFZwZG1Gc1pXNTBJSFJ2SUdCdVpYY2dVM1J5YVc1bktGd2lOVndpS1dBdVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlBbkp5QXJJR0VnUFQwOUlDY25JQ3NnWWp0Y2JpQWdJQ0FnSUdOaGMyVWdKMXR2WW1wbFkzUWdUblZ0WW1WeVhTYzZYRzRnSUNBZ0lDQWdJQzh2SUdCT1lVNWdjeUJoY21VZ1pYRjFhWFpoYkdWdWRDd2dZblYwSUc1dmJpMXlaV1pzWlhocGRtVXVYRzRnSUNBZ0lDQWdJQzh2SUU5aWFtVmpkQ2hPWVU0cElHbHpJR1Z4ZFdsMllXeGxiblFnZEc4Z1RtRk9MbHh1SUNBZ0lDQWdJQ0JwWmlBb0syRWdJVDA5SUN0aEtTQnlaWFIxY200Z0sySWdJVDA5SUN0aU8xeHVJQ0FnSUNBZ0lDQXZMeUJCYmlCZ1pXZGhiR0FnWTI5dGNHRnlhWE52YmlCcGN5QndaWEptYjNKdFpXUWdabTl5SUc5MGFHVnlJRzUxYldWeWFXTWdkbUZzZFdWekxseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z0syRWdQVDA5SURBZ1B5QXhJQzhnSzJFZ1BUMDlJREVnTHlCaUlEb2dLMkVnUFQwOUlDdGlPMXh1SUNBZ0lDQWdZMkZ6WlNBblcyOWlhbVZqZENCRVlYUmxYU2M2WEc0Z0lDQWdJQ0JqWVhObElDZGJiMkpxWldOMElFSnZiMnhsWVc1ZEp6cGNiaUFnSUNBZ0lDQWdMeThnUTI5bGNtTmxJR1JoZEdWeklHRnVaQ0JpYjI5c1pXRnVjeUIwYnlCdWRXMWxjbWxqSUhCeWFXMXBkR2wyWlNCMllXeDFaWE11SUVSaGRHVnpJR0Z5WlNCamIyMXdZWEpsWkNCaWVTQjBhR1ZwY2x4dUlDQWdJQ0FnSUNBdkx5QnRhV3hzYVhObFkyOXVaQ0J5WlhCeVpYTmxiblJoZEdsdmJuTXVJRTV2ZEdVZ2RHaGhkQ0JwYm5aaGJHbGtJR1JoZEdWeklIZHBkR2dnYldsc2JHbHpaV052Ym1RZ2NtVndjbVZ6Wlc1MFlYUnBiMjV6WEc0Z0lDQWdJQ0FnSUM4dklHOW1JR0JPWVU1Z0lHRnlaU0J1YjNRZ1pYRjFhWFpoYkdWdWRDNWNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlDdGhJRDA5UFNBcllqdGNiaUFnSUNBZ0lHTmhjMlVnSjF0dlltcGxZM1FnVTNsdFltOXNYU2M2WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJUZVcxaWIyeFFjbTkwYnk1MllXeDFaVTltTG1OaGJHd29ZU2tnUFQwOUlGTjViV0p2YkZCeWIzUnZMblpoYkhWbFQyWXVZMkZzYkNoaUtUdGNiaUFnSUNCOVhHNWNiaUFnSUNCMllYSWdZWEpsUVhKeVlYbHpJRDBnWTJ4aGMzTk9ZVzFsSUQwOVBTQW5XMjlpYW1WamRDQkJjbkpoZVYwbk8xeHVJQ0FnSUdsbUlDZ2hZWEpsUVhKeVlYbHpLU0I3WEc0Z0lDQWdJQ0JwWmlBb2RIbHdaVzltSUdFZ0lUMGdKMjlpYW1WamRDY2dmSHdnZEhsd1pXOW1JR0lnSVQwZ0oyOWlhbVZqZENjcElISmxkSFZ5YmlCbVlXeHpaVHRjYmx4dUlDQWdJQ0FnTHk4Z1QySnFaV04wY3lCM2FYUm9JR1JwWm1abGNtVnVkQ0JqYjI1emRISjFZM1J2Y25NZ1lYSmxJRzV2ZENCbGNYVnBkbUZzWlc1MExDQmlkWFFnWUU5aWFtVmpkR0J6SUc5eUlHQkJjbkpoZVdCelhHNGdJQ0FnSUNBdkx5Qm1jbTl0SUdScFptWmxjbVZ1ZENCbWNtRnRaWE1nWVhKbExseHVJQ0FnSUNBZ2RtRnlJR0ZEZEc5eUlEMGdZUzVqYjI1emRISjFZM1J2Y2l3Z1lrTjBiM0lnUFNCaUxtTnZibk4wY25WamRHOXlPMXh1SUNBZ0lDQWdhV1lnS0dGRGRHOXlJQ0U5UFNCaVEzUnZjaUFtSmlBaEtGOHVhWE5HZFc1amRHbHZiaWhoUTNSdmNpa2dKaVlnWVVOMGIzSWdhVzV6ZEdGdVkyVnZaaUJoUTNSdmNpQW1KbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGOHVhWE5HZFc1amRHbHZiaWhpUTNSdmNpa2dKaVlnWWtOMGIzSWdhVzV6ZEdGdVkyVnZaaUJpUTNSdmNpbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKaVlnS0NkamIyNXpkSEoxWTNSdmNpY2dhVzRnWVNBbUppQW5ZMjl1YzNSeWRXTjBiM0luSUdsdUlHSXBLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnTHk4Z1FYTnpkVzFsSUdWeGRXRnNhWFI1SUdadmNpQmplV05zYVdNZ2MzUnlkV04wZFhKbGN5NGdWR2hsSUdGc1oyOXlhWFJvYlNCbWIzSWdaR1YwWldOMGFXNW5JR041WTJ4cFkxeHVJQ0FnSUM4dklITjBjblZqZEhWeVpYTWdhWE1nWVdSaGNIUmxaQ0JtY205dElFVlRJRFV1TVNCelpXTjBhVzl1SURFMUxqRXlMak1zSUdGaWMzUnlZV04wSUc5d1pYSmhkR2x2YmlCZ1NrOWdMbHh1WEc0Z0lDQWdMeThnU1c1cGRHbGhiR2w2YVc1bklITjBZV05ySUc5bUlIUnlZWFpsY25ObFpDQnZZbXBsWTNSekxseHVJQ0FnSUM4dklFbDBKM01nWkc5dVpTQm9aWEpsSUhOcGJtTmxJSGRsSUc5dWJIa2dibVZsWkNCMGFHVnRJR1p2Y2lCdlltcGxZM1J6SUdGdVpDQmhjbkpoZVhNZ1kyOXRjR0Z5YVhOdmJpNWNiaUFnSUNCaFUzUmhZMnNnUFNCaFUzUmhZMnNnZkh3Z1cxMDdYRzRnSUNBZ1lsTjBZV05ySUQwZ1lsTjBZV05ySUh4OElGdGRPMXh1SUNBZ0lIWmhjaUJzWlc1bmRHZ2dQU0JoVTNSaFkyc3ViR1Z1WjNSb08xeHVJQ0FnSUhkb2FXeGxJQ2hzWlc1bmRHZ3RMU2tnZTF4dUlDQWdJQ0FnTHk4Z1RHbHVaV0Z5SUhObFlYSmphQzRnVUdWeVptOXliV0Z1WTJVZ2FYTWdhVzUyWlhKelpXeDVJSEJ5YjNCdmNuUnBiMjVoYkNCMGJ5QjBhR1VnYm5WdFltVnlJRzltWEc0Z0lDQWdJQ0F2THlCMWJtbHhkV1VnYm1WemRHVmtJSE4wY25WamRIVnlaWE11WEc0Z0lDQWdJQ0JwWmlBb1lWTjBZV05yVzJ4bGJtZDBhRjBnUFQwOUlHRXBJSEpsZEhWeWJpQmlVM1JoWTJ0YmJHVnVaM1JvWFNBOVBUMGdZanRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJCWkdRZ2RHaGxJR1pwY25OMElHOWlhbVZqZENCMGJ5QjBhR1VnYzNSaFkyc2diMllnZEhKaGRtVnljMlZrSUc5aWFtVmpkSE11WEc0Z0lDQWdZVk4wWVdOckxuQjFjMmdvWVNrN1hHNGdJQ0FnWWxOMFlXTnJMbkIxYzJnb1lpazdYRzVjYmlBZ0lDQXZMeUJTWldOMWNuTnBkbVZzZVNCamIyMXdZWEpsSUc5aWFtVmpkSE1nWVc1a0lHRnljbUY1Y3k1Y2JpQWdJQ0JwWmlBb1lYSmxRWEp5WVhsektTQjdYRzRnSUNBZ0lDQXZMeUJEYjIxd1lYSmxJR0Z5Y21GNUlHeGxibWQwYUhNZ2RHOGdaR1YwWlhKdGFXNWxJR2xtSUdFZ1pHVmxjQ0JqYjIxd1lYSnBjMjl1SUdseklHNWxZMlZ6YzJGeWVTNWNiaUFnSUNBZ0lHeGxibWQwYUNBOUlHRXViR1Z1WjNSb08xeHVJQ0FnSUNBZ2FXWWdLR3hsYm1kMGFDQWhQVDBnWWk1c1pXNW5kR2dwSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNBZ0lDOHZJRVJsWlhBZ1kyOXRjR0Z5WlNCMGFHVWdZMjl1ZEdWdWRITXNJR2xuYm05eWFXNW5JRzV2YmkxdWRXMWxjbWxqSUhCeWIzQmxjblJwWlhNdVhHNGdJQ0FnSUNCM2FHbHNaU0FvYkdWdVozUm9MUzBwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLQ0ZsY1NoaFcyeGxibWQwYUYwc0lHSmJiR1Z1WjNSb1hTd2dZVk4wWVdOckxDQmlVM1JoWTJzcEtTQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDOHZJRVJsWlhBZ1kyOXRjR0Z5WlNCdlltcGxZM1J6TGx4dUlDQWdJQ0FnZG1GeUlHdGxlWE1nUFNCZkxtdGxlWE1vWVNrc0lHdGxlVHRjYmlBZ0lDQWdJR3hsYm1kMGFDQTlJR3RsZVhNdWJHVnVaM1JvTzF4dUlDQWdJQ0FnTHk4Z1JXNXpkWEpsSUhSb1lYUWdZbTkwYUNCdlltcGxZM1J6SUdOdmJuUmhhVzRnZEdobElITmhiV1VnYm5WdFltVnlJRzltSUhCeWIzQmxjblJwWlhNZ1ltVm1iM0psSUdOdmJYQmhjbWx1WnlCa1pXVndJR1Z4ZFdGc2FYUjVMbHh1SUNBZ0lDQWdhV1lnS0Y4dWEyVjVjeWhpS1M1c1pXNW5kR2dnSVQwOUlHeGxibWQwYUNrZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNBZ0lDQWdkMmhwYkdVZ0tHeGxibWQwYUMwdEtTQjdYRzRnSUNBZ0lDQWdJQzh2SUVSbFpYQWdZMjl0Y0dGeVpTQmxZV05vSUcxbGJXSmxjbHh1SUNBZ0lDQWdJQ0JyWlhrZ1BTQnJaWGx6VzJ4bGJtZDBhRjA3WEc0Z0lDQWdJQ0FnSUdsbUlDZ2hLR2hoY3loaUxDQnJaWGtwSUNZbUlHVnhLR0ZiYTJWNVhTd2dZbHRyWlhsZExDQmhVM1JoWTJzc0lHSlRkR0ZqYXlrcEtTQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNBZ0lDOHZJRkpsYlc5MlpTQjBhR1VnWm1seWMzUWdiMkpxWldOMElHWnliMjBnZEdobElITjBZV05ySUc5bUlIUnlZWFpsY25ObFpDQnZZbXBsWTNSekxseHVJQ0FnSUdGVGRHRmpheTV3YjNBb0tUdGNiaUFnSUNCaVUzUmhZMnN1Y0c5d0tDazdYRzRnSUNBZ2NtVjBkWEp1SUhSeWRXVTdYRzRnSUgwN1hHNWNiaUFnTHk4Z1VHVnlabTl5YlNCaElHUmxaWEFnWTI5dGNHRnlhWE52YmlCMGJ5QmphR1ZqYXlCcFppQjBkMjhnYjJKcVpXTjBjeUJoY21VZ1pYRjFZV3d1WEc0Z0lGOHVhWE5GY1hWaGJDQTlJR1oxYm1OMGFXOXVLR0VzSUdJcElIdGNiaUFnSUNCeVpYUjFjbTRnWlhFb1lTd2dZaWs3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdTWE1nWVNCbmFYWmxiaUJoY25KaGVTd2djM1J5YVc1bkxDQnZjaUJ2WW1wbFkzUWdaVzF3ZEhrL1hHNGdJQzh2SUVGdUlGd2laVzF3ZEhsY0lpQnZZbXBsWTNRZ2FHRnpJRzV2SUdWdWRXMWxjbUZpYkdVZ2IzZHVMWEJ5YjNCbGNuUnBaWE11WEc0Z0lGOHVhWE5GYlhCMGVTQTlJR1oxYm1OMGFXOXVLRzlpYWlrZ2UxeHVJQ0FnSUdsbUlDaHZZbW9nUFQwZ2JuVnNiQ2tnY21WMGRYSnVJSFJ5ZFdVN1hHNGdJQ0FnYVdZZ0tHbHpRWEp5WVhsTWFXdGxLRzlpYWlrZ0ppWWdLRjh1YVhOQmNuSmhlU2h2WW1vcElIeDhJRjh1YVhOVGRISnBibWNvYjJKcUtTQjhmQ0JmTG1selFYSm5kVzFsYm5SektHOWlhaWtwS1NCeVpYUjFjbTRnYjJKcUxteGxibWQwYUNBOVBUMGdNRHRjYmlBZ0lDQnlaWFIxY200Z1h5NXJaWGx6S0c5aWFpa3ViR1Z1WjNSb0lEMDlQU0F3TzF4dUlDQjlPMXh1WEc0Z0lDOHZJRWx6SUdFZ1oybDJaVzRnZG1Gc2RXVWdZU0JFVDAwZ1pXeGxiV1Z1ZEQ5Y2JpQWdYeTVwYzBWc1pXMWxiblFnUFNCbWRXNWpkR2x2Ymlodlltb3BJSHRjYmlBZ0lDQnlaWFIxY200Z0lTRW9iMkpxSUNZbUlHOWlhaTV1YjJSbFZIbHdaU0E5UFQwZ01TazdYRzRnSUgwN1hHNWNiaUFnTHk4Z1NYTWdZU0JuYVhabGJpQjJZV3gxWlNCaGJpQmhjbkpoZVQ5Y2JpQWdMeThnUkdWc1pXZGhkR1Z6SUhSdklFVkRUVUUxSjNNZ2JtRjBhWFpsSUVGeWNtRjVMbWx6UVhKeVlYbGNiaUFnWHk1cGMwRnljbUY1SUQwZ2JtRjBhWFpsU1hOQmNuSmhlU0I4ZkNCbWRXNWpkR2x2Ymlodlltb3BJSHRjYmlBZ0lDQnlaWFIxY200Z2RHOVRkSEpwYm1jdVkyRnNiQ2h2WW1vcElEMDlQU0FuVzI5aWFtVmpkQ0JCY25KaGVWMG5PMXh1SUNCOU8xeHVYRzRnSUM4dklFbHpJR0VnWjJsMlpXNGdkbUZ5YVdGaWJHVWdZVzRnYjJKcVpXTjBQMXh1SUNCZkxtbHpUMkpxWldOMElEMGdablZ1WTNScGIyNG9iMkpxS1NCN1hHNGdJQ0FnZG1GeUlIUjVjR1VnUFNCMGVYQmxiMllnYjJKcU8xeHVJQ0FnSUhKbGRIVnliaUIwZVhCbElEMDlQU0FuWm5WdVkzUnBiMjRuSUh4OElIUjVjR1VnUFQwOUlDZHZZbXBsWTNRbklDWW1JQ0VoYjJKcU8xeHVJQ0I5TzF4dVhHNGdJQzh2SUVGa1pDQnpiMjFsSUdselZIbHdaU0J0WlhSb2IyUnpPaUJwYzBGeVozVnRaVzUwY3l3Z2FYTkdkVzVqZEdsdmJpd2dhWE5UZEhKcGJtY3NJR2x6VG5WdFltVnlMQ0JwYzBSaGRHVXNJR2x6VW1WblJYaHdMQ0JwYzBWeWNtOXlMQ0JwYzAxaGNDd2dhWE5YWldGclRXRndMQ0JwYzFObGRDd2dhWE5YWldGclUyVjBMbHh1SUNCZkxtVmhZMmdvV3lkQmNtZDFiV1Z1ZEhNbkxDQW5SblZ1WTNScGIyNG5MQ0FuVTNSeWFXNW5KeXdnSjA1MWJXSmxjaWNzSUNkRVlYUmxKeXdnSjFKbFowVjRjQ2NzSUNkRmNuSnZjaWNzSUNkVGVXMWliMnduTENBblRXRndKeXdnSjFkbFlXdE5ZWEFuTENBblUyVjBKeXdnSjFkbFlXdFRaWFFuWFN3Z1puVnVZM1JwYjI0b2JtRnRaU2tnZTF4dUlDQWdJRjliSjJsekp5QXJJRzVoYldWZElEMGdablZ1WTNScGIyNG9iMkpxS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnZEc5VGRISnBibWN1WTJGc2JDaHZZbW9wSUQwOVBTQW5XMjlpYW1WamRDQW5JQ3NnYm1GdFpTQXJJQ2RkSnp0Y2JpQWdJQ0I5TzF4dUlDQjlLVHRjYmx4dUlDQXZMeUJFWldacGJtVWdZU0JtWVd4c1ltRmpheUIyWlhKemFXOXVJRzltSUhSb1pTQnRaWFJvYjJRZ2FXNGdZbkp2ZDNObGNuTWdLR0ZvWlcwc0lFbEZJRHdnT1Nrc0lIZG9aWEpsWEc0Z0lDOHZJSFJvWlhKbElHbHpiaWQwSUdGdWVTQnBibk53WldOMFlXSnNaU0JjSWtGeVozVnRaVzUwYzF3aUlIUjVjR1V1WEc0Z0lHbG1JQ2doWHk1cGMwRnlaM1Z0Wlc1MGN5aGhjbWQxYldWdWRITXBLU0I3WEc0Z0lDQWdYeTVwYzBGeVozVnRaVzUwY3lBOUlHWjFibU4wYVc5dUtHOWlhaWtnZTF4dUlDQWdJQ0FnY21WMGRYSnVJR2hoY3lodlltb3NJQ2RqWVd4c1pXVW5LVHRjYmlBZ0lDQjlPMXh1SUNCOVhHNWNiaUFnTHk4Z1QzQjBhVzFwZW1VZ1lHbHpSblZ1WTNScGIyNWdJR2xtSUdGd2NISnZjSEpwWVhSbExpQlhiM0pySUdGeWIzVnVaQ0J6YjIxbElIUjVjR1Z2WmlCaWRXZHpJR2x1SUc5c1pDQjJPQ3hjYmlBZ0x5OGdTVVVnTVRFZ0tDTXhOakl4S1N3Z1UyRm1ZWEpwSURnZ0tDTXhPVEk1S1N3Z1lXNWtJRkJvWVc1MGIyMUtVeUFvSXpJeU16WXBMbHh1SUNCMllYSWdibTlrWld4cGMzUWdQU0J5YjI5MExtUnZZM1Z0Wlc1MElDWW1JSEp2YjNRdVpHOWpkVzFsYm5RdVkyaHBiR1JPYjJSbGN6dGNiaUFnYVdZZ0tIUjVjR1Z2WmlBdkxpOGdJVDBnSjJaMWJtTjBhVzl1SnlBbUppQjBlWEJsYjJZZ1NXNTBPRUZ5Y21GNUlDRTlJQ2R2WW1wbFkzUW5JQ1ltSUhSNWNHVnZaaUJ1YjJSbGJHbHpkQ0FoUFNBblpuVnVZM1JwYjI0bktTQjdYRzRnSUNBZ1h5NXBjMFoxYm1OMGFXOXVJRDBnWm5WdVkzUnBiMjRvYjJKcUtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2RIbHdaVzltSUc5aWFpQTlQU0FuWm5WdVkzUnBiMjRuSUh4OElHWmhiSE5sTzF4dUlDQWdJSDA3WEc0Z0lIMWNibHh1SUNBdkx5QkpjeUJoSUdkcGRtVnVJRzlpYW1WamRDQmhJR1pwYm1sMFpTQnVkVzFpWlhJL1hHNGdJRjh1YVhOR2FXNXBkR1VnUFNCbWRXNWpkR2x2Ymlodlltb3BJSHRjYmlBZ0lDQnlaWFIxY200Z0lWOHVhWE5UZVcxaWIyd29iMkpxS1NBbUppQnBjMFpwYm1sMFpTaHZZbW9wSUNZbUlDRnBjMDVoVGlod1lYSnpaVVpzYjJGMEtHOWlhaWtwTzF4dUlDQjlPMXh1WEc0Z0lDOHZJRWx6SUhSb1pTQm5hWFpsYmlCMllXeDFaU0JnVG1GT1lEOWNiaUFnWHk1cGMwNWhUaUE5SUdaMWJtTjBhVzl1S0c5aWFpa2dlMXh1SUNBZ0lISmxkSFZ5YmlCZkxtbHpUblZ0WW1WeUtHOWlhaWtnSmlZZ2FYTk9ZVTRvYjJKcUtUdGNiaUFnZlR0Y2JseHVJQ0F2THlCSmN5QmhJR2RwZG1WdUlIWmhiSFZsSUdFZ1ltOXZiR1ZoYmo5Y2JpQWdYeTVwYzBKdmIyeGxZVzRnUFNCbWRXNWpkR2x2Ymlodlltb3BJSHRjYmlBZ0lDQnlaWFIxY200Z2IySnFJRDA5UFNCMGNuVmxJSHg4SUc5aWFpQTlQVDBnWm1Gc2MyVWdmSHdnZEc5VGRISnBibWN1WTJGc2JDaHZZbW9wSUQwOVBTQW5XMjlpYW1WamRDQkNiMjlzWldGdVhTYzdYRzRnSUgwN1hHNWNiaUFnTHk4Z1NYTWdZU0JuYVhabGJpQjJZV3gxWlNCbGNYVmhiQ0IwYnlCdWRXeHNQMXh1SUNCZkxtbHpUblZzYkNBOUlHWjFibU4wYVc5dUtHOWlhaWtnZTF4dUlDQWdJSEpsZEhWeWJpQnZZbW9nUFQwOUlHNTFiR3c3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdTWE1nWVNCbmFYWmxiaUIyWVhKcFlXSnNaU0IxYm1SbFptbHVaV1EvWEc0Z0lGOHVhWE5WYm1SbFptbHVaV1FnUFNCbWRXNWpkR2x2Ymlodlltb3BJSHRjYmlBZ0lDQnlaWFIxY200Z2IySnFJRDA5UFNCMmIybGtJREE3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdVMmh2Y25SamRYUWdablZ1WTNScGIyNGdabTl5SUdOb1pXTnJhVzVuSUdsbUlHRnVJRzlpYW1WamRDQm9ZWE1nWVNCbmFYWmxiaUJ3Y205d1pYSjBlU0JrYVhKbFkzUnNlVnh1SUNBdkx5QnZiaUJwZEhObGJHWWdLR2x1SUc5MGFHVnlJSGR2Y21SekxDQnViM1FnYjI0Z1lTQndjbTkwYjNSNWNHVXBMbHh1SUNCZkxtaGhjeUE5SUdaMWJtTjBhVzl1S0c5aWFpd2djR0YwYUNrZ2UxeHVJQ0FnSUdsbUlDZ2hYeTVwYzBGeWNtRjVLSEJoZEdncEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2FHRnpLRzlpYWl3Z2NHRjBhQ2s3WEc0Z0lDQWdmVnh1SUNBZ0lIWmhjaUJzWlc1bmRHZ2dQU0J3WVhSb0xteGxibWQwYUR0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQjJZWElnYTJWNUlEMGdjR0YwYUZ0cFhUdGNiaUFnSUNBZ0lHbG1JQ2h2WW1vZ1BUMGdiblZzYkNCOGZDQWhhR0Z6VDNkdVVISnZjR1Z5ZEhrdVkyRnNiQ2h2WW1vc0lHdGxlU2twSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdiMkpxSUQwZ2IySnFXMnRsZVYwN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQWhJV3hsYm1kMGFEdGNiaUFnZlR0Y2JseHVJQ0F2THlCVmRHbHNhWFI1SUVaMWJtTjBhVzl1YzF4dUlDQXZMeUF0TFMwdExTMHRMUzB0TFMwdExTMHRMVnh1WEc0Z0lDOHZJRkoxYmlCVmJtUmxjbk5qYjNKbExtcHpJR2x1SUNwdWIwTnZibVpzYVdOMEtpQnRiMlJsTENCeVpYUjFjbTVwYm1jZ2RHaGxJR0JmWUNCMllYSnBZV0pzWlNCMGJ5QnBkSE5jYmlBZ0x5OGdjSEpsZG1sdmRYTWdiM2R1WlhJdUlGSmxkSFZ5Ym5NZ1lTQnlaV1psY21WdVkyVWdkRzhnZEdobElGVnVaR1Z5YzJOdmNtVWdiMkpxWldOMExseHVJQ0JmTG01dlEyOXVabXhwWTNRZ1BTQm1kVzVqZEdsdmJpZ3BJSHRjYmlBZ0lDQnliMjkwTGw4Z1BTQndjbVYyYVc5MWMxVnVaR1Z5YzJOdmNtVTdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYRzRnSUgwN1hHNWNiaUFnTHk4Z1MyVmxjQ0IwYUdVZ2FXUmxiblJwZEhrZ1puVnVZM1JwYjI0Z1lYSnZkVzVrSUdadmNpQmtaV1poZFd4MElHbDBaWEpoZEdWbGN5NWNiaUFnWHk1cFpHVnVkR2wwZVNBOUlHWjFibU4wYVc5dUtIWmhiSFZsS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFpoYkhWbE8xeHVJQ0I5TzF4dVhHNGdJQzh2SUZCeVpXUnBZMkYwWlMxblpXNWxjbUYwYVc1bklHWjFibU4wYVc5dWN5NGdUMlowWlc0Z2RYTmxablZzSUc5MWRITnBaR1VnYjJZZ1ZXNWtaWEp6WTI5eVpTNWNiaUFnWHk1amIyNXpkR0Z1ZENBOUlHWjFibU4wYVc5dUtIWmhiSFZsS1NCN1hHNGdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSFpoYkhWbE8xeHVJQ0FnSUgwN1hHNGdJSDA3WEc1Y2JpQWdYeTV1YjI5d0lEMGdablZ1WTNScGIyNG9LWHQ5TzF4dVhHNGdJQzh2SUVOeVpXRjBaWE1nWVNCbWRXNWpkR2x2YmlCMGFHRjBMQ0IzYUdWdUlIQmhjM05sWkNCaGJpQnZZbXBsWTNRc0lIZHBiR3dnZEhKaGRtVnljMlVnZEdoaGRDQnZZbXBsWTNUaWdKbHpYRzRnSUM4dklIQnliM0JsY25ScFpYTWdaRzkzYmlCMGFHVWdaMmwyWlc0Z1lIQmhkR2hnTENCemNHVmphV1pwWldRZ1lYTWdZVzRnWVhKeVlYa2diMllnYTJWNWN5QnZjaUJwYm1SbGVHVnpMbHh1SUNCZkxuQnliM0JsY25SNUlEMGdablZ1WTNScGIyNG9jR0YwYUNrZ2UxeHVJQ0FnSUdsbUlDZ2hYeTVwYzBGeWNtRjVLSEJoZEdncEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2MyaGhiR3h2ZDFCeWIzQmxjblI1S0hCaGRHZ3BPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnWm5WdVkzUnBiMjRvYjJKcUtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1pHVmxjRWRsZENodlltb3NJSEJoZEdncE8xeHVJQ0FnSUgwN1hHNGdJSDA3WEc1Y2JpQWdMeThnUjJWdVpYSmhkR1Z6SUdFZ1puVnVZM1JwYjI0Z1ptOXlJR0VnWjJsMlpXNGdiMkpxWldOMElIUm9ZWFFnY21WMGRYSnVjeUJoSUdkcGRtVnVJSEJ5YjNCbGNuUjVMbHh1SUNCZkxuQnliM0JsY25SNVQyWWdQU0JtZFc1amRHbHZiaWh2WW1vcElIdGNiaUFnSUNCcFppQW9iMkpxSUQwOUlHNTFiR3dwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJtZFc1amRHbHZiaWdwZTMwN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpaHdZWFJvS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnSVY4dWFYTkJjbkpoZVNod1lYUm9LU0EvSUc5aWFsdHdZWFJvWFNBNklHUmxaWEJIWlhRb2IySnFMQ0J3WVhSb0tUdGNiaUFnSUNCOU8xeHVJQ0I5TzF4dVhHNGdJQzh2SUZKbGRIVnlibk1nWVNCd2NtVmthV05oZEdVZ1ptOXlJR05vWldOcmFXNW5JSGRvWlhSb1pYSWdZVzRnYjJKcVpXTjBJR2hoY3lCaElHZHBkbVZ1SUhObGRDQnZabHh1SUNBdkx5QmdhMlY1T25aaGJIVmxZQ0J3WVdseWN5NWNiaUFnWHk1dFlYUmphR1Z5SUQwZ1h5NXRZWFJqYUdWeklEMGdablZ1WTNScGIyNG9ZWFIwY25NcElIdGNiaUFnSUNCaGRIUnljeUE5SUY4dVpYaDBaVzVrVDNkdUtIdDlMQ0JoZEhSeWN5azdYRzRnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1S0c5aWFpa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlGOHVhWE5OWVhSamFDaHZZbW9zSUdGMGRISnpLVHRjYmlBZ0lDQjlPMXh1SUNCOU8xeHVYRzRnSUM4dklGSjFiaUJoSUdaMWJtTjBhVzl1SUNvcWJpb3FJSFJwYldWekxseHVJQ0JmTG5ScGJXVnpJRDBnWm5WdVkzUnBiMjRvYml3Z2FYUmxjbUYwWldVc0lHTnZiblJsZUhRcElIdGNiaUFnSUNCMllYSWdZV05qZFcwZ1BTQkJjbkpoZVNoTllYUm9MbTFoZUNnd0xDQnVLU2s3WEc0Z0lDQWdhWFJsY21GMFpXVWdQU0J2Y0hScGJXbDZaVU5pS0dsMFpYSmhkR1ZsTENCamIyNTBaWGgwTENBeEtUdGNiaUFnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHNDdJR2tyS3lrZ1lXTmpkVzFiYVYwZ1BTQnBkR1Z5WVhSbFpTaHBLVHRjYmlBZ0lDQnlaWFIxY200Z1lXTmpkVzA3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdVbVYwZFhKdUlHRWdjbUZ1Wkc5dElHbHVkR1ZuWlhJZ1ltVjBkMlZsYmlCdGFXNGdZVzVrSUcxaGVDQW9hVzVqYkhWemFYWmxLUzVjYmlBZ1h5NXlZVzVrYjIwZ1BTQm1kVzVqZEdsdmJpaHRhVzRzSUcxaGVDa2dlMXh1SUNBZ0lHbG1JQ2h0WVhnZ1BUMGdiblZzYkNrZ2UxeHVJQ0FnSUNBZ2JXRjRJRDBnYldsdU8xeHVJQ0FnSUNBZ2JXbHVJRDBnTUR0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlHMXBiaUFySUUxaGRHZ3VabXh2YjNJb1RXRjBhQzV5WVc1a2IyMG9LU0FxSUNodFlYZ2dMU0J0YVc0Z0t5QXhLU2s3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdRU0FvY0c5emMybGliSGtnWm1GemRHVnlLU0IzWVhrZ2RHOGdaMlYwSUhSb1pTQmpkWEp5Wlc1MElIUnBiV1Z6ZEdGdGNDQmhjeUJoYmlCcGJuUmxaMlZ5TGx4dUlDQmZMbTV2ZHlBOUlFUmhkR1V1Ym05M0lIeDhJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQnVaWGNnUkdGMFpTZ3BMbWRsZEZScGJXVW9LVHRjYmlBZ2ZUdGNibHh1SUNBdkx5Qk1hWE4wSUc5bUlFaFVUVXdnWlc1MGFYUnBaWE1nWm05eUlHVnpZMkZ3YVc1bkxseHVJQ0IyWVhJZ1pYTmpZWEJsVFdGd0lEMGdlMXh1SUNBZ0lDY21Kem9nSnlaaGJYQTdKeXhjYmlBZ0lDQW5QQ2M2SUNjbWJIUTdKeXhjYmlBZ0lDQW5QaWM2SUNjbVozUTdKeXhjYmlBZ0lDQW5YQ0luT2lBbkpuRjFiM1E3Snl4Y2JpQWdJQ0JjSWlkY0lqb2dKeVlqZURJM095Y3NYRzRnSUNBZ0oyQW5PaUFuSmlONE5qQTdKMXh1SUNCOU8xeHVJQ0IyWVhJZ2RXNWxjMk5oY0dWTllYQWdQU0JmTG1sdWRtVnlkQ2hsYzJOaGNHVk5ZWEFwTzF4dVhHNGdJQzh2SUVaMWJtTjBhVzl1Y3lCbWIzSWdaWE5qWVhCcGJtY2dZVzVrSUhWdVpYTmpZWEJwYm1jZ2MzUnlhVzVuY3lCMGJ5OW1jbTl0SUVoVVRVd2dhVzUwWlhKd2IyeGhkR2x2Ymk1Y2JpQWdkbUZ5SUdOeVpXRjBaVVZ6WTJGd1pYSWdQU0JtZFc1amRHbHZiaWh0WVhBcElIdGNiaUFnSUNCMllYSWdaWE5qWVhCbGNpQTlJR1oxYm1OMGFXOXVLRzFoZEdOb0tTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2JXRndXMjFoZEdOb1hUdGNiaUFnSUNCOU8xeHVJQ0FnSUM4dklGSmxaMlY0WlhNZ1ptOXlJR2xrWlc1MGFXWjVhVzVuSUdFZ2EyVjVJSFJvWVhRZ2JtVmxaSE1nZEc4Z1ltVWdaWE5qWVhCbFpDNWNiaUFnSUNCMllYSWdjMjkxY21ObElEMGdKeWcvT2ljZ0t5QmZMbXRsZVhNb2JXRndLUzVxYjJsdUtDZDhKeWtnS3lBbktTYzdYRzRnSUNBZ2RtRnlJSFJsYzNSU1pXZGxlSEFnUFNCU1pXZEZlSEFvYzI5MWNtTmxLVHRjYmlBZ0lDQjJZWElnY21Wd2JHRmpaVkpsWjJWNGNDQTlJRkpsWjBWNGNDaHpiM1Z5WTJVc0lDZG5KeWs3WEc0Z0lDQWdjbVYwZFhKdUlHWjFibU4wYVc5dUtITjBjbWx1WnlrZ2UxeHVJQ0FnSUNBZ2MzUnlhVzVuSUQwZ2MzUnlhVzVuSUQwOUlHNTFiR3dnUHlBbkp5QTZJQ2NuSUNzZ2MzUnlhVzVuTzF4dUlDQWdJQ0FnY21WMGRYSnVJSFJsYzNSU1pXZGxlSEF1ZEdWemRDaHpkSEpwYm1jcElEOGdjM1J5YVc1bkxuSmxjR3hoWTJVb2NtVndiR0ZqWlZKbFoyVjRjQ3dnWlhOallYQmxjaWtnT2lCemRISnBibWM3WEc0Z0lDQWdmVHRjYmlBZ2ZUdGNiaUFnWHk1bGMyTmhjR1VnUFNCamNtVmhkR1ZGYzJOaGNHVnlLR1Z6WTJGd1pVMWhjQ2s3WEc0Z0lGOHVkVzVsYzJOaGNHVWdQU0JqY21WaGRHVkZjMk5oY0dWeUtIVnVaWE5qWVhCbFRXRndLVHRjYmx4dUlDQXZMeUJVY21GMlpYSnpaWE1nZEdobElHTm9hV3hrY21WdUlHOW1JR0J2WW1wZ0lHRnNiMjVuSUdCd1lYUm9ZQzRnU1dZZ1lTQmphR2xzWkNCcGN5QmhJR1oxYm1OMGFXOXVMQ0JwZEZ4dUlDQXZMeUJwY3lCcGJuWnZhMlZrSUhkcGRHZ2dhWFJ6SUhCaGNtVnVkQ0JoY3lCamIyNTBaWGgwTGlCU1pYUjFjbTV6SUhSb1pTQjJZV3gxWlNCdlppQjBhR1VnWm1sdVlXeGNiaUFnTHk4Z1kyaHBiR1FzSUc5eUlHQm1ZV3hzWW1GamEyQWdhV1lnWVc1NUlHTm9hV3hrSUdseklIVnVaR1ZtYVc1bFpDNWNiaUFnWHk1eVpYTjFiSFFnUFNCbWRXNWpkR2x2Ymlodlltb3NJSEJoZEdnc0lHWmhiR3hpWVdOcktTQjdYRzRnSUNBZ2FXWWdLQ0ZmTG1selFYSnlZWGtvY0dGMGFDa3BJSEJoZEdnZ1BTQmJjR0YwYUYwN1hHNGdJQ0FnZG1GeUlHeGxibWQwYUNBOUlIQmhkR2d1YkdWdVozUm9PMXh1SUNBZ0lHbG1JQ2doYkdWdVozUm9LU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdYeTVwYzBaMWJtTjBhVzl1S0daaGJHeGlZV05yS1NBL0lHWmhiR3hpWVdOckxtTmhiR3dvYjJKcUtTQTZJR1poYkd4aVlXTnJPMXh1SUNBZ0lIMWNiaUFnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHeGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0IyWVhJZ2NISnZjQ0E5SUc5aWFpQTlQU0J1ZFd4c0lEOGdkbTlwWkNBd0lEb2diMkpxVzNCaGRHaGJhVjFkTzF4dUlDQWdJQ0FnYVdZZ0tIQnliM0FnUFQwOUlIWnZhV1FnTUNrZ2UxeHVJQ0FnSUNBZ0lDQndjbTl3SUQwZ1ptRnNiR0poWTJzN1hHNGdJQ0FnSUNBZ0lHa2dQU0JzWlc1bmRHZzdJQzh2SUVWdWMzVnlaU0IzWlNCa2IyNG5kQ0JqYjI1MGFXNTFaU0JwZEdWeVlYUnBibWN1WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J2WW1vZ1BTQmZMbWx6Um5WdVkzUnBiMjRvY0hKdmNDa2dQeUJ3Y205d0xtTmhiR3dvYjJKcUtTQTZJSEJ5YjNBN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnZZbW83WEc0Z0lIMDdYRzVjYmlBZ0x5OGdSMlZ1WlhKaGRHVWdZU0IxYm1seGRXVWdhVzUwWldkbGNpQnBaQ0FvZFc1cGNYVmxJSGRwZEdocGJpQjBhR1VnWlc1MGFYSmxJR05zYVdWdWRDQnpaWE56YVc5dUtTNWNiaUFnTHk4Z1ZYTmxablZzSUdadmNpQjBaVzF3YjNKaGNua2dSRTlOSUdsa2N5NWNiaUFnZG1GeUlHbGtRMjkxYm5SbGNpQTlJREE3WEc0Z0lGOHVkVzVwY1hWbFNXUWdQU0JtZFc1amRHbHZiaWh3Y21WbWFYZ3BJSHRjYmlBZ0lDQjJZWElnYVdRZ1BTQXJLMmxrUTI5MWJuUmxjaUFySUNjbk8xeHVJQ0FnSUhKbGRIVnliaUJ3Y21WbWFYZ2dQeUJ3Y21WbWFYZ2dLeUJwWkNBNklHbGtPMXh1SUNCOU8xeHVYRzRnSUM4dklFSjVJR1JsWm1GMWJIUXNJRlZ1WkdWeWMyTnZjbVVnZFhObGN5QkZVa0l0YzNSNWJHVWdkR1Z0Y0d4aGRHVWdaR1ZzYVcxcGRHVnljeXdnWTJoaGJtZGxJSFJvWlZ4dUlDQXZMeUJtYjJ4c2IzZHBibWNnZEdWdGNHeGhkR1VnYzJWMGRHbHVaM01nZEc4Z2RYTmxJR0ZzZEdWeWJtRjBhWFpsSUdSbGJHbHRhWFJsY25NdVhHNGdJRjh1ZEdWdGNHeGhkR1ZUWlhSMGFXNW5jeUE5SUh0Y2JpQWdJQ0JsZG1Gc2RXRjBaVG9nTHp3bEtGdGNYSE5jWEZOZEt6OHBKVDR2Wnl4Y2JpQWdJQ0JwYm5SbGNuQnZiR0YwWlRvZ0x6d2xQU2hiWEZ4elhGeFRYU3MvS1NVK0wyY3NYRzRnSUNBZ1pYTmpZWEJsT2lBdlBDVXRLRnRjWEhOY1hGTmRLejhwSlQ0dloxeHVJQ0I5TzF4dVhHNGdJQzh2SUZkb1pXNGdZM1Z6ZEc5dGFYcHBibWNnWUhSbGJYQnNZWFJsVTJWMGRHbHVaM05nTENCcFppQjViM1VnWkc5dUozUWdkMkZ1ZENCMGJ5QmtaV1pwYm1VZ1lXNWNiaUFnTHk4Z2FXNTBaWEp3YjJ4aGRHbHZiaXdnWlhaaGJIVmhkR2x2YmlCdmNpQmxjMk5oY0dsdVp5QnlaV2RsZUN3Z2QyVWdibVZsWkNCdmJtVWdkR2hoZENCcGMxeHVJQ0F2THlCbmRXRnlZVzUwWldWa0lHNXZkQ0IwYnlCdFlYUmphQzVjYmlBZ2RtRnlJRzV2VFdGMFkyZ2dQU0F2S0M0cFhpODdYRzVjYmlBZ0x5OGdRMlZ5ZEdGcGJpQmphR0Z5WVdOMFpYSnpJRzVsWldRZ2RHOGdZbVVnWlhOallYQmxaQ0J6YnlCMGFHRjBJSFJvWlhrZ1kyRnVJR0psSUhCMWRDQnBiblJ2SUdGY2JpQWdMeThnYzNSeWFXNW5JR3hwZEdWeVlXd3VYRzRnSUhaaGNpQmxjMk5oY0dWeklEMGdlMXh1SUNBZ0lGd2lKMXdpT2lCY0lpZGNJaXhjYmlBZ0lDQW5YRnhjWENjNklDZGNYRnhjSnl4Y2JpQWdJQ0FuWEZ4eUp6b2dKM0luTEZ4dUlDQWdJQ2RjWEc0bk9pQW5iaWNzWEc0Z0lDQWdKMXhjZFRJd01qZ25PaUFuZFRJd01qZ25MRnh1SUNBZ0lDZGNYSFV5TURJNUp6b2dKM1V5TURJNUoxeHVJQ0I5TzF4dVhHNGdJSFpoY2lCbGMyTmhjR1ZTWldkRmVIQWdQU0F2WEZ4Y1hId25mRnhjY254Y1hHNThYRngxTWpBeU9IeGNYSFV5TURJNUwyYzdYRzVjYmlBZ2RtRnlJR1Z6WTJGd1pVTm9ZWElnUFNCbWRXNWpkR2x2YmlodFlYUmphQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQW5YRnhjWENjZ0t5QmxjMk5oY0dWelcyMWhkR05vWFR0Y2JpQWdmVHRjYmx4dUlDQXZMeUJLWVhaaFUyTnlhWEIwSUcxcFkzSnZMWFJsYlhCc1lYUnBibWNzSUhOcGJXbHNZWElnZEc4Z1NtOW9iaUJTWlhOcFp5ZHpJR2x0Y0d4bGJXVnVkR0YwYVc5dUxseHVJQ0F2THlCVmJtUmxjbk5qYjNKbElIUmxiWEJzWVhScGJtY2dhR0Z1Wkd4bGN5QmhjbUpwZEhKaGNua2daR1ZzYVcxcGRHVnljeXdnY0hKbGMyVnlkbVZ6SUhkb2FYUmxjM0JoWTJVc1hHNGdJQzh2SUdGdVpDQmpiM0p5WldOMGJIa2daWE5qWVhCbGN5QnhkVzkwWlhNZ2QybDBhR2x1SUdsdWRHVnljRzlzWVhSbFpDQmpiMlJsTGx4dUlDQXZMeUJPUWpvZ1lHOXNaRk5sZEhScGJtZHpZQ0J2Ym14NUlHVjRhWE4wY3lCbWIzSWdZbUZqYTNkaGNtUnpJR052YlhCaGRHbGlhV3hwZEhrdVhHNGdJRjh1ZEdWdGNHeGhkR1VnUFNCbWRXNWpkR2x2YmloMFpYaDBMQ0J6WlhSMGFXNW5jeXdnYjJ4a1UyVjBkR2x1WjNNcElIdGNiaUFnSUNCcFppQW9JWE5sZEhScGJtZHpJQ1ltSUc5c1pGTmxkSFJwYm1kektTQnpaWFIwYVc1bmN5QTlJRzlzWkZObGRIUnBibWR6TzF4dUlDQWdJSE5sZEhScGJtZHpJRDBnWHk1a1pXWmhkV3gwY3loN2ZTd2djMlYwZEdsdVozTXNJRjh1ZEdWdGNHeGhkR1ZUWlhSMGFXNW5jeWs3WEc1Y2JpQWdJQ0F2THlCRGIyMWlhVzVsSUdSbGJHbHRhWFJsY25NZ2FXNTBieUJ2Ym1VZ2NtVm5kV3hoY2lCbGVIQnlaWE56YVc5dUlIWnBZU0JoYkhSbGNtNWhkR2x2Ymk1Y2JpQWdJQ0IyWVhJZ2JXRjBZMmhsY2lBOUlGSmxaMFY0Y0NoYlhHNGdJQ0FnSUNBb2MyVjBkR2x1WjNNdVpYTmpZWEJsSUh4OElHNXZUV0YwWTJncExuTnZkWEpqWlN4Y2JpQWdJQ0FnSUNoelpYUjBhVzVuY3k1cGJuUmxjbkJ2YkdGMFpTQjhmQ0J1YjAxaGRHTm9LUzV6YjNWeVkyVXNYRzRnSUNBZ0lDQW9jMlYwZEdsdVozTXVaWFpoYkhWaGRHVWdmSHdnYm05TllYUmphQ2t1YzI5MWNtTmxYRzRnSUNBZ1hTNXFiMmx1S0NkOEp5a2dLeUFuZkNRbkxDQW5aeWNwTzF4dVhHNGdJQ0FnTHk4Z1EyOXRjR2xzWlNCMGFHVWdkR1Z0Y0d4aGRHVWdjMjkxY21ObExDQmxjMk5oY0dsdVp5QnpkSEpwYm1jZ2JHbDBaWEpoYkhNZ1lYQndjbTl3Y21saGRHVnNlUzVjYmlBZ0lDQjJZWElnYVc1a1pYZ2dQU0F3TzF4dUlDQWdJSFpoY2lCemIzVnlZMlVnUFNCY0lsOWZjQ3M5SjF3aU8xeHVJQ0FnSUhSbGVIUXVjbVZ3YkdGalpTaHRZWFJqYUdWeUxDQm1kVzVqZEdsdmJpaHRZWFJqYUN3Z1pYTmpZWEJsTENCcGJuUmxjbkJ2YkdGMFpTd2daWFpoYkhWaGRHVXNJRzltWm5ObGRDa2dlMXh1SUNBZ0lDQWdjMjkxY21ObElDczlJSFJsZUhRdWMyeHBZMlVvYVc1a1pYZ3NJRzltWm5ObGRDa3VjbVZ3YkdGalpTaGxjMk5oY0dWU1pXZEZlSEFzSUdWelkyRndaVU5vWVhJcE8xeHVJQ0FnSUNBZ2FXNWtaWGdnUFNCdlptWnpaWFFnS3lCdFlYUmphQzVzWlc1bmRHZzdYRzVjYmlBZ0lDQWdJR2xtSUNobGMyTmhjR1VwSUh0Y2JpQWdJQ0FnSUNBZ2MyOTFjbU5sSUNzOUlGd2lKeXRjWEc0b0tGOWZkRDBvWENJZ0t5QmxjMk5oY0dVZ0t5QmNJaWtwUFQxdWRXeHNQeWNuT2w4dVpYTmpZWEJsS0Y5ZmRDa3BLMXhjYmlkY0lqdGNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9hVzUwWlhKd2IyeGhkR1VwSUh0Y2JpQWdJQ0FnSUNBZ2MyOTFjbU5sSUNzOUlGd2lKeXRjWEc0b0tGOWZkRDBvWENJZ0t5QnBiblJsY25CdmJHRjBaU0FySUZ3aUtTazlQVzUxYkd3L0p5YzZYMTkwS1N0Y1hHNG5YQ0k3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dWMllXeDFZWFJsS1NCN1hHNGdJQ0FnSUNBZ0lITnZkWEpqWlNBclBTQmNJaWM3WEZ4dVhDSWdLeUJsZG1Gc2RXRjBaU0FySUZ3aVhGeHVYMTl3S3owblhDSTdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQzh2SUVGa2IySmxJRlpOY3lCdVpXVmtJSFJvWlNCdFlYUmphQ0J5WlhSMWNtNWxaQ0IwYnlCd2NtOWtkV05sSUhSb1pTQmpiM0p5WldOMElHOW1abk5sZEM1Y2JpQWdJQ0FnSUhKbGRIVnliaUJ0WVhSamFEdGNiaUFnSUNCOUtUdGNiaUFnSUNCemIzVnlZMlVnS3owZ1hDSW5PMXhjYmx3aU8xeHVYRzRnSUNBZ0x5OGdTV1lnWVNCMllYSnBZV0pzWlNCcGN5QnViM1FnYzNCbFkybG1hV1ZrTENCd2JHRmpaU0JrWVhSaElIWmhiSFZsY3lCcGJpQnNiMk5oYkNCelkyOXdaUzVjYmlBZ0lDQnBaaUFvSVhObGRIUnBibWR6TG5aaGNtbGhZbXhsS1NCemIzVnlZMlVnUFNBbmQybDBhQ2h2WW1wOGZIdDlLWHRjWEc0bklDc2djMjkxY21ObElDc2dKMzFjWEc0bk8xeHVYRzRnSUNBZ2MyOTFjbU5sSUQwZ1hDSjJZWElnWDE5MExGOWZjRDBuSnl4ZlgybzlRWEp5WVhrdWNISnZkRzkwZVhCbExtcHZhVzRzWENJZ0sxeHVJQ0FnSUNBZ1hDSndjbWx1ZEQxbWRXNWpkR2x2YmlncGUxOWZjQ3M5WDE5cUxtTmhiR3dvWVhKbmRXMWxiblJ6TENjbktUdDlPMXhjYmx3aUlDdGNiaUFnSUNBZ0lITnZkWEpqWlNBcklDZHlaWFIxY200Z1gxOXdPMXhjYmljN1hHNWNiaUFnSUNCMllYSWdjbVZ1WkdWeU8xeHVJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQnlaVzVrWlhJZ1BTQnVaWGNnUm5WdVkzUnBiMjRvYzJWMGRHbHVaM011ZG1GeWFXRmliR1VnZkh3Z0oyOWlhaWNzSUNkZkp5d2djMjkxY21ObEtUdGNiaUFnSUNCOUlHTmhkR05vSUNobEtTQjdYRzRnSUNBZ0lDQmxMbk52ZFhKalpTQTlJSE52ZFhKalpUdGNiaUFnSUNBZ0lIUm9jbTkzSUdVN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnZG1GeUlIUmxiWEJzWVhSbElEMGdablZ1WTNScGIyNG9aR0YwWVNrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUhKbGJtUmxjaTVqWVd4c0tIUm9hWE1zSUdSaGRHRXNJRjhwTzF4dUlDQWdJSDA3WEc1Y2JpQWdJQ0F2THlCUWNtOTJhV1JsSUhSb1pTQmpiMjF3YVd4bFpDQnpiM1Z5WTJVZ1lYTWdZU0JqYjI1MlpXNXBaVzVqWlNCbWIzSWdjSEpsWTI5dGNHbHNZWFJwYjI0dVhHNGdJQ0FnZG1GeUlHRnlaM1Z0Wlc1MElEMGdjMlYwZEdsdVozTXVkbUZ5YVdGaWJHVWdmSHdnSjI5aWFpYzdYRzRnSUNBZ2RHVnRjR3hoZEdVdWMyOTFjbU5sSUQwZ0oyWjFibU4wYVc5dUtDY2dLeUJoY21kMWJXVnVkQ0FySUNjcGUxeGNiaWNnS3lCemIzVnlZMlVnS3lBbmZTYzdYRzVjYmlBZ0lDQnlaWFIxY200Z2RHVnRjR3hoZEdVN1hHNGdJSDA3WEc1Y2JpQWdMeThnUVdSa0lHRWdYQ0pqYUdGcGJsd2lJR1oxYm1OMGFXOXVMaUJUZEdGeWRDQmphR0ZwYm1sdVp5QmhJSGR5WVhCd1pXUWdWVzVrWlhKelkyOXlaU0J2WW1wbFkzUXVYRzRnSUY4dVkyaGhhVzRnUFNCbWRXNWpkR2x2Ymlodlltb3BJSHRjYmlBZ0lDQjJZWElnYVc1emRHRnVZMlVnUFNCZktHOWlhaWs3WEc0Z0lDQWdhVzV6ZEdGdVkyVXVYMk5vWVdsdUlEMGdkSEoxWlR0Y2JpQWdJQ0J5WlhSMWNtNGdhVzV6ZEdGdVkyVTdYRzRnSUgwN1hHNWNiaUFnTHk4Z1QwOVFYRzRnSUM4dklDMHRMUzB0TFMwdExTMHRMUzB0TFZ4dUlDQXZMeUJKWmlCVmJtUmxjbk5qYjNKbElHbHpJR05oYkd4bFpDQmhjeUJoSUdaMWJtTjBhVzl1TENCcGRDQnlaWFIxY201eklHRWdkM0poY0hCbFpDQnZZbXBsWTNRZ2RHaGhkRnh1SUNBdkx5QmpZVzRnWW1VZ2RYTmxaQ0JQVHkxemRIbHNaUzRnVkdocGN5QjNjbUZ3Y0dWeUlHaHZiR1J6SUdGc2RHVnlaV1FnZG1WeWMybHZibk1nYjJZZ1lXeHNJSFJvWlZ4dUlDQXZMeUIxYm1SbGNuTmpiM0psSUdaMWJtTjBhVzl1Y3k0Z1YzSmhjSEJsWkNCdlltcGxZM1J6SUcxaGVTQmlaU0JqYUdGcGJtVmtMbHh1WEc0Z0lDOHZJRWhsYkhCbGNpQm1kVzVqZEdsdmJpQjBieUJqYjI1MGFXNTFaU0JqYUdGcGJtbHVaeUJwYm5SbGNtMWxaR2xoZEdVZ2NtVnpkV3gwY3k1Y2JpQWdkbUZ5SUdOb1lXbHVVbVZ6ZFd4MElEMGdablZ1WTNScGIyNG9hVzV6ZEdGdVkyVXNJRzlpYWlrZ2UxeHVJQ0FnSUhKbGRIVnliaUJwYm5OMFlXNWpaUzVmWTJoaGFXNGdQeUJmS0c5aWFpa3VZMmhoYVc0b0tTQTZJRzlpYWp0Y2JpQWdmVHRjYmx4dUlDQXZMeUJCWkdRZ2VXOTFjaUJ2ZDI0Z1kzVnpkRzl0SUdaMWJtTjBhVzl1Y3lCMGJ5QjBhR1VnVlc1a1pYSnpZMjl5WlNCdlltcGxZM1F1WEc0Z0lGOHViV2w0YVc0Z1BTQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0JmTG1WaFkyZ29YeTVtZFc1amRHbHZibk1vYjJKcUtTd2dablZ1WTNScGIyNG9ibUZ0WlNrZ2UxeHVJQ0FnSUNBZ2RtRnlJR1oxYm1NZ1BTQmZXMjVoYldWZElEMGdiMkpxVzI1aGJXVmRPMXh1SUNBZ0lDQWdYeTV3Y205MGIzUjVjR1ZiYm1GdFpWMGdQU0JtZFc1amRHbHZiaWdwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJR0Z5WjNNZ1BTQmJkR2hwY3k1ZmQzSmhjSEJsWkYwN1hHNGdJQ0FnSUNBZ0lIQjFjMmd1WVhCd2JIa29ZWEpuY3l3Z1lYSm5kVzFsYm5SektUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHTm9ZV2x1VW1WemRXeDBLSFJvYVhNc0lHWjFibU11WVhCd2JIa29YeXdnWVhKbmN5a3BPMXh1SUNBZ0lDQWdmVHRjYmlBZ0lDQjlLVHRjYmlBZ0lDQnlaWFIxY200Z1h6dGNiaUFnZlR0Y2JseHVJQ0F2THlCQlpHUWdZV3hzSUc5bUlIUm9aU0JWYm1SbGNuTmpiM0psSUdaMWJtTjBhVzl1Y3lCMGJ5QjBhR1VnZDNKaGNIQmxjaUJ2WW1wbFkzUXVYRzRnSUY4dWJXbDRhVzRvWHlrN1hHNWNiaUFnTHk4Z1FXUmtJR0ZzYkNCdGRYUmhkRzl5SUVGeWNtRjVJR1oxYm1OMGFXOXVjeUIwYnlCMGFHVWdkM0poY0hCbGNpNWNiaUFnWHk1bFlXTm9LRnNuY0c5d0p5d2dKM0IxYzJnbkxDQW5jbVYyWlhKelpTY3NJQ2R6YUdsbWRDY3NJQ2R6YjNKMEp5d2dKM053YkdsalpTY3NJQ2QxYm5Ob2FXWjBKMTBzSUdaMWJtTjBhVzl1S0c1aGJXVXBJSHRjYmlBZ0lDQjJZWElnYldWMGFHOWtJRDBnUVhKeVlYbFFjbTkwYjF0dVlXMWxYVHRjYmlBZ0lDQmZMbkJ5YjNSdmRIbHdaVnR1WVcxbFhTQTlJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnZG1GeUlHOWlhaUE5SUhSb2FYTXVYM2R5WVhCd1pXUTdYRzRnSUNBZ0lDQnRaWFJvYjJRdVlYQndiSGtvYjJKcUxDQmhjbWQxYldWdWRITXBPMXh1SUNBZ0lDQWdhV1lnS0NodVlXMWxJRDA5UFNBbmMyaHBablFuSUh4OElHNWhiV1VnUFQwOUlDZHpjR3hwWTJVbktTQW1KaUJ2WW1vdWJHVnVaM1JvSUQwOVBTQXdLU0JrWld4bGRHVWdiMkpxV3pCZE8xeHVJQ0FnSUNBZ2NtVjBkWEp1SUdOb1lXbHVVbVZ6ZFd4MEtIUm9hWE1zSUc5aWFpazdYRzRnSUNBZ2ZUdGNiaUFnZlNrN1hHNWNiaUFnTHk4Z1FXUmtJR0ZzYkNCaFkyTmxjM052Y2lCQmNuSmhlU0JtZFc1amRHbHZibk1nZEc4Z2RHaGxJSGR5WVhCd1pYSXVYRzRnSUY4dVpXRmphQ2hiSjJOdmJtTmhkQ2NzSUNkcWIybHVKeXdnSjNOc2FXTmxKMTBzSUdaMWJtTjBhVzl1S0c1aGJXVXBJSHRjYmlBZ0lDQjJZWElnYldWMGFHOWtJRDBnUVhKeVlYbFFjbTkwYjF0dVlXMWxYVHRjYmlBZ0lDQmZMbkJ5YjNSdmRIbHdaVnR1WVcxbFhTQTlJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJR05vWVdsdVVtVnpkV3gwS0hSb2FYTXNJRzFsZEdodlpDNWhjSEJzZVNoMGFHbHpMbDkzY21Gd2NHVmtMQ0JoY21kMWJXVnVkSE1wS1R0Y2JpQWdJQ0I5TzF4dUlDQjlLVHRjYmx4dUlDQXZMeUJGZUhSeVlXTjBjeUIwYUdVZ2NtVnpkV3gwSUdaeWIyMGdZU0IzY21Gd2NHVmtJR0Z1WkNCamFHRnBibVZrSUc5aWFtVmpkQzVjYmlBZ1h5NXdjbTkwYjNSNWNHVXVkbUZzZFdVZ1BTQm1kVzVqZEdsdmJpZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTVmZDNKaGNIQmxaRHRjYmlBZ2ZUdGNibHh1SUNBdkx5QlFjbTkyYVdSbElIVnVkM0poY0hCcGJtY2djSEp2ZUhrZ1ptOXlJSE52YldVZ2JXVjBhRzlrY3lCMWMyVmtJR2x1SUdWdVoybHVaU0J2Y0dWeVlYUnBiMjV6WEc0Z0lDOHZJSE4xWTJnZ1lYTWdZWEpwZEdodFpYUnBZeUJoYm1RZ1NsTlBUaUJ6ZEhKcGJtZHBabWxqWVhScGIyNHVYRzRnSUY4dWNISnZkRzkwZVhCbExuWmhiSFZsVDJZZ1BTQmZMbkJ5YjNSdmRIbHdaUzUwYjBwVFQwNGdQU0JmTG5CeWIzUnZkSGx3WlM1MllXeDFaVHRjYmx4dUlDQmZMbkJ5YjNSdmRIbHdaUzUwYjFOMGNtbHVaeUE5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUJUZEhKcGJtY29kR2hwY3k1ZmQzSmhjSEJsWkNrN1hHNGdJSDA3WEc1Y2JpQWdMeThnUVUxRUlISmxaMmx6ZEhKaGRHbHZiaUJvWVhCd1pXNXpJR0YwSUhSb1pTQmxibVFnWm05eUlHTnZiWEJoZEdsaWFXeHBkSGtnZDJsMGFDQkJUVVFnYkc5aFpHVnljMXh1SUNBdkx5QjBhR0YwSUcxaGVTQnViM1FnWlc1bWIzSmpaU0J1WlhoMExYUjFjbTRnYzJWdFlXNTBhV056SUc5dUlHMXZaSFZzWlhNdUlFVjJaVzRnZEdodmRXZG9JR2RsYm1WeVlXeGNiaUFnTHk4Z2NISmhZM1JwWTJVZ1ptOXlJRUZOUkNCeVpXZHBjM1J5WVhScGIyNGdhWE1nZEc4Z1ltVWdZVzV2Ym5sdGIzVnpMQ0IxYm1SbGNuTmpiM0psSUhKbFoybHpkR1Z5YzF4dUlDQXZMeUJoY3lCaElHNWhiV1ZrSUcxdlpIVnNaU0JpWldOaGRYTmxMQ0JzYVd0bElHcFJkV1Z5ZVN3Z2FYUWdhWE1nWVNCaVlYTmxJR3hwWW5KaGNua2dkR2hoZENCcGMxeHVJQ0F2THlCd2IzQjFiR0Z5SUdWdWIzVm5hQ0IwYnlCaVpTQmlkVzVrYkdWa0lHbHVJR0VnZEdocGNtUWdjR0Z5ZEhrZ2JHbGlMQ0JpZFhRZ2JtOTBJR0psSUhCaGNuUWdiMlpjYmlBZ0x5OGdZVzRnUVUxRUlHeHZZV1FnY21WeGRXVnpkQzRnVkdodmMyVWdZMkZ6WlhNZ1kyOTFiR1FnWjJWdVpYSmhkR1VnWVc0Z1pYSnliM0lnZDJobGJpQmhibHh1SUNBdkx5QmhibTl1ZVcxdmRYTWdaR1ZtYVc1bEtDa2dhWE1nWTJGc2JHVmtJRzkxZEhOcFpHVWdiMllnWVNCc2IyRmtaWElnY21WeGRXVnpkQzVjYmlBZ2FXWWdLSFI1Y0dWdlppQmtaV1pwYm1VZ1BUMGdKMloxYm1OMGFXOXVKeUFtSmlCa1pXWnBibVV1WVcxa0tTQjdYRzRnSUNBZ1pHVm1hVzVsS0NkMWJtUmxjbk5qYjNKbEp5d2dXMTBzSUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUY4N1hHNGdJQ0FnZlNrN1hHNGdJSDFjYm4wb0tTazdYRzRpWFgwPSJdfQ==
;
!function (t, e) { "object" == typeof module && "object" == typeof module.exports ? module.exports = t.document ? e(t, !0) : function (t) { if (!t.document) throw new Error("jQuery requires a window with a document"); return e(t) } : e(t) }("undefined" != typeof window ? window : this, function (t, e) { var n = [], r = n.slice, i = n.concat, o = n.push, a = n.indexOf, s = {}, l = s.toString, u = s.hasOwnProperty, c = {}, f = "1.11.2", d = function (t, e) { return new d.fn.init(t, e) }, p = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, h = /^-ms-/, v = /-([\da-z])/gi, g = function (t, e) { return e.toUpperCase() }; function m(t) { var e = t.length, n = d.type(t); return "function" !== n && !d.isWindow(t) && (!(1 !== t.nodeType || !e) || ("array" === n || 0 === e || "number" == typeof e && e > 0 && e - 1 in t)) } d.fn = d.prototype = { jquery: f, constructor: d, selector: "", length: 0, toArray: function () { return r.call(this) }, get: function (t) { return null != t ? 0 > t ? this[t + this.length] : this[t] : r.call(this) }, pushStack: function (t) { var e = d.merge(this.constructor(), t); return e.prevObject = this, e.context = this.context, e }, each: function (t, e) { return d.each(this, t, e) }, map: function (t) { return this.pushStack(d.map(this, function (e, n) { return t.call(e, n, e) })) }, slice: function () { return this.pushStack(r.apply(this, arguments)) }, first: function () { return this.eq(0) }, last: function () { return this.eq(-1) }, eq: function (t) { var e = this.length, n = +t + (0 > t ? e : 0); return this.pushStack(n >= 0 && e > n ? [this[n]] : []) }, end: function () { return this.prevObject || this.constructor(null) }, push: o, sort: n.sort, splice: n.splice }, d.extend = d.fn.extend = function () { var t, e, n, r, i, o, a = arguments[0] || {}, s = 1, l = arguments.length, u = !1; for ("boolean" == typeof a && (u = a, a = arguments[s] || {}, s++), "object" == typeof a || d.isFunction(a) || (a = {}), s === l && (a = this, s--); l > s; s++)if (null != (i = arguments[s])) for (r in i) t = a[r], a !== (n = i[r]) && (u && n && (d.isPlainObject(n) || (e = d.isArray(n))) ? (e ? (e = !1, o = t && d.isArray(t) ? t : []) : o = t && d.isPlainObject(t) ? t : {}, a[r] = d.extend(u, o, n)) : void 0 !== n && (a[r] = n)); return a }, d.extend({ expando: "jQuery" + (f + Math.random()).replace(/\D/g, ""), isReady: !0, error: function (t) { throw new Error(t) }, noop: function () { }, isFunction: function (t) { return "function" === d.type(t) }, isArray: Array.isArray || function (t) { return "array" === d.type(t) }, isWindow: function (t) { return null != t && t == t.window }, isNumeric: function (t) { return !d.isArray(t) && t - parseFloat(t) + 1 >= 0 }, isEmptyObject: function (t) { var e; for (e in t) return !1; return !0 }, isPlainObject: function (t) { var e; if (!t || "object" !== d.type(t) || t.nodeType || d.isWindow(t)) return !1; try { if (t.constructor && !u.call(t, "constructor") && !u.call(t.constructor.prototype, "isPrototypeOf")) return !1 } catch (t) { return !1 } if (c.ownLast) for (e in t) return u.call(t, e); for (e in t); return void 0 === e || u.call(t, e) }, type: function (t) { return null == t ? t + "" : "object" == typeof t || "function" == typeof t ? s[l.call(t)] || "object" : typeof t }, globalEval: function (e) { e && d.trim(e) && (t.execScript || function (e) { t.eval.call(t, e) })(e) }, camelCase: function (t) { return t.replace(h, "ms-").replace(v, g) }, nodeName: function (t, e) { return t.nodeName && t.nodeName.toLowerCase() === e.toLowerCase() }, each: function (t, e, n) { var r = 0, i = t.length, o = m(t); if (n) { if (o) for (; i > r && !1 !== e.apply(t[r], n); r++); else for (r in t) if (!1 === e.apply(t[r], n)) break } else if (o) for (; i > r && !1 !== e.call(t[r], r, t[r]); r++); else for (r in t) if (!1 === e.call(t[r], r, t[r])) break; return t }, trim: function (t) { return null == t ? "" : (t + "").replace(p, "") }, makeArray: function (t, e) { var n = e || []; return null != t && (m(Object(t)) ? d.merge(n, "string" == typeof t ? [t] : t) : o.call(n, t)), n }, inArray: function (t, e, n) { var r; if (e) { if (a) return a.call(e, t, n); for (r = e.length, n = n ? 0 > n ? Math.max(0, r + n) : n : 0; r > n; n++)if (n in e && e[n] === t) return n } return -1 }, merge: function (t, e) { for (var n = +e.length, r = 0, i = t.length; n > r;)t[i++] = e[r++]; if (n != n) for (; void 0 !== e[r];)t[i++] = e[r++]; return t.length = i, t }, grep: function (t, e, n) { for (var r = [], i = 0, o = t.length, a = !n; o > i; i++)!e(t[i], i) !== a && r.push(t[i]); return r }, map: function (t, e, n) { var r, o = 0, a = t.length, s = []; if (m(t)) for (; a > o; o++)null != (r = e(t[o], o, n)) && s.push(r); else for (o in t) null != (r = e(t[o], o, n)) && s.push(r); return i.apply([], s) }, guid: 1, proxy: function (t, e) { var n, i, o; return "string" == typeof e && (o = t[e], e = t, t = o), d.isFunction(t) ? (n = r.call(arguments, 2), (i = function () { return t.apply(e || this, n.concat(r.call(arguments))) }).guid = t.guid = t.guid || d.guid++, i) : void 0 }, now: function () { return +new Date }, support: c }), d.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (t, e) { s["[object " + e + "]"] = e.toLowerCase() }); var y = function (t) { var e, n, r, i, o, a, s, l, u, c, f, d, p, h, v, g, m, y, b, w = "sizzle" + 1 * new Date, x = t.document, _ = 0, C = 0, S = at(), k = at(), T = at(), j = function (t, e) { return t === e && (f = !0), 0 }, I = 1 << 31, E = {}.hasOwnProperty, L = [], A = L.pop, N = L.push, D = L.push, P = L.slice, O = function (t, e) { for (var n = 0, r = t.length; r > n; n++)if (t[n] === e) return n; return -1 }, B = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", H = "[\\x20\\t\\r\\n\\f]", M = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", $ = M.replace("w", "w#"), R = "\\[" + H + "*(" + M + ")(?:" + H + "*([*^$|!~]?=)" + H + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + $ + "))|)" + H + "*\\]", F = ":(" + M + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + R + ")*)|.*)\\)|)", W = new RegExp(H + "+", "g"), z = new RegExp("^" + H + "+|((?:^|[^\\\\])(?:\\\\.)*)" + H + "+$", "g"), q = new RegExp("^" + H + "*," + H + "*"), U = new RegExp("^" + H + "*([>+~]|" + H + ")" + H + "*"), X = new RegExp("=" + H + "*([^\\]'\"]*?)" + H + "*\\]", "g"), G = new RegExp(F), Q = new RegExp("^" + $ + "$"), V = { ID: new RegExp("^#(" + M + ")"), CLASS: new RegExp("^\\.(" + M + ")"), TAG: new RegExp("^(" + M.replace("w", "w*") + ")"), ATTR: new RegExp("^" + R), PSEUDO: new RegExp("^" + F), CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + H + "*(even|odd|(([+-]|)(\\d*)n|)" + H + "*(?:([+-]|)" + H + "*(\\d+)|))" + H + "*\\)|)", "i"), bool: new RegExp("^(?:" + B + ")$", "i"), needsContext: new RegExp("^" + H + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + H + "*((?:-\\d)?\\d*)" + H + "*\\)|)(?=[^-]|$)", "i") }, Y = /^(?:input|select|textarea|button)$/i, J = /^h\d$/i, Z = /^[^{]+\{\s*\[native \w/, K = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, tt = /[+~]/, et = /'|\\/g, nt = new RegExp("\\\\([\\da-f]{1,6}" + H + "?|(" + H + ")|.)", "ig"), rt = function (t, e, n) { var r = "0x" + e - 65536; return r != r || n ? e : 0 > r ? String.fromCharCode(r + 65536) : String.fromCharCode(r >> 10 | 55296, 1023 & r | 56320) }, it = function () { d() }; try { D.apply(L = P.call(x.childNodes), x.childNodes), L[x.childNodes.length].nodeType } catch (t) { D = { apply: L.length ? function (t, e) { N.apply(t, P.call(e)) } : function (t, e) { for (var n = t.length, r = 0; t[n++] = e[r++];); t.length = n - 1 } } } function ot(t, e, r, i) { var o, s, u, c, f, h, m, y, _, C; if ((e ? e.ownerDocument || e : x) !== p && d(e), r = r || [], c = (e = e || p).nodeType, "string" != typeof t || !t || 1 !== c && 9 !== c && 11 !== c) return r; if (!i && v) { if (11 !== c && (o = K.exec(t))) if (u = o[1]) { if (9 === c) { if (!(s = e.getElementById(u)) || !s.parentNode) return r; if (s.id === u) return r.push(s), r } else if (e.ownerDocument && (s = e.ownerDocument.getElementById(u)) && b(e, s) && s.id === u) return r.push(s), r } else { if (o[2]) return D.apply(r, e.getElementsByTagName(t)), r; if ((u = o[3]) && n.getElementsByClassName) return D.apply(r, e.getElementsByClassName(u)), r } if (n.qsa && (!g || !g.test(t))) { if (y = m = w, _ = e, C = 1 !== c && t, 1 === c && "object" !== e.nodeName.toLowerCase()) { for (h = a(t), (m = e.getAttribute("id")) ? y = m.replace(et, "\\$&") : e.setAttribute("id", y), y = "[id='" + y + "'] ", f = h.length; f--;)h[f] = y + gt(h[f]); _ = tt.test(t) && ht(e.parentNode) || e, C = h.join(",") } if (C) try { return D.apply(r, _.querySelectorAll(C)), r } catch (t) { } finally { m || e.removeAttribute("id") } } } return l(t.replace(z, "$1"), e, r, i) } function at() { var t = []; return function e(n, i) { return t.push(n + " ") > r.cacheLength && delete e[t.shift()], e[n + " "] = i } } function st(t) { return t[w] = !0, t } function lt(t) { var e = p.createElement("div"); try { return !!t(e) } catch (t) { return !1 } finally { e.parentNode && e.parentNode.removeChild(e), e = null } } function ut(t, e) { for (var n = t.split("|"), i = t.length; i--;)r.attrHandle[n[i]] = e } function ct(t, e) { var n = e && t, r = n && 1 === t.nodeType && 1 === e.nodeType && (~e.sourceIndex || I) - (~t.sourceIndex || I); if (r) return r; if (n) for (; n = n.nextSibling;)if (n === e) return -1; return t ? 1 : -1 } function ft(t) { return function (e) { return "input" === e.nodeName.toLowerCase() && e.type === t } } function dt(t) { return function (e) { var n = e.nodeName.toLowerCase(); return ("input" === n || "button" === n) && e.type === t } } function pt(t) { return st(function (e) { return e = +e, st(function (n, r) { for (var i, o = t([], n.length, e), a = o.length; a--;)n[i = o[a]] && (n[i] = !(r[i] = n[i])) }) }) } function ht(t) { return t && void 0 !== t.getElementsByTagName && t } for (e in n = ot.support = {}, o = ot.isXML = function (t) { var e = t && (t.ownerDocument || t).documentElement; return !!e && "HTML" !== e.nodeName }, d = ot.setDocument = function (t) { var e, i, a = t ? t.ownerDocument || t : x; return a !== p && 9 === a.nodeType && a.documentElement ? (p = a, h = a.documentElement, (i = a.defaultView) && i !== i.top && (i.addEventListener ? i.addEventListener("unload", it, !1) : i.attachEvent && i.attachEvent("onunload", it)), v = !o(a), n.attributes = lt(function (t) { return t.className = "i", !t.getAttribute("className") }), n.getElementsByTagName = lt(function (t) { return t.appendChild(a.createComment("")), !t.getElementsByTagName("*").length }), n.getElementsByClassName = Z.test(a.getElementsByClassName), n.getById = lt(function (t) { return h.appendChild(t).id = w, !a.getElementsByName || !a.getElementsByName(w).length }), n.getById ? (r.find.ID = function (t, e) { if (void 0 !== e.getElementById && v) { var n = e.getElementById(t); return n && n.parentNode ? [n] : [] } }, r.filter.ID = function (t) { var e = t.replace(nt, rt); return function (t) { return t.getAttribute("id") === e } }) : (delete r.find.ID, r.filter.ID = function (t) { var e = t.replace(nt, rt); return function (t) { var n = void 0 !== t.getAttributeNode && t.getAttributeNode("id"); return n && n.value === e } }), r.find.TAG = n.getElementsByTagName ? function (t, e) { return void 0 !== e.getElementsByTagName ? e.getElementsByTagName(t) : n.qsa ? e.querySelectorAll(t) : void 0 } : function (t, e) { var n, r = [], i = 0, o = e.getElementsByTagName(t); if ("*" === t) { for (; n = o[i++];)1 === n.nodeType && r.push(n); return r } return o }, r.find.CLASS = n.getElementsByClassName && function (t, e) { return v ? e.getElementsByClassName(t) : void 0 }, m = [], g = [], (n.qsa = Z.test(a.querySelectorAll)) && (lt(function (t) { h.appendChild(t).innerHTML = "<a id='" + w + "'></a><select id='" + w + "-\f]' msallowcapture=''><option selected=''></option></select>", t.querySelectorAll("[msallowcapture^='']").length && g.push("[*^$]=" + H + "*(?:''|\"\")"), t.querySelectorAll("[selected]").length || g.push("\\[" + H + "*(?:value|" + B + ")"), t.querySelectorAll("[id~=" + w + "-]").length || g.push("~="), t.querySelectorAll(":checked").length || g.push(":checked"), t.querySelectorAll("a#" + w + "+*").length || g.push(".#.+[+~]") }), lt(function (t) { var e = a.createElement("input"); e.setAttribute("type", "hidden"), t.appendChild(e).setAttribute("name", "D"), t.querySelectorAll("[name=d]").length && g.push("name" + H + "*[*^$|!~]?="), t.querySelectorAll(":enabled").length || g.push(":enabled", ":disabled"), t.querySelectorAll("*,:x"), g.push(",.*:") })), (n.matchesSelector = Z.test(y = h.matches || h.webkitMatchesSelector || h.mozMatchesSelector || h.oMatchesSelector || h.msMatchesSelector)) && lt(function (t) { n.disconnectedMatch = y.call(t, "div"), y.call(t, "[s!='']:x"), m.push("!=", F) }), g = g.length && new RegExp(g.join("|")), m = m.length && new RegExp(m.join("|")), e = Z.test(h.compareDocumentPosition), b = e || Z.test(h.contains) ? function (t, e) { var n = 9 === t.nodeType ? t.documentElement : t, r = e && e.parentNode; return t === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : t.compareDocumentPosition && 16 & t.compareDocumentPosition(r))) } : function (t, e) { if (e) for (; e = e.parentNode;)if (e === t) return !0; return !1 }, j = e ? function (t, e) { if (t === e) return f = !0, 0; var r = !t.compareDocumentPosition - !e.compareDocumentPosition; return r || (1 & (r = (t.ownerDocument || t) === (e.ownerDocument || e) ? t.compareDocumentPosition(e) : 1) || !n.sortDetached && e.compareDocumentPosition(t) === r ? t === a || t.ownerDocument === x && b(x, t) ? -1 : e === a || e.ownerDocument === x && b(x, e) ? 1 : c ? O(c, t) - O(c, e) : 0 : 4 & r ? -1 : 1) } : function (t, e) { if (t === e) return f = !0, 0; var n, r = 0, i = t.parentNode, o = e.parentNode, s = [t], l = [e]; if (!i || !o) return t === a ? -1 : e === a ? 1 : i ? -1 : o ? 1 : c ? O(c, t) - O(c, e) : 0; if (i === o) return ct(t, e); for (n = t; n = n.parentNode;)s.unshift(n); for (n = e; n = n.parentNode;)l.unshift(n); for (; s[r] === l[r];)r++; return r ? ct(s[r], l[r]) : s[r] === x ? -1 : l[r] === x ? 1 : 0 }, a) : p }, ot.matches = function (t, e) { return ot(t, null, null, e) }, ot.matchesSelector = function (t, e) { if ((t.ownerDocument || t) !== p && d(t), e = e.replace(X, "='$1']"), !(!n.matchesSelector || !v || m && m.test(e) || g && g.test(e))) try { var r = y.call(t, e); if (r || n.disconnectedMatch || t.document && 11 !== t.document.nodeType) return r } catch (t) { } return ot(e, p, null, [t]).length > 0 }, ot.contains = function (t, e) { return (t.ownerDocument || t) !== p && d(t), b(t, e) }, ot.attr = function (t, e) { (t.ownerDocument || t) !== p && d(t); var i = r.attrHandle[e.toLowerCase()], o = i && E.call(r.attrHandle, e.toLowerCase()) ? i(t, e, !v) : void 0; return void 0 !== o ? o : n.attributes || !v ? t.getAttribute(e) : (o = t.getAttributeNode(e)) && o.specified ? o.value : null }, ot.error = function (t) { throw new Error("Syntax error, unrecognized expression: " + t) }, ot.uniqueSort = function (t) { var e, r = [], i = 0, o = 0; if (f = !n.detectDuplicates, c = !n.sortStable && t.slice(0), t.sort(j), f) { for (; e = t[o++];)e === t[o] && (i = r.push(o)); for (; i--;)t.splice(r[i], 1) } return c = null, t }, i = ot.getText = function (t) { var e, n = "", r = 0, o = t.nodeType; if (o) { if (1 === o || 9 === o || 11 === o) { if ("string" == typeof t.textContent) return t.textContent; for (t = t.firstChild; t; t = t.nextSibling)n += i(t) } else if (3 === o || 4 === o) return t.nodeValue } else for (; e = t[r++];)n += i(e); return n }, (r = ot.selectors = { cacheLength: 50, createPseudo: st, match: V, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: !0 }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: !0 }, "~": { dir: "previousSibling" } }, preFilter: { ATTR: function (t) { return t[1] = t[1].replace(nt, rt), t[3] = (t[3] || t[4] || t[5] || "").replace(nt, rt), "~=" === t[2] && (t[3] = " " + t[3] + " "), t.slice(0, 4) }, CHILD: function (t) { return t[1] = t[1].toLowerCase(), "nth" === t[1].slice(0, 3) ? (t[3] || ot.error(t[0]), t[4] = +(t[4] ? t[5] + (t[6] || 1) : 2 * ("even" === t[3] || "odd" === t[3])), t[5] = +(t[7] + t[8] || "odd" === t[3])) : t[3] && ot.error(t[0]), t }, PSEUDO: function (t) { var e, n = !t[6] && t[2]; return V.CHILD.test(t[0]) ? null : (t[3] ? t[2] = t[4] || t[5] || "" : n && G.test(n) && (e = a(n, !0)) && (e = n.indexOf(")", n.length - e) - n.length) && (t[0] = t[0].slice(0, e), t[2] = n.slice(0, e)), t.slice(0, 3)) } }, filter: { TAG: function (t) { var e = t.replace(nt, rt).toLowerCase(); return "*" === t ? function () { return !0 } : function (t) { return t.nodeName && t.nodeName.toLowerCase() === e } }, CLASS: function (t) { var e = S[t + " "]; return e || (e = new RegExp("(^|" + H + ")" + t + "(" + H + "|$)")) && S(t, function (t) { return e.test("string" == typeof t.className && t.className || void 0 !== t.getAttribute && t.getAttribute("class") || "") }) }, ATTR: function (t, e, n) { return function (r) { var i = ot.attr(r, t); return null == i ? "!=" === e : !e || (i += "", "=" === e ? i === n : "!=" === e ? i !== n : "^=" === e ? n && 0 === i.indexOf(n) : "*=" === e ? n && i.indexOf(n) > -1 : "$=" === e ? n && i.slice(-n.length) === n : "~=" === e ? (" " + i.replace(W, " ") + " ").indexOf(n) > -1 : "|=" === e && (i === n || i.slice(0, n.length + 1) === n + "-")) } }, CHILD: function (t, e, n, r, i) { var o = "nth" !== t.slice(0, 3), a = "last" !== t.slice(-4), s = "of-type" === e; return 1 === r && 0 === i ? function (t) { return !!t.parentNode } : function (e, n, l) { var u, c, f, d, p, h, v = o !== a ? "nextSibling" : "previousSibling", g = e.parentNode, m = s && e.nodeName.toLowerCase(), y = !l && !s; if (g) { if (o) { for (; v;) { for (f = e; f = f[v];)if (s ? f.nodeName.toLowerCase() === m : 1 === f.nodeType) return !1; h = v = "only" === t && !h && "nextSibling" } return !0 } if (h = [a ? g.firstChild : g.lastChild], a && y) { for (p = (u = (c = g[w] || (g[w] = {}))[t] || [])[0] === _ && u[1], d = u[0] === _ && u[2], f = p && g.childNodes[p]; f = ++p && f && f[v] || (d = p = 0) || h.pop();)if (1 === f.nodeType && ++d && f === e) { c[t] = [_, p, d]; break } } else if (y && (u = (e[w] || (e[w] = {}))[t]) && u[0] === _) d = u[1]; else for (; (f = ++p && f && f[v] || (d = p = 0) || h.pop()) && ((s ? f.nodeName.toLowerCase() !== m : 1 !== f.nodeType) || !++d || (y && ((f[w] || (f[w] = {}))[t] = [_, d]), f !== e));); return (d -= i) === r || d % r == 0 && d / r >= 0 } } }, PSEUDO: function (t, e) { var n, i = r.pseudos[t] || r.setFilters[t.toLowerCase()] || ot.error("unsupported pseudo: " + t); return i[w] ? i(e) : i.length > 1 ? (n = [t, t, "", e], r.setFilters.hasOwnProperty(t.toLowerCase()) ? st(function (t, n) { for (var r, o = i(t, e), a = o.length; a--;)t[r = O(t, o[a])] = !(n[r] = o[a]) }) : function (t) { return i(t, 0, n) }) : i } }, pseudos: { not: st(function (t) { var e = [], n = [], r = s(t.replace(z, "$1")); return r[w] ? st(function (t, e, n, i) { for (var o, a = r(t, null, i, []), s = t.length; s--;)(o = a[s]) && (t[s] = !(e[s] = o)) }) : function (t, i, o) { return e[0] = t, r(e, null, o, n), e[0] = null, !n.pop() } }), has: st(function (t) { return function (e) { return ot(t, e).length > 0 } }), contains: st(function (t) { return t = t.replace(nt, rt), function (e) { return (e.textContent || e.innerText || i(e)).indexOf(t) > -1 } }), lang: st(function (t) { return Q.test(t || "") || ot.error("unsupported lang: " + t), t = t.replace(nt, rt).toLowerCase(), function (e) { var n; do { if (n = v ? e.lang : e.getAttribute("xml:lang") || e.getAttribute("lang")) return (n = n.toLowerCase()) === t || 0 === n.indexOf(t + "-") } while ((e = e.parentNode) && 1 === e.nodeType); return !1 } }), target: function (e) { var n = t.location && t.location.hash; return n && n.slice(1) === e.id }, root: function (t) { return t === h }, focus: function (t) { return t === p.activeElement && (!p.hasFocus || p.hasFocus()) && !!(t.type || t.href || ~t.tabIndex) }, enabled: function (t) { return !1 === t.disabled }, disabled: function (t) { return !0 === t.disabled }, checked: function (t) { var e = t.nodeName.toLowerCase(); return "input" === e && !!t.checked || "option" === e && !!t.selected }, selected: function (t) { return t.parentNode && t.parentNode.selectedIndex, !0 === t.selected }, empty: function (t) { for (t = t.firstChild; t; t = t.nextSibling)if (t.nodeType < 6) return !1; return !0 }, parent: function (t) { return !r.pseudos.empty(t) }, header: function (t) { return J.test(t.nodeName) }, input: function (t) { return Y.test(t.nodeName) }, button: function (t) { var e = t.nodeName.toLowerCase(); return "input" === e && "button" === t.type || "button" === e }, text: function (t) { var e; return "input" === t.nodeName.toLowerCase() && "text" === t.type && (null == (e = t.getAttribute("type")) || "text" === e.toLowerCase()) }, first: pt(function () { return [0] }), last: pt(function (t, e) { return [e - 1] }), eq: pt(function (t, e, n) { return [0 > n ? n + e : n] }), even: pt(function (t, e) { for (var n = 0; e > n; n += 2)t.push(n); return t }), odd: pt(function (t, e) { for (var n = 1; e > n; n += 2)t.push(n); return t }), lt: pt(function (t, e, n) { for (var r = 0 > n ? n + e : n; --r >= 0;)t.push(r); return t }), gt: pt(function (t, e, n) { for (var r = 0 > n ? n + e : n; ++r < e;)t.push(r); return t }) } }).pseudos.nth = r.pseudos.eq, { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) r.pseudos[e] = ft(e); for (e in { submit: !0, reset: !0 }) r.pseudos[e] = dt(e); function vt() { } function gt(t) { for (var e = 0, n = t.length, r = ""; n > e; e++)r += t[e].value; return r } function mt(t, e, n) { var r = e.dir, i = n && "parentNode" === r, o = C++; return e.first ? function (e, n, o) { for (; e = e[r];)if (1 === e.nodeType || i) return t(e, n, o) } : function (e, n, a) { var s, l, u = [_, o]; if (a) { for (; e = e[r];)if ((1 === e.nodeType || i) && t(e, n, a)) return !0 } else for (; e = e[r];)if (1 === e.nodeType || i) { if ((s = (l = e[w] || (e[w] = {}))[r]) && s[0] === _ && s[1] === o) return u[2] = s[2]; if (l[r] = u, u[2] = t(e, n, a)) return !0 } } } function yt(t) { return t.length > 1 ? function (e, n, r) { for (var i = t.length; i--;)if (!t[i](e, n, r)) return !1; return !0 } : t[0] } function bt(t, e, n, r, i) { for (var o, a = [], s = 0, l = t.length, u = null != e; l > s; s++)(o = t[s]) && (!n || n(o, r, i)) && (a.push(o), u && e.push(s)); return a } function wt(t, e, n, r, i, o) { return r && !r[w] && (r = wt(r)), i && !i[w] && (i = wt(i, o)), st(function (o, a, s, l) { var u, c, f, d = [], p = [], h = a.length, v = o || function (t, e, n) { for (var r = 0, i = e.length; i > r; r++)ot(t, e[r], n); return n }(e || "*", s.nodeType ? [s] : s, []), g = !t || !o && e ? v : bt(v, d, t, s, l), m = n ? i || (o ? t : h || r) ? [] : a : g; if (n && n(g, m, s, l), r) for (u = bt(m, p), r(u, [], s, l), c = u.length; c--;)(f = u[c]) && (m[p[c]] = !(g[p[c]] = f)); if (o) { if (i || t) { if (i) { for (u = [], c = m.length; c--;)(f = m[c]) && u.push(g[c] = f); i(null, m = [], u, l) } for (c = m.length; c--;)(f = m[c]) && (u = i ? O(o, f) : d[c]) > -1 && (o[u] = !(a[u] = f)) } } else m = bt(m === a ? m.splice(h, m.length) : m), i ? i(null, a, m, l) : D.apply(a, m) }) } function xt(t) { for (var e, n, i, o = t.length, a = r.relative[t[0].type], s = a || r.relative[" "], l = a ? 1 : 0, c = mt(function (t) { return t === e }, s, !0), f = mt(function (t) { return O(e, t) > -1 }, s, !0), d = [function (t, n, r) { var i = !a && (r || n !== u) || ((e = n).nodeType ? c(t, n, r) : f(t, n, r)); return e = null, i }]; o > l; l++)if (n = r.relative[t[l].type]) d = [mt(yt(d), n)]; else { if ((n = r.filter[t[l].type].apply(null, t[l].matches))[w]) { for (i = ++l; o > i && !r.relative[t[i].type]; i++); return wt(l > 1 && yt(d), l > 1 && gt(t.slice(0, l - 1).concat({ value: " " === t[l - 2].type ? "*" : "" })).replace(z, "$1"), n, i > l && xt(t.slice(l, i)), o > i && xt(t = t.slice(i)), o > i && gt(t)) } d.push(n) } return yt(d) } function _t(t, e) { var n = e.length > 0, i = t.length > 0, o = function (o, a, s, l, c) { var f, d, h, v = 0, g = "0", m = o && [], y = [], b = u, w = o || i && r.find.TAG("*", c), x = _ += null == b ? 1 : Math.random() || .1, C = w.length; for (c && (u = a !== p && a); g !== C && null != (f = w[g]); g++) { if (i && f) { for (d = 0; h = t[d++];)if (h(f, a, s)) { l.push(f); break } c && (_ = x) } n && ((f = !h && f) && v--, o && m.push(f)) } if (v += g, n && g !== v) { for (d = 0; h = e[d++];)h(m, y, a, s); if (o) { if (v > 0) for (; g--;)m[g] || y[g] || (y[g] = A.call(l)); y = bt(y) } D.apply(l, y), c && !o && y.length > 0 && v + e.length > 1 && ot.uniqueSort(l) } return c && (_ = x, u = b), m }; return n ? st(o) : o } return vt.prototype = r.filters = r.pseudos, r.setFilters = new vt, a = ot.tokenize = function (t, e) { var n, i, o, a, s, l, u, c = k[t + " "]; if (c) return e ? 0 : c.slice(0); for (s = t, l = [], u = r.preFilter; s;) { for (a in (!n || (i = q.exec(s))) && (i && (s = s.slice(i[0].length) || s), l.push(o = [])), n = !1, (i = U.exec(s)) && (n = i.shift(), o.push({ value: n, type: i[0].replace(z, " ") }), s = s.slice(n.length)), r.filter) !(i = V[a].exec(s)) || u[a] && !(i = u[a](i)) || (n = i.shift(), o.push({ value: n, type: a, matches: i }), s = s.slice(n.length)); if (!n) break } return e ? s.length : s ? ot.error(t) : k(t, l).slice(0) }, s = ot.compile = function (t, e) { var n, r = [], i = [], o = T[t + " "]; if (!o) { for (e || (e = a(t)), n = e.length; n--;)(o = xt(e[n]))[w] ? r.push(o) : i.push(o); (o = T(t, _t(i, r))).selector = t } return o }, l = ot.select = function (t, e, i, o) { var l, u, c, f, d, p = "function" == typeof t && t, h = !o && a(t = p.selector || t); if (i = i || [], 1 === h.length) { if ((u = h[0] = h[0].slice(0)).length > 2 && "ID" === (c = u[0]).type && n.getById && 9 === e.nodeType && v && r.relative[u[1].type]) { if (!(e = (r.find.ID(c.matches[0].replace(nt, rt), e) || [])[0])) return i; p && (e = e.parentNode), t = t.slice(u.shift().value.length) } for (l = V.needsContext.test(t) ? 0 : u.length; l-- && (c = u[l], !r.relative[f = c.type]);)if ((d = r.find[f]) && (o = d(c.matches[0].replace(nt, rt), tt.test(u[0].type) && ht(e.parentNode) || e))) { if (u.splice(l, 1), !(t = o.length && gt(u))) return D.apply(i, o), i; break } } return (p || s(t, h))(o, e, !v, i, tt.test(t) && ht(e.parentNode) || e), i }, n.sortStable = w.split("").sort(j).join("") === w, n.detectDuplicates = !!f, d(), n.sortDetached = lt(function (t) { return 1 & t.compareDocumentPosition(p.createElement("div")) }), lt(function (t) { return t.innerHTML = "<a href='#'></a>", "#" === t.firstChild.getAttribute("href") }) || ut("type|href|height|width", function (t, e, n) { return n ? void 0 : t.getAttribute(e, "type" === e.toLowerCase() ? 1 : 2) }), n.attributes && lt(function (t) { return t.innerHTML = "<input/>", t.firstChild.setAttribute("value", ""), "" === t.firstChild.getAttribute("value") }) || ut("value", function (t, e, n) { return n || "input" !== t.nodeName.toLowerCase() ? void 0 : t.defaultValue }), lt(function (t) { return null == t.getAttribute("disabled") }) || ut(B, function (t, e, n) { var r; return n ? void 0 : !0 === t[e] ? e.toLowerCase() : (r = t.getAttributeNode(e)) && r.specified ? r.value : null }), ot }(t); d.find = y, d.expr = y.selectors, d.expr[":"] = d.expr.pseudos, d.unique = y.uniqueSort, d.text = y.getText, d.isXMLDoc = y.isXML, d.contains = y.contains; var b = d.expr.match.needsContext, w = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, x = /^.[^:#\[\.,]*$/; function _(t, e, n) { if (d.isFunction(e)) return d.grep(t, function (t, r) { return !!e.call(t, r, t) !== n }); if (e.nodeType) return d.grep(t, function (t) { return t === e !== n }); if ("string" == typeof e) { if (x.test(e)) return d.filter(e, t, n); e = d.filter(e, t) } return d.grep(t, function (t) { return d.inArray(t, e) >= 0 !== n }) } d.filter = function (t, e, n) { var r = e[0]; return n && (t = ":not(" + t + ")"), 1 === e.length && 1 === r.nodeType ? d.find.matchesSelector(r, t) ? [r] : [] : d.find.matches(t, d.grep(e, function (t) { return 1 === t.nodeType })) }, d.fn.extend({ find: function (t) { var e, n = [], r = this, i = r.length; if ("string" != typeof t) return this.pushStack(d(t).filter(function () { for (e = 0; i > e; e++)if (d.contains(r[e], this)) return !0 })); for (e = 0; i > e; e++)d.find(t, r[e], n); return (n = this.pushStack(i > 1 ? d.unique(n) : n)).selector = this.selector ? this.selector + " " + t : t, n }, filter: function (t) { return this.pushStack(_(this, t || [], !1)) }, not: function (t) { return this.pushStack(_(this, t || [], !0)) }, is: function (t) { return !!_(this, "string" == typeof t && b.test(t) ? d(t) : t || [], !1).length } }); var C, S = t.document, k = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/; (d.fn.init = function (t, e) { var n, r; if (!t) return this; if ("string" == typeof t) { if (!(n = "<" === t.charAt(0) && ">" === t.charAt(t.length - 1) && t.length >= 3 ? [null, t, null] : k.exec(t)) || !n[1] && e) return !e || e.jquery ? (e || C).find(t) : this.constructor(e).find(t); if (n[1]) { if (e = e instanceof d ? e[0] : e, d.merge(this, d.parseHTML(n[1], e && e.nodeType ? e.ownerDocument || e : S, !0)), w.test(n[1]) && d.isPlainObject(e)) for (n in e) d.isFunction(this[n]) ? this[n](e[n]) : this.attr(n, e[n]); return this } if ((r = S.getElementById(n[2])) && r.parentNode) { if (r.id !== n[2]) return C.find(t); this.length = 1, this[0] = r } return this.context = S, this.selector = t, this } return t.nodeType ? (this.context = this[0] = t, this.length = 1, this) : d.isFunction(t) ? void 0 !== C.ready ? C.ready(t) : t(d) : (void 0 !== t.selector && (this.selector = t.selector, this.context = t.context), d.makeArray(t, this)) }).prototype = d.fn, C = d(S); var T = /^(?:parents|prev(?:Until|All))/, j = { children: !0, contents: !0, next: !0, prev: !0 }; function I(t, e) { do { t = t[e] } while (t && 1 !== t.nodeType); return t } d.extend({ dir: function (t, e, n) { for (var r = [], i = t[e]; i && 9 !== i.nodeType && (void 0 === n || 1 !== i.nodeType || !d(i).is(n));)1 === i.nodeType && r.push(i), i = i[e]; return r }, sibling: function (t, e) { for (var n = []; t; t = t.nextSibling)1 === t.nodeType && t !== e && n.push(t); return n } }), d.fn.extend({ has: function (t) { var e, n = d(t, this), r = n.length; return this.filter(function () { for (e = 0; r > e; e++)if (d.contains(this, n[e])) return !0 }) }, closest: function (t, e) { for (var n, r = 0, i = this.length, o = [], a = b.test(t) || "string" != typeof t ? d(t, e || this.context) : 0; i > r; r++)for (n = this[r]; n && n !== e; n = n.parentNode)if (n.nodeType < 11 && (a ? a.index(n) > -1 : 1 === n.nodeType && d.find.matchesSelector(n, t))) { o.push(n); break } return this.pushStack(o.length > 1 ? d.unique(o) : o) }, index: function (t) { return t ? "string" == typeof t ? d.inArray(this[0], d(t)) : d.inArray(t.jquery ? t[0] : t, this) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 }, add: function (t, e) { return this.pushStack(d.unique(d.merge(this.get(), d(t, e)))) }, addBack: function (t) { return this.add(null == t ? this.prevObject : this.prevObject.filter(t)) } }), d.each({ parent: function (t) { var e = t.parentNode; return e && 11 !== e.nodeType ? e : null }, parents: function (t) { return d.dir(t, "parentNode") }, parentsUntil: function (t, e, n) { return d.dir(t, "parentNode", n) }, next: function (t) { return I(t, "nextSibling") }, prev: function (t) { return I(t, "previousSibling") }, nextAll: function (t) { return d.dir(t, "nextSibling") }, prevAll: function (t) { return d.dir(t, "previousSibling") }, nextUntil: function (t, e, n) { return d.dir(t, "nextSibling", n) }, prevUntil: function (t, e, n) { return d.dir(t, "previousSibling", n) }, siblings: function (t) { return d.sibling((t.parentNode || {}).firstChild, t) }, children: function (t) { return d.sibling(t.firstChild) }, contents: function (t) { return d.nodeName(t, "iframe") ? t.contentDocument || t.contentWindow.document : d.merge([], t.childNodes) } }, function (t, e) { d.fn[t] = function (n, r) { var i = d.map(this, e, n); return "Until" !== t.slice(-5) && (r = n), r && "string" == typeof r && (i = d.filter(r, i)), this.length > 1 && (j[t] || (i = d.unique(i)), T.test(t) && (i = i.reverse())), this.pushStack(i) } }); var E, L = /\S+/g, A = {}; function N() { S.addEventListener ? (S.removeEventListener("DOMContentLoaded", D, !1), t.removeEventListener("load", D, !1)) : (S.detachEvent("onreadystatechange", D), t.detachEvent("onload", D)) } function D() { (S.addEventListener || "load" === event.type || "complete" === S.readyState) && (N(), d.ready()) } d.Callbacks = function (t) { t = "string" == typeof t ? A[t] || function (t) { var e = A[t] = {}; return d.each(t.match(L) || [], function (t, n) { e[n] = !0 }), e }(t) : d.extend({}, t); var e, n, r, i, o, a, s = [], l = !t.once && [], u = function (f) { for (n = t.memory && f, r = !0, o = a || 0, a = 0, i = s.length, e = !0; s && i > o; o++)if (!1 === s[o].apply(f[0], f[1]) && t.stopOnFalse) { n = !1; break } e = !1, s && (l ? l.length && u(l.shift()) : n ? s = [] : c.disable()) }, c = { add: function () { if (s) { var r = s.length; !function e(n) { d.each(n, function (n, r) { var i = d.type(r); "function" === i ? t.unique && c.has(r) || s.push(r) : r && r.length && "string" !== i && e(r) }) }(arguments), e ? i = s.length : n && (a = r, u(n)) } return this }, remove: function () { return s && d.each(arguments, function (t, n) { for (var r; (r = d.inArray(n, s, r)) > -1;)s.splice(r, 1), e && (i >= r && i--, o >= r && o--) }), this }, has: function (t) { return t ? d.inArray(t, s) > -1 : !(!s || !s.length) }, empty: function () { return s = [], i = 0, this }, disable: function () { return s = l = n = void 0, this }, disabled: function () { return !s }, lock: function () { return l = void 0, n || c.disable(), this }, locked: function () { return !l }, fireWith: function (t, n) { return !s || r && !l || (n = [t, (n = n || []).slice ? n.slice() : n], e ? l.push(n) : u(n)), this }, fire: function () { return c.fireWith(this, arguments), this }, fired: function () { return !!r } }; return c }, d.extend({ Deferred: function (t) { var e = [["resolve", "done", d.Callbacks("once memory"), "resolved"], ["reject", "fail", d.Callbacks("once memory"), "rejected"], ["notify", "progress", d.Callbacks("memory")]], n = "pending", r = { state: function () { return n }, always: function () { return i.done(arguments).fail(arguments), this }, then: function () { var t = arguments; return d.Deferred(function (n) { d.each(e, function (e, o) { var a = d.isFunction(t[e]) && t[e]; i[o[1]](function () { var t = a && a.apply(this, arguments); t && d.isFunction(t.promise) ? t.promise().done(n.resolve).fail(n.reject).progress(n.notify) : n[o[0] + "With"](this === r ? n.promise() : this, a ? [t] : arguments) }) }), t = null }).promise() }, promise: function (t) { return null != t ? d.extend(t, r) : r } }, i = {}; return r.pipe = r.then, d.each(e, function (t, o) { var a = o[2], s = o[3]; r[o[1]] = a.add, s && a.add(function () { n = s }, e[1 ^ t][2].disable, e[2][2].lock), i[o[0]] = function () { return i[o[0] + "With"](this === i ? r : this, arguments), this }, i[o[0] + "With"] = a.fireWith }), r.promise(i), t && t.call(i, i), i }, when: function (t) { var e, n, i, o = 0, a = r.call(arguments), s = a.length, l = 1 !== s || t && d.isFunction(t.promise) ? s : 0, u = 1 === l ? t : d.Deferred(), c = function (t, n, i) { return function (o) { n[t] = this, i[t] = arguments.length > 1 ? r.call(arguments) : o, i === e ? u.notifyWith(n, i) : --l || u.resolveWith(n, i) } }; if (s > 1) for (e = new Array(s), n = new Array(s), i = new Array(s); s > o; o++)a[o] && d.isFunction(a[o].promise) ? a[o].promise().done(c(o, i, a)).fail(u.reject).progress(c(o, n, e)) : --l; return l || u.resolveWith(i, a), u.promise() } }), d.fn.ready = function (t) { return d.ready.promise().done(t), this }, d.extend({ isReady: !1, readyWait: 1, holdReady: function (t) { t ? d.readyWait++ : d.ready(!0) }, ready: function (t) { if (!0 === t ? !--d.readyWait : !d.isReady) { if (!S.body) return setTimeout(d.ready); d.isReady = !0, !0 !== t && --d.readyWait > 0 || (E.resolveWith(S, [d]), d.fn.triggerHandler && (d(S).triggerHandler("ready"), d(S).off("ready"))) } } }), d.ready.promise = function (e) { if (!E) if (E = d.Deferred(), "complete" === S.readyState) setTimeout(d.ready); else if (S.addEventListener) S.addEventListener("DOMContentLoaded", D, !1), t.addEventListener("load", D, !1); else { S.attachEvent("onreadystatechange", D), t.attachEvent("onload", D); var n = !1; try { n = null == t.frameElement && S.documentElement } catch (t) { } n && n.doScroll && function t() { if (!d.isReady) { try { n.doScroll("left") } catch (e) { return setTimeout(t, 50) } N(), d.ready() } }() } return E.promise(e) }; var P, O = "undefined"; for (P in d(c)) break; c.ownLast = "0" !== P, c.inlineBlockNeedsLayout = !1, d(function () { var t, e, n, r; (n = S.getElementsByTagName("body")[0]) && n.style && (e = S.createElement("div"), (r = S.createElement("div")).style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px", n.appendChild(r).appendChild(e), typeof e.style.zoom !== O && (e.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1", c.inlineBlockNeedsLayout = t = 3 === e.offsetWidth, t && (n.style.zoom = 1)), n.removeChild(r)) }), function () { var t = S.createElement("div"); if (null == c.deleteExpando) { c.deleteExpando = !0; try { delete t.test } catch (t) { c.deleteExpando = !1 } } t = null }(), d.acceptData = function (t) { var e = d.noData[(t.nodeName + " ").toLowerCase()], n = +t.nodeType || 1; return (1 === n || 9 === n) && (!e || !0 !== e && t.getAttribute("classid") === e) }; var B = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, H = /([A-Z])/g; function M(t, e, n) { if (void 0 === n && 1 === t.nodeType) { var r = "data-" + e.replace(H, "-$1").toLowerCase(); if ("string" == typeof (n = t.getAttribute(r))) { try { n = "true" === n || "false" !== n && ("null" === n ? null : +n + "" === n ? +n : B.test(n) ? d.parseJSON(n) : n) } catch (t) { } d.data(t, e, n) } else n = void 0 } return n } function $(t) { var e; for (e in t) if (("data" !== e || !d.isEmptyObject(t[e])) && "toJSON" !== e) return !1; return !0 } function R(t, e, r, i) { if (d.acceptData(t)) { var o, a, s = d.expando, l = t.nodeType, u = l ? d.cache : t, c = l ? t[s] : t[s] && s; if (c && u[c] && (i || u[c].data) || void 0 !== r || "string" != typeof e) return c || (c = l ? t[s] = n.pop() || d.guid++ : s), u[c] || (u[c] = l ? {} : { toJSON: d.noop }), ("object" == typeof e || "function" == typeof e) && (i ? u[c] = d.extend(u[c], e) : u[c].data = d.extend(u[c].data, e)), a = u[c], i || (a.data || (a.data = {}), a = a.data), void 0 !== r && (a[d.camelCase(e)] = r), "string" == typeof e ? null == (o = a[e]) && (o = a[d.camelCase(e)]) : o = a, o } } function F(t, e, n) { if (d.acceptData(t)) { var r, i, o = t.nodeType, a = o ? d.cache : t, s = o ? t[d.expando] : d.expando; if (a[s]) { if (e && (r = n ? a[s] : a[s].data)) { d.isArray(e) ? e = e.concat(d.map(e, d.camelCase)) : e in r ? e = [e] : e = (e = d.camelCase(e)) in r ? [e] : e.split(" "), i = e.length; for (; i--;)delete r[e[i]]; if (n ? !$(r) : !d.isEmptyObject(r)) return } (n || (delete a[s].data, $(a[s]))) && (o ? d.cleanData([t], !0) : c.deleteExpando || a != a.window ? delete a[s] : a[s] = null) } } } d.extend({ cache: {}, noData: { "applet ": !0, "embed ": !0, "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" }, hasData: function (t) { return !!(t = t.nodeType ? d.cache[t[d.expando]] : t[d.expando]) && !$(t) }, data: function (t, e, n) { return R(t, e, n) }, removeData: function (t, e) { return F(t, e) }, _data: function (t, e, n) { return R(t, e, n, !0) }, _removeData: function (t, e) { return F(t, e, !0) } }), d.fn.extend({ data: function (t, e) { var n, r, i, o = this[0], a = o && o.attributes; if (void 0 === t) { if (this.length && (i = d.data(o), 1 === o.nodeType && !d._data(o, "parsedAttrs"))) { for (n = a.length; n--;)a[n] && (0 === (r = a[n].name).indexOf("data-") && M(o, r = d.camelCase(r.slice(5)), i[r])); d._data(o, "parsedAttrs", !0) } return i } return "object" == typeof t ? this.each(function () { d.data(this, t) }) : arguments.length > 1 ? this.each(function () { d.data(this, t, e) }) : o ? M(o, t, d.data(o, t)) : void 0 }, removeData: function (t) { return this.each(function () { d.removeData(this, t) }) } }), d.extend({ queue: function (t, e, n) { var r; return t ? (e = (e || "fx") + "queue", r = d._data(t, e), n && (!r || d.isArray(n) ? r = d._data(t, e, d.makeArray(n)) : r.push(n)), r || []) : void 0 }, dequeue: function (t, e) { e = e || "fx"; var n = d.queue(t, e), r = n.length, i = n.shift(), o = d._queueHooks(t, e); "inprogress" === i && (i = n.shift(), r--), i && ("fx" === e && n.unshift("inprogress"), delete o.stop, i.call(t, function () { d.dequeue(t, e) }, o)), !r && o && o.empty.fire() }, _queueHooks: function (t, e) { var n = e + "queueHooks"; return d._data(t, n) || d._data(t, n, { empty: d.Callbacks("once memory").add(function () { d._removeData(t, e + "queue"), d._removeData(t, n) }) }) } }), d.fn.extend({ queue: function (t, e) { var n = 2; return "string" != typeof t && (e = t, t = "fx", n--), arguments.length < n ? d.queue(this[0], t) : void 0 === e ? this : this.each(function () { var n = d.queue(this, t, e); d._queueHooks(this, t), "fx" === t && "inprogress" !== n[0] && d.dequeue(this, t) }) }, dequeue: function (t) { return this.each(function () { d.dequeue(this, t) }) }, clearQueue: function (t) { return this.queue(t || "fx", []) }, promise: function (t, e) { var n, r = 1, i = d.Deferred(), o = this, a = this.length, s = function () { --r || i.resolveWith(o, [o]) }; for ("string" != typeof t && (e = t, t = void 0), t = t || "fx"; a--;)(n = d._data(o[a], t + "queueHooks")) && n.empty && (r++, n.empty.add(s)); return s(), i.promise(e) } }); var W = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, z = ["Top", "Right", "Bottom", "Left"], q = function (t, e) { return t = e || t, "none" === d.css(t, "display") || !d.contains(t.ownerDocument, t) }, U = d.access = function (t, e, n, r, i, o, a) { var s = 0, l = t.length, u = null == n; if ("object" === d.type(n)) for (s in i = !0, n) d.access(t, e, s, n[s], !0, o, a); else if (void 0 !== r && (i = !0, d.isFunction(r) || (a = !0), u && (a ? (e.call(t, r), e = null) : (u = e, e = function (t, e, n) { return u.call(d(t), n) })), e)) for (; l > s; s++)e(t[s], n, a ? r : r.call(t[s], s, e(t[s], n))); return i ? t : u ? e.call(t) : l ? e(t[0], n) : o }, X = /^(?:checkbox|radio)$/i; !function () { var t = S.createElement("input"), e = S.createElement("div"), n = S.createDocumentFragment(); if (e.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>", c.leadingWhitespace = 3 === e.firstChild.nodeType, c.tbody = !e.getElementsByTagName("tbody").length, c.htmlSerialize = !!e.getElementsByTagName("link").length, c.html5Clone = "<:nav></:nav>" !== S.createElement("nav").cloneNode(!0).outerHTML, t.type = "checkbox", t.checked = !0, n.appendChild(t), c.appendChecked = t.checked, e.innerHTML = "<textarea>x</textarea>", c.noCloneChecked = !!e.cloneNode(!0).lastChild.defaultValue, n.appendChild(e), e.innerHTML = "<input type='radio' checked='checked' name='t'/>", c.checkClone = e.cloneNode(!0).cloneNode(!0).lastChild.checked, c.noCloneEvent = !0, e.attachEvent && (e.attachEvent("onclick", function () { c.noCloneEvent = !1 }), e.cloneNode(!0).click()), null == c.deleteExpando) { c.deleteExpando = !0; try { delete e.test } catch (t) { c.deleteExpando = !1 } } }(), function () { var e, n, r = S.createElement("div"); for (e in { submit: !0, change: !0, focusin: !0 }) n = "on" + e, (c[e + "Bubbles"] = n in t) || (r.setAttribute(n, "t"), c[e + "Bubbles"] = !1 === r.attributes[n].expando); r = null }(); var G = /^(?:input|select|textarea)$/i, Q = /^key/, V = /^(?:mouse|pointer|contextmenu)|click/, Y = /^(?:focusinfocus|focusoutblur)$/, J = /^([^.]*)(?:\.(.+)|)$/; function Z() { return !0 } function K() { return !1 } function tt() { try { return S.activeElement } catch (t) { } } function et(t) { var e = nt.split("|"), n = t.createDocumentFragment(); if (n.createElement) for (; e.length;)n.createElement(e.pop()); return n } d.event = { global: {}, add: function (t, e, n, r, i) { var o, a, s, l, u, c, f, p, h, v, g, m = d._data(t); if (m) { for (n.handler && (n = (l = n).handler, i = l.selector), n.guid || (n.guid = d.guid++), (a = m.events) || (a = m.events = {}), (c = m.handle) || ((c = m.handle = function (t) { return typeof d === O || t && d.event.triggered === t.type ? void 0 : d.event.dispatch.apply(c.elem, arguments) }).elem = t), s = (e = (e || "").match(L) || [""]).length; s--;)h = g = (o = J.exec(e[s]) || [])[1], v = (o[2] || "").split(".").sort(), h && (u = d.event.special[h] || {}, h = (i ? u.delegateType : u.bindType) || h, u = d.event.special[h] || {}, f = d.extend({ type: h, origType: g, data: r, handler: n, guid: n.guid, selector: i, needsContext: i && d.expr.match.needsContext.test(i), namespace: v.join(".") }, l), (p = a[h]) || ((p = a[h] = []).delegateCount = 0, u.setup && !1 !== u.setup.call(t, r, v, c) || (t.addEventListener ? t.addEventListener(h, c, !1) : t.attachEvent && t.attachEvent("on" + h, c))), u.add && (u.add.call(t, f), f.handler.guid || (f.handler.guid = n.guid)), i ? p.splice(p.delegateCount++, 0, f) : p.push(f), d.event.global[h] = !0); t = null } }, remove: function (t, e, n, r, i) { var o, a, s, l, u, c, f, p, h, v, g, m = d.hasData(t) && d._data(t); if (m && (c = m.events)) { for (u = (e = (e || "").match(L) || [""]).length; u--;)if (h = g = (s = J.exec(e[u]) || [])[1], v = (s[2] || "").split(".").sort(), h) { for (f = d.event.special[h] || {}, p = c[h = (r ? f.delegateType : f.bindType) || h] || [], s = s[2] && new RegExp("(^|\\.)" + v.join("\\.(?:.*\\.|)") + "(\\.|$)"), l = o = p.length; o--;)a = p[o], !i && g !== a.origType || n && n.guid !== a.guid || s && !s.test(a.namespace) || r && r !== a.selector && ("**" !== r || !a.selector) || (p.splice(o, 1), a.selector && p.delegateCount--, f.remove && f.remove.call(t, a)); l && !p.length && (f.teardown && !1 !== f.teardown.call(t, v, m.handle) || d.removeEvent(t, h, m.handle), delete c[h]) } else for (h in c) d.event.remove(t, h + e[u], n, r, !0); d.isEmptyObject(c) && (delete m.handle, d._removeData(t, "events")) } }, trigger: function (e, n, r, i) { var o, a, s, l, c, f, p, h = [r || S], v = u.call(e, "type") ? e.type : e, g = u.call(e, "namespace") ? e.namespace.split(".") : []; if (s = f = r = r || S, 3 !== r.nodeType && 8 !== r.nodeType && !Y.test(v + d.event.triggered) && (v.indexOf(".") >= 0 && (g = v.split("."), v = g.shift(), g.sort()), a = v.indexOf(":") < 0 && "on" + v, (e = e[d.expando] ? e : new d.Event(v, "object" == typeof e && e)).isTrigger = i ? 2 : 3, e.namespace = g.join("."), e.namespace_re = e.namespace ? new RegExp("(^|\\.)" + g.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, e.result = void 0, e.target || (e.target = r), n = null == n ? [e] : d.makeArray(n, [e]), c = d.event.special[v] || {}, i || !c.trigger || !1 !== c.trigger.apply(r, n))) { if (!i && !c.noBubble && !d.isWindow(r)) { for (l = c.delegateType || v, Y.test(l + v) || (s = s.parentNode); s; s = s.parentNode)h.push(s), f = s; f === (r.ownerDocument || S) && h.push(f.defaultView || f.parentWindow || t) } for (p = 0; (s = h[p++]) && !e.isPropagationStopped();)e.type = p > 1 ? l : c.bindType || v, (o = (d._data(s, "events") || {})[e.type] && d._data(s, "handle")) && o.apply(s, n), (o = a && s[a]) && o.apply && d.acceptData(s) && (e.result = o.apply(s, n), !1 === e.result && e.preventDefault()); if (e.type = v, !i && !e.isDefaultPrevented() && (!c._default || !1 === c._default.apply(h.pop(), n)) && d.acceptData(r) && a && r[v] && !d.isWindow(r)) { (f = r[a]) && (r[a] = null), d.event.triggered = v; try { r[v]() } catch (t) { } d.event.triggered = void 0, f && (r[a] = f) } return e.result } }, dispatch: function (t) { t = d.event.fix(t); var e, n, i, o, a, s = [], l = r.call(arguments), u = (d._data(this, "events") || {})[t.type] || [], c = d.event.special[t.type] || {}; if (l[0] = t, t.delegateTarget = this, !c.preDispatch || !1 !== c.preDispatch.call(this, t)) { for (s = d.event.handlers.call(this, t, u), e = 0; (o = s[e++]) && !t.isPropagationStopped();)for (t.currentTarget = o.elem, a = 0; (i = o.handlers[a++]) && !t.isImmediatePropagationStopped();)(!t.namespace_re || t.namespace_re.test(i.namespace)) && (t.handleObj = i, t.data = i.data, void 0 !== (n = ((d.event.special[i.origType] || {}).handle || i.handler).apply(o.elem, l)) && !1 === (t.result = n) && (t.preventDefault(), t.stopPropagation())); return c.postDispatch && c.postDispatch.call(this, t), t.result } }, handlers: function (t, e) { var n, r, i, o, a = [], s = e.delegateCount, l = t.target; if (s && l.nodeType && (!t.button || "click" !== t.type)) for (; l != this; l = l.parentNode || this)if (1 === l.nodeType && (!0 !== l.disabled || "click" !== t.type)) { for (i = [], o = 0; s > o; o++)void 0 === i[n = (r = e[o]).selector + " "] && (i[n] = r.needsContext ? d(n, this).index(l) >= 0 : d.find(n, this, null, [l]).length), i[n] && i.push(r); i.length && a.push({ elem: l, handlers: i }) } return s < e.length && a.push({ elem: this, handlers: e.slice(s) }), a }, fix: function (t) { if (t[d.expando]) return t; var e, n, r, i = t.type, o = t, a = this.fixHooks[i]; for (a || (this.fixHooks[i] = a = V.test(i) ? this.mouseHooks : Q.test(i) ? this.keyHooks : {}), r = a.props ? this.props.concat(a.props) : this.props, t = new d.Event(o), e = r.length; e--;)t[n = r[e]] = o[n]; return t.target || (t.target = o.srcElement || S), 3 === t.target.nodeType && (t.target = t.target.parentNode), t.metaKey = !!t.metaKey, a.filter ? a.filter(t, o) : t }, props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function (t, e) { return null == t.which && (t.which = null != e.charCode ? e.charCode : e.keyCode), t } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function (t, e) { var n, r, i, o = e.button, a = e.fromElement; return null == t.pageX && null != e.clientX && (i = (r = t.target.ownerDocument || S).documentElement, n = r.body, t.pageX = e.clientX + (i && i.scrollLeft || n && n.scrollLeft || 0) - (i && i.clientLeft || n && n.clientLeft || 0), t.pageY = e.clientY + (i && i.scrollTop || n && n.scrollTop || 0) - (i && i.clientTop || n && n.clientTop || 0)), !t.relatedTarget && a && (t.relatedTarget = a === t.target ? e.toElement : a), t.which || void 0 === o || (t.which = 1 & o ? 1 : 2 & o ? 3 : 4 & o ? 2 : 0), t } }, special: { load: { noBubble: !0 }, focus: { trigger: function () { if (this !== tt() && this.focus) try { return this.focus(), !1 } catch (t) { } }, delegateType: "focusin" }, blur: { trigger: function () { return this === tt() && this.blur ? (this.blur(), !1) : void 0 }, delegateType: "focusout" }, click: { trigger: function () { return d.nodeName(this, "input") && "checkbox" === this.type && this.click ? (this.click(), !1) : void 0 }, _default: function (t) { return d.nodeName(t.target, "a") } }, beforeunload: { postDispatch: function (t) { void 0 !== t.result && t.originalEvent && (t.originalEvent.returnValue = t.result) } } }, simulate: function (t, e, n, r) { var i = d.extend(new d.Event, n, { type: t, isSimulated: !0, originalEvent: {} }); r ? d.event.trigger(i, null, e) : d.event.dispatch.call(e, i), i.isDefaultPrevented() && n.preventDefault() } }, d.removeEvent = S.removeEventListener ? function (t, e, n) { t.removeEventListener && t.removeEventListener(e, n, !1) } : function (t, e, n) { var r = "on" + e; t.detachEvent && (typeof t[r] === O && (t[r] = null), t.detachEvent(r, n)) }, d.Event = function (t, e) { return this instanceof d.Event ? (t && t.type ? (this.originalEvent = t, this.type = t.type, this.isDefaultPrevented = t.defaultPrevented || void 0 === t.defaultPrevented && !1 === t.returnValue ? Z : K) : this.type = t, e && d.extend(this, e), this.timeStamp = t && t.timeStamp || d.now(), void (this[d.expando] = !0)) : new d.Event(t, e) }, d.Event.prototype = { isDefaultPrevented: K, isPropagationStopped: K, isImmediatePropagationStopped: K, preventDefault: function () { var t = this.originalEvent; this.isDefaultPrevented = Z, t && (t.preventDefault ? t.preventDefault() : t.returnValue = !1) }, stopPropagation: function () { var t = this.originalEvent; this.isPropagationStopped = Z, t && (t.stopPropagation && t.stopPropagation(), t.cancelBubble = !0) }, stopImmediatePropagation: function () { var t = this.originalEvent; this.isImmediatePropagationStopped = Z, t && t.stopImmediatePropagation && t.stopImmediatePropagation(), this.stopPropagation() } }, d.each({ mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function (t, e) { d.event.special[t] = { delegateType: e, bindType: e, handle: function (t) { var n, r = t.relatedTarget, i = t.handleObj; return (!r || r !== this && !d.contains(this, r)) && (t.type = i.origType, n = i.handler.apply(this, arguments), t.type = e), n } } }), c.submitBubbles || (d.event.special.submit = { setup: function () { return !d.nodeName(this, "form") && void d.event.add(this, "click._submit keypress._submit", function (t) { var e = t.target, n = d.nodeName(e, "input") || d.nodeName(e, "button") ? e.form : void 0; n && !d._data(n, "submitBubbles") && (d.event.add(n, "submit._submit", function (t) { t._submit_bubble = !0 }), d._data(n, "submitBubbles", !0)) }) }, postDispatch: function (t) { t._submit_bubble && (delete t._submit_bubble, this.parentNode && !t.isTrigger && d.event.simulate("submit", this.parentNode, t, !0)) }, teardown: function () { return !d.nodeName(this, "form") && void d.event.remove(this, "._submit") } }), c.changeBubbles || (d.event.special.change = { setup: function () { return G.test(this.nodeName) ? (("checkbox" === this.type || "radio" === this.type) && (d.event.add(this, "propertychange._change", function (t) { "checked" === t.originalEvent.propertyName && (this._just_changed = !0) }), d.event.add(this, "click._change", function (t) { this._just_changed && !t.isTrigger && (this._just_changed = !1), d.event.simulate("change", this, t, !0) })), !1) : void d.event.add(this, "beforeactivate._change", function (t) { var e = t.target; G.test(e.nodeName) && !d._data(e, "changeBubbles") && (d.event.add(e, "change._change", function (t) { !this.parentNode || t.isSimulated || t.isTrigger || d.event.simulate("change", this.parentNode, t, !0) }), d._data(e, "changeBubbles", !0)) }) }, handle: function (t) { var e = t.target; return this !== e || t.isSimulated || t.isTrigger || "radio" !== e.type && "checkbox" !== e.type ? t.handleObj.handler.apply(this, arguments) : void 0 }, teardown: function () { return d.event.remove(this, "._change"), !G.test(this.nodeName) } }), c.focusinBubbles || d.each({ focus: "focusin", blur: "focusout" }, function (t, e) { var n = function (t) { d.event.simulate(e, t.target, d.event.fix(t), !0) }; d.event.special[e] = { setup: function () { var r = this.ownerDocument || this, i = d._data(r, e); i || r.addEventListener(t, n, !0), d._data(r, e, (i || 0) + 1) }, teardown: function () { var r = this.ownerDocument || this, i = d._data(r, e) - 1; i ? d._data(r, e, i) : (r.removeEventListener(t, n, !0), d._removeData(r, e)) } } }), d.fn.extend({ on: function (t, e, n, r, i) { var o, a; if ("object" == typeof t) { for (o in "string" != typeof e && (n = n || e, e = void 0), t) this.on(o, e, n, t[o], i); return this } if (null == n && null == r ? (r = e, n = e = void 0) : null == r && ("string" == typeof e ? (r = n, n = void 0) : (r = n, n = e, e = void 0)), !1 === r) r = K; else if (!r) return this; return 1 === i && (a = r, (r = function (t) { return d().off(t), a.apply(this, arguments) }).guid = a.guid || (a.guid = d.guid++)), this.each(function () { d.event.add(this, t, r, n, e) }) }, one: function (t, e, n, r) { return this.on(t, e, n, r, 1) }, off: function (t, e, n) { var r, i; if (t && t.preventDefault && t.handleObj) return r = t.handleObj, d(t.delegateTarget).off(r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler), this; if ("object" == typeof t) { for (i in t) this.off(i, e, t[i]); return this } return (!1 === e || "function" == typeof e) && (n = e, e = void 0), !1 === n && (n = K), this.each(function () { d.event.remove(this, t, n, e) }) }, trigger: function (t, e) { return this.each(function () { d.event.trigger(t, e, this) }) }, triggerHandler: function (t, e) { var n = this[0]; return n ? d.event.trigger(t, e, n, !0) : void 0 } }); var nt = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rt = / jQuery\d+="(?:null|\d+)"/g, it = new RegExp("<(?:" + nt + ")[\\s/>]", "i"), ot = /^\s+/, at = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, st = /<([\w:]+)/, lt = /<tbody/i, ut = /<|&#?\w+;/, ct = /<(?:script|style|link)/i, ft = /checked\s*(?:[^=]|=\s*.checked.)/i, dt = /^$|\/(?:java|ecma)script/i, pt = /^true\/(.*)/, ht = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, vt = { option: [1, "<select multiple='multiple'>", "</select>"], legend: [1, "<fieldset>", "</fieldset>"], area: [1, "<map>", "</map>"], param: [1, "<object>", "</object>"], thead: [1, "<table>", "</table>"], tr: [2, "<table><tbody>", "</tbody></table>"], col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"], td: [3, "<table><tbody><tr>", "</tr></tbody></table>"], _default: c.htmlSerialize ? [0, "", ""] : [1, "X<div>", "</div>"] }, gt = et(S).appendChild(S.createElement("div")); function mt(t, e) { var n, r, i = 0, o = typeof t.getElementsByTagName !== O ? t.getElementsByTagName(e || "*") : typeof t.querySelectorAll !== O ? t.querySelectorAll(e || "*") : void 0; if (!o) for (o = [], n = t.childNodes || t; null != (r = n[i]); i++)!e || d.nodeName(r, e) ? o.push(r) : d.merge(o, mt(r, e)); return void 0 === e || e && d.nodeName(t, e) ? d.merge([t], o) : o } function yt(t) { X.test(t.type) && (t.defaultChecked = t.checked) } function bt(t, e) { return d.nodeName(t, "table") && d.nodeName(11 !== e.nodeType ? e : e.firstChild, "tr") ? t.getElementsByTagName("tbody")[0] || t.appendChild(t.ownerDocument.createElement("tbody")) : t } function wt(t) { return t.type = (null !== d.find.attr(t, "type")) + "/" + t.type, t } function xt(t) { var e = pt.exec(t.type); return e ? t.type = e[1] : t.removeAttribute("type"), t } function _t(t, e) { for (var n, r = 0; null != (n = t[r]); r++)d._data(n, "globalEval", !e || d._data(e[r], "globalEval")) } function Ct(t, e) { if (1 === e.nodeType && d.hasData(t)) { var n, r, i, o = d._data(t), a = d._data(e, o), s = o.events; if (s) for (n in delete a.handle, a.events = {}, s) for (r = 0, i = s[n].length; i > r; r++)d.event.add(e, n, s[n][r]); a.data && (a.data = d.extend({}, a.data)) } } function St(t, e) { var n, r, i; if (1 === e.nodeType) { if (n = e.nodeName.toLowerCase(), !c.noCloneEvent && e[d.expando]) { for (r in (i = d._data(e)).events) d.removeEvent(e, r, i.handle); e.removeAttribute(d.expando) } "script" === n && e.text !== t.text ? (wt(e).text = t.text, xt(e)) : "object" === n ? (e.parentNode && (e.outerHTML = t.outerHTML), c.html5Clone && t.innerHTML && !d.trim(e.innerHTML) && (e.innerHTML = t.innerHTML)) : "input" === n && X.test(t.type) ? (e.defaultChecked = e.checked = t.checked, e.value !== t.value && (e.value = t.value)) : "option" === n ? e.defaultSelected = e.selected = t.defaultSelected : ("input" === n || "textarea" === n) && (e.defaultValue = t.defaultValue) } } vt.optgroup = vt.option, vt.tbody = vt.tfoot = vt.colgroup = vt.caption = vt.thead, vt.th = vt.td, d.extend({ clone: function (t, e, n) { var r, i, o, a, s, l = d.contains(t.ownerDocument, t); if (c.html5Clone || d.isXMLDoc(t) || !it.test("<" + t.nodeName + ">") ? o = t.cloneNode(!0) : (gt.innerHTML = t.outerHTML, gt.removeChild(o = gt.firstChild)), !(c.noCloneEvent && c.noCloneChecked || 1 !== t.nodeType && 11 !== t.nodeType || d.isXMLDoc(t))) for (r = mt(o), s = mt(t), a = 0; null != (i = s[a]); ++a)r[a] && St(i, r[a]); if (e) if (n) for (s = s || mt(t), r = r || mt(o), a = 0; null != (i = s[a]); a++)Ct(i, r[a]); else Ct(t, o); return (r = mt(o, "script")).length > 0 && _t(r, !l && mt(t, "script")), r = s = i = null, o }, buildFragment: function (t, e, n, r) { for (var i, o, a, s, l, u, f, p = t.length, h = et(e), v = [], g = 0; p > g; g++)if ((o = t[g]) || 0 === o) if ("object" === d.type(o)) d.merge(v, o.nodeType ? [o] : o); else if (ut.test(o)) { for (s = s || h.appendChild(e.createElement("div")), l = (st.exec(o) || ["", ""])[1].toLowerCase(), f = vt[l] || vt._default, s.innerHTML = f[1] + o.replace(at, "<$1></$2>") + f[2], i = f[0]; i--;)s = s.lastChild; if (!c.leadingWhitespace && ot.test(o) && v.push(e.createTextNode(ot.exec(o)[0])), !c.tbody) for (i = (o = "table" !== l || lt.test(o) ? "<table>" !== f[1] || lt.test(o) ? 0 : s : s.firstChild) && o.childNodes.length; i--;)d.nodeName(u = o.childNodes[i], "tbody") && !u.childNodes.length && o.removeChild(u); for (d.merge(v, s.childNodes), s.textContent = ""; s.firstChild;)s.removeChild(s.firstChild); s = h.lastChild } else v.push(e.createTextNode(o)); for (s && h.removeChild(s), c.appendChecked || d.grep(mt(v, "input"), yt), g = 0; o = v[g++];)if ((!r || -1 === d.inArray(o, r)) && (a = d.contains(o.ownerDocument, o), s = mt(h.appendChild(o), "script"), a && _t(s), n)) for (i = 0; o = s[i++];)dt.test(o.type || "") && n.push(o); return s = null, h }, cleanData: function (t, e) { for (var r, i, o, a, s = 0, l = d.expando, u = d.cache, f = c.deleteExpando, p = d.event.special; null != (r = t[s]); s++)if ((e || d.acceptData(r)) && (a = (o = r[l]) && u[o])) { if (a.events) for (i in a.events) p[i] ? d.event.remove(r, i) : d.removeEvent(r, i, a.handle); u[o] && (delete u[o], f ? delete r[l] : typeof r.removeAttribute !== O ? r.removeAttribute(l) : r[l] = null, n.push(o)) } } }), d.fn.extend({ text: function (t) { return U(this, function (t) { return void 0 === t ? d.text(this) : this.empty().append((this[0] && this[0].ownerDocument || S).createTextNode(t)) }, null, t, arguments.length) }, append: function () { return this.domManip(arguments, function (t) { 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || bt(this, t).appendChild(t) }) }, prepend: function () { return this.domManip(arguments, function (t) { if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { var e = bt(this, t); e.insertBefore(t, e.firstChild) } }) }, before: function () { return this.domManip(arguments, function (t) { this.parentNode && this.parentNode.insertBefore(t, this) }) }, after: function () { return this.domManip(arguments, function (t) { this.parentNode && this.parentNode.insertBefore(t, this.nextSibling) }) }, remove: function (t, e) { for (var n, r = t ? d.filter(t, this) : this, i = 0; null != (n = r[i]); i++)e || 1 !== n.nodeType || d.cleanData(mt(n)), n.parentNode && (e && d.contains(n.ownerDocument, n) && _t(mt(n, "script")), n.parentNode.removeChild(n)); return this }, empty: function () { for (var t, e = 0; null != (t = this[e]); e++) { for (1 === t.nodeType && d.cleanData(mt(t, !1)); t.firstChild;)t.removeChild(t.firstChild); t.options && d.nodeName(t, "select") && (t.options.length = 0) } return this }, clone: function (t, e) { return t = null != t && t, e = null == e ? t : e, this.map(function () { return d.clone(this, t, e) }) }, html: function (t) { return U(this, function (t) { var e = this[0] || {}, n = 0, r = this.length; if (void 0 === t) return 1 === e.nodeType ? e.innerHTML.replace(rt, "") : void 0; if (!("string" != typeof t || ct.test(t) || !c.htmlSerialize && it.test(t) || !c.leadingWhitespace && ot.test(t) || vt[(st.exec(t) || ["", ""])[1].toLowerCase()])) { t = t.replace(at, "<$1></$2>"); try { for (; r > n; n++)1 === (e = this[n] || {}).nodeType && (d.cleanData(mt(e, !1)), e.innerHTML = t); e = 0 } catch (t) { } } e && this.empty().append(t) }, null, t, arguments.length) }, replaceWith: function () { var t = arguments[0]; return this.domManip(arguments, function (e) { t = this.parentNode, d.cleanData(mt(this)), t && t.replaceChild(e, this) }), t && (t.length || t.nodeType) ? this : this.remove() }, detach: function (t) { return this.remove(t, !0) }, domManip: function (t, e) { t = i.apply([], t); var n, r, o, a, s, l, u = 0, f = this.length, p = this, h = f - 1, v = t[0], g = d.isFunction(v); if (g || f > 1 && "string" == typeof v && !c.checkClone && ft.test(v)) return this.each(function (n) { var r = p.eq(n); g && (t[0] = v.call(this, n, r.html())), r.domManip(t, e) }); if (f && (n = (l = d.buildFragment(t, this[0].ownerDocument, !1, this)).firstChild, 1 === l.childNodes.length && (l = n), n)) { for (o = (a = d.map(mt(l, "script"), wt)).length; f > u; u++)r = l, u !== h && (r = d.clone(r, !0, !0), o && d.merge(a, mt(r, "script"))), e.call(this[u], r, u); if (o) for (s = a[a.length - 1].ownerDocument, d.map(a, xt), u = 0; o > u; u++)r = a[u], dt.test(r.type || "") && !d._data(r, "globalEval") && d.contains(s, r) && (r.src ? d._evalUrl && d._evalUrl(r.src) : d.globalEval((r.text || r.textContent || r.innerHTML || "").replace(ht, ""))); l = n = null } return this } }), d.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function (t, e) { d.fn[t] = function (t) { for (var n, r = 0, i = [], a = d(t), s = a.length - 1; s >= r; r++)n = r === s ? this : this.clone(!0), d(a[r])[e](n), o.apply(i, n.get()); return this.pushStack(i) } }); var kt, Tt = {}; function jt(e, n) { var r, i = d(n.createElement(e)).appendTo(n.body), o = t.getDefaultComputedStyle && (r = t.getDefaultComputedStyle(i[0])) ? r.display : d.css(i[0], "display"); return i.detach(), o } function It(t) { var e = S, n = Tt[t]; return n || ("none" !== (n = jt(t, e)) && n || ((e = ((kt = (kt || d("<iframe frameborder='0' width='0' height='0'/>")).appendTo(e.documentElement))[0].contentWindow || kt[0].contentDocument).document).write(), e.close(), n = jt(t, e), kt.detach()), Tt[t] = n), n } !function () { var t; c.shrinkWrapBlocks = function () { return null != t ? t : (t = !1, (n = S.getElementsByTagName("body")[0]) && n.style ? (e = S.createElement("div"), (r = S.createElement("div")).style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px", n.appendChild(r).appendChild(e), typeof e.style.zoom !== O && (e.style.cssText = "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1", e.appendChild(S.createElement("div")).style.width = "5px", t = 3 !== e.offsetWidth), n.removeChild(r), t) : void 0); var e, n, r } }(); var Et, Lt, At = /^margin/, Nt = new RegExp("^(" + W + ")(?!px)[a-z%]+$", "i"), Dt = /^(top|right|bottom|left)$/; function Pt(t, e) { return { get: function () { var n = t(); if (null != n) return n ? void delete this.get : (this.get = e).apply(this, arguments) } } } t.getComputedStyle ? (Et = function (e) { return e.ownerDocument.defaultView.opener ? e.ownerDocument.defaultView.getComputedStyle(e, null) : t.getComputedStyle(e, null) }, Lt = function (t, e, n) { var r, i, o, a, s = t.style; return a = (n = n || Et(t)) ? n.getPropertyValue(e) || n[e] : void 0, n && ("" !== a || d.contains(t.ownerDocument, t) || (a = d.style(t, e)), Nt.test(a) && At.test(e) && (r = s.width, i = s.minWidth, o = s.maxWidth, s.minWidth = s.maxWidth = s.width = a, a = n.width, s.width = r, s.minWidth = i, s.maxWidth = o)), void 0 === a ? a : a + "" }) : S.documentElement.currentStyle && (Et = function (t) { return t.currentStyle }, Lt = function (t, e, n) { var r, i, o, a, s = t.style; return null == (a = (n = n || Et(t)) ? n[e] : void 0) && s && s[e] && (a = s[e]), Nt.test(a) && !Dt.test(e) && (r = s.left, (o = (i = t.runtimeStyle) && i.left) && (i.left = t.currentStyle.left), s.left = "fontSize" === e ? "1em" : a, a = s.pixelLeft + "px", s.left = r, o && (i.left = o)), void 0 === a ? a : a + "" || "auto" }), function () { var e, n, r, i, o, a, s; if ((e = S.createElement("div")).innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>", n = (r = e.getElementsByTagName("a")[0]) && r.style) { function l() { var e, n, r, l; (n = S.getElementsByTagName("body")[0]) && n.style && (e = S.createElement("div"), (r = S.createElement("div")).style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px", n.appendChild(r).appendChild(e), e.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute", i = o = !1, s = !0, t.getComputedStyle && (i = "1%" !== (t.getComputedStyle(e, null) || {}).top, o = "4px" === (t.getComputedStyle(e, null) || { width: "4px" }).width, (l = e.appendChild(S.createElement("div"))).style.cssText = e.style.cssText = "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0", l.style.marginRight = l.style.width = "0", e.style.width = "1px", s = !parseFloat((t.getComputedStyle(l, null) || {}).marginRight), e.removeChild(l)), e.innerHTML = "<table><tr><td></td><td>t</td></tr></table>", (l = e.getElementsByTagName("td"))[0].style.cssText = "margin:0;border:0;padding:0;display:none", (a = 0 === l[0].offsetHeight) && (l[0].style.display = "", l[1].style.display = "none", a = 0 === l[0].offsetHeight), n.removeChild(r)) } n.cssText = "float:left;opacity:.5", c.opacity = "0.5" === n.opacity, c.cssFloat = !!n.cssFloat, e.style.backgroundClip = "content-box", e.cloneNode(!0).style.backgroundClip = "", c.clearCloneStyle = "content-box" === e.style.backgroundClip, c.boxSizing = "" === n.boxSizing || "" === n.MozBoxSizing || "" === n.WebkitBoxSizing, d.extend(c, { reliableHiddenOffsets: function () { return null == a && l(), a }, boxSizingReliable: function () { return null == o && l(), o }, pixelPosition: function () { return null == i && l(), i }, reliableMarginRight: function () { return null == s && l(), s } }) } }(), d.swap = function (t, e, n, r) { var i, o, a = {}; for (o in e) a[o] = t.style[o], t.style[o] = e[o]; for (o in i = n.apply(t, r || []), e) t.style[o] = a[o]; return i }; var Ot = /alpha\([^)]*\)/i, Bt = /opacity\s*=\s*([^)]*)/, Ht = /^(none|table(?!-c[ea]).+)/, Mt = new RegExp("^(" + W + ")(.*)$", "i"), $t = new RegExp("^([+-])=(" + W + ")", "i"), Rt = { position: "absolute", visibility: "hidden", display: "block" }, Ft = { letterSpacing: "0", fontWeight: "400" }, Wt = ["Webkit", "O", "Moz", "ms"]; function zt(t, e) { if (e in t) return e; for (var n = e.charAt(0).toUpperCase() + e.slice(1), r = e, i = Wt.length; i--;)if ((e = Wt[i] + n) in t) return e; return r } function qt(t, e) { for (var n, r, i, o = [], a = 0, s = t.length; s > a; a++)(r = t[a]).style && (o[a] = d._data(r, "olddisplay"), n = r.style.display, e ? (o[a] || "none" !== n || (r.style.display = ""), "" === r.style.display && q(r) && (o[a] = d._data(r, "olddisplay", It(r.nodeName)))) : (i = q(r), (n && "none" !== n || !i) && d._data(r, "olddisplay", i ? n : d.css(r, "display")))); for (a = 0; s > a; a++)(r = t[a]).style && (e && "none" !== r.style.display && "" !== r.style.display || (r.style.display = e ? o[a] || "" : "none")); return t } function Ut(t, e, n) { var r = Mt.exec(e); return r ? Math.max(0, r[1] - (n || 0)) + (r[2] || "px") : e } function Xt(t, e, n, r, i) { for (var o = n === (r ? "border" : "content") ? 4 : "width" === e ? 1 : 0, a = 0; 4 > o; o += 2)"margin" === n && (a += d.css(t, n + z[o], !0, i)), r ? ("content" === n && (a -= d.css(t, "padding" + z[o], !0, i)), "margin" !== n && (a -= d.css(t, "border" + z[o] + "Width", !0, i))) : (a += d.css(t, "padding" + z[o], !0, i), "padding" !== n && (a += d.css(t, "border" + z[o] + "Width", !0, i))); return a } function Gt(t, e, n) { var r = !0, i = "width" === e ? t.offsetWidth : t.offsetHeight, o = Et(t), a = c.boxSizing && "border-box" === d.css(t, "boxSizing", !1, o); if (0 >= i || null == i) { if ((0 > (i = Lt(t, e, o)) || null == i) && (i = t.style[e]), Nt.test(i)) return i; r = a && (c.boxSizingReliable() || i === t.style[e]), i = parseFloat(i) || 0 } return i + Xt(t, e, n || (a ? "border" : "content"), r, o) + "px" } function Qt(t, e, n, r, i) { return new Qt.prototype.init(t, e, n, r, i) } d.extend({ cssHooks: { opacity: { get: function (t, e) { if (e) { var n = Lt(t, "opacity"); return "" === n ? "1" : n } } } }, cssNumber: { columnCount: !0, fillOpacity: !0, flexGrow: !0, flexShrink: !0, fontWeight: !0, lineHeight: !0, opacity: !0, order: !0, orphans: !0, widows: !0, zIndex: !0, zoom: !0 }, cssProps: { float: c.cssFloat ? "cssFloat" : "styleFloat" }, style: function (t, e, n, r) { if (t && 3 !== t.nodeType && 8 !== t.nodeType && t.style) { var i, o, a, s = d.camelCase(e), l = t.style; if (e = d.cssProps[s] || (d.cssProps[s] = zt(l, s)), a = d.cssHooks[e] || d.cssHooks[s], void 0 === n) return a && "get" in a && void 0 !== (i = a.get(t, !1, r)) ? i : l[e]; if ("string" === (o = typeof n) && (i = $t.exec(n)) && (n = (i[1] + 1) * i[2] + parseFloat(d.css(t, e)), o = "number"), null != n && n == n && ("number" !== o || d.cssNumber[s] || (n += "px"), c.clearCloneStyle || "" !== n || 0 !== e.indexOf("background") || (l[e] = "inherit"), !(a && "set" in a && void 0 === (n = a.set(t, n, r))))) try { l[e] = n } catch (t) { } } }, css: function (t, e, n, r) { var i, o, a, s = d.camelCase(e); return e = d.cssProps[s] || (d.cssProps[s] = zt(t.style, s)), (a = d.cssHooks[e] || d.cssHooks[s]) && "get" in a && (o = a.get(t, !0, n)), void 0 === o && (o = Lt(t, e, r)), "normal" === o && e in Ft && (o = Ft[e]), "" === n || n ? (i = parseFloat(o), !0 === n || d.isNumeric(i) ? i || 0 : o) : o } }), d.each(["height", "width"], function (t, e) { d.cssHooks[e] = { get: function (t, n, r) { return n ? Ht.test(d.css(t, "display")) && 0 === t.offsetWidth ? d.swap(t, Rt, function () { return Gt(t, e, r) }) : Gt(t, e, r) : void 0 }, set: function (t, n, r) { var i = r && Et(t); return Ut(0, n, r ? Xt(t, e, r, c.boxSizing && "border-box" === d.css(t, "boxSizing", !1, i), i) : 0) } } }), c.opacity || (d.cssHooks.opacity = { get: function (t, e) { return Bt.test((e && t.currentStyle ? t.currentStyle.filter : t.style.filter) || "") ? .01 * parseFloat(RegExp.$1) + "" : e ? "1" : "" }, set: function (t, e) { var n = t.style, r = t.currentStyle, i = d.isNumeric(e) ? "alpha(opacity=" + 100 * e + ")" : "", o = r && r.filter || n.filter || ""; n.zoom = 1, (e >= 1 || "" === e) && "" === d.trim(o.replace(Ot, "")) && n.removeAttribute && (n.removeAttribute("filter"), "" === e || r && !r.filter) || (n.filter = Ot.test(o) ? o.replace(Ot, i) : o + " " + i) } }), d.cssHooks.marginRight = Pt(c.reliableMarginRight, function (t, e) { return e ? d.swap(t, { display: "inline-block" }, Lt, [t, "marginRight"]) : void 0 }), d.each({ margin: "", padding: "", border: "Width" }, function (t, e) { d.cssHooks[t + e] = { expand: function (n) { for (var r = 0, i = {}, o = "string" == typeof n ? n.split(" ") : [n]; 4 > r; r++)i[t + z[r] + e] = o[r] || o[r - 2] || o[0]; return i } }, At.test(t) || (d.cssHooks[t + e].set = Ut) }), d.fn.extend({ css: function (t, e) { return U(this, function (t, e, n) { var r, i, o = {}, a = 0; if (d.isArray(e)) { for (r = Et(t), i = e.length; i > a; a++)o[e[a]] = d.css(t, e[a], !1, r); return o } return void 0 !== n ? d.style(t, e, n) : d.css(t, e) }, t, e, arguments.length > 1) }, show: function () { return qt(this, !0) }, hide: function () { return qt(this) }, toggle: function (t) { return "boolean" == typeof t ? t ? this.show() : this.hide() : this.each(function () { q(this) ? d(this).show() : d(this).hide() }) } }), d.Tween = Qt, Qt.prototype = { constructor: Qt, init: function (t, e, n, r, i, o) { this.elem = t, this.prop = n, this.easing = i || "swing", this.options = e, this.start = this.now = this.cur(), this.end = r, this.unit = o || (d.cssNumber[n] ? "" : "px") }, cur: function () { var t = Qt.propHooks[this.prop]; return t && t.get ? t.get(this) : Qt.propHooks._default.get(this) }, run: function (t) { var e, n = Qt.propHooks[this.prop]; return this.pos = e = this.options.duration ? d.easing[this.easing](t, this.options.duration * t, 0, 1, this.options.duration) : t, this.now = (this.end - this.start) * e + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), n && n.set ? n.set(this) : Qt.propHooks._default.set(this), this } }, Qt.prototype.init.prototype = Qt.prototype, Qt.propHooks = { _default: { get: function (t) { var e; return null == t.elem[t.prop] || t.elem.style && null != t.elem.style[t.prop] ? (e = d.css(t.elem, t.prop, "")) && "auto" !== e ? e : 0 : t.elem[t.prop] }, set: function (t) { d.fx.step[t.prop] ? d.fx.step[t.prop](t) : t.elem.style && (null != t.elem.style[d.cssProps[t.prop]] || d.cssHooks[t.prop]) ? d.style(t.elem, t.prop, t.now + t.unit) : t.elem[t.prop] = t.now } } }, Qt.propHooks.scrollTop = Qt.propHooks.scrollLeft = { set: function (t) { t.elem.nodeType && t.elem.parentNode && (t.elem[t.prop] = t.now) } }, d.easing = { linear: function (t) { return t }, swing: function (t) { return .5 - Math.cos(t * Math.PI) / 2 } }, d.fx = Qt.prototype.init, d.fx.step = {}; var Vt, Yt, Jt = /^(?:toggle|show|hide)$/, Zt = new RegExp("^(?:([+-])=|)(" + W + ")([a-z%]*)$", "i"), Kt = /queueHooks$/, te = [function (t, e, n) { var r, i, o, a, s, l, u, f = this, p = {}, h = t.style, v = t.nodeType && q(t), g = d._data(t, "fxshow"); for (r in n.queue || (null == (s = d._queueHooks(t, "fx")).unqueued && (s.unqueued = 0, l = s.empty.fire, s.empty.fire = function () { s.unqueued || l() }), s.unqueued++, f.always(function () { f.always(function () { s.unqueued--, d.queue(t, "fx").length || s.empty.fire() }) })), 1 === t.nodeType && ("height" in e || "width" in e) && (n.overflow = [h.overflow, h.overflowX, h.overflowY], u = d.css(t, "display"), "inline" === ("none" === u ? d._data(t, "olddisplay") || It(t.nodeName) : u) && "none" === d.css(t, "float") && (c.inlineBlockNeedsLayout && "inline" !== It(t.nodeName) ? h.zoom = 1 : h.display = "inline-block")), n.overflow && (h.overflow = "hidden", c.shrinkWrapBlocks() || f.always(function () { h.overflow = n.overflow[0], h.overflowX = n.overflow[1], h.overflowY = n.overflow[2] })), e) if (i = e[r], Jt.exec(i)) { if (delete e[r], o = o || "toggle" === i, i === (v ? "hide" : "show")) { if ("show" !== i || !g || void 0 === g[r]) continue; v = !0 } p[r] = g && g[r] || d.style(t, r) } else u = void 0; if (d.isEmptyObject(p)) "inline" === ("none" === u ? It(t.nodeName) : u) && (h.display = u); else for (r in g ? "hidden" in g && (v = g.hidden) : g = d._data(t, "fxshow", {}), o && (g.hidden = !v), v ? d(t).show() : f.done(function () { d(t).hide() }), f.done(function () { var e; for (e in d._removeData(t, "fxshow"), p) d.style(t, e, p[e]) }), p) a = ie(v ? g[r] : 0, r, f), r in g || (g[r] = a.start, v && (a.end = a.start, a.start = "width" === r || "height" === r ? 1 : 0)) }], ee = { "*": [function (t, e) { var n = this.createTween(t, e), r = n.cur(), i = Zt.exec(e), o = i && i[3] || (d.cssNumber[t] ? "" : "px"), a = (d.cssNumber[t] || "px" !== o && +r) && Zt.exec(d.css(n.elem, t)), s = 1, l = 20; if (a && a[3] !== o) { o = o || a[3], i = i || [], a = +r || 1; do { a /= s = s || ".5", d.style(n.elem, t, a + o) } while (s !== (s = n.cur() / r) && 1 !== s && --l) } return i && (a = n.start = +a || +r || 0, n.unit = o, n.end = i[1] ? a + (i[1] + 1) * i[2] : +i[2]), n }] }; function ne() { return setTimeout(function () { Vt = void 0 }), Vt = d.now() } function re(t, e) { var n, r = { height: t }, i = 0; for (e = e ? 1 : 0; 4 > i; i += 2 - e)r["margin" + (n = z[i])] = r["padding" + n] = t; return e && (r.opacity = r.width = t), r } function ie(t, e, n) { for (var r, i = (ee[e] || []).concat(ee["*"]), o = 0, a = i.length; a > o; o++)if (r = i[o].call(n, e, t)) return r } function oe(t, e, n) { var r, i, o = 0, a = te.length, s = d.Deferred().always(function () { delete l.elem }), l = function () { if (i) return !1; for (var e = Vt || ne(), n = Math.max(0, u.startTime + u.duration - e), r = 1 - (n / u.duration || 0), o = 0, a = u.tweens.length; a > o; o++)u.tweens[o].run(r); return s.notifyWith(t, [u, r, n]), 1 > r && a ? n : (s.resolveWith(t, [u]), !1) }, u = s.promise({ elem: t, props: d.extend({}, e), opts: d.extend(!0, { specialEasing: {} }, n), originalProperties: e, originalOptions: n, startTime: Vt || ne(), duration: n.duration, tweens: [], createTween: function (e, n) { var r = d.Tween(t, u.opts, e, n, u.opts.specialEasing[e] || u.opts.easing); return u.tweens.push(r), r }, stop: function (e) { var n = 0, r = e ? u.tweens.length : 0; if (i) return this; for (i = !0; r > n; n++)u.tweens[n].run(1); return e ? s.resolveWith(t, [u, e]) : s.rejectWith(t, [u, e]), this } }), c = u.props; for (function (t, e) { var n, r, i, o, a; for (n in t) if (i = e[r = d.camelCase(n)], o = t[n], d.isArray(o) && (i = o[1], o = t[n] = o[0]), n !== r && (t[r] = o, delete t[n]), (a = d.cssHooks[r]) && "expand" in a) for (n in o = a.expand(o), delete t[r], o) n in t || (t[n] = o[n], e[n] = i); else e[r] = i }(c, u.opts.specialEasing); a > o; o++)if (r = te[o].call(u, t, c, u.opts)) return r; return d.map(c, ie, u), d.isFunction(u.opts.start) && u.opts.start.call(t, u), d.fx.timer(d.extend(l, { elem: t, anim: u, queue: u.opts.queue })), u.progress(u.opts.progress).done(u.opts.done, u.opts.complete).fail(u.opts.fail).always(u.opts.always) } d.Animation = d.extend(oe, { tweener: function (t, e) { d.isFunction(t) ? (e = t, t = ["*"]) : t = t.split(" "); for (var n, r = 0, i = t.length; i > r; r++)n = t[r], ee[n] = ee[n] || [], ee[n].unshift(e) }, prefilter: function (t, e) { e ? te.unshift(t) : te.push(t) } }), d.speed = function (t, e, n) { var r = t && "object" == typeof t ? d.extend({}, t) : { complete: n || !n && e || d.isFunction(t) && t, duration: t, easing: n && e || e && !d.isFunction(e) && e }; return r.duration = d.fx.off ? 0 : "number" == typeof r.duration ? r.duration : r.duration in d.fx.speeds ? d.fx.speeds[r.duration] : d.fx.speeds._default, (null == r.queue || !0 === r.queue) && (r.queue = "fx"), r.old = r.complete, r.complete = function () { d.isFunction(r.old) && r.old.call(this), r.queue && d.dequeue(this, r.queue) }, r }, d.fn.extend({ fadeTo: function (t, e, n, r) { return this.filter(q).css("opacity", 0).show().end().animate({ opacity: e }, t, n, r) }, animate: function (t, e, n, r) { var i = d.isEmptyObject(t), o = d.speed(e, n, r), a = function () { var e = oe(this, d.extend({}, t), o); (i || d._data(this, "finish")) && e.stop(!0) }; return a.finish = a, i || !1 === o.queue ? this.each(a) : this.queue(o.queue, a) }, stop: function (t, e, n) { var r = function (t) { var e = t.stop; delete t.stop, e(n) }; return "string" != typeof t && (n = e, e = t, t = void 0), e && !1 !== t && this.queue(t || "fx", []), this.each(function () { var e = !0, i = null != t && t + "queueHooks", o = d.timers, a = d._data(this); if (i) a[i] && a[i].stop && r(a[i]); else for (i in a) a[i] && a[i].stop && Kt.test(i) && r(a[i]); for (i = o.length; i--;)o[i].elem !== this || null != t && o[i].queue !== t || (o[i].anim.stop(n), e = !1, o.splice(i, 1)); (e || !n) && d.dequeue(this, t) }) }, finish: function (t) { return !1 !== t && (t = t || "fx"), this.each(function () { var e, n = d._data(this), r = n[t + "queue"], i = n[t + "queueHooks"], o = d.timers, a = r ? r.length : 0; for (n.finish = !0, d.queue(this, t, []), i && i.stop && i.stop.call(this, !0), e = o.length; e--;)o[e].elem === this && o[e].queue === t && (o[e].anim.stop(!0), o.splice(e, 1)); for (e = 0; a > e; e++)r[e] && r[e].finish && r[e].finish.call(this); delete n.finish }) } }), d.each(["toggle", "show", "hide"], function (t, e) { var n = d.fn[e]; d.fn[e] = function (t, r, i) { return null == t || "boolean" == typeof t ? n.apply(this, arguments) : this.animate(re(e, !0), t, r, i) } }), d.each({ slideDown: re("show"), slideUp: re("hide"), slideToggle: re("toggle"), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function (t, e) { d.fn[t] = function (t, n, r) { return this.animate(e, t, n, r) } }), d.timers = [], d.fx.tick = function () { var t, e = d.timers, n = 0; for (Vt = d.now(); n < e.length; n++)(t = e[n])() || e[n] !== t || e.splice(n--, 1); e.length || d.fx.stop(), Vt = void 0 }, d.fx.timer = function (t) { d.timers.push(t), t() ? d.fx.start() : d.timers.pop() }, d.fx.interval = 13, d.fx.start = function () { Yt || (Yt = setInterval(d.fx.tick, d.fx.interval)) }, d.fx.stop = function () { clearInterval(Yt), Yt = null }, d.fx.speeds = { slow: 600, fast: 200, _default: 400 }, d.fn.delay = function (t, e) { return t = d.fx && d.fx.speeds[t] || t, e = e || "fx", this.queue(e, function (e, n) { var r = setTimeout(e, t); n.stop = function () { clearTimeout(r) } }) }, function () { var t, e, n, r, i; (e = S.createElement("div")).setAttribute("className", "t"), e.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>", r = e.getElementsByTagName("a")[0], i = (n = S.createElement("select")).appendChild(S.createElement("option")), t = e.getElementsByTagName("input")[0], r.style.cssText = "top:1px", c.getSetAttribute = "t" !== e.className, c.style = /top/.test(r.getAttribute("style")), c.hrefNormalized = "/a" === r.getAttribute("href"), c.checkOn = !!t.value, c.optSelected = i.selected, c.enctype = !!S.createElement("form").enctype, n.disabled = !0, c.optDisabled = !i.disabled, (t = S.createElement("input")).setAttribute("value", ""), c.input = "" === t.getAttribute("value"), t.value = "t", t.setAttribute("type", "radio"), c.radioValue = "t" === t.value }(); var ae = /\r/g; d.fn.extend({ val: function (t) { var e, n, r, i = this[0]; return arguments.length ? (r = d.isFunction(t), this.each(function (n) { var i; 1 === this.nodeType && (null == (i = r ? t.call(this, n, d(this).val()) : t) ? i = "" : "number" == typeof i ? i += "" : d.isArray(i) && (i = d.map(i, function (t) { return null == t ? "" : t + "" })), (e = d.valHooks[this.type] || d.valHooks[this.nodeName.toLowerCase()]) && "set" in e && void 0 !== e.set(this, i, "value") || (this.value = i)) })) : i ? (e = d.valHooks[i.type] || d.valHooks[i.nodeName.toLowerCase()]) && "get" in e && void 0 !== (n = e.get(i, "value")) ? n : "string" == typeof (n = i.value) ? n.replace(ae, "") : null == n ? "" : n : void 0 } }), d.extend({ valHooks: { option: { get: function (t) { var e = d.find.attr(t, "value"); return null != e ? e : d.trim(d.text(t)) } }, select: { get: function (t) { for (var e, n, r = t.options, i = t.selectedIndex, o = "select-one" === t.type || 0 > i, a = o ? null : [], s = o ? i + 1 : r.length, l = 0 > i ? s : o ? i : 0; s > l; l++)if (!(!(n = r[l]).selected && l !== i || (c.optDisabled ? n.disabled : null !== n.getAttribute("disabled")) || n.parentNode.disabled && d.nodeName(n.parentNode, "optgroup"))) { if (e = d(n).val(), o) return e; a.push(e) } return a }, set: function (t, e) { for (var n, r, i = t.options, o = d.makeArray(e), a = i.length; a--;)if (r = i[a], d.inArray(d.valHooks.option.get(r), o) >= 0) try { r.selected = n = !0 } catch (t) { r.scrollHeight } else r.selected = !1; return n || (t.selectedIndex = -1), i } } } }), d.each(["radio", "checkbox"], function () { d.valHooks[this] = { set: function (t, e) { return d.isArray(e) ? t.checked = d.inArray(d(t).val(), e) >= 0 : void 0 } }, c.checkOn || (d.valHooks[this].get = function (t) { return null === t.getAttribute("value") ? "on" : t.value }) }); var se, le, ue = d.expr.attrHandle, ce = /^(?:checked|selected)$/i, fe = c.getSetAttribute, de = c.input; d.fn.extend({ attr: function (t, e) { return U(this, d.attr, t, e, arguments.length > 1) }, removeAttr: function (t) { return this.each(function () { d.removeAttr(this, t) }) } }), d.extend({ attr: function (t, e, n) { var r, i, o = t.nodeType; if (t && 3 !== o && 8 !== o && 2 !== o) return typeof t.getAttribute === O ? d.prop(t, e, n) : (1 === o && d.isXMLDoc(t) || (e = e.toLowerCase(), r = d.attrHooks[e] || (d.expr.match.bool.test(e) ? le : se)), void 0 === n ? r && "get" in r && null !== (i = r.get(t, e)) ? i : null == (i = d.find.attr(t, e)) ? void 0 : i : null !== n ? r && "set" in r && void 0 !== (i = r.set(t, n, e)) ? i : (t.setAttribute(e, n + ""), n) : void d.removeAttr(t, e)) }, removeAttr: function (t, e) { var n, r, i = 0, o = e && e.match(L); if (o && 1 === t.nodeType) for (; n = o[i++];)r = d.propFix[n] || n, d.expr.match.bool.test(n) ? de && fe || !ce.test(n) ? t[r] = !1 : t[d.camelCase("default-" + n)] = t[r] = !1 : d.attr(t, n, ""), t.removeAttribute(fe ? n : r) }, attrHooks: { type: { set: function (t, e) { if (!c.radioValue && "radio" === e && d.nodeName(t, "input")) { var n = t.value; return t.setAttribute("type", e), n && (t.value = n), e } } } } }), le = { set: function (t, e, n) { return !1 === e ? d.removeAttr(t, n) : de && fe || !ce.test(n) ? t.setAttribute(!fe && d.propFix[n] || n, n) : t[d.camelCase("default-" + n)] = t[n] = !0, n } }, d.each(d.expr.match.bool.source.match(/\w+/g), function (t, e) { var n = ue[e] || d.find.attr; ue[e] = de && fe || !ce.test(e) ? function (t, e, r) { var i, o; return r || (o = ue[e], ue[e] = i, i = null != n(t, e, r) ? e.toLowerCase() : null, ue[e] = o), i } : function (t, e, n) { return n ? void 0 : t[d.camelCase("default-" + e)] ? e.toLowerCase() : null } }), de && fe || (d.attrHooks.value = { set: function (t, e, n) { return d.nodeName(t, "input") ? void (t.defaultValue = e) : se && se.set(t, e, n) } }), fe || (se = { set: function (t, e, n) { var r = t.getAttributeNode(n); return r || t.setAttributeNode(r = t.ownerDocument.createAttribute(n)), r.value = e += "", "value" === n || e === t.getAttribute(n) ? e : void 0 } }, ue.id = ue.name = ue.coords = function (t, e, n) { var r; return n ? void 0 : (r = t.getAttributeNode(e)) && "" !== r.value ? r.value : null }, d.valHooks.button = { get: function (t, e) { var n = t.getAttributeNode(e); return n && n.specified ? n.value : void 0 }, set: se.set }, d.attrHooks.contenteditable = { set: function (t, e, n) { se.set(t, "" !== e && e, n) } }, d.each(["width", "height"], function (t, e) { d.attrHooks[e] = { set: function (t, n) { return "" === n ? (t.setAttribute(e, "auto"), n) : void 0 } } })), c.style || (d.attrHooks.style = { get: function (t) { return t.style.cssText || void 0 }, set: function (t, e) { return t.style.cssText = e + "" } }); var pe = /^(?:input|select|textarea|button|object)$/i, he = /^(?:a|area)$/i; d.fn.extend({ prop: function (t, e) { return U(this, d.prop, t, e, arguments.length > 1) }, removeProp: function (t) { return t = d.propFix[t] || t, this.each(function () { try { this[t] = void 0, delete this[t] } catch (t) { } }) } }), d.extend({ propFix: { for: "htmlFor", class: "className" }, prop: function (t, e, n) { var r, i, o = t.nodeType; if (t && 3 !== o && 8 !== o && 2 !== o) return (1 !== o || !d.isXMLDoc(t)) && (e = d.propFix[e] || e, i = d.propHooks[e]), void 0 !== n ? i && "set" in i && void 0 !== (r = i.set(t, n, e)) ? r : t[e] = n : i && "get" in i && null !== (r = i.get(t, e)) ? r : t[e] }, propHooks: { tabIndex: { get: function (t) { var e = d.find.attr(t, "tabindex"); return e ? parseInt(e, 10) : pe.test(t.nodeName) || he.test(t.nodeName) && t.href ? 0 : -1 } } } }), c.hrefNormalized || d.each(["href", "src"], function (t, e) { d.propHooks[e] = { get: function (t) { return t.getAttribute(e, 4) } } }), c.optSelected || (d.propHooks.selected = { get: function (t) { var e = t.parentNode; return e && (e.selectedIndex, e.parentNode && e.parentNode.selectedIndex), null } }), d.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () { d.propFix[this.toLowerCase()] = this }), c.enctype || (d.propFix.enctype = "encoding"); var ve = /[\t\r\n\f]/g; d.fn.extend({ addClass: function (t) { var e, n, r, i, o, a, s = 0, l = this.length, u = "string" == typeof t && t; if (d.isFunction(t)) return this.each(function (e) { d(this).addClass(t.call(this, e, this.className)) }); if (u) for (e = (t || "").match(L) || []; l > s; s++)if (r = 1 === (n = this[s]).nodeType && (n.className ? (" " + n.className + " ").replace(ve, " ") : " ")) { for (o = 0; i = e[o++];)r.indexOf(" " + i + " ") < 0 && (r += i + " "); a = d.trim(r), n.className !== a && (n.className = a) } return this }, removeClass: function (t) { var e, n, r, i, o, a, s = 0, l = this.length, u = 0 === arguments.length || "string" == typeof t && t; if (d.isFunction(t)) return this.each(function (e) { d(this).removeClass(t.call(this, e, this.className)) }); if (u) for (e = (t || "").match(L) || []; l > s; s++)if (r = 1 === (n = this[s]).nodeType && (n.className ? (" " + n.className + " ").replace(ve, " ") : "")) { for (o = 0; i = e[o++];)for (; r.indexOf(" " + i + " ") >= 0;)r = r.replace(" " + i + " ", " "); a = t ? d.trim(r) : "", n.className !== a && (n.className = a) } return this }, toggleClass: function (t, e) { var n = typeof t; return "boolean" == typeof e && "string" === n ? e ? this.addClass(t) : this.removeClass(t) : this.each(d.isFunction(t) ? function (n) { d(this).toggleClass(t.call(this, n, this.className, e), e) } : function () { if ("string" === n) for (var e, r = 0, i = d(this), o = t.match(L) || []; e = o[r++];)i.hasClass(e) ? i.removeClass(e) : i.addClass(e); else (n === O || "boolean" === n) && (this.className && d._data(this, "__className__", this.className), this.className = this.className || !1 === t ? "" : d._data(this, "__className__") || "") }) }, hasClass: function (t) { for (var e = " " + t + " ", n = 0, r = this.length; r > n; n++)if (1 === this[n].nodeType && (" " + this[n].className + " ").replace(ve, " ").indexOf(e) >= 0) return !0; return !1 } }), d.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 (t, e) { d.fn[e] = function (t, n) { return arguments.length > 0 ? this.on(e, null, t, n) : this.trigger(e) } }), d.fn.extend({ hover: function (t, e) { return this.mouseenter(t).mouseleave(e || t) }, bind: function (t, e, n) { return this.on(t, null, e, n) }, unbind: function (t, e) { return this.off(t, null, e) }, delegate: function (t, e, n, r) { return this.on(e, t, n, r) }, undelegate: function (t, e, n) { return 1 === arguments.length ? this.off(t, "**") : this.off(e, t || "**", n) } }); var ge = d.now(), me = /\?/, ye = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g; d.parseJSON = function (e) { if (t.JSON && t.JSON.parse) return t.JSON.parse(e + ""); var n, r = null, i = d.trim(e + ""); return i && !d.trim(i.replace(ye, function (t, e, i, o) { return n && e && (r = 0), 0 === r ? t : (n = i || e, r += !o - !i, "") })) ? Function("return " + i)() : d.error("Invalid JSON: " + e) }, d.parseXML = function (e) { var n; if (!e || "string" != typeof e) return null; try { t.DOMParser ? n = (new DOMParser).parseFromString(e, "text/xml") : ((n = new ActiveXObject("Microsoft.XMLDOM")).async = "false", n.loadXML(e)) } catch (t) { n = void 0 } return n && n.documentElement && !n.getElementsByTagName("parsererror").length || d.error("Invalid XML: " + e), n }; var be, we, xe = /#.*$/, _e = /([?&])_=[^&]*/, Ce = /^(.*?):[ \t]*([^\r\n]*)\r?$/gm, Se = /^(?:GET|HEAD)$/, ke = /^\/\//, Te = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/, je = {}, Ie = {}, Ee = "*/".concat("*"); try { we = location.href } catch (t) { (we = S.createElement("a")).href = "", we = we.href } function Le(t) { return function (e, n) { "string" != typeof e && (n = e, e = "*"); var r, i = 0, o = e.toLowerCase().match(L) || []; if (d.isFunction(n)) for (; r = o[i++];)"+" === r.charAt(0) ? (r = r.slice(1) || "*", (t[r] = t[r] || []).unshift(n)) : (t[r] = t[r] || []).push(n) } } function Ae(t, e, n, r) { var i = {}, o = t === Ie; function a(s) { var l; return i[s] = !0, d.each(t[s] || [], function (t, s) { var u = s(e, n, r); return "string" != typeof u || o || i[u] ? o ? !(l = u) : void 0 : (e.dataTypes.unshift(u), a(u), !1) }), l } return a(e.dataTypes[0]) || !i["*"] && a("*") } function Ne(t, e) { var n, r, i = d.ajaxSettings.flatOptions || {}; for (r in e) void 0 !== e[r] && ((i[r] ? t : n || (n = {}))[r] = e[r]); return n && d.extend(!0, t, n), t } be = Te.exec(we.toLowerCase()) || [], d.extend({ active: 0, lastModified: {}, etag: {}, ajaxSettings: { url: we, type: "GET", isLocal: /^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(be[1]), global: !0, processData: !0, async: !0, contentType: "application/x-www-form-urlencoded; charset=UTF-8", accepts: { "*": Ee, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /xml/, html: /html/, json: /json/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, converters: { "* text": String, "text html": !0, "text json": d.parseJSON, "text xml": d.parseXML }, flatOptions: { url: !0, context: !0 } }, ajaxSetup: function (t, e) { return e ? Ne(Ne(t, d.ajaxSettings), e) : Ne(d.ajaxSettings, t) }, ajaxPrefilter: Le(je), ajaxTransport: Le(Ie), ajax: function (t, e) { "object" == typeof t && (e = t, t = void 0), e = e || {}; var n, r, i, o, a, s, l, u, c = d.ajaxSetup({}, e), f = c.context || c, p = c.context && (f.nodeType || f.jquery) ? d(f) : d.event, h = d.Deferred(), v = d.Callbacks("once memory"), g = c.statusCode || {}, m = {}, y = {}, b = 0, w = "canceled", x = { readyState: 0, getResponseHeader: function (t) { var e; if (2 === b) { if (!u) for (u = {}; e = Ce.exec(o);)u[e[1].toLowerCase()] = e[2]; e = u[t.toLowerCase()] } return null == e ? null : e }, getAllResponseHeaders: function () { return 2 === b ? o : null }, setRequestHeader: function (t, e) { var n = t.toLowerCase(); return b || (t = y[n] = y[n] || t, m[t] = e), this }, overrideMimeType: function (t) { return b || (c.mimeType = t), this }, statusCode: function (t) { var e; if (t) if (2 > b) for (e in t) g[e] = [g[e], t[e]]; else x.always(t[x.status]); return this }, abort: function (t) { var e = t || w; return l && l.abort(e), _(0, e), this } }; if (h.promise(x).complete = v.add, x.success = x.done, x.error = x.fail, c.url = ((t || c.url || we) + "").replace(xe, "").replace(ke, be[1] + "//"), c.type = e.method || e.type || c.method || c.type, c.dataTypes = d.trim(c.dataType || "*").toLowerCase().match(L) || [""], null == c.crossDomain && (n = Te.exec(c.url.toLowerCase()), c.crossDomain = !(!n || n[1] === be[1] && n[2] === be[2] && (n[3] || ("http:" === n[1] ? "80" : "443")) === (be[3] || ("http:" === be[1] ? "80" : "443")))), c.data && c.processData && "string" != typeof c.data && (c.data = d.param(c.data, c.traditional)), Ae(je, c, e, x), 2 === b) return x; for (r in (s = d.event && c.global) && 0 == d.active++ && d.event.trigger("ajaxStart"), c.type = c.type.toUpperCase(), c.hasContent = !Se.test(c.type), i = c.url, c.hasContent || (c.data && (i = c.url += (me.test(i) ? "&" : "?") + c.data, delete c.data), !1 === c.cache && (c.url = _e.test(i) ? i.replace(_e, "$1_=" + ge++) : i + (me.test(i) ? "&" : "?") + "_=" + ge++)), c.ifModified && (d.lastModified[i] && x.setRequestHeader("If-Modified-Since", d.lastModified[i]), d.etag[i] && x.setRequestHeader("If-None-Match", d.etag[i])), (c.data && c.hasContent && !1 !== c.contentType || e.contentType) && x.setRequestHeader("Content-Type", c.contentType), x.setRequestHeader("Accept", c.dataTypes[0] && c.accepts[c.dataTypes[0]] ? c.accepts[c.dataTypes[0]] + ("*" !== c.dataTypes[0] ? ", " + Ee + "; q=0.01" : "") : c.accepts["*"]), c.headers) x.setRequestHeader(r, c.headers[r]); if (c.beforeSend && (!1 === c.beforeSend.call(f, x, c) || 2 === b)) return x.abort(); for (r in w = "abort", { success: 1, error: 1, complete: 1 }) x[r](c[r]); if (l = Ae(Ie, c, e, x)) { x.readyState = 1, s && p.trigger("ajaxSend", [x, c]), c.async && c.timeout > 0 && (a = setTimeout(function () { x.abort("timeout") }, c.timeout)); try { b = 1, l.send(m, _) } catch (t) { if (!(2 > b)) throw t; _(-1, t) } } else _(-1, "No Transport"); function _(t, e, n, r) { var u, m, y, w, _, C = e; 2 !== b && (b = 2, a && clearTimeout(a), l = void 0, o = r || "", x.readyState = t > 0 ? 4 : 0, u = t >= 200 && 300 > t || 304 === t, n && (w = function (t, e, n) { for (var r, i, o, a, s = t.contents, l = t.dataTypes; "*" === l[0];)l.shift(), void 0 === i && (i = t.mimeType || e.getResponseHeader("Content-Type")); if (i) for (a in s) if (s[a] && s[a].test(i)) { l.unshift(a); break } if (l[0] in n) o = l[0]; else { for (a in n) { if (!l[0] || t.converters[a + " " + l[0]]) { o = a; break } r || (r = a) } o = o || r } return o ? (o !== l[0] && l.unshift(o), n[o]) : void 0 }(c, x, n)), w = function (t, e, n, r) { var i, o, a, s, l, u = {}, c = t.dataTypes.slice(); if (c[1]) for (a in t.converters) u[a.toLowerCase()] = t.converters[a]; for (o = c.shift(); o;)if (t.responseFields[o] && (n[t.responseFields[o]] = e), !l && r && t.dataFilter && (e = t.dataFilter(e, t.dataType)), l = o, o = c.shift()) if ("*" === o) o = l; else if ("*" !== l && l !== o) { if (!(a = u[l + " " + o] || u["* " + o])) for (i in u) if ((s = i.split(" "))[1] === o && (a = u[l + " " + s[0]] || u["* " + s[0]])) { !0 === a ? a = u[i] : !0 !== u[i] && (o = s[0], c.unshift(s[1])); break } if (!0 !== a) if (a && t.throws) e = a(e); else try { e = a(e) } catch (t) { return { state: "parsererror", error: a ? t : "No conversion from " + l + " to " + o } } } return { state: "success", data: e } }(c, w, x, u), u ? (c.ifModified && ((_ = x.getResponseHeader("Last-Modified")) && (d.lastModified[i] = _), (_ = x.getResponseHeader("etag")) && (d.etag[i] = _)), 204 === t || "HEAD" === c.type ? C = "nocontent" : 304 === t ? C = "notmodified" : (C = w.state, m = w.data, u = !(y = w.error))) : (y = C, (t || !C) && (C = "error", 0 > t && (t = 0))), x.status = t, x.statusText = (e || C) + "", u ? h.resolveWith(f, [m, C, x]) : h.rejectWith(f, [x, C, y]), x.statusCode(g), g = void 0, s && p.trigger(u ? "ajaxSuccess" : "ajaxError", [x, c, u ? m : y]), v.fireWith(f, [x, C]), s && (p.trigger("ajaxComplete", [x, c]), --d.active || d.event.trigger("ajaxStop"))) } return x }, getJSON: function (t, e, n) { return d.get(t, e, n, "json") }, getScript: function (t, e) { return d.get(t, void 0, e, "script") } }), d.each(["get", "post"], function (t, e) { d[e] = function (t, n, r, i) { return d.isFunction(n) && (i = i || r, r = n, n = void 0), d.ajax({ url: t, type: e, dataType: i, data: n, success: r }) } }), d._evalUrl = function (t) { return d.ajax({ url: t, type: "GET", dataType: "script", async: !1, global: !1, throws: !0 }) }, d.fn.extend({ wrapAll: function (t) { if (d.isFunction(t)) return this.each(function (e) { d(this).wrapAll(t.call(this, e)) }); if (this[0]) { var e = d(t, this[0].ownerDocument).eq(0).clone(!0); this[0].parentNode && e.insertBefore(this[0]), e.map(function () { for (var t = this; t.firstChild && 1 === t.firstChild.nodeType;)t = t.firstChild; return t }).append(this) } return this }, wrapInner: function (t) { return this.each(d.isFunction(t) ? function (e) { d(this).wrapInner(t.call(this, e)) } : function () { var e = d(this), n = e.contents(); n.length ? n.wrapAll(t) : e.append(t) }) }, wrap: function (t) { var e = d.isFunction(t); return this.each(function (n) { d(this).wrapAll(e ? t.call(this, n) : t) }) }, unwrap: function () { return this.parent().each(function () { d.nodeName(this, "body") || d(this).replaceWith(this.childNodes) }).end() } }), d.expr.filters.hidden = function (t) { return t.offsetWidth <= 0 && t.offsetHeight <= 0 || !c.reliableHiddenOffsets() && "none" === (t.style && t.style.display || d.css(t, "display")) }, d.expr.filters.visible = function (t) { return !d.expr.filters.hidden(t) }; var De = /%20/g, Pe = /\[\]$/, Oe = /\r?\n/g, Be = /^(?:submit|button|image|reset|file)$/i, He = /^(?:input|select|textarea|keygen)/i; function Me(t, e, n, r) { var i; if (d.isArray(e)) d.each(e, function (e, i) { n || Pe.test(t) ? r(t, i) : Me(t + "[" + ("object" == typeof i ? e : "") + "]", i, n, r) }); else if (n || "object" !== d.type(e)) r(t, e); else for (i in e) Me(t + "[" + i + "]", e[i], n, r) } d.param = function (t, e) { var n, r = [], i = function (t, e) { e = d.isFunction(e) ? e() : null == e ? "" : e, r[r.length] = encodeURIComponent(t) + "=" + encodeURIComponent(e) }; if (void 0 === e && (e = d.ajaxSettings && d.ajaxSettings.traditional), d.isArray(t) || t.jquery && !d.isPlainObject(t)) d.each(t, function () { i(this.name, this.value) }); else for (n in t) Me(n, t[n], e, i); return r.join("&").replace(De, "+") }, d.fn.extend({ serialize: function () { return d.param(this.serializeArray()) }, serializeArray: function () { return this.map(function () { var t = d.prop(this, "elements"); return t ? d.makeArray(t) : this }).filter(function () { var t = this.type; return this.name && !d(this).is(":disabled") && He.test(this.nodeName) && !Be.test(t) && (this.checked || !X.test(t)) }).map(function (t, e) { var n = d(this).val(); return null == n ? null : d.isArray(n) ? d.map(n, function (t) { return { name: e.name, value: t.replace(Oe, "\r\n") } }) : { name: e.name, value: n.replace(Oe, "\r\n") } }).get() } }), d.ajaxSettings.xhr = void 0 !== t.ActiveXObject ? function () { return !this.isLocal && /^(get|post|head|put|delete|options)$/i.test(this.type) && We() || function () { try { return new t.ActiveXObject("Microsoft.XMLHTTP") } catch (t) { } }() } : We; var $e = 0, Re = {}, Fe = d.ajaxSettings.xhr(); function We() { try { return new t.XMLHttpRequest } catch (t) { } } t.attachEvent && t.attachEvent("onunload", function () { for (var t in Re) Re[t](void 0, !0) }), c.cors = !!Fe && "withCredentials" in Fe, (Fe = c.ajax = !!Fe) && d.ajaxTransport(function (t) { var e; if (!t.crossDomain || c.cors) return { send: function (n, r) { var i, o = t.xhr(), a = ++$e; if (o.open(t.type, t.url, t.async, t.username, t.password), t.xhrFields) for (i in t.xhrFields) o[i] = t.xhrFields[i]; for (i in t.mimeType && o.overrideMimeType && o.overrideMimeType(t.mimeType), t.crossDomain || n["X-Requested-With"] || (n["X-Requested-With"] = "XMLHttpRequest"), n) void 0 !== n[i] && o.setRequestHeader(i, n[i] + ""); o.send(t.hasContent && t.data || null), e = function (n, i) { var s, l, u; if (e && (i || 4 === o.readyState)) if (delete Re[a], e = void 0, o.onreadystatechange = d.noop, i) 4 !== o.readyState && o.abort(); else { u = {}, s = o.status, "string" == typeof o.responseText && (u.text = o.responseText); try { l = o.statusText } catch (t) { l = "" } s || !t.isLocal || t.crossDomain ? 1223 === s && (s = 204) : s = u.text ? 200 : 404 } u && r(s, l, u, o.getAllResponseHeaders()) }, t.async ? 4 === o.readyState ? setTimeout(e) : o.onreadystatechange = Re[a] = e : e() }, abort: function () { e && e(void 0, !0) } } }), d.ajaxSetup({ accepts: { script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" }, contents: { script: /(?:java|ecma)script/ }, converters: { "text script": function (t) { return d.globalEval(t), t } } }), d.ajaxPrefilter("script", function (t) { void 0 === t.cache && (t.cache = !1), t.crossDomain && (t.type = "GET", t.global = !1) }), d.ajaxTransport("script", function (t) { if (t.crossDomain) { var e, n = S.head || d("head")[0] || S.documentElement; return { send: function (r, i) { (e = S.createElement("script")).async = !0, t.scriptCharset && (e.charset = t.scriptCharset), e.src = t.url, e.onload = e.onreadystatechange = function (t, n) { (n || !e.readyState || /loaded|complete/.test(e.readyState)) && (e.onload = e.onreadystatechange = null, e.parentNode && e.parentNode.removeChild(e), e = null, n || i(200, "success")) }, n.insertBefore(e, n.firstChild) }, abort: function () { e && e.onload(void 0, !0) } } } }); var ze = [], qe = /(=)\?(?=&|$)|\?\?/; d.ajaxSetup({ jsonp: "callback", jsonpCallback: function () { var t = ze.pop() || d.expando + "_" + ge++; return this[t] = !0, t } }), d.ajaxPrefilter("json jsonp", function (e, n, r) { var i, o, a, s = !1 !== e.jsonp && (qe.test(e.url) ? "url" : "string" == typeof e.data && !(e.contentType || "").indexOf("application/x-www-form-urlencoded") && qe.test(e.data) && "data"); return s || "jsonp" === e.dataTypes[0] ? (i = e.jsonpCallback = d.isFunction(e.jsonpCallback) ? e.jsonpCallback() : e.jsonpCallback, s ? e[s] = e[s].replace(qe, "$1" + i) : !1 !== e.jsonp && (e.url += (me.test(e.url) ? "&" : "?") + e.jsonp + "=" + i), e.converters["script json"] = function () { return a || d.error(i + " was not called"), a[0] }, e.dataTypes[0] = "json", o = t[i], t[i] = function () { a = arguments }, r.always(function () { t[i] = o, e[i] && (e.jsonpCallback = n.jsonpCallback, ze.push(i)), a && d.isFunction(o) && o(a[0]), a = o = void 0 }), "script") : void 0 }), d.parseHTML = function (t, e, n) { if (!t || "string" != typeof t) return null; "boolean" == typeof e && (n = e, e = !1), e = e || S; var r = w.exec(t), i = !n && []; return r ? [e.createElement(r[1])] : (r = d.buildFragment([t], e, i), i && i.length && d(i).remove(), d.merge([], r.childNodes)) }; var Ue = d.fn.load; d.fn.load = function (t, e, n) { if ("string" != typeof t && Ue) return Ue.apply(this, arguments); var r, i, o, a = this, s = t.indexOf(" "); return s >= 0 && (r = d.trim(t.slice(s, t.length)), t = t.slice(0, s)), d.isFunction(e) ? (n = e, e = void 0) : e && "object" == typeof e && (o = "POST"), a.length > 0 && d.ajax({ url: t, type: o, dataType: "html", data: e }).done(function (t) { i = arguments, a.html(r ? d("<div>").append(d.parseHTML(t)).find(r) : t) }).complete(n && function (t, e) { a.each(n, i || [t.responseText, e, t]) }), this }, d.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (t, e) { d.fn[e] = function (t) { return this.on(e, t) } }), d.expr.filters.animated = function (t) { return d.grep(d.timers, function (e) { return t === e.elem }).length }; var Xe = t.document.documentElement; function Ge(t) { return d.isWindow(t) ? t : 9 === t.nodeType && (t.defaultView || t.parentWindow) } d.offset = { setOffset: function (t, e, n) { var r, i, o, a, s, l, u = d.css(t, "position"), c = d(t), f = {}; "static" === u && (t.style.position = "relative"), s = c.offset(), o = d.css(t, "top"), l = d.css(t, "left"), ("absolute" === u || "fixed" === u) && d.inArray("auto", [o, l]) > -1 ? (a = (r = c.position()).top, i = r.left) : (a = parseFloat(o) || 0, i = parseFloat(l) || 0), d.isFunction(e) && (e = e.call(t, n, s)), null != e.top && (f.top = e.top - s.top + a), null != e.left && (f.left = e.left - s.left + i), "using" in e ? e.using.call(t, f) : c.css(f) } }, d.fn.extend({ offset: function (t) { if (arguments.length) return void 0 === t ? this : this.each(function (e) { d.offset.setOffset(this, t, e) }); var e, n, r = { top: 0, left: 0 }, i = this[0], o = i && i.ownerDocument; return o ? (e = o.documentElement, d.contains(e, i) ? (typeof i.getBoundingClientRect !== O && (r = i.getBoundingClientRect()), n = Ge(o), { top: r.top + (n.pageYOffset || e.scrollTop) - (e.clientTop || 0), left: r.left + (n.pageXOffset || e.scrollLeft) - (e.clientLeft || 0) }) : r) : void 0 }, position: function () { if (this[0]) { var t, e, n = { top: 0, left: 0 }, r = this[0]; return "fixed" === d.css(r, "position") ? e = r.getBoundingClientRect() : (t = this.offsetParent(), e = this.offset(), d.nodeName(t[0], "html") || (n = t.offset()), n.top += d.css(t[0], "borderTopWidth", !0), n.left += d.css(t[0], "borderLeftWidth", !0)), { top: e.top - n.top - d.css(r, "marginTop", !0), left: e.left - n.left - d.css(r, "marginLeft", !0) } } }, offsetParent: function () { return this.map(function () { for (var t = this.offsetParent || Xe; t && !d.nodeName(t, "html") && "static" === d.css(t, "position");)t = t.offsetParent; return t || Xe }) } }), d.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function (t, e) { var n = /Y/.test(e); d.fn[t] = function (r) { return U(this, function (t, r, i) { var o = Ge(t); return void 0 === i ? o ? e in o ? o[e] : o.document.documentElement[r] : t[r] : void (o ? o.scrollTo(n ? d(o).scrollLeft() : i, n ? i : d(o).scrollTop()) : t[r] = i) }, t, r, arguments.length, null) } }), d.each(["top", "left"], function (t, e) { d.cssHooks[e] = Pt(c.pixelPosition, function (t, n) { return n ? (n = Lt(t, e), Nt.test(n) ? d(t).position()[e] + "px" : n) : void 0 }) }), d.each({ Height: "height", Width: "width" }, function (t, e) { d.each({ padding: "inner" + t, content: e, "": "outer" + t }, function (n, r) { d.fn[r] = function (r, i) { var o = arguments.length && (n || "boolean" != typeof r), a = n || (!0 === r || !0 === i ? "margin" : "border"); return U(this, function (e, n, r) { var i; return d.isWindow(e) ? e.document.documentElement["client" + t] : 9 === e.nodeType ? (i = e.documentElement, Math.max(e.body["scroll" + t], i["scroll" + t], e.body["offset" + t], i["offset" + t], i["client" + t])) : void 0 === r ? d.css(e, n, a) : d.style(e, n, r, a) }, e, o ? r : void 0, o, null) } }) }), d.fn.size = function () { return this.length }, d.fn.andSelf = d.fn.addBack, "function" == typeof define && define.amd && define("jquery", [], function () { return d }); var Qe = t.jQuery, Ve = t.$; return d.noConflict = function (e) { return t.$ === d && (t.$ = Ve), e && t.jQuery === d && (t.jQuery = Qe), d }, typeof e === O && (t.jQuery = t.$ = d), d }), function t(e, n, r) { function i(a, s) { if (!n[a]) { if (!e[a]) { var l = "function" == typeof require && require; if (!s && l) return l(a, !0); if (o) return o(a, !0); var u = new Error("Cannot find module '" + a + "'"); throw u.code = "MODULE_NOT_FOUND", u } var c = n[a] = { exports: {} }; e[a][0].call(c.exports, function (t) { var n = e[a][1][t]; return i(n || t) }, c, c.exports, t, e, n, r) } return n[a].exports } for (var o = "function" == typeof require && require, a = 0; a < r.length; a++)i(r[a]); return i }({ 1: [function (t, e, n) { var r = window.jQuery, i = window.PX = {}, o = t("./modules/helpers/analytics.js"), a = t("./modules/behavior.js"), s = t("./modules/carousel.js"), l = t("./modules/helpers/debugger.js"), u = t("./modules/dynamic-images.js"), c = t("./modules/formatting.js"), f = t("./modules/locations/locations.js"), d = t("./modules/nearest-panda.js"), p = t("./modules/nutrition/nutrition.js"), h = t("./modules/our-family-story.js"), v = t("./modules/setup.js"); i.locations = { callbackInit: f.callbackInit, closeBoxes: f.closeBoxes, setFavoritePanda: f.setFavoritePanda }, r(document).ready(function () { l.init(), r(window).trigger("Scripts/Started"), v.init(), o.init(), d.init(), c.init(), a.init(), f.init(), p.init(), h.init(), u.init(), s.init(), r(window).trigger("Scripts/Loaded") }) }, { "./modules/behavior.js": 3, "./modules/carousel.js": 4, "./modules/dynamic-images.js": 9, "./modules/formatting.js": 10, "./modules/helpers/analytics.js": 11, "./modules/helpers/debugger.js": 13, "./modules/locations/locations.js": 20, "./modules/nearest-panda.js": 22, "./modules/nutrition/nutrition.js": 24, "./modules/our-family-story.js": 25, "./modules/setup.js": 27 }], 2: [function (t, e, n) { (function (t) { (function () { var r, i, o, a = "3.10.1", s = 1, l = 2, u = 4, c = 8, f = 16, d = 32, p = 64, h = 128, v = 256, g = 30, m = "...", y = 150, b = 16, w = 200, x = 1, _ = 2, C = "Expected a function", S = "__lodash_placeholder__", k = "[object Arguments]", T = "[object Array]", j = "[object Boolean]", I = "[object Date]", E = "[object Error]", L = "[object Function]", A = "[object Number]", N = "[object Object]", D = "[object RegExp]", P = "[object String]", O = "[object ArrayBuffer]", B = "[object Float32Array]", H = "[object Float64Array]", M = "[object Int8Array]", $ = "[object Int16Array]", R = "[object Int32Array]", F = "[object Uint8Array]", W = "[object Uint8ClampedArray]", z = "[object Uint16Array]", q = "[object Uint32Array]", U = /\b__p \+= '';/g, X = /\b(__p \+=) '' \+/g, G = /(__e\(.*?\)|\b__t\)) \+\n'';/g, Q = /&(?:amp|lt|gt|quot|#39|#96);/g, V = /[&<>"'`]/g, Y = RegExp(Q.source), J = RegExp(V.source), Z = /<%-([\s\S]+?)%>/g, K = /<%([\s\S]+?)%>/g, tt = /<%=([\s\S]+?)%>/g, et = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/, nt = /^\w*$/, rt = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g, it = /^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g, ot = RegExp(it.source), at = /[\u0300-\u036f\ufe20-\ufe23]/g, st = /\\(\\)?/g, lt = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g, ut = /\w*$/, ct = /^0[xX]/, ft = /^\[object .+?Constructor\]$/, dt = /^\d+$/, pt = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g, ht = /($^)/, vt = /['\n\r\u2028\u2029\\]/g, gt = (i = "[A-Z\\xc0-\\xd6\\xd8-\\xde]", o = "[a-z\\xdf-\\xf6\\xf8-\\xff]+", RegExp(i + "+(?=" + i + o + ")|" + i + "?" + o + "|" + i + "+|[0-9]+", "g")), mt = ["Array", "ArrayBuffer", "Date", "Error", "Float32Array", "Float64Array", "Function", "Int8Array", "Int16Array", "Int32Array", "Math", "Number", "Object", "RegExp", "Set", "String", "_", "clearTimeout", "isFinite", "parseFloat", "parseInt", "setTimeout", "TypeError", "Uint8Array", "Uint8ClampedArray", "Uint16Array", "Uint32Array", "WeakMap"], yt = -1, bt = {}; bt[B] = bt[H] = bt[M] = bt[$] = bt[R] = bt[F] = bt[W] = bt[z] = bt[q] = !0, bt[k] = bt[T] = bt[O] = bt[j] = bt[I] = bt[E] = bt[L] = bt["[object Map]"] = bt[A] = bt[N] = bt[D] = bt["[object Set]"] = bt[P] = bt["[object WeakMap]"] = !1; var wt = {}; wt[k] = wt[T] = wt[O] = wt[j] = wt[I] = wt[B] = wt[H] = wt[M] = wt[$] = wt[R] = wt[A] = wt[N] = wt[D] = wt[P] = wt[F] = wt[W] = wt[z] = wt[q] = !0, wt[E] = wt[L] = wt["[object Map]"] = wt["[object Set]"] = wt["[object WeakMap]"] = !1; var xt = { "À": "A", "Á": "A", "Â": "A", "Ã": "A", "Ä": "A", "Å": "A", "à": "a", "á": "a", "â": "a", "ã": "a", "ä": "a", "å": "a", "Ç": "C", "ç": "c", "Ð": "D", "ð": "d", "È": "E", "É": "E", "Ê": "E", "Ë": "E", "è": "e", "é": "e", "ê": "e", "ë": "e", "Ì": "I", "Í": "I", "Î": "I", "Ï": "I", "ì": "i", "í": "i", "î": "i", "ï": "i", "Ñ": "N", "ñ": "n", "Ò": "O", "Ó": "O", "Ô": "O", "Õ": "O", "Ö": "O", "Ø": "O", "ò": "o", "ó": "o", "ô": "o", "õ": "o", "ö": "o", "ø": "o", "Ù": "U", "Ú": "U", "Û": "U", "Ü": "U", "ù": "u", "ú": "u", "û": "u", "ü": "u", "Ý": "Y", "ý": "y", "ÿ": "y", "Æ": "Ae", "æ": "ae", "Þ": "Th", "þ": "th", "ß": "ss" }, _t = { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;", "`": "&#96;" }, Ct = { "&amp;": "&", "&lt;": "<", "&gt;": ">", "&quot;": '"', "&#39;": "'", "&#96;": "`" }, St = { function: !0, object: !0 }, kt = { 0: "x30", 1: "x31", 2: "x32", 3: "x33", 4: "x34", 5: "x35", 6: "x36", 7: "x37", 8: "x38", 9: "x39", A: "x41", B: "x42", C: "x43", D: "x44", E: "x45", F: "x46", a: "x61", b: "x62", c: "x63", d: "x64", e: "x65", f: "x66", n: "x6e", r: "x72", t: "x74", u: "x75", v: "x76", x: "x78" }, Tt = { "\\": "\\", "'": "'", "\n": "n", "\r": "r", "\u2028": "u2028", "\u2029": "u2029" }, jt = St[typeof n] && n && !n.nodeType && n, It = St[typeof e] && e && !e.nodeType && e, Et = jt && It && "object" == typeof t && t && t.Object && t, Lt = St[typeof self] && self && self.Object && self, At = St[typeof window] && window && window.Object && window, Nt = It && It.exports === jt && jt, Dt = Et || At !== (this && this.window) && At || Lt || this; function Pt(t, e) { if (t !== e) { var n = null === t, i = t === r, o = t == t, a = null === e, s = e === r, l = e == e; if (t > e && !a || !o || n && !s && l || i && l) return 1; if (t < e && !n || !l || a && !i && o || s && o) return -1 } return 0 } function Ot(t, e, n) { for (var r = t.length, i = n ? r : -1; n ? i-- : ++i < r;)if (e(t[i], i, t)) return i; return -1 } function Bt(t, e, n) { if (e != e) return Xt(t, n); for (var r = n - 1, i = t.length; ++r < i;)if (t[r] === e) return r; return -1 } function Ht(t) { return "function" == typeof t || !1 } function Mt(t) { return null == t ? "" : t + "" } function $t(t, e) { for (var n = -1, r = t.length; ++n < r && e.indexOf(t.charAt(n)) > -1;); return n } function Rt(t, e) { for (var n = t.length; n-- && e.indexOf(t.charAt(n)) > -1;); return n } function Ft(t, e) { return Pt(t.criteria, e.criteria) || t.index - e.index } function Wt(t) { return xt[t] } function zt(t) { return _t[t] } function qt(t, e, n) { return e ? t = kt[t] : n && (t = Tt[t]), "\\" + t } function Ut(t) { return "\\" + Tt[t] } function Xt(t, e, n) { for (var r = t.length, i = e + (n ? 0 : -1); n ? i-- : ++i < r;) { var o = t[i]; if (o != o) return i } return -1 } function Gt(t) { return !!t && "object" == typeof t } function Qt(t) { return t <= 160 && t >= 9 && t <= 13 || 32 == t || 160 == t || 5760 == t || 6158 == t || t >= 8192 && (t <= 8202 || 8232 == t || 8233 == t || 8239 == t || 8287 == t || 12288 == t || 65279 == t) } function Vt(t, e) { for (var n = -1, r = t.length, i = -1, o = []; ++n < r;)t[n] === e && (t[n] = S, o[++i] = n); return o } function Yt(t) { for (var e = -1, n = t.length; ++e < n && Qt(t.charCodeAt(e));); return e } function Jt(t) { for (var e = t.length; e-- && Qt(t.charCodeAt(e));); return e } function Zt(t) { return Ct[t] } var Kt = function t(e) { var n = (e = e ? Kt.defaults(Dt.Object(), e, Kt.pick(Dt, mt)) : Dt).Array, i = e.Date, o = e.Error, xt = e.Function, _t = e.Math, Ct = e.Number, St = e.Object, kt = e.RegExp, Tt = e.String, jt = e.TypeError, It = n.prototype, Et = St.prototype, Lt = Tt.prototype, At = xt.prototype.toString, Nt = Et.hasOwnProperty, Qt = 0, te = Et.toString, ee = Dt._, ne = kt("^" + At.call(Nt).replace(/[\\^$.*+?()[\]{}|]/g, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"), re = e.ArrayBuffer, ie = e.clearTimeout, oe = e.parseFloat, ae = _t.pow, se = Et.propertyIsEnumerable, le = yr(e, "Set"), ue = e.setTimeout, ce = It.splice, fe = e.Uint8Array, de = yr(e, "WeakMap"), pe = _t.ceil, he = yr(St, "create"), ve = _t.floor, ge = yr(n, "isArray"), me = e.isFinite, ye = yr(St, "keys"), be = _t.max, we = _t.min, xe = yr(i, "now"), _e = e.parseInt, Ce = _t.random, Se = Ct.NEGATIVE_INFINITY, ke = Ct.POSITIVE_INFINITY, Te = 4294967295, je = Te - 1, Ie = Te >>> 1, Ee = 9007199254740991, Le = de && new de, Ae = {}; function Ne(t) { if (Gt(t) && !Xi(t) && !(t instanceof Oe)) { if (t instanceof Pe) return t; if (Nt.call(t, "__chain__") && Nt.call(t, "__wrapped__")) return Br(t) } return new Pe(t) } function De() { } function Pe(t, e, n) { this.__wrapped__ = t, this.__actions__ = n || [], this.__chain__ = !!e } Ne.support = {}; function Oe(t) { this.__wrapped__ = t, this.__actions__ = [], this.__dir__ = 1, this.__filtered__ = !1, this.__iteratees__ = [], this.__takeCount__ = ke, this.__views__ = [] } function Be() { this.__data__ = {} } function He(t) { var e = t ? t.length : 0; for (this.data = { hash: he(null), set: new le }; e--;)this.push(t[e]) } function Me(t, e) { var n = t.data; return ("string" == typeof e || Yi(e) ? n.set.has(e) : n.hash[e]) ? 0 : -1 } function $e(t, e) { var r = -1, i = t.length; for (e || (e = n(i)); ++r < i;)e[r] = t[r]; return e } function Re(t, e) { for (var n = -1, r = t.length; ++n < r && !1 !== e(t[n], n, t);); return t } function Fe(t, e) { for (var n = -1, r = t.length; ++n < r;)if (!e(t[n], n, t)) return !1; return !0 } function We(t, e) { for (var n = -1, r = t.length, i = -1, o = []; ++n < r;) { var a = t[n]; e(a, n, t) && (o[++i] = a) } return o } function ze(t, e) { for (var r = -1, i = t.length, o = n(i); ++r < i;)o[r] = e(t[r], r, t); return o } function qe(t, e) { for (var n = -1, r = e.length, i = t.length; ++n < r;)t[i + n] = e[n]; return t } function Ue(t, e, n, r) { var i = -1, o = t.length; for (r && o && (n = t[++i]); ++i < o;)n = e(n, t[i], i, t); return n } function Xe(t, e) { for (var n = -1, r = t.length; ++n < r;)if (e(t[n], n, t)) return !0; return !1 } function Ge(t, e, n, i) { return t !== r && Nt.call(i, n) ? t : e } function Qe(t, e, n) { for (var i = -1, o = yo(e), a = o.length; ++i < a;) { var s = o[i], l = t[s], u = n(l, e[s], s, t, e); (u == u ? u === l : l != l) && (l !== r || s in t) || (t[s] = u) } return t } function Ve(t, e) { return null == e ? t : Je(e, yo(e), t) } function Ye(t, e) { for (var i = -1, o = null == t, a = !o && wr(t), s = a ? t.length : 0, l = e.length, u = n(l); ++i < l;) { var c = e[i]; u[i] = a ? xr(c, s) ? t[c] : r : o ? r : t[c] } return u } function Je(t, e, n) { n || (n = {}); for (var r = -1, i = e.length; ++r < i;) { var o = e[r]; n[o] = t[o] } return n } function Ze(t, e, n) { var i = typeof t; return "function" == i ? e === r ? t : Bn(t, e, n) : null == t ? Mo : "object" == i ? wn(t) : e === r ? qo(t) : xn(t, e) } function Ke(t, e, n, i, o, a, s) { var l; if (n && (l = o ? n(t, i, o) : n(t)), l !== r) return l; if (!Yi(t)) return t; var u = Xi(t); if (u) { if (l = function (t) { var e = t.length, n = new t.constructor(e); return e && "string" == typeof t[0] && Nt.call(t, "index") && (n.index = t.index, n.input = t.input), n }(t), !e) return $e(t, l) } else { var c = te.call(t), f = c == L; if (c != N && c != k && (!f || o)) return wt[c] ? function (t, e, n) { var r = t.constructor; switch (e) { case O: return Hn(t); case j: case I: return new r(+t); case B: case H: case M: case $: case R: case F: case W: case z: case q: var i = t.buffer; return new r(n ? Hn(i) : i, t.byteOffset, t.length); case A: case P: return new r(t); case D: var o = new r(t.source, ut.exec(t)); o.lastIndex = t.lastIndex }return o }(t, c, e) : o ? t : {}; if (l = function (t) { var e = t.constructor; return "function" == typeof e && e instanceof e || (e = St), new e }(f ? {} : t), !e) return Ve(l, t) } a || (a = []), s || (s = []); for (var d = a.length; d--;)if (a[d] == t) return s[d]; return a.push(t), s.push(l), (u ? Re : pn)(t, function (r, i) { l[i] = Ke(r, e, n, i, t, a, s) }), l } Ne.templateSettings = { escape: Z, evaluate: K, interpolate: tt, variable: "", imports: { _: Ne } }; var tn = function () { function t() { } return function (e) { if (Yi(e)) { t.prototype = e; var n = new t; t.prototype = r } return n || {} } }(); function en(t, e, n) { if ("function" != typeof t) throw new jt(C); return ue(function () { t.apply(r, n) }, e) } function nn(t, e) { var n = t ? t.length : 0, r = []; if (!n) return r; var i = -1, o = vr(), a = o == Bt, s = a && e.length >= w ? qn(e) : null, l = e.length; s && (o = Me, a = !1, e = s); t: for (; ++i < n;) { var u = t[i]; if (a && u == u) { for (var c = l; c--;)if (e[c] === u) continue t; r.push(u) } else o(e, u, 0) < 0 && r.push(u) } return r } var rn = Wn(pn), on = Wn(hn, !0); function an(t, e) { var n = !0; return rn(t, function (t, r, i) { return n = !!e(t, r, i) }), n } function sn(t, e) { var n = []; return rn(t, function (t, r, i) { e(t, r, i) && n.push(t) }), n } function ln(t, e, n, r) { var i; return n(t, function (t, n, o) { if (e(t, n, o)) return i = r ? n : t, !1 }), i } function un(t, e, n, r) { r || (r = []); for (var i = -1, o = t.length; ++i < o;) { var a = t[i]; Gt(a) && wr(a) && (n || Xi(a) || Ui(a)) ? e ? un(a, e, n, r) : qe(r, a) : n || (r[r.length] = a) } return r } var cn = zn(), fn = zn(!0); function dn(t, e) { return cn(t, e, bo) } function pn(t, e) { return cn(t, e, yo) } function hn(t, e) { return fn(t, e, yo) } function vn(t, e) { for (var n = -1, r = e.length, i = -1, o = []; ++n < r;) { var a = e[n]; Vi(t[a]) && (o[++i] = a) } return o } function gn(t, e, n) { if (null != t) { n !== r && n in Pr(t) && (e = [n]); for (var i = 0, o = e.length; null != t && i < o;)t = t[e[i++]]; return i && i == o ? t : r } } function mn(t, e, n, i, o, a) { return t === e || (null == t || null == e || !Yi(t) && !Gt(e) ? t != t && e != e : function (t, e, n, i, o, a, s) { var l = Xi(t), u = Xi(e), c = T, f = T; l || ((c = te.call(t)) == k ? c = N : c != N && (l = no(t))), u || ((f = te.call(e)) == k ? f = N : f != N && (u = no(e))); var d = c == N, p = f == N, h = c == f; if (h && !l && !d) return function (t, e, n) { switch (n) { case j: case I: return +t == +e; case E: return t.name == e.name && t.message == e.message; case A: return t != +t ? e != +e : t == +e; case D: case P: return t == e + "" }return !1 }(t, e, c); if (!o) { var v = d && Nt.call(t, "__wrapped__"), g = p && Nt.call(e, "__wrapped__"); if (v || g) return n(v ? t.value() : t, g ? e.value() : e, i, o, a, s) } if (!h) return !1; a || (a = []), s || (s = []); for (var m = a.length; m--;)if (a[m] == t) return s[m] == e; a.push(t), s.push(e); var y = (l ? function (t, e, n, i, o, a, s) { var l = -1, u = t.length, c = e.length; if (u != c && !(o && c > u)) return !1; for (; ++l < u;) { var f = t[l], d = e[l], p = i ? i(o ? d : f, o ? f : d, l) : r; if (p !== r) { if (p) continue; return !1 } if (o) { if (!Xe(e, function (t) { return f === t || n(f, t, i, o, a, s) })) return !1 } else if (f !== d && !n(f, d, i, o, a, s)) return !1 } return !0 } : function (t, e, n, i, o, a, s) { var l = yo(t), u = l.length, c = yo(e).length; if (u != c && !o) return !1; for (var f = u; f--;) { var d = l[f]; if (!(o ? d in e : Nt.call(e, d))) return !1 } for (var p = o; ++f < u;) { d = l[f]; var h = t[d], v = e[d], g = i ? i(o ? v : h, o ? h : v, d) : r; if (!(g === r ? n(h, v, i, o, a, s) : g)) return !1; p || (p = "constructor" == d) } if (!p) { var m = t.constructor, y = e.constructor; if (m != y && "constructor" in t && "constructor" in e && !("function" == typeof m && m instanceof m && "function" == typeof y && y instanceof y)) return !1 } return !0 })(t, e, n, i, o, a, s); return a.pop(), s.pop(), y }(t, e, mn, n, i, o, a)) } function yn(t, e, n) { var i = e.length, o = i, a = !n; if (null == t) return !o; for (t = Pr(t); i--;) { var s = e[i]; if (a && s[2] ? s[1] !== t[s[0]] : !(s[0] in t)) return !1 } for (; ++i < o;) { var l = (s = e[i])[0], u = t[l], c = s[1]; if (a && s[2]) { if (u === r && !(l in t)) return !1 } else { var f = n ? n(u, c, l) : r; if (!(f === r ? mn(c, u, n, !0) : f)) return !1 } } return !0 } function bn(t, e) { var r = -1, i = wr(t) ? n(t.length) : []; return rn(t, function (t, n, o) { i[++r] = e(t, n, o) }), i } function wn(t) { var e = mr(t); if (1 == e.length && e[0][2]) { var n = e[0][0], i = e[0][1]; return function (t) { return null != t && t[n] === i && (i !== r || n in Pr(t)) } } return function (t) { return yn(t, e) } } function xn(t, e) { var n = Xi(t), i = Cr(t) && Tr(e), o = t + ""; return t = Or(t), function (a) { if (null == a) return !1; var s = o; if (a = Pr(a), (n || !i) && !(s in a)) { if (null == (a = 1 == t.length ? a : gn(a, Tn(t, 0, -1)))) return !1; s = Ur(t), a = Pr(a) } return a[s] === e ? e !== r || s in a : mn(e, a[s], r, !0) } } function _n(t) { return function (e) { return null == e ? r : e[t] } } function Cn(t, e) { for (var n = t ? e.length : 0; n--;) { var r = e[n]; if (r != i && xr(r)) { var i = r; ce.call(t, r, 1) } } return t } function Sn(t, e) { return t + ve(Ce() * (e - t + 1)) } var kn = Le ? function (t, e) { return Le.set(t, e), t } : Mo; function Tn(t, e, i) { var o = -1, a = t.length; (e = null == e ? 0 : +e || 0) < 0 && (e = -e > a ? 0 : a + e), (i = i === r || i > a ? a : +i || 0) < 0 && (i += a), a = e > i ? 0 : i - e >>> 0, e >>>= 0; for (var s = n(a); ++o < a;)s[o] = t[o + e]; return s } function jn(t, e) { var n; return rn(t, function (t, r, i) { return !(n = e(t, r, i)) }), !!n } function In(t, e) { var n = t.length; for (t.sort(e); n--;)t[n] = t[n].value; return t } function En(t, e, n) { var r = dr(), i = -1; return e = ze(e, function (t) { return r(t) }), In(bn(t, function (t) { return { criteria: ze(e, function (e) { return e(t) }), index: ++i, value: t } }), function (t, e) { return function (t, e, n) { for (var r = -1, i = t.criteria, o = e.criteria, a = i.length, s = n.length; ++r < a;) { var l = Pt(i[r], o[r]); if (l) { if (r >= s) return l; var u = n[r]; return l * ("asc" === u || !0 === u ? 1 : -1) } } return t.index - e.index }(t, e, n) }) } function Ln(t, e) { var n = -1, r = vr(), i = t.length, o = r == Bt, a = o && i >= w, s = a ? qn() : null, l = []; s ? (r = Me, o = !1) : (a = !1, s = e ? [] : l); t: for (; ++n < i;) { var u = t[n], c = e ? e(u, n, t) : u; if (o && u == u) { for (var f = s.length; f--;)if (s[f] === c) continue t; e && s.push(c), l.push(u) } else r(s, c, 0) < 0 && ((e || a) && s.push(c), l.push(u)) } return l } function An(t, e) { for (var r = -1, i = e.length, o = n(i); ++r < i;)o[r] = t[e[r]]; return o } function Nn(t, e, n, r) { for (var i = t.length, o = r ? i : -1; (r ? o-- : ++o < i) && e(t[o], o, t);); return n ? Tn(t, r ? 0 : o, r ? o + 1 : i) : Tn(t, r ? o + 1 : 0, r ? i : o) } function Dn(t, e) { var n = t; n instanceof Oe && (n = n.value()); for (var r = -1, i = e.length; ++r < i;) { var o = e[r]; n = o.func.apply(o.thisArg, qe([n], o.args)) } return n } function Pn(t, e, n) { var r = 0, i = t ? t.length : r; if ("number" == typeof e && e == e && i <= Ie) { for (; r < i;) { var o = r + i >>> 1, a = t[o]; (n ? a <= e : a < e) && null !== a ? r = o + 1 : i = o } return i } return On(t, e, Mo, n) } function On(t, e, n, i) { e = n(e); for (var o = 0, a = t ? t.length : 0, s = e != e, l = null === e, u = e === r; o < a;) { var c = ve((o + a) / 2), f = n(t[c]), d = f !== r, p = f == f; if (s) var h = p || i; else h = l ? p && d && (i || null != f) : u ? p && (i || d) : null != f && (i ? f <= e : f < e); h ? o = c + 1 : a = c } return we(a, je) } function Bn(t, e, n) { if ("function" != typeof t) return Mo; if (e === r) return t; switch (n) { case 1: return function (n) { return t.call(e, n) }; case 3: return function (n, r, i) { return t.call(e, n, r, i) }; case 4: return function (n, r, i, o) { return t.call(e, n, r, i, o) }; case 5: return function (n, r, i, o, a) { return t.call(e, n, r, i, o, a) } }return function () { return t.apply(e, arguments) } } function Hn(t) { var e = new re(t.byteLength); return new fe(e).set(new fe(t)), e } function Mn(t, e, r) { for (var i = r.length, o = -1, a = be(t.length - i, 0), s = -1, l = e.length, u = n(l + a); ++s < l;)u[s] = e[s]; for (; ++o < i;)u[r[o]] = t[o]; for (; a--;)u[s++] = t[o++]; return u } function $n(t, e, r) { for (var i = -1, o = r.length, a = -1, s = be(t.length - o, 0), l = -1, u = e.length, c = n(s + u); ++a < s;)c[a] = t[a]; for (var f = a; ++l < u;)c[f + l] = e[l]; for (; ++i < o;)c[f + r[i]] = t[a++]; return c } function Rn(t, e) { return function (n, r, i) { var o = e ? e() : {}; if (r = dr(r, i, 3), Xi(n)) for (var a = -1, s = n.length; ++a < s;) { var l = n[a]; t(o, l, r(l, a, n), n) } else rn(n, function (e, n, i) { t(o, e, r(e, n, i), i) }); return o } } function Fn(t) { return zi(function (e, n) { var i = -1, o = null == e ? 0 : n.length, a = o > 2 ? n[o - 2] : r, s = o > 2 ? n[2] : r, l = o > 1 ? n[o - 1] : r; for ("function" == typeof a ? (a = Bn(a, l, 5), o -= 2) : o -= (a = "function" == typeof l ? l : r) ? 1 : 0, s && _r(n[0], n[1], s) && (a = o < 3 ? r : a, o = 1); ++i < o;) { var u = n[i]; u && t(e, u, a) } return e }) } function Wn(t, e) { return function (n, r) { var i = n ? gr(n) : 0; if (!kr(i)) return t(n, r); for (var o = e ? i : -1, a = Pr(n); (e ? o-- : ++o < i) && !1 !== r(a[o], o, a);); return n } } function zn(t) { return function (e, n, r) { for (var i = Pr(e), o = r(e), a = o.length, s = t ? a : -1; t ? s-- : ++s < a;) { var l = o[s]; if (!1 === n(i[l], l, i)) break } return e } } function qn(t) { return he && le ? new He(t) : null } function Un(t) { return function (e) { for (var n = -1, r = Oo(jo(e)), i = r.length, o = ""; ++n < i;)o = t(o, r[n], n); return o } } function Xn(t) { return function () { var e = arguments; switch (e.length) { case 0: return new t; case 1: return new t(e[0]); case 2: return new t(e[0], e[1]); case 3: return new t(e[0], e[1], e[2]); case 4: return new t(e[0], e[1], e[2], e[3]); case 5: return new t(e[0], e[1], e[2], e[3], e[4]); case 6: return new t(e[0], e[1], e[2], e[3], e[4], e[5]); case 7: return new t(e[0], e[1], e[2], e[3], e[4], e[5], e[6]) }var n = tn(t.prototype), r = t.apply(n, e); return Yi(r) ? r : n } } function Gn(t) { return function e(n, i, o) { o && _r(n, i, o) && (i = r); var a = fr(n, t, r, r, r, r, r, i); return a.placeholder = e.placeholder, a } } function Qn(t, e) { return zi(function (n) { var i = n[0]; return null == i ? i : (n.push(e), t.apply(r, n)) }) } function Vn(t, e) { return function (n, i, o) { if (o && _r(n, i, o) && (i = r), 1 == (i = dr(i, o, 3)).length) { var a = function (t, e, n, r) { for (var i = -1, o = t.length, a = r, s = a; ++i < o;) { var l = t[i], u = +e(l); n(u, a) && (a = u, s = l) } return s }(n = Xi(n) ? n : Dr(n), i, t, e); if (!n.length || a !== e) return a } return function (t, e, n, r) { var i = r, o = i; return rn(t, function (t, a, s) { var l = +e(t, a, s); (n(l, i) || l === r && l === o) && (i = l, o = t) }), o }(n, i, t, e) } } function Yn(t, e) { return function (n, i, o) { if (i = dr(i, o, 3), Xi(n)) { var a = Ot(n, i, e); return a > -1 ? n[a] : r } return ln(n, i, t) } } function Jn(t) { return function (e, n, r) { return e && e.length ? Ot(e, n = dr(n, r, 3), t) : -1 } } function Zn(t) { return function (e, n, r) { return ln(e, n = dr(n, r, 3), t, !0) } } function Kn(t) { return function () { for (var e, i = arguments.length, o = t ? i : -1, a = 0, s = n(i); t ? o-- : ++o < i;) { var l = s[a++] = arguments[o]; if ("function" != typeof l) throw new jt(C); !e && Pe.prototype.thru && "wrapper" == hr(l) && (e = new Pe([], !0)) } for (o = e ? -1 : i; ++o < i;) { var u = hr(l = s[o]), f = "wrapper" == u ? pr(l) : r; e = f && Sr(f[0]) && f[1] == (h | c | d | v) && !f[4].length && 1 == f[9] ? e[hr(f[0])].apply(e, f[3]) : 1 == l.length && Sr(l) ? e[u]() : e.thru(l) } return function () { var t = arguments, n = t[0]; if (e && 1 == t.length && Xi(n) && n.length >= w) return e.plant(n).value(); for (var r = 0, o = i ? s[r].apply(this, t) : n; ++r < i;)o = s[r].call(this, o); return o } } } function tr(t, e) { return function (n, i, o) { return "function" == typeof i && o === r && Xi(n) ? t(n, i) : e(n, Bn(i, o, 3)) } } function er(t) { return function (e, n, i) { return "function" == typeof n && i === r || (n = Bn(n, i, 3)), t(e, n, bo) } } function nr(t) { return function (e, n, i) { return "function" == typeof n && i === r || (n = Bn(n, i, 3)), t(e, n) } } function rr(t) { return function (e, n, r) { var i = {}; return n = dr(n, r, 3), pn(e, function (e, r, o) { var a = n(e, r, o); e = t ? e : a, i[r = t ? a : r] = e }), i } } function ir(t) { return function (e, n, r) { return e = Mt(e), (t ? e : "") + lr(e, n, r) + (t ? "" : e) } } function or(t) { var e = zi(function (n, i) { var o = Vt(i, e.placeholder); return fr(n, t, r, i, o) }); return e } function ar(t, e) { return function (n, i, o, a) { var s = arguments.length < 3; return "function" == typeof i && a === r && Xi(n) ? t(n, i, o, s) : function (t, e, n, r, i) { return i(t, function (t, i, o) { n = r ? (r = !1, t) : e(n, t, i, o) }), n }(n, dr(i, a, 4), o, s, e) } } function sr(t, e, i, o, a, v, g, m, y, b) { var w = e & h, x = e & s, _ = e & l, C = e & c, S = e & u, k = e & f, T = _ ? r : Xn(t); return function u() { for (var c = arguments.length, f = c, h = n(c); f--;)h[f] = arguments[f]; if (o && (h = Mn(h, o, a)), v && (h = $n(h, v, g)), C || k) { var j = u.placeholder, I = Vt(h, j); if ((c -= I.length) < b) { var E = m ? $e(m) : r, L = be(b - c, 0); e |= C ? d : p, e &= ~(C ? p : d), S || (e &= ~(s | l)); var A = [t, e, i, C ? h : r, C ? I : r, C ? r : h, C ? r : I, E, y, L], N = sr.apply(r, A); return Sr(t) && Ar(N, A), N.placeholder = j, N } } var D = x ? i : this, P = _ ? D[t] : t; return m && (h = function (t, e) { for (var n = t.length, i = we(e.length, n), o = $e(t); i--;) { var a = e[i]; t[i] = xr(a, n) ? o[a] : r } return t }(h, m)), w && y < h.length && (h.length = y), this && this !== Dt && this instanceof u && (P = T || Xn(t)), P.apply(D, h) } } function lr(t, e, n) { var r = t.length; if (r >= (e = +e) || !me(e)) return ""; var i = e - r; return Ao(n = null == n ? " " : n + "", pe(i / n.length)).slice(0, i) } function ur(t) { var e = _t[t]; return function (t, n) { return (n = n === r ? 0 : +n || 0) ? (n = ae(10, n), e(t * n) / n) : e(t) } } function cr(t) { return function (e, n, r, i) { var o = dr(r); return null == r && o === Ze ? Pn(e, n, t) : On(e, n, o(r, i, 1), t) } } function fr(t, e, i, o, a, f, g, m) { var y = e & l; if (!y && "function" != typeof t) throw new jt(C); var b = o ? o.length : 0; if (b || (e &= ~(d | p), o = a = r), b -= a ? a.length : 0, e & p) { var w = o, x = a; o = a = r } var _ = y ? r : pr(t), k = [t, e, i, o, a, w, x, f, g, m]; if (_ && (function (t, e) { var n = t[1], r = e[1], i = n | r, o = i < h, a = r == h && n == c || r == h && n == v && t[7].length <= e[8] || r == (h | v) && n == c; if (!o && !a) return t; r & s && (t[2] = e[2], i |= n & s ? 0 : u); var l = e[3]; if (l) { var f = t[3]; t[3] = f ? Mn(f, l, e[4]) : $e(l), t[4] = f ? Vt(t[3], S) : $e(e[4]) } (l = e[5]) && (f = t[5], t[5] = f ? $n(f, l, e[6]) : $e(l), t[6] = f ? Vt(t[5], S) : $e(e[6])), (l = e[7]) && (t[7] = $e(l)), r & h && (t[8] = null == t[8] ? e[8] : we(t[8], e[8])), null == t[9] && (t[9] = e[9]), t[0] = e[0], t[1] = i }(k, _), e = k[1], m = k[9]), k[9] = null == m ? y ? 0 : t.length : be(m - b, 0) || 0, e == s) var T = function (t, e) { var n = Xn(t); return function r() { return (this && this !== Dt && this instanceof r ? n : t).apply(e, arguments) } }(k[0], k[2]); else T = e != d && e != (s | d) || k[4].length ? sr.apply(r, k) : function (t, e, r, i) { var o = e & s, a = Xn(t); return function e() { for (var s = -1, l = arguments.length, u = -1, c = i.length, f = n(c + l); ++u < c;)f[u] = i[u]; for (; l--;)f[u++] = arguments[++s]; return (this && this !== Dt && this instanceof e ? a : t).apply(o ? r : this, f) } }.apply(r, k); return (_ ? kn : Ar)(T, k) } function dr(t, e, n) { var r = Ne.callback || Ho; return r = r === Ho ? Ze : r, n ? r(t, e, n) : r } var pr = Le ? function (t) { return Le.get(t) } : zo; function hr(t) { for (var e = t.name, n = Ae[e], r = n ? n.length : 0; r--;) { var i = n[r], o = i.func; if (null == o || o == t) return i.name } return e } function vr(t, e, n) { var r = Ne.indexOf || zr; return r = r === zr ? Bt : r, t ? r(t, e, n) : r } var gr = _n("length"); function mr(t) { for (var e = Co(t), n = e.length; n--;)e[n][2] = Tr(e[n][1]); return e } function yr(t, e) { var n = null == t ? r : t[e]; return Ji(n) ? n : r } function br(t, e, n) { null == t || Cr(e, t) || (t = 1 == (e = Or(e)).length ? t : gn(t, Tn(e, 0, -1)), e = Ur(e)); var i = null == t ? t : t[e]; return null == i ? r : i.apply(t, n) } function wr(t) { return null != t && kr(gr(t)) } function xr(t, e) { return t = "number" == typeof t || dt.test(t) ? +t : -1, e = null == e ? Ee : e, t > -1 && t % 1 == 0 && t < e } function _r(t, e, n) { if (!Yi(n)) return !1; var r = typeof e; if ("number" == r ? wr(n) && xr(e, n.length) : "string" == r && e in n) { var i = n[e]; return t == t ? t === i : i != i } return !1 } function Cr(t, e) { var n = typeof t; return !!("string" == n && nt.test(t) || "number" == n) || !Xi(t) && (!et.test(t) || null != e && t in Pr(e)) } function Sr(t) { var e = hr(t); if (!(e in Oe.prototype)) return !1; var n = Ne[e]; if (t === n) return !0; var r = pr(n); return !!r && t === r[0] } function kr(t) { return "number" == typeof t && t > -1 && t % 1 == 0 && t <= Ee } function Tr(t) { return t == t && !Yi(t) } function jr(t, e) { t = Pr(t); for (var n = -1, r = e.length, i = {}; ++n < r;) { var o = e[n]; o in t && (i[o] = t[o]) } return i } function Ir(t, e) { var n = {}; return dn(t, function (t, r, i) { e(t, r, i) && (n[r] = t) }), n } var Er, Lr, Ar = (Er = 0, Lr = 0, function (t, e) { var n = Ti(), r = b - (n - Lr); if (Lr = n, r > 0) { if (++Er >= y) return t } else Er = 0; return kn(t, e) }); function Nr(t) { for (var e = bo(t), n = e.length, r = n && t.length, i = !!r && kr(r) && (Xi(t) || Ui(t)), o = -1, a = []; ++o < n;) { var s = e[o]; (i && xr(s, r) || Nt.call(t, s)) && a.push(s) } return a } function Dr(t) { return null == t ? [] : wr(t) ? Yi(t) ? t : St(t) : ko(t) } function Pr(t) { return Yi(t) ? t : St(t) } function Or(t) { if (Xi(t)) return t; var e = []; return Mt(t).replace(rt, function (t, n, r, i) { e.push(r ? i.replace(st, "$1") : n || t) }), e } function Br(t) { return t instanceof Oe ? t.clone() : new Pe(t.__wrapped__, t.__chain__, $e(t.__actions__)) } var Hr = zi(function (t, e) { return Gt(t) && wr(t) ? nn(t, un(e, !1, !0)) : [] }); function Mr(t, e, n) { return t && t.length ? ((n ? _r(t, e, n) : null == e) && (e = 1), Tn(t, e < 0 ? 0 : e)) : [] } function $r(t, e, n) { var r = t ? t.length : 0; return r ? ((n ? _r(t, e, n) : null == e) && (e = 1), Tn(t, 0, (e = r - (+e || 0)) < 0 ? 0 : e)) : [] } var Rr = Jn(), Fr = Jn(!0); function Wr(t) { return t ? t[0] : r } function zr(t, e, n) { var r = t ? t.length : 0; if (!r) return -1; if ("number" == typeof n) n = n < 0 ? be(r + n, 0) : n; else if (n) { var i = Pn(t, e); return i < r && (e == e ? e === t[i] : t[i] != t[i]) ? i : -1 } return Bt(t, e, n || 0) } var qr = zi(function (t) { for (var e = t.length, r = e, i = n(f), o = vr(), a = o == Bt, s = []; r--;) { var l = t[r] = wr(l = t[r]) ? l : []; i[r] = a && l.length >= 120 ? qn(r && l) : null } var u = t[0], c = -1, f = u ? u.length : 0, d = i[0]; t: for (; ++c < f;)if (l = u[c], (d ? Me(d, l) : o(s, l, 0)) < 0) { for (r = e; --r;) { var p = i[r]; if ((p ? Me(p, l) : o(t[r], l, 0)) < 0) continue t } d && d.push(l), s.push(l) } return s }); function Ur(t) { var e = t ? t.length : 0; return e ? t[e - 1] : r } var Xr = zi(function (t, e) { var n = Ye(t, e = un(e)); return Cn(t, e.sort(Pt)), n }); function Gr(t) { return Mr(t, 1) } var Qr = cr(), Vr = cr(!0); var Yr = zi(function (t) { return Ln(un(t, !1, !0)) }); function Jr(t, e, n, i) { if (!t || !t.length) return []; null != e && "boolean" != typeof e && (n = _r(t, e, i = n) ? r : e, e = !1); var o = dr(); return null == n && o === Ze || (n = o(n, i, 3)), e && vr() == Bt ? function (t, e) { for (var n, r = -1, i = t.length, o = -1, a = []; ++r < i;) { var s = t[r], l = e ? e(s, r, t) : s; r && n === l || (n = l, a[++o] = s) } return a }(t, n) : Ln(t, n) } function Zr(t) { if (!t || !t.length) return []; var e = -1, r = 0; t = We(t, function (t) { if (wr(t)) return r = be(t.length, r), !0 }); for (var i = n(r); ++e < r;)i[e] = ze(t, _n(e)); return i } function Kr(t, e, n) { if (!t || !t.length) return []; var i = Zr(t); return null == e ? i : (e = Bn(e, n, 4), ze(i, function (t) { return Ue(t, e, r, !0) })) } var ti = zi(function (t, e) { return wr(t) ? nn(t, e) : [] }); var ei = zi(Zr); function ni(t, e) { var n = -1, r = t ? t.length : 0, i = {}; for (!r || e || Xi(t[0]) || (e = []); ++n < r;) { var o = t[n]; e ? i[o] = e[n] : o && (i[o[0]] = o[1]) } return i } var ri = zi(function (t) { var e = t.length, n = e > 2 ? t[e - 2] : r, i = e > 1 ? t[e - 1] : r; return e > 2 && "function" == typeof n ? e -= 2 : (n = e > 1 && "function" == typeof i ? (--e, i) : r, i = r), t.length = e, Kr(t, n, i) }); function ii(t) { var e = Ne(t); return e.__chain__ = !0, e } function oi(t, e, n) { return e.call(n, t) } var ai = zi(function (t) { return t = un(t), this.thru(function (e) { return function (t, e) { for (var r = -1, i = t.length, o = -1, a = e.length, s = n(i + a); ++r < i;)s[r] = t[r]; for (; ++o < a;)s[r++] = e[o]; return s }(Xi(e) ? e : [Pr(e)], t) }) }); var si = zi(function (t, e) { return Ye(t, un(e)) }), li = Rn(function (t, e, n) { Nt.call(t, n) ? ++t[n] : t[n] = 1 }); function ui(t, e, n) { var i = Xi(t) ? Fe : an; return n && _r(t, e, n) && (e = r), "function" == typeof e && n === r || (e = dr(e, n, 3)), i(t, e) } function ci(t, e, n) { return (Xi(t) ? We : sn)(t, e = dr(e, n, 3)) } var fi = Yn(rn), di = Yn(on, !0); var pi = tr(Re, rn), hi = tr(function (t, e) { for (var n = t.length; n-- && !1 !== e(t[n], n, t);); return t }, on), vi = Rn(function (t, e, n) { Nt.call(t, n) ? t[n].push(e) : t[n] = [e] }); function gi(t, e, n, r) { var i = t ? gr(t) : 0; return kr(i) || (i = (t = ko(t)).length), n = "number" != typeof n || r && _r(e, n, r) ? 0 : n < 0 ? be(i + n, 0) : n || 0, "string" == typeof t || !Xi(t) && eo(t) ? n <= i && t.indexOf(e, n) > -1 : !!i && vr(t, e, n) > -1 } var mi = Rn(function (t, e, n) { t[n] = e }), yi = zi(function (t, e, i) { var o = -1, a = "function" == typeof e, s = Cr(e), l = wr(t) ? n(t.length) : []; return rn(t, function (t) { var n = a ? e : s && null != t ? t[e] : r; l[++o] = n ? n.apply(t, i) : br(t, e, i) }), l }); function bi(t, e, n) { return (Xi(t) ? ze : bn)(t, e = dr(e, n, 3)) } var wi = Rn(function (t, e, n) { t[n ? 0 : 1].push(e) }, function () { return [[], []] }); var xi = ar(Ue, rn), _i = ar(function (t, e, n, r) { var i = t.length; for (r && i && (n = t[--i]); i--;)n = e(n, t[i], i, t); return n }, on); function Ci(t, e, n) { if (n ? _r(t, e, n) : null == e) return (i = (t = Dr(t)).length) > 0 ? t[Sn(0, i - 1)] : r; var i, o = -1, a = io(t), s = (i = a.length) - 1; for (e = we(e < 0 ? 0 : +e || 0, i); ++o < e;) { var l = Sn(o, s), u = a[l]; a[l] = a[o], a[o] = u } return a.length = e, a } function Si(t, e, n) { var i = Xi(t) ? Xe : jn; return n && _r(t, e, n) && (e = r), "function" == typeof e && n === r || (e = dr(e, n, 3)), i(t, e) } var ki = zi(function (t, e) { if (null == t) return []; var n = e[2]; return n && _r(e[0], e[1], n) && (e.length = 1), En(t, un(e), []) }); var Ti = xe || function () { return (new i).getTime() }; function ji(t, e) { var n; if ("function" != typeof e) { if ("function" != typeof t) throw new jt(C); var i = t; t = e, e = i } return function () { return --t > 0 && (n = e.apply(this, arguments)), t <= 1 && (e = r), n } } var Ii = zi(function (t, e, n) { var r = s; if (n.length) { var i = Vt(n, Ii.placeholder); r |= d } return fr(t, r, e, n, i) }), Ei = zi(function (t, e) { for (var n = -1, r = (e = e.length ? un(e) : mo(t)).length; ++n < r;) { var i = e[n]; t[i] = fr(t[i], s, t) } return t }), Li = zi(function (t, e, n) { var r = s | l; if (n.length) { var i = Vt(n, Li.placeholder); r |= d } return fr(e, r, t, n, i) }), Ai = Gn(c), Ni = Gn(f); function Di(t, e, n) { var i, o, a, s, l, u, c, f = 0, d = !1, p = !0; if ("function" != typeof t) throw new jt(C); if (e = e < 0 ? 0 : +e || 0, !0 === n) { var h = !0; p = !1 } else Yi(n) && (h = !!n.leading, d = "maxWait" in n && be(+n.maxWait || 0, e), p = "trailing" in n ? !!n.trailing : p); function v(e, n) { n && ie(n), o = u = c = r, e && (f = Ti(), a = t.apply(l, i), u || o || (i = l = r)) } function g() { var t = e - (Ti() - s); t <= 0 || t > e ? v(c, o) : u = ue(g, t) } function m() { v(p, u) } function y() { if (i = arguments, s = Ti(), l = this, c = p && (u || !h), !1 === d) var n = h && !u; else { o || h || (f = s); var v = d - (s - f), y = v <= 0 || v > d; y ? (o && (o = ie(o)), f = s, a = t.apply(l, i)) : o || (o = ue(m, v)) } return y && u ? u = ie(u) : u || e === d || (u = ue(g, e)), n && (y = !0, a = t.apply(l, i)), !y || u || o || (i = l = r), a } return y.cancel = function () { u && ie(u), o && ie(o), f = 0, o = u = c = r }, y } var Pi = zi(function (t, e) { return en(t, 1, e) }), Oi = zi(function (t, e, n) { return en(t, e, n) }), Bi = Kn(), Hi = Kn(!0); function Mi(t, e) { if ("function" != typeof t || e && "function" != typeof e) throw new jt(C); var n = function () { var r = arguments, i = e ? e.apply(this, r) : r[0], o = n.cache; if (o.has(i)) return o.get(i); var a = t.apply(this, r); return n.cache = o.set(i, a), a }; return n.cache = new Mi.Cache, n } var $i = zi(function (t, e) { if (e = un(e), "function" != typeof t || !Fe(e, Ht)) throw new jt(C); var n = e.length; return zi(function (r) { for (var i = we(r.length, n); i--;)r[i] = e[i](r[i]); return t.apply(this, r) }) }); var Ri = or(d), Fi = or(p), Wi = zi(function (t, e) { return fr(t, v, r, r, r, un(e)) }); function zi(t, e) { if ("function" != typeof t) throw new jt(C); return e = be(e === r ? t.length - 1 : +e || 0, 0), function () { for (var r = arguments, i = -1, o = be(r.length - e, 0), a = n(o); ++i < o;)a[i] = r[e + i]; switch (e) { case 0: return t.call(this, a); case 1: return t.call(this, r[0], a); case 2: return t.call(this, r[0], r[1], a) }var s = n(e + 1); for (i = -1; ++i < e;)s[i] = r[i]; return s[e] = a, t.apply(this, s) } } function qi(t, e) { return t > e } function Ui(t) { return Gt(t) && wr(t) && Nt.call(t, "callee") && !se.call(t, "callee") } var Xi = ge || function (t) { return Gt(t) && kr(t.length) && te.call(t) == T }; function Gi(t, e, n, i) { var o = (n = "function" == typeof n ? Bn(n, i, 3) : r) ? n(t, e) : r; return o === r ? mn(t, e, n) : !!o } function Qi(t) { return Gt(t) && "string" == typeof t.message && te.call(t) == E } function Vi(t) { return Yi(t) && te.call(t) == L } function Yi(t) { var e = typeof t; return !!t && ("object" == e || "function" == e) } function Ji(t) { return null != t && (Vi(t) ? ne.test(At.call(t)) : Gt(t) && ft.test(t)) } function Zi(t) { return "number" == typeof t || Gt(t) && te.call(t) == A } function Ki(t) { var e, n; return !(!Gt(t) || te.call(t) != N || Ui(t) || !(Nt.call(t, "constructor") || "function" != typeof (e = t.constructor) || e instanceof e)) && (dn(t, function (t, e) { n = e }), n === r || Nt.call(t, n)) } function to(t) { return Yi(t) && te.call(t) == D } function eo(t) { return "string" == typeof t || Gt(t) && te.call(t) == P } function no(t) { return Gt(t) && kr(t.length) && !!bt[te.call(t)] } function ro(t, e) { return t < e } function io(t) { var e = t ? gr(t) : 0; return kr(e) ? e ? $e(t) : [] : ko(t) } function oo(t) { return Je(t, bo(t)) } var ao = Fn(function t(e, n, i, o, a) { if (!Yi(e)) return e; var s = wr(n) && (Xi(n) || no(n)), l = s ? r : yo(n); return Re(l || n, function (u, c) { if (l && (u = n[c = u]), Gt(u)) o || (o = []), a || (a = []), function (t, e, n, i, o, a, s) { for (var l = a.length, u = e[n]; l--;)if (a[l] == u) return void (t[n] = s[l]); var c = t[n], f = o ? o(c, u, n, t, e) : r, d = f === r; d && (f = u, wr(u) && (Xi(u) || no(u)) ? f = Xi(c) ? c : wr(c) ? $e(c) : [] : Ki(u) || Ui(u) ? f = Ui(c) ? oo(c) : Ki(c) ? c : {} : d = !1), a.push(u), s.push(f), d ? t[n] = i(f, u, o, a, s) : (f == f ? f !== c : c == c) && (t[n] = f) }(e, n, c, t, i, o, a); else { var f = e[c], d = i ? i(f, u, c, e, n) : r, p = d === r; p && (d = u), d === r && (!s || c in e) || !p && (d == d ? d === f : f != f) || (e[c] = d) } }), e }), so = Fn(function (t, e, n) { return n ? Qe(t, e, n) : Ve(t, e) }); var lo = Qn(so, function (t, e) { return t === r ? e : t }), uo = Qn(ao, function t(e, n) { return e === r ? n : ao(e, n, t) }), co = Zn(pn), fo = Zn(hn), po = er(cn), ho = er(fn), vo = nr(pn), go = nr(hn); function mo(t) { return vn(t, bo(t)) } var yo = ye ? function (t) { var e = null == t ? r : t.constructor; return "function" == typeof e && e.prototype === t || "function" != typeof t && wr(t) ? Nr(t) : Yi(t) ? ye(t) : [] } : Nr; function bo(t) { if (null == t) return []; Yi(t) || (t = St(t)); var e = t.length; e = e && kr(e) && (Xi(t) || Ui(t)) && e || 0; for (var r = t.constructor, i = -1, o = "function" == typeof r && r.prototype === t, a = n(e), s = e > 0; ++i < e;)a[i] = i + ""; for (var l in t) s && xr(l, e) || "constructor" == l && (o || !Nt.call(t, l)) || a.push(l); return a } var wo = rr(!0), xo = rr(), _o = zi(function (t, e) { if (null == t) return {}; if ("function" != typeof e[0]) return e = ze(un(e), Tt), jr(t, nn(bo(t), e)); var n = Bn(e[0], e[1], 3); return Ir(t, function (t, e, r) { return !n(t, e, r) }) }); function Co(t) { t = Pr(t); for (var e = -1, r = yo(t), i = r.length, o = n(i); ++e < i;) { var a = r[e]; o[e] = [a, t[a]] } return o } var So = zi(function (t, e) { return null == t ? {} : "function" == typeof e[0] ? Ir(t, Bn(e[0], e[1], 3)) : jr(t, un(e)) }); function ko(t) { return An(t, yo(t)) } var To = Un(function (t, e, n) { return e = e.toLowerCase(), t + (n ? e.charAt(0).toUpperCase() + e.slice(1) : e) }); function jo(t) { return (t = Mt(t)) && t.replace(pt, Wt).replace(at, "") } var Io = Un(function (t, e, n) { return t + (n ? "-" : "") + e.toLowerCase() }); var Eo = ir(), Lo = ir(!0); function Ao(t, e) { var n = ""; if (t = Mt(t), (e = +e) < 1 || !t || !me(e)) return n; do { e % 2 && (n += t), e = ve(e / 2), t += t } while (e); return n } var No = Un(function (t, e, n) { return t + (n ? "_" : "") + e.toLowerCase() }), Do = Un(function (t, e, n) { return t + (n ? " " : "") + (e.charAt(0).toUpperCase() + e.slice(1)) }); function Po(t, e, n) { var r = t; return (t = Mt(t)) ? (n ? _r(r, e, n) : null == e) ? t.slice(Yt(t), Jt(t) + 1) : (e += "", t.slice($t(t, e), Rt(t, e) + 1)) : t } function Oo(t, e, n) { return n && _r(t, e, n) && (e = r), (t = Mt(t)).match(e || gt) || [] } var Bo = zi(function (t, e) { try { return t.apply(r, e) } catch (t) { return Qi(t) ? t : new o(t) } }); function Ho(t, e, n) { return n && _r(t, e, n) && (e = r), Gt(t) ? $o(t) : Ze(t, e) } function Mo(t) { return t } function $o(t) { return wn(Ke(t, !0)) } var Ro = zi(function (t, e) { return function (n) { return br(n, t, e) } }), Fo = zi(function (t, e) { return function (n) { return br(t, n, e) } }); function Wo(t, e, n) { if (null == n) { var i = Yi(e), o = i ? yo(e) : r, a = o && o.length ? vn(e, o) : r; (a ? a.length : i) || (a = !1, n = e, e = t, t = this) } a || (a = vn(e, yo(e))); var s = !0, l = -1, u = Vi(t), c = a.length; !1 === n ? s = !1 : Yi(n) && "chain" in n && (s = n.chain); for (; ++l < c;) { var f = a[l], d = e[f]; t[f] = d, u && (t.prototype[f] = function (e) { return function () { var n = this.__chain__; if (s || n) { var r = t(this.__wrapped__); return (r.__actions__ = $e(this.__actions__)).push({ func: e, args: arguments, thisArg: t }), r.__chain__ = n, r } return e.apply(t, qe([this.value()], arguments)) } }(d)) } return t } function zo() { } function qo(t) { return Cr(t) ? _n(t) : function (t) { var e = t + ""; return t = Or(t), function (n) { return gn(n, t, e) } }(t) } var Uo, Xo = ur("ceil"), Go = ur("floor"), Qo = Vn(qi, Se), Vo = Vn(ro, ke), Yo = ur("round"); return Ne.prototype = De.prototype, Pe.prototype = tn(De.prototype), Pe.prototype.constructor = Pe, Oe.prototype = tn(De.prototype), Oe.prototype.constructor = Oe, Be.prototype.delete = function (t) { return this.has(t) && delete this.__data__[t] }, Be.prototype.get = function (t) { return "__proto__" == t ? r : this.__data__[t] }, Be.prototype.has = function (t) { return "__proto__" != t && Nt.call(this.__data__, t) }, Be.prototype.set = function (t, e) { return "__proto__" != t && (this.__data__[t] = e), this }, He.prototype.push = function (t) { var e = this.data; "string" == typeof t || Yi(t) ? e.set.add(t) : e.hash[t] = !0 }, Mi.Cache = Be, Ne.after = function (t, e) { if ("function" != typeof e) { if ("function" != typeof t) throw new jt(C); var n = t; t = e, e = n } return t = me(t = +t) ? t : 0, function () { if (--t < 1) return e.apply(this, arguments) } }, Ne.ary = function (t, e, n) { return n && _r(t, e, n) && (e = r), e = t && null == e ? t.length : be(+e || 0, 0), fr(t, h, r, r, r, r, e) }, Ne.assign = so, Ne.at = si, Ne.before = ji, Ne.bind = Ii, Ne.bindAll = Ei, Ne.bindKey = Li, Ne.callback = Ho, Ne.chain = ii, Ne.chunk = function (t, e, r) { e = (r ? _r(t, e, r) : null == e) ? 1 : be(ve(e) || 1, 1); for (var i = 0, o = t ? t.length : 0, a = -1, s = n(pe(o / e)); i < o;)s[++a] = Tn(t, i, i += e); return s }, Ne.compact = function (t) { for (var e = -1, n = t ? t.length : 0, r = -1, i = []; ++e < n;) { var o = t[e]; o && (i[++r] = o) } return i }, Ne.constant = function (t) { return function () { return t } }, Ne.countBy = li, Ne.create = function (t, e, n) { var i = tn(t); return n && _r(t, e, n) && (e = r), e ? Ve(i, e) : i }, Ne.curry = Ai, Ne.curryRight = Ni, Ne.debounce = Di, Ne.defaults = lo, Ne.defaultsDeep = uo, Ne.defer = Pi, Ne.delay = Oi, Ne.difference = Hr, Ne.drop = Mr, Ne.dropRight = $r, Ne.dropRightWhile = function (t, e, n) { return t && t.length ? Nn(t, dr(e, n, 3), !0, !0) : [] }, Ne.dropWhile = function (t, e, n) { return t && t.length ? Nn(t, dr(e, n, 3), !0) : [] }, Ne.fill = function (t, e, n, i) { var o = t ? t.length : 0; return o ? (n && "number" != typeof n && _r(t, e, n) && (n = 0, i = o), function (t, e, n, i) { var o = t.length; for ((n = null == n ? 0 : +n || 0) < 0 && (n = -n > o ? 0 : o + n), (i = i === r || i > o ? o : +i || 0) < 0 && (i += o), o = n > i ? 0 : i >>> 0, n >>>= 0; n < o;)t[n++] = e; return t }(t, e, n, i)) : [] }, Ne.filter = ci, Ne.flatten = function (t, e, n) { var r = t ? t.length : 0; return n && _r(t, e, n) && (e = !1), r ? un(t, e) : [] }, Ne.flattenDeep = function (t) { return t && t.length ? un(t, !0) : [] }, Ne.flow = Bi, Ne.flowRight = Hi, Ne.forEach = pi, Ne.forEachRight = hi, Ne.forIn = po, Ne.forInRight = ho, Ne.forOwn = vo, Ne.forOwnRight = go, Ne.functions = mo, Ne.groupBy = vi, Ne.indexBy = mi, Ne.initial = function (t) { return $r(t, 1) }, Ne.intersection = qr, Ne.invert = function (t, e, n) { n && _r(t, e, n) && (e = r); for (var i = -1, o = yo(t), a = o.length, s = {}; ++i < a;) { var l = o[i], u = t[l]; e ? Nt.call(s, u) ? s[u].push(l) : s[u] = [l] : s[u] = l } return s }, Ne.invoke = yi, Ne.keys = yo, Ne.keysIn = bo, Ne.map = bi, Ne.mapKeys = wo, Ne.mapValues = xo, Ne.matches = $o, Ne.matchesProperty = function (t, e) { return xn(t, Ke(e, !0)) }, Ne.memoize = Mi, Ne.merge = ao, Ne.method = Ro, Ne.methodOf = Fo, Ne.mixin = Wo, Ne.modArgs = $i, Ne.negate = function (t) { if ("function" != typeof t) throw new jt(C); return function () { return !t.apply(this, arguments) } }, Ne.omit = _o, Ne.once = function (t) { return ji(2, t) }, Ne.pairs = Co, Ne.partial = Ri, Ne.partialRight = Fi, Ne.partition = wi, Ne.pick = So, Ne.pluck = function (t, e) { return bi(t, qo(e)) }, Ne.property = qo, Ne.propertyOf = function (t) { return function (e) { return gn(t, Or(e), e + "") } }, Ne.pull = function () { var t = arguments, e = t[0]; if (!e || !e.length) return e; for (var n = 0, r = vr(), i = t.length; ++n < i;)for (var o = 0, a = t[n]; (o = r(e, a, o)) > -1;)ce.call(e, o, 1); return e }, Ne.pullAt = Xr, Ne.range = function (t, e, i) { i && _r(t, e, i) && (e = i = r), t = +t || 0, null == e ? (e = t, t = 0) : e = +e || 0; for (var o = -1, a = be(pe((e - t) / ((i = null == i ? 1 : +i || 0) || 1)), 0), s = n(a); ++o < a;)s[o] = t, t += i; return s }, Ne.rearg = Wi, Ne.reject = function (t, e, n) { var r = Xi(t) ? We : sn; return e = dr(e, n, 3), r(t, function (t, n, r) { return !e(t, n, r) }) }, Ne.remove = function (t, e, n) { var r = []; if (!t || !t.length) return r; var i = -1, o = [], a = t.length; for (e = dr(e, n, 3); ++i < a;) { var s = t[i]; e(s, i, t) && (r.push(s), o.push(i)) } return Cn(t, o), r }, Ne.rest = Gr, Ne.restParam = zi, Ne.set = function (t, e, n) { if (null == t) return t; for (var r = e + "", i = -1, o = (e = null != t[r] || Cr(e, t) ? [r] : Or(e)).length, a = o - 1, s = t; null != s && ++i < o;) { var l = e[i]; Yi(s) && (i == a ? s[l] = n : null == s[l] && (s[l] = xr(e[i + 1]) ? [] : {})), s = s[l] } return t }, Ne.shuffle = function (t) { return Ci(t, ke) }, Ne.slice = function (t, e, n) { var r = t ? t.length : 0; return r ? (n && "number" != typeof n && _r(t, e, n) && (e = 0, n = r), Tn(t, e, n)) : [] }, Ne.sortBy = function (t, e, n) { if (null == t) return []; n && _r(t, e, n) && (e = r); var i = -1; return e = dr(e, n, 3), In(bn(t, function (t, n, r) { return { criteria: e(t, n, r), index: ++i, value: t } }), Ft) }, Ne.sortByAll = ki, Ne.sortByOrder = function (t, e, n, i) { return null == t ? [] : (i && _r(e, n, i) && (n = r), Xi(e) || (e = null == e ? [] : [e]), Xi(n) || (n = null == n ? [] : [n]), En(t, e, n)) }, Ne.spread = function (t) { if ("function" != typeof t) throw new jt(C); return function (e) { return t.apply(this, e) } }, Ne.take = function (t, e, n) { return t && t.length ? ((n ? _r(t, e, n) : null == e) && (e = 1), Tn(t, 0, e < 0 ? 0 : e)) : [] }, Ne.takeRight = function (t, e, n) { var r = t ? t.length : 0; return r ? ((n ? _r(t, e, n) : null == e) && (e = 1), Tn(t, (e = r - (+e || 0)) < 0 ? 0 : e)) : [] }, Ne.takeRightWhile = function (t, e, n) { return t && t.length ? Nn(t, dr(e, n, 3), !1, !0) : [] }, Ne.takeWhile = function (t, e, n) { return t && t.length ? Nn(t, dr(e, n, 3)) : [] }, Ne.tap = function (t, e, n) { return e.call(n, t), t }, Ne.throttle = function (t, e, n) { var r = !0, i = !0; if ("function" != typeof t) throw new jt(C); return !1 === n ? r = !1 : Yi(n) && (r = "leading" in n ? !!n.leading : r, i = "trailing" in n ? !!n.trailing : i), Di(t, e, { leading: r, maxWait: +e, trailing: i }) }, Ne.thru = oi, Ne.times = function (t, e, r) { if ((t = ve(t)) < 1 || !me(t)) return []; var i = -1, o = n(we(t, Te)); for (e = Bn(e, r, 1); ++i < t;)i < Te ? o[i] = e(i) : e(i); return o }, Ne.toArray = io, Ne.toPlainObject = oo, Ne.transform = function (t, e, n, i) { var o = Xi(t) || no(t); if (e = dr(e, i, 4), null == n) if (o || Yi(t)) { var a = t.constructor; n = o ? Xi(t) ? new a : [] : tn(Vi(a) ? a.prototype : r) } else n = {}; return (o ? Re : pn)(t, function (t, r, i) { return e(n, t, r, i) }), n }, Ne.union = Yr, Ne.uniq = Jr, Ne.unzip = Zr, Ne.unzipWith = Kr, Ne.values = ko, Ne.valuesIn = function (t) { return An(t, bo(t)) }, Ne.where = function (t, e) { return ci(t, wn(e)) }, Ne.without = ti, Ne.wrap = function (t, e) { return fr(e = null == e ? Mo : e, d, r, [t], []) }, Ne.xor = function () { for (var t = -1, e = arguments.length; ++t < e;) { var n = arguments[t]; if (wr(n)) var r = r ? qe(nn(r, n), nn(n, r)) : n } return r ? Ln(r) : [] }, Ne.zip = ei, Ne.zipObject = ni, Ne.zipWith = ri, Ne.backflow = Hi, Ne.collect = bi, Ne.compose = Hi, Ne.each = pi, Ne.eachRight = hi, Ne.extend = so, Ne.iteratee = Ho, Ne.methods = mo, Ne.object = ni, Ne.select = ci, Ne.tail = Gr, Ne.unique = Jr, Wo(Ne, Ne), Ne.add = function (t, e) { return (+t || 0) + (+e || 0) }, Ne.attempt = Bo, Ne.camelCase = To, Ne.capitalize = function (t) { return (t = Mt(t)) && t.charAt(0).toUpperCase() + t.slice(1) }, Ne.ceil = Xo, Ne.clone = function (t, e, n, r) { return e && "boolean" != typeof e && _r(t, e, n) ? e = !1 : "function" == typeof e && (r = n, n = e, e = !1), "function" == typeof n ? Ke(t, e, Bn(n, r, 1)) : Ke(t, e) }, Ne.cloneDeep = function (t, e, n) { return "function" == typeof e ? Ke(t, !0, Bn(e, n, 1)) : Ke(t, !0) }, Ne.deburr = jo, Ne.endsWith = function (t, e, n) { e += ""; var i = (t = Mt(t)).length; return n = n === r ? i : we(n < 0 ? 0 : +n || 0, i), (n -= e.length) >= 0 && t.indexOf(e, n) == n }, Ne.escape = function (t) { return (t = Mt(t)) && J.test(t) ? t.replace(V, zt) : t }, Ne.escapeRegExp = function (t) { return (t = Mt(t)) && ot.test(t) ? t.replace(it, qt) : t || "(?:)" }, Ne.every = ui, Ne.find = fi, Ne.findIndex = Rr, Ne.findKey = co, Ne.findLast = di, Ne.findLastIndex = Fr, Ne.findLastKey = fo, Ne.findWhere = function (t, e) { return fi(t, wn(e)) }, Ne.first = Wr, Ne.floor = Go, Ne.get = function (t, e, n) { var i = null == t ? r : gn(t, Or(e), e + ""); return i === r ? n : i }, Ne.gt = qi, Ne.gte = function (t, e) { return t >= e }, Ne.has = function (t, e) { if (null == t) return !1; var n = Nt.call(t, e); if (!n && !Cr(e)) { if (null == (t = 1 == (e = Or(e)).length ? t : gn(t, Tn(e, 0, -1)))) return !1; e = Ur(e), n = Nt.call(t, e) } return n || kr(t.length) && xr(e, t.length) && (Xi(t) || Ui(t)) }, Ne.identity = Mo, Ne.includes = gi, Ne.indexOf = zr, Ne.inRange = function (t, e, n) { return e = +e || 0, n === r ? (n = e, e = 0) : n = +n || 0, t >= we(e, n) && t < be(e, n) }, Ne.isArguments = Ui, Ne.isArray = Xi, Ne.isBoolean = function (t) { return !0 === t || !1 === t || Gt(t) && te.call(t) == j }, Ne.isDate = function (t) { return Gt(t) && te.call(t) == I }, Ne.isElement = function (t) { return !!t && 1 === t.nodeType && Gt(t) && !Ki(t) }, Ne.isEmpty = function (t) { return null == t || (wr(t) && (Xi(t) || eo(t) || Ui(t) || Gt(t) && Vi(t.splice)) ? !t.length : !yo(t).length) }, Ne.isEqual = Gi, Ne.isError = Qi, Ne.isFinite = function (t) { return "number" == typeof t && me(t) }, Ne.isFunction = Vi, Ne.isMatch = function (t, e, n, i) { return n = "function" == typeof n ? Bn(n, i, 3) : r, yn(t, mr(e), n) }, Ne.isNaN = function (t) { return Zi(t) && t != +t }, Ne.isNative = Ji, Ne.isNull = function (t) { return null === t }, Ne.isNumber = Zi, Ne.isObject = Yi, Ne.isPlainObject = Ki, Ne.isRegExp = to, Ne.isString = eo, Ne.isTypedArray = no, Ne.isUndefined = function (t) { return t === r }, Ne.kebabCase = Io, Ne.last = Ur, Ne.lastIndexOf = function (t, e, n) { var r = t ? t.length : 0; if (!r) return -1; var i = r; if ("number" == typeof n) i = (n < 0 ? be(r + n, 0) : we(n || 0, r - 1)) + 1; else if (n) { var o = t[i = Pn(t, e, !0) - 1]; return (e == e ? e === o : o != o) ? i : -1 } if (e != e) return Xt(t, i, !0); for (; i--;)if (t[i] === e) return i; return -1 }, Ne.lt = ro, Ne.lte = function (t, e) { return t <= e }, Ne.max = Qo, Ne.min = Vo, Ne.noConflict = function () { return Dt._ = ee, this }, Ne.noop = zo, Ne.now = Ti, Ne.pad = function (t, e, n) { e = +e; var r = (t = Mt(t)).length; if (r >= e || !me(e)) return t; var i = (e - r) / 2, o = ve(i); return (n = lr("", pe(i), n)).slice(0, o) + t + n }, Ne.padLeft = Eo, Ne.padRight = Lo, Ne.parseInt = function (t, e, n) { return (n ? _r(t, e, n) : null == e) ? e = 0 : e && (e = +e), t = Po(t), _e(t, e || (ct.test(t) ? 16 : 10)) }, Ne.random = function (t, e, n) { n && _r(t, e, n) && (e = n = r); var i = null == t, o = null == e; if (null == n && (o && "boolean" == typeof t ? (n = t, t = 1) : "boolean" == typeof e && (n = e, o = !0)), i && o && (e = 1, o = !1), t = +t || 0, o ? (e = t, t = 0) : e = +e || 0, n || t % 1 || e % 1) { var a = Ce(); return we(t + a * (e - t + oe("1e-" + ((a + "").length - 1))), e) } return Sn(t, e) }, Ne.reduce = xi, Ne.reduceRight = _i, Ne.repeat = Ao, Ne.result = function (t, e, n) { var i = null == t ? r : t[e]; return i === r && (null == t || Cr(e, t) || (i = null == (t = 1 == (e = Or(e)).length ? t : gn(t, Tn(e, 0, -1))) ? r : t[Ur(e)]), i = i === r ? n : i), Vi(i) ? i.call(t) : i }, Ne.round = Yo, Ne.runInContext = t, Ne.size = function (t) { var e = t ? gr(t) : 0; return kr(e) ? e : yo(t).length }, Ne.snakeCase = No, Ne.some = Si, Ne.sortedIndex = Qr, Ne.sortedLastIndex = Vr, Ne.startCase = Do, Ne.startsWith = function (t, e, n) { return t = Mt(t), n = null == n ? 0 : we(n < 0 ? 0 : +n || 0, t.length), t.lastIndexOf(e, n) == n }, Ne.sum = function (t, e, n) { return n && _r(t, e, n) && (e = r), 1 == (e = dr(e, n, 3)).length ? function (t, e) { for (var n = t.length, r = 0; n--;)r += +e(t[n]) || 0; return r }(Xi(t) ? t : Dr(t), e) : function (t, e) { var n = 0; return rn(t, function (t, r, i) { n += +e(t, r, i) || 0 }), n }(t, e) }, Ne.template = function (t, e, n) { var i = Ne.templateSettings; n && _r(t, e, n) && (e = n = r), t = Mt(t), e = Qe(Ve({}, n || e), i, Ge); var o, a, s = Qe(Ve({}, e.imports), i.imports, Ge), l = yo(s), u = An(s, l), c = 0, f = e.interpolate || ht, d = "__p += '", p = kt((e.escape || ht).source + "|" + f.source + "|" + (f === tt ? lt : ht).source + "|" + (e.evaluate || ht).source + "|$", "g"), h = "//# sourceURL=" + ("sourceURL" in e ? e.sourceURL : "lodash.templateSources[" + ++yt + "]") + "\n"; t.replace(p, function (e, n, r, i, s, l) { return r || (r = i), d += t.slice(c, l).replace(vt, Ut), n && (o = !0, d += "' +\n__e(" + n + ") +\n'"), s && (a = !0, d += "';\n" + s + ";\n__p += '"), r && (d += "' +\n((__t = (" + r + ")) == null ? '' : __t) +\n'"), c = l + e.length, e }), d += "';\n"; var v = e.variable; v || (d = "with (obj) {\n" + d + "\n}\n"), d = (a ? d.replace(U, "") : d).replace(X, "$1").replace(G, "$1;"), d = "function(" + (v || "obj") + ") {\n" + (v ? "" : "obj || (obj = {});\n") + "var __t, __p = ''" + (o ? ", __e = _.escape" : "") + (a ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + d + "return __p\n}"; var g = Bo(function () { return xt(l, h + "return " + d).apply(r, u) }); if (g.source = d, Qi(g)) throw g; return g }, Ne.trim = Po, Ne.trimLeft = function (t, e, n) { var r = t; return (t = Mt(t)) ? (n ? _r(r, e, n) : null == e) ? t.slice(Yt(t)) : t.slice($t(t, e + "")) : t }, Ne.trimRight = function (t, e, n) { var r = t; return (t = Mt(t)) ? (n ? _r(r, e, n) : null == e) ? t.slice(0, Jt(t) + 1) : t.slice(0, Rt(t, e + "") + 1) : t }, Ne.trunc = function (t, e, n) { n && _r(t, e, n) && (e = r); var i = g, o = m; if (null != e) if (Yi(e)) { var a = "separator" in e ? e.separator : a; i = "length" in e ? +e.length || 0 : i, o = "omission" in e ? Mt(e.omission) : o } else i = +e || 0; if (i >= (t = Mt(t)).length) return t; var s = i - o.length; if (s < 1) return o; var l = t.slice(0, s); if (null == a) return l + o; if (to(a)) { if (t.slice(s).search(a)) { var u, c, f = t.slice(0, s); for (a.global || (a = kt(a.source, (ut.exec(a) || "") + "g")), a.lastIndex = 0; u = a.exec(f);)c = u.index; l = l.slice(0, null == c ? s : c) } } else if (t.indexOf(a, s) != s) { var d = l.lastIndexOf(a); d > -1 && (l = l.slice(0, d)) } return l + o }, Ne.unescape = function (t) { return (t = Mt(t)) && Y.test(t) ? t.replace(Q, Zt) : t }, Ne.uniqueId = function (t) { var e = ++Qt; return Mt(t) + e }, Ne.words = Oo, Ne.all = ui, Ne.any = Si, Ne.contains = gi, Ne.eq = Gi, Ne.detect = fi, Ne.foldl = xi, Ne.foldr = _i, Ne.head = Wr, Ne.include = gi, Ne.inject = xi, Wo(Ne, (Uo = {}, pn(Ne, function (t, e) { Ne.prototype[e] || (Uo[e] = t) }), Uo), !1), Ne.sample = Ci, Ne.prototype.sample = function (t) { return this.__chain__ || null != t ? this.thru(function (e) { return Ci(e, t) }) : Ci(this.value()) }, Ne.VERSION = a, Re(["bind", "bindKey", "curry", "curryRight", "partial", "partialRight"], function (t) { Ne[t].placeholder = Ne }), Re(["drop", "take"], function (t, e) { Oe.prototype[t] = function (n) { var r = this.__filtered__; if (r && !e) return new Oe(this); n = null == n ? 1 : be(ve(n) || 0, 0); var i = this.clone(); return r ? i.__takeCount__ = we(i.__takeCount__, n) : i.__views__.push({ size: n, type: t + (i.__dir__ < 0 ? "Right" : "") }), i }, Oe.prototype[t + "Right"] = function (e) { return this.reverse()[t](e).reverse() } }), Re(["filter", "map", "takeWhile"], function (t, e) { var n = e + 1, r = n != _; Oe.prototype[t] = function (t, e) { var i = this.clone(); return i.__iteratees__.push({ iteratee: dr(t, e, 1), type: n }), i.__filtered__ = i.__filtered__ || r, i } }), Re(["first", "last"], function (t, e) { var n = "take" + (e ? "Right" : ""); Oe.prototype[t] = function () { return this[n](1).value()[0] } }), Re(["initial", "rest"], function (t, e) { var n = "drop" + (e ? "" : "Right"); Oe.prototype[t] = function () { return this.__filtered__ ? new Oe(this) : this[n](1) } }), Re(["pluck", "where"], function (t, e) { var n = e ? "filter" : "map", r = e ? wn : qo; Oe.prototype[t] = function (t) { return this[n](r(t)) } }), Oe.prototype.compact = function () { return this.filter(Mo) }, Oe.prototype.reject = function (t, e) { return t = dr(t, e, 1), this.filter(function (e) { return !t(e) }) }, Oe.prototype.slice = function (t, e) { t = null == t ? 0 : +t || 0; var n = this; return n.__filtered__ && (t > 0 || e < 0) ? new Oe(n) : (t < 0 ? n = n.takeRight(-t) : t && (n = n.drop(t)), e !== r && (n = (e = +e || 0) < 0 ? n.dropRight(-e) : n.take(e - t)), n) }, Oe.prototype.takeRightWhile = function (t, e) { return this.reverse().takeWhile(t, e).reverse() }, Oe.prototype.toArray = function () { return this.take(ke) }, pn(Oe.prototype, function (t, e) { var n = /^(?:filter|map|reject)|While$/.test(e), i = /^(?:first|last)$/.test(e), o = Ne[i ? "take" + ("last" == e ? "Right" : "") : e]; o && (Ne.prototype[e] = function () { var e = i ? [1] : arguments, a = this.__chain__, s = this.__wrapped__, l = !!this.__actions__.length, u = s instanceof Oe, c = e[0], f = u || Xi(s); f && n && "function" == typeof c && 1 != c.length && (u = f = !1); var d = function (t) { return i && a ? o(t, 1)[0] : o.apply(r, qe([t], e)) }, p = { func: oi, args: [d], thisArg: r }, h = u && !l; if (i && !a) return h ? ((s = s.clone()).__actions__.push(p), t.call(s)) : o.call(r, this.value())[0]; if (!i && f) { s = h ? s : new Oe(this); var v = t.apply(s, e); return v.__actions__.push(p), new Pe(v, a) } return this.thru(d) }) }), Re(["join", "pop", "push", "replace", "shift", "sort", "splice", "split", "unshift"], function (t) { var e = (/^(?:replace|split)$/.test(t) ? Lt : It)[t], n = /^(?:push|sort|unshift)$/.test(t) ? "tap" : "thru", r = /^(?:join|pop|replace|shift)$/.test(t); Ne.prototype[t] = function () { var t = arguments; return r && !this.__chain__ ? e.apply(this.value(), t) : this[n](function (n) { return e.apply(n, t) }) } }), pn(Oe.prototype, function (t, e) { var n = Ne[e]; if (n) { var r = n.name; (Ae[r] || (Ae[r] = [])).push({ name: e, func: n }) } }), Ae[sr(r, l).name] = [{ name: "wrapper", func: r }], Oe.prototype.clone = function () { var t = new Oe(this.__wrapped__); return t.__actions__ = $e(this.__actions__), t.__dir__ = this.__dir__, t.__filtered__ = this.__filtered__, t.__iteratees__ = $e(this.__iteratees__), t.__takeCount__ = this.__takeCount__, t.__views__ = $e(this.__views__), t }, Oe.prototype.reverse = function () { if (this.__filtered__) { var t = new Oe(this); t.__dir__ = -1, t.__filtered__ = !0 } else (t = this.clone()).__dir__ *= -1; return t }, Oe.prototype.value = function () { var t = this.__wrapped__.value(), e = this.__dir__, n = Xi(t), r = e < 0, i = n ? t.length : 0, o = function (t, e, n) { for (var r = -1, i = n.length; ++r < i;) { var o = n[r], a = o.size; switch (o.type) { case "drop": t += a; break; case "dropRight": e -= a; break; case "take": e = we(e, t + a); break; case "takeRight": t = be(t, e - a) } } return { start: t, end: e } }(0, i, this.__views__), a = o.start, s = o.end, l = s - a, u = r ? s : a - 1, c = this.__iteratees__, f = c.length, d = 0, p = we(l, this.__takeCount__); if (!n || i < w || i == l && p == l) return Dn(r && n ? t.reverse() : t, this.__actions__); var h = []; t: for (; l-- && d < p;) { for (var v = -1, g = t[u += e]; ++v < f;) { var m = c[v], y = m.iteratee, b = m.type, C = y(g); if (b == _) g = C; else if (!C) { if (b == x) continue t; break t } } h[d++] = g } return h }, Ne.prototype.chain = function () { return ii(this) }, Ne.prototype.commit = function () { return new Pe(this.value(), this.__chain__) }, Ne.prototype.concat = ai, Ne.prototype.plant = function (t) { for (var e, n = this; n instanceof De;) { var r = Br(n); e ? i.__wrapped__ = r : e = r; var i = r; n = n.__wrapped__ } return i.__wrapped__ = t, e }, Ne.prototype.reverse = function () { var t = this.__wrapped__, e = function (t) { return n && n.__dir__ < 0 ? t : t.reverse() }; if (t instanceof Oe) { var n = t; return this.__actions__.length && (n = new Oe(this)), (n = n.reverse()).__actions__.push({ func: oi, args: [e], thisArg: r }), new Pe(n, this.__chain__) } return this.thru(e) }, Ne.prototype.toString = function () { return this.value() + "" }, Ne.prototype.run = Ne.prototype.toJSON = Ne.prototype.valueOf = Ne.prototype.value = function () { return Dn(this.__wrapped__, this.__actions__) }, Ne.prototype.collect = Ne.prototype.map, Ne.prototype.head = Ne.prototype.first, Ne.prototype.select = Ne.prototype.filter, Ne.prototype.tail = Ne.prototype.rest, Ne }(); "function" == typeof define && "object" == typeof define.amd && define.amd ? (Dt._ = Kt, define(function () { return Kt })) : jt && It ? Nt ? (It.exports = Kt)._ = Kt : jt._ = Kt : Dt._ = Kt }).call(this) }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {}) }, {}], 3: [function (t, e, n) { var r = window.jQuery, i = window.PX || {}, o = t("./settings.js"), a = t("./helpers/analytics.js"), s = r("body").first(), l = r("html").first(); function u() { r("input.js-lang-changer").off("change.lang").on("change.lang", function () { var t = r(this), e = t.attr("name"), n = r('[name="' + e + '"]').filter(":checked").val(), i = t.closest("tr").find(".js-lang-change"); i.attr("href", i.attr("data-" + n + "-href")) }) } i._toggleLangInit = u, e.exports = { init: function () { var t, e, n, c; r(window).trigger("Scripts/Behavior"), (t = r("[data-toggle]")).length > 0 && t.each(function () { var t = r(this), e = r('[data-toggled-by="' + t.data("toggle") + '"]').first(); t.on("click", function () { e.toggleClass("display-none") }) }), r("[data-back-button]").on("click", function (t) { t.preventDefault(), window.history.back() }), r("[data-order-now-button]").on("click", function (t) { t.preventDefault(); var e = r(this).attr("data-order-now-button"); if ("false" !== e) { var n = i.favoriteId ? i.favoriteId : i.closest; n = void 0 !== n && "0" !== n ? "?storeid=" + n : ""; var s = o.locations.onlineOrderUrl; a.track("Menu", "Menu-Clicked", "Online Ordering"), window.open(s) } }), r(".button.inactive").on("click keypress", function (t) { t.preventDefault() }), e = window.location.href, r(".fb-share-button").attr("data-href", e), r(".twitter-share-button").attr("href", e), r("[data-a11y-focus], .menu-block").on("focusin", function () { r(this).attr("data-a11y-focus", "true") }), r("[data-a11y-focus], .menu-block").on("focusout", function () { r(this).attr("data-a11y-focus", "false") }), r("[data-mobile-menu-toggle]").on("click", function (t) { t.preventDefault(); var e = r("[data-mobile-active]").first(), n = "true" === e.attr("data-mobile-active") ? "false" : "true", i = (r(".mobile-nav"), 0); e.attr("data-mobile-active", n), "true" === n ? (i = s.scrollTop(), s.addClass("no-scroll fixed").css("top", -i), l.addClass("no-scroll")) : (s.removeClass("no-scroll fixed").off(".mobile-nav").css("top", 0), l.removeClass("no-scroll")) }), r("[data-mobile-sublink]").on("click", function (t) { t.preventDefault(); var e = r(this), n = "true" === e.attr("data-active") ? "false" : "true", i = e.closest(".submenu"); i.length || (i = e.closest(".mobile-nav")), "true" === n ? (i.scrollTop(0), i.css("overflow", "hidden")) : i.removeAttr("style"), e.attr("data-active", n) }), r("[data-mobile-back]").on("click", function (t) { t.preventDefault(); var e = r(this), n = e.parent().parent().find("[data-mobile-sublink]").first(); n.trigger("click") }), n = r(".main-nav").first().next(), r("[data-skip-to-content]").on("click", function (t) { t.preventDefault(), n.attr("tabindex", "0"), n.focus(), n.blur(function () { n.removeAttr("tabindex") }) }), r(".side-nav button.submenu-toggle").on("click", function (t) { var e = r(this), n = e.closest("li"); n.attr("data-open", "false" === n.attr("data-open") ? "true" : "false") }), r(".main-nav .submenu-link").on("mouseenter", function (t) { r(this).attr("data-open", "true") }), r(".main-nav .submenu-link").on("mouseleave", function (t) { r(this).attr("data-open", "false") }), r("button.toggle-submenu").on("click", function (t) { t.preventDefault(), r(this).blur(), r(this).closest(".submenu-link").attr("data-open", "false") }), r(".nav-location-search").on("submit", function (t) { t.preventDefault(); var e = r(this), n = e.find("input.search").val(), i = r("input[name='nav-search-type']:checked").val(), a = o.locations.locationUrl + "?stype=" + i + "#" + n; window.location.href = a, window.location.pathname === a && window.location.reload() }), u(), i.support.IS_TABLET && (c = !1, r(".submenu-link .info-container [data-order-now-button]").attr("data-order-now-button", "false"), r(".submenu-link .anchor, .submenu-link .info-container [data-order-now-button]").each(function () { var t = r(this); if (void 0 !== t.attr("data-ga-event-menu")) { var e = t.attr("data-ga-event-menu"); t.attr("data-ga-event-dropdown-menu", e), t.off("click"), t.removeAttr("data-ga-event-menu") } t.on("click touchstart MSPointerDown", function (e) { if (t !== c) e.preventDefault(), t.focus(), c = t, void 0 !== t.attr("data-order-now-button") ? t.attr("data-order-now-button", "true") : r(".submenu-link .info-container [data-order-now-button]").attr("data-order-now-button", "false"); else if (void 0 !== t.attr("data-ga-event-dropdown-menu")) { e.preventDefault(); var n = t.attr("data-ga-event-dropdown-menu"), i = t.attr("href"); a.track("Menu", "Menu-Clicked", n, function () { window.location.href = i }) } }) })) } } }, { "./helpers/analytics.js": 11, "./settings.js": 26 }], 4: [function (t, e, n) { "use strict"; var r = window.jQuery, i = window.PX || {}, o = t("lodash"), a = { $el: null, activeIndex: 0, newIndex: 0, slides: [], len: 0, timer: 5e3, interval: null, slideHeight: null, init: function (t) { var e = this, n = t.find(".main-feature-banner"), i = t.attr("data-carousel-timer"); e.$el = t, e.slides = [], e.interval = null, e.len = n.length, n.length && n.each(function () { e.slides.push(r(this)) }), void 0 !== i && (e.timer = 1e3 * i), r(window).on("Resize/Stop", function () { e.setHeight() }).on("blur", function () { e.stop() }).on("focus", function () { e.start() }), e.setHeight(), e.goTo(e.activeIndex), e.start() }, setHeight: function () { var t = this; o.forEach(t.slides, function (e) { e.css({ position: "relative", height: "auto" }), e.outerHeight() > t.slideHeight && (t.slideHeight = e.outerHeight()) }), t.$el.css("height", t.slideHeight + "px"), o.forEach(t.slides, function (e) { e.css({ position: "", height: t.slideHeight + "px" }) }) }, goTo: function (t) { var e, n, r = this; r.newIndex = s(t, r.len), r.activeIndex = s(r.activeIndex, r.len), e = r.slides[r.newIndex], n = r.slides[r.activeIndex], o.forEach(r.slides, function (t) { t.attr("data-ui-transition", "off"), t.attr("aria-hidden", "true") }), n.attr("data-ui-transition", "out"), e.attr("data-ui-transition", "in"), e.attr("aria-hidden", "false"), r.activeIndex = r.newIndex }, start: function () { var t = this; t.interval && t.stop(), t.interval = setInterval(function () { t.goTo(t.activeIndex + 1) }, t.timer) }, stop: function () { clearInterval(this.interval), this.interval = null } }; function s(t, e) { var n = t; return t < 0 && (n = e - 1), t >= e && (n = 0), n } e.exports.init = function () { var t = r(".carousel"), e = null; i.carousels = [], t.each(function () { (e = Object.create(a)).init(r(this)), i.carousels.push(e) }) } }, { lodash: 2 }], 5: [function (t, e, n) { var r = window.jQuery; function i(t) { this.self = t, this.initOffset = t.offset(), this.initialized = !1 } i.prototype.resize = function () { var t = this.self.parent().offset().left, e = this.self.parent().width() - 30; this.self.css({ width: e, left: t }) }, i.prototype.init = function () { var t = this; r(window).on("scrollStart", function () { r(window).scrollTop() + 100 > t.initOffset.top ? (t.self.attr("data-state", "fixed"), t.resize()) : t.self.attr("data-state", "relative").removeAttr("style") }), r(window).on("resizeStart", function () { t.resize() }) }, e.exports = i }, {}], 6: [function (t, e, n) { var r = window.jQuery; function i(t, e) { this.$self = t, this.imgUrl = this.$self.attr("data-bg-cover"), this.img = r('<div data-bg-img="' + e + '"><img src="' + this.imgUrl + '"></div>'), this.size = { height: this.$self.outerHeight(), width: this.$self.outerWidth() }, this.selfRatio = this.size.height / this.size.width, this.index = e } i.prototype.init = function () { this.$div = r('[data-bg-img="' + this.index + '"]').first(), this.$div.length < 1 && (this.$self.prepend(this.img), this.$div = r('[data-bg-img="' + this.index + '"]').first()), this.$img = this.$div.find("img").first(); var t = this.$img.height() / this.$img.width(), e = t < this.selfRatio ? "100%" : "auto", n = t < this.selfRatio ? "auto" : "100%"; "static" === this.$self.css("position") && this.$self.css("position", "relative"), this.$self.css({ background: "none !important" }), this.$div.css({ display: "block", width: "100%", height: this.size.height + "px", overflow: "hidden", "z-index": "0", position: "absolute", top: 0, left: 0 }), this.$img.css({ position: "absolute", top: 0, left: 0, "z-index": 0, height: e, width: n }) }, e.exports = i }, {}], 7: [function (t, e, n) { var r = window.jQuery, i = window.PX || {}; function o(t) { this.name = t, this.visible = !1, this.$trigger = r('[data-modal-trigger="' + t + '"]'), this.$modal = r('[data-modal="' + t + '"]') } o.prototype.init = function () { var t = this; r("[data-modal-overlay]").length < 1 && r(".wrapper").after('<div class="modal-overlay" data-modal-overlay data-state="hidden"></div>'), r("[data-modal-overlay], [data-modal-close]").on("click", function (e) { e.preventDefault(), t.close() }), this.$modal.attr("data-state", "hidden"), this.$trigger.on("click", function (e) { e.preventDefault(), t.open(this) }) }, o.prototype.open = function (t) { var e = r("[data-modal-overlay]").first(), n = this.$modal.find("a[href], button")[0]; this.$modal.attr("data-state", "visible"), e.attr("data-state", "visible"), this.$modal.data("open-trigger", t), this.visible = !0, i.support.IS_IE8 && e.parents().addClass("z").removeClass("z"), n && setTimeout(function () { n.focus() }, 10) }, o.prototype.close = function () { var t = r("[data-modal-overlay]").first(), e = this.$modal.data("open-trigger"); this.$modal.attr("data-state", "hidden"), t.attr("data-state", "hidden"), this.visible = !1, e && (setTimeout(function () { e.focus() }, 10), this.$modal.data("open-trigger", null)) }, e.exports = o }, {}], 8: [function (t, e, n) { var r = window.jQuery; function i(t) { this.self = t, this.selfTop = t.offset().top, this.selfHeight = t.height() } i.prototype.init = function () { var t = r("<div></div>").addClass("sticky-placeholder"), e = this; e.self.before(t), e.$placeholder = e.self.prev(".sticky-placeholder"), r(window).on("scrollStart", function (t, n) { n > e.selfTop && (e.self.attr("data-sticky", "true"), e.$placeholder.height(e.selfHeight)), n <= e.selfTop + 1 && (e.self.attr("data-sticky", "false"), e.$placeholder.height(0)) }) }, e.exports = i }, {}], 9: [function (t, e, n) { var r = window.jQuery, i = r("[data-sm-bg], [data-lg-bg]"), o = r(window).width(); function a(t) { this.$el = t, this.imgSrc = { sm: t.attr("data-sm-bg"), lg: t.attr("data-lg-bg") }, this.hasSmallImage = "string" == typeof this.imgSrc.sm && this.imgSrc.sm.length > 0, this.hasLargeImage = "string" == typeof this.imgSrc.lg && this.imgSrc.lg.length > 0, this.hasBothImages = this.hasSmallImage && this.hasLargeImage, this.hasNoImages = !this.hasSmallImage && !this.hasLargeImage, this.img } a.prototype.showCorrectImage = function () { if (o = r(window).width(), this.hasBothImages) this.img = o < 768 ? this.imgSrc.sm : this.imgSrc.lg; else if (this.hasSmallImage) this.img = this.imgSrc.sm; else { if (!this.hasLargeImage) return !1; this.img = this.imgSrc.lg } void 0 !== this.img && this.img.length && this.$el.css({ "background-image": "url(" + this.img + ")" }) }, a.prototype.init = function () { var t = this; t.showCorrectImage(), r(window).on("resizeStop", function () { t.showCorrectImage() }) }, e.exports.init = function () { i.length && i.each(function () { new a(r(this)).init() }) } }, {}], 10: [function (t, e, n) { var r = window.jQuery, i = window.PX || {}, o = t("./classes/modal.js"), a = t("./classes/follow-box.js"), s = t("./classes/ie-bg-image.js"), l = t("./classes/sticky.js"); n.init = function () { var t, e; r(window).trigger("Scripts/Formatting"), r("[data-equal-height]").each(function () { var t = r(this), e = t.children(), n = 0; e.each(function () { var t = r(this); t.height() > n && (n = t.height()) }), e.each(function () { r(this).height(n) }) }), (t = r(".follow-box")).length > 0 && t.each(function () { var t = new a(r(this)); t.init() }), r("[data-sticky]").each(function () { var t = r(this), e = new l(t); e.init() }), (e = r("[data-modal]")).length > 0 && e.each(function () { var t = r(this).data("modal"), e = new o(t); e.init() }), i.bodyTop = 0, r(window).on("Body-Prevent-Scroll", function () { i.bodyTop = r("body").scrollTop(), r("body").css({ overflow: "hidden", position: "fixed" }), r(".wrapper").css({ top: -i.bodyTop }) }), r(window).on("Body-Resume-Scroll", function () { r(".wrapper").removeAttr("style"), r("body").removeAttr("style").scrollTop(i.bodyTop) }), function () { if (i.support.IS_MOBILE) { var t = r("body"); r(document).on("focus", "input, textarea", function () { t.addClass("mobile-input-focused") }), r(document).on("blur", "input, textarea", function () { t.removeClass("mobile-input-focused") }) } }(), i.support.IS_IE8 && r("[data-bg-cover]").each(function (t) { var e = r(this), n = new s(e, t); n.init() }) } }, { "./classes/follow-box.js": 5, "./classes/ie-bg-image.js": 6, "./classes/modal.js": 7, "./classes/sticky.js": 8 }], 11: [function (t, e, n) { var r = window.jQuery; function i(t, e, n, r) { (r = r || !1) && r(), dataLayer.push({ event: "gaEvent", "ga.category": t, "ga.action": e, "ga.label": n }) } n.init = function () { var t; (t = r("[data-ga-event-view-item]").first()).length > 0 && i("Menu", "ViewItem", t.attr("data-ga-event-view-item")), r("[data-ga-event-menu]").on("click", function (t) { t.preventDefault(); var e = r(this).attr("data-ga-event-menu"), n = r(this).is("a") ? r(this).attr("href") : r(this).find("a").attr("href"); i("Menu", "Menu-Clicked", e, function () { window.location.href = n }) }), r(".side-nav .submenu a").on("click", function (t) { t.preventDefault(); var e = r(this).html(), n = r(this).attr("href"); i("SubNav", "SubNav-Clicked", e, function () { window.location.href = n }) }) }, n.track = i }, {}], 12: [function (t, e, n) { function r(t) { for (var e = t.split("&"), n = {}, r = 0; r < e.length; r++) { var i = e[r].split("="); i.length > 1 && (n[i[0]] = i[1]) } return n } e.exports = { set: function (t, e, n, r, i) { t = t || !1, e = e || !1; var o = (i = i || !1) ? "domain=" + i : "", a = (r = r || !1) ? "path=" + r : "path=/", s = ""; if (n = n || !1) { var l = new Date; l.setTime(l.getTime() + 24 * n * 60 * 60 * 1e3), s = "expires=" + l.toUTCString() } document.cookie = t + "=" + e + ";" + o + ";" + a + ";" + s }, get: function (t) { for (var e = t + "=", n = document.cookie.split(";"), i = 0; i < n.length; i++) { for (var o = n[i]; " " === o.charAt(0);)o = o.substring(1); if (0 === o.indexOf(e)) { var a = o.substring(e.length, o.length); return a.split("&").length > 1 ? r(a) : a } } return "" } } }, {}], 13: [function (t, e, n) { var r = window.jQuery, i = t("../settings"), o = ["Geo/Started", "Geo/Updated", "Geo/GotFromGeoLocCookie", "Geo/NotSupported", "Geo/Error", "Locations/GoogleCallback", "Locations/CreatingElements", "Locations/AddingElementsDesktop", "Locations/AddingElementsMobile", "Locations/GetStoresByLocation", "Locations/GetStoresByQuery", "Locations/SetupMap", "Scripts/Loaded", "Scripts/Started", "Scripts/Setup", "Scripts/Formatting", "Scripts/Behavior", "Scripts/Locations", "FavoritePanda/SetupStarted", "FavoritePanda/PXfavorite", "FavoritePanda/PXclosest", "FavoritePanda/PXlocal", "FavoritePanda/Endpoint", "Nutrition/GetCurrentCart", "Nutrition/GetCurrentPageItems", "Nutrition/GetAllItems", "Nutrition/GetAllItemsFromCache", "Nutrition/ItemAdded", "Nutrition/ItemRemoved", "Nutrition/CartCleared"].join(" "); e.exports = { init: function () { r(window).on(o, function (t) { (i.debug || PX.debug) && window.console && console.log && window.console.log(t.type) }) } } }, { "../settings": 26 }], 14: [function (t, e, n) { var r = window.jQuery, i = t("./cookie.js"), o = { maximumAge: 432e5, timeout: 5e3 }, a = i.get("geoloc"), s = a && a.hasOwnProperty("lat") && a.hasOwnProperty("lng") && a.lat.length > 0 && a.lng.length > 0; function l() { -1 != window.location.href.indexOf("userlocation") && (window.location.href.length > 50 || (r(window).trigger("Geo/Started"), s ? r(window).trigger("Geo/GotFromGeoLocCookie", a) : navigator.geolocation ? navigator.geolocation.getCurrentPosition(u, c, o) : (i.set("geoloc", "lat=&lng="), r(window).trigger("Geo/NotSupported")))) } function u(t) { i.set("geoloc", "lat=" + t.coords.latitude + "&lng=" + t.coords.longitude, 1), a = i.get("geoloc"), r(window).trigger("Geo/Updated", a) } function c() { i.set("geoloc", "lat=&lng="), r(window).trigger("Geo/Error") } window.addEventListener("load", l), e.exports = { init: l } }, { "./cookie.js": 12 }], 15: [function (t, e, n) { var r = function () { try { return window.localStorage.setItem("foo", "bar"), window.localStorage.removeItem("foo"), !0 } catch (t) { return !1 } }(), i = { get: function (t) { return !(!r || !window.localStorage.getItem(t)) && ("undefined" !== window.localStorage.getItem(t) && JSON.parse(window.localStorage.getItem(t))) }, set: function (t, e) { r && "undefined" !== e && window.localStorage.setItem(t, JSON.stringify(e)) } }; e.exports = i }, {}], 16: [function (t, e, n) { e.exports = { getParameterByName: function (t, e) { e || (e = window.location.href), t = t.replace(/[\[\]]/g, "\\$&"); var n = new RegExp("[?&]" + t + "(=([^&#]*)|&|#|$)", "i").exec(e); return n ? n[2] ? decodeURIComponent(n[2].replace(/\+/g, " ")) : "" : null } } }, {}], 17: [function (t, e, n) { var r, i = window.jQuery, o = window.PX || {}, a = t("lodash"); function s() { var t = i(window).scrollTop(); i(window).trigger("scrollStart", [t]), clearTimeout(r), r = setTimeout(function () { var t = i(window).scrollTop(); i(window).trigger("scrollStop", [t]) }, 250) } function l() { i(window).trigger("resizeStart"), clearTimeout(r), r = setTimeout(function () { i(window).trigger("resizeStop") }, 250) } e.exports = { init: function () { o.support.IS_IE8 ? (i(window).on("scroll", s), i(window).on("resize", l)) : (i(window).on("scroll", a.debounce(s, 100, { leading: !0, maxWait: 100, trailing: !0 })), i(window).on("resize", a.debounce(l, 100, { leading: !0, maxWait: 200, trailing: !0 }))) } } }, { lodash: 2 }], 18: [function (t, e, n) { var r = window.jQuery, i = t("../settings.js"); e.exports = { byLocation: function (t, e, n, o, a) { n = n || i.locations.limit, r(window).trigger("Locations/GetStoresByLocation"); var s = r.Deferred(); return t && e ? r.ajax({ method: "GET", timeout: 2e4, dataType: "json", cache: !0, url: i.locations.endPoints.storesByLocation + "?lat=" + t + "&lng=" + e + "&desiredDistance=25&maxDistance=50&page=" + a + "&limit=" + n + "&hours=true&filters=" + JSON.stringify(o) }).success(function (t) { s.resolve(t) }).error(function (t) { s.reject(t) }) : s.reject([]), s.promise() }, byQuery: function (t, e, n, o, a, s) { var l = r("input[name=__RequestVerificationToken]").val(); r(window).trigger("Locations/GetStoresByQuery"); var u = r.Deferred(); return e ? r.ajax({ method: "GET", timeout: 2e4, dataType: "json", cache: !0, headers: { __RequestVerificationToken: l }, url: i.locations.endPoints.storesByQuery + "?searchType=" + t + "&query=" + e + "&desiredDistance=25&maxDistance=50&pagets=" + n + "&page=" + a + "&limit=" + i.locations.limit + "&hours=true&filters=" + JSON.stringify(o) }).success(function (t) { u.resolve(t) }).error(function (t) { u.reject(t) }) : u.reject([]), u.promise() }, byStoreId: function (t) { t = t || !1, r(window).trigger("Locations/GetStoresByQuery"); var e = r.Deferred(); return t ? r.ajax({ method: "GET", timeout: 5e3, dataType: "json", cache: !0, url: i.locations.endPoints.storeById + "?storeId=" + t }).success(function (t) { e.resolve(t) }).error(function (t) { e.reject(t) }) : e.reject([]), e.promise() } } }, { "../settings.js": 26 }], 19: [function (t, e, n) { function r(t) { t = t || {}, google.maps.OverlayView.apply(this, arguments), this.content_ = t.content || "", this.disableAutoPan_ = t.disableAutoPan || !1, this.maxWidth_ = t.maxWidth || 0, this.pixelOffset_ = t.pixelOffset || new google.maps.Size(0, 0), this.position_ = t.position || new google.maps.LatLng(0, 0), this.zIndex_ = t.zIndex || null, this.boxClass_ = t.boxClass || "infoBox", this.boxStyle_ = t.boxStyle || {}, this.closeBoxMargin_ = t.closeBoxMargin || "2px", this.closeBoxURL_ = t.closeBoxURL || "http://www.google.com/intl/en_us/mapfiles/close.gif", "" === t.closeBoxURL && (this.closeBoxURL_ = ""), this.infoBoxClearance_ = t.infoBoxClearance || new google.maps.Size(1, 1), this.isHidden_ = t.isHidden || !1, this.alignBottom_ = t.alignBottom || !1, this.pane_ = t.pane || "floatPane", this.enableEventPropagation_ = t.enableEventPropagation || !1, this.div_ = null, this.closeListener_ = null, this.eventListener1_ = null, this.eventListener2_ = null, this.eventListener3_ = null, this.moveListener_ = null, this.contextListener_ = null, this.fixedWidthSet_ = null } r.prototype = new google.maps.OverlayView, r.prototype.createInfoBoxDiv_ = function () { var t, e = this, n = function (t) { t.cancelBubble = !0, t.stopPropagation && t.stopPropagation() }; this.div_ || (this.div_ = document.createElement("div"), this.setBoxStyle_(), void 0 === this.content_.nodeType ? this.div_.innerHTML = this.getCloseBoxImg_() + this.content_ : (this.div_.innerHTML = this.getCloseBoxImg_(), this.div_.appendChild(this.content_)), this.getPanes()[this.pane_].appendChild(this.div_), this.addClickHandler_(), this.div_.style.width ? this.fixedWidthSet_ = !0 : 0 !== this.maxWidth_ && this.div_.offsetWidth > this.maxWidth_ ? (this.div_.style.width = this.maxWidth_, this.div_.style.overflow = "auto", this.fixedWidthSet_ = !0) : (t = this.getBoxWidths_(), this.div_.style.width = this.div_.offsetWidth - t.left - t.right + "px", this.fixedWidthSet_ = !1), this.panBox_(this.disableAutoPan_), this.enableEventPropagation_ || (this.eventListener1_ = google.maps.event.addDomListener(this.div_, "mousedown", n), this.eventListener2_ = google.maps.event.addDomListener(this.div_, "click", n), this.eventListener3_ = google.maps.event.addDomListener(this.div_, "dblclick", n), this.eventListener4_ = google.maps.event.addDomListener(this.div_, "mouseover", function (t) { this.style.cursor = "default" })), this.contextListener_ = google.maps.event.addDomListener(this.div_, "contextmenu", function (t) { t.returnValue = !1, t.preventDefault && t.preventDefault(), e.enableEventPropagation_ || n(t) }), google.maps.event.trigger(this, "domready")) }, r.prototype.getCloseBoxImg_ = function () { var t = ""; return "" !== this.closeBoxURL_ && (t = "<img", t += " src='" + this.closeBoxURL_ + "'", t += " align=right", t += " style='", t += " position: relative;", t += " cursor: pointer;", t += " margin: " + this.closeBoxMargin_ + ";", t += "'>"), t }, r.prototype.addClickHandler_ = function () { var t; "" !== this.closeBoxURL_ ? (t = this.div_.firstChild, this.closeListener_ = google.maps.event.addDomListener(t, "click", this.getCloseClickHandler_())) : this.closeListener_ = null }, r.prototype.getCloseClickHandler_ = function () { var t = this; return function (e) { e.cancelBubble = !0, e.stopPropagation && e.stopPropagation(), t.close(), google.maps.event.trigger(t, "closeclick") } }, r.prototype.panBox_ = function (t) { var e, n = 0, r = 0; if (!t && (e = this.getMap()) instanceof google.maps.Map) { e.getBounds().contains(this.position_) || e.setCenter(this.position_), e.getBounds(); var i = e.getDiv(), o = i.offsetWidth, a = i.offsetHeight, s = this.pixelOffset_.width, l = this.pixelOffset_.height, u = this.div_.offsetWidth, c = this.div_.offsetHeight, f = this.infoBoxClearance_.width, d = this.infoBoxClearance_.height, p = this.getProjection().fromLatLngToContainerPixel(this.position_); if (p.x < -s + f ? n = p.x + s - f : p.x + u + s + f > o && (n = p.x + u + s + f - o), this.alignBottom_ ? p.y < -l + d + c ? r = p.y + l - d - c : p.y + l + d > a && (r = p.y + l + d - a) : p.y < -l + d ? r = p.y + l - d : p.y + c + l + d > a && (r = p.y + c + l + d - a), 0 !== n || 0 !== r) { e.getCenter(); e.panBy(n, r) } } }, r.prototype.setBoxStyle_ = function () { var t, e; if (this.div_) { for (t in this.div_.className = this.boxClass_, this.div_.style.cssText = "", e = this.boxStyle_) e.hasOwnProperty(t) && (this.div_.style[t] = e[t]); void 0 !== this.div_.style.opacity && "" !== this.div_.style.opacity && (this.div_.style.filter = "alpha(opacity=" + 100 * this.div_.style.opacity + ")"), this.div_.style.position = "absolute", this.div_.style.visibility = "hidden", null !== this.zIndex_ && (this.div_.style.zIndex = this.zIndex_) } }, r.prototype.getBoxWidths_ = function () { var t, e = { top: 0, bottom: 0, left: 0, right: 0 }, n = this.div_; return document.defaultView && document.defaultView.getComputedStyle ? (t = n.ownerDocument.defaultView.getComputedStyle(n, "")) && (e.top = parseInt(t.borderTopWidth, 10) || 0, e.bottom = parseInt(t.borderBottomWidth, 10) || 0, e.left = parseInt(t.borderLeftWidth, 10) || 0, e.right = parseInt(t.borderRightWidth, 10) || 0) : document.documentElement.currentStyle && n.currentStyle && (e.top = parseInt(n.currentStyle.borderTopWidth, 10) || 0, e.bottom = parseInt(n.currentStyle.borderBottomWidth, 10) || 0, e.left = parseInt(n.currentStyle.borderLeftWidth, 10) || 0, e.right = parseInt(n.currentStyle.borderRightWidth, 10) || 0), e }, r.prototype.onRemove = function () { this.div_ && (this.div_.parentNode.removeChild(this.div_), this.div_ = null) }, r.prototype.draw = function () { this.createInfoBoxDiv_(); var t = this.getProjection().fromLatLngToDivPixel(this.position_); this.div_.style.left = t.x + this.pixelOffset_.width + "px", this.alignBottom_ ? this.div_.style.bottom = -(t.y + this.pixelOffset_.height) + "px" : this.div_.style.top = t.y + this.pixelOffset_.height + "px", this.isHidden_ ? this.div_.style.visibility = "hidden" : this.div_.style.visibility = "visible" }, r.prototype.setOptions = function (t) { void 0 !== t.boxClass && (this.boxClass_ = t.boxClass, this.setBoxStyle_()), void 0 !== t.boxStyle && (this.boxStyle_ = t.boxStyle, this.setBoxStyle_()), void 0 !== t.content && this.setContent(t.content), void 0 !== t.disableAutoPan && (this.disableAutoPan_ = t.disableAutoPan), void 0 !== t.maxWidth && (this.maxWidth_ = t.maxWidth), void 0 !== t.pixelOffset && (this.pixelOffset_ = t.pixelOffset), void 0 !== t.alignBottom && (this.alignBottom_ = t.alignBottom), void 0 !== t.position && this.setPosition(t.position), void 0 !== t.zIndex && this.setZIndex(t.zIndex), void 0 !== t.closeBoxMargin && (this.closeBoxMargin_ = t.closeBoxMargin), void 0 !== t.closeBoxURL && (this.closeBoxURL_ = t.closeBoxURL), void 0 !== t.infoBoxClearance && (this.infoBoxClearance_ = t.infoBoxClearance), void 0 !== t.isHidden && (this.isHidden_ = t.isHidden), void 0 !== t.enableEventPropagation && (this.enableEventPropagation_ = t.enableEventPropagation), this.div_ && this.draw() }, r.prototype.setContent = function (t) { this.content_ = t, this.div_ && (this.closeListener_ && (google.maps.event.removeListener(this.closeListener_), this.closeListener_ = null), this.fixedWidthSet_ || (this.div_.style.width = ""), void 0 === t.nodeType ? this.div_.innerHTML = this.getCloseBoxImg_() + t : (this.div_.innerHTML = this.getCloseBoxImg_(), this.div_.appendChild(t)), this.fixedWidthSet_ || (this.div_.style.width = this.div_.offsetWidth + "px", void 0 === t.nodeType ? this.div_.innerHTML = this.getCloseBoxImg_() + t : (this.div_.innerHTML = this.getCloseBoxImg_(), this.div_.appendChild(t))), this.addClickHandler_()), google.maps.event.trigger(this, "content_changed") }, r.prototype.setPosition = function (t) { this.position_ = t, this.div_ && this.draw(), google.maps.event.trigger(this, "position_changed") }, r.prototype.setZIndex = function (t) { this.zIndex_ = t, this.div_ && (this.div_.style.zIndex = t), google.maps.event.trigger(this, "zindex_changed") }, r.prototype.getContent = function () { return this.content_ }, r.prototype.getPosition = function () { return this.position_ }, r.prototype.getZIndex = function () { return this.zIndex_ }, r.prototype.show = function () { this.isHidden_ = !1, this.div_ && (this.div_.style.visibility = "visible") }, r.prototype.hide = function () { this.isHidden_ = !0, this.div_ && (this.div_.style.visibility = "hidden") }, r.prototype.open = function (t, e) { var n = this; e && (this.position_ = e.getPosition(), this.moveListener_ = google.maps.event.addListener(e, "position_changed", function () { n.setPosition(this.getPosition()) })), this.setMap(t), this.div_ && this.panBox_() }, r.prototype.close = function () { this.closeListener_ && (google.maps.event.removeListener(this.closeListener_), this.closeListener_ = null), this.eventListener1_ && (google.maps.event.removeListener(this.eventListener1_), google.maps.event.removeListener(this.eventListener2_), google.maps.event.removeListener(this.eventListener3_), google.maps.event.removeListener(this.eventListener4_), this.eventListener1_ = null, this.eventListener2_ = null, this.eventListener3_ = null, this.eventListener4_ = null), this.moveListener_ && (google.maps.event.removeListener(this.moveListener_), this.moveListener_ = null), this.contextListener_ && (google.maps.event.removeListener(this.contextListener_), this.contextListener_ = null), this.setMap(null) }, e.exports = r }, {}], 20: [function (t, e, n) { var r = window.jQuery, i = window.PX || {}, o = t("../settings.js"), a = t("../helpers/cookie.js"), s = t("../helpers/querystring.js"), l = t("./templates.js"), u = t("./ajax-stores.js"), c = t("../helpers/local-storage.js"), f = t("lodash"), d = o.googleMaps.ApiKey, p = r(".location-map").length > 0, h = window.google || {}, v = a.get("loc"), g = { driveThru: !0, orderOnline: !0, teaBar: !0, saladsWraps: !0 }, m = {}, y = decodeURIComponent(location.hash.substring(1, location.hash.length).replace(/\+/g, " ")), b = {}, w = [], x = {}; function _() { !function () { var t = s.getParameterByName("filter"); if (null == t || "" == t) return; for (var e = !1, n = t.split(","), i = 0; i < n.length; i++) { var o = r('[data-filter="' + n[i] + '"]').first(); o.length > 0 && (e = !0), o.prop("checked", !0) } if (e) { r(".toggle-location-filters").attr("data-state", "open"), r(".location-filters").attr("data-state", "open") } }(), y.length > 0 && r(".location-search input.search").val(y), j(), function () { r(".toggle-location-filters").on("click", function () { var t = "open" === r(".location-filters").attr("data-state") ? "closed" : "open"; r(this).attr("data-state", t), r(".location-filters").attr("data-state", t) }), i.support.IS_IE8 || (r(".location-filters .filter").on("click", function (t) { var e = r(this).find("input"); e.trigger("click") }), r(".location-filters .filter label").on("click", function (t) { t.preventDefault(), t.stopPropagation() }), r(".location-filters .filter input").on("click", function (t) { t.stopPropagation() })); r('.location-filters input[type="checkbox"]').on("change", function (t) { t.preventDefault(), j() }) }(), r(".location-search").on("submit", function (t) { t.preventDefault(); var e = r(this), n = e.find("input.search").val(); g.driveThru = m.$driveThru.prop("checked"), g.orderOnline = m.$orderOnline.prop("checked"), g.teaBar = m.$teaBar.prop("checked"), g.saladsWraps = m.$saladsWraps.prop("checked"); var i = r("input[name='search-type']:checked").val(), o = r("#page-ts").val(); C(i, n, o, g, 0) }), r(".toggle-panel").on("click", function (t) { t.preventDefault(); var e = r(this), n = r(this).closest(".location-panel"), i = "open" === n.attr("data-state") ? "closed" : "open", o = "open" === n.attr("data-state") ? "Show" : "Hide", a = b.map.getZoom(); n.attr("data-state", i), e.html(o), h.maps.event.trigger(b.map, "resize"), setTimeout(function () { b.map.setZoom(a), h.maps.event.trigger(b.map, "resize"), b.map.fitBounds(b.mapBounds) }, 50), r(window).on("resizeStop", function () { var t = r(window).width(); (t > 1024 || t < 768) && (n.attr("data-state", "open"), e.html("Hide")) }) }), r(".location-search-pagination").on("click", "button.pagination", function (t) { t.preventDefault(); var e = r(this).attr("data-page"), n = r(".location-search"), o = n.find("input.search").val(), a = r("#page-ts").val(); g.driveThru = m.$driveThru.prop("checked"), g.orderOnline = m.$orderOnline.prop("checked"), g.teaBar = m.$teaBar.prop("checked"), g.saladsWraps = m.$saladsWraps.prop("checked"); var s = r("input[name='search-type']:checked").val(); i.IsGeoQuery ? k(g, e) : C(s, o, a, g, e) }), r(window).on("Geo/Updated", function () { k(void 0, 0) }) } function C(t, e, n, r, o) { N(), i.IsGeoQuery = !1; var a = u.byQuery(t, e, n, r, o); a.done(function (t) { 1 != t.CharactersError ? (B(t.List), H(), I(t.PageInfo)) : O("character-error") }), a.fail(function () { O() }) } function S(t) { r("input:radio[name=search-type]").filter("[value=" + t + "]").prop("checked", !0) } function k(t, e) { var n, r, s = a.get("geoloc"), l = a.get("loc"), c = "" === s || "" === s.lat ? l : s; i.IsGeoQuery = !0, c && c.hasOwnProperty("lat") && c.hasOwnProperty("lng") && c.lat.length > 0 && c.lng.length > 0 ? (r = c.lng, n = c.lat) : (r = o.locations.defaultLong, n = o.locations.defaultLat), N(); var f = u.byLocation(n, r, o.locations.limit, t, e); f.done(function (t) { B(t.List), H(), I(t.PageInfo) }), f.fail(function () { O() }) } function T(t) { t = t || !1, h.maps ? (f.forEach(w, function (t) { t.infobox.close(), t.$card.removeClass("active") }), t && b.map.fitBounds(b.mapBounds)) : (r(".location-map-popup").attr("data-state", "closed"), setTimeout(function () { r(".location-map-popup").remove() }, 300), r("body").removeClass("no-scroll")) } function j() { var t = function (t) { for (var e = window.location.search.substring(1).split("&"), n = 0; n < e.length; n++) { var r = e[n].split("="); if (r[0] == t) return r[1] } }("stype"); void 0 === t ? t = r("input[name='search-type']:checked").val() : S(t), m.$driveThru = r('[data-filter="drive-thru"]').first(), m.$orderOnline = r('[data-filter="order-online"]').first(), m.$teaBar = r('[data-filter="tea-bar"]').first(), m.$saladsWraps = r('[data-filter="salads-wraps"]').first(), g.driveThru = m.$driveThru.prop("checked"), g.orderOnline = m.$orderOnline.prop("checked"), g.teaBar = m.$teaBar.prop("checked"), g.saladsWraps = m.$saladsWraps.prop("checked"); var e = r(".location-search input.search").val(), n = r("#page-ts").val(); e ? C(t, e, n, g, 0) : k(g, 0) } function I(t) { if (w && !(w.length < 1)) { var e = t.PageNumber, n = t.PageCount; r(".location-search-pagination").removeClass("hidden"), r(".location-search-pagination .current-page").val(e); var i = ""; e - 3 > 0 && (i += E(1, 0, !1), i += '<span class="ellipses"> ... </span>'), e - 2 > 0 && (i += E(e - 2, e - 3, !1)), e - 1 > 0 && (i += E(e - 1, e - 2, !1)), i += E(e, e - 1, !0), e + 1 <= n && (i += E(e + 1, e, !1)), e + 2 <= n && (i += E(e + 2, e + 1, !1)), e + 3 < n && (i += '<span class="ellipses"> ... </span>', i += E(n, n - 1, !1)), r(".location-search-pagination .pages").html(i), t.IsFirstPage ? r(".location-search-pagination .prev").prop("disabled", !0) : (r(".location-search-pagination .prev").prop("disabled", !1), r(".location-search-pagination .prev").attr("data-page", e - 2)), t.IsLastPage ? r(".location-search-pagination .next").prop("disabled", !0) : (r(".location-search-pagination .next").prop("disabled", !1), r(".location-search-pagination .next").attr("data-page", e)) } } function E(t, e, n) { var r = '<button data-page="' + e + '"', i = "pagination"; return n && (r += " disabled ", i += " active"), r = r + 'class="' + i + '">' + t + "</button>" } function L(t) { switch (t) { case "suggest": r(".location-message.suggest").attr("data-state", "visible").attr("aria-hidden", "false"); break; case "nomatch": r(".location-message.no-match").attr("data-state", "visible").attr("aria-hidden", "false"); break; case "error": r(".location-message.error").attr("data-state", "visible").attr("aria-hidden", "false"); break; case "character-error": r(".location-message.character-error").attr("data-state", "visible").attr("aria-hidden", "false") } } function A() { T(), h.maps && (f.forEach(w, function (t) { t.marker.setMap(null) }), b.mapBounds = new h.maps.LatLngBounds), w.length = 0 } function N() { P(), r(".location-search-pagination").addClass("hidden"), r(".location-cards").html('<div class="location-message"><h4 class="message-title loading">Loading..</h4></div>') } function D() { f.forEach(function (t) { t.$card = t.$card.detach() }), r(".location-cards").empty() } function P() { r(".location-message").attr("data-state", "hidden").attr("aria-hidden", "true") } function O(t) { t = t || "error", A(), D(), P(), L(t) } function B(t, e) { r(window).trigger("Locations/CreatingElements"), (e = e || !1) || (i.currentStores.length = 0, i.currentStores = t), A(), "object" == typeof t && t.length > 0 && (h.maps ? f.forEach(t, function (t, e) { var n = { store: t, marker: new h.maps.Marker({ position: new h.maps.LatLng(t.Latitude, t.Longitude), map: b.map, title: t.Name, animation: h.maps.Animation.DROP, icon: t.TempClose ? b.closedIcon : b.icon }), infobox: function (t, e) { var n = l.infoWindow(t, e); return new x({ content: n, alignBottom: !0, disableAutoPan: !1, maxWidth: 0, pixelOffset: new h.maps.Size(-130, -60), closeBoxMargin: "", closeBoxURL: "", infoBoxClearance: new h.maps.Size(40, 40), isHidden: !1, pane: "floatPane", enableEventPropagation: !1 }) }(t, e), $card: r(l.locCard(t)), active: !0 }; w.push(n) }) : f.forEach(t, function (t, e) { var n = r(l.locCard(t)), i = { store: t, marker: !1, $infobox: r(l.infoWindow(t, e, "mobile")), $card: n, active: !0 }; w.push(i) })) } function H() { if (D(), T(), P(), !w || w.length < 1) L("suggest"); else { var t = !1; f.forEach(w, function (e) { e.active && (t = !0) }), t ? h.maps && (b.mapBounds = new h.maps.LatLngBounds) : L("nomatch"), h.maps ? (r(window).trigger("Locations/AddingElementsDesktop"), f.forEach(w, function (t) { t.active ? (h.maps.event.addListener(t.marker, "click", function () { T(), t.$card.addClass("active"), t.infobox.open(b.map, t.marker) }), t.$card.on("click focus", function () { T(), r(this).addClass("active"), t.infobox.open(b.map, t.marker) }), r(".location-cards").append(t.$card), t.marker.setMap(b.map), b.mapBounds.extend(t.marker.position)) : t.marker.setMap(null) }), b.map.fitBounds(b.mapBounds)) : (r(window).trigger("Locations/AddingElementsMobile"), f.forEach(w, function (t) { t.active && (t.$card.on("click", function () { r(".wrapper").append(t.$infobox), r(".location-map-popup").attr("data-state", "open") }), r(".location-cards").append(t.$card)) })) } } i.currentStores = [], i.IsGeoQuery = !1, r("#location-query").keyup(function () { S(function (t) { var e = /^\d{5}(-\d{4})?$/.test(t), n = /^[A-Za-z- ]+,[ ]?[A-Za-z]{2}$/.test(t); if ("" === t) return "zip"; if (e) return "zip"; return n ? "community" : "address" }(r("#location-query").val())) }), e.exports = { init: function () { var t; r(window).trigger("Scripts/Locations"), p && (i.support.IS_MOBILE ? _() : ((t = document.createElement("script")).type = "text/javascript", t.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&key=" + d + "&callback=PX.locations.callbackInit", document.body.appendChild(t)), v = !("object" != typeof v || !v.lat || !v.lng) && v) }, callbackInit: function () { r(window).trigger("Locations/GoogleCallback"), r(window).trigger("Locations/SetupMap"), h = window.google, x = t("./infobox.js"), b.icon = { url: o.googleMaps.mapIcon, size: new h.maps.Size(68, 92), scaledSize: new h.maps.Size(34, 46), origin: new h.maps.Point(0, 0), anchor: new h.maps.Point(17, 46) }, b.closedIcon = { url: o.googleMaps.mapIconClosed, size: new h.maps.Size(68, 92), scaledSize: new h.maps.Size(34, 46), origin: new h.maps.Point(0, 0), anchor: new h.maps.Point(17, 46) }, b.mapOptions = { zoom: 11, center: new h.maps.LatLng(0, 0), mapTypeId: h.maps.MapTypeId.ROADMAP, styles: o.googleMaps.styles, disableDefaultUI: !0, zoomControl: !0, zoomControlOptions: { style: h.maps.ZoomControlStyle.SMALL, position: h.maps.ControlPosition.RIGHT_TOP } }, b.mapBounds = new h.maps.LatLngBounds, b.map = new h.maps.Map(document.querySelector(".location-map"), b.mapOptions), _() }, closeBoxes: T, setFavoritePanda: function (t) { var e = a.get("pxfav").toString() === t.toString() ? "0" : t; if (a.set("pxfav", e, 180), i.favoriteId = e, p) { var n = !1, o = f.filter(i.currentStores, function (r, i) { return n || r.Id !== t || (n = i), r.Id === e }); i.favorite = !!e && o[0], c.set("pxfavstore", i.favorite), function (t, e) { h.maps ? (T(), i.support.IS_IE8 ? (B(i.currentStores, !0), H(), w[e].infobox.open(b.map, w[e].marker)) : (f.forEach(w, function (e) { var n = r(e.infobox.content_), i = n.find(".star"); e.store.Id.toString() === t.toString() ? i.addClass("favorite") : i.removeClass("favorite"); var o = n.prop("outerHTML"); e.infobox.content_ = o }), e >= 0 && w[e].infobox.open(b.map, w[e].marker))) : f.forEach(w, function (e) { var n = e.$infobox.find(".star"); e.store.Id.toString() === t.toString() ? n.addClass("favorite") : n.removeClass("favorite") }) }(e, n) } else i.closest && i.closest.Id.toString() === e.toString() ? (i.favorite = i.closest, c.set("pxfavstore", i.favorite)) : (i.favorite = !1, c.set("pxfavstore", i.favorite)); r(window).trigger("Favorite-Panda-Updated") } } }, { "../helpers/cookie.js": 12, "../helpers/local-storage.js": 15, "../helpers/querystring.js": 16, "../settings.js": 26, "./ajax-stores.js": 18, "./infobox.js": 19, "./templates.js": 21, lodash: 2 }], 21: [function (t, e, n) { var r = t("../helpers/cookie.js"), i = t("lodash"), o = t("../settings.js"); function a(t) { return t.Phone ? t.Phone.replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3") : "" } i.templateSettings.interpolate = /{{([\s\S]+?)}}/g, e.exports = { locCard: function (t) { if (void 0 === t) return !1; var e, n = t.Distance ? Math.floor(10 * t.Distance) / 10 : "", r = t.DriveThrough ? '<span class="px-car" role="listitem">Drive Thru</span>' : "", a = t.TeaBar ? '<span class="px-boba" role="listitem">Tea Bar</span>' : "", s = t.SaladsAndWraps ? '<span class="px-wrap" role="listitem">Salads and Wraps</span>' : "", l = t.OnlineOrder ? '<a class="order-now" href="' + o.locations.onlineOrderUrl + '" target="_blank" role="listitem">Order Now</a>' : "", u = t.Phone ? t.Phone.replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3") : "", c = t.Fax ? t.Fax.replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3") : "", f = "Panda Express,+" + t.Address.split(" ").join("+"), d = (new Date).getDay(), p = t.OperationalHours.Normal.Hours, h = $.map(p, function (t, e) { return [t] }), v = h.length > 0 ? h[d].StartTime : "CLOSE", g = h.length > 0 ? h[d].EndTime : "CLOSE", m = t.Address.replace(/[^A-Za-z0-9 -]/g, ""), y = t.City.replace(/[^A-Za-z0-9 -]/g, ""); return m = m.split(" ").join("-").split("--").join("-"), y = y.split(" ").join("-").split("--").join("-"), e = "CLOSE" === v ? "CLOSED" : v + " - " + g, i.template('<div class="location-list-card" tabindex="0"><span class="name">{{Name}}</span><span class="distance">' + n + 'Mi</span><span class="address">{{ Address }}<br>{{ City }}, {{State}} {{ Zip }}<span class="features" aria-label="Features at this location" role="list">' + r + a + s + "</span></span>" + (t.TempClose ? '<a href="https://www.pandaexpress.com/forourPandafamily" style="padding-left: 0" class="fundraising">Temporarily Closed</a>' : l + '<a href="' + o.locations.fundraiserUrl + '" class="fundraising">Fundraising</a><a target="_blank" href="https://maps.google.com/maps?daddr=' + f + '" class="directions">Directions</a><a href="/userlocation/' + t.Id.toString() + "/" + t.State.toString() + "/" + y + "/" + m + '" class="directions">More info</a>') + '<div style="display: none;"><span aria-label="Phone Number">' + u + '</span><span aria-label="Fax Number">' + c + '</span><span aria-label="Open Today">' + e + "</span></div></div>")(t) }, infoWindow: function (t, e, n) { if (n = n || !1, void 0 === t) return !1; var s, l = t.Directions && t.Directions.length > 0 ? '<span class="cross-streets">{{Directions}}</span>' : "", u = t.DriveThrough ? '<span class="px-car">Drive Thru</span>' : "", c = t.TeaBar ? '<span class="px-boba">Tea Bar</span>' : "", f = t.SaladsAndWraps ? '<span class="px-wrap">Salads and Wraps</span>' : "", d = t.OnlineOrder ? '<a href="' + o.locations.onlineOrderUrl + '" target="_blank" class="order-now">Order Now</a>' : "", p = t.OnlineOrder ? "" : "Call us to order ahead", h = a(t), v = t.Fax ? t.Fax.replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3") : "", g = t.Id.toString() === r.get("pxfav").toString() ? "favorite" : "", m = t.Id.toString() === r.get("pxfav").toString() ? "Remove My Panda" : "Save as My Panda", y = "Panda Express,+" + t.Address.split(" ").join("+"), b = (new Date).getDay(), w = t.OperationalHours.Normal.Hours, x = $.map(w, function (t, e) { return [t] }), _ = x.length > 0 ? x[b].StartTime : "CLOSE", C = x.length > 0 ? x[b].EndTime : "CLOSE"; s = "CLOSE" === _ ? "CLOSED" : _ + " - " + C; var S = t.Address.replace(/[^A-Za-z0-9 -]/g, ""), k = t.City.replace(/[^A-Za-z0-9 -]/g, ""); return S = S.split(" ").join("-").split("--").join("-"), k = k.split(" ").join("-").split("--").join("-"), "mobile" === n ? i.template('<div class="location-map-popup" data-state="open" data-store="{{Id}}"><div class="container"><button class="close" onclick="PX.locations.closeBoxes()" aria-label="Close Infobox"></button><button class="star ' + g + '" onclick="PX.locations.setFavoritePanda({{Id}},' + e + ')" aria-label="' + m + '"></button><div class="title">Store Details</div><div class="name">{{Name }}</div><span class="address">{{ Address }}<br>{{ City }}, {{State}} {{ Zip }}<span class="features" aria-label="Features at this location" role="list">' + u + c + f + p + "</span></span>" + l + '<div class="popup-row"><span class="phone"><a href=tel:' + h + ">" + h + '</a></span><span class="fax">' + v + '</span></div><span class="hours">' + (t.TempClose ? "Closed" : s) + "</span>" + (t.TempClose ? "" : d + '<a target="_blank" href="https://maps.google.com/maps?daddr=' + y + '" class="get-directions">Get Directions</a>') + '<a href="/userlocation/' + t.Id.toString() + "/" + t.State.toString() + "/" + k + "/" + S + '" class="location-item">More info</a></div></div>')(t) : "nav" === n ? i.template('<div class="location-map-popup" data-store="{{Id}}"><div class="name"><button class="star ' + g + '" onclick="PX.locations.setFavoritePanda({{Id}})" data-has-tooltip aria-label="' + m + '"><span class="tooltip"></span></button> {{Name }}</div><span class="address">{{ Address }}<br>{{ City }}, {{State}} {{ Zip }}</span><div class="popup-row"><span class="phone">' + h + '</span><div class="features">' + u + c + f + p + '</div></div><span class="hours">' + (t.TempClose ? "Closed" : s) + "</span></div>")(t) : i.template('<div class="location-map-popup" data-store="{{Id}}"><button class="close" onclick="PX.locations.closeBoxes(true)" aria-label="Close Infobox"></button><div class="name"><button class="star ' + g + '" onclick="PX.locations.setFavoritePanda({{Id}})" data-has-tooltip aria-label="' + m + '"><span class="tooltip"></span></button> {{Name }}</div><span class="address">{{ Address }}<br>{{ City }}, {{State}} {{ Zip }}</span>' + l + '<div class="popup-row"><span class="phone">' + h + '</span><span class="fax">' + v + '</span></div><span class="hours">' + (t.TempClose ? "Closed" : s) + "</span>" + (t.TempClose ? "" : d + '<a target="_blank" href="https://maps.google.com/maps?daddr=' + y + '" class="get-directions">Get Directions</button>') + '<a href="/userlocation/' + t.Id.toString() + "/" + t.State.toString() + "/" + k + "/" + S + '" class="location-item">Location Details</a></div>')(t) } } }, { "../helpers/cookie.js": 12, "../settings.js": 26, lodash: 2 }], 22: [function (t, e, n) { var r = window.jQuery, i = window.PX || {}, o = t("./settings.js"), a = t("./helpers/cookie.js"), s = t("./locations/templates.js"), l = t("./locations/ajax-stores.js"), u = t("./helpers/local-storage.js"); function c() { if (-1 != window.location.href.indexOf("userlocation") && !(window.location.href.length > 50)) { r(window).trigger("FavoritePanda/SetupStarted"), r(".location-map-popup button.star").addClass("inactive"); var t = i.favoriteId && "0" !== i.favoriteId, e = !!i.favorite && i.favorite.hasOwnProperty("Id"), n = !!i.closest && i.closest.hasOwnProperty("Id"), o = t && n && i.favoriteId.toString() === i.closest.Id.toString(), a = u.get("pxfavstore"), c = a && a.Id.toString() === i.favoriteId.toString(); if (t) { var d = {}, h = {}; if (e) r(window).trigger("FavoritePanda/PXfavorite"), d = i.favorite, h = s.infoWindow(d, 0, "nav"), p(d, h, !0); else if (o) r(window).trigger("FavoritePanda/PXclosest"), i.favorite = i.closest, d = i.favorite, h = s.infoWindow(d, 0, "nav"), p(d, h, !0); else if (c) r(window).trigger("FavoritePanda/PXlocal"), i.favorite = a, d = i.favorite, h = s.infoWindow(d, 0, "nav"), p(d, h, !0); else { r(window).trigger("FavoritePanda/Endpoint"); var v = l.byStoreId(i.favoriteId); v.done(function (t) { d = i.favorite = t, h = s.infoWindow(d, 0, "nav"), p(d, h, !0) }), v.fail(function () { f() }) } } else f() } } function f() { if (-1 != window.location.href.indexOf("userlocation") && !(window.location.href.length > 50)) { var t = a.get("geoloc"), e = a.get("loc"), n = "" === t || "" === t.lat ? e : t; n && n.hasOwnProperty("lat") && n.hasOwnProperty("lng") && n.lat.length > 0 && n.lng.length > 0 ? d(n.lat, n.lng) : r.get(o.locations.getUserLocationEndpoint, function (t) { d(t.ItemDetail.latitude, t.ItemDetail.longitude) }, "json") } } function d(t, e) { var n = l.byLocation(t, e, 1); n.done(function (t) { var e = t.List[0]; i.closest = e, p(e, s.infoWindow(e, 0, "nav"), !1) }), n.fail(function () { }) } function p(t, e, n) { var i = (n = n || !1) ? "My Panda" : "Your Nearest Panda", a = n ? "My Panda Express" : "Nearest Panda Express", s = !n && t.Distance ? Math.floor(10 * t.Distance) / 10 + "Mi" : "", l = t.Name.length < 25 ? t.Name.toLowerCase() : t.Name.substr(0, 25).toLowerCase() + "..", u = "https://maps.googleapis.com/maps/api/staticmap?center=" + t.Address + "&zoom=17&scale=1&size=500x500&maptype=roadmap&key=" + o.googleMaps.staticApiKey + "&format=png&visual_refresh=true&markers=icon:" + o.googleMaps.staticIconHref + "%7Cshadow:false%7C" + t.Address + "&style=feature%3Alandscape%7Celement%3Aall%7Chue%3A0x000000%7C&style=feature%3Apoi%7Celement%3Alabels%7Cvisibility%3Aoff%7C&style=feature%3Aroad%7Celement%3Ageometry.stroke%7Cvisibility%3Aoff%7C", c = t.hasOwnProperty("EstimatedPickupMinutes") && t.EstimatedPickupMinutes ? t.EstimatedPickupMinutes + " minutes *" : 0; n ? r(".nearest-panda .map-area > .title").find(".title-icon").addClass("favorite") : r(".nearest-panda .map-area > .title").find(".title-icon").removeClass("favorite"), c ? (r(".nearest-panda .order-info").attr("data-has-time", "true"), r(".nearest-panda .order-time").html(c)) : (r(".nearest-panda .order-info").attr("data-has-time", "false"), r(".nearest-panda .order-time").html("")), r(".nearest-panda .map-area > .title").find(".title-text").html(a).end().find(".title-miles").html(s).end(), r(".nearest-panda .static-map").attr("src", u), r(".nearest-panda .static-map").attr("alt", "Map of panda location nearest to you at " + l), r(".nearest-panda .info .title").html(i), r(".current-panda").html(l), r(".nearest-panda .location-card").html(e) } e.exports = { init: function () { a.get("pxfav") || a.set("pxfav", "0"), i.favoriteId = a.get("pxfav"), i.favoriteId && "0" !== i.favoriteId ? c() : f(), r(window).on("Favorite-Panda-Updated", function () { i.favoriteId = a.get("pxfav"), c() }), r(window).on("Geo/Updated", function () { f() }) } } }, { "./helpers/cookie.js": 12, "./helpers/local-storage.js": 15, "./locations/ajax-stores.js": 18, "./locations/templates.js": 21, "./settings.js": 26 }], 23: [function (t, e, n) { var r = window.jQuery, i = t("../settings.js"); e.exports = { getCurrentCart: function () { r(window).trigger("Nutrition/GetCurrentCart"); var t = r.Deferred(); return r.ajax({ method: "GET", timeout: 12e3, dataType: "json", cache: !1, url: i.nutrition.getCurrentCartUrl }).success(function (e) { t.resolve(e) }).error(function (e) { t.reject(e) }), t.promise() }, getCurrentPageItems: function () { r(window).trigger("Nutrition/GetCurrentPageItems"); var t = r.Deferred(); return r.ajax({ method: "GET", timeout: 8e3, dataType: "json", cache: !1, url: i.nutrition.getCurrentPageItemsUrl }).success(function (e) { t.resolve(e) }).error(function (e) { t.reject(e) }), t.promise() }, getAllItems: function () { r(window).trigger("Nutrition/GetAllItems"); var t = r.Deferred(); return r.ajax({ method: "GET", timeout: 8e3, dataType: "json", cache: !1, url: i.nutrition.getAllItems }).success(function (e) { t.resolve(e) }).error(function (e, n, r) { t.reject(e, n, r) }), t.promise() }, postItemAdded: function (t) { r(window).trigger("Nutrition/ItemAdded"); var e = r.Deferred(); return r.ajax({ method: "POST", timeout: 8e3, data: { menuItemId: t }, cache: !1, url: i.nutrition.postItemAdded }).success(function (t) { e.resolve(t) }).error(function (t) { e.reject(t) }), e.promise() }, postItemRemoved: function (t) { r(window).trigger("Nutrition/ItemRemoved"); var e = r.Deferred(); return r.ajax({ method: "POST", timeout: 8e3, data: { menuItemId: t }, cache: !1, url: i.nutrition.postItemRemoved }).success(function (t) { e.resolve(t) }).error(function (t) { e.reject(t) }), e.promise() }, postCartCleared: function () { r(window).trigger("Nutrition/CartCleared"); var t = r.Deferred(); return r.ajax({ method: "POST", timeout: 8e3, cache: !1, url: i.nutrition.postCartCleared }).success(function (e) { t.resolve(e) }).error(function (e) { t.reject(e) }), t.promise() } } }, { "../settings.js": 26 }], 24: [function (t, e, n) { var r = window.jQuery, i = window.PX || {}, o = t("lodash"), a = t("../settings.js"), s = t("../helpers/analytics.js"), l = t("../helpers/cookie.js"), u = t("./ajax-menu.js"), c = t("../helpers/local-storage.js"), f = r(".nutrition-calculator").first(); function d() { this.cart = [], this.initialized = !1, this.isOpen = !1, this.menuItems = [], this.hasHalfItem = !1, this.halfItemId = 0, this.halfTable = [], this.nutrition = { servingSize: 0, calories: 0, caloriesFat: 0, totalFat: 0, saturatedFat: 0, cholesterol: 0, sodium: 0, carbs: 0, fiber: 0, sugar: 0, protein: 0 }, this.$itemsList = r(".calc-items-list").first() } d.prototype.calculate = function () { var t = this; o.forIn(t.nutrition, function (e, n) { t.nutrition[n] = 0 }), o.forEach(t.cart, function (e) { e.item.isHalf || (t.nutrition.servingSize += e.item.ServingSize, t.nutrition.calories += e.item.Calories, t.nutrition.caloriesFat += e.item.CaloriesFromFat, t.nutrition.totalFat += e.item.TotalFat, t.nutrition.saturatedFat += e.item.SaturatedFat, t.nutrition.cholesterol += e.item.Cholesterol, t.nutrition.sodium += e.item.Sodium, t.nutrition.carbs += e.item.TotalCarb, t.nutrition.fiber += e.item.DietaryFiber, t.nutrition.sugar += e.item.Sugars, t.nutrition.protein += e.item.Protein) }), t.nutrition.servingSize = t.nutrition.servingSize.toFixed(1) }, d.prototype.update = function () { var t = this.cart.length ? this.cart.length + " Items" : "Show"; r(".calc-toggle").attr("data-closed-label", t), this.calculate(), r("[data-nutrition-serving]").html(this.nutrition.servingSize), r("[data-nutrition-calories]").html(this.nutrition.calories), r("[data-nutrition-calories-fat]").html(this.nutrition.caloriesFat), r("[data-nutrition-total-fat]").html(this.nutrition.totalFat), r("[data-nutrition-sat-fat]").html(this.nutrition.saturatedFat), r("[data-nutrition-cholesterol]").html(this.nutrition.cholesterol), r("[data-nutrition-sodium]").html(this.nutrition.sodium), r("[data-nutrition-carbs]").html(this.nutrition.carbs), r("[data-nutrition-fiber]").html(this.nutrition.fiber), r("[data-nutrition-sugar]").html(this.nutrition.sugar), r("[data-nutrition-protein]").html(this.nutrition.protein) }, d.prototype.add = function (t, e, n) { e = e || !1, n = n || !1; var i = this, c = 0; if (t = t || !1) { var f = o.find(i.menuItems, function (e) { return e.Id.toString() === t.toString() }), d = o.clone(f, !0); if (!d) return !1; if (d.isHalf = n || !1, d.isHalf) if (i.hasHalfItem) { if (i.halfItemId.toString() !== d.Id.toString()) { var p = o.filter(i.halfTable, function (t) { return t.MenuItemId1 === i.halfItemId || t.MenuItemId2 === i.halfItemId }), h = o.find(p, function (t) { return t.MenuItemId1 === d.Id || t.MenuItemId2 === d.Id }); c = h.CombinedMenuItemId; var v = o.find(i.menuItems, function (t) { return t.Id.toString() === c.toString() }); d = o.clone(v, !0) } i.halfItemId = 0, i.hasHalfItem = !1, d.isHalf = !1; for (var g = i.cart.length; g--;) { var m = g; i.cart[m].item.isHalf && i.remove(i.cart[m].$el) } } else e = !1, i.halfItemId = d.Id, i.hasHalfItem = !0; var y = d.isHalf && i.hasHalfItem, b = y ? "Half " + d.Name + " /" : d.Name, w = y ? "true" : "false", x = {}; if (x.item = d, x.$el = r('<li class="item" data-menu-id="' + d.Id + '" data-calc-pending-half="' + w + '"><img class="item-thumb" src="' + a.nutrition.imagesPath + d.ThumbnailImgURL + '" alt=""><span class="item-title" >' + b + '</span><button class="item-delete-button" data-calc-delete>Delete Item</button></li>'), x.$el.find("[data-calc-delete]").on("click", function (t) { var e = !y; t.preventDefault(), i.remove(x.$el, e) }), i.$itemsList.append(x.$el), i.cart.push(x), i.update(), e) s.track("Nutrition Calculator", "Item-Added", x.item.Name), i.initialized || 1 !== i.cart.length || i.isOpen ? i.initialized = !0 : (i.toggleCalc(), i.initialized = !0), u.postItemAdded(x.item.Id).done(function (t) { t.cookie && l.get("nutritionplanowner") !== t.cookie && l.set("nutritionplanowner", t.cookie) }) } }, d.prototype.remove = function (t, e) { var n, r = this; e = e || !1, (t = t || !1) && (o.forEach(r.cart, function (e, i) { if (e.$el === t) return n = e.item, t.remove(), r.cart.splice(i, 1), r.update(), !1 }), e && n && (u.postItemRemoved(n.Id), s.track("Nutrition Calculator", "Item-Removed", n.Name))) }, d.prototype.clearCart = function (t) { t = t || !1, this.cart.length = 0, this.hasHalfItem = !1, this.halfItemId = 0, this.$itemsList.html(""), this.update(), t && (u.postCartCleared(), s.track("Nutrition Calculator", "Menu Reset")) }, d.prototype.getAllMenuItems = function () { var t = this, e = c.get("pxMenuItems"), n = (new Date).getTime(); if (e && e.hasOwnProperty("dateSaved") && e.dateSaved + 36e5 > n) r(window).trigger("Nutrition/GetAllItemsFromCache"), t.menuItems = e.data.List, t.halfTable = e.data.HalfAndHalfTable; else { var i = u.getAllItems(); i.done(function (e) { var r = { dateSaved: n, data: e }; c.set("pxMenuItems", r), t.menuItems = e.List, t.halfTable = e.HalfAndHalfTable }), i.fail(function () { }) } }, d.prototype.toggleCalc = function () { var t = "open" === f.attr("data-state"), e = t ? "closed" : "open"; f.attr("data-state", e), this.isOpen = !t, !t && i.support.IS_MOBILE ? r(window).trigger("Body-Prevent-Scroll") : r(window).trigger("Body-Resume-Scroll") }, d.prototype.toggleNutrition = function () { var t = "open" === f.attr("data-nutrition-state") ? "closed" : "open"; f.attr("data-nutrition-state", t) }, d.prototype.init = function () { var t = this; t.$itemsList.html(""); var e = u.getCurrentCart(); e.done(function (e) { "object" == typeof e && e.hasOwnProperty("MealPlates") && (e.MealPlates[0].MealPlateItems.length ? (o.forEach(e.MealPlates[0].MealPlateItems, function (e) { t.add(e.MenuItemId) }), t.update()) : t.clearCart(!1)) }), e.fail(function () { t.clearCart(!1) }), t.getAllMenuItems(), r(".calc-toggle").on("click", function (e) { e.preventDefault(), t.toggleCalc() }), r(".calc-mobile-close-button").on("click", function (e) { e.preventDefault(), t.toggleCalc() }), r(".calc-nutrition-details-button").on("click", function (e) { e.preventDefault(), t.toggleNutrition() }), r("[data-add-to-calc], [data-add-to-calc-half]").on("click", function (e) { e.preventDefault(); var n = !1, i = r(this).attr("data-add-to-calc"); void 0 === i && (i = r(this).attr("data-add-to-calc-half"), n = !0), t.add(i, !0, n), r(this).blur() }), r("[data-clear-calc]").on("click", function (e) { e.preventDefault(), t.clearCart(!0) }) }, e.exports = { init: function () { f.length && (new d).init() } } }, { "../helpers/analytics.js": 11, "../helpers/cookie.js": 12, "../helpers/local-storage.js": 15, "../settings.js": 26, "./ajax-menu.js": 23, lodash: 2 }], 25: [function (t, e, n) { var r = window.jQuery, i = []; t("lodash"); function o() { for (var t, e = 0; t = i[e++];)!t.visible && (n = t.$el, r = void 0, (r = n[0].getBoundingClientRect()).left >= 0 && r.right <= (window.innerWidth || document.documentElement.clientWidth) && r.top + (r.bottom - r.top) / 2 <= (window.innerHeight || document.documentElement.clientHeight)) && (t.visible = !0, t.$el.attr("data-visible", "true")); var n, r } e.exports = { init: function () { r("main.our-family-story").length && (r("li.timeline-period").each(function () { i.push({ $el: r(this), visible: !1 }) }), setInterval(o, 500), o()) } } }, { lodash: 2 }], 26: [function (t, e, n) { var r = "", i = "", o = "", a = "", s = "", l = "", u = "", c = "", f = "", d = (r = "", i = "", ""); d = "/userlocation", fundraiserUrl = "/fundraiser-landing", getUserLocationEndpoint = "/userlocation/getuserlocation", r = "/userlocation/searchbycoordinates", i = "/userlocation/searchbyquery", o = "/userlocation/searchbyid", a = "/meal/getcalculator/", s = "/Menu/getall", l = "/meal/additem/", u = "/meal/removeitem/", c = "/meal/reset/", f = "https://s3.amazonaws.com/PandaExpressWebsite/Responsive/img/food/", e.exports = { debug: !1, googleMaps: { ApiKey: "AIzaSyAoeHgnqOAt3YD59yuh27Sys_Q3JpX52yc", staticApiKey: "AIzaSyAoeHgnqOAt3YD59yuh27Sys_Q3JpX52yc", staticIconHref: "http://i.imgsafe.org/649972e.png", styles: [{ featureType: "landscape", elementType: "all", stylers: [{ hue: "#000000" }] }, { featureType: "poi", elementType: "labels", stylers: [{ visibility: "off" }] }, { featureType: "road", elementType: "geometry.stroke", stylers: [{ visibility: "off" }] }], mapIcon: "https://s3.us-east-1.amazonaws.com/PandaExpressWebsite/Responsive/img/home/map-icon.png", mapIconClosed: "https://s3.us-east-1.amazonaws.com/PandaExpressWebsite/Responsive/img/home/map-icon-closed.png" }, locations: { limit: 10, locationUrl: d, fundraiserUrl: fundraiserUrl, getUserLocationEndpoint: getUserLocationEndpoint, endPoints: { storesByLocation: r, storesByQuery: i, storeById: o }, onlineOrderUrl: "http://order.pandaexpress.com/", defaultLat: 0, defaultLong: 0 }, nutrition: { getCurrentCartUrl: a, getAllItems: s, postItemAdded: l, postItemRemoved: u, postCartCleared: c, imagesPath: f + "thumbnails/" } } }, {}], 27: [function (t, e, n) { var r = window.PX || {}, i = window.jQuery, o = t("./helpers/window-events.js"), a = t("./helpers/geolocation.js"), s = t("./video.js"); e.exports = { init: function () { var t, e, n, l, u, c, f; i(window).trigger("Scripts/Setup"), t = i(window).width(), r.support = {}, r.support = { HAS_TOUCH: !!("ontouchstart" in window || window.DocumentTouch && window.document instanceof window.DocumentTouch), IS_IE8: !!window.IS_IE8, IS_IE9: !!window.IS_IE9, IS_IE11: !window.ActiveXObject && "ActiveXObject" in window }, r.support.IS_MOBILE = !!(r.support.HAS_TOUCH && t < 768), r.support.IS_TABLET = !!(r.support.HAS_TOUCH && t <= 1024 && t >= 768), e = r.support.HAS_TOUCH ? "touch" : "not-touch", n = r.support.IS_IE8 ? "ie8" : "not-ie8", l = r.support.IS_IE9 ? "ie9" : "not-ie9", u = r.support.IS_MOBILE ? "mobile" : "not-mobile", c = r.support.IS_TABLET ? "tablet" : "not-tablet", f = (f = [e, n, u, l, c, "is-top"]).join(" "), i("body").addClass(f), i(window).on("scrollStart", function () { i("body").addClass("is-scrolling") }), i(window).on("scrollStop", function (t, e) { e = e || 0, i("body").removeClass("is-scrolling"), e < 10 ? i("body").addClass("is-top") : i("body").removeClass("is-top"), e < 100 ? i("body").addClass("is-top-100") : i("body").removeClass("is-top-100") }), r.support.IS_IE11 && i("html").css("overflow", "hidden"), o.init(), s.init(), r.support.IS_MOBILE && a.init(), "function" != typeof Object.create && (Object.create = function (t, e) { function n() { } if (n.prototype = t, "object" == typeof e) for (var r in e) e.hasOwnProperty(r) && (n[r] = e[r]); return new n }) } } }, { "./helpers/geolocation.js": 14, "./helpers/window-events.js": 17, "./video.js": 28 }], 28: [function (t, e, n) { var r, i = window.jQuery, o = window.PX || {}, a = t("./helpers/querystring.js"); function s(t) { o.support.IS_MOBILE || t.target.playVideo(); var e = a.getParameterByName("dvi"); null != e && e.length > 0 && (i(".video-block[data-video-id*=" + e + "]").focus(), i(".video-block[data-video-id*=" + e + "]").trigger("click")) } function l() { r && r.destroy(), i(".video-modal").attr("data-state", "hidden"), i(".video-modal").find(".video-container").html('<div id="video-player"></div>'), i(window).off("keydown") } function u(t) { 27 === t.which && l() } e.exports = { init: function () { var t = a.getParameterByName("dvi"); if (i("[data-video-id]").length > 0 || t) { i("body").prepend('<div class="video-modal" data-state="hidden"><div class="video-wrapper"><div class="video-container"><div id="video-player"></div></div></div</div>'), t && i("body").append('<div style="display:none;" class="c12 video-block jade" data-video-id="' + t + '"><div class="container"><span class="play-icon" aria-label"Play Button, Click to play video"></span><span class="text">Watch the Commercial</span></div></div>'); var e = document.createElement("script"); e.src = "https://www.youtube.com/iframe_api"; var n = document.getElementsByTagName("script")[0]; n.parentNode.insertBefore(e, n), i("[data-video-id]").on("click", function () { var t = i(this).data("video-id"); o.support.IS_IE8 ? window.open("http://youtube.com?rel=0&v=" + t) : function (t) { t.length > 1 && (i(window).scrollTop(), i(".video-modal").attr("data-state", "visible"), i(window).on("keydown", u), r = new window.YT.Player("video-player", { videoId: t, playerVars: { rel: 0 }, events: { onReady: s } })) }(t) }), i(".video-modal").on("click", function () { l() }), null != t && t.length > 0 && function t(e) { void 0 !== window.YT && void 0 !== window.YT.Player ? (i(".video-block[data-video-id*=" + e + "]").focus(), i(".video-block[data-video-id*=" + e + "]").trigger("click")) : setTimeout(function () { t(e) }, 250) }(t) } } } }, { "./helpers/querystring.js": 16 }] }, {}, [1]), window.onload = function () { $("#onetrust-accept-btn-handler, #onetrust-close-btn-container button").click(function () { $("a.logo").focus() }) };;
