mirror of
https://github.com/lukevella/rallly.git
synced 2025-05-31 17:56:21 +02:00
3 lines
No EOL
128 KiB
JavaScript
3 lines
No EOL
128 KiB
JavaScript
angular.module("rallly",["ui.router","ngResource","btford.modal","ngTagsInput","ngAnimate"]).config(["$stateProvider","$urlRouterProvider","$locationProvider",function(e,t,n){n.html5Mode(!0),t.otherwise("/notfound"),e.state("index",{url:"/",templateUrl:"templates/home.html",controller:"HomeCtrl"}).state("newevent",{url:"/new",templateUrl:"templates/newEvent/layout.html",controller:"NewEventCtrl"}).state("newevent.general",{templateUrl:"templates/newEvent/general.html"}).state("newevent.datetime",{templateUrl:"templates/newEvent/datetime.html"}).state("newevent.invite",{templateUrl:"templates/newEvent/invite.html"}).state("newevent.success",{templateUrl:"templates/newEvent/success.html"}).state("about",{url:"/about",templateUrl:"templates/about.html",controller:"AboutCtrl"}).state("notfound",{url:"/notfound",templateUrl:"templates/notfound.html"}).state("event",{url:"/:id",templateUrl:"templates/event.html",controller:"EventCtrl"}).state("editevent",{url:"/:id/edit",templateUrl:"templates/editevent.html",controller:"EditEventCtrl"}).state("verifyevent",{url:"/verify/:id/code/:code",controller:"VerificationCtrl"}).state("deleteevent",{url:"/delete/:id/code/:code",controller:"DeletionCtrl"})}]).factory("Event",["$resource",function(e){return e("/api/event/:id",{id:"@_id"},{update:{method:"PUT"},verify:{method:"GET",url:"/api/event/:id/code/:code"},destroy:{method:"DELETE",url:"/api/event/:id/code/:code"}})}]).factory("Participant",["$resource",function(e){return e("/api/event/:id/participant/:pid",{id:"@_id"},{update:{method:"PUT"}})}]).factory("Comment",["$resource",function(e){return e("/api/event/:id/comment/:cid",{id:"@_id"},{update:{method:"PUT"}})}]).factory("Title",function(){return{set:function(e){document.title=e}}}),angular.module("rallly").run(["$templateCache",function(e){e.put("templates/about.html",'<div style="max-width:600px">\n <h1>What is Rallly?</h1>\n <div class="rl-page-desc">Rallly is a collaborative scheduling service that makes deciding on a date fast and easy.</div>\n <h2>Hi, I\'m Luke!</h2>\n <p>\n I created Rallly as side project to help me learn some new technologies. I decided to publish it because I thought other people might find it useful. Rallly is a completely free service. In fact it is even open source. You can look at the latest source code on Github.\n </p>\n</div>\n'),e.put("templates/confirmmodal.html",'<div class="rl-modal-overlay" ng-click="modal.cancel()"></div>\n\n<div class="rl-modal">\n <div class="rl-modal-title">{{modal.title}}</div>\n <div class="rl-modal-message">\n {{modal.message}}\n </div>\n <div class="rl-modal-actions">\n <button type="button" ng-click="modal.confirm()" ng-show="modal.confirm" class="btn" ng-class="{danger : modal.isDestructive}">{{modal.confirmText}}</button>\n <button type="button" ng-click="modal.cancel()" class="btn">{{modal.cancelText}}</button>\n </div>\n</div>\n'),e.put("templates/editevent.html",'<div ng-show="event._id">\n <div class="box">\n\n <div class="box-title">Edit Event</div>\n <div class="box-description">\n You can makes changes to your existing event by changing the fields in the form below.\n </div>\n\n <form novalidate name="form" ng-submit="submit()">\n\n <section class="box-section" user-form form="form" event="event">\n\n </section>\n\n <section class="box-section" event-form form="form" event="event">\n\n </section>\n <section class="box-section" date-form form="form" event="event">\n\n </section>\n\n <section class="box-section" settings-form form="form" event="event">\n\n </section>\n\n <div class="box-controls box-bottom-sticky">\n <button type="submit" ng-show="didChange()" class="btn btn-primary" ng-class="{disabled : !didChange()}">\n Save Changes\n </button>\n <button type="button" ng-click="undoChanges()" class="btn" ng-show="didChange()">Undo Changes</button>\n <a href="/{{event._id}}" class="btn" ng-hide="didChange()">Done</a>\n </div>\n\n </form>\n\n </div>\n\n</div>\n'),e.put("templates/event.html",'<div ng-show="event._id && !event.isDeleted">\n <div class="box ">\n <div class="event-header">\n <div class="avatar">\n <img src="/images/eventicon.png" width="32" />\n </div>\n <div class="details">\n <div class="title">\n {{event.title}}\n <span class="title-label danger" ng-show="event.isClosed">Poll Closed</span>\n <span class="title-label success" ng-hide="event.isClosed">Poll Open</span>\n </div>\n <div class="subtitle">\n Created by <a href="mailto:{{event.creator.email}}">{{event.creator.name}}</a> • {{event.created | elapsed}}\n </div>\n </div>\n <div class="actions">\n <button class="btn" ng-click="editEvent()">Edit Event</button>\n </div>\n </div>\n <div class="box-side-sticky event-description" ng-show="event.description">{{event.description}}</div>\n <div class="box-bottom-sticky event-location" ng-show="event.location">\n <img src="/images/location.png" width="18" /><a href="http://google.com/maps?q={{event.location}}" target="_blank">{{event.location}}</a>\n </div>\n\n </div>\n <div class="box box-x-scroll">\n <div poll event="event" class="poll">\n </div>\n </div>\n\n <div class="box" ng-hide="event.comments.length == 0 && event.isClosed">\n <div class="box-title">\n Discussion\n </div>\n <div class="box-description">\n You can discuss the event with your friends by leaving a comment below.\n </div>\n <div discussion event="event">\n\n </div>\n </div>\n</div>\n'),e.put("templates/home.html",'<div class="page-placeholder">\n <div class="image">\n <img src="/images/mark_large.png" width="67" />\n </div>\n <div class="title">\n Schedule an Event\n </div>\n <div class="content">\n Want to host an event but can’t decide on a date? Click on the button below to start!\n </div>\n <button ng-click="newEvent()" class="btn">Schedule New Event</button>\n</div>\n'),e.put("templates/newevent.html",'<div ng-if="!eventUrl">\n <div class="box" ng-class="{\'animated shake\': form.$submitted && form.$invalid }">\n\n <div class="box-title">Schedule a New Event</div>\n <div class="box-description">\n Fill in the form below to create your event and share it with your friends and colleagues.\n </div>\n\n <form novalidate autocomplete="off" name="form" ng-submit="submit()">\n <div ng-if="page == 1">\n\n <section class="box-section" user-form form="form" event="event">\n\n </section>\n\n <section class="box-section" event-form form="form" event="event">\n\n </section>\n </div>\n <div ng-if="page==2">\n\n <section class="box-section" date-form form="form" event="event">\n\n </section>\n\n <section class="box-section" ng-show="event.dates.length" time-form form="form" event="event">\n\n </section>\n </div>\n\n <div ng-if="page==3">\n\n <section class="box-section" participants-form form="form" event="event">\n\n </section>\n\n </div>\n\n\n <div class="box-controls box-bottom-sticky">\n <button type="button" ng-if="page!=1" class="btn" ng-click="prevPage()">Back</button>\n <button type="button" ng-if="page!=3" class="btn" ng-click="nextPage()">Next</button>\n <button type="submit" ng-if="page==3" class="btn btn-primary">Create Event</button>\n </div>\n\n </form>\n </div>\n\n</div>\n<div ng-if="eventUrl" class="box">\n <div class="box-message">\n <div class="main-image">\n <img src="/images/success_large.png" width="100" />\n </div>\n <div class="title">Event Created</div>\n <div class="content">\n Your event has been created successfully! You should receive an email shortly with instructions to verify your email address.\n </div>\n <div class="mini-divider">\n </div>\n <div class="form-group">\n <input type="text" class="form-control" disabled="true" value="{{eventUrl}}" />\n <a href="{{eventUrl}}" class="btn form-btn">GO</a>\n </div>\n </div>\n</div>\n'),e.put("templates/notfound.html","<h1>Error 404</h1>\n<h2>Not Found</h2>\n"),e.put("templates/notification.html",'<div class="notification {{notification.type}}" ng-click="notification.close()">\n <div class="title">\n {{notification.title}}\n </div>\n <div class="message">\n {{notification.message}}\n </div>\n</div>\n'),e.put("templates/directives/discussion.html",'<ul class="comment-thread" ng-show="event.comments.length">\n <li ng-repeat="comment in event.comments" class="comment">\n <div class="avatar-section">\n <img src="/images/avatar.png" />\n </div>\n <div class="comment-section">\n <a href="#" class="comment-delete" ng-click="deleteComment(comment)">×</a>\n <div class="meta">\n <span class="name">{{comment.author.name}}</span>\n <span class="time">{{comment.created | elapsed}}</span>\n </div>\n <div class="content">{{comment.content}}</div>\n </div>\n </li>\n</ul>\n<form novalidate ng-submit="postComment()" name="commentForm" class="comment-form">\n <div class="avatar-section">\n <img src="/images/avatar.png" />\n </div>\n <div class="input-section form-group">\n <div class="content-section">\n <textarea class="form-control" required ng-model="comment.content" placeholder="Write a comment..."></textarea>\n </div>\n <div class="name-section">\n <div class="name-container">\n <input type="text" class="form-control" required placeholder="Your Name" ng-model="comment.author.name" />\n <button type="submit" class="btn">Post Comment</button>\n <span class="form-error" ng-show="commentForm.$submitted && commentForm.$error">\n <img src="/images/error.png" width="14" /> Make sure you fill in all the fields.\n </span>\n </div>\n </div>\n </div>\n</form>\n'),e.put("templates/directives/poll.html",'<div class="poll-header">\n <div class="header participants-header">\n {{event.participants.length}} participants\n </div>\n <div class="header date-header" ng-repeat="d in event.dates">\n <div class="daticon">\n <div class="dow">\n {{d.date | date: \'EEE\'}}\n </div>\n <div class="day">\n {{d.date | date: \'d\'}}\n </div>\n <div class="month">\n {{d.date | date : \'MMM\'}}\n </div>\n <span class="count" ng-show="selectedDate($index)" ng-class={top:isTopDate($index)}>{{selectedDate($index)}}</span>\n </div>\n </div>\n <div class="header actions-header">\n\n </div>\n</div>\n<div class="poll-body">\n <div class="poll-entry" ng-repeat="participant in event.participants">\n <form novalidate ng-submit="update(participant); editMode = false">\n <div class="cell name-cell">\n <span class="avatar style-{{$index + 1}}">\n <img src="/images/user.png" width="11" />\n </span>\n <input required autocomplete="off" type="text" class="form-control" ng-model="participant.name" ng-show="editMode" value="participant.name"/>\n <span ng-hide="editMode" class="name editable" ng-click="editMode = true && !event.isClosed; edit(participant)">{{participant.name}}</span>\n </div>\n <div class="cell vote-cell" ng-repeat="date in event.dates">\n <img src="/images/tick@2x.png" width="16" ng-hide="editMode" ng-if="participant.dates[$index]" />\n <img src="/images/nope@2x.png" width="8" ng-hide="editMode" ng-if="!participant.dates[$index]" />\n <input ng-model="participant.dates[$index]" ng-show="editMode" ng-false-value="false" type="checkbox" />\n <div class="overlay" ng-show="editMode" ng-click="participant.dates[$index] = !participant.dates[$index]"></div>\n </div>\n <div class="cell action-cell" ng-hide="event.isClosed">\n <button type="button" ng-hide="editMode" ng-click="editMode = true; edit(participant)" class="btn hover">Edit</button>\n <button type="button" ng-hide="editMode" ng-click="delete(participant)" class="btn danger hover">Delete</button>\n <button type="submit" ng-show="editMode" class="btn">Save</button>\n <button type="button" ng-show="editMode" ng-click="editMode = false; cancel($index)" class="btn">Cancel</button>\n </div>\n </form>\n </div>\n <div class="poll-example" ng-class="{hidden : event.participants.length > 0}">\n <div class="poll-entry" ng-repeat="example in examples">\n <div class="cell name-cell">\n <span class="avatar style-{{$index + 1}}">\n <img src="/images/user.png" width="11" />\n </span>\n <span class="name">{{example.name}}</span>\n </div>\n <div class="cell vote-cell" ng-repeat="date in event.dates">\n <img src="/images/tick@2x.png" width="16" ng-if="example.dates[$index]" />\n <img src="/images/nope@2x.png" width="8" ng-if="!example.dates[$index]" />\n </div>\n <div class="cell action-cell">\n\n </div>\n </div>\n <div class="overlay">\n <div class="overlay-text">\n Fill in the form below to get started\n </div>\n </div>\n </div>\n <div ng-hide="event.isClosed" class="poll-entry highlight">\n <form novalidate name="formnew" ng-submit="save()">\n <div class="cell name-cell">\n <span class="avatar style-{{participant.style}}">\n <img src="/images/user.png" width="11" />\n </span>\n <input autocomplete="off" name="username" type="text" class="form-control" placeholder="Your name..." ng-model="participant.name" required value="participant.name"/>\n </div>\n <div class="cell vote-cell" ng-repeat="date in event.dates">\n <input ng-model="participant.dates[$index]" ng-false-value="false" type="checkbox" />\n <div class="overlay" ng-click="participant.dates[$index] = !participant.dates[$index]"></div>\n </div>\n <div class="cell action-cell">\n <button type="submit" ng-class="{ \'animated shake\' : formnew.$submitted && formnew.$invalid }" class="btn">Save</button>\n </div>\n </form>\n </div>\n</div>\n'),e.put("templates/directives/timePicker.html",'<div class="time-picker">\n <div class="time-picker-col">\n <div class="daticon">\n <div class="dow">\n {{date | date: \'EEE\'}}\n </div>\n <div class="day">\n {{date | date: \'d\'}}\n </div>\n <div class="month">\n {{date | date : \'MMM\'}}\n </div>\n <!-- <span class="delete" ng-click="datepicker.unsetDate(date)"></span> -->\n </div>\n </div>\n <div class="time-picker-col" ng-repeat="time in date.times track by $index">\n <input type="text" class="time-picker-input" time-picker ng-model="time" ng-model-options="{ updateOn: \'blur\' }" />\n </div>\n</div>\n'),e.put("templates/form/dateForm.html",'<div class="section-details">\n <div class="section-title">Choose Dates</div>\n <ul class="daticon-list">\n <li ng-repeat="d in event.dates">\n <div class="daticon">\n <div class="dow">\n {{d.date | date: \'EEE\'}}\n </div>\n <div class="day">\n {{d.date | date: \'d\'}}\n </div>\n <div class="month">\n {{d.date | date : \'MMM\'}}\n </div>\n <span class="delete" ng-click="datepicker.unsetDate(d.date)"></span>\n </div>\n </li>\n </ul>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-group">\n <label for="email">Calendar</label>\n <span class="form-error" ng-show="form.$submitted && form.datepicker.$error.required">\n <img src="/images/error.png" width="14" /> You need to select a few dates\n </span>\n <div datepicker required name="datepicker" control="datepicker" ng-model="event.dates">\n\n </div>\n </div>\n </div>\n</div>\n'),e.put("templates/form/eventForm.html",'<div class="section-details">\n <div class="section-title">Event Details</div>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-col">\n <div class="form-group">\n <label for="title">Title</label>\n <span class="form-error" ng-show="(form.title.$touched || form.$submitted) && errors.title">\n <img src="/images/error.png" width="14" /> {{errors.title}}\n </span>\n <input id="title" name="title" ng-maxlength="30" required ng-model="event.title" type="text" placeholder="Monthly Meetup..." class="form-control extend"/>\n </div>\n </div>\n <div class="form-col">\n <div class="form-group optional">\n <label for="location">Location</label>\n <span class="form-error" ng-show="(form.location.$touched || form.$submitted) && errors.location">\n <img src="/images/error.png" width="14" /> {{errors.location}}\n </span>\n <input id="location" name="location" ng-model="event.location" ng-maxlength="50" type="text" placeholder="Rick\'s Cafe..." class="form-control extend"/>\n </div>\n </div>\n </div>\n <div class="form-row">\n <div class="form-group optional">\n <label for="description" >Description</label>\n <textarea id="description" name="description" ng-model="event.description" placeholder="Enter Description..." class="form-control extend"></textarea>\n </div>\n </div>\n</div>\n'),e.put("templates/form/participantsForm.html",'<div class="section-details">\n <div class="section-title">Invite Participants</div>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-group optional">\n <label>Participant\'s Emails</label>\n <tags-input max-length="50" allowed-tags-pattern="{{emailRegex}}" display-property="email" ng-model="event.emails" placeholder="Add an Email" type="email" autocomplete="off"></tags-input>\n <input type="hidden" name="shouldCreate" value="true" />\n\n </div>\n </div>\n</div>\n</section>\n'),e.put("templates/form/settingsForm.html",'<div class="section-details">\n <div class="section-title">Settings</div>\n</div>\n<div class="section-main">\n <div class="switch-row">\n <div class="switch-details">\n <div class="title">\n Poll Status\n </div>\n <div class="description">\n Let people vote on the poll.\n </div>\n </div>\n <div class="switch">\n <div class="switch-value">\n {{event.isClosed ? \'Closed\' : \'Open\' }}\n </div>\n <div switch-toggle ng-model="event.isClosed" invert>\n </div>\n </div>\n </div>\n <div class="switch-row">\n <div class="switch-details">\n <div class="title">\n Notifications\n </div>\n <div class="description">\n Send email notifications to the creator of this event.\n </div>\n </div>\n <div class="switch">\n <div class="switch-value">\n {{event.creator.allowNotifications ? \'Enabled\' : \'Disabled\' }}\n </div>\n <div switch-toggle ng-model="event.creator.allowNotifications">\n </div>\n </div>\n </div>\n <div class="switch-row">\n <div class="switch-details">\n <div class="title">\n Delete Event\n </div>\n <div class="description">\n Once you delete an event it will no longer be accessible.\n </div>\n </div>\n <div class="switch">\n <button type="button" ng-click="deleteEvent()" class="btn" ng-class="{danger : !deleteRequestSent, disabled : deleteRequestSent}">{{deleteRequestSent ? \'Request Sent\' : \'Delete Event\' }}</button>\n </div>\n </div>\n</div>\n</section>\n'),e.put("templates/form/timeForm.html",'<div class="section-details">\n <div class="section-title">Choose Times</div>\n</div>\n<div class="section-main">\n <table class="time-form">\n <thead>\n <tr>\n <th>\n\n </th>\n <th>\n Time 1\n </th>\n <th>\n Time 2\n </th>\n <th>\n Time 3\n </th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="d in event.dates">\n <td>\n <div class="daticon">\n <div class="dow">\n {{d.date | date: \'EEE\'}}\n </div>\n <div class="day">\n {{d.date | date: \'d\'}}\n </div>\n <div class="month">\n {{d.date | date : \'MMM\'}}\n </div>\n <span class="delete" ng-click="unsetDate(d.date)"></span>\n </div>\n </td>\n <td ng-repeat="time in [1,2,3] track by $index">\n <input type="text" time-picker ng-model-options="{ updateOn: \'blur\' }" ng-model="d.times[$index]" class="time-picker-input" />\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n'),e.put("templates/form/userForm.html",'<div class="section-details">\n <div class="section-title">Your Details</div>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-col">\n <div class="form-group">\n <label for="name">Name</label>\n <span class="form-error" ng-show="(form.name.$touched || form.$submitted) && errors.name">\n <img src="/images/error.png" width="14" /> {{errors.name}}\n </span>\n <input id="name" name="name" ng-maxlength="30" required ng-model="event.creator.name" type="text" placeholder="John Doe..." class="form-control extend"/>\n </div>\n </div>\n <div class="form-col">\n <div class="form-group">\n <label for="email">Email</label>\n <span class="form-error" ng-show="(form.email.$touched || form.$submitted) && errors.email">\n <img src="/images/error.png" width="14" /> {{errors.email}}\n </span>\n <input type="email" id="email" name="email" ng-pattern="emailRegex" required ng-model="event.creator.email" placeholder="john.doe@email.com..." class="form-control extend"/>\n </div>\n </div>\n </div>\n</div>\n'),e.put("templates/newEvent/datetime.html",'<section class="box-section" date-form form="form" event="event">\n\n</section>\n\n<section class="box-section" ng-show="event.dates.length" time-form form="form" event="event">\n\n</section>\n\n<div class="box-controls box-bottom-sticky">\n <button type="button" class="btn" ng-click="prevPage()">Previous</button>\n <button type="submit" class="btn">Next</button>\n</div>\n'),e.put("templates/newEvent/general.html",'<section class="box-section" user-form form="form" event="event">\n\n</section>\n\n<section class="box-section" event-form form="form" event="event">\n\n</section>\n\n<div class="box-controls box-bottom-sticky">\n <button type="submit" class="btn">Next Step</button>\n</div>\n'),e.put("templates/newEvent/invite.html",'<section class="box-section" participants-form form="form" event="event">\n\n</section>\n\n<div class="box-controls box-bottom-sticky">\n <button type="button" class="btn" ng-click="prevPage()">Previous</button>\n <button type="submit" class="btn">Create</button>\n</div>\n'),e.put("templates/newEvent/layout.html",'<div class="box">\n\n <div class="box-title">Schedule a New Event</div>\n <div class="box-description">\n Fill in the form below to create your event and share it with your friends and colleagues.\n </div>\n <ol class="box-steps">\n <li class="step active">\n General Details\n </li>\n <li class="step" ng-class="{ active : page > 1 }">\n Dates & Times\n </li>\n <li class="step" ng-class="{ active : page > 2 }">\n Invites\n </li>\n <li class="step" ng-class="{ active : page > 3 }">\n Done\n </li>\n </ol>\n <form novalidate autocomplete="off" name="form" ng-submit="submit()">\n <div ui-view>\n\n </div>\n </form>\n</div>\n'),e.put("templates/newEvent/success.html",'<div class="box-message">\n <div class="main-image">\n <img src="/images/success_large.png" width="100" />\n </div>\n <div class="title">Event Created</div>\n <div class="content">\n Your event has been created successfully! You should receive an email shortly with instructions to verify your email address.\n </div>\n <div class="mini-divider">\n </div>\n <div class="form-group">\n <input type="text" class="form-control" disabled="true" value="{{eventUrl}}" />\n <a href="{{eventUrl}}" class="btn form-btn">GO</a>\n </div>\n</div>\n')}]),angular.module("rallly").controller("AboutCtrl",["Title",function(e){e.set("About Rallly")}]),angular.module("rallly").controller("AccountCtrl",["$scope","ConfirmModal",function(e){e.showNotice=function(){}}]),angular.module("rallly").controller("DeletionCtrl",["$state","Notification","Event",function(e,t,n){n.destroy({id:e.params.id,code:e.params.code},function(){new t({title:"Event deleted",message:"This event has been deleted",type:"success",timeout:5e3})},function(){new t({title:"Deletion Failed",message:"The event could not be deleted. Make sure that it exists and that the url is correct",type:"error"})}),e.go("event",{id:e.params.id})}]),angular.module("rallly").controller("EditEventCtrl",["$scope","$http","$state","$timeout","Event","ConfirmModal","Notification","Title",function(e,t,n,i,a,o,s,l){var r=n.params.id;e.event=a.get({id:r},function(){l.set("Edit: "+e.event.title),e.master=angular.copy(e.event)},function(){n.go("notfound")}),e.undoChanges=function(){e.event=angular.copy(e.master)},e.didChange=function(){return JSON.stringify(e.master)!=JSON.stringify(e.event)},e.didChangeDates=function(){return JSON.stringify(e.master.dates)!=JSON.stringify(e.event.dates)},e.submit=function(){if(e.form.$valid)if(e.didChangeDates()){new o({title:"Hold up!",message:"Changing the dates will reset all entries by the participants. Are you sure you want to do that?",confirmText:"Yes, I'm sure",isDestructive:!0,confirm:function(){e.event.participants=[],c()}})}else c();else{new s({title:"Not so fast",message:"Make sure you fill in all the required fields and try again.",type:"error"})}};var c=function(){a.update({id:r},e.event,function(){new s({title:"Changes Saved",message:"Your changes have been saved successfully.",type:"success"});e.master=angular.copy(e.event)})}}]),angular.module("rallly").controller("EventCtrl",["$scope","$http","$state","Title","Event","ConfirmModal",function(e,t,n,i,a,o){var s=n.params.id;e.event=a.get({id:s},function(){i.set(e.event.title),e.eventUrl=n.href("event",{id:e.event._id},{absolute:!0})},function(){n.go("notfound")}),e.openEvent=function(){e.event.isClosed=!1,a.update({id:s},e.event,function(){new o({title:"Event Open",message:"People can vote and comment on this event.",cancelText:"OK"})})},e.closeEvent=function(){e.event.isClosed=!0,a.update({id:s},e.event,function(){new o({title:"Event Closed",message:"People can no longer vote or comment on this event.",cancelText:"OK"})})},e.editEvent=function(){n.go("editevent",{id:e.event._id})}}]),angular.module("rallly").controller("HomeCtrl",["$scope","$state","Title",function(e,t,n){n.set("Rallly - Collaborative Scheduling"),e.newEvent=function(){t.go("newevent")}}]),angular.module("rallly").controller("NavigationCtrl",["$scope","$location",function(e,t){e.isActive=function(e){return t.path()==e?!0:!1}}]),angular.module("rallly").controller("NewEventCtrl",["$scope","$http","$state","Event","ConfirmModal","Notification",function(e,t,n,i,a,o){e.title="Schedule a New Event",e.description="Fill in the form below to create your event and share it with your friends and colleagues.",e.event={};var s=["newevent.general","newevent.datetime","newevent.invite"];e.page=2;var l=function(t){e.page=t,n.go(s[t-1])};l(e.page),e.submit=function(){if(e.form.$valid&&e.page==s.length)t.post("/api/event",e.event).success(function(t){e.event=t,e.eventUrl=n.href("event",{id:e.event._id},{absolute:!0}),e.page++,n.go("newevent.success")}).error(function(){new a({title:"Uh oh!",message:"There was an error creating your event. Please try again later.",cancelText:"OK"})});else if(e.form.$valid)e.form.$setPristine(),e.nextPage();else{new o({title:"Not so fast",message:"Make sure you fill in all the required fields and try again.",type:"error"})}},e.nextPage=function(){l(e.page+1)},e.prevPage=function(){l(e.page-1)}}]),angular.module("rallly").controller("VerificationCtrl",["Event","Notification","$state",function(e,t,n){e.verify({id:n.params.id,code:n.params.code},function(){new t({title:"Email Verified",message:"Your email has been verified. You will now be able to receive email notifications for this event",type:"success",timeout:5e3})},function(){new t({title:"Verification Failed",message:"Your verification code has expired.",type:"error"})}),n.go("event",{id:n.params.id})}]),angular.module("rallly").directive("backImg",function(){return function(e,t,n){var i=n.backImg;t.css({"background-image":"url(/images/"+i+".png)"})}}),angular.module("rallly").directive("datepicker",["DatePickerService",function(e){return{restrict:"A",require:"ngModel",scope:{model:"=ngModel",control:"="},link:function(t,n,i,a){var o=new e(t.model),s=o.getDatesArray();angular.element(n).datepicker({multidate:!0,todayHighlight:!0}).on("changeDate",function(e){var t=e.dates;if(t.length>s.length){var n=t[t.length-1];o.addDate(n)}else{var i=o.diffDates(s,t);i&&o.removeDate(i)}a.$setViewValue(o.getDates()),s=t}),t.control=t.control||{},t.$watchCollection("model",function(){var e=angular.element(n).datepicker("getDates"),t=o.getDatesArray();e.length!=t.length&&angular.element(n).datepicker("setDates",t)
|
||
}),t.control.unsetDate=function(e){o.removeDate(e)},a.$validators.required=function(e){return e&&0!=e.length?!0:!1}}}}]).service("DatePickerService",function(){return function(e){var t=e||[];this.addDate=function(e){t.push({date:e}),t.sort(function(e,t){return Date.compare(e.date,t.date)>0?!0:!1})},this.removeDate=function(e){for(var n=0;n<t.length;n++)Date.equals(t[n].date,e)&&t.splice(n,1)},this.getDates=function(){return t.length>0?t:null},this.getDatesArray=function(){for(var e=[],n=0;n<t.length;n++)e.push(t[n].date);return e},this.diffDates=function(e,t){for(var n=!0,i=0;i<e.length;i++){n=!0;for(var a=0;a<t.length;a++)Date.equals(e[i],t[a])&&(n=!1);if(n)return e[i]}}}}),angular.module("rallly").directive("discussion",["$timeout","Comment","ConfirmModal",function(e,t,n){return{restrict:"A",templateUrl:"templates/directives/discussion.html",scope:{event:"="},link:function(i){i.comment={};var a=angular.element(".comment-thread");e(function(){a.scrollTop(a.prop("scrollHeight"))}),i.deleteComment=function(e){new n({title:"Are you sure?",message:"Are you sure you want to remove this comment?",confirmText:"Yes - delete",cancelText:"No - nevermind",isDestructive:!0,confirm:function(){t.remove({id:i.event._id,cid:e._id},function(e){i.event=e})}})},i.postComment=function(){if(i.commentForm.$valid){var e=new t(i.comment);e.$save({id:i.event._id},function(e){i.event=e,i.comment={}}),i.commentForm.$setPristine()}}}}}]),angular.module("rallly").directive("dropdown",["$document",function(e){return{restrict:"A",link:function(t,n){n.addClass("dropdown"),t.open=!1;var i=function(e){var i=n.find(e.target).length>0;i||t.toggle()};t.toggle=function(){t.open=!t.open,t.open?(n.addClass("open"),e.bind("click",i)):(n.removeClass("open"),e.unbind("click",i))}}}}]),angular.module("rallly").service("FormHelper",function(){this.emailRegexString="^([\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4})?$",this.emailRegex=new RegExp(this.emailRegexString),this.prettyError=function(e,t){return e.required?t+" is required":e.pattern?t+" is invalid":e.maxlength?t+" is too long":!1}}).directive("userForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/userForm.html",link:function(t){t.errors={},t.emailRegex=e.emailRegex,t.$watchCollection("form.name.$error",function(n){t.errors.name=e.prettyError(n,"Name")}),t.$watchCollection("form.email.$error",function(n){t.errors.email=e.prettyError(n,"Email")})}}}]).directive("eventForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/eventForm.html",link:function(t){t.errors={},t.$watchCollection("form.title.$error",function(n){t.errors.title=e.prettyError(n,"Title")}),t.$watchCollection("form.location.$error",function(n){t.errors.location=e.prettyError(n,"Location")})}}}]).directive("dateForm",function(){return{scope:{event:"=",form:"="},templateUrl:"templates/form/dateForm.html"}}).directive("participantsForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/participantsForm.html",link:function(t){t.emailRegex=e.emailRegexString}}}]).directive("settingsForm",["Event","ConfirmModal",function(e,t){return{scope:{event:"=",form:"="},templateUrl:"templates/form/settingsForm.html",link:function(n){n.deleteEvent=function(){n.deleteRequestSent||e.delete({id:n.event._id},function(){n.deleteRequestSent=!0;new t({title:"Delete Request Sent",message:"An email has been sent to the creator of this event with instructions to delete it.",cancelText:"OK"})})}}}}]).directive("switchToggle",function(){return{scope:{model:"=ngModel"},require:"ngModel",link:function(e,t,n,i){t.addClass("switch-toggle");var a=function(){e.model^"undefined"!=typeof n.invert?t.addClass("active"):t.removeClass("active")};e.$watch("model",a),t.bind("click",function(t){e.model=!e.model,i.$setViewValue(e.model,t)})}}}).directive("timeForm",["DatePickerService",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/form/timeForm.html",link:function(t){var n,i=!1,a=t.$watch("event.dates",function(o){o&&!i&&a(),i=!0,n=new e(t.event.dates),t.unsetDate=function(e){n.removeDate(e)}})}}}]).directive("timePicker",["$timeout",function(){return{scope:{model:"=ngModel"},require:"ngModel",link:function(e,t,n,i){i.$viewChangeListeners.push(function(){e.model=i.$modelValue}),i.$parsers.push(function(e){return e?Date.parse(e):void 0}),i.$validators.time=function(e){if(i.$isEmpty(e))return!0;var t=Date.parse(e);return t?(i.$setViewValue(t.toString("hh:mm tt")),i.$render(),!0):!1}}}}]),angular.module("rallly").directive("poll",["$timeout","Participant","ConfirmModal",function(e,t,n){return{restrict:"A",templateUrl:"templates/directives/poll.html",scope:{event:"="},link:function(e){e.defaults=[],e.participant={};var i=[];e.event.$promise.then(function(t){for(var n=["John Example","Jane Specimen","Mark Instance","Mary Case"],i=[],a=0;a<n.length;a++){var o={name:n[a]};o.dates=[];for(var s=0;s<t.dates.length;s++){var l=Math.random()<.5;o.dates[s]=l}i.push(o)}e.examples=i}),e.delete=function(i){new n({title:"Delete "+i.name+"?",message:"Are you sure you want to remove "+i.name+" from the poll?",confirmText:"Yes - delete",cancelText:"No - nevermind",isDestructive:!0,confirm:function(){t.remove({id:e.event._id,pid:i._id},function(t){e.event=t})}})},e.isTopDate=function(e){for(var t=i[e],n=0;n<i.length;n++)if(i[n]>t)return!1;return!0},e.selectedDate=function(t){i[t]=0;for(var n=0;n<e.event.participants.length;n++)e.event.participants[n].dates[t]&&i[t]++;return i[t]},e.update=function(n){t.update({id:e.event._id,pid:n._id},n)},e.edit=function(t){e.defaults[e.event.participants.indexOf(t)]=angular.copy(t)},e.cancel=function(t){e.event.participants[t]=e.defaults[t]},e.save=function(){if(e.formnew.$valid){var n=new t(e.participant);n.$save({id:e.event._id},function(t){e.event=t,e.participant={}}),e.formnew.$setPristine()}}}}}]),angular.module("rallly").filter("elapsed",["$filter",function(e){return function(t){if(t){var n=Date.parse(t),i=(new Date).getTime(),a=i-n,o=Math.floor(a/1e3),s=Math.floor(o/60),l=Math.floor(s/60),r=Math.floor(l/24);return r>30?"on "+e("date")(t,"MMMM d"):r>1?r+" days ago":1==r?"1 day ago":l>1?l+" hours ago":1==l?"an hour ago":s>1?s+" minutes ago":1==s?"a minute ago":"a few seconds ago"}}}]),angular.module("rallly").factory("ConfirmModal",["btfModal",function(e){return function(t){var n;n=e({templateUrl:"templates/confirmmodal.html",controllerAs:"modal",controller:function(){this.title=t.title,this.message=t.message,this.confirm=t.confirm?function(){t.confirm(),n.deactivate()}:!1,this.cancel=n.deactivate,this.confirmText=t.confirmText||"Confirm",this.cancelText=t.cancelText||"Cancel",this.isDestructive=t.isDestructive}}),n.activate(),this.destroy=function(){n.deactivate()}}}]),angular.module("rallly").factory("Notification",["$timeout","btfModal",function(e,t){return function(n){var i;i=t({templateUrl:"templates/notification.html",controllerAs:"notification",controller:function(){this.title=n.title,this.message=n.message,this.close=i.deactivate,this.type=n.type;var t=n.timeout||5e3;e(i.deactivate,t)}}),i.activate(),this.destroy=function(){i.deactivate()}}}]);
|
||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1haW4uanMiLCJ0ZW1wbGF0ZXMuanMiLCJjb250cm9sbGVycy9hYm91dC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvYWNjb3VudC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvZGVsZXRpb24uY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL2VkaXRldmVudC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvZXZlbnQuY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL2hvbWUuY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL25hdmlnYXRpb24uY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL25ld2V2ZW50LmNvbnRyb2xsZXIuanMiLCJjb250cm9sbGVycy92ZXJpZmljYXRpb24uY29udHJvbGxlci5qcyIsImRpcmVjdGl2ZXMvYmFja0ltZy5kaXJlY3RpdmUuanMiLCJkaXJlY3RpdmVzL2RhdGVwaWNrZXIuZGlyZWN0aXZlLmpzIiwiZGlyZWN0aXZlcy9kaXNjdXNzaW9uLmRpcmVjdGl2ZS5qcyIsImRpcmVjdGl2ZXMvZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwiZGlyZWN0aXZlcy9mb3JtLmRpcmVjdGl2ZS5qcyIsImRpcmVjdGl2ZXMvcG9sbC5kaXJlY3RpdmUuanMiLCJmaWx0ZXJzL2VsYXBzZWQuZmlsdGVyLmpzIiwic2VydmljZXMvbW9kYWwuc2VydmljZS5qcyIsInNlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQUEsT0FBQSxVQUFBLFlBQUEsYUFBQSxlQUFBLGNBQUEsY0FDQSxRQUFBLGlCQUFBLHFCQUFBLG9CQUFBLFNBQUEsRUFBQSxFQUFBLEdBQ0EsRUFBQSxXQUFBLEdBQ0EsRUFBQSxVQUFBLGFBQ0EsRUFDQSxNQUFBLFNBQ0EsSUFBQSxJQUNBLFlBQUEsc0JBQ0EsV0FBQSxhQUVBLE1BQUEsWUFDQSxJQUFBLE9BQ0EsWUFBQSxpQ0FDQSxXQUFBLGlCQUVBLE1BQUEsb0JBQ0EsWUFBQSxvQ0FFQSxNQUFBLHFCQUNBLFlBQUEscUNBRUEsTUFBQSxtQkFDQSxZQUFBLG1DQUVBLE1BQUEsb0JBQ0EsWUFBQSxvQ0FFQSxNQUFBLFNBQ0EsSUFBQSxTQUNBLFlBQUEsdUJBQ0EsV0FBQSxjQUVBLE1BQUEsWUFDQSxJQUFBLFlBQ0EsWUFBQSw0QkFFQSxNQUFBLFNBQ0EsSUFBQSxPQUNBLFlBQUEsdUJBQ0EsV0FBQSxjQUVBLE1BQUEsYUFDQSxJQUFBLFlBQ0EsWUFBQSwyQkFDQSxXQUFBLGtCQUVBLE1BQUEsZUFDQSxJQUFBLHlCQUNBLFdBQUEscUJBRUEsTUFBQSxlQUNBLElBQUEseUJBQ0EsV0FBQSxvQkFHQSxRQUFBLFNBQUEsWUFBQSxTQUFBLEdBQ0EsTUFBQSxHQUFBLGtCQUFBLEdBQUEsU0FDQSxRQUFBLE9BQUEsT0FDQSxRQUFBLE9BQUEsTUFBQSxJQUFBLDZCQUNBLFNBQUEsT0FBQSxTQUFBLElBQUEsa0NBR0EsUUFBQSxlQUFBLFlBQUEsU0FBQSxHQUNBLE1BQUEsR0FBQSxtQ0FBQSxHQUFBLFNBQ0EsUUFBQSxPQUFBLFlBR0EsUUFBQSxXQUFBLFlBQUEsU0FBQSxHQUNBLE1BQUEsR0FBQSwrQkFBQSxHQUFBLFNBQ0EsUUFBQSxPQUFBLFlBR0EsUUFBQSxRQUFBLFdBQ0EsT0FDQSxJQUFBLFNBQUEsR0FDQSxTQUFBLE1BQUEsTUMzRUEsUUFBQSxPQUFBLFVBQUEsS0FBQSxpQkFBQSxTQUFBLEdBQUEsRUFBQSxJQUFBLHVCQUFBLDhnQkFDQSxFQUFBLElBQUEsOEJBQUEsbWlCQUNBLEVBQUEsSUFBQSwyQkFBQSxpdkNBQ0EsRUFBQSxJQUFBLHVCQUFBLHV2REFDQSxFQUFBLElBQUEsc0JBQUEsMlpBQ0EsRUFBQSxJQUFBLDBCQUFBLHF2RUFDQSxFQUFBLElBQUEsMEJBQUEsNENBQ0EsRUFBQSxJQUFBLDhCQUFBLDRPQUNBLEVBQUEsSUFBQSx1Q0FBQSxra0RBQ0EsRUFBQSxJQUFBLGlDQUFBLCtpSkFDQSxFQUFBLElBQUEsdUNBQUEsbXRCQUNBLEVBQUEsSUFBQSwrQkFBQSwrb0NBQ0EsRUFBQSxJQUFBLGdDQUFBLGtrREFDQSxFQUFBLElBQUEsdUNBQUEsMmpCQUNBLEVBQUEsSUFBQSxtQ0FBQSxvekRBQ0EsRUFBQSxJQUFBLCtCQUFBLHM2Q0FDQSxFQUFBLElBQUEsK0JBQUEsdXZDQUNBLEVBQUEsSUFBQSxtQ0FBQSxpWUFDQSxFQUFBLElBQUEsa0NBQUEsMlJBQ0EsRUFBQSxJQUFBLGlDQUFBLDJSQUNBLEVBQUEsSUFBQSxpQ0FBQSx3d0JBQ0EsRUFBQSxJQUFBLGtDQUFBLHNsQkNyQkEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxhQUFBLFFBQUEsU0FBQSxHQUNBLEVBQUEsSUFBQSxtQkNGQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGVBQUEsU0FBQSxlQUFBLFNBQUEsR0FDQSxFQUFBLFdBQUEsZ0JDRkEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxnQkFBQSxTQUFBLGVBQUEsUUFBQSxTQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsU0FBQSxHQUFBLEVBQUEsT0FBQSxHQUFBLEtBQUEsRUFBQSxPQUFBLE1BQUEsV0FDQSxHQUFBLElBQ0EsTUFBQSxnQkFDQSxRQUFBLDhCQUNBLEtBQUEsVUFDQSxRQUFBLE9BRUEsV0FDQSxHQUFBLElBQ0EsTUFBQSxrQkFDQSxRQUFBLHVGQUNBLEtBQUEsWUFHQSxFQUFBLEdBQUEsU0FBQSxHQUFBLEVBQUEsT0FBQSxRQ2hCQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGlCQUFBLFNBQUEsUUFBQSxTQUFBLFdBQUEsUUFBQSxlQUFBLGVBQUEsUUFBQSxTQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxPQUFBLEVBQ0EsR0FBQSxNQUFBLEVBQUEsS0FBQSxHQUFBLEdBQUEsV0FDQSxFQUFBLElBQUEsU0FBQSxFQUFBLE1BQUEsT0FDQSxFQUFBLE9BQUEsUUFBQSxLQUFBLEVBQUEsUUFDQSxXQUNBLEVBQUEsR0FBQSxjQUVBLEVBQUEsWUFBQSxXQUNBLEVBQUEsTUFBQSxRQUFBLEtBQUEsRUFBQSxTQUVBLEVBQUEsVUFBQSxXQUNBLE1BQUEsTUFBQSxVQUFBLEVBQUEsU0FBQSxLQUFBLFVBQUEsRUFBQSxRQUVBLEVBQUEsZUFBQSxXQUNBLE1BQUEsTUFBQSxVQUFBLEVBQUEsT0FBQSxRQUFBLEtBQUEsVUFBQSxFQUFBLE1BQUEsUUFFQSxFQUFBLE9BQUEsV0FDQSxHQUFBLEVBQUEsS0FBQSxPQUNBLEdBQUEsRUFBQSxpQkFDQSxDQUFBLEdBQUEsSUFDQSxNQUFBLFdBQ0EsUUFBQSxtR0FDQSxZQUFBLGdCQUNBLGVBQUEsRUFDQSxRQUFBLFdBQ0EsRUFBQSxNQUFBLGdCQUNBLFdBS0EsU0FHQSxDQUFBLEdBQUEsSUFDQSxNQUFBLGNBQ0EsUUFBQSwrREFDQSxLQUFBLFdBSUEsSUFBQSxHQUFBLFdBQ0EsRUFBQSxRQUNBLEdBQUEsR0FDQSxFQUFBLE1BQ0EsV0FDQSxHQUFBLElBQ0EsTUFBQSxnQkFDQSxRQUFBLDZDQUNBLEtBQUEsV0FFQSxHQUFBLE9BQUEsUUFBQSxLQUFBLEVBQUEsYUNyREEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxhQUFBLFNBQUEsUUFBQSxTQUFBLFFBQUEsUUFBQSxlQUFBLFNBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQ0EsR0FBQSxHQUFBLEVBQUEsT0FBQSxFQUVBLEdBQUEsTUFBQSxFQUFBLEtBQUEsR0FBQSxHQUFBLFdBRUEsRUFBQSxJQUFBLEVBQUEsTUFBQSxPQUVBLEVBQUEsU0FBQSxFQUFBLEtBQUEsU0FDQSxHQUFBLEVBQUEsTUFBQSxNQUVBLFVBQUEsS0FFQSxXQUNBLEVBQUEsR0FBQSxjQUdBLEVBQUEsVUFBQSxXQUNBLEVBQUEsTUFBQSxVQUFBLEVBQ0EsRUFBQSxRQUNBLEdBQUEsR0FDQSxFQUFBLE1BQ0EsV0FDQSxHQUFBLElBQ0EsTUFBQSxhQUNBLFFBQUEsNkNBQ0EsV0FBQSxVQUtBLEVBQUEsV0FBQSxXQUNBLEVBQUEsTUFBQSxVQUFBLEVBQ0EsRUFBQSxRQUNBLEdBQUEsR0FDQSxFQUFBLE1BQ0EsV0FDQSxHQUFBLElBQ0EsTUFBQSxlQUNBLFFBQUEsc0RBQ0EsV0FBQSxVQUtBLEVBQUEsVUFBQSxXQUNBLEVBQUEsR0FBQSxhQUFBLEdBQUEsRUFBQSxNQUFBLFVDOUNBLFFBQUEsT0FBQSxVQUNBLFdBQUEsWUFBQSxTQUFBLFNBQUEsUUFBQSxTQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsSUFBQSxxQ0FFQSxFQUFBLFNBQUEsV0FDQSxFQUFBLEdBQUEsZ0JDTEEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxrQkFBQSxTQUFBLFlBQUEsU0FBQSxFQUFBLEdBQ0EsRUFBQSxTQUFBLFNBQUEsR0FDQSxNQUFBLEdBQUEsUUFBQSxHQUNBLEdBRUEsTUNOQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGdCQUFBLFNBQUEsUUFBQSxTQUFBLFFBQUEsZUFBQSxlQUFBLFNBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBRUEsRUFBQSxNQUFBLHVCQUNBLEVBQUEsWUFBQSw2RkFDQSxFQUFBLFFBRUEsSUFBQSxJQUNBLG1CQUNBLG9CQUNBLGtCQUdBLEdBQUEsS0FBQSxDQUVBLElBQUEsR0FBQSxTQUFBLEdBQ0EsRUFBQSxLQUFBLEVBQ0EsRUFBQSxHQUFBLEVBQUEsRUFBQSxJQUdBLEdBQUEsRUFBQSxNQUdBLEVBQUEsT0FBQSxXQUNBLEdBQUEsRUFBQSxLQUFBLFFBQUEsRUFBQSxNQUFBLEVBQUEsT0FDQSxFQUFBLEtBQUEsYUFBQSxFQUFBLE9BQ0EsUUFBQSxTQUFBLEdBQ0EsRUFBQSxNQUFBLEVBQ0EsRUFBQSxTQUFBLEVBQUEsS0FBQSxTQUNBLEdBQUEsRUFBQSxNQUFBLE1BRUEsVUFBQSxJQUVBLEVBQUEsT0FDQSxFQUFBLEdBQUEsc0JBRUEsTUFBQSxXQUNBLEdBQUEsSUFDQSxNQUFBLFNBQ0EsUUFBQSxrRUFDQSxXQUFBLGFBR0EsSUFBQSxFQUFBLEtBQUEsT0FDQSxFQUFBLEtBQUEsZUFDQSxFQUFBLGVBRUEsQ0FBQSxHQUFBLElBQ0EsTUFBQSxjQUNBLFFBQUEsK0RBQ0EsS0FBQSxZQUtBLEVBQUEsU0FBQSxXQUNBLEVBQUEsRUFBQSxLQUFBLElBR0EsRUFBQSxTQUFBLFdBQ0EsRUFBQSxFQUFBLEtBQUEsT0M1REEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxvQkFBQSxRQUFBLGVBQUEsU0FBQSxTQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsUUFBQSxHQUFBLEVBQUEsT0FBQSxHQUFBLEtBQUEsRUFBQSxPQUFBLE1BQUEsV0FDQSxHQUFBLElBQ0EsTUFBQSxpQkFDQSxRQUFBLG1HQUNBLEtBQUEsVUFDQSxRQUFBLE9BRUEsV0FDQSxHQUFBLElBQ0EsTUFBQSxzQkFDQSxRQUFBLHNDQUNBLEtBQUEsWUFHQSxFQUFBLEdBQUEsU0FBQSxHQUFBLEVBQUEsT0FBQSxRQ2hCQSxRQUFBLE9BQUEsVUFDQSxVQUFBLFVBQUEsV0FDQSxNQUFBLFVBQUEsRUFBQSxFQUFBLEdBQ0EsR0FBQSxHQUFBLEVBQUEsT0FDQSxHQUFBLEtBQ0EsbUJBQUEsZUFBQSxFQUFBLGFDTEEsUUFBQSxPQUFBLFVBQ0EsVUFBQSxjQUFBLG9CQUFBLFNBQUEsR0FDQSxPQUNBLFNBQUEsSUFDQSxRQUFBLFVBQ0EsT0FDQSxNQUFBLFdBQ0EsUUFBQSxLQUVBLEtBQUEsU0FBQSxFQUFBLEVBQUEsRUFBQSxHQUNBLEdBQUEsR0FBQSxHQUFBLEdBQUEsRUFBQSxPQUNBLEVBQUEsRUFBQSxlQUVBLFNBQUEsUUFBQSxHQUFBLFlBQ0EsV0FBQSxFQUNBLGdCQUFBLElBRUEsR0FBQSxhQUFBLFNBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxLQUNBLElBQUEsRUFBQSxPQUFBLEVBQUEsT0FBQSxDQUNBLEdBQUEsR0FBQSxFQUFBLEVBQUEsT0FBQSxFQUNBLEdBQUEsUUFBQSxPQUNBLENBQ0EsR0FBQSxHQUFBLEVBQUEsVUFBQSxFQUFBLEVBQ0EsSUFDQSxFQUFBLFdBQUEsR0FFQSxFQUFBLGNBQUEsRUFBQSxZQUNBLEVBQUEsSUFFQSxFQUFBLFFBQUEsRUFBQSxZQUNBLEVBQUEsaUJBQUEsUUFBQSxXQUNBLEdBQUEsR0FBQSxRQUFBLFFBQUEsR0FBQSxXQUFBLFlBQ0EsRUFBQSxFQUFBLGVBQ0EsR0FBQSxRQUFBLEVBQUEsUUFDQSxRQUFBLFFBQUEsR0FBQSxXQUFBLFdBQUE7R0FHQSxFQUFBLFFBQUEsVUFBQSxTQUFBLEdBQ0EsRUFBQSxXQUFBLElBR0EsRUFBQSxZQUFBLFNBQUEsU0FBQSxHQUNBLE1BQUEsSUFBQSxHQUFBLEVBQUEsUUFHQSxHQUZBLFFBUUEsUUFBQSxvQkFBQSxXQUNBLE1BQUEsVUFBQSxHQUVBLEdBQUEsR0FBQSxLQUVBLE1BQUEsUUFBQSxTQUFBLEdBQ0EsRUFBQSxNQUFBLEtBQUEsSUFDQSxFQUFBLEtBQUEsU0FBQSxFQUFBLEdBQ0EsTUFBQSxNQUFBLFFBQUEsRUFBQSxLQUFBLEVBQUEsTUFBQSxHQUFBLEdBQ0EsS0FHQSxLQUFBLFdBQUEsU0FBQSxHQUNBLElBQUEsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLE9BQUEsSUFDQSxLQUFBLE9BQUEsRUFBQSxHQUFBLEtBQUEsSUFDQSxFQUFBLE9BQUEsRUFBQSxJQUlBLEtBQUEsU0FBQSxXQUNBLE1BQUEsR0FBQSxPQUFBLEVBQUEsRUFBQSxNQUVBLEtBQUEsY0FBQSxXQUVBLElBQUEsR0FEQSxNQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsT0FBQSxJQUNBLEVBQUEsS0FBQSxFQUFBLEdBQUEsS0FFQSxPQUFBLElBRUEsS0FBQSxVQUFBLFNBQUEsRUFBQSxHQUVBLElBQUEsR0FEQSxJQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsRUFBQSxPQUFBLElBQUEsQ0FDQSxHQUFBLENBQ0EsS0FBQSxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsT0FBQSxJQUNBLEtBQUEsT0FBQSxFQUFBLEdBQUEsRUFBQSxNQUNBLEdBQUEsRUFHQSxJQUFBLEVBQUEsTUFBQSxHQUFBLFFDMUZBLFFBQUEsT0FBQSxVQUNBLFVBQUEsY0FBQSxXQUFBLFVBQUEsZUFBQSxTQUFBLEVBQUEsRUFBQSxHQUNBLE9BQ0EsU0FBQSxJQUNBLFlBQUEsdUNBQ0EsT0FDQSxNQUFBLEtBRUEsS0FBQSxTQUFBLEdBQ0EsRUFBQSxVQUNBLElBQUEsR0FBQSxRQUFBLFFBQUEsa0JBQ0EsR0FBQSxXQUNBLEVBQUEsVUFBQSxFQUFBLEtBQUEsbUJBRUEsRUFBQSxjQUFBLFNBQUEsR0FDQSxHQUFBLElBQ0EsTUFBQSxnQkFDQSxRQUFBLGdEQUNBLFlBQUEsZUFDQSxXQUFBLGlCQUNBLGVBQUEsRUFDQSxRQUFBLFdBQ0EsRUFBQSxRQUFBLEdBQUEsRUFBQSxNQUFBLElBQUEsSUFBQSxFQUFBLEtBQUEsU0FBQSxHQUNBLEVBQUEsTUFBQSxRQUtBLEVBQUEsWUFBQSxXQUNBLEdBQUEsRUFBQSxZQUFBLE9BQUEsQ0FDQSxHQUFBLEdBQUEsR0FBQSxHQUFBLEVBQUEsUUFDQSxHQUFBLE9BQUEsR0FBQSxFQUFBLE1BQUEsS0FBQSxTQUFBLEdBQ0EsRUFBQSxNQUFBLEVBQ0EsRUFBQSxhQUVBLEVBQUEsWUFBQSxzQkNuQ0EsUUFBQSxPQUFBLFVBQ0EsVUFBQSxZQUFBLFlBQUEsU0FBQSxHQUNBLE9BQ0EsU0FBQSxJQUNBLEtBQUEsU0FBQSxFQUFBLEdBQ0EsRUFBQSxTQUFBLFlBQ0EsRUFBQSxNQUFBLENBRUEsSUFBQSxHQUFBLFNBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxLQUFBLEVBQUEsUUFBQSxPQUFBLENBQ0EsSUFDQSxFQUFBLFNBR0EsR0FBQSxPQUFBLFdBQ0EsRUFBQSxNQUFBLEVBQUEsS0FDQSxFQUFBLE1BQ0EsRUFBQSxTQUFBLFFBQ0EsRUFBQSxLQUFBLFFBQUEsS0FFQSxFQUFBLFlBQUEsUUFDQSxFQUFBLE9BQUEsUUFBQSxVQ3JCQSxRQUFBLE9BQUEsVUFDQSxRQUFBLGFBQUEsV0FDQSxLQUFBLGlCQUFBLDJDQUNBLEtBQUEsV0FBQSxHQUFBLFFBQUEsS0FBQSxrQkFDQSxLQUFBLFlBQUEsU0FBQSxFQUFBLEdBQ0EsTUFBQSxHQUFBLFNBQUEsRUFBQSxlQUNBLEVBQUEsUUFBQSxFQUFBLGNBQ0EsRUFBQSxVQUFBLEVBQUEsZ0JBQ0EsS0FHQSxVQUFBLFlBQUEsYUFBQSxTQUFBLEdBQ0EsT0FDQSxPQUNBLE1BQUEsSUFDQSxLQUFBLEtBRUEsWUFBQSwrQkFDQSxLQUFBLFNBQUEsR0FDQSxFQUFBLFVBRUEsRUFBQSxXQUFBLEVBQUEsV0FFQSxFQUFBLGlCQUFBLG1CQUFBLFNBQUEsR0FDQSxFQUFBLE9BQUEsS0FBQSxFQUFBLFlBQUEsRUFBQSxVQUdBLEVBQUEsaUJBQUEsb0JBQUEsU0FBQSxHQUNBLEVBQUEsT0FBQSxNQUFBLEVBQUEsWUFBQSxFQUFBLGdCQUtBLFVBQUEsYUFBQSxhQUFBLFNBQUEsR0FDQSxPQUNBLE9BQ0EsTUFBQSxJQUNBLEtBQUEsS0FFQSxZQUFBLGdDQUNBLEtBQUEsU0FBQSxHQUNBLEVBQUEsVUFFQSxFQUFBLGlCQUFBLG9CQUFBLFNBQUEsR0FDQSxFQUFBLE9BQUEsTUFBQSxFQUFBLFlBQUEsRUFBQSxXQUdBLEVBQUEsaUJBQUEsdUJBQUEsU0FBQSxHQUNBLEVBQUEsT0FBQSxTQUFBLEVBQUEsWUFBQSxFQUFBLG1CQU1BLFVBQUEsV0FBQSxXQUNBLE9BQ0EsT0FDQSxNQUFBLElBQ0EsS0FBQSxLQUVBLFlBQUEsa0NBR0EsVUFBQSxvQkFBQSxhQUFBLFNBQUEsR0FDQSxPQUNBLE9BQ0EsTUFBQSxJQUNBLEtBQUEsS0FFQSxZQUFBLHVDQUNBLEtBQUEsU0FBQSxHQUNBLEVBQUEsV0FBQSxFQUFBLHNCQUlBLFVBQUEsZ0JBQUEsUUFBQSxlQUFBLFNBQUEsRUFBQSxHQUNBLE9BQ0EsT0FDQSxNQUFBLElBQ0EsS0FBQSxLQUVBLFlBQUEsbUNBQ0EsS0FBQSxTQUFBLEdBQ0EsRUFBQSxZQUFBLFdBQ0EsRUFBQSxtQkFDQSxFQUFBLFFBQUEsR0FBQSxFQUFBLE1BQUEsS0FBQSxXQUNBLEVBQUEsbUJBQUEsQ0FDQSxJQUFBLElBQ0EsTUFBQSxzQkFDQSxRQUFBLHNGQUNBLFdBQUEsZUFPQSxVQUFBLGVBQUEsV0FDQSxPQUNBLE9BQ0EsTUFBQSxZQUVBLFFBQUEsVUFDQSxLQUFBLFNBQUEsRUFBQSxFQUFBLEVBQUEsR0FDQSxFQUFBLFNBQUEsZ0JBQ0EsSUFBQSxHQUFBLFdBQ0EsRUFBQSxNQUFBLG1CQUFBLEdBQUEsT0FDQSxFQUFBLFNBQUEsVUFFQSxFQUFBLFlBQUEsVUFHQSxHQUFBLE9BQUEsUUFBQSxHQUNBLEVBQUEsS0FBQSxRQUFBLFNBQUEsR0FDQSxFQUFBLE9BQUEsRUFBQSxNQUNBLEVBQUEsY0FBQSxFQUFBLE1BQUEsU0FLQSxVQUFBLFlBQUEsb0JBQUEsU0FBQSxHQUNBLE9BQ0EsT0FDQSxNQUFBLElBQ0EsS0FBQSxLQUVBLFlBQUEsK0JBQ0EsS0FBQSxTQUFBLEdBQ0EsR0FDQSxHQURBLEdBQUEsRUFFQSxFQUFBLEVBQUEsT0FBQSxjQUFBLFNBQUEsR0FDQSxJQUFBLEdBQ0EsSUFFQSxHQUFBLEVBQ0EsRUFBQSxHQUFBLEdBQUEsRUFBQSxNQUFBLE9BQ0EsRUFBQSxVQUFBLFNBQUEsR0FDQSxFQUFBLFdBQUEsV0FNQSxVQUFBLGNBQUEsV0FBQSxXQUNBLE9BQ0EsT0FDQSxNQUFBLFlBRUEsUUFBQSxVQUNBLEtBQUEsU0FBQSxFQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEscUJBQUEsS0FBQSxXQUNBLEVBQUEsTUFBQSxFQUFBLGNBR0EsRUFBQSxTQUFBLEtBQUEsU0FBQSxHQUNBLE1BQUEsR0FDQSxLQUFBLE1BQUEsR0FEQSxTQUlBLEVBQUEsWUFBQSxLQUFBLFNBQUEsR0FDQSxHQUFBLEVBQUEsU0FBQSxHQUFBLE9BQUEsQ0FDQSxJQUFBLEdBQUEsS0FBQSxNQUFBLEVBQ0EsT0FBQSxJQUNBLEVBQUEsY0FBQSxFQUFBLFNBQUEsYUFDQSxFQUFBLFdBQ0EsSUFFQSxRQ3ZLQSxRQUFBLE9BQUEsVUFDQSxVQUFBLFFBQUEsV0FBQSxjQUFBLGVBQUEsU0FBQSxFQUFBLEVBQUEsR0FDQSxPQUNBLFNBQUEsSUFDQSxZQUFBLGlDQUNBLE9BQ0EsTUFBQSxLQUVBLEtBQUEsU0FBQSxHQUNBLEVBQUEsWUFDQSxFQUFBLGNBQ0EsSUFBQSxLQUVBLEdBQUEsTUFBQSxTQUFBLEtBQUEsU0FBQSxHQUdBLElBQUEsR0FGQSxJQUFBLGVBQUEsZ0JBQUEsZ0JBQUEsYUFDQSxLQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsT0FBQSxJQUFBLENBQ0EsR0FBQSxJQUFBLEtBQUEsRUFBQSxHQUNBLEdBQUEsUUFDQSxLQUFBLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxNQUFBLE9BQUEsSUFBQSxDQUNBLEdBQUEsR0FBQSxLQUFBLFNBQUEsRUFDQSxHQUFBLE1BQUEsR0FBQSxFQUVBLEVBQUEsS0FBQSxHQUVBLEVBQUEsU0FBQSxJQUVBLEVBQUEsT0FBQSxTQUFBLEdBQ0EsR0FBQSxJQUNBLE1BQUEsVUFBQSxFQUFBLEtBQUEsSUFDQSxRQUFBLG1DQUFBLEVBQUEsS0FBQSxrQkFDQSxZQUFBLGVBQ0EsV0FBQSxpQkFDQSxlQUFBLEVBQ0EsUUFBQSxXQUNBLEVBQUEsUUFBQSxHQUFBLEVBQUEsTUFBQSxJQUFBLElBQUEsRUFBQSxLQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsUUFLQSxFQUFBLFVBQUEsU0FBQSxHQUVBLElBQUEsR0FEQSxHQUFBLEVBQUEsR0FDQSxFQUFBLEVBQUEsRUFBQSxFQUFBLE9BQUEsSUFDQSxHQUFBLEVBQUEsR0FBQSxFQUFBLE9BQUEsQ0FFQSxRQUFBLEdBRUEsRUFBQSxhQUFBLFNBQUEsR0FDQSxFQUFBLEdBQUEsQ0FDQSxLQUFBLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxNQUFBLGFBQUEsT0FBQSxJQUNBLEVBQUEsTUFBQSxhQUFBLEdBQUEsTUFBQSxJQUFBLEVBQUEsSUFFQSxPQUFBLEdBQUEsSUFFQSxFQUFBLE9BQUEsU0FBQSxHQUNBLEVBQUEsUUFDQSxHQUFBLEVBQUEsTUFBQSxJQUNBLElBQUEsRUFBQSxLQUNBLElBRUEsRUFBQSxLQUFBLFNBQUEsR0FDQSxFQUFBLFNBQUEsRUFBQSxNQUFBLGFBQUEsUUFBQSxJQUFBLFFBQUEsS0FBQSxJQUVBLEVBQUEsT0FBQSxTQUFBLEdBQ0EsRUFBQSxNQUFBLGFBQUEsR0FBQSxFQUFBLFNBQUEsSUFFQSxFQUFBLEtBQUEsV0FDQSxHQUFBLEVBQUEsUUFBQSxPQUFBLENBQ0EsR0FBQSxHQUFBLEdBQUEsR0FBQSxFQUFBLFlBQ0EsR0FBQSxPQUFBLEdBQUEsRUFBQSxNQUFBLEtBQUEsU0FBQSxHQUNBLEVBQUEsTUFBQSxFQUNBLEVBQUEsaUJBRUEsRUFBQSxRQUFBLHNCQzFFQSxRQUFBLE9BQUEsVUFDQSxPQUFBLFdBQUEsVUFBQSxTQUFBLEdBQ0EsTUFBQSxVQUFBLEdBQ0EsR0FBQSxFQUFBLENBQ0EsR0FBQSxHQUFBLEtBQUEsTUFBQSxHQUNBLEdBQUEsR0FBQSxPQUFBLFVBQ0EsRUFBQSxFQUFBLEVBQ0EsRUFBQSxLQUFBLE1BQUEsRUFBQSxLQUNBLEVBQUEsS0FBQSxNQUFBLEVBQUEsSUFDQSxFQUFBLEtBQUEsTUFBQSxFQUFBLElBQ0EsRUFBQSxLQUFBLE1BQUEsRUFBQSxHQUNBLE9BQUEsR0FBQSxHQUNBLE1BQUEsRUFBQSxRQUFBLEVBQUEsVUFDQSxFQUFBLEVBQ0EsRUFBQSxZQUNBLEdBQUEsRUFDQSxZQUNBLEVBQUEsRUFDQSxFQUFBLGFBQ0EsR0FBQSxFQUNBLGNBQ0EsRUFBQSxFQUNBLEVBQUEsZUFDQSxHQUFBLEVBQ0EsZUFFQSx5QkMxQkEsUUFBQSxPQUFBLFVBQ0EsUUFBQSxnQkFBQSxXQUFBLFNBQUEsR0FFQSxNQUFBLFVBQUEsR0FDQSxHQUFBLEVBQ0EsR0FBQSxHQUNBLFlBQUEsOEJBQ0EsYUFBQSxRQUNBLFdBQUEsV0FDQSxLQUFBLE1BQUEsRUFBQSxNQUNBLEtBQUEsUUFBQSxFQUFBLFFBQ0EsS0FBQSxRQUFBLEVBQUEsUUFBQSxXQUFBLEVBQUEsVUFBQSxFQUFBLGVBQUEsRUFDQSxLQUFBLE9BQUEsRUFBQSxXQUNBLEtBQUEsWUFBQSxFQUFBLGFBQUEsVUFDQSxLQUFBLFdBQUEsRUFBQSxZQUFBLFNBQ0EsS0FBQSxjQUFBLEVBQUEsaUJBR0EsRUFBQSxXQUVBLEtBQUEsUUFBQSxXQUNBLEVBQUEsa0JDckJBLFFBQUEsT0FBQSxVQUNBLFFBQUEsZ0JBQUEsV0FBQSxXQUFBLFNBQUEsRUFBQSxHQUNBLE1BQUEsVUFBQSxHQUNBLEdBQUEsRUFDQSxHQUFBLEdBQ0EsWUFBQSw4QkFDQSxhQUFBLGVBQ0EsV0FBQSxXQUNBLEtBQUEsTUFBQSxFQUFBLE1BQ0EsS0FBQSxRQUFBLEVBQUEsUUFDQSxLQUFBLE1BQUEsRUFBQSxXQUNBLEtBQUEsS0FBQSxFQUFBLElBQ0EsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUNBLEdBQUEsRUFBQSxXQUFBLE1BR0EsRUFBQSxXQUVBLEtBQUEsUUFBQSxXQUNBLEVBQUEiLCJmaWxlIjoicHVibGljL2J1aWxkL2FwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknLCBbJ3VpLnJvdXRlcicsJ25nUmVzb3VyY2UnLCdidGZvcmQubW9kYWwnLCduZ1RhZ3NJbnB1dCcsJ25nQW5pbWF0ZSddKVxuICAgIC5jb25maWcoZnVuY3Rpb24oJHN0YXRlUHJvdmlkZXIsICR1cmxSb3V0ZXJQcm92aWRlciwgJGxvY2F0aW9uUHJvdmlkZXIpe1xuICAgICAgICAkbG9jYXRpb25Qcm92aWRlci5odG1sNU1vZGUodHJ1ZSk7XG4gICAgICAgICR1cmxSb3V0ZXJQcm92aWRlci5vdGhlcndpc2UoXCIvbm90Zm91bmRcIilcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcbiAgICAgICAgLnN0YXRlKCdpbmRleCcse1xuICAgICAgICAgICAgdXJsIDogJy8nLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2hvbWUuaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogJ0hvbWVDdHJsJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ25ld2V2ZW50Jyx7XG4gICAgICAgICAgICB1cmwgOiAnL25ldycsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvbmV3RXZlbnQvbGF5b3V0Lmh0bWwnLFxuICAgICAgICAgICAgY29udHJvbGxlciA6ICdOZXdFdmVudEN0cmwnLFxuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ25ld2V2ZW50LmdlbmVyYWwnLCB7XG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvbmV3RXZlbnQvZ2VuZXJhbC5odG1sJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ25ld2V2ZW50LmRhdGV0aW1lJywge1xuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL25ld0V2ZW50L2RhdGV0aW1lLmh0bWwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnbmV3ZXZlbnQuaW52aXRlJywge1xuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL25ld0V2ZW50L2ludml0ZS5odG1sJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ25ld2V2ZW50LnN1Y2Nlc3MnLCB7XG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvbmV3RXZlbnQvc3VjY2Vzcy5odG1sJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ2Fib3V0Jywge1xuICAgICAgICAgICAgdXJsIDogJy9hYm91dCcsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvYWJvdXQuaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogJ0Fib3V0Q3RybCdcbiAgICAgICAgfSlcbiAgICAgICAgLnN0YXRlKCdub3Rmb3VuZCcsIHtcbiAgICAgICAgICAgIHVybCA6ICcvbm90Zm91bmQnLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL25vdGZvdW5kLmh0bWwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnZXZlbnQnLHtcbiAgICAgICAgICAgIHVybCA6ICcvOmlkJyxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9ldmVudC5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnRXZlbnRDdHJsJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ2VkaXRldmVudCcsIHtcbiAgICAgICAgICAgIHVybDogJy86aWQvZWRpdCcsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZWRpdGV2ZW50Lmh0bWwnLFxuICAgICAgICAgICAgY29udHJvbGxlciA6ICdFZGl0RXZlbnRDdHJsJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ3ZlcmlmeWV2ZW50Jywge1xuICAgICAgICAgICAgdXJsIDogJy92ZXJpZnkvOmlkL2NvZGUvOmNvZGUnLFxuICAgICAgICAgICAgY29udHJvbGxlciA6ICdWZXJpZmljYXRpb25DdHJsJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ2RlbGV0ZWV2ZW50Jywge1xuICAgICAgICAgICAgdXJsIDogJy9kZWxldGUvOmlkL2NvZGUvOmNvZGUnLFxuICAgICAgICAgICAgY29udHJvbGxlciA6ICdEZWxldGlvbkN0cmwnXG4gICAgICAgIH0pXG4gICAgfSlcbiAgICAuZmFjdG9yeSgnRXZlbnQnLCBmdW5jdGlvbigkcmVzb3VyY2Upe1xuICAgICAgICByZXR1cm4gJHJlc291cmNlKCcvYXBpL2V2ZW50LzppZCcsIHsgaWQgOiAnQF9pZCcgfSwge1xuICAgICAgICAgICAgJ3VwZGF0ZScgOiB7IG1ldGhvZCA6ICdQVVQnIH0sXG4gICAgICAgICAgICAndmVyaWZ5JyA6IHsgbWV0aG9kIDogJ0dFVCcsIHVybCA6ICcvYXBpL2V2ZW50LzppZC9jb2RlLzpjb2RlJyB9LFxuICAgICAgICAgICAgJ2Rlc3Ryb3knOiB7IG1ldGhvZCA6ICdERUxFVEUnLCB1cmw6ICcvYXBpL2V2ZW50LzppZC9jb2RlLzpjb2RlJyB9XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLmZhY3RvcnkoJ1BhcnRpY2lwYW50JywgZnVuY3Rpb24oJHJlc291cmNlKXtcbiAgICAgICAgcmV0dXJuICRyZXNvdXJjZSgnL2FwaS9ldmVudC86aWQvcGFydGljaXBhbnQvOnBpZCcsIHsgaWQ6ICdAX2lkJ30sIHtcbiAgICAgICAgICAgICd1cGRhdGUnIDogeyBtZXRob2QgOiAnUFVUJyB9XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLmZhY3RvcnkoJ0NvbW1lbnQnLCBmdW5jdGlvbigkcmVzb3VyY2Upe1xuICAgICAgICByZXR1cm4gJHJlc291cmNlKCcvYXBpL2V2ZW50LzppZC9jb21tZW50LzpjaWQnLCB7IGlkIDogJ0BfaWQnIH0sIHtcbiAgICAgICAgICAgICd1cGRhdGUnIDogeyBtZXRob2QgOiAnUFVUJyB9XG4gICAgICAgIH0pXG4gICAgfSlcbiAgICAuZmFjdG9yeSgnVGl0bGUnLCBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0IDogZnVuY3Rpb24odGl0bGUpe1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gdGl0bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiIsImFuZ3VsYXIubW9kdWxlKFwicmFsbGx5XCIpLnJ1bihbXCIkdGVtcGxhdGVDYWNoZVwiLCBmdW5jdGlvbigkdGVtcGxhdGVDYWNoZSkgeyR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9hYm91dC5odG1sXCIsXCI8ZGl2IHN0eWxlPVxcXCJtYXgtd2lkdGg6NjAwcHhcXFwiPlxcbiAgICA8aDE+V2hhdCBpcyBSYWxsbHk/PC9oMT5cXG4gICAgPGRpdiBjbGFzcz1cXFwicmwtcGFnZS1kZXNjXFxcIj5SYWxsbHkgaXMgYSBjb2xsYWJvcmF0aXZlIHNjaGVkdWxpbmcgc2VydmljZSB0aGF0IG1ha2VzIGRlY2lkaW5nIG9uIGEgZGF0ZSBmYXN0IGFuZCBlYXN5LjwvZGl2PlxcbiAgICA8aDI+SGksIElcXCdtIEx1a2UhPC9oMj5cXG4gICAgPHA+XFxuICAgICAgICBJIGNyZWF0ZWQgUmFsbGx5IGFzIHNpZGUgcHJvamVjdCB0byBoZWxwIG1lIGxlYXJuIHNvbWUgbmV3IHRlY2hub2xvZ2llcy4gSSBkZWNpZGVkIHRvIHB1Ymxpc2ggaXQgYmVjYXVzZSBJIHRob3VnaHQgb3RoZXIgcGVvcGxlIG1pZ2h0IGZpbmQgaXQgdXNlZnVsLiBSYWxsbHkgaXMgYSBjb21wbGV0ZWx5IGZyZWUgc2VydmljZS4gSW4gZmFjdCBpdCBpcyBldmVuIG9wZW4gc291cmNlLiBZb3UgY2FuIGxvb2sgYXQgdGhlIGxhdGVzdCBzb3VyY2UgY29kZSBvbiBHaXRodWIuXFxuICAgIDwvcD5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvY29uZmlybW1vZGFsLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInJsLW1vZGFsLW92ZXJsYXlcXFwiIG5nLWNsaWNrPVxcXCJtb2RhbC5jYW5jZWwoKVxcXCI+PC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwicmwtbW9kYWxcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJybC1tb2RhbC10aXRsZVxcXCI+e3ttb2RhbC50aXRsZX19PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJsLW1vZGFsLW1lc3NhZ2VcXFwiPlxcbiAgICAgICAge3ttb2RhbC5tZXNzYWdlfX1cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJsLW1vZGFsLWFjdGlvbnNcXFwiPlxcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIG5nLWNsaWNrPVxcXCJtb2RhbC5jb25maXJtKClcXFwiIG5nLXNob3c9XFxcIm1vZGFsLmNvbmZpcm1cXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLWNsYXNzPVxcXCJ7ZGFuZ2VyIDogbW9kYWwuaXNEZXN0cnVjdGl2ZX1cXFwiPnt7bW9kYWwuY29uZmlybVRleHR9fTwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIG5nLWNsaWNrPVxcXCJtb2RhbC5jYW5jZWwoKVxcXCIgIGNsYXNzPVxcXCJidG5cXFwiPnt7bW9kYWwuY2FuY2VsVGV4dH19PC9idXR0b24+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9lZGl0ZXZlbnQuaHRtbFwiLFwiPGRpdiBuZy1zaG93PVxcXCJldmVudC5faWRcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJib3hcXFwiPlxcblxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LXRpdGxlXFxcIj5FZGl0IEV2ZW50PC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgICAgIFlvdSBjYW4gbWFrZXMgY2hhbmdlcyB0byB5b3VyIGV4aXN0aW5nIGV2ZW50IGJ5IGNoYW5naW5nIHRoZSBmaWVsZHMgaW4gdGhlIGZvcm0gYmVsb3cuXFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDxmb3JtIG5vdmFsaWRhdGUgbmFtZT1cXFwiZm9ybVxcXCIgbmctc3VibWl0PVxcXCJzdWJtaXQoKVxcXCI+XFxuXFxuICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XFxcImJveC1zZWN0aW9uXFxcIiB1c2VyLWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICA8L3NlY3Rpb24+XFxuXFxuICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XFxcImJveC1zZWN0aW9uXFxcIiBldmVudC1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICAgICAgPC9zZWN0aW9uPlxcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgZGF0ZS1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICAgICAgPC9zZWN0aW9uPlxcblxcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgc2V0dGluZ3MtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtY29udHJvbHMgYm94LWJvdHRvbS1zdGlja3lcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcInN1Ym1pdFxcXCIgbmctc2hvdz1cXFwiZGlkQ2hhbmdlKClcXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIG5nLWNsYXNzPVxcXCJ7ZGlzYWJsZWQgOiAhZGlkQ2hhbmdlKCl9XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIFNhdmUgQ2hhbmdlc1xcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIG5nLWNsaWNrPVxcXCJ1bmRvQ2hhbmdlcygpXFxcIiBjbGFzcz1cXFwiYnRuXFxcIiBuZy1zaG93PVxcXCJkaWRDaGFuZ2UoKVxcXCI+VW5kbyBDaGFuZ2VzPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XFxcIi97e2V2ZW50Ll9pZH19XFxcIiBjbGFzcz1cXFwiYnRuXFxcIiBuZy1oaWRlPVxcXCJkaWRDaGFuZ2UoKVxcXCI+RG9uZTwvYT5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwvZm9ybT5cXG5cXG4gICAgPC9kaXY+XFxuXFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2V2ZW50Lmh0bWxcIixcIjxkaXYgbmctc2hvdz1cXFwiZXZlbnQuX2lkICYmICFldmVudC5pc0RlbGV0ZWRcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJib3ggXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImV2ZW50LWhlYWRlclxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXZhdGFyXFxcIj5cXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXZlbnRpY29uLnBuZ1xcXCIgd2lkdGg9XFxcIjMyXFxcIiAvPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRldGFpbHNcXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0aXRsZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICB7e2V2ZW50LnRpdGxlfX1cXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJ0aXRsZS1sYWJlbCBkYW5nZXJcXFwiIG5nLXNob3c9XFxcImV2ZW50LmlzQ2xvc2VkXFxcIj5Qb2xsIENsb3NlZDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJ0aXRsZS1sYWJlbCBzdWNjZXNzXFxcIiBuZy1oaWRlPVxcXCJldmVudC5pc0Nsb3NlZFxcXCI+UG9sbCBPcGVuPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwic3VidGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlZCBieSA8YSBocmVmPVxcXCJtYWlsdG86e3tldmVudC5jcmVhdG9yLmVtYWlsfX1cXFwiPnt7ZXZlbnQuY3JlYXRvci5uYW1lfX08L2E+ICZidWxsOyB7e2V2ZW50LmNyZWF0ZWQgfCBlbGFwc2VkfX1cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWN0aW9uc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcImJ0blxcXCIgbmctY2xpY2s9XFxcImVkaXRFdmVudCgpXFxcIj5FZGl0IEV2ZW50PC9idXR0b24+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1zaWRlLXN0aWNreSBldmVudC1kZXNjcmlwdGlvblxcXCIgbmctc2hvdz1cXFwiZXZlbnQuZGVzY3JpcHRpb25cXFwiPnt7ZXZlbnQuZGVzY3JpcHRpb259fTwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LWJvdHRvbS1zdGlja3kgZXZlbnQtbG9jYXRpb25cXFwiIG5nLXNob3c9XFxcImV2ZW50LmxvY2F0aW9uXFxcIj5cXG4gICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9sb2NhdGlvbi5wbmdcXFwiIHdpZHRoPVxcXCIxOFxcXCIgLz48YSBocmVmPVxcXCJodHRwOi8vZ29vZ2xlLmNvbS9tYXBzP3E9e3tldmVudC5sb2NhdGlvbn19XFxcIiB0YXJnZXQ9XFxcIl9ibGFua1xcXCI+e3tldmVudC5sb2NhdGlvbn19PC9hPlxcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJib3ggYm94LXgtc2Nyb2xsXFxcIj5cXG4gICAgICAgIDxkaXYgcG9sbCBldmVudD1cXFwiZXZlbnRcXFwiIGNsYXNzPVxcXCJwb2xsXFxcIj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYm94XFxcIiBuZy1oaWRlPVxcXCJldmVudC5jb21tZW50cy5sZW5ndGggPT0gMCAmJiBldmVudC5pc0Nsb3NlZFxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgIERpc2N1c3Npb25cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LWRlc2NyaXB0aW9uXFxcIj5cXG4gICAgICAgICAgICBZb3UgY2FuIGRpc2N1c3MgdGhlIGV2ZW50IHdpdGggeW91ciBmcmllbmRzIGJ5IGxlYXZpbmcgYSBjb21tZW50IGJlbG93LlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGRpc2N1c3Npb24gZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvaG9tZS5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJwYWdlLXBsYWNlaG9sZGVyXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiaW1hZ2VcXFwiPlxcbiAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvbWFya19sYXJnZS5wbmdcXFwiIHdpZHRoPVxcXCI2N1xcXCIgLz5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInRpdGxlXFxcIj5cXG4gICAgICAgIFNjaGVkdWxlIGFuIEV2ZW50XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJjb250ZW50XFxcIj5cXG4gICAgICAgIFdhbnQgdG8gaG9zdCBhbiBldmVudCBidXQgY2Fu4oCZdCBkZWNpZGUgb24gYSBkYXRlPyBDbGljayBvbiB0aGUgYnV0dG9uIGJlbG93IHRvIHN0YXJ0IVxcbiAgICA8L2Rpdj5cXG4gICAgPGJ1dHRvbiBuZy1jbGljaz1cXFwibmV3RXZlbnQoKVxcXCIgY2xhc3M9XFxcImJ0blxcXCI+U2NoZWR1bGUgTmV3IEV2ZW50PC9idXR0b24+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL25ld2V2ZW50Lmh0bWxcIixcIjxkaXYgbmctaWY9XFxcIiFldmVudFVybFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCIgbmctY2xhc3M9XFxcIntcXCdhbmltYXRlZCBzaGFrZVxcJzogZm9ybS4kc3VibWl0dGVkICYmIGZvcm0uJGludmFsaWQgfVxcXCI+XFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtdGl0bGVcXFwiPlNjaGVkdWxlIGEgTmV3IEV2ZW50PC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgICAgIEZpbGwgaW4gdGhlIGZvcm0gYmVsb3cgdG8gY3JlYXRlIHlvdXIgZXZlbnQgYW5kIHNoYXJlIGl0IHdpdGggeW91ciBmcmllbmRzIGFuZCBjb2xsZWFndWVzLlxcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIiBuYW1lPVxcXCJmb3JtXFxcIiBuZy1zdWJtaXQ9XFxcInN1Ym1pdCgpXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IG5nLWlmPVxcXCJwYWdlID09IDFcXFwiPlxcblxcbiAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIHVzZXItZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XFxuXFxuICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgZXZlbnQtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBuZy1pZj1cXFwicGFnZT09MlxcXCI+XFxuXFxuICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgZGF0ZS1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XFxcImJveC1zZWN0aW9uXFxcIiBuZy1zaG93PVxcXCJldmVudC5kYXRlcy5sZW5ndGhcXFwiIHRpbWUtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XFxuICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgPGRpdiBuZy1pZj1cXFwicGFnZT09M1xcXCI+XFxuXFxuICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XFxcImJveC1zZWN0aW9uXFxcIiBwYXJ0aWNpcGFudHMtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtY29udHJvbHMgYm94LWJvdHRvbS1zdGlja3lcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctaWY9XFxcInBhZ2UhPTFcXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLWNsaWNrPVxcXCJwcmV2UGFnZSgpXFxcIj5CYWNrPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBuZy1pZj1cXFwicGFnZSE9M1xcXCIgY2xhc3M9XFxcImJ0blxcXCIgbmctY2xpY2s9XFxcIm5leHRQYWdlKClcXFwiPk5leHQ8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIG5nLWlmPVxcXCJwYWdlPT0zXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIj5DcmVhdGUgRXZlbnQ8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwvZm9ybT5cXG4gICAgPC9kaXY+XFxuXFxuPC9kaXY+XFxuPGRpdiBuZy1pZj1cXFwiZXZlbnRVcmxcXFwiIGNsYXNzPVxcXCJib3hcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJib3gtbWVzc2FnZVxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibWFpbi1pbWFnZVxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3N1Y2Nlc3NfbGFyZ2UucG5nXFxcIiB3aWR0aD1cXFwiMTAwXFxcIiAvPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ0aXRsZVxcXCI+RXZlbnQgQ3JlYXRlZDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJjb250ZW50XFxcIj5cXG4gICAgICAgIFlvdXIgZXZlbnQgaGFzIGJlZW4gY3JlYXRlZCBzdWNjZXNzZnVsbHkhIFlvdSBzaG91bGQgcmVjZWl2ZSBhbiBlbWFpbCBzaG9ydGx5IHdpdGggaW5zdHJ1Y3Rpb25zIHRvIHZlcmlmeSB5b3VyIGVtYWlsIGFkZHJlc3MuXFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJtaW5pLWRpdmlkZXJcXFwiPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgZGlzYWJsZWQ9XFxcInRydWVcXFwiIHZhbHVlPVxcXCJ7e2V2ZW50VXJsfX1cXFwiIC8+XFxuICAgICAgICA8YSBocmVmPVxcXCJ7e2V2ZW50VXJsfX1cXFwiIGNsYXNzPVxcXCJidG4gZm9ybS1idG5cXFwiPkdPPC9hPlxcbiAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL25vdGZvdW5kLmh0bWxcIixcIjxoMT5FcnJvciA0MDQ8L2gxPlxcbjxoMj5Ob3QgRm91bmQ8L2gyPlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9ub3RpZmljYXRpb24uaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwibm90aWZpY2F0aW9uIHt7bm90aWZpY2F0aW9uLnR5cGV9fVxcXCIgbmctY2xpY2s9XFxcIm5vdGlmaWNhdGlvbi5jbG9zZSgpXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPlxcbiAgICAgICAge3tub3RpZmljYXRpb24udGl0bGV9fVxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwibWVzc2FnZVxcXCI+XFxuICAgICAgICB7e25vdGlmaWNhdGlvbi5tZXNzYWdlfX1cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2RpcmVjdGl2ZXMvZGlzY3Vzc2lvbi5odG1sXCIsXCI8dWwgY2xhc3M9XFxcImNvbW1lbnQtdGhyZWFkXFxcIiBuZy1zaG93PVxcXCJldmVudC5jb21tZW50cy5sZW5ndGhcXFwiPlxcbiAgICA8bGkgbmctcmVwZWF0PVxcXCJjb21tZW50IGluIGV2ZW50LmNvbW1lbnRzXFxcIiBjbGFzcz1cXFwiY29tbWVudFxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhdmF0YXItc2VjdGlvblxcXCI+XFxuICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvYXZhdGFyLnBuZ1xcXCIgLz5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29tbWVudC1zZWN0aW9uXFxcIj5cXG4gICAgICAgICAgICA8YSBocmVmPVxcXCIjXFxcIiBjbGFzcz1cXFwiY29tbWVudC1kZWxldGVcXFwiIG5nLWNsaWNrPVxcXCJkZWxldGVDb21tZW50KGNvbW1lbnQpXFxcIj4mdGltZXM7PC9hPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1ldGFcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibmFtZVxcXCI+e3tjb21tZW50LmF1dGhvci5uYW1lfX08L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJ0aW1lXFxcIj57e2NvbW1lbnQuY3JlYXRlZCB8IGVsYXBzZWR9fTwvc3Bhbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb250ZW50XFxcIj57e2NvbW1lbnQuY29udGVudH19PC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9saT5cXG48L3VsPlxcbjxmb3JtIG5vdmFsaWRhdGUgbmctc3VibWl0PVxcXCJwb3N0Q29tbWVudCgpXFxcIiBuYW1lPVxcXCJjb21tZW50Rm9ybVxcXCIgY2xhc3M9XFxcImNvbW1lbnQtZm9ybVxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImF2YXRhci1zZWN0aW9uXFxcIj5cXG4gICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2F2YXRhci5wbmdcXFwiIC8+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJpbnB1dC1zZWN0aW9uIGZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29udGVudC1zZWN0aW9uXFxcIj5cXG4gICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgcmVxdWlyZWQgbmctbW9kZWw9XFxcImNvbW1lbnQuY29udGVudFxcXCIgcGxhY2Vob2xkZXI9XFxcIldyaXRlIGEgY29tbWVudC4uLlxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibmFtZS1zZWN0aW9uXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJuYW1lLWNvbnRhaW5lclxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cXFwiWW91ciBOYW1lXFxcIiBuZy1tb2RlbD1cXFwiY29tbWVudC5hdXRob3IubmFtZVxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIGNsYXNzPVxcXCJidG5cXFwiPlBvc3QgQ29tbWVudDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZm9ybS1lcnJvclxcXCIgbmctc2hvdz1cXFwiY29tbWVudEZvcm0uJHN1Ym1pdHRlZCAmJiBjb21tZW50Rm9ybS4kZXJyb3JcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IE1ha2Ugc3VyZSB5b3UgZmlsbCBpbiBhbGwgdGhlIGZpZWxkcy5cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZm9ybT5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9wb2xsLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInBvbGwtaGVhZGVyXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiaGVhZGVyIHBhcnRpY2lwYW50cy1oZWFkZXJcXFwiPlxcbiAgICAgICAge3tldmVudC5wYXJ0aWNpcGFudHMubGVuZ3RofX0gcGFydGljaXBhbnRzXFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJoZWFkZXIgZGF0ZS1oZWFkZXJcXFwiIG5nLXJlcGVhdD1cXFwiZCBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRpY29uXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkb3dcXFwiPlxcbiAgICAgICAgICAgICAgICB7e2QuZGF0ZSB8IGRhdGU6IFxcJ0VFRVxcJ319XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF5XFxcIj5cXG4gICAgICAgICAgICAgICAge3tkLmRhdGUgfCBkYXRlOiBcXCdkXFwnfX1cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb250aFxcXCI+XFxuICAgICAgICAgICAgICAgIHt7ZC5kYXRlIHwgZGF0ZSA6IFxcJ01NTVxcJ319XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNvdW50XFxcIiBuZy1zaG93PVxcXCJzZWxlY3RlZERhdGUoJGluZGV4KVxcXCIgbmctY2xhc3M9e3RvcDppc1RvcERhdGUoJGluZGV4KX0+e3tzZWxlY3RlZERhdGUoJGluZGV4KX19PC9zcGFuPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJoZWFkZXIgYWN0aW9ucy1oZWFkZXJcXFwiPlxcblxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPVxcXCJwb2xsLWJvZHlcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJwb2xsLWVudHJ5XFxcIiBuZy1yZXBlYXQ9XFxcInBhcnRpY2lwYW50IGluIGV2ZW50LnBhcnRpY2lwYW50c1xcXCI+XFxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIG5nLXN1Ym1pdD1cXFwidXBkYXRlKHBhcnRpY2lwYW50KTsgZWRpdE1vZGUgPSBmYWxzZVxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCBuYW1lLWNlbGxcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiYXZhdGFyIHN0eWxlLXt7JGluZGV4ICsgMX19XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3VzZXIucG5nXFxcIiB3aWR0aD1cXFwiMTFcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBuZy1tb2RlbD1cXFwicGFydGljaXBhbnQubmFtZVxcXCIgbmctc2hvdz1cXFwiZWRpdE1vZGVcXFwiIHZhbHVlPVxcXCJwYXJ0aWNpcGFudC5uYW1lXFxcIi8+XFxuICAgICAgICAgICAgICAgIDxzcGFuIG5nLWhpZGU9XFxcImVkaXRNb2RlXFxcIiBjbGFzcz1cXFwibmFtZSBlZGl0YWJsZVxcXCIgbmctY2xpY2s9XFxcImVkaXRNb2RlID0gdHJ1ZSAmJiAhZXZlbnQuaXNDbG9zZWQ7IGVkaXQocGFydGljaXBhbnQpXFxcIj57e3BhcnRpY2lwYW50Lm5hbWV9fTwvc3Bhbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjZWxsIHZvdGUtY2VsbFxcXCIgbmctcmVwZWF0PVxcXCJkYXRlIGluIGV2ZW50LmRhdGVzXFxcIj5cXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvdGlja0AyeC5wbmdcXFwiICB3aWR0aD1cXFwiMTZcXFwiIG5nLWhpZGU9XFxcImVkaXRNb2RlXFxcIiBuZy1pZj1cXFwicGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvbm9wZUAyeC5wbmdcXFwiIHdpZHRoPVxcXCI4XFxcIiBuZy1oaWRlPVxcXCJlZGl0TW9kZVxcXCIgbmctaWY9XFxcIiFwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdXFxcIiAvPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgbmctbW9kZWw9XFxcInBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF1cXFwiIG5nLXNob3c9XFxcImVkaXRNb2RlXFxcIiBuZy1mYWxzZS12YWx1ZT1cXFwiZmFsc2VcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiAvPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJvdmVybGF5XFxcIiBuZy1zaG93PVxcXCJlZGl0TW9kZVxcXCIgbmctY2xpY2s9XFxcInBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF0gPSAhcGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCBhY3Rpb24tY2VsbFxcXCIgbmctaGlkZT1cXFwiZXZlbnQuaXNDbG9zZWRcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctaGlkZT1cXFwiZWRpdE1vZGVcXFwiIG5nLWNsaWNrPVxcXCJlZGl0TW9kZSA9IHRydWU7IGVkaXQocGFydGljaXBhbnQpXFxcIiBjbGFzcz1cXFwiYnRuIGhvdmVyXFxcIj5FZGl0PC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBuZy1oaWRlPVxcXCJlZGl0TW9kZVxcXCIgbmctY2xpY2s9XFxcImRlbGV0ZShwYXJ0aWNpcGFudClcXFwiIGNsYXNzPVxcXCJidG4gZGFuZ2VyIGhvdmVyXFxcIj5EZWxldGU8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIG5nLXNob3c9XFxcImVkaXRNb2RlXFxcIiBjbGFzcz1cXFwiYnRuXFxcIj5TYXZlPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBuZy1zaG93PVxcXCJlZGl0TW9kZVxcXCIgbmctY2xpY2s9XFxcImVkaXRNb2RlID0gZmFsc2U7IGNhbmNlbCgkaW5kZXgpXFxcIiBjbGFzcz1cXFwiYnRuXFxcIj5DYW5jZWw8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZm9ybT5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInBvbGwtZXhhbXBsZVxcXCIgbmctY2xhc3M9XFxcIntoaWRkZW4gOiBldmVudC5wYXJ0aWNpcGFudHMubGVuZ3RoID4gMH1cXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicG9sbC1lbnRyeVxcXCIgbmctcmVwZWF0PVxcXCJleGFtcGxlIGluIGV4YW1wbGVzXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjZWxsIG5hbWUtY2VsbFxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJhdmF0YXIgc3R5bGUte3skaW5kZXggKyAxfX1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvdXNlci5wbmdcXFwiIHdpZHRoPVxcXCIxMVxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibmFtZVxcXCI+e3tleGFtcGxlLm5hbWV9fTwvc3Bhbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjZWxsIHZvdGUtY2VsbFxcXCIgbmctcmVwZWF0PVxcXCJkYXRlIGluIGV2ZW50LmRhdGVzXFxcIj5cXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvdGlja0AyeC5wbmdcXFwiICB3aWR0aD1cXFwiMTZcXFwiIG5nLWlmPVxcXCJleGFtcGxlLmRhdGVzWyRpbmRleF1cXFwiIC8+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL25vcGVAMngucG5nXFxcIiB3aWR0aD1cXFwiOFxcXCIgbmctaWY9XFxcIiFleGFtcGxlLmRhdGVzWyRpbmRleF1cXFwiIC8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCBhY3Rpb24tY2VsbFxcXCI+XFxuXFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm92ZXJsYXlcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm92ZXJsYXktdGV4dFxcXCI+XFxuICAgICAgICAgICAgICAgIEZpbGwgaW4gdGhlIGZvcm0gYmVsb3cgdG8gZ2V0IHN0YXJ0ZWRcXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBuZy1oaWRlPVxcXCJldmVudC5pc0Nsb3NlZFxcXCIgY2xhc3M9XFxcInBvbGwtZW50cnkgaGlnaGxpZ2h0XFxcIj5cXG4gICAgICAgIDxmb3JtIG5vdmFsaWRhdGUgbmFtZT1cXFwiZm9ybW5ld1xcXCIgbmctc3VibWl0PVxcXCJzYXZlKClcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNlbGwgbmFtZS1jZWxsXFxcIj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImF2YXRhciBzdHlsZS17e3BhcnRpY2lwYW50LnN0eWxlfX1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvdXNlci5wbmdcXFwiIHdpZHRoPVxcXCIxMVxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIG5hbWU9XFxcInVzZXJuYW1lXFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBwbGFjZWhvbGRlcj1cXFwiWW91ciBuYW1lLi4uXFxcIiBuZy1tb2RlbD1cXFwicGFydGljaXBhbnQubmFtZVxcXCIgcmVxdWlyZWQgdmFsdWU9XFxcInBhcnRpY2lwYW50Lm5hbWVcXFwiLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjZWxsIHZvdGUtY2VsbFxcXCIgbmctcmVwZWF0PVxcXCJkYXRlIGluIGV2ZW50LmRhdGVzXFxcIj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IG5nLW1vZGVsPVxcXCJwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdXFxcIiBuZy1mYWxzZS12YWx1ZT1cXFwiZmFsc2VcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiAvPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJvdmVybGF5XFxcIiBuZy1jbGljaz1cXFwicGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XSA9ICFwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjZWxsIGFjdGlvbi1jZWxsXFxcIj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIG5nLWNsYXNzPVxcXCJ7IFxcJ2FuaW1hdGVkIHNoYWtlXFwnIDogZm9ybW5ldy4kc3VibWl0dGVkICYmIGZvcm1uZXcuJGludmFsaWQgIH1cXFwiIGNsYXNzPVxcXCJidG5cXFwiPlNhdmU8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZm9ybT5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2RpcmVjdGl2ZXMvdGltZVBpY2tlci5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJ0aW1lLXBpY2tlclxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInRpbWUtcGlja2VyLWNvbFxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRpY29uXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkb3dcXFwiPlxcbiAgICAgICAgICAgICAgICB7e2RhdGUgfCBkYXRlOiBcXCdFRUVcXCd9fVxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRheVxcXCI+XFxuICAgICAgICAgICAgICAgIHt7ZGF0ZSB8IGRhdGU6IFxcJ2RcXCd9fVxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vbnRoXFxcIj5cXG4gICAgICAgICAgICAgICAge3tkYXRlIHwgZGF0ZSA6IFxcJ01NTVxcJ319XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cXFwiZGVsZXRlXFxcIiBuZy1jbGljaz1cXFwiZGF0ZXBpY2tlci51bnNldERhdGUoZGF0ZSlcXFwiPjwvc3Bhbj4gLS0+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInRpbWUtcGlja2VyLWNvbFxcXCIgbmctcmVwZWF0PVxcXCJ0aW1lIGluIGRhdGUudGltZXMgdHJhY2sgYnkgJGluZGV4XFxcIj5cXG4gICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwidGltZS1waWNrZXItaW5wdXRcXFwiIHRpbWUtcGlja2VyIG5nLW1vZGVsPVxcXCJ0aW1lXFxcIiBuZy1tb2RlbC1vcHRpb25zPVxcXCJ7IHVwZGF0ZU9uOiBcXCdibHVyXFwnIH1cXFwiIC8+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9mb3JtL2RhdGVGb3JtLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPkNob29zZSBEYXRlczwvZGl2PlxcbiAgICA8dWwgY2xhc3M9XFxcImRhdGljb24tbGlzdFxcXCI+XFxuICAgICAgICA8bGkgbmctcmVwZWF0PVxcXCJkIGluIGV2ZW50LmRhdGVzXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRpY29uXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZG93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIHt7ZC5kYXRlIHwgZGF0ZTogXFwnRUVFXFwnfX1cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRheVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICB7e2QuZGF0ZSB8IGRhdGU6IFxcJ2RcXCd9fVxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9udGhcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAge3tkLmRhdGUgfCBkYXRlIDogXFwnTU1NXFwnfX1cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJkZWxldGVcXFwiIG5nLWNsaWNrPVxcXCJkYXRlcGlja2VyLnVuc2V0RGF0ZShkLmRhdGUpXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2xpPlxcbiAgICA8L3VsPlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tbWFpblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tcm93XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImVtYWlsXFxcIj5DYWxlbmRhcjwvbGFiZWw+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImZvcm0tZXJyb3JcXFwiIG5nLXNob3c9XFxcImZvcm0uJHN1Ym1pdHRlZCAmJiBmb3JtLmRhdGVwaWNrZXIuJGVycm9yLnJlcXVpcmVkXFxcIj5cXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IFlvdSBuZWVkIHRvIHNlbGVjdCBhIGZldyBkYXRlc1xcbiAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8ZGl2IGRhdGVwaWNrZXIgcmVxdWlyZWQgbmFtZT1cXFwiZGF0ZXBpY2tlclxcXCIgY29udHJvbD1cXFwiZGF0ZXBpY2tlclxcXCIgbmctbW9kZWw9XFxcImV2ZW50LmRhdGVzXFxcIj5cXG5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZm9ybS9ldmVudEZvcm0uaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1kZXRhaWxzXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic2VjdGlvbi10aXRsZVxcXCI+RXZlbnQgRGV0YWlsczwvZGl2PlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tbWFpblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tcm93XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tY29sXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwidGl0bGVcXFwiPlRpdGxlPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImZvcm0tZXJyb3JcXFwiIG5nLXNob3c9XFxcIihmb3JtLnRpdGxlLiR0b3VjaGVkIHx8IGZvcm0uJHN1Ym1pdHRlZCkgJiYgZXJyb3JzLnRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2Vycm9yLnBuZ1xcXCIgd2lkdGg9XFxcIjE0XFxcIiAvPiB7e2Vycm9ycy50aXRsZX19XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJ0aXRsZVxcXCIgbmFtZT1cXFwidGl0bGVcXFwiIG5nLW1heGxlbmd0aD1cXFwiMzBcXFwiIHJlcXVpcmVkIG5nLW1vZGVsPVxcXCJldmVudC50aXRsZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgcGxhY2Vob2xkZXI9XFxcIk1vbnRobHkgTWVldHVwLi4uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGV4dGVuZFxcXCIvPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWNvbFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cCBvcHRpb25hbFxcXCI+XFxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImxvY2F0aW9uXFxcIj5Mb2NhdGlvbjwvbGFiZWw+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJmb3JtLWVycm9yXFxcIiBuZy1zaG93PVxcXCIoZm9ybS5sb2NhdGlvbi4kdG91Y2hlZCB8fCBmb3JtLiRzdWJtaXR0ZWQpICYmIGVycm9ycy5sb2NhdGlvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9lcnJvci5wbmdcXFwiIHdpZHRoPVxcXCIxNFxcXCIgLz4ge3tlcnJvcnMubG9jYXRpb259fVxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwibG9jYXRpb25cXFwiIG5hbWU9XFxcImxvY2F0aW9uXFxcIiBuZy1tb2RlbD1cXFwiZXZlbnQubG9jYXRpb25cXFwiIG5nLW1heGxlbmd0aD1cXFwiNTBcXFwiIHR5cGU9XFxcInRleHRcXFwiIHBsYWNlaG9sZGVyPVxcXCJSaWNrXFwncyBDYWZlLi4uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGV4dGVuZFxcXCIvPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwIG9wdGlvbmFsXFxcIj5cXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJkZXNjcmlwdGlvblxcXCIgPkRlc2NyaXB0aW9uPC9sYWJlbD5cXG4gICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XFxcImRlc2NyaXB0aW9uXFxcIiBuYW1lPVxcXCJkZXNjcmlwdGlvblxcXCIgbmctbW9kZWw9XFxcImV2ZW50LmRlc2NyaXB0aW9uXFxcIiBwbGFjZWhvbGRlcj1cXFwiRW50ZXIgRGVzY3JpcHRpb24uLi5cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgZXh0ZW5kXFxcIj48L3RleHRhcmVhPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9mb3JtL3BhcnRpY2lwYW50c0Zvcm0uaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1kZXRhaWxzXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic2VjdGlvbi10aXRsZVxcXCI+SW52aXRlIFBhcnRpY2lwYW50czwvZGl2PlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tbWFpblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tcm93XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXAgb3B0aW9uYWxcXFwiPlxcbiAgICAgICAgICAgIDxsYWJlbD5QYXJ0aWNpcGFudFxcJ3MgRW1haWxzPC9sYWJlbD5cXG4gICAgICAgICAgICA8dGFncy1pbnB1dCBtYXgtbGVuZ3RoPVxcXCI1MFxcXCIgYWxsb3dlZC10YWdzLXBhdHRlcm49XFxcInt7ZW1haWxSZWdleH19XFxcIiBkaXNwbGF5LXByb3BlcnR5PVxcXCJlbWFpbFxcXCIgbmctbW9kZWw9XFxcImV2ZW50LmVtYWlsc1xcXCIgcGxhY2Vob2xkZXI9XFxcIkFkZCBhbiBFbWFpbFxcXCIgdHlwZT1cXFwiZW1haWxcXFwiIGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIj48L3RhZ3MtaW5wdXQ+XFxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImhpZGRlblxcXCIgbmFtZT1cXFwic2hvdWxkQ3JlYXRlXFxcIiB2YWx1ZT1cXFwidHJ1ZVxcXCIgLz5cXG5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG48L3NlY3Rpb24+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2Zvcm0vc2V0dGluZ3NGb3JtLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPlNldHRpbmdzPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1tYWluXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3dpdGNoLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2gtZGV0YWlsc1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICBQb2xsIFN0YXR1c1xcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRlc2NyaXB0aW9uXFxcIj5cXG4gICAgICAgICAgICAgICAgTGV0IHBlb3BsZSB2b3RlIG9uIHRoZSBwb2xsLlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2hcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN3aXRjaC12YWx1ZVxcXCI+XFxuICAgICAgICAgICAgICAgIHt7ZXZlbnQuaXNDbG9zZWQgPyBcXCdDbG9zZWRcXCcgOiBcXCdPcGVuXFwnIH19XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBzd2l0Y2gtdG9nZ2xlIG5nLW1vZGVsPVxcXCJldmVudC5pc0Nsb3NlZFxcXCIgaW52ZXJ0PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2gtcm93XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInN3aXRjaC1kZXRhaWxzXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0aXRsZVxcXCI+XFxuICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbnNcXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgICAgIFNlbmQgZW1haWwgbm90aWZpY2F0aW9ucyB0byB0aGUgY3JlYXRvciBvZiB0aGlzIGV2ZW50LlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2hcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN3aXRjaC12YWx1ZVxcXCI+XFxuICAgICAgICAgICAgICAgIHt7ZXZlbnQuY3JlYXRvci5hbGxvd05vdGlmaWNhdGlvbnMgPyBcXCdFbmFibGVkXFwnIDogXFwnRGlzYWJsZWRcXCcgfX1cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IHN3aXRjaC10b2dnbGUgbmctbW9kZWw9XFxcImV2ZW50LmNyZWF0b3IuYWxsb3dOb3RpZmljYXRpb25zXFxcIj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3dpdGNoLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2gtZGV0YWlsc1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICBEZWxldGUgRXZlbnRcXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgICAgIE9uY2UgeW91IGRlbGV0ZSBhbiBldmVudCBpdCB3aWxsIG5vIGxvbmdlciBiZSBhY2Nlc3NpYmxlLlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2hcXFwiPlxcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBuZy1jbGljaz1cXFwiZGVsZXRlRXZlbnQoKVxcXCIgY2xhc3M9XFxcImJ0blxcXCIgbmctY2xhc3M9XFxcIntkYW5nZXIgOiAhZGVsZXRlUmVxdWVzdFNlbnQsIGRpc2FibGVkIDogZGVsZXRlUmVxdWVzdFNlbnR9XFxcIj57e2RlbGV0ZVJlcXVlc3RTZW50ID8gXFwnUmVxdWVzdCBTZW50XFwnIDogXFwnRGVsZXRlIEV2ZW50XFwnIH19PC9idXR0b24+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuPC9zZWN0aW9uPlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9mb3JtL3RpbWVGb3JtLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPkNob29zZSBUaW1lczwvZGl2PlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tbWFpblxcXCI+XFxuICAgIDx0YWJsZSBjbGFzcz1cXFwidGltZS1mb3JtXFxcIj5cXG4gICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgIDx0aD5cXG5cXG4gICAgICAgICAgICAgICAgPC90aD5cXG4gICAgICAgICAgICAgICAgPHRoPlxcbiAgICAgICAgICAgICAgICAgICAgVGltZSAxXFxuICAgICAgICAgICAgICAgIDwvdGg+XFxuICAgICAgICAgICAgICAgIDx0aD5cXG4gICAgICAgICAgICAgICAgICAgIFRpbWUgMlxcbiAgICAgICAgICAgICAgICA8L3RoPlxcbiAgICAgICAgICAgICAgICA8dGg+XFxuICAgICAgICAgICAgICAgICAgICBUaW1lIDNcXG4gICAgICAgICAgICAgICAgPC90aD5cXG4gICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgPC90aGVhZD5cXG4gICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICA8dHIgbmctcmVwZWF0PVxcXCJkIGluIGV2ZW50LmRhdGVzXFxcIj5cXG4gICAgICAgICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0aWNvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZG93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkLmRhdGUgfCBkYXRlOiBcXCdFRUVcXCd9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRheVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZC5kYXRlIHwgZGF0ZTogXFwnZFxcJ319XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9udGhcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2QuZGF0ZSB8IGRhdGUgOiBcXCdNTU1cXCd9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJkZWxldGVcXFwiIG5nLWNsaWNrPVxcXCJ1bnNldERhdGUoZC5kYXRlKVxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgIDx0ZCBuZy1yZXBlYXQ9XFxcInRpbWUgaW4gWzEsMiwzXSB0cmFjayBieSAkaW5kZXhcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcInRleHRcXFwiIHRpbWUtcGlja2VyIG5nLW1vZGVsLW9wdGlvbnM9XFxcInsgdXBkYXRlT246IFxcJ2JsdXJcXCcgfVxcXCIgbmctbW9kZWw9XFxcImQudGltZXNbJGluZGV4XVxcXCIgY2xhc3M9XFxcInRpbWUtcGlja2VyLWlucHV0XFxcIiAvPlxcbiAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICA8L3Rib2R5PlxcbiAgICA8L3RhYmxlPlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9mb3JtL3VzZXJGb3JtLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPllvdXIgRGV0YWlsczwvZGl2PlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tbWFpblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tcm93XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tY29sXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwibmFtZVxcXCI+TmFtZTwvbGFiZWw+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJmb3JtLWVycm9yXFxcIiBuZy1zaG93PVxcXCIoZm9ybS5uYW1lLiR0b3VjaGVkIHx8IGZvcm0uJHN1Ym1pdHRlZCkgJiYgZXJyb3JzLm5hbWVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IHt7ZXJyb3JzLm5hbWV9fVxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwibmFtZVxcXCIgbmFtZT1cXFwibmFtZVxcXCIgbmctbWF4bGVuZ3RoPVxcXCIzMFxcXCIgcmVxdWlyZWQgbmctbW9kZWw9XFxcImV2ZW50LmNyZWF0b3IubmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgcGxhY2Vob2xkZXI9XFxcIkpvaG4gRG9lLi4uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGV4dGVuZFxcXCIvPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWNvbFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImVtYWlsXFxcIj5FbWFpbDwvbGFiZWw+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJmb3JtLWVycm9yXFxcIiBuZy1zaG93PVxcXCIoZm9ybS5lbWFpbC4kdG91Y2hlZCB8fCBmb3JtLiRzdWJtaXR0ZWQpICYmIGVycm9ycy5lbWFpbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9lcnJvci5wbmdcXFwiIHdpZHRoPVxcXCIxNFxcXCIgLz4ge3tlcnJvcnMuZW1haWx9fVxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJlbWFpbFxcXCIgaWQ9XFxcImVtYWlsXFxcIiBuYW1lPVxcXCJlbWFpbFxcXCIgbmctcGF0dGVybj1cXFwiZW1haWxSZWdleFxcXCIgcmVxdWlyZWQgbmctbW9kZWw9XFxcImV2ZW50LmNyZWF0b3IuZW1haWxcXFwiIHBsYWNlaG9sZGVyPVxcXCJqb2huLmRvZUBlbWFpbC5jb20uLi5cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgZXh0ZW5kXFxcIi8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL25ld0V2ZW50L2RhdGV0aW1lLmh0bWxcIixcIjxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgZGF0ZS1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuPC9zZWN0aW9uPlxcblxcbjxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgbmctc2hvdz1cXFwiZXZlbnQuZGF0ZXMubGVuZ3RoXFxcIiB0aW1lLWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG48L3NlY3Rpb24+XFxuXFxuPGRpdiBjbGFzcz1cXFwiYm94LWNvbnRyb2xzIGJveC1ib3R0b20tc3RpY2t5XFxcIj5cXG4gICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLWNsaWNrPVxcXCJwcmV2UGFnZSgpXFxcIj5QcmV2aW91czwvYnV0dG9uPlxcbiAgICA8YnV0dG9uIHR5cGU9XFxcInN1Ym1pdFxcXCIgY2xhc3M9XFxcImJ0blxcXCI+TmV4dDwvYnV0dG9uPlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9uZXdFdmVudC9nZW5lcmFsLmh0bWxcIixcIjxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgdXNlci1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuPC9zZWN0aW9uPlxcblxcbjxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgZXZlbnQtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbjwvc2VjdGlvbj5cXG5cXG48ZGl2IGNsYXNzPVxcXCJib3gtY29udHJvbHMgYm94LWJvdHRvbS1zdGlja3lcXFwiPlxcbiAgICA8YnV0dG9uIHR5cGU9XFxcInN1Ym1pdFxcXCIgY2xhc3M9XFxcImJ0blxcXCI+TmV4dCBTdGVwPC9idXR0b24+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL25ld0V2ZW50L2ludml0ZS5odG1sXCIsXCI8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIHBhcnRpY2lwYW50cy1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuPC9zZWN0aW9uPlxcblxcbjxkaXYgY2xhc3M9XFxcImJveC1jb250cm9scyBib3gtYm90dG9tLXN0aWNreVxcXCI+XFxuICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuXFxcIiBuZy1jbGljaz1cXFwicHJldlBhZ2UoKVxcXCI+UHJldmlvdXM8L2J1dHRvbj5cXG4gICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIGNsYXNzPVxcXCJidG5cXFwiPkNyZWF0ZTwvYnV0dG9uPlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9uZXdFdmVudC9sYXlvdXQuaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwiYm94XFxcIj5cXG5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYm94LXRpdGxlXFxcIj5TY2hlZHVsZSBhIE5ldyBFdmVudDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJib3gtZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgRmlsbCBpbiB0aGUgZm9ybSBiZWxvdyB0byBjcmVhdGUgeW91ciBldmVudCBhbmQgc2hhcmUgaXQgd2l0aCB5b3VyIGZyaWVuZHMgYW5kIGNvbGxlYWd1ZXMuXFxuICAgIDwvZGl2PlxcbiAgICA8b2wgY2xhc3M9XFxcImJveC1zdGVwc1xcXCI+XFxuICAgICAgICA8bGkgY2xhc3M9XFxcInN0ZXAgYWN0aXZlXFxcIj5cXG4gICAgICAgICAgICBHZW5lcmFsIERldGFpbHNcXG4gICAgICAgIDwvbGk+XFxuICAgICAgICA8bGkgY2xhc3M9XFxcInN0ZXBcXFwiIG5nLWNsYXNzPVxcXCJ7IGFjdGl2ZSA6IHBhZ2UgPiAxIH1cXFwiPlxcbiAgICAgICAgICAgIERhdGVzICZhbXA7IFRpbWVzXFxuICAgICAgICA8L2xpPlxcbiAgICAgICAgPGxpIGNsYXNzPVxcXCJzdGVwXFxcIiBuZy1jbGFzcz1cXFwieyBhY3RpdmUgOiBwYWdlID4gMiB9XFxcIj5cXG4gICAgICAgICAgICBJbnZpdGVzXFxuICAgICAgICA8L2xpPlxcbiAgICAgICAgPGxpIGNsYXNzPVxcXCJzdGVwXFxcIiBuZy1jbGFzcz1cXFwieyBhY3RpdmUgOiBwYWdlID4gMyB9XFxcIj5cXG4gICAgICAgICAgICBEb25lXFxuICAgICAgICA8L2xpPlxcbiAgICA8L29sPlxcbiAgICA8Zm9ybSBub3ZhbGlkYXRlIGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIiBuYW1lPVxcXCJmb3JtXFxcIiBuZy1zdWJtaXQ9XFxcInN1Ym1pdCgpXFxcIj5cXG4gICAgICAgIDxkaXYgdWktdmlldz5cXG5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Zvcm0+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL25ld0V2ZW50L3N1Y2Nlc3MuaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwiYm94LW1lc3NhZ2VcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJtYWluLWltYWdlXFxcIj5cXG4gICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3N1Y2Nlc3NfbGFyZ2UucG5nXFxcIiB3aWR0aD1cXFwiMTAwXFxcIiAvPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPkV2ZW50IENyZWF0ZWQ8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiY29udGVudFxcXCI+XFxuICAgICAgICBZb3VyIGV2ZW50IGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ISBZb3Ugc2hvdWxkIHJlY2VpdmUgYW4gZW1haWwgc2hvcnRseSB3aXRoIGluc3RydWN0aW9ucyB0byB2ZXJpZnkgeW91ciBlbWFpbCBhZGRyZXNzLlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwibWluaS1kaXZpZGVyXFxcIj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcInRleHRcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIGRpc2FibGVkPVxcXCJ0cnVlXFxcIiB2YWx1ZT1cXFwie3tldmVudFVybH19XFxcIiAvPlxcbiAgICAgICAgPGEgaHJlZj1cXFwie3tldmVudFVybH19XFxcIiBjbGFzcz1cXFwiYnRuIGZvcm0tYnRuXFxcIj5HTzwvYT5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO31dKTsiLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdBYm91dEN0cmwnLCBmdW5jdGlvbihUaXRsZSl7XG4gICAgVGl0bGUuc2V0KCdBYm91dCBSYWxsbHknKVxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdBY2NvdW50Q3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgQ29uZmlybU1vZGFsKXtcbiAgICAkc2NvcGUuc2hvd05vdGljZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIFxuICAgIH1cbn0pXG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdEZWxldGlvbkN0cmwnLCBmdW5jdGlvbigkc3RhdGUsIE5vdGlmaWNhdGlvbiwgRXZlbnQpe1xuICAgIEV2ZW50LmRlc3Ryb3koe2lkIDogJHN0YXRlLnBhcmFtcy5pZCwgY29kZSA6JHN0YXRlLnBhcmFtcy5jb2RlfSwgZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgdGl0bGUgOiAnRXZlbnQgZGVsZXRlZCcsXG4gICAgICAgICAgICBtZXNzYWdlIDogJ1RoaXMgZXZlbnQgaGFzIGJlZW4gZGVsZXRlZCcsXG4gICAgICAgICAgICB0eXBlIDogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgdGltZW91dCA6IDUwMDBcbiAgICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24oZSl7XG4gICAgICAgIHZhciBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIHRpdGxlIDogJ0RlbGV0aW9uIEZhaWxlZCcsXG4gICAgICAgICAgICBtZXNzYWdlIDogJ1RoZSBldmVudCBjb3VsZCBub3QgYmUgZGVsZXRlZC4gTWFrZSBzdXJlIHRoYXQgaXQgZXhpc3RzIGFuZCB0aGF0IHRoZSB1cmwgaXMgY29ycmVjdCcsXG4gICAgICAgICAgICB0eXBlIDogJ2Vycm9yJ1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICAkc3RhdGUuZ28oJ2V2ZW50JywgeyBpZCA6ICRzdGF0ZS5wYXJhbXMuaWQgfSk7XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0VkaXRFdmVudEN0cmwnLCBmdW5jdGlvbigkc2NvcGUsICRodHRwLCAkc3RhdGUsICR0aW1lb3V0LCBFdmVudCwgQ29uZmlybU1vZGFsLCBOb3RpZmljYXRpb24sIFRpdGxlKXtcbiAgICB2YXIgaWQgPSAkc3RhdGUucGFyYW1zLmlkXG4gICAgJHNjb3BlLmV2ZW50ID0gRXZlbnQuZ2V0KHtpZDppZH0sIGZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBUaXRsZS5zZXQoXCJFZGl0OiBcIiArICRzY29wZS5ldmVudC50aXRsZSk7XG4gICAgICAgICRzY29wZS5tYXN0ZXIgPSBhbmd1bGFyLmNvcHkoJHNjb3BlLmV2ZW50KTtcbiAgICB9LCBmdW5jdGlvbihlKXtcbiAgICAgICAgJHN0YXRlLmdvKCdub3Rmb3VuZCcpO1xuICAgIH0pO1xuICAgICRzY29wZS51bmRvQ2hhbmdlcyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICRzY29wZS5ldmVudCA9IGFuZ3VsYXIuY29weSgkc2NvcGUubWFzdGVyKTtcbiAgICB9XG4gICAgJHNjb3BlLmRpZENoYW5nZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSgkc2NvcGUubWFzdGVyKSAhPSBKU09OLnN0cmluZ2lmeSgkc2NvcGUuZXZlbnQpO1xuICAgIH1cbiAgICAkc2NvcGUuZGlkQ2hhbmdlRGF0ZXMgPSBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoJHNjb3BlLm1hc3Rlci5kYXRlcykgIT0gSlNPTi5zdHJpbmdpZnkoJHNjb3BlLmV2ZW50LmRhdGVzKTtcbiAgICB9XG4gICAgJHNjb3BlLnN1Ym1pdCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmICgkc2NvcGUuZm9ybS4kdmFsaWQpe1xuICAgICAgICAgICAgaWYgKCRzY29wZS5kaWRDaGFuZ2VEYXRlcygpICl7XG4gICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlIDogJ0hvbGQgdXAhJyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdDaGFuZ2luZyB0aGUgZGF0ZXMgd2lsbCByZXNldCBhbGwgZW50cmllcyBieSB0aGUgcGFydGljaXBhbnRzLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG8gdGhhdD8nLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dCA6ICdZZXMsIElcXCdtIHN1cmUnLFxuICAgICAgICAgICAgICAgICAgICBpc0Rlc3RydWN0aXZlIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybSA6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZXZlbnQucGFydGljaXBhbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgICAgIHRpdGxlIDogJ05vdCBzbyBmYXN0JyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ01ha2Ugc3VyZSB5b3UgZmlsbCBpbiBhbGwgdGhlIHJlcXVpcmVkIGZpZWxkcyBhbmQgdHJ5IGFnYWluLicsXG4gICAgICAgICAgICAgICAgdHlwZSA6ICdlcnJvcidcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciB1cGRhdGUgPSBmdW5jdGlvbigpe1xuICAgICAgICBFdmVudC51cGRhdGUoe1xuICAgICAgICAgICAgaWQgOiBpZFxuICAgICAgICB9LCAkc2NvcGUuZXZlbnQsXG4gICAgICAgIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB2YXIgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgdGl0bGUgOiAnQ2hhbmdlcyBTYXZlZCcsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdZb3VyIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgIHR5cGUgOiAnc3VjY2VzcydcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJHNjb3BlLm1hc3RlciA9IGFuZ3VsYXIuY29weSgkc2NvcGUuZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0V2ZW50Q3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgJGh0dHAsICRzdGF0ZSwgVGl0bGUsIEV2ZW50LCBDb25maXJtTW9kYWwpe1xuICAgIHZhciBpZCA9ICRzdGF0ZS5wYXJhbXMuaWQ7XG4gICAgLy8gR2V0IEV2ZW50XG4gICAgJHNjb3BlLmV2ZW50ID0gRXZlbnQuZ2V0KHtpZDppZH0sIGZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICAvLyBTZXQgdGhlIHBhZ2UgdGl0bGUgdG8gdGhlIGV2ZW50IHRpdGxlXG4gICAgICAgIFRpdGxlLnNldCgkc2NvcGUuZXZlbnQudGl0bGUpO1xuICAgICAgICAvLyBHZW5lcmF0ZSBldmVudCB1cmwgLSBpLmUuIGh0dHA6Ly9yYWxsbHkuY28vakY5Rl9GZFxuICAgICAgICAkc2NvcGUuZXZlbnRVcmwgPSAkc3RhdGUuaHJlZignZXZlbnQnLCB7XG4gICAgICAgICAgICBpZDogJHNjb3BlLmV2ZW50Ll9pZFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBhYnNvbHV0ZSA6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24oZSl7XG4gICAgICAgICRzdGF0ZS5nbygnbm90Zm91bmQnKTtcbiAgICB9KTtcblxuICAgICRzY29wZS5vcGVuRXZlbnQgPSBmdW5jdGlvbigpe1xuICAgICAgICAkc2NvcGUuZXZlbnQuaXNDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgRXZlbnQudXBkYXRlKHtcbiAgICAgICAgICAgIGlkIDogaWRcbiAgICAgICAgfSwgJHNjb3BlLmV2ZW50LFxuICAgICAgICBmdW5jdGlvbigpe1xuICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICAgICAgdGl0bGUgOiAnRXZlbnQgT3BlbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdQZW9wbGUgY2FuIHZvdGUgYW5kIGNvbW1lbnQgb24gdGhpcyBldmVudC4nLFxuICAgICAgICAgICAgICAgIGNhbmNlbFRleHQgOiAnT0snLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgICRzY29wZS5jbG9zZUV2ZW50ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgJHNjb3BlLmV2ZW50LmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgRXZlbnQudXBkYXRlKHtcbiAgICAgICAgICAgIGlkIDogaWRcbiAgICAgICAgfSwgJHNjb3BlLmV2ZW50LFxuICAgICAgICBmdW5jdGlvbigpe1xuICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICAgICAgdGl0bGUgOiAnRXZlbnQgQ2xvc2VkJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ1Blb3BsZSBjYW4gbm8gbG9uZ2VyIHZvdGUgb3IgY29tbWVudCBvbiB0aGlzIGV2ZW50LicsXG4gICAgICAgICAgICAgICAgY2FuY2VsVGV4dCA6ICdPSycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgJHNjb3BlLmVkaXRFdmVudCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICRzdGF0ZS5nbygnZWRpdGV2ZW50JywgeyBpZCA6ICRzY29wZS5ldmVudC5faWQgfSk7XG4gICAgfVxuXG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0hvbWVDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkc3RhdGUsIFRpdGxlKXtcbiAgICBUaXRsZS5zZXQoJ1JhbGxseSAtIENvbGxhYm9yYXRpdmUgU2NoZWR1bGluZycpXG5cbiAgICAkc2NvcGUubmV3RXZlbnQgPSBmdW5jdGlvbigpe1xuICAgICAgICAkc3RhdGUuZ28oJ25ld2V2ZW50Jyk7XG4gICAgfVxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdOYXZpZ2F0aW9uQ3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgJGxvY2F0aW9uKXtcbiAgICAkc2NvcGUuaXNBY3RpdmUgPSBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIGlmICgkbG9jYXRpb24ucGF0aCgpID09IHBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG59KVxuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uY29udHJvbGxlcignTmV3RXZlbnRDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkaHR0cCwgJHN0YXRlLCBFdmVudCwgQ29uZmlybU1vZGFsLCBOb3RpZmljYXRpb24pe1xuXG4gICAgJHNjb3BlLnRpdGxlID0gXCJTY2hlZHVsZSBhIE5ldyBFdmVudFwiO1xuICAgICRzY29wZS5kZXNjcmlwdGlvbiA9IFwiRmlsbCBpbiB0aGUgZm9ybSBiZWxvdyB0byBjcmVhdGUgeW91ciBldmVudCBhbmQgc2hhcmUgaXQgd2l0aCB5b3VyIGZyaWVuZHMgYW5kIGNvbGxlYWd1ZXMuXCI7XG4gICAgJHNjb3BlLmV2ZW50ID0ge307XG5cbiAgICB2YXIgc3RhdGVzID0gW1xuICAgICAgICAnbmV3ZXZlbnQuZ2VuZXJhbCcsXG4gICAgICAgICduZXdldmVudC5kYXRldGltZScsXG4gICAgICAgICduZXdldmVudC5pbnZpdGUnXG4gICAgXTtcblxuICAgICRzY29wZS5wYWdlID0gMjtcblxuICAgIHZhciBnb1RvID0gZnVuY3Rpb24ocGFnZSl7XG4gICAgICAgICRzY29wZS5wYWdlID0gcGFnZTtcbiAgICAgICAgJHN0YXRlLmdvKHN0YXRlc1twYWdlLTFdKTtcbiAgICB9XG5cbiAgICBnb1RvKCRzY29wZS5wYWdlKTtcblxuXG4gICAgJHNjb3BlLnN1Ym1pdCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmICgkc2NvcGUuZm9ybS4kdmFsaWQgJiYgJHNjb3BlLnBhZ2UgPT0gc3RhdGVzLmxlbmd0aCl7XG4gICAgICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL2V2ZW50JywgJHNjb3BlLmV2ZW50KVxuICAgICAgICAgICAgLnN1Y2Nlc3MoZnVuY3Rpb24oZXZlbnQsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKXtcbiAgICAgICAgICAgICAgICAkc2NvcGUuZXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAkc2NvcGUuZXZlbnRVcmwgPSAkc3RhdGUuaHJlZignZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAkc2NvcGUuZXZlbnQuX2lkXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZSA6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkc2NvcGUucGFnZSsrO1xuICAgICAgICAgICAgICAgICRzdGF0ZS5nbygnbmV3ZXZlbnQuc3VjY2VzcycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5lcnJvcihmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IG5ldyBDb25maXJtTW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZSA6ICdVaCBvaCEnLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ1RoZXJlIHdhcyBhbiBlcnJvciBjcmVhdGluZyB5b3VyIGV2ZW50LiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicsXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQgOiAnT0snXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUuZm9ybS4kdmFsaWQpIHtcbiAgICAgICAgICAgICRzY29wZS5mb3JtLiRzZXRQcmlzdGluZSgpO1xuICAgICAgICAgICAgJHNjb3BlLm5leHRQYWdlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgdGl0bGUgOiAnTm90IHNvIGZhc3QnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnTWFrZSBzdXJlIHlvdSBmaWxsIGluIGFsbCB0aGUgcmVxdWlyZWQgZmllbGRzIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgICAgICAgICAgICB0eXBlIDogJ2Vycm9yJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkc2NvcGUubmV4dFBhZ2UgPSBmdW5jdGlvbigpe1xuICAgICAgICBnb1RvKCRzY29wZS5wYWdlKzEpO1xuICAgIH1cblxuICAgICRzY29wZS5wcmV2UGFnZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGdvVG8oJHNjb3BlLnBhZ2UtMSk7XG4gICAgfVxuXG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ1ZlcmlmaWNhdGlvbkN0cmwnLCBmdW5jdGlvbihFdmVudCwgTm90aWZpY2F0aW9uLCAkc3RhdGUpe1xuICAgIEV2ZW50LnZlcmlmeSh7aWQgOiAkc3RhdGUucGFyYW1zLmlkLCBjb2RlIDokc3RhdGUucGFyYW1zLmNvZGV9LCBmdW5jdGlvbigpe1xuICAgICAgICB2YXIgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICB0aXRsZSA6ICdFbWFpbCBWZXJpZmllZCcsXG4gICAgICAgICAgICBtZXNzYWdlIDogJ1lvdXIgZW1haWwgaGFzIGJlZW4gdmVyaWZpZWQuIFlvdSB3aWxsIG5vdyBiZSBhYmxlIHRvIHJlY2VpdmUgZW1haWwgbm90aWZpY2F0aW9ucyBmb3IgdGhpcyBldmVudCcsXG4gICAgICAgICAgICB0eXBlIDogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgdGltZW91dCA6IDUwMDBcbiAgICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24oZSl7XG4gICAgICAgIHZhciBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIHRpdGxlIDogJ1ZlcmlmaWNhdGlvbiBGYWlsZWQnLFxuICAgICAgICAgICAgbWVzc2FnZSA6ICdZb3VyIHZlcmlmaWNhdGlvbiBjb2RlIGhhcyBleHBpcmVkLicsXG4gICAgICAgICAgICB0eXBlIDogJ2Vycm9yJ1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICAkc3RhdGUuZ28oJ2V2ZW50JywgeyBpZCA6ICRzdGF0ZS5wYXJhbXMuaWQgfSk7XG5cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZGlyZWN0aXZlKCdiYWNrSW1nJywgZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKXtcbiAgICAgICAgdmFyIHVybCA9IGF0dHJzLmJhY2tJbWc7XG4gICAgICAgIGVsZW1lbnQuY3NzKHtcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogJ3VybCgvaW1hZ2VzLycgKyB1cmwgKycucG5nKSdcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pXG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5kaXJlY3RpdmUoJ2RhdGVwaWNrZXInLCBmdW5jdGlvbihEYXRlUGlja2VyU2VydmljZSl7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3QgOiAnQScsXG4gICAgICAgIHJlcXVpcmUgOiAnbmdNb2RlbCcsXG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgbW9kZWwgOiAnPW5nTW9kZWwnLFxuICAgICAgICAgICAgY29udHJvbCA6ICc9J1xuICAgICAgICB9LFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycywgbmdNb2RlbCl7XG4gICAgICAgICAgICB2YXIgZGF0ZVNlcnZpY2UgID0gbmV3IERhdGVQaWNrZXJTZXJ2aWNlKHNjb3BlLm1vZGVsKSxcbiAgICAgICAgICAgICAgICBkYXRlQnVmZmVyID0gZGF0ZVNlcnZpY2UuZ2V0RGF0ZXNBcnJheSgpO1xuXG4gICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQoZWwpLmRhdGVwaWNrZXIoe1xuICAgICAgICAgICAgICAgIG11bHRpZGF0ZSA6IHRydWUsXG4gICAgICAgICAgICAgICAgdG9kYXlIaWdobGlnaHQ6IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ2NoYW5nZURhdGUnLCBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZVBpY2tlckRhdGVzID0gZS5kYXRlcztcbiAgICAgICAgICAgICAgICBpZiAoZGF0ZVBpY2tlckRhdGVzLmxlbmd0aCA+IGRhdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRlQWRkZWQgPSBkYXRlUGlja2VyRGF0ZXNbZGF0ZVBpY2tlckRhdGVzLmxlbmd0aC0xXTtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZVNlcnZpY2UuYWRkRGF0ZShkYXRlQWRkZWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRlUmVtb3ZlZCA9IGRhdGVTZXJ2aWNlLmRpZmZEYXRlcyhkYXRlQnVmZmVyLCBkYXRlUGlja2VyRGF0ZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZVJlbW92ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlU2VydmljZS5yZW1vdmVEYXRlKGRhdGVSZW1vdmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmdNb2RlbC4kc2V0Vmlld1ZhbHVlKGRhdGVTZXJ2aWNlLmdldERhdGVzKCkpXG4gICAgICAgICAgICAgICAgZGF0ZUJ1ZmZlciA9IGRhdGVQaWNrZXJEYXRlcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2NvcGUuY29udHJvbCA9IHNjb3BlLmNvbnRyb2wgfHwge307XG4gICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdtb2RlbCcsIGZ1bmN0aW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSl7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGVQaWNrZXJEYXRlcyA9IGFuZ3VsYXIuZWxlbWVudChlbCkuZGF0ZXBpY2tlcignZ2V0RGF0ZXMnKTtcbiAgICAgICAgICAgICAgICB2YXIgbW9kZWxEYXRlcyA9IGRhdGVTZXJ2aWNlLmdldERhdGVzQXJyYXkoKTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0ZVBpY2tlckRhdGVzLmxlbmd0aCAhPSBtb2RlbERhdGVzLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChlbCkuZGF0ZXBpY2tlcignc2V0RGF0ZXMnLCBtb2RlbERhdGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNjb3BlLmNvbnRyb2wudW5zZXREYXRlID0gZnVuY3Rpb24oZGF0ZSl7XG4gICAgICAgICAgICAgICAgZGF0ZVNlcnZpY2UucmVtb3ZlRGF0ZShkYXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmdNb2RlbC4kdmFsaWRhdG9ycy5yZXF1aXJlZCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSl7XG4gICAgICAgICAgICAgICAgaWYgKCFtb2RlbFZhbHVlIHx8IG1vZGVsVmFsdWUubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9XG59KVxuLnNlcnZpY2UoJ0RhdGVQaWNrZXJTZXJ2aWNlJywgZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gZnVuY3Rpb24oZGVmYXVsdFN0b3JlKXtcblxuICAgICAgICB2YXIgc3RvcmUgPSBkZWZhdWx0U3RvcmUgfHwgW107XG5cbiAgICAgICAgdGhpcy5hZGREYXRlID0gZnVuY3Rpb24oZGF0ZSl7XG4gICAgICAgICAgICBzdG9yZS5wdXNoKHsgZGF0ZSA6IGRhdGUgfSk7XG4gICAgICAgICAgICBzdG9yZS5zb3J0KGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgICAgICAgICAgIGlmIChEYXRlLmNvbXBhcmUoYS5kYXRlLCBiLmRhdGUpID4gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVEYXRlID0gZnVuY3Rpb24oZGF0ZSl7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0b3JlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBpZiAoRGF0ZS5lcXVhbHMoc3RvcmVbaV0uZGF0ZSwgZGF0ZSkpe1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zcGxpY2UoaSwxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZXREYXRlcyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICByZXR1cm4gKHN0b3JlLmxlbmd0aCA+IDApID8gc3RvcmUgOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2V0RGF0ZXNBcnJheSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB2YXIgZGF0ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvcmUubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGRhdGVzLnB1c2goc3RvcmVbaV0uZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGF0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaWZmRGF0ZXMgPSBmdW5jdGlvbihiaWdBcnIsIHNtYWxsQXJyKXtcbiAgICAgICAgICAgIHZhciBzaG91bGRSZXR1cm4gPSB0cnVlO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaWdBcnIubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIHNob3VsZFJldHVybiA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzbWFsbEFyci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5lcXVhbHMoYmlnQXJyW2ldLCBzbWFsbEFycltqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJldHVybiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRSZXR1cm4pIHJldHVybiBiaWdBcnJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5kaXJlY3RpdmUoJ2Rpc2N1c3Npb24nLCBmdW5jdGlvbigkdGltZW91dCwgQ29tbWVudCwgQ29uZmlybU1vZGFsKXtcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdCA6ICdBJyxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2RpcmVjdGl2ZXMvZGlzY3Vzc2lvbi5odG1sJyxcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICAnZXZlbnQnIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmsgOiBmdW5jdGlvbihzY29wZSwgZWwsIGF0dHJzKXtcbiAgICAgICAgICAgIHNjb3BlLmNvbW1lbnQgPSB7fTtcbiAgICAgICAgICAgIHZhciB0aHJlYWQgPSBhbmd1bGFyLmVsZW1lbnQoJy5jb21tZW50LXRocmVhZCcpO1xuICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICB0aHJlYWQuc2Nyb2xsVG9wKHRocmVhZC5wcm9wKCdzY3JvbGxIZWlnaHQnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNjb3BlLmRlbGV0ZUNvbW1lbnQgPSBmdW5jdGlvbihjb21tZW50KXtcbiAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBuZXcgQ29uZmlybU1vZGFsKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiAnQXJlIHlvdSBzdXJlPycsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIGNvbW1lbnQ/JyxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQgOiAnWWVzIC0gZGVsZXRlJyxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dCA6ICdObyAtIG5ldmVybWluZCcsXG4gICAgICAgICAgICAgICAgICAgIGlzRGVzdHJ1Y3RpdmUgOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtIDogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQucmVtb3ZlKHsgaWQgOiBzY29wZS5ldmVudC5faWQgLCBjaWQgOiBjb21tZW50Ll9pZCB9LCBmdW5jdGlvbihldmVudCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuZXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5wb3N0Q29tbWVudCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmNvbW1lbnRGb3JtLiR2YWxpZCl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gbmV3IENvbW1lbnQoc2NvcGUuY29tbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQuJHNhdmUoe2lkOnNjb3BlLmV2ZW50Ll9pZH0sIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5jb21tZW50ID0ge307XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5jb21tZW50Rm9ybS4kc2V0UHJpc3RpbmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmRpcmVjdGl2ZSgnZHJvcGRvd24nLCBmdW5jdGlvbigkZG9jdW1lbnQpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0IDogJ0EnLFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycyl7XG4gICAgICAgICAgICBlbC5hZGRDbGFzcygnZHJvcGRvd24nKTtcbiAgICAgICAgICAgIHNjb3BlLm9wZW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgdmFyIGNsaWNrSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgICAgICB2YXIgaXNDbGlja2VkRWxlbWVudENoaWxkT2ZQb3B1cCA9IGVsLmZpbmQoZXZlbnQudGFyZ2V0KS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIGlmIChpc0NsaWNrZWRFbGVtZW50Q2hpbGRPZlBvcHVwKSByZXR1cm47XG4gICAgICAgICAgICAgICAgc2NvcGUudG9nZ2xlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjb3BlLnRvZ2dsZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgc2NvcGUub3BlbiA9ICFzY29wZS5vcGVuO1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5vcGVuKXtcbiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoJ29wZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50LmJpbmQoJ2NsaWNrJywgY2xpY2tIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbC5yZW1vdmVDbGFzcygnb3BlbicpO1xuICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnQudW5iaW5kKCdjbGljaycsIGNsaWNrSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5zZXJ2aWNlKCdGb3JtSGVscGVyJywgZnVuY3Rpb24oKXtcbiAgICB0aGlzLmVtYWlsUmVnZXhTdHJpbmcgPSAnXihbXFxcXHctXFxcXC5dK0AoW1xcXFx3LV0rXFxcXC4pK1tcXFxcdy1dezIsNH0pPyQnO1xuICAgIHRoaXMuZW1haWxSZWdleCA9IG5ldyBSZWdFeHAodGhpcy5lbWFpbFJlZ2V4U3RyaW5nKTtcbiAgICB0aGlzLnByZXR0eUVycm9yID0gZnVuY3Rpb24oZXJyb3JzLCBmaWVsZCl7XG4gICAgICAgIGlmIChlcnJvcnMucmVxdWlyZWQpIHJldHVybiBmaWVsZCArIFwiIGlzIHJlcXVpcmVkXCI7XG4gICAgICAgIGlmIChlcnJvcnMucGF0dGVybikgcmV0dXJuIGZpZWxkICsgXCIgaXMgaW52YWxpZFwiIDtcbiAgICAgICAgaWYgKGVycm9ycy5tYXhsZW5ndGgpIHJldHVybiBmaWVsZCArIFwiIGlzIHRvbyBsb25nXCI7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgndXNlckZvcm0nLCBmdW5jdGlvbihGb3JtSGVscGVyKXtcbiAgICByZXR1cm4ge1xuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgIGV2ZW50IDogJz0nLFxuICAgICAgICAgICAgZm9ybSA6ICc9J1xuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZm9ybS91c2VyRm9ybS5odG1sJyxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMpIHtcbiAgICAgICAgICAgIHNjb3BlLmVycm9ycyA9IHt9O1xuXG4gICAgICAgICAgICBzY29wZS5lbWFpbFJlZ2V4ID0gRm9ybUhlbHBlci5lbWFpbFJlZ2V4O1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdmb3JtLm5hbWUuJGVycm9yJyxmdW5jdGlvbihlcnJvcnMpe1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycm9ycy5uYW1lID0gRm9ybUhlbHBlci5wcmV0dHlFcnJvcihlcnJvcnMsIFwiTmFtZVwiKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdmb3JtLmVtYWlsLiRlcnJvcicsZnVuY3Rpb24oZXJyb3JzKXtcbiAgICAgICAgICAgICAgICBzY29wZS5lcnJvcnMuZW1haWwgPSBGb3JtSGVscGVyLnByZXR0eUVycm9yKGVycm9ycywgXCJFbWFpbFwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufSlcbi5kaXJlY3RpdmUoJ2V2ZW50Rm9ybScsIGZ1bmN0aW9uKEZvcm1IZWxwZXIpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgZXZlbnQgOiAnPScsXG4gICAgICAgICAgICBmb3JtIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9mb3JtL2V2ZW50Rm9ybS5odG1sJyxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMpIHtcbiAgICAgICAgICAgIHNjb3BlLmVycm9ycyA9IHt9O1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdmb3JtLnRpdGxlLiRlcnJvcicsZnVuY3Rpb24oZXJyb3JzKXtcbiAgICAgICAgICAgICAgICBzY29wZS5lcnJvcnMudGl0bGUgPSBGb3JtSGVscGVyLnByZXR0eUVycm9yKGVycm9ycywgXCJUaXRsZVwiKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdmb3JtLmxvY2F0aW9uLiRlcnJvcicsZnVuY3Rpb24oZXJyb3JzKXtcbiAgICAgICAgICAgICAgICBzY29wZS5lcnJvcnMubG9jYXRpb24gPSBGb3JtSGVscGVyLnByZXR0eUVycm9yKGVycm9ycywgXCJMb2NhdGlvblwiKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgnZGF0ZUZvcm0nLCBmdW5jdGlvbigpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgZXZlbnQgOiAnPScsXG4gICAgICAgICAgICBmb3JtIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9mb3JtL2RhdGVGb3JtLmh0bWwnXG4gICAgfVxufSlcbi5kaXJlY3RpdmUoJ3BhcnRpY2lwYW50c0Zvcm0nLCBmdW5jdGlvbihGb3JtSGVscGVyKXtcbiAgICByZXR1cm4ge1xuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgIGV2ZW50IDogJz0nLFxuICAgICAgICAgICAgZm9ybSA6ICc9J1xuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZm9ybS9wYXJ0aWNpcGFudHNGb3JtLmh0bWwnLFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycyl7XG4gICAgICAgICAgICBzY29wZS5lbWFpbFJlZ2V4ID0gRm9ybUhlbHBlci5lbWFpbFJlZ2V4U3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxufSlcbi5kaXJlY3RpdmUoJ3NldHRpbmdzRm9ybScsIGZ1bmN0aW9uKEV2ZW50LCBDb25maXJtTW9kYWwpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgZXZlbnQgOiAnPScsXG4gICAgICAgICAgICBmb3JtIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9mb3JtL3NldHRpbmdzRm9ybS5odG1sJyxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMpe1xuICAgICAgICAgICAgc2NvcGUuZGVsZXRlRXZlbnQgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5kZWxldGVSZXF1ZXN0U2VudCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIEV2ZW50LmRlbGV0ZSh7J2lkJyA6IHNjb3BlLmV2ZW50Ll9pZH0sIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmRlbGV0ZVJlcXVlc3RTZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA6ICdEZWxldGUgUmVxdWVzdCBTZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnQW4gZW1haWwgaGFzIGJlZW4gc2VudCB0byB0aGUgY3JlYXRvciBvZiB0aGlzIGV2ZW50IHdpdGggaW5zdHJ1Y3Rpb25zIHRvIGRlbGV0ZSBpdC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dCA6ICdPSydcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgnc3dpdGNoVG9nZ2xlJywgZnVuY3Rpb24oKXtcbiAgICByZXR1cm4ge1xuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgIG1vZGVsIDogJz1uZ01vZGVsJ1xuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlIDogJ25nTW9kZWwnLFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycywgbmdNb2RlbCkge1xuICAgICAgICAgICAgZWwuYWRkQ2xhc3MoJ3N3aXRjaC10b2dnbGUnKTtcbiAgICAgICAgICAgIHZhciBzZXRDbGFzcyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLm1vZGVsIF4gdHlwZW9mKGF0dHJzLmludmVydCkgIT09ICd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS4kd2F0Y2goJ21vZGVsJywgc2V0Q2xhc3MpO1xuICAgICAgICAgICAgZWwuYmluZCgnY2xpY2snLCBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgICAgICBzY29wZS5tb2RlbCA9ICFzY29wZS5tb2RlbDtcbiAgICAgICAgICAgICAgICBuZ01vZGVsLiRzZXRWaWV3VmFsdWUoc2NvcGUubW9kZWwsIGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgndGltZUZvcm0nLCBmdW5jdGlvbihEYXRlUGlja2VyU2VydmljZSl7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICBldmVudCA6ICc9JyxcbiAgICAgICAgICAgIGZvcm0gOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2Zvcm0vdGltZUZvcm0uaHRtbCcsXG4gICAgICAgIGxpbmsgOiBmdW5jdGlvbihzY29wZSwgZWwsIGF0dHJzKXtcbiAgICAgICAgICAgIHZhciBpbml0ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgZGF0ZVNlcnZpY2U7XG4gICAgICAgICAgICB2YXIgZGVyZWdpc3RlciA9IHNjb3BlLiR3YXRjaCgnZXZlbnQuZGF0ZXMnLCBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmICFpbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcmVnaXN0ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5pdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZGF0ZVNlcnZpY2UgPSBuZXcgRGF0ZVBpY2tlclNlcnZpY2Uoc2NvcGUuZXZlbnQuZGF0ZXMpO1xuICAgICAgICAgICAgICAgIHNjb3BlLnVuc2V0RGF0ZSA9IGZ1bmN0aW9uKGRhdGUpe1xuICAgICAgICAgICAgICAgICAgICBkYXRlU2VydmljZS5yZW1vdmVEYXRlKGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufSlcbi5kaXJlY3RpdmUoJ3RpbWVQaWNrZXInLCBmdW5jdGlvbigkdGltZW91dCl7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICBtb2RlbCA6ICc9bmdNb2RlbCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZSA6ICduZ01vZGVsJyxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMsIG5nTW9kZWwpe1xuICAgICAgICAgICAgbmdNb2RlbC4kdmlld0NoYW5nZUxpc3RlbmVycy5wdXNoKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgc2NvcGUubW9kZWwgPSBuZ01vZGVsLiRtb2RlbFZhbHVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG5nTW9kZWwuJHBhcnNlcnMucHVzaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgICAgICAgICAgICAgcmV0dXJuIERhdGUucGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG5nTW9kZWwuJHZhbGlkYXRvcnMudGltZSA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSl7XG4gICAgICAgICAgICAgICAgaWYgKG5nTW9kZWwuJGlzRW1wdHkobW9kZWxWYWx1ZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciB0aW1lID0gRGF0ZS5wYXJzZShtb2RlbFZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodGltZSkge1xuICAgICAgICAgICAgICAgICAgICBuZ01vZGVsLiRzZXRWaWV3VmFsdWUodGltZS50b1N0cmluZyhcImhoOm1tIHR0XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgbmdNb2RlbC4kcmVuZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmRpcmVjdGl2ZSgncG9sbCcsIGZ1bmN0aW9uKCR0aW1lb3V0LCBQYXJ0aWNpcGFudCwgQ29uZmlybU1vZGFsKXtcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdCA6ICdBJyxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2RpcmVjdGl2ZXMvcG9sbC5odG1sJyxcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICAnZXZlbnQnIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmsgOiBmdW5jdGlvbihzY29wZSwgZWwsIGF0dHJzKXtcbiAgICAgICAgICAgIHNjb3BlLmRlZmF1bHRzID0gW107XG4gICAgICAgICAgICBzY29wZS5wYXJ0aWNpcGFudCA9IHt9O1xuICAgICAgICAgICAgdmFyIGRhdGVzQ291bnQgPSBbXTtcbiAgICAgICAgICAgIHZhciB1bmJpbmRMaXN0ZW5lcjtcbiAgICAgICAgICAgIHNjb3BlLmV2ZW50LiRwcm9taXNlLnRoZW4oZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgICAgICAgICAgIHZhciBleGFtcGxlc05hbWVzID0gWydKb2huIEV4YW1wbGUnLCAnSmFuZSBTcGVjaW1lbicsJ01hcmsgSW5zdGFuY2UnLCAnTWFyeSBDYXNlJ107XG4gICAgICAgICAgICAgICAgdmFyIGV4YW1wbGVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleGFtcGxlc05hbWVzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4YW1wbGUgPSB7IG5hbWUgOiBleGFtcGxlc05hbWVzW2ldIH07XG4gICAgICAgICAgICAgICAgICAgIGV4YW1wbGUuZGF0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAgZXZlbnQuZGF0ZXMubGVuZ3RoOyBqKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFuc3dlciA9IE1hdGgucmFuZG9tKCk8LjU7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlLmRhdGVzW2pdID0gYW5zd2VyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV4YW1wbGVzLnB1c2goZXhhbXBsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjb3BlLmV4YW1wbGVzID0gZXhhbXBsZXM7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc2NvcGUuZGVsZXRlID0gZnVuY3Rpb24ocGFydGljaXBhbnQpe1xuICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IG5ldyBDb25maXJtTW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZSA6ICdEZWxldGUgJyArIHBhcnRpY2lwYW50Lm5hbWUgKyAnPycsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSAnK3BhcnRpY2lwYW50Lm5hbWUrJyBmcm9tIHRoZSBwb2xsPycsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0IDogJ1llcyAtIGRlbGV0ZScsXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQgOiAnTm8gLSBuZXZlcm1pbmQnLFxuICAgICAgICAgICAgICAgICAgICBpc0Rlc3RydWN0aXZlIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybSA6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWNpcGFudC5yZW1vdmUoeyBpZCA6IHNjb3BlLmV2ZW50Ll9pZCAsIHBpZCA6IHBhcnRpY2lwYW50Ll9pZCB9LCBmdW5jdGlvbihldmVudCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuZXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5pc1RvcERhdGUgPSBmdW5jdGlvbihpbmRleCl7XG4gICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gZGF0ZXNDb3VudFtpbmRleF07XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRlc0NvdW50Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGVzQ291bnRbaV0gPiBjb3VudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLnNlbGVjdGVkRGF0ZSA9IGZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgICAgICAgICBkYXRlc0NvdW50W2luZGV4XSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY29wZS5ldmVudC5wYXJ0aWNpcGFudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZXZlbnQucGFydGljaXBhbnRzW2ldLmRhdGVzW2luZGV4XSkgZGF0ZXNDb3VudFtpbmRleF0rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVzQ291bnRbaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUudXBkYXRlID0gZnVuY3Rpb24ocGFydGljaXBhbnQpe1xuICAgICAgICAgICAgICAgIFBhcnRpY2lwYW50LnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGlkIDogc2NvcGUuZXZlbnQuX2lkLFxuICAgICAgICAgICAgICAgICAgICBwaWQgOiBwYXJ0aWNpcGFudC5faWRcbiAgICAgICAgICAgICAgICB9LCBwYXJ0aWNpcGFudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5lZGl0ID0gZnVuY3Rpb24ocGFydGljaXBhbnQpe1xuICAgICAgICAgICAgICAgIHNjb3BlLmRlZmF1bHRzW3Njb3BlLmV2ZW50LnBhcnRpY2lwYW50cy5pbmRleE9mKHBhcnRpY2lwYW50KV0gPSBhbmd1bGFyLmNvcHkocGFydGljaXBhbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuY2FuY2VsID0gZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICAgICAgICAgIHNjb3BlLmV2ZW50LnBhcnRpY2lwYW50c1tpbmRleF0gPSBzY29wZS5kZWZhdWx0c1tpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5zYXZlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZm9ybW5ldy4kdmFsaWQpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFydGljaXBhbnQgPSBuZXcgUGFydGljaXBhbnQoc2NvcGUucGFydGljaXBhbnQpO1xuICAgICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudC4kc2F2ZSh7aWQ6c2NvcGUuZXZlbnQuX2lkfSwgZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuZXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcnRpY2lwYW50ID0ge307XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5mb3JtbmV3LiRzZXRQcmlzdGluZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZmlsdGVyKCdlbGFwc2VkJywgZnVuY3Rpb24oJGZpbHRlcil7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUpe1xuICAgICAgICBpZiAoIWRhdGUpIHJldHVybjtcbiAgICAgICAgdmFyIHRpbWUgPSBEYXRlLnBhcnNlKGRhdGUpLFxuICAgICAgICAgICAgdGltZU5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICAgICAgZGlmZmVyZW5jZSA9IHRpbWVOb3cgLSB0aW1lLFxuICAgICAgICAgICAgc2Vjb25kcyA9IE1hdGguZmxvb3IoZGlmZmVyZW5jZSAvIDEwMDApLFxuICAgICAgICAgICAgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKSxcbiAgICAgICAgICAgIGhvdXJzID0gTWF0aC5mbG9vcihtaW51dGVzIC8gNjApLFxuICAgICAgICAgICAgZGF5cyA9IE1hdGguZmxvb3IoaG91cnMgLyAyNCk7XG4gICAgICAgIGlmIChkYXlzID4gMzApIHtcbiAgICAgICAgICAgIHJldHVybiAnb24gJyArICRmaWx0ZXIoJ2RhdGUnKShkYXRlLCAnTU1NTSBkJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5cyA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXlzICsgXCIgZGF5cyBhZ29cIjtcbiAgICAgICAgfSBlbHNlIGlmIChkYXlzID09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjEgZGF5IGFnb1wiXG4gICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gaG91cnMgKyBcIiBob3VycyBhZ29cIjtcbiAgICAgICAgfSBlbHNlIGlmIChob3VycyA9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJhbiBob3VyIGFnb1wiO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZXMgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbWludXRlcyArIFwiIG1pbnV0ZXMgYWdvXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlcyA9PSAxKXtcbiAgICAgICAgICAgIHJldHVybiBcImEgbWludXRlIGFnb1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiYSBmZXcgc2Vjb25kcyBhZ29cIjtcbiAgICAgICAgfVxuICAgIH1cbn0pXG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5mYWN0b3J5KCdDb25maXJtTW9kYWwnLCBmdW5jdGlvbihidGZNb2RhbCl7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKXtcbiAgICAgICAgdmFyIG1vZGFsO1xuICAgICAgICBtb2RhbCA9IGJ0Zk1vZGFsKHtcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9jb25maXJtbW9kYWwuaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyQXMgOiAnbW9kYWwnLFxuICAgICAgICAgICAgY29udHJvbGxlciA6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgdGhpcy50aXRsZSA9IGNvbmZpZy50aXRsZVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGNvbmZpZy5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlybSA9IChjb25maWcuY29uZmlybSkgPyBmdW5jdGlvbigpe2NvbmZpZy5jb25maXJtKCk7IG1vZGFsLmRlYWN0aXZhdGUoKX0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbCA9IG1vZGFsLmRlYWN0aXZhdGU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maXJtVGV4dCA9IGNvbmZpZy5jb25maXJtVGV4dCB8fCAnQ29uZmlybSc7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxUZXh0ID0gY29uZmlnLmNhbmNlbFRleHQgfHwgJ0NhbmNlbCc7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Rlc3RydWN0aXZlID0gY29uZmlnLmlzRGVzdHJ1Y3RpdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbC5hY3RpdmF0ZSgpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIG1vZGFsLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZmFjdG9yeSgnTm90aWZpY2F0aW9uJywgZnVuY3Rpb24oJHRpbWVvdXQsIGJ0Zk1vZGFsKXtcbiAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKXtcbiAgICAgICAgdmFyIG1vZGFsO1xuICAgICAgICBtb2RhbCA9IGJ0Zk1vZGFsKHtcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9ub3RpZmljYXRpb24uaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyQXMgOiAnbm90aWZpY2F0aW9uJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHRoaXMudGl0bGUgPSBjb25maWcudGl0bGVcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBjb25maWcubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlID0gbW9kYWwuZGVhY3RpdmF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBjb25maWcudHlwZTtcbiAgICAgICAgICAgICAgICB2YXIgdGltZW91dCA9IGNvbmZpZy50aW1lb3V0IHx8IDUwMDA7XG4gICAgICAgICAgICAgICAgJHRpbWVvdXQobW9kYWwuZGVhY3RpdmF0ZSwgdGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbC5hY3RpdmF0ZSgpO1xuXG4gICAgICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBtb2RhbC5kZWFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ==
|