@rongcloud/plugin-call-plus 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +0 -0
- package/dist/index.d.ts +3134 -0
- package/dist/index.esm.js +3677 -0
- package/dist/index.umd.js +2 -0
- package/package.json +33 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(g,I){typeof exports=="object"&&typeof module<"u"?I(exports,require("@rongcloud/engine"),require("@rongcloud/plugin-rtc")):typeof define=="function"&&define.amd?define(["exports","@rongcloud/engine","@rongcloud/plugin-rtc"],I):(g=typeof globalThis<"u"?globalThis:g||self,I(g.CallPlus={},g.RCEngine,g.RCRTC))})(this,function(g,I,N){"use strict";var He=Object.defineProperty;var ke=(g,I,N)=>I in g?He(g,I,{enumerable:!0,configurable:!0,writable:!0,value:N}):g[I]=N;var l=(g,I,N)=>(ke(g,typeof I!="symbol"?I+"":I,N),N);const a={SUCCESS:0,PARAM_ERROR:80001,SESSION_EXIST:80002,NOT_IN_CALL:80003,MEDIATYPE_INVALID:80004,NOT_VIDEO_CALL:80005,RTC_SERVICE_UNAVAILABLE:80006,USER_LIST_INVAILD:80007,CALL_ID_INVALID:80008,TRANSACTION_ID_INVALID:80009,USER_ID_INVALID:80010,SINGLE_CALL_NOT_SUPPORT_MULTI_PERSON:80011,SIGNAL_DISCONNECTED:80012,CAMERA_CLOSED:80100,MICROPHONE_CLOSED:80101,MEDIA_RESOURCE_INVALIED:80102,NOT_INSTALL_RTC_PLUGIN:80103,PLAY_MEDIA_FAILED:80104,VIDEO_VIEW_NOT_SET:80105};var n=(t=>(t.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O="L-index_install_call_plus_plugin-O",t.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O="L-callplus_client_set_event_listener-O",t.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O="L-callplus_client_call_event_listener-O",t.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O="L-callplus_client_set_status_report_listener-O",t.L_CALLPLUS_CLIENT_CALL_STATUS_REPORT_LISTENER_O="L-callplus_client_call_status_report_listener-O",t.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T="L-callplus_client_set_video_config-T",t.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R="L-callplus_client_set_video_config-R",t.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O="L-callplus_video_config_set_frame_rate-O",t.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O="L-callplus_video_config_set_resolution-O",t.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O="L-callplus_video_config_set_bitrate-O",t.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T="L-callplus_client_set_audio_config-T",t.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R="L-callplus_client_set_audio_config-R",t.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O="L-callplus_audio_config_set_bitrate-O",t.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O="L-callplus_audio_config_set_sample_rate-O",t.L_CALLPLUS_CLIENT_PREVIEW_T="L-callplus_client_preview-T",t.L_CALLPLUS_CLIENT_PREVIEW_R="L-callplus_client_preview-R",t.L_CALLPLUS_CLIENT_START_CALL_T="L-callplus_client_start_call-T",t.L_CALLPLUS_CLIENT_START_CALL_R="L-callplus_client_start_call-R",t.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T="L-callplus_client_join_multi_call-T",t.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R="L-callplus_client_join_multi_call-R",t.L_CALLPLUS_CLIENT_ACCEPT_T="L-callplus_client_accept-T",t.L_CALLPLUS_CLIENT_ACCEPT_R="L-callplus_client_accept-R",t.L_CALLPLUS_CLIENT_HANGUP_T="L-callplus_client_hangup-T",t.L_CALLPLUS_CLIENT_HANGUP_R="L-callplus_client_hangup-R",t.L_CALLPLUS_CLIENT_INVITE_T="L-callplus_client_invite-T",t.L_CALLPLUS_CLIENT_INVITE_R="L-callplus_client_invite-R",t.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T="L-callplus_client_request_change_media_type-T",t.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R="L-callplus_client_request_change_media_type-R",t.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T="L-callplus_client_cancel_change_media_type-T",t.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R="L-callplus_client_cancel_change_media_type-R",t.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T="L-callplus_client_reply_change_media_type-T",t.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R="L-callplus_client_reply_change_media_type-R",t.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_T="L-callplus_client_get_current_call_session-T",t.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_R="L-callplus_client_get_current_call_session-R",t.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_get_available_call_sessions_from_server-T",t.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_get_available_call_sessions_from_server-R",t.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T="L-callplus_client_get_call_records-T",t.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R="L-callplus_client_get_call_records-R",t.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T="L-callplus_client_delete_call_records_by_callId-T",t.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R="L-callplus_client_delete_call_records_by_callId-R",t.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_delete_all_call_records_from_server-T",t.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_delete_all_call_records_from_server-R",t.L_CALLPLUS_CLIENT_START_CAMERA_T="L-callplus_client_start_camera-T",t.L_CALLPLUS_CLIENT_START_CAMERA_R="L-callplus_client_start_camera-R",t.L_CALLPLUS_CLIENT_STOP_CAMERA_T="L-callplus_client_stop_camera-T",t.L_CALLPLUS_CLIENT_STOP_CAMERA_R="L-callplus_client_stop_camera-R",t.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T="L-callplus_client_switch_camera-T",t.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R="L-callplus_client_switch_camera-R",t.L_CALLPLUS_CLIENT_START_MICROPHONE_T="L-callplus_client_start_microphone-T",t.L_CALLPLUS_CLIENT_START_MICROPHONE_R="L-callplus_client_start_microphone-R",t.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T="L-callplus_client_stop_microphone-T",t.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R="L-callplus_client_stop_microphone-R",t.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T="L-callplus_client_set_video_view-T",t.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R="L-callplus_client_set_video_view-R",t.L_RTC_MODULE_SET_VIDEO_VIEW_O="L-rtc_module_set_video_view-O",t.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T="L-callplus_client_remove_video_view-T",t.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R="L-callplus_client_remove_video_view-R",t.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O="L-rtc_module_remove_video_view-O",t.L_CALLPLUS_CLIENT_PLAY_MEDIA_T="L-callplus_client_play_media-T",t.L_CALLPLUS_CLIENT_PLAY_MEDIA_R="L-callplus_client_play_media-R",t.L_RTC_MODULE_PLAY_MEDIA_T="L-rtc_module_play_media-T",t.L_RTC_MODULE_PLAY_MEDIA_R="L-rtc_module_play_media-R",t.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T="L-rtc_module_set_all_remote_audio_enbale-T",t.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R="L-rtc_module_set_all_remote_audio_enable-R",t.L_RTC_MODULE_SUBSCRIBE_T="L-rtc_module_subscribe-T",t.L_RTC_MODULE_SUBSCRIBE_R="L-rtc_module_subscribe-R",t.L_RTC_MODULE_UNSUBSCRIBE_T="L-rtc_module_unsubscribe-T",t.L_RTC_MODULE_UNSUBSCRIBE_R="L-rtc_module_unsubscribe-R",t.L_RTC_MODULE_PUBLISH_T="L-rtc_module_publish-T",t.L_RTC_MODULE_PUBLISH_R="L-rtc_module_publish-R",t.L_RTC_MODULE_UNPUBLISH_T="L-rtc_module_unpublish-T",t.L_RTC_MODULE_UNPUBLISH_R="L-rtc_module_unpublish-R",t.L_RTC_MODULE_DESTROY_ALL_TRACKS_O="L-rtc_module_destroy_all_tracks-O",t.L_RTC_MODULE_SESSION_CONNECT_T="L-rtc_module_session_connect-T",t.L_RTC_MODULE_SESSION_CONNECT_P="L-rtc_module_session_connect-P",t.L_RTC_MODULE_SESSION_CONNECT_R="L-rtc_module_session_connect-R",t.L_RTC_MODULE_SESSION_CLOSE_T="L-rtc_module_session_close-T",t.L_RTC_MODULE_SESSION_CLOSE_P="L-rtc_module_session_close-P",t.L_RTC_MODULE_SESSION_CLOSE_R="L-rtc_module_session_close-R",t.L_RTC_MODULE_CREATE_VIDEO_TRACK_T="L-rtc_module_create_video_track-T",t.L_RTC_MODULE_CREATE_VIDEO_TRACK_R="L-rtc_module_create_video_track-R",t.L_RTC_MODULE_CREATE_AUDIO_TRACK_T="L-rtc_module_create_audio_track-T",t.L_RTC_MODULE_CREATE_AUDIO_TRACK_R="L-rtc_module_create_audio_track-R",t.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O="L-rtc_module_receive_track_publish-O",t.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O="L-rtc_module_receive_track_unpublish-O",t.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O="L-rtc_module_receive_track_enable_change-O",t.L_RTC_MODULE_RECEIVE_KICK_OFF_O="L-rtc_module_receive_kick_off-O",t.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O="L-rtc_module_receive_peerconnection_except_close-O",t.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T="L-rtc_module_change_media_type-T",t.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R="L-rtc_module_change_media_type-R",t.L_RTC_MODULE_JOIN_RTC_ROOM_T="L-rtc_module_join_rtc_room-T",t.L_RTC_MODULE_JOIN_RTC_ROOM_R="L-rtc_module_join_rtc_room-R",t.L_RTC_MODULE_QUIT_RTC_ROOM_T="L-rtc_module_quit_rtc_room-T",t.L_RTC_MODULE_QUIT_RTC_ROOM_R="L-rtc_module_quit_rtc_room-R",t.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T="L-signal_transporter_single_call-T",t.L_SIGNAL_TRANSPORTER_GROUP_CALL_T="L-signal_transporter_group_call-T",t.L_SIGNAL_TRANSPORTER_INVITE_T="L-signal_transporter_invite-T",t.L_SIGNAL_TRANSPORTER_RING_T="L-signal_transporter_ring-T",t.L_SIGNAL_TRANSPORTER_ACCEPT_T="L-signal_transporter_accept-T",t.L_SIGNAL_TRANSPORTER_ACCEPT_R="L-signal_transporter_accept-R",t.L_SIGNAL_TRANSPORTER_JOIN_CALL_T="L-signal_transporter_join_call-T",t.L_SIGNAL_TRANSPORTER_HANGUP_T="L-signal_transporter_hangup-T",t.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T="L-signal_transporter_call_status_up-T",t.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T="L-signal_transporter_call_event_up-T",t.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T="L-signal_transporter_call_dialog_up-T",t.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T="L-signal_transporter_delete_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T="L-signal_transporter_get_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T="L-signal_transporter_get_call_server_time-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T="L-signal_transporter_get_call_time_info-T",t.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T="L-signal_transporter_get_available_call_list-T",t.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T="L-signal_transporter_clear_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T="L-signal_transporter_get_call_info_by_callId-T",t.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T="L-signal_transporter_user_system_state_up-T",t.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O="L-signal_transporter_receive_call_signal_data-O",t.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O="L-signal_transporter_im_state_change-O",t.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O="L-signal_transporter_receive_invite-O",t.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O="L-signal_transporter_receive_call_status-O",t.L_CALL_ENGINE_UPDATE_USERS_STATE_O="L-call_engine_update_users_state-O",t.L_CALL_ENGINE_IM_STATE_CHANGE_O="L-call_engine_im_state_change-O",t.L_CALL_ENGINE_CALL_TIMEOUT_O="L-call_engine_call_timeout-O",t.L_CALL_ENGINE_START_CALL_TIMER_O="L-call_engine_start_call_timer-O",t.L_CALL_ENGINE_STOP_CALL_TIMER_O="L-call_engine_stop_call_timer-O",t.L_CALL_ENGINE_UP_ON_PHONE_END_T="L-call_engine_up_on_phone_end-T",t.L_CALL_ENGINE_UP_ON_PHONE_END_R="L-call_engine_up_on_phone_end-R",t.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O="L-call_engine_receive_first_frame_time-O",t.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O="L-call_engine_receive_mediatype_change-O",t.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O="L-call_engine_receive_close_session-O",t.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O="L-call_engine_receive_call_record-O",t.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O="L-call_engine_receive_complementary_data-O",t.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T="L-call_engine_create_session_by_server-T",t.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R="L-call_engine_create_session_by_server-R",t.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T="L-call_engine_up_first_frame_time-T",t.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R="L-call_engine_up_first_frame_time-R",t.L_TIME_CORRECT_START_O="L-time_correct_start-O",t.L_TIME_CORRECT_STOP_O="L-time_correct_stop-O",t.L_TIME_CORRECT_RESTART_O="L-time_correct_restart-O",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T="L-time_correct_get_call_client_time_by_server-T",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P="L-time_correct_get_call_client_time_by_server-P",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R="L-time_correct_get_call_client_time_by_server-R",t.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T="L-time_correct_calc_client_start_time-T",t.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R="L-time_correct_calc_client_start_time-R",t.L_TIME_CORRECT_SET_DELTA_TIME_O="L-time_correct_set_delta_time-O",t.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T="L-time_correct_loop_correct_client_time-T",t.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R="L-time_correct_loop_correct_client_time-R",t.L_INNER_SESSION_UPDATE_USER_STATE_O="L-inner_session_update_user_state-O",t.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O="L-inner_session_set_user_device_enable-O",t.L_CALL_PLUS_SESSION_GET_CREATE_TIME_T="L-call_plus_session_get_create_time-T",t.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R="L-call_plus_session_get_create_time-R",t.L_CALL_PLUS_SESSION_GET_DURATION_T="L-call_plus_session_get_duration-T",t.L_CALL_PLUS_SESSION_GET_DURATION_R="L-call_plus_session_get_duration-R",t))(n||{});class K{constructor(s,e,_){l(this,"_startTime",0);l(this,"_duration",0);l(this,"_callId","");this._session=s,this._callEngine=e,this._logger=_,this._callId=this._session.getCallId()}getCallId(){return this._callId}getState(){return this._session.getSessionState()}getCallType(){return this._session.getCallType()}getMediaType(){return this._session.getMediaType()}getUserList(){return this._session.getUserList().map(s=>{const{userId:e,userState:_,cameraEnable:i,microphoneEnable:r}=s;return{userId:e,state:_,cameraEnable:i,microphoneEnable:r}})}getCreatorUserId(){return this._session.getStartCallerId()}getInviterUserId(){return this._session.getCallerId()}async getCreateTimestamp(){const s=this._logger.createTraceId();if(this._logger.info(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_T,"",s),this._startTime)return{code:a.SUCCESS,startTime:this._startTime};const{code:e,clientStartTime:_}=await this._callEngine.getCallStaringTime({callId:this._callId},s);return e!==a.SUCCESS?(this._logger.error(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R,`errCode: ${e}`,s),{code:e}):(this._logger.info(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R,"success",s),this._startTime=_,{code:a.SUCCESS,startTime:this._startTime})}async getDuration(){const s=this._logger.createTraceId();if(this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_T,"",s),this._duration)return this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${this._duration}`,s),{code:a.SUCCESS,duration:this._duration};const{code:e,data:_}=await this._callEngine.getCallTimeInfo(this._callId,s);return e!==a.SUCCESS?(this._logger.error(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${_.duration}`,s),this._duration=_.duration,{code:a.SUCCESS,duration:this._duration})}}var D=(t=>(t[t.SINGLE=0]="SINGLE",t[t.MULTI=1]="MULTI",t))(D||{}),d=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ONPHONE=301]="ONPHONE",t[t.ENDED=1e3]="ENDED",t[t.NO_ANSWER=1001]="NO_ANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELLED=1003]="CANCELLED",t[t.DECLINED=1004]="DECLINED",t[t.ERROR=2e3]="ERROR",t))(d||{}),u=(t=>(t[t.AUDIO=0]="AUDIO",t[t.AUDIO_VIDEO=1]="AUDIO_VIDEO",t[t.VIDEO=2]="VIDEO",t))(u||{}),p=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ENDED=1e3]="ENDED",t[t.NOANSWER=1001]="NOANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELED=1003]="CANCELED",t[t.DECLINED=1004]="DECLINED",t[t.ERROR=2e3]="ERROR",t))(p||{}),k=(t=>(t[t.CANCEL_CHANGE_MEDIA_TYPE=0]="CANCEL_CHANGE_MEDIA_TYPE",t[t.REFUSE_CHANGE_MEDIA_TYPE=1]="REFUSE_CHANGE_MEDIA_TYPE",t[t.SERVER_ALLOW_MEDIA_TYPE=2]="SERVER_ALLOW_MEDIA_TYPE",t[t.CHANGE_MEDIA_TYPE_TIMEOUT=3]="CHANGE_MEDIA_TYPE_TIMEOUT",t))(k||{}),A=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ON_PHONE=301]="ON_PHONE",t[t.ON_PHONE_END=302]="ON_PHONE_END",t[t.ON_DEVICE_DISABLE=303]="ON_DEVICE_DISABLE",t[t.ON_DEVICE_ENABLE=304]="ON_DEVICE_ENABLE",t[t.ABNORMAL_END=999]="ABNORMAL_END",t[t.ENDED=1e3]="ENDED",t[t.NO_ANSWER=1001]="NO_ANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELLED=1003]="CANCELLED",t[t.DECLINED=1004]="DECLINED",t[t.OTHER_CLIENT_CALLING=1010]="OTHER_CLIENT_CALLING",t[t.OTHER_CLIENT_ACCEPT=1011]="OTHER_CLIENT_ACCEPT",t[t.JOIN_ROOM_ERR=1105]="JOIN_ROOM_ERR",t[t.PUBLISH_ERR=1106]="PUBLISH_ERR",t[t.SUBSCRIBE_ERR=1107]="SUBSCRIBE_ERR",t[t.ACCEPT_CARRIER=1108]="ACCEPT_CARRIER",t[t.KICKED_BY_SERVER=1109]="KICKED_BY_SERVER",t[t.CONNECTION_ERR=1110]="CONNECTION_ERR",t[t.LOGOUT=1111]="LOGOUT",t[t.OTHER_CLIENT_LOGIN=1112]="OTHER_CLIENT_LOGIN",t[t.OTHER_CLIENT_JOINED=1113]="OTHER_CLIENT_JOINED",t[t.OTHER_CLIENT_IN_ROOM=1114]="OTHER_CLIENT_IN_ROOM",t[t.OTHER_CLIENT_HANGUP=1151]="OTHER_CLIENT_HANGUP",t[t.REMOTE_JOIN_RTC_ERROR=1205]="REMOTE_JOIN_RTC_ERROR",t[t.REMOTE_PUBLISH_ERROR=1206]="REMOTE_PUBLISH_ERROR",t[t.REMOTE_SUBSCRIBE_ERROR=1207]="REMOTE_SUBSCRIBE_ERROR",t[t.REMOTE_KICKED_BY_SERVER=1209]="REMOTE_KICKED_BY_SERVER",t[t.REMOTE_CONNECTION_ERROR=1210]="REMOTE_CONNECTION_ERROR",t[t.REMOTE_LOGOUT=1211]="REMOTE_LOGOUT",t[t.REMOTE_OTHER_CLIENT_LOGIN=1212]="REMOTE_OTHER_CLIENT_LOGIN",t[t.REMOTE_OTHER_JOINED_RTC=1213]="REMOTE_OTHER_JOINED_RTC",t[t.REMOTE_OTHER_CLIENT_IN_RTC=1214]="REMOTE_OTHER_CLIENT_IN_RTC",t))(A||{});class Ee{constructor(s){l(this,"_audioConfig",{});this._logger=s}setDefaultMicrophoneId(s){return this._audioConfig.microphoneId=s,this}setBitrate(s,e){return!I.isNumber(s)||!I.isNumber(e)||e<=0||s<=0||e<s?(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${s}, max and min is a number > 0, max should > min`),this):(this._audioConfig.minBitrate=s,this._audioConfig.maxBitrate=e,this)}setSampleRate(s){return I.isNumber(s)?(this._audioConfig.sampleRate=s,this):(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O,`params error -> sampleRate: ${s}`),this)}build(){return this._audioConfig}}class Le{constructor(s){l(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});this._logger=s}setFrameRate(s){return N.RCFrameRate[s]?(this._videoConfig.frameRate=s,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O,`params error -> fps: ${s}`),this)}setVideoResolution(s){return N.RCResolution[s]?(this._videoConfig.resolution=s,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O,`params error -> resolution: ${s}`),this)}setDefaultCameraId(s){return this._videoConfig.cameraId=s,this}setBitrate(s,e){return!I.isNumber(s)||!I.isNumber(e)||e<=0||s<=0||e<s?(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${s}, max and min is a number > 0, max should > min`),this):(this._videoConfig.minBitrate=s,this._videoConfig.maxBitrate=e,this)}build(){return this._videoConfig}}const ce=t=>{const{callId:s,callType:e,callDir:_,mediaType:i,callingUserId:r,callUserIds:o,callStatus:E,sessionStatus:L,startTime:c,endTime:T,duration:S,secretChat:C,syncTime:h,sysStatus:f,crtTime:U}=t;return{callId:s,callType:e,callDirection:_,mediaType:i,callerUserId:r,callUserIds:o,sessionState:E,userState:L,startTimestamp:c,endTimestamp:T,duration:S,syncTimestamp:h,systemState:f,createTimestamp:U}},Ce=t=>{const{callId:s,callStatus:e}=t,_=[],i=[],r=[],o=[];return t.callSessionUsers.forEach(E=>{const{userId:L,sessionStatus:c,sysStatus:T}=E;switch(c){case d.INVITED:o.push({callId:s,userId:L,userState:c});break;case d.RINGING:_.push({callId:s,fromUserId:L});break;case d.CONNECTING:r.push({fromUserId:L});break;case d.CANCELLED:case d.DECLINED:case d.ENDED:case d.IDLE:i.push({callId:s,fromUserId:L,userState:c,systemState:T});break}}),{ringingData:_,hangupData:i,acceptData:r,otherInvitedData:o}},de=t=>t&&t.nodeName&&t.nodeName.toUpperCase()==="VIDEO",he=(t,s)=>{let e=!1;const _=[A.INVITED,A.RINGING,A.BUSYLINE_RINGING,A.BUSYLINE_WAIT,A.CONNECTING,A.ONCALL];switch(t){case A.ONCALL:_.includes(s)&&(e=!0);break}return e},Ne=(t,s)=>{let e=!1;const _=[d.INVITED,d.RINGING,d.BUSYLINE_RINGING,d.BUSYLINE_WAIT,d.CONNECTING,d.ONCALL];switch(t){case d.ONCALL:_.includes(s)&&(e=!0);break}return e},Ae=(t,s)=>{let e;switch(t){case d.CALLING:e=A.CANCELLED;break;case d.RINGING:case d.INVITED:e=A.DECLINED;break;case d.CONNECTING:e=s?A.DECLINED:A.CANCELLED;break;case d.ONCALL:e=A.ENDED;break}return e},ee=t=>{const{voipCallInfo:s}=t;if(!s)return!1;const{strategy:e}=JSON.parse(s);return e===1},Te=(t,s)=>(t||t===0)&&(!I.isNumber(t)||t<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> minBitrate: a number of > 0, value: ${t}`}:(s||s===0)&&(!I.isNumber(s)||s<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: a number of > 0, value: ${s}`}:t&&s&&s<t?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: ${s}, minBitrate: ${t}, maxBitrate should > minBitrate`}:{code:a.SUCCESS};var F=(t=>(t.L_QS_START_CALL_S="Call-start-S",t.L_QS_ACCEPT_CALL_S="Call-accept-S",t.L_QS_HANGUP_CALL_S="Call-hangup-S",t.L_QS_RECEIVE_CALL_S="Call-recv-S",t.L_QS_ABNORMAL_HANGUP_S="Call-interrupt-S",t))(F||{});class Re{constructor(s,e){this._logger=s,this._context=e}reportStatisticsData(s,e,_,i,r,o,E){const L=+new Date,{mediaType:c,callType:T,callId:S}=i?{mediaType:i.getMediaType(),callType:i.getCallType(),callId:i.getCallId()}:E,C={cr:"unknown",net:"unknown",cod:e,mtp:c,ctp:T,cid:S,time:L,uid:this._context.getCurrentId()};r&&Object.assign(C,{ccid:r});let h=null;switch(s){case F.L_QS_RECEIVE_CALL_S:h={...C,rf:o};break;case F.L_QS_ABNORMAL_HANGUP_S:h={...C};break;default:h={...C,dur:L-_}}this._logger.info("L-call-plus-statistic",JSON.stringify(h),s),this._logger.__statistics(s,JSON.stringify(h))}}var v=(t=>(t.REQUEST="request",t.ACCEPT="accept",t.REFUSE="refuse",t.CANCEL="cancel",t.NOTICE="notice",t.TIMEOUT="timeout",t))(v||{}),W=(t=>(t[t.SWITCH_MEDIA_TYPE=1]="SWITCH_MEDIA_TYPE",t))(W||{}),_e=(t=>(t[t.NORMAL=0]="NORMAL",t[t.SECRET=1]="SECRET",t))(_e||{}),te=(t=>(t.INVITER="inviter",t.INVITEE="invitee",t))(te||{});class ie extends I.EventEmitter{constructor(e,_,i,r,o,E,L,c){super();l(this,"_reqMediaType");l(this,"_inviterTimerId");l(this,"_inviteeTimerId");l(this,"_oldDialogData");l(this,"isLocalClientHangup",!1);this._callId=e,this._state=_,this._callType=i,this._mediaType=r,this._startCallerId=o,this._callerId=E,this._callUsers=L,this._logger=c}getCallId(){return this._callId}getSessionState(){return this._state}getCallType(){return this._callType}getMediaType(){return this._mediaType}getStartCallerId(){return this._startCallerId}getCallerId(){return this._callerId}getUserList(){return this._callUsers}getReqMediaType(){return this._reqMediaType}getInviterTimerId(){return this._inviterTimerId}getInviteeTimerId(){return this._inviteeTimerId}getAllTimerIds(){return[this._inviterTimerId,this._inviteeTimerId]}setUserDeviceEnable(e,_,i,r){this._logger.info(n.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O,`userId: ${e}, mediaType: ${_}, enable: ${i}`,r);const o=this._callUsers.find(E=>e===E.userId);_===u.AUDIO?o.microphoneEnable=i:o.cameraEnable=i}updateUserList(e,_){const i=[];return e.forEach(r=>{const{userState:o,stateTime:E,systemState:L}=r;if([d.CALLING,d.INVITED,d.BUSYLINE_WAIT].includes(o))this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`push user: ${JSON.stringify(r)}`,_),this._callUsers.push(r),i.push(r);else{let T=!1;for(let S=0;S<this._callUsers.length;S++){const{userId:C,stateTime:h,systemState:f,userState:U}=this._callUsers[S];if(C===r.userId){T=!0;const m=he(f,L),y=Ne(U,o),R=L===A.ON_PHONE_END&&f!==A.ON_PHONE&&o!==d.IDLE;if(E&&h&&E<h||m&&y){try{this._logger.warn(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`timeout user state: old:${JSON.stringify({userId:C,oldStateTime:h,oldSystemState:f,oldUserState:U})}; new:${JSON.stringify(r)}`,_)}catch(M){this._logger.error(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList err: ${M.message}`,_)}break}else{this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> cover ${JSON.stringify(r)}`,_),this._callUsers[S]=r,!R&&i.push(r);break}}}T||(this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> nouser push ${JSON.stringify(r)}`,_),this._callUsers.push(r),i.push(r))}}),i}setOldDialogData(e){this._oldDialogData=e}updateSessionState(e){this._state=e}updateCallType(e){this._callType=e}updateMediaType(e){this._mediaType=e}updateReqMediaType(e){this._reqMediaType=e}updateTimerId(e,_){e==="inviter"?this._inviterTimerId=_:this._inviteeTimerId=_}getOldDialogData(){return this._oldDialogData}setIsLocalClientHangup(e){this.isLocalClientHangup=e}getIsLocalClientHangup(){return this.isLocalClientHangup}}var O=(t=>(t.START_SINGLE_CALL="startSingleCall",t.START_GROUP_CALL="startGroupCall",t.INVITE_CALL="inviteCall",t.PUB_INVITE_CALL="pubInviteCall",t.RINGING_CALL="ringCall",t.ACCEPT_CALL="acceptCall",t.JOIN_CALL="joinCall",t.HANGUP_CALL="hangupCall",t.STATUS_UP_CALL="statusUpCall",t.STATUS_DOWN_CALL="statusDownCall",t.EVENT_UP_CALL="eventUpCall",t.EVENT_DOWN_CALL="eventDownCall",t.DIALOG_UP_CALL="dialogUpCall",t.DIALOG_DOWN_CALL="dialogDownCall",t.GET_CALL_USER_SESSION_LIST="getCallUSerSessionList",t.SYNC_CALL_LOG="syncCallLog",t.PUB_CALL_LOG="pubCallLog",t.DEL_CALL_LOG="deleteCallLog",t.QRY_CALL_STATE="queryUserHasCall",t.QRY_SRV_TIMESTAMP="getCallSrvTimeStamp",t.GET_CALL_STATE_LIST="getUserCallStateList",t.CLEAR_CALL_LOG="cleanCallLog",t.GET_CALL_SESSION="getCallSession",t.GET_CALL_TIME_INFO="getCallTimeInfo",t.END_ABNORMAL_CALL="endUserAbnormalCalls",t.SYS_STATUS_UP="sysStatusUp",t.UP_CALL_LOG_READED="upCallLogReaded",t.PUB_CALL_LOG_READED="pubCallLogReaded",t.PUB_NACK_SEQ_ID="pubNACKSeqId",t.GET_USER_CALL_SESSION_ID_LIST="getUserCallSessionIdList",t))(O||{});const se=(t,s)=>setTimeout(t,s),Oe=t=>new Promise(s=>{setTimeout(s,t)}),ue=[I.ErrorCode.RC_NET_CHANNEL_INVALID,I.ErrorCode.RC_NET_UNAVAILABLE,I.ErrorCode.RC_MSG_RESP_TIMEOUT,N.RCRTCCode.SIGNAL_DISCONNECTED,N.RCRTCCode.REQUEST_FAILED],j=async({asyncFn:t,fnArgs:s,currentRetryTime:e=Date.now(),maxDuration:_=60*1e3,intervals:i=[2*1e3,4*1e3,8*1e3,16*1e3,32*1e3,64*1e3],index:r=0,onError:o})=>{const E=await t(...s),L=2*1e3;return E.code===a.SUCCESS||!ue.includes(E.code)||Date.now()+L-e>_?E:(o&&o(E.code),await Oe(L),j({asyncFn:t,fnArgs:s,currentRetryTime:e,maxDuration:_,intervals:i,index:r,onError:o}))};var x=(t=>(t.onBeforePublish="onBeforePublish",t.onPublishRes="onPublishRes",t.onPubInviteCall="onPubInviteCall",t.onPubInviteCallPullKv="onPubInviteCallPullKv",t.onPubInviteCallMiss="onPubInviteCallMiss",t))(x||{}),X=(t=>(t.NOT_CURRENT_DEVICEID="not current device id",t.SECRET_CALL="secret call",t.NOT_INVITEE="not an invitee",t))(X||{}),Y=(t=>(t.PUB_INVITE="pubinvitecall",t.PULL_KV_INVITE="pullkv_invitecall",t.PUSH="system_pubsh",t))(Y||{});class ge extends I.EventEmitter{constructor(e,_,i,r,o){super();l(this,"_listener");l(this,"_needRetryActions",[O.START_SINGLE_CALL,O.START_GROUP_CALL,O.ACCEPT_CALL,O.JOIN_CALL,O.EVENT_UP_CALL]);l(this,"_sessionId","");this._context=e,this._runtime=_,this._initOpts=i,this._timeCorrectioner=r,this._logger=o,this._context.onCallInfo=this._onRecvCallSignal.bind(this),this._context.onconnectionstatechange=this._onIMConnectionStateChange.bind(this),this._sessionId=I.getUUID22()}getSessionId(){return this._sessionId}registerListener(e){this._listener=e}async startCall(e,_){const{clientCallId:i,callType:r,toUsers:o,mediaType:E,secretChat:L,targetType:c,targetId:T,nickName:S,oldRoomId:C}=e;return r===D.SINGLE?this.startSingleCall({clientCallId:i,toUserId:o[0].userId,mediaType:E,secretChat:L,targetType:c,targetId:T,oldRoomId:C,toOrgId:o[0].orgId||""},_):this.startGroupCall({clientCallId:i,toUsers:o,mediaType:E,targetType:c,targetId:T,nickName:S,oldRoomId:C},_)}async startSingleCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(this._context.getCurrentId(),O.START_SINGLE_CALL,e)}async startGroupCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GROUP_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(this._context.getCurrentId(),O.START_GROUP_CALL,e)}async inviteCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_INVITE_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.INVITE_CALL,e)}async ringingCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_RING_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.RINGING_CALL,e)}async acceptCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_ACCEPT_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.ACCEPT_CALL,e)}async joinCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_JOIN_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.JOIN_CALL,e)}async hangupCall(e,_){this._logger.info(n.L_SIGNAL_TRANSPORTER_HANGUP_T,`params: ${JSON.stringify(e)}`,_);const{code:i}=await this._sendCallSignal(e.callId,O.HANGUP_CALL,e);return i===a.NOT_IN_CALL?{code:a.SUCCESS}:{code:i}}async statusUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T,`call status up params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.STATUS_UP_CALL,e)}async eventUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.EVENT_UP_CALL,e)}async dialogUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.DIALOG_UP_CALL,e)}async deleteCallRecord(e,_,i){return this._logger.info(n.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T,`callIds: ${JSON.stringify(_)}`,i),this._sendCallSignal(e,O.DEL_CALL_LOG,{callIds:_})}async syncCallLog(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.userId,O.SYNC_CALL_LOG,e)}async queryUserHasCall(){const e=this._context.getCurrentId();return this._sendCallSignal(e,O.QRY_CALL_STATE,null)}async getCallServerTimestamp(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T,`userId: ${_}`,e),this._sendCallSignal(_,O.QRY_SRV_TIMESTAMP,null)}async getCallTimeInfo(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T,`callId: ${e}`,_),this._sendCallSignal(e,O.GET_CALL_TIME_INFO,{callId:e})}async getUserCallStateList(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T,`userId: ${_}`,e),this._sendCallSignal(_,O.GET_CALL_STATE_LIST,null)}async clearCallRecord(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T,`userId: ${_}`,e),this._sendCallSignal(_,O.CLEAR_CALL_LOG,null)}async getCallSession(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T,`callId: ${e.callId}`,_),this._sendCallSignal(e.callId,O.GET_CALL_SESSION,e)}async sysStatusUp(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T,`opts: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.SYS_STATUS_UP,e)}async upCallLogReaded(e){const _=this._context.getCurrentId();return this._sendCallSignal(_,O.UP_CALL_LOG_READED,e)}_onIMConnectionStateChange(e){const _=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O,`state: ${e}`,_),this._listener.onIMStateChange(e),e===I.RCConnectionStatus.CONNECTED?this._timeCorrectioner.start(_):this._timeCorrectioner.stop(_)}async _sendCallSignal(e,_,i){const r=i?JSON.stringify({...i,sessionId:this._sessionId}):"";let o;this._needRetryActions.includes(_)?o=await j({asyncFn:this._context.setCallInfo.bind(this._context),fnArgs:[e,_,r]}):o=await this._context.setCallInfo(e,_,r);const{code:E,data:L}=o;if(E!==I.ErrorCode.SUCCESS)return{code:E};const{key:c,value:T}=L,S=JSON.parse(T).data;return{code:a.SUCCESS,data:S}}_onRecvCallSignal(e){const _=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O,`data: ${e}`,_),JSON.parse(e).list.forEach(r=>{const{key:o}=r,E=JSON.parse(r.value);switch(o){case O.PUB_INVITE_CALL:this._onPubInviteCall(E,!0,_);break;case O.STATUS_DOWN_CALL:this._onStatusDownCall(E,_);break;case O.EVENT_DOWN_CALL:this._onEventDownCall(E,_);break;case O.DIALOG_DOWN_CALL:this._onDialogDownCall(E,_);break;case O.PUB_CALL_LOG:this._onPubCallLog(E,_);break;case O.PUB_CALL_LOG_READED:break;case O.PUB_NACK_SEQ_ID:break;default:this._onConpensationData(E,_);break}})}_isValidData(e){return!!(I.isNull(e)||I.isString(e)&&((e==null?void 0:e.length)===0||e===this._sessionId))}_onPubInviteCall(e,_=!0,i){try{const r=this._context.getCurrentId(),o=e.callSessionUsers.find(L=>L.userId===r),E=this._context.getConnectionStatus();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`currentUser: ${JSON.stringify(o)}, currentUserId: ${r}, state: ${E}`,i)}catch(r){this._logger.error(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`error: ${r.message}`,i)}if(!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,i);const r={extra:JSON.stringify(e),reason:X.NOT_CURRENT_DEVICEID,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE};_?this.emit(x.onPubInviteCallMiss,Object.assign(e,r)):this.emit(x.onPubInviteCallMiss,Object.assign(e,r));return}this._listener.onInvite(e,_,i),_?this.emit(x.onPubInviteCall,Object.assign(e,{extra:JSON.stringify(e)})):this.emit(x.onPubInviteCallPullKv,Object.assign(e,{extra:JSON.stringify(e)}))}_onStatusDownCall(e,_){if(e.callSessionUsers=e.callSessionUsers.filter(i=>!!i.changed),this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,"",_),!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,_),this._listener.onOtherClientStatusDown(e,_);return}this._listener.onStatusDown(e,_,this._sessionId)}_onEventDownCall(e,_){this._listener.onEventDown(e,_)}_onDialogDownCall(e,_){const{dialogType:i,action:r,extraKeyVal:o}=e;switch(i){case W.SWITCH_MEDIA_TYPE:this._listener.onSwitchMediaType(e,_);break}}_onPubCallLog(e,_){this._logger.info(n.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O,`call record: ${JSON.stringify(e)}`,_),this._listener.onRecvCallEndLog(e,_)}_onConpensationData(e,_){this._logger.info(n.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O,"",_);const{callId:i,callType:r,mediaType:o,secretChat:E,duration:L,callStatus:c,callingUserId:T,callSessionUsers:S,toDeviceId:C,callDialogEntitys:h}=e;S.some(U=>U.sessionStatus===d.INVITED&&U.userId===this._context.getCurrentId())?this._onPubInviteCall({callId:i,toDeviceId:C,callType:r,mediaType:o,inviteUserId:T,callingUserId:T,callSessionUsers:S,secretChat:E},!0,_):this._onStatusDownCall({callId:i,toDeviceId:C,callStatus:c,duration:L,callSessionUsers:S},_),h.length>0&&h.forEach(U=>this._onDialogDownCall(U,_),this)}}const Ue=t=>{const s="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""),e=s.length+1;let _=+t;const i=[];do{const r=_%e;_=(_-r)/e,i.unshift(s[r])}while(_);return i.join("")},me=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const s=Math.random()*16|0;return(t==="x"?s:s&3|8).toString(16)}),fe=()=>{let t=me();return t=`${t.replace(/-/g,"")}0`,t=parseInt(t,16),t=Ue(t),t.length>22&&(t=t.slice(0,22)),t},pe="RC_CALLPLUS",Me=1;let B;const V=class V{constructor(){}static init(s,e){B=s,this.isSupport()||B.info("[RCCallIndexDB]","IndexDB is not support in the current environment");const _=window.indexedDB.open(pe,Me);_.onerror=i=>{B.warn("[RCCallIndexDB]",`open indexDB req failed -> ${i.target.error}`)},_.onsuccess=i=>{this._db=i.target.result,this._db&&(this._db.onclose=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has unexpectedly closed. ${r}`),this.unInit()},this._db.onerror=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening error. ${r}`),this.unInit()},this._db.onabort=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening aborted. ${r}`),this.unInit()}),V._instance=new V,e.onSuccess()},_.onupgradeneeded=i=>{this._db=i.target.result,V.createObjStore("CallBW_AbnormalCall",{keyPath:"userId"})}}static unInit(){this._db=null,this._instance=null}static getInstance(){return this._instance}static isSupport(){return!(typeof window>"u"||!window||!window.indexedDB)}static createObjStore(s,e){var _;(_=V._db)!=null&&_.objectStoreNames.contains(s)?B.debug("[RCCallIndexDB]",`createObjStore ${s} already exists`):V._db.createObjectStore(s,e)}addValue(s,e){return new Promise((_,i)=>{if(!V._db){_(!1);return}const o=V._db.transaction([s],"readwrite").objectStore(s).add(e);o.onsuccess=()=>{_(!0)},o.onerror=()=>{B.debug("[RCCallIndexDB]","addValue failed"),_(!1)}})}readByKey(s,e){return new Promise((_,i)=>{if(!V._db){_(null);return}const o=V._db.transaction([s]).objectStore(s).get(e);o.onsuccess=()=>{_(o.result)},o.onerror=E=>{B.warn("[RCCallIndexDB]",`readByKey onerror -> ${E}`),_(null)}})}updateByKey(s,e,_){return new Promise((i,r)=>{if(!V._db){i(!1);return}const E=V._db.transaction([s],"readwrite").objectStore(s).put(_);E.onsuccess=()=>{i(!0)},E.onerror=L=>{i(!1),B.warn("[RCCallIndexDB]",`updateByKey onerror -> ${L}`)}})}removeByKey(s,e){return new Promise((_,i)=>{if(!V._db){_(!1);return}const o=V._db.transaction([s],"readwrite").objectStore(s).delete(e);o.onsuccess=()=>{_(!0)},o.onerror=E=>{_(!1),B.warn("[RCCallIndexDB]",`removeByKey onerror -> ${E}`)}})}};l(V,"_db",null),l(V,"_instance",null);let q=V;class De{constructor(s,e){l(this,"_localStore");l(this,"_indexDBStore");l(this,"_storeKey","CallBW_AbnormalCall");l(this,"_isSupportIndexDB");if(this._runtime=s,this._logger=e,this._isSupportIndexDB=q.isSupport(),this._isSupportIndexDB){q.init(this._logger,{onSuccess:()=>{this._indexDBStore=q.getInstance()}});return}this._localStore=s.localStorage}addAbnormallCallId(s,e){(this._isSupportIndexDB?this._addByIndexDB:this._addByLocalStore).call(this,s,e)}removeAbnormalCallIds(s,e){(this._isSupportIndexDB?this._removeByIndexDB:this._removeByLocalStore).call(this,s,e)}getAbnormalCallIds(s){return(this._isSupportIndexDB?this._getByIndexDB:this._getByLocalStore).call(this,s)}_addByLocalStore(s,e){try{const _=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let i=_[s];i?i.push(e):i=[e],_[s]=i,this._localStore.setItem(this._storeKey,JSON.stringify(_))}catch(_){this._logger.warn("[AbnormalCall]",`_addByLocalStore err: ${_.message}`)}}_removeByLocalStore(s,e){try{const _=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let i=_[s];i&&(i=i.filter(r=>!e.includes(r)),i.length>0?_[s]=i:delete _[s],this._localStore.setItem(this._storeKey,JSON.stringify(_)))}catch(_){this._logger.warn("[AbnormalCall]",`_removeByLocalStore err: ${_.message}`)}}_getByLocalStore(s){let e=null;try{const i=JSON.parse(this._localStore.getItem(this._storeKey)||"{}")[s];i&&(e=i)}catch(_){this._logger.warn("[AbnormalCall]",`_getByLocalStore err: ${_.message}`)}return Promise.resolve(e)}async _addByIndexDB(s,e){try{const _=await this._indexDBStore.readByKey(this._storeKey,s);_?(_.callIds.push(e),this._indexDBStore.updateByKey(this._storeKey,s,{userId:s,callIds:_.callIds})):this._indexDBStore.addValue(this._storeKey,{userId:s,callIds:[e]})}catch(_){this._logger.warn("[AbnormalCall]",`_addByIndexDB err: ${_.message}`)}}async _removeByIndexDB(s,e){try{const _=await this._indexDBStore.readByKey(this._storeKey,s);_&&(_.callIds=_.callIds.filter(i=>!e.includes(i)),_.callIds.length>0?this._indexDBStore.updateByKey(this._storeKey,s,{userId:s,callIds:_.callIds}):this._indexDBStore.removeByKey(this._storeKey,s))}catch(_){this._logger.warn("[AbnormalCall]",`_removeByIndexDB err: ${_.message}`)}}async _getByIndexDB(s){let e=null;try{e=await this._indexDBStore.readByKey(this._storeKey,s)}catch(_){this._logger.warn("[AbnormalCall]",`_getByIndexDB err: ${_.message}`)}return e?e.callIds:null}}var re=(t=>(t[t.PROMPT=0]="PROMPT",t[t.CALL_DURATION=10]="CALL_DURATION",t[t.FIRST_FRAME=20]="FIRST_FRAME",t))(re||{}),b=(t=>(t[t.SUCCESS=0]="SUCCESS",t[t.INVALID_RESPONSE_TIME=80170]="INVALID_RESPONSE_TIME",t[t.NONOPTIMAL_RES_TIME=80171]="NONOPTIMAL_RES_TIME",t))(b||{});class ye{constructor(s,e,_){l(this,"_RTT",0);l(this,"_validMinRTT",200);l(this,"_validMaxRTT",1e3);l(this,"_deltaTime",0);l(this,"_timerId",null);l(this,"_interval",2*1e3);l(this,"_maxRetryTimes",8);l(this,"_startTimes",0);l(this,"_retryTimesInCall",0);l(this,"_maxRetryTimesInCall",3);this._callEngine=s,this._logger=e,this._singleCallDurationEv=_}async getCallClientTimeByServer(s,e){this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T,`callId: ${s}`,e),(!this._RTT||this._RTT>this._validMinRTT)&&await this._getDeltaTime(e),this._RTT>this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${b.INVALID_RESPONSE_TIME}`,e);const{code:_,data:i}=await this._callEngine.getCallTimeInfo(s,e);if(_!==a.SUCCESS)return this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${_}`,e),{code:_};const{startTime:r}=i,o=Math.floor(r-this._deltaTime);let L=(Date.now()+this._deltaTime-r)/1e3;return L<0&&(this._logger.warn(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P,`invalid duration: ${L}`,e),L=0),L=Math.floor(L),this._RTT>this._validMinRTT&&this._RTT<=this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${b.NONOPTIMAL_RES_TIME}`,e),this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,serverStartTime:r,clientStartTime:o,duration:L}),e),{code:_,duration:L,clientStartTime:o}}calcClientStartTime(s,e,_){if(this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T,`callId: ${s}, startTime: ${e}`,_),this._RTT>this._validMaxRTT)return this._logger.error(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,`code: ${b.INVALID_RESPONSE_TIME}`,_),this._loopCorrectClientTime(s,_),{code:b.INVALID_RESPONSE_TIME};const i=Math.floor(e-this._deltaTime);return this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,startT:e,clientStartTime:i}),_),this._RTT>this._validMinRTT&&(this._retryTimesInCall=0,this._loopCorrectClientTime(s,_)),{code:b.SUCCESS,clientStartTime:i}}start(s){this._timerId||this._startTimes>=this._maxRetryTimes||(this._logger.info(n.L_TIME_CORRECT_START_O,`timerId: ${this._timerId}`),this._startTimes++,this._getDeltaTime(s),this._timerId=se(()=>{this._timerId=null,this.start(s)},this._interval))}stop(s){this._logger.info(n.L_TIME_CORRECT_STOP_O,`timerId: ${this._timerId}`,s),this._timerId&&clearTimeout(this._timerId),this._timerId=null,this._startTimes=0}restart(s){this._logger.info(n.L_TIME_CORRECT_RESTART_O,`legal rtt time, RTT: ${this._RTT}, validMinRTT: ${this._validMinRTT}`,s),!(this._RTT<this._validMinRTT)&&(this.stop(s),this.start(s))}getLocalDelayTime(){return this._deltaTime}getRTT(){return this._RTT}async _getDeltaTime(s){const e=Date.now(),{code:_,data:i}=await this._callEngine.getCallServerTimestamp(s),r=Date.now();if(_!==a.SUCCESS)return{code:_};const o=r-e;return(o<this._RTT||this._RTT===0)&&o<=this._validMaxRTT&&(this._RTT=o),o<this._validMinRTT&&this.stop(s),this._deltaTime=i-e-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime}),s),{code:_,delayTime:this._deltaTime}}async _getDeltaTimeInCall(s,e){const _=Date.now(),{code:i,data:r}=await this._callEngine.getCallTimeInfo(s,e),o=Date.now();if(i!==a.SUCCESS)return{code:i};const E=o-_;E<this._RTT&&(this._RTT=E),this._deltaTime=r.syncTime-_-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({callId:s,rtt:this._RTT,deltaT:this._deltaTime}),e);const L=Math.floor(r.startTime-this._deltaTime),c=Math.floor(r.firstFrametime-this._deltaTime);return E<this._validMinRTT?{code:b.SUCCESS,clientStartTime:L,clientFirstFrameTime:c}:{code:b.INVALID_RESPONSE_TIME,clientStartTime:L,clientFirstFrameTime:c}}async _loopCorrectClientTime(s,e){this.stop(e),this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T,`callId: ${s}`,e);const{code:_,clientStartTime:i,clientFirstFrameTime:r}=await this._getDeltaTimeInCall(s,e);if(_===b.SUCCESS){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${a.SUCCESS}`,e),this._singleCallDurationEv(s,i,r,e);return}if(this._retryTimesInCall>this._maxRetryTimesInCall&&_===b.INVALID_RESPONSE_TIME){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${b.INVALID_RESPONSE_TIME}`,e),this._singleCallDurationEv(s,i,r,e);return}this._retryTimesInCall>this._maxRetryTimesInCall||(this._retryTimesInCall++,setTimeout(()=>{this._loopCorrectClientTime(s,e)},this._interval))}}var Q=(t=>(t[t.SOON_AFETER=0]="SOON_AFETER",t[t.CURRENT=1]="CURRENT",t))(Q||{}),ne=(t=>(t[t.PUB_INVITE_CALL=0]="PUB_INVITE_CALL",t[t.PULL_KV_INVITE_CALL=1]="PULL_KV_INVITE_CALL",t[t.SYSTEM_PUSH=2]="SYSTEM_PUSH",t))(ne||{}),oe=(t=>(t[t.OUT=-1]="OUT",t[t.GROUP=0]="GROUP",t[t.IN=1]="IN",t))(oe||{});const Se=60*1e3,w=class w extends I.EventEmitter{constructor(e,_,i,r,o){super();l(this,"_mainSession",null);l(this,"_holdSessions",[]);l(this,"_signalModule");l(this,"_abnormalModule");l(this,"_isUpFirstFrameTime",!1);l(this,"_callStartMap",{});l(this,"_timeCorrectioner");this._context=e,this._runtime=_,this._initOpts=i,this._logger=r,this._reportAppEventModule=o,this._timeCorrectioner=new ye(this,r,this._onRecvSinCallDuration.bind(this)),this._signalModule=new ge(e,_,i,this._timeCorrectioner,this._logger),this._signalModule.registerListener({onInvite:this._onInvite.bind(this),onStatusDown:this._onStatusDown.bind(this),onOtherClientStatusDown:this._onOtherClientStatusDown.bind(this),onEventDown:this._onEventDown.bind(this),onSwitchMediaType:this._onSwitchMediaType.bind(this),onRecvCallEndLog:this._onRecvCallEndLog.bind(this),onIMStateChange:this._onIMStateChange.bind(this)}),this._abnormalModule=new De(_,r)}async startCall(e,_){const i=this._context.getCurrentId(),{callType:r,mediaType:o,toUsers:E,targetId:L,targetType:c,oldRoomId:T}=e,{code:S,data:C}=await this._signalModule.startCall({clientCallId:e.callId,callType:r,mediaType:o,toUsers:E,secretChat:_e.NORMAL,targetType:c,targetId:L,oldRoomId:T},_);if(S!==a.SUCCESS)return{code:S};const{callId:h,busylineUsers:f}=C;if(this._abnormalModule.addAbnormallCallId(i,h),this._mainSession=new ie(h,p.INVITED,r,o,i,i,[],this._logger),r===D.SINGLE){const R=this._startTimer(C.callId,d.NO_ANSWER,_);this._mainSession.updateTimerId(te.INVITER,R)}const U={userId:i,userState:d.CALLING,systemState:A.CALLING,targetType:c,targetId:L,cameraEnable:!1,microphoneEnable:!1};let m=E.map(({userId:R,targetType:M,targetId:P})=>({userId:R,userState:d.INVITED,systemState:A.INVITED,targetType:M,targetId:P,cameraEnable:!1,microphoneEnable:!1})),y=[];return f&&(y=f.map(R=>{const{targetType:M,targetId:P}=m.find(H=>H.userId===R.userId);return{userId:R.userId,userState:R.sessionStatus,systemState:A.BUSYLINE_RINGING,targetType:M,targetId:P,cameraEnable:!1,microphoneEnable:!1}}),m=m.filter(({userId:R})=>y.every(({userId:M})=>M!==R))),setTimeout(()=>{this.updateUsersState(h,[U,...m,...y],_)}),{code:S,data:C}}async invite(e,_){var L;if(!this._mainSession)return{code:a.NOT_IN_CALL};const{toUsers:i}=e,r=this._mainSession.getCallId(),{code:o,data:E}=await this._signalModule.inviteCall({callId:r,toUsers:i},_);if(o===a.SUCCESS){this._mainSession.getCallType()===D.SINGLE&&(this._mainSession.updateCallType(D.MULTI),this._onCallTypeChange(this._mainSession.getCallId(),D.MULTI,_));let c=i.map(({userId:S,targetType:C,targetId:h})=>({userId:S,userState:d.INVITED,systemState:A.INVITED,targetType:C,targetId:h,cameraEnable:!1,microphoneEnable:!1})),T=[];E.busylineUsers&&(T=(L=E.busylineUsers)==null?void 0:L.map(S=>{const{targetType:C,targetId:h}=c.find(f=>f.userId===S.userId);return{userId:S.userId,userState:S.sessionStatus,systemState:A.BUSYLINE_RINGING,targetType:C,targetId:h,cameraEnable:!1,microphoneEnable:!1}}),c=c.filter(({userId:S})=>T.every(({userId:C})=>C!==S))),this.updateUsersState(r,[...c,...T],_)}return{code:o,data:E}}clearAllTimer(e,_){[this._mainSession,...this._holdSessions].forEach(i=>{i&&i.getCallId()===e&&i.getAllTimerIds().forEach(r=>this._stopTimer.bind(this)(r,_))})}async hangup(e,_){return this._signalModule.hangupCall({callId:e.callId,sysStatus:e.systemState},_)}async accept(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const{code:i}=await this._signalModule.acceptCall({callId:e.callId},_);return this._stopTimer(this._mainSession.getInviteeTimerId(),_),i!==a.SUCCESS?{code:i}:(this._clearMobileOnPhone(e.callId,_),this._mainSession.updateSessionState(p.CONNECTING),{code:i})}async joinCall(e,_){const i=this._context.getCurrentId();this._mainSession&&this._stopTimer(this._mainSession.getInviteeTimerId(),_);const{code:r}=await this._signalModule.joinCall({callId:e.callId},_);return r!==a.SUCCESS?{code:r}:(this._abnormalModule.addAbnormallCallId(i,e.callId),this._mainSession?this._clearMobileOnPhone(e.callId,_):await this._createSessionByServer(e.callId,!0,_),{code:r})}async requestChangeMediaType(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const i={mediaType:e.mediaType};this._mainSession.updateReqMediaType(e.mediaType);const r=fe(),{code:o}=await this._signalModule.dialogUpCall({transactionId:r,callId:this._mainSession.getCallId(),toUserIds:e.toUserIds,dialogType:W.SWITCH_MEDIA_TYPE,action:v.REQUEST,extraKeyVal:i},_);return o!==a.SUCCESS?{code:o}:{code:a.SUCCESS,data:{transactionId:r}}}async responseChangeMediaType(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const i=this._mainSession.getReqMediaType();return e.agree&&(this._mainSession.updateMediaType(i),this._mainSession.updateReqMediaType(null)),this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:W.SWITCH_MEDIA_TYPE,action:e.agree?v.ACCEPT:v.REFUSE},_)}async cancelChangeMediaType(e,_){return this._mainSession?this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:W.SWITCH_MEDIA_TYPE,action:v.CANCEL},_):{code:a.NOT_IN_CALL}}async getCallLogList(e,_){const i=this._context.getCurrentId(),{code:r,data:o}=await this._signalModule.syncCallLog({userId:i,syncTime:e.timestamp,count:e.count},_);if(r!==a.SUCCESS)return{code:r};const E=o.callLogList.map(L=>ce(L));return{code:a.SUCCESS,data:{hasMore:!!(o!=null&&o.hasMore),maxTime:o.maxTime,list:E}}}async deleteCallLog(e,_){const i=this._context.getCurrentId();return this._signalModule.deleteCallRecord(i,e,_)}async getCallServerTimestamp(e){const{code:_,data:i}=await this._signalModule.getCallServerTimestamp(e);return _!==a.SUCCESS?{code:_}:{code:_,data:i.syncTime}}async getCallTimeInfo(e,_){return this._signalModule.getCallTimeInfo(e,_)}async getOpenCallList(e){const _=this._context.getCurrentId(),{code:i,data:r}=await this._signalModule.getUserCallStateList(e);if(i!==a.SUCCESS)return{code:i};const o=r.callStateList.map(E=>{const{callId:L,callType:c,mediaType:T,callingUserId:S,callUserIds:C,callStatus:h,crtTime:f,userSessionStatus:U,targetType:m,targetId:y,startTime:R,syncTime:M}=E,P=S===_?oe.OUT:oe.IN,{clientStartTime:H=R}=this._timeCorrectioner.calcClientStartTime(L,R,e);return{callId:L,callType:c,callDirection:P,mediaType:T,callerUserId:S,callUserIds:C,sessionState:h,userState:U,startTimestamp:R,endTimestamp:0,duration:Math.floor((+new Date-H)/1e3),syncTimestamp:M,systemState:0,createTimestamp:f}});return{code:i,data:o}}async removeAllCallLog(e){const{code:_}=await this._signalModule.clearCallRecord(e);return _!==a.SUCCESS?{code:_}:{code:_}}async getCallSession(e,_){const{code:i,data:r}=await this._signalModule.getCallSession(e,_);if(i!==a.SUCCESS)return{code:i};const{callId:o,callingUserId:E,callType:L,mediaType:c,callStatus:T,callSessionUsers:S,startTime:C,duration:h,syncTime:f}=r,U=S.map(m=>{const{userId:y,sessionStatus:R,sysStatus:M,targetType:P,targetId:H}=m;return{userId:y,userState:R,systemState:M,targetType:P,targetId:H,cameraEnable:!1,microphoneEnable:!1}});return{code:i,data:{callId:o,startCallerId:E,callType:L,mediaType:c,sessionState:T,callSessionUsers:U,startTime:C,duration:h,syncTime:f}}}getHoldSession(e){const _=this._holdSessions.find(i=>i&&i.getCallId()===e);return _?new K(_,this,this._logger):null}getLocalMainSession(){return this._mainSession?new K(this._mainSession,this,this._logger):null}updateMainSessionState(e){var _;(_=this._mainSession)==null||_.updateSessionState(e)}setIsLocalClientHangup(e){var _;(_=this._mainSession)==null||_.setIsLocalClientHangup(e)}updateUsersState(e,_,i){this._logger.info(n.L_CALL_ENGINE_UPDATE_USERS_STATE_O,`updateUsersState -> users: ${JSON.stringify(_)}`,i);const r=[this._mainSession,...this._holdSessions].find(E=>(E==null?void 0:E.getCallId())===e),o=[];if(r){const E=_.map(L=>{const c=r.getUserList().filter(({userId:h})=>h===L.userId)[0]||{},T=L.userState===d.IDLE,{cameraEnable:S=!1,microphoneEnable:C=!1}=T?{cameraEnable:!1,microphoneEnable:!1}:c;return{...L,cameraEnable:S,microphoneEnable:C}});o.push(...r.updateUserList(E,i))}else o.push(..._);o.length>0&&this._onUserStateChange(e,o,i)}setUserDeviceEnable(e,_,i,r){var o;(o=this._mainSession)==null||o.setUserDeviceEnable(e,_,i,r)}async getCallStaringTime(e,_){return this._timeCorrectioner.getCallClientTimeByServer(e.callId,_)}async systemStatusUp(e,_){return this._signalModule.sysStatusUp(e,_)}async upFirstFrameTime(e){if(!this._mainSession||this._mainSession&&this._mainSession.getCallType()!==D.SINGLE||this._isUpFirstFrameTime)return{code:a.SUCCESS};const i=Date.now(),r=this._timeCorrectioner.getLocalDelayTime(),o=Math.floor(i+r);this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T,`now: ${i}; delay: ${r}; streamReadyTime: ${o}`,e),this._isUpFirstFrameTime=!0;const E=this._mainSession.getCallId(),{code:L}=await this._signalModule.eventUpCall({callId:E,eventType:re.FIRST_FRAME,eventArgs:{streamReadyTime:o},eventTime:Date.now()},e);return this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R,`code: ${L}`,e),{code:L}}endCurrentSession(e,_,i){const r=this._context.getCurrentId();if(this._mainSession&&this._mainSession.getCallId()===_){const o=this._mainSession.getUserList().map(L=>{let{userId:c,userState:T,systemState:S,targetType:C,targetId:h}=L;return c===r&&(S=e),{userId:c,sessionStatus:d.ENDED,statusTime:Date.now(),duration:0,changed:1,inviteUserId:this._mainSession.getStartCallerId(),sysStatus:S,targetType:C,targetId:h}}),E={callId:this._mainSession.getCallId(),toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:o};this._onStatusDown(E,i)}}startTimeCorrection(e){this._timeCorrectioner.restart(e)}getDelayTimeInfo(){return{delayTime:this._timeCorrectioner.getLocalDelayTime(),rtt:this._timeCorrectioner.getRTT()}}upgradeMainSession(e){var i;const _=this._holdSessions.findIndex(r=>r.getCallId()===e);this._mainSession=(i=this._holdSessions.splice(_,1))==null?void 0:i[0]}_onIMStateChange(e){const _=this._logger.createTraceId();let i=0;e===I.RCConnectionStatus.DISCONNECTED&&this._mainSession&&this._mainSession.getSessionState()!==p.ONCALL&&(i=se(()=>{var r;this._logger.info(n.L_CALL_ENGINE_IM_STATE_CHANGE_O,"endCurrentSession, IM disconnected for more than 60s",_),this.endCurrentSession(A.CONNECTION_ERR,(r=this._mainSession)==null?void 0:r.getCallId(),_)},Se)),e===I.RCConnectionStatus.CONNECTED&&i&&clearTimeout(i)}_handleCallTimeout(e,_,i){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`call timeout callId: ${e}, userState: ${_}`,i);const r=[this._mainSession,...this._holdSessions].find(E=>E&&E.getCallId()===e);if(!r){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`handleCallTimeout without session, callId: ${e}`,i);return}const o=this._context.getCurrentId();this._onStatusDown({callId:e,toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:r.getUserList().map(E=>{const{userId:L,targetType:c,targetId:T,stateTime:S}=E;let C,h;return L===o?(C=_===d.MISSED?A.MISSED:A.NO_ANSWER,h=_===d.MISSED?d.MISSED:d.NO_ANSWER):(C=_===d.MISSED?A.NO_ANSWER:A.MISSED,h=_===d.MISSED?d.NO_ANSWER:d.MISSED),{userId:L,sessionStatus:h,statusTime:S?S+1:Date.now(),duration:0,changed:1,inviteUserId:r.getCallerId(),sysStatus:C,targetType:c,targetId:T}})},i)}_startTimer(e,_,i){const r=se(()=>{this._handleCallTimeout(e,_,i),this._signalModule.statusUpCall({callId:e,sessionStatus:_},i)},Se);return this._logger.info(n.L_CALL_ENGINE_START_CALL_TIMER_O,`callId: ${e}, timerId: ${r}`,i),r}_stopTimer(e,_){clearTimeout(e),this._logger.info(n.L_CALL_ENGINE_STOP_CALL_TIMER_O,`timerId: ${e}`,_)}_onInvite(e,_,i){var U,m,y;const r=this._context.getCurrentId(),{callId:o,inviteUserId:E,callType:L,mediaType:c,callSessionUsers:T,secretChat:S,callingUserId:C}=e;if(S===_e.SECRET){this.emit(x.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:X.SECRET_CALL,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE}));return}if(T.some(R=>R.userId===r)){this._abnormalModule.addAbnormallCallId(r,o);const R=new ie(o,p.RINGING,L,c,E,E,[],this._logger);this._signalModule.ringingCall({callId:o},i);const M=this._startTimer(o,d.MISSED,i);R.updateTimerId(te.INVITEE,M),this._mainSession?(this._holdSessions.push(R),this._mainSession.updateSessionState(p.BUSYLINE_WAIT)):this._mainSession=R;const P=new K(R,this,this._logger);this._reportAppEventModule.onReceivedCall(P,i);const H=_?ne.PUB_INVITE_CALL:ne.PULL_KV_INVITE_CALL;this.emit(w.__INNER_INVITE__,P,H);const Z=T.map(({userId:ae,sessionStatus:be,sysStatus:ve,targetType:Be,targetId:we,statusTime:$e})=>({userId:ae,userState:be,systemState:ve,targetType:Be,targetId:we,stateTime:$e,cameraEnable:!1,microphoneEnable:!1}));this.updateUsersState(o,Z,i)}else this.emit(x.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:X.NOT_INVITEE,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE}));const f=T.filter(R=>R.userId!==r&&R.userId!==E&&R.sessionStatus===d.INVITED);if(f.length>0){((U=this._mainSession)==null?void 0:U.getCallType())===D.SINGLE&&((m=this._mainSession)==null?void 0:m.getCallId())===o&&(this._onCallTypeChange(this._mainSession.getCallId(),D.MULTI,i),(y=this._mainSession)==null||y.updateCallType(D.MULTI));const R=[],M=[];f.forEach(P=>{const{userId:H,sessionStatus:Z,sysStatus:ae}=P;R.push({callId:o,userId:H,userState:Z}),M.push({userId:H,userState:Z,systemState:ae,cameraEnable:!1,microphoneEnable:!1})}),this._onOtherMemberInvite(R),this.updateUsersState(o,M,i)}}_onHangup(e,_,i){this._mainSession&&e.forEach(r=>{r.callId===this._mainSession.getCallId()&&(r.userState===d.CANCELLED?this._stopTimer(this._mainSession.getInviteeTimerId(),i):this._stopTimer(this._mainSession.getInviterTimerId(),i))})}_onAccept(e,_){var L,c,T,S;const i=(L=this._mainSession)==null?void 0:L.getSessionState(),r=[p.CONNECTING,p.ONCALL,p.BUSYLINE_WAIT];if(((c=this._mainSession)==null?void 0:c.getCallType())===D.SINGLE&&i&&r.includes(i))return;const o=this._mainSession.getStartCallerId(),E=this._context.getCurrentId();((T=this._mainSession)==null?void 0:T.getCallType())===D.SINGLE&&o===E&&e.filter(h=>h.fromUserId!==E)&&this.emit(w.__INNER_SESSION_CONNECT__,this.getLocalMainSession().getCallId(),_),(S=this._mainSession)==null||S.updateSessionState(p.CONNECTING),this._stopTimer(this._mainSession.getInviterTimerId(),_)}async _onStatusDown(e,_){var f,U;const{callStatus:i,startTime:r,syncTime:o,callId:E}=e;if(E!==((f=this._mainSession)==null?void 0:f.getCallId()))return;if(this._callStartMap[E]=this._callStartMap[E]||{},!this._callStartMap[E].isReceiveCallStartTime&&i===p.ONCALL){this._callStartMap[E].isReceiveCallStartTime=!0;const{code:m,clientStartTime:y}=await this._timeCorrectioner.calcClientStartTime(E,r,_);m===b.SUCCESS&&this._reportAppEventModule.onReceivedCallStartTime({callId:E,callStartTime:y},_)}let L=!1;const c=this._context.getCurrentId(),T=e.callSessionUsers.map(m=>([d.IDLE,d.DECLINED,d.MISSED,d.NO_ANSWER,d.CANCELLED].includes(m.sessionStatus)&&m.userId===c&&(L=!0),{userId:m.userId,userState:m.sessionStatus,systemState:m.sysStatus,stateTime:m.statusTime,cameraEnable:!1,microphoneEnable:!1}));if(T.length>0&&this.updateUsersState(E,T,_),!this._mainSession&&!this._holdSessions.length)return;const{hangupData:S,acceptData:C,otherInvitedData:h}=Ce(e);S.length>0&&this._onHangup(S,e.callStatus,_),C.length>0&&this._onAccept(C,_),h.length>0&&((U=this._mainSession)==null?void 0:U.getCallType())===D.MULTI&&this._onOtherMemberInvite(h),(e.callStatus===p.ENDED||L)&&this.sessionClose(e,_,!0)}_onOtherClientStatusDown(e,_){var c,T,S;const i=this._context.getCurrentId(),{callId:r,callSessionUsers:o,callStatus:E}=e,L=o.find(({userId:C})=>C===i);if(L&&(this._mainSession||this._holdSessions.length)){const{userId:C,sessionStatus:h,statusTime:f}=L;if(h===d.CONNECTING){const U=[d.ONCALL,d.CONNECTING],m=((c=this._mainSession)==null?void 0:c.getCallId())===r,y=(S=(T=this._mainSession)==null?void 0:T.getUserList().find(M=>M.userId===i))==null?void 0:S.userState;m&&y&&U.includes(y)||(this.updateUsersState(r,[{userId:C,userState:h,systemState:A.OTHER_CLIENT_ACCEPT,stateTime:f,cameraEnable:!1,microphoneEnable:!1}],_),this.sessionClose(e,_,!1))}}}async _onEventDown(e,_){var c;const{callId:i,eventTime:r,eventArgs:o,eventType:E,fromUserId:L}=e;if(E===re.CALL_DURATION&&i===((c=this._mainSession)==null?void 0:c.getCallId())){const{firstFrameTime:T}=o,{code:S,clientStartTime:C}=await this._timeCorrectioner.calcClientStartTime(i,T,_);this._logger.info(n.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O,`clientFirstFrameTime: ${C}`,_),S===b.SUCCESS&&this._reportAppEventModule.onReceivedCallFirstFrameTime(i,C,_)}}_onRecvSinCallDuration(e,_,i,r){var o;((o=this._mainSession)==null?void 0:o.getCallId())===e&&(this._reportAppEventModule.onReceivedCallStartTime({callId:e,callStartTime:_},r),this._reportAppEventModule.onReceivedCallFirstFrameTime(e,i,r))}_onSwitchMediaType(e,_){var U,m,y,R,M;const{callId:i,action:r,extraKeyVal:o,transactionId:E,promoterId:L}=e,{mediaType:c,reason:T}=o,S=(U=this._mainSession)==null?void 0:U.getCallId();if(i!==S){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`not current session callId: ${S}, recvCallId: ${i}`,_);return}const{transactionId:C,action:h,mediaType:f}=((m=this._mainSession)==null?void 0:m.getOldDialogData())||{};if(C===E&&h===r&&f===c){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,"duplicate dialog data",_);return}if(this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`action: ${r}, reason: ${T}`,_),(y=this._mainSession)==null||y.setOldDialogData({transactionId:E,action:r,mediaType:c}),r===v.REQUEST)this._onRequestChangeMediaType({transactionId:E,userId:L,mediaType:c},_);else{let P=null;switch(T){case v.CANCEL:P=k.CANCEL_CHANGE_MEDIA_TYPE;break;case v.ACCEPT:P=k.SERVER_ALLOW_MEDIA_TYPE,(R=this._mainSession)==null||R.updateMediaType(this._mainSession.getReqMediaType()),(M=this._mainSession)==null||M.updateReqMediaType(null);break;case v.REFUSE:P=k.REFUSE_CHANGE_MEDIA_TYPE;break;case v.TIMEOUT:P=k.CHANGE_MEDIA_TYPE_TIMEOUT;break}k[P]&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},P,_)}r===v.NOTICE&&c===u.AUDIO&&!T&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},k.SERVER_ALLOW_MEDIA_TYPE,_)}_onRecvCallEndLog(e,_){const i=ce(e);this._reportAppEventModule.onReceivedCallRecord(i,_)}sessionClose(e,_,i){const{callId:r}=e,o=this._context.getCurrentId();this._abnormalModule.removeAbnormalCallIds(o,[r]);let E=[this._mainSession,...this._holdSessions].find(T=>T&&T.getCallId()===r);if(!E){this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`unexpect session callId -> ${r}`,_);return}this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`callId: ${r}`,_),this._mainSession&&this._mainSession.getCallId()===r&&(this._mainSession.getAllTimerIds().forEach(T=>this._stopTimer.bind(this)(T,_)),E.getCallType()===D.SINGLE&&(this._isUpFirstFrameTime=!1),delete this._callStartMap[r]),this.emit(w.__INNER_SESSION_CLOSE__,r,_);const L=E.getUserList().find(T=>T.userId===o);let c;i&&e.toDeviceId!==this._signalModule.getSessionId()&&(c=E.getIsLocalClientHangup()?L.systemState:A.OTHER_CLIENT_HANGUP),this._reportAppEventModule.onCallEnded(new K(E,this,this._logger),c||L.systemState,_),this._removeSession(r)}_removeSession(e){var _;if(e===((_=this._mainSession)==null?void 0:_.getCallId()))this._mainSession=null;else{const i=this._holdSessions.findIndex(r=>(r==null?void 0:r.getCallId())===e);this._holdSessions.splice(i,1)}}async _createSessionByServer(e,_=!1,i){this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T,`callId: ${e}`,i);const{code:r,data:o}=await this.getCallSession({callId:e},i);if(r!==a.SUCCESS){this._logger.error(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`errcode: ${r}`,i);return}this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`code: ${r}, data: ${JSON.stringify(o)}`,i);const{callType:E,mediaType:L,callSessionUsers:c,startCallerId:T}=o;this._mainSession=new ie(e,p.CONNECTING,E,L,T,T,[],this._logger),_&&this._clearMobileOnPhone(e,i),this.updateUsersState(e,c,i)}async _clearMobileOnPhone(e,_){const i=[this._mainSession,...this._holdSessions].find(r=>(r==null?void 0:r.getCallId())===e);if(i&&i.getCallType()===D.MULTI){this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_T,`callId: ${e}`,_);const{code:r}=await this.systemStatusUp({callId:e,sysStatus:A.ON_PHONE_END,forward:Q.CURRENT},_);r===a.SUCCESS?this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}`,_):this._logger.warn(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}, errCode: ${r}`,_)}}_onUserStateChange(e,_,i){const r=this._context.getCurrentId();_.forEach(o=>{const{userId:E,userState:L,systemState:c}=o;E!==r&&this._reportAppEventModule.onRemoteUserStateChanged({callId:e,userId:E,userState:L,reason:c},i)}),_.forEach(({userId:o,systemState:E})=>{o===r&&E===A.ABNORMAL_END&&this.emit(w.__INNER_SESSION_CLOSE__,e,i)})}_onOtherMemberInvite(e){e.forEach(_=>{var E;const{userId:i,callId:r}=_,o=(E=this.getLocalMainSession())==null?void 0:E.getInviterUserId();this._reportAppEventModule.onRemoteUserInvited([i],o,r)})}_onRequestChangeMediaType(e,_){const{userId:i,transactionId:r,mediaType:o}=e;this._reportAppEventModule.onReceivedChangeMediaTypeRequest(i,r,o,_)}_receiveMediaTypeChangeResult(e,_,i){_===k.SERVER_ALLOW_MEDIA_TYPE&&this.emit(w.__INNER_CHANGE_MEDIA_TYPE__,e.mediaType,i),this._reportAppEventModule.onReceivedChangeMediaTypeResult({...e,code:_},i)}_onCallTypeChange(e,_,i){this._reportAppEventModule.onCallTypeChanged(_,e,i)}};l(w,"__INNER_SESSION_CLOSE__","inner-session-close"),l(w,"__INNER_SESSION_CONNECT__","inner-session-connect"),l(w,"__INNER_CHANGE_MEDIA_TYPE__","inner-change-media-type"),l(w,"__INNER_INVITE__","inner-invite");let J=w;var z=(t=>(t.NORMAL="RongCloudRTC",t.SCREEN="ScreenShare",t))(z||{});const G=class G extends I.EventEmitter{constructor(e,_,i,r,o,E){super();l(this,"_rtcClient");l(this,"_localTracks",[]);l(this,"_room",null);l(this,"_callId","");l(this,"_callMediaType");l(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});l(this,"_audioConfig",{});l(this,"_isPubTiny",!1);l(this,"_videoConfigIsChange",!1);l(this,"_audioConfigIsChange",!1);l(this,"_userViewMap",{});l(this,"_callPlusStatusReportListener",null);l(this,"_remoteAudioEnable",!0);this._context=e,this._runtime=_,this._initOpts=i,this._logger=r,this._callEngine=o,this._reportAppEventModule=E,this._rtcClient=i==null?void 0:i.rtcClient,this._isPubTiny=i.isPubTiny||!1}setCallPlusStatusReportListener(e){this._callPlusStatusReportListener=e}async getCameraVideoTrack(e){const _=this.getLocalVideoTrack(),{code:i,track:r}=_&&!this._videoConfigIsChange?{track:_,code:a.SUCCESS}:await this._createVideoTrack(e);return this._videoConfigIsChange=!1,i!==a.SUCCESS?{code:i}:{code:a.SUCCESS,track:r}}async getMicrophoneAudioTrack(e){const _=this.getLocalAudioTrack(),{code:i,track:r}=_&&!this._audioConfigIsChange?{track:_,code:a.SUCCESS}:await this._createAudioTrack(e);return this._audioConfigIsChange=!1,i!==a.SUCCESS?{code:i}:{code:a.SUCCESS,track:r}}async createCallMediaTracks(e,_){this._callMediaType=e;const{code:i}=await this.getMicrophoneAudioTrack(_);if(i!==a.SUCCESS)return{code:i};if(e===u.AUDIO_VIDEO){const{code:r}=await this.getCameraVideoTrack(_);if(r!==a.SUCCESS)return{code:r}}return{code:a.SUCCESS}}setVideoConfig(e){this._videoConfigIsChange=!0,this._videoConfig=e}setAudioConfig(e){this._audioConfigIsChange=!0,this._audioConfig=e}destroyAllTracks(e){this._logger.info(n.L_RTC_MODULE_DESTROY_ALL_TRACKS_O,"",e),this._localTracks.forEach(_=>{_.destroy()}),this._localTracks.length=0}setAllRemoteAudioEnable(e,_){return this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T,`enable: ${e}`,_),I.isBoolean(e)?(this._remoteAudioEnable=e,this._room?(this._room.getRemoteTracks().filter(r=>r.isAudioTrack()).forEach(r=>{e?r.unmute():r.mute()}),this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,"success",_),{code:a.SUCCESS}):{code:a.SUCCESS}):(this._logger.error(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,`param error, enable: type is boolean, value: ${e}`),{code:a.PARAM_ERROR})}async destroyTrack(e){e.destroy();const _=this._localTracks.findIndex(i=>i.getTrackId()===e.getTrackId());this._localTracks.splice(_,1)}async sessionConnected(e,_){var i;this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_T,`callId: ${e}`,_);try{if(!this._room){const{code:r,room:o}=await this.joinRTCRoom(e,_);if(r!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`errCode -> ${r}`,_);return}this._callId=e,this._regRTCListeners(),this._room=o;const E=((i=this._room)==null?void 0:i.getRemoteUserIds())||[];E.length>0&&this._onOtherMemJoined(E.map(L=>({callId:e,userId:L})),_)}}catch(r){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`callId -> ${e}, err msg -> ${r.message}`,_);return}try{if(this._localTracks.length>0){this.emit(x.onBeforePublish);const r=this._isPubTiny?this._localTracks.map(E=>E.isVideoTrack()?{track:E,isPubTiny:!0}:E):this._localTracks,{code:o}=await this.publish(r,_);this.emit(x.onPublishRes,o)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CONNECT_P,"sessionConnected local tracks is empty",_)}catch(r){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`publish Exception callId -> ${e}, err msg -> ${r.message}`,_);return}this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_R,`code: ${a.SUCCESS}`,_)}async sessionClose(e,_){var r;this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_T,`callId: ${e}`,_),this.destroyAllTracks(_);const i=(r=this._room)==null?void 0:r.getRoomId();if(this._room&&e===i){const{code:o}=await this._rtcClient.leaveRoom(this._room);if(this._releaseStoredData(),o!==N.RCRTCCode.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CLOSE_R,`leaveRoom failed, code: ${o}`,_);return}this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom success",_)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom throw exception: not in room",_)}async disableVideoTrack(){const e=this.getLocalVideoTrack();return e?{code:await e.mute(),track:e}:{code:a.CAMERA_CLOSED}}async enableVideoTrack(e){const _=this.getLocalVideoTrack();return _?_.isOwnerMuted()?{code:await _.unmute()}:{code:a.SUCCESS}:{code:a.CAMERA_CLOSED}}async changeVideoDevice(e){const _=[],i=[],{code:r,track:o}=await this._rtcClient.createCameraVideoTrack(z.NORMAL,this._videoConfig);if(r!==N.RCRTCCode.SUCCESS)return{code:r};const{minBitrate:E,maxBitrate:L}=this._videoConfig;(E||L)&&o.setBitrate(L,E);let c;if(this._localTracks&&this._localTracks.forEach(T=>{T.isVideoTrack()?(T.destroy(),c=T):i.push(T)}),this._localTracks=this._localTracks.filter(T=>c&&T.getTrackId()!==c.getTrackId()),_.push(o),i.push(o),this._localTracks=i,this._onLocalTrackReady(_,e),this._room){const{code:T}=await this._room.publish(_);if(T!==N.RCRTCCode.SUCCESS)return{code:T}}return{code:a.SUCCESS,track:o}}async disableAudioTrack(){const e=this.getLocalAudioTrack();return e?{code:await e.mute(),track:e}:{code:a.MICROPHONE_CLOSED}}async changeMediaType(e,_){if(this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T,`mediaType: ${e}`,_),e===u.AUDIO_VIDEO){let i=this.getLocalVideoTrack();if(!i){const{code:E,track:L}=await this._createVideoTrack(_);if(E!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`create video track errCode: ${E}`,_);return}i=L;const{minBitrate:c,maxBitrate:T}=this._videoConfig;(c||T)&&i.setBitrate(T,c)}const r=this._isPubTiny?{track:i,isPubTiny:!0}:i,{code:o}=await this.publish([r],_);if(o!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`publish errCode: ${o}`,_);return}}if(e===u.AUDIO){const i=this.getLocalVideoTrack();if(i){const{code:r}=await this._room.unpublish([i]);r!==N.RCRTCCode.SUCCESS&&this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`unpublish errCode: ${r}`,_),this.destroyTrack(i)}}this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,"success",_)}async joinRTCRoom(e,_){this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_T,`call: ${e}`,_);const{code:i,room:r,tracks:o}=await j({asyncFn:this._rtcClient.joinRTCRoom.bind(this._rtcClient),fnArgs:[e,void 0,void 0,!1,I.RTCMode.CALL]});return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,`callId: ${e}, errCode: ${i}`,_),this._onRTCMethodFail(A.JOIN_ROOM_ERR,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,"success",_),this._room=r,this._onSelfJoined({callId:e,userId:this._context.getCurrentId()},_),o!=null&&o.length&&this._onRemoteTrackPublish(o),this._callId=e,{code:a.SUCCESS,room:r,tracks:o})}async subscribeTracks(e,_){if(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_T,JSON.stringify({params:e.map(r=>{const{track:o,subTiny:E}=r;return{trackId:o.getTrackId(),subTiny:E}})}),_),!this._room)return{code:a.SUCCESS};const{code:i}=await j({asyncFn:this._room.subscribe.bind(this._room),fnArgs:[e],onError:r=>{}});return i!==N.RCRTCCode.SUCCESS?(this._reportAppEventModule.onFetchRemoteMediaError(e,i),this._onRTCMethodFail(A.SUBSCRIBE_ERR,_),this._logger.error(n.L_RTC_MODULE_SUBSCRIBE_R,`errorCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_R,"success",_),{code:a.SUCCESS})}async unsubscribeTracks(e,_){if(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_T,JSON.stringify({trackIds:e.map(r=>r.getTrackId())}),_),!this._room)return{code:a.SUCCESS};const{code:i}=await this._room.unsubscribe(e);return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_UNSUBSCRIBE_R,`errorCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_R,"success",_),{code:a.SUCCESS})}_releaseStoredData(){this._room=null,this._remoteAudioEnable=!0,this._userViewMap={}}getRemoteTracks(){const e={};return this._room&&this._room.getRemoteUserIds().forEach(i=>{e[i]=this._room.getRemoteTracksByUserId(i)}),e}getRemoteTrack(e,_){var i;return(i=this._room)==null?void 0:i.getRemoteTracksByUserId(e).find(r=>_===u.AUDIO?r.isAudioTrack():r.isVideoTrack())}_regRTCListeners(){this._room.registerRoomEventListener({onKickOff:(e,_)=>{this._onKickOff(e,this._room.getRoomId(),_),this._releaseStoredData()},onUserJoin:e=>{const _=e.map(r=>({callId:this._callId,userId:r})),i=this._logger.createTraceId();this._onOtherMemJoined(_,i)},onUserLeave:e=>{e.forEach(_=>{delete this._userViewMap[_]})},onTrackPublish:this._onRemoteTrackPublish.bind(this),onTrackUnpublish:this._onTrackUnpublish.bind(this),onTrackReady:e=>{this._onRemoteTrackReady([e])},onVideoMuteChange:e=>{this._onVideoMuteChagne({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onAudioMuteChange:e=>{this._onAudioMuteChange({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onRTCPeerConnectionCloseByException:this._onRTCPeerConnectionCloseByException.bind(this)}),this._room.registerReportListener({onStateReport:this._onRTCStateReport.bind(this)}),this._room.onAudioLevelChange(e=>{this._reportAppEventModule.onUserAudioLevelChanged(e)})}_onLocalTrackReady(e,_){this._reportAppEventModule.onUserMediaAvailable(e,_)}_onRemoteTrackReady(e){this._reportAppEventModule.onUserMediaAvailable(e),this.emit(G.__INNER_RECEIVE_FIRST_FRAME__)}_onKickOff(e,_,i,r){this._logger.info(n.L_RTC_MODULE_RECEIVE_KICK_OFF_O,`roonId: ${_}, byServer: ${e}, state: ${i}, kickExtra: ${JSON.stringify(r)}`);let o=A.CONNECTION_ERR;if(e)if(r)o=r.kickReasonCode;else switch(i){case N.RCKickReason.SERVER_KICK:o=A.KICKED_BY_SERVER;break;case N.RCKickReason.OTHER_KICK:o=A.OTHER_CLIENT_JOINED;break;case N.RCKickReason.IM_DISCONNECTED:o=A.CONNECTION_ERR;break;case N.RCKickReason.IM_LOGOUT:o=A.LOGOUT;break;case N.RCKickReason.OTHER_CLIENT_IM_CONNECTED:o=A.OTHER_CLIENT_LOGIN;break}this.emit(G.__INNER_ON_KICKOFF__,o,_)}_onRTCPeerConnectionCloseByException(){const e=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O,"",e),this.emit(G.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,e)}async _onSelfJoined(e,_){this.emit(G.__INNER_ON_SELF_JOINED__,e.callId,_)}_onRemoteTrackPublish(e){const _=this._logger.createTraceId();this._onDeviceEnableChange(e,_),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(r=>r.getTrackId())}),_);const i=[];e.forEach(r=>{var E;const o=r.getUserId();if(r.isAudioTrack())i.push({track:r,subTiny:!1}),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,r);else if((E=this._userViewMap[o])!=null&&E.videoView){this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,r);const{isTiny:L}=this._userViewMap[o];i.push({track:r,subTiny:L})}}),i.length&&this.subscribeTracks(i,_)}async _onTrackUnpublish(e){const _=this._logger.createTraceId();this._onDeviceEnableChange(e,_),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(i=>i.getTrackId())}),_),await this.unsubscribeTracks(e,_)}_onAudioMuteChange(e){const _=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),_);const i=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([i],_),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,i)}_onVideoMuteChagne(e){const _=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),_);const i=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([i],_),this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,i)}_onRTCStateReport(e){const{senders:_,receivers:i}=e;_.forEach(r=>{var c;const{kind:o,packetsLostRate:E,rtt:L}=r;this._callMediaType===u.AUDIO_VIDEO&&o==="audio"||(c=this._callPlusStatusReportListener)==null||c.onSendPacketLoss(E||0,L||0)}),i.forEach(r=>{var C;const{trackId:o,kind:E,packetsLostRate:L,bitrate:c}=r;if(this._callMediaType===u.AUDIO_VIDEO&&E==="audio")return;const{userId:T}=N.helper.parseTrackId(o),S={};S[T]={packetLostRate:L,bitRate:c},(C=this._callPlusStatusReportListener)==null||C.onReceivePacketLoss(S)})}_onRTCMethodFail(e,_){this.emit(G.__INNER_RTC_PROCESS_FAILED__,e,_)}_onOtherMemJoined(e,_){this.emit(G.__INNER_ON_OTHER_JOINED__,e,_)}_onDeviceEnableChange(e,_){this.emit(G.__INNER_ON_DEVICE_ENABLE_CHANGE__,e,_)}async _createAudioTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isAudioTrack()))return this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:_,track:i}=await this._rtcClient.createMicrophoneAudioTrack(z.NORMAL,this._audioConfig);if(_!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,`errCode: ${_}`,e),{code:_};this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._audioConfig;return(r||o)&&i.setBitrate(o,r),this._localTracks.push(i),this._onLocalTrackReady([i],e),{code:a.SUCCESS,track:i}}async _createVideoTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isVideoTrack()&&!L.isDestroyed()))return this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:_,track:i}=await this._rtcClient.createCameraVideoTrack(z.NORMAL,this._videoConfig);if(_!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,`errCode: ${_}`,e),{code:_};this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._videoConfig;return(r||o)&&i.setBitrate(o,r),this._localTracks.push(i),this._onLocalTrackReady([i],e),{code:a.SUCCESS,track:i}}getLocalVideoTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(_=>_.isVideoTrack())),e}getLocalAudioTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(_=>_.isAudioTrack())),e}async publish(e,_){this._logger.info(n.L_RTC_MODULE_PUBLISH_T,`tracksIds: ${e.map(r=>r instanceof N.RCLocalTrack?r.getTrackId():r.track.getTrackId())}`,_);const{code:i}=await j({asyncFn:this._room.publish.bind(this._room),fnArgs:[e],onError:r=>{}});return i!==N.RCRTCCode.SUCCESS?(this._onRTCMethodFail(A.PUBLISH_ERR,_),this._logger.error(n.L_RTC_MODULE_PUBLISH_R,`errCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_PUBLISH_R,`code: ${a.SUCCESS}`,_),{code:a.SUCCESS})}publishVideoTrack(){const e=this.getLocalVideoTrack(),_=this._isPubTiny?{track:e,isPubTiny:!0}:e;return this._room.publish([_])}setVideoView(e,_){const i=[];e.forEach(r=>{const{userId:o,videoElement:E,isTiny:L=!1}=r;if(this._userViewMap[o]={videoView:E,isTiny:L},o===this._context.getCurrentId()||!this._room)return;const T=(this.getRemoteTracks()[o]||[]).map(S=>({track:S,subTiny:L})).filter(({track:S})=>!S.isSubscribed());i.push(...T)}),this._logger.info(n.L_RTC_MODULE_SET_VIDEO_VIEW_O,JSON.stringify({userViewMap:this._userViewMap,needSubTrackIds:i.map(({track:r})=>r.getTrackId())}),_),i.length&&this.subscribeTracks(i,_)}removeVideoView(e,_){const i=[];e.forEach(r=>{const o=this.getRemoteTracks()[r];if(o&&o.length){const E=o.filter(L=>L.isVideoTrack());E.length&&i.push(E[0])}delete this._userViewMap[r]}),this._logger.info(n.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O,JSON.stringify({userViewMap:this._userViewMap,unsubTracks:i.map(r=>r.getTrackId())}),_),i.length&&this.unsubscribeTracks(i,_)}getUserViewMap(){return this._userViewMap}async playMedia(e,_,i,r){this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_T,`userId: ${e}, mediaType: ${_}, videoView: ${i==null?void 0:i.nodeName}`,r);let o=null;if(e===this._context.getCurrentId()?o=_===u.AUDIO?this.getLocalAudioTrack():this.getLocalVideoTrack():o=this.getRemoteTracks()[e].filter(E=>_===u.AUDIO?E.isAudioTrack():E.isVideoTrack())[0],!o)return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`error code: ${a.MEDIA_RESOURCE_INVALIED}`,r),{code:a.MEDIA_RESOURCE_INVALIED};try{const{code:E}=o.isAudioTrack()?await o.play():await o.play(i);return o.isAudioTrack()&&!this._remoteAudioEnable&&o.mute(),E!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${E}`,r),{code:E}):(this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_R,"success",r),{code:a.SUCCESS})}catch(E){return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${a.PLAY_MEDIA_FAILED}, message: ${E.message},`,r),{code:a.PLAY_MEDIA_FAILED}}}};l(G,"__INNER_RTC_PROCESS_FAILED__","inner-rtc-process-failed"),l(G,"__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__","inner-rtc-peerconnection-abnormal-close"),l(G,"__INNER_ON_SELF_JOINED__","inner-on-self-joined"),l(G,"__INNER_ON_OTHER_JOINED__","inner-on-other-joined"),l(G,"__INNER_RECEIVE_FIRST_FRAME__","inner-receive-first-frame"),l(G,"__INNER_ON_KICKOFF__","inner-kickoff-frame"),l(G,"__INNER_ON_DEVICE_ENABLE_CHANGE__","inner-on-device-enable-change");let $=G;class Pe{constructor(s){l(this,"_listener");this._logger=s}registerEventListener(s){this._listener=s}_callAppListener(s,...e){var i;const _=(i=this._listener)==null?void 0:i[s];if(_)try{_(...e)}catch(r){this._logger.error(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({name:r.name,message:r.message}))}}onReceivedCall(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCall",callId:s.getCallId()}),e),this._callAppListener("onReceivedCall",s)}onRemoteUserInvited(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserInvited",inviteeUserList:s,inviterUserId:e,callId:_})),this._callAppListener("onRemoteUserInvited",s,e,_)}onCallConnected(s){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallConnected",callId:s.getCallId()})),this._callAppListener("onCallConnected",s)}onCallTypeChanged(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallTypeChanged",callId:e,callType:s}),_),this._callAppListener("onCallTypeChanged",s,e)}onRemoteUserStateChanged(s,e){const{callId:_,userId:i,userState:r,reason:o}=s;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserStateChanged",callId:_,userId:i,userState:r,reason:o}),e),this._callAppListener("onRemoteUserStateChanged",_,i,r,o)}onCallEnded(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallEnded",callId:s.getCallId(),closeReason:e}),_),this._callAppListener("onCallEnded",s,e)}onRemoteCameraStateChanged(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteCameraStateChanged",callId:s,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const _=e==null?void 0:e.getUserId();this._callAppListener("onRemoteCameraStateChanged",s,_,e==null?void 0:e.isOwnerMuted())}onRemoteMicrophoneStateChanged(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteMicrophoneStateChanged",callId:s,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const _=e==null?void 0:e.getUserId();this._callAppListener("onRemoteMicrophoneStateChanged",s,_,e==null?void 0:e.isOwnerMuted())}onReceivedCallRecord(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallRecord",record:s}),e),this._callAppListener("onReceivedCallRecord",s)}onReceivedChangeMediaTypeRequest(s,e,_,i){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeRequest",userId:s,transactionId:e}),i),this._callAppListener("onReceivedChangeMediaTypeRequest",s,e,_)}onReceivedChangeMediaTypeResult(s,e){const{userId:_,transactionId:i,mediaType:r,code:o}=s;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeResult",userId:_,mediaType:r}),e),this._callAppListener("onReceivedChangeMediaTypeResult",{userId:_,transactionId:i,mediaType:r,code:o})}onReceivedCallStartTime(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallStartTime",info:s}),e),this._callAppListener("onReceivedCallStartTime",s)}onReceivedCallFirstFrameTime(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallFirstFrameTime",callId:s,callFirstFrameTime:e}),_),this._callAppListener("onReceivedCallFirstFrameTime",s,e)}onUserMediaAvailable(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onUserMediaAvailable",trackIds:s.map(_=>_.getTrackId())}),e),s.forEach(_=>{const i=_.getUserId(),r=_.isAudioTrack()?u.AUDIO:u.VIDEO;this._callAppListener("onUserMediaAvailable",i,r)})}onFetchRemoteMediaError(s,e){s.forEach(({track:_})=>{const i=_.getUserId();this._callAppListener("onFetchRemoteMediaError",i,e)})}onUserAudioLevelChanged(s){s.forEach(({track:e,audioLevel:_})=>{const i=e.getUserId();this._callAppListener("onUserAudioLevelChanged",i,_)})}}var le=(t=>(t[t.UNKNOW_ERR=41e3]="UNKNOW_ERR",t[t.DB_ERR=41001]="DB_ERR",t[t.JSON_ERR=41002]="JSON_ERR",t[t.INVALID_JSON_ERR=41003]="INVALID_JSON_ERR",t[t.MISSING_PARAMS=41004]="MISSING_PARAMS",t[t.PARAMS_REQUIRED=41005]="PARAMS_REQUIRED",t[t.DATA_FORMAT_ERR=41006]="DATA_FORMAT_ERR",t[t.METHOD_NOT_IMPLEMENTED=41007]="METHOD_NOT_IMPLEMENTED",t[t.CALL_NOT_EXIST=41010]="CALL_NOT_EXIST",t[t.SINGAL_EXCEED_TWO_INVITEE=41011]="SINGAL_EXCEED_TWO_INVITEE",t[t.GROUP_EXCEEDS_QUORUM=41012]="GROUP_EXCEEDS_QUORUM",t[t.OPERATION_EXPIRED=41013]="OPERATION_EXPIRED",t[t.DEVICE_IS_CALLING=41014]="DEVICE_IS_CALLING",t[t.REPORT_STREAM_READY_TIME_IS_INVALID=41018]="REPORT_STREAM_READY_TIME_IS_INVALID",t[t.NOT_CALL_YOURSELF=41019]="NOT_CALL_YOURSELF",t[t.SESSION_STATUS_NOT_EXIST=41020]="SESSION_STATUS_NOT_EXIST",t[t.HANGUP_NOT_ALLOW=41021]="HANGUP_NOT_ALLOW",t[t.ACCEPT_NOT_ALLOW=41022]="ACCEPT_NOT_ALLOW",t[t.OPERATION_NOT_ALLOW=41025]="OPERATION_NOT_ALLOW",t[t.TRANSACTION_ID_ERR=41100]="TRANSACTION_ID_ERR",t[t.UP_VIDEO_CANCELED=41050]="UP_VIDEO_CANCELED",t[t.CURRENT_CALL_IS_AUDIO=41051]="CURRENT_CALL_IS_AUDIO",t[t.CURRENT_CALL_IS_VIDEO=41052]="CURRENT_CALL_IS_VIDEO",t))(le||{});class Ie{constructor(s,e,_,i){l(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});l(this,"_audioConfig",{});l(this,"_callPlusStatistics");l(this,"_clientCallId","");l(this,"_isLaunchHangup",!1);l(this,"_needHangupCallId",null);l(this,"_callEngine");l(this,"_rtcModule");l(this,"_reportAppEventModule");this._context=s,this._logger=e,this._runtime=_,this._initOpts=i,this._reportAppEventModule=new Pe(e),this._callPlusStatistics=new Re(this._logger,this._context),this._callEngine=new J(this._context,this._runtime,this._initOpts,this._logger,this._reportAppEventModule),this._rtcModule=new $(this._context,this._runtime,this._initOpts,this._logger,this._callEngine,this._reportAppEventModule),this._rtcModule.on($.__INNER_RTC_PROCESS_FAILED__,this._rtcProcessFailHandle.bind(this)),this._rtcModule.on($.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,this._peerConnectionAbnormalClose.bind(this)),this._rtcModule.on($.__INNER_ON_SELF_JOINED__,this._selfJoinedHandle.bind(this)),this._rtcModule.on($.__INNER_ON_OTHER_JOINED__,this._otherJoinedHandle.bind(this)),this._rtcModule.on($.__INNER_RECEIVE_FIRST_FRAME__,this._receiveFirstFrameHandle.bind(this)),this._rtcModule.on($.__INNER_ON_KICKOFF__,this._kickoffHandle.bind(this)),this._rtcModule.on($.__INNER_ON_DEVICE_ENABLE_CHANGE__,this._receiveDeviceEnableChangeHandle.bind(this)),this._callEngine.on(J.__INNER_SESSION_CONNECT__,this._rtcModule.sessionConnected.bind(this._rtcModule)),this._callEngine.on(J.__INNER_SESSION_CLOSE__,this._sessionCloseHandle.bind(this)),this._callEngine.on(J.__INNER_CHANGE_MEDIA_TYPE__,this._rtcModule.changeMediaType.bind(this._rtcModule)),this._callEngine.on(J.__INNER_INVITE__,(r,o)=>{this._callPlusStatistics.reportStatisticsData(F.L_QS_RECEIVE_CALL_S,a.SUCCESS,+new Date,r,"",o)})}_rtcProcessFailHandle(s,e){const _=this._callEngine.getLocalMainSession();if(_){const i=_.getCallId();this._callEngine.systemStatusUp({callId:i,sysStatus:s,forward:Q.CURRENT},e),this._callPlusStatistics.reportStatisticsData(F.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,_),this.__innerHangup({callId:i,systemState:s},e)}}_peerConnectionAbnormalClose(s){const e=this._callEngine.getLocalMainSession();e&&(this._callEngine.systemStatusUp({callId:e.getCallId(),sysStatus:A.CONNECTION_ERR,forward:Q.CURRENT},s),this._callEngine.endCurrentSession(A.CONNECTION_ERR,e.getCallId(),s))}async _selfJoinedHandle(s,e){const _=this._context.getCurrentId(),i=this._callEngine.getLocalMainSession();this._reportAppEventModule.onCallConnected(i);const r=this._rtcModule.getLocalVideoTrack(),o=this._rtcModule.getLocalAudioTrack(),E=r?!r.isOwnerMuted():!1,L=o?!o.isOwnerMuted():!1;this._callEngine.setUserDeviceEnable(_,u.VIDEO,E,e),this._callEngine.setUserDeviceEnable(_,u.AUDIO,L,e);const c=[{userId:_,userState:d.ONCALL,systemState:A.ONCALL,cameraEnable:E,microphoneEnable:L}];this._callEngine.updateUsersState(s,c,e),this._callEngine.startTimeCorrection(e)}_otherJoinedHandle(s,e){var r;let _="";const i=s.map(o=>(_=o.callId,{userId:o.userId,userState:d.ONCALL,systemState:A.ONCALL,cameraEnable:!1,microphoneEnable:!1}));this._callEngine.updateUsersState(_,i,e),((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL)}_receiveFirstFrameHandle(s){var e;((e=this._callEngine.getLocalMainSession())==null?void 0:e.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL),this._callEngine.upFirstFrameTime(s)}_kickoffHandle(s,e,_){if(s===A.CONNECTION_ERR){this._callEngine.endCurrentSession(s,e,_);return}const i=this._callEngine.getLocalMainSession();if(i){const r=i.getCallId();this._callPlusStatistics.reportStatisticsData(F.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,i,this._clientCallId),this._callEngine.systemStatusUp({callId:r,sysStatus:s,forward:Q.CURRENT},_),this._callEngine.endCurrentSession(s,e,_)}}_receiveDeviceEnableChangeHandle(s,e){s.forEach(_=>{const i=_.getUserId(),r=_.isAudioTrack()?u.AUDIO:u.VIDEO;this._callEngine.setUserDeviceEnable(i,r,!_.isOwnerMuted(),e)})}_sessionCloseHandle(s,e){this._isLaunchHangup||(this._clientCallId=""),this._isLaunchHangup=!1,this._rtcModule.sessionClose(s,e)}setCallPlusEventListener(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O,s?Object.keys(s).join(","):null),this._reportAppEventModule.registerEventListener(s)}setStatusReportListener(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O,s?Object.keys(s).join(","):null),this._rtcModule.setCallPlusStatusReportListener(s)}setVideoView(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T,JSON.stringify({list:s.map(_=>{const{userId:i,videoElement:r,isTiny:o}=_;return{userId:i,elementName:r==null?void 0:r.nodeName,isTiny:o}})}),e),!I.notEmptyArray(s))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, list: not empty array, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};for(let _=0;_<s.length;_++){const i=s[_],{userId:r,videoElement:o}=i;if(!I.notEmptyString(r))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, userId: not empty string, value: ${r}`,e),{code:a.PARAM_ERROR};if(!de(o))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, videoElement: need a video element, value: ${o instanceof HTMLElement?o.nodeName:o}`,e),{code:a.PARAM_ERROR}}return this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,"succes",e),this._rtcModule.setVideoView(s,e),{code:a.SUCCESS}}removeVideoView(s){const e=this._logger.createTraceId();return this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T,JSON.stringify({userIds:s}),e),I.notEmptyArray(s)&&s.every(_=>I.notEmptyString(_))?(this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,"succes",e),this._rtcModule.removeVideoView(s,e),{code:a.SUCCESS}):(this._logger.error(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR})}async playMedia(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_T,JSON.stringify({userId:s,mediaType:e}),_),!I.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, userId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};if(I.isUndefined(u[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, mediaType is illegal, value: ${e}`,_),{code:a.PARAM_ERROR};const{videoView:i}=this._rtcModule.getUserViewMap()[s]||{};return e!==u.AUDIO&&!i?(this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`errCode: ${a.VIDEO_VIEW_NOT_SET}, video view not set`,_),{code:a.VIDEO_VIEW_NOT_SET}):this._rtcModule.playMedia(s,e,i,_)}createVideoConfigBuilder(){return new Le(this._logger)}setVideoConfig(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T,JSON.stringify(s));const{frameRate:e,resolution:_,maxBitrate:i,minBitrate:r}=s;if(!N.RCFrameRate[e])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, frameRate is illegal, value: ${e}`),{code:a.PARAM_ERROR};if(!N.RCResolution[_])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, resolution is illegal, value: ${_}`),{code:a.PARAM_ERROR};const{code:o,errorMsg:E}=Te(r,i);return o!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,E),this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,"success"),this._videoConfig={...s},this._rtcModule.setVideoConfig(this._videoConfig),{code:a.SUCCESS}}createAudioConfigBuilder(){return new Ee(this._logger)}setAudioConfig(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T,JSON.stringify(s));const{sampleRate:e,minBitrate:_,maxBitrate:i}=s;if(e&&!I.isNumber(e))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,`param error, sampleRate: type is number, value: ${e}`),{code:a.PARAM_ERROR};const{code:r,errorMsg:o}=Te(_,i);return r!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,o),this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,"success"),this._audioConfig={...s},this._rtcModule.setAudioConfig(this._audioConfig),{code:a.SUCCESS}}async startCall(s,e=D.SINGLE,_=u.AUDIO_VIDEO){this._clientCallId=I.getUUID();const i=+new Date,r=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_T,`userIds: ${s.join(",")}, callType: ${e}, mediaType: ${_}`,r),this._context.getConnectionStatus()!==I.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,r),{code:a.SIGNAL_DISCONNECTED};const o=this._context.getNaviInfo();if(!o||!ee(o))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,r),{code:a.RTC_SERVICE_UNAVAILABLE};if(!(I.notEmptyArray(s)&&s.every(C=>I.notEmptyString(C))))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,r),{code:a.PARAM_ERROR};if(I.isUndefined(D[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, callType is illegal, value: ${e}`,r),{code:a.PARAM_ERROR};if(I.isUndefined(u[_]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, mediaType is illegal, value: ${_}`,r),{code:a.PARAM_ERROR};if(s.length>1&&e===D.SINGLE)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, You can only call one person in a single call, userIds: ${s.join(",")}`,r),{code:a.PARAM_ERROR};if(this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SESSION_EXIST}, session exist`,r),{code:a.SESSION_EXIST};const{code:E}=await this._rtcModule.createCallMediaTracks(_,r);if(E!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`create meida tracks error code: ${E}`,r),{code:E};const{code:L,data:c}=await this._callEngine.startCall({toUsers:s.map(C=>({userId:C})),callType:e,mediaType:_,callId:this._clientCallId},r);if(this._callPlusStatistics.reportStatisticsData(F.L_QS_START_CALL_S,L,i,null,this._clientCallId,null,{mediaType:_,callType:e,callId:(c==null?void 0:c.callId)||""}),L!==a.SUCCESS)return this._rtcModule.destroyAllTracks(r),this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`signal error code: ${L}`,r),{code:L};const{callId:T,clientCallId:S}=c;return this._needHangupCallId===S?(this._callEngine.clearAllTimer(T,r),this._callEngine.hangup({callId:T},r),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,`the ${T} call has been hangup`,r),{code:a.SUCCESS}):(e===D.MULTI&&await this._rtcModule.sessionConnected(T,r),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,JSON.stringify({data:c,code:L}),r),{code:a.SUCCESS,callId:T})}async joinMultiCall(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T,`callId: ${s}`,e),this._context.getConnectionStatus()!==I.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SIGNAL_DISCONNECTED}`,e),{code:a.SIGNAL_DISCONNECTED};const _=this._context.getNaviInfo();if(!_||!ee(_))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.RTC_SERVICE_UNAVAILABLE}`,e),{code:a.RTC_SERVICE_UNAVAILABLE};if(!I.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`params err, callId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};const{code:i,data:r}=await this._callEngine.getCallSession({callId:s},e);if(i!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`get call data error, code: ${i}`,e),{code:i};const{mediaType:o}=r,E=this._callEngine.getLocalMainSession();if(E&&E.getCallId()!==s)return{code:a.SESSION_EXIST};const{code:L}=await this._rtcModule.createCallMediaTracks(o,e);if(L!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`create meida tracks error code: ${L}`,e),{code:L};const{code:c}=await this._callEngine.joinCall({callId:s,mediaType:o},e);return c!==a.SUCCESS?(this._rtcModule.destroyAllTracks(e),this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`signal error code: ${c}`,e),{code:c}):(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SUCCESS}`,e),await this._rtcModule.sessionConnected(s,e),{code:a.SUCCESS})}async invite(s){var o;const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_T,`callId: ${s.join(",")}`,e),!(I.notEmptyArray(s)&&s.every(E=>I.notEmptyString(E))))return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};const{code:_,data:i}=await this._callEngine.invite({toUsers:s.map(E=>({userId:E}))},e);if(_!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`signal error code: ${_}`,e),{code:_};const r=[];return(o=i.busylineUsers)!=null&&o.length&&r.push(...i.busylineUsers.map(E=>({userId:E.userId,state:E.sessionStatus}))),this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_R,`success busyUsers: ${JSON.stringify(r)}`,e),{code:a.SUCCESS,busyUsers:r}}async accept(s){const e=+new Date,_=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_T,`callId: ${s}`,_),this._context.getConnectionStatus()!==I.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,_),{code:a.SIGNAL_DISCONNECTED};const i=this._context.getNaviInfo();if(!i||!ee(i))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,_),{code:a.RTC_SERVICE_UNAVAILABLE};if(!I.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`params err, callId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};const r=this._callEngine.getLocalMainSession(),o=this._callEngine.getHoldSession(s);if(!r&&!o)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode : ${a.NOT_IN_CALL}, session not exist`,_),{code:a.NOT_IN_CALL};if(s===(o==null?void 0:o.getCallId())){const{code:S}=await this.hangup(r.getCallId());if(S!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`hangup mainSession error code: ${S}`,_),{code:S};this._callEngine.upgradeMainSession(s)}const L=r.getMediaType(),{code:c}=await this._rtcModule.createCallMediaTracks(L,_);if(c!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`create meida tracks error code: ${c}`,_),{code:c};const{code:T}=await this._callEngine.accept({callId:s},_);return this._callPlusStatistics.reportStatisticsData(F.L_QS_ACCEPT_CALL_S,T,e,r),T!==a.SUCCESS?(this._rtcModule.destroyAllTracks(_),this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`signal error code: ${T}`,_),{code:T}):(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_R,"success",_),this._rtcModule.sessionConnected(s,_),{code:a.SUCCESS})}async __innerHangup(s,e){var r;const{callId:_}=s;this._callEngine.setIsLocalClientHangup(!0),this._callEngine.clearAllTimer(_,e);const{code:i}=await this._callEngine.hangup(s,e);return i===le.CALL_NOT_EXIST?{code:a.SUCCESS}:(i===a.SUCCESS&&_===((r=this._callEngine.getLocalMainSession())==null?void 0:r.getCallId())&&await this._rtcModule.sessionClose(_,e),{code:i})}async hangup(s){const e=+new Date,_=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_T,`callId: ${s}`,_);const i=this._callEngine.getLocalMainSession();if(!i)return{code:a.NOT_IN_CALL};if(s&&!I.isString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId: type is string, value: ${s}`,_),{code:a.PARAM_ERROR};const r=i.getCallId();if(s&&s!==r&&!this._callEngine.getHoldSession(s))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId is invalid, value: ${s}`,_),{code:a.CALL_ID_INVALID};this._isLaunchHangup=!0,this._needHangupCallId=s||r;const E=this._callEngine.getHoldSession(this._needHangupCallId)||i,L=this._context.getCurrentId(),c=i.getUserList().filter(h=>h.userId===L)[0].state,T=[i.getCreatorUserId(),i.getInviterUserId()].includes(L),S=Ae(c,T),{code:C}=await this.__innerHangup({callId:this._needHangupCallId,systemState:S},_);return this._callPlusStatistics.reportStatisticsData(F.L_QS_HANGUP_CALL_S,C,e,E,this._clientCallId),C!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`signal error code : ${C}`,_),{code:C}):(this._needHangupCallId=null,this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_R,"success",_),{code:a.SUCCESS})}async requestChangeMediaType(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T,`mediaType: ${s}`,e),I.isUndefined(u[s]))return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`params err, mediaType is illegal, value: ${s}`,e),{code:a.PARAM_ERROR};const _=this.getCurrentCallSession(),i=_==null?void 0:_.getMediaType();if(s===i)return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code: ${a.MEDIATYPE_INVALID}`,e),{code:a.MEDIATYPE_INVALID};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const r=_==null?void 0:_.getUserList().filter(L=>L.userId!==this._context.getCurrentId()).map(L=>L.userId),{code:o,data:E}=await this._callEngine.requestChangeMediaType({mediaType:s,toUserIds:r||[]},e);return o!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`signal error code: ${o}`,e),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`success transactionId: ${E.transactionId}`,e),{code:a.SUCCESS,transactionId:E.transactionId})}async cancelChangeMediaType(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T,`transactionId: ${s}`,e),!I.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const{code:_}=await this._callEngine.cancelChangeMediaType({transactionId:s},e);return _!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`signal error code: ${_}`,e),{code:_}):(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,"success",e),{code:a.SUCCESS})}async replyChangeMediaType(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T,`transactionId: ${s}`,_),!I.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};if(!I.isBoolean(e))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, isAgree: type is boolean, value: ${e}`,_),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,_),{code:a.NOT_IN_CALL};const{code:i}=await this._callEngine.responseChangeMediaType({transactionId:s,agree:e},_);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`signal error: ${i}`,_),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,"success",_),{code:a.SUCCESS})}getCurrentCallSession(){return this._callEngine.getLocalMainSession()}async getAvailableCallRecordsFromServer(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T,"",s);const{code:e,data:_}=await this._callEngine.getOpenCallList(s);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`success, data: ${JSON.stringify(_)}`,s),{code:a.SUCCESS,records:_})}async getCallRecords(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T,`startTimestamp: ${s}, count: ${e}`,_),!(I.isNumber(s)&&s>=0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, startTimestamp: is a number >= 0, value: ${s}`,_),{code:a.PARAM_ERROR};if(!(I.isNumber(e)&&e>0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, count: is a number >= 0, value: ${e}`,_),{code:a.PARAM_ERROR};const{code:i,data:r}=await this._callEngine.getCallLogList({timestamp:s,count:e},_);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`signal error code: ${i}`,_),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,"success",_),{code:a.SUCCESS,result:r})}async deleteCallRecordsFromServer(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T,`callIds: ${s.join(",")}`,e),!(I.notEmptyArray(s)&&s.every(i=>I.notEmptyString(i))))return this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`params err, callIds: not empty array, callId: not empty string, callIds: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};const{code:_}=await this._callEngine.deleteCallLog(s,e);return _!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`signal error code: ${_}`,e),{code:_}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,"success",e),{code:a.SUCCESS})}async deleteAllCallRecordsFromServer(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T,"",s);const{code:e}=await this._callEngine.removeAllCallLog(s);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,"success",s),{code:a.SUCCESS})}async startCamera(){var r;const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_T,"",s);const{code:e,track:_}=await this._rtcModule.getCameraVideoTrack(s);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`create video track error code: ${e}`,s),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.VIDEO,!0,s),!(_!=null&&_.isPublished())&&((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())===p.ONCALL){const{code:o}=await this._rtcModule.publishVideoTrack();return o!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`publish error code: ${o}`,s),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",s),{code:a.SUCCESS})}const{code:i}=await this._rtcModule.enableVideoTrack(s);return i!==N.RCRTCCode.SUCCESS&&i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`signal error code: ${i}`,s),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",s),{code:a.SUCCESS})}async stopCamera(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_T,"",s);const{code:e,track:_}=await this._rtcModule.disableVideoTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,`error code: ${e}`,s),{code:e}):(this._rtcModule.destroyTrack(_),this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.VIDEO,!1,s),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,"success",s),{code:a.SUCCESS})}async switchCamera(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T,`cameraId: ${s}`,e),!I.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`param error, cameraId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};const _=this._callEngine.getLocalMainSession();if(!_)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_IN_CALL}`,e),{code:a.NOT_IN_CALL};if(_.getMediaType()===u.AUDIO)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_VIDEO_CALL}`,e),{code:a.NOT_VIDEO_CALL};this._videoConfig.cameraId=s,this._rtcModule.setVideoConfig(this._videoConfig);const{code:i}=await this._rtcModule.changeVideoDevice(e);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`call client changeVideoDevice error code: ${i}`,e),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,"success",e),{code:a.SUCCESS})}async startMicrophone(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_T,"",s);const{code:e,track:_}=await this._rtcModule.getMicrophoneAudioTrack(s);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`create microphone audio track error code: ${e}`,s),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.AUDIO,!0,s),!_.isOwnerMuted())return this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",s),{code:a.SUCCESS};const i=await _.unmute();return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`signal error code: ${e}`,s),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",s),{code:a.SUCCESS})}async stopMicrophone(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T,"",s);const{code:e,track:_}=await this._rtcModule.disableAudioTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,`signal error code: ${e}`,s),{code:e}):(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.AUDIO,!1,s),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,"success",s),{code:a.SUCCESS})}isMicrophoneEnabled(){const s=this._rtcModule.getLocalAudioTrack();return!!s&&!s.isOwnerMuted()}async setAllRemoteAudioEnable(s){const e=this._logger.createTraceId();return this._rtcModule.setAllRemoteAudioEnable(s,e)}getVersion(){return"1.0.0"}async getCameras(){return await N.device.getCameras()}async getMicrophones(){return await N.device.getMicrophones()}}const Ve=t=>t?I.isObject(t)?Object.keys(t).includes("rtcClient")?I.isObject(t.rtcClient)?!I.isUndefined(t.logStdout)&&!I.isFunction(t.logStdout)?{isLegal:!1,msg:"Initialization 'logStdout' parameter must be of type 'function'"}:{isLegal:!0}:{isLegal:!1,msg:"Initialization 'rtcClient' parameter must be of type 'object'"}:{isLegal:!1,code:a.NOT_INSTALL_RTC_PLUGIN}:{isLegal:!1,msg:"Initialization options must be an object"}:{isLegal:!1,msg:"Initialization missing parameter -> options"},Ge={tag:"RCCallPlus",verify(t){return t.tag==="browser"},setup(t,s,e){const _=Ve(e);if(!_.isLegal)throw new Error(`[RCCallLib installer steup]${_.msg}`);const i=t.createLogger("CallPlusLib","RTC"),r=I.isUndefined(e.logOutputLevel)?I.LogL.WARN:e.logOutputLevel;return i.setOutputLevel(r),i.warn(n.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O,"CallPlus Version: 1.0.0, Commit: 7f2df576f1c6c0cdc97989dfb1345bbf9c2e7a01"),new Ie(t,i,s,e)}};Object.defineProperty(g,"RCCallPlusFrameRate",{enumerable:!0,get:()=>N.RCFrameRate}),Object.defineProperty(g,"RCCallPlusResolution",{enumerable:!0,get:()=>N.RCResolution}),g.RCAudioConfigBuilder=Ee,g.RCCallPlusCallState=p,g.RCCallPlusClient=Ie,g.RCCallPlusCode=a,g.RCCallPlusMediaType=u,g.RCCallPlusMediaTypeChangeResult=k,g.RCCallPlusReason=A,g.RCCallPlusSession=K,g.RCCallPlusSessionUserState=d,g.RCCallPlusType=D,g.RCVideoConfigBuilder=Le,g.installer=Ge,Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})});
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNSZWFzb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9oZWxwZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUEx1c1N0YXRpc3RpY3MudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvU2VjcmV0Q2FsbFR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbi50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy90aW1lcnMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yZXRyeS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2ludGVyZmFjZXMvSUNhbGxIb29rcy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yYW5kb20udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9pbmRleERCLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvbW9kdWxlcy9BYm5vcm1hbENhbGwudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9DYWxsU2VydmVyRXZlbnRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvVGltZUNvcnJlY3Rpb25lci50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0ZvcndhcmRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsRGlyZWN0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvUkNDYWxsRW5naW5lLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUlRDUmVzb3VyY2VUYWcudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JUQ01vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1JlcG9ydE1vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3V0aWxzL3ZhbGlkYXRpb24udHMiLCIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZW51bVxuICovXG5leHBvcnQgY29uc3QgUkNDYWxsUGx1c0NvZGUgPSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1M6IDAsXG4gIC8qKlxuICAgKiDlj4LmlbDplJnor69cbiAgICovXG4gIFBBUkFNX0VSUk9SOiA4MDAwMSxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahCBzZXNzaW9uXG4gICAqL1xuICBTRVNTSU9OX0VYSVNUOiA4MDAwMixcbiAgLyoqXG4gICAqIOacquWKoOWFpemAmuivnVxuICAgKi9cbiAgTk9UX0lOX0NBTEw6IDgwMDAzLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L6KKr56aB5q2iXG4gICAqL1xuICBNRURJQVRZUEVfSU5WQUxJRDogODAwMDQsXG4gIC8qKlxuICAgKiDlvZPliY3kuI3mmK/op4bpopHpgJror51cbiAgICovXG4gIE5PVF9WSURFT19DQUxMOiA4MDAwNSxcbiAgLyoqXG4gICAqIOW8gOmAmueahOmfs+inhumikeacjeWKoeayoeacieWPiuaXtueUn+aViOaIlumfs+inhumikeacjeWKoeW3suWFs+mXrVxuICAgKi9cbiAgUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEU6IDgwMDA2LFxuICAvKipcbiAgICog6LCD55So5Ye95pWw5pe277yM5Lyg5YWl55qE55So5oi35YiX6KGo5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0xJU1RfSU5WQUlMRDogODAwMDcsXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTpgJror50gSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBDQUxMX0lEX0lOVkFMSUQ6IDgwMDA4LFxuICAvKipcbiAgICog5LqL5YqhIElkIOS4uuepuumUmeivr1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfSU5WQUxJRDogODAwMDksXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTnlKjmiLcgSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0lEX0lOVkFMSUQ6IDgwMDEwLFxuICAvKipcbiAgICog5Y+R6LW35Y2V5Lq65ZG85Y+r5pe277yM5Lq65ZGY5YiX6KGo5Lit5Y+q6IO95pyJ5LiA5Liq5Lq6XG4gICAqL1xuICBTSU5HTEVfQ0FMTF9OT1RfU1VQUE9SVF9NVUxUSV9QRVJTT046IDgwMDExLFxuICAvKipcbiAgICogaW0g5pyq6L+e5o6lXG4gICAqL1xuICBTSUdOQUxfRElTQ09OTkVDVEVEOiA4MDAxMixcbiAgLyoqXG4gICAqIOaRhOWDj+WktOacquaJk+W8gFxuICAgKi9cbiAgQ0FNRVJBX0NMT1NFRDogODAxMDAsXG4gIC8qKlxuICAgKiDpuqblhYvpo47mnKrmiZPlvIBcbiAgICovXG4gIE1JQ1JPUEhPTkVfQ0xPU0VEOiA4MDEwMSxcbiAgLyoqXG4gICAqIOaXoOWqkuS9k+i1hOa6kFxuICAgKi9cbiAgTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUQ6IDgwMTAyLFxuICAvKipcbiAgICog5pyqIGluc3RhbGwgUlRDIOaPkuS7tlxuICAgKi9cbiAgTk9UX0lOU1RBTExfUlRDX1BMVUdJTjogODAxMDMsXG4gIC8qKlxuICAgKiDmkq3mlL7lvILluLhcbiAgICovXG4gIFBMQVlfTUVESUFfRkFJTEVEOiA4MDEwNCxcbiAgLyoqXG4gICAqIOaSreaUvuinhumikemcgOimgSB2aWRlbyDlhYPntKBcbiAgICovXG4gIFZJREVPX1ZJRVdfTk9UX1NFVDogODAxMDUsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IGVudW0gUkNDYWxsUGx1c0xvZ2dlclRhZyB7XG4gIExfSU5ERVhfSU5TVEFMTF9DQUxMX1BMVVNfUExVR0lOX08gPSAnTC1pbmRleF9pbnN0YWxsX2NhbGxfcGx1c19wbHVnaW4tTycsXG4gIC8qKlxuICAgKiDkuJrliqHlsYLkuovku7bms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9ldmVudF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOS4muWKoeWxguS6i+S7tuiwg+eUqFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfZXZlbnRfbGlzdGVuZXItTycsXG4gIC8qKlxuICAgKiDpgJror53otKjph4/mlbDmja7nm5HlkKzms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9TVEFUVVNfUkVQT1JUX0xJU1RFTkVSX08gPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3N0YXR1c19yZXBvcnRfbGlzdGVuZXItTycsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfU1RBVFVTX1JFUE9SVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfc3RhdHVzX3JlcG9ydF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOiuvue9ruaRhOWDj+WktOinhumikemFjee9rumhuVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF92aWRlb19jb25maWctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zZXRfdmlkZW9fY29uZmlnLVInLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9mcmFtZV9yYXRlLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfUkVTT0xVVElPTl9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9yZXNvbHV0aW9uLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfQklUUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9iaXRyYXRlLU8nLFxuICAvKipcbiAgICog6K6+572u6bqm5YWL6aOO6Z+z6aKR6YWN572u6aG5XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X2F1ZGlvX2NvbmZpZy1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9hdWRpb19jb25maWctUicsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9CSVRSQVRFX08gPSAnTC1jYWxscGx1c19hdWRpb19jb25maWdfc2V0X2JpdHJhdGUtTycsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9TQU1QTEVfUkFURV9PID0gJ0wtY2FsbHBsdXNfYXVkaW9fY29uZmlnX3NldF9zYW1wbGVfcmF0ZS1PJyxcbiAgLyoqXG4gICAqIOmihOiniFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfUFJFVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3ByZXZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BSRVZJRVdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9wcmV2aWV3LVInLFxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfY2FsbC1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbGwtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror53ku7vliqFcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2pvaW5fbXVsdGlfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnee7k+aenFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IgPSAnTC1jYWxscGx1c19jbGllbnRfam9pbl9tdWx0aV9jYWxsLVInLFxuICAvKipcbiAgICog5o6l5ZCs6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9hY2NlcHQtVCcsXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror53nu5PmnpxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2FjY2VwdC1SJyxcbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1QgPSAnTC1jYWxscGx1c19jbGllbnRfaGFuZ3VwLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9oYW5ndXAtUicsXG4gIC8qKlxuICAgKiDpgoDor7dcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2ludml0ZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfaW52aXRlLVInLFxuICAvKipcbiAgICog5Y+R6LW35aqS5L2T57G75Z6L5YiH5o2i6K+35rGCXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1jYWxscGx1c19jbGllbnRfcmVxdWVzdF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcXVlc3RfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojlqpLkvZPnsbvlnovliIfmjaLor7fmsYJcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbmNlbF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfY2FuY2VsX2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i5bqU562UXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog6I635Y+W5b2T5YmN6L+b6KGM5Lit55qE6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ1VSUkVOVF9DQUxMX1NFU1NJT05fVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY3VycmVudF9jYWxsX3Nlc3Npb24tVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DVVJSRU5UX0NBTExfU0VTU0lPTl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9jdXJyZW50X2NhbGxfc2Vzc2lvbi1SJyxcbiAgLyoqXG4gICAqIOiOt+WPluacque7k+adn+eahOmAmuivneWIl+ihqFxuICAgKiBBdmFpbGFibGVDYWxsU2Vzc2lvbnNGcm9tU2VydmVyXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9hdmFpbGFibGVfY2FsbF9zZXNzaW9uc19mcm9tX3NlcnZlci1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfYXZhaWxhYmxlX2NhbGxfc2Vzc2lvbnNfZnJvbV9zZXJ2ZXItUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53orrDlvZVcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY2FsbF9yZWNvcmRzLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IgPSAnTC1jYWxscGx1c19jbGllbnRfZ2V0X2NhbGxfcmVjb3Jkcy1SJyxcbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg5riF55CG6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVInLFxuICAvKipcbiAgICog5riF55CG5omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVInLFxuICAvKipcbiAgICog5omT5byA5pGE5YOP5aS0XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdGFydF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWIh+aNouaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N3aXRjaF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zd2l0Y2hfY2FtZXJhLVInLFxuICAvKipcbiAgICog5omT5byA6bqm5YWL6aOOXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X21pY3JvcGhvbmUtUicsXG4gIC8qKlxuICAgKiDlhbPpl63puqblhYvpo45cbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0b3BfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc3RvcF9taWNyb3Bob25lLVInLFxuICAvKipcbiAgICog6K6+572uIHZpZGVvIHZpZXdcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctUicsXG4gIExfUlRDX01PRFVMRV9TRVRfVklERU9fVklFV19PID0gJ0wtcnRjX21vZHVsZV9zZXRfdmlkZW9fdmlldy1PJyxcbiAgLyoqXG4gICAqIOWIoOmZpCB2aWRlbyB2aWV3XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVInLFxuICBMX1JUQ19NT0RVTEVfUkVNT1ZFX1ZJREVPX1ZJRVdfTyA9ICdMLXJ0Y19tb2R1bGVfcmVtb3ZlX3ZpZGVvX3ZpZXctTycsXG4gIC8qKlxuICAgKiDmkq3mlL7lqpLkvZNcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9wbGF5X21lZGlhLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IgPSAnTC1jYWxscGx1c19jbGllbnRfcGxheV9tZWRpYS1SJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfVCA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1UJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1SJyxcbiAgLyoqXG4gICAqIOmdmemfs+i/nOerr+mfs+mikVxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9UID0gJ0wtcnRjX21vZHVsZV9zZXRfYWxsX3JlbW90ZV9hdWRpb19lbmJhbGUtVCcsXG4gIExfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiA9ICdMLXJ0Y19tb2R1bGVfc2V0X2FsbF9yZW1vdGVfYXVkaW9fZW5hYmxlLVInLFxuICAvKipcbiAgICog6K6i6ZiFXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1QgPSAnTC1ydGNfbW9kdWxlX3N1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SID0gJ0wtcnRjX21vZHVsZV9zdWJzY3JpYmUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojorqLpmIVcbiAgICovXG4gIExfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9UID0gJ0wtcnRjX21vZHVsZV91bnN1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1IgPSAnTC1ydGNfbW9kdWxlX3Vuc3Vic2NyaWJlLVInLFxuICAvKipcbiAgICog5Li75Yqo5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9UID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVQnLFxuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVInLFxuICAvKipcbiAgICog5Y+W5raI5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfVU5QVUJMSVNIX1QgPSAnTC1ydGNfbW9kdWxlX3VucHVibGlzaC1UJyxcbiAgTF9SVENfTU9EVUxFX1VOUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV91bnB1Ymxpc2gtUicsXG4gIC8qKlxuICAgKiDplIDmr4HmiYDmnInpn7Pop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9ERVNUUk9ZX0FMTF9UUkFDS1NfTyA9ICdMLXJ0Y19tb2R1bGVfZGVzdHJveV9hbGxfdHJhY2tzLU8nLFxuICAvKipcbiAgICogc2Vzc2lvbiDlu7rnq4vlkI4gUlRDIOaooeWdl+eahOWkhOeQhlxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9UID0gJ0wtcnRjX21vZHVsZV9zZXNzaW9uX2Nvbm5lY3QtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUCA9ICdMLXJ0Y19tb2R1bGVfc2Vzc2lvbl9jb25uZWN0LVAnLFxuICBMX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY29ubmVjdC1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g57uT5p2f5ZCOIFJUQyDmqKHlnZfnmoTlpITnkIZcbiAgICovXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1QgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1AgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUicsXG4gIC8qKlxuICAgKiDliJvlu7rop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfVCA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX3ZpZGVvX3RyYWNrLVQnLFxuICBMX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IgPSAnTC1ydGNfbW9kdWxlX2NyZWF0ZV92aWRlb190cmFjay1SJyxcbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikei1hOa6kFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19UID0gJ0wtcnRjX21vZHVsZV9jcmVhdGVfYXVkaW9fdHJhY2stVCcsXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX2F1ZGlvX3RyYWNrLVInLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfcHVibGlzaC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOi1hOa6kOWPlua2iOWPkeW4g1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfVU5QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfdW5wdWJsaXNoLU8nLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfZW5hYmxlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOiiq+i4ouWHuuaIv+mXtFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfS0lDS19PRkZfTyA9ICdMLXJ0Y19tb2R1bGVfcmVjZWl2ZV9raWNrX29mZi1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBwZWVyY29ubmVjdGlvbiDlvILluLjlhbPpl61cbiAgICovXG4gIExfUlRDX01PRFVMRV9SRUNFSVZFX1BFRVJDT05ORUNUSU9OX0VYQ0VQVF9DTE9TRV9PID0gJ0wtcnRjX21vZHVsZV9yZWNlaXZlX3BlZXJjb25uZWN0aW9uX2V4Y2VwdF9jbG9zZS1PJyxcbiAgLyoqXG4gICAqIOWIh+aNouWqkuS9k+exu+Wei1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1ydGNfbW9kdWxlX2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiA9ICdMLXJ0Y19tb2R1bGVfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tUicsXG4gIC8qKlxuICAgKiDpgIDlh7rmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tUicsXG5cbiAgLy8gc2lnbmFsIOaooeWdl+aXpeW/l+agh+etvlxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9TSU5HTEVfQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3NpbmdsZV9jYWxsLVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HUk9VUF9DQUxMX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ3JvdXBfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOmCgOivt1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU5WSVRFX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW52aXRlLVQnLFxuICAvKipcbiAgICog5ZON6ZODXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SSU5HX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmluZy1UJyxcbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQUNDRVBUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfYWNjZXB0LVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9BQ0NFUFRfUiA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9hY2NlcHQtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror51cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0pPSU5fQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2pvaW5fY2FsbC1UJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSEFOR1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaGFuZ3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX1NUQVRVU19VUF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2NhbGxfc3RhdHVzX3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d5LqL5Lu25LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0VWRU5UX1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2FsbF9ldmVudF91cC1UJyxcbiAgLyoqXG4gICAqIOmAmuivneWvueivneS6i+S7tuS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9ESUFMT0dfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9jYWxsX2RpYWxvZ191cC1UJyxcbiAgLyoqXG4gICAqIOWIoOmZpOmAmuivneiusOW9lVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfREVMRVRFX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZGVsZXRlX2NhbGxfcmVjb3JkLVQnLFxuICAvKipcbiAgICog6I635Y+W6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9SRUNPUkRfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmn6Xor6IgY2FsbCBzZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9TRVJWRVJfVElNRV9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2dldF9jYWxsX3NlcnZlcl90aW1lLVQnLFxuICAvKipcbiAgICog6I635Y+W5oyH5a6a6YCa6K+d55qE5pe26Ze05L+h5oGvXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9USU1FX0lORk9fVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF90aW1lX2luZm8tVCcsXG4gIC8qKlxuICAgKiDojrflj5bnlKjmiLfmnKrnu5PmnZ/nmoTpgJror53liJfooajkv6Hmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9BVkFJTEFCTEVfQ0FMTF9MSVNUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ2V0X2F2YWlsYWJsZV9jYWxsX2xpc3QtVCcsXG4gIC8qKlxuICAgKiDmuIXpmaTpgJror53orrDlvZVcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0NMRUFSX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2xlYXJfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOiOt+WPlumAmuivneS/oeaBr1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfSU5GT19CWV9DQUxMSURfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9pbmZvX2J5X2NhbGxJZC1UJyxcbiAgLyoqXG4gICAqIOeUqOaIt+ezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfVVNFUl9TWVNURU1fU1RBVEVfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl91c2VyX3N5c3RlbV9zdGF0ZV91cC1UJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBjYWxsIHNpZ25hbCDmtojmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TSUdOQUxfREFUQV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfY2FsbF9zaWduYWxfZGF0YS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOWMllxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU1fU1RBVEVfQ0hBTkdFX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW1fc3RhdGVfY2hhbmdlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d6YKA6K+3XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfaW52aXRlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmVjZWl2ZV9jYWxsX3N0YXR1cy1PJyxcbiAgLyoqXG4gICAqIGNhbGwgZW5naW5lIOabtOaWsOS6uuWRmOeKtuaAgVxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUERBVEVfVVNFUlNfU1RBVEVfTyA9ICdMLWNhbGxfZW5naW5lX3VwZGF0ZV91c2Vyc19zdGF0ZS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOabtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9JTV9TVEFURV9DSEFOR0VfTyA9ICdMLWNhbGxfZW5naW5lX2ltX3N0YXRlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq+OAgeaUtuWIsOmCgOivt+i2heaXtlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DQUxMX1RJTUVPVVRfTyA9ICdMLWNhbGxfZW5naW5lX2NhbGxfdGltZW91dC1PJyxcbiAgLyoqXG4gICAqIOW8gOWQr+mAmuivneWumuaXtuWZqFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9TVEFSVF9DQUxMX1RJTUVSX08gPSAnTC1jYWxsX2VuZ2luZV9zdGFydF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5riF6Zmk6YCa6K+d5a6a5pe25ZmoXG4gICAqL1xuICBMX0NBTExfRU5HSU5FX1NUT1BfQ0FMTF9USU1FUl9PID0gJ0wtY2FsbF9lbmdpbmVfc3RvcF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5LiK5oqlIG9uUGhvbmVFbmRcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtVCcsXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1IgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtUicsXG4gIC8qKlxuICAgKiDmlLbliLDpppbluKfml7bpl7TkuIvlj5FcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9GSVJTVF9GUkFNRV9USU1FX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2ZpcnN0X2ZyYW1lX3RpbWUtTycsXG4gIC8qKlxuICAgKiDmlLbliLDlqpLkvZPnsbvlnovliIfmjaLkuovku7ZcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9NRURJQVRZUEVfQ0hBTkdFX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX21lZGlhdHlwZV9jaGFuZ2UtTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53nu5PmnZ9cbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2Nsb3NlX3Nlc3Npb24tTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53ml6Xlv5dcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DQUxMX1JFQ09SRF9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jYWxsX3JlY29yZC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOihpeWBv+aVsOaNrlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NPTVBMRU1FTlRBUllfREFUQV9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jb21wbGVtZW50YXJ5X2RhdGEtTycsXG4gIC8qKlxuICAgKiDliJvlu7ogc2Vzc2lvblxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfVCA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1UJyxcbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfUiA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOS4iuaKpemmluW4p+aXtumXtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9maXJzdF9mcmFtZV90aW1lLVQnLFxuICBMX0NBTExfRU5HSU5FX1VQX0ZJUlNUX0ZSQU1FX1RJTUVfUiA9ICdMLWNhbGxfZW5naW5lX3VwX2ZpcnN0X2ZyYW1lX3RpbWUtUicsXG4gIC8qKlxuICAgKiDlvIDlkK/ml7bpl7TmoKHmraNcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUQVJUX08gPSAnTC10aW1lX2NvcnJlY3Rfc3RhcnQtTycsXG4gIC8qKlxuICAgKiDlgZzmraLmoKHml7ZcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUT1BfTyA9ICdMLXRpbWVfY29ycmVjdF9zdG9wLU8nLFxuICAvKipcbiAgICog6YeN5paw5byA5ZCv5qCh5pe2XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9SRVNUQVJUX08gPSAnTC10aW1lX2NvcnJlY3RfcmVzdGFydC1PJyxcbiAgLyoqXG4gICAqIOS7juacjeWKoeerr+iOt+WPlumAmuivneaXtumVv+OAgemAmuivneW8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1QgPSAnTC10aW1lX2NvcnJlY3RfZ2V0X2NhbGxfY2xpZW50X3RpbWVfYnlfc2VydmVyLVQnLFxuICBMX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUCA9ICdMLXRpbWVfY29ycmVjdF9nZXRfY2FsbF9jbGllbnRfdGltZV9ieV9zZXJ2ZXItUCcsXG4gIExfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SID0gJ0wtdGltZV9jb3JyZWN0X2dldF9jYWxsX2NsaWVudF90aW1lX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOiuoeeul+WuouaIt+err+W8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9UID0gJ0wtdGltZV9jb3JyZWN0X2NhbGNfY2xpZW50X3N0YXJ0X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiA9ICdMLXRpbWVfY29ycmVjdF9jYWxjX2NsaWVudF9zdGFydF90aW1lLVInLFxuICAvKipcbiAgICog5a2Y5YKo5a6i5oi356uv5ZKM5pyN5Yqh56uv5pe26Ze05YGP5beuXG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PID0gJ0wtdGltZV9jb3JyZWN0X3NldF9kZWx0YV90aW1lLU8nLFxuICAvKipcbiAgICog5b6q546v5LiJ5qyh5qCh5q2j57uZ5a6i5oi356uv55qE5pe26Ze0XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfVCA9ICdMLXRpbWVfY29ycmVjdF9sb29wX2NvcnJlY3RfY2xpZW50X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9SID0gJ0wtdGltZV9jb3JyZWN0X2xvb3BfY29ycmVjdF9jbGllbnRfdGltZS1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g5YaF6YOo5pu05paw5Lq65ZGY54q25oCBXG4gICAqL1xuICBMX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTyA9ICdMLWlubmVyX3Nlc3Npb25fdXBkYXRlX3VzZXJfc3RhdGUtTycsXG4gIC8qKlxuICAgKiDorr7nva4gc2Vzc2lvbiDkurrlkZjorr7lpIfnirbmgIFcbiAgICovXG4gIExfSU5ORVJfU0VTU0lPTl9TRVRfVVNFUl9ERVZJQ0VfRU5BQkxFX08gPSAnTC1pbm5lcl9zZXNzaW9uX3NldF91c2VyX2RldmljZV9lbmFibGUtTycsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1QgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfY3JlYXRlX3RpbWUtVCcsXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1IgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfY3JlYXRlX3RpbWUtUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53ml7bplb9cbiAgICovXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0RVUkFUSU9OX1QgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfZHVyYXRpb24tVCcsXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0RVUkFUSU9OX1IgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfZHVyYXRpb24tUicsXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDQ2FsbFBsdXNUeXBlLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgUkNDYWxsUGx1c01lZGlhVHlwZSwgUkNDYWxsUGx1c0NhbGxTdGF0ZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxJbm5lclNlc3Npb24gfSBmcm9tICcuL1JDQ2FsbElubmVyU2Vzc2lvbic7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuLyoqXG4gKiDlr7nlpJYgc2Vzc2lvbiDlrp7kvovvvIzku4XmnInojrflj5bmlrnms5XvvIzml6Dms5Xkv67mlLlcbiAqL1xuZXhwb3J0IGNsYXNzIFJDQ2FsbFBsdXNTZXNzaW9uIHtcbiAgcHJpdmF0ZSBfc3RhcnRUaW1lOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfZHVyYXRpb246IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9jYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2Vzc2lvbjogUkNDYWxsSW5uZXJTZXNzaW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLl9jYWxsSWQgPSB0aGlzLl9zZXNzaW9uLmdldENhbGxJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBDYWxsSWRcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIGdldFN0YXRlKCk6IFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uLmdldFNlc3Npb25TdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENhbGxUeXBlKCk6IFJDQ2FsbFBsdXNUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsVHlwZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneWqkuS9k+exu+Wei1xuICAgKi9cbiAgcHVibGljIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53kurrlkZjliJfooahcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyTGlzdCgpOiB7IHVzZXJJZDogc3RyaW5nLCBzdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRVc2VyTGlzdCgpLm1hcCgodXNlcikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB1c2VySWQsIHVzZXJTdGF0ZSwgY2FtZXJhRW5hYmxlLCBtaWNyb3Bob25lRW5hYmxlLFxuICAgICAgfSA9IHVzZXI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHN0YXRlOiB1c2VyU3RhdGUsXG4gICAgICAgIGNhbWVyYUVuYWJsZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5Y+R6LW36ICFIHVzZXJJZFxuICAgKi9cbiAgZ2V0Q3JlYXRvclVzZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uLmdldFN0YXJ0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53pgoDor7fogIUgdXNlcklkXG4gICAqIOWRvOWFpeacieWAvO+8jOWRvOWHuuaXtu+8jOWAvOS4uuacrOWcsOeUqOaItyBVc2VySWRcbiAgICovXG4gIGdldEludml0ZXJVc2VySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsZXJJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivnei1t+Wni+aXtumXtFxuICAgKi9cbiAgYXN5bmMgZ2V0Q3JlYXRlVGltZXN0YW1wKCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgc3RhcnRUaW1lPzogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfVCwgJycsIHRyYWNlSWQpO1xuICAgIGlmICh0aGlzLl9zdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxTdGFyaW5nVGltZSh7IGNhbGxJZDogdGhpcy5fY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9DUkVBVEVfVElNRV9SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSBjbGllbnRTdGFydFRpbWUhO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgc3RhcnRUaW1lOiB0aGlzLl9zdGFydFRpbWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53ml7bplb9cbiAgICog6YCa6K+d5pyq57uT5p2f5YmN77yM5YC85Li6IDBcbiAgICovXG4gIGFzeW5jIGdldER1cmF0aW9uKCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fZHVyYXRpb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU30sIGR1cmF0aW9uOiAke3RoaXMuX2R1cmF0aW9ufWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgZHVyYXRpb246IHRoaXMuX2R1cmF0aW9uIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxUaW1lSW5mbyh0aGlzLl9jYWxsSWQsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU30sIGR1cmF0aW9uOiAke2RhdGEhLmR1cmF0aW9ufWAsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2R1cmF0aW9uID0gZGF0YSEuZHVyYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkdXJhdGlvbjogdGhpcy5fZHVyYXRpb24sXG4gICAgfTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlkbzlj6vnsbvlnotcbiAqL1xuZXhwb3J0IGVudW0gUkNDYWxsUGx1c1R5cGUge1xuICAvKipcbiAgICog5Y2V5ZG8XG4gICAqL1xuICBTSU5HTEUsXG4gIC8qKlxuICAgKiDlpJrkurrlkbzlj6tcbiAgICovXG4gIE1VTFRJXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiBJRExFXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOebtOaOpeaMguaWrVxuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOetieW+heaOpeWQrOWFtuS7lumAmuivnVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOato+WcqOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog5q2j5Zyo57O757uf6YCa6K+d5LitXG4gICAqL1xuICBPTlBIT05FID0gMzAxLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/otoXml7bmnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDpgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDpgJror53mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOW8guW4uFxuICAgKi9cbiAgRVJST1IgPSAyMDAwXG59XG4iLCIvKipcbiAqIOWRvOWPq+WqkuS9k+exu+Wei1xuICovXG5leHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgLyoqXG4gICAqIOmfs+mikVxuICAgKi9cbiAgQVVESU8sXG4gIC8qKlxuICAgKiDpn7Pop4bpopFcbiAgICovXG4gIEFVRElPX1ZJREVPLFxuICAvKipcbiAgICog6KeG6aKRXG4gICAqL1xuICBWSURFTyxcbn1cbiIsIi8qKlxuICog6YCa6K+d54q25oCBXG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAvKipcbiAgICog5Yid5aeL54q25oCBXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOato+WcqOWRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW/mee6v+WTjemTg1xuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW/mee6v+etieW+hVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PQU5TV0VSID0gMTAwMSxcbiAgLyoqXG4gICAqIOW3seerr+acquaOpeWQrFxuICAgKi9cbiAgTUlTU0VEID0gMTAwMixcbiAgLyoqXG4gICAqIOW3seerr+WPlua2iOmAmuivnVxuICAgKi9cbiAgQ0FOQ0VMRUQgPSAxMDAzLFxuICAvKipcbiAgICog6L+c56uv5ouS57udXG4gICAqL1xuICBERUNMSU5FRCA9IDEwMDQsXG5cbiAgRVJST1IgPSAyMDAwXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IHtcbiAgLyoqXG4gICAqIOivt+axguaWueWPlua2iOWqkuS9k+exu+Wei+WPmOabtFxuICAgKi9cbiAgQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFID0gMCxcbiAgLyoqXG4gICAqIOW6lOetlOaWueaLkue7neWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgUkVGVVNFX0NIQU5HRV9NRURJQV9UWVBFID0gMSxcbiAgLyoqXG4gICAqIOacjeWKoeS7suijgeWFgeiuuOWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgU0VSVkVSX0FMTE9XX01FRElBX1RZUEUgPSAyLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i6LaF5pe2XG4gICAqL1xuICBDSEFOR0VfTUVESUFfVFlQRV9USU1FT1VUID0gMyxcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNSZWFzb24ge1xuICBJRExFID0gMCxcbiAgQ0FMTElORyA9IDEwMCxcbiAgSU5WSVRFRCA9IDEwMSxcbiAgUklOR0lORyA9IDEwMixcbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgT05DQUxMID0gMzAwLFxuICBPTl9QSE9ORSA9IDMwMSxcbiAgT05fUEhPTkVfRU5EID0gMzAyLFxuICAvKipcbiAgICog6L6T5YWl6K6+5aSH5LiN5Y+v55SoXG4gICAqL1xuICBPTl9ERVZJQ0VfRElTQUJMRSA9IDMwMyxcbiAgLyoqXG4gICAqIOi+k+WFpeiuvuWkh+WPr+eUqFxuICAgKi9cbiAgT05fREVWSUNFX0VOQUJMRSA9IDMwNCxcbiAgLyoqXG4gICAqIOacrOerr+W8guW4uOemu+W8gFxuICAgKi9cbiAgQUJOT1JNQUxfRU5EID0gOTk5LFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/mnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDlt7Hnq6/pgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDov5znq6/mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+WRvOWHuijlvZPliY3nq6/ooqvouKIpXG4gICAqL1xuICBPVEhFUl9DTElFTlRfQ0FMTElORyA9IDEwMTAsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/lt7LmjqXlkKxcbiAgICovXG4gIE9USEVSX0NMSUVOVF9BQ0NFUFQgPSAxMDExLFxuICAvKipcbiAgICog5Yqg5YWlIFJUQyDmiL/pl7TlpLHotKVcbiAgICovXG4gIEpPSU5fUk9PTV9FUlIgPSAxMTA1LFxuICAvKipcbiAgICog5Y+R5biD6LWE5rqQ5aSx6LSlXG4gICAqL1xuICBQVUJMSVNIX0VSUiA9IDExMDYsXG4gIC8qKlxuICAgKiDorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlIgPSAxMTA3LFxuICAvKipcbiAgICog5o6l5ZCs57O757uf6YCa6K+dXG4gICAqL1xuICBBQ0NFUFRfQ0FSUklFUiA9IDExMDgsXG4gIC8qKlxuICAgKiDooqvnpoHmraLpgJror51cbiAgICovXG4gIEtJQ0tFRF9CWV9TRVJWRVIgPSAxMTA5LFxuICAvKipcbiAgICogUlRDIFBpbmcg5aSx6LSl6KKr6Lii5Ye65oi/6Ze0XG4gICAqL1xuICBDT05ORUNUSU9OX0VSUiA9IDExMTAsXG4gIC8qKlxuICAgKiDnlKjmiLfpgIDlh7rnmbvlvZXooqvouKLlh7rmiL/pl7RcbiAgICovXG4gIExPR09VVCA9IDExMTEsXG4gIC8qKlxuICAgKiDnlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIE9USEVSX0NMSUVOVF9MT0dJTiA9IDExMTIsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/liqDlhaXmlrDpgJror51cbiAgICovXG4gIE9USEVSX0NMSUVOVF9KT0lORUQgPSAxMTEzLFxuICAvKipcbiAgICog5YW25LuW56uv5bey5Zyo5YW25LuW6YCa6K+d5Lit77yI5bex56uvIEExIOWFtuS7luerr+ato+WcqOmAmuivneS4re+8jEEyIOWkmuerr+WPiOWKoOWFpeaIv+mXtOiiq+aLkue7neWQjumAmuivnee7k+adnyBBMiDnmoTnirbmgIHvvIlcbiAgICovXG4gIE9USEVSX0NMSUVOVF9JTl9ST09NID0gMTExNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+W3suaMguaWrVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0hBTkdVUCA9IDExNTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfliqDlhaXmiL/pl7TlpLHotKVcbiAgICovXG4gIFJFTU9URV9KT0lOX1JUQ19FUlJPUiA9IDEyMDUsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflj5HluIPotYTmupDlpLHotKVcbiAgICovXG4gIFJFTU9URV9QVUJMSVNIX0VSUk9SID0gMTIwNixcbiAgLyoqXG4gICAqIOi/nOerr+eUqOaIt+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDEyMDcsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflt7Looqso5bCB56aBKeemgeatoumAmuivnVxuICAgKi9cbiAgUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIgPSAxMjA5LFxuICAvKipcbiAgICog6L+c56uv55So5oi3VURQ6L+e5o6l5pat5byAXG4gICAqL1xuICBSRU1PVEVfQ09OTkVDVElPTl9FUlJPUiA9IDEyMTAsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfpgIDlh7pJTeeZu+W9lVxuICAgKi9cbiAgUkVNT1RFX0xPR09VVCA9IDEyMTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfTE9HSU4gPSAxMjEyLFxuICAvKipcbiAgICog6L+c56uv55So5oi36KKr5YW25LuW56uv5Yqg5YWl5oi/6Ze0IGpvaW5Sb29tIOi4ouWHulxuICAgKi9cbiAgUkVNT1RFX09USEVSX0pPSU5FRF9SVEMgPSAxMjEzLFxuICAvKipcbiAgICog6L+c56uv55So5oi355qE5YW25LuW56uv5bey57uP5Zyo5oi/6Ze05Lit77yM5LiN5YWB6K64IGpvaW5Sb29tIOi/m+ihjOmfs+inhumikemAmuivnVxuICAgKi9cbiAgUkVNT1RFX09USEVSX0NMSUVOVF9JTl9SVEMgPSAxMjE0XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgaXNOdW1iZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBJQXVkaW9Db25maWcgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICBwcml2YXRlIF9hdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnID0ge31cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIOaMh+Wumum7mOiupOm6puWFi+mjjlxuICAgKiBtaWNyb3Bob25lSWQg5Y+W5YC85Y+v5Y+C6ICDIGh0dHBzOi8vZG9jLnJvbmdjbG91ZC5jbi9ydGMvV2ViLzUuWC9kZXZpY2UjJUU4JThFJUI3JUU1JThGJTk2JUU5JUJBJUE2JUU1JTg1JThCJUU5JUEzJThFJUU4JUFFJUJFJUU1JUE0JTg3JUU1JTg4JTk3JUU4JUExJUE4XG4gICAqL1xuICBzZXREZWZhdWx0TWljcm9waG9uZUlkKG1pY3JvcGhvbmVJZDogc3RyaW5nKTogUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1pY3JvcGhvbmVJZCA9IG1pY3JvcGhvbmVJZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7mnIDlsI/jgIHmnIDlpKfnoIHnjodcbiAgICog5Y2V5L2NIGticHNcbiAgICog5LiN6K6+572u5pe277yM5Y+W5Yqo5oCB56CB546H6K6h566X57uT5p6cXG4gICAqIEBwYXJhbSBtaW4g5pyA5bCP56CB546HXG4gICAqIEBwYXJhbSBtYXgg5pyA5aSn56CB546HXG4gICAqL1xuICBzZXRCaXRyYXRlKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IFJDQXVkaW9Db25maWdCdWlsZGVyIHtcbiAgICBpZiAoIWlzTnVtYmVyKG1pbikgfHwgIWlzTnVtYmVyKG1heCkgfHwgbWF4IDw9IDAgfHwgbWluIDw9IDAgfHwgbWF4IDwgbWluKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0FVRElPX0NPTkZJR19TRVRfQklUUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IG1heDogJHttYXh9LG1pbjogJHttaW59LCBtYXggYW5kIG1pbiBpcyBhIG51bWJlciA+IDAsIG1heCBzaG91bGQgPiBtaW5gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hdWRpb0NvbmZpZy5taW5CaXRyYXRlID0gbWluO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1heEJpdHJhdGUgPSBtYXg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6Z+z6aKR6YeH5qC3546H77yM5LiN5bu66K6u6Ieq6KGM5L+u5pS5XG4gICAqIEBwYXJhbSBzYW1wbGVSYXRlIOmHh+agt+eOh1xuICAgKi9cbiAgc2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlOiBudW1iZXIpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihzYW1wbGVSYXRlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19BVURJT19DT05GSUdfU0VUX1NBTVBMRV9SQVRFX08sIGBwYXJhbXMgZXJyb3IgLT4gc2FtcGxlUmF0ZTogJHtzYW1wbGVSYXRlfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOaehOW7uumFjee9riAqL1xuICBidWlsZCgpOiBJQXVkaW9Db25maWcge1xuICAgIHJldHVybiB0aGlzLl9hdWRpb0NvbmZpZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIsIGlzTnVtYmVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0ZyYW1lUmF0ZSwgUkNDYWxsUGx1c1Jlc29sdXRpb24sIElWaWRlb0NvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gIHByaXZhdGUgX3ZpZGVvQ29uZmlnOiBJVmlkZW9Db25maWcgPSB7XG4gICAgcmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24uVzY0MF9INDgwLFxuICAgIGZyYW1lUmF0ZTogUkNDYWxsUGx1c0ZyYW1lUmF0ZS5GUFNfMTUsXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruW4p+eOhyAqL1xuICBzZXRGcmFtZVJhdGUoZnBzOiBSQ0NhbGxQbHVzRnJhbWVSYXRlKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIGlmICghUkNDYWxsUGx1c0ZyYW1lUmF0ZVtmcHNdKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IGZwczogJHtmcHN9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcuZnJhbWVSYXRlID0gZnBzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruWIhui+qOeOhyAqL1xuICBzZXRWaWRlb1Jlc29sdXRpb24ocmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24pOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFSQ0NhbGxQbHVzUmVzb2x1dGlvbltyZXNvbHV0aW9uXSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX1JFU09MVVRJT05fTywgYHBhcmFtcyBlcnJvciAtPiByZXNvbHV0aW9uOiAke3Jlc29sdXRpb259YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcucmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6buY6K6kIGNhbWVyYUlkXG4gICAqIGNhbWVyYUlkIOWPluWAvOWPr+WPguiAgyBodHRwczovL2RvYy5yb25nY2xvdWQuY24vcnRjL1dlYi81LlgvZGV2aWNlIyVFOCU4RSVCNyVFNSU4RiU5NiVFNiU5MSU4NCVFNSU4MyU4RiVFNSVBNCVCNCVFOCVBRSVCRSVFNSVBNCU4NyVFNSU4OCU5NyVFOCVBMSVBOFxuICAgKiDkvZznlKjkuo7pooTop4jlip/og73jgIHlkbzlj6vlj5bmtYHnrYlcbiAgICovXG4gIHNldERlZmF1bHRDYW1lcmFJZChjYW1lcmFJZDogc3RyaW5nKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnLmNhbWVyYUlkID0gY2FtZXJhSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5pyA5bCP44CB5pyA5aSn56CB546HXG4gICAqIOWNleS9jSBrYnBzXG4gICAqIOS4jeiuvue9ruaXtu+8jOWPluWKqOaAgeeggeeOh+iuoeeul+e7k+aenFxuICAgKiBAcGFyYW0gbWluIOacgOWwj+eggeeOh1xuICAgKiBAcGFyYW0gbWF4IOacgOWkp+eggeeOh1xuICAgKi9cbiAgc2V0Qml0cmF0ZShtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihtaW4pIHx8ICFpc051bWJlcihtYXgpIHx8IG1heCA8PSAwIHx8IG1pbiA8PSAwIHx8IG1heCA8IG1pbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX0JJVFJBVEVfTywgYHBhcmFtcyBlcnJvciAtPiBtYXg6ICR7bWF4fSxtaW46ICR7bWlufSwgbWF4IGFuZCBtaW4gaXMgYSBudW1iZXIgPiAwLCBtYXggc2hvdWxkID4gbWluYCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcubWluQml0cmF0ZSA9IG1pbjtcbiAgICB0aGlzLl92aWRlb0NvbmZpZy5tYXhCaXRyYXRlID0gbWF4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g5p6E5bu66YWN572uXG4gIGJ1aWxkKCk6IElWaWRlb0NvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZGVvQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTmF2aUluZm8sIGlzTnVtYmVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUsIFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQge1xuICBJQWNjZXB0SW5mbywgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLCBJSGFuZ3VwSW5mbywgSU90aGVyTWVtSW5mbywgSVJpbmdpbmdJbmZvLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSQ0NhbGxDbGllbnQnO1xuaW1wb3J0IHsgSVN0YXR1c0Rvd25Db250LCBJU3luY0NhbGxMb2dSZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5cbi8qKlxuICogY2FsbCBzZXJ2ZXIgbG9nIOi9rOaNolxuICovXG5leHBvcnQgY29uc3QgdHJhbjJDYWxsTG9nID0gKGNhbGxMb2dMaXN0OiBJU3luY0NhbGxMb2dSZXMpOiBJUkNDYWxsUGx1c0NhbGxSZWNvcmQgPT4ge1xuICBjb25zdCB7XG4gICAgY2FsbElkLFxuICAgIGNhbGxUeXBlLFxuICAgIGNhbGxEaXIsXG4gICAgbWVkaWFUeXBlLFxuICAgIGNhbGxpbmdVc2VySWQsXG4gICAgY2FsbFVzZXJJZHMsXG4gICAgY2FsbFN0YXR1cyxcbiAgICBzZXNzaW9uU3RhdHVzLFxuICAgIHN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uLFxuICAgIHNlY3JldENoYXQsXG4gICAgc3luY1RpbWUsXG4gICAgc3lzU3RhdHVzLFxuICAgIGNydFRpbWUsXG4gIH0gPSBjYWxsTG9nTGlzdDtcbiAgcmV0dXJuIHtcbiAgICBjYWxsSWQsXG4gICAgY2FsbFR5cGUsXG4gICAgY2FsbERpcmVjdGlvbjogY2FsbERpcixcbiAgICBtZWRpYVR5cGUsXG4gICAgLy8gaXNTZWNyZXRDaGF0OiBCb29sZWFuKHNlY3JldENoYXQpLFxuICAgIGNhbGxlclVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICBjYWxsVXNlcklkcyxcbiAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgIHN0YXJ0VGltZXN0YW1wOiBzdGFydFRpbWUsXG4gICAgZW5kVGltZXN0YW1wOiBlbmRUaW1lLFxuICAgIGR1cmF0aW9uLFxuICAgIHN5bmNUaW1lc3RhbXA6IHN5bmNUaW1lLFxuICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgY3JlYXRlVGltZXN0YW1wOiBjcnRUaW1lLFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJUGFyc2VTdGF0dXMge1xuICByaW5naW5nRGF0YTogSVJpbmdpbmdJbmZvW107XG4gIGhhbmd1cERhdGE6IElIYW5ndXBJbmZvW107XG4gIGFjY2VwdERhdGE6IElBY2NlcHRJbmZvW107XG4gIG90aGVySW52aXRlZERhdGE6IElPdGhlck1lbUluZm9bXTtcbn1cblxuLyoqXG4gKiBwYXJzZVN0YXR1c1xuICovXG5leHBvcnQgY29uc3QgcGFyc2VTdGF0dXNEYXRhID0gKGRhdGE6IElTdGF0dXNEb3duQ29udCk6IElQYXJzZVN0YXR1cyA9PiB7XG4gIGNvbnN0IHsgY2FsbElkLCBjYWxsU3RhdHVzIH0gPSBkYXRhO1xuICBjb25zdCByaW5naW5nRGF0YTogSVJpbmdpbmdJbmZvW10gPSBbXTtcbiAgY29uc3QgaGFuZ3VwRGF0YTogSUhhbmd1cEluZm9bXSA9IFtdO1xuICBjb25zdCBhY2NlcHREYXRhOiBJQWNjZXB0SW5mb1tdID0gW107XG4gIGNvbnN0IG90aGVySW52aXRlZERhdGE6IElPdGhlck1lbUluZm9bXSA9IFtdO1xuICBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGNvbnN0IHsgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMgfSA9IGl0ZW07XG4gICAgc3dpdGNoIChzZXNzaW9uU3RhdHVzKSB7XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQ6XG4gICAgICAgIG90aGVySW52aXRlZERhdGEucHVzaCh7XG4gICAgICAgICAgY2FsbElkLFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuUklOR0lORzpcbiAgICAgICAgLy8g6YCa55+l5ZON6ZODXG4gICAgICAgIHJpbmdpbmdEYXRhLnB1c2goeyBjYWxsSWQsIGZyb21Vc2VySWQ6IHVzZXJJZCB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkc6XG4gICAgICAgIC8vIOmAmuefpeWvueaWueW3suaOpeWQrFxuICAgICAgICBhY2NlcHREYXRhLnB1c2goeyBmcm9tVXNlcklkOiB1c2VySWQgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQU5DRUxMRUQ6XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkRFQ0xJTkVEOlxuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5FTkRFRDpcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTpcbiAgICAgICAgaGFuZ3VwRGF0YS5wdXNoKHtcbiAgICAgICAgICBjYWxsSWQsXG4gICAgICAgICAgZnJvbVVzZXJJZDogdXNlcklkLFxuICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcmluZ2luZ0RhdGEsXG4gICAgaGFuZ3VwRGF0YSxcbiAgICBhY2NlcHREYXRhLFxuICAgIG90aGVySW52aXRlZERhdGEsXG4gIH07XG59O1xuXG4vKipcbiAqIOWug+ajgOafpeWFg+e0oOaYr+WQpuaYr+inhumikeiKgueCuVxuICogQHBhcmFtIHthbnl9IGVsZW1lbnQgLSDmgqjopoHmo4Dmn6XnmoTlhYPntKDmmK/lkKbkuLrop4bpopHlhYPntKDjgIJcbiAqIEByZXR1cm5zIOS4gOS4quW4g+WwlOWAvOOAglxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVWaWRlb05vZGVOYW1lID0gKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVOYW1lICYmIGVsZW1lbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1ZJREVPJztcblxuLyoqXG4gKiDmoLnmja7nlKjmiLflvZPliY3nmoQgc3lzdGVtU3RhdGUg5ZKM5paw5LiL5Y+R55qEIHN5c3RlbVN0YXRlLOadpeWIpOaWreaWsCBzeXN0ZW1TdGF0ZSDmmK/lkKbml6DmlYhcbiAqIOS+i++8muW9k+WJjeeUqOaIt+W3suWcqCBjYWxsIOS4re+8jOWPiOaUtuWIsOatpOeUqOaIt+eahCDlk43pk4PjgIHov57mjqXkuK0g562JXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVN5c1N0YXRlID0gKGNydFN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCBuZXdTdGF0ZTogUkNDYWxsUGx1c1JlYXNvbikgPT4ge1xuICBsZXQgaXNJblZhbGlkID0gZmFsc2U7XG4gIGNvbnN0IGludmFsaWRTdGF0ZXMgPSBbXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5JTlZJVEVELFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uUklOR0lORyxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9XQUlULFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElORyxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLk9OQ0FMTCxcbiAgXTtcbiAgc3dpdGNoIChjcnRTdGF0ZSkge1xuICAgIGNhc2UgUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEw6XG4gICAgICBpZiAoaW52YWxpZFN0YXRlcy5pbmNsdWRlcyhuZXdTdGF0ZSkpIHtcbiAgICAgICAgaXNJblZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gaXNJblZhbGlkO1xufTtcblxuLyoqXG4gICAqIOagueaNrueUqOaIt+W9k+WJjeeahCB1c2VyU3RhdGUg5ZKM5paw5LiL5Y+R55qEIHVzZXJTdGF0ZSzmnaXliKTmlq3mlrAgdXNlclN0YXRlIOaYr+WQpuaXoOaViFxuICAgKiDml6DmlYjnmoTnlKjmiLfnirbmgIFcbiAgICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVVc2VyU3RhdGUgPSAoY3J0U3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCBuZXdTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUpID0+IHtcbiAgbGV0IGlzSW5WYWxpZCA9IGZhbHNlO1xuICBjb25zdCBpbnZhbGlkU3RhdGVzID0gW1xuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuUklOR0lORyxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5CVVNZTElORV9SSU5HSU5HLFxuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1dBSVQsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElORyxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsXG4gIF07XG4gIHN3aXRjaCAoY3J0U3RhdGUpIHtcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTDpcbiAgICAgIGlmIChpbnZhbGlkU3RhdGVzLmluY2x1ZGVzKG5ld1N0YXRlKSkge1xuICAgICAgICBpc0luVmFsaWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBpc0luVmFsaWQ7XG59O1xuXG4vKipcbiAqIOiOt+WPluaMguaWreaXtueahOS6uuWRmOezu+e7n+eKtuaAgVxuICogQHBhcmFtIHVzZXJTdGF0ZSDkurrlkZjnirbmgIFcbiAqIEBwYXJhbSBpc0NhbGxlZSDmmK/lkKbmmK/ooqvlj6tcbiAqIEByZXR1cm5zIOS6uuWRmOezu+e7n+eKtuaAgVxuICovXG5leHBvcnQgY29uc3QgZ2V0SGFuZ3VwU3lzdGVtU3RhdGUgPSAodXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgaXNDYWxsZWU6IGJvb2xlYW4pID0+IHtcbiAgbGV0IHN5c3RlbVN0YXRlO1xuICBzd2l0Y2ggKHVzZXJTdGF0ZSkge1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FMTElORzpcbiAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5DQU5DRUxMRUQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLlJJTkdJTkc6XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEOlxuICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkRFQ0xJTkVEO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HOlxuICAgICAgc3lzdGVtU3RhdGUgPSBpc0NhbGxlZSA/IFJDQ2FsbFBsdXNSZWFzb24uREVDTElORUQgOiBSQ0NhbGxQbHVzUmVhc29uLkNBTkNFTExFRDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMOlxuICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkVOREVEO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHN5c3RlbVN0YXRlO1xufTtcblxuLyoqXG4gKiDliKTmlq3mmK/lkKblvIDlp4vpn7Pop4bpopHmnI3liqFcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU3VwcG9ydE1lZGlhU2VydmVyID0gKG5hdmlJbmZvOiBJTmF2aUluZm8pID0+IHtcbiAgY29uc3QgeyB2b2lwQ2FsbEluZm8gfSA9IG5hdmlJbmZvO1xuICBpZiAoIXZvaXBDYWxsSW5mbykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHsgc3RyYXRlZ3kgfSA9IEpTT04ucGFyc2Uodm9pcENhbGxJbmZvKTtcbiAgaWYgKHN0cmF0ZWd5ICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVCaXRyYXRlID0gKG1pbkJpdHJhdGU/OiBudW1iZXIsIG1heEJpdHJhdGU/OiBudW1iZXIpID0+IHtcbiAgaWYgKG1pbkJpdHJhdGUgfHwgbWluQml0cmF0ZSA9PT0gMCkge1xuICAgIGlmICghaXNOdW1iZXIobWluQml0cmF0ZSkgfHwgbWluQml0cmF0ZSA8PSAwKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWluQml0cmF0ZTogYSBudW1iZXIgb2YgPiAwLCB2YWx1ZTogJHttaW5CaXRyYXRlfWAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAobWF4Qml0cmF0ZSB8fCBtYXhCaXRyYXRlID09PSAwKSB7XG4gICAgaWYgKCFpc051bWJlcihtYXhCaXRyYXRlKSB8fCBtYXhCaXRyYXRlIDw9IDApIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLCBlcnJvck1zZzogYHBhcmFtcyBlcnJvciAtPiBtYXhCaXRyYXRlOiBhIG51bWJlciBvZiA+IDAsIHZhbHVlOiAke21heEJpdHJhdGV9YCB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaW5CaXRyYXRlICYmIG1heEJpdHJhdGUgJiYgbWF4Qml0cmF0ZSA8IG1pbkJpdHJhdGUpIHtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWF4Qml0cmF0ZTogJHttYXhCaXRyYXRlfSwgbWluQml0cmF0ZTogJHttaW5CaXRyYXRlfSwgbWF4Qml0cmF0ZSBzaG91bGQgPiBtaW5CaXRyYXRlYCB9O1xuICB9XG5cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIHtcbiAgLyoqXG4gICAqIOWPkei1t+mAmuivnVxuICAgKi9cbiAgTF9RU19TVEFSVF9DQUxMX1MgPSAnQ2FsbC1zdGFydC1TJyxcbiAgLyoqXG4gICAqIOaOpeWQrOmAmuivnVxuICAgKi9cbiAgTF9RU19BQ0NFUFRfQ0FMTF9TID0gJ0NhbGwtYWNjZXB0LVMnLFxuICAvKipcbiAgICog5oyC5pat6YCa6K+dXG4gICAqL1xuICBMX1FTX0hBTkdVUF9DQUxMX1MgPSAnQ2FsbC1oYW5ndXAtUycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror51cbiAgICovXG4gIExfUVNfUkVDRUlWRV9DQUxMX1MgPSAnQ2FsbC1yZWN2LVMnLFxuICAvKipcbiAgICog5byC5bi45oyC5patXG4gICAqL1xuICBMX1FTX0FCTk9STUFMX0hBTkdVUF9TID0gJ0NhbGwtaW50ZXJydXB0LVMnXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgUGx1Z2luQ29udGV4dCB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsUGx1c1N0YXRpc3RpY3MnO1xuaW1wb3J0IHtcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSwgUkNDYWxsUGx1c1Nlc3Npb24sIFJDQ2FsbFBsdXNUeXBlLFxufSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ0NhbGxQTHVzU3RhdGlzdGljcyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0U3RhdGlzdGljc0RhdGEoXG4gICAgdGFnOiBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyxcbiAgICBjb2RlOiBudW1iZXIsXG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgc2Vzc2lvbjogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsLFxuICAgIGNsaWVudENhbGxJZD86IHN0cmluZyxcbiAgICBpbnZpdGVTb3VyY2U/OiBSQ0NhbGxQbHVzSW52aXRlU291cmNlIHwgbnVsbCxcbiAgICBleHRyYT86IHtcbiAgICAgIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAgIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSxcbiAgICAgIGNhbGxJZDogc3RyaW5nLFxuICAgIH0sXG4gICkge1xuICAgIGNvbnN0IG5vd1RpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSwgY2FsbFR5cGUsIGNhbGxJZCB9ID0gc2Vzc2lvbiA/IHsgbWVkaWFUeXBlOiBzZXNzaW9uLmdldE1lZGlhVHlwZSgpLCBjYWxsVHlwZTogc2Vzc2lvbi5nZXRDYWxsVHlwZSgpLCBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCkgfSA6IGV4dHJhITtcbiAgICBjb25zdCBjb21tb25EYXRhID0ge1xuICAgICAgY3I6ICd1bmtub3duJyxcbiAgICAgIG5ldDogJ3Vua25vd24nLFxuICAgICAgY29kOiBjb2RlLFxuICAgICAgbXRwOiBtZWRpYVR5cGUsXG4gICAgICBjdHA6IGNhbGxUeXBlLFxuICAgICAgY2lkOiBjYWxsSWQsXG4gICAgICB0aW1lOiBub3dUaW1lLFxuICAgICAgdWlkOiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLFxuICAgIH07XG5cbiAgICBjbGllbnRDYWxsSWQgJiYgT2JqZWN0LmFzc2lnbihjb21tb25EYXRhLCB7IGNjaWQ6IGNsaWVudENhbGxJZCB9KTtcblxuICAgIGxldCBkYXRhID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOWRvOWPq1xuICAgICAgICovXG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfUkVDRUlWRV9DQUxMX1M6XG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICByZjogaW52aXRlU291cmNlLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIC8qKlxuICAgICAgICog5byC5bi45oyC5patXG4gICAgICAgKi9cbiAgICAgIGNhc2UgUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUzpcbiAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAuLi5jb21tb25EYXRhLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HotbfjgIHmjqXlkKzjgIHmjILmlq3pgJror51cbiAgICAgICAgICovXG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICBkdXI6IG5vd1RpbWUgLSBzdGFydFRpbWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ0wtY2FsbC1wbHVzLXN0YXRpc3RpYycsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCB0YWcpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLl9fc3RhdGlzdGljcyh0YWcsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlr7nor53liqjkvZxcbiAqL1xuZXhwb3J0IGVudW0gRGlhbG9nQWN0aW9uIHtcbiAgLyoqXG4gICAqIOivt+axglxuICAgKi9cbiAgUkVRVUVTVCA9ICdyZXF1ZXN0JyxcbiAgLyoqXG4gICAqIOaOpeWPl1xuICAgKi9cbiAgQUNDRVBUID0gJ2FjY2VwdCcsXG4gIC8qKlxuICAgKiDmi5Lnu51cbiAgICovXG4gIFJFRlVTRSA9ICdyZWZ1c2UnLFxuICAvKipcbiAgICog6K+35rGC5Y+W5raIXG4gICAqL1xuICBDQU5DRUwgPSAnY2FuY2VsJyxcbiAgLyoqXG4gICAqIOmAmuefpVxuICAgKi9cbiAgTk9USUNFID0gJ25vdGljZScsXG4gIC8qKlxuICAgKiDotoXml7ZcbiAgICovXG4gIFRJTUVPVVQgPSAndGltZW91dCdcbn1cbiIsIi8qKlxuICog5a+56K+d57G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIERpYWxvZ1R5cGUge1xuICBTV0lUQ0hfTUVESUFfVFlQRSA9IDFcbn1cbiIsIi8qKlxuICog6YCa6K+d6aKd5aSW57G75Z6L77yI56e75Yqo56uv54m55pyJ77yJXG4gKi9cbmV4cG9ydCBlbnVtIFNlY3JldENhbGxUeXBlIHtcbiAgLyoqXG4gICAqIOaZrumAmumAmuivnVxuICAgKi9cbiAgTk9STUFMLFxuICAvKipcbiAgICog5a+G6IGKXG4gICAqL1xuICBTRUNSRVRcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuLi9lbnVtcy9EaWFsb2dBY3Rpb24nO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IElTZXNzaW9uVXNlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyB2YWxpZGF0ZVN5c1N0YXRlLCB2YWxpZGF0ZVVzZXJTdGF0ZSB9IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcblxuZXhwb3J0IGVudW0gQ2FsbFRpbWVyRXZlbnRUeXBlIHtcbiAgSU5WSVRFUiA9ICdpbnZpdGVyJyxcbiAgSU5WSVRFRSA9ICdpbnZpdGVlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPbGREaWFsb2dEYXRhe1xuICB0cmFuc2FjdGlvbklkPzogc3RyaW5nO1xuICBhY3Rpb246IERpYWxvZ0FjdGlvbjtcbiAgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlO1xufVxuXG4vKipcbiAqIFNESyDlhoXpg6jkvb/nlKggU2Vzc2lvbiDlrp7kvotcbiAqL1xuZXhwb3J0IGNsYXNzIFJDQ2FsbElubmVyU2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiDor7fmsYLmm7TmlrDnmoQgbWVkaWFUeXBlXG4gICAqL1xuICBwcml2YXRlIF9yZXFNZWRpYVR5cGUhOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHwgbnVsbFxuXG4gIC8qKlxuICAgKiDpgoDor7fogIXotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX2ludml0ZXJUaW1lcklkITogbnVtYmVyXG5cbiAgLyoqXG4gICAqIOiiq+mCgOivt+iAhei2heaXtuiuoeaXtuWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfaW52aXRlZVRpbWVySWQhOiBudW1iZXJcblxuICAvKipcbiAgICog5b2T5YmNIHNlc3Npb24g5Lq65ZGY5L+h5oGv5YiX6KGoXG4gICAqL1xuICAvLyBwcml2YXRlIF9jYWxsVXNlcnM6IElTZXNzaW9uVXNlcltdID0gW11cblxuICAvKipcbiAgICog5penIGRpYWxvZyDmlbDmja7vvIznlKjkuo7lr7nmr5RcbiAgICovXG4gIHByaXZhdGUgX29sZERpYWxvZ0RhdGEhOiBJT2xkRGlhbG9nRGF0YVxuXG4gIC8qKlxuICAgKiDorrDlvZXmmK/lkKbmnKzlnLDmnInmjILmlq1cbiAgICovXG4gIHByaXZhdGUgaXNMb2NhbENsaWVudEhhbmd1cDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOaehOmAoOWZqFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogQ2FsbCBJRFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIHNlc3Npb24g54q25oCBXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc3RhdGU6IFJDQ2FsbFBsdXNDYWxsU3RhdGUsXG4gICAgLyoqXG4gICAgICog6YCa6K+d57G75Z6LXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlLFxuICAgIC8qKlxuICAgICAqIOmAmuivneWqkuS9k+exu+Wei1xuICAgICAqL1xuICAgIHByaXZhdGUgX21lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAvKipcbiAgICAgKiBzZXNzaW9uIOWRvOWPq+WPkei1t+iAhVxuICAgICAqL1xuICAgIHByaXZhdGUgX3N0YXJ0Q2FsbGVySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDmnKzmrKEgc2Vzc2lvbiDnmoTpgoDor7fogIVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOW9k+WJjSBzZXNzaW9uIOS6uuWRmOS/oeaBr+WIl+ihqFxuICAgICAqL1xuICAgIHByaXZhdGUgX2NhbGxVc2VyczogSVNlc3Npb25Vc2VyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgQ2FsbElEXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FsbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uU3RhdGUoKTogUkNDYWxsUGx1c0NhbGxTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENhbGxUeXBlKCk6IFJDQ2FsbFBsdXNUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5aqS5L2T57G75Z6LXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVkaWFUeXBlKCk6IFJDQ2FsbFBsdXNNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIHNlc3Npb24g5Y+R6LW36ICFXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhcnRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGFydENhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOacrOasoSBzZXNzaW9uIOmCgOivt+iAhVxuICAgKi9cbiAgcHVibGljIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIHVzZXIgbGlzdFxuICAgKi9cbiAgcHVibGljIGdldFVzZXJMaXN0KCk6IElTZXNzaW9uVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFVzZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOivt+axguabtOaWsOeahCBtZWRpYVR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRSZXFNZWRpYVR5cGUoKTogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXFNZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogaW52aXRlclRpbWVySWRcbiAgICovXG4gIHB1YmxpYyBnZXRJbnZpdGVyVGltZXJJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVyVGltZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZpdGVlVGltZXJJZFxuICAgKi9cbiAgcHVibGljIGdldEludml0ZWVUaW1lcklkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ludml0ZWVUaW1lcklkO1xuICB9XG5cbiAgcHVibGljIGdldEFsbFRpbWVySWRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW3RoaXMuX2ludml0ZXJUaW1lcklkLCB0aGlzLl9pbnZpdGVlVGltZXJJZF07XG4gIH1cblxuICBwdWJsaWMgc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCBlbmFibGU6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1NFVF9VU0VSX0RFVklDRV9FTkFCTEVfTywgYHVzZXJJZDogJHt1c2VySWR9LCBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfSwgZW5hYmxlOiAke2VuYWJsZX1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB1c2VyU3RhdGUgPSB0aGlzLl9jYWxsVXNlcnMuZmluZCgoaXRlbSkgPT4gdXNlcklkID09PSBpdGVtLnVzZXJJZCk7XG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgdXNlclN0YXRlIS5taWNyb3Bob25lRW5hYmxlID0gZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VyU3RhdGUhLmNhbWVyYUVuYWJsZSA9IGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pu05paw5Lq65ZGY5YiX6KGoLCDlubbov5Tlm57mm7TmlrDnmoTkurrlkZjliJfooahcbiAgICog5qC55o2u5Lq65ZGY54q25oCB5Y675re75Yqg44CB5Yig6Zmk44CB5pu05pawXG4gICAqIOagueaNrueKtuaAgeaXtumXtO+8jOWIpOaWreaYr+WQpuabtOaWsO+8jOaXoOaXtumXtOaIs+eahOS4uuacrOWcsOeKtuaAgeiwg+aVtO+8jOebtOaOpeabtOaWsFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJMaXN0KHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKTogSVNlc3Npb25Vc2VyW10ge1xuICAgIGNvbnN0IGNoYW5nZWRVc2VyczogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVzZXJTdGF0ZTogbmV3VXNlclN0YXRlLFxuICAgICAgICBzdGF0ZVRpbWU6IG5ld1N0YXRlVGltZSxcbiAgICAgICAgc3lzdGVtU3RhdGU6IG5ld1N5c1N0YXRlLFxuICAgICAgfSA9IHVzZXI7XG4gICAgICBjb25zdCBuZWVkQWRkU3RhdGVzID0gW1JDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTExJTkcsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1dBSVRdO1xuICAgICAgaWYgKG5lZWRBZGRTdGF0ZXMuaW5jbHVkZXMobmV3VXNlclN0YXRlKSkge1xuICAgICAgICAvLyDnm7TmjqXmt7vliqDmlbDmja5cbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHB1c2ggdXNlcjogJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgdGhpcy5fY2FsbFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIGNoYW5nZWRVc2Vycy5wdXNoKHVzZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5pu05paw5pWw5o2uXG4gICAgICAgIGxldCBoYXNVc2VyID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FsbFVzZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdXNlcklkLCBzdGF0ZVRpbWU6IG9sZFN0YXRlVGltZSwgc3lzdGVtU3RhdGU6IG9sZFN5c3RlbVN0YXRlLCB1c2VyU3RhdGU6IG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICB9ID0gdGhpcy5fY2FsbFVzZXJzW2ldO1xuICAgICAgICAgIGlmICh1c2VySWQgPT09IHVzZXIudXNlcklkKSB7XG4gICAgICAgICAgICBoYXNVc2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW52YWxpZFN5c1N0YXRlID0gdmFsaWRhdGVTeXNTdGF0ZShvbGRTeXN0ZW1TdGF0ZSwgbmV3U3lzU3RhdGUpO1xuICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkVXNlclN0YXRlID0gdmFsaWRhdGVVc2VyU3RhdGUob2xkVXNlclN0YXRlLCBuZXdVc2VyU3RhdGUpO1xuXG4gICAgICAgICAgICBjb25zdCBpc0ludmFsaWRPbnBob25lRW5kID0gbmV3U3lzU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uT05fUEhPTkVfRU5EICYmIG9sZFN5c3RlbVN0YXRlICE9PSBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FICYmIG5ld1VzZXJTdGF0ZSAhPT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDml6DmlYjnmoTnirbmgIHvvJpcbiAgICAgICAgICAgICAqIOaWsOS4i+WPkeeKtuaAgeeahOaXtumXtOWwj+S6juW9k+WJjeeKtuaAgeeahOaXtumXtCDkuJQgc3lzdGVtU3RhdGUg5ZKMIHVzZXJTdGF0ZSDlnYfmmK/ml6DmlYjnmoRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKChuZXdTdGF0ZVRpbWUgJiYgb2xkU3RhdGVUaW1lICYmIG5ld1N0YXRlVGltZSA8IG9sZFN0YXRlVGltZSkgfHwgKGlzSW52YWxpZFN5c1N0YXRlICYmIGlzSW52YWxpZFVzZXJTdGF0ZSkpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdGltZW91dCB1c2VyIHN0YXRlOiBvbGQ6JHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICB1c2VySWQsIG9sZFN0YXRlVGltZSwgb2xkU3lzdGVtU3RhdGUsIG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICAgICAgICB9KX07IG5ldzoke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHVwZGF0ZVVzZXJMaXN0IGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8g55u05o6l6KaG55uW5pu05pawXG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGB1cGRhdGVVc2VyTGlzdCAtPiBjb3ZlciAke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB0aGlzLl9jYWxsVXNlcnNbaV0gPSB1c2VyO1xuICAgICAgICAgICAgICAhaXNJbnZhbGlkT25waG9uZUVuZCAmJiBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOaXoOatpOeUqOaIt+ebtOaOpea3u+WKoFxuICAgICAgICBpZiAoIWhhc1VzZXIpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdXBkYXRlVXNlckxpc3QgLT4gbm91c2VyIHB1c2ggJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICB0aGlzLl9jYWxsVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjaGFuZ2VkVXNlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0T2xkRGlhbG9nRGF0YShkYXRhOiBJT2xkRGlhbG9nRGF0YSkge1xuICAgIHRoaXMuX29sZERpYWxvZ0RhdGEgPSBkYXRhO1xuICB9XG5cbiAgLyoqID09PT09PeengeacieaWueazlT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICAvKipcbiAgICog5pu05pawIHNlc3Npb24g54q25oCBXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlU2Vzc2lvblN0YXRlKHN0YXRlOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlKSB7XG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDpgJror53nsbvlnovvvIjljYfpmY3nuqforr7nva7vvIlcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVDYWxsVHlwZShjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUpIHtcbiAgICB0aGlzLl9jYWxsVHlwZSA9IGNhbGxUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOWqkuS9k+exu+Wei++8iOWNh+mZjee6p++8iVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUpIHtcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw6K+35rGC55qE5aqS5L2T57G75Z6L77yI5Y2H6ZmN57qn77yJXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUmVxTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGwpIHtcbiAgICB0aGlzLl9yZXFNZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05pawIGludnRlciB0aW1lciBpZFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVRpbWVySWQodHlwZTogQ2FsbFRpbWVyRXZlbnRUeXBlLCB0aW1lcklkOiBudW1iZXIpIHtcbiAgICBpZiAodHlwZSA9PT0gQ2FsbFRpbWVyRXZlbnRUeXBlLklOVklURVIpIHtcbiAgICAgIHRoaXMuX2ludml0ZXJUaW1lcklkID0gdGltZXJJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW52aXRlZVRpbWVySWQgPSB0aW1lcklkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5ZcbiAgICovXG4gIHB1YmxpYyBnZXRPbGREaWFsb2dEYXRhKCk6IElPbGREaWFsb2dEYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fb2xkRGlhbG9nRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7mmK/lkKbmmK/lt7Hnq6/mjILmlq1cbiAgICovXG4gIHB1YmxpYyBzZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTG9jYWxDbGllbnRIYW5ndXAgPSBpc0xvY2FsQ2xpZW50SGFuZ3VwO1xuICB9XG5cbiAgcHVibGljIGdldElzTG9jYWxDbGllbnRIYW5ndXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2NhbENsaWVudEhhbmd1cDtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gQ2FsbFNlcnZlckFjdGlvbiB7XG4gIC8qKlxuICAgKiDlvIDlp4vljZXkurrlkbzlj6tcbiAgICovXG4gIFNUQVJUX1NJTkdMRV9DQUxMID0gJ3N0YXJ0U2luZ2xlQ2FsbCcsXG4gIC8qKlxuICAgKiDlvIDlp4vlpJrkurrlkbzlj6tcbiAgICovXG4gIFNUQVJUX0dST1VQX0NBTEwgPSAnc3RhcnRHcm91cENhbGwnLFxuICAvKipcbiAgICog6YKA6K+35aW95Y+L5Yqg5YWl6YCa6K+dXG4gICAqL1xuICBJTlZJVEVfQ0FMTCA9ICdpbnZpdGVDYWxsJyxcbiAgLyoqXG4gICAqIOS4i+WPkemCgOivt+mAmuivneaVsOaNrlxuICAgKi9cbiAgUFVCX0lOVklURV9DQUxMID0gJ3B1Ykludml0ZUNhbGwnLFxuICAvKipcbiAgICog6YCa6K+d5ZON6ZODXG4gICAqL1xuICBSSU5HSU5HX0NBTEwgPSAncmluZ0NhbGwnLFxuICAvKipcbiAgICog5o6l5Y+X6YCa6K+dXG4gICAqL1xuICBBQ0NFUFRfQ0FMTCA9ICdhY2NlcHRDYWxsJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnVxuICAgKi9cbiAgSk9JTl9DQUxMID0gJ2pvaW5DYWxsJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgSEFOR1VQX0NBTEwgPSAnaGFuZ3VwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53nirbmgIHkuIrmiqVcbiAgICovXG4gIFNUQVRVU19VUF9DQUxMID0gJ3N0YXR1c1VwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53nirbmgIHkuIvlj5FcbiAgICovXG4gIFNUQVRVU19ET1dOX0NBTEwgPSAnc3RhdHVzRG93bkNhbGwnLFxuICAvKipcbiAgICog6YCa6K+d5LqL5Lu25LiK5oqlXG4gICAqL1xuICBFVkVOVF9VUF9DQUxMID0gJ2V2ZW50VXBDYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneS6i+S7tuS4i+WPkVxuICAgKi9cbiAgRVZFTlRfRE9XTl9DQUxMID0gJ2V2ZW50RG93bkNhbGwnLFxuICAvKipcbiAgICog5a+56K+d5pWw5o2u5LiK6KGMXG4gICAqL1xuICBESUFMT0dfVVBfQ0FMTCA9ICdkaWFsb2dVcENhbGwnLFxuICAvKipcbiAgICog5a+56K+d5pWw5o2u5LiL6KGMXG4gICAqL1xuICBESUFMT0dfRE9XTl9DQUxMID0gJ2RpYWxvZ0Rvd25DYWxsJyxcbiAgLyoqXG4gICAqIOiOt+WPlueUqOaIt+S8muivneaVsOaNruWIl+ihqFxuICAgKi9cbiAgR0VUX0NBTExfVVNFUl9TRVNTSU9OX0xJU1QgPSAnZ2V0Q2FsbFVTZXJTZXNzaW9uTGlzdCcsXG4gIC8qKlxuICAgKiDml6Xlv5forrDlvZXlkIzmraVcbiAgICovXG4gIFNZTkNfQ0FMTF9MT0cgPSAnc3luY0NhbGxMb2cnLFxuICAvKipcbiAgICog5pel5b+X6K6w5b2V5LiL5Y+RXG4gICAqL1xuICBQVUJfQ0FMTF9MT0cgPSAncHViQ2FsbExvZycsXG4gIC8qKlxuICAgKiDmibnph4/liKDpmaTpgJror53orrDlvZVcbiAgICovXG4gIERFTF9DQUxMX0xPRyA9ICdkZWxldGVDYWxsTG9nJyxcbiAgLyoqXG4gICAqIOafpeivouW9k+WJjeeUqOaIt+W3suacieeahCBjYWxsIOeKtuaAgVxuICAgKi9cbiAgUVJZX0NBTExfU1RBVEUgPSAncXVlcnlVc2VySGFzQ2FsbCcsXG4gIC8qKlxuICAgKiDmn6Xor6IgY2FsbFNlcnZlciDlvZPliY3ml7bpl7TmiLNcbiAgICovXG4gIFFSWV9TUlZfVElNRVNUQU1QID0gJ2dldENhbGxTcnZUaW1lU3RhbXAnLFxuICAvKipcbiAgICog6I635Y+W5b2T5YmN55So5oi36L+b6KGM55qEIGNhbGwg5YiX6KGoXG4gICAqL1xuICBHRVRfQ0FMTF9TVEFURV9MSVNUID0gJ2dldFVzZXJDYWxsU3RhdGVMaXN0JyxcbiAgLyoqXG4gICAqIOa4hemZpOW9k+WJjeeUqOaIt+mAmuivneiusOW9lVxuICAgKi9cbiAgQ0xFQVJfQ0FMTF9MT0cgPSAnY2xlYW5DYWxsTG9nJyxcbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIOS8muivneS/oeaBr1xuICAgKi9cbiAgR0VUX0NBTExfU0VTU0lPTiA9ICdnZXRDYWxsU2Vzc2lvbicsXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCDml7bpl7Tkv6Hmga9cbiAgICovXG4gIEdFVF9DQUxMX1RJTUVfSU5GTyA9ICdnZXRDYWxsVGltZUluZm8nLFxuICAvKipcbiAgICog57uT5p2f5b2T5YmN55So5oi35byC5bi455qEY2FsbFNlc3Npb24o5YyF5ZCr5ZCE5Liq6Zi25q61Ke+8jOS4u+imgeeUqOS6juW6lOeUqOW8guW4uOmAgOWHuuWGjeWQr+WKqOOAgeWQhOenjemAmuivneW8guW4uOW9k+S4reOAgumFjOaDheiwg+eUqFxuICAgKi9cbiAgRU5EX0FCTk9STUFMX0NBTEwgPSAnZW5kVXNlckFibm9ybWFsQ2FsbHMnLFxuICAvKipcbiAgICog55So5oi357O757uf54q25oCB5LiK5oqlXG4gICAqL1xuICBTWVNfU1RBVFVTX1VQID0gJ3N5c1N0YXR1c1VwJyxcbiAgLyoqXG4gICAqIOS4iuaKpemAmuivneiusOW9leW3suivu+eKtuaAgVxuICAgKi9cbiAgVVBfQ0FMTF9MT0dfUkVBREVEID0gJ3VwQ2FsbExvZ1JlYWRlZCcsXG4gIC8qKlxuICAgKiDkuIvlj5HpgJror53orrDlvZXlt7Lor7vnirbmgIFcbiAgICovXG4gIFBVQl9DQUxMX0xPR19SRUFERUQgPSAncHViQ2FsbExvZ1JlYWRlZCcsXG4gIC8qKlxuICAgKiDkuIvlj5HkuIvooYzkv6Hku6TmlbDmja7luo/lj7dJZCDvvIjlvLHnvZHooaXlgb/mlrnms5XvvIznp7vliqjnq6/lt7Llrp7njrDvvIxQQyDmnKrlrp7njrDvvIlcbiAgICovXG4gIFBVQl9OQUNLX1NFUV9JRCA9ICdwdWJOQUNLU2VxSWQnLFxuICAvKipcbiAgICog5p+l6K+i5b2T5YmN55So5oi35Y+C5LiO55qE5pyq57uT5p2f55qEY2FsbFNlc3Npb27nmoRDYWxsSWTliJfooajvvIxncm91cOS4k+eUqO+8jOWPr+WcqGdyb3VwY2FsbOe7k+adn+aXtu+8jOihpeWBv+WQhOerr+eahOW/q+aNt+WFpeWPo+aYr+WQpua2iOWkseeahOWIpOaWrVxuICAgKi9cbiAgR0VUX1VTRVJfQ0FMTF9TRVNTSU9OX0lEX0xJU1QgPSAnZ2V0VXNlckNhbGxTZXNzaW9uSWRMaXN0J1xufVxuIiwiZXhwb3J0IGNvbnN0IHRpbWVyU2V0VGltZW91dCA9IChmdW5jOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKTogbnVtYmVyID0+IHNldFRpbWVvdXQoZnVuYywgdGltZW91dCkgYXMgbnVtYmVyO1xuXG5leHBvcnQgY29uc3QgdGltZXJJbnRlcnZhbCA9IChmdW46IEZ1bmN0aW9uLCBpdHY6IG51bWJlcik6IG51bWJlciA9PiBzZXRJbnRlcnZhbChmdW4sIGl0dikgYXMgbnVtYmVyO1xuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobWlsbGlzZWNvbmQ6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZCk7XG59KTtcbiIsImltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDUlRDQ29kZSB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQgeyBDYWxsU2VydmVyRXJyb3JDb2RlIH0gZnJvbSAnLi4vZW51bXMvQ2FsbFNlcnZlckVycm9yQ29kZSc7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdGltZXJzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcblxuZXhwb3J0IHR5cGUgVFJldHJ5RXJyb3JDb2RlID0gQ2FsbFNlcnZlckVycm9yQ29kZSB8IFJDUlRDQ29kZSB8IG51bWJlciB8IEVycm9yQ29kZVxuZXhwb3J0IGludGVyZmFjZSByZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICog6KaB6YeN6K+V55qE5byC5q2l5Ye95pWwXG4gICAqL1xuICBhc3luY0ZuOiBGdW5jdGlvbjtcbiAgLyoqXG4gICAqIOWHveaVsOeahOWPguaVsFxuICAgKi9cbiAgZm5BcmdzOiBhbnlbXTtcbiAgLyoqXG4gICAqIOW9k+WJjemHjeivleaXtumXtOaIs1xuICAgKi9cbiAgY3VycmVudFJldHJ5VGltZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIOacgOWkp+mHjeivleaXtumVv1xuICAgKi9cbiAgbWF4RHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmoq/luqbph43or5Xpl7TpmpRcbiAgICovXG4gIGludGVydmFscz86IG51bWJlcltdO1xuICAvKipcbiAgICog5qKv5bqm6YeN6K+V6Ze06ZqU5pWw57uE5LiL5qCHXG4gICAqL1xuICBpbmRleD86IG51bWJlcjtcbiAgLyoqXG4gICAqIOmHjeivleWksei0peeahOWbnuiwg1xuICAgKi9cbiAgb25FcnJvcj86IChjb2RlOiBUUmV0cnlFcnJvckNvZGUpID0+IHZvaWRcbn1cblxuY29uc3QgbmVlZFJldHJ5Q29kZTogVFJldHJ5RXJyb3JDb2RlW10gPSBbXG4gIC8qKlxuICAgKiBJTSDlupXlsYLov5Tlm57pnIDopoHph43or5XnmoTplJnor6/noIFcbiAgICovXG4gIEVycm9yQ29kZS5SQ19ORVRfQ0hBTk5FTF9JTlZBTElELFxuICBFcnJvckNvZGUuUkNfTkVUX1VOQVZBSUxBQkxFLFxuICBFcnJvckNvZGUuUkNfTVNHX1JFU1BfVElNRU9VVCxcbiAgLyoqXG4gICAqIFJUQyDov5Tlm57pnIDopoHph43or5XnmoTplJnor6/noIFcbiAgICovXG4gIFJDUlRDQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVELFxuICBSQ1JUQ0NvZGUuUkVRVUVTVF9GQUlMRUQsXG5cbl07XG5cbi8qKlxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5hc3luY0ZuIOimgemHjeivleeahOW8guatpeWHveaVsFxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5mbkFyZ3Mg5Ye95pWw55qE5Y+C5pWwXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLmN1cnJlbnRSZXRyeVRpbWUg5b2T5YmN6YeN6K+V5pe26Ze05oizXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLm1heER1cmF0aW9uIOacgOWkp+mHjeivleaXtumVv1xuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5pbnRlcnZhbHMg5qKv5bqm6YeN6K+V6Ze06ZqUXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLmluZGV4IOair+W6pumHjeivlemXtOmalOaVsOe7hOS4i+agh1xuICovXG5leHBvcnQgY29uc3QgcmV0cnlBc3luY0ZuID0gYXN5bmMgPFIgZXh0ZW5kcyB7Y29kZTogVFJldHJ5RXJyb3JDb2RlfT4gKHtcbiAgYXN5bmNGbixcbiAgZm5BcmdzLFxuICBjdXJyZW50UmV0cnlUaW1lID0gRGF0ZS5ub3coKSxcbiAgbWF4RHVyYXRpb24gPSA2MCAqIDEwMDAsXG4gIGludGVydmFscyA9IFsyICogMTAwMCwgNCAqIDEwMDAsIDggKiAxMDAwLCAxNiAqIDEwMDAsIDMyICogMTAwMCwgNjQgKiAxMDAwXSxcbiAgaW5kZXggPSAwLFxuICBvbkVycm9yLFxufTogcmV0cnlPcHRpb25zKTogUHJvbWlzZTxSPiA9PiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGFzeW5jRm4oLi4uZm5BcmdzKTtcbiAgLy8gY29uc3QgaXR2ID0gaW50ZXJ2YWxzW2luZGV4XSB8fCBpbnRlcnZhbHNbaW50ZXJ2YWxzLmxlbmd0aCAtIDFdXG4gIC8vIGluZGV4KytcbiAgLy8gaXR2IOWGmeatuyAyMDAwIG1zICzlkI7nu63pnIDopoHlho3mlL7lvIDmoq/luqbph43or5VcbiAgY29uc3QgaXR2ID0gMiAqIDEwMDA7XG4gIGNvbnN0IGlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSA9IChyZXMuY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTU1xuICAgIHx8ICFuZWVkUmV0cnlDb2RlLmluY2x1ZGVzKHJlcy5jb2RlKSlcbiAgICB8fCAoKERhdGUubm93KCkgKyBpdHYgLSBjdXJyZW50UmV0cnlUaW1lKSA+IG1heER1cmF0aW9uKTtcblxuICBpZiAoIWlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSkge1xuICAgIG9uRXJyb3IgJiYgb25FcnJvcihyZXMuY29kZSk7XG4gICAgYXdhaXQgc2xlZXAoaXR2KTtcbiAgICByZXR1cm4gcmV0cnlBc3luY0ZuKHtcbiAgICAgIGFzeW5jRm4sXG4gICAgICBmbkFyZ3MsXG4gICAgICBjdXJyZW50UmV0cnlUaW1lLFxuICAgICAgbWF4RHVyYXRpb24sXG4gICAgICBpbnRlcnZhbHMsXG4gICAgICBpbmRleCxcbiAgICAgIG9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgcmV0cnlCeVRpbWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIOimgemHjeivleeahOW8guatpeWHveaVsFxuICAgKi9cbiAgYXN5bmNGbjogRnVuY3Rpb247XG4gIC8qKlxuICAgKiDlh73mlbDnmoTlj4LmlbBcbiAgICovXG4gIGZuQXJnczogYW55W107XG4gIC8qKlxuICAgKiDlvZPliY3ph43or5Xml7bpl7TmiLNcbiAgICovXG4gIGN1cnJlbnRSZXRyeVRpbWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmnIDlpKfph43or5XmrKHmlbAsIOm7mOiupCAyIOasoVxuICAgKi9cbiAgbWF4UmV0cnlUaW1lPzogbnVtYmVyO1xuICAvKipcbiAgICog6YeN6K+V5aSx6LSl55qE5Zue6LCDXG4gICAqL1xuICBvbkVycm9yPzogKGNvZGU6IFRSZXRyeUVycm9yQ29kZSkgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgcmV0cnlBc255Y0ZuQnlUaW1lID0gYXN5bmMgPFIgZXh0ZW5kcyB7Y29kZTogVFJldHJ5RXJyb3JDb2RlfT4gKHtcbiAgYXN5bmNGbixcbiAgZm5BcmdzLFxuICBjdXJyZW50UmV0cnlUaW1lID0gMCxcbiAgbWF4UmV0cnlUaW1lID0gMixcbiAgb25FcnJvcixcbn06IHJldHJ5QnlUaW1lT3B0aW9ucyk6IFByb21pc2U8Uj4gPT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBhc3luY0ZuKC4uLmZuQXJncyk7XG4gIGNvbnN0IGl0diA9IDIgKiAxMDAwO1xuICBjdXJyZW50UmV0cnlUaW1lKys7XG4gIGNvbnN0IGlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSA9IChyZXMuY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTU1xuICAgIHx8ICFuZWVkUmV0cnlDb2RlLmluY2x1ZGVzKHJlcy5jb2RlKSkgfHwgY3VycmVudFJldHJ5VGltZSA+IG1heFJldHJ5VGltZTtcblxuICBpZiAoIWlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSkge1xuICAgIG9uRXJyb3IgJiYgb25FcnJvcihyZXMuY29kZSk7XG4gICAgYXdhaXQgc2xlZXAoaXR2KTtcbiAgICByZXR1cm4gcmV0cnlBc255Y0ZuQnlUaW1lKHtcbiAgICAgIGFzeW5jRm4sXG4gICAgICBmbkFyZ3MsXG4gICAgICBjdXJyZW50UmV0cnlUaW1lLFxuICAgICAgbWF4UmV0cnlUaW1lLFxuICAgICAgb25FcnJvcixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbiIsImltcG9ydCB7IElQdWJJbnZpdGVDb24gfSBmcm9tICcuL0lTaWduYWxUcmFuc3BvcnRlcic7XG5cbmV4cG9ydCBlbnVtIENhbGxIb29rc1R5cGUge1xuICBvbkJlZm9yZVB1Ymxpc2ggPSAnb25CZWZvcmVQdWJsaXNoJyxcbiAgb25QdWJsaXNoUmVzID0gJ29uUHVibGlzaFJlcycsXG4gIG9uUHViSW52aXRlQ2FsbCA9ICdvblB1Ykludml0ZUNhbGwnLFxuICBvblB1Ykludml0ZUNhbGxQdWxsS3YgPSAnb25QdWJJbnZpdGVDYWxsUHVsbEt2JyxcbiAgb25QdWJJbnZpdGVDYWxsTWlzcyA9ICdvblB1Ykludml0ZUNhbGxNaXNzJ1xufVxuXG5leHBvcnQgZW51bSBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbiB7XG4gIE5PVF9DVVJSRU5UX0RFVklDRUlEID0gJ25vdCBjdXJyZW50IGRldmljZSBpZCcsXG4gIFNFQ1JFVF9DQUxMID0gJ3NlY3JldCBjYWxsJyxcbiAgTk9UX0lOVklURUUgPSAnbm90IGFuIGludml0ZWUnXG59XG5cbmV4cG9ydCBlbnVtIFB1Ykludml0ZUNhbGxNaXNzUmVmZXIge1xuICBQVUJfSU5WSVRFID0gJ3B1Ymludml0ZWNhbGwnLFxuICBQVUxMX0tWX0lOVklURSA9ICdwdWxsa3ZfaW52aXRlY2FsbCcsXG4gIFBVU0ggPSAnc3lzdGVtX3B1YnNoJ1xufVxuXG5leHBvcnQgdHlwZSBJUHViSW52aXRlQ2FsbEluZm8gPSBJUHViSW52aXRlQ29uICYgeyBleHRyYTogc3RyaW5nfVxuXG5leHBvcnQgdHlwZSBJUHViSW52aXRlQ2FsbE1pc3NJbmZvID0gSVB1Ykludml0ZUNvbiAmIHsgZXh0cmE6IHN0cmluZywgcmVhc29uOiBzdHJpbmcsIHJlZmVyOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyfVxuIiwiaW1wb3J0IHtcbiAgQmFzaWNMb2dnZXIsIEVycm9yQ29kZSwgRXZlbnRFbWl0dGVyLCBnZXRVVUlEMjIsIElSdW50aW1lLCBpc051bGwsIGlzU3RyaW5nLCBsb2dnZXIsIFBsdWdpbkNvbnRleHQsIFJDQ29ubmVjdGlvblN0YXR1cyxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckFjdGlvbiB9IGZyb20gJy4uL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24nO1xuaW1wb3J0IHtcbiAgSUFjY2VwdENhbGxDb24sXG4gIElCYXNlU2luZ2FsQ29uLFxuICBJQ2xlYXJDYWxsTG9nUmVzLFxuICBJQ29ucGVuc2F0aW9uRGF0YSxcbiAgSURpYWxvZ0Rvd25DYWxsQ29uLFxuICBJRGlhbG9nVXBDYWxsQ29uLFxuICBJRXZlbnREb3duQ2FsbENvbixcbiAgSUV2ZW50VXBDYWxsQ29uLFxuICBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXMsXG4gIElHZXRDYWxsVGltZUluZm9SZXMsXG4gIElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlcyxcbiAgSUhhbmd1cENhbGxDb24sXG4gIElJbnZpdGVDYWxsQ29uLFxuICBJSW52aXRlQ2FsbFJlcyxcbiAgSUpvaW5DYWxsQ29uLFxuICBJUHViQ2FsbExvZyxcbiAgSVB1Ykludml0ZUNvbixcbiAgSVFyeVVzZXJIYXNDYWxsUmVzLFxuICBJUmluZ2luZ0NhbGxDb24sXG4gIElTaWduYWxUcmFuc3BvcnRlckxpc3RlbmVyLFxuICBJU3RhcnRDYWxsQ29uLFxuICBJU3RhcnRDYWxsUmVzLFxuICBJU3RhcnRHcm91cENvbixcbiAgSVN0YXJ0U2luZ2xlQ29uLFxuICBJU3RhdHVzRG93bkNvbnQsXG4gIElTdGF0dXNVcENvbixcbiAgSVN5bmNDYWxsTG9nQ29uLFxuICBJU3luY0NhbGxMb2dSZXNMaXN0LFxuICBJU3lzU3RhdHVzVXBPcHRzLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBEaWFsb2dUeXBlIH0gZnJvbSAnLi4vZW51bXMvRGlhbG9nVHlwZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lJbmRleCc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25Vc2VyU3RhdGUnO1xuaW1wb3J0IHsgVGltZUNvcnJlY3Rpb25lciB9IGZyb20gJy4vVGltZUNvcnJlY3Rpb25lcic7XG5pbXBvcnQgeyByZXRyeUFzeW5jRm4gfSBmcm9tICcuLi91dGlscy9yZXRyeSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHtcbiAgQ2FsbEhvb2tzVHlwZSwgUHViSW52aXRlQ2FsbE1pc3NSZWFzb24sIFB1Ykludml0ZUNhbGxNaXNzUmVmZXIsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSUNhbGxIb29rcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgY2xhc3MgU2lnbmFsVHJhbnNwb3J0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICog55uR5ZCs5a+56LGhXG4gICAqL1xuICBfbGlzdGVuZXIhOiBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lclxuXG4gIC8qKlxuICAgKiDpnIDopoHph43or5XnmoQgYWN0aW9uXG4gICAqL1xuICBfbmVlZFJldHJ5QWN0aW9uczogQ2FsbFNlcnZlckFjdGlvbltdID0gW1xuICAgIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfU0lOR0xFX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5TVEFSVF9HUk9VUF9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uQUNDRVBUX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5KT0lOX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5FVkVOVF9VUF9DQUxMLFxuICBdXG5cbiAgX3Nlc3Npb25JZDogc3RyaW5nID0gJydcblxuICAvKipcbiAgICogY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aW1lQ29ycmVjdGlvbmVyOiBUaW1lQ29ycmVjdGlvbmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29udGV4dC5vbkNhbGxJbmZvID0gdGhpcy5fb25SZWN2Q2FsbFNpZ25hbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2NvbnRleHQub25jb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSB0aGlzLl9vbklNQ29ubmVjdGlvblN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2Vzc2lvbklkID0gZ2V0VVVJRDIyKCk7XG4gIH1cblxuICBnZXRTZXNzaW9uSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JZDtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyOiBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lcikge1xuICAgIHRoaXMuX2xpc3RlbmVyID0gbGlzdGVuZXI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnRDYWxsKG1zZzogSVN0YXJ0Q2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc30+IHtcbiAgICBjb25zdCB7XG4gICAgICBjbGllbnRDYWxsSWQsIGNhbGxUeXBlLCB0b1VzZXJzLCBtZWRpYVR5cGUsIHNlY3JldENoYXQsIHRhcmdldFR5cGUsIHRhcmdldElkLCBuaWNrTmFtZSwgb2xkUm9vbUlkLFxuICAgIH0gPSBtc2c7XG4gICAgaWYgKGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXJ0U2luZ2xlQ2FsbCh7XG4gICAgICAgIGNsaWVudENhbGxJZCxcbiAgICAgICAgdG9Vc2VySWQ6IHRvVXNlcnNbMF0udXNlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHNlY3JldENoYXQsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBvbGRSb29tSWQsXG4gICAgICAgIHRvT3JnSWQ6IHRvVXNlcnNbMF0ub3JnSWQgfHwgJycsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRHcm91cENhbGwoe1xuICAgICAgY2xpZW50Q2FsbElkLFxuICAgICAgdG9Vc2VycyxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG5pY2tOYW1lLFxuICAgICAgb2xkUm9vbUlkLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0U2luZ2xlQ2FsbChtc2c6IElTdGFydFNpbmdsZUNvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1NJTkdMRV9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN0YXJ0U2luZ2xlQ29uLCBJU3RhcnRDYWxsUmVzPih0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX1NJTkdMRV9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0R3JvdXBDYWxsKG1zZzogSVN0YXJ0R3JvdXBDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HUk9VUF9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN0YXJ0R3JvdXBDb24sIElTdGFydENhbGxSZXM+KHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfR1JPVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbnZpdGVDYWxsKG1zZzogSUludml0ZUNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElJbnZpdGVDYWxsUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSU5WSVRFX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUludml0ZUNhbGxDb24sIElJbnZpdGVDYWxsUmVzPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLklOVklURV9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJpbmdpbmdDYWxsKG1zZzogSVJpbmdpbmdDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SSU5HX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVJpbmdpbmdDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uUklOR0lOR19DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFjY2VwdENhbGwobXNnOiBJQWNjZXB0Q2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQUNDRVBUX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUFjY2VwdENhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5BQ0NFUFRfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBqb2luQ2FsbChtc2c6IElKb2luQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSk9JTl9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUpvaW5DYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uSk9JTl9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmd1cENhbGwobXNnOiBJSGFuZ3VwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSEFOR1VQX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NlbmRDYWxsU2lnbmFsPElIYW5ndXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uSEFOR1VQX0NBTEwsIG1zZyk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMKSB7XG4gICAgICAvLyDlrZjlnKjljZXlkbwgQSDmjILmlq3lkI7nm7TmjqXouKLlh7ogQu+8jENhbGxTZXJ2ZXIg5bey56e76ZmkIGNhbGwsIEIg5ZCO5YiwIENhbGxTZXJ2ZXIg55qEIGhhbmd1cCDkvJrovazkuLogQ2FsbFNlcnZlckVycm9yQ29kZS5DQUxMX05PVF9FWElTVO+8jOaVheW/veeVpVxuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhdHVzVXBDYWxsKG1zZzogSVN0YXR1c1VwQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX1NUQVRVU19VUF9ULCBgY2FsbCBzdGF0dXMgdXAgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGF0dXNVcENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlNUQVRVU19VUF9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV2ZW50VXBDYWxsKG1zZzogSUV2ZW50VXBDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0VWRU5UX1VQX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUV2ZW50VXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uRVZFTlRfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaWFsb2dVcENhbGwobXNnOiBJRGlhbG9nVXBDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0RJQUxPR19VUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElEaWFsb2dVcENhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5ESUFMT0dfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGVDYWxsUmVjb3JkKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0RFTEVURV9DQUxMX1JFQ09SRF9ULCBgY2FsbElkczogJHtKU09OLnN0cmluZ2lmeShjYWxsSWRzKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8e2NhbGxJZHM6IHN0cmluZ1tdfSwgdW5kZWZpbmVkPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uREVMX0NBTExfTE9HLCB7XG4gICAgICBjYWxsSWRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN5bmNDYWxsTG9nKG1zZzogSVN5bmNDYWxsTG9nQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJU3luY0NhbGxMb2dSZXNMaXN0fT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfUkVDT1JEX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN5bmNDYWxsTG9nQ29uLCBJU3luY0NhbGxMb2dSZXNMaXN0Pihtc2cudXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlNZTkNfQ0FMTF9MT0csIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcXVlcnlVc2VySGFzQ2FsbCgpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUXJ5VXNlckhhc0NhbGxSZXN9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8bnVsbCwgSVFyeVVzZXJIYXNDYWxsUmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uUVJZX0NBTExfU1RBVEUsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXJ2ZXJUaW1lc3RhbXAodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogeyBzeW5jVGltZTogbnVtYmVyfX0+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfU0VSVkVSX1RJTUVfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIHsgc3luY1RpbWU6IG51bWJlcn0+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5RUllfU1JWX1RJTUVTVEFNUCwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFRpbWVJbmZvUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfVElNRV9JTkZPX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDx7IGNhbGxJZDogc3RyaW5nfSwgSUdldENhbGxUaW1lSW5mb1Jlcz4oY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1RJTUVfSU5GTywgeyBjYWxsSWQgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VXNlckNhbGxTdGF0ZUxpc3QodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldFVzZXJDYWxsU3RhdGVMaXN0UmVzfT4ge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQVZBSUxBQkxFX0NBTExfTElTVF9ULCBgdXNlcklkOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8bnVsbCwgSUdldFVzZXJDYWxsU3RhdGVMaXN0UmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uR0VUX0NBTExfU1RBVEVfTElTVCwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYXJDYWxsUmVjb3JkKHRyYWNlSWQ6IHN0cmluZyk6UHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUNsZWFyQ2FsbExvZ1Jlc30+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0xFQVJfQ0FMTF9SRUNPUkRfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElDbGVhckNhbGxMb2dSZXM+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5DTEVBUl9DQUxMX0xPRywgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlc3Npb24ob3B0czogSUJhc2VTaW5nYWxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRDYWxsU2Vzc2lvblNlcnZlclJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX0lORk9fQllfQ0FMTElEX1QsIGBjYWxsSWQ6ICR7b3B0cy5jYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElCYXNlU2luZ2FsQ29uLCBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXM+KG9wdHMuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1NFU1NJT04sIG9wdHMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN5c1N0YXR1c1VwKG9wdHM6IElTeXNTdGF0dXNVcE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1VTRVJfU1lTVEVNX1NUQVRFX1VQX1QsIGBvcHRzOiAke0pTT04uc3RyaW5naWZ5KG9wdHMpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJU3lzU3RhdHVzVXBPcHRzLCB1bmRlZmluZWQ+KG9wdHMuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlNZU19TVEFUVVNfVVAsIG9wdHMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwQ2FsbExvZ1JlYWRlZChvcHRzOiBJQmFzZVNpbmdhbENvbik6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJQmFzZVNpbmdhbENvbiwgdW5kZWZpbmVkPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uVVBfQ0FMTF9MT0dfUkVBREVELCBvcHRzKTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgcHJpdmF0ZSBfb25JTUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZTogUkNDb25uZWN0aW9uU3RhdHVzKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9JTV9TVEFURV9DSEFOR0VfTywgYHN0YXRlOiAke3N0YXRlfWAsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbGlzdGVuZXIub25JTVN0YXRlQ2hhbmdlKHN0YXRlKTtcbiAgICAvKipcbiAgICAgKiDov57mjqXmiJDlip/lkI7lkK/liqjml7bpl7TmoKHmraPlmahcbiAgICAgKi9cbiAgICBpZiAoc3RhdGUgPT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuc3RhcnQodHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuc3RvcCh0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2FsbCDkv6Hku6Tlj5HpgIFcbiAgICogQHBhcmFtIHRhcmdldElkIOiOt+WPliBjYWxsIGxvZyAoc3luY0NhbGxMb2cpIOaXtuS8oCB1c2VySWQsIOWFtuS7liBhY3Rpb24g5LygIGNhbGxJZFxuICAgKiBAcGFyYW0ga2V5IGNhbGwgc2VydmVyIOWumuS5iSBhY3Rpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgYWN0aW9uIOaQuuW4puWPguaVsO+8jOaXoOWPguaVsOS8oOepuuWtl+espuS4slxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VuZENhbGxTaWduYWwgPFQsIFI+KHRhcmdldElkOiBzdHJpbmcsIGtleTogQ2FsbFNlcnZlckFjdGlvbiwgb3B0aW9uczogVCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IFJ9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zID8gSlNPTi5zdHJpbmdpZnkoeyAuLi5vcHRpb25zLCAuLi57IHNlc3Npb25JZDogdGhpcy5fc2Vzc2lvbklkIH0gfSkgOiAnJztcblxuICAgIGxldCByZXN1bHQ6IHtkYXRhPzogeyBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZ30gfCB1bmRlZmluZWQsIGNvZGU6IEVycm9yQ29kZX07XG4gICAgaWYgKHRoaXMuX25lZWRSZXRyeUFjdGlvbnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcmV0cnlBc3luY0ZuIDx7ZGF0YT86IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9IHwgdW5kZWZpbmVkLCBjb2RlOiBFcnJvckNvZGV9Pih7XG4gICAgICAgIGFzeW5jRm46IHRoaXMuX2NvbnRleHQuc2V0Q2FsbEluZm8uYmluZCh0aGlzLl9jb250ZXh0KSxcbiAgICAgICAgZm5BcmdzOiBbdGFyZ2V0SWQsIGtleSwgdmFsdWVdLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX2NvbnRleHQuc2V0Q2FsbEluZm8odGFyZ2V0SWQsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IHJlc3VsdDtcbiAgICBpZiAoY29kZSAhPT0gRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgY29uc3QgeyBrZXk6IHNlcnZlcktleSwgdmFsdWU6IHNlcnZlclZhbCB9ID0gZGF0YSE7XG4gICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2Uoc2VydmVyVmFsKS5kYXRhIGFzIFI7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkYXRhOiBwYXJzZWREYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogY2FsbCDkv6Hku6TmjqXmlLZcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdkNhbGxTaWduYWwoZGF0YTogc3RyaW5nKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU0lHTkFMX0RBVEFfTywgYGRhdGE6ICR7ZGF0YX1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IGRhdGFMaXN0ID0gSlNPTi5wYXJzZShkYXRhKS5saXN0IGFzIHtba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdO1xuICAgIGRhdGFMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsga2V5IH0gPSBpdGVtO1xuICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UoaXRlbS52YWx1ZSk7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX0lOVklURV9DQUxMOlxuICAgICAgICAgIHRoaXMuX29uUHViSW52aXRlQ2FsbChpbmZvIGFzIElQdWJJbnZpdGVDb24sIHRydWUsIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uU1RBVFVTX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vblN0YXR1c0Rvd25DYWxsKGluZm8gYXMgSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLkVWRU5UX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vbkV2ZW50RG93bkNhbGwoaW5mbyBhcyBJRXZlbnREb3duQ2FsbENvbiwgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5ESUFMT0dfRE9XTl9DQUxMOlxuICAgICAgICAgIHRoaXMuX29uRGlhbG9nRG93bkNhbGwoaW5mbyBhcyBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX0NBTExfTE9HOlxuICAgICAgICAgIHRoaXMuX29uUHViQ2FsbExvZyhpbmZvIGFzIElQdWJDYWxsTG9nLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9DQUxMX0xPR19SRUFERUQ6XG4gICAgICAgICAgLy8gcGFzcyDmmoLmnKrnlKjliLBcbiAgICAgICAgICAvLyB0aGlzLl9vblB1YkNhbGxMb2dSZWFkZWQoaW5mbyBhcyBJUHViQ2FsbExvZ1JlYWRlZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5QVUJfTkFDS19TRVFfSUQ6XG4gICAgICAgICAgLy8gVE9ETyBjYWxsIOW8see9keihpeWBv+aWueahiOa2ieWPiuaWueazle+8jFBDIOacquWBmu+8jOatpOWkhOmYsuatoui1sOWIsCBkZWZhdWx0XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5fb25Db25wZW5zYXRpb25EYXRhKGluZm8gYXMgSUNvbnBlbnNhdGlvbkRhdGEsIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBkZXZpY2VJZCDliKTmlq3mlbDmja7mmK/lkKblupTor6XkuIvlj5FcbiAgICogZGV2aWNlSWQg5Li656m65a2X56ym5Liy5oiWIG51bGwg55u05o6l5LiL5Y+RXG4gICAqIGRldmljZUlkIOacieWFt+S9k+eahOWAvO+8jOagueaNriBkZXZpY2VJZCDliKTmlq3mmK/lkKbmmK/lt7Hnq6/nmoQgZGV2aWNlSWRcbiAgICovXG4gIHByaXZhdGUgX2lzVmFsaWREYXRhKGRldmljZUlkOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzTnVsbChkZXZpY2VJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpbmcoZGV2aWNlSWQpICYmIChkZXZpY2VJZD8ubGVuZ3RoID09PSAwIHx8IGRldmljZUlkID09PSB0aGlzLl9zZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmCgOivt1xuICAgKiBAcGFyYW0gaXNEaXJlY3RseSDmmK/lkKbkuLrnm7Tlj5Hkv6Hku6RcbiAgICovXG4gIHByaXZhdGUgX29uUHViSW52aXRlQ2FsbChkYXRhOiBJUHViSW52aXRlQ29uLCBpc0RpcmVjdGx5ID0gdHJ1ZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVSWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgICAgY29uc3QgY3VycmVudFVzZXIgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVSWQpO1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYGN1cnJlbnRVc2VyOiAke0pTT04uc3RyaW5naWZ5KGN1cnJlbnRVc2VyKX0sIGN1cnJlbnRVc2VySWQ6ICR7Y3VycmVudFVJZH0sIHN0YXRlOiAke3N0YXRlfWAsIHRyYWNlSWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYGVycm9yOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCwgdHJhY2VJZCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5faXNWYWxpZERhdGEoZGF0YS50b0RldmljZUlkIHx8ICcnKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PLCBgbm90IGN1cnJlbnQgZGV2aWNlSWQgLT4gZGV2aWNlSW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRvRGV2aWNlSWQ6IGRhdGEudG9EZXZpY2VJZCxcbiAgICAgICAgY2xpZW50RGV2aWNlSWQ6IHRoaXMuX3Nlc3Npb25JZCxcbiAgICAgIH0pfWAsIHRyYWNlSWQpO1xuICAgICAgLy8gQSDlkowgQiDnvqTpgJror53kuK3vvIxBIOWGjemCgOivtyBD77yMQiDlkowgQicg6YO95Lya5Lya5pS25YiwIHB1Ykludml0ZUNhbGwsIEInIOaUtuWIsOeahCBwdWJJbnZpdGVDYWxsIOeahCB0b0RldmljZUlkIOS4jeS4uuiHquW3se+8jOaXoOmcgOWkhOeQhlxuXG4gICAgICAvLyBob29rcyDlm57osIPlpITnkIZcbiAgICAgIGNvbnN0IGluZm8gPSB7XG4gICAgICAgIGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgcmVhc29uOiBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbi5OT1RfQ1VSUkVOVF9ERVZJQ0VJRCxcbiAgICAgICAgcmVmZXI6IGlzRGlyZWN0bHkgPyBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVQl9JTlZJVEUgOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVTExfS1ZfSU5WSVRFLFxuICAgICAgfTtcbiAgICAgIGlmIChpc0RpcmVjdGx5KSB7XG4gICAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbE1pc3MsIE9iamVjdC5hc3NpZ24oZGF0YSwgaW5mbykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJJbnZpdGVDYWxsTWlzcywgT2JqZWN0LmFzc2lnbihkYXRhLCBpbmZvKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdGVuZXIub25JbnZpdGUoZGF0YSwgaXNEaXJlY3RseSwgdHJhY2VJZCk7XG4gICAgaWYgKGlzRGlyZWN0bHkpIHtcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbCwgT2JqZWN0LmFzc2lnbihkYXRhLCB7IGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbFB1bGxLdiwgT2JqZWN0LmFzc2lnbihkYXRhLCB7IGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSB9KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOeKtuaAgeWPmOabtO+8muWTjemTg+OAgeW/meeijOOAgemAmuivneetieW+heOAgeWvueaWueacquaOpeWQrOOAgeW3seaWueacquaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfb25TdGF0dXNEb3duQ2FsbChkYXRhOiBJU3RhdHVzRG93bkNvbnQsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOaVsOaNruS4rei/h+a7pOaOieacquWPmOabtOeahCB1c2VyU2Vzc2lvblxuICAgIGRhdGEuY2FsbFNlc3Npb25Vc2VycyA9IGRhdGEuY2FsbFNlc3Npb25Vc2Vycy5maWx0ZXIoKGl0ZW0pID0+IEJvb2xlYW4oaXRlbS5jaGFuZ2VkKSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TVEFUVVNfTywgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9pc1ZhbGlkRGF0YShkYXRhLnRvRGV2aWNlSWQgfHwgJycpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TVEFUVVNfTywgYG5vdCBjdXJyZW50IGRldmljZUlkIC0+IGRldmljZUluZm86ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0b0RldmljZUlkOiBkYXRhLnRvRGV2aWNlSWQsXG4gICAgICAgIGNsaWVudERldmljZUlkOiB0aGlzLl9zZXNzaW9uSWQsXG4gICAgICB9KX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOS4jeaYr+e7meW9k+WJjeiuvuWkh+S4i+WPkeeahOeKtuaAgeWkhOeQhlxuICAgICAgdGhpcy5fbGlzdGVuZXIub25PdGhlckNsaWVudFN0YXR1c0Rvd24oZGF0YSwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVyLm9uU3RhdHVzRG93bihkYXRhLCB0cmFjZUlkLCB0aGlzLl9zZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmAmuivneS6i+S7tuWPmOabtO+8muaJk+W8gHzlhbPpl60g5pGE5YOP5aS0XG4gICAqL1xuICBwcml2YXRlIF9vbkV2ZW50RG93bkNhbGwoZGF0YTogSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xpc3RlbmVyLm9uRXZlbnREb3duKGRhdGEsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmAmuivneiwg+aVtOS6i+S7tuWPiue7k+aenFxuICAgKiDkuovku7bvvJrlqpLkvZPnsbvlnovliIfmjaJcbiAgICog5Yqo5L2c77ya6K+35rGC44CB5o6l5Y+X44CB5ouS57ud44CB5Y+W5raIXG4gICAqL1xuICBwcml2YXRlIF9vbkRpYWxvZ0Rvd25DYWxsKGRhdGE6IElEaWFsb2dEb3duQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBkaWFsb2dUeXBlLCBhY3Rpb24sIGV4dHJhS2V5VmFsIH0gPSBkYXRhO1xuICAgIHN3aXRjaCAoZGlhbG9nVHlwZSkge1xuICAgICAgY2FzZSBEaWFsb2dUeXBlLlNXSVRDSF9NRURJQV9UWVBFOlxuICAgICAgICB0aGlzLl9saXN0ZW5lci5vblN3aXRjaE1lZGlhVHlwZShkYXRhLCB0cmFjZUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d57uT5p2f5ZCO77yM5pel5b+X5LiL5Y+RXG4gICAqL1xuICBwcml2YXRlIF9vblB1YkNhbGxMb2coZGF0YTogSVB1YkNhbGxMb2csIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NBTExfUkVDT1JEX08sIGBjYWxsIHJlY29yZDogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uUmVjdkNhbGxFbmRMb2coZGF0YSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6KGl5YG/5pWw5o2u5aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vbkNvbnBlbnNhdGlvbkRhdGEoZGF0YTogSUNvbnBlbnNhdGlvbkRhdGEsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NPTVBMRU1FTlRBUllfREFUQV9PLCAnJywgdHJhY2VJZCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBzZWNyZXRDaGF0LCBkdXJhdGlvbiwgY2FsbFN0YXR1cywgY2FsbGluZ1VzZXJJZCwgY2FsbFNlc3Npb25Vc2VycywgdG9EZXZpY2VJZCwgY2FsbERpYWxvZ0VudGl0eXMsXG4gICAgfSA9IGRhdGE7XG5cbiAgICBjb25zdCBpc1B1Ykludml0ZUNhbGxEYXRhID0gY2FsbFNlc3Npb25Vc2Vycy5zb21lKChpdGVtKSA9PiBpdGVtLnNlc3Npb25TdGF0dXMgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQgJiYgaXRlbS51c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpO1xuXG4gICAgaWYgKGlzUHViSW52aXRlQ2FsbERhdGEpIHtcbiAgICAgIHRoaXMuX29uUHViSW52aXRlQ2FsbCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgdG9EZXZpY2VJZCxcbiAgICAgICAgY2FsbFR5cGUsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgaW52aXRlVXNlcklkOiBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzLFxuICAgICAgICBzZWNyZXRDaGF0LFxuICAgICAgfSwgdHJ1ZSwgdHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29uU3RhdHVzRG93bkNhbGwoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHRvRGV2aWNlSWQsXG4gICAgICAgIGNhbGxTdGF0dXMsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzLFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgaWYgKGNhbGxEaWFsb2dFbnRpdHlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNhbGxEaWFsb2dFbnRpdHlzLmZvckVhY2goKGRhdGEpID0+IHRoaXMuX29uRGlhbG9nRG93bkNhbGwoZGF0YSwgdHJhY2VJZCksIHRoaXMpO1xuICAgIH1cbiAgfVxufVxuIiwiY29uc3Qgc3RyaW5nMTB0bzY0ID0gKG51bWJlcjogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gJzAxMjM0NTY3ODlhYmNkZWZnaGlna2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUdLTE1OT1BRUlNUVVZXWFlaKy8nLnNwbGl0KCcnKTtcbiAgY29uc3QgcmFkaXggPSBjaGFycy5sZW5ndGggKyAxO1xuICBsZXQgcXV0aWVudCA9ICtudW1iZXI7XG4gIGNvbnN0IGFyciA9IFtdO1xuICBkbyB7XG4gICAgY29uc3QgbW9kID0gcXV0aWVudCAlIHJhZGl4O1xuICAgIHF1dGllbnQgPSAocXV0aWVudCAtIG1vZCkgLyByYWRpeDtcbiAgICBhcnIudW5zaGlmdChjaGFyc1ttb2RdKTtcbiAgfSB3aGlsZSAocXV0aWVudCk7XG4gIHJldHVybiBhcnIuam9pbignJyk7XG59O1xuXG5jb25zdCBnZXRVVUlEID0gKCkgPT4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xuICBjb25zdCByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDtcbiAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XG4gIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbn0pO1xuXG4vKiDojrflj5YgMjIg5L2N55qEIFVVSUQgKi9cbmV4cG9ydCBjb25zdCBnZXRVVUlEMjIgPSAoKSA9PiB7XG4gIGxldCB1dWlkOiBzdHJpbmcgfCBudW1iZXIgPSBnZXRVVUlEKCk7XG4gIHV1aWQgPSBgJHt1dWlkLnJlcGxhY2UoLy0vZywgJycpfTBgO1xuICB1dWlkID0gcGFyc2VJbnQodXVpZCwgMTYpO1xuICB1dWlkID0gc3RyaW5nMTB0bzY0KHV1aWQpO1xuICBpZiAodXVpZC5sZW5ndGggPiAyMikge1xuICAgIHV1aWQgPSB1dWlkLnNsaWNlKDAsIDIyKTtcbiAgfVxuICByZXR1cm4gdXVpZDtcbn07XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcblxuY29uc3QgQ0FMTF9EQl9OQU1FID0gJ1JDX0NBTExQTFVTJztcblxuY29uc3QgREJfVkVSU0lPTiA9IDE7XG5cbmludGVyZmFjZSBJT2JqU3RvcmVQYXJhbXMge1xuICAvKipcbiAgICog5Li76ZSuXG4gICAqL1xuICBrZXlQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICog5aaC5p6c5rKh5pyJ5ZCI6YCC55qE5Li76ZSu77yM5Y+v5Lul6K6+572u5Li6IHRydWUg6Ieq5Yqo55Sf5oiQXG4gICAqL1xuICBhdXRvSW5jcmVtZW50PzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgSUluZGV4REJPcHRzIHtcbiAgb25TdWNjZXNzOiAoKSA9PiB2b2lkO1xuICBvbkVycm9yPzogKCkgPT4gdm9pZDtcbn1cblxubGV0IGxvZ2dlcjogQmFzaWNMb2dnZXI7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxJbmRleERCIHtcbiAgLyoqXG4gICAqIGNhbGwgaW5kZXhEQiDlupNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9kYjogSURCRGF0YWJhc2UgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSQ0NhbGxJbmRleERCIOWunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBSQ0NhbGxJbmRleERCIHwgbnVsbCA9IG51bGxcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGluaXQoX2xvZ2dlcjogQmFzaWNMb2dnZXIsIG9wdHM6IElJbmRleERCT3B0cykge1xuICAgIGxvZ2dlciA9IF9sb2dnZXI7XG4gICAgaWYgKCF0aGlzLmlzU3VwcG9ydCgpKSB7XG4gICAgICBsb2dnZXIuaW5mbygnW1JDQ2FsbEluZGV4REJdJywgJ0luZGV4REIgaXMgbm90IHN1cHBvcnQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXEgPSB3aW5kb3cuaW5kZXhlZERCLm9wZW4oQ0FMTF9EQl9OQU1FLCBEQl9WRVJTSU9OKTtcblxuICAgIHJlcS5vbmVycm9yID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgb3BlbiBpbmRleERCIHJlcSBmYWlsZWQgLT4gJHtldi50YXJnZXQuZXJyb3J9YCk7XG4gICAgfTtcblxuICAgIHJlcS5vbnN1Y2Nlc3MgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgdGhpcy5fZGIgPSBldi50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKHRoaXMuX2RiKSB7XG4gICAgICAgIHRoaXMuX2RiLm9uY2xvc2UgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgVGhlIGRiICR7dGhpcy5fZGIhLm5hbWV9IGhhcyB1bmV4cGVjdGVkbHkgY2xvc2VkLiAke2V2fWApO1xuICAgICAgICAgIHRoaXMudW5Jbml0KCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2RiLm9uZXJyb3IgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgVGhlIGRiICR7dGhpcy5fZGIhLm5hbWV9IGhhcyBvcGVuaW5nIGVycm9yLiAke2V2fWApO1xuICAgICAgICAgIHRoaXMudW5Jbml0KCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2RiLm9uYWJvcnQgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgVGhlIGRiICR7dGhpcy5fZGIhLm5hbWV9IGhhcyBvcGVuaW5nIGFib3J0ZWQuICR7ZXZ9YCk7XG4gICAgICAgICAgdGhpcy51bkluaXQoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFJDQ2FsbEluZGV4REIuX2luc3RhbmNlID0gbmV3IFJDQ2FsbEluZGV4REIoKTtcbiAgICAgIG9wdHMub25TdWNjZXNzKCk7XG4gICAgfTtcblxuICAgIHJlcS5vbnVwZ3JhZGVuZWVkZWQgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgdGhpcy5fZGIgPSBldi50YXJnZXQucmVzdWx0O1xuXG4gICAgICBSQ0NhbGxJbmRleERCLmNyZWF0ZU9ialN0b3JlKCdDYWxsQldfQWJub3JtYWxDYWxsJywgeyBrZXlQYXRoOiAndXNlcklkJyB9KTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHVuSW5pdCgpIHtcbiAgICB0aGlzLl9kYiA9IG51bGw7XG4gICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICB9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKCk6IFJDQ2FsbEluZGV4REIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gIH1cblxuICBzdGF0aWMgaXNTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cgfHwgIXdpbmRvdy5pbmRleGVkREIpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU9ialN0b3JlKG9iak5hbWU6IHN0cmluZywgb3B0czogSU9ialN0b3JlUGFyYW1zKSB7XG4gICAgbGV0IG9ialN0b3JlOiBJREJPYmplY3RTdG9yZTtcbiAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiPy5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKG9iak5hbWUpKSB7XG4gICAgICBvYmpTdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiIS5jcmVhdGVPYmplY3RTdG9yZShvYmpOYW1lLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbUkNDYWxsSW5kZXhEQl0nLCBgY3JlYXRlT2JqU3RvcmUgJHtvYmpOYW1lfSBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb2JqTmFtZSDooajmmI5cbiAgICogQHBhcmFtIHZhbCDopoHmt7vliqDnmoTmlbDmja5cbiAgICovXG4gIHB1YmxpYyBhZGRWYWx1ZSA8VD4ob2JqTmFtZTogc3RyaW5nLCB2YWw6IFQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFSQ0NhbGxJbmRleERCLl9kYikge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSwgJ3JlYWR3cml0ZScpLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuICAgICAgY29uc3QgcmVxID0gc3RvcmUuYWRkKHZhbCk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdbUkNDYWxsSW5kZXhEQl0nLCAnYWRkVmFsdWUgZmFpbGVkJyk7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7kuLvplK7or7vlj5bmlbDmja5cbiAgICogQHBhcmFtIGtleSDkuLvplK5cbiAgICovXG4gIHB1YmxpYyByZWFkQnlLZXkgPFQ+KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSkub2JqZWN0U3RvcmUob2JqTmFtZSk7XG5cbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLmdldChrZXkpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHJlcS5yZXN1bHQpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoZXYpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGByZWFkQnlLZXkgb25lcnJvciAtPiAke2V2fWApO1xuICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7kuLvplK7mm7TmlrDmlbDmja5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVCeUtleSA8VD4ob2JqTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsOiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcblxuICAgICAgY29uc3QgcmVxID0gc3RvcmUucHV0KHZhbCk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9IChldikgPT4ge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGB1cGRhdGVCeUtleSBvbmVycm9yIC0+ICR7ZXZ9YCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUJ5S2V5KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFSQ0NhbGxJbmRleERCLl9kYikge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSwgJ3JlYWR3cml0ZScpLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuXG4gICAgICBjb25zdCByZXEgPSBzdG9yZS5kZWxldGUoa2V5KTtcblxuICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcS5vbmVycm9yID0gKGV2KSA9PiB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYHJlbW92ZUJ5S2V5IG9uZXJyb3IgLT4gJHtldn1gKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBJUnVudGltZSwgSVN0b3JhZ2UgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxJbmRleERCIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXhEQic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9ialN0b3JlIHtbdXNlcklkOiBzdHJpbmddOiBzdHJpbmdbXX1cblxuaW50ZXJmYWNlIElTdG9yZVZhbCB7dXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdfVxuXG4vKipcbiAqIOW8guW4uOe7k+adnyBjYWxsIOWkhOeQhuWtmOWCqOexu1xuICog5Zyo5ZG85Ye65oiW5ZG85YWl6Zi25q6155qEIGNhbGwg6L+b6KGM5pys5Zyw5a2Y5YKo77yM5q2j5bi457uT5p2f5ZCO5riF6ZmkXG4gKiDlvILluLjnu5PmnZ/lkI7vvIzmnKzlnLDlj5bmnKrmuIXpmaTnmoQgY2FsbElkLCDpgJrov4fmnI3liqHmjqXlj6PmuIXpmaTlvILluLjnu5PmnZ/nmoQgY2FsbCAs6Ziy5q2i5peg5rOV5ZG85Ye65oiW5ZG85YWlXG4gKi9cbmV4cG9ydCBjbGFzcyBBYm5vcm1hbENhbGwge1xuICBwcml2YXRlIF9sb2NhbFN0b3JlITogSVN0b3JhZ2VcblxuICBwcml2YXRlIF9pbmRleERCU3RvcmUhOiBSQ0NhbGxJbmRleERCXG5cbiAgcHJpdmF0ZSBfc3RvcmVLZXk6IHN0cmluZyA9ICdDYWxsQldfQWJub3JtYWxDYWxsJ1xuXG4gIHByaXZhdGUgX2lzU3VwcG9ydEluZGV4REI6IGJvb2xlYW5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLl9pc1N1cHBvcnRJbmRleERCID0gUkNDYWxsSW5kZXhEQi5pc1N1cHBvcnQoKTtcbiAgICBpZiAodGhpcy5faXNTdXBwb3J0SW5kZXhEQikge1xuICAgICAgUkNDYWxsSW5kZXhEQi5pbml0KHRoaXMuX2xvZ2dlciwge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUgPSBSQ0NhbGxJbmRleERCLmdldEluc3RhbmNlKCkhO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2xvY2FsU3RvcmUgPSBfcnVudGltZS5sb2NhbFN0b3JhZ2U7XG4gIH1cblxuICAvKipcbiAgICog5re75Yqg5byC5bi4IGNhbGxJZFxuICAgKi9cbiAgcHVibGljIGFkZEFibm9ybWFsbENhbGxJZCh1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhZGRGdW5jID0gdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA/IHRoaXMuX2FkZEJ5SW5kZXhEQiA6IHRoaXMuX2FkZEJ5TG9jYWxTdG9yZTtcbiAgICBhZGRGdW5jLmNhbGwodGhpcywgdXNlcklkLCBjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIoOmZpOW8guW4uCBjYWxsSWRcbiAgICovXG4gIHB1YmxpYyByZW1vdmVBYm5vcm1hbENhbGxJZHModXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcmVtb3ZlRnVuYyA9IHRoaXMuX2lzU3VwcG9ydEluZGV4REIgPyB0aGlzLl9yZW1vdmVCeUluZGV4REIgOiB0aGlzLl9yZW1vdmVCeUxvY2FsU3RvcmU7XG4gICAgcmVtb3ZlRnVuYy5jYWxsKHRoaXMsIHVzZXJJZCwgY2FsbElkcyk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5byC5bi457uT5p2f55qEIGNhbGxJZCDliJfooahcbiAgICovXG4gIHB1YmxpYyBnZXRBYm5vcm1hbENhbGxJZHModXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIGNvbnN0IGdldEZ1bmMgPSB0aGlzLl9pc1N1cHBvcnRJbmRleERCID8gdGhpcy5fZ2V0QnlJbmRleERCIDogdGhpcy5fZ2V0QnlMb2NhbFN0b3JlO1xuICAgIHJldHVybiBnZXRGdW5jLmNhbGwodGhpcywgdXNlcklkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZEJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2JqU3RvcmU6IElPYmpTdG9yZSA9IDxJT2JqU3RvcmU+SlNPTi5wYXJzZSh0aGlzLl9sb2NhbFN0b3JlLmdldEl0ZW0odGhpcy5fc3RvcmVLZXkpIHx8ICd7fScpO1xuICAgICAgbGV0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcy5wdXNoKGNhbGxJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2VyQWJub3JtYWxDYWxsSWRzID0gW2NhbGxJZF07XG4gICAgICB9XG4gICAgICBvYmpTdG9yZVt1c2VySWRdID0gdXNlckFibm9ybWFsQ2FsbElkcztcbiAgICAgIHRoaXMuX2xvY2FsU3RvcmUuc2V0SXRlbSh0aGlzLl9zdG9yZUtleSwgSlNPTi5zdHJpbmdpZnkob2JqU3RvcmUpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfYWRkQnlMb2NhbFN0b3JlIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZUJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2JqU3RvcmU6IElPYmpTdG9yZSA9IDxJT2JqU3RvcmU+SlNPTi5wYXJzZSh0aGlzLl9sb2NhbFN0b3JlLmdldEl0ZW0odGhpcy5fc3RvcmVLZXkpIHx8ICd7fScpO1xuICAgICAgbGV0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcyA9IHVzZXJBYm5vcm1hbENhbGxJZHMuZmlsdGVyKChpZCkgPT4gIWNhbGxJZHMuaW5jbHVkZXMoaWQpKTtcbiAgICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG9ialN0b3JlW3VzZXJJZF0gPSB1c2VyQWJub3JtYWxDYWxsSWRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9jYWxTdG9yZS5zZXRJdGVtKHRoaXMuX3N0b3JlS2V5LCBKU09OLnN0cmluZ2lmeShvYmpTdG9yZSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9yZW1vdmVCeUxvY2FsU3RvcmUgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QnlMb2NhbFN0b3JlKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBsZXQgY2FsbElkcyA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGNvbnN0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgY2FsbElkcyA9IHVzZXJBYm5vcm1hbENhbGxJZHM7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2dldEJ5TG9jYWxTdG9yZSBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjYWxsSWRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2FkZEJ5SW5kZXhEQih1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEuY2FsbElkcy5wdXNoKGNhbGxJZCk7XG4gICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS51cGRhdGVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkLCB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIGNhbGxJZHM6IGRhdGEuY2FsbElkcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUuYWRkVmFsdWUodGhpcy5fc3RvcmVLZXksIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgY2FsbElkczogW2NhbGxJZF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9hZGRCeUluZGV4REIgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVtb3ZlQnlJbmRleERCKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5faW5kZXhEQlN0b3JlLnJlYWRCeUtleTxJU3RvcmVWYWw+KHRoaXMuX3N0b3JlS2V5LCB1c2VySWQpO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZGF0YS5jYWxsSWRzID0gZGF0YS5jYWxsSWRzLmZpbHRlcigoaWQpID0+ICFjYWxsSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgICAgIGlmIChkYXRhLmNhbGxJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS51cGRhdGVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkLCB7XG4gICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICBjYWxsSWRzOiBkYXRhLmNhbGxJZHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlLnJlbW92ZUJ5S2V5KHRoaXMuX3N0b3JlS2V5LCB1c2VySWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX3JlbW92ZUJ5SW5kZXhEQiBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRCeUluZGV4REIodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIGxldCBkYXRhID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfZ2V0QnlJbmRleERCIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGEuY2FsbElkcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIi8qKlxuICog5LqL5Lu257G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIENhbGxTZXJ2ZXJFdmVudFR5cGUge1xuICAvKipcbiAgICog5o+Q56S656qX5Y+jXG4gICAqL1xuICBQUk9NUFQgPSAwLFxuICAvKipcbiAgICogQ2FsbFNlcnZlciDkuIvlj5HpgJror53ml7bplb/lj5jmm7TnsbvlnotcbiAgICovXG4gIENBTExfRFVSQVRJT04gPSAxMCxcbiAgLyoqXG4gICAqIOaUtuWIsOi/nOerr+esrOS4gOW4p+aXtumXtFxuICAgKi9cbiAgRklSU1RfRlJBTUUgPSAyMCxcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNJbm5lckNvZGUge1xuICBTVUNDRVNTID0gMCxcbiAgLyoqXG4gICAqIOaXoOaViOeahOWTjeW6lOaXtumXtO+8iOaOpeWPo+WTjeW6lOaXtumXtOi/h+mVv++8iVxuICAgKi9cbiAgSU5WQUxJRF9SRVNQT05TRV9USU1FID0gODAxNzAsXG4gIC8qKlxuICAgKiDpnZ7mnIDkvJjlk43lupTml7bpl7RcbiAgICovXG4gIE5PTk9QVElNQUxfUkVTX1RJTUUgPSA4MDE3MSxcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsRW5naW5lIH0gZnJvbSAnLi4vUkNDYWxsRW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL3V0aWxzL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0lubmVyQ29kZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNJbm5lckNvZGUnO1xuXG4vKipcbiAqIOagoeaXtuaooeWdl1xuICovXG5leHBvcnQgY2xhc3MgVGltZUNvcnJlY3Rpb25lciB7XG4gIC8qKlxuICAgKiDmjqXlj6Plk43lupTml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX1JUVDogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiDlj6/nlKjnmoTmjqXlj6Plk43lupTml7bpl7TkuIvpmZDvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF92YWxpZE1pblJUVDogbnVtYmVyID0gMjAwXG5cbiAgLyoqXG4gICAqIOWPr+eUqOeahOaOpeWPo+WTjeW6lOaXtumXtOS4iumZkO+8iOWNleS9jTogbXPvvIlcbiAgICovXG4gIHByaXZhdGUgX3ZhbGlkTWF4UlRUOiBudW1iZXIgPSAxMDAwXG5cbiAgLyoqXG4gICAqIOS4jiBjYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruaXtumXtO+8iOWNleS9jTogbXPvvIlcbiAgICovXG4gIHByaXZhdGUgX2RlbHRhVGltZTogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiB0aW1lcklkXG4gICAqL1xuICBwcml2YXRlIF90aW1lcklkOiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDova7orq3ml7bpl7Tpl7TpmpTvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbnRlcnZhbDogbnVtYmVyID0gMiAqIDEwMDBcblxuICAvKipcbiAgICog5pyA5aSn6YeN6K+V5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhSZXRyeVRpbWVzOiBudW1iZXIgPSA4XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2luZ2xlQ2FsbER1cmF0aW9uRXY6IChjYWxsSWQ6IHN0cmluZywgY2xpZW50U3RhcnRUaW1lOiBudW1iZXIsIGNsaWVudEZpcnN0RnJhbWVUaW1lOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykgPT4gdm9pZCxcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDku47mnI3liqHnq6/ojrflj5bpgJror53ml7bplb/jgIHpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsQ2xpZW50VGltZUJ5U2VydmVyKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCBkdXJhdGlvbj86IG51bWJlciwgY2xpZW50U3RhcnRUaW1lPzogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBpZiAoIXRoaXMuX1JUVCB8fCB0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1pblJUVCkge1xuICAgICAgYXdhaXQgdGhpcy5fZ2V0RGVsdGFUaW1lKHRyYWNlSWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FfWAsIHRyYWNlSWQpO1xuICAgICAgLy8gcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3RhcnRUaW1lOiBzZXJ2ZXJTdGFydFRpbWUgfSA9IGRhdGEhO1xuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3Ioc2VydmVyU3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gKGN1cnJlbnRUaW1lICsgdGhpcy5fZGVsdGFUaW1lIC0gc2VydmVyU3RhcnRUaW1lKSAvIDEwMDA7XG5cbiAgICBpZiAoZHVyYXRpb24gPCAwKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9QLCBgaW52YWxpZCBkdXJhdGlvbjogJHtkdXJhdGlvbn1gLCB0cmFjZUlkKTtcbiAgICAgIGR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICAvLyDlkJHkuIvlj5bmlbRcbiAgICBkdXJhdGlvbiA9IE1hdGguZmxvb3IoZHVyYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuX1JUVCA+IHRoaXMuX3ZhbGlkTWluUlRUICYmIHRoaXMuX1JUVCA8PSB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuTk9OT1BUSU1BTF9SRVNfVElNRX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuTk9OT1BUSU1BTF9SRVNfVElNRSwgZHVyYXRpb24sIGNsaWVudFN0YXJ0VGltZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHJ0dDogdGhpcy5fUlRULFxuICAgICAgZGVsdGFUOiB0aGlzLl9kZWx0YVRpbWUsXG4gICAgICBzZXJ2ZXJTdGFydFRpbWUsXG4gICAgICBjbGllbnRTdGFydFRpbWUsXG4gICAgICBkdXJhdGlvbixcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZSwgZHVyYXRpb24sIGNsaWVudFN0YXJ0VGltZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeiuoeeul+WuouaIt+err+W8gOWni+aXtumXtFxuICAgKi9cbiAgcHVibGljIGNhbGNDbGllbnRTdGFydFRpbWUoY2FsbElkOiBzdHJpbmcsIHN0YXJ0VGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpOiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciB9IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfVCwgYGNhbGxJZDogJHtjYWxsSWR9LCBzdGFydFRpbWU6ICR7c3RhcnRUaW1lfWAsIHRyYWNlSWQpO1xuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9SLCBgY29kZTogJHtSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOWGjeasoemHjeaWsOiOt+WPliBSVFQg5bm26YeN5paw6K6h566X5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FIH07XG4gICAgfVxuXG4gICAgY29uc3QgY2xpZW50U3RhcnRUaW1lID0gTWF0aC5mbG9vcihzdGFydFRpbWUgLSB0aGlzLl9kZWx0YVRpbWUpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9SLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgICAgc3RhcnRUOiBzdGFydFRpbWUsXG4gICAgICBjbGllbnRTdGFydFRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX1JUVCA+IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDph43nva4gY2FsbCDkuK3ph43or5XmrKHmlbBcbiAgICAgIHRoaXMuX3JldHJ5VGltZXNJbkNhbGwgPSAwO1xuICAgICAgLy8g5YaN5qyh6YeN5paw6I635Y+WIFJUVCDlubbph43mlrDorqHnrpflvIDlp4vml7bpl7RcbiAgICAgIHRoaXMuX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUywgY2xpZW50U3RhcnRUaW1lIH07XG4gIH1cblxuICBwcml2YXRlIF9zdGFydFRpbWVzID0gMDtcblxuICAvKipcbiAgICog5byA5aeL5a6a5pe26YCS5b2S6I635Y+W5LiOIENhbGxTZXJ2ZXIg55qE5pe26Ze05YGP5beu5YC8XG4gICAqL1xuICBwdWJsaWMgc3RhcnQodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVySWQgfHwgdGhpcy5fc3RhcnRUaW1lcyA+PSB0aGlzLl9tYXhSZXRyeVRpbWVzKSB7XG4gICAgICAvLyDpmLLmraLph43lpI3lkK/liqhcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NUQVJUX08sIGB0aW1lcklkOiAke3RoaXMuX3RpbWVySWR9YCk7XG5cbiAgICB0aGlzLl9zdGFydFRpbWVzKys7XG5cbiAgICAvLyDojrflj5ZcbiAgICB0aGlzLl9nZXREZWx0YVRpbWUodHJhY2VJZCk7XG5cbiAgICB0aGlzLl90aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3RpbWVySWQgPSBudWxsO1xuICAgICAgdGhpcy5zdGFydCh0cmFjZUlkKTtcbiAgICB9LCB0aGlzLl9pbnRlcnZhbCk7XG4gIH1cblxuICAvKipcbiAgICog5YGc5q2i5a6a5pe26L2u6K6tXG4gICAqL1xuICBwdWJsaWMgc3RvcCh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NUT1BfTywgYHRpbWVySWQ6ICR7dGhpcy5fdGltZXJJZH1gLCB0cmFjZUlkKTtcbiAgICB0aGlzLl90aW1lcklkICYmIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcklkKTtcbiAgICB0aGlzLl90aW1lcklkID0gbnVsbDtcbiAgICAvLyDph43nva7mrKHmlbBcbiAgICB0aGlzLl9zdGFydFRpbWVzID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiDph43mlrDlrprml7bova7orq1cbiAgICovXG4gIHB1YmxpYyByZXN0YXJ0KHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfUkVTVEFSVF9PLCBgbGVnYWwgcnR0IHRpbWUsIFJUVDogJHt0aGlzLl9SVFR9LCB2YWxpZE1pblJUVDogJHt0aGlzLl92YWxpZE1pblJUVH1gLCB0cmFjZUlkKTtcbiAgICBpZiAodGhpcy5fUlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5riF6Zmk5b2T5YmN5q2j5Zyo6L+b6KGM55qEXG4gICAgdGhpcy5zdG9wKHRyYWNlSWQpO1xuICAgIC8vIOmHjeaWsOWQr+WKqFxuICAgIHRoaXMuc3RhcnQodHJhY2VJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9jYWxEZWxheVRpbWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGVsdGFUaW1lO1xuICB9XG5cbiAgcHVibGljIGdldFJUVCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9SVFQ7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5LiOIENhbGxTZXJ2ZXIg55qE5pe26Ze05YGP5beu5YC877yM6Z2e6YCa6K+d5Lit55qE6K6h566XXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXREZWx0YVRpbWUodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgZGVsYXlUaW1lPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhOiBzeW5jVGltZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50UlRUID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcblxuICAgIC8vIOWwj+S6jiAxMDAwbXMg5Li65Y+v55SoIHJ0dFxuICAgIGlmICgoY3VycmVudFJUVCA8IHRoaXMuX1JUVCB8fCB0aGlzLl9SVFQgPT09IDApICYmIGN1cnJlbnRSVFQgPD0gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX1JUVCA9IGN1cnJlbnRSVFQ7XG4gICAgfVxuXG4gICAgLy8g5Y+q5pyJ5bCP5LqOIDIwMG1zIOWBnOatouiOt+WPllxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIC8vIOWwj+S6juacgOWwj+WPr+eUqCBydHTvvIzlgZzmraLova7orq3orqHnrpdcbiAgICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWx0YVRpbWUgPSAoc3luY1RpbWUhIC0gc3RhcnRUaW1lKSAtIHRoaXMuX1JUVCAvIDI7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NFVF9ERUxUQV9USU1FX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHJ0dDogdGhpcy5fUlRULFxuICAgICAgZGVsdGFUOiB0aGlzLl9kZWx0YVRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgcmV0dXJuIHsgY29kZSwgZGVsYXlUaW1lOiB0aGlzLl9kZWx0YVRpbWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3ojrflj5blvIDlp4vml7bpl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldERlbHRhVGltZUluQ2FsbChjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciwgY2xpZW50Rmlyc3RGcmFtZVRpbWU/OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxUaW1lSW5mbyhjYWxsSWQsIHRyYWNlSWQpO1xuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50UlRUID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcblxuICAgIC8vIOWwj+S6jiAxMDAwbXMg5Li65Y+v55SoIHJ0dFxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fUlRUKSB7XG4gICAgICB0aGlzLl9SVFQgPSBjdXJyZW50UlRUO1xuICAgIH1cblxuICAgIHRoaXMuX2RlbHRhVGltZSA9IChkYXRhIS5zeW5jVGltZSAtIHN0YXJ0VGltZSkgLSB0aGlzLl9SVFQgLyAyO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjYWxsSWQsXG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3IoZGF0YSEuc3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICBjb25zdCBjbGllbnRGaXJzdEZyYW1lVGltZSA9IE1hdGguZmxvb3IoZGF0YSEuZmlyc3RGcmFtZXRpbWUgLSB0aGlzLl9kZWx0YVRpbWUpO1xuXG4gICAgLy8g5Y+q5pyJ5bCP5LqOIDIwMG1zIOWBnOatouiOt+WPllxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIC8vIOacgOS8mOe7k+aenO+8jOWBnOatoui9ruiureiuoeeul1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTLCBjbGllbnRTdGFydFRpbWUsIGNsaWVudEZpcnN0RnJhbWVUaW1lIH07XG4gICAgfVxuICAgIC8vIOmdnuacgOS8mOe7k+aenFxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FLCBjbGllbnRTdGFydFRpbWUsIGNsaWVudEZpcnN0RnJhbWVUaW1lIH07XG4gIH1cblxuICBwcml2YXRlIF9yZXRyeVRpbWVzSW5DYWxsOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4UmV0cnlUaW1lc0luQ2FsbDogbnVtYmVyID0gM1xuXG4gIC8qKlxuICAgKiDlpJrmrKHmoKHmraPmipvnu5nkuJrliqHlsYLnmoTpgJror53lvIDlp4vml7bpl7TjgIHpppbluKfml7bpl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLy8g5YWI5YGc5q2i5pyq57uT5p2f55qE6K6h566XXG4gICAgdGhpcy5zdG9wKHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfTE9PUF9DT1JSRUNUX0NMSU5FVF9USU1FX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9ID0gYXdhaXQgdGhpcy5fZ2V0RGVsdGFUaW1lSW5DYWxsKGNhbGxJZCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICAgICAgLy8g57uT5p6c5pyA5LyY77yM5oqb57uZ5bqU55So5bGC5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9zaW5nbGVDYWxsRHVyYXRpb25FdihjYWxsSWQsIGNsaWVudFN0YXJ0VGltZSEsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID4gdGhpcy5fbWF4UmV0cnlUaW1lc0luQ2FsbCAmJiBjb2RlID09PSBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUV9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDpnZ7mnIDkvJjnu5PmnpzvvIzmipvnu5nlupTnlKjlsYLlvIDlp4vml7bpl7TvvIzmoLnmja7ph43or5XmrKHmlbDov5vooYzph43or5U7IOmHjeivlSAzIOasoeWQjuWGjeaKm+WHuuS4u+imgeaYr+S4uuS6huiOt+WPluacgOWwjyBSVFRcbiAgICAgIHRoaXMuX3NpbmdsZUNhbGxEdXJhdGlvbkV2KGNhbGxJZCwgY2xpZW50U3RhcnRUaW1lISwgY2xpZW50Rmlyc3RGcmFtZVRpbWUhLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JldHJ5VGltZXNJbkNhbGwgPiB0aGlzLl9tYXhSZXRyeVRpbWVzSW5DYWxsKSB7XG4gICAgICAvLyDml6DmnIDkvJjnu5PmnpzvvIzlupTnlKjlsYLmoLnmja7oh6rlt7HnmoTml7bpl7TotbDooagsIOebuOW9k+S6jiBSVFQg5oyJIDAg5aSE55CGXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmV0cnlUaW1lc0luQ2FsbCsrO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fbG9vcENvcnJlY3RDbGllbnRUaW1lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfSwgdGhpcy5faW50ZXJ2YWwpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBGb3J3YXJkVHlwZSB7XG4gIC8qKlxuICAgKiDpgJrov4fkuIvkuIDmrKHkurrlkZjnirbmgIEgdXNlclN0YXRlIOeahOS4i+WPkeWQjOatpeW4puS4i+WOu1xuICAgKi9cbiAgU09PTl9BRkVURVIgPSAwLFxuICAvKipcbiAgICog56uL5Y2z6L2s5Y+RXG4gICAqL1xuICBDVVJSRU5UID0gMSxcbn1cbiIsImltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5cbmV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2Uge1xuICBQVUJfSU5WSVRFX0NBTEwgPSAwLFxuICBQVUxMX0tWX0lOVklURV9DQUxMID0gMSxcbiAgU1lTVEVNX1BVU0ggPSAyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdGF0aXN0aWNzRGF0YSB7XG4gIC8qKlxuICAgKiDkuIrmiqXml7bpl7RcbiAgICovXG4gIHRpbWU6IG51bWJlcixcbiAgLyoqXG4gICAqIOi/kOiQpeWVhu+8jOS+i+WmgiDkuK3lm73ogZTpgJpcbiAgICovXG4gIGNyOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDnvZHnu5znsbvlnovvvIzkvovlpoIgNEdcbiAgICovXG4gIG5ldDogc3RyaW5nLFxuICAvKipcbiAgICogdXNlcklkXG4gICAqL1xuICB1aWQ6IHN0cmluZyxcbiAgLyoqXG4gICAqIOmUmeivr+eggVxuICAgKi9cbiAgY29kOiBudW1iZXIsXG4gIC8qKlxuICAgKiDosIPnlKjmiafooYzml7bplb9cbiAgICovXG4gIGR1cjogbnVtYmVyXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnotcbiAgICovXG4gIG10cDogUkNDYWxsUGx1c01lZGlhVHlwZVxuICAvKipcbiAgICog6YCa6K+d57G75Z6L77yM56eB6IGK5oiW576k6IGKXG4gICAqL1xuICBjdHA6IFJDQ2FsbFBsdXNUeXBlXG4gIC8qKlxuICAgKiBjYWxsSWRcbiAgICovXG4gIGNpZDogc3RyaW5nXG4gIC8qKlxuICAgKiBjbGllbnQgY2FsbElkXG4gICAqL1xuICBjY2lkOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDpgoDor7fmjqXmlLbmnaXmupBcbiAgICovXG4gIHJmOiBSQ0NhbGxQbHVzSW52aXRlU291cmNlXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxEaXJlY3Rpb24ge1xuICAvKipcbiAgICog5ZG85Ye6XG4gICAqL1xuICBPVVQgPSAtMSxcbiAgLyoqXG4gICAqIOe+pOWRvFxuICAgKi9cbiAgR1JPVVAgPSAwLFxuICAvKipcbiAgICog5ZG85YWlXG4gICAqL1xuICBJTiA9IDFcbn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBFdmVudEVtaXR0ZXIsIElSdW50aW1lLCBQbHVnaW5Db250ZXh0LCBSQ0Nvbm5lY3Rpb25TdGF0dXMsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IERpYWxvZ0FjdGlvbiB9IGZyb20gJy4vZW51bXMvRGlhbG9nQWN0aW9uJztcbmltcG9ydCB7IERpYWxvZ1R5cGUgfSBmcm9tICcuL2VudW1zL0RpYWxvZ1R5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c01lZGlhVHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ2FsbFN0YXRlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1R5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHsgU2VjcmV0Q2FsbFR5cGUgfSBmcm9tICcuL2VudW1zL1NlY3JldENhbGxUeXBlJztcbmltcG9ydCB7IElSQ0NhbGxJbml0T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9JSW5kZXgnO1xuaW1wb3J0IHtcbiAgSUFjY2VwdEluZm8sXG4gIElBY2NlcHRPcHRzLFxuICBJQ2FsbElkLFxuICBJUkNDYWxsUGx1c0NhbGxSZWNvcmQsXG4gIElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlcyxcbiAgSUNhbmNlbENoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElHZXRDYWxsTG9nTGlzdE9wdHMsXG4gIElHZXRDYWxsU2Vzc2lvblJlcyxcbiAgSUhhbmd1cEluZm8sXG4gIElJbnZpdGVPcHRzLFxuICBJSW52aXRlUmVzLFxuICBJSm9pbkNhbGxPcHRzLFxuICBJT3RoZXJNZW1JbmZvLFxuICBJUmVxQ2hhbmdlTWVkaWFUeXBlT3B0cyxcbiAgSVJlcUNoYW5nZU1lZGlhVHlwZVJlcyxcbiAgSVJlc0NoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElTZXNzaW9uVXNlcixcbiAgSVN0YXJ0Q2FsbE9wdHMsXG4gIElTdGFydENhbGxSZXN1bHQsXG4gIElIYW5ndXBGb3JCdXN5T3B0cyxcbiAgSUNoYW5nZU1lZGlhVHlwZUluZm8sXG59IGZyb20gJy4vaW50ZXJmYWNlcy9JUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7XG4gIElDYWxsU2Vzc2lvblVzZXIsXG4gIElEaWFsb2dEb3duQ2FsbENvbixcbiAgSUV2ZW50RG93bkNhbGxDb24sXG4gIElHZXRDYWxsVGltZUluZm9SZXMsXG4gIElHZXREZWxheVRpbWVJbmZvUmVzLFxuICBJUHViQ2FsbExvZyxcbiAgSVB1Ykludml0ZUNvbixcbiAgSVN0YXR1c0Rvd25Db250LFxuICBJU3lzU3RhdHVzVXBPcHRzLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVNpZ25hbFRyYW5zcG9ydGVyJztcbmltcG9ydCB7IENhbGxUaW1lckV2ZW50VHlwZSwgUkNDYWxsSW5uZXJTZXNzaW9uIH0gZnJvbSAnLi9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbic7XG5pbXBvcnQgeyBTaWduYWxUcmFuc3BvcnRlciB9IGZyb20gJy4vbW9kdWxlcy9TaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBwYXJzZVN0YXR1c0RhdGEsIHRyYW4yQ2FsbExvZyB9IGZyb20gJy4vdXRpbHMvaGVscGVyJztcbmltcG9ydCB7IGdldFVVSUQyMiB9IGZyb20gJy4vdXRpbHMvcmFuZG9tJztcbmltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4vdXRpbHMvdGltZXJzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IEFibm9ybWFsQ2FsbCB9IGZyb20gJy4vbW9kdWxlcy9BYm5vcm1hbENhbGwnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckV2ZW50VHlwZSB9IGZyb20gJy4vZW51bXMvQ2FsbFNlcnZlckV2ZW50VHlwZSc7XG5pbXBvcnQgeyBUaW1lQ29ycmVjdGlvbmVyIH0gZnJvbSAnLi9tb2R1bGVzL1RpbWVDb3JyZWN0aW9uZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb24gfSBmcm9tICcuL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24nO1xuaW1wb3J0IHsgRm9yd2FyZFR5cGUgfSBmcm9tICcuL2VudW1zL0ZvcndhcmRUeXBlJztcbmltcG9ydCB7XG4gIENhbGxIb29rc1R5cGUsIFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLCBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSUNhbGxIb29rcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSwgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzSW52aXRlU291cmNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lDYWxsUGx1c1N0YXRpc3RpY3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi9tb2R1bGVzL1JDQ2FsbFBsdXNSZXBvcnRNb2R1bGUnO1xuaW1wb3J0IHsgUkNDYWxsRGlyZWN0aW9uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxEaXJlY3Rpb24nO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0lubmVyQ29kZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZSc7XG5cbmNvbnN0IENBTExfVElNRV9PVVQgPSA2MCAqIDEwMDA7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxFbmdpbmUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBzdGF0aWMgX19JTk5FUl9TRVNTSU9OX0NMT1NFX186IHN0cmluZyA9ICdpbm5lci1zZXNzaW9uLWNsb3NlJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fOiBzdHJpbmcgPSAnaW5uZXItc2Vzc2lvbi1jb25uZWN0J1xuXG4gIHN0YXRpYyBfX0lOTkVSX0NIQU5HRV9NRURJQV9UWVBFX186IHN0cmluZyA9ICdpbm5lci1jaGFuZ2UtbWVkaWEtdHlwZSdcblxuICBzdGF0aWMgX19JTk5FUl9JTlZJVEVfXzogc3RyaW5nID0gJ2lubmVyLWludml0ZSdcblxuICAvKipcbiAgICog5Li7IHNlc3Npb25cbiAgICovXG4gIF9tYWluU2Vzc2lvbjogUkNDYWxsSW5uZXJTZXNzaW9uIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5Zyo6YCa6K+d5Lit5pS25Yiw55qEIOmCgOivtyBzZXNzaW9uXG4gICAqL1xuICBfaG9sZFNlc3Npb25zOiBSQ0NhbGxJbm5lclNlc3Npb25bXSA9IFtdXG5cbiAgLyoqXG4gICAqIOS/oeS7pOaooeWdl1xuICAgKi9cbiAgX3NpZ25hbE1vZHVsZTogU2lnbmFsVHJhbnNwb3J0ZXJcblxuICAvKipcbiAgICog5byC5bi457uT5p2fIGNhbGwg5aSE55CG5ZmoXG4gICAqL1xuICBfYWJub3JtYWxNb2R1bGU6IEFibm9ybWFsQ2FsbFxuXG4gIC8qKlxuICAgKiDorrDlvZXljZXlkbzkuK3vvIzmmK/lkKbkuIrmiqXov4fnrKzkuIDluKdcbiAgICog572uIHRydWUg5pe25py677ya5pS25Yiw6L+c56uv56ys5LiA5bin77yM5oiQ5Yqf5LiK5oqlIFNlcnZlclxuICAgKiDnva4gZmFsc2Ug5pe25py677ya6YCa6K+d57uT5p2fXG4gICAqL1xuICBwcml2YXRlIF9pc1VwRmlyc3RGcmFtZVRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDpgJror53kuLogT05DQUxMIOaXtu+8jFNESyDpnIDnu5nkuJrliqHlsYLkuIrmiqXpgJror53lvIDlp4vorqHml7bkuovku7ZcbiAgICog5Lya5pS25Yiw5aSa5qyhIE9OQ0FMTO+8jOaJgOS7pemcgOimgeagh+ivhuaYr+WQpuW3suaKm+i/h+S6i+S7tlxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFN0YXJ0TWFwOiB7XG4gICAgW2NhbGxJZDogc3RyaW5nXToge1xuICAgICAgaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZTogYm9vbGVhbixcbiAgICB9XG4gIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDmoKHml7blmahcbiAgICovXG4gIF90aW1lQ29ycmVjdGlvbmVyOiBUaW1lQ29ycmVjdGlvbmVyXG5cbiAgLyoqXG4gICAqIOaehOmAoOWZqFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSVJDQ2FsbEluaXRPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0QXBwRXZlbnRNb2R1bGU6IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lciA9IG5ldyBUaW1lQ29ycmVjdGlvbmVyKHRoaXMsIF9sb2dnZXIsIHRoaXMuX29uUmVjdlNpbkNhbGxEdXJhdGlvbi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9zaWduYWxNb2R1bGUgPSBuZXcgU2lnbmFsVHJhbnNwb3J0ZXIoX2NvbnRleHQsIF9ydW50aW1lLCBfaW5pdE9wdHMsIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIsIHRoaXMuX2xvZ2dlcik7XG4gICAgdGhpcy5fc2lnbmFsTW9kdWxlLnJlZ2lzdGVyTGlzdGVuZXIoe1xuICAgICAgb25JbnZpdGU6IHRoaXMuX29uSW52aXRlLmJpbmQodGhpcyksXG4gICAgICBvblN0YXR1c0Rvd246IHRoaXMuX29uU3RhdHVzRG93bi5iaW5kKHRoaXMpLFxuICAgICAgb25PdGhlckNsaWVudFN0YXR1c0Rvd246IHRoaXMuX29uT3RoZXJDbGllbnRTdGF0dXNEb3duLmJpbmQodGhpcyksXG4gICAgICBvbkV2ZW50RG93bjogdGhpcy5fb25FdmVudERvd24uYmluZCh0aGlzKSxcbiAgICAgIG9uU3dpdGNoTWVkaWFUeXBlOiB0aGlzLl9vblN3aXRjaE1lZGlhVHlwZS5iaW5kKHRoaXMpLFxuICAgICAgb25SZWN2Q2FsbEVuZExvZzogdGhpcy5fb25SZWN2Q2FsbEVuZExvZy5iaW5kKHRoaXMpLFxuICAgICAgb25JTVN0YXRlQ2hhbmdlOiB0aGlzLl9vbklNU3RhdGVDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZSA9IG5ldyBBYm5vcm1hbENhbGwoX3J1bnRpbWUsIF9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHN0YXJ0Q2FsbChvcHRzOiBJU3RhcnRDYWxsT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc3VsdH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsVHlwZSwgbWVkaWFUeXBlLCB0b1VzZXJzLCB0YXJnZXRJZCwgdGFyZ2V0VHlwZSwgb2xkUm9vbUlkLFxuICAgIH0gPSBvcHRzO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLnN0YXJ0Q2FsbCh7XG4gICAgICBjbGllbnRDYWxsSWQ6IG9wdHMuY2FsbElkLFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB0b1VzZXJzLFxuICAgICAgc2VjcmV0Q2hhdDogU2VjcmV0Q2FsbFR5cGUuTk9STUFMLFxuICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgb2xkUm9vbUlkLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNhbGxJZCwgYnVzeWxpbmVVc2VycyB9ID0gZGF0YSE7XG5cbiAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLmFkZEFibm9ybWFsbENhbGxJZChjdXJyZW50VXNlcklkLCBjYWxsSWQpO1xuXG4gICAgLy8g55Sf5oiQ5Li7IHNlc3Npb25cbiAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IG5ldyBSQ0NhbGxJbm5lclNlc3Npb24oXG4gICAgICBjYWxsSWQsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLklOVklURUQsXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGN1cnJlbnRVc2VySWQsXG4gICAgICBjdXJyZW50VXNlcklkLFxuICAgICAgW10sXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgKTtcblxuICAgIC8vIOWNleWRvOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqCwg576k5ZG85peg6LaF5pe26YC76L6RXG4gICAgaWYgKGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgIGNvbnN0IGludml0ZXJUaW1lcklkID0gdGhpcy5fc3RhcnRUaW1lcihkYXRhIS5jYWxsSWQsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk5PX0FOU1dFUiwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVUaW1lcklkKENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVSLCBpbnZpdGVyVGltZXJJZCk7XG4gICAgfVxuXG4gICAgLy8g6YCa55+l5bex5pa55Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgY29uc3Qgc2VsZlN0YXRlID0ge1xuICAgICAgdXNlcklkOiBjdXJyZW50VXNlcklkLFxuICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQUxMSU5HLFxuICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uQ0FMTElORyxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICB9O1xuICAgIGxldCBpbnZpdGVlc1N0YXRlID0gdG9Vc2Vycy5tYXAoKHsgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9KSA9PiAoe1xuICAgICAgdXNlcklkLFxuICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVELFxuICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uSU5WSVRFRCxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICB9KSk7XG5cbiAgICBsZXQgYnVzeVVzZXJzU3RhdGU6IElTZXNzaW9uVXNlcltdID0gW107XG4gICAgaWYgKGJ1c3lsaW5lVXNlcnMpIHtcbiAgICAgIGJ1c3lVc2Vyc1N0YXRlID0gYnVzeWxpbmVVc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9ID0gaW52aXRlZXNTdGF0ZS5maW5kKCh1c2VyKSA9PiB1c2VyLnVzZXJJZCA9PT0gaXRlbS51c2VySWQpITtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICAgIHVzZXJTdGF0ZTogaXRlbS5zZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICAvLyDooqvpgoDor7fogIXkuK3pnIDov4fmu6Tlh7rlv5nnooznlKjmiLdcbiAgICAgIGludml0ZWVzU3RhdGUgPSBpbnZpdGVlc1N0YXRlLmZpbHRlcigoeyB1c2VySWQgfSkgPT4gYnVzeVVzZXJzU3RhdGUhLmV2ZXJ5KCh7IHVzZXJJZDogYnVzeVVzZXJJZCB9KSA9PiBidXN5VXNlcklkICE9PSB1c2VySWQpKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIFtzZWxmU3RhdGUsIC4uLmludml0ZWVzU3RhdGUsIC4uLmJ1c3lVc2Vyc1N0YXRlIV0sIHRyYWNlSWQpO1xuICAgIH0pO1xuICAgIHJldHVybiB7IGNvZGUsIGRhdGEgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3pgoDor7dcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnZpdGUob3B0czogSUludml0ZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElJbnZpdGVSZXN9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOmCgOivt1xuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyB0b1VzZXJzIH0gPSBvcHRzO1xuXG4gICAgY29uc3QgY2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuaW52aXRlQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICB0b1VzZXJzLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICBpZiAodGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICAgIC8vIOWNleWRvOS4remCgOivt+aIkOWKn++8jOWNs+abtOaWsCBjYWxsIHNlc3Npb24g6YCa6K+d57G75Z6L5Li6576k5ZG8XG4gICAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZUNhbGxUeXBlKFJDQ2FsbFBsdXNUeXBlLk1VTFRJKTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGxUeXBlIOWPmOabtOS4uue+pOWRvFxuICAgICAgICB0aGlzLl9vbkNhbGxUeXBlQ2hhbmdlKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLCBSQ0NhbGxQbHVzVHlwZS5NVUxUSSwgdHJhY2VJZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOmAmuefpeiiq+mCgOivt+S6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgbGV0IGludml0ZWRVc2Vyc1N0YXRlID0gdG9Vc2Vycy5tYXAoKHsgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9KSA9PiAoe1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCxcbiAgICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uSU5WSVRFRCxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBsZXQgYnVzeWxpbmVVc2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgICAgaWYgKGRhdGEhLmJ1c3lsaW5lVXNlcnMpIHtcbiAgICAgICAgYnVzeWxpbmVVc2Vyc1N0YXRlID0gZGF0YSEuYnVzeWxpbmVVc2Vycz8ubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9ID0gaW52aXRlZFVzZXJzU3RhdGUuZmluZCgodXNlcikgPT4gdXNlci51c2VySWQgPT09IGl0ZW0udXNlcklkKSE7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVzZXJJZDogaXRlbS51c2VySWQsXG4gICAgICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGludml0ZWRVc2Vyc1N0YXRlID0gaW52aXRlZFVzZXJzU3RhdGUuZmlsdGVyKCh7IHVzZXJJZCB9KSA9PiBidXN5bGluZVVzZXJzU3RhdGUhLmV2ZXJ5KCh7IHVzZXJJZDogYnVzeVVzZXJJZCB9KSA9PiBidXN5VXNlcklkICE9PSB1c2VySWQpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgWy4uLmludml0ZWRVc2Vyc1N0YXRlLCAuLi5idXN5bGluZVVzZXJzU3RhdGVdLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSwgZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGJlZm9yZUhhbmd1cFxuICAgKi9cbiAgcHVibGljIGNsZWFyQWxsVGltZXIoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOa4hemZpOaJgOaciei2heaXtuiuoeaXtuWZqFxuICAgIFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5mb3JFYWNoKChzZXNzaW9uKSA9PiB7XG4gICAgICBpZiAoc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgICAgc2Vzc2lvbi5nZXRBbGxUaW1lcklkcygpLmZvckVhY2goKHRpbWVySWQpID0+IHRoaXMuX3N0b3BUaW1lci5iaW5kKHRoaXMpKHRpbWVySWQsIHRyYWNlSWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq1cbiAgICog6YCa6K+d6K+35rGC5Y+W5raI44CB6YCa6K+d5ouS57udXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZ3VwKG9wdHM6IElIYW5ndXBGb3JCdXN5T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuaGFuZ3VwQ2FsbCh7XG4gICAgICBjYWxsSWQ6IG9wdHMuY2FsbElkLFxuICAgICAgc3lzU3RhdHVzOiBvcHRzLnN5c3RlbVN0YXRlLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeaUtumCgOivt1xuICAgKiDpgJror53kuK3lj4jmlLbliLDmlrDmnaXnlLXlkI7vvIzmjqXlkKzmlrDmnaXnlLXml7bvvIzlv4XpobvlhYjmjILmlq3kuYvliY3nmoTpgJror53vvIhtYWluU2Vzc2lvbu+8iVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjY2VwdChvcHRzOiBJQWNjZXB0T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIC8vIOS4jeWtmOWcqCBzZXNzaW9uIOS4jeWFgeiuuOaOpeWQrFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmFjY2VwdENhbGwoeyBjYWxsSWQ6IG9wdHMuY2FsbElkIH0sIHRyYWNlSWQpO1xuXG4gICAgLy8g5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICB0aGlzLl9jbGVhck1vYmlsZU9uUGhvbmUob3B0cy5jYWxsSWQsIHRyYWNlSWQpO1xuICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZVNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcpO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeWKoOWFpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW5DYWxsKG9wdHM6IElKb2luQ2FsbE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDlhYjmlLbliLAgb25JbnZpdGXvvIzmsqHmnInmjqXpgJrov4cgam9pbkNhbGwg5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fbWFpblNlc3Npb24gJiYgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5qb2luQ2FsbCh7IGNhbGxJZDogb3B0cy5jYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLmFkZEFibm9ybWFsbENhbGxJZChjdXJyZW50VXNlcklkLCBvcHRzLmNhbGxJZCk7XG5cbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICAvLyDlpoLmnpzkuI3lrZjlnKggbWFpblNlc3Npb24g5LuOIHNlcnZlciDojrflj5blvZPliY3liqDlhaXnmoQgc2Vzc2lvblxuICAgICAgYXdhaXQgdGhpcy5fY3JlYXRlU2Vzc2lvbkJ5U2VydmVyKG9wdHMuY2FsbElkLCB0cnVlLCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2xlYXJNb2JpbGVPblBob25lKG9wdHMuY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5aqS5L2T5Y+Y5pu06K+35rGCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdENoYW5nZU1lZGlhVHlwZShvcHRzOiBJUmVxQ2hhbmdlTWVkaWFUeXBlT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVJlcUNoYW5nZU1lZGlhVHlwZVJlc30+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRyYUtleVZhbCA9IHtcbiAgICAgIG1lZGlhVHlwZTogb3B0cy5tZWRpYVR5cGUsXG4gICAgfTtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVSZXFNZWRpYVR5cGUob3B0cy5tZWRpYVR5cGUpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uSWQgPSBnZXRVVUlEMjIoKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5kaWFsb2dVcENhbGwoe1xuICAgICAgdHJhbnNhY3Rpb25JZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICB0b1VzZXJJZHM6IG9wdHMudG9Vc2VySWRzLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogRGlhbG9nQWN0aW9uLlJFUVVFU1QsXG4gICAgICBleHRyYUtleVZhbCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIGRhdGE6IHsgdHJhbnNhY3Rpb25JZCB9IH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5aqS5L2T57G75Z6L5Y+Y5pu06K+35rGC5ZON5bqUXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVzcG9uc2VDaGFuZ2VNZWRpYVR5cGUob3B0czogSVJlc0NoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFNZWRpYVR5cGUgPSB0aGlzLl9tYWluU2Vzc2lvbi5nZXRSZXFNZWRpYVR5cGUoKTtcbiAgICBpZiAob3B0cy5hZ3JlZSkge1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlTWVkaWFUeXBlKHJlcU1lZGlhVHlwZSEpO1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlUmVxTWVkaWFUeXBlKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmRpYWxvZ1VwQ2FsbCh7XG4gICAgICB0cmFuc2FjdGlvbklkOiBvcHRzLnRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogb3B0cy5hZ3JlZSA/IERpYWxvZ0FjdGlvbi5BQ0NFUFQgOiBEaWFsb2dBY3Rpb24uUkVGVVNFLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlua2iOmAmuivneWqkuS9k+exu+Wei+WIh+aNouivt+axglxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbmNlbENoYW5nZU1lZGlhVHlwZShvcHRzOiBJQ2FuY2VsQ2hhbmdlTWVkaWFUeXBlT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIC8vIOS4jeWtmOWcqOato+WcqOmAmuivneS4rSBzZXNzaW9uLCDkuI3lhYHorrjosIPnlKhcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZGlhbG9nVXBDYWxsKHtcbiAgICAgIHRyYW5zYWN0aW9uSWQ6IG9wdHMudHJhbnNhY3Rpb25JZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICBkaWFsb2dUeXBlOiBEaWFsb2dUeXBlLlNXSVRDSF9NRURJQV9UWVBFLFxuICAgICAgYWN0aW9uOiBEaWFsb2dBY3Rpb24uQ0FOQ0VMLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIGxvZyDliJfooahcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsTG9nTGlzdChvcHRzOiBJR2V0Q2FsbExvZ0xpc3RPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXN9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuc3luY0NhbGxMb2coe1xuICAgICAgdXNlcklkOiBjdXJyZW50VXNlcklkLFxuICAgICAgc3luY1RpbWU6IG9wdHMudGltZXN0YW1wLFxuICAgICAgY291bnQ6IG9wdHMuY291bnQsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgY29uc3QgY2FsbExvZzogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW10gPSBkYXRhIS5jYWxsTG9nTGlzdC5tYXAoKGl0ZW0pID0+IHRyYW4yQ2FsbExvZyhpdGVtKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgaGFzTW9yZTogQm9vbGVhbihkYXRhPy5oYXNNb3JlKSxcbiAgICAgICAgbWF4VGltZTogZGF0YSEubWF4VGltZSxcbiAgICAgICAgbGlzdDogY2FsbExvZyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmibnph4/liKDpmaTpgJror53ml6Xlv5dcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGVDYWxsTG9nKGNhbGxJZHM6IHN0cmluZ1tdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5kZWxldGVDYWxsUmVjb3JkKGN1cnJlbnRVc2VySWQsIGNhbGxJZHMsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIHNlcnZlciDlvZPliY3ml7bpl7TmiLNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IG51bWJlcn0+IHtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUsIGRhdGE6IGRhdGEhLnN5bmNUaW1lIH07XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIGNhbGwg5pe26Ze05L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFRpbWVJbmZvUmVzfT4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZCwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5pyq57uT5p2f55qE6YCa6K+d5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0T3BlbkNhbGxMaXN0KHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGE6IHJlc0RhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRVc2VyQ2FsbFN0YXRlTGlzdCh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3QgPSByZXNEYXRhIS5jYWxsU3RhdGVMaXN0Lm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjYWxsSWQsIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxpbmdVc2VySWQsIGNhbGxVc2VySWRzLCBjYWxsU3RhdHVzLCBjcnRUaW1lLCB1c2VyU2Vzc2lvblN0YXR1cywgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsIHN0YXJ0VGltZSwgc3luY1RpbWUsXG4gICAgICB9ID0gaXRlbTtcbiAgICAgIGNvbnN0IGNhbGxEaXJlY3Rpb24gPSAoY2FsbGluZ1VzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkgPyBSQ0NhbGxEaXJlY3Rpb24uT1VUIDogUkNDYWxsRGlyZWN0aW9uLklOO1xuICAgICAgY29uc3QgeyBjbGllbnRTdGFydFRpbWUgPSBzdGFydFRpbWUgfSA9IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuY2FsY0NsaWVudFN0YXJ0VGltZShjYWxsSWQsIHN0YXJ0VGltZSwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBjYWxsRGlyZWN0aW9uLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGNhbGxlclVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFVzZXJJZHMsXG4gICAgICAgIHNlc3Npb25TdGF0ZTogY2FsbFN0YXR1cyxcbiAgICAgICAgdXNlclN0YXRlOiB1c2VyU2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3RhcnRUaW1lc3RhbXA6IHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZXN0YW1wOiAwLFxuICAgICAgICBkdXJhdGlvbjogTWF0aC5mbG9vcigoK25ldyBEYXRlKCkgLSBjbGllbnRTdGFydFRpbWUpIC8gMTAwMCksXG4gICAgICAgIHN5bmNUaW1lc3RhbXA6IHN5bmNUaW1lLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogMCxcbiAgICAgICAgY3JlYXRlVGltZXN0YW1wOiBjcnRUaW1lLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb2RlLFxuICAgICAgZGF0YTogbGlzdCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOa4hemZpOW9k+WJjeeUqOaIt+eahCBjYWxsIGxvZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbW92ZUFsbENhbGxMb2codHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5jbGVhckNhbGxSZWNvcmQodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/hyBjYWxsSWQg6I635Y+WIHNlc3Npb24g6K+m57uG5L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlc3Npb24ob3B0czogSUNhbGxJZCwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxTZXNzaW9uUmVzfT4ge1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmdldENhbGxTZXNzaW9uKG9wdHMsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBjYWxsaW5nVXNlcklkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsU3RhdHVzLCBjYWxsU2Vzc2lvblVzZXJzLCBzdGFydFRpbWUsIGR1cmF0aW9uLCBzeW5jVGltZSxcbiAgICB9ID0gZGF0YSE7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJzID0gY2FsbFNlc3Npb25Vc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMsIHRhcmdldFR5cGUsIHRhcmdldElkLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzdGFydENhbGxlcklkOiBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgICAgIGNhbGxTZXNzaW9uVXNlcnM6IHNlc3Npb25Vc2VycyxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgc3luY1RpbWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0SG9sZFNlc3Npb24oY2FsbElkOiBzdHJpbmcpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIGNvbnN0IGlubmVyU2Vzc2lvbiA9IHRoaXMuX2hvbGRTZXNzaW9ucy5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgcmV0dXJuIGlubmVyU2Vzc2lvbiA/IG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbihpbm5lclNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeS4uyBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxNYWluU2Vzc2lvbigpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYWluU2Vzc2lvbiA/IG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbih0aGlzLl9tYWluU2Vzc2lvbiwgdGhpcywgdGhpcy5fbG9nZ2VyKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5Li7IHNlc3Npb24g54q25oCBXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlTWFpblNlc3Npb25TdGF0ZShzdGF0ZTogUkNDYWxsUGx1c0NhbGxTdGF0ZSkge1xuICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVTZXNzaW9uU3RhdGUoc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiusOW9leaYr+WQpuaYr+acrOerr+aMguaWrVxuICAgKi9cbiAgcHVibGljIHNldElzTG9jYWxDbGllbnRIYW5ndXAoaXNMb2NhbENsaWVudEhhbmd1cDogYm9vbGVhbikge1xuICAgIHRoaXMuX21haW5TZXNzaW9uPy5zZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXApO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuefpeS6uuWRmOeKtuaAgVxuICAgKiBDYWxsQ2xpZW50IOS5n+mcgOimgeabtOaWsOS6uuWRmOeKtuaAge+8jOWumuS5ieS4uuWFrOWFseWHveaVsFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkOiBzdHJpbmcsIHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQREFURV9VU0VSU19TVEFURV9PLCBgdXBkYXRlVXNlcnNTdGF0ZSAtPiB1c2VyczogJHtKU09OLnN0cmluZ2lmeSh1c2Vycyl9YCwgdHJhY2VJZCk7XG5cbiAgICAvLyDmm7TmlrAgc2Vzc2lvbiDkurrlkZjliJfooahcbiAgICBjb25zdCBzZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKGl0ZW0pID0+IGl0ZW0/LmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuXG4gICAgY29uc3QgY2hhbmdlZFVzZXJzID0gW107XG4gICAgaWYgKHNlc3Npb24pIHtcbiAgICAgIGNvbnN0IG5ld1VzZXJzID0gdXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFVzZXJTdGF0ZSA9IHNlc3Npb24uZ2V0VXNlckxpc3QoKS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IHVzZXJJZCA9PT0gaXRlbS51c2VySWQpWzBdIHx8IHt9O1xuICAgICAgICBjb25zdCBpc0lkbGUgPSBpdGVtLnVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTtcbiAgICAgICAgY29uc3QgeyBjYW1lcmFFbmFibGUgPSBmYWxzZSwgbWljcm9waG9uZUVuYWJsZSA9IGZhbHNlIH0gPSBpc0lkbGUgPyB7IGNhbWVyYUVuYWJsZTogZmFsc2UsIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlIH0gOiBvbGRVc2VyU3RhdGU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBjYW1lcmFFbmFibGUsXG4gICAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGFuZ2VkVXNlcnMucHVzaCguLi5zZXNzaW9uLnVwZGF0ZVVzZXJMaXN0KG5ld1VzZXJzLCB0cmFjZUlkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWRVc2Vycy5wdXNoKC4uLnVzZXJzKTtcbiAgICB9XG4gICAgLy8g6YCa55+l5LqL5Lu2XG4gICAgY2hhbmdlZFVzZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25Vc2VyU3RhdGVDaGFuZ2UoY2FsbElkLCBjaGFuZ2VkVXNlcnMsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIHNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgZW5hYmxlOiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIG1lZGlhVHlwZSwgZW5hYmxlLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU3RhcmluZ1RpbWUob3B0czogSUNhbGxJZCwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkdXJhdGlvbj86IG51bWJlciwgY2xpZW50U3RhcnRUaW1lPzogbnVtYmVyfT4ge1xuICAgIHJldHVybiB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmdldENhbGxDbGllbnRUaW1lQnlTZXJ2ZXIob3B0cy5jYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS6uuWRmOezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5c3RlbVN0YXR1c1VwKG9wdHM6IElTeXNTdGF0dXNVcE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5zeXNTdGF0dXNVcChvcHRzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDljZXlkbzkuK3mlLbliLDov5znq6/mtYHlkI7vvIznu5kgQ2FsbFNlcnZlciDkuIrmiqXvvIznlKjkuo7lpITnkIborqHml7bpgLvovpFcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cEZpcnN0RnJhbWVUaW1lKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCBub05lZWRVcENvbmRpdGlvbiA9ICF0aGlzLl9tYWluU2Vzc2lvblxuICAgICAgfHwgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxUeXBlKCkgIT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSlcbiAgICAgIHx8IHRoaXMuX2lzVXBGaXJzdEZyYW1lVGltZTtcbiAgICBpZiAobm9OZWVkVXBDb25kaXRpb24pIHtcbiAgICAgIC8vIOS4jeWtmCBtYWluU2Vzc2lvbiDmiJYg6YCa6L+H57G75Z6L5LiN5Li65Y2V5ZG85pe277yM5LiN5LiK5oql77yM55u05o6l6L+U5Zue5oiQ5YqfXG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVsYXlUaW1lID0gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRMb2NhbERlbGF5VGltZSgpO1xuICAgIGNvbnN0IHN0cmVhbVJlYWR5VGltZSA9IE1hdGguZmxvb3Iobm93ICsgZGVsYXlUaW1lKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfRklSU1RfRlJBTUVfVElNRV9ULCBgbm93OiAke25vd307IGRlbGF5OiAke2RlbGF5VGltZX07IHN0cmVhbVJlYWR5VGltZTogJHtzdHJlYW1SZWFkeVRpbWV9YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWUgPSB0cnVlO1xuXG4gICAgY29uc3QgY2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24hLmdldENhbGxJZCgpO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmV2ZW50VXBDYWxsKHtcbiAgICAgIGNhbGxJZCxcbiAgICAgIGV2ZW50VHlwZTogQ2FsbFNlcnZlckV2ZW50VHlwZS5GSVJTVF9GUkFNRSxcbiAgICAgIGV2ZW50QXJnczogeyBzdHJlYW1SZWFkeVRpbWUgfSxcbiAgICAgIGV2ZW50VGltZTogRGF0ZS5ub3coKSxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1IsIGBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5LiK5bGC5qih5oufIHN0YXR1c0Rvd25DYWxsLCDnu5PmnZ8gc2Vzc2lvblxuICAgKiDpgJror53lu7rnq4vlkI7vvIzlj6rog73nu5PmnZ8gbWFpblNlc3Npb25cbiAgICovXG4gIHB1YmxpYyBlbmRDdXJyZW50U2Vzc2lvbihjdXJyZW50VXNlclN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCBjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIGNvbnN0IHNlc3Npb25Vc2VyczogSUNhbGxTZXNzaW9uVXNlcltdID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0VXNlckxpc3QoKS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB1c2VySWQsIHVzZXJTdGF0ZSwgc3lzdGVtU3RhdGUsIHRhcmdldFR5cGUsIHRhcmdldElkLFxuICAgICAgICB9ID0gaXRlbTtcbiAgICAgICAgaWYgKHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIHN5c3RlbVN0YXRlID0gY3VycmVudFVzZXJTeXN0ZW1TdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5FTkRFRCxcbiAgICAgICAgICBzdGF0dXNUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgIGNoYW5nZWQ6IDEsXG4gICAgICAgICAgaW52aXRlVXNlcklkOiB0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0U3RhcnRDYWxsZXJJZCgpLFxuICAgICAgICAgIHN5c1N0YXR1czogc3lzdGVtU3RhdGUsXG4gICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YTogSVN0YXR1c0Rvd25Db250ID0ge1xuICAgICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgICB0b0RldmljZUlkOiB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0U2Vzc2lvbklkKCksXG4gICAgICAgIGNhbGxTdGF0dXM6IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQsXG4gICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzOiBzZXNzaW9uVXNlcnMsXG4gICAgICB9O1xuICAgICAgdGhpcy5fb25TdGF0dXNEb3duKGRhdGEsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDkuIrlsYIgUlRDIOWKoOWFpeaIv+mXtOWQjumHjeaWsOW8gOWni+agoeaXtlxuICAgKi9cbiAgcHVibGljIHN0YXJ0VGltZUNvcnJlY3Rpb24odHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5yZXN0YXJ0KHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGdldERlbGF5VGltZUluZm8oKTogSUdldERlbGF5VGltZUluZm9SZXMge1xuICAgIHJldHVybiB7XG4gICAgICBkZWxheVRpbWU6IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0TG9jYWxEZWxheVRpbWUoKSxcbiAgICAgIHJ0dDogdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRSVFQoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGhvbGRTZXNzaW9uIOWNh+e6p+S4uiBtYWluU2Vzc2lvblxuICAgKi9cbiAgcHVibGljIHVwZ3JhZGVNYWluU2Vzc2lvbihob2xkQ2FsbElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2hvbGRTZXNzaW9ucy5maW5kSW5kZXgoKHNlc3Npb24pID0+IHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGhvbGRDYWxsSWQpO1xuICAgIHRoaXMuX21haW5TZXNzaW9uID0gdGhpcy5faG9sZFNlc3Npb25zLnNwbGljZShpbmRleCwgMSk/LlswXTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAvKipcbiAgICogSU0g54q25oCB5Y+Y5pu05aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vbklNU3RhdGVDaGFuZ2Uoc3RhdGU6IFJDQ29ubmVjdGlvblN0YXR1cykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIGxldCB0aW1lcklkOiBudW1iZXIgPSAwO1xuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldFNlc3Npb25TdGF0ZSgpICE9PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgICAvLyDmlq3nvZHnrYnlvoUgNjBzIOWQjuinpuWPkSBvblNlc3Npb25DbG9zZVxuICAgICAgICB0aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfSU1fU1RBVEVfQ0hBTkdFX08sICdlbmRDdXJyZW50U2Vzc2lvbiwgSU0gZGlzY29ubmVjdGVkIGZvciBtb3JlIHRoYW4gNjBzJywgdHJhY2VJZCk7XG4gICAgICAgICAgdGhpcy5lbmRDdXJyZW50U2Vzc2lvbihSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSLCB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkhLCB0cmFjZUlkKTtcbiAgICAgICAgfSwgQ0FMTF9USU1FX09VVCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGltZXJJZCAmJiBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuWPkei1t+mCgOivt+OAgeaUtuWIsOmCgOivt+WQjuiuoeaXtui2heaXtlxuICAgKiDmj5DliY3mqKHmi58gX29uU3RhdHVzRG93biwg5LiN5YaN5L6d6LWWIENhbGxTZXJ2ZXIg5LiL5Y+R55qEIF9vblN0YXR1c0Rvd25cbiAgICog5aSE55CG572R57uc5byC5bi45oOF5Ya15LiL5LiK5oqlIENhbGxTZXJ2ZXIg5aSx6LSl77yMQ2FsbFNlcnZlciDkuI3kvJrkuIvlj5EgX29uU3RhdHVzRG93biDmg4XlhrVcbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZUNhbGxUaW1lb3V0KGNhbGxJZDogc3RyaW5nLCB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ0FMTF9USU1FT1VUX08sIGBjYWxsIHRpbWVvdXQgY2FsbElkOiAke2NhbGxJZH0sIHVzZXJTdGF0ZTogJHt1c2VyU3RhdGV9YCwgdHJhY2VJZCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ0FMTF9USU1FT1VUX08sIGBoYW5kbGVDYWxsVGltZW91dCB3aXRob3V0IHNlc3Npb24sIGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICB0aGlzLl9vblN0YXR1c0Rvd24oe1xuICAgICAgY2FsbElkLFxuICAgICAgdG9EZXZpY2VJZDogdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpLFxuICAgICAgY2FsbFN0YXR1czogUkNDYWxsUGx1c0NhbGxTdGF0ZS5FTkRFRCxcbiAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgY2FsbFNlc3Npb25Vc2Vyczogc2Vzc2lvbi5nZXRVc2VyTGlzdCgpLm1hcCgodXNlcikgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgc3RhdGVUaW1lLFxuICAgICAgICB9ID0gdXNlcjtcblxuICAgICAgICBsZXQgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uO1xuICAgICAgICBsZXQgc2Vzc2lvblN0YXR1czogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGU7XG4gICAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICBzeXNTdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNSZWFzb24uTUlTU0VEIDogUkNDYWxsUGx1c1JlYXNvbi5OT19BTlNXRVI7XG4gICAgICAgICAgc2Vzc2lvblN0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEIDogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN5c1N0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1JlYXNvbi5OT19BTlNXRVIgOiBSQ0NhbGxQbHVzUmVhc29uLk1JU1NFRDtcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzID0gdXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQgPyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIgOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RpbWU6IHN0YXRlVGltZSA/IHN0YXRlVGltZSArIDEgOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgIGNoYW5nZWQ6IDEsXG4gICAgICAgICAgaW52aXRlVXNlcklkOiBzZXNzaW9uLmdldENhbGxlcklkKCksXG4gICAgICAgICAgc3lzU3RhdHVzLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlkK/otoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX3N0YXJ0VGltZXIoY2FsbElkOiBzdHJpbmcsIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsIHRyYWNlSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8g5ZCv5Yqo5ZG85Y+r6LaF5pe26K6h5pe25ZmoXG4gICAgY29uc3QgdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9oYW5kbGVDYWxsVGltZW91dChjYWxsSWQsIHVzZXJTdGF0ZSwgdHJhY2VJZCk7XG4gICAgICAvLyDkuIrmiqUgY2FsbCBzZXJ2ZXIg6LaF5pe2XG4gICAgICB0aGlzLl9zaWduYWxNb2R1bGUuc3RhdHVzVXBDYWxsKHsgY2FsbElkLCBzZXNzaW9uU3RhdHVzOiB1c2VyU3RhdGUgfSwgdHJhY2VJZCk7XG4gICAgfSwgQ0FMTF9USU1FX09VVCk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfU1RBUlRfQ0FMTF9USU1FUl9PLCBgY2FsbElkOiAke2NhbGxJZH0sIHRpbWVySWQ6ICR7dGltZXJJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGltZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlgZzmraLotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX3N0b3BUaW1lcih0aW1lcklkOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfU1RPUF9DQUxMX1RJTUVSX08sIGB0aW1lcklkOiAke3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOmAmuivnemCgOivt1xuICAgKi9cbiAgcHJpdmF0ZSBfb25JbnZpdGUoZGF0YTogSVB1Ykludml0ZUNvbiwgaXNEaXJlY3RseTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBpbnZpdGVVc2VySWQsIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxTZXNzaW9uVXNlcnMsIHNlY3JldENoYXQsIGNhbGxpbmdVc2VySWQsXG4gICAgfSA9IGRhdGE7XG5cbiAgICBpZiAoc2VjcmV0Q2hhdCA9PT0gU2VjcmV0Q2FsbFR5cGUuU0VDUkVUKSB7XG4gICAgICAvLyDlpoLmnpzmmK/lr4bogYrpgJror53kuI3lpITnkIZcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbE1pc3MsIE9iamVjdC5hc3NpZ24oZGF0YSwge1xuICAgICAgICBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIHJlYXNvbjogUHViSW52aXRlQ2FsbE1pc3NSZWFzb24uU0VDUkVUX0NBTEwsXG4gICAgICAgIHJlZmVyOiBpc0RpcmVjdGx5ID8gUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUJfSU5WSVRFIDogUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUxMX0tWX0lOVklURSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzoh6rlt7HmmK/ooqvpgoDor7fnmoTnlKjmiLdcbiAgICBjb25zdCBpc0ludml0ZWUgPSBjYWxsU2Vzc2lvblVzZXJzLnNvbWUoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcbiAgICBpZiAoaXNJbnZpdGVlKSB7XG4gICAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgICAgdGhpcy5fYWJub3JtYWxNb2R1bGUuYWRkQWJub3JtYWxsQ2FsbElkKGN1cnJlbnRVc2VySWQsIGNhbGxJZCk7XG5cbiAgICAgIC8vIOeUn+aIkCBjYWxsU2Vzc2lvblxuICAgICAgY29uc3QgaW5uZXJTZXNzaW9uID0gbmV3IFJDQ2FsbElubmVyU2Vzc2lvbihcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLlJJTkdJTkcsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGludml0ZVVzZXJJZCxcbiAgICAgICAgaW52aXRlVXNlcklkLFxuICAgICAgICBbXSxcbiAgICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgKTtcbiAgICAgIC8vIGNhbGwgc2VydmVyIOWTjemTg+S4iuaKpVxuICAgICAgdGhpcy5fc2lnbmFsTW9kdWxlLnJpbmdpbmdDYWxsKHsgY2FsbElkIH0sIHRyYWNlSWQpO1xuXG4gICAgICAvKipcbiAgICAgICAqIOWQr+WKqOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgICovXG4gICAgICBjb25zdCBpbnZpdGVlVGltZXJJZCA9IHRoaXMuX3N0YXJ0VGltZXIoY2FsbElkLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQsIHRyYWNlSWQpO1xuICAgICAgaW5uZXJTZXNzaW9uLnVwZGF0ZVRpbWVySWQoQ2FsbFRpbWVyRXZlbnRUeXBlLklOVklURUUsIGludml0ZWVUaW1lcklkKTtcblxuICAgICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgICAvLyDnlJ/miJDkuLsgc2Vzc2lvblxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IGlubmVyU2Vzc2lvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOeUn+aIkOWJryBzZXNzaW9uc1xuICAgICAgICB0aGlzLl9ob2xkU2Vzc2lvbnMucHVzaChpbm5lclNlc3Npb24pO1xuICAgICAgICAvLyDmm7TmlrDkuLsgc2Vzc2lvbiDnirbmgIHkuLogSE9MRFxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5CVVNZTElORV9XQUlUKTtcbiAgICAgIH1cblxuICAgICAgLy8g5oqb5Ye65bex5pa56KKr6YKA6K+3XG4gICAgICBjb25zdCBjYWxsUGx1c1Nlc3Npb24gPSBuZXcgUkNDYWxsUGx1c1Nlc3Npb24oaW5uZXJTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGwoY2FsbFBsdXNTZXNzaW9uLCB0cmFjZUlkKTtcblxuICAgICAgY29uc3QgaW52aXRlU291cmNlID0gaXNEaXJlY3RseSA/IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UuUFVCX0lOVklURV9DQUxMIDogUkNDYWxsUGx1c0ludml0ZVNvdXJjZS5QVUxMX0tWX0lOVklURV9DQUxMO1xuICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX0lOVklURV9fLCBjYWxsUGx1c1Nlc3Npb24sIGludml0ZVNvdXJjZSk7XG5cbiAgICAgIGNvbnN0IG90aGVyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IGNhbGxTZXNzaW9uVXNlcnMubWFwKCh7XG4gICAgICAgIHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3lzU3RhdHVzLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgc3RhdHVzVGltZSxcbiAgICAgIH0pID0+ICh7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgc3RhdGVUaW1lOiBzdGF0dXNUaW1lLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcbiAgICAgIC8vIOaKm+WHuuS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgb3RoZXJzU3RhdGUsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgZXh0cmE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICByZWFzb246IFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLk5PVF9JTlZJVEVFLFxuICAgICAgICByZWZlcjogaXNEaXJlY3RseSA/IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVCX0lOVklURSA6IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVMTF9LVl9JTlZJVEUsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8g6L+H5ruk5Ye65YW25LuW55So5oi35ZKM6Ieq5bexXG4gICAgY29uc3Qgb3RoZXJJbnZpdGVkTWVtYmVyID0gY2FsbFNlc3Npb25Vc2Vycy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udXNlcklkICE9PSBjdXJyZW50VXNlcklkICYmIGl0ZW0udXNlcklkICE9PSBpbnZpdGVVc2VySWQgJiYgaXRlbS5zZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEKTtcbiAgICAvLyDmipvlh7rnvqTogYrkuK3ooqvpgoDor7fnmoTlhbbku5bkurpcbiAgICBpZiAob3RoZXJJbnZpdGVkTWVtYmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIOmAmuefpSBjYWxsVHlwZSDnsbvlnovlj5jmm7RcbiAgICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFICYmIHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICAgIHRoaXMuX29uQ2FsbFR5cGVDaGFuZ2UodGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksIFJDQ2FsbFBsdXNUeXBlLk1VTFRJLCB0cmFjZUlkKTtcbiAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZUNhbGxUeXBlKFJDQ2FsbFBsdXNUeXBlLk1VTFRJKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW52aXRlZE1lbWJlcjogSU90aGVyTWVtSW5mb1tdID0gW107XG4gICAgICBjb25zdCB1c2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgICAgb3RoZXJJbnZpdGVkTWVtYmVyLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN5c1N0YXR1cyB9ID0gaXRlbTtcbiAgICAgICAgaW52aXRlZE1lbWJlci5wdXNoKHsgY2FsbElkLCB1c2VySWQsIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyB9KTtcbiAgICAgICAgdXNlcnNTdGF0ZS5wdXNoKHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX29uT3RoZXJNZW1iZXJJbnZpdGUoaW52aXRlZE1lbWJlcik7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCB1c2Vyc1N0YXRlLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOaMguaWre+8iOWvueaWuemAmuivneWPlua2iOOAgemAmuivneaLkue7ne+8iVxuICAgKi9cbiAgcHJpdmF0ZSBfb25IYW5ndXAoZGF0YTogSUhhbmd1cEluZm9bXSwgY2FsbFNlc3Npb25hU3RhdHVzOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24hLmdldENhbGxJZCgpKSB7XG4gICAgICAgICAgaWYgKGl0ZW0udXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQU5DRUxMRUQpIHtcbiAgICAgICAgICAgIC8vIOa4hemZpOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgICAgICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g5ouS5o6l44CB5b+Z56KM44CB5pyq5o6l5ZCsIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgICAgICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVyVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAg5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9vbkFjY2VwdChkYXRhOiBJQWNjZXB0SW5mb1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0U2Vzc2lvblN0YXRlKCk7XG4gICAgY29uc3QgdW5OZWVkVXBTdGF0ZSA9IFtcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMLFxuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5CVVNZTElORV9XQUlULFxuICAgIF07XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEVcbiAgICAgICYmIHNlc3Npb25TdGF0ZSAmJiB1bk5lZWRVcFN0YXRlLmluY2x1ZGVzKHNlc3Npb25TdGF0ZSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydENhbGxlcklkID0gdGhpcy5fbWFpblNlc3Npb24hLmdldFN0YXJ0Q2FsbGVySWQoKTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8qKlxuICAgICAqIOWNleWRvOaUtuWIsOWvueaWueaOpeWQrOaXtu+8jOmcgOWujOaIkOWPkeW4g+i1hOa6kOS4gOezu+WIl+WKqOS9nFxuICAgICAqL1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFICYmIHN0YXJ0Q2FsbGVySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIGNvbnN0IGFjY2VwdFVzZXJJbmZvID0gZGF0YS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZnJvbVVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCk7XG4gICAgICBhY2NlcHRVc2VySW5mbyAmJiB0aGlzLmVtaXQoUkNDYWxsRW5naW5lLl9fSU5ORVJfU0VTU0lPTl9DT05ORUNUX18sIHRoaXMuZ2V0TG9jYWxNYWluU2Vzc2lvbigpIS5nZXRDYWxsSWQoKSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIC8vIOabtOaWsOS4uyBzZXNzaW9uIOeKtuaAgVxuICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5DT05ORUNUSU5HKTtcblxuICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlclRpbWVySWQoKSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw54q25oCB5LiL5Y+RXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9vblN0YXR1c0Rvd24oZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiDpgJror53nirbmgIHkuLrov57mjqXnirbmgIHml7bvvIzkv53lrZjmnI3liqHkuIvlj5HnmoTpgJror53lvIDlp4vml7bpl7RcbiAgICAgKi9cbiAgICBjb25zdCB7XG4gICAgICBjYWxsU3RhdHVzLCBzdGFydFRpbWUsIHN5bmNUaW1lLCBjYWxsSWQsXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGNhbGxJZCAhPT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0gPSB0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXSB8fCB7fTtcblxuICAgIC8qKlxuICAgICAqIOS4iuaKpemAmuivneW8gOWni+iuoeaXtuS6i+S7tlxuICAgICAqIOadoeS7tu+8mumAmuivneeKtuaAgeS4uiBPTkNBTEwg5LiU5pyq5LiK5oql6L+H6YCa6K+d5byA5aeL6K6h5pe25LqL5Lu2XG4gICAgICovXG4gICAgaWYgKCF0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXS5pc1JlY2VpdmVDYWxsU3RhcnRUaW1lXG4gICAgICAmJiBjYWxsU3RhdHVzID09PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0uaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZSA9IHRydWU7XG4gICAgICBjb25zdCB7IGNvZGUsIGNsaWVudFN0YXJ0VGltZSB9ID0gYXdhaXQgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5jYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZCwgc3RhcnRUaW1lISwgdHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKHtcbiAgICAgICAgICBjYWxsSWQsXG4gICAgICAgICAgY2FsbFN0YXJ0VGltZTogY2xpZW50U3RhcnRUaW1lISxcbiAgICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g6K6h566X5piv5ZCm6YCa6K+d57uT5p2fXG4gICAgbGV0IHNlbGZFbmQgPSBmYWxzZTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8vIOS4iuaKpeS6uuWRmOeKtuaAgeWPmOabtFxuICAgIGNvbnN0IGNoYW5nZWRVc2VycyA9IGRhdGEuY2FsbFNlc3Npb25Vc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGlzTGVmdCA9IFtcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRSxcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuREVDTElORUQsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCxcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSLFxuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQU5DRUxMRUQsXG4gICAgICBdLmluY2x1ZGVzKGl0ZW0uc2Vzc2lvblN0YXR1cyk7XG4gICAgICBpZiAoaXNMZWZ0ICYmIGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHNlbGZFbmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IGl0ZW0uc3lzU3RhdHVzLFxuICAgICAgICBzdGF0ZVRpbWU6IGl0ZW0uc3RhdHVzVGltZSxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY2hhbmdlZFVzZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgY2hhbmdlZFVzZXJzLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOayoeaciSBzZXNzaW9uIOS4jeWkhOeQhuS8muivneeKtuaAgeWPmOabtFxuICAgICAqL1xuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24gJiYgIXRoaXMuX2hvbGRTZXNzaW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDorqHnrpflh7rlk43lupTliqjkvZzvvIzlubbmipvlh7rkv6Hmga9cbiAgICBjb25zdCB7XG4gICAgICBoYW5ndXBEYXRhLCBhY2NlcHREYXRhLCBvdGhlckludml0ZWREYXRhLFxuICAgIH0gPSBwYXJzZVN0YXR1c0RhdGEoZGF0YSk7XG5cbiAgICBoYW5ndXBEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25IYW5ndXAoaGFuZ3VwRGF0YSwgZGF0YS5jYWxsU3RhdHVzLCB0cmFjZUlkKTtcbiAgICBhY2NlcHREYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25BY2NlcHQoYWNjZXB0RGF0YSwgdHJhY2VJZCk7XG5cbiAgICBpZiAob3RoZXJJbnZpdGVkRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5fb25PdGhlck1lbWJlckludml0ZShvdGhlckludml0ZWREYXRhKTtcbiAgICB9XG5cbiAgICAvLyDlj6rmnInlnKggY2FsbFNlc3Npb24g54q25oCB5Li6IEVuZGVkIOaXtumAmuefpSBvblNlc3Npb25DbG9zZVxuICAgIGlmIChkYXRhLmNhbGxTdGF0dXMgPT09IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQgfHwgc2VsZkVuZCkge1xuICAgICAgdGhpcy5zZXNzaW9uQ2xvc2UoZGF0YSwgdHJhY2VJZCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOWFtuS7luerr+eahOeKtuaAgeS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBfb25PdGhlckNsaWVudFN0YXR1c0Rvd24oZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNhbGxJZCwgY2FsbFNlc3Npb25Vc2VycywgY2FsbFN0YXR1cyB9ID0gZGF0YTtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGNhbGxTZXNzaW9uVXNlcnMuZmluZCgoeyB1c2VySWQgfSkgPT4gdXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcblxuICAgIGlmIChjdXJyZW50VXNlciAmJiAodGhpcy5fbWFpblNlc3Npb24gfHwgdGhpcy5faG9sZFNlc3Npb25zLmxlbmd0aCkpIHtcbiAgICAgIC8vIOaYr+W3seerr+eKtuaAgeWPmOabtOS4lOWtmOWcqCBzZXNzaW9uIOWGjeWOu+mAmuefpeS6uuWRmOeKtuaAgeWPmOabtOWbnuiwg++8jOS4jeWtmOWcqCBzZXNzaW9uIOS4jemcgOimgemAmuefpVxuICAgICAgY29uc3QgeyB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN0YXR1c1RpbWUgfSA9IGN1cnJlbnRVc2VyO1xuICAgICAgaWYgKHNlc3Npb25TdGF0dXMgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkcpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVzID0gW1JDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTCwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElOR107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWmguaenOiHquW3seacquaOpeWQrOS4u+mAmuivne+8jOaUtuWIsOWkmuerryBDb25uZWN0aW5nIOeKtuaAge+8jOmcgOaKm+WHuiBzZXNzaW9uQ2xvc2VcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGlzTWFpblNlc3Npb24gPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZDtcbiAgICAgICAgY29uc3QgY3VycmVudFVzZXJTYXRlID0gdGhpcy5fbWFpblNlc3Npb24/LmdldFVzZXJMaXN0KCkuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpPy51c2VyU3RhdGU7XG4gICAgICAgIGNvbnN0IGlzQWNjZXB0TWFpblNlc3Npb24gPSBpc01haW5TZXNzaW9uICYmIGN1cnJlbnRVc2VyU2F0ZSAmJiBzdGF0ZXMuaW5jbHVkZXMoY3VycmVudFVzZXJTYXRlKTtcbiAgICAgICAgaWYgKCFpc0FjY2VwdE1haW5TZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgW3tcbiAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9BQ0NFUFQsXG4gICAgICAgICAgICBzdGF0ZVRpbWU6IHN0YXR1c1RpbWUsXG4gICAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgfV0sIHRyYWNlSWQpO1xuXG4gICAgICAgICAgdGhpcy5zZXNzaW9uQ2xvc2UoZGF0YSwgdHJhY2VJZCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOS6i+S7tuS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfb25FdmVudERvd24oZGF0YTogSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgZXZlbnRUaW1lLCBldmVudEFyZ3MsIGV2ZW50VHlwZSwgZnJvbVVzZXJJZCxcbiAgICB9ID0gZGF0YTtcbiAgICBpZiAoZXZlbnRUeXBlID09PSBDYWxsU2VydmVyRXZlbnRUeXBlLkNBTExfRFVSQVRJT04gJiYgY2FsbElkID09PSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkpIHtcbiAgICAgIGNvbnN0IHsgZmlyc3RGcmFtZVRpbWUgfSA9IGV2ZW50QXJncyBhcyB7IGZpcnN0RnJhbWVUaW1lOiBudW1iZXIgfTtcbiAgICAgIC8vIOiuoeeul+W8gOWni+aXtumXtFxuICAgICAgY29uc3QgeyBjb2RlLCBjbGllbnRTdGFydFRpbWU6IGNsaWVudEZpcnN0RnJhbWVUaW1lIH0gPSBhd2FpdCB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmNhbGNDbGllbnRTdGFydFRpbWUoY2FsbElkLCBmaXJzdEZyYW1lVGltZSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9GSVJTVF9GUkFNRV9USU1FX08sIGBjbGllbnRGaXJzdEZyYW1lVGltZTogJHtjbGllbnRGaXJzdEZyYW1lVGltZX1gLCB0cmFjZUlkKTtcbiAgICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzSW5uZXJDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZShjYWxsSWQsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmuefpeWNleWRvCBkdXJhdGlvbiDlj5jmm7RcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdlNpbkNhbGxEdXJhdGlvbihjYWxsSWQ6IHN0cmluZywgY2xpZW50U3RhcnRUaW1lOiBudW1iZXIsIGNsaWVudEZpcnN0RnJhbWVUaW1lOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCkge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxTdGFydFRpbWUoeyBjYWxsSWQsIC4uLnsgY2FsbFN0YXJ0VGltZTogY2xpZW50U3RhcnRUaW1lIH0gfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbEZpcnN0RnJhbWVUaW1lKGNhbGxJZCwgY2xpZW50Rmlyc3RGcmFtZVRpbWUhLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw5aqS5L2T5Y+Y5pu055u45YWz5LqL5Lu2XG4gICAqL1xuICBwcml2YXRlIF9vblN3aXRjaE1lZGlhVHlwZShkYXRhOiBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgYWN0aW9uLCBleHRyYUtleVZhbCwgdHJhbnNhY3Rpb25JZCwgcHJvbW90ZXJJZCxcbiAgICB9ID0gZGF0YTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSwgcmVhc29uIH0gPSBleHRyYUtleVZhbDtcblxuICAgIGNvbnN0IGN1cnJlbnRDYWxsSWQgPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCk7XG4gICAgaWYgKGNhbGxJZCAhPT0gY3VycmVudENhbGxJZCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCBgbm90IGN1cnJlbnQgc2Vzc2lvbiBjYWxsSWQ6ICR7Y3VycmVudENhbGxJZH0sIHJlY3ZDYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHRyYW5zYWN0aW9uSWQ6IG9sZFRyYW5zSWQsIGFjdGlvbjogb2xkQWN0aW9uLCBtZWRpYVR5cGU6IE9sZE1lZGlhVHlwZSB9ID0gdGhpcy5fbWFpblNlc3Npb24/LmdldE9sZERpYWxvZ0RhdGEoKSB8fCB7fTtcbiAgICBpZiAob2xkVHJhbnNJZCA9PT0gdHJhbnNhY3Rpb25JZCAmJiBvbGRBY3Rpb24gPT09IGFjdGlvbiAmJiBPbGRNZWRpYVR5cGUgPT09IG1lZGlhVHlwZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCAnZHVwbGljYXRlIGRpYWxvZyBkYXRhJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCBgYWN0aW9uOiAke2FjdGlvbn0sIHJlYXNvbjogJHtyZWFzb259YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0T2xkRGlhbG9nRGF0YSh7IHRyYW5zYWN0aW9uSWQsIGFjdGlvbiwgbWVkaWFUeXBlIH0pO1xuXG4gICAgLy8g5Y2H57qn5rWB56iL5aSE55CGXG4gICAgaWYgKGFjdGlvbiA9PT0gRGlhbG9nQWN0aW9uLlJFUVVFU1QpIHtcbiAgICAgIHRoaXMuX29uUmVxdWVzdENoYW5nZU1lZGlhVHlwZSh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IHRyYW5zYWN0aW9uSWQhLFxuICAgICAgICB1c2VySWQ6IHByb21vdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gbnVsbDtcbiAgICAgIHN3aXRjaCAocmVhc29uKSB7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLkNBTkNFTDpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LkNBTkNFTF9DSEFOR0VfTUVESUFfVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uQUNDRVBUOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEU7XG4gICAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZU1lZGlhVHlwZSh0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0UmVxTWVkaWFUeXBlKCkhKTtcbiAgICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlUmVxTWVkaWFUeXBlKG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWxvZ0FjdGlvbi5SRUZVU0U6XG4gICAgICAgICAgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5SRUZVU0VfQ0hBTkdFX01FRElBX1RZUEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLlRJTUVPVVQ6XG4gICAgICAgICAgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5DSEFOR0VfTUVESUFfVFlQRV9USU1FT1VUO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0W2NoYW5nZU1lZGlhVHlwZVJlc3VsdCBhcyBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0XVxuICAgICAgJiYgdGhpcy5fcmVjZWl2ZU1lZGlhVHlwZUNoYW5nZVJlc3VsdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IHRyYW5zYWN0aW9uSWQhLFxuICAgICAgICB1c2VySWQ6IHByb21vdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgIH0sIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCBhcyBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICAvLyDpmY3nuqfpgJrnn6XlpITnkIZcbiAgICBpZiAoYWN0aW9uID09PSBEaWFsb2dBY3Rpb24uTk9USUNFICYmIG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyAmJiAhcmVhc29uKSB7XG4gICAgICB0aGlzLl9yZWNlaXZlTWVkaWFUeXBlQ2hhbmdlUmVzdWx0KHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogdHJhbnNhY3Rpb25JZCEsXG4gICAgICAgIHVzZXJJZDogcHJvbW90ZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgfSwgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5TRVJWRVJfQUxMT1dfTUVESUFfVFlQRSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCBjYWxsIGxvZyDml6Xlv5dcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdkNhbGxFbmRMb2coZGF0YTogSVB1YkNhbGxMb2csIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhbGxMb2cgPSB0cmFuMkNhbGxMb2coZGF0YSk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxSZWNvcmQoY2FsbExvZywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBwdWJsaWMgc2Vzc2lvbkNsb3NlKGRhdGE6IHsgY2FsbElkOiBzdHJpbmcsIHRvRGV2aWNlSWQ6IHN0cmluZ30sIHRyYWNlSWQ6IHN0cmluZywgaXNTZWxmSGFuZ3VwOiBib29sZWFuKSB7XG4gICAgY29uc3QgeyBjYWxsSWQgfSA9IGRhdGE7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvLyDmraPluLjnu5PmnZ/vvIzmuIXpmaTmnKzlnLDlrZjlgqjnmoQgY2FsbElkXG4gICAgdGhpcy5fYWJub3JtYWxNb2R1bGUucmVtb3ZlQWJub3JtYWxDYWxsSWRzKGN1cnJlbnRVc2VySWQsIFtjYWxsSWRdKTtcblxuICAgIGxldCBjbG9zZWRTZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKHNlc3Npb24pID0+IHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcbiAgICBpZiAoIWNsb3NlZFNlc3Npb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NMT1NFX1NFU1NJT05fTywgYHVuZXhwZWN0IHNlc3Npb24gY2FsbElkIC0+ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NMT1NFX1NFU1NJT05fTywgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvLyBzZXNzaW9uIGNsb3NlIOWQjue7k+adn+aJgOaciei2heaXtuiuoeaXtuWZqFxuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbi5nZXRBbGxUaW1lcklkcygpLmZvckVhY2goKHRpbWVySWQpID0+IHRoaXMuX3N0b3BUaW1lci5iaW5kKHRoaXMpKHRpbWVySWQsIHRyYWNlSWQpKTtcbiAgICAgIC8vIOe7k+adnyDkuIrmiqXnrKzkuIDluKdcbiAgICAgIGlmIChjbG9zZWRTZXNzaW9uLmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgICB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmtL7lj5HpgJror53nu5PmnZ/vvIzlpITnkIbpgJror53nu5PmnZ/lkI4gUlRDIOmAgOaIv+mXtOetiemAu+i+kVxuICAgICAqL1xuICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9TRVNTSU9OX0NMT1NFX18sIGNhbGxJZCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDkuIrmiqXpgJror53nu5PmnZ9cbiAgICAgKiDlpJrnq6/lhbbku5bnq6/mjILmlq3pgJror53vvIzpnIDmiormnKznq6/kurrlkZjns7vnu5/nirbmgIHovazljJbkuLogUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfSEFOR1VQXG4gICAgICovXG4gICAgY29uc3QgY3J0VXNlckRhdGEgPSBjbG9zZWRTZXNzaW9uLmdldFVzZXJMaXN0KCkuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpO1xuICAgIGxldCBoYW5ndXBSZWFzb247XG4gICAgaWYgKGlzU2VsZkhhbmd1cCAmJiBkYXRhLnRvRGV2aWNlSWQgIT09IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRTZXNzaW9uSWQoKSkge1xuICAgICAgaGFuZ3VwUmVhc29uID0gY2xvc2VkU2Vzc2lvbi5nZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKCkgPyBjcnRVc2VyRGF0YSEuc3lzdGVtU3RhdGUgOiBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9IQU5HVVA7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsRW5kZWQobmV3IFJDQ2FsbFBsdXNTZXNzaW9uKGNsb3NlZFNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlciksIGhhbmd1cFJlYXNvbiB8fCBjcnRVc2VyRGF0YSEuc3lzdGVtU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fcmVtb3ZlU2Vzc2lvbihjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg56e76ZmkIHNlc3Npb25cbiAgICovXG4gIHByaXZhdGUgX3JlbW92ZVNlc3Npb24oY2FsbElkOiBzdHJpbmcpIHtcbiAgICBpZiAoY2FsbElkID09PSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkpIHtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZEluZGV4KChzZXNzaW9uKSA9PiBzZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcbiAgICAgIHRoaXMuX2hvbGRTZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDkuI3lrZjlnKggbWFpblNlc3Npb24g5pe277yM5LuO5pyN5Yqh56uv6I635Y+W5pWw5o2u55Sf5oiQIG1haW5TZXNzaW9uLCDlubbpgJrnn6XkurrlkZjnirbmgIHlj5jmm7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZVNlc3Npb25CeVNlcnZlcihjYWxsSWQ6IHN0cmluZywgaXNOZWVkVXA6Ym9vbGVhbiA9IGZhbHNlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5nZXRDYWxsU2Vzc2lvbih7IGNhbGxJZCB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfUiwgYGVycmNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1IsIGBjb2RlOiAke2NvZGV9LCBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWAsIHRyYWNlSWQpO1xuXG4gICAgY29uc3Qge1xuICAgICAgY2FsbFR5cGUsIG1lZGlhVHlwZSwgY2FsbFNlc3Npb25Vc2Vycywgc3RhcnRDYWxsZXJJZCxcbiAgICB9ID0gZGF0YSE7XG5cbiAgICAvLyDnlJ/miJDkuLsgc2Vzc2lvblxuICAgIHRoaXMuX21haW5TZXNzaW9uID0gbmV3IFJDQ2FsbElubmVyU2Vzc2lvbihcbiAgICAgIGNhbGxJZCxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyxcbiAgICAgIGNhbGxUeXBlLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgc3RhcnRDYWxsZXJJZCxcbiAgICAgIHN0YXJ0Q2FsbGVySWQsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICApO1xuICAgIGlmIChpc05lZWRVcCkge1xuICAgICAgdGhpcy5fY2xlYXJNb2JpbGVPblBob25lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuICAgIC8vIOS6uuWRmOeKtuaAgeWPmOabtOmAmuefpVxuICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIGNhbGxTZXNzaW9uVXNlcnMsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWFvOWuueenu+WKqOerryBvblBob25lIOaXoOazlea2iOmZpOmXrumimFxuICAgKiBBMSDnp7vliqjnq6/lkowgQiDmraPlnKggY2FsbCDkuK3vvIzkuJQgb25QaG9uZSDnirbmgIHvvIwgQTEg5p2A6L+b56iL5ZCO77yMQiDnq6/lsZXnpLrnmoQgb25QaG9uZSDnirbmgIHml6Dms5XmtojlpLFcbiAgICogQTIg5aSa56uv5Zyo5o6l5ZCs5ZKM55u05o6l5Yqg5YWlIGNhbGwg5pe277yM5LiK5oqlIG9uUGhvbmVFbmQg54q25oCB77yM5raI6ZmkIEIg56uv5bGV56S655qEIG9uUGhvbmUg54q25oCBXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jbGVhck1vYmlsZU9uUGhvbmUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlc3Npb24gPSBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZmluZCgoaXRlbSkgPT4gaXRlbT8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5zeXN0ZW1TdGF0dXNVcCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FX0VORCxcbiAgICAgICAgZm9yd2FyZDogRm9yd2FyZFR5cGUuQ1VSUkVOVCxcbiAgICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1IsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9SLCBgY2FsbElkOiAke2NhbGxJZH0sIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDljp8gY2xpZW50IOS4reWumuS5ieeahOS6i+S7tlxuICBwcml2YXRlIF9vblVzZXJTdGF0ZUNoYW5nZShjYWxsSWQ6IHN0cmluZywgdXNlcnM6IElTZXNzaW9uVXNlcltdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBjb25zdCB7IHVzZXJJZCwgdXNlclN0YXRlLCBzeXN0ZW1TdGF0ZSB9ID0gdXNlcjtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZSxcbiAgICAgICAgcmVhc29uOiBzeXN0ZW1TdGF0ZSxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog5pS25Yiw6Ieq5bexIHN5c3RlbVN0YXRlIOS4uiA5OTnvvIznm7TmjqXnprvlvIDmiL/pl7RcbiAgICAgKiDlpITnkIbooqvlj6vmjqXlkKznmoTnnqzpl7TvvIzkuLvlj6vlkIzml7bmjILmlq3nmoTmg4XlhrXvvIzkuI3mjonnprvlvIDmiL/pl7TpgJror53kuI3kvJrnu5PmnZ9cbiAgICAgKi9cbiAgICB1c2Vycy5mb3JFYWNoKCh7IHVzZXJJZCwgc3lzdGVtU3RhdGUgfSkgPT4ge1xuICAgICAgaWYgKHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCAmJiBzeXN0ZW1TdGF0ZSA9PT0gUkNDYWxsUGx1c1JlYXNvbi5BQk5PUk1BTF9FTkQpIHtcbiAgICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uT3RoZXJNZW1iZXJJbnZpdGUoaW5mbzogSU90aGVyTWVtSW5mb1tdKSB7XG4gICAgaW5mby5mb3JFYWNoKChpbmZvKSA9PiB7XG4gICAgICBjb25zdCB7IHVzZXJJZCwgY2FsbElkIH0gPSBpbmZvO1xuICAgICAgY29uc3QgaW52aXRlclVzZXJJZCA9IHRoaXMuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRJbnZpdGVyVXNlcklkKCk7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZVVzZXJJbnZpdGVkKFt1c2VySWRdLCBpbnZpdGVyVXNlcklkISwgY2FsbElkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUmVxdWVzdENoYW5nZU1lZGlhVHlwZShpbmZvOiBJQ2hhbmdlTWVkaWFUeXBlSW5mbywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyB1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSB9ID0gaW5mbztcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCh1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWNlaXZlTWVkaWFUeXBlQ2hhbmdlUmVzdWx0KGluZm86IElDaGFuZ2VNZWRpYVR5cGVJbmZvLCBjb2RlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5TRVJWRVJfQUxMT1dfTUVESUFfVFlQRSkge1xuICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX0NIQU5HRV9NRURJQV9UWVBFX18sIGluZm8ubWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCh7XG4gICAgICAuLi5pbmZvLFxuICAgICAgY29kZSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQ2FsbFR5cGVDaGFuZ2UoY2FsbElkOiBzdHJpbmcsIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsVHlwZUNoYW5nZWQoY2FsbFR5cGUsIGNhbGxJZCwgdHJhY2VJZCk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIFJUQ1Jlc291cmNlVGFnIHtcbiAgLyoqXG4gICAqIOaZrumAmumfs+inhumikea1gVxuICAgKi9cbiAgTk9STUFMID0gJ1JvbmdDbG91ZFJUQycsXG4gIC8qKlxuICAgKiDlsY/luZXliIbkuqvmtYFcbiAgICovXG4gIFNDUkVFTiA9ICdTY3JlZW5TaGFyZSdcbn1cbiIsImltcG9ydCB7XG4gIFBsdWdpbkNvbnRleHQsIElSdW50aW1lLCBSVENNb2RlLCBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyLCBpc0Jvb2xlYW4sXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDUlRDUm9vbSxcbiAgUkNSVENDbGllbnQsXG4gIFJDUlRDQ29kZSxcbiAgUkNMb2NhbFRyYWNrLFxuICBSQ1JlbW90ZVRyYWNrLFxuICBSQ0xvY2FsQXVkaW9UcmFjayxcbiAgSVN1YnNjcmliZUF0dHIsXG4gIFJDUmVtb3RlVmlkZW9UcmFjayxcbiAgUkNSZW1vdGVBdWRpb1RyYWNrLFxuICBSQ0tpY2tSZWFzb24sXG4gIFJDVHJhY2ssXG4gIFJDTG9jYWxWaWRlb1RyYWNrLFxuICBJUHVibGlzaEF0dHJzLFxuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgaGVscGVyLFxufSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHtcbiAgSUF1ZGlvQ29uZmlnLFxuICBJQ2FsbFBsdXNJbml0T3B0cyxcbiAgSVN0YXR1c1JlcG9ydExpc3RlbmVyLFxuICBJVmlkZW9Db25maWcsXG4gIFJDQ2FsbFBsdXNDb2RlLFxuICBSQ0NhbGxQbHVzRnJhbWVSYXRlLFxuICBSQ0NhbGxQbHVzTWVkaWFUeXBlLFxuICBSQ0NhbGxQbHVzUGFja2V0TG9zc1N0YXRzLFxuICBSQ0NhbGxQbHVzUmVzb2x1dGlvbixcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSVENSZXNvdXJjZVRhZyB9IGZyb20gJy4uL2VudW1zL1JUQ1Jlc291cmNlVGFnJztcbmltcG9ydCB7IHJldHJ5QXN5bmNGbiB9IGZyb20gJy4uL3V0aWxzL3JldHJ5JztcbmltcG9ydCB7IENhbGxIb29rc1R5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsSG9va3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcbmltcG9ydCB7IFJDQ2FsbEtpY2tFeHRyYSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJUQ01vZHVsZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgSU1lZGlhTXV0ZUNoYW5nZUluZm8sIElNZW1iZXJJbmZvIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbEVuZ2luZSB9IGZyb20gJy4uL1JDQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcblxuaW50ZXJmYWNlIElKb2luUlRDUm9vbVJlcyB7XG4gIGNvZGU6IFJDUlRDQ29kZTtcbiAgcm9vbT86IFJDUlRDUm9vbSB8IHVuZGVmaW5lZDtcbiAgdXNlcklkcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJhY2tzPzogUkNSZW1vdGVUcmFja1tdIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgSVN1YlJlcyB7XG4gIGNvZGU6IFJDUlRDQ29kZTtcbiAgZmFpbGVkTGlzdD86IChJU3Vic2NyaWJlQXR0cilbXSB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIElQdWJSZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIGxpdmVVcmw/OiBzdHJpbmcgfCB1bmRlZmluZWRcbn1cblxuaW50ZXJmYWNlIFJDS2lja0V4dHJhIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgUlRDTW9kdWxlIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc3RhdGljIF9fSU5ORVJfUlRDX1BST0NFU1NfRkFJTEVEX186IHN0cmluZyA9ICdpbm5lci1ydGMtcHJvY2Vzcy1mYWlsZWQnXG5cbiAgc3RhdGljIF9fSU5ORVJfUlRDX1BFRVJDT05ORUNUSU9OX0FCTk9STUFMX0NMT1NFX186IHN0cmluZyA9ICdpbm5lci1ydGMtcGVlcmNvbm5lY3Rpb24tYWJub3JtYWwtY2xvc2UnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fU0VMRl9KT0lORURfXzogc3RyaW5nID0gJ2lubmVyLW9uLXNlbGYtam9pbmVkJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX09USEVSX0pPSU5FRF9fOiBzdHJpbmcgPSAnaW5uZXItb24tb3RoZXItam9pbmVkJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXzogc3RyaW5nID0gJ2lubmVyLXJlY2VpdmUtZmlyc3QtZnJhbWUnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fS0lDS09GRl9fOiBzdHJpbmcgPSAnaW5uZXIta2lja29mZi1mcmFtZSdcblxuICBzdGF0aWMgX19JTk5FUl9PTl9ERVZJQ0VfRU5BQkxFX0NIQU5HRV9fOiBzdHJpbmcgPSAnaW5uZXItb24tZGV2aWNlLWVuYWJsZS1jaGFuZ2UnXG5cbiAgLyoqXG4gICAqIFJDUlRDIOWunuS+i1xuICAgKi9cbiAgcHVibGljIF9ydGNDbGllbnQ6IFJDUlRDQ2xpZW50XG5cbiAgLyoqXG4gICAqIOW3seaWueeahOmfs+inhumikSB0cmFja3NcbiAgICovXG4gIHByaXZhdGUgX2xvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdXG5cbiAgLyoqXG4gICAqIFJDUlRDUm9vbSDlrp7kvotcbiAgICovXG4gIHB1YmxpYyBfcm9vbTogUkNSVENSb29tIHwgbnVsbCA9IG51bGxcblxuICBwcml2YXRlIF9jYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgcHJpdmF0ZSBfY2FsbE1lZGlhVHlwZSE6IFJDQ2FsbFBsdXNNZWRpYVR5cGVcblxuICBwcml2YXRlIF92aWRlb0NvbmZpZzogSVZpZGVvQ29uZmlnID0ge1xuICAgIHJlc29sdXRpb246IFJDQ2FsbFBsdXNSZXNvbHV0aW9uLlc2NDBfSDQ4MCxcbiAgICBmcmFtZVJhdGU6IFJDQ2FsbFBsdXNGcmFtZVJhdGUuRlBTXzE1LFxuICB9XG5cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZyA9IHt9XG5cbiAgcHJpdmF0ZSBfaXNQdWJUaW55OiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog6KeG6aKR6YWN572u5piv5ZCm5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIF92aWRlb0NvbmZpZ0lzQ2hhbmdlOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog6Z+z6aKR6YWN572u5piv5ZCm5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIF9hdWRpb0NvbmZpZ0lzQ2hhbmdlOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog5a2Y5YKo6K6+572u55qE5Lq65ZGY5ZKM6KeG5Zu+XG4gICAqL1xuICBwcml2YXRlIF91c2VyVmlld01hcDogeyBbdXNlcklkOiBzdHJpbmddOiB7IHZpZGVvVmlldzogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55OiBib29sZWFuIH0gfSA9IHt9XG5cbiAgcHJpdmF0ZSBfY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcjogSVN0YXR1c1JlcG9ydExpc3RlbmVyIHwgbnVsbCA9IG51bGxcblxuICBwcml2YXRlIF9yZW1vdGVBdWRpb0VuYWJsZTogYm9vbGVhbiA9IHRydWVcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRPcHRzOiBJQ2FsbFBsdXNJbml0T3B0cyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZXBvcnRBcHBFdmVudE1vZHVsZTogUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9ydGNDbGllbnQgPSBfaW5pdE9wdHM/LnJ0Y0NsaWVudDtcbiAgICB0aGlzLl9pc1B1YlRpbnkgPSBfaW5pdE9wdHMuaXNQdWJUaW55IHx8IGZhbHNlO1xuICB9XG5cbiAgc2V0Q2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcihsaXN0ZW5lcjogSVN0YXR1c1JlcG9ydExpc3RlbmVyKSB7XG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPluaRhOWDj+WktOi1hOa6kFxuICAgKiDlhoXlrZjkuK3mnInml7bvvIzov5Tlm57lhoXlrZjkuK3nmoTop4bovahcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYW1lcmFWaWRlb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVHJhY2t9PiB7XG4gICAgY29uc3QgZGVmYXVsdFZpZGVvVHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IChkZWZhdWx0VmlkZW9UcmFjayAmJiAhdGhpcy5fdmlkZW9Db25maWdJc0NoYW5nZSkgPyB7IHRyYWNrOiBkZWZhdWx0VmlkZW9UcmFjaywgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9IDogYXdhaXQgdGhpcy5fY3JlYXRlVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICB0aGlzLl92aWRlb0NvbmZpZ0lzQ2hhbmdlID0gZmFsc2U7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICB0cmFjayxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlum6puWFi+mjjui1hOa6kFxuICAgKiDlhoXlrZjkuK3mnInml7bvvIzov5Tlm57lhoXlrZjkuK3nmoTpn7PovahcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRNaWNyb3Bob25lQXVkaW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IGRlZmF1bHRBdWRpb1RyYWNrID0gdGhpcy5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSAoZGVmYXVsdEF1ZGlvVHJhY2sgJiYgIXRoaXMuX2F1ZGlvQ29uZmlnSXNDaGFuZ2UpID8geyB0cmFjazogZGVmYXVsdEF1ZGlvVHJhY2ssIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfSA6IGF3YWl0IHRoaXMuX2NyZWF0ZUF1ZGlvVHJhY2sodHJhY2VJZCk7XG4gICAgdGhpcy5fYXVkaW9Db25maWdJc0NoYW5nZSA9IGZhbHNlO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICB0cmFjayxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNrumAmuivneexu+Wei+WIm+W7uumfs+OAgeinhumikei1hOa6kFxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOmfs+mikeaIlumfs+inhumikVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9jYWxsTWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5nZXRNaWNyb3Bob25lQXVkaW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5nZXRDYW1lcmFWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWaWRlb0NvbmZpZyh2aWRlb0NvbmZpZzogSVZpZGVvQ29uZmlnKSB7XG4gICAgdGhpcy5fdmlkZW9Db25maWdJc0NoYW5nZSA9IHRydWU7XG4gICAgdGhpcy5fdmlkZW9Db25maWcgPSB2aWRlb0NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyBzZXRBdWRpb0NvbmZpZyhhdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnKSB7XG4gICAgdGhpcy5fYXVkaW9Db25maWdJc0NoYW5nZSA9IHRydWU7XG4gICAgdGhpcy5fYXVkaW9Db25maWcgPSBhdWRpb0NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0RFU1RST1lfQUxMX1RSQUNLU19PLCAnJywgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHVibGljIHNldEFsbFJlbW90ZUF1ZGlvRW5hYmxlKGVuYWJsZTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX0FMTF9SRU1PVEVfQVVESU9fRU5BQkxFX1QsIGBlbmFibGU6ICR7ZW5hYmxlfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCFpc0Jvb2xlYW4oZW5hYmxlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9SLCBgcGFyYW0gZXJyb3IsIGVuYWJsZTogdHlwZSBpcyBib29sZWFuLCB2YWx1ZTogJHtlbmFibGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIHRoaXMuX3JlbW90ZUF1ZGlvRW5hYmxlID0gZW5hYmxlO1xuXG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgYXVkaW9UcmFja3MgPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFja3MoKS5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgYXVkaW9UcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGlmIChlbmFibGUpIHtcbiAgICAgICAgdHJhY2sudW5tdXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFjay5tdXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVzdHJveVRyYWNrKHRyYWNrOiBSQ0xvY2FsVHJhY2spIHtcbiAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9sb2NhbFRyYWNrcy5maW5kSW5kZXgoKGxvY2FsVHJhY2spID0+IGxvY2FsVHJhY2suZ2V0VHJhY2tJZCgpID09PSB0cmFjay5nZXRUcmFja0lkKCkpO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogc2Vzc2lvbiDov57mjqVcbiAgICovXG4gIGFzeW5jIHNlc3Npb25Db25uZWN0ZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAvLyAxLiDliqDmiL/pl7RcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgcm9vbSB9ID0gYXdhaXQgdGhpcy5qb2luUlRDUm9vbShjYWxsSWQsIHRyYWNlSWQpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUiwgYGVyckNvZGUgLT4gJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyDms6jlhowgUlRDIOebuOWFs+ebkeWQrFxuICAgICAgICB0aGlzLl9jYWxsSWQgPSBjYWxsSWQ7XG4gICAgICAgIHRoaXMuX3JlZ1JUQ0xpc3RlbmVycygpO1xuXG4gICAgICAgIHRoaXMuX3Jvb20gPSByb29tITtcbiAgICAgICAgY29uc3Qgcm9vbVVzZXJzSWQgPSB0aGlzLl9yb29tPy5nZXRSZW1vdGVVc2VySWRzKCkgfHwgW107XG4gICAgICAgIGlmIChyb29tVXNlcnNJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fb25PdGhlck1lbUpvaW5lZChyb29tVXNlcnNJZC5tYXAoKHVzZXJJZCkgPT4gKHsgY2FsbElkLCB1c2VySWQgfSkpLCB0cmFjZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBjYWxsSWQgLT4gJHtjYWxsSWR9LCBlcnIgbXNnIC0+ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIDIuIOWPkeW4g+a1gVxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5fbG9jYWxUcmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vbkJlZm9yZVB1Ymxpc2gpO1xuICAgICAgICBjb25zdCBwdWJQYXJhbXMgPSB0aGlzLl9pc1B1YlRpbnlcbiAgICAgICAgICA/IHRoaXMuX2xvY2FsVHJhY2tzLm1hcCgodHJhY2spID0+ICh0cmFjay5pc1ZpZGVvVHJhY2soKSA/IHsgdHJhY2ssIGlzUHViVGlueTogdHJ1ZSB9IDogdHJhY2spKVxuICAgICAgICAgIDogdGhpcy5fbG9jYWxUcmFja3M7XG4gICAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5wdWJsaXNoKHB1YlBhcmFtcywgdHJhY2VJZCk7XG4gICAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHVibGlzaFJlcywgY29kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUCwgJ3Nlc3Npb25Db25uZWN0ZWQgbG9jYWwgdHJhY2tzIGlzIGVtcHR5JywgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUiwgYHB1Ymxpc2ggRXhjZXB0aW9uIGNhbGxJZCAtPiAke2NhbGxJZH0sIGVyciBtc2cgLT4gJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gIH1cblxuICBhc3luYyBzZXNzaW9uQ2xvc2UoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ0xPU0VfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDplIDmr4HmnKznq6/otYTmupBcbiAgICAgKi9cbiAgICB0aGlzLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG5cbiAgICBjb25zdCBjdXJyZW50Um9vbUlkID0gdGhpcy5fcm9vbT8uZ2V0Um9vbUlkKCk7XG4gICAgaWYgKHRoaXMuX3Jvb20gJiYgY2FsbElkID09PSBjdXJyZW50Um9vbUlkKSB7XG4gICAgICAvLyDpgIDlh7rmiL/pl7RcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmxlYXZlUm9vbSh0aGlzLl9yb29tKTtcbiAgICAgIC8vIOazqOmUgOWGheWtmOaVsOaNrlxuICAgICAgdGhpcy5fcmVsZWFzZVN0b3JlZERhdGEoKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9SLCBgbGVhdmVSb29tIGZhaWxlZCwgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IsICdsZWF2ZVJvb20gc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IsICdsZWF2ZVJvb20gdGhyb3cgZXhjZXB0aW9uOiBub3QgaW4gcm9vbScsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjop4bpopEgdHJhY2tcbiAgICovXG4gIGFzeW5jIGRpc2FibGVWaWRlb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGUsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5DQU1FUkFfQ0xPU0VEIH07XG4gICAgfVxuXG4gICAgLy8g56aB55So6KeG6aKRXG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHRyYWNrLm11dGUoKTtcblxuICAgIHJldHVybiB7IGNvZGUsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog5ZCv55So6KeG6aKRdHJhY2tcbiAgICogMS4g5ZCv55So5YmN5bqU55So5bGC6ZyA5YWI5Yib5bu66KeG6aKRIHRyYWNrXG4gICAqL1xuICBhc3luYyBlbmFibGVWaWRlb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGV9PiB7XG4gICAgLy8g6I635Y+W5pys56uv6KeG6aKRIHRyYWNrXG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLkNBTUVSQV9DTE9TRUQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlpoLmnpzotYTmupDmsqHooqvnpoHnlKjvvIzov5Tlm57miJDlip9cbiAgICAgKi9cbiAgICBpZiAoIXRyYWNrIS5pc093bmVyTXV0ZWQoKSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWQr+eUqOi1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0cmFjayEudW5tdXRlKCk7XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneS4reWIh+aNouinhumikeiuvuWkh1xuICAgKi9cbiAgYXN5bmMgY2hhbmdlVmlkZW9EZXZpY2UodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVHJhY2sgfT4ge1xuICAgIC8vIOaWsOiuvuWkh+eahOi9qFxuICAgIGNvbnN0IHJlY2VudFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICAvLyDmlbTnkIblkI7nmoTovahcbiAgICBjb25zdCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKFJUQ1Jlc291cmNlVGFnLk5PUk1BTCwgdGhpcy5fdmlkZW9Db25maWcpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fdmlkZW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIGxldCBuZWVkRGVzdHJveVRyYWNrOiBSQ0xvY2FsVHJhY2s7XG4gICAgdGhpcy5fbG9jYWxUcmFja3MgJiYgdGhpcy5fbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSkge1xuICAgICAgICAvLyDotYTmupDph4rmlL5cbiAgICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgICAgICBuZWVkRGVzdHJveVRyYWNrID0gdHJhY2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOS7juacrOWcsOe8k+WtmOS4reWIoOmZpOmUgOavgeeahCB0cmFja1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzID0gdGhpcy5fbG9jYWxUcmFja3MuZmlsdGVyKChpdGVtKSA9PiBuZWVkRGVzdHJveVRyYWNrICYmIChpdGVtLmdldFRyYWNrSWQoKSAhPT0gbmVlZERlc3Ryb3lUcmFjay5nZXRUcmFja0lkKCkpKTtcblxuICAgIHJlY2VudFRyYWNrcy5wdXNoKHRyYWNrISk7XG5cbiAgICAvLyDnu5nmnKzlnLDliqDkuIrmlrDkuqfnlJ/nmoTop4bpopFcbiAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG5cbiAgICB0aGlzLl9sb2NhbFRyYWNrcyA9IGxvY2FsVHJhY2tzO1xuXG4gICAgLy8g6YCa55+l5LiK5bGCIHRyYWNrUmVhZHlcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShyZWNlbnRUcmFja3MsIHRyYWNlSWQpO1xuXG4gICAgLy8g5bey5Yqg5YWl5oi/6Ze0XG4gICAgaWYgKHRoaXMuX3Jvb20pIHtcbiAgICAgIC8vIOWPkeW4g+a1gVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2gocmVjZW50VHJhY2tzKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjpn7PpopEgdHJhY2tcbiAgICovXG4gIGFzeW5jIGRpc2FibGVBdWRpb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGUsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NSUNST1BIT05FX0NMT1NFRCB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOmfs+mikVxuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0cmFjay5tdXRlKCk7XG5cbiAgICByZXR1cm4geyBjb2RlLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWqkuS9k+exu+Wei+WNh+OAgemZjVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfVCwgYG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgLyoqXG4gICAgICog5Y2H57qnIOmfs+mikSAtPiDpn7Pop4bpopFcbiAgICAgKiAxLiDkuJrliqHlsYLpnIDopoHlhYjpgJrov4cgY3JlYXRlTG9jYWxUcmFja3Mg5Yib5bu65pys5Zyw6KeG6aKRIHRyYWNrXG4gICAgICogMi4gU0RLIOWPquWkhOeQhuWPkeW4g+inhumikSB0cmFja1xuICAgICAqL1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIC8vIDEuIOiOt+WPlue8k+WtmOS4reeahOinhumikSB0cmFja1xuICAgICAgbGV0IHRyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgY29uc3QgeyBjb2RlLCB0cmFjazogbmV3VHJhY2sgfSA9IGF3YWl0IHRoaXMuX2NyZWF0ZVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBjcmVhdGUgdmlkZW8gdHJhY2sgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cmFjayA9IG5ld1RyYWNrO1xuICAgICAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX3ZpZGVvQ29uZmlnO1xuICAgICAgICAobWluQml0cmF0ZSB8fCBtYXhCaXRyYXRlKSAmJiB0cmFjayEuc2V0Qml0cmF0ZShtYXhCaXRyYXRlISwgbWluQml0cmF0ZSEpO1xuICAgICAgfVxuICAgICAgLy8gMi4g5Y+R5biD5rWBXG4gICAgICBjb25zdCBwdWJQYXJhbXMgPSB0aGlzLl9pc1B1YlRpbnkgPyB7IHRyYWNrOiB0cmFjayEsIGlzUHViVGlueTogdHJ1ZSB9IDogdHJhY2shO1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLnB1Ymxpc2goW3B1YlBhcmFtc10sIHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwdWJsaXNoIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmZjee6pyDpn7Pop4bpopEgLT4g6Z+z6aKRXG4gICAgICovXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgLy8gMS4g6I635Y+W5pys5Zyw6KeG6aKRIHRyYWNrXG4gICAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG5cbiAgICAgIGlmICh0cmFjaykge1xuICAgICAgICAvLyDlj5bmtojlj5HluIPop4bpopFcbiAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tIS51bnB1Ymxpc2goW3RyYWNrXSk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgdW5wdWJsaXNoIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOmHiuaUvuinhumikSB0cmFja1xuICAgICAgICB0aGlzLmRlc3Ryb3lUcmFjayh0cmFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Yqg5YWlIFJUQyDmiL/pl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBqb2luUlRDUm9vbShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgcm9vbT86IFJDUlRDUm9vbSwgdHJhY2tzPzogUkNSZW1vdGVUcmFja1tdIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1QsIGBjYWxsOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUsIHJvb20sIHRyYWNrcyB9ID0gYXdhaXQgcmV0cnlBc3luY0ZuIDxJSm9pblJUQ1Jvb21SZXM+KHtcbiAgICAgIGFzeW5jRm46IHRoaXMuX3J0Y0NsaWVudC5qb2luUlRDUm9vbS5iaW5kKHRoaXMuX3J0Y0NsaWVudCksXG4gICAgICBmbkFyZ3M6IFtjYWxsSWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmYWxzZSwgUlRDTW9kZS5DQUxMXSxcbiAgICB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IsIGBjYWxsSWQ6ICR7Y2FsbElkfSwgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uSk9JTl9ST09NX0VSUiwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfSk9JTl9SVENfUk9PTV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX3Jvb20gPSByb29tITtcbiAgICB0aGlzLl9vblNlbGZKb2luZWQoeyBjYWxsSWQsIHVzZXJJZDogdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSB9LCB0cmFjZUlkKTtcbiAgICB0cmFja3M/Lmxlbmd0aCAmJiB0aGlzLl9vblJlbW90ZVRyYWNrUHVibGlzaCh0cmFja3MpO1xuXG4gICAgdGhpcy5fY2FsbElkID0gY2FsbElkO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHJvb20sIHRyYWNrcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJUQyDorqLpmIVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWJzY3JpYmVUcmFja3ModHJhY2tzOiAoSVN1YnNjcmliZUF0dHIpW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NVQlNDUklCRV9ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBwYXJhbXM6IHRyYWNrcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB0cmFjaywgc3ViVGlueSB9ID0gaXRlbTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0cmFja0lkOiB0cmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgICAgc3ViVGlueSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgcmV0cnlBc3luY0ZuIDxJU3ViUmVzPih7XG4gICAgICBhc3luY0ZuOiB0aGlzLl9yb29tIS5zdWJzY3JpYmUuYmluZCh0aGlzLl9yb29tKSxcbiAgICAgIGZuQXJnczogW3RyYWNrc10sXG4gICAgICBvbkVycm9yOiAoY29kZSkgPT4ge30sXG4gICAgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vbkZldGNoUmVtb3RlTWVkaWFFcnJvcih0cmFja3MsIGNvZGUpO1xuXG4gICAgICB0aGlzLl9vblJUQ01ldGhvZEZhaWwoUkNDYWxsUGx1c1JlYXNvbi5TVUJTQ1JJQkVfRVJSLCB0cmFjZUlkKTtcblxuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SLCBgZXJyb3JDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJUQyDlj5bmtojorqLpmIVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnN1YnNjcmliZVRyYWNrcyh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfVU5TVUJTQ1JJQkVfVCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdHJhY2tJZHM6IHRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbSEudW5zdWJzY3JpYmUodHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9SLCBgZXJyb3JDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfVU5TVUJTQ1JJQkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwcml2YXRlIF9yZWxlYXNlU3RvcmVkRGF0YSgpIHtcbiAgICB0aGlzLl9yb29tID0gbnVsbDtcbiAgICB0aGlzLl9yZW1vdGVBdWRpb0VuYWJsZSA9IHRydWU7XG4gICAgdGhpcy5fdXNlclZpZXdNYXAgPSB7fTtcbiAgfVxuXG4gIGdldFJlbW90ZVRyYWNrcygpOiB7IFt1c2VySWQ6IHN0cmluZ106IFJDUmVtb3RlVHJhY2tbXX0ge1xuICAgIGNvbnN0IHRyYWNrczogeyBbdXNlcklkOiBzdHJpbmddOiBSQ1JlbW90ZVRyYWNrW119ID0ge307XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4gdHJhY2tzO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJJZHMgPSB0aGlzLl9yb29tLmdldFJlbW90ZVVzZXJJZHMoKTtcbiAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICB0cmFja3NbdXNlcklkXSA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrc0J5VXNlcklkKHVzZXJJZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNrcztcbiAgfVxuXG4gIGdldFJlbW90ZVRyYWNrKHVzZXJJZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vbT8uZ2V0UmVtb3RlVHJhY2tzQnlVc2VySWQodXNlcklkKS5maW5kKCh0cmFjaykgPT4gKChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pID8gdHJhY2suaXNBdWRpb1RyYWNrKCkgOiB0cmFjay5pc1ZpZGVvVHJhY2soKSkpO1xuICB9XG5cbiAgLyoqID09PT09PeengeacieaWueazlT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICAvKipcbiAgICogUlRDIOS6i+S7tuebkeWQrOazqOWGjFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnUlRDTGlzdGVuZXJzKCkge1xuICAgIC8vIOazqOWGjOaIv+mXtOS6i+S7tuebkeWQrFxuICAgIHRoaXMuX3Jvb20hLnJlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoe1xuICAgICAgLyoqXG4gICAgICAgKiDmnKznq6/ooqvouKLlh7rmiL/pl7Tml7bop6blj5FcbiAgICAgICAqIEBkZXNjcmlwdGlvbiDooqvouKLlh7rmiL/pl7Tlj6/og73mmK/nlLHkuo7mnI3liqHnq6/otoXlh7rkuIDlrprml7bpl7TmnKrog73mlLbliLAgcnRjUGluZyDmtojmga/vvIzmiYDku6XorqTkuLrlt7Hmlrnnprvnur/jgIJcbiAgICAgICAqIOWPpuS4gOenjeWPr+iDveaYr+W3seaWuSBydGNQaW5nIOWksei0peasoeaVsOi2heWHuuS4iumZkO+8jOaVheiAjOS4u+WKqOaWree6v1xuICAgICAgICogQHBhcmFtIGJ5U2VydmVyXG4gICAgICAgKiDlvZPlgLzkuLogZmFsc2Ug5pe277yM6K+05piO5pys56uvIHJ0Y1Bpbmcg6LaF5pe2XG4gICAgICAgKiDlvZPlgLzkuLogdHJ1ZSDml7bvvIzor7TmmI7mnKznq6/mlLbliLDooqvouKLlh7rmiL/pl7TpgJrnn6VcbiAgICAgICAqL1xuICAgICAgb25LaWNrT2ZmOiAoYnlTZXJ2ZXI6IGJvb2xlYW4sIHN0YXRlPzogUkNLaWNrUmVhc29uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIHRoaXMuX29uS2lja09mZihieVNlcnZlciwgdGhpcy5fcm9vbSEuZ2V0Um9vbUlkKCksIHN0YXRlKTtcbiAgICAgICAgdGhpcy5fcmVsZWFzZVN0b3JlZERhdGEoKTtcbiAgICAgIH0sXG4gICAgICAvLyDov5znq6/nlKjmiLfliqDlhaVcbiAgICAgIG9uVXNlckpvaW46ICh1c2VySWQ6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB1c2VySWQubWFwKChpZCkgPT4gKHsgY2FsbElkOiB0aGlzLl9jYWxsSWQsIHVzZXJJZDogaWQgfSkpO1xuICAgICAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICAgICAgdGhpcy5fb25PdGhlck1lbUpvaW5lZChpbmZvLCB0cmFjZUlkKTtcbiAgICAgIH0sXG4gICAgICAvLyDov5znq6/nlKjmiLfnprvlvIBcbiAgICAgIG9uVXNlckxlYXZlOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLy8g6L+c56uv6LWE5rqQ5Y+R5biDXG4gICAgICBvblRyYWNrUHVibGlzaDogdGhpcy5fb25SZW1vdGVUcmFja1B1Ymxpc2guYmluZCh0aGlzKSxcbiAgICAgIC8vIOi/nOerr+i1hOa6kOWPlua2iOWPkeW4g1xuICAgICAgb25UcmFja1VucHVibGlzaDogdGhpcy5fb25UcmFja1VucHVibGlzaC5iaW5kKHRoaXMpLFxuICAgICAgLy8g6L+c56uv6LWE5rqQ5YeG5aSH5bCx57uqXG4gICAgICBvblRyYWNrUmVhZHk6ICh0cmFjazogUkNSZW1vdGVUcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vblJlbW90ZVRyYWNrUmVhZHkoW3RyYWNrXSk7XG4gICAgICB9LFxuICAgICAgLy8g5Y+R5biD6ICF56aB55So44CB5ZCv55So6KeG6aKRXG4gICAgICBvblZpZGVvTXV0ZUNoYW5nZTogKHZpZGVvVHJhY2s6IFJDUmVtb3RlVmlkZW9UcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vblZpZGVvTXV0ZUNoYWduZSh7XG4gICAgICAgICAgZnJvbVVzZXJJZDogdmlkZW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICBtdXRlZDogdmlkZW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICB0cmFja0lkOiB2aWRlb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLy8g5Y+R5biD6ICF56aB55So44CB5ZCv55So6Z+z6aKRXG4gICAgICBvbkF1ZGlvTXV0ZUNoYW5nZTogKGF1ZGlvVHJhY2s6IFJDUmVtb3RlQXVkaW9UcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vbkF1ZGlvTXV0ZUNoYW5nZSh7XG4gICAgICAgICAgZnJvbVVzZXJJZDogYXVkaW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICBtdXRlZDogYXVkaW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICB0cmFja0lkOiBhdWRpb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgb25SVENQZWVyQ29ubmVjdGlvbkNsb3NlQnlFeGNlcHRpb246IHRoaXMuX29uUlRDUGVlckNvbm5lY3Rpb25DbG9zZUJ5RXhjZXB0aW9uLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgLy8g5rOo5YaM6LSo6YeP5pWw5o2u5oql5ZGK55uR5ZCsXG4gICAgdGhpcy5fcm9vbSEucmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcih7XG4gICAgICBvblN0YXRlUmVwb3J0OiB0aGlzLl9vblJUQ1N0YXRlUmVwb3J0LmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgLy8g5rOo5YaM6Z+z6YeP5LiK5oql5LqL5Lu2XG4gICAgdGhpcy5fcm9vbSEub25BdWRpb0xldmVsQ2hhbmdlKChhdWRpb0xldmVsUmVwb3J0TGlzdCkgPT4ge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25Vc2VyQXVkaW9MZXZlbENoYW5nZWQoYXVkaW9MZXZlbFJlcG9ydExpc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Mb2NhbFRyYWNrUmVhZHkodHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25Vc2VyTWVkaWFBdmFpbGFibGUodHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUmVtb3RlVHJhY2tSZWFkeSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uVXNlck1lZGlhQXZhaWxhYmxlKHRyYWNrcyk7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXyk7XG4gIH1cblxuICBwcml2YXRlIF9vbktpY2tPZmYoYnlTZXJ2ZXI6IGJvb2xlYW4sIHJvb21JZDogc3RyaW5nLCBzdGF0ZT86IFJDS2lja1JlYXNvbiwga2lja0V4dHJhPzogUkNDYWxsS2lja0V4dHJhKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9LSUNLX09GRl9PLCBgcm9vbklkOiAke3Jvb21JZH0sIGJ5U2VydmVyOiAke2J5U2VydmVyfSwgc3RhdGU6ICR7c3RhdGV9LCBraWNrRXh0cmE6ICR7SlNPTi5zdHJpbmdpZnkoa2lja0V4dHJhKX1gKTtcbiAgICBsZXQgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24gPSBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSO1xuICAgIGlmIChieVNlcnZlcikge1xuICAgICAgaWYgKGtpY2tFeHRyYSkge1xuICAgICAgICBzeXN0ZW1TdGF0ZSA9IGtpY2tFeHRyYS5raWNrUmVhc29uQ29kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5TRVJWRVJfS0lDSzpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5LSUNLRURfQllfU0VSVkVSO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uT1RIRVJfS0lDSzpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfSk9JTkVEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uSU1fRElTQ09OTkVDVEVEOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uSU1fTE9HT1VUOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkxPR09VVDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLk9USEVSX0NMSUVOVF9JTV9DT05ORUNURUQ6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0xPR0lOO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fS0lDS09GRl9fLCBzeXN0ZW1TdGF0ZSwgcm9vbUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMgUGVlciDlvILluLjlhbPpl61cbiAgICog56e75Yqo56uv5pyq5aSE55CG5q2k5Zue6LCD77yM5a6a5LmJIHN5c1N0YXR1cyDkuLogQ09OTkVDVElPTl9FUlJcbiAgICovXG4gIHByaXZhdGUgX29uUlRDUGVlckNvbm5lY3Rpb25DbG9zZUJ5RXhjZXB0aW9uKCkge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfUEVFUkNPTk5FQ1RJT05fRVhDRVBUX0NMT1NFX08sICcnLCB0cmFjZUlkKTtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BFRVJDT05ORUNUSU9OX0FCTk9STUFMX0NMT1NFX18sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfb25TZWxmSm9pbmVkKGluZm86IElNZW1iZXJJbmZvLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fU0VMRl9KT0lORURfXywgaW5mby5jYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25SZW1vdGVUcmFja1B1Ymxpc2godHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZSh0cmFja3MsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfUFVCTElTSF9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBuZWVkU3ViVHJhY2tzOiBJU3Vic2NyaWJlQXR0cltdID0gW107XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw6Z+z6aKR5pe277yM55u05o6l6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSkge1xuICAgICAgICBuZWVkU3ViVHJhY2tzLnB1c2goeyB0cmFjaywgc3ViVGlueTogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXT8udmlkZW9WaWV3KSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2spO1xuICAgICAgICBjb25zdCB7IGlzVGlueSB9ID0gdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICAgICAgbmVlZFN1YlRyYWNrcy5wdXNoKHsgdHJhY2ssIHN1YlRpbnk6IGlzVGlueSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZWVkU3ViVHJhY2tzLmxlbmd0aCAmJiB0aGlzLnN1YnNjcmliZVRyYWNrcyhuZWVkU3ViVHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX29uVHJhY2tVbnB1Ymxpc2godHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZSh0cmFja3MsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfVU5QVUJMSVNIX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgdHJhY2tJZHM6IHRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGF3YWl0IHRoaXMudW5zdWJzY3JpYmVUcmFja3ModHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQXVkaW9NdXRlQ2hhbmdlKGluZm86IElNZWRpYU11dGVDaGFuZ2VJbmZvKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08sIEpTT04uc3RyaW5naWZ5KHsgaW5mbyB9KSwgdHJhY2VJZCk7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFjayhpbmZvLnRyYWNrSWQpO1xuICAgIHRoaXMuX29uRGV2aWNlRW5hYmxlQ2hhbmdlKFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQodGhpcy5fY2FsbElkLCB0cmFjayEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25WaWRlb011dGVDaGFnbmUoaW5mbzogSU1lZGlhTXV0ZUNoYW5nZUluZm8pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX0VOQUJMRV9DSEFOR0VfTywgSlNPTi5zdHJpbmdpZnkoeyBpbmZvIH0pLCB0cmFjZUlkKTtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrKGluZm8udHJhY2tJZCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UoW3RyYWNrIV0sIHRyYWNlSWQpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2shKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUlRDU3RhdGVSZXBvcnQocmVwb3J0OiBJUkNSVENTdGF0ZVJlcG9ydCkge1xuICAgIGNvbnN0IHsgc2VuZGVycywgcmVjZWl2ZXJzIH0gPSByZXBvcnQ7XG4gICAgc2VuZGVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7IGtpbmQsIHBhY2tldHNMb3N0UmF0ZSwgcnR0IH0gPSBpdGVtO1xuICAgICAgaWYgKHRoaXMuX2NhbGxNZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8gJiYga2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyPy5vblNlbmRQYWNrZXRMb3NzKHBhY2tldHNMb3N0UmF0ZSB8fCAwLCBydHQgfHwgMCk7XG4gICAgfSk7XG4gICAgcmVjZWl2ZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdHJhY2tJZCwga2luZCwgcGFja2V0c0xvc3RSYXRlLCBiaXRyYXRlLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICBpZiAodGhpcy5fY2FsbE1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTyAmJiBraW5kID09PSAnYXVkaW8nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXNlcklkIH0gPSBoZWxwZXIucGFyc2VUcmFja0lkKHRyYWNrSWQpO1xuICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICBbdXNlcklkOiBzdHJpbmddOiBSQ0NhbGxQbHVzUGFja2V0TG9zc1N0YXRzO1xuICAgICAgfSA9IHt9O1xuICAgICAgZGF0YVt1c2VySWRdID0ge1xuICAgICAgICBwYWNrZXRMb3N0UmF0ZTogcGFja2V0c0xvc3RSYXRlISxcbiAgICAgICAgYml0UmF0ZTogYml0cmF0ZSxcbiAgICAgIH07XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyPy5vblJlY2VpdmVQYWNrZXRMb3NzKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBSVEMg5o6l5pS25pyA57uI5aSx6LSl5ZCO6ZyA6KaB6LCD55SoIGhhbmd1cCDmjILmlq3nmoTmg4XlhrVcbiAqL1xuICBwcml2YXRlIF9vblJUQ01ldGhvZEZhaWwoc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9SVENfUFJPQ0VTU19GQUlMRURfXywgc3lzdGVtU3RhdGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25PdGhlck1lbUpvaW5lZChpbmZvOiBJTWVtYmVySW5mb1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fT1RIRVJfSk9JTkVEX18sIGluZm8sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25EZXZpY2VFbmFibGVDaGFuZ2UodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9PTl9ERVZJQ0VfRU5BQkxFX0NIQU5HRV9fLCB0cmFja3MsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuacrOWcsOmfs+mikSB0cmFjaywg5Yib5bu65oiQ5Yqf5ZCO5L+d5a2Y5pys5Zyw5bm25Zue6LCD6YCa55+lXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVBdWRpb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsQXVkaW9UcmFja30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzPy5zb21lKChpdGVtKSA9PiBpdGVtLmlzQXVkaW9UcmFjaygpKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX0FVRElPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKFJUQ1Jlc291cmNlVGFnLk5PUk1BTCwgdGhpcy5fYXVkaW9Db25maWcpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBtaW5CaXRyYXRlLCBtYXhCaXRyYXRlIH0gPSB0aGlzLl9hdWRpb0NvbmZpZztcbiAgICAobWluQml0cmF0ZSB8fCBtYXhCaXRyYXRlKSAmJiB0cmFjayEuc2V0Qml0cmF0ZShtYXhCaXRyYXRlISwgbWluQml0cmF0ZSEpO1xuXG4gICAgLy8g5pys5qyh57yT5a2YXG4gICAgdGhpcy5fbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIC8vIOmAmuefpeS4iuWxglxuICAgIHRoaXMuX29uTG9jYWxUcmFja1JlYWR5KFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuacrOWcsOinhumikSB0cmFjaywg5Yib5bu65oiQ5Yqf5ZCO5L+d5a2Y5pys5Zyw5bm25Zue6LCD6YCa55+lXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVWaWRlb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVmlkZW9UcmFja30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzPy5zb21lKChpdGVtKSA9PiBpdGVtLmlzVmlkZW9UcmFjaygpICYmICFpdGVtLmlzRGVzdHJveWVkKCkpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlQ2FtZXJhVmlkZW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIHRoaXMuX3ZpZGVvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fdmlkZW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIC8vIOacrOasoee8k+WtmFxuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICAvLyDpgJrnn6XkuIrlsYJcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDnvJPlrZjop4bpopEgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbFZpZGVvVHJhY2soKTogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbG9jYWxWaWRlb1RyYWNrOiBSQ0xvY2FsVHJhY2sgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzKSB7XG4gICAgICBbbG9jYWxWaWRlb1RyYWNrXSA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzVmlkZW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsVmlkZW9UcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDnvJPlrZjpn7PpopEgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbEF1ZGlvVHJhY2soKTogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbG9jYWxBdWRpb1RyYWNrOiBSQ0xvY2FsVHJhY2sgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzKSB7XG4gICAgICBbbG9jYWxBdWRpb1RyYWNrXSA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzQXVkaW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsQXVkaW9UcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HluIPmnKzlnLDotYTmupDnmoTpgLvovpFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwdWJsaXNoKHRyYWNrczogKFJDTG9jYWxUcmFjayB8IElQdWJsaXNoQXR0cnMpW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUFVCTElTSF9ULCBgdHJhY2tzSWRzOiAke3RyYWNrcy5tYXAoKGl0ZW0pID0+ICgoaXRlbSBpbnN0YW5jZW9mIFJDTG9jYWxUcmFjaykgPyBpdGVtLmdldFRyYWNrSWQoKSA6IGl0ZW0udHJhY2suZ2V0VHJhY2tJZCgpKSl9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8SVB1YlJlcz4oe1xuICAgICAgYXN5bmNGbjogdGhpcy5fcm9vbSEucHVibGlzaC5iaW5kKHRoaXMuX3Jvb20pLFxuICAgICAgZm5BcmdzOiBbdHJhY2tzXSxcbiAgICAgIG9uRXJyb3I6IChjb2RlKSA9PiB7fSxcbiAgICB9KTtcblxuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uUFVCTElTSF9FUlIsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BVQkxJU0hfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QVUJMSVNIX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHVibGljIHB1Ymxpc2hWaWRlb1RyYWNrKCkge1xuICAgIGNvbnN0IGRlZmF1bHRWaWRlb1RyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBjb25zdCBwdWJQYXJhbXMgPSB0aGlzLl9pc1B1YlRpbnkgPyB7IHRyYWNrOiBkZWZhdWx0VmlkZW9UcmFjayEsIGlzUHViVGlueTogdHJ1ZSB9IDogZGVmYXVsdFZpZGVvVHJhY2shO1xuICAgIHJldHVybiB0aGlzLl9yb29tIS5wdWJsaXNoKFtwdWJQYXJhbXNdKTtcbiAgfVxuXG4gIHNldFZpZGVvVmlldyhsaXN0OiB7dXNlcklkOiBzdHJpbmcsIHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55PzogYm9vbGVhbn1bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmVlZFN1YlRyYWNrczogSVN1YnNjcmliZUF0dHJbXSA9IFtdO1xuICAgIGxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIHZpZGVvRWxlbWVudCwgaXNUaW55ID0gZmFsc2UgfSA9IGl0ZW07XG4gICAgICB0aGlzLl91c2VyVmlld01hcFt1c2VySWRdID0ge1xuICAgICAgICB2aWRlb1ZpZXc6IHZpZGVvRWxlbWVudCxcbiAgICAgICAgaXNUaW55LFxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICog6K6+572u5pys56uv6KeG5Zu+5pe277yM5Y+q5a2Y5YKo5pWw5o2u77yM5peg6ZyA6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICh1c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiDorr7nva7ov5znq6/op4blm77ml7bvvIzlpoLmnpzlt7Lnu4/liqDlhaXmiL/pl7TvvIzliJnojrflj5bov5znq6/otYTmupDnm7TmjqXorqLpmIVcbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbW90ZVRyYWNrcyA9IHRoaXMuZ2V0UmVtb3RlVHJhY2tzKCk7XG4gICAgICBjb25zdCBzdWJQYXJhbXMgPSAocmVtb3RlVHJhY2tzIVt1c2VySWRdIHx8IFtdKS5tYXAoKHRyYWNrKSA9PiAoe1xuICAgICAgICB0cmFjayxcbiAgICAgICAgc3ViVGlueTogaXNUaW55LFxuICAgICAgfSkpLmZpbHRlcigoeyB0cmFjayB9KSA9PiAhdHJhY2suaXNTdWJzY3JpYmVkKCkpO1xuICAgICAgbmVlZFN1YlRyYWNrcy5wdXNoKC4uLnN1YlBhcmFtcyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfVklERU9fVklFV19PLCBKU09OLnN0cmluZ2lmeShcbiAgICAgIHtcbiAgICAgICAgdXNlclZpZXdNYXA6IHRoaXMuX3VzZXJWaWV3TWFwLFxuICAgICAgICBuZWVkU3ViVHJhY2tJZHM6IG5lZWRTdWJUcmFja3MubWFwKCh7IHRyYWNrIH0pID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgICB9LFxuICAgICksIHRyYWNlSWQpO1xuXG4gICAgbmVlZFN1YlRyYWNrcy5sZW5ndGggJiYgdGhpcy5zdWJzY3JpYmVUcmFja3MobmVlZFN1YlRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Yig6Zmk6KeG5Zu+5pe277yM5Y+W5raI6K6i6ZiF6LWE5rqQXG4gICAqL1xuICByZW1vdmVWaWRlb1ZpZXcodXNlcklkczogc3RyaW5nW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHVuc3ViVHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10gPSBbXTtcbiAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB0cmFja3MgPSB0aGlzLmdldFJlbW90ZVRyYWNrcygpW3VzZXJJZF07XG4gICAgICBpZiAodHJhY2tzICYmIHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdmlkZW9UcmFjayA9IHRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgICAgIHZpZGVvVHJhY2subGVuZ3RoICYmIHVuc3ViVHJhY2tzLnB1c2godmlkZW9UcmFja1swXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFTU9WRV9WSURFT19WSUVXX08sIEpTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICB1c2VyVmlld01hcDogdGhpcy5fdXNlclZpZXdNYXAsXG4gICAgICAgIHVuc3ViVHJhY2tzOiB1bnN1YlRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgICAgfSxcbiAgICApLCB0cmFjZUlkKTtcblxuICAgIGlmICh1bnN1YlRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVUcmFja3ModW5zdWJUcmFja3MsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blrZjlgqjnmoTkurrlkZjlkowgdmlkZW8g5YWD57Sg5pWw5o2uXG4gICAqL1xuICBnZXRVc2VyVmlld01hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlclZpZXdNYXA7XG4gIH1cblxuICAvKipcbiAgICog5pKt5pS+5aqS5L2T6LWE5rqQXG4gICAqL1xuICBhc3luYyBwbGF5TWVkaWEodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdmlkZW9WaWV3OiBIVE1MVmlkZW9FbGVtZW50LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1QsIGB1c2VySWQ6ICR7dXNlcklkfSwgbWVkaWFUeXBlOiAke21lZGlhVHlwZX0sIHZpZGVvVmlldzogJHt2aWRlb1ZpZXc/Lm5vZGVOYW1lfWAsIHRyYWNlSWQpO1xuICAgIGxldCB0cmFjazogUkNUcmFjayB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIOWMuuWIhuacrOerr+WSjOi/nOerr1xuICAgICAqL1xuICAgIGlmICh1c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgIHRyYWNrID0gKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykgPyB0aGlzLmdldExvY2FsQXVkaW9UcmFjaygpISA6IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCkhO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgIHRyYWNrID0gdGhpcy5nZXRSZW1vdGVUcmFja3MoKVt1c2VySWRdLmZpbHRlcigodHJhY2spID0+IChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gPyB0cmFjay5pc0F1ZGlvVHJhY2soKSA6IHRyYWNrLmlzVmlkZW9UcmFjaygpKSlbMF07XG4gICAgfVxuXG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiwgYGVycm9yIGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NRURJQV9SRVNPVVJDRV9JTlZBTElFRCB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gYXdhaXQgdHJhY2sucGxheSgpIDogYXdhaXQgdHJhY2sucGxheSh2aWRlb1ZpZXcpO1xuICAgICAgLyoqXG4gICAgICAgKiDlpITnkIbpgJror53liY3orr7nva7kuobpnZnpn7PmiYDmnInov5znq6/pn7PpopHmtYFcbiAgICAgICAqL1xuICAgICAgdHJhY2suaXNBdWRpb1RyYWNrKCkgJiYgIXRoaXMuX3JlbW90ZUF1ZGlvRW5hYmxlICYmIHRyYWNrLm11dGUoKTtcblxuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUExBWV9NRURJQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5QTEFZX01FRElBX0ZBSUxFRH0sIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX0sYCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QTEFZX01FRElBX0ZBSUxFRCB9O1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBJU3Vic2NyaWJlQXR0cixcbiAgUkNMb2NhbEF1ZGlvVHJhY2ssXG4gIFJDUlRDQ29kZSxcbiAgUkNSZW1vdGVBdWRpb1RyYWNrLFxuICBSQ1JlbW90ZVRyYWNrLFxuICBSQ1RyYWNrLFxufSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7XG4gIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsXG4gIElSQ0NhbGxQbHVzQ2FsbFJlY29yZCxcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgUkNDYWxsUGx1c1JlYXNvbixcbiAgUkNDYWxsUGx1c1Nlc3Npb24sXG4gIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLFxuICBSQ0NhbGxQbHVzVHlwZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCc7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXIhOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDnirbmgIHmnLrkuovku7bms6jlhoxcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IElDYWxsUGx1c0V2ZW50TGlzdGVuZXIpIHtcbiAgICB0aGlzLl9saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgLyoqXG4gICog5Zue6LCD5bqU55So5bGC5LqL5Lu2XG4gICogQHBhcmFtIGV2ZW50TmFtZVxuICAqIEBwYXJhbSBhdHRyc1xuICAqIEByZXR1cm5zXG4gICovXG4gIHByaXZhdGUgX2NhbGxBcHBMaXN0ZW5lcihldmVudE5hbWU6IGtleW9mIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsIC4uLmF0dHJzOiBhbnlbXSkge1xuICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuX2xpc3RlbmVyPy5bZXZlbnROYW1lXSBhcyBGdW5jdGlvbjtcbiAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaGFuZGxlKC4uLmF0dHJzKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENhbGwoc2Vzc2lvbjogUkNDYWxsUGx1c1Nlc3Npb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2FsbCcsXG4gICAgICBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGwnLCBzZXNzaW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZVVzZXJJbnZpdGVkKGludml0ZWVVc2VyTGlzdDogc3RyaW5nW10sIGludml0ZXJVc2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVVc2VySW52aXRlZCcsXG4gICAgICBpbnZpdGVlVXNlckxpc3QsXG4gICAgICBpbnZpdGVyVXNlcklkLFxuICAgICAgY2FsbElkLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlVXNlckludml0ZWQnLCBpbnZpdGVlVXNlckxpc3QsIGludml0ZXJVc2VySWQhLCBjYWxsSWQpO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbENvbm5lY3RlZChzZXNzaW9uOiBSQ0NhbGxQbHVzU2Vzc2lvbikge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxDb25uZWN0ZWQnLFxuICAgICAgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uQ2FsbENvbm5lY3RlZCcsIHNlc3Npb24pO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbFR5cGVDaGFuZ2VkKGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSwgY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxUeXBlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICBjYWxsVHlwZSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvbkNhbGxUeXBlQ2hhbmdlZCcsIGNhbGxUeXBlLCBjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWinumHj+S4iuaKpei/nOerr+S6uuWRmOeKtuaAgeWPmOWMllxuICAgKi9cbiAgcHVibGljIG9uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZChkYXRhOiB7XG4gICAgY2FsbElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSxcbiAgICByZWFzb24/OiBSQ0NhbGxQbHVzUmVhc29uLFxuICB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIHVzZXJJZCwgdXNlclN0YXRlLCByZWFzb24sXG4gICAgfSA9IGRhdGE7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICB1c2VySWQsXG4gICAgICB1c2VyU3RhdGUsXG4gICAgICByZWFzb24sXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkJywgY2FsbElkLCB1c2VySWQsIHVzZXJTdGF0ZSwgcmVhc29uKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNhbGxFbmRlZChzZXNzaW9uOiBSQ0NhbGxQbHVzU2Vzc2lvbiwgcmVhc29uOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25DYWxsRW5kZWQnLFxuICAgICAgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgY2xvc2VSZWFzb246IHJlYXNvbixcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvbkNhbGxFbmRlZCcsIHNlc3Npb24sIHJlYXNvbik7XG4gIH1cblxuICBwdWJsaWMgb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRyYWNrSWQ6IHRyYWNrPy5nZXRUcmFja0lkKCksXG4gICAgICBlbmFibGU6IHRyYWNrPy5pc093bmVyTXV0ZWQoKSxcbiAgICB9KSk7XG4gICAgY29uc3QgdXNlcklkID0gdHJhY2s/LmdldFVzZXJJZCgpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQnLCBjYWxsSWQsIHVzZXJJZCwgdHJhY2s/LmlzT3duZXJNdXRlZCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICB0cmFja0lkOiB0cmFjaz8uZ2V0VHJhY2tJZCgpLFxuICAgICAgZW5hYmxlOiB0cmFjaz8uaXNPd25lck11dGVkKCksXG4gICAgfSkpO1xuICAgIGNvbnN0IHVzZXJJZCA9IHRyYWNrPy5nZXRVc2VySWQoKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCcsIGNhbGxJZCwgdXNlcklkLCB0cmFjaz8uaXNPd25lck11dGVkKCkpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsUmVjb3JkKHJlY29yZDogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxSZWNvcmQnLFxuICAgICAgcmVjb3JkLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDYWxsUmVjb3JkJywgcmVjb3JkKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCh1c2VySWQ6IHN0cmluZywgdHJhbnNhY3Rpb25JZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCcsXG4gICAgICB1c2VySWQsXG4gICAgICB0cmFuc2FjdGlvbklkLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXF1ZXN0JywgdXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXN1bHQoaW5mbzoge1xuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIHRyYW5zYWN0aW9uSWQ6IHN0cmluZyxcbiAgICBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gICAgY29kZTogUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdFxuICB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICB1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSwgY29kZSxcbiAgICB9ID0gaW5mbztcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCcsXG4gICAgICB1c2VySWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCcsIHtcbiAgICAgIHVzZXJJZCwgdHJhbnNhY3Rpb25JZCwgbWVkaWFUeXBlLCBjb2RlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKGluZm86IHsgY2FsbElkOiBzdHJpbmcsIGNhbGxTdGFydFRpbWU6IG51bWJlciB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxTdGFydFRpbWUnLFxuICAgICAgaW5mbyxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2FsbFN0YXJ0VGltZScsIGluZm8pO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsRmlyc3RGcmFtZVRpbWUoY2FsbElkOiBzdHJpbmcsIGNhbGxGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZScsXG4gICAgICBjYWxsSWQsXG4gICAgICBjYWxsRmlyc3RGcmFtZVRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZScsIGNhbGxJZCwgY2FsbEZpcnN0RnJhbWVUaW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJNZWRpYUF2YWlsYWJsZSh0cmFja3M6IFJDVHJhY2tbXSwgdHJhY2VJZD86IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblVzZXJNZWRpYUF2YWlsYWJsZScsXG4gICAgICB0cmFja0lkczogdHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyA6IFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU87XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uVXNlck1lZGlhQXZhaWxhYmxlJywgdXNlcklkLCBtZWRpYVR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uRmV0Y2hSZW1vdGVNZWRpYUVycm9yKHRyYWNrczogSVN1YnNjcmliZUF0dHJbXSwgY29kZTogUkNSVENDb2RlKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHsgdHJhY2sgfSkgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uRmV0Y2hSZW1vdGVNZWRpYUVycm9yJywgdXNlcklkLCBjb2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJBdWRpb0xldmVsQ2hhbmdlZChhdWRpb0xldmVsUmVwb3J0TGlzdDoge1xuICAgIHRyYWNrOiBSQ0xvY2FsQXVkaW9UcmFjayB8IFJDUmVtb3RlQXVkaW9UcmFjaztcbiAgICBhdWRpb0xldmVsOiBudW1iZXI7XG4gIH1bXSkge1xuICAgIGF1ZGlvTGV2ZWxSZXBvcnRMaXN0LmZvckVhY2goKHsgdHJhY2ssIGF1ZGlvTGV2ZWwgfSkgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uVXNlckF1ZGlvTGV2ZWxDaGFuZ2VkJywgdXNlcklkLCBhdWRpb0xldmVsKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gQ2FsbFNlcnZlckVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmnKrnn6XplJnor69cbiAgICovXG4gIFVOS05PV19FUlIgPSA0MTAwMCxcbiAgLyoqXG4gICAqIOaVsOaNruW6k+mUmeivr1xuICAgKi9cbiAgREJfRVJSID0gNDEwMDEsXG4gIC8qKlxuICAgKiBqc29uIOmUmeivr1xuICAgKi9cbiAgSlNPTl9FUlIgPSA0MTAwMixcbiAgLyoqXG4gICAqIGpzb24g5qC85byP6ZSZ6K+vXG4gICAqL1xuICBJTlZBTElEX0pTT05fRVJSID0gNDEwMDMsXG4gIC8qKlxuICAgKiDlj4LmlbDkuKLlpLFcbiAgICovXG4gIE1JU1NJTkdfUEFSQU1TID0gNDEwMDQsXG4gIC8qKlxuICAgKiDlj4LmlbDkuI3og73kuLrnqbpcbiAgICovXG4gIFBBUkFNU19SRVFVSVJFRCA9IDQxMDA1LFxuICAvKipcbiAgICog5pWw5o2u5qC85byP6ZSZ6K+vXG4gICAqL1xuICBEQVRBX0ZPUk1BVF9FUlIgPSA0MTAwNixcbiAgLyoqXG4gICAqIOaWueazleacquWunueOsFxuICAgKi9cbiAgTUVUSE9EX05PVF9JTVBMRU1FTlRFRCA9IDQxMDA3LFxuICAvKipcbiAgICogY2FsbCDkuI3lrZjlnKjmiJblt7Lnu5PmnZ9cbiAgICovXG4gIENBTExfTk9UX0VYSVNUID0gNDEwMTAsXG4gIC8qKlxuICAgKiDljZXlkbwg6KKr6YKA6K+36ICF5LiN6IO96LaF6L+H5Lik5Lq6XG4gICAqL1xuICBTSU5HQUxfRVhDRUVEX1RXT19JTlZJVEVFID0gNDEwMTEsXG4gIC8qKlxuICAgKiDnvqTnu4Tlkbzlj6votoXov4fop4TlrprkurrmlbDvvIjmnIDlpJogMzIg5Lq677yJXG4gICAqL1xuICBHUk9VUF9FWENFRURTX1FVT1JVTSA9IDQxMDEyLFxuICAvKipcbiAgICog5pON5L2c5bey6L+H5pyfXG4gICAqL1xuICBPUEVSQVRJT05fRVhQSVJFRCA9IDQxMDEzLFxuICAvKipcbiAgICog5b2T5YmN6K6+5aSH5q2j5Zyo5ZG85Y+r5LitXG4gICAqL1xuICBERVZJQ0VfSVNfQ0FMTElORyA9IDQxMDE0LFxuICAvKipcbiAgICog5LiK5oql55qEIHN0cmVhbVJlYWR5VGltZSDml6DmlYhcbiAgICovXG4gIFJFUE9SVF9TVFJFQU1fUkVBRFlfVElNRV9JU19JTlZBTElEID0gNDEwMTgsXG4gIC8qKlxuICAgKiDkuI3og73lkbzoh6rlt7FcbiAgICovXG4gIE5PVF9DQUxMX1lPVVJTRUxGID0gNDEwMTksXG4gIC8qKlxuICAgKiDkvJror53nirbmgIHkuI3lrZjlnKhcbiAgICovXG4gIFNFU1NJT05fU1RBVFVTX05PVF9FWElTVCA9IDQxMDIwLFxuICAvKipcbiAgICogaGFuZ3VwIOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgSEFOR1VQX05PVF9BTExPVyA9IDQxMDIxLFxuICAvKipcbiAgICogYWNjZXB0IOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgQUNDRVBUX05PVF9BTExPVyA9IDQxMDIyLFxuICAvKipcbiAgICog5pON5L2c5Zyo5b2T5YmN5pa55rOV5LiN5YWB6K646LCD55SoXG4gICAqL1xuICBPUEVSQVRJT05fTk9UX0FMTE9XID0gNDEwMjUsXG4gIC8qKlxuICAgKiDkuJrliqFJZOS4jeato+ehruaIluiAheS4muWKoeW3sue7k+adn1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfRVJSID0gNDExMDAsXG4gIC8qKlxuICAgKiDpn7PpopHljYfnuqfop4bpopHlt7Looqvlj5HotbfogIXlj5bmtohcbiAgICovXG4gIFVQX1ZJREVPX0NBTkNFTEVEID0gNDEwNTAsXG4gIC8qKlxuICAgKiDlvZPliY3pgJror53lt7Lnu4/mmK/pn7PpopHpgJror53vvIzml6DpnIDpmY3nuqdcbiAgICovXG4gIENVUlJFTlRfQ0FMTF9JU19BVURJTyA9IDQxMDUxLFxuICAvKipcbiAgICog5b2T5YmN6YCa6K+d5bey57uP5piv6KeG6aKR6YCa6K+d77yM5peg6ZyA5Y2H57qnXG4gICAqL1xuICAgQ1VSUkVOVF9DQUxMX0lTX1ZJREVPID0gNDEwNTIsXG59XG4iLCJpbXBvcnQge1xuICBCYXNpY0xvZ2dlciwgZ2V0VVVJRCwgSVJ1bnRpbWUsIGlzQm9vbGVhbiwgaXNOdW1iZXIsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCwgbm90RW1wdHlBcnJheSwgbm90RW1wdHlTdHJpbmcsIFBsdWdpbkNvbnRleHQsIFJDQ29ubmVjdGlvblN0YXR1cyxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNSZW1vdGVUcmFjaywgUkNSVENDb2RlLCBkZXZpY2UgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHtcbiAgUkNDYWxsUGx1c0ZyYW1lUmF0ZSxcbiAgUkNDYWxsUGx1c1Jlc29sdXRpb24sXG4gIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsXG4gIElDYWxsUGx1c0luaXRPcHRzLFxuICBJU3RhdHVzUmVwb3J0TGlzdGVuZXIsXG4gIElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlcyxcbiAgUkNDYWxsUGx1c0NhbGxVc2VyLFxuICBSQ0NhbGxQbHVzTWVkaWFUeXBlLFxuICBSQ0NhbGxQbHVzU2Vzc2lvbixcbiAgUkNDYWxsUGx1c1R5cGUsXG4gIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLFxuICBJQXVkaW9Db25maWcsXG4gIElWaWRlb0NvbmZpZyxcbiAgUkNDYWxsUGx1c0NhbGxTdGF0ZSxcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNBdWRpb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9SQ0F1ZGlvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgUkNWaWRlb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9SQ1ZpZGVvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcbmltcG9ydCB7XG4gIGdldEhhbmd1cFN5c3RlbVN0YXRlLCBpc1N1cHBvcnRNZWRpYVNlcnZlciwgdmFsaWRhdGVCaXRyYXRlLCB2YWxpZGF0ZVZpZGVvTm9kZU5hbWUsXG59IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgUkNDYWxsUEx1c1N0YXRpc3RpY3MgZnJvbSAnLi4vbW9kdWxlcy9SQ0NhbGxQTHVzU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnJztcbmltcG9ydCB7XG4gIElIYW5ndXBGb3JCdXN5T3B0cywgSU1lbWJlckluZm8sXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUlRDTW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlcy9SVENNb2R1bGUnO1xuaW1wb3J0IHsgRm9yd2FyZFR5cGUgfSBmcm9tICcuLi9lbnVtcy9Gb3J3YXJkVHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlcy9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJFcnJvckNvZGUgfSBmcm9tICcuLi9lbnVtcy9DYWxsU2VydmVyRXJyb3JDb2RlJztcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbFBsdXNDbGllbnQge1xuICAvKipcbiAgICog5pGE5YOP5aS06YeH6ZuG6YWN572uXG4gICAqL1xuICBwcml2YXRlIF92aWRlb0NvbmZpZzogSVZpZGVvQ29uZmlnID0ge1xuICAgIHJlc29sdXRpb246IFJDQ2FsbFBsdXNSZXNvbHV0aW9uLlc2NDBfSDQ4MCxcbiAgICBmcmFtZVJhdGU6IFJDQ2FsbFBsdXNGcmFtZVJhdGUuRlBTXzE1LFxuICB9XG5cbiAgLyoqXG4gICAqIOm6puWFi+mjjumHh+mbhumFjee9rlxuICAgKi9cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZyA9IHt9XG5cbiAgLyoqXG4gICAqIOe7n+iuoeWfi+eCueexu1xuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFBsdXNTdGF0aXN0aWNzOiBSQ0NhbGxQTHVzU3RhdGlzdGljc1xuXG4gIC8qKlxuICAgKiBjbGllbnQgY2FsbElkXG4gICAqL1xuICBwcml2YXRlIF9jbGllbnRDYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgLyoqXG4gICAqIOaYr+WQpuS4uuS4u+WKqOaMguaWrVxuICAgKi9cbiAgcHJpdmF0ZSBfaXNMYXVuY2hIYW5ndXAgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDlkbzlj6vov4fnqIvkuK3mjILmlq1cbiAgICovXG4gIHByaXZhdGUgX25lZWRIYW5ndXBDYWxsSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lO1xuXG4gIHByaXZhdGUgX3J0Y01vZHVsZTogUlRDTW9kdWxlO1xuXG4gIC8qKlxuICAgKiDkuIrmiqXlupTnlKjlsYLkuovku7bmqKHlnZdcbiAgICovXG4gIF9yZXBvcnRBcHBFdmVudE1vZHVsZTogUkNDYWxsUGx1c1JlcG9ydE1vZHVsZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSUNhbGxQbHVzSW5pdE9wdHMsXG4gICkge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlID0gbmV3IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUoX2xvZ2dlcik7XG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzID0gbmV3IFJDQ2FsbFBMdXNTdGF0aXN0aWNzKHRoaXMuX2xvZ2dlciwgdGhpcy5fY29udGV4dCk7XG4gICAgLy8g5Yid5aeL5YyW54q25oCB5py65a6e5L6LXG4gICAgdGhpcy5fY2FsbEVuZ2luZSA9IG5ldyBSQ0NhbGxFbmdpbmUodGhpcy5fY29udGV4dCwgdGhpcy5fcnVudGltZSwgdGhpcy5faW5pdE9wdHMsIHRoaXMuX2xvZ2dlciwgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUpO1xuXG4gICAgdGhpcy5fcnRjTW9kdWxlID0gbmV3IFJUQ01vZHVsZSh0aGlzLl9jb250ZXh0LCB0aGlzLl9ydW50aW1lLCB0aGlzLl9pbml0T3B0cywgdGhpcy5fbG9nZ2VyLCB0aGlzLl9jYWxsRW5naW5lLCB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZSk7XG5cbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BST0NFU1NfRkFJTEVEX18sIHRoaXMuX3J0Y1Byb2Nlc3NGYWlsSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9SVENfUEVFUkNPTk5FQ1RJT05fQUJOT1JNQUxfQ0xPU0VfXywgdGhpcy5fcGVlckNvbm5lY3Rpb25BYm5vcm1hbENsb3NlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9TRUxGX0pPSU5FRF9fLCB0aGlzLl9zZWxmSm9pbmVkSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9PVEhFUl9KT0lORURfXywgdGhpcy5fb3RoZXJKb2luZWRIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXywgdGhpcy5fcmVjZWl2ZUZpcnN0RnJhbWVIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX09OX0tJQ0tPRkZfXywgdGhpcy5fa2lja29mZkhhbmRsZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXywgdGhpcy5fcmVjZWl2ZURldmljZUVuYWJsZUNoYW5nZUhhbmRsZS5iaW5kKHRoaXMpKTtcblxuICAgIC8qKlxuICAgICAqIOmAmuivneW7uueri+WQju+8jFJUQyDmqKHlnZfpnIDlj5HluIPotYTmupBcbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fLCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZC5iaW5kKHRoaXMuX3J0Y01vZHVsZSkpO1xuICAgIC8qKlxuICAgICAqIOmAmuivneaMguaWreWQju+8jFJUQyDmqKHlnZfpnIDpgIDlh7rmiL/pl7TjgIHlpITnkIblhoXlrZjmlbDmja5cbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgdGhpcy5fc2Vzc2lvbkNsb3NlSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIC8qKlxuICAgICAqIOWkhOeQhiBSVEMg5qih5Z2X5aqS5L2T5Y2H6ZmN57qn6YC76L6RXG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fLCB0aGlzLl9ydGNNb2R1bGUuY2hhbmdlTWVkaWFUeXBlLmJpbmQodGhpcy5fcnRjTW9kdWxlKSk7XG4gICAgLyoqXG4gICAgICog5pS25Yiw6YCa6K+d6YKA6K+35ZCO77yM6ZyA5LiK5oql5Z+L54K5XG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9JTlZJVEVfXywgKG5ld1Nlc3Npb24sIGludml0ZVNvdXJjZSkgPT4ge1xuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfUkVDRUlWRV9DQUxMX1MsIFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsICtuZXcgRGF0ZSgpLCBuZXdTZXNzaW9uLCAnJywgaW52aXRlU291cmNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliqDmiL/pl7TjgIHlj5HluIPjgIHorqLpmIXlpLHotKXml7bpnIDnu5PmnZ/pgJror53vvIzlubbkuIrmiqXljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX3J0Y1Byb2Nlc3NGYWlsSGFuZGxlKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbikge1xuICAgICAgY29uc3QgY2FsbElkID0gbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUywgUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgK25ldyBEYXRlKCksIG1haW5TZXNzaW9uKTtcbiAgICAgIHRoaXMuX19pbm5lckhhbmd1cCh7IGNhbGxJZCwgc3lzdGVtU3RhdGUgfSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJ0YyBwZWVyQ29ubmVjdGlvbiDlvILluLjmlq3lvIDml7bpnIDnu5PmnZ/pgJror53vvIzlubbkuIrmiqXljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX3BlZXJDb25uZWN0aW9uQWJub3JtYWxDbG9zZSh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbikge1xuICAgICAgLy8g5LiK5oql54q25oCB6K6p5a+55pa555+l6YGT6Ieq5bex56a75byA55qE5Y6f5ZugXG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkOiBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgICAgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSLFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmVuZEN1cnJlbnRTZXNzaW9uKFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlIsIG1haW5TZXNzaW9uLmdldENhbGxJZCgpLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pys56uv5Yqg5YWlIFJUQyDmiL/pl7TvvIzpnIDmm7TmlrDmnKzkurogT05DQUxMIOeKtuaAge+8jOmHjeaWsOagoeaXtlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VsZkpvaW5lZEhhbmRsZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsQ29ubmVjdGVkKHNlc3Npb24hKTtcblxuICAgIC8qKlxuICAgICAqIOabtOaWsOiHquW3seeahOeKtuaAgVxuICAgICAqL1xuICAgIGNvbnN0IHZpZGVvVHJhY2sgPSB0aGlzLl9ydGNNb2R1bGUuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgY29uc3QgYXVkaW9UcmFjayA9IHRoaXMuX3J0Y01vZHVsZS5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBjb25zdCBjYW1lcmFFbmFibGUgPSB2aWRlb1RyYWNrID8gIXZpZGVvVHJhY2suaXNPd25lck11dGVkKCkgOiBmYWxzZTtcbiAgICBjb25zdCBtaWNyb3Bob25lRW5hYmxlID0gYXVkaW9UcmFjayA/ICFhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpIDogZmFsc2U7XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPLCBjYW1lcmFFbmFibGUsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8sIG1pY3JvcGhvbmVFbmFibGUsIHRyYWNlSWQpO1xuXG4gICAgY29uc3Qgc2VsZlN0YXRlID0gW1xuICAgICAge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEwsXG4gICAgICAgIGNhbWVyYUVuYWJsZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBzZWxmU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgLy8g6YeN5paw5byA5aeL5qCh5pe26YC76L6RXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zdGFydFRpbWVDb3JyZWN0aW9uKHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOi/nOerr+S6uuWRmOWKoOWFpeaIv+mXtO+8jOabtOaWsOi/nOerr+S6uuWRmOeKtuaAgeWSjOmAmuivneeKtuaAgeS4uiBPTkNBTExcbiAgICovXG4gIHByaXZhdGUgX290aGVySm9pbmVkSGFuZGxlKGluZm86IElNZW1iZXJJbmZvW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOabtOaWsOWKoOWFpeaIv+mXtOS6uuWRmOeKtuaAgVxuICAgIGxldCBjYWxsSWQgPSAnJztcbiAgICBjb25zdCB1c2Vyc1N0YXRlID0gaW5mby5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNhbGxJZCA9IGl0ZW0uY2FsbElkO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLk9OQ0FMTCxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIHVzZXJzU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgLy8g5pyJ5Lq65Y+q5Yqg5oi/6Ze077yM5LiN5Y+R5rWB77yM5pWF5q2k5aSE5Lmf5pu05paw5Li6IENPTk5FQ1RFRFxuICAgIGlmICh0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0U3RhdGUoKSAhPT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlTWFpblNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmmluW4p+S4iuaKpee7meS4muWKoeWxglxuICAgKi9cbiAgcHJpdmF0ZSBfcmVjZWl2ZUZpcnN0RnJhbWVIYW5kbGUodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRTdGF0ZSgpICE9PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS51cGRhdGVNYWluU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMKTtcbiAgICB9XG5cbiAgICAvLyDnu5kgQ2FsbFNlcnZlciDkuIrmiqXmtYHliLDovr5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnVwRmlyc3RGcmFtZVRpbWUodHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6KKr6Lii5Ye65oi/6Ze05pe277yM6ZyA57uT5p2f6YCa6K+dXG4gICAqL1xuICBwcml2YXRlIF9raWNrb2ZmSGFuZGxlKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCByb29tSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICog5pys56uv572R57uc5pyJ6Zeu6aKY77yMcGluZyDlpLHotKXml7ZcbiAgICAgKi9cbiAgICBpZiAoc3lzdGVtU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlIpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuZW5kQ3VycmVudFNlc3Npb24oc3lzdGVtU3RhdGUsIHJvb21JZCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiiq+acjeWKoeerr+i4ouWHuuaXtueahOWkhOeQhlxuICAgICAqL1xuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKG1haW5TZXNzaW9uKSB7XG4gICAgICBjb25zdCBjYWxsSWQgPSBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKTtcbiAgICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0FCTk9STUFMX0hBTkdVUF9TLCBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCArbmV3IERhdGUoKSwgbWFpblNlc3Npb24sIHRoaXMuX2NsaWVudENhbGxJZCk7XG5cbiAgICAgIC8vIOS4iuaKpeeKtuaAgeebtOaOpeiuqeWvueaWueefpemBk+iHquW3seemu+W8gOeahOWOn+WboFxuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5zeXN0ZW1TdGF0dXNVcCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3lzU3RhdHVzOiBzeXN0ZW1TdGF0ZSxcbiAgICAgICAgZm9yd2FyZDogRm9yd2FyZFR5cGUuQ1VSUkVOVCxcbiAgICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgICAvLyDnm7TmjqXnu5PmnZ/lt7HmlrnpgJror51cbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuZW5kQ3VycmVudFNlc3Npb24oc3lzdGVtU3RhdGUsIHJvb21JZCwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOmfs+inhumikeeKtuaAgeWPmOWMlu+8jOmcgOabtOaWsCBzZXNzaW9uIOS4reS6uuWRmOeahOiuvuWkh+eKtuaAgVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVjZWl2ZURldmljZUVuYWJsZUNoYW5nZUhhbmRsZSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyA6IFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU87XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBtZWRpYVR5cGUsICF0cmFjay5pc093bmVyTXV0ZWQoKSwgdHJhY2VJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5oyC5pat5pe277yM6ZyA5riF56m65YaF5a2Y77yM56a75byA5oi/6Ze0XG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uQ2xvc2VIYW5kbGUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8qKlxuICAgICAqIOS7heWcqOiiq+WKqOaMguaWreaXtua4heepuuWIm+W7uueahOWuouaIt+erryBjYWxsSWTvvIxcbiAgICAgKiDkuI3lvbHlk43kuLvliqjlkbzlj6vlkI7mjILmlq3ml7bkuIrmiqUg5a6i5oi356uvIGNhbGxJZFxuICAgICAqL1xuICAgIGlmICghdGhpcy5faXNMYXVuY2hIYW5ndXApIHtcbiAgICAgIHRoaXMuX2NsaWVudENhbGxJZCA9ICcnO1xuICAgIH1cbiAgICB0aGlzLl9pc0xhdW5jaEhhbmd1cCA9IGZhbHNlO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ2xvc2UoY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhozlupTnlKjlsYLkuovku7ZcbiAgICog5YyF5ZCr4oCc5pS25Yiw5ZG85Y+r44CB6YCa6K+d57uT5p2f44CB6YCa6K+d5Lq65ZGY54q25oCB5Y+Y5pu044CB6YCa6K+d57G75Z6L5Y+Y5pu04oCd562J5LqL5Lu2XG4gICAqIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIg5a+56LGh6K+35Y+C6ICDIGFwaURvY1xuICAgKi9cbiAgc2V0Q2FsbFBsdXNFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfRVZFTlRfTElTVEVORVJfTywgbGlzdGVuZXIgPyBPYmplY3Qua2V5cyhsaXN0ZW5lcikuam9pbignLCcpIDogbnVsbCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUucmVnaXN0ZXJFdmVudExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhozpn7Pop4bpopHkuIrkuIvooYzkuKLljIXmlbDmja7nm5HlkKxcbiAgICog5q+P56eS5LiK5oql5LiA5qyhXG4gICAqIEBwYXJhbSBsaXN0ZW5lciDnsbvlnovkuLogSVN0YXR1c1JlcG9ydExpc3RlbmVy77yM6K+m57uG5a6a5LmJ5Y+v5Y+C6ICDIGFwaURvY1xuICAgKiBAcGFyYW0gbGlzdGVuZXIub25TZW5kUGFja2V0TG9zcyAg5Y+R6YCB5Lii5YyF546H5L+h5oGv5Zue6LCDXG4gICAqIEBwYXJhbSBsaXN0ZW5lci5vblJlY2VpdmVQYWNrZXRMb3NzIOaOpeaUtuS4ouWMheeOh+S/oeaBr+Wbnuiwg1xuICAgKi9cbiAgc2V0U3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lcikge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1NUQVRVU19SRVBPUlRfTElTVEVORVJfTywgbGlzdGVuZXIgPyBPYmplY3Qua2V5cyhsaXN0ZW5lcikuam9pbignLCcpIDogbnVsbCk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLnNldENhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruimgeingueci+S6uuWRmCjljIXmi6zoh6rlt7Hlkozlr7nmlrkp55qE5aqS5L2T5pKt5pS+5ZmoXG4gICAqIEBwYXJhbSBsaXN0IOS4uuS4gOS4quWIl+ihqO+8jOWPr+S8oOWFpeWkmuS6uueahOWqkuS9k+aSreaUvuWZqFxuICAgKiBAcGFyYW0gaXRlbS51c2VySWQg55So5oi3IGlkXG4gICAqIEBwYXJhbSBpdGVtLnZpZGVvRWxlbWVudCDkuIDkuKogdmlkZW8g5YWD57Sg77yM55So5LqO5pKt5pS+6KeG6aKR77yM6ZyA6KaB5oyC6L295Zyo5Lia5Yqh5bGC6aG16Z2i5LiKXG4gICAqIEBwYXJhbSBpdGVtLmlzVGlueSDmmK/lkKbop4LnnIvliKvkurrnmoTlsI/mtYHvvIzlsI/nqpflj6Pml7blj6/ku6XphY3nva7kuLogdHJ1Ze+8jOWPr+iKguecgeW4puWuve+8jHVzZXJJZCDkuLrov5znq6/nlKjmiLfml7bmnInmlYhcbiAgICogQHJldHVybnMgY29kZSDov5Tlm57mmK/lkKborr7nva7miJDlip9cbiAgICovXG4gIHNldFZpZGVvVmlldyhsaXN0OiB7dXNlcklkOiBzdHJpbmcsIHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55PzogYm9vbGVhbn1bXSk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfVCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbGlzdDogbGlzdC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VySWQsIHZpZGVvRWxlbWVudCwgaXNUaW55IH0gPSBpdGVtO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBlbGVtZW50TmFtZTogdmlkZW9FbGVtZW50Py5ub2RlTmFtZSxcbiAgICAgICAgICBpc1RpbnksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmo4DmtYtcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5QXJyYXkobGlzdCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCBsaXN0OiBub3QgZW1wdHkgYXJyYXksIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGxpc3QpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBsaXN0W2luZGV4XTtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCB2aWRlb0VsZW1lbnQgfSA9IGl0ZW07XG4gICAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbGlkYXRlVmlkZW9Ob2RlTmFtZSh2aWRlb0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCB2aWRlb0VsZW1lbnQ6IG5lZWQgYSB2aWRlbyBlbGVtZW50LCB2YWx1ZTogJHt2aWRlb0VsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHZpZGVvRWxlbWVudC5ub2RlTmFtZSA6IHZpZGVvRWxlbWVudH1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsICdzdWNjZXMnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9WaWV3KGxpc3QsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTmn5DkuKrkurrnmoTlqpLkvZPmkq3mlL7lmahcbiAgICog5LiN6KeC55yL5p+Q5Liq5Lq655qE6KeG6aKR5pe277yM5Lia5Yqh5bGC5Y+v5Lul55u05o6l56e76Zmk5a+55bqU55qEIHZpZGVvIOagh+etvu+8jFxuICAgKiDosIMgcmVtb3ZlVmlkZW9WaWV3IOaWueazle+8jFNESyDlhoXpg6jkvJrlgZzmraLmjqXmlLblr7nmlrnnmoTlqpLkvZPkvKDovpNcbiAgICogQHBhcmFtIHVzZXJJZHMg55So5oi3IGlkIOWIl+ihqFxuICAgKiBAcmV0dXJucyBjb2RlIOi/lOWbnuaYr+WQpuWIoOmZpOaIkOWKn1xuICAgKi9cbiAgcmVtb3ZlVmlkZW9WaWV3KHVzZXJJZHM6IHN0cmluZ1tdKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VySWRzLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOajgOa1i1xuICAgICAqL1xuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheSh1c2VySWRzKVxuICAgICAgJiYgdXNlcklkcy5ldmVyeSgodXNlcklkKSA9PiBub3RFbXB0eVN0cmluZyh1c2VySWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFTU9WRV9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCB1c2VySWRzOiBub3QgZW1wdHkgYXJyYXksIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVNT1ZFX1ZJREVPX1ZJRVdfUiwgJ3N1Y2NlcycsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fcnRjTW9kdWxlLnJlbW92ZVZpZGVvVmlldyh1c2VySWRzLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5pKt5pS+5oyH5a6a5Lq65ZGY55qE6Z+z6KeG6aKR5aqS5L2TXG4gICAqIOaSreaUvuafkOS4quS6uueahOinhumikeWJje+8jOivt+ehruS/neW3sue7j+iwg+eUqCBgc2V0VmlkZW9WaWV3YCDmlrnms5XkuLrlhbborr7nva7op4bpopHop4blm75cbiAgICogQHBhcmFtIHVzZXJJZCDmjIflrpropoHmn6XnnIvmn5DkuKrkurrnmoTlqpLkvZPotYTmupBcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDmjIflrprmkq3mlL7pn7PpopHov5jmmK/op4bpopFcbiAgICogQHJldHVybnMg6L+U5Zue5piv5ZCm5pKt5pS+5oiQ5YqfXG4gICAqL1xuICBhc3luYyBwbGF5TWVkaWEodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VySWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh1c2VySWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IsIGBwYXJhbXMgZXJyLCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNNZWRpYVR5cGVbbWVkaWFUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYHBhcmFtcyBlcnIsIG1lZGlhVHlwZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreS4muWKoeWxguaYr+WQpuiuvue9rui/h+W9k+WJjeS6uuWRmOeahOinhumikeinhuWbvlxuICAgICAqL1xuICAgIGNvbnN0IHsgdmlkZW9WaWV3IH0gPSB0aGlzLl9ydGNNb2R1bGUuZ2V0VXNlclZpZXdNYXAoKVt1c2VySWRdIHx8IHt9O1xuICAgIGlmIChtZWRpYVR5cGUgIT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgIXZpZGVvVmlldykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5WSURFT19WSUVXX05PVF9TRVR9LCB2aWRlbyB2aWV3IG5vdCBzZXRgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlZJREVPX1ZJRVdfTk9UX1NFVCB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ydGNNb2R1bGUucGxheU1lZGlhKHVzZXJJZCwgbWVkaWFUeXBlLCB2aWRlb1ZpZXcsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuinhumikemFjee9ruaehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ1ZpZGVvQ29uZmlnQnVpbGRlciDnlKjkuo7mnoTpgKDop4bpopHph4fpm4bml7bnmoTphY3nva7pobnvvIzlj6/ku6Xorr7nva7mkYTlg4/lpLTorr7lpIcgaWTjgIHluKfnjofjgIHliIbovqjnjofnrYnvvIxcbiAgICog6K6+572u5a6M6ZyA6LCDIGJ1aWxkIOaWueazle+8jOacgOe7iOWcqCBzZXRWaWRlb0NvbmZpZyDlkI7nlJ/mlYhcbiAgICovXG4gIGNyZWF0ZVZpZGVvQ29uZmlnQnVpbGRlcigpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBSQ1ZpZGVvQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruinhumikemFjee9rlxuICAgKiDkuIvmrKHph4fpm4bml7bnlJ/mlYjvvIzlpoLliIfmjaLmkYTlg4/lpLTjgIHph43mlrDlu7rnq4vpgJror51cbiAgICovXG4gIHNldFZpZGVvQ29uZmlnKGNmZzogSVZpZGVvQ29uZmlnKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1QsIEpTT04uc3RyaW5naWZ5KGNmZykpO1xuXG4gICAgY29uc3Qge1xuICAgICAgZnJhbWVSYXRlLCByZXNvbHV0aW9uLCBtYXhCaXRyYXRlLCBtaW5CaXRyYXRlLFxuICAgIH0gPSBjZmc7XG5cbiAgICBpZiAoIVJDQ2FsbFBsdXNGcmFtZVJhdGVbZnJhbWVSYXRlXSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCBgcGFyYW0gZXJyb3IsIGZyYW1lUmF0ZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtmcmFtZVJhdGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmICghUkNDYWxsUGx1c1Jlc29sdXRpb25bcmVzb2x1dGlvbl0pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCByZXNvbHV0aW9uIGlzIGlsbGVnYWwsIHZhbHVlOiAke3Jlc29sdXRpb259YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgZXJyb3JNc2cgfSA9IHZhbGlkYXRlQml0cmF0ZShtaW5CaXRyYXRlLCBtYXhCaXRyYXRlKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCBlcnJvck1zZyk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1IsICdzdWNjZXNzJyk7XG4gICAgdGhpcy5fdmlkZW9Db25maWcgPSB7IC4uLmNmZyB9O1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRWaWRlb0NvbmZpZyh0aGlzLl92aWRlb0NvbmZpZyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikemFjee9ruaehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ0F1ZGlvQ29uZmlnQnVpbGRlciDnlKjkuo7mnoTpgKDpn7PpopHph4fpm4bml7bnmoTphY3nva7pobnvvIzlj6/ku6Xorr7nva7puqblhYvpo47orr7lpIcgaWRcbiAgICog6K6+572u5a6M6ZyA6LCDIGJ1aWxkIOaWueazle+8jOacgOe7iOWcqCBzZXRBdWRpb0NvbmZpZyDlkI7nlJ/mlYhcbiAgICovXG4gIGNyZWF0ZUF1ZGlvQ29uZmlnQnVpbGRlcigpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBSQ0F1ZGlvQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9rumfs+mikemFjee9rlxuICAgKiDkuIvmrKHph4fpm4bml7bnlJ/mlYjvvIzlpoLph43mlrDlu7rnq4vpgJror51cbiAgICovXG4gIHNldEF1ZGlvQ29uZmlnKGNmZzogSUF1ZGlvQ29uZmlnKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QsIEpTT04uc3RyaW5naWZ5KGNmZykpO1xuICAgIGNvbnN0IHsgc2FtcGxlUmF0ZSwgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gY2ZnO1xuICAgIGlmIChzYW1wbGVSYXRlICYmICFpc051bWJlcihzYW1wbGVSYXRlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SLCBgcGFyYW0gZXJyb3IsIHNhbXBsZVJhdGU6IHR5cGUgaXMgbnVtYmVyLCB2YWx1ZTogJHtzYW1wbGVSYXRlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZUJpdHJhdGUobWluQml0cmF0ZSwgbWF4Qml0cmF0ZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgZXJyb3JNc2cpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SLCAnc3VjY2VzcycpO1xuXG4gICAgdGhpcy5fYXVkaW9Db25maWcgPSB7IC4uLmNmZyB9O1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRBdWRpb0NvbmZpZyh0aGlzLl9hdWRpb0NvbmZpZyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvlj6vkurrlkZggdXNlcklkIOWIl+ihqO+8jOWNleS6uuWRvOWPq+S7hemcgOWcqOaVsOe7hOS4reaUvue9ruWvueaWueS4gOS6uueahCB1c2VySWRcbiAgICogQHBhcmFtIHR5cGUg5Y2V5Lq65ZG85Y+rIG9yIOWkmuS6uuWRvOWPq1xuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOmAmuivneWqkuS9k+exu+Weizog6Z+z6aKRIG9yIOmfs+inhumikVxuICAgKiBAcmV0dXJucyBjYWxsSWQg5ZG85Y+r5oiQ5Yqf5ZCO77yM5Lqn55Sf55qE5Lya6K+dIGlkXG4gICAqL1xuICBhc3luYyBzdGFydENhbGwodXNlcklkczogc3RyaW5nW10sIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSA9IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSwgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlID0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIGNhbGxJZD86IHN0cmluZyB9PiB7XG4gICAgdGhpcy5fY2xpZW50Q2FsbElkID0gZ2V0VVVJRCgpO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9ULCBgdXNlcklkczogJHt1c2VySWRzLmpvaW4oJywnKX0sIGNhbGxUeXBlOiAke2NhbGxUeXBlfSwgbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKSAhPT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KHVzZXJJZHMpXG4gICAgICAmJiB1c2VySWRzLmV2ZXJ5KCh1c2VySWQpID0+IG5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgdXNlcklkczogbm90IGVtcHR5IGFycmF5LCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c1R5cGVbY2FsbFR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgY2FsbFR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7Y2FsbFR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmIChpc1VuZGVmaW5lZChSQ0NhbGxQbHVzTWVkaWFUeXBlW21lZGlhVHlwZV0pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBwYXJhbXMgZXJyLCBtZWRpYVR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDljZXogYogdXNlcklkcyDplb/luqbkuI3og73otoXov4cgMVxuICAgICAqL1xuICAgIGlmICh1c2VySWRzLmxlbmd0aCA+IDEgJiYgY2FsbFR5cGUgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgWW91IGNhbiBvbmx5IGNhbGwgb25lIHBlcnNvbiBpbiBhIHNpbmdsZSBjYWxsLCB1c2VySWRzOiAke3VzZXJJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlt7LlrZjlnKggc2Vzc2lvbiDkuI3lhYHorrjlho3lj5Hotbflkbzlj6tcbiAgICBpZiAodGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0VTU0lPTl9FWElTVH0sIHNlc3Npb24gZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1QgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpn7Pop4bpopHpgJror53vvIzpnIDmj5DliY3ph4fpm4bpn7Pop4bpopHotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGNyZWF0ZSBtZWlkYSB0cmFja3MgZXJyb3IgY29kZTogJHtnZXRNZWRpYVRyYWNrc0NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuc3RhcnRDYWxsKHtcbiAgICAgIHRvVXNlcnM6IHVzZXJJZHMubWFwKCh1c2VySWQpID0+ICh7IHVzZXJJZCB9KSksXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2xpZW50Q2FsbElkLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfU1RBUlRfQ0FMTF9TLCBjb2RlLCBzdGFydFRpbWUsIG51bGwsIHRoaXMuX2NsaWVudENhbGxJZCwgbnVsbCwgeyBtZWRpYVR5cGUsIGNhbGxUeXBlLCBjYWxsSWQ6IGRhdGE/LmNhbGxJZCB8fCAnJyB9KTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5ZG85Y+r6L+H56iL5Lit5oyC5patXG4gICAgICovXG4gICAgY29uc3QgeyBjYWxsSWQsIGNsaWVudENhbGxJZCB9ID0gZGF0YSE7XG4gICAgaWYgKHRoaXMuX25lZWRIYW5ndXBDYWxsSWQgPT09IGNsaWVudENhbGxJZCkge1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5jbGVhckFsbFRpbWVyKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmhhbmd1cCh7IGNhbGxJZCB9LCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgdGhlICR7Y2FsbElkfSBjYWxsIGhhcyBiZWVuIGhhbmd1cGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuTVVMVEkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ29ubmVjdGVkKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIEpTT04uc3RyaW5naWZ5KHsgZGF0YSwgY29kZSB9KSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgY2FsbElkIH07XG4gIH1cblxuICAvKipcbiAgICog55u05o6l5Yqg5YWl6L+b6KGM5Lit55qE576k57uE6YCa6K+dXG4gICAqIEBwYXJhbSBjYWxsSWQg6YCa6K+dIGlkXG4gICAqL1xuICBhc3luYyBqb2luTXVsdGlDYWxsKGNhbGxJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCkgIT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgcGFyYW1zIGVyciwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZTogZ2V0U2Vzc2lvbkNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFNlc3Npb24oeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGdldFNlc3Npb25Db2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGdldCBjYWxsIGRhdGEgZXJyb3IsIGNvZGU6ICR7Z2V0U2Vzc2lvbkNvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRTZXNzaW9uQ29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgbWVkaWFUeXBlIH0gPSBkYXRhITtcblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKG1haW5TZXNzaW9uICYmIG1haW5TZXNzaW9uLmdldENhbGxJZCgpICE9PSBjYWxsSWQpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1QgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpn7Pop4bpopHpgJror53vvIzpnIDmj5DliY3ph4fpm4bpn7Pop4bpopHotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY3JlYXRlIG1laWRhIHRyYWNrcyBlcnJvciBjb2RlOiAke2dldE1lZGlhVHJhY2tzQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5qb2luQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX3J0Y01vZHVsZS5kZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gICAgYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25Db25uZWN0ZWQoY2FsbElkLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6YKA6K+35LuW5Lq6XG4gICAqIOWNleS6uumAmuivneS4remCgOivt+S7luS6uuS8muW8leWPkemAmuivneexu+Wei+WPmOabtFxuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fkurrliJfooahcbiAgICogQHJldHVybnMgYnVzeVVzZXJzIOi/lOWbnuW/mee6v+S6uuWRmOWIl+ihqFxuICAgKi9cbiAgYXN5bmMgaW52aXRlKHVzZXJJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgYnVzeVVzZXJzPzogUkNDYWxsUGx1c0NhbGxVc2VyW10gfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1QsIGBjYWxsSWQ6ICR7dXNlcklkcy5qb2luKCcsJyl9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIShcbiAgICAgIG5vdEVtcHR5QXJyYXkodXNlcklkcylcbiAgICAgICYmIHVzZXJJZHMuZXZlcnkoKHVzZXJJZCkgPT4gbm90RW1wdHlTdHJpbmcodXNlcklkKSlcbiAgICApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZHM6IG5vdCBlbXB0eSBhcnJheSwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+R6LW36YKA6K+3XG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmludml0ZSh7XG4gICAgICB0b1VzZXJzOiB1c2VySWRzLm1hcCgodXNlcklkKSA9PiAoe1xuICAgICAgICB1c2VySWQsXG4gICAgICB9KSksXG4gICAgfSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGJ1c3lVc2VycyA9IFtdO1xuICAgIGlmIChkYXRhIS5idXN5bGluZVVzZXJzPy5sZW5ndGgpIHtcbiAgICAgIGJ1c3lVc2Vycy5wdXNoKC4uLmRhdGEhLmJ1c3lsaW5lVXNlcnMubWFwKCh1c2VyKSA9PiAoe1xuICAgICAgICB1c2VySWQ6IHVzZXIudXNlcklkLFxuICAgICAgICBzdGF0ZTogdXNlci5zZXNzaW9uU3RhdHVzLFxuICAgICAgfSkpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgc3VjY2VzcyBidXN5VXNlcnM6ICR7SlNPTi5zdHJpbmdpZnkoYnVzeVVzZXJzKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIGJ1c3lVc2VycyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeWQrOmAmuivnVxuICAgKiBAcGFyYW0gY2FsbElkIOmAmuivnSBpZFxuICAgKi9cbiAgYXN5bmMgYWNjZXB0KGNhbGxJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCkgIT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgcGFyYW1zIGVyciwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuWtmOWcqOmAmuivnVxuICAgICAqIOmcgOS7juW9k+WJjemAmuivneiOt+WPliBtZWlkYVR5cGVcbiAgICAgKi9cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGNvbnN0IGhvbGRTZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRIb2xkU2Vzc2lvbihjYWxsSWQpO1xuICAgIGlmICghbWFpblNlc3Npb24gJiYgIWhvbGRTZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGVyckNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yy65YiG5o6l5ZCsIG1haW5TZXNzaW9uIOWSjCBob2xkU2Vzc2lvblxuICAgICAqIOWmguaenOaOpeWQrCBob2xkU2Vzc2lvbu+8jOmcgOWFiOaMguaWrSBtYWluU2Vzc2lvblxuICAgICAqL1xuICAgIGNvbnN0IGlzQWNjZXB0SG9sZFNlc3Npb24gPSBjYWxsSWQgPT09IGhvbGRTZXNzaW9uPy5nZXRDYWxsSWQoKTtcbiAgICBpZiAoaXNBY2NlcHRIb2xkU2Vzc2lvbikge1xuICAgICAgY29uc3QgeyBjb2RlOiBoYW5ndXBNYWluU2Vzc2lvbkNvZGUgfSA9IGF3YWl0IHRoaXMuaGFuZ3VwKG1haW5TZXNzaW9uIS5nZXRDYWxsSWQoKSk7XG4gICAgICBpZiAoaGFuZ3VwTWFpblNlc3Npb25Db2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgaGFuZ3VwIG1haW5TZXNzaW9uIGVycm9yIGNvZGU6ICR7aGFuZ3VwTWFpblNlc3Npb25Db2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBoYW5ndXBNYWluU2Vzc2lvbkNvZGUgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUudXBncmFkZU1haW5TZXNzaW9uKGNhbGxJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Z+z6KeG6aKR6YCa6K+d77yM6ZyA5o+Q5YmN6YeH6ZuG6Z+z6KeG6aKR6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgbWVkaWFUeXBlID0gbWFpblNlc3Npb24hLmdldE1lZGlhVHlwZSgpO1xuICAgIGNvbnN0IHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuY3JlYXRlQ2FsbE1lZGlhVHJhY2tzKG1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gICAgaWYgKGdldE1lZGlhVHJhY2tzQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBjcmVhdGUgbWVpZGEgdHJhY2tzIGVycm9yIGNvZGU6ICR7Z2V0TWVkaWFUcmFja3NDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+R6LW35o6l5ZCsXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmFjY2VwdCh7IGNhbGxJZCB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0FDQ0VQVF9DQUxMX1MsIGNvZGUsIHN0YXJ0VGltZSwgbWFpblNlc3Npb24hKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ29ubmVjdGVkKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfX2lubmVySGFuZ3VwKG9wdHM6IElIYW5ndXBGb3JCdXN5T3B0cywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBjYWxsSWQgfSA9IG9wdHM7XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldElzTG9jYWxDbGllbnRIYW5ndXAodHJ1ZSk7XG4gICAgdGhpcy5fY2FsbEVuZ2luZS5jbGVhckFsbFRpbWVyKGNhbGxJZCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuaGFuZ3VwKG9wdHMsIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgPT09IENhbGxTZXJ2ZXJFcnJvckNvZGUuQ0FMTF9OT1RfRVhJU1QpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyAmJiBjYWxsSWQgPT09IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRDYWxsSWQoKSkge1xuICAgICAgYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25DbG9zZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq3pgJror51cbiAgICogQHBhcmFtIGNhbGxJZCDkuLrlj6/pgInlj4LmlbDvvIzkuI3kvKDml7bvvIzmjILmlq3mraPlnKjov5vooYznmoTkuLsgc2Vzc2lvbu+8jOS8oOWFpeaXtuWPr+aMh+WumuaMguaWreS4u+mAmuivneaIluaaguacquW7uueri+i/nuaOpeeahOmAmuivnVxuICAgKiDmmoLmnKrlu7rnq4vov57mjqXnmoTpgJror53vvJrmjIflt7LlnKjpgJror53kuK3ml7bvvIzmlLbliLDlkbzlj6vkvYbmmoLmnKrmjqXlkKznmoTpgJror51cbiAgICovXG4gIGFzeW5jIGhhbmd1cChjYWxsSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFtYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDnsbvlnovmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoY2FsbElkICYmICFpc1N0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgbWFpblNlc3Npb25DYWxsSWQgPSBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKTtcblxuICAgIC8qKlxuICAgICAqIOagoemqjOS8oOWFpeeahCBjYWxsSWQg5piv5ZCm5q2j56GuXG4gICAgICovXG4gICAgaWYgKGNhbGxJZCAmJiBjYWxsSWQgIT09IG1haW5TZXNzaW9uQ2FsbElkICYmICF0aGlzLl9jYWxsRW5naW5lLmdldEhvbGRTZXNzaW9uKGNhbGxJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9SLCBgcGFyYW1zIGVyciwgY2FsbElkIGlzIGludmFsaWQsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLkNBTExfSURfSU5WQUxJRCB9O1xuICAgIH1cblxuICAgIHRoaXMuX2lzTGF1bmNoSGFuZ3VwID0gdHJ1ZTtcblxuICAgIHRoaXMuX25lZWRIYW5ndXBDYWxsSWQgPSBjYWxsSWQgfHwgbWFpblNlc3Npb25DYWxsSWQ7XG4gICAgY29uc3QgaG9sZFNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldEhvbGRTZXNzaW9uKHRoaXMuX25lZWRIYW5ndXBDYWxsSWQpO1xuICAgIGNvbnN0IGhhbmd1cFNlc3Npb24gPSBob2xkU2Vzc2lvbiB8fCBtYWluU2Vzc2lvbjtcblxuICAgIC8qKlxuICAgICAqIOiOt+WPluaMguaWreaXtueahOS6uuWRmOezu+e7n+eKtuaAgVxuICAgICAqL1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHVzZXJTdGF0ZSA9IG1haW5TZXNzaW9uLmdldFVzZXJMaXN0KCkuZmlsdGVyKCh1c2VySW5mbykgPT4gdXNlckluZm8udXNlcklkID09PSBjdXJyZW50VXNlcklkKVswXS5zdGF0ZTtcbiAgICBjb25zdCBpc0NhbGxlZSA9IFttYWluU2Vzc2lvbi5nZXRDcmVhdG9yVXNlcklkKCksIG1haW5TZXNzaW9uLmdldEludml0ZXJVc2VySWQoKV0uaW5jbHVkZXMoY3VycmVudFVzZXJJZCk7XG4gICAgY29uc3Qgc3lzdGVtU3RhdGUgPSBnZXRIYW5ndXBTeXN0ZW1TdGF0ZSh1c2VyU3RhdGUsIGlzQ2FsbGVlKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fX2lubmVySGFuZ3VwKHsgY2FsbElkOiB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkLCBzeXN0ZW1TdGF0ZSB9LCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOS4iuaKpeaMguaWreWfi+eCueaVsOaNrlxuICAgICAqL1xuICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0hBTkdVUF9DQUxMX1MsIGNvZGUsIHN0YXJ0VGltZSwgaGFuZ3VwU2Vzc2lvbiEsIHRoaXMuX2NsaWVudENhbGxJZCk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1IsIGBzaWduYWwgZXJyb3IgY29kZSA6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkID0gbnVsbDtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3lj5HotbflqpLkvZPnsbvlnovlj5jmm7Tor7fmsYJcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDlqpLkvZPnsbvlnotcbiAgICogQHJldHVybnMgdHJhbnNhY3Rpb25JZCDlrqLmiLfnq6/lkozmnI3liqHnq6/kuqTkupLnmoTkuovliqEgaWTvvIzlnKjlj5bmtojmiJblupTnrZTlqpLkvZPnsbvlnovliIfmjaLml7bkvKDlhaVcbiAgICovXG4gIGFzeW5jIHJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgdHJhbnNhY3Rpb25JZD86IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1QsIGBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNNZWRpYVR5cGVbbWVkaWFUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtcyBlcnIsIG1lZGlhVHlwZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5nZXRDdXJyZW50Q2FsbFNlc3Npb24oKTtcbiAgICBjb25zdCBvbGRNZWRpYVR5cGUgPSBtYWluU2Vzc2lvbj8uZ2V0TWVkaWFUeXBlKCk7XG5cbiAgICBpZiAobWVkaWFUeXBlID09PSBvbGRNZWRpYVR5cGUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuTUVESUFUWVBFX0lOVkFMSUR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NRURJQVRZUEVfSU5WQUxJRCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreaYr+WQpuWcqOmAmuivneS4rVxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+R6LW35aqS5L2T57G75Z6L5YiH5o2iXG4gICAgICovXG4gICAgY29uc3QgdG9Vc2VySWRzID0gbWFpblNlc3Npb24/LmdldFVzZXJMaXN0KCkuZmlsdGVyKCh1c2VyKSA9PiB1c2VyLnVzZXJJZCAhPT0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSkubWFwKCh1c2VyKSA9PiB1c2VyLnVzZXJJZCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLnJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUoeyBtZWRpYVR5cGUsIHRvVXNlcklkczogdG9Vc2VySWRzIHx8IFtdIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc3VjY2VzcyB0cmFuc2FjdGlvbklkOiAke2RhdGEhLnRyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICB0cmFuc2FjdGlvbklkOiBkYXRhIS50cmFuc2FjdGlvbklkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+W5raI5YiH5o2i5aqS5L2T57G75Z6L5Y+Y5pu06K+35rGCXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIOWuouaIt+err+WSjOacjeWKoeerr+S6pOS6kueahOS6i+WKoSBpZO+8jOS4uuWPkei1t+WqkuS9k+exu+Wei+WPmOabtOivt+axgui/lOWbnueahCB0cmFuc2FjdGlvbklkXG4gICAqL1xuICBhc3luYyBjYW5jZWxDaGFuZ2VNZWRpYVR5cGUodHJhbnNhY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfVCwgYHRyYW5zYWN0aW9uSWQ6ICR7dHJhbnNhY3Rpb25JZH1gLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghbm90RW1wdHlTdHJpbmcodHJhbnNhY3Rpb25JZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgcGFyYW0gZXJyb3IsIHRyYW5zYWN0aW9uSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreaYr+WQpuWcqOmAmuivneS4rVxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgZXJyb3IgY29kZSA6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9LCBzZXNzaW9uIG5vdCBleGlzdGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj5bmtojlqpLkvZPnsbvlnovliIfmjaJcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuY2FuY2VsQ2hhbmdlTWVkaWFUeXBlKHsgdHJhbnNhY3Rpb25JZCB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWqkuS9k+exu+Wei+WPmOabtOW6lOetlFxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCDlrqLmiLfnq6/lkozmnI3liqHnq6/kuqTkupLnmoTkuovliqEgaWTvvIzkuLogb25SZWNlaXZlZENoYW5nZVRvVmlkZW8g55uR5ZCs5pS25YiwIHRyYW5zYWN0aW9uSWQg5Y+C5pWw5YC8XG4gICAqL1xuICBhc3luYyByZXBseUNoYW5nZU1lZGlhVHlwZSh0cmFuc2FjdGlvbklkOiBzdHJpbmcsIGlzQWdyZWU6IGJvb2xlYW4pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1QsIGB0cmFuc2FjdGlvbklkOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHRyYW5zYWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgcGFyYW0gZXJyb3IsIHRyYW5zYWN0aW9uSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihpc0FncmVlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCBpc0FncmVlOiB0eXBlIGlzIGJvb2xlYW4sIHZhbHVlOiAke2lzQWdyZWV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreaYr+WQpuWcqOmAmuivneS4rVxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5yZXNwb25zZUNoYW5nZU1lZGlhVHlwZSh7XG4gICAgICB0cmFuc2FjdGlvbklkLFxuICAgICAgYWdyZWU6IGlzQWdyZWUsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBzaWduYWwgZXJyb3I6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjei/m+ihjOS4reeahOmAmuivnVxuICAgKiBAcmV0dXJucyBSQ0NhbGxQbHVzU2Vzc2lvbiDlr7nosaHmiJYgbnVsbCDkuLrlvZPliY3mraPlnKjov5vooYznmoTpgJror53lr7nosaFcbiAgICovXG4gIGdldEN1cnJlbnRDYWxsU2Vzc2lvbigpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDku47mnI3liqHlmajojrflj5bmnKrnu5PmnZ/nmoTpgJror53orrDlvZVcbiAgICogQHJldHVybnMgcmVjb3JkcyDkuIDnu4TmnKrnu5PmnZ/nmoTpgJror53orrDlvZVcbiAgICovXG4gIGFzeW5jIGdldEF2YWlsYWJsZUNhbGxSZWNvcmRzRnJvbVNlcnZlcigpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCByZWNvcmRzPzogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW10gfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldE9wZW5DYWxsTGlzdCh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCBgc3VjY2VzcywgZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHJlY29yZHM6IGRhdGEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliIbpobXmn6Xmib7lvZPliY3nlKjmiLfnmoTlhajpg6jpgJror53orrDlvZVcbiAgICogQHBhcmFtIHN0YXJ0VGltZXN0YW1wIOi1t+Wni+aXtumXtOaIs++8jOi/lOWbnuWkp+S6juatpOaXtumXtOaIs+eahOmAmuivneiusOW9lVxuICAgKiBAcGFyYW0gY291bnQg5q+P5qyh6I635Y+W55qE5pWw6YePXG4gICAqIEByZXR1cm5zIHJlc3VsdC5oYXNNb3JlIOaYr+WQpuacieabtOWkmumAmuivneiusOW9lVxuICAgKiBAcmV0dXJucyByZXN1bHQubGlzdCDpgJror53orrDlvZXliJfooajvvIznsbvlnovkuLogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW13vvIzlj6/pgJrov4cgYXBpRG9jIOafpeeci+WFt+S9k+WMheWQq+Wtl+autVxuICAgKiBAcmV0dXJucyByZXN1bHQubWF4VGltZSDliJfooajkuK3mnIDlpKfml7bpl7TmiLPvvIzlpoLmnpwgaGFzTW9yZSDkuLogdHJ1Ze+8jOe7p+e7reiOt+WPluaXtu+8jOS8oOWFpeatpOaXtumXtOaIs1xuICAgKi9cbiAgYXN5bmMgZ2V0Q2FsbFJlY29yZHMoc3RhcnRUaW1lc3RhbXA6IG51bWJlciwgY291bnQ6IG51bWJlcik6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHJlc3VsdD86IElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlcyB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1QsIGBzdGFydFRpbWVzdGFtcDogJHtzdGFydFRpbWVzdGFtcH0sIGNvdW50OiAke2NvdW50fWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCEoaXNOdW1iZXIoc3RhcnRUaW1lc3RhbXApICYmIHN0YXJ0VGltZXN0YW1wID49IDApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IsIGBwYXJhbXMgZXJyb3IsIHN0YXJ0VGltZXN0YW1wOiBpcyBhIG51bWJlciA+PSAwLCB2YWx1ZTogJHtzdGFydFRpbWVzdGFtcH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKCEoaXNOdW1iZXIoY291bnQpICYmIGNvdW50ID4gMCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgYHBhcmFtcyBlcnJvciwgY291bnQ6IGlzIGEgbnVtYmVyID49IDAsIHZhbHVlOiAke2NvdW50fWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbExvZ0xpc3Qoe1xuICAgICAgdGltZXN0YW1wOiBzdGFydFRpbWVzdGFtcCxcbiAgICAgIGNvdW50LFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgcmVzdWx0OiBkYXRhISxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg6ZuG5ZCI5om56YeP5Yig6Zmk6YCa6K+d6K6w5b2VXG4gICAqIEBwYXJhbSBjYWxsSWRzIGNhbGxJZCDliJfooahcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUNhbGxSZWNvcmRzRnJvbVNlcnZlcihjYWxsSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfVCwgYGNhbGxJZHM6ICR7Y2FsbElkcy5qb2luKCcsJyl9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIShcbiAgICAgIG5vdEVtcHR5QXJyYXkoY2FsbElkcylcbiAgICAgICYmIGNhbGxJZHMuZXZlcnkoKGNhbGxJZCkgPT4gbm90RW1wdHlTdHJpbmcoY2FsbElkKSlcbiAgICApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SLCBgcGFyYW1zIGVyciwgY2FsbElkczogbm90IGVtcHR5IGFycmF5LCBjYWxsSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIGNhbGxJZHM6ICR7SlNPTi5zdHJpbmdpZnkoY2FsbElkcyl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5kZWxldGVDYWxsTG9nKGNhbGxJZHMsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9DQUxMX1JFQ09SRFNfQllfQ0FMTElEX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXnqbrmiYDmnInpgJror53orrDlvZVcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbENhbGxSZWNvcmRzRnJvbVNlcnZlcigpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9BTExfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5yZW1vdmVBbGxDYWxsTG9nKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9BTExfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOW8gOWQr+aRhOWDj+WktFxuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d6L+H56iL5Lit5omT5byA5pGE5YOP5aS077yM5aaC5p6c5omp5pWj6LWE5rqQ5aSx6LSl77yM5Y2z5a+55pa55rKh5pS25Yiw5pys56uv5omT5byA5pGE5YOP5aS055qE6YCa55+l5pe277yM5q2k5qyh6KGM5Li65aSx6LSlXG4gICAqIEByZXR1cm5zIHRyYWNrIOaRhOWDj+WktOinhumikei1hOa6kFxuICAgKi9cbiAgYXN5bmMgc3RhcnRDYW1lcmEoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog6I635Y+W5pGE5YOP5aS06LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmdldENhbWVyYVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SLCBgY3JlYXRlIHZpZGVvIHRyYWNrIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgUkNDYWxsUGx1c01lZGlhVHlwZS5WSURFTywgdHJ1ZSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRyYWNrPy5pc1B1Ymxpc2hlZCgpICYmIHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRTdGF0ZSgpID09PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUucHVibGlzaFZpZGVvVHJhY2soKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgYHB1Ymxpc2ggZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWQr+eUqOi1hOa6kFxuICAgICAqIOaJqeaVo+WQr+eUqOi1hOa6kOa2iOaBr++8jOWmguaenOWksei0pe+8jOWImSBzdGFydENhbWVyYSDooYzkuLrlpLHotKVcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IHVubXV0ZUNvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5lbmFibGVWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmICh1bm11dGVDb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUyAmJiB1bm11dGVDb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke3VubXV0ZUNvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiB1bm11dGVDb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5YWz6Zet5pGE5YOP5aS0XG4gICAqL1xuICBhc3luYyBzdG9wQ2FtZXJhKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmRpc2FibGVWaWRlb1RyYWNrKCk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyAmJiBjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfUiwgYGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveVRyYWNrKHRyYWNrISk7XG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU8sIGZhbHNlLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIh+aNouaRhOWDj+WktFxuICAgKiDliIfmjaLmiJDlip/lkI4gYElDYWxsUGx1c0V2ZW50TGlzdGVuZXJgIOebkeWQrOWZqOeahCBgb25Vc2VyTWVkaWFBdmFpbGFibGVgIOS4reS8muaUtuWIsOaWsOWIh+aNoueahOaRhOWDj+WktOi1hOa6kOWPr+aSreaUvu+8jOatpOaXtuiwg+eUqCBgY2FsbFBsdXNDbGllbnQucGxheU1lZGlhKClgIOWPr+aYvuekuuaWsOaRhOWDj+WktOeahOeUu+mdolxuICAgKiBAcGFyYW0gY2FtZXJhSWQg5rWP6KeI5Zmo5Lit5Y+W5b6X55qE5pGE5YOP5aS06K6+5aSHIGlk77yM5Y+v6LCDIHBsdWdpbi1ydGMg55qEIGdldENhbWVyYXMg5pa55rOV5Y+W5b6XXG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53liY3lkozpgJror53kuK3pg73lj6/osIPnlKhcbiAgICovXG4gIGFzeW5jIHN3aXRjaENhbWVyYShjYW1lcmFJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfVCwgYGNhbWVyYUlkOiAke2NhbWVyYUlkfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyhjYW1lcmFJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYHBhcmFtIGVycm9yLCBjYW1lcmFJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7Y2FtZXJhSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGlmIChzZXNzaW9uLmdldE1lZGlhVHlwZSgpID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9WSURFT19DQUxMfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX1ZJREVPX0NBTEwgfTtcbiAgICB9XG5cbiAgICB0aGlzLl92aWRlb0NvbmZpZy5jYW1lcmFJZCA9IGNhbWVyYUlkO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRWaWRlb0NvbmZpZyh0aGlzLl92aWRlb0NvbmZpZyk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jaGFuZ2VWaWRlb0RldmljZSh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9SLCBgY2FsbCBjbGllbnQgY2hhbmdlVmlkZW9EZXZpY2UgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5byA5ZCv6bqm5YWL6aOOXG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53ov4fnqIvkuK3miZPlvIDpuqblhYvpo47vvIzlpoLmnpzmianmlaPotYTmupDlpLHotKXvvIzljbPlr7nmlrnmsqHmlLbliLDmnKznq6/miZPlvIDpuqblhYvpo47nmoTpgJrnn6Xml7bvvIzmraTmrKHooYzkuLrlpLHotKVcbiAgICovXG4gIGFzeW5jIHN0YXJ0TWljcm9waG9uZSgpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX01JQ1JPUEhPTkVfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmdldE1pY3JvcGhvbmVBdWRpb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1IsIGBjcmVhdGUgbWljcm9waG9uZSBhdWRpbyB0cmFjayBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8sIHRydWUsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0cmFjayEuaXNPd25lck11dGVkKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVubXV0ZUNvZGUgPSBhd2FpdCB0cmFjayEudW5tdXRlKCk7XG4gICAgaWYgKHVubXV0ZUNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogdW5tdXRlQ29kZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhbPpl63puqblhYvpo45cbiAgICogQGRlc2NyaXB0aW9uIOmAmuivnei/h+eoi+S4reWFs+mXrem6puWFi+mjju+8jOWmguaenOaJqeaVo+i1hOa6kOWksei0pe+8jOWNs+WvueaWueayoeaUtuWIsOacrOerr+WFs+mXrem6puWFi+mjjueahOmAmuefpeaXtu+8jOatpOasoeihjOS4uuWksei0pVxuICAgKi9cbiAgYXN5bmMgc3RvcE1pY3JvcGhvbmUoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX01JQ1JPUEhPTkVfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmRpc2FibGVBdWRpb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTywgZmFsc2UsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX01JQ1JPUEhPTkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6bqm5YWL6aOO5piv5ZCm5byA5ZCvXG4gICAqL1xuICBpc01pY3JvcGhvbmVFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5fcnRjTW9kdWxlLmdldExvY2FsQXVkaW9UcmFjaygpO1xuICAgIHJldHVybiAhIXRyYWNrICYmICF0cmFjay5pc093bmVyTXV0ZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7miYDmnInov5znq6/pn7PpopHmtYHmmK/lkKblj6/nlKhcbiAgICogQHBhcmFtIGVuYWJsZSDkuLogdHJ1ZSDml7bvvIzpnZnpn7PmiYDmnInov5znq6/pn7PpopHmtYHvvJvkuLogZmFsc2Ug5pe277yM5ZCv55So5omA5pyJ6L+c56uv6Z+z6aKR5rWBXG4gICAqL1xuICBhc3luYyBzZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICByZXR1cm4gdGhpcy5fcnRjTW9kdWxlLnNldEFsbFJlbW90ZUF1ZGlvRW5hYmxlKGVuYWJsZSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIFNESyDniYjmnKzkv6Hmga9cbiAgICogQHJldHVybnMgU0RLIOeJiOacrOWPt1xuICAgKi9cbiAgZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBfX1ZFUlNJT05fXztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmkYTlg4/lpLTliJfooahcbiAgICovXG4gIGFzeW5jIGdldENhbWVyYXMoKSB7XG4gICAgY29uc3QgY2FtZXJhcyA9IGF3YWl0IGRldmljZS5nZXRDYW1lcmFzKCk7XG4gICAgcmV0dXJuIGNhbWVyYXM7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6bqm5YWL6aOO5YiX6KGoXG4gICAqL1xuICBhc3luYyBnZXRNaWNyb3Bob25lcygpIHtcbiAgICBjb25zdCBtaWNyb3Bob25lcyA9IGF3YWl0IGRldmljZS5nZXRNaWNyb3Bob25lcygpO1xuICAgIHJldHVybiBtaWNyb3Bob25lcztcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXNGdW5jdGlvbiwgaXNPYmplY3QsIGlzVW5kZWZpbmVkLCBMb2dMZXZlbCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgSVJDQ2FsbEluaXRPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JSW5kZXgnO1xuaW1wb3J0IHsgSVZhbGlkYXRlUmVzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JVmFsaWRhdGlvbic7XG5pbXBvcnQgeyBJQ2FsbFBsdXNFdmVudExpc3RlbmVyLCBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuXG4vKipcbiAqIOWIneWni+WMluWPguaVsOagoemqjFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVJbml0T3B0cyA9IChvcHRzOiBJUkNDYWxsSW5pdE9wdGlvbnMpOiBJVmFsaWRhdGVSZXMgPT4ge1xuICBpZiAoIW9wdHMpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gbWlzc2luZyBwYXJhbWV0ZXIgLT4gb3B0aW9ucycgfTtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KG9wdHMpKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnIH07XG4gIH1cblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0cyk7XG4gIC8vIOW/heS8oOWPguaVsOmqjOivgVxuICBpZiAoIWtleXMuaW5jbHVkZXMoJ3J0Y0NsaWVudCcpKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTlNUQUxMX1JUQ19QTFVHSU4gfTtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KG9wdHMucnRjQ2xpZW50KSkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdydGNDbGllbnRcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdvYmplY3RcXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuoYgbG9nU3Rkb3V0IOS9huS4jeaYryBmdW5jdGlvbiDnsbvlnotcbiAgaWYgKCFpc1VuZGVmaW5lZChvcHRzLmxvZ1N0ZG91dCkgJiYgIWlzRnVuY3Rpb24ob3B0cy5sb2dTdGRvdXQpKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xvZ1N0ZG91dFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG5cbiAgcmV0dXJuIHsgaXNMZWdhbDogdHJ1ZSB9O1xufTtcblxuLyoqXG4gKiByZWdpc3RlckNhbGxFdmVudExpc3RlbmVyIOWPguaVsOagoemqjFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVMaXN0ZW5lciA9IChsaXN0ZW5lcjogSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcik6IElWYWxpZGF0ZVJlcyA9PiB7XG4gIGlmICghbGlzdGVuZXIpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnbWlzc2luZyBwYXJhbWV0ZXIgLT4gbGlzdGVuZXInIH07XG4gIH1cblxuICAvLyDmoKHpqozmmK/lkKbnvLrlsJHlv4XopoHnm5HlkKzlm57osIPms6jlhoxcbiAgY29uc3QgcmVxdWlyZWRLZXlzID0gWydvbkludml0ZScsICdvblNlc3Npb25DbG9zZScsICdvblJlbW90ZVRyYWNrUmVhZHknXTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhsaXN0ZW5lcik7XG4gIGNvbnN0IG1pc3NpbmdLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICByZXF1aXJlZEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIG1pc3NpbmdLZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuICBpZiAobWlzc2luZ0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogYG1pc3NpbmcgcGFyYW1ldGVyIC0+IFwiJHttaXNzaW5nS2V5cy5qb2luKCcsJyl9XCJgIH07XG4gIH1cblxuICBsZXQgcmVzOiBJVmFsaWRhdGVSZXMgPSB7IGlzTGVnYWw6IHRydWUgfTtcblxuICAvLyDmoKHpqozlv4XopoHnm5HlkKzmmK/lkKbmmK8gZnVuY3Rpb24g57G75Z6LXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWlyZWRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcmVxdWlyZWRLZXlzW2ldO1xuICAgIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcls8a2V5b2YgSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcj5rZXldKSkge1xuICAgICAgcmVzID0geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiBgJyR7a2V5fScgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSAnZnVuY3Rpb24nYCB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQge1xuICBJUGx1Z2luR2VuZXJhdG9yLCBJUnVudGltZSwgaXNVbmRlZmluZWQsIExvZ0wsIFBsdWdpbkNvbnRleHQsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDbGllbnQgfSBmcm9tICcuL2NvcmUvYXBpL1JDQ2FsbFBsdXNDbGllbnQnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb24gfSBmcm9tICcuL2NvcmUvbW9kdWxlcy9SQ0NhbGxQbHVzU2Vzc2lvbic7XG5pbXBvcnQgeyB2YWxpZGF0ZUluaXRPcHRzIH0gZnJvbSAnLi9jb3JlL3V0aWxzL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgSUNhbGxQbHVzSW5pdE9wdHMgfSBmcm9tICcuL2NvcmUvYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNBdWRpb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9jb3JlL2FwaS9SQ0F1ZGlvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgUkNWaWRlb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9jb3JlL2FwaS9SQ1ZpZGVvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9jb3JlL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuY29uc3QgaW5zdGFsbGVyOiBJUGx1Z2luR2VuZXJhdG9yPFJDQ2FsbFBsdXNDbGllbnQsIElDYWxsUGx1c0luaXRPcHRzPiA9IHtcbiAgdGFnOiAnUkNDYWxsUGx1cycsXG4gIHZlcmlmeShydW50aW1lOiBJUnVudGltZSkge1xuICAgIHJldHVybiBydW50aW1lLnRhZyA9PT0gJ2Jyb3dzZXInO1xuICB9LFxuICBzZXR1cChjb250ZXh0OiBQbHVnaW5Db250ZXh0LCBydW50aW1lOiBJUnVudGltZSwgb3B0aW9uczogSUNhbGxQbHVzSW5pdE9wdHMpOiBSQ0NhbGxQbHVzQ2xpZW50IHtcbiAgICAvLyDliJ3lp4vljJblj4LmlbDmoKHpqoxcbiAgICBjb25zdCB2YWxpZGF0ZVJlcyA9IHZhbGlkYXRlSW5pdE9wdHMob3B0aW9ucyk7XG4gICAgaWYgKCF2YWxpZGF0ZVJlcy5pc0xlZ2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxMaWIgaW5zdGFsbGVyIHN0ZXVwXSR7dmFsaWRhdGVSZXMubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOWIm+W7uiBlbmdpbmUgbG9nZ2VyXG4gICAgY29uc3QgZW5naW5lTG9nZ2VyID0gY29udGV4dC5jcmVhdGVMb2dnZXIoJ0NhbGxQbHVzTGliJywgJ1JUQycpO1xuICAgIC8vIOiuvue9riDovpPlh7rnuqfliKtcbiAgICBjb25zdCBvdXRwdXRMZXZlbCA9IGlzVW5kZWZpbmVkKG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwpID8gTG9nTC5XQVJOIDogb3B0aW9ucy5sb2dPdXRwdXRMZXZlbDtcbiAgICBlbmdpbmVMb2dnZXIuc2V0T3V0cHV0TGV2ZWwob3V0cHV0TGV2ZWwhKTtcbiAgICBlbmdpbmVMb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ERVhfSU5TVEFMTF9DQUxMX1BMVVNfUExVR0lOX08sIGBDYWxsUGx1cyBWZXJzaW9uOiAke19fVkVSU0lPTl9ffSwgQ29tbWl0OiAke19fQ09NTUlUX0lEX199YCk7XG5cbiAgICByZXR1cm4gbmV3IFJDQ2FsbFBsdXNDbGllbnQoY29udGV4dCwgZW5naW5lTG9nZ2VyLCBydW50aW1lLCBvcHRpb25zKTtcbiAgfSxcbn07XG5cbmV4cG9ydCB7XG4gIGluc3RhbGxlcixcbiAgLyogY2xhc3MgKi9cbiAgUkNDYWxsUGx1c0NsaWVudCxcbiAgUkNDYWxsUGx1c1Nlc3Npb24sXG4gIFJDQXVkaW9Db25maWdCdWlsZGVyLFxuICBSQ1ZpZGVvQ29uZmlnQnVpbGRlcixcbn07XG4vKipcbiAqIOWvvOWHuuaemuS4vuWSjOaOpeWPo+WumuS5iVxuICovXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvYXBpL2ludGVyZmFjZSc7XG4iXSwibmFtZXMiOlsiUkNDYWxsUGx1c0NvZGUiLCJSQ0NhbGxQbHVzTG9nZ2VyVGFnIiwiUkNDYWxsUGx1c1Nlc3Npb24iLCJfc2Vzc2lvbiIsIl9jYWxsRW5naW5lIiwiX2xvZ2dlciIsIl9fcHVibGljRmllbGQiLCJ1c2VyIiwidXNlcklkIiwidXNlclN0YXRlIiwiY2FtZXJhRW5hYmxlIiwibWljcm9waG9uZUVuYWJsZSIsInRyYWNlSWQiLCJjb2RlIiwiY2xpZW50U3RhcnRUaW1lIiwiZGF0YSIsIlJDQ2FsbFBsdXNUeXBlIiwiUkNDYWxsUGx1c1R5cGUyIiwiUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlIiwiUkNDYWxsUGx1c01lZGlhVHlwZTIiLCJSQ0NhbGxQbHVzQ2FsbFN0YXRlIiwiUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCIsIlJDQ2FsbFBsdXNSZWFzb24iLCJSQ0F1ZGlvQ29uZmlnQnVpbGRlciIsIm1pY3JvcGhvbmVJZCIsIm1pbiIsIm1heCIsImlzTnVtYmVyIiwic2FtcGxlUmF0ZSIsIlJDVmlkZW9Db25maWdCdWlsZGVyIiwiUkNDYWxsUGx1c1Jlc29sdXRpb24iLCJSQ0NhbGxQbHVzRnJhbWVSYXRlIiwiZnBzIiwicmVzb2x1dGlvbiIsImNhbWVyYUlkIiwidHJhbjJDYWxsTG9nIiwiY2FsbExvZ0xpc3QiLCJjYWxsSWQiLCJjYWxsVHlwZSIsImNhbGxEaXIiLCJtZWRpYVR5cGUiLCJjYWxsaW5nVXNlcklkIiwiY2FsbFVzZXJJZHMiLCJjYWxsU3RhdHVzIiwic2Vzc2lvblN0YXR1cyIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJkdXJhdGlvbiIsInNlY3JldENoYXQiLCJzeW5jVGltZSIsInN5c1N0YXR1cyIsImNydFRpbWUiLCJwYXJzZVN0YXR1c0RhdGEiLCJyaW5naW5nRGF0YSIsImhhbmd1cERhdGEiLCJhY2NlcHREYXRhIiwib3RoZXJJbnZpdGVkRGF0YSIsIml0ZW0iLCJ2YWxpZGF0ZVZpZGVvTm9kZU5hbWUiLCJlbGVtZW50IiwidmFsaWRhdGVTeXNTdGF0ZSIsImNydFN0YXRlIiwibmV3U3RhdGUiLCJpc0luVmFsaWQiLCJpbnZhbGlkU3RhdGVzIiwidmFsaWRhdGVVc2VyU3RhdGUiLCJnZXRIYW5ndXBTeXN0ZW1TdGF0ZSIsImlzQ2FsbGVlIiwic3lzdGVtU3RhdGUiLCJpc1N1cHBvcnRNZWRpYVNlcnZlciIsIm5hdmlJbmZvIiwidm9pcENhbGxJbmZvIiwic3RyYXRlZ3kiLCJ2YWxpZGF0ZUJpdHJhdGUiLCJtaW5CaXRyYXRlIiwibWF4Qml0cmF0ZSIsIlJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIiwiUkNDYWxsUEx1c1N0YXRpc3RpY3MiLCJfY29udGV4dCIsInRhZyIsInNlc3Npb24iLCJjbGllbnRDYWxsSWQiLCJpbnZpdGVTb3VyY2UiLCJleHRyYSIsIm5vd1RpbWUiLCJjb21tb25EYXRhIiwiRGlhbG9nQWN0aW9uIiwiRGlhbG9nVHlwZSIsIlNlY3JldENhbGxUeXBlIiwiU2VjcmV0Q2FsbFR5cGUyIiwiQ2FsbFRpbWVyRXZlbnRUeXBlIiwiUkNDYWxsSW5uZXJTZXNzaW9uIiwiRXZlbnRFbWl0dGVyIiwiX2NhbGxJZCIsIl9zdGF0ZSIsIl9jYWxsVHlwZSIsIl9tZWRpYVR5cGUiLCJfc3RhcnRDYWxsZXJJZCIsIl9jYWxsZXJJZCIsIl9jYWxsVXNlcnMiLCJlbmFibGUiLCJ1c2VycyIsImNoYW5nZWRVc2VycyIsIm5ld1VzZXJTdGF0ZSIsIm5ld1N0YXRlVGltZSIsIm5ld1N5c1N0YXRlIiwiaGFzVXNlciIsImkiLCJvbGRTdGF0ZVRpbWUiLCJvbGRTeXN0ZW1TdGF0ZSIsIm9sZFVzZXJTdGF0ZSIsImlzSW52YWxpZFN5c1N0YXRlIiwiaXNJbnZhbGlkVXNlclN0YXRlIiwiaXNJbnZhbGlkT25waG9uZUVuZCIsImVyciIsInN0YXRlIiwidHlwZSIsInRpbWVySWQiLCJpc0xvY2FsQ2xpZW50SGFuZ3VwIiwiQ2FsbFNlcnZlckFjdGlvbiIsInRpbWVyU2V0VGltZW91dCIsImZ1bmMiLCJ0aW1lb3V0Iiwic2xlZXAiLCJtaWxsaXNlY29uZCIsInJlc29sdmUiLCJuZWVkUmV0cnlDb2RlIiwiRXJyb3JDb2RlIiwiUkNSVENDb2RlIiwicmV0cnlBc3luY0ZuIiwiYXN5bmNGbiIsImZuQXJncyIsImN1cnJlbnRSZXRyeVRpbWUiLCJtYXhEdXJhdGlvbiIsImludGVydmFscyIsImluZGV4Iiwib25FcnJvciIsInJlcyIsIml0diIsIkNhbGxIb29rc1R5cGUiLCJQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbiIsIlB1Ykludml0ZUNhbGxNaXNzUmVmZXIiLCJTaWduYWxUcmFuc3BvcnRlciIsIl9ydW50aW1lIiwiX2luaXRPcHRzIiwiX3RpbWVDb3JyZWN0aW9uZXIiLCJnZXRVVUlEMjIiLCJsaXN0ZW5lciIsIm1zZyIsInRvVXNlcnMiLCJ0YXJnZXRUeXBlIiwidGFyZ2V0SWQiLCJuaWNrTmFtZSIsIm9sZFJvb21JZCIsImNhbGxJZHMiLCJvcHRzIiwiUkNDb25uZWN0aW9uU3RhdHVzIiwia2V5Iiwib3B0aW9ucyIsInZhbHVlIiwicmVzdWx0Iiwic2VydmVyS2V5Iiwic2VydmVyVmFsIiwicGFyc2VkRGF0YSIsImluZm8iLCJkZXZpY2VJZCIsImlzTnVsbCIsImlzU3RyaW5nIiwiaXNEaXJlY3RseSIsImN1cnJlbnRVSWQiLCJjdXJyZW50VXNlciIsImRpYWxvZ1R5cGUiLCJhY3Rpb24iLCJleHRyYUtleVZhbCIsImNhbGxTZXNzaW9uVXNlcnMiLCJ0b0RldmljZUlkIiwiY2FsbERpYWxvZ0VudGl0eXMiLCJzdHJpbmcxMHRvNjQiLCJudW1iZXIiLCJjaGFycyIsInJhZGl4IiwicXV0aWVudCIsImFyciIsIm1vZCIsImdldFVVSUQiLCJjIiwiciIsInV1aWQiLCJDQUxMX0RCX05BTUUiLCJEQl9WRVJTSU9OIiwibG9nZ2VyIiwiX1JDQ2FsbEluZGV4REIiLCJyZXEiLCJldiIsIm9iak5hbWUiLCJfYSIsInZhbCIsInJlamVjdCIsIlJDQ2FsbEluZGV4REIiLCJBYm5vcm1hbENhbGwiLCJvYmpTdG9yZSIsInVzZXJBYm5vcm1hbENhbGxJZHMiLCJpZCIsIkNhbGxTZXJ2ZXJFdmVudFR5cGUiLCJSQ0NhbGxQbHVzSW5uZXJDb2RlIiwiVGltZUNvcnJlY3Rpb25lciIsIl9zaW5nbGVDYWxsRHVyYXRpb25FdiIsInNlcnZlclN0YXJ0VGltZSIsImN1cnJlbnRSVFQiLCJjbGllbnRGaXJzdEZyYW1lVGltZSIsIkZvcndhcmRUeXBlIiwiUkNDYWxsUGx1c0ludml0ZVNvdXJjZSIsIlJDQ2FsbERpcmVjdGlvbiIsIkNBTExfVElNRV9PVVQiLCJfUkNDYWxsRW5naW5lIiwiX3JlcG9ydEFwcEV2ZW50TW9kdWxlIiwiY3VycmVudFVzZXJJZCIsImJ1c3lsaW5lVXNlcnMiLCJpbnZpdGVyVGltZXJJZCIsInNlbGZTdGF0ZSIsImludml0ZWVzU3RhdGUiLCJidXN5VXNlcnNTdGF0ZSIsImJ1c3lVc2VySWQiLCJpbnZpdGVkVXNlcnNTdGF0ZSIsImJ1c3lsaW5lVXNlcnNTdGF0ZSIsInRyYW5zYWN0aW9uSWQiLCJyZXFNZWRpYVR5cGUiLCJjYWxsTG9nIiwicmVzRGF0YSIsImxpc3QiLCJ1c2VyU2Vzc2lvblN0YXR1cyIsImNhbGxEaXJlY3Rpb24iLCJzZXNzaW9uVXNlcnMiLCJpbm5lclNlc3Npb24iLCJuZXdVc2VycyIsImlzSWRsZSIsIm5vdyIsImRlbGF5VGltZSIsInN0cmVhbVJlYWR5VGltZSIsImN1cnJlbnRVc2VyU3lzdGVtU3RhdGUiLCJob2xkQ2FsbElkIiwic3RhdGVUaW1lIiwiaW52aXRlVXNlcklkIiwiaW52aXRlZVRpbWVySWQiLCJjYWxsUGx1c1Nlc3Npb24iLCJvdGhlcnNTdGF0ZSIsInN0YXR1c1RpbWUiLCJvdGhlckludml0ZWRNZW1iZXIiLCJfYiIsIl9jIiwiaW52aXRlZE1lbWJlciIsInVzZXJzU3RhdGUiLCJjYWxsU2Vzc2lvbmFTdGF0dXMiLCJzZXNzaW9uU3RhdGUiLCJ1bk5lZWRVcFN0YXRlIiwic3RhcnRDYWxsZXJJZCIsIl9kIiwic2VsZkVuZCIsInN0YXRlcyIsImlzTWFpblNlc3Npb24iLCJjdXJyZW50VXNlclNhdGUiLCJldmVudFRpbWUiLCJldmVudEFyZ3MiLCJldmVudFR5cGUiLCJmcm9tVXNlcklkIiwiZmlyc3RGcmFtZVRpbWUiLCJwcm9tb3RlcklkIiwicmVhc29uIiwiY3VycmVudENhbGxJZCIsIm9sZFRyYW5zSWQiLCJvbGRBY3Rpb24iLCJPbGRNZWRpYVR5cGUiLCJjaGFuZ2VNZWRpYVR5cGVSZXN1bHQiLCJfZSIsImlzU2VsZkhhbmd1cCIsImNsb3NlZFNlc3Npb24iLCJjcnRVc2VyRGF0YSIsImhhbmd1cFJlYXNvbiIsImlzTmVlZFVwIiwiaW52aXRlclVzZXJJZCIsIlJDQ2FsbEVuZ2luZSIsIlJUQ1Jlc291cmNlVGFnIiwiX1JUQ01vZHVsZSIsImRlZmF1bHRWaWRlb1RyYWNrIiwidHJhY2siLCJkZWZhdWx0QXVkaW9UcmFjayIsInZpZGVvQ29uZmlnIiwiYXVkaW9Db25maWciLCJpc0Jvb2xlYW4iLCJsb2NhbFRyYWNrIiwicm9vbSIsInJvb21Vc2Vyc0lkIiwiZXJyb3IiLCJwdWJQYXJhbXMiLCJjdXJyZW50Um9vbUlkIiwicmVjZW50VHJhY2tzIiwibG9jYWxUcmFja3MiLCJuZWVkRGVzdHJveVRyYWNrIiwibmV3VHJhY2siLCJ0cmFja3MiLCJSVENNb2RlIiwic3ViVGlueSIsImJ5U2VydmVyIiwidXNlcklkcyIsInZpZGVvVHJhY2siLCJhdWRpb1RyYWNrIiwiYXVkaW9MZXZlbFJlcG9ydExpc3QiLCJyb29tSWQiLCJraWNrRXh0cmEiLCJSQ0tpY2tSZWFzb24iLCJuZWVkU3ViVHJhY2tzIiwiaXNUaW55IiwicmVwb3J0Iiwic2VuZGVycyIsInJlY2VpdmVycyIsImtpbmQiLCJwYWNrZXRzTG9zdFJhdGUiLCJydHQiLCJ0cmFja0lkIiwiYml0cmF0ZSIsImhlbHBlciIsImxvY2FsVmlkZW9UcmFjayIsImxvY2FsQXVkaW9UcmFjayIsIlJDTG9jYWxUcmFjayIsInZpZGVvRWxlbWVudCIsInN1YlBhcmFtcyIsInVuc3ViVHJhY2tzIiwidmlkZW9WaWV3IiwiUlRDTW9kdWxlIiwiUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSIsImV2ZW50TmFtZSIsImF0dHJzIiwiaGFuZGxlIiwiaW52aXRlZVVzZXJMaXN0IiwicmVjb3JkIiwiY2FsbEZpcnN0RnJhbWVUaW1lIiwiYXVkaW9MZXZlbCIsIkNhbGxTZXJ2ZXJFcnJvckNvZGUiLCJSQ0NhbGxQbHVzQ2xpZW50IiwibmV3U2Vzc2lvbiIsIm1haW5TZXNzaW9uIiwibm90RW1wdHlBcnJheSIsIm5vdEVtcHR5U3RyaW5nIiwiaXNVbmRlZmluZWQiLCJjZmciLCJmcmFtZVJhdGUiLCJlcnJvck1zZyIsImdldE1lZGlhVHJhY2tzQ29kZSIsImdldFNlc3Npb25Db2RlIiwiYnVzeVVzZXJzIiwiaG9sZFNlc3Npb24iLCJoYW5ndXBNYWluU2Vzc2lvbkNvZGUiLCJtYWluU2Vzc2lvbkNhbGxJZCIsImhhbmd1cFNlc3Npb24iLCJ1c2VySW5mbyIsIm9sZE1lZGlhVHlwZSIsInRvVXNlcklkcyIsImlzQWdyZWUiLCJzdGFydFRpbWVzdGFtcCIsImNvdW50IiwidW5tdXRlQ29kZSIsImRldmljZSIsInZhbGlkYXRlSW5pdE9wdHMiLCJpc09iamVjdCIsImlzRnVuY3Rpb24iLCJpbnN0YWxsZXIiLCJydW50aW1lIiwiY29udGV4dCIsInZhbGlkYXRlUmVzIiwiZW5naW5lTG9nZ2VyIiwib3V0cHV0TGV2ZWwiLCJMb2dMIl0sIm1hcHBpbmdzIjoiNmdCQUdPLE1BQU1BLEVBQWlCLENBSTVCLFFBQVMsRUFJVCxZQUFhLE1BSWIsY0FBZSxNQUlmLFlBQWEsTUFJYixrQkFBbUIsTUFJbkIsZUFBZ0IsTUFJaEIsd0JBQXlCLE1BSXpCLGtCQUFtQixNQUluQixnQkFBaUIsTUFJakIsdUJBQXdCLE1BSXhCLGdCQUFpQixNQUlqQixxQ0FBc0MsTUFJdEMsb0JBQXFCLE1BSXJCLGNBQWUsTUFJZixrQkFBbUIsTUFJbkIsd0JBQXlCLE1BSXpCLHVCQUF3QixNQUl4QixrQkFBbUIsTUFJbkIsbUJBQW9CLEtBQ3RCLEVDaEZZLElBQUFDLEdBQUFBLElBQ1ZBLEVBQUEsbUNBQXFDLHFDQUlyQ0EsRUFBQSx1Q0FBeUMseUNBSXpDQSxFQUFBLHdDQUEwQywwQ0FJMUNBLEVBQUEsK0NBQWlELGlEQUNqREEsRUFBQSxnREFBa0Qsa0RBSWxEQSxFQUFBLHFDQUF1Qyx1Q0FDdkNBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSx5Q0FBMkMsMkNBQzNDQSxFQUFBLHlDQUEyQywyQ0FDM0NBLEVBQUEsc0NBQXdDLHdDQUl4Q0EsRUFBQSxxQ0FBdUMsdUNBQ3ZDQSxFQUFBLHFDQUF1Qyx1Q0FDdkNBLEVBQUEsc0NBQXdDLHdDQUN4Q0EsRUFBQSwwQ0FBNEMsNENBSTVDQSxFQUFBLDRCQUE4Qiw4QkFDOUJBLEVBQUEsNEJBQThCLDhCQUk5QkEsRUFBQSwrQkFBaUMsaUNBQ2pDQSxFQUFBLCtCQUFpQyxpQ0FJakNBLEVBQUEsb0NBQXNDLHNDQUl0Q0EsRUFBQSxvQ0FBc0Msc0NBSXRDQSxFQUFBLDJCQUE2Qiw2QkFJN0JBLEVBQUEsMkJBQTZCLDZCQUk3QkEsRUFBQSwyQkFBNkIsNkJBQzdCQSxFQUFBLDJCQUE2Qiw2QkFJN0JBLEVBQUEsMkJBQTZCLDZCQUM3QkEsRUFBQSwyQkFBNkIsNkJBSTdCQSxFQUFB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QUFBLFNBSUFBLEVBQUFBLEVBQUEsUUFBVSxHQUFWLEVBQUEsVUFJQUEsRUFBQUEsRUFBQSxNQUFRLEdBQVIsRUFBQSxRQUlBQSxFQUFBQSxFQUFBLFVBQVksSUFBWixFQUFBLFlBSUFBLEVBQUFBLEVBQUEsT0FBUyxJQUFULEVBQUEsU0FJQUEsRUFBQUEsRUFBQSxVQUFZLElBQVosRUFBQSxZQUlBQSxFQUFBQSxFQUFBLFNBQVcsSUFBWCxFQUFBLFdBSUFBLEVBQUFBLEVBQUEsTUFBUSxHQUFSLEVBQUEsUUE1RFVBLElBQUFBLEdBQUEsQ0FBQSxDQUFBLEVDR0FDLEdBQUFBLElBSVZBLEVBQUFDLEVBQUEsTUFBQSxDQUFBLEVBQUEsUUFJQUQsRUFBQUMsRUFBQSxZQUFBLENBQUEsRUFBQSxjQUlBRCxFQUFBQyxFQUFBLE1BQUEsQ0FBQSxFQUFBLFFBWlVELElBQUFBLEdBQUEsQ0FBQSxDQUFBLEVDQUFFLEdBQUFBLElBSVZBLEVBQUFBLEVBQUEsS0FBTyxDQUFQLEVBQUEsT0FJQUEsRUFBQUEsRUFBQSxRQUFVLEdBQVYsRUFBQSxVQUlBQSxFQUFBQSxFQUFBLFFBQVUsR0FBVixFQUFBLFVBSUFBLEVBQUFBLEVBQUEsUUFBVSxHQUFWLEVBQUEsVUFJQUEsRUFBQUEsRUFBQSxpQkFBbUIsR0FBbkIsRUFBQSxtQkFJQUEsRUFBQUEsRUFBQSxjQUFnQixHQUFoQixFQUFBLGdCQUlBQSxFQUFBQSxFQUFBLFdBQWEsR0FBYixFQUFBLGFBSUFBLEVBQUFBLEVBQUEsT0FBUyxHQUFULEVBQUEsU0FJQUEsRUFBQUEsRUFBQSxNQUFRLEdBQVIsRUFBQSxRQUlBQSxFQUFBQSxFQUFBLFNBQVcsSUFBWCxFQUFBLFdBSUFBLEVBQUFBLEVBQUEsT0FBUyxJQUFULEVBQUEsU0FJQUEsRUFBQUEsRUFBQSxTQUFXLElBQVgsRUFBQSxXQUlBQSxFQUFBQSxFQUFBLFNBQVcsSUFBWCxFQUFBLFdBRUFBLEVBQUFBLEVBQUEsTUFBUSxHQUFSLEVBQUEsUUF0RFVBLElBQUFBLEdBQUEsQ0FBQSxDQUFBLEVDSEFDLEdBQUFBLElB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
|