@rongcloud/plugin-call-plus 1.1.0 → 1.1.1

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/dist/index.esm.js CHANGED
@@ -1,9 +1,9 @@
1
- var ye = Object.defineProperty;
2
- var Ve = (t, s, e) => s in t ? ye(t, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[s] = e;
3
- var S = (t, s, e) => (Ve(t, typeof s != "symbol" ? s + "" : s, e), e);
4
- import { isNumber as H, EventEmitter as oe, ErrorCode as se, getUUID22 as Pe, RCConnectionStatus as K, isNull as Ge, isString as ue, isBoolean as ge, RTCMode as ve, notEmptyArray as W, notEmptyString as G, isUndefined as Q, getUUID as be, isObject as he, VersionManage as Ee, LogL as we } from "@rongcloud/engine";
5
- import { RCResolution as ee, RCFrameRate as _e, RCRTCCode as D, RCKickReason as j, helper as Be, RCLocalTrack as $e, device as Ne } from "@rongcloud/plugin-rtc";
6
- import { RCFrameRate as l_, RCResolution as S_ } from "@rongcloud/plugin-rtc";
1
+ var Ve = Object.defineProperty;
2
+ var Pe = (t, s, e) => s in t ? Ve(t, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[s] = e;
3
+ var l = (t, s, e) => (Pe(t, typeof s != "symbol" ? s + "" : s, e), e);
4
+ import { isNumber as H, EventEmitter as oe, ErrorCode as se, getUUID22 as Ge, RCConnectionStatus as K, isNull as ve, isString as ge, isBoolean as Ue, RTCMode as be, notEmptyArray as W, notEmptyString as G, isUndefined as Q, getUUID as we, isObject as he, VersionManage as Ee, LogL as Be } from "@rongcloud/engine";
5
+ import { RCResolution as ee, RCFrameRate as _e, RCRTCCode as D, RCKickReason as j, helper as $e, RCLocalTrack as He, device as Ne } from "@rongcloud/plugin-rtc";
6
+ import { RCFrameRate as l_, RCResolution as I_ } from "@rongcloud/plugin-rtc";
7
7
  const a = {
8
8
  /**
9
9
  * 成功
@@ -85,9 +85,9 @@ const a = {
85
85
  var r = /* @__PURE__ */ ((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))(r || {});
86
86
  class ie {
87
87
  constructor(s, e, _) {
88
- S(this, "_startTime", 0);
89
- S(this, "_duration", 0);
90
- S(this, "_callId", "");
88
+ l(this, "_startTime", 0);
89
+ l(this, "_duration", 0);
90
+ l(this, "_callId", "");
91
91
  this._session = s, this._callEngine = e, this._logger = _, this._callId = this._session.getCallId();
92
92
  }
93
93
  /**
@@ -175,9 +175,9 @@ class ie {
175
175
  }
176
176
  }
177
177
  var M = /* @__PURE__ */ ((t) => (t[t.SINGLE = 0] = "SINGLE", t[t.MULTI = 1] = "MULTI", t))(M || {}), C = /* @__PURE__ */ ((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))(C || {}), R = /* @__PURE__ */ ((t) => (t[t.AUDIO = 0] = "AUDIO", t[t.AUDIO_VIDEO = 1] = "AUDIO_VIDEO", t[t.VIDEO = 2] = "VIDEO", t))(R || {}), p = /* @__PURE__ */ ((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 || {}), F = /* @__PURE__ */ ((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))(F || {}), h = /* @__PURE__ */ ((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))(h || {});
178
- class He {
178
+ class ke {
179
179
  constructor(s) {
180
- S(this, "_audioConfig", {});
180
+ l(this, "_audioConfig", {});
181
181
  this._logger = s;
182
182
  }
183
183
  /**
@@ -209,9 +209,9 @@ class He {
209
209
  return this._audioConfig;
210
210
  }
211
211
  }
212
- class ke {
212
+ class xe {
213
213
  constructor(s) {
214
- S(this, "_videoConfig", {
214
+ l(this, "_videoConfig", {
215
215
  resolution: ee.W640_H480,
216
216
  frameRate: _e.FPS_15
217
217
  });
@@ -260,7 +260,7 @@ const Ae = (t) => {
260
260
  sessionStatus: L,
261
261
  startTime: c,
262
262
  endTime: T,
263
- duration: l,
263
+ duration: S,
264
264
  secretChat: I,
265
265
  syncTime: d,
266
266
  sysStatus: g,
@@ -278,12 +278,12 @@ const Ae = (t) => {
278
278
  userState: L,
279
279
  startTimestamp: c,
280
280
  endTimestamp: T,
281
- duration: l,
281
+ duration: S,
282
282
  syncTimestamp: d,
283
283
  systemState: g,
284
284
  createTimestamp: O
285
285
  };
286
- }, xe = (t) => {
286
+ }, Fe = (t) => {
287
287
  const { callId: s, callStatus: e } = t, _ = [], i = [], n = [], o = [];
288
288
  return t.callSessionUsers.forEach((E) => {
289
289
  const { userId: L, sessionStatus: c, sysStatus: T } = E;
@@ -319,7 +319,7 @@ const Ae = (t) => {
319
319
  acceptData: n,
320
320
  otherInvitedData: o
321
321
  };
322
- }, Fe = (t) => t && t.nodeName && t.nodeName.toUpperCase() === "VIDEO", Ye = (t, s) => {
322
+ }, Ye = (t) => t && t.nodeName && t.nodeName.toUpperCase() === "VIDEO", Je = (t, s) => {
323
323
  let e = !1;
324
324
  const _ = [
325
325
  h.INVITED,
@@ -335,7 +335,7 @@ const Ae = (t) => {
335
335
  break;
336
336
  }
337
337
  return e;
338
- }, Je = (t, s) => {
338
+ }, Ke = (t, s) => {
339
339
  let e = !1;
340
340
  const _ = [
341
341
  C.INVITED,
@@ -351,7 +351,7 @@ const Ae = (t) => {
351
351
  break;
352
352
  }
353
353
  return e;
354
- }, Ke = (t, s) => {
354
+ }, We = (t, s) => {
355
355
  let e;
356
356
  switch (t) {
357
357
  case C.CALLING:
@@ -375,20 +375,31 @@ const Ae = (t) => {
375
375
  return !1;
376
376
  const { strategy: e } = JSON.parse(s);
377
377
  return e === 1;
378
- }, Re = (t, s) => (t || t === 0) && (!H(t) || t <= 0) ? { code: a.PARAM_ERROR, errorMsg: `params error -> minBitrate: a number of > 0, value: ${t}` } : (s || s === 0) && (!H(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 };
378
+ }, Re = (t, s) => (t || t === 0) && (!H(t) || t <= 0) ? { code: a.PARAM_ERROR, errorMsg: `params error -> minBitrate: a number of > 0, value: ${t}` } : (s || s === 0) && (!H(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 }, Oe = (t) => {
379
+ const s = [];
380
+ for (const e in t) {
381
+ const { videoView: _, isTiny: i } = t[e];
382
+ s.push({
383
+ userId: e,
384
+ videoView: _.nodeName,
385
+ isTiny: i
386
+ });
387
+ }
388
+ return s;
389
+ };
379
390
  var k = /* @__PURE__ */ ((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))(k || {});
380
- class We {
391
+ class je {
381
392
  constructor(s, e) {
382
393
  this._logger = s, this._context = e;
383
394
  }
384
395
  reportStatisticsData(s, e, _, i, n, o, E) {
385
- const L = +/* @__PURE__ */ new Date(), { mediaType: c, callType: T, callId: l } = i ? { mediaType: i.getMediaType(), callType: i.getCallType(), callId: i.getCallId() } : E, I = {
396
+ const L = +/* @__PURE__ */ new Date(), { mediaType: c, callType: T, callId: S } = i ? { mediaType: i.getMediaType(), callType: i.getCallType(), callId: i.getCallId() } : E, I = {
386
397
  cr: "unknown",
387
398
  net: "unknown",
388
399
  cod: e,
389
400
  mtp: c,
390
401
  ctp: T,
391
- cid: l,
402
+ cid: S,
392
403
  time: L,
393
404
  uid: this._context.getCurrentId()
394
405
  };
@@ -415,7 +426,7 @@ class We {
415
426
  this._logger.info("L-call-plus-statistic", JSON.stringify(d), s), this._logger.__statistics(s, JSON.stringify(d));
416
427
  }
417
428
  }
418
- var b = /* @__PURE__ */ ((t) => (t.REQUEST = "request", t.ACCEPT = "accept", t.REFUSE = "refuse", t.CANCEL = "cancel", t.NOTICE = "notice", t.TIMEOUT = "timeout", t))(b || {}), q = /* @__PURE__ */ ((t) => (t[t.SWITCH_MEDIA_TYPE = 1] = "SWITCH_MEDIA_TYPE", t))(q || {}), Te = /* @__PURE__ */ ((t) => (t[t.NORMAL = 0] = "NORMAL", t[t.SECRET = 1] = "SECRET", t))(Te || {}), le = /* @__PURE__ */ ((t) => (t.INVITER = "inviter", t.INVITEE = "invitee", t))(le || {});
429
+ var b = /* @__PURE__ */ ((t) => (t.REQUEST = "request", t.ACCEPT = "accept", t.REFUSE = "refuse", t.CANCEL = "cancel", t.NOTICE = "notice", t.TIMEOUT = "timeout", t))(b || {}), q = /* @__PURE__ */ ((t) => (t[t.SWITCH_MEDIA_TYPE = 1] = "SWITCH_MEDIA_TYPE", t))(q || {}), Te = /* @__PURE__ */ ((t) => (t[t.NORMAL = 0] = "NORMAL", t[t.SECRET = 1] = "SECRET", t))(Te || {}), Se = /* @__PURE__ */ ((t) => (t.INVITER = "inviter", t.INVITEE = "invitee", t))(Se || {});
419
430
  class ce extends oe {
420
431
  /**
421
432
  * 构造器
@@ -425,15 +436,15 @@ class ce extends oe {
425
436
  /**
426
437
  * 请求更新的 mediaType
427
438
  */
428
- S(this, "_reqMediaType");
439
+ l(this, "_reqMediaType");
429
440
  /**
430
441
  * 邀请者超时计时器
431
442
  */
432
- S(this, "_inviterTimerId");
443
+ l(this, "_inviterTimerId");
433
444
  /**
434
445
  * 被邀请者超时计时器
435
446
  */
436
- S(this, "_inviteeTimerId");
447
+ l(this, "_inviteeTimerId");
437
448
  /**
438
449
  * 当前 session 人员信息列表
439
450
  */
@@ -441,11 +452,11 @@ class ce extends oe {
441
452
  /**
442
453
  * 旧 dialog 数据,用于对比
443
454
  */
444
- S(this, "_oldDialogData");
455
+ l(this, "_oldDialogData");
445
456
  /**
446
457
  * 记录是否本地有挂断
447
458
  */
448
- S(this, "isLocalClientHangup", !1);
459
+ l(this, "isLocalClientHangup", !1);
449
460
  this._callId = e, this._state = _, this._callType = i, this._mediaType = n, this._startCallerId = o, this._callerId = E, this._callUsers = L, this._logger = c;
450
461
  }
451
462
  /**
@@ -533,16 +544,16 @@ class ce extends oe {
533
544
  this._logger.info(r.L_INNER_SESSION_UPDATE_USER_STATE_O, `push user: ${JSON.stringify(n)}`, _), this._callUsers.push(n), i.push(n);
534
545
  else {
535
546
  let T = !1;
536
- for (let l = 0; l < this._callUsers.length; l++) {
547
+ for (let S = 0; S < this._callUsers.length; S++) {
537
548
  const {
538
549
  userId: I,
539
550
  stateTime: d,
540
551
  systemState: g,
541
552
  userState: O
542
- } = this._callUsers[l];
553
+ } = this._callUsers[S];
543
554
  if (I === n.userId) {
544
555
  T = !0;
545
- const u = Ye(g, L), m = Je(O, o), N = L === h.ON_PHONE_END && g !== h.ON_PHONE && o !== C.IDLE;
556
+ const u = Je(g, L), m = Ke(O, o), N = L === h.ON_PHONE_END && g !== h.ON_PHONE && o !== C.IDLE;
546
557
  if (E && d && E < d || u && m) {
547
558
  try {
548
559
  this._logger.warn(r.L_INNER_SESSION_UPDATE_USER_STATE_O, `timeout user state: old:${JSON.stringify({
@@ -556,7 +567,7 @@ class ce extends oe {
556
567
  }
557
568
  break;
558
569
  } else {
559
- this._logger.info(r.L_INNER_SESSION_UPDATE_USER_STATE_O, `updateUserList -> cover ${JSON.stringify(n)}`, _), this._callUsers[l] = n, !N && i.push(n);
570
+ this._logger.info(r.L_INNER_SESSION_UPDATE_USER_STATE_O, `updateUserList -> cover ${JSON.stringify(n)}`, _), this._callUsers[S] = n, !N && i.push(n);
560
571
  break;
561
572
  }
562
573
  }
@@ -616,9 +627,9 @@ class ce extends oe {
616
627
  }
617
628
  }
618
629
  var A = /* @__PURE__ */ ((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))(A || {});
619
- const Se = (t, s) => setTimeout(t, s), je = (t) => new Promise((s) => {
630
+ const le = (t, s) => setTimeout(t, s), Qe = (t) => new Promise((s) => {
620
631
  setTimeout(s, t);
621
- }), Qe = [
632
+ }), qe = [
622
633
  /**
623
634
  * IM 底层返回需要重试的错误码
624
635
  */
@@ -640,7 +651,7 @@ const Se = (t, s) => setTimeout(t, s), je = (t) => new Promise((s) => {
640
651
  onError: o
641
652
  }) => {
642
653
  const E = await t(...s), L = 2 * 1e3;
643
- return E.code === a.SUCCESS || !Qe.includes(E.code) || Date.now() + L - e > _ ? E : (o && o(E.code), await je(L), X({
654
+ return E.code === a.SUCCESS || !qe.includes(E.code) || Date.now() + L - e > _ ? E : (o && o(E.code), await Qe(L), X({
644
655
  asyncFn: t,
645
656
  fnArgs: s,
646
657
  currentRetryTime: e,
@@ -651,7 +662,7 @@ const Se = (t, s) => setTimeout(t, s), je = (t) => new Promise((s) => {
651
662
  }));
652
663
  };
653
664
  var x = /* @__PURE__ */ ((t) => (t.onBeforePublish = "onBeforePublish", t.onPublishRes = "onPublishRes", t.onPubInviteCall = "onPubInviteCall", t.onPubInviteCallPullKv = "onPubInviteCallPullKv", t.onPubInviteCallMiss = "onPubInviteCallMiss", t))(x || {}), re = /* @__PURE__ */ ((t) => (t.NOT_CURRENT_DEVICEID = "not current device id", t.SECRET_CALL = "secret call", t.NOT_INVITEE = "not an invitee", t))(re || {}), J = /* @__PURE__ */ ((t) => (t.PUB_INVITE = "pubinvitecall", t.PULL_KV_INVITE = "pullkv_invitecall", t.PUSH = "system_pubsh", t))(J || {});
654
- class qe extends oe {
665
+ class Xe extends oe {
655
666
  /**
656
667
  * constructor
657
668
  */
@@ -660,19 +671,19 @@ class qe extends oe {
660
671
  /**
661
672
  * 监听对象
662
673
  */
663
- S(this, "_listener");
674
+ l(this, "_listener");
664
675
  /**
665
676
  * 需要重试的 action
666
677
  */
667
- S(this, "_needRetryActions", [
678
+ l(this, "_needRetryActions", [
668
679
  A.START_SINGLE_CALL,
669
680
  A.START_GROUP_CALL,
670
681
  A.ACCEPT_CALL,
671
682
  A.JOIN_CALL,
672
683
  A.EVENT_UP_CALL
673
684
  ]);
674
- S(this, "_sessionId", "");
675
- this._context = e, this._runtime = _, this._initOpts = i, this._timeCorrectioner = n, this._logger = o, this._context.onCallInfo = this._onRecvCallSignal.bind(this), this._context.onconnectionstatechange = this._onIMConnectionStateChange.bind(this), this._sessionId = Pe();
685
+ l(this, "_sessionId", "");
686
+ this._context = e, this._runtime = _, this._initOpts = i, this._timeCorrectioner = n, this._logger = o, this._context.onCallInfo = this._onRecvCallSignal.bind(this), this._context.onconnectionstatechange = this._onIMConnectionStateChange.bind(this), this._sessionId = Ge();
676
687
  }
677
688
  getSessionId() {
678
689
  return this._sessionId;
@@ -689,7 +700,7 @@ class qe extends oe {
689
700
  secretChat: L,
690
701
  targetType: c,
691
702
  targetId: T,
692
- nickName: l,
703
+ nickName: S,
693
704
  oldRoomId: I
694
705
  } = e;
695
706
  return n === M.SINGLE ? this.startSingleCall({
@@ -707,7 +718,7 @@ class qe extends oe {
707
718
  mediaType: E,
708
719
  targetType: c,
709
720
  targetId: T,
710
- nickName: l,
721
+ nickName: S,
711
722
  oldRoomId: I
712
723
  }, _);
713
724
  }
@@ -801,10 +812,10 @@ class qe extends oe {
801
812
  const { code: E, data: L } = o;
802
813
  if (E !== se.SUCCESS)
803
814
  return { code: E };
804
- const { key: c, value: T } = L, l = JSON.parse(T).data;
815
+ const { key: c, value: T } = L, S = JSON.parse(T).data;
805
816
  return {
806
817
  code: a.SUCCESS,
807
- data: l
818
+ data: S
808
819
  };
809
820
  }
810
821
  /**
@@ -846,7 +857,7 @@ class qe extends oe {
846
857
  * deviceId 有具体的值,根据 deviceId 判断是否是己端的 deviceId
847
858
  */
848
859
  _isValidData(e) {
849
- return !!(Ge(e) || ue(e) && ((e == null ? void 0 : e.length) === 0 || e === this._sessionId));
860
+ return !!(ve(e) || ge(e) && ((e == null ? void 0 : e.length) === 0 || e === this._sessionId));
850
861
  }
851
862
  /**
852
863
  * 收到邀请
@@ -925,29 +936,29 @@ class qe extends oe {
925
936
  duration: L,
926
937
  callStatus: c,
927
938
  callingUserId: T,
928
- callSessionUsers: l,
939
+ callSessionUsers: S,
929
940
  toDeviceId: I,
930
941
  callDialogEntitys: d
931
942
  } = e;
932
- l.some((O) => O.sessionStatus === C.INVITED && O.userId === this._context.getCurrentId()) ? this._onPubInviteCall({
943
+ S.some((O) => O.sessionStatus === C.INVITED && O.userId === this._context.getCurrentId()) ? this._onPubInviteCall({
933
944
  callId: i,
934
945
  toDeviceId: I,
935
946
  callType: n,
936
947
  mediaType: o,
937
948
  inviteUserId: T,
938
949
  callingUserId: T,
939
- callSessionUsers: l,
950
+ callSessionUsers: S,
940
951
  secretChat: E
941
952
  }, !0, _) : this._onStatusDownCall({
942
953
  callId: i,
943
954
  toDeviceId: I,
944
955
  callStatus: c,
945
956
  duration: L,
946
- callSessionUsers: l
957
+ callSessionUsers: S
947
958
  }, _), d.length > 0 && d.forEach((O) => this._onDialogDownCall(O, _), this);
948
959
  }
949
960
  }
950
- const Xe = (t) => {
961
+ const ze = (t) => {
951
962
  const s = "0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""), e = s.length + 1;
952
963
  let _ = +t;
953
964
  const i = [];
@@ -956,20 +967,20 @@ const Xe = (t) => {
956
967
  _ = (_ - n) / e, i.unshift(s[n]);
957
968
  } while (_);
958
969
  return i.join("");
959
- }, ze = () => "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (t) => {
970
+ }, Ze = () => "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (t) => {
960
971
  const s = Math.random() * 16 | 0;
961
972
  return (t === "x" ? s : s & 3 | 8).toString(16);
962
- }), Ze = () => {
963
- let t = ze();
964
- return t = `${t.replace(/-/g, "")}0`, t = parseInt(t, 16), t = Xe(t), t.length > 22 && (t = t.slice(0, 22)), t;
965
- }, e_ = "RC_CALLPLUS", __ = 1;
973
+ }), e_ = () => {
974
+ let t = Ze();
975
+ return t = `${t.replace(/-/g, "")}0`, t = parseInt(t, 16), t = ze(t), t.length > 22 && (t = t.slice(0, 22)), t;
976
+ }, __ = "RC_CALLPLUS", t_ = 1;
966
977
  let v;
967
978
  const y = class y {
968
979
  constructor() {
969
980
  }
970
981
  static init(s, e) {
971
982
  v = s, this.isSupport() || v.info("[RCCallIndexDB]", "IndexDB is not support in the current environment");
972
- const _ = window.indexedDB.open(e_, __);
983
+ const _ = window.indexedDB.open(__, t_);
973
984
  _.onerror = (i) => {
974
985
  v.warn("[RCCallIndexDB]", `open indexDB req failed -> ${i.target.error}`);
975
986
  }, _.onsuccess = (i) => {
@@ -1068,17 +1079,17 @@ const y = class y {
1068
1079
  /**
1069
1080
  * call indexDB 库
1070
1081
  */
1071
- S(y, "_db", null), /**
1082
+ l(y, "_db", null), /**
1072
1083
  * RCCallIndexDB 实例
1073
1084
  */
1074
- S(y, "_instance", null);
1085
+ l(y, "_instance", null);
1075
1086
  let z = y;
1076
- class t_ {
1087
+ class i_ {
1077
1088
  constructor(s, e) {
1078
- S(this, "_localStore");
1079
- S(this, "_indexDBStore");
1080
- S(this, "_storeKey", "CallBW_AbnormalCall");
1081
- S(this, "_isSupportIndexDB");
1089
+ l(this, "_localStore");
1090
+ l(this, "_indexDBStore");
1091
+ l(this, "_storeKey", "CallBW_AbnormalCall");
1092
+ l(this, "_isSupportIndexDB");
1082
1093
  if (this._runtime = s, this._logger = e, this._isSupportIndexDB = z.isSupport(), this._isSupportIndexDB) {
1083
1094
  z.init(this._logger, {
1084
1095
  onSuccess: () => {
@@ -1171,39 +1182,39 @@ class t_ {
1171
1182
  }
1172
1183
  }
1173
1184
  var Ie = /* @__PURE__ */ ((t) => (t[t.PROMPT = 0] = "PROMPT", t[t.CALL_DURATION = 10] = "CALL_DURATION", t[t.FIRST_FRAME = 20] = "FIRST_FRAME", t))(Ie || {}), P = /* @__PURE__ */ ((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))(P || {});
1174
- class i_ {
1185
+ class s_ {
1175
1186
  constructor(s, e, _) {
1176
1187
  /**
1177
1188
  * 接口响应时间
1178
1189
  */
1179
- S(this, "_RTT", 0);
1190
+ l(this, "_RTT", 0);
1180
1191
  /**
1181
1192
  * 可用的接口响应时间下限(单位: ms)
1182
1193
  */
1183
- S(this, "_validMinRTT", 200);
1194
+ l(this, "_validMinRTT", 200);
1184
1195
  /**
1185
1196
  * 可用的接口响应时间上限(单位: ms)
1186
1197
  */
1187
- S(this, "_validMaxRTT", 1e3);
1198
+ l(this, "_validMaxRTT", 1e3);
1188
1199
  /**
1189
1200
  * 与 callServer 的时间偏差时间(单位: ms)
1190
1201
  */
1191
- S(this, "_deltaTime", 0);
1202
+ l(this, "_deltaTime", 0);
1192
1203
  /**
1193
1204
  * timerId
1194
1205
  */
1195
- S(this, "_timerId", null);
1206
+ l(this, "_timerId", null);
1196
1207
  /**
1197
1208
  * 轮训时间间隔(单位: ms)
1198
1209
  */
1199
- S(this, "_interval", 2 * 1e3);
1210
+ l(this, "_interval", 2 * 1e3);
1200
1211
  /**
1201
1212
  * 最大重试次数
1202
1213
  */
1203
- S(this, "_maxRetryTimes", 8);
1204
- S(this, "_startTimes", 0);
1205
- S(this, "_retryTimesInCall", 0);
1206
- S(this, "_maxRetryTimesInCall", 3);
1214
+ l(this, "_maxRetryTimes", 8);
1215
+ l(this, "_startTimes", 0);
1216
+ l(this, "_retryTimesInCall", 0);
1217
+ l(this, "_maxRetryTimesInCall", 3);
1207
1218
  this._callEngine = s, this._logger = e, this._singleCallDurationEv = _;
1208
1219
  }
1209
1220
  /**
@@ -1242,7 +1253,7 @@ class i_ {
1242
1253
  * 开始定时递归获取与 CallServer 的时间偏差值
1243
1254
  */
1244
1255
  start(s) {
1245
- this._timerId || this._startTimes >= this._maxRetryTimes || (this._logger.info(r.L_TIME_CORRECT_START_O, `timerId: ${this._timerId}`), this._startTimes++, this._getDeltaTime(s), this._timerId = Se(() => {
1256
+ this._timerId || this._startTimes >= this._maxRetryTimes || (this._logger.info(r.L_TIME_CORRECT_START_O, `timerId: ${this._timerId}`), this._startTimes++, this._getDeltaTime(s), this._timerId = le(() => {
1246
1257
  this._timerId = null, this.start(s);
1247
1258
  }, this._interval));
1248
1259
  }
@@ -1313,7 +1324,7 @@ class i_ {
1313
1324
  }
1314
1325
  }
1315
1326
  var Z = /* @__PURE__ */ ((t) => (t[t.SOON_AFETER = 0] = "SOON_AFETER", t[t.CURRENT = 1] = "CURRENT", t))(Z || {}), Ce = /* @__PURE__ */ ((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))(Ce || {}), de = /* @__PURE__ */ ((t) => (t[t.OUT = -1] = "OUT", t[t.GROUP = 0] = "GROUP", t[t.IN = 1] = "IN", t))(de || {});
1316
- const Oe = 60 * 1e3, w = class w extends oe {
1327
+ const ue = 60 * 1e3, w = class w extends oe {
1317
1328
  /**
1318
1329
  * 构造器
1319
1330
  */
@@ -1322,35 +1333,35 @@ const Oe = 60 * 1e3, w = class w extends oe {
1322
1333
  /**
1323
1334
  * 主 session
1324
1335
  */
1325
- S(this, "_mainSession", null);
1336
+ l(this, "_mainSession", null);
1326
1337
  /**
1327
1338
  * 在通话中收到的 邀请 session
1328
1339
  */
1329
- S(this, "_holdSessions", []);
1340
+ l(this, "_holdSessions", []);
1330
1341
  /**
1331
1342
  * 信令模块
1332
1343
  */
1333
- S(this, "_signalModule");
1344
+ l(this, "_signalModule");
1334
1345
  /**
1335
1346
  * 异常结束 call 处理器
1336
1347
  */
1337
- S(this, "_abnormalModule");
1348
+ l(this, "_abnormalModule");
1338
1349
  /**
1339
1350
  * 记录单呼中,是否上报过第一帧
1340
1351
  * 置 true 时机:收到远端第一帧,成功上报 Server
1341
1352
  * 置 false 时机:通话结束
1342
1353
  */
1343
- S(this, "_isUpFirstFrameTime", !1);
1354
+ l(this, "_isUpFirstFrameTime", !1);
1344
1355
  /**
1345
1356
  * 通话为 ONCALL 时,SDK 需给业务层上报通话开始计时事件
1346
1357
  * 会收到多次 ONCALL,所以需要标识是否已抛过事件
1347
1358
  */
1348
- S(this, "_callStartMap", {});
1359
+ l(this, "_callStartMap", {});
1349
1360
  /**
1350
1361
  * 校时器
1351
1362
  */
1352
- S(this, "_timeCorrectioner");
1353
- this._context = e, this._runtime = _, this._initOpts = i, this._logger = n, this._reportAppEventModule = o, this._timeCorrectioner = new i_(this, n, this._onRecvSinCallDuration.bind(this)), this._signalModule = new qe(e, _, i, this._timeCorrectioner, this._logger), this._signalModule.registerListener({
1363
+ l(this, "_timeCorrectioner");
1364
+ this._context = e, this._runtime = _, this._initOpts = i, this._logger = n, this._reportAppEventModule = o, this._timeCorrectioner = new s_(this, n, this._onRecvSinCallDuration.bind(this)), this._signalModule = new Xe(e, _, i, this._timeCorrectioner, this._logger), this._signalModule.registerListener({
1354
1365
  onInvite: this._onInvite.bind(this),
1355
1366
  onStatusDown: this._onStatusDown.bind(this),
1356
1367
  onOtherClientStatusDown: this._onOtherClientStatusDown.bind(this),
@@ -1358,7 +1369,7 @@ const Oe = 60 * 1e3, w = class w extends oe {
1358
1369
  onSwitchMediaType: this._onSwitchMediaType.bind(this),
1359
1370
  onRecvCallEndLog: this._onRecvCallEndLog.bind(this),
1360
1371
  onIMStateChange: this._onIMStateChange.bind(this)
1361
- }), this._abnormalModule = new t_(_, n);
1372
+ }), this._abnormalModule = new i_(_, n);
1362
1373
  }
1363
1374
  /**
1364
1375
  * 发起呼叫
@@ -1371,7 +1382,7 @@ const Oe = 60 * 1e3, w = class w extends oe {
1371
1382
  targetId: L,
1372
1383
  targetType: c,
1373
1384
  oldRoomId: T
1374
- } = e, { code: l, data: I } = await this._signalModule.startCall({
1385
+ } = e, { code: S, data: I } = await this._signalModule.startCall({
1375
1386
  clientCallId: e.callId,
1376
1387
  callType: n,
1377
1388
  mediaType: o,
@@ -1381,8 +1392,8 @@ const Oe = 60 * 1e3, w = class w extends oe {
1381
1392
  targetId: L,
1382
1393
  oldRoomId: T
1383
1394
  }, _);
1384
- if (l !== a.SUCCESS)
1385
- return { code: l };
1395
+ if (S !== a.SUCCESS)
1396
+ return { code: S };
1386
1397
  const { callId: d, busylineUsers: g } = I;
1387
1398
  if (this._abnormalModule.addAbnormallCallId(i, d), this._mainSession = new ce(
1388
1399
  d,
@@ -1395,7 +1406,7 @@ const Oe = 60 * 1e3, w = class w extends oe {
1395
1406
  this._logger
1396
1407
  ), n === M.SINGLE) {
1397
1408
  const N = this._startTimer(I.callId, C.NO_ANSWER, _);
1398
- this._mainSession.updateTimerId(le.INVITER, N);
1409
+ this._mainSession.updateTimerId(Se.INVITER, N);
1399
1410
  }
1400
1411
  const O = {
1401
1412
  userId: i,
@@ -1428,7 +1439,7 @@ const Oe = 60 * 1e3, w = class w extends oe {
1428
1439
  };
1429
1440
  }), u = u.filter(({ userId: N }) => m.every(({ userId: U }) => U !== N))), setTimeout(() => {
1430
1441
  this.updateUsersState(d, [O, ...u, ...m], _);
1431
- }), { code: l, data: I };
1442
+ }), { code: S, data: I };
1432
1443
  }
1433
1444
  /**
1434
1445
  * 通话中邀请
@@ -1443,8 +1454,8 @@ const Oe = 60 * 1e3, w = class w extends oe {
1443
1454
  }, _);
1444
1455
  if (o === a.SUCCESS) {
1445
1456
  this._mainSession.getCallType() === M.SINGLE && (this._mainSession.updateCallType(M.MULTI), this._onCallTypeChange(this._mainSession.getCallId(), M.MULTI, _));
1446
- let c = i.map(({ userId: l, targetType: I, targetId: d }) => ({
1447
- userId: l,
1457
+ let c = i.map(({ userId: S, targetType: I, targetId: d }) => ({
1458
+ userId: S,
1448
1459
  userState: C.INVITED,
1449
1460
  systemState: h.INVITED,
1450
1461
  targetType: I,
@@ -1452,18 +1463,18 @@ const Oe = 60 * 1e3, w = class w extends oe {
1452
1463
  cameraEnable: !1,
1453
1464
  microphoneEnable: !1
1454
1465
  })), T = [];
1455
- E.busylineUsers && (T = (L = E.busylineUsers) == null ? void 0 : L.map((l) => {
1456
- const { targetType: I, targetId: d } = c.find((g) => g.userId === l.userId);
1466
+ E.busylineUsers && (T = (L = E.busylineUsers) == null ? void 0 : L.map((S) => {
1467
+ const { targetType: I, targetId: d } = c.find((g) => g.userId === S.userId);
1457
1468
  return {
1458
- userId: l.userId,
1459
- userState: l.sessionStatus,
1469
+ userId: S.userId,
1470
+ userState: S.sessionStatus,
1460
1471
  systemState: h.BUSYLINE_RINGING,
1461
1472
  targetType: I,
1462
1473
  targetId: d,
1463
1474
  cameraEnable: !1,
1464
1475
  microphoneEnable: !1
1465
1476
  };
1466
- }), c = c.filter(({ userId: l }) => T.every(({ userId: I }) => I !== l))), this.updateUsersState(n, [...c, ...T], _);
1477
+ }), c = c.filter(({ userId: S }) => T.every(({ userId: I }) => I !== S))), this.updateUsersState(n, [...c, ...T], _);
1467
1478
  }
1468
1479
  return { code: o, data: E };
1469
1480
  }
@@ -1514,7 +1525,7 @@ const Oe = 60 * 1e3, w = class w extends oe {
1514
1525
  mediaType: e.mediaType
1515
1526
  };
1516
1527
  this._mainSession.updateReqMediaType(e.mediaType);
1517
- const n = Ze(), { code: o } = await this._signalModule.dialogUpCall({
1528
+ const n = e_(), { code: o } = await this._signalModule.dialogUpCall({
1518
1529
  transactionId: n,
1519
1530
  callId: this._mainSession.getCallId(),
1520
1531
  toUserIds: e.toUserIds,
@@ -1602,7 +1613,7 @@ const Oe = 60 * 1e3, w = class w extends oe {
1602
1613
  callId: L,
1603
1614
  callType: c,
1604
1615
  mediaType: T,
1605
- callingUserId: l,
1616
+ callingUserId: S,
1606
1617
  callUserIds: I,
1607
1618
  callStatus: d,
1608
1619
  crtTime: g,
@@ -1611,13 +1622,13 @@ const Oe = 60 * 1e3, w = class w extends oe {
1611
1622
  targetId: m,
1612
1623
  startTime: N,
1613
1624
  syncTime: U
1614
- } = E, f = l === _ ? de.OUT : de.IN, { clientStartTime: B = N } = this._timeCorrectioner.calcClientStartTime(L, N, e);
1625
+ } = E, f = S === _ ? de.OUT : de.IN, { clientStartTime: B = N } = this._timeCorrectioner.calcClientStartTime(L, N, e);
1615
1626
  return {
1616
1627
  callId: L,
1617
1628
  callType: c,
1618
1629
  callDirection: f,
1619
1630
  mediaType: T,
1620
- callerUserId: l,
1631
+ callerUserId: S,
1621
1632
  callUserIds: I,
1622
1633
  sessionState: d,
1623
1634
  userState: O,
@@ -1654,11 +1665,11 @@ const Oe = 60 * 1e3, w = class w extends oe {
1654
1665
  callType: L,
1655
1666
  mediaType: c,
1656
1667
  callStatus: T,
1657
- callSessionUsers: l,
1668
+ callSessionUsers: S,
1658
1669
  startTime: I,
1659
1670
  duration: d,
1660
1671
  syncTime: g
1661
- } = n, O = l.map((u) => {
1672
+ } = n, O = S.map((u) => {
1662
1673
  const {
1663
1674
  userId: m,
1664
1675
  sessionStatus: N,
@@ -1724,10 +1735,10 @@ const Oe = 60 * 1e3, w = class w extends oe {
1724
1735
  const n = [this._mainSession, ...this._holdSessions].find((E) => (E == null ? void 0 : E.getCallId()) === e), o = [];
1725
1736
  if (n) {
1726
1737
  const E = _.map((L) => {
1727
- const c = n.getUserList().filter(({ userId: d }) => d === L.userId)[0] || {}, T = L.userState === C.IDLE, { cameraEnable: l = !1, microphoneEnable: I = !1 } = T ? { cameraEnable: !1, microphoneEnable: !1 } : c;
1738
+ const c = n.getUserList().filter(({ userId: d }) => d === L.userId)[0] || {}, T = L.userState === C.IDLE, { cameraEnable: S = !1, microphoneEnable: I = !1 } = T ? { cameraEnable: !1, microphoneEnable: !1 } : c;
1728
1739
  return {
1729
1740
  ...L,
1730
- cameraEnable: l,
1741
+ cameraEnable: S,
1731
1742
  microphoneEnable: I
1732
1743
  };
1733
1744
  });
@@ -1779,18 +1790,18 @@ const Oe = 60 * 1e3, w = class w extends oe {
1779
1790
  let {
1780
1791
  userId: c,
1781
1792
  userState: T,
1782
- systemState: l,
1793
+ systemState: S,
1783
1794
  targetType: I,
1784
1795
  targetId: d
1785
1796
  } = L;
1786
- return c === n && (l = e), {
1797
+ return c === n && (S = e), {
1787
1798
  userId: c,
1788
1799
  sessionStatus: C.ENDED,
1789
1800
  statusTime: Date.now(),
1790
1801
  duration: 0,
1791
1802
  changed: 1,
1792
1803
  inviteUserId: this._mainSession.getStartCallerId(),
1793
- sysStatus: l,
1804
+ sysStatus: S,
1794
1805
  targetType: I,
1795
1806
  targetId: d
1796
1807
  };
@@ -1831,10 +1842,10 @@ const Oe = 60 * 1e3, w = class w extends oe {
1831
1842
  _onIMStateChange(e) {
1832
1843
  const _ = this._logger.createTraceId();
1833
1844
  let i = 0;
1834
- e === K.DISCONNECTED && this._mainSession && this._mainSession.getSessionState() !== p.ONCALL && (i = Se(() => {
1845
+ e === K.DISCONNECTED && this._mainSession && this._mainSession.getSessionState() !== p.ONCALL && (i = le(() => {
1835
1846
  var n;
1836
1847
  this._logger.info(r.L_CALL_ENGINE_IM_STATE_CHANGE_O, "endCurrentSession, IM disconnected for more than 60s", _), this.endCurrentSession(h.CONNECTION_ERR, (n = this._mainSession) == null ? void 0 : n.getCallId(), _);
1837
- }, Oe)), e === K.CONNECTED && i && clearTimeout(i);
1848
+ }, ue)), e === K.CONNECTED && i && clearTimeout(i);
1838
1849
  }
1839
1850
  /**
1840
1851
  * 处理发起邀请、收到邀请后计时超时
@@ -1859,13 +1870,13 @@ const Oe = 60 * 1e3, w = class w extends oe {
1859
1870
  userId: L,
1860
1871
  targetType: c,
1861
1872
  targetId: T,
1862
- stateTime: l
1873
+ stateTime: S
1863
1874
  } = E;
1864
1875
  let I, d;
1865
1876
  return L === o ? (I = _ === C.MISSED ? h.MISSED : h.NO_ANSWER, d = _ === C.MISSED ? C.MISSED : C.NO_ANSWER) : (I = _ === C.MISSED ? h.NO_ANSWER : h.MISSED, d = _ === C.MISSED ? C.NO_ANSWER : C.MISSED), {
1866
1877
  userId: L,
1867
1878
  sessionStatus: d,
1868
- statusTime: l ? l + 1 : Date.now(),
1879
+ statusTime: S ? S + 1 : Date.now(),
1869
1880
  duration: 0,
1870
1881
  changed: 1,
1871
1882
  inviteUserId: n.getCallerId(),
@@ -1880,9 +1891,9 @@ const Oe = 60 * 1e3, w = class w extends oe {
1880
1891
  * 开启超时计时器
1881
1892
  */
1882
1893
  _startTimer(e, _, i) {
1883
- const n = Se(() => {
1894
+ const n = le(() => {
1884
1895
  this._handleCallTimeout(e, _, i), this._signalModule.statusUpCall({ callId: e, sessionStatus: _ }, i);
1885
- }, Oe);
1896
+ }, ue);
1886
1897
  return this._logger.info(r.L_CALL_ENGINE_START_CALL_TIMER_O, `callId: ${e}, timerId: ${n}`, i), n;
1887
1898
  }
1888
1899
  /**
@@ -1902,10 +1913,10 @@ const Oe = 60 * 1e3, w = class w extends oe {
1902
1913
  callType: L,
1903
1914
  mediaType: c,
1904
1915
  callSessionUsers: T,
1905
- secretChat: l,
1916
+ secretChat: S,
1906
1917
  callingUserId: I
1907
1918
  } = e;
1908
- if (l === Te.SECRET) {
1919
+ if (S === Te.SECRET) {
1909
1920
  this.emit(x.onPubInviteCallMiss, Object.assign(e, {
1910
1921
  extra: JSON.stringify(e),
1911
1922
  reason: re.SECRET_CALL,
@@ -1927,25 +1938,25 @@ const Oe = 60 * 1e3, w = class w extends oe {
1927
1938
  );
1928
1939
  this._signalModule.ringingCall({ callId: o }, i);
1929
1940
  const U = this._startTimer(o, C.MISSED, i);
1930
- N.updateTimerId(le.INVITEE, U), this._mainSession ? (this._holdSessions.push(N), this._mainSession.updateSessionState(p.BUSYLINE_WAIT)) : this._mainSession = N;
1941
+ N.updateTimerId(Se.INVITEE, U), this._mainSession ? (this._holdSessions.push(N), this._mainSession.updateSessionState(p.BUSYLINE_WAIT)) : this._mainSession = N;
1931
1942
  const f = new ie(N, this, this._logger);
1932
1943
  this._reportAppEventModule.onReceivedCall(f, i);
1933
1944
  const B = _ ? Ce.PUB_INVITE_CALL : Ce.PULL_KV_INVITE_CALL;
1934
1945
  this.emit(w.__INNER_INVITE__, f, B);
1935
1946
  const te = T.map(({
1936
1947
  userId: ae,
1937
- sessionStatus: me,
1938
- sysStatus: pe,
1939
- targetType: fe,
1940
- targetId: Me,
1941
- statusTime: De
1948
+ sessionStatus: pe,
1949
+ sysStatus: fe,
1950
+ targetType: Me,
1951
+ targetId: De,
1952
+ statusTime: ye
1942
1953
  }) => ({
1943
1954
  userId: ae,
1944
- userState: me,
1945
- systemState: pe,
1946
- targetType: fe,
1947
- targetId: Me,
1948
- stateTime: De,
1955
+ userState: pe,
1956
+ systemState: fe,
1957
+ targetType: Me,
1958
+ targetId: De,
1959
+ stateTime: ye,
1949
1960
  cameraEnable: !1,
1950
1961
  microphoneEnable: !1
1951
1962
  }));
@@ -1984,7 +1995,7 @@ const Oe = 60 * 1e3, w = class w extends oe {
1984
1995
  * 收到 接听
1985
1996
  */
1986
1997
  _onAccept(e, _) {
1987
- var L, c, T, l;
1998
+ var L, c, T, S;
1988
1999
  const i = (L = this._mainSession) == null ? void 0 : L.getSessionState(), n = [
1989
2000
  p.CONNECTING,
1990
2001
  p.ONCALL,
@@ -1993,7 +2004,7 @@ const Oe = 60 * 1e3, w = class w extends oe {
1993
2004
  if (((c = this._mainSession) == null ? void 0 : c.getCallType()) === M.SINGLE && i && n.includes(i))
1994
2005
  return;
1995
2006
  const o = this._mainSession.getStartCallerId(), E = this._context.getCurrentId();
1996
- ((T = this._mainSession) == null ? void 0 : T.getCallType()) === M.SINGLE && o === E && e.filter((d) => d.fromUserId !== E) && this.emit(w.__INNER_SESSION_CONNECT__, this.getLocalMainSession().getCallId(), _), (l = this._mainSession) == null || l.updateSessionState(p.CONNECTING), this._stopTimer(this._mainSession.getInviterTimerId(), _);
2007
+ ((T = this._mainSession) == null ? void 0 : T.getCallType()) === M.SINGLE && o === E && e.filter((d) => d.fromUserId !== E) && this.emit(w.__INNER_SESSION_CONNECT__, this.getLocalMainSession().getCallId(), _), (S = this._mainSession) == null || S.updateSessionState(p.CONNECTING), this._stopTimer(this._mainSession.getInviterTimerId(), _);
1997
2008
  }
1998
2009
  /**
1999
2010
  * 收到状态下发
@@ -2034,22 +2045,22 @@ const Oe = 60 * 1e3, w = class w extends oe {
2034
2045
  if (T.length > 0 && this.updateUsersState(E, T, _), !this._mainSession && !this._holdSessions.length)
2035
2046
  return;
2036
2047
  const {
2037
- hangupData: l,
2048
+ hangupData: S,
2038
2049
  acceptData: I,
2039
2050
  otherInvitedData: d
2040
- } = xe(e);
2041
- l.length > 0 && this._onHangup(l, e.callStatus, _), I.length > 0 && this._onAccept(I, _), d.length > 0 && ((O = this._mainSession) == null ? void 0 : O.getCallType()) === M.MULTI && this._onOtherMemberInvite(d), (e.callStatus === p.ENDED || L) && this.sessionClose(e, _, !0);
2051
+ } = Fe(e);
2052
+ S.length > 0 && this._onHangup(S, e.callStatus, _), I.length > 0 && this._onAccept(I, _), d.length > 0 && ((O = this._mainSession) == null ? void 0 : O.getCallType()) === M.MULTI && this._onOtherMemberInvite(d), (e.callStatus === p.ENDED || L) && this.sessionClose(e, _, !0);
2042
2053
  }
2043
2054
  /**
2044
2055
  * 收到其他端的状态下发
2045
2056
  */
2046
2057
  _onOtherClientStatusDown(e, _) {
2047
- var c, T, l;
2058
+ var c, T, S;
2048
2059
  const i = this._context.getCurrentId(), { callId: n, callSessionUsers: o, callStatus: E } = e, L = o.find(({ userId: I }) => I === i);
2049
2060
  if (L && (this._mainSession || this._holdSessions.length)) {
2050
2061
  const { userId: I, sessionStatus: d, statusTime: g } = L;
2051
2062
  if (d === C.CONNECTING) {
2052
- const O = [C.ONCALL, C.CONNECTING], u = ((c = this._mainSession) == null ? void 0 : c.getCallId()) === n, m = (l = (T = this._mainSession) == null ? void 0 : T.getUserList().find((U) => U.userId === i)) == null ? void 0 : l.userState;
2063
+ const O = [C.ONCALL, C.CONNECTING], u = ((c = this._mainSession) == null ? void 0 : c.getCallId()) === n, m = (S = (T = this._mainSession) == null ? void 0 : T.getUserList().find((U) => U.userId === i)) == null ? void 0 : S.userState;
2053
2064
  u && m && O.includes(m) || (this.updateUsersState(n, [{
2054
2065
  userId: I,
2055
2066
  userState: d,
@@ -2074,8 +2085,8 @@ const Oe = 60 * 1e3, w = class w extends oe {
2074
2085
  fromUserId: L
2075
2086
  } = e;
2076
2087
  if (E === Ie.CALL_DURATION && i === ((c = this._mainSession) == null ? void 0 : c.getCallId())) {
2077
- const { firstFrameTime: T } = o, { code: l, clientStartTime: I } = await this._timeCorrectioner.calcClientStartTime(i, T, _);
2078
- this._logger.info(r.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O, `clientFirstFrameTime: ${I}`, _), l === P.SUCCESS && this._reportAppEventModule.onReceivedCallFirstFrameTime(i, I, _);
2088
+ const { firstFrameTime: T } = o, { code: S, clientStartTime: I } = await this._timeCorrectioner.calcClientStartTime(i, T, _);
2089
+ this._logger.info(r.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O, `clientFirstFrameTime: ${I}`, _), S === P.SUCCESS && this._reportAppEventModule.onReceivedCallFirstFrameTime(i, I, _);
2079
2090
  }
2080
2091
  }
2081
2092
  /**
@@ -2096,9 +2107,9 @@ const Oe = 60 * 1e3, w = class w extends oe {
2096
2107
  extraKeyVal: o,
2097
2108
  transactionId: E,
2098
2109
  promoterId: L
2099
- } = e, { mediaType: c, reason: T } = o, l = (O = this._mainSession) == null ? void 0 : O.getCallId();
2100
- if (i !== l) {
2101
- this._logger.info(r.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O, `not current session callId: ${l}, recvCallId: ${i}`, _);
2110
+ } = e, { mediaType: c, reason: T } = o, S = (O = this._mainSession) == null ? void 0 : O.getCallId();
2111
+ if (i !== S) {
2112
+ this._logger.info(r.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O, `not current session callId: ${S}, recvCallId: ${i}`, _);
2102
2113
  return;
2103
2114
  }
2104
2115
  const { transactionId: I, action: d, mediaType: g } = ((u = this._mainSession) == null ? void 0 : u.getOldDialogData()) || {};
@@ -2256,7 +2267,7 @@ const Oe = 60 * 1e3, w = class w extends oe {
2256
2267
  this._reportAppEventModule.onCallTypeChanged(_, e, i);
2257
2268
  }
2258
2269
  };
2259
- S(w, "__INNER_SESSION_CLOSE__", "inner-session-close"), S(w, "__INNER_SESSION_CONNECT__", "inner-session-connect"), S(w, "__INNER_CHANGE_MEDIA_TYPE__", "inner-change-media-type"), S(w, "__INNER_INVITE__", "inner-invite");
2270
+ 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");
2260
2271
  let Y = w;
2261
2272
  var ne = /* @__PURE__ */ ((t) => (t.NORMAL = "RongCloudRTC", t.SCREEN = "ScreenShare", t))(ne || {});
2262
2273
  const V = class V extends oe {
@@ -2265,37 +2276,37 @@ const V = class V extends oe {
2265
2276
  /**
2266
2277
  * RCRTC 实例
2267
2278
  */
2268
- S(this, "_rtcClient");
2279
+ l(this, "_rtcClient");
2269
2280
  /**
2270
2281
  * 己方的音视频 tracks
2271
2282
  */
2272
- S(this, "_localTracks", []);
2283
+ l(this, "_localTracks", []);
2273
2284
  /**
2274
2285
  * RCRTCRoom 实例
2275
2286
  */
2276
- S(this, "_room", null);
2277
- S(this, "_callId", "");
2278
- S(this, "_callMediaType");
2279
- S(this, "_videoConfig", {
2287
+ l(this, "_room", null);
2288
+ l(this, "_callId", "");
2289
+ l(this, "_callMediaType");
2290
+ l(this, "_videoConfig", {
2280
2291
  resolution: ee.W640_H480,
2281
2292
  frameRate: _e.FPS_15
2282
2293
  });
2283
- S(this, "_audioConfig", {});
2284
- S(this, "_isPubTiny", !1);
2294
+ l(this, "_audioConfig", {});
2295
+ l(this, "_isPubTiny", !1);
2285
2296
  /**
2286
2297
  * 视频配置是否变更
2287
2298
  */
2288
- S(this, "_videoConfigIsChange", !1);
2299
+ l(this, "_videoConfigIsChange", !1);
2289
2300
  /**
2290
2301
  * 音频配置是否变更
2291
2302
  */
2292
- S(this, "_audioConfigIsChange", !1);
2303
+ l(this, "_audioConfigIsChange", !1);
2293
2304
  /**
2294
2305
  * 存储设置的人员和视图
2295
2306
  */
2296
- S(this, "_userViewMap", {});
2297
- S(this, "_callPlusStatusReportListener", null);
2298
- S(this, "_remoteAudioEnable", !0);
2307
+ l(this, "_userViewMap", {});
2308
+ l(this, "_callPlusStatusReportListener", null);
2309
+ l(this, "_remoteAudioEnable", !0);
2299
2310
  this._context = e, this._runtime = _, this._initOpts = i, this._logger = n, this._callEngine = o, this._reportAppEventModule = E, this._rtcClient = i == null ? void 0 : i.rtcClient, this._isPubTiny = i.isPubTiny || !1;
2300
2311
  }
2301
2312
  setCallPlusStatusReportListener(e) {
@@ -2351,7 +2362,7 @@ const V = class V extends oe {
2351
2362
  }), this._localTracks.length = 0;
2352
2363
  }
2353
2364
  setAllRemoteAudioEnable(e, _) {
2354
- return this._logger.info(r.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T, `enable: ${e}`, _), ge(e) ? (this._remoteAudioEnable = e, this._room ? (this._room.getRemoteTracks().filter((n) => n.isAudioTrack()).forEach((n) => {
2365
+ return this._logger.info(r.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T, `enable: ${e}`, _), Ue(e) ? (this._remoteAudioEnable = e, this._room ? (this._room.getRemoteTracks().filter((n) => n.isAudioTrack()).forEach((n) => {
2355
2366
  e ? n.unmute() : n.mute();
2356
2367
  }), this._logger.info(r.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R, "success", _), { code: a.SUCCESS }) : { code: a.SUCCESS }) : (this._logger.error(r.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R, `param error, enable: type is boolean, value: ${e}`), { code: a.PARAM_ERROR });
2357
2368
  }
@@ -2487,7 +2498,7 @@ const V = class V extends oe {
2487
2498
  this._logger.info(r.L_RTC_MODULE_JOIN_RTC_ROOM_T, `call: ${e}`, _);
2488
2499
  const { code: i, room: n, tracks: o } = await X({
2489
2500
  asyncFn: this._rtcClient.joinRTCRoom.bind(this._rtcClient),
2490
- fnArgs: [e, void 0, void 0, !1, ve.CALL]
2501
+ fnArgs: [e, void 0, void 0, !1, be.CALL]
2491
2502
  });
2492
2503
  return i !== D.SUCCESS ? (this._logger.error(r.L_RTC_MODULE_JOIN_RTC_ROOM_R, `callId: ${e}, errCode: ${i}`, _), this._onRTCMethodFail(h.JOIN_ROOM_ERR, _), { code: i }) : (this._logger.info(r.L_RTC_MODULE_JOIN_RTC_ROOM_R, "success", _), this._room = n, this._onSelfJoined({ callId: e, userId: this._context.getCurrentId() }, _), o != null && o.length && this._onRemoteTrackPublish(o), this._callId = e, { code: a.SUCCESS, room: n, tracks: o });
2493
2504
  }
@@ -2693,11 +2704,11 @@ const V = class V extends oe {
2693
2704
  } = n;
2694
2705
  if (this._callMediaType === R.AUDIO_VIDEO && E === "audio")
2695
2706
  return;
2696
- const { userId: T } = Be.parseTrackId(o), l = {};
2697
- l[T] = {
2707
+ const { userId: T } = $e.parseTrackId(o), S = {};
2708
+ S[T] = {
2698
2709
  packetLostRate: L,
2699
2710
  bitRate: c
2700
- }, (I = this._callPlusStatusReportListener) == null || I.onReceivePacketLoss(l);
2711
+ }, (I = this._callPlusStatusReportListener) == null || I.onReceivePacketLoss(S);
2701
2712
  });
2702
2713
  }
2703
2714
  /**
@@ -2758,7 +2769,7 @@ const V = class V extends oe {
2758
2769
  * 发布本地资源的逻辑
2759
2770
  */
2760
2771
  async publish(e, _) {
2761
- this._logger.info(r.L_RTC_MODULE_PUBLISH_T, `tracksIds: ${e.map((n) => n instanceof $e ? n.getTrackId() : n.track.getTrackId())}`, _);
2772
+ this._logger.info(r.L_RTC_MODULE_PUBLISH_T, `tracksIds: ${e.map((n) => n instanceof He ? n.getTrackId() : n.track.getTrackId())}`, _);
2762
2773
  const { code: i } = await X({
2763
2774
  asyncFn: this._room.publish.bind(this._room),
2764
2775
  fnArgs: [e],
@@ -2780,14 +2791,14 @@ const V = class V extends oe {
2780
2791
  isTiny: L
2781
2792
  }, o === this._context.getCurrentId() || !this._room)
2782
2793
  return;
2783
- const T = (this.getRemoteTracks()[o] || []).map((l) => ({
2784
- track: l,
2794
+ const T = (this.getRemoteTracks()[o] || []).map((S) => ({
2795
+ track: S,
2785
2796
  subTiny: L
2786
- })).filter(({ track: l }) => !l.isSubscribed());
2797
+ })).filter(({ track: S }) => !S.isSubscribed());
2787
2798
  i.push(...T);
2788
2799
  }), this._logger.info(r.L_RTC_MODULE_SET_VIDEO_VIEW_O, JSON.stringify(
2789
2800
  {
2790
- userViewMap: this._userViewMap,
2801
+ userViewMap: Oe(this._userViewMap),
2791
2802
  needSubTrackIds: i.map(({ track: n }) => n.getTrackId())
2792
2803
  }
2793
2804
  ), _), i.length && this.subscribeTracks(i, _);
@@ -2806,7 +2817,7 @@ const V = class V extends oe {
2806
2817
  delete this._userViewMap[n];
2807
2818
  }), this._logger.info(r.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O, JSON.stringify(
2808
2819
  {
2809
- userViewMap: this._userViewMap,
2820
+ userViewMap: Oe(this._userViewMap),
2810
2821
  unsubTracks: i.map((n) => n.getTrackId())
2811
2822
  }
2812
2823
  ), _), i.length && this.unsubscribeTracks(i, _);
@@ -2833,11 +2844,11 @@ const V = class V extends oe {
2833
2844
  }
2834
2845
  }
2835
2846
  };
2836
- S(V, "__INNER_RTC_PROCESS_FAILED__", "inner-rtc-process-failed"), S(V, "__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__", "inner-rtc-peerconnection-abnormal-close"), S(V, "__INNER_ON_SELF_JOINED__", "inner-on-self-joined"), S(V, "__INNER_ON_OTHER_JOINED__", "inner-on-other-joined"), S(V, "__INNER_RECEIVE_FIRST_FRAME__", "inner-receive-first-frame"), S(V, "__INNER_ON_KICKOFF__", "inner-kickoff-frame"), S(V, "__INNER_ON_DEVICE_ENABLE_CHANGE__", "inner-on-device-enable-change");
2847
+ l(V, "__INNER_RTC_PROCESS_FAILED__", "inner-rtc-process-failed"), l(V, "__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__", "inner-rtc-peerconnection-abnormal-close"), l(V, "__INNER_ON_SELF_JOINED__", "inner-on-self-joined"), l(V, "__INNER_ON_OTHER_JOINED__", "inner-on-other-joined"), l(V, "__INNER_RECEIVE_FIRST_FRAME__", "inner-receive-first-frame"), l(V, "__INNER_ON_KICKOFF__", "inner-kickoff-frame"), l(V, "__INNER_ON_DEVICE_ENABLE_CHANGE__", "inner-on-device-enable-change");
2837
2848
  let $ = V;
2838
- class s_ {
2849
+ class n_ {
2839
2850
  constructor(s) {
2840
- S(this, "_listener");
2851
+ l(this, "_listener");
2841
2852
  this._logger = s;
2842
2853
  }
2843
2854
  /**
@@ -3003,43 +3014,43 @@ class s_ {
3003
3014
  });
3004
3015
  }
3005
3016
  }
3006
- var Ue = /* @__PURE__ */ ((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))(Ue || {});
3007
- class n_ {
3017
+ var me = /* @__PURE__ */ ((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))(me || {});
3018
+ class r_ {
3008
3019
  constructor(s, e, _, i) {
3009
3020
  /**
3010
3021
  * 摄像头采集配置
3011
3022
  */
3012
- S(this, "_videoConfig", {
3023
+ l(this, "_videoConfig", {
3013
3024
  resolution: ee.W640_H480,
3014
3025
  frameRate: _e.FPS_15
3015
3026
  });
3016
3027
  /**
3017
3028
  * 麦克风采集配置
3018
3029
  */
3019
- S(this, "_audioConfig", {});
3030
+ l(this, "_audioConfig", {});
3020
3031
  /**
3021
3032
  * 统计埋点类
3022
3033
  */
3023
- S(this, "_callPlusStatistics");
3034
+ l(this, "_callPlusStatistics");
3024
3035
  /**
3025
3036
  * client callId
3026
3037
  */
3027
- S(this, "_clientCallId", "");
3038
+ l(this, "_clientCallId", "");
3028
3039
  /**
3029
3040
  * 是否为主动挂断
3030
3041
  */
3031
- S(this, "_isLaunchHangup", !1);
3042
+ l(this, "_isLaunchHangup", !1);
3032
3043
  /**
3033
3044
  * 呼叫过程中挂断
3034
3045
  */
3035
- S(this, "_needHangupCallId", null);
3036
- S(this, "_callEngine");
3037
- S(this, "_rtcModule");
3046
+ l(this, "_needHangupCallId", null);
3047
+ l(this, "_callEngine");
3048
+ l(this, "_rtcModule");
3038
3049
  /**
3039
3050
  * 上报应用层事件模块
3040
3051
  */
3041
- S(this, "_reportAppEventModule");
3042
- this._context = s, this._logger = e, this._runtime = _, this._initOpts = i, this._reportAppEventModule = new s_(e), this._callPlusStatistics = new We(this._logger, this._context), this._callEngine = new Y(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(Y.__INNER_SESSION_CONNECT__, this._rtcModule.sessionConnected.bind(this._rtcModule)), this._callEngine.on(Y.__INNER_SESSION_CLOSE__, this._sessionCloseHandle.bind(this)), this._callEngine.on(Y.__INNER_CHANGE_MEDIA_TYPE__, this._rtcModule.changeMediaType.bind(this._rtcModule)), this._callEngine.on(Y.__INNER_INVITE__, (n, o) => {
3052
+ l(this, "_reportAppEventModule");
3053
+ this._context = s, this._logger = e, this._runtime = _, this._initOpts = i, this._reportAppEventModule = new n_(e), this._callPlusStatistics = new je(this._logger, this._context), this._callEngine = new Y(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(Y.__INNER_SESSION_CONNECT__, this._rtcModule.sessionConnected.bind(this._rtcModule)), this._callEngine.on(Y.__INNER_SESSION_CLOSE__, this._sessionCloseHandle.bind(this)), this._callEngine.on(Y.__INNER_CHANGE_MEDIA_TYPE__, this._rtcModule.changeMediaType.bind(this._rtcModule)), this._callEngine.on(Y.__INNER_INVITE__, (n, o) => {
3043
3054
  this._callPlusStatistics.reportStatisticsData(k.L_QS_RECEIVE_CALL_S, a.SUCCESS, +/* @__PURE__ */ new Date(), n, "", o);
3044
3055
  });
3045
3056
  }
@@ -3185,7 +3196,7 @@ class n_ {
3185
3196
  const i = s[_], { userId: n, videoElement: o } = i;
3186
3197
  if (!G(n))
3187
3198
  return this._logger.error(r.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R, `params err, userId: not empty string, value: ${n}`, e), { code: a.PARAM_ERROR };
3188
- if (!Fe(o))
3199
+ if (!Ye(o))
3189
3200
  return this._logger.error(r.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 };
3190
3201
  }
3191
3202
  return this._logger.info(r.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R, "succes", e), this._rtcModule.setVideoView(s, e), { code: a.SUCCESS };
@@ -3219,6 +3230,8 @@ class n_ {
3219
3230
  return this._logger.error(r.L_CALLPLUS_CLIENT_PLAY_MEDIA_R, `params err, userId: not empty string, value: ${s}`, _), { code: a.PARAM_ERROR };
3220
3231
  if (Q(R[e]))
3221
3232
  return this._logger.error(r.L_CALLPLUS_CLIENT_PLAY_MEDIA_R, `params err, mediaType is illegal, value: ${e}`, _), { code: a.PARAM_ERROR };
3233
+ if (e === R.AUDIO && s === this._context.getCurrentId())
3234
+ return this._logger.info(r.L_CALLPLUS_CLIENT_PLAY_MEDIA_R, "success", _), { code: a.SUCCESS };
3222
3235
  const { videoView: i } = this._rtcModule.getUserViewMap()[s] || {};
3223
3236
  return e !== R.AUDIO && !i ? (this._logger.error(r.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, _);
3224
3237
  }
@@ -3228,7 +3241,7 @@ class n_ {
3228
3241
  * 设置完需调 build 方法,最终在 setVideoConfig 后生效
3229
3242
  */
3230
3243
  createVideoConfigBuilder() {
3231
- return new ke(this._logger);
3244
+ return new xe(this._logger);
3232
3245
  }
3233
3246
  /**
3234
3247
  * 设置视频配置
@@ -3255,7 +3268,7 @@ class n_ {
3255
3268
  * 设置完需调 build 方法,最终在 setAudioConfig 后生效
3256
3269
  */
3257
3270
  createAudioConfigBuilder() {
3258
- return new He(this._logger);
3271
+ return new ke(this._logger);
3259
3272
  }
3260
3273
  /**
3261
3274
  * 设置音频配置
@@ -3277,7 +3290,7 @@ class n_ {
3277
3290
  * @returns callId 呼叫成功后,产生的会话 id
3278
3291
  */
3279
3292
  async startCall(s, e = M.SINGLE, _ = R.AUDIO_VIDEO) {
3280
- this._clientCallId = be();
3293
+ this._clientCallId = we();
3281
3294
  const i = +/* @__PURE__ */ new Date(), n = this._logger.createTraceId();
3282
3295
  if (this._logger.info(r.L_CALLPLUS_CLIENT_START_CALL_T, `userIds: ${s.join(",")}, callType: ${e}, mediaType: ${_}`, n), this._context.getConnectionStatus() !== K.CONNECTED)
3283
3296
  return this._logger.error(r.L_CALLPLUS_CLIENT_START_CALL_R, `errCode: ${a.SIGNAL_DISCONNECTED}`, n), { code: a.SIGNAL_DISCONNECTED };
@@ -3305,8 +3318,8 @@ class n_ {
3305
3318
  }, n);
3306
3319
  if (this._callPlusStatistics.reportStatisticsData(k.L_QS_START_CALL_S, L, i, null, this._clientCallId, null, { mediaType: _, callType: e, callId: (c == null ? void 0 : c.callId) || "" }), L !== a.SUCCESS)
3307
3320
  return this._rtcModule.destroyAllTracks(n), this._logger.error(r.L_CALLPLUS_CLIENT_START_CALL_R, `signal error code: ${L}`, n), { code: L };
3308
- const { callId: T, clientCallId: l } = c;
3309
- return this._needHangupCallId === l ? (this._callEngine.clearAllTimer(T, n), this._callEngine.hangup({ callId: T }, n), this._logger.info(r.L_CALLPLUS_CLIENT_START_CALL_R, `the ${T} call has been hangup`, n), { code: a.SUCCESS }) : (e === M.MULTI && await this._rtcModule.sessionConnected(T, n), this._logger.info(r.L_CALLPLUS_CLIENT_START_CALL_R, JSON.stringify({ data: c, code: L }), n), { code: a.SUCCESS, callId: T });
3321
+ const { callId: T, clientCallId: S } = c;
3322
+ return this._needHangupCallId === S ? (this._callEngine.clearAllTimer(T, n), this._callEngine.hangup({ callId: T }, n), this._logger.info(r.L_CALLPLUS_CLIENT_START_CALL_R, `the ${T} call has been hangup`, n), { code: a.SUCCESS }) : (e === M.MULTI && await this._rtcModule.sessionConnected(T, n), this._logger.info(r.L_CALLPLUS_CLIENT_START_CALL_R, JSON.stringify({ data: c, code: L }), n), { code: a.SUCCESS, callId: T });
3310
3323
  }
3311
3324
  /**
3312
3325
  * 直接加入进行中的群组通话
@@ -3380,9 +3393,9 @@ class n_ {
3380
3393
  if (!n && !o)
3381
3394
  return this._logger.error(r.L_CALLPLUS_CLIENT_ACCEPT_R, `errCode : ${a.NOT_IN_CALL}, session not exist`, _), { code: a.NOT_IN_CALL };
3382
3395
  if (s === (o == null ? void 0 : o.getCallId())) {
3383
- const { code: l } = await this.hangup(n.getCallId());
3384
- if (l !== a.SUCCESS)
3385
- return this._logger.error(r.L_CALLPLUS_CLIENT_ACCEPT_R, `hangup mainSession error code: ${l}`, _), { code: l };
3396
+ const { code: S } = await this.hangup(n.getCallId());
3397
+ if (S !== a.SUCCESS)
3398
+ return this._logger.error(r.L_CALLPLUS_CLIENT_ACCEPT_R, `hangup mainSession error code: ${S}`, _), { code: S };
3386
3399
  this._callEngine.upgradeMainSession(s);
3387
3400
  }
3388
3401
  const L = n.getMediaType(), { code: c } = await this._rtcModule.createCallMediaTracks(L, _);
@@ -3396,7 +3409,7 @@ class n_ {
3396
3409
  const { callId: _ } = s;
3397
3410
  this._callEngine.setIsLocalClientHangup(!0), this._callEngine.clearAllTimer(_, e);
3398
3411
  const { code: i } = await this._callEngine.hangup(s, e);
3399
- return i === Ue.CALL_NOT_EXIST ? { code: a.SUCCESS } : (i === a.SUCCESS && _ === ((n = this._callEngine.getLocalMainSession()) == null ? void 0 : n.getCallId()) && await this._rtcModule.sessionClose(_, e), { code: i });
3412
+ return i === me.CALL_NOT_EXIST ? { code: a.SUCCESS } : (i === a.SUCCESS && _ === ((n = this._callEngine.getLocalMainSession()) == null ? void 0 : n.getCallId()) && await this._rtcModule.sessionClose(_, e), { code: i });
3400
3413
  }
3401
3414
  /**
3402
3415
  * 挂断通话
@@ -3409,13 +3422,13 @@ class n_ {
3409
3422
  const i = this._callEngine.getLocalMainSession();
3410
3423
  if (!i)
3411
3424
  return { code: a.NOT_IN_CALL };
3412
- if (s && !ue(s))
3425
+ if (s && !ge(s))
3413
3426
  return this._logger.error(r.L_CALLPLUS_CLIENT_HANGUP_R, `params err, callId: type is string, value: ${s}`, _), { code: a.PARAM_ERROR };
3414
3427
  const n = i.getCallId();
3415
3428
  if (s && s !== n && !this._callEngine.getHoldSession(s))
3416
3429
  return this._logger.error(r.L_CALLPLUS_CLIENT_HANGUP_R, `params err, callId is invalid, value: ${s}`, _), { code: a.CALL_ID_INVALID };
3417
3430
  this._isLaunchHangup = !0, this._needHangupCallId = s || n;
3418
- const E = this._callEngine.getHoldSession(this._needHangupCallId) || i, L = this._context.getCurrentId(), c = i.getUserList().filter((d) => d.userId === L)[0].state, T = [i.getCreatorUserId(), i.getInviterUserId()].includes(L), l = Ke(c, T), { code: I } = await this.__innerHangup({ callId: this._needHangupCallId, systemState: l }, _);
3431
+ const E = this._callEngine.getHoldSession(this._needHangupCallId) || i, L = this._context.getCurrentId(), c = i.getUserList().filter((d) => d.userId === L)[0].state, T = [i.getCreatorUserId(), i.getInviterUserId()].includes(L), S = We(c, T), { code: I } = await this.__innerHangup({ callId: this._needHangupCallId, systemState: S }, _);
3419
3432
  return this._callPlusStatistics.reportStatisticsData(k.L_QS_HANGUP_CALL_S, I, e, E, this._clientCallId), I !== a.SUCCESS ? (this._logger.error(r.L_CALLPLUS_CLIENT_HANGUP_R, `signal error code : ${I}`, _), { code: I }) : (this._needHangupCallId = null, this._logger.info(r.L_CALLPLUS_CLIENT_HANGUP_R, "success", _), { code: a.SUCCESS });
3420
3433
  }
3421
3434
  /**
@@ -3459,7 +3472,7 @@ class n_ {
3459
3472
  const _ = this._logger.createTraceId();
3460
3473
  if (this._logger.info(r.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T, `transactionId: ${s}`, _), !G(s))
3461
3474
  return this._logger.error(r.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R, `param error, transactionId: not empty string, value: ${s}`, _), { code: a.PARAM_ERROR };
3462
- if (!ge(e))
3475
+ if (!Ue(e))
3463
3476
  return this._logger.error(r.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R, `param error, isAgree: type is boolean, value: ${e}`, _), { code: a.PARAM_ERROR };
3464
3477
  if (!this._callEngine.getLocalMainSession())
3465
3478
  return this._logger.error(r.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R, `error code : ${a.NOT_IN_CALL}, session not exist`, _), { code: a.NOT_IN_CALL };
@@ -3619,7 +3632,7 @@ class n_ {
3619
3632
  }
3620
3633
  /**
3621
3634
  * 设置所有远端音频流是否可用
3622
- * @param enable 为 true 时,静音所有远端音频流;为 false 时,启用所有远端音频流
3635
+ * @param enable 为 true 时,启用所有远端音频流;为 false 时,静音所有远端音频流
3623
3636
  */
3624
3637
  async setAllRemoteAudioEnable(s) {
3625
3638
  const e = this._logger.createTraceId();
@@ -3630,7 +3643,7 @@ class n_ {
3630
3643
  * @returns SDK 版本号
3631
3644
  */
3632
3645
  getVersion() {
3633
- return "1.1.0";
3646
+ return "1.1.1";
3634
3647
  }
3635
3648
  /**
3636
3649
  * 获取摄像头列表
@@ -3645,33 +3658,33 @@ class n_ {
3645
3658
  return await Ne.getMicrophones();
3646
3659
  }
3647
3660
  }
3648
- const r_ = (t) => t ? he(t) ? Object.keys(t).includes("rtcClient") ? he(t.rtcClient) ? { 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" }, L_ = {
3661
+ const o_ = (t) => t ? he(t) ? Object.keys(t).includes("rtcClient") ? he(t.rtcClient) ? { 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" }, c_ = {
3649
3662
  tag: "RCCallPlus",
3650
3663
  verify(t) {
3651
- return Ee.add("plugin-call-plus", "1.1.0"), Ee.validEngine("5.8.2") ? !0 : (console.error(`The current engine version '${Ee.getInfo().engine}' error, plugin-call-plus required engine version at least '5.8.2'.`), !1);
3664
+ return Ee.add("plugin-call-plus", "1.1.1"), Ee.validEngine("5.8.2") ? !0 : (console.error(`The current engine version '${Ee.getInfo().engine}' error, plugin-call-plus required engine version at least '5.8.2'.`), !1);
3652
3665
  },
3653
3666
  setup(t, s, e) {
3654
- const _ = r_(e);
3667
+ const _ = o_(e);
3655
3668
  if (!_.isLegal)
3656
3669
  throw new Error(`[CallPlusLib installer steup]${_.msg}`);
3657
- const i = t.createLogger("CallPlusLib", "RTC"), n = Q(e.logOutputLevel) ? we.WARN : e.logOutputLevel;
3658
- return i.setOutputLevel(n), i.warn(r.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O, "CallPlus Version: 1.1.0, Commit: 568b4853a74c41e90cb77a27e29264189c682d32"), new n_(t, i, s, e);
3670
+ const i = t.createLogger("CallPlusLib", "RTC"), n = Q(e.logOutputLevel) ? Be.WARN : e.logOutputLevel;
3671
+ return i.setOutputLevel(n), i.warn(r.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O, "CallPlus Version: 1.1.1, Commit: f2e9aab8b7f19afd4f772d1665c3afc9fb979871"), new r_(t, i, s, e);
3659
3672
  }
3660
3673
  };
3661
3674
  export {
3662
- He as RCAudioConfigBuilder,
3675
+ ke as RCAudioConfigBuilder,
3663
3676
  p as RCCallPlusCallState,
3664
- n_ as RCCallPlusClient,
3677
+ r_ as RCCallPlusClient,
3665
3678
  a as RCCallPlusCode,
3666
3679
  l_ as RCCallPlusFrameRate,
3667
3680
  R as RCCallPlusMediaType,
3668
3681
  F as RCCallPlusMediaTypeChangeResult,
3669
3682
  h as RCCallPlusReason,
3670
- S_ as RCCallPlusResolution,
3683
+ I_ as RCCallPlusResolution,
3671
3684
  ie as RCCallPlusSession,
3672
3685
  C as RCCallPlusSessionUserState,
3673
3686
  M as RCCallPlusType,
3674
- ke as RCVideoConfigBuilder,
3675
- L_ as installer
3687
+ xe as RCVideoConfigBuilder,
3688
+ c_ as installer
3676
3689
  };
3677
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNSZWFzb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9oZWxwZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUEx1c1N0YXRpc3RpY3MudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvU2VjcmV0Q2FsbFR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbi50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy90aW1lcnMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yZXRyeS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2ludGVyZmFjZXMvSUNhbGxIb29rcy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yYW5kb20udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9pbmRleERCLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvbW9kdWxlcy9BYm5vcm1hbENhbGwudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9DYWxsU2VydmVyRXZlbnRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvVGltZUNvcnJlY3Rpb25lci50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0ZvcndhcmRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsRGlyZWN0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvUkNDYWxsRW5naW5lLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUlRDUmVzb3VyY2VUYWcudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JUQ01vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1JlcG9ydE1vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3V0aWxzL3ZhbGlkYXRpb24udHMiLCIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZW51bVxuICovXG5leHBvcnQgY29uc3QgUkNDYWxsUGx1c0NvZGUgPSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1M6IDAsXG4gIC8qKlxuICAgKiDlj4LmlbDplJnor69cbiAgICovXG4gIFBBUkFNX0VSUk9SOiA4MDAwMSxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+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/heS8oOWPguaVsOmqjOivgVxuICBpZiAoIWtleXMuaW5jbHVkZXMoJ3J0Y0NsaWVudCcpKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTlNUQUxMX1JUQ19QTFVHSU4gfTtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KG9wdHMucnRjQ2xpZW50KSkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdydGNDbGllbnRcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdvYmplY3RcXCcnIH07XG4gIH1cblxuICByZXR1cm4geyBpc0xlZ2FsOiB0cnVlIH07XG59O1xuXG4vKipcbiAqIHJlZ2lzdGVyQ2FsbEV2ZW50TGlzdGVuZXIg5Y+C5pWw5qCh6aqMXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxpc3RlbmVyID0gKGxpc3RlbmVyOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyKTogSVZhbGlkYXRlUmVzID0+IHtcbiAgaWYgKCFsaXN0ZW5lcikge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdtaXNzaW5nIHBhcmFtZXRlciAtPiBsaXN0ZW5lcicgfTtcbiAgfVxuXG4gIC8vIOagoemqjOaYr+WQpue8uuWwkeW/heimgeebkeWQrOWbnuiwg+azqOWGjFxuICBjb25zdCByZXF1aXJlZEtleXMgPSBbJ29uSW52aXRlJywgJ29uU2Vzc2lvbkNsb3NlJywgJ29uUmVtb3RlVHJhY2tSZWFkeSddO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGxpc3RlbmVyKTtcbiAgY29uc3QgbWlzc2luZ0tleXM6IHN0cmluZ1tdID0gW107XG4gIHJlcXVpcmVkS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiBgbWlzc2luZyBwYXJhbWV0ZXIgLT4gXCIke21pc3NpbmdLZXlzLmpvaW4oJywnKX1cImAgfTtcbiAgfVxuXG4gIGxldCByZXM6IElWYWxpZGF0ZVJlcyA9IHsgaXNMZWdhbDogdHJ1ZSB9O1xuXG4gIC8vIOagoemqjOW/heimgeebkeWQrOaYr+WQpuaYryBmdW5jdGlvbiDnsbvlnotcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1aXJlZEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSByZXF1aXJlZEtleXNbaV07XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyWzxrZXlvZiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyPmtleV0pKSB7XG4gICAgICByZXMgPSB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6IGAnJHtrZXl9JyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlICdmdW5jdGlvbidgIH07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcbiIsImltcG9ydCB7XG4gIElQbHVnaW5HZW5lcmF0b3IsIElSdW50aW1lLCBpc1VuZGVmaW5lZCwgTG9nTCwgUGx1Z2luQ29udGV4dCwgVmVyc2lvbk1hbmFnZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NsaWVudCB9IGZyb20gJy4vY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvbiB9IGZyb20gJy4vY29yZS9tb2R1bGVzL1JDQ2FsbFBsdXNTZXNzaW9uJztcbmltcG9ydCB7IHZhbGlkYXRlSW5pdE9wdHMgfSBmcm9tICcuL2NvcmUvdXRpbHMvdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBJQ2FsbFBsdXNJbml0T3B0cyB9IGZyb20gJy4vY29yZS9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCBSQ0F1ZGlvQ29uZmlnQnVpbGRlciBmcm9tICcuL2NvcmUvYXBpL1JDQXVkaW9Db25maWdCdWlsZGVyJztcbmltcG9ydCBSQ1ZpZGVvQ29uZmlnQnVpbGRlciBmcm9tICcuL2NvcmUvYXBpL1JDVmlkZW9Db25maWdCdWlsZGVyJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5jb25zdCBpbnN0YWxsZXI6IElQbHVnaW5HZW5lcmF0b3I8UkNDYWxsUGx1c0NsaWVudCwgSUNhbGxQbHVzSW5pdE9wdHM+ID0ge1xuICB0YWc6ICdSQ0NhbGxQbHVzJyxcbiAgdmVyaWZ5KHJ1bnRpbWU6IElSdW50aW1lKSB7XG4gICAgVmVyc2lvbk1hbmFnZS5hZGQoJ3BsdWdpbi1jYWxsLXBsdXMnLCBfX1ZFUlNJT05fXyk7XG4gICAgaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBjdXJyZW50IGVuZ2luZSB2ZXJzaW9uICcke1ZlcnNpb25NYW5hZ2UuZ2V0SW5mbygpLmVuZ2luZX0nIGVycm9yLCBwbHVnaW4tY2FsbC1wbHVzIHJlcXVpcmVkIGVuZ2luZSB2ZXJzaW9uIGF0IGxlYXN0ICcke19fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fX30nLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzZXR1cChjb250ZXh0OiBQbHVnaW5Db250ZXh0LCBydW50aW1lOiBJUnVudGltZSwgb3B0aW9uczogSUNhbGxQbHVzSW5pdE9wdHMpOiBSQ0NhbGxQbHVzQ2xpZW50IHtcbiAgICAvLyDliJ3lp4vljJblj4LmlbDmoKHpqoxcbiAgICBjb25zdCB2YWxpZGF0ZVJlcyA9IHZhbGlkYXRlSW5pdE9wdHMob3B0aW9ucyk7XG4gICAgaWYgKCF2YWxpZGF0ZVJlcy5pc0xlZ2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtDYWxsUGx1c0xpYiBpbnN0YWxsZXIgc3RldXBdJHt2YWxpZGF0ZVJlcy5tc2d9YCk7XG4gICAgfVxuXG4gICAgLy8g5Yib5bu6IGVuZ2luZSBsb2dnZXJcbiAgICBjb25zdCBlbmdpbmVMb2dnZXIgPSBjb250ZXh0LmNyZWF0ZUxvZ2dlcignQ2FsbFBsdXNMaWInLCAnUlRDJyk7XG4gICAgLy8g6K6+572uIOi+k+WHuue6p+WIq1xuICAgIGNvbnN0IG91dHB1dExldmVsID0gaXNVbmRlZmluZWQob3B0aW9ucy5sb2dPdXRwdXRMZXZlbCkgPyBMb2dMLldBUk4gOiBvcHRpb25zLmxvZ091dHB1dExldmVsO1xuICAgIGVuZ2luZUxvZ2dlci5zZXRPdXRwdXRMZXZlbChvdXRwdXRMZXZlbCEpO1xuICAgIGVuZ2luZUxvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTkRFWF9JTlNUQUxMX0NBTExfUExVU19QTFVHSU5fTywgYENhbGxQbHVzIFZlcnNpb246ICR7X19WRVJTSU9OX199LCBDb21taXQ6ICR7X19DT01NSVRfSURfX31gKTtcblxuICAgIHJldHVybiBuZXcgUkNDYWxsUGx1c0NsaWVudChjb250ZXh0LCBlbmdpbmVMb2dnZXIsIHJ1bnRpbWUsIG9wdGlvbnMpO1xuICB9LFxufTtcblxuZXhwb3J0IHtcbiAgaW5zdGFsbGVyLFxuICAvKiBjbGFzcyAqL1xuICBSQ0NhbGxQbHVzQ2xpZW50LFxuICBSQ0NhbGxQbHVzU2Vzc2lvbixcbiAgUkNBdWRpb0NvbmZpZ0J1aWxkZXIsXG4gIFJDVmlkZW9Db25maWdCdWlsZGVyLFxufTtcbi8qKlxuICog5a+85Ye65p6a5Li+5ZKM5o6l5Y+j5a6a5LmJXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vY29yZS9hcGkvaW50ZXJmYWNlJztcbiJdLCJuYW1lcyI6WyJSQ0NhbGxQbHVzQ29kZSIsIlJDQ2FsbFBsdXNMb2dnZXJUYWciLCJSQ0NhbGxQbHVzU2Vzc2lvbiIsIl9zZXNzaW9uIiwiX2NhbGxFbmdpbmUiLCJfbG9nZ2VyIiwiX19wdWJsaWNGaWVsZCIsInVzZXIiLCJ1c2VySWQiLCJ1c2VyU3RhdGUiLCJjYW1lcmFFbmFibGUiLCJtaWNyb3Bob25lRW5hYmxlIiwidHJhY2VJZCIsImNvZGUiLCJjbGllbnRTdGFydFRpbWUiLCJkYXRhIiwiUkNDYWxsUGx1c1R5cGUiLCJSQ0NhbGxQbHVzVHlwZTIiLCJSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSIsIlJDQ2FsbFBsdXNNZWRpYVR5cGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlMiIsIlJDQ2FsbFBsdXNDYWxsU3RhdGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IiwiUkNDYWxsUGx1c1JlYXNvbiIsIlJDQXVkaW9Db25maWdCdWlsZGVyIiwibWljcm9waG9uZUlkIiwibWluIiwibWF4IiwiaXNOdW1iZXIiLCJzYW1wbGVSYXRlIiwiUkNWaWRlb0NvbmZpZ0J1aWxkZXIiLCJSQ0NhbGxQbHVzUmVzb2x1dGlvbiIsIlJDQ2FsbFBsdXNGcmFtZVJhdGUiLCJmcHMiLCJyZXNvbHV0aW9uIiwiY2FtZXJhSWQiLCJ0cmFuMkNhbGxMb2ciLCJjYWxsTG9nTGlzdCIsImNhbGxJZCIsImNhbGxUeXBlIiwiY2FsbERpciIsIm1lZGlhVHlwZSIsImNhbGxpbmdVc2VySWQiLCJjYWxsVXNlcklkcyIsImNhbGxTdGF0dXMiLCJzZXNzaW9uU3RhdHVzIiwic3RhcnRUaW1lIiwiZW5kVGltZSIsImR1cmF0aW9uIiwic2VjcmV0Q2hhdCIsInN5bmNUaW1lIiwic3lzU3RhdHVzIiwiY3J0VGltZSIsInBhcnNlU3RhdHVzRGF0YSIsInJpbmdpbmdEYXRhIiwiaGFuZ3VwRGF0YSIsImFjY2VwdERhdGEiLCJvdGhlckludml0ZWREYXRhIiwiaXRlbSIsInZhbGlkYXRlVmlkZW9Ob2RlTmFtZSIsImVsZW1lbnQiLCJ2YWxpZGF0ZVN5c1N0YXRlIiwiY3J0U3RhdGUiLCJuZXdTdGF0ZSIsImlzSW5WYWxpZCIsImludmFsaWRTdGF0ZXMiLCJ2YWxpZGF0ZVVzZXJTdGF0ZSIsImdldEhhbmd1cFN5c3RlbVN0YXRlIiwiaXNDYWxsZWUiLCJzeXN0ZW1TdGF0ZSIsImlzU3VwcG9ydE1lZGlhU2VydmVyIiwibmF2aUluZm8iLCJ2b2lwQ2FsbEluZm8iLCJzdHJhdGVneSIsInZhbGlkYXRlQml0cmF0ZSIsIm1pbkJpdHJhdGUiLCJtYXhCaXRyYXRlIiwiUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWciLCJSQ0NhbGxQTHVzU3RhdGlzdGljcyIsIl9jb250ZXh0IiwidGFnIiwic2Vzc2lvbiIsImNsaWVudENhbGxJZCIsImludml0ZVNvdXJjZSIsImV4dHJhIiwibm93VGltZSIsImNvbW1vbkRhdGEiLCJEaWFsb2dBY3Rpb24iLCJEaWFsb2dUeXBlIiwiU2VjcmV0Q2FsbFR5cGUiLCJTZWNyZXRDYWxsVHlwZTIiLCJDYWxsVGltZXJFdmVudFR5cGUiLCJSQ0NhbGxJbm5lclNlc3Npb24iLCJFdmVudEVtaXR0ZXIiLCJfY2FsbElkIiwiX3N0YXRlIiwiX2NhbGxUeXBlIiwiX21lZGlhVHlwZSIsIl9zdGFydENhbGxlcklkIiwiX2NhbGxlcklkIiwiX2NhbGxVc2VycyIsImVuYWJsZSIsInVzZXJzIiwiY2hhbmdlZFVzZXJzIiwibmV3VXNlclN0YXRlIiwibmV3U3RhdGVUaW1lIiwibmV3U3lzU3RhdGUiLCJoYXNVc2VyIiwiaSIsIm9sZFN0YXRlVGltZSIsIm9sZFN5c3RlbVN0YXRlIiwib2xkVXNlclN0YXRlIiwiaXNJbnZhbGlkU3lzU3RhdGUiLCJpc0ludmFsaWRVc2VyU3RhdGUiLCJpc0ludmFsaWRPbnBob25lRW5kIiwiZXJyIiwic3RhdGUiLCJ0eXBlIiwidGltZXJJZCIsImlzTG9jYWxDbGllbnRIYW5ndXAiLCJDYWxsU2VydmVyQWN0aW9uIiwidGltZXJTZXRUaW1lb3V0IiwiZnVuYyIsInRpbWVvdXQiLCJzbGVlcCIsIm1pbGxpc2Vjb25kIiwicmVzb2x2ZSIsIm5lZWRSZXRyeUNvZGUiLCJFcnJvckNvZGUiLCJSQ1JUQ0NvZGUiLCJyZXRyeUFzeW5jRm4iLCJhc3luY0ZuIiwiZm5BcmdzIiwiY3VycmVudFJldHJ5VGltZSIsIm1heER1cmF0aW9uIiwiaW50ZXJ2YWxzIiwiaW5kZXgiLCJvbkVycm9yIiwicmVzIiwiaXR2IiwiQ2FsbEhvb2tzVHlwZSIsIlB1Ykludml0ZUNhbGxNaXNzUmVhc29uIiwiUHViSW52aXRlQ2FsbE1pc3NSZWZlciIsIlNpZ25hbFRyYW5zcG9ydGVyIiwiX3J1bnRpbWUiLCJfaW5pdE9wdHMiLCJfdGltZUNvcnJlY3Rpb25lciIsImdldFVVSUQyMiIsImxpc3RlbmVyIiwibXNnIiwidG9Vc2VycyIsInRhcmdldFR5cGUiLCJ0YXJnZXRJZCIsIm5pY2tOYW1lIiwib2xkUm9vbUlkIiwiY2FsbElkcyIsIm9wdHMiLCJSQ0Nvbm5lY3Rpb25TdGF0dXMiLCJrZXkiLCJvcHRpb25zIiwidmFsdWUiLCJyZXN1bHQiLCJzZXJ2ZXJLZXkiLCJzZXJ2ZXJWYWwiLCJwYXJzZWREYXRhIiwiaW5mbyIsImRldmljZUlkIiwiaXNOdWxsIiwiaXNTdHJpbmciLCJpc0RpcmVjdGx5IiwiY3VycmVudFVJZCIsImN1cnJlbnRVc2VyIiwiZGlhbG9nVHlwZSIsImFjdGlvbiIsImV4dHJhS2V5VmFsIiwiY2FsbFNlc3Npb25Vc2VycyIsInRvRGV2aWNlSWQiLCJjYWxsRGlhbG9nRW50aXR5cyIsInN0cmluZzEwdG82NCIsIm51bWJlciIsImNoYXJzIiwicmFkaXgiLCJxdXRpZW50IiwiYXJyIiwibW9kIiwiZ2V0VVVJRCIsImMiLCJyIiwidXVpZCIsIkNBTExfREJfTkFNRSIsIkRCX1ZFUlNJT04iLCJsb2dnZXIiLCJfUkNDYWxsSW5kZXhEQiIsInJlcSIsImV2Iiwib2JqTmFtZSIsIl9hIiwidmFsIiwicmVqZWN0IiwiUkNDYWxsSW5kZXhEQiIsIkFibm9ybWFsQ2FsbCIsIm9ialN0b3JlIiwidXNlckFibm9ybWFsQ2FsbElkcyIsImlkIiwiQ2FsbFNlcnZlckV2ZW50VHlwZSIsIlJDQ2FsbFBsdXNJbm5lckNvZGUiLCJUaW1lQ29ycmVjdGlvbmVyIiwiX3NpbmdsZUNhbGxEdXJhdGlvbkV2Iiwic2VydmVyU3RhcnRUaW1lIiwiY3VycmVudFJUVCIsImNsaWVudEZpcnN0RnJhbWVUaW1lIiwiRm9yd2FyZFR5cGUiLCJSQ0NhbGxQbHVzSW52aXRlU291cmNlIiwiUkNDYWxsRGlyZWN0aW9uIiwiQ0FMTF9USU1FX09VVCIsIl9SQ0NhbGxFbmdpbmUiLCJfcmVwb3J0QXBwRXZlbnRNb2R1bGUiLCJjdXJyZW50VXNlcklkIiwiYnVzeWxpbmVVc2VycyIsImludml0ZXJUaW1lcklkIiwic2VsZlN0YXRlIiwiaW52aXRlZXNTdGF0ZSIsImJ1c3lVc2Vyc1N0YXRlIiwiYnVzeVVzZXJJZCIsImludml0ZWRVc2Vyc1N0YXRlIiwiYnVzeWxpbmVVc2Vyc1N0YXRlIiwidHJhbnNhY3Rpb25JZCIsInJlcU1lZGlhVHlwZSIsImNhbGxMb2ciLCJyZXNEYXRhIiwibGlzdCIsInVzZXJTZXNzaW9uU3RhdHVzIiwiY2FsbERpcmVjdGlvbiIsInNlc3Npb25Vc2VycyIsImlubmVyU2Vzc2lvbiIsIm5ld1VzZXJzIiwiaXNJZGxlIiwibm93IiwiZGVsYXlUaW1lIiwic3RyZWFtUmVhZHlUaW1lIiwiY3VycmVudFVzZXJTeXN0ZW1TdGF0ZSIsImhvbGRDYWxsSWQiLCJzdGF0ZVRpbWUiLCJpbnZpdGVVc2VySWQiLCJpbnZpdGVlVGltZXJJZCIsImNhbGxQbHVzU2Vzc2lvbiIsIm90aGVyc1N0YXRlIiwic3RhdHVzVGltZSIsIm90aGVySW52aXRlZE1lbWJlciIsIl9iIiwiX2MiLCJpbnZpdGVkTWVtYmVyIiwidXNlcnNTdGF0ZSIsImNhbGxTZXNzaW9uYVN0YXR1cyIsInNlc3Npb25TdGF0ZSIsInVuTmVlZFVwU3RhdGUiLCJzdGFydENhbGxlcklkIiwiX2QiLCJzZWxmRW5kIiwic3RhdGVzIiwiaXNNYWluU2Vzc2lvbiIsImN1cnJlbnRVc2VyU2F0ZSIsImV2ZW50VGltZSIsImV2ZW50QXJncyIsImV2ZW50VHlwZSIsImZyb21Vc2VySWQiLCJmaXJzdEZyYW1lVGltZSIsInByb21vdGVySWQiLCJyZWFzb24iLCJjdXJyZW50Q2FsbElkIiwib2xkVHJhbnNJZCIsIm9sZEFjdGlvbiIsIk9sZE1lZGlhVHlwZSIsImNoYW5nZU1lZGlhVHlwZVJlc3VsdCIsIl9lIiwiaXNTZWxmSGFuZ3VwIiwiY2xvc2VkU2Vzc2lvbiIsImNydFVzZXJEYXRhIiwiaGFuZ3VwUmVhc29uIiwiaXNOZWVkVXAiLCJpbnZpdGVyVXNlcklkIiwiUkNDYWxsRW5naW5lIiwiUlRDUmVzb3VyY2VUYWciLCJfUlRDTW9kdWxlIiwiZGVmYXVsdFZpZGVvVHJhY2siLCJ0cmFjayIsImRlZmF1bHRBdWRpb1RyYWNrIiwidmlkZW9Db25maWciLCJhdWRpb0NvbmZpZyIsImlzQm9vbGVhbiIsImxvY2FsVHJhY2siLCJyb29tIiwicm9vbVVzZXJzSWQiLCJlcnJvciIsInB1YlBhcmFtcyIsImN1cnJlbnRSb29tSWQiLCJyZWNlbnRUcmFja3MiLCJsb2NhbFRyYWNrcyIsIm5lZWREZXN0cm95VHJhY2siLCJuZXdUcmFjayIsInRyYWNrcyIsIlJUQ01vZGUiLCJzdWJUaW55IiwiYnlTZXJ2ZXIiLCJ1c2VySWRzIiwidmlkZW9UcmFjayIsImF1ZGlvVHJhY2siLCJhdWRpb0xldmVsUmVwb3J0TGlzdCIsInJvb21JZCIsImtpY2tFeHRyYSIsIlJDS2lja1JlYXNvbiIsIm5lZWRTdWJUcmFja3MiLCJpc1RpbnkiLCJyZXBvcnQiLCJzZW5kZXJzIiwicmVjZWl2ZXJzIiwia2luZCIsInBhY2tldHNMb3N0UmF0ZSIsInJ0dCIsInRyYWNrSWQiLCJiaXRyYXRlIiwiaGVscGVyIiwibG9jYWxWaWRlb1RyYWNrIiwibG9jYWxBdWRpb1RyYWNrIiwiUkNMb2NhbFRyYWNrIiwidmlkZW9FbGVtZW50Iiwic3ViUGFyYW1zIiwidW5zdWJUcmFja3MiLCJ2aWRlb1ZpZXciLCJSVENNb2R1bGUiLCJSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIiwiZXZlbnROYW1lIiwiYXR0cnMiLCJoYW5kbGUiLCJpbnZpdGVlVXNlckxpc3QiLCJyZWNvcmQiLCJjYWxsRmlyc3RGcmFtZVRpbWUiLCJhdWRpb0xldmVsIiwiQ2FsbFNlcnZlckVycm9yQ29kZSIsIlJDQ2FsbFBsdXNDbGllbnQiLCJuZXdTZXNzaW9uIiwibWFpblNlc3Npb24iLCJub3RFbXB0eUFycmF5Iiwibm90RW1wdHlTdHJpbmciLCJpc1VuZGVmaW5lZCIsImNmZyIsImZyYW1lUmF0ZSIsImVycm9yTXNnIiwiZ2V0TWVkaWFUcmFja3NDb2RlIiwiZ2V0U2Vzc2lvbkNvZGUiLCJidXN5VXNlcnMiLCJob2xkU2Vzc2lvbiIsImhhbmd1cE1haW5TZXNzaW9uQ29kZSIsIm1haW5TZXNzaW9uQ2FsbElkIiwiaGFuZ3VwU2Vzc2lvbiIsInVzZXJJbmZvIiwib2xkTWVkaWFUeXBlIiwidG9Vc2VySWRzIiwiaXNBZ3JlZSIsInN0YXJ0VGltZXN0YW1wIiwiY291bnQiLCJ1bm11dGVDb2RlIiwiZGV2aWNlIiwidmFsaWRhdGVJbml0T3B0cyIsImlzT2JqZWN0IiwiaW5zdGFsbGVyIiwicnVudGltZSIsIlZlcnNpb25NYW5hZ2UiLCJjb250ZXh0IiwidmFsaWRhdGVSZXMiLCJlbmdpbmVMb2dnZXIiLCJvdXRwdXRMZXZlbCIsIkxvZ0wiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdPLE1BQU1BLElBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJNUIsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVQsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkIsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJaEIseUJBQXlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJekIsbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkIsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsd0JBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJeEIsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsc0NBQXNDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJdEMscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkIseUJBQXlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJekIsd0JBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJeEIsbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkIsb0JBQW9CO0FBQ3RCO0FDaEZZLElBQUFDLHNCQUFBQSxPQUNWQSxFQUFBLHFDQUFxQyxzQ0FJckNBLEVBQUEseUNBQXlDLDBDQUl6Q0EsRUFBQSwwQ0FB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
3690
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNSZWFzb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9oZWxwZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUEx1c1N0YXRpc3RpY3MudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvU2VjcmV0Q2FsbFR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbi50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy90aW1lcnMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yZXRyeS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2ludGVyZmFjZXMvSUNhbGxIb29rcy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yYW5kb20udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9pbmRleERCLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvbW9kdWxlcy9BYm5vcm1hbENhbGwudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9DYWxsU2VydmVyRXZlbnRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvVGltZUNvcnJlY3Rpb25lci50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0ZvcndhcmRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsRGlyZWN0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvUkNDYWxsRW5naW5lLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUlRDUmVzb3VyY2VUYWcudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JUQ01vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1JlcG9ydE1vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3V0aWxzL3ZhbGlkYXRpb24udHMiLCIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZW51bVxuICovXG5leHBvcnQgY29uc3QgUkNDYWxsUGx1c0NvZGUgPSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1M6IDAsXG4gIC8qKlxuICAgKiDlj4LmlbDplJnor69cbiAgICovXG4gIFBBUkFNX0VSUk9SOiA4MDAwMSxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+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+IDAsIHZhbHVlOiAke21heEJpdHJhdGV9YCB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaW5CaXRyYXRlICYmIG1heEJpdHJhdGUgJiYgbWF4Qml0cmF0ZSA8IG1pbkJpdHJhdGUpIHtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWF4Qml0cmF0ZTogJHttYXhCaXRyYXRlfSwgbWluQml0cmF0ZTogJHttaW5CaXRyYXRlfSwgbWF4Qml0cmF0ZSBzaG91bGQgPiBtaW5CaXRyYXRlYCB9O1xuICB9XG5cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJWaWRlb1ZpZXdJbmZvID0gKHVzZXJWaWV3TWFwOiB7IFt1c2VySWQ6IHN0cmluZ106IHsgdmlkZW9WaWV3OiBIVE1MVmlkZW9FbGVtZW50LCBpc1Rpbnk6IGJvb2xlYW4gfSB9KSA9PiB7XG4gIGNvbnN0IHVzZXJWaWV3TWFwSW5mbyA9IFtdO1xuICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB1c2VyVmlld01hcCkge1xuICAgIGNvbnN0IHsgdmlkZW9WaWV3LCBpc1RpbnkgfSA9IHVzZXJWaWV3TWFwW3VzZXJJZF07XG4gICAgdXNlclZpZXdNYXBJbmZvLnB1c2goe1xuICAgICAgdXNlcklkLFxuICAgICAgdmlkZW9WaWV3OiB2aWRlb1ZpZXcubm9kZU5hbWUsXG4gICAgICBpc1RpbnksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHVzZXJWaWV3TWFwSW5mbztcbn07XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyB7XG4gIC8qKlxuICAgKiDlj5HotbfpgJror51cbiAgICovXG4gIExfUVNfU1RBUlRfQ0FMTF9TID0gJ0NhbGwtc3RhcnQtUycsXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror51cbiAgICovXG4gIExfUVNfQUNDRVBUX0NBTExfUyA9ICdDYWxsLWFjY2VwdC1TJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgTF9RU19IQU5HVVBfQ0FMTF9TID0gJ0NhbGwtaGFuZ3VwLVMnLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+dXG4gICAqL1xuICBMX1FTX1JFQ0VJVkVfQ0FMTF9TID0gJ0NhbGwtcmVjdi1TJyxcbiAgLyoqXG4gICAqIOW8guW4uOaMguaWrVxuICAgKi9cbiAgTF9RU19BQk5PUk1BTF9IQU5HVVBfUyA9ICdDYWxsLWludGVycnVwdC1TJ1xufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIsIFBsdWdpbkNvbnRleHQgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzSW52aXRlU291cmNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzJztcbmltcG9ydCB7XG4gIFJDQ2FsbFBsdXNNZWRpYVR5cGUsIFJDQ2FsbFBsdXNTZXNzaW9uLCBSQ0NhbGxQbHVzVHlwZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNDYWxsUEx1c1N0YXRpc3RpY3Mge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICkge1xuICB9XG5cbiAgcHVibGljIHJlcG9ydFN0YXRpc3RpY3NEYXRhKFxuICAgIHRhZzogUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcsXG4gICAgY29kZTogbnVtYmVyLFxuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIHNlc3Npb246IFJDQ2FsbFBsdXNTZXNzaW9uIHwgbnVsbCxcbiAgICBjbGllbnRDYWxsSWQ/OiBzdHJpbmcsXG4gICAgaW52aXRlU291cmNlPzogUkNDYWxsUGx1c0ludml0ZVNvdXJjZSB8IG51bGwsXG4gICAgZXh0cmE/OiB7XG4gICAgICBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gICAgICBjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUsXG4gICAgICBjYWxsSWQ6IHN0cmluZyxcbiAgICB9LFxuICApIHtcbiAgICBjb25zdCBub3dUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgY29uc3QgeyBtZWRpYVR5cGUsIGNhbGxUeXBlLCBjYWxsSWQgfSA9IHNlc3Npb24gPyB7IG1lZGlhVHlwZTogc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKSwgY2FsbFR5cGU6IHNlc3Npb24uZ2V0Q2FsbFR5cGUoKSwgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpIH0gOiBleHRyYSE7XG4gICAgY29uc3QgY29tbW9uRGF0YSA9IHtcbiAgICAgIGNyOiAndW5rbm93bicsXG4gICAgICBuZXQ6ICd1bmtub3duJyxcbiAgICAgIGNvZDogY29kZSxcbiAgICAgIG10cDogbWVkaWFUeXBlLFxuICAgICAgY3RwOiBjYWxsVHlwZSxcbiAgICAgIGNpZDogY2FsbElkLFxuICAgICAgdGltZTogbm93VGltZSxcbiAgICAgIHVpZDogdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSxcbiAgICB9O1xuXG4gICAgY2xpZW50Q2FsbElkICYmIE9iamVjdC5hc3NpZ24oY29tbW9uRGF0YSwgeyBjY2lkOiBjbGllbnRDYWxsSWQgfSk7XG5cbiAgICBsZXQgZGF0YSA9IG51bGw7XG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgLyoqXG4gICAgICAgKiDmlLbliLDlkbzlj6tcbiAgICAgICAqL1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX1JFQ0VJVkVfQ0FMTF9TOlxuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIC4uLmNvbW1vbkRhdGEsXG4gICAgICAgICAgcmY6IGludml0ZVNvdXJjZSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvKipcbiAgICAgICAqIOW8guW4uOaMguaWrVxuICAgICAgICovXG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfQUJOT1JNQUxfSEFOR1VQX1M6XG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvKipcbiAgICAgICAgICog5Y+R6LW344CB5o6l5ZCs44CB5oyC5pat6YCa6K+dXG4gICAgICAgICAqL1xuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIC4uLmNvbW1vbkRhdGEsXG4gICAgICAgICAgZHVyOiBub3dUaW1lIC0gc3RhcnRUaW1lLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdMLWNhbGwtcGx1cy1zdGF0aXN0aWMnLCBKU09OLnN0cmluZ2lmeShkYXRhKSwgdGFnKTtcblxuICAgIHRoaXMuX2xvZ2dlci5fX3N0YXRpc3RpY3ModGFnLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gIH1cbn1cbiIsIi8qKlxuICog5a+56K+d5Yqo5L2cXG4gKi9cbmV4cG9ydCBlbnVtIERpYWxvZ0FjdGlvbiB7XG4gIC8qKlxuICAgKiDor7fmsYJcbiAgICovXG4gIFJFUVVFU1QgPSAncmVxdWVzdCcsXG4gIC8qKlxuICAgKiDmjqXlj5dcbiAgICovXG4gIEFDQ0VQVCA9ICdhY2NlcHQnLFxuICAvKipcbiAgICog5ouS57udXG4gICAqL1xuICBSRUZVU0UgPSAncmVmdXNlJyxcbiAgLyoqXG4gICAqIOivt+axguWPlua2iFxuICAgKi9cbiAgQ0FOQ0VMID0gJ2NhbmNlbCcsXG4gIC8qKlxuICAgKiDpgJrnn6VcbiAgICovXG4gIE5PVElDRSA9ICdub3RpY2UnLFxuICAvKipcbiAgICog6LaF5pe2XG4gICAqL1xuICBUSU1FT1VUID0gJ3RpbWVvdXQnXG59XG4iLCIvKipcbiAqIOWvueivneexu+Wei1xuICovXG5leHBvcnQgZW51bSBEaWFsb2dUeXBlIHtcbiAgU1dJVENIX01FRElBX1RZUEUgPSAxXG59XG4iLCIvKipcbiAqIOmAmuivnemineWkluexu+Wei++8iOenu+WKqOerr+eJueacie+8iVxuICovXG5leHBvcnQgZW51bSBTZWNyZXRDYWxsVHlwZSB7XG4gIC8qKlxuICAgKiDmma7pgJrpgJror51cbiAgICovXG4gIE5PUk1BTCxcbiAgLyoqXG4gICAqIOWvhuiBilxuICAgKi9cbiAgU0VDUkVUXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgRGlhbG9nQWN0aW9uIH0gZnJvbSAnLi4vZW51bXMvRGlhbG9nQWN0aW9uJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDYWxsU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1R5cGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQgeyBJU2Vzc2lvblVzZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSQ0NhbGxDbGllbnQnO1xuaW1wb3J0IHsgdmFsaWRhdGVTeXNTdGF0ZSwgdmFsaWRhdGVVc2VyU3RhdGUgfSBmcm9tICcuLi91dGlscy9oZWxwZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c1JlYXNvbic7XG5cbmV4cG9ydCBlbnVtIENhbGxUaW1lckV2ZW50VHlwZSB7XG4gIElOVklURVIgPSAnaW52aXRlcicsXG4gIElOVklURUUgPSAnaW52aXRlZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJT2xkRGlhbG9nRGF0YXtcbiAgdHJhbnNhY3Rpb25JZD86IHN0cmluZztcbiAgYWN0aW9uOiBEaWFsb2dBY3Rpb247XG4gIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZTtcbn1cblxuLyoqXG4gKiBTREsg5YaF6YOo5L2/55SoIFNlc3Npb24g5a6e5L6LXG4gKi9cbmV4cG9ydCBjbGFzcyBSQ0NhbGxJbm5lclNlc3Npb24gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICog6K+35rGC5pu05paw55qEIG1lZGlhVHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVxTWVkaWFUeXBlITogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGxcblxuICAvKipcbiAgICog6YKA6K+36ICF6LaF5pe26K6h5pe25ZmoXG4gICAqL1xuICBwcml2YXRlIF9pbnZpdGVyVGltZXJJZCE6IG51bWJlclxuXG4gIC8qKlxuICAgKiDooqvpgoDor7fogIXotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX2ludml0ZWVUaW1lcklkITogbnVtYmVyXG5cbiAgLyoqXG4gICAqIOW9k+WJjSBzZXNzaW9uIOS6uuWRmOS/oeaBr+WIl+ihqFxuICAgKi9cbiAgLy8gcHJpdmF0ZSBfY2FsbFVzZXJzOiBJU2Vzc2lvblVzZXJbXSA9IFtdXG5cbiAgLyoqXG4gICAqIOaXpyBkaWFsb2cg5pWw5o2u77yM55So5LqO5a+55q+UXG4gICAqL1xuICBwcml2YXRlIF9vbGREaWFsb2dEYXRhITogSU9sZERpYWxvZ0RhdGFcblxuICAvKipcbiAgICog6K6w5b2V5piv5ZCm5pys5Zyw5pyJ5oyC5patXG4gICAqL1xuICBwcml2YXRlIGlzTG9jYWxDbGllbnRIYW5ndXA6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDmnoTpgKDlmahcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIENhbGwgSURcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsSWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBzZXNzaW9uIOeKtuaAgVxuICAgICAqL1xuICAgIHByaXZhdGUgX3N0YXRlOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLFxuICAgIC8qKlxuICAgICAqIOmAmuivneexu+Wei1xuICAgICAqL1xuICAgIHByaXZhdGUgX2NhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSxcbiAgICAvKipcbiAgICAgKiDpgJror53lqpLkvZPnsbvlnotcbiAgICAgKi9cbiAgICBwcml2YXRlIF9tZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gICAgLyoqXG4gICAgICogc2Vzc2lvbiDlkbzlj6vlj5HotbfogIVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zdGFydENhbGxlcklkOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICog5pys5qyhIHNlc3Npb24g55qE6YKA6K+36ICFXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2FsbGVySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDlvZPliY0gc2Vzc2lvbiDkurrlkZjkv6Hmga/liJfooahcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWxsVXNlcnM6IElTZXNzaW9uVXNlcltdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIENhbGxJRFxuICAgKi9cbiAgcHVibGljIGdldENhbGxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsSWQ7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0U2Vzc2lvblN0YXRlKCk6IFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53nsbvlnotcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsVHlwZSgpOiBSQ0NhbGxQbHVzVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWqkuS9k+exu+Wei1xuICAgKi9cbiAgcHVibGljIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIOWPkei1t+iAhVxuICAgKi9cbiAgcHVibGljIGdldFN0YXJ0Q2FsbGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRDYWxsZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnKzmrKEgc2Vzc2lvbiDpgoDor7fogIVcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5Ygc2Vzc2lvbiB1c2VyIGxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyTGlzdCgpOiBJU2Vzc2lvblVzZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxVc2VycztcbiAgfVxuXG4gIC8qKlxuICAgKiDor7fmsYLmm7TmlrDnmoQgbWVkaWFUeXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVxTWVkaWFUeXBlKCk6IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxTWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIGludml0ZXJUaW1lcklkXG4gICAqL1xuICBwdWJsaWMgZ2V0SW52aXRlclRpbWVySWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faW52aXRlclRpbWVySWQ7XG4gIH1cblxuICAvKipcbiAgICogaW52aXRlZVRpbWVySWRcbiAgICovXG4gIHB1YmxpYyBnZXRJbnZpdGVlVGltZXJJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVlVGltZXJJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxUaW1lcklkcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFt0aGlzLl9pbnZpdGVyVGltZXJJZCwgdGhpcy5faW52aXRlZVRpbWVySWRdO1xuICB9XG5cbiAgcHVibGljIHNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgZW5hYmxlOiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9TRVRfVVNFUl9ERVZJQ0VfRU5BQkxFX08sIGB1c2VySWQ6ICR7dXNlcklkfSwgbWVkaWFUeXBlOiAke21lZGlhVHlwZX0sIGVuYWJsZTogJHtlbmFibGV9YCwgdHJhY2VJZCk7XG4gICAgY29uc3QgdXNlclN0YXRlID0gdGhpcy5fY2FsbFVzZXJzLmZpbmQoKGl0ZW0pID0+IHVzZXJJZCA9PT0gaXRlbS51c2VySWQpO1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIHVzZXJTdGF0ZSEubWljcm9waG9uZUVuYWJsZSA9IGVuYWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXNlclN0YXRlIS5jYW1lcmFFbmFibGUgPSBlbmFibGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOS6uuWRmOWIl+ihqCwg5bm26L+U5Zue5pu05paw55qE5Lq65ZGY5YiX6KGoXG4gICAqIOagueaNruS6uuWRmOeKtuaAgeWOu+a3u+WKoOOAgeWIoOmZpOOAgeabtOaWsFxuICAgKiDmoLnmja7nirbmgIHml7bpl7TvvIzliKTmlq3mmK/lkKbmm7TmlrDvvIzml6Dml7bpl7TmiLPnmoTkuLrmnKzlnLDnirbmgIHosIPmlbTvvIznm7TmjqXmm7TmlrBcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVVc2VyTGlzdCh1c2VyczogSVNlc3Npb25Vc2VyW10sIHRyYWNlSWQ6IHN0cmluZyk6IElTZXNzaW9uVXNlcltdIHtcbiAgICBjb25zdCBjaGFuZ2VkVXNlcnM6IElTZXNzaW9uVXNlcltdID0gW107XG4gICAgdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB1c2VyU3RhdGU6IG5ld1VzZXJTdGF0ZSxcbiAgICAgICAgc3RhdGVUaW1lOiBuZXdTdGF0ZVRpbWUsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBuZXdTeXNTdGF0ZSxcbiAgICAgIH0gPSB1c2VyO1xuICAgICAgY29uc3QgbmVlZEFkZFN0YXRlcyA9IFtSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQUxMSU5HLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVELCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5CVVNZTElORV9XQUlUXTtcbiAgICAgIGlmIChuZWVkQWRkU3RhdGVzLmluY2x1ZGVzKG5ld1VzZXJTdGF0ZSkpIHtcbiAgICAgICAgLy8g55u05o6l5re75Yqg5pWw5o2uXG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGBwdXNoIHVzZXI6ICR7SlNPTi5zdHJpbmdpZnkodXNlcil9YCwgdHJhY2VJZCk7XG4gICAgICAgIHRoaXMuX2NhbGxVc2Vycy5wdXNoKHVzZXIpO1xuICAgICAgICBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOabtOaWsOaVsOaNrlxuICAgICAgICBsZXQgaGFzVXNlciA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NhbGxVc2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHVzZXJJZCwgc3RhdGVUaW1lOiBvbGRTdGF0ZVRpbWUsIHN5c3RlbVN0YXRlOiBvbGRTeXN0ZW1TdGF0ZSwgdXNlclN0YXRlOiBvbGRVc2VyU3RhdGUsXG4gICAgICAgICAgfSA9IHRoaXMuX2NhbGxVc2Vyc1tpXTtcbiAgICAgICAgICBpZiAodXNlcklkID09PSB1c2VyLnVzZXJJZCkge1xuICAgICAgICAgICAgaGFzVXNlciA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBpc0ludmFsaWRTeXNTdGF0ZSA9IHZhbGlkYXRlU3lzU3RhdGUob2xkU3lzdGVtU3RhdGUsIG5ld1N5c1N0YXRlKTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW52YWxpZFVzZXJTdGF0ZSA9IHZhbGlkYXRlVXNlclN0YXRlKG9sZFVzZXJTdGF0ZSwgbmV3VXNlclN0YXRlKTtcblxuICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkT25waG9uZUVuZCA9IG5ld1N5c1N0YXRlID09PSBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FX0VORCAmJiBvbGRTeXN0ZW1TdGF0ZSAhPT0gUkNDYWxsUGx1c1JlYXNvbi5PTl9QSE9ORSAmJiBuZXdVc2VyU3RhdGUgIT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEU7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog5peg5pWI55qE54q25oCB77yaXG4gICAgICAgICAgICAgKiDmlrDkuIvlj5HnirbmgIHnmoTml7bpl7TlsI/kuo7lvZPliY3nirbmgIHnmoTml7bpl7Qg5LiUIHN5c3RlbVN0YXRlIOWSjCB1c2VyU3RhdGUg5Z2H5piv5peg5pWI55qEXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICgobmV3U3RhdGVUaW1lICYmIG9sZFN0YXRlVGltZSAmJiBuZXdTdGF0ZVRpbWUgPCBvbGRTdGF0ZVRpbWUpIHx8IChpc0ludmFsaWRTeXNTdGF0ZSAmJiBpc0ludmFsaWRVc2VyU3RhdGUpKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHRpbWVvdXQgdXNlciBzdGF0ZTogb2xkOiR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgdXNlcklkLCBvbGRTdGF0ZVRpbWUsIG9sZFN5c3RlbVN0YXRlLCBvbGRVc2VyU3RhdGUsXG4gICAgICAgICAgICAgICAgfSl9OyBuZXc6JHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGB1cGRhdGVVc2VyTGlzdCBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIOebtOaOpeimhuebluabtOaWsFxuICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdXBkYXRlVXNlckxpc3QgLT4gY292ZXIgJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICAgICAgdGhpcy5fY2FsbFVzZXJzW2ldID0gdXNlcjtcbiAgICAgICAgICAgICAgIWlzSW52YWxpZE9ucGhvbmVFbmQgJiYgY2hhbmdlZFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDml6DmraTnlKjmiLfnm7TmjqXmt7vliqBcbiAgICAgICAgaWYgKCFoYXNVc2VyKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHVwZGF0ZVVzZXJMaXN0IC0+IG5vdXNlciBwdXNoICR7SlNPTi5zdHJpbmdpZnkodXNlcil9YCwgdHJhY2VJZCk7XG4gICAgICAgICAgdGhpcy5fY2FsbFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgICAgY2hhbmdlZFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZFVzZXJzO1xuICB9XG5cbiAgcHVibGljIHNldE9sZERpYWxvZ0RhdGEoZGF0YTogSU9sZERpYWxvZ0RhdGEpIHtcbiAgICB0aGlzLl9vbGREaWFsb2dEYXRhID0gZGF0YTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgLyoqXG4gICAqIOabtOaWsCBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVNlc3Npb25TdGF0ZShzdGF0ZTogUkNDYWxsUGx1c0NhbGxTdGF0ZSkge1xuICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw6YCa6K+d57G75Z6L77yI5Y2H6ZmN57qn6K6+572u77yJXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2FsbFR5cGUoY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlKSB7XG4gICAgdGhpcy5fY2FsbFR5cGUgPSBjYWxsVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDlqpLkvZPnsbvlnovvvIjljYfpmY3nuqfvvIlcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKSB7XG4gICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOivt+axgueahOWqkuS9k+exu+Wei++8iOWNh+mZjee6p++8iVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVJlcU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfCBudWxsKSB7XG4gICAgdGhpcy5fcmVxTWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsCBpbnZ0ZXIgdGltZXIgaWRcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVUaW1lcklkKHR5cGU6IENhbGxUaW1lckV2ZW50VHlwZSwgdGltZXJJZDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGUgPT09IENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVSKSB7XG4gICAgICB0aGlzLl9pbnZpdGVyVGltZXJJZCA9IHRpbWVySWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ludml0ZWVUaW1lcklkID0gdGltZXJJZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WXG4gICAqL1xuICBwdWJsaWMgZ2V0T2xkRGlhbG9nRGF0YSgpOiBJT2xkRGlhbG9nRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX29sZERpYWxvZ0RhdGE7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5piv5ZCm5piv5bex56uv5oyC5patXG4gICAqL1xuICBwdWJsaWMgc2V0SXNMb2NhbENsaWVudEhhbmd1cChpc0xvY2FsQ2xpZW50SGFuZ3VwOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0xvY2FsQ2xpZW50SGFuZ3VwID0gaXNMb2NhbENsaWVudEhhbmd1cDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9jYWxDbGllbnRIYW5ndXA7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIENhbGxTZXJ2ZXJBY3Rpb24ge1xuICAvKipcbiAgICog5byA5aeL5Y2V5Lq65ZG85Y+rXG4gICAqL1xuICBTVEFSVF9TSU5HTEVfQ0FMTCA9ICdzdGFydFNpbmdsZUNhbGwnLFxuICAvKipcbiAgICog5byA5aeL5aSa5Lq65ZG85Y+rXG4gICAqL1xuICBTVEFSVF9HUk9VUF9DQUxMID0gJ3N0YXJ0R3JvdXBDYWxsJyxcbiAgLyoqXG4gICAqIOmCgOivt+WlveWPi+WKoOWFpemAmuivnVxuICAgKi9cbiAgSU5WSVRFX0NBTEwgPSAnaW52aXRlQ2FsbCcsXG4gIC8qKlxuICAgKiDkuIvlj5HpgoDor7fpgJror53mlbDmja5cbiAgICovXG4gIFBVQl9JTlZJVEVfQ0FMTCA9ICdwdWJJbnZpdGVDYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneWTjemTg1xuICAgKi9cbiAgUklOR0lOR19DQUxMID0gJ3JpbmdDYWxsJyxcbiAgLyoqXG4gICAqIOaOpeWPl+mAmuivnVxuICAgKi9cbiAgQUNDRVBUX0NBTEwgPSAnYWNjZXB0Q2FsbCcsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror51cbiAgICovXG4gIEpPSU5fQ0FMTCA9ICdqb2luQ2FsbCcsXG4gIC8qKlxuICAgKiDmjILmlq3pgJror51cbiAgICovXG4gIEhBTkdVUF9DQUxMID0gJ2hhbmd1cENhbGwnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiK5oqlXG4gICAqL1xuICBTVEFUVVNfVVBfQ0FMTCA9ICdzdGF0dXNVcENhbGwnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiL5Y+RXG4gICAqL1xuICBTVEFUVVNfRE9XTl9DQUxMID0gJ3N0YXR1c0Rvd25DYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneS6i+S7tuS4iuaKpVxuICAgKi9cbiAgRVZFTlRfVVBfQ0FMTCA9ICdldmVudFVwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53kuovku7bkuIvlj5FcbiAgICovXG4gIEVWRU5UX0RPV05fQ0FMTCA9ICdldmVudERvd25DYWxsJyxcbiAgLyoqXG4gICAqIOWvueivneaVsOaNruS4iuihjFxuICAgKi9cbiAgRElBTE9HX1VQX0NBTEwgPSAnZGlhbG9nVXBDYWxsJyxcbiAgLyoqXG4gICAqIOWvueivneaVsOaNruS4i+ihjFxuICAgKi9cbiAgRElBTE9HX0RPV05fQ0FMTCA9ICdkaWFsb2dEb3duQ2FsbCcsXG4gIC8qKlxuICAgKiDojrflj5bnlKjmiLfkvJror53mlbDmja7liJfooahcbiAgICovXG4gIEdFVF9DQUxMX1VTRVJfU0VTU0lPTl9MSVNUID0gJ2dldENhbGxVU2VyU2Vzc2lvbkxpc3QnLFxuICAvKipcbiAgICog5pel5b+X6K6w5b2V5ZCM5q2lXG4gICAqL1xuICBTWU5DX0NBTExfTE9HID0gJ3N5bmNDYWxsTG9nJyxcbiAgLyoqXG4gICAqIOaXpeW/l+iusOW9leS4i+WPkVxuICAgKi9cbiAgUFVCX0NBTExfTE9HID0gJ3B1YkNhbGxMb2cnLFxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6YCa6K+d6K6w5b2VXG4gICAqL1xuICBERUxfQ0FMTF9MT0cgPSAnZGVsZXRlQ2FsbExvZycsXG4gIC8qKlxuICAgKiDmn6Xor6LlvZPliY3nlKjmiLflt7LmnInnmoQgY2FsbCDnirbmgIFcbiAgICovXG4gIFFSWV9DQUxMX1NUQVRFID0gJ3F1ZXJ5VXNlckhhc0NhbGwnLFxuICAvKipcbiAgICog5p+l6K+iIGNhbGxTZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBRUllfU1JWX1RJTUVTVEFNUCA9ICdnZXRDYWxsU3J2VGltZVN0YW1wJyxcbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeeUqOaIt+i/m+ihjOeahCBjYWxsIOWIl+ihqFxuICAgKi9cbiAgR0VUX0NBTExfU1RBVEVfTElTVCA9ICdnZXRVc2VyQ2FsbFN0YXRlTGlzdCcsXG4gIC8qKlxuICAgKiDmuIXpmaTlvZPliY3nlKjmiLfpgJror53orrDlvZVcbiAgICovXG4gIENMRUFSX0NBTExfTE9HID0gJ2NsZWFuQ2FsbExvZycsXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCDkvJror53kv6Hmga9cbiAgICovXG4gIEdFVF9DQUxMX1NFU1NJT04gPSAnZ2V0Q2FsbFNlc3Npb24nLFxuICAvKipcbiAgICog6I635Y+WIGNhbGwg5pe26Ze05L+h5oGvXG4gICAqL1xuICBHRVRfQ0FMTF9USU1FX0lORk8gPSAnZ2V0Q2FsbFRpbWVJbmZvJyxcbiAgLyoqXG4gICAqIOe7k+adn+W9k+WJjeeUqOaIt+W8guW4uOeahGNhbGxTZXNzaW9uKOWMheWQq+WQhOS4qumYtuautSnvvIzkuLvopoHnlKjkuo7lupTnlKjlvILluLjpgIDlh7rlho3lkK/liqjjgIHlkITnp43pgJror53lvILluLjlvZPkuK3jgILphYzmg4XosIPnlKhcbiAgICovXG4gIEVORF9BQk5PUk1BTF9DQUxMID0gJ2VuZFVzZXJBYm5vcm1hbENhbGxzJyxcbiAgLyoqXG4gICAqIOeUqOaIt+ezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgU1lTX1NUQVRVU19VUCA9ICdzeXNTdGF0dXNVcCcsXG4gIC8qKlxuICAgKiDkuIrmiqXpgJror53orrDlvZXlt7Lor7vnirbmgIFcbiAgICovXG4gIFVQX0NBTExfTE9HX1JFQURFRCA9ICd1cENhbGxMb2dSZWFkZWQnLFxuICAvKipcbiAgICog5LiL5Y+R6YCa6K+d6K6w5b2V5bey6K+754q25oCBXG4gICAqL1xuICBQVUJfQ0FMTF9MT0dfUkVBREVEID0gJ3B1YkNhbGxMb2dSZWFkZWQnLFxuICAvKipcbiAgICog5LiL5Y+R5LiL6KGM5L+h5Luk5pWw5o2u5bqP5Y+3SWQg77yI5byx572R6KGl5YG/5pa55rOV77yM56e75Yqo56uv5bey5a6e546w77yMUEMg5pyq5a6e546w77yJXG4gICAqL1xuICBQVUJfTkFDS19TRVFfSUQgPSAncHViTkFDS1NlcUlkJyxcbiAgLyoqXG4gICAqIOafpeivouW9k+WJjeeUqOaIt+WPguS4jueahOacque7k+adn+eahGNhbGxTZXNzaW9u55qEQ2FsbElk5YiX6KGo77yMZ3JvdXDkuJPnlKjvvIzlj6/lnKhncm91cGNhbGznu5PmnZ/ml7bvvIzooaXlgb/lkITnq6/nmoTlv6vmjbflhaXlj6PmmK/lkKbmtojlpLHnmoTliKTmlq1cbiAgICovXG4gIEdFVF9VU0VSX0NBTExfU0VTU0lPTl9JRF9MSVNUID0gJ2dldFVzZXJDYWxsU2Vzc2lvbklkTGlzdCdcbn1cbiIsImV4cG9ydCBjb25zdCB0aW1lclNldFRpbWVvdXQgPSAoZnVuYzogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcik6IG51bWJlciA9PiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIGFzIG51bWJlcjtcblxuZXhwb3J0IGNvbnN0IHRpbWVySW50ZXJ2YWwgPSAoZnVuOiBGdW5jdGlvbiwgaXR2OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0SW50ZXJ2YWwoZnVuLCBpdHYpIGFzIG51bWJlcjtcblxuZXhwb3J0IGNvbnN0IHNsZWVwID0gKG1pbGxpc2Vjb25kOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gIHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmQpO1xufSk7XG4iLCJpbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ1JUQ0NvZGUgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckVycm9yQ29kZSB9IGZyb20gJy4uL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5cbmV4cG9ydCB0eXBlIFRSZXRyeUVycm9yQ29kZSA9IENhbGxTZXJ2ZXJFcnJvckNvZGUgfCBSQ1JUQ0NvZGUgfCBudW1iZXIgfCBFcnJvckNvZGVcbmV4cG9ydCBpbnRlcmZhY2UgcmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIOimgemHjeivleeahOW8guatpeWHveaVsFxuICAgKi9cbiAgYXN5bmNGbjogRnVuY3Rpb247XG4gIC8qKlxuICAgKiDlh73mlbDnmoTlj4LmlbBcbiAgICovXG4gIGZuQXJnczogYW55W107XG4gIC8qKlxuICAgKiDlvZPliY3ph43or5Xml7bpl7TmiLNcbiAgICovXG4gIGN1cnJlbnRSZXRyeVRpbWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmnIDlpKfph43or5Xml7bplb9cbiAgICovXG4gIG1heER1cmF0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgICog5qKv5bqm6YeN6K+V6Ze06ZqUXG4gICAqL1xuICBpbnRlcnZhbHM/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIOair+W6pumHjeivlemXtOmalOaVsOe7hOS4i+agh1xuICAgKi9cbiAgaW5kZXg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDph43or5XlpLHotKXnmoTlm57osINcbiAgICovXG4gIG9uRXJyb3I/OiAoY29kZTogVFJldHJ5RXJyb3JDb2RlKSA9PiB2b2lkXG59XG5cbmNvbnN0IG5lZWRSZXRyeUNvZGU6IFRSZXRyeUVycm9yQ29kZVtdID0gW1xuICAvKipcbiAgICogSU0g5bqV5bGC6L+U5Zue6ZyA6KaB6YeN6K+V55qE6ZSZ6K+v56CBXG4gICAqL1xuICBFcnJvckNvZGUuUkNfTkVUX0NIQU5ORUxfSU5WQUxJRCxcbiAgRXJyb3JDb2RlLlJDX05FVF9VTkFWQUlMQUJMRSxcbiAgRXJyb3JDb2RlLlJDX01TR19SRVNQX1RJTUVPVVQsXG4gIC8qKlxuICAgKiBSVEMg6L+U5Zue6ZyA6KaB6YeN6K+V55qE6ZSZ6K+v56CBXG4gICAqL1xuICBSQ1JUQ0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCxcbiAgUkNSVENDb2RlLlJFUVVFU1RfRkFJTEVELFxuXG5dO1xuXG4vKipcbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMuYXN5bmNGbiDopoHph43or5XnmoTlvILmraXlh73mlbBcbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMuZm5BcmdzIOWHveaVsOeahOWPguaVsFxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5jdXJyZW50UmV0cnlUaW1lIOW9k+WJjemHjeivleaXtumXtOaIs1xuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5tYXhEdXJhdGlvbiDmnIDlpKfph43or5Xml7bplb9cbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMuaW50ZXJ2YWxzIOair+W6pumHjeivlemXtOmalFxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5pbmRleCDmoq/luqbph43or5Xpl7TpmpTmlbDnu4TkuIvmoIdcbiAqL1xuZXhwb3J0IGNvbnN0IHJldHJ5QXN5bmNGbiA9IGFzeW5jIDxSIGV4dGVuZHMge2NvZGU6IFRSZXRyeUVycm9yQ29kZX0+ICh7XG4gIGFzeW5jRm4sXG4gIGZuQXJncyxcbiAgY3VycmVudFJldHJ5VGltZSA9IERhdGUubm93KCksXG4gIG1heER1cmF0aW9uID0gNjAgKiAxMDAwLFxuICBpbnRlcnZhbHMgPSBbMiAqIDEwMDAsIDQgKiAxMDAwLCA4ICogMTAwMCwgMTYgKiAxMDAwLCAzMiAqIDEwMDAsIDY0ICogMTAwMF0sXG4gIGluZGV4ID0gMCxcbiAgb25FcnJvcixcbn06IHJldHJ5T3B0aW9ucyk6IFByb21pc2U8Uj4gPT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBhc3luY0ZuKC4uLmZuQXJncyk7XG4gIC8vIGNvbnN0IGl0diA9IGludGVydmFsc1tpbmRleF0gfHwgaW50ZXJ2YWxzW2ludGVydmFscy5sZW5ndGggLSAxXVxuICAvLyBpbmRleCsrXG4gIC8vIGl0diDlhpnmrbsgMjAwMCBtcyAs5ZCO57ut6ZyA6KaB5YaN5pS+5byA5qKv5bqm6YeN6K+VXG4gIGNvbnN0IGl0diA9IDIgKiAxMDAwO1xuICBjb25zdCBpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkgPSAocmVzLmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1NcbiAgICB8fCAhbmVlZFJldHJ5Q29kZS5pbmNsdWRlcyhyZXMuY29kZSkpXG4gICAgfHwgKChEYXRlLm5vdygpICsgaXR2IC0gY3VycmVudFJldHJ5VGltZSkgPiBtYXhEdXJhdGlvbik7XG5cbiAgaWYgKCFpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkpIHtcbiAgICBvbkVycm9yICYmIG9uRXJyb3IocmVzLmNvZGUpO1xuICAgIGF3YWl0IHNsZWVwKGl0dik7XG4gICAgcmV0dXJuIHJldHJ5QXN5bmNGbih7XG4gICAgICBhc3luY0ZuLFxuICAgICAgZm5BcmdzLFxuICAgICAgY3VycmVudFJldHJ5VGltZSxcbiAgICAgIG1heER1cmF0aW9uLFxuICAgICAgaW50ZXJ2YWxzLFxuICAgICAgaW5kZXgsXG4gICAgICBvbkVycm9yLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIHJldHJ5QnlUaW1lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiDopoHph43or5XnmoTlvILmraXlh73mlbBcbiAgICovXG4gIGFzeW5jRm46IEZ1bmN0aW9uO1xuICAvKipcbiAgICog5Ye95pWw55qE5Y+C5pWwXG4gICAqL1xuICBmbkFyZ3M6IGFueVtdO1xuICAvKipcbiAgICog5b2T5YmN6YeN6K+V5pe26Ze05oizXG4gICAqL1xuICBjdXJyZW50UmV0cnlUaW1lPzogbnVtYmVyO1xuICAvKipcbiAgICog5pyA5aSn6YeN6K+V5qyh5pWwLCDpu5jorqQgMiDmrKFcbiAgICovXG4gIG1heFJldHJ5VGltZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIOmHjeivleWksei0peeahOWbnuiwg1xuICAgKi9cbiAgb25FcnJvcj86IChjb2RlOiBUUmV0cnlFcnJvckNvZGUpID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IHJldHJ5QXNueWNGbkJ5VGltZSA9IGFzeW5jIDxSIGV4dGVuZHMge2NvZGU6IFRSZXRyeUVycm9yQ29kZX0+ICh7XG4gIGFzeW5jRm4sXG4gIGZuQXJncyxcbiAgY3VycmVudFJldHJ5VGltZSA9IDAsXG4gIG1heFJldHJ5VGltZSA9IDIsXG4gIG9uRXJyb3IsXG59OiByZXRyeUJ5VGltZU9wdGlvbnMpOiBQcm9taXNlPFI+ID0+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgYXN5bmNGbiguLi5mbkFyZ3MpO1xuICBjb25zdCBpdHYgPSAyICogMTAwMDtcbiAgY3VycmVudFJldHJ5VGltZSsrO1xuICBjb25zdCBpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkgPSAocmVzLmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1NcbiAgICB8fCAhbmVlZFJldHJ5Q29kZS5pbmNsdWRlcyhyZXMuY29kZSkpIHx8IGN1cnJlbnRSZXRyeVRpbWUgPiBtYXhSZXRyeVRpbWU7XG5cbiAgaWYgKCFpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkpIHtcbiAgICBvbkVycm9yICYmIG9uRXJyb3IocmVzLmNvZGUpO1xuICAgIGF3YWl0IHNsZWVwKGl0dik7XG4gICAgcmV0dXJuIHJldHJ5QXNueWNGbkJ5VGltZSh7XG4gICAgICBhc3luY0ZuLFxuICAgICAgZm5BcmdzLFxuICAgICAgY3VycmVudFJldHJ5VGltZSxcbiAgICAgIG1heFJldHJ5VGltZSxcbiAgICAgIG9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQgeyBJUHViSW52aXRlQ29uIH0gZnJvbSAnLi9JU2lnbmFsVHJhbnNwb3J0ZXInO1xuXG5leHBvcnQgZW51bSBDYWxsSG9va3NUeXBlIHtcbiAgb25CZWZvcmVQdWJsaXNoID0gJ29uQmVmb3JlUHVibGlzaCcsXG4gIG9uUHVibGlzaFJlcyA9ICdvblB1Ymxpc2hSZXMnLFxuICBvblB1Ykludml0ZUNhbGwgPSAnb25QdWJJbnZpdGVDYWxsJyxcbiAgb25QdWJJbnZpdGVDYWxsUHVsbEt2ID0gJ29uUHViSW52aXRlQ2FsbFB1bGxLdicsXG4gIG9uUHViSW52aXRlQ2FsbE1pc3MgPSAnb25QdWJJbnZpdGVDYWxsTWlzcydcbn1cblxuZXhwb3J0IGVudW0gUHViSW52aXRlQ2FsbE1pc3NSZWFzb24ge1xuICBOT1RfQ1VSUkVOVF9ERVZJQ0VJRCA9ICdub3QgY3VycmVudCBkZXZpY2UgaWQnLFxuICBTRUNSRVRfQ0FMTCA9ICdzZWNyZXQgY2FsbCcsXG4gIE5PVF9JTlZJVEVFID0gJ25vdCBhbiBpbnZpdGVlJ1xufVxuXG5leHBvcnQgZW51bSBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyIHtcbiAgUFVCX0lOVklURSA9ICdwdWJpbnZpdGVjYWxsJyxcbiAgUFVMTF9LVl9JTlZJVEUgPSAncHVsbGt2X2ludml0ZWNhbGwnLFxuICBQVVNIID0gJ3N5c3RlbV9wdWJzaCdcbn1cblxuZXhwb3J0IHR5cGUgSVB1Ykludml0ZUNhbGxJbmZvID0gSVB1Ykludml0ZUNvbiAmIHsgZXh0cmE6IHN0cmluZ31cblxuZXhwb3J0IHR5cGUgSVB1Ykludml0ZUNhbGxNaXNzSW5mbyA9IElQdWJJbnZpdGVDb24gJiB7IGV4dHJhOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nLCByZWZlcjogUHViSW52aXRlQ2FsbE1pc3NSZWZlcn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBFcnJvckNvZGUsIEV2ZW50RW1pdHRlciwgZ2V0VVVJRDIyLCBJUnVudGltZSwgaXNOdWxsLCBpc1N0cmluZywgbG9nZ2VyLCBQbHVnaW5Db250ZXh0LCBSQ0Nvbm5lY3Rpb25TdGF0dXMsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJBY3Rpb24gfSBmcm9tICcuLi9lbnVtcy9DYWxsU2VydmVyQWN0aW9uJztcbmltcG9ydCB7XG4gIElBY2NlcHRDYWxsQ29uLFxuICBJQmFzZVNpbmdhbENvbixcbiAgSUNsZWFyQ2FsbExvZ1JlcyxcbiAgSUNvbnBlbnNhdGlvbkRhdGEsXG4gIElEaWFsb2dEb3duQ2FsbENvbixcbiAgSURpYWxvZ1VwQ2FsbENvbixcbiAgSUV2ZW50RG93bkNhbGxDb24sXG4gIElFdmVudFVwQ2FsbENvbixcbiAgSUdldENhbGxTZXNzaW9uU2VydmVyUmVzLFxuICBJR2V0Q2FsbFRpbWVJbmZvUmVzLFxuICBJR2V0VXNlckNhbGxTdGF0ZUxpc3RSZXMsXG4gIElIYW5ndXBDYWxsQ29uLFxuICBJSW52aXRlQ2FsbENvbixcbiAgSUludml0ZUNhbGxSZXMsXG4gIElKb2luQ2FsbENvbixcbiAgSVB1YkNhbGxMb2csXG4gIElQdWJJbnZpdGVDb24sXG4gIElRcnlVc2VySGFzQ2FsbFJlcyxcbiAgSVJpbmdpbmdDYWxsQ29uLFxuICBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lcixcbiAgSVN0YXJ0Q2FsbENvbixcbiAgSVN0YXJ0Q2FsbFJlcyxcbiAgSVN0YXJ0R3JvdXBDb24sXG4gIElTdGFydFNpbmdsZUNvbixcbiAgSVN0YXR1c0Rvd25Db250LFxuICBJU3RhdHVzVXBDb24sXG4gIElTeW5jQ2FsbExvZ0NvbixcbiAgSVN5bmNDYWxsTG9nUmVzTGlzdCxcbiAgSVN5c1N0YXR1c1VwT3B0cyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JU2lnbmFsVHJhbnNwb3J0ZXInO1xuaW1wb3J0IHsgRGlhbG9nVHlwZSB9IGZyb20gJy4uL2VudW1zL0RpYWxvZ1R5cGUnO1xuaW1wb3J0IHsgSVJDQ2FsbEluaXRPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JSW5kZXgnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IFRpbWVDb3JyZWN0aW9uZXIgfSBmcm9tICcuL1RpbWVDb3JyZWN0aW9uZXInO1xuaW1wb3J0IHsgcmV0cnlBc3luY0ZuIH0gZnJvbSAnLi4vdXRpbHMvcmV0cnknO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1R5cGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7XG4gIENhbGxIb29rc1R5cGUsIFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLCBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsSG9va3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuZXhwb3J0IGNsYXNzIFNpZ25hbFRyYW5zcG9ydGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIOebkeWQrOWvueixoVxuICAgKi9cbiAgX2xpc3RlbmVyITogSVNpZ25hbFRyYW5zcG9ydGVyTGlzdGVuZXJcblxuICAvKipcbiAgICog6ZyA6KaB6YeN6K+V55qEIGFjdGlvblxuICAgKi9cbiAgX25lZWRSZXRyeUFjdGlvbnM6IENhbGxTZXJ2ZXJBY3Rpb25bXSA9IFtcbiAgICBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX1NJTkdMRV9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfR1JPVVBfQ0FMTCxcbiAgICBDYWxsU2VydmVyQWN0aW9uLkFDQ0VQVF9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uSk9JTl9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uRVZFTlRfVVBfQ0FMTCxcbiAgXVxuXG4gIF9zZXNzaW9uSWQ6IHN0cmluZyA9ICcnXG5cbiAgLyoqXG4gICAqIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRPcHRzOiBJUkNDYWxsSW5pdE9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGltZUNvcnJlY3Rpb25lcjogVGltZUNvcnJlY3Rpb25lcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NvbnRleHQub25DYWxsSW5mbyA9IHRoaXMuX29uUmVjdkNhbGxTaWduYWwuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9jb250ZXh0Lm9uY29ubmVjdGlvbnN0YXRlY2hhbmdlID0gdGhpcy5fb25JTUNvbm5lY3Rpb25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3Nlc3Npb25JZCA9IGdldFVVSUQyMigpO1xuICB9XG5cbiAgZ2V0U2Vzc2lvbklkKCkge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uSWQ7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcjogSVNpZ25hbFRyYW5zcG9ydGVyTGlzdGVuZXIpIHtcbiAgICB0aGlzLl9saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0Q2FsbChtc2c6IElTdGFydENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgY29uc3Qge1xuICAgICAgY2xpZW50Q2FsbElkLCBjYWxsVHlwZSwgdG9Vc2VycywgbWVkaWFUeXBlLCBzZWNyZXRDaGF0LCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgbmlja05hbWUsIG9sZFJvb21JZCxcbiAgICB9ID0gbXNnO1xuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFydFNpbmdsZUNhbGwoe1xuICAgICAgICBjbGllbnRDYWxsSWQsXG4gICAgICAgIHRvVXNlcklkOiB0b1VzZXJzWzBdLnVzZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBzZWNyZXRDaGF0LFxuICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgb2xkUm9vbUlkLFxuICAgICAgICB0b09yZ0lkOiB0b1VzZXJzWzBdLm9yZ0lkIHx8ICcnLFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0R3JvdXBDYWxsKHtcbiAgICAgIGNsaWVudENhbGxJZCxcbiAgICAgIHRvVXNlcnMsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBuaWNrTmFtZSxcbiAgICAgIG9sZFJvb21JZCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFNpbmdsZUNhbGwobXNnOiBJU3RhcnRTaW5nbGVDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9TSU5HTEVfQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGFydFNpbmdsZUNvbiwgSVN0YXJ0Q2FsbFJlcz4odGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgQ2FsbFNlcnZlckFjdGlvbi5TVEFSVF9TSU5HTEVfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydEdyb3VwQ2FsbChtc2c6IElTdGFydEdyb3VwQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJU3RhcnRDYWxsUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR1JPVVBfQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGFydEdyb3VwQ29uLCBJU3RhcnRDYWxsUmVzPih0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX0dST1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW52aXRlQ2FsbChtc2c6IElJbnZpdGVDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJSW52aXRlQ2FsbFJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0lOVklURV9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElJbnZpdGVDYWxsQ29uLCBJSW52aXRlQ2FsbFJlcz4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5JTlZJVEVfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByaW5naW5nQ2FsbChtc2c6IElSaW5naW5nQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUklOR19ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElSaW5naW5nQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlJJTkdJTkdfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhY2NlcHRDYWxsKG1zZzogSUFjY2VwdENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0FDQ0VQVF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElBY2NlcHRDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uQUNDRVBUX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgam9pbkNhbGwobXNnOiBJSm9pbkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0pPSU5fQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElKb2luQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkpPSU5fQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5ndXBDYWxsKG1zZzogSUhhbmd1cENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0hBTkdVUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJSGFuZ3VwQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkhBTkdVUF9DQUxMLCBtc2cpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCkge1xuICAgICAgLy8g5a2Y5Zyo5Y2V5ZG8IEEg5oyC5pat5ZCO55u05o6l6Lii5Ye6IELvvIxDYWxsU2VydmVyIOW3suenu+mZpCBjYWxsLCBCIOWQjuWIsCBDYWxsU2VydmVyIOeahCBoYW5ndXAg5Lya6L2s5Li6IENhbGxTZXJ2ZXJFcnJvckNvZGUuQ0FMTF9OT1RfRVhJU1TvvIzmlYXlv73nlaVcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXR1c1VwQ2FsbChtc2c6IElTdGF0dXNVcENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9TVEFUVVNfVVBfVCwgYGNhbGwgc3RhdHVzIHVwIHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJU3RhdHVzVXBDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5TVEFUVVNfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBldmVudFVwQ2FsbChtc2c6IElFdmVudFVwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9FVkVOVF9VUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElFdmVudFVwQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkVWRU5UX1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGlhbG9nVXBDYWxsKG1zZzogSURpYWxvZ1VwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9ESUFMT0dfVVBfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJRGlhbG9nVXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uRElBTE9HX1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlQ2FsbFJlY29yZCh1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9ERUxFVEVfQ0FMTF9SRUNPUkRfVCwgYGNhbGxJZHM6ICR7SlNPTi5zdHJpbmdpZnkoY2FsbElkcyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPHtjYWxsSWRzOiBzdHJpbmdbXX0sIHVuZGVmaW5lZD4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLkRFTF9DQUxMX0xPRywge1xuICAgICAgY2FsbElkcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzeW5jQ2FsbExvZyhtc2c6IElTeW5jQ2FsbExvZ0NvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN5bmNDYWxsTG9nUmVzTGlzdH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1JFQ09SRF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTeW5jQ2FsbExvZ0NvbiwgSVN5bmNDYWxsTG9nUmVzTGlzdD4obXNnLnVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5TWU5DX0NBTExfTE9HLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHF1ZXJ5VXNlckhhc0NhbGwoKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVFyeVVzZXJIYXNDYWxsUmVzfT4ge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElRcnlVc2VySGFzQ2FsbFJlcz4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlFSWV9DQUxMX1NUQVRFLCBudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IHsgc3luY1RpbWU6IG51bWJlcn19PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1NFUlZFUl9USU1FX1QsIGB1c2VySWQ6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxudWxsLCB7IHN5bmNUaW1lOiBudW1iZXJ9Pih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uUVJZX1NSVl9USU1FU1RBTVAsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxUaW1lSW5mbyhjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxUaW1lSW5mb1Jlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1RJTUVfSU5GT19ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8eyBjYWxsSWQ6IHN0cmluZ30sIElHZXRDYWxsVGltZUluZm9SZXM+KGNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5HRVRfQ0FMTF9USU1FX0lORk8sIHsgY2FsbElkIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFVzZXJDYWxsU3RhdGVMaXN0KHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlc30+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0FWQUlMQUJMRV9DQUxMX0xJU1RfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlcz4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1NUQVRFX0xJU1QsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFyQ2FsbFJlY29yZCh0cmFjZUlkOiBzdHJpbmcpOlByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElDbGVhckNhbGxMb2dSZXN9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0NMRUFSX0NBTExfUkVDT1JEX1QsIGB1c2VySWQ6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxudWxsLCBJQ2xlYXJDYWxsTG9nUmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uQ0xFQVJfQ0FMTF9MT0csIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXNzaW9uKG9wdHM6IElCYXNlU2luZ2FsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9JTkZPX0JZX0NBTExJRF9ULCBgY2FsbElkOiAke29wdHMuY2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJQmFzZVNpbmdhbENvbiwgSUdldENhbGxTZXNzaW9uU2VydmVyUmVzPihvcHRzLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5HRVRfQ0FMTF9TRVNTSU9OLCBvcHRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzeXNTdGF0dXNVcChvcHRzOiBJU3lzU3RhdHVzVXBPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9VU0VSX1NZU1RFTV9TVEFURV9VUF9ULCBgb3B0czogJHtKU09OLnN0cmluZ2lmeShvcHRzKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN5c1N0YXR1c1VwT3B0cywgdW5kZWZpbmVkPihvcHRzLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5TWVNfU1RBVFVTX1VQLCBvcHRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cENhbGxMb2dSZWFkZWQob3B0czogSUJhc2VTaW5nYWxDb24pOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUJhc2VTaW5nYWxDb24sIHVuZGVmaW5lZD4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlVQX0NBTExfTE9HX1JFQURFRCwgb3B0cyk7XG4gIH1cblxuICAvKiogPT09PT0956eB5pyJ5pa55rOVPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4gIHByaXZhdGUgX29uSU1Db25uZWN0aW9uU3RhdGVDaGFuZ2Uoc3RhdGU6IFJDQ29ubmVjdGlvblN0YXR1cykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSU1fU1RBVEVfQ0hBTkdFX08sIGBzdGF0ZTogJHtzdGF0ZX1gLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uSU1TdGF0ZUNoYW5nZShzdGF0ZSk7XG4gICAgLyoqXG4gICAgICog6L+e5o6l5oiQ5Yqf5ZCO5ZCv5Yqo5pe26Ze05qCh5q2j5ZmoXG4gICAgICovXG4gICAgaWYgKHN0YXRlID09PSBSQ0Nvbm5lY3Rpb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLnN0YXJ0KHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLnN0b3AodHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwg5L+h5Luk5Y+R6YCBXG4gICAqIEBwYXJhbSB0YXJnZXRJZCDojrflj5YgY2FsbCBsb2cgKHN5bmNDYWxsTG9nKSDml7bkvKAgdXNlcklkLCDlhbbku5YgYWN0aW9uIOS8oCBjYWxsSWRcbiAgICogQHBhcmFtIGtleSBjYWxsIHNlcnZlciDlrprkuYkgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIGFjdGlvbiDmkLrluKblj4LmlbDvvIzml6Dlj4LmlbDkvKDnqbrlrZfnrKbkuLJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NlbmRDYWxsU2lnbmFsIDxULCBSPih0YXJnZXRJZDogc3RyaW5nLCBrZXk6IENhbGxTZXJ2ZXJBY3Rpb24sIG9wdGlvbnM6IFQpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBSfT4ge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucyA/IEpTT04uc3RyaW5naWZ5KHsgLi4ub3B0aW9ucywgLi4ueyBzZXNzaW9uSWQ6IHRoaXMuX3Nlc3Npb25JZCB9IH0pIDogJyc7XG5cbiAgICBsZXQgcmVzdWx0OiB7ZGF0YT86IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9IHwgdW5kZWZpbmVkLCBjb2RlOiBFcnJvckNvZGV9O1xuICAgIGlmICh0aGlzLl9uZWVkUmV0cnlBY3Rpb25zLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8e2RhdGE/OiB7IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nfSB8IHVuZGVmaW5lZCwgY29kZTogRXJyb3JDb2RlfT4oe1xuICAgICAgICBhc3luY0ZuOiB0aGlzLl9jb250ZXh0LnNldENhbGxJbmZvLmJpbmQodGhpcy5fY29udGV4dCksXG4gICAgICAgIGZuQXJnczogW3RhcmdldElkLCBrZXksIHZhbHVlXSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9jb250ZXh0LnNldENhbGxJbmZvKHRhcmdldElkLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSByZXN1bHQ7XG4gICAgaWYgKGNvZGUgIT09IEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIGNvbnN0IHsga2V5OiBzZXJ2ZXJLZXksIHZhbHVlOiBzZXJ2ZXJWYWwgfSA9IGRhdGEhO1xuICAgIGNvbnN0IHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKHNlcnZlclZhbCkuZGF0YSBhcyBSO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgZGF0YTogcGFyc2VkRGF0YSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwg5L+h5Luk5o6l5pS2XG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZDYWxsU2lnbmFsKGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9DQUxMX1NJR05BTF9EQVRBX08sIGBkYXRhOiAke2RhdGF9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBkYXRhTGlzdCA9IEpTT04ucGFyc2UoZGF0YSkubGlzdCBhcyB7W2tleTogc3RyaW5nXTogc3RyaW5nIH1bXTtcbiAgICBkYXRhTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7IGtleSB9ID0gaXRlbTtcbiAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKGl0ZW0udmFsdWUpO1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9JTlZJVEVfQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vblB1Ykludml0ZUNhbGwoaW5mbyBhcyBJUHViSW52aXRlQ29uLCB0cnVlLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlNUQVRVU19ET1dOX0NBTEw6XG4gICAgICAgICAgdGhpcy5fb25TdGF0dXNEb3duQ2FsbChpbmZvIGFzIElTdGF0dXNEb3duQ29udCwgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5FVkVOVF9ET1dOX0NBTEw6XG4gICAgICAgICAgdGhpcy5fb25FdmVudERvd25DYWxsKGluZm8gYXMgSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uRElBTE9HX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vbkRpYWxvZ0Rvd25DYWxsKGluZm8gYXMgSURpYWxvZ0Rvd25DYWxsQ29uLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9DQUxMX0xPRzpcbiAgICAgICAgICB0aGlzLl9vblB1YkNhbGxMb2coaW5mbyBhcyBJUHViQ2FsbExvZywgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5QVUJfQ0FMTF9MT0dfUkVBREVEOlxuICAgICAgICAgIC8vIHBhc3Mg5pqC5pyq55So5YiwXG4gICAgICAgICAgLy8gdGhpcy5fb25QdWJDYWxsTG9nUmVhZGVkKGluZm8gYXMgSVB1YkNhbGxMb2dSZWFkZWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX05BQ0tfU0VRX0lEOlxuICAgICAgICAgIC8vIFRPRE8gY2FsbCDlvLHnvZHooaXlgb/mlrnmoYjmtonlj4rmlrnms5XvvIxQQyDmnKrlgZrvvIzmraTlpITpmLLmraLotbDliLAgZGVmYXVsdFxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuX29uQ29ucGVuc2F0aW9uRGF0YShpbmZvIGFzIElDb25wZW5zYXRpb25EYXRhLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gZGV2aWNlSWQg5Yik5pat5pWw5o2u5piv5ZCm5bqU6K+l5LiL5Y+RXG4gICAqIGRldmljZUlkIOS4uuepuuWtl+espuS4suaIliBudWxsIOebtOaOpeS4i+WPkVxuICAgKiBkZXZpY2VJZCDmnInlhbfkvZPnmoTlgLzvvIzmoLnmja4gZGV2aWNlSWQg5Yik5pat5piv5ZCm5piv5bex56uv55qEIGRldmljZUlkXG4gICAqL1xuICBwcml2YXRlIF9pc1ZhbGlkRGF0YShkZXZpY2VJZDogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc051bGwoZGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKGRldmljZUlkKSAmJiAoZGV2aWNlSWQ/Lmxlbmd0aCA9PT0gMCB8fCBkZXZpY2VJZCA9PT0gdGhpcy5fc2Vzc2lvbklkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgoDor7dcbiAgICogQHBhcmFtIGlzRGlyZWN0bHkg5piv5ZCm5Li655u05Y+R5L+h5LukXG4gICAqL1xuICBwcml2YXRlIF9vblB1Ykludml0ZUNhbGwoZGF0YTogSVB1Ykludml0ZUNvbiwgaXNEaXJlY3RseSA9IHRydWUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50VUlkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gZGF0YS5jYWxsU2Vzc2lvblVzZXJzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VUlkKTtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfSU5WSVRFX08sIGBjdXJyZW50VXNlcjogJHtKU09OLnN0cmluZ2lmeShjdXJyZW50VXNlcil9LCBjdXJyZW50VXNlcklkOiAke2N1cnJlbnRVSWR9LCBzdGF0ZTogJHtzdGF0ZX1gLCB0cmFjZUlkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfSU5WSVRFX08sIGBlcnJvcjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2lzVmFsaWREYXRhKGRhdGEudG9EZXZpY2VJZCB8fCAnJykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYG5vdCBjdXJyZW50IGRldmljZUlkIC0+IGRldmljZUluZm86ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0b0RldmljZUlkOiBkYXRhLnRvRGV2aWNlSWQsXG4gICAgICAgIGNsaWVudERldmljZUlkOiB0aGlzLl9zZXNzaW9uSWQsXG4gICAgICB9KX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIEEg5ZKMIEIg576k6YCa6K+d5Lit77yMQSDlho3pgoDor7cgQ++8jEIg5ZKMIEInIOmDveS8muS8muaUtuWIsCBwdWJJbnZpdGVDYWxsLCBCJyDmlLbliLDnmoQgcHViSW52aXRlQ2FsbCDnmoQgdG9EZXZpY2VJZCDkuI3kuLroh6rlt7HvvIzml6DpnIDlpITnkIZcblxuICAgICAgLy8gaG9va3Mg5Zue6LCD5aSE55CGXG4gICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIHJlYXNvbjogUHViSW52aXRlQ2FsbE1pc3NSZWFzb24uTk9UX0NVUlJFTlRfREVWSUNFSUQsXG4gICAgICAgIHJlZmVyOiBpc0RpcmVjdGx5ID8gUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUJfSU5WSVRFIDogUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUxMX0tWX0lOVklURSxcbiAgICAgIH07XG4gICAgICBpZiAoaXNEaXJlY3RseSkge1xuICAgICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIGluZm8pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbE1pc3MsIE9iamVjdC5hc3NpZ24oZGF0YSwgaW5mbykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uSW52aXRlKGRhdGEsIGlzRGlyZWN0bHksIHRyYWNlSWQpO1xuICAgIGlmIChpc0RpcmVjdGx5KSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGwsIE9iamVjdC5hc3NpZ24oZGF0YSwgeyBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxQdWxsS3YsIE9iamVjdC5hc3NpZ24oZGF0YSwgeyBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDnirbmgIHlj5jmm7TvvJrlk43pk4PjgIHlv5nnoozjgIHpgJror53nrYnlvoXjgIHlr7nmlrnmnKrmjqXlkKzjgIHlt7HmlrnmnKrmjqXlkKxcbiAgICovXG4gIHByaXZhdGUgX29uU3RhdHVzRG93bkNhbGwoZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvLyDmlbDmja7kuK3ov4fmu6TmjonmnKrlj5jmm7TnmoQgdXNlclNlc3Npb25cbiAgICBkYXRhLmNhbGxTZXNzaW9uVXNlcnMgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZmlsdGVyKChpdGVtKSA9PiBCb29sZWFuKGl0ZW0uY2hhbmdlZCkpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08sICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICghdGhpcy5faXNWYWxpZERhdGEoZGF0YS50b0RldmljZUlkIHx8ICcnKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08sIGBub3QgY3VycmVudCBkZXZpY2VJZCAtPiBkZXZpY2VJbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdG9EZXZpY2VJZDogZGF0YS50b0RldmljZUlkLFxuICAgICAgICBjbGllbnREZXZpY2VJZDogdGhpcy5fc2Vzc2lvbklkLFxuICAgICAgfSl9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDkuI3mmK/nu5nlvZPliY3orr7lpIfkuIvlj5HnmoTnirbmgIHlpITnkIZcbiAgICAgIHRoaXMuX2xpc3RlbmVyLm9uT3RoZXJDbGllbnRTdGF0dXNEb3duKGRhdGEsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9saXN0ZW5lci5vblN0YXR1c0Rvd24oZGF0YSwgdHJhY2VJZCwgdGhpcy5fc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53kuovku7blj5jmm7TvvJrmiZPlvIB85YWz6ZetIOaRhOWDj+WktFxuICAgKi9cbiAgcHJpdmF0ZSBfb25FdmVudERvd25DYWxsKGRhdGE6IElFdmVudERvd25DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9saXN0ZW5lci5vbkV2ZW50RG93bihkYXRhLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53osIPmlbTkuovku7blj4rnu5PmnpxcbiAgICog5LqL5Lu277ya5aqS5L2T57G75Z6L5YiH5o2iXG4gICAqIOWKqOS9nO+8muivt+axguOAgeaOpeWPl+OAgeaLkue7neOAgeWPlua2iFxuICAgKi9cbiAgcHJpdmF0ZSBfb25EaWFsb2dEb3duQ2FsbChkYXRhOiBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgZGlhbG9nVHlwZSwgYWN0aW9uLCBleHRyYUtleVZhbCB9ID0gZGF0YTtcbiAgICBzd2l0Y2ggKGRpYWxvZ1R5cGUpIHtcbiAgICAgIGNhc2UgRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRTpcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIub25Td2l0Y2hNZWRpYVR5cGUoZGF0YSwgdHJhY2VJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+WQju+8jOaXpeW/l+S4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBfb25QdWJDYWxsTG9nKGRhdGE6IElQdWJDYWxsTG9nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DQUxMX1JFQ09SRF9PLCBgY2FsbCByZWNvcmQ6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9saXN0ZW5lci5vblJlY3ZDYWxsRW5kTG9nKGRhdGEsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOihpeWBv+aVsOaNruWkhOeQhlxuICAgKi9cbiAgcHJpdmF0ZSBfb25Db25wZW5zYXRpb25EYXRhKGRhdGE6IElDb25wZW5zYXRpb25EYXRhLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DT01QTEVNRU5UQVJZX0RBVEFfTywgJycsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgY2FsbFR5cGUsIG1lZGlhVHlwZSwgc2VjcmV0Q2hhdCwgZHVyYXRpb24sIGNhbGxTdGF0dXMsIGNhbGxpbmdVc2VySWQsIGNhbGxTZXNzaW9uVXNlcnMsIHRvRGV2aWNlSWQsIGNhbGxEaWFsb2dFbnRpdHlzLFxuICAgIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgaXNQdWJJbnZpdGVDYWxsRGF0YSA9IGNhbGxTZXNzaW9uVXNlcnMuc29tZSgoaXRlbSkgPT4gaXRlbS5zZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEICYmIGl0ZW0udXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKTtcblxuICAgIGlmIChpc1B1Ykludml0ZUNhbGxEYXRhKSB7XG4gICAgICB0aGlzLl9vblB1Ykludml0ZUNhbGwoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHRvRGV2aWNlSWQsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGludml0ZVVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFNlc3Npb25Vc2VycyxcbiAgICAgICAgc2VjcmV0Q2hhdCxcbiAgICAgIH0sIHRydWUsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vblN0YXR1c0Rvd25DYWxsKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICB0b0RldmljZUlkLFxuICAgICAgICBjYWxsU3RhdHVzLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgY2FsbFNlc3Npb25Vc2VycyxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIGlmIChjYWxsRGlhbG9nRW50aXR5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjYWxsRGlhbG9nRW50aXR5cy5mb3JFYWNoKChkYXRhKSA9PiB0aGlzLl9vbkRpYWxvZ0Rvd25DYWxsKGRhdGEsIHRyYWNlSWQpLCB0aGlzKTtcbiAgICB9XG4gIH1cbn1cbiIsImNvbnN0IHN0cmluZzEwdG82NCA9IChudW1iZXI6IG51bWJlcikgPT4ge1xuICBjb25zdCBjaGFycyA9ICcwMTIzNDU2Nzg5YWJjZGVmZ2hpZ2tsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElHS0xNTk9QUVJTVFVWV1hZWisvJy5zcGxpdCgnJyk7XG4gIGNvbnN0IHJhZGl4ID0gY2hhcnMubGVuZ3RoICsgMTtcbiAgbGV0IHF1dGllbnQgPSArbnVtYmVyO1xuICBjb25zdCBhcnIgPSBbXTtcbiAgZG8ge1xuICAgIGNvbnN0IG1vZCA9IHF1dGllbnQgJSByYWRpeDtcbiAgICBxdXRpZW50ID0gKHF1dGllbnQgLSBtb2QpIC8gcmFkaXg7XG4gICAgYXJyLnVuc2hpZnQoY2hhcnNbbW9kXSk7XG4gIH0gd2hpbGUgKHF1dGllbnQpO1xuICByZXR1cm4gYXJyLmpvaW4oJycpO1xufTtcblxuY29uc3QgZ2V0VVVJRCA9ICgpID0+ICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgKGMpID0+IHtcbiAgY29uc3QgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7XG4gIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xuICByZXR1cm4gdi50b1N0cmluZygxNik7XG59KTtcblxuLyog6I635Y+WIDIyIOS9jeeahCBVVUlEICovXG5leHBvcnQgY29uc3QgZ2V0VVVJRDIyID0gKCkgPT4ge1xuICBsZXQgdXVpZDogc3RyaW5nIHwgbnVtYmVyID0gZ2V0VVVJRCgpO1xuICB1dWlkID0gYCR7dXVpZC5yZXBsYWNlKC8tL2csICcnKX0wYDtcbiAgdXVpZCA9IHBhcnNlSW50KHV1aWQsIDE2KTtcbiAgdXVpZCA9IHN0cmluZzEwdG82NCh1dWlkKTtcbiAgaWYgKHV1aWQubGVuZ3RoID4gMjIpIHtcbiAgICB1dWlkID0gdXVpZC5zbGljZSgwLCAyMik7XG4gIH1cbiAgcmV0dXJuIHV1aWQ7XG59O1xuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5cbmNvbnN0IENBTExfREJfTkFNRSA9ICdSQ19DQUxMUExVUyc7XG5cbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuXG5pbnRlcmZhY2UgSU9ialN0b3JlUGFyYW1zIHtcbiAgLyoqXG4gICAqIOS4u+mUrlxuICAgKi9cbiAga2V5UGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIOWmguaenOayoeacieWQiOmAgueahOS4u+mUru+8jOWPr+S7peiuvue9ruS4uiB0cnVlIOiHquWKqOeUn+aIkFxuICAgKi9cbiAgYXV0b0luY3JlbWVudD86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIElJbmRleERCT3B0cyB7XG4gIG9uU3VjY2VzczogKCkgPT4gdm9pZDtcbiAgb25FcnJvcj86ICgpID0+IHZvaWQ7XG59XG5cbmxldCBsb2dnZXI6IEJhc2ljTG9nZ2VyO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsSW5kZXhEQiB7XG4gIC8qKlxuICAgKiBjYWxsIGluZGV4REIg5bqTXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfZGI6IElEQkRhdGFiYXNlIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICogUkNDYWxsSW5kZXhEQiDlrp7kvotcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogUkNDYWxsSW5kZXhEQiB8IG51bGwgPSBudWxsXG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHN0YXRpYyBpbml0KF9sb2dnZXI6IEJhc2ljTG9nZ2VyLCBvcHRzOiBJSW5kZXhEQk9wdHMpIHtcbiAgICBsb2dnZXIgPSBfbG9nZ2VyO1xuICAgIGlmICghdGhpcy5pc1N1cHBvcnQoKSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tSQ0NhbGxJbmRleERCXScsICdJbmRleERCIGlzIG5vdCBzdXBwb3J0IGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxID0gd2luZG93LmluZGV4ZWREQi5vcGVuKENBTExfREJfTkFNRSwgREJfVkVSU0lPTik7XG5cbiAgICByZXEub25lcnJvciA9IChldjogYW55KSA9PiB7XG4gICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYG9wZW4gaW5kZXhEQiByZXEgZmFpbGVkIC0+ICR7ZXYudGFyZ2V0LmVycm9yfWApO1xuICAgIH07XG5cbiAgICByZXEub25zdWNjZXNzID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuX2RiID0gZXYudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICh0aGlzLl9kYikge1xuICAgICAgICB0aGlzLl9kYi5vbmNsb3NlID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgdW5leHBlY3RlZGx5IGNsb3NlZC4gJHtldn1gKTtcbiAgICAgICAgICB0aGlzLnVuSW5pdCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kYi5vbmVycm9yID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgb3BlbmluZyBlcnJvci4gJHtldn1gKTtcbiAgICAgICAgICB0aGlzLnVuSW5pdCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kYi5vbmFib3J0ID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgb3BlbmluZyBhYm9ydGVkLiAke2V2fWApO1xuICAgICAgICAgIHRoaXMudW5Jbml0KCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBSQ0NhbGxJbmRleERCLl9pbnN0YW5jZSA9IG5ldyBSQ0NhbGxJbmRleERCKCk7XG4gICAgICBvcHRzLm9uU3VjY2VzcygpO1xuICAgIH07XG5cbiAgICByZXEub251cGdyYWRlbmVlZGVkID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuX2RiID0gZXYudGFyZ2V0LnJlc3VsdDtcblxuICAgICAgUkNDYWxsSW5kZXhEQi5jcmVhdGVPYmpTdG9yZSgnQ2FsbEJXX0Fibm9ybWFsQ2FsbCcsIHsga2V5UGF0aDogJ3VzZXJJZCcgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyB1bkluaXQoKSB7XG4gICAgdGhpcy5fZGIgPSBudWxsO1xuICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBSQ0NhbGxJbmRleERCIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICB9XG5cbiAgc3RhdGljIGlzU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhd2luZG93IHx8ICF3aW5kb3cuaW5kZXhlZERCKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVPYmpTdG9yZShvYmpOYW1lOiBzdHJpbmcsIG9wdHM6IElPYmpTdG9yZVBhcmFtcykge1xuICAgIGxldCBvYmpTdG9yZTogSURCT2JqZWN0U3RvcmU7XG4gICAgaWYgKCFSQ0NhbGxJbmRleERCLl9kYj8ub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhvYmpOYW1lKSkge1xuICAgICAgb2JqU3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYiEuY3JlYXRlT2JqZWN0U3RvcmUob2JqTmFtZSwgb3B0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW1JDQ2FsbEluZGV4REJdJywgYGNyZWF0ZU9ialN0b3JlICR7b2JqTmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG9iak5hbWUg6KGo5piOXG4gICAqIEBwYXJhbSB2YWwg6KaB5re75Yqg55qE5pWw5o2uXG4gICAqL1xuICBwdWJsaWMgYWRkVmFsdWUgPFQ+KG9iak5hbWU6IHN0cmluZywgdmFsOiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLmFkZCh2YWwpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW1JDQ2FsbEluZGV4REJdJywgJ2FkZFZhbHVlIGZhaWxlZCcpO1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5Li76ZSu6K+75Y+W5pWw5o2uXG4gICAqIEBwYXJhbSBrZXkg5Li76ZSuXG4gICAqL1xuICBwdWJsaWMgcmVhZEJ5S2V5IDxUPihvYmpOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiKSB7XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0pLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuXG4gICAgICBjb25zdCByZXEgPSBzdG9yZS5nZXQoa2V5KTtcblxuICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZShyZXEucmVzdWx0KTtcbiAgICAgIH07XG5cbiAgICAgIHJlcS5vbmVycm9yID0gKGV2KSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgcmVhZEJ5S2V5IG9uZXJyb3IgLT4gJHtldn1gKTtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5Li76ZSu5pu05paw5pWw5o2uXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQnlLZXkgPFQ+KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbDogVCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JlID0gUkNDYWxsSW5kZXhEQi5fZGIudHJhbnNhY3Rpb24oW29iak5hbWVdLCAncmVhZHdyaXRlJykub2JqZWN0U3RvcmUob2JqTmFtZSk7XG5cbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLnB1dCh2YWwpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoZXYpID0+IHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgdXBkYXRlQnlLZXkgb25lcnJvciAtPiAke2V2fWApO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVCeUtleShvYmpOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcblxuICAgICAgY29uc3QgcmVxID0gc3RvcmUuZGVsZXRlKGtleSk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9IChldikgPT4ge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGByZW1vdmVCeUtleSBvbmVycm9yIC0+ICR7ZXZ9YCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgSVJ1bnRpbWUsIElTdG9yYWdlIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsSW5kZXhEQiB9IGZyb20gJy4uL3V0aWxzL2luZGV4REInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElPYmpTdG9yZSB7W3VzZXJJZDogc3RyaW5nXTogc3RyaW5nW119XG5cbmludGVyZmFjZSBJU3RvcmVWYWwge3VzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXX1cblxuLyoqXG4gKiDlvILluLjnu5PmnZ8gY2FsbCDlpITnkIblrZjlgqjnsbtcbiAqIOWcqOWRvOWHuuaIluWRvOWFpemYtuauteeahCBjYWxsIOi/m+ihjOacrOWcsOWtmOWCqO+8jOato+W4uOe7k+adn+WQjua4hemZpFxuICog5byC5bi457uT5p2f5ZCO77yM5pys5Zyw5Y+W5pyq5riF6Zmk55qEIGNhbGxJZCwg6YCa6L+H5pyN5Yqh5o6l5Y+j5riF6Zmk5byC5bi457uT5p2f55qEIGNhbGwgLOmYsuatouaXoOazleWRvOWHuuaIluWRvOWFpVxuICovXG5leHBvcnQgY2xhc3MgQWJub3JtYWxDYWxsIHtcbiAgcHJpdmF0ZSBfbG9jYWxTdG9yZSE6IElTdG9yYWdlXG5cbiAgcHJpdmF0ZSBfaW5kZXhEQlN0b3JlITogUkNDYWxsSW5kZXhEQlxuXG4gIHByaXZhdGUgX3N0b3JlS2V5OiBzdHJpbmcgPSAnQ2FsbEJXX0Fibm9ybWFsQ2FsbCdcblxuICBwcml2YXRlIF9pc1N1cHBvcnRJbmRleERCOiBib29sZWFuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA9IFJDQ2FsbEluZGV4REIuaXNTdXBwb3J0KCk7XG4gICAgaWYgKHRoaXMuX2lzU3VwcG9ydEluZGV4REIpIHtcbiAgICAgIFJDQ2FsbEluZGV4REIuaW5pdCh0aGlzLl9sb2dnZXIsIHtcbiAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlID0gUkNDYWxsSW5kZXhEQi5nZXRJbnN0YW5jZSgpITtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9sb2NhbFN0b3JlID0gX3J1bnRpbWUubG9jYWxTdG9yYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIOa3u+WKoOW8guW4uCBjYWxsSWRcbiAgICovXG4gIHB1YmxpYyBhZGRBYm5vcm1hbGxDYWxsSWQodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgYWRkRnVuYyA9IHRoaXMuX2lzU3VwcG9ydEluZGV4REIgPyB0aGlzLl9hZGRCeUluZGV4REIgOiB0aGlzLl9hZGRCeUxvY2FsU3RvcmU7XG4gICAgYWRkRnVuYy5jYWxsKHRoaXMsIHVzZXJJZCwgY2FsbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTlvILluLggY2FsbElkXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQWJub3JtYWxDYWxsSWRzKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHJlbW92ZUZ1bmMgPSB0aGlzLl9pc1N1cHBvcnRJbmRleERCID8gdGhpcy5fcmVtb3ZlQnlJbmRleERCIDogdGhpcy5fcmVtb3ZlQnlMb2NhbFN0b3JlO1xuICAgIHJlbW92ZUZ1bmMuY2FsbCh0aGlzLCB1c2VySWQsIGNhbGxJZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW8guW4uOe7k+adn+eahCBjYWxsSWQg5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgZ2V0QWJub3JtYWxDYWxsSWRzKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBjb25zdCBnZXRGdW5jID0gdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA/IHRoaXMuX2dldEJ5SW5kZXhEQiA6IHRoaXMuX2dldEJ5TG9jYWxTdG9yZTtcbiAgICByZXR1cm4gZ2V0RnVuYy5jYWxsKHRoaXMsIHVzZXJJZCk7XG4gIH1cblxuICBwcml2YXRlIF9hZGRCeUxvY2FsU3RvcmUodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGxldCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIHVzZXJBYm5vcm1hbENhbGxJZHMucHVzaChjYWxsSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcyA9IFtjYWxsSWRdO1xuICAgICAgfVxuICAgICAgb2JqU3RvcmVbdXNlcklkXSA9IHVzZXJBYm5vcm1hbENhbGxJZHM7XG4gICAgICB0aGlzLl9sb2NhbFN0b3JlLnNldEl0ZW0odGhpcy5fc3RvcmVLZXksIEpTT04uc3RyaW5naWZ5KG9ialN0b3JlKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2FkZEJ5TG9jYWxTdG9yZSBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVCeUxvY2FsU3RvcmUodXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGxldCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIHVzZXJBYm5vcm1hbENhbGxJZHMgPSB1c2VyQWJub3JtYWxDYWxsSWRzLmZpbHRlcigoaWQpID0+ICFjYWxsSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBvYmpTdG9yZVt1c2VySWRdID0gdXNlckFibm9ybWFsQ2FsbElkcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmUuc2V0SXRlbSh0aGlzLl9zdG9yZUtleSwgSlNPTi5zdHJpbmdpZnkob2JqU3RvcmUpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfcmVtb3ZlQnlMb2NhbFN0b3JlIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10gfCBudWxsPiB7XG4gICAgbGV0IGNhbGxJZHMgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvYmpTdG9yZTogSU9ialN0b3JlID0gPElPYmpTdG9yZT5KU09OLnBhcnNlKHRoaXMuX2xvY2FsU3RvcmUuZ2V0SXRlbSh0aGlzLl9zdG9yZUtleSkgfHwgJ3t9Jyk7XG4gICAgICBjb25zdCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIGNhbGxJZHMgPSB1c2VyQWJub3JtYWxDYWxsSWRzO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9nZXRCeUxvY2FsU3RvcmUgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FsbElkcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9hZGRCeUluZGV4REIodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLl9pbmRleERCU3RvcmUucmVhZEJ5S2V5PElTdG9yZVZhbD4odGhpcy5fc3RvcmVLZXksIHVzZXJJZCk7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmNhbGxJZHMucHVzaChjYWxsSWQpO1xuICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUudXBkYXRlQnlLZXkodGhpcy5fc3RvcmVLZXksIHVzZXJJZCwge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBjYWxsSWRzOiBkYXRhLmNhbGxJZHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlLmFkZFZhbHVlKHRoaXMuX3N0b3JlS2V5LCB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIGNhbGxJZHM6IFtjYWxsSWRdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfYWRkQnlJbmRleERCIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlbW92ZUJ5SW5kZXhEQih1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEuY2FsbElkcyA9IGRhdGEuY2FsbElkcy5maWx0ZXIoKGlkKSA9PiAhY2FsbElkcy5pbmNsdWRlcyhpZCkpO1xuICAgICAgICBpZiAoZGF0YS5jYWxsSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUudXBkYXRlQnlLZXkodGhpcy5fc3RvcmVLZXksIHVzZXJJZCwge1xuICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgY2FsbElkczogZGF0YS5jYWxsSWRzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS5yZW1vdmVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9yZW1vdmVCeUluZGV4REIgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0QnlJbmRleERCKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBsZXQgZGF0YSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLl9pbmRleERCU3RvcmUucmVhZEJ5S2V5PElTdG9yZVZhbD4odGhpcy5fc3RvcmVLZXksIHVzZXJJZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2dldEJ5SW5kZXhEQiBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHJldHVybiBkYXRhLmNhbGxJZHM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCIvKipcbiAqIOS6i+S7tuexu+Wei1xuICovXG5leHBvcnQgZW51bSBDYWxsU2VydmVyRXZlbnRUeXBlIHtcbiAgLyoqXG4gICAqIOaPkOekuueql+WPo1xuICAgKi9cbiAgUFJPTVBUID0gMCxcbiAgLyoqXG4gICAqIENhbGxTZXJ2ZXIg5LiL5Y+R6YCa6K+d5pe26ZW/5Y+Y5pu057G75Z6LXG4gICAqL1xuICBDQUxMX0RVUkFUSU9OID0gMTAsXG4gIC8qKlxuICAgKiDmlLbliLDov5znq6/nrKzkuIDluKfml7bpl7RcbiAgICovXG4gIEZJUlNUX0ZSQU1FID0gMjAsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzSW5uZXJDb2RlIHtcbiAgU1VDQ0VTUyA9IDAsXG4gIC8qKlxuICAgKiDml6DmlYjnmoTlk43lupTml7bpl7TvvIjmjqXlj6Plk43lupTml7bpl7Tov4fplb/vvIlcbiAgICovXG4gIElOVkFMSURfUkVTUE9OU0VfVElNRSA9IDgwMTcwLFxuICAvKipcbiAgICog6Z2e5pyA5LyY5ZON5bqU5pe26Ze0XG4gICAqL1xuICBOT05PUFRJTUFMX1JFU19USU1FID0gODAxNzEsXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbEVuZ2luZSB9IGZyb20gJy4uL1JDQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5pbXBvcnQgeyB0aW1lclNldFRpbWVvdXQgfSBmcm9tICcuLi91dGlscy90aW1lcnMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbm5lckNvZGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxQbHVzSW5uZXJDb2RlJztcblxuLyoqXG4gKiDmoKHml7bmqKHlnZdcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVDb3JyZWN0aW9uZXIge1xuICAvKipcbiAgICog5o6l5Y+j5ZON5bqU5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIF9SVFQ6IG51bWJlciA9IDBcblxuICAvKipcbiAgICog5Y+v55So55qE5o6l5Y+j5ZON5bqU5pe26Ze05LiL6ZmQ77yI5Y2V5L2NOiBtc++8iVxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRNaW5SVFQ6IG51bWJlciA9IDIwMFxuXG4gIC8qKlxuICAgKiDlj6/nlKjnmoTmjqXlj6Plk43lupTml7bpl7TkuIrpmZDvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF92YWxpZE1heFJUVDogbnVtYmVyID0gMTAwMFxuXG4gIC8qKlxuICAgKiDkuI4gY2FsbFNlcnZlciDnmoTml7bpl7TlgY/lt67ml7bpl7TvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF9kZWx0YVRpbWU6IG51bWJlciA9IDBcblxuICAvKipcbiAgICogdGltZXJJZFxuICAgKi9cbiAgcHJpdmF0ZSBfdGltZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog6L2u6K6t5pe26Ze06Ze06ZqU77yI5Y2V5L2NOiBtc++8iVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaW50ZXJ2YWw6IG51bWJlciA9IDIgKiAxMDAwXG5cbiAgLyoqXG4gICAqIOacgOWkp+mHjeivleasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4UmV0cnlUaW1lczogbnVtYmVyID0gOFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NpbmdsZUNhbGxEdXJhdGlvbkV2OiAoY2FsbElkOiBzdHJpbmcsIGNsaWVudFN0YXJ0VGltZTogbnVtYmVyLCBjbGllbnRGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpID0+IHZvaWQsXG4gICkge1xuXG4gIH1cblxuICAvKipcbiAgICog5LuO5pyN5Yqh56uv6I635Y+W6YCa6K+d5pe26ZW/44CB6YCa6K+d5byA5aeL5pe26Ze0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbENsaWVudFRpbWVCeVNlcnZlcihjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXIsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgaWYgKCF0aGlzLl9SVFQgfHwgdGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2dldERlbHRhVGltZSh0cmFjZUlkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBgY29kZTogJHtSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxUaW1lSW5mbyhjYWxsSWQsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUiwgYGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0YXJ0VGltZTogc2VydmVyU3RhcnRUaW1lIH0gPSBkYXRhITtcbiAgICBjb25zdCBjbGllbnRTdGFydFRpbWUgPSBNYXRoLmZsb29yKHNlcnZlclN0YXJ0VGltZSAtIHRoaXMuX2RlbHRhVGltZSk7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBkdXJhdGlvbiA9IChjdXJyZW50VGltZSArIHRoaXMuX2RlbHRhVGltZSAtIHNlcnZlclN0YXJ0VGltZSkgLyAxMDAwO1xuXG4gICAgaWYgKGR1cmF0aW9uIDwgMCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUCwgYGludmFsaWQgZHVyYXRpb246ICR7ZHVyYXRpb259YCwgdHJhY2VJZCk7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgLy8g5ZCR5LiL5Y+W5pW0XG4gICAgZHVyYXRpb24gPSBNYXRoLmZsb29yKGR1cmF0aW9uKTtcblxuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1pblJUVCAmJiB0aGlzLl9SVFQgPD0gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBgY29kZTogJHtSQ0NhbGxQbHVzSW5uZXJDb2RlLk5PTk9QVElNQUxfUkVTX1RJTUV9YCwgdHJhY2VJZCk7XG4gICAgICAvLyByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLk5PTk9QVElNQUxfUkVTX1RJTUUsIGR1cmF0aW9uLCBjbGllbnRTdGFydFRpbWUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgICAgc2VydmVyU3RhcnRUaW1lLFxuICAgICAgY2xpZW50U3RhcnRUaW1lLFxuICAgICAgZHVyYXRpb24sXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGUsIGR1cmF0aW9uLCBjbGllbnRTdGFydFRpbWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm7TmjqXorqHnrpflrqLmiLfnq6/lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBjYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZDogc3RyaW5nLCBzdGFydFRpbWU6IG51bWJlciwgdHJhY2VJZDogc3RyaW5nKTogeyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLCBjbGllbnRTdGFydFRpbWU/OiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9DQUxDX0NMSUVOVF9TVEFSVF9USU1FX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfSwgc3RhcnRUaW1lOiAke3N0YXJ0VGltZX1gLCB0cmFjZUlkKTtcbiAgICBpZiAodGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUV9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDlho3mrKHph43mlrDojrflj5YgUlRUIOW5tumHjeaWsOiuoeeul+W8gOWni+aXtumXtFxuICAgICAgdGhpcy5fbG9vcENvcnJlY3RDbGllbnRUaW1lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3Ioc3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcnR0OiB0aGlzLl9SVFQsXG4gICAgICBkZWx0YVQ6IHRoaXMuX2RlbHRhVGltZSxcbiAgICAgIHN0YXJ0VDogc3RhcnRUaW1lLFxuICAgICAgY2xpZW50U3RhcnRUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1pblJUVCkge1xuICAgICAgLy8g6YeN572uIGNhbGwg5Lit6YeN6K+V5qyh5pWwXG4gICAgICB0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID0gMDtcbiAgICAgIC8vIOWGjeasoemHjeaWsOiOt+WPliBSVFQg5bm26YeN5paw6K6h566X5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLlNVQ0NFU1MsIGNsaWVudFN0YXJ0VGltZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnRUaW1lcyA9IDA7XG5cbiAgLyoqXG4gICAqIOW8gOWni+WumuaXtumAkuW9kuiOt+WPluS4jiBDYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruWAvFxuICAgKi9cbiAgcHVibGljIHN0YXJ0KHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl90aW1lcklkIHx8IHRoaXMuX3N0YXJ0VGltZXMgPj0gdGhpcy5fbWF4UmV0cnlUaW1lcykge1xuICAgICAgLy8g6Ziy5q2i6YeN5aSN5ZCv5YqoXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TVEFSVF9PLCBgdGltZXJJZDogJHt0aGlzLl90aW1lcklkfWApO1xuXG4gICAgdGhpcy5fc3RhcnRUaW1lcysrO1xuXG4gICAgLy8g6I635Y+WXG4gICAgdGhpcy5fZ2V0RGVsdGFUaW1lKHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl90aW1lcklkID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhcnQodHJhY2VJZCk7XG4gICAgfSwgdGhpcy5faW50ZXJ2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWBnOatouWumuaXtui9ruiurVxuICAgKi9cbiAgcHVibGljIHN0b3AodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TVE9QX08sIGB0aW1lcklkOiAke3RoaXMuX3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gICAgdGhpcy5fdGltZXJJZCAmJiBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJJZCk7XG4gICAgdGhpcy5fdGltZXJJZCA9IG51bGw7XG4gICAgLy8g6YeN572u5qyh5pWwXG4gICAgdGhpcy5fc3RhcnRUaW1lcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICog6YeN5paw5a6a5pe26L2u6K6tXG4gICAqL1xuICBwdWJsaWMgcmVzdGFydCh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1JFU1RBUlRfTywgYGxlZ2FsIHJ0dCB0aW1lLCBSVFQ6ICR7dGhpcy5fUlRUfSwgdmFsaWRNaW5SVFQ6ICR7dGhpcy5fdmFsaWRNaW5SVFR9YCwgdHJhY2VJZCk7XG4gICAgaWYgKHRoaXMuX1JUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOa4hemZpOW9k+WJjeato+WcqOi/m+ihjOeahFxuICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICAvLyDph43mlrDlkK/liqhcbiAgICB0aGlzLnN0YXJ0KHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGdldExvY2FsRGVsYXlUaW1lKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RlbHRhVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSVFQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fUlRUO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS4jiBDYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruWAvO+8jOmdnumAmuivneS4reeahOiuoeeul1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0RGVsdGFUaW1lKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIGRlbGF5VGltZT86IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YTogc3luY1RpbWUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJUVCA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG5cbiAgICAvLyDlsI/kuo4gMTAwMG1zIOS4uuWPr+eUqCBydHRcbiAgICBpZiAoKGN1cnJlbnRSVFQgPCB0aGlzLl9SVFQgfHwgdGhpcy5fUlRUID09PSAwKSAmJiBjdXJyZW50UlRUIDw9IHRoaXMuX3ZhbGlkTWF4UlRUKSB7XG4gICAgICB0aGlzLl9SVFQgPSBjdXJyZW50UlRUO1xuICAgIH1cblxuICAgIC8vIOWPquacieWwj+S6jiAyMDBtcyDlgZzmraLojrflj5ZcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDlsI/kuo7mnIDlsI/lj6/nlKggcnR077yM5YGc5q2i6L2u6K6t6K6h566XXG4gICAgICB0aGlzLnN0b3AodHJhY2VJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGVsdGFUaW1lID0gKHN5bmNUaW1lISAtIHN0YXJ0VGltZSkgLSB0aGlzLl9SVFQgLyAyO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIHJldHVybiB7IGNvZGUsIGRlbGF5VGltZTogdGhpcy5fZGVsdGFUaW1lIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6I635Y+W5byA5aeL5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXREZWx0YVRpbWVJbkNhbGwoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLCBjbGllbnRTdGFydFRpbWU/OiBudW1iZXIsIGNsaWVudEZpcnN0RnJhbWVUaW1lPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsVGltZUluZm8oY2FsbElkLCB0cmFjZUlkKTtcbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJUVCA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG5cbiAgICAvLyDlsI/kuo4gMTAwMG1zIOS4uuWPr+eUqCBydHRcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX1JUVCkge1xuICAgICAgdGhpcy5fUlRUID0gY3VycmVudFJUVDtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWx0YVRpbWUgPSAoZGF0YSEuc3luY1RpbWUgLSBzdGFydFRpbWUpIC0gdGhpcy5fUlRUIC8gMjtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfU0VUX0RFTFRBX1RJTUVfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2FsbElkLFxuICAgICAgcnR0OiB0aGlzLl9SVFQsXG4gICAgICBkZWx0YVQ6IHRoaXMuX2RlbHRhVGltZSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBjbGllbnRTdGFydFRpbWUgPSBNYXRoLmZsb29yKGRhdGEhLnN0YXJ0VGltZSAtIHRoaXMuX2RlbHRhVGltZSk7XG4gICAgY29uc3QgY2xpZW50Rmlyc3RGcmFtZVRpbWUgPSBNYXRoLmZsb29yKGRhdGEhLmZpcnN0RnJhbWV0aW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcblxuICAgIC8vIOWPquacieWwj+S6jiAyMDBtcyDlgZzmraLojrflj5ZcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDmnIDkvJjnu5PmnpzvvIzlgZzmraLova7orq3orqHnrpdcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUywgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9O1xuICAgIH1cbiAgICAvLyDpnZ7mnIDkvJjnu5PmnpxcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSwgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmV0cnlUaW1lc0luQ2FsbDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX21heFJldHJ5VGltZXNJbkNhbGw6IG51bWJlciA9IDNcblxuICAvKipcbiAgICog5aSa5qyh5qCh5q2j5oqb57uZ5Lia5Yqh5bGC55qE6YCa6K+d5byA5aeL5pe26Ze044CB6aaW5bin5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOWFiOWBnOatouacque7k+adn+eahOiuoeeul1xuICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUsIGNsaWVudFN0YXJ0VGltZSwgY2xpZW50Rmlyc3RGcmFtZVRpbWUgfSA9IGF3YWl0IHRoaXMuX2dldERlbHRhVGltZUluQ2FsbChjYWxsSWQsIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU31gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOe7k+aenOacgOS8mO+8jOaKm+e7meW6lOeUqOWxguW8gOWni+aXtumXtFxuICAgICAgdGhpcy5fc2luZ2xlQ2FsbER1cmF0aW9uRXYoY2FsbElkLCBjbGllbnRTdGFydFRpbWUhLCBjbGllbnRGaXJzdEZyYW1lVGltZSEsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmV0cnlUaW1lc0luQ2FsbCA+IHRoaXMuX21heFJldHJ5VGltZXNJbkNhbGwgJiYgY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfTE9PUF9DT1JSRUNUX0NMSU5FVF9USU1FX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FfWAsIHRyYWNlSWQpO1xuICAgICAgLy8g6Z2e5pyA5LyY57uT5p6c77yM5oqb57uZ5bqU55So5bGC5byA5aeL5pe26Ze077yM5qC55o2u6YeN6K+V5qyh5pWw6L+b6KGM6YeN6K+VOyDph43or5UgMyDmrKHlkI7lho3mipvlh7rkuLvopoHmmK/kuLrkuobojrflj5bmnIDlsI8gUlRUXG4gICAgICB0aGlzLl9zaW5nbGVDYWxsRHVyYXRpb25FdihjYWxsSWQsIGNsaWVudFN0YXJ0VGltZSEsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID4gdGhpcy5fbWF4UmV0cnlUaW1lc0luQ2FsbCkge1xuICAgICAgLy8g5peg5pyA5LyY57uT5p6c77yM5bqU55So5bGC5qC55o2u6Ieq5bex55qE5pe26Ze06LWw6KGoLCDnm7jlvZPkuo4gUlRUIOaMiSAwIOWkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JldHJ5VGltZXNJbkNhbGwrKztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH0sIHRoaXMuX2ludGVydmFsKTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gRm9yd2FyZFR5cGUge1xuICAvKipcbiAgICog6YCa6L+H5LiL5LiA5qyh5Lq65ZGY54q25oCBIHVzZXJTdGF0ZSDnmoTkuIvlj5HlkIzmraXluKbkuIvljrtcbiAgICovXG4gIFNPT05fQUZFVEVSID0gMCxcbiAgLyoqXG4gICAqIOeri+WNs+i9rOWPkVxuICAgKi9cbiAgQ1VSUkVOVCA9IDEsXG59XG4iLCJpbXBvcnQgeyBSQ0NhbGxQbHVzTWVkaWFUeXBlLCBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuXG5leHBvcnQgZW51bSBSQ0NhbGxQbHVzSW52aXRlU291cmNlIHtcbiAgUFVCX0lOVklURV9DQUxMID0gMCxcbiAgUFVMTF9LVl9JTlZJVEVfQ0FMTCA9IDEsXG4gIFNZU1RFTV9QVVNIID0gMixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU3RhdGlzdGljc0RhdGEge1xuICAvKipcbiAgICog5LiK5oql5pe26Ze0XG4gICAqL1xuICB0aW1lOiBudW1iZXIsXG4gIC8qKlxuICAgKiDov5DokKXllYbvvIzkvovlpoIg5Lit5Zu96IGU6YCaXG4gICAqL1xuICBjcjogc3RyaW5nLFxuICAvKipcbiAgICog572R57uc57G75Z6L77yM5L6L5aaCIDRHXG4gICAqL1xuICBuZXQ6IHN0cmluZyxcbiAgLyoqXG4gICAqIHVzZXJJZFxuICAgKi9cbiAgdWlkOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDplJnor6/noIFcbiAgICovXG4gIGNvZDogbnVtYmVyLFxuICAvKipcbiAgICog6LCD55So5omn6KGM5pe26ZW/XG4gICAqL1xuICBkdXI6IG51bWJlclxuICAvKipcbiAgICog5aqS5L2T57G75Z6LXG4gICAqL1xuICBtdHA6IFJDQ2FsbFBsdXNNZWRpYVR5cGVcbiAgLyoqXG4gICAqIOmAmuivneexu+Wei++8jOengeiBiuaIlue+pOiBilxuICAgKi9cbiAgY3RwOiBSQ0NhbGxQbHVzVHlwZVxuICAvKipcbiAgICogY2FsbElkXG4gICAqL1xuICBjaWQ6IHN0cmluZ1xuICAvKipcbiAgICogY2xpZW50IGNhbGxJZFxuICAgKi9cbiAgY2NpZDogc3RyaW5nLFxuICAvKipcbiAgICog6YKA6K+35o6l5pS25p2l5rqQXG4gICAqL1xuICByZjogUkNDYWxsUGx1c0ludml0ZVNvdXJjZVxufVxuIiwiZXhwb3J0IGVudW0gUkNDYWxsRGlyZWN0aW9uIHtcbiAgLyoqXG4gICAqIOWRvOWHulxuICAgKi9cbiAgT1VUID0gLTEsXG4gIC8qKlxuICAgKiDnvqTlkbxcbiAgICovXG4gIEdST1VQID0gMCxcbiAgLyoqXG4gICAqIOWRvOWFpVxuICAgKi9cbiAgSU4gPSAxXG59XG4iLCJpbXBvcnQge1xuICBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyLCBJUnVudGltZSwgUGx1Z2luQ29udGV4dCwgUkNDb25uZWN0aW9uU3RhdHVzLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuL2VudW1zL0RpYWxvZ0FjdGlvbic7XG5pbXBvcnQgeyBEaWFsb2dUeXBlIH0gZnJvbSAnLi9lbnVtcy9EaWFsb2dUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7IFNlY3JldENhbGxUeXBlIH0gZnJvbSAnLi9lbnVtcy9TZWNyZXRDYWxsVHlwZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvSUluZGV4JztcbmltcG9ydCB7XG4gIElBY2NlcHRJbmZvLFxuICBJQWNjZXB0T3B0cyxcbiAgSUNhbGxJZCxcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxuICBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXMsXG4gIElDYW5jZWxDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJR2V0Q2FsbExvZ0xpc3RPcHRzLFxuICBJR2V0Q2FsbFNlc3Npb25SZXMsXG4gIElIYW5ndXBJbmZvLFxuICBJSW52aXRlT3B0cyxcbiAgSUludml0ZVJlcyxcbiAgSUpvaW5DYWxsT3B0cyxcbiAgSU90aGVyTWVtSW5mbyxcbiAgSVJlcUNoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElSZXFDaGFuZ2VNZWRpYVR5cGVSZXMsXG4gIElSZXNDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJU2Vzc2lvblVzZXIsXG4gIElTdGFydENhbGxPcHRzLFxuICBJU3RhcnRDYWxsUmVzdWx0LFxuICBJSGFuZ3VwRm9yQnVzeU9wdHMsXG4gIElDaGFuZ2VNZWRpYVR5cGVJbmZvLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQge1xuICBJQ2FsbFNlc3Npb25Vc2VyLFxuICBJRGlhbG9nRG93bkNhbGxDb24sXG4gIElFdmVudERvd25DYWxsQ29uLFxuICBJR2V0Q2FsbFRpbWVJbmZvUmVzLFxuICBJR2V0RGVsYXlUaW1lSW5mb1JlcyxcbiAgSVB1YkNhbGxMb2csXG4gIElQdWJJbnZpdGVDb24sXG4gIElTdGF0dXNEb3duQ29udCxcbiAgSVN5c1N0YXR1c1VwT3B0cyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBDYWxsVGltZXJFdmVudFR5cGUsIFJDQ2FsbElubmVyU2Vzc2lvbiB9IGZyb20gJy4vbW9kdWxlcy9SQ0NhbGxJbm5lclNlc3Npb24nO1xuaW1wb3J0IHsgU2lnbmFsVHJhbnNwb3J0ZXIgfSBmcm9tICcuL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXInO1xuaW1wb3J0IHsgcGFyc2VTdGF0dXNEYXRhLCB0cmFuMkNhbGxMb2cgfSBmcm9tICcuL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgeyBnZXRVVUlEMjIgfSBmcm9tICcuL3V0aWxzL3JhbmRvbSc7XG5pbXBvcnQgeyB0aW1lclNldFRpbWVvdXQgfSBmcm9tICcuL3V0aWxzL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQgeyBBYm5vcm1hbENhbGwgfSBmcm9tICcuL21vZHVsZXMvQWJub3JtYWxDYWxsJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJFdmVudFR5cGUgfSBmcm9tICcuL2VudW1zL0NhbGxTZXJ2ZXJFdmVudFR5cGUnO1xuaW1wb3J0IHsgVGltZUNvcnJlY3Rpb25lciB9IGZyb20gJy4vbW9kdWxlcy9UaW1lQ29ycmVjdGlvbmVyJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uIH0gZnJvbSAnLi9tb2R1bGVzL1JDQ2FsbFBsdXNTZXNzaW9uJztcbmltcG9ydCB7IEZvcndhcmRUeXBlIH0gZnJvbSAnLi9lbnVtcy9Gb3J3YXJkVHlwZSc7XG5pbXBvcnQge1xuICBDYWxsSG9va3NUeXBlLCBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbiwgUHViSW52aXRlQ2FsbE1pc3NSZWZlcixcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lDYWxsSG9va3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUsIFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0ludml0ZVNvdXJjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB9IGZyb20gJy4vbW9kdWxlcy9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcbmltcG9ydCB7IFJDQ2FsbERpcmVjdGlvbiB9IGZyb20gJy4vZW51bXMvUkNDYWxsRGlyZWN0aW9uJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbm5lckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNJbm5lckNvZGUnO1xuXG5jb25zdCBDQUxMX1RJTUVfT1VUID0gNjAgKiAxMDAwO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsRW5naW5lIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc3RhdGljIF9fSU5ORVJfU0VTU0lPTl9DTE9TRV9fOiBzdHJpbmcgPSAnaW5uZXItc2Vzc2lvbi1jbG9zZSdcblxuICBzdGF0aWMgX19JTk5FUl9TRVNTSU9OX0NPTk5FQ1RfXzogc3RyaW5nID0gJ2lubmVyLXNlc3Npb24tY29ubmVjdCdcblxuICBzdGF0aWMgX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fOiBzdHJpbmcgPSAnaW5uZXItY2hhbmdlLW1lZGlhLXR5cGUnXG5cbiAgc3RhdGljIF9fSU5ORVJfSU5WSVRFX186IHN0cmluZyA9ICdpbm5lci1pbnZpdGUnXG5cbiAgLyoqXG4gICAqIOS4uyBzZXNzaW9uXG4gICAqL1xuICBfbWFpblNlc3Npb246IFJDQ2FsbElubmVyU2Vzc2lvbiB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOWcqOmAmuivneS4reaUtuWIsOeahCDpgoDor7cgc2Vzc2lvblxuICAgKi9cbiAgX2hvbGRTZXNzaW9uczogUkNDYWxsSW5uZXJTZXNzaW9uW10gPSBbXVxuXG4gIC8qKlxuICAgKiDkv6Hku6TmqKHlnZdcbiAgICovXG4gIF9zaWduYWxNb2R1bGU6IFNpZ25hbFRyYW5zcG9ydGVyXG5cbiAgLyoqXG4gICAqIOW8guW4uOe7k+adnyBjYWxsIOWkhOeQhuWZqFxuICAgKi9cbiAgX2Fibm9ybWFsTW9kdWxlOiBBYm5vcm1hbENhbGxcblxuICAvKipcbiAgICog6K6w5b2V5Y2V5ZG85Lit77yM5piv5ZCm5LiK5oql6L+H56ys5LiA5binXG4gICAqIOe9riB0cnVlIOaXtuacuu+8muaUtuWIsOi/nOerr+esrOS4gOW4p++8jOaIkOWKn+S4iuaKpSBTZXJ2ZXJcbiAgICog572uIGZhbHNlIOaXtuacuu+8mumAmuivnee7k+adn1xuICAgKi9cbiAgcHJpdmF0ZSBfaXNVcEZpcnN0RnJhbWVUaW1lOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog6YCa6K+d5Li6IE9OQ0FMTCDml7bvvIxTREsg6ZyA57uZ5Lia5Yqh5bGC5LiK5oql6YCa6K+d5byA5aeL6K6h5pe25LqL5Lu2XG4gICAqIOS8muaUtuWIsOWkmuasoSBPTkNBTEzvvIzmiYDku6XpnIDopoHmoIfor4bmmK/lkKblt7Lmipvov4fkuovku7ZcbiAgICovXG4gIHByaXZhdGUgX2NhbGxTdGFydE1hcDoge1xuICAgIFtjYWxsSWQ6IHN0cmluZ106IHtcbiAgICAgIGlzUmVjZWl2ZUNhbGxTdGFydFRpbWU6IGJvb2xlYW4sXG4gICAgfVxuICB9ID0ge31cblxuICAvKipcbiAgICog5qCh5pe25ZmoXG4gICAqL1xuICBfdGltZUNvcnJlY3Rpb25lcjogVGltZUNvcnJlY3Rpb25lclxuXG4gIC8qKlxuICAgKiDmnoTpgKDlmahcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlcG9ydEFwcEV2ZW50TW9kdWxlOiBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIgPSBuZXcgVGltZUNvcnJlY3Rpb25lcih0aGlzLCBfbG9nZ2VyLCB0aGlzLl9vblJlY3ZTaW5DYWxsRHVyYXRpb24uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fc2lnbmFsTW9kdWxlID0gbmV3IFNpZ25hbFRyYW5zcG9ydGVyKF9jb250ZXh0LCBfcnVudGltZSwgX2luaXRPcHRzLCB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLCB0aGlzLl9sb2dnZXIpO1xuICAgIHRoaXMuX3NpZ25hbE1vZHVsZS5yZWdpc3Rlckxpc3RlbmVyKHtcbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuICAgICAgb25TdGF0dXNEb3duOiB0aGlzLl9vblN0YXR1c0Rvd24uYmluZCh0aGlzKSxcbiAgICAgIG9uT3RoZXJDbGllbnRTdGF0dXNEb3duOiB0aGlzLl9vbk90aGVyQ2xpZW50U3RhdHVzRG93bi5iaW5kKHRoaXMpLFxuICAgICAgb25FdmVudERvd246IHRoaXMuX29uRXZlbnREb3duLmJpbmQodGhpcyksXG4gICAgICBvblN3aXRjaE1lZGlhVHlwZTogdGhpcy5fb25Td2l0Y2hNZWRpYVR5cGUuYmluZCh0aGlzKSxcbiAgICAgIG9uUmVjdkNhbGxFbmRMb2c6IHRoaXMuX29uUmVjdkNhbGxFbmRMb2cuYmluZCh0aGlzKSxcbiAgICAgIG9uSU1TdGF0ZUNoYW5nZTogdGhpcy5fb25JTVN0YXRlQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgdGhpcy5fYWJub3JtYWxNb2R1bGUgPSBuZXcgQWJub3JtYWxDYWxsKF9ydW50aW1lLCBfbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5Hotbflkbzlj6tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdGFydENhbGwob3B0czogSVN0YXJ0Q2FsbE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN1bHR9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbFR5cGUsIG1lZGlhVHlwZSwgdG9Vc2VycywgdGFyZ2V0SWQsIHRhcmdldFR5cGUsIG9sZFJvb21JZCxcbiAgICB9ID0gb3B0cztcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5zdGFydENhbGwoe1xuICAgICAgY2xpZW50Q2FsbElkOiBvcHRzLmNhbGxJZCxcbiAgICAgIGNhbGxUeXBlLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgdG9Vc2VycyxcbiAgICAgIHNlY3JldENoYXQ6IFNlY3JldENhbGxUeXBlLk5PUk1BTCxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG9sZFJvb21JZCxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjYWxsSWQsIGJ1c3lsaW5lVXNlcnMgfSA9IGRhdGEhO1xuXG4gICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5hZGRBYm5vcm1hbGxDYWxsSWQoY3VycmVudFVzZXJJZCwgY2FsbElkKTtcblxuICAgIC8vIOeUn+aIkOS4uyBzZXNzaW9uXG4gICAgdGhpcy5fbWFpblNlc3Npb24gPSBuZXcgUkNDYWxsSW5uZXJTZXNzaW9uKFxuICAgICAgY2FsbElkLFxuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5JTlZJVEVELFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjdXJyZW50VXNlcklkLFxuICAgICAgY3VycmVudFVzZXJJZCxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICk7XG5cbiAgICAvLyDljZXlkbzlkK/liqjlkbzlj6votoXml7borqHml7blmagsIOe+pOWRvOaXoOi2heaXtumAu+i+kVxuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICBjb25zdCBpbnZpdGVyVGltZXJJZCA9IHRoaXMuX3N0YXJ0VGltZXIoZGF0YSEuY2FsbElkLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlVGltZXJJZChDYWxsVGltZXJFdmVudFR5cGUuSU5WSVRFUiwgaW52aXRlclRpbWVySWQpO1xuICAgIH1cblxuICAgIC8vIOmAmuefpeW3seaWueS6uuWRmOeKtuaAgeWPmOabtFxuICAgIGNvbnN0IHNlbGZTdGF0ZSA9IHtcbiAgICAgIHVzZXJJZDogY3VycmVudFVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FMTElORyxcbiAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkNBTExJTkcsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgICBsZXQgaW52aXRlZXNTdGF0ZSA9IHRvVXNlcnMubWFwKCh7IHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSkgPT4gKHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCxcbiAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLklOVklURUQsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgfSkpO1xuXG4gICAgbGV0IGJ1c3lVc2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgIGlmIChidXN5bGluZVVzZXJzKSB7XG4gICAgICBidXN5VXNlcnNTdGF0ZSA9IGJ1c3lsaW5lVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSA9IGludml0ZWVzU3RhdGUuZmluZCgodXNlcikgPT4gdXNlci51c2VySWQgPT09IGl0ZW0udXNlcklkKSE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9SSU5HSU5HLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgLy8g6KKr6YKA6K+36ICF5Lit6ZyA6L+H5ruk5Ye65b+Z56KM55So5oi3XG4gICAgICBpbnZpdGVlc1N0YXRlID0gaW52aXRlZXNTdGF0ZS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IGJ1c3lVc2Vyc1N0YXRlIS5ldmVyeSgoeyB1c2VySWQ6IGJ1c3lVc2VySWQgfSkgPT4gYnVzeVVzZXJJZCAhPT0gdXNlcklkKSk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBbc2VsZlN0YXRlLCAuLi5pbnZpdGVlc1N0YXRlLCAuLi5idXN5VXNlcnNTdGF0ZSFdLCB0cmFjZUlkKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBjb2RlLCBkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6YKA6K+3XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW52aXRlKG9wdHM6IElJbnZpdGVPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJSW52aXRlUmVzfT4ge1xuICAgIC8vIOS4jeWtmOWcqOato+WcqOmAmuivneS4rSBzZXNzaW9uLCDkuI3lhYHorrjpgoDor7dcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9Vc2VycyB9ID0gb3B0cztcblxuICAgIGNvbnN0IGNhbGxJZCA9IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmludml0ZUNhbGwoe1xuICAgICAgY2FsbElkLFxuICAgICAgdG9Vc2VycyxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgaWYgKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgICAvLyDljZXlkbzkuK3pgoDor7fmiJDlip/vvIzljbPmm7TmlrAgY2FsbCBzZXNzaW9uIOmAmuivneexu+Wei+S4uue+pOWRvFxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVDYWxsVHlwZShSQ0NhbGxQbHVzVHlwZS5NVUxUSSk7XG4gICAgICAgIC8vIOmAmuefpSBjYWxsVHlwZSDlj5jmm7TkuLrnvqTlkbxcbiAgICAgICAgdGhpcy5fb25DYWxsVHlwZUNoYW5nZSh0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSwgUkNDYWxsUGx1c1R5cGUuTVVMVEksIHRyYWNlSWQpO1xuICAgICAgfVxuXG4gICAgICAvLyDpgJrnn6XooqvpgoDor7fkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgIGxldCBpbnZpdGVkVXNlcnNTdGF0ZSA9IHRvVXNlcnMubWFwKCh7IHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSkgPT4gKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLklOVklURUQsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcblxuICAgICAgbGV0IGJ1c3lsaW5lVXNlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICAgIGlmIChkYXRhIS5idXN5bGluZVVzZXJzKSB7XG4gICAgICAgIGJ1c3lsaW5lVXNlcnNTdGF0ZSA9IGRhdGEhLmJ1c3lsaW5lVXNlcnM/Lm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSA9IGludml0ZWRVc2Vyc1N0YXRlLmZpbmQoKHVzZXIpID0+IHVzZXIudXNlcklkID09PSBpdGVtLnVzZXJJZCkhO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICAgICAgdXNlclN0YXRlOiBpdGVtLnNlc3Npb25TdGF0dXMsXG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9SSU5HSU5HLFxuICAgICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICAgIHRhcmdldElkLFxuICAgICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpbnZpdGVkVXNlcnNTdGF0ZSA9IGludml0ZWRVc2Vyc1N0YXRlLmZpbHRlcigoeyB1c2VySWQgfSkgPT4gYnVzeWxpbmVVc2Vyc1N0YXRlIS5ldmVyeSgoeyB1c2VySWQ6IGJ1c3lVc2VySWQgfSkgPT4gYnVzeVVzZXJJZCAhPT0gdXNlcklkKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIFsuLi5pbnZpdGVkVXNlcnNTdGF0ZSwgLi4uYnVzeWxpbmVVc2Vyc1N0YXRlXSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUsIGRhdGEgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBiZWZvcmVIYW5ndXBcbiAgICovXG4gIHB1YmxpYyBjbGVhckFsbFRpbWVyKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvLyDmuIXpmaTmiYDmnInotoXml7borqHml7blmahcbiAgICBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZm9yRWFjaCgoc2Vzc2lvbikgPT4ge1xuICAgICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICAgIHNlc3Npb24uZ2V0QWxsVGltZXJJZHMoKS5mb3JFYWNoKCh0aW1lcklkKSA9PiB0aGlzLl9zdG9wVGltZXIuYmluZCh0aGlzKSh0aW1lcklkLCB0cmFjZUlkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqIOmAmuivneivt+axguWPlua2iOOAgemAmuivneaLkue7nVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmd1cChvcHRzOiBJSGFuZ3VwRm9yQnVzeU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmhhbmd1cENhbGwoe1xuICAgICAgY2FsbElkOiBvcHRzLmNhbGxJZCxcbiAgICAgIHN5c1N0YXR1czogb3B0cy5zeXN0ZW1TdGF0ZSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXmlLbpgoDor7dcbiAgICog6YCa6K+d5Lit5Y+I5pS25Yiw5paw5p2l55S15ZCO77yM5o6l5ZCs5paw5p2l55S15pe277yM5b+F6aG75YWI5oyC5pat5LmL5YmN55qE6YCa6K+d77yIbWFpblNlc3Npb27vvIlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY2NlcHQob3B0czogSUFjY2VwdE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKggc2Vzc2lvbiDkuI3lhYHorrjmjqXlkKxcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5hY2NlcHRDYWxsKHsgY2FsbElkOiBvcHRzLmNhbGxJZCB9LCB0cmFjZUlkKTtcblxuICAgIC8vIOa4hemZpOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlZVRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJNb2JpbGVPblBob25lKG9wdHMuY2FsbElkLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5DT05ORUNUSU5HKTtcblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm7TmjqXliqDlhaVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBqb2luQ2FsbChvcHRzOiBJSm9pbkNhbGxPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5YWI5pS25YiwIG9uSW52aXRl77yM5rKh5pyJ5o6l6YCa6L+HIGpvaW5DYWxsIOa4hemZpOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgIHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlZVRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuam9pbkNhbGwoeyBjYWxsSWQ6IG9wdHMuY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5hZGRBYm5vcm1hbGxDYWxsSWQoY3VycmVudFVzZXJJZCwgb3B0cy5jYWxsSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgLy8g5aaC5p6c5LiN5a2Y5ZyoIG1haW5TZXNzaW9uIOS7jiBzZXJ2ZXIg6I635Y+W5b2T5YmN5Yqg5YWl55qEIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuX2NyZWF0ZVNlc3Npb25CeVNlcnZlcihvcHRzLmNhbGxJZCwgdHJ1ZSwgdHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NsZWFyTW9iaWxlT25QaG9uZShvcHRzLmNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWqkuS9k+WPmOabtOivt+axglxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUob3B0czogSVJlcUNoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElSZXFDaGFuZ2VNZWRpYVR5cGVSZXN9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOiwg+eUqFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgZXh0cmFLZXlWYWwgPSB7XG4gICAgICBtZWRpYVR5cGU6IG9wdHMubWVkaWFUeXBlLFxuICAgIH07XG4gICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlUmVxTWVkaWFUeXBlKG9wdHMubWVkaWFUeXBlKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbklkID0gZ2V0VVVJRDIyKCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZGlhbG9nVXBDYWxsKHtcbiAgICAgIHRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgdG9Vc2VySWRzOiBvcHRzLnRvVXNlcklkcyxcbiAgICAgIGRpYWxvZ1R5cGU6IERpYWxvZ1R5cGUuU1dJVENIX01FRElBX1RZUEUsXG4gICAgICBhY3Rpb246IERpYWxvZ0FjdGlvbi5SRVFVRVNULFxuICAgICAgZXh0cmFLZXlWYWwsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCBkYXRhOiB7IHRyYW5zYWN0aW9uSWQgfSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWqkuS9k+exu+Wei+WPmOabtOivt+axguWTjeW6lFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc3BvbnNlQ2hhbmdlTWVkaWFUeXBlKG9wdHM6IElSZXNDaGFuZ2VNZWRpYVR5cGVPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOiwg+eUqFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVxTWVkaWFUeXBlID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0UmVxTWVkaWFUeXBlKCk7XG4gICAgaWYgKG9wdHMuYWdyZWUpIHtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZU1lZGlhVHlwZShyZXFNZWRpYVR5cGUhKTtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZVJlcU1lZGlhVHlwZShudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5kaWFsb2dVcENhbGwoe1xuICAgICAgdHJhbnNhY3Rpb25JZDogb3B0cy50cmFuc2FjdGlvbklkLFxuICAgICAgY2FsbElkOiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgIGRpYWxvZ1R5cGU6IERpYWxvZ1R5cGUuU1dJVENIX01FRElBX1RZUEUsXG4gICAgICBhY3Rpb246IG9wdHMuYWdyZWUgPyBEaWFsb2dBY3Rpb24uQUNDRVBUIDogRGlhbG9nQWN0aW9uLlJFRlVTRSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bmtojpgJror53lqpLkvZPnsbvlnovliIfmjaLor7fmsYJcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYW5jZWxDaGFuZ2VNZWRpYVR5cGUob3B0czogSUNhbmNlbENoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmRpYWxvZ1VwQ2FsbCh7XG4gICAgICB0cmFuc2FjdGlvbklkOiBvcHRzLnRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogRGlhbG9nQWN0aW9uLkNBTkNFTCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCBsb2cg5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbExvZ0xpc3Qob3B0czogSUdldENhbGxMb2dMaXN0T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVJDQ2FsbFBsdXNHZXRDYWxsUmVjb3JkUmVzfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLnN5bmNDYWxsTG9nKHtcbiAgICAgIHVzZXJJZDogY3VycmVudFVzZXJJZCxcbiAgICAgIHN5bmNUaW1lOiBvcHRzLnRpbWVzdGFtcCxcbiAgICAgIGNvdW50OiBvcHRzLmNvdW50LFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIGNvbnN0IGNhbGxMb2c6IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdID0gZGF0YSEuY2FsbExvZ0xpc3QubWFwKChpdGVtKSA9PiB0cmFuMkNhbGxMb2coaXRlbSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGhhc01vcmU6IEJvb2xlYW4oZGF0YT8uaGFzTW9yZSksXG4gICAgICAgIG1heFRpbWU6IGRhdGEhLm1heFRpbWUsXG4gICAgICAgIGxpc3Q6IGNhbGxMb2csXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6YCa6K+d5pel5b+XXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlQ2FsbExvZyhjYWxsSWRzOiBzdHJpbmdbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZGVsZXRlQ2FsbFJlY29yZChjdXJyZW50VXNlcklkLCBjYWxsSWRzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCBzZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBudW1iZXJ9PiB7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlLCBkYXRhOiBkYXRhIS5zeW5jVGltZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIOaXtumXtOS/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbGxUaW1lSW5mbyhjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxUaW1lSW5mb1Jlc30+IHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmdldENhbGxUaW1lSW5mbyhjYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluacque7k+adn+eahOmAmuivneWIl+ihqFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE9wZW5DYWxsTGlzdCh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUkNDYWxsUGx1c0NhbGxSZWNvcmRbXSB9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhOiByZXNEYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0VXNlckNhbGxTdGF0ZUxpc3QodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ID0gcmVzRGF0YSEuY2FsbFN0YXRlTGlzdC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2FsbElkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsaW5nVXNlcklkLCBjYWxsVXNlcklkcywgY2FsbFN0YXR1cywgY3J0VGltZSwgdXNlclNlc3Npb25TdGF0dXMsIHRhcmdldFR5cGUsIHRhcmdldElkLCBzdGFydFRpbWUsIHN5bmNUaW1lLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICBjb25zdCBjYWxsRGlyZWN0aW9uID0gKGNhbGxpbmdVc2VySWQgPT09IGN1cnJlbnRVc2VySWQpID8gUkNDYWxsRGlyZWN0aW9uLk9VVCA6IFJDQ2FsbERpcmVjdGlvbi5JTjtcbiAgICAgIGNvbnN0IHsgY2xpZW50U3RhcnRUaW1lID0gc3RhcnRUaW1lIH0gPSB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmNhbGNDbGllbnRTdGFydFRpbWUoY2FsbElkLCBzdGFydFRpbWUsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgY2FsbERpcmVjdGlvbixcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBjYWxsZXJVc2VySWQ6IGNhbGxpbmdVc2VySWQsXG4gICAgICAgIGNhbGxVc2VySWRzLFxuICAgICAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgICAgIHVzZXJTdGF0ZTogdXNlclNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN0YXJ0VGltZXN0YW1wOiBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWVzdGFtcDogMCxcbiAgICAgICAgZHVyYXRpb246IE1hdGguZmxvb3IoKCtuZXcgRGF0ZSgpIC0gY2xpZW50U3RhcnRUaW1lKSAvIDEwMDApLFxuICAgICAgICBzeW5jVGltZXN0YW1wOiBzeW5jVGltZSxcbiAgICAgICAgc3lzdGVtU3RhdGU6IDAsXG4gICAgICAgIGNyZWF0ZVRpbWVzdGFtcDogY3J0VGltZSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGRhdGE6IGxpc3QsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXpmaTlvZPliY3nlKjmiLfnmoQgY2FsbCBsb2dcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZW1vdmVBbGxDYWxsTG9nKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuY2xlYXJDYWxsUmVjb3JkKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrov4cgY2FsbElkIOiOt+WPliBzZXNzaW9uIOivpue7huS/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXNzaW9uKG9wdHM6IElDYWxsSWQsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRDYWxsU2Vzc2lvblJlc30+IHtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRDYWxsU2Vzc2lvbihvcHRzLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgY2FsbGluZ1VzZXJJZCwgY2FsbFR5cGUsIG1lZGlhVHlwZSwgY2FsbFN0YXR1cywgY2FsbFNlc3Npb25Vc2Vycywgc3RhcnRUaW1lLCBkdXJhdGlvbiwgc3luY1RpbWUsXG4gICAgfSA9IGRhdGEhO1xuICAgIGNvbnN0IHNlc3Npb25Vc2VycyA9IGNhbGxTZXNzaW9uVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3lzU3RhdHVzLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCxcbiAgICAgIH0gPSBpdGVtO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3RhcnRDYWxsZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFR5cGUsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgc2Vzc2lvblN0YXRlOiBjYWxsU3RhdHVzLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzOiBzZXNzaW9uVXNlcnMsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIHN5bmNUaW1lLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldEhvbGRTZXNzaW9uKGNhbGxJZDogc3RyaW5nKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICBjb25zdCBpbm5lclNlc3Npb24gPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZCgoc2Vzc2lvbikgPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIHJldHVybiBpbm5lclNlc3Npb24gPyBuZXcgUkNDYWxsUGx1c1Nlc3Npb24oaW5uZXJTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3kuLsgc2Vzc2lvblxuICAgKi9cbiAgcHVibGljIGdldExvY2FsTWFpblNlc3Npb24oKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWFpblNlc3Npb24gPyBuZXcgUkNDYWxsUGx1c1Nlc3Npb24odGhpcy5fbWFpblNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruS4uyBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZU1haW5TZXNzaW9uU3RhdGUoc3RhdGU6IFJDQ2FsbFBsdXNDYWxsU3RhdGUpIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlU2Vzc2lvblN0YXRlKHN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorrDlvZXmmK/lkKbmmK/mnKznq6/mjILmlq1cbiAgICovXG4gIHB1YmxpYyBzZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0SXNMb2NhbENsaWVudEhhbmd1cChpc0xvY2FsQ2xpZW50SGFuZ3VwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrnn6XkurrlkZjnirbmgIFcbiAgICogQ2FsbENsaWVudCDkuZ/pnIDopoHmm7TmlrDkurrlkZjnirbmgIHvvIzlrprkuYnkuLrlhazlhbHlh73mlbBcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZDogc3RyaW5nLCB1c2VyczogSVNlc3Npb25Vc2VyW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUERBVEVfVVNFUlNfU1RBVEVfTywgYHVwZGF0ZVVzZXJzU3RhdGUgLT4gdXNlcnM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcnMpfWAsIHRyYWNlSWQpO1xuXG4gICAgLy8g5pu05pawIHNlc3Npb24g5Lq65ZGY5YiX6KGoXG4gICAgY29uc3Qgc2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChpdGVtKSA9PiBpdGVtPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcblxuICAgIGNvbnN0IGNoYW5nZWRVc2VycyA9IFtdO1xuICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICBjb25zdCBuZXdVc2VycyA9IHVzZXJzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRVc2VyU3RhdGUgPSBzZXNzaW9uLmdldFVzZXJMaXN0KCkuZmlsdGVyKCh7IHVzZXJJZCB9KSA9PiB1c2VySWQgPT09IGl0ZW0udXNlcklkKVswXSB8fCB7fTtcbiAgICAgICAgY29uc3QgaXNJZGxlID0gaXRlbS51c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEU7XG4gICAgICAgIGNvbnN0IHsgY2FtZXJhRW5hYmxlID0gZmFsc2UsIG1pY3JvcGhvbmVFbmFibGUgPSBmYWxzZSB9ID0gaXNJZGxlID8geyBjYW1lcmFFbmFibGU6IGZhbHNlLCBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSB9IDogb2xkVXNlclN0YXRlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgY2FtZXJhRW5hYmxlLFxuICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgY2hhbmdlZFVzZXJzLnB1c2goLi4uc2Vzc2lvbi51cGRhdGVVc2VyTGlzdChuZXdVc2VycywgdHJhY2VJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFuZ2VkVXNlcnMucHVzaCguLi51c2Vycyk7XG4gICAgfVxuICAgIC8vIOmAmuefpeS6i+S7tlxuICAgIGNoYW5nZWRVc2Vycy5sZW5ndGggPiAwICYmIHRoaXMuX29uVXNlclN0YXRlQ2hhbmdlKGNhbGxJZCwgY2hhbmdlZFVzZXJzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRVc2VyRGV2aWNlRW5hYmxlKHVzZXJJZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIGVuYWJsZTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWFpblNlc3Npb24/LnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBtZWRpYVR5cGUsIGVuYWJsZSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5byA5aeL5pe26Ze0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFN0YXJpbmdUaW1lKG9wdHM6IElDYWxsSWQsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXIsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlcn0+IHtcbiAgICByZXR1cm4gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRDYWxsQ2xpZW50VGltZUJ5U2VydmVyKG9wdHMuY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkurrlkZjns7vnu5/nirbmgIHkuIrmiqVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeXN0ZW1TdGF0dXNVcChvcHRzOiBJU3lzU3RhdHVzVXBPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuc3lzU3RhdHVzVXAob3B0cywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Y2V5ZG85Lit5pS25Yiw6L+c56uv5rWB5ZCO77yM57uZIENhbGxTZXJ2ZXIg5LiK5oql77yM55So5LqO5aSE55CG6K6h5pe26YC76L6RXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBGaXJzdEZyYW1lVGltZSh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3Qgbm9OZWVkVXBDb25kaXRpb24gPSAhdGhpcy5fbWFpblNlc3Npb25cbiAgICAgIHx8ICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsVHlwZSgpICE9PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpXG4gICAgICB8fCB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWU7XG4gICAgaWYgKG5vTmVlZFVwQ29uZGl0aW9uKSB7XG4gICAgICAvLyDkuI3lrZggbWFpblNlc3Npb24g5oiWIOmAmui/h+exu+Wei+S4jeS4uuWNleWRvOaXtu+8jOS4jeS4iuaKpe+8jOebtOaOpei/lOWbnuaIkOWKn1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlbGF5VGltZSA9IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0TG9jYWxEZWxheVRpbWUoKTtcbiAgICBjb25zdCBzdHJlYW1SZWFkeVRpbWUgPSBNYXRoLmZsb29yKG5vdyArIGRlbGF5VGltZSk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX0ZJUlNUX0ZSQU1FX1RJTUVfVCwgYG5vdzogJHtub3d9OyBkZWxheTogJHtkZWxheVRpbWV9OyBzdHJlYW1SZWFkeVRpbWU6ICR7c3RyZWFtUmVhZHlUaW1lfWAsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5faXNVcEZpcnN0RnJhbWVUaW1lID0gdHJ1ZTtcblxuICAgIGNvbnN0IGNhbGxJZCA9IHRoaXMuX21haW5TZXNzaW9uIS5nZXRDYWxsSWQoKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5ldmVudFVwQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICBldmVudFR5cGU6IENhbGxTZXJ2ZXJFdmVudFR5cGUuRklSU1RfRlJBTUUsXG4gICAgICBldmVudEFyZ3M6IHsgc3RyZWFtUmVhZHlUaW1lIH0sXG4gICAgICBldmVudFRpbWU6IERhdGUubm93KCksXG4gICAgfSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfRklSU1RfRlJBTUVfVElNRV9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOS4iuWxguaooeaLnyBzdGF0dXNEb3duQ2FsbCwg57uT5p2fIHNlc3Npb25cbiAgICog6YCa6K+d5bu656uL5ZCO77yM5Y+q6IO957uT5p2fIG1haW5TZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZW5kQ3VycmVudFNlc3Npb24oY3VycmVudFVzZXJTeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiwgY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICBjb25zdCBzZXNzaW9uVXNlcnM6IElDYWxsU2Vzc2lvblVzZXJbXSA9IHRoaXMuX21haW5TZXNzaW9uLmdldFVzZXJMaXN0KCkubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgdXNlcklkLCB1c2VyU3RhdGUsIHN5c3RlbVN0YXRlLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCxcbiAgICAgICAgfSA9IGl0ZW07XG4gICAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IGN1cnJlbnRVc2VyU3lzdGVtU3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc2Vzc2lvblN0YXR1czogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuRU5ERUQsXG4gICAgICAgICAgc3RhdHVzVGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICBjaGFuZ2VkOiAxLFxuICAgICAgICAgIGludml0ZVVzZXJJZDogdGhpcy5fbWFpblNlc3Npb24hLmdldFN0YXJ0Q2FsbGVySWQoKSxcbiAgICAgICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGE6IElTdGF0dXNEb3duQ29udCA9IHtcbiAgICAgICAgY2FsbElkOiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgICAgdG9EZXZpY2VJZDogdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpLFxuICAgICAgICBjYWxsU3RhdHVzOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkVOREVELFxuICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgY2FsbFNlc3Npb25Vc2Vyczogc2Vzc2lvblVzZXJzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuX29uU3RhdHVzRG93bihkYXRhLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5LiK5bGCIFJUQyDliqDlhaXmiL/pl7TlkI7ph43mlrDlvIDlp4vmoKHml7ZcbiAgICovXG4gIHB1YmxpYyBzdGFydFRpbWVDb3JyZWN0aW9uKHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIucmVzdGFydCh0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWxheVRpbWVJbmZvKCk6IElHZXREZWxheVRpbWVJbmZvUmVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVsYXlUaW1lOiB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmdldExvY2FsRGVsYXlUaW1lKCksXG4gICAgICBydHQ6IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0UlRUKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBob2xkU2Vzc2lvbiDljYfnuqfkuLogbWFpblNlc3Npb25cbiAgICovXG4gIHB1YmxpYyB1cGdyYWRlTWFpblNlc3Npb24oaG9sZENhbGxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZEluZGV4KChzZXNzaW9uKSA9PiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBob2xkQ2FsbElkKTtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IHRoaXMuX2hvbGRTZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpPy5bMF07XG4gIH1cblxuICAvKiogPT09PT0956eB5pyJ5pa55rOVPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgLyoqXG4gICAqIElNIOeKtuaAgeWPmOabtOWkhOeQhlxuICAgKi9cbiAgcHJpdmF0ZSBfb25JTVN0YXRlQ2hhbmdlKHN0YXRlOiBSQ0Nvbm5lY3Rpb25TdGF0dXMpIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICBsZXQgdGltZXJJZDogbnVtYmVyID0gMDtcbiAgICBpZiAoc3RhdGUgPT09IFJDQ29ubmVjdGlvblN0YXR1cy5ESVNDT05ORUNURUQpIHtcbiAgICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRTZXNzaW9uU3RhdGUoKSAhPT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgICAgLy8g5pat572R562J5b6FIDYwcyDlkI7op6blj5Egb25TZXNzaW9uQ2xvc2VcbiAgICAgICAgdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0lNX1NUQVRFX0NIQU5HRV9PLCAnZW5kQ3VycmVudFNlc3Npb24sIElNIGRpc2Nvbm5lY3RlZCBmb3IgbW9yZSB0aGFuIDYwcycsIHRyYWNlSWQpO1xuICAgICAgICAgIHRoaXMuZW5kQ3VycmVudFNlc3Npb24oUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUiwgdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpISwgdHJhY2VJZCk7XG4gICAgICAgIH0sIENBTExfVElNRV9PVVQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRpbWVySWQgJiYgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlpITnkIblj5HotbfpgoDor7fjgIHmlLbliLDpgoDor7flkI7orqHml7botoXml7ZcbiAgICog5o+Q5YmN5qih5oufIF9vblN0YXR1c0Rvd24sIOS4jeWGjeS+nei1liBDYWxsU2VydmVyIOS4i+WPkeeahCBfb25TdGF0dXNEb3duXG4gICAqIOWkhOeQhue9kee7nOW8guW4uOaDheWGteS4i+S4iuaKpSBDYWxsU2VydmVyIOWksei0pe+8jENhbGxTZXJ2ZXIg5LiN5Lya5LiL5Y+RIF9vblN0YXR1c0Rvd24g5oOF5Ya1XG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVDYWxsVGltZW91dChjYWxsSWQ6IHN0cmluZywgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NBTExfVElNRU9VVF9PLCBgY2FsbCB0aW1lb3V0IGNhbGxJZDogJHtjYWxsSWR9LCB1c2VyU3RhdGU6ICR7dXNlclN0YXRlfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZmluZCgoc2Vzc2lvbikgPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NBTExfVElNRU9VVF9PLCBgaGFuZGxlQ2FsbFRpbWVvdXQgd2l0aG91dCBzZXNzaW9uLCBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuXG4gICAgdGhpcy5fb25TdGF0dXNEb3duKHtcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRvRGV2aWNlSWQ6IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRTZXNzaW9uSWQoKSxcbiAgICAgIGNhbGxTdGF0dXM6IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQsXG4gICAgICBkdXJhdGlvbjogMCxcbiAgICAgIGNhbGxTZXNzaW9uVXNlcnM6IHNlc3Npb24uZ2V0VXNlckxpc3QoKS5tYXAoKHVzZXIpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsIHN0YXRlVGltZSxcbiAgICAgICAgfSA9IHVzZXI7XG5cbiAgICAgICAgbGV0IHN5c1N0YXR1czogUkNDYWxsUGx1c1JlYXNvbjtcbiAgICAgICAgbGV0IHNlc3Npb25TdGF0dXM6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlO1xuICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgICAgc3lzU3RhdHVzID0gdXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQgPyBSQ0NhbGxQbHVzUmVhc29uLk1JU1NFRCA6IFJDQ2FsbFBsdXNSZWFzb24uTk9fQU5TV0VSO1xuICAgICAgICAgIHNlc3Npb25TdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk5PX0FOU1dFUjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzeXNTdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNSZWFzb24uTk9fQU5TV0VSIDogUkNDYWxsUGx1c1JlYXNvbi5NSVNTRUQ7XG4gICAgICAgICAgc2Vzc2lvblN0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSIDogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUaW1lOiBzdGF0ZVRpbWUgPyBzdGF0ZVRpbWUgKyAxIDogRGF0ZS5ub3coKSxcbiAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICBjaGFuZ2VkOiAxLFxuICAgICAgICAgIGludml0ZVVzZXJJZDogc2Vzc2lvbi5nZXRDYWxsZXJJZCgpLFxuICAgICAgICAgIHN5c1N0YXR1cyxcbiAgICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICAgIHRhcmdldElkLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5byA5ZCv6LaF5pe26K6h5pe25ZmoXG4gICAqL1xuICBwcml2YXRlIF9zdGFydFRpbWVyKGNhbGxJZDogc3RyaW5nLCB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgIGNvbnN0IHRpbWVySWQgPSB0aW1lclNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5faGFuZGxlQ2FsbFRpbWVvdXQoY2FsbElkLCB1c2VyU3RhdGUsIHRyYWNlSWQpO1xuICAgICAgLy8g5LiK5oqlIGNhbGwgc2VydmVyIOi2heaXtlxuICAgICAgdGhpcy5fc2lnbmFsTW9kdWxlLnN0YXR1c1VwQ2FsbCh7IGNhbGxJZCwgc2Vzc2lvblN0YXR1czogdXNlclN0YXRlIH0sIHRyYWNlSWQpO1xuICAgIH0sIENBTExfVElNRV9PVVQpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1NUQVJUX0NBTExfVElNRVJfTywgYGNhbGxJZDogJHtjYWxsSWR9LCB0aW1lcklkOiAke3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRpbWVySWQ7XG4gIH1cblxuICAvKipcbiAgICog5YGc5q2i6LaF5pe26K6h5pe25ZmoXG4gICAqL1xuICBwcml2YXRlIF9zdG9wVGltZXIodGltZXJJZDogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1NUT1BfQ0FMTF9USU1FUl9PLCBgdGltZXJJZDogJHt0aW1lcklkfWAsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCDpgJror53pgoDor7dcbiAgICovXG4gIHByaXZhdGUgX29uSW52aXRlKGRhdGE6IElQdWJJbnZpdGVDb24sIGlzRGlyZWN0bHk6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgaW52aXRlVXNlcklkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsU2Vzc2lvblVzZXJzLCBzZWNyZXRDaGF0LCBjYWxsaW5nVXNlcklkLFxuICAgIH0gPSBkYXRhO1xuXG4gICAgaWYgKHNlY3JldENoYXQgPT09IFNlY3JldENhbGxUeXBlLlNFQ1JFVCkge1xuICAgICAgLy8g5aaC5p6c5piv5a+G6IGK6YCa6K+d5LiN5aSE55CGXG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgZXh0cmE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICByZWFzb246IFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLlNFQ1JFVF9DQUxMLFxuICAgICAgICByZWZlcjogaXNEaXJlY3RseSA/IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVCX0lOVklURSA6IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVMTF9LVl9JTlZJVEUsXG4gICAgICB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c6Ieq5bex5piv6KKr6YKA6K+355qE55So5oi3XG4gICAgY29uc3QgaXNJbnZpdGVlID0gY2FsbFNlc3Npb25Vc2Vycy5zb21lKChpdGVtKSA9PiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCk7XG4gICAgaWYgKGlzSW52aXRlZSkge1xuICAgICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLmFkZEFibm9ybWFsbENhbGxJZChjdXJyZW50VXNlcklkLCBjYWxsSWQpO1xuXG4gICAgICAvLyDnlJ/miJAgY2FsbFNlc3Npb25cbiAgICAgIGNvbnN0IGlubmVyU2Vzc2lvbiA9IG5ldyBSQ0NhbGxJbm5lclNlc3Npb24oXG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5SSU5HSU5HLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBpbnZpdGVVc2VySWQsXG4gICAgICAgIGludml0ZVVzZXJJZCxcbiAgICAgICAgW10sXG4gICAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgICk7XG4gICAgICAvLyBjYWxsIHNlcnZlciDlk43pk4PkuIrmiqVcbiAgICAgIHRoaXMuX3NpZ25hbE1vZHVsZS5yaW5naW5nQ2FsbCh7IGNhbGxJZCB9LCB0cmFjZUlkKTtcblxuICAgICAgLyoqXG4gICAgICAgKiDlkK/liqjmjqXlkKzotoXml7borqHml7blmahcbiAgICAgICAqL1xuICAgICAgY29uc3QgaW52aXRlZVRpbWVySWQgPSB0aGlzLl9zdGFydFRpbWVyKGNhbGxJZCwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VELCB0cmFjZUlkKTtcbiAgICAgIGlubmVyU2Vzc2lvbi51cGRhdGVUaW1lcklkKENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVFLCBpbnZpdGVlVGltZXJJZCk7XG5cbiAgICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgICAgLy8g55Sf5oiQ5Li7IHNlc3Npb25cbiAgICAgICAgdGhpcy5fbWFpblNlc3Npb24gPSBpbm5lclNlc3Npb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDnlJ/miJDlia8gc2Vzc2lvbnNcbiAgICAgICAgdGhpcy5faG9sZFNlc3Npb25zLnB1c2goaW5uZXJTZXNzaW9uKTtcbiAgICAgICAgLy8g5pu05paw5Li7IHNlc3Npb24g54q25oCB5Li6IEhPTERcbiAgICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuQlVTWUxJTkVfV0FJVCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOaKm+WHuuW3seaWueiiq+mCgOivt1xuICAgICAgY29uc3QgY2FsbFBsdXNTZXNzaW9uID0gbmV3IFJDQ2FsbFBsdXNTZXNzaW9uKGlubmVyU2Vzc2lvbiwgdGhpcywgdGhpcy5fbG9nZ2VyKTtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsKGNhbGxQbHVzU2Vzc2lvbiwgdHJhY2VJZCk7XG5cbiAgICAgIGNvbnN0IGludml0ZVNvdXJjZSA9IGlzRGlyZWN0bHkgPyBSQ0NhbGxQbHVzSW52aXRlU291cmNlLlBVQl9JTlZJVEVfQ0FMTCA6IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UuUFVMTF9LVl9JTlZJVEVfQ0FMTDtcbiAgICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9JTlZJVEVfXywgY2FsbFBsdXNTZXNzaW9uLCBpbnZpdGVTb3VyY2UpO1xuXG4gICAgICBjb25zdCBvdGhlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBjYWxsU2Vzc2lvblVzZXJzLm1hcCgoe1xuICAgICAgICB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN5c1N0YXR1cywgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsIHN0YXR1c1RpbWUsXG4gICAgICB9KSA9PiAoe1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIHN0YXRlVGltZTogc3RhdHVzVGltZSxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9KSk7XG4gICAgICAvLyDmipvlh7rkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIG90aGVyc1N0YXRlLCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJJbnZpdGVDYWxsTWlzcywgT2JqZWN0LmFzc2lnbihkYXRhLCB7XG4gICAgICAgIGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgcmVhc29uOiBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbi5OT1RfSU5WSVRFRSxcbiAgICAgICAgcmVmZXI6IGlzRGlyZWN0bHkgPyBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVQl9JTlZJVEUgOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVTExfS1ZfSU5WSVRFLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIOi/h+a7pOWHuuWFtuS7lueUqOaIt+WSjOiHquW3sVxuICAgIGNvbnN0IG90aGVySW52aXRlZE1lbWJlciA9IGNhbGxTZXNzaW9uVXNlcnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCAmJiBpdGVtLnVzZXJJZCAhPT0gaW52aXRlVXNlcklkICYmIGl0ZW0uc2Vzc2lvblN0YXR1cyA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCk7XG4gICAgLy8g5oqb5Ye6576k6IGK5Lit6KKr6YKA6K+355qE5YW25LuW5Lq6XG4gICAgaWYgKG90aGVySW52aXRlZE1lbWJlci5sZW5ndGggPiAwKSB7XG4gICAgICAvLyDpgJrnn6UgY2FsbFR5cGUg57G75Z6L5Y+Y5pu0XG4gICAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSAmJiB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCkge1xuICAgICAgICB0aGlzLl9vbkNhbGxUeXBlQ2hhbmdlKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLCBSQ0NhbGxQbHVzVHlwZS5NVUxUSSwgdHJhY2VJZCk7XG4gICAgICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVDYWxsVHlwZShSQ0NhbGxQbHVzVHlwZS5NVUxUSSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGludml0ZWRNZW1iZXI6IElPdGhlck1lbUluZm9bXSA9IFtdO1xuICAgICAgY29uc3QgdXNlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICAgIG90aGVySW52aXRlZE1lbWJlci5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMgfSA9IGl0ZW07XG4gICAgICAgIGludml0ZWRNZW1iZXIucHVzaCh7IGNhbGxJZCwgdXNlcklkLCB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMgfSk7XG4gICAgICAgIHVzZXJzU3RhdGUucHVzaCh7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9vbk90aGVyTWVtYmVySW52aXRlKGludml0ZWRNZW1iZXIpO1xuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgdXNlcnNTdGF0ZSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCDmjILmlq3vvIjlr7nmlrnpgJror53lj5bmtojjgIHpgJror53mi5Lnu53vvIlcbiAgICovXG4gIHByaXZhdGUgX29uSGFuZ3VwKGRhdGE6IElIYW5ndXBJbmZvW10sIGNhbGxTZXNzaW9uYVN0YXR1czogUkNDYWxsUGx1c0NhbGxTdGF0ZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICAvLyDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5jYWxsSWQgPT09IHRoaXMuX21haW5TZXNzaW9uIS5nZXRDYWxsSWQoKSkge1xuICAgICAgICAgIGlmIChpdGVtLnVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FOQ0VMTEVEKSB7XG4gICAgICAgICAgICAvLyDmuIXpmaTmjqXlkKzotoXml7borqHml7blmahcbiAgICAgICAgICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlZVRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOaLkuaOpeOAgeW/meeijOOAgeacquaOpeWQrCDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICAgICAgICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlclRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfb25BY2NlcHQoZGF0YTogSUFjY2VwdEluZm9bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2Vzc2lvblN0YXRlID0gdGhpcy5fbWFpblNlc3Npb24/LmdldFNlc3Npb25TdGF0ZSgpO1xuICAgIGNvbnN0IHVuTmVlZFVwU3RhdGUgPSBbXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQlVTWUxJTkVfV0FJVCxcbiAgICBdO1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFXG4gICAgICAmJiBzZXNzaW9uU3RhdGUgJiYgdW5OZWVkVXBTdGF0ZS5pbmNsdWRlcyhzZXNzaW9uU3RhdGUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRDYWxsZXJJZCA9IHRoaXMuX21haW5TZXNzaW9uIS5nZXRTdGFydENhbGxlcklkKCk7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvKipcbiAgICAgKiDljZXlkbzmlLbliLDlr7nmlrnmjqXlkKzml7bvvIzpnIDlrozmiJDlj5HluIPotYTmupDkuIDns7vliJfliqjkvZxcbiAgICAgKi9cbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSAmJiBzdGFydENhbGxlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICBjb25zdCBhY2NlcHRVc2VySW5mbyA9IGRhdGEuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmZyb21Vc2VySWQgIT09IGN1cnJlbnRVc2VySWQpO1xuICAgICAgYWNjZXB0VXNlckluZm8gJiYgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fLCB0aGlzLmdldExvY2FsTWFpblNlc3Npb24oKSEuZ2V0Q2FsbElkKCksIHRyYWNlSWQpO1xuICAgIH1cbiAgICAvLyDmm7TmlrDkuLsgc2Vzc2lvbiDnirbmgIFcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyk7XG5cbiAgICAvLyDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICB0aGlzLl9zdG9wVGltZXIodGhpcy5fbWFpblNlc3Npb24hLmdldEludml0ZXJUaW1lcklkKCksIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOeKtuaAgeS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfb25TdGF0dXNEb3duKGRhdGE6IElTdGF0dXNEb3duQ29udCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICog6YCa6K+d54q25oCB5Li66L+e5o6l54q25oCB5pe277yM5L+d5a2Y5pyN5Yqh5LiL5Y+R55qE6YCa6K+d5byA5aeL5pe26Ze0XG4gICAgICovXG4gICAgY29uc3Qge1xuICAgICAgY2FsbFN0YXR1cywgc3RhcnRUaW1lLCBzeW5jVGltZSwgY2FsbElkLFxuICAgIH0gPSBkYXRhO1xuICAgIGlmIChjYWxsSWQgIT09IHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdID0gdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0gfHwge307XG5cbiAgICAvKipcbiAgICAgKiDkuIrmiqXpgJror53lvIDlp4vorqHml7bkuovku7ZcbiAgICAgKiDmnaHku7bvvJrpgJror53nirbmgIHkuLogT05DQUxMIOS4lOacquS4iuaKpei/h+mAmuivneW8gOWni+iuoeaXtuS6i+S7tlxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0uaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZVxuICAgICAgJiYgY2FsbFN0YXR1cyA9PT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdLmlzUmVjZWl2ZUNhbGxTdGFydFRpbWUgPSB0cnVlO1xuICAgICAgY29uc3QgeyBjb2RlLCBjbGllbnRTdGFydFRpbWUgfSA9IGF3YWl0IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuY2FsY0NsaWVudFN0YXJ0VGltZShjYWxsSWQsIHN0YXJ0VGltZSEsIHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbFN0YXJ0VGltZSh7XG4gICAgICAgICAgY2FsbElkLFxuICAgICAgICAgIGNhbGxTdGFydFRpbWU6IGNsaWVudFN0YXJ0VGltZSEsXG4gICAgICAgIH0sIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOiuoeeul+aYr+WQpumAmuivnee7k+adn1xuICAgIGxldCBzZWxmRW5kID0gZmFsc2U7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvLyDkuIrmiqXkurrlkZjnirbmgIHlj5jmm7RcbiAgICBjb25zdCBjaGFuZ2VkVXNlcnMgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBpc0xlZnQgPSBbXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEUsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkRFQ0xJTkVELFxuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk5PX0FOU1dFUixcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FOQ0VMTEVELFxuICAgICAgXS5pbmNsdWRlcyhpdGVtLnNlc3Npb25TdGF0dXMpO1xuICAgICAgaWYgKGlzTGVmdCAmJiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICBzZWxmRW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBpdGVtLnNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBpdGVtLnN5c1N0YXR1cyxcbiAgICAgICAgc3RhdGVUaW1lOiBpdGVtLnN0YXR1c1RpbWUsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNoYW5nZWRVc2Vycy5sZW5ndGggPiAwICYmIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIGNoYW5nZWRVc2VycywgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDmsqHmnIkgc2Vzc2lvbiDkuI3lpITnkIbkvJror53nirbmgIHlj5jmm7RcbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uICYmICF0aGlzLl9ob2xkU2Vzc2lvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g6K6h566X5Ye65ZON5bqU5Yqo5L2c77yM5bm25oqb5Ye65L+h5oGvXG4gICAgY29uc3Qge1xuICAgICAgaGFuZ3VwRGF0YSwgYWNjZXB0RGF0YSwgb3RoZXJJbnZpdGVkRGF0YSxcbiAgICB9ID0gcGFyc2VTdGF0dXNEYXRhKGRhdGEpO1xuXG4gICAgaGFuZ3VwRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuX29uSGFuZ3VwKGhhbmd1cERhdGEsIGRhdGEuY2FsbFN0YXR1cywgdHJhY2VJZCk7XG4gICAgYWNjZXB0RGF0YS5sZW5ndGggPiAwICYmIHRoaXMuX29uQWNjZXB0KGFjY2VwdERhdGEsIHRyYWNlSWQpO1xuXG4gICAgaWYgKG90aGVySW52aXRlZERhdGEubGVuZ3RoID4gMCAmJiB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuTVVMVEkpIHtcbiAgICAgIHRoaXMuX29uT3RoZXJNZW1iZXJJbnZpdGUob3RoZXJJbnZpdGVkRGF0YSk7XG4gICAgfVxuXG4gICAgLy8g5Y+q5pyJ5ZyoIGNhbGxTZXNzaW9uIOeKtuaAgeS4uiBFbmRlZCDml7bpgJrnn6Ugb25TZXNzaW9uQ2xvc2VcbiAgICBpZiAoZGF0YS5jYWxsU3RhdHVzID09PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkVOREVEIHx8IHNlbGZFbmQpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbkNsb3NlKGRhdGEsIHRyYWNlSWQsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDlhbbku5bnq6/nmoTnirbmgIHkuIvlj5FcbiAgICovXG4gIHByaXZhdGUgX29uT3RoZXJDbGllbnRTdGF0dXNEb3duKGRhdGE6IElTdGF0dXNEb3duQ29udCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjYWxsSWQsIGNhbGxTZXNzaW9uVXNlcnMsIGNhbGxTdGF0dXMgfSA9IGRhdGE7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBjYWxsU2Vzc2lvblVzZXJzLmZpbmQoKHsgdXNlcklkIH0pID0+IHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCk7XG5cbiAgICBpZiAoY3VycmVudFVzZXIgJiYgKHRoaXMuX21haW5TZXNzaW9uIHx8IHRoaXMuX2hvbGRTZXNzaW9ucy5sZW5ndGgpKSB7XG4gICAgICAvLyDmmK/lt7Hnq6/nirbmgIHlj5jmm7TkuJTlrZjlnKggc2Vzc2lvbiDlho3ljrvpgJrnn6XkurrlkZjnirbmgIHlj5jmm7Tlm57osIPvvIzkuI3lrZjlnKggc2Vzc2lvbiDkuI3pnIDopoHpgJrnn6VcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzdGF0dXNUaW1lIH0gPSBjdXJyZW50VXNlcjtcbiAgICAgIGlmIChzZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlcyA9IFtSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkddO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlpoLmnpzoh6rlt7HmnKrmjqXlkKzkuLvpgJror53vvIzmlLbliLDlpJrnq68gQ29ubmVjdGluZyDnirbmgIHvvIzpnIDmipvlh7ogc2Vzc2lvbkNsb3NlXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBpc01haW5TZXNzaW9uID0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpID09PSBjYWxsSWQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRVc2VyU2F0ZSA9IHRoaXMuX21haW5TZXNzaW9uPy5nZXRVc2VyTGlzdCgpLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKT8udXNlclN0YXRlO1xuICAgICAgICBjb25zdCBpc0FjY2VwdE1haW5TZXNzaW9uID0gaXNNYWluU2Vzc2lvbiAmJiBjdXJyZW50VXNlclNhdGUgJiYgc3RhdGVzLmluY2x1ZGVzKGN1cnJlbnRVc2VyU2F0ZSk7XG4gICAgICAgIGlmICghaXNBY2NlcHRNYWluU2Vzc2lvbikge1xuICAgICAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIFt7XG4gICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfQUNDRVBULFxuICAgICAgICAgICAgc3RhdGVUaW1lOiBzdGF0dXNUaW1lLFxuICAgICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgICAgIH1dLCB0cmFjZUlkKTtcblxuICAgICAgICAgIHRoaXMuc2Vzc2lvbkNsb3NlKGRhdGEsIHRyYWNlSWQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDkuovku7bkuIvlj5FcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX29uRXZlbnREb3duKGRhdGE6IElFdmVudERvd25DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIGV2ZW50VGltZSwgZXZlbnRBcmdzLCBldmVudFR5cGUsIGZyb21Vc2VySWQsXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gQ2FsbFNlcnZlckV2ZW50VHlwZS5DQUxMX0RVUkFUSU9OICYmIGNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICBjb25zdCB7IGZpcnN0RnJhbWVUaW1lIH0gPSBldmVudEFyZ3MgYXMgeyBmaXJzdEZyYW1lVGltZTogbnVtYmVyIH07XG4gICAgICAvLyDorqHnrpflvIDlp4vml7bpl7RcbiAgICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lOiBjbGllbnRGaXJzdEZyYW1lVGltZSB9ID0gYXdhaXQgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5jYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZCwgZmlyc3RGcmFtZVRpbWUsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfRklSU1RfRlJBTUVfVElNRV9PLCBgY2xpZW50Rmlyc3RGcmFtZVRpbWU6ICR7Y2xpZW50Rmlyc3RGcmFtZVRpbWV9YCwgdHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsRmlyc3RGcmFtZVRpbWUoY2FsbElkLCBjbGllbnRGaXJzdEZyYW1lVGltZSEsIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrnn6XljZXlkbwgZHVyYXRpb24g5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZTaW5DYWxsRHVyYXRpb24oY2FsbElkOiBzdHJpbmcsIGNsaWVudFN0YXJ0VGltZTogbnVtYmVyLCBjbGllbnRGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKHsgY2FsbElkLCAuLi57IGNhbGxTdGFydFRpbWU6IGNsaWVudFN0YXJ0VGltZSB9IH0sIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZShjYWxsSWQsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOWqkuS9k+WPmOabtOebuOWFs+S6i+S7tlxuICAgKi9cbiAgcHJpdmF0ZSBfb25Td2l0Y2hNZWRpYVR5cGUoZGF0YTogSURpYWxvZ0Rvd25DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIGFjdGlvbiwgZXh0cmFLZXlWYWwsIHRyYW5zYWN0aW9uSWQsIHByb21vdGVySWQsXG4gICAgfSA9IGRhdGE7XG4gICAgY29uc3QgeyBtZWRpYVR5cGUsIHJlYXNvbiB9ID0gZXh0cmFLZXlWYWw7XG5cbiAgICBjb25zdCBjdXJyZW50Q2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpO1xuICAgIGlmIChjYWxsSWQgIT09IGN1cnJlbnRDYWxsSWQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX01FRElBVFlQRV9DSEFOR0VfTywgYG5vdCBjdXJyZW50IHNlc3Npb24gY2FsbElkOiAke2N1cnJlbnRDYWxsSWR9LCByZWN2Q2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyB0cmFuc2FjdGlvbklkOiBvbGRUcmFuc0lkLCBhY3Rpb246IG9sZEFjdGlvbiwgbWVkaWFUeXBlOiBPbGRNZWRpYVR5cGUgfSA9IHRoaXMuX21haW5TZXNzaW9uPy5nZXRPbGREaWFsb2dEYXRhKCkgfHwge307XG4gICAgaWYgKG9sZFRyYW5zSWQgPT09IHRyYW5zYWN0aW9uSWQgJiYgb2xkQWN0aW9uID09PSBhY3Rpb24gJiYgT2xkTWVkaWFUeXBlID09PSBtZWRpYVR5cGUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX01FRElBVFlQRV9DSEFOR0VfTywgJ2R1cGxpY2F0ZSBkaWFsb2cgZGF0YScsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX01FRElBVFlQRV9DSEFOR0VfTywgYGFjdGlvbjogJHthY3Rpb259LCByZWFzb246ICR7cmVhc29ufWAsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbWFpblNlc3Npb24/LnNldE9sZERpYWxvZ0RhdGEoeyB0cmFuc2FjdGlvbklkLCBhY3Rpb24sIG1lZGlhVHlwZSB9KTtcblxuICAgIC8vIOWNh+e6p+a1geeoi+WkhOeQhlxuICAgIGlmIChhY3Rpb24gPT09IERpYWxvZ0FjdGlvbi5SRVFVRVNUKSB7XG4gICAgICB0aGlzLl9vblJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUoe1xuICAgICAgICB0cmFuc2FjdGlvbklkOiB0cmFuc2FjdGlvbklkISxcbiAgICAgICAgdXNlcklkOiBwcm9tb3RlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IG51bGw7XG4gICAgICBzd2l0Y2ggKHJlYXNvbikge1xuICAgICAgICBjYXNlIERpYWxvZ0FjdGlvbi5DQU5DRUw6XG4gICAgICAgICAgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLkFDQ0VQVDpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LlNFUlZFUl9BTExPV19NRURJQV9UWVBFO1xuICAgICAgICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVNZWRpYVR5cGUodGhpcy5fbWFpblNlc3Npb24hLmdldFJlcU1lZGlhVHlwZSgpISk7XG4gICAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZVJlcU1lZGlhVHlwZShudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uUkVGVVNFOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuUkVGVVNFX0NIQU5HRV9NRURJQV9UWVBFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWxvZ0FjdGlvbi5USU1FT1VUOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuQ0hBTkdFX01FRElBX1RZUEVfVElNRU9VVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdFtjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgYXMgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdF1cbiAgICAgICYmIHRoaXMuX3JlY2VpdmVNZWRpYVR5cGVDaGFuZ2VSZXN1bHQoe1xuICAgICAgICB0cmFuc2FjdGlvbklkOiB0cmFuc2FjdGlvbklkISxcbiAgICAgICAgdXNlcklkOiBwcm9tb3RlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICB9LCBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgYXMgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgLy8g6ZmN57qn6YCa55+l5aSE55CGXG4gICAgaWYgKGFjdGlvbiA9PT0gRGlhbG9nQWN0aW9uLk5PVElDRSAmJiBtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgIXJlYXNvbikge1xuICAgICAgdGhpcy5fcmVjZWl2ZU1lZGlhVHlwZUNoYW5nZVJlc3VsdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IHRyYW5zYWN0aW9uSWQhLFxuICAgICAgICB1c2VySWQ6IHByb21vdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgIH0sIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEUsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAgY2FsbCBsb2cg5pel5b+XXG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZDYWxsRW5kTG9nKGRhdGE6IElQdWJDYWxsTG9nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYWxsTG9nID0gdHJhbjJDYWxsTG9nKGRhdGEpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsUmVjb3JkKGNhbGxMb2csIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn1xuICAgKi9cbiAgcHVibGljIHNlc3Npb25DbG9zZShkYXRhOiB7IGNhbGxJZDogc3RyaW5nLCB0b0RldmljZUlkOiBzdHJpbmd9LCB0cmFjZUlkOiBzdHJpbmcsIGlzU2VsZkhhbmd1cDogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgY2FsbElkIH0gPSBkYXRhO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuXG4gICAgLy8g5q2j5bi457uT5p2f77yM5riF6Zmk5pys5Zyw5a2Y5YKo55qEIGNhbGxJZFxuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLnJlbW92ZUFibm9ybWFsQ2FsbElkcyhjdXJyZW50VXNlcklkLCBbY2FsbElkXSk7XG5cbiAgICBsZXQgY2xvc2VkU2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKCFjbG9zZWRTZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08sIGB1bmV4cGVjdCBzZXNzaW9uIGNhbGxJZCAtPiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08sIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgLy8gc2Vzc2lvbiBjbG9zZSDlkI7nu5PmnZ/miYDmnInotoXml7borqHml7blmahcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24gJiYgdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCkge1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24uZ2V0QWxsVGltZXJJZHMoKS5mb3JFYWNoKCh0aW1lcklkKSA9PiB0aGlzLl9zdG9wVGltZXIuYmluZCh0aGlzKSh0aW1lcklkLCB0cmFjZUlkKSk7XG4gICAgICAvLyDnu5PmnZ8g5LiK5oql56ys5LiA5binXG4gICAgICBpZiAoY2xvc2VkU2Vzc2lvbi5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgICAgdGhpcy5faXNVcEZpcnN0RnJhbWVUaW1lID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5rS+5Y+R6YCa6K+d57uT5p2f77yM5aSE55CG6YCa6K+d57uT5p2f5ZCOIFJUQyDpgIDmiL/pl7TnrYnpgLvovpFcbiAgICAgKi9cbiAgICB0aGlzLmVtaXQoUkNDYWxsRW5naW5lLl9fSU5ORVJfU0VTU0lPTl9DTE9TRV9fLCBjYWxsSWQsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5LiK5oql6YCa6K+d57uT5p2fXG4gICAgICog5aSa56uv5YW25LuW56uv5oyC5pat6YCa6K+d77yM6ZyA5oqK5pys56uv5Lq65ZGY57O757uf54q25oCB6L2s5YyW5Li6IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0hBTkdVUFxuICAgICAqL1xuICAgIGNvbnN0IGNydFVzZXJEYXRhID0gY2xvc2VkU2Vzc2lvbi5nZXRVc2VyTGlzdCgpLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcbiAgICBsZXQgaGFuZ3VwUmVhc29uO1xuICAgIGlmIChpc1NlbGZIYW5ndXAgJiYgZGF0YS50b0RldmljZUlkICE9PSB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0U2Vzc2lvbklkKCkpIHtcbiAgICAgIGhhbmd1cFJlYXNvbiA9IGNsb3NlZFNlc3Npb24uZ2V0SXNMb2NhbENsaWVudEhhbmd1cCgpID8gY3J0VXNlckRhdGEhLnN5c3RlbVN0YXRlIDogUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfSEFOR1VQO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uQ2FsbEVuZGVkKG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbihjbG9zZWRTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpLCBoYW5ndXBSZWFzb24gfHwgY3J0VXNlckRhdGEhLnN5c3RlbVN0YXRlLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX3JlbW92ZVNlc3Npb24oY2FsbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOenu+mZpCBzZXNzaW9uXG4gICAqL1xuICBwcml2YXRlIF9yZW1vdmVTZXNzaW9uKGNhbGxJZDogc3RyaW5nKSB7XG4gICAgaWYgKGNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5faG9sZFNlc3Npb25zLmZpbmRJbmRleCgoc2Vzc2lvbikgPT4gc2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgICB0aGlzLl9ob2xkU2Vzc2lvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5LiN5a2Y5ZyoIG1haW5TZXNzaW9uIOaXtu+8jOS7juacjeWKoeerr+iOt+WPluaVsOaNrueUn+aIkCBtYWluU2Vzc2lvbiwg5bm26YCa55+l5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVTZXNzaW9uQnlTZXJ2ZXIoY2FsbElkOiBzdHJpbmcsIGlzTmVlZFVwOmJvb2xlYW4gPSBmYWxzZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NSRUFURV9TRVNTSU9OX0JZX1NFUlZFUl9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuZ2V0Q2FsbFNlc3Npb24oeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1IsIGBlcnJjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NSRUFURV9TRVNTSU9OX0JZX1NFUlZFUl9SLCBgY29kZTogJHtjb2RlfSwgZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxTZXNzaW9uVXNlcnMsIHN0YXJ0Q2FsbGVySWQsXG4gICAgfSA9IGRhdGEhO1xuXG4gICAgLy8g55Sf5oiQ5Li7IHNlc3Npb25cbiAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IG5ldyBSQ0NhbGxJbm5lclNlc3Npb24oXG4gICAgICBjYWxsSWQsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcsXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHN0YXJ0Q2FsbGVySWQsXG4gICAgICBzdGFydENhbGxlcklkLFxuICAgICAgW10sXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgKTtcbiAgICBpZiAoaXNOZWVkVXApIHtcbiAgICAgIHRoaXMuX2NsZWFyTW9iaWxlT25QaG9uZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cbiAgICAvLyDkurrlkZjnirbmgIHlj5jmm7TpgJrnn6VcbiAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBjYWxsU2Vzc2lvblVzZXJzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhbzlrrnnp7vliqjnq68gb25QaG9uZSDml6Dms5XmtojpmaTpl67pophcbiAgICogQTEg56e75Yqo56uv5ZKMIEIg5q2j5ZyoIGNhbGwg5Lit77yM5LiUIG9uUGhvbmUg54q25oCB77yMIEExIOadgOi/m+eoi+WQju+8jEIg56uv5bGV56S655qEIG9uUGhvbmUg54q25oCB5peg5rOV5raI5aSxXG4gICAqIEEyIOWkmuerr+WcqOaOpeWQrOWSjOebtOaOpeWKoOWFpSBjYWxsIOaXtu+8jOS4iuaKpSBvblBob25lRW5kIOeKtuaAge+8jOa2iOmZpCBCIOerr+WxleekuueahCBvblBob25lIOeKtuaAgVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY2xlYXJNb2JpbGVPblBob25lKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKGl0ZW0pID0+IGl0ZW0/LmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIGlmIChzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuTVVMVEkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9PTl9QSE9ORV9FTkRfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuc3lzdGVtU3RhdHVzVXAoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHN5c1N0YXR1czogUkNDYWxsUGx1c1JlYXNvbi5PTl9QSE9ORV9FTkQsXG4gICAgICAgIGZvcndhcmQ6IEZvcndhcmRUeXBlLkNVUlJFTlQsXG4gICAgICB9LCB0cmFjZUlkKTtcblxuICAgICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9SLCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9PTl9QSE9ORV9FTkRfUiwgYGNhbGxJZDogJHtjYWxsSWR9LCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g5Y6fIGNsaWVudCDkuK3lrprkuYnnmoTkuovku7ZcbiAgcHJpdmF0ZSBfb25Vc2VyU3RhdGVDaGFuZ2UoY2FsbElkOiBzdHJpbmcsIHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIHVzZXJTdGF0ZSwgc3lzdGVtU3RhdGUgfSA9IHVzZXI7XG4gICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGUsXG4gICAgICAgIHJlYXNvbjogc3lzdGVtU3RhdGUsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIOaUtuWIsOiHquW3sSBzeXN0ZW1TdGF0ZSDkuLogOTk577yM55u05o6l56a75byA5oi/6Ze0XG4gICAgICog5aSE55CG6KKr5Y+r5o6l5ZCs55qE556s6Ze077yM5Li75Y+r5ZCM5pe25oyC5pat55qE5oOF5Ya177yM5LiN5o6J56a75byA5oi/6Ze06YCa6K+d5LiN5Lya57uT5p2fXG4gICAgICovXG4gICAgdXNlcnMuZm9yRWFjaCgoeyB1c2VySWQsIHN5c3RlbVN0YXRlIH0pID0+IHtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgJiYgc3lzdGVtU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uQUJOT1JNQUxfRU5EKSB7XG4gICAgICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9TRVNTSU9OX0NMT1NFX18sIGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbk90aGVyTWVtYmVySW52aXRlKGluZm86IElPdGhlck1lbUluZm9bXSkge1xuICAgIGluZm8uZm9yRWFjaCgoaW5mbykgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIGNhbGxJZCB9ID0gaW5mbztcbiAgICAgIGNvbnN0IGludml0ZXJVc2VySWQgPSB0aGlzLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0SW52aXRlclVzZXJJZCgpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVVc2VySW52aXRlZChbdXNlcklkXSwgaW52aXRlclVzZXJJZCEsIGNhbGxJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vblJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUoaW5mbzogSUNoYW5nZU1lZGlhVHlwZUluZm8sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgdXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUgfSA9IGluZm87XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlcXVlc3QodXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVjZWl2ZU1lZGlhVHlwZUNoYW5nZVJlc3VsdChpbmZvOiBJQ2hhbmdlTWVkaWFUeXBlSW5mbywgY29kZTogUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEUpIHtcbiAgICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fLCBpbmZvLm1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXN1bHQoe1xuICAgICAgLi4uaW5mbyxcbiAgICAgIGNvZGUsXG4gICAgfSwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkNhbGxUeXBlQ2hhbmdlKGNhbGxJZDogc3RyaW5nLCBjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uQ2FsbFR5cGVDaGFuZ2VkKGNhbGxUeXBlLCBjYWxsSWQsIHRyYWNlSWQpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBSVENSZXNvdXJjZVRhZyB7XG4gIC8qKlxuICAgKiDmma7pgJrpn7Pop4bpopHmtYFcbiAgICovXG4gIE5PUk1BTCA9ICdSb25nQ2xvdWRSVEMnLFxuICAvKipcbiAgICog5bGP5bmV5YiG5Lqr5rWBXG4gICAqL1xuICBTQ1JFRU4gPSAnU2NyZWVuU2hhcmUnXG59XG4iLCJpbXBvcnQge1xuICBQbHVnaW5Db250ZXh0LCBJUnVudGltZSwgUlRDTW9kZSwgQmFzaWNMb2dnZXIsIEV2ZW50RW1pdHRlciwgaXNCb29sZWFuLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ1JUQ1Jvb20sXG4gIFJDUlRDQ2xpZW50LFxuICBSQ1JUQ0NvZGUsXG4gIFJDTG9jYWxUcmFjayxcbiAgUkNSZW1vdGVUcmFjayxcbiAgUkNMb2NhbEF1ZGlvVHJhY2ssXG4gIElTdWJzY3JpYmVBdHRyLFxuICBSQ1JlbW90ZVZpZGVvVHJhY2ssXG4gIFJDUmVtb3RlQXVkaW9UcmFjayxcbiAgUkNLaWNrUmVhc29uLFxuICBSQ1RyYWNrLFxuICBSQ0xvY2FsVmlkZW9UcmFjayxcbiAgSVB1Ymxpc2hBdHRycyxcbiAgSVJDUlRDU3RhdGVSZXBvcnQsXG4gIGhlbHBlcixcbn0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7XG4gIElBdWRpb0NvbmZpZyxcbiAgSUNhbGxQbHVzSW5pdE9wdHMsXG4gIElTdGF0dXNSZXBvcnRMaXN0ZW5lcixcbiAgSVZpZGVvQ29uZmlnLFxuICBSQ0NhbGxQbHVzQ29kZSxcbiAgUkNDYWxsUGx1c0ZyYW1lUmF0ZSxcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgUkNDYWxsUGx1c1BhY2tldExvc3NTdGF0cyxcbiAgUkNDYWxsUGx1c1Jlc29sdXRpb24sXG59IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUlRDUmVzb3VyY2VUYWcgfSBmcm9tICcuLi9lbnVtcy9SVENSZXNvdXJjZVRhZyc7XG5pbXBvcnQgeyByZXRyeUFzeW5jRm4gfSBmcm9tICcuLi91dGlscy9yZXRyeSc7XG5pbXBvcnQgeyBDYWxsSG9va3NUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JQ2FsbEhvb2tzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c1JlYXNvbic7XG5pbXBvcnQgeyBSQ0NhbGxLaWNrRXh0cmEgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSVENNb2R1bGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IElNZWRpYU11dGVDaGFuZ2VJbmZvLCBJTWVtYmVySW5mbyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB9IGZyb20gJy4vUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSc7XG5pbXBvcnQgeyBnZXRVc2VyVmlkZW9WaWV3SW5mbyB9IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5cbmludGVyZmFjZSBJSm9pblJUQ1Jvb21SZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIHJvb20/OiBSQ1JUQ1Jvb20gfCB1bmRlZmluZWQ7XG4gIHVzZXJJZHM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyYWNrcz86IFJDUmVtb3RlVHJhY2tbXSB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIElTdWJSZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIGZhaWxlZExpc3Q/OiAoSVN1YnNjcmliZUF0dHIpW10gfCB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBJUHViUmVzIHtcbiAgY29kZTogUkNSVENDb2RlO1xuICBsaXZlVXJsPzogc3RyaW5nIHwgdW5kZWZpbmVkXG59XG5cbmludGVyZmFjZSBSQ0tpY2tFeHRyYSB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIFJUQ01vZHVsZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBfX0lOTkVSX1JUQ19QUk9DRVNTX0ZBSUxFRF9fOiBzdHJpbmcgPSAnaW5uZXItcnRjLXByb2Nlc3MtZmFpbGVkJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX1JUQ19QRUVSQ09OTkVDVElPTl9BQk5PUk1BTF9DTE9TRV9fOiBzdHJpbmcgPSAnaW5uZXItcnRjLXBlZXJjb25uZWN0aW9uLWFibm9ybWFsLWNsb3NlJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX1NFTEZfSk9JTkVEX186IHN0cmluZyA9ICdpbm5lci1vbi1zZWxmLWpvaW5lZCdcblxuICBzdGF0aWMgX19JTk5FUl9PTl9PVEhFUl9KT0lORURfXzogc3RyaW5nID0gJ2lubmVyLW9uLW90aGVyLWpvaW5lZCdcblxuICBzdGF0aWMgX19JTk5FUl9SRUNFSVZFX0ZJUlNUX0ZSQU1FX186IHN0cmluZyA9ICdpbm5lci1yZWNlaXZlLWZpcnN0LWZyYW1lJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX0tJQ0tPRkZfXzogc3RyaW5nID0gJ2lubmVyLWtpY2tvZmYtZnJhbWUnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXzogc3RyaW5nID0gJ2lubmVyLW9uLWRldmljZS1lbmFibGUtY2hhbmdlJ1xuXG4gIC8qKlxuICAgKiBSQ1JUQyDlrp7kvotcbiAgICovXG4gIHB1YmxpYyBfcnRjQ2xpZW50OiBSQ1JUQ0NsaWVudFxuXG4gIC8qKlxuICAgKiDlt7HmlrnnmoTpn7Pop4bpopEgdHJhY2tzXG4gICAqL1xuICBwcml2YXRlIF9sb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXVxuXG4gIC8qKlxuICAgKiBSQ1JUQ1Jvb20g5a6e5L6LXG4gICAqL1xuICBwdWJsaWMgX3Jvb206IFJDUlRDUm9vbSB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfY2FsbElkOiBzdHJpbmcgPSAnJ1xuXG4gIHByaXZhdGUgX2NhbGxNZWRpYVR5cGUhOiBSQ0NhbGxQbHVzTWVkaWFUeXBlXG5cbiAgcHJpdmF0ZSBfdmlkZW9Db25maWc6IElWaWRlb0NvbmZpZyA9IHtcbiAgICByZXNvbHV0aW9uOiBSQ0NhbGxQbHVzUmVzb2x1dGlvbi5XNjQwX0g0ODAsXG4gICAgZnJhbWVSYXRlOiBSQ0NhbGxQbHVzRnJhbWVSYXRlLkZQU18xNSxcbiAgfVxuXG4gIHByaXZhdGUgX2F1ZGlvQ29uZmlnOiBJQXVkaW9Db25maWcgPSB7fVxuXG4gIHByaXZhdGUgX2lzUHViVGlueTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOinhumikemFjee9ruaYr+WQpuWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBfdmlkZW9Db25maWdJc0NoYW5nZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOmfs+mikemFjee9ruaYr+WQpuWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWdJc0NoYW5nZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOWtmOWCqOiuvue9rueahOS6uuWRmOWSjOinhuWbvlxuICAgKi9cbiAgcHJpdmF0ZSBfdXNlclZpZXdNYXA6IHsgW3VzZXJJZDogc3RyaW5nXTogeyB2aWRlb1ZpZXc6IEhUTUxWaWRlb0VsZW1lbnQsIGlzVGlueTogYm9vbGVhbiB9IH0gPSB7fVxuXG4gIHByaXZhdGUgX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lciB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfcmVtb3RlQXVkaW9FbmFibGU6IGJvb2xlYW4gPSB0cnVlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSUNhbGxQbHVzSW5pdE9wdHMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsRW5naW5lOiBSQ0NhbGxFbmdpbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0QXBwRXZlbnRNb2R1bGU6IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcnRjQ2xpZW50ID0gX2luaXRPcHRzPy5ydGNDbGllbnQ7XG4gICAgdGhpcy5faXNQdWJUaW55ID0gX2luaXRPcHRzLmlzUHViVGlueSB8fCBmYWxzZTtcbiAgfVxuXG4gIHNldENhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lcikge1xuICAgIHRoaXMuX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bmkYTlg4/lpLTotYTmupBcbiAgICog5YaF5a2Y5Lit5pyJ5pe277yM6L+U5Zue5YaF5a2Y5Lit55qE6KeG6L2oXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FtZXJhVmlkZW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IGRlZmF1bHRWaWRlb1RyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSAoZGVmYXVsdFZpZGVvVHJhY2sgJiYgIXRoaXMuX3ZpZGVvQ29uZmlnSXNDaGFuZ2UpID8geyB0cmFjazogZGVmYXVsdFZpZGVvVHJhY2ssIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfSA6IGF3YWl0IHRoaXMuX2NyZWF0ZVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgdGhpcy5fdmlkZW9Db25maWdJc0NoYW5nZSA9IGZhbHNlO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bpuqblhYvpo47otYTmupBcbiAgICog5YaF5a2Y5Lit5pyJ5pe277yM6L+U5Zue5YaF5a2Y5Lit55qE6Z+z6L2oXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TWljcm9waG9uZUF1ZGlvVHJhY2sodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCBkZWZhdWx0QXVkaW9UcmFjayA9IHRoaXMuZ2V0TG9jYWxBdWRpb1RyYWNrKCk7XG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gKGRlZmF1bHRBdWRpb1RyYWNrICYmICF0aGlzLl9hdWRpb0NvbmZpZ0lzQ2hhbmdlKSA/IHsgdHJhY2s6IGRlZmF1bHRBdWRpb1RyYWNrLCBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH0gOiBhd2FpdCB0aGlzLl9jcmVhdGVBdWRpb1RyYWNrKHRyYWNlSWQpO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnSXNDaGFuZ2UgPSBmYWxzZTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7pgJror53nsbvlnovliJvlu7rpn7PjgIHop4bpopHotYTmupBcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDpn7PpopHmiJbpn7Pop4bpopFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fY2FsbE1lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuZ2V0TWljcm9waG9uZUF1ZGlvVHJhY2sodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuZ2V0Q2FtZXJhVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwdWJsaWMgc2V0VmlkZW9Db25maWcodmlkZW9Db25maWc6IElWaWRlb0NvbmZpZykge1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnSXNDaGFuZ2UgPSB0cnVlO1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnID0gdmlkZW9Db25maWc7XG4gIH1cblxuICBwdWJsaWMgc2V0QXVkaW9Db25maWcoYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZykge1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnSXNDaGFuZ2UgPSB0cnVlO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnID0gYXVkaW9Db25maWc7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9ERVNUUk9ZX0FMTF9UUkFDS1NfTywgJycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5fbG9jYWxUcmFja3MubGVuZ3RoID0gMDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGU6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9ULCBgZW5hYmxlOiAke2VuYWJsZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghaXNCb29sZWFuKGVuYWJsZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiwgYHBhcmFtIGVycm9yLCBlbmFibGU6IHR5cGUgaXMgYm9vbGVhbiwgdmFsdWU6ICR7ZW5hYmxlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZW1vdGVBdWRpb0VuYWJsZSA9IGVuYWJsZTtcblxuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGF1ZGlvVHJhY2tzID0gdGhpcy5fcm9vbSEuZ2V0UmVtb3RlVHJhY2tzKCkuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNBdWRpb1RyYWNrKCkpO1xuICAgIGF1ZGlvVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBpZiAoZW5hYmxlKSB7XG4gICAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2subXV0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX0FMTF9SRU1PVEVfQVVESU9fRU5BQkxFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3lUcmFjayh0cmFjazogUkNMb2NhbFRyYWNrKSB7XG4gICAgdHJhY2suZGVzdHJveSgpO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbG9jYWxUcmFja3MuZmluZEluZGV4KChsb2NhbFRyYWNrKSA9PiBsb2NhbFRyYWNrLmdldFRyYWNrSWQoKSA9PT0gdHJhY2suZ2V0VHJhY2tJZCgpKTtcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNlc3Npb24g6L+e5o6lXG4gICAqL1xuICBhc3luYyBzZXNzaW9uQ29ubmVjdGVkKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgLy8gMS4g5Yqg5oi/6Ze0XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICBjb25zdCB7IGNvZGUsIHJvb20gfSA9IGF3YWl0IHRoaXMuam9pblJUQ1Jvb20oY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBlcnJDb2RlIC0+ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5rOo5YaMIFJUQyDnm7jlhbPnm5HlkKxcbiAgICAgICAgdGhpcy5fY2FsbElkID0gY2FsbElkO1xuICAgICAgICB0aGlzLl9yZWdSVENMaXN0ZW5lcnMoKTtcblxuICAgICAgICB0aGlzLl9yb29tID0gcm9vbSE7XG4gICAgICAgIGNvbnN0IHJvb21Vc2Vyc0lkID0gdGhpcy5fcm9vbT8uZ2V0UmVtb3RlVXNlcklkcygpIHx8IFtdO1xuICAgICAgICBpZiAocm9vbVVzZXJzSWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX29uT3RoZXJNZW1Kb2luZWQocm9vbVVzZXJzSWQubWFwKCh1c2VySWQpID0+ICh7IGNhbGxJZCwgdXNlcklkIH0pKSwgdHJhY2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9SLCBgY2FsbElkIC0+ICR7Y2FsbElkfSwgZXJyIG1zZyAtPiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAyLiDlj5HluIPmtYFcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25CZWZvcmVQdWJsaXNoKTtcbiAgICAgICAgY29uc3QgcHViUGFyYW1zID0gdGhpcy5faXNQdWJUaW55XG4gICAgICAgICAgPyB0aGlzLl9sb2NhbFRyYWNrcy5tYXAoKHRyYWNrKSA9PiAodHJhY2suaXNWaWRlb1RyYWNrKCkgPyB7IHRyYWNrLCBpc1B1YlRpbnk6IHRydWUgfSA6IHRyYWNrKSlcbiAgICAgICAgICA6IHRoaXMuX2xvY2FsVHJhY2tzO1xuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMucHVibGlzaChwdWJQYXJhbXMsIHRyYWNlSWQpO1xuICAgICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ymxpc2hSZXMsIGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1AsICdzZXNzaW9uQ29ubmVjdGVkIGxvY2FsIHRyYWNrcyBpcyBlbXB0eScsIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBwdWJsaXNoIEV4Y2VwdGlvbiBjYWxsSWQgLT4gJHtjYWxsSWR9LCBlcnIgbXNnIC0+ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICB9XG5cbiAgYXN5bmMgc2Vzc2lvbkNsb3NlKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog6ZSA5q+B5pys56uv6LWE5rqQXG4gICAgICovXG4gICAgdGhpcy5kZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQpO1xuXG4gICAgY29uc3QgY3VycmVudFJvb21JZCA9IHRoaXMuX3Jvb20/LmdldFJvb21JZCgpO1xuICAgIGlmICh0aGlzLl9yb29tICYmIGNhbGxJZCA9PT0gY3VycmVudFJvb21JZCkge1xuICAgICAgLy8g6YCA5Ye65oi/6Ze0XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5sZWF2ZVJvb20odGhpcy5fcm9vbSk7XG4gICAgICAvLyDms6jplIDlhoXlrZjmlbDmja5cbiAgICAgIHRoaXMuX3JlbGVhc2VTdG9yZWREYXRhKCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ0xPU0VfUiwgYGxlYXZlUm9vbSBmYWlsZWQsIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9SLCAnbGVhdmVSb29tIHN1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9SLCAnbGVhdmVSb29tIHRocm93IGV4Y2VwdGlvbjogbm90IGluIHJvb20nLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog56aB55So6KeG6aKRIHRyYWNrXG4gICAqL1xuICBhc3luYyBkaXNhYmxlVmlkZW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIHwgUkNSVENDb2RlLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuQ0FNRVJBX0NMT1NFRCB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOinhumikVxuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0cmFjay5tdXRlKCk7XG5cbiAgICByZXR1cm4geyBjb2RlLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWQr+eUqOinhumikXRyYWNrXG4gICAqIDEuIOWQr+eUqOWJjeW6lOeUqOWxgumcgOWFiOWIm+W7uuinhumikSB0cmFja1xuICAgKi9cbiAgYXN5bmMgZW5hYmxlVmlkZW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIHwgUkNSVENDb2RlfT4ge1xuICAgIC8vIOiOt+WPluacrOerr+inhumikSB0cmFja1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5DQU1FUkFfQ0xPU0VEIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5aaC5p6c6LWE5rqQ5rKh6KKr56aB55So77yM6L+U5Zue5oiQ5YqfXG4gICAgICovXG4gICAgaWYgKCF0cmFjayEuaXNPd25lck11dGVkKCkpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkK/nlKjotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCBjb2RlID0gYXdhaXQgdHJhY2shLnVubXV0ZSgpO1xuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3liIfmjaLop4bpopHorr7lpIdcbiAgICovXG4gIGFzeW5jIGNoYW5nZVZpZGVvRGV2aWNlKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFRyYWNrIH0+IHtcbiAgICAvLyDmlrDorr7lpIfnmoTovahcbiAgICBjb25zdCByZWNlbnRUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgLy8g5pW055CG5ZCO55qE6L2oXG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlQ2FtZXJhVmlkZW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIHRoaXMuX3ZpZGVvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX3ZpZGVvQ29uZmlnO1xuICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG5cbiAgICBsZXQgbmVlZERlc3Ryb3lUcmFjazogUkNMb2NhbFRyYWNrO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzICYmIHRoaXMuX2xvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBpZiAodHJhY2suaXNWaWRlb1RyYWNrKCkpIHtcbiAgICAgICAgLy8g6LWE5rqQ6YeK5pS+XG4gICAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICAgICAgbmVlZERlc3Ryb3lUcmFjayA9IHRyYWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDku47mnKzlnLDnvJPlrZjkuK3liKDpmaTplIDmr4HnmoQgdHJhY2tcbiAgICB0aGlzLl9sb2NhbFRyYWNrcyA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigoaXRlbSkgPT4gbmVlZERlc3Ryb3lUcmFjayAmJiAoaXRlbS5nZXRUcmFja0lkKCkgIT09IG5lZWREZXN0cm95VHJhY2suZ2V0VHJhY2tJZCgpKSk7XG5cbiAgICByZWNlbnRUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgLy8g57uZ5pys5Zyw5Yqg5LiK5paw5Lqn55Sf55qE6KeG6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgdGhpcy5fbG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcblxuICAgIC8vIOmAmuefpeS4iuWxgiB0cmFja1JlYWR5XG4gICAgdGhpcy5fb25Mb2NhbFRyYWNrUmVhZHkocmVjZW50VHJhY2tzLCB0cmFjZUlkKTtcblxuICAgIC8vIOW3suWKoOWFpeaIv+mXtFxuICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAvLyDlj5HluIPmtYFcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHJlY2VudFRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog56aB55So6Z+z6aKRIHRyYWNrXG4gICAqL1xuICBhc3luYyBkaXNhYmxlQXVkaW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIHwgUkNSVENDb2RlLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxBdWRpb1RyYWNrKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTUlDUk9QSE9ORV9DTE9TRUQgfTtcbiAgICB9XG5cbiAgICAvLyDnpoHnlKjpn7PpopFcbiAgICBjb25zdCBjb2RlID0gYXdhaXQgdHJhY2subXV0ZSgpO1xuXG4gICAgcmV0dXJuIHsgY29kZSwgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovljYfjgIHpmY1cbiAgICovXG4gIGFzeW5jIGNoYW5nZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1QsIGBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgIC8qKlxuICAgICAqIOWNh+e6pyDpn7PpopEgLT4g6Z+z6KeG6aKRXG4gICAgICogMS4g5Lia5Yqh5bGC6ZyA6KaB5YWI6YCa6L+HIGNyZWF0ZUxvY2FsVHJhY2tzIOWIm+W7uuacrOWcsOinhumikSB0cmFja1xuICAgICAqIDIuIFNESyDlj6rlpITnkIblj5HluIPop4bpopEgdHJhY2tcbiAgICAgKi9cbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICAvLyAxLiDojrflj5bnvJPlrZjkuK3nmoTop4bpopEgdHJhY2tcbiAgICAgIGxldCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2s6IG5ld1RyYWNrIH0gPSBhd2FpdCB0aGlzLl9jcmVhdGVWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgY3JlYXRlIHZpZGVvIHRyYWNrIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2sgPSBuZXdUcmFjaztcbiAgICAgICAgY29uc3QgeyBtaW5CaXRyYXRlLCBtYXhCaXRyYXRlIH0gPSB0aGlzLl92aWRlb0NvbmZpZztcbiAgICAgICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcbiAgICAgIH1cbiAgICAgIC8vIDIuIOWPkeW4g+a1gVxuICAgICAgY29uc3QgcHViUGFyYW1zID0gdGhpcy5faXNQdWJUaW55ID8geyB0cmFjazogdHJhY2shLCBpc1B1YlRpbnk6IHRydWUgfSA6IHRyYWNrITtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5wdWJsaXNoKFtwdWJQYXJhbXNdLCB0cmFjZUlkKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgcHVibGlzaCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpmY3nuqcg6Z+z6KeG6aKRIC0+IOmfs+mikVxuICAgICAqL1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIC8vIDEuIOiOt+WPluacrOWcsOinhumikSB0cmFja1xuICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuXG4gICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgLy8g5Y+W5raI5Y+R5biD6KeG6aKRXG4gICAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbSEudW5wdWJsaXNoKFt0cmFja10pO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHVucHVibGlzaCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDph4rmlL7op4bpopEgdHJhY2tcbiAgICAgICAgdGhpcy5kZXN0cm95VHJhY2sodHJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWKoOWFpSBSVEMg5oi/6Ze0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgam9pblJUQ1Jvb20oY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHJvb20/OiBSQ1JUQ1Jvb20sIHRyYWNrcz86IFJDUmVtb3RlVHJhY2tbXSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfSk9JTl9SVENfUk9PTV9ULCBgY2FsbDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlLCByb29tLCB0cmFja3MgfSA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8SUpvaW5SVENSb29tUmVzPih7XG4gICAgICBhc3luY0ZuOiB0aGlzLl9ydGNDbGllbnQuam9pblJUQ1Jvb20uYmluZCh0aGlzLl9ydGNDbGllbnQpLFxuICAgICAgZm5BcmdzOiBbY2FsbElkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2UsIFJUQ01vZGUuQ0FMTF0sXG4gICAgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfSk9JTl9SVENfUk9PTV9SLCBgY2FsbElkOiAke2NhbGxJZH0sIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX29uUlRDTWV0aG9kRmFpbChSQ0NhbGxQbHVzUmVhc29uLkpPSU5fUk9PTV9FUlIsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0pPSU5fUlRDX1JPT01fUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9yb29tID0gcm9vbSE7XG4gICAgdGhpcy5fb25TZWxmSm9pbmVkKHsgY2FsbElkLCB1c2VySWQ6IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkgfSwgdHJhY2VJZCk7XG4gICAgdHJhY2tzPy5sZW5ndGggJiYgdGhpcy5fb25SZW1vdGVUcmFja1B1Ymxpc2godHJhY2tzKTtcblxuICAgIHRoaXMuX2NhbGxJZCA9IGNhbGxJZDtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCByb29tLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMg6K6i6ZiFXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3Vic2NyaWJlVHJhY2tzKHRyYWNrczogKElTdWJzY3JpYmVBdHRyKVtdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TVUJTQ1JJQkVfVCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcGFyYW1zOiB0cmFja3MubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHJhY2ssIHN1YlRpbnkgfSA9IGl0ZW07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHJhY2tJZDogdHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICAgIHN1YlRpbnksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8SVN1YlJlcz4oe1xuICAgICAgYXN5bmNGbjogdGhpcy5fcm9vbSEuc3Vic2NyaWJlLmJpbmQodGhpcy5fcm9vbSksXG4gICAgICBmbkFyZ3M6IFt0cmFja3NdLFxuICAgICAgb25FcnJvcjogKGNvZGUpID0+IHt9LFxuICAgIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25GZXRjaFJlbW90ZU1lZGlhRXJyb3IodHJhY2tzLCBjb2RlKTtcblxuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uU1VCU0NSSUJFX0VSUiwgdHJhY2VJZCk7XG5cbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TVUJTQ1JJQkVfUiwgYGVycm9yQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMg5Y+W5raI6K6i6ZiFXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5zdWJzY3JpYmVUcmFja3ModHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20hLnVuc3Vic2NyaWJlKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfVU5TVUJTQ1JJQkVfUiwgYGVycm9yQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVsZWFzZVN0b3JlZERhdGEoKSB7XG4gICAgdGhpcy5fcm9vbSA9IG51bGw7XG4gICAgdGhpcy5fcmVtb3RlQXVkaW9FbmFibGUgPSB0cnVlO1xuICAgIHRoaXMuX3VzZXJWaWV3TWFwID0ge307XG4gIH1cblxuICBnZXRSZW1vdGVUcmFja3MoKTogeyBbdXNlcklkOiBzdHJpbmddOiBSQ1JlbW90ZVRyYWNrW119IHtcbiAgICBjb25zdCB0cmFja3M6IHsgW3VzZXJJZDogc3RyaW5nXTogUkNSZW1vdGVUcmFja1tdfSA9IHt9O1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHRyYWNrcztcbiAgICB9XG5cbiAgICBjb25zdCB1c2VySWRzID0gdGhpcy5fcm9vbS5nZXRSZW1vdGVVc2VySWRzKCk7XG4gICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQ6IHN0cmluZykgPT4ge1xuICAgICAgdHJhY2tzW3VzZXJJZF0gPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFja3NCeVVzZXJJZCh1c2VySWQpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFja3M7XG4gIH1cblxuICBnZXRSZW1vdGVUcmFjayh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb20/LmdldFJlbW90ZVRyYWNrc0J5VXNlcklkKHVzZXJJZCkuZmluZCgodHJhY2spID0+ICgobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPKSA/IHRyYWNrLmlzQXVkaW9UcmFjaygpIDogdHJhY2suaXNWaWRlb1RyYWNrKCkpKTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgLyoqXG4gICAqIFJUQyDkuovku7bnm5HlkKzms6jlhoxcbiAgICovXG4gIHByaXZhdGUgX3JlZ1JUQ0xpc3RlbmVycygpIHtcbiAgICAvLyDms6jlhozmiL/pl7Tkuovku7bnm5HlkKxcbiAgICB0aGlzLl9yb29tIS5yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKHtcbiAgICAgIC8qKlxuICAgICAgICog5pys56uv6KKr6Lii5Ye65oi/6Ze05pe26Kem5Y+RXG4gICAgICAgKiBAZGVzY3JpcHRpb24g6KKr6Lii5Ye65oi/6Ze05Y+v6IO95piv55Sx5LqO5pyN5Yqh56uv6LaF5Ye65LiA5a6a5pe26Ze05pyq6IO95pS25YiwIHJ0Y1Bpbmcg5raI5oGv77yM5omA5Lul6K6k5Li65bex5pa556a757q/44CCXG4gICAgICAgKiDlj6bkuIDnp43lj6/og73mmK/lt7HmlrkgcnRjUGluZyDlpLHotKXmrKHmlbDotoXlh7rkuIrpmZDvvIzmlYXogIzkuLvliqjmlq3nur9cbiAgICAgICAqIEBwYXJhbSBieVNlcnZlclxuICAgICAgICog5b2T5YC85Li6IGZhbHNlIOaXtu+8jOivtOaYjuacrOerryBydGNQaW5nIOi2heaXtlxuICAgICAgICog5b2T5YC85Li6IHRydWUg5pe277yM6K+05piO5pys56uv5pS25Yiw6KKr6Lii5Ye65oi/6Ze06YCa55+lXG4gICAgICAgKi9cbiAgICAgIG9uS2lja09mZjogKGJ5U2VydmVyOiBib29sZWFuLCBzdGF0ZT86IFJDS2lja1JlYXNvbiB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICB0aGlzLl9vbktpY2tPZmYoYnlTZXJ2ZXIsIHRoaXMuX3Jvb20hLmdldFJvb21JZCgpLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMuX3JlbGVhc2VTdG9yZWREYXRhKCk7XG4gICAgICB9LFxuICAgICAgLy8g6L+c56uv55So5oi35Yqg5YWlXG4gICAgICBvblVzZXJKb2luOiAodXNlcklkOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICBjb25zdCBpbmZvID0gdXNlcklkLm1hcCgoaWQpID0+ICh7IGNhbGxJZDogdGhpcy5fY2FsbElkLCB1c2VySWQ6IGlkIH0pKTtcbiAgICAgICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgICAgIHRoaXMuX29uT3RoZXJNZW1Kb2luZWQoaW5mbywgdHJhY2VJZCk7XG4gICAgICB9LFxuICAgICAgLy8g6L+c56uv55So5oi356a75byAXG4gICAgICBvblVzZXJMZWF2ZTogKHVzZXJJZHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX3VzZXJWaWV3TWFwW3VzZXJJZF07XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8vIOi/nOerr+i1hOa6kOWPkeW4g1xuICAgICAgb25UcmFja1B1Ymxpc2g6IHRoaXMuX29uUmVtb3RlVHJhY2tQdWJsaXNoLmJpbmQodGhpcyksXG4gICAgICAvLyDov5znq6/otYTmupDlj5bmtojlj5HluINcbiAgICAgIG9uVHJhY2tVbnB1Ymxpc2g6IHRoaXMuX29uVHJhY2tVbnB1Ymxpc2guYmluZCh0aGlzKSxcbiAgICAgIC8vIOi/nOerr+i1hOa6kOWHhuWkh+Wwsee7qlxuICAgICAgb25UcmFja1JlYWR5OiAodHJhY2s6IFJDUmVtb3RlVHJhY2spID0+IHtcbiAgICAgICAgdGhpcy5fb25SZW1vdGVUcmFja1JlYWR5KFt0cmFja10pO1xuICAgICAgfSxcbiAgICAgIC8vIOWPkeW4g+iAheemgeeUqOOAgeWQr+eUqOinhumikVxuICAgICAgb25WaWRlb011dGVDaGFuZ2U6ICh2aWRlb1RyYWNrOiBSQ1JlbW90ZVZpZGVvVHJhY2spID0+IHtcbiAgICAgICAgdGhpcy5fb25WaWRlb011dGVDaGFnbmUoe1xuICAgICAgICAgIGZyb21Vc2VySWQ6IHZpZGVvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgbXV0ZWQ6IHZpZGVvVHJhY2suaXNPd25lck11dGVkKCksXG4gICAgICAgICAgdHJhY2tJZDogdmlkZW9UcmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8vIOWPkeW4g+iAheemgeeUqOOAgeWQr+eUqOmfs+mikVxuICAgICAgb25BdWRpb011dGVDaGFuZ2U6IChhdWRpb1RyYWNrOiBSQ1JlbW90ZUF1ZGlvVHJhY2spID0+IHtcbiAgICAgICAgdGhpcy5fb25BdWRpb011dGVDaGFuZ2Uoe1xuICAgICAgICAgIGZyb21Vc2VySWQ6IGF1ZGlvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgbXV0ZWQ6IGF1ZGlvVHJhY2suaXNPd25lck11dGVkKCksXG4gICAgICAgICAgdHJhY2tJZDogYXVkaW9UcmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG9uUlRDUGVlckNvbm5lY3Rpb25DbG9zZUJ5RXhjZXB0aW9uOiB0aGlzLl9vblJUQ1BlZXJDb25uZWN0aW9uQ2xvc2VCeUV4Y2VwdGlvbi5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICAgIC8vIOazqOWGjOi0qOmHj+aVsOaNruaKpeWRiuebkeWQrFxuICAgIHRoaXMuX3Jvb20hLnJlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoe1xuICAgICAgb25TdGF0ZVJlcG9ydDogdGhpcy5fb25SVENTdGF0ZVJlcG9ydC5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICAgIC8vIOazqOWGjOmfs+mHj+S4iuaKpeS6i+S7tlxuICAgIHRoaXMuX3Jvb20hLm9uQXVkaW9MZXZlbENoYW5nZSgoYXVkaW9MZXZlbFJlcG9ydExpc3QpID0+IHtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uVXNlckF1ZGlvTGV2ZWxDaGFuZ2VkKGF1ZGlvTGV2ZWxSZXBvcnRMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uTG9jYWxUcmFja1JlYWR5KHRyYWNrczogUkNMb2NhbFRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uVXNlck1lZGlhQXZhaWxhYmxlKHRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vblJlbW90ZVRyYWNrUmVhZHkodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblVzZXJNZWRpYUF2YWlsYWJsZSh0cmFja3MpO1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9SRUNFSVZFX0ZJUlNUX0ZSQU1FX18pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25LaWNrT2ZmKGJ5U2VydmVyOiBib29sZWFuLCByb29tSWQ6IHN0cmluZywgc3RhdGU/OiBSQ0tpY2tSZWFzb24sIGtpY2tFeHRyYT86IFJDQ2FsbEtpY2tFeHRyYSkge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfS0lDS19PRkZfTywgYHJvb25JZDogJHtyb29tSWR9LCBieVNlcnZlcjogJHtieVNlcnZlcn0sIHN0YXRlOiAke3N0YXRlfSwga2lja0V4dHJhOiAke0pTT04uc3RyaW5naWZ5KGtpY2tFeHRyYSl9YCk7XG4gICAgbGV0IHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uID0gUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUjtcbiAgICBpZiAoYnlTZXJ2ZXIpIHtcbiAgICAgIGlmIChraWNrRXh0cmEpIHtcbiAgICAgICAgc3lzdGVtU3RhdGUgPSBraWNrRXh0cmEua2lja1JlYXNvbkNvZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uU0VSVkVSX0tJQ0s6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uS0lDS0VEX0JZX1NFUlZFUjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLk9USEVSX0tJQ0s6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLklNX0RJU0NPTk5FQ1RFRDpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLklNX0xPR09VVDpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5MT0dPVVQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5PVEhFUl9DTElFTlRfSU1fQ09OTkVDVEVEOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9MT0dJTjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX09OX0tJQ0tPRkZfXywgc3lzdGVtU3RhdGUsIHJvb21JZCk7XG4gIH1cblxuICAvKipcbiAgICogUlRDIFBlZXIg5byC5bi45YWz6ZetXG4gICAqIOenu+WKqOerr+acquWkhOeQhuatpOWbnuiwg++8jOWumuS5iSBzeXNTdGF0dXMg5Li6IENPTk5FQ1RJT05fRVJSXG4gICAqL1xuICBwcml2YXRlIF9vblJUQ1BlZXJDb25uZWN0aW9uQ2xvc2VCeUV4Y2VwdGlvbigpIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1BFRVJDT05ORUNUSU9OX0VYQ0VQVF9DTE9TRV9PLCAnJywgdHJhY2VJZCk7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX1JUQ19QRUVSQ09OTkVDVElPTl9BQk5PUk1BTF9DTE9TRV9fLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX29uU2VsZkpvaW5lZChpbmZvOiBJTWVtYmVySW5mbywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX09OX1NFTEZfSk9JTkVEX18sIGluZm8uY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUmVtb3RlVHJhY2tQdWJsaXNoKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UodHJhY2tzLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX1BVQkxJU0hfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB0cmFja0lkczogdHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgbmVlZFN1YlRyYWNrczogSVN1YnNjcmliZUF0dHJbXSA9IFtdO1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOmfs+mikeaXtu+8jOebtOaOpeiuoumYhVxuICAgICAgICovXG4gICAgICBpZiAodHJhY2suaXNBdWRpb1RyYWNrKCkpIHtcbiAgICAgICAgbmVlZFN1YlRyYWNrcy5wdXNoKHsgdHJhY2ssIHN1YlRpbnk6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQodGhpcy5fY2FsbElkLCB0cmFjayk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3VzZXJWaWV3TWFwW3VzZXJJZF0/LnZpZGVvVmlldykge1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZUNhbWVyYVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrKTtcbiAgICAgICAgY29uc3QgeyBpc1RpbnkgfSA9IHRoaXMuX3VzZXJWaWV3TWFwW3VzZXJJZF07XG4gICAgICAgIG5lZWRTdWJUcmFja3MucHVzaCh7IHRyYWNrLCBzdWJUaW55OiBpc1RpbnkgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbmVlZFN1YlRyYWNrcy5sZW5ndGggJiYgdGhpcy5zdWJzY3JpYmVUcmFja3MobmVlZFN1YlRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9vblRyYWNrVW5wdWJsaXNoKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UodHJhY2tzLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX1VOUFVCTElTSF9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBhd2FpdCB0aGlzLnVuc3Vic2NyaWJlVHJhY2tzKHRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkF1ZGlvTXV0ZUNoYW5nZShpbmZvOiBJTWVkaWFNdXRlQ2hhbmdlSW5mbykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfRU5BQkxFX0NIQU5HRV9PLCBKU09OLnN0cmluZ2lmeSh7IGluZm8gfSksIHRyYWNlSWQpO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5fcm9vbSEuZ2V0UmVtb3RlVHJhY2soaW5mby50cmFja0lkKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVNaWNyb3Bob25lU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2shKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVmlkZW9NdXRlQ2hhZ25lKGluZm86IElNZWRpYU11dGVDaGFuZ2VJbmZvKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08sIEpTT04uc3RyaW5naWZ5KHsgaW5mbyB9KSwgdHJhY2VJZCk7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFjayhpbmZvLnRyYWNrSWQpO1xuICAgIHRoaXMuX29uRGV2aWNlRW5hYmxlQ2hhbmdlKFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZUNhbWVyYVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrISk7XG4gIH1cblxuICBwcml2YXRlIF9vblJUQ1N0YXRlUmVwb3J0KHJlcG9ydDogSVJDUlRDU3RhdGVSZXBvcnQpIHtcbiAgICBjb25zdCB7IHNlbmRlcnMsIHJlY2VpdmVycyB9ID0gcmVwb3J0O1xuICAgIHNlbmRlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgeyBraW5kLCBwYWNrZXRzTG9zdFJhdGUsIHJ0dCB9ID0gaXRlbTtcbiAgICAgIGlmICh0aGlzLl9jYWxsTWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPICYmIGtpbmQgPT09ICdhdWRpbycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcj8ub25TZW5kUGFja2V0TG9zcyhwYWNrZXRzTG9zdFJhdGUgfHwgMCwgcnR0IHx8IDApO1xuICAgIH0pO1xuICAgIHJlY2VpdmVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHRyYWNrSWQsIGtpbmQsIHBhY2tldHNMb3N0UmF0ZSwgYml0cmF0ZSxcbiAgICAgIH0gPSBpdGVtO1xuICAgICAgaWYgKHRoaXMuX2NhbGxNZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8gJiYga2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IHVzZXJJZCB9ID0gaGVscGVyLnBhcnNlVHJhY2tJZCh0cmFja0lkKTtcbiAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgW3VzZXJJZDogc3RyaW5nXTogUkNDYWxsUGx1c1BhY2tldExvc3NTdGF0cztcbiAgICAgIH0gPSB7fTtcbiAgICAgIGRhdGFbdXNlcklkXSA9IHtcbiAgICAgICAgcGFja2V0TG9zdFJhdGU6IHBhY2tldHNMb3N0UmF0ZSEsXG4gICAgICAgIGJpdFJhdGU6IGJpdHJhdGUsXG4gICAgICB9O1xuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcj8ub25SZWNlaXZlUGFja2V0TG9zcyhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogUlRDIOaOpeaUtuacgOe7iOWksei0peWQjumcgOimgeiwg+eUqCBoYW5ndXAg5oyC5pat55qE5oOF5Ya1XG4gKi9cbiAgcHJpdmF0ZSBfb25SVENNZXRob2RGYWlsKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BST0NFU1NfRkFJTEVEX18sIHN5c3RlbVN0YXRlLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uT3RoZXJNZW1Kb2luZWQoaW5mbzogSU1lbWJlckluZm9bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX09OX09USEVSX0pPSU5FRF9fLCBpbmZvLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uRGV2aWNlRW5hYmxlQ2hhbmdlKHRyYWNrczogUkNSZW1vdGVUcmFja1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXywgdHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rmnKzlnLDpn7PpopEgdHJhY2ssIOWIm+W7uuaIkOWKn+WQjuS/neWtmOacrOWcsOW5tuWbnuiwg+mAmuefpVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlQXVkaW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbEF1ZGlvVHJhY2t9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX0FVRElPX1RSQUNLX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcz8uc29tZSgoaXRlbSkgPT4gaXRlbS5pc0F1ZGlvVHJhY2soKSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIHRoaXMuX2F1ZGlvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fYXVkaW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIC8vIOacrOasoee8k+WtmFxuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICAvLyDpgJrnn6XkuIrlsYJcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rmnKzlnLDop4bpopEgdHJhY2ssIOWIm+W7uuaIkOWKn+WQjuS/neWtmOacrOWcsOW5tuWbnuiwg+mAmuefpVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlVmlkZW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFZpZGVvVHJhY2t9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcz8uc29tZSgoaXRlbSkgPT4gaXRlbS5pc1ZpZGVvVHJhY2soKSAmJiAhaXRlbS5pc0Rlc3Ryb3llZCgpKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZUNhbWVyYVZpZGVvVHJhY2soUlRDUmVzb3VyY2VUYWcuTk9STUFMLCB0aGlzLl92aWRlb0NvbmZpZyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX3ZpZGVvQ29uZmlnO1xuICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG5cbiAgICAvLyDmnKzmrKHnvJPlrZhcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG4gICAgLy8g6YCa55+l5LiK5bGCXG4gICAgdGhpcy5fb25Mb2NhbFRyYWNrUmVhZHkoW3RyYWNrIV0sIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw57yT5a2Y6KeG6aKRIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxWaWRlb1RyYWNrKCk6IFJDTG9jYWxUcmFjayB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxvY2FsVmlkZW9UcmFjazogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcykge1xuICAgICAgW2xvY2FsVmlkZW9UcmFja10gPSB0aGlzLl9sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw57yT5a2Y6Z+z6aKRIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxBdWRpb1RyYWNrKCk6IFJDTG9jYWxUcmFjayB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxvY2FsQXVkaW9UcmFjazogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcykge1xuICAgICAgW2xvY2FsQXVkaW9UcmFja10gPSB0aGlzLl9sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbEF1ZGlvVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICog5Y+R5biD5pys5Zyw6LWE5rqQ55qE6YC76L6RXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVibGlzaCh0cmFja3M6IChSQ0xvY2FsVHJhY2sgfCBJUHVibGlzaEF0dHJzKVtdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BVQkxJU0hfVCwgYHRyYWNrc0lkczogJHt0cmFja3MubWFwKChpdGVtKSA9PiAoKGl0ZW0gaW5zdGFuY2VvZiBSQ0xvY2FsVHJhY2spID8gaXRlbS5nZXRUcmFja0lkKCkgOiBpdGVtLnRyYWNrLmdldFRyYWNrSWQoKSkpfWAsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCByZXRyeUFzeW5jRm4gPElQdWJSZXM+KHtcbiAgICAgIGFzeW5jRm46IHRoaXMuX3Jvb20hLnB1Ymxpc2guYmluZCh0aGlzLl9yb29tKSxcbiAgICAgIGZuQXJnczogW3RyYWNrc10sXG4gICAgICBvbkVycm9yOiAoY29kZSkgPT4ge30sXG4gICAgfSk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX29uUlRDTWV0aG9kRmFpbChSQ0NhbGxQbHVzUmVhc29uLlBVQkxJU0hfRVJSLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QVUJMSVNIX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUFVCTElTSF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoVmlkZW9UcmFjaygpIHtcbiAgICBjb25zdCBkZWZhdWx0VmlkZW9UcmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgY29uc3QgcHViUGFyYW1zID0gdGhpcy5faXNQdWJUaW55ID8geyB0cmFjazogZGVmYXVsdFZpZGVvVHJhY2shLCBpc1B1YlRpbnk6IHRydWUgfSA6IGRlZmF1bHRWaWRlb1RyYWNrITtcbiAgICByZXR1cm4gdGhpcy5fcm9vbSEucHVibGlzaChbcHViUGFyYW1zXSk7XG4gIH1cblxuICBzZXRWaWRlb1ZpZXcobGlzdDoge3VzZXJJZDogc3RyaW5nLCB2aWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQsIGlzVGlueT86IGJvb2xlYW59W10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG5lZWRTdWJUcmFja3M6IElTdWJzY3JpYmVBdHRyW10gPSBbXTtcbiAgICBsaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCB2aWRlb0VsZW1lbnQsIGlzVGlueSA9IGZhbHNlIH0gPSBpdGVtO1xuICAgICAgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXSA9IHtcbiAgICAgICAgdmlkZW9WaWV3OiB2aWRlb0VsZW1lbnQsXG4gICAgICAgIGlzVGlueSxcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIOiuvue9ruacrOerr+inhuWbvuaXtu+8jOWPquWtmOWCqOaVsOaNru+8jOaXoOmcgOiuoumYhVxuICAgICAgICovXG4gICAgICBpZiAodXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICog6K6+572u6L+c56uv6KeG5Zu+5pe277yM5aaC5p6c5bey57uP5Yqg5YWl5oi/6Ze077yM5YiZ6I635Y+W6L+c56uv6LWE5rqQ55u05o6l6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZW1vdGVUcmFja3MgPSB0aGlzLmdldFJlbW90ZVRyYWNrcygpO1xuICAgICAgY29uc3Qgc3ViUGFyYW1zID0gKHJlbW90ZVRyYWNrcyFbdXNlcklkXSB8fCBbXSkubWFwKCh0cmFjaykgPT4gKHtcbiAgICAgICAgdHJhY2ssXG4gICAgICAgIHN1YlRpbnk6IGlzVGlueSxcbiAgICAgIH0pKS5maWx0ZXIoKHsgdHJhY2sgfSkgPT4gIXRyYWNrLmlzU3Vic2NyaWJlZCgpKTtcbiAgICAgIG5lZWRTdWJUcmFja3MucHVzaCguLi5zdWJQYXJhbXMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX1ZJREVPX1ZJRVdfTywgSlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIHVzZXJWaWV3TWFwOiBnZXRVc2VyVmlkZW9WaWV3SW5mbyh0aGlzLl91c2VyVmlld01hcCksXG4gICAgICAgIG5lZWRTdWJUcmFja0lkczogbmVlZFN1YlRyYWNrcy5tYXAoKHsgdHJhY2sgfSkgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICAgIH0sXG4gICAgKSwgdHJhY2VJZCk7XG5cbiAgICBuZWVkU3ViVHJhY2tzLmxlbmd0aCAmJiB0aGlzLnN1YnNjcmliZVRyYWNrcyhuZWVkU3ViVHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTop4blm77ml7bvvIzlj5bmtojorqLpmIXotYTmupBcbiAgICovXG4gIHJlbW92ZVZpZGVvVmlldyh1c2VySWRzOiBzdHJpbmdbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdW5zdWJUcmFja3M6IFJDUmVtb3RlVHJhY2tbXSA9IFtdO1xuICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHRyYWNrcyA9IHRoaXMuZ2V0UmVtb3RlVHJhY2tzKClbdXNlcklkXTtcbiAgICAgIGlmICh0cmFja3MgJiYgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB2aWRlb1RyYWNrID0gdHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzVmlkZW9UcmFjaygpKTtcbiAgICAgICAgdmlkZW9UcmFjay5sZW5ndGggJiYgdW5zdWJUcmFja3MucHVzaCh2aWRlb1RyYWNrWzBdKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLl91c2VyVmlld01hcFt1c2VySWRdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVNT1ZFX1ZJREVPX1ZJRVdfTywgSlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIHVzZXJWaWV3TWFwOiBnZXRVc2VyVmlkZW9WaWV3SW5mbyh0aGlzLl91c2VyVmlld01hcCksXG4gICAgICAgIHVuc3ViVHJhY2tzOiB1bnN1YlRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgICAgfSxcbiAgICApLCB0cmFjZUlkKTtcblxuICAgIGlmICh1bnN1YlRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVUcmFja3ModW5zdWJUcmFja3MsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blrZjlgqjnmoTkurrlkZjlkowgdmlkZW8g5YWD57Sg5pWw5o2uXG4gICAqL1xuICBnZXRVc2VyVmlld01hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlclZpZXdNYXA7XG4gIH1cblxuICAvKipcbiAgICog5pKt5pS+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+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh1c2VySWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IsIGBwYXJhbXMgZXJyLCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNNZWRpYVR5cGVbbWVkaWFUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYHBhcmFtcyBlcnIsIG1lZGlhVHlwZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4jeaSreaUvuiHquW3seeahOWjsOmfs1xuICAgICAqL1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgdXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3kuJrliqHlsYLmmK/lkKborr7nva7ov4flvZPliY3kurrlkZjnmoTop4bpopHop4blm75cbiAgICAgKi9cbiAgICBjb25zdCB7IHZpZGVvVmlldyB9ID0gdGhpcy5fcnRjTW9kdWxlLmdldFVzZXJWaWV3TWFwKClbdXNlcklkXSB8fCB7fTtcbiAgICBpZiAobWVkaWFUeXBlICE9PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPICYmICF2aWRlb1ZpZXcpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuVklERU9fVklFV19OT1RfU0VUfSwgdmlkZW8gdmlldyBub3Qgc2V0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5WSURFT19WSUVXX05PVF9TRVQgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcnRjTW9kdWxlLnBsYXlNZWRpYSh1c2VySWQsIG1lZGlhVHlwZSwgdmlkZW9WaWV3LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rop4bpopHphY3nva7mnoTlu7rlmahcbiAgICogQHJldHVybnMgUkNWaWRlb0NvbmZpZ0J1aWxkZXIg55So5LqO5p6E6YCg6KeG6aKR6YeH6ZuG5pe255qE6YWN572u6aG577yM5Y+v5Lul6K6+572u5pGE5YOP5aS06K6+5aSHIGlk44CB5bin546H44CB5YiG6L6o546H562J77yMXG4gICAqIOiuvue9ruWujOmcgOiwgyBidWlsZCDmlrnms5XvvIzmnIDnu4jlnKggc2V0VmlkZW9Db25maWcg5ZCO55Sf5pWIXG4gICAqL1xuICBjcmVhdGVWaWRlb0NvbmZpZ0J1aWxkZXIoKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUkNWaWRlb0NvbmZpZ0J1aWxkZXIodGhpcy5fbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7op4bpopHphY3nva5cbiAgICog5LiL5qyh6YeH6ZuG5pe255Sf5pWI77yM5aaC5YiH5o2i5pGE5YOP5aS044CB6YeN5paw5bu656uL6YCa6K+dXG4gICAqL1xuICBzZXRWaWRlb0NvbmZpZyhjZmc6IElWaWRlb0NvbmZpZyk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19ULCBKU09OLnN0cmluZ2lmeShjZmcpKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGZyYW1lUmF0ZSwgcmVzb2x1dGlvbiwgbWF4Qml0cmF0ZSwgbWluQml0cmF0ZSxcbiAgICB9ID0gY2ZnO1xuXG4gICAgaWYgKCFSQ0NhbGxQbHVzRnJhbWVSYXRlW2ZyYW1lUmF0ZV0pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCBmcmFtZVJhdGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7ZnJhbWVSYXRlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoIVJDQ2FsbFBsdXNSZXNvbHV0aW9uW3Jlc29sdXRpb25dKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1IsIGBwYXJhbSBlcnJvciwgcmVzb2x1dGlvbiBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtyZXNvbHV0aW9ufWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZUJpdHJhdGUobWluQml0cmF0ZSwgbWF4Qml0cmF0ZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgZXJyb3JNc2cpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCAnc3VjY2VzcycpO1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9Db25maWcodGhpcy5fdmlkZW9Db25maWcpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rpn7PpopHphY3nva7mnoTlu7rlmahcbiAgICogQHJldHVybnMgUkNBdWRpb0NvbmZpZ0J1aWxkZXIg55So5LqO5p6E6YCg6Z+z6aKR6YeH6ZuG5pe255qE6YWN572u6aG577yM5Y+v5Lul6K6+572u6bqm5YWL6aOO6K6+5aSHIGlkXG4gICAqIOiuvue9ruWujOmcgOiwgyBidWlsZCDmlrnms5XvvIzmnIDnu4jlnKggc2V0QXVkaW9Db25maWcg5ZCO55Sf5pWIXG4gICAqL1xuICBjcmVhdGVBdWRpb0NvbmZpZ0J1aWxkZXIoKTogUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUkNBdWRpb0NvbmZpZ0J1aWxkZXIodGhpcy5fbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7pn7PpopHphY3nva5cbiAgICog5LiL5qyh6YeH6ZuG5pe255Sf5pWI77yM5aaC6YeN5paw5bu656uL6YCa6K+dXG4gICAqL1xuICBzZXRBdWRpb0NvbmZpZyhjZmc6IElBdWRpb0NvbmZpZyk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19ULCBKU09OLnN0cmluZ2lmeShjZmcpKTtcbiAgICBjb25zdCB7IHNhbXBsZVJhdGUsIG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IGNmZztcbiAgICBpZiAoc2FtcGxlUmF0ZSAmJiAhaXNOdW1iZXIoc2FtcGxlUmF0ZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCBzYW1wbGVSYXRlOiB0eXBlIGlzIG51bWJlciwgdmFsdWU6ICR7c2FtcGxlUmF0ZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBlcnJvck1zZyB9ID0gdmFsaWRhdGVCaXRyYXRlKG1pbkJpdHJhdGUsIG1heEJpdHJhdGUpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1IsIGVycm9yTXNnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgJ3N1Y2Nlc3MnKTtcblxuICAgIHRoaXMuX2F1ZGlvQ29uZmlnID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0QXVkaW9Db25maWcodGhpcy5fYXVkaW9Db25maWcpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5Hotbflkbzlj6tcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr5Y+r5Lq65ZGYIHVzZXJJZCDliJfooajvvIzljZXkurrlkbzlj6vku4XpnIDlnKjmlbDnu4TkuK3mlL7nva7lr7nmlrnkuIDkurrnmoQgdXNlcklkXG4gICAqIEBwYXJhbSB0eXBlIOWNleS6uuWRvOWPqyBvciDlpJrkurrlkbzlj6tcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDpgJror53lqpLkvZPnsbvlnos6IOmfs+mikSBvciDpn7Pop4bpopFcbiAgICogQHJldHVybnMgY2FsbElkIOWRvOWPq+aIkOWKn+WQju+8jOS6p+eUn+eahOS8muivnSBpZFxuICAgKi9cbiAgYXN5bmMgc3RhcnRDYWxsKHVzZXJJZHM6IHN0cmluZ1tdLCBjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUgPSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSA9IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCBjYWxsSWQ/OiBzdHJpbmcgfT4ge1xuICAgIHRoaXMuX2NsaWVudENhbGxJZCA9IGdldFVVSUQoKTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfVCwgYHVzZXJJZHM6ICR7dXNlcklkcy5qb2luKCcsJyl9LCBjYWxsVHlwZTogJHtjYWxsVHlwZX0sIG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCkgIT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUQgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpSW5mbyA9IHRoaXMuX2NvbnRleHQuZ2V0TmF2aUluZm8oKTtcbiAgICBpZiAoIW5hdmlJbmZvIHx8ICFpc1N1cHBvcnRNZWRpYVNlcnZlcihuYXZpSW5mbykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheSh1c2VySWRzKVxuICAgICAgJiYgdXNlcklkcy5ldmVyeSgodXNlcklkKSA9PiBub3RFbXB0eVN0cmluZyh1c2VySWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZHM6IG5vdCBlbXB0eSBhcnJheSwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNUeXBlW2NhbGxUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIGNhbGxUeXBlIGlzIGlsbGVnYWwsIHZhbHVlOiAke2NhbGxUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c01lZGlhVHlwZVttZWRpYVR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgbWVkaWFUeXBlIGlzIGlsbGVnYWwsIHZhbHVlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y2V6IGKIHVzZXJJZHMg6ZW/5bqm5LiN6IO96LaF6L+HIDFcbiAgICAgKi9cbiAgICBpZiAodXNlcklkcy5sZW5ndGggPiAxICYmIGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIFlvdSBjYW4gb25seSBjYWxsIG9uZSBwZXJzb24gaW4gYSBzaW5nbGUgY2FsbCwgdXNlcklkczogJHt1c2VySWRzLmpvaW4oJywnKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5bey5a2Y5ZyoIHNlc3Npb24g5LiN5YWB6K645YaN5Y+R6LW35ZG85Y+rXG4gICAgaWYgKHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1R9LCBzZXNzaW9uIGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TRVNTSU9OX0VYSVNUIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Z+z6KeG6aKR6YCa6K+d77yM6ZyA5o+Q5YmN6YeH6ZuG6Z+z6KeG6aKR6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICBpZiAoZ2V0TWVkaWFUcmFja3NDb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBjcmVhdGUgbWVpZGEgdHJhY2tzIGVycm9yIGNvZGU6ICR7Z2V0TWVkaWFUcmFja3NDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLnN0YXJ0Q2FsbCh7XG4gICAgICB0b1VzZXJzOiB1c2VySWRzLm1hcCgodXNlcklkKSA9PiAoeyB1c2VySWQgfSkpLFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NsaWVudENhbGxJZCxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX1NUQVJUX0NBTExfUywgY29kZSwgc3RhcnRUaW1lLCBudWxsLCB0aGlzLl9jbGllbnRDYWxsSWQsIG51bGwsIHsgbWVkaWFUeXBlLCBjYWxsVHlwZSwgY2FsbElkOiBkYXRhPy5jYWxsSWQgfHwgJycgfSk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWRvOWPq+i/h+eoi+S4reaMguaWrVxuICAgICAqL1xuICAgIGNvbnN0IHsgY2FsbElkLCBjbGllbnRDYWxsSWQgfSA9IGRhdGEhO1xuICAgIGlmICh0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkID09PSBjbGllbnRDYWxsSWQpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuY2xlYXJBbGxUaW1lcihjYWxsSWQsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5oYW5ndXAoeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHRoZSAke2NhbGxJZH0gY2FsbCBoYXMgYmVlbiBoYW5ndXBgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbFR5cGUgPT09IFJDQ2FsbFBsdXNUeXBlLk1VTFRJKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZChjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBKU09OLnN0cmluZ2lmeSh7IGRhdGEsIGNvZGUgfSksIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIGNhbGxJZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeWKoOWFpei/m+ihjOS4reeahOe+pOe7hOmAmuivnVxuICAgKiBAcGFyYW0gY2FsbElkIOmAmuivnSBpZFxuICAgKi9cbiAgYXN5bmMgam9pbk11bHRpQ2FsbChjYWxsSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2NvbnRleHQuZ2V0Q29ubmVjdGlvblN0YXR1cygpICE9PSBSQ0Nvbm5lY3Rpb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUQgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpSW5mbyA9IHRoaXMuX2NvbnRleHQuZ2V0TmF2aUluZm8oKTtcbiAgICBpZiAoIW5hdmlJbmZvIHx8ICFpc1N1cHBvcnRNZWRpYVNlcnZlcihuYXZpSW5mbykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGU6IGdldFNlc3Npb25Db2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxTZXNzaW9uKHsgY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChnZXRTZXNzaW9uQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBnZXQgY2FsbCBkYXRhIGVycm9yLCBjb2RlOiAke2dldFNlc3Npb25Db2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0U2Vzc2lvbkNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG1lZGlhVHlwZSB9ID0gZGF0YSE7XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbiAmJiBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSAhPT0gY2FsbElkKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TRVNTSU9OX0VYSVNUIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Z+z6KeG6aKR6YCa6K+d77yM6ZyA5o+Q5YmN6YeH6ZuG6Z+z6KeG6aKR6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICBpZiAoZ2V0TWVkaWFUcmFja3NDb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGNyZWF0ZSBtZWlkYSB0cmFja3MgZXJyb3IgY29kZTogJHtnZXRNZWRpYVRyYWNrc0NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuam9pbkNhbGwoe1xuICAgICAgY2FsbElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICAgIGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ29ubmVjdGVkKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneS4remCgOivt+S7luS6ulxuICAgKiDljZXkurrpgJror53kuK3pgoDor7fku5bkurrkvJrlvJXlj5HpgJror53nsbvlnovlj5jmm7RcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+35Lq65YiX6KGoXG4gICAqIEByZXR1cm5zIGJ1c3lVc2VycyDov5Tlm57lv5nnur/kurrlkZjliJfooahcbiAgICovXG4gIGFzeW5jIGludml0ZSh1c2VySWRzOiBzdHJpbmdbXSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIGJ1c3lVc2Vycz86IFJDQ2FsbFBsdXNDYWxsVXNlcltdIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9ULCBgY2FsbElkOiAke3VzZXJJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KHVzZXJJZHMpXG4gICAgICAmJiB1c2VySWRzLmV2ZXJ5KCh1c2VySWQpID0+IG5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IsIGBwYXJhbXMgZXJyLCB1c2VySWRzOiBub3QgZW1wdHkgYXJyYXksIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+mCgOivt1xuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5pbnZpdGUoe1xuICAgICAgdG9Vc2VyczogdXNlcklkcy5tYXAoKHVzZXJJZCkgPT4gKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgfSkpLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBidXN5VXNlcnMgPSBbXTtcbiAgICBpZiAoZGF0YSEuYnVzeWxpbmVVc2Vycz8ubGVuZ3RoKSB7XG4gICAgICBidXN5VXNlcnMucHVzaCguLi5kYXRhIS5idXN5bGluZVVzZXJzLm1hcCgodXNlcikgPT4gKHtcbiAgICAgICAgdXNlcklkOiB1c2VyLnVzZXJJZCxcbiAgICAgICAgc3RhdGU6IHVzZXIuc2Vzc2lvblN0YXR1cyxcbiAgICAgIH0pKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgYHN1Y2Nlc3MgYnVzeVVzZXJzOiAke0pTT04uc3RyaW5naWZ5KGJ1c3lVc2Vycyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBidXN5VXNlcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror51cbiAgICogQHBhcmFtIGNhbGxJZCDpgJror50gaWRcbiAgICovXG4gIGFzeW5jIGFjY2VwdChjYWxsSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2NvbnRleHQuZ2V0Q29ubmVjdGlvblN0YXR1cygpICE9PSBSQ0Nvbm5lY3Rpb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUQgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpSW5mbyA9IHRoaXMuX2NvbnRleHQuZ2V0TmF2aUluZm8oKTtcbiAgICBpZiAoIW5hdmlJbmZvIHx8ICFpc1N1cHBvcnRNZWRpYVNlcnZlcihuYXZpSW5mbykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKblrZjlnKjpgJror51cbiAgICAgKiDpnIDku47lvZPliY3pgJror53ojrflj5YgbWVpZGFUeXBlXG4gICAgICovXG4gICAgY29uc3QgbWFpblNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBjb25zdCBob2xkU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0SG9sZFNlc3Npb24oY2FsbElkKTtcbiAgICBpZiAoIW1haW5TZXNzaW9uICYmICFob2xkU2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBlcnJDb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWMuuWIhuaOpeWQrCBtYWluU2Vzc2lvbiDlkowgaG9sZFNlc3Npb25cbiAgICAgKiDlpoLmnpzmjqXlkKwgaG9sZFNlc3Npb27vvIzpnIDlhYjmjILmlq0gbWFpblNlc3Npb25cbiAgICAgKi9cbiAgICBjb25zdCBpc0FjY2VwdEhvbGRTZXNzaW9uID0gY2FsbElkID09PSBob2xkU2Vzc2lvbj8uZ2V0Q2FsbElkKCk7XG4gICAgaWYgKGlzQWNjZXB0SG9sZFNlc3Npb24pIHtcbiAgICAgIGNvbnN0IHsgY29kZTogaGFuZ3VwTWFpblNlc3Npb25Db2RlIH0gPSBhd2FpdCB0aGlzLmhhbmd1cChtYWluU2Vzc2lvbiEuZ2V0Q2FsbElkKCkpO1xuICAgICAgaWYgKGhhbmd1cE1haW5TZXNzaW9uQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGhhbmd1cCBtYWluU2Vzc2lvbiBlcnJvciBjb2RlOiAke2hhbmd1cE1haW5TZXNzaW9uQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogaGFuZ3VwTWFpblNlc3Npb25Db2RlIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnVwZ3JhZGVNYWluU2Vzc2lvbihjYWxsSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmfs+inhumikemAmuivne+8jOmcgOaPkOWJjemHh+mbhumfs+inhumikei1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IG1lZGlhVHlwZSA9IG1haW5TZXNzaW9uIS5nZXRNZWRpYVR5cGUoKTtcbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgY3JlYXRlIG1laWRhIHRyYWNrcyBlcnJvciBjb2RlOiAke2dldE1lZGlhVHJhY2tzQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+aOpeWQrFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5hY2NlcHQoeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQ0NFUFRfQ0FMTF9TLCBjb2RlLCBzdGFydFRpbWUsIG1haW5TZXNzaW9uISk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZChjYWxsSWQsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX19pbm5lckhhbmd1cChvcHRzOiBJSGFuZ3VwRm9yQnVzeU9wdHMsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgY2FsbElkIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKHRydWUpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuY2xlYXJBbGxUaW1lcihjYWxsSWQsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmhhbmd1cChvcHRzLCB0cmFjZUlkKTtcblxuICAgIGlmIChjb2RlID09PSBDYWxsU2VydmVyRXJyb3JDb2RlLkNBTExfTk9UX0VYSVNUKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY2FsbElkID09PSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0Q2FsbElkKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ2xvc2UoY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5pat6YCa6K+dXG4gICAqIEBwYXJhbSBjYWxsSWQg5Li65Y+v6YCJ5Y+C5pWw77yM5LiN5Lyg5pe277yM5oyC5pat5q2j5Zyo6L+b6KGM55qE5Li7IHNlc3Npb27vvIzkvKDlhaXml7blj6/mjIflrprmjILmlq3kuLvpgJror53miJbmmoLmnKrlu7rnq4vov57mjqXnmoTpgJror51cbiAgICog5pqC5pyq5bu656uL6L+e5o6l55qE6YCa6K+d77ya5oyH5bey5Zyo6YCa6K+d5Lit5pe277yM5pS25Yiw5ZG85Y+r5L2G5pqC5pyq5o6l5ZCs55qE6YCa6K+dXG4gICAqL1xuICBhc3luYyBoYW5ndXAoY2FsbElkPzogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmICghbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw57G75Z6L5qCh6aqMXG4gICAgICovXG4gICAgaWYgKGNhbGxJZCAmJiAhaXNTdHJpbmcoY2FsbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1IsIGBwYXJhbXMgZXJyLCBjYWxsSWQ6IHR5cGUgaXMgc3RyaW5nLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5TZXNzaW9uQ2FsbElkID0gbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG5cbiAgICAvKipcbiAgICAgKiDmoKHpqozkvKDlhaXnmoQgY2FsbElkIOaYr+WQpuato+ehrlxuICAgICAqL1xuICAgIGlmIChjYWxsSWQgJiYgY2FsbElkICE9PSBtYWluU2Vzc2lvbkNhbGxJZCAmJiAhdGhpcy5fY2FsbEVuZ2luZS5nZXRIb2xkU2Vzc2lvbihjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZCBpcyBpbnZhbGlkLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5DQUxMX0lEX0lOVkFMSUQgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9pc0xhdW5jaEhhbmd1cCA9IHRydWU7XG5cbiAgICB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkID0gY2FsbElkIHx8IG1haW5TZXNzaW9uQ2FsbElkO1xuICAgIGNvbnN0IGhvbGRTZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRIb2xkU2Vzc2lvbih0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkKTtcbiAgICBjb25zdCBoYW5ndXBTZXNzaW9uID0gaG9sZFNlc3Npb24gfHwgbWFpblNlc3Npb247XG5cbiAgICAvKipcbiAgICAgKiDojrflj5bmjILmlq3ml7bnmoTkurrlkZjns7vnu5/nirbmgIFcbiAgICAgKi9cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB1c2VyU3RhdGUgPSBtYWluU2Vzc2lvbi5nZXRVc2VyTGlzdCgpLmZpbHRlcigodXNlckluZm8pID0+IHVzZXJJbmZvLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZClbMF0uc3RhdGU7XG4gICAgY29uc3QgaXNDYWxsZWUgPSBbbWFpblNlc3Npb24uZ2V0Q3JlYXRvclVzZXJJZCgpLCBtYWluU2Vzc2lvbi5nZXRJbnZpdGVyVXNlcklkKCldLmluY2x1ZGVzKGN1cnJlbnRVc2VySWQpO1xuICAgIGNvbnN0IHN5c3RlbVN0YXRlID0gZ2V0SGFuZ3VwU3lzdGVtU3RhdGUodXNlclN0YXRlLCBpc0NhbGxlZSk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX19pbm5lckhhbmd1cCh7IGNhbGxJZDogdGhpcy5fbmVlZEhhbmd1cENhbGxJZCwgc3lzdGVtU3RhdGUgfSwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDkuIrmiqXmjILmlq3ln4vngrnmlbDmja5cbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19IQU5HVVBfQ0FMTF9TLCBjb2RlLCBzdGFydFRpbWUsIGhhbmd1cFNlc3Npb24hLCB0aGlzLl9jbGllbnRDYWxsSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9SLCBgc2lnbmFsIGVycm9yIGNvZGUgOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbmVlZEhhbmd1cENhbGxJZCA9IG51bGw7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit5Y+R6LW35aqS5L2T57G75Z6L5Y+Y5pu06K+35rGCXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uSWQg5a6i5oi356uv5ZKM5pyN5Yqh56uv5Lqk5LqS55qE5LqL5YqhIGlk77yM5Zyo5Y+W5raI5oiW5bqU562U5aqS5L2T57G75Z6L5YiH5o2i5pe25Lyg5YWlXG4gICAqL1xuICBhc3luYyByZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHRyYW5zYWN0aW9uSWQ/OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9ULCBgbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmIChpc1VuZGVmaW5lZChSQ0NhbGxQbHVzTWVkaWFUeXBlW21lZGlhVHlwZV0pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbXMgZXJyLCBtZWRpYVR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuZ2V0Q3VycmVudENhbGxTZXNzaW9uKCk7XG4gICAgY29uc3Qgb2xkTWVkaWFUeXBlID0gbWFpblNlc3Npb24/LmdldE1lZGlhVHlwZSgpO1xuXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gb2xkTWVkaWFUeXBlKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk1FRElBVFlQRV9JTlZBTElEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTUVESUFUWVBFX0lOVkFMSUQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+WqkuS9k+exu+Wei+WIh+aNolxuICAgICAqL1xuICAgIGNvbnN0IHRvVXNlcklkcyA9IG1haW5TZXNzaW9uPy5nZXRVc2VyTGlzdCgpLmZpbHRlcigodXNlcikgPT4gdXNlci51c2VySWQgIT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpLm1hcCgodXNlcikgPT4gdXNlci51c2VySWQpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5yZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKHsgbWVkaWFUeXBlLCB0b1VzZXJJZHM6IHRvVXNlcklkcyB8fCBbXSB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHN1Y2Nlc3MgdHJhbnNhY3Rpb25JZDogJHtkYXRhIS50cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhbnNhY3Rpb25JZDogZGF0YSEudHJhbnNhY3Rpb25JZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlua2iOWIh+aNouWqkuS9k+exu+Wei+WPmOabtOivt+axglxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCDlrqLmiLfnq6/lkozmnI3liqHnq6/kuqTkupLnmoTkuovliqEgaWTvvIzkuLrlj5HotbflqpLkvZPnsbvlnovlj5jmm7Tor7fmsYLov5Tlm57nmoQgdHJhbnNhY3Rpb25JZFxuICAgKi9cbiAgYXN5bmMgY2FuY2VsQ2hhbmdlTWVkaWFUeXBlKHRyYW5zYWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1QsIGB0cmFuc2FjdGlvbklkOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHRyYW5zYWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCB0cmFuc2FjdGlvbklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+W5raI5aqS5L2T57G75Z6L5YiH5o2iXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbmNlbENoYW5nZU1lZGlhVHlwZSh7IHRyYW5zYWN0aW9uSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovlj5jmm7TlupTnrZRcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQg5a6i5oi356uv5ZKM5pyN5Yqh56uv5Lqk5LqS55qE5LqL5YqhIGlk77yM5Li6IG9uUmVjZWl2ZWRDaGFuZ2VUb1ZpZGVvIOebkeWQrOaUtuWIsCB0cmFuc2FjdGlvbklkIOWPguaVsOWAvFxuICAgKi9cbiAgYXN5bmMgcmVwbHlDaGFuZ2VNZWRpYVR5cGUodHJhbnNhY3Rpb25JZDogc3RyaW5nLCBpc0FncmVlOiBib29sZWFuKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9ULCBgdHJhbnNhY3Rpb25JZDogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh0cmFuc2FjdGlvbklkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCB0cmFuc2FjdGlvbklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG4gICAgaWYgKCFpc0Jvb2xlYW4oaXNBZ3JlZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbSBlcnJvciwgaXNBZ3JlZTogdHlwZSBpcyBib29sZWFuLCB2YWx1ZTogJHtpc0FncmVlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgZXJyb3IgY29kZSA6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9LCBzZXNzaW9uIG5vdCBleGlzdGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUucmVzcG9uc2VDaGFuZ2VNZWRpYVR5cGUoe1xuICAgICAgdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFncmVlOiBpc0FncmVlLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3ov5vooYzkuK3nmoTpgJror51cbiAgICogQHJldHVybnMgUkNDYWxsUGx1c1Nlc3Npb24g5a+56LGh5oiWIG51bGwg5Li65b2T5YmN5q2j5Zyo6L+b6KGM55qE6YCa6K+d5a+56LGhXG4gICAqL1xuICBnZXRDdXJyZW50Q2FsbFNlc3Npb24oKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gIH1cblxuICAvKipcbiAgICog5LuO5pyN5Yqh5Zmo6I635Y+W5pyq57uT5p2f55qE6YCa6K+d6K6w5b2VXG4gICAqIEByZXR1cm5zIHJlY29yZHMg5LiA57uE5pyq57uT5p2f55qE6YCa6K+d6K6w5b2VXG4gICAqL1xuICBhc3luYyBnZXRBdmFpbGFibGVDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgcmVjb3Jkcz86IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9BVkFJTEFCTEVfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRPcGVuQ2FsbExpc3QodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9BVkFJTEFCTEVfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHN1Y2Nlc3MsIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICByZWNvcmRzOiBkYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5YiG6aG15p+l5om+5b2T5YmN55So5oi355qE5YWo6YOo6YCa6K+d6K6w5b2VXG4gICAqIEBwYXJhbSBzdGFydFRpbWVzdGFtcCDotbflp4vml7bpl7TmiLPvvIzov5Tlm57lpKfkuo7mraTml7bpl7TmiLPnmoTpgJror53orrDlvZVcbiAgICogQHBhcmFtIGNvdW50IOavj+asoeiOt+WPlueahOaVsOmHj1xuICAgKiBAcmV0dXJucyByZXN1bHQuaGFzTW9yZSDmmK/lkKbmnInmm7TlpJrpgJror53orrDlvZVcbiAgICogQHJldHVybnMgcmVzdWx0Lmxpc3Qg6YCa6K+d6K6w5b2V5YiX6KGo77yM57G75Z6L5Li6IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtd77yM5Y+v6YCa6L+HIGFwaURvYyDmn6XnnIvlhbfkvZPljIXlkKvlrZfmrrVcbiAgICogQHJldHVybnMgcmVzdWx0Lm1heFRpbWUg5YiX6KGo5Lit5pyA5aSn5pe26Ze05oiz77yM5aaC5p6cIGhhc01vcmUg5Li6IHRydWXvvIznu6fnu63ojrflj5bml7bvvIzkvKDlhaXmraTml7bpl7TmiLNcbiAgICovXG4gIGFzeW5jIGdldENhbGxSZWNvcmRzKHN0YXJ0VGltZXN0YW1wOiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCByZXN1bHQ/OiBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXMgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19ULCBgc3RhcnRUaW1lc3RhbXA6ICR7c3RhcnRUaW1lc3RhbXB9LCBjb3VudDogJHtjb3VudH1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghKGlzTnVtYmVyKHN0YXJ0VGltZXN0YW1wKSAmJiBzdGFydFRpbWVzdGFtcCA+PSAwKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCBgcGFyYW1zIGVycm9yLCBzdGFydFRpbWVzdGFtcDogaXMgYSBudW1iZXIgPj0gMCwgdmFsdWU6ICR7c3RhcnRUaW1lc3RhbXB9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmICghKGlzTnVtYmVyKGNvdW50KSAmJiBjb3VudCA+IDApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IsIGBwYXJhbXMgZXJyb3IsIGNvdW50OiBpcyBhIG51bWJlciA+PSAwLCB2YWx1ZTogJHtjb3VudH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxMb2dMaXN0KHtcbiAgICAgIHRpbWVzdGFtcDogc3RhcnRUaW1lc3RhbXAsXG4gICAgICBjb3VudCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHJlc3VsdDogZGF0YSEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOmbhuWQiOaJuemHj+WIoOmZpOmAmuivneiusOW9lVxuICAgKiBAcGFyYW0gY2FsbElkcyBjYWxsSWQg5YiX6KGoXG4gICAqL1xuICBhc3luYyBkZWxldGVDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoY2FsbElkczogc3RyaW5nW10pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9DQUxMX1JFQ09SRFNfQllfQ0FMTElEX1QsIGBjYWxsSWRzOiAke2NhbGxJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KGNhbGxJZHMpXG4gICAgICAmJiBjYWxsSWRzLmV2ZXJ5KChjYWxsSWQpID0+IG5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZHM6IG5vdCBlbXB0eSBhcnJheSwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCBjYWxsSWRzOiAke0pTT04uc3RyaW5naWZ5KGNhbGxJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZGVsZXRlQ2FsbExvZyhjYWxsSWRzLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5riF56m65omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBhc3luYyBkZWxldGVBbGxDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUucmVtb3ZlQWxsQ2FsbExvZyh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0FMTF9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlkK/mkYTlg4/lpLRcbiAgICogQGRlc2NyaXB0aW9uIOmAmuivnei/h+eoi+S4reaJk+W8gOaRhOWDj+WktO+8jOWmguaenOaJqeaVo+i1hOa6kOWksei0pe+8jOWNs+WvueaWueayoeaUtuWIsOacrOerr+aJk+W8gOaRhOWDj+WktOeahOmAmuefpeaXtu+8jOatpOasoeihjOS4uuWksei0pVxuICAgKiBAcmV0dXJucyB0cmFjayDmkYTlg4/lpLTop4bpopHotYTmupBcbiAgICovXG4gIGFzeW5jIHN0YXJ0Q2FtZXJhKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOiOt+WPluaRhOWDj+WktOi1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5nZXRDYW1lcmFWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgYGNyZWF0ZSB2aWRlbyB0cmFjayBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU8sIHRydWUsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0cmFjaz8uaXNQdWJsaXNoZWQoKSAmJiB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0U3RhdGUoKSA9PT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnB1Ymxpc2hWaWRlb1RyYWNrKCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsIGBwdWJsaXNoIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkK/nlKjotYTmupBcbiAgICAgKiDmianmlaPlkK/nlKjotYTmupDmtojmga/vvIzlpoLmnpzlpLHotKXvvIzliJkgc3RhcnRDYW1lcmEg6KGM5Li65aSx6LSlXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiB1bm11dGVDb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuZW5hYmxlVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAodW5tdXRlQ29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MgJiYgdW5tdXRlQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHt1bm11dGVDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogdW5tdXRlQ29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgYXN5bmMgc3RvcENhbWVyYSgpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5kaXNhYmxlVmlkZW9UcmFjaygpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1IsIGBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lUcmFjayh0cmFjayEpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPLCBmYWxzZSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX0NBTUVSQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliIfmjaLmkYTlg4/lpLRcbiAgICog5YiH5o2i5oiQ5Yqf5ZCOIGBJQ2FsbFBsdXNFdmVudExpc3RlbmVyYCDnm5HlkKzlmajnmoQgYG9uVXNlck1lZGlhQXZhaWxhYmxlYCDkuK3kvJrmlLbliLDmlrDliIfmjaLnmoTmkYTlg4/lpLTotYTmupDlj6/mkq3mlL7vvIzmraTml7bosIPnlKggYGNhbGxQbHVzQ2xpZW50LnBsYXlNZWRpYSgpYCDlj6/mmL7npLrmlrDmkYTlg4/lpLTnmoTnlLvpnaJcbiAgICogQHBhcmFtIGNhbWVyYUlkIOa1j+iniOWZqOS4reWPluW+l+eahOaRhOWDj+WktOiuvuWkhyBpZO+8jOWPr+iwgyBwbHVnaW4tcnRjIOeahCBnZXRDYW1lcmFzIOaWueazleWPluW+l1xuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d5YmN5ZKM6YCa6K+d5Lit6YO95Y+v6LCD55SoXG4gICAqL1xuICBhc3luYyBzd2l0Y2hDYW1lcmEoY2FtZXJhSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1QsIGBjYW1lcmFJZDogJHtjYW1lcmFJZH1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghbm90RW1wdHlTdHJpbmcoY2FtZXJhSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBwYXJhbSBlcnJvciwgY2FtZXJhSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke2NhbWVyYUlkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBpZiAoc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfVklERU9fQ0FMTH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9WSURFT19DQUxMIH07XG4gICAgfVxuXG4gICAgdGhpcy5fdmlkZW9Db25maWcuY2FtZXJhSWQgPSBjYW1lcmFJZDtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9Db25maWcodGhpcy5fdmlkZW9Db25maWcpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuY2hhbmdlVmlkZW9EZXZpY2UodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYGNhbGwgY2xpZW50IGNoYW5nZVZpZGVvRGV2aWNlIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOW8gOWQr+m6puWFi+mjjlxuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d6L+H56iL5Lit5omT5byA6bqm5YWL6aOO77yM5aaC5p6c5omp5pWj6LWE5rqQ5aSx6LSl77yM5Y2z5a+55pa55rKh5pS25Yiw5pys56uv5omT5byA6bqm5YWL6aOO55qE6YCa55+l5pe277yM5q2k5qyh6KGM5Li65aSx6LSlXG4gICAqL1xuICBhc3luYyBzdGFydE1pY3JvcGhvbmUoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5nZXRNaWNyb3Bob25lQXVkaW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCBgY3JlYXRlIG1pY3JvcGhvbmUgYXVkaW8gdHJhY2sgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPLCB0cnVlLCB0cmFjZUlkKTtcblxuICAgIGlmICghdHJhY2shLmlzT3duZXJNdXRlZCgpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX01JQ1JPUEhPTkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB1bm11dGVDb2RlID0gYXdhaXQgdHJhY2shLnVubXV0ZSgpO1xuICAgIGlmICh1bm11dGVDb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHVubXV0ZUNvZGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5YWz6Zet6bqm5YWL6aOOXG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53ov4fnqIvkuK3lhbPpl63puqblhYvpo47vvIzlpoLmnpzmianmlaPotYTmupDlpLHotKXvvIzljbPlr7nmlrnmsqHmlLbliLDmnKznq6/lhbPpl63puqblhYvpo47nmoTpgJrnn6Xml7bvvIzmraTmrKHooYzkuLrlpLHotKVcbiAgICovXG4gIGFzeW5jIHN0b3BNaWNyb3Bob25lKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5kaXNhYmxlQXVkaW9UcmFjaygpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTICYmIGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX01JQ1JPUEhPTkVfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8sIGZhbHNlLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOm6puWFi+mjjuaYr+WQpuW8gOWQr1xuICAgKi9cbiAgaXNNaWNyb3Bob25lRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuX3J0Y01vZHVsZS5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICByZXR1cm4gISF0cmFjayAmJiAhdHJhY2suaXNPd25lck11dGVkKCk7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5omA5pyJ6L+c56uv6Z+z6aKR5rWB5piv5ZCm5Y+v55SoXG4gICAqIEBwYXJhbSBlbmFibGUg5Li6IHRydWUg5pe277yM5ZCv55So5omA5pyJ6L+c56uv6Z+z6aKR5rWB77yb5Li6IGZhbHNlIOaXtu+8jOmdmemfs+aJgOaciei/nOerr+mfs+mikea1gVxuICAgKi9cbiAgYXN5bmMgc2V0QWxsUmVtb3RlQXVkaW9FbmFibGUoZW5hYmxlOiBib29sZWFuKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3J0Y01vZHVsZS5zZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBTREsg54mI5pys5L+h5oGvXG4gICAqIEByZXR1cm5zIFNESyDniYjmnKzlj7dcbiAgICovXG4gIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gX19WRVJTSU9OX187XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5pGE5YOP5aS05YiX6KGoXG4gICAqL1xuICBhc3luYyBnZXRDYW1lcmFzKCkge1xuICAgIGNvbnN0IGNhbWVyYXMgPSBhd2FpdCBkZXZpY2UuZ2V0Q2FtZXJhcygpO1xuICAgIHJldHVybiBjYW1lcmFzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlum6puWFi+mjjuWIl+ihqFxuICAgKi9cbiAgYXN5bmMgZ2V0TWljcm9waG9uZXMoKSB7XG4gICAgY29uc3QgbWljcm9waG9uZXMgPSBhd2FpdCBkZXZpY2UuZ2V0TWljcm9waG9uZXMoKTtcbiAgICByZXR1cm4gbWljcm9waG9uZXM7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCBpc1VuZGVmaW5lZCwgTG9nTGV2ZWwsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IElSQ0NhbGxJbml0T3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSUluZGV4JztcbmltcG9ydCB7IElWYWxpZGF0ZVJlcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVZhbGlkYXRpb24nO1xuaW1wb3J0IHsgSUNhbGxQbHVzRXZlbnRMaXN0ZW5lciwgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcblxuLyoqXG4gKiDliJ3lp4vljJblj4LmlbDmoKHpqoxcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlSW5pdE9wdHMgPSAob3B0czogSVJDQ2FsbEluaXRPcHRpb25zKTogSVZhbGlkYXRlUmVzID0+IHtcbiAgaWYgKCFvcHRzKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIG1pc3NpbmcgcGFyYW1ldGVyIC0+IG9wdGlvbnMnIH07XG4gIH1cbiAgaWYgKCFpc09iamVjdChvcHRzKSkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JyB9O1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdHMpO1xuICAvLyDlv4XkvKDlj4LmlbDpqozor4FcbiAgaWYgKCFrZXlzLmluY2x1ZGVzKCdydGNDbGllbnQnKSkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5TVEFMTF9SVENfUExVR0lOIH07XG4gIH1cbiAgaWYgKCFpc09iamVjdChvcHRzLnJ0Y0NsaWVudCkpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwncnRjQ2xpZW50XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnb2JqZWN0XFwnJyB9O1xuICB9XG5cbiAgcmV0dXJuIHsgaXNMZWdhbDogdHJ1ZSB9O1xufTtcblxuLyoqXG4gKiByZWdpc3RlckNhbGxFdmVudExpc3RlbmVyIOWPguaVsOagoemqjFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVMaXN0ZW5lciA9IChsaXN0ZW5lcjogSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcik6IElWYWxpZGF0ZVJlcyA9PiB7XG4gIGlmICghbGlzdGVuZXIpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnbWlzc2luZyBwYXJhbWV0ZXIgLT4gbGlzdGVuZXInIH07XG4gIH1cblxuICAvLyDmoKHpqozmmK/lkKbnvLrlsJHlv4XopoHnm5HlkKzlm57osIPms6jlhoxcbiAgY29uc3QgcmVxdWlyZWRLZXlzID0gWydvbkludml0ZScsICdvblNlc3Npb25DbG9zZScsICdvblJlbW90ZVRyYWNrUmVhZHknXTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhsaXN0ZW5lcik7XG4gIGNvbnN0IG1pc3NpbmdLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICByZXF1aXJlZEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIG1pc3NpbmdLZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuICBpZiAobWlzc2luZ0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogYG1pc3NpbmcgcGFyYW1ldGVyIC0+IFwiJHttaXNzaW5nS2V5cy5qb2luKCcsJyl9XCJgIH07XG4gIH1cblxuICBsZXQgcmVzOiBJVmFsaWRhdGVSZXMgPSB7IGlzTGVnYWw6IHRydWUgfTtcblxuICAvLyDmoKHpqozlv4XopoHnm5HlkKzmmK/lkKbmmK8gZnVuY3Rpb24g57G75Z6LXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWlyZWRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcmVxdWlyZWRLZXlzW2ldO1xuICAgIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcls8a2V5b2YgSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcj5rZXldKSkge1xuICAgICAgcmVzID0geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiBgJyR7a2V5fScgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSAnZnVuY3Rpb24nYCB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQge1xuICBJUGx1Z2luR2VuZXJhdG9yLCBJUnVudGltZSwgaXNVbmRlZmluZWQsIExvZ0wsIFBsdWdpbkNvbnRleHQsIFZlcnNpb25NYW5hZ2UsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDbGllbnQgfSBmcm9tICcuL2NvcmUvYXBpL1JDQ2FsbFBsdXNDbGllbnQnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb24gfSBmcm9tICcuL2NvcmUvbW9kdWxlcy9SQ0NhbGxQbHVzU2Vzc2lvbic7XG5pbXBvcnQgeyB2YWxpZGF0ZUluaXRPcHRzIH0gZnJvbSAnLi9jb3JlL3V0aWxzL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgSUNhbGxQbHVzSW5pdE9wdHMgfSBmcm9tICcuL2NvcmUvYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNBdWRpb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9jb3JlL2FwaS9SQ0F1ZGlvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgUkNWaWRlb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9jb3JlL2FwaS9SQ1ZpZGVvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9jb3JlL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuY29uc3QgaW5zdGFsbGVyOiBJUGx1Z2luR2VuZXJhdG9yPFJDQ2FsbFBsdXNDbGllbnQsIElDYWxsUGx1c0luaXRPcHRzPiA9IHtcbiAgdGFnOiAnUkNDYWxsUGx1cycsXG4gIHZlcmlmeShydW50aW1lOiBJUnVudGltZSkge1xuICAgIFZlcnNpb25NYW5hZ2UuYWRkKCdwbHVnaW4tY2FsbC1wbHVzJywgX19WRVJTSU9OX18pO1xuICAgIGlmICghVmVyc2lvbk1hbmFnZS52YWxpZEVuZ2luZShfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX18pKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBUaGUgY3VycmVudCBlbmdpbmUgdmVyc2lvbiAnJHtWZXJzaW9uTWFuYWdlLmdldEluZm8oKS5lbmdpbmV9JyBlcnJvciwgcGx1Z2luLWNhbGwtcGx1cyByZXF1aXJlZCBlbmdpbmUgdmVyc2lvbiBhdCBsZWFzdCAnJHtfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX199Jy5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgc2V0dXAoY29udGV4dDogUGx1Z2luQ29udGV4dCwgcnVudGltZTogSVJ1bnRpbWUsIG9wdGlvbnM6IElDYWxsUGx1c0luaXRPcHRzKTogUkNDYWxsUGx1c0NsaWVudCB7XG4gICAgLy8g5Yid5aeL5YyW5Y+C5pWw5qCh6aqMXG4gICAgY29uc3QgdmFsaWRhdGVSZXMgPSB2YWxpZGF0ZUluaXRPcHRzKG9wdGlvbnMpO1xuICAgIGlmICghdmFsaWRhdGVSZXMuaXNMZWdhbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbQ2FsbFBsdXNMaWIgaW5zdGFsbGVyIHN0ZXVwXSR7dmFsaWRhdGVSZXMubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOWIm+W7uiBlbmdpbmUgbG9nZ2VyXG4gICAgY29uc3QgZW5naW5lTG9nZ2VyID0gY29udGV4dC5jcmVhdGVMb2dnZXIoJ0NhbGxQbHVzTGliJywgJ1JUQycpO1xuICAgIC8vIOiuvue9riDovpPlh7rnuqfliKtcbiAgICBjb25zdCBvdXRwdXRMZXZlbCA9IGlzVW5kZWZpbmVkKG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwpID8gTG9nTC5XQVJOIDogb3B0aW9ucy5sb2dPdXRwdXRMZXZlbDtcbiAgICBlbmdpbmVMb2dnZXIuc2V0T3V0cHV0TGV2ZWwob3V0cHV0TGV2ZWwhKTtcbiAgICBlbmdpbmVMb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ERVhfSU5TVEFMTF9DQUxMX1BMVVNfUExVR0lOX08sIGBDYWxsUGx1cyBWZXJzaW9uOiAke19fVkVSU0lPTl9ffSwgQ29tbWl0OiAke19fQ09NTUlUX0lEX199YCk7XG5cbiAgICByZXR1cm4gbmV3IFJDQ2FsbFBsdXNDbGllbnQoY29udGV4dCwgZW5naW5lTG9nZ2VyLCBydW50aW1lLCBvcHRpb25zKTtcbiAgfSxcbn07XG5cbmV4cG9ydCB7XG4gIGluc3RhbGxlcixcbiAgLyogY2xhc3MgKi9cbiAgUkNDYWxsUGx1c0NsaWVudCxcbiAgUkNDYWxsUGx1c1Nlc3Npb24sXG4gIFJDQXVkaW9Db25maWdCdWlsZGVyLFxuICBSQ1ZpZGVvQ29uZmlnQnVpbGRlcixcbn07XG4vKipcbiAqIOWvvOWHuuaemuS4vuWSjOaOpeWPo+WumuS5iVxuICovXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvYXBpL2ludGVyZmFjZSc7XG4iXSwibmFtZXMiOlsiUkNDYWxsUGx1c0NvZGUiLCJSQ0NhbGxQbHVzTG9nZ2VyVGFnIiwiUkNDYWxsUGx1c1Nlc3Npb24iLCJfc2Vzc2lvbiIsIl9jYWxsRW5naW5lIiwiX2xvZ2dlciIsIl9fcHVibGljRmllbGQiLCJ1c2VyIiwidXNlcklkIiwidXNlclN0YXRlIiwiY2FtZXJhRW5hYmxlIiwibWljcm9waG9uZUVuYWJsZSIsInRyYWNlSWQiLCJjb2RlIiwiY2xpZW50U3RhcnRUaW1lIiwiZGF0YSIsIlJDQ2FsbFBsdXNUeXBlIiwiUkNDYWxsUGx1c1R5cGUyIiwiUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlIiwiUkNDYWxsUGx1c01lZGlhVHlwZTIiLCJSQ0NhbGxQbHVzQ2FsbFN0YXRlIiwiUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCIsIlJDQ2FsbFBsdXNSZWFzb24iLCJSQ0F1ZGlvQ29uZmlnQnVpbGRlciIsIm1pY3JvcGhvbmVJZCIsIm1pbiIsIm1heCIsImlzTnVtYmVyIiwic2FtcGxlUmF0ZSIsIlJDVmlkZW9Db25maWdCdWlsZGVyIiwiUkNDYWxsUGx1c1Jlc29sdXRpb24iLCJSQ0NhbGxQbHVzRnJhbWVSYXRlIiwiZnBzIiwicmVzb2x1dGlvbiIsImNhbWVyYUlkIiwidHJhbjJDYWxsTG9nIiwiY2FsbExvZ0xpc3QiLCJjYWxsSWQiLCJjYWxsVHlwZSIsImNhbGxEaXIiLCJtZWRpYVR5cGUiLCJjYWxsaW5nVXNlcklkIiwiY2FsbFVzZXJJZHMiLCJjYWxsU3RhdHVzIiwic2Vzc2lvblN0YXR1cyIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJkdXJhdGlvbiIsInNlY3JldENoYXQiLCJzeW5jVGltZSIsInN5c1N0YXR1cyIsImNydFRpbWUiLCJwYXJzZVN0YXR1c0RhdGEiLCJyaW5naW5nRGF0YSIsImhhbmd1cERhdGEiLCJhY2NlcHREYXRhIiwib3RoZXJJbnZpdGVkRGF0YSIsIml0ZW0iLCJ2YWxpZGF0ZVZpZGVvTm9kZU5hbWUiLCJlbGVtZW50IiwidmFsaWRhdGVTeXNTdGF0ZSIsImNydFN0YXRlIiwibmV3U3RhdGUiLCJpc0luVmFsaWQiLCJpbnZhbGlkU3RhdGVzIiwidmFsaWRhdGVVc2VyU3RhdGUiLCJnZXRIYW5ndXBTeXN0ZW1TdGF0ZSIsImlzQ2FsbGVlIiwic3lzdGVtU3RhdGUiLCJpc1N1cHBvcnRNZWRpYVNlcnZlciIsIm5hdmlJbmZvIiwidm9pcENhbGxJbmZvIiwic3RyYXRlZ3kiLCJ2YWxpZGF0ZUJpdHJhdGUiLCJtaW5CaXRyYXRlIiwibWF4Qml0cmF0ZSIsImdldFVzZXJWaWRlb1ZpZXdJbmZvIiwidXNlclZpZXdNYXAiLCJ1c2VyVmlld01hcEluZm8iLCJ2aWRlb1ZpZXciLCJpc1RpbnkiLCJSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyIsIlJDQ2FsbFBMdXNTdGF0aXN0aWNzIiwiX2NvbnRleHQiLCJ0YWciLCJzZXNzaW9uIiwiY2xpZW50Q2FsbElkIiwiaW52aXRlU291cmNlIiwiZXh0cmEiLCJub3dUaW1lIiwiY29tbW9uRGF0YSIsIkRpYWxvZ0FjdGlvbiIsIkRpYWxvZ1R5cGUiLCJTZWNyZXRDYWxsVHlwZSIsIlNlY3JldENhbGxUeXBlMiIsIkNhbGxUaW1lckV2ZW50VHlwZSIsIlJDQ2FsbElubmVyU2Vzc2lvbiIsIkV2ZW50RW1pdHRlciIsIl9jYWxsSWQiLCJfc3RhdGUiLCJfY2FsbFR5cGUiLCJfbWVkaWFUeXBlIiwiX3N0YXJ0Q2FsbGVySWQiLCJfY2FsbGVySWQiLCJfY2FsbFVzZXJzIiwiZW5hYmxlIiwidXNlcnMiLCJjaGFuZ2VkVXNlcnMiLCJuZXdVc2VyU3RhdGUiLCJuZXdTdGF0ZVRpbWUiLCJuZXdTeXNTdGF0ZSIsImhhc1VzZXIiLCJpIiwib2xkU3RhdGVUaW1lIiwib2xkU3lzdGVtU3RhdGUiLCJvbGRVc2VyU3RhdGUiLCJpc0ludmFsaWRTeXNTdGF0ZSIsImlzSW52YWxpZFVzZXJTdGF0ZSIsImlzSW52YWxpZE9ucGhvbmVFbmQiLCJlcnIiLCJzdGF0ZSIsInR5cGUiLCJ0aW1lcklkIiwiaXNMb2NhbENsaWVudEhhbmd1cCIsIkNhbGxTZXJ2ZXJBY3Rpb24iLCJ0aW1lclNldFRpbWVvdXQiLCJmdW5jIiwidGltZW91dCIsInNsZWVwIiwibWlsbGlzZWNvbmQiLCJyZXNvbHZlIiwibmVlZFJldHJ5Q29kZSIsIkVycm9yQ29kZSIsIlJDUlRDQ29kZSIsInJldHJ5QXN5bmNGbiIsImFzeW5jRm4iLCJmbkFyZ3MiLCJjdXJyZW50UmV0cnlUaW1lIiwibWF4RHVyYXRpb24iLCJpbnRlcnZhbHMiLCJpbmRleCIsIm9uRXJyb3IiLCJyZXMiLCJpdHYiLCJDYWxsSG9va3NUeXBlIiwiUHViSW52aXRlQ2FsbE1pc3NSZWFzb24iLCJQdWJJbnZpdGVDYWxsTWlzc1JlZmVyIiwiU2lnbmFsVHJhbnNwb3J0ZXIiLCJfcnVudGltZSIsIl9pbml0T3B0cyIsIl90aW1lQ29ycmVjdGlvbmVyIiwiZ2V0VVVJRDIyIiwibGlzdGVuZXIiLCJtc2ciLCJ0b1VzZXJzIiwidGFyZ2V0VHlwZSIsInRhcmdldElkIiwibmlja05hbWUiLCJvbGRSb29tSWQiLCJjYWxsSWRzIiwib3B0cyIsIlJDQ29ubmVjdGlvblN0YXR1cyIsImtleSIsIm9wdGlvbnMiLCJ2YWx1ZSIsInJlc3VsdCIsInNlcnZlcktleSIsInNlcnZlclZhbCIsInBhcnNlZERhdGEiLCJpbmZvIiwiZGV2aWNlSWQiLCJpc051bGwiLCJpc1N0cmluZyIsImlzRGlyZWN0bHkiLCJjdXJyZW50VUlkIiwiY3VycmVudFVzZXIiLCJkaWFsb2dUeXBlIiwiYWN0aW9uIiwiZXh0cmFLZXlWYWwiLCJjYWxsU2Vzc2lvblVzZXJzIiwidG9EZXZpY2VJZCIsImNhbGxEaWFsb2dFbnRpdHlzIiwic3RyaW5nMTB0bzY0IiwibnVtYmVyIiwiY2hhcnMiLCJyYWRpeCIsInF1dGllbnQiLCJhcnIiLCJtb2QiLCJnZXRVVUlEIiwiYyIsInIiLCJ1dWlkIiwiQ0FMTF9EQl9OQU1FIiwiREJfVkVSU0lPTiIsImxvZ2dlciIsIl9SQ0NhbGxJbmRleERCIiwicmVxIiwiZXYiLCJvYmpOYW1lIiwiX2EiLCJ2YWwiLCJyZWplY3QiLCJSQ0NhbGxJbmRleERCIiwiQWJub3JtYWxDYWxsIiwib2JqU3RvcmUiLCJ1c2VyQWJub3JtYWxDYWxsSWRzIiwiaWQiLCJDYWxsU2VydmVyRXZlbnRUeXBlIiwiUkNDYWxsUGx1c0lubmVyQ29kZSIsIlRpbWVDb3JyZWN0aW9uZXIiLCJfc2luZ2xlQ2FsbER1cmF0aW9uRXYiLCJzZXJ2ZXJTdGFydFRpbWUiLCJjdXJyZW50UlRUIiwiY2xpZW50Rmlyc3RGcmFtZVRpbWUiLCJGb3J3YXJkVHlwZSIsIlJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UiLCJSQ0NhbGxEaXJlY3Rpb24iLCJDQUxMX1RJTUVfT1VUIiwiX1JDQ2FsbEVuZ2luZSIsIl9yZXBvcnRBcHBFdmVudE1vZHVsZSIsImN1cnJlbnRVc2VySWQiLCJidXN5bGluZVVzZXJzIiwiaW52aXRlclRpbWVySWQiLCJzZWxmU3RhdGUiLCJpbnZpdGVlc1N0YXRlIiwiYnVzeVVzZXJzU3RhdGUiLCJidXN5VXNlcklkIiwiaW52aXRlZFVzZXJzU3RhdGUiLCJidXN5bGluZVVzZXJzU3RhdGUiLCJ0cmFuc2FjdGlvbklkIiwicmVxTWVkaWFUeXBlIiwiY2FsbExvZyIsInJlc0RhdGEiLCJsaXN0IiwidXNlclNlc3Npb25TdGF0dXMiLCJjYWxsRGlyZWN0aW9uIiwic2Vzc2lvblVzZXJzIiwiaW5uZXJTZXNzaW9uIiwibmV3VXNlcnMiLCJpc0lkbGUiLCJub3ciLCJkZWxheVRpbWUiLCJzdHJlYW1SZWFkeVRpbWUiLCJjdXJyZW50VXNlclN5c3RlbVN0YXRlIiwiaG9sZENhbGxJZCIsInN0YXRlVGltZSIsImludml0ZVVzZXJJZCIsImludml0ZWVUaW1lcklkIiwiY2FsbFBsdXNTZXNzaW9uIiwib3RoZXJzU3RhdGUiLCJzdGF0dXNUaW1lIiwib3RoZXJJbnZpdGVkTWVtYmVyIiwiX2IiLCJfYyIsImludml0ZWRNZW1iZXIiLCJ1c2Vyc1N0YXRlIiwiY2FsbFNlc3Npb25hU3RhdHVzIiwic2Vzc2lvblN0YXRlIiwidW5OZWVkVXBTdGF0ZSIsInN0YXJ0Q2FsbGVySWQiLCJfZCIsInNlbGZFbmQiLCJzdGF0ZXMiLCJpc01haW5TZXNzaW9uIiwiY3VycmVudFVzZXJTYXRlIiwiZXZlbnRUaW1lIiwiZXZlbnRBcmdzIiwiZXZlbnRUeXBlIiwiZnJvbVVzZXJJZCIsImZpcnN0RnJhbWVUaW1lIiwicHJvbW90ZXJJZCIsInJlYXNvbiIsImN1cnJlbnRDYWxsSWQiLCJvbGRUcmFuc0lkIiwib2xkQWN0aW9uIiwiT2xkTWVkaWFUeXBlIiwiY2hhbmdlTWVkaWFUeXBlUmVzdWx0IiwiX2UiLCJpc1NlbGZIYW5ndXAiLCJjbG9zZWRTZXNzaW9uIiwiY3J0VXNlckRhdGEiLCJoYW5ndXBSZWFzb24iLCJpc05lZWRVcCIsImludml0ZXJVc2VySWQiLCJSQ0NhbGxFbmdpbmUiLCJSVENSZXNvdXJjZVRhZyIsIl9SVENNb2R1bGUiLCJkZWZhdWx0VmlkZW9UcmFjayIsInRyYWNrIiwiZGVmYXVsdEF1ZGlvVHJhY2siLCJ2aWRlb0NvbmZpZyIsImF1ZGlvQ29uZmlnIiwiaXNCb29sZWFuIiwibG9jYWxUcmFjayIsInJvb20iLCJyb29tVXNlcnNJZCIsImVycm9yIiwicHViUGFyYW1zIiwiY3VycmVudFJvb21JZCIsInJlY2VudFRyYWNrcyIsImxvY2FsVHJhY2tzIiwibmVlZERlc3Ryb3lUcmFjayIsIm5ld1RyYWNrIiwidHJhY2tzIiwiUlRDTW9kZSIsInN1YlRpbnkiLCJieVNlcnZlciIsInVzZXJJZHMiLCJ2aWRlb1RyYWNrIiwiYXVkaW9UcmFjayIsImF1ZGlvTGV2ZWxSZXBvcnRMaXN0Iiwicm9vbUlkIiwia2lja0V4dHJhIiwiUkNLaWNrUmVhc29uIiwibmVlZFN1YlRyYWNrcyIsInJlcG9ydCIsInNlbmRlcnMiLCJyZWNlaXZlcnMiLCJraW5kIiwicGFja2V0c0xvc3RSYXRlIiwicnR0IiwidHJhY2tJZCIsImJpdHJhdGUiLCJoZWxwZXIiLCJsb2NhbFZpZGVvVHJhY2siLCJsb2NhbEF1ZGlvVHJhY2siLCJSQ0xvY2FsVHJhY2siLCJ2aWRlb0VsZW1lbnQiLCJzdWJQYXJhbXMiLCJ1bnN1YlRyYWNrcyIsIlJUQ01vZHVsZSIsIlJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUiLCJldmVudE5hbWUiLCJhdHRycyIsImhhbmRsZSIsImludml0ZWVVc2VyTGlzdCIsInJlY29yZCIsImNhbGxGaXJzdEZyYW1lVGltZSIsImF1ZGlvTGV2ZWwiLCJDYWxsU2VydmVyRXJyb3JDb2RlIiwiUkNDYWxsUGx1c0NsaWVudCIsIm5ld1Nlc3Npb24iLCJtYWluU2Vzc2lvbiIsIm5vdEVtcHR5QXJyYXkiLCJub3RFbXB0eVN0cmluZyIsImlzVW5kZWZpbmVkIiwiY2ZnIiwiZnJhbWVSYXRlIiwiZXJyb3JNc2ciLCJnZXRNZWRpYVRyYWNrc0NvZGUiLCJnZXRTZXNzaW9uQ29kZSIsImJ1c3lVc2VycyIsImhvbGRTZXNzaW9uIiwiaGFuZ3VwTWFpblNlc3Npb25Db2RlIiwibWFpblNlc3Npb25DYWxsSWQiLCJoYW5ndXBTZXNzaW9uIiwidXNlckluZm8iLCJvbGRNZWRpYVR5cGUiLCJ0b1VzZXJJZHMiLCJpc0FncmVlIiwic3RhcnRUaW1lc3RhbXAiLCJjb3VudCIsInVubXV0ZUNvZGUiLCJkZXZpY2UiLCJ2YWxpZGF0ZUluaXRPcHRzIiwiaXNPYmplY3QiLCJpbnN0YWxsZXIiLCJydW50aW1lIiwiVmVyc2lvbk1hbmFnZSIsImNvbnRleHQiLCJ2YWxpZGF0ZVJlcyIsImVuZ2luZUxvZ2dlciIsIm91dHB1dExldmVsIiwiTG9nTCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR08sTUFBTUEsSUFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUk1QixTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVCxhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJYixlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZixhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJYixtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUluQixnQkFBZ0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUloQix5QkFBeUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl6QixtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUluQixpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlqQix3QkFBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl4QixpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlqQixzQ0FBc0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl0QyxxQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlyQixlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZixtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUluQix5QkFBeUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl6Qix3QkFBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl4QixtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUluQixvQkFBb0I7QUFDdEI7QUNoRlksSUFBQUMsc0JBQUFBLE9BQ1ZBLEVBQUEscUNBQXFDLHNDQUlyQ0EsRUFBQSx5Q0FBeUMsMENBSXpDQSxFQUFBLDBDQUEwQywyQ0FJMUNBLEVBQUEsaURBQWlELGtEQUNqREEsRUFBQSxrREFBa0QsbURB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