genassist-chat-react 1.0.39 → 1.0.41

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.
@@ -67,28 +67,29 @@ import { VoiceInput } from './VoiceInput';
67
67
  import { LiveCallControl } from './LiveCallControl';
68
68
  import { useLiveVoice as useLiveVoiceSession } from '../hooks/useLiveVoice';
69
69
  import { AudioService } from '../services/audioService';
70
- import { Paperclip, MoreVertical, RefreshCw, Globe, X, ArrowUp, Maximize2, Minimize2, AlertCircle } from 'lucide-react';
71
- import { ChatBubble } from './ChatBubble';
70
+ import { Paperclip, MoreHorizontal, RefreshCw, Globe, X, ArrowUp, Maximize2, Minimize2, AlertCircle, Fullscreen } from 'lucide-react';
71
+ import { BubbleDock } from './BubbleDock';
72
72
  import DynamicFormMessage from './DynamicFormMessage';
73
73
  import { LanguageSelector } from './LanguageSelector';
74
74
  import chatLogo from '../assets/chat-logo.png';
75
75
  import { resolveLanguage, mergeTranslations, getTranslationString, getTranslationsForLanguage, } from '../utils/i18n';
76
76
  import { GoogleReCaptcha, GoogleReCaptchaProvider } from 'react-google-recaptcha-v3';
77
- import { resolveTheme, hexToRgba, getContainerStyle, getHeaderStyle, logoContainerStyle, logoStyle, headerTitleContainerStyle, getHeaderTitleStyle, getHeaderSubtitleStyle, menuButtonStyle, getMenuPopupStyle, getMenuItemStyle, chatContainerStyle, inputContainerStyle, inputWrapperStyle, getTextAreaStyle, getLiveVoiceHintStyle, attachButtonStyle, getSendButtonStyle, sendButtonDisabledStyle, rightActionContainerStyle, getPossibleQueriesContainerStyle, getQueryButtonStyle, getConfirmOverlayStyle, getConfirmDialogStyle, confirmButtonsStyle, getConfirmButtonStyle, getContentCardStyle, getDisclaimerStyle, getPositionStyles, getFloatingContainerStyle, CSS_KEYFRAMES, } from '../styles/genAgentChatStyles';
77
+ import { resolveTheme, hexToRgba, getContainerStyle, getHeaderStyle, headerLeftContainerStyle, headerRightContainerStyle, headerPillStyle, logoStyle, brandLogoStyle, getHeaderPillTitleStyle, headerPillTextColumnStyle, getHeaderDescriptionTextStyle, menuButtonStyle, getMenuPopupStyle, getMenuItemStyle, chatContainerStyle, inputContainerStyle, inputWrapperStyle, getTextAreaStyle, getLiveVoiceHintStyle, attachButtonStyle, getSendButtonStyle, sendButtonDisabledStyle, rightActionContainerStyle, getPossibleQueriesContainerStyle, getQueryButtonStyle, getConfirmOverlayStyle, getConfirmDialogStyle, confirmButtonsStyle, getConfirmButtonStyle, getContentCardStyle, getDisclaimerStyle, getFloatingContainerStyle, CSS_KEYFRAMES, } from '../styles/genAgentChatStyles';
78
78
  var SHOW_CHAT_LANGUAGE_SELECTOR = true;
79
79
  /** Current time in epoch seconds (the timestamp format ChatMessage expects). */
80
80
  var nowSec = function () { return Math.floor(Date.now() / 1000); };
81
81
  export var GenAgentChat = function (_a) {
82
- var baseUrl = _a.baseUrl, websocketUrl = _a.websocketUrl, apiKey = _a.apiKey, tenant = _a.tenant, metadata = _a.metadata, _b = _a.useWs, useWs = _b === void 0 ? true : _b, _c = _a.usePoll, usePoll = _c === void 0 ? false : _c, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize, theme = _a.theme, _d = _a.headerTitle, headerTitle = _d === void 0 ? 'Genassist' : _d, description = _a.description, placeholder = _a.placeholder, agentName = _a.agentName, logoUrl = _a.logoUrl, _e = _a.mode, mode = _e === void 0 ? 'embedded' : _e, onExitFullscreen = _a.onExitFullscreen, _f = _a.floatingConfig, floatingConfig = _f === void 0 ? {} : _f, language = _a.language, customTranslations = _a.translations, reCaptchaKey = _a.reCaptchaKey, _g = _a.widget, widget = _g === void 0 ? false : _g, _h = _a.useAudio, useAudio = _h === void 0 ? false : _h, _j = _a.useFile, useFile = _j === void 0 ? false : _j, _k = _a.noColorAnimation, noColorAnimation = _k === void 0 ? false : _k, _l = _a.showWelcomeBeforeStart, showWelcomeBeforeStart = _l === void 0 ? true : _l, _m = _a.allowedExtensions, allowedExtensions = _m === void 0 ? [] : _m, serverUnavailableMessage = _a.serverUnavailableMessage, serverUnavailableContactUrl = _a.serverUnavailableContactUrl, serverUnavailableContactLabel = _a.serverUnavailableContactLabel, _o = _a.formDisplay, formDisplay = _o === void 0 ? 'footer' : _o, onConfigLoaded = _a.onConfigLoaded;
82
+ var _b, _c;
83
+ var baseUrl = _a.baseUrl, websocketUrl = _a.websocketUrl, apiKey = _a.apiKey, tenant = _a.tenant, metadata = _a.metadata, _d = _a.useWs, useWs = _d === void 0 ? true : _d, _e = _a.usePoll, usePoll = _e === void 0 ? false : _e, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize, theme = _a.theme, _f = _a.headerTitle, headerTitle = _f === void 0 ? 'Genassist' : _f, description = _a.description, placeholder = _a.placeholder, agentName = _a.agentName, logoUrl = _a.logoUrl, brandLogoUrl = _a.brandLogoUrl, _g = _a.mode, mode = _g === void 0 ? 'embedded' : _g, onExitFullscreen = _a.onExitFullscreen, _h = _a.floatingConfig, floatingConfig = _h === void 0 ? {} : _h, language = _a.language, customTranslations = _a.translations, reCaptchaKey = _a.reCaptchaKey, _j = _a.widget, widget = _j === void 0 ? false : _j, _k = _a.quickInput, quickInput = _k === void 0 ? false : _k, _l = _a.useAudio, useAudio = _l === void 0 ? false : _l, _m = _a.useFile, useFile = _m === void 0 ? false : _m, _o = _a.noColorAnimation, noColorAnimation = _o === void 0 ? false : _o, _p = _a.showWelcomeBeforeStart, showWelcomeBeforeStart = _p === void 0 ? true : _p, _q = _a.allowedExtensions, allowedExtensions = _q === void 0 ? [] : _q, serverUnavailableMessage = _a.serverUnavailableMessage, serverUnavailableContactUrl = _a.serverUnavailableContactUrl, serverUnavailableContactLabel = _a.serverUnavailableContactLabel, _r = _a.formDisplay, formDisplay = _r === void 0 ? 'footer' : _r, onConfigLoaded = _a.onConfigLoaded;
83
84
  // Language selection state (with localStorage persistence)
84
- var _p = useState(function () {
85
+ var _s = useState(function () {
85
86
  if (language)
86
87
  return language;
87
88
  var stored = typeof window !== 'undefined' ? localStorage.getItem('genassist_language') : null;
88
89
  if (stored)
89
90
  return stored;
90
91
  return resolveLanguage();
91
- }), selectedLanguage = _p[0], setSelectedLanguage = _p[1];
92
+ }), selectedLanguage = _s[0], setSelectedLanguage = _s[1];
92
93
  // Save language to localStorage when it changes
93
94
  useEffect(function () {
94
95
  if (typeof window !== 'undefined' && !language) {
@@ -96,7 +97,7 @@ export var GenAgentChat = function (_a) {
96
97
  }
97
98
  }, [selectedLanguage, language]);
98
99
  // State for tracking selected FAQ query
99
- var _q = useState(null), selectedFaqQuery = _q[0], setSelectedFaqQuery = _q[1];
100
+ var _t = useState(null), selectedFaqQuery = _t[0], setSelectedFaqQuery = _t[1];
100
101
  // Resolve language: prop > selected > browser > 'en'
101
102
  var resolvedLanguage = useMemo(function () {
102
103
  if (language)
@@ -116,20 +117,33 @@ export var GenAgentChat = function (_a) {
116
117
  return getTranslationString(key, translations, fallback);
117
118
  };
118
119
  var inputPlaceholder = useMemo(function () { return placeholder || t('input.placeholder', 'Ask a question'); }, [placeholder, translations]);
119
- var _r = useState(''), inputValue = _r[0], setInputValue = _r[1];
120
- var _s = useState(false), showResetConfirm = _s[0], setShowResetConfirm = _s[1];
121
- var _t = useState(false), showMenu = _t[0], setShowMenu = _t[1];
122
- var _u = useState(false), showLanguageDropdown = _u[0], setShowLanguageDropdown = _u[1];
123
- var _v = useState(false), isPlayingAudio = _v[0], setIsPlayingAudio = _v[1];
124
- var _w = useState(false), isFloatingOpen = _w[0], setIsFloatingOpen = _w[1];
125
- var _x = useState(new Set()), submittedForms = _x[0], setSubmittedForms = _x[1];
126
- var _y = useState(null), submittingFormIndex = _y[0], setSubmittingFormIndex = _y[1];
120
+ var _u = useState(''), inputValue = _u[0], setInputValue = _u[1];
121
+ var _v = useState(false), showResetConfirm = _v[0], setShowResetConfirm = _v[1];
122
+ var _w = useState(false), showMenu = _w[0], setShowMenu = _w[1];
123
+ var _x = useState(false), showLanguageDropdown = _x[0], setShowLanguageDropdown = _x[1];
124
+ var _y = useState(false), isPlayingAudio = _y[0], setIsPlayingAudio = _y[1];
125
+ var _z = useState(false), isFloatingOpen = _z[0], setIsFloatingOpen = _z[1];
126
+ // Keeps the floating panel in the DOM through its close animation before unmounting.
127
+ var _0 = useState(false), isPanelMounted = _0[0], setIsPanelMounted = _0[1];
128
+ // Quick-message input beside the launcher bubble (dismissal persists across loads).
129
+ var _1 = useState(function () {
130
+ if (typeof window === 'undefined')
131
+ return false;
132
+ try {
133
+ return localStorage.getItem('genassist_quick_input_dismissed') === '1';
134
+ }
135
+ catch (_a) {
136
+ return false;
137
+ }
138
+ }), quickInputDismissed = _1[0], setQuickInputDismissed = _1[1];
139
+ var _2 = useState(new Set()), submittedForms = _2[0], setSubmittedForms = _2[1];
140
+ var _3 = useState(null), submittingFormIndex = _3[0], setSubmittingFormIndex = _3[1];
127
141
  var menuRef = useRef(null);
128
142
  var textAreaRef = useRef(null);
129
143
  var headerRef = useRef(null);
130
- var _z = useState(56), headerHeight = _z[0], setHeaderHeight = _z[1];
131
- var _0 = useState(false), showBacklight = _0[0], setShowBacklight = _0[1];
132
- var _1 = useChat({
144
+ var _4 = useState(56), headerHeight = _4[0], setHeaderHeight = _4[1];
145
+ var _5 = useState(false), showBacklight = _5[0], setShowBacklight = _5[1];
146
+ var _6 = useChat({
133
147
  baseUrl: baseUrl,
134
148
  websocketUrl: websocketUrl,
135
149
  apiKey: apiKey,
@@ -145,14 +159,14 @@ export var GenAgentChat = function (_a) {
145
159
  serverUnavailableContactUrl: serverUnavailableContactUrl,
146
160
  serverUnavailableContactLabel: serverUnavailableContactLabel,
147
161
  onConfigLoaded: onConfigLoaded,
148
- }), messages = _1.messages, isLoading = _1.isLoading, sendMessage = _1.sendMessage, sendAudioMessage = _1.sendAudioMessage, uploadFile = _1.uploadFile, resetConversation = _1.resetConversation, startConversation = _1.startConversation, conversationId = _1.conversationId, guestToken = _1.guestToken, possibleQueries = _1.possibleQueries, isFinalized = _1.isFinalized, isAgentTyping = _1.isAgentTyping, addFeedback = _1.addFeedback, agentAvailableLanguages = _1.availableLanguages, agentId = _1.agentId, agentLiveVoiceEnabled = _1.agentLiveVoiceEnabled, agentLiveVoiceReady = _1.agentLiveVoiceReady, welcomeTitle = _1.welcomeTitle, welcomeImageUrl = _1.welcomeImageUrl, welcomeMessage = _1.welcomeMessage, inputDisclaimerHtml = _1.inputDisclaimerHtml, thinkingPhrases = _1.thinkingPhrases, thinkingDelayMs = _1.thinkingDelayMs;
149
- var _2 = useThinkingAnimation({
162
+ }), messages = _6.messages, isLoading = _6.isLoading, sendMessage = _6.sendMessage, sendAudioMessage = _6.sendAudioMessage, uploadFile = _6.uploadFile, resetConversation = _6.resetConversation, startConversation = _6.startConversation, triggerStartForm = _6.triggerStartForm, shouldTriggerStartForm = _6.shouldTriggerStartForm, conversationId = _6.conversationId, guestToken = _6.guestToken, possibleQueries = _6.possibleQueries, isFinalized = _6.isFinalized, isAgentTyping = _6.isAgentTyping, addFeedback = _6.addFeedback, agentAvailableLanguages = _6.availableLanguages, agentId = _6.agentId, agentLiveVoiceEnabled = _6.agentLiveVoiceEnabled, agentLiveVoiceReady = _6.agentLiveVoiceReady, welcomeTitle = _6.welcomeTitle, welcomeImageUrl = _6.welcomeImageUrl, welcomeMessage = _6.welcomeMessage, inputDisclaimerHtml = _6.inputDisclaimerHtml, thinkingPhrases = _6.thinkingPhrases, thinkingDelayMs = _6.thinkingDelayMs, formNodeLocales = _6.formNodeLocales;
163
+ var _7 = useThinkingAnimation({
150
164
  isAgentTyping: isAgentTyping,
151
165
  thinkingPhrases: thinkingPhrases,
152
166
  thinkingDelayMs: thinkingDelayMs,
153
167
  translations: translations,
154
- }), currentThinkingParts = _2.currentThinkingParts, currentThinkingPartIndex = _2.currentThinkingPartIndex;
155
- var _3 = useScrollManagement({
168
+ }), currentThinkingParts = _7.currentThinkingParts, currentThinkingPartIndex = _7.currentThinkingPartIndex;
169
+ var _8 = useScrollManagement({
156
170
  messages: messages,
157
171
  isAgentTyping: isAgentTyping,
158
172
  currentThinkingPartIndex: currentThinkingPartIndex,
@@ -160,8 +174,8 @@ export var GenAgentChat = function (_a) {
160
174
  conversationId: conversationId,
161
175
  isFloatingOpen: isFloatingOpen,
162
176
  mode: mode,
163
- }), messagesEndRef = _3.messagesEndRef, chatContainerRef = _3.chatContainerRef;
164
- var _4 = useViewportManager({
177
+ }), messagesEndRef = _8.messagesEndRef, chatContainerRef = _8.chatContainerRef;
178
+ var _9 = useViewportManager({
165
179
  mode: mode,
166
180
  widget: widget,
167
181
  isFloatingOpen: isFloatingOpen,
@@ -172,8 +186,8 @@ export var GenAgentChat = function (_a) {
172
186
  setShowResetConfirm: setShowResetConfirm,
173
187
  setShowLanguageDropdown: setShowLanguageDropdown,
174
188
  setShowMenu: setShowMenu,
175
- }), windowWidth = _4.windowWidth, windowHeight = _4.windowHeight, isFullscreen = _4.isFullscreen, handleFullscreenToggle = _4.handleFullscreenToggle;
176
- var _5 = useFileAttachments({ uploadFile: uploadFile, t: t }), attachments = _5.attachments, setAttachments = _5.setAttachments, uploadingFiles = _5.uploadingFiles, fileErrorToast = _5.fileErrorToast, fileInputRef = _5.fileInputRef, handleFileChange = _5.handleFileChange, handleRemoveAttachment = _5.handleRemoveAttachment, clearAttachments = _5.clearAttachments;
189
+ }), windowWidth = _9.windowWidth, windowHeight = _9.windowHeight, isFullscreen = _9.isFullscreen, handleFullscreenToggle = _9.handleFullscreenToggle, isExpanded = _9.isExpanded, handleExpandToggle = _9.handleExpandToggle;
190
+ var _10 = useFileAttachments({ uploadFile: uploadFile, t: t }), attachments = _10.attachments, setAttachments = _10.setAttachments, uploadingFiles = _10.uploadingFiles, fileErrorToast = _10.fileErrorToast, fileInputRef = _10.fileInputRef, handleFileChange = _10.handleFileChange, handleRemoveAttachment = _10.handleRemoveAttachment, clearAttachments = _10.clearAttachments;
177
191
  useEffect(function () {
178
192
  if (language)
179
193
  return;
@@ -188,6 +202,39 @@ export var GenAgentChat = function (_a) {
188
202
  var audioService = useRef(null);
189
203
  var reCaptchaTokenRef = useRef(undefined);
190
204
  var hasUserMessages = messages.some(function (message) { return message.speaker === 'customer'; });
205
+ // When a Human In The Loop node with "show_on_start" is wired directly after Start, run
206
+ // the workflow once as the conversation opens so its form appears immediately, before
207
+ // any visitor message. Fires only on a fresh conversation: no visitor messages yet and
208
+ // no form already present (a welcome message may exist; a persisted form must not
209
+ // re-trigger on reload).
210
+ var hasFormRequest = messages.some(function (m) { return m.type === 'form_request'; });
211
+ var startFormTriggeredRef = useRef(false);
212
+ useEffect(function () {
213
+ if (shouldTriggerStartForm &&
214
+ conversationId &&
215
+ !isFinalized &&
216
+ !hasUserMessages &&
217
+ !hasFormRequest &&
218
+ !startFormTriggeredRef.current) {
219
+ startFormTriggeredRef.current = true;
220
+ triggerStartForm(reCaptchaTokenRef.current);
221
+ }
222
+ }, [shouldTriggerStartForm, conversationId, isFinalized, hasUserMessages, hasFormRequest, triggerStartForm]);
223
+ // Allow a fresh trigger after a reset (new conversation id / cleared messages).
224
+ useEffect(function () {
225
+ if (!conversationId) {
226
+ startFormTriggeredRef.current = false;
227
+ }
228
+ }, [conversationId]);
229
+ // Form-submission state is keyed by message index, which is only meaningful within a
230
+ // single conversation. Clear it whenever the conversation changes so a form submitted in
231
+ // a previous conversation doesn't mark a new conversation's form (at the same index) as
232
+ // already answered — which would wrongly hide it on Start (Reset cleared it, plain Start
233
+ // did not). The reload case stays correct: it relies on isFormAnswered's transcript check.
234
+ useEffect(function () {
235
+ setSubmittedForms(new Set());
236
+ setSubmittingFormIndex(null);
237
+ }, [conversationId]);
191
238
  useEffect(function () {
192
239
  audioService.current = new AudioService({ baseUrl: baseUrl, websocketUrl: websocketUrl, apiKey: apiKey });
193
240
  }, [baseUrl, websocketUrl, apiKey]);
@@ -200,6 +247,12 @@ export var GenAgentChat = function (_a) {
200
247
  setIsFloatingOpen(true);
201
248
  }
202
249
  }, [mode, isFloatingOpen]);
250
+ // Mount the floating panel as soon as it opens; unmount happens on close-animation end.
251
+ useEffect(function () {
252
+ if (mode === 'floating' && isFloatingOpen) {
253
+ setIsPanelMounted(true);
254
+ }
255
+ }, [mode, isFloatingOpen]);
203
256
  useLayoutEffect(function () {
204
257
  var updateHeaderHeight = function () {
205
258
  var _a;
@@ -276,15 +329,66 @@ export var GenAgentChat = function (_a) {
276
329
  }
277
330
  });
278
331
  }); };
279
- var getFormNodeId = function (messageIndex) {
332
+ // Overlay a form schema with the selected language's strings from the locale bundle
333
+ // (keyed by node id), so a displayed form re-localizes on language switch. Falls back
334
+ // to the schema's own strings when a translation is missing.
335
+ var localizeForm = useCallback(function (schema) {
336
+ var _a, _b;
337
+ if (!schema || typeof schema !== 'object')
338
+ return schema;
339
+ var code = resolvedLanguage.toLowerCase().split('-')[0];
340
+ var slice = (_a = formNodeLocales === null || formNodeLocales === void 0 ? void 0 : formNodeLocales[code]) === null || _a === void 0 ? void 0 : _a[schema.node_id];
341
+ if (!slice)
342
+ return schema;
343
+ return __assign(__assign({}, schema), { message: (_b = slice.message) !== null && _b !== void 0 ? _b : schema.message, fields: Array.isArray(schema.fields)
344
+ ? schema.fields.map(function (f) {
345
+ var _a, _b, _c, _d;
346
+ var t = (f === null || f === void 0 ? void 0 : f.name) ? (_a = slice.fields) === null || _a === void 0 ? void 0 : _a[f.name] : undefined;
347
+ if (!t)
348
+ return f;
349
+ return __assign(__assign({}, f), { label: (_b = t.label) !== null && _b !== void 0 ? _b : f.label, placeholder: (_c = t.placeholder) !== null && _c !== void 0 ? _c : f.placeholder, description: (_d = t.description) !== null && _d !== void 0 ? _d : f.description, options: Array.isArray(f.options)
350
+ ? f.options.map(function (o) {
351
+ var _a, _b;
352
+ return (__assign(__assign({}, o), { label: (_b = (_a = t.options) === null || _a === void 0 ? void 0 : _a[String(o === null || o === void 0 ? void 0 : o.value)]) !== null && _b !== void 0 ? _b : o === null || o === void 0 ? void 0 : o.label }));
353
+ })
354
+ : f.options });
355
+ })
356
+ : schema.fields });
357
+ }, [resolvedLanguage, formNodeLocales]);
358
+ var getFormSchema = function (messageIndex) {
280
359
  var msg = messages[messageIndex];
281
360
  if ((msg === null || msg === void 0 ? void 0 : msg.type) === 'form_request' && msg.text) {
282
361
  try {
283
- return JSON.parse(msg.text).node_id;
362
+ return localizeForm(JSON.parse(msg.text));
284
363
  }
285
364
  catch ( /* skip */_a) { /* skip */ }
286
365
  }
287
- return undefined;
366
+ return null;
367
+ };
368
+ var getFormNodeId = function (messageIndex) { var _a; return (_a = getFormSchema(messageIndex)) === null || _a === void 0 ? void 0 : _a.node_id; };
369
+ // Build the human-readable customer message from the submitted form. We show each field's
370
+ // label, and for option-based fields (e.g. select) the chosen option's label instead of
371
+ // its raw value — both already in the conversation language, since the form schema is
372
+ // translated. The payload (`human_in_the_loop_from_form`) keeps the raw keys/values.
373
+ var buildFormSummary = function (formData, messageIndex) {
374
+ var _a, _b;
375
+ var fieldByName = {};
376
+ for (var _i = 0, _c = (_b = (_a = getFormSchema(messageIndex)) === null || _a === void 0 ? void 0 : _a.fields) !== null && _b !== void 0 ? _b : []; _i < _c.length; _i++) {
377
+ var f = _c[_i];
378
+ if (f && typeof f.name === 'string')
379
+ fieldByName[f.name] = f;
380
+ }
381
+ return Object.entries(formData)
382
+ .map(function (_a) {
383
+ var _b;
384
+ var key = _a[0], value = _a[1];
385
+ var field = fieldByName[key];
386
+ var label = (field === null || field === void 0 ? void 0 : field.label) || key;
387
+ var option = (_b = field === null || field === void 0 ? void 0 : field.options) === null || _b === void 0 ? void 0 : _b.find(function (o) { return o && String(o.value) === String(value); });
388
+ var display = (option === null || option === void 0 ? void 0 : option.label) || value;
389
+ return "".concat(label, ": ").concat(display);
390
+ })
391
+ .join('\n');
288
392
  };
289
393
  var handleFormSubmit = function (formData, messageIndex) { return __awaiter(void 0, void 0, void 0, function () {
290
394
  var summaryText, nodeId, error_2;
@@ -297,12 +401,7 @@ export var GenAgentChat = function (_a) {
297
401
  _a.label = 1;
298
402
  case 1:
299
403
  _a.trys.push([1, 3, 4, 5]);
300
- summaryText = Object.entries(formData)
301
- .map(function (_a) {
302
- var key = _a[0], value = _a[1];
303
- return "".concat(key, ": ").concat(value);
304
- })
305
- .join(', ');
404
+ summaryText = buildFormSummary(formData, messageIndex);
306
405
  nodeId = getFormNodeId(messageIndex);
307
406
  return [4 /*yield*/, sendMessage(summaryText, [], __assign({ human_in_the_loop_from_form: formData }, (nodeId && { human_in_the_loop_node_id: nodeId })), reCaptchaTokenRef.current)];
308
407
  case 2:
@@ -393,7 +492,7 @@ export var GenAgentChat = function (_a) {
393
492
  // Neutral, user-facing notice shown when a live call can't start / fails. The
394
493
  // message is already neutral (the backend never sends internal config detail), so
395
494
  // it's safe for public widgets — it just avoids a confusing silent close.
396
- var _6 = useState(null), liveVoiceNotice = _6[0], setLiveVoiceNotice = _6[1];
495
+ var _11 = useState(null), liveVoiceNotice = _11[0], setLiveVoiceNotice = _11[1];
397
496
  var handleVoiceError = function (error) {
398
497
  setLiveVoiceNotice(error.message || 'Voice is currently unavailable');
399
498
  if (onError) {
@@ -412,8 +511,8 @@ export var GenAgentChat = function (_a) {
412
511
  // `liveCaption` is the in-progress turn (streams as you speak); `liveTurns` are
413
512
  // completed turns kept locally so they stay on screen across turns. `createTime`
414
513
  // is captured once per turn so the bubble timestamp doesn't jitter on re-render.
415
- var _7 = useState({ user: '', agent: '', createTime: 0 }), liveCaption = _7[0], setLiveCaption = _7[1];
416
- var _8 = useState([]), liveTurns = _8[0], setLiveTurns = _8[1];
514
+ var _12 = useState({ user: '', agent: '', createTime: 0 }), liveCaption = _12[0], setLiveCaption = _12[1];
515
+ var _13 = useState([]), liveTurns = _13[0], setLiveTurns = _13[1];
417
516
  var liveVoice = useLiveVoiceSession({
418
517
  baseUrl: baseUrl,
419
518
  apiKey: apiKey,
@@ -526,7 +625,7 @@ export var GenAgentChat = function (_a) {
526
625
  h['x-tenant-id'] = tenant;
527
626
  return h;
528
627
  }, [apiKey, tenant, guestToken]);
529
- var _9 = useState(null), autoPlayAudioMessageId = _9[0], setAutoPlayAudioMessageId = _9[1];
628
+ var _14 = useState(null), autoPlayAudioMessageId = _14[0], setAutoPlayAudioMessageId = _14[1];
530
629
  var prevMessageCountRef = useRef(0);
531
630
  var initialLoadDoneRef = useRef(false);
532
631
  React.useEffect(function () {
@@ -591,6 +690,42 @@ export var GenAgentChat = function (_a) {
591
690
  }
592
691
  });
593
692
  }); };
693
+ var handleDismissQuickInput = function () {
694
+ setQuickInputDismissed(true);
695
+ try {
696
+ localStorage.setItem('genassist_quick_input_dismissed', '1');
697
+ }
698
+ catch ( /* ignore */_a) { /* ignore */ }
699
+ };
700
+ // Quick input next to the bubble: open the panel, start a conversation if needed, then send.
701
+ var handleQuickInputSend = function (text) { return __awaiter(void 0, void 0, void 0, function () {
702
+ var trimmed, error_9;
703
+ return __generator(this, function (_a) {
704
+ switch (_a.label) {
705
+ case 0:
706
+ trimmed = text.trim();
707
+ if (!trimmed)
708
+ return [2 /*return*/];
709
+ setIsFloatingOpen(true);
710
+ _a.label = 1;
711
+ case 1:
712
+ _a.trys.push([1, 5, , 6]);
713
+ if (!!conversationId) return [3 /*break*/, 3];
714
+ return [4 /*yield*/, startConversation(reCaptchaTokenRef.current)];
715
+ case 2:
716
+ _a.sent();
717
+ _a.label = 3;
718
+ case 3: return [4 /*yield*/, sendMessage(trimmed, [], undefined, reCaptchaTokenRef.current)];
719
+ case 4:
720
+ _a.sent();
721
+ return [3 /*break*/, 6];
722
+ case 5:
723
+ error_9 = _a.sent();
724
+ return [3 /*break*/, 6];
725
+ case 6: return [2 /*return*/];
726
+ }
727
+ });
728
+ }); };
594
729
  var handleMenuClick = function () {
595
730
  setShowMenu(function (prev) { return !prev; });
596
731
  };
@@ -642,10 +777,17 @@ export var GenAgentChat = function (_a) {
642
777
  // Computed styles
643
778
  var containerStyle = getContainerStyle({ isFullscreen: isFullscreen, isFloatingDocked: isFloatingDocked, windowWidth: windowWidth, t: themeParams });
644
779
  var headerStyle = getHeaderStyle(themeParams);
645
- var headerTitleStyle = getHeaderTitleStyle(fontFamily);
646
- var headerSubtitleStyle = getHeaderSubtitleStyle(fontFamily);
780
+ var headerPillTitleStyle = getHeaderPillTitleStyle(fontFamily);
781
+ var headerDescriptionTextStyle = getHeaderDescriptionTextStyle(fontFamily);
782
+ var headerDescription = ((_b = description !== null && description !== void 0 ? description : t('header.subtitle')) !== null && _b !== void 0 ? _b : '').trim();
783
+ var brandLogo = (_c = brandLogoUrl === null || brandLogoUrl === void 0 ? void 0 : brandLogoUrl.trim()) !== null && _c !== void 0 ? _c : '';
784
+ var hasBrandLogo = brandLogo.length > 0;
785
+ // Description reveal only applies to the small-logo layout; the full brand logo replaces the text.
786
+ var hasHeaderDescription = !hasBrandLogo && headerDescription.length > 0;
647
787
  var menuPopupStyle = getMenuPopupStyle(backgroundColor);
648
788
  var menuItemStyle = getMenuItemStyle(themeParams);
789
+ // Hover fill for menu items / outline buttons — theme-aware, matches the web app's bg-accent.
790
+ var menuHoverBg = (theme === null || theme === void 0 ? void 0 : theme.secondaryColor) || '#f4f4f5';
649
791
  var contentCardStyle = getContentCardStyle(backgroundColor);
650
792
  var sendButtonStyle = getSendButtonStyle(primaryColor);
651
793
  var possibleQueriesContainerStyle = getPossibleQueriesContainerStyle(fontFamily);
@@ -673,23 +815,35 @@ export var GenAgentChat = function (_a) {
673
815
  textAreaMaxHeightCalculated: textAreaMaxHeightCalculated,
674
816
  textColor: textColor,
675
817
  });
818
+ // A form_request is "answered" once the visitor has responded to it. Besides the
819
+ // optimistic in-session flag (`submittedForms`), we also treat it as answered when a
820
+ // later customer message exists — that survives a page reload (where `submittedForms`
821
+ // is gone), so a completed form never reappears after refresh.
822
+ var isFormAnswered = function (index) {
823
+ if (submittedForms.has(index))
824
+ return true;
825
+ for (var j = index + 1; j < messages.length; j++) {
826
+ if (messages[j].speaker === 'customer')
827
+ return true;
828
+ }
829
+ return false;
830
+ };
676
831
  var hasPendingForm = messages.some(function (msg, idx) {
677
- if (msg.type !== 'form_request' || msg.speaker !== 'agent')
678
- return false;
679
- return !submittedForms.has(idx);
832
+ return msg.type === 'form_request' && msg.speaker === 'agent' && !isFormAnswered(idx);
680
833
  });
681
834
  var pendingForm = useMemo(function () {
682
835
  for (var i = messages.length - 1; i >= 0; i--) {
683
836
  var msg = messages[i];
684
- if (msg.type === 'form_request' && msg.speaker === 'agent' && !submittedForms.has(i)) {
837
+ if (msg.type === 'form_request' && msg.speaker === 'agent' && !isFormAnswered(i)) {
685
838
  try {
686
- return { schema: JSON.parse(msg.text), index: i };
839
+ return { schema: localizeForm(JSON.parse(msg.text)), index: i };
687
840
  }
688
841
  catch ( /* skip */_a) { /* skip */ }
689
842
  }
690
843
  }
691
844
  return null;
692
- }, [messages, submittedForms]);
845
+ // eslint-disable-next-line react-hooks/exhaustive-deps
846
+ }, [messages, submittedForms, localizeForm]);
693
847
  var isSendDisabled = (inputValue.trim() === '' && attachments.length === 0) || isAgentTyping || hasPendingForm;
694
848
  var autoResizeTextArea = function () {
695
849
  var el = textAreaRef.current;
@@ -713,6 +867,7 @@ export var GenAgentChat = function (_a) {
713
867
  position: position,
714
868
  offsetX: offsetX,
715
869
  offsetY: offsetY,
870
+ isExpanded: isExpanded,
716
871
  });
717
872
  var renderLanguageSelector = function () {
718
873
  if (!SHOW_CHAT_LANGUAGE_SELECTOR) {
@@ -729,214 +884,239 @@ export var GenAgentChat = function (_a) {
729
884
  }
730
885
  return function (children) { return (_jsxs(GoogleReCaptchaProvider, { reCaptchaKey: reCaptchaKey || '', children: [_jsx(GoogleReCaptcha, { action: "genassist_chat", onVerify: handleReCaptchaVerify, refreshReCaptcha: false }), _jsx(_Fragment, { children: children })] })); };
731
886
  }, [reCaptchaKey, handleReCaptchaVerify]);
732
- var renderChatComponent = function () { return (_jsxs("div", { style: containerStyle, "data-genassist-root": "true", children: [_jsx("style", { children: CSS_KEYFRAMES }), _jsxs("div", { style: headerStyle, ref: headerRef, children: [_jsxs("div", { style: logoContainerStyle, children: [_jsx("img", { src: (logoUrl === null || logoUrl === void 0 ? void 0 : logoUrl.trim()) || chatLogo, alt: "Logo", style: logoStyle }), _jsxs("div", { style: headerTitleContainerStyle, children: [_jsx("div", { style: headerTitleStyle, children: headerTitle }), _jsx("div", { style: headerSubtitleStyle, children: description !== null && description !== void 0 ? description : t('header.subtitle') })] })] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '8px' }, children: [_jsx("button", { style: menuButtonStyle, onClick: handleMenuClick, title: t('menu.title'), children: _jsx(MoreVertical, { size: 24, color: "#111111" }) }), mode === 'floating' && (_jsx("button", { style: menuButtonStyle, onClick: function () { return setIsFloatingOpen(false); }, title: "Close chat", children: _jsx(X, { size: 24, color: "#111111" }) }))] })] }), !noColorAnimation && showBacklight && (_jsx("div", { style: {
733
- position: 'absolute',
734
- left: 0,
735
- right: 0,
736
- top: Math.max(0, headerHeight - 14),
737
- height: 42,
738
- pointerEvents: 'none',
739
- zIndex: 1,
740
- opacity: isAgentTyping ? 1 : 0,
741
- transition: 'opacity 420ms ease-in-out',
742
- }, children: _jsx("div", { style: {
887
+ var renderChatComponent = function () {
888
+ var _a;
889
+ return (_jsxs("div", { style: __assign(__assign({}, containerStyle), (_a = {}, _a['--ga-hover'] = menuHoverBg, _a)), "data-genassist-root": "true", children: [_jsx("style", { children: CSS_KEYFRAMES }), _jsxs("div", { className: "ga-header", style: headerStyle, ref: headerRef, children: [_jsxs("div", { className: "ga-header-left", style: headerLeftContainerStyle, children: [mode === 'floating' && !isFullscreen && windowWidth > 768 && (_jsx("button", { className: "ga-header-btn ga-header-expand-btn", style: __assign(__assign({}, menuButtonStyle), { width: undefined, flexShrink: 0 }), onClick: handleExpandToggle, title: isExpanded ? t('menu.collapse', 'Collapse') : t('menu.expand', 'Expand'), "aria-label": isExpanded ? t('menu.collapse', 'Collapse') : t('menu.expand', 'Expand'), children: isExpanded ? (_jsx(Minimize2, { size: 20, color: "#111111" })) : (_jsx(Maximize2, { size: 20, color: "#111111" })) })), _jsx("div", { style: headerPillStyle, tabIndex: hasHeaderDescription ? 0 : undefined, children: hasBrandLogo ? (_jsx("img", { src: brandLogo, alt: headerTitle, style: brandLogoStyle })) : (_jsxs(_Fragment, { children: [_jsx("img", { src: (logoUrl === null || logoUrl === void 0 ? void 0 : logoUrl.trim()) || chatLogo, alt: "Logo", style: logoStyle }), _jsxs("div", { style: headerPillTextColumnStyle, children: [_jsx("span", { style: headerPillTitleStyle, title: headerTitle, children: headerTitle }), hasHeaderDescription && (_jsx("div", { className: "ga-header-desc", children: _jsx("div", { className: "ga-header-desc-inner", children: _jsx("span", { className: "ga-header-desc-text", style: __assign(__assign({}, headerDescriptionTextStyle), { display: 'block' }), children: headerDescription }) }) }))] })] })) })] }), _jsxs("div", { style: headerRightContainerStyle, children: [_jsx("button", { className: "ga-header-btn", style: menuButtonStyle, onClick: handleMenuClick, title: t('menu.title'), children: _jsx(MoreHorizontal, { size: 22, color: "#111111" }) }), mode === 'floating' && (_jsx("button", { className: "ga-header-btn", style: menuButtonStyle, onClick: function () { return setIsFloatingOpen(false); }, title: "Close chat", children: _jsx(X, { size: 22, color: "#111111" }) }))] })] }), !noColorAnimation && showBacklight && (_jsx("div", { style: {
743
890
  position: 'absolute',
744
891
  left: 0,
745
- top: 6,
746
- height: 32,
747
- width: '78%',
748
- filter: 'blur(22px)',
749
- background: "linear-gradient(90deg, ".concat(hexToRgba(primaryColor, 0.0), " 0%, ").concat(hexToRgba(primaryColor, 0.35), " 15%, ").concat(hexToRgba(primaryColor, 0.55), " 50%, ").concat(hexToRgba(primaryColor, 0.35), " 85%, ").concat(hexToRgba(primaryColor, 0.0), " 100%)"),
750
- willChange: 'transform, opacity',
751
- animation: 'ga-backlight-sweep2 1.2s cubic-bezier(0.4,0.0,0.2,1) infinite alternate, ga-backlight-pulse 2.4s ease-in-out infinite',
752
- borderRadius: 18,
753
- } }) })), showMenu && (_jsxs("div", { ref: menuRef, style: menuPopupStyle, children: [_jsxs("div", { style: menuItemStyle, onClick: handleResetClick, children: [_jsx(RefreshCw, { size: 16 }), t('menu.resetConversation')] }), mode !== 'fullscreen' && (_jsxs("div", { style: menuItemStyle, onClick: handleFullscreenToggle, children: [isFullscreen ? _jsx(Minimize2, { size: 16 }) : _jsx(Maximize2, { size: 16 }), t('menu.fullscreen')] })), hasLanguageOptions && (_jsxs("div", { style: __assign(__assign({}, menuItemStyle), { position: 'relative', borderBottom: 'none' }), onClick: function (e) {
754
- e.stopPropagation();
755
- setShowLanguageDropdown(!showLanguageDropdown);
756
- }, children: [_jsx(Globe, { size: 16 }), _jsx("span", { style: { flex: 1 }, children: t('menu.language') }), showLanguageDropdown && (_jsx("div", { style: {
757
- position: 'absolute',
758
- right: 0,
759
- top: '100%',
760
- marginTop: '4px',
761
- backgroundColor: backgroundColor,
762
- borderRadius: '8px',
763
- boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',
764
- minWidth: '180px',
765
- maxWidth: '200px',
766
- overflow: 'hidden',
767
- zIndex: 1001,
768
- }, onClick: function (e) { return e.stopPropagation(); }, children: availableLanguages.map(function (lang, index) { return (_jsx("div", { style: {
769
- display: 'flex',
770
- alignItems: 'center',
771
- gap: '8px',
772
- padding: '10px 15px',
773
- color: textColor,
774
- backgroundColor: resolvedLanguage === lang.code
775
- ? ((theme === null || theme === void 0 ? void 0 : theme.secondaryColor) || '#f5f5f5')
776
- : 'transparent',
777
- borderBottom: index < availableLanguages.length - 1 ? '1px solid #f0f0f0' : 'none',
778
- cursor: 'pointer',
779
- fontSize: fontSize,
780
- fontFamily: fontFamily,
781
- transition: 'background-color 0.2s ease',
782
- }, onMouseEnter: function (e) {
783
- if (resolvedLanguage !== lang.code) {
784
- e.currentTarget.style.backgroundColor = (theme === null || theme === void 0 ? void 0 : theme.secondaryColor) || '#f5f5f5';
785
- }
786
- }, onMouseLeave: function (e) {
787
- if (resolvedLanguage !== lang.code) {
788
- e.currentTarget.style.backgroundColor = 'transparent';
789
- }
790
- }, onClick: function (e) {
791
- e.stopPropagation();
792
- handleLanguageChange(lang.code);
793
- setShowLanguageDropdown(false);
794
- setShowMenu(false);
795
- }, children: lang.name }, lang.code)); }) }))] }))] })), _jsxs("div", { style: contentCardStyle, children: [_jsxs("div", { style: chatContainerStyle, ref: chatContainerRef, children: [renderLanguageSelector(), (function () {
796
- var shouldShowSyntheticWelcome = showWelcomeBeforeStart &&
797
- !hasUserMessages &&
798
- (messages.length === 0 || messages[0].speaker !== 'agent') &&
799
- (Boolean(welcomeTitle) || Boolean(welcomeImageUrl) || Boolean(welcomeMessage))
800
- && conversationId;
801
- if (!shouldShowSyntheticWelcome)
802
- return null;
803
- var now = Math.floor(Date.now() / 1000);
804
- var syntheticWelcome = {
805
- create_time: now,
806
- start_time: 0,
807
- end_time: 0.01,
808
- speaker: 'agent',
809
- text: welcomeMessage || '',
810
- };
811
- return (_jsx(ChatMessageComponent, { message: syntheticWelcome, theme: theme, isFirstMessage: true, isNextSameSpeaker: false, isPrevSameSpeaker: false, enableTypewriter: false, welcomeImageUrl: welcomeImageUrl || undefined, welcomeTitle: welcomeTitle || undefined, possibleQueries: possibleQueries, onQuickQuery: handleQueryClick, onQuickAction: handleQuickAction, translations: translations, language: resolvedLanguage, agentName: agentName, isAgentTyping: isAgentTyping }, "__synthetic_welcome__"));
812
- })(), (function () {
813
- var firstAgentIndex = messages.findIndex(function (m) { return m.speaker === 'agent'; });
814
- // Live-voice turns are rendered locally (below) the moment they finish.
815
- // Each is also persisted and broadcast back into `messages`; suppress that
816
- // copy so a turn isn't shown twice (and never blinks as the two swap).
817
- var liveTurnKeys = new Set();
818
- for (var _i = 0, liveTurns_1 = liveTurns; _i < liveTurns_1.length; _i++) {
819
- var turn = liveTurns_1[_i];
820
- if (turn.user.trim())
821
- liveTurnKeys.add("customer:".concat(turn.user.trim()));
822
- if (turn.agent.trim())
823
- liveTurnKeys.add("agent:".concat(turn.agent.trim()));
824
- }
825
- var applyMessageFilter = function (message) {
826
- if (message.type === 'file')
827
- return false;
828
- if (liveTurnKeys.has("".concat(message.speaker, ":").concat((message.text || '').trim())))
829
- return false;
830
- return true;
831
- };
832
- return messages.filter(applyMessageFilter).map(function (message, index) {
833
- if (message.type === 'form_request' && message.speaker === 'agent') {
834
- try {
835
- var formSchema = JSON.parse(message.text);
836
- var isPending = !submittedForms.has(index);
837
- return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', maxWidth: '85%', marginBottom: '8px' }, children: [_jsx("div", { style: { fontSize: '14px', color: '#000000', fontWeight: 600, marginBottom: 4 }, children: agentName || 'Agent' }), formDisplay === 'inline' && isPending ? (_jsx(DynamicFormMessage, { schema: formSchema, onSubmit: function (data) { return handleFormSubmit(data, index); }, onCancel: function () { return handleFormCancel(index); }, isSubmitting: submittingFormIndex === index, isSubmitted: false, primaryColor: primaryColor, fontFamily: fontFamily, variant: "card" })) : (_jsxs("div", { style: {
838
- backgroundColor: '#f3f4f6',
839
- borderRadius: '12px',
840
- padding: '10px 14px',
841
- fontSize: '14px',
842
- color: '#374151',
843
- fontFamily: fontFamily,
844
- }, children: [formSchema.message || 'Please fill the form below.', isPending && (_jsx("div", { style: { fontSize: '12px', color: '#6b7280', marginTop: '4px' }, children: "Fill the form below to continue." }))] }))] }, index));
845
- }
846
- catch (_a) {
847
- // Fall through to normal rendering if JSON parse fails
848
- }
892
+ right: 0,
893
+ top: Math.max(0, headerHeight - 14),
894
+ height: 42,
895
+ pointerEvents: 'none',
896
+ zIndex: 1,
897
+ opacity: isAgentTyping ? 1 : 0,
898
+ transition: 'opacity 420ms ease-in-out',
899
+ }, children: _jsx("div", { style: {
900
+ position: 'absolute',
901
+ left: 0,
902
+ top: 6,
903
+ height: 32,
904
+ width: '78%',
905
+ filter: 'blur(22px)',
906
+ background: "linear-gradient(90deg, ".concat(hexToRgba(primaryColor, 0.0), " 0%, ").concat(hexToRgba(primaryColor, 0.35), " 15%, ").concat(hexToRgba(primaryColor, 0.55), " 50%, ").concat(hexToRgba(primaryColor, 0.35), " 85%, ").concat(hexToRgba(primaryColor, 0.0), " 100%)"),
907
+ willChange: 'transform, opacity',
908
+ animation: 'ga-backlight-sweep2 1.2s cubic-bezier(0.4,0.0,0.2,1) infinite alternate, ga-backlight-pulse 2.4s ease-in-out infinite',
909
+ borderRadius: 18,
910
+ } }) })), showMenu && (_jsxs("div", { ref: menuRef, style: menuPopupStyle, children: [_jsxs("div", { className: "ga-menu-item", style: menuItemStyle, onClick: handleResetClick, children: [_jsx(RefreshCw, { size: 16 }), t('menu.resetConversation')] }), mode !== 'fullscreen' && (_jsxs("div", { className: "ga-menu-item", style: menuItemStyle, onClick: handleFullscreenToggle, children: [_jsx(Fullscreen, { size: 16 }), t('menu.fullscreen')] })), hasLanguageOptions && (_jsxs("div", { className: "ga-menu-item", style: __assign(__assign({}, menuItemStyle), { position: 'relative' }), onClick: function (e) {
911
+ e.stopPropagation();
912
+ setShowLanguageDropdown(!showLanguageDropdown);
913
+ }, children: [_jsx(Globe, { size: 16 }), _jsx("span", { style: { flex: 1 }, children: t('menu.language') }), showLanguageDropdown && (_jsx("div", { style: {
914
+ position: 'absolute',
915
+ right: 0,
916
+ top: '100%',
917
+ marginTop: '4px',
918
+ backgroundColor: backgroundColor,
919
+ borderRadius: '10px',
920
+ border: '1px solid #e4e4e7',
921
+ boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',
922
+ padding: '4px',
923
+ minWidth: '180px',
924
+ maxWidth: '200px',
925
+ overflow: 'hidden',
926
+ zIndex: 1001,
927
+ }, onClick: function (e) { return e.stopPropagation(); }, children: availableLanguages.map(function (lang) { return (_jsx("div", { style: {
928
+ display: 'flex',
929
+ alignItems: 'center',
930
+ gap: '8px',
931
+ padding: '6px 8px',
932
+ borderRadius: '8px',
933
+ color: textColor,
934
+ backgroundColor: resolvedLanguage === lang.code
935
+ ? menuHoverBg
936
+ : 'transparent',
937
+ cursor: 'pointer',
938
+ fontSize: fontSize,
939
+ fontFamily: fontFamily,
940
+ transition: 'background-color 0.15s ease',
941
+ }, onMouseEnter: function (e) {
942
+ if (resolvedLanguage !== lang.code) {
943
+ e.currentTarget.style.backgroundColor = menuHoverBg;
944
+ }
945
+ }, onMouseLeave: function (e) {
946
+ if (resolvedLanguage !== lang.code) {
947
+ e.currentTarget.style.backgroundColor = 'transparent';
948
+ }
949
+ }, onClick: function (e) {
950
+ e.stopPropagation();
951
+ handleLanguageChange(lang.code);
952
+ setShowLanguageDropdown(false);
953
+ setShowMenu(false);
954
+ }, children: lang.name }, lang.code)); }) }))] }))] })), _jsxs("div", { style: contentCardStyle, children: [_jsxs("div", { style: chatContainerStyle, ref: chatContainerRef, children: [renderLanguageSelector(), (function () {
955
+ var shouldShowSyntheticWelcome = showWelcomeBeforeStart &&
956
+ !hasUserMessages &&
957
+ (messages.length === 0 || messages[0].speaker !== 'agent') &&
958
+ (Boolean(welcomeTitle) || Boolean(welcomeImageUrl) || Boolean(welcomeMessage))
959
+ && conversationId;
960
+ if (!shouldShowSyntheticWelcome)
961
+ return null;
962
+ var now = Math.floor(Date.now() / 1000);
963
+ var syntheticWelcome = {
964
+ create_time: now,
965
+ start_time: 0,
966
+ end_time: 0.01,
967
+ speaker: 'agent',
968
+ text: welcomeMessage || '',
969
+ };
970
+ return (_jsx(ChatMessageComponent, { message: syntheticWelcome, theme: theme, isFirstMessage: true, isNextSameSpeaker: false, isPrevSameSpeaker: false, enableTypewriter: false, welcomeImageUrl: welcomeImageUrl || undefined, welcomeTitle: welcomeTitle || undefined, possibleQueries: possibleQueries, onQuickQuery: handleQueryClick, onQuickAction: handleQuickAction, translations: translations, language: resolvedLanguage, agentName: agentName, isAgentTyping: isAgentTyping }, "__synthetic_welcome__"));
971
+ })(), (function () {
972
+ var firstAgentIndex = messages.findIndex(function (m) { return m.speaker === 'agent'; });
973
+ // Live-voice turns are rendered locally (below) the moment they finish.
974
+ // Each is also persisted and broadcast back into `messages`; suppress that
975
+ // copy so a turn isn't shown twice (and never blinks as the two swap).
976
+ var liveTurnKeys = new Set();
977
+ for (var _i = 0, liveTurns_1 = liveTurns; _i < liveTurns_1.length; _i++) {
978
+ var turn = liveTurns_1[_i];
979
+ if (turn.user.trim())
980
+ liveTurnKeys.add("customer:".concat(turn.user.trim()));
981
+ if (turn.agent.trim())
982
+ liveTurnKeys.add("agent:".concat(turn.agent.trim()));
849
983
  }
850
- var isNextSameSpeaker = index < messages.length - 1 && messages[index + 1].speaker === message.speaker;
851
- var isPrevSameSpeaker = index > 0 && messages[index - 1].speaker === message.speaker;
852
- var isFirstAgentMessage = index === firstAgentIndex && message.speaker === 'agent' && !hasUserMessages;
853
- var displayMessage = isFirstAgentMessage && welcomeMessage
854
- ? __assign(__assign({}, message), { text: welcomeMessage }) : message;
855
- return (_jsx(ChatMessageComponent, { message: displayMessage, theme: theme, onPlayAudio: message.speaker === 'agent' ? playResponseAudio : undefined, isPlayingAudio: isPlayingAudio, isFirstMessage: isFirstAgentMessage, isNextSameSpeaker: isNextSameSpeaker, isPrevSameSpeaker: isPrevSameSpeaker, onFeedback: function (messageId, value) { return addFeedback(messageId, value); }, enableTypewriter: index === messages.length - 1 && message.speaker === 'agent', welcomeImageUrl: isFirstAgentMessage ? (welcomeImageUrl || undefined) : undefined, welcomeTitle: isFirstAgentMessage ? (welcomeTitle || undefined) : undefined, possibleQueries: isFirstAgentMessage ? possibleQueries : undefined, onQuickQuery: handleQueryClick, onQuickAction: handleQuickAction, onScheduleConfirm: handleScheduleConfirm, isLastMessage: index === messages.length - 1 && message.speaker === 'agent', translations: translations, language: resolvedLanguage, agentName: agentName, isAgentTyping: isAgentTyping, audioUrlBuilder: message.type === 'audio' && useAudio ? audioUrlBuilder : undefined, audioHeaders: message.type === 'audio' && useAudio ? audioHeaders : undefined, autoPlayAudioMessageId: autoPlayAudioMessageId }, index));
856
- });
857
- })(), isAgentTyping && currentThinkingParts.length > 0 && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', maxWidth: '80%' }, children: [_jsx("div", { style: { fontSize: '14px', color: '#000000', fontWeight: 600, marginBottom: 4 }, children: agentName || t('labels.agent') }), _jsx("div", { style: {
858
- backgroundColor: 'transparent',
859
- padding: 0,
860
- borderRadius: 0,
861
- maxWidth: '100%',
862
- }, children: _jsx("div", { style: {
863
- animation: 'ga-think-change 220ms ease',
864
- willChange: 'transform, opacity',
865
- color: '#6b7280',
866
- fontSize: '13px',
867
- }, children: currentThinkingParts[currentThinkingPartIndex] || currentThinkingParts[currentThinkingParts.length - 1] }, "".concat(currentThinkingPartIndex, "-").concat(currentThinkingParts.join('|'))) })] })), liveTurns.map(function (turn, i) { return (_jsxs(React.Fragment, { children: [turn.user.trim() !== '' && renderLiveBubble('customer', turn.user, turn.createTime), turn.agent.trim() !== '' && renderLiveBubble('agent', turn.agent, turn.createTime)] }, "live-turn-".concat(i))); }), liveVoice.isActive && liveCaption.user.trim() !== '' &&
868
- renderLiveBubble('customer', liveCaption.user, liveCaption.createTime, '__live_caption_user__'), liveVoice.isActive && liveCaption.agent.trim() !== '' &&
869
- renderLiveBubble('agent', liveCaption.agent, liveCaption.createTime, '__live_caption_agent__'), _jsx("div", { ref: messagesEndRef })] }), showWelcomeBeforeStart && (function () {
870
- var showingSyntheticWelcome = !hasUserMessages &&
871
- (messages.length === 0 || messages[0].speaker !== 'agent') &&
872
- (Boolean(welcomeTitle) || Boolean(welcomeImageUrl) || Boolean(welcomeMessage));
873
- return (possibleQueries.length > 0 &&
874
- !hasUserMessages &&
875
- (messages.length === 0 || messages[0].speaker !== 'agent') &&
876
- !showingSyntheticWelcome);
877
- })() && (_jsx("div", { style: possibleQueriesContainerStyle, children: possibleQueries.map(function (query, index) { return (_jsx("button", { style: queryButtonStyle, onClick: function () { return handleQueryClick(query); }, disabled: isLoading || isAgentTyping, children: query }, index)); }) })), fileErrorToast && (_jsxs("div", { style: {
878
- margin: '0 16px 8px',
879
- padding: '10px 14px',
880
- backgroundColor: '#FFF3E0',
881
- color: '#E65100',
882
- borderRadius: '12px',
883
- fontSize: fontSize,
884
- fontFamily: fontFamily,
885
- display: 'flex',
886
- alignItems: 'center',
887
- gap: '8px',
888
- flexShrink: 0,
889
- }, role: "alert", children: [_jsx(AlertCircle, { size: 18, style: { flexShrink: 0 } }), _jsx("span", { children: fileErrorToast })] })), liveVoiceNotice && (_jsxs("div", { style: {
890
- margin: '0 16px 8px',
891
- padding: '10px 14px',
892
- backgroundColor: '#FFF3E0',
893
- color: '#E65100',
894
- borderRadius: '12px',
895
- fontSize: fontSize,
896
- fontFamily: fontFamily,
897
- display: 'flex',
898
- alignItems: 'center',
899
- gap: '8px',
900
- flexShrink: 0,
901
- }, role: "alert", children: [_jsx(AlertCircle, { size: 18, style: { flexShrink: 0 } }), _jsx("span", { children: liveVoiceNotice })] })), useFile && attachments.length > 0 && (_jsx("div", { style: { padding: '0 16px', marginBottom: '8px', display: 'flex', gap: '8px', flexWrap: 'wrap' }, children: attachments.map(function (att, index) { return (_jsx(AttachmentPreview, { file: att.file, onRemove: function () { return handleRemoveAttachment(att.file.name); }, uploading: uploadingFiles.has(att.file.name) }, index)); }) })), !conversationId || isFinalized ? (_jsx("div", { style: inputContainerStyle, children: _jsx("button", { type: "button", style: __assign(__assign({}, sendButtonStyle), { width: '100%', height: '48px', borderRadius: '16px', cursor: 'pointer', fontFamily: fontFamily, fontSize: fontSize }), onClick: handleStartConversation, disabled: isLoading, children: t('buttons.startConversation') }) })) : pendingForm && formDisplay === 'footer' ? (_jsxs("div", { style: __assign(__assign({}, inputContainerStyle), { flexDirection: 'column', borderTop: '1px solid #e5e7eb' }), children: [_jsx(DynamicFormMessage, { schema: pendingForm.schema, onSubmit: function (data) { return handleFormSubmit(data, pendingForm.index); }, onCancel: function () { return handleFormCancel(pendingForm.index); }, isSubmitting: submittingFormIndex === pendingForm.index, isSubmitted: false, primaryColor: primaryColor, fontFamily: fontFamily, variant: "footer" }), agentDisclaimerContent && (_jsx("div", { className: "ga-input-disclaimer", style: disclaimerStyle, children: agentDisclaimerContent }))] })) : liveVoiceEnabled ? (
902
- // Live voice mode is voice-only: no text box, attach, or send button —
903
- // the only way to talk to the agent is to start a live call.
904
- _jsx("div", { style: inputContainerStyle, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', width: '100%', minWidth: 0 }, children: [_jsxs("div", { style: inputWrapperStyle, children: [_jsx("span", { style: getLiveVoiceHintStyle(textAreaFontSize, fontFamily), children: liveVoiceReady
905
- ? t('liveVoice.tapToStart', 'Tap to start a voice conversation')
906
- : t('liveVoice.unavailable', 'Voice is currently unavailable') }), _jsx(LiveCallControl, { status: liveVoice.status, isActive: liveVoice.isActive, onStart: startLiveCall, onStop: endLiveCall, theme: theme, disabled: !agentId || !liveVoiceReady })] }), agentDisclaimerContent && (_jsx("div", { className: "ga-input-disclaimer", style: disclaimerStyle, children: agentDisclaimerContent }))] }) })) : (_jsx("form", { onSubmit: handleSubmit, style: inputContainerStyle, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', width: '100%', minWidth: 0 }, children: [_jsxs("div", { style: inputWrapperStyle, children: [useFile && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", style: attachButtonStyle, title: "Attach", onClick: function () { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: _jsx(Paperclip, { size: 22, color: "#757575" }) }), _jsx("input", { type: "file", multiple: true, ref: fileInputRef, style: { display: 'none' }, onChange: handleFileChange, accept: allowedExtensions.join(',') || '*/*' })] })), _jsx("textarea", { ref: textAreaRef, style: textAreaStyle, className: "ga-textarea-nosb", value: inputValue, onChange: function (e) { return setInputValue(e.target.value); }, onKeyDown: function (e) {
907
- if (e.key === 'Enter' && !e.shiftKey) {
908
- e.preventDefault();
909
- if ((inputValue.trim() !== '' || attachments.length > 0) && !isAgentTyping && !hasPendingForm) {
910
- submitMessage();
911
- }
912
- }
913
- }, placeholder: inputPlaceholder, disabled: !conversationId || isFinalized || hasPendingForm, rows: 1 }), _jsx("div", { style: rightActionContainerStyle, children: !(useAudio && inputValue.trim() === '' && attachments.length === 0) && (_jsx("button", { type: "submit", style: __assign(__assign({}, sendButtonStyle), (isSendDisabled ? sendButtonDisabledStyle : {})), disabled: isSendDisabled, children: _jsx(ArrowUp, { size: 18, strokeWidth: 3, color: "#ffffff" }) })) }), useAudio && inputValue.trim() === '' && attachments.length === 0 && (_jsx(VoiceInput, { onAudioReady: function (blob, format) { return __awaiter(void 0, void 0, void 0, function () {
914
- var _a;
915
- return __generator(this, function (_b) {
916
- switch (_b.label) {
917
- case 0:
918
- _b.trys.push([0, 2, 3, 4]);
919
- setIsPlayingAudio(true);
920
- return [4 /*yield*/, sendAudioMessage(blob, format)];
921
- case 1:
922
- _b.sent();
923
- return [3 /*break*/, 4];
924
- case 2:
925
- _a = _b.sent();
926
- return [3 /*break*/, 4];
927
- case 3:
928
- setIsPlayingAudio(false);
929
- return [7 /*endfinally*/];
930
- case 4: return [2 /*return*/];
984
+ var applyMessageFilter = function (message) {
985
+ if (message.type === 'file')
986
+ return false;
987
+ if (liveTurnKeys.has("".concat(message.speaker, ":").concat((message.text || '').trim())))
988
+ return false;
989
+ return true;
990
+ };
991
+ return messages.filter(applyMessageFilter).map(function (message, index) {
992
+ if (message.type === 'form_request' && message.speaker === 'agent') {
993
+ try {
994
+ var formSchema = localizeForm(JSON.parse(message.text));
995
+ // Use the real message position (filtering can shift the map index) so the
996
+ // answered check matches the overlay/footer path and survives reload.
997
+ var originalIndex_1 = messages.indexOf(message);
998
+ var isPending = !isFormAnswered(originalIndex_1);
999
+ return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', maxWidth: '85%', marginBottom: '8px' }, children: [_jsx("div", { style: { fontSize: '14px', color: '#000000', fontWeight: 600, marginBottom: 4 }, children: agentName || 'Agent' }), formDisplay === 'inline' && isPending ? (_jsx(DynamicFormMessage, { schema: formSchema, onSubmit: function (data) { return handleFormSubmit(data, originalIndex_1); }, onCancel: function () { return handleFormCancel(originalIndex_1); }, isSubmitting: submittingFormIndex === originalIndex_1, isSubmitted: false, primaryColor: primaryColor, fontFamily: fontFamily, variant: "card" })) : (_jsx("div", { style: {
1000
+ backgroundColor: '#f3f4f6',
1001
+ borderRadius: '12px',
1002
+ padding: '10px 14px',
1003
+ fontSize: '14px',
1004
+ color: '#374151',
1005
+ fontFamily: fontFamily,
1006
+ }, children: formSchema.message || 'Please fill the form below.' }))] }, index));
1007
+ }
1008
+ catch (_a) {
1009
+ // Fall through to normal rendering if JSON parse fails
1010
+ }
1011
+ }
1012
+ var isNextSameSpeaker = index < messages.length - 1 && messages[index + 1].speaker === message.speaker;
1013
+ var isPrevSameSpeaker = index > 0 && messages[index - 1].speaker === message.speaker;
1014
+ // When the agent greets on start, that greeting is a normal reply — not the
1015
+ // "welcome" message — so don't give it the first-message welcome treatment
1016
+ // (which would split its text into a big title + body).
1017
+ var isFirstAgentMessage = index === firstAgentIndex && message.speaker === 'agent' && !hasUserMessages && !shouldTriggerStartForm;
1018
+ var displayMessage = isFirstAgentMessage && welcomeMessage
1019
+ ? __assign(__assign({}, message), { text: welcomeMessage }) : message;
1020
+ return (_jsx(ChatMessageComponent, { message: displayMessage, theme: theme, onPlayAudio: message.speaker === 'agent' ? playResponseAudio : undefined, isPlayingAudio: isPlayingAudio, isFirstMessage: isFirstAgentMessage, isNextSameSpeaker: isNextSameSpeaker, isPrevSameSpeaker: isPrevSameSpeaker, onFeedback: function (messageId, value) { return addFeedback(messageId, value); }, enableTypewriter: index === messages.length - 1 && message.speaker === 'agent', welcomeImageUrl: isFirstAgentMessage ? (welcomeImageUrl || undefined) : undefined, welcomeTitle: isFirstAgentMessage ? (welcomeTitle || undefined) : undefined, possibleQueries: isFirstAgentMessage ? possibleQueries : undefined, onQuickQuery: handleQueryClick, onQuickAction: handleQuickAction, onScheduleConfirm: handleScheduleConfirm, isLastMessage: index === messages.length - 1 && message.speaker === 'agent', translations: translations, language: resolvedLanguage, agentName: agentName, isAgentTyping: isAgentTyping, audioUrlBuilder: message.type === 'audio' && useAudio ? audioUrlBuilder : undefined, audioHeaders: message.type === 'audio' && useAudio ? audioHeaders : undefined, autoPlayAudioMessageId: autoPlayAudioMessageId }, index));
1021
+ });
1022
+ })(), isAgentTyping && currentThinkingParts.length > 0 && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', maxWidth: '80%' }, children: [_jsx("div", { style: { fontSize: '14px', color: '#000000', fontWeight: 600, marginBottom: 4 }, children: agentName || t('labels.agent') }), _jsx("div", { style: {
1023
+ backgroundColor: 'transparent',
1024
+ padding: 0,
1025
+ borderRadius: 0,
1026
+ maxWidth: '100%',
1027
+ }, children: _jsx("div", { style: {
1028
+ animation: 'ga-think-change 220ms ease',
1029
+ willChange: 'transform, opacity',
1030
+ color: '#6b7280',
1031
+ fontSize: '13px',
1032
+ }, children: currentThinkingParts[currentThinkingPartIndex] || currentThinkingParts[currentThinkingParts.length - 1] }, "".concat(currentThinkingPartIndex, "-").concat(currentThinkingParts.join('|'))) })] })), liveTurns.map(function (turn, i) { return (_jsxs(React.Fragment, { children: [turn.user.trim() !== '' && renderLiveBubble('customer', turn.user, turn.createTime), turn.agent.trim() !== '' && renderLiveBubble('agent', turn.agent, turn.createTime)] }, "live-turn-".concat(i))); }), liveVoice.isActive && liveCaption.user.trim() !== '' &&
1033
+ renderLiveBubble('customer', liveCaption.user, liveCaption.createTime, '__live_caption_user__'), liveVoice.isActive && liveCaption.agent.trim() !== '' &&
1034
+ renderLiveBubble('agent', liveCaption.agent, liveCaption.createTime, '__live_caption_agent__'), _jsx("div", { ref: messagesEndRef })] }), showWelcomeBeforeStart && (function () {
1035
+ var showingSyntheticWelcome = !hasUserMessages &&
1036
+ (messages.length === 0 || messages[0].speaker !== 'agent') &&
1037
+ (Boolean(welcomeTitle) || Boolean(welcomeImageUrl) || Boolean(welcomeMessage));
1038
+ return (possibleQueries.length > 0 &&
1039
+ !hasUserMessages &&
1040
+ (messages.length === 0 || messages[0].speaker !== 'agent') &&
1041
+ !showingSyntheticWelcome);
1042
+ })() && (_jsx("div", { style: possibleQueriesContainerStyle, children: possibleQueries.map(function (query, index) { return (_jsx("button", { style: queryButtonStyle, onClick: function () { return handleQueryClick(query); }, disabled: isLoading || isAgentTyping, children: query }, index)); }) })), fileErrorToast && (_jsxs("div", { style: {
1043
+ margin: '0 16px 8px',
1044
+ padding: '10px 14px',
1045
+ backgroundColor: '#FFF3E0',
1046
+ color: '#E65100',
1047
+ borderRadius: '12px',
1048
+ fontSize: fontSize,
1049
+ fontFamily: fontFamily,
1050
+ display: 'flex',
1051
+ alignItems: 'center',
1052
+ gap: '8px',
1053
+ flexShrink: 0,
1054
+ }, role: "alert", children: [_jsx(AlertCircle, { size: 18, style: { flexShrink: 0 } }), _jsx("span", { children: fileErrorToast })] })), liveVoiceNotice && (_jsxs("div", { style: {
1055
+ margin: '0 16px 8px',
1056
+ padding: '10px 14px',
1057
+ backgroundColor: '#FFF3E0',
1058
+ color: '#E65100',
1059
+ borderRadius: '12px',
1060
+ fontSize: fontSize,
1061
+ fontFamily: fontFamily,
1062
+ display: 'flex',
1063
+ alignItems: 'center',
1064
+ gap: '8px',
1065
+ flexShrink: 0,
1066
+ }, role: "alert", children: [_jsx(AlertCircle, { size: 18, style: { flexShrink: 0 } }), _jsx("span", { children: liveVoiceNotice })] })), useFile && attachments.length > 0 && (_jsx("div", { style: { padding: '0 16px', marginBottom: '8px', display: 'flex', gap: '8px', flexWrap: 'wrap' }, children: attachments.map(function (att, index) { return (_jsx(AttachmentPreview, { file: att.file, onRemove: function () { return handleRemoveAttachment(att.file.name); }, uploading: uploadingFiles.has(att.file.name) }, index)); }) })), !conversationId || isFinalized ? (_jsx("div", { style: inputContainerStyle, children: _jsx("button", { type: "button", style: __assign(__assign({}, sendButtonStyle), { width: '100%', height: '48px', borderRadius: '16px', cursor: 'pointer', fontFamily: fontFamily, fontSize: fontSize }), onClick: handleStartConversation, disabled: isLoading, children: t('buttons.startConversation') }) })) : liveVoiceEnabled ? (
1067
+ // Live voice mode is voice-only: no text box, attach, or send button —
1068
+ // the only way to talk to the agent is to start a live call.
1069
+ _jsx("div", { style: inputContainerStyle, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', width: '100%', minWidth: 0 }, children: [_jsxs("div", { style: inputWrapperStyle, children: [_jsx("span", { style: getLiveVoiceHintStyle(textAreaFontSize, fontFamily), children: liveVoiceReady
1070
+ ? t('liveVoice.tapToStart', 'Tap to start a voice conversation')
1071
+ : t('liveVoice.unavailable', 'Voice is currently unavailable') }), _jsx(LiveCallControl, { status: liveVoice.status, isActive: liveVoice.isActive, onStart: startLiveCall, onStop: endLiveCall, theme: theme, disabled: !agentId || !liveVoiceReady })] }), agentDisclaimerContent && (_jsx("div", { className: "ga-input-disclaimer", style: disclaimerStyle, children: agentDisclaimerContent }))] }) })) : (_jsx("form", { onSubmit: handleSubmit, style: inputContainerStyle, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', width: '100%', minWidth: 0 }, children: [_jsxs("div", { style: inputWrapperStyle, children: [useFile && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", style: attachButtonStyle, title: "Attach", onClick: function () { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: _jsx(Paperclip, { size: 22, color: "#757575" }) }), _jsx("input", { type: "file", multiple: true, ref: fileInputRef, style: { display: 'none' }, onChange: handleFileChange, accept: allowedExtensions.join(',') || '*/*' })] })), _jsx("textarea", { ref: textAreaRef, style: textAreaStyle, className: "ga-textarea-nosb", value: inputValue, onChange: function (e) { return setInputValue(e.target.value); }, onKeyDown: function (e) {
1072
+ if (e.key === 'Enter' && !e.shiftKey) {
1073
+ e.preventDefault();
1074
+ if ((inputValue.trim() !== '' || attachments.length > 0) && !isAgentTyping && !hasPendingForm) {
1075
+ submitMessage();
1076
+ }
931
1077
  }
932
- });
933
- }); }, onError: handleVoiceError, theme: theme }))] }), agentDisclaimerContent && (_jsx("div", { className: "ga-input-disclaimer", style: disclaimerStyle, children: agentDisclaimerContent }))] }) }))] }), _jsx("div", { style: confirmOverlayStyle, children: _jsxs("div", { style: confirmDialogStyle, children: [_jsx("h3", { style: { fontFamily: fontFamily, marginTop: 0 }, children: t('dialog.resetConversation.title') }), _jsx("p", { style: { fontFamily: fontFamily, fontSize: fontSize }, children: t('dialog.resetConversation.message') }), _jsxs("div", { style: confirmButtonsStyle, children: [_jsx("button", { style: __assign(__assign({}, getConfirmButtonStyle(false, themeParams)), { color: textColor }), onClick: handleCancelReset, children: t('buttons.cancel') }), _jsx("button", { style: getConfirmButtonStyle(true, themeParams), onClick: handleConfirmReset, children: t('buttons.reset') })] })] }) })] })); };
1078
+ }, placeholder: inputPlaceholder, disabled: !conversationId || isFinalized || hasPendingForm, rows: 1 }), _jsx("div", { style: rightActionContainerStyle, children: !(useAudio && inputValue.trim() === '' && attachments.length === 0) && (_jsx("button", { type: "submit", style: __assign(__assign({}, sendButtonStyle), (isSendDisabled ? sendButtonDisabledStyle : {})), disabled: isSendDisabled, children: _jsx(ArrowUp, { size: 18, strokeWidth: 3, color: "#ffffff" }) })) }), useAudio && inputValue.trim() === '' && attachments.length === 0 && (_jsx(VoiceInput, { onAudioReady: function (blob, format) { return __awaiter(void 0, void 0, void 0, function () {
1079
+ var _a;
1080
+ return __generator(this, function (_b) {
1081
+ switch (_b.label) {
1082
+ case 0:
1083
+ _b.trys.push([0, 2, 3, 4]);
1084
+ setIsPlayingAudio(true);
1085
+ return [4 /*yield*/, sendAudioMessage(blob, format)];
1086
+ case 1:
1087
+ _b.sent();
1088
+ return [3 /*break*/, 4];
1089
+ case 2:
1090
+ _a = _b.sent();
1091
+ return [3 /*break*/, 4];
1092
+ case 3:
1093
+ setIsPlayingAudio(false);
1094
+ return [7 /*endfinally*/];
1095
+ case 4: return [2 /*return*/];
1096
+ }
1097
+ });
1098
+ }); }, onError: handleVoiceError, theme: theme }))] }), agentDisclaimerContent && (_jsx("div", { className: "ga-input-disclaimer", style: disclaimerStyle, children: agentDisclaimerContent }))] }) })), pendingForm && formDisplay !== 'inline' && (_jsx("div", { style: {
1099
+ position: 'absolute',
1100
+ inset: 0,
1101
+ zIndex: 30,
1102
+ display: 'flex',
1103
+ flexDirection: 'column',
1104
+ backgroundColor: backgroundColor || '#ffffff',
1105
+ }, children: _jsx(DynamicFormMessage, { schema: pendingForm.schema, onSubmit: function (data) { return handleFormSubmit(data, pendingForm.index); }, onCancel: function () { return handleFormCancel(pendingForm.index); }, isSubmitting: submittingFormIndex === pendingForm.index, isSubmitted: false, primaryColor: primaryColor, fontFamily: fontFamily, variant: "fullscreen", title: agentName || undefined }) }))] }), _jsx("div", { style: confirmOverlayStyle, children: _jsxs("div", { style: confirmDialogStyle, children: [_jsx("h3", { style: { fontFamily: fontFamily, margin: 0, fontSize: '18px', fontWeight: 600 }, children: t('dialog.resetConversation.title') }), _jsx("p", { style: { fontFamily: fontFamily, fontSize: '14px', color: '#71717a', margin: '8px 0 0' }, children: t('dialog.resetConversation.message') }), _jsxs("div", { style: confirmButtonsStyle, children: [_jsx("button", { className: "ga-confirm-btn--cancel", style: __assign(__assign({}, getConfirmButtonStyle(false, themeParams)), { color: textColor }), onClick: handleCancelReset, children: t('buttons.cancel') }), _jsx("button", { className: "ga-confirm-btn--danger", style: getConfirmButtonStyle(true, themeParams), onClick: handleConfirmReset, children: t('buttons.reset') })] })] }) })] }));
1106
+ };
934
1107
  if (mode === 'floating') {
935
- return (_jsxs(_Fragment, { children: [!isFloatingOpen && (_jsx(ChatBubble, { showChat: isFloatingOpen, onClick: function () { return setIsFloatingOpen(function (prev) { return !prev; }); }, primaryColor: primaryColor, style: getPositionStyles({ position: position, offsetX: offsetX, offsetY: offsetY }), chatBubbleIcon: theme === null || theme === void 0 ? void 0 : theme.chatBubbleIcon })), isFloatingOpen && (_jsx("div", { style: floatingContainerStyle, "data-genassist-container": "floating", children: renderWithReCaptcha(renderChatComponent()) }))] }));
1108
+ var isPanelClosing_1 = isPanelMounted && !isFloatingOpen;
1109
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: CSS_KEYFRAMES }), !isPanelMounted && (_jsx(BubbleDock, { primaryColor: primaryColor, position: position, offsetX: offsetX, offsetY: offsetY, windowWidth: windowWidth, placeholder: inputPlaceholder, fontFamily: fontFamily, fontSize: fontSize, chatBubbleIcon: theme === null || theme === void 0 ? void 0 : theme.chatBubbleIcon, showQuickInput: quickInput && !quickInputDismissed && Boolean(conversationId) && !isFinalized, onOpen: function () { return setIsFloatingOpen(true); }, onSend: handleQuickInputSend, onDismissQuickInput: handleDismissQuickInput })), isPanelMounted && (_jsx("div", { style: floatingContainerStyle, className: isPanelClosing_1 ? 'ga-widget-out' : 'ga-widget-in', onAnimationEnd: function (e) {
1110
+ // Ignore bubbled child animations; only react to the panel's own close.
1111
+ if (e.target !== e.currentTarget)
1112
+ return;
1113
+ if (isPanelClosing_1)
1114
+ setIsPanelMounted(false);
1115
+ }, "data-genassist-container": "floating", children: renderWithReCaptcha(renderChatComponent()) }))] }));
936
1116
  }
937
1117
  if (mode === 'fullscreen') {
938
1118
  return (_jsx("div", { style: floatingContainerStyle, "data-genassist-container": "fullscreen", children: renderWithReCaptcha(renderChatComponent()) }));
939
1119
  }
940
1120
  return renderWithReCaptcha(renderChatComponent());
941
1121
  };
942
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VuQWdlbnRDaGF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvR2VuQWdlbnRDaGF0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLGtCQUFrQixNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sUUFBUSxNQUFNLHlCQUF5QixDQUFDO0FBRS9DLE9BQU8sRUFDTCxlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQiwwQkFBMEIsR0FDM0IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXJGLE9BQU8sRUFDTCxZQUFZLEVBQ1osU0FBUyxFQUNULGlCQUFpQixFQUNqQixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCx5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6QixnQ0FBZ0MsRUFDaEMsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQix5QkFBeUIsRUFDekIsYUFBYSxHQUNkLE1BQU0sOEJBQThCLENBQUM7QUFFdEMsSUFBTSwyQkFBMkIsR0FBRyxJQUFJLENBQUM7QUFLekMsZ0ZBQWdGO0FBQ2hGLElBQU0sTUFBTSxHQUFHLGNBQU0sT0FBQSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBN0IsQ0FBNkIsQ0FBQztBQUVuRCxNQUFNLENBQUMsSUFBTSxZQUFZLEdBQWdDLFVBQUMsRUFrQ3pEO1FBakNDLE9BQU8sYUFBQSxFQUNQLFlBQVksa0JBQUEsRUFDWixNQUFNLFlBQUEsRUFDTixNQUFNLFlBQUEsRUFDTixRQUFRLGNBQUEsRUFDUixhQUFZLEVBQVosS0FBSyxtQkFBRyxJQUFJLEtBQUEsRUFDWixlQUFlLEVBQWYsT0FBTyxtQkFBRyxLQUFLLEtBQUEsRUFDZixPQUFPLGFBQUEsRUFDUCxVQUFVLGdCQUFBLEVBQ1YsVUFBVSxnQkFBQSxFQUNWLEtBQUssV0FBQSxFQUNMLG1CQUF5QixFQUF6QixXQUFXLG1CQUFHLFdBQVcsS0FBQSxFQUN6QixXQUFXLGlCQUFBLEVBQ1gsV0FBVyxpQkFBQSxFQUNYLFNBQVMsZUFBQSxFQUNULE9BQU8sYUFBQSxFQUNQLFlBQWlCLEVBQWpCLElBQUksbUJBQUcsVUFBVSxLQUFBLEVBQ2pCLGdCQUFnQixzQkFBQSxFQUNoQixzQkFBbUIsRUFBbkIsY0FBYyxtQkFBRyxFQUFFLEtBQUEsRUFDbkIsUUFBUSxjQUFBLEVBQ00sa0JBQWtCLGtCQUFBLEVBQ2hDLFlBQVksa0JBQUEsRUFDWixjQUFjLEVBQWQsTUFBTSxtQkFBRyxLQUFLLEtBQUEsRUFDZCxnQkFBZ0IsRUFBaEIsUUFBUSxtQkFBRyxLQUFLLEtBQUEsRUFDaEIsZUFBZSxFQUFmLE9BQU8sbUJBQUcsS0FBSyxLQUFBLEVBQ2Ysd0JBQXdCLEVBQXhCLGdCQUFnQixtQkFBRyxLQUFLLEtBQUEsRUFDeEIsOEJBQTZCLEVBQTdCLHNCQUFzQixtQkFBRyxJQUFJLEtBQUEsRUFDN0IseUJBQXNCLEVBQXRCLGlCQUFpQixtQkFBRyxFQUFFLEtBQUEsRUFDdEIsd0JBQXdCLDhCQUFBLEVBQ3hCLDJCQUEyQixpQ0FBQSxFQUMzQiw2QkFBNkIsbUNBQUEsRUFDN0IsbUJBQXNCLEVBQXRCLFdBQVcsbUJBQUcsUUFBUSxLQUFBLEVBQ3RCLGNBQWMsb0JBQUE7SUFFZCwyREFBMkQ7SUFDckQsSUFBQSxLQUEwQyxRQUFRLENBQVM7UUFDL0QsSUFBSSxRQUFRO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDOUIsSUFBTSxNQUFNLEdBQUcsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqRyxJQUFJLE1BQU07WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMxQixPQUFPLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUMsQ0FBQyxFQUxLLGdCQUFnQixRQUFBLEVBQUUsbUJBQW1CLFFBSzFDLENBQUM7SUFFSCxnREFBZ0Q7SUFDaEQsU0FBUyxDQUFDO1FBQ1IsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQyxZQUFZLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFakMsd0NBQXdDO0lBQ2xDLElBQUEsS0FBMEMsUUFBUSxDQUFnQixJQUFJLENBQUMsRUFBdEUsZ0JBQWdCLFFBQUEsRUFBRSxtQkFBbUIsUUFBaUMsQ0FBQztJQUU5RSxxREFBcUQ7SUFDckQsSUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7UUFDL0IsSUFBSSxRQUFRO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDOUIsT0FBTyxnQkFBZ0IsSUFBSSxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUM7SUFDdkQsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUVqQyw2Q0FBNkM7SUFDN0MsSUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUM7UUFDbkMsc0NBQ0ssQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLEtBQ25CLFFBQVEsRUFBRSxnQkFBZ0IsS0FDdkIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQzVEO0lBQ0osQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUVuRCxtRkFBbUY7SUFDbkYsSUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDO1FBQzNCLElBQU0sZ0JBQWdCLEdBQUcsMEJBQTBCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN0RSxPQUFPLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDakUsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRTNDLElBQU0sQ0FBQyxHQUFHLFVBQUMsR0FBVyxFQUFFLFFBQWlCO1FBQ3ZDLE9BQU8sb0JBQW9CLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUM7SUFFRixJQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxjQUFNLE9BQUEsV0FBVyxJQUFJLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsQ0FBQyxFQUF2RCxDQUF1RCxFQUFFLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDdkgsSUFBQSxLQUE4QixRQUFRLENBQUMsRUFBRSxDQUFDLEVBQXpDLFVBQVUsUUFBQSxFQUFFLGFBQWEsUUFBZ0IsQ0FBQztJQUMzQyxJQUFBLEtBQTBDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBeEQsZ0JBQWdCLFFBQUEsRUFBRSxtQkFBbUIsUUFBbUIsQ0FBQztJQUMxRCxJQUFBLEtBQTBCLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBeEMsUUFBUSxRQUFBLEVBQUUsV0FBVyxRQUFtQixDQUFDO0lBQzFDLElBQUEsS0FBa0QsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFoRSxvQkFBb0IsUUFBQSxFQUFFLHVCQUF1QixRQUFtQixDQUFDO0lBQ2xFLElBQUEsS0FBc0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFwRCxjQUFjLFFBQUEsRUFBRSxpQkFBaUIsUUFBbUIsQ0FBQztJQUN0RCxJQUFBLEtBQXNDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBcEQsY0FBYyxRQUFBLEVBQUUsaUJBQWlCLFFBQW1CLENBQUM7SUFDdEQsSUFBQSxLQUFzQyxRQUFRLENBQWMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFyRSxjQUFjLFFBQUEsRUFBRSxpQkFBaUIsUUFBb0MsQ0FBQztJQUN2RSxJQUFBLEtBQWdELFFBQVEsQ0FBZ0IsSUFBSSxDQUFDLEVBQTVFLG1CQUFtQixRQUFBLEVBQUUsc0JBQXNCLFFBQWlDLENBQUM7SUFDcEYsSUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFpQixJQUFJLENBQUMsQ0FBQztJQUM3QyxJQUFNLFdBQVcsR0FBRyxNQUFNLENBQXNCLElBQUksQ0FBQyxDQUFDO0lBQ3RELElBQU0sU0FBUyxHQUFHLE1BQU0sQ0FBaUIsSUFBSSxDQUFDLENBQUM7SUFDekMsSUFBQSxLQUFrQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQTdDLFlBQVksUUFBQSxFQUFFLGVBQWUsUUFBZ0IsQ0FBQztJQUMvQyxJQUFBLEtBQW9DLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBbEQsYUFBYSxRQUFBLEVBQUUsZ0JBQWdCLFFBQW1CLENBQUM7SUFFcEQsSUFBQSxLQXdCRixPQUFPLENBQUM7UUFDVixPQUFPLFNBQUE7UUFDUCxZQUFZLGNBQUE7UUFDWixNQUFNLFFBQUE7UUFDTixNQUFNLFFBQUE7UUFDTixRQUFRLEVBQUUsb0JBQW9CO1FBQzlCLEtBQUssT0FBQTtRQUNMLE9BQU8sU0FBQTtRQUNQLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIsT0FBTyxTQUFBO1FBQ1AsVUFBVSxZQUFBO1FBQ1YsVUFBVSxZQUFBO1FBQ1Ysd0JBQXdCLDBCQUFBO1FBQ3hCLDJCQUEyQiw2QkFBQTtRQUMzQiw2QkFBNkIsK0JBQUE7UUFDN0IsY0FBYyxnQkFBQTtLQUNmLENBQUMsRUF2Q0EsUUFBUSxjQUFBLEVBQ1IsU0FBUyxlQUFBLEVBQ1QsV0FBVyxpQkFBQSxFQUNYLGdCQUFnQixzQkFBQSxFQUNoQixVQUFVLGdCQUFBLEVBQ1YsaUJBQWlCLHVCQUFBLEVBQ2pCLGlCQUFpQix1QkFBQSxFQUNqQixjQUFjLG9CQUFBLEVBQ2QsVUFBVSxnQkFBQSxFQUNWLGVBQWUscUJBQUEsRUFDZixXQUFXLGlCQUFBLEVBQ1gsYUFBYSxtQkFBQSxFQUNiLFdBQVcsaUJBQUEsRUFDUyx1QkFBdUIsd0JBQUEsRUFDM0MsT0FBTyxhQUFBLEVBQ1AscUJBQXFCLDJCQUFBLEVBQ3JCLG1CQUFtQix5QkFBQSxFQUNuQixZQUFZLGtCQUFBLEVBQ1osZUFBZSxxQkFBQSxFQUNmLGNBQWMsb0JBQUEsRUFDZCxtQkFBbUIseUJBQUEsRUFDbkIsZUFBZSxxQkFBQSxFQUNmLGVBQWUscUJBaUJmLENBQUM7SUFFRyxJQUFBLEtBQXFELG9CQUFvQixDQUFDO1FBQzlFLGFBQWEsZUFBQTtRQUNiLGVBQWUsaUJBQUE7UUFDZixlQUFlLGlCQUFBO1FBQ2YsWUFBWSxjQUFBO0tBQ2IsQ0FBQyxFQUxNLG9CQUFvQiwwQkFBQSxFQUFFLHdCQUF3Qiw4QkFLcEQsQ0FBQztJQUVHLElBQUEsS0FBdUMsbUJBQW1CLENBQUM7UUFDL0QsUUFBUSxVQUFBO1FBQ1IsYUFBYSxlQUFBO1FBQ2Isd0JBQXdCLDBCQUFBO1FBQ3hCLDBCQUEwQixFQUFFLG9CQUFvQixDQUFDLE1BQU07UUFDdkQsY0FBYyxnQkFBQTtRQUNkLGNBQWMsZ0JBQUE7UUFDZCxJQUFJLE1BQUE7S0FDTCxDQUFDLEVBUk0sY0FBYyxvQkFBQSxFQUFFLGdCQUFnQixzQkFRdEMsQ0FBQztJQUVHLElBQUEsS0FLRixrQkFBa0IsQ0FBQztRQUNyQixJQUFJLE1BQUE7UUFDSixNQUFNLFFBQUE7UUFDTixjQUFjLGdCQUFBO1FBQ2QsZ0JBQWdCLGtCQUFBO1FBQ2hCLG9CQUFvQixzQkFBQTtRQUNwQixRQUFRLFVBQUE7UUFDUixnQkFBZ0Isa0JBQUE7UUFDaEIsbUJBQW1CLHFCQUFBO1FBQ25CLHVCQUF1Qix5QkFBQTtRQUN2QixXQUFXLGFBQUE7S0FDWixDQUFDLEVBZkEsV0FBVyxpQkFBQSxFQUNYLFlBQVksa0JBQUEsRUFDWixZQUFZLGtCQUFBLEVBQ1osc0JBQXNCLDRCQVl0QixDQUFDO0lBRUcsSUFBQSxLQVNGLGtCQUFrQixDQUFDLEVBQUUsVUFBVSxZQUFBLEVBQUUsQ0FBQyxHQUFBLEVBQUUsQ0FBQyxFQVJ2QyxXQUFXLGlCQUFBLEVBQ1gsY0FBYyxvQkFBQSxFQUNkLGNBQWMsb0JBQUEsRUFDZCxjQUFjLG9CQUFBLEVBQ2QsWUFBWSxrQkFBQSxFQUNaLGdCQUFnQixzQkFBQSxFQUNoQixzQkFBc0IsNEJBQUEsRUFDdEIsZ0JBQWdCLHNCQUN1QixDQUFDO0lBRTFDLFNBQVMsQ0FBQztRQUNSLElBQUksUUFBUTtZQUFFLE9BQU87UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEYsT0FBTztRQUNULENBQUM7UUFDRCxJQUFNLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQWxCLENBQWtCLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekQsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFFMUQsSUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUN2RCxJQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFFaEUsSUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLE9BQU8sQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUE5QixDQUE4QixDQUFDLENBQUM7SUFFakYsU0FBUyxDQUFDO1FBQ1IsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLE9BQU8sU0FBQSxFQUFFLFlBQVksY0FBQSxFQUFFLE1BQU0sUUFBQSxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFcEMsU0FBUyxDQUFDOztRQUNSLE1BQUEsWUFBWSxDQUFDLE9BQU8sMENBQUUsYUFBYSxDQUFDLFVBQVUsYUFBVixVQUFVLGNBQVYsVUFBVSxHQUFJLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFakIsU0FBUyxDQUFDO1FBQ1IsSUFBSSxJQUFJLEtBQUssWUFBWSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDN0MsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBRTNCLGVBQWUsQ0FBQztRQUNkLElBQU0sa0JBQWtCLEdBQUc7O1lBQ3pCLGVBQWUsQ0FBQyxDQUFBLE1BQUEsU0FBUyxDQUFDLE9BQU8sMENBQUUsWUFBWSxLQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQztRQUNGLGtCQUFrQixFQUFFLENBQUM7UUFDckIsSUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsY0FBTSxPQUFBLGtCQUFrQixFQUFFLEVBQXBCLENBQW9CLENBQUMsQ0FBQztRQUN0RSxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QixjQUFjLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RELE9BQU87WUFDTCxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQztJQUNKLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVQLFNBQVMsQ0FBQztRQUNSLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsY0FBTSxPQUFBLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUF2QixDQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdELE9BQU8sY0FBTSxPQUFBLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBbkIsQ0FBbUIsQ0FBQztJQUNuQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRXBCLElBQU0sYUFBYSxHQUFHOzs7OztvQkFDcEIsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQzt3QkFBRSxzQkFBTztvQkFDakUsSUFBSSxhQUFhO3dCQUFFLHNCQUFPO29CQUNwQixVQUFVLEdBQUcsVUFBVSxDQUFDO29CQUN4QixhQUFhLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLEVBQU4sQ0FBTSxDQUFDLENBQUM7b0JBRW5ELGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDbEIsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNuQixJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDekIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNsQyxDQUFDOzs7O29CQUdPLGFBQWEsR0FBd0IsRUFBRSxDQUFDO29CQUU5QyxJQUFJLGdCQUFnQixFQUFFLENBQUM7d0JBQ3JCLGFBQWEsQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7b0JBQzdDLENBQUM7b0JBRUQsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM3QixhQUFhLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsVUFBVSxFQUFaLENBQVksQ0FBQyxDQUFDO29CQUNqRSxDQUFDO29CQUVELHFCQUFNLFdBQVcsQ0FBQyxVQUFVLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBQTs7b0JBQXRGLFNBQXNGLENBQUM7Ozs7OztvQkFJdkYsVUFBVSxDQUFDLHNCQUFNLE9BQUEsTUFBQSxXQUFXLENBQUMsT0FBTywwQ0FBRSxLQUFLLEVBQUUsQ0FBQSxFQUFBLEVBQUUsQ0FBQyxDQUFDLENBQUM7Ozs7O1NBRXJELENBQUM7SUFFRixJQUFNLFlBQVksR0FBRyxVQUFPLENBQWtCOzs7O29CQUM1QyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ25CLHFCQUFNLGFBQWEsRUFBRSxFQUFBOztvQkFBckIsU0FBcUIsQ0FBQzs7OztTQUN2QixDQUFDO0lBRUYsSUFBTSxhQUFhLEdBQUcsVUFBQyxZQUFvQjtRQUN6QyxJQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxJQUFJLE1BQUssY0FBYyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUM7Z0JBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFBQyxDQUFDO1lBQUMsUUFBUSxVQUFVLElBQVosQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixJQUFNLGdCQUFnQixHQUFHLFVBQU8sUUFBaUMsRUFBRSxZQUFvQjs7Ozs7b0JBQ3JGLElBQUksbUJBQW1CLEtBQUssSUFBSSxJQUFJLGFBQWE7d0JBQUUsc0JBQU87b0JBQzFELHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDOzs7O29CQUU3QixXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7eUJBQ3pDLEdBQUcsQ0FBQyxVQUFDLEVBQVk7NEJBQVgsR0FBRyxRQUFBLEVBQUUsS0FBSyxRQUFBO3dCQUFNLE9BQUEsVUFBRyxHQUFHLGVBQUssS0FBSyxDQUFFO29CQUFsQixDQUFrQixDQUFDO3lCQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ1IsTUFBTSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDM0MscUJBQU0sV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUFFLGFBQy9CLDJCQUEyQixFQUFFLFFBQVEsSUFDbEMsQ0FBQyxNQUFNLElBQUksRUFBRSx5QkFBeUIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUNuRCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBQTs7b0JBSDdCLFNBRzZCLENBQUM7b0JBQzlCLGlCQUFpQixDQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUEvQixDQUErQixDQUFDLENBQUM7Ozs7OztvQkFJN0Qsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7Ozs7O1NBRWhDLENBQUM7SUFFRixJQUFNLGdCQUFnQixHQUFHLFVBQU8sWUFBb0I7Ozs7O29CQUNsRCxJQUFJLG1CQUFtQixLQUFLLElBQUksSUFBSSxhQUFhO3dCQUFFLHNCQUFPO29CQUMxRCxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsQ0FBQzs7OztvQkFFN0IsTUFBTSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDM0MscUJBQU0sV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFLGFBQzdCLDJCQUEyQixFQUFFLEVBQUUsRUFDL0IsMkJBQTJCLEVBQUUsSUFBSSxJQUM5QixDQUFDLE1BQU0sSUFBSSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQ25ELGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFBOztvQkFKN0IsU0FJNkIsQ0FBQztvQkFDOUIsaUJBQWlCLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQS9CLENBQStCLENBQUMsQ0FBQzs7Ozs7O29CQUk3RCxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Ozs7U0FFaEMsQ0FBQztJQUVGLElBQU0saUJBQWlCLEdBQUcsVUFBTyxJQUFZOzs7OztvQkFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7d0JBQUUsc0JBQU87b0JBQ3pCLElBQUksYUFBYTt3QkFBRSxzQkFBTzs7OztvQkFFbEIsYUFBYSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQ3JGLHFCQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBQTs7b0JBQXJFLFNBQXFFLENBQUM7Ozs7Ozs7O1NBSXpFLENBQUM7SUFFRixJQUFNLHFCQUFxQixHQUFHLFVBQU8sUUFBc0I7Ozs7O29CQUNuRCxPQUFPLEdBQUcsa0NBQTJCLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxpQkFBYyxDQUFDOzs7O29CQUVuRixxQkFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUE7O29CQUF4RyxTQUF3RyxDQUFDOzs7Ozs7OztTQUk1RyxDQUFDO0lBRUYsOEVBQThFO0lBQzlFLGtGQUFrRjtJQUNsRiwwRUFBMEU7SUFDcEUsSUFBQSxLQUF3QyxRQUFRLENBQWdCLElBQUksQ0FBQyxFQUFwRSxlQUFlLFFBQUEsRUFBRSxrQkFBa0IsUUFBaUMsQ0FBQztJQUU1RSxJQUFNLGdCQUFnQixHQUFHLFVBQUMsS0FBWTtRQUNwQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLGdDQUFnQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSw2RUFBNkU7SUFDN0UsSUFBTSxnQkFBZ0IsR0FBRyxxQkFBcUIsQ0FBQztJQUMvQyxvRkFBb0Y7SUFDcEYsaUZBQWlGO0lBQ2pGLGdGQUFnRjtJQUNoRixJQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztJQUUzQyw2RUFBNkU7SUFDN0UsZ0ZBQWdGO0lBQ2hGLGlGQUFpRjtJQUNqRixpRkFBaUY7SUFDM0UsSUFBQSxLQUFnQyxRQUFRLENBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQXpGLFdBQVcsUUFBQSxFQUFFLGNBQWMsUUFBOEQsQ0FBQztJQUMzRixJQUFBLEtBQTRCLFFBQVEsQ0FBYSxFQUFFLENBQUMsRUFBbkQsU0FBUyxRQUFBLEVBQUUsWUFBWSxRQUE0QixDQUFDO0lBQzNELElBQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDO1FBQ3BDLE9BQU8sU0FBQTtRQUNQLE1BQU0sUUFBQTtRQUNOLFVBQVUsWUFBQTtRQUNWLE1BQU0sUUFBQTtRQUNOLE9BQU8sU0FBQTtRQUNQLGNBQWMsZ0JBQUE7UUFDZCxRQUFRLEVBQUUsZ0JBQWdCO1FBQzFCLE9BQU8sRUFBRSxnQkFBZ0I7UUFDekIsaUJBQWlCLEVBQUUsVUFBQyxJQUFJO1lBQ3RCLE9BQUEsY0FBYyxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsdUJBQU0sQ0FBQyxLQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsSUFBSSxNQUFNLEVBQUUsSUFBRyxFQUFyRSxDQUFxRSxDQUFDO1FBQTVGLENBQTRGO1FBQzlGLGtCQUFrQixFQUFFLFVBQUMsSUFBSTtZQUN2QixPQUFBLGNBQWMsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLHVCQUFNLENBQUMsS0FBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLElBQUksTUFBTSxFQUFFLElBQUcsRUFBdkUsQ0FBdUUsQ0FBQztRQUE5RixDQUE4RjtRQUNoRyxjQUFjLEVBQUUsVUFBQyxJQUFJO1lBQ25CLCtFQUErRTtZQUMvRSxZQUFZLENBQUMsVUFBQyxJQUFJLElBQUssdUNBQUksSUFBSSxVQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLFdBQS9FLENBQWdGLENBQUMsQ0FBQztZQUN6RyxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUVILGdGQUFnRjtJQUNoRixxRkFBcUY7SUFDckYsSUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDOzs7O29CQUMvQixhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2xCLGdCQUFnQixFQUFFLENBQUM7b0JBQ25CLHFCQUFNLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFBOztvQkFBbEQsU0FBa0QsQ0FBQztvQkFDbkQsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzFCLGlCQUFpQixDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztvQkFDN0Isc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdCLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQzs7OztTQUNsQixFQUFFLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBRTFDLGlGQUFpRjtJQUNqRixJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7UUFDaEMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEIsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNoQixpRkFBaUY7SUFDakYsNkVBQTZFO0lBQzdFLElBQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUM5QixTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELEtBQUssWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFFOUIsK0VBQStFO0lBQy9FLDZEQUE2RDtJQUM3RCxTQUFTLENBQUM7UUFDUixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ2hDLElBQU0sRUFBRSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLEVBQUU7WUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUM7SUFDekMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUVuRSxnRkFBZ0Y7SUFDaEYscUVBQXFFO0lBQ3JFLElBQU0sZ0JBQWdCLEdBQUcsVUFDdkIsT0FBNkIsRUFDN0IsSUFBWSxFQUNaLFVBQWtCLEVBQ2xCLEdBQVksSUFDVCxPQUFBLENBQ0gsS0FBQyxvQkFBb0IsSUFFbkIsT0FBTyxFQUFFLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxTQUFBLEVBQUUsSUFBSSxNQUFBLEVBQUUsRUFDbEYsS0FBSyxFQUFFLEtBQUssRUFDWixnQkFBZ0IsRUFBRSxLQUFLLEVBQ3ZCLFlBQVksRUFBRSxZQUFZLEVBQzFCLFFBQVEsRUFBRSxnQkFBZ0IsRUFDMUIsU0FBUyxFQUFFLFNBQVMsSUFOZixHQUFHLENBT1IsQ0FDSCxFQVZJLENBVUosQ0FBQztJQUVGLElBQU0saUJBQWlCLEdBQUcsVUFBTyxJQUFZOzs7OztvQkFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksY0FBYzt3QkFBRSxzQkFBTzs7OztvQkFHbEQsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ04scUJBQU0sWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUE7O29CQUF6RCxTQUFTLEdBQUcsU0FBNkM7b0JBQy9ELHFCQUFNLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFBOztvQkFBL0MsU0FBK0MsQ0FBQzs7OztvQkFFaEQsSUFBSSxPQUFPLEVBQUUsQ0FBQzt3QkFDWixPQUFPLENBQUMsT0FBYyxDQUFDLENBQUM7b0JBQzFCLENBQUM7OztvQkFFRCxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7U0FFNUIsQ0FBQztJQUVGLElBQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxVQUFDLFNBQWlCO1FBQ3BELE9BQU8sVUFBRyxPQUFPLGdDQUFzQixjQUFjLHVCQUFhLFNBQVMsV0FBUSxDQUFDO0lBQ3RGLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBRTlCLElBQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQztRQUMzQixJQUFNLENBQUMsR0FBMkIsRUFBRSxDQUFDO1FBQ3JDLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsaUJBQVUsVUFBVSxDQUFFLENBQUM7UUFDOUMsQ0FBQzthQUFNLENBQUM7WUFDTixDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLE1BQU07WUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBRTNCLElBQUEsS0FBc0QsUUFBUSxDQUFnQixJQUFJLENBQUMsRUFBbEYsc0JBQXNCLFFBQUEsRUFBRSx5QkFBeUIsUUFBaUMsQ0FBQztJQUMxRixJQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBUyxDQUFDLENBQUMsQ0FBQztJQUM5QyxJQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2QsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUMxQyxJQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7UUFDOUMsbUJBQW1CLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDOUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLGtCQUFrQixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksU0FBUztZQUFFLE9BQU87UUFDekMsSUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDekUseUJBQXlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUV6QixJQUFNLGdCQUFnQixHQUFHLFVBQU8sS0FBYTs7Ozs7b0JBQzNDLElBQUksYUFBYSxJQUFJLFNBQVM7d0JBQUUsc0JBQU87b0JBRXZDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDOzs7O29CQUd6QixxQkFBTSxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBQTs7b0JBQTdFLFNBQTZFLENBQUM7Ozs7Ozs7O1NBSWpGLENBQUM7SUFFRixJQUFNLHVCQUF1QixHQUFHOzs7OztvQkFDOUIsSUFBSSxTQUFTO3dCQUFFLHNCQUFPO29CQUV0QixhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2xCLGdCQUFnQixFQUFFLENBQUM7Ozs7b0JBR2pCLHFCQUFNLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFBOztvQkFBbEQsU0FBa0QsQ0FBQzs7OztvQkFFbkQsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxPQUFLLENBQUMsQ0FBQzs7Ozs7U0FFdkQsQ0FBQztJQUVGLElBQU0sZUFBZSxHQUFHO1FBQ3RCLFdBQVcsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsSUFBSSxFQUFMLENBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQztJQUVGLElBQU0sZ0JBQWdCLEdBQUc7UUFDdkIsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQztJQUVGLElBQU0sa0JBQWtCLEdBQUc7UUFDekIsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsNEVBQTRFO1FBQzVFLDREQUE0RDtRQUM1RCxXQUFXLEVBQUUsQ0FBQztJQUNoQixDQUFDLENBQUM7SUFFRixJQUFNLGlCQUFpQixHQUFHO1FBQ3hCLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQztJQUVGLElBQU0sb0JBQW9CLEdBQUcsVUFBQyxJQUFZO1FBQ3hDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQztJQUVGLElBQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDLFVBQUMsS0FBYTtRQUN0RCxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVQLElBQU0sWUFBWSxHQUFHO1FBQ25CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO1FBQy9CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO1FBQy9CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO1FBQ2hDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO1FBQy9CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO1FBQ2hDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO1FBQ2pDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0tBQzNCLENBQUM7SUFDRixJQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztRQUNqQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDO1lBQzNDLElBQU0sU0FBTyxHQUFHLElBQUksR0FBRyxDQUNyQix1QkFBdUIsQ0FBQyxHQUFHLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQWxCLENBQWtCLENBQUMsQ0FDMUQsQ0FBQztZQUNGLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFDLElBQUksSUFBSyxPQUFBLFNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUF0QixDQUFzQixDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztJQUM5QixJQUFNLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFekQsdUJBQXVCO0lBQ3ZCLElBQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxJQUFBLFlBQVksR0FBdUQsV0FBVyxhQUFsRSxFQUFFLGVBQWUsR0FBc0MsV0FBVyxnQkFBakQsRUFBRSxTQUFTLEdBQTJCLFdBQVcsVUFBdEMsRUFBRSxVQUFVLEdBQWUsV0FBVyxXQUExQixFQUFFLFFBQVEsR0FBSyxXQUFXLFNBQWhCLENBQWlCO0lBQ3ZGLElBQU0sY0FBYyxHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFOUgsSUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsSUFBSSxjQUFjLENBQUM7SUFDM0QsSUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3pELElBQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9CLElBQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRS9CLElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLFVBQVUsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUU5RCxrQkFBa0I7SUFDbEIsSUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsRUFBRSxZQUFZLGNBQUEsRUFBRSxnQkFBZ0Isa0JBQUEsRUFBRSxXQUFXLGFBQUEsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMxRyxJQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsSUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6RCxJQUFNLG1CQUFtQixHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9ELElBQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzFELElBQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BELElBQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDOUQsSUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekQsSUFBTSw2QkFBNkIsR0FBRyxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRixJQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFELElBQU0sbUJBQW1CLEdBQUcsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNyRSxJQUFNLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlELElBQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXZELElBQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO1FBQy9CLElBQUksV0FBVyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFFNUMsSUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7UUFDakMsSUFBTSxJQUFJLEdBQUcsV0FBVyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUNoRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBRWxDLElBQU0sMkJBQTJCLEdBQUcsT0FBTyxDQUFDO1FBQzFDLE9BQU8sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUV6QixJQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztRQUNyQyxnQkFBZ0Isa0JBQUE7UUFDaEIsVUFBVSxZQUFBO1FBQ1Ysa0JBQWtCLG9CQUFBO1FBQ2xCLDJCQUEyQiw2QkFBQTtRQUMzQixTQUFTLFdBQUE7S0FDVixDQUFDLENBQUM7SUFFSCxJQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUc7UUFDNUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLGNBQWMsSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6RSxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQztRQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxJQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLGNBQWMsSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckYsSUFBSSxDQUFDO29CQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUFDLENBQUM7Z0JBQzFELFFBQVEsVUFBVSxJQUFaLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFFL0IsSUFBTSxjQUFjLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksYUFBYSxJQUFJLGNBQWMsQ0FBQztJQUVqSCxJQUFNLGtCQUFrQixHQUFHO1FBQ3pCLElBQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPO1FBQ2hCLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN6QixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztRQUN6RSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxVQUFHLFNBQVMsT0FBSSxDQUFDO1FBQ25DLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEdBQUcsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3pGLENBQUMsQ0FBQztJQUVGLFNBQVMsQ0FBQztRQUNSLGtCQUFrQixFQUFFLENBQUM7SUFDdkIsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLDJCQUEyQixDQUFDLENBQUMsQ0FBQztJQUU5QyxJQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3pELElBQU0sc0JBQXNCLEdBQUcsbUJBQW1CLElBQUksQ0FDcEQsZUFBTSx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxtQkFBb0IsRUFBRSxHQUFJLENBQ3BFLENBQUM7SUFFRixJQUFNLHNCQUFzQixHQUFHLHlCQUF5QixDQUFDO1FBQ3ZELElBQUksTUFBQTtRQUNKLFlBQVksY0FBQTtRQUNaLFdBQVcsYUFBQTtRQUNYLFlBQVksY0FBQTtRQUNaLFFBQVEsVUFBQTtRQUNSLE9BQU8sU0FBQTtRQUNQLE9BQU8sU0FBQTtLQUNSLENBQUMsQ0FBQztJQUVILElBQU0sc0JBQXNCLEdBQUc7UUFDN0IsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksZUFBZSxFQUFFLENBQUM7WUFDdEcsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxDQUNMLEtBQUMsZ0JBQWdCLElBQ2Ysa0JBQWtCLEVBQUUsa0JBQWtCLEVBQ3RDLGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFDdEMsWUFBWSxFQUFFLFlBQVksRUFDMUIsS0FBSyxFQUFFLEtBQUssR0FDWixDQUNILENBQUM7SUFDSixDQUFDLENBQUM7SUFFRixJQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsT0FBTyxVQUFDLFFBQXlCLElBQUssT0FBQSw0QkFBRyxRQUFRLEdBQUksRUFBZixDQUFlLENBQUM7UUFDeEQsQ0FBQztRQUVELE9BQU8sVUFBQyxRQUF5QixJQUFLLE9BQUEsQ0FDcEMsTUFBQyx1QkFBdUIsSUFBQyxZQUFZLEVBQUUsWUFBWSxJQUFJLEVBQUUsYUFDdkQsS0FBQyxlQUFlLElBQ2QsTUFBTSxFQUFDLGdCQUFnQixFQUN2QixRQUFRLEVBQUUscUJBQXFCLEVBQy9CLGdCQUFnQixFQUFFLEtBQUssR0FDdkIsRUFDRiw0QkFBRyxRQUFRLEdBQUksSUFDUyxDQUMzQixFQVRxQyxDQVNyQyxDQUFDO0lBQ0osQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUUxQyxJQUFNLG1CQUFtQixHQUFHLGNBQU0sT0FBQSxDQUNoQyxlQUFLLEtBQUssRUFBRSxjQUFjLHlCQUFzQixNQUFNLGFBQ3BELDBCQUFRLGFBQWEsR0FBUyxFQUM5QixlQUFLLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLFNBQVMsYUFDckMsZUFBSyxLQUFLLEVBQUUsa0JBQWtCLGFBQzVCLGNBQUssR0FBRyxFQUFFLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLElBQUksRUFBRSxLQUFJLFFBQVEsRUFBRSxHQUFHLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBRSxTQUFTLEdBQUksRUFDdEUsZUFBSyxLQUFLLEVBQUUseUJBQXlCLGFBQ25DLGNBQUssS0FBSyxFQUFFLGdCQUFnQixZQUFHLFdBQVcsR0FBTyxFQUNqRCxjQUFLLEtBQUssRUFBRSxtQkFBbUIsWUFDNUIsV0FBVyxhQUFYLFdBQVcsY0FBWCxXQUFXLEdBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEdBQ2hDLElBQ0YsSUFDRixFQUNOLGVBQUssS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsYUFDL0QsaUJBQ0UsS0FBSyxFQUFFLGVBQWUsRUFDdEIsT0FBTyxFQUFFLGVBQWUsRUFDeEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFFdEIsS0FBQyxZQUFZLElBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUMsU0FBUyxHQUFHLEdBQ25DLEVBQ1IsSUFBSSxLQUFLLFVBQVUsSUFBSSxDQUN0QixpQkFDRSxLQUFLLEVBQUUsZUFBZSxFQUN0QixPQUFPLEVBQUUsY0FBTSxPQUFBLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUF4QixDQUF3QixFQUN2QyxLQUFLLEVBQUMsWUFBWSxZQUVsQixLQUFDLENBQUMsSUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBQyxTQUFTLEdBQUcsR0FDeEIsQ0FDVixJQUNHLElBQ0YsRUFDTCxDQUFDLGdCQUFnQixJQUFJLGFBQWEsSUFBSSxDQUNyQyxjQUNFLEtBQUssRUFBRTtvQkFDTCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsSUFBSSxFQUFFLENBQUM7b0JBQ1AsS0FBSyxFQUFFLENBQUM7b0JBQ1IsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFlBQVksR0FBRyxFQUFFLENBQUM7b0JBQ25DLE1BQU0sRUFBRSxFQUFFO29CQUNWLGFBQWEsRUFBRSxNQUFNO29CQUNyQixNQUFNLEVBQUUsQ0FBQztvQkFDVCxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzlCLFVBQVUsRUFBRSwyQkFBMkI7aUJBQ3hDLFlBRUQsY0FDRSxLQUFLLEVBQUU7d0JBQ0wsUUFBUSxFQUFFLFVBQVU7d0JBQ3BCLElBQUksRUFBRSxDQUFDO3dCQUNQLEdBQUcsRUFBRSxDQUFDO3dCQUNOLE1BQU0sRUFBRSxFQUFFO3dCQUNWLEtBQUssRUFBRSxLQUFLO3dCQUNaLE1BQU0sRUFBRSxZQUFZO3dCQUNwQixVQUFVLEVBQ1IsaUNBQTBCLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLGtCQUFRLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLG1CQUFTLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLG1CQUFTLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLG1CQUFTLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFdBQVE7d0JBQ3ROLFVBQVUsRUFBRSxvQkFBb0I7d0JBQ2hDLFNBQVMsRUFBRSx1SEFBdUg7d0JBQ2xJLFlBQVksRUFBRSxFQUFFO3FCQUNqQixHQUNELEdBQ0UsQ0FDUCxFQUVBLFFBQVEsSUFBSSxDQUNYLGVBQUssR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxhQUN0QyxlQUFLLEtBQUssRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixhQUNsRCxLQUFDLFNBQVMsSUFBQyxJQUFJLEVBQUUsRUFBRSxHQUFJLEVBQ3RCLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUN4QixFQUNMLElBQUksS0FBSyxZQUFZLElBQUksQ0FDeEIsZUFBSyxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsYUFDdkQsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFDLFNBQVMsSUFBQyxJQUFJLEVBQUUsRUFBRSxHQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUMsU0FBUyxJQUFDLElBQUksRUFBRSxFQUFFLEdBQUksRUFDaEUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQ2pCLENBQ1AsRUFDQSxrQkFBa0IsSUFBSSxDQUNyQixlQUNFLEtBQUssd0JBQU8sYUFBYSxLQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sS0FDckUsT0FBTyxFQUFFLFVBQUMsQ0FBQzs0QkFDVCxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7NEJBQ3BCLHVCQUF1QixDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQzt3QkFDakQsQ0FBQyxhQUVELEtBQUMsS0FBSyxJQUFDLElBQUksRUFBRSxFQUFFLEdBQUksRUFDbkIsZUFBTSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFlBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFRLEVBQ3BELG9CQUFvQixJQUFJLENBQ3ZCLGNBQ0UsS0FBSyxFQUFFO29DQUNMLFFBQVEsRUFBRSxVQUFVO29DQUNwQixLQUFLLEVBQUUsQ0FBQztvQ0FDUixHQUFHLEVBQUUsTUFBTTtvQ0FDWCxTQUFTLEVBQUUsS0FBSztvQ0FDaEIsZUFBZSxFQUFFLGVBQWU7b0NBQ2hDLFlBQVksRUFBRSxLQUFLO29DQUNuQixTQUFTLEVBQUUsK0JBQStCO29DQUMxQyxRQUFRLEVBQUUsT0FBTztvQ0FDakIsUUFBUSxFQUFFLE9BQU87b0NBQ2pCLFFBQVEsRUFBRSxRQUFRO29DQUNsQixNQUFNLEVBQUUsSUFBSTtpQ0FDYixFQUNELE9BQU8sRUFBRSxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBbkIsQ0FBbUIsWUFFbEMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQUMsSUFBSSxFQUFFLEtBQUssSUFBSyxPQUFBLENBQ3ZDLGNBRUUsS0FBSyxFQUFFO3dDQUNMLE9BQU8sRUFBRSxNQUFNO3dDQUNmLFVBQVUsRUFBRSxRQUFRO3dDQUNwQixHQUFHLEVBQUUsS0FBSzt3Q0FDVixPQUFPLEVBQUUsV0FBVzt3Q0FDcEIsS0FBSyxFQUFFLFNBQVM7d0NBQ2hCLGVBQWUsRUFBRSxnQkFBZ0IsS0FBSyxJQUFJLENBQUMsSUFBSTs0Q0FDN0MsQ0FBQyxDQUFDLENBQUMsQ0FBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsY0FBYyxLQUFJLFNBQVMsQ0FBQzs0Q0FDdEMsQ0FBQyxDQUFDLGFBQWE7d0NBQ2pCLFlBQVksRUFBRSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLE1BQU07d0NBQ2xGLE1BQU0sRUFBRSxTQUFTO3dDQUNqQixRQUFRLFVBQUE7d0NBQ1IsVUFBVSxZQUFBO3dDQUNWLFVBQVUsRUFBRSw0QkFBNEI7cUNBQ3pDLEVBQ0QsWUFBWSxFQUFFLFVBQUMsQ0FBQzt3Q0FDZCxJQUFJLGdCQUFnQixLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0Q0FDbkMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLENBQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLGNBQWMsS0FBSSxTQUFTLENBQUM7d0NBQzdFLENBQUM7b0NBQ0gsQ0FBQyxFQUNELFlBQVksRUFBRSxVQUFDLENBQUM7d0NBQ2QsSUFBSSxnQkFBZ0IsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7NENBQ25DLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUM7d0NBQ3hELENBQUM7b0NBQ0gsQ0FBQyxFQUNELE9BQU8sRUFBRSxVQUFDLENBQUM7d0NBQ1QsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO3dDQUNwQixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0NBQ2hDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO3dDQUMvQixXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7b0NBQ3JCLENBQUMsWUFFQSxJQUFJLENBQUMsSUFBSSxJQWpDTCxJQUFJLENBQUMsSUFBSSxDQWtDVixDQUNQLEVBckN3QyxDQXFDeEMsQ0FBQyxHQUNFLENBQ1AsSUFDRyxDQUNQLElBQ0csQ0FDUCxFQUVELGVBQUssS0FBSyxFQUFFLGdCQUFnQixhQUMxQixlQUFLLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLGFBQ2xELHNCQUFzQixFQUFFLEVBRXhCLENBQUM7Z0NBQ0EsSUFBTSwwQkFBMEIsR0FDOUIsc0JBQXNCO29DQUN0QixDQUFDLGVBQWU7b0NBQ2hCLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUM7b0NBQzFELENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7dUNBQzNFLGNBQWMsQ0FBQztnQ0FFcEIsSUFBSSxDQUFDLDBCQUEwQjtvQ0FBRSxPQUFPLElBQUksQ0FBQztnQ0FFN0MsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0NBQzFDLElBQU0sZ0JBQWdCLEdBQWdCO29DQUNwQyxXQUFXLEVBQUUsR0FBRztvQ0FDaEIsVUFBVSxFQUFFLENBQUM7b0NBQ2IsUUFBUSxFQUFFLElBQUk7b0NBQ2QsT0FBTyxFQUFFLE9BQU87b0NBQ2hCLElBQUksRUFBRSxjQUFjLElBQUksRUFBRTtpQ0FDM0IsQ0FBQztnQ0FFRixPQUFPLENBQ0wsS0FBQyxvQkFBb0IsSUFFbkIsT0FBTyxFQUFFLGdCQUFnQixFQUN6QixLQUFLLEVBQUUsS0FBSyxFQUNaLGNBQWMsRUFBRSxJQUFJLEVBQ3BCLGlCQUFpQixFQUFFLEtBQUssRUFDeEIsaUJBQWlCLEVBQUUsS0FBSyxFQUN4QixnQkFBZ0IsRUFBRSxLQUFLLEVBQ3ZCLGVBQWUsRUFBRSxlQUFlLElBQUksU0FBUyxFQUM3QyxZQUFZLEVBQUUsWUFBWSxJQUFJLFNBQVMsRUFDdkMsZUFBZSxFQUFFLGVBQWUsRUFDaEMsWUFBWSxFQUFFLGdCQUFnQixFQUM5QixhQUFhLEVBQUUsaUJBQWlCLEVBQ2hDLFlBQVksRUFBRSxZQUFZLEVBQzFCLFFBQVEsRUFBRSxnQkFBZ0IsRUFDMUIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsYUFBYSxFQUFFLGFBQWEsSUFmeEIsdUJBQXVCLENBZ0IzQixDQUNILENBQUM7NEJBQ0osQ0FBQyxDQUFDLEVBQUUsRUFDSCxDQUFDO2dDQUNBLElBQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBckIsQ0FBcUIsQ0FBQyxDQUFDO2dDQUV2RSx3RUFBd0U7Z0NBQ3hFLDJFQUEyRTtnQ0FDM0UsdUVBQXVFO2dDQUN2RSxJQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO2dDQUN2QyxLQUFtQixVQUFTLEVBQVQsdUJBQVMsRUFBVCx1QkFBUyxFQUFULElBQVMsRUFBRSxDQUFDO29DQUExQixJQUFNLElBQUksa0JBQUE7b0NBQ2IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTt3Q0FBRSxZQUFZLENBQUMsR0FBRyxDQUFDLG1CQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUUsQ0FBQyxDQUFDO29DQUN2RSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFO3dDQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsZ0JBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBRSxDQUFDLENBQUM7Z0NBQ3hFLENBQUM7Z0NBRUQsSUFBTSxrQkFBa0IsR0FBRyxVQUFDLE9BQW9CO29DQUM5QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssTUFBTTt3Q0FBRSxPQUFPLEtBQUssQ0FBQztvQ0FDMUMsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQUcsT0FBTyxDQUFDLE9BQU8sY0FBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUUsQ0FBQzt3Q0FBRSxPQUFPLEtBQUssQ0FBQztvQ0FDeEYsT0FBTyxJQUFJLENBQUM7Z0NBQ2QsQ0FBQyxDQUFBO2dDQUVELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFDLE9BQU8sRUFBRSxLQUFLO29DQUM1RCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFLENBQUM7d0NBQ25FLElBQUksQ0FBQzs0Q0FDSCxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzs0Q0FDNUMsSUFBTSxTQUFTLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRDQUM3QyxPQUFPLENBQ0wsZUFBaUIsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxhQUN4RyxjQUFLLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsWUFDakYsU0FBUyxJQUFJLE9BQU8sR0FDakIsRUFDTCxXQUFXLEtBQUssUUFBUSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDdkMsS0FBQyxrQkFBa0IsSUFDakIsTUFBTSxFQUFFLFVBQVUsRUFDbEIsUUFBUSxFQUFFLFVBQUMsSUFBSSxJQUFLLE9BQUEsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUE3QixDQUE2QixFQUNqRCxRQUFRLEVBQUUsY0FBTSxPQUFBLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUF2QixDQUF1QixFQUN2QyxZQUFZLEVBQUUsbUJBQW1CLEtBQUssS0FBSyxFQUMzQyxXQUFXLEVBQUUsS0FBSyxFQUNsQixZQUFZLEVBQUUsWUFBWSxFQUMxQixVQUFVLEVBQUUsVUFBVSxFQUN0QixPQUFPLEVBQUMsTUFBTSxHQUNkLENBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FDRixlQUFLLEtBQUssRUFBRTs0REFDVixlQUFlLEVBQUUsU0FBUzs0REFDMUIsWUFBWSxFQUFFLE1BQU07NERBQ3BCLE9BQU8sRUFBRSxXQUFXOzREQUNwQixRQUFRLEVBQUUsTUFBTTs0REFDaEIsS0FBSyxFQUFFLFNBQVM7NERBQ2hCLFVBQVUsWUFBQTt5REFDWCxhQUNFLFVBQVUsQ0FBQyxPQUFPLElBQUksNkJBQTZCLEVBQ25ELFNBQVMsSUFBSSxDQUNaLGNBQUssS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaURBRTlELENBQ1AsSUFDRyxDQUNQLEtBL0JPLEtBQUssQ0FnQ1QsQ0FDUCxDQUFDO3dDQUNKLENBQUM7d0NBQUMsV0FBTSxDQUFDOzRDQUNQLHVEQUF1RDt3Q0FDekQsQ0FBQztvQ0FDSCxDQUFDO29DQUVELElBQU0saUJBQWlCLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxPQUFPLENBQUM7b0NBQ3pHLElBQU0saUJBQWlCLEdBQUcsS0FBSyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDO29DQUN2RixJQUFNLG1CQUFtQixHQUFHLEtBQUssS0FBSyxlQUFlLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7b0NBQ3pHLElBQU0sY0FBYyxHQUNsQixtQkFBbUIsSUFBSSxjQUFjO3dDQUNuQyxDQUFDLHVCQUFNLE9BQU8sS0FBRSxJQUFJLEVBQUUsY0FBYyxJQUNwQyxDQUFDLENBQUMsT0FBTyxDQUFDO29DQUVkLE9BQU8sQ0FDTCxLQUFDLG9CQUFvQixJQUVuQixPQUFPLEVBQUUsY0FBYyxFQUN2QixLQUFLLEVBQUUsS0FBSyxFQUNaLFdBQVcsRUFBRSxPQUFPLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDeEUsY0FBYyxFQUFFLGNBQWMsRUFDOUIsY0FBYyxFQUFFLG1CQUFtQixFQUNuQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFDcEMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQ3BDLFVBQVUsRUFBRSxVQUFDLFNBQVMsRUFBRSxLQUFLLElBQUssT0FBQSxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUE3QixDQUE2QixFQUMvRCxnQkFBZ0IsRUFBRSxLQUFLLEtBQUssUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQzlFLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDakYsWUFBWSxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUMzRSxlQUFlLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUNsRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQzlCLGFBQWEsRUFBRSxpQkFBaUIsRUFDaEMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQ3hDLGFBQWEsRUFBRSxLQUFLLEtBQUssUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQzNFLFlBQVksRUFBRSxZQUFZLEVBQzFCLFFBQVEsRUFBRSxnQkFBZ0IsRUFDMUIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsZUFBZSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQ25GLFlBQVksRUFBRSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUM3RSxzQkFBc0IsRUFBRSxzQkFBc0IsSUF2QnpDLEtBQUssQ0F3QlYsQ0FDSCxDQUFDO2dDQUNKLENBQUMsQ0FBQyxDQUFDOzRCQUNMLENBQUMsQ0FBQyxFQUFFLEVBQ0gsYUFBYSxJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FDbkQsZUFBSyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxhQUN2RSxjQUFLLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsWUFBRyxTQUFTLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFPLEVBQzVILGNBQUssS0FBSyxFQUFFOzRDQUNWLGVBQWUsRUFBRSxhQUFhOzRDQUM5QixPQUFPLEVBQUUsQ0FBQzs0Q0FDVixZQUFZLEVBQUUsQ0FBQzs0Q0FDZixRQUFRLEVBQUUsTUFBTTt5Q0FDakIsWUFDQyxjQUVFLEtBQUssRUFBRTtnREFDTCxTQUFTLEVBQUUsNEJBQTRCO2dEQUN2QyxVQUFVLEVBQUUsb0JBQW9CO2dEQUNoQyxLQUFLLEVBQUUsU0FBUztnREFDaEIsUUFBUSxFQUFFLE1BQU07NkNBQ2pCLFlBRUEsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBUm5HLFVBQUcsd0JBQXdCLGNBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBU2hFLEdBQ0YsSUFDRixDQUNQLEVBS0EsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFDLElBQUksRUFBRSxDQUFDLElBQUssT0FBQSxDQUMxQixNQUFDLEtBQUssQ0FBQyxRQUFRLGVBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUNuRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBRmhFLG9CQUFhLENBQUMsQ0FBRSxDQUdwQixDQUNsQixFQUwyQixDQUszQixDQUFDLEVBR0QsU0FBUyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7Z0NBQ25ELGdCQUFnQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsdUJBQXVCLENBQUMsRUFDaEcsU0FBUyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7Z0NBQ3BELGdCQUFnQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsd0JBQXdCLENBQUMsRUFDaEcsY0FBSyxHQUFHLEVBQUUsY0FBYyxHQUFJLElBQ3hCLEVBQ0wsc0JBQXNCLElBQUksQ0FBQzt3QkFDMUIsSUFBTSx1QkFBdUIsR0FDM0IsQ0FBQyxlQUFlOzRCQUNoQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDOzRCQUMxRCxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7d0JBQ2pGLE9BQU8sQ0FDTCxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7NEJBQzFCLENBQUMsZUFBZTs0QkFDaEIsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQzs0QkFDMUQsQ0FBQyx1QkFBdUIsQ0FDekIsQ0FBQztvQkFDSixDQUFDLENBQUMsRUFBRSxJQUFJLENBQ04sY0FBSyxLQUFLLEVBQUUsNkJBQTZCLFlBQ3RDLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBQyxLQUFLLEVBQUUsS0FBSyxJQUFLLE9BQUEsQ0FDckMsaUJBRUUsS0FBSyxFQUFFLGdCQUFnQixFQUN2QixPQUFPLEVBQUUsY0FBTSxPQUFBLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUF2QixDQUF1QixFQUN0QyxRQUFRLEVBQUUsU0FBUyxJQUFJLGFBQWEsWUFFbkMsS0FBSyxJQUxELEtBQUssQ0FNSCxDQUNWLEVBVHNDLENBU3RDLENBQUMsR0FDRSxDQUNQLEVBRUEsY0FBYyxJQUFJLENBQ2pCLGVBQ0UsS0FBSyxFQUFFOzRCQUNMLE1BQU0sRUFBRSxZQUFZOzRCQUNwQixPQUFPLEVBQUUsV0FBVzs0QkFDcEIsZUFBZSxFQUFFLFNBQVM7NEJBQzFCLEtBQUssRUFBRSxTQUFTOzRCQUNoQixZQUFZLEVBQUUsTUFBTTs0QkFDcEIsUUFBUSxVQUFBOzRCQUNSLFVBQVUsWUFBQTs0QkFDVixPQUFPLEVBQUUsTUFBTTs0QkFDZixVQUFVLEVBQUUsUUFBUTs0QkFDcEIsR0FBRyxFQUFFLEtBQUs7NEJBQ1YsVUFBVSxFQUFFLENBQUM7eUJBQ2QsRUFDRCxJQUFJLEVBQUMsT0FBTyxhQUVaLEtBQUMsV0FBVyxJQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxHQUFJLEVBQ25ELHlCQUFPLGNBQWMsR0FBUSxJQUN6QixDQUNQLEVBRUEsZUFBZSxJQUFJLENBQ2xCLGVBQ0UsS0FBSyxFQUFFOzRCQUNMLE1BQU0sRUFBRSxZQUFZOzRCQUNwQixPQUFPLEVBQUUsV0FBVzs0QkFDcEIsZUFBZSxFQUFFLFNBQVM7NEJBQzFCLEtBQUssRUFBRSxTQUFTOzRCQUNoQixZQUFZLEVBQUUsTUFBTTs0QkFDcEIsUUFBUSxVQUFBOzRCQUNSLFVBQVUsWUFBQTs0QkFDVixPQUFPLEVBQUUsTUFBTTs0QkFDZixVQUFVLEVBQUUsUUFBUTs0QkFDcEIsR0FBRyxFQUFFLEtBQUs7NEJBQ1YsVUFBVSxFQUFFLENBQUM7eUJBQ2QsRUFDRCxJQUFJLEVBQUMsT0FBTyxhQUVaLEtBQUMsV0FBVyxJQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxHQUFJLEVBQ25ELHlCQUFPLGVBQWUsR0FBUSxJQUMxQixDQUNQLEVBRUEsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQ3BDLGNBQUssS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQ2xHLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBQyxHQUFHLEVBQUUsS0FBSyxJQUFLLE9BQUEsQ0FDL0IsS0FBQyxpQkFBaUIsSUFFaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQ2QsUUFBUSxFQUFFLGNBQU0sT0FBQSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFyQyxDQUFxQyxFQUNyRCxTQUFTLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUh2QyxLQUFLLENBSVYsQ0FDSCxFQVBnQyxDQU9oQyxDQUFDLEdBQ0UsQ0FDUCxFQUVBLENBQUMsY0FBYyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDaEMsY0FBSyxLQUFLLEVBQUUsbUJBQW1CLFlBQzdCLGlCQUNFLElBQUksRUFBQyxRQUFRLEVBQ2IsS0FBSyx3QkFBTSxlQUFlLEtBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLFlBQUEsRUFBRSxRQUFRLFVBQUEsS0FDeEgsT0FBTyxFQUFFLHVCQUF1QixFQUNoQyxRQUFRLEVBQUUsU0FBUyxZQUVsQixDQUFDLENBQUMsMkJBQTJCLENBQUMsR0FDeEIsR0FDTCxDQUNQLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUM1QyxlQUFLLEtBQUssd0JBQ0wsbUJBQW1CLEtBQ3RCLGFBQWEsRUFBRSxRQUFRLEVBQ3ZCLFNBQVMsRUFBRSxtQkFBbUIsZ0JBRTlCLEtBQUMsa0JBQWtCLElBQ2pCLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTSxFQUMxQixRQUFRLEVBQUUsVUFBQyxJQUFJLElBQUssT0FBQSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUF6QyxDQUF5QyxFQUM3RCxRQUFRLEVBQUUsY0FBTSxPQUFBLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBbkMsQ0FBbUMsRUFDbkQsWUFBWSxFQUFFLG1CQUFtQixLQUFLLFdBQVcsQ0FBQyxLQUFLLEVBQ3ZELFdBQVcsRUFBRSxLQUFLLEVBQ2xCLFlBQVksRUFBRSxZQUFZLEVBQzFCLFVBQVUsRUFBRSxVQUFVLEVBQ3RCLE9BQU8sRUFBQyxRQUFRLEdBQ2hCLEVBQ0Qsc0JBQXNCLElBQUksQ0FDekIsY0FBSyxTQUFTLEVBQUMscUJBQXFCLEVBQUMsS0FBSyxFQUFFLGVBQWUsWUFDeEQsc0JBQXNCLEdBQ25CLENBQ1AsSUFDRyxDQUNQLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztvQkFDckIsdUVBQXVFO29CQUN2RSw2REFBNkQ7b0JBQzdELGNBQUssS0FBSyxFQUFFLG1CQUFtQixZQUM3QixlQUFLLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsYUFDbEYsZUFBSyxLQUFLLEVBQUUsaUJBQWlCLGFBQzNCLGVBQU0sS0FBSyxFQUFFLHFCQUFxQixDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxZQUM3RCxjQUFjO2dEQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLEVBQUUsbUNBQW1DLENBQUM7Z0RBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLEVBQUUsZ0NBQWdDLENBQUMsR0FDM0QsRUFDUCxLQUFDLGVBQWUsSUFDZCxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFDeEIsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQ3RCLE1BQU0sRUFBRSxXQUFXLEVBQ25CLEtBQUssRUFBRSxLQUFLLEVBQ1osUUFBUSxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsY0FBYyxHQUNyQyxJQUNFLEVBQ0wsc0JBQXNCLElBQUksQ0FDekIsY0FBSyxTQUFTLEVBQUMscUJBQXFCLEVBQUMsS0FBSyxFQUFFLGVBQWUsWUFDeEQsc0JBQXNCLEdBQ25CLENBQ1AsSUFDRyxHQUNGLENBQ1AsQ0FBQyxDQUFDLENBQUMsQ0FDRixlQUFNLFFBQVEsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixZQUN0RCxlQUFLLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsYUFDcEYsZUFBSyxLQUFLLEVBQUUsaUJBQWlCLGFBQzFCLE9BQU8sSUFBSSxDQUNWLDhCQUNFLGlCQUNFLElBQUksRUFBQyxRQUFRLEVBQ2IsS0FBSyxFQUFFLGlCQUFpQixFQUN4QixLQUFLLEVBQUMsUUFBUSxFQUNkLE9BQU8sRUFBRSxzQkFBTSxPQUFBLE1BQUEsWUFBWSxDQUFDLE9BQU8sMENBQUUsS0FBSyxFQUFFLENBQUEsRUFBQSxZQUU1QyxLQUFDLFNBQVMsSUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBQyxTQUFTLEdBQUcsR0FDaEMsRUFDVCxnQkFDRSxJQUFJLEVBQUMsTUFBTSxFQUNYLFFBQVEsUUFDUixHQUFHLEVBQUUsWUFBWSxFQUNqQixLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQzFCLFFBQVEsRUFBRSxnQkFBZ0IsRUFDMUIsTUFBTSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQzVDLElBQ0QsQ0FDSixFQUNELG1CQUNFLEdBQUcsRUFBRSxXQUFXLEVBQ2hCLEtBQUssRUFBRSxhQUFhLEVBQ3BCLFNBQVMsRUFBQyxrQkFBa0IsRUFDNUIsS0FBSyxFQUFFLFVBQVUsRUFDakIsUUFBUSxFQUFFLFVBQUMsQ0FBQyxJQUFLLE9BQUEsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQTdCLENBQTZCLEVBQzlDLFNBQVMsRUFBRSxVQUFDLENBQUM7Z0RBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvREFDckMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO29EQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7d0RBQzlGLGFBQWEsRUFBRSxDQUFDO29EQUNsQixDQUFDO2dEQUNILENBQUM7NENBQ0gsQ0FBQyxFQUNELFdBQVcsRUFBRSxnQkFBZ0IsRUFDN0IsUUFBUSxFQUFFLENBQUMsY0FBYyxJQUFJLFdBQVcsSUFBSSxjQUFjLEVBQzFELElBQUksRUFBRSxDQUFDLEdBQ1AsRUFDRixjQUFLLEtBQUssRUFBRSx5QkFBeUIsWUFDbEMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDdEUsaUJBQ0UsSUFBSSxFQUFDLFFBQVEsRUFDYixLQUFLLHdCQUFPLGVBQWUsR0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUMvRSxRQUFRLEVBQUUsY0FBYyxZQUV4QixLQUFDLE9BQU8sSUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFDLFNBQVMsR0FBRyxHQUM5QyxDQUNWLEdBQ0csRUFDTCxRQUFRLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUNuRSxLQUFDLFVBQVUsSUFDVCxZQUFZLEVBQUUsVUFBTyxJQUFVLEVBQUUsTUFBYzs7Ozs7OzREQUUzQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0REFDeEIscUJBQU0sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFBOzs0REFBcEMsU0FBb0MsQ0FBQzs7Ozs7OzREQUlyQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7aURBRTVCLEVBQ0QsT0FBTyxFQUFFLGdCQUFnQixFQUN6QixLQUFLLEVBQUUsS0FBSyxHQUNaLENBQ0gsSUFDRyxFQUVMLHNCQUFzQixJQUFJLENBQ3pCLGNBQUssU0FBUyxFQUFDLHFCQUFxQixFQUFDLEtBQUssRUFBRSxlQUFlLFlBQ3hELHNCQUFzQixHQUNuQixDQUNQLElBQ0ssR0FDRCxDQUNSLElBQ0csRUFFTixjQUFLLEtBQUssRUFBRSxtQkFBbUIsWUFDN0IsZUFBSyxLQUFLLEVBQUUsa0JBQWtCLGFBQzVCLGFBQUksS0FBSyxFQUFFLEVBQUMsVUFBVSxZQUFBLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBQyxZQUFHLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxHQUFNLEVBQ2pGLFlBQUcsS0FBSyxFQUFFLEVBQUMsVUFBVSxZQUFBLEVBQUUsUUFBUSxVQUFBLEVBQUMsWUFBRyxDQUFDLENBQUMsa0NBQWtDLENBQUMsR0FBSyxFQUM3RSxlQUFLLEtBQUssRUFBRSxtQkFBbUIsYUFDN0IsaUJBQVEsS0FBSyx3QkFBTSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUUsS0FBSyxFQUFFLFNBQVMsS0FBRyxPQUFPLEVBQUUsaUJBQWlCLFlBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQVUsRUFDM0ksaUJBQVEsS0FBSyxFQUFFLHFCQUFxQixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLFlBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFVLElBQy9HLElBQ0YsR0FDRixJQUNGLENBQ1AsRUF6akJpQyxDQXlqQmpDLENBQUM7SUFFRixJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQ0wsOEJBQ0csQ0FBQyxjQUFjLElBQUksQ0FDbEIsS0FBQyxVQUFVLElBQ1QsUUFBUSxFQUFFLGNBQWMsRUFDeEIsT0FBTyxFQUFFLGNBQU0sT0FBQSxpQkFBaUIsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsSUFBSSxFQUFMLENBQUssQ0FBQyxFQUFoQyxDQUFnQyxFQUMvQyxZQUFZLEVBQUUsWUFBWSxFQUMxQixLQUFLLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxRQUFRLFVBQUEsRUFBRSxPQUFPLFNBQUEsRUFBRSxPQUFPLFNBQUEsRUFBRSxDQUFDLEVBQ3hELGNBQWMsRUFBRSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsY0FBYyxHQUNyQyxDQUNILEVBRUEsY0FBYyxJQUFJLENBQ2pCLGNBQUssS0FBSyxFQUFFLHNCQUFzQiw4QkFBMkIsVUFBVSxZQUNwRSxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEdBQ3ZDLENBQ1AsSUFDQSxDQUNKLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDMUIsT0FBTyxDQUNMLGNBQUssS0FBSyxFQUFFLHNCQUFzQiw4QkFBMkIsWUFBWSxZQUN0RSxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEdBQ3ZDLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLG1CQUFtQixDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztBQUNwRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QsIHVzZU1lbW8sIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VDb21wb25lbnQgfSBmcm9tICcuL0NoYXRNZXNzYWdlJztcbmltcG9ydCB7IEF0dGFjaG1lbnRQcmV2aWV3IH0gZnJvbSAnLi9jb21tb24vQXR0YWNobWVudFByZXZpZXcnO1xuaW1wb3J0IHsgdXNlQ2hhdCB9IGZyb20gJy4uL2hvb2tzL3VzZUNoYXQnO1xuaW1wb3J0IHsgdXNlU2Nyb2xsTWFuYWdlbWVudCB9IGZyb20gJy4uL2hvb2tzL3VzZVNjcm9sbE1hbmFnZW1lbnQnO1xuaW1wb3J0IHsgdXNlVGhpbmtpbmdBbmltYXRpb24gfSBmcm9tICcuLi9ob29rcy91c2VUaGlua2luZ0FuaW1hdGlvbic7XG5pbXBvcnQgeyB1c2VWaWV3cG9ydE1hbmFnZXIgfSBmcm9tICcuLi9ob29rcy91c2VWaWV3cG9ydE1hbmFnZXInO1xuaW1wb3J0IHsgdXNlRmlsZUF0dGFjaG1lbnRzIH0gZnJvbSAnLi4vaG9va3MvdXNlRmlsZUF0dGFjaG1lbnRzJztcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBHZW5BZ2VudENoYXRQcm9wcywgU2NoZWR1bGVJdGVtIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgVm9pY2VJbnB1dCB9IGZyb20gJy4vVm9pY2VJbnB1dCc7XG5pbXBvcnQgeyBMaXZlQ2FsbENvbnRyb2wgfSBmcm9tICcuL0xpdmVDYWxsQ29udHJvbCc7XG5pbXBvcnQgeyB1c2VMaXZlVm9pY2UgYXMgdXNlTGl2ZVZvaWNlU2Vzc2lvbiB9IGZyb20gJy4uL2hvb2tzL3VzZUxpdmVWb2ljZSc7XG5pbXBvcnQgeyBBdWRpb1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdWRpb1NlcnZpY2UnO1xuaW1wb3J0IHsgUGFwZXJjbGlwLCBNb3JlVmVydGljYWwsIFJlZnJlc2hDdywgR2xvYmUsIFgsIEFycm93VXAsIE1heGltaXplMiwgTWluaW1pemUyLCBBbGVydENpcmNsZSB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyBDaGF0QnViYmxlIH0gZnJvbSAnLi9DaGF0QnViYmxlJztcbmltcG9ydCBEeW5hbWljRm9ybU1lc3NhZ2UgZnJvbSAnLi9EeW5hbWljRm9ybU1lc3NhZ2UnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZWxlY3RvciB9IGZyb20gJy4vTGFuZ3VhZ2VTZWxlY3Rvcic7XG5pbXBvcnQgY2hhdExvZ28gZnJvbSAnLi4vYXNzZXRzL2NoYXQtbG9nby5wbmcnO1xuXG5pbXBvcnQge1xuICByZXNvbHZlTGFuZ3VhZ2UsXG4gIG1lcmdlVHJhbnNsYXRpb25zLFxuICBnZXRUcmFuc2xhdGlvblN0cmluZyxcbiAgZ2V0VHJhbnNsYXRpb25zRm9yTGFuZ3VhZ2UsXG59IGZyb20gJy4uL3V0aWxzL2kxOG4nO1xuaW1wb3J0IHsgR29vZ2xlUmVDYXB0Y2hhLCBHb29nbGVSZUNhcHRjaGFQcm92aWRlciB9IGZyb20gJ3JlYWN0LWdvb2dsZS1yZWNhcHRjaGEtdjMnO1xuXG5pbXBvcnQge1xuICByZXNvbHZlVGhlbWUsXG4gIGhleFRvUmdiYSxcbiAgZ2V0Q29udGFpbmVyU3R5bGUsXG4gIGdldEhlYWRlclN0eWxlLFxuICBsb2dvQ29udGFpbmVyU3R5bGUsXG4gIGxvZ29TdHlsZSxcbiAgaGVhZGVyVGl0bGVDb250YWluZXJTdHlsZSxcbiAgZ2V0SGVhZGVyVGl0bGVTdHlsZSxcbiAgZ2V0SGVhZGVyU3VidGl0bGVTdHlsZSxcbiAgbWVudUJ1dHRvblN0eWxlLFxuICBnZXRNZW51UG9wdXBTdHlsZSxcbiAgZ2V0TWVudUl0ZW1TdHlsZSxcbiAgY2hhdENvbnRhaW5lclN0eWxlLFxuICBpbnB1dENvbnRhaW5lclN0eWxlLFxuICBpbnB1dFdyYXBwZXJTdHlsZSxcbiAgZ2V0VGV4dEFyZWFTdHlsZSxcbiAgZ2V0TGl2ZVZvaWNlSGludFN0eWxlLFxuICBhdHRhY2hCdXR0b25TdHlsZSxcbiAgZ2V0U2VuZEJ1dHRvblN0eWxlLFxuICBzZW5kQnV0dG9uRGlzYWJsZWRTdHlsZSxcbiAgcmlnaHRBY3Rpb25Db250YWluZXJTdHlsZSxcbiAgZ2V0UG9zc2libGVRdWVyaWVzQ29udGFpbmVyU3R5bGUsXG4gIGdldFF1ZXJ5QnV0dG9uU3R5bGUsXG4gIGdldENvbmZpcm1PdmVybGF5U3R5bGUsXG4gIGdldENvbmZpcm1EaWFsb2dTdHlsZSxcbiAgY29uZmlybUJ1dHRvbnNTdHlsZSxcbiAgZ2V0Q29uZmlybUJ1dHRvblN0eWxlLFxuICBnZXRDb250ZW50Q2FyZFN0eWxlLFxuICBnZXREaXNjbGFpbWVyU3R5bGUsXG4gIGdldFBvc2l0aW9uU3R5bGVzLFxuICBnZXRGbG9hdGluZ0NvbnRhaW5lclN0eWxlLFxuICBDU1NfS0VZRlJBTUVTLFxufSBmcm9tICcuLi9zdHlsZXMvZ2VuQWdlbnRDaGF0U3R5bGVzJztcblxuY29uc3QgU0hPV19DSEFUX0xBTkdVQUdFX1NFTEVDVE9SID0gdHJ1ZTtcblxuLyoqIE9uZSBjb21wbGV0ZWQgKG9yIGluLXByb2dyZXNzKSBsaXZlLXZvaWNlIGV4Y2hhbmdlOiB3aGF0IHRoZSB1c2VyIHNhaWQgKyB0aGUgcmVwbHkuICovXG50eXBlIExpdmVUdXJuID0geyB1c2VyOiBzdHJpbmc7IGFnZW50OiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlciB9O1xuXG4vKiogQ3VycmVudCB0aW1lIGluIGVwb2NoIHNlY29uZHMgKHRoZSB0aW1lc3RhbXAgZm9ybWF0IENoYXRNZXNzYWdlIGV4cGVjdHMpLiAqL1xuY29uc3Qgbm93U2VjID0gKCkgPT4gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbmV4cG9ydCBjb25zdCBHZW5BZ2VudENoYXQ6IFJlYWN0LkZDPEdlbkFnZW50Q2hhdFByb3BzPiA9ICh7XG4gIGJhc2VVcmwsXG4gIHdlYnNvY2tldFVybCxcbiAgYXBpS2V5LFxuICB0ZW5hbnQsXG4gIG1ldGFkYXRhLFxuICB1c2VXcyA9IHRydWUsXG4gIHVzZVBvbGwgPSBmYWxzZSxcbiAgb25FcnJvcixcbiAgb25UYWtlb3ZlcixcbiAgb25GaW5hbGl6ZSxcbiAgdGhlbWUsXG4gIGhlYWRlclRpdGxlID0gJ0dlbmFzc2lzdCcsXG4gIGRlc2NyaXB0aW9uLFxuICBwbGFjZWhvbGRlcixcbiAgYWdlbnROYW1lLFxuICBsb2dvVXJsLFxuICBtb2RlID0gJ2VtYmVkZGVkJyxcbiAgb25FeGl0RnVsbHNjcmVlbixcbiAgZmxvYXRpbmdDb25maWcgPSB7fSxcbiAgbGFuZ3VhZ2UsXG4gIHRyYW5zbGF0aW9uczogY3VzdG9tVHJhbnNsYXRpb25zLFxuICByZUNhcHRjaGFLZXksXG4gIHdpZGdldCA9IGZhbHNlLFxuICB1c2VBdWRpbyA9IGZhbHNlLFxuICB1c2VGaWxlID0gZmFsc2UsXG4gIG5vQ29sb3JBbmltYXRpb24gPSBmYWxzZSxcbiAgc2hvd1dlbGNvbWVCZWZvcmVTdGFydCA9IHRydWUsXG4gIGFsbG93ZWRFeHRlbnNpb25zID0gW10sXG4gIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgZm9ybURpc3BsYXkgPSAnZm9vdGVyJyxcbiAgb25Db25maWdMb2FkZWQsXG59KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgLy8gTGFuZ3VhZ2Ugc2VsZWN0aW9uIHN0YXRlICh3aXRoIGxvY2FsU3RvcmFnZSBwZXJzaXN0ZW5jZSlcbiAgY29uc3QgW3NlbGVjdGVkTGFuZ3VhZ2UsIHNldFNlbGVjdGVkTGFuZ3VhZ2VdID0gdXNlU3RhdGU8c3RyaW5nPigoKSA9PiB7XG4gICAgaWYgKGxhbmd1YWdlKSByZXR1cm4gbGFuZ3VhZ2U7XG4gICAgY29uc3Qgc3RvcmVkID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZ2VuYXNzaXN0X2xhbmd1YWdlJykgOiBudWxsO1xuICAgIGlmIChzdG9yZWQpIHJldHVybiBzdG9yZWQ7XG4gICAgcmV0dXJuIHJlc29sdmVMYW5ndWFnZSgpO1xuICB9KTtcblxuICAvLyBTYXZlIGxhbmd1YWdlIHRvIGxvY2FsU3RvcmFnZSB3aGVuIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgIWxhbmd1YWdlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZ2VuYXNzaXN0X2xhbmd1YWdlJywgc2VsZWN0ZWRMYW5ndWFnZSk7XG4gICAgfVxuICB9LCBbc2VsZWN0ZWRMYW5ndWFnZSwgbGFuZ3VhZ2VdKTtcblxuICAvLyBTdGF0ZSBmb3IgdHJhY2tpbmcgc2VsZWN0ZWQgRkFRIHF1ZXJ5XG4gIGNvbnN0IFtzZWxlY3RlZEZhcVF1ZXJ5LCBzZXRTZWxlY3RlZEZhcVF1ZXJ5XSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFJlc29sdmUgbGFuZ3VhZ2U6IHByb3AgPiBzZWxlY3RlZCA+IGJyb3dzZXIgPiAnZW4nXG4gIGNvbnN0IHJlc29sdmVkTGFuZ3VhZ2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAobGFuZ3VhZ2UpIHJldHVybiBsYW5ndWFnZTtcbiAgICByZXR1cm4gc2VsZWN0ZWRMYW5ndWFnZSB8fCByZXNvbHZlTGFuZ3VhZ2UoKSB8fCAnZW4nO1xuICB9LCBbbGFuZ3VhZ2UsIHNlbGVjdGVkTGFuZ3VhZ2VdKTtcblxuICAvLyBNZXJnZSBsYW5ndWFnZSBhbmQgRkFRIHF1ZXJ5IGludG8gbWV0YWRhdGFcbiAgY29uc3QgbWV0YWRhdGFXaXRoTGFuZ3VhZ2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKG1ldGFkYXRhIHx8IHt9KSxcbiAgICAgIGxhbmd1YWdlOiByZXNvbHZlZExhbmd1YWdlLFxuICAgICAgLi4uKHNlbGVjdGVkRmFxUXVlcnkgPyB7IGZhcV9xdWVyeTogc2VsZWN0ZWRGYXFRdWVyeSB9IDoge30pLFxuICAgIH07XG4gIH0sIFttZXRhZGF0YSwgcmVzb2x2ZWRMYW5ndWFnZSwgc2VsZWN0ZWRGYXFRdWVyeV0pO1xuXG4gIC8vIEdldCB0cmFuc2xhdGlvbnMgYmFzZWQgb24gcmVzb2x2ZWQgbGFuZ3VhZ2UsIHRoZW4gbWVyZ2Ugd2l0aCBjdXN0b20gdHJhbnNsYXRpb25zXG4gIGNvbnN0IHRyYW5zbGF0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGJhc2VUcmFuc2xhdGlvbnMgPSBnZXRUcmFuc2xhdGlvbnNGb3JMYW5ndWFnZShyZXNvbHZlZExhbmd1YWdlKTtcbiAgICByZXR1cm4gbWVyZ2VUcmFuc2xhdGlvbnMoY3VzdG9tVHJhbnNsYXRpb25zLCBiYXNlVHJhbnNsYXRpb25zKTtcbiAgfSwgW3Jlc29sdmVkTGFuZ3VhZ2UsIGN1c3RvbVRyYW5zbGF0aW9uc10pO1xuXG4gIGNvbnN0IHQgPSAoa2V5OiBzdHJpbmcsIGZhbGxiYWNrPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gZ2V0VHJhbnNsYXRpb25TdHJpbmcoa2V5LCB0cmFuc2xhdGlvbnMsIGZhbGxiYWNrKTtcbiAgfTtcblxuICBjb25zdCBpbnB1dFBsYWNlaG9sZGVyID0gdXNlTWVtbygoKSA9PiBwbGFjZWhvbGRlciB8fCB0KCdpbnB1dC5wbGFjZWhvbGRlcicsICdBc2sgYSBxdWVzdGlvbicpLCBbcGxhY2Vob2xkZXIsIHRyYW5zbGF0aW9uc10pO1xuICBjb25zdCBbaW5wdXRWYWx1ZSwgc2V0SW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtzaG93UmVzZXRDb25maXJtLCBzZXRTaG93UmVzZXRDb25maXJtXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3Nob3dNZW51LCBzZXRTaG93TWVudV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzaG93TGFuZ3VhZ2VEcm9wZG93biwgc2V0U2hvd0xhbmd1YWdlRHJvcGRvd25dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXNQbGF5aW5nQXVkaW8sIHNldElzUGxheWluZ0F1ZGlvXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2lzRmxvYXRpbmdPcGVuLCBzZXRJc0Zsb2F0aW5nT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzdWJtaXR0ZWRGb3Jtcywgc2V0U3VibWl0dGVkRm9ybXNdID0gdXNlU3RhdGU8U2V0PG51bWJlcj4+KG5ldyBTZXQoKSk7XG4gIGNvbnN0IFtzdWJtaXR0aW5nRm9ybUluZGV4LCBzZXRTdWJtaXR0aW5nRm9ybUluZGV4XSA9IHVzZVN0YXRlPG51bWJlciB8IG51bGw+KG51bGwpO1xuICBjb25zdCBtZW51UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgdGV4dEFyZWFSZWYgPSB1c2VSZWY8SFRNTFRleHRBcmVhRWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IGhlYWRlclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IFtoZWFkZXJIZWlnaHQsIHNldEhlYWRlckhlaWdodF0gPSB1c2VTdGF0ZSg1Nik7XG4gIGNvbnN0IFtzaG93QmFja2xpZ2h0LCBzZXRTaG93QmFja2xpZ2h0XSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCB7XG4gICAgbWVzc2FnZXMsXG4gICAgaXNMb2FkaW5nLFxuICAgIHNlbmRNZXNzYWdlLFxuICAgIHNlbmRBdWRpb01lc3NhZ2UsXG4gICAgdXBsb2FkRmlsZSxcbiAgICByZXNldENvbnZlcnNhdGlvbixcbiAgICBzdGFydENvbnZlcnNhdGlvbixcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBndWVzdFRva2VuLFxuICAgIHBvc3NpYmxlUXVlcmllcyxcbiAgICBpc0ZpbmFsaXplZCxcbiAgICBpc0FnZW50VHlwaW5nLFxuICAgIGFkZEZlZWRiYWNrLFxuICAgIGF2YWlsYWJsZUxhbmd1YWdlczogYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgYWdlbnRJZCxcbiAgICBhZ2VudExpdmVWb2ljZUVuYWJsZWQsXG4gICAgYWdlbnRMaXZlVm9pY2VSZWFkeSxcbiAgICB3ZWxjb21lVGl0bGUsXG4gICAgd2VsY29tZUltYWdlVXJsLFxuICAgIHdlbGNvbWVNZXNzYWdlLFxuICAgIGlucHV0RGlzY2xhaW1lckh0bWwsXG4gICAgdGhpbmtpbmdQaHJhc2VzLFxuICAgIHRoaW5raW5nRGVsYXlNcyxcbiAgfSA9IHVzZUNoYXQoe1xuICAgIGJhc2VVcmwsXG4gICAgd2Vic29ja2V0VXJsLFxuICAgIGFwaUtleSxcbiAgICB0ZW5hbnQsXG4gICAgbWV0YWRhdGE6IG1ldGFkYXRhV2l0aExhbmd1YWdlLFxuICAgIHVzZVdzLFxuICAgIHVzZVBvbGwsXG4gICAgbGFuZ3VhZ2U6IHJlc29sdmVkTGFuZ3VhZ2UsXG4gICAgb25FcnJvcixcbiAgICBvblRha2VvdmVyLFxuICAgIG9uRmluYWxpemUsXG4gICAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICBvbkNvbmZpZ0xvYWRlZCxcbiAgfSk7XG5cbiAgY29uc3QgeyBjdXJyZW50VGhpbmtpbmdQYXJ0cywgY3VycmVudFRoaW5raW5nUGFydEluZGV4IH0gPSB1c2VUaGlua2luZ0FuaW1hdGlvbih7XG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICAgIHRyYW5zbGF0aW9ucyxcbiAgfSk7XG5cbiAgY29uc3QgeyBtZXNzYWdlc0VuZFJlZiwgY2hhdENvbnRhaW5lclJlZiB9ID0gdXNlU2Nyb2xsTWFuYWdlbWVudCh7XG4gICAgbWVzc2FnZXMsXG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICBjdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXgsXG4gICAgY3VycmVudFRoaW5raW5nUGFydHNMZW5ndGg6IGN1cnJlbnRUaGlua2luZ1BhcnRzLmxlbmd0aCxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBpc0Zsb2F0aW5nT3BlbixcbiAgICBtb2RlLFxuICB9KTtcblxuICBjb25zdCB7XG4gICAgd2luZG93V2lkdGgsXG4gICAgd2luZG93SGVpZ2h0LFxuICAgIGlzRnVsbHNjcmVlbixcbiAgICBoYW5kbGVGdWxsc2NyZWVuVG9nZ2xlLFxuICB9ID0gdXNlVmlld3BvcnRNYW5hZ2VyKHtcbiAgICBtb2RlLFxuICAgIHdpZGdldCxcbiAgICBpc0Zsb2F0aW5nT3BlbixcbiAgICBzaG93UmVzZXRDb25maXJtLFxuICAgIHNob3dMYW5ndWFnZURyb3Bkb3duLFxuICAgIHNob3dNZW51LFxuICAgIG9uRXhpdEZ1bGxzY3JlZW4sXG4gICAgc2V0U2hvd1Jlc2V0Q29uZmlybSxcbiAgICBzZXRTaG93TGFuZ3VhZ2VEcm9wZG93bixcbiAgICBzZXRTaG93TWVudSxcbiAgfSk7XG5cbiAgY29uc3Qge1xuICAgIGF0dGFjaG1lbnRzLFxuICAgIHNldEF0dGFjaG1lbnRzLFxuICAgIHVwbG9hZGluZ0ZpbGVzLFxuICAgIGZpbGVFcnJvclRvYXN0LFxuICAgIGZpbGVJbnB1dFJlZixcbiAgICBoYW5kbGVGaWxlQ2hhbmdlLFxuICAgIGhhbmRsZVJlbW92ZUF0dGFjaG1lbnQsXG4gICAgY2xlYXJBdHRhY2htZW50cyxcbiAgfSA9IHVzZUZpbGVBdHRhY2htZW50cyh7IHVwbG9hZEZpbGUsIHQgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobGFuZ3VhZ2UpIHJldHVybjtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMpIHx8IGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkID0gYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nKSA9PiBsYW5nLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmICghbm9ybWFsaXplZC5pbmNsdWRlcyhzZWxlY3RlZExhbmd1YWdlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICBzZXRTZWxlY3RlZExhbmd1YWdlKG5vcm1hbGl6ZWRbMF0pO1xuICAgIH1cbiAgfSwgW2FnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLCBsYW5ndWFnZSwgc2VsZWN0ZWRMYW5ndWFnZV0pO1xuXG4gIGNvbnN0IGF1ZGlvU2VydmljZSA9IHVzZVJlZjxBdWRpb1NlcnZpY2UgfCBudWxsPihudWxsKTtcbiAgY29uc3QgcmVDYXB0Y2hhVG9rZW5SZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIGNvbnN0IGhhc1VzZXJNZXNzYWdlcyA9IG1lc3NhZ2VzLnNvbWUobWVzc2FnZSA9PiBtZXNzYWdlLnNwZWFrZXIgPT09ICdjdXN0b21lcicpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXVkaW9TZXJ2aWNlLmN1cnJlbnQgPSBuZXcgQXVkaW9TZXJ2aWNlKHsgYmFzZVVybCwgd2Vic29ja2V0VXJsLCBhcGlLZXkgfSk7XG4gIH0sIFtiYXNlVXJsLCB3ZWJzb2NrZXRVcmwsIGFwaUtleV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXVkaW9TZXJ2aWNlLmN1cnJlbnQ/LnNldEd1ZXN0VG9rZW4oZ3Vlc3RUb2tlbiA/PyBudWxsKTtcbiAgfSwgW2d1ZXN0VG9rZW5dKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChtb2RlID09PSAnZnVsbHNjcmVlbicgJiYgIWlzRmxvYXRpbmdPcGVuKSB7XG4gICAgICBzZXRJc0Zsb2F0aW5nT3Blbih0cnVlKTtcbiAgICB9XG4gIH0sIFttb2RlLCBpc0Zsb2F0aW5nT3Blbl0pO1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlSGVhZGVySGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgc2V0SGVhZGVySGVpZ2h0KGhlYWRlclJlZi5jdXJyZW50Py5vZmZzZXRIZWlnaHQgfHwgNTYpO1xuICAgIH07XG4gICAgdXBkYXRlSGVhZGVySGVpZ2h0KCk7XG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdXBkYXRlSGVhZGVySGVpZ2h0KCkpO1xuICAgIGlmIChoZWFkZXJSZWYuY3VycmVudCkge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShoZWFkZXJSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGVIZWFkZXJIZWlnaHQpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlSGVhZGVySGVpZ2h0KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNBZ2VudFR5cGluZykge1xuICAgICAgc2V0U2hvd0JhY2tsaWdodCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHNldFNob3dCYWNrbGlnaHQoZmFsc2UpLCA0MjApO1xuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9LCBbaXNBZ2VudFR5cGluZ10pO1xuXG4gIGNvbnN0IHN1Ym1pdE1lc3NhZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlucHV0VmFsdWUudHJpbSgpID09PSAnJyAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBpZiAoaXNBZ2VudFR5cGluZykgcmV0dXJuO1xuICAgIGNvbnN0IHRleHRUb1NlbmQgPSBpbnB1dFZhbHVlO1xuICAgIGNvbnN0IGZpbGVzVG9VcGxvYWQgPSBhdHRhY2htZW50cy5tYXAoYSA9PiBhLmZpbGUpO1xuXG4gICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgc2V0QXR0YWNobWVudHMoW10pO1xuICAgIGlmIChmaWxlSW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgZmlsZUlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXh0cmFNZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgICBpZiAoc2VsZWN0ZWRGYXFRdWVyeSkge1xuICAgICAgICBleHRyYU1ldGFkYXRhLmZhcV9xdWVyeSA9IHNlbGVjdGVkRmFxUXVlcnk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWxlc1RvVXBsb2FkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXh0cmFNZXRhZGF0YS5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzLm1hcChhID0+IGEuYXR0YWNobWVudCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKHRleHRUb1NlbmQsIGZpbGVzVG9VcGxvYWQsIGV4dHJhTWV0YWRhdGEsIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0ZXh0QXJlYVJlZi5jdXJyZW50Py5mb2N1cygpLCAwKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gYXN5bmMgKGU6IFJlYWN0LkZvcm1FdmVudCkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBhd2FpdCBzdWJtaXRNZXNzYWdlKCk7XG4gIH07XG5cbiAgY29uc3QgZ2V0Rm9ybU5vZGVJZCA9IChtZXNzYWdlSW5kZXg6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgbXNnID0gbWVzc2FnZXNbbWVzc2FnZUluZGV4XTtcbiAgICBpZiAobXNnPy50eXBlID09PSAnZm9ybV9yZXF1ZXN0JyAmJiBtc2cudGV4dCkge1xuICAgICAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UobXNnLnRleHQpLm5vZGVfaWQ7IH0gY2F0Y2ggeyAvKiBza2lwICovIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVGb3JtU3VibWl0ID0gYXN5bmMgKGZvcm1EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbWVzc2FnZUluZGV4OiBudW1iZXIpID0+IHtcbiAgICBpZiAoc3VibWl0dGluZ0Zvcm1JbmRleCAhPT0gbnVsbCB8fCBpc0FnZW50VHlwaW5nKSByZXR1cm47XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChtZXNzYWdlSW5kZXgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdW1tYXJ5VGV4dCA9IE9iamVjdC5lbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06ICR7dmFsdWV9YClcbiAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBub2RlSWQgPSBnZXRGb3JtTm9kZUlkKG1lc3NhZ2VJbmRleCk7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZShzdW1tYXJ5VGV4dCwgW10sIHtcbiAgICAgICAgaHVtYW5faW5fdGhlX2xvb3BfZnJvbV9mb3JtOiBmb3JtRGF0YSxcbiAgICAgICAgLi4uKG5vZGVJZCAmJiB7IGh1bWFuX2luX3RoZV9sb29wX25vZGVfaWQ6IG5vZGVJZCB9KSxcbiAgICAgIH0sIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgICAgc2V0U3VibWl0dGVkRm9ybXMoKHByZXYpID0+IG5ldyBTZXQocHJldikuYWRkKG1lc3NhZ2VJbmRleCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRm9ybUNhbmNlbCA9IGFzeW5jIChtZXNzYWdlSW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGlmIChzdWJtaXR0aW5nRm9ybUluZGV4ICE9PSBudWxsIHx8IGlzQWdlbnRUeXBpbmcpIHJldHVybjtcbiAgICBzZXRTdWJtaXR0aW5nRm9ybUluZGV4KG1lc3NhZ2VJbmRleCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vZGVJZCA9IGdldEZvcm1Ob2RlSWQobWVzc2FnZUluZGV4KTtcbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKCdTa2lwcGVkJywgW10sIHtcbiAgICAgICAgaHVtYW5faW5fdGhlX2xvb3BfZnJvbV9mb3JtOiB7fSxcbiAgICAgICAgaHVtYW5faW5fdGhlX2xvb3BfY2FuY2VsbGVkOiB0cnVlLFxuICAgICAgICAuLi4obm9kZUlkICYmIHsgaHVtYW5faW5fdGhlX2xvb3Bfbm9kZV9pZDogbm9kZUlkIH0pLFxuICAgICAgfSwgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgICBzZXRTdWJtaXR0ZWRGb3JtcygocHJldikgPT4gbmV3IFNldChwcmV2KS5hZGQobWVzc2FnZUluZGV4KSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTdWJtaXR0aW5nRm9ybUluZGV4KG51bGwpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVRdWlja0FjdGlvbiA9IGFzeW5jICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIXRleHQudHJpbSgpKSByZXR1cm47XG4gICAgaWYgKGlzQWdlbnRUeXBpbmcpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXh0cmFNZXRhZGF0YSA9IHNlbGVjdGVkRmFxUXVlcnkgPyB7IGZhcV9xdWVyeTogc2VsZWN0ZWRGYXFRdWVyeSB9IDogdW5kZWZpbmVkO1xuICAgICAgYXdhaXQgc2VuZE1lc3NhZ2UodGV4dCwgW10sIGV4dHJhTWV0YWRhdGEsIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmUgcXVpY2sgYWN0aW9uIGVycm9ycyB0byBhdm9pZCBpbnRlcnJ1cHRpbmcgdGhlIGZsb3dcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2NoZWR1bGVDb25maXJtID0gYXN5bmMgKHNjaGVkdWxlOiBTY2hlZHVsZUl0ZW0pID0+IHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYFNjaGVkdWxlIGNvbmZpcm1lZCB3aXRoICR7c2NoZWR1bGUucmVzdGF1cmFudHMubGVuZ3RofSByZXN0YXVyYW50c2A7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKHN1bW1hcnksIFtdLCB7IGNvbmZpcm1TY2hlZHVsZTogSlNPTi5zdHJpbmdpZnkoc2NoZWR1bGUpIH0sIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH07XG5cbiAgLy8gTmV1dHJhbCwgdXNlci1mYWNpbmcgbm90aWNlIHNob3duIHdoZW4gYSBsaXZlIGNhbGwgY2FuJ3Qgc3RhcnQgLyBmYWlscy4gVGhlXG4gIC8vIG1lc3NhZ2UgaXMgYWxyZWFkeSBuZXV0cmFsICh0aGUgYmFja2VuZCBuZXZlciBzZW5kcyBpbnRlcm5hbCBjb25maWcgZGV0YWlsKSwgc29cbiAgLy8gaXQncyBzYWZlIGZvciBwdWJsaWMgd2lkZ2V0cyDigJQgaXQganVzdCBhdm9pZHMgYSBjb25mdXNpbmcgc2lsZW50IGNsb3NlLlxuICBjb25zdCBbbGl2ZVZvaWNlTm90aWNlLCBzZXRMaXZlVm9pY2VOb3RpY2VdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgaGFuZGxlVm9pY2VFcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBzZXRMaXZlVm9pY2VOb3RpY2UoZXJyb3IubWVzc2FnZSB8fCAnVm9pY2UgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlJyk7XG4gICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgIG9uRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICAvLyBWb2ljZS1vbmx5IG1vZGUgaXMgZHJpdmVuIHB1cmVseSBieSB0aGUgYWdlbnQ6IGl0J3Mgb24gd2hlbiB0aGUgYWdlbnQnc1xuICAvLyB3b3JrZmxvdyBjb250YWlucyBhIFZvaWNlIEFnZW50IG5vZGUgKGF1dG8tZGV0ZWN0ZWQgYnkgdGhlIGJhY2tlbmQgYW5kXG4gIC8vIHN1cmZhY2VkIHRocm91Z2ggYGFnZW50TGl2ZVZvaWNlRW5hYmxlZGApLiBObyBpbnRlZ3JhdG9yIHByb3AgaXMgaW52b2x2ZWQuXG4gIGNvbnN0IGxpdmVWb2ljZUVuYWJsZWQgPSBhZ2VudExpdmVWb2ljZUVuYWJsZWQ7XG4gIC8vIFdoZXRoZXIgbGl2ZSB2b2ljZSBjYW4gYWN0dWFsbHkgcnVuIChhIEdlbWluaSBwcm92aWRlciB3aXRoIGEga2V5IGlzIGNvbmZpZ3VyZWQpLlxuICAvLyBXaGVuIGZhbHNlIHdlIGtlZXAgdm9pY2Utb25seSBtb2RlIGJ1dCBkaXNhYmxlIHRoZSBjYWxsIGNvbnRyb2wgd2l0aCBhIG5ldXRyYWxcbiAgLy8gbWVzc2FnZSDigJQgdGhlIHNwZWNpZmljIHJlYXNvbiBzdGF5cyBzZXJ2ZXItc2lkZSwgbmV2ZXIgc2hvd24gdG8gcHVibGljIHVzZXJzLlxuICBjb25zdCBsaXZlVm9pY2VSZWFkeSA9IGFnZW50TGl2ZVZvaWNlUmVhZHk7XG5cbiAgLy8gTGl2ZSAoY29udGludW91cykgdm9pY2UgY29udmVyc2F0aW9uIGFnYWluc3QgdGhlIGFnZW50J3MgVm9pY2UgQWdlbnQgbm9kZS5cbiAgLy8gYGxpdmVDYXB0aW9uYCBpcyB0aGUgaW4tcHJvZ3Jlc3MgdHVybiAoc3RyZWFtcyBhcyB5b3Ugc3BlYWspOyBgbGl2ZVR1cm5zYCBhcmVcbiAgLy8gY29tcGxldGVkIHR1cm5zIGtlcHQgbG9jYWxseSBzbyB0aGV5IHN0YXkgb24gc2NyZWVuIGFjcm9zcyB0dXJucy4gYGNyZWF0ZVRpbWVgXG4gIC8vIGlzIGNhcHR1cmVkIG9uY2UgcGVyIHR1cm4gc28gdGhlIGJ1YmJsZSB0aW1lc3RhbXAgZG9lc24ndCBqaXR0ZXIgb24gcmUtcmVuZGVyLlxuICBjb25zdCBbbGl2ZUNhcHRpb24sIHNldExpdmVDYXB0aW9uXSA9IHVzZVN0YXRlPExpdmVUdXJuPih7IHVzZXI6ICcnLCBhZ2VudDogJycsIGNyZWF0ZVRpbWU6IDAgfSk7XG4gIGNvbnN0IFtsaXZlVHVybnMsIHNldExpdmVUdXJuc10gPSB1c2VTdGF0ZTxMaXZlVHVybltdPihbXSk7XG4gIGNvbnN0IGxpdmVWb2ljZSA9IHVzZUxpdmVWb2ljZVNlc3Npb24oe1xuICAgIGJhc2VVcmwsXG4gICAgYXBpS2V5LFxuICAgIGd1ZXN0VG9rZW4sXG4gICAgdGVuYW50LFxuICAgIGFnZW50SWQsXG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgbGFuZ3VhZ2U6IHJlc29sdmVkTGFuZ3VhZ2UsXG4gICAgb25FcnJvcjogaGFuZGxlVm9pY2VFcnJvcixcbiAgICBvbklucHV0VHJhbnNjcmlwdDogKHRleHQpID0+XG4gICAgICBzZXRMaXZlQ2FwdGlvbigoYykgPT4gKHsgLi4uYywgdXNlcjogYy51c2VyICsgdGV4dCwgY3JlYXRlVGltZTogYy5jcmVhdGVUaW1lIHx8IG5vd1NlYygpIH0pKSxcbiAgICBvbk91dHB1dFRyYW5zY3JpcHQ6ICh0ZXh0KSA9PlxuICAgICAgc2V0TGl2ZUNhcHRpb24oKGMpID0+ICh7IC4uLmMsIGFnZW50OiBjLmFnZW50ICsgdGV4dCwgY3JlYXRlVGltZTogYy5jcmVhdGVUaW1lIHx8IG5vd1NlYygpIH0pKSxcbiAgICBvblR1cm5Db21wbGV0ZTogKHR1cm4pID0+IHtcbiAgICAgIC8vIENvbW1pdCB0aGUgZmluaXNoZWQgdHVybiBzbyBpdCBzdGF5cyB2aXNpYmxlOyBjbGVhciB0aGUgaW4tcHJvZ3Jlc3MgY2FwdGlvbi5cbiAgICAgIHNldExpdmVUdXJucygocHJldikgPT4gWy4uLnByZXYsIHsgdXNlcjogdHVybi50cmFuc2NyaXB0LCBhZ2VudDogdHVybi5yZXNwb25zZSwgY3JlYXRlVGltZTogbm93U2VjKCkgfV0pO1xuICAgICAgc2V0TGl2ZUNhcHRpb24oeyB1c2VyOiAnJywgYWdlbnQ6ICcnLCBjcmVhdGVUaW1lOiAwIH0pO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8vIEZ1bGwgY29udmVyc2F0aW9uIHJlc2V0OiBuZXcgdGhyZWFkICsgY2xlYXJlZCBpbnB1dC9hdHRhY2htZW50cy9mb3JtcyBhbmQgYW55XG4gIC8vIGxpdmUtdm9pY2UgdHJhbnNjcmlwdC4gU2hhcmVkIGJ5IHRoZSByZXNldC1jb25maXJtIGRpYWxvZyBhbmQgdGhlIGVuZC1jYWxsIGJ1dHRvbi5cbiAgY29uc3QgcGVyZm9ybVJlc2V0ID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIGNsZWFyQXR0YWNobWVudHMoKTtcbiAgICBhd2FpdCByZXNldENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICBzZXRTZWxlY3RlZEZhcVF1ZXJ5KG51bGwpO1xuICAgIHNldFN1Ym1pdHRlZEZvcm1zKG5ldyBTZXQoKSk7XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgICBzZXRMaXZlVHVybnMoW10pO1xuICB9LCBbY2xlYXJBdHRhY2htZW50cywgcmVzZXRDb252ZXJzYXRpb25dKTtcblxuICAvLyBTdGFydGluZyBhIGZyZXNoIGNhbGwgY2xlYXJzIHRoZSBwcmV2aW91cyBjYWxsJ3MgdHJhbnNjcmlwdCBidWJibGVzICsgY2FwdGlvbi5cbiAgY29uc3Qgc3RhcnRMaXZlQ2FsbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRMaXZlVm9pY2VOb3RpY2UobnVsbCk7XG4gICAgc2V0TGl2ZUNhcHRpb24oeyB1c2VyOiAnJywgYWdlbnQ6ICcnLCBjcmVhdGVUaW1lOiAwIH0pO1xuICAgIHNldExpdmVUdXJucyhbXSk7XG4gICAgbGl2ZVZvaWNlLnN0YXJ0KCk7XG4gIH0sIFtsaXZlVm9pY2VdKTtcbiAgLy8gRW5kaW5nIGEgY2FsbCBzdG9wcyB0aGUgYXVkaW8gc3RyZWFtIGFuZCByZXNldHMgdGhlIGNvbnZlcnNhdGlvbiDigJQgc2FtZSBhcyB0aGVcbiAgLy8gXCJyZXNldCBjb252ZXJzYXRpb25cIiBhY3Rpb24g4oCUIHNvIHRoZSBuZXh0IGNhbGwgc3RhcnRzIGZyb20gYSBjbGVhbiB0aHJlYWQuXG4gIGNvbnN0IGVuZExpdmVDYWxsID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGxpdmVWb2ljZS5zdG9wKCk7XG4gICAgc2V0TGl2ZUNhcHRpb24oeyB1c2VyOiAnJywgYWdlbnQ6ICcnLCBjcmVhdGVUaW1lOiAwIH0pO1xuICAgIHZvaWQgcGVyZm9ybVJlc2V0KCk7XG4gIH0sIFtsaXZlVm9pY2UsIHBlcmZvcm1SZXNldF0pO1xuXG4gIC8vIEtlZXAgdGhlIGxpdmUgdHJhbnNjcmlwdCBpbiB2aWV3IGFzIGl0IGdyb3dzICh0aGUgc2Nyb2xsIG1hbmFnZXIgb25seSByZWFjdHNcbiAgLy8gdG8gY29tbWl0dGVkIGNoYXQgbWVzc2FnZXMsIG5vdCB0aGVzZSBsb2NhbCBsaXZlIGJ1YmJsZXMpLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghbGl2ZVZvaWNlLmlzQWN0aXZlKSByZXR1cm47XG4gICAgY29uc3QgZWwgPSBjaGF0Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKGVsKSBlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHQ7XG4gIH0sIFtsaXZlQ2FwdGlvbiwgbGl2ZVR1cm5zLCBsaXZlVm9pY2UuaXNBY3RpdmUsIGNoYXRDb250YWluZXJSZWZdKTtcblxuICAvLyBSZW5kZXIgYSBzaW5nbGUgbGl2ZS12b2ljZSBidWJibGUgKGNvbW1pdHRlZCB0dXJuIG9yIHN0cmVhbWluZyBjYXB0aW9uKSBhcyBhblxuICAvLyBvcmRpbmFyeSBjaGF0IG1lc3NhZ2UsIHNvIGl0IGxvb2tzIGlkZW50aWNhbCB0byB0ZXh0LW1vZGUgYnViYmxlcy5cbiAgY29uc3QgcmVuZGVyTGl2ZUJ1YmJsZSA9IChcbiAgICBzcGVha2VyOiAnY3VzdG9tZXInIHwgJ2FnZW50JyxcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgY3JlYXRlVGltZTogbnVtYmVyLFxuICAgIGtleT86IHN0cmluZyxcbiAgKSA9PiAoXG4gICAgPENoYXRNZXNzYWdlQ29tcG9uZW50XG4gICAgICBrZXk9e2tleX1cbiAgICAgIG1lc3NhZ2U9e3sgY3JlYXRlX3RpbWU6IGNyZWF0ZVRpbWUsIHN0YXJ0X3RpbWU6IDAsIGVuZF90aW1lOiAwLjAxLCBzcGVha2VyLCB0ZXh0IH19XG4gICAgICB0aGVtZT17dGhlbWV9XG4gICAgICBlbmFibGVUeXBld3JpdGVyPXtmYWxzZX1cbiAgICAgIHRyYW5zbGF0aW9ucz17dHJhbnNsYXRpb25zfVxuICAgICAgbGFuZ3VhZ2U9e3Jlc29sdmVkTGFuZ3VhZ2V9XG4gICAgICBhZ2VudE5hbWU9e2FnZW50TmFtZX1cbiAgICAvPlxuICApO1xuXG4gIGNvbnN0IHBsYXlSZXNwb25zZUF1ZGlvID0gYXN5bmMgKHRleHQ6IHN0cmluZykgPT4ge1xuICAgIGlmICghYXVkaW9TZXJ2aWNlLmN1cnJlbnQgfHwgaXNQbGF5aW5nQXVkaW8pIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBzZXRJc1BsYXlpbmdBdWRpbyh0cnVlKTtcbiAgICAgIGNvbnN0IGF1ZGlvQmxvYiA9IGF3YWl0IGF1ZGlvU2VydmljZS5jdXJyZW50LnRleHRUb1NwZWVjaCh0ZXh0KTtcbiAgICAgIGF3YWl0IGF1ZGlvU2VydmljZS5jdXJyZW50LnBsYXlBdWRpbyhhdWRpb0Jsb2IpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAob25FcnJvcikge1xuICAgICAgICBvbkVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNQbGF5aW5nQXVkaW8oZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBhdWRpb1VybEJ1aWxkZXIgPSB1c2VDYWxsYmFjaygobWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gYCR7YmFzZVVybH0vYXBpL2NvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9L2F1ZGlvYDtcbiAgfSwgW2Jhc2VVcmwsIGNvbnZlcnNhdGlvbklkXSk7XG5cbiAgY29uc3QgYXVkaW9IZWFkZXJzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgaDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGlmIChndWVzdFRva2VuKSB7XG4gICAgICBoWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7Z3Vlc3RUb2tlbn1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBoWyd4LWFwaS1rZXknXSA9IGFwaUtleTtcbiAgICB9XG4gICAgaWYgKHRlbmFudCkgaFsneC10ZW5hbnQtaWQnXSA9IHRlbmFudDtcbiAgICByZXR1cm4gaDtcbiAgfSwgW2FwaUtleSwgdGVuYW50LCBndWVzdFRva2VuXSk7XG5cbiAgY29uc3QgW2F1dG9QbGF5QXVkaW9NZXNzYWdlSWQsIHNldEF1dG9QbGF5QXVkaW9NZXNzYWdlSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHByZXZNZXNzYWdlQ291bnRSZWYgPSB1c2VSZWY8bnVtYmVyPigwKTtcbiAgY29uc3QgaW5pdGlhbExvYWREb25lUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXVzZUF1ZGlvIHx8ICFtZXNzYWdlcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBwcmV2Q291bnQgPSBwcmV2TWVzc2FnZUNvdW50UmVmLmN1cnJlbnQ7XG4gICAgcHJldk1lc3NhZ2VDb3VudFJlZi5jdXJyZW50ID0gbWVzc2FnZXMubGVuZ3RoO1xuICAgIGlmICghaW5pdGlhbExvYWREb25lUmVmLmN1cnJlbnQpIHtcbiAgICAgIGluaXRpYWxMb2FkRG9uZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA8PSBwcmV2Q291bnQpIHJldHVybjtcbiAgICBjb25zdCBsYXN0ID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGxhc3Quc3BlYWtlciA9PT0gJ2FnZW50JyAmJiBsYXN0LnR5cGUgPT09ICdhdWRpbycgJiYgbGFzdC5tZXNzYWdlX2lkKSB7XG4gICAgICBzZXRBdXRvUGxheUF1ZGlvTWVzc2FnZUlkKGxhc3QubWVzc2FnZV9pZCk7XG4gICAgfVxuICB9LCBbbWVzc2FnZXMsIHVzZUF1ZGlvXSk7XG5cbiAgY29uc3QgaGFuZGxlUXVlcnlDbGljayA9IGFzeW5jIChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKGlzQWdlbnRUeXBpbmcgfHwgaXNMb2FkaW5nKSByZXR1cm47XG5cbiAgICBzZXRTZWxlY3RlZEZhcVF1ZXJ5KHF1ZXJ5KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZShxdWVyeSwgW10sIHsgZmFxX3F1ZXJ5OiBxdWVyeSB9LCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVN0YXJ0Q29udmVyc2F0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc0xvYWRpbmcpIHJldHVybjtcblxuICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIGNsZWFyQXR0YWNobWVudHMoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdGFydENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgY29udmVyc2F0aW9uJywgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVNZW51Q2xpY2sgPSAoKSA9PiB7XG4gICAgc2V0U2hvd01lbnUocHJldiA9PiAhcHJldik7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUmVzZXRDbGljayA9ICgpID0+IHtcbiAgICBzZXRTaG93TWVudShmYWxzZSk7XG4gICAgc2V0U2hvd1Jlc2V0Q29uZmlybSh0cnVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb25maXJtUmVzZXQgPSAoKSA9PiB7XG4gICAgc2V0U2hvd1Jlc2V0Q29uZmlybShmYWxzZSk7XG4gICAgLy8gZW5kTGl2ZUNhbGwgc3RvcHMgYW55IGFjdGl2ZSBjYWxsIGFuZCBydW5zIHRoZSBmdWxsIHJlc2V0OyBoYXJtbGVzcyBpZiBub1xuICAgIC8vIGNhbGwgaXMgYWN0aXZlLCBzbyBib3RoIGVudHJ5IHBvaW50cyBzaGFyZSBvbmUgY29kZSBwYXRoLlxuICAgIGVuZExpdmVDYWxsKCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlQ2FuY2VsUmVzZXQgPSAoKSA9PiB7XG4gICAgc2V0U2hvd1Jlc2V0Q29uZmlybShmYWxzZSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlTGFuZ3VhZ2VDaGFuZ2UgPSAobGFuZzogc3RyaW5nKSA9PiB7XG4gICAgc2V0U2VsZWN0ZWRMYW5ndWFnZShsYW5nKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVSZUNhcHRjaGFWZXJpZnkgPSB1c2VDYWxsYmFjaygodG9rZW46IHN0cmluZykgPT4ge1xuICAgIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQgPSB0b2tlbjtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGFsbExhbmd1YWdlcyA9IFtcbiAgICB7IGNvZGU6ICdlbicsIG5hbWU6ICdFbmdsaXNoJyB9LFxuICAgIHsgY29kZTogJ2VzJywgbmFtZTogJ0VzcGHDsW9sJyB9LFxuICAgIHsgY29kZTogJ2ZyJywgbmFtZTogJ0ZyYW7Dp2FpcycgfSxcbiAgICB7IGNvZGU6ICdkZScsIG5hbWU6ICdEZXV0c2NoJyB9LFxuICAgIHsgY29kZTogJ2l0JywgbmFtZTogJ0l0YWxpYW5vJyB9LFxuICAgIHsgY29kZTogJ3B0JywgbmFtZTogJ1BvcnR1Z3XDqnMnIH0sXG4gICAgeyBjb2RlOiAnemgnLCBuYW1lOiAn5Lit5paHJyB9LFxuICBdO1xuICBjb25zdCBhdmFpbGFibGVMYW5ndWFnZXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhZ2VudEF2YWlsYWJsZUxhbmd1YWdlcykpIHtcbiAgICAgIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0KFxuICAgICAgICBhZ2VudEF2YWlsYWJsZUxhbmd1YWdlcy5tYXAoKGxhbmcpID0+IGxhbmcudG9Mb3dlckNhc2UoKSksXG4gICAgICApO1xuICAgICAgcmV0dXJuIGFsbExhbmd1YWdlcy5maWx0ZXIoKGxhbmcpID0+IGFsbG93ZWQuaGFzKGxhbmcuY29kZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYWxsTGFuZ3VhZ2VzO1xuICB9LCBbYWdlbnRBdmFpbGFibGVMYW5ndWFnZXNdKTtcbiAgY29uc3QgaGFzTGFuZ3VhZ2VPcHRpb25zID0gYXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aCA+IDA7XG5cbiAgLy8gUmVzb2x2ZSB0aGVtZSB2YWx1ZXNcbiAgY29uc3QgdGhlbWVQYXJhbXMgPSByZXNvbHZlVGhlbWUodGhlbWUpO1xuICBjb25zdCB7IHByaW1hcnlDb2xvciwgYmFja2dyb3VuZENvbG9yLCB0ZXh0Q29sb3IsIGZvbnRGYW1pbHksIGZvbnRTaXplIH0gPSB0aGVtZVBhcmFtcztcbiAgY29uc3QgZm9udFNpemVOdW1iZXIgPSB0eXBlb2YgZm9udFNpemUgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoZm9udFNpemUsIDEwKSA6ICh0eXBlb2YgZm9udFNpemUgPT09ICdudW1iZXInID8gZm9udFNpemUgOiAxNCk7XG5cbiAgY29uc3QgcG9zaXRpb24gPSBmbG9hdGluZ0NvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcbiAgY29uc3Qgb2Zmc2V0ID0gZmxvYXRpbmdDb25maWcub2Zmc2V0IHx8IHsgeDogMjAsIHk6IDIwIH07XG4gIGNvbnN0IG9mZnNldFggPSBvZmZzZXQueCB8fCAyMDtcbiAgY29uc3Qgb2Zmc2V0WSA9IG9mZnNldC55IHx8IDIwO1xuXG4gIGNvbnN0IGlzRmxvYXRpbmdEb2NrZWQgPSBtb2RlID09PSAnZmxvYXRpbmcnICYmICFpc0Z1bGxzY3JlZW47XG5cbiAgLy8gQ29tcHV0ZWQgc3R5bGVzXG4gIGNvbnN0IGNvbnRhaW5lclN0eWxlID0gZ2V0Q29udGFpbmVyU3R5bGUoeyBpc0Z1bGxzY3JlZW4sIGlzRmxvYXRpbmdEb2NrZWQsIHdpbmRvd1dpZHRoLCB0OiB0aGVtZVBhcmFtcyB9KTtcbiAgY29uc3QgaGVhZGVyU3R5bGUgPSBnZXRIZWFkZXJTdHlsZSh0aGVtZVBhcmFtcyk7XG4gIGNvbnN0IGhlYWRlclRpdGxlU3R5bGUgPSBnZXRIZWFkZXJUaXRsZVN0eWxlKGZvbnRGYW1pbHkpO1xuICBjb25zdCBoZWFkZXJTdWJ0aXRsZVN0eWxlID0gZ2V0SGVhZGVyU3VidGl0bGVTdHlsZShmb250RmFtaWx5KTtcbiAgY29uc3QgbWVudVBvcHVwU3R5bGUgPSBnZXRNZW51UG9wdXBTdHlsZShiYWNrZ3JvdW5kQ29sb3IpO1xuICBjb25zdCBtZW51SXRlbVN0eWxlID0gZ2V0TWVudUl0ZW1TdHlsZSh0aGVtZVBhcmFtcyk7XG4gIGNvbnN0IGNvbnRlbnRDYXJkU3R5bGUgPSBnZXRDb250ZW50Q2FyZFN0eWxlKGJhY2tncm91bmRDb2xvcik7XG4gIGNvbnN0IHNlbmRCdXR0b25TdHlsZSA9IGdldFNlbmRCdXR0b25TdHlsZShwcmltYXJ5Q29sb3IpO1xuICBjb25zdCBwb3NzaWJsZVF1ZXJpZXNDb250YWluZXJTdHlsZSA9IGdldFBvc3NpYmxlUXVlcmllc0NvbnRhaW5lclN0eWxlKGZvbnRGYW1pbHkpO1xuICBjb25zdCBxdWVyeUJ1dHRvblN0eWxlID0gZ2V0UXVlcnlCdXR0b25TdHlsZSh0aGVtZVBhcmFtcyk7XG4gIGNvbnN0IGNvbmZpcm1PdmVybGF5U3R5bGUgPSBnZXRDb25maXJtT3ZlcmxheVN0eWxlKHNob3dSZXNldENvbmZpcm0pO1xuICBjb25zdCBjb25maXJtRGlhbG9nU3R5bGUgPSBnZXRDb25maXJtRGlhbG9nU3R5bGUodGhlbWVQYXJhbXMpO1xuICBjb25zdCBkaXNjbGFpbWVyU3R5bGUgPSBnZXREaXNjbGFpbWVyU3R5bGUoZm9udEZhbWlseSk7XG5cbiAgY29uc3QgdGV4dEFyZWFGb250U2l6ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICh3aW5kb3dXaWR0aCA8PSA3NjgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCgxNiwgZm9udFNpemVOdW1iZXIpICsgJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIGZvbnRTaXplO1xuICB9LCBbd2luZG93V2lkdGgsIGZvbnRTaXplLCBmb250U2l6ZU51bWJlcl0pO1xuXG4gIGNvbnN0IHRleHRBcmVhTGluZUhlaWdodCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHNpemUgPSB3aW5kb3dXaWR0aCA8PSA3NjggPyBNYXRoLm1heCgxNiwgZm9udFNpemVOdW1iZXIpIDogZm9udFNpemVOdW1iZXI7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoc2l6ZSAqIDEuNSk7XG4gIH0sIFt3aW5kb3dXaWR0aCwgZm9udFNpemVOdW1iZXJdKTtcblxuICBjb25zdCB0ZXh0QXJlYU1heEhlaWdodENhbGN1bGF0ZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gdGV4dEFyZWFMaW5lSGVpZ2h0ICogMztcbiAgfSwgW3RleHRBcmVhTGluZUhlaWdodF0pO1xuXG4gIGNvbnN0IHRleHRBcmVhU3R5bGUgPSBnZXRUZXh0QXJlYVN0eWxlKHtcbiAgICB0ZXh0QXJlYUZvbnRTaXplLFxuICAgIGZvbnRGYW1pbHksXG4gICAgdGV4dEFyZWFMaW5lSGVpZ2h0LFxuICAgIHRleHRBcmVhTWF4SGVpZ2h0Q2FsY3VsYXRlZCxcbiAgICB0ZXh0Q29sb3IsXG4gIH0pO1xuXG4gIGNvbnN0IGhhc1BlbmRpbmdGb3JtID0gbWVzc2FnZXMuc29tZSgobXNnLCBpZHgpID0+IHtcbiAgICBpZiAobXNnLnR5cGUgIT09ICdmb3JtX3JlcXVlc3QnIHx8IG1zZy5zcGVha2VyICE9PSAnYWdlbnQnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICFzdWJtaXR0ZWRGb3Jtcy5oYXMoaWR4KTtcbiAgfSk7XG5cbiAgY29uc3QgcGVuZGluZ0Zvcm0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBmb3IgKGxldCBpID0gbWVzc2FnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG1zZyA9IG1lc3NhZ2VzW2ldO1xuICAgICAgaWYgKG1zZy50eXBlID09PSAnZm9ybV9yZXF1ZXN0JyAmJiBtc2cuc3BlYWtlciA9PT0gJ2FnZW50JyAmJiAhc3VibWl0dGVkRm9ybXMuaGFzKGkpKSB7XG4gICAgICAgIHRyeSB7IHJldHVybiB7IHNjaGVtYTogSlNPTi5wYXJzZShtc2cudGV4dCksIGluZGV4OiBpIH07IH1cbiAgICAgICAgY2F0Y2ggeyAvKiBza2lwICovIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sIFttZXNzYWdlcywgc3VibWl0dGVkRm9ybXNdKTtcblxuICBjb25zdCBpc1NlbmREaXNhYmxlZCA9IChpbnB1dFZhbHVlLnRyaW0oKSA9PT0gJycgJiYgYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSB8fCBpc0FnZW50VHlwaW5nIHx8IGhhc1BlbmRpbmdGb3JtO1xuXG4gIGNvbnN0IGF1dG9SZXNpemVUZXh0QXJlYSA9ICgpID0+IHtcbiAgICBjb25zdCBlbCA9IHRleHRBcmVhUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICBjb25zdCBuZXdIZWlnaHQgPSBNYXRoLm1pbihlbC5zY3JvbGxIZWlnaHQsIHRleHRBcmVhTWF4SGVpZ2h0Q2FsY3VsYXRlZCk7XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gYCR7bmV3SGVpZ2h0fXB4YDtcbiAgICBlbC5zdHlsZS5vdmVyZmxvd1kgPSBlbC5zY3JvbGxIZWlnaHQgPiB0ZXh0QXJlYU1heEhlaWdodENhbGN1bGF0ZWQgPyAnYXV0bycgOiAnaGlkZGVuJztcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGF1dG9SZXNpemVUZXh0QXJlYSgpO1xuICB9LCBbaW5wdXRWYWx1ZSwgdGV4dEFyZWFNYXhIZWlnaHRDYWxjdWxhdGVkXSk7XG5cbiAgY29uc3Qgc2hvd0FnZW50RGlzY2xhaW1lciA9IEJvb2xlYW4oaW5wdXREaXNjbGFpbWVySHRtbCk7XG4gIGNvbnN0IGFnZW50RGlzY2xhaW1lckNvbnRlbnQgPSBzaG93QWdlbnREaXNjbGFpbWVyICYmIChcbiAgICA8c3BhbiBkYW5nZXJvdXNseVNldElubmVySFRNTD17eyBfX2h0bWw6IGlucHV0RGlzY2xhaW1lckh0bWwhIH19IC8+XG4gICk7XG5cbiAgY29uc3QgZmxvYXRpbmdDb250YWluZXJTdHlsZSA9IGdldEZsb2F0aW5nQ29udGFpbmVyU3R5bGUoe1xuICAgIG1vZGUsXG4gICAgaXNGdWxsc2NyZWVuLFxuICAgIHdpbmRvd1dpZHRoLFxuICAgIHdpbmRvd0hlaWdodCxcbiAgICBwb3NpdGlvbixcbiAgICBvZmZzZXRYLFxuICAgIG9mZnNldFksXG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckxhbmd1YWdlU2VsZWN0b3IgPSAoKSA9PiB7XG4gICAgaWYgKCFTSE9XX0NIQVRfTEFOR1VBR0VfU0VMRUNUT1IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghaGFzTGFuZ3VhZ2VPcHRpb25zIHx8IChjb252ZXJzYXRpb25JZCAmJiAhaXNGaW5hbGl6ZWQpIHx8IG1lc3NhZ2VzLmxlbmd0aCA+IDAgfHwgaGFzVXNlck1lc3NhZ2VzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxMYW5ndWFnZVNlbGVjdG9yXG4gICAgICAgIGF2YWlsYWJsZUxhbmd1YWdlcz17YXZhaWxhYmxlTGFuZ3VhZ2VzfVxuICAgICAgICBzZWxlY3RlZExhbmd1YWdlPXtyZXNvbHZlZExhbmd1YWdlfVxuICAgICAgICBvbkxhbmd1YWdlQ2hhbmdlPXtoYW5kbGVMYW5ndWFnZUNoYW5nZX1cbiAgICAgICAgdHJhbnNsYXRpb25zPXt0cmFuc2xhdGlvbnN9XG4gICAgICAgIHRoZW1lPXt0aGVtZX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfTtcblxuICBjb25zdCByZW5kZXJXaXRoUmVDYXB0Y2hhID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFyZUNhcHRjaGFLZXkpIHtcbiAgICAgIHJldHVybiAoY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSkgPT4gPD57Y2hpbGRyZW59PC8+O1xuICAgIH1cblxuICAgIHJldHVybiAoY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSkgPT4gKFxuICAgICAgPEdvb2dsZVJlQ2FwdGNoYVByb3ZpZGVyIHJlQ2FwdGNoYUtleT17cmVDYXB0Y2hhS2V5IHx8ICcnfT5cbiAgICAgICAgPEdvb2dsZVJlQ2FwdGNoYVxuICAgICAgICAgIGFjdGlvbj1cImdlbmFzc2lzdF9jaGF0XCJcbiAgICAgICAgICBvblZlcmlmeT17aGFuZGxlUmVDYXB0Y2hhVmVyaWZ5fVxuICAgICAgICAgIHJlZnJlc2hSZUNhcHRjaGE9e2ZhbHNlfVxuICAgICAgICAvPlxuICAgICAgICA8PntjaGlsZHJlbn08Lz5cbiAgICAgIDwvR29vZ2xlUmVDYXB0Y2hhUHJvdmlkZXI+XG4gICAgKTtcbiAgfSwgW3JlQ2FwdGNoYUtleSwgaGFuZGxlUmVDYXB0Y2hhVmVyaWZ5XSk7XG5cbiAgY29uc3QgcmVuZGVyQ2hhdENvbXBvbmVudCA9ICgpID0+IChcbiAgICA8ZGl2IHN0eWxlPXtjb250YWluZXJTdHlsZX0gZGF0YS1nZW5hc3Npc3Qtcm9vdD1cInRydWVcIj5cbiAgICAgIDxzdHlsZT57Q1NTX0tFWUZSQU1FU308L3N0eWxlPlxuICAgICAgPGRpdiBzdHlsZT17aGVhZGVyU3R5bGV9IHJlZj17aGVhZGVyUmVmfT5cbiAgICAgICAgPGRpdiBzdHlsZT17bG9nb0NvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICA8aW1nIHNyYz17bG9nb1VybD8udHJpbSgpIHx8IGNoYXRMb2dvfSBhbHQ9XCJMb2dvXCIgc3R5bGU9e2xvZ29TdHlsZX0gLz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXtoZWFkZXJUaXRsZUNvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e2hlYWRlclRpdGxlU3R5bGV9PntoZWFkZXJUaXRsZX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e2hlYWRlclN1YnRpdGxlU3R5bGV9PlxuICAgICAgICAgICAgICB7ZGVzY3JpcHRpb24gPz8gdCgnaGVhZGVyLnN1YnRpdGxlJyl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywgZ2FwOiAnOHB4JyB9fT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBzdHlsZT17bWVudUJ1dHRvblN0eWxlfVxuICAgICAgICAgICAgb25DbGljaz17aGFuZGxlTWVudUNsaWNrfVxuICAgICAgICAgICAgdGl0bGU9e3QoJ21lbnUudGl0bGUnKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8TW9yZVZlcnRpY2FsIHNpemU9ezI0fSBjb2xvcj1cIiMxMTExMTFcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIHttb2RlID09PSAnZmxvYXRpbmcnICYmIChcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgc3R5bGU9e21lbnVCdXR0b25TdHlsZX1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNGbG9hdGluZ09wZW4oZmFsc2UpfVxuICAgICAgICAgICAgICB0aXRsZT1cIkNsb3NlIGNoYXRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8WCBzaXplPXsyNH0gY29sb3I9XCIjMTExMTExXCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICB7IW5vQ29sb3JBbmltYXRpb24gJiYgc2hvd0JhY2tsaWdodCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICB0b3A6IE1hdGgubWF4KDAsIGhlYWRlckhlaWdodCAtIDE0KSxcbiAgICAgICAgICAgIGhlaWdodDogNDIsXG4gICAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICBvcGFjaXR5OiBpc0FnZW50VHlwaW5nID8gMSA6IDAsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiAnb3BhY2l0eSA0MjBtcyBlYXNlLWluLW91dCcsXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICB0b3A6IDYsXG4gICAgICAgICAgICAgIGhlaWdodDogMzIsXG4gICAgICAgICAgICAgIHdpZHRoOiAnNzglJyxcbiAgICAgICAgICAgICAgZmlsdGVyOiAnYmx1cigyMnB4KScsXG4gICAgICAgICAgICAgIGJhY2tncm91bmQ6XG4gICAgICAgICAgICAgICAgYGxpbmVhci1ncmFkaWVudCg5MGRlZywgJHtoZXhUb1JnYmEocHJpbWFyeUNvbG9yLCAwLjApfSAwJSwgJHtoZXhUb1JnYmEocHJpbWFyeUNvbG9yLCAwLjM1KX0gMTUlLCAke2hleFRvUmdiYShwcmltYXJ5Q29sb3IsIDAuNTUpfSA1MCUsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4zNSl9IDg1JSwgJHtoZXhUb1JnYmEocHJpbWFyeUNvbG9yLCAwLjApfSAxMDAlKWAsXG4gICAgICAgICAgICAgIHdpbGxDaGFuZ2U6ICd0cmFuc2Zvcm0sIG9wYWNpdHknLFxuICAgICAgICAgICAgICBhbmltYXRpb246ICdnYS1iYWNrbGlnaHQtc3dlZXAyIDEuMnMgY3ViaWMtYmV6aWVyKDAuNCwwLjAsMC4yLDEpIGluZmluaXRlIGFsdGVybmF0ZSwgZ2EtYmFja2xpZ2h0LXB1bHNlIDIuNHMgZWFzZS1pbi1vdXQgaW5maW5pdGUnLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDE4LFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG5cbiAgICAgIHtzaG93TWVudSAmJiAoXG4gICAgICAgIDxkaXYgcmVmPXttZW51UmVmfSBzdHlsZT17bWVudVBvcHVwU3R5bGV9PlxuICAgICAgICAgIDxkaXYgc3R5bGU9e21lbnVJdGVtU3R5bGV9IG9uQ2xpY2s9e2hhbmRsZVJlc2V0Q2xpY2t9PlxuICAgICAgICAgICAgPFJlZnJlc2hDdyBzaXplPXsxNn0gLz5cbiAgICAgICAgICAgIHt0KCdtZW51LnJlc2V0Q29udmVyc2F0aW9uJyl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge21vZGUgIT09ICdmdWxsc2NyZWVuJyAmJiAoXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXttZW51SXRlbVN0eWxlfSBvbkNsaWNrPXtoYW5kbGVGdWxsc2NyZWVuVG9nZ2xlfT5cbiAgICAgICAgICAgICAge2lzRnVsbHNjcmVlbiA/IDxNaW5pbWl6ZTIgc2l6ZT17MTZ9IC8+IDogPE1heGltaXplMiBzaXplPXsxNn0gLz59XG4gICAgICAgICAgICAgIHt0KCdtZW51LmZ1bGxzY3JlZW4nKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge2hhc0xhbmd1YWdlT3B0aW9ucyAmJiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIHN0eWxlPXt7IC4uLm1lbnVJdGVtU3R5bGUsIHBvc2l0aW9uOiAncmVsYXRpdmUnLCBib3JkZXJCb3R0b206ICdub25lJyB9fVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgc2V0U2hvd0xhbmd1YWdlRHJvcGRvd24oIXNob3dMYW5ndWFnZURyb3Bkb3duKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEdsb2JlIHNpemU9ezE2fSAvPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17eyBmbGV4OiAxIH19Pnt0KCdtZW51Lmxhbmd1YWdlJyl9PC9zcGFuPlxuICAgICAgICAgICAgICB7c2hvd0xhbmd1YWdlRHJvcGRvd24gJiYgKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogJzRweCcsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc4cHgnLFxuICAgICAgICAgICAgICAgICAgICBib3hTaGFkb3c6ICcwIDJweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4xKScsXG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnMTgwcHgnLFxuICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogJzIwMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDEwMDEsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUxhbmd1YWdlcy5tYXAoKGxhbmcsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e2xhbmcuY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBnYXA6ICc4cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzEwcHggMTVweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGV4dENvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiByZXNvbHZlZExhbmd1YWdlID09PSBsYW5nLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhlbWU/LnNlY29uZGFyeUNvbG9yIHx8ICcjZjVmNWY1JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBpbmRleCA8IGF2YWlsYWJsZUxhbmd1YWdlcy5sZW5ndGggLSAxID8gJzFweCBzb2xpZCAjZjBmMGYwJyA6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2JhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlJyxcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VFbnRlcj17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZExhbmd1YWdlICE9PSBsYW5nLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoZW1lPy5zZWNvbmRhcnlDb2xvciB8fCAnI2Y1ZjVmNSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlTGVhdmU9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRMYW5ndWFnZSAhPT0gbGFuZy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVMYW5ndWFnZUNoYW5nZShsYW5nLmNvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hvd0xhbmd1YWdlRHJvcGRvd24oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hvd01lbnUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7bGFuZy5uYW1lfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICA8ZGl2IHN0eWxlPXtjb250ZW50Q2FyZFN0eWxlfT5cbiAgICAgICAgPGRpdiBzdHlsZT17Y2hhdENvbnRhaW5lclN0eWxlfSByZWY9e2NoYXRDb250YWluZXJSZWZ9PlxuICAgICAgICAgIHtyZW5kZXJMYW5ndWFnZVNlbGVjdG9yKCl9XG5cbiAgICAgICAgICB7KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFNob3dTeW50aGV0aWNXZWxjb21lID1cbiAgICAgICAgICAgICAgc2hvd1dlbGNvbWVCZWZvcmVTdGFydCAmJlxuICAgICAgICAgICAgICAhaGFzVXNlck1lc3NhZ2VzICYmXG4gICAgICAgICAgICAgIChtZXNzYWdlcy5sZW5ndGggPT09IDAgfHwgbWVzc2FnZXNbMF0uc3BlYWtlciAhPT0gJ2FnZW50JykgJiZcbiAgICAgICAgICAgICAgKEJvb2xlYW4od2VsY29tZVRpdGxlKSB8fCBCb29sZWFuKHdlbGNvbWVJbWFnZVVybCkgfHwgQm9vbGVhbih3ZWxjb21lTWVzc2FnZSkpXG4gICAgICAgICAgICAgICYmIGNvbnZlcnNhdGlvbklkO1xuXG4gICAgICAgICAgICBpZiAoIXNob3VsZFNob3dTeW50aGV0aWNXZWxjb21lKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgICAgICBjb25zdCBzeW50aGV0aWNXZWxjb21lOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgY3JlYXRlX3RpbWU6IG5vdyxcbiAgICAgICAgICAgICAgc3RhcnRfdGltZTogMCxcbiAgICAgICAgICAgICAgZW5kX3RpbWU6IDAuMDEsXG4gICAgICAgICAgICAgIHNwZWFrZXI6ICdhZ2VudCcsXG4gICAgICAgICAgICAgIHRleHQ6IHdlbGNvbWVNZXNzYWdlIHx8ICcnLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPENoYXRNZXNzYWdlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAga2V5PVwiX19zeW50aGV0aWNfd2VsY29tZV9fXCJcbiAgICAgICAgICAgICAgICBtZXNzYWdlPXtzeW50aGV0aWNXZWxjb21lfVxuICAgICAgICAgICAgICAgIHRoZW1lPXt0aGVtZX1cbiAgICAgICAgICAgICAgICBpc0ZpcnN0TWVzc2FnZT17dHJ1ZX1cbiAgICAgICAgICAgICAgICBpc05leHRTYW1lU3BlYWtlcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgaXNQcmV2U2FtZVNwZWFrZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIGVuYWJsZVR5cGV3cml0ZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIHdlbGNvbWVJbWFnZVVybD17d2VsY29tZUltYWdlVXJsIHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICB3ZWxjb21lVGl0bGU9e3dlbGNvbWVUaXRsZSB8fCB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgcG9zc2libGVRdWVyaWVzPXtwb3NzaWJsZVF1ZXJpZXN9XG4gICAgICAgICAgICAgICAgb25RdWlja1F1ZXJ5PXtoYW5kbGVRdWVyeUNsaWNrfVxuICAgICAgICAgICAgICAgIG9uUXVpY2tBY3Rpb249e2hhbmRsZVF1aWNrQWN0aW9ufVxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9ucz17dHJhbnNsYXRpb25zfVxuICAgICAgICAgICAgICAgIGxhbmd1YWdlPXtyZXNvbHZlZExhbmd1YWdlfVxuICAgICAgICAgICAgICAgIGFnZW50TmFtZT17YWdlbnROYW1lfVxuICAgICAgICAgICAgICAgIGlzQWdlbnRUeXBpbmc9e2lzQWdlbnRUeXBpbmd9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgeygoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdEFnZW50SW5kZXggPSBtZXNzYWdlcy5maW5kSW5kZXgobSA9PiBtLnNwZWFrZXIgPT09ICdhZ2VudCcpO1xuXG4gICAgICAgICAgICAvLyBMaXZlLXZvaWNlIHR1cm5zIGFyZSByZW5kZXJlZCBsb2NhbGx5IChiZWxvdykgdGhlIG1vbWVudCB0aGV5IGZpbmlzaC5cbiAgICAgICAgICAgIC8vIEVhY2ggaXMgYWxzbyBwZXJzaXN0ZWQgYW5kIGJyb2FkY2FzdCBiYWNrIGludG8gYG1lc3NhZ2VzYDsgc3VwcHJlc3MgdGhhdFxuICAgICAgICAgICAgLy8gY29weSBzbyBhIHR1cm4gaXNuJ3Qgc2hvd24gdHdpY2UgKGFuZCBuZXZlciBibGlua3MgYXMgdGhlIHR3byBzd2FwKS5cbiAgICAgICAgICAgIGNvbnN0IGxpdmVUdXJuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0dXJuIG9mIGxpdmVUdXJucykge1xuICAgICAgICAgICAgICBpZiAodHVybi51c2VyLnRyaW0oKSkgbGl2ZVR1cm5LZXlzLmFkZChgY3VzdG9tZXI6JHt0dXJuLnVzZXIudHJpbSgpfWApO1xuICAgICAgICAgICAgICBpZiAodHVybi5hZ2VudC50cmltKCkpIGxpdmVUdXJuS2V5cy5hZGQoYGFnZW50OiR7dHVybi5hZ2VudC50cmltKCl9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGFwcGx5TWVzc2FnZUZpbHRlciA9IChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAobWVzc2FnZS50eXBlID09PSAnZmlsZScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgaWYgKGxpdmVUdXJuS2V5cy5oYXMoYCR7bWVzc2FnZS5zcGVha2VyfTokeyhtZXNzYWdlLnRleHQgfHwgJycpLnRyaW0oKX1gKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLmZpbHRlcihhcHBseU1lc3NhZ2VGaWx0ZXIpLm1hcCgobWVzc2FnZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2Zvcm1fcmVxdWVzdCcgJiYgbWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1TY2hlbWEgPSBKU09OLnBhcnNlKG1lc3NhZ2UudGV4dCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1BlbmRpbmcgPSAhc3VibWl0dGVkRm9ybXMuaGFzKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtpbmRleH0gc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgbWF4V2lkdGg6ICc4NSUnLCBtYXJnaW5Cb3R0b206ICc4cHgnIH19PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZm9udFNpemU6ICcxNHB4JywgY29sb3I6ICcjMDAwMDAwJywgZm9udFdlaWdodDogNjAwLCBtYXJnaW5Cb3R0b206IDQgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7YWdlbnROYW1lIHx8ICdBZ2VudCd9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAge2Zvcm1EaXNwbGF5ID09PSAnaW5saW5lJyAmJiBpc1BlbmRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHluYW1pY0Zvcm1NZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYT17Zm9ybVNjaGVtYX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWJtaXQ9eyhkYXRhKSA9PiBoYW5kbGVGb3JtU3VibWl0KGRhdGEsIGluZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw9eygpID0+IGhhbmRsZUZvcm1DYW5jZWwoaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1Ym1pdHRpbmc9e3N1Ym1pdHRpbmdGb3JtSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1Ym1pdHRlZD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2xvcj17cHJpbWFyeUNvbG9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5PXtmb250RmFtaWx5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmM2Y0ZjYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxMnB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzEwcHggMTRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMTRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzM3NDE1MScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2Zvcm1TY2hlbWEubWVzc2FnZSB8fCAnUGxlYXNlIGZpbGwgdGhlIGZvcm0gYmVsb3cuJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2lzUGVuZGluZyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBmb250U2l6ZTogJzEycHgnLCBjb2xvcjogJyM2YjcyODAnLCBtYXJnaW5Ub3A6ICc0cHgnIH19PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbCB0aGUgZm9ybSBiZWxvdyB0byBjb250aW51ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgcmVuZGVyaW5nIGlmIEpTT04gcGFyc2UgZmFpbHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBpc05leHRTYW1lU3BlYWtlciA9IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoIC0gMSAmJiBtZXNzYWdlc1tpbmRleCArIDFdLnNwZWFrZXIgPT09IG1lc3NhZ2Uuc3BlYWtlcjtcbiAgICAgICAgICAgICAgY29uc3QgaXNQcmV2U2FtZVNwZWFrZXIgPSBpbmRleCA+IDAgJiYgbWVzc2FnZXNbaW5kZXggLSAxXS5zcGVha2VyID09PSBtZXNzYWdlLnNwZWFrZXI7XG4gICAgICAgICAgICAgIGNvbnN0IGlzRmlyc3RBZ2VudE1lc3NhZ2UgPSBpbmRleCA9PT0gZmlyc3RBZ2VudEluZGV4ICYmIG1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50JyAmJiAhaGFzVXNlck1lc3NhZ2VzO1xuICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5TWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgaXNGaXJzdEFnZW50TWVzc2FnZSAmJiB3ZWxjb21lTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgPyB7IC4uLm1lc3NhZ2UsIHRleHQ6IHdlbGNvbWVNZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgIDogbWVzc2FnZTtcblxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxDaGF0TWVzc2FnZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9e2Rpc3BsYXlNZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICAgICAgICAgICAgb25QbGF5QXVkaW89e21lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50JyA/IHBsYXlSZXNwb25zZUF1ZGlvIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgaXNQbGF5aW5nQXVkaW89e2lzUGxheWluZ0F1ZGlvfVxuICAgICAgICAgICAgICAgICAgaXNGaXJzdE1lc3NhZ2U9e2lzRmlyc3RBZ2VudE1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICBpc05leHRTYW1lU3BlYWtlcj17aXNOZXh0U2FtZVNwZWFrZXJ9XG4gICAgICAgICAgICAgICAgICBpc1ByZXZTYW1lU3BlYWtlcj17aXNQcmV2U2FtZVNwZWFrZXJ9XG4gICAgICAgICAgICAgICAgICBvbkZlZWRiYWNrPXsobWVzc2FnZUlkLCB2YWx1ZSkgPT4gYWRkRmVlZGJhY2sobWVzc2FnZUlkLCB2YWx1ZSl9XG4gICAgICAgICAgICAgICAgICBlbmFibGVUeXBld3JpdGVyPXtpbmRleCA9PT0gbWVzc2FnZXMubGVuZ3RoIC0gMSAmJiBtZXNzYWdlLnNwZWFrZXIgPT09ICdhZ2VudCd9XG4gICAgICAgICAgICAgICAgICB3ZWxjb21lSW1hZ2VVcmw9e2lzRmlyc3RBZ2VudE1lc3NhZ2UgPyAod2VsY29tZUltYWdlVXJsIHx8IHVuZGVmaW5lZCkgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICB3ZWxjb21lVGl0bGU9e2lzRmlyc3RBZ2VudE1lc3NhZ2UgPyAod2VsY29tZVRpdGxlIHx8IHVuZGVmaW5lZCkgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXM9e2lzRmlyc3RBZ2VudE1lc3NhZ2UgPyBwb3NzaWJsZVF1ZXJpZXMgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBvblF1aWNrUXVlcnk9e2hhbmRsZVF1ZXJ5Q2xpY2t9XG4gICAgICAgICAgICAgICAgICBvblF1aWNrQWN0aW9uPXtoYW5kbGVRdWlja0FjdGlvbn1cbiAgICAgICAgICAgICAgICAgIG9uU2NoZWR1bGVDb25maXJtPXtoYW5kbGVTY2hlZHVsZUNvbmZpcm19XG4gICAgICAgICAgICAgICAgICBpc0xhc3RNZXNzYWdlPXtpbmRleCA9PT0gbWVzc2FnZXMubGVuZ3RoIC0gMSAmJiBtZXNzYWdlLnNwZWFrZXIgPT09ICdhZ2VudCd9XG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM9e3RyYW5zbGF0aW9uc31cbiAgICAgICAgICAgICAgICAgIGxhbmd1YWdlPXtyZXNvbHZlZExhbmd1YWdlfVxuICAgICAgICAgICAgICAgICAgYWdlbnROYW1lPXthZ2VudE5hbWV9XG4gICAgICAgICAgICAgICAgICBpc0FnZW50VHlwaW5nPXtpc0FnZW50VHlwaW5nfVxuICAgICAgICAgICAgICAgICAgYXVkaW9VcmxCdWlsZGVyPXttZXNzYWdlLnR5cGUgPT09ICdhdWRpbycgJiYgdXNlQXVkaW8gPyBhdWRpb1VybEJ1aWxkZXIgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBhdWRpb0hlYWRlcnM9e21lc3NhZ2UudHlwZSA9PT0gJ2F1ZGlvJyAmJiB1c2VBdWRpbyA/IGF1ZGlvSGVhZGVycyA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIGF1dG9QbGF5QXVkaW9NZXNzYWdlSWQ9e2F1dG9QbGF5QXVkaW9NZXNzYWdlSWR9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pKCl9XG4gICAgICAgICAge2lzQWdlbnRUeXBpbmcgJiYgY3VycmVudFRoaW5raW5nUGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIG1heFdpZHRoOiAnODAlJyB9fT5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBmb250U2l6ZTogJzE0cHgnLCBjb2xvcjogJyMwMDAwMDAnLCBmb250V2VpZ2h0OiA2MDAsIG1hcmdpbkJvdHRvbTogNCB9fT57YWdlbnROYW1lIHx8IHQoJ2xhYmVscy5hZ2VudCcpfTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgICAgICAgICAgICAgIG1heFdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGtleT17YCR7Y3VycmVudFRoaW5raW5nUGFydEluZGV4fS0ke2N1cnJlbnRUaGlua2luZ1BhcnRzLmpvaW4oJ3wnKX1gfVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiAnZ2EtdGhpbmstY2hhbmdlIDIyMG1zIGVhc2UnLFxuICAgICAgICAgICAgICAgICAgICB3aWxsQ2hhbmdlOiAndHJhbnNmb3JtLCBvcGFjaXR5JyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjNmI3MjgwJyxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6ICcxM3B4JyxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge2N1cnJlbnRUaGlua2luZ1BhcnRzW2N1cnJlbnRUaGlua2luZ1BhcnRJbmRleF0gfHwgY3VycmVudFRoaW5raW5nUGFydHNbY3VycmVudFRoaW5raW5nUGFydHMubGVuZ3RoIC0gMV19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7LyogQ29tcGxldGVkIGxpdmUtdm9pY2UgdHVybnMsIHJlbmRlcmVkIGFzIG9yZGluYXJ5IGNoYXQgYnViYmxlcyBhbmQga2VwdFxuICAgICAgICAgICAgICBpbiBsb2NhbCBzdGF0ZSBzbyB0aGV5IHN0YXkgdmlzaWJsZSBhY3Jvc3MgdHVybnMuIFRoZSBwZXJzaXN0ZWQgY29weSBvZlxuICAgICAgICAgICAgICBlYWNoIHR1cm4gaXMgZmlsdGVyZWQgb3V0IG9mIGBtZXNzYWdlc2AgYWJvdmUsIHNvIHRoZXNlIGFyZSB0aGUgc2luZ2xlXG4gICAgICAgICAgICAgIHNvdXJjZSBvZiB0cnV0aCBvbiBzY3JlZW4g4oCUIHRoZXkgbmV2ZXIgZ2V0IGhpZGRlbiwgc28gbm90aGluZyBibGlua3MuICovfVxuICAgICAgICAgIHtsaXZlVHVybnMubWFwKCh0dXJuLCBpKSA9PiAoXG4gICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtgbGl2ZS10dXJuLSR7aX1gfT5cbiAgICAgICAgICAgICAge3R1cm4udXNlci50cmltKCkgIT09ICcnICYmIHJlbmRlckxpdmVCdWJibGUoJ2N1c3RvbWVyJywgdHVybi51c2VyLCB0dXJuLmNyZWF0ZVRpbWUpfVxuICAgICAgICAgICAgICB7dHVybi5hZ2VudC50cmltKCkgIT09ICcnICYmIHJlbmRlckxpdmVCdWJibGUoJ2FnZW50JywgdHVybi5hZ2VudCwgdHVybi5jcmVhdGVUaW1lKX1cbiAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgKSl9XG4gICAgICAgICAgey8qIEluLXByb2dyZXNzIHR1cm46IHN0cmVhbXMgdGhlIHBhcnRpYWwgdHJhbnNjcmlwdCBsaXZlIChDaGF0TWVzc2FnZSBub3dcbiAgICAgICAgICAgICAgdHJhY2tzIGl0cyB0ZXh0IHByb3AsIHNvIHRoZXNlIHVwZGF0ZSBpbiBwbGFjZSBhcyBjaHVua3MgYXJyaXZlKS4gKi99XG4gICAgICAgICAge2xpdmVWb2ljZS5pc0FjdGl2ZSAmJiBsaXZlQ2FwdGlvbi51c2VyLnRyaW0oKSAhPT0gJycgJiZcbiAgICAgICAgICAgIHJlbmRlckxpdmVCdWJibGUoJ2N1c3RvbWVyJywgbGl2ZUNhcHRpb24udXNlciwgbGl2ZUNhcHRpb24uY3JlYXRlVGltZSwgJ19fbGl2ZV9jYXB0aW9uX3VzZXJfXycpfVxuICAgICAgICAgIHtsaXZlVm9pY2UuaXNBY3RpdmUgJiYgbGl2ZUNhcHRpb24uYWdlbnQudHJpbSgpICE9PSAnJyAmJlxuICAgICAgICAgICAgcmVuZGVyTGl2ZUJ1YmJsZSgnYWdlbnQnLCBsaXZlQ2FwdGlvbi5hZ2VudCwgbGl2ZUNhcHRpb24uY3JlYXRlVGltZSwgJ19fbGl2ZV9jYXB0aW9uX2FnZW50X18nKX1cbiAgICAgICAgICA8ZGl2IHJlZj17bWVzc2FnZXNFbmRSZWZ9IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7c2hvd1dlbGNvbWVCZWZvcmVTdGFydCAmJiAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNob3dpbmdTeW50aGV0aWNXZWxjb21lID1cbiAgICAgICAgICAgICFoYXNVc2VyTWVzc2FnZXMgJiZcbiAgICAgICAgICAgIChtZXNzYWdlcy5sZW5ndGggPT09IDAgfHwgbWVzc2FnZXNbMF0uc3BlYWtlciAhPT0gJ2FnZW50JykgJiZcbiAgICAgICAgICAgIChCb29sZWFuKHdlbGNvbWVUaXRsZSkgfHwgQm9vbGVhbih3ZWxjb21lSW1hZ2VVcmwpIHx8IEJvb2xlYW4od2VsY29tZU1lc3NhZ2UpKTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcG9zc2libGVRdWVyaWVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICFoYXNVc2VyTWVzc2FnZXMgJiZcbiAgICAgICAgICAgIChtZXNzYWdlcy5sZW5ndGggPT09IDAgfHwgbWVzc2FnZXNbMF0uc3BlYWtlciAhPT0gJ2FnZW50JykgJiZcbiAgICAgICAgICAgICFzaG93aW5nU3ludGhldGljV2VsY29tZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pKCkgJiYgKFxuICAgICAgICAgIDxkaXYgc3R5bGU9e3Bvc3NpYmxlUXVlcmllc0NvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICAgIHtwb3NzaWJsZVF1ZXJpZXMubWFwKChxdWVyeSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgc3R5bGU9e3F1ZXJ5QnV0dG9uU3R5bGV9XG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlUXVlcnlDbGljayhxdWVyeSl9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzTG9hZGluZyB8fCBpc0FnZW50VHlwaW5nfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3F1ZXJ5fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHtmaWxlRXJyb3JUb2FzdCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgbWFyZ2luOiAnMCAxNnB4IDhweCcsXG4gICAgICAgICAgICAgIHBhZGRpbmc6ICcxMHB4IDE0cHgnLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjRkZGM0UwJyxcbiAgICAgICAgICAgICAgY29sb3I6ICcjRTY1MTAwJyxcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMTJweCcsXG4gICAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgICBmb250RmFtaWx5LFxuICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBnYXA6ICc4cHgnLFxuICAgICAgICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEFsZXJ0Q2lyY2xlIHNpemU9ezE4fSBzdHlsZT17eyBmbGV4U2hyaW5rOiAwIH19IC8+XG4gICAgICAgICAgICA8c3Bhbj57ZmlsZUVycm9yVG9hc3R9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHtsaXZlVm9pY2VOb3RpY2UgJiYgKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIG1hcmdpbjogJzAgMTZweCA4cHgnLFxuICAgICAgICAgICAgICBwYWRkaW5nOiAnMTBweCAxNHB4JyxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI0ZGRjNFMCcsXG4gICAgICAgICAgICAgIGNvbG9yOiAnI0U2NTEwMCcsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzEycHgnLFxuICAgICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgZ2FwOiAnOHB4JyxcbiAgICAgICAgICAgICAgZmxleFNocmluazogMCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxBbGVydENpcmNsZSBzaXplPXsxOH0gc3R5bGU9e3sgZmxleFNocmluazogMCB9fSAvPlxuICAgICAgICAgICAgPHNwYW4+e2xpdmVWb2ljZU5vdGljZX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAge3VzZUZpbGUgJiYgYXR0YWNobWVudHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgPGRpdiBzdHlsZT17eyBwYWRkaW5nOiAnMCAxNnB4JywgbWFyZ2luQm90dG9tOiAnOHB4JywgZGlzcGxheTogJ2ZsZXgnLCBnYXA6ICc4cHgnLCBmbGV4V3JhcDogJ3dyYXAnIH19PlxuICAgICAgICAgICAge2F0dGFjaG1lbnRzLm1hcCgoYXR0LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8QXR0YWNobWVudFByZXZpZXdcbiAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgIGZpbGU9e2F0dC5maWxlfVxuICAgICAgICAgICAgICAgIG9uUmVtb3ZlPXsoKSA9PiBoYW5kbGVSZW1vdmVBdHRhY2htZW50KGF0dC5maWxlLm5hbWUpfVxuICAgICAgICAgICAgICAgIHVwbG9hZGluZz17dXBsb2FkaW5nRmlsZXMuaGFzKGF0dC5maWxlLm5hbWUpfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAgeyFjb252ZXJzYXRpb25JZCB8fCBpc0ZpbmFsaXplZCA/IChcbiAgICAgICAgICA8ZGl2IHN0eWxlPXtpbnB1dENvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHN0eWxlPXt7Li4uc2VuZEJ1dHRvblN0eWxlLCB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICc0OHB4JywgYm9yZGVyUmFkaXVzOiAnMTZweCcsIGN1cnNvcjogJ3BvaW50ZXInLCBmb250RmFtaWx5LCBmb250U2l6ZX19XG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVN0YXJ0Q29udmVyc2F0aW9ufVxuICAgICAgICAgICAgICBkaXNhYmxlZD17aXNMb2FkaW5nfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7dCgnYnV0dG9ucy5zdGFydENvbnZlcnNhdGlvbicpfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBwZW5kaW5nRm9ybSAmJiBmb3JtRGlzcGxheSA9PT0gJ2Zvb3RlcicgPyAoXG4gICAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgLi4uaW5wdXRDb250YWluZXJTdHlsZSxcbiAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICAgICAgYm9yZGVyVG9wOiAnMXB4IHNvbGlkICNlNWU3ZWInLFxuICAgICAgICAgIH19PlxuICAgICAgICAgICAgPER5bmFtaWNGb3JtTWVzc2FnZVxuICAgICAgICAgICAgICBzY2hlbWE9e3BlbmRpbmdGb3JtLnNjaGVtYX1cbiAgICAgICAgICAgICAgb25TdWJtaXQ9eyhkYXRhKSA9PiBoYW5kbGVGb3JtU3VibWl0KGRhdGEsIHBlbmRpbmdGb3JtLmluZGV4KX1cbiAgICAgICAgICAgICAgb25DYW5jZWw9eygpID0+IGhhbmRsZUZvcm1DYW5jZWwocGVuZGluZ0Zvcm0uaW5kZXgpfVxuICAgICAgICAgICAgICBpc1N1Ym1pdHRpbmc9e3N1Ym1pdHRpbmdGb3JtSW5kZXggPT09IHBlbmRpbmdGb3JtLmluZGV4fVxuICAgICAgICAgICAgICBpc1N1Ym1pdHRlZD17ZmFsc2V9XG4gICAgICAgICAgICAgIHByaW1hcnlDb2xvcj17cHJpbWFyeUNvbG9yfVxuICAgICAgICAgICAgICBmb250RmFtaWx5PXtmb250RmFtaWx5fVxuICAgICAgICAgICAgICB2YXJpYW50PVwiZm9vdGVyXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7YWdlbnREaXNjbGFpbWVyQ29udGVudCAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ2EtaW5wdXQtZGlzY2xhaW1lclwiIHN0eWxlPXtkaXNjbGFpbWVyU3R5bGV9PlxuICAgICAgICAgICAgICAgIHthZ2VudERpc2NsYWltZXJDb250ZW50fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBsaXZlVm9pY2VFbmFibGVkID8gKFxuICAgICAgICAgIC8vIExpdmUgdm9pY2UgbW9kZSBpcyB2b2ljZS1vbmx5OiBubyB0ZXh0IGJveCwgYXR0YWNoLCBvciBzZW5kIGJ1dHRvbiDigJRcbiAgICAgICAgICAvLyB0aGUgb25seSB3YXkgdG8gdGFsayB0byB0aGUgYWdlbnQgaXMgdG8gc3RhcnQgYSBsaXZlIGNhbGwuXG4gICAgICAgICAgPGRpdiBzdHlsZT17aW5wdXRDb250YWluZXJTdHlsZX0+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIHdpZHRoOiAnMTAwJScsIG1pbldpZHRoOiAwIH19PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtpbnB1dFdyYXBwZXJTdHlsZX0+XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e2dldExpdmVWb2ljZUhpbnRTdHlsZSh0ZXh0QXJlYUZvbnRTaXplLCBmb250RmFtaWx5KX0+XG4gICAgICAgICAgICAgICAgICB7bGl2ZVZvaWNlUmVhZHlcbiAgICAgICAgICAgICAgICAgICAgPyB0KCdsaXZlVm9pY2UudGFwVG9TdGFydCcsICdUYXAgdG8gc3RhcnQgYSB2b2ljZSBjb252ZXJzYXRpb24nKVxuICAgICAgICAgICAgICAgICAgICA6IHQoJ2xpdmVWb2ljZS51bmF2YWlsYWJsZScsICdWb2ljZSBpcyBjdXJyZW50bHkgdW5hdmFpbGFibGUnKX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPExpdmVDYWxsQ29udHJvbFxuICAgICAgICAgICAgICAgICAgc3RhdHVzPXtsaXZlVm9pY2Uuc3RhdHVzfVxuICAgICAgICAgICAgICAgICAgaXNBY3RpdmU9e2xpdmVWb2ljZS5pc0FjdGl2ZX1cbiAgICAgICAgICAgICAgICAgIG9uU3RhcnQ9e3N0YXJ0TGl2ZUNhbGx9XG4gICAgICAgICAgICAgICAgICBvblN0b3A9e2VuZExpdmVDYWxsfVxuICAgICAgICAgICAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFhZ2VudElkIHx8ICFsaXZlVm9pY2VSZWFkeX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAge2FnZW50RGlzY2xhaW1lckNvbnRlbnQgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ2EtaW5wdXQtZGlzY2xhaW1lclwiIHN0eWxlPXtkaXNjbGFpbWVyU3R5bGV9PlxuICAgICAgICAgICAgICAgICAge2FnZW50RGlzY2xhaW1lckNvbnRlbnR9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8Zm9ybSBvblN1Ym1pdD17aGFuZGxlU3VibWl0fSBzdHlsZT17aW5wdXRDb250YWluZXJTdHlsZX0+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIHdpZHRoOiAnMTAwJScsIG1pbldpZHRoOiAwIH19PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT17aW5wdXRXcmFwcGVyU3R5bGV9PlxuICAgICAgICAgICAgICB7dXNlRmlsZSAmJiAoXG4gICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXthdHRhY2hCdXR0b25TdHlsZX1cbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJBdHRhY2hcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBmaWxlSW5wdXRSZWYuY3VycmVudD8uY2xpY2soKX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPFBhcGVyY2xpcCBzaXplPXsyMn0gY29sb3I9XCIjNzU3NTc1XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgcmVmPXtmaWxlSW5wdXRSZWZ9XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGRpc3BsYXk6ICdub25lJyB9fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlRmlsZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0PXthbGxvd2VkRXh0ZW5zaW9ucy5qb2luKCcsJykgfHwgJyovKid9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICByZWY9e3RleHRBcmVhUmVmfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt0ZXh0QXJlYVN0eWxlfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdhLXRleHRhcmVhLW5vc2JcIlxuICAgICAgICAgICAgICAgIHZhbHVlPXtpbnB1dFZhbHVlfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0SW5wdXRWYWx1ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgb25LZXlEb3duPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChpbnB1dFZhbHVlLnRyaW0oKSAhPT0gJycgfHwgYXR0YWNobWVudHMubGVuZ3RoID4gMCkgJiYgIWlzQWdlbnRUeXBpbmcgJiYgIWhhc1BlbmRpbmdGb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3VibWl0TWVzc2FnZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17aW5wdXRQbGFjZWhvbGRlcn1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNvbnZlcnNhdGlvbklkIHx8IGlzRmluYWxpemVkIHx8IGhhc1BlbmRpbmdGb3JtfVxuICAgICAgICAgICAgICAgIHJvd3M9ezF9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3JpZ2h0QWN0aW9uQ29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAgICAgIHshKHVzZUF1ZGlvICYmIGlucHV0VmFsdWUudHJpbSgpID09PSAnJyAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDApICYmIChcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IC4uLnNlbmRCdXR0b25TdHlsZSwgLi4uKGlzU2VuZERpc2FibGVkID8gc2VuZEJ1dHRvbkRpc2FibGVkU3R5bGUgOiB7fSkgfX1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzU2VuZERpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8QXJyb3dVcCBzaXplPXsxOH0gc3Ryb2tlV2lkdGg9ezN9IGNvbG9yPVwiI2ZmZmZmZlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAge3VzZUF1ZGlvICYmIGlucHV0VmFsdWUudHJpbSgpID09PSAnJyAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgICAgICAgIDxWb2ljZUlucHV0XG4gICAgICAgICAgICAgICAgICBvbkF1ZGlvUmVhZHk9e2FzeW5jIChibG9iOiBCbG9iLCBmb3JtYXQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIHNldElzUGxheWluZ0F1ZGlvKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNlbmRBdWRpb01lc3NhZ2UoYmxvYiwgZm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlZCBpbnNpZGUgc2VuZEF1ZGlvTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgIHNldElzUGxheWluZ0F1ZGlvKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIG9uRXJyb3I9e2hhbmRsZVZvaWNlRXJyb3J9XG4gICAgICAgICAgICAgICAgICB0aGVtZT17dGhlbWV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICB7YWdlbnREaXNjbGFpbWVyQ29udGVudCAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ2EtaW5wdXQtZGlzY2xhaW1lclwiIHN0eWxlPXtkaXNjbGFpbWVyU3R5bGV9PlxuICAgICAgICAgICAgICAgIHthZ2VudERpc2NsYWltZXJDb250ZW50fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBzdHlsZT17Y29uZmlybU92ZXJsYXlTdHlsZX0+XG4gICAgICAgIDxkaXYgc3R5bGU9e2NvbmZpcm1EaWFsb2dTdHlsZX0+XG4gICAgICAgICAgPGgzIHN0eWxlPXt7Zm9udEZhbWlseSwgbWFyZ2luVG9wOiAwfX0+e3QoJ2RpYWxvZy5yZXNldENvbnZlcnNhdGlvbi50aXRsZScpfTwvaDM+XG4gICAgICAgICAgPHAgc3R5bGU9e3tmb250RmFtaWx5LCBmb250U2l6ZX19Pnt0KCdkaWFsb2cucmVzZXRDb252ZXJzYXRpb24ubWVzc2FnZScpfTwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXtjb25maXJtQnV0dG9uc1N0eWxlfT5cbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3suLi5nZXRDb25maXJtQnV0dG9uU3R5bGUoZmFsc2UsIHRoZW1lUGFyYW1zKSwgY29sb3I6IHRleHRDb2xvcn19IG9uQ2xpY2s9e2hhbmRsZUNhbmNlbFJlc2V0fT57dCgnYnV0dG9ucy5jYW5jZWwnKX08L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e2dldENvbmZpcm1CdXR0b25TdHlsZSh0cnVlLCB0aGVtZVBhcmFtcyl9IG9uQ2xpY2s9e2hhbmRsZUNvbmZpcm1SZXNldH0+e3QoJ2J1dHRvbnMucmVzZXQnKX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcblxuICBpZiAobW9kZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICB7IWlzRmxvYXRpbmdPcGVuICYmIChcbiAgICAgICAgICA8Q2hhdEJ1YmJsZVxuICAgICAgICAgICAgc2hvd0NoYXQ9e2lzRmxvYXRpbmdPcGVufVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNGbG9hdGluZ09wZW4ocHJldiA9PiAhcHJldil9XG4gICAgICAgICAgICBwcmltYXJ5Q29sb3I9e3ByaW1hcnlDb2xvcn1cbiAgICAgICAgICAgIHN0eWxlPXtnZXRQb3NpdGlvblN0eWxlcyh7IHBvc2l0aW9uLCBvZmZzZXRYLCBvZmZzZXRZIH0pfVxuICAgICAgICAgICAgY2hhdEJ1YmJsZUljb249e3RoZW1lPy5jaGF0QnViYmxlSWNvbn1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuXG4gICAgICAgIHtpc0Zsb2F0aW5nT3BlbiAmJiAoXG4gICAgICAgICAgPGRpdiBzdHlsZT17ZmxvYXRpbmdDb250YWluZXJTdHlsZX0gZGF0YS1nZW5hc3Npc3QtY29udGFpbmVyPVwiZmxvYXRpbmdcIj5cbiAgICAgICAgICAgIHtyZW5kZXJXaXRoUmVDYXB0Y2hhKHJlbmRlckNoYXRDb21wb25lbnQoKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8Lz5cbiAgICApO1xuICB9XG5cbiAgaWYgKG1vZGUgPT09ICdmdWxsc2NyZWVuJykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHN0eWxlPXtmbG9hdGluZ0NvbnRhaW5lclN0eWxlfSBkYXRhLWdlbmFzc2lzdC1jb250YWluZXI9XCJmdWxsc2NyZWVuXCI+XG4gICAgICAgIHtyZW5kZXJXaXRoUmVDYXB0Y2hhKHJlbmRlckNoYXRDb21wb25lbnQoKSl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlcldpdGhSZUNhcHRjaGEocmVuZGVyQ2hhdENvbXBvbmVudCgpKTtcbn07XG4iXX0=
1122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VuQWdlbnRDaGF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvR2VuQWdlbnRDaGF0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RJLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxrQkFBa0IsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLFFBQVEsTUFBTSx5QkFBeUIsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixvQkFBb0IsRUFDcEIsMEJBQTBCLEdBQzNCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVyRixPQUFPLEVBQ0wsWUFBWSxFQUNaLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsY0FBYyxFQUNkLHdCQUF3QixFQUN4Qix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLFNBQVMsRUFDVCxjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6Qiw2QkFBNkIsRUFDN0IsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2Qix5QkFBeUIsRUFDekIsZ0NBQWdDLEVBQ2hDLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQix5QkFBeUIsRUFDekIsYUFBYSxHQUNkLE1BQU0sOEJBQThCLENBQUM7QUFFdEMsSUFBTSwyQkFBMkIsR0FBRyxJQUFJLENBQUM7QUFLekMsZ0ZBQWdGO0FBQ2hGLElBQU0sTUFBTSxHQUFHLGNBQU0sT0FBQSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBN0IsQ0FBNkIsQ0FBQztBQUVuRCxNQUFNLENBQUMsSUFBTSxZQUFZLEdBQWdDLFVBQUMsRUFvQ3pEOztRQW5DQyxPQUFPLGFBQUEsRUFDUCxZQUFZLGtCQUFBLEVBQ1osTUFBTSxZQUFBLEVBQ04sTUFBTSxZQUFBLEVBQ04sUUFBUSxjQUFBLEVBQ1IsYUFBWSxFQUFaLEtBQUssbUJBQUcsSUFBSSxLQUFBLEVBQ1osZUFBZSxFQUFmLE9BQU8sbUJBQUcsS0FBSyxLQUFBLEVBQ2YsT0FBTyxhQUFBLEVBQ1AsVUFBVSxnQkFBQSxFQUNWLFVBQVUsZ0JBQUEsRUFDVixLQUFLLFdBQUEsRUFDTCxtQkFBeUIsRUFBekIsV0FBVyxtQkFBRyxXQUFXLEtBQUEsRUFDekIsV0FBVyxpQkFBQSxFQUNYLFdBQVcsaUJBQUEsRUFDWCxTQUFTLGVBQUEsRUFDVCxPQUFPLGFBQUEsRUFDUCxZQUFZLGtCQUFBLEVBQ1osWUFBaUIsRUFBakIsSUFBSSxtQkFBRyxVQUFVLEtBQUEsRUFDakIsZ0JBQWdCLHNCQUFBLEVBQ2hCLHNCQUFtQixFQUFuQixjQUFjLG1CQUFHLEVBQUUsS0FBQSxFQUNuQixRQUFRLGNBQUEsRUFDTSxrQkFBa0Isa0JBQUEsRUFDaEMsWUFBWSxrQkFBQSxFQUNaLGNBQWMsRUFBZCxNQUFNLG1CQUFHLEtBQUssS0FBQSxFQUNkLGtCQUFrQixFQUFsQixVQUFVLG1CQUFHLEtBQUssS0FBQSxFQUNsQixnQkFBZ0IsRUFBaEIsUUFBUSxtQkFBRyxLQUFLLEtBQUEsRUFDaEIsZUFBZSxFQUFmLE9BQU8sbUJBQUcsS0FBSyxLQUFBLEVBQ2Ysd0JBQXdCLEVBQXhCLGdCQUFnQixtQkFBRyxLQUFLLEtBQUEsRUFDeEIsOEJBQTZCLEVBQTdCLHNCQUFzQixtQkFBRyxJQUFJLEtBQUEsRUFDN0IseUJBQXNCLEVBQXRCLGlCQUFpQixtQkFBRyxFQUFFLEtBQUEsRUFDdEIsd0JBQXdCLDhCQUFBLEVBQ3hCLDJCQUEyQixpQ0FBQSxFQUMzQiw2QkFBNkIsbUNBQUEsRUFDN0IsbUJBQXNCLEVBQXRCLFdBQVcsbUJBQUcsUUFBUSxLQUFBLEVBQ3RCLGNBQWMsb0JBQUE7SUFFZCwyREFBMkQ7SUFDckQsSUFBQSxLQUEwQyxRQUFRLENBQVM7UUFDL0QsSUFBSSxRQUFRO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDOUIsSUFBTSxNQUFNLEdBQUcsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqRyxJQUFJLE1BQU07WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMxQixPQUFPLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUMsQ0FBQyxFQUxLLGdCQUFnQixRQUFBLEVBQUUsbUJBQW1CLFFBSzFDLENBQUM7SUFFSCxnREFBZ0Q7SUFDaEQsU0FBUyxDQUFDO1FBQ1IsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQyxZQUFZLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFakMsd0NBQXdDO0lBQ2xDLElBQUEsS0FBMEMsUUFBUSxDQUFnQixJQUFJLENBQUMsRUFBdEUsZ0JBQWdCLFFBQUEsRUFBRSxtQkFBbUIsUUFBaUMsQ0FBQztJQUU5RSxxREFBcUQ7SUFDckQsSUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7UUFDL0IsSUFBSSxRQUFRO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDOUIsT0FBTyxnQkFBZ0IsSUFBSSxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUM7SUFDdkQsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUVqQyw2Q0FBNkM7SUFDN0MsSUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUM7UUFDbkMsc0NBQ0ssQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLEtBQ25CLFFBQVEsRUFBRSxnQkFBZ0IsS0FDdkIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQzVEO0lBQ0osQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUVuRCxtRkFBbUY7SUFDbkYsSUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDO1FBQzNCLElBQU0sZ0JBQWdCLEdBQUcsMEJBQTBCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN0RSxPQUFPLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDakUsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRTNDLElBQU0sQ0FBQyxHQUFHLFVBQUMsR0FBVyxFQUFFLFFBQWlCO1FBQ3ZDLE9BQU8sb0JBQW9CLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUM7SUFFRixJQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxjQUFNLE9BQUEsV0FBVyxJQUFJLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsQ0FBQyxFQUF2RCxDQUF1RCxFQUFFLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDdkgsSUFBQSxLQUE4QixRQUFRLENBQUMsRUFBRSxDQUFDLEVBQXpDLFVBQVUsUUFBQSxFQUFFLGFBQWEsUUFBZ0IsQ0FBQztJQUMzQyxJQUFBLEtBQTBDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBeEQsZ0JBQWdCLFFBQUEsRUFBRSxtQkFBbUIsUUFBbUIsQ0FBQztJQUMxRCxJQUFBLEtBQTBCLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBeEMsUUFBUSxRQUFBLEVBQUUsV0FBVyxRQUFtQixDQUFDO0lBQzFDLElBQUEsS0FBa0QsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFoRSxvQkFBb0IsUUFBQSxFQUFFLHVCQUF1QixRQUFtQixDQUFDO0lBQ2xFLElBQUEsS0FBc0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFwRCxjQUFjLFFBQUEsRUFBRSxpQkFBaUIsUUFBbUIsQ0FBQztJQUN0RCxJQUFBLEtBQXNDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBcEQsY0FBYyxRQUFBLEVBQUUsaUJBQWlCLFFBQW1CLENBQUM7SUFDNUQscUZBQXFGO0lBQy9FLElBQUEsS0FBc0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFwRCxjQUFjLFFBQUEsRUFBRSxpQkFBaUIsUUFBbUIsQ0FBQztJQUM1RCxvRkFBb0Y7SUFDOUUsSUFBQSxLQUFnRCxRQUFRLENBQVU7UUFDdEUsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDaEQsSUFBSSxDQUFDO1lBQUMsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLEtBQUssR0FBRyxDQUFDO1FBQUMsQ0FBQztRQUFDLFdBQU0sQ0FBQztZQUFDLE9BQU8sS0FBSyxDQUFDO1FBQUMsQ0FBQztJQUN6RyxDQUFDLENBQUMsRUFISyxtQkFBbUIsUUFBQSxFQUFFLHNCQUFzQixRQUdoRCxDQUFDO0lBQ0csSUFBQSxLQUFzQyxRQUFRLENBQWMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFyRSxjQUFjLFFBQUEsRUFBRSxpQkFBaUIsUUFBb0MsQ0FBQztJQUN2RSxJQUFBLEtBQWdELFFBQVEsQ0FBZ0IsSUFBSSxDQUFDLEVBQTVFLG1CQUFtQixRQUFBLEVBQUUsc0JBQXNCLFFBQWlDLENBQUM7SUFDcEYsSUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFpQixJQUFJLENBQUMsQ0FBQztJQUM3QyxJQUFNLFdBQVcsR0FBRyxNQUFNLENBQXNCLElBQUksQ0FBQyxDQUFDO0lBQ3RELElBQU0sU0FBUyxHQUFHLE1BQU0sQ0FBaUIsSUFBSSxDQUFDLENBQUM7SUFDekMsSUFBQSxLQUFrQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQTdDLFlBQVksUUFBQSxFQUFFLGVBQWUsUUFBZ0IsQ0FBQztJQUMvQyxJQUFBLEtBQW9DLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBbEQsYUFBYSxRQUFBLEVBQUUsZ0JBQWdCLFFBQW1CLENBQUM7SUFFcEQsSUFBQSxLQTJCRixPQUFPLENBQUM7UUFDVixPQUFPLFNBQUE7UUFDUCxZQUFZLGNBQUE7UUFDWixNQUFNLFFBQUE7UUFDTixNQUFNLFFBQUE7UUFDTixRQUFRLEVBQUUsb0JBQW9CO1FBQzlCLEtBQUssT0FBQTtRQUNMLE9BQU8sU0FBQTtRQUNQLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIsT0FBTyxTQUFBO1FBQ1AsVUFBVSxZQUFBO1FBQ1YsVUFBVSxZQUFBO1FBQ1Ysd0JBQXdCLDBCQUFBO1FBQ3hCLDJCQUEyQiw2QkFBQTtRQUMzQiw2QkFBNkIsK0JBQUE7UUFDN0IsY0FBYyxnQkFBQTtLQUNmLENBQUMsRUExQ0EsUUFBUSxjQUFBLEVBQ1IsU0FBUyxlQUFBLEVBQ1QsV0FBVyxpQkFBQSxFQUNYLGdCQUFnQixzQkFBQSxFQUNoQixVQUFVLGdCQUFBLEVBQ1YsaUJBQWlCLHVCQUFBLEVBQ2pCLGlCQUFpQix1QkFBQSxFQUNqQixnQkFBZ0Isc0JBQUEsRUFDaEIsc0JBQXNCLDRCQUFBLEVBQ3RCLGNBQWMsb0JBQUEsRUFDZCxVQUFVLGdCQUFBLEVBQ1YsZUFBZSxxQkFBQSxFQUNmLFdBQVcsaUJBQUEsRUFDWCxhQUFhLG1CQUFBLEVBQ2IsV0FBVyxpQkFBQSxFQUNTLHVCQUF1Qix3QkFBQSxFQUMzQyxPQUFPLGFBQUEsRUFDUCxxQkFBcUIsMkJBQUEsRUFDckIsbUJBQW1CLHlCQUFBLEVBQ25CLFlBQVksa0JBQUEsRUFDWixlQUFlLHFCQUFBLEVBQ2YsY0FBYyxvQkFBQSxFQUNkLG1CQUFtQix5QkFBQSxFQUNuQixlQUFlLHFCQUFBLEVBQ2YsZUFBZSxxQkFBQSxFQUNmLGVBQWUscUJBaUJmLENBQUM7SUFFRyxJQUFBLEtBQXFELG9CQUFvQixDQUFDO1FBQzlFLGFBQWEsZUFBQTtRQUNiLGVBQWUsaUJBQUE7UUFDZixlQUFlLGlCQUFBO1FBQ2YsWUFBWSxjQUFBO0tBQ2IsQ0FBQyxFQUxNLG9CQUFvQiwwQkFBQSxFQUFFLHdCQUF3Qiw4QkFLcEQsQ0FBQztJQUVHLElBQUEsS0FBdUMsbUJBQW1CLENBQUM7UUFDL0QsUUFBUSxVQUFBO1FBQ1IsYUFBYSxlQUFBO1FBQ2Isd0JBQXdCLDBCQUFBO1FBQ3hCLDBCQUEwQixFQUFFLG9CQUFvQixDQUFDLE1BQU07UUFDdkQsY0FBYyxnQkFBQTtRQUNkLGNBQWMsZ0JBQUE7UUFDZCxJQUFJLE1BQUE7S0FDTCxDQUFDLEVBUk0sY0FBYyxvQkFBQSxFQUFFLGdCQUFnQixzQkFRdEMsQ0FBQztJQUVHLElBQUEsS0FPRixrQkFBa0IsQ0FBQztRQUNyQixJQUFJLE1BQUE7UUFDSixNQUFNLFFBQUE7UUFDTixjQUFjLGdCQUFBO1FBQ2QsZ0JBQWdCLGtCQUFBO1FBQ2hCLG9CQUFvQixzQkFBQTtRQUNwQixRQUFRLFVBQUE7UUFDUixnQkFBZ0Isa0JBQUE7UUFDaEIsbUJBQW1CLHFCQUFBO1FBQ25CLHVCQUF1Qix5QkFBQTtRQUN2QixXQUFXLGFBQUE7S0FDWixDQUFDLEVBakJBLFdBQVcsaUJBQUEsRUFDWCxZQUFZLGtCQUFBLEVBQ1osWUFBWSxrQkFBQSxFQUNaLHNCQUFzQiw0QkFBQSxFQUN0QixVQUFVLGdCQUFBLEVBQ1Ysa0JBQWtCLHdCQVlsQixDQUFDO0lBRUcsSUFBQSxNQVNGLGtCQUFrQixDQUFDLEVBQUUsVUFBVSxZQUFBLEVBQUUsQ0FBQyxHQUFBLEVBQUUsQ0FBQyxFQVJ2QyxXQUFXLGtCQUFBLEVBQ1gsY0FBYyxxQkFBQSxFQUNkLGNBQWMscUJBQUEsRUFDZCxjQUFjLHFCQUFBLEVBQ2QsWUFBWSxtQkFBQSxFQUNaLGdCQUFnQix1QkFBQSxFQUNoQixzQkFBc0IsNkJBQUEsRUFDdEIsZ0JBQWdCLHVCQUN1QixDQUFDO0lBRTFDLFNBQVMsQ0FBQztRQUNSLElBQUksUUFBUTtZQUFFLE9BQU87UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEYsT0FBTztRQUNULENBQUM7UUFDRCxJQUFNLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQWxCLENBQWtCLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekQsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFFMUQsSUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUN2RCxJQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFFaEUsSUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLE9BQU8sQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUE5QixDQUE4QixDQUFDLENBQUM7SUFFakYsd0ZBQXdGO0lBQ3hGLHNGQUFzRjtJQUN0Rix1RkFBdUY7SUFDdkYsa0ZBQWtGO0lBQ2xGLHlCQUF5QjtJQUN6QixJQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLElBQUksS0FBSyxjQUFjLEVBQXpCLENBQXlCLENBQUMsQ0FBQztJQUN2RSxJQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxTQUFTLENBQUM7UUFDUixJQUNFLHNCQUFzQjtZQUN0QixjQUFjO1lBQ2QsQ0FBQyxXQUFXO1lBQ1osQ0FBQyxlQUFlO1lBQ2hCLENBQUMsY0FBYztZQUNmLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUM5QixDQUFDO1lBQ0QscUJBQXFCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNyQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUU3RyxnRkFBZ0Y7SUFDaEYsU0FBUyxDQUFDO1FBQ1IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLHFCQUFxQixDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFFckIscUZBQXFGO0lBQ3JGLHlGQUF5RjtJQUN6Rix3RkFBd0Y7SUFDeEYseUZBQXlGO0lBQ3pGLDJGQUEyRjtJQUMzRixTQUFTLENBQUM7UUFDUixpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDN0Isc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUVyQixTQUFTLENBQUM7UUFDUixZQUFZLENBQUMsT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsT0FBTyxTQUFBLEVBQUUsWUFBWSxjQUFBLEVBQUUsTUFBTSxRQUFBLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVwQyxTQUFTLENBQUM7O1FBQ1IsTUFBQSxZQUFZLENBQUMsT0FBTywwQ0FBRSxhQUFhLENBQUMsVUFBVSxhQUFWLFVBQVUsY0FBVixVQUFVLEdBQUksSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUVqQixTQUFTLENBQUM7UUFDUixJQUFJLElBQUksS0FBSyxZQUFZLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM3QyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFFM0Isd0ZBQXdGO0lBQ3hGLFNBQVMsQ0FBQztRQUNSLElBQUksSUFBSSxLQUFLLFVBQVUsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUMxQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFFM0IsZUFBZSxDQUFDO1FBQ2QsSUFBTSxrQkFBa0IsR0FBRzs7WUFDekIsZUFBZSxDQUFDLENBQUEsTUFBQSxTQUFTLENBQUMsT0FBTywwQ0FBRSxZQUFZLEtBQUksRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDO1FBQ0Ysa0JBQWtCLEVBQUUsQ0FBQztRQUNyQixJQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxjQUFNLE9BQUEsa0JBQWtCLEVBQUUsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDO1FBQ3RFLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDdEQsT0FBTztZQUNMLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1QixNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsU0FBUyxDQUFDO1FBQ1IsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxjQUFNLE9BQUEsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQXZCLENBQXVCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0QsT0FBTyxjQUFNLE9BQUEsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFuQixDQUFtQixDQUFDO0lBQ25DLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFcEIsSUFBTSxhQUFhLEdBQUc7Ozs7O29CQUNwQixJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDO3dCQUFFLHNCQUFPO29CQUNqRSxJQUFJLGFBQWE7d0JBQUUsc0JBQU87b0JBQ3BCLFVBQVUsR0FBRyxVQUFVLENBQUM7b0JBQ3hCLGFBQWEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksRUFBTixDQUFNLENBQUMsQ0FBQztvQkFFbkQsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNsQixjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ25CLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN6QixZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ2xDLENBQUM7Ozs7b0JBR08sYUFBYSxHQUF3QixFQUFFLENBQUM7b0JBRTlDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQzt3QkFDckIsYUFBYSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztvQkFDN0MsQ0FBQztvQkFFRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQzdCLGFBQWEsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxVQUFVLEVBQVosQ0FBWSxDQUFDLENBQUM7b0JBQ2pFLENBQUM7b0JBRUQscUJBQU0sV0FBVyxDQUFDLFVBQVUsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFBOztvQkFBdEYsU0FBc0YsQ0FBQzs7Ozs7O29CQUl2RixVQUFVLENBQUMsc0JBQU0sT0FBQSxNQUFBLFdBQVcsQ0FBQyxPQUFPLDBDQUFFLEtBQUssRUFBRSxDQUFBLEVBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQzs7Ozs7U0FFckQsQ0FBQztJQUVGLElBQU0sWUFBWSxHQUFHLFVBQU8sQ0FBa0I7Ozs7b0JBQzVDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDbkIscUJBQU0sYUFBYSxFQUFFLEVBQUE7O29CQUFyQixTQUFxQixDQUFDOzs7O1NBQ3ZCLENBQUM7SUFRRixvRkFBb0Y7SUFDcEYsc0ZBQXNGO0lBQ3RGLDZEQUE2RDtJQUM3RCxJQUFNLFlBQVksR0FBRyxXQUFXLENBQzlCLFVBQUMsTUFBVzs7UUFDVixJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUN6RCxJQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBTSxLQUFLLEdBQUcsTUFBQSxlQUFlLGFBQWYsZUFBZSx1QkFBZixlQUFlLENBQUcsSUFBSSxDQUFDLDBDQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFCLDZCQUNLLE1BQU0sS0FDVCxPQUFPLEVBQUUsTUFBQSxLQUFLLENBQUMsT0FBTyxtQ0FBSSxNQUFNLENBQUMsT0FBTyxFQUN4QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNsQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFNOztvQkFDdkIsSUFBTSxDQUFDLEdBQUcsQ0FBQSxDQUFDLGFBQUQsQ0FBQyx1QkFBRCxDQUFDLENBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxNQUFBLEtBQUssQ0FBQyxNQUFNLDBDQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUN2RCxJQUFJLENBQUMsQ0FBQzt3QkFBRSxPQUFPLENBQUMsQ0FBQztvQkFDakIsNkJBQ0ssQ0FBQyxLQUNKLEtBQUssRUFBRSxNQUFBLENBQUMsQ0FBQyxLQUFLLG1DQUFJLENBQUMsQ0FBQyxLQUFLLEVBQ3pCLFdBQVcsRUFBRSxNQUFBLENBQUMsQ0FBQyxXQUFXLG1DQUFJLENBQUMsQ0FBQyxXQUFXLEVBQzNDLFdBQVcsRUFBRSxNQUFBLENBQUMsQ0FBQyxXQUFXLG1DQUFJLENBQUMsQ0FBQyxXQUFXLEVBQzNDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7NEJBQy9CLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQU07O2dDQUFLLE9BQUEsdUJBQ3JCLENBQUMsS0FDSixLQUFLLEVBQUUsTUFBQSxNQUFBLENBQUMsQ0FBQyxPQUFPLDBDQUFHLE1BQU0sQ0FBQyxDQUFDLGFBQUQsQ0FBQyx1QkFBRCxDQUFDLENBQUUsS0FBSyxDQUFDLENBQUMsbUNBQUksQ0FBQyxhQUFELENBQUMsdUJBQUQsQ0FBQyxDQUFFLEtBQUssSUFDaEQsQ0FBQTs2QkFBQSxDQUFDOzRCQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUNiO2dCQUNKLENBQUMsQ0FBQztnQkFDSixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFDakI7SUFDSixDQUFDLEVBQ0QsQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUMsQ0FDcEMsQ0FBQztJQUVGLElBQU0sYUFBYSxHQUFHLFVBQ3BCLFlBQW9CO1FBRXBCLElBQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLElBQUksTUFBSyxjQUFjLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQztnQkFBQyxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQUMsQ0FBQztZQUFDLFFBQVEsVUFBVSxJQUFaLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRixJQUFNLGFBQWEsR0FBRyxVQUFDLFlBQW9CLFlBQ3pDLE9BQUEsTUFBQSxhQUFhLENBQUMsWUFBWSxDQUFDLDBDQUFFLE9BQU8sQ0FBQSxFQUFBLENBQUM7SUFFdkMsMEZBQTBGO0lBQzFGLHdGQUF3RjtJQUN4RixzRkFBc0Y7SUFDdEYscUZBQXFGO0lBQ3JGLElBQU0sZ0JBQWdCLEdBQUcsVUFDdkIsUUFBaUMsRUFDakMsWUFBb0I7O1FBRXBCLElBQU0sV0FBVyxHQUFvQyxFQUFFLENBQUM7UUFDeEQsS0FBZ0IsVUFBeUMsRUFBekMsV0FBQSxNQUFBLGFBQWEsQ0FBQyxZQUFZLENBQUMsMENBQUUsTUFBTSxtQ0FBSSxFQUFFLEVBQXpDLGNBQXlDLEVBQXpDLElBQXlDLEVBQUUsQ0FBQztZQUF2RCxJQUFNLENBQUMsU0FBQTtZQUNWLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRO2dCQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO2FBQzVCLEdBQUcsQ0FBQyxVQUFDLEVBQVk7O2dCQUFYLEdBQUcsUUFBQSxFQUFFLEtBQUssUUFBQTtZQUNmLElBQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixJQUFNLEtBQUssR0FBRyxDQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxLQUFLLEtBQUksR0FBRyxDQUFDO1lBQ2xDLElBQU0sTUFBTSxHQUFHLE1BQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLE9BQU8sMENBQUUsSUFBSSxDQUNqQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBdEMsQ0FBc0MsQ0FDOUMsQ0FBQztZQUNGLElBQU0sT0FBTyxHQUFHLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssS0FBSSxLQUFLLENBQUM7WUFDdkMsT0FBTyxVQUFHLEtBQUssZUFBSyxPQUFPLENBQUUsQ0FBQztRQUNoQyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0lBRUYsSUFBTSxnQkFBZ0IsR0FBRyxVQUFPLFFBQWlDLEVBQUUsWUFBb0I7Ozs7O29CQUNyRixJQUFJLG1CQUFtQixLQUFLLElBQUksSUFBSSxhQUFhO3dCQUFFLHNCQUFPO29CQUMxRCxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsQ0FBQzs7OztvQkFFN0IsV0FBVyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDdkQsTUFBTSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDM0MscUJBQU0sV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUFFLGFBQy9CLDJCQUEyQixFQUFFLFFBQVEsSUFDbEMsQ0FBQyxNQUFNLElBQUksRUFBRSx5QkFBeUIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUNuRCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBQTs7b0JBSDdCLFNBRzZCLENBQUM7b0JBQzlCLGlCQUFpQixDQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUEvQixDQUErQixDQUFDLENBQUM7Ozs7OztvQkFJN0Qsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7Ozs7O1NBRWhDLENBQUM7SUFFRixJQUFNLGdCQUFnQixHQUFHLFVBQU8sWUFBb0I7Ozs7O29CQUNsRCxJQUFJLG1CQUFtQixLQUFLLElBQUksSUFBSSxhQUFhO3dCQUFFLHNCQUFPO29CQUMxRCxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsQ0FBQzs7OztvQkFFN0IsTUFBTSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDM0MscUJBQU0sV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFLGFBQzdCLDJCQUEyQixFQUFFLEVBQUUsRUFDL0IsMkJBQTJCLEVBQUUsSUFBSSxJQUM5QixDQUFDLE1BQU0sSUFBSSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQ25ELGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFBOztvQkFKN0IsU0FJNkIsQ0FBQztvQkFDOUIsaUJBQWlCLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQS9CLENBQStCLENBQUMsQ0FBQzs7Ozs7O29CQUk3RCxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Ozs7U0FFaEMsQ0FBQztJQUVGLElBQU0saUJBQWlCLEdBQUcsVUFBTyxJQUFZOzs7OztvQkFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7d0JBQUUsc0JBQU87b0JBQ3pCLElBQUksYUFBYTt3QkFBRSxzQkFBTzs7OztvQkFFbEIsYUFBYSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQ3JGLHFCQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBQTs7b0JBQXJFLFNBQXFFLENBQUM7Ozs7Ozs7O1NBSXpFLENBQUM7SUFFRixJQUFNLHFCQUFxQixHQUFHLFVBQU8sUUFBc0I7Ozs7O29CQUNuRCxPQUFPLEdBQUcsa0NBQTJCLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxpQkFBYyxDQUFDOzs7O29CQUVuRixxQkFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUE7O29CQUF4RyxTQUF3RyxDQUFDOzs7Ozs7OztTQUk1RyxDQUFDO0lBRUYsOEVBQThFO0lBQzlFLGtGQUFrRjtJQUNsRiwwRUFBMEU7SUFDcEUsSUFBQSxNQUF3QyxRQUFRLENBQWdCLElBQUksQ0FBQyxFQUFwRSxlQUFlLFNBQUEsRUFBRSxrQkFBa0IsU0FBaUMsQ0FBQztJQUU1RSxJQUFNLGdCQUFnQixHQUFHLFVBQUMsS0FBWTtRQUNwQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLGdDQUFnQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSw2RUFBNkU7SUFDN0UsSUFBTSxnQkFBZ0IsR0FBRyxxQkFBcUIsQ0FBQztJQUMvQyxvRkFBb0Y7SUFDcEYsaUZBQWlGO0lBQ2pGLGdGQUFnRjtJQUNoRixJQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztJQUUzQyw2RUFBNkU7SUFDN0UsZ0ZBQWdGO0lBQ2hGLGlGQUFpRjtJQUNqRixpRkFBaUY7SUFDM0UsSUFBQSxNQUFnQyxRQUFRLENBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQXpGLFdBQVcsU0FBQSxFQUFFLGNBQWMsU0FBOEQsQ0FBQztJQUMzRixJQUFBLE1BQTRCLFFBQVEsQ0FBYSxFQUFFLENBQUMsRUFBbkQsU0FBUyxTQUFBLEVBQUUsWUFBWSxTQUE0QixDQUFDO0lBQzNELElBQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDO1FBQ3BDLE9BQU8sU0FBQTtRQUNQLE1BQU0sUUFBQTtRQUNOLFVBQVUsWUFBQTtRQUNWLE1BQU0sUUFBQTtRQUNOLE9BQU8sU0FBQTtRQUNQLGNBQWMsZ0JBQUE7UUFDZCxRQUFRLEVBQUUsZ0JBQWdCO1FBQzFCLE9BQU8sRUFBRSxnQkFBZ0I7UUFDekIsaUJBQWlCLEVBQUUsVUFBQyxJQUFJO1lBQ3RCLE9BQUEsY0FBYyxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsdUJBQU0sQ0FBQyxLQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsSUFBSSxNQUFNLEVBQUUsSUFBRyxFQUFyRSxDQUFxRSxDQUFDO1FBQTVGLENBQTRGO1FBQzlGLGtCQUFrQixFQUFFLFVBQUMsSUFBSTtZQUN2QixPQUFBLGNBQWMsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLHVCQUFNLENBQUMsS0FBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLElBQUksTUFBTSxFQUFFLElBQUcsRUFBdkUsQ0FBdUUsQ0FBQztRQUE5RixDQUE4RjtRQUNoRyxjQUFjLEVBQUUsVUFBQyxJQUFJO1lBQ25CLCtFQUErRTtZQUMvRSxZQUFZLENBQUMsVUFBQyxJQUFJLElBQUssdUNBQUksSUFBSSxVQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLFdBQS9FLENBQWdGLENBQUMsQ0FBQztZQUN6RyxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUVILGdGQUFnRjtJQUNoRixxRkFBcUY7SUFDckYsSUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDOzs7O29CQUMvQixhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2xCLGdCQUFnQixFQUFFLENBQUM7b0JBQ25CLHFCQUFNLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFBOztvQkFBbEQsU0FBa0QsQ0FBQztvQkFDbkQsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzFCLGlCQUFpQixDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztvQkFDN0Isc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdCLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQzs7OztTQUNsQixFQUFFLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBRTFDLGlGQUFpRjtJQUNqRixJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7UUFDaEMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEIsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNoQixpRkFBaUY7SUFDakYsNkVBQTZFO0lBQzdFLElBQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUM5QixTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELEtBQUssWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFFOUIsK0VBQStFO0lBQy9FLDZEQUE2RDtJQUM3RCxTQUFTLENBQUM7UUFDUixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ2hDLElBQU0sRUFBRSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLEVBQUU7WUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUM7SUFDekMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUVuRSxnRkFBZ0Y7SUFDaEYscUVBQXFFO0lBQ3JFLElBQU0sZ0JBQWdCLEdBQUcsVUFDdkIsT0FBNkIsRUFDN0IsSUFBWSxFQUNaLFVBQWtCLEVBQ2xCLEdBQVksSUFDVCxPQUFBLENBQ0gsS0FBQyxvQkFBb0IsSUFFbkIsT0FBTyxFQUFFLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxTQUFBLEVBQUUsSUFBSSxNQUFBLEVBQUUsRUFDbEYsS0FBSyxFQUFFLEtBQUssRUFDWixnQkFBZ0IsRUFBRSxLQUFLLEVBQ3ZCLFlBQVksRUFBRSxZQUFZLEVBQzFCLFFBQVEsRUFBRSxnQkFBZ0IsRUFDMUIsU0FBUyxFQUFFLFNBQVMsSUFOZixHQUFHLENBT1IsQ0FDSCxFQVZJLENBVUosQ0FBQztJQUVGLElBQU0saUJBQWlCLEdBQUcsVUFBTyxJQUFZOzs7OztvQkFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksY0FBYzt3QkFBRSxzQkFBTzs7OztvQkFHbEQsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ04scUJBQU0sWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUE7O29CQUF6RCxTQUFTLEdBQUcsU0FBNkM7b0JBQy9ELHFCQUFNLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFBOztvQkFBL0MsU0FBK0MsQ0FBQzs7OztvQkFFaEQsSUFBSSxPQUFPLEVBQUUsQ0FBQzt3QkFDWixPQUFPLENBQUMsT0FBYyxDQUFDLENBQUM7b0JBQzFCLENBQUM7OztvQkFFRCxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7U0FFNUIsQ0FBQztJQUVGLElBQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxVQUFDLFNBQWlCO1FBQ3BELE9BQU8sVUFBRyxPQUFPLGdDQUFzQixjQUFjLHVCQUFhLFNBQVMsV0FBUSxDQUFDO0lBQ3RGLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBRTlCLElBQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQztRQUMzQixJQUFNLENBQUMsR0FBMkIsRUFBRSxDQUFDO1FBQ3JDLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsaUJBQVUsVUFBVSxDQUFFLENBQUM7UUFDOUMsQ0FBQzthQUFNLENBQUM7WUFDTixDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLE1BQU07WUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBRTNCLElBQUEsTUFBc0QsUUFBUSxDQUFnQixJQUFJLENBQUMsRUFBbEYsc0JBQXNCLFNBQUEsRUFBRSx5QkFBeUIsU0FBaUMsQ0FBQztJQUMxRixJQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBUyxDQUFDLENBQUMsQ0FBQztJQUM5QyxJQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2QsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUMxQyxJQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7UUFDOUMsbUJBQW1CLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDOUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLGtCQUFrQixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksU0FBUztZQUFFLE9BQU87UUFDekMsSUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDekUseUJBQXlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUV6QixJQUFNLGdCQUFnQixHQUFHLFVBQU8sS0FBYTs7Ozs7b0JBQzNDLElBQUksYUFBYSxJQUFJLFNBQVM7d0JBQUUsc0JBQU87b0JBRXZDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDOzs7O29CQUd6QixxQkFBTSxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBQTs7b0JBQTdFLFNBQTZFLENBQUM7Ozs7Ozs7O1NBSWpGLENBQUM7SUFFRixJQUFNLHVCQUF1QixHQUFHOzs7OztvQkFDOUIsSUFBSSxTQUFTO3dCQUFFLHNCQUFPO29CQUV0QixhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2xCLGdCQUFnQixFQUFFLENBQUM7Ozs7b0JBR2pCLHFCQUFNLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFBOztvQkFBbEQsU0FBa0QsQ0FBQzs7OztvQkFFbkQsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxPQUFLLENBQUMsQ0FBQzs7Ozs7U0FFdkQsQ0FBQztJQUVGLElBQU0sdUJBQXVCLEdBQUc7UUFDOUIsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDO1lBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUFDLENBQUM7UUFBQyxRQUFRLFlBQVksSUFBZCxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDO0lBRUYsNkZBQTZGO0lBQzdGLElBQU0sb0JBQW9CLEdBQUcsVUFBTyxJQUFZOzs7OztvQkFDeEMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLE9BQU87d0JBQUUsc0JBQU87b0JBQ3JCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDOzs7O3lCQUVsQixDQUFDLGNBQWMsRUFBZix3QkFBZTtvQkFDakIscUJBQU0saUJBQWlCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUE7O29CQUFsRCxTQUFrRCxDQUFDOzt3QkFFckQscUJBQU0sV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFBOztvQkFBcEUsU0FBb0UsQ0FBQzs7Ozs7Ozs7U0FJeEUsQ0FBQztJQUVGLElBQU0sZUFBZSxHQUFHO1FBQ3RCLFdBQVcsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsSUFBSSxFQUFMLENBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQztJQUVGLElBQU0sZ0JBQWdCLEdBQUc7UUFDdkIsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQztJQUVGLElBQU0sa0JBQWtCLEdBQUc7UUFDekIsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsNEVBQTRFO1FBQzVFLDREQUE0RDtRQUM1RCxXQUFXLEVBQUUsQ0FBQztJQUNoQixDQUFDLENBQUM7SUFFRixJQUFNLGlCQUFpQixHQUFHO1FBQ3hCLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQztJQUVGLElBQU0sb0JBQW9CLEdBQUcsVUFBQyxJQUFZO1FBQ3hDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQztJQUVGLElBQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDLFVBQUMsS0FBYTtRQUN0RCxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVQLElBQU0sWUFBWSxHQUFHO1FBQ25CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO1FBQy9CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO1FBQy9CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO1FBQ2hDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO1FBQy9CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO1FBQ2hDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO1FBQ2pDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0tBQzNCLENBQUM7SUFDRixJQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztRQUNqQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDO1lBQzNDLElBQU0sU0FBTyxHQUFHLElBQUksR0FBRyxDQUNyQix1QkFBdUIsQ0FBQyxHQUFHLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQWxCLENBQWtCLENBQUMsQ0FDMUQsQ0FBQztZQUNGLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFDLElBQUksSUFBSyxPQUFBLFNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUF0QixDQUFzQixDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztJQUM5QixJQUFNLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFekQsdUJBQXVCO0lBQ3ZCLElBQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxJQUFBLFlBQVksR0FBdUQsV0FBVyxhQUFsRSxFQUFFLGVBQWUsR0FBc0MsV0FBVyxnQkFBakQsRUFBRSxTQUFTLEdBQTJCLFdBQVcsVUFBdEMsRUFBRSxVQUFVLEdBQWUsV0FBVyxXQUExQixFQUFFLFFBQVEsR0FBSyxXQUFXLFNBQWhCLENBQWlCO0lBQ3ZGLElBQU0sY0FBYyxHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFOUgsSUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsSUFBSSxjQUFjLENBQUM7SUFDM0QsSUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3pELElBQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9CLElBQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRS9CLElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLFVBQVUsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUU5RCxrQkFBa0I7SUFDbEIsSUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsRUFBRSxZQUFZLGNBQUEsRUFBRSxnQkFBZ0Isa0JBQUEsRUFBRSxXQUFXLGFBQUEsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMxRyxJQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsSUFBTSxvQkFBb0IsR0FBRyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRSxJQUFNLDBCQUEwQixHQUFHLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdFLElBQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUFBLFdBQVcsYUFBWCxXQUFXLGNBQVgsV0FBVyxHQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxtQ0FBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3RSxJQUFNLFNBQVMsR0FBRyxNQUFBLFlBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxJQUFJLEVBQUUsbUNBQUksRUFBRSxDQUFDO0lBQzdDLElBQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLG1HQUFtRztJQUNuRyxJQUFNLG9CQUFvQixHQUFHLENBQUMsWUFBWSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDM0UsSUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDMUQsSUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEQsOEZBQThGO0lBQzlGLElBQU0sV0FBVyxHQUFHLENBQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLGNBQWMsS0FBSSxTQUFTLENBQUM7SUFDdkQsSUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM5RCxJQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RCxJQUFNLDZCQUE2QixHQUFHLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25GLElBQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUQsSUFBTSxtQkFBbUIsR0FBRyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JFLElBQU0sa0JBQWtCLEdBQUcscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUQsSUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFdkQsSUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7UUFDL0IsSUFBSSxXQUFXLElBQUksR0FBRyxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDN0MsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUU1QyxJQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztRQUNqQyxJQUFNLElBQUksR0FBRyxXQUFXLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO1FBQ2hGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFFbEMsSUFBTSwyQkFBMkIsR0FBRyxPQUFPLENBQUM7UUFDMUMsT0FBTyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRXpCLElBQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDO1FBQ3JDLGdCQUFnQixrQkFBQTtRQUNoQixVQUFVLFlBQUE7UUFDVixrQkFBa0Isb0JBQUE7UUFDbEIsMkJBQTJCLDZCQUFBO1FBQzNCLFNBQVMsV0FBQTtLQUNWLENBQUMsQ0FBQztJQUVILGlGQUFpRjtJQUNqRixxRkFBcUY7SUFDckYsc0ZBQXNGO0lBQ3RGLCtEQUErRDtJQUMvRCxJQUFNLGNBQWMsR0FBRyxVQUFDLEtBQWE7UUFDbkMsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pELElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxVQUFVO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RELENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztJQUVGLElBQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQ2xDLFVBQUMsR0FBRyxFQUFFLEdBQUc7UUFDUCxPQUFBLEdBQUcsQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztJQUE5RSxDQUE4RSxDQUNqRixDQUFDO0lBRUYsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzlDLElBQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pGLElBQUksQ0FBQztvQkFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFBQyxDQUFDO2dCQUN4RSxRQUFRLFVBQVUsSUFBWixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztRQUNaLHVEQUF1RDtJQUN6RCxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFFN0MsSUFBTSxjQUFjLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksYUFBYSxJQUFJLGNBQWMsQ0FBQztJQUVqSCxJQUFNLGtCQUFrQixHQUFHO1FBQ3pCLElBQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPO1FBQ2hCLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN6QixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztRQUN6RSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxVQUFHLFNBQVMsT0FBSSxDQUFDO1FBQ25DLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEdBQUcsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3pGLENBQUMsQ0FBQztJQUVGLFNBQVMsQ0FBQztRQUNSLGtCQUFrQixFQUFFLENBQUM7SUFDdkIsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLDJCQUEyQixDQUFDLENBQUMsQ0FBQztJQUU5QyxJQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3pELElBQU0sc0JBQXNCLEdBQUcsbUJBQW1CLElBQUksQ0FDcEQsZUFBTSx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxtQkFBb0IsRUFBRSxHQUFJLENBQ3BFLENBQUM7SUFFRixJQUFNLHNCQUFzQixHQUFHLHlCQUF5QixDQUFDO1FBQ3ZELElBQUksTUFBQTtRQUNKLFlBQVksY0FBQTtRQUNaLFdBQVcsYUFBQTtRQUNYLFlBQVksY0FBQTtRQUNaLFFBQVEsVUFBQTtRQUNSLE9BQU8sU0FBQTtRQUNQLE9BQU8sU0FBQTtRQUNQLFVBQVUsWUFBQTtLQUNYLENBQUMsQ0FBQztJQUVILElBQU0sc0JBQXNCLEdBQUc7UUFDN0IsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksZUFBZSxFQUFFLENBQUM7WUFDdEcsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxDQUNMLEtBQUMsZ0JBQWdCLElBQ2Ysa0JBQWtCLEVBQUUsa0JBQWtCLEVBQ3RDLGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFDdEMsWUFBWSxFQUFFLFlBQVksRUFDMUIsS0FBSyxFQUFFLEtBQUssR0FDWixDQUNILENBQUM7SUFDSixDQUFDLENBQUM7SUFFRixJQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsT0FBTyxVQUFDLFFBQXlCLElBQUssT0FBQSw0QkFBRyxRQUFRLEdBQUksRUFBZixDQUFlLENBQUM7UUFDeEQsQ0FBQztRQUVELE9BQU8sVUFBQyxRQUF5QixJQUFLLE9BQUEsQ0FDcEMsTUFBQyx1QkFBdUIsSUFBQyxZQUFZLEVBQUUsWUFBWSxJQUFJLEVBQUUsYUFDdkQsS0FBQyxlQUFlLElBQ2QsTUFBTSxFQUFDLGdCQUFnQixFQUN2QixRQUFRLEVBQUUscUJBQXFCLEVBQy9CLGdCQUFnQixFQUFFLEtBQUssR0FDdkIsRUFDRiw0QkFBRyxRQUFRLEdBQUksSUFDUyxDQUMzQixFQVRxQyxDQVNyQyxDQUFDO0lBQ0osQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUUxQyxJQUFNLG1CQUFtQixHQUFHOztRQUFNLE9BQUEsQ0FDaEMsZUFBSyxLQUFLLHdCQUFPLGNBQWMsZ0JBQUcsWUFBc0IsSUFBRyxXQUFXLCtCQUF3QixNQUFNLGFBQ2xHLDBCQUFRLGFBQWEsR0FBUyxFQUM5QixlQUFLLFNBQVMsRUFBQyxXQUFXLEVBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxhQUczRCxlQUFLLFNBQVMsRUFBQyxnQkFBZ0IsRUFBQyxLQUFLLEVBQUUsd0JBQXdCLGFBQzVELElBQUksS0FBSyxVQUFVLElBQUksQ0FBQyxZQUFZLElBQUksV0FBVyxHQUFHLEdBQUcsSUFBSSxDQUM1RCxpQkFDRSxTQUFTLEVBQUMsb0NBQW9DLEVBQzlDLEtBQUssd0JBQU8sZUFBZSxLQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsS0FDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUMzQixLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxnQkFDbkUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxZQUVuRixVQUFVLENBQUMsQ0FBQyxDQUFDLENBQ1osS0FBQyxTQUFTLElBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUMsU0FBUyxHQUFHLENBQ3hDLENBQUMsQ0FBQyxDQUFDLENBQ0YsS0FBQyxTQUFTLElBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUMsU0FBUyxHQUFHLENBQ3hDLEdBQ00sQ0FDVixFQUVELGNBQ0UsS0FBSyxFQUFFLGVBQWUsRUFDdEIsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsWUFFN0MsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUNkLGNBQUssR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxjQUFjLEdBQUksQ0FDakUsQ0FBQyxDQUFDLENBQUMsQ0FDRiw4QkFDRSxjQUFLLEdBQUcsRUFBRSxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxJQUFJLEVBQUUsS0FBSSxRQUFRLEVBQUUsR0FBRyxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUUsU0FBUyxHQUFJLEVBQ3RFLGVBQUssS0FBSyxFQUFFLHlCQUF5QixhQUNuQyxlQUFNLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsV0FBVyxZQUFHLFdBQVcsR0FBUSxFQUMxRSxvQkFBb0IsSUFBSSxDQUN2QixjQUFLLFNBQVMsRUFBQyxnQkFBZ0IsWUFDN0IsY0FBSyxTQUFTLEVBQUMsc0JBQXNCLFlBQ25DLGVBQ0UsU0FBUyxFQUFDLHFCQUFxQixFQUMvQixLQUFLLHdCQUFPLDBCQUEwQixLQUFFLE9BQU8sRUFBRSxPQUFPLGVBRXZELGlCQUFpQixHQUNiLEdBQ0gsR0FDRixDQUNQLElBQ0csSUFDTCxDQUNKLEdBQ0csSUFDRixFQUdOLGVBQUssS0FBSyxFQUFFLHlCQUF5QixhQUNuQyxpQkFDRSxTQUFTLEVBQUMsZUFBZSxFQUN6QixLQUFLLEVBQUUsZUFBZSxFQUN0QixPQUFPLEVBQUUsZUFBZSxFQUN4QixLQUFLLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUV0QixLQUFDLGNBQWMsSUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBQyxTQUFTLEdBQUcsR0FDckMsRUFDUixJQUFJLEtBQUssVUFBVSxJQUFJLENBQ3RCLGlCQUNFLFNBQVMsRUFBQyxlQUFlLEVBQ3pCLEtBQUssRUFBRSxlQUFlLEVBQ3RCLE9BQU8sRUFBRSxjQUFNLE9BQUEsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQXhCLENBQXdCLEVBQ3ZDLEtBQUssRUFBQyxZQUFZLFlBRWxCLEtBQUMsQ0FBQyxJQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFDLFNBQVMsR0FBRyxHQUN4QixDQUNWLElBQ0csSUFDRixFQUNMLENBQUMsZ0JBQWdCLElBQUksYUFBYSxJQUFJLENBQ3JDLGNBQ0UsS0FBSyxFQUFFO3dCQUNMLFFBQVEsRUFBRSxVQUFVO3dCQUNwQixJQUFJLEVBQUUsQ0FBQzt3QkFDUCxLQUFLLEVBQUUsQ0FBQzt3QkFDUixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsWUFBWSxHQUFHLEVBQUUsQ0FBQzt3QkFDbkMsTUFBTSxFQUFFLEVBQUU7d0JBQ1YsYUFBYSxFQUFFLE1BQU07d0JBQ3JCLE1BQU0sRUFBRSxDQUFDO3dCQUNULE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDOUIsVUFBVSxFQUFFLDJCQUEyQjtxQkFDeEMsWUFFRCxjQUNFLEtBQUssRUFBRTs0QkFDTCxRQUFRLEVBQUUsVUFBVTs0QkFDcEIsSUFBSSxFQUFFLENBQUM7NEJBQ1AsR0FBRyxFQUFFLENBQUM7NEJBQ04sTUFBTSxFQUFFLEVBQUU7NEJBQ1YsS0FBSyxFQUFFLEtBQUs7NEJBQ1osTUFBTSxFQUFFLFlBQVk7NEJBQ3BCLFVBQVUsRUFDUixpQ0FBMEIsU0FBUyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsa0JBQVEsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsbUJBQVMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsbUJBQVMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsbUJBQVMsU0FBUyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsV0FBUTs0QkFDdE4sVUFBVSxFQUFFLG9CQUFvQjs0QkFDaEMsU0FBUyxFQUFFLHVIQUF1SDs0QkFDbEksWUFBWSxFQUFFLEVBQUU7eUJBQ2pCLEdBQ0QsR0FDRSxDQUNQLEVBRUEsUUFBUSxJQUFJLENBQ1gsZUFBSyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxjQUFjLGFBQ3RDLGVBQUssU0FBUyxFQUFDLGNBQWMsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsYUFDM0UsS0FBQyxTQUFTLElBQUMsSUFBSSxFQUFFLEVBQUUsR0FBSSxFQUN0QixDQUFDLENBQUMsd0JBQXdCLENBQUMsSUFDeEIsRUFDTCxJQUFJLEtBQUssWUFBWSxJQUFJLENBQ3hCLGVBQUssU0FBUyxFQUFDLGNBQWMsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsYUFDakYsS0FBQyxVQUFVLElBQUMsSUFBSSxFQUFFLEVBQUUsR0FBSSxFQUN2QixDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFDakIsQ0FDUCxFQUNBLGtCQUFrQixJQUFJLENBQ3JCLGVBQ0UsU0FBUyxFQUFDLGNBQWMsRUFDeEIsS0FBSyx3QkFBTyxhQUFhLEtBQUUsUUFBUSxFQUFFLFVBQVUsS0FDL0MsT0FBTyxFQUFFLFVBQUMsQ0FBQztnQ0FDVCxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7Z0NBQ3BCLHVCQUF1QixDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQzs0QkFDakQsQ0FBQyxhQUVELEtBQUMsS0FBSyxJQUFDLElBQUksRUFBRSxFQUFFLEdBQUksRUFDbkIsZUFBTSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFlBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFRLEVBQ3BELG9CQUFvQixJQUFJLENBQ3ZCLGNBQ0UsS0FBSyxFQUFFO3dDQUNMLFFBQVEsRUFBRSxVQUFVO3dDQUNwQixLQUFLLEVBQUUsQ0FBQzt3Q0FDUixHQUFHLEVBQUUsTUFBTTt3Q0FDWCxTQUFTLEVBQUUsS0FBSzt3Q0FDaEIsZUFBZSxFQUFFLGVBQWU7d0NBQ2hDLFlBQVksRUFBRSxNQUFNO3dDQUNwQixNQUFNLEVBQUUsbUJBQW1CO3dDQUMzQixTQUFTLEVBQUUsc0VBQXNFO3dDQUNqRixPQUFPLEVBQUUsS0FBSzt3Q0FDZCxRQUFRLEVBQUUsT0FBTzt3Q0FDakIsUUFBUSxFQUFFLE9BQU87d0NBQ2pCLFFBQVEsRUFBRSxRQUFRO3dDQUNsQixNQUFNLEVBQUUsSUFBSTtxQ0FDYixFQUNELE9BQU8sRUFBRSxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBbkIsQ0FBbUIsWUFFbEMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsQ0FDaEMsY0FFRSxLQUFLLEVBQUU7NENBQ0wsT0FBTyxFQUFFLE1BQU07NENBQ2YsVUFBVSxFQUFFLFFBQVE7NENBQ3BCLEdBQUcsRUFBRSxLQUFLOzRDQUNWLE9BQU8sRUFBRSxTQUFTOzRDQUNsQixZQUFZLEVBQUUsS0FBSzs0Q0FDbkIsS0FBSyxFQUFFLFNBQVM7NENBQ2hCLGVBQWUsRUFBRSxnQkFBZ0IsS0FBSyxJQUFJLENBQUMsSUFBSTtnREFDN0MsQ0FBQyxDQUFDLFdBQVc7Z0RBQ2IsQ0FBQyxDQUFDLGFBQWE7NENBQ2pCLE1BQU0sRUFBRSxTQUFTOzRDQUNqQixRQUFRLFVBQUE7NENBQ1IsVUFBVSxZQUFBOzRDQUNWLFVBQVUsRUFBRSw2QkFBNkI7eUNBQzFDLEVBQ0QsWUFBWSxFQUFFLFVBQUMsQ0FBQzs0Q0FDZCxJQUFJLGdCQUFnQixLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnREFDbkMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQzs0Q0FDdEQsQ0FBQzt3Q0FDSCxDQUFDLEVBQ0QsWUFBWSxFQUFFLFVBQUMsQ0FBQzs0Q0FDZCxJQUFJLGdCQUFnQixLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnREFDbkMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLGFBQWEsQ0FBQzs0Q0FDeEQsQ0FBQzt3Q0FDSCxDQUFDLEVBQ0QsT0FBTyxFQUFFLFVBQUMsQ0FBQzs0Q0FDVCxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7NENBQ3BCLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0Q0FDaEMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7NENBQy9CLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3Q0FDckIsQ0FBQyxZQUVBLElBQUksQ0FBQyxJQUFJLElBakNMLElBQUksQ0FBQyxJQUFJLENBa0NWLENBQ1AsRUFyQ2lDLENBcUNqQyxDQUFDLEdBQ0UsQ0FDUCxJQUNHLENBQ1AsSUFDRyxDQUNQLEVBRUQsZUFBSyxLQUFLLEVBQUUsZ0JBQWdCLGFBQzFCLGVBQUssS0FBSyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsYUFDbEQsc0JBQXNCLEVBQUUsRUFFeEIsQ0FBQztvQ0FDQSxJQUFNLDBCQUEwQixHQUM5QixzQkFBc0I7d0NBQ3RCLENBQUMsZUFBZTt3Q0FDaEIsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQzt3Q0FDMUQsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQzsyQ0FDM0UsY0FBYyxDQUFDO29DQUVwQixJQUFJLENBQUMsMEJBQTBCO3dDQUFFLE9BQU8sSUFBSSxDQUFDO29DQUU3QyxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztvQ0FDMUMsSUFBTSxnQkFBZ0IsR0FBZ0I7d0NBQ3BDLFdBQVcsRUFBRSxHQUFHO3dDQUNoQixVQUFVLEVBQUUsQ0FBQzt3Q0FDYixRQUFRLEVBQUUsSUFBSTt3Q0FDZCxPQUFPLEVBQUUsT0FBTzt3Q0FDaEIsSUFBSSxFQUFFLGNBQWMsSUFBSSxFQUFFO3FDQUMzQixDQUFDO29DQUVGLE9BQU8sQ0FDTCxLQUFDLG9CQUFvQixJQUVuQixPQUFPLEVBQUUsZ0JBQWdCLEVBQ3pCLEtBQUssRUFBRSxLQUFLLEVBQ1osY0FBYyxFQUFFLElBQUksRUFDcEIsaUJBQWlCLEVBQUUsS0FBSyxFQUN4QixpQkFBaUIsRUFBRSxLQUFLLEVBQ3hCLGdCQUFnQixFQUFFLEtBQUssRUFDdkIsZUFBZSxFQUFFLGVBQWUsSUFBSSxTQUFTLEVBQzdDLFlBQVksRUFBRSxZQUFZLElBQUksU0FBUyxFQUN2QyxlQUFlLEVBQUUsZUFBZSxFQUNoQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQzlCLGFBQWEsRUFBRSxpQkFBaUIsRUFDaEMsWUFBWSxFQUFFLFlBQVksRUFDMUIsUUFBUSxFQUFFLGdCQUFnQixFQUMxQixTQUFTLEVBQUUsU0FBUyxFQUNwQixhQUFhLEVBQUUsYUFBYSxJQWZ4Qix1QkFBdUIsQ0FnQjNCLENBQ0gsQ0FBQztnQ0FDSixDQUFDLENBQUMsRUFBRSxFQUNILENBQUM7b0NBQ0EsSUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFyQixDQUFxQixDQUFDLENBQUM7b0NBRXZFLHdFQUF3RTtvQ0FDeEUsMkVBQTJFO29DQUMzRSx1RUFBdUU7b0NBQ3ZFLElBQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7b0NBQ3ZDLEtBQW1CLFVBQVMsRUFBVCx1QkFBUyxFQUFULHVCQUFTLEVBQVQsSUFBUyxFQUFFLENBQUM7d0NBQTFCLElBQU0sSUFBSSxrQkFBQTt3Q0FDYixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFOzRDQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsbUJBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBRSxDQUFDLENBQUM7d0NBQ3ZFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7NENBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxnQkFBUyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFFLENBQUMsQ0FBQztvQ0FDeEUsQ0FBQztvQ0FFRCxJQUFNLGtCQUFrQixHQUFHLFVBQUMsT0FBb0I7d0NBQzlDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNOzRDQUFFLE9BQU8sS0FBSyxDQUFDO3dDQUMxQyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBRyxPQUFPLENBQUMsT0FBTyxjQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBRSxDQUFDOzRDQUFFLE9BQU8sS0FBSyxDQUFDO3dDQUN4RixPQUFPLElBQUksQ0FBQztvQ0FDZCxDQUFDLENBQUE7b0NBRUQsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUMsT0FBTyxFQUFFLEtBQUs7d0NBQzVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxjQUFjLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQzs0Q0FDbkUsSUFBSSxDQUFDO2dEQUNILElBQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dEQUMxRCwyRUFBMkU7Z0RBQzNFLHNFQUFzRTtnREFDdEUsSUFBTSxlQUFhLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnREFDaEQsSUFBTSxTQUFTLEdBQUcsQ0FBQyxjQUFjLENBQUMsZUFBYSxDQUFDLENBQUM7Z0RBQ2pELE9BQU8sQ0FDTCxlQUFpQixLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGFBQ3hHLGNBQUssS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxZQUNqRixTQUFTLElBQUksT0FBTyxHQUNqQixFQUNMLFdBQVcsS0FBSyxRQUFRLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUN2QyxLQUFDLGtCQUFrQixJQUNqQixNQUFNLEVBQUUsVUFBVSxFQUNsQixRQUFRLEVBQUUsVUFBQyxJQUFJLElBQUssT0FBQSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsZUFBYSxDQUFDLEVBQXJDLENBQXFDLEVBQ3pELFFBQVEsRUFBRSxjQUFNLE9BQUEsZ0JBQWdCLENBQUMsZUFBYSxDQUFDLEVBQS9CLENBQStCLEVBQy9DLFlBQVksRUFBRSxtQkFBbUIsS0FBSyxlQUFhLEVBQ25ELFdBQVcsRUFBRSxLQUFLLEVBQ2xCLFlBQVksRUFBRSxZQUFZLEVBQzFCLFVBQVUsRUFBRSxVQUFVLEVBQ3RCLE9BQU8sRUFBQyxNQUFNLEdBQ2QsQ0FDSCxDQUFDLENBQUMsQ0FBQyxDQUNGLGNBQUssS0FBSyxFQUFFO2dFQUNWLGVBQWUsRUFBRSxTQUFTO2dFQUMxQixZQUFZLEVBQUUsTUFBTTtnRUFDcEIsT0FBTyxFQUFFLFdBQVc7Z0VBQ3BCLFFBQVEsRUFBRSxNQUFNO2dFQUNoQixLQUFLLEVBQUUsU0FBUztnRUFDaEIsVUFBVSxZQUFBOzZEQUNYLFlBQ0UsVUFBVSxDQUFDLE9BQU8sSUFBSSw2QkFBNkIsR0FDaEQsQ0FDUCxLQTFCTyxLQUFLLENBMkJULENBQ1AsQ0FBQzs0Q0FDSixDQUFDOzRDQUFDLFdBQU0sQ0FBQztnREFDUCx1REFBdUQ7NENBQ3pELENBQUM7d0NBQ0gsQ0FBQzt3Q0FFRCxJQUFNLGlCQUFpQixHQUFHLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDO3dDQUN6RyxJQUFNLGlCQUFpQixHQUFHLEtBQUssR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLE9BQU8sQ0FBQzt3Q0FDdkYsNEVBQTRFO3dDQUM1RSwyRUFBMkU7d0NBQzNFLHdEQUF3RDt3Q0FDeEQsSUFBTSxtQkFBbUIsR0FDdkIsS0FBSyxLQUFLLGVBQWUsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLHNCQUFzQixDQUFDO3dDQUMxRyxJQUFNLGNBQWMsR0FDbEIsbUJBQW1CLElBQUksY0FBYzs0Q0FDbkMsQ0FBQyx1QkFBTSxPQUFPLEtBQUUsSUFBSSxFQUFFLGNBQWMsSUFDcEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzt3Q0FFZCxPQUFPLENBQ0wsS0FBQyxvQkFBb0IsSUFFbkIsT0FBTyxFQUFFLGNBQWMsRUFDdkIsS0FBSyxFQUFFLEtBQUssRUFDWixXQUFXLEVBQUUsT0FBTyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQ3hFLGNBQWMsRUFBRSxjQUFjLEVBQzlCLGNBQWMsRUFBRSxtQkFBbUIsRUFDbkMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQ3BDLGlCQUFpQixFQUFFLGlCQUFpQixFQUNwQyxVQUFVLEVBQUUsVUFBQyxTQUFTLEVBQUUsS0FBSyxJQUFLLE9BQUEsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBN0IsQ0FBNkIsRUFDL0QsZ0JBQWdCLEVBQUUsS0FBSyxLQUFLLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUM5RSxlQUFlLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQ2pGLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDM0UsZUFBZSxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDbEUsWUFBWSxFQUFFLGdCQUFnQixFQUM5QixhQUFhLEVBQUUsaUJBQWlCLEVBQ2hDLGlCQUFpQixFQUFFLHFCQUFxQixFQUN4QyxhQUFhLEVBQUUsS0FBSyxLQUFLLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUMzRSxZQUFZLEVBQUUsWUFBWSxFQUMxQixRQUFRLEVBQUUsZ0JBQWdCLEVBQzFCLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLGFBQWEsRUFBRSxhQUFhLEVBQzVCLGVBQWUsRUFBRSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUNuRixZQUFZLEVBQUUsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDN0Usc0JBQXNCLEVBQUUsc0JBQXNCLElBdkJ6QyxLQUFLLENBd0JWLENBQ0gsQ0FBQztvQ0FDSixDQUFDLENBQUMsQ0FBQztnQ0FDTCxDQUFDLENBQUMsRUFBRSxFQUNILGFBQWEsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQ25ELGVBQUssS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFDdkUsY0FBSyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLFlBQUcsU0FBUyxJQUFJLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBTyxFQUM1SCxjQUFLLEtBQUssRUFBRTtnREFDVixlQUFlLEVBQUUsYUFBYTtnREFDOUIsT0FBTyxFQUFFLENBQUM7Z0RBQ1YsWUFBWSxFQUFFLENBQUM7Z0RBQ2YsUUFBUSxFQUFFLE1BQU07NkNBQ2pCLFlBQ0MsY0FFRSxLQUFLLEVBQUU7b0RBQ0wsU0FBUyxFQUFFLDRCQUE0QjtvREFDdkMsVUFBVSxFQUFFLG9CQUFvQjtvREFDaEMsS0FBSyxFQUFFLFNBQVM7b0RBQ2hCLFFBQVEsRUFBRSxNQUFNO2lEQUNqQixZQUVBLG9CQUFvQixDQUFDLHdCQUF3QixDQUFDLElBQUksb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQVJuRyxVQUFHLHdCQUF3QixjQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQVNoRSxHQUNGLElBQ0YsQ0FDUCxFQUtBLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBQyxJQUFJLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FDMUIsTUFBQyxLQUFLLENBQUMsUUFBUSxlQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsRUFDbkYsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUZoRSxvQkFBYSxDQUFDLENBQUUsQ0FHcEIsQ0FDbEIsRUFMMkIsQ0FLM0IsQ0FBQyxFQUdELFNBQVMsQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO29DQUNuRCxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLHVCQUF1QixDQUFDLEVBQ2hHLFNBQVMsQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO29DQUNwRCxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLHdCQUF3QixDQUFDLEVBQ2hHLGNBQUssR0FBRyxFQUFFLGNBQWMsR0FBSSxJQUN4QixFQUNMLHNCQUFzQixJQUFJLENBQUM7NEJBQzFCLElBQU0sdUJBQXVCLEdBQzNCLENBQUMsZUFBZTtnQ0FDaEIsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQztnQ0FDMUQsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDOzRCQUNqRixPQUFPLENBQ0wsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dDQUMxQixDQUFDLGVBQWU7Z0NBQ2hCLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUM7Z0NBQzFELENBQUMsdUJBQXVCLENBQ3pCLENBQUM7d0JBQ0osQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUNOLGNBQUssS0FBSyxFQUFFLDZCQUE2QixZQUN0QyxlQUFlLENBQUMsR0FBRyxDQUFDLFVBQUMsS0FBSyxFQUFFLEtBQUssSUFBSyxPQUFBLENBQ3JDLGlCQUVFLEtBQUssRUFBRSxnQkFBZ0IsRUFDdkIsT0FBTyxFQUFFLGNBQU0sT0FBQSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBdkIsQ0FBdUIsRUFDdEMsUUFBUSxFQUFFLFNBQVMsSUFBSSxhQUFhLFlBRW5DLEtBQUssSUFMRCxLQUFLLENBTUgsQ0FDVixFQVRzQyxDQVN0QyxDQUFDLEdBQ0UsQ0FDUCxFQUVBLGNBQWMsSUFBSSxDQUNqQixlQUNFLEtBQUssRUFBRTtnQ0FDTCxNQUFNLEVBQUUsWUFBWTtnQ0FDcEIsT0FBTyxFQUFFLFdBQVc7Z0NBQ3BCLGVBQWUsRUFBRSxTQUFTO2dDQUMxQixLQUFLLEVBQUUsU0FBUztnQ0FDaEIsWUFBWSxFQUFFLE1BQU07Z0NBQ3BCLFFBQVEsVUFBQTtnQ0FDUixVQUFVLFlBQUE7Z0NBQ1YsT0FBTyxFQUFFLE1BQU07Z0NBQ2YsVUFBVSxFQUFFLFFBQVE7Z0NBQ3BCLEdBQUcsRUFBRSxLQUFLO2dDQUNWLFVBQVUsRUFBRSxDQUFDOzZCQUNkLEVBQ0QsSUFBSSxFQUFDLE9BQU8sYUFFWixLQUFDLFdBQVcsSUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBSSxFQUNuRCx5QkFBTyxjQUFjLEdBQVEsSUFDekIsQ0FDUCxFQUVBLGVBQWUsSUFBSSxDQUNsQixlQUNFLEtBQUssRUFBRTtnQ0FDTCxNQUFNLEVBQUUsWUFBWTtnQ0FDcEIsT0FBTyxFQUFFLFdBQVc7Z0NBQ3BCLGVBQWUsRUFBRSxTQUFTO2dDQUMxQixLQUFLLEVBQUUsU0FBUztnQ0FDaEIsWUFBWSxFQUFFLE1BQU07Z0NBQ3BCLFFBQVEsVUFBQTtnQ0FDUixVQUFVLFlBQUE7Z0NBQ1YsT0FBTyxFQUFFLE1BQU07Z0NBQ2YsVUFBVSxFQUFFLFFBQVE7Z0NBQ3BCLEdBQUcsRUFBRSxLQUFLO2dDQUNWLFVBQVUsRUFBRSxDQUFDOzZCQUNkLEVBQ0QsSUFBSSxFQUFDLE9BQU8sYUFFWixLQUFDLFdBQVcsSUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBSSxFQUNuRCx5QkFBTyxlQUFlLEdBQVEsSUFDMUIsQ0FDUCxFQUVBLE9BQU8sSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUNwQyxjQUFLLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUNsRyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQUMsR0FBRyxFQUFFLEtBQUssSUFBSyxPQUFBLENBQy9CLEtBQUMsaUJBQWlCLElBRWhCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUNkLFFBQVEsRUFBRSxjQUFNLE9BQUEsc0JBQXNCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBckMsQ0FBcUMsRUFDckQsU0FBUyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFIdkMsS0FBSyxDQUlWLENBQ0gsRUFQZ0MsQ0FPaEMsQ0FBQyxHQUNFLENBQ1AsRUFFQSxDQUFDLGNBQWMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQ2hDLGNBQUssS0FBSyxFQUFFLG1CQUFtQixZQUM3QixpQkFDRSxJQUFJLEVBQUMsUUFBUSxFQUNiLEtBQUssd0JBQU0sZUFBZSxLQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxZQUFBLEVBQUUsUUFBUSxVQUFBLEtBQ3hILE9BQU8sRUFBRSx1QkFBdUIsRUFDaEMsUUFBUSxFQUFFLFNBQVMsWUFFbEIsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLEdBQ3hCLEdBQ0wsQ0FDUCxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7d0JBQ3JCLHVFQUF1RTt3QkFDdkUsNkRBQTZEO3dCQUM3RCxjQUFLLEtBQUssRUFBRSxtQkFBbUIsWUFDN0IsZUFBSyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLGFBQ2xGLGVBQUssS0FBSyxFQUFFLGlCQUFpQixhQUMzQixlQUFNLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsWUFDN0QsY0FBYztvREFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixFQUFFLG1DQUFtQyxDQUFDO29EQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLGdDQUFnQyxDQUFDLEdBQzNELEVBQ1AsS0FBQyxlQUFlLElBQ2QsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQ3hCLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUM1QixPQUFPLEVBQUUsYUFBYSxFQUN0QixNQUFNLEVBQUUsV0FBVyxFQUNuQixLQUFLLEVBQUUsS0FBSyxFQUNaLFFBQVEsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLGNBQWMsR0FDckMsSUFDRSxFQUNMLHNCQUFzQixJQUFJLENBQ3pCLGNBQUssU0FBUyxFQUFDLHFCQUFxQixFQUFDLEtBQUssRUFBRSxlQUFlLFlBQ3hELHNCQUFzQixHQUNuQixDQUNQLElBQ0csR0FDRixDQUNQLENBQUMsQ0FBQyxDQUFDLENBQ0YsZUFBTSxRQUFRLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsWUFDdEQsZUFBSyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLGFBQ3BGLGVBQUssS0FBSyxFQUFFLGlCQUFpQixhQUMxQixPQUFPLElBQUksQ0FDViw4QkFDRSxpQkFDRSxJQUFJLEVBQUMsUUFBUSxFQUNiLEtBQUssRUFBRSxpQkFBaUIsRUFDeEIsS0FBSyxFQUFDLFFBQVEsRUFDZCxPQUFPLEVBQUUsc0JBQU0sT0FBQSxNQUFBLFlBQVksQ0FBQyxPQUFPLDBDQUFFLEtBQUssRUFBRSxDQUFBLEVBQUEsWUFFNUMsS0FBQyxTQUFTLElBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUMsU0FBUyxHQUFHLEdBQ2hDLEVBQ1QsZ0JBQ0UsSUFBSSxFQUFDLE1BQU0sRUFDWCxRQUFRLFFBQ1IsR0FBRyxFQUFFLFlBQVksRUFDakIsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUMxQixRQUFRLEVBQUUsZ0JBQWdCLEVBQzFCLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxHQUM1QyxJQUNELENBQ0osRUFDRCxtQkFDRSxHQUFHLEVBQUUsV0FBVyxFQUNoQixLQUFLLEVBQUUsYUFBYSxFQUNwQixTQUFTLEVBQUMsa0JBQWtCLEVBQzVCLEtBQUssRUFBRSxVQUFVLEVBQ2pCLFFBQVEsRUFBRSxVQUFDLENBQUMsSUFBSyxPQUFBLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUE3QixDQUE2QixFQUM5QyxTQUFTLEVBQUUsVUFBQyxDQUFDO29EQUNYLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7d0RBQ3JDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3REFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDOzREQUM5RixhQUFhLEVBQUUsQ0FBQzt3REFDbEIsQ0FBQztvREFDSCxDQUFDO2dEQUNILENBQUMsRUFDRCxXQUFXLEVBQUUsZ0JBQWdCLEVBQzdCLFFBQVEsRUFBRSxDQUFDLGNBQWMsSUFBSSxXQUFXLElBQUksY0FBYyxFQUMxRCxJQUFJLEVBQUUsQ0FBQyxHQUNQLEVBQ0YsY0FBSyxLQUFLLEVBQUUseUJBQXlCLFlBQ2xDLENBQUMsQ0FBQyxRQUFRLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQ3RFLGlCQUNFLElBQUksRUFBQyxRQUFRLEVBQ2IsS0FBSyx3QkFBTyxlQUFlLEdBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FDL0UsUUFBUSxFQUFFLGNBQWMsWUFFeEIsS0FBQyxPQUFPLElBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBQyxTQUFTLEdBQUcsR0FDOUMsQ0FDVixHQUNHLEVBQ0wsUUFBUSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FDbkUsS0FBQyxVQUFVLElBQ1QsWUFBWSxFQUFFLFVBQU8sSUFBVSxFQUFFLE1BQWM7Ozs7OztnRUFFM0MsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0VBQ3hCLHFCQUFNLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBQTs7Z0VBQXBDLFNBQW9DLENBQUM7Ozs7OztnRUFJckMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7O3FEQUU1QixFQUNELE9BQU8sRUFBRSxnQkFBZ0IsRUFDekIsS0FBSyxFQUFFLEtBQUssR0FDWixDQUNILElBQ0csRUFFTCxzQkFBc0IsSUFBSSxDQUN6QixjQUFLLFNBQVMsRUFBQyxxQkFBcUIsRUFBQyxLQUFLLEVBQUUsZUFBZSxZQUN4RCxzQkFBc0IsR0FDbkIsQ0FDUCxJQUNLLEdBQ0QsQ0FDUixFQUtBLFdBQVcsSUFBSSxXQUFXLEtBQUssUUFBUSxJQUFJLENBQzFDLGNBQ0UsS0FBSyxFQUFFO2dDQUNMLFFBQVEsRUFBRSxVQUFVO2dDQUNwQixLQUFLLEVBQUUsQ0FBQztnQ0FDUixNQUFNLEVBQUUsRUFBRTtnQ0FDVixPQUFPLEVBQUUsTUFBTTtnQ0FDZixhQUFhLEVBQUUsUUFBUTtnQ0FDdkIsZUFBZSxFQUFFLGVBQWUsSUFBSSxTQUFTOzZCQUM5QyxZQUVELEtBQUMsa0JBQWtCLElBQ2pCLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTSxFQUMxQixRQUFRLEVBQUUsVUFBQyxJQUFJLElBQUssT0FBQSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUF6QyxDQUF5QyxFQUM3RCxRQUFRLEVBQUUsY0FBTSxPQUFBLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBbkMsQ0FBbUMsRUFDbkQsWUFBWSxFQUFFLG1CQUFtQixLQUFLLFdBQVcsQ0FBQyxLQUFLLEVBQ3ZELFdBQVcsRUFBRSxLQUFLLEVBQ2xCLFlBQVksRUFBRSxZQUFZLEVBQzFCLFVBQVUsRUFBRSxVQUFVLEVBQ3RCLE9BQU8sRUFBQyxZQUFZLEVBQ3BCLEtBQUssRUFBRSxTQUFTLElBQUksU0FBUyxHQUM3QixHQUNFLENBQ1AsSUFDRyxFQUVOLGNBQUssS0FBSyxFQUFFLG1CQUFtQixZQUM3QixlQUFLLEtBQUssRUFBRSxrQkFBa0IsYUFDNUIsYUFBSSxLQUFLLEVBQUUsRUFBRSxVQUFVLFlBQUEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxZQUFHLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxHQUFNLEVBQ25ILFlBQUcsS0FBSyxFQUFFLEVBQUUsVUFBVSxZQUFBLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBRyxDQUFDLENBQUMsa0NBQWtDLENBQUMsR0FBSyxFQUM1SCxlQUFLLEtBQUssRUFBRSxtQkFBbUIsYUFDN0IsaUJBQVEsU0FBUyxFQUFDLHdCQUF3QixFQUFDLEtBQUssd0JBQU8scUJBQXFCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFFLEtBQUssRUFBRSxTQUFTLEtBQUksT0FBTyxFQUFFLGlCQUFpQixZQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFVLEVBQ2hMLGlCQUFRLFNBQVMsRUFBQyx3QkFBd0IsRUFBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsWUFBRyxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQVUsSUFDbEosSUFDRixHQUNGLElBQ0YsQ0FDUDtJQTltQmlDLENBOG1CakMsQ0FBQztJQUVGLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3hCLElBQU0sZ0JBQWMsR0FBRyxjQUFjLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDekQsT0FBTyxDQUNMLDhCQUVFLDBCQUFRLGFBQWEsR0FBUyxFQUM3QixDQUFDLGNBQWMsSUFBSSxDQUNsQixLQUFDLFVBQVUsSUFDVCxZQUFZLEVBQUUsWUFBWSxFQUMxQixRQUFRLEVBQUUsUUFBUSxFQUNsQixPQUFPLEVBQUUsT0FBTyxFQUNoQixPQUFPLEVBQUUsT0FBTyxFQUNoQixXQUFXLEVBQUUsV0FBVyxFQUN4QixXQUFXLEVBQUUsZ0JBQWdCLEVBQzdCLFVBQVUsRUFBRSxVQUFVLEVBQ3RCLFFBQVEsRUFBRSxRQUFRLEVBQ2xCLGNBQWMsRUFBRSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsY0FBYyxFQUNyQyxjQUFjLEVBQUUsVUFBVSxJQUFJLENBQUMsbUJBQW1CLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUM3RixNQUFNLEVBQUUsY0FBTSxPQUFBLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUF2QixDQUF1QixFQUNyQyxNQUFNLEVBQUUsb0JBQW9CLEVBQzVCLG1CQUFtQixFQUFFLHVCQUF1QixHQUM1QyxDQUNILEVBRUEsY0FBYyxJQUFJLENBQ2pCLGNBQ0UsS0FBSyxFQUFFLHNCQUFzQixFQUM3QixTQUFTLEVBQUUsZ0JBQWMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQzVELGNBQWMsRUFBRSxVQUFDLENBQUM7d0JBQ2hCLHdFQUF3RTt3QkFDeEUsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxhQUFhOzRCQUFFLE9BQU87d0JBQ3pDLElBQUksZ0JBQWM7NEJBQUUsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQy9DLENBQUMsOEJBQ3dCLFVBQVUsWUFFbEMsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUN2QyxDQUNQLElBQ0EsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO1FBQzFCLE9BQU8sQ0FDTCxjQUFLLEtBQUssRUFBRSxzQkFBc0IsOEJBQTJCLFlBQVksWUFDdEUsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUN2QyxDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0LCB1c2VNZW1vLCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENoYXRNZXNzYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9DaGF0TWVzc2FnZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50UHJldmlldyB9IGZyb20gJy4vY29tbW9uL0F0dGFjaG1lbnRQcmV2aWV3JztcbmltcG9ydCB7IHVzZUNoYXQgfSBmcm9tICcuLi9ob29rcy91c2VDaGF0JztcbmltcG9ydCB7IHVzZVNjcm9sbE1hbmFnZW1lbnQgfSBmcm9tICcuLi9ob29rcy91c2VTY3JvbGxNYW5hZ2VtZW50JztcbmltcG9ydCB7IHVzZVRoaW5raW5nQW5pbWF0aW9uIH0gZnJvbSAnLi4vaG9va3MvdXNlVGhpbmtpbmdBbmltYXRpb24nO1xuaW1wb3J0IHsgdXNlVmlld3BvcnRNYW5hZ2VyIH0gZnJvbSAnLi4vaG9va3MvdXNlVmlld3BvcnRNYW5hZ2VyJztcbmltcG9ydCB7IHVzZUZpbGVBdHRhY2htZW50cyB9IGZyb20gJy4uL2hvb2tzL3VzZUZpbGVBdHRhY2htZW50cyc7XG5pbXBvcnQgeyBDaGF0TWVzc2FnZSwgR2VuQWdlbnRDaGF0UHJvcHMsIFNjaGVkdWxlSXRlbSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFZvaWNlSW5wdXQgfSBmcm9tICcuL1ZvaWNlSW5wdXQnO1xuaW1wb3J0IHsgTGl2ZUNhbGxDb250cm9sIH0gZnJvbSAnLi9MaXZlQ2FsbENvbnRyb2wnO1xuaW1wb3J0IHsgdXNlTGl2ZVZvaWNlIGFzIHVzZUxpdmVWb2ljZVNlc3Npb24gfSBmcm9tICcuLi9ob29rcy91c2VMaXZlVm9pY2UnO1xuaW1wb3J0IHsgQXVkaW9TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXVkaW9TZXJ2aWNlJztcbmltcG9ydCB7IFBhcGVyY2xpcCwgTW9yZUhvcml6b250YWwsIFJlZnJlc2hDdywgR2xvYmUsIFgsIEFycm93VXAsIE1heGltaXplMiwgTWluaW1pemUyLCBBbGVydENpcmNsZSwgRnVsbHNjcmVlbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyBCdWJibGVEb2NrIH0gZnJvbSAnLi9CdWJibGVEb2NrJztcbmltcG9ydCBEeW5hbWljRm9ybU1lc3NhZ2UgZnJvbSAnLi9EeW5hbWljRm9ybU1lc3NhZ2UnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZWxlY3RvciB9IGZyb20gJy4vTGFuZ3VhZ2VTZWxlY3Rvcic7XG5pbXBvcnQgY2hhdExvZ28gZnJvbSAnLi4vYXNzZXRzL2NoYXQtbG9nby5wbmcnO1xuXG5pbXBvcnQge1xuICByZXNvbHZlTGFuZ3VhZ2UsXG4gIG1lcmdlVHJhbnNsYXRpb25zLFxuICBnZXRUcmFuc2xhdGlvblN0cmluZyxcbiAgZ2V0VHJhbnNsYXRpb25zRm9yTGFuZ3VhZ2UsXG59IGZyb20gJy4uL3V0aWxzL2kxOG4nO1xuaW1wb3J0IHsgR29vZ2xlUmVDYXB0Y2hhLCBHb29nbGVSZUNhcHRjaGFQcm92aWRlciB9IGZyb20gJ3JlYWN0LWdvb2dsZS1yZWNhcHRjaGEtdjMnO1xuXG5pbXBvcnQge1xuICByZXNvbHZlVGhlbWUsXG4gIGhleFRvUmdiYSxcbiAgZ2V0Q29udGFpbmVyU3R5bGUsXG4gIGdldEhlYWRlclN0eWxlLFxuICBoZWFkZXJMZWZ0Q29udGFpbmVyU3R5bGUsXG4gIGhlYWRlclJpZ2h0Q29udGFpbmVyU3R5bGUsXG4gIGhlYWRlclBpbGxTdHlsZSxcbiAgbG9nb1N0eWxlLFxuICBicmFuZExvZ29TdHlsZSxcbiAgZ2V0SGVhZGVyUGlsbFRpdGxlU3R5bGUsXG4gIGhlYWRlclBpbGxUZXh0Q29sdW1uU3R5bGUsXG4gIGdldEhlYWRlckRlc2NyaXB0aW9uVGV4dFN0eWxlLFxuICBtZW51QnV0dG9uU3R5bGUsXG4gIGdldE1lbnVQb3B1cFN0eWxlLFxuICBnZXRNZW51SXRlbVN0eWxlLFxuICBjaGF0Q29udGFpbmVyU3R5bGUsXG4gIGlucHV0Q29udGFpbmVyU3R5bGUsXG4gIGlucHV0V3JhcHBlclN0eWxlLFxuICBnZXRUZXh0QXJlYVN0eWxlLFxuICBnZXRMaXZlVm9pY2VIaW50U3R5bGUsXG4gIGF0dGFjaEJ1dHRvblN0eWxlLFxuICBnZXRTZW5kQnV0dG9uU3R5bGUsXG4gIHNlbmRCdXR0b25EaXNhYmxlZFN0eWxlLFxuICByaWdodEFjdGlvbkNvbnRhaW5lclN0eWxlLFxuICBnZXRQb3NzaWJsZVF1ZXJpZXNDb250YWluZXJTdHlsZSxcbiAgZ2V0UXVlcnlCdXR0b25TdHlsZSxcbiAgZ2V0Q29uZmlybU92ZXJsYXlTdHlsZSxcbiAgZ2V0Q29uZmlybURpYWxvZ1N0eWxlLFxuICBjb25maXJtQnV0dG9uc1N0eWxlLFxuICBnZXRDb25maXJtQnV0dG9uU3R5bGUsXG4gIGdldENvbnRlbnRDYXJkU3R5bGUsXG4gIGdldERpc2NsYWltZXJTdHlsZSxcbiAgZ2V0RmxvYXRpbmdDb250YWluZXJTdHlsZSxcbiAgQ1NTX0tFWUZSQU1FUyxcbn0gZnJvbSAnLi4vc3R5bGVzL2dlbkFnZW50Q2hhdFN0eWxlcyc7XG5cbmNvbnN0IFNIT1dfQ0hBVF9MQU5HVUFHRV9TRUxFQ1RPUiA9IHRydWU7XG5cbi8qKiBPbmUgY29tcGxldGVkIChvciBpbi1wcm9ncmVzcykgbGl2ZS12b2ljZSBleGNoYW5nZTogd2hhdCB0aGUgdXNlciBzYWlkICsgdGhlIHJlcGx5LiAqL1xudHlwZSBMaXZlVHVybiA9IHsgdXNlcjogc3RyaW5nOyBhZ2VudDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXIgfTtcblxuLyoqIEN1cnJlbnQgdGltZSBpbiBlcG9jaCBzZWNvbmRzICh0aGUgdGltZXN0YW1wIGZvcm1hdCBDaGF0TWVzc2FnZSBleHBlY3RzKS4gKi9cbmNvbnN0IG5vd1NlYyA9ICgpID0+IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG5leHBvcnQgY29uc3QgR2VuQWdlbnRDaGF0OiBSZWFjdC5GQzxHZW5BZ2VudENoYXRQcm9wcz4gPSAoe1xuICBiYXNlVXJsLFxuICB3ZWJzb2NrZXRVcmwsXG4gIGFwaUtleSxcbiAgdGVuYW50LFxuICBtZXRhZGF0YSxcbiAgdXNlV3MgPSB0cnVlLFxuICB1c2VQb2xsID0gZmFsc2UsXG4gIG9uRXJyb3IsXG4gIG9uVGFrZW92ZXIsXG4gIG9uRmluYWxpemUsXG4gIHRoZW1lLFxuICBoZWFkZXJUaXRsZSA9ICdHZW5hc3Npc3QnLFxuICBkZXNjcmlwdGlvbixcbiAgcGxhY2Vob2xkZXIsXG4gIGFnZW50TmFtZSxcbiAgbG9nb1VybCxcbiAgYnJhbmRMb2dvVXJsLFxuICBtb2RlID0gJ2VtYmVkZGVkJyxcbiAgb25FeGl0RnVsbHNjcmVlbixcbiAgZmxvYXRpbmdDb25maWcgPSB7fSxcbiAgbGFuZ3VhZ2UsXG4gIHRyYW5zbGF0aW9uczogY3VzdG9tVHJhbnNsYXRpb25zLFxuICByZUNhcHRjaGFLZXksXG4gIHdpZGdldCA9IGZhbHNlLFxuICBxdWlja0lucHV0ID0gZmFsc2UsXG4gIHVzZUF1ZGlvID0gZmFsc2UsXG4gIHVzZUZpbGUgPSBmYWxzZSxcbiAgbm9Db2xvckFuaW1hdGlvbiA9IGZhbHNlLFxuICBzaG93V2VsY29tZUJlZm9yZVN0YXJ0ID0gdHJ1ZSxcbiAgYWxsb3dlZEV4dGVuc2lvbnMgPSBbXSxcbiAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsLFxuICBmb3JtRGlzcGxheSA9ICdmb290ZXInLFxuICBvbkNvbmZpZ0xvYWRlZCxcbn0pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICAvLyBMYW5ndWFnZSBzZWxlY3Rpb24gc3RhdGUgKHdpdGggbG9jYWxTdG9yYWdlIHBlcnNpc3RlbmNlKVxuICBjb25zdCBbc2VsZWN0ZWRMYW5ndWFnZSwgc2V0U2VsZWN0ZWRMYW5ndWFnZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KCgpID0+IHtcbiAgICBpZiAobGFuZ3VhZ2UpIHJldHVybiBsYW5ndWFnZTtcbiAgICBjb25zdCBzdG9yZWQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdnZW5hc3Npc3RfbGFuZ3VhZ2UnKSA6IG51bGw7XG4gICAgaWYgKHN0b3JlZCkgcmV0dXJuIHN0b3JlZDtcbiAgICByZXR1cm4gcmVzb2x2ZUxhbmd1YWdlKCk7XG4gIH0pO1xuXG4gIC8vIFNhdmUgbGFuZ3VhZ2UgdG8gbG9jYWxTdG9yYWdlIHdoZW4gaXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAhbGFuZ3VhZ2UpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdnZW5hc3Npc3RfbGFuZ3VhZ2UnLCBzZWxlY3RlZExhbmd1YWdlKTtcbiAgICB9XG4gIH0sIFtzZWxlY3RlZExhbmd1YWdlLCBsYW5ndWFnZV0pO1xuXG4gIC8vIFN0YXRlIGZvciB0cmFja2luZyBzZWxlY3RlZCBGQVEgcXVlcnlcbiAgY29uc3QgW3NlbGVjdGVkRmFxUXVlcnksIHNldFNlbGVjdGVkRmFxUXVlcnldID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gUmVzb2x2ZSBsYW5ndWFnZTogcHJvcCA+IHNlbGVjdGVkID4gYnJvd3NlciA+ICdlbidcbiAgY29uc3QgcmVzb2x2ZWRMYW5ndWFnZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChsYW5ndWFnZSkgcmV0dXJuIGxhbmd1YWdlO1xuICAgIHJldHVybiBzZWxlY3RlZExhbmd1YWdlIHx8IHJlc29sdmVMYW5ndWFnZSgpIHx8ICdlbic7XG4gIH0sIFtsYW5ndWFnZSwgc2VsZWN0ZWRMYW5ndWFnZV0pO1xuXG4gIC8vIE1lcmdlIGxhbmd1YWdlIGFuZCBGQVEgcXVlcnkgaW50byBtZXRhZGF0YVxuICBjb25zdCBtZXRhZGF0YVdpdGhMYW5ndWFnZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4obWV0YWRhdGEgfHwge30pLFxuICAgICAgbGFuZ3VhZ2U6IHJlc29sdmVkTGFuZ3VhZ2UsXG4gICAgICAuLi4oc2VsZWN0ZWRGYXFRdWVyeSA/IHsgZmFxX3F1ZXJ5OiBzZWxlY3RlZEZhcVF1ZXJ5IH0gOiB7fSksXG4gICAgfTtcbiAgfSwgW21ldGFkYXRhLCByZXNvbHZlZExhbmd1YWdlLCBzZWxlY3RlZEZhcVF1ZXJ5XSk7XG5cbiAgLy8gR2V0IHRyYW5zbGF0aW9ucyBiYXNlZCBvbiByZXNvbHZlZCBsYW5ndWFnZSwgdGhlbiBtZXJnZSB3aXRoIGN1c3RvbSB0cmFuc2xhdGlvbnNcbiAgY29uc3QgdHJhbnNsYXRpb25zID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgYmFzZVRyYW5zbGF0aW9ucyA9IGdldFRyYW5zbGF0aW9uc0Zvckxhbmd1YWdlKHJlc29sdmVkTGFuZ3VhZ2UpO1xuICAgIHJldHVybiBtZXJnZVRyYW5zbGF0aW9ucyhjdXN0b21UcmFuc2xhdGlvbnMsIGJhc2VUcmFuc2xhdGlvbnMpO1xuICB9LCBbcmVzb2x2ZWRMYW5ndWFnZSwgY3VzdG9tVHJhbnNsYXRpb25zXSk7XG5cbiAgY29uc3QgdCA9IChrZXk6IHN0cmluZywgZmFsbGJhY2s/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBnZXRUcmFuc2xhdGlvblN0cmluZyhrZXksIHRyYW5zbGF0aW9ucywgZmFsbGJhY2spO1xuICB9O1xuXG4gIGNvbnN0IGlucHV0UGxhY2Vob2xkZXIgPSB1c2VNZW1vKCgpID0+IHBsYWNlaG9sZGVyIHx8IHQoJ2lucHV0LnBsYWNlaG9sZGVyJywgJ0FzayBhIHF1ZXN0aW9uJyksIFtwbGFjZWhvbGRlciwgdHJhbnNsYXRpb25zXSk7XG4gIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW3Nob3dSZXNldENvbmZpcm0sIHNldFNob3dSZXNldENvbmZpcm1dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2hvd01lbnUsIHNldFNob3dNZW51XSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3Nob3dMYW5ndWFnZURyb3Bkb3duLCBzZXRTaG93TGFuZ3VhZ2VEcm9wZG93bl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc1BsYXlpbmdBdWRpbywgc2V0SXNQbGF5aW5nQXVkaW9dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXNGbG9hdGluZ09wZW4sIHNldElzRmxvYXRpbmdPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgLy8gS2VlcHMgdGhlIGZsb2F0aW5nIHBhbmVsIGluIHRoZSBET00gdGhyb3VnaCBpdHMgY2xvc2UgYW5pbWF0aW9uIGJlZm9yZSB1bm1vdW50aW5nLlxuICBjb25zdCBbaXNQYW5lbE1vdW50ZWQsIHNldElzUGFuZWxNb3VudGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgLy8gUXVpY2stbWVzc2FnZSBpbnB1dCBiZXNpZGUgdGhlIGxhdW5jaGVyIGJ1YmJsZSAoZGlzbWlzc2FsIHBlcnNpc3RzIGFjcm9zcyBsb2FkcykuXG4gIGNvbnN0IFtxdWlja0lucHV0RGlzbWlzc2VkLCBzZXRRdWlja0lucHV0RGlzbWlzc2VkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZTtcbiAgICB0cnkgeyByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2dlbmFzc2lzdF9xdWlja19pbnB1dF9kaXNtaXNzZWQnKSA9PT0gJzEnOyB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG4gIH0pO1xuICBjb25zdCBbc3VibWl0dGVkRm9ybXMsIHNldFN1Ym1pdHRlZEZvcm1zXSA9IHVzZVN0YXRlPFNldDxudW1iZXI+PihuZXcgU2V0KCkpO1xuICBjb25zdCBbc3VibWl0dGluZ0Zvcm1JbmRleCwgc2V0U3VibWl0dGluZ0Zvcm1JbmRleF0gPSB1c2VTdGF0ZTxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgY29uc3QgbWVudVJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IHRleHRBcmVhUmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBoZWFkZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBbaGVhZGVySGVpZ2h0LCBzZXRIZWFkZXJIZWlnaHRdID0gdXNlU3RhdGUoNTYpO1xuICBjb25zdCBbc2hvd0JhY2tsaWdodCwgc2V0U2hvd0JhY2tsaWdodF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgY29uc3Qge1xuICAgIG1lc3NhZ2VzLFxuICAgIGlzTG9hZGluZyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICBzZW5kQXVkaW9NZXNzYWdlLFxuICAgIHVwbG9hZEZpbGUsXG4gICAgcmVzZXRDb252ZXJzYXRpb24sXG4gICAgc3RhcnRDb252ZXJzYXRpb24sXG4gICAgdHJpZ2dlclN0YXJ0Rm9ybSxcbiAgICBzaG91bGRUcmlnZ2VyU3RhcnRGb3JtLFxuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIGd1ZXN0VG9rZW4sXG4gICAgcG9zc2libGVRdWVyaWVzLFxuICAgIGlzRmluYWxpemVkLFxuICAgIGlzQWdlbnRUeXBpbmcsXG4gICAgYWRkRmVlZGJhY2ssXG4gICAgYXZhaWxhYmxlTGFuZ3VhZ2VzOiBhZ2VudEF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICBhZ2VudElkLFxuICAgIGFnZW50TGl2ZVZvaWNlRW5hYmxlZCxcbiAgICBhZ2VudExpdmVWb2ljZVJlYWR5LFxuICAgIHdlbGNvbWVUaXRsZSxcbiAgICB3ZWxjb21lSW1hZ2VVcmwsXG4gICAgd2VsY29tZU1lc3NhZ2UsXG4gICAgaW5wdXREaXNjbGFpbWVySHRtbCxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICAgIGZvcm1Ob2RlTG9jYWxlcyxcbiAgfSA9IHVzZUNoYXQoe1xuICAgIGJhc2VVcmwsXG4gICAgd2Vic29ja2V0VXJsLFxuICAgIGFwaUtleSxcbiAgICB0ZW5hbnQsXG4gICAgbWV0YWRhdGE6IG1ldGFkYXRhV2l0aExhbmd1YWdlLFxuICAgIHVzZVdzLFxuICAgIHVzZVBvbGwsXG4gICAgbGFuZ3VhZ2U6IHJlc29sdmVkTGFuZ3VhZ2UsXG4gICAgb25FcnJvcixcbiAgICBvblRha2VvdmVyLFxuICAgIG9uRmluYWxpemUsXG4gICAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICBvbkNvbmZpZ0xvYWRlZCxcbiAgfSk7XG5cbiAgY29uc3QgeyBjdXJyZW50VGhpbmtpbmdQYXJ0cywgY3VycmVudFRoaW5raW5nUGFydEluZGV4IH0gPSB1c2VUaGlua2luZ0FuaW1hdGlvbih7XG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICAgIHRyYW5zbGF0aW9ucyxcbiAgfSk7XG5cbiAgY29uc3QgeyBtZXNzYWdlc0VuZFJlZiwgY2hhdENvbnRhaW5lclJlZiB9ID0gdXNlU2Nyb2xsTWFuYWdlbWVudCh7XG4gICAgbWVzc2FnZXMsXG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICBjdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXgsXG4gICAgY3VycmVudFRoaW5raW5nUGFydHNMZW5ndGg6IGN1cnJlbnRUaGlua2luZ1BhcnRzLmxlbmd0aCxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBpc0Zsb2F0aW5nT3BlbixcbiAgICBtb2RlLFxuICB9KTtcblxuICBjb25zdCB7XG4gICAgd2luZG93V2lkdGgsXG4gICAgd2luZG93SGVpZ2h0LFxuICAgIGlzRnVsbHNjcmVlbixcbiAgICBoYW5kbGVGdWxsc2NyZWVuVG9nZ2xlLFxuICAgIGlzRXhwYW5kZWQsXG4gICAgaGFuZGxlRXhwYW5kVG9nZ2xlLFxuICB9ID0gdXNlVmlld3BvcnRNYW5hZ2VyKHtcbiAgICBtb2RlLFxuICAgIHdpZGdldCxcbiAgICBpc0Zsb2F0aW5nT3BlbixcbiAgICBzaG93UmVzZXRDb25maXJtLFxuICAgIHNob3dMYW5ndWFnZURyb3Bkb3duLFxuICAgIHNob3dNZW51LFxuICAgIG9uRXhpdEZ1bGxzY3JlZW4sXG4gICAgc2V0U2hvd1Jlc2V0Q29uZmlybSxcbiAgICBzZXRTaG93TGFuZ3VhZ2VEcm9wZG93bixcbiAgICBzZXRTaG93TWVudSxcbiAgfSk7XG5cbiAgY29uc3Qge1xuICAgIGF0dGFjaG1lbnRzLFxuICAgIHNldEF0dGFjaG1lbnRzLFxuICAgIHVwbG9hZGluZ0ZpbGVzLFxuICAgIGZpbGVFcnJvclRvYXN0LFxuICAgIGZpbGVJbnB1dFJlZixcbiAgICBoYW5kbGVGaWxlQ2hhbmdlLFxuICAgIGhhbmRsZVJlbW92ZUF0dGFjaG1lbnQsXG4gICAgY2xlYXJBdHRhY2htZW50cyxcbiAgfSA9IHVzZUZpbGVBdHRhY2htZW50cyh7IHVwbG9hZEZpbGUsIHQgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobGFuZ3VhZ2UpIHJldHVybjtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMpIHx8IGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkID0gYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nKSA9PiBsYW5nLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmICghbm9ybWFsaXplZC5pbmNsdWRlcyhzZWxlY3RlZExhbmd1YWdlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICBzZXRTZWxlY3RlZExhbmd1YWdlKG5vcm1hbGl6ZWRbMF0pO1xuICAgIH1cbiAgfSwgW2FnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLCBsYW5ndWFnZSwgc2VsZWN0ZWRMYW5ndWFnZV0pO1xuXG4gIGNvbnN0IGF1ZGlvU2VydmljZSA9IHVzZVJlZjxBdWRpb1NlcnZpY2UgfCBudWxsPihudWxsKTtcbiAgY29uc3QgcmVDYXB0Y2hhVG9rZW5SZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIGNvbnN0IGhhc1VzZXJNZXNzYWdlcyA9IG1lc3NhZ2VzLnNvbWUobWVzc2FnZSA9PiBtZXNzYWdlLnNwZWFrZXIgPT09ICdjdXN0b21lcicpO1xuXG4gIC8vIFdoZW4gYSBIdW1hbiBJbiBUaGUgTG9vcCBub2RlIHdpdGggXCJzaG93X29uX3N0YXJ0XCIgaXMgd2lyZWQgZGlyZWN0bHkgYWZ0ZXIgU3RhcnQsIHJ1blxuICAvLyB0aGUgd29ya2Zsb3cgb25jZSBhcyB0aGUgY29udmVyc2F0aW9uIG9wZW5zIHNvIGl0cyBmb3JtIGFwcGVhcnMgaW1tZWRpYXRlbHksIGJlZm9yZVxuICAvLyBhbnkgdmlzaXRvciBtZXNzYWdlLiBGaXJlcyBvbmx5IG9uIGEgZnJlc2ggY29udmVyc2F0aW9uOiBubyB2aXNpdG9yIG1lc3NhZ2VzIHlldCBhbmRcbiAgLy8gbm8gZm9ybSBhbHJlYWR5IHByZXNlbnQgKGEgd2VsY29tZSBtZXNzYWdlIG1heSBleGlzdDsgYSBwZXJzaXN0ZWQgZm9ybSBtdXN0IG5vdFxuICAvLyByZS10cmlnZ2VyIG9uIHJlbG9hZCkuXG4gIGNvbnN0IGhhc0Zvcm1SZXF1ZXN0ID0gbWVzc2FnZXMuc29tZSgobSkgPT4gbS50eXBlID09PSAnZm9ybV9yZXF1ZXN0Jyk7XG4gIGNvbnN0IHN0YXJ0Rm9ybVRyaWdnZXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgc2hvdWxkVHJpZ2dlclN0YXJ0Rm9ybSAmJlxuICAgICAgY29udmVyc2F0aW9uSWQgJiZcbiAgICAgICFpc0ZpbmFsaXplZCAmJlxuICAgICAgIWhhc1VzZXJNZXNzYWdlcyAmJlxuICAgICAgIWhhc0Zvcm1SZXF1ZXN0ICYmXG4gICAgICAhc3RhcnRGb3JtVHJpZ2dlcmVkUmVmLmN1cnJlbnRcbiAgICApIHtcbiAgICAgIHN0YXJ0Rm9ybVRyaWdnZXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHRyaWdnZXJTdGFydEZvcm0ocmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgfVxuICB9LCBbc2hvdWxkVHJpZ2dlclN0YXJ0Rm9ybSwgY29udmVyc2F0aW9uSWQsIGlzRmluYWxpemVkLCBoYXNVc2VyTWVzc2FnZXMsIGhhc0Zvcm1SZXF1ZXN0LCB0cmlnZ2VyU3RhcnRGb3JtXSk7XG5cbiAgLy8gQWxsb3cgYSBmcmVzaCB0cmlnZ2VyIGFmdGVyIGEgcmVzZXQgKG5ldyBjb252ZXJzYXRpb24gaWQgLyBjbGVhcmVkIG1lc3NhZ2VzKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNvbnZlcnNhdGlvbklkKSB7XG4gICAgICBzdGFydEZvcm1UcmlnZ2VyZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cbiAgfSwgW2NvbnZlcnNhdGlvbklkXSk7XG5cbiAgLy8gRm9ybS1zdWJtaXNzaW9uIHN0YXRlIGlzIGtleWVkIGJ5IG1lc3NhZ2UgaW5kZXgsIHdoaWNoIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoaW4gYVxuICAvLyBzaW5nbGUgY29udmVyc2F0aW9uLiBDbGVhciBpdCB3aGVuZXZlciB0aGUgY29udmVyc2F0aW9uIGNoYW5nZXMgc28gYSBmb3JtIHN1Ym1pdHRlZCBpblxuICAvLyBhIHByZXZpb3VzIGNvbnZlcnNhdGlvbiBkb2Vzbid0IG1hcmsgYSBuZXcgY29udmVyc2F0aW9uJ3MgZm9ybSAoYXQgdGhlIHNhbWUgaW5kZXgpIGFzXG4gIC8vIGFscmVhZHkgYW5zd2VyZWQg4oCUIHdoaWNoIHdvdWxkIHdyb25nbHkgaGlkZSBpdCBvbiBTdGFydCAoUmVzZXQgY2xlYXJlZCBpdCwgcGxhaW4gU3RhcnRcbiAgLy8gZGlkIG5vdCkuIFRoZSByZWxvYWQgY2FzZSBzdGF5cyBjb3JyZWN0OiBpdCByZWxpZXMgb24gaXNGb3JtQW5zd2VyZWQncyB0cmFuc2NyaXB0IGNoZWNrLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFN1Ym1pdHRlZEZvcm1zKG5ldyBTZXQoKSk7XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgfSwgW2NvbnZlcnNhdGlvbklkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhdWRpb1NlcnZpY2UuY3VycmVudCA9IG5ldyBBdWRpb1NlcnZpY2UoeyBiYXNlVXJsLCB3ZWJzb2NrZXRVcmwsIGFwaUtleSB9KTtcbiAgfSwgW2Jhc2VVcmwsIHdlYnNvY2tldFVybCwgYXBpS2V5XSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhdWRpb1NlcnZpY2UuY3VycmVudD8uc2V0R3Vlc3RUb2tlbihndWVzdFRva2VuID8/IG51bGwpO1xuICB9LCBbZ3Vlc3RUb2tlbl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG1vZGUgPT09ICdmdWxsc2NyZWVuJyAmJiAhaXNGbG9hdGluZ09wZW4pIHtcbiAgICAgIHNldElzRmxvYXRpbmdPcGVuKHRydWUpO1xuICAgIH1cbiAgfSwgW21vZGUsIGlzRmxvYXRpbmdPcGVuXSk7XG5cbiAgLy8gTW91bnQgdGhlIGZsb2F0aW5nIHBhbmVsIGFzIHNvb24gYXMgaXQgb3BlbnM7IHVubW91bnQgaGFwcGVucyBvbiBjbG9zZS1hbmltYXRpb24gZW5kLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChtb2RlID09PSAnZmxvYXRpbmcnICYmIGlzRmxvYXRpbmdPcGVuKSB7XG4gICAgICBzZXRJc1BhbmVsTW91bnRlZCh0cnVlKTtcbiAgICB9XG4gIH0sIFttb2RlLCBpc0Zsb2F0aW5nT3Blbl0pO1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlSGVhZGVySGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgc2V0SGVhZGVySGVpZ2h0KGhlYWRlclJlZi5jdXJyZW50Py5vZmZzZXRIZWlnaHQgfHwgNTYpO1xuICAgIH07XG4gICAgdXBkYXRlSGVhZGVySGVpZ2h0KCk7XG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdXBkYXRlSGVhZGVySGVpZ2h0KCkpO1xuICAgIGlmIChoZWFkZXJSZWYuY3VycmVudCkge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShoZWFkZXJSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGVIZWFkZXJIZWlnaHQpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlSGVhZGVySGVpZ2h0KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNBZ2VudFR5cGluZykge1xuICAgICAgc2V0U2hvd0JhY2tsaWdodCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHNldFNob3dCYWNrbGlnaHQoZmFsc2UpLCA0MjApO1xuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9LCBbaXNBZ2VudFR5cGluZ10pO1xuXG4gIGNvbnN0IHN1Ym1pdE1lc3NhZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlucHV0VmFsdWUudHJpbSgpID09PSAnJyAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBpZiAoaXNBZ2VudFR5cGluZykgcmV0dXJuO1xuICAgIGNvbnN0IHRleHRUb1NlbmQgPSBpbnB1dFZhbHVlO1xuICAgIGNvbnN0IGZpbGVzVG9VcGxvYWQgPSBhdHRhY2htZW50cy5tYXAoYSA9PiBhLmZpbGUpO1xuXG4gICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgc2V0QXR0YWNobWVudHMoW10pO1xuICAgIGlmIChmaWxlSW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgZmlsZUlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXh0cmFNZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgICBpZiAoc2VsZWN0ZWRGYXFRdWVyeSkge1xuICAgICAgICBleHRyYU1ldGFkYXRhLmZhcV9xdWVyeSA9IHNlbGVjdGVkRmFxUXVlcnk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWxlc1RvVXBsb2FkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXh0cmFNZXRhZGF0YS5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzLm1hcChhID0+IGEuYXR0YWNobWVudCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKHRleHRUb1NlbmQsIGZpbGVzVG9VcGxvYWQsIGV4dHJhTWV0YWRhdGEsIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0ZXh0QXJlYVJlZi5jdXJyZW50Py5mb2N1cygpLCAwKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gYXN5bmMgKGU6IFJlYWN0LkZvcm1FdmVudCkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBhd2FpdCBzdWJtaXRNZXNzYWdlKCk7XG4gIH07XG5cbiAgdHlwZSBGb3JtU2NoZW1hRmllbGQgPSB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBsYWJlbD86IHN0cmluZztcbiAgICBvcHRpb25zPzogQXJyYXk8eyB2YWx1ZT86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT47XG4gIH07XG5cbiAgLy8gT3ZlcmxheSBhIGZvcm0gc2NoZW1hIHdpdGggdGhlIHNlbGVjdGVkIGxhbmd1YWdlJ3Mgc3RyaW5ncyBmcm9tIHRoZSBsb2NhbGUgYnVuZGxlXG4gIC8vIChrZXllZCBieSBub2RlIGlkKSwgc28gYSBkaXNwbGF5ZWQgZm9ybSByZS1sb2NhbGl6ZXMgb24gbGFuZ3VhZ2Ugc3dpdGNoLiBGYWxscyBiYWNrXG4gIC8vIHRvIHRoZSBzY2hlbWEncyBvd24gc3RyaW5ncyB3aGVuIGEgdHJhbnNsYXRpb24gaXMgbWlzc2luZy5cbiAgY29uc3QgbG9jYWxpemVGb3JtID0gdXNlQ2FsbGJhY2soXG4gICAgKHNjaGVtYTogYW55KTogYW55ID0+IHtcbiAgICAgIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgIT09ICdvYmplY3QnKSByZXR1cm4gc2NoZW1hO1xuICAgICAgY29uc3QgY29kZSA9IHJlc29sdmVkTGFuZ3VhZ2UudG9Mb3dlckNhc2UoKS5zcGxpdCgnLScpWzBdO1xuICAgICAgY29uc3Qgc2xpY2UgPSBmb3JtTm9kZUxvY2FsZXM/Lltjb2RlXT8uW3NjaGVtYS5ub2RlX2lkXTtcbiAgICAgIGlmICghc2xpY2UpIHJldHVybiBzY2hlbWE7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgIG1lc3NhZ2U6IHNsaWNlLm1lc3NhZ2UgPz8gc2NoZW1hLm1lc3NhZ2UsXG4gICAgICAgIGZpZWxkczogQXJyYXkuaXNBcnJheShzY2hlbWEuZmllbGRzKVxuICAgICAgICAgID8gc2NoZW1hLmZpZWxkcy5tYXAoKGY6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZj8ubmFtZSA/IHNsaWNlLmZpZWxkcz8uW2YubmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIGlmICghdCkgcmV0dXJuIGY7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZixcbiAgICAgICAgICAgICAgICBsYWJlbDogdC5sYWJlbCA/PyBmLmxhYmVsLFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0LnBsYWNlaG9sZGVyID8/IGYucGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHQuZGVzY3JpcHRpb24gPz8gZi5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5pc0FycmF5KGYub3B0aW9ucylcbiAgICAgICAgICAgICAgICAgID8gZi5vcHRpb25zLm1hcCgobzogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgIC4uLm8sXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHQub3B0aW9ucz8uW1N0cmluZyhvPy52YWx1ZSldID8/IG8/LmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgIDogZi5vcHRpb25zLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHNjaGVtYS5maWVsZHMsXG4gICAgICB9O1xuICAgIH0sXG4gICAgW3Jlc29sdmVkTGFuZ3VhZ2UsIGZvcm1Ob2RlTG9jYWxlc10sXG4gICk7XG5cbiAgY29uc3QgZ2V0Rm9ybVNjaGVtYSA9IChcbiAgICBtZXNzYWdlSW5kZXg6IG51bWJlcixcbiAgKTogeyBub2RlX2lkPzogc3RyaW5nOyBtZXNzYWdlPzogc3RyaW5nOyBmaWVsZHM/OiBGb3JtU2NoZW1hRmllbGRbXSB9IHwgbnVsbCA9PiB7XG4gICAgY29uc3QgbXNnID0gbWVzc2FnZXNbbWVzc2FnZUluZGV4XTtcbiAgICBpZiAobXNnPy50eXBlID09PSAnZm9ybV9yZXF1ZXN0JyAmJiBtc2cudGV4dCkge1xuICAgICAgdHJ5IHsgcmV0dXJuIGxvY2FsaXplRm9ybShKU09OLnBhcnNlKG1zZy50ZXh0KSk7IH0gY2F0Y2ggeyAvKiBza2lwICovIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgY29uc3QgZ2V0Rm9ybU5vZGVJZCA9IChtZXNzYWdlSW5kZXg6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICAgIGdldEZvcm1TY2hlbWEobWVzc2FnZUluZGV4KT8ubm9kZV9pZDtcblxuICAvLyBCdWlsZCB0aGUgaHVtYW4tcmVhZGFibGUgY3VzdG9tZXIgbWVzc2FnZSBmcm9tIHRoZSBzdWJtaXR0ZWQgZm9ybS4gV2Ugc2hvdyBlYWNoIGZpZWxkJ3NcbiAgLy8gbGFiZWwsIGFuZCBmb3Igb3B0aW9uLWJhc2VkIGZpZWxkcyAoZS5nLiBzZWxlY3QpIHRoZSBjaG9zZW4gb3B0aW9uJ3MgbGFiZWwgaW5zdGVhZCBvZlxuICAvLyBpdHMgcmF3IHZhbHVlIOKAlCBib3RoIGFscmVhZHkgaW4gdGhlIGNvbnZlcnNhdGlvbiBsYW5ndWFnZSwgc2luY2UgdGhlIGZvcm0gc2NoZW1hIGlzXG4gIC8vIHRyYW5zbGF0ZWQuIFRoZSBwYXlsb2FkIChgaHVtYW5faW5fdGhlX2xvb3BfZnJvbV9mb3JtYCkga2VlcHMgdGhlIHJhdyBrZXlzL3ZhbHVlcy5cbiAgY29uc3QgYnVpbGRGb3JtU3VtbWFyeSA9IChcbiAgICBmb3JtRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgbWVzc2FnZUluZGV4OiBudW1iZXIsXG4gICk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgZmllbGRCeU5hbWU6IFJlY29yZDxzdHJpbmcsIEZvcm1TY2hlbWFGaWVsZD4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgZ2V0Rm9ybVNjaGVtYShtZXNzYWdlSW5kZXgpPy5maWVsZHMgPz8gW10pIHtcbiAgICAgIGlmIChmICYmIHR5cGVvZiBmLm5hbWUgPT09ICdzdHJpbmcnKSBmaWVsZEJ5TmFtZVtmLm5hbWVdID0gZjtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRCeU5hbWVba2V5XTtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBmaWVsZD8ubGFiZWwgfHwga2V5O1xuICAgICAgICBjb25zdCBvcHRpb24gPSBmaWVsZD8ub3B0aW9ucz8uZmluZChcbiAgICAgICAgICAobykgPT4gbyAmJiBTdHJpbmcoby52YWx1ZSkgPT09IFN0cmluZyh2YWx1ZSksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSBvcHRpb24/LmxhYmVsIHx8IHZhbHVlO1xuICAgICAgICByZXR1cm4gYCR7bGFiZWx9OiAke2Rpc3BsYXl9YDtcbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuJyk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRm9ybVN1Ym1pdCA9IGFzeW5jIChmb3JtRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1lc3NhZ2VJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKHN1Ym1pdHRpbmdGb3JtSW5kZXggIT09IG51bGwgfHwgaXNBZ2VudFR5cGluZykgcmV0dXJuO1xuICAgIHNldFN1Ym1pdHRpbmdGb3JtSW5kZXgobWVzc2FnZUluZGV4KTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3VtbWFyeVRleHQgPSBidWlsZEZvcm1TdW1tYXJ5KGZvcm1EYXRhLCBtZXNzYWdlSW5kZXgpO1xuICAgICAgY29uc3Qgbm9kZUlkID0gZ2V0Rm9ybU5vZGVJZChtZXNzYWdlSW5kZXgpO1xuICAgICAgYXdhaXQgc2VuZE1lc3NhZ2Uoc3VtbWFyeVRleHQsIFtdLCB7XG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2Zyb21fZm9ybTogZm9ybURhdGEsXG4gICAgICAgIC4uLihub2RlSWQgJiYgeyBodW1hbl9pbl90aGVfbG9vcF9ub2RlX2lkOiBub2RlSWQgfSksXG4gICAgICB9LCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICAgIHNldFN1Ym1pdHRlZEZvcm1zKChwcmV2KSA9PiBuZXcgU2V0KHByZXYpLmFkZChtZXNzYWdlSW5kZXgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFN1Ym1pdHRpbmdGb3JtSW5kZXgobnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUZvcm1DYW5jZWwgPSBhc3luYyAobWVzc2FnZUluZGV4OiBudW1iZXIpID0+IHtcbiAgICBpZiAoc3VibWl0dGluZ0Zvcm1JbmRleCAhPT0gbnVsbCB8fCBpc0FnZW50VHlwaW5nKSByZXR1cm47XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChtZXNzYWdlSW5kZXgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub2RlSWQgPSBnZXRGb3JtTm9kZUlkKG1lc3NhZ2VJbmRleCk7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZSgnU2tpcHBlZCcsIFtdLCB7XG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2Zyb21fZm9ybToge30sXG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2NhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgLi4uKG5vZGVJZCAmJiB7IGh1bWFuX2luX3RoZV9sb29wX25vZGVfaWQ6IG5vZGVJZCB9KSxcbiAgICAgIH0sIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgICAgc2V0U3VibWl0dGVkRm9ybXMoKHByZXYpID0+IG5ldyBTZXQocHJldikuYWRkKG1lc3NhZ2VJbmRleCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUXVpY2tBY3Rpb24gPSBhc3luYyAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCF0ZXh0LnRyaW0oKSkgcmV0dXJuO1xuICAgIGlmIChpc0FnZW50VHlwaW5nKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4dHJhTWV0YWRhdGEgPSBzZWxlY3RlZEZhcVF1ZXJ5ID8geyBmYXFfcXVlcnk6IHNlbGVjdGVkRmFxUXVlcnkgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKHRleHQsIFtdLCBleHRyYU1ldGFkYXRhLCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlIHF1aWNrIGFjdGlvbiBlcnJvcnMgdG8gYXZvaWQgaW50ZXJydXB0aW5nIHRoZSBmbG93XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNjaGVkdWxlQ29uZmlybSA9IGFzeW5jIChzY2hlZHVsZTogU2NoZWR1bGVJdGVtKSA9PiB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGBTY2hlZHVsZSBjb25maXJtZWQgd2l0aCAke3NjaGVkdWxlLnJlc3RhdXJhbnRzLmxlbmd0aH0gcmVzdGF1cmFudHNgO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZShzdW1tYXJ5LCBbXSwgeyBjb25maXJtU2NoZWR1bGU6IEpTT04uc3RyaW5naWZ5KHNjaGVkdWxlKSB9LCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9O1xuXG4gIC8vIE5ldXRyYWwsIHVzZXItZmFjaW5nIG5vdGljZSBzaG93biB3aGVuIGEgbGl2ZSBjYWxsIGNhbid0IHN0YXJ0IC8gZmFpbHMuIFRoZVxuICAvLyBtZXNzYWdlIGlzIGFscmVhZHkgbmV1dHJhbCAodGhlIGJhY2tlbmQgbmV2ZXIgc2VuZHMgaW50ZXJuYWwgY29uZmlnIGRldGFpbCksIHNvXG4gIC8vIGl0J3Mgc2FmZSBmb3IgcHVibGljIHdpZGdldHMg4oCUIGl0IGp1c3QgYXZvaWRzIGEgY29uZnVzaW5nIHNpbGVudCBjbG9zZS5cbiAgY29uc3QgW2xpdmVWb2ljZU5vdGljZSwgc2V0TGl2ZVZvaWNlTm90aWNlXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IGhhbmRsZVZvaWNlRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgc2V0TGl2ZVZvaWNlTm90aWNlKGVycm9yLm1lc3NhZ2UgfHwgJ1ZvaWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZScpO1xuICAgIGlmIChvbkVycm9yKSB7XG4gICAgICBvbkVycm9yKGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gVm9pY2Utb25seSBtb2RlIGlzIGRyaXZlbiBwdXJlbHkgYnkgdGhlIGFnZW50OiBpdCdzIG9uIHdoZW4gdGhlIGFnZW50J3NcbiAgLy8gd29ya2Zsb3cgY29udGFpbnMgYSBWb2ljZSBBZ2VudCBub2RlIChhdXRvLWRldGVjdGVkIGJ5IHRoZSBiYWNrZW5kIGFuZFxuICAvLyBzdXJmYWNlZCB0aHJvdWdoIGBhZ2VudExpdmVWb2ljZUVuYWJsZWRgKS4gTm8gaW50ZWdyYXRvciBwcm9wIGlzIGludm9sdmVkLlxuICBjb25zdCBsaXZlVm9pY2VFbmFibGVkID0gYWdlbnRMaXZlVm9pY2VFbmFibGVkO1xuICAvLyBXaGV0aGVyIGxpdmUgdm9pY2UgY2FuIGFjdHVhbGx5IHJ1biAoYSBHZW1pbmkgcHJvdmlkZXIgd2l0aCBhIGtleSBpcyBjb25maWd1cmVkKS5cbiAgLy8gV2hlbiBmYWxzZSB3ZSBrZWVwIHZvaWNlLW9ubHkgbW9kZSBidXQgZGlzYWJsZSB0aGUgY2FsbCBjb250cm9sIHdpdGggYSBuZXV0cmFsXG4gIC8vIG1lc3NhZ2Ug4oCUIHRoZSBzcGVjaWZpYyByZWFzb24gc3RheXMgc2VydmVyLXNpZGUsIG5ldmVyIHNob3duIHRvIHB1YmxpYyB1c2Vycy5cbiAgY29uc3QgbGl2ZVZvaWNlUmVhZHkgPSBhZ2VudExpdmVWb2ljZVJlYWR5O1xuXG4gIC8vIExpdmUgKGNvbnRpbnVvdXMpIHZvaWNlIGNvbnZlcnNhdGlvbiBhZ2FpbnN0IHRoZSBhZ2VudCdzIFZvaWNlIEFnZW50IG5vZGUuXG4gIC8vIGBsaXZlQ2FwdGlvbmAgaXMgdGhlIGluLXByb2dyZXNzIHR1cm4gKHN0cmVhbXMgYXMgeW91IHNwZWFrKTsgYGxpdmVUdXJuc2AgYXJlXG4gIC8vIGNvbXBsZXRlZCB0dXJucyBrZXB0IGxvY2FsbHkgc28gdGhleSBzdGF5IG9uIHNjcmVlbiBhY3Jvc3MgdHVybnMuIGBjcmVhdGVUaW1lYFxuICAvLyBpcyBjYXB0dXJlZCBvbmNlIHBlciB0dXJuIHNvIHRoZSBidWJibGUgdGltZXN0YW1wIGRvZXNuJ3Qgaml0dGVyIG9uIHJlLXJlbmRlci5cbiAgY29uc3QgW2xpdmVDYXB0aW9uLCBzZXRMaXZlQ2FwdGlvbl0gPSB1c2VTdGF0ZTxMaXZlVHVybj4oeyB1c2VyOiAnJywgYWdlbnQ6ICcnLCBjcmVhdGVUaW1lOiAwIH0pO1xuICBjb25zdCBbbGl2ZVR1cm5zLCBzZXRMaXZlVHVybnNdID0gdXNlU3RhdGU8TGl2ZVR1cm5bXT4oW10pO1xuICBjb25zdCBsaXZlVm9pY2UgPSB1c2VMaXZlVm9pY2VTZXNzaW9uKHtcbiAgICBiYXNlVXJsLFxuICAgIGFwaUtleSxcbiAgICBndWVzdFRva2VuLFxuICAgIHRlbmFudCxcbiAgICBhZ2VudElkLFxuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIGxhbmd1YWdlOiByZXNvbHZlZExhbmd1YWdlLFxuICAgIG9uRXJyb3I6IGhhbmRsZVZvaWNlRXJyb3IsXG4gICAgb25JbnB1dFRyYW5zY3JpcHQ6ICh0ZXh0KSA9PlxuICAgICAgc2V0TGl2ZUNhcHRpb24oKGMpID0+ICh7IC4uLmMsIHVzZXI6IGMudXNlciArIHRleHQsIGNyZWF0ZVRpbWU6IGMuY3JlYXRlVGltZSB8fCBub3dTZWMoKSB9KSksXG4gICAgb25PdXRwdXRUcmFuc2NyaXB0OiAodGV4dCkgPT5cbiAgICAgIHNldExpdmVDYXB0aW9uKChjKSA9PiAoeyAuLi5jLCBhZ2VudDogYy5hZ2VudCArIHRleHQsIGNyZWF0ZVRpbWU6IGMuY3JlYXRlVGltZSB8fCBub3dTZWMoKSB9KSksXG4gICAgb25UdXJuQ29tcGxldGU6ICh0dXJuKSA9PiB7XG4gICAgICAvLyBDb21taXQgdGhlIGZpbmlzaGVkIHR1cm4gc28gaXQgc3RheXMgdmlzaWJsZTsgY2xlYXIgdGhlIGluLXByb2dyZXNzIGNhcHRpb24uXG4gICAgICBzZXRMaXZlVHVybnMoKHByZXYpID0+IFsuLi5wcmV2LCB7IHVzZXI6IHR1cm4udHJhbnNjcmlwdCwgYWdlbnQ6IHR1cm4ucmVzcG9uc2UsIGNyZWF0ZVRpbWU6IG5vd1NlYygpIH1dKTtcbiAgICAgIHNldExpdmVDYXB0aW9uKHsgdXNlcjogJycsIGFnZW50OiAnJywgY3JlYXRlVGltZTogMCB9KTtcbiAgICB9LFxuICB9KTtcblxuICAvLyBGdWxsIGNvbnZlcnNhdGlvbiByZXNldDogbmV3IHRocmVhZCArIGNsZWFyZWQgaW5wdXQvYXR0YWNobWVudHMvZm9ybXMgYW5kIGFueVxuICAvLyBsaXZlLXZvaWNlIHRyYW5zY3JpcHQuIFNoYXJlZCBieSB0aGUgcmVzZXQtY29uZmlybSBkaWFsb2cgYW5kIHRoZSBlbmQtY2FsbCBidXR0b24uXG4gIGNvbnN0IHBlcmZvcm1SZXNldCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICBjbGVhckF0dGFjaG1lbnRzKCk7XG4gICAgYXdhaXQgcmVzZXRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgc2V0U2VsZWN0ZWRGYXFRdWVyeShudWxsKTtcbiAgICBzZXRTdWJtaXR0ZWRGb3JtcyhuZXcgU2V0KCkpO1xuICAgIHNldFN1Ym1pdHRpbmdGb3JtSW5kZXgobnVsbCk7XG4gICAgc2V0TGl2ZVR1cm5zKFtdKTtcbiAgfSwgW2NsZWFyQXR0YWNobWVudHMsIHJlc2V0Q29udmVyc2F0aW9uXSk7XG5cbiAgLy8gU3RhcnRpbmcgYSBmcmVzaCBjYWxsIGNsZWFycyB0aGUgcHJldmlvdXMgY2FsbCdzIHRyYW5zY3JpcHQgYnViYmxlcyArIGNhcHRpb24uXG4gIGNvbnN0IHN0YXJ0TGl2ZUNhbGwgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0TGl2ZVZvaWNlTm90aWNlKG51bGwpO1xuICAgIHNldExpdmVDYXB0aW9uKHsgdXNlcjogJycsIGFnZW50OiAnJywgY3JlYXRlVGltZTogMCB9KTtcbiAgICBzZXRMaXZlVHVybnMoW10pO1xuICAgIGxpdmVWb2ljZS5zdGFydCgpO1xuICB9LCBbbGl2ZVZvaWNlXSk7XG4gIC8vIEVuZGluZyBhIGNhbGwgc3RvcHMgdGhlIGF1ZGlvIHN0cmVhbSBhbmQgcmVzZXRzIHRoZSBjb252ZXJzYXRpb24g4oCUIHNhbWUgYXMgdGhlXG4gIC8vIFwicmVzZXQgY29udmVyc2F0aW9uXCIgYWN0aW9uIOKAlCBzbyB0aGUgbmV4dCBjYWxsIHN0YXJ0cyBmcm9tIGEgY2xlYW4gdGhyZWFkLlxuICBjb25zdCBlbmRMaXZlQ2FsbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBsaXZlVm9pY2Uuc3RvcCgpO1xuICAgIHNldExpdmVDYXB0aW9uKHsgdXNlcjogJycsIGFnZW50OiAnJywgY3JlYXRlVGltZTogMCB9KTtcbiAgICB2b2lkIHBlcmZvcm1SZXNldCgpO1xuICB9LCBbbGl2ZVZvaWNlLCBwZXJmb3JtUmVzZXRdKTtcblxuICAvLyBLZWVwIHRoZSBsaXZlIHRyYW5zY3JpcHQgaW4gdmlldyBhcyBpdCBncm93cyAodGhlIHNjcm9sbCBtYW5hZ2VyIG9ubHkgcmVhY3RzXG4gIC8vIHRvIGNvbW1pdHRlZCBjaGF0IG1lc3NhZ2VzLCBub3QgdGhlc2UgbG9jYWwgbGl2ZSBidWJibGVzKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWxpdmVWb2ljZS5pc0FjdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGVsID0gY2hhdENvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGlmIChlbCkgZWwuc2Nyb2xsVG9wID0gZWwuc2Nyb2xsSGVpZ2h0O1xuICB9LCBbbGl2ZUNhcHRpb24sIGxpdmVUdXJucywgbGl2ZVZvaWNlLmlzQWN0aXZlLCBjaGF0Q29udGFpbmVyUmVmXSk7XG5cbiAgLy8gUmVuZGVyIGEgc2luZ2xlIGxpdmUtdm9pY2UgYnViYmxlIChjb21taXR0ZWQgdHVybiBvciBzdHJlYW1pbmcgY2FwdGlvbikgYXMgYW5cbiAgLy8gb3JkaW5hcnkgY2hhdCBtZXNzYWdlLCBzbyBpdCBsb29rcyBpZGVudGljYWwgdG8gdGV4dC1tb2RlIGJ1YmJsZXMuXG4gIGNvbnN0IHJlbmRlckxpdmVCdWJibGUgPSAoXG4gICAgc3BlYWtlcjogJ2N1c3RvbWVyJyB8ICdhZ2VudCcsXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGNyZWF0ZVRpbWU6IG51bWJlcixcbiAgICBrZXk/OiBzdHJpbmcsXG4gICkgPT4gKFxuICAgIDxDaGF0TWVzc2FnZUNvbXBvbmVudFxuICAgICAga2V5PXtrZXl9XG4gICAgICBtZXNzYWdlPXt7IGNyZWF0ZV90aW1lOiBjcmVhdGVUaW1lLCBzdGFydF90aW1lOiAwLCBlbmRfdGltZTogMC4wMSwgc3BlYWtlciwgdGV4dCB9fVxuICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgZW5hYmxlVHlwZXdyaXRlcj17ZmFsc2V9XG4gICAgICB0cmFuc2xhdGlvbnM9e3RyYW5zbGF0aW9uc31cbiAgICAgIGxhbmd1YWdlPXtyZXNvbHZlZExhbmd1YWdlfVxuICAgICAgYWdlbnROYW1lPXthZ2VudE5hbWV9XG4gICAgLz5cbiAgKTtcblxuICBjb25zdCBwbGF5UmVzcG9uc2VBdWRpbyA9IGFzeW5jICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWF1ZGlvU2VydmljZS5jdXJyZW50IHx8IGlzUGxheWluZ0F1ZGlvKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgc2V0SXNQbGF5aW5nQXVkaW8odHJ1ZSk7XG4gICAgICBjb25zdCBhdWRpb0Jsb2IgPSBhd2FpdCBhdWRpb1NlcnZpY2UuY3VycmVudC50ZXh0VG9TcGVlY2godGV4dCk7XG4gICAgICBhd2FpdCBhdWRpb1NlcnZpY2UuY3VycmVudC5wbGF5QXVkaW8oYXVkaW9CbG9iKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgb25FcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzUGxheWluZ0F1ZGlvKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYXVkaW9VcmxCdWlsZGVyID0gdXNlQ2FsbGJhY2soKG1lc3NhZ2VJZDogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9hdWRpb2A7XG4gIH0sIFtiYXNlVXJsLCBjb252ZXJzYXRpb25JZF0pO1xuXG4gIGNvbnN0IGF1ZGlvSGVhZGVycyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGg6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBpZiAoZ3Vlc3RUb2tlbikge1xuICAgICAgaFsnQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke2d1ZXN0VG9rZW59YDtcbiAgICB9IGVsc2Uge1xuICAgICAgaFsneC1hcGkta2V5J10gPSBhcGlLZXk7XG4gICAgfVxuICAgIGlmICh0ZW5hbnQpIGhbJ3gtdGVuYW50LWlkJ10gPSB0ZW5hbnQ7XG4gICAgcmV0dXJuIGg7XG4gIH0sIFthcGlLZXksIHRlbmFudCwgZ3Vlc3RUb2tlbl0pO1xuXG4gIGNvbnN0IFthdXRvUGxheUF1ZGlvTWVzc2FnZUlkLCBzZXRBdXRvUGxheUF1ZGlvTWVzc2FnZUlkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBwcmV2TWVzc2FnZUNvdW50UmVmID0gdXNlUmVmPG51bWJlcj4oMCk7XG4gIGNvbnN0IGluaXRpYWxMb2FkRG9uZVJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF1c2VBdWRpbyB8fCAhbWVzc2FnZXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgcHJldkNvdW50ID0gcHJldk1lc3NhZ2VDb3VudFJlZi5jdXJyZW50O1xuICAgIHByZXZNZXNzYWdlQ291bnRSZWYuY3VycmVudCA9IG1lc3NhZ2VzLmxlbmd0aDtcbiAgICBpZiAoIWluaXRpYWxMb2FkRG9uZVJlZi5jdXJyZW50KSB7XG4gICAgICBpbml0aWFsTG9hZERvbmVSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPD0gcHJldkNvdW50KSByZXR1cm47XG4gICAgY29uc3QgbGFzdCA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0LnNwZWFrZXIgPT09ICdhZ2VudCcgJiYgbGFzdC50eXBlID09PSAnYXVkaW8nICYmIGxhc3QubWVzc2FnZV9pZCkge1xuICAgICAgc2V0QXV0b1BsYXlBdWRpb01lc3NhZ2VJZChsYXN0Lm1lc3NhZ2VfaWQpO1xuICAgIH1cbiAgfSwgW21lc3NhZ2VzLCB1c2VBdWRpb10pO1xuXG4gIGNvbnN0IGhhbmRsZVF1ZXJ5Q2xpY2sgPSBhc3luYyAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgIGlmIChpc0FnZW50VHlwaW5nIHx8IGlzTG9hZGluZykgcmV0dXJuO1xuXG4gICAgc2V0U2VsZWN0ZWRGYXFRdWVyeShxdWVyeSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VuZE1lc3NhZ2UocXVlcnksIFtdLCB7IGZhcV9xdWVyeTogcXVlcnkgfSwgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdGFydENvbnZlcnNhdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNMb2FkaW5nKSByZXR1cm47XG5cbiAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICBjbGVhckF0dGFjaG1lbnRzKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN0YXJ0aW5nIGNvbnZlcnNhdGlvbicsIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRGlzbWlzc1F1aWNrSW5wdXQgPSAoKSA9PiB7XG4gICAgc2V0UXVpY2tJbnB1dERpc21pc3NlZCh0cnVlKTtcbiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZ2VuYXNzaXN0X3F1aWNrX2lucHV0X2Rpc21pc3NlZCcsICcxJyk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfVxuICB9O1xuXG4gIC8vIFF1aWNrIGlucHV0IG5leHQgdG8gdGhlIGJ1YmJsZTogb3BlbiB0aGUgcGFuZWwsIHN0YXJ0IGEgY29udmVyc2F0aW9uIGlmIG5lZWRlZCwgdGhlbiBzZW5kLlxuICBjb25zdCBoYW5kbGVRdWlja0lucHV0U2VuZCA9IGFzeW5jICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0cmltbWVkID0gdGV4dC50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm47XG4gICAgc2V0SXNGbG9hdGluZ09wZW4odHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgYXdhaXQgc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZSh0cmltbWVkLCBbXSwgdW5kZWZpbmVkLCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZU1lbnVDbGljayA9ICgpID0+IHtcbiAgICBzZXRTaG93TWVudShwcmV2ID0+ICFwcmV2KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVSZXNldENsaWNrID0gKCkgPT4ge1xuICAgIHNldFNob3dNZW51KGZhbHNlKTtcbiAgICBzZXRTaG93UmVzZXRDb25maXJtKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvbmZpcm1SZXNldCA9ICgpID0+IHtcbiAgICBzZXRTaG93UmVzZXRDb25maXJtKGZhbHNlKTtcbiAgICAvLyBlbmRMaXZlQ2FsbCBzdG9wcyBhbnkgYWN0aXZlIGNhbGwgYW5kIHJ1bnMgdGhlIGZ1bGwgcmVzZXQ7IGhhcm1sZXNzIGlmIG5vXG4gICAgLy8gY2FsbCBpcyBhY3RpdmUsIHNvIGJvdGggZW50cnkgcG9pbnRzIHNoYXJlIG9uZSBjb2RlIHBhdGguXG4gICAgZW5kTGl2ZUNhbGwoKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDYW5jZWxSZXNldCA9ICgpID0+IHtcbiAgICBzZXRTaG93UmVzZXRDb25maXJtKGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVMYW5ndWFnZUNoYW5nZSA9IChsYW5nOiBzdHJpbmcpID0+IHtcbiAgICBzZXRTZWxlY3RlZExhbmd1YWdlKGxhbmcpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVJlQ2FwdGNoYVZlcmlmeSA9IHVzZUNhbGxiYWNrKCh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCA9IHRva2VuO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgYWxsTGFuZ3VhZ2VzID0gW1xuICAgIHsgY29kZTogJ2VuJywgbmFtZTogJ0VuZ2xpc2gnIH0sXG4gICAgeyBjb2RlOiAnZXMnLCBuYW1lOiAnRXNwYcOxb2wnIH0sXG4gICAgeyBjb2RlOiAnZnInLCBuYW1lOiAnRnJhbsOnYWlzJyB9LFxuICAgIHsgY29kZTogJ2RlJywgbmFtZTogJ0RldXRzY2gnIH0sXG4gICAgeyBjb2RlOiAnaXQnLCBuYW1lOiAnSXRhbGlhbm8nIH0sXG4gICAgeyBjb2RlOiAncHQnLCBuYW1lOiAnUG9ydHVndcOqcycgfSxcbiAgICB7IGNvZGU6ICd6aCcsIG5hbWU6ICfkuK3mlocnIH0sXG4gIF07XG4gIGNvbnN0IGF2YWlsYWJsZUxhbmd1YWdlcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzKSkge1xuICAgICAgY29uc3QgYWxsb3dlZCA9IG5ldyBTZXQoXG4gICAgICAgIGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLm1hcCgobGFuZykgPT4gbGFuZy50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWxsTGFuZ3VhZ2VzLmZpbHRlcigobGFuZykgPT4gYWxsb3dlZC5oYXMobGFuZy5jb2RlKSk7XG4gICAgfVxuICAgIHJldHVybiBhbGxMYW5ndWFnZXM7XG4gIH0sIFthZ2VudEF2YWlsYWJsZUxhbmd1YWdlc10pO1xuICBjb25zdCBoYXNMYW5ndWFnZU9wdGlvbnMgPSBhdmFpbGFibGVMYW5ndWFnZXMubGVuZ3RoID4gMDtcblxuICAvLyBSZXNvbHZlIHRoZW1lIHZhbHVlc1xuICBjb25zdCB0aGVtZVBhcmFtcyA9IHJlc29sdmVUaGVtZSh0aGVtZSk7XG4gIGNvbnN0IHsgcHJpbWFyeUNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IsIHRleHRDb2xvciwgZm9udEZhbWlseSwgZm9udFNpemUgfSA9IHRoZW1lUGFyYW1zO1xuICBjb25zdCBmb250U2l6ZU51bWJlciA9IHR5cGVvZiBmb250U2l6ZSA9PT0gJ3N0cmluZycgPyBwYXJzZUludChmb250U2l6ZSwgMTApIDogKHR5cGVvZiBmb250U2l6ZSA9PT0gJ251bWJlcicgPyBmb250U2l6ZSA6IDE0KTtcblxuICBjb25zdCBwb3NpdGlvbiA9IGZsb2F0aW5nQ29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xuICBjb25zdCBvZmZzZXQgPSBmbG9hdGluZ0NvbmZpZy5vZmZzZXQgfHwgeyB4OiAyMCwgeTogMjAgfTtcbiAgY29uc3Qgb2Zmc2V0WCA9IG9mZnNldC54IHx8IDIwO1xuICBjb25zdCBvZmZzZXRZID0gb2Zmc2V0LnkgfHwgMjA7XG5cbiAgY29uc3QgaXNGbG9hdGluZ0RvY2tlZCA9IG1vZGUgPT09ICdmbG9hdGluZycgJiYgIWlzRnVsbHNjcmVlbjtcblxuICAvLyBDb21wdXRlZCBzdHlsZXNcbiAgY29uc3QgY29udGFpbmVyU3R5bGUgPSBnZXRDb250YWluZXJTdHlsZSh7IGlzRnVsbHNjcmVlbiwgaXNGbG9hdGluZ0RvY2tlZCwgd2luZG93V2lkdGgsIHQ6IHRoZW1lUGFyYW1zIH0pO1xuICBjb25zdCBoZWFkZXJTdHlsZSA9IGdldEhlYWRlclN0eWxlKHRoZW1lUGFyYW1zKTtcbiAgY29uc3QgaGVhZGVyUGlsbFRpdGxlU3R5bGUgPSBnZXRIZWFkZXJQaWxsVGl0bGVTdHlsZShmb250RmFtaWx5KTtcbiAgY29uc3QgaGVhZGVyRGVzY3JpcHRpb25UZXh0U3R5bGUgPSBnZXRIZWFkZXJEZXNjcmlwdGlvblRleHRTdHlsZShmb250RmFtaWx5KTtcbiAgY29uc3QgaGVhZGVyRGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24gPz8gdCgnaGVhZGVyLnN1YnRpdGxlJykgPz8gJycpLnRyaW0oKTtcbiAgY29uc3QgYnJhbmRMb2dvID0gYnJhbmRMb2dvVXJsPy50cmltKCkgPz8gJyc7XG4gIGNvbnN0IGhhc0JyYW5kTG9nbyA9IGJyYW5kTG9nby5sZW5ndGggPiAwO1xuICAvLyBEZXNjcmlwdGlvbiByZXZlYWwgb25seSBhcHBsaWVzIHRvIHRoZSBzbWFsbC1sb2dvIGxheW91dDsgdGhlIGZ1bGwgYnJhbmQgbG9nbyByZXBsYWNlcyB0aGUgdGV4dC5cbiAgY29uc3QgaGFzSGVhZGVyRGVzY3JpcHRpb24gPSAhaGFzQnJhbmRMb2dvICYmIGhlYWRlckRlc2NyaXB0aW9uLmxlbmd0aCA+IDA7XG4gIGNvbnN0IG1lbnVQb3B1cFN0eWxlID0gZ2V0TWVudVBvcHVwU3R5bGUoYmFja2dyb3VuZENvbG9yKTtcbiAgY29uc3QgbWVudUl0ZW1TdHlsZSA9IGdldE1lbnVJdGVtU3R5bGUodGhlbWVQYXJhbXMpO1xuICAvLyBIb3ZlciBmaWxsIGZvciBtZW51IGl0ZW1zIC8gb3V0bGluZSBidXR0b25zIOKAlCB0aGVtZS1hd2FyZSwgbWF0Y2hlcyB0aGUgd2ViIGFwcCdzIGJnLWFjY2VudC5cbiAgY29uc3QgbWVudUhvdmVyQmcgPSB0aGVtZT8uc2Vjb25kYXJ5Q29sb3IgfHwgJyNmNGY0ZjUnO1xuICBjb25zdCBjb250ZW50Q2FyZFN0eWxlID0gZ2V0Q29udGVudENhcmRTdHlsZShiYWNrZ3JvdW5kQ29sb3IpO1xuICBjb25zdCBzZW5kQnV0dG9uU3R5bGUgPSBnZXRTZW5kQnV0dG9uU3R5bGUocHJpbWFyeUNvbG9yKTtcbiAgY29uc3QgcG9zc2libGVRdWVyaWVzQ29udGFpbmVyU3R5bGUgPSBnZXRQb3NzaWJsZVF1ZXJpZXNDb250YWluZXJTdHlsZShmb250RmFtaWx5KTtcbiAgY29uc3QgcXVlcnlCdXR0b25TdHlsZSA9IGdldFF1ZXJ5QnV0dG9uU3R5bGUodGhlbWVQYXJhbXMpO1xuICBjb25zdCBjb25maXJtT3ZlcmxheVN0eWxlID0gZ2V0Q29uZmlybU92ZXJsYXlTdHlsZShzaG93UmVzZXRDb25maXJtKTtcbiAgY29uc3QgY29uZmlybURpYWxvZ1N0eWxlID0gZ2V0Q29uZmlybURpYWxvZ1N0eWxlKHRoZW1lUGFyYW1zKTtcbiAgY29uc3QgZGlzY2xhaW1lclN0eWxlID0gZ2V0RGlzY2xhaW1lclN0eWxlKGZvbnRGYW1pbHkpO1xuXG4gIGNvbnN0IHRleHRBcmVhRm9udFNpemUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAod2luZG93V2lkdGggPD0gNzY4KSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMTYsIGZvbnRTaXplTnVtYmVyKSArICdweCc7XG4gICAgfVxuICAgIHJldHVybiBmb250U2l6ZTtcbiAgfSwgW3dpbmRvd1dpZHRoLCBmb250U2l6ZSwgZm9udFNpemVOdW1iZXJdKTtcblxuICBjb25zdCB0ZXh0QXJlYUxpbmVIZWlnaHQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzaXplID0gd2luZG93V2lkdGggPD0gNzY4ID8gTWF0aC5tYXgoMTYsIGZvbnRTaXplTnVtYmVyKSA6IGZvbnRTaXplTnVtYmVyO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHNpemUgKiAxLjUpO1xuICB9LCBbd2luZG93V2lkdGgsIGZvbnRTaXplTnVtYmVyXSk7XG5cbiAgY29uc3QgdGV4dEFyZWFNYXhIZWlnaHRDYWxjdWxhdGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHRleHRBcmVhTGluZUhlaWdodCAqIDM7XG4gIH0sIFt0ZXh0QXJlYUxpbmVIZWlnaHRdKTtcblxuICBjb25zdCB0ZXh0QXJlYVN0eWxlID0gZ2V0VGV4dEFyZWFTdHlsZSh7XG4gICAgdGV4dEFyZWFGb250U2l6ZSxcbiAgICBmb250RmFtaWx5LFxuICAgIHRleHRBcmVhTGluZUhlaWdodCxcbiAgICB0ZXh0QXJlYU1heEhlaWdodENhbGN1bGF0ZWQsXG4gICAgdGV4dENvbG9yLFxuICB9KTtcblxuICAvLyBBIGZvcm1fcmVxdWVzdCBpcyBcImFuc3dlcmVkXCIgb25jZSB0aGUgdmlzaXRvciBoYXMgcmVzcG9uZGVkIHRvIGl0LiBCZXNpZGVzIHRoZVxuICAvLyBvcHRpbWlzdGljIGluLXNlc3Npb24gZmxhZyAoYHN1Ym1pdHRlZEZvcm1zYCksIHdlIGFsc28gdHJlYXQgaXQgYXMgYW5zd2VyZWQgd2hlbiBhXG4gIC8vIGxhdGVyIGN1c3RvbWVyIG1lc3NhZ2UgZXhpc3RzIOKAlCB0aGF0IHN1cnZpdmVzIGEgcGFnZSByZWxvYWQgKHdoZXJlIGBzdWJtaXR0ZWRGb3Jtc2BcbiAgLy8gaXMgZ29uZSksIHNvIGEgY29tcGxldGVkIGZvcm0gbmV2ZXIgcmVhcHBlYXJzIGFmdGVyIHJlZnJlc2guXG4gIGNvbnN0IGlzRm9ybUFuc3dlcmVkID0gKGluZGV4OiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAoc3VibWl0dGVkRm9ybXMuaGFzKGluZGV4KSkgcmV0dXJuIHRydWU7XG4gICAgZm9yIChsZXQgaiA9IGluZGV4ICsgMTsgaiA8IG1lc3NhZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAobWVzc2FnZXNbal0uc3BlYWtlciA9PT0gJ2N1c3RvbWVyJykgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCBoYXNQZW5kaW5nRm9ybSA9IG1lc3NhZ2VzLnNvbWUoXG4gICAgKG1zZywgaWR4KSA9PlxuICAgICAgbXNnLnR5cGUgPT09ICdmb3JtX3JlcXVlc3QnICYmIG1zZy5zcGVha2VyID09PSAnYWdlbnQnICYmICFpc0Zvcm1BbnN3ZXJlZChpZHgpLFxuICApO1xuXG4gIGNvbnN0IHBlbmRpbmdGb3JtID0gdXNlTWVtbygoKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IG1lc3NhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBtc2cgPSBtZXNzYWdlc1tpXTtcbiAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2Zvcm1fcmVxdWVzdCcgJiYgbXNnLnNwZWFrZXIgPT09ICdhZ2VudCcgJiYgIWlzRm9ybUFuc3dlcmVkKGkpKSB7XG4gICAgICAgIHRyeSB7IHJldHVybiB7IHNjaGVtYTogbG9jYWxpemVGb3JtKEpTT04ucGFyc2UobXNnLnRleHQpKSwgaW5kZXg6IGkgfTsgfVxuICAgICAgICBjYXRjaCB7IC8qIHNraXAgKi8gfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFttZXNzYWdlcywgc3VibWl0dGVkRm9ybXMsIGxvY2FsaXplRm9ybV0pO1xuXG4gIGNvbnN0IGlzU2VuZERpc2FibGVkID0gKGlucHV0VmFsdWUudHJpbSgpID09PSAnJyAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHx8IGlzQWdlbnRUeXBpbmcgfHwgaGFzUGVuZGluZ0Zvcm07XG5cbiAgY29uc3QgYXV0b1Jlc2l6ZVRleHRBcmVhID0gKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gdGV4dEFyZWFSZWYuY3VycmVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWluKGVsLnNjcm9sbEhlaWdodCwgdGV4dEFyZWFNYXhIZWlnaHRDYWxjdWxhdGVkKTtcbiAgICBlbC5zdHlsZS5oZWlnaHQgPSBgJHtuZXdIZWlnaHR9cHhgO1xuICAgIGVsLnN0eWxlLm92ZXJmbG93WSA9IGVsLnNjcm9sbEhlaWdodCA+IHRleHRBcmVhTWF4SGVpZ2h0Q2FsY3VsYXRlZCA/ICdhdXRvJyA6ICdoaWRkZW4nO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXV0b1Jlc2l6ZVRleHRBcmVhKCk7XG4gIH0sIFtpbnB1dFZhbHVlLCB0ZXh0QXJlYU1heEhlaWdodENhbGN1bGF0ZWRdKTtcblxuICBjb25zdCBzaG93QWdlbnREaXNjbGFpbWVyID0gQm9vbGVhbihpbnB1dERpc2NsYWltZXJIdG1sKTtcbiAgY29uc3QgYWdlbnREaXNjbGFpbWVyQ29udGVudCA9IHNob3dBZ2VudERpc2NsYWltZXIgJiYgKFxuICAgIDxzcGFuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogaW5wdXREaXNjbGFpbWVySHRtbCEgfX0gLz5cbiAgKTtcblxuICBjb25zdCBmbG9hdGluZ0NvbnRhaW5lclN0eWxlID0gZ2V0RmxvYXRpbmdDb250YWluZXJTdHlsZSh7XG4gICAgbW9kZSxcbiAgICBpc0Z1bGxzY3JlZW4sXG4gICAgd2luZG93V2lkdGgsXG4gICAgd2luZG93SGVpZ2h0LFxuICAgIHBvc2l0aW9uLFxuICAgIG9mZnNldFgsXG4gICAgb2Zmc2V0WSxcbiAgICBpc0V4cGFuZGVkLFxuICB9KTtcblxuICBjb25zdCByZW5kZXJMYW5ndWFnZVNlbGVjdG9yID0gKCkgPT4ge1xuICAgIGlmICghU0hPV19DSEFUX0xBTkdVQUdFX1NFTEVDVE9SKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0xhbmd1YWdlT3B0aW9ucyB8fCAoY29udmVyc2F0aW9uSWQgJiYgIWlzRmluYWxpemVkKSB8fCBtZXNzYWdlcy5sZW5ndGggPiAwIHx8IGhhc1VzZXJNZXNzYWdlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8TGFuZ3VhZ2VTZWxlY3RvclxuICAgICAgICBhdmFpbGFibGVMYW5ndWFnZXM9e2F2YWlsYWJsZUxhbmd1YWdlc31cbiAgICAgICAgc2VsZWN0ZWRMYW5ndWFnZT17cmVzb2x2ZWRMYW5ndWFnZX1cbiAgICAgICAgb25MYW5ndWFnZUNoYW5nZT17aGFuZGxlTGFuZ3VhZ2VDaGFuZ2V9XG4gICAgICAgIHRyYW5zbGF0aW9ucz17dHJhbnNsYXRpb25zfVxuICAgICAgICB0aGVtZT17dGhlbWV9XG4gICAgICAvPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyV2l0aFJlQ2FwdGNoYSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghcmVDYXB0Y2hhS2V5KSB7XG4gICAgICByZXR1cm4gKGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUpID0+IDw+e2NoaWxkcmVufTwvPjtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUpID0+IChcbiAgICAgIDxHb29nbGVSZUNhcHRjaGFQcm92aWRlciByZUNhcHRjaGFLZXk9e3JlQ2FwdGNoYUtleSB8fCAnJ30+XG4gICAgICAgIDxHb29nbGVSZUNhcHRjaGFcbiAgICAgICAgICBhY3Rpb249XCJnZW5hc3Npc3RfY2hhdFwiXG4gICAgICAgICAgb25WZXJpZnk9e2hhbmRsZVJlQ2FwdGNoYVZlcmlmeX1cbiAgICAgICAgICByZWZyZXNoUmVDYXB0Y2hhPXtmYWxzZX1cbiAgICAgICAgLz5cbiAgICAgICAgPD57Y2hpbGRyZW59PC8+XG4gICAgICA8L0dvb2dsZVJlQ2FwdGNoYVByb3ZpZGVyPlxuICAgICk7XG4gIH0sIFtyZUNhcHRjaGFLZXksIGhhbmRsZVJlQ2FwdGNoYVZlcmlmeV0pO1xuXG4gIGNvbnN0IHJlbmRlckNoYXRDb21wb25lbnQgPSAoKSA9PiAoXG4gICAgPGRpdiBzdHlsZT17eyAuLi5jb250YWluZXJTdHlsZSwgWyctLWdhLWhvdmVyJyBhcyBzdHJpbmddOiBtZW51SG92ZXJCZyB9fSBkYXRhLWdlbmFzc2lzdC1yb290PVwidHJ1ZVwiPlxuICAgICAgPHN0eWxlPntDU1NfS0VZRlJBTUVTfTwvc3R5bGU+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImdhLWhlYWRlclwiIHN0eWxlPXtoZWFkZXJTdHlsZX0gcmVmPXtoZWFkZXJSZWZ9PlxuICAgICAgICB7LyogTGVmdDogaGlkZGVuIGV4cGFuZCBidXR0b24gKHJldmVhbGVkIG9uIGhvdmVyKSArIGxvZ28vbmFtZSBncm91cC5cbiAgICAgICAgICAgIEhvdmVyaW5nIHRoaXMgc2VjdGlvbiBleHBhbmRzIHRoZSBidXR0b24gZnJvbSAwIHdpZHRoLCBzbGlkaW5nIHRoZSBncm91cCByaWdodC4gKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ2EtaGVhZGVyLWxlZnRcIiBzdHlsZT17aGVhZGVyTGVmdENvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICB7bW9kZSA9PT0gJ2Zsb2F0aW5nJyAmJiAhaXNGdWxsc2NyZWVuICYmIHdpbmRvd1dpZHRoID4gNzY4ICYmIChcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ2EtaGVhZGVyLWJ0biBnYS1oZWFkZXItZXhwYW5kLWJ0blwiXG4gICAgICAgICAgICAgIHN0eWxlPXt7IC4uLm1lbnVCdXR0b25TdHlsZSwgd2lkdGg6IHVuZGVmaW5lZCwgZmxleFNocmluazogMCB9fVxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVFeHBhbmRUb2dnbGV9XG4gICAgICAgICAgICAgIHRpdGxlPXtpc0V4cGFuZGVkID8gdCgnbWVudS5jb2xsYXBzZScsICdDb2xsYXBzZScpIDogdCgnbWVudS5leHBhbmQnLCAnRXhwYW5kJyl9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2lzRXhwYW5kZWQgPyB0KCdtZW51LmNvbGxhcHNlJywgJ0NvbGxhcHNlJykgOiB0KCdtZW51LmV4cGFuZCcsICdFeHBhbmQnKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2lzRXhwYW5kZWQgPyAoXG4gICAgICAgICAgICAgICAgPE1pbmltaXplMiBzaXplPXsyMH0gY29sb3I9XCIjMTExMTExXCIgLz5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8TWF4aW1pemUyIHNpemU9ezIwfSBjb2xvcj1cIiMxMTExMTFcIiAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXtoZWFkZXJQaWxsU3R5bGV9XG4gICAgICAgICAgICB0YWJJbmRleD17aGFzSGVhZGVyRGVzY3JpcHRpb24gPyAwIDogdW5kZWZpbmVkfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtoYXNCcmFuZExvZ28gPyAoXG4gICAgICAgICAgICAgIDxpbWcgc3JjPXticmFuZExvZ299IGFsdD17aGVhZGVyVGl0bGV9IHN0eWxlPXticmFuZExvZ29TdHlsZX0gLz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9e2xvZ29Vcmw/LnRyaW0oKSB8fCBjaGF0TG9nb30gYWx0PVwiTG9nb1wiIHN0eWxlPXtsb2dvU3R5bGV9IC8+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17aGVhZGVyUGlsbFRleHRDb2x1bW5TdHlsZX0+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17aGVhZGVyUGlsbFRpdGxlU3R5bGV9IHRpdGxlPXtoZWFkZXJUaXRsZX0+e2hlYWRlclRpdGxlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIHtoYXNIZWFkZXJEZXNjcmlwdGlvbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ2EtaGVhZGVyLWRlc2NcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdhLWhlYWRlci1kZXNjLWlubmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJnYS1oZWFkZXItZGVzYy10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgLi4uaGVhZGVyRGVzY3JpcHRpb25UZXh0U3R5bGUsIGRpc3BsYXk6ICdibG9jaycgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2hlYWRlckRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIFJpZ2h0OiBtZW51ICsgY2xvc2UgKi99XG4gICAgICAgIDxkaXYgc3R5bGU9e2hlYWRlclJpZ2h0Q29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImdhLWhlYWRlci1idG5cIlxuICAgICAgICAgICAgc3R5bGU9e21lbnVCdXR0b25TdHlsZX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbnVDbGlja31cbiAgICAgICAgICAgIHRpdGxlPXt0KCdtZW51LnRpdGxlJyl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPE1vcmVIb3Jpem9udGFsIHNpemU9ezIyfSBjb2xvcj1cIiMxMTExMTFcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIHttb2RlID09PSAnZmxvYXRpbmcnICYmIChcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ2EtaGVhZGVyLWJ0blwiXG4gICAgICAgICAgICAgIHN0eWxlPXttZW51QnV0dG9uU3R5bGV9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRmxvYXRpbmdPcGVuKGZhbHNlKX1cbiAgICAgICAgICAgICAgdGl0bGU9XCJDbG9zZSBjaGF0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFggc2l6ZT17MjJ9IGNvbG9yPVwiIzExMTExMVwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgeyFub0NvbG9yQW5pbWF0aW9uICYmIHNob3dCYWNrbGlnaHQgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgdG9wOiBNYXRoLm1heCgwLCBoZWFkZXJIZWlnaHQgLSAxNCksXG4gICAgICAgICAgICBoZWlnaHQ6IDQyLFxuICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgICAgekluZGV4OiAxLFxuICAgICAgICAgICAgb3BhY2l0eTogaXNBZ2VudFR5cGluZyA/IDEgOiAwLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogJ29wYWNpdHkgNDIwbXMgZWFzZS1pbi1vdXQnLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgdG9wOiA2LFxuICAgICAgICAgICAgICBoZWlnaHQ6IDMyLFxuICAgICAgICAgICAgICB3aWR0aDogJzc4JScsXG4gICAgICAgICAgICAgIGZpbHRlcjogJ2JsdXIoMjJweCknLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOlxuICAgICAgICAgICAgICAgIGBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4wKX0gMCUsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4zNSl9IDE1JSwgJHtoZXhUb1JnYmEocHJpbWFyeUNvbG9yLCAwLjU1KX0gNTAlLCAke2hleFRvUmdiYShwcmltYXJ5Q29sb3IsIDAuMzUpfSA4NSUsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4wKX0gMTAwJSlgLFxuICAgICAgICAgICAgICB3aWxsQ2hhbmdlOiAndHJhbnNmb3JtLCBvcGFjaXR5JyxcbiAgICAgICAgICAgICAgYW5pbWF0aW9uOiAnZ2EtYmFja2xpZ2h0LXN3ZWVwMiAxLjJzIGN1YmljLWJlemllcigwLjQsMC4wLDAuMiwxKSBpbmZpbml0ZSBhbHRlcm5hdGUsIGdhLWJhY2tsaWdodC1wdWxzZSAyLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlJyxcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAxOCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICB7c2hvd01lbnUgJiYgKFxuICAgICAgICA8ZGl2IHJlZj17bWVudVJlZn0gc3R5bGU9e21lbnVQb3B1cFN0eWxlfT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdhLW1lbnUtaXRlbVwiIHN0eWxlPXttZW51SXRlbVN0eWxlfSBvbkNsaWNrPXtoYW5kbGVSZXNldENsaWNrfT5cbiAgICAgICAgICAgIDxSZWZyZXNoQ3cgc2l6ZT17MTZ9IC8+XG4gICAgICAgICAgICB7dCgnbWVudS5yZXNldENvbnZlcnNhdGlvbicpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHttb2RlICE9PSAnZnVsbHNjcmVlbicgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJnYS1tZW51LWl0ZW1cIiBzdHlsZT17bWVudUl0ZW1TdHlsZX0gb25DbGljaz17aGFuZGxlRnVsbHNjcmVlblRvZ2dsZX0+XG4gICAgICAgICAgICAgIDxGdWxsc2NyZWVuIHNpemU9ezE2fSAvPlxuICAgICAgICAgICAgICB7dCgnbWVudS5mdWxsc2NyZWVuJyl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtoYXNMYW5ndWFnZU9wdGlvbnMgJiYgKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJnYS1tZW51LWl0ZW1cIlxuICAgICAgICAgICAgICBzdHlsZT17eyAuLi5tZW51SXRlbVN0eWxlLCBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9fVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgc2V0U2hvd0xhbmd1YWdlRHJvcGRvd24oIXNob3dMYW5ndWFnZURyb3Bkb3duKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEdsb2JlIHNpemU9ezE2fSAvPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17eyBmbGV4OiAxIH19Pnt0KCdtZW51Lmxhbmd1YWdlJyl9PC9zcGFuPlxuICAgICAgICAgICAgICB7c2hvd0xhbmd1YWdlRHJvcGRvd24gJiYgKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogJzRweCcsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICNlNGU0ZTcnLFxuICAgICAgICAgICAgICAgICAgICBib3hTaGFkb3c6ICcwIDRweCA2cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMnB4IDRweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4xKScsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzE4MHB4JyxcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcyMDBweCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICAgICAgekluZGV4OiAxMDAxLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHthdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e2xhbmcuY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBnYXA6ICc4cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzZweCA4cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnOHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHJlc29sdmVkTGFuZ3VhZ2UgPT09IGxhbmcuY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1lbnVIb3ZlckJnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2JhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZScsXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRMYW5ndWFnZSAhPT0gbGFuZy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBtZW51SG92ZXJCZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZExhbmd1YWdlICE9PSBsYW5nLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUxhbmd1YWdlQ2hhbmdlKGxhbmcuY29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93TGFuZ3VhZ2VEcm9wZG93bihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93TWVudShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHtsYW5nLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG5cbiAgICAgIDxkaXYgc3R5bGU9e2NvbnRlbnRDYXJkU3R5bGV9PlxuICAgICAgICA8ZGl2IHN0eWxlPXtjaGF0Q29udGFpbmVyU3R5bGV9IHJlZj17Y2hhdENvbnRhaW5lclJlZn0+XG4gICAgICAgICAge3JlbmRlckxhbmd1YWdlU2VsZWN0b3IoKX1cblxuICAgICAgICAgIHsoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2hvd1N5bnRoZXRpY1dlbGNvbWUgPVxuICAgICAgICAgICAgICBzaG93V2VsY29tZUJlZm9yZVN0YXJ0ICYmXG4gICAgICAgICAgICAgICFoYXNVc2VyTWVzc2FnZXMgJiZcbiAgICAgICAgICAgICAgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCB8fCBtZXNzYWdlc1swXS5zcGVha2VyICE9PSAnYWdlbnQnKSAmJlxuICAgICAgICAgICAgICAoQm9vbGVhbih3ZWxjb21lVGl0bGUpIHx8IEJvb2xlYW4od2VsY29tZUltYWdlVXJsKSB8fCBCb29sZWFuKHdlbGNvbWVNZXNzYWdlKSlcbiAgICAgICAgICAgICAgJiYgY29udmVyc2F0aW9uSWQ7XG5cbiAgICAgICAgICAgIGlmICghc2hvdWxkU2hvd1N5bnRoZXRpY1dlbGNvbWUpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgICAgICAgIGNvbnN0IHN5bnRoZXRpY1dlbGNvbWU6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgICAgICAgICBzdGFydF90aW1lOiAwLFxuICAgICAgICAgICAgICBlbmRfdGltZTogMC4wMSxcbiAgICAgICAgICAgICAgc3BlYWtlcjogJ2FnZW50JyxcbiAgICAgICAgICAgICAgdGV4dDogd2VsY29tZU1lc3NhZ2UgfHwgJycsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8Q2hhdE1lc3NhZ2VDb21wb25lbnRcbiAgICAgICAgICAgICAgICBrZXk9XCJfX3N5bnRoZXRpY193ZWxjb21lX19cIlxuICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3N5bnRoZXRpY1dlbGNvbWV9XG4gICAgICAgICAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICAgICAgICAgIGlzRmlyc3RNZXNzYWdlPXt0cnVlfVxuICAgICAgICAgICAgICAgIGlzTmV4dFNhbWVTcGVha2VyPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBpc1ByZXZTYW1lU3BlYWtlcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgZW5hYmxlVHlwZXdyaXRlcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgd2VsY29tZUltYWdlVXJsPXt3ZWxjb21lSW1hZ2VVcmwgfHwgdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgIHdlbGNvbWVUaXRsZT17d2VsY29tZVRpdGxlIHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXM9e3Bvc3NpYmxlUXVlcmllc31cbiAgICAgICAgICAgICAgICBvblF1aWNrUXVlcnk9e2hhbmRsZVF1ZXJ5Q2xpY2t9XG4gICAgICAgICAgICAgICAgb25RdWlja0FjdGlvbj17aGFuZGxlUXVpY2tBY3Rpb259XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zPXt0cmFuc2xhdGlvbnN9XG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2U9e3Jlc29sdmVkTGFuZ3VhZ2V9XG4gICAgICAgICAgICAgICAgYWdlbnROYW1lPXthZ2VudE5hbWV9XG4gICAgICAgICAgICAgICAgaXNBZ2VudFR5cGluZz17aXNBZ2VudFR5cGluZ31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSkoKX1cbiAgICAgICAgICB7KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0QWdlbnRJbmRleCA9IG1lc3NhZ2VzLmZpbmRJbmRleChtID0+IG0uc3BlYWtlciA9PT0gJ2FnZW50Jyk7XG5cbiAgICAgICAgICAgIC8vIExpdmUtdm9pY2UgdHVybnMgYXJlIHJlbmRlcmVkIGxvY2FsbHkgKGJlbG93KSB0aGUgbW9tZW50IHRoZXkgZmluaXNoLlxuICAgICAgICAgICAgLy8gRWFjaCBpcyBhbHNvIHBlcnNpc3RlZCBhbmQgYnJvYWRjYXN0IGJhY2sgaW50byBgbWVzc2FnZXNgOyBzdXBwcmVzcyB0aGF0XG4gICAgICAgICAgICAvLyBjb3B5IHNvIGEgdHVybiBpc24ndCBzaG93biB0d2ljZSAoYW5kIG5ldmVyIGJsaW5rcyBhcyB0aGUgdHdvIHN3YXApLlxuICAgICAgICAgICAgY29uc3QgbGl2ZVR1cm5LZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHR1cm4gb2YgbGl2ZVR1cm5zKSB7XG4gICAgICAgICAgICAgIGlmICh0dXJuLnVzZXIudHJpbSgpKSBsaXZlVHVybktleXMuYWRkKGBjdXN0b21lcjoke3R1cm4udXNlci50cmltKCl9YCk7XG4gICAgICAgICAgICAgIGlmICh0dXJuLmFnZW50LnRyaW0oKSkgbGl2ZVR1cm5LZXlzLmFkZChgYWdlbnQ6JHt0dXJuLmFnZW50LnRyaW0oKX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYXBwbHlNZXNzYWdlRmlsdGVyID0gKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09ICdmaWxlJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBpZiAobGl2ZVR1cm5LZXlzLmhhcyhgJHttZXNzYWdlLnNwZWFrZXJ9OiR7KG1lc3NhZ2UudGV4dCB8fCAnJykudHJpbSgpfWApKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZXMuZmlsdGVyKGFwcGx5TWVzc2FnZUZpbHRlcikubWFwKChtZXNzYWdlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBpZiAobWVzc2FnZS50eXBlID09PSAnZm9ybV9yZXF1ZXN0JyAmJiBtZXNzYWdlLnNwZWFrZXIgPT09ICdhZ2VudCcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybVNjaGVtYSA9IGxvY2FsaXplRm9ybShKU09OLnBhcnNlKG1lc3NhZ2UudGV4dCkpO1xuICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSByZWFsIG1lc3NhZ2UgcG9zaXRpb24gKGZpbHRlcmluZyBjYW4gc2hpZnQgdGhlIG1hcCBpbmRleCkgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBhbnN3ZXJlZCBjaGVjayBtYXRjaGVzIHRoZSBvdmVybGF5L2Zvb3RlciBwYXRoIGFuZCBzdXJ2aXZlcyByZWxvYWQuXG4gICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0gbWVzc2FnZXMuaW5kZXhPZihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUGVuZGluZyA9ICFpc0Zvcm1BbnN3ZXJlZChvcmlnaW5hbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtpbmRleH0gc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgbWF4V2lkdGg6ICc4NSUnLCBtYXJnaW5Cb3R0b206ICc4cHgnIH19PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZm9udFNpemU6ICcxNHB4JywgY29sb3I6ICcjMDAwMDAwJywgZm9udFdlaWdodDogNjAwLCBtYXJnaW5Cb3R0b206IDQgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7YWdlbnROYW1lIHx8ICdBZ2VudCd9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAge2Zvcm1EaXNwbGF5ID09PSAnaW5saW5lJyAmJiBpc1BlbmRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHluYW1pY0Zvcm1NZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYT17Zm9ybVNjaGVtYX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWJtaXQ9eyhkYXRhKSA9PiBoYW5kbGVGb3JtU3VibWl0KGRhdGEsIG9yaWdpbmFsSW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbD17KCkgPT4gaGFuZGxlRm9ybUNhbmNlbChvcmlnaW5hbEluZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdWJtaXR0aW5nPXtzdWJtaXR0aW5nRm9ybUluZGV4ID09PSBvcmlnaW5hbEluZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1Ym1pdHRlZD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2xvcj17cHJpbWFyeUNvbG9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5PXtmb250RmFtaWx5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmM2Y0ZjYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxMnB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzEwcHggMTRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMTRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzM3NDE1MScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2Zvcm1TY2hlbWEubWVzc2FnZSB8fCAnUGxlYXNlIGZpbGwgdGhlIGZvcm0gYmVsb3cuJ31cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgcmVuZGVyaW5nIGlmIEpTT04gcGFyc2UgZmFpbHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBpc05leHRTYW1lU3BlYWtlciA9IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoIC0gMSAmJiBtZXNzYWdlc1tpbmRleCArIDFdLnNwZWFrZXIgPT09IG1lc3NhZ2Uuc3BlYWtlcjtcbiAgICAgICAgICAgICAgY29uc3QgaXNQcmV2U2FtZVNwZWFrZXIgPSBpbmRleCA+IDAgJiYgbWVzc2FnZXNbaW5kZXggLSAxXS5zcGVha2VyID09PSBtZXNzYWdlLnNwZWFrZXI7XG4gICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGFnZW50IGdyZWV0cyBvbiBzdGFydCwgdGhhdCBncmVldGluZyBpcyBhIG5vcm1hbCByZXBseSDigJQgbm90IHRoZVxuICAgICAgICAgICAgICAvLyBcIndlbGNvbWVcIiBtZXNzYWdlIOKAlCBzbyBkb24ndCBnaXZlIGl0IHRoZSBmaXJzdC1tZXNzYWdlIHdlbGNvbWUgdHJlYXRtZW50XG4gICAgICAgICAgICAgIC8vICh3aGljaCB3b3VsZCBzcGxpdCBpdHMgdGV4dCBpbnRvIGEgYmlnIHRpdGxlICsgYm9keSkuXG4gICAgICAgICAgICAgIGNvbnN0IGlzRmlyc3RBZ2VudE1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIGluZGV4ID09PSBmaXJzdEFnZW50SW5kZXggJiYgbWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnICYmICFoYXNVc2VyTWVzc2FnZXMgJiYgIXNob3VsZFRyaWdnZXJTdGFydEZvcm07XG4gICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlNZXNzYWdlID1cbiAgICAgICAgICAgICAgICBpc0ZpcnN0QWdlbnRNZXNzYWdlICYmIHdlbGNvbWVNZXNzYWdlXG4gICAgICAgICAgICAgICAgICA/IHsgLi4ubWVzc2FnZSwgdGV4dDogd2VsY29tZU1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgOiBtZXNzYWdlO1xuXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPENoYXRNZXNzYWdlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgbWVzc2FnZT17ZGlzcGxheU1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICB0aGVtZT17dGhlbWV9XG4gICAgICAgICAgICAgICAgICBvblBsYXlBdWRpbz17bWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnID8gcGxheVJlc3BvbnNlQXVkaW8gOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBpc1BsYXlpbmdBdWRpbz17aXNQbGF5aW5nQXVkaW99XG4gICAgICAgICAgICAgICAgICBpc0ZpcnN0TWVzc2FnZT17aXNGaXJzdEFnZW50TWVzc2FnZX1cbiAgICAgICAgICAgICAgICAgIGlzTmV4dFNhbWVTcGVha2VyPXtpc05leHRTYW1lU3BlYWtlcn1cbiAgICAgICAgICAgICAgICAgIGlzUHJldlNhbWVTcGVha2VyPXtpc1ByZXZTYW1lU3BlYWtlcn1cbiAgICAgICAgICAgICAgICAgIG9uRmVlZGJhY2s9eyhtZXNzYWdlSWQsIHZhbHVlKSA9PiBhZGRGZWVkYmFjayhtZXNzYWdlSWQsIHZhbHVlKX1cbiAgICAgICAgICAgICAgICAgIGVuYWJsZVR5cGV3cml0ZXI9e2luZGV4ID09PSBtZXNzYWdlcy5sZW5ndGggLSAxICYmIG1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50J31cbiAgICAgICAgICAgICAgICAgIHdlbGNvbWVJbWFnZVVybD17aXNGaXJzdEFnZW50TWVzc2FnZSA/ICh3ZWxjb21lSW1hZ2VVcmwgfHwgdW5kZWZpbmVkKSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIHdlbGNvbWVUaXRsZT17aXNGaXJzdEFnZW50TWVzc2FnZSA/ICh3ZWxjb21lVGl0bGUgfHwgdW5kZWZpbmVkKSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIHBvc3NpYmxlUXVlcmllcz17aXNGaXJzdEFnZW50TWVzc2FnZSA/IHBvc3NpYmxlUXVlcmllcyA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIG9uUXVpY2tRdWVyeT17aGFuZGxlUXVlcnlDbGlja31cbiAgICAgICAgICAgICAgICAgIG9uUXVpY2tBY3Rpb249e2hhbmRsZVF1aWNrQWN0aW9ufVxuICAgICAgICAgICAgICAgICAgb25TY2hlZHVsZUNvbmZpcm09e2hhbmRsZVNjaGVkdWxlQ29uZmlybX1cbiAgICAgICAgICAgICAgICAgIGlzTGFzdE1lc3NhZ2U9e2luZGV4ID09PSBtZXNzYWdlcy5sZW5ndGggLSAxICYmIG1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50J31cbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9ucz17dHJhbnNsYXRpb25zfVxuICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9e3Jlc29sdmVkTGFuZ3VhZ2V9XG4gICAgICAgICAgICAgICAgICBhZ2VudE5hbWU9e2FnZW50TmFtZX1cbiAgICAgICAgICAgICAgICAgIGlzQWdlbnRUeXBpbmc9e2lzQWdlbnRUeXBpbmd9XG4gICAgICAgICAgICAgICAgICBhdWRpb1VybEJ1aWxkZXI9e21lc3NhZ2UudHlwZSA9PT0gJ2F1ZGlvJyAmJiB1c2VBdWRpbyA/IGF1ZGlvVXJsQnVpbGRlciA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIGF1ZGlvSGVhZGVycz17bWVzc2FnZS50eXBlID09PSAnYXVkaW8nICYmIHVzZUF1ZGlvID8gYXVkaW9IZWFkZXJzIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgYXV0b1BsYXlBdWRpb01lc3NhZ2VJZD17YXV0b1BsYXlBdWRpb01lc3NhZ2VJZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkoKX1cbiAgICAgICAgICB7aXNBZ2VudFR5cGluZyAmJiBjdXJyZW50VGhpbmtpbmdQYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgbWF4V2lkdGg6ICc4MCUnIH19PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGZvbnRTaXplOiAnMTRweCcsIGNvbG9yOiAnIzAwMDAwMCcsIGZvbnRXZWlnaHQ6IDYwMCwgbWFyZ2luQm90dG9tOiA0IH19PnthZ2VudE5hbWUgfHwgdCgnbGFiZWxzLmFnZW50Jyl9PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAga2V5PXtgJHtjdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXh9LSR7Y3VycmVudFRoaW5raW5nUGFydHMuam9pbignfCcpfWB9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246ICdnYS10aGluay1jaGFuZ2UgMjIwbXMgZWFzZScsXG4gICAgICAgICAgICAgICAgICAgIHdpbGxDaGFuZ2U6ICd0cmFuc2Zvcm0sIG9wYWNpdHknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM2YjcyODAnLFxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogJzEzcHgnLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7Y3VycmVudFRoaW5raW5nUGFydHNbY3VycmVudFRoaW5raW5nUGFydEluZGV4XSB8fCBjdXJyZW50VGhpbmtpbmdQYXJ0c1tjdXJyZW50VGhpbmtpbmdQYXJ0cy5sZW5ndGggLSAxXX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHsvKiBDb21wbGV0ZWQgbGl2ZS12b2ljZSB0dXJucywgcmVuZGVyZWQgYXMgb3JkaW5hcnkgY2hhdCBidWJibGVzIGFuZCBrZXB0XG4gICAgICAgICAgICAgIGluIGxvY2FsIHN0YXRlIHNvIHRoZXkgc3RheSB2aXNpYmxlIGFjcm9zcyB0dXJucy4gVGhlIHBlcnNpc3RlZCBjb3B5IG9mXG4gICAgICAgICAgICAgIGVhY2ggdHVybiBpcyBmaWx0ZXJlZCBvdXQgb2YgYG1lc3NhZ2VzYCBhYm92ZSwgc28gdGhlc2UgYXJlIHRoZSBzaW5nbGVcbiAgICAgICAgICAgICAgc291cmNlIG9mIHRydXRoIG9uIHNjcmVlbiDigJQgdGhleSBuZXZlciBnZXQgaGlkZGVuLCBzbyBub3RoaW5nIGJsaW5rcy4gKi99XG4gICAgICAgICAge2xpdmVUdXJucy5tYXAoKHR1cm4sIGkpID0+IChcbiAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2BsaXZlLXR1cm4tJHtpfWB9PlxuICAgICAgICAgICAgICB7dHVybi51c2VyLnRyaW0oKSAhPT0gJycgJiYgcmVuZGVyTGl2ZUJ1YmJsZSgnY3VzdG9tZXInLCB0dXJuLnVzZXIsIHR1cm4uY3JlYXRlVGltZSl9XG4gICAgICAgICAgICAgIHt0dXJuLmFnZW50LnRyaW0oKSAhPT0gJycgJiYgcmVuZGVyTGl2ZUJ1YmJsZSgnYWdlbnQnLCB0dXJuLmFnZW50LCB0dXJuLmNyZWF0ZVRpbWUpfVxuICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICApKX1cbiAgICAgICAgICB7LyogSW4tcHJvZ3Jlc3MgdHVybjogc3RyZWFtcyB0aGUgcGFydGlhbCB0cmFuc2NyaXB0IGxpdmUgKENoYXRNZXNzYWdlIG5vd1xuICAgICAgICAgICAgICB0cmFja3MgaXRzIHRleHQgcHJvcCwgc28gdGhlc2UgdXBkYXRlIGluIHBsYWNlIGFzIGNodW5rcyBhcnJpdmUpLiAqL31cbiAgICAgICAgICB7bGl2ZVZvaWNlLmlzQWN0aXZlICYmIGxpdmVDYXB0aW9uLnVzZXIudHJpbSgpICE9PSAnJyAmJlxuICAgICAgICAgICAgcmVuZGVyTGl2ZUJ1YmJsZSgnY3VzdG9tZXInLCBsaXZlQ2FwdGlvbi51c2VyLCBsaXZlQ2FwdGlvbi5jcmVhdGVUaW1lLCAnX19saXZlX2NhcHRpb25fdXNlcl9fJyl9XG4gICAgICAgICAge2xpdmVWb2ljZS5pc0FjdGl2ZSAmJiBsaXZlQ2FwdGlvbi5hZ2VudC50cmltKCkgIT09ICcnICYmXG4gICAgICAgICAgICByZW5kZXJMaXZlQnViYmxlKCdhZ2VudCcsIGxpdmVDYXB0aW9uLmFnZW50LCBsaXZlQ2FwdGlvbi5jcmVhdGVUaW1lLCAnX19saXZlX2NhcHRpb25fYWdlbnRfXycpfVxuICAgICAgICAgIDxkaXYgcmVmPXttZXNzYWdlc0VuZFJlZn0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHtzaG93V2VsY29tZUJlZm9yZVN0YXJ0ICYmICgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2hvd2luZ1N5bnRoZXRpY1dlbGNvbWUgPVxuICAgICAgICAgICAgIWhhc1VzZXJNZXNzYWdlcyAmJlxuICAgICAgICAgICAgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCB8fCBtZXNzYWdlc1swXS5zcGVha2VyICE9PSAnYWdlbnQnKSAmJlxuICAgICAgICAgICAgKEJvb2xlYW4od2VsY29tZVRpdGxlKSB8fCBCb29sZWFuKHdlbGNvbWVJbWFnZVVybCkgfHwgQm9vbGVhbih3ZWxjb21lTWVzc2FnZSkpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgIWhhc1VzZXJNZXNzYWdlcyAmJlxuICAgICAgICAgICAgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCB8fCBtZXNzYWdlc1swXS5zcGVha2VyICE9PSAnYWdlbnQnKSAmJlxuICAgICAgICAgICAgIXNob3dpbmdTeW50aGV0aWNXZWxjb21lXG4gICAgICAgICAgKTtcbiAgICAgICAgfSkoKSAmJiAoXG4gICAgICAgICAgPGRpdiBzdHlsZT17cG9zc2libGVRdWVyaWVzQ29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAge3Bvc3NpYmxlUXVlcmllcy5tYXAoKHF1ZXJ5LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICBzdHlsZT17cXVlcnlCdXR0b25TdHlsZX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVRdWVyeUNsaWNrKHF1ZXJ5KX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNMb2FkaW5nIHx8IGlzQWdlbnRUeXBpbmd9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7cXVlcnl9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAge2ZpbGVFcnJvclRvYXN0ICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBtYXJnaW46ICcwIDE2cHggOHB4JyxcbiAgICAgICAgICAgICAgcGFkZGluZzogJzEwcHggMTRweCcsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNGRkYzRTAnLFxuICAgICAgICAgICAgICBjb2xvcjogJyNFNjUxMDAnLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxMnB4JyxcbiAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgIGZvbnRGYW1pbHksXG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgIGdhcDogJzhweCcsXG4gICAgICAgICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8QWxlcnRDaXJjbGUgc2l6ZT17MTh9IHN0eWxlPXt7IGZsZXhTaHJpbms6IDAgfX0gLz5cbiAgICAgICAgICAgIDxzcGFuPntmaWxlRXJyb3JUb2FzdH08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAge2xpdmVWb2ljZU5vdGljZSAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgbWFyZ2luOiAnMCAxNnB4IDhweCcsXG4gICAgICAgICAgICAgIHBhZGRpbmc6ICcxMHB4IDE0cHgnLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjRkZGM0UwJyxcbiAgICAgICAgICAgICAgY29sb3I6ICcjRTY1MTAwJyxcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMTJweCcsXG4gICAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgICBmb250RmFtaWx5LFxuICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBnYXA6ICc4cHgnLFxuICAgICAgICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEFsZXJ0Q2lyY2xlIHNpemU9ezE4fSBzdHlsZT17eyBmbGV4U2hyaW5rOiAwIH19IC8+XG4gICAgICAgICAgICA8c3Bhbj57bGl2ZVZvaWNlTm90aWNlfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7dXNlRmlsZSAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7IHBhZGRpbmc6ICcwIDE2cHgnLCBtYXJnaW5Cb3R0b206ICc4cHgnLCBkaXNwbGF5OiAnZmxleCcsIGdhcDogJzhweCcsIGZsZXhXcmFwOiAnd3JhcCcgfX0+XG4gICAgICAgICAgICB7YXR0YWNobWVudHMubWFwKChhdHQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDxBdHRhY2htZW50UHJldmlld1xuICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgZmlsZT17YXR0LmZpbGV9XG4gICAgICAgICAgICAgICAgb25SZW1vdmU9eygpID0+IGhhbmRsZVJlbW92ZUF0dGFjaG1lbnQoYXR0LmZpbGUubmFtZSl9XG4gICAgICAgICAgICAgICAgdXBsb2FkaW5nPXt1cGxvYWRpbmdGaWxlcy5oYXMoYXR0LmZpbGUubmFtZSl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7IWNvbnZlcnNhdGlvbklkIHx8IGlzRmluYWxpemVkID8gKFxuICAgICAgICAgIDxkaXYgc3R5bGU9e2lucHV0Q29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3suLi5zZW5kQnV0dG9uU3R5bGUsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzQ4cHgnLCBib3JkZXJSYWRpdXM6ICcxNnB4JywgY3Vyc29yOiAncG9pbnRlcicsIGZvbnRGYW1pbHksIGZvbnRTaXplfX1cbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU3RhcnRDb252ZXJzYXRpb259XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtpc0xvYWRpbmd9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt0KCdidXR0b25zLnN0YXJ0Q29udmVyc2F0aW9uJyl9XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IGxpdmVWb2ljZUVuYWJsZWQgPyAoXG4gICAgICAgICAgLy8gTGl2ZSB2b2ljZSBtb2RlIGlzIHZvaWNlLW9ubHk6IG5vIHRleHQgYm94LCBhdHRhY2gsIG9yIHNlbmQgYnV0dG9uIOKAlFxuICAgICAgICAgIC8vIHRoZSBvbmx5IHdheSB0byB0YWxrIHRvIHRoZSBhZ2VudCBpcyB0byBzdGFydCBhIGxpdmUgY2FsbC5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXtpbnB1dENvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgd2lkdGg6ICcxMDAlJywgbWluV2lkdGg6IDAgfX0+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e2lucHV0V3JhcHBlclN0eWxlfT5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17Z2V0TGl2ZVZvaWNlSGludFN0eWxlKHRleHRBcmVhRm9udFNpemUsIGZvbnRGYW1pbHkpfT5cbiAgICAgICAgICAgICAgICAgIHtsaXZlVm9pY2VSZWFkeVxuICAgICAgICAgICAgICAgICAgICA/IHQoJ2xpdmVWb2ljZS50YXBUb1N0YXJ0JywgJ1RhcCB0byBzdGFydCBhIHZvaWNlIGNvbnZlcnNhdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIDogdCgnbGl2ZVZvaWNlLnVuYXZhaWxhYmxlJywgJ1ZvaWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZScpfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8TGl2ZUNhbGxDb250cm9sXG4gICAgICAgICAgICAgICAgICBzdGF0dXM9e2xpdmVWb2ljZS5zdGF0dXN9XG4gICAgICAgICAgICAgICAgICBpc0FjdGl2ZT17bGl2ZVZvaWNlLmlzQWN0aXZlfVxuICAgICAgICAgICAgICAgICAgb25TdGFydD17c3RhcnRMaXZlQ2FsbH1cbiAgICAgICAgICAgICAgICAgIG9uU3RvcD17ZW5kTGl2ZUNhbGx9XG4gICAgICAgICAgICAgICAgICB0aGVtZT17dGhlbWV9XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWFnZW50SWQgfHwgIWxpdmVWb2ljZVJlYWR5fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB7YWdlbnREaXNjbGFpbWVyQ29udGVudCAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJnYS1pbnB1dC1kaXNjbGFpbWVyXCIgc3R5bGU9e2Rpc2NsYWltZXJTdHlsZX0+XG4gICAgICAgICAgICAgICAgICB7YWdlbnREaXNjbGFpbWVyQ29udGVudH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9IHN0eWxlPXtpbnB1dENvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgd2lkdGg6ICcxMDAlJywgbWluV2lkdGg6IDAgfX0+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXtpbnB1dFdyYXBwZXJTdHlsZX0+XG4gICAgICAgICAgICAgIHt1c2VGaWxlICYmIChcbiAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e2F0dGFjaEJ1dHRvblN0eWxlfVxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkF0dGFjaFwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGZpbGVJbnB1dFJlZi5jdXJyZW50Py5jbGljaygpfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8UGFwZXJjbGlwIHNpemU9ezIyfSBjb2xvcj1cIiM3NTc1NzVcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICByZWY9e2ZpbGVJbnB1dFJlZn1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgZGlzcGxheTogJ25vbmUnIH19XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVGaWxlQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICBhY2NlcHQ9e2FsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywnKSB8fCAnKi8qJ31cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgIHJlZj17dGV4dEFyZWFSZWZ9XG4gICAgICAgICAgICAgICAgc3R5bGU9e3RleHRBcmVhU3R5bGV9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ2EtdGV4dGFyZWEtbm9zYlwiXG4gICAgICAgICAgICAgICAgdmFsdWU9e2lucHV0VmFsdWV9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRJbnB1dFZhbHVlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICBvbktleURvd249eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGlucHV0VmFsdWUudHJpbSgpICE9PSAnJyB8fCBhdHRhY2htZW50cy5sZW5ndGggPiAwKSAmJiAhaXNBZ2VudFR5cGluZyAmJiAhaGFzUGVuZGluZ0Zvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRNZXNzYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtpbnB1dFBsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshY29udmVyc2F0aW9uSWQgfHwgaXNGaW5hbGl6ZWQgfHwgaGFzUGVuZGluZ0Zvcm19XG4gICAgICAgICAgICAgICAgcm93cz17MX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cmlnaHRBY3Rpb25Db250YWluZXJTdHlsZX0+XG4gICAgICAgICAgICAgICAgeyEodXNlQXVkaW8gJiYgaW5wdXRWYWx1ZS50cmltKCkgPT09ICcnICYmIGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgJiYgKFxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgLi4uc2VuZEJ1dHRvblN0eWxlLCAuLi4oaXNTZW5kRGlzYWJsZWQgPyBzZW5kQnV0dG9uRGlzYWJsZWRTdHlsZSA6IHt9KSB9fVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNTZW5kRGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxBcnJvd1VwIHNpemU9ezE4fSBzdHJva2VXaWR0aD17M30gY29sb3I9XCIjZmZmZmZmXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB7dXNlQXVkaW8gJiYgaW5wdXRWYWx1ZS50cmltKCkgPT09ICcnICYmIGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCAmJiAoXG4gICAgICAgICAgICAgICAgPFZvaWNlSW5wdXRcbiAgICAgICAgICAgICAgICAgIG9uQXVkaW9SZWFkeT17YXN5bmMgKGJsb2I6IEJsb2IsIGZvcm1hdDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNQbGF5aW5nQXVkaW8odHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2VuZEF1ZGlvTWVzc2FnZShibG9iLCBmb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBoYW5kbGVkIGluc2lkZSBzZW5kQXVkaW9NZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNQbGF5aW5nQXVkaW8oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgb25FcnJvcj17aGFuZGxlVm9pY2VFcnJvcn1cbiAgICAgICAgICAgICAgICAgIHRoZW1lPXt0aGVtZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHthZ2VudERpc2NsYWltZXJDb250ZW50ICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJnYS1pbnB1dC1kaXNjbGFpbWVyXCIgc3R5bGU9e2Rpc2NsYWltZXJTdHlsZX0+XG4gICAgICAgICAgICAgICAge2FnZW50RGlzY2xhaW1lckNvbnRlbnR9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgKX1cblxuICAgICAgICB7LyogRnVsbC1zY3JlZW4gZm9ybTogd2hlbiBhIEh1bWFuIEluIFRoZSBMb29wIGZvcm0gaXMgcGVuZGluZywgaXQgdGFrZXMgb3ZlciB0aGVcbiAgICAgICAgICAgIHdob2xlIGNoYXQgcGFuZWwgKHRoZSBub2RlJ3MgbWVzc2FnZSBzaG93biBhcyBhIGhlYWRpbmcgb24gdG9wKSBpbnN0ZWFkIG9mIGFcbiAgICAgICAgICAgIGNyYW1wZWQgZm9vdGVyLiBJbmxpbmUgbW9kZSBrZWVwcyByZW5kZXJpbmcgdGhlIGZvcm0gd2l0aGluIHRoZSBtZXNzYWdlIGxpc3QuICovfVxuICAgICAgICB7cGVuZGluZ0Zvcm0gJiYgZm9ybURpc3BsYXkgIT09ICdpbmxpbmUnICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgaW5zZXQ6IDAsXG4gICAgICAgICAgICAgIHpJbmRleDogMzAsXG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yIHx8ICcjZmZmZmZmJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPER5bmFtaWNGb3JtTWVzc2FnZVxuICAgICAgICAgICAgICBzY2hlbWE9e3BlbmRpbmdGb3JtLnNjaGVtYX1cbiAgICAgICAgICAgICAgb25TdWJtaXQ9eyhkYXRhKSA9PiBoYW5kbGVGb3JtU3VibWl0KGRhdGEsIHBlbmRpbmdGb3JtLmluZGV4KX1cbiAgICAgICAgICAgICAgb25DYW5jZWw9eygpID0+IGhhbmRsZUZvcm1DYW5jZWwocGVuZGluZ0Zvcm0uaW5kZXgpfVxuICAgICAgICAgICAgICBpc1N1Ym1pdHRpbmc9e3N1Ym1pdHRpbmdGb3JtSW5kZXggPT09IHBlbmRpbmdGb3JtLmluZGV4fVxuICAgICAgICAgICAgICBpc1N1Ym1pdHRlZD17ZmFsc2V9XG4gICAgICAgICAgICAgIHByaW1hcnlDb2xvcj17cHJpbWFyeUNvbG9yfVxuICAgICAgICAgICAgICBmb250RmFtaWx5PXtmb250RmFtaWx5fVxuICAgICAgICAgICAgICB2YXJpYW50PVwiZnVsbHNjcmVlblwiXG4gICAgICAgICAgICAgIHRpdGxlPXthZ2VudE5hbWUgfHwgdW5kZWZpbmVkfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPXtjb25maXJtT3ZlcmxheVN0eWxlfT5cbiAgICAgICAgPGRpdiBzdHlsZT17Y29uZmlybURpYWxvZ1N0eWxlfT5cbiAgICAgICAgICA8aDMgc3R5bGU9e3sgZm9udEZhbWlseSwgbWFyZ2luOiAwLCBmb250U2l6ZTogJzE4cHgnLCBmb250V2VpZ2h0OiA2MDAgfX0+e3QoJ2RpYWxvZy5yZXNldENvbnZlcnNhdGlvbi50aXRsZScpfTwvaDM+XG4gICAgICAgICAgPHAgc3R5bGU9e3sgZm9udEZhbWlseSwgZm9udFNpemU6ICcxNHB4JywgY29sb3I6ICcjNzE3MTdhJywgbWFyZ2luOiAnOHB4IDAgMCcgfX0+e3QoJ2RpYWxvZy5yZXNldENvbnZlcnNhdGlvbi5tZXNzYWdlJyl9PC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9e2NvbmZpcm1CdXR0b25zU3R5bGV9PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJnYS1jb25maXJtLWJ0bi0tY2FuY2VsXCIgc3R5bGU9e3sgLi4uZ2V0Q29uZmlybUJ1dHRvblN0eWxlKGZhbHNlLCB0aGVtZVBhcmFtcyksIGNvbG9yOiB0ZXh0Q29sb3IgfX0gb25DbGljaz17aGFuZGxlQ2FuY2VsUmVzZXR9Pnt0KCdidXR0b25zLmNhbmNlbCcpfTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJnYS1jb25maXJtLWJ0bi0tZGFuZ2VyXCIgc3R5bGU9e2dldENvbmZpcm1CdXR0b25TdHlsZSh0cnVlLCB0aGVtZVBhcmFtcyl9IG9uQ2xpY2s9e2hhbmRsZUNvbmZpcm1SZXNldH0+e3QoJ2J1dHRvbnMucmVzZXQnKX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcblxuICBpZiAobW9kZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgIGNvbnN0IGlzUGFuZWxDbG9zaW5nID0gaXNQYW5lbE1vdW50ZWQgJiYgIWlzRmxvYXRpbmdPcGVuO1xuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICB7LyogS2V5ZnJhbWVzL2FuaW1hdGlvbiBjbGFzc2VzIG11c3QgZXhpc3QgZXZlbiB3aGlsZSB0aGUgcGFuZWwgaXMgdW5tb3VudGVkLiAqL31cbiAgICAgICAgPHN0eWxlPntDU1NfS0VZRlJBTUVTfTwvc3R5bGU+XG4gICAgICAgIHshaXNQYW5lbE1vdW50ZWQgJiYgKFxuICAgICAgICAgIDxCdWJibGVEb2NrXG4gICAgICAgICAgICBwcmltYXJ5Q29sb3I9e3ByaW1hcnlDb2xvcn1cbiAgICAgICAgICAgIHBvc2l0aW9uPXtwb3NpdGlvbn1cbiAgICAgICAgICAgIG9mZnNldFg9e29mZnNldFh9XG4gICAgICAgICAgICBvZmZzZXRZPXtvZmZzZXRZfVxuICAgICAgICAgICAgd2luZG93V2lkdGg9e3dpbmRvd1dpZHRofVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2lucHV0UGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICBmb250RmFtaWx5PXtmb250RmFtaWx5fVxuICAgICAgICAgICAgZm9udFNpemU9e2ZvbnRTaXplfVxuICAgICAgICAgICAgY2hhdEJ1YmJsZUljb249e3RoZW1lPy5jaGF0QnViYmxlSWNvbn1cbiAgICAgICAgICAgIHNob3dRdWlja0lucHV0PXtxdWlja0lucHV0ICYmICFxdWlja0lucHV0RGlzbWlzc2VkICYmIEJvb2xlYW4oY29udmVyc2F0aW9uSWQpICYmICFpc0ZpbmFsaXplZH1cbiAgICAgICAgICAgIG9uT3Blbj17KCkgPT4gc2V0SXNGbG9hdGluZ09wZW4odHJ1ZSl9XG4gICAgICAgICAgICBvblNlbmQ9e2hhbmRsZVF1aWNrSW5wdXRTZW5kfVxuICAgICAgICAgICAgb25EaXNtaXNzUXVpY2tJbnB1dD17aGFuZGxlRGlzbWlzc1F1aWNrSW5wdXR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cblxuICAgICAgICB7aXNQYW5lbE1vdW50ZWQgJiYgKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXtmbG9hdGluZ0NvbnRhaW5lclN0eWxlfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtpc1BhbmVsQ2xvc2luZyA/ICdnYS13aWRnZXQtb3V0JyA6ICdnYS13aWRnZXQtaW4nfVxuICAgICAgICAgICAgb25BbmltYXRpb25FbmQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIElnbm9yZSBidWJibGVkIGNoaWxkIGFuaW1hdGlvbnM7IG9ubHkgcmVhY3QgdG8gdGhlIHBhbmVsJ3Mgb3duIGNsb3NlLlxuICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgICAgICBpZiAoaXNQYW5lbENsb3NpbmcpIHNldElzUGFuZWxNb3VudGVkKGZhbHNlKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBkYXRhLWdlbmFzc2lzdC1jb250YWluZXI9XCJmbG9hdGluZ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3JlbmRlcldpdGhSZUNhcHRjaGEocmVuZGVyQ2hhdENvbXBvbmVudCgpKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvPlxuICAgICk7XG4gIH1cblxuICBpZiAobW9kZSA9PT0gJ2Z1bGxzY3JlZW4nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgc3R5bGU9e2Zsb2F0aW5nQ29udGFpbmVyU3R5bGV9IGRhdGEtZ2VuYXNzaXN0LWNvbnRhaW5lcj1cImZ1bGxzY3JlZW5cIj5cbiAgICAgICAge3JlbmRlcldpdGhSZUNhcHRjaGEocmVuZGVyQ2hhdENvbXBvbmVudCgpKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVuZGVyV2l0aFJlQ2FwdGNoYShyZW5kZXJDaGF0Q29tcG9uZW50KCkpO1xufTtcbiJdfQ==