@ilamy/calendar 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +161 -14
- package/dist/index.js +682 -657
- package/package.json +2 -6
- package/dist/index.cjs +0 -3569
- package/dist/index.d.cts +0 -200
package/dist/index.cjs
DELETED
|
@@ -1,3569 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
var import_node_module = require("node:module");
|
|
3
|
-
var __create = Object.create;
|
|
4
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
5
|
-
var __defProp = Object.defineProperty;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
8
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
-
var __toESM = (mod, isNodeMode, target) => {
|
|
10
|
-
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
11
|
-
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
12
|
-
for (let key of __getOwnPropNames(mod))
|
|
13
|
-
if (!__hasOwnProp.call(to, key))
|
|
14
|
-
__defProp(to, key, {
|
|
15
|
-
get: () => mod[key],
|
|
16
|
-
enumerable: true
|
|
17
|
-
});
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
21
|
-
var __toCommonJS = (from) => {
|
|
22
|
-
var entry = __moduleCache.get(from), desc;
|
|
23
|
-
if (entry)
|
|
24
|
-
return entry;
|
|
25
|
-
entry = __defProp({}, "__esModule", { value: true });
|
|
26
|
-
if (from && typeof from === "object" || typeof from === "function")
|
|
27
|
-
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
28
|
-
get: () => from[key],
|
|
29
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
30
|
-
}));
|
|
31
|
-
__moduleCache.set(from, entry);
|
|
32
|
-
return entry;
|
|
33
|
-
};
|
|
34
|
-
var __export = (target, all) => {
|
|
35
|
-
for (var name in all)
|
|
36
|
-
__defProp(target, name, {
|
|
37
|
-
get: all[name],
|
|
38
|
-
enumerable: true,
|
|
39
|
-
configurable: true,
|
|
40
|
-
set: (newValue) => all[name] = () => newValue
|
|
41
|
-
});
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
// src/index.ts
|
|
45
|
-
var exports_src = {};
|
|
46
|
-
__export(exports_src, {
|
|
47
|
-
useIlamyCalendarContext: () => usePublicCalendarContext,
|
|
48
|
-
IlamyCalendar: () => IlamyCalendar
|
|
49
|
-
});
|
|
50
|
-
module.exports = __toCommonJS(exports_src);
|
|
51
|
-
|
|
52
|
-
// src/features/month-view/components/month-view.tsx
|
|
53
|
-
var import_react10 = require("motion/react");
|
|
54
|
-
var import_react11 = __toESM(require("react"));
|
|
55
|
-
|
|
56
|
-
// src/contexts/calendar-context/context.ts
|
|
57
|
-
var import_react = require("react");
|
|
58
|
-
var CalendarContext = import_react.createContext(undefined);
|
|
59
|
-
var useCalendarContext = () => {
|
|
60
|
-
const context = import_react.useContext(CalendarContext);
|
|
61
|
-
if (context === undefined) {
|
|
62
|
-
throw new Error("useCalendarContext must be used within a CalendarProvider");
|
|
63
|
-
}
|
|
64
|
-
return context;
|
|
65
|
-
};
|
|
66
|
-
var usePublicCalendarContext = () => {
|
|
67
|
-
const context = import_react.useContext(CalendarContext);
|
|
68
|
-
if (context === undefined) {
|
|
69
|
-
throw new Error("useCalendarContext must be used within ilamy calendar");
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
currentDate: context.currentDate,
|
|
73
|
-
view: context.view,
|
|
74
|
-
events: context.events,
|
|
75
|
-
isEventFormOpen: context.isEventFormOpen,
|
|
76
|
-
selectedEvent: context.selectedEvent,
|
|
77
|
-
selectedDate: context.selectedDate,
|
|
78
|
-
firstDayOfWeek: context.firstDayOfWeek,
|
|
79
|
-
setCurrentDate: context.setCurrentDate,
|
|
80
|
-
selectDate: context.selectDate,
|
|
81
|
-
setView: context.setView,
|
|
82
|
-
nextPeriod: context.nextPeriod,
|
|
83
|
-
prevPeriod: context.prevPeriod,
|
|
84
|
-
today: context.today,
|
|
85
|
-
addEvent: context.addEvent,
|
|
86
|
-
updateEvent: context.updateEvent,
|
|
87
|
-
deleteEvent: context.deleteEvent,
|
|
88
|
-
openEventForm: context.openEventForm,
|
|
89
|
-
closeEventForm: context.closeEventForm
|
|
90
|
-
};
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
// src/components/ui/accordion.tsx
|
|
94
|
-
var AccordionPrimitive = __toESM(require("@radix-ui/react-accordion"));
|
|
95
|
-
var import_lucide_react = require("lucide-react");
|
|
96
|
-
|
|
97
|
-
// src/lib/utils.ts
|
|
98
|
-
var import_clsx = require("clsx");
|
|
99
|
-
|
|
100
|
-
// src/lib/dayjs-config.ts
|
|
101
|
-
var import_dayjs = __toESM(require("dayjs"));
|
|
102
|
-
var import_weekday = __toESM(require("dayjs/plugin/weekday.js"));
|
|
103
|
-
var import_weekOfYear = __toESM(require("dayjs/plugin/weekOfYear.js"));
|
|
104
|
-
var import_isSameOrAfter = __toESM(require("dayjs/plugin/isSameOrAfter.js"));
|
|
105
|
-
var import_isSameOrBefore = __toESM(require("dayjs/plugin/isSameOrBefore.js"));
|
|
106
|
-
var import_isBetween = __toESM(require("dayjs/plugin/isBetween.js"));
|
|
107
|
-
var import_minMax = __toESM(require("dayjs/plugin/minMax.js"));
|
|
108
|
-
var import_timezone = __toESM(require("dayjs/plugin/timezone.js"));
|
|
109
|
-
var import_utc = __toESM(require("dayjs/plugin/utc.js"));
|
|
110
|
-
var import_localeData = __toESM(require("dayjs/plugin/localeData.js"));
|
|
111
|
-
var import_af = require("dayjs/locale/af.js");
|
|
112
|
-
var import_am = require("dayjs/locale/am.js");
|
|
113
|
-
var import_ar_dz = require("dayjs/locale/ar-dz.js");
|
|
114
|
-
var import_ar_iq = require("dayjs/locale/ar-iq.js");
|
|
115
|
-
var import_ar_kw = require("dayjs/locale/ar-kw.js");
|
|
116
|
-
var import_ar_ly = require("dayjs/locale/ar-ly.js");
|
|
117
|
-
var import_ar_ma = require("dayjs/locale/ar-ma.js");
|
|
118
|
-
var import_ar_sa = require("dayjs/locale/ar-sa.js");
|
|
119
|
-
var import_ar_tn = require("dayjs/locale/ar-tn.js");
|
|
120
|
-
var import_ar = require("dayjs/locale/ar.js");
|
|
121
|
-
var import_az = require("dayjs/locale/az.js");
|
|
122
|
-
var import_be = require("dayjs/locale/be.js");
|
|
123
|
-
var import_bg = require("dayjs/locale/bg.js");
|
|
124
|
-
var import_bi = require("dayjs/locale/bi.js");
|
|
125
|
-
var import_bm = require("dayjs/locale/bm.js");
|
|
126
|
-
var import_bn_bd = require("dayjs/locale/bn-bd.js");
|
|
127
|
-
var import_bn = require("dayjs/locale/bn.js");
|
|
128
|
-
var import_bo = require("dayjs/locale/bo.js");
|
|
129
|
-
var import_br = require("dayjs/locale/br.js");
|
|
130
|
-
var import_bs = require("dayjs/locale/bs.js");
|
|
131
|
-
var import_ca = require("dayjs/locale/ca.js");
|
|
132
|
-
var import_cs = require("dayjs/locale/cs.js");
|
|
133
|
-
var import_cv = require("dayjs/locale/cv.js");
|
|
134
|
-
var import_cy = require("dayjs/locale/cy.js");
|
|
135
|
-
var import_da = require("dayjs/locale/da.js");
|
|
136
|
-
var import_de_at = require("dayjs/locale/de-at.js");
|
|
137
|
-
var import_de_ch = require("dayjs/locale/de-ch.js");
|
|
138
|
-
var import_de = require("dayjs/locale/de.js");
|
|
139
|
-
var import_dv = require("dayjs/locale/dv.js");
|
|
140
|
-
var import_el = require("dayjs/locale/el.js");
|
|
141
|
-
var import_en_au = require("dayjs/locale/en-au.js");
|
|
142
|
-
var import_en_ca = require("dayjs/locale/en-ca.js");
|
|
143
|
-
var import_en_gb = require("dayjs/locale/en-gb.js");
|
|
144
|
-
var import_en_ie = require("dayjs/locale/en-ie.js");
|
|
145
|
-
var import_en_il = require("dayjs/locale/en-il.js");
|
|
146
|
-
var import_en_in = require("dayjs/locale/en-in.js");
|
|
147
|
-
var import_en_nz = require("dayjs/locale/en-nz.js");
|
|
148
|
-
var import_en_sg = require("dayjs/locale/en-sg.js");
|
|
149
|
-
var import_en_tt = require("dayjs/locale/en-tt.js");
|
|
150
|
-
var import_en = require("dayjs/locale/en.js");
|
|
151
|
-
var import_eo = require("dayjs/locale/eo.js");
|
|
152
|
-
var import_es_do = require("dayjs/locale/es-do.js");
|
|
153
|
-
var import_es_mx = require("dayjs/locale/es-mx.js");
|
|
154
|
-
var import_es_pr = require("dayjs/locale/es-pr.js");
|
|
155
|
-
var import_es_us = require("dayjs/locale/es-us.js");
|
|
156
|
-
var import_es = require("dayjs/locale/es.js");
|
|
157
|
-
var import_et = require("dayjs/locale/et.js");
|
|
158
|
-
var import_eu = require("dayjs/locale/eu.js");
|
|
159
|
-
var import_fa = require("dayjs/locale/fa.js");
|
|
160
|
-
var import_fi = require("dayjs/locale/fi.js");
|
|
161
|
-
var import_fo = require("dayjs/locale/fo.js");
|
|
162
|
-
var import_fr_ca = require("dayjs/locale/fr-ca.js");
|
|
163
|
-
var import_fr_ch = require("dayjs/locale/fr-ch.js");
|
|
164
|
-
var import_fr = require("dayjs/locale/fr.js");
|
|
165
|
-
var import_fy = require("dayjs/locale/fy.js");
|
|
166
|
-
var import_ga = require("dayjs/locale/ga.js");
|
|
167
|
-
var import_gd = require("dayjs/locale/gd.js");
|
|
168
|
-
var import_gl = require("dayjs/locale/gl.js");
|
|
169
|
-
var import_gom_latn = require("dayjs/locale/gom-latn.js");
|
|
170
|
-
var import_gu = require("dayjs/locale/gu.js");
|
|
171
|
-
var import_he = require("dayjs/locale/he.js");
|
|
172
|
-
var import_hi = require("dayjs/locale/hi.js");
|
|
173
|
-
var import_hr = require("dayjs/locale/hr.js");
|
|
174
|
-
var import_ht = require("dayjs/locale/ht.js");
|
|
175
|
-
var import_hu = require("dayjs/locale/hu.js");
|
|
176
|
-
var import_hy_am = require("dayjs/locale/hy-am.js");
|
|
177
|
-
var import_id = require("dayjs/locale/id.js");
|
|
178
|
-
var import_is = require("dayjs/locale/is.js");
|
|
179
|
-
var import_it_ch = require("dayjs/locale/it-ch.js");
|
|
180
|
-
var import_it = require("dayjs/locale/it.js");
|
|
181
|
-
var import_ja = require("dayjs/locale/ja.js");
|
|
182
|
-
var import_jv = require("dayjs/locale/jv.js");
|
|
183
|
-
var import_ka = require("dayjs/locale/ka.js");
|
|
184
|
-
var import_kk = require("dayjs/locale/kk.js");
|
|
185
|
-
var import_km = require("dayjs/locale/km.js");
|
|
186
|
-
var import_kn = require("dayjs/locale/kn.js");
|
|
187
|
-
var import_ko = require("dayjs/locale/ko.js");
|
|
188
|
-
var import_ku = require("dayjs/locale/ku.js");
|
|
189
|
-
var import_ky = require("dayjs/locale/ky.js");
|
|
190
|
-
var import_lb = require("dayjs/locale/lb.js");
|
|
191
|
-
var import_lo = require("dayjs/locale/lo.js");
|
|
192
|
-
var import_lt = require("dayjs/locale/lt.js");
|
|
193
|
-
var import_lv = require("dayjs/locale/lv.js");
|
|
194
|
-
var import_me = require("dayjs/locale/me.js");
|
|
195
|
-
var import_mi = require("dayjs/locale/mi.js");
|
|
196
|
-
var import_mk = require("dayjs/locale/mk.js");
|
|
197
|
-
var import_ml = require("dayjs/locale/ml.js");
|
|
198
|
-
var import_mn = require("dayjs/locale/mn.js");
|
|
199
|
-
var import_mr = require("dayjs/locale/mr.js");
|
|
200
|
-
var import_ms_my = require("dayjs/locale/ms-my.js");
|
|
201
|
-
var import_ms = require("dayjs/locale/ms.js");
|
|
202
|
-
var import_mt = require("dayjs/locale/mt.js");
|
|
203
|
-
var import_my = require("dayjs/locale/my.js");
|
|
204
|
-
var import_nb = require("dayjs/locale/nb.js");
|
|
205
|
-
var import_ne = require("dayjs/locale/ne.js");
|
|
206
|
-
var import_nl_be = require("dayjs/locale/nl-be.js");
|
|
207
|
-
var import_nl = require("dayjs/locale/nl.js");
|
|
208
|
-
var import_nn = require("dayjs/locale/nn.js");
|
|
209
|
-
var import_oc_lnc = require("dayjs/locale/oc-lnc.js");
|
|
210
|
-
var import_pa_in = require("dayjs/locale/pa-in.js");
|
|
211
|
-
var import_pl = require("dayjs/locale/pl.js");
|
|
212
|
-
var import_pt_br = require("dayjs/locale/pt-br.js");
|
|
213
|
-
var import_pt = require("dayjs/locale/pt.js");
|
|
214
|
-
var import_rn = require("dayjs/locale/rn.js");
|
|
215
|
-
var import_ro = require("dayjs/locale/ro.js");
|
|
216
|
-
var import_ru = require("dayjs/locale/ru.js");
|
|
217
|
-
var import_rw = require("dayjs/locale/rw.js");
|
|
218
|
-
var import_sd = require("dayjs/locale/sd.js");
|
|
219
|
-
var import_se = require("dayjs/locale/se.js");
|
|
220
|
-
var import_si = require("dayjs/locale/si.js");
|
|
221
|
-
var import_sk = require("dayjs/locale/sk.js");
|
|
222
|
-
var import_sl = require("dayjs/locale/sl.js");
|
|
223
|
-
var import_sq = require("dayjs/locale/sq.js");
|
|
224
|
-
var import_sr_cyrl = require("dayjs/locale/sr-cyrl.js");
|
|
225
|
-
var import_sr = require("dayjs/locale/sr.js");
|
|
226
|
-
var import_ss = require("dayjs/locale/ss.js");
|
|
227
|
-
var import_sv_fi = require("dayjs/locale/sv-fi.js");
|
|
228
|
-
var import_sv = require("dayjs/locale/sv.js");
|
|
229
|
-
var import_sw = require("dayjs/locale/sw.js");
|
|
230
|
-
var import_ta = require("dayjs/locale/ta.js");
|
|
231
|
-
var import_te = require("dayjs/locale/te.js");
|
|
232
|
-
var import_tet = require("dayjs/locale/tet.js");
|
|
233
|
-
var import_tg = require("dayjs/locale/tg.js");
|
|
234
|
-
var import_th = require("dayjs/locale/th.js");
|
|
235
|
-
var import_tk = require("dayjs/locale/tk.js");
|
|
236
|
-
var import_tl_ph = require("dayjs/locale/tl-ph.js");
|
|
237
|
-
var import_tlh = require("dayjs/locale/tlh.js");
|
|
238
|
-
var import_tr = require("dayjs/locale/tr.js");
|
|
239
|
-
var import_tzl = require("dayjs/locale/tzl.js");
|
|
240
|
-
var import_tzm_latn = require("dayjs/locale/tzm-latn.js");
|
|
241
|
-
var import_tzm = require("dayjs/locale/tzm.js");
|
|
242
|
-
var import_ug_cn = require("dayjs/locale/ug-cn.js");
|
|
243
|
-
var import_uk = require("dayjs/locale/uk.js");
|
|
244
|
-
var import_ur = require("dayjs/locale/ur.js");
|
|
245
|
-
var import_uz_latn = require("dayjs/locale/uz-latn.js");
|
|
246
|
-
var import_uz = require("dayjs/locale/uz.js");
|
|
247
|
-
var import_vi = require("dayjs/locale/vi.js");
|
|
248
|
-
var import_x_pseudo = require("dayjs/locale/x-pseudo.js");
|
|
249
|
-
var import_yo = require("dayjs/locale/yo.js");
|
|
250
|
-
var import_zh_cn = require("dayjs/locale/zh-cn.js");
|
|
251
|
-
var import_zh_hk = require("dayjs/locale/zh-hk.js");
|
|
252
|
-
var import_zh_tw = require("dayjs/locale/zh-tw.js");
|
|
253
|
-
var import_zh = require("dayjs/locale/zh.js");
|
|
254
|
-
import_dayjs.default.extend(import_weekday.default);
|
|
255
|
-
import_dayjs.default.extend(import_weekOfYear.default);
|
|
256
|
-
import_dayjs.default.extend(import_isSameOrAfter.default);
|
|
257
|
-
import_dayjs.default.extend(import_isSameOrBefore.default);
|
|
258
|
-
import_dayjs.default.extend(import_isBetween.default);
|
|
259
|
-
import_dayjs.default.extend(import_minMax.default);
|
|
260
|
-
import_dayjs.default.extend(import_timezone.default);
|
|
261
|
-
import_dayjs.default.extend(import_utc.default);
|
|
262
|
-
import_dayjs.default.extend(import_localeData.default);
|
|
263
|
-
var dayjs_config_default = import_dayjs.default;
|
|
264
|
-
|
|
265
|
-
// src/lib/utils.ts
|
|
266
|
-
var import_tailwind_merge = require("tailwind-merge");
|
|
267
|
-
function cn(...inputs) {
|
|
268
|
-
return import_tailwind_merge.twMerge(import_clsx.clsx(inputs));
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// src/components/ui/accordion.tsx
|
|
272
|
-
var jsx_dev_runtime = require("react/jsx-dev-runtime");
|
|
273
|
-
// src/components/ui/alert.tsx
|
|
274
|
-
var import_class_variance_authority = require("class-variance-authority");
|
|
275
|
-
var jsx_dev_runtime2 = require("react/jsx-dev-runtime");
|
|
276
|
-
var alertVariants = import_class_variance_authority.cva("relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", {
|
|
277
|
-
variants: {
|
|
278
|
-
variant: {
|
|
279
|
-
default: "bg-card text-card-foreground",
|
|
280
|
-
destructive: "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90",
|
|
281
|
-
primary: "bg-blue-50 dark:bg-blue-950/20 border-blue-200 dark:border-blue-800 text-blue-900 dark:text-blue-100 [&>svg]:text-blue-600 dark:[&>svg]:text-blue-400 *:data-[slot=alert-description]:text-blue-800 dark:*:data-[slot=alert-description]:text-blue-200",
|
|
282
|
-
secondary: "bg-gray-50 dark:bg-gray-950/20 border-gray-200 dark:border-gray-800 text-gray-900 dark:text-gray-100 [&>svg]:text-gray-600 dark:[&>svg]:text-gray-400 *:data-[slot=alert-description]:text-gray-800 dark:*:data-[slot=alert-description]:text-gray-200",
|
|
283
|
-
success: "bg-green-50 dark:bg-green-950/20 border-green-200 dark:border-green-800 text-green-900 dark:text-green-100 [&>svg]:text-green-600 dark:[&>svg]:text-green-400 *:data-[slot=alert-description]:text-green-800 dark:*:data-[slot=alert-description]:text-green-200",
|
|
284
|
-
warning: "bg-yellow-50 dark:bg-yellow-950/20 border-yellow-200 dark:border-yellow-800 text-yellow-900 dark:text-yellow-100 [&>svg]:text-yellow-600 dark:[&>svg]:text-yellow-400 *:data-[slot=alert-description]:text-yellow-800 dark:*:data-[slot=alert-description]:text-yellow-200"
|
|
285
|
-
}
|
|
286
|
-
},
|
|
287
|
-
defaultVariants: {
|
|
288
|
-
variant: "default"
|
|
289
|
-
}
|
|
290
|
-
});
|
|
291
|
-
// src/components/ui/badge.tsx
|
|
292
|
-
var import_react_slot = require("@radix-ui/react-slot");
|
|
293
|
-
var import_class_variance_authority2 = require("class-variance-authority");
|
|
294
|
-
var jsx_dev_runtime3 = require("react/jsx-dev-runtime");
|
|
295
|
-
var badgeVariants = import_class_variance_authority2.cva("inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-clip", {
|
|
296
|
-
variants: {
|
|
297
|
-
variant: {
|
|
298
|
-
default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
|
|
299
|
-
secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
|
|
300
|
-
destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
|
|
301
|
-
outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
|
|
302
|
-
}
|
|
303
|
-
},
|
|
304
|
-
defaultVariants: {
|
|
305
|
-
variant: "default"
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
// src/components/ui/button.tsx
|
|
309
|
-
var import_react_slot2 = require("@radix-ui/react-slot");
|
|
310
|
-
var import_class_variance_authority3 = require("class-variance-authority");
|
|
311
|
-
var jsx_dev_runtime4 = require("react/jsx-dev-runtime");
|
|
312
|
-
var buttonVariants = import_class_variance_authority3.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", {
|
|
313
|
-
variants: {
|
|
314
|
-
variant: {
|
|
315
|
-
default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
|
|
316
|
-
destructive: "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
|
|
317
|
-
outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
|
|
318
|
-
secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
|
|
319
|
-
ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
|
|
320
|
-
link: "text-primary underline-offset-4 hover:underline"
|
|
321
|
-
},
|
|
322
|
-
size: {
|
|
323
|
-
default: "h-9 px-4 py-2 has-[>svg]:px-3",
|
|
324
|
-
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
|
|
325
|
-
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
|
|
326
|
-
icon: "size-9"
|
|
327
|
-
}
|
|
328
|
-
},
|
|
329
|
-
defaultVariants: {
|
|
330
|
-
variant: "default",
|
|
331
|
-
size: "default"
|
|
332
|
-
}
|
|
333
|
-
});
|
|
334
|
-
function Button({
|
|
335
|
-
className,
|
|
336
|
-
variant,
|
|
337
|
-
size,
|
|
338
|
-
asChild = false,
|
|
339
|
-
...props
|
|
340
|
-
}) {
|
|
341
|
-
const Comp = asChild ? import_react_slot2.Slot : "button";
|
|
342
|
-
return /* @__PURE__ */ jsx_dev_runtime4.jsxDEV(Comp, {
|
|
343
|
-
"data-slot": "button",
|
|
344
|
-
className: cn(buttonVariants({ variant, size, className })),
|
|
345
|
-
...props
|
|
346
|
-
}, undefined, false, undefined, this);
|
|
347
|
-
}
|
|
348
|
-
// src/components/ui/calendar.tsx
|
|
349
|
-
var import_lucide_react2 = require("lucide-react");
|
|
350
|
-
var import_react_day_picker = require("react-day-picker");
|
|
351
|
-
var jsx_dev_runtime5 = require("react/jsx-dev-runtime");
|
|
352
|
-
function Calendar({
|
|
353
|
-
className,
|
|
354
|
-
classNames,
|
|
355
|
-
showOutsideDays = true,
|
|
356
|
-
...props
|
|
357
|
-
}) {
|
|
358
|
-
return /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(import_react_day_picker.DayPicker, {
|
|
359
|
-
showOutsideDays,
|
|
360
|
-
className: cn("p-3", className),
|
|
361
|
-
classNames: {
|
|
362
|
-
months: "flex flex-col sm:flex-row gap-2",
|
|
363
|
-
month: "flex flex-col gap-4",
|
|
364
|
-
caption: "flex justify-center pt-1 relative items-center w-full",
|
|
365
|
-
caption_label: "text-sm font-medium",
|
|
366
|
-
nav: "flex items-center gap-1",
|
|
367
|
-
nav_button: cn(buttonVariants({ variant: "outline" }), "size-7 bg-transparent p-0 opacity-50 hover:opacity-100"),
|
|
368
|
-
nav_button_previous: "absolute left-1",
|
|
369
|
-
nav_button_next: "absolute right-1",
|
|
370
|
-
table: "w-full border-collapse space-x-1",
|
|
371
|
-
head_row: "flex",
|
|
372
|
-
head_cell: "text-muted-foreground rounded-md w-8 font-normal text-[0.8rem]",
|
|
373
|
-
row: "flex w-full mt-2",
|
|
374
|
-
cell: cn("relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected].day-range-end)]:rounded-r-md", props.mode === "range" ? "[&:has(>.day-range-end)]:rounded-r-md [&:has(>.day-range-start)]:rounded-l-md first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md" : "[&:has([aria-selected])]:rounded-md"),
|
|
375
|
-
day: cn(buttonVariants({ variant: "ghost" }), "size-8 p-0 font-normal aria-selected:opacity-100"),
|
|
376
|
-
day_range_start: "day-range-start aria-selected:bg-primary aria-selected:text-primary-foreground",
|
|
377
|
-
day_range_end: "day-range-end aria-selected:bg-primary aria-selected:text-primary-foreground",
|
|
378
|
-
day_selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
|
|
379
|
-
day_today: "bg-accent text-accent-foreground",
|
|
380
|
-
day_outside: "day-outside text-muted-foreground aria-selected:text-muted-foreground",
|
|
381
|
-
day_disabled: "text-muted-foreground opacity-50",
|
|
382
|
-
day_range_middle: "aria-selected:bg-accent aria-selected:text-accent-foreground",
|
|
383
|
-
day_hidden: "invisible",
|
|
384
|
-
...classNames
|
|
385
|
-
},
|
|
386
|
-
components: {
|
|
387
|
-
IconLeft: ({ className: className2, ...props2 }) => /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(import_lucide_react2.ChevronLeft, {
|
|
388
|
-
className: cn("size-4", className2),
|
|
389
|
-
...props2
|
|
390
|
-
}, undefined, false, undefined, this),
|
|
391
|
-
IconRight: ({ className: className2, ...props2 }) => /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(import_lucide_react2.ChevronRight, {
|
|
392
|
-
className: cn("size-4", className2),
|
|
393
|
-
...props2
|
|
394
|
-
}, undefined, false, undefined, this)
|
|
395
|
-
},
|
|
396
|
-
...props
|
|
397
|
-
}, undefined, false, undefined, this);
|
|
398
|
-
}
|
|
399
|
-
// src/components/ui/checkbox.tsx
|
|
400
|
-
var CheckboxPrimitive = __toESM(require("@radix-ui/react-checkbox"));
|
|
401
|
-
var import_lucide_react3 = require("lucide-react");
|
|
402
|
-
var jsx_dev_runtime6 = require("react/jsx-dev-runtime");
|
|
403
|
-
function Checkbox({
|
|
404
|
-
className,
|
|
405
|
-
...props
|
|
406
|
-
}) {
|
|
407
|
-
return /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(CheckboxPrimitive.Root, {
|
|
408
|
-
"data-slot": "checkbox",
|
|
409
|
-
className: cn("peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className),
|
|
410
|
-
...props,
|
|
411
|
-
children: /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(CheckboxPrimitive.Indicator, {
|
|
412
|
-
"data-slot": "checkbox-indicator",
|
|
413
|
-
className: "flex items-center justify-center text-current transition-none",
|
|
414
|
-
children: /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(import_lucide_react3.CheckIcon, {
|
|
415
|
-
className: "size-3.5"
|
|
416
|
-
}, undefined, false, undefined, this)
|
|
417
|
-
}, undefined, false, undefined, this)
|
|
418
|
-
}, undefined, false, undefined, this);
|
|
419
|
-
}
|
|
420
|
-
// src/components/ui/card.tsx
|
|
421
|
-
var jsx_dev_runtime7 = require("react/jsx-dev-runtime");
|
|
422
|
-
// src/components/ui/date-picker.tsx
|
|
423
|
-
var import_lucide_react4 = require("lucide-react");
|
|
424
|
-
|
|
425
|
-
// src/components/ui/popover.tsx
|
|
426
|
-
var PopoverPrimitive = __toESM(require("@radix-ui/react-popover"));
|
|
427
|
-
var jsx_dev_runtime8 = require("react/jsx-dev-runtime");
|
|
428
|
-
function Popover({
|
|
429
|
-
...props
|
|
430
|
-
}) {
|
|
431
|
-
return /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(PopoverPrimitive.Root, {
|
|
432
|
-
"data-slot": "popover",
|
|
433
|
-
...props
|
|
434
|
-
}, undefined, false, undefined, this);
|
|
435
|
-
}
|
|
436
|
-
function PopoverTrigger({
|
|
437
|
-
...props
|
|
438
|
-
}) {
|
|
439
|
-
return /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(PopoverPrimitive.Trigger, {
|
|
440
|
-
"data-slot": "popover-trigger",
|
|
441
|
-
...props
|
|
442
|
-
}, undefined, false, undefined, this);
|
|
443
|
-
}
|
|
444
|
-
function PopoverContent({
|
|
445
|
-
className,
|
|
446
|
-
align = "center",
|
|
447
|
-
sideOffset = 4,
|
|
448
|
-
...props
|
|
449
|
-
}) {
|
|
450
|
-
return /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(PopoverPrimitive.Portal, {
|
|
451
|
-
children: /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(PopoverPrimitive.Content, {
|
|
452
|
-
"data-slot": "popover-content",
|
|
453
|
-
align,
|
|
454
|
-
sideOffset,
|
|
455
|
-
className: cn("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden", className),
|
|
456
|
-
...props
|
|
457
|
-
}, undefined, false, undefined, this)
|
|
458
|
-
}, undefined, false, undefined, this);
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
// src/components/ui/date-picker.tsx
|
|
462
|
-
var import_react2 = require("react");
|
|
463
|
-
var import_react_popover = require("@radix-ui/react-popover");
|
|
464
|
-
var jsx_dev_runtime9 = require("react/jsx-dev-runtime");
|
|
465
|
-
function DatePicker({
|
|
466
|
-
date,
|
|
467
|
-
closeOnSelect,
|
|
468
|
-
setDate,
|
|
469
|
-
label = "Pick a date",
|
|
470
|
-
className
|
|
471
|
-
}) {
|
|
472
|
-
const popOverRef = import_react2.useRef(null);
|
|
473
|
-
const onSelect = (date2) => {
|
|
474
|
-
setDate(date2);
|
|
475
|
-
if (closeOnSelect) {
|
|
476
|
-
popOverRef.current?.click();
|
|
477
|
-
}
|
|
478
|
-
};
|
|
479
|
-
return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV("div", {
|
|
480
|
-
className,
|
|
481
|
-
children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Popover, {
|
|
482
|
-
children: [
|
|
483
|
-
/* @__PURE__ */ jsx_dev_runtime9.jsxDEV(PopoverTrigger, {
|
|
484
|
-
asChild: true,
|
|
485
|
-
children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Button, {
|
|
486
|
-
variant: "outline",
|
|
487
|
-
className: cn("w-full justify-start text-left font-normal", !date && "text-muted-foreground"),
|
|
488
|
-
children: [
|
|
489
|
-
/* @__PURE__ */ jsx_dev_runtime9.jsxDEV(import_lucide_react4.Calendar, {
|
|
490
|
-
className: "mr-2 h-4 w-4"
|
|
491
|
-
}, undefined, false, undefined, this),
|
|
492
|
-
date ? dayjs_config_default(date).format("MMM D, YYYY") : /* @__PURE__ */ jsx_dev_runtime9.jsxDEV("span", {
|
|
493
|
-
children: label
|
|
494
|
-
}, undefined, false, undefined, this)
|
|
495
|
-
]
|
|
496
|
-
}, undefined, true, undefined, this)
|
|
497
|
-
}, undefined, false, undefined, this),
|
|
498
|
-
/* @__PURE__ */ jsx_dev_runtime9.jsxDEV(PopoverContent, {
|
|
499
|
-
className: "w-auto p-0",
|
|
500
|
-
align: "start",
|
|
501
|
-
children: [
|
|
502
|
-
/* @__PURE__ */ jsx_dev_runtime9.jsxDEV(import_react_popover.PopoverClose, {
|
|
503
|
-
ref: popOverRef
|
|
504
|
-
}, undefined, false, undefined, this),
|
|
505
|
-
/* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Calendar, {
|
|
506
|
-
mode: "single",
|
|
507
|
-
selected: date,
|
|
508
|
-
onSelect,
|
|
509
|
-
initialFocus: true
|
|
510
|
-
}, undefined, false, undefined, this)
|
|
511
|
-
]
|
|
512
|
-
}, undefined, true, undefined, this)
|
|
513
|
-
]
|
|
514
|
-
}, undefined, true, undefined, this)
|
|
515
|
-
}, undefined, false, undefined, this);
|
|
516
|
-
}
|
|
517
|
-
// src/components/ui/dialog.tsx
|
|
518
|
-
var DialogPrimitive = __toESM(require("@radix-ui/react-dialog"));
|
|
519
|
-
var import_lucide_react5 = require("lucide-react");
|
|
520
|
-
var jsx_dev_runtime10 = require("react/jsx-dev-runtime");
|
|
521
|
-
function Dialog({
|
|
522
|
-
...props
|
|
523
|
-
}) {
|
|
524
|
-
return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(DialogPrimitive.Root, {
|
|
525
|
-
"data-slot": "dialog",
|
|
526
|
-
...props
|
|
527
|
-
}, undefined, false, undefined, this);
|
|
528
|
-
}
|
|
529
|
-
function DialogPortal({
|
|
530
|
-
...props
|
|
531
|
-
}) {
|
|
532
|
-
return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(DialogPrimitive.Portal, {
|
|
533
|
-
"data-slot": "dialog-portal",
|
|
534
|
-
...props
|
|
535
|
-
}, undefined, false, undefined, this);
|
|
536
|
-
}
|
|
537
|
-
function DialogOverlay({
|
|
538
|
-
className,
|
|
539
|
-
...props
|
|
540
|
-
}) {
|
|
541
|
-
return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(DialogPrimitive.Overlay, {
|
|
542
|
-
"data-slot": "dialog-overlay",
|
|
543
|
-
className: cn("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50", className),
|
|
544
|
-
...props
|
|
545
|
-
}, undefined, false, undefined, this);
|
|
546
|
-
}
|
|
547
|
-
function DialogContent({
|
|
548
|
-
className,
|
|
549
|
-
children,
|
|
550
|
-
...props
|
|
551
|
-
}) {
|
|
552
|
-
return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(DialogPortal, {
|
|
553
|
-
"data-slot": "dialog-portal",
|
|
554
|
-
children: [
|
|
555
|
-
/* @__PURE__ */ jsx_dev_runtime10.jsxDEV(DialogOverlay, {}, undefined, false, undefined, this),
|
|
556
|
-
/* @__PURE__ */ jsx_dev_runtime10.jsxDEV(DialogPrimitive.Content, {
|
|
557
|
-
"data-slot": "dialog-content",
|
|
558
|
-
className: cn("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg", className),
|
|
559
|
-
...props,
|
|
560
|
-
children: [
|
|
561
|
-
children,
|
|
562
|
-
/* @__PURE__ */ jsx_dev_runtime10.jsxDEV(DialogPrimitive.Close, {
|
|
563
|
-
className: "ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
564
|
-
children: [
|
|
565
|
-
/* @__PURE__ */ jsx_dev_runtime10.jsxDEV(import_lucide_react5.XIcon, {}, undefined, false, undefined, this),
|
|
566
|
-
/* @__PURE__ */ jsx_dev_runtime10.jsxDEV("span", {
|
|
567
|
-
className: "sr-only",
|
|
568
|
-
children: "Close"
|
|
569
|
-
}, undefined, false, undefined, this)
|
|
570
|
-
]
|
|
571
|
-
}, undefined, true, undefined, this)
|
|
572
|
-
]
|
|
573
|
-
}, undefined, true, undefined, this)
|
|
574
|
-
]
|
|
575
|
-
}, undefined, true, undefined, this);
|
|
576
|
-
}
|
|
577
|
-
function DialogHeader({ className, ...props }) {
|
|
578
|
-
return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV("div", {
|
|
579
|
-
"data-slot": "dialog-header",
|
|
580
|
-
className: cn("flex flex-col gap-2 text-center sm:text-left", className),
|
|
581
|
-
...props
|
|
582
|
-
}, undefined, false, undefined, this);
|
|
583
|
-
}
|
|
584
|
-
function DialogFooter({ className, ...props }) {
|
|
585
|
-
return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV("div", {
|
|
586
|
-
"data-slot": "dialog-footer",
|
|
587
|
-
className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className),
|
|
588
|
-
...props
|
|
589
|
-
}, undefined, false, undefined, this);
|
|
590
|
-
}
|
|
591
|
-
function DialogTitle({
|
|
592
|
-
className,
|
|
593
|
-
...props
|
|
594
|
-
}) {
|
|
595
|
-
return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(DialogPrimitive.Title, {
|
|
596
|
-
"data-slot": "dialog-title",
|
|
597
|
-
className: cn("text-lg leading-none font-semibold", className),
|
|
598
|
-
...props
|
|
599
|
-
}, undefined, false, undefined, this);
|
|
600
|
-
}
|
|
601
|
-
function DialogDescription({
|
|
602
|
-
className,
|
|
603
|
-
...props
|
|
604
|
-
}) {
|
|
605
|
-
return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(DialogPrimitive.Description, {
|
|
606
|
-
"data-slot": "dialog-description",
|
|
607
|
-
className: cn("text-muted-foreground text-sm", className),
|
|
608
|
-
...props
|
|
609
|
-
}, undefined, false, undefined, this);
|
|
610
|
-
}
|
|
611
|
-
// src/components/ui/dropdown-menu.tsx
|
|
612
|
-
var DropdownMenuPrimitive = __toESM(require("@radix-ui/react-dropdown-menu"));
|
|
613
|
-
var import_lucide_react6 = require("lucide-react");
|
|
614
|
-
var jsx_dev_runtime11 = require("react/jsx-dev-runtime");
|
|
615
|
-
// src/components/ui/form.tsx
|
|
616
|
-
var React2 = __toESM(require("react"));
|
|
617
|
-
var import_react_slot3 = require("@radix-ui/react-slot");
|
|
618
|
-
|
|
619
|
-
// node_modules/react-hook-form/dist/index.esm.mjs
|
|
620
|
-
var React = __toESM(require("react"));
|
|
621
|
-
var import_react3 = __toESM(require("react"));
|
|
622
|
-
var isWeb = typeof window !== "undefined" && typeof window.HTMLElement !== "undefined" && typeof document !== "undefined";
|
|
623
|
-
var VALIDATION_MODE = {
|
|
624
|
-
onBlur: "onBlur",
|
|
625
|
-
onChange: "onChange",
|
|
626
|
-
onSubmit: "onSubmit",
|
|
627
|
-
onTouched: "onTouched",
|
|
628
|
-
all: "all"
|
|
629
|
-
};
|
|
630
|
-
var HookFormContext = import_react3.default.createContext(null);
|
|
631
|
-
HookFormContext.displayName = "HookFormContext";
|
|
632
|
-
var defaultOptions = {
|
|
633
|
-
mode: VALIDATION_MODE.onSubmit,
|
|
634
|
-
reValidateMode: VALIDATION_MODE.onChange,
|
|
635
|
-
shouldFocusError: true
|
|
636
|
-
};
|
|
637
|
-
|
|
638
|
-
// src/components/ui/label.tsx
|
|
639
|
-
var LabelPrimitive = __toESM(require("@radix-ui/react-label"));
|
|
640
|
-
var jsx_dev_runtime12 = require("react/jsx-dev-runtime");
|
|
641
|
-
|
|
642
|
-
function Label2({
|
|
643
|
-
className,
|
|
644
|
-
...props
|
|
645
|
-
}) {
|
|
646
|
-
return /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(LabelPrimitive.Root, {
|
|
647
|
-
"data-slot": "label",
|
|
648
|
-
className: cn("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50", className),
|
|
649
|
-
...props
|
|
650
|
-
}, undefined, false, undefined, this);
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
// src/components/ui/form.tsx
|
|
654
|
-
var jsx_dev_runtime13 = require("react/jsx-dev-runtime");
|
|
655
|
-
var FormFieldContext = React2.createContext({});
|
|
656
|
-
var FormItemContext = React2.createContext({});
|
|
657
|
-
// src/components/ui/input.tsx
|
|
658
|
-
var jsx_dev_runtime14 = require("react/jsx-dev-runtime");
|
|
659
|
-
function Input({ className, type, ...props }) {
|
|
660
|
-
return /* @__PURE__ */ jsx_dev_runtime14.jsxDEV("input", {
|
|
661
|
-
type,
|
|
662
|
-
"data-slot": "input",
|
|
663
|
-
className: cn("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", className),
|
|
664
|
-
...props
|
|
665
|
-
}, undefined, false, undefined, this);
|
|
666
|
-
}
|
|
667
|
-
// src/components/ui/link.tsx
|
|
668
|
-
var jsx_dev_runtime15 = require("react/jsx-dev-runtime");
|
|
669
|
-
// src/components/ui/scroll-area.tsx
|
|
670
|
-
var ScrollAreaPrimitive = __toESM(require("@radix-ui/react-scroll-area"));
|
|
671
|
-
var jsx_dev_runtime16 = require("react/jsx-dev-runtime");
|
|
672
|
-
function ScrollArea({
|
|
673
|
-
className,
|
|
674
|
-
children,
|
|
675
|
-
...props
|
|
676
|
-
}) {
|
|
677
|
-
return /* @__PURE__ */ jsx_dev_runtime16.jsxDEV(ScrollAreaPrimitive.Root, {
|
|
678
|
-
"data-slot": "scroll-area",
|
|
679
|
-
className: cn("relative", className),
|
|
680
|
-
...props,
|
|
681
|
-
children: [
|
|
682
|
-
/* @__PURE__ */ jsx_dev_runtime16.jsxDEV(ScrollAreaPrimitive.Viewport, {
|
|
683
|
-
"data-slot": "scroll-area-viewport",
|
|
684
|
-
className: "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1",
|
|
685
|
-
children
|
|
686
|
-
}, undefined, false, undefined, this),
|
|
687
|
-
/* @__PURE__ */ jsx_dev_runtime16.jsxDEV(ScrollBar, {}, undefined, false, undefined, this),
|
|
688
|
-
/* @__PURE__ */ jsx_dev_runtime16.jsxDEV(ScrollAreaPrimitive.Corner, {}, undefined, false, undefined, this)
|
|
689
|
-
]
|
|
690
|
-
}, undefined, true, undefined, this);
|
|
691
|
-
}
|
|
692
|
-
function ScrollBar({
|
|
693
|
-
className,
|
|
694
|
-
orientation = "vertical",
|
|
695
|
-
...props
|
|
696
|
-
}) {
|
|
697
|
-
return /* @__PURE__ */ jsx_dev_runtime16.jsxDEV(ScrollAreaPrimitive.ScrollAreaScrollbar, {
|
|
698
|
-
"data-slot": "scroll-area-scrollbar",
|
|
699
|
-
orientation,
|
|
700
|
-
className: cn("flex touch-none p-px transition-colors select-none", orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent", orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent", className),
|
|
701
|
-
...props,
|
|
702
|
-
children: /* @__PURE__ */ jsx_dev_runtime16.jsxDEV(ScrollAreaPrimitive.ScrollAreaThumb, {
|
|
703
|
-
"data-slot": "scroll-area-thumb",
|
|
704
|
-
className: "bg-border relative flex-1 rounded-full"
|
|
705
|
-
}, undefined, false, undefined, this)
|
|
706
|
-
}, undefined, false, undefined, this);
|
|
707
|
-
}
|
|
708
|
-
// src/components/ui/select.tsx
|
|
709
|
-
var SelectPrimitive = __toESM(require("@radix-ui/react-select"));
|
|
710
|
-
var import_lucide_react7 = require("lucide-react");
|
|
711
|
-
var jsx_dev_runtime17 = require("react/jsx-dev-runtime");
|
|
712
|
-
// src/components/ui/separator.tsx
|
|
713
|
-
var SeparatorPrimitive = __toESM(require("@radix-ui/react-separator"));
|
|
714
|
-
var jsx_dev_runtime18 = require("react/jsx-dev-runtime");
|
|
715
|
-
// src/components/ui/sheet.tsx
|
|
716
|
-
var SheetPrimitive = __toESM(require("@radix-ui/react-dialog"));
|
|
717
|
-
var import_lucide_react8 = require("lucide-react");
|
|
718
|
-
var jsx_dev_runtime19 = require("react/jsx-dev-runtime");
|
|
719
|
-
// src/components/ui/table.tsx
|
|
720
|
-
var jsx_dev_runtime20 = require("react/jsx-dev-runtime");
|
|
721
|
-
// src/components/ui/tabs.tsx
|
|
722
|
-
var TabsPrimitive = __toESM(require("@radix-ui/react-tabs"));
|
|
723
|
-
var jsx_dev_runtime21 = require("react/jsx-dev-runtime");
|
|
724
|
-
// src/components/ui/textarea.tsx
|
|
725
|
-
var jsx_dev_runtime22 = require("react/jsx-dev-runtime");
|
|
726
|
-
// src/components/ui/tooltip.tsx
|
|
727
|
-
var TooltipPrimitive = __toESM(require("@radix-ui/react-tooltip"));
|
|
728
|
-
var jsx_dev_runtime23 = require("react/jsx-dev-runtime");
|
|
729
|
-
function TooltipProvider({
|
|
730
|
-
delayDuration = 0,
|
|
731
|
-
...props
|
|
732
|
-
}) {
|
|
733
|
-
return /* @__PURE__ */ jsx_dev_runtime23.jsxDEV(TooltipPrimitive.Provider, {
|
|
734
|
-
"data-slot": "tooltip-provider",
|
|
735
|
-
delayDuration,
|
|
736
|
-
...props
|
|
737
|
-
}, undefined, false, undefined, this);
|
|
738
|
-
}
|
|
739
|
-
function Tooltip({
|
|
740
|
-
...props
|
|
741
|
-
}) {
|
|
742
|
-
return /* @__PURE__ */ jsx_dev_runtime23.jsxDEV(TooltipProvider, {
|
|
743
|
-
children: /* @__PURE__ */ jsx_dev_runtime23.jsxDEV(TooltipPrimitive.Root, {
|
|
744
|
-
"data-slot": "tooltip",
|
|
745
|
-
...props
|
|
746
|
-
}, undefined, false, undefined, this)
|
|
747
|
-
}, undefined, false, undefined, this);
|
|
748
|
-
}
|
|
749
|
-
function TooltipTrigger({
|
|
750
|
-
...props
|
|
751
|
-
}) {
|
|
752
|
-
return /* @__PURE__ */ jsx_dev_runtime23.jsxDEV(TooltipPrimitive.Trigger, {
|
|
753
|
-
"data-slot": "tooltip-trigger",
|
|
754
|
-
...props
|
|
755
|
-
}, undefined, false, undefined, this);
|
|
756
|
-
}
|
|
757
|
-
function TooltipContent({
|
|
758
|
-
className,
|
|
759
|
-
sideOffset = 0,
|
|
760
|
-
children,
|
|
761
|
-
...props
|
|
762
|
-
}) {
|
|
763
|
-
return /* @__PURE__ */ jsx_dev_runtime23.jsxDEV(TooltipPrimitive.Portal, {
|
|
764
|
-
children: /* @__PURE__ */ jsx_dev_runtime23.jsxDEV(TooltipPrimitive.Content, {
|
|
765
|
-
"data-slot": "tooltip-content",
|
|
766
|
-
sideOffset,
|
|
767
|
-
className: cn("bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance", className),
|
|
768
|
-
...props,
|
|
769
|
-
children: [
|
|
770
|
-
children,
|
|
771
|
-
/* @__PURE__ */ jsx_dev_runtime23.jsxDEV(TooltipPrimitive.Arrow, {
|
|
772
|
-
className: "bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]"
|
|
773
|
-
}, undefined, false, undefined, this)
|
|
774
|
-
]
|
|
775
|
-
}, undefined, true, undefined, this)
|
|
776
|
-
}, undefined, false, undefined, this);
|
|
777
|
-
}
|
|
778
|
-
// src/features/month-view/components/all-events-dialog.tsx
|
|
779
|
-
var import_react6 = require("react");
|
|
780
|
-
|
|
781
|
-
// src/features/draggable-event/draggable-event.tsx
|
|
782
|
-
var import_core = require("@dnd-kit/core");
|
|
783
|
-
var import_react4 = require("motion/react");
|
|
784
|
-
var import_react5 = require("react");
|
|
785
|
-
var jsx_dev_runtime24 = require("react/jsx-dev-runtime");
|
|
786
|
-
function DraggableEventUnmemoized({
|
|
787
|
-
elementId,
|
|
788
|
-
event,
|
|
789
|
-
className,
|
|
790
|
-
style,
|
|
791
|
-
disableDrag = false
|
|
792
|
-
}) {
|
|
793
|
-
const { onEventClick, renderEvent, disableEventClick, disableDragAndDrop } = useCalendarContext();
|
|
794
|
-
const { attributes, listeners, setNodeRef, isDragging } = import_core.useDraggable({
|
|
795
|
-
id: elementId,
|
|
796
|
-
data: {
|
|
797
|
-
event,
|
|
798
|
-
type: "calendar-event"
|
|
799
|
-
},
|
|
800
|
-
disabled: disableDrag || disableDragAndDrop
|
|
801
|
-
});
|
|
802
|
-
const DefaultEventContent = () => /* @__PURE__ */ jsx_dev_runtime24.jsxDEV("div", {
|
|
803
|
-
className: cn(event.backgroundColor || "bg-blue-500", event.color || "text-white", "h-full w-full px-1 border-[1.5px] border-card rounded-md text-left overflow-clip"),
|
|
804
|
-
style: { backgroundColor: event.backgroundColor, color: event.color },
|
|
805
|
-
children: /* @__PURE__ */ jsx_dev_runtime24.jsxDEV("p", {
|
|
806
|
-
className: "text-[10px] font-semibold sm:text-xs mt-0.5",
|
|
807
|
-
children: event.title
|
|
808
|
-
}, undefined, false, undefined, this)
|
|
809
|
-
}, undefined, false, undefined, this);
|
|
810
|
-
return /* @__PURE__ */ jsx_dev_runtime24.jsxDEV(import_react4.AnimatePresence, {
|
|
811
|
-
mode: "wait",
|
|
812
|
-
children: /* @__PURE__ */ jsx_dev_runtime24.jsxDEV(import_react4.motion.div, {
|
|
813
|
-
ref: setNodeRef,
|
|
814
|
-
...attributes,
|
|
815
|
-
...listeners,
|
|
816
|
-
initial: { opacity: 0, y: -50 },
|
|
817
|
-
animate: { opacity: 1, y: 0 },
|
|
818
|
-
exit: { opacity: 0, y: -50 },
|
|
819
|
-
layout: true,
|
|
820
|
-
layoutId: elementId,
|
|
821
|
-
transition: { duration: 0.4, ease: "easeInOut" },
|
|
822
|
-
className: cn("truncate h-full w-full", disableDrag || disableDragAndDrop ? disableEventClick ? "cursor-default" : "cursor-pointer" : "cursor-grab", isDragging && !(disableDrag || disableDragAndDrop) && "cursor-grabbing shadow-lg", className),
|
|
823
|
-
style,
|
|
824
|
-
onClick: (e) => {
|
|
825
|
-
e.stopPropagation();
|
|
826
|
-
onEventClick(event);
|
|
827
|
-
},
|
|
828
|
-
children: renderEvent ? renderEvent(event) : /* @__PURE__ */ jsx_dev_runtime24.jsxDEV(DefaultEventContent, {}, undefined, false, undefined, this)
|
|
829
|
-
}, elementId, false, undefined, this)
|
|
830
|
-
}, undefined, false, undefined, this);
|
|
831
|
-
}
|
|
832
|
-
var DraggableEvent = import_react5.memo(DraggableEventUnmemoized, (prevProps, nextProps) => {
|
|
833
|
-
return prevProps.elementId === nextProps.elementId && prevProps.disableDrag === nextProps.disableDrag && prevProps.className === nextProps.className && prevProps.event.id === nextProps.event.id && prevProps.event.height === nextProps.event.height;
|
|
834
|
-
});
|
|
835
|
-
|
|
836
|
-
// src/features/month-view/components/all-events-dialog.tsx
|
|
837
|
-
var jsx_dev_runtime25 = require("react/jsx-dev-runtime");
|
|
838
|
-
var AllEventDialog = ({ ref }) => {
|
|
839
|
-
const [dialogOpen, setDialogOpen] = import_react6.useState(false);
|
|
840
|
-
const [selectedDayEvents, setSelectedDayEvents] = import_react6.useState(null);
|
|
841
|
-
const { currentDate, firstDayOfWeek } = useCalendarContext();
|
|
842
|
-
import_react6.useImperativeHandle(ref, () => ({
|
|
843
|
-
open: () => setDialogOpen(true),
|
|
844
|
-
close: () => setDialogOpen(false),
|
|
845
|
-
setSelectedDayEvents: (dayEvents) => setSelectedDayEvents(dayEvents)
|
|
846
|
-
}));
|
|
847
|
-
const firstDayOfMonth = currentDate.startOf("month");
|
|
848
|
-
let adjustedFirstDayOfCalendar = firstDayOfMonth.clone();
|
|
849
|
-
while (adjustedFirstDayOfCalendar.day() !== firstDayOfWeek) {
|
|
850
|
-
adjustedFirstDayOfCalendar = adjustedFirstDayOfCalendar.subtract(1, "day");
|
|
851
|
-
}
|
|
852
|
-
return /* @__PURE__ */ jsx_dev_runtime25.jsxDEV(Dialog, {
|
|
853
|
-
open: dialogOpen,
|
|
854
|
-
onOpenChange: setDialogOpen,
|
|
855
|
-
children: /* @__PURE__ */ jsx_dev_runtime25.jsxDEV(DialogContent, {
|
|
856
|
-
className: "max-h-[80vh] max-w-md overflow-y-auto",
|
|
857
|
-
children: [
|
|
858
|
-
/* @__PURE__ */ jsx_dev_runtime25.jsxDEV(DialogHeader, {
|
|
859
|
-
children: /* @__PURE__ */ jsx_dev_runtime25.jsxDEV(DialogTitle, {
|
|
860
|
-
children: selectedDayEvents && selectedDayEvents.day.format("MMMM D, YYYY")
|
|
861
|
-
}, undefined, false, undefined, this)
|
|
862
|
-
}, undefined, false, undefined, this),
|
|
863
|
-
/* @__PURE__ */ jsx_dev_runtime25.jsxDEV("div", {
|
|
864
|
-
className: "mt-4 space-y-3",
|
|
865
|
-
children: selectedDayEvents && selectedDayEvents.events.map((event) => {
|
|
866
|
-
return /* @__PURE__ */ jsx_dev_runtime25.jsxDEV(DraggableEvent, {
|
|
867
|
-
elementId: event.id,
|
|
868
|
-
event,
|
|
869
|
-
className: "relative my-1 h-[30px]"
|
|
870
|
-
}, event.id, false, undefined, this);
|
|
871
|
-
})
|
|
872
|
-
}, undefined, false, undefined, this)
|
|
873
|
-
]
|
|
874
|
-
}, undefined, true, undefined, this)
|
|
875
|
-
}, undefined, false, undefined, this);
|
|
876
|
-
};
|
|
877
|
-
|
|
878
|
-
// src/features/month-view/components/day-cell.tsx
|
|
879
|
-
var import_react7 = __toESM(require("react"));
|
|
880
|
-
|
|
881
|
-
// src/features/droppable-cell/droppable-cell.tsx
|
|
882
|
-
var import_core2 = require("@dnd-kit/core");
|
|
883
|
-
var jsx_dev_runtime26 = require("react/jsx-dev-runtime");
|
|
884
|
-
function DroppableCell({
|
|
885
|
-
id,
|
|
886
|
-
type,
|
|
887
|
-
date,
|
|
888
|
-
hour,
|
|
889
|
-
minute,
|
|
890
|
-
children,
|
|
891
|
-
className,
|
|
892
|
-
style,
|
|
893
|
-
"data-testid": dataTestId
|
|
894
|
-
}) {
|
|
895
|
-
const { onCellClick, disableDragAndDrop, disableCellClick } = useCalendarContext();
|
|
896
|
-
const { isOver, setNodeRef } = import_core2.useDroppable({
|
|
897
|
-
id,
|
|
898
|
-
data: {
|
|
899
|
-
type,
|
|
900
|
-
date,
|
|
901
|
-
hour,
|
|
902
|
-
minute
|
|
903
|
-
},
|
|
904
|
-
disabled: disableDragAndDrop
|
|
905
|
-
});
|
|
906
|
-
const handleCellClick = (e) => {
|
|
907
|
-
e.stopPropagation();
|
|
908
|
-
if (disableCellClick)
|
|
909
|
-
return;
|
|
910
|
-
const startDate = date.hour(hour ?? 0).minute(minute ?? 0);
|
|
911
|
-
let endDate = startDate.clone();
|
|
912
|
-
if (hour !== undefined && minute !== undefined) {
|
|
913
|
-
endDate = endDate.hour(hour).minute(minute + 15);
|
|
914
|
-
} else if (hour !== undefined) {
|
|
915
|
-
endDate = endDate.hour(hour + 1).minute(0);
|
|
916
|
-
} else {
|
|
917
|
-
endDate = endDate.hour(23).minute(59);
|
|
918
|
-
}
|
|
919
|
-
onCellClick(startDate, endDate);
|
|
920
|
-
};
|
|
921
|
-
return /* @__PURE__ */ jsx_dev_runtime26.jsxDEV("div", {
|
|
922
|
-
ref: setNodeRef,
|
|
923
|
-
"data-testid": dataTestId,
|
|
924
|
-
className: cn(className, isOver && !disableDragAndDrop && "bg-accent", disableCellClick ? "cursor-default" : "cursor-pointer"),
|
|
925
|
-
onClick: handleCellClick,
|
|
926
|
-
style,
|
|
927
|
-
children
|
|
928
|
-
}, undefined, false, undefined, this);
|
|
929
|
-
}
|
|
930
|
-
|
|
931
|
-
// src/features/month-view/components/day-cell.tsx
|
|
932
|
-
var jsx_dev_runtime27 = require("react/jsx-dev-runtime");
|
|
933
|
-
var DayCell = ({
|
|
934
|
-
index,
|
|
935
|
-
day,
|
|
936
|
-
className = ""
|
|
937
|
-
}) => {
|
|
938
|
-
const allEventsDialogRef = import_react7.default.useRef(null);
|
|
939
|
-
const {
|
|
940
|
-
events,
|
|
941
|
-
currentDate,
|
|
942
|
-
firstDayOfWeek,
|
|
943
|
-
dayMaxEvents = 0
|
|
944
|
-
} = useCalendarContext();
|
|
945
|
-
const todayEvents = events.filter((e) => {
|
|
946
|
-
const startsToday = e.start.isSame(day, "day");
|
|
947
|
-
const endsToday = e.end.isSame(day, "day");
|
|
948
|
-
const spansToday = e.start.isBefore(day, "day") && e.end.isAfter(day, "day");
|
|
949
|
-
return startsToday || endsToday || spansToday;
|
|
950
|
-
});
|
|
951
|
-
const firstDayOfMonth = currentDate.startOf("month");
|
|
952
|
-
let adjustedFirstDayOfCalendar = firstDayOfMonth.clone();
|
|
953
|
-
while (adjustedFirstDayOfCalendar.day() !== firstDayOfWeek) {
|
|
954
|
-
adjustedFirstDayOfCalendar = adjustedFirstDayOfCalendar.subtract(1, "day");
|
|
955
|
-
}
|
|
956
|
-
const showAllEvents = (day2, events2) => {
|
|
957
|
-
allEventsDialogRef.current?.setSelectedDayEvents({
|
|
958
|
-
day: day2,
|
|
959
|
-
events: events2
|
|
960
|
-
});
|
|
961
|
-
allEventsDialogRef.current?.open();
|
|
962
|
-
};
|
|
963
|
-
const isToday = day.isSame(dayjs_config_default(), "day");
|
|
964
|
-
const isCurrentMonth = day.month() === currentDate.month();
|
|
965
|
-
const isLastColumn = index === 6;
|
|
966
|
-
const hiddenEventsCount = todayEvents.length - dayMaxEvents;
|
|
967
|
-
const hasHiddenEvents = hiddenEventsCount > 0;
|
|
968
|
-
return /* @__PURE__ */ jsx_dev_runtime27.jsxDEV(jsx_dev_runtime27.Fragment, {
|
|
969
|
-
children: [
|
|
970
|
-
/* @__PURE__ */ jsx_dev_runtime27.jsxDEV(DroppableCell, {
|
|
971
|
-
id: `day-cell-${day.format("YYYY-MM-DD")}`,
|
|
972
|
-
type: "day-cell",
|
|
973
|
-
"data-testid": `day-cell-${day.format("YYYY-MM-DD")}`,
|
|
974
|
-
date: day,
|
|
975
|
-
className: cn("cursor-pointer overflow-clip p-1 hover:bg-accent", !isCurrentMonth && "bg-secondary text-muted-foreground", isLastColumn && "border-r-0", className),
|
|
976
|
-
children: /* @__PURE__ */ jsx_dev_runtime27.jsxDEV("div", {
|
|
977
|
-
className: "flex flex-col gap-1",
|
|
978
|
-
children: [
|
|
979
|
-
/* @__PURE__ */ jsx_dev_runtime27.jsxDEV("div", {
|
|
980
|
-
className: cn("flex h-5 w-5 items-center justify-center rounded-full text-xs sm:h-6 sm:w-6 sm:text-sm", isToday && "bg-primary text-primary-foreground font-medium"),
|
|
981
|
-
children: day.date()
|
|
982
|
-
}, undefined, false, undefined, this),
|
|
983
|
-
todayEvents.slice(0, dayMaxEvents).map((event, rowIndex) => /* @__PURE__ */ jsx_dev_runtime27.jsxDEV("div", {
|
|
984
|
-
className: "h-[20px] w-full",
|
|
985
|
-
"data-testid": event?.title
|
|
986
|
-
}, `empty-${rowIndex}`, false, undefined, this)),
|
|
987
|
-
hasHiddenEvents && /* @__PURE__ */ jsx_dev_runtime27.jsxDEV("div", {
|
|
988
|
-
className: "text-muted-foreground hover:text-foreground cursor-pointer text-[10px] whitespace-nowrap sm:text-xs mt-1",
|
|
989
|
-
onClick: (e) => {
|
|
990
|
-
e.stopPropagation();
|
|
991
|
-
showAllEvents(day, todayEvents);
|
|
992
|
-
},
|
|
993
|
-
children: [
|
|
994
|
-
"+",
|
|
995
|
-
hiddenEventsCount,
|
|
996
|
-
" more"
|
|
997
|
-
]
|
|
998
|
-
}, undefined, true, undefined, this)
|
|
999
|
-
]
|
|
1000
|
-
}, undefined, true, undefined, this)
|
|
1001
|
-
}, undefined, false, undefined, this),
|
|
1002
|
-
/* @__PURE__ */ jsx_dev_runtime27.jsxDEV(AllEventDialog, {
|
|
1003
|
-
ref: allEventsDialogRef
|
|
1004
|
-
}, undefined, false, undefined, this)
|
|
1005
|
-
]
|
|
1006
|
-
}, undefined, true, undefined, this);
|
|
1007
|
-
};
|
|
1008
|
-
|
|
1009
|
-
// src/features/month-view/components/month-header.tsx
|
|
1010
|
-
var import_react8 = require("motion/react");
|
|
1011
|
-
var import_react9 = require("react");
|
|
1012
|
-
var jsx_dev_runtime28 = require("react/jsx-dev-runtime");
|
|
1013
|
-
var MonthHeader = () => {
|
|
1014
|
-
const {
|
|
1015
|
-
firstDayOfWeek,
|
|
1016
|
-
currentLocale,
|
|
1017
|
-
stickyViewHeader,
|
|
1018
|
-
viewHeaderClassName
|
|
1019
|
-
} = useCalendarContext();
|
|
1020
|
-
const weekDays = import_react9.useMemo(() => {
|
|
1021
|
-
const days = dayjs_config_default.weekdays().map((day) => day.toLowerCase());
|
|
1022
|
-
const shortDays = dayjs_config_default.weekdaysShort().map((day) => day.toLowerCase());
|
|
1023
|
-
for (let i = 0;i < firstDayOfWeek; i++) {
|
|
1024
|
-
const dayToMove = days.shift();
|
|
1025
|
-
const shortDayToMove = shortDays.shift();
|
|
1026
|
-
if (dayToMove)
|
|
1027
|
-
days.push(dayToMove);
|
|
1028
|
-
if (shortDayToMove)
|
|
1029
|
-
shortDays.push(shortDayToMove);
|
|
1030
|
-
}
|
|
1031
|
-
return { days, shortDays };
|
|
1032
|
-
}, [firstDayOfWeek, currentLocale]);
|
|
1033
|
-
return /* @__PURE__ */ jsx_dev_runtime28.jsxDEV("div", {
|
|
1034
|
-
className: cn("grid grid-cols-7 border-b", stickyViewHeader && "sticky top-0 z-100", viewHeaderClassName),
|
|
1035
|
-
"data-testid": "month-header",
|
|
1036
|
-
children: weekDays.days.map((weekDay, index) => /* @__PURE__ */ jsx_dev_runtime28.jsxDEV(import_react8.AnimatePresence, {
|
|
1037
|
-
mode: "wait",
|
|
1038
|
-
children: /* @__PURE__ */ jsx_dev_runtime28.jsxDEV(import_react8.motion.div, {
|
|
1039
|
-
initial: { opacity: 0, y: -10 },
|
|
1040
|
-
animate: { opacity: 1, y: 0 },
|
|
1041
|
-
exit: { opacity: 0, y: -10 },
|
|
1042
|
-
transition: {
|
|
1043
|
-
duration: 0.25,
|
|
1044
|
-
ease: "easeInOut",
|
|
1045
|
-
delay: index * 0.05
|
|
1046
|
-
},
|
|
1047
|
-
className: "py-2 text-center font-medium border-r first:border-l",
|
|
1048
|
-
"data-testid": `weekday-header-${weekDay}`,
|
|
1049
|
-
children: [
|
|
1050
|
-
/* @__PURE__ */ jsx_dev_runtime28.jsxDEV("span", {
|
|
1051
|
-
className: "hidden text-sm sm:inline",
|
|
1052
|
-
children: weekDay
|
|
1053
|
-
}, undefined, false, undefined, this),
|
|
1054
|
-
/* @__PURE__ */ jsx_dev_runtime28.jsxDEV("span", {
|
|
1055
|
-
className: "text-xs sm:hidden",
|
|
1056
|
-
children: weekDays.shortDays[index]
|
|
1057
|
-
}, undefined, false, undefined, this)
|
|
1058
|
-
]
|
|
1059
|
-
}, weekDay, true, undefined, this)
|
|
1060
|
-
}, weekDay, false, undefined, this))
|
|
1061
|
-
}, undefined, false, undefined, this);
|
|
1062
|
-
};
|
|
1063
|
-
|
|
1064
|
-
// src/lib/constants.ts
|
|
1065
|
-
var GAP_BETWEEN_ELEMENTS = 1;
|
|
1066
|
-
var DAY_NUMBER_HEIGHT = 28;
|
|
1067
|
-
var EVENT_BAR_HEIGHT = 24;
|
|
1068
|
-
|
|
1069
|
-
// src/features/month-view/components/week-events-layer.tsx
|
|
1070
|
-
var jsx_dev_runtime29 = require("react/jsx-dev-runtime");
|
|
1071
|
-
var WeekEventsLayer = ({ days }) => {
|
|
1072
|
-
const { events, dayMaxEvents } = useCalendarContext();
|
|
1073
|
-
const weekStart = days[0];
|
|
1074
|
-
const weekEnd = days[6];
|
|
1075
|
-
const weekEvents = events.filter((e) => {
|
|
1076
|
-
const startsInWeek = e.start.isSameOrAfter(weekStart.startOf("day")) && e.start.isSameOrBefore(weekEnd.endOf("day"));
|
|
1077
|
-
const endsInWeek = e.end.isSameOrAfter(weekStart.startOf("day")) && e.end.isSameOrBefore(weekEnd.endOf("day"));
|
|
1078
|
-
const spansWeek = e.start.isBefore(weekStart.startOf("day")) && e.end.isAfter(weekEnd.endOf("day"));
|
|
1079
|
-
return startsInWeek || endsInWeek || spansWeek;
|
|
1080
|
-
});
|
|
1081
|
-
const multiDayEvents = weekEvents.filter((e) => e.end.diff(e.start, "day") > 0);
|
|
1082
|
-
const singleDayEvents = weekEvents.filter((e) => e.end.diff(e.start, "day") === 0);
|
|
1083
|
-
const sortedMultiDay = [...multiDayEvents].sort((a, b) => {
|
|
1084
|
-
const startDiff = a.start.diff(b.start);
|
|
1085
|
-
if (startDiff !== 0)
|
|
1086
|
-
return startDiff;
|
|
1087
|
-
return b.end.diff(b.start) - a.end.diff(a.start);
|
|
1088
|
-
});
|
|
1089
|
-
const sortedSingleDay = [...singleDayEvents].sort((a, b) => a.start.diff(b.start));
|
|
1090
|
-
const grid = [];
|
|
1091
|
-
for (let row = 0;row < dayMaxEvents; row++) {
|
|
1092
|
-
grid[row] = [];
|
|
1093
|
-
for (let col = 0;col < 7; col++) {
|
|
1094
|
-
grid[row][col] = { taken: false, event: null };
|
|
1095
|
-
}
|
|
1096
|
-
}
|
|
1097
|
-
const eventPositions = [];
|
|
1098
|
-
for (const event of sortedMultiDay) {
|
|
1099
|
-
const eventStart = dayjs_config_default.max(event.start.startOf("day"), weekStart);
|
|
1100
|
-
const eventEnd = dayjs_config_default.min(event.end.startOf("day"), weekEnd);
|
|
1101
|
-
const startCol = Math.max(0, eventStart.diff(weekStart, "day"));
|
|
1102
|
-
const endCol = Math.min(6, eventEnd.diff(weekStart, "day"));
|
|
1103
|
-
let placedSuccessfully = false;
|
|
1104
|
-
let assignedRow = -1;
|
|
1105
|
-
for (let row = 0;row < dayMaxEvents; row++) {
|
|
1106
|
-
let canPlace = true;
|
|
1107
|
-
for (let col = startCol;col <= endCol; col++) {
|
|
1108
|
-
if (grid[row][col].taken) {
|
|
1109
|
-
canPlace = false;
|
|
1110
|
-
break;
|
|
1111
|
-
}
|
|
1112
|
-
}
|
|
1113
|
-
if (canPlace) {
|
|
1114
|
-
assignedRow = row;
|
|
1115
|
-
break;
|
|
1116
|
-
}
|
|
1117
|
-
}
|
|
1118
|
-
if (assignedRow !== -1) {
|
|
1119
|
-
for (let col = startCol;col <= endCol; col++) {
|
|
1120
|
-
grid[assignedRow][col] = { taken: true, event };
|
|
1121
|
-
}
|
|
1122
|
-
const spanDays = endCol - startCol + 1;
|
|
1123
|
-
eventPositions.push({
|
|
1124
|
-
left: startCol / 7 * 100,
|
|
1125
|
-
width: spanDays / 7 * 100,
|
|
1126
|
-
top: DAY_NUMBER_HEIGHT + GAP_BETWEEN_ELEMENTS + assignedRow * (EVENT_BAR_HEIGHT + GAP_BETWEEN_ELEMENTS),
|
|
1127
|
-
height: EVENT_BAR_HEIGHT,
|
|
1128
|
-
position: assignedRow,
|
|
1129
|
-
...event
|
|
1130
|
-
});
|
|
1131
|
-
placedSuccessfully = true;
|
|
1132
|
-
}
|
|
1133
|
-
if (!placedSuccessfully) {
|
|
1134
|
-
for (let tryStartCol = startCol + 1;tryStartCol <= endCol; tryStartCol++) {
|
|
1135
|
-
let truncatedAssignedRow = -1;
|
|
1136
|
-
for (let row = 0;row < dayMaxEvents; row++) {
|
|
1137
|
-
let canPlace = true;
|
|
1138
|
-
for (let col = tryStartCol;col <= endCol; col++) {
|
|
1139
|
-
if (grid[row][col].taken) {
|
|
1140
|
-
canPlace = false;
|
|
1141
|
-
break;
|
|
1142
|
-
}
|
|
1143
|
-
}
|
|
1144
|
-
if (canPlace) {
|
|
1145
|
-
truncatedAssignedRow = row;
|
|
1146
|
-
break;
|
|
1147
|
-
}
|
|
1148
|
-
}
|
|
1149
|
-
if (truncatedAssignedRow !== -1) {
|
|
1150
|
-
for (let col = tryStartCol;col <= endCol; col++) {
|
|
1151
|
-
grid[truncatedAssignedRow][col] = { taken: true, event };
|
|
1152
|
-
}
|
|
1153
|
-
const truncatedSpanDays = endCol - tryStartCol + 1;
|
|
1154
|
-
eventPositions.push({
|
|
1155
|
-
left: tryStartCol / 7 * 100,
|
|
1156
|
-
width: truncatedSpanDays / 7 * 100,
|
|
1157
|
-
top: DAY_NUMBER_HEIGHT + GAP_BETWEEN_ELEMENTS + truncatedAssignedRow * (EVENT_BAR_HEIGHT + GAP_BETWEEN_ELEMENTS),
|
|
1158
|
-
height: EVENT_BAR_HEIGHT,
|
|
1159
|
-
position: truncatedAssignedRow,
|
|
1160
|
-
...event
|
|
1161
|
-
});
|
|
1162
|
-
placedSuccessfully = true;
|
|
1163
|
-
break;
|
|
1164
|
-
}
|
|
1165
|
-
}
|
|
1166
|
-
}
|
|
1167
|
-
}
|
|
1168
|
-
for (const event of sortedSingleDay) {
|
|
1169
|
-
const eventStart = dayjs_config_default.max(event.start.startOf("day"), weekStart);
|
|
1170
|
-
const col = Math.max(0, eventStart.diff(weekStart, "day"));
|
|
1171
|
-
let assignedRow = -1;
|
|
1172
|
-
for (let row = 0;row < dayMaxEvents; row++) {
|
|
1173
|
-
if (!grid[row][col].taken) {
|
|
1174
|
-
assignedRow = row;
|
|
1175
|
-
break;
|
|
1176
|
-
}
|
|
1177
|
-
}
|
|
1178
|
-
if (assignedRow !== -1) {
|
|
1179
|
-
grid[assignedRow][col] = { taken: true, event };
|
|
1180
|
-
eventPositions.push({
|
|
1181
|
-
left: col / 7 * 100,
|
|
1182
|
-
width: 1 / 7 * 100,
|
|
1183
|
-
top: DAY_NUMBER_HEIGHT + GAP_BETWEEN_ELEMENTS + assignedRow * (EVENT_BAR_HEIGHT + GAP_BETWEEN_ELEMENTS),
|
|
1184
|
-
height: EVENT_BAR_HEIGHT,
|
|
1185
|
-
position: assignedRow,
|
|
1186
|
-
...event
|
|
1187
|
-
});
|
|
1188
|
-
}
|
|
1189
|
-
}
|
|
1190
|
-
return /* @__PURE__ */ jsx_dev_runtime29.jsxDEV("div", {
|
|
1191
|
-
className: "relative w-full h-full pointer-events-none z-20 overflow-clip",
|
|
1192
|
-
children: eventPositions.map((event) => {
|
|
1193
|
-
return /* @__PURE__ */ jsx_dev_runtime29.jsxDEV("div", {
|
|
1194
|
-
className: "absolute z-10 pointer-events-auto overflow-clip",
|
|
1195
|
-
style: {
|
|
1196
|
-
left: `calc(${event.left}% + var(--spacing) * 0.25)`,
|
|
1197
|
-
width: `calc(${event.width}% - var(--spacing) * 1)`,
|
|
1198
|
-
top: `${event.top}px`,
|
|
1199
|
-
height: `${EVENT_BAR_HEIGHT}px`
|
|
1200
|
-
},
|
|
1201
|
-
children: /* @__PURE__ */ jsx_dev_runtime29.jsxDEV(DraggableEvent, {
|
|
1202
|
-
elementId: `event-${event.id}-${event.position}-${weekStart.format("YYYY-MM-DD")}`,
|
|
1203
|
-
event,
|
|
1204
|
-
className: "h-full w-full shadow"
|
|
1205
|
-
}, undefined, false, undefined, this)
|
|
1206
|
-
}, `event-${event.id}-${event.position}-${weekStart.format("YYYY-MM-DD")}`, false, undefined, this);
|
|
1207
|
-
})
|
|
1208
|
-
}, undefined, false, undefined, this);
|
|
1209
|
-
};
|
|
1210
|
-
|
|
1211
|
-
// src/features/month-view/components/month-view.tsx
|
|
1212
|
-
var jsx_dev_runtime30 = require("react/jsx-dev-runtime");
|
|
1213
|
-
var MonthView = ({ dayMaxEvents = 3 }) => {
|
|
1214
|
-
const allEventsDialogRef = import_react11.default.useRef(null);
|
|
1215
|
-
const { currentDate, firstDayOfWeek } = useCalendarContext();
|
|
1216
|
-
const firstDayOfMonth = currentDate.startOf("month");
|
|
1217
|
-
let adjustedFirstDayOfCalendar = firstDayOfMonth.clone();
|
|
1218
|
-
while (adjustedFirstDayOfCalendar.day() !== firstDayOfWeek) {
|
|
1219
|
-
adjustedFirstDayOfCalendar = adjustedFirstDayOfCalendar.subtract(1, "day");
|
|
1220
|
-
}
|
|
1221
|
-
const calendarDays = import_react11.useMemo(() => {
|
|
1222
|
-
const days = [[]];
|
|
1223
|
-
let day = adjustedFirstDayOfCalendar.clone();
|
|
1224
|
-
for (let i = 0;i < 42; i++) {
|
|
1225
|
-
if (days[days.length - 1].length === 7) {
|
|
1226
|
-
days.push([]);
|
|
1227
|
-
}
|
|
1228
|
-
days[days.length - 1].push(day);
|
|
1229
|
-
day = day.add(1, "day");
|
|
1230
|
-
}
|
|
1231
|
-
return days;
|
|
1232
|
-
}, [adjustedFirstDayOfCalendar]);
|
|
1233
|
-
return /* @__PURE__ */ jsx_dev_runtime30.jsxDEV("div", {
|
|
1234
|
-
className: "flex h-full flex-col",
|
|
1235
|
-
"data-testid": "month-view",
|
|
1236
|
-
children: [
|
|
1237
|
-
/* @__PURE__ */ jsx_dev_runtime30.jsxDEV(MonthHeader, {}, undefined, false, undefined, this),
|
|
1238
|
-
/* @__PURE__ */ jsx_dev_runtime30.jsxDEV("div", {
|
|
1239
|
-
className: "flex-1 overflow-auto h-full",
|
|
1240
|
-
"data-testid": "month-scroll-area",
|
|
1241
|
-
children: /* @__PURE__ */ jsx_dev_runtime30.jsxDEV(import_react10.AnimatePresence, {
|
|
1242
|
-
mode: "wait",
|
|
1243
|
-
children: /* @__PURE__ */ jsx_dev_runtime30.jsxDEV(import_react10.motion.div, {
|
|
1244
|
-
initial: { opacity: 0 },
|
|
1245
|
-
animate: { opacity: 1 },
|
|
1246
|
-
exit: { opacity: 0 },
|
|
1247
|
-
transition: { duration: 0.25, ease: "easeInOut" },
|
|
1248
|
-
className: "relative grid h-full grid-cols-7 grid-rows-6 overflow-auto",
|
|
1249
|
-
"data-testid": "month-calendar-grid",
|
|
1250
|
-
children: calendarDays.map((days, index) => {
|
|
1251
|
-
return /* @__PURE__ */ jsx_dev_runtime30.jsxDEV("div", {
|
|
1252
|
-
className: "relative col-span-7 grid grid-cols-7",
|
|
1253
|
-
"data-testid": `week-row-${index}`,
|
|
1254
|
-
children: [
|
|
1255
|
-
days.map((day, dayIndex) => {
|
|
1256
|
-
return /* @__PURE__ */ jsx_dev_runtime30.jsxDEV(DayCell, {
|
|
1257
|
-
index: dayIndex,
|
|
1258
|
-
day,
|
|
1259
|
-
dayMaxEvents,
|
|
1260
|
-
className: "border-r border-b first:border-l"
|
|
1261
|
-
}, day.format("YYYY-MM-DD"), false, undefined, this);
|
|
1262
|
-
}),
|
|
1263
|
-
/* @__PURE__ */ jsx_dev_runtime30.jsxDEV("div", {
|
|
1264
|
-
className: "absolute inset-0 z-10 pointer-events-none",
|
|
1265
|
-
children: /* @__PURE__ */ jsx_dev_runtime30.jsxDEV(WeekEventsLayer, {
|
|
1266
|
-
days
|
|
1267
|
-
}, undefined, false, undefined, this)
|
|
1268
|
-
}, undefined, false, undefined, this)
|
|
1269
|
-
]
|
|
1270
|
-
}, `week-${index}`, true, undefined, this);
|
|
1271
|
-
})
|
|
1272
|
-
}, currentDate.format("YYYY-MM-DD"), false, undefined, this)
|
|
1273
|
-
}, undefined, false, undefined, this)
|
|
1274
|
-
}, undefined, false, undefined, this),
|
|
1275
|
-
/* @__PURE__ */ jsx_dev_runtime30.jsxDEV(AllEventDialog, {
|
|
1276
|
-
ref: allEventsDialogRef
|
|
1277
|
-
}, undefined, false, undefined, this)
|
|
1278
|
-
]
|
|
1279
|
-
}, undefined, true, undefined, this);
|
|
1280
|
-
};
|
|
1281
|
-
|
|
1282
|
-
// src/features/week-view/week-view.tsx
|
|
1283
|
-
var import_weekOfYear2 = __toESM(require("dayjs/plugin/weekOfYear"));
|
|
1284
|
-
|
|
1285
|
-
// src/features/week-view/week-all-day-row.tsx
|
|
1286
|
-
var import_react12 = require("react");
|
|
1287
|
-
var jsx_dev_runtime31 = require("react/jsx-dev-runtime");
|
|
1288
|
-
var WeekAllDayRow = () => {
|
|
1289
|
-
const { currentDate, getEventsForDateRange, firstDayOfWeek } = useCalendarContext();
|
|
1290
|
-
const startOfWeek = currentDate.startOf("week").day(firstDayOfWeek);
|
|
1291
|
-
const adjustedStartOfWeek = currentDate.isBefore(startOfWeek) ? startOfWeek.subtract(1, "week") : startOfWeek;
|
|
1292
|
-
const endOfWeek = adjustedStartOfWeek.add(6, "day");
|
|
1293
|
-
const weekDays = [];
|
|
1294
|
-
for (let i = 0;i < 7; i++) {
|
|
1295
|
-
weekDays.push(adjustedStartOfWeek.add(i, "day"));
|
|
1296
|
-
}
|
|
1297
|
-
const expandedStartDate = adjustedStartOfWeek.subtract(6, "day");
|
|
1298
|
-
const expandedEndDate = endOfWeek.add(6, "day");
|
|
1299
|
-
const allEvents = getEventsForDateRange(expandedStartDate, expandedEndDate);
|
|
1300
|
-
const weekEvents = allEvents.filter((event) => {
|
|
1301
|
-
return event.start.isSameOrAfter(adjustedStartOfWeek) && event.start.isSameOrBefore(endOfWeek) || event.end.isSameOrAfter(adjustedStartOfWeek) && event.end.isSameOrBefore(endOfWeek) || event.start.isBefore(adjustedStartOfWeek) && event.end.isAfter(endOfWeek);
|
|
1302
|
-
});
|
|
1303
|
-
const allDayEvents = weekEvents.filter((event) => event.allDay);
|
|
1304
|
-
const { processedAllDayEvents } = import_react12.useMemo(() => {
|
|
1305
|
-
const sortedEvents = [...allDayEvents].sort((a, b) => {
|
|
1306
|
-
const startDiff = a.start.diff(b.start);
|
|
1307
|
-
if (startDiff !== 0)
|
|
1308
|
-
return startDiff;
|
|
1309
|
-
const aDuration = a.end.diff(a.start);
|
|
1310
|
-
const bDuration = b.end.diff(b.start);
|
|
1311
|
-
return bDuration - aDuration;
|
|
1312
|
-
});
|
|
1313
|
-
const rows = [];
|
|
1314
|
-
const processedEvents = [];
|
|
1315
|
-
sortedEvents.forEach((event) => {
|
|
1316
|
-
const eventStart = event.start.isBefore(adjustedStartOfWeek) ? adjustedStartOfWeek : event.start;
|
|
1317
|
-
const eventEnd = event.end.isAfter(endOfWeek) ? endOfWeek : event.end;
|
|
1318
|
-
const startDayIndex = Math.max(0, eventStart.diff(adjustedStartOfWeek, "day"));
|
|
1319
|
-
const endDayIndex = Math.min(6, eventEnd.diff(adjustedStartOfWeek, "day"));
|
|
1320
|
-
const left = startDayIndex / 7 * 100;
|
|
1321
|
-
const width = (endDayIndex - startDayIndex + 1) / 7 * 100;
|
|
1322
|
-
let rowIndex = 0;
|
|
1323
|
-
let placed = false;
|
|
1324
|
-
while (!placed) {
|
|
1325
|
-
if (rowIndex >= rows.length) {
|
|
1326
|
-
rows.push([]);
|
|
1327
|
-
placed = true;
|
|
1328
|
-
} else {
|
|
1329
|
-
const row = rows[rowIndex];
|
|
1330
|
-
const canFit = row.every((item) => {
|
|
1331
|
-
return eventStart.isAfter(item.end) || eventEnd.isBefore(item.event.start);
|
|
1332
|
-
});
|
|
1333
|
-
if (canFit) {
|
|
1334
|
-
placed = true;
|
|
1335
|
-
} else {
|
|
1336
|
-
rowIndex++;
|
|
1337
|
-
}
|
|
1338
|
-
}
|
|
1339
|
-
}
|
|
1340
|
-
rows[rowIndex].push({ end: eventEnd, event });
|
|
1341
|
-
processedEvents.push({
|
|
1342
|
-
...event,
|
|
1343
|
-
left,
|
|
1344
|
-
width,
|
|
1345
|
-
top: rowIndex * (EVENT_BAR_HEIGHT + GAP_BETWEEN_ELEMENTS),
|
|
1346
|
-
height: EVENT_BAR_HEIGHT,
|
|
1347
|
-
allDay: true
|
|
1348
|
-
});
|
|
1349
|
-
});
|
|
1350
|
-
return {
|
|
1351
|
-
processedAllDayEvents: processedEvents,
|
|
1352
|
-
allDayRowsCount: Math.max(1, rows.length)
|
|
1353
|
-
};
|
|
1354
|
-
}, [allDayEvents, adjustedStartOfWeek, endOfWeek]);
|
|
1355
|
-
return /* @__PURE__ */ jsx_dev_runtime31.jsxDEV("div", {
|
|
1356
|
-
className: "grid grid-cols-[auto_1fr_1fr_1fr_1fr_1fr_1fr_1fr] grid-rows-1 relative",
|
|
1357
|
-
"data-testid": "week-all-day-row",
|
|
1358
|
-
children: [
|
|
1359
|
-
/* @__PURE__ */ jsx_dev_runtime31.jsxDEV("div", {
|
|
1360
|
-
className: "w-14 flex shrink-0 items-center justify-end border-x border-b pr-2 min-h-16",
|
|
1361
|
-
children: /* @__PURE__ */ jsx_dev_runtime31.jsxDEV("span", {
|
|
1362
|
-
className: "text-muted-foreground text-[10px] whitespace-nowrap sm:text-xs",
|
|
1363
|
-
children: "All-day"
|
|
1364
|
-
}, undefined, false, undefined, this)
|
|
1365
|
-
}, undefined, false, undefined, this),
|
|
1366
|
-
weekDays.map((day) => /* @__PURE__ */ jsx_dev_runtime31.jsxDEV(DroppableCell, {
|
|
1367
|
-
id: `all-day-cell-${day.format("YYYY-MM-DD")}`,
|
|
1368
|
-
type: "day-cell",
|
|
1369
|
-
date: day,
|
|
1370
|
-
className: "hover:bg-accent h-full flex-1 cursor-pointer border-r border-b"
|
|
1371
|
-
}, `all-day-${day.format("YYYY-MM-DD")}`, false, undefined, this)),
|
|
1372
|
-
/* @__PURE__ */ jsx_dev_runtime31.jsxDEV("div", {
|
|
1373
|
-
className: "absolute inset-0 z-10 p-1 col-span-7 col-start-2",
|
|
1374
|
-
children: processedAllDayEvents.map((event, index) => /* @__PURE__ */ jsx_dev_runtime31.jsxDEV("div", {
|
|
1375
|
-
className: "absolute",
|
|
1376
|
-
style: {
|
|
1377
|
-
left: `${event.left}%`,
|
|
1378
|
-
width: `calc(${event.width}% - var(--spacing) * 2)`,
|
|
1379
|
-
top: `${event.top}px`,
|
|
1380
|
-
height: `${event.height}px`
|
|
1381
|
-
},
|
|
1382
|
-
children: /* @__PURE__ */ jsx_dev_runtime31.jsxDEV(DraggableEvent, {
|
|
1383
|
-
elementId: `all-day-${event.id}-${index}`,
|
|
1384
|
-
event,
|
|
1385
|
-
className: "h-full w-full overflow-clip text-xs absolute"
|
|
1386
|
-
}, `all-day-${event.id}-${index}`, false, undefined, this)
|
|
1387
|
-
}, `all-day-container-${event.id}`, false, undefined, this))
|
|
1388
|
-
}, undefined, false, undefined, this)
|
|
1389
|
-
]
|
|
1390
|
-
}, undefined, true, undefined, this);
|
|
1391
|
-
};
|
|
1392
|
-
|
|
1393
|
-
// src/features/week-view/week-header.tsx
|
|
1394
|
-
var import_react13 = require("motion/react");
|
|
1395
|
-
var jsx_dev_runtime32 = require("react/jsx-dev-runtime");
|
|
1396
|
-
var WeekHeader = () => {
|
|
1397
|
-
const {
|
|
1398
|
-
currentDate,
|
|
1399
|
-
selectDate,
|
|
1400
|
-
openEventForm,
|
|
1401
|
-
firstDayOfWeek,
|
|
1402
|
-
stickyViewHeader,
|
|
1403
|
-
viewHeaderClassName
|
|
1404
|
-
} = useCalendarContext();
|
|
1405
|
-
const startOfWeek = currentDate.startOf("week").day(firstDayOfWeek);
|
|
1406
|
-
const adjustedStartOfWeek = currentDate.isBefore(startOfWeek) ? startOfWeek.subtract(1, "week") : startOfWeek;
|
|
1407
|
-
const weekDays = [];
|
|
1408
|
-
for (let i = 0;i < 7; i++) {
|
|
1409
|
-
weekDays.push(adjustedStartOfWeek.add(i, "day"));
|
|
1410
|
-
}
|
|
1411
|
-
return /* @__PURE__ */ jsx_dev_runtime32.jsxDEV("div", {
|
|
1412
|
-
className: cn("grid grid-cols-[auto_1fr_1fr_1fr_1fr_1fr_1fr_1fr] grid-rows-1", stickyViewHeader && "sticky top-0 z-100", viewHeaderClassName),
|
|
1413
|
-
"data-testid": "week-header",
|
|
1414
|
-
children: [
|
|
1415
|
-
/* @__PURE__ */ jsx_dev_runtime32.jsxDEV("div", {
|
|
1416
|
-
className: "col-span-1 w-14 shrink-0 items-center justify-center border-x border-b p-2",
|
|
1417
|
-
children: /* @__PURE__ */ jsx_dev_runtime32.jsxDEV("div", {
|
|
1418
|
-
className: "flex flex-col items-center justify-center",
|
|
1419
|
-
children: [
|
|
1420
|
-
/* @__PURE__ */ jsx_dev_runtime32.jsxDEV("span", {
|
|
1421
|
-
className: "text-muted-foreground text-xs",
|
|
1422
|
-
children: "Week"
|
|
1423
|
-
}, undefined, false, undefined, this),
|
|
1424
|
-
/* @__PURE__ */ jsx_dev_runtime32.jsxDEV("span", {
|
|
1425
|
-
className: "font-medium",
|
|
1426
|
-
children: currentDate.week()
|
|
1427
|
-
}, undefined, false, undefined, this)
|
|
1428
|
-
]
|
|
1429
|
-
}, undefined, true, undefined, this)
|
|
1430
|
-
}, undefined, false, undefined, this),
|
|
1431
|
-
weekDays.map((day, index) => {
|
|
1432
|
-
const isToday = day.isSame(dayjs_config_default(), "day");
|
|
1433
|
-
return /* @__PURE__ */ jsx_dev_runtime32.jsxDEV(import_react13.AnimatePresence, {
|
|
1434
|
-
mode: "wait",
|
|
1435
|
-
children: /* @__PURE__ */ jsx_dev_runtime32.jsxDEV(import_react13.motion.div, {
|
|
1436
|
-
initial: { opacity: 0, y: -10 },
|
|
1437
|
-
animate: { opacity: 1, y: 0 },
|
|
1438
|
-
exit: { opacity: 0, y: -10 },
|
|
1439
|
-
transition: {
|
|
1440
|
-
duration: 0.25,
|
|
1441
|
-
ease: "easeInOut",
|
|
1442
|
-
delay: index * 0.05
|
|
1443
|
-
},
|
|
1444
|
-
className: cn("hover:bg-accent flex-1 cursor-pointer p-1 text-center sm:p-2 border-r border-b", isToday && "bg-primary/10 font-bold"),
|
|
1445
|
-
onClick: () => {
|
|
1446
|
-
selectDate(day);
|
|
1447
|
-
openEventForm(day);
|
|
1448
|
-
},
|
|
1449
|
-
"data-testid": `week-day-header-${day.format("dddd").toLowerCase()}`,
|
|
1450
|
-
children: [
|
|
1451
|
-
/* @__PURE__ */ jsx_dev_runtime32.jsxDEV("div", {
|
|
1452
|
-
className: "text-xs sm:text-sm",
|
|
1453
|
-
children: day.format("ddd")
|
|
1454
|
-
}, undefined, false, undefined, this),
|
|
1455
|
-
/* @__PURE__ */ jsx_dev_runtime32.jsxDEV("div", {
|
|
1456
|
-
className: cn("mx-auto mt-1 flex h-5 w-5 items-center justify-center rounded-full text-xs sm:h-7 sm:w-7 sm:text-sm", isToday && "bg-primary text-primary-foreground"),
|
|
1457
|
-
children: day.date()
|
|
1458
|
-
}, undefined, false, undefined, this)
|
|
1459
|
-
]
|
|
1460
|
-
}, day.format("YYYY-MM-DD"), true, undefined, this)
|
|
1461
|
-
}, day.format("YYYY-MM-DD"), false, undefined, this);
|
|
1462
|
-
})
|
|
1463
|
-
]
|
|
1464
|
-
}, undefined, true, undefined, this);
|
|
1465
|
-
};
|
|
1466
|
-
|
|
1467
|
-
// src/hooks/useProcessedDayEvents.ts
|
|
1468
|
-
var import_react14 = require("react");
|
|
1469
|
-
var useProcessedDayEvents = ({ day }) => {
|
|
1470
|
-
const { getEventsForDateRange } = useCalendarContext();
|
|
1471
|
-
const todayEvents = import_react14.useMemo(() => {
|
|
1472
|
-
let eventsForDay = getEventsForDateRange(day.startOf("day"), day.endOf("day"));
|
|
1473
|
-
eventsForDay = eventsForDay.filter((e) => !e.allDay).toSorted((a, b) => a.start.diff(b.start));
|
|
1474
|
-
if (eventsForDay.length === 0) {
|
|
1475
|
-
return [];
|
|
1476
|
-
}
|
|
1477
|
-
const clusters = [];
|
|
1478
|
-
let currentCluster = [];
|
|
1479
|
-
let lastEventEnd = null;
|
|
1480
|
-
for (const event of eventsForDay) {
|
|
1481
|
-
if (lastEventEnd && event.start.isSameOrAfter(lastEventEnd)) {
|
|
1482
|
-
if (currentCluster.length > 0) {
|
|
1483
|
-
clusters.push(currentCluster);
|
|
1484
|
-
}
|
|
1485
|
-
currentCluster = [];
|
|
1486
|
-
}
|
|
1487
|
-
currentCluster.push(event);
|
|
1488
|
-
lastEventEnd = lastEventEnd ? dayjs_config_default.max(lastEventEnd, event.end) : event.end;
|
|
1489
|
-
}
|
|
1490
|
-
if (currentCluster.length > 0) {
|
|
1491
|
-
clusters.push(currentCluster);
|
|
1492
|
-
}
|
|
1493
|
-
const processedEvents = [];
|
|
1494
|
-
for (const cluster of clusters) {
|
|
1495
|
-
if (cluster.length === 1) {
|
|
1496
|
-
const event = cluster[0];
|
|
1497
|
-
const startTime = event.start.hour() + event.start.minute() / 60;
|
|
1498
|
-
let endTime = event.end.hour() + event.end.minute() / 60;
|
|
1499
|
-
if (endTime < startTime) {
|
|
1500
|
-
endTime = 24;
|
|
1501
|
-
}
|
|
1502
|
-
const totalDuration = endTime - startTime;
|
|
1503
|
-
const top = startTime / 24 * 100;
|
|
1504
|
-
const height = totalDuration / 24 * 100;
|
|
1505
|
-
processedEvents.push({ ...event, left: 0, width: 100, top, height });
|
|
1506
|
-
continue;
|
|
1507
|
-
}
|
|
1508
|
-
const sortedEvents = [...cluster].sort((a, b) => {
|
|
1509
|
-
const aDuration = a.end.diff(a.start, "minute");
|
|
1510
|
-
const bDuration = b.end.diff(b.start, "minute");
|
|
1511
|
-
if (aDuration !== bDuration) {
|
|
1512
|
-
return bDuration - aDuration;
|
|
1513
|
-
}
|
|
1514
|
-
return a.start.diff(b.start);
|
|
1515
|
-
});
|
|
1516
|
-
const totalEvents = sortedEvents.length;
|
|
1517
|
-
let maxOffset;
|
|
1518
|
-
if (totalEvents === 2) {
|
|
1519
|
-
maxOffset = 25;
|
|
1520
|
-
} else if (totalEvents === 3) {
|
|
1521
|
-
maxOffset = 50;
|
|
1522
|
-
} else if (totalEvents === 4) {
|
|
1523
|
-
maxOffset = 60;
|
|
1524
|
-
} else {
|
|
1525
|
-
maxOffset = 70;
|
|
1526
|
-
}
|
|
1527
|
-
const offsetPerEvent = totalEvents > 1 ? maxOffset / (totalEvents - 1) : 0;
|
|
1528
|
-
for (let i = 0;i < sortedEvents.length; i++) {
|
|
1529
|
-
const event = sortedEvents[i];
|
|
1530
|
-
const startTime = event.start.hour() + event.start.minute() / 60;
|
|
1531
|
-
let endTime = event.end.hour() + event.end.minute() / 60;
|
|
1532
|
-
if (endTime < startTime) {
|
|
1533
|
-
endTime = 24;
|
|
1534
|
-
}
|
|
1535
|
-
const totalDuration = endTime - startTime;
|
|
1536
|
-
const top = startTime / 24 * 100;
|
|
1537
|
-
const height = totalDuration / 24 * 100;
|
|
1538
|
-
let left;
|
|
1539
|
-
let width;
|
|
1540
|
-
let zIndex;
|
|
1541
|
-
if (i === 0) {
|
|
1542
|
-
left = 0;
|
|
1543
|
-
width = 100;
|
|
1544
|
-
zIndex = 1;
|
|
1545
|
-
} else {
|
|
1546
|
-
left = offsetPerEvent * i;
|
|
1547
|
-
width = 100 - left;
|
|
1548
|
-
zIndex = i + 1;
|
|
1549
|
-
}
|
|
1550
|
-
processedEvents.push({
|
|
1551
|
-
...event,
|
|
1552
|
-
left,
|
|
1553
|
-
width,
|
|
1554
|
-
top,
|
|
1555
|
-
height,
|
|
1556
|
-
zIndex
|
|
1557
|
-
});
|
|
1558
|
-
}
|
|
1559
|
-
}
|
|
1560
|
-
return processedEvents;
|
|
1561
|
-
}, [day, getEventsForDateRange]);
|
|
1562
|
-
return todayEvents;
|
|
1563
|
-
};
|
|
1564
|
-
|
|
1565
|
-
// src/features/day-view/day-events-layer.tsx
|
|
1566
|
-
var jsx_dev_runtime33 = require("react/jsx-dev-runtime");
|
|
1567
|
-
var DayEventsLayer = ({
|
|
1568
|
-
day,
|
|
1569
|
-
"data-testid": dataTestId
|
|
1570
|
-
}) => {
|
|
1571
|
-
const todayEvents = useProcessedDayEvents({ day });
|
|
1572
|
-
return /* @__PURE__ */ jsx_dev_runtime33.jsxDEV("div", {
|
|
1573
|
-
"data-testid": dataTestId,
|
|
1574
|
-
className: "pointer-events-none absolute inset-0 z-30",
|
|
1575
|
-
children: todayEvents.map((event, index) => {
|
|
1576
|
-
const veryVeryUniqueKey = `event-${event.id}-${index}-${day.format("YYYY-MM-DD")}`;
|
|
1577
|
-
const isShortEvent = event.end.diff(event.start, "minute") <= 15;
|
|
1578
|
-
return /* @__PURE__ */ jsx_dev_runtime33.jsxDEV("div", {
|
|
1579
|
-
className: "absolute",
|
|
1580
|
-
style: {
|
|
1581
|
-
left: `${event.left}%`,
|
|
1582
|
-
width: `calc(${event.width}% - var(--spacing) * 2)`,
|
|
1583
|
-
top: `${event.top}%`,
|
|
1584
|
-
height: `${event.height}%`
|
|
1585
|
-
},
|
|
1586
|
-
children: /* @__PURE__ */ jsx_dev_runtime33.jsxDEV(DraggableEvent, {
|
|
1587
|
-
elementId: `draggable-${veryVeryUniqueKey}`,
|
|
1588
|
-
event,
|
|
1589
|
-
className: cn("pointer-events-auto absolute", {
|
|
1590
|
-
"[&_p]:text-[10px] [&_p]:mt-0": isShortEvent
|
|
1591
|
-
})
|
|
1592
|
-
}, undefined, false, undefined, this)
|
|
1593
|
-
}, `container-${veryVeryUniqueKey}`, false, undefined, this);
|
|
1594
|
-
})
|
|
1595
|
-
}, undefined, false, undefined, this);
|
|
1596
|
-
};
|
|
1597
|
-
|
|
1598
|
-
// src/features/week-view/week-day-col.tsx
|
|
1599
|
-
var jsx_dev_runtime34 = require("react/jsx-dev-runtime");
|
|
1600
|
-
var hours = Array.from({ length: 24 }, (_, i) => i).map((hour) => dayjs_config_default().hour(hour).minute(0));
|
|
1601
|
-
var WeekDayCol = ({ day }) => {
|
|
1602
|
-
return /* @__PURE__ */ jsx_dev_runtime34.jsxDEV("div", {
|
|
1603
|
-
"data-testid": `week-day-col-${day.format("YYYY-MM-DD")}`,
|
|
1604
|
-
className: "col-span-1 relative grid grid-rows-24 border-r",
|
|
1605
|
-
children: [
|
|
1606
|
-
hours.map((time) => {
|
|
1607
|
-
const hour = time.hour();
|
|
1608
|
-
const cellDate = day.format("YYYY-MM-DD");
|
|
1609
|
-
return /* @__PURE__ */ jsx_dev_runtime34.jsxDEV(DroppableCell, {
|
|
1610
|
-
id: `time-cell-${cellDate}-${time.format("HH")}`,
|
|
1611
|
-
type: "time-cell",
|
|
1612
|
-
date: day,
|
|
1613
|
-
hour,
|
|
1614
|
-
"data-testid": `week-time-cell-${cellDate}-${time.format("HH")}`,
|
|
1615
|
-
className: cn("hover:bg-accent relative z-20 h-[60px] cursor-pointer border-b")
|
|
1616
|
-
}, `${cellDate}-${time.format("HH")}`, false, undefined, this);
|
|
1617
|
-
}),
|
|
1618
|
-
/* @__PURE__ */ jsx_dev_runtime34.jsxDEV(DayEventsLayer, {
|
|
1619
|
-
"data-testid": `week-day-events-${day.format("YYYY-MM-DD")}`,
|
|
1620
|
-
day
|
|
1621
|
-
}, undefined, false, undefined, this)
|
|
1622
|
-
]
|
|
1623
|
-
}, undefined, true, undefined, this);
|
|
1624
|
-
};
|
|
1625
|
-
|
|
1626
|
-
// src/features/week-view/week-time-grid.tsx
|
|
1627
|
-
var jsx_dev_runtime35 = require("react/jsx-dev-runtime");
|
|
1628
|
-
var hours2 = Array.from({ length: 24 }, (_, i) => i).map((hour) => dayjs_config_default().hour(hour).minute(0));
|
|
1629
|
-
var WeekTimeGrid = () => {
|
|
1630
|
-
const { currentDate, firstDayOfWeek } = useCalendarContext();
|
|
1631
|
-
const startOfWeek = currentDate.startOf("week").day(firstDayOfWeek);
|
|
1632
|
-
const adjustedStartOfWeek = currentDate.isBefore(startOfWeek) ? startOfWeek.subtract(1, "week") : startOfWeek;
|
|
1633
|
-
const weekDays = [];
|
|
1634
|
-
for (let i = 0;i < 7; i++) {
|
|
1635
|
-
weekDays.push(adjustedStartOfWeek.add(i, "day"));
|
|
1636
|
-
}
|
|
1637
|
-
const todayIndex = weekDays.findIndex((day) => day.isSame(dayjs_config_default(), "day"));
|
|
1638
|
-
const isCurrentWeek = todayIndex !== -1;
|
|
1639
|
-
return /* @__PURE__ */ jsx_dev_runtime35.jsxDEV("div", {
|
|
1640
|
-
"data-testid": "week-time-grid",
|
|
1641
|
-
className: "relative h-full grid grid-cols-[auto_repeat(7,1fr)] grid-rows-[repeat(24,minmax(60px, 1fr))]",
|
|
1642
|
-
children: [
|
|
1643
|
-
/* @__PURE__ */ jsx_dev_runtime35.jsxDEV("div", {
|
|
1644
|
-
"data-testid": "week-time-labels",
|
|
1645
|
-
className: "z-10 col-span-1 w-14 grid grid-rows-24 border-x",
|
|
1646
|
-
children: hours2.map((time) => /* @__PURE__ */ jsx_dev_runtime35.jsxDEV("div", {
|
|
1647
|
-
"data-testid": `week-time-hour-${time.format("HH")}`,
|
|
1648
|
-
className: "h-[60px] border-b text-right",
|
|
1649
|
-
children: /* @__PURE__ */ jsx_dev_runtime35.jsxDEV("span", {
|
|
1650
|
-
className: "text-muted-foreground pr-2 text-right text-[10px] sm:text-xs",
|
|
1651
|
-
children: time.format("h A")
|
|
1652
|
-
}, undefined, false, undefined, this)
|
|
1653
|
-
}, time.format("HH:mm"), false, undefined, this))
|
|
1654
|
-
}, undefined, false, undefined, this),
|
|
1655
|
-
weekDays.map((day) => /* @__PURE__ */ jsx_dev_runtime35.jsxDEV(WeekDayCol, {
|
|
1656
|
-
day
|
|
1657
|
-
}, day.format("YYYY-MM-DD"), false, undefined, this)),
|
|
1658
|
-
isCurrentWeek && /* @__PURE__ */ jsx_dev_runtime35.jsxDEV("div", {
|
|
1659
|
-
"data-testid": "week-current-time-indicator",
|
|
1660
|
-
className: "pointer-events-none absolute z-20",
|
|
1661
|
-
style: {
|
|
1662
|
-
top: `${(dayjs_config_default().hour() + dayjs_config_default().minute() / 60) * 60}px`,
|
|
1663
|
-
left: `${todayIndex * (100 / 7)}%`,
|
|
1664
|
-
width: `${100 / 7}%`
|
|
1665
|
-
},
|
|
1666
|
-
children: /* @__PURE__ */ jsx_dev_runtime35.jsxDEV("div", {
|
|
1667
|
-
className: "w-full border-t border-red-500",
|
|
1668
|
-
children: /* @__PURE__ */ jsx_dev_runtime35.jsxDEV("div", {
|
|
1669
|
-
className: "-mt-1 ml-1 h-2 w-2 rounded-full bg-red-500"
|
|
1670
|
-
}, undefined, false, undefined, this)
|
|
1671
|
-
}, undefined, false, undefined, this)
|
|
1672
|
-
}, undefined, false, undefined, this)
|
|
1673
|
-
]
|
|
1674
|
-
}, undefined, true, undefined, this);
|
|
1675
|
-
};
|
|
1676
|
-
|
|
1677
|
-
// src/features/week-view/week-view.tsx
|
|
1678
|
-
var jsx_dev_runtime36 = require("react/jsx-dev-runtime");
|
|
1679
|
-
dayjs_config_default.extend(import_weekOfYear2.default);
|
|
1680
|
-
var WeekView = () => {
|
|
1681
|
-
return /* @__PURE__ */ jsx_dev_runtime36.jsxDEV("div", {
|
|
1682
|
-
className: "flex h-full flex-col",
|
|
1683
|
-
"data-testid": "week-view",
|
|
1684
|
-
children: [
|
|
1685
|
-
/* @__PURE__ */ jsx_dev_runtime36.jsxDEV(WeekHeader, {}, undefined, false, undefined, this),
|
|
1686
|
-
/* @__PURE__ */ jsx_dev_runtime36.jsxDEV(ScrollArea, {
|
|
1687
|
-
className: "flex flex-1 overflow-auto",
|
|
1688
|
-
"data-testid": "week-scroll-area",
|
|
1689
|
-
children: [
|
|
1690
|
-
/* @__PURE__ */ jsx_dev_runtime36.jsxDEV(WeekAllDayRow, {}, undefined, false, undefined, this),
|
|
1691
|
-
/* @__PURE__ */ jsx_dev_runtime36.jsxDEV(WeekTimeGrid, {}, undefined, false, undefined, this)
|
|
1692
|
-
]
|
|
1693
|
-
}, undefined, true, undefined, this)
|
|
1694
|
-
]
|
|
1695
|
-
}, undefined, true, undefined, this);
|
|
1696
|
-
};
|
|
1697
|
-
var week_view_default = WeekView;
|
|
1698
|
-
|
|
1699
|
-
// src/features/day-view/day-view.tsx
|
|
1700
|
-
var import_react17 = require("react");
|
|
1701
|
-
|
|
1702
|
-
// src/features/day-view/day-all-day-row.tsx
|
|
1703
|
-
var import_react15 = require("react");
|
|
1704
|
-
var jsx_dev_runtime37 = require("react/jsx-dev-runtime");
|
|
1705
|
-
var DayAllDayRow = () => {
|
|
1706
|
-
const { currentDate, getEventsForDate } = useCalendarContext();
|
|
1707
|
-
const dayEvents = getEventsForDate(currentDate);
|
|
1708
|
-
const { allDayEvents } = import_react15.useMemo(() => {
|
|
1709
|
-
const allDayEvts = dayEvents.filter((event) => event.allDay);
|
|
1710
|
-
const regularEvts = dayEvents.filter((event) => !event.allDay);
|
|
1711
|
-
return { allDayEvents: allDayEvts, regularEvents: regularEvts };
|
|
1712
|
-
}, [dayEvents]);
|
|
1713
|
-
const { processedAllDayEvents } = import_react15.useMemo(() => {
|
|
1714
|
-
const sortedEvents = [...allDayEvents].sort((a, b) => {
|
|
1715
|
-
return a.start.diff(b.start);
|
|
1716
|
-
});
|
|
1717
|
-
const rows = [];
|
|
1718
|
-
const processedEvents = [];
|
|
1719
|
-
sortedEvents.forEach((event, rowIndex) => {
|
|
1720
|
-
let placed = false;
|
|
1721
|
-
while (!placed) {
|
|
1722
|
-
if (rowIndex >= rows.length) {
|
|
1723
|
-
rows.push([]);
|
|
1724
|
-
placed = true;
|
|
1725
|
-
} else {
|
|
1726
|
-
placed = true;
|
|
1727
|
-
}
|
|
1728
|
-
}
|
|
1729
|
-
rows[rowIndex].push({ event });
|
|
1730
|
-
processedEvents.push({
|
|
1731
|
-
...event,
|
|
1732
|
-
left: 0,
|
|
1733
|
-
width: 100,
|
|
1734
|
-
top: rowIndex * EVENT_BAR_HEIGHT,
|
|
1735
|
-
height: EVENT_BAR_HEIGHT,
|
|
1736
|
-
allDay: true
|
|
1737
|
-
});
|
|
1738
|
-
});
|
|
1739
|
-
return {
|
|
1740
|
-
processedAllDayEvents: processedEvents,
|
|
1741
|
-
allDayRowsCount: Math.max(1, rows.length)
|
|
1742
|
-
};
|
|
1743
|
-
}, [allDayEvents]);
|
|
1744
|
-
return /* @__PURE__ */ jsx_dev_runtime37.jsxDEV("div", {
|
|
1745
|
-
"data-testid": "day-all-day-row",
|
|
1746
|
-
className: "grid grid-cols-8 border-b border-x",
|
|
1747
|
-
children: [
|
|
1748
|
-
/* @__PURE__ */ jsx_dev_runtime37.jsxDEV("div", {
|
|
1749
|
-
className: "col-span-2 flex shrink-0 items-center justify-end border-r pr-2 md:col-span-1",
|
|
1750
|
-
children: /* @__PURE__ */ jsx_dev_runtime37.jsxDEV("span", {
|
|
1751
|
-
className: "text-muted-foreground text-[10px] whitespace-nowrap sm:text-xs",
|
|
1752
|
-
children: "All-day"
|
|
1753
|
-
}, undefined, false, undefined, this)
|
|
1754
|
-
}, undefined, false, undefined, this),
|
|
1755
|
-
/* @__PURE__ */ jsx_dev_runtime37.jsxDEV("div", {
|
|
1756
|
-
className: "relative col-span-6 md:col-span-7 ",
|
|
1757
|
-
children: /* @__PURE__ */ jsx_dev_runtime37.jsxDEV(DroppableCell, {
|
|
1758
|
-
id: `all-day-${currentDate.format("YYYY-MM-DD")}`,
|
|
1759
|
-
type: "day-cell",
|
|
1760
|
-
date: currentDate,
|
|
1761
|
-
className: "hover:bg-accent w-full cursor-pointer min-h-10 flex flex-col",
|
|
1762
|
-
children: processedAllDayEvents.map((event, index) => {
|
|
1763
|
-
return /* @__PURE__ */ jsx_dev_runtime37.jsxDEV("div", {
|
|
1764
|
-
style: { height: EVENT_BAR_HEIGHT + "px" },
|
|
1765
|
-
children: /* @__PURE__ */ jsx_dev_runtime37.jsxDEV(DraggableEvent, {
|
|
1766
|
-
elementId: `all-day-${event.id}-${index}`,
|
|
1767
|
-
event,
|
|
1768
|
-
className: "overflow-clip text-xs",
|
|
1769
|
-
style: { width: `calc(100% - var(--spacing) * 2)` }
|
|
1770
|
-
}, undefined, false, undefined, this)
|
|
1771
|
-
}, `all-day-${event.id}-${index}`, false, undefined, this);
|
|
1772
|
-
})
|
|
1773
|
-
}, undefined, false, undefined, this)
|
|
1774
|
-
}, undefined, false, undefined, this)
|
|
1775
|
-
]
|
|
1776
|
-
}, undefined, true, undefined, this);
|
|
1777
|
-
};
|
|
1778
|
-
|
|
1779
|
-
// src/features/day-view/day-header.tsx
|
|
1780
|
-
var import_react16 = require("motion/react");
|
|
1781
|
-
var jsx_dev_runtime38 = require("react/jsx-dev-runtime");
|
|
1782
|
-
var DayHeader = () => {
|
|
1783
|
-
const { currentDate, stickyViewHeader, viewHeaderClassName } = useCalendarContext();
|
|
1784
|
-
const isToday = currentDate.isSame(dayjs_config_default(), "day");
|
|
1785
|
-
return /* @__PURE__ */ jsx_dev_runtime38.jsxDEV("div", {
|
|
1786
|
-
"data-testid": "day-header",
|
|
1787
|
-
className: cn("flex items-center justify-center border-b p-2 border-x", stickyViewHeader && "sticky top-0 z-100", viewHeaderClassName),
|
|
1788
|
-
children: /* @__PURE__ */ jsx_dev_runtime38.jsxDEV(import_react16.AnimatePresence, {
|
|
1789
|
-
mode: "wait",
|
|
1790
|
-
children: /* @__PURE__ */ jsx_dev_runtime38.jsxDEV(import_react16.motion.div, {
|
|
1791
|
-
initial: { opacity: 0, y: -10 },
|
|
1792
|
-
animate: { opacity: 1, y: 0 },
|
|
1793
|
-
exit: { opacity: 0, y: -10 },
|
|
1794
|
-
transition: { duration: 0.25, ease: "easeInOut" },
|
|
1795
|
-
className: cn("flex items-center text-center text-base font-semibold sm:text-xl", isToday && "text-primary"),
|
|
1796
|
-
children: [
|
|
1797
|
-
/* @__PURE__ */ jsx_dev_runtime38.jsxDEV("span", {
|
|
1798
|
-
className: "xs:inline hidden",
|
|
1799
|
-
children: currentDate.format("dddd, ")
|
|
1800
|
-
}, undefined, false, undefined, this),
|
|
1801
|
-
currentDate.format("MMMM D, YYYY"),
|
|
1802
|
-
isToday && /* @__PURE__ */ jsx_dev_runtime38.jsxDEV("span", {
|
|
1803
|
-
className: "bg-primary text-primary-foreground ml-2 rounded-full px-1 py-0.5 text-xs sm:px-2 sm:text-sm",
|
|
1804
|
-
children: "Today"
|
|
1805
|
-
}, undefined, false, undefined, this)
|
|
1806
|
-
]
|
|
1807
|
-
}, currentDate.format("YYYY-MM-DD"), true, undefined, this)
|
|
1808
|
-
}, undefined, false, undefined, this)
|
|
1809
|
-
}, undefined, false, undefined, this);
|
|
1810
|
-
};
|
|
1811
|
-
|
|
1812
|
-
// src/features/day-view/day-time-col.tsx
|
|
1813
|
-
var jsx_dev_runtime39 = require("react/jsx-dev-runtime");
|
|
1814
|
-
var hours3 = Array.from({ length: 24 }, (_, i) => i).map((hour) => {
|
|
1815
|
-
return dayjs_config_default().hour(hour).minute(0);
|
|
1816
|
-
});
|
|
1817
|
-
var DayTimeCol = ({ className }) => {
|
|
1818
|
-
return /* @__PURE__ */ jsx_dev_runtime39.jsxDEV("div", {
|
|
1819
|
-
"data-testid": "day-time-col",
|
|
1820
|
-
className: `col-span-2 h-full md:col-span-1 ${className}`,
|
|
1821
|
-
children: hours3.map((time) => /* @__PURE__ */ jsx_dev_runtime39.jsxDEV("div", {
|
|
1822
|
-
"data-testid": `day-time-hour-${time.format("HH")}`,
|
|
1823
|
-
className: "h-[60px] border-b text-right",
|
|
1824
|
-
children: /* @__PURE__ */ jsx_dev_runtime39.jsxDEV("span", {
|
|
1825
|
-
className: "text-muted-foreground pr-2 text-right text-[10px] sm:text-xs",
|
|
1826
|
-
children: time.format("h A")
|
|
1827
|
-
}, undefined, false, undefined, this)
|
|
1828
|
-
}, time.format("HH:mm"), false, undefined, this))
|
|
1829
|
-
}, undefined, false, undefined, this);
|
|
1830
|
-
};
|
|
1831
|
-
|
|
1832
|
-
// src/features/day-view/day-view.tsx
|
|
1833
|
-
var jsx_dev_runtime40 = require("react/jsx-dev-runtime");
|
|
1834
|
-
var DayView = () => {
|
|
1835
|
-
const { currentDate } = useCalendarContext();
|
|
1836
|
-
const hours4 = Array.from({ length: 24 }, (_, i) => i).map((hour) => {
|
|
1837
|
-
return dayjs_config_default().hour(hour).minute(0);
|
|
1838
|
-
});
|
|
1839
|
-
const timeSegments = [0, 15, 30, 45];
|
|
1840
|
-
const isToday = currentDate.isSame(dayjs_config_default(), "day");
|
|
1841
|
-
const cellDate = currentDate.format("YYYY-MM-DD");
|
|
1842
|
-
return /* @__PURE__ */ jsx_dev_runtime40.jsxDEV("div", {
|
|
1843
|
-
"data-testid": "day-view",
|
|
1844
|
-
className: "flex h-full flex-col",
|
|
1845
|
-
children: [
|
|
1846
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV(DayHeader, {}, undefined, false, undefined, this),
|
|
1847
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV(ScrollArea, {
|
|
1848
|
-
"data-testid": "day-scroll-area",
|
|
1849
|
-
className: "relative flex-1 overflow-y-auto",
|
|
1850
|
-
children: [
|
|
1851
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV(DayAllDayRow, {}, undefined, false, undefined, this),
|
|
1852
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV("div", {
|
|
1853
|
-
"data-testid": "day-time-grid",
|
|
1854
|
-
className: "grid grid-cols-8 divide-x border-x",
|
|
1855
|
-
style: { height: `${hours4.length * 60}px` },
|
|
1856
|
-
children: [
|
|
1857
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV(DayTimeCol, {
|
|
1858
|
-
className: "col-span-2 h-full md:col-span-1"
|
|
1859
|
-
}, undefined, false, undefined, this),
|
|
1860
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV("div", {
|
|
1861
|
-
"data-testid": "day-events-column",
|
|
1862
|
-
className: "relative col-span-6 h-full md:col-span-7",
|
|
1863
|
-
children: [
|
|
1864
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV("div", {
|
|
1865
|
-
"data-testid": "day-background-grid",
|
|
1866
|
-
className: "absolute inset-0 z-0",
|
|
1867
|
-
children: hours4.map((hour, index) => /* @__PURE__ */ jsx_dev_runtime40.jsxDEV("div", {
|
|
1868
|
-
className: "h-[60px] border-b",
|
|
1869
|
-
children: timeSegments.slice(1).map((minutes) => /* @__PURE__ */ jsx_dev_runtime40.jsxDEV("div", {
|
|
1870
|
-
className: "border-border absolute w-full border-t border-dashed",
|
|
1871
|
-
style: { top: `${index * 60 + minutes}px` }
|
|
1872
|
-
}, `bg-${hour.format("HH")}-${minutes}`, false, undefined, this))
|
|
1873
|
-
}, `bg-${currentDate.format("YYYY-MM-DD")}-${hour.format("HH")}`, false, undefined, this))
|
|
1874
|
-
}, undefined, false, undefined, this),
|
|
1875
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV("div", {
|
|
1876
|
-
"data-testid": "day-interactive-layer",
|
|
1877
|
-
className: "pointer-events-auto absolute inset-0 z-20",
|
|
1878
|
-
children: hours4.map((time) => {
|
|
1879
|
-
const hour = time.hour();
|
|
1880
|
-
return /* @__PURE__ */ jsx_dev_runtime40.jsxDEV(import_react17.Fragment, {
|
|
1881
|
-
children: [
|
|
1882
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV(DroppableCell, {
|
|
1883
|
-
id: `time-cell-${cellDate}-${time.format("HH")}-00`,
|
|
1884
|
-
type: "time-cell",
|
|
1885
|
-
date: currentDate,
|
|
1886
|
-
hour,
|
|
1887
|
-
minute: 0,
|
|
1888
|
-
className: cn("hover:bg-accent h-[15px] cursor-pointer")
|
|
1889
|
-
}, undefined, false, undefined, this),
|
|
1890
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV(DroppableCell, {
|
|
1891
|
-
id: `time-cell-${cellDate}-${time.format("HH")}-15`,
|
|
1892
|
-
type: "time-cell",
|
|
1893
|
-
date: currentDate,
|
|
1894
|
-
hour,
|
|
1895
|
-
minute: 15,
|
|
1896
|
-
className: "hover:bg-accent h-[15px] cursor-pointer"
|
|
1897
|
-
}, undefined, false, undefined, this),
|
|
1898
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV(DroppableCell, {
|
|
1899
|
-
id: `time-cell-${cellDate}-${time.format("HH")}-30`,
|
|
1900
|
-
type: "time-cell",
|
|
1901
|
-
date: currentDate,
|
|
1902
|
-
hour,
|
|
1903
|
-
minute: 30,
|
|
1904
|
-
className: "hover:bg-accent h-[15px] cursor-pointer"
|
|
1905
|
-
}, undefined, false, undefined, this),
|
|
1906
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV(DroppableCell, {
|
|
1907
|
-
id: `time-cell-${cellDate}-${time.format("HH")}-45`,
|
|
1908
|
-
type: "time-cell",
|
|
1909
|
-
date: currentDate,
|
|
1910
|
-
hour,
|
|
1911
|
-
minute: 45,
|
|
1912
|
-
className: "hover:bg-accent h-[15px] cursor-pointer"
|
|
1913
|
-
}, undefined, false, undefined, this)
|
|
1914
|
-
]
|
|
1915
|
-
}, `${cellDate}-${time.format("HH")}`, true, undefined, this);
|
|
1916
|
-
})
|
|
1917
|
-
}, undefined, false, undefined, this),
|
|
1918
|
-
/* @__PURE__ */ jsx_dev_runtime40.jsxDEV(DayEventsLayer, {
|
|
1919
|
-
day: currentDate
|
|
1920
|
-
}, undefined, false, undefined, this),
|
|
1921
|
-
isToday && /* @__PURE__ */ jsx_dev_runtime40.jsxDEV("div", {
|
|
1922
|
-
"data-testid": "day-current-time-indicator",
|
|
1923
|
-
className: "absolute right-0 left-0 z-40 border-t border-red-500",
|
|
1924
|
-
style: {
|
|
1925
|
-
top: `${(dayjs_config_default().hour() + dayjs_config_default().minute() / 60) * 60}px`
|
|
1926
|
-
},
|
|
1927
|
-
children: /* @__PURE__ */ jsx_dev_runtime40.jsxDEV("div", {
|
|
1928
|
-
className: "-mt-1 -ml-1 h-2 w-2 rounded-full bg-red-500"
|
|
1929
|
-
}, undefined, false, undefined, this)
|
|
1930
|
-
}, undefined, false, undefined, this)
|
|
1931
|
-
]
|
|
1932
|
-
}, undefined, true, undefined, this)
|
|
1933
|
-
]
|
|
1934
|
-
}, undefined, true, undefined, this)
|
|
1935
|
-
]
|
|
1936
|
-
}, undefined, true, undefined, this)
|
|
1937
|
-
]
|
|
1938
|
-
}, undefined, true, undefined, this);
|
|
1939
|
-
};
|
|
1940
|
-
var day_view_default = DayView;
|
|
1941
|
-
|
|
1942
|
-
// src/components/event-form/event-form.tsx
|
|
1943
|
-
var import_react18 = require("react");
|
|
1944
|
-
var jsx_dev_runtime41 = require("react/jsx-dev-runtime");
|
|
1945
|
-
var colorOptions = [
|
|
1946
|
-
{ value: "bg-blue-100 text-blue-800", label: "Blue" },
|
|
1947
|
-
{ value: "bg-green-100 text-green-800", label: "Green" },
|
|
1948
|
-
{ value: "bg-purple-100 text-purple-800", label: "Purple" },
|
|
1949
|
-
{ value: "bg-red-100 text-red-800", label: "Red" },
|
|
1950
|
-
{ value: "bg-yellow-100 text-yellow-800", label: "Yellow" },
|
|
1951
|
-
{ value: "bg-pink-100 text-pink-800", label: "Pink" },
|
|
1952
|
-
{ value: "bg-indigo-100 text-indigo-800", label: "Indigo" },
|
|
1953
|
-
{ value: "bg-amber-100 text-amber-800", label: "Amber" },
|
|
1954
|
-
{ value: "bg-emerald-100 text-emerald-800", label: "Emerald" },
|
|
1955
|
-
{ value: "bg-sky-100 text-sky-800", label: "Sky" },
|
|
1956
|
-
{ value: "bg-violet-100 text-violet-800", label: "Violet" },
|
|
1957
|
-
{ value: "bg-rose-100 text-rose-800", label: "Rose" },
|
|
1958
|
-
{ value: "bg-teal-100 text-teal-800", label: "Teal" },
|
|
1959
|
-
{ value: "bg-orange-100 text-orange-800", label: "Orange" }
|
|
1960
|
-
];
|
|
1961
|
-
var EventForm = ({
|
|
1962
|
-
selectedEvent,
|
|
1963
|
-
selectedDate,
|
|
1964
|
-
onClose,
|
|
1965
|
-
onUpdate,
|
|
1966
|
-
onDelete,
|
|
1967
|
-
onAdd
|
|
1968
|
-
}) => {
|
|
1969
|
-
const start = selectedEvent?.originalStart ?? selectedEvent?.start;
|
|
1970
|
-
const end = selectedEvent?.originalEnd ?? selectedEvent?.end;
|
|
1971
|
-
const defaultStartDate = selectedDate?.toDate() || new Date;
|
|
1972
|
-
const defaultEndDate = selectedDate?.add(1, "hour").toDate() || dayjs_config_default().add(1, "hour").toDate();
|
|
1973
|
-
const [startDate, setStartDate] = import_react18.useState(start?.toDate() || defaultStartDate);
|
|
1974
|
-
const [endDate, setEndDate] = import_react18.useState(end?.toDate() || defaultEndDate);
|
|
1975
|
-
const [isAllDay, setIsAllDay] = import_react18.useState(selectedEvent?.allDay || false);
|
|
1976
|
-
const [selectedColor, setSelectedColor] = import_react18.useState(selectedEvent?.color || colorOptions[0].value);
|
|
1977
|
-
const [startTime, setStartTime] = import_react18.useState(selectedEvent ? selectedEvent.start.format("HH:mm") : dayjs_config_default(defaultStartDate).format("HH:mm"));
|
|
1978
|
-
const [endTime, setEndTime] = import_react18.useState(selectedEvent ? selectedEvent.end.format("HH:mm") : dayjs_config_default(defaultEndDate).format("HH:mm"));
|
|
1979
|
-
const [formValues, setFormValues] = import_react18.useState({
|
|
1980
|
-
title: selectedEvent?.title || "",
|
|
1981
|
-
description: selectedEvent?.description || "",
|
|
1982
|
-
location: selectedEvent?.location || ""
|
|
1983
|
-
});
|
|
1984
|
-
const handleStartDateChange = (date) => {
|
|
1985
|
-
if (date)
|
|
1986
|
-
setStartDate(date);
|
|
1987
|
-
};
|
|
1988
|
-
const handleEndDateChange = (date) => {
|
|
1989
|
-
if (date)
|
|
1990
|
-
setEndDate(date);
|
|
1991
|
-
};
|
|
1992
|
-
const handleInputChange = (e) => {
|
|
1993
|
-
const { name, value } = e.target;
|
|
1994
|
-
setFormValues((prev) => ({ ...prev, [name]: value }));
|
|
1995
|
-
};
|
|
1996
|
-
const handleTimeChange = (e, isStart) => {
|
|
1997
|
-
const timeValue = e.target.value;
|
|
1998
|
-
if (isStart) {
|
|
1999
|
-
setStartTime(timeValue);
|
|
2000
|
-
} else {
|
|
2001
|
-
setEndTime(timeValue);
|
|
2002
|
-
}
|
|
2003
|
-
};
|
|
2004
|
-
import_react18.useEffect(() => {
|
|
2005
|
-
if (isAllDay) {
|
|
2006
|
-
setEndTime("23:59");
|
|
2007
|
-
}
|
|
2008
|
-
}, [isAllDay]);
|
|
2009
|
-
const handleSubmit = (e) => {
|
|
2010
|
-
e.preventDefault();
|
|
2011
|
-
const [startHours, startMinutes] = startTime.split(":").map(Number);
|
|
2012
|
-
const [endHours, endMinutes] = endTime.split(":").map(Number);
|
|
2013
|
-
let startDateTime = dayjs_config_default(startDate).hour(startHours).minute(startMinutes);
|
|
2014
|
-
let endDateTime = dayjs_config_default(endDate).hour(endHours).minute(endMinutes);
|
|
2015
|
-
if (isAllDay) {
|
|
2016
|
-
startDateTime = startDateTime.hour(0).minute(0);
|
|
2017
|
-
endDateTime = endDateTime.hour(23).minute(59);
|
|
2018
|
-
}
|
|
2019
|
-
const eventData = {
|
|
2020
|
-
id: selectedEvent?.id || dayjs_config_default().format("YYYYMMDDHHmmss"),
|
|
2021
|
-
title: formValues.title,
|
|
2022
|
-
start: startDateTime,
|
|
2023
|
-
end: endDateTime,
|
|
2024
|
-
description: formValues.description,
|
|
2025
|
-
location: formValues.location,
|
|
2026
|
-
allDay: isAllDay,
|
|
2027
|
-
color: selectedColor
|
|
2028
|
-
};
|
|
2029
|
-
if (selectedEvent.id) {
|
|
2030
|
-
onUpdate?.(eventData);
|
|
2031
|
-
} else {
|
|
2032
|
-
onAdd?.(eventData);
|
|
2033
|
-
}
|
|
2034
|
-
onClose();
|
|
2035
|
-
};
|
|
2036
|
-
const handleDelete = () => {
|
|
2037
|
-
if (selectedEvent.id) {
|
|
2038
|
-
onDelete?.(selectedEvent);
|
|
2039
|
-
onClose();
|
|
2040
|
-
}
|
|
2041
|
-
};
|
|
2042
|
-
import_react18.useEffect(() => {
|
|
2043
|
-
if (dayjs_config_default(startDate).isAfter(dayjs_config_default(endDate))) {
|
|
2044
|
-
setEndDate(startDate);
|
|
2045
|
-
}
|
|
2046
|
-
}, [startDate, endDate]);
|
|
2047
|
-
return /* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Dialog, {
|
|
2048
|
-
open: true,
|
|
2049
|
-
onOpenChange: onClose,
|
|
2050
|
-
children: /* @__PURE__ */ jsx_dev_runtime41.jsxDEV(DialogContent, {
|
|
2051
|
-
className: "w-[90vw] max-w-[500px] p-4 sm:p-6",
|
|
2052
|
-
children: /* @__PURE__ */ jsx_dev_runtime41.jsxDEV("form", {
|
|
2053
|
-
onSubmit: handleSubmit,
|
|
2054
|
-
children: [
|
|
2055
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(DialogHeader, {
|
|
2056
|
-
className: "mb-2 sm:mb-4",
|
|
2057
|
-
children: [
|
|
2058
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(DialogTitle, {
|
|
2059
|
-
className: "text-base sm:text-lg",
|
|
2060
|
-
children: selectedEvent.id ? "Edit Event" : "Create Event"
|
|
2061
|
-
}, undefined, false, undefined, this),
|
|
2062
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(DialogDescription, {
|
|
2063
|
-
className: "text-xs sm:text-sm",
|
|
2064
|
-
children: selectedEvent.id ? "Edit your event details" : "Add a new event to your calendar"
|
|
2065
|
-
}, undefined, false, undefined, this)
|
|
2066
|
-
]
|
|
2067
|
-
}, undefined, true, undefined, this),
|
|
2068
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2069
|
-
className: "grid gap-3 py-2 sm:gap-4 sm:py-4",
|
|
2070
|
-
children: [
|
|
2071
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2072
|
-
className: "grid gap-2",
|
|
2073
|
-
children: [
|
|
2074
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Label2, {
|
|
2075
|
-
htmlFor: "title",
|
|
2076
|
-
className: "text-xs sm:text-sm",
|
|
2077
|
-
children: "Title"
|
|
2078
|
-
}, undefined, false, undefined, this),
|
|
2079
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Input, {
|
|
2080
|
-
id: "title",
|
|
2081
|
-
name: "title",
|
|
2082
|
-
value: formValues.title,
|
|
2083
|
-
onChange: handleInputChange,
|
|
2084
|
-
placeholder: "Event title",
|
|
2085
|
-
required: true,
|
|
2086
|
-
autoFocus: true,
|
|
2087
|
-
className: "h-8 text-sm sm:h-9"
|
|
2088
|
-
}, undefined, false, undefined, this)
|
|
2089
|
-
]
|
|
2090
|
-
}, undefined, true, undefined, this),
|
|
2091
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2092
|
-
className: "flex items-center space-x-2",
|
|
2093
|
-
children: [
|
|
2094
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Checkbox, {
|
|
2095
|
-
id: "allDay",
|
|
2096
|
-
checked: isAllDay,
|
|
2097
|
-
onCheckedChange: (checked) => setIsAllDay(checked === true)
|
|
2098
|
-
}, undefined, false, undefined, this),
|
|
2099
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Label2, {
|
|
2100
|
-
htmlFor: "allDay",
|
|
2101
|
-
className: "text-xs sm:text-sm",
|
|
2102
|
-
children: "All day"
|
|
2103
|
-
}, undefined, false, undefined, this)
|
|
2104
|
-
]
|
|
2105
|
-
}, undefined, true, undefined, this),
|
|
2106
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2107
|
-
className: "grid grid-cols-2 gap-2 sm:gap-4",
|
|
2108
|
-
children: [
|
|
2109
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2110
|
-
children: [
|
|
2111
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Label2, {
|
|
2112
|
-
className: "text-xs sm:text-sm",
|
|
2113
|
-
children: "Start Date"
|
|
2114
|
-
}, undefined, false, undefined, this),
|
|
2115
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(DatePicker, {
|
|
2116
|
-
date: startDate,
|
|
2117
|
-
setDate: handleStartDateChange,
|
|
2118
|
-
className: "mt-1",
|
|
2119
|
-
closeOnSelect: true
|
|
2120
|
-
}, undefined, false, undefined, this)
|
|
2121
|
-
]
|
|
2122
|
-
}, undefined, true, undefined, this),
|
|
2123
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2124
|
-
children: [
|
|
2125
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Label2, {
|
|
2126
|
-
className: "text-xs sm:text-sm",
|
|
2127
|
-
children: "End Date"
|
|
2128
|
-
}, undefined, false, undefined, this),
|
|
2129
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(DatePicker, {
|
|
2130
|
-
date: endDate,
|
|
2131
|
-
setDate: handleEndDateChange,
|
|
2132
|
-
className: "mt-1",
|
|
2133
|
-
closeOnSelect: true
|
|
2134
|
-
}, undefined, false, undefined, this)
|
|
2135
|
-
]
|
|
2136
|
-
}, undefined, true, undefined, this)
|
|
2137
|
-
]
|
|
2138
|
-
}, undefined, true, undefined, this),
|
|
2139
|
-
!isAllDay && /* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2140
|
-
className: "grid grid-cols-2 gap-2 sm:gap-4",
|
|
2141
|
-
children: [
|
|
2142
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2143
|
-
children: [
|
|
2144
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Label2, {
|
|
2145
|
-
htmlFor: "start-time",
|
|
2146
|
-
className: "text-xs sm:text-sm",
|
|
2147
|
-
children: "Start Time"
|
|
2148
|
-
}, undefined, false, undefined, this),
|
|
2149
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Input, {
|
|
2150
|
-
id: "start-time",
|
|
2151
|
-
type: "time",
|
|
2152
|
-
value: startTime,
|
|
2153
|
-
onChange: (e) => handleTimeChange(e, true),
|
|
2154
|
-
className: "mt-1 h-8 text-sm sm:h-9"
|
|
2155
|
-
}, undefined, false, undefined, this)
|
|
2156
|
-
]
|
|
2157
|
-
}, undefined, true, undefined, this),
|
|
2158
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2159
|
-
children: [
|
|
2160
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Label2, {
|
|
2161
|
-
htmlFor: "end-time",
|
|
2162
|
-
className: "text-xs sm:text-sm",
|
|
2163
|
-
children: "End Time"
|
|
2164
|
-
}, undefined, false, undefined, this),
|
|
2165
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Input, {
|
|
2166
|
-
id: "end-time",
|
|
2167
|
-
type: "time",
|
|
2168
|
-
value: endTime,
|
|
2169
|
-
onChange: (e) => handleTimeChange(e, false),
|
|
2170
|
-
className: "mt-1 h-8 text-sm sm:h-9"
|
|
2171
|
-
}, undefined, false, undefined, this)
|
|
2172
|
-
]
|
|
2173
|
-
}, undefined, true, undefined, this)
|
|
2174
|
-
]
|
|
2175
|
-
}, undefined, true, undefined, this),
|
|
2176
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2177
|
-
className: "grid gap-1 sm:gap-2",
|
|
2178
|
-
children: [
|
|
2179
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Label2, {
|
|
2180
|
-
className: "text-xs sm:text-sm",
|
|
2181
|
-
children: "Color"
|
|
2182
|
-
}, undefined, false, undefined, this),
|
|
2183
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2184
|
-
className: "flex flex-wrap gap-2",
|
|
2185
|
-
children: /* @__PURE__ */ jsx_dev_runtime41.jsxDEV(TooltipProvider, {
|
|
2186
|
-
children: colorOptions.map((color) => /* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Tooltip, {
|
|
2187
|
-
children: [
|
|
2188
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(TooltipTrigger, {
|
|
2189
|
-
asChild: true,
|
|
2190
|
-
children: /* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Button, {
|
|
2191
|
-
variant: "ghost",
|
|
2192
|
-
type: "button",
|
|
2193
|
-
className: cn(`${color.value} h-6 w-6 rounded-full sm:h-8 sm:w-8`, selectedColor === color.value && "ring-2 ring-black ring-offset-1 sm:ring-offset-2"),
|
|
2194
|
-
onClick: () => setSelectedColor(color.value),
|
|
2195
|
-
"aria-label": color.label
|
|
2196
|
-
}, color.value, false, undefined, this)
|
|
2197
|
-
}, undefined, false, undefined, this),
|
|
2198
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(TooltipContent, {
|
|
2199
|
-
children: /* @__PURE__ */ jsx_dev_runtime41.jsxDEV("p", {
|
|
2200
|
-
className: "text-xs sm:text-sm",
|
|
2201
|
-
children: color.label
|
|
2202
|
-
}, undefined, false, undefined, this)
|
|
2203
|
-
}, undefined, false, undefined, this)
|
|
2204
|
-
]
|
|
2205
|
-
}, color.value, true, undefined, this))
|
|
2206
|
-
}, undefined, false, undefined, this)
|
|
2207
|
-
}, undefined, false, undefined, this)
|
|
2208
|
-
]
|
|
2209
|
-
}, undefined, true, undefined, this),
|
|
2210
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2211
|
-
className: "grid gap-1 sm:gap-2",
|
|
2212
|
-
children: [
|
|
2213
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Label2, {
|
|
2214
|
-
htmlFor: "location",
|
|
2215
|
-
className: "text-xs sm:text-sm",
|
|
2216
|
-
children: "Location"
|
|
2217
|
-
}, undefined, false, undefined, this),
|
|
2218
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Input, {
|
|
2219
|
-
id: "location",
|
|
2220
|
-
name: "location",
|
|
2221
|
-
value: formValues.location,
|
|
2222
|
-
onChange: handleInputChange,
|
|
2223
|
-
placeholder: "Event location (optional)",
|
|
2224
|
-
className: "h-8 text-sm sm:h-9"
|
|
2225
|
-
}, undefined, false, undefined, this)
|
|
2226
|
-
]
|
|
2227
|
-
}, undefined, true, undefined, this),
|
|
2228
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2229
|
-
className: "grid gap-1 sm:gap-2",
|
|
2230
|
-
children: [
|
|
2231
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Label2, {
|
|
2232
|
-
htmlFor: "description",
|
|
2233
|
-
className: "text-xs sm:text-sm",
|
|
2234
|
-
children: "Description"
|
|
2235
|
-
}, undefined, false, undefined, this),
|
|
2236
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Input, {
|
|
2237
|
-
id: "description",
|
|
2238
|
-
name: "description",
|
|
2239
|
-
value: formValues.description,
|
|
2240
|
-
onChange: handleInputChange,
|
|
2241
|
-
placeholder: "Event description (optional)",
|
|
2242
|
-
className: "h-8 text-sm sm:h-9"
|
|
2243
|
-
}, undefined, false, undefined, this)
|
|
2244
|
-
]
|
|
2245
|
-
}, undefined, true, undefined, this)
|
|
2246
|
-
]
|
|
2247
|
-
}, undefined, true, undefined, this),
|
|
2248
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(DialogFooter, {
|
|
2249
|
-
className: "mt-2 flex flex-col-reverse gap-2 sm:mt-4 sm:flex-row sm:gap-0",
|
|
2250
|
-
children: [
|
|
2251
|
-
selectedEvent.id && /* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Button, {
|
|
2252
|
-
type: "button",
|
|
2253
|
-
variant: "destructive",
|
|
2254
|
-
onClick: handleDelete,
|
|
2255
|
-
className: "w-full sm:mr-auto sm:w-auto",
|
|
2256
|
-
size: "sm",
|
|
2257
|
-
children: "Delete"
|
|
2258
|
-
}, undefined, false, undefined, this),
|
|
2259
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV("div", {
|
|
2260
|
-
className: "flex w-full gap-2 sm:w-auto",
|
|
2261
|
-
children: [
|
|
2262
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Button, {
|
|
2263
|
-
type: "button",
|
|
2264
|
-
variant: "outline",
|
|
2265
|
-
onClick: onClose,
|
|
2266
|
-
className: "flex-1 sm:flex-none",
|
|
2267
|
-
size: "sm",
|
|
2268
|
-
children: "Cancel"
|
|
2269
|
-
}, undefined, false, undefined, this),
|
|
2270
|
-
/* @__PURE__ */ jsx_dev_runtime41.jsxDEV(Button, {
|
|
2271
|
-
type: "submit",
|
|
2272
|
-
className: "flex-1 sm:flex-none",
|
|
2273
|
-
size: "sm",
|
|
2274
|
-
children: selectedEvent.id ? "Update" : "Create"
|
|
2275
|
-
}, undefined, false, undefined, this)
|
|
2276
|
-
]
|
|
2277
|
-
}, undefined, true, undefined, this)
|
|
2278
|
-
]
|
|
2279
|
-
}, undefined, true, undefined, this)
|
|
2280
|
-
]
|
|
2281
|
-
}, undefined, true, undefined, this)
|
|
2282
|
-
}, undefined, false, undefined, this)
|
|
2283
|
-
}, undefined, false, undefined, this);
|
|
2284
|
-
};
|
|
2285
|
-
|
|
2286
|
-
// src/components/header/base-header.tsx
|
|
2287
|
-
var import_lucide_react11 = require("lucide-react");
|
|
2288
|
-
var import_react21 = require("react");
|
|
2289
|
-
|
|
2290
|
-
// src/components/header/title-content.tsx
|
|
2291
|
-
var import_react19 = require("motion/react");
|
|
2292
|
-
var import_lucide_react9 = require("lucide-react");
|
|
2293
|
-
var import_react20 = require("react");
|
|
2294
|
-
var jsx_dev_runtime42 = require("react/jsx-dev-runtime");
|
|
2295
|
-
var months = [
|
|
2296
|
-
"January",
|
|
2297
|
-
"February",
|
|
2298
|
-
"March",
|
|
2299
|
-
"April",
|
|
2300
|
-
"May",
|
|
2301
|
-
"June",
|
|
2302
|
-
"July",
|
|
2303
|
-
"August",
|
|
2304
|
-
"September",
|
|
2305
|
-
"October",
|
|
2306
|
-
"November",
|
|
2307
|
-
"December"
|
|
2308
|
-
];
|
|
2309
|
-
var animationVariants = {
|
|
2310
|
-
initial: { opacity: 0, y: 10 },
|
|
2311
|
-
animate: { opacity: 1, y: 0 },
|
|
2312
|
-
exit: { opacity: 0, y: -10 }
|
|
2313
|
-
};
|
|
2314
|
-
var TitleContent = () => {
|
|
2315
|
-
const { currentDate, view, setCurrentDate } = useCalendarContext();
|
|
2316
|
-
const [monthPopoverOpen, setMonthPopoverOpen] = import_react20.useState(false);
|
|
2317
|
-
const [yearPopoverOpen, setYearPopoverOpen] = import_react20.useState(false);
|
|
2318
|
-
const [weekPopoverOpen, setWeekPopoverOpen] = import_react20.useState(false);
|
|
2319
|
-
const [dayPopoverOpen, setDayPopoverOpen] = import_react20.useState(false);
|
|
2320
|
-
const currentYear = currentDate.year();
|
|
2321
|
-
const years = Array.from({ length: 11 }, (_, i) => currentYear - 5 + i);
|
|
2322
|
-
const handleMonthChange = (month) => {
|
|
2323
|
-
const newDate = currentDate.month(month);
|
|
2324
|
-
setCurrentDate(newDate);
|
|
2325
|
-
setMonthPopoverOpen(false);
|
|
2326
|
-
};
|
|
2327
|
-
const handleYearChange = (year) => {
|
|
2328
|
-
const newDate = currentDate.year(year);
|
|
2329
|
-
setCurrentDate(newDate);
|
|
2330
|
-
setYearPopoverOpen(false);
|
|
2331
|
-
};
|
|
2332
|
-
return /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(jsx_dev_runtime42.Fragment, {
|
|
2333
|
-
children: [
|
|
2334
|
-
view !== "year" && /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Popover, {
|
|
2335
|
-
open: monthPopoverOpen,
|
|
2336
|
-
onOpenChange: setMonthPopoverOpen,
|
|
2337
|
-
children: [
|
|
2338
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(PopoverTrigger, {
|
|
2339
|
-
asChild: true,
|
|
2340
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Button, {
|
|
2341
|
-
variant: "ghost",
|
|
2342
|
-
className: "flex items-center gap-1 px-2 font-semibold",
|
|
2343
|
-
children: [
|
|
2344
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_react19.AnimatePresence, {
|
|
2345
|
-
mode: "wait",
|
|
2346
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_react19.motion.span, {
|
|
2347
|
-
initial: "initial",
|
|
2348
|
-
animate: "animate",
|
|
2349
|
-
exit: "exit",
|
|
2350
|
-
variants: animationVariants,
|
|
2351
|
-
transition: { duration: 0.25, ease: "easeInOut" },
|
|
2352
|
-
children: currentDate.format("MMMM")
|
|
2353
|
-
}, `month-${currentDate.month()}`, false, undefined, this)
|
|
2354
|
-
}, undefined, false, undefined, this),
|
|
2355
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_lucide_react9.ChevronDown, {
|
|
2356
|
-
className: "h-4 w-4"
|
|
2357
|
-
}, undefined, false, undefined, this)
|
|
2358
|
-
]
|
|
2359
|
-
}, undefined, true, undefined, this)
|
|
2360
|
-
}, undefined, false, undefined, this),
|
|
2361
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(PopoverContent, {
|
|
2362
|
-
className: "w-40 p-0",
|
|
2363
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV("div", {
|
|
2364
|
-
className: "flex max-h-60 flex-col overflow-auto",
|
|
2365
|
-
children: months.map((month, index) => /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Button, {
|
|
2366
|
-
variant: "ghost",
|
|
2367
|
-
className: cn("justify-start font-normal", currentDate.month() === index && "bg-primary/10"),
|
|
2368
|
-
onClick: () => handleMonthChange(index),
|
|
2369
|
-
children: month
|
|
2370
|
-
}, month, false, undefined, this))
|
|
2371
|
-
}, undefined, false, undefined, this)
|
|
2372
|
-
}, undefined, false, undefined, this)
|
|
2373
|
-
]
|
|
2374
|
-
}, undefined, true, undefined, this),
|
|
2375
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Popover, {
|
|
2376
|
-
open: yearPopoverOpen,
|
|
2377
|
-
onOpenChange: setYearPopoverOpen,
|
|
2378
|
-
children: [
|
|
2379
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(PopoverTrigger, {
|
|
2380
|
-
asChild: true,
|
|
2381
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Button, {
|
|
2382
|
-
variant: "ghost",
|
|
2383
|
-
className: "flex items-center gap-1 px-2 font-semibold",
|
|
2384
|
-
children: [
|
|
2385
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_react19.AnimatePresence, {
|
|
2386
|
-
mode: "wait",
|
|
2387
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_react19.motion.span, {
|
|
2388
|
-
initial: "initial",
|
|
2389
|
-
animate: "animate",
|
|
2390
|
-
exit: "exit",
|
|
2391
|
-
variants: animationVariants,
|
|
2392
|
-
transition: { duration: 0.25, ease: "easeInOut" },
|
|
2393
|
-
children: currentDate.format("YYYY")
|
|
2394
|
-
}, `year-${currentDate.year()}`, false, undefined, this)
|
|
2395
|
-
}, undefined, false, undefined, this),
|
|
2396
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_lucide_react9.ChevronDown, {
|
|
2397
|
-
className: "h-4 w-4"
|
|
2398
|
-
}, undefined, false, undefined, this)
|
|
2399
|
-
]
|
|
2400
|
-
}, undefined, true, undefined, this)
|
|
2401
|
-
}, undefined, false, undefined, this),
|
|
2402
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(PopoverContent, {
|
|
2403
|
-
className: "w-24 p-0",
|
|
2404
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV("div", {
|
|
2405
|
-
className: "flex max-h-60 flex-col overflow-auto",
|
|
2406
|
-
children: years.map((year) => /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Button, {
|
|
2407
|
-
variant: "ghost",
|
|
2408
|
-
className: cn("justify-start font-normal", currentDate.year() === year && "bg-primary/10"),
|
|
2409
|
-
onClick: () => handleYearChange(year),
|
|
2410
|
-
children: year
|
|
2411
|
-
}, year, false, undefined, this))
|
|
2412
|
-
}, undefined, false, undefined, this)
|
|
2413
|
-
}, undefined, false, undefined, this)
|
|
2414
|
-
]
|
|
2415
|
-
}, undefined, true, undefined, this),
|
|
2416
|
-
view === "week" && /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Popover, {
|
|
2417
|
-
open: weekPopoverOpen,
|
|
2418
|
-
onOpenChange: setWeekPopoverOpen,
|
|
2419
|
-
children: [
|
|
2420
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(PopoverTrigger, {
|
|
2421
|
-
asChild: true,
|
|
2422
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Button, {
|
|
2423
|
-
variant: "ghost",
|
|
2424
|
-
className: "flex items-center gap-1 px-2 font-semibold",
|
|
2425
|
-
children: [
|
|
2426
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_react19.AnimatePresence, {
|
|
2427
|
-
mode: "wait",
|
|
2428
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_react19.motion.span, {
|
|
2429
|
-
initial: "initial",
|
|
2430
|
-
animate: "animate",
|
|
2431
|
-
exit: "exit",
|
|
2432
|
-
variants: animationVariants,
|
|
2433
|
-
transition: { duration: 0.25, ease: "easeInOut" },
|
|
2434
|
-
children: `${currentDate.startOf("week").format("MMM D")} - ${currentDate.endOf("week").format("MMM D")}`
|
|
2435
|
-
}, `week-range-${currentDate.format("YYYY-MM-DD")}`, false, undefined, this)
|
|
2436
|
-
}, undefined, false, undefined, this),
|
|
2437
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_lucide_react9.ChevronDown, {
|
|
2438
|
-
className: "ml-1 h-3 w-3 opacity-70"
|
|
2439
|
-
}, undefined, false, undefined, this)
|
|
2440
|
-
]
|
|
2441
|
-
}, undefined, true, undefined, this)
|
|
2442
|
-
}, undefined, false, undefined, this),
|
|
2443
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(PopoverContent, {
|
|
2444
|
-
className: "w-56 p-0",
|
|
2445
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV("div", {
|
|
2446
|
-
className: "flex max-h-60 flex-col overflow-auto",
|
|
2447
|
-
children: Array.from({ length: 7 }, (_, i) => {
|
|
2448
|
-
const weekDate = currentDate.subtract(3, "week").add(i, "week");
|
|
2449
|
-
const startOfWeek = weekDate.startOf("week");
|
|
2450
|
-
const endOfWeek = weekDate.endOf("week");
|
|
2451
|
-
const isCurrentWeek = weekDate.isSame(currentDate, "week");
|
|
2452
|
-
return /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Button, {
|
|
2453
|
-
variant: "ghost",
|
|
2454
|
-
className: cn("justify-start font-normal", isCurrentWeek && "bg-primary/10"),
|
|
2455
|
-
onClick: () => {
|
|
2456
|
-
setCurrentDate(startOfWeek);
|
|
2457
|
-
setWeekPopoverOpen(false);
|
|
2458
|
-
},
|
|
2459
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV("div", {
|
|
2460
|
-
className: "flex w-full items-center justify-between",
|
|
2461
|
-
children: [
|
|
2462
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV("span", {
|
|
2463
|
-
children: `${startOfWeek.format("MMM D")} - ${endOfWeek.format("D")}`
|
|
2464
|
-
}, undefined, false, undefined, this),
|
|
2465
|
-
startOfWeek.month() !== endOfWeek.month() && /* @__PURE__ */ jsx_dev_runtime42.jsxDEV("span", {
|
|
2466
|
-
className: "text-xs opacity-70",
|
|
2467
|
-
children: `${startOfWeek.format("MMM")}-${endOfWeek.format("MMM")}`
|
|
2468
|
-
}, undefined, false, undefined, this)
|
|
2469
|
-
]
|
|
2470
|
-
}, undefined, true, undefined, this)
|
|
2471
|
-
}, startOfWeek.format("YYYY-MM-DD"), false, undefined, this);
|
|
2472
|
-
})
|
|
2473
|
-
}, undefined, false, undefined, this)
|
|
2474
|
-
}, undefined, false, undefined, this)
|
|
2475
|
-
]
|
|
2476
|
-
}, undefined, true, undefined, this),
|
|
2477
|
-
view === "day" && /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Popover, {
|
|
2478
|
-
open: dayPopoverOpen,
|
|
2479
|
-
onOpenChange: setDayPopoverOpen,
|
|
2480
|
-
children: [
|
|
2481
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(PopoverTrigger, {
|
|
2482
|
-
asChild: true,
|
|
2483
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Button, {
|
|
2484
|
-
variant: "ghost",
|
|
2485
|
-
className: "flex items-center gap-1 px-2 font-semibold",
|
|
2486
|
-
children: [
|
|
2487
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_react19.AnimatePresence, {
|
|
2488
|
-
mode: "wait",
|
|
2489
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_react19.motion.span, {
|
|
2490
|
-
initial: "initial",
|
|
2491
|
-
animate: "animate",
|
|
2492
|
-
exit: "exit",
|
|
2493
|
-
variants: animationVariants,
|
|
2494
|
-
transition: { duration: 0.25, ease: "easeInOut" },
|
|
2495
|
-
children: currentDate.format("dddd, D")
|
|
2496
|
-
}, `day-info-${currentDate.format("YYYY-MM-DD")}`, false, undefined, this)
|
|
2497
|
-
}, undefined, false, undefined, this),
|
|
2498
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(import_lucide_react9.ChevronDown, {
|
|
2499
|
-
className: "ml-1 h-3 w-3 opacity-70"
|
|
2500
|
-
}, undefined, false, undefined, this)
|
|
2501
|
-
]
|
|
2502
|
-
}, undefined, true, undefined, this)
|
|
2503
|
-
}, undefined, false, undefined, this),
|
|
2504
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV(PopoverContent, {
|
|
2505
|
-
className: "w-56 p-0",
|
|
2506
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV("div", {
|
|
2507
|
-
className: "flex max-h-60 flex-col overflow-auto",
|
|
2508
|
-
children: (() => {
|
|
2509
|
-
const firstDayOfMonth = currentDate.startOf("month");
|
|
2510
|
-
const daysInMonth = currentDate.daysInMonth();
|
|
2511
|
-
return Array.from({ length: daysInMonth }, (_, i) => {
|
|
2512
|
-
const dayDate = firstDayOfMonth.date(i + 1);
|
|
2513
|
-
const isCurrentDay = dayDate.isSame(currentDate, "day");
|
|
2514
|
-
const isToday = dayDate.isSame(dayjs_config_default(), "day");
|
|
2515
|
-
return /* @__PURE__ */ jsx_dev_runtime42.jsxDEV(Button, {
|
|
2516
|
-
variant: "ghost",
|
|
2517
|
-
className: cn("justify-start font-normal", isCurrentDay && "bg-primary/10"),
|
|
2518
|
-
onClick: () => {
|
|
2519
|
-
setCurrentDate(dayDate);
|
|
2520
|
-
setDayPopoverOpen(false);
|
|
2521
|
-
},
|
|
2522
|
-
children: /* @__PURE__ */ jsx_dev_runtime42.jsxDEV("div", {
|
|
2523
|
-
className: "flex w-full items-center justify-between",
|
|
2524
|
-
children: [
|
|
2525
|
-
/* @__PURE__ */ jsx_dev_runtime42.jsxDEV("span", {
|
|
2526
|
-
children: dayDate.format("dddd, MMM D")
|
|
2527
|
-
}, undefined, false, undefined, this),
|
|
2528
|
-
isToday && /* @__PURE__ */ jsx_dev_runtime42.jsxDEV("span", {
|
|
2529
|
-
className: "bg-primary text-primary-foreground rounded-sm px-1 text-xs",
|
|
2530
|
-
children: "Today"
|
|
2531
|
-
}, undefined, false, undefined, this)
|
|
2532
|
-
]
|
|
2533
|
-
}, undefined, true, undefined, this)
|
|
2534
|
-
}, dayDate.format("YYYY-MM-DD"), false, undefined, this);
|
|
2535
|
-
});
|
|
2536
|
-
})()
|
|
2537
|
-
}, undefined, false, undefined, this)
|
|
2538
|
-
}, undefined, false, undefined, this)
|
|
2539
|
-
]
|
|
2540
|
-
}, undefined, true, undefined, this)
|
|
2541
|
-
]
|
|
2542
|
-
}, undefined, true, undefined, this);
|
|
2543
|
-
};
|
|
2544
|
-
var title_content_default = TitleContent;
|
|
2545
|
-
|
|
2546
|
-
// src/components/header/view-controls.tsx
|
|
2547
|
-
var import_lucide_react10 = require("lucide-react");
|
|
2548
|
-
var jsx_dev_runtime43 = require("react/jsx-dev-runtime");
|
|
2549
|
-
var ViewControls = ({
|
|
2550
|
-
currentView,
|
|
2551
|
-
onChange,
|
|
2552
|
-
variant = "default",
|
|
2553
|
-
size = "sm",
|
|
2554
|
-
className,
|
|
2555
|
-
onToday,
|
|
2556
|
-
onNext,
|
|
2557
|
-
onPrevious
|
|
2558
|
-
}) => {
|
|
2559
|
-
const isGrid = variant === "grid";
|
|
2560
|
-
const getButtonClassName = (viewType) => {
|
|
2561
|
-
return cn(isGrid ? "w-full" : "", viewType === "year" ? isGrid ? "w-full" : "hidden md:inline-flex" : "", currentView === viewType && "bg-primary/80");
|
|
2562
|
-
};
|
|
2563
|
-
const getBtnVariant = (viewType) => {
|
|
2564
|
-
return currentView === viewType ? "default" : "outline";
|
|
2565
|
-
};
|
|
2566
|
-
return /* @__PURE__ */ jsx_dev_runtime43.jsxDEV("div", {
|
|
2567
|
-
className: cn(isGrid ? "grid grid-cols-2 gap-2" : "flex gap-1", className),
|
|
2568
|
-
children: [
|
|
2569
|
-
/* @__PURE__ */ jsx_dev_runtime43.jsxDEV(Button, {
|
|
2570
|
-
onClick: onPrevious,
|
|
2571
|
-
variant: "outline",
|
|
2572
|
-
size,
|
|
2573
|
-
children: /* @__PURE__ */ jsx_dev_runtime43.jsxDEV(import_lucide_react10.ChevronLeft, {
|
|
2574
|
-
className: "h-4 w-4"
|
|
2575
|
-
}, undefined, false, undefined, this)
|
|
2576
|
-
}, undefined, false, undefined, this),
|
|
2577
|
-
/* @__PURE__ */ jsx_dev_runtime43.jsxDEV(Button, {
|
|
2578
|
-
onClick: onNext,
|
|
2579
|
-
variant: "outline",
|
|
2580
|
-
size,
|
|
2581
|
-
children: /* @__PURE__ */ jsx_dev_runtime43.jsxDEV(import_lucide_react10.ChevronRight, {
|
|
2582
|
-
className: "h-4 w-4"
|
|
2583
|
-
}, undefined, false, undefined, this)
|
|
2584
|
-
}, undefined, false, undefined, this),
|
|
2585
|
-
/* @__PURE__ */ jsx_dev_runtime43.jsxDEV(Button, {
|
|
2586
|
-
onClick: () => onChange("day"),
|
|
2587
|
-
variant: getBtnVariant("day"),
|
|
2588
|
-
size,
|
|
2589
|
-
className: getButtonClassName("day"),
|
|
2590
|
-
children: "Day"
|
|
2591
|
-
}, undefined, false, undefined, this),
|
|
2592
|
-
/* @__PURE__ */ jsx_dev_runtime43.jsxDEV(Button, {
|
|
2593
|
-
onClick: () => onChange("week"),
|
|
2594
|
-
variant: getBtnVariant("week"),
|
|
2595
|
-
size,
|
|
2596
|
-
className: getButtonClassName("week"),
|
|
2597
|
-
children: "Week"
|
|
2598
|
-
}, undefined, false, undefined, this),
|
|
2599
|
-
/* @__PURE__ */ jsx_dev_runtime43.jsxDEV(Button, {
|
|
2600
|
-
onClick: () => onChange("month"),
|
|
2601
|
-
variant: getBtnVariant("month"),
|
|
2602
|
-
size,
|
|
2603
|
-
className: getButtonClassName("month"),
|
|
2604
|
-
children: "Month"
|
|
2605
|
-
}, undefined, false, undefined, this),
|
|
2606
|
-
/* @__PURE__ */ jsx_dev_runtime43.jsxDEV(Button, {
|
|
2607
|
-
onClick: () => onChange("year"),
|
|
2608
|
-
variant: getBtnVariant("year"),
|
|
2609
|
-
size,
|
|
2610
|
-
className: getButtonClassName("year"),
|
|
2611
|
-
children: "Year"
|
|
2612
|
-
}, undefined, false, undefined, this),
|
|
2613
|
-
/* @__PURE__ */ jsx_dev_runtime43.jsxDEV(Button, {
|
|
2614
|
-
onClick: onToday,
|
|
2615
|
-
variant: "outline",
|
|
2616
|
-
size,
|
|
2617
|
-
children: "Today"
|
|
2618
|
-
}, undefined, false, undefined, this)
|
|
2619
|
-
]
|
|
2620
|
-
}, undefined, true, undefined, this);
|
|
2621
|
-
};
|
|
2622
|
-
var view_controls_default = ViewControls;
|
|
2623
|
-
|
|
2624
|
-
// src/components/header/base-header.tsx
|
|
2625
|
-
var jsx_dev_runtime44 = require("react/jsx-dev-runtime");
|
|
2626
|
-
var Header2 = () => {
|
|
2627
|
-
const {
|
|
2628
|
-
currentDate,
|
|
2629
|
-
view,
|
|
2630
|
-
setView,
|
|
2631
|
-
nextPeriod,
|
|
2632
|
-
prevPeriod,
|
|
2633
|
-
today,
|
|
2634
|
-
openEventForm
|
|
2635
|
-
} = useCalendarContext();
|
|
2636
|
-
const [mobilePopoverOpen, setMobilePopoverOpen] = import_react21.useState(false);
|
|
2637
|
-
const handleViewChange = (newView, closePopover = false) => {
|
|
2638
|
-
setView(newView);
|
|
2639
|
-
if (closePopover) {
|
|
2640
|
-
setMobilePopoverOpen(false);
|
|
2641
|
-
}
|
|
2642
|
-
};
|
|
2643
|
-
const handleNavigation = {
|
|
2644
|
-
today: () => {
|
|
2645
|
-
today();
|
|
2646
|
-
setMobilePopoverOpen(false);
|
|
2647
|
-
},
|
|
2648
|
-
previous: () => {
|
|
2649
|
-
prevPeriod();
|
|
2650
|
-
setMobilePopoverOpen(false);
|
|
2651
|
-
},
|
|
2652
|
-
next: () => {
|
|
2653
|
-
nextPeriod();
|
|
2654
|
-
setMobilePopoverOpen(false);
|
|
2655
|
-
}
|
|
2656
|
-
};
|
|
2657
|
-
const NewEventButton = import_react21.useCallback(() => /* @__PURE__ */ jsx_dev_runtime44.jsxDEV("div", {
|
|
2658
|
-
className: "flex items-center gap-2",
|
|
2659
|
-
children: /* @__PURE__ */ jsx_dev_runtime44.jsxDEV(Button, {
|
|
2660
|
-
onClick: () => openEventForm(currentDate),
|
|
2661
|
-
variant: "default",
|
|
2662
|
-
size: "sm",
|
|
2663
|
-
className: "flex items-center gap-1",
|
|
2664
|
-
children: [
|
|
2665
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV(import_lucide_react11.Plus, {
|
|
2666
|
-
className: "h-4 w-4"
|
|
2667
|
-
}, undefined, false, undefined, this),
|
|
2668
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV("span", {
|
|
2669
|
-
className: "hidden md:inline",
|
|
2670
|
-
children: "New Event"
|
|
2671
|
-
}, undefined, false, undefined, this),
|
|
2672
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV("span", {
|
|
2673
|
-
className: "md:hidden",
|
|
2674
|
-
children: "New"
|
|
2675
|
-
}, undefined, false, undefined, this)
|
|
2676
|
-
]
|
|
2677
|
-
}, undefined, true, undefined, this)
|
|
2678
|
-
}, undefined, false, undefined, this), [currentDate, openEventForm]);
|
|
2679
|
-
return /* @__PURE__ */ jsx_dev_runtime44.jsxDEV(jsx_dev_runtime44.Fragment, {
|
|
2680
|
-
children: /* @__PURE__ */ jsx_dev_runtime44.jsxDEV("div", {
|
|
2681
|
-
className: "@container grid grid-cols-12 items-center gap-2 border-b p-2 sm:p-4",
|
|
2682
|
-
children: [
|
|
2683
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV("div", {
|
|
2684
|
-
className: "col-span-12 flex flex-wrap items-center justify-center gap-2 @4xl:col-span-5 @4xl:justify-start",
|
|
2685
|
-
children: [
|
|
2686
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV(import_lucide_react11.Calendar, {
|
|
2687
|
-
className: "h-5 w-5"
|
|
2688
|
-
}, undefined, false, undefined, this),
|
|
2689
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV(title_content_default, {}, undefined, false, undefined, this)
|
|
2690
|
-
]
|
|
2691
|
-
}, undefined, true, undefined, this),
|
|
2692
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV("div", {
|
|
2693
|
-
className: "col-span-12 flex flex-wrap justify-center gap-1 @4xl:col-span-7 @4xl:justify-end",
|
|
2694
|
-
children: [
|
|
2695
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV("div", {
|
|
2696
|
-
className: "hidden items-center justify-end gap-1 sm:flex",
|
|
2697
|
-
children: [
|
|
2698
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV(view_controls_default, {
|
|
2699
|
-
currentView: view,
|
|
2700
|
-
onChange: setView,
|
|
2701
|
-
onToday: today,
|
|
2702
|
-
onNext: nextPeriod,
|
|
2703
|
-
onPrevious: prevPeriod,
|
|
2704
|
-
variant: "default",
|
|
2705
|
-
className: "justify-end"
|
|
2706
|
-
}, undefined, false, undefined, this),
|
|
2707
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV(NewEventButton, {}, undefined, false, undefined, this)
|
|
2708
|
-
]
|
|
2709
|
-
}, undefined, true, undefined, this),
|
|
2710
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV("div", {
|
|
2711
|
-
className: "flex items-center justify-end gap-1 sm:hidden",
|
|
2712
|
-
children: [
|
|
2713
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV(NewEventButton, {}, undefined, false, undefined, this),
|
|
2714
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV(Popover, {
|
|
2715
|
-
open: mobilePopoverOpen,
|
|
2716
|
-
onOpenChange: setMobilePopoverOpen,
|
|
2717
|
-
children: [
|
|
2718
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV(PopoverTrigger, {
|
|
2719
|
-
asChild: true,
|
|
2720
|
-
children: /* @__PURE__ */ jsx_dev_runtime44.jsxDEV(Button, {
|
|
2721
|
-
variant: "outline",
|
|
2722
|
-
size: "sm",
|
|
2723
|
-
children: /* @__PURE__ */ jsx_dev_runtime44.jsxDEV(import_lucide_react11.Menu, {
|
|
2724
|
-
className: "h-4 w-4"
|
|
2725
|
-
}, undefined, false, undefined, this)
|
|
2726
|
-
}, undefined, false, undefined, this)
|
|
2727
|
-
}, undefined, false, undefined, this),
|
|
2728
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV(PopoverContent, {
|
|
2729
|
-
align: "end",
|
|
2730
|
-
className: "w-[240px] p-2",
|
|
2731
|
-
children: /* @__PURE__ */ jsx_dev_runtime44.jsxDEV("div", {
|
|
2732
|
-
className: "space-y-2",
|
|
2733
|
-
children: [
|
|
2734
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV("h3", {
|
|
2735
|
-
className: "mb-1 text-sm font-medium",
|
|
2736
|
-
children: "View & Navigation"
|
|
2737
|
-
}, undefined, false, undefined, this),
|
|
2738
|
-
/* @__PURE__ */ jsx_dev_runtime44.jsxDEV(view_controls_default, {
|
|
2739
|
-
currentView: view,
|
|
2740
|
-
onChange: (newView) => handleViewChange(newView, true),
|
|
2741
|
-
onToday: handleNavigation.today,
|
|
2742
|
-
onNext: handleNavigation.next,
|
|
2743
|
-
onPrevious: handleNavigation.previous,
|
|
2744
|
-
variant: "grid"
|
|
2745
|
-
}, undefined, false, undefined, this)
|
|
2746
|
-
]
|
|
2747
|
-
}, undefined, true, undefined, this)
|
|
2748
|
-
}, undefined, false, undefined, this)
|
|
2749
|
-
]
|
|
2750
|
-
}, undefined, true, undefined, this)
|
|
2751
|
-
]
|
|
2752
|
-
}, undefined, true, undefined, this)
|
|
2753
|
-
]
|
|
2754
|
-
}, undefined, true, undefined, this)
|
|
2755
|
-
]
|
|
2756
|
-
}, undefined, true, undefined, this)
|
|
2757
|
-
}, undefined, false, undefined, this);
|
|
2758
|
-
};
|
|
2759
|
-
var base_header_default = Header2;
|
|
2760
|
-
// src/features/year-view/year-view.tsx
|
|
2761
|
-
var import_react22 = require("motion/react");
|
|
2762
|
-
var jsx_dev_runtime45 = require("react/jsx-dev-runtime");
|
|
2763
|
-
var YearView = () => {
|
|
2764
|
-
const { currentDate, selectDate, events, setView, getEventsForDate } = useCalendarContext();
|
|
2765
|
-
const year = currentDate.year();
|
|
2766
|
-
const months2 = Array.from({ length: 12 }, (_, i) => {
|
|
2767
|
-
const monthDate = dayjs_config_default().year(year).month(i).startOf("month");
|
|
2768
|
-
return {
|
|
2769
|
-
date: monthDate,
|
|
2770
|
-
name: monthDate.format("MMMM"),
|
|
2771
|
-
daysInMonth: monthDate.daysInMonth(),
|
|
2772
|
-
firstDayOfMonth: monthDate.startOf("month").day()
|
|
2773
|
-
};
|
|
2774
|
-
});
|
|
2775
|
-
const monthsWithEventCount = months2.map((month) => {
|
|
2776
|
-
const eventsInMonth = events.filter((event) => event.start.year() === year && event.start.month() === month.date.month());
|
|
2777
|
-
return {
|
|
2778
|
-
...month,
|
|
2779
|
-
eventCount: eventsInMonth.length
|
|
2780
|
-
};
|
|
2781
|
-
});
|
|
2782
|
-
const handleMonthClick = (date) => {
|
|
2783
|
-
selectDate(date);
|
|
2784
|
-
setView("month");
|
|
2785
|
-
};
|
|
2786
|
-
const handleDayClick = (date, event) => {
|
|
2787
|
-
event.stopPropagation();
|
|
2788
|
-
selectDate(date);
|
|
2789
|
-
setView("day");
|
|
2790
|
-
};
|
|
2791
|
-
const renderMiniCalendar = (month) => {
|
|
2792
|
-
const firstDayOfCalendar = month.date.startOf("month").startOf("week");
|
|
2793
|
-
const daysArray = Array.from({ length: 42 }, (_, i) => {
|
|
2794
|
-
const day = firstDayOfCalendar.add(i, "day");
|
|
2795
|
-
const isCurrentMonth = day.month() === month.date.month();
|
|
2796
|
-
const isToday = day.isSame(dayjs_config_default(), "day");
|
|
2797
|
-
const isCurrentDate = day.isSame(currentDate, "day");
|
|
2798
|
-
const dayEvents = getEventsForDate(day);
|
|
2799
|
-
const hasEvents = dayEvents.length > 0;
|
|
2800
|
-
return {
|
|
2801
|
-
day,
|
|
2802
|
-
isCurrentMonth,
|
|
2803
|
-
isToday,
|
|
2804
|
-
isCurrentDate,
|
|
2805
|
-
hasEvents,
|
|
2806
|
-
eventCount: dayEvents.length,
|
|
2807
|
-
events: dayEvents
|
|
2808
|
-
};
|
|
2809
|
-
});
|
|
2810
|
-
return /* @__PURE__ */ jsx_dev_runtime45.jsxDEV("div", {
|
|
2811
|
-
"data-testid": `year-mini-calendar-${month.date.format("MM")}`,
|
|
2812
|
-
className: "grid grid-cols-7 gap-[1px] text-[0.6rem]",
|
|
2813
|
-
children: [
|
|
2814
|
-
["S", "M", "T", "W", "T", "F", "S"].map((dayName, i) => /* @__PURE__ */ jsx_dev_runtime45.jsxDEV("div", {
|
|
2815
|
-
className: "text-muted-foreground h-3 text-center",
|
|
2816
|
-
children: dayName
|
|
2817
|
-
}, `header-${i}`, false, undefined, this)),
|
|
2818
|
-
daysArray.map((dayInfo, i) => /* @__PURE__ */ jsx_dev_runtime45.jsxDEV("div", {
|
|
2819
|
-
"data-testid": `year-day-${dayInfo.day.format("YYYY-MM-DD")}`,
|
|
2820
|
-
onClick: (e) => handleDayClick(dayInfo.day, e),
|
|
2821
|
-
className: cn("relative flex aspect-square w-full cursor-pointer flex-col items-center justify-center", "hover:bg-accent rounded-sm transition-colors duration-200", !dayInfo.isCurrentMonth && "text-muted-foreground opacity-50", dayInfo.isToday && "bg-primary text-primary-foreground rounded-full", dayInfo.isCurrentDate && !dayInfo.isToday && "bg-muted rounded-full font-bold", dayInfo.hasEvents && !dayInfo.isToday && !dayInfo.isCurrentDate && "font-medium"),
|
|
2822
|
-
title: dayInfo.hasEvents ? `${dayInfo.eventCount} event${dayInfo.eventCount > 1 ? "s" : ""}` : "",
|
|
2823
|
-
children: [
|
|
2824
|
-
/* @__PURE__ */ jsx_dev_runtime45.jsxDEV("span", {
|
|
2825
|
-
className: "text-center leading-none",
|
|
2826
|
-
children: dayInfo.day.date()
|
|
2827
|
-
}, undefined, false, undefined, this),
|
|
2828
|
-
dayInfo.hasEvents && /* @__PURE__ */ jsx_dev_runtime45.jsxDEV("div", {
|
|
2829
|
-
className: cn("absolute bottom-0 flex w-full justify-center space-x-[1px]", dayInfo.isToday ? "bottom-[1px]" : ""),
|
|
2830
|
-
children: [
|
|
2831
|
-
dayInfo.eventCount > 0 && /* @__PURE__ */ jsx_dev_runtime45.jsxDEV("span", {
|
|
2832
|
-
className: cn("h-[3px] w-[3px] rounded-full", dayInfo.isToday ? "bg-primary-foreground" : "bg-primary")
|
|
2833
|
-
}, undefined, false, undefined, this),
|
|
2834
|
-
dayInfo.eventCount > 1 && /* @__PURE__ */ jsx_dev_runtime45.jsxDEV("span", {
|
|
2835
|
-
className: cn("h-[3px] w-[3px] rounded-full", dayInfo.isToday ? "bg-primary-foreground" : "bg-blue-500")
|
|
2836
|
-
}, undefined, false, undefined, this),
|
|
2837
|
-
dayInfo.eventCount > 2 && /* @__PURE__ */ jsx_dev_runtime45.jsxDEV("span", {
|
|
2838
|
-
className: cn("h-[3px] w-[3px] rounded-full", dayInfo.isToday ? "bg-primary-foreground" : "bg-green-500")
|
|
2839
|
-
}, undefined, false, undefined, this)
|
|
2840
|
-
]
|
|
2841
|
-
}, undefined, true, undefined, this)
|
|
2842
|
-
]
|
|
2843
|
-
}, `day-${i}`, true, undefined, this))
|
|
2844
|
-
]
|
|
2845
|
-
}, undefined, true, undefined, this);
|
|
2846
|
-
};
|
|
2847
|
-
return /* @__PURE__ */ jsx_dev_runtime45.jsxDEV(ScrollArea, {
|
|
2848
|
-
"data-testid": "year-view",
|
|
2849
|
-
className: "h-full",
|
|
2850
|
-
children: /* @__PURE__ */ jsx_dev_runtime45.jsxDEV("div", {
|
|
2851
|
-
"data-testid": "year-grid",
|
|
2852
|
-
className: "grid auto-rows-fr grid-cols-1 gap-4 p-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
2853
|
-
children: monthsWithEventCount.map((month, index) => /* @__PURE__ */ jsx_dev_runtime45.jsxDEV("div", {
|
|
2854
|
-
"data-testid": `year-month-${month.date.format("MM")}`,
|
|
2855
|
-
onClick: () => handleMonthClick(month.date),
|
|
2856
|
-
className: "hover:border-primary flex cursor-pointer flex-col rounded-lg border p-3 transition-all duration-200 hover:scale-[1.01] hover:shadow-md",
|
|
2857
|
-
children: [
|
|
2858
|
-
/* @__PURE__ */ jsx_dev_runtime45.jsxDEV(import_react22.AnimatePresence, {
|
|
2859
|
-
mode: "wait",
|
|
2860
|
-
children: /* @__PURE__ */ jsx_dev_runtime45.jsxDEV(import_react22.motion.div, {
|
|
2861
|
-
initial: { opacity: 0, y: -10 },
|
|
2862
|
-
animate: { opacity: 1, y: 0 },
|
|
2863
|
-
exit: { opacity: 0, y: -10 },
|
|
2864
|
-
transition: {
|
|
2865
|
-
duration: 0.25,
|
|
2866
|
-
ease: "easeInOut",
|
|
2867
|
-
delay: index * 0.05
|
|
2868
|
-
},
|
|
2869
|
-
className: "mb-2 flex items-center justify-between",
|
|
2870
|
-
children: [
|
|
2871
|
-
/* @__PURE__ */ jsx_dev_runtime45.jsxDEV("h3", {
|
|
2872
|
-
"data-testid": `year-month-title-${month.date.format("MM")}`,
|
|
2873
|
-
className: "text-lg font-medium",
|
|
2874
|
-
children: month.name
|
|
2875
|
-
}, undefined, false, undefined, this),
|
|
2876
|
-
month.eventCount > 0 && /* @__PURE__ */ jsx_dev_runtime45.jsxDEV("span", {
|
|
2877
|
-
"data-testid": `year-month-event-count-${month.date.format("MM")}`,
|
|
2878
|
-
className: "bg-primary text-primary-foreground rounded-full px-2 py-1 text-xs",
|
|
2879
|
-
children: [
|
|
2880
|
-
month.eventCount,
|
|
2881
|
-
" ",
|
|
2882
|
-
month.eventCount === 1 ? "event" : "events"
|
|
2883
|
-
]
|
|
2884
|
-
}, undefined, true, undefined, this)
|
|
2885
|
-
]
|
|
2886
|
-
}, `month-${index}`, true, undefined, this)
|
|
2887
|
-
}, undefined, false, undefined, this),
|
|
2888
|
-
renderMiniCalendar(month)
|
|
2889
|
-
]
|
|
2890
|
-
}, month.name, true, undefined, this))
|
|
2891
|
-
}, undefined, false, undefined, this)
|
|
2892
|
-
}, undefined, false, undefined, this);
|
|
2893
|
-
};
|
|
2894
|
-
var year_view_default = YearView;
|
|
2895
|
-
|
|
2896
|
-
// src/components/ilamy-calendar/ilamy-calendar.tsx
|
|
2897
|
-
var import_react25 = require("motion/react");
|
|
2898
|
-
|
|
2899
|
-
// src/features/drag-and-drop/calendar-dnd-context.tsx
|
|
2900
|
-
var import_core3 = require("@dnd-kit/core");
|
|
2901
|
-
var import_react23 = __toESM(require("react"));
|
|
2902
|
-
var import_modifiers = require("@dnd-kit/modifiers");
|
|
2903
|
-
var jsx_dev_runtime46 = require("react/jsx-dev-runtime");
|
|
2904
|
-
function CalendarDndContext({ children }) {
|
|
2905
|
-
const { updateEvent, view, disableDragAndDrop } = useCalendarContext();
|
|
2906
|
-
const [activeEvent, setActiveEvent] = import_react23.default.useState(null);
|
|
2907
|
-
const mouseSensor = import_core3.useSensor(import_core3.MouseSensor, {
|
|
2908
|
-
activationConstraint: {
|
|
2909
|
-
distance: 2
|
|
2910
|
-
}
|
|
2911
|
-
});
|
|
2912
|
-
const touchSensor = import_core3.useSensor(import_core3.TouchSensor, {
|
|
2913
|
-
activationConstraint: {
|
|
2914
|
-
delay: 100,
|
|
2915
|
-
tolerance: 5
|
|
2916
|
-
}
|
|
2917
|
-
});
|
|
2918
|
-
const sensors = import_core3.useSensors(mouseSensor, touchSensor);
|
|
2919
|
-
const handleDragStart = (event) => {
|
|
2920
|
-
const { active } = event;
|
|
2921
|
-
if (active.data.current?.type === "calendar-event") {
|
|
2922
|
-
setActiveEvent(active.data.current.event);
|
|
2923
|
-
}
|
|
2924
|
-
};
|
|
2925
|
-
const handleDragEnd = (event) => {
|
|
2926
|
-
const { active, over } = event;
|
|
2927
|
-
if (!active || !over || !activeEvent) {
|
|
2928
|
-
setActiveEvent(null);
|
|
2929
|
-
return;
|
|
2930
|
-
}
|
|
2931
|
-
if (over.data.current?.type === "time-cell") {
|
|
2932
|
-
const { date, hour = 0, minute = 0 } = over.data.current;
|
|
2933
|
-
const originalStart = activeEvent.originalStart ?? activeEvent.start;
|
|
2934
|
-
const originalEnd = activeEvent.originalEnd ?? activeEvent.end;
|
|
2935
|
-
const durationMinutes = originalEnd.diff(originalStart, "minute");
|
|
2936
|
-
const newStart = dayjs_config_default(date).hour(hour).minute(minute || 0);
|
|
2937
|
-
let newEnd = newStart.add(durationMinutes, "minute");
|
|
2938
|
-
if (newEnd.isSame(newEnd.startOf("day"))) {
|
|
2939
|
-
newEnd = newEnd.subtract(1, "day").endOf("day");
|
|
2940
|
-
}
|
|
2941
|
-
updateEvent(activeEvent.id, {
|
|
2942
|
-
start: newStart,
|
|
2943
|
-
end: newEnd
|
|
2944
|
-
});
|
|
2945
|
-
} else if (over.data.current?.type === "day-cell") {
|
|
2946
|
-
const { date } = over.data.current;
|
|
2947
|
-
const newDate = dayjs_config_default(date);
|
|
2948
|
-
const isMultiDayEvent = !activeEvent.start.isSame(activeEvent.end, "day");
|
|
2949
|
-
const originalStart = activeEvent.originalStart ?? activeEvent.start;
|
|
2950
|
-
const originalEnd = activeEvent.originalEnd ?? activeEvent.end;
|
|
2951
|
-
if (isMultiDayEvent) {
|
|
2952
|
-
if (view === "week") {
|
|
2953
|
-
const startHour = originalStart.hour();
|
|
2954
|
-
const startMinute = originalStart.minute();
|
|
2955
|
-
const endHour = originalEnd.hour();
|
|
2956
|
-
const endMinute = originalEnd.minute();
|
|
2957
|
-
const durationDays = originalEnd.diff(originalStart, "day");
|
|
2958
|
-
const newStart = newDate.startOf("day").hour(startHour).minute(startMinute);
|
|
2959
|
-
const newEnd = newStart.add(durationDays, "day").hour(endHour).minute(endMinute);
|
|
2960
|
-
updateEvent(activeEvent.id, {
|
|
2961
|
-
start: newStart,
|
|
2962
|
-
end: newEnd,
|
|
2963
|
-
originalStart: undefined,
|
|
2964
|
-
originalEnd: undefined
|
|
2965
|
-
});
|
|
2966
|
-
} else {
|
|
2967
|
-
const daysDifference = newDate.diff(originalStart.startOf("day"), "day");
|
|
2968
|
-
const newStart = originalStart.add(daysDifference, "day");
|
|
2969
|
-
const newEnd = originalEnd.add(daysDifference, "day");
|
|
2970
|
-
updateEvent(activeEvent.id, {
|
|
2971
|
-
start: newStart,
|
|
2972
|
-
end: newEnd,
|
|
2973
|
-
originalStart: undefined,
|
|
2974
|
-
originalEnd: undefined
|
|
2975
|
-
});
|
|
2976
|
-
}
|
|
2977
|
-
} else {
|
|
2978
|
-
const newStart = newDate.hour(activeEvent.start.hour()).minute(activeEvent.start.minute());
|
|
2979
|
-
const durationMinutes = activeEvent.end.diff(activeEvent.start, "minute");
|
|
2980
|
-
const newEnd = newStart.add(durationMinutes, "minute");
|
|
2981
|
-
updateEvent(activeEvent.id, {
|
|
2982
|
-
start: newStart,
|
|
2983
|
-
end: newEnd,
|
|
2984
|
-
originalStart: undefined,
|
|
2985
|
-
originalEnd: undefined
|
|
2986
|
-
});
|
|
2987
|
-
}
|
|
2988
|
-
}
|
|
2989
|
-
setActiveEvent(null);
|
|
2990
|
-
};
|
|
2991
|
-
const handleDragCancel = (_event) => {
|
|
2992
|
-
setActiveEvent(null);
|
|
2993
|
-
};
|
|
2994
|
-
if (disableDragAndDrop) {
|
|
2995
|
-
return children;
|
|
2996
|
-
}
|
|
2997
|
-
return /* @__PURE__ */ jsx_dev_runtime46.jsxDEV(import_core3.DndContext, {
|
|
2998
|
-
sensors,
|
|
2999
|
-
onDragStart: handleDragStart,
|
|
3000
|
-
onDragEnd: handleDragEnd,
|
|
3001
|
-
onDragCancel: handleDragCancel,
|
|
3002
|
-
collisionDetection: import_core3.pointerWithin,
|
|
3003
|
-
children: [
|
|
3004
|
-
children,
|
|
3005
|
-
/* @__PURE__ */ jsx_dev_runtime46.jsxDEV(import_core3.DragOverlay, {
|
|
3006
|
-
modifiers: [import_modifiers.snapCenterToCursor],
|
|
3007
|
-
children: activeEvent && /* @__PURE__ */ jsx_dev_runtime46.jsxDEV("div", {
|
|
3008
|
-
className: cn("cursor-grab truncate rounded bg-amber-200 p-2 text-[10px] shadow-lg sm:text-xs", activeEvent.backgroundColor || "bg-blue-500", activeEvent.color || "text-white"),
|
|
3009
|
-
children: activeEvent?.title
|
|
3010
|
-
}, undefined, false, undefined, this)
|
|
3011
|
-
}, undefined, false, undefined, this)
|
|
3012
|
-
]
|
|
3013
|
-
}, undefined, true, undefined, this);
|
|
3014
|
-
}
|
|
3015
|
-
|
|
3016
|
-
// src/contexts/calendar-context/provider.tsx
|
|
3017
|
-
var import_react24 = require("react");
|
|
3018
|
-
var jsx_dev_runtime47 = require("react/jsx-dev-runtime");
|
|
3019
|
-
var CalendarProvider = ({
|
|
3020
|
-
children,
|
|
3021
|
-
events = [],
|
|
3022
|
-
firstDayOfWeek = 0,
|
|
3023
|
-
renderEvent,
|
|
3024
|
-
onEventClick,
|
|
3025
|
-
onCellClick,
|
|
3026
|
-
onViewChange,
|
|
3027
|
-
locale,
|
|
3028
|
-
timezone: timezone2,
|
|
3029
|
-
disableCellClick,
|
|
3030
|
-
disableEventClick,
|
|
3031
|
-
disableDragAndDrop,
|
|
3032
|
-
dayMaxEvents,
|
|
3033
|
-
stickyViewHeader,
|
|
3034
|
-
viewHeaderClassName
|
|
3035
|
-
}) => {
|
|
3036
|
-
const [currentDate, setCurrentDate] = import_react24.useState(dayjs_config_default());
|
|
3037
|
-
const [view, setView] = import_react24.useState("month");
|
|
3038
|
-
const [currentEvents, setCurrentEvents] = import_react24.useState(events);
|
|
3039
|
-
const [isEventFormOpen, setIsEventFormOpen] = import_react24.useState(false);
|
|
3040
|
-
const [selectedEvent, setSelectedEvent] = import_react24.useState(null);
|
|
3041
|
-
const [selectedDate, setSelectedDate] = import_react24.useState(null);
|
|
3042
|
-
const [currentLocale, setCurrentLocale] = import_react24.useState(locale || "en");
|
|
3043
|
-
const [currentTimezone, setCurrentTimezone] = import_react24.useState(timezone2 || "");
|
|
3044
|
-
import_react24.useEffect(() => {
|
|
3045
|
-
if (events) {
|
|
3046
|
-
setCurrentEvents(events);
|
|
3047
|
-
}
|
|
3048
|
-
}, [events]);
|
|
3049
|
-
import_react24.useEffect(() => {
|
|
3050
|
-
if (locale) {
|
|
3051
|
-
setCurrentLocale(locale);
|
|
3052
|
-
dayjs_config_default.locale(locale);
|
|
3053
|
-
}
|
|
3054
|
-
}, [locale]);
|
|
3055
|
-
import_react24.useEffect(() => {
|
|
3056
|
-
if (timezone2) {
|
|
3057
|
-
setCurrentTimezone(timezone2);
|
|
3058
|
-
dayjs_config_default.tz.setDefault(timezone2);
|
|
3059
|
-
}
|
|
3060
|
-
}, [timezone2]);
|
|
3061
|
-
const selectDate = import_react24.useCallback((date) => {
|
|
3062
|
-
setCurrentDate(date);
|
|
3063
|
-
}, []);
|
|
3064
|
-
const nextPeriod = import_react24.useCallback(() => {
|
|
3065
|
-
switch (view) {
|
|
3066
|
-
case "month":
|
|
3067
|
-
setCurrentDate((currentDate2) => currentDate2.add(1, "month"));
|
|
3068
|
-
break;
|
|
3069
|
-
case "week":
|
|
3070
|
-
setCurrentDate((currentDate2) => currentDate2.add(1, "week"));
|
|
3071
|
-
break;
|
|
3072
|
-
case "day":
|
|
3073
|
-
setCurrentDate((currentDate2) => currentDate2.add(1, "day"));
|
|
3074
|
-
break;
|
|
3075
|
-
case "year":
|
|
3076
|
-
setCurrentDate((currentDate2) => currentDate2.add(1, "year"));
|
|
3077
|
-
break;
|
|
3078
|
-
}
|
|
3079
|
-
}, [view]);
|
|
3080
|
-
const prevPeriod = import_react24.useCallback(() => {
|
|
3081
|
-
switch (view) {
|
|
3082
|
-
case "month":
|
|
3083
|
-
setCurrentDate((currentDate2) => currentDate2.subtract(1, "month"));
|
|
3084
|
-
break;
|
|
3085
|
-
case "week":
|
|
3086
|
-
setCurrentDate((currentDate2) => currentDate2.subtract(1, "week"));
|
|
3087
|
-
break;
|
|
3088
|
-
case "day":
|
|
3089
|
-
setCurrentDate((currentDate2) => currentDate2.subtract(1, "day"));
|
|
3090
|
-
break;
|
|
3091
|
-
case "year":
|
|
3092
|
-
setCurrentDate((currentDate2) => currentDate2.subtract(1, "year"));
|
|
3093
|
-
break;
|
|
3094
|
-
}
|
|
3095
|
-
}, [view]);
|
|
3096
|
-
const today = import_react24.useCallback(() => {
|
|
3097
|
-
setCurrentDate(dayjs_config_default());
|
|
3098
|
-
}, []);
|
|
3099
|
-
const addEvent = import_react24.useCallback((event) => {
|
|
3100
|
-
setCurrentEvents((prevEvents) => [...prevEvents, event]);
|
|
3101
|
-
}, []);
|
|
3102
|
-
const updateEvent = import_react24.useCallback((eventId, updatedEvent) => {
|
|
3103
|
-
setCurrentEvents((prevEvents) => prevEvents.map((event) => event.id === eventId ? { ...event, ...updatedEvent } : event));
|
|
3104
|
-
}, []);
|
|
3105
|
-
const deleteEvent = import_react24.useCallback((eventId) => {
|
|
3106
|
-
setCurrentEvents((prevEvents) => prevEvents.filter((event) => event.id !== eventId));
|
|
3107
|
-
}, []);
|
|
3108
|
-
const editEvent = import_react24.useCallback((event) => {
|
|
3109
|
-
setSelectedEvent(event);
|
|
3110
|
-
setIsEventFormOpen(true);
|
|
3111
|
-
}, []);
|
|
3112
|
-
const closeEventForm = import_react24.useCallback(() => {
|
|
3113
|
-
setSelectedDate(null);
|
|
3114
|
-
setSelectedEvent(null);
|
|
3115
|
-
setIsEventFormOpen(false);
|
|
3116
|
-
}, []);
|
|
3117
|
-
const handleViewChange = import_react24.useCallback((newView) => {
|
|
3118
|
-
setView(newView);
|
|
3119
|
-
onViewChange?.(newView);
|
|
3120
|
-
}, [onViewChange]);
|
|
3121
|
-
const handleEventClick = import_react24.useCallback((event) => {
|
|
3122
|
-
if (disableCellClick)
|
|
3123
|
-
return;
|
|
3124
|
-
if (onEventClick) {
|
|
3125
|
-
onEventClick(event);
|
|
3126
|
-
} else {
|
|
3127
|
-
editEvent(event);
|
|
3128
|
-
}
|
|
3129
|
-
}, [disableCellClick, onEventClick, editEvent]);
|
|
3130
|
-
const handleDateClick = import_react24.useCallback((startDate, endDate) => {
|
|
3131
|
-
if (disableCellClick)
|
|
3132
|
-
return;
|
|
3133
|
-
if (onCellClick) {
|
|
3134
|
-
onCellClick(startDate, endDate);
|
|
3135
|
-
} else {
|
|
3136
|
-
setSelectedDate(startDate);
|
|
3137
|
-
setSelectedEvent({
|
|
3138
|
-
title: `New Event`,
|
|
3139
|
-
start: startDate,
|
|
3140
|
-
end: endDate,
|
|
3141
|
-
description: "",
|
|
3142
|
-
allDay: false,
|
|
3143
|
-
isRecurring: false,
|
|
3144
|
-
recurrence: null,
|
|
3145
|
-
parentEventId: null
|
|
3146
|
-
});
|
|
3147
|
-
setIsEventFormOpen(true);
|
|
3148
|
-
}
|
|
3149
|
-
}, [onCellClick, disableCellClick]);
|
|
3150
|
-
const getNextOccurrence = import_react24.useCallback((date, freq, int, days) => {
|
|
3151
|
-
switch (freq) {
|
|
3152
|
-
case "daily":
|
|
3153
|
-
return date.add(int, "day");
|
|
3154
|
-
case "weekly":
|
|
3155
|
-
if (days && days.length > 0) {
|
|
3156
|
-
let nextDate = date.add(1, "day");
|
|
3157
|
-
let loopCount = 0;
|
|
3158
|
-
while (loopCount < 7) {
|
|
3159
|
-
if (days.includes(nextDate.day())) {
|
|
3160
|
-
return nextDate;
|
|
3161
|
-
}
|
|
3162
|
-
nextDate = nextDate.add(1, "day");
|
|
3163
|
-
loopCount++;
|
|
3164
|
-
}
|
|
3165
|
-
return date.add(int, "week");
|
|
3166
|
-
} else {
|
|
3167
|
-
return date.add(int, "week");
|
|
3168
|
-
}
|
|
3169
|
-
case "monthly":
|
|
3170
|
-
return date.add(int, "month");
|
|
3171
|
-
case "yearly":
|
|
3172
|
-
return date.add(int, "year");
|
|
3173
|
-
}
|
|
3174
|
-
}, []);
|
|
3175
|
-
const expandRecurringEvent = import_react24.useCallback((baseEvent, startDate, endDate) => {
|
|
3176
|
-
const expandedEvents = [];
|
|
3177
|
-
if (!baseEvent.recurrence)
|
|
3178
|
-
return [baseEvent];
|
|
3179
|
-
const {
|
|
3180
|
-
frequency,
|
|
3181
|
-
interval,
|
|
3182
|
-
endDate: recurrenceEndDate,
|
|
3183
|
-
count,
|
|
3184
|
-
daysOfWeek,
|
|
3185
|
-
exceptions = []
|
|
3186
|
-
} = baseEvent.recurrence;
|
|
3187
|
-
const existingExceptions = events.filter((event) => event.parentEventId === baseEvent.id && event.isException);
|
|
3188
|
-
const duration = baseEvent.end.diff(baseEvent.start, "minute");
|
|
3189
|
-
const maxEndDate = recurrenceEndDate && recurrenceEndDate.isBefore(endDate) ? recurrenceEndDate : endDate;
|
|
3190
|
-
let currentDate2 = baseEvent.start.clone();
|
|
3191
|
-
let occurrences = 0;
|
|
3192
|
-
if (currentDate2.isAfter(maxEndDate)) {
|
|
3193
|
-
return [];
|
|
3194
|
-
}
|
|
3195
|
-
if (currentDate2.isBefore(startDate)) {
|
|
3196
|
-
switch (frequency) {
|
|
3197
|
-
case "daily": {
|
|
3198
|
-
const daysToAdd = Math.floor(startDate.diff(currentDate2, "day") / interval) * interval;
|
|
3199
|
-
if (daysToAdd > 0) {
|
|
3200
|
-
currentDate2 = currentDate2.add(daysToAdd, "day");
|
|
3201
|
-
}
|
|
3202
|
-
break;
|
|
3203
|
-
}
|
|
3204
|
-
case "weekly": {
|
|
3205
|
-
if (!daysOfWeek || daysOfWeek.length === 0) {
|
|
3206
|
-
const weeksToAdd = Math.floor(startDate.diff(currentDate2, "week") / interval) * interval;
|
|
3207
|
-
if (weeksToAdd > 0) {
|
|
3208
|
-
currentDate2 = currentDate2.add(weeksToAdd, "week");
|
|
3209
|
-
}
|
|
3210
|
-
}
|
|
3211
|
-
break;
|
|
3212
|
-
}
|
|
3213
|
-
case "monthly": {
|
|
3214
|
-
const monthsToAdd = Math.floor(startDate.diff(currentDate2, "month") / interval) * interval;
|
|
3215
|
-
if (monthsToAdd > 0) {
|
|
3216
|
-
currentDate2 = currentDate2.add(monthsToAdd, "month");
|
|
3217
|
-
}
|
|
3218
|
-
break;
|
|
3219
|
-
}
|
|
3220
|
-
case "yearly": {
|
|
3221
|
-
const yearsToAdd = Math.floor(startDate.diff(currentDate2, "year") / interval) * interval;
|
|
3222
|
-
if (yearsToAdd > 0) {
|
|
3223
|
-
currentDate2 = currentDate2.add(yearsToAdd, "year");
|
|
3224
|
-
}
|
|
3225
|
-
break;
|
|
3226
|
-
}
|
|
3227
|
-
}
|
|
3228
|
-
}
|
|
3229
|
-
while ((currentDate2.isBefore(maxEndDate) || currentDate2.isSame(maxEndDate, "day")) && (count === undefined || occurrences < count)) {
|
|
3230
|
-
const currentDateStr = currentDate2.format("YYYY-MM-DD");
|
|
3231
|
-
if (exceptions.some((date) => date.format("YYYY-MM-DD") === currentDateStr)) {
|
|
3232
|
-
currentDate2 = getNextOccurrence(currentDate2, frequency, interval, daysOfWeek);
|
|
3233
|
-
continue;
|
|
3234
|
-
}
|
|
3235
|
-
if (frequency === "weekly" && daysOfWeek && daysOfWeek.length > 0 && !daysOfWeek.includes(currentDate2.day())) {
|
|
3236
|
-
currentDate2 = currentDate2.add(1, "day");
|
|
3237
|
-
continue;
|
|
3238
|
-
}
|
|
3239
|
-
const exceptionEvent = existingExceptions.find((event) => event.start.format("YYYY-MM-DD") === currentDateStr);
|
|
3240
|
-
if (exceptionEvent) {
|
|
3241
|
-
expandedEvents.push(exceptionEvent);
|
|
3242
|
-
} else if (currentDate2.isAfter(startDate.subtract(1, "day"))) {
|
|
3243
|
-
const eventInstance = {
|
|
3244
|
-
...baseEvent,
|
|
3245
|
-
id: `${baseEvent.id}-${currentDate2.format("YYYYMMDD")}`,
|
|
3246
|
-
start: currentDate2.clone(),
|
|
3247
|
-
end: currentDate2.clone().add(duration, "minute"),
|
|
3248
|
-
isRecurring: true,
|
|
3249
|
-
parentEventId: baseEvent.id
|
|
3250
|
-
};
|
|
3251
|
-
expandedEvents.push(eventInstance);
|
|
3252
|
-
}
|
|
3253
|
-
occurrences++;
|
|
3254
|
-
currentDate2 = getNextOccurrence(currentDate2, frequency, interval, daysOfWeek);
|
|
3255
|
-
}
|
|
3256
|
-
return expandedEvents;
|
|
3257
|
-
}, [events, getNextOccurrence]);
|
|
3258
|
-
const getEventsForDateRange = import_react24.useCallback((start, end) => {
|
|
3259
|
-
const startDate = start.startOf("day");
|
|
3260
|
-
const endDate = end.endOf("day");
|
|
3261
|
-
const regularEvents = events.filter((event) => {
|
|
3262
|
-
return (event.start.isAfter(startDate) || event.start.isSame(startDate)) && (event.start.isBefore(endDate) || event.start.isSame(endDate)) || (event.end.isAfter(startDate) || event.end.isSame(startDate)) && (event.end.isBefore(endDate) || event.end.isSame(endDate)) || event.start.isBefore(startDate) && event.end.isAfter(endDate);
|
|
3263
|
-
});
|
|
3264
|
-
const recurringParentEvents = events.filter((event) => event.recurrence && !event.parentEventId);
|
|
3265
|
-
let recurringEvents = [];
|
|
3266
|
-
recurringParentEvents.forEach((parentEvent) => {
|
|
3267
|
-
const expanded = expandRecurringEvent(parentEvent, startDate, endDate);
|
|
3268
|
-
recurringEvents = [...recurringEvents, ...expanded];
|
|
3269
|
-
});
|
|
3270
|
-
return [...regularEvents, ...recurringEvents].filter((event, index, self) => index === self.findIndex((e) => e.id === event.id));
|
|
3271
|
-
}, [events, expandRecurringEvent]);
|
|
3272
|
-
const getEventsForDate = import_react24.useCallback((date) => {
|
|
3273
|
-
const day = date.startOf("day");
|
|
3274
|
-
const nextDay = day.add(1, "day");
|
|
3275
|
-
return getEventsForDateRange(day, nextDay);
|
|
3276
|
-
}, [getEventsForDateRange]);
|
|
3277
|
-
const addRecurringEvent = import_react24.useCallback((event) => {
|
|
3278
|
-
setCurrentEvents((prevEvents) => [...prevEvents, event]);
|
|
3279
|
-
}, []);
|
|
3280
|
-
const deleteRecurringEvent = import_react24.useCallback((eventId, deleteAll) => {
|
|
3281
|
-
setCurrentEvents((prevEvents) => {
|
|
3282
|
-
const event = prevEvents.find((e) => e.id === eventId);
|
|
3283
|
-
if (!event)
|
|
3284
|
-
return prevEvents;
|
|
3285
|
-
if (event.parentEventId && !deleteAll) {
|
|
3286
|
-
const parentEvent = prevEvents.find((e) => e.id === event.parentEventId);
|
|
3287
|
-
if (!parentEvent || !parentEvent.recurrence)
|
|
3288
|
-
return prevEvents;
|
|
3289
|
-
return prevEvents.map((e) => {
|
|
3290
|
-
if (e.id === event.parentEventId) {
|
|
3291
|
-
return {
|
|
3292
|
-
...e,
|
|
3293
|
-
recurrence: {
|
|
3294
|
-
...e.recurrence,
|
|
3295
|
-
exceptions: [
|
|
3296
|
-
...e.recurrence.exceptions || [],
|
|
3297
|
-
event.start.startOf("day")
|
|
3298
|
-
]
|
|
3299
|
-
}
|
|
3300
|
-
};
|
|
3301
|
-
}
|
|
3302
|
-
return e;
|
|
3303
|
-
});
|
|
3304
|
-
} else if (event.parentEventId && deleteAll) {
|
|
3305
|
-
return prevEvents.filter((e) => e.id !== event.parentEventId && e.parentEventId !== event.parentEventId);
|
|
3306
|
-
} else if (event.recurrence) {
|
|
3307
|
-
return prevEvents.filter((e) => e.id !== event.id && e.parentEventId !== event.id);
|
|
3308
|
-
} else {
|
|
3309
|
-
return prevEvents.filter((e) => e.id !== event.id);
|
|
3310
|
-
}
|
|
3311
|
-
});
|
|
3312
|
-
}, []);
|
|
3313
|
-
const updateRecurringEvent = import_react24.useCallback((eventId, updatedEvent, updateAll) => {
|
|
3314
|
-
setCurrentEvents((prevEvents) => {
|
|
3315
|
-
const event = prevEvents.find((e) => e.id === eventId);
|
|
3316
|
-
if (!event)
|
|
3317
|
-
return prevEvents;
|
|
3318
|
-
if (event.parentEventId && !updateAll) {
|
|
3319
|
-
const exceptionEvent = {
|
|
3320
|
-
...event,
|
|
3321
|
-
...updatedEvent,
|
|
3322
|
-
isException: true
|
|
3323
|
-
};
|
|
3324
|
-
const updatedEvents = prevEvents.map((e) => {
|
|
3325
|
-
if (e.id === event.parentEventId) {
|
|
3326
|
-
return {
|
|
3327
|
-
...e,
|
|
3328
|
-
recurrence: {
|
|
3329
|
-
...e.recurrence,
|
|
3330
|
-
exceptions: [
|
|
3331
|
-
...e.recurrence.exceptions || [],
|
|
3332
|
-
event.start.startOf("day")
|
|
3333
|
-
]
|
|
3334
|
-
}
|
|
3335
|
-
};
|
|
3336
|
-
}
|
|
3337
|
-
return e;
|
|
3338
|
-
});
|
|
3339
|
-
return [...updatedEvents, exceptionEvent];
|
|
3340
|
-
} else if (event.parentEventId && updateAll) {
|
|
3341
|
-
return prevEvents.map((e) => {
|
|
3342
|
-
if (e.id === event.parentEventId) {
|
|
3343
|
-
return { ...e, ...updatedEvent };
|
|
3344
|
-
}
|
|
3345
|
-
return e;
|
|
3346
|
-
});
|
|
3347
|
-
} else if (event.recurrence) {
|
|
3348
|
-
return prevEvents.map((e) => {
|
|
3349
|
-
if (e.id === event.id) {
|
|
3350
|
-
return { ...e, ...updatedEvent };
|
|
3351
|
-
}
|
|
3352
|
-
return e;
|
|
3353
|
-
});
|
|
3354
|
-
} else {
|
|
3355
|
-
return prevEvents.map((e) => {
|
|
3356
|
-
if (e.id === event.id) {
|
|
3357
|
-
return { ...e, ...updatedEvent };
|
|
3358
|
-
}
|
|
3359
|
-
return e;
|
|
3360
|
-
});
|
|
3361
|
-
}
|
|
3362
|
-
});
|
|
3363
|
-
}, []);
|
|
3364
|
-
const createExceptionForRecurringEvent = import_react24.useCallback((eventId, date) => {
|
|
3365
|
-
setCurrentEvents((prevEvents) => {
|
|
3366
|
-
const event = prevEvents.find((e) => e.id === eventId);
|
|
3367
|
-
if (!event || !event.recurrence)
|
|
3368
|
-
return prevEvents;
|
|
3369
|
-
return prevEvents.map((e) => {
|
|
3370
|
-
if (e.id === eventId) {
|
|
3371
|
-
return {
|
|
3372
|
-
...e,
|
|
3373
|
-
recurrence: {
|
|
3374
|
-
...e.recurrence,
|
|
3375
|
-
exceptions: [
|
|
3376
|
-
...e.recurrence.exceptions || [],
|
|
3377
|
-
date.startOf("day")
|
|
3378
|
-
]
|
|
3379
|
-
}
|
|
3380
|
-
};
|
|
3381
|
-
}
|
|
3382
|
-
return e;
|
|
3383
|
-
});
|
|
3384
|
-
});
|
|
3385
|
-
}, []);
|
|
3386
|
-
const contextValue = import_react24.useMemo(() => ({
|
|
3387
|
-
currentDate,
|
|
3388
|
-
view,
|
|
3389
|
-
events: currentEvents,
|
|
3390
|
-
currentLocale,
|
|
3391
|
-
isEventFormOpen,
|
|
3392
|
-
selectedEvent,
|
|
3393
|
-
selectedDate,
|
|
3394
|
-
firstDayOfWeek,
|
|
3395
|
-
setCurrentDate,
|
|
3396
|
-
selectDate,
|
|
3397
|
-
setView: handleViewChange,
|
|
3398
|
-
nextPeriod,
|
|
3399
|
-
prevPeriod,
|
|
3400
|
-
today,
|
|
3401
|
-
addEvent,
|
|
3402
|
-
updateEvent,
|
|
3403
|
-
deleteEvent,
|
|
3404
|
-
openEventForm: () => setIsEventFormOpen(true),
|
|
3405
|
-
closeEventForm,
|
|
3406
|
-
getEventsForDate,
|
|
3407
|
-
getEventsForDateRange,
|
|
3408
|
-
expandRecurringEvent,
|
|
3409
|
-
addRecurringEvent,
|
|
3410
|
-
deleteRecurringEvent,
|
|
3411
|
-
updateRecurringEvent,
|
|
3412
|
-
createExceptionForRecurringEvent,
|
|
3413
|
-
renderEvent,
|
|
3414
|
-
onEventClick: handleEventClick,
|
|
3415
|
-
onCellClick: handleDateClick,
|
|
3416
|
-
locale,
|
|
3417
|
-
timezone: currentTimezone,
|
|
3418
|
-
disableCellClick,
|
|
3419
|
-
disableEventClick,
|
|
3420
|
-
disableDragAndDrop,
|
|
3421
|
-
dayMaxEvents,
|
|
3422
|
-
stickyViewHeader,
|
|
3423
|
-
viewHeaderClassName
|
|
3424
|
-
}), [
|
|
3425
|
-
currentDate,
|
|
3426
|
-
view,
|
|
3427
|
-
currentEvents,
|
|
3428
|
-
currentLocale,
|
|
3429
|
-
isEventFormOpen,
|
|
3430
|
-
selectedEvent,
|
|
3431
|
-
selectedDate,
|
|
3432
|
-
firstDayOfWeek,
|
|
3433
|
-
selectDate,
|
|
3434
|
-
handleViewChange,
|
|
3435
|
-
nextPeriod,
|
|
3436
|
-
prevPeriod,
|
|
3437
|
-
today,
|
|
3438
|
-
addEvent,
|
|
3439
|
-
updateEvent,
|
|
3440
|
-
deleteEvent,
|
|
3441
|
-
closeEventForm,
|
|
3442
|
-
getEventsForDate,
|
|
3443
|
-
getEventsForDateRange,
|
|
3444
|
-
expandRecurringEvent,
|
|
3445
|
-
addRecurringEvent,
|
|
3446
|
-
deleteRecurringEvent,
|
|
3447
|
-
updateRecurringEvent,
|
|
3448
|
-
createExceptionForRecurringEvent,
|
|
3449
|
-
renderEvent,
|
|
3450
|
-
handleEventClick,
|
|
3451
|
-
handleDateClick,
|
|
3452
|
-
locale,
|
|
3453
|
-
currentTimezone,
|
|
3454
|
-
disableCellClick,
|
|
3455
|
-
disableEventClick,
|
|
3456
|
-
disableDragAndDrop,
|
|
3457
|
-
dayMaxEvents,
|
|
3458
|
-
stickyViewHeader,
|
|
3459
|
-
viewHeaderClassName
|
|
3460
|
-
]);
|
|
3461
|
-
return /* @__PURE__ */ jsx_dev_runtime47.jsxDEV(CalendarContext.Provider, {
|
|
3462
|
-
value: contextValue,
|
|
3463
|
-
children
|
|
3464
|
-
}, undefined, false, undefined, this);
|
|
3465
|
-
};
|
|
3466
|
-
|
|
3467
|
-
// src/components/ilamy-calendar/ilamy-calendar.tsx
|
|
3468
|
-
var jsx_dev_runtime48 = require("react/jsx-dev-runtime");
|
|
3469
|
-
var CalendarContent = () => {
|
|
3470
|
-
const {
|
|
3471
|
-
view,
|
|
3472
|
-
isEventFormOpen,
|
|
3473
|
-
closeEventForm,
|
|
3474
|
-
selectedEvent,
|
|
3475
|
-
selectedDate,
|
|
3476
|
-
addEvent,
|
|
3477
|
-
updateEvent,
|
|
3478
|
-
deleteEvent,
|
|
3479
|
-
dayMaxEvents
|
|
3480
|
-
} = useCalendarContext();
|
|
3481
|
-
const viewMap = {
|
|
3482
|
-
month: /* @__PURE__ */ jsx_dev_runtime48.jsxDEV(MonthView, {
|
|
3483
|
-
dayMaxEvents
|
|
3484
|
-
}, "month", false, undefined, this),
|
|
3485
|
-
week: /* @__PURE__ */ jsx_dev_runtime48.jsxDEV(week_view_default, {}, "week", false, undefined, this),
|
|
3486
|
-
day: /* @__PURE__ */ jsx_dev_runtime48.jsxDEV(day_view_default, {}, "day", false, undefined, this),
|
|
3487
|
-
year: /* @__PURE__ */ jsx_dev_runtime48.jsxDEV(year_view_default, {}, "year", false, undefined, this)
|
|
3488
|
-
};
|
|
3489
|
-
const handleOnUpdate = (event) => {
|
|
3490
|
-
updateEvent(event.id, event);
|
|
3491
|
-
};
|
|
3492
|
-
const handleOnDelete = (event) => {
|
|
3493
|
-
deleteEvent(event.id);
|
|
3494
|
-
};
|
|
3495
|
-
return /* @__PURE__ */ jsx_dev_runtime48.jsxDEV("div", {
|
|
3496
|
-
className: "flex flex-col w-full h-full",
|
|
3497
|
-
children: [
|
|
3498
|
-
/* @__PURE__ */ jsx_dev_runtime48.jsxDEV(base_header_default, {}, undefined, false, undefined, this),
|
|
3499
|
-
/* @__PURE__ */ jsx_dev_runtime48.jsxDEV(CalendarDndContext, {
|
|
3500
|
-
children: /* @__PURE__ */ jsx_dev_runtime48.jsxDEV(import_react25.AnimatePresence, {
|
|
3501
|
-
mode: "wait",
|
|
3502
|
-
children: /* @__PURE__ */ jsx_dev_runtime48.jsxDEV(import_react25.motion.div, {
|
|
3503
|
-
initial: { opacity: 0, x: 20 },
|
|
3504
|
-
animate: { opacity: 1, x: 0 },
|
|
3505
|
-
exit: { opacity: 0, x: -20 },
|
|
3506
|
-
transition: { duration: 0.1, ease: "easeInOut" },
|
|
3507
|
-
className: "h-full w-full",
|
|
3508
|
-
children: viewMap[view]
|
|
3509
|
-
}, view, false, undefined, this)
|
|
3510
|
-
}, undefined, false, undefined, this)
|
|
3511
|
-
}, undefined, false, undefined, this),
|
|
3512
|
-
isEventFormOpen && /* @__PURE__ */ jsx_dev_runtime48.jsxDEV(EventForm, {
|
|
3513
|
-
onClose: closeEventForm,
|
|
3514
|
-
selectedEvent,
|
|
3515
|
-
selectedDate,
|
|
3516
|
-
onAdd: addEvent,
|
|
3517
|
-
onUpdate: handleOnUpdate,
|
|
3518
|
-
onDelete: handleOnDelete
|
|
3519
|
-
}, undefined, false, undefined, this)
|
|
3520
|
-
]
|
|
3521
|
-
}, undefined, true, undefined, this);
|
|
3522
|
-
};
|
|
3523
|
-
var dayNumberMap = {
|
|
3524
|
-
sunday: 0,
|
|
3525
|
-
monday: 1,
|
|
3526
|
-
tuesday: 2,
|
|
3527
|
-
wednesday: 3,
|
|
3528
|
-
thursday: 4,
|
|
3529
|
-
friday: 5,
|
|
3530
|
-
saturday: 6
|
|
3531
|
-
};
|
|
3532
|
-
var DEFAULT_DAY_MAX_EVENTS = 6;
|
|
3533
|
-
var IlamyCalendar = ({
|
|
3534
|
-
events,
|
|
3535
|
-
firstDayOfWeek = "sunday",
|
|
3536
|
-
renderEvent,
|
|
3537
|
-
onEventClick,
|
|
3538
|
-
onCellClick,
|
|
3539
|
-
onViewChange,
|
|
3540
|
-
locale,
|
|
3541
|
-
timezone: timezone2,
|
|
3542
|
-
disableCellClick,
|
|
3543
|
-
disableEventClick,
|
|
3544
|
-
disableDragAndDrop,
|
|
3545
|
-
dayMaxEvents = DEFAULT_DAY_MAX_EVENTS,
|
|
3546
|
-
stickyViewHeader = true,
|
|
3547
|
-
viewHeaderClassName = ""
|
|
3548
|
-
}) => {
|
|
3549
|
-
return /* @__PURE__ */ jsx_dev_runtime48.jsxDEV(CalendarProvider, {
|
|
3550
|
-
events,
|
|
3551
|
-
firstDayOfWeek: dayNumberMap[firstDayOfWeek],
|
|
3552
|
-
renderEvent,
|
|
3553
|
-
onEventClick,
|
|
3554
|
-
onCellClick,
|
|
3555
|
-
onViewChange,
|
|
3556
|
-
locale,
|
|
3557
|
-
timezone: timezone2,
|
|
3558
|
-
disableCellClick,
|
|
3559
|
-
disableEventClick,
|
|
3560
|
-
disableDragAndDrop,
|
|
3561
|
-
dayMaxEvents,
|
|
3562
|
-
stickyViewHeader,
|
|
3563
|
-
viewHeaderClassName,
|
|
3564
|
-
children: /* @__PURE__ */ jsx_dev_runtime48.jsxDEV(CalendarContent, {}, undefined, false, undefined, this)
|
|
3565
|
-
}, undefined, false, undefined, this);
|
|
3566
|
-
};
|
|
3567
|
-
|
|
3568
|
-
//# debugId=2B9FF63BF5ED129A64756E2164756E21
|
|
3569
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2ZlYXR1cmVzL21vbnRoLXZpZXcvY29tcG9uZW50cy9tb250aC12aWV3LnRzeCIsICIuLi9zcmMvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2FjY29yZGlvbi50c3giLCAiLi4vc3JjL2xpYi91dGlscy50cyIsICIuLi9zcmMvbGliL2RheWpzLWNvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy91aS9hbGVydC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvYmFkZ2UudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2J1dHRvbi50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvY2FsZW5kYXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2NoZWNrYm94LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9kYXRlLXBpY2tlci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvcG9wb3Zlci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvZGlhbG9nLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9kcm9wZG93bi1tZW51LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9mb3JtLnRzeCIsICIuLi9ub2RlX21vZHVsZXMvcmVhY3QtaG9vay1mb3JtL2Rpc3QvaW5kZXguZXNtLm1qcyIsICIuLi9zcmMvY29tcG9uZW50cy91aS9sYWJlbC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvaW5wdXQudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3Njcm9sbC1hcmVhLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9zZWxlY3QudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3NlcGFyYXRvci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvc2hlZXQudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3RhYnMudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3Rvb2x0aXAudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9tb250aC12aWV3L2NvbXBvbmVudHMvYWxsLWV2ZW50cy1kaWFsb2cudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9kcmFnZ2FibGUtZXZlbnQvZHJhZ2dhYmxlLWV2ZW50LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL2RheS1jZWxsLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9tb250aC12aWV3L2NvbXBvbmVudHMvbW9udGgtaGVhZGVyLnRzeCIsICIuLi9zcmMvbGliL2NvbnN0YW50cy50cyIsICIuLi9zcmMvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL3dlZWstZXZlbnRzLWxheWVyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstdmlldy50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3dlZWstdmlldy93ZWVrLWFsbC1kYXktcm93LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstaGVhZGVyLnRzeCIsICIuLi9zcmMvaG9va3MvdXNlUHJvY2Vzc2VkRGF5RXZlbnRzLnRzIiwgIi4uL3NyYy9mZWF0dXJlcy9kYXktdmlldy9kYXktZXZlbnRzLWxheWVyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstZGF5LWNvbC50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3dlZWstdmlldy93ZWVrLXRpbWUtZ3JpZC50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL2RheS12aWV3L2RheS12aWV3LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZGF5LXZpZXcvZGF5LWFsbC1kYXktcm93LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZGF5LXZpZXcvZGF5LWhlYWRlci50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL2RheS12aWV3L2RheS10aW1lLWNvbC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvZXZlbnQtZm9ybS9ldmVudC1mb3JtLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9oZWFkZXIvYmFzZS1oZWFkZXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL2hlYWRlci90aXRsZS1jb250ZW50LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9oZWFkZXIvdmlldy1jb250cm9scy50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3llYXItdmlldy95ZWFyLXZpZXcudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL2lsYW15LWNhbGVuZGFyL2lsYW15LWNhbGVuZGFyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZHJhZy1hbmQtZHJvcC9jYWxlbmRhci1kbmQtY29udGV4dC50c3giLCAiLi4vc3JjL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvcHJvdmlkZXIudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IEFuaW1hdGVQcmVzZW5jZSwgbW90aW9uIH0gZnJvbSAnbW90aW9uL3JlYWN0J1xuaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgQWxsRXZlbnREaWFsb2cgfSBmcm9tICcuL2FsbC1ldmVudHMtZGlhbG9nJ1xuaW1wb3J0IHsgRGF5Q2VsbCB9IGZyb20gJy4vZGF5LWNlbGwnXG5pbXBvcnQgdHlwZSB7IE1vbnRoVmlld1Byb3BzLCBTZWxlY3RlZERheUV2ZW50cyB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgTW9udGhIZWFkZXIgfSBmcm9tICcuL21vbnRoLWhlYWRlcidcbmltcG9ydCB7IFdlZWtFdmVudHNMYXllciB9IGZyb20gJy4vd2Vlay1ldmVudHMtbGF5ZXInXG5cbmV4cG9ydCBjb25zdCBNb250aFZpZXc6IFJlYWN0LkZDPE1vbnRoVmlld1Byb3BzPiA9ICh7IGRheU1heEV2ZW50cyA9IDMgfSkgPT4ge1xuICBjb25zdCBhbGxFdmVudHNEaWFsb2dSZWYgPSBSZWFjdC51c2VSZWY8e1xuICAgIG9wZW46ICgpID0+IHZvaWRcbiAgICBjbG9zZTogKCkgPT4gdm9pZFxuICAgIHNldFNlbGVjdGVkRGF5RXZlbnRzOiAoZGF5RXZlbnRzOiBTZWxlY3RlZERheUV2ZW50cykgPT4gdm9pZFxuICB9PihudWxsKVxuICBjb25zdCB7IGN1cnJlbnREYXRlLCBmaXJzdERheU9mV2VlayB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBHZXQgc3RhcnQgZGF0ZSBmb3IgdGhlIGN1cnJlbnQgbW9udGggdmlldyBiYXNlZCBvbiBmaXJzdERheU9mV2Vla1xuICBjb25zdCBmaXJzdERheU9mTW9udGggPSBjdXJyZW50RGF0ZS5zdGFydE9mKCdtb250aCcpXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIGNhbGVuZGFyIGdyaWQgY29ycmVjdGx5XG4gIC8vIEZpbmQgdGhlIGZpcnN0IGRheSBvZiB3ZWVrIChlLmcuIFN1bmRheSBvciBNb25kYXkpIHRoYXQgY29tZXMgYmVmb3JlIG9yIG9uIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoXG4gIGxldCBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhciA9IGZpcnN0RGF5T2ZNb250aC5jbG9uZSgpXG4gIHdoaWxlIChhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5kYXkoKSAhPT0gZmlyc3REYXlPZldlZWspIHtcbiAgICBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhciA9IGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyLnN1YnRyYWN0KDEsICdkYXknKVxuICB9XG5cbiAgLy8gQWx3YXlzIGdlbmVyYXRlIDYgd2Vla3MgKDQyIGRheXMpIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vbnRoIGxlbmd0aFxuICAvLyBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIGhhdmUgNiByb3dzIG9mIGRheXNcbiAgY29uc3QgY2FsZW5kYXJEYXlzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gNiB3ZWVrcyDDlyA3IGRheXMgPSA0MiBkYXlzXG4gICAgY29uc3QgZGF5czogZGF5anMuRGF5anNbXVtdID0gW1tdXVxuICAgIGxldCBkYXkgPSBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5jbG9uZSgpIC8vIENsb25lIHRvIGF2b2lkIG11dGF0aW9uXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0MjsgaSsrKSB7XG4gICAgICBpZiAoZGF5c1tkYXlzLmxlbmd0aCAtIDFdLmxlbmd0aCA9PT0gNykge1xuICAgICAgICBkYXlzLnB1c2goW10pIC8vIFN0YXJ0IGEgbmV3IHdlZWtcbiAgICAgIH1cbiAgICAgIGRheXNbZGF5cy5sZW5ndGggLSAxXS5wdXNoKGRheSlcbiAgICAgIGRheSA9IGRheS5hZGQoMSwgJ2RheScpIC8vIE1vdmUgdG8gdGhlIG5leHQgZGF5XG4gICAgfVxuICAgIHJldHVybiBkYXlzXG4gIH0sIFthZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhcl0pXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaC1mdWxsIGZsZXgtY29sXCIgZGF0YS10ZXN0aWQ9XCJtb250aC12aWV3XCI+XG4gICAgICB7LyogV2VlayBkYXlzIGhlYWRlciAqL31cbiAgICAgIDxNb250aEhlYWRlciAvPlxuXG4gICAgICB7LyogQ2FsZW5kYXIgZ3JpZCAtIGFkZGVkIGZpeGVkIGhlaWdodCAqL31cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LWF1dG8gaC1mdWxsXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJtb250aC1zY3JvbGwtYXJlYVwiXG4gICAgICA+XG4gICAgICAgIDxBbmltYXRlUHJlc2VuY2UgbW9kZT1cIndhaXRcIj5cbiAgICAgICAgICA8bW90aW9uLmRpdlxuICAgICAgICAgICAga2V5PXtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCB9fVxuICAgICAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxIH19XG4gICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAgfX1cbiAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMjUsIGVhc2U6ICdlYXNlSW5PdXQnIH19XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBncmlkIGgtZnVsbCBncmlkLWNvbHMtNyBncmlkLXJvd3MtNiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibW9udGgtY2FsZW5kYXItZ3JpZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgey8qIERheSBjZWxscyAqL31cbiAgICAgICAgICAgIHtjYWxlbmRhckRheXMubWFwKChkYXlzLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGtleT17YHdlZWstJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgY29sLXNwYW4tNyBncmlkIGdyaWQtY29scy03XCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vlay1yb3ctJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtkYXlzLm1hcCgoZGF5LCBkYXlJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxEYXlDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17ZGF5SW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXk9e2RheX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRheU1heEV2ZW50cz17ZGF5TWF4RXZlbnRzfVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItciBib3JkZXItYiBmaXJzdDpib3JkZXItbFwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfSl9XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCB6LTEwIHBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPFdlZWtFdmVudHNMYXllciBkYXlzPXtkYXlzfSAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERpYWxvZyBmb3Igc2hvd2luZyBhbGwgZXZlbnRzICovfVxuICAgICAgPEFsbEV2ZW50RGlhbG9nIHJlZj17YWxsRXZlbnRzRGlhbG9nUmVmfSAvPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCdcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhckNvbnRleHRUeXBlIHtcbiAgY3VycmVudERhdGU6IGRheWpzLkRheWpzXG4gIHZpZXc6ICdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJ1xuICBldmVudHM6IENhbGVuZGFyRXZlbnRbXVxuICBpc0V2ZW50Rm9ybU9wZW46IGJvb2xlYW5cbiAgc2VsZWN0ZWRFdmVudDogQ2FsZW5kYXJFdmVudCB8IG51bGxcbiAgc2VsZWN0ZWREYXRlOiBkYXlqcy5EYXlqcyB8IG51bGxcbiAgZmlyc3REYXlPZldlZWs6IG51bWJlciAvLyAwIGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICBzZXRDdXJyZW50RGF0ZTogKGRhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIHNlbGVjdERhdGU6IChkYXRlOiBkYXlqcy5EYXlqcykgPT4gdm9pZFxuICBzZXRWaWV3OiAodmlldzogJ21vbnRoJyB8ICd3ZWVrJyB8ICdkYXknIHwgJ3llYXInKSA9PiB2b2lkXG4gIG5leHRQZXJpb2Q6ICgpID0+IHZvaWRcbiAgcHJldlBlcmlvZDogKCkgPT4gdm9pZFxuICB0b2RheTogKCkgPT4gdm9pZFxuICBhZGRFdmVudDogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIHVwZGF0ZUV2ZW50OiAoZXZlbnRJZDogc3RyaW5nLCBldmVudDogUGFydGlhbDxDYWxlbmRhckV2ZW50PikgPT4gdm9pZFxuICBkZWxldGVFdmVudDogKGV2ZW50SWQ6IHN0cmluZykgPT4gdm9pZFxuICBvcGVuRXZlbnRGb3JtOiAoZGF0ZT86IGRheWpzLkRheWpzLCBldmVudD86IENhbGVuZGFyRXZlbnQpID0+IHZvaWRcbiAgY2xvc2VFdmVudEZvcm06ICgpID0+IHZvaWRcbiAgZ2V0RXZlbnRzRm9yRGF0ZTogKGRhdGU6IGRheWpzLkRheWpzKSA9PiBDYWxlbmRhckV2ZW50W11cbiAgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlOiAoXG4gICAgc3RhcnQ6IGRheWpzLkRheWpzLFxuICAgIGVuZDogZGF5anMuRGF5anNcbiAgKSA9PiBDYWxlbmRhckV2ZW50W11cbiAgZXhwYW5kUmVjdXJyaW5nRXZlbnQ6IChcbiAgICBiYXNlRXZlbnQ6IENhbGVuZGFyRXZlbnQsXG4gICAgc3RhcnREYXRlOiBkYXlqcy5EYXlqcyxcbiAgICBlbmREYXRlOiBkYXlqcy5EYXlqc1xuICApID0+IENhbGVuZGFyRXZlbnRbXVxuICBhZGRSZWN1cnJpbmdFdmVudDogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIGRlbGV0ZVJlY3VycmluZ0V2ZW50OiAoZXZlbnRJZDogc3RyaW5nLCBkZWxldGVBbGw6IGJvb2xlYW4pID0+IHZvaWRcbiAgdXBkYXRlUmVjdXJyaW5nRXZlbnQ6IChcbiAgICBldmVudElkOiBzdHJpbmcsXG4gICAgdXBkYXRlZEV2ZW50OiBQYXJ0aWFsPENhbGVuZGFyRXZlbnQ+LFxuICAgIHVwZGF0ZUFsbDogYm9vbGVhblxuICApID0+IHZvaWRcbiAgY3JlYXRlRXhjZXB0aW9uRm9yUmVjdXJyaW5nRXZlbnQ6IChldmVudElkOiBzdHJpbmcsIGRhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIHJlbmRlckV2ZW50PzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgb25FdmVudENsaWNrOiAoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHZvaWRcbiAgb25DZWxsQ2xpY2s6IChzdGFydERhdGU6IGRheWpzLkRheWpzLCBlbmREYXRlOiBkYXlqcy5EYXlqcykgPT4gdm9pZFxuICBjdXJyZW50TG9jYWxlPzogc3RyaW5nXG4gIGRpc2FibGVDZWxsQ2xpY2s/OiBib29sZWFuXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICBkaXNhYmxlRHJhZ0FuZERyb3A/OiBib29sZWFuXG4gIGRheU1heEV2ZW50czogbnVtYmVyXG4gIHN0aWNreVZpZXdIZWFkZXI6IGJvb2xlYW5cbiAgdmlld0hlYWRlckNsYXNzTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBDYWxlbmRhckNvbnRleHQgPSBjcmVhdGVDb250ZXh0PENhbGVuZGFyQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KFxuICB1bmRlZmluZWRcbilcblxuZXhwb3J0IGNvbnN0IHVzZUNhbGVuZGFyQ29udGV4dCA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQ2FsZW5kYXJDb250ZXh0KVxuICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VDYWxlbmRhckNvbnRleHQgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIENhbGVuZGFyUHJvdmlkZXInKVxuICB9XG4gIHJldHVybiBjb250ZXh0XG59XG5cbmV4cG9ydCBjb25zdCB1c2VQdWJsaWNDYWxlbmRhckNvbnRleHQgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KENhbGVuZGFyQ29udGV4dClcbiAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlQ2FsZW5kYXJDb250ZXh0IG11c3QgYmUgdXNlZCB3aXRoaW4gaWxhbXkgY2FsZW5kYXInKVxuICB9XG4gIHJldHVybiB7XG4gICAgY3VycmVudERhdGU6IGNvbnRleHQuY3VycmVudERhdGUsXG4gICAgdmlldzogY29udGV4dC52aWV3LFxuICAgIGV2ZW50czogY29udGV4dC5ldmVudHMsXG4gICAgaXNFdmVudEZvcm1PcGVuOiBjb250ZXh0LmlzRXZlbnRGb3JtT3BlbixcbiAgICBzZWxlY3RlZEV2ZW50OiBjb250ZXh0LnNlbGVjdGVkRXZlbnQsXG4gICAgc2VsZWN0ZWREYXRlOiBjb250ZXh0LnNlbGVjdGVkRGF0ZSxcbiAgICBmaXJzdERheU9mV2VlazogY29udGV4dC5maXJzdERheU9mV2VlayxcbiAgICBzZXRDdXJyZW50RGF0ZTogY29udGV4dC5zZXRDdXJyZW50RGF0ZSxcbiAgICBzZWxlY3REYXRlOiBjb250ZXh0LnNlbGVjdERhdGUsXG4gICAgc2V0VmlldzogY29udGV4dC5zZXRWaWV3LFxuICAgIG5leHRQZXJpb2Q6IGNvbnRleHQubmV4dFBlcmlvZCxcbiAgICBwcmV2UGVyaW9kOiBjb250ZXh0LnByZXZQZXJpb2QsXG4gICAgdG9kYXk6IGNvbnRleHQudG9kYXksXG4gICAgYWRkRXZlbnQ6IGNvbnRleHQuYWRkRXZlbnQsXG4gICAgdXBkYXRlRXZlbnQ6IGNvbnRleHQudXBkYXRlRXZlbnQsXG4gICAgZGVsZXRlRXZlbnQ6IGNvbnRleHQuZGVsZXRlRXZlbnQsXG4gICAgb3BlbkV2ZW50Rm9ybTogY29udGV4dC5vcGVuRXZlbnRGb3JtLFxuICAgIGNsb3NlRXZlbnRGb3JtOiBjb250ZXh0LmNsb3NlRXZlbnRGb3JtLFxuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgQWNjb3JkaW9uUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1hY2NvcmRpb24nXG5pbXBvcnQgeyBDaGV2cm9uRG93bkljb24gfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmZ1bmN0aW9uIEFjY29yZGlvbih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgQWNjb3JkaW9uUHJpbWl0aXZlLlJvb3Q+KSB7XG4gIHJldHVybiA8QWNjb3JkaW9uUHJpbWl0aXZlLlJvb3QgZGF0YS1zbG90PVwiYWNjb3JkaW9uXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBBY2NvcmRpb25JdGVtKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIEFjY29yZGlvblByaW1pdGl2ZS5JdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxBY2NvcmRpb25QcmltaXRpdmUuSXRlbVxuICAgICAgZGF0YS1zbG90PVwiYWNjb3JkaW9uLWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbignYm9yZGVyLWIgbGFzdDpib3JkZXItYi0wJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIEFjY29yZGlvblRyaWdnZXIoe1xuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIEFjY29yZGlvblByaW1pdGl2ZS5UcmlnZ2VyPikge1xuICByZXR1cm4gKFxuICAgIDxBY2NvcmRpb25QcmltaXRpdmUuSGVhZGVyIGNsYXNzTmFtZT1cImZsZXhcIj5cbiAgICAgIDxBY2NvcmRpb25QcmltaXRpdmUuVHJpZ2dlclxuICAgICAgICBkYXRhLXNsb3Q9XCJhY2NvcmRpb24tdHJpZ2dlclwiXG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2ZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZmxleCBmbGV4LTEgaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00IHJvdW5kZWQtbWQgcHktNCB0ZXh0LWxlZnQgdGV4dC1zbSBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBvdXRsaW5lLW5vbmUgaG92ZXI6dW5kZXJsaW5lIGZvY3VzLXZpc2libGU6cmluZy1bM3B4XSBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAgWyZbZGF0YS1zdGF0ZT1vcGVuXT5zdmddOnJvdGF0ZS0xODAnLFxuICAgICAgICAgIGNsYXNzTmFtZVxuICAgICAgICApfVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICA+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPENoZXZyb25Eb3duSWNvbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgcG9pbnRlci1ldmVudHMtbm9uZSBzaXplLTQgc2hyaW5rLTAgdHJhbnNsYXRlLXktMC41IHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTIwMFwiIC8+XG4gICAgICA8L0FjY29yZGlvblByaW1pdGl2ZS5UcmlnZ2VyPlxuICAgIDwvQWNjb3JkaW9uUHJpbWl0aXZlLkhlYWRlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBBY2NvcmRpb25Db250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBBY2NvcmRpb25QcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8QWNjb3JkaW9uUHJpbWl0aXZlLkNvbnRlbnRcbiAgICAgIGRhdGEtc2xvdD1cImFjY29yZGlvbi1jb250ZW50XCJcbiAgICAgIGNsYXNzTmFtZT1cImRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1hY2NvcmRpb24tdXAgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1hY2NvcmRpb24tZG93biBvdmVyZmxvdy1jbGlwIHRleHQtc21cIlxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbigncHQtMCBwYi00JywgY2xhc3NOYW1lKX0+e2NoaWxkcmVufTwvZGl2PlxuICAgIDwvQWNjb3JkaW9uUHJpbWl0aXZlLkNvbnRlbnQ+XG4gIClcbn1cblxuZXhwb3J0IHsgQWNjb3JkaW9uLCBBY2NvcmRpb25JdGVtLCBBY2NvcmRpb25UcmlnZ2VyLCBBY2NvcmRpb25Db250ZW50IH1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzJ1xuaW1wb3J0IHsgdHlwZSBDbGFzc1ZhbHVlLCBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyB0d01lcmdlIH0gZnJvbSAndGFpbHdpbmQtbWVyZ2UnXG5cbmV4cG9ydCBmdW5jdGlvbiBjbiguLi5pbnB1dHM6IENsYXNzVmFsdWVbXSkge1xuICByZXR1cm4gdHdNZXJnZShjbHN4KGlucHV0cykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1vY2tFdmVudHMoeyBjb3VudCA9IDUgfSA9IHt9KSB7XG4gIGNvbnN0IGV2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgZXZlbnRzLnB1c2goe1xuICAgICAgaWQ6IGkudG9TdHJpbmcoKSxcbiAgICAgIHRpdGxlOiBgTW9jayBFdmVudCAke2kgKyAxfWAsXG4gICAgICBzdGFydDogZGF5anMoKS5hZGQoaSwgJ2RheScpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgZW5kOiBkYXlqcygpLmFkZChpLCAnZGF5JykuZW5kT2YoJ2RheScpLFxuICAgICAgY29sb3I6ICdiZy1ncmF5LTEwMCB0ZXh0LWdyYXktODAwJyxcbiAgICB9KVxuICB9XG4gIHJldHVybiBldmVudHNcbn1cbiIsCiAgICAiaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xuaW1wb3J0IHdlZWtkYXkgZnJvbSAnZGF5anMvcGx1Z2luL3dlZWtkYXkuanMnXG5pbXBvcnQgd2Vla09mWWVhciBmcm9tICdkYXlqcy9wbHVnaW4vd2Vla09mWWVhci5qcydcbmltcG9ydCBpc1NhbWVPckFmdGVyIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckFmdGVyLmpzJ1xuaW1wb3J0IGlzU2FtZU9yQmVmb3JlIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckJlZm9yZS5qcydcbmltcG9ydCBpc0JldHdlZW4gZnJvbSAnZGF5anMvcGx1Z2luL2lzQmV0d2Vlbi5qcydcbmltcG9ydCBtaW5NYXggZnJvbSAnZGF5anMvcGx1Z2luL21pbk1heC5qcydcbmltcG9ydCB0aW1lem9uZSBmcm9tICdkYXlqcy9wbHVnaW4vdGltZXpvbmUuanMnXG5pbXBvcnQgdXRjIGZyb20gJ2RheWpzL3BsdWdpbi91dGMuanMnXG5pbXBvcnQgbG9jYWxlRGF0YSBmcm9tICdkYXlqcy9wbHVnaW4vbG9jYWxlRGF0YS5qcydcblxuLy8gSW1wb3J0IGFsbCBkYXlqcyBsb2NhbGVzIGFscGhhYmV0aWNhbGx5XG4vLyBsb2NhbGUuanNvbiBmaWxlOiBbe1wia2V5XCI6XCJhZlwiLFwibmFtZVwiOlwiQWZyaWthYW5zXCJ9LHtcImtleVwiOlwiYW1cIixcIm5hbWVcIjpcIkFtaGFyaWNcIn0se1wia2V5XCI6XCJhci1kelwiLFwibmFtZVwiOlwiQXJhYmljIChBbGdlcmlhKVwifSx7XCJrZXlcIjpcImFyLWlxXCIsXCJuYW1lXCI6XCIgQXJhYmljIChJcmFxKVwifSx7XCJrZXlcIjpcImFyLWt3XCIsXCJuYW1lXCI6XCJBcmFiaWMgKEt1d2FpdClcIn0se1wia2V5XCI6XCJhci1seVwiLFwibmFtZVwiOlwiQXJhYmljIChMeWJpYSlcIn0se1wia2V5XCI6XCJhci1tYVwiLFwibmFtZVwiOlwiQXJhYmljIChNb3JvY2NvKVwifSx7XCJrZXlcIjpcImFyLXNhXCIsXCJuYW1lXCI6XCJBcmFiaWMgKFNhdWRpIEFyYWJpYSlcIn0se1wia2V5XCI6XCJhci10blwiLFwibmFtZVwiOlwiIEFyYWJpYyAoVHVuaXNpYSlcIn0se1wia2V5XCI6XCJhclwiLFwibmFtZVwiOlwiQXJhYmljXCJ9LHtcImtleVwiOlwiYXpcIixcIm5hbWVcIjpcIkF6ZXJiYWlqYW5pXCJ9LHtcImtleVwiOlwiYmVcIixcIm5hbWVcIjpcIkJlbGFydXNpYW5cIn0se1wia2V5XCI6XCJiZ1wiLFwibmFtZVwiOlwiQnVsZ2FyaWFuXCJ9LHtcImtleVwiOlwiYmlcIixcIm5hbWVcIjpcIkJpc2xhbWFcIn0se1wia2V5XCI6XCJibVwiLFwibmFtZVwiOlwiQmFtYmFyYVwifSx7XCJrZXlcIjpcImJuLWJkXCIsXCJuYW1lXCI6XCJCZW5nYWxpIChCYW5nbGFkZXNoKVwifSx7XCJrZXlcIjpcImJuXCIsXCJuYW1lXCI6XCJCZW5nYWxpXCJ9LHtcImtleVwiOlwiYm9cIixcIm5hbWVcIjpcIlRpYmV0YW5cIn0se1wia2V5XCI6XCJiclwiLFwibmFtZVwiOlwiQnJldG9uXCJ9LHtcImtleVwiOlwiYnNcIixcIm5hbWVcIjpcIkJvc25pYW5cIn0se1wia2V5XCI6XCJjYVwiLFwibmFtZVwiOlwiQ2F0YWxhblwifSx7XCJrZXlcIjpcImNzXCIsXCJuYW1lXCI6XCJDemVjaFwifSx7XCJrZXlcIjpcImN2XCIsXCJuYW1lXCI6XCJDaHV2YXNoXCJ9LHtcImtleVwiOlwiY3lcIixcIm5hbWVcIjpcIldlbHNoXCJ9LHtcImtleVwiOlwiZGUtYXRcIixcIm5hbWVcIjpcIkdlcm1hbiAoQXVzdHJpYSlcIn0se1wia2V5XCI6XCJkYVwiLFwibmFtZVwiOlwiRGFuaXNoXCJ9LHtcImtleVwiOlwiZGUtY2hcIixcIm5hbWVcIjpcIkdlcm1hbiAoU3dpdHplcmxhbmQpXCJ9LHtcImtleVwiOlwiZGVcIixcIm5hbWVcIjpcIkdlcm1hblwifSx7XCJrZXlcIjpcImR2XCIsXCJuYW1lXCI6XCJNYWxkaXZpYW5cIn0se1wia2V5XCI6XCJlbFwiLFwibmFtZVwiOlwiR3JlZWtcIn0se1wia2V5XCI6XCJlbi1hdVwiLFwibmFtZVwiOlwiRW5nbGlzaCAoQXVzdHJhbGlhKVwifSx7XCJrZXlcIjpcImVuLWNhXCIsXCJuYW1lXCI6XCJFbmdsaXNoIChDYW5hZGEpXCJ9LHtcImtleVwiOlwiZW4tZ2JcIixcIm5hbWVcIjpcIkVuZ2xpc2ggKFVuaXRlZCBLaW5nZG9tKVwifSx7XCJrZXlcIjpcImVuLWllXCIsXCJuYW1lXCI6XCJFbmdsaXNoIChJcmVsYW5kKVwifSx7XCJrZXlcIjpcImVuLWlsXCIsXCJuYW1lXCI6XCJFbmdsaXNoIChJc3JhZWwpXCJ9LHtcImtleVwiOlwiZW4taW5cIixcIm5hbWVcIjpcIkVuZ2xpc2ggKEluZGlhKVwifSx7XCJrZXlcIjpcImVuLW56XCIsXCJuYW1lXCI6XCJFbmdsaXNoIChOZXcgWmVhbGFuZClcIn0se1wia2V5XCI6XCJlbi1zZ1wiLFwibmFtZVwiOlwiRW5nbGlzaCAoU2luZ2Fwb3JlKVwifSx7XCJrZXlcIjpcImVuLXR0XCIsXCJuYW1lXCI6XCJFbmdsaXNoIChUcmluaWRhZCAmIFRvYmFnbylcIn0se1wia2V5XCI6XCJlb1wiLFwibmFtZVwiOlwiRXNwZXJhbnRvXCJ9LHtcImtleVwiOlwiZW5cIixcIm5hbWVcIjpcIkVuZ2xpc2hcIn0se1wia2V5XCI6XCJlcy1kb1wiLFwibmFtZVwiOlwiU3BhbmlzaCAoRG9taW5pY2FuIFJlcHVibGljKVwifSx7XCJrZXlcIjpcImVzLW14XCIsXCJuYW1lXCI6XCJTcGFuaXNoIChNZXhpY28pXCJ9LHtcImtleVwiOlwiZXMtcHJcIixcIm5hbWVcIjpcIlNwYW5pc2ggKFB1ZXJ0byBSaWNvKVwifSx7XCJrZXlcIjpcImVzLXVzXCIsXCJuYW1lXCI6XCJTcGFuaXNoIChVbml0ZWQgU3RhdGVzKVwifSx7XCJrZXlcIjpcImV0XCIsXCJuYW1lXCI6XCJFc3RvbmlhblwifSx7XCJrZXlcIjpcImVzXCIsXCJuYW1lXCI6XCJTcGFuaXNoXCJ9LHtcImtleVwiOlwiZXVcIixcIm5hbWVcIjpcIkJhc3F1ZVwifSx7XCJrZXlcIjpcImZhXCIsXCJuYW1lXCI6XCJQZXJzaWFuXCJ9LHtcImtleVwiOlwiZm9cIixcIm5hbWVcIjpcIkZhcm9lc2VcIn0se1wia2V5XCI6XCJmaVwiLFwibmFtZVwiOlwiRmlubmlzaFwifSx7XCJrZXlcIjpcImZyLWNhXCIsXCJuYW1lXCI6XCJGcmVuY2ggKENhbmFkYSlcIn0se1wia2V5XCI6XCJmci1jaFwiLFwibmFtZVwiOlwiRnJlbmNoIChTd2l0emVybGFuZClcIn0se1wia2V5XCI6XCJmclwiLFwibmFtZVwiOlwiRnJlbmNoXCJ9LHtcImtleVwiOlwiZnlcIixcIm5hbWVcIjpcIkZyaXNpYW5cIn0se1wia2V5XCI6XCJnYVwiLFwibmFtZVwiOlwiSXJpc2ggb3IgSXJpc2ggR2FlbGljXCJ9LHtcImtleVwiOlwiZ2RcIixcIm5hbWVcIjpcIlNjb3R0aXNoIEdhZWxpY1wifSx7XCJrZXlcIjpcImdvbS1sYXRuXCIsXCJuYW1lXCI6XCJLb25rYW5pIExhdGluIHNjcmlwdFwifSx7XCJrZXlcIjpcImdsXCIsXCJuYW1lXCI6XCJHYWxpY2lhblwifSx7XCJrZXlcIjpcImd1XCIsXCJuYW1lXCI6XCJHdWphcmF0aVwifSx7XCJrZXlcIjpcImhlXCIsXCJuYW1lXCI6XCJIZWJyZXdcIn0se1wia2V5XCI6XCJoaVwiLFwibmFtZVwiOlwiSGluZGlcIn0se1wia2V5XCI6XCJoclwiLFwibmFtZVwiOlwiQ3JvYXRpYW5cIn0se1wia2V5XCI6XCJodVwiLFwibmFtZVwiOlwiSHVuZ2FyaWFuXCJ9LHtcImtleVwiOlwiaHRcIixcIm5hbWVcIjpcIkhhaXRpYW4gQ3Jlb2xlIChIYWl0aSlcIn0se1wia2V5XCI6XCJoeS1hbVwiLFwibmFtZVwiOlwiQXJtZW5pYW5cIn0se1wia2V5XCI6XCJpZFwiLFwibmFtZVwiOlwiSW5kb25lc2lhblwifSx7XCJrZXlcIjpcImlzXCIsXCJuYW1lXCI6XCJJY2VsYW5kaWNcIn0se1wia2V5XCI6XCJpdC1jaFwiLFwibmFtZVwiOlwiSXRhbGlhbiAoU3dpdHplcmxhbmQpXCJ9LHtcImtleVwiOlwiaXRcIixcIm5hbWVcIjpcIkl0YWxpYW5cIn0se1wia2V5XCI6XCJqYVwiLFwibmFtZVwiOlwiSmFwYW5lc2VcIn0se1wia2V5XCI6XCJqdlwiLFwibmFtZVwiOlwiSmF2YW5lc2VcIn0se1wia2V5XCI6XCJrYVwiLFwibmFtZVwiOlwiR2VvcmdpYW5cIn0se1wia2V5XCI6XCJra1wiLFwibmFtZVwiOlwiS2F6YWtoXCJ9LHtcImtleVwiOlwia21cIixcIm5hbWVcIjpcIkNhbWJvZGlhblwifSx7XCJrZXlcIjpcImtuXCIsXCJuYW1lXCI6XCJLYW5uYWRhXCJ9LHtcImtleVwiOlwia29cIixcIm5hbWVcIjpcIktvcmVhblwifSx7XCJrZXlcIjpcImt1XCIsXCJuYW1lXCI6XCJLdXJkaXNoXCJ9LHtcImtleVwiOlwia3lcIixcIm5hbWVcIjpcIkt5cmd5elwifSx7XCJrZXlcIjpcImxiXCIsXCJuYW1lXCI6XCJMdXhlbWJvdXJnaXNoXCJ9LHtcImtleVwiOlwibG9cIixcIm5hbWVcIjpcIkxhb1wifSx7XCJrZXlcIjpcImx0XCIsXCJuYW1lXCI6XCJMaXRodWFuaWFuXCJ9LHtcImtleVwiOlwibHZcIixcIm5hbWVcIjpcIkxhdHZpYW5cIn0se1wia2V5XCI6XCJtZVwiLFwibmFtZVwiOlwiTW9udGVuZWdyaW5cIn0se1wia2V5XCI6XCJtaVwiLFwibmFtZVwiOlwiTWFvcmlcIn0se1wia2V5XCI6XCJta1wiLFwibmFtZVwiOlwiTWFjZWRvbmlhblwifSx7XCJrZXlcIjpcIm1sXCIsXCJuYW1lXCI6XCJNYWxheWFsYW1cIn0se1wia2V5XCI6XCJtblwiLFwibmFtZVwiOlwiTW9uZ29saWFuXCJ9LHtcImtleVwiOlwibXJcIixcIm5hbWVcIjpcIk1hcmF0aGlcIn0se1wia2V5XCI6XCJtcy1teVwiLFwibmFtZVwiOlwiTWFsYXlcIn0se1wia2V5XCI6XCJtc1wiLFwibmFtZVwiOlwiTWFsYXlcIn0se1wia2V5XCI6XCJtdFwiLFwibmFtZVwiOlwiTWFsdGVzZSAoTWFsdGEpXCJ9LHtcImtleVwiOlwibXlcIixcIm5hbWVcIjpcIkJ1cm1lc2VcIn0se1wia2V5XCI6XCJuYlwiLFwibmFtZVwiOlwiTm9yd2VnaWFuIEJva23DpWxcIn0se1wia2V5XCI6XCJuZVwiLFwibmFtZVwiOlwiTmVwYWxlc2VcIn0se1wia2V5XCI6XCJubC1iZVwiLFwibmFtZVwiOlwiRHV0Y2ggKEJlbGdpdW0pXCJ9LHtcImtleVwiOlwibmxcIixcIm5hbWVcIjpcIkR1dGNoXCJ9LHtcImtleVwiOlwicGxcIixcIm5hbWVcIjpcIlBvbGlzaFwifSx7XCJrZXlcIjpcInB0LWJyXCIsXCJuYW1lXCI6XCJQb3J0dWd1ZXNlIChCcmF6aWwpXCJ9LHtcImtleVwiOlwicHRcIixcIm5hbWVcIjpcIlBvcnR1Z3Vlc2VcIn0se1wia2V5XCI6XCJyblwiLFwibmFtZVwiOlwiS2lydW5kaVwifSx7XCJrZXlcIjpcInJvXCIsXCJuYW1lXCI6XCJSb21hbmlhblwifSx7XCJrZXlcIjpcInJ1XCIsXCJuYW1lXCI6XCJSdXNzaWFuXCJ9LHtcImtleVwiOlwicndcIixcIm5hbWVcIjpcIktpbnlhcndhbmRhIChSd2FuZGEpXCJ9LHtcImtleVwiOlwic2RcIixcIm5hbWVcIjpcIlNpbmRoaVwifSx7XCJrZXlcIjpcInNlXCIsXCJuYW1lXCI6XCJOb3J0aGVybiBTYW1pXCJ9LHtcImtleVwiOlwic2lcIixcIm5hbWVcIjpcIlNpbmhhbGVzZVwifSx7XCJrZXlcIjpcInNrXCIsXCJuYW1lXCI6XCJTbG92YWtcIn0se1wia2V5XCI6XCJzbFwiLFwibmFtZVwiOlwiU2xvdmVuaWFuXCJ9LHtcImtleVwiOlwic3FcIixcIm5hbWVcIjpcIkFsYmFuaWFuXCJ9LHtcImtleVwiOlwic3ItY3lybFwiLFwibmFtZVwiOlwiU2VyYmlhbiBDeXJpbGxpY1wifSx7XCJrZXlcIjpcInNzXCIsXCJuYW1lXCI6XCJzaVN3YXRpXCJ9LHtcImtleVwiOlwic3YtZmlcIixcIm5hbWVcIjpcIkZpbmxhbmQgU3dlZGlzaFwifSx7XCJrZXlcIjpcInNyXCIsXCJuYW1lXCI6XCJTZXJiaWFuXCJ9LHtcImtleVwiOlwic3ZcIixcIm5hbWVcIjpcIlN3ZWRpc2hcIn0se1wia2V5XCI6XCJzd1wiLFwibmFtZVwiOlwiU3dhaGlsaVwifSx7XCJrZXlcIjpcInRhXCIsXCJuYW1lXCI6XCJUYW1pbFwifSx7XCJrZXlcIjpcInRlXCIsXCJuYW1lXCI6XCJUZWx1Z3VcIn0se1wia2V5XCI6XCJ0ZXRcIixcIm5hbWVcIjpcIlRldHVuIERpbGkgKEVhc3QgVGltb3IpXCJ9LHtcImtleVwiOlwidGdcIixcIm5hbWVcIjpcIlRhamlrXCJ9LHtcImtleVwiOlwidGhcIixcIm5hbWVcIjpcIlRoYWlcIn0se1wia2V5XCI6XCJ0a1wiLFwibmFtZVwiOlwiVHVya21lblwifSx7XCJrZXlcIjpcInRsLXBoXCIsXCJuYW1lXCI6XCJUYWdhbG9nIChQaGlsaXBwaW5lcylcIn0se1wia2V5XCI6XCJ0bGhcIixcIm5hbWVcIjpcIktsaW5nb25cIn0se1wia2V5XCI6XCJ0clwiLFwibmFtZVwiOlwiVHVya2lzaFwifSx7XCJrZXlcIjpcInR6bFwiLFwibmFtZVwiOlwiVGFsb3NzYW5cIn0se1wia2V5XCI6XCJ0em0tbGF0blwiLFwibmFtZVwiOlwiQ2VudHJhbCBBdGxhcyBUYW1hemlnaHQgTGF0aW5cIn0se1wia2V5XCI6XCJ0em1cIixcIm5hbWVcIjpcIkNlbnRyYWwgQXRsYXMgVGFtYXppZ2h0XCJ9LHtcImtleVwiOlwidWctY25cIixcIm5hbWVcIjpcIlV5Z2h1ciAoQ2hpbmEpXCJ9LHtcImtleVwiOlwidWtcIixcIm5hbWVcIjpcIlVrcmFpbmlhblwifSx7XCJrZXlcIjpcInVyXCIsXCJuYW1lXCI6XCJVcmR1XCJ9LHtcImtleVwiOlwidXotbGF0blwiLFwibmFtZVwiOlwiVXpiZWsgTGF0aW5cIn0se1wia2V5XCI6XCJ1elwiLFwibmFtZVwiOlwiVXpiZWtcIn0se1wia2V5XCI6XCJ2aVwiLFwibmFtZVwiOlwiVmlldG5hbWVzZVwifSx7XCJrZXlcIjpcIngtcHNldWRvXCIsXCJuYW1lXCI6XCJQc2V1ZG9cIn0se1wia2V5XCI6XCJ5b1wiLFwibmFtZVwiOlwiWW9ydWJhIE5pZ2VyaWFcIn0se1wia2V5XCI6XCJ6aC1jblwiLFwibmFtZVwiOlwiQ2hpbmVzZSAoQ2hpbmEpXCJ9LHtcImtleVwiOlwiemgtaGtcIixcIm5hbWVcIjpcIkNoaW5lc2UgKEhvbmcgS29uZylcIn0se1wia2V5XCI6XCJ6aC10d1wiLFwibmFtZVwiOlwiQ2hpbmVzZSAoVGFpd2FuKVwifSx7XCJrZXlcIjpcInpoXCIsXCJuYW1lXCI6XCJDaGluZXNlXCJ9LHtcImtleVwiOlwib2MtbG5jXCIsXCJuYW1lXCI6XCJPY2NpdGFuLCBsZW5nYWRvY2lhbiBkaWFsZWN0ZVwifSx7XCJrZXlcIjpcIm5uXCIsXCJuYW1lXCI6XCJOeW5vcnNrXCJ9LHtcImtleVwiOlwicGEtaW5cIixcIm5hbWVcIjpcIlB1bmphYmkgKEluZGlhKVwifV1cbmltcG9ydCAnZGF5anMvbG9jYWxlL2FmLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYW0uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hci1kei5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLWlxLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXIta3cuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hci1seS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLW1hLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXItc2EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hci10bi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXouanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9iZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JnLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYmkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ibS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JuLWJkLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYm4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9iby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYnMuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9jYS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2NzLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvY3YuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9jeS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2RhLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZGUtYXQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9kZS1jaC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2RlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZHYuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLWF1LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4tY2EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi1nYi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLWllLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4taWwuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi1pbi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLW56LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4tc2cuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi10dC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW8uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lcy1kby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VzLW14LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZXMtcHIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lcy11cy5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VzLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZXQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ldS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2ZhLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZmkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9mby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2ZyLWNhLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZnItY2guanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9mci5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2Z5LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZ2EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9nZC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2dsLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZ29tLWxhdG4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ndS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2hlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaGkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9oci5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2h0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaHUuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9oeS1hbS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2lkLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaXMuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9pdC1jaC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2l0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvamEuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9qdi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2thLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUva2suanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9rbS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2tuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUva28uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9rdS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2t5LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbGIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9sby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2x0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbHYuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21pLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbWsuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tbC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21uLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbXIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tcy1teS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21zLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbXQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9teS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL25iLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbmUuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ubC1iZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL25sLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbm4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9vYy1sbmMuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9wYS1pbi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3BsLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvcHQtYnIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9wdC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3JuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvcm8uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ydS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3J3LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc2QuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3NpLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc2suanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zbC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3NxLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3ItY3lybC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3NyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3MuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zdi1maS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3N2LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3cuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90YS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3RlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdGV0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdGcuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90aC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3RrLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdGwtcGguanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90bGguanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90ci5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3R6bC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3R6bS1sYXRuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdHptLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdWctY24uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS91ay5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3VyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdXotbGF0bi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3V6LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdmkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS94LXBzZXVkby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3lvLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvemgtY24uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS96aC1oay5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3poLXR3LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvemguanMnXG5cbi8vIEV4dGVuZCBkYXlqcyB3aXRoIHBsdWdpbnNcbmRheWpzLmV4dGVuZCh3ZWVrZGF5KVxuZGF5anMuZXh0ZW5kKHdlZWtPZlllYXIpXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JBZnRlcilcbmRheWpzLmV4dGVuZChpc1NhbWVPckJlZm9yZSlcbmRheWpzLmV4dGVuZChpc0JldHdlZW4pXG5kYXlqcy5leHRlbmQobWluTWF4KVxuZGF5anMuZXh0ZW5kKHRpbWV6b25lKVxuZGF5anMuZXh0ZW5kKHV0YylcbmRheWpzLmV4dGVuZChsb2NhbGVEYXRhKVxuXG5leHBvcnQgZGVmYXVsdCBkYXlqc1xuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmNvbnN0IGFsZXJ0VmFyaWFudHMgPSBjdmEoXG4gICdyZWxhdGl2ZSB3LWZ1bGwgcm91bmRlZC1sZyBib3JkZXIgcHgtNCBweS0zIHRleHQtc20gZ3JpZCBoYXMtWz5zdmddOmdyaWQtY29scy1bY2FsYyh2YXIoLS1zcGFjaW5nKSo0KV8xZnJdIGdyaWQtY29scy1bMF8xZnJdIGhhcy1bPnN2Z106Z2FwLXgtMyBnYXAteS0wLjUgaXRlbXMtc3RhcnQgWyY+c3ZnXTpzaXplLTQgWyY+c3ZnXTp0cmFuc2xhdGUteS0wLjUgWyY+c3ZnXTp0ZXh0LWN1cnJlbnQnLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6IHtcbiAgICAgICAgZGVmYXVsdDogJ2JnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQnLFxuICAgICAgICBkZXN0cnVjdGl2ZTpcbiAgICAgICAgICAndGV4dC1kZXN0cnVjdGl2ZSBiZy1jYXJkIFsmPnN2Z106dGV4dC1jdXJyZW50ICo6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1kZXN0cnVjdGl2ZS85MCcsXG4gICAgICAgIHByaW1hcnk6XG4gICAgICAgICAgJ2JnLWJsdWUtNTAgZGFyazpiZy1ibHVlLTk1MC8yMCBib3JkZXItYmx1ZS0yMDAgZGFyazpib3JkZXItYmx1ZS04MDAgdGV4dC1ibHVlLTkwMCBkYXJrOnRleHQtYmx1ZS0xMDAgWyY+c3ZnXTp0ZXh0LWJsdWUtNjAwIGRhcms6WyY+c3ZnXTp0ZXh0LWJsdWUtNDAwICo6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1ibHVlLTgwMCBkYXJrOio6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1ibHVlLTIwMCcsXG4gICAgICAgIHNlY29uZGFyeTpcbiAgICAgICAgICAnYmctZ3JheS01MCBkYXJrOmJnLWdyYXktOTUwLzIwIGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTgwMCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC1ncmF5LTEwMCBbJj5zdmddOnRleHQtZ3JheS02MDAgZGFyazpbJj5zdmddOnRleHQtZ3JheS00MDAgKjpkYXRhLVtzbG90PWFsZXJ0LWRlc2NyaXB0aW9uXTp0ZXh0LWdyYXktODAwIGRhcms6KjpkYXRhLVtzbG90PWFsZXJ0LWRlc2NyaXB0aW9uXTp0ZXh0LWdyYXktMjAwJyxcbiAgICAgICAgc3VjY2VzczpcbiAgICAgICAgICAnYmctZ3JlZW4tNTAgZGFyazpiZy1ncmVlbi05NTAvMjAgYm9yZGVyLWdyZWVuLTIwMCBkYXJrOmJvcmRlci1ncmVlbi04MDAgdGV4dC1ncmVlbi05MDAgZGFyazp0ZXh0LWdyZWVuLTEwMCBbJj5zdmddOnRleHQtZ3JlZW4tNjAwIGRhcms6WyY+c3ZnXTp0ZXh0LWdyZWVuLTQwMCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQtZ3JlZW4tODAwIGRhcms6KjpkYXRhLVtzbG90PWFsZXJ0LWRlc2NyaXB0aW9uXTp0ZXh0LWdyZWVuLTIwMCcsXG4gICAgICAgIHdhcm5pbmc6XG4gICAgICAgICAgJ2JnLXllbGxvdy01MCBkYXJrOmJnLXllbGxvdy05NTAvMjAgYm9yZGVyLXllbGxvdy0yMDAgZGFyazpib3JkZXIteWVsbG93LTgwMCB0ZXh0LXllbGxvdy05MDAgZGFyazp0ZXh0LXllbGxvdy0xMDAgWyY+c3ZnXTp0ZXh0LXllbGxvdy02MDAgZGFyazpbJj5zdmddOnRleHQteWVsbG93LTQwMCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQteWVsbG93LTgwMCBkYXJrOio6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC15ZWxsb3ctMjAwJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6ICdkZWZhdWx0JyxcbiAgICB9LFxuICB9XG4pXG5cbmZ1bmN0aW9uIEFsZXJ0KHtcbiAgY2xhc3NOYW1lLFxuICB2YXJpYW50LFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2Rpdic+ICYgVmFyaWFudFByb3BzPHR5cGVvZiBhbGVydFZhcmlhbnRzPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cImFsZXJ0XCJcbiAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICBjbGFzc05hbWU9e2NuKGFsZXJ0VmFyaWFudHMoeyB2YXJpYW50IH0pLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gQWxlcnRUaXRsZSh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2Rpdic+KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS1zbG90PVwiYWxlcnQtdGl0bGVcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2NvbC1zdGFydC0yIGxpbmUtY2xhbXAtMSBtaW4taC00IGZvbnQtbWVkaXVtIHRyYWNraW5nLXRpZ2h0JyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gQWxlcnREZXNjcmlwdGlvbih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cImFsZXJ0LWRlc2NyaXB0aW9uXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICd0ZXh0LW11dGVkLWZvcmVncm91bmQgY29sLXN0YXJ0LTIgZ3JpZCBqdXN0aWZ5LWl0ZW1zLXN0YXJ0IGdhcC0xIHRleHQtc20gWyZfcF06bGVhZGluZy1yZWxheGVkJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHsgQWxlcnQsIEFsZXJ0VGl0bGUsIEFsZXJ0RGVzY3JpcHRpb24gfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFNsb3QgfSBmcm9tICdAcmFkaXgtdWkvcmVhY3Qtc2xvdCdcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmNvbnN0IGJhZGdlVmFyaWFudHMgPSBjdmEoXG4gICdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCBib3JkZXIgcHgtMiBweS0wLjUgdGV4dC14cyBmb250LW1lZGl1bSB3LWZpdCB3aGl0ZXNwYWNlLW5vd3JhcCBzaHJpbmstMCBbJj5zdmddOnNpemUtMyBnYXAtMSBbJj5zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIHRyYW5zaXRpb24tW2NvbG9yLGJveC1zaGFkb3ddIG92ZXJmbG93LWNsaXAnLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6IHtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAnYm9yZGVyLXRyYW5zcGFyZW50IGJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgW2EmXTpob3ZlcjpiZy1wcmltYXJ5LzkwJyxcbiAgICAgICAgc2Vjb25kYXJ5OlxuICAgICAgICAgICdib3JkZXItdHJhbnNwYXJlbnQgYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgW2EmXTpob3ZlcjpiZy1zZWNvbmRhcnkvOTAnLFxuICAgICAgICBkZXN0cnVjdGl2ZTpcbiAgICAgICAgICAnYm9yZGVyLXRyYW5zcGFyZW50IGJnLWRlc3RydWN0aXZlIHRleHQtd2hpdGUgW2EmXTpob3ZlcjpiZy1kZXN0cnVjdGl2ZS85MCBmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazpmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvNDAgZGFyazpiZy1kZXN0cnVjdGl2ZS82MCcsXG4gICAgICAgIG91dGxpbmU6XG4gICAgICAgICAgJ3RleHQtZm9yZWdyb3VuZCBbYSZdOmhvdmVyOmJnLWFjY2VudCBbYSZdOmhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgdmFyaWFudDogJ2RlZmF1bHQnLFxuICAgIH0sXG4gIH1cbilcblxuZnVuY3Rpb24gQmFkZ2Uoe1xuICBjbGFzc05hbWUsXG4gIHZhcmlhbnQsXG4gIGFzQ2hpbGQgPSBmYWxzZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdzcGFuJz4gJlxuICBWYXJpYW50UHJvcHM8dHlwZW9mIGJhZGdlVmFyaWFudHM+ICYgeyBhc0NoaWxkPzogYm9vbGVhbiB9KSB7XG4gIGNvbnN0IENvbXAgPSBhc0NoaWxkID8gU2xvdCA6ICdzcGFuJ1xuXG4gIHJldHVybiAoXG4gICAgPENvbXBcbiAgICAgIGRhdGEtc2xvdD1cImJhZGdlXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oYmFkZ2VWYXJpYW50cyh7IHZhcmlhbnQgfSksIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBCYWRnZSwgYmFkZ2VWYXJpYW50cyB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gJ0ByYWRpeC11aS9yZWFjdC1zbG90J1xuaW1wb3J0IHsgY3ZhLCB0eXBlIFZhcmlhbnRQcm9wcyB9IGZyb20gJ2NsYXNzLXZhcmlhbmNlLWF1dGhvcml0eSdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuY29uc3QgYnV0dG9uVmFyaWFudHMgPSBjdmEoXG4gIFwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yIHdoaXRlc3BhY2Utbm93cmFwIHJvdW5kZWQtbWQgdGV4dC1zbSBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Zzpub3QoW2NsYXNzKj0nc2l6ZS0nXSldOnNpemUtNCBzaHJpbmstMCBbJl9zdmddOnNocmluay0wIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGZvY3VzLXZpc2libGU6cmluZy1bM3B4XSBhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzQwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmVcIixcbiAge1xuICAgIHZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiB7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgc2hhZG93LXhzIGhvdmVyOmJnLXByaW1hcnkvOTAnLFxuICAgICAgICBkZXN0cnVjdGl2ZTpcbiAgICAgICAgICAnYmctZGVzdHJ1Y3RpdmUgdGV4dC13aGl0ZSBzaGFkb3cteHMgaG92ZXI6YmctZGVzdHJ1Y3RpdmUvOTAgZm9jdXMtdmlzaWJsZTpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6Zm9jdXMtdmlzaWJsZTpyaW5nLWRlc3RydWN0aXZlLzQwIGRhcms6YmctZGVzdHJ1Y3RpdmUvNjAnLFxuICAgICAgICBvdXRsaW5lOlxuICAgICAgICAgICdib3JkZXIgYmctYmFja2dyb3VuZCBzaGFkb3cteHMgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQgZGFyazpiZy1pbnB1dC8zMCBkYXJrOmJvcmRlci1pbnB1dCBkYXJrOmhvdmVyOmJnLWlucHV0LzUwJyxcbiAgICAgICAgc2Vjb25kYXJ5OlxuICAgICAgICAgICdiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCBzaGFkb3cteHMgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwJyxcbiAgICAgICAgZ2hvc3Q6XG4gICAgICAgICAgJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGRhcms6aG92ZXI6YmctYWNjZW50LzUwJyxcbiAgICAgICAgbGluazogJ3RleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lJyxcbiAgICAgIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIGRlZmF1bHQ6ICdoLTkgcHgtNCBweS0yIGhhcy1bPnN2Z106cHgtMycsXG4gICAgICAgIHNtOiAnaC04IHJvdW5kZWQtbWQgZ2FwLTEuNSBweC0zIGhhcy1bPnN2Z106cHgtMi41JyxcbiAgICAgICAgbGc6ICdoLTEwIHJvdW5kZWQtbWQgcHgtNiBoYXMtWz5zdmddOnB4LTQnLFxuICAgICAgICBpY29uOiAnc2l6ZS05JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6ICdkZWZhdWx0JyxcbiAgICAgIHNpemU6ICdkZWZhdWx0JyxcbiAgICB9LFxuICB9XG4pXG5cbmZ1bmN0aW9uIEJ1dHRvbih7XG4gIGNsYXNzTmFtZSxcbiAgdmFyaWFudCxcbiAgc2l6ZSxcbiAgYXNDaGlsZCA9IGZhbHNlLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2J1dHRvbic+ICZcbiAgVmFyaWFudFByb3BzPHR5cGVvZiBidXR0b25WYXJpYW50cz4gJiB7XG4gICAgYXNDaGlsZD86IGJvb2xlYW5cbiAgfSkge1xuICBjb25zdCBDb21wID0gYXNDaGlsZCA/IFNsb3QgOiAnYnV0dG9uJ1xuXG4gIHJldHVybiAoXG4gICAgPENvbXBcbiAgICAgIGRhdGEtc2xvdD1cImJ1dHRvblwiXG4gICAgICBjbGFzc05hbWU9e2NuKGJ1dHRvblZhcmlhbnRzKHsgdmFyaWFudCwgc2l6ZSwgY2xhc3NOYW1lIH0pKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7IEJ1dHRvbiwgYnV0dG9uVmFyaWFudHMgfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IENoZXZyb25MZWZ0LCBDaGV2cm9uUmlnaHQgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5pbXBvcnQgeyBEYXlQaWNrZXIgfSBmcm9tICdyZWFjdC1kYXktcGlja2VyJ1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgYnV0dG9uVmFyaWFudHMgfSBmcm9tICdAL2NvbXBvbmVudHMvdWkvYnV0dG9uJ1xuXG5mdW5jdGlvbiBDYWxlbmRhcih7XG4gIGNsYXNzTmFtZSxcbiAgY2xhc3NOYW1lcyxcbiAgc2hvd091dHNpZGVEYXlzID0gdHJ1ZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEYXlQaWNrZXI+KSB7XG4gIHJldHVybiAoXG4gICAgPERheVBpY2tlclxuICAgICAgc2hvd091dHNpZGVEYXlzPXtzaG93T3V0c2lkZURheXN9XG4gICAgICBjbGFzc05hbWU9e2NuKCdwLTMnLCBjbGFzc05hbWUpfVxuICAgICAgY2xhc3NOYW1lcz17e1xuICAgICAgICBtb250aHM6ICdmbGV4IGZsZXgtY29sIHNtOmZsZXgtcm93IGdhcC0yJyxcbiAgICAgICAgbW9udGg6ICdmbGV4IGZsZXgtY29sIGdhcC00JyxcbiAgICAgICAgY2FwdGlvbjogJ2ZsZXgganVzdGlmeS1jZW50ZXIgcHQtMSByZWxhdGl2ZSBpdGVtcy1jZW50ZXIgdy1mdWxsJyxcbiAgICAgICAgY2FwdGlvbl9sYWJlbDogJ3RleHQtc20gZm9udC1tZWRpdW0nLFxuICAgICAgICBuYXY6ICdmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMScsXG4gICAgICAgIG5hdl9idXR0b246IGNuKFxuICAgICAgICAgIGJ1dHRvblZhcmlhbnRzKHsgdmFyaWFudDogJ291dGxpbmUnIH0pLFxuICAgICAgICAgICdzaXplLTcgYmctdHJhbnNwYXJlbnQgcC0wIG9wYWNpdHktNTAgaG92ZXI6b3BhY2l0eS0xMDAnXG4gICAgICAgICksXG4gICAgICAgIG5hdl9idXR0b25fcHJldmlvdXM6ICdhYnNvbHV0ZSBsZWZ0LTEnLFxuICAgICAgICBuYXZfYnV0dG9uX25leHQ6ICdhYnNvbHV0ZSByaWdodC0xJyxcbiAgICAgICAgdGFibGU6ICd3LWZ1bGwgYm9yZGVyLWNvbGxhcHNlIHNwYWNlLXgtMScsXG4gICAgICAgIGhlYWRfcm93OiAnZmxleCcsXG4gICAgICAgIGhlYWRfY2VsbDpcbiAgICAgICAgICAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHJvdW5kZWQtbWQgdy04IGZvbnQtbm9ybWFsIHRleHQtWzAuOHJlbV0nLFxuICAgICAgICByb3c6ICdmbGV4IHctZnVsbCBtdC0yJyxcbiAgICAgICAgY2VsbDogY24oXG4gICAgICAgICAgJ3JlbGF0aXZlIHAtMCB0ZXh0LWNlbnRlciB0ZXh0LXNtIGZvY3VzLXdpdGhpbjpyZWxhdGl2ZSBmb2N1cy13aXRoaW46ei0yMCBbJjpoYXMoW2FyaWEtc2VsZWN0ZWRdKV06YmctYWNjZW50IFsmOmhhcyhbYXJpYS1zZWxlY3RlZF0uZGF5LXJhbmdlLWVuZCldOnJvdW5kZWQtci1tZCcsXG4gICAgICAgICAgcHJvcHMubW9kZSA9PT0gJ3JhbmdlJ1xuICAgICAgICAgICAgPyAnWyY6aGFzKD4uZGF5LXJhbmdlLWVuZCldOnJvdW5kZWQtci1tZCBbJjpoYXMoPi5kYXktcmFuZ2Utc3RhcnQpXTpyb3VuZGVkLWwtbWQgZmlyc3Q6WyY6aGFzKFthcmlhLXNlbGVjdGVkXSldOnJvdW5kZWQtbC1tZCBsYXN0OlsmOmhhcyhbYXJpYS1zZWxlY3RlZF0pXTpyb3VuZGVkLXItbWQnXG4gICAgICAgICAgICA6ICdbJjpoYXMoW2FyaWEtc2VsZWN0ZWRdKV06cm91bmRlZC1tZCdcbiAgICAgICAgKSxcbiAgICAgICAgZGF5OiBjbihcbiAgICAgICAgICBidXR0b25WYXJpYW50cyh7IHZhcmlhbnQ6ICdnaG9zdCcgfSksXG4gICAgICAgICAgJ3NpemUtOCBwLTAgZm9udC1ub3JtYWwgYXJpYS1zZWxlY3RlZDpvcGFjaXR5LTEwMCdcbiAgICAgICAgKSxcbiAgICAgICAgZGF5X3JhbmdlX3N0YXJ0OlxuICAgICAgICAgICdkYXktcmFuZ2Utc3RhcnQgYXJpYS1zZWxlY3RlZDpiZy1wcmltYXJ5IGFyaWEtc2VsZWN0ZWQ6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQnLFxuICAgICAgICBkYXlfcmFuZ2VfZW5kOlxuICAgICAgICAgICdkYXktcmFuZ2UtZW5kIGFyaWEtc2VsZWN0ZWQ6YmctcHJpbWFyeSBhcmlhLXNlbGVjdGVkOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZGF5X3NlbGVjdGVkOlxuICAgICAgICAgICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGhvdmVyOmJnLXByaW1hcnkgaG92ZXI6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQgZm9jdXM6YmctcHJpbWFyeSBmb2N1czp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcsXG4gICAgICAgIGRheV90b2RheTogJ2JnLWFjY2VudCB0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZGF5X291dHNpZGU6XG4gICAgICAgICAgJ2RheS1vdXRzaWRlIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBhcmlhLXNlbGVjdGVkOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsXG4gICAgICAgIGRheV9kaXNhYmxlZDogJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCBvcGFjaXR5LTUwJyxcbiAgICAgICAgZGF5X3JhbmdlX21pZGRsZTpcbiAgICAgICAgICAnYXJpYS1zZWxlY3RlZDpiZy1hY2NlbnQgYXJpYS1zZWxlY3RlZDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZGF5X2hpZGRlbjogJ2ludmlzaWJsZScsXG4gICAgICAgIC4uLmNsYXNzTmFtZXMsXG4gICAgICB9fVxuICAgICAgY29tcG9uZW50cz17e1xuICAgICAgICBJY29uTGVmdDogKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgICAgICAgPENoZXZyb25MZWZ0IGNsYXNzTmFtZT17Y24oJ3NpemUtNCcsIGNsYXNzTmFtZSl9IHsuLi5wcm9wc30gLz5cbiAgICAgICAgKSxcbiAgICAgICAgSWNvblJpZ2h0OiAoeyBjbGFzc05hbWUsIC4uLnByb3BzIH0pID0+IChcbiAgICAgICAgICA8Q2hldnJvblJpZ2h0IGNsYXNzTmFtZT17Y24oJ3NpemUtNCcsIGNsYXNzTmFtZSl9IHsuLi5wcm9wc30gLz5cbiAgICAgICAgKSxcbiAgICAgIH19XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBDYWxlbmRhciB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgQ2hlY2tib3hQcmltaXRpdmUgZnJvbSAnQHJhZGl4LXVpL3JlYWN0LWNoZWNrYm94J1xuaW1wb3J0IHsgQ2hlY2tJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBDaGVja2JveCh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBDaGVja2JveFByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gKFxuICAgIDxDaGVja2JveFByaW1pdGl2ZS5Sb290XG4gICAgICBkYXRhLXNsb3Q9XCJjaGVja2JveFwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncGVlciBib3JkZXItaW5wdXQgZGFyazpiZy1pbnB1dC8zMCBkYXRhLVtzdGF0ZT1jaGVja2VkXTpiZy1wcmltYXJ5IGRhdGEtW3N0YXRlPWNoZWNrZWRdOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGRhcms6ZGF0YS1bc3RhdGU9Y2hlY2tlZF06YmctcHJpbWFyeSBkYXRhLVtzdGF0ZT1jaGVja2VkXTpib3JkZXItcHJpbWFyeSBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6YXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvNDAgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZSBzaXplLTQgc2hyaW5rLTAgcm91bmRlZC1bNHB4XSBib3JkZXIgc2hhZG93LXhzIHRyYW5zaXRpb24tc2hhZG93IG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAgPENoZWNrYm94UHJpbWl0aXZlLkluZGljYXRvclxuICAgICAgICBkYXRhLXNsb3Q9XCJjaGVja2JveC1pbmRpY2F0b3JcIlxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWN1cnJlbnQgdHJhbnNpdGlvbi1ub25lXCJcbiAgICAgID5cbiAgICAgICAgPENoZWNrSWNvbiBjbGFzc05hbWU9XCJzaXplLTMuNVwiIC8+XG4gICAgICA8L0NoZWNrYm94UHJpbWl0aXZlLkluZGljYXRvcj5cbiAgICA8L0NoZWNrYm94UHJpbWl0aXZlLlJvb3Q+XG4gIClcbn1cblxuZXhwb3J0IHsgQ2hlY2tib3ggfVxuIiwKICAgICJpbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgQ2FsZW5kYXIgYXMgQ2FsZW5kYXJJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJ0AvY29tcG9uZW50cy91aS9idXR0b24nXG5pbXBvcnQgeyBDYWxlbmRhciB9IGZyb20gJ0AvY29tcG9uZW50cy91aS9jYWxlbmRhcidcbmltcG9ydCB7XG4gIFBvcG92ZXIsXG4gIFBvcG92ZXJDb250ZW50LFxuICBQb3BvdmVyVHJpZ2dlcixcbn0gZnJvbSAnQC9jb21wb25lbnRzL3VpL3BvcG92ZXInXG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFBvcG92ZXJDbG9zZSB9IGZyb20gJ0ByYWRpeC11aS9yZWFjdC1wb3BvdmVyJ1xuXG5pbnRlcmZhY2UgRGF0ZVBpY2tlclByb3BzIHtcbiAgZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZFxuICBzZXREYXRlOiAoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICBsYWJlbD86IHN0cmluZ1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgY2xvc2VPblNlbGVjdD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERhdGVQaWNrZXIoe1xuICBkYXRlLFxuICBjbG9zZU9uU2VsZWN0LFxuICBzZXREYXRlLFxuICBsYWJlbCA9ICdQaWNrIGEgZGF0ZScsXG4gIGNsYXNzTmFtZSxcbn06IERhdGVQaWNrZXJQcm9wcykge1xuICBjb25zdCBwb3BPdmVyUmVmID0gdXNlUmVmPEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbD4obnVsbClcblxuICBjb25zdCBvblNlbGVjdCA9IChkYXRlOiBEYXRlIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgc2V0RGF0ZShkYXRlKVxuICAgIGlmIChjbG9zZU9uU2VsZWN0KSB7XG4gICAgICBwb3BPdmVyUmVmLmN1cnJlbnQ/LmNsaWNrKClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgPFBvcG92ZXI+XG4gICAgICAgIDxQb3BvdmVyVHJpZ2dlciBhc0NoaWxkPlxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICd3LWZ1bGwganVzdGlmeS1zdGFydCB0ZXh0LWxlZnQgZm9udC1ub3JtYWwnLFxuICAgICAgICAgICAgICAhZGF0ZSAmJiAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kJ1xuICAgICAgICAgICAgKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Q2FsZW5kYXJJY29uIGNsYXNzTmFtZT1cIm1yLTIgaC00IHctNFwiIC8+XG4gICAgICAgICAgICB7ZGF0ZSA/IGRheWpzKGRhdGUpLmZvcm1hdCgnTU1NIEQsIFlZWVknKSA6IDxzcGFuPntsYWJlbH08L3NwYW4+fVxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L1BvcG92ZXJUcmlnZ2VyPlxuICAgICAgICA8UG9wb3ZlckNvbnRlbnQgY2xhc3NOYW1lPVwidy1hdXRvIHAtMFwiIGFsaWduPVwic3RhcnRcIj5cbiAgICAgICAgICA8UG9wb3ZlckNsb3NlIHJlZj17cG9wT3ZlclJlZn0gLz5cbiAgICAgICAgICA8Q2FsZW5kYXJcbiAgICAgICAgICAgIG1vZGU9XCJzaW5nbGVcIlxuICAgICAgICAgICAgc2VsZWN0ZWQ9e2RhdGV9XG4gICAgICAgICAgICBvblNlbGVjdD17b25TZWxlY3R9XG4gICAgICAgICAgICBpbml0aWFsRm9jdXNcbiAgICAgICAgICAvPlxuICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgPC9Qb3BvdmVyPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgUG9wb3ZlclByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtcG9wb3ZlcidcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gUG9wb3Zlcih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgUG9wb3ZlclByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gPFBvcG92ZXJQcmltaXRpdmUuUm9vdCBkYXRhLXNsb3Q9XCJwb3BvdmVyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBQb3BvdmVyVHJpZ2dlcih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgUG9wb3ZlclByaW1pdGl2ZS5UcmlnZ2VyPikge1xuICByZXR1cm4gPFBvcG92ZXJQcmltaXRpdmUuVHJpZ2dlciBkYXRhLXNsb3Q9XCJwb3BvdmVyLXRyaWdnZXJcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIFBvcG92ZXJDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBhbGlnbiA9ICdjZW50ZXInLFxuICBzaWRlT2Zmc2V0ID0gNCxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBQb3BvdmVyUHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPFBvcG92ZXJQcmltaXRpdmUuUG9ydGFsPlxuICAgICAgPFBvcG92ZXJQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJwb3BvdmVyLWNvbnRlbnRcIlxuICAgICAgICBhbGlnbj17YWxpZ259XG4gICAgICAgIHNpZGVPZmZzZXQ9e3NpZGVPZmZzZXR9XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2JnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1vcGVuXTp6b29tLWluLTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIHotNTAgdy03MiBvcmlnaW4tKC0tcmFkaXgtcG9wb3Zlci1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pIHJvdW5kZWQtbWQgYm9yZGVyIHAtNCBzaGFkb3ctbWQgb3V0bGluZS1oaWRkZW4nLFxuICAgICAgICAgIGNsYXNzTmFtZVxuICAgICAgICApfVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPlxuICAgIDwvUG9wb3ZlclByaW1pdGl2ZS5Qb3J0YWw+XG4gIClcbn1cblxuZnVuY3Rpb24gUG9wb3ZlckFuY2hvcih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgUG9wb3ZlclByaW1pdGl2ZS5BbmNob3I+KSB7XG4gIHJldHVybiA8UG9wb3ZlclByaW1pdGl2ZS5BbmNob3IgZGF0YS1zbG90PVwicG9wb3Zlci1hbmNob3JcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmV4cG9ydCB7IFBvcG92ZXIsIFBvcG92ZXJUcmlnZ2VyLCBQb3BvdmVyQ29udGVudCwgUG9wb3ZlckFuY2hvciB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgRGlhbG9nUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1kaWFsb2cnXG5pbXBvcnQgeyBYSWNvbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gRGlhbG9nKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEaWFsb2dQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIDxEaWFsb2dQcmltaXRpdmUuUm9vdCBkYXRhLXNsb3Q9XCJkaWFsb2dcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIERpYWxvZ1RyaWdnZXIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERpYWxvZ1ByaW1pdGl2ZS5UcmlnZ2VyPikge1xuICByZXR1cm4gPERpYWxvZ1ByaW1pdGl2ZS5UcmlnZ2VyIGRhdGEtc2xvdD1cImRpYWxvZy10cmlnZ2VyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEaWFsb2dQb3J0YWwoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERpYWxvZ1ByaW1pdGl2ZS5Qb3J0YWw+KSB7XG4gIHJldHVybiA8RGlhbG9nUHJpbWl0aXZlLlBvcnRhbCBkYXRhLXNsb3Q9XCJkaWFsb2ctcG9ydGFsXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEaWFsb2dDbG9zZSh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLkNsb3NlPikge1xuICByZXR1cm4gPERpYWxvZ1ByaW1pdGl2ZS5DbG9zZSBkYXRhLXNsb3Q9XCJkaWFsb2ctY2xvc2VcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIERpYWxvZ092ZXJsYXkoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLk92ZXJsYXk+KSB7XG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1ByaW1pdGl2ZS5PdmVybGF5XG4gICAgICBkYXRhLXNsb3Q9XCJkaWFsb2ctb3ZlcmxheVwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZml4ZWQgaW5zZXQtMCB6LTUwIGJnLWJsYWNrLzUwJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlhbG9nQ29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1BvcnRhbCBkYXRhLXNsb3Q9XCJkaWFsb2ctcG9ydGFsXCI+XG4gICAgICA8RGlhbG9nT3ZlcmxheSAvPlxuICAgICAgPERpYWxvZ1ByaW1pdGl2ZS5Db250ZW50XG4gICAgICAgIGRhdGEtc2xvdD1cImRpYWxvZy1jb250ZW50XCJcbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAnYmctYmFja2dyb3VuZCBkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluIGRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQgZGF0YS1bc3RhdGU9Y2xvc2VkXTpmYWRlLW91dC0wIGRhdGEtW3N0YXRlPW9wZW5dOmZhZGUtaW4tMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3N0YXRlPW9wZW5dOnpvb20taW4tOTUgZml4ZWQgdG9wLVs1MCVdIGxlZnQtWzUwJV0gei01MCBncmlkIHctZnVsbCBtYXgtdy1bY2FsYygxMDAlLTJyZW0pXSB0cmFuc2xhdGUteC1bLTUwJV0gdHJhbnNsYXRlLXktWy01MCVdIGdhcC00IHJvdW5kZWQtbGcgYm9yZGVyIHAtNiBzaGFkb3ctbGcgZHVyYXRpb24tMjAwIHNtOm1heC13LWxnJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDxEaWFsb2dQcmltaXRpdmUuQ2xvc2UgY2xhc3NOYW1lPVwicmluZy1vZmZzZXQtYmFja2dyb3VuZCBmb2N1czpyaW5nLXJpbmcgZGF0YS1bc3RhdGU9b3Blbl06YmctYWNjZW50IGRhdGEtW3N0YXRlPW9wZW5dOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBhYnNvbHV0ZSB0b3AtNCByaWdodC00IHJvdW5kZWQteHMgb3BhY2l0eS03MCB0cmFuc2l0aW9uLW9wYWNpdHkgaG92ZXI6b3BhY2l0eS0xMDAgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctb2Zmc2V0LTIgZm9jdXM6b3V0bGluZS1oaWRkZW4gZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIj5cbiAgICAgICAgICA8WEljb24gLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XG4gICAgICAgIDwvRGlhbG9nUHJpbWl0aXZlLkNsb3NlPlxuICAgICAgPC9EaWFsb2dQcmltaXRpdmUuQ29udGVudD5cbiAgICA8L0RpYWxvZ1BvcnRhbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBEaWFsb2dIZWFkZXIoeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cImRpYWxvZy1oZWFkZXJcIlxuICAgICAgY2xhc3NOYW1lPXtjbignZmxleCBmbGV4LWNvbCBnYXAtMiB0ZXh0LWNlbnRlciBzbTp0ZXh0LWxlZnQnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlhbG9nRm9vdGVyKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwnZGl2Jz4pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXNsb3Q9XCJkaWFsb2ctZm9vdGVyXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdmbGV4IGZsZXgtY29sLXJldmVyc2UgZ2FwLTIgc206ZmxleC1yb3cgc206anVzdGlmeS1lbmQnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEaWFsb2dUaXRsZSh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEaWFsb2dQcmltaXRpdmUuVGl0bGU+KSB7XG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1ByaW1pdGl2ZS5UaXRsZVxuICAgICAgZGF0YS1zbG90PVwiZGlhbG9nLXRpdGxlXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ3RleHQtbGcgbGVhZGluZy1ub25lIGZvbnQtc2VtaWJvbGQnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlhbG9nRGVzY3JpcHRpb24oe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLkRlc2NyaXB0aW9uPikge1xuICByZXR1cm4gKFxuICAgIDxEaWFsb2dQcmltaXRpdmUuRGVzY3JpcHRpb25cbiAgICAgIGRhdGEtc2xvdD1cImRpYWxvZy1kZXNjcmlwdGlvblwiXG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1zbScsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQge1xuICBEaWFsb2csXG4gIERpYWxvZ0Nsb3NlLFxuICBEaWFsb2dDb250ZW50LFxuICBEaWFsb2dEZXNjcmlwdGlvbixcbiAgRGlhbG9nRm9vdGVyLFxuICBEaWFsb2dIZWFkZXIsXG4gIERpYWxvZ092ZXJsYXksXG4gIERpYWxvZ1BvcnRhbCxcbiAgRGlhbG9nVGl0bGUsXG4gIERpYWxvZ1RyaWdnZXIsXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgRHJvcGRvd25NZW51UHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51J1xuaW1wb3J0IHsgQ2hlY2tJY29uLCBDaGV2cm9uUmlnaHRJY29uLCBDaXJjbGVJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnUoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gPERyb3Bkb3duTWVudVByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnVcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVBvcnRhbCh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlBvcnRhbD4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlBvcnRhbCBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXBvcnRhbFwiIHsuLi5wcm9wc30gLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVUcmlnZ2VyKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlRyaWdnZXJcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtdHJpZ2dlclwiXG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBzaWRlT2Zmc2V0ID0gNCxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlBvcnRhbD5cbiAgICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWNvbnRlbnRcIlxuICAgICAgICBzaWRlT2Zmc2V0PXtzaWRlT2Zmc2V0fVxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPWNsb3NlZF06em9vbS1vdXQtOTUgZGF0YS1bc3RhdGU9b3Blbl06em9vbS1pbi05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiB6LTUwIG1heC1oLSgtLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0KSBtaW4tdy1bOHJlbV0gb3JpZ2luLSgtLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luKSBvdmVyZmxvdy14LWhpZGRlbiBvdmVyZmxvdy15LWF1dG8gcm91bmRlZC1tZCBib3JkZXIgcC0xIHNoYWRvdy1tZCcsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9Ecm9wZG93bk1lbnVQcmltaXRpdmUuUG9ydGFsPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudUdyb3VwKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuR3JvdXA+KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5Hcm91cCBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWdyb3VwXCIgey4uLnByb3BzfSAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudUl0ZW0oe1xuICBjbGFzc05hbWUsXG4gIGluc2V0LFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5JdGVtPiAmIHtcbiAgaW5zZXQ/OiBib29sZWFuXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZGVzdHJ1Y3RpdmUnXG59KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5JdGVtXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWl0ZW1cIlxuICAgICAgZGF0YS1pbnNldD17aW5zZXR9XG4gICAgICBkYXRhLXZhcmlhbnQ9e3ZhcmlhbnR9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICBcImZvY3VzOmJnLWFjY2VudCBmb2N1czp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGRhdGEtW3ZhcmlhbnQ9ZGVzdHJ1Y3RpdmVdOnRleHQtZGVzdHJ1Y3RpdmUgZGF0YS1bdmFyaWFudD1kZXN0cnVjdGl2ZV06Zm9jdXM6YmctZGVzdHJ1Y3RpdmUvMTAgZGFyazpkYXRhLVt2YXJpYW50PWRlc3RydWN0aXZlXTpmb2N1czpiZy1kZXN0cnVjdGl2ZS8yMCBkYXRhLVt2YXJpYW50PWRlc3RydWN0aXZlXTpmb2N1czp0ZXh0LWRlc3RydWN0aXZlIGRhdGEtW3ZhcmlhbnQ9ZGVzdHJ1Y3RpdmVdOio6W3N2Z106IXRleHQtZGVzdHJ1Y3RpdmUgWyZfc3ZnOm5vdChbY2xhc3MqPSd0ZXh0LSddKV06dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHJlbGF0aXZlIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtc20gcHgtMiBweS0xLjUgdGV4dC1zbSBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBkYXRhLVtpbnNldF06cGwtOCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtKHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgY2hlY2tlZCxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuQ2hlY2tib3hJdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuQ2hlY2tib3hJdGVtXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWNoZWNrYm94LWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCByZWxhdGl2ZSBmbGV4IGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtIHB5LTEuNSBwci0yIHBsLTggdGV4dC1zbSBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgY2hlY2tlZD17Y2hlY2tlZH1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIGxlZnQtMiBmbGV4IHNpemUtMy41IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLkl0ZW1JbmRpY2F0b3I+XG4gICAgICAgICAgPENoZWNrSWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgICAgICA8L0Ryb3Bkb3duTWVudVByaW1pdGl2ZS5JdGVtSW5kaWNhdG9yPlxuICAgICAgPC9zcGFuPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvRHJvcGRvd25NZW51UHJpbWl0aXZlLkNoZWNrYm94SXRlbT5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVSYWRpb0dyb3VwKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuUmFkaW9Hcm91cD4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlJhZGlvR3JvdXBcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtcmFkaW8tZ3JvdXBcIlxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51UmFkaW9JdGVtKHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuUmFkaW9JdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuUmFkaW9JdGVtXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXJhZGlvLWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCByZWxhdGl2ZSBmbGV4IGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtIHB5LTEuNSBwci0yIHBsLTggdGV4dC1zbSBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgbGVmdC0yIGZsZXggc2l6ZS0zLjUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuSXRlbUluZGljYXRvcj5cbiAgICAgICAgICA8Q2lyY2xlSWNvbiBjbGFzc05hbWU9XCJzaXplLTIgZmlsbC1jdXJyZW50XCIgLz5cbiAgICAgICAgPC9Ecm9wZG93bk1lbnVQcmltaXRpdmUuSXRlbUluZGljYXRvcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0Ryb3Bkb3duTWVudVByaW1pdGl2ZS5SYWRpb0l0ZW0+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51TGFiZWwoe1xuICBjbGFzc05hbWUsXG4gIGluc2V0LFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5MYWJlbD4gJiB7XG4gIGluc2V0PzogYm9vbGVhblxufSkge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuTGFiZWxcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtbGFiZWxcIlxuICAgICAgZGF0YS1pbnNldD17aW5zZXR9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncHgtMiBweS0xLjUgdGV4dC1zbSBmb250LW1lZGl1bSBkYXRhLVtpbnNldF06cGwtOCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVNlcGFyYXRvcih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuU2VwYXJhdG9yPikge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuU2VwYXJhdG9yXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXNlcGFyYXRvclwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdiZy1ib3JkZXIgLW14LTEgbXktMSBoLXB4JywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVNob3J0Y3V0KHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J3NwYW4nPikge1xuICByZXR1cm4gKFxuICAgIDxzcGFuXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXNob3J0Y3V0XCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICd0ZXh0LW11dGVkLWZvcmVncm91bmQgbWwtYXV0byB0ZXh0LXhzIHRyYWNraW5nLXdpZGVzdCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVN1Yih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlN1Yj4pIHtcbiAgcmV0dXJuIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuU3ViIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtc3ViXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVTdWJUcmlnZ2VyKHtcbiAgY2xhc3NOYW1lLFxuICBpbnNldCxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlN1YlRyaWdnZXI+ICYge1xuICBpbnNldD86IGJvb2xlYW5cbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlN1YlRyaWdnZXJcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtc3ViLXRyaWdnZXJcIlxuICAgICAgZGF0YS1pbnNldD17aW5zZXR9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgZGF0YS1bc3RhdGU9b3Blbl06YmctYWNjZW50IGRhdGEtW3N0YXRlPW9wZW5dOnRleHQtYWNjZW50LWZvcmVncm91bmQgZmxleCBjdXJzb3ItZGVmYXVsdCBpdGVtcy1jZW50ZXIgcm91bmRlZC1zbSBweC0yIHB5LTEuNSB0ZXh0LXNtIG91dGxpbmUtaGlkZGVuIHNlbGVjdC1ub25lIGRhdGEtW2luc2V0XTpwbC04JyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDxDaGV2cm9uUmlnaHRJY29uIGNsYXNzTmFtZT1cIm1sLWF1dG8gc2l6ZS00XCIgLz5cbiAgICA8L0Ryb3Bkb3duTWVudVByaW1pdGl2ZS5TdWJUcmlnZ2VyPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVN1YkNvbnRlbnQoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlN1YkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5TdWJDb250ZW50XG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXN1Yi1jb250ZW50XCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPWNsb3NlZF06em9vbS1vdXQtOTUgZGF0YS1bc3RhdGU9b3Blbl06em9vbS1pbi05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiB6LTUwIG1pbi13LVs4cmVtXSBvcmlnaW4tKC0tcmFkaXgtZHJvcGRvd24tbWVudS1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pIG92ZXJmbG93LWNsaXAgcm91bmRlZC1tZCBib3JkZXIgcC0xIHNoYWRvdy1sZycsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7XG4gIERyb3Bkb3duTWVudSxcbiAgRHJvcGRvd25NZW51UG9ydGFsLFxuICBEcm9wZG93bk1lbnVUcmlnZ2VyLFxuICBEcm9wZG93bk1lbnVDb250ZW50LFxuICBEcm9wZG93bk1lbnVHcm91cCxcbiAgRHJvcGRvd25NZW51TGFiZWwsXG4gIERyb3Bkb3duTWVudUl0ZW0sXG4gIERyb3Bkb3duTWVudUNoZWNrYm94SXRlbSxcbiAgRHJvcGRvd25NZW51UmFkaW9Hcm91cCxcbiAgRHJvcGRvd25NZW51UmFkaW9JdGVtLFxuICBEcm9wZG93bk1lbnVTZXBhcmF0b3IsXG4gIERyb3Bkb3duTWVudVNob3J0Y3V0LFxuICBEcm9wZG93bk1lbnVTdWIsXG4gIERyb3Bkb3duTWVudVN1YlRyaWdnZXIsXG4gIERyb3Bkb3duTWVudVN1YkNvbnRlbnQsXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUgKiBhcyBMYWJlbFByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtbGFiZWwnXG5pbXBvcnQgeyBTbG90IH0gZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXNsb3QnXG5pbXBvcnQge1xuICBDb250cm9sbGVyLFxuICBGb3JtUHJvdmlkZXIsXG4gIHVzZUZvcm1Db250ZXh0LFxuICB1c2VGb3JtU3RhdGUsXG4gIHR5cGUgQ29udHJvbGxlclByb3BzLFxuICB0eXBlIEZpZWxkUGF0aCxcbiAgdHlwZSBGaWVsZFZhbHVlcyxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJ1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgTGFiZWwgfSBmcm9tICdAL2NvbXBvbmVudHMvdWkvbGFiZWwnXG5cbmNvbnN0IEZvcm0gPSBGb3JtUHJvdmlkZXJcblxudHlwZSBGb3JtRmllbGRDb250ZXh0VmFsdWU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4gPSB7XG4gIG5hbWU6IFROYW1lXG59XG5cbmNvbnN0IEZvcm1GaWVsZENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PEZvcm1GaWVsZENvbnRleHRWYWx1ZT4oXG4gIHt9IGFzIEZvcm1GaWVsZENvbnRleHRWYWx1ZVxuKVxuXG5jb25zdCBGb3JtRmllbGQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICAuLi5wcm9wc1xufTogQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEZvcm1GaWVsZENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgbmFtZTogcHJvcHMubmFtZSB9fT5cbiAgICAgIDxDb250cm9sbGVyIHsuLi5wcm9wc30gLz5cbiAgICA8L0Zvcm1GaWVsZENvbnRleHQuUHJvdmlkZXI+XG4gIClcbn1cblxuY29uc3QgdXNlRm9ybUZpZWxkID0gKCkgPT4ge1xuICBjb25zdCBmaWVsZENvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZvcm1GaWVsZENvbnRleHQpXG4gIGNvbnN0IGl0ZW1Db250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGb3JtSXRlbUNvbnRleHQpXG4gIGNvbnN0IHsgZ2V0RmllbGRTdGF0ZSB9ID0gdXNlRm9ybUNvbnRleHQoKVxuICBjb25zdCBmb3JtU3RhdGUgPSB1c2VGb3JtU3RhdGUoeyBuYW1lOiBmaWVsZENvbnRleHQubmFtZSB9KVxuICBjb25zdCBmaWVsZFN0YXRlID0gZ2V0RmllbGRTdGF0ZShmaWVsZENvbnRleHQubmFtZSwgZm9ybVN0YXRlKVxuXG4gIGlmICghZmllbGRDb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VGb3JtRmllbGQgc2hvdWxkIGJlIHVzZWQgd2l0aGluIDxGb3JtRmllbGQ+JylcbiAgfVxuXG4gIGNvbnN0IHsgaWQgfSA9IGl0ZW1Db250ZXh0XG5cbiAgcmV0dXJuIHtcbiAgICBpZCxcbiAgICBuYW1lOiBmaWVsZENvbnRleHQubmFtZSxcbiAgICBmb3JtSXRlbUlkOiBgJHtpZH0tZm9ybS1pdGVtYCxcbiAgICBmb3JtRGVzY3JpcHRpb25JZDogYCR7aWR9LWZvcm0taXRlbS1kZXNjcmlwdGlvbmAsXG4gICAgZm9ybU1lc3NhZ2VJZDogYCR7aWR9LWZvcm0taXRlbS1tZXNzYWdlYCxcbiAgICAuLi5maWVsZFN0YXRlLFxuICB9XG59XG5cbnR5cGUgRm9ybUl0ZW1Db250ZXh0VmFsdWUgPSB7XG4gIGlkOiBzdHJpbmdcbn1cblxuY29uc3QgRm9ybUl0ZW1Db250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dDxGb3JtSXRlbUNvbnRleHRWYWx1ZT4oXG4gIHt9IGFzIEZvcm1JdGVtQ29udGV4dFZhbHVlXG4pXG5cbmZ1bmN0aW9uIEZvcm1JdGVtKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwnZGl2Jz4pIHtcbiAgY29uc3QgaWQgPSBSZWFjdC51c2VJZCgpXG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUl0ZW1Db250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IGlkIH19PlxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXNsb3Q9XCJmb3JtLWl0ZW1cIlxuICAgICAgICBjbGFzc05hbWU9e2NuKCdncmlkIGdhcC0yJywgY2xhc3NOYW1lKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgLz5cbiAgICA8L0Zvcm1JdGVtQ29udGV4dC5Qcm92aWRlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBGb3JtTGFiZWwoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgTGFiZWxQcmltaXRpdmUuUm9vdD4pIHtcbiAgY29uc3QgeyBlcnJvciwgZm9ybUl0ZW1JZCB9ID0gdXNlRm9ybUZpZWxkKClcblxuICByZXR1cm4gKFxuICAgIDxMYWJlbFxuICAgICAgZGF0YS1zbG90PVwiZm9ybS1sYWJlbFwiXG4gICAgICBkYXRhLWVycm9yPXshIWVycm9yfVxuICAgICAgY2xhc3NOYW1lPXtjbignZGF0YS1bZXJyb3I9dHJ1ZV06dGV4dC1kZXN0cnVjdGl2ZScsIGNsYXNzTmFtZSl9XG4gICAgICBodG1sRm9yPXtmb3JtSXRlbUlkfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRm9ybUNvbnRyb2woeyAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2xvdD4pIHtcbiAgY29uc3QgeyBlcnJvciwgZm9ybUl0ZW1JZCwgZm9ybURlc2NyaXB0aW9uSWQsIGZvcm1NZXNzYWdlSWQgfSA9IHVzZUZvcm1GaWVsZCgpXG5cbiAgcmV0dXJuIChcbiAgICA8U2xvdFxuICAgICAgZGF0YS1zbG90PVwiZm9ybS1jb250cm9sXCJcbiAgICAgIGlkPXtmb3JtSXRlbUlkfVxuICAgICAgYXJpYS1kZXNjcmliZWRieT17XG4gICAgICAgICFlcnJvclxuICAgICAgICAgID8gYCR7Zm9ybURlc2NyaXB0aW9uSWR9YFxuICAgICAgICAgIDogYCR7Zm9ybURlc2NyaXB0aW9uSWR9ICR7Zm9ybU1lc3NhZ2VJZH1gXG4gICAgICB9XG4gICAgICBhcmlhLWludmFsaWQ9eyEhZXJyb3J9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBGb3JtRGVzY3JpcHRpb24oeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdwJz4pIHtcbiAgY29uc3QgeyBmb3JtRGVzY3JpcHRpb25JZCB9ID0gdXNlRm9ybUZpZWxkKClcblxuICByZXR1cm4gKFxuICAgIDxwXG4gICAgICBkYXRhLXNsb3Q9XCJmb3JtLWRlc2NyaXB0aW9uXCJcbiAgICAgIGlkPXtmb3JtRGVzY3JpcHRpb25JZH1cbiAgICAgIGNsYXNzTmFtZT17Y24oJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCB0ZXh0LXNtJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIEZvcm1NZXNzYWdlKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwncCc+KSB7XG4gIGNvbnN0IHsgZXJyb3IsIGZvcm1NZXNzYWdlSWQgfSA9IHVzZUZvcm1GaWVsZCgpXG4gIGNvbnN0IGJvZHkgPSBlcnJvciA/IFN0cmluZyhlcnJvcj8ubWVzc2FnZSA/PyAnJykgOiBwcm9wcy5jaGlsZHJlblxuXG4gIGlmICghYm9keSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxwXG4gICAgICBkYXRhLXNsb3Q9XCJmb3JtLW1lc3NhZ2VcIlxuICAgICAgaWQ9e2Zvcm1NZXNzYWdlSWR9XG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LWRlc3RydWN0aXZlIHRleHQtc20nLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIHtib2R5fVxuICAgIDwvcD5cbiAgKVxufVxuXG5leHBvcnQge1xuICB1c2VGb3JtRmllbGQsXG4gIEZvcm0sXG4gIEZvcm1JdGVtLFxuICBGb3JtTGFiZWwsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtRGVzY3JpcHRpb24sXG4gIEZvcm1NZXNzYWdlLFxuICBGb3JtRmllbGQsXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdF9fZGVmYXVsdCBmcm9tICdyZWFjdCc7XG5cbnZhciBpc0NoZWNrQm94SW5wdXQgPSAoZWxlbWVudCkgPT4gZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnO1xuXG52YXIgaXNEYXRlT2JqZWN0ID0gKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG5cbnZhciBpc051bGxPclVuZGVmaW5lZCA9ICh2YWx1ZSkgPT4gdmFsdWUgPT0gbnVsbDtcblxuY29uc3QgaXNPYmplY3RUeXBlID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xudmFyIGlzT2JqZWN0ID0gKHZhbHVlKSA9PiAhaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpICYmXG4gICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgaXNPYmplY3RUeXBlKHZhbHVlKSAmJlxuICAgICFpc0RhdGVPYmplY3QodmFsdWUpO1xuXG52YXIgZ2V0RXZlbnRWYWx1ZSA9IChldmVudCkgPT4gaXNPYmplY3QoZXZlbnQpICYmIGV2ZW50LnRhcmdldFxuICAgID8gaXNDaGVja0JveElucHV0KGV2ZW50LnRhcmdldClcbiAgICAgICAgPyBldmVudC50YXJnZXQuY2hlY2tlZFxuICAgICAgICA6IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgIDogZXZlbnQ7XG5cbnZhciBnZXROb2RlUGFyZW50TmFtZSA9IChuYW1lKSA9PiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLnNlYXJjaCgvXFwuXFxkKyhcXC58JCkvKSkgfHwgbmFtZTtcblxudmFyIGlzTmFtZUluRmllbGRBcnJheSA9IChuYW1lcywgbmFtZSkgPT4gbmFtZXMuaGFzKGdldE5vZGVQYXJlbnROYW1lKG5hbWUpKTtcblxudmFyIGlzUGxhaW5PYmplY3QgPSAodGVtcE9iamVjdCkgPT4ge1xuICAgIGNvbnN0IHByb3RvdHlwZUNvcHkgPSB0ZW1wT2JqZWN0LmNvbnN0cnVjdG9yICYmIHRlbXBPYmplY3QuY29uc3RydWN0b3IucHJvdG90eXBlO1xuICAgIHJldHVybiAoaXNPYmplY3QocHJvdG90eXBlQ29weSkgJiYgcHJvdG90eXBlQ29weS5oYXNPd25Qcm9wZXJ0eSgnaXNQcm90b3R5cGVPZicpKTtcbn07XG5cbnZhciBpc1dlYiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHdpbmRvdy5IVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG5mdW5jdGlvbiBjbG9uZU9iamVjdChkYXRhKSB7XG4gICAgbGV0IGNvcHk7XG4gICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoZGF0YSk7XG4gICAgY29uc3QgaXNGaWxlTGlzdEluc3RhbmNlID0gdHlwZW9mIEZpbGVMaXN0ICE9PSAndW5kZWZpbmVkJyA/IGRhdGEgaW5zdGFuY2VvZiBGaWxlTGlzdCA6IGZhbHNlO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBjb3B5ID0gbmV3IERhdGUoZGF0YSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCEoaXNXZWIgJiYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iIHx8IGlzRmlsZUxpc3RJbnN0YW5jZSkpICYmXG4gICAgICAgIChpc0FycmF5IHx8IGlzT2JqZWN0KGRhdGEpKSkge1xuICAgICAgICBjb3B5ID0gaXNBcnJheSA/IFtdIDoge307XG4gICAgICAgIGlmICghaXNBcnJheSAmJiAhaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgY29weSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb3B5W2tleV0gPSBjbG9uZU9iamVjdChkYXRhW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBjb3B5O1xufVxuXG52YXIgaXNLZXkgPSAodmFsdWUpID0+IC9eXFx3KiQvLnRlc3QodmFsdWUpO1xuXG52YXIgaXNVbmRlZmluZWQgPSAodmFsKSA9PiB2YWwgPT09IHVuZGVmaW5lZDtcblxudmFyIGNvbXBhY3QgPSAodmFsdWUpID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZmlsdGVyKEJvb2xlYW4pIDogW107XG5cbnZhciBzdHJpbmdUb1BhdGggPSAoaW5wdXQpID0+IGNvbXBhY3QoaW5wdXQucmVwbGFjZSgvW1wifCddfFxcXS9nLCAnJykuc3BsaXQoL1xcLnxcXFsvKSk7XG5cbnZhciBnZXQgPSAob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgICBpZiAoIXBhdGggfHwgIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gKGlzS2V5KHBhdGgpID8gW3BhdGhdIDogc3RyaW5nVG9QYXRoKHBhdGgpKS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiBpc051bGxPclVuZGVmaW5lZChyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0W2tleV0sIG9iamVjdCk7XG4gICAgcmV0dXJuIGlzVW5kZWZpbmVkKHJlc3VsdCkgfHwgcmVzdWx0ID09PSBvYmplY3RcbiAgICAgICAgPyBpc1VuZGVmaW5lZChvYmplY3RbcGF0aF0pXG4gICAgICAgICAgICA/IGRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgOiBvYmplY3RbcGF0aF1cbiAgICAgICAgOiByZXN1bHQ7XG59O1xuXG52YXIgaXNCb29sZWFuID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcblxudmFyIHNldCA9IChvYmplY3QsIHBhdGgsIHZhbHVlKSA9PiB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgY29uc3QgdGVtcFBhdGggPSBpc0tleShwYXRoKSA/IFtwYXRoXSA6IHN0cmluZ1RvUGF0aChwYXRoKTtcbiAgICBjb25zdCBsZW5ndGggPSB0ZW1wUGF0aC5sZW5ndGg7XG4gICAgY29uc3QgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0ZW1wUGF0aFtpbmRleF07XG4gICAgICAgIGxldCBuZXdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAoaW5kZXggIT09IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgY29uc3Qgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID1cbiAgICAgICAgICAgICAgICBpc09iamVjdChvYmpWYWx1ZSkgfHwgQXJyYXkuaXNBcnJheShvYmpWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA6ICFpc05hTigrdGVtcFBhdGhbaW5kZXggKyAxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3Rba2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgICB9XG59O1xuXG5jb25zdCBFVkVOVFMgPSB7XG4gICAgQkxVUjogJ2JsdXInLFxuICAgIEZPQ1VTX09VVDogJ2ZvY3Vzb3V0JyxcbiAgICBDSEFOR0U6ICdjaGFuZ2UnLFxufTtcbmNvbnN0IFZBTElEQVRJT05fTU9ERSA9IHtcbiAgICBvbkJsdXI6ICdvbkJsdXInLFxuICAgIG9uQ2hhbmdlOiAnb25DaGFuZ2UnLFxuICAgIG9uU3VibWl0OiAnb25TdWJtaXQnLFxuICAgIG9uVG91Y2hlZDogJ29uVG91Y2hlZCcsXG4gICAgYWxsOiAnYWxsJyxcbn07XG5jb25zdCBJTlBVVF9WQUxJREFUSU9OX1JVTEVTID0ge1xuICAgIG1heDogJ21heCcsXG4gICAgbWluOiAnbWluJyxcbiAgICBtYXhMZW5ndGg6ICdtYXhMZW5ndGgnLFxuICAgIG1pbkxlbmd0aDogJ21pbkxlbmd0aCcsXG4gICAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgIHZhbGlkYXRlOiAndmFsaWRhdGUnLFxufTtcblxuY29uc3QgSG9va0Zvcm1Db250ZXh0ID0gUmVhY3RfX2RlZmF1bHQuY3JlYXRlQ29udGV4dChudWxsKTtcbkhvb2tGb3JtQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdIb29rRm9ybUNvbnRleHQnO1xuLyoqXG4gKiBUaGlzIGN1c3RvbSBob29rIGFsbG93cyB5b3UgdG8gYWNjZXNzIHRoZSBmb3JtIGNvbnRleHQuIHVzZUZvcm1Db250ZXh0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gZGVlcGx5IG5lc3RlZCBzdHJ1Y3R1cmVzLCB3aGVyZSBpdCB3b3VsZCBiZWNvbWUgaW5jb252ZW5pZW50IHRvIHBhc3MgdGhlIGNvbnRleHQgYXMgYSBwcm9wLiBUbyBiZSB1c2VkIHdpdGgge0BsaW5rIEZvcm1Qcm92aWRlcn0uXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWZvcm1jb250ZXh0KSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tdjctZm9ybS1jb250ZXh0LXl0dWRpKVxuICpcbiAqIEByZXR1cm5zIHJldHVybiBhbGwgdXNlRm9ybSBtZXRob2RzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCBtZXRob2RzID0gdXNlRm9ybSgpO1xuICogICBjb25zdCBvblN1Ym1pdCA9IGRhdGEgPT4gY29uc29sZS5sb2coZGF0YSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxGb3JtUHJvdmlkZXIgey4uLm1ldGhvZHN9ID5cbiAqICAgICAgIDxmb3JtIG9uU3VibWl0PXttZXRob2RzLmhhbmRsZVN1Ym1pdChvblN1Ym1pdCl9PlxuICogICAgICAgICA8TmVzdGVkSW5wdXQgLz5cbiAqICAgICAgICAgPGlucHV0IHR5cGU9XCJzdWJtaXRcIiAvPlxuICogICAgICAgPC9mb3JtPlxuICogICAgIDwvRm9ybVByb3ZpZGVyPlxuICogICApO1xuICogfVxuICpcbiAqICBmdW5jdGlvbiBOZXN0ZWRJbnB1dCgpIHtcbiAqICAgY29uc3QgeyByZWdpc3RlciB9ID0gdXNlRm9ybUNvbnRleHQoKTsgLy8gcmV0cmlldmUgYWxsIGhvb2sgbWV0aG9kc1xuICogICByZXR1cm4gPGlucHV0IHsuLi5yZWdpc3RlcihcInRlc3RcIil9IC8+O1xuICogfVxuICogYGBgXG4gKi9cbmNvbnN0IHVzZUZvcm1Db250ZXh0ID0gKCkgPT4gUmVhY3RfX2RlZmF1bHQudXNlQ29udGV4dChIb29rRm9ybUNvbnRleHQpO1xuLyoqXG4gKiBBIHByb3ZpZGVyIGNvbXBvbmVudCB0aGF0IHByb3BhZ2F0ZXMgdGhlIGB1c2VGb3JtYCBtZXRob2RzIHRvIGFsbCBjaGlsZHJlbiBjb21wb25lbnRzIHZpYSBbUmVhY3QgQ29udGV4dF0oaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2NvbnRleHQuaHRtbCkgQVBJLiBUbyBiZSB1c2VkIHdpdGgge0BsaW5rIHVzZUZvcm1Db250ZXh0fS5cbiAqXG4gKiBAcmVtYXJrc1xuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNlZm9ybWNvbnRleHQpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS12Ny1mb3JtLWNvbnRleHQteXR1ZGkpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gYWxsIHVzZUZvcm0gbWV0aG9kc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgbWV0aG9kcyA9IHVzZUZvcm0oKTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSBkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Rm9ybVByb3ZpZGVyIHsuLi5tZXRob2RzfSA+XG4gKiAgICAgICA8Zm9ybSBvblN1Ym1pdD17bWV0aG9kcy5oYW5kbGVTdWJtaXQob25TdWJtaXQpfT5cbiAqICAgICAgICAgPE5lc3RlZElucHV0IC8+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwic3VibWl0XCIgLz5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICA8L0Zvcm1Qcm92aWRlcj5cbiAqICAgKTtcbiAqIH1cbiAqXG4gKiAgZnVuY3Rpb24gTmVzdGVkSW5wdXQoKSB7XG4gKiAgIGNvbnN0IHsgcmVnaXN0ZXIgfSA9IHVzZUZvcm1Db250ZXh0KCk7IC8vIHJldHJpZXZlIGFsbCBob29rIG1ldGhvZHNcbiAqICAgcmV0dXJuIDxpbnB1dCB7Li4ucmVnaXN0ZXIoXCJ0ZXN0XCIpfSAvPjtcbiAqIH1cbiAqIGBgYFxuICovXG5jb25zdCBGb3JtUHJvdmlkZXIgPSAocHJvcHMpID0+IHtcbiAgICBjb25zdCB7IGNoaWxkcmVuLCAuLi5kYXRhIH0gPSBwcm9wcztcbiAgICByZXR1cm4gKFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSG9va0Zvcm1Db250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBkYXRhIH0sIGNoaWxkcmVuKSk7XG59O1xuXG52YXIgZ2V0UHJveHlGb3JtU3RhdGUgPSAoZm9ybVN0YXRlLCBjb250cm9sLCBsb2NhbFByb3h5Rm9ybVN0YXRlLCBpc1Jvb3QgPSB0cnVlKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBkZWZhdWx0VmFsdWVzOiBjb250cm9sLl9kZWZhdWx0VmFsdWVzLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybVN0YXRlKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIGtleSwge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2tleSA9IGtleTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5fcHJveHlGb3JtU3RhdGVbX2tleV0gIT09IFZBTElEQVRJT05fTU9ERS5hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5fcHJveHlGb3JtU3RhdGVbX2tleV0gPSAhaXNSb290IHx8IFZBTElEQVRJT05fTU9ERS5hbGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvY2FsUHJveHlGb3JtU3RhdGUgJiYgKGxvY2FsUHJveHlGb3JtU3RhdGVbX2tleV0gPSB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybVN0YXRlW19rZXldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG5cbi8qKlxuICogVGhpcyBjdXN0b20gaG9vayBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSB0byBlYWNoIGZvcm0gc3RhdGUsIGFuZCBpc29sYXRlIHRoZSByZS1yZW5kZXIgYXQgdGhlIGN1c3RvbSBob29rIGxldmVsLiBJdCBoYXMgaXRzIHNjb3BlIGluIHRlcm1zIG9mIGZvcm0gc3RhdGUgc3Vic2NyaXB0aW9uLCBzbyBpdCB3b3VsZCBub3QgYWZmZWN0IG90aGVyIHVzZUZvcm1TdGF0ZSBhbmQgdXNlRm9ybS4gVXNpbmcgdGhpcyBob29rIGNhbiByZWR1Y2UgdGhlIHJlLXJlbmRlciBpbXBhY3Qgb24gbGFyZ2UgYW5kIGNvbXBsZXggZm9ybSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcmVtYXJrc1xuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNlZm9ybXN0YXRlKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy91c2Vmb3Jtc3RhdGUtNzV4bHkpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gaW5jbHVkZSBvcHRpb25zIG9uIHNwZWNpZnkgZmllbGRzIHRvIHN1YnNjcmliZS4ge0BsaW5rIFVzZUZvcm1TdGF0ZVJldHVybn1cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBcHAoKSB7XG4gKiAgIGNvbnN0IHsgcmVnaXN0ZXIsIGhhbmRsZVN1Ym1pdCwgY29udHJvbCB9ID0gdXNlRm9ybSh7XG4gKiAgICAgZGVmYXVsdFZhbHVlczoge1xuICogICAgIGZpcnN0TmFtZTogXCJmaXJzdE5hbWVcIlxuICogICB9fSk7XG4gKiAgIGNvbnN0IHsgZGlydHlGaWVsZHMgfSA9IHVzZUZvcm1TdGF0ZSh7XG4gKiAgICAgY29udHJvbFxuICogICB9KTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSAoZGF0YSkgPT4gY29uc29sZS5sb2coZGF0YSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXQob25TdWJtaXQpfT5cbiAqICAgICAgIDxpbnB1dCB7Li4ucmVnaXN0ZXIoXCJmaXJzdE5hbWVcIil9IHBsYWNlaG9sZGVyPVwiRmlyc3QgTmFtZVwiIC8+XG4gKiAgICAgICB7ZGlydHlGaWVsZHMuZmlyc3ROYW1lICYmIDxwPkZpZWxkIGlzIGRpcnR5LjwvcD59XG4gKiAgICAgICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIC8+XG4gKiAgICAgPC9mb3JtPlxuICogICApO1xuICogfVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHVzZUZvcm1TdGF0ZShwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IHsgY29udHJvbCA9IG1ldGhvZHMuY29udHJvbCwgZGlzYWJsZWQsIG5hbWUsIGV4YWN0IH0gPSBwcm9wcyB8fCB7fTtcbiAgICBjb25zdCBbZm9ybVN0YXRlLCB1cGRhdGVGb3JtU3RhdGVdID0gUmVhY3RfX2RlZmF1bHQudXNlU3RhdGUoY29udHJvbC5fZm9ybVN0YXRlKTtcbiAgICBjb25zdCBfbG9jYWxQcm94eUZvcm1TdGF0ZSA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZih7XG4gICAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBkaXJ0eUZpZWxkczogZmFsc2UsXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IGZhbHNlLFxuICAgICAgICB2YWxpZGF0aW5nRmllbGRzOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZGF0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yczogZmFsc2UsXG4gICAgfSk7XG4gICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiBjb250cm9sLl9zdWJzY3JpYmUoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBmb3JtU3RhdGU6IF9sb2NhbFByb3h5Rm9ybVN0YXRlLmN1cnJlbnQsXG4gICAgICAgIGV4YWN0LFxuICAgICAgICBjYWxsYmFjazogKGZvcm1TdGF0ZSkgPT4ge1xuICAgICAgICAgICAgIWRpc2FibGVkICYmXG4gICAgICAgICAgICAgICAgdXBkYXRlRm9ybVN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29udHJvbC5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAuLi5mb3JtU3RhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfSksIFtuYW1lLCBkaXNhYmxlZCwgZXhhY3RdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBfbG9jYWxQcm94eUZvcm1TdGF0ZS5jdXJyZW50LmlzVmFsaWQgJiYgY29udHJvbC5fc2V0VmFsaWQodHJ1ZSk7XG4gICAgfSwgW2NvbnRyb2xdKTtcbiAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQudXNlTWVtbygoKSA9PiBnZXRQcm94eUZvcm1TdGF0ZShmb3JtU3RhdGUsIGNvbnRyb2wsIF9sb2NhbFByb3h5Rm9ybVN0YXRlLmN1cnJlbnQsIGZhbHNlKSwgW2Zvcm1TdGF0ZSwgY29udHJvbF0pO1xufVxuXG52YXIgaXNTdHJpbmcgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG5cbnZhciBnZW5lcmF0ZVdhdGNoT3V0cHV0ID0gKG5hbWVzLCBfbmFtZXMsIGZvcm1WYWx1ZXMsIGlzR2xvYmFsLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgICBpZiAoaXNTdHJpbmcobmFtZXMpKSB7XG4gICAgICAgIGlzR2xvYmFsICYmIF9uYW1lcy53YXRjaC5hZGQobmFtZXMpO1xuICAgICAgICByZXR1cm4gZ2V0KGZvcm1WYWx1ZXMsIG5hbWVzLCBkZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuYW1lcykpIHtcbiAgICAgICAgcmV0dXJuIG5hbWVzLm1hcCgoZmllbGROYW1lKSA9PiAoaXNHbG9iYWwgJiYgX25hbWVzLndhdGNoLmFkZChmaWVsZE5hbWUpLFxuICAgICAgICAgICAgZ2V0KGZvcm1WYWx1ZXMsIGZpZWxkTmFtZSkpKTtcbiAgICB9XG4gICAgaXNHbG9iYWwgJiYgKF9uYW1lcy53YXRjaEFsbCA9IHRydWUpO1xuICAgIHJldHVybiBmb3JtVmFsdWVzO1xufTtcblxuLyoqXG4gKiBDdXN0b20gaG9vayB0byBzdWJzY3JpYmUgdG8gZmllbGQgY2hhbmdlIGFuZCBpc29sYXRlIHJlLXJlbmRlcmluZyBhdCB0aGUgY29tcG9uZW50IGxldmVsLlxuICpcbiAqIEByZW1hcmtzXG4gKlxuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNld2F0Y2gpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS12Ny10cy11c2V3YXRjaC1oOWk1ZSlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm0oKTtcbiAqIGNvbnN0IHZhbHVlcyA9IHVzZVdhdGNoKHtcbiAqICAgbmFtZTogXCJmaWVsZE5hbWVcIlxuICogICBjb250cm9sLFxuICogfSlcbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1c2VXYXRjaChwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IHsgY29udHJvbCA9IG1ldGhvZHMuY29udHJvbCwgbmFtZSwgZGVmYXVsdFZhbHVlLCBkaXNhYmxlZCwgZXhhY3QsIH0gPSBwcm9wcyB8fCB7fTtcbiAgICBjb25zdCBfZGVmYXVsdFZhbHVlID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKGRlZmF1bHRWYWx1ZSk7XG4gICAgY29uc3QgW3ZhbHVlLCB1cGRhdGVWYWx1ZV0gPSBSZWFjdF9fZGVmYXVsdC51c2VTdGF0ZShjb250cm9sLl9nZXRXYXRjaChuYW1lLCBfZGVmYXVsdFZhbHVlLmN1cnJlbnQpKTtcbiAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IGNvbnRyb2wuX3N1YnNjcmliZSh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZvcm1TdGF0ZToge1xuICAgICAgICAgICAgdmFsdWVzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBleGFjdCxcbiAgICAgICAgY2FsbGJhY2s6IChmb3JtU3RhdGUpID0+ICFkaXNhYmxlZCAmJlxuICAgICAgICAgICAgdXBkYXRlVmFsdWUoZ2VuZXJhdGVXYXRjaE91dHB1dChuYW1lLCBjb250cm9sLl9uYW1lcywgZm9ybVN0YXRlLnZhbHVlcyB8fCBjb250cm9sLl9mb3JtVmFsdWVzLCBmYWxzZSwgX2RlZmF1bHRWYWx1ZS5jdXJyZW50KSksXG4gICAgfSksIFtuYW1lLCBjb250cm9sLCBkaXNhYmxlZCwgZXhhY3RdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4gY29udHJvbC5fcmVtb3ZlVW5tb3VudGVkKCkpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBDdXN0b20gaG9vayB0byB3b3JrIHdpdGggY29udHJvbGxlZCBjb21wb25lbnQsIHRoaXMgZnVuY3Rpb24gcHJvdmlkZSB5b3Ugd2l0aCBib3RoIGZvcm0gYW5kIGZpZWxkIGxldmVsIHN0YXRlLiBSZS1yZW5kZXIgaXMgaXNvbGF0ZWQgYXQgdGhlIGhvb2sgbGV2ZWwuXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWNvbnRyb2xsZXIpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3VzZWNvbnRyb2xsZXItMG84cHgpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gdGhlIHBhdGggbmFtZSB0byB0aGUgZm9ybSBmaWVsZCB2YWx1ZSwgYW5kIHZhbGlkYXRpb24gcnVsZXMuXG4gKlxuICogQHJldHVybnMgZmllbGQgcHJvcGVydGllcywgZmllbGQgYW5kIGZvcm0gc3RhdGUuIHtAbGluayBVc2VDb250cm9sbGVyUmV0dXJufVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIElucHV0KHByb3BzKSB7XG4gKiAgIGNvbnN0IHsgZmllbGQsIGZpZWxkU3RhdGUsIGZvcm1TdGF0ZSB9ID0gdXNlQ29udHJvbGxlcihwcm9wcyk7XG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGRpdj5cbiAqICAgICAgIDxpbnB1dCB7Li4uZmllbGR9IHBsYWNlaG9sZGVyPXtwcm9wcy5uYW1lfSAvPlxuICogICAgICAgPHA+e2ZpZWxkU3RhdGUuaXNUb3VjaGVkICYmIFwiVG91Y2hlZFwifTwvcD5cbiAqICAgICAgIDxwPntmb3JtU3RhdGUuaXNTdWJtaXR0ZWQgPyBcInN1Ym1pdHRlZFwiIDogXCJcIn08L3A+XG4gKiAgICAgPC9kaXY+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gdXNlQ29udHJvbGxlcihwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IHsgbmFtZSwgZGlzYWJsZWQsIGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIHNob3VsZFVucmVnaXN0ZXIgfSA9IHByb3BzO1xuICAgIGNvbnN0IGlzQXJyYXlGaWVsZCA9IGlzTmFtZUluRmllbGRBcnJheShjb250cm9sLl9uYW1lcy5hcnJheSwgbmFtZSk7XG4gICAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7XG4gICAgICAgIGNvbnRyb2wsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0KGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIG5hbWUsIGdldChjb250cm9sLl9kZWZhdWx0VmFsdWVzLCBuYW1lLCBwcm9wcy5kZWZhdWx0VmFsdWUpKSxcbiAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgZm9ybVN0YXRlID0gdXNlRm9ybVN0YXRlKHtcbiAgICAgICAgY29udHJvbCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgX3Byb3BzID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKHByb3BzKTtcbiAgICBjb25zdCBfcmVnaXN0ZXJQcm9wcyA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihjb250cm9sLnJlZ2lzdGVyKG5hbWUsIHtcbiAgICAgICAgLi4ucHJvcHMucnVsZXMsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICAuLi4oaXNCb29sZWFuKHByb3BzLmRpc2FibGVkKSA/IHsgZGlzYWJsZWQ6IHByb3BzLmRpc2FibGVkIH0gOiB7fSksXG4gICAgfSkpO1xuICAgIGNvbnN0IGZpZWxkU3RhdGUgPSBSZWFjdF9fZGVmYXVsdC51c2VNZW1vKCgpID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHt9LCB7XG4gICAgICAgIGludmFsaWQ6IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6ICgpID0+ICEhZ2V0KGZvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpLFxuICAgICAgICB9LFxuICAgICAgICBpc0RpcnR5OiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiAhIWdldChmb3JtU3RhdGUuZGlydHlGaWVsZHMsIG5hbWUpLFxuICAgICAgICB9LFxuICAgICAgICBpc1RvdWNoZWQ6IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6ICgpID0+ICEhZ2V0KGZvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSxcbiAgICAgICAgfSxcbiAgICAgICAgaXNWYWxpZGF0aW5nOiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiAhIWdldChmb3JtU3RhdGUudmFsaWRhdGluZ0ZpZWxkcywgbmFtZSksXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiBnZXQoZm9ybVN0YXRlLmVycm9ycywgbmFtZSksXG4gICAgICAgIH0sXG4gICAgfSksIFtmb3JtU3RhdGUsIG5hbWVdKTtcbiAgICBjb25zdCBvbkNoYW5nZSA9IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKChldmVudCkgPT4gX3JlZ2lzdGVyUHJvcHMuY3VycmVudC5vbkNoYW5nZSh7XG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgdmFsdWU6IGdldEV2ZW50VmFsdWUoZXZlbnQpLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogRVZFTlRTLkNIQU5HRSxcbiAgICB9KSwgW25hbWVdKTtcbiAgICBjb25zdCBvbkJsdXIgPSBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjaygoKSA9PiBfcmVnaXN0ZXJQcm9wcy5jdXJyZW50Lm9uQmx1cih7XG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgdmFsdWU6IGdldChjb250cm9sLl9mb3JtVmFsdWVzLCBuYW1lKSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IEVWRU5UUy5CTFVSLFxuICAgIH0pLCBbbmFtZSwgY29udHJvbC5fZm9ybVZhbHVlc10pO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKChlbG0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoY29udHJvbC5fZmllbGRzLCBuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkICYmIGVsbSkge1xuICAgICAgICAgICAgZmllbGQuX2YucmVmID0ge1xuICAgICAgICAgICAgICAgIGZvY3VzOiAoKSA9PiBlbG0uZm9jdXMgJiYgZWxtLmZvY3VzKCksXG4gICAgICAgICAgICAgICAgc2VsZWN0OiAoKSA9PiBlbG0uc2VsZWN0ICYmIGVsbS5zZWxlY3QoKSxcbiAgICAgICAgICAgICAgICBzZXRDdXN0b21WYWxpZGl0eTogKG1lc3NhZ2UpID0+IGVsbS5zZXRDdXN0b21WYWxpZGl0eShtZXNzYWdlKSxcbiAgICAgICAgICAgICAgICByZXBvcnRWYWxpZGl0eTogKCkgPT4gZWxtLnJlcG9ydFZhbGlkaXR5KCksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSwgW2NvbnRyb2wuX2ZpZWxkcywgbmFtZV0pO1xuICAgIGNvbnN0IGZpZWxkID0gUmVhY3RfX2RlZmF1bHQudXNlTWVtbygoKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgLi4uKGlzQm9vbGVhbihkaXNhYmxlZCkgfHwgZm9ybVN0YXRlLmRpc2FibGVkXG4gICAgICAgICAgICA/IHsgZGlzYWJsZWQ6IGZvcm1TdGF0ZS5kaXNhYmxlZCB8fCBkaXNhYmxlZCB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgb25DaGFuZ2UsXG4gICAgICAgIG9uQmx1cixcbiAgICAgICAgcmVmLFxuICAgIH0pLCBbbmFtZSwgZGlzYWJsZWQsIGZvcm1TdGF0ZS5kaXNhYmxlZCwgb25DaGFuZ2UsIG9uQmx1ciwgcmVmLCB2YWx1ZV0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IF9zaG91bGRVbnJlZ2lzdGVyRmllbGQgPSBjb250cm9sLl9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXIgfHwgc2hvdWxkVW5yZWdpc3RlcjtcbiAgICAgICAgY29udHJvbC5yZWdpc3RlcihuYW1lLCB7XG4gICAgICAgICAgICAuLi5fcHJvcHMuY3VycmVudC5ydWxlcyxcbiAgICAgICAgICAgIC4uLihpc0Jvb2xlYW4oX3Byb3BzLmN1cnJlbnQuZGlzYWJsZWQpXG4gICAgICAgICAgICAgICAgPyB7IGRpc2FibGVkOiBfcHJvcHMuY3VycmVudC5kaXNhYmxlZCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB1cGRhdGVNb3VudGVkID0gKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChjb250cm9sLl9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLl9mKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuX2YubW91bnQgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdXBkYXRlTW91bnRlZChuYW1lLCB0cnVlKTtcbiAgICAgICAgaWYgKF9zaG91bGRVbnJlZ2lzdGVyRmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xvbmVPYmplY3QoZ2V0KGNvbnRyb2wuX29wdGlvbnMuZGVmYXVsdFZhbHVlcywgbmFtZSkpO1xuICAgICAgICAgICAgc2V0KGNvbnRyb2wuX2RlZmF1bHRWYWx1ZXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChnZXQoY29udHJvbC5fZm9ybVZhbHVlcywgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgc2V0KGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAhaXNBcnJheUZpZWxkICYmIGNvbnRyb2wucmVnaXN0ZXIobmFtZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAoaXNBcnJheUZpZWxkXG4gICAgICAgICAgICAgICAgPyBfc2hvdWxkVW5yZWdpc3RlckZpZWxkICYmICFjb250cm9sLl9zdGF0ZS5hY3Rpb25cbiAgICAgICAgICAgICAgICA6IF9zaG91bGRVbnJlZ2lzdGVyRmllbGQpXG4gICAgICAgICAgICAgICAgPyBjb250cm9sLnVucmVnaXN0ZXIobmFtZSlcbiAgICAgICAgICAgICAgICA6IHVwZGF0ZU1vdW50ZWQobmFtZSwgZmFsc2UpO1xuICAgICAgICB9O1xuICAgIH0sIFtuYW1lLCBjb250cm9sLCBpc0FycmF5RmllbGQsIHNob3VsZFVucmVnaXN0ZXJdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb250cm9sLl9zZXREaXNhYmxlZEZpZWxkKHtcbiAgICAgICAgICAgIGRpc2FibGVkLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgfSk7XG4gICAgfSwgW2Rpc2FibGVkLCBuYW1lLCBjb250cm9sXSk7XG4gICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGZvcm1TdGF0ZSxcbiAgICAgICAgZmllbGRTdGF0ZSxcbiAgICB9KSwgW2ZpZWxkLCBmb3JtU3RhdGUsIGZpZWxkU3RhdGVdKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgYmFzZWQgb24gYHVzZUNvbnRyb2xsZXJgIGhvb2sgdG8gd29yayB3aXRoIGNvbnRyb2xsZWQgY29tcG9uZW50LlxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2Vjb250cm9sbGVyL2NvbnRyb2xsZXIpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS12Ni1jb250cm9sbGVyLXRzLWp3eXp3KSDigKIgW1ZpZGVvXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PU4yVU5rX1VDVnlBKVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIHRoZSBwYXRoIG5hbWUgdG8gdGhlIGZvcm0gZmllbGQgdmFsdWUsIGFuZCB2YWxpZGF0aW9uIHJ1bGVzLlxuICpcbiAqIEByZXR1cm5zIHByb3ZpZGUgZmllbGQgaGFuZGxlciBmdW5jdGlvbnMsIGZpZWxkIGFuZCBmb3JtIHN0YXRlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPEZvcm1WYWx1ZXM+KHtcbiAqICAgICBkZWZhdWx0VmFsdWVzOiB7XG4gKiAgICAgICB0ZXN0OiBcIlwiXG4gKiAgICAgfVxuICogICB9KTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGZvcm0+XG4gKiAgICAgICA8Q29udHJvbGxlclxuICogICAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgICBuYW1lPVwidGVzdFwiXG4gKiAgICAgICAgIHJlbmRlcj17KHsgZmllbGQ6IHsgb25DaGFuZ2UsIG9uQmx1ciwgdmFsdWUsIHJlZiB9LCBmb3JtU3RhdGUsIGZpZWxkU3RhdGUgfSkgPT4gKFxuICogICAgICAgICAgIDw+XG4gKiAgICAgICAgICAgICA8aW5wdXRcbiAqICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfSAvLyBzZW5kIHZhbHVlIHRvIGhvb2sgZm9ybVxuICogICAgICAgICAgICAgICBvbkJsdXI9e29uQmx1cn0gLy8gbm90aWZ5IHdoZW4gaW5wdXQgaXMgdG91Y2hlZFxuICogICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9IC8vIHJldHVybiB1cGRhdGVkIHZhbHVlXG4gKiAgICAgICAgICAgICAgIHJlZj17cmVmfSAvLyBzZXQgcmVmIGZvciBmb2N1cyBtYW5hZ2VtZW50XG4gKiAgICAgICAgICAgICAvPlxuICogICAgICAgICAgICAgPHA+e2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZCA/IFwic3VibWl0dGVkXCIgOiBcIlwifTwvcD5cbiAqICAgICAgICAgICAgIDxwPntmaWVsZFN0YXRlLmlzVG91Y2hlZCA/IFwidG91Y2hlZFwiIDogXCJcIn08L3A+XG4gKiAgICAgICAgICAgPC8+XG4gKiAgICAgICAgICl9XG4gKiAgICAgICAvPlxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovXG5jb25zdCBDb250cm9sbGVyID0gKHByb3BzKSA9PiBwcm9wcy5yZW5kZXIodXNlQ29udHJvbGxlcihwcm9wcykpO1xuXG5jb25zdCBmbGF0dGVuID0gKG9iaikgPT4ge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0VHlwZShvYmpba2V5XSkgJiYgb2JqW2tleV0gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IG5lc3RlZCA9IGZsYXR0ZW4ob2JqW2tleV0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuZXN0ZWRLZXkgb2YgT2JqZWN0LmtleXMobmVzdGVkKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dFtgJHtrZXl9LiR7bmVzdGVkS2V5fWBdID0gbmVzdGVkW25lc3RlZEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59O1xuXG5jb25zdCBQT1NUX1JFUVVFU1QgPSAncG9zdCc7XG4vKipcbiAqIEZvcm0gY29tcG9uZW50IHRvIG1hbmFnZSBzdWJtaXNzaW9uLlxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIHRvIHNldHVwIHN1Ym1pc3Npb24gZGV0YWlsLiB7QGxpbmsgRm9ybVByb3BzfVxuICpcbiAqIEByZXR1cm5zIGZvcm0gY29tcG9uZW50IG9yIGhlYWRsZXNzIHJlbmRlciBwcm9wLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sLCBmb3JtU3RhdGU6IHsgZXJyb3JzIH0gfSA9IHVzZUZvcm0oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEZvcm0gYWN0aW9uPVwiL2FwaVwiIGNvbnRyb2w9e2NvbnRyb2x9PlxuICogICAgICAgPGlucHV0IHsuLi5yZWdpc3RlcihcIm5hbWVcIil9IC8+XG4gKiAgICAgICA8cD57ZXJyb3JzPy5yb290Py5zZXJ2ZXIgJiYgJ1NlcnZlciBlcnJvcid9PC9wPlxuICogICAgICAgPGJ1dHRvbj5TdWJtaXQ8L2J1dHRvbj5cbiAqICAgICA8L0Zvcm0+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gRm9ybShwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IFttb3VudGVkLCBzZXRNb3VudGVkXSA9IFJlYWN0X19kZWZhdWx0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCB7IGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIG9uU3VibWl0LCBjaGlsZHJlbiwgYWN0aW9uLCBtZXRob2QgPSBQT1NUX1JFUVVFU1QsIGhlYWRlcnMsIGVuY1R5cGUsIG9uRXJyb3IsIHJlbmRlciwgb25TdWNjZXNzLCB2YWxpZGF0ZVN0YXR1cywgLi4ucmVzdCB9ID0gcHJvcHM7XG4gICAgY29uc3Qgc3VibWl0ID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICBsZXQgdHlwZSA9ICcnO1xuICAgICAgICBhd2FpdCBjb250cm9sLmhhbmRsZVN1Ym1pdChhc3luYyAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGxldCBmb3JtRGF0YUpzb24gPSAnJztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9ybURhdGFKc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2EpIHsgfVxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbkZvcm1WYWx1ZXMgPSBmbGF0dGVuKGNvbnRyb2wuX2Zvcm1WYWx1ZXMpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmxhdHRlbkZvcm1WYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBmbGF0dGVuRm9ybVZhbHVlc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvblN1Ym1pdCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG9uU3VibWl0KHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhSnNvbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRTdHJpbmdpZnlTdWJtaXNzaW9uRGF0YSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgJiYgaGVhZGVyc1snQ29udGVudC1UeXBlJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNUeXBlLFxuICAgICAgICAgICAgICAgICAgICBdLnNvbWUoKHZhbHVlKSA9PiB2YWx1ZSAmJiB2YWx1ZS5pbmNsdWRlcygnanNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChTdHJpbmcoYWN0aW9uKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGVuY1R5cGUgPyB7ICdDb250ZW50LVR5cGUnOiBlbmNUeXBlIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogc2hvdWxkU3RyaW5naWZ5U3VibWlzc2lvbkRhdGEgPyBmb3JtRGF0YUpzb24gOiBmb3JtRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHZhbGlkYXRlU3RhdHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAhdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSAzMDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yICYmIG9uRXJyb3IoeyByZXNwb25zZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2VzcyAmJiBvblN1Y2Nlc3MoeyByZXNwb25zZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yICYmIG9uRXJyb3IoeyBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKGV2ZW50KTtcbiAgICAgICAgaWYgKGhhc0Vycm9yICYmIHByb3BzLmNvbnRyb2wpIHtcbiAgICAgICAgICAgIHByb3BzLmNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIGlzU3VibWl0U3VjY2Vzc2Z1bDogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByb3BzLmNvbnRyb2wuc2V0RXJyb3IoJ3Jvb3Quc2VydmVyJywge1xuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc2V0TW91bnRlZCh0cnVlKTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIHJlbmRlciA/IChSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0X19kZWZhdWx0LkZyYWdtZW50LCBudWxsLCByZW5kZXIoe1xuICAgICAgICBzdWJtaXQsXG4gICAgfSkpKSA6IChSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiLCB7IG5vVmFsaWRhdGU6IG1vdW50ZWQsIGFjdGlvbjogYWN0aW9uLCBtZXRob2Q6IG1ldGhvZCwgZW5jVHlwZTogZW5jVHlwZSwgb25TdWJtaXQ6IHN1Ym1pdCwgLi4ucmVzdCB9LCBjaGlsZHJlbikpO1xufVxuXG52YXIgYXBwZW5kRXJyb3JzID0gKG5hbWUsIHZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSwgZXJyb3JzLCB0eXBlLCBtZXNzYWdlKSA9PiB2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWFcbiAgICA/IHtcbiAgICAgICAgLi4uZXJyb3JzW25hbWVdLFxuICAgICAgICB0eXBlczoge1xuICAgICAgICAgICAgLi4uKGVycm9yc1tuYW1lXSAmJiBlcnJvcnNbbmFtZV0udHlwZXMgPyBlcnJvcnNbbmFtZV0udHlwZXMgOiB7fSksXG4gICAgICAgICAgICBbdHlwZV06IG1lc3NhZ2UgfHwgdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9XG4gICAgOiB7fTtcblxudmFyIGNvbnZlcnRUb0FycmF5UGF5bG9hZCA9ICh2YWx1ZSkgPT4gKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcblxudmFyIGNyZWF0ZVN1YmplY3QgPSAoKSA9PiB7XG4gICAgbGV0IF9vYnNlcnZlcnMgPSBbXTtcbiAgICBjb25zdCBuZXh0ID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgb2JzZXJ2ZXIgb2YgX29ic2VydmVycykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCAmJiBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc3Vic2NyaWJlID0gKG9ic2VydmVyKSA9PiB7XG4gICAgICAgIF9vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIF9vYnNlcnZlcnMgPSBfb2JzZXJ2ZXJzLmZpbHRlcigobykgPT4gbyAhPT0gb2JzZXJ2ZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICBfb2JzZXJ2ZXJzID0gW107XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgb2JzZXJ2ZXJzKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZlcnM7XG4gICAgICAgIH0sXG4gICAgICAgIG5leHQsXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgdW5zdWJzY3JpYmUsXG4gICAgfTtcbn07XG5cbnZhciBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4gaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpIHx8ICFpc09iamVjdFR5cGUodmFsdWUpO1xuXG5mdW5jdGlvbiBkZWVwRXF1YWwob2JqZWN0MSwgb2JqZWN0MiwgX2ludGVybmFsX3Zpc2l0ZWQgPSBuZXcgV2Vha1NldCgpKSB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iamVjdDEpIHx8IGlzUHJpbWl0aXZlKG9iamVjdDIpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QxID09PSBvYmplY3QyO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlT2JqZWN0KG9iamVjdDEpICYmIGlzRGF0ZU9iamVjdChvYmplY3QyKSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0MS5nZXRUaW1lKCkgPT09IG9iamVjdDIuZ2V0VGltZSgpO1xuICAgIH1cbiAgICBjb25zdCBrZXlzMSA9IE9iamVjdC5rZXlzKG9iamVjdDEpO1xuICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMob2JqZWN0Mik7XG4gICAgaWYgKGtleXMxLmxlbmd0aCAhPT0ga2V5czIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKF9pbnRlcm5hbF92aXNpdGVkLmhhcyhvYmplY3QxKSB8fCBfaW50ZXJuYWxfdmlzaXRlZC5oYXMob2JqZWN0MikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIF9pbnRlcm5hbF92aXNpdGVkLmFkZChvYmplY3QxKTtcbiAgICBfaW50ZXJuYWxfdmlzaXRlZC5hZGQob2JqZWN0Mik7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5czEpIHtcbiAgICAgICAgY29uc3QgdmFsMSA9IG9iamVjdDFba2V5XTtcbiAgICAgICAgaWYgKCFrZXlzMi5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSAhPT0gJ3JlZicpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbDIgPSBvYmplY3QyW2tleV07XG4gICAgICAgICAgICBpZiAoKGlzRGF0ZU9iamVjdCh2YWwxKSAmJiBpc0RhdGVPYmplY3QodmFsMikpIHx8XG4gICAgICAgICAgICAgICAgKGlzT2JqZWN0KHZhbDEpICYmIGlzT2JqZWN0KHZhbDIpKSB8fFxuICAgICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KHZhbDEpICYmIEFycmF5LmlzQXJyYXkodmFsMikpXG4gICAgICAgICAgICAgICAgPyAhZGVlcEVxdWFsKHZhbDEsIHZhbDIsIF9pbnRlcm5hbF92aXNpdGVkKVxuICAgICAgICAgICAgICAgIDogdmFsMSAhPT0gdmFsMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxudmFyIGlzRW1wdHlPYmplY3QgPSAodmFsdWUpID0+IGlzT2JqZWN0KHZhbHVlKSAmJiAhT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aDtcblxudmFyIGlzRmlsZUlucHV0ID0gKGVsZW1lbnQpID0+IGVsZW1lbnQudHlwZSA9PT0gJ2ZpbGUnO1xuXG52YXIgaXNGdW5jdGlvbiA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuXG52YXIgaXNIVE1MRWxlbWVudCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICghaXNXZWIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBvd25lciA9IHZhbHVlID8gdmFsdWUub3duZXJEb2N1bWVudCA6IDA7XG4gICAgcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mXG4gICAgICAgIChvd25lciAmJiBvd25lci5kZWZhdWx0VmlldyA/IG93bmVyLmRlZmF1bHRWaWV3LkhUTUxFbGVtZW50IDogSFRNTEVsZW1lbnQpKTtcbn07XG5cbnZhciBpc011bHRpcGxlU2VsZWN0ID0gKGVsZW1lbnQpID0+IGVsZW1lbnQudHlwZSA9PT0gYHNlbGVjdC1tdWx0aXBsZWA7XG5cbnZhciBpc1JhZGlvSW5wdXQgPSAoZWxlbWVudCkgPT4gZWxlbWVudC50eXBlID09PSAncmFkaW8nO1xuXG52YXIgaXNSYWRpb09yQ2hlY2tib3ggPSAocmVmKSA9PiBpc1JhZGlvSW5wdXQocmVmKSB8fCBpc0NoZWNrQm94SW5wdXQocmVmKTtcblxudmFyIGxpdmUgPSAocmVmKSA9PiBpc0hUTUxFbGVtZW50KHJlZikgJiYgcmVmLmlzQ29ubmVjdGVkO1xuXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgdXBkYXRlUGF0aCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IHVwZGF0ZVBhdGguc2xpY2UoMCwgLTEpLmxlbmd0aDtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBpc1VuZGVmaW5lZChvYmplY3QpID8gaW5kZXgrKyA6IG9iamVjdFt1cGRhdGVQYXRoW2luZGV4KytdXTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbn1cbmZ1bmN0aW9uIGlzRW1wdHlBcnJheShvYmopIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFpc1VuZGVmaW5lZChvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgIGNvbnN0IHBhdGhzID0gQXJyYXkuaXNBcnJheShwYXRoKVxuICAgICAgICA/IHBhdGhcbiAgICAgICAgOiBpc0tleShwYXRoKVxuICAgICAgICAgICAgPyBbcGF0aF1cbiAgICAgICAgICAgIDogc3RyaW5nVG9QYXRoKHBhdGgpO1xuICAgIGNvbnN0IGNoaWxkT2JqZWN0ID0gcGF0aHMubGVuZ3RoID09PSAxID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIHBhdGhzKTtcbiAgICBjb25zdCBpbmRleCA9IHBhdGhzLmxlbmd0aCAtIDE7XG4gICAgY29uc3Qga2V5ID0gcGF0aHNbaW5kZXhdO1xuICAgIGlmIChjaGlsZE9iamVjdCkge1xuICAgICAgICBkZWxldGUgY2hpbGRPYmplY3Rba2V5XTtcbiAgICB9XG4gICAgaWYgKGluZGV4ICE9PSAwICYmXG4gICAgICAgICgoaXNPYmplY3QoY2hpbGRPYmplY3QpICYmIGlzRW1wdHlPYmplY3QoY2hpbGRPYmplY3QpKSB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY2hpbGRPYmplY3QpICYmIGlzRW1wdHlBcnJheShjaGlsZE9iamVjdCkpKSkge1xuICAgICAgICB1bnNldChvYmplY3QsIHBhdGhzLnNsaWNlKDAsIC0xKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG59XG5cbnZhciBvYmplY3RIYXNGdW5jdGlvbiA9IChkYXRhKSA9PiB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihkYXRhW2tleV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBtYXJrRmllbGRzRGlydHkoZGF0YSwgZmllbGRzID0ge30pIHtcbiAgICBjb25zdCBpc1BhcmVudE5vZGVBcnJheSA9IEFycmF5LmlzQXJyYXkoZGF0YSk7XG4gICAgaWYgKGlzT2JqZWN0KGRhdGEpIHx8IGlzUGFyZW50Tm9kZUFycmF5KSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFba2V5XSkgfHxcbiAgICAgICAgICAgICAgICAoaXNPYmplY3QoZGF0YVtrZXldKSAmJiAhb2JqZWN0SGFzRnVuY3Rpb24oZGF0YVtrZXldKSkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHNba2V5XSA9IEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSA/IFtdIDoge307XG4gICAgICAgICAgICAgICAgbWFya0ZpZWxkc0RpcnR5KGRhdGFba2V5XSwgZmllbGRzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGRhdGFba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkcztcbn1cbmZ1bmN0aW9uIGdldERpcnR5RmllbGRzRnJvbURlZmF1bHRWYWx1ZXMoZGF0YSwgZm9ybVZhbHVlcywgZGlydHlGaWVsZHNGcm9tVmFsdWVzKSB7XG4gICAgY29uc3QgaXNQYXJlbnROb2RlQXJyYXkgPSBBcnJheS5pc0FycmF5KGRhdGEpO1xuICAgIGlmIChpc09iamVjdChkYXRhKSB8fCBpc1BhcmVudE5vZGVBcnJheSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhW2tleV0pIHx8XG4gICAgICAgICAgICAgICAgKGlzT2JqZWN0KGRhdGFba2V5XSkgJiYgIW9iamVjdEhhc0Z1bmN0aW9uKGRhdGFba2V5XSkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGZvcm1WYWx1ZXMpIHx8XG4gICAgICAgICAgICAgICAgICAgIGlzUHJpbWl0aXZlKGRpcnR5RmllbGRzRnJvbVZhbHVlc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXJ0eUZpZWxkc0Zyb21WYWx1ZXNba2V5XSA9IEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBtYXJrRmllbGRzRGlydHkoZGF0YVtrZXldLCBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogeyAuLi5tYXJrRmllbGRzRGlydHkoZGF0YVtrZXldKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0RGlydHlGaWVsZHNGcm9tRGVmYXVsdFZhbHVlcyhkYXRhW2tleV0sIGlzTnVsbE9yVW5kZWZpbmVkKGZvcm1WYWx1ZXMpID8ge30gOiBmb3JtVmFsdWVzW2tleV0sIGRpcnR5RmllbGRzRnJvbVZhbHVlc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXJ0eUZpZWxkc0Zyb21WYWx1ZXNba2V5XSA9ICFkZWVwRXF1YWwoZGF0YVtrZXldLCBmb3JtVmFsdWVzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXJ0eUZpZWxkc0Zyb21WYWx1ZXM7XG59XG52YXIgZ2V0RGlydHlGaWVsZHMgPSAoZGVmYXVsdFZhbHVlcywgZm9ybVZhbHVlcykgPT4gZ2V0RGlydHlGaWVsZHNGcm9tRGVmYXVsdFZhbHVlcyhkZWZhdWx0VmFsdWVzLCBmb3JtVmFsdWVzLCBtYXJrRmllbGRzRGlydHkoZm9ybVZhbHVlcykpO1xuXG5jb25zdCBkZWZhdWx0UmVzdWx0ID0ge1xuICAgIHZhbHVlOiBmYWxzZSxcbiAgICBpc1ZhbGlkOiBmYWxzZSxcbn07XG5jb25zdCB2YWxpZFJlc3VsdCA9IHsgdmFsdWU6IHRydWUsIGlzVmFsaWQ6IHRydWUgfTtcbnZhciBnZXRDaGVja2JveFZhbHVlID0gKG9wdGlvbnMpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBvcHRpb25zXG4gICAgICAgICAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24gJiYgb3B0aW9uLmNoZWNrZWQgJiYgIW9wdGlvbi5kaXNhYmxlZClcbiAgICAgICAgICAgICAgICAubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdmFsdWVzLCBpc1ZhbGlkOiAhIXZhbHVlcy5sZW5ndGggfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9uc1swXS5jaGVja2VkICYmICFvcHRpb25zWzBdLmRpc2FibGVkXG4gICAgICAgICAgICA/IC8vIEB0cy1leHBlY3QtZXJyb3IgZXhwZWN0ZWQgdG8gd29yayBpbiB0aGUgYnJvd3NlclxuICAgICAgICAgICAgICAgIG9wdGlvbnNbMF0uYXR0cmlidXRlcyAmJiAhaXNVbmRlZmluZWQob3B0aW9uc1swXS5hdHRyaWJ1dGVzLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IGlzVW5kZWZpbmVkKG9wdGlvbnNbMF0udmFsdWUpIHx8IG9wdGlvbnNbMF0udmFsdWUgPT09ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHZhbGlkUmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgdmFsdWU6IG9wdGlvbnNbMF0udmFsdWUsIGlzVmFsaWQ6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICA6IHZhbGlkUmVzdWx0XG4gICAgICAgICAgICA6IGRlZmF1bHRSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0UmVzdWx0O1xufTtcblxudmFyIGdldEZpZWxkVmFsdWVBcyA9ICh2YWx1ZSwgeyB2YWx1ZUFzTnVtYmVyLCB2YWx1ZUFzRGF0ZSwgc2V0VmFsdWVBcyB9KSA9PiBpc1VuZGVmaW5lZCh2YWx1ZSlcbiAgICA/IHZhbHVlXG4gICAgOiB2YWx1ZUFzTnVtYmVyXG4gICAgICAgID8gdmFsdWUgPT09ICcnXG4gICAgICAgICAgICA/IE5hTlxuICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICAgICAgICAgID8gK3ZhbHVlXG4gICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICA6IHZhbHVlQXNEYXRlICYmIGlzU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgPyBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgICAgICAgIDogc2V0VmFsdWVBc1xuICAgICAgICAgICAgICAgID8gc2V0VmFsdWVBcyh2YWx1ZSlcbiAgICAgICAgICAgICAgICA6IHZhbHVlO1xuXG5jb25zdCBkZWZhdWx0UmV0dXJuID0ge1xuICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgIHZhbHVlOiBudWxsLFxufTtcbnZhciBnZXRSYWRpb1ZhbHVlID0gKG9wdGlvbnMpID0+IEFycmF5LmlzQXJyYXkob3B0aW9ucylcbiAgICA/IG9wdGlvbnMucmVkdWNlKChwcmV2aW91cywgb3B0aW9uKSA9PiBvcHRpb24gJiYgb3B0aW9uLmNoZWNrZWQgJiYgIW9wdGlvbi5kaXNhYmxlZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICB9XG4gICAgICAgIDogcHJldmlvdXMsIGRlZmF1bHRSZXR1cm4pXG4gICAgOiBkZWZhdWx0UmV0dXJuO1xuXG5mdW5jdGlvbiBnZXRGaWVsZFZhbHVlKF9mKSB7XG4gICAgY29uc3QgcmVmID0gX2YucmVmO1xuICAgIGlmIChpc0ZpbGVJbnB1dChyZWYpKSB7XG4gICAgICAgIHJldHVybiByZWYuZmlsZXM7XG4gICAgfVxuICAgIGlmIChpc1JhZGlvSW5wdXQocmVmKSkge1xuICAgICAgICByZXR1cm4gZ2V0UmFkaW9WYWx1ZShfZi5yZWZzKS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzTXVsdGlwbGVTZWxlY3QocmVmKSkge1xuICAgICAgICByZXR1cm4gWy4uLnJlZi5zZWxlY3RlZE9wdGlvbnNdLm1hcCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpc0NoZWNrQm94SW5wdXQocmVmKSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hlY2tib3hWYWx1ZShfZi5yZWZzKS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEZpZWxkVmFsdWVBcyhpc1VuZGVmaW5lZChyZWYudmFsdWUpID8gX2YucmVmLnZhbHVlIDogcmVmLnZhbHVlLCBfZik7XG59XG5cbnZhciBnZXRSZXNvbHZlck9wdGlvbnMgPSAoZmllbGRzTmFtZXMsIF9maWVsZHMsIGNyaXRlcmlhTW9kZSwgc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbikgPT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9IHt9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBmaWVsZHNOYW1lcykge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgZmllbGQgJiYgc2V0KGZpZWxkcywgbmFtZSwgZmllbGQuX2YpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjcml0ZXJpYU1vZGUsXG4gICAgICAgIG5hbWVzOiBbLi4uZmllbGRzTmFtZXNdLFxuICAgICAgICBmaWVsZHMsXG4gICAgICAgIHNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24sXG4gICAgfTtcbn07XG5cbnZhciBpc1JlZ2V4ID0gKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cDtcblxudmFyIGdldFJ1bGVWYWx1ZSA9IChydWxlKSA9PiBpc1VuZGVmaW5lZChydWxlKVxuICAgID8gcnVsZVxuICAgIDogaXNSZWdleChydWxlKVxuICAgICAgICA/IHJ1bGUuc291cmNlXG4gICAgICAgIDogaXNPYmplY3QocnVsZSlcbiAgICAgICAgICAgID8gaXNSZWdleChydWxlLnZhbHVlKVxuICAgICAgICAgICAgICAgID8gcnVsZS52YWx1ZS5zb3VyY2VcbiAgICAgICAgICAgICAgICA6IHJ1bGUudmFsdWVcbiAgICAgICAgICAgIDogcnVsZTtcblxudmFyIGdldFZhbGlkYXRpb25Nb2RlcyA9IChtb2RlKSA9PiAoe1xuICAgIGlzT25TdWJtaXQ6ICFtb2RlIHx8IG1vZGUgPT09IFZBTElEQVRJT05fTU9ERS5vblN1Ym1pdCxcbiAgICBpc09uQmx1cjogbW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLm9uQmx1cixcbiAgICBpc09uQ2hhbmdlOiBtb2RlID09PSBWQUxJREFUSU9OX01PREUub25DaGFuZ2UsXG4gICAgaXNPbkFsbDogbW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLmFsbCxcbiAgICBpc09uVG91Y2g6IG1vZGUgPT09IFZBTElEQVRJT05fTU9ERS5vblRvdWNoZWQsXG59KTtcblxuY29uc3QgQVNZTkNfRlVOQ1RJT04gPSAnQXN5bmNGdW5jdGlvbic7XG52YXIgaGFzUHJvbWlzZVZhbGlkYXRpb24gPSAoZmllbGRSZWZlcmVuY2UpID0+ICEhZmllbGRSZWZlcmVuY2UgJiZcbiAgICAhIWZpZWxkUmVmZXJlbmNlLnZhbGlkYXRlICYmXG4gICAgISEoKGlzRnVuY3Rpb24oZmllbGRSZWZlcmVuY2UudmFsaWRhdGUpICYmXG4gICAgICAgIGZpZWxkUmVmZXJlbmNlLnZhbGlkYXRlLmNvbnN0cnVjdG9yLm5hbWUgPT09IEFTWU5DX0ZVTkNUSU9OKSB8fFxuICAgICAgICAoaXNPYmplY3QoZmllbGRSZWZlcmVuY2UudmFsaWRhdGUpICYmXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKGZpZWxkUmVmZXJlbmNlLnZhbGlkYXRlKS5maW5kKCh2YWxpZGF0ZUZ1bmN0aW9uKSA9PiB2YWxpZGF0ZUZ1bmN0aW9uLmNvbnN0cnVjdG9yLm5hbWUgPT09IEFTWU5DX0ZVTkNUSU9OKSkpO1xuXG52YXIgaGFzVmFsaWRhdGlvbiA9IChvcHRpb25zKSA9PiBvcHRpb25zLm1vdW50ICYmXG4gICAgKG9wdGlvbnMucmVxdWlyZWQgfHxcbiAgICAgICAgb3B0aW9ucy5taW4gfHxcbiAgICAgICAgb3B0aW9ucy5tYXggfHxcbiAgICAgICAgb3B0aW9ucy5tYXhMZW5ndGggfHxcbiAgICAgICAgb3B0aW9ucy5taW5MZW5ndGggfHxcbiAgICAgICAgb3B0aW9ucy5wYXR0ZXJuIHx8XG4gICAgICAgIG9wdGlvbnMudmFsaWRhdGUpO1xuXG52YXIgaXNXYXRjaGVkID0gKG5hbWUsIF9uYW1lcywgaXNCbHVyRXZlbnQpID0+ICFpc0JsdXJFdmVudCAmJlxuICAgIChfbmFtZXMud2F0Y2hBbGwgfHxcbiAgICAgICAgX25hbWVzLndhdGNoLmhhcyhuYW1lKSB8fFxuICAgICAgICBbLi4uX25hbWVzLndhdGNoXS5zb21lKCh3YXRjaE5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aCh3YXRjaE5hbWUpICYmXG4gICAgICAgICAgICAvXlxcLlxcdysvLnRlc3QobmFtZS5zbGljZSh3YXRjaE5hbWUubGVuZ3RoKSkpKTtcblxuY29uc3QgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uID0gKGZpZWxkcywgYWN0aW9uLCBmaWVsZHNOYW1lcywgYWJvcnRFYXJseSkgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGZpZWxkc05hbWVzIHx8IE9iamVjdC5rZXlzKGZpZWxkcykpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoZmllbGRzLCBrZXkpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgX2YsIC4uLmN1cnJlbnRGaWVsZCB9ID0gZmllbGQ7XG4gICAgICAgICAgICBpZiAoX2YpIHtcbiAgICAgICAgICAgICAgICBpZiAoX2YucmVmcyAmJiBfZi5yZWZzWzBdICYmIGFjdGlvbihfZi5yZWZzWzBdLCBrZXkpICYmICFhYm9ydEVhcmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChfZi5yZWYgJiYgYWN0aW9uKF9mLnJlZiwgX2YubmFtZSkgJiYgIWFib3J0RWFybHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKGN1cnJlbnRGaWVsZCwgYWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc09iamVjdChjdXJyZW50RmllbGQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhdGVGaWVsZHNCeUFjdGlvbihjdXJyZW50RmllbGQsIGFjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbn07XG5cbmZ1bmN0aW9uIHNjaGVtYUVycm9yTG9va3VwKGVycm9ycywgX2ZpZWxkcywgbmFtZSkge1xuICAgIGNvbnN0IGVycm9yID0gZ2V0KGVycm9ycywgbmFtZSk7XG4gICAgaWYgKGVycm9yIHx8IGlzS2V5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG5hbWVzID0gbmFtZS5zcGxpdCgnLicpO1xuICAgIHdoaWxlIChuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gbmFtZXMuam9pbignLicpO1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICBjb25zdCBmb3VuZEVycm9yID0gZ2V0KGVycm9ycywgZmllbGROYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkICYmICFBcnJheS5pc0FycmF5KGZpZWxkKSAmJiBuYW1lICE9PSBmaWVsZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRFcnJvciAmJiBmb3VuZEVycm9yLnR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgICAgIGVycm9yOiBmb3VuZEVycm9yLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRFcnJvciAmJiBmb3VuZEVycm9yLnJvb3QgJiYgZm91bmRFcnJvci5yb290LnR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogYCR7ZmllbGROYW1lfS5yb290YCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZm91bmRFcnJvci5yb290LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBuYW1lcy5wb3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICB9O1xufVxuXG52YXIgc2hvdWxkUmVuZGVyRm9ybVN0YXRlID0gKGZvcm1TdGF0ZURhdGEsIF9wcm94eUZvcm1TdGF0ZSwgdXBkYXRlRm9ybVN0YXRlLCBpc1Jvb3QpID0+IHtcbiAgICB1cGRhdGVGb3JtU3RhdGUoZm9ybVN0YXRlRGF0YSk7XG4gICAgY29uc3QgeyBuYW1lLCAuLi5mb3JtU3RhdGUgfSA9IGZvcm1TdGF0ZURhdGE7XG4gICAgcmV0dXJuIChpc0VtcHR5T2JqZWN0KGZvcm1TdGF0ZSkgfHxcbiAgICAgICAgT2JqZWN0LmtleXMoZm9ybVN0YXRlKS5sZW5ndGggPj0gT2JqZWN0LmtleXMoX3Byb3h5Rm9ybVN0YXRlKS5sZW5ndGggfHxcbiAgICAgICAgT2JqZWN0LmtleXMoZm9ybVN0YXRlKS5maW5kKChrZXkpID0+IF9wcm94eUZvcm1TdGF0ZVtrZXldID09PVxuICAgICAgICAgICAgKCFpc1Jvb3QgfHwgVkFMSURBVElPTl9NT0RFLmFsbCkpKTtcbn07XG5cbnZhciBzaG91bGRTdWJzY3JpYmVCeU5hbWUgPSAobmFtZSwgc2lnbmFsTmFtZSwgZXhhY3QpID0+ICFuYW1lIHx8XG4gICAgIXNpZ25hbE5hbWUgfHxcbiAgICBuYW1lID09PSBzaWduYWxOYW1lIHx8XG4gICAgY29udmVydFRvQXJyYXlQYXlsb2FkKG5hbWUpLnNvbWUoKGN1cnJlbnROYW1lKSA9PiBjdXJyZW50TmFtZSAmJlxuICAgICAgICAoZXhhY3RcbiAgICAgICAgICAgID8gY3VycmVudE5hbWUgPT09IHNpZ25hbE5hbWVcbiAgICAgICAgICAgIDogY3VycmVudE5hbWUuc3RhcnRzV2l0aChzaWduYWxOYW1lKSB8fFxuICAgICAgICAgICAgICAgIHNpZ25hbE5hbWUuc3RhcnRzV2l0aChjdXJyZW50TmFtZSkpKTtcblxudmFyIHNraXBWYWxpZGF0aW9uID0gKGlzQmx1ckV2ZW50LCBpc1RvdWNoZWQsIGlzU3VibWl0dGVkLCByZVZhbGlkYXRlTW9kZSwgbW9kZSkgPT4ge1xuICAgIGlmIChtb2RlLmlzT25BbGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmICghaXNTdWJtaXR0ZWQgJiYgbW9kZS5pc09uVG91Y2gpIHtcbiAgICAgICAgcmV0dXJuICEoaXNUb3VjaGVkIHx8IGlzQmx1ckV2ZW50KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdWJtaXR0ZWQgPyByZVZhbGlkYXRlTW9kZS5pc09uQmx1ciA6IG1vZGUuaXNPbkJsdXIpIHtcbiAgICAgICAgcmV0dXJuICFpc0JsdXJFdmVudDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdWJtaXR0ZWQgPyByZVZhbGlkYXRlTW9kZS5pc09uQ2hhbmdlIDogbW9kZS5pc09uQ2hhbmdlKSB7XG4gICAgICAgIHJldHVybiBpc0JsdXJFdmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgdW5zZXRFbXB0eUFycmF5ID0gKHJlZiwgbmFtZSkgPT4gIWNvbXBhY3QoZ2V0KHJlZiwgbmFtZSkpLmxlbmd0aCAmJiB1bnNldChyZWYsIG5hbWUpO1xuXG52YXIgdXBkYXRlRmllbGRBcnJheVJvb3RFcnJvciA9IChlcnJvcnMsIGVycm9yLCBuYW1lKSA9PiB7XG4gICAgY29uc3QgZmllbGRBcnJheUVycm9ycyA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChnZXQoZXJyb3JzLCBuYW1lKSk7XG4gICAgc2V0KGZpZWxkQXJyYXlFcnJvcnMsICdyb290JywgZXJyb3JbbmFtZV0pO1xuICAgIHNldChlcnJvcnMsIG5hbWUsIGZpZWxkQXJyYXlFcnJvcnMpO1xuICAgIHJldHVybiBlcnJvcnM7XG59O1xuXG52YXIgaXNNZXNzYWdlID0gKHZhbHVlKSA9PiBpc1N0cmluZyh2YWx1ZSk7XG5cbmZ1bmN0aW9uIGdldFZhbGlkYXRlRXJyb3IocmVzdWx0LCByZWYsIHR5cGUgPSAndmFsaWRhdGUnKSB7XG4gICAgaWYgKGlzTWVzc2FnZShyZXN1bHQpIHx8XG4gICAgICAgIChBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0LmV2ZXJ5KGlzTWVzc2FnZSkpIHx8XG4gICAgICAgIChpc0Jvb2xlYW4ocmVzdWx0KSAmJiAhcmVzdWx0KSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGlzTWVzc2FnZShyZXN1bHQpID8gcmVzdWx0IDogJycsXG4gICAgICAgICAgICByZWYsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG52YXIgZ2V0VmFsdWVBbmRNZXNzYWdlID0gKHZhbGlkYXRpb25EYXRhKSA9PiBpc09iamVjdCh2YWxpZGF0aW9uRGF0YSkgJiYgIWlzUmVnZXgodmFsaWRhdGlvbkRhdGEpXG4gICAgPyB2YWxpZGF0aW9uRGF0YVxuICAgIDoge1xuICAgICAgICB2YWx1ZTogdmFsaWRhdGlvbkRhdGEsXG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgIH07XG5cbnZhciB2YWxpZGF0ZUZpZWxkID0gYXN5bmMgKGZpZWxkLCBkaXNhYmxlZEZpZWxkTmFtZXMsIGZvcm1WYWx1ZXMsIHZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSwgc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbiwgaXNGaWVsZEFycmF5KSA9PiB7XG4gICAgY29uc3QgeyByZWYsIHJlZnMsIHJlcXVpcmVkLCBtYXhMZW5ndGgsIG1pbkxlbmd0aCwgbWluLCBtYXgsIHBhdHRlcm4sIHZhbGlkYXRlLCBuYW1lLCB2YWx1ZUFzTnVtYmVyLCBtb3VudCwgfSA9IGZpZWxkLl9mO1xuICAgIGNvbnN0IGlucHV0VmFsdWUgPSBnZXQoZm9ybVZhbHVlcywgbmFtZSk7XG4gICAgaWYgKCFtb3VudCB8fCBkaXNhYmxlZEZpZWxkTmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRSZWYgPSByZWZzID8gcmVmc1swXSA6IHJlZjtcbiAgICBjb25zdCBzZXRDdXN0b21WYWxpZGl0eSA9IChtZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChzaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uICYmIGlucHV0UmVmLnJlcG9ydFZhbGlkaXR5KSB7XG4gICAgICAgICAgICBpbnB1dFJlZi5zZXRDdXN0b21WYWxpZGl0eShpc0Jvb2xlYW4obWVzc2FnZSkgPyAnJyA6IG1lc3NhZ2UgfHwgJycpO1xuICAgICAgICAgICAgaW5wdXRSZWYucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZXJyb3IgPSB7fTtcbiAgICBjb25zdCBpc1JhZGlvID0gaXNSYWRpb0lucHV0KHJlZik7XG4gICAgY29uc3QgaXNDaGVja0JveCA9IGlzQ2hlY2tCb3hJbnB1dChyZWYpO1xuICAgIGNvbnN0IGlzUmFkaW9PckNoZWNrYm94ID0gaXNSYWRpbyB8fCBpc0NoZWNrQm94O1xuICAgIGNvbnN0IGlzRW1wdHkgPSAoKHZhbHVlQXNOdW1iZXIgfHwgaXNGaWxlSW5wdXQocmVmKSkgJiZcbiAgICAgICAgaXNVbmRlZmluZWQocmVmLnZhbHVlKSAmJlxuICAgICAgICBpc1VuZGVmaW5lZChpbnB1dFZhbHVlKSkgfHxcbiAgICAgICAgKGlzSFRNTEVsZW1lbnQocmVmKSAmJiByZWYudmFsdWUgPT09ICcnKSB8fFxuICAgICAgICBpbnB1dFZhbHVlID09PSAnJyB8fFxuICAgICAgICAoQXJyYXkuaXNBcnJheShpbnB1dFZhbHVlKSAmJiAhaW5wdXRWYWx1ZS5sZW5ndGgpO1xuICAgIGNvbnN0IGFwcGVuZEVycm9yc0N1cnJ5ID0gYXBwZW5kRXJyb3JzLmJpbmQobnVsbCwgbmFtZSwgdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhLCBlcnJvcik7XG4gICAgY29uc3QgZ2V0TWluTWF4TWVzc2FnZSA9IChleGNlZWRNYXgsIG1heExlbmd0aE1lc3NhZ2UsIG1pbkxlbmd0aE1lc3NhZ2UsIG1heFR5cGUgPSBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLm1heExlbmd0aCwgbWluVHlwZSA9IElOUFVUX1ZBTElEQVRJT05fUlVMRVMubWluTGVuZ3RoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBleGNlZWRNYXggPyBtYXhMZW5ndGhNZXNzYWdlIDogbWluTGVuZ3RoTWVzc2FnZTtcbiAgICAgICAgZXJyb3JbbmFtZV0gPSB7XG4gICAgICAgICAgICB0eXBlOiBleGNlZWRNYXggPyBtYXhUeXBlIDogbWluVHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICByZWYsXG4gICAgICAgICAgICAuLi5hcHBlbmRFcnJvcnNDdXJyeShleGNlZWRNYXggPyBtYXhUeXBlIDogbWluVHlwZSwgbWVzc2FnZSksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBpZiAoaXNGaWVsZEFycmF5XG4gICAgICAgID8gIUFycmF5LmlzQXJyYXkoaW5wdXRWYWx1ZSkgfHwgIWlucHV0VmFsdWUubGVuZ3RoXG4gICAgICAgIDogcmVxdWlyZWQgJiZcbiAgICAgICAgICAgICgoIWlzUmFkaW9PckNoZWNrYm94ICYmIChpc0VtcHR5IHx8IGlzTnVsbE9yVW5kZWZpbmVkKGlucHV0VmFsdWUpKSkgfHxcbiAgICAgICAgICAgICAgICAoaXNCb29sZWFuKGlucHV0VmFsdWUpICYmICFpbnB1dFZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIChpc0NoZWNrQm94ICYmICFnZXRDaGVja2JveFZhbHVlKHJlZnMpLmlzVmFsaWQpIHx8XG4gICAgICAgICAgICAgICAgKGlzUmFkaW8gJiYgIWdldFJhZGlvVmFsdWUocmVmcykuaXNWYWxpZCkpKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIG1lc3NhZ2UgfSA9IGlzTWVzc2FnZShyZXF1aXJlZClcbiAgICAgICAgICAgID8geyB2YWx1ZTogISFyZXF1aXJlZCwgbWVzc2FnZTogcmVxdWlyZWQgfVxuICAgICAgICAgICAgOiBnZXRWYWx1ZUFuZE1lc3NhZ2UocmVxdWlyZWQpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGVycm9yW25hbWVdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IElOUFVUX1ZBTElEQVRJT05fUlVMRVMucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICByZWY6IGlucHV0UmVmLFxuICAgICAgICAgICAgICAgIC4uLmFwcGVuZEVycm9yc0N1cnJ5KElOUFVUX1ZBTElEQVRJT05fUlVMRVMucmVxdWlyZWQsIG1lc3NhZ2UpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaXNFbXB0eSAmJiAoIWlzTnVsbE9yVW5kZWZpbmVkKG1pbikgfHwgIWlzTnVsbE9yVW5kZWZpbmVkKG1heCkpKSB7XG4gICAgICAgIGxldCBleGNlZWRNYXg7XG4gICAgICAgIGxldCBleGNlZWRNaW47XG4gICAgICAgIGNvbnN0IG1heE91dHB1dCA9IGdldFZhbHVlQW5kTWVzc2FnZShtYXgpO1xuICAgICAgICBjb25zdCBtaW5PdXRwdXQgPSBnZXRWYWx1ZUFuZE1lc3NhZ2UobWluKTtcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpbnB1dFZhbHVlKSAmJiAhaXNOYU4oaW5wdXRWYWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlTnVtYmVyID0gcmVmLnZhbHVlQXNOdW1iZXIgfHxcbiAgICAgICAgICAgICAgICAoaW5wdXRWYWx1ZSA/ICtpbnB1dFZhbHVlIDogaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKG1heE91dHB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBleGNlZWRNYXggPSB2YWx1ZU51bWJlciA+IG1heE91dHB1dC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQobWluT3V0cHV0LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGV4Y2VlZE1pbiA9IHZhbHVlTnVtYmVyIDwgbWluT3V0cHV0LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVEYXRlID0gcmVmLnZhbHVlQXNEYXRlIHx8IG5ldyBEYXRlKGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgY29udmVydFRpbWVUb0RhdGUgPSAodGltZSkgPT4gbmV3IERhdGUobmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKSArICcgJyArIHRpbWUpO1xuICAgICAgICAgICAgY29uc3QgaXNUaW1lID0gcmVmLnR5cGUgPT0gJ3RpbWUnO1xuICAgICAgICAgICAgY29uc3QgaXNXZWVrID0gcmVmLnR5cGUgPT0gJ3dlZWsnO1xuICAgICAgICAgICAgaWYgKGlzU3RyaW5nKG1heE91dHB1dC52YWx1ZSkgJiYgaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGV4Y2VlZE1heCA9IGlzVGltZVxuICAgICAgICAgICAgICAgICAgICA/IGNvbnZlcnRUaW1lVG9EYXRlKGlucHV0VmFsdWUpID4gY29udmVydFRpbWVUb0RhdGUobWF4T3V0cHV0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA6IGlzV2Vla1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dFZhbHVlID4gbWF4T3V0cHV0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlRGF0ZSA+IG5ldyBEYXRlKG1heE91dHB1dC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcobWluT3V0cHV0LnZhbHVlKSAmJiBpbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZXhjZWVkTWluID0gaXNUaW1lXG4gICAgICAgICAgICAgICAgICAgID8gY29udmVydFRpbWVUb0RhdGUoaW5wdXRWYWx1ZSkgPCBjb252ZXJ0VGltZVRvRGF0ZShtaW5PdXRwdXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIDogaXNXZWVrXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGlucHV0VmFsdWUgPCBtaW5PdXRwdXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWVEYXRlIDwgbmV3IERhdGUobWluT3V0cHV0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhjZWVkTWF4IHx8IGV4Y2VlZE1pbikge1xuICAgICAgICAgICAgZ2V0TWluTWF4TWVzc2FnZSghIWV4Y2VlZE1heCwgbWF4T3V0cHV0Lm1lc3NhZ2UsIG1pbk91dHB1dC5tZXNzYWdlLCBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLm1heCwgSU5QVVRfVkFMSURBVElPTl9SVUxFUy5taW4pO1xuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICBzZXRDdXN0b21WYWxpZGl0eShlcnJvcltuYW1lXS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKChtYXhMZW5ndGggfHwgbWluTGVuZ3RoKSAmJlxuICAgICAgICAhaXNFbXB0eSAmJlxuICAgICAgICAoaXNTdHJpbmcoaW5wdXRWYWx1ZSkgfHwgKGlzRmllbGRBcnJheSAmJiBBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpKSkpIHtcbiAgICAgICAgY29uc3QgbWF4TGVuZ3RoT3V0cHV0ID0gZ2V0VmFsdWVBbmRNZXNzYWdlKG1heExlbmd0aCk7XG4gICAgICAgIGNvbnN0IG1pbkxlbmd0aE91dHB1dCA9IGdldFZhbHVlQW5kTWVzc2FnZShtaW5MZW5ndGgpO1xuICAgICAgICBjb25zdCBleGNlZWRNYXggPSAhaXNOdWxsT3JVbmRlZmluZWQobWF4TGVuZ3RoT3V0cHV0LnZhbHVlKSAmJlxuICAgICAgICAgICAgaW5wdXRWYWx1ZS5sZW5ndGggPiArbWF4TGVuZ3RoT3V0cHV0LnZhbHVlO1xuICAgICAgICBjb25zdCBleGNlZWRNaW4gPSAhaXNOdWxsT3JVbmRlZmluZWQobWluTGVuZ3RoT3V0cHV0LnZhbHVlKSAmJlxuICAgICAgICAgICAgaW5wdXRWYWx1ZS5sZW5ndGggPCArbWluTGVuZ3RoT3V0cHV0LnZhbHVlO1xuICAgICAgICBpZiAoZXhjZWVkTWF4IHx8IGV4Y2VlZE1pbikge1xuICAgICAgICAgICAgZ2V0TWluTWF4TWVzc2FnZShleGNlZWRNYXgsIG1heExlbmd0aE91dHB1dC5tZXNzYWdlLCBtaW5MZW5ndGhPdXRwdXQubWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KGVycm9yW25hbWVdLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0dGVybiAmJiAhaXNFbXB0eSAmJiBpc1N0cmluZyhpbnB1dFZhbHVlKSkge1xuICAgICAgICBjb25zdCB7IHZhbHVlOiBwYXR0ZXJuVmFsdWUsIG1lc3NhZ2UgfSA9IGdldFZhbHVlQW5kTWVzc2FnZShwYXR0ZXJuKTtcbiAgICAgICAgaWYgKGlzUmVnZXgocGF0dGVyblZhbHVlKSAmJiAhaW5wdXRWYWx1ZS5tYXRjaChwYXR0ZXJuVmFsdWUpKSB7XG4gICAgICAgICAgICBlcnJvcltuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLnBhdHRlcm4sXG4gICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICByZWYsXG4gICAgICAgICAgICAgICAgLi4uYXBwZW5kRXJyb3JzQ3VycnkoSU5QVVRfVkFMSURBVElPTl9SVUxFUy5wYXR0ZXJuLCBtZXNzYWdlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsaWRhdGUpKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWxpZGF0ZShpbnB1dFZhbHVlLCBmb3JtVmFsdWVzKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlRXJyb3IgPSBnZXRWYWxpZGF0ZUVycm9yKHJlc3VsdCwgaW5wdXRSZWYpO1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvcltuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4udmFsaWRhdGVFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgLi4uYXBwZW5kRXJyb3JzQ3VycnkoSU5QVVRfVkFMSURBVElPTl9SVUxFUy52YWxpZGF0ZSwgdmFsaWRhdGVFcnJvci5tZXNzYWdlKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KHZhbGlkYXRlRXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QodmFsaWRhdGUpKSB7XG4gICAgICAgICAgICBsZXQgdmFsaWRhdGlvblJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsaWRhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRW1wdHlPYmplY3QodmFsaWRhdGlvblJlc3VsdCkgJiYgIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVFcnJvciA9IGdldFZhbGlkYXRlRXJyb3IoYXdhaXQgdmFsaWRhdGVba2V5XShpbnB1dFZhbHVlLCBmb3JtVmFsdWVzKSwgaW5wdXRSZWYsIGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnZhbGlkYXRlRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5hcHBlbmRFcnJvcnNDdXJyeShrZXksIHZhbGlkYXRlRXJyb3IubWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KHZhbGlkYXRlRXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yW25hbWVdID0gdmFsaWRhdGlvblJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNFbXB0eU9iamVjdCh2YWxpZGF0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGVycm9yW25hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICByZWY6IGlucHV0UmVmLFxuICAgICAgICAgICAgICAgICAgICAuLi52YWxpZGF0aW9uUmVzdWx0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRDdXN0b21WYWxpZGl0eSh0cnVlKTtcbiAgICByZXR1cm4gZXJyb3I7XG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBtb2RlOiBWQUxJREFUSU9OX01PREUub25TdWJtaXQsXG4gICAgcmVWYWxpZGF0ZU1vZGU6IFZBTElEQVRJT05fTU9ERS5vbkNoYW5nZSxcbiAgICBzaG91bGRGb2N1c0Vycm9yOiB0cnVlLFxufTtcbmZ1bmN0aW9uIGNyZWF0ZUZvcm1Db250cm9sKHByb3BzID0ge30pIHtcbiAgICBsZXQgX29wdGlvbnMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAuLi5wcm9wcyxcbiAgICB9O1xuICAgIGxldCBfZm9ybVN0YXRlID0ge1xuICAgICAgICBzdWJtaXRDb3VudDogMCxcbiAgICAgICAgaXNEaXJ0eTogZmFsc2UsXG4gICAgICAgIGlzUmVhZHk6IGZhbHNlLFxuICAgICAgICBpc0xvYWRpbmc6IGlzRnVuY3Rpb24oX29wdGlvbnMuZGVmYXVsdFZhbHVlcyksXG4gICAgICAgIGlzVmFsaWRhdGluZzogZmFsc2UsXG4gICAgICAgIGlzU3VibWl0dGVkOiBmYWxzZSxcbiAgICAgICAgaXNTdWJtaXR0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNTdWJtaXRTdWNjZXNzZnVsOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IHt9LFxuICAgICAgICBkaXJ0eUZpZWxkczoge30sXG4gICAgICAgIHZhbGlkYXRpbmdGaWVsZHM6IHt9LFxuICAgICAgICBlcnJvcnM6IF9vcHRpb25zLmVycm9ycyB8fCB7fSxcbiAgICAgICAgZGlzYWJsZWQ6IF9vcHRpb25zLmRpc2FibGVkIHx8IGZhbHNlLFxuICAgIH07XG4gICAgbGV0IF9maWVsZHMgPSB7fTtcbiAgICBsZXQgX2RlZmF1bHRWYWx1ZXMgPSBpc09iamVjdChfb3B0aW9ucy5kZWZhdWx0VmFsdWVzKSB8fCBpc09iamVjdChfb3B0aW9ucy52YWx1ZXMpXG4gICAgICAgID8gY2xvbmVPYmplY3QoX29wdGlvbnMuZGVmYXVsdFZhbHVlcyB8fCBfb3B0aW9ucy52YWx1ZXMpIHx8IHt9XG4gICAgICAgIDoge307XG4gICAgbGV0IF9mb3JtVmFsdWVzID0gX29wdGlvbnMuc2hvdWxkVW5yZWdpc3RlclxuICAgICAgICA/IHt9XG4gICAgICAgIDogY2xvbmVPYmplY3QoX2RlZmF1bHRWYWx1ZXMpO1xuICAgIGxldCBfc3RhdGUgPSB7XG4gICAgICAgIGFjdGlvbjogZmFsc2UsXG4gICAgICAgIG1vdW50OiBmYWxzZSxcbiAgICAgICAgd2F0Y2g6IGZhbHNlLFxuICAgIH07XG4gICAgbGV0IF9uYW1lcyA9IHtcbiAgICAgICAgbW91bnQ6IG5ldyBTZXQoKSxcbiAgICAgICAgZGlzYWJsZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgdW5Nb3VudDogbmV3IFNldCgpLFxuICAgICAgICBhcnJheTogbmV3IFNldCgpLFxuICAgICAgICB3YXRjaDogbmV3IFNldCgpLFxuICAgIH07XG4gICAgbGV0IGRlbGF5RXJyb3JDYWxsYmFjaztcbiAgICBsZXQgdGltZXIgPSAwO1xuICAgIGNvbnN0IF9wcm94eUZvcm1TdGF0ZSA9IHtcbiAgICAgICAgaXNEaXJ0eTogZmFsc2UsXG4gICAgICAgIGRpcnR5RmllbGRzOiBmYWxzZSxcbiAgICAgICAgdmFsaWRhdGluZ0ZpZWxkczogZmFsc2UsXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkYXRpbmc6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3JzOiBmYWxzZSxcbiAgICB9O1xuICAgIGxldCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUgPSB7XG4gICAgICAgIC4uLl9wcm94eUZvcm1TdGF0ZSxcbiAgICB9O1xuICAgIGNvbnN0IF9zdWJqZWN0cyA9IHtcbiAgICAgICAgYXJyYXk6IGNyZWF0ZVN1YmplY3QoKSxcbiAgICAgICAgc3RhdGU6IGNyZWF0ZVN1YmplY3QoKSxcbiAgICB9O1xuICAgIGNvbnN0IHNob3VsZERpc3BsYXlBbGxBc3NvY2lhdGVkRXJyb3JzID0gX29wdGlvbnMuY3JpdGVyaWFNb2RlID09PSBWQUxJREFUSU9OX01PREUuYWxsO1xuICAgIGNvbnN0IGRlYm91bmNlID0gKGNhbGxiYWNrKSA9PiAod2FpdCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHdhaXQpO1xuICAgIH07XG4gICAgY29uc3QgX3NldFZhbGlkID0gYXN5bmMgKHNob3VsZFVwZGF0ZVZhbGlkKSA9PiB7XG4gICAgICAgIGlmICghX29wdGlvbnMuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgIChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fFxuICAgICAgICAgICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5pc1ZhbGlkIHx8XG4gICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlVmFsaWQpKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gX29wdGlvbnMucmVzb2x2ZXJcbiAgICAgICAgICAgICAgICA/IGlzRW1wdHlPYmplY3QoKGF3YWl0IF9ydW5TY2hlbWEoKSkuZXJyb3JzKVxuICAgICAgICAgICAgICAgIDogYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKF9maWVsZHMsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGlzVmFsaWQgIT09IF9mb3JtU3RhdGUuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgX3VwZGF0ZUlzVmFsaWRhdGluZyA9IChuYW1lcywgaXNWYWxpZGF0aW5nKSA9PiB7XG4gICAgICAgIGlmICghX29wdGlvbnMuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgIChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZGF0aW5nIHx8XG4gICAgICAgICAgICAgICAgX3Byb3h5Rm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZGF0aW5nIHx8XG4gICAgICAgICAgICAgICAgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMpKSB7XG4gICAgICAgICAgICAobmFtZXMgfHwgQXJyYXkuZnJvbShfbmFtZXMubW91bnQpKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZGF0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHNldChfZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMsIG5hbWUsIGlzVmFsaWRhdGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5zZXQoX2Zvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW5nRmllbGRzOiBfZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMsXG4gICAgICAgICAgICAgICAgaXNWYWxpZGF0aW5nOiAhaXNFbXB0eU9iamVjdChfZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9zZXRGaWVsZEFycmF5ID0gKG5hbWUsIHZhbHVlcyA9IFtdLCBtZXRob2QsIGFyZ3MsIHNob3VsZFNldFZhbHVlcyA9IHRydWUsIHNob3VsZFVwZGF0ZUZpZWxkc0FuZFN0YXRlID0gdHJ1ZSkgPT4ge1xuICAgICAgICBpZiAoYXJncyAmJiBtZXRob2QgJiYgIV9vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBfc3RhdGUuYWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChzaG91bGRVcGRhdGVGaWVsZHNBbmRTdGF0ZSAmJiBBcnJheS5pc0FycmF5KGdldChfZmllbGRzLCBuYW1lKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlcyA9IG1ldGhvZChnZXQoX2ZpZWxkcywgbmFtZSksIGFyZ3MuYXJnQSwgYXJncy5hcmdCKTtcbiAgICAgICAgICAgICAgICBzaG91bGRTZXRWYWx1ZXMgJiYgc2V0KF9maWVsZHMsIG5hbWUsIGZpZWxkVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaG91bGRVcGRhdGVGaWVsZHNBbmRTdGF0ZSAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBtZXRob2QoZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSwgYXJncy5hcmdBLCBhcmdzLmFyZ0IpO1xuICAgICAgICAgICAgICAgIHNob3VsZFNldFZhbHVlcyAmJiBzZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUsIGVycm9ycyk7XG4gICAgICAgICAgICAgICAgdW5zZXRFbXB0eUFycmF5KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoX3Byb3h5Rm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUudG91Y2hlZEZpZWxkcykgJiZcbiAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZHNBbmRTdGF0ZSAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZ2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG91Y2hlZEZpZWxkcyA9IG1ldGhvZChnZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSwgYXJncy5hcmdBLCBhcmdzLmFyZ0IpO1xuICAgICAgICAgICAgICAgIHNob3VsZFNldFZhbHVlcyAmJiBzZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lLCB0b3VjaGVkRmllbGRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfcHJveHlGb3JtU3RhdGUuZGlydHlGaWVsZHMgfHwgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmRpcnR5RmllbGRzKSB7XG4gICAgICAgICAgICAgICAgX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcyA9IGdldERpcnR5RmllbGRzKF9kZWZhdWx0VmFsdWVzLCBfZm9ybVZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBpc0RpcnR5OiBfZ2V0RGlydHkobmFtZSwgdmFsdWVzKSxcbiAgICAgICAgICAgICAgICBkaXJ0eUZpZWxkczogX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcyxcbiAgICAgICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICAgICAgICAgIGlzVmFsaWQ6IF9mb3JtU3RhdGUuaXNWYWxpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVFcnJvcnMgPSAobmFtZSwgZXJyb3IpID0+IHtcbiAgICAgICAgc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcik7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgX3NldEVycm9ycyA9IChlcnJvcnMpID0+IHtcbiAgICAgICAgX2Zvcm1TdGF0ZS5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVWYWxpZEFuZFZhbHVlID0gKG5hbWUsIHNob3VsZFNraXBTZXRWYWx1ZUFzLCB2YWx1ZSwgcmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGdldChfZm9ybVZhbHVlcywgbmFtZSwgaXNVbmRlZmluZWQodmFsdWUpID8gZ2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lKSA6IHZhbHVlKTtcbiAgICAgICAgICAgIGlzVW5kZWZpbmVkKGRlZmF1bHRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAocmVmICYmIHJlZi5kZWZhdWx0Q2hlY2tlZCkgfHxcbiAgICAgICAgICAgICAgICBzaG91bGRTa2lwU2V0VmFsdWVBc1xuICAgICAgICAgICAgICAgID8gc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCBzaG91bGRTa2lwU2V0VmFsdWVBcyA/IGRlZmF1bHRWYWx1ZSA6IGdldEZpZWxkVmFsdWUoZmllbGQuX2YpKVxuICAgICAgICAgICAgICAgIDogc2V0RmllbGRWYWx1ZShuYW1lLCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgX3N0YXRlLm1vdW50ICYmIF9zZXRWYWxpZCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVUb3VjaEFuZERpcnR5ID0gKG5hbWUsIGZpZWxkVmFsdWUsIGlzQmx1ckV2ZW50LCBzaG91bGREaXJ0eSwgc2hvdWxkUmVuZGVyKSA9PiB7XG4gICAgICAgIGxldCBzaG91bGRVcGRhdGVGaWVsZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaXNQcmV2aW91c0RpcnR5ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghX29wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNCbHVyRXZlbnQgfHwgc2hvdWxkRGlydHkpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3Byb3h5Rm9ybVN0YXRlLmlzRGlydHkgfHwgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNQcmV2aW91c0RpcnR5ID0gX2Zvcm1TdGF0ZS5pc0RpcnR5O1xuICAgICAgICAgICAgICAgICAgICBfZm9ybVN0YXRlLmlzRGlydHkgPSBvdXRwdXQuaXNEaXJ0eSA9IF9nZXREaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCA9IGlzUHJldmlvdXNEaXJ0eSAhPT0gb3V0cHV0LmlzRGlydHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudEZpZWxkUHJpc3RpbmUgPSBkZWVwRXF1YWwoZ2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lKSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaXNQcmV2aW91c0RpcnR5ID0gISFnZXQoX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaXNDdXJyZW50RmllbGRQcmlzdGluZVxuICAgICAgICAgICAgICAgICAgICA/IHVuc2V0KF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsIG5hbWUpXG4gICAgICAgICAgICAgICAgICAgIDogc2V0KF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsIG5hbWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIG91dHB1dC5kaXJ0eUZpZWxkcyA9IF9mb3JtU3RhdGUuZGlydHlGaWVsZHM7XG4gICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmllbGQgPVxuICAgICAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKChfcHJveHlGb3JtU3RhdGUuZGlydHlGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuZGlydHlGaWVsZHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmV2aW91c0RpcnR5ICE9PSAhaXNDdXJyZW50RmllbGRQcmlzdGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNCbHVyRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1ByZXZpb3VzRmllbGRUb3VjaGVkID0gZ2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ByZXZpb3VzRmllbGRUb3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldChfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMsIG5hbWUsIGlzQmx1ckV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnRvdWNoZWRGaWVsZHMgPSBfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHM7XG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfcHJveHlGb3JtU3RhdGUudG91Y2hlZEZpZWxkcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUudG91Y2hlZEZpZWxkcykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmV2aW91c0ZpZWxkVG91Y2hlZCAhPT0gaXNCbHVyRXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkICYmIHNob3VsZFJlbmRlciAmJiBfc3ViamVjdHMuc3RhdGUubmV4dChvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaG91bGRVcGRhdGVGaWVsZCA/IG91dHB1dCA6IHt9O1xuICAgIH07XG4gICAgY29uc3Qgc2hvdWxkUmVuZGVyQnlFcnJvciA9IChuYW1lLCBpc1ZhbGlkLCBlcnJvciwgZmllbGRTdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aW91c0ZpZWxkRXJyb3IgPSBnZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpO1xuICAgICAgICBjb25zdCBzaG91bGRVcGRhdGVWYWxpZCA9IChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZCkgJiZcbiAgICAgICAgICAgIGlzQm9vbGVhbihpc1ZhbGlkKSAmJlxuICAgICAgICAgICAgX2Zvcm1TdGF0ZS5pc1ZhbGlkICE9PSBpc1ZhbGlkO1xuICAgICAgICBpZiAoX29wdGlvbnMuZGVsYXlFcnJvciAmJiBlcnJvcikge1xuICAgICAgICAgICAgZGVsYXlFcnJvckNhbGxiYWNrID0gZGVib3VuY2UoKCkgPT4gdXBkYXRlRXJyb3JzKG5hbWUsIGVycm9yKSk7XG4gICAgICAgICAgICBkZWxheUVycm9yQ2FsbGJhY2soX29wdGlvbnMuZGVsYXlFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgZGVsYXlFcnJvckNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgPyBzZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUsIGVycm9yKVxuICAgICAgICAgICAgICAgIDogdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoZXJyb3IgPyAhZGVlcEVxdWFsKHByZXZpb3VzRmllbGRFcnJvciwgZXJyb3IpIDogcHJldmlvdXNGaWVsZEVycm9yKSB8fFxuICAgICAgICAgICAgIWlzRW1wdHlPYmplY3QoZmllbGRTdGF0ZSkgfHxcbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZVZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkRm9ybVN0YXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLmZpZWxkU3RhdGUsXG4gICAgICAgICAgICAgICAgLi4uKHNob3VsZFVwZGF0ZVZhbGlkICYmIGlzQm9vbGVhbihpc1ZhbGlkKSA/IHsgaXNWYWxpZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBfZm9ybVN0YXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLl9mb3JtU3RhdGUsXG4gICAgICAgICAgICAgICAgLi4udXBkYXRlZEZvcm1TdGF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh1cGRhdGVkRm9ybVN0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgX3J1blNjaGVtYSA9IGFzeW5jIChuYW1lKSA9PiB7XG4gICAgICAgIF91cGRhdGVJc1ZhbGlkYXRpbmcobmFtZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9vcHRpb25zLnJlc29sdmVyKF9mb3JtVmFsdWVzLCBfb3B0aW9ucy5jb250ZXh0LCBnZXRSZXNvbHZlck9wdGlvbnMobmFtZSB8fCBfbmFtZXMubW91bnQsIF9maWVsZHMsIF9vcHRpb25zLmNyaXRlcmlhTW9kZSwgX29wdGlvbnMuc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbikpO1xuICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKG5hbWUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgY29uc3QgZXhlY3V0ZVNjaGVtYUFuZFVwZGF0ZVN0YXRlID0gYXN5bmMgKG5hbWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBhd2FpdCBfcnVuU2NoZW1hKG5hbWVzKTtcbiAgICAgICAgaWYgKG5hbWVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGdldChlcnJvcnMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgICAgID8gc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgOiB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfZm9ybVN0YXRlLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH07XG4gICAgY29uc3QgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uID0gYXN5bmMgKGZpZWxkcywgc2hvdWxkT25seUNoZWNrVmFsaWQsIGNvbnRleHQgPSB7XG4gICAgICAgIHZhbGlkOiB0cnVlLFxuICAgIH0pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IF9mLCAuLi5maWVsZFZhbHVlIH0gPSBmaWVsZDtcbiAgICAgICAgICAgICAgICBpZiAoX2YpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaWVsZEFycmF5Um9vdCA9IF9uYW1lcy5hcnJheS5oYXMoX2YubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUHJvbWlzZUZ1bmN0aW9uID0gZmllbGQuX2YgJiYgaGFzUHJvbWlzZVZhbGlkYXRpb24oZmllbGQuX2YpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlRnVuY3Rpb24gJiYgX3Byb3h5Rm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVJc1ZhbGlkYXRpbmcoW25hbWVdLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZEVycm9yID0gYXdhaXQgdmFsaWRhdGVGaWVsZChmaWVsZCwgX25hbWVzLmRpc2FibGVkLCBfZm9ybVZhbHVlcywgc2hvdWxkRGlzcGxheUFsbEFzc29jaWF0ZWRFcnJvcnMsIF9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24gJiYgIXNob3VsZE9ubHlDaGVja1ZhbGlkLCBpc0ZpZWxkQXJyYXlSb290KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZUZ1bmN0aW9uICYmIF9wcm94eUZvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKFtuYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRXJyb3JbX2YubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRPbmx5Q2hlY2tWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICFzaG91bGRPbmx5Q2hlY2tWYWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGdldChmaWVsZEVycm9yLCBfZi5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaXNGaWVsZEFycmF5Um9vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVwZGF0ZUZpZWxkQXJyYXlSb290RXJyb3IoX2Zvcm1TdGF0ZS5lcnJvcnMsIGZpZWxkRXJyb3IsIF9mLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBfZi5uYW1lLCBmaWVsZEVycm9yW19mLm5hbWVdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIF9mLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIWlzRW1wdHlPYmplY3QoZmllbGRWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihmaWVsZFZhbHVlLCBzaG91bGRPbmx5Q2hlY2tWYWxpZCwgY29udGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0LnZhbGlkO1xuICAgIH07XG4gICAgY29uc3QgX3JlbW92ZVVubW91bnRlZCA9ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIF9uYW1lcy51bk1vdW50KSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgIGZpZWxkICYmXG4gICAgICAgICAgICAgICAgKGZpZWxkLl9mLnJlZnNcbiAgICAgICAgICAgICAgICAgICAgPyBmaWVsZC5fZi5yZWZzLmV2ZXJ5KChyZWYpID0+ICFsaXZlKHJlZikpXG4gICAgICAgICAgICAgICAgICAgIDogIWxpdmUoZmllbGQuX2YucmVmKSkgJiZcbiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIF9uYW1lcy51bk1vdW50ID0gbmV3IFNldCgpO1xuICAgIH07XG4gICAgY29uc3QgX2dldERpcnR5ID0gKG5hbWUsIGRhdGEpID0+ICFfb3B0aW9ucy5kaXNhYmxlZCAmJlxuICAgICAgICAobmFtZSAmJiBkYXRhICYmIHNldChfZm9ybVZhbHVlcywgbmFtZSwgZGF0YSksXG4gICAgICAgICAgICAhZGVlcEVxdWFsKGdldFZhbHVlcygpLCBfZGVmYXVsdFZhbHVlcykpO1xuICAgIGNvbnN0IF9nZXRXYXRjaCA9IChuYW1lcywgZGVmYXVsdFZhbHVlLCBpc0dsb2JhbCkgPT4gZ2VuZXJhdGVXYXRjaE91dHB1dChuYW1lcywgX25hbWVzLCB7XG4gICAgICAgIC4uLihfc3RhdGUubW91bnRcbiAgICAgICAgICAgID8gX2Zvcm1WYWx1ZXNcbiAgICAgICAgICAgIDogaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKVxuICAgICAgICAgICAgICAgID8gX2RlZmF1bHRWYWx1ZXNcbiAgICAgICAgICAgICAgICA6IGlzU3RyaW5nKG5hbWVzKVxuICAgICAgICAgICAgICAgICAgICA/IHsgW25hbWVzXTogZGVmYXVsdFZhbHVlIH1cbiAgICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0VmFsdWUpLFxuICAgIH0sIGlzR2xvYmFsLCBkZWZhdWx0VmFsdWUpO1xuICAgIGNvbnN0IF9nZXRGaWVsZEFycmF5ID0gKG5hbWUpID0+IGNvbXBhY3QoZ2V0KF9zdGF0ZS5tb3VudCA/IF9mb3JtVmFsdWVzIDogX2RlZmF1bHRWYWx1ZXMsIG5hbWUsIF9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXIgPyBnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUsIFtdKSA6IFtdKSk7XG4gICAgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IChuYW1lLCB2YWx1ZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBsZXQgZmllbGRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUmVmZXJlbmNlID0gZmllbGQuX2Y7XG4gICAgICAgICAgICBpZiAoZmllbGRSZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAhZmllbGRSZWZlcmVuY2UuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCBnZXRGaWVsZFZhbHVlQXModmFsdWUsIGZpZWxkUmVmZXJlbmNlKSk7XG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgIGlzSFRNTEVsZW1lbnQoZmllbGRSZWZlcmVuY2UucmVmKSAmJiBpc051bGxPclVuZGVmaW5lZCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzTXVsdGlwbGVTZWxlY3QoZmllbGRSZWZlcmVuY2UucmVmKSkge1xuICAgICAgICAgICAgICAgICAgICBbLi4uZmllbGRSZWZlcmVuY2UucmVmLm9wdGlvbnNdLmZvckVhY2goKG9wdGlvblJlZikgPT4gKG9wdGlvblJlZi5zZWxlY3RlZCA9IGZpZWxkVmFsdWUuaW5jbHVkZXMob3B0aW9uUmVmLnZhbHVlKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFJlZmVyZW5jZS5yZWZzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NoZWNrQm94SW5wdXQoZmllbGRSZWZlcmVuY2UucmVmKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmcy5mb3JFYWNoKChjaGVja2JveFJlZikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tib3hSZWYuZGVmYXVsdENoZWNrZWQgfHwgIWNoZWNrYm94UmVmLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveFJlZi5jaGVja2VkID0gISFmaWVsZFZhbHVlLmZpbmQoKGRhdGEpID0+IGRhdGEgPT09IGNoZWNrYm94UmVmLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94UmVmLmNoZWNrZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPT09IGNoZWNrYm94UmVmLnZhbHVlIHx8ICEhZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmcy5mb3JFYWNoKChyYWRpb1JlZikgPT4gKHJhZGlvUmVmLmNoZWNrZWQgPSByYWRpb1JlZi52YWx1ZSA9PT0gZmllbGRWYWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRmlsZUlucHV0KGZpZWxkUmVmZXJlbmNlLnJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmLnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZFJlZmVyZW5jZS5yZWYudmFsdWUgPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkUmVmZXJlbmNlLnJlZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIChvcHRpb25zLnNob3VsZERpcnR5IHx8IG9wdGlvbnMuc2hvdWxkVG91Y2gpICYmXG4gICAgICAgICAgICB1cGRhdGVUb3VjaEFuZERpcnR5KG5hbWUsIGZpZWxkVmFsdWUsIG9wdGlvbnMuc2hvdWxkVG91Y2gsIG9wdGlvbnMuc2hvdWxkRGlydHksIHRydWUpO1xuICAgICAgICBvcHRpb25zLnNob3VsZFZhbGlkYXRlICYmIHRyaWdnZXIobmFtZSk7XG4gICAgfTtcbiAgICBjb25zdCBzZXRWYWx1ZXMgPSAobmFtZSwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZEtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZS5oYXNPd25Qcm9wZXJ0eShmaWVsZEtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gdmFsdWVbZmllbGRLZXldO1xuICAgICAgICAgICAgY29uc3QgZmllbGROYW1lID0gbmFtZSArICcuJyArIGZpZWxkS2V5O1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgIChfbmFtZXMuYXJyYXkuaGFzKG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgaXNPYmplY3QoZmllbGRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAoZmllbGQgJiYgIWZpZWxkLl9mKSkgJiZcbiAgICAgICAgICAgICAgICAhaXNEYXRlT2JqZWN0KGZpZWxkVmFsdWUpXG4gICAgICAgICAgICAgICAgPyBzZXRWYWx1ZXMoZmllbGROYW1lLCBmaWVsZFZhbHVlLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIDogc2V0RmllbGRWYWx1ZShmaWVsZE5hbWUsIGZpZWxkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBzZXRWYWx1ZSA9IChuYW1lLCB2YWx1ZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBjb25zdCBpc0ZpZWxkQXJyYXkgPSBfbmFtZXMuYXJyYXkuaGFzKG5hbWUpO1xuICAgICAgICBjb25zdCBjbG9uZVZhbHVlID0gY2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgICBzZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIGNsb25lVmFsdWUpO1xuICAgICAgICBpZiAoaXNGaWVsZEFycmF5KSB7XG4gICAgICAgICAgICBfc3ViamVjdHMuYXJyYXkubmV4dCh7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKChfcHJveHlGb3JtU3RhdGUuaXNEaXJ0eSB8fFxuICAgICAgICAgICAgICAgIF9wcm94eUZvcm1TdGF0ZS5kaXJ0eUZpZWxkcyB8fFxuICAgICAgICAgICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5pc0RpcnR5IHx8XG4gICAgICAgICAgICAgICAgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmRpcnR5RmllbGRzKSAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hvdWxkRGlydHkpIHtcbiAgICAgICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRpcnR5RmllbGRzOiBnZXREaXJ0eUZpZWxkcyhfZGVmYXVsdFZhbHVlcywgX2Zvcm1WYWx1ZXMpLFxuICAgICAgICAgICAgICAgICAgICBpc0RpcnR5OiBfZ2V0RGlydHkobmFtZSwgY2xvbmVWYWx1ZSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWVsZCAmJiAhZmllbGQuX2YgJiYgIWlzTnVsbE9yVW5kZWZpbmVkKGNsb25lVmFsdWUpXG4gICAgICAgICAgICAgICAgPyBzZXRWYWx1ZXMobmFtZSwgY2xvbmVWYWx1ZSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICA6IHNldEZpZWxkVmFsdWUobmFtZSwgY2xvbmVWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaXNXYXRjaGVkKG5hbWUsIF9uYW1lcykgJiYgX3N1YmplY3RzLnN0YXRlLm5leHQoeyAuLi5fZm9ybVN0YXRlIH0pO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBuYW1lOiBfc3RhdGUubW91bnQgPyBuYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdmFsdWVzOiBjbG9uZU9iamVjdChfZm9ybVZhbHVlcyksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgb25DaGFuZ2UgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgX3N0YXRlLm1vdW50ID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICBsZXQgbmFtZSA9IHRhcmdldC5uYW1lO1xuICAgICAgICBsZXQgaXNGaWVsZFZhbHVlVXBkYXRlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBjb25zdCBfdXBkYXRlSXNGaWVsZFZhbHVlVXBkYXRlZCA9IChmaWVsZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpc0ZpZWxkVmFsdWVVcGRhdGVkID1cbiAgICAgICAgICAgICAgICBOdW1iZXIuaXNOYU4oZmllbGRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzRGF0ZU9iamVjdChmaWVsZFZhbHVlKSAmJiBpc05hTihmaWVsZFZhbHVlLmdldFRpbWUoKSkpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRlZXBFcXVhbChmaWVsZFZhbHVlLCBnZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIGZpZWxkVmFsdWUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbk1vZGVCZWZvcmVTdWJtaXQgPSBnZXRWYWxpZGF0aW9uTW9kZXMoX29wdGlvbnMubW9kZSk7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25Nb2RlQWZ0ZXJTdWJtaXQgPSBnZXRWYWxpZGF0aW9uTW9kZXMoX29wdGlvbnMucmVWYWxpZGF0ZU1vZGUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkO1xuICAgICAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHRhcmdldC50eXBlXG4gICAgICAgICAgICAgICAgPyBnZXRGaWVsZFZhbHVlKGZpZWxkLl9mKVxuICAgICAgICAgICAgICAgIDogZ2V0RXZlbnRWYWx1ZShldmVudCk7XG4gICAgICAgICAgICBjb25zdCBpc0JsdXJFdmVudCA9IGV2ZW50LnR5cGUgPT09IEVWRU5UUy5CTFVSIHx8IGV2ZW50LnR5cGUgPT09IEVWRU5UUy5GT0NVU19PVVQ7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRTa2lwVmFsaWRhdGlvbiA9ICghaGFzVmFsaWRhdGlvbihmaWVsZC5fZikgJiZcbiAgICAgICAgICAgICAgICAhX29wdGlvbnMucmVzb2x2ZXIgJiZcbiAgICAgICAgICAgICAgICAhZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAgICFmaWVsZC5fZi5kZXBzKSB8fFxuICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uKGlzQmx1ckV2ZW50LCBnZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSwgX2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZCwgdmFsaWRhdGlvbk1vZGVBZnRlclN1Ym1pdCwgdmFsaWRhdGlvbk1vZGVCZWZvcmVTdWJtaXQpO1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlZCA9IGlzV2F0Y2hlZChuYW1lLCBfbmFtZXMsIGlzQmx1ckV2ZW50KTtcbiAgICAgICAgICAgIHNldChfZm9ybVZhbHVlcywgbmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoaXNCbHVyRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5vbkJsdXIgJiYgZmllbGQuX2Yub25CbHVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBkZWxheUVycm9yQ2FsbGJhY2sgJiYgZGVsYXlFcnJvckNhbGxiYWNrKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQuX2Yub25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5vbkNoYW5nZShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZFN0YXRlID0gdXBkYXRlVG91Y2hBbmREaXJ0eShuYW1lLCBmaWVsZFZhbHVlLCBpc0JsdXJFdmVudCk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZW5kZXIgPSAhaXNFbXB0eU9iamVjdChmaWVsZFN0YXRlKSB8fCB3YXRjaGVkO1xuICAgICAgICAgICAgIWlzQmx1ckV2ZW50ICYmXG4gICAgICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBldmVudC50eXBlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzaG91bGRTa2lwVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX29wdGlvbnMubW9kZSA9PT0gJ29uQmx1cicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0JsdXJFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZXRWYWxpZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc0JsdXJFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3NldFZhbGlkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIChzaG91bGRSZW5kZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoeyBuYW1lLCAuLi4od2F0Y2hlZCA/IHt9IDogZmllbGRTdGF0ZSkgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgIWlzQmx1ckV2ZW50ICYmIHdhdGNoZWQgJiYgX3N1YmplY3RzLnN0YXRlLm5leHQoeyAuLi5fZm9ybVN0YXRlIH0pO1xuICAgICAgICAgICAgaWYgKF9vcHRpb25zLnJlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvcnMgfSA9IGF3YWl0IF9ydW5TY2hlbWEoW25hbWVdKTtcbiAgICAgICAgICAgICAgICBfdXBkYXRlSXNGaWVsZFZhbHVlVXBkYXRlZChmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNGaWVsZFZhbHVlVXBkYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0Vycm9yTG9va3VwUmVzdWx0ID0gc2NoZW1hRXJyb3JMb29rdXAoX2Zvcm1TdGF0ZS5lcnJvcnMsIF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckxvb2t1cFJlc3VsdCA9IHNjaGVtYUVycm9yTG9va3VwKGVycm9ycywgX2ZpZWxkcywgcHJldmlvdXNFcnJvckxvb2t1cFJlc3VsdC5uYW1lIHx8IG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycm9yTG9va3VwUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICBuYW1lID0gZXJyb3JMb29rdXBSZXN1bHQubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGlzRW1wdHlPYmplY3QoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKFtuYW1lXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSAoYXdhaXQgdmFsaWRhdGVGaWVsZChmaWVsZCwgX25hbWVzLmRpc2FibGVkLCBfZm9ybVZhbHVlcywgc2hvdWxkRGlzcGxheUFsbEFzc29jaWF0ZWRFcnJvcnMsIF9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24pKVtuYW1lXTtcbiAgICAgICAgICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKFtuYW1lXSk7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZUlzRmllbGRWYWx1ZVVwZGF0ZWQoZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmllbGRWYWx1ZVVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5pc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKF9maWVsZHMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRmllbGRWYWx1ZVVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5kZXBzICYmXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoZmllbGQuX2YuZGVwcyk7XG4gICAgICAgICAgICAgICAgc2hvdWxkUmVuZGVyQnlFcnJvcihuYW1lLCBpc1ZhbGlkLCBlcnJvciwgZmllbGRTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9mb2N1c0lucHV0ID0gKHJlZiwga2V5KSA9PiB7XG4gICAgICAgIGlmIChnZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIGtleSkgJiYgcmVmLmZvY3VzKSB7XG4gICAgICAgICAgICByZWYuZm9jdXMoKTtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xuICAgIGNvbnN0IHRyaWdnZXIgPSBhc3luYyAobmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGxldCBpc1ZhbGlkO1xuICAgICAgICBsZXQgdmFsaWRhdGlvblJlc3VsdDtcbiAgICAgICAgY29uc3QgZmllbGROYW1lcyA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChuYW1lKTtcbiAgICAgICAgaWYgKF9vcHRpb25zLnJlc29sdmVyKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBleGVjdXRlU2NoZW1hQW5kVXBkYXRlU3RhdGUoaXNVbmRlZmluZWQobmFtZSkgPyBuYW1lIDogZmllbGROYW1lcyk7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNFbXB0eU9iamVjdChlcnJvcnMpO1xuICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IG5hbWVcbiAgICAgICAgICAgICAgICA/ICFmaWVsZE5hbWVzLnNvbWUoKG5hbWUpID0+IGdldChlcnJvcnMsIG5hbWUpKVxuICAgICAgICAgICAgICAgIDogaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lKSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gKGF3YWl0IFByb21pc2UuYWxsKGZpZWxkTmFtZXMubWFwKGFzeW5jIChmaWVsZE5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlQnVpbHRJblZhbGlkYXRpb24oZmllbGQgJiYgZmllbGQuX2YgPyB7IFtmaWVsZE5hbWVdOiBmaWVsZCB9IDogZmllbGQpO1xuICAgICAgICAgICAgfSkpKS5ldmVyeShCb29sZWFuKTtcbiAgICAgICAgICAgICEoIXZhbGlkYXRpb25SZXN1bHQgJiYgIV9mb3JtU3RhdGUuaXNWYWxpZCkgJiYgX3NldFZhbGlkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gaXNWYWxpZCA9IGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihfZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAuLi4oIWlzU3RyaW5nKG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgKChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCAhPT0gX2Zvcm1TdGF0ZS5pc1ZhbGlkKVxuICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICA6IHsgbmFtZSB9KSxcbiAgICAgICAgICAgIC4uLihfb3B0aW9ucy5yZXNvbHZlciB8fCAhbmFtZSA/IHsgaXNWYWxpZCB9IDoge30pLFxuICAgICAgICAgICAgZXJyb3JzOiBfZm9ybVN0YXRlLmVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICAgIG9wdGlvbnMuc2hvdWxkRm9jdXMgJiZcbiAgICAgICAgICAgICF2YWxpZGF0aW9uUmVzdWx0ICYmXG4gICAgICAgICAgICBpdGVyYXRlRmllbGRzQnlBY3Rpb24oX2ZpZWxkcywgX2ZvY3VzSW5wdXQsIG5hbWUgPyBmaWVsZE5hbWVzIDogX25hbWVzLm1vdW50KTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQ7XG4gICAgfTtcbiAgICBjb25zdCBnZXRWYWx1ZXMgPSAoZmllbGROYW1lcykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgICAgICAuLi4oX3N0YXRlLm1vdW50ID8gX2Zvcm1WYWx1ZXMgOiBfZGVmYXVsdFZhbHVlcyksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZChmaWVsZE5hbWVzKVxuICAgICAgICAgICAgPyB2YWx1ZXNcbiAgICAgICAgICAgIDogaXNTdHJpbmcoZmllbGROYW1lcylcbiAgICAgICAgICAgICAgICA/IGdldCh2YWx1ZXMsIGZpZWxkTmFtZXMpXG4gICAgICAgICAgICAgICAgOiBmaWVsZE5hbWVzLm1hcCgobmFtZSkgPT4gZ2V0KHZhbHVlcywgbmFtZSkpO1xuICAgIH07XG4gICAgY29uc3QgZ2V0RmllbGRTdGF0ZSA9IChuYW1lLCBmb3JtU3RhdGUpID0+ICh7XG4gICAgICAgIGludmFsaWQ6ICEhZ2V0KChmb3JtU3RhdGUgfHwgX2Zvcm1TdGF0ZSkuZXJyb3JzLCBuYW1lKSxcbiAgICAgICAgaXNEaXJ0eTogISFnZXQoKGZvcm1TdGF0ZSB8fCBfZm9ybVN0YXRlKS5kaXJ0eUZpZWxkcywgbmFtZSksXG4gICAgICAgIGVycm9yOiBnZXQoKGZvcm1TdGF0ZSB8fCBfZm9ybVN0YXRlKS5lcnJvcnMsIG5hbWUpLFxuICAgICAgICBpc1ZhbGlkYXRpbmc6ICEhZ2V0KF9mb3JtU3RhdGUudmFsaWRhdGluZ0ZpZWxkcywgbmFtZSksXG4gICAgICAgIGlzVG91Y2hlZDogISFnZXQoKGZvcm1TdGF0ZSB8fCBfZm9ybVN0YXRlKS50b3VjaGVkRmllbGRzLCBuYW1lKSxcbiAgICB9KTtcbiAgICBjb25zdCBjbGVhckVycm9ycyA9IChuYW1lKSA9PiB7XG4gICAgICAgIG5hbWUgJiZcbiAgICAgICAgICAgIGNvbnZlcnRUb0FycmF5UGF5bG9hZChuYW1lKS5mb3JFYWNoKChpbnB1dE5hbWUpID0+IHVuc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBpbnB1dE5hbWUpKTtcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgZXJyb3JzOiBuYW1lID8gX2Zvcm1TdGF0ZS5lcnJvcnMgOiB7fSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBzZXRFcnJvciA9IChuYW1lLCBlcnJvciwgb3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCByZWYgPSAoZ2V0KF9maWVsZHMsIG5hbWUsIHsgX2Y6IHt9IH0pLl9mIHx8IHt9KS5yZWY7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFcnJvciA9IGdldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSkgfHwge307XG4gICAgICAgIC8vIERvbid0IG92ZXJyaWRlIGV4aXN0aW5nIGVycm9yIG1lc3NhZ2VzIGVsc2V3aGVyZSBpbiB0aGUgb2JqZWN0IHRyZWUuXG4gICAgICAgIGNvbnN0IHsgcmVmOiBjdXJyZW50UmVmLCBtZXNzYWdlLCB0eXBlLCAuLi5yZXN0T2ZFcnJvclRyZWUgfSA9IGN1cnJlbnRFcnJvcjtcbiAgICAgICAgc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCB7XG4gICAgICAgICAgICAuLi5yZXN0T2ZFcnJvclRyZWUsXG4gICAgICAgICAgICAuLi5lcnJvcixcbiAgICAgICAgICAgIHJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuc2hvdWxkRm9jdXMgJiYgcmVmICYmIHJlZi5mb2N1cyAmJiByZWYuZm9jdXMoKTtcbiAgICB9O1xuICAgIGNvbnN0IHdhdGNoID0gKG5hbWUsIGRlZmF1bHRWYWx1ZSkgPT4gaXNGdW5jdGlvbihuYW1lKVxuICAgICAgICA/IF9zdWJqZWN0cy5zdGF0ZS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHBheWxvYWQpID0+IG5hbWUoX2dldFdhdGNoKHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlKSwgcGF5bG9hZCksXG4gICAgICAgIH0pXG4gICAgICAgIDogX2dldFdhdGNoKG5hbWUsIGRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gICAgY29uc3QgX3N1YnNjcmliZSA9IChwcm9wcykgPT4gX3N1YmplY3RzLnN0YXRlLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChmb3JtU3RhdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChzaG91bGRTdWJzY3JpYmVCeU5hbWUocHJvcHMubmFtZSwgZm9ybVN0YXRlLm5hbWUsIHByb3BzLmV4YWN0KSAmJlxuICAgICAgICAgICAgICAgIHNob3VsZFJlbmRlckZvcm1TdGF0ZShmb3JtU3RhdGUsIHByb3BzLmZvcm1TdGF0ZSB8fCBfcHJveHlGb3JtU3RhdGUsIF9zZXRGb3JtU3RhdGUsIHByb3BzLnJlUmVuZGVyUm9vdCkpIHtcbiAgICAgICAgICAgICAgICBwcm9wcy5jYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogeyAuLi5fZm9ybVZhbHVlcyB9LFxuICAgICAgICAgICAgICAgICAgICAuLi5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAuLi5mb3JtU3RhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSkudW5zdWJzY3JpYmU7XG4gICAgY29uc3Qgc3Vic2NyaWJlID0gKHByb3BzKSA9PiB7XG4gICAgICAgIF9zdGF0ZS5tb3VudCA9IHRydWU7XG4gICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgIC4uLl9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZSxcbiAgICAgICAgICAgIC4uLnByb3BzLmZvcm1TdGF0ZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF9zdWJzY3JpYmUoe1xuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgICAgICBmb3JtU3RhdGU6IF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCB1bnJlZ2lzdGVyID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiBuYW1lID8gY29udmVydFRvQXJyYXlQYXlsb2FkKG5hbWUpIDogX25hbWVzLm1vdW50KSB7XG4gICAgICAgICAgICBfbmFtZXMubW91bnQuZGVsZXRlKGZpZWxkTmFtZSk7XG4gICAgICAgICAgICBfbmFtZXMuYXJyYXkuZGVsZXRlKGZpZWxkTmFtZSk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMua2VlcFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdW5zZXQoX2ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVZhbHVlcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICFvcHRpb25zLmtlZXBFcnJvciAmJiB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICFvcHRpb25zLmtlZXBEaXJ0eSAmJiB1bnNldChfZm9ybVN0YXRlLmRpcnR5RmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgIW9wdGlvbnMua2VlcFRvdWNoZWQgJiYgdW5zZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgIW9wdGlvbnMua2VlcElzVmFsaWRhdGluZyAmJlxuICAgICAgICAgICAgICAgIHVuc2V0KF9mb3JtU3RhdGUudmFsaWRhdGluZ0ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICFfb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyICYmXG4gICAgICAgICAgICAgICAgIW9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgIHVuc2V0KF9kZWZhdWx0VmFsdWVzLCBmaWVsZE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIHZhbHVlczogY2xvbmVPYmplY3QoX2Zvcm1WYWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgLi4uX2Zvcm1TdGF0ZSxcbiAgICAgICAgICAgIC4uLighb3B0aW9ucy5rZWVwRGlydHkgPyB7fSA6IHsgaXNEaXJ0eTogX2dldERpcnR5KCkgfSksXG4gICAgICAgIH0pO1xuICAgICAgICAhb3B0aW9ucy5rZWVwSXNWYWxpZCAmJiBfc2V0VmFsaWQoKTtcbiAgICB9O1xuICAgIGNvbnN0IF9zZXREaXNhYmxlZEZpZWxkID0gKHsgZGlzYWJsZWQsIG5hbWUsIH0pID0+IHtcbiAgICAgICAgaWYgKChpc0Jvb2xlYW4oZGlzYWJsZWQpICYmIF9zdGF0ZS5tb3VudCkgfHxcbiAgICAgICAgICAgICEhZGlzYWJsZWQgfHxcbiAgICAgICAgICAgIF9uYW1lcy5kaXNhYmxlZC5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGRpc2FibGVkID8gX25hbWVzLmRpc2FibGVkLmFkZChuYW1lKSA6IF9uYW1lcy5kaXNhYmxlZC5kZWxldGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlZ2lzdGVyID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBsZXQgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkSXNEZWZpbmVkID0gaXNCb29sZWFuKG9wdGlvbnMuZGlzYWJsZWQpIHx8IGlzQm9vbGVhbihfb3B0aW9ucy5kaXNhYmxlZCk7XG4gICAgICAgIHNldChfZmllbGRzLCBuYW1lLCB7XG4gICAgICAgICAgICAuLi4oZmllbGQgfHwge30pLFxuICAgICAgICAgICAgX2Y6IHtcbiAgICAgICAgICAgICAgICAuLi4oZmllbGQgJiYgZmllbGQuX2YgPyBmaWVsZC5fZiA6IHsgcmVmOiB7IG5hbWUgfSB9KSxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIG1vdW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgX25hbWVzLm1vdW50LmFkZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBfc2V0RGlzYWJsZWRGaWVsZCh7XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGlzQm9vbGVhbihvcHRpb25zLmRpc2FibGVkKVxuICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgOiBfb3B0aW9ucy5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1cGRhdGVWYWxpZEFuZFZhbHVlKG5hbWUsIHRydWUsIG9wdGlvbnMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi4oZGlzYWJsZWRJc0RlZmluZWRcbiAgICAgICAgICAgICAgICA/IHsgZGlzYWJsZWQ6IG9wdGlvbnMuZGlzYWJsZWQgfHwgX29wdGlvbnMuZGlzYWJsZWQgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgLi4uKF9vcHRpb25zLnByb2dyZXNzaXZlXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAhIW9wdGlvbnMucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogZ2V0UnVsZVZhbHVlKG9wdGlvbnMubWluKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiBnZXRSdWxlVmFsdWUob3B0aW9ucy5tYXgpLFxuICAgICAgICAgICAgICAgICAgICBtaW5MZW5ndGg6IGdldFJ1bGVWYWx1ZShvcHRpb25zLm1pbkxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIG1heExlbmd0aDogZ2V0UnVsZVZhbHVlKG9wdGlvbnMubWF4TGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogZ2V0UnVsZVZhbHVlKG9wdGlvbnMucGF0dGVybiksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIG9uQ2hhbmdlLFxuICAgICAgICAgICAgb25CbHVyOiBvbkNoYW5nZSxcbiAgICAgICAgICAgIHJlZjogKHJlZikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIobmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFJlZiA9IGlzVW5kZWZpbmVkKHJlZi52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVmLnF1ZXJ5U2VsZWN0b3JBbGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlZi5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCxzZWxlY3QsdGV4dGFyZWEnKVswXSB8fCByZWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgOiByZWY7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvT3JDaGVja2JveCA9IGlzUmFkaW9PckNoZWNrYm94KGZpZWxkUmVmKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmcyA9IGZpZWxkLl9mLnJlZnMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYWRpb09yQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVmcy5maW5kKChvcHRpb24pID0+IG9wdGlvbiA9PT0gZmllbGRSZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkUmVmID09PSBmaWVsZC5fZi5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXQoX2ZpZWxkcywgbmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Y6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5maWVsZC5fZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmFkaW9PckNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlZnMuZmlsdGVyKGxpdmUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KGdldChfZGVmYXVsdFZhbHVlcywgbmFtZSkpID8gW3t9XSA6IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY6IHsgdHlwZTogZmllbGRSZWYudHlwZSwgbmFtZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyByZWY6IGZpZWxkUmVmIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVZhbGlkQW5kVmFsdWUobmFtZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmllbGRSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSwge30pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuX2YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLl9mLm1vdW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKF9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXIgfHwgb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIShpc05hbWVJbkZpZWxkQXJyYXkoX25hbWVzLmFycmF5LCBuYW1lKSAmJiBfc3RhdGUuYWN0aW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzLnVuTW91bnQuYWRkKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBfZm9jdXNFcnJvciA9ICgpID0+IF9vcHRpb25zLnNob3VsZEZvY3VzRXJyb3IgJiZcbiAgICAgICAgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKF9maWVsZHMsIF9mb2N1c0lucHV0LCBfbmFtZXMubW91bnQpO1xuICAgIGNvbnN0IF9kaXNhYmxlRm9ybSA9IChkaXNhYmxlZCkgPT4ge1xuICAgICAgICBpZiAoaXNCb29sZWFuKGRpc2FibGVkKSkge1xuICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoeyBkaXNhYmxlZCB9KTtcbiAgICAgICAgICAgIGl0ZXJhdGVGaWVsZHNCeUFjdGlvbihfZmllbGRzLCAocmVmLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLmRpc2FibGVkID0gY3VycmVudEZpZWxkLl9mLmRpc2FibGVkIHx8IGRpc2FibGVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50RmllbGQuX2YucmVmcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5fZi5yZWZzLmZvckVhY2goKGlucHV0UmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSZWYuZGlzYWJsZWQgPSBjdXJyZW50RmllbGQuX2YuZGlzYWJsZWQgfHwgZGlzYWJsZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDAsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgaGFuZGxlU3VibWl0ID0gKG9uVmFsaWQsIG9uSW52YWxpZCkgPT4gYXN5bmMgKGUpID0+IHtcbiAgICAgICAgbGV0IG9uVmFsaWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5wZXJzaXN0ICYmXG4gICAgICAgICAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpZWxkVmFsdWVzID0gY2xvbmVPYmplY3QoX2Zvcm1WYWx1ZXMpO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBpc1N1Ym1pdHRpbmc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoX29wdGlvbnMucmVzb2x2ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZXJyb3JzLCB2YWx1ZXMgfSA9IGF3YWl0IF9ydW5TY2hlbWEoKTtcbiAgICAgICAgICAgIF9mb3JtU3RhdGUuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICAgICAgZmllbGRWYWx1ZXMgPSBjbG9uZU9iamVjdCh2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKF9maWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfbmFtZXMuZGlzYWJsZWQuc2l6ZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIF9uYW1lcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIHVuc2V0KGZpZWxkVmFsdWVzLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgJ3Jvb3QnKTtcbiAgICAgICAgaWYgKGlzRW1wdHlPYmplY3QoX2Zvcm1TdGF0ZS5lcnJvcnMpKSB7XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgZXJyb3JzOiB7fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBvblZhbGlkKGZpZWxkVmFsdWVzLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIG9uVmFsaWRFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKG9uSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG9uSW52YWxpZCh7IC4uLl9mb3JtU3RhdGUuZXJyb3JzIH0sIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZvY3VzRXJyb3IoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoX2ZvY3VzRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIGlzU3VibWl0dGVkOiB0cnVlLFxuICAgICAgICAgICAgaXNTdWJtaXR0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlzU3VibWl0U3VjY2Vzc2Z1bDogaXNFbXB0eU9iamVjdChfZm9ybVN0YXRlLmVycm9ycykgJiYgIW9uVmFsaWRFcnJvcixcbiAgICAgICAgICAgIHN1Ym1pdENvdW50OiBfZm9ybVN0YXRlLnN1Ym1pdENvdW50ICsgMSxcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob25WYWxpZEVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBvblZhbGlkRXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlc2V0RmllbGQgPSAobmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGlmIChnZXQoX2ZpZWxkcywgbmFtZSkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChvcHRpb25zLmRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZShuYW1lLCBjbG9uZU9iamVjdChnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZShuYW1lLCBvcHRpb25zLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgc2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lLCBjbG9uZU9iamVjdChvcHRpb25zLmRlZmF1bHRWYWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmtlZXBUb3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgdW5zZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5rZWVwRGlydHkpIHtcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVN0YXRlLmRpcnR5RmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICBfZm9ybVN0YXRlLmlzRGlydHkgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA/IF9nZXREaXJ0eShuYW1lLCBjbG9uZU9iamVjdChnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUpKSlcbiAgICAgICAgICAgICAgICAgICAgOiBfZ2V0RGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5rZWVwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgJiYgX3NldFZhbGlkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7IC4uLl9mb3JtU3RhdGUgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9yZXNldCA9IChmb3JtVmFsdWVzLCBrZWVwU3RhdGVPcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZFZhbHVlcyA9IGZvcm1WYWx1ZXMgPyBjbG9uZU9iamVjdChmb3JtVmFsdWVzKSA6IF9kZWZhdWx0VmFsdWVzO1xuICAgICAgICBjb25zdCBjbG9uZVVwZGF0ZWRWYWx1ZXMgPSBjbG9uZU9iamVjdCh1cGRhdGVkVmFsdWVzKTtcbiAgICAgICAgY29uc3QgaXNFbXB0eVJlc2V0VmFsdWVzID0gaXNFbXB0eU9iamVjdChmb3JtVmFsdWVzKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gaXNFbXB0eVJlc2V0VmFsdWVzID8gX2RlZmF1bHRWYWx1ZXMgOiBjbG9uZVVwZGF0ZWRWYWx1ZXM7XG4gICAgICAgIGlmICgha2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlcykge1xuICAgICAgICAgICAgX2RlZmF1bHRWYWx1ZXMgPSB1cGRhdGVkVmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICgha2VlcFN0YXRlT3B0aW9ucy5rZWVwVmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAoa2VlcFN0YXRlT3B0aW9ucy5rZWVwRGlydHlWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZHNUb0NoZWNrID0gbmV3IFNldChbXG4gICAgICAgICAgICAgICAgICAgIC4uLl9uYW1lcy5tb3VudCxcbiAgICAgICAgICAgICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ2V0RGlydHlGaWVsZHMoX2RlZmF1bHRWYWx1ZXMsIF9mb3JtVmFsdWVzKSksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZE5hbWUgb2YgQXJyYXkuZnJvbShmaWVsZHNUb0NoZWNrKSkge1xuICAgICAgICAgICAgICAgICAgICBnZXQoX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcywgZmllbGROYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBzZXQodmFsdWVzLCBmaWVsZE5hbWUsIGdldChfZm9ybVZhbHVlcywgZmllbGROYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0VmFsdWUoZmllbGROYW1lLCBnZXQodmFsdWVzLCBmaWVsZE5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNXZWIgJiYgaXNVbmRlZmluZWQoZm9ybVZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIF9uYW1lcy5tb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQuX2YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFJlZmVyZW5jZSA9IEFycmF5LmlzQXJyYXkoZmllbGQuX2YucmVmcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaWVsZC5fZi5yZWZzWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmllbGQuX2YucmVmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0hUTUxFbGVtZW50KGZpZWxkUmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtID0gZmllbGRSZWZlcmVuY2UuY2xvc2VzdCgnZm9ybScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtlZXBTdGF0ZU9wdGlvbnMua2VlcEZpZWxkc1JlZikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiBfbmFtZXMubW91bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGZpZWxkTmFtZSwgZ2V0KHZhbHVlcywgZmllbGROYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9maWVsZHMgPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZm9ybVZhbHVlcyA9IF9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXJcbiAgICAgICAgICAgICAgICA/IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyBjbG9uZU9iamVjdChfZGVmYXVsdFZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgOiB7fVxuICAgICAgICAgICAgICAgIDogY2xvbmVPYmplY3QodmFsdWVzKTtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5hcnJheS5uZXh0KHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHsgLi4udmFsdWVzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHsgLi4udmFsdWVzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfbmFtZXMgPSB7XG4gICAgICAgICAgICBtb3VudDoga2VlcFN0YXRlT3B0aW9ucy5rZWVwRGlydHlWYWx1ZXMgPyBfbmFtZXMubW91bnQgOiBuZXcgU2V0KCksXG4gICAgICAgICAgICB1bk1vdW50OiBuZXcgU2V0KCksXG4gICAgICAgICAgICBhcnJheTogbmV3IFNldCgpLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIHdhdGNoOiBuZXcgU2V0KCksXG4gICAgICAgICAgICB3YXRjaEFsbDogZmFsc2UsXG4gICAgICAgICAgICBmb2N1czogJycsXG4gICAgICAgIH07XG4gICAgICAgIF9zdGF0ZS5tb3VudCA9XG4gICAgICAgICAgICAhX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICAhIWtlZXBTdGF0ZU9wdGlvbnMua2VlcElzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICAhIWtlZXBTdGF0ZU9wdGlvbnMua2VlcERpcnR5VmFsdWVzO1xuICAgICAgICBfc3RhdGUud2F0Y2ggPSAhIV9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXI7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIHN1Ym1pdENvdW50OiBrZWVwU3RhdGVPcHRpb25zLmtlZXBTdWJtaXRDb3VudFxuICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5zdWJtaXRDb3VudFxuICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGlzRGlydHk6IGlzRW1wdHlSZXNldFZhbHVlc1xuICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICA6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERpcnR5XG4gICAgICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5pc0RpcnR5XG4gICAgICAgICAgICAgICAgICAgIDogISEoa2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWRlZXBFcXVhbChmb3JtVmFsdWVzLCBfZGVmYXVsdFZhbHVlcykpLFxuICAgICAgICAgICAgaXNTdWJtaXR0ZWQ6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcElzU3VibWl0dGVkXG4gICAgICAgICAgICAgICAgPyBfZm9ybVN0YXRlLmlzU3VibWl0dGVkXG4gICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGRpcnR5RmllbGRzOiBpc0VtcHR5UmVzZXRWYWx1ZXNcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBEaXJ0eVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZXMgJiYgX2Zvcm1WYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0RGlydHlGaWVsZHMoX2RlZmF1bHRWYWx1ZXMsIF9mb3JtVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfZm9ybVN0YXRlLmRpcnR5RmllbGRzXG4gICAgICAgICAgICAgICAgICAgIDoga2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlcyAmJiBmb3JtVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGdldERpcnR5RmllbGRzKF9kZWZhdWx0VmFsdWVzLCBmb3JtVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBEaXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30sXG4gICAgICAgICAgICB0b3VjaGVkRmllbGRzOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBUb3VjaGVkXG4gICAgICAgICAgICAgICAgPyBfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHNcbiAgICAgICAgICAgICAgICA6IHt9LFxuICAgICAgICAgICAgZXJyb3JzOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBFcnJvcnMgPyBfZm9ybVN0YXRlLmVycm9ycyA6IHt9LFxuICAgICAgICAgICAgaXNTdWJtaXRTdWNjZXNzZnVsOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBJc1N1Ym1pdFN1Y2Nlc3NmdWxcbiAgICAgICAgICAgICAgICA/IF9mb3JtU3RhdGUuaXNTdWJtaXRTdWNjZXNzZnVsXG4gICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGlzU3VibWl0dGluZzogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgcmVzZXQgPSAoZm9ybVZhbHVlcywga2VlcFN0YXRlT3B0aW9ucykgPT4gX3Jlc2V0KGlzRnVuY3Rpb24oZm9ybVZhbHVlcylcbiAgICAgICAgPyBmb3JtVmFsdWVzKF9mb3JtVmFsdWVzKVxuICAgICAgICA6IGZvcm1WYWx1ZXMsIGtlZXBTdGF0ZU9wdGlvbnMpO1xuICAgIGNvbnN0IHNldEZvY3VzID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgY29uc3QgZmllbGRSZWZlcmVuY2UgPSBmaWVsZCAmJiBmaWVsZC5fZjtcbiAgICAgICAgaWYgKGZpZWxkUmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFJlZiA9IGZpZWxkUmVmZXJlbmNlLnJlZnNcbiAgICAgICAgICAgICAgICA/IGZpZWxkUmVmZXJlbmNlLnJlZnNbMF1cbiAgICAgICAgICAgICAgICA6IGZpZWxkUmVmZXJlbmNlLnJlZjtcbiAgICAgICAgICAgIGlmIChmaWVsZFJlZi5mb2N1cykge1xuICAgICAgICAgICAgICAgIGZpZWxkUmVmLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zaG91bGRTZWxlY3QgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvbihmaWVsZFJlZi5zZWxlY3QpICYmXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmLnNlbGVjdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBfc2V0Rm9ybVN0YXRlID0gKHVwZGF0ZWRGb3JtU3RhdGUpID0+IHtcbiAgICAgICAgX2Zvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgIC4uLl9mb3JtU3RhdGUsXG4gICAgICAgICAgICAuLi51cGRhdGVkRm9ybVN0YXRlLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgX3Jlc2V0RGVmYXVsdFZhbHVlcyA9ICgpID0+IGlzRnVuY3Rpb24oX29wdGlvbnMuZGVmYXVsdFZhbHVlcykgJiZcbiAgICAgICAgX29wdGlvbnMuZGVmYXVsdFZhbHVlcygpLnRoZW4oKHZhbHVlcykgPT4ge1xuICAgICAgICAgICAgcmVzZXQodmFsdWVzLCBfb3B0aW9ucy5yZXNldE9wdGlvbnMpO1xuICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgY29uc3QgbWV0aG9kcyA9IHtcbiAgICAgICAgY29udHJvbDoge1xuICAgICAgICAgICAgcmVnaXN0ZXIsXG4gICAgICAgICAgICB1bnJlZ2lzdGVyLFxuICAgICAgICAgICAgZ2V0RmllbGRTdGF0ZSxcbiAgICAgICAgICAgIGhhbmRsZVN1Ym1pdCxcbiAgICAgICAgICAgIHNldEVycm9yLFxuICAgICAgICAgICAgX3N1YnNjcmliZSxcbiAgICAgICAgICAgIF9ydW5TY2hlbWEsXG4gICAgICAgICAgICBfZm9jdXNFcnJvcixcbiAgICAgICAgICAgIF9nZXRXYXRjaCxcbiAgICAgICAgICAgIF9nZXREaXJ0eSxcbiAgICAgICAgICAgIF9zZXRWYWxpZCxcbiAgICAgICAgICAgIF9zZXRGaWVsZEFycmF5LFxuICAgICAgICAgICAgX3NldERpc2FibGVkRmllbGQsXG4gICAgICAgICAgICBfc2V0RXJyb3JzLFxuICAgICAgICAgICAgX2dldEZpZWxkQXJyYXksXG4gICAgICAgICAgICBfcmVzZXQsXG4gICAgICAgICAgICBfcmVzZXREZWZhdWx0VmFsdWVzLFxuICAgICAgICAgICAgX3JlbW92ZVVubW91bnRlZCxcbiAgICAgICAgICAgIF9kaXNhYmxlRm9ybSxcbiAgICAgICAgICAgIF9zdWJqZWN0cyxcbiAgICAgICAgICAgIF9wcm94eUZvcm1TdGF0ZSxcbiAgICAgICAgICAgIGdldCBfZmllbGRzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZmllbGRzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBfZm9ybVZhbHVlcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Zvcm1WYWx1ZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9zdGF0ZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3N0YXRlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCBfc3RhdGUodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfc3RhdGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgX2RlZmF1bHRWYWx1ZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0VmFsdWVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBfbmFtZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgX25hbWVzKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX25hbWVzID0gdmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9mb3JtU3RhdGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb3JtU3RhdGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9vcHRpb25zKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfb3B0aW9ucztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgX29wdGlvbnModmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uX29wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIHRyaWdnZXIsXG4gICAgICAgIHJlZ2lzdGVyLFxuICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgIHdhdGNoLFxuICAgICAgICBzZXRWYWx1ZSxcbiAgICAgICAgZ2V0VmFsdWVzLFxuICAgICAgICByZXNldCxcbiAgICAgICAgcmVzZXRGaWVsZCxcbiAgICAgICAgY2xlYXJFcnJvcnMsXG4gICAgICAgIHVucmVnaXN0ZXIsXG4gICAgICAgIHNldEVycm9yLFxuICAgICAgICBzZXRGb2N1cyxcbiAgICAgICAgZ2V0RmllbGRTdGF0ZSxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLm1ldGhvZHMsXG4gICAgICAgIGZvcm1Db250cm9sOiBtZXRob2RzLFxuICAgIH07XG59XG5cbnZhciBnZW5lcmF0ZUlkID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICB9XG4gICAgY29uc3QgZCA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlLm5vdygpIDogcGVyZm9ybWFuY2Uubm93KCkgKiAxMDAwO1xuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gICAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2ICsgZCkgJSAxNiB8IDA7XG4gICAgICAgIHJldHVybiAoYyA9PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4KS50b1N0cmluZygxNik7XG4gICAgfSk7XG59O1xuXG52YXIgZ2V0Rm9jdXNGaWVsZE5hbWUgPSAobmFtZSwgaW5kZXgsIG9wdGlvbnMgPSB7fSkgPT4gb3B0aW9ucy5zaG91bGRGb2N1cyB8fCBpc1VuZGVmaW5lZChvcHRpb25zLnNob3VsZEZvY3VzKVxuICAgID8gb3B0aW9ucy5mb2N1c05hbWUgfHxcbiAgICAgICAgYCR7bmFtZX0uJHtpc1VuZGVmaW5lZChvcHRpb25zLmZvY3VzSW5kZXgpID8gaW5kZXggOiBvcHRpb25zLmZvY3VzSW5kZXh9LmBcbiAgICA6ICcnO1xuXG52YXIgYXBwZW5kQXQgPSAoZGF0YSwgdmFsdWUpID0+IFtcbiAgICAuLi5kYXRhLFxuICAgIC4uLmNvbnZlcnRUb0FycmF5UGF5bG9hZCh2YWx1ZSksXG5dO1xuXG52YXIgZmlsbEVtcHR5QXJyYXkgPSAodmFsdWUpID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKCgpID0+IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGluc2VydChkYXRhLCBpbmRleCwgdmFsdWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAuLi5kYXRhLnNsaWNlKDAsIGluZGV4KSxcbiAgICAgICAgLi4uY29udmVydFRvQXJyYXlQYXlsb2FkKHZhbHVlKSxcbiAgICAgICAgLi4uZGF0YS5zbGljZShpbmRleCksXG4gICAgXTtcbn1cblxudmFyIG1vdmVBcnJheUF0ID0gKGRhdGEsIGZyb20sIHRvKSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKGlzVW5kZWZpbmVkKGRhdGFbdG9dKSkge1xuICAgICAgICBkYXRhW3RvXSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZGF0YS5zcGxpY2UodG8sIDAsIGRhdGEuc3BsaWNlKGZyb20sIDEpWzBdKTtcbiAgICByZXR1cm4gZGF0YTtcbn07XG5cbnZhciBwcmVwZW5kQXQgPSAoZGF0YSwgdmFsdWUpID0+IFtcbiAgICAuLi5jb252ZXJ0VG9BcnJheVBheWxvYWQodmFsdWUpLFxuICAgIC4uLmNvbnZlcnRUb0FycmF5UGF5bG9hZChkYXRhKSxcbl07XG5cbmZ1bmN0aW9uIHJlbW92ZUF0SW5kZXhlcyhkYXRhLCBpbmRleGVzKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IHRlbXAgPSBbLi4uZGF0YV07XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICAgIHRlbXAuc3BsaWNlKGluZGV4IC0gaSwgMSk7XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBhY3QodGVtcCkubGVuZ3RoID8gdGVtcCA6IFtdO1xufVxudmFyIHJlbW92ZUFycmF5QXQgPSAoZGF0YSwgaW5kZXgpID0+IGlzVW5kZWZpbmVkKGluZGV4KVxuICAgID8gW11cbiAgICA6IHJlbW92ZUF0SW5kZXhlcyhkYXRhLCBjb252ZXJ0VG9BcnJheVBheWxvYWQoaW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKSk7XG5cbnZhciBzd2FwQXJyYXlBdCA9IChkYXRhLCBpbmRleEEsIGluZGV4QikgPT4ge1xuICAgIFtkYXRhW2luZGV4QV0sIGRhdGFbaW5kZXhCXV0gPSBbZGF0YVtpbmRleEJdLCBkYXRhW2luZGV4QV1dO1xufTtcblxudmFyIHVwZGF0ZUF0ID0gKGZpZWxkVmFsdWVzLCBpbmRleCwgdmFsdWUpID0+IHtcbiAgICBmaWVsZFZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gZmllbGRWYWx1ZXM7XG59O1xuXG4vKipcbiAqIEEgY3VzdG9tIGhvb2sgdGhhdCBleHBvc2VzIGNvbnZlbmllbnQgbWV0aG9kcyB0byBwZXJmb3JtIG9wZXJhdGlvbnMgd2l0aCBhIGxpc3Qgb2YgZHluYW1pYyBpbnB1dHMgdGhhdCBuZWVkIHRvIGJlIGFwcGVuZGVkLCB1cGRhdGVkLCByZW1vdmVkIGV0Yy4g4oCiIFtEZW1vXShodHRwczovL2NvZGVzYW5kYm94LmlvL3MvcmVhY3QtaG9vay1mb3JtLXVzZWZpZWxkYXJyYXktc3N1Z24pIOKAoiBbVmlkZW9dKGh0dHBzOi8veW91dHUuYmUvNE1yYmZHU0ZZMkEpXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWZpZWxkYXJyYXkpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS11c2VmaWVsZGFycmF5LXNzdWduKVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIHVzZUZpZWxkQXJyYXkgcHJvcHNcbiAqXG4gKiBAcmV0dXJucyBtZXRob2RzIC0gZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgd2l0aCB0aGUgRmllbGQgQXJyYXlzIChkeW5hbWljIGlucHV0cykge0BsaW5rIFVzZUZpZWxkQXJyYXlSZXR1cm59XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCB7IHJlZ2lzdGVyLCBjb250cm9sLCBoYW5kbGVTdWJtaXQsIHJlc2V0LCB0cmlnZ2VyLCBzZXRFcnJvciB9ID0gdXNlRm9ybSh7XG4gKiAgICAgZGVmYXVsdFZhbHVlczoge1xuICogICAgICAgdGVzdDogW11cbiAqICAgICB9XG4gKiAgIH0pO1xuICogICBjb25zdCB7IGZpZWxkcywgYXBwZW5kIH0gPSB1c2VGaWVsZEFycmF5KHtcbiAqICAgICBjb250cm9sLFxuICogICAgIG5hbWU6IFwidGVzdFwiXG4gKiAgIH0pO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Zm9ybSBvblN1Ym1pdD17aGFuZGxlU3VibWl0KGRhdGEgPT4gY29uc29sZS5sb2coZGF0YSkpfT5cbiAqICAgICAgIHtmaWVsZHMubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICogICAgICAgICAgPGlucHV0IGtleT17aXRlbS5pZH0gey4uLnJlZ2lzdGVyKGB0ZXN0LiR7aW5kZXh9LmZpcnN0TmFtZWApfSAgLz5cbiAqICAgICAgICkpfVxuICogICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17KCkgPT4gYXBwZW5kKHsgZmlyc3ROYW1lOiBcImJpbGxcIiB9KX0+XG4gKiAgICAgICAgIGFwcGVuZFxuICogICAgICAgPC9idXR0b24+XG4gKiAgICAgICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIC8+XG4gKiAgICAgPC9mb3JtPlxuICogICApO1xuICogfVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHVzZUZpZWxkQXJyYXkocHJvcHMpIHtcbiAgICBjb25zdCBtZXRob2RzID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgICBjb25zdCB7IGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIG5hbWUsIGtleU5hbWUgPSAnaWQnLCBzaG91bGRVbnJlZ2lzdGVyLCBydWxlcywgfSA9IHByb3BzO1xuICAgIGNvbnN0IFtmaWVsZHMsIHNldEZpZWxkc10gPSBSZWFjdF9fZGVmYXVsdC51c2VTdGF0ZShjb250cm9sLl9nZXRGaWVsZEFycmF5KG5hbWUpKTtcbiAgICBjb25zdCBpZHMgPSBSZWFjdF9fZGVmYXVsdC51c2VSZWYoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKS5tYXAoZ2VuZXJhdGVJZCkpO1xuICAgIGNvbnN0IF9maWVsZElkcyA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihmaWVsZHMpO1xuICAgIGNvbnN0IF9uYW1lID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKG5hbWUpO1xuICAgIGNvbnN0IF9hY3Rpb25lZCA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihmYWxzZSk7XG4gICAgX25hbWUuY3VycmVudCA9IG5hbWU7XG4gICAgX2ZpZWxkSWRzLmN1cnJlbnQgPSBmaWVsZHM7XG4gICAgY29udHJvbC5fbmFtZXMuYXJyYXkuYWRkKG5hbWUpO1xuICAgIHJ1bGVzICYmXG4gICAgICAgIGNvbnRyb2wucmVnaXN0ZXIobmFtZSwgcnVsZXMpO1xuICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4gY29udHJvbC5fc3ViamVjdHMuYXJyYXkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHsgdmFsdWVzLCBuYW1lOiBmaWVsZEFycmF5TmFtZSwgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkQXJyYXlOYW1lID09PSBfbmFtZS5jdXJyZW50IHx8ICFmaWVsZEFycmF5TmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZ2V0KHZhbHVlcywgX25hbWUuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEZpZWxkcyhmaWVsZFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlkcy5jdXJyZW50ID0gZmllbGRWYWx1ZXMubWFwKGdlbmVyYXRlSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KS51bnN1YnNjcmliZSwgW2NvbnRyb2xdKTtcbiAgICBjb25zdCB1cGRhdGVWYWx1ZXMgPSBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjaygodXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpID0+IHtcbiAgICAgICAgX2FjdGlvbmVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUsIHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICB9LCBbY29udHJvbCwgbmFtZV0pO1xuICAgIGNvbnN0IGFwcGVuZCA9ICh2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBhcHBlbmRWYWx1ZSA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChjbG9uZU9iamVjdCh2YWx1ZSkpO1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IGFwcGVuZEF0KGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSksIGFwcGVuZFZhbHVlKTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgPSBnZXRGb2N1c0ZpZWxkTmFtZShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcy5sZW5ndGggLSAxLCBvcHRpb25zKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSBhcHBlbmRBdChpZHMuY3VycmVudCwgYXBwZW5kVmFsdWUubWFwKGdlbmVyYXRlSWQpKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgYXBwZW5kQXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGZpbGxFbXB0eUFycmF5KHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBwcmVwZW5kID0gKHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXBlbmRWYWx1ZSA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChjbG9uZU9iamVjdCh2YWx1ZSkpO1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IHByZXBlbmRBdChjb250cm9sLl9nZXRGaWVsZEFycmF5KG5hbWUpLCBwcmVwZW5kVmFsdWUpO1xuICAgICAgICBjb250cm9sLl9uYW1lcy5mb2N1cyA9IGdldEZvY3VzRmllbGROYW1lKG5hbWUsIDAsIG9wdGlvbnMpO1xuICAgICAgICBpZHMuY3VycmVudCA9IHByZXBlbmRBdChpZHMuY3VycmVudCwgcHJlcGVuZFZhbHVlLm1hcChnZW5lcmF0ZUlkKSk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIGNvbnRyb2wuX3NldEZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIHByZXBlbmRBdCwge1xuICAgICAgICAgICAgYXJnQTogZmlsbEVtcHR5QXJyYXkodmFsdWUpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHJlbW92ZSA9IChpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IHJlbW92ZUFycmF5QXQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgaW5kZXgpO1xuICAgICAgICBpZHMuY3VycmVudCA9IHJlbW92ZUFycmF5QXQoaWRzLmN1cnJlbnQsIGluZGV4KTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoZ2V0KGNvbnRyb2wuX2ZpZWxkcywgbmFtZSkpICYmXG4gICAgICAgICAgICBzZXQoY29udHJvbC5fZmllbGRzLCBuYW1lLCB1bmRlZmluZWQpO1xuICAgICAgICBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUsIHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCByZW1vdmVBcnJheUF0LCB7XG4gICAgICAgICAgICBhcmdBOiBpbmRleCxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBpbnNlcnQkMSA9IChpbmRleCwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0VmFsdWUgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQoY2xvbmVPYmplY3QodmFsdWUpKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSBpbnNlcnQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgaW5kZXgsIGluc2VydFZhbHVlKTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgPSBnZXRGb2N1c0ZpZWxkTmFtZShuYW1lLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICAgIGlkcy5jdXJyZW50ID0gaW5zZXJ0KGlkcy5jdXJyZW50LCBpbmRleCwgaW5zZXJ0VmFsdWUubWFwKGdlbmVyYXRlSWQpKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgaW5zZXJ0LCB7XG4gICAgICAgICAgICBhcmdBOiBpbmRleCxcbiAgICAgICAgICAgIGFyZ0I6IGZpbGxFbXB0eUFycmF5KHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBzd2FwID0gKGluZGV4QSwgaW5kZXhCKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKTtcbiAgICAgICAgc3dhcEFycmF5QXQodXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIGluZGV4QSwgaW5kZXhCKTtcbiAgICAgICAgc3dhcEFycmF5QXQoaWRzLmN1cnJlbnQsIGluZGV4QSwgaW5kZXhCKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgc3dhcEFycmF5QXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGluZGV4QSxcbiAgICAgICAgICAgIGFyZ0I6IGluZGV4QixcbiAgICAgICAgfSwgZmFsc2UpO1xuICAgIH07XG4gICAgY29uc3QgbW92ZSA9IChmcm9tLCB0bykgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSk7XG4gICAgICAgIG1vdmVBcnJheUF0KHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCBmcm9tLCB0byk7XG4gICAgICAgIG1vdmVBcnJheUF0KGlkcy5jdXJyZW50LCBmcm9tLCB0byk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIGNvbnRyb2wuX3NldEZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIG1vdmVBcnJheUF0LCB7XG4gICAgICAgICAgICBhcmdBOiBmcm9tLFxuICAgICAgICAgICAgYXJnQjogdG8sXG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZSA9IChpbmRleCwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlVmFsdWUgPSBjbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gdXBkYXRlQXQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgaW5kZXgsIHVwZGF0ZVZhbHVlKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSBbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdLm1hcCgoaXRlbSwgaSkgPT4gIWl0ZW0gfHwgaSA9PT0gaW5kZXggPyBnZW5lcmF0ZUlkKCkgOiBpZHMuY3VycmVudFtpXSk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyhbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgdXBkYXRlQXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGluZGV4LFxuICAgICAgICAgICAgYXJnQjogdXBkYXRlVmFsdWUsXG4gICAgICAgIH0sIHRydWUsIGZhbHNlKTtcbiAgICB9O1xuICAgIGNvbnN0IHJlcGxhY2UgPSAodmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQoY2xvbmVPYmplY3QodmFsdWUpKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSB1cGRhdGVkRmllbGRBcnJheVZhbHVlcy5tYXAoZ2VuZXJhdGVJZCk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyhbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdKTtcbiAgICAgICAgc2V0RmllbGRzKFsuLi51cGRhdGVkRmllbGRBcnJheVZhbHVlc10pO1xuICAgICAgICBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUsIFsuLi51cGRhdGVkRmllbGRBcnJheVZhbHVlc10sIChkYXRhKSA9PiBkYXRhLCB7fSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH07XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29udHJvbC5fc3RhdGUuYWN0aW9uID0gZmFsc2U7XG4gICAgICAgIGlzV2F0Y2hlZChuYW1lLCBjb250cm9sLl9uYW1lcykgJiZcbiAgICAgICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoX2FjdGlvbmVkLmN1cnJlbnQgJiZcbiAgICAgICAgICAgICghZ2V0VmFsaWRhdGlvbk1vZGVzKGNvbnRyb2wuX29wdGlvbnMubW9kZSkuaXNPblN1Ym1pdCB8fFxuICAgICAgICAgICAgICAgIGNvbnRyb2wuX2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZCkgJiZcbiAgICAgICAgICAgICFnZXRWYWxpZGF0aW9uTW9kZXMoY29udHJvbC5fb3B0aW9ucy5yZVZhbGlkYXRlTW9kZSkuaXNPblN1Ym1pdCkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wuX29wdGlvbnMucmVzb2x2ZXIpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLl9ydW5TY2hlbWEoW25hbWVdKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBnZXQocmVzdWx0LmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nRXJyb3IgPSBnZXQoY29udHJvbC5fZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0Vycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICghZXJyb3IgJiYgZXhpc3RpbmdFcnJvci50eXBlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhpc3RpbmdFcnJvci50eXBlICE9PSBlcnJvci50eXBlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0Vycm9yLm1lc3NhZ2UgIT09IGVycm9yLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBlcnJvciAmJiBlcnJvci50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2V0KGNvbnRyb2wuX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUsIGVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5zZXQoY29udHJvbC5fZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IGNvbnRyb2wuX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoY29udHJvbC5fZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuX2YgJiZcbiAgICAgICAgICAgICAgICAgICAgIShnZXRWYWxpZGF0aW9uTW9kZXMoY29udHJvbC5fb3B0aW9ucy5yZVZhbGlkYXRlTW9kZSkuaXNPblN1Ym1pdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbk1vZGVzKGNvbnRyb2wuX29wdGlvbnMubW9kZSkuaXNPblN1Ym1pdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVGaWVsZChmaWVsZCwgY29udHJvbC5fbmFtZXMuZGlzYWJsZWQsIGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIGNvbnRyb2wuX29wdGlvbnMuY3JpdGVyaWFNb2RlID09PSBWQUxJREFUSU9OX01PREUuYWxsLCBjb250cm9sLl9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24sIHRydWUpLnRoZW4oKGVycm9yKSA9PiAhaXNFbXB0eU9iamVjdChlcnJvcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yczogdXBkYXRlRmllbGRBcnJheVJvb3RFcnJvcihjb250cm9sLl9mb3JtU3RhdGUuZXJyb3JzLCBlcnJvciwgbmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHZhbHVlczogY2xvbmVPYmplY3QoY29udHJvbC5fZm9ybVZhbHVlcyksXG4gICAgICAgIH0pO1xuICAgICAgICBjb250cm9sLl9uYW1lcy5mb2N1cyAmJlxuICAgICAgICAgICAgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKGNvbnRyb2wuX2ZpZWxkcywgKHJlZiwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuX25hbWVzLmZvY3VzICYmXG4gICAgICAgICAgICAgICAgICAgIGtleS5zdGFydHNXaXRoKGNvbnRyb2wuX25hbWVzLmZvY3VzKSAmJlxuICAgICAgICAgICAgICAgICAgICByZWYuZm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgPSAnJztcbiAgICAgICAgY29udHJvbC5fc2V0VmFsaWQoKTtcbiAgICAgICAgX2FjdGlvbmVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9LCBbZmllbGRzLCBuYW1lLCBjb250cm9sXSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgIWdldChjb250cm9sLl9mb3JtVmFsdWVzLCBuYW1lKSAmJiBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlTW91bnRlZCA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KGNvbnRyb2wuX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLl9mKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLl9mLm1vdW50ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnRyb2wuX29wdGlvbnMuc2hvdWxkVW5yZWdpc3RlciB8fCBzaG91bGRVbnJlZ2lzdGVyXG4gICAgICAgICAgICAgICAgPyBjb250cm9sLnVucmVnaXN0ZXIobmFtZSlcbiAgICAgICAgICAgICAgICA6IHVwZGF0ZU1vdW50ZWQobmFtZSwgZmFsc2UpO1xuICAgICAgICB9O1xuICAgIH0sIFtuYW1lLCBjb250cm9sLCBrZXlOYW1lLCBzaG91bGRVbnJlZ2lzdGVyXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3dhcDogUmVhY3RfX2RlZmF1bHQudXNlQ2FsbGJhY2soc3dhcCwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICBtb3ZlOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhtb3ZlLCBbdXBkYXRlVmFsdWVzLCBuYW1lLCBjb250cm9sXSksXG4gICAgICAgIHByZXBlbmQ6IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKHByZXBlbmQsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgYXBwZW5kOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhhcHBlbmQsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgcmVtb3ZlOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhyZW1vdmUsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgaW5zZXJ0OiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhpbnNlcnQkMSwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICB1cGRhdGU6IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKHVwZGF0ZSwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICByZXBsYWNlOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhyZXBsYWNlLCBbdXBkYXRlVmFsdWVzLCBuYW1lLCBjb250cm9sXSksXG4gICAgICAgIGZpZWxkczogUmVhY3RfX2RlZmF1bHQudXNlTWVtbygoKSA9PiBmaWVsZHMubWFwKChmaWVsZCwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgICAgIFtrZXlOYW1lXTogaWRzLmN1cnJlbnRbaW5kZXhdIHx8IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgfSkpLCBbZmllbGRzLCBrZXlOYW1lXSksXG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gaG9vayB0byBtYW5hZ2UgdGhlIGVudGlyZSBmb3JtLlxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2Vmb3JtKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tZ2V0LXN0YXJ0ZWQtdHMtNWtzbW0pIOKAoiBbVmlkZW9dKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9UmtYdjRBWFhDXzQpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gZm9ybSBjb25maWd1cmF0aW9uIGFuZCB2YWxpZGF0aW9uIHBhcmFtZXRlcnMuXG4gKlxuICogQHJldHVybnMgbWV0aG9kcyAtIGluZGl2aWR1YWwgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9ybSBzdGF0ZS4ge0BsaW5rIFVzZUZvcm1SZXR1cm59XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCB7IHJlZ2lzdGVyLCBoYW5kbGVTdWJtaXQsIHdhdGNoLCBmb3JtU3RhdGU6IHsgZXJyb3JzIH0gfSA9IHVzZUZvcm0oKTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSBkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpO1xuICpcbiAqICAgY29uc29sZS5sb2cod2F0Y2goXCJleGFtcGxlXCIpKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdChvblN1Ym1pdCl9PlxuICogICAgICAgPGlucHV0IGRlZmF1bHRWYWx1ZT1cInRlc3RcIiB7Li4ucmVnaXN0ZXIoXCJleGFtcGxlXCIpfSAvPlxuICogICAgICAgPGlucHV0IHsuLi5yZWdpc3RlcihcImV4YW1wbGVSZXF1aXJlZFwiLCB7IHJlcXVpcmVkOiB0cnVlIH0pfSAvPlxuICogICAgICAge2Vycm9ycy5leGFtcGxlUmVxdWlyZWQgJiYgPHNwYW4+VGhpcyBmaWVsZCBpcyByZXF1aXJlZDwvc3Bhbj59XG4gKiAgICAgICA8YnV0dG9uPlN1Ym1pdDwvYnV0dG9uPlxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1c2VGb3JtKHByb3BzID0ge30pIHtcbiAgICBjb25zdCBfZm9ybUNvbnRyb2wgPSBSZWFjdF9fZGVmYXVsdC51c2VSZWYodW5kZWZpbmVkKTtcbiAgICBjb25zdCBfdmFsdWVzID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgW2Zvcm1TdGF0ZSwgdXBkYXRlRm9ybVN0YXRlXSA9IFJlYWN0X19kZWZhdWx0LnVzZVN0YXRlKHtcbiAgICAgICAgaXNEaXJ0eTogZmFsc2UsXG4gICAgICAgIGlzVmFsaWRhdGluZzogZmFsc2UsXG4gICAgICAgIGlzTG9hZGluZzogaXNGdW5jdGlvbihwcm9wcy5kZWZhdWx0VmFsdWVzKSxcbiAgICAgICAgaXNTdWJtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdHRpbmc6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdFN1Y2Nlc3NmdWw6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgc3VibWl0Q291bnQ6IDAsXG4gICAgICAgIGRpcnR5RmllbGRzOiB7fSxcbiAgICAgICAgdG91Y2hlZEZpZWxkczoge30sXG4gICAgICAgIHZhbGlkYXRpbmdGaWVsZHM6IHt9LFxuICAgICAgICBlcnJvcnM6IHByb3BzLmVycm9ycyB8fCB7fSxcbiAgICAgICAgZGlzYWJsZWQ6IHByb3BzLmRpc2FibGVkIHx8IGZhbHNlLFxuICAgICAgICBpc1JlYWR5OiBmYWxzZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlczogaXNGdW5jdGlvbihwcm9wcy5kZWZhdWx0VmFsdWVzKVxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogcHJvcHMuZGVmYXVsdFZhbHVlcyxcbiAgICB9KTtcbiAgICBpZiAoIV9mb3JtQ29udHJvbC5jdXJyZW50KSB7XG4gICAgICAgIGlmIChwcm9wcy5mb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgX2Zvcm1Db250cm9sLmN1cnJlbnQgPSB7XG4gICAgICAgICAgICAgICAgLi4ucHJvcHMuZm9ybUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgZm9ybVN0YXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWVzICYmICFpc0Z1bmN0aW9uKHByb3BzLmRlZmF1bHRWYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMuZm9ybUNvbnRyb2wucmVzZXQocHJvcHMuZGVmYXVsdFZhbHVlcywgcHJvcHMucmVzZXRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9ybUNvbnRyb2wsIC4uLnJlc3QgfSA9IGNyZWF0ZUZvcm1Db250cm9sKHByb3BzKTtcbiAgICAgICAgICAgIF9mb3JtQ29udHJvbC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgICAgIC4uLnJlc3QsXG4gICAgICAgICAgICAgICAgZm9ybVN0YXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb250cm9sID0gX2Zvcm1Db250cm9sLmN1cnJlbnQuY29udHJvbDtcbiAgICBjb250cm9sLl9vcHRpb25zID0gcHJvcHM7XG4gICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YiA9IGNvbnRyb2wuX3N1YnNjcmliZSh7XG4gICAgICAgICAgICBmb3JtU3RhdGU6IGNvbnRyb2wuX3Byb3h5Rm9ybVN0YXRlLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHVwZGF0ZUZvcm1TdGF0ZSh7IC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSB9KSxcbiAgICAgICAgICAgIHJlUmVuZGVyUm9vdDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZUZvcm1TdGF0ZSgoZGF0YSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICBpc1JlYWR5OiB0cnVlLFxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnRyb2wuX2Zvcm1TdGF0ZS5pc1JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9LCBbY29udHJvbF0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiBjb250cm9sLl9kaXNhYmxlRm9ybShwcm9wcy5kaXNhYmxlZCksIFtjb250cm9sLCBwcm9wcy5kaXNhYmxlZF0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm9wcy5tb2RlKSB7XG4gICAgICAgICAgICBjb250cm9sLl9vcHRpb25zLm1vZGUgPSBwcm9wcy5tb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wcy5yZVZhbGlkYXRlTW9kZSkge1xuICAgICAgICAgICAgY29udHJvbC5fb3B0aW9ucy5yZVZhbGlkYXRlTW9kZSA9IHByb3BzLnJlVmFsaWRhdGVNb2RlO1xuICAgICAgICB9XG4gICAgfSwgW2NvbnRyb2wsIHByb3BzLm1vZGUsIHByb3BzLnJlVmFsaWRhdGVNb2RlXSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHByb3BzLmVycm9ycykge1xuICAgICAgICAgICAgY29udHJvbC5fc2V0RXJyb3JzKHByb3BzLmVycm9ycyk7XG4gICAgICAgICAgICBjb250cm9sLl9mb2N1c0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICB9LCBbY29udHJvbCwgcHJvcHMuZXJyb3JzXSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgcHJvcHMuc2hvdWxkVW5yZWdpc3RlciAmJlxuICAgICAgICAgICAgY29udHJvbC5fc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBjb250cm9sLl9nZXRXYXRjaCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgfSwgW2NvbnRyb2wsIHByb3BzLnNob3VsZFVucmVnaXN0ZXJdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoY29udHJvbC5fcHJveHlGb3JtU3RhdGUuaXNEaXJ0eSkge1xuICAgICAgICAgICAgY29uc3QgaXNEaXJ0eSA9IGNvbnRyb2wuX2dldERpcnR5KCk7XG4gICAgICAgICAgICBpZiAoaXNEaXJ0eSAhPT0gZm9ybVN0YXRlLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgaXNEaXJ0eSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFtjb250cm9sLCBmb3JtU3RhdGUuaXNEaXJ0eV0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm9wcy52YWx1ZXMgJiYgIWRlZXBFcXVhbChwcm9wcy52YWx1ZXMsIF92YWx1ZXMuY3VycmVudCkpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3Jlc2V0KHByb3BzLnZhbHVlcywge1xuICAgICAgICAgICAgICAgIGtlZXBGaWVsZHNSZWY6IHRydWUsXG4gICAgICAgICAgICAgICAgLi4uY29udHJvbC5fb3B0aW9ucy5yZXNldE9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF92YWx1ZXMuY3VycmVudCA9IHByb3BzLnZhbHVlcztcbiAgICAgICAgICAgIHVwZGF0ZUZvcm1TdGF0ZSgoc3RhdGUpID0+ICh7IC4uLnN0YXRlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3Jlc2V0RGVmYXVsdFZhbHVlcygpO1xuICAgICAgICB9XG4gICAgfSwgW2NvbnRyb2wsIHByb3BzLnZhbHVlc10pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICghY29udHJvbC5fc3RhdGUubW91bnQpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3NldFZhbGlkKCk7XG4gICAgICAgICAgICBjb250cm9sLl9zdGF0ZS5tb3VudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2wuX3N0YXRlLndhdGNoKSB7XG4gICAgICAgICAgICBjb250cm9sLl9zdGF0ZS53YXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgY29udHJvbC5fc3ViamVjdHMuc3RhdGUubmV4dCh7IC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sLl9yZW1vdmVVbm1vdW50ZWQoKTtcbiAgICB9KTtcbiAgICBfZm9ybUNvbnRyb2wuY3VycmVudC5mb3JtU3RhdGUgPSBnZXRQcm94eUZvcm1TdGF0ZShmb3JtU3RhdGUsIGNvbnRyb2wpO1xuICAgIHJldHVybiBfZm9ybUNvbnRyb2wuY3VycmVudDtcbn1cblxuZXhwb3J0IHsgQ29udHJvbGxlciwgRm9ybSwgRm9ybVByb3ZpZGVyLCBhcHBlbmRFcnJvcnMsIGNyZWF0ZUZvcm1Db250cm9sLCBnZXQsIHNldCwgdXNlQ29udHJvbGxlciwgdXNlRmllbGRBcnJheSwgdXNlRm9ybSwgdXNlRm9ybUNvbnRleHQsIHVzZUZvcm1TdGF0ZSwgdXNlV2F0Y2ggfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbS5tanMubWFwXG4iLAogICAgIid1c2UgY2xpZW50J1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIExhYmVsUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1sYWJlbCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gTGFiZWwoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgTGFiZWxQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8TGFiZWxQcmltaXRpdmUuUm9vdFxuICAgICAgZGF0YS1zbG90PVwibGFiZWxcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtc20gbGVhZGluZy1ub25lIGZvbnQtbWVkaXVtIHNlbGVjdC1ub25lIGdyb3VwLWRhdGEtW2Rpc2FibGVkPXRydWVdOnBvaW50ZXItZXZlbnRzLW5vbmUgZ3JvdXAtZGF0YS1bZGlzYWJsZWQ9dHJ1ZV06b3BhY2l0eS01MCBwZWVyLWRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBwZWVyLWRpc2FibGVkOm9wYWNpdHktNTAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBMYWJlbCB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBJbnB1dCh7IGNsYXNzTmFtZSwgdHlwZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2lucHV0Jz4pIHtcbiAgcmV0dXJuIChcbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9e3R5cGV9XG4gICAgICBkYXRhLXNsb3Q9XCJpbnB1dFwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZmlsZTp0ZXh0LWZvcmVncm91bmQgcGxhY2Vob2xkZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHNlbGVjdGlvbjpiZy1wcmltYXJ5IHNlbGVjdGlvbjp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBkYXJrOmJnLWlucHV0LzMwIGJvcmRlci1pbnB1dCBmbGV4IGgtOSB3LWZ1bGwgbWluLXctMCByb3VuZGVkLW1kIGJvcmRlciBiZy10cmFuc3BhcmVudCBweC0zIHB5LTEgdGV4dC1iYXNlIHNoYWRvdy14cyB0cmFuc2l0aW9uLVtjb2xvcixib3gtc2hhZG93XSBvdXRsaW5lLW5vbmUgZmlsZTppbmxpbmUtZmxleCBmaWxlOmgtNyBmaWxlOmJvcmRlci0wIGZpbGU6YmctdHJhbnNwYXJlbnQgZmlsZTp0ZXh0LXNtIGZpbGU6Zm9udC1tZWRpdW0gZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCBtZDp0ZXh0LXNtJyxcbiAgICAgICAgJ2ZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZm9jdXMtdmlzaWJsZTpyaW5nLVszcHhdJyxcbiAgICAgICAgJ2FyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6YXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvNDAgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZScsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7IElucHV0IH1cbiIsCiAgICAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgKiBhcyBTY3JvbGxBcmVhUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1zY3JvbGwtYXJlYSdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gU2Nyb2xsQXJlYSh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2Nyb2xsQXJlYVByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gKFxuICAgIDxTY3JvbGxBcmVhUHJpbWl0aXZlLlJvb3RcbiAgICAgIGRhdGEtc2xvdD1cInNjcm9sbC1hcmVhXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ3JlbGF0aXZlJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICA8U2Nyb2xsQXJlYVByaW1pdGl2ZS5WaWV3cG9ydFxuICAgICAgICBkYXRhLXNsb3Q9XCJzY3JvbGwtYXJlYS12aWV3cG9ydFwiXG4gICAgICAgIGNsYXNzTmFtZT1cImZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIHNpemUtZnVsbCByb3VuZGVkLVtpbmhlcml0XSB0cmFuc2l0aW9uLVtjb2xvcixib3gtc2hhZG93XSBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLVszcHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS0xXCJcbiAgICAgID5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9TY3JvbGxBcmVhUHJpbWl0aXZlLlZpZXdwb3J0PlxuICAgICAgPFNjcm9sbEJhciAvPlxuICAgICAgPFNjcm9sbEFyZWFQcmltaXRpdmUuQ29ybmVyIC8+XG4gICAgPC9TY3JvbGxBcmVhUHJpbWl0aXZlLlJvb3Q+XG4gIClcbn1cblxuZnVuY3Rpb24gU2Nyb2xsQmFyKHtcbiAgY2xhc3NOYW1lLFxuICBvcmllbnRhdGlvbiA9ICd2ZXJ0aWNhbCcsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2Nyb2xsQXJlYVByaW1pdGl2ZS5TY3JvbGxBcmVhU2Nyb2xsYmFyPikge1xuICByZXR1cm4gKFxuICAgIDxTY3JvbGxBcmVhUHJpbWl0aXZlLlNjcm9sbEFyZWFTY3JvbGxiYXJcbiAgICAgIGRhdGEtc2xvdD1cInNjcm9sbC1hcmVhLXNjcm9sbGJhclwiXG4gICAgICBvcmllbnRhdGlvbj17b3JpZW50YXRpb259XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZmxleCB0b3VjaC1ub25lIHAtcHggdHJhbnNpdGlvbi1jb2xvcnMgc2VsZWN0LW5vbmUnLFxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyAmJlxuICAgICAgICAgICdoLWZ1bGwgdy0yLjUgYm9yZGVyLWwgYm9yZGVyLWwtdHJhbnNwYXJlbnQnLFxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnICYmXG4gICAgICAgICAgJ2gtMi41IGZsZXgtY29sIGJvcmRlci10IGJvcmRlci10LXRyYW5zcGFyZW50JyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxTY3JvbGxBcmVhUHJpbWl0aXZlLlNjcm9sbEFyZWFUaHVtYlxuICAgICAgICBkYXRhLXNsb3Q9XCJzY3JvbGwtYXJlYS10aHVtYlwiXG4gICAgICAgIGNsYXNzTmFtZT1cImJnLWJvcmRlciByZWxhdGl2ZSBmbGV4LTEgcm91bmRlZC1mdWxsXCJcbiAgICAgIC8+XG4gICAgPC9TY3JvbGxBcmVhUHJpbWl0aXZlLlNjcm9sbEFyZWFTY3JvbGxiYXI+XG4gIClcbn1cblxuZXhwb3J0IHsgU2Nyb2xsQXJlYSwgU2Nyb2xsQmFyIH1cbiIsCiAgICAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgKiBhcyBTZWxlY3RQcmltaXRpdmUgZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXNlbGVjdCdcbmltcG9ydCB7IENoZWNrSWNvbiwgQ2hldnJvbkRvd25JY29uLCBDaGV2cm9uVXBJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBTZWxlY3Qoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gPFNlbGVjdFByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cInNlbGVjdFwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gU2VsZWN0R3JvdXAoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5Hcm91cD4pIHtcbiAgcmV0dXJuIDxTZWxlY3RQcmltaXRpdmUuR3JvdXAgZGF0YS1zbG90PVwic2VsZWN0LWdyb3VwXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTZWxlY3RWYWx1ZSh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLlZhbHVlPikge1xuICByZXR1cm4gPFNlbGVjdFByaW1pdGl2ZS5WYWx1ZSBkYXRhLXNsb3Q9XCJzZWxlY3QtdmFsdWVcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIFNlbGVjdFRyaWdnZXIoe1xuICBjbGFzc05hbWUsXG4gIHNpemUgPSAnZGVmYXVsdCcsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5UcmlnZ2VyPiAmIHtcbiAgc2l6ZT86ICdzbScgfCAnZGVmYXVsdCdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlRyaWdnZXJcbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC10cmlnZ2VyXCJcbiAgICAgIGRhdGEtc2l6ZT17c2l6ZX1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIFwiYm9yZGVyLWlucHV0IGRhdGEtW3BsYWNlaG9sZGVyXTp0ZXh0LW11dGVkLWZvcmVncm91bmQgWyZfc3ZnOm5vdChbY2xhc3MqPSd0ZXh0LSddKV06dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIGRhcms6YmctaW5wdXQvMzAgZGFyazpob3ZlcjpiZy1pbnB1dC81MCBmbGV4IHctZml0IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTIgcm91bmRlZC1tZCBib3JkZXIgYmctdHJhbnNwYXJlbnQgcHgtMyBweS0yIHRleHQtc20gd2hpdGVzcGFjZS1ub3dyYXAgc2hhZG93LXhzIHRyYW5zaXRpb24tW2NvbG9yLGJveC1zaGFkb3ddIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgZGF0YS1bc2l6ZT1kZWZhdWx0XTpoLTkgZGF0YS1bc2l6ZT1zbV06aC04ICo6ZGF0YS1bc2xvdD1zZWxlY3QtdmFsdWVdOmxpbmUtY2xhbXAtMSAqOmRhdGEtW3Nsb3Q9c2VsZWN0LXZhbHVlXTpmbGV4ICo6ZGF0YS1bc2xvdD1zZWxlY3QtdmFsdWVdOml0ZW1zLWNlbnRlciAqOmRhdGEtW3Nsb3Q9c2VsZWN0LXZhbHVlXTpnYXAtMiBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDxTZWxlY3RQcmltaXRpdmUuSWNvbiBhc0NoaWxkPlxuICAgICAgICA8Q2hldnJvbkRvd25JY29uIGNsYXNzTmFtZT1cInNpemUtNCBvcGFjaXR5LTUwXCIgLz5cbiAgICAgIDwvU2VsZWN0UHJpbWl0aXZlLkljb24+XG4gICAgPC9TZWxlY3RQcmltaXRpdmUuVHJpZ2dlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWxlY3RDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgcG9zaXRpb24gPSAncG9wcGVyJyxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlBvcnRhbD5cbiAgICAgIDxTZWxlY3RQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJzZWxlY3QtY29udGVudFwiXG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2JnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1vcGVuXTp6b29tLWluLTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIHJlbGF0aXZlIHotNTAgbWF4LWgtKC0tcmFkaXgtc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodCkgbWluLXctWzhyZW1dIG9yaWdpbi0oLS1yYWRpeC1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luKSBvdmVyZmxvdy14LWhpZGRlbiBvdmVyZmxvdy15LWF1dG8gcm91bmRlZC1tZCBib3JkZXIgc2hhZG93LW1kJyxcbiAgICAgICAgICBwb3NpdGlvbiA9PT0gJ3BvcHBlcicgJiZcbiAgICAgICAgICAgICdkYXRhLVtzaWRlPWJvdHRvbV06dHJhbnNsYXRlLXktMSBkYXRhLVtzaWRlPWxlZnRdOi10cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9cmlnaHRdOnRyYW5zbGF0ZS14LTEgZGF0YS1bc2lkZT10b3BdOi10cmFuc2xhdGUteS0xJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgcG9zaXRpb249e3Bvc2l0aW9ufVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICA+XG4gICAgICAgIDxTZWxlY3RTY3JvbGxVcEJ1dHRvbiAvPlxuICAgICAgICA8U2VsZWN0UHJpbWl0aXZlLlZpZXdwb3J0XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICdwLTEnLFxuICAgICAgICAgICAgcG9zaXRpb24gPT09ICdwb3BwZXInICYmXG4gICAgICAgICAgICAgICdoLVt2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci1oZWlnaHQpXSB3LWZ1bGwgbWluLXctW3ZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoKV0gc2Nyb2xsLW15LTEnXG4gICAgICAgICAgKX1cbiAgICAgICAgPlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9TZWxlY3RQcmltaXRpdmUuVmlld3BvcnQ+XG4gICAgICAgIDxTZWxlY3RTY3JvbGxEb3duQnV0dG9uIC8+XG4gICAgICA8L1NlbGVjdFByaW1pdGl2ZS5Db250ZW50PlxuICAgIDwvU2VsZWN0UHJpbWl0aXZlLlBvcnRhbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWxlY3RMYWJlbCh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuTGFiZWw+KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFByaW1pdGl2ZS5MYWJlbFxuICAgICAgZGF0YS1zbG90PVwic2VsZWN0LWxhYmVsXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCBweC0yIHB5LTEuNSB0ZXh0LXhzJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFNlbGVjdEl0ZW0oe1xuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5JdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RQcmltaXRpdmUuSXRlbVxuICAgICAgZGF0YS1zbG90PVwic2VsZWN0LWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBbJl9zdmc6bm90KFtjbGFzcyo9J3RleHQtJ10pXTp0ZXh0LW11dGVkLWZvcmVncm91bmQgcmVsYXRpdmUgZmxleCB3LWZ1bGwgY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtc20gcHktMS41IHByLTggcGwtMiB0ZXh0LXNtIG91dGxpbmUtaGlkZGVuIHNlbGVjdC1ub25lIGRhdGEtW2Rpc2FibGVkXTpwb2ludGVyLWV2ZW50cy1ub25lIGRhdGEtW2Rpc2FibGVkXTpvcGFjaXR5LTUwIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wIFsmX3N2Zzpub3QoW2NsYXNzKj0nc2l6ZS0nXSldOnNpemUtNCAqOltzcGFuXTpsYXN0OmZsZXggKjpbc3Bhbl06bGFzdDppdGVtcy1jZW50ZXIgKjpbc3Bhbl06bGFzdDpnYXAtMlwiLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMiBmbGV4IHNpemUtMy41IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8U2VsZWN0UHJpbWl0aXZlLkl0ZW1JbmRpY2F0b3I+XG4gICAgICAgICAgPENoZWNrSWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgICAgICA8L1NlbGVjdFByaW1pdGl2ZS5JdGVtSW5kaWNhdG9yPlxuICAgICAgPC9zcGFuPlxuICAgICAgPFNlbGVjdFByaW1pdGl2ZS5JdGVtVGV4dD57Y2hpbGRyZW59PC9TZWxlY3RQcmltaXRpdmUuSXRlbVRleHQ+XG4gICAgPC9TZWxlY3RQcmltaXRpdmUuSXRlbT5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWxlY3RTZXBhcmF0b3Ioe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLlNlcGFyYXRvcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlNlcGFyYXRvclxuICAgICAgZGF0YS1zbG90PVwic2VsZWN0LXNlcGFyYXRvclwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdiZy1ib3JkZXIgcG9pbnRlci1ldmVudHMtbm9uZSAtbXgtMSBteS0xIGgtcHgnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VsZWN0U2Nyb2xsVXBCdXR0b24oe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLlNjcm9sbFVwQnV0dG9uPikge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RQcmltaXRpdmUuU2Nyb2xsVXBCdXR0b25cbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC1zY3JvbGwtdXAtYnV0dG9uXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdmbGV4IGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweS0xJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxDaGV2cm9uVXBJY29uIGNsYXNzTmFtZT1cInNpemUtNFwiIC8+XG4gICAgPC9TZWxlY3RQcmltaXRpdmUuU2Nyb2xsVXBCdXR0b24+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VsZWN0U2Nyb2xsRG93bkJ1dHRvbih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuU2Nyb2xsRG93bkJ1dHRvbj4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlNjcm9sbERvd25CdXR0b25cbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC1zY3JvbGwtZG93bi1idXR0b25cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAgPENoZXZyb25Eb3duSWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgIDwvU2VsZWN0UHJpbWl0aXZlLlNjcm9sbERvd25CdXR0b24+XG4gIClcbn1cblxuZXhwb3J0IHtcbiAgU2VsZWN0LFxuICBTZWxlY3RDb250ZW50LFxuICBTZWxlY3RHcm91cCxcbiAgU2VsZWN0SXRlbSxcbiAgU2VsZWN0TGFiZWwsXG4gIFNlbGVjdFNjcm9sbERvd25CdXR0b24sXG4gIFNlbGVjdFNjcm9sbFVwQnV0dG9uLFxuICBTZWxlY3RTZXBhcmF0b3IsXG4gIFNlbGVjdFRyaWdnZXIsXG4gIFNlbGVjdFZhbHVlLFxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFNlcGFyYXRvclByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3Qtc2VwYXJhdG9yJ1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBTZXBhcmF0b3Ioe1xuICBjbGFzc05hbWUsXG4gIG9yaWVudGF0aW9uID0gJ2hvcml6b250YWwnLFxuICBkZWNvcmF0aXZlID0gdHJ1ZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZXBhcmF0b3JQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VwYXJhdG9yUHJpbWl0aXZlLlJvb3RcbiAgICAgIGRhdGEtc2xvdD1cInNlcGFyYXRvci1yb290XCJcbiAgICAgIGRlY29yYXRpdmU9e2RlY29yYXRpdmV9XG4gICAgICBvcmllbnRhdGlvbj17b3JpZW50YXRpb259XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnYmctYm9yZGVyIHNocmluay0wIGRhdGEtW29yaWVudGF0aW9uPWhvcml6b250YWxdOmgtcHggZGF0YS1bb3JpZW50YXRpb249aG9yaXpvbnRhbF06dy1mdWxsIGRhdGEtW29yaWVudGF0aW9uPXZlcnRpY2FsXTpoLWZ1bGwgZGF0YS1bb3JpZW50YXRpb249dmVydGljYWxdOnctcHgnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBTZXBhcmF0b3IgfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFNoZWV0UHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1kaWFsb2cnXG5pbXBvcnQgeyBYSWNvbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gU2hlZXQoeyAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIDxTaGVldFByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cInNoZWV0XCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTaGVldFRyaWdnZXIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLlRyaWdnZXI+KSB7XG4gIHJldHVybiA8U2hlZXRQcmltaXRpdmUuVHJpZ2dlciBkYXRhLXNsb3Q9XCJzaGVldC10cmlnZ2VyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTaGVldENsb3NlKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTaGVldFByaW1pdGl2ZS5DbG9zZT4pIHtcbiAgcmV0dXJuIDxTaGVldFByaW1pdGl2ZS5DbG9zZSBkYXRhLXNsb3Q9XCJzaGVldC1jbG9zZVwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gU2hlZXRQb3J0YWwoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLlBvcnRhbD4pIHtcbiAgcmV0dXJuIDxTaGVldFByaW1pdGl2ZS5Qb3J0YWwgZGF0YS1zbG90PVwic2hlZXQtcG9ydGFsXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTaGVldE92ZXJsYXkoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuT3ZlcmxheT4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2hlZXRQcmltaXRpdmUuT3ZlcmxheVxuICAgICAgZGF0YS1zbG90PVwic2hlZXQtb3ZlcmxheVwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZml4ZWQgaW5zZXQtMCB6LTUwIGJnLWJsYWNrLzUwJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gU2hlZXRDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgc2lkZSA9ICdyaWdodCcsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuQ29udGVudD4gJiB7XG4gIHNpZGU/OiAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0J1xufSkge1xuICByZXR1cm4gKFxuICAgIDxTaGVldFBvcnRhbD5cbiAgICAgIDxTaGVldE92ZXJsYXkgLz5cbiAgICAgIDxTaGVldFByaW1pdGl2ZS5Db250ZW50XG4gICAgICAgIGRhdGEtc2xvdD1cInNoZWV0LWNvbnRlbnRcIlxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdiZy1iYWNrZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBmaXhlZCB6LTUwIGZsZXggZmxleC1jb2wgZ2FwLTQgc2hhZG93LWxnIHRyYW5zaXRpb24gZWFzZS1pbi1vdXQgZGF0YS1bc3RhdGU9Y2xvc2VkXTpkdXJhdGlvbi0zMDAgZGF0YS1bc3RhdGU9b3Blbl06ZHVyYXRpb24tNTAwJyxcbiAgICAgICAgICBzaWRlID09PSAncmlnaHQnICYmXG4gICAgICAgICAgICAnZGF0YS1bc3RhdGU9Y2xvc2VkXTpzbGlkZS1vdXQtdG8tcmlnaHQgZGF0YS1bc3RhdGU9b3Blbl06c2xpZGUtaW4tZnJvbS1yaWdodCBpbnNldC15LTAgcmlnaHQtMCBoLWZ1bGwgdy0zLzQgYm9yZGVyLWwgc206bWF4LXctc20nLFxuICAgICAgICAgIHNpZGUgPT09ICdsZWZ0JyAmJlxuICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLWxlZnQgZGF0YS1bc3RhdGU9b3Blbl06c2xpZGUtaW4tZnJvbS1sZWZ0IGluc2V0LXktMCBsZWZ0LTAgaC1mdWxsIHctMy80IGJvcmRlci1yIHNtOm1heC13LXNtJyxcbiAgICAgICAgICBzaWRlID09PSAndG9wJyAmJlxuICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLXRvcCBkYXRhLVtzdGF0ZT1vcGVuXTpzbGlkZS1pbi1mcm9tLXRvcCBpbnNldC14LTAgdG9wLTAgaC1hdXRvIGJvcmRlci1iJyxcbiAgICAgICAgICBzaWRlID09PSAnYm90dG9tJyAmJlxuICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLWJvdHRvbSBkYXRhLVtzdGF0ZT1vcGVuXTpzbGlkZS1pbi1mcm9tLWJvdHRvbSBpbnNldC14LTAgYm90dG9tLTAgaC1hdXRvIGJvcmRlci10JyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDxTaGVldFByaW1pdGl2ZS5DbG9zZSBjbGFzc05hbWU9XCJyaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGZvY3VzOnJpbmctcmluZyBkYXRhLVtzdGF0ZT1vcGVuXTpiZy1zZWNvbmRhcnkgYWJzb2x1dGUgdG9wLTQgcmlnaHQtNCByb3VuZGVkLXhzIG9wYWNpdHktNzAgdHJhbnNpdGlvbi1vcGFjaXR5IGhvdmVyOm9wYWNpdHktMTAwIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLW9mZnNldC0yIGZvY3VzOm91dGxpbmUtaGlkZGVuIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICA8WEljb24gY2xhc3NOYW1lPVwic2l6ZS00XCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XG4gICAgICAgIDwvU2hlZXRQcmltaXRpdmUuQ2xvc2U+XG4gICAgICA8L1NoZWV0UHJpbWl0aXZlLkNvbnRlbnQ+XG4gICAgPC9TaGVldFBvcnRhbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBTaGVldEhlYWRlcih7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2Rpdic+KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS1zbG90PVwic2hlZXQtaGVhZGVyXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXggZmxleC1jb2wgZ2FwLTEuNSBwLTQnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gU2hlZXRGb290ZXIoeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cInNoZWV0LWZvb3RlclwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdtdC1hdXRvIGZsZXggZmxleC1jb2wgZ2FwLTIgcC00JywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFNoZWV0VGl0bGUoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuVGl0bGU+KSB7XG4gIHJldHVybiAoXG4gICAgPFNoZWV0UHJpbWl0aXZlLlRpdGxlXG4gICAgICBkYXRhLXNsb3Q9XCJzaGVldC10aXRsZVwiXG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LWZvcmVncm91bmQgZm9udC1zZW1pYm9sZCcsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBTaGVldERlc2NyaXB0aW9uKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLkRlc2NyaXB0aW9uPikge1xuICByZXR1cm4gKFxuICAgIDxTaGVldFByaW1pdGl2ZS5EZXNjcmlwdGlvblxuICAgICAgZGF0YS1zbG90PVwic2hlZXQtZGVzY3JpcHRpb25cIlxuICAgICAgY2xhc3NOYW1lPXtjbigndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQtc20nLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHtcbiAgU2hlZXQsXG4gIFNoZWV0VHJpZ2dlcixcbiAgU2hlZXRDbG9zZSxcbiAgU2hlZXRDb250ZW50LFxuICBTaGVldEhlYWRlcixcbiAgU2hlZXRGb290ZXIsXG4gIFNoZWV0VGl0bGUsXG4gIFNoZWV0RGVzY3JpcHRpb24sXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgVGFic1ByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtdGFicydcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gVGFicyh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBUYWJzUHJpbWl0aXZlLlJvb3Q+KSB7XG4gIHJldHVybiAoXG4gICAgPFRhYnNQcmltaXRpdmUuUm9vdFxuICAgICAgZGF0YS1zbG90PVwidGFic1wiXG4gICAgICBjbGFzc05hbWU9e2NuKCdmbGV4IGZsZXgtY29sIGdhcC0yJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFRhYnNMaXN0KHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRhYnNQcmltaXRpdmUuTGlzdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8VGFic1ByaW1pdGl2ZS5MaXN0XG4gICAgICBkYXRhLXNsb3Q9XCJ0YWJzLWxpc3RcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2JnLW11dGVkIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBpbmxpbmUtZmxleCBoLTkgdy1maXQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbGcgcC1bM3B4XScsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFRhYnNUcmlnZ2VyKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRhYnNQcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8VGFic1ByaW1pdGl2ZS5UcmlnZ2VyXG4gICAgICBkYXRhLXNsb3Q9XCJ0YWJzLXRyaWdnZXJcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJkYXRhLVtzdGF0ZT1hY3RpdmVdOmJnLWJhY2tncm91bmQgZGFyazpkYXRhLVtzdGF0ZT1hY3RpdmVdOnRleHQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGZvY3VzLXZpc2libGU6b3V0bGluZS1yaW5nIGRhcms6ZGF0YS1bc3RhdGU9YWN0aXZlXTpib3JkZXItaW5wdXQgZGFyazpkYXRhLVtzdGF0ZT1hY3RpdmVdOmJnLWlucHV0LzMwIHRleHQtZm9yZWdyb3VuZCBkYXJrOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBpbmxpbmUtZmxleCBoLVtjYWxjKDEwMCUtMXB4KV0gZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMS41IHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBweC0yIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB3aGl0ZXNwYWNlLW5vd3JhcCB0cmFuc2l0aW9uLVtjb2xvcixib3gtc2hhZG93XSBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTEgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIGRhdGEtW3N0YXRlPWFjdGl2ZV06c2hhZG93LXNtIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wIFsmX3N2Zzpub3QoW2NsYXNzKj0nc2l6ZS0nXSldOnNpemUtNFwiLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBUYWJzQ29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBUYWJzUHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPFRhYnNQcmltaXRpdmUuQ29udGVudFxuICAgICAgZGF0YS1zbG90PVwidGFicy1jb250ZW50XCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXgtMSBvdXRsaW5lLW5vbmUnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHsgVGFicywgVGFic0xpc3QsIFRhYnNUcmlnZ2VyLCBUYWJzQ29udGVudCB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgVG9vbHRpcFByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtdG9vbHRpcCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gVG9vbHRpcFByb3ZpZGVyKHtcbiAgZGVsYXlEdXJhdGlvbiA9IDAsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgVG9vbHRpcFByaW1pdGl2ZS5Qcm92aWRlcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8VG9vbHRpcFByaW1pdGl2ZS5Qcm92aWRlclxuICAgICAgZGF0YS1zbG90PVwidG9vbHRpcC1wcm92aWRlclwiXG4gICAgICBkZWxheUR1cmF0aW9uPXtkZWxheUR1cmF0aW9ufVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gVG9vbHRpcCh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgVG9vbHRpcFByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gKFxuICAgIDxUb29sdGlwUHJvdmlkZXI+XG4gICAgICA8VG9vbHRpcFByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cInRvb2x0aXBcIiB7Li4ucHJvcHN9IC8+XG4gICAgPC9Ub29sdGlwUHJvdmlkZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gVG9vbHRpcFRyaWdnZXIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRvb2x0aXBQcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIDxUb29sdGlwUHJpbWl0aXZlLlRyaWdnZXIgZGF0YS1zbG90PVwidG9vbHRpcC10cmlnZ2VyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBUb29sdGlwQ29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgc2lkZU9mZnNldCA9IDAsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRvb2x0aXBQcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8VG9vbHRpcFByaW1pdGl2ZS5Qb3J0YWw+XG4gICAgICA8VG9vbHRpcFByaW1pdGl2ZS5Db250ZW50XG4gICAgICAgIGRhdGEtc2xvdD1cInRvb2x0aXAtY29udGVudFwiXG4gICAgICAgIHNpZGVPZmZzZXQ9e3NpZGVPZmZzZXR9XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgYW5pbWF0ZS1pbiBmYWRlLWluLTAgem9vbS1pbi05NSBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIHotNTAgdy1maXQgb3JpZ2luLSgtLXJhZGl4LXRvb2x0aXAtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luKSByb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgdGV4dC1iYWxhbmNlJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDxUb29sdGlwUHJpbWl0aXZlLkFycm93IGNsYXNzTmFtZT1cImJnLXByaW1hcnkgZmlsbC1wcmltYXJ5IHotNTAgc2l6ZS0yLjUgdHJhbnNsYXRlLXktW2NhbGMoLTUwJV8tXzJweCldIHJvdGF0ZS00NSByb3VuZGVkLVsycHhdXCIgLz5cbiAgICAgIDwvVG9vbHRpcFByaW1pdGl2ZS5Db250ZW50PlxuICAgIDwvVG9vbHRpcFByaW1pdGl2ZS5Qb3J0YWw+XG4gIClcbn1cblxuZXhwb3J0IHsgVG9vbHRpcCwgVG9vbHRpcFRyaWdnZXIsIFRvb2x0aXBDb250ZW50LCBUb29sdGlwUHJvdmlkZXIgfVxuIiwKICAgICJpbXBvcnQge1xuICBEaWFsb2csXG4gIERpYWxvZ0NvbnRlbnQsXG4gIERpYWxvZ0hlYWRlcixcbiAgRGlhbG9nVGl0bGUsXG59IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCBSZWFjdCwgeyB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICdAL2ZlYXR1cmVzL2RyYWdnYWJsZS1ldmVudC9kcmFnZ2FibGUtZXZlbnQnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB0eXBlIHsgU2VsZWN0ZWREYXlFdmVudHMgfSBmcm9tICcuLi90eXBlcydcblxuaW50ZXJmYWNlIEFsbEV2ZW50RGlhbG9nUHJvcHMge1xuICByZWY6IFJlYWN0LlJlZjx7XG4gICAgb3BlbjogKCkgPT4gdm9pZFxuICAgIGNsb3NlOiAoKSA9PiB2b2lkXG4gICAgc2V0U2VsZWN0ZWREYXlFdmVudHM6IChkYXlFdmVudHM6IFNlbGVjdGVkRGF5RXZlbnRzKSA9PiB2b2lkXG4gIH0+XG59XG5cbmV4cG9ydCBjb25zdCBBbGxFdmVudERpYWxvZzogUmVhY3QuRkM8QWxsRXZlbnREaWFsb2dQcm9wcz4gPSAoeyByZWYgfSkgPT4ge1xuICBjb25zdCBbZGlhbG9nT3Blbiwgc2V0RGlhbG9nT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3NlbGVjdGVkRGF5RXZlbnRzLCBzZXRTZWxlY3RlZERheUV2ZW50c10gPVxuICAgIHVzZVN0YXRlPFNlbGVjdGVkRGF5RXZlbnRzIHwgbnVsbD4obnVsbClcbiAgY29uc3QgeyBjdXJyZW50RGF0ZSwgZmlyc3REYXlPZldlZWsgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgb3BlbjogKCkgPT4gc2V0RGlhbG9nT3Blbih0cnVlKSxcbiAgICBjbG9zZTogKCkgPT4gc2V0RGlhbG9nT3BlbihmYWxzZSksXG4gICAgc2V0U2VsZWN0ZWREYXlFdmVudHM6IChkYXlFdmVudHM6IFNlbGVjdGVkRGF5RXZlbnRzKSA9PlxuICAgICAgc2V0U2VsZWN0ZWREYXlFdmVudHMoZGF5RXZlbnRzKSxcbiAgfSkpXG5cbiAgLy8gR2V0IHN0YXJ0IGRhdGUgZm9yIHRoZSBjdXJyZW50IG1vbnRoIHZpZXcgYmFzZWQgb24gZmlyc3REYXlPZldlZWtcbiAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gY3VycmVudERhdGUuc3RhcnRPZignbW9udGgnKVxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBjYWxlbmRhciBncmlkIGNvcnJlY3RseVxuICAvLyBGaW5kIHRoZSBmaXJzdCBkYXkgb2Ygd2VlayAoZS5nLiBTdW5kYXkgb3IgTW9uZGF5KSB0aGF0IGNvbWVzIGJlZm9yZSBvciBvbiB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aFxuICBsZXQgYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIgPSBmaXJzdERheU9mTW9udGguY2xvbmUoKVxuICB3aGlsZSAoYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIuZGF5KCkgIT09IGZpcnN0RGF5T2ZXZWVrKSB7XG4gICAgYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIgPSBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5zdWJ0cmFjdCgxLCAnZGF5JylcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPERpYWxvZyBvcGVuPXtkaWFsb2dPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERpYWxvZ09wZW59PlxuICAgICAgPERpYWxvZ0NvbnRlbnQgY2xhc3NOYW1lPVwibWF4LWgtWzgwdmhdIG1heC13LW1kIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICA8RGlhbG9nSGVhZGVyPlxuICAgICAgICAgIDxEaWFsb2dUaXRsZT5cbiAgICAgICAgICAgIHtzZWxlY3RlZERheUV2ZW50cyAmJiBzZWxlY3RlZERheUV2ZW50cy5kYXkuZm9ybWF0KCdNTU1NIEQsIFlZWVknKX1cbiAgICAgICAgICA8L0RpYWxvZ1RpdGxlPlxuICAgICAgICA8L0RpYWxvZ0hlYWRlcj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC00IHNwYWNlLXktM1wiPlxuICAgICAgICAgIHtzZWxlY3RlZERheUV2ZW50cyAmJlxuICAgICAgICAgICAgc2VsZWN0ZWREYXlFdmVudHMuZXZlbnRzLm1hcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZD17ZXZlbnQuaWR9IC8vIFVzZSBldmVudCBJRCBmb3IgdW5pcXVlIGlkZW50aWZpY2F0aW9uXG4gICAgICAgICAgICAgICAgICBrZXk9e2V2ZW50LmlkfVxuICAgICAgICAgICAgICAgICAgZXZlbnQ9e2V2ZW50fVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgbXktMSBoLVszMHB4XVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9EaWFsb2dDb250ZW50PlxuICAgIDwvRGlhbG9nPlxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB7IHVzZURyYWdnYWJsZSB9IGZyb20gJ0BkbmQta2l0L2NvcmUnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgbWVtbyB9IGZyb20gJ3JlYWN0J1xuXG5mdW5jdGlvbiBEcmFnZ2FibGVFdmVudFVubWVtb2l6ZWQoe1xuICBlbGVtZW50SWQsXG4gIGV2ZW50LFxuICBjbGFzc05hbWUsXG4gIHN0eWxlLFxuICBkaXNhYmxlRHJhZyA9IGZhbHNlLFxufToge1xuICBlbGVtZW50SWQ6IHN0cmluZ1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgc3R5bGU/OiBDU1NQcm9wZXJ0aWVzXG4gIGV2ZW50OiBDYWxlbmRhckV2ZW50XG4gIGRpc2FibGVEcmFnPzogYm9vbGVhblxufSkge1xuICBjb25zdCB7IG9uRXZlbnRDbGljaywgcmVuZGVyRXZlbnQsIGRpc2FibGVFdmVudENsaWNrLCBkaXNhYmxlRHJhZ0FuZERyb3AgfSA9XG4gICAgdXNlQ2FsZW5kYXJDb250ZXh0KClcbiAgY29uc3QgeyBhdHRyaWJ1dGVzLCBsaXN0ZW5lcnMsIHNldE5vZGVSZWYsIGlzRHJhZ2dpbmcgfSA9IHVzZURyYWdnYWJsZSh7XG4gICAgaWQ6IGVsZW1lbnRJZCxcbiAgICBkYXRhOiB7XG4gICAgICBldmVudCxcbiAgICAgIHR5cGU6ICdjYWxlbmRhci1ldmVudCcsXG4gICAgfSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZURyYWcgfHwgZGlzYWJsZURyYWdBbmREcm9wLFxuICB9KVxuXG4gIC8vIERlZmF1bHQgZXZlbnQgY29udGVudCB0byByZW5kZXIgaWYgY3VzdG9tIHJlbmRlckV2ZW50IGlzIG5vdCBwcm92aWRlZFxuICBjb25zdCBEZWZhdWx0RXZlbnRDb250ZW50ID0gKCkgPT4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIGV2ZW50LmJhY2tncm91bmRDb2xvciB8fCAnYmctYmx1ZS01MDAnLFxuICAgICAgICBldmVudC5jb2xvciB8fCAndGV4dC13aGl0ZScsXG4gICAgICAgICdoLWZ1bGwgdy1mdWxsIHB4LTEgYm9yZGVyLVsxLjVweF0gYm9yZGVyLWNhcmQgcm91bmRlZC1tZCB0ZXh0LWxlZnQgb3ZlcmZsb3ctY2xpcCdcbiAgICAgICl9XG4gICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6IGV2ZW50LmJhY2tncm91bmRDb2xvciwgY29sb3I6IGV2ZW50LmNvbG9yIH19XG4gICAgPlxuICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1bMTBweF0gZm9udC1zZW1pYm9sZCBzbTp0ZXh0LXhzIG10LTAuNVwiPlxuICAgICAgICB7ZXZlbnQudGl0bGV9XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gIClcblxuICByZXR1cm4gKFxuICAgIDxBbmltYXRlUHJlc2VuY2UgbW9kZT1cIndhaXRcIj5cbiAgICAgIDxtb3Rpb24uZGl2XG4gICAgICAgIGtleT17ZWxlbWVudElkfVxuICAgICAgICByZWY9e3NldE5vZGVSZWZ9XG4gICAgICAgIHsuLi5hdHRyaWJ1dGVzfVxuICAgICAgICB7Li4ubGlzdGVuZXJzfVxuICAgICAgICBpbml0aWFsPXt7IG9wYWNpdHk6IDAsIHk6IC01MCB9fVxuICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgZXhpdD17eyBvcGFjaXR5OiAwLCB5OiAtNTAgfX1cbiAgICAgICAgbGF5b3V0XG4gICAgICAgIGxheW91dElkPXtlbGVtZW50SWR9XG4gICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuNCwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAndHJ1bmNhdGUgaC1mdWxsIHctZnVsbCcsXG4gICAgICAgICAgZGlzYWJsZURyYWcgfHwgZGlzYWJsZURyYWdBbmREcm9wXG4gICAgICAgICAgICA/IGRpc2FibGVFdmVudENsaWNrXG4gICAgICAgICAgICAgID8gJ2N1cnNvci1kZWZhdWx0J1xuICAgICAgICAgICAgICA6ICdjdXJzb3ItcG9pbnRlcidcbiAgICAgICAgICAgIDogJ2N1cnNvci1ncmFiJyxcbiAgICAgICAgICBpc0RyYWdnaW5nICYmXG4gICAgICAgICAgICAhKGRpc2FibGVEcmFnIHx8IGRpc2FibGVEcmFnQW5kRHJvcCkgJiZcbiAgICAgICAgICAgICdjdXJzb3ItZ3JhYmJpbmcgc2hhZG93LWxnJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICBvbkV2ZW50Q2xpY2soZXZlbnQpXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHsvKiBVc2UgY3VzdG9tIHJlbmRlckV2ZW50IGZyb20gY29udGV4dCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgZGVmYXVsdCAqL31cbiAgICAgICAge3JlbmRlckV2ZW50ID8gcmVuZGVyRXZlbnQoZXZlbnQpIDogPERlZmF1bHRFdmVudENvbnRlbnQgLz59XG4gICAgICA8L21vdGlvbi5kaXY+XG4gICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IERyYWdnYWJsZUV2ZW50ID0gbWVtbyhcbiAgRHJhZ2dhYmxlRXZlbnRVbm1lbW9pemVkLFxuICAocHJldlByb3BzLCBuZXh0UHJvcHMpID0+IHtcbiAgICAvLyBDb21wYXJlIHRoZSBlc3NlbnRpYWwgcHJvcHMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gICAgcmV0dXJuIChcbiAgICAgIHByZXZQcm9wcy5lbGVtZW50SWQgPT09IG5leHRQcm9wcy5lbGVtZW50SWQgJiZcbiAgICAgIHByZXZQcm9wcy5kaXNhYmxlRHJhZyA9PT0gbmV4dFByb3BzLmRpc2FibGVEcmFnICYmXG4gICAgICBwcmV2UHJvcHMuY2xhc3NOYW1lID09PSBuZXh0UHJvcHMuY2xhc3NOYW1lICYmXG4gICAgICBwcmV2UHJvcHMuZXZlbnQuaWQgPT09IG5leHRQcm9wcy5ldmVudC5pZCAmJlxuICAgICAgcHJldlByb3BzLmV2ZW50LmhlaWdodCA9PT0gbmV4dFByb3BzLmV2ZW50LmhlaWdodFxuICAgIClcbiAgfVxuKVxuIiwKICAgICJpbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgRHJvcHBhYmxlQ2VsbCB9IGZyb20gJ0AvZmVhdHVyZXMvZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwnXG5pbXBvcnQgeyBBbGxFdmVudERpYWxvZyB9IGZyb20gJy4vYWxsLWV2ZW50cy1kaWFsb2cnXG5pbXBvcnQgdHlwZSB7IFNlbGVjdGVkRGF5RXZlbnRzIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5cbmludGVyZmFjZSBEYXlDZWxsUHJvcHMge1xuICBpbmRleDogbnVtYmVyIC8vIEluZGV4IG9mIHRoZSBkYXkgaW4gdGhlIHdlZWsgKDAtNilcbiAgZGF5OiBkYXlqcy5EYXlqc1xuICBkYXlNYXhFdmVudHM/OiBudW1iZXJcbiAgY2xhc3NOYW1lPzogc3RyaW5nIC8vIE9wdGlvbmFsIGNsYXNzTmFtZSBmb3IgY3VzdG9tIHN0eWxpbmdcbn1cblxuZXhwb3J0IGNvbnN0IERheUNlbGw6IFJlYWN0LkZDPERheUNlbGxQcm9wcz4gPSAoe1xuICBpbmRleCxcbiAgZGF5LFxuICBjbGFzc05hbWUgPSAnJyxcbn0pID0+IHtcbiAgY29uc3QgYWxsRXZlbnRzRGlhbG9nUmVmID0gUmVhY3QudXNlUmVmPHtcbiAgICBvcGVuOiAoKSA9PiB2b2lkXG4gICAgY2xvc2U6ICgpID0+IHZvaWRcbiAgICBzZXRTZWxlY3RlZERheUV2ZW50czogKGRheUV2ZW50czogU2VsZWN0ZWREYXlFdmVudHMpID0+IHZvaWRcbiAgfT4obnVsbClcbiAgY29uc3Qge1xuICAgIGV2ZW50cyxcbiAgICBjdXJyZW50RGF0ZSxcbiAgICBmaXJzdERheU9mV2VlayxcbiAgICBkYXlNYXhFdmVudHMgPSAwLFxuICB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcbiAgY29uc3QgdG9kYXlFdmVudHMgPSBldmVudHMuZmlsdGVyKChlKSA9PiB7XG4gICAgY29uc3Qgc3RhcnRzVG9kYXkgPSBlLnN0YXJ0LmlzU2FtZShkYXksICdkYXknKVxuICAgIGNvbnN0IGVuZHNUb2RheSA9IGUuZW5kLmlzU2FtZShkYXksICdkYXknKVxuICAgIGNvbnN0IHNwYW5zVG9kYXkgPSBlLnN0YXJ0LmlzQmVmb3JlKGRheSwgJ2RheScpICYmIGUuZW5kLmlzQWZ0ZXIoZGF5LCAnZGF5JylcblxuICAgIHJldHVybiBzdGFydHNUb2RheSB8fCBlbmRzVG9kYXkgfHwgc3BhbnNUb2RheVxuICB9KVxuXG4gIC8vIEdldCBzdGFydCBkYXRlIGZvciB0aGUgY3VycmVudCBtb250aCB2aWV3IGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrXG4gIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IGN1cnJlbnREYXRlLnN0YXJ0T2YoJ21vbnRoJylcblxuICAvLyBDYWxjdWxhdGUgdGhlIGZpcnN0IGRheSBvZiB0aGUgY2FsZW5kYXIgZ3JpZCBjb3JyZWN0bHlcbiAgLy8gRmluZCB0aGUgZmlyc3QgZGF5IG9mIHdlZWsgKGUuZy4gU3VuZGF5IG9yIE1vbmRheSkgdGhhdCBjb21lcyBiZWZvcmUgb3Igb24gdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGhcbiAgbGV0IGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyID0gZmlyc3REYXlPZk1vbnRoLmNsb25lKClcbiAgd2hpbGUgKGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyLmRheSgpICE9PSBmaXJzdERheU9mV2Vlaykge1xuICAgIGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyID0gYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIuc3VidHJhY3QoMSwgJ2RheScpXG4gIH1cblxuICAvLyBIYW5kbGVyIGZvciBzaG93aW5nIGFsbCBldmVudHMgaW4gYSBkaWFsb2dcbiAgY29uc3Qgc2hvd0FsbEV2ZW50cyA9IChkYXk6IGRheWpzLkRheWpzLCBldmVudHM6IENhbGVuZGFyRXZlbnRbXSkgPT4ge1xuICAgIGFsbEV2ZW50c0RpYWxvZ1JlZi5jdXJyZW50Py5zZXRTZWxlY3RlZERheUV2ZW50cyh7XG4gICAgICBkYXksXG4gICAgICBldmVudHMsXG4gICAgfSlcbiAgICBhbGxFdmVudHNEaWFsb2dSZWYuY3VycmVudD8ub3BlbigpXG4gIH1cblxuICBjb25zdCBpc1RvZGF5ID0gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JylcbiAgY29uc3QgaXNDdXJyZW50TW9udGggPSBkYXkubW9udGgoKSA9PT0gY3VycmVudERhdGUubW9udGgoKVxuICBjb25zdCBpc0xhc3RDb2x1bW4gPSBpbmRleCA9PT0gNiAvLyBTYXR1cmRheSBpcyB0aGUgbGFzdCBjb2x1bW4gaW4gYSB3ZWVrXG5cbiAgY29uc3QgaGlkZGVuRXZlbnRzQ291bnQgPSB0b2RheUV2ZW50cy5sZW5ndGggLSBkYXlNYXhFdmVudHNcbiAgY29uc3QgaGFzSGlkZGVuRXZlbnRzID0gaGlkZGVuRXZlbnRzQ291bnQgPiAwXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPERyb3BwYWJsZUNlbGxcbiAgICAgICAgaWQ9e2BkYXktY2VsbC0ke2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICB0eXBlPVwiZGF5LWNlbGxcIlxuICAgICAgICBkYXRhLXRlc3RpZD17YGRheS1jZWxsLSR7ZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgIGRhdGU9e2RheX1cbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAnY3Vyc29yLXBvaW50ZXIgb3ZlcmZsb3ctY2xpcCBwLTEgaG92ZXI6YmctYWNjZW50JyxcbiAgICAgICAgICAhaXNDdXJyZW50TW9udGggJiYgJ2JnLXNlY29uZGFyeSB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgICAgIGlzTGFzdENvbHVtbiAmJiAnYm9yZGVyLXItMCcsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICA+XG4gICAgICAgIHsvKiBBYnNvbHV0ZWx5IHBvc2l0aW9uZWQgbXVsdGktZGF5IGJhcnMgKEdvb2dsZSBDYWxlbmRhciBzdHlsZSkgKi99XG5cbiAgICAgICAgey8qIFNpbmdsZS1kYXkgZXZlbnRzIGNvbnRhaW5lciBwb3NpdGlvbmVkIGJlbG93IG11bHRpLWRheSBldmVudHMgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIHsvKiBEYXkgbnVtYmVyICovfVxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdmbGV4IGgtNSB3LTUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCB0ZXh0LXhzIHNtOmgtNiBzbTp3LTYgc206dGV4dC1zbScsXG4gICAgICAgICAgICAgIGlzVG9kYXkgJiYgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgZm9udC1tZWRpdW0nXG4gICAgICAgICAgICApfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtkYXkuZGF0ZSgpfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIFJlbmRlciBwbGFjZWhvbGRlcnMgZm9yIGV2ZW50cyB0aGF0IG9jY3VyIHRvZGF5IHNvIHRoYXQgdGhlIGNlbGwgaGVpZ2h0IGlzIGFjY29yZGluZyB0byBkYXlNYXhFdmVudHMuICovfVxuICAgICAgICAgIHt0b2RheUV2ZW50cy5zbGljZSgwLCBkYXlNYXhFdmVudHMpLm1hcCgoZXZlbnQsIHJvd0luZGV4KSA9PiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGtleT17YGVtcHR5LSR7cm93SW5kZXh9YH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC1bMjBweF0gdy1mdWxsXCJcbiAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2V2ZW50Py50aXRsZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG5cbiAgICAgICAgICB7LyogU2hvdyBtb3JlIGV2ZW50cyBidXR0b24gd2l0aCBhY2N1cmF0ZSBjb3VudCAqL31cbiAgICAgICAgICB7aGFzSGlkZGVuRXZlbnRzICYmIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGhvdmVyOnRleHQtZm9yZWdyb3VuZCBjdXJzb3ItcG9pbnRlciB0ZXh0LVsxMHB4XSB3aGl0ZXNwYWNlLW5vd3JhcCBzbTp0ZXh0LXhzIG10LTFcIlxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcblxuICAgICAgICAgICAgICAgIHNob3dBbGxFdmVudHMoZGF5LCB0b2RheUV2ZW50cylcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgK3toaWRkZW5FdmVudHNDb3VudH0gbW9yZVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L0Ryb3BwYWJsZUNlbGw+XG5cbiAgICAgIHsvKiBEaWFsb2cgZm9yIHNob3dpbmcgYWxsIGV2ZW50cyAqL31cbiAgICAgIDxBbGxFdmVudERpYWxvZyByZWY9e2FsbEV2ZW50c0RpYWxvZ1JlZn0gLz5cbiAgICA8Lz5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VEcm9wcGFibGUgfSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHR5cGUgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuXG5pbnRlcmZhY2UgRHJvcHBhYmxlQ2VsbFByb3BzIHtcbiAgaWQ6IHN0cmluZ1xuICB0eXBlOiAnZGF5LWNlbGwnIHwgJ3RpbWUtY2VsbCdcbiAgZGF0ZTogZGF5anMuRGF5anNcbiAgaG91cj86IG51bWJlclxuICBtaW51dGU/OiBudW1iZXJcbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIHN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAnZGF0YS10ZXN0aWQnPzogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEcm9wcGFibGVDZWxsKHtcbiAgaWQsXG4gIHR5cGUsXG4gIGRhdGUsXG4gIGhvdXIsXG4gIG1pbnV0ZSxcbiAgY2hpbGRyZW4sXG4gIGNsYXNzTmFtZSxcbiAgc3R5bGUsXG4gICdkYXRhLXRlc3RpZCc6IGRhdGFUZXN0SWQsXG59OiBEcm9wcGFibGVDZWxsUHJvcHMpIHtcbiAgY29uc3QgeyBvbkNlbGxDbGljaywgZGlzYWJsZURyYWdBbmREcm9wLCBkaXNhYmxlQ2VsbENsaWNrIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IHsgaXNPdmVyLCBzZXROb2RlUmVmIH0gPSB1c2VEcm9wcGFibGUoe1xuICAgIGlkLFxuICAgIGRhdGE6IHtcbiAgICAgIHR5cGUsXG4gICAgICBkYXRlLFxuICAgICAgaG91cixcbiAgICAgIG1pbnV0ZSxcbiAgICB9LFxuICAgIGRpc2FibGVkOiBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlQ2VsbENsaWNrID0gKGU6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgaWYgKGRpc2FibGVDZWxsQ2xpY2spIHJldHVyblxuXG4gICAgY29uc3Qgc3RhcnREYXRlID0gZGF0ZS5ob3VyKGhvdXIgPz8gMCkubWludXRlKG1pbnV0ZSA/PyAwKVxuICAgIGxldCBlbmREYXRlID0gc3RhcnREYXRlLmNsb25lKClcbiAgICBpZiAoaG91ciAhPT0gdW5kZWZpbmVkICYmIG1pbnV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmREYXRlID0gZW5kRGF0ZS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUgKyAxNSkgLy8gZGF5IHZpZXcgdGltZSBzbG90cyBhcmUgMTUgbWludXRlc1xuICAgIH0gZWxzZSBpZiAoaG91ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmREYXRlID0gZW5kRGF0ZS5ob3VyKGhvdXIgKyAxKS5taW51dGUoMCkgLy8gd2VlayB2aWV3IHRpbWUgc2xvdHMgYXJlIDEgaG91clxuICAgIH0gZWxzZSB7XG4gICAgICBlbmREYXRlID0gZW5kRGF0ZS5ob3VyKDIzKS5taW51dGUoNTkpIC8vIG1vbnRoIHZpZXcgZnVsbCBkYXlcbiAgICB9XG5cbiAgICBvbkNlbGxDbGljayhzdGFydERhdGUsIGVuZERhdGUpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17c2V0Tm9kZVJlZn1cbiAgICAgIGRhdGEtdGVzdGlkPXtkYXRhVGVzdElkfVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBpc092ZXIgJiYgIWRpc2FibGVEcmFnQW5kRHJvcCAmJiAnYmctYWNjZW50JyxcbiAgICAgICAgZGlzYWJsZUNlbGxDbGljayA/ICdjdXJzb3ItZGVmYXVsdCcgOiAnY3Vyc29yLXBvaW50ZXInXG4gICAgICApfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2VsbENsaWNrfVxuICAgICAgc3R5bGU9e3N0eWxlfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgTW9udGhIZWFkZXI6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7XG4gICAgZmlyc3REYXlPZldlZWssXG4gICAgY3VycmVudExvY2FsZSxcbiAgICBzdGlja3lWaWV3SGVhZGVyLFxuICAgIHZpZXdIZWFkZXJDbGFzc05hbWUsXG4gIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIC8vIFJlb3JkZXIgd2VlayBkYXlzIGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrXG4gIGNvbnN0IHdlZWtEYXlzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgZGF5cyA9IGRheWpzLndlZWtkYXlzKCkubWFwKChkYXkpID0+IGRheS50b0xvd2VyQ2FzZSgpKVxuICAgIGNvbnN0IHNob3J0RGF5cyA9IGRheWpzLndlZWtkYXlzU2hvcnQoKS5tYXAoKGRheSkgPT4gZGF5LnRvTG93ZXJDYXNlKCkpXG5cbiAgICAvLyBSb3RhdGUgdGhlIGFycmF5IGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdERheU9mV2VlazsgaSsrKSB7XG4gICAgICBjb25zdCBkYXlUb01vdmUgPSBkYXlzLnNoaWZ0KClcbiAgICAgIGNvbnN0IHNob3J0RGF5VG9Nb3ZlID0gc2hvcnREYXlzLnNoaWZ0KClcbiAgICAgIGlmIChkYXlUb01vdmUpIGRheXMucHVzaChkYXlUb01vdmUpXG4gICAgICBpZiAoc2hvcnREYXlUb01vdmUpIHNob3J0RGF5cy5wdXNoKHNob3J0RGF5VG9Nb3ZlKVxuICAgIH1cblxuICAgIHJldHVybiB7IGRheXMsIHNob3J0RGF5cyB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZmlyc3REYXlPZldlZWssIGN1cnJlbnRMb2NhbGVdKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2dyaWQgZ3JpZC1jb2xzLTcgYm9yZGVyLWInLFxuICAgICAgICBzdGlja3lWaWV3SGVhZGVyICYmICdzdGlja3kgdG9wLTAgei0xMDAnLFxuICAgICAgICB2aWV3SGVhZGVyQ2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgZGF0YS10ZXN0aWQ9XCJtb250aC1oZWFkZXJcIlxuICAgID5cbiAgICAgIHt3ZWVrRGF5cy5kYXlzLm1hcCgod2Vla0RheSwgaW5kZXgpID0+IChcbiAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBrZXk9e3dlZWtEYXl9IG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgIGtleT17d2Vla0RheX1cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgICAgIGV4aXQ9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgICB0cmFuc2l0aW9uPXt7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwLjI1LFxuICAgICAgICAgICAgICBlYXNlOiAnZWFzZUluT3V0JyxcbiAgICAgICAgICAgICAgZGVsYXk6IGluZGV4ICogMC4wNSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJweS0yIHRleHQtY2VudGVyIGZvbnQtbWVkaXVtIGJvcmRlci1yIGZpcnN0OmJvcmRlci1sXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vla2RheS1oZWFkZXItJHt3ZWVrRGF5fWB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIHRleHQtc20gc206aW5saW5lXCI+e3dlZWtEYXl9PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14cyBzbTpoaWRkZW5cIj5cbiAgICAgICAgICAgICAge3dlZWtEYXlzLnNob3J0RGF5c1tpbmRleF19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9tb3Rpb24uZGl2PlxuICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICAgICkpfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImV4cG9ydCBjb25zdCBHQVBfQkVUV0VFTl9FTEVNRU5UUyA9IDEgLy8gcHggKGdhcC0xKVxuZXhwb3J0IGNvbnN0IERBWV9OVU1CRVJfSEVJR0hUID0gMjggLy8gcHggKGgtNylcbmV4cG9ydCBjb25zdCBFVkVOVF9CQVJfSEVJR0hUID0gMjQgLy8gcHggKGgtWzI0cHhdKVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBEcmFnZ2FibGVFdmVudCB9IGZyb20gJ0AvZmVhdHVyZXMvZHJhZ2dhYmxlLWV2ZW50L2RyYWdnYWJsZS1ldmVudCdcbmltcG9ydCB7XG4gIERBWV9OVU1CRVJfSEVJR0hULFxuICBFVkVOVF9CQVJfSEVJR0hULFxuICBHQVBfQkVUV0VFTl9FTEVNRU5UUyxcbn0gZnJvbSAnQC9saWIvY29uc3RhbnRzJ1xuXG5pbnRlcmZhY2UgUHJvY2Vzc2VkRXZlbnQgZXh0ZW5kcyBDYWxlbmRhckV2ZW50IHtcbiAgbGVmdDogbnVtYmVyIC8vIExlZnQgcG9zaXRpb24gaW4gcGVyY2VudGFnZVxuICB3aWR0aDogbnVtYmVyIC8vIFdpZHRoIGluIHBlcmNlbnRhZ2VcbiAgdG9wOiBudW1iZXIgLy8gVG9wIHBvc2l0aW9uIGluIHBlcmNlbnRhZ2VcbiAgaGVpZ2h0OiBudW1iZXIgLy8gSGVpZ2h0IGluIHBlcmNlbnRhZ2VcbiAgcG9zaXRpb246IG51bWJlciAvLyBQb3NpdGlvbiBpbiB0aGUgcm93ICgwIGZvciBmaXJzdCwgMSBmb3Igc2Vjb25kLCBldGMuKVxufVxuXG5pbnRlcmZhY2UgV2Vla0V2ZW50c0xheWVyUHJvcHMge1xuICBkYXlzOiBkYXlqcy5EYXlqc1tdXG59XG5cbmV4cG9ydCBjb25zdCBXZWVrRXZlbnRzTGF5ZXI6IFJlYWN0LkZDPFdlZWtFdmVudHNMYXllclByb3BzPiA9ICh7IGRheXMgfSkgPT4ge1xuICBjb25zdCB7IGV2ZW50cywgZGF5TWF4RXZlbnRzIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIGNvbnN0IHdlZWtTdGFydCA9IGRheXNbMF1cbiAgY29uc3Qgd2Vla0VuZCA9IGRheXNbNl1cblxuICAvLyBHZXQgYWxsIGV2ZW50cyB0aGF0IGludGVyc2VjdCB3aXRoIHRoaXMgd2Vla1xuICBjb25zdCB3ZWVrRXZlbnRzID0gZXZlbnRzLmZpbHRlcigoZSkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0c0luV2VlayA9XG4gICAgICBlLnN0YXJ0LmlzU2FtZU9yQWZ0ZXIod2Vla1N0YXJ0LnN0YXJ0T2YoJ2RheScpKSAmJlxuICAgICAgZS5zdGFydC5pc1NhbWVPckJlZm9yZSh3ZWVrRW5kLmVuZE9mKCdkYXknKSlcbiAgICBjb25zdCBlbmRzSW5XZWVrID1cbiAgICAgIGUuZW5kLmlzU2FtZU9yQWZ0ZXIod2Vla1N0YXJ0LnN0YXJ0T2YoJ2RheScpKSAmJlxuICAgICAgZS5lbmQuaXNTYW1lT3JCZWZvcmUod2Vla0VuZC5lbmRPZignZGF5JykpXG4gICAgY29uc3Qgc3BhbnNXZWVrID1cbiAgICAgIGUuc3RhcnQuaXNCZWZvcmUod2Vla1N0YXJ0LnN0YXJ0T2YoJ2RheScpKSAmJlxuICAgICAgZS5lbmQuaXNBZnRlcih3ZWVrRW5kLmVuZE9mKCdkYXknKSlcbiAgICByZXR1cm4gc3RhcnRzSW5XZWVrIHx8IGVuZHNJbldlZWsgfHwgc3BhbnNXZWVrXG4gIH0pXG5cbiAgLy8gU2VwYXJhdGUgbXVsdGktZGF5IGFuZCBzaW5nbGUtZGF5IGV2ZW50c1xuICBjb25zdCBtdWx0aURheUV2ZW50cyA9IHdlZWtFdmVudHMuZmlsdGVyKFxuICAgIChlKSA9PiBlLmVuZC5kaWZmKGUuc3RhcnQsICdkYXknKSA+IDBcbiAgKVxuICBjb25zdCBzaW5nbGVEYXlFdmVudHMgPSB3ZWVrRXZlbnRzLmZpbHRlcihcbiAgICAoZSkgPT4gZS5lbmQuZGlmZihlLnN0YXJ0LCAnZGF5JykgPT09IDBcbiAgKVxuXG4gIC8vIFNvcnQgbXVsdGktZGF5IGV2ZW50cyBieSBzdGFydCBkYXRlLCB0aGVuIGJ5IGR1cmF0aW9uXG4gIGNvbnN0IHNvcnRlZE11bHRpRGF5ID0gWy4uLm11bHRpRGF5RXZlbnRzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qgc3RhcnREaWZmID0gYS5zdGFydC5kaWZmKGIuc3RhcnQpXG4gICAgaWYgKHN0YXJ0RGlmZiAhPT0gMCkgcmV0dXJuIHN0YXJ0RGlmZlxuICAgIHJldHVybiBiLmVuZC5kaWZmKGIuc3RhcnQpIC0gYS5lbmQuZGlmZihhLnN0YXJ0KSAvLyBMb25nZXIgZXZlbnRzIGZpcnN0XG4gIH0pXG5cbiAgLy8gU29ydCBzaW5nbGUtZGF5IGV2ZW50cyBieSBzdGFydCB0aW1lXG4gIGNvbnN0IHNvcnRlZFNpbmdsZURheSA9IFsuLi5zaW5nbGVEYXlFdmVudHNdLnNvcnQoKGEsIGIpID0+XG4gICAgYS5zdGFydC5kaWZmKGIuc3RhcnQpXG4gIClcblxuICAvLyBDcmVhdGUgNyB4IGRheU1heEV2ZW50cyBncmlkIHdpdGggZmxhZ3NcbiAgY29uc3QgZ3JpZDogQXJyYXk8QXJyYXk8eyB0YWtlbjogYm9vbGVhbjsgZXZlbnQ6IENhbGVuZGFyRXZlbnQgfCBudWxsIH0+PiA9IFtdXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGRheU1heEV2ZW50czsgcm93KyspIHtcbiAgICBncmlkW3Jvd10gPSBbXVxuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDc7IGNvbCsrKSB7XG4gICAgICBncmlkW3Jvd11bY29sXSA9IHsgdGFrZW46IGZhbHNlLCBldmVudDogbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXZlbnRQb3NpdGlvbnM6IFByb2Nlc3NlZEV2ZW50W10gPSBbXVxuXG4gIC8vIFN0ZXAgMTogQXNzaWduIHBvc2l0aW9ucyB0byBtdWx0aS1kYXkgZXZlbnRzIGZpcnN0XG4gIGZvciAoY29uc3QgZXZlbnQgb2Ygc29ydGVkTXVsdGlEYXkpIHtcbiAgICBjb25zdCBldmVudFN0YXJ0ID0gZGF5anMubWF4KGV2ZW50LnN0YXJ0LnN0YXJ0T2YoJ2RheScpLCB3ZWVrU3RhcnQpXG4gICAgY29uc3QgZXZlbnRFbmQgPSBkYXlqcy5taW4oZXZlbnQuZW5kLnN0YXJ0T2YoJ2RheScpLCB3ZWVrRW5kKVxuICAgIGNvbnN0IHN0YXJ0Q29sID0gTWF0aC5tYXgoMCwgZXZlbnRTdGFydC5kaWZmKHdlZWtTdGFydCwgJ2RheScpKVxuICAgIGNvbnN0IGVuZENvbCA9IE1hdGgubWluKDYsIGV2ZW50RW5kLmRpZmYod2Vla1N0YXJ0LCAnZGF5JykpXG5cbiAgICAvLyBUcnkgdG8gcGxhY2UgdGhlIGV2ZW50IHN0YXJ0aW5nIGZyb20gaXRzIG9yaWdpbmFsIHN0YXJ0IGNvbHVtblxuICAgIGxldCBwbGFjZWRTdWNjZXNzZnVsbHkgPSBmYWxzZVxuXG4gICAgLy8gRmlyc3QgdHJ5OiBwbGFjZSBmcm9tIG9yaWdpbmFsIHN0YXJ0IHBvc2l0aW9uXG4gICAgbGV0IGFzc2lnbmVkUm93ID0gLTFcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBkYXlNYXhFdmVudHM7IHJvdysrKSB7XG4gICAgICBsZXQgY2FuUGxhY2UgPSB0cnVlXG4gICAgICBmb3IgKGxldCBjb2wgPSBzdGFydENvbDsgY29sIDw9IGVuZENvbDsgY29sKyspIHtcbiAgICAgICAgaWYgKGdyaWRbcm93XVtjb2xdLnRha2VuKSB7XG4gICAgICAgICAgY2FuUGxhY2UgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjYW5QbGFjZSkge1xuICAgICAgICBhc3NpZ25lZFJvdyA9IHJvd1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGZvdW5kIGEgcm93LCBhc3NpZ24gdGhlIGV2ZW50IHRvIGFsbCBpdHMgY29sdW1uc1xuICAgIGlmIChhc3NpZ25lZFJvdyAhPT0gLTEpIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IHN0YXJ0Q29sOyBjb2wgPD0gZW5kQ29sOyBjb2wrKykge1xuICAgICAgICBncmlkW2Fzc2lnbmVkUm93XVtjb2xdID0geyB0YWtlbjogdHJ1ZSwgZXZlbnQgfVxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgcG9zaXRpb24gZGF0YSBmb3IgcmVuZGVyaW5nXG4gICAgICBjb25zdCBzcGFuRGF5cyA9IGVuZENvbCAtIHN0YXJ0Q29sICsgMVxuICAgICAgZXZlbnRQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgIGxlZnQ6IChzdGFydENvbCAvIDcpICogMTAwLFxuICAgICAgICB3aWR0aDogKHNwYW5EYXlzIC8gNykgKiAxMDAsXG4gICAgICAgIHRvcDpcbiAgICAgICAgICBEQVlfTlVNQkVSX0hFSUdIVCArXG4gICAgICAgICAgR0FQX0JFVFdFRU5fRUxFTUVOVFMgK1xuICAgICAgICAgIGFzc2lnbmVkUm93ICogKEVWRU5UX0JBUl9IRUlHSFQgKyBHQVBfQkVUV0VFTl9FTEVNRU5UUyksXG4gICAgICAgIGhlaWdodDogRVZFTlRfQkFSX0hFSUdIVCxcbiAgICAgICAgcG9zaXRpb246IGFzc2lnbmVkUm93LFxuICAgICAgICAuLi5ldmVudCxcbiAgICAgIH0pXG4gICAgICBwbGFjZWRTdWNjZXNzZnVsbHkgPSB0cnVlXG4gICAgfVxuXG4gICAgLy8gSWYgY291bGRuJ3QgcGxhY2UgYXQgb3JpZ2luYWwgcG9zaXRpb24sIHRyeSB0cnVuY2F0ZWQgdmVyc2lvbnMgc3RhcnRpbmcgZnJvbSBsYXRlciBkYXlzXG4gICAgaWYgKCFwbGFjZWRTdWNjZXNzZnVsbHkpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCB0cnlTdGFydENvbCA9IHN0YXJ0Q29sICsgMTtcbiAgICAgICAgdHJ5U3RhcnRDb2wgPD0gZW5kQ29sO1xuICAgICAgICB0cnlTdGFydENvbCsrXG4gICAgICApIHtcbiAgICAgICAgLy8gVHJ5IHRvIHBsYWNlIHRoZSB0cnVuY2F0ZWQgZXZlbnQgc3RhcnRpbmcgZnJvbSB0aGlzIGNvbHVtblxuICAgICAgICBsZXQgdHJ1bmNhdGVkQXNzaWduZWRSb3cgPSAtMVxuICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBkYXlNYXhFdmVudHM7IHJvdysrKSB7XG4gICAgICAgICAgbGV0IGNhblBsYWNlID0gdHJ1ZVxuICAgICAgICAgIGZvciAobGV0IGNvbCA9IHRyeVN0YXJ0Q29sOyBjb2wgPD0gZW5kQ29sOyBjb2wrKykge1xuICAgICAgICAgICAgaWYgKGdyaWRbcm93XVtjb2xdLnRha2VuKSB7XG4gICAgICAgICAgICAgIGNhblBsYWNlID0gZmFsc2VcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNhblBsYWNlKSB7XG4gICAgICAgICAgICB0cnVuY2F0ZWRBc3NpZ25lZFJvdyA9IHJvd1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIHJvdyBmb3IgdGhlIHRydW5jYXRlZCB2ZXJzaW9uLCBwbGFjZSBpdFxuICAgICAgICBpZiAodHJ1bmNhdGVkQXNzaWduZWRSb3cgIT09IC0xKSB7XG4gICAgICAgICAgZm9yIChsZXQgY29sID0gdHJ5U3RhcnRDb2w7IGNvbCA8PSBlbmRDb2w7IGNvbCsrKSB7XG4gICAgICAgICAgICBncmlkW3RydW5jYXRlZEFzc2lnbmVkUm93XVtjb2xdID0geyB0YWtlbjogdHJ1ZSwgZXZlbnQgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENyZWF0ZSBwb3NpdGlvbiBkYXRhIGZvciB0aGUgdHJ1bmNhdGVkIHJlbmRlcmluZ1xuICAgICAgICAgIGNvbnN0IHRydW5jYXRlZFNwYW5EYXlzID0gZW5kQ29sIC0gdHJ5U3RhcnRDb2wgKyAxXG4gICAgICAgICAgZXZlbnRQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBsZWZ0OiAodHJ5U3RhcnRDb2wgLyA3KSAqIDEwMCxcbiAgICAgICAgICAgIHdpZHRoOiAodHJ1bmNhdGVkU3BhbkRheXMgLyA3KSAqIDEwMCxcbiAgICAgICAgICAgIHRvcDpcbiAgICAgICAgICAgICAgREFZX05VTUJFUl9IRUlHSFQgK1xuICAgICAgICAgICAgICBHQVBfQkVUV0VFTl9FTEVNRU5UUyArXG4gICAgICAgICAgICAgIHRydW5jYXRlZEFzc2lnbmVkUm93ICogKEVWRU5UX0JBUl9IRUlHSFQgKyBHQVBfQkVUV0VFTl9FTEVNRU5UUyksXG4gICAgICAgICAgICBoZWlnaHQ6IEVWRU5UX0JBUl9IRUlHSFQsXG4gICAgICAgICAgICBwb3NpdGlvbjogdHJ1bmNhdGVkQXNzaWduZWRSb3csXG4gICAgICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHBsYWNlZFN1Y2Nlc3NmdWxseSA9IHRydWVcbiAgICAgICAgICBicmVhayAvLyBTdWNjZXNzZnVsbHkgcGxhY2VkLCBzdG9wIHRyeWluZyBvdGhlciBzdGFydCBwb3NpdGlvbnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMjogRmlsbCBnYXBzIHdpdGggc2luZ2xlLWRheSBldmVudHNcbiAgZm9yIChjb25zdCBldmVudCBvZiBzb3J0ZWRTaW5nbGVEYXkpIHtcbiAgICBjb25zdCBldmVudFN0YXJ0ID0gZGF5anMubWF4KGV2ZW50LnN0YXJ0LnN0YXJ0T2YoJ2RheScpLCB3ZWVrU3RhcnQpXG4gICAgY29uc3QgY29sID0gTWF0aC5tYXgoMCwgZXZlbnRTdGFydC5kaWZmKHdlZWtTdGFydCwgJ2RheScpKVxuXG4gICAgLy8gRmluZCB0aGUgZmlyc3QgYXZhaWxhYmxlIHJvdyBpbiB0aGlzIGNvbHVtblxuICAgIGxldCBhc3NpZ25lZFJvdyA9IC0xXG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZGF5TWF4RXZlbnRzOyByb3crKykge1xuICAgICAgaWYgKCFncmlkW3Jvd11bY29sXS50YWtlbikge1xuICAgICAgICBhc3NpZ25lZFJvdyA9IHJvd1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGZvdW5kIGEgcm93LCBhc3NpZ24gdGhlIGV2ZW50XG4gICAgaWYgKGFzc2lnbmVkUm93ICE9PSAtMSkge1xuICAgICAgZ3JpZFthc3NpZ25lZFJvd11bY29sXSA9IHsgdGFrZW46IHRydWUsIGV2ZW50IH1cblxuICAgICAgLy8gQ3JlYXRlIHBvc2l0aW9uIGRhdGEgZm9yIHJlbmRlcmluZ1xuICAgICAgZXZlbnRQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgIGxlZnQ6IChjb2wgLyA3KSAqIDEwMCxcbiAgICAgICAgd2lkdGg6ICgxIC8gNykgKiAxMDAsXG4gICAgICAgIHRvcDpcbiAgICAgICAgICBEQVlfTlVNQkVSX0hFSUdIVCArXG4gICAgICAgICAgR0FQX0JFVFdFRU5fRUxFTUVOVFMgK1xuICAgICAgICAgIGFzc2lnbmVkUm93ICogKEVWRU5UX0JBUl9IRUlHSFQgKyBHQVBfQkVUV0VFTl9FTEVNRU5UUyksXG4gICAgICAgIGhlaWdodDogRVZFTlRfQkFSX0hFSUdIVCxcbiAgICAgICAgcG9zaXRpb246IGFzc2lnbmVkUm93LFxuICAgICAgICAuLi5ldmVudCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHctZnVsbCBoLWZ1bGwgcG9pbnRlci1ldmVudHMtbm9uZSB6LTIwIG92ZXJmbG93LWNsaXBcIj5cbiAgICAgIHtldmVudFBvc2l0aW9ucy5tYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgZXZlbnQtJHtldmVudC5pZH0tJHtldmVudC5wb3NpdGlvbn0tJHt3ZWVrU3RhcnQuZm9ybWF0KFxuICAgICAgICAgICAgICAnWVlZWS1NTS1ERCdcbiAgICAgICAgICAgICl9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHotMTAgcG9pbnRlci1ldmVudHMtYXV0byBvdmVyZmxvdy1jbGlwXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGxlZnQ6IGBjYWxjKCR7ZXZlbnQubGVmdH0lICsgdmFyKC0tc3BhY2luZykgKiAwLjI1KWAsXG4gICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygke2V2ZW50LndpZHRofSUgLSB2YXIoLS1zcGFjaW5nKSAqIDEpYCxcbiAgICAgICAgICAgICAgdG9wOiBgJHtldmVudC50b3B9cHhgLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGAke0VWRU5UX0JBUl9IRUlHSFR9cHhgLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgZWxlbWVudElkPXtgZXZlbnQtJHtldmVudC5pZH0tJHtcbiAgICAgICAgICAgICAgICBldmVudC5wb3NpdGlvblxuICAgICAgICAgICAgICB9LSR7d2Vla1N0YXJ0LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC1mdWxsIHctZnVsbCBzaGFkb3dcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKVxuICAgICAgfSl9XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHsgU2Nyb2xsQXJlYSB9IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgd2Vla09mWWVhciBmcm9tICdkYXlqcy9wbHVnaW4vd2Vla09mWWVhcidcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFdlZWtBbGxEYXlSb3cgfSBmcm9tICcuL3dlZWstYWxsLWRheS1yb3cnXG5pbXBvcnQgeyBXZWVrSGVhZGVyIH0gZnJvbSAnLi93ZWVrLWhlYWRlcidcbmltcG9ydCB7IFdlZWtUaW1lR3JpZCB9IGZyb20gJy4vd2Vlay10aW1lLWdyaWQnXG4vLyBBZGQgd2Vla09mWWVhciBwbHVnaW4gdG8gZGF5anNcbmRheWpzLmV4dGVuZCh3ZWVrT2ZZZWFyKVxuXG5jb25zdCBXZWVrVmlldzogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGgtZnVsbCBmbGV4LWNvbFwiIGRhdGEtdGVzdGlkPVwid2Vlay12aWV3XCI+XG4gICAgICB7LyogV2VlayBoZWFkZXIgcm93IC0gZml4ZWQgKi99XG4gICAgICA8V2Vla0hlYWRlciAvPlxuXG4gICAgICB7LyogU2Nyb2xsYWJsZSB0aW1lIGdyaWQgKi99XG4gICAgICA8U2Nyb2xsQXJlYVxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtMSBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJ3ZWVrLXNjcm9sbC1hcmVhXCJcbiAgICAgID5cbiAgICAgICAgey8qIEFsbC1kYXkgZXZlbnRzIHJvdyAtIGR5bmFtaWMgaGVpZ2h0IGJhc2VkIG9uIGNvbnRlbnQgKi99XG4gICAgICAgIDxXZWVrQWxsRGF5Um93IC8+XG4gICAgICAgIDxXZWVrVGltZUdyaWQgLz5cbiAgICAgIDwvU2Nyb2xsQXJlYT5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBXZWVrVmlld1xuIiwKICAgICJpbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBEcmFnZ2FibGVFdmVudCB9IGZyb20gJy4uL2RyYWdnYWJsZS1ldmVudC9kcmFnZ2FibGUtZXZlbnQnXG5pbXBvcnQgeyBEcm9wcGFibGVDZWxsIH0gZnJvbSAnLi4vZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwnXG5pbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQsIFByb2Nlc3NlZENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5pbXBvcnQgeyBFVkVOVF9CQVJfSEVJR0hULCBHQVBfQkVUV0VFTl9FTEVNRU5UUyB9IGZyb20gJ0AvbGliL2NvbnN0YW50cydcblxuZXhwb3J0IGNvbnN0IFdlZWtBbGxEYXlSb3c6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCBnZXRFdmVudHNGb3JEYXRlUmFuZ2UsIGZpcnN0RGF5T2ZXZWVrIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gR2V0IHN0YXJ0IGFuZCBlbmQgb2YgY3VycmVudCB3ZWVrIGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrIHNldHRpbmdcbiAgY29uc3Qgc3RhcnRPZldlZWsgPSBjdXJyZW50RGF0ZS5zdGFydE9mKCd3ZWVrJykuZGF5KGZpcnN0RGF5T2ZXZWVrKVxuICAvLyBJZiBjdXJyZW50IGRhdGUgaXMgYmVmb3JlIHRoZSBzdGFydCBvZiB3ZWVrLCBtb3ZlIGJhY2sgb25lIHdlZWtcbiAgY29uc3QgYWRqdXN0ZWRTdGFydE9mV2VlayA9IGN1cnJlbnREYXRlLmlzQmVmb3JlKHN0YXJ0T2ZXZWVrKVxuICAgID8gc3RhcnRPZldlZWsuc3VidHJhY3QoMSwgJ3dlZWsnKVxuICAgIDogc3RhcnRPZldlZWtcbiAgY29uc3QgZW5kT2ZXZWVrID0gYWRqdXN0ZWRTdGFydE9mV2Vlay5hZGQoNiwgJ2RheScpXG5cbiAgLy8gQ3JlYXRlIGFuIGFycmF5IG9mIGRheXMgZm9yIHRoZSBjdXJyZW50IHdlZWtcbiAgY29uc3Qgd2Vla0RheXMgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgIHdlZWtEYXlzLnB1c2goYWRqdXN0ZWRTdGFydE9mV2Vlay5hZGQoaSwgJ2RheScpKVxuICB9XG5cbiAgLy8gR2V0IGV2ZW50cyB0aGF0IG1pZ2h0IG92ZXJsYXAgd2l0aCB0aGlzIHdlZWsgKGV4cGFuZCBzZWFyY2ggcmFuZ2UpXG4gIGNvbnN0IGV4cGFuZGVkU3RhcnREYXRlID0gYWRqdXN0ZWRTdGFydE9mV2Vlay5zdWJ0cmFjdCg2LCAnZGF5JykgLy8gTG9vayA2IGRheXMgYmVmb3JlIHdlZWsgc3RhcnRcbiAgY29uc3QgZXhwYW5kZWRFbmREYXRlID0gZW5kT2ZXZWVrLmFkZCg2LCAnZGF5JykgLy8gTG9vayA2IGRheXMgYWZ0ZXIgd2VlayBlbmRcbiAgY29uc3QgYWxsRXZlbnRzID0gZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlKGV4cGFuZGVkU3RhcnREYXRlLCBleHBhbmRlZEVuZERhdGUpXG5cbiAgLy8gRmlsdGVyIGV2ZW50cyB0aGF0IGFjdHVhbGx5IG92ZXJsYXAgd2l0aCB0aGUgY3VycmVudCB3ZWVrXG4gIGNvbnN0IHdlZWtFdmVudHMgPSBhbGxFdmVudHMuZmlsdGVyKChldmVudCkgPT4ge1xuICAgIC8vIEZpeGVkIGxvZ2ljOiBBbiBldmVudCBvdmVybGFwcyB3aXRoIHRoaXMgd2VlayBpZjpcbiAgICByZXR1cm4gKFxuICAgICAgLy8gRWl0aGVyIHRoZSBldmVudCBzdGFydHMgZHVyaW5nIHRoaXMgd2Vla1xuICAgICAgKGV2ZW50LnN0YXJ0LmlzU2FtZU9yQWZ0ZXIoYWRqdXN0ZWRTdGFydE9mV2VlaykgJiZcbiAgICAgICAgZXZlbnQuc3RhcnQuaXNTYW1lT3JCZWZvcmUoZW5kT2ZXZWVrKSkgfHxcbiAgICAgIC8vIE9yIHRoZSBldmVudCBlbmRzIGR1cmluZyB0aGlzIHdlZWtcbiAgICAgIChldmVudC5lbmQuaXNTYW1lT3JBZnRlcihhZGp1c3RlZFN0YXJ0T2ZXZWVrKSAmJlxuICAgICAgICBldmVudC5lbmQuaXNTYW1lT3JCZWZvcmUoZW5kT2ZXZWVrKSkgfHxcbiAgICAgIC8vIE9yIHRoZSBldmVudCBzcGFucyB0aGUgZW50aXJlIHdlZWsgKHN0YXJ0cyBiZWZvcmUgYW5kIGVuZHMgYWZ0ZXIpXG4gICAgICAoZXZlbnQuc3RhcnQuaXNCZWZvcmUoYWRqdXN0ZWRTdGFydE9mV2VlaykgJiZcbiAgICAgICAgZXZlbnQuZW5kLmlzQWZ0ZXIoZW5kT2ZXZWVrKSlcbiAgICApXG4gIH0pXG5cbiAgLy8gU2VwYXJhdGUgYWxsLWRheSBldmVudHMgZnJvbSByZWd1bGFyIGV2ZW50cyAoaW5jbHVkaW5nIG11bHRpLWRheSBldmVudHMpXG4gIGNvbnN0IGFsbERheUV2ZW50cyA9IHdlZWtFdmVudHMuZmlsdGVyKChldmVudCkgPT4gZXZlbnQuYWxsRGF5KVxuXG4gIC8vIFByb2Nlc3MgYW5kIGxheW91dCBhbGwtZGF5IGV2ZW50cyB0byBhdm9pZCBvdmVybGFwcGluZ1xuICBjb25zdCB7IHByb2Nlc3NlZEFsbERheUV2ZW50cyB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gU29ydCBhbGwtZGF5IGV2ZW50cyBieSBzdGFydCBkYXRlIGFuZCB0aGVuIGJ5IGR1cmF0aW9uIChsb25nZXIgZXZlbnRzIGZpcnN0KVxuICAgIGNvbnN0IHNvcnRlZEV2ZW50cyA9IFsuLi5hbGxEYXlFdmVudHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIC8vIEZpcnN0IGNvbXBhcmUgYnkgc3RhcnQgZGF0ZVxuICAgICAgY29uc3Qgc3RhcnREaWZmID0gYS5zdGFydC5kaWZmKGIuc3RhcnQpXG4gICAgICBpZiAoc3RhcnREaWZmICE9PSAwKSByZXR1cm4gc3RhcnREaWZmXG5cbiAgICAgIC8vIElmIHN0YXJ0IGRhdGVzIGFyZSB0aGUgc2FtZSwgbG9uZ2VyIGV2ZW50cyBjb21lIGZpcnN0XG4gICAgICBjb25zdCBhRHVyYXRpb24gPSBhLmVuZC5kaWZmKGEuc3RhcnQpXG4gICAgICBjb25zdCBiRHVyYXRpb24gPSBiLmVuZC5kaWZmKGIuc3RhcnQpXG4gICAgICByZXR1cm4gYkR1cmF0aW9uIC0gYUR1cmF0aW9uXG4gICAgfSlcblxuICAgIC8vIFRyYWNrIHBvc2l0aW9ucyBpbiByb3dzXG4gICAgY29uc3Qgcm93czogeyBlbmQ6IGRheWpzLkRheWpzOyBldmVudDogQ2FsZW5kYXJFdmVudCB9W11bXSA9IFtdXG4gICAgY29uc3QgcHJvY2Vzc2VkRXZlbnRzOiBQcm9jZXNzZWRDYWxlbmRhckV2ZW50W10gPSBbXVxuXG4gICAgc29ydGVkRXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAvLyBDYWxjdWxhdGUgd2hpY2ggZGF5cyB0aGlzIGV2ZW50IHNwYW5zXG4gICAgICBjb25zdCBldmVudFN0YXJ0ID0gZXZlbnQuc3RhcnQuaXNCZWZvcmUoYWRqdXN0ZWRTdGFydE9mV2VlaylcbiAgICAgICAgPyBhZGp1c3RlZFN0YXJ0T2ZXZWVrXG4gICAgICAgIDogZXZlbnQuc3RhcnRcbiAgICAgIGNvbnN0IGV2ZW50RW5kID0gZXZlbnQuZW5kLmlzQWZ0ZXIoZW5kT2ZXZWVrKSA/IGVuZE9mV2VlayA6IGV2ZW50LmVuZFxuXG4gICAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gYXMgcGVyY2VudGFnZSBvZiB0aGUgd2VlayB3aWR0aFxuICAgICAgY29uc3Qgc3RhcnREYXlJbmRleCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBldmVudFN0YXJ0LmRpZmYoYWRqdXN0ZWRTdGFydE9mV2VlaywgJ2RheScpXG4gICAgICApXG4gICAgICBjb25zdCBlbmREYXlJbmRleCA9IE1hdGgubWluKDYsIGV2ZW50RW5kLmRpZmYoYWRqdXN0ZWRTdGFydE9mV2VlaywgJ2RheScpKVxuXG4gICAgICBjb25zdCBsZWZ0ID0gKHN0YXJ0RGF5SW5kZXggLyA3KSAqIDEwMFxuICAgICAgY29uc3Qgd2lkdGggPSAoKGVuZERheUluZGV4IC0gc3RhcnREYXlJbmRleCArIDEpIC8gNykgKiAxMDBcblxuICAgICAgLy8gRmluZCBhIHJvdyB3aGVyZSB0aGlzIGV2ZW50IGNhbiBmaXRcbiAgICAgIGxldCByb3dJbmRleCA9IDBcbiAgICAgIGxldCBwbGFjZWQgPSBmYWxzZVxuXG4gICAgICB3aGlsZSAoIXBsYWNlZCkge1xuICAgICAgICBpZiAocm93SW5kZXggPj0gcm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcm93IGlmIG5lZWRlZFxuICAgICAgICAgIHJvd3MucHVzaChbXSlcbiAgICAgICAgICBwbGFjZWQgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBldmVudCBjYW4gZml0IGluIHRoZSBjdXJyZW50IHJvd1xuICAgICAgICAgIGNvbnN0IHJvdyA9IHJvd3Nbcm93SW5kZXhdXG4gICAgICAgICAgY29uc3QgY2FuRml0ID0gcm93LmV2ZXJ5KChpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBldmVudFN0YXJ0LmlzQWZ0ZXIoaXRlbS5lbmQpIHx8XG4gICAgICAgICAgICAgIGV2ZW50RW5kLmlzQmVmb3JlKGl0ZW0uZXZlbnQuc3RhcnQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjYW5GaXQpIHtcbiAgICAgICAgICAgIHBsYWNlZCA9IHRydWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93SW5kZXgrK1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgZXZlbnQgdG8gdGhlIHJvd1xuICAgICAgcm93c1tyb3dJbmRleF0ucHVzaCh7IGVuZDogZXZlbnRFbmQsIGV2ZW50IH0pXG5cbiAgICAgIC8vIEFkZCBwcm9jZXNzZWQgZXZlbnQgd2l0aCBjb3JyZWN0IHBvc2l0aW9uaW5nXG4gICAgICBwcm9jZXNzZWRFdmVudHMucHVzaCh7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBsZWZ0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgdG9wOiByb3dJbmRleCAqIChFVkVOVF9CQVJfSEVJR0hUICsgR0FQX0JFVFdFRU5fRUxFTUVOVFMpLFxuICAgICAgICBoZWlnaHQ6IEVWRU5UX0JBUl9IRUlHSFQsXG4gICAgICAgIGFsbERheTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzZWRBbGxEYXlFdmVudHM6IHByb2Nlc3NlZEV2ZW50cyxcbiAgICAgIGFsbERheVJvd3NDb3VudDogTWF0aC5tYXgoMSwgcm93cy5sZW5ndGgpLCAvLyBBdCBsZWFzdCAxIHJvdywgZXZlbiBpZiBlbXB0eVxuICAgIH1cbiAgfSwgW2FsbERheUV2ZW50cywgYWRqdXN0ZWRTdGFydE9mV2VlaywgZW5kT2ZXZWVrXSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLVthdXRvXzFmcl8xZnJfMWZyXzFmcl8xZnJfMWZyXzFmcl0gZ3JpZC1yb3dzLTEgcmVsYXRpdmVcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJ3ZWVrLWFsbC1kYXktcm93XCJcbiAgICA+XG4gICAgICB7LyogTGVmdCBsYWJlbCBmb3IgYWxsLWRheSBldmVudHMgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTQgZmxleCBzaHJpbmstMCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgYm9yZGVyLXggYm9yZGVyLWIgcHItMiBtaW4taC0xNlwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1bMTBweF0gd2hpdGVzcGFjZS1ub3dyYXAgc206dGV4dC14c1wiPlxuICAgICAgICAgIEFsbC1kYXlcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBEcm9wcGFibGUgY2VsbHMgZm9yIGVhY2ggZGF5ICovfVxuICAgICAge3dlZWtEYXlzLm1hcCgoZGF5KSA9PiAoXG4gICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAga2V5PXtgYWxsLWRheS0ke2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICAgIGlkPXtgYWxsLWRheS1jZWxsLSR7ZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgdHlwZT1cImRheS1jZWxsXCJcbiAgICAgICAgICBkYXRlPXtkYXl9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6YmctYWNjZW50IGgtZnVsbCBmbGV4LTEgY3Vyc29yLXBvaW50ZXIgYm9yZGVyLXIgYm9yZGVyLWJcIlxuICAgICAgICAvPlxuICAgICAgKSl9XG5cbiAgICAgIHsvKiBBbGwtZGF5IGV2ZW50IGJsb2NrcyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCB6LTEwIHAtMSBjb2wtc3Bhbi03IGNvbC1zdGFydC0yXCI+XG4gICAgICAgIHtwcm9jZXNzZWRBbGxEYXlFdmVudHMubWFwKChldmVudCwgaW5kZXgpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e2BhbGwtZGF5LWNvbnRhaW5lci0ke2V2ZW50LmlkfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZVwiXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBsZWZ0OiBgJHtldmVudC5sZWZ0fSVgLFxuICAgICAgICAgICAgICB3aWR0aDogYGNhbGMoJHtldmVudC53aWR0aH0lIC0gdmFyKC0tc3BhY2luZykgKiAyKWAsXG4gICAgICAgICAgICAgIHRvcDogYCR7ZXZlbnQudG9wfXB4YCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBgJHtldmVudC5oZWlnaHR9cHhgLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgZWxlbWVudElkPXtgYWxsLWRheS0ke2V2ZW50LmlkfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAga2V5PXtgYWxsLWRheS0ke2V2ZW50LmlkfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtZnVsbCB3LWZ1bGwgb3ZlcmZsb3ctY2xpcCB0ZXh0LXhzIGFic29sdXRlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IEFuaW1hdGVQcmVzZW5jZSwgbW90aW9uIH0gZnJvbSAnbW90aW9uL3JlYWN0J1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgY29uc3QgV2Vla0hlYWRlcjogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjdXJyZW50RGF0ZSxcbiAgICBzZWxlY3REYXRlLFxuICAgIG9wZW5FdmVudEZvcm0sXG4gICAgZmlyc3REYXlPZldlZWssXG4gICAgc3RpY2t5Vmlld0hlYWRlcixcbiAgICB2aWV3SGVhZGVyQ2xhc3NOYW1lLFxuICB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBHZXQgc3RhcnQgYW5kIGVuZCBvZiBjdXJyZW50IHdlZWsgYmFzZWQgb24gZmlyc3REYXlPZldlZWsgc2V0dGluZ1xuICBjb25zdCBzdGFydE9mV2VlayA9IGN1cnJlbnREYXRlLnN0YXJ0T2YoJ3dlZWsnKS5kYXkoZmlyc3REYXlPZldlZWspXG4gIC8vIElmIGN1cnJlbnQgZGF0ZSBpcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHdlZWssIG1vdmUgYmFjayBvbmUgd2Vla1xuICBjb25zdCBhZGp1c3RlZFN0YXJ0T2ZXZWVrID0gY3VycmVudERhdGUuaXNCZWZvcmUoc3RhcnRPZldlZWspXG4gICAgPyBzdGFydE9mV2Vlay5zdWJ0cmFjdCgxLCAnd2VlaycpXG4gICAgOiBzdGFydE9mV2Vla1xuXG4gIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBkYXlzIGZvciB0aGUgY3VycmVudCB3ZWVrXG4gIGNvbnN0IHdlZWtEYXlzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICB3ZWVrRGF5cy5wdXNoKGFkanVzdGVkU3RhcnRPZldlZWsuYWRkKGksICdkYXknKSlcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgLy8gY3NzIGdyaWQgaGVhZGVyIHdpdGggbGVmIGNvcm5lciBjZWxsIHNob3J0ZXIgdGhhbiB0aGUgcmVzdFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdncmlkIGdyaWQtY29scy1bYXV0b18xZnJfMWZyXzFmcl8xZnJfMWZyXzFmcl8xZnJdIGdyaWQtcm93cy0xJyxcbiAgICAgICAgc3RpY2t5Vmlld0hlYWRlciAmJiAnc3RpY2t5IHRvcC0wIHotMTAwJyxcbiAgICAgICAgdmlld0hlYWRlckNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIGRhdGEtdGVzdGlkPVwid2Vlay1oZWFkZXJcIlxuICAgID5cbiAgICAgIHsvKiBDb3JuZXIgY2VsbCB3aXRoIHdlZWsgbnVtYmVyICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0xIHctMTQgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlci14IGJvcmRlci1iIHAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQteHNcIj5XZWVrPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+e2N1cnJlbnREYXRlLndlZWsoKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBEYXkgaGVhZGVyIGNlbGxzICovfVxuICAgICAge3dlZWtEYXlzLm1hcCgoZGF5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBpc1RvZGF5ID0gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JylcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxBbmltYXRlUHJlc2VuY2Uga2V5PXtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9IG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgICAgICA8bW90aW9uLmRpdlxuICAgICAgICAgICAgICBrZXk9e2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgICAgaW5pdGlhbD17eyBvcGFjaXR5OiAwLCB5OiAtMTAgfX1cbiAgICAgICAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxLCB5OiAwIH19XG4gICAgICAgICAgICAgIGV4aXQ9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgICAgIHRyYW5zaXRpb249e3tcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMC4yNSxcbiAgICAgICAgICAgICAgICBlYXNlOiAnZWFzZUluT3V0JyxcbiAgICAgICAgICAgICAgICBkZWxheTogaW5kZXggKiAwLjA1LFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICdob3ZlcjpiZy1hY2NlbnQgZmxleC0xIGN1cnNvci1wb2ludGVyIHAtMSB0ZXh0LWNlbnRlciBzbTpwLTIgYm9yZGVyLXIgYm9yZGVyLWInLFxuICAgICAgICAgICAgICAgIGlzVG9kYXkgJiYgJ2JnLXByaW1hcnkvMTAgZm9udC1ib2xkJ1xuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0RGF0ZShkYXkpXG4gICAgICAgICAgICAgICAgb3BlbkV2ZW50Rm9ybShkYXkpXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vlay1kYXktaGVhZGVyLSR7ZGF5LmZvcm1hdCgnZGRkZCcpLnRvTG93ZXJDYXNlKCl9YH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj57ZGF5LmZvcm1hdCgnZGRkJyl9PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICAgJ214LWF1dG8gbXQtMSBmbGV4IGgtNSB3LTUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCB0ZXh0LXhzIHNtOmgtNyBzbTp3LTcgc206dGV4dC1zbScsXG4gICAgICAgICAgICAgICAgICBpc1RvZGF5ICYmICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJ1xuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ZGF5LmRhdGUoKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21vdGlvbi5kaXY+XG4gICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgIClcbiAgICAgIH0pfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcblxuaW50ZXJmYWNlIFByb2Nlc3NlZEV2ZW50IGV4dGVuZHMgQ2FsZW5kYXJFdmVudCB7XG4gIGxlZnQ6IG51bWJlciAvLyBMZWZ0IHBvc2l0aW9uIGluIHBlcmNlbnRhZ2VcbiAgd2lkdGg6IG51bWJlciAvLyBXaWR0aCBpbiBwZXJjZW50YWdlXG4gIHRvcDogbnVtYmVyIC8vIFRvcCBwb3NpdGlvbiBpbiBwZXJjZW50YWdlXG4gIGhlaWdodDogbnVtYmVyIC8vIEhlaWdodCBpbiBwZXJjZW50YWdlXG4gIHpJbmRleD86IG51bWJlciAvLyBaLWluZGV4IGZvciBsYXllcmluZyBvdmVybGFwcGluZyBldmVudHNcbn1cblxuaW50ZXJmYWNlIFVzZVByb2Nlc3NlZERheUV2ZW50c1Byb3BzIHtcbiAgZGF5OiBkYXlqcy5EYXlqcyAvLyBUaGUgc3BlY2lmaWMgZGF5IHRoaXMgY29sdW1uIHJlcHJlc2VudHNcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVByb2Nlc3NlZERheUV2ZW50cyA9ICh7IGRheSB9OiBVc2VQcm9jZXNzZWREYXlFdmVudHNQcm9wcykgPT4ge1xuICBjb25zdCB7IGdldEV2ZW50c0ZvckRhdGVSYW5nZSB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICBjb25zdCB0b2RheUV2ZW50cyA9IHVzZU1lbW88UHJvY2Vzc2VkRXZlbnRbXT4oKCkgPT4ge1xuICAgIGxldCBldmVudHNGb3JEYXkgPSBnZXRFdmVudHNGb3JEYXRlUmFuZ2UoXG4gICAgICBkYXkuc3RhcnRPZignZGF5JyksXG4gICAgICBkYXkuZW5kT2YoJ2RheScpXG4gICAgKVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwtZGF5IGV2ZW50cyBhbmQgc29ydCBieSBzdGFydCB0aW1lXG4gICAgZXZlbnRzRm9yRGF5ID0gZXZlbnRzRm9yRGF5XG4gICAgICAuZmlsdGVyKChlKSA9PiAhZS5hbGxEYXkpXG4gICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEuc3RhcnQuZGlmZihiLnN0YXJ0KSlcblxuICAgIGlmIChldmVudHNGb3JEYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICAvLyBTdGVwIDE6IEdyb3VwIGV2ZW50cyBpbnRvIGNsdXN0ZXJzIG9mIG92ZXJsYXBwaW5nIGV2ZW50c1xuICAgIGNvbnN0IGNsdXN0ZXJzOiBDYWxlbmRhckV2ZW50W11bXSA9IFtdXG4gICAgbGV0IGN1cnJlbnRDbHVzdGVyOiBDYWxlbmRhckV2ZW50W10gPSBbXVxuICAgIGxldCBsYXN0RXZlbnRFbmQ6IGRheWpzLkRheWpzIHwgbnVsbCA9IG51bGxcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50c0ZvckRheSkge1xuICAgICAgaWYgKGxhc3RFdmVudEVuZCAmJiBldmVudC5zdGFydC5pc1NhbWVPckFmdGVyKGxhc3RFdmVudEVuZCkpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRDbHVzdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjbHVzdGVycy5wdXNoKGN1cnJlbnRDbHVzdGVyKVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRDbHVzdGVyID0gW11cbiAgICAgIH1cbiAgICAgIGN1cnJlbnRDbHVzdGVyLnB1c2goZXZlbnQpXG4gICAgICBsYXN0RXZlbnRFbmQgPSBsYXN0RXZlbnRFbmRcbiAgICAgICAgPyBkYXlqcy5tYXgobGFzdEV2ZW50RW5kLCBldmVudC5lbmQpXG4gICAgICAgIDogZXZlbnQuZW5kXG4gICAgfVxuICAgIGlmIChjdXJyZW50Q2x1c3Rlci5sZW5ndGggPiAwKSB7XG4gICAgICBjbHVzdGVycy5wdXNoKGN1cnJlbnRDbHVzdGVyKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMjogRm9yIGVhY2ggY2x1c3RlciwgdXNlIGEgbW9yZSBpbnRlbGxpZ2VudCBjb2x1bW4gYXNzaWdubWVudFxuICAgIGNvbnN0IHByb2Nlc3NlZEV2ZW50czogUHJvY2Vzc2VkRXZlbnRbXSA9IFtdXG4gICAgZm9yIChjb25zdCBjbHVzdGVyIG9mIGNsdXN0ZXJzKSB7XG4gICAgICBpZiAoY2x1c3Rlci5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gU2luZ2xlIGV2ZW50IHRha2VzIGZ1bGwgd2lkdGhcbiAgICAgICAgY29uc3QgZXZlbnQgPSBjbHVzdGVyWzBdXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGV2ZW50LnN0YXJ0LmhvdXIoKSArIGV2ZW50LnN0YXJ0Lm1pbnV0ZSgpIC8gNjBcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBldmVudC5lbmQuaG91cigpICsgZXZlbnQuZW5kLm1pbnV0ZSgpIC8gNjBcbiAgICAgICAgaWYgKGVuZFRpbWUgPCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgZW5kcyBvbiB0aGUgbmV4dCBkYXksIHNldCBlbmQgdGltZSB0byAyNCBob3Vyc1xuICAgICAgICAgIGVuZFRpbWUgPSAyNFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsRHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lXG4gICAgICAgIGNvbnN0IHRvcCA9IChzdGFydFRpbWUgLyAyNCkgKiAxMDBcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gKHRvdGFsRHVyYXRpb24gLyAyNCkgKiAxMDBcbiAgICAgICAgcHJvY2Vzc2VkRXZlbnRzLnB1c2goeyAuLi5ldmVudCwgbGVmdDogMCwgd2lkdGg6IDEwMCwgdG9wLCBoZWlnaHQgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gTXVsdGlwbGUgZXZlbnRzIC0gdXNlIGxheWVyZWQgcG9zaXRpb25pbmcgYXBwcm9hY2hcbiAgICAgIC8vIFNvcnQgYnkgZHVyYXRpb24gKGxvbmdlc3QgZmlyc3QpLCB0aGVuIGJ5IHN0YXJ0IHRpbWVcbiAgICAgIGNvbnN0IHNvcnRlZEV2ZW50cyA9IFsuLi5jbHVzdGVyXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFEdXJhdGlvbiA9IGEuZW5kLmRpZmYoYS5zdGFydCwgJ21pbnV0ZScpXG4gICAgICAgIGNvbnN0IGJEdXJhdGlvbiA9IGIuZW5kLmRpZmYoYi5zdGFydCwgJ21pbnV0ZScpXG5cbiAgICAgICAgLy8gTG9uZ2VyIGV2ZW50cyBmaXJzdFxuICAgICAgICBpZiAoYUR1cmF0aW9uICE9PSBiRHVyYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gYkR1cmF0aW9uIC0gYUR1cmF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBzYW1lIGR1cmF0aW9uLCBlYXJsaWVyIHN0YXJ0IHRpbWUgZmlyc3RcbiAgICAgICAgcmV0dXJuIGEuc3RhcnQuZGlmZihiLnN0YXJ0KVxuICAgICAgfSlcblxuICAgICAgLy8gUHJvY2VzcyBldmVudHMgd2l0aCBsYXllcmVkIHBvc2l0aW9uaW5nXG4gICAgICBjb25zdCB0b3RhbEV2ZW50cyA9IHNvcnRlZEV2ZW50cy5sZW5ndGhcblxuICAgICAgLy8gQ2FsY3VsYXRlIGR5bmFtaWMgb2Zmc2V0IGJhc2VkIG9uIG51bWJlciBvZiBvdmVybGFwcGluZyBldmVudHNcbiAgICAgIC8vIEZld2VyIGV2ZW50cyA9IGxhcmdlciBpbmRpdmlkdWFsIG9mZnNldHMsIG1vcmUgZXZlbnRzID0gc21hbGxlciBvZmZzZXRzXG4gICAgICBsZXQgbWF4T2Zmc2V0OiBudW1iZXJcbiAgICAgIGlmICh0b3RhbEV2ZW50cyA9PT0gMikge1xuICAgICAgICBtYXhPZmZzZXQgPSAyNSAvLyAyNSUgb2Zmc2V0IGZvciAyIGV2ZW50c1xuICAgICAgfSBlbHNlIGlmICh0b3RhbEV2ZW50cyA9PT0gMykge1xuICAgICAgICBtYXhPZmZzZXQgPSA1MCAvLyA1MCUgdG90YWwgZm9yIDMgZXZlbnRzICgyNSUgZWFjaClcbiAgICAgIH0gZWxzZSBpZiAodG90YWxFdmVudHMgPT09IDQpIHtcbiAgICAgICAgbWF4T2Zmc2V0ID0gNjAgLy8gNjAlIHRvdGFsIGZvciA0IGV2ZW50cyAoMjAlIGVhY2gpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXhPZmZzZXQgPSA3MCAvLyA3MCUgdG90YWwgZm9yIDUrIGV2ZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvZmZzZXRQZXJFdmVudCA9IHRvdGFsRXZlbnRzID4gMSA/IG1heE9mZnNldCAvICh0b3RhbEV2ZW50cyAtIDEpIDogMFxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBldmVudCA9IHNvcnRlZEV2ZW50c1tpXVxuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBldmVudC5zdGFydC5ob3VyKCkgKyBldmVudC5zdGFydC5taW51dGUoKSAvIDYwXG4gICAgICAgIGxldCBlbmRUaW1lID0gZXZlbnQuZW5kLmhvdXIoKSArIGV2ZW50LmVuZC5taW51dGUoKSAvIDYwXG5cbiAgICAgICAgaWYgKGVuZFRpbWUgPCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgZW5kcyBvbiB0aGUgbmV4dCBkYXksIHNldCBlbmQgdGltZSB0byAyNCBob3Vyc1xuICAgICAgICAgIGVuZFRpbWUgPSAyNFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxEdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWVcbiAgICAgICAgY29uc3QgdG9wID0gKHN0YXJ0VGltZSAvIDI0KSAqIDEwMFxuICAgICAgICBjb25zdCBoZWlnaHQgPSAodG90YWxEdXJhdGlvbiAvIDI0KSAqIDEwMFxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbmluZyBiYXNlZCBvbiBsYXllciBhbmQgdG90YWwgZXZlbnRzXG4gICAgICAgIGxldCBsZWZ0OiBudW1iZXJcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXJcbiAgICAgICAgbGV0IHpJbmRleDogbnVtYmVyXG5cbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAvLyBGaXJzdCBldmVudCAobG9uZ2VzdCkgdGFrZXMgZnVsbCB3aWR0aCBhdCBib3R0b21cbiAgICAgICAgICBsZWZ0ID0gMFxuICAgICAgICAgIHdpZHRoID0gMTAwXG4gICAgICAgICAgekluZGV4ID0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN1YnNlcXVlbnQgZXZlbnRzIGFyZSBvZmZzZXQgZHluYW1pY2FsbHkgYmFzZWQgb24gdG90YWwgZXZlbnQgY291bnRcbiAgICAgICAgICBsZWZ0ID0gb2Zmc2V0UGVyRXZlbnQgKiBpXG4gICAgICAgICAgd2lkdGggPSAxMDAgLSBsZWZ0IC8vIFJlbWFpbmluZyB3aWR0aFxuICAgICAgICAgIHpJbmRleCA9IGkgKyAxIC8vIEhpZ2hlciB6LWluZGV4IGZvciBldmVudHMgb24gdG9wXG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzZWRFdmVudHMucHVzaCh7XG4gICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHpJbmRleCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvY2Vzc2VkRXZlbnRzXG4gIH0sIFtkYXksIGdldEV2ZW50c0ZvckRhdGVSYW5nZV0pXG5cbiAgcmV0dXJuIHRvZGF5RXZlbnRzXG59XG4iLAogICAgImltcG9ydCB7IHVzZVByb2Nlc3NlZERheUV2ZW50cyB9IGZyb20gJ0AvaG9va3MvdXNlUHJvY2Vzc2VkRGF5RXZlbnRzJ1xuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICcuLi9kcmFnZ2FibGUtZXZlbnQvZHJhZ2dhYmxlLWV2ZW50J1xuaW1wb3J0IHR5cGUgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuaW50ZXJmYWNlIERheUV2ZW50c0xheWVyUHJvcHMge1xuICBkYXk6IGRheWpzLkRheWpzIC8vIFRoZSBzcGVjaWZpYyBkYXkgdGhpcyBsYXllciByZXByZXNlbnRzXG4gICdkYXRhLXRlc3RpZCc/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IERheUV2ZW50c0xheWVyOiBSZWFjdC5GQzxEYXlFdmVudHNMYXllclByb3BzPiA9ICh7XG4gIGRheSxcbiAgJ2RhdGEtdGVzdGlkJzogZGF0YVRlc3RJZCxcbn0pID0+IHtcbiAgY29uc3QgdG9kYXlFdmVudHMgPSB1c2VQcm9jZXNzZWREYXlFdmVudHMoeyBkYXkgfSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdGVzdGlkPXtkYXRhVGVzdElkfVxuICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC0wIHotMzBcIlxuICAgID5cbiAgICAgIHt0b2RheUV2ZW50cy5tYXAoKGV2ZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB2ZXJ5VmVyeVVuaXF1ZUtleSA9IGBldmVudC0ke2V2ZW50LmlkfS0ke2luZGV4fS0ke2RheS5mb3JtYXQoXG4gICAgICAgICAgJ1lZWVktTU0tREQnXG4gICAgICAgICl9YFxuICAgICAgICBjb25zdCBpc1Nob3J0RXZlbnQgPSBldmVudC5lbmQuZGlmZihldmVudC5zdGFydCwgJ21pbnV0ZScpIDw9IDE1XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgY29udGFpbmVyLSR7dmVyeVZlcnlVbmlxdWVLZXl9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGxlZnQ6IGAke2V2ZW50LmxlZnR9JWAsXG4gICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygke2V2ZW50LndpZHRofSUgLSB2YXIoLS1zcGFjaW5nKSAqIDIpYCxcbiAgICAgICAgICAgICAgdG9wOiBgJHtldmVudC50b3B9JWAsXG4gICAgICAgICAgICAgIGhlaWdodDogYCR7ZXZlbnQuaGVpZ2h0fSVgLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgZWxlbWVudElkPXtgZHJhZ2dhYmxlLSR7dmVyeVZlcnlVbmlxdWVLZXl9YH1cbiAgICAgICAgICAgICAgZXZlbnQ9e2V2ZW50fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKCdwb2ludGVyLWV2ZW50cy1hdXRvIGFic29sdXRlJywge1xuICAgICAgICAgICAgICAgICdbJl9wXTp0ZXh0LVsxMHB4XSBbJl9wXTptdC0wJzogaXNTaG9ydEV2ZW50LFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIClcbiAgICAgIH0pfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRGF5RXZlbnRzTGF5ZXIgfSBmcm9tICcuLi9kYXktdmlldy9kYXktZXZlbnRzLWxheWVyJ1xuaW1wb3J0IHsgRHJvcHBhYmxlQ2VsbCB9IGZyb20gJy4uL2Ryb3BwYWJsZS1jZWxsL2Ryb3BwYWJsZS1jZWxsJ1xuXG5jb25zdCBob3VycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDI0IH0sIChfLCBpKSA9PiBpKS5tYXAoKGhvdXIpID0+XG4gIGRheWpzKCkuaG91cihob3VyKS5taW51dGUoMClcbilcblxuaW50ZXJmYWNlIFdlZWtEYXlDb2xQcm9wcyB7XG4gIGRheTogZGF5anMuRGF5anMgLy8gVGhlIHNwZWNpZmljIGRheSB0aGlzIGNvbHVtbiByZXByZXNlbnRzXG59XG5cbmV4cG9ydCBjb25zdCBXZWVrRGF5Q29sOiBSZWFjdC5GQzxXZWVrRGF5Q29sUHJvcHM+ID0gKHsgZGF5IH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXRlc3RpZD17YHdlZWstZGF5LWNvbC0ke2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgY2xhc3NOYW1lPVwiY29sLXNwYW4tMSByZWxhdGl2ZSBncmlkIGdyaWQtcm93cy0yNCBib3JkZXItclwiXG4gICAgPlxuICAgICAge2hvdXJzLm1hcCgodGltZSkgPT4ge1xuICAgICAgICBjb25zdCBob3VyID0gdGltZS5ob3VyKClcbiAgICAgICAgY29uc3QgY2VsbERhdGUgPSBkYXkuZm9ybWF0KCdZWVlZLU1NLUREJylcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAgICBrZXk9e2Ake2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfWB9XG4gICAgICAgICAgICBpZD17YHRpbWUtY2VsbC0ke2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfWB9XG4gICAgICAgICAgICB0eXBlPVwidGltZS1jZWxsXCJcbiAgICAgICAgICAgIGRhdGU9e2RheX1cbiAgICAgICAgICAgIGhvdXI9e2hvdXJ9XG4gICAgICAgICAgICBkYXRhLXRlc3RpZD17YHdlZWstdGltZS1jZWxsLSR7Y2VsbERhdGV9LSR7dGltZS5mb3JtYXQoJ0hIJyl9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdob3ZlcjpiZy1hY2NlbnQgcmVsYXRpdmUgei0yMCBoLVs2MHB4XSBjdXJzb3ItcG9pbnRlciBib3JkZXItYidcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKVxuICAgICAgfSl9XG5cbiAgICAgIHsvKiBFdmVudCBibG9ja3MgbGF5ZXIgKi99XG4gICAgICA8RGF5RXZlbnRzTGF5ZXJcbiAgICAgICAgZGF0YS10ZXN0aWQ9e2B3ZWVrLWRheS1ldmVudHMtJHtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9YH1cbiAgICAgICAgZGF5PXtkYXl9XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFdlZWtEYXlDb2wgfSBmcm9tICcuL3dlZWstZGF5LWNvbCdcblxuY29uc3QgaG91cnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaSkubWFwKChob3VyKSA9PlxuICBkYXlqcygpLmhvdXIoaG91cikubWludXRlKDApXG4pXG5cbmV4cG9ydCBjb25zdCBXZWVrVGltZUdyaWQ6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCBmaXJzdERheU9mV2VlayB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBHZXQgc3RhcnQgYW5kIGVuZCBvZiBjdXJyZW50IHdlZWsgYmFzZWQgb24gZmlyc3REYXlPZldlZWsgc2V0dGluZ1xuICBjb25zdCBzdGFydE9mV2VlayA9IGN1cnJlbnREYXRlLnN0YXJ0T2YoJ3dlZWsnKS5kYXkoZmlyc3REYXlPZldlZWspXG4gIC8vIElmIGN1cnJlbnQgZGF0ZSBpcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHdlZWssIG1vdmUgYmFjayBvbmUgd2Vla1xuICBjb25zdCBhZGp1c3RlZFN0YXJ0T2ZXZWVrID0gY3VycmVudERhdGUuaXNCZWZvcmUoc3RhcnRPZldlZWspXG4gICAgPyBzdGFydE9mV2Vlay5zdWJ0cmFjdCgxLCAnd2VlaycpXG4gICAgOiBzdGFydE9mV2Vla1xuXG4gIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBkYXlzIGZvciB0aGUgY3VycmVudCB3ZWVrXG4gIGNvbnN0IHdlZWtEYXlzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICB3ZWVrRGF5cy5wdXNoKGFkanVzdGVkU3RhcnRPZldlZWsuYWRkKGksICdkYXknKSlcbiAgfVxuXG4gIC8vIFNlcGFyYXRlIGFsbC1kYXkgZXZlbnRzIGZyb20gcmVndWxhciBldmVudHMgKGluY2x1ZGluZyBtdWx0aS1kYXkgZXZlbnRzKVxuXG4gIC8vIEZpbmQgaWYgY3VycmVudCBkYXkgaXMgaW4gdGhlIGRpc3BsYXllZCB3ZWVrXG4gIGNvbnN0IHRvZGF5SW5kZXggPSB3ZWVrRGF5cy5maW5kSW5kZXgoKGRheSkgPT4gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JykpXG4gIGNvbnN0IGlzQ3VycmVudFdlZWsgPSB0b2RheUluZGV4ICE9PSAtMVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS10ZXN0aWQ9XCJ3ZWVrLXRpbWUtZ3JpZFwiXG4gICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLWZ1bGwgZ3JpZCBncmlkLWNvbHMtW2F1dG9fcmVwZWF0KDcsMWZyKV0gZ3JpZC1yb3dzLVtyZXBlYXQoMjQsbWlubWF4KDYwcHgsIDFmcikpXVwiXG4gICAgPlxuICAgICAgey8qIFRpbWUgbGFiZWxzIGNvbHVtbiAtIGZpeGVkICovfVxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXRlc3RpZD1cIndlZWstdGltZS1sYWJlbHNcIlxuICAgICAgICBjbGFzc05hbWU9XCJ6LTEwIGNvbC1zcGFuLTEgdy0xNCBncmlkIGdyaWQtcm93cy0yNCBib3JkZXIteFwiXG4gICAgICA+XG4gICAgICAgIHtob3Vycy5tYXAoKHRpbWUpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e3RpbWUuZm9ybWF0KCdISDptbScpfVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B3ZWVrLXRpbWUtaG91ci0ke3RpbWUuZm9ybWF0KCdISCcpfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJoLVs2MHB4XSBib3JkZXItYiB0ZXh0LXJpZ2h0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgcHItMiB0ZXh0LXJpZ2h0IHRleHQtWzEwcHhdIHNtOnRleHQteHNcIj5cbiAgICAgICAgICAgICAge3RpbWUuZm9ybWF0KCdoIEEnKX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERheSBjb2x1bW5zIHdpdGggdGltZSBzbG90cyAqL31cbiAgICAgIHt3ZWVrRGF5cy5tYXAoKGRheSkgPT4gKFxuICAgICAgICA8V2Vla0RheUNvbCBrZXk9e2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX0gZGF5PXtkYXl9IC8+XG4gICAgICApKX1cblxuICAgICAgey8qIEN1cnJlbnQgdGltZSBpbmRpY2F0b3IgKi99XG4gICAgICB7aXNDdXJyZW50V2VlayAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIndlZWstY3VycmVudC10aW1lLWluZGljYXRvclwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSB6LTIwXCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgdG9wOiBgJHsoZGF5anMoKS5ob3VyKCkgKyBkYXlqcygpLm1pbnV0ZSgpIC8gNjApICogNjB9cHhgLFxuICAgICAgICAgICAgbGVmdDogYCR7dG9kYXlJbmRleCAqICgxMDAgLyA3KX0lYCxcbiAgICAgICAgICAgIHdpZHRoOiBgJHsxMDAgLyA3fSVgLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBib3JkZXItdCBib3JkZXItcmVkLTUwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCItbXQtMSBtbC0xIGgtMiB3LTIgcm91bmRlZC1mdWxsIGJnLXJlZC01MDBcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IFNjcm9sbEFyZWEgfSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgRnJhZ21lbnQgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IERyb3BwYWJsZUNlbGwgfSBmcm9tICcuLi9kcm9wcGFibGUtY2VsbC9kcm9wcGFibGUtY2VsbCdcbmltcG9ydCB7IERheUFsbERheVJvdyB9IGZyb20gJy4vZGF5LWFsbC1kYXktcm93J1xuaW1wb3J0IHsgRGF5RXZlbnRzTGF5ZXIgfSBmcm9tICcuL2RheS1ldmVudHMtbGF5ZXInXG5pbXBvcnQgeyBEYXlIZWFkZXIgfSBmcm9tICcuL2RheS1oZWFkZXInXG5pbXBvcnQgeyBEYXlUaW1lQ29sIH0gZnJvbSAnLi9kYXktdGltZS1jb2wnXG5cbmNvbnN0IERheVZpZXcgPSAoKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudERhdGUgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gSG91cnMgdG8gZGlzcGxheSAoYWxsIDI0IGhvdXJzIG9mIHRoZSBkYXkpXG4gIGNvbnN0IGhvdXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjQgfSwgKF8sIGkpID0+IGkpLm1hcCgoaG91cikgPT4ge1xuICAgIHJldHVybiBkYXlqcygpLmhvdXIoaG91cikubWludXRlKDApXG4gIH0pXG5cbiAgLy8gRm9yIG1vcmUgZ3JhbnVsYXIgdGltZSBzbG90cywgd2UnbGwgZGl2aWRlIGVhY2ggaG91ciBpbnRvIDE1LW1pbnV0ZSBzZWdtZW50c1xuICBjb25zdCB0aW1lU2VnbWVudHMgPSBbMCwgMTUsIDMwLCA0NV1cblxuICAvLyBHZXQgY3VycmVudCBkYXkncyBldmVudHMgLSB0aGlzIHdpbGwgcmVmcmVzaCBhdXRvbWF0aWNhbGx5IHdoZW4gc3RvcmUgdXBkYXRlc1xuICAvLyBiZWNhdXNlIGdldEV2ZW50c0ZvckRhdGUgaXMgYSBzZWxlY3RvciBmdW5jdGlvbiBmcm9tIHRoZSBzdG9yZSB0aGF0IHJ1bnMgd2hlbmV2ZXIgZXZlbnRzIGNoYW5nZVxuXG4gIGNvbnN0IGlzVG9kYXkgPSBjdXJyZW50RGF0ZS5pc1NhbWUoZGF5anMoKSwgJ2RheScpXG4gIGNvbnN0IGNlbGxEYXRlID0gY3VycmVudERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJylcblxuICByZXR1cm4gKFxuICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJkYXktdmlld1wiIGNsYXNzTmFtZT1cImZsZXggaC1mdWxsIGZsZXgtY29sXCI+XG4gICAgICB7LyogRGF5IGhlYWRlciAqL31cbiAgICAgIDxEYXlIZWFkZXIgLz5cblxuICAgICAgey8qIFRpbWUgZ3JpZCB3aXRob3V0IHNjcm9sbGJhciAqL31cbiAgICAgIDxTY3JvbGxBcmVhXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LXNjcm9sbC1hcmVhXCJcbiAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleC0xIG92ZXJmbG93LXktYXV0b1wiXG4gICAgICA+XG4gICAgICAgIHsvKiBBbGwtZGF5IGV2ZW50cyByb3cgKi99XG4gICAgICAgIDxEYXlBbGxEYXlSb3cgLz5cblxuICAgICAgICB7LyogU2V0IGEgZml4ZWQgaGVpZ2h0IGNvbnRhaW5lciB0aGF0IG1hdGNoZXMgZXhhY3RseSB0aGUgdG90YWwgaGVpZ2h0IG9mIGFsbCBob3VyIGJsb2NrcyAqL31cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LXRpbWUtZ3JpZFwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtOCBkaXZpZGUteCBib3JkZXIteFwiXG4gICAgICAgICAgc3R5bGU9e3sgaGVpZ2h0OiBgJHtob3Vycy5sZW5ndGggKiA2MH1weGAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHsvKiBUaW1lIGxhYmVscyBjb2x1bW4gKi99XG4gICAgICAgICAgPERheVRpbWVDb2wgY2xhc3NOYW1lPVwiY29sLXNwYW4tMiBoLWZ1bGwgbWQ6Y29sLXNwYW4tMVwiIC8+XG5cbiAgICAgICAgICB7LyogRGF5IGNvbHVtbiB3aXRoIGV2ZW50cyAqL31cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImRheS1ldmVudHMtY29sdW1uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGNvbC1zcGFuLTYgaC1mdWxsIG1kOmNvbC1zcGFuLTdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsvKiBCYWNrZ3JvdW5kIGdyaWQgZm9yIHRpbWUgc2xvdHMgLSBsb3dlc3QgbGF5ZXIgKi99XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LWJhY2tncm91bmQtZ3JpZFwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LTAgei0wXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2hvdXJzLm1hcCgoaG91ciwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBrZXk9e2BiZy0ke2N1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpfS0ke2hvdXIuZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgICAnSEgnXG4gICAgICAgICAgICAgICAgICApfWB9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLVs2MHB4XSBib3JkZXItYlwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgey8qIDE1LW1pbnV0ZSBtYXJrZXIgbGluZXMgKi99XG4gICAgICAgICAgICAgICAgICB7dGltZVNlZ21lbnRzLnNsaWNlKDEpLm1hcCgobWludXRlcykgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtgYmctJHtob3VyLmZvcm1hdCgnSEgnKX0tJHttaW51dGVzfWB9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyLWJvcmRlciBhYnNvbHV0ZSB3LWZ1bGwgYm9yZGVyLXQgYm9yZGVyLWRhc2hlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgdG9wOiBgJHtpbmRleCAqIDYwICsgbWludXRlc31weGAgfX1cbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBJbnRlcmFjdGl2ZSBsYXllciBmb3IgdGltZSBzbG90cyAtIG1pZGRsZSBsYXllciB3aXRoIG5vIGJvcmRlcnMgKi99XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LWludGVyYWN0aXZlLWxheWVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtYXV0byBhYnNvbHV0ZSBpbnNldC0wIHotMjBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7aG91cnMubWFwKCh0aW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG91ciA9IHRpbWUuaG91cigpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPEZyYWdtZW50IGtleT17YCR7Y2VsbERhdGV9LSR7dGltZS5mb3JtYXQoJ0hIJyl9YH0+XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9e2B0aW1lLWNlbGwtJHtjZWxsRGF0ZX0tJHt0aW1lLmZvcm1hdCgnSEgnKX0tMDBgfVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0aW1lLWNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGU9e2N1cnJlbnREYXRlfVxuICAgICAgICAgICAgICAgICAgICAgIGhvdXI9e2hvdXJ9XG4gICAgICAgICAgICAgICAgICAgICAgbWludXRlPXswfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oJ2hvdmVyOmJnLWFjY2VudCBoLVsxNXB4XSBjdXJzb3ItcG9pbnRlcicpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8RHJvcHBhYmxlQ2VsbFxuICAgICAgICAgICAgICAgICAgICAgIGlkPXtgdGltZS1jZWxsLSR7Y2VsbERhdGV9LSR7dGltZS5mb3JtYXQoJ0hIJyl9LTE1YH1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGltZS1jZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRlPXtjdXJyZW50RGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICBob3VyPXtob3VyfVxuICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZT17MTV9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6YmctYWNjZW50IGgtWzE1cHhdIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPERyb3BwYWJsZUNlbGxcbiAgICAgICAgICAgICAgICAgICAgICBpZD17YHRpbWUtY2VsbC0ke2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfS0zMGB9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRpbWUtY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0ZT17Y3VycmVudERhdGV9XG4gICAgICAgICAgICAgICAgICAgICAgaG91cj17aG91cn1cbiAgICAgICAgICAgICAgICAgICAgICBtaW51dGU9ezMwfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImhvdmVyOmJnLWFjY2VudCBoLVsxNXB4XSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9e2B0aW1lLWNlbGwtJHtjZWxsRGF0ZX0tJHt0aW1lLmZvcm1hdCgnSEgnKX0tNDVgfVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0aW1lLWNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGU9e2N1cnJlbnREYXRlfVxuICAgICAgICAgICAgICAgICAgICAgIGhvdXI9e2hvdXJ9XG4gICAgICAgICAgICAgICAgICAgICAgbWludXRlPXs0NX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJob3ZlcjpiZy1hY2NlbnQgaC1bMTVweF0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBFdmVudHMgbGF5ZXIgLSBtaWRkbGUtdG9wIGxheWVyICovfVxuICAgICAgICAgICAgPERheUV2ZW50c0xheWVyIGRheT17Y3VycmVudERhdGV9IC8+XG5cbiAgICAgICAgICAgIHsvKiBDdXJyZW50IHRpbWUgaW5kaWNhdG9yIC0gdG9wIGxheWVyICovfVxuICAgICAgICAgICAge2lzVG9kYXkgJiYgKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJkYXktY3VycmVudC10aW1lLWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMCBsZWZ0LTAgei00MCBib3JkZXItdCBib3JkZXItcmVkLTUwMFwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIHRvcDogYCR7KGRheWpzKCkuaG91cigpICsgZGF5anMoKS5taW51dGUoKSAvIDYwKSAqIDYwfXB4YCxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCItbXQtMSAtbWwtMSBoLTIgdy0yIHJvdW5kZWQtZnVsbCBiZy1yZWQtNTAwXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L1Njcm9sbEFyZWE+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgRGF5Vmlld1xuIiwKICAgICJpbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IERyYWdnYWJsZUV2ZW50IH0gZnJvbSAnLi4vZHJhZ2dhYmxlLWV2ZW50L2RyYWdnYWJsZS1ldmVudCdcbmltcG9ydCB7IERyb3BwYWJsZUNlbGwgfSBmcm9tICcuLi9kcm9wcGFibGUtY2VsbC9kcm9wcGFibGUtY2VsbCdcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCwgUHJvY2Vzc2VkQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcbmltcG9ydCB7IEVWRU5UX0JBUl9IRUlHSFQgfSBmcm9tICdAL2xpYi9jb25zdGFudHMnXG5cbmV4cG9ydCBjb25zdCBEYXlBbGxEYXlSb3cgPSAoKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudERhdGUsIGdldEV2ZW50c0ZvckRhdGUgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gR2V0IGN1cnJlbnQgZGF5J3MgZXZlbnRzIC0gdGhpcyB3aWxsIHJlZnJlc2ggYXV0b21hdGljYWxseSB3aGVuIHN0b3JlIHVwZGF0ZXNcbiAgLy8gYmVjYXVzZSBnZXRFdmVudHNGb3JEYXRlIGlzIGEgc2VsZWN0b3IgZnVuY3Rpb24gZnJvbSB0aGUgc3RvcmUgdGhhdCBydW5zIHdoZW5ldmVyIGV2ZW50cyBjaGFuZ2VcbiAgY29uc3QgZGF5RXZlbnRzID0gZ2V0RXZlbnRzRm9yRGF0ZShjdXJyZW50RGF0ZSlcblxuICAvLyBTZXBhcmF0ZSBhbGwtZGF5IGV2ZW50cyBmcm9tIHJlZ3VsYXIgZXZlbnRzXG4gIGNvbnN0IHsgYWxsRGF5RXZlbnRzIH0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAvLyBPbmx5IGV2ZW50cyBleHBsaWNpdGx5IG1hcmtlZCBhcyBhbGxEYXkgc2hvdWxkIGJlIGluIHRoZSBhbGwtZGF5IHNlY3Rpb25cbiAgICBjb25zdCBhbGxEYXlFdnRzID0gZGF5RXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmFsbERheSlcblxuICAgIC8vIFJlZ3VsYXIgZXZlbnRzIChpbmNsdWRpbmcgbXVsdGktZGF5IGV2ZW50cylcbiAgICBjb25zdCByZWd1bGFyRXZ0cyA9IGRheUV2ZW50cy5maWx0ZXIoKGV2ZW50KSA9PiAhZXZlbnQuYWxsRGF5KVxuXG4gICAgcmV0dXJuIHsgYWxsRGF5RXZlbnRzOiBhbGxEYXlFdnRzLCByZWd1bGFyRXZlbnRzOiByZWd1bGFyRXZ0cyB9XG4gIH0sIFtkYXlFdmVudHNdKSAvLyBPbmx5IGRlcGVuZCBvbiB0aGUgZGF5RXZlbnRzIHdoaWNoIGlzIHJlZnJlc2hlZCBhdXRvbWF0aWNhbGx5XG5cbiAgLy8gUHJvY2VzcyBhbGwtZGF5IGV2ZW50cyBmb3IgZGlzcGxheVxuICBjb25zdCB7IHByb2Nlc3NlZEFsbERheUV2ZW50cyB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gU29ydCBhbGwtZGF5IGV2ZW50cyAoaWYgbmVlZGVkKVxuICAgIGNvbnN0IHNvcnRlZEV2ZW50cyA9IFsuLi5hbGxEYXlFdmVudHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIHJldHVybiBhLnN0YXJ0LmRpZmYoYi5zdGFydClcbiAgICB9KVxuXG4gICAgLy8gVHJhY2sgcG9zaXRpb25zIGluIHJvd3MgZm9yIHN0YWNraW5nXG4gICAgY29uc3Qgcm93czogeyBldmVudDogQ2FsZW5kYXJFdmVudCB9W11bXSA9IFtdXG4gICAgY29uc3QgcHJvY2Vzc2VkRXZlbnRzOiBQcm9jZXNzZWRDYWxlbmRhckV2ZW50W10gPSBbXVxuXG4gICAgc29ydGVkRXZlbnRzLmZvckVhY2goKGV2ZW50LCByb3dJbmRleCkgPT4ge1xuICAgICAgbGV0IHBsYWNlZCA9IGZhbHNlXG5cbiAgICAgIHdoaWxlICghcGxhY2VkKSB7XG4gICAgICAgIGlmIChyb3dJbmRleCA+PSByb3dzLmxlbmd0aCkge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyByb3cgaWYgbmVlZGVkXG4gICAgICAgICAgcm93cy5wdXNoKFtdKVxuICAgICAgICAgIHBsYWNlZCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJbiBkYXkgdmlldywgd2UgY2FuIHBsYWNlIG9uZSBldmVudCBwZXIgcm93IGFzIHRoZXkgZG9uJ3Qgb3ZlcmxhcCBob3Jpem9udGFsbHlcbiAgICAgICAgICAvLyBUaGlzIGlzIHNpbXBsZXIgdGhhbiB3ZWVrIHZpZXcgd2hlcmUgd2UgbmVlZGVkIHRvIGNoZWNrIGZvciBvdmVybGFwc1xuICAgICAgICAgIHBsYWNlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgZXZlbnQgdG8gdGhlIHJvd1xuICAgICAgcm93c1tyb3dJbmRleF0ucHVzaCh7IGV2ZW50IH0pXG5cbiAgICAgIC8vIEFkZCBwcm9jZXNzZWQgZXZlbnQgd2l0aCBjb3JyZWN0IHBvc2l0aW9uaW5nXG4gICAgICBwcm9jZXNzZWRFdmVudHMucHVzaCh7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICB0b3A6IHJvd0luZGV4ICogRVZFTlRfQkFSX0hFSUdIVCxcbiAgICAgICAgaGVpZ2h0OiBFVkVOVF9CQVJfSEVJR0hULFxuICAgICAgICBhbGxEYXk6IHRydWUsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvY2Vzc2VkQWxsRGF5RXZlbnRzOiBwcm9jZXNzZWRFdmVudHMsXG4gICAgICBhbGxEYXlSb3dzQ291bnQ6IE1hdGgubWF4KDEsIHJvd3MubGVuZ3RoKSwgLy8gQXQgbGVhc3QgMSByb3csIGV2ZW4gaWYgZW1wdHlcbiAgICB9XG4gIH0sIFthbGxEYXlFdmVudHNdKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS10ZXN0aWQ9XCJkYXktYWxsLWRheS1yb3dcIlxuICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtOCBib3JkZXItYiBib3JkZXIteFwiXG4gICAgPlxuICAgICAgey8qIExlZnQgbGFiZWwgZm9yIGFsbC1kYXkgZXZlbnRzICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0yIGZsZXggc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGJvcmRlci1yIHByLTIgbWQ6Y29sLXNwYW4tMVwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1bMTBweF0gd2hpdGVzcGFjZS1ub3dyYXAgc206dGV4dC14c1wiPlxuICAgICAgICAgIEFsbC1kYXlcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBBbGwtZGF5IGV2ZW50cyBjb250YWluZXIgd2l0aCBkeW5hbWljIGhlaWdodCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgY29sLXNwYW4tNiBtZDpjb2wtc3Bhbi03IFwiPlxuICAgICAgICA8RHJvcHBhYmxlQ2VsbFxuICAgICAgICAgIGlkPXtgYWxsLWRheS0ke2N1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgdHlwZT1cImRheS1jZWxsXCJcbiAgICAgICAgICBkYXRlPXtjdXJyZW50RGF0ZX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJob3ZlcjpiZy1hY2NlbnQgdy1mdWxsIGN1cnNvci1wb2ludGVyIG1pbi1oLTEwIGZsZXggZmxleC1jb2xcIlxuICAgICAgICA+XG4gICAgICAgICAge3Byb2Nlc3NlZEFsbERheUV2ZW50cy5tYXAoKGV2ZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGtleT17YGFsbC1kYXktJHtldmVudC5pZH0tJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGhlaWdodDogRVZFTlRfQkFSX0hFSUdIVCArICdweCcgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxEcmFnZ2FibGVFdmVudFxuICAgICAgICAgICAgICAgICAgZWxlbWVudElkPXtgYWxsLWRheS0ke2V2ZW50LmlkfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgICAgICBldmVudD17ZXZlbnR9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvdmVyZmxvdy1jbGlwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgd2lkdGg6IGBjYWxjKDEwMCUgLSB2YXIoLS1zcGFjaW5nKSAqIDIpYCB9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pfVxuICAgICAgICA8L0Ryb3BwYWJsZUNlbGw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5cbmV4cG9ydCBjb25zdCBEYXlIZWFkZXIgPSAoKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudERhdGUsIHN0aWNreVZpZXdIZWFkZXIsIHZpZXdIZWFkZXJDbGFzc05hbWUgfSA9XG4gICAgdXNlQ2FsZW5kYXJDb250ZXh0KClcbiAgY29uc3QgaXNUb2RheSA9IGN1cnJlbnREYXRlLmlzU2FtZShkYXlqcygpLCAnZGF5JylcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LWhlYWRlclwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWIgcC0yIGJvcmRlci14JyxcbiAgICAgICAgc3RpY2t5Vmlld0hlYWRlciAmJiAnc3RpY2t5IHRvcC0wIHotMTAwJyxcbiAgICAgICAgdmlld0hlYWRlckNsYXNzTmFtZVxuICAgICAgKX1cbiAgICA+XG4gICAgICA8QW5pbWF0ZVByZXNlbmNlIG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgIDxtb3Rpb24uZGl2XG4gICAgICAgICAga2V5PXtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICBpbml0aWFsPXt7IG9wYWNpdHk6IDAsIHk6IC0xMCB9fVxuICAgICAgICAgIGFuaW1hdGU9e3sgb3BhY2l0eTogMSwgeTogMCB9fVxuICAgICAgICAgIGV4aXQ9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgdHJhbnNpdGlvbj17eyBkdXJhdGlvbjogMC4yNSwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LXNlbWlib2xkIHNtOnRleHQteGwnLFxuICAgICAgICAgICAgaXNUb2RheSAmJiAndGV4dC1wcmltYXJ5J1xuICAgICAgICAgICl9XG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ4czppbmxpbmUgaGlkZGVuXCI+XG4gICAgICAgICAgICB7Y3VycmVudERhdGUuZm9ybWF0KCdkZGRkLCAnKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2N1cnJlbnREYXRlLmZvcm1hdCgnTU1NTSBELCBZWVlZJyl9XG4gICAgICAgICAge2lzVG9kYXkgJiYgKFxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBtbC0yIHJvdW5kZWQtZnVsbCBweC0xIHB5LTAuNSB0ZXh0LXhzIHNtOnB4LTIgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICBUb2RheVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgIDwvQW5pbWF0ZVByZXNlbmNlPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5cbi8vIEhvdXJzIHRvIGRpc3BsYXkgKGFsbCAyNCBob3VycyBvZiB0aGUgZGF5KVxuY29uc3QgaG91cnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaSkubWFwKChob3VyKSA9PiB7XG4gIHJldHVybiBkYXlqcygpLmhvdXIoaG91cikubWludXRlKDApXG59KVxuXG5pbnRlcmZhY2UgRGF5VGltZUNvbFByb3BzIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBEYXlUaW1lQ29sOiBSZWFjdC5GQzxEYXlUaW1lQ29sUHJvcHM+ID0gKHsgY2xhc3NOYW1lIH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXRlc3RpZD1cImRheS10aW1lLWNvbFwiXG4gICAgICBjbGFzc05hbWU9e2Bjb2wtc3Bhbi0yIGgtZnVsbCBtZDpjb2wtc3Bhbi0xICR7Y2xhc3NOYW1lfWB9XG4gICAgPlxuICAgICAge2hvdXJzLm1hcCgodGltZSkgPT4gKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAga2V5PXt0aW1lLmZvcm1hdCgnSEg6bW0nKX1cbiAgICAgICAgICBkYXRhLXRlc3RpZD17YGRheS10aW1lLWhvdXItJHt0aW1lLmZvcm1hdCgnSEgnKX1gfVxuICAgICAgICAgIGNsYXNzTmFtZT1cImgtWzYwcHhdIGJvcmRlci1iIHRleHQtcmlnaHRcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHByLTIgdGV4dC1yaWdodCB0ZXh0LVsxMHB4XSBzbTp0ZXh0LXhzXCI+XG4gICAgICAgICAgICB7dGltZS5mb3JtYXQoJ2ggQScpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHtcbiAgQnV0dG9uLFxuICBDaGVja2JveCxcbiAgRGF0ZVBpY2tlcixcbiAgRGlhbG9nLFxuICBEaWFsb2dDb250ZW50LFxuICBEaWFsb2dEZXNjcmlwdGlvbixcbiAgRGlhbG9nRm9vdGVyLFxuICBEaWFsb2dIZWFkZXIsXG4gIERpYWxvZ1RpdGxlLFxuICBJbnB1dCxcbiAgTGFiZWwsXG4gIFRvb2x0aXAsXG4gIFRvb2x0aXBDb250ZW50LFxuICBUb29sdGlwUHJvdmlkZXIsXG4gIFRvb2x0aXBUcmlnZ2VyLFxufSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuXG5jb25zdCBjb2xvck9wdGlvbnMgPSBbXG4gIHsgdmFsdWU6ICdiZy1ibHVlLTEwMCB0ZXh0LWJsdWUtODAwJywgbGFiZWw6ICdCbHVlJyB9LFxuICB7IHZhbHVlOiAnYmctZ3JlZW4tMTAwIHRleHQtZ3JlZW4tODAwJywgbGFiZWw6ICdHcmVlbicgfSxcbiAgeyB2YWx1ZTogJ2JnLXB1cnBsZS0xMDAgdGV4dC1wdXJwbGUtODAwJywgbGFiZWw6ICdQdXJwbGUnIH0sXG4gIHsgdmFsdWU6ICdiZy1yZWQtMTAwIHRleHQtcmVkLTgwMCcsIGxhYmVsOiAnUmVkJyB9LFxuICB7IHZhbHVlOiAnYmcteWVsbG93LTEwMCB0ZXh0LXllbGxvdy04MDAnLCBsYWJlbDogJ1llbGxvdycgfSxcbiAgeyB2YWx1ZTogJ2JnLXBpbmstMTAwIHRleHQtcGluay04MDAnLCBsYWJlbDogJ1BpbmsnIH0sXG4gIHsgdmFsdWU6ICdiZy1pbmRpZ28tMTAwIHRleHQtaW5kaWdvLTgwMCcsIGxhYmVsOiAnSW5kaWdvJyB9LFxuICB7IHZhbHVlOiAnYmctYW1iZXItMTAwIHRleHQtYW1iZXItODAwJywgbGFiZWw6ICdBbWJlcicgfSxcbiAgeyB2YWx1ZTogJ2JnLWVtZXJhbGQtMTAwIHRleHQtZW1lcmFsZC04MDAnLCBsYWJlbDogJ0VtZXJhbGQnIH0sXG4gIHsgdmFsdWU6ICdiZy1za3ktMTAwIHRleHQtc2t5LTgwMCcsIGxhYmVsOiAnU2t5JyB9LFxuICB7IHZhbHVlOiAnYmctdmlvbGV0LTEwMCB0ZXh0LXZpb2xldC04MDAnLCBsYWJlbDogJ1Zpb2xldCcgfSxcbiAgeyB2YWx1ZTogJ2JnLXJvc2UtMTAwIHRleHQtcm9zZS04MDAnLCBsYWJlbDogJ1Jvc2UnIH0sXG4gIHsgdmFsdWU6ICdiZy10ZWFsLTEwMCB0ZXh0LXRlYWwtODAwJywgbGFiZWw6ICdUZWFsJyB9LFxuICB7IHZhbHVlOiAnYmctb3JhbmdlLTEwMCB0ZXh0LW9yYW5nZS04MDAnLCBsYWJlbDogJ09yYW5nZScgfSxcbl1cblxuaW50ZXJmYWNlIEV2ZW50Rm9ybVByb3BzIHtcbiAgc2VsZWN0ZWRFdmVudD86IENhbGVuZGFyRXZlbnQgfCBudWxsXG4gIHNlbGVjdGVkRGF0ZT86IGRheWpzLkRheWpzIHwgbnVsbFxuICBvbkFkZD86IChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gdm9pZFxuICBvblVwZGF0ZT86IChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gdm9pZFxuICBvbkRlbGV0ZT86IChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gdm9pZFxuICBvbkNsb3NlOiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBjb25zdCBFdmVudEZvcm06IFJlYWN0LkZDPEV2ZW50Rm9ybVByb3BzPiA9ICh7XG4gIHNlbGVjdGVkRXZlbnQsXG4gIHNlbGVjdGVkRGF0ZSxcbiAgb25DbG9zZSxcbiAgb25VcGRhdGUsXG4gIG9uRGVsZXRlLFxuICBvbkFkZCxcbn0pID0+IHtcbiAgY29uc3Qgc3RhcnQgPSBzZWxlY3RlZEV2ZW50Py5vcmlnaW5hbFN0YXJ0ID8/IHNlbGVjdGVkRXZlbnQ/LnN0YXJ0XG4gIGNvbnN0IGVuZCA9IHNlbGVjdGVkRXZlbnQ/Lm9yaWdpbmFsRW5kID8/IHNlbGVjdGVkRXZlbnQ/LmVuZFxuXG4gIC8vIEZvcm0gZGVmYXVsdCB2YWx1ZXNcbiAgY29uc3QgZGVmYXVsdFN0YXJ0RGF0ZSA9IHNlbGVjdGVkRGF0ZT8udG9EYXRlKCkgfHwgbmV3IERhdGUoKVxuICBjb25zdCBkZWZhdWx0RW5kRGF0ZSA9XG4gICAgc2VsZWN0ZWREYXRlPy5hZGQoMSwgJ2hvdXInKS50b0RhdGUoKSB8fCBkYXlqcygpLmFkZCgxLCAnaG91cicpLnRvRGF0ZSgpXG5cbiAgLy8gRm9ybSBzdGF0ZVxuICBjb25zdCBbc3RhcnREYXRlLCBzZXRTdGFydERhdGVdID0gdXNlU3RhdGUoXG4gICAgc3RhcnQ/LnRvRGF0ZSgpIHx8IGRlZmF1bHRTdGFydERhdGVcbiAgKVxuICBjb25zdCBbZW5kRGF0ZSwgc2V0RW5kRGF0ZV0gPSB1c2VTdGF0ZShlbmQ/LnRvRGF0ZSgpIHx8IGRlZmF1bHRFbmREYXRlKVxuICBjb25zdCBbaXNBbGxEYXksIHNldElzQWxsRGF5XSA9IHVzZVN0YXRlKHNlbGVjdGVkRXZlbnQ/LmFsbERheSB8fCBmYWxzZSlcbiAgY29uc3QgW3NlbGVjdGVkQ29sb3IsIHNldFNlbGVjdGVkQ29sb3JdID0gdXNlU3RhdGUoXG4gICAgc2VsZWN0ZWRFdmVudD8uY29sb3IgfHwgY29sb3JPcHRpb25zWzBdLnZhbHVlXG4gIClcblxuICAvLyBUaW1lIHN0YXRlXG4gIGNvbnN0IFtzdGFydFRpbWUsIHNldFN0YXJ0VGltZV0gPSB1c2VTdGF0ZShcbiAgICBzZWxlY3RlZEV2ZW50XG4gICAgICA/IHNlbGVjdGVkRXZlbnQuc3RhcnQuZm9ybWF0KCdISDptbScpXG4gICAgICA6IGRheWpzKGRlZmF1bHRTdGFydERhdGUpLmZvcm1hdCgnSEg6bW0nKVxuICApXG4gIGNvbnN0IFtlbmRUaW1lLCBzZXRFbmRUaW1lXSA9IHVzZVN0YXRlKFxuICAgIHNlbGVjdGVkRXZlbnRcbiAgICAgID8gc2VsZWN0ZWRFdmVudC5lbmQuZm9ybWF0KCdISDptbScpXG4gICAgICA6IGRheWpzKGRlZmF1bHRFbmREYXRlKS5mb3JtYXQoJ0hIOm1tJylcbiAgKVxuXG4gIC8vIEluaXRpYWxpemUgZm9ybSB2YWx1ZXMgZnJvbSBzZWxlY3RlZCBldmVudCBvciBkZWZhdWx0c1xuICBjb25zdCBbZm9ybVZhbHVlcywgc2V0Rm9ybVZhbHVlc10gPSB1c2VTdGF0ZSh7XG4gICAgdGl0bGU6IHNlbGVjdGVkRXZlbnQ/LnRpdGxlIHx8ICcnLFxuICAgIGRlc2NyaXB0aW9uOiBzZWxlY3RlZEV2ZW50Py5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICBsb2NhdGlvbjogc2VsZWN0ZWRFdmVudD8ubG9jYXRpb24gfHwgJycsXG4gIH0pXG5cbiAgLy8gQ3JlYXRlIHdyYXBwZXIgZnVuY3Rpb25zIHRvIGZpeCBUeXBlU2NyaXB0IGVycm9ycyB3aXRoIERhdGVQaWNrZXJcbiAgY29uc3QgaGFuZGxlU3RhcnREYXRlQ2hhbmdlID0gKGRhdGU6IERhdGUgfCB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoZGF0ZSkgc2V0U3RhcnREYXRlKGRhdGUpXG4gIH1cblxuICBjb25zdCBoYW5kbGVFbmREYXRlQ2hhbmdlID0gKGRhdGU6IERhdGUgfCB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoZGF0ZSkgc2V0RW5kRGF0ZShkYXRlKVxuICB9XG5cbiAgLy8gVXBkYXRlIGZvcm0gdmFsdWVzIHdoZW4gaW5wdXQgY2hhbmdlc1xuICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9IChcbiAgICBlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgKSA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCB2YWx1ZSB9ID0gZS50YXJnZXRcbiAgICBzZXRGb3JtVmFsdWVzKChwcmV2KSA9PiAoeyAuLi5wcmV2LCBbbmFtZV06IHZhbHVlIH0pKVxuICB9XG5cbiAgLy8gSGFuZGxlIHRpbWUgY2hhbmdlc1xuICBjb25zdCBoYW5kbGVUaW1lQ2hhbmdlID0gKFxuICAgIGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+LFxuICAgIGlzU3RhcnQ6IGJvb2xlYW5cbiAgKSA9PiB7XG4gICAgY29uc3QgdGltZVZhbHVlID0gZS50YXJnZXQudmFsdWVcbiAgICBpZiAoaXNTdGFydCkge1xuICAgICAgc2V0U3RhcnRUaW1lKHRpbWVWYWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RW5kVGltZSh0aW1lVmFsdWUpXG4gICAgfVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBSZXNldCBlbmQgdGltZSB3aGVuIGFsbCBkYXkgaXMgdG9nZ2xlZCB0byBvblxuICAgIGlmIChpc0FsbERheSkge1xuICAgICAgc2V0RW5kVGltZSgnMjM6NTknKVxuICAgIH1cbiAgfSwgW2lzQWxsRGF5XSlcblxuICAvLyBIYW5kbGUgZm9ybSBzdWJtaXNzaW9uXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IChlOiBSZWFjdC5Gb3JtRXZlbnQpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcblxuICAgIC8vIENyZWF0ZSBmdWxsIGRhdGV0aW1lIG9iamVjdHMgYnkgY29tYmluaW5nIGRhdGUgYW5kIHRpbWVcbiAgICBjb25zdCBbc3RhcnRIb3Vycywgc3RhcnRNaW51dGVzXSA9IHN0YXJ0VGltZS5zcGxpdCgnOicpLm1hcChOdW1iZXIpXG4gICAgY29uc3QgW2VuZEhvdXJzLCBlbmRNaW51dGVzXSA9IGVuZFRpbWUuc3BsaXQoJzonKS5tYXAoTnVtYmVyKVxuXG4gICAgbGV0IHN0YXJ0RGF0ZVRpbWUgPSBkYXlqcyhzdGFydERhdGUpLmhvdXIoc3RhcnRIb3VycykubWludXRlKHN0YXJ0TWludXRlcylcblxuICAgIGxldCBlbmREYXRlVGltZSA9IGRheWpzKGVuZERhdGUpLmhvdXIoZW5kSG91cnMpLm1pbnV0ZShlbmRNaW51dGVzKVxuXG4gICAgLy8gRm9yIGFsbC1kYXkgZXZlbnRzLCBzZXQgYXBwcm9wcmlhdGUgdGltZXNcbiAgICBpZiAoaXNBbGxEYXkpIHtcbiAgICAgIHN0YXJ0RGF0ZVRpbWUgPSBzdGFydERhdGVUaW1lLmhvdXIoMCkubWludXRlKDApXG4gICAgICBlbmREYXRlVGltZSA9IGVuZERhdGVUaW1lLmhvdXIoMjMpLm1pbnV0ZSg1OSlcbiAgICB9XG5cbiAgICBjb25zdCBldmVudERhdGE6IENhbGVuZGFyRXZlbnQgPSB7XG4gICAgICBpZDogc2VsZWN0ZWRFdmVudD8uaWQgfHwgZGF5anMoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJyksXG4gICAgICB0aXRsZTogZm9ybVZhbHVlcy50aXRsZSxcbiAgICAgIHN0YXJ0OiBzdGFydERhdGVUaW1lLFxuICAgICAgZW5kOiBlbmREYXRlVGltZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBmb3JtVmFsdWVzLmRlc2NyaXB0aW9uLFxuICAgICAgbG9jYXRpb246IGZvcm1WYWx1ZXMubG9jYXRpb24sXG4gICAgICBhbGxEYXk6IGlzQWxsRGF5LFxuICAgICAgY29sb3I6IHNlbGVjdGVkQ29sb3IsXG4gICAgfVxuXG4gICAgaWYgKHNlbGVjdGVkRXZlbnQuaWQpIHtcbiAgICAgIG9uVXBkYXRlPy4oZXZlbnREYXRhKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbkFkZD8uKGV2ZW50RGF0YSlcbiAgICB9XG5cbiAgICBvbkNsb3NlKClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZSA9ICgpID0+IHtcbiAgICBpZiAoc2VsZWN0ZWRFdmVudC5pZCkge1xuICAgICAgb25EZWxldGU/LihzZWxlY3RlZEV2ZW50KVxuICAgICAgb25DbG9zZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgZW5kIGRhdGUgaXMgbm90IGJlZm9yZSBzdGFydCBkYXRlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRheWpzKHN0YXJ0RGF0ZSkuaXNBZnRlcihkYXlqcyhlbmREYXRlKSkpIHtcbiAgICAgIHNldEVuZERhdGUoc3RhcnREYXRlKVxuICAgIH1cbiAgfSwgW3N0YXJ0RGF0ZSwgZW5kRGF0ZV0pXG5cbiAgcmV0dXJuIChcbiAgICA8RGlhbG9nIG9wZW49e3RydWV9IG9uT3BlbkNoYW5nZT17b25DbG9zZX0+XG4gICAgICA8RGlhbG9nQ29udGVudCBjbGFzc05hbWU9XCJ3LVs5MHZ3XSBtYXgtdy1bNTAwcHhdIHAtNCBzbTpwLTZcIj5cbiAgICAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAgPERpYWxvZ0hlYWRlciBjbGFzc05hbWU9XCJtYi0yIHNtOm1iLTRcIj5cbiAgICAgICAgICAgIDxEaWFsb2dUaXRsZSBjbGFzc05hbWU9XCJ0ZXh0LWJhc2Ugc206dGV4dC1sZ1wiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRFdmVudC5pZCA/ICdFZGl0IEV2ZW50JyA6ICdDcmVhdGUgRXZlbnQnfVxuICAgICAgICAgICAgPC9EaWFsb2dUaXRsZT5cbiAgICAgICAgICAgIDxEaWFsb2dEZXNjcmlwdGlvbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkRXZlbnQuaWRcbiAgICAgICAgICAgICAgICA/ICdFZGl0IHlvdXIgZXZlbnQgZGV0YWlscydcbiAgICAgICAgICAgICAgICA6ICdBZGQgYSBuZXcgZXZlbnQgdG8geW91ciBjYWxlbmRhcid9XG4gICAgICAgICAgICA8L0RpYWxvZ0Rlc2NyaXB0aW9uPlxuICAgICAgICAgIDwvRGlhbG9nSGVhZGVyPlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIHB5LTIgc206Z2FwLTQgc206cHktNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxMYWJlbCBodG1sRm9yPVwidGl0bGVcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgICBUaXRsZVxuICAgICAgICAgICAgICA8L0xhYmVsPlxuICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtVmFsdWVzLnRpdGxlfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkV2ZW50IHRpdGxlXCJcbiAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCB0ZXh0LXNtIHNtOmgtOVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTJcIj5cbiAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgaWQ9XCJhbGxEYXlcIlxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2lzQWxsRGF5fVxuICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+IHNldElzQWxsRGF5KGNoZWNrZWQgPT09IHRydWUpfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cImFsbERheVwiIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgIEFsbCBkYXlcbiAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTIgc206Z2FwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8TGFiZWwgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+U3RhcnQgRGF0ZTwvTGFiZWw+XG4gICAgICAgICAgICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgIGRhdGU9e3N0YXJ0RGF0ZX1cbiAgICAgICAgICAgICAgICAgIHNldERhdGU9e2hhbmRsZVN0YXJ0RGF0ZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTFcIlxuICAgICAgICAgICAgICAgICAgY2xvc2VPblNlbGVjdFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxMYWJlbCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5FbmQgRGF0ZTwvTGFiZWw+XG4gICAgICAgICAgICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgIGRhdGU9e2VuZERhdGV9XG4gICAgICAgICAgICAgICAgICBzZXREYXRlPXtoYW5kbGVFbmREYXRlQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMVwiXG4gICAgICAgICAgICAgICAgICBjbG9zZU9uU2VsZWN0XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgeyFpc0FsbERheSAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMiBnYXAtMiBzbTpnYXAtNFwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cInN0YXJ0LXRpbWVcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgU3RhcnQgVGltZVxuICAgICAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZD1cInN0YXJ0LXRpbWVcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGltZVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzdGFydFRpbWV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gaGFuZGxlVGltZUNoYW5nZShlLCB0cnVlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMSBoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPExhYmVsIGh0bWxGb3I9XCJlbmQtdGltZVwiIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICBFbmQgVGltZVxuICAgICAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZD1cImVuZC10aW1lXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17ZW5kVGltZX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBoYW5kbGVUaW1lQ2hhbmdlKGUsIGZhbHNlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMSBoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTEgc206Z2FwLTJcIj5cbiAgICAgICAgICAgICAgPExhYmVsIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPkNvbG9yPC9MYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxUb29sdGlwUHJvdmlkZXI+XG4gICAgICAgICAgICAgICAgICB7Y29sb3JPcHRpb25zLm1hcCgoY29sb3IpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXAga2V5PXtjb2xvci52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXBUcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Y29sb3IudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2NvbG9yLnZhbHVlfSBoLTYgdy02IHJvdW5kZWQtZnVsbCBzbTpoLTggc206dy04YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbG9yID09PSBjb2xvci52YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpbmctMiByaW5nLWJsYWNrIHJpbmctb2Zmc2V0LTEgc206cmluZy1vZmZzZXQtMidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VsZWN0ZWRDb2xvcihjb2xvci52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2NvbG9yLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXBUcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgIDxUb29sdGlwQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPntjb2xvci5sYWJlbH08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9Ub29sdGlwUHJvdmlkZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMSBzbTpnYXAtMlwiPlxuICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cImxvY2F0aW9uXCIgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgTG9jYXRpb25cbiAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgaWQ9XCJsb2NhdGlvblwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImxvY2F0aW9uXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT17Zm9ybVZhbHVlcy5sb2NhdGlvbn1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFdmVudCBsb2NhdGlvbiAob3B0aW9uYWwpXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMSBzbTpnYXAtMlwiPlxuICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cImRlc2NyaXB0aW9uXCIgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgaWQ9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT17Zm9ybVZhbHVlcy5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFdmVudCBkZXNjcmlwdGlvbiAob3B0aW9uYWwpXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8RGlhbG9nRm9vdGVyIGNsYXNzTmFtZT1cIm10LTIgZmxleCBmbGV4LWNvbC1yZXZlcnNlIGdhcC0yIHNtOm10LTQgc206ZmxleC1yb3cgc206Z2FwLTBcIj5cbiAgICAgICAgICAgIHtzZWxlY3RlZEV2ZW50LmlkICYmIChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJkZXN0cnVjdGl2ZVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlRGVsZXRlfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBzbTptci1hdXRvIHNtOnctYXV0b1wiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIERlbGV0ZVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGdhcC0yIHNtOnctYXV0b1wiPlxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHNtOmZsZXgtbm9uZVwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3NOYW1lPVwiZmxleC0xIHNtOmZsZXgtbm9uZVwiIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgICAgIHtzZWxlY3RlZEV2ZW50LmlkID8gJ1VwZGF0ZScgOiAnQ3JlYXRlJ31cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L0RpYWxvZ0Zvb3Rlcj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9EaWFsb2dDb250ZW50PlxuICAgIDwvRGlhbG9nPlxuICApXG59XG4iLAogICAgImltcG9ydCB7XG4gIEJ1dHRvbixcbiAgUG9wb3ZlcixcbiAgUG9wb3ZlckNvbnRlbnQsXG4gIFBvcG92ZXJUcmlnZ2VyLFxufSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IENhbGVuZGFyIGFzIENhbGVuZGFySWNvbiwgTWVudSwgUGx1cyB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBUaXRsZUNvbnRlbnQgZnJvbSAnLi90aXRsZS1jb250ZW50J1xuaW1wb3J0IFZpZXdDb250cm9scyBmcm9tICcuL3ZpZXctY29udHJvbHMnXG5cbnR5cGUgSGVhZGVyUHJvcHMgPSBvYmplY3RcblxuY29uc3QgSGVhZGVyOiBSZWFjdC5GQzxIZWFkZXJQcm9wcz4gPSAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjdXJyZW50RGF0ZSxcbiAgICB2aWV3LFxuICAgIHNldFZpZXcsXG4gICAgbmV4dFBlcmlvZCxcbiAgICBwcmV2UGVyaW9kLFxuICAgIHRvZGF5LFxuICAgIG9wZW5FdmVudEZvcm0sXG4gIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIC8vIFN0YXRlIGZvciBtb2JpbGUgbWVudSBwb3BvdmVyXG4gIGNvbnN0IFttb2JpbGVQb3BvdmVyT3Blbiwgc2V0TW9iaWxlUG9wb3Zlck9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgLy8gSGFuZGxlIHZpZXcgY2hhbmdlIHdpdGggb3B0aW9uYWwgcG9wb3ZlciBjbG9zaW5nXG4gIGNvbnN0IGhhbmRsZVZpZXdDaGFuZ2UgPSAoXG4gICAgbmV3VmlldzogJ2RheScgfCAnd2VlaycgfCAnbW9udGgnIHwgJ3llYXInLFxuICAgIGNsb3NlUG9wb3ZlciA9IGZhbHNlXG4gICkgPT4ge1xuICAgIHNldFZpZXcobmV3VmlldylcbiAgICBpZiAoY2xvc2VQb3BvdmVyKSB7XG4gICAgICBzZXRNb2JpbGVQb3BvdmVyT3BlbihmYWxzZSlcbiAgICB9XG4gIH1cblxuICAvLyBDYWxsYmFjayBmb3IgbmF2aWdhdGlvbiB0aGF0IGFsc28gY2xvc2VzIHRoZSBtb2JpbGUgcG9wb3ZlclxuICBjb25zdCBoYW5kbGVOYXZpZ2F0aW9uID0ge1xuICAgIHRvZGF5OiAoKSA9PiB7XG4gICAgICB0b2RheSgpXG4gICAgICBzZXRNb2JpbGVQb3BvdmVyT3BlbihmYWxzZSlcbiAgICB9LFxuICAgIHByZXZpb3VzOiAoKSA9PiB7XG4gICAgICBwcmV2UGVyaW9kKClcbiAgICAgIHNldE1vYmlsZVBvcG92ZXJPcGVuKGZhbHNlKVxuICAgIH0sXG4gICAgbmV4dDogKCkgPT4ge1xuICAgICAgbmV4dFBlcmlvZCgpXG4gICAgICBzZXRNb2JpbGVQb3BvdmVyT3BlbihmYWxzZSlcbiAgICB9LFxuICB9XG5cbiAgY29uc3QgTmV3RXZlbnRCdXR0b24gPSB1c2VDYWxsYmFjayhcbiAgICAoKSA9PiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvcGVuRXZlbnRGb3JtKGN1cnJlbnREYXRlKX1cbiAgICAgICAgICB2YXJpYW50PVwiZGVmYXVsdFwiXG4gICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiXG4gICAgICAgID5cbiAgICAgICAgICA8UGx1cyBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6aW5saW5lXCI+TmV3IEV2ZW50PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1kOmhpZGRlblwiPk5ldzwvc3Bhbj5cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICApLFxuICAgIFtjdXJyZW50RGF0ZSwgb3BlbkV2ZW50Rm9ybV1cbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHsvKiBDYWxlbmRhciBIZWFkZXIgd2l0aCBncmlkIGxheW91dCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiQGNvbnRhaW5lciBncmlkIGdyaWQtY29scy0xMiBpdGVtcy1jZW50ZXIgZ2FwLTIgYm9yZGVyLWIgcC0yIHNtOnAtNFwiPlxuICAgICAgICB7LyogVGl0bGUgYXJlYSAtIExlZnQgc2VjdGlvbiAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0xMiBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgQDR4bDpjb2wtc3Bhbi01IEA0eGw6anVzdGlmeS1zdGFydFwiPlxuICAgICAgICAgIDxDYWxlbmRhckljb24gY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+XG4gICAgICAgICAgPFRpdGxlQ29udGVudCAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogTmV3IGV2ZW50IGJ1dHRvbiAtIE1vYmlsZSAmIERlc2t0b3AgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNwYW4tMTIgZmxleCBmbGV4LXdyYXAganVzdGlmeS1jZW50ZXIgZ2FwLTEgQDR4bDpjb2wtc3Bhbi03IEA0eGw6anVzdGlmeS1lbmRcIj5cbiAgICAgICAgICB7LyogRGVza3RvcCBjb250cm9scyAtIGNlbnRyYWxpemVkICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBnYXAtMSBzbTpmbGV4XCI+XG4gICAgICAgICAgICA8Vmlld0NvbnRyb2xzXG4gICAgICAgICAgICAgIGN1cnJlbnRWaWV3PXt2aWV3fVxuICAgICAgICAgICAgICBvbkNoYW5nZT17c2V0Vmlld31cbiAgICAgICAgICAgICAgb25Ub2RheT17dG9kYXl9XG4gICAgICAgICAgICAgIG9uTmV4dD17bmV4dFBlcmlvZH1cbiAgICAgICAgICAgICAgb25QcmV2aW91cz17cHJldlBlcmlvZH1cbiAgICAgICAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJqdXN0aWZ5LWVuZFwiXG4gICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICB7LyogTmV3IGV2ZW50IGJ1dHRvbiAtIERlc2t0b3AgKi99XG4gICAgICAgICAgICA8TmV3RXZlbnRCdXR0b24gLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHsvKiBNb2JpbGUgbmF2aWdhdGlvbiBtZW51IGJ1dHRvbiAtIFJpZ2h0IGFsaWduZWQgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBnYXAtMSBzbTpoaWRkZW5cIj5cbiAgICAgICAgICAgIHsvKiBOZXcgZXZlbnQgYnV0dG9uIC0gTW9iaWxlICovfVxuICAgICAgICAgICAgPE5ld0V2ZW50QnV0dG9uIC8+XG5cbiAgICAgICAgICAgIDxQb3BvdmVyXG4gICAgICAgICAgICAgIG9wZW49e21vYmlsZVBvcG92ZXJPcGVufVxuICAgICAgICAgICAgICBvbk9wZW5DaGFuZ2U9e3NldE1vYmlsZVBvcG92ZXJPcGVufVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lXCIgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICAgICAgICA8TWVudSBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgICAgICAgPFBvcG92ZXJDb250ZW50IGFsaWduPVwiZW5kXCIgY2xhc3NOYW1lPVwidy1bMjQwcHhdIHAtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwibWItMSB0ZXh0LXNtIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICAgIFZpZXcgJiBOYXZpZ2F0aW9uXG4gICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgPFZpZXdDb250cm9sc1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Vmlldz17dmlld31cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhuZXdWaWV3KSA9PiBoYW5kbGVWaWV3Q2hhbmdlKG5ld1ZpZXcsIHRydWUpfVxuICAgICAgICAgICAgICAgICAgICBvblRvZGF5PXtoYW5kbGVOYXZpZ2F0aW9uLnRvZGF5fVxuICAgICAgICAgICAgICAgICAgICBvbk5leHQ9e2hhbmRsZU5hdmlnYXRpb24ubmV4dH1cbiAgICAgICAgICAgICAgICAgICAgb25QcmV2aW91cz17aGFuZGxlTmF2aWdhdGlvbi5wcmV2aW91c31cbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9Qb3BvdmVyQ29udGVudD5cbiAgICAgICAgICAgIDwvUG9wb3Zlcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBIZWFkZXJcbiIsCiAgICAiaW1wb3J0IHtcbiAgQnV0dG9uLFxuICBQb3BvdmVyLFxuICBQb3BvdmVyQ29udGVudCxcbiAgUG9wb3ZlclRyaWdnZXIsXG59IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCB7IENoZXZyb25Eb3duIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuLy8gQ3JlYXRlIGFycmF5cyBmb3IgbW9udGggYW5kIHllYXIgb3B0aW9uc1xuY29uc3QgbW9udGhzID0gW1xuICAnSmFudWFyeScsXG4gICdGZWJydWFyeScsXG4gICdNYXJjaCcsXG4gICdBcHJpbCcsXG4gICdNYXknLFxuICAnSnVuZScsXG4gICdKdWx5JyxcbiAgJ0F1Z3VzdCcsXG4gICdTZXB0ZW1iZXInLFxuICAnT2N0b2JlcicsXG4gICdOb3ZlbWJlcicsXG4gICdEZWNlbWJlcicsXG5dXG5cbi8vIEFuaW1hdGlvbiB2YXJpYW50cyBmb3IgbnVtYmVyIHRyYW5zaXRpb25zXG5jb25zdCBhbmltYXRpb25WYXJpYW50cyA9IHtcbiAgaW5pdGlhbDogeyBvcGFjaXR5OiAwLCB5OiAxMCB9LFxuICBhbmltYXRlOiB7IG9wYWNpdHk6IDEsIHk6IDAgfSxcbiAgZXhpdDogeyBvcGFjaXR5OiAwLCB5OiAtMTAgfSxcbn1cblxuY29uc3QgVGl0bGVDb250ZW50ID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCB2aWV3LCBzZXRDdXJyZW50RGF0ZSB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBTdGF0ZSBmb3IgbW9iaWxlIG1lbnUgYW5kIHBvcG92ZXJzXG4gIGNvbnN0IFttb250aFBvcG92ZXJPcGVuLCBzZXRNb250aFBvcG92ZXJPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbeWVhclBvcG92ZXJPcGVuLCBzZXRZZWFyUG9wb3Zlck9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt3ZWVrUG9wb3Zlck9wZW4sIHNldFdlZWtQb3BvdmVyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2RheVBvcG92ZXJPcGVuLCBzZXREYXlQb3BvdmVyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBjdXJyZW50WWVhciA9IGN1cnJlbnREYXRlLnllYXIoKVxuICBjb25zdCB5ZWFycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDExIH0sIChfLCBpKSA9PiBjdXJyZW50WWVhciAtIDUgKyBpKVxuXG4gIC8vIEhhbmRsZSBtb250aCBhbmQgeWVhciBzZWxlY3Rpb25cbiAgY29uc3QgaGFuZGxlTW9udGhDaGFuZ2UgPSAobW9udGg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBjdXJyZW50RGF0ZS5tb250aChtb250aClcbiAgICBzZXRDdXJyZW50RGF0ZShuZXdEYXRlKVxuICAgIHNldE1vbnRoUG9wb3Zlck9wZW4oZmFsc2UpXG4gIH1cblxuICBjb25zdCBoYW5kbGVZZWFyQ2hhbmdlID0gKHllYXI6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBjdXJyZW50RGF0ZS55ZWFyKHllYXIpXG4gICAgc2V0Q3VycmVudERhdGUobmV3RGF0ZSlcbiAgICBzZXRZZWFyUG9wb3Zlck9wZW4oZmFsc2UpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7dmlldyAhPT0gJ3llYXInICYmIChcbiAgICAgICAgPFBvcG92ZXIgb3Blbj17bW9udGhQb3BvdmVyT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXRNb250aFBvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgbW9udGgtJHtjdXJyZW50RGF0ZS5tb250aCgpfWB9XG4gICAgICAgICAgICAgICAgICBpbml0aWFsPVwiaW5pdGlhbFwiXG4gICAgICAgICAgICAgICAgICBhbmltYXRlPVwiYW5pbWF0ZVwiXG4gICAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgICB2YXJpYW50cz17YW5pbWF0aW9uVmFyaWFudHN9XG4gICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uPXt7IGR1cmF0aW9uOiAwLjI1LCBlYXNlOiAnZWFzZUluT3V0JyB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtjdXJyZW50RGF0ZS5mb3JtYXQoJ01NTU0nKX1cbiAgICAgICAgICAgICAgICA8L21vdGlvbi5zcGFuPlxuICAgICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICAgICAgICAgICAgPENoZXZyb25Eb3duIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgICA8UG9wb3ZlckNvbnRlbnQgY2xhc3NOYW1lPVwidy00MCBwLTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBtYXgtaC02MCBmbGV4LWNvbCBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgICAgIHttb250aHMubWFwKChtb250aCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICBrZXk9e21vbnRofVxuICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICdqdXN0aWZ5LXN0YXJ0IGZvbnQtbm9ybWFsJyxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudERhdGUubW9udGgoKSA9PT0gaW5kZXggJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlTW9udGhDaGFuZ2UoaW5kZXgpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHttb250aH1cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgICA8L1BvcG92ZXI+XG4gICAgICApfVxuXG4gICAgICA8UG9wb3ZlciBvcGVuPXt5ZWFyUG9wb3Zlck9wZW59IG9uT3BlbkNoYW5nZT17c2V0WWVhclBvcG92ZXJPcGVufT5cbiAgICAgICAgPFBvcG92ZXJUcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTIgZm9udC1zZW1pYm9sZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICA8bW90aW9uLnNwYW5cbiAgICAgICAgICAgICAgICBrZXk9e2B5ZWFyLSR7Y3VycmVudERhdGUueWVhcigpfWB9XG4gICAgICAgICAgICAgICAgaW5pdGlhbD1cImluaXRpYWxcIlxuICAgICAgICAgICAgICAgIGFuaW1hdGU9XCJhbmltYXRlXCJcbiAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgdmFyaWFudHM9e2FuaW1hdGlvblZhcmlhbnRzfVxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMjUsIGVhc2U6ICdlYXNlSW5PdXQnIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7Y3VycmVudERhdGUuZm9ybWF0KCdZWVlZJyl9XG4gICAgICAgICAgICAgIDwvbW90aW9uLnNwYW4+XG4gICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgPFBvcG92ZXJDb250ZW50IGNsYXNzTmFtZT1cInctMjQgcC0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgIHt5ZWFycy5tYXAoKHllYXIpID0+IChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIGtleT17eWVhcn1cbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS55ZWFyKCkgPT09IHllYXIgJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVZZWFyQ2hhbmdlKHllYXIpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3llYXJ9XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvUG9wb3ZlckNvbnRlbnQ+XG4gICAgICA8L1BvcG92ZXI+XG5cbiAgICAgIHsvKiBEaXNwbGF5IGFkZGl0aW9uYWwgdmlldy1zcGVjaWZpYyBpbmZvcm1hdGlvbiAqL31cbiAgICAgIHt2aWV3ID09PSAnd2VlaycgJiYgKFxuICAgICAgICA8UG9wb3ZlciBvcGVuPXt3ZWVrUG9wb3Zlck9wZW59IG9uT3BlbkNoYW5nZT17c2V0V2Vla1BvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgd2Vlay1yYW5nZS0ke2N1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgICAgICAgICBpbml0aWFsPVwiaW5pdGlhbFwiXG4gICAgICAgICAgICAgICAgICBhbmltYXRlPVwiYW5pbWF0ZVwiXG4gICAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgICB2YXJpYW50cz17YW5pbWF0aW9uVmFyaWFudHN9XG4gICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uPXt7IGR1cmF0aW9uOiAwLjI1LCBlYXNlOiAnZWFzZUluT3V0JyB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtgJHtjdXJyZW50RGF0ZVxuICAgICAgICAgICAgICAgICAgICAuc3RhcnRPZignd2VlaycpXG4gICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoJ01NTSBEJyl9IC0gJHtjdXJyZW50RGF0ZVxuICAgICAgICAgICAgICAgICAgICAuZW5kT2YoJ3dlZWsnKVxuICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KCdNTU0gRCcpfWB9XG4gICAgICAgICAgICAgICAgPC9tb3Rpb24uc3Bhbj5cbiAgICAgICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJtbC0xIGgtMyB3LTMgb3BhY2l0eS03MFwiIC8+XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8L1BvcG92ZXJUcmlnZ2VyPlxuICAgICAgICAgIDxQb3BvdmVyQ29udGVudCBjbGFzc05hbWU9XCJ3LTU2IHAtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgICAgey8qIFNob3cgNyB3ZWVrcyAoMyBwYXN0LCBjdXJyZW50LCAzIGZ1dHVyZSkgKi99XG4gICAgICAgICAgICAgIHtBcnJheS5mcm9tKHsgbGVuZ3RoOiA3IH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2Vla0RhdGUgPSBjdXJyZW50RGF0ZS5zdWJ0cmFjdCgzLCAnd2VlaycpLmFkZChpLCAnd2VlaycpXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRPZldlZWsgPSB3ZWVrRGF0ZS5zdGFydE9mKCd3ZWVrJylcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRPZldlZWsgPSB3ZWVrRGF0ZS5lbmRPZignd2VlaycpXG4gICAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50V2VlayA9IHdlZWtEYXRlLmlzU2FtZShjdXJyZW50RGF0ZSwgJ3dlZWsnKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAga2V5PXtzdGFydE9mV2Vlay5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICAgICAgaXNDdXJyZW50V2VlayAmJiAnYmctcHJpbWFyeS8xMCdcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnREYXRlKHN0YXJ0T2ZXZWVrKVxuICAgICAgICAgICAgICAgICAgICAgIHNldFdlZWtQb3BvdmVyT3BlbihmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2Ake3N0YXJ0T2ZXZWVrLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdNTU0gRCdcbiAgICAgICAgICAgICAgICAgICAgICApfSAtICR7ZW5kT2ZXZWVrLmZvcm1hdCgnRCcpfWB9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIHtzdGFydE9mV2Vlay5tb250aCgpICE9PSBlbmRPZldlZWsubW9udGgoKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG9wYWNpdHktNzBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2Ake3N0YXJ0T2ZXZWVrLmZvcm1hdCgnTU1NJyl9LSR7ZW5kT2ZXZWVrLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTU1NJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9Qb3BvdmVyQ29udGVudD5cbiAgICAgICAgPC9Qb3BvdmVyPlxuICAgICAgKX1cbiAgICAgIHt2aWV3ID09PSAnZGF5JyAmJiAoXG4gICAgICAgIDxQb3BvdmVyIG9wZW49e2RheVBvcG92ZXJPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERheVBvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgZGF5LWluZm8tJHtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICAgICAgICAgICAgaW5pdGlhbD1cImluaXRpYWxcIlxuICAgICAgICAgICAgICAgICAgYW5pbWF0ZT1cImFuaW1hdGVcIlxuICAgICAgICAgICAgICAgICAgZXhpdD1cImV4aXRcIlxuICAgICAgICAgICAgICAgICAgdmFyaWFudHM9e2FuaW1hdGlvblZhcmlhbnRzfVxuICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbj17eyBkdXJhdGlvbjogMC4yNSwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7Y3VycmVudERhdGUuZm9ybWF0KCdkZGRkLCBEJyl9XG4gICAgICAgICAgICAgICAgPC9tb3Rpb24uc3Bhbj5cbiAgICAgICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJtbC0xIGgtMyB3LTMgb3BhY2l0eS03MFwiIC8+XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8L1BvcG92ZXJUcmlnZ2VyPlxuICAgICAgICAgIDxQb3BvdmVyQ29udGVudCBjbGFzc05hbWU9XCJ3LTU2IHAtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgICAgey8qIFNob3cgYWxsIGRheXMgb2YgdGhlIGN1cnJlbnQgbW9udGggKi99XG4gICAgICAgICAgICAgIHsoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEdldCBmaXJzdCBkYXkgb2YgbW9udGggYW5kIGxhc3QgZGF5IG9mIG1vbnRoXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gY3VycmVudERhdGUuc3RhcnRPZignbW9udGgnKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gY3VycmVudERhdGUuZGF5c0luTW9udGgoKVxuXG4gICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgYXJyYXkgb2YgZGF5cyBpbiB0aGUgbW9udGhcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogZGF5c0luTW9udGggfSwgKF8sIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRheURhdGUgPSBmaXJzdERheU9mTW9udGguZGF0ZShpICsgMSkgLy8gaSArIDEgYmVjYXVzZSBkYXlzIHN0YXJ0IGF0IDFcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudERheSA9IGRheURhdGUuaXNTYW1lKGN1cnJlbnREYXRlLCAnZGF5JylcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVG9kYXkgPSBkYXlEYXRlLmlzU2FtZShkYXlqcygpLCAnZGF5JylcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGtleT17ZGF5RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0N1cnJlbnREYXkgJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50RGF0ZShkYXlEYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF5UG9wb3Zlck9wZW4oZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2RheURhdGUuZm9ybWF0KCdkZGRkLCBNTU0gRCcpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc1RvZGF5ICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCByb3VuZGVkLXNtIHB4LTEgdGV4dC14c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvZGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgICA8L1BvcG92ZXI+XG4gICAgICApfVxuICAgIDwvPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpdGxlQ29udGVudFxuIiwKICAgICJpbXBvcnQgeyBCdXR0b24gfSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgQ2hldnJvbkxlZnQsIENoZXZyb25SaWdodCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcblxudHlwZSBWaWV3Q29udHJvbHNQcm9wcyA9IHtcbiAgY3VycmVudFZpZXc6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJ1xuICBvbkNoYW5nZTogKHZpZXc6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4gdm9pZFxuICBvblRvZGF5PzogKCkgPT4gdm9pZFxuICBvbk5leHQ/OiAoKSA9PiB2b2lkXG4gIG9uUHJldmlvdXM/OiAoKSA9PiB2b2lkXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZ3JpZCdcbiAgc2l6ZT86ICdzbScgfCAnZGVmYXVsdCdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IFZpZXdDb250cm9sczogUmVhY3QuRkM8Vmlld0NvbnRyb2xzUHJvcHM+ID0gKHtcbiAgY3VycmVudFZpZXcsXG4gIG9uQ2hhbmdlLFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICBzaXplID0gJ3NtJyxcbiAgY2xhc3NOYW1lLFxuICBvblRvZGF5LFxuICBvbk5leHQsXG4gIG9uUHJldmlvdXMsXG59KSA9PiB7XG4gIGNvbnN0IGlzR3JpZCA9IHZhcmlhbnQgPT09ICdncmlkJ1xuXG4gIC8vIEV4dHJhY3QgY29tbW9uIGJ1dHRvbiBjbGFzc05hbWUgbG9naWMgdG8gYSBmdW5jdGlvblxuICBjb25zdCBnZXRCdXR0b25DbGFzc05hbWUgPSAodmlld1R5cGU6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4ge1xuICAgIHJldHVybiBjbihcbiAgICAgIC8vIEJhc2Ugd2lkdGggZm9yIGdyaWQgbGF5b3V0XG4gICAgICBpc0dyaWQgPyAndy1mdWxsJyA6ICcnLFxuICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB5ZWFyIGJ1dHRvbiB2aXNpYmlsaXR5IG9uIG1vYmlsZVxuICAgICAgdmlld1R5cGUgPT09ICd5ZWFyJyA/IChpc0dyaWQgPyAndy1mdWxsJyA6ICdoaWRkZW4gbWQ6aW5saW5lLWZsZXgnKSA6ICcnLFxuICAgICAgLy8gQWN0aXZlIHZpZXcgc3R5bGluZ1xuICAgICAgY3VycmVudFZpZXcgPT09IHZpZXdUeXBlICYmICdiZy1wcmltYXJ5LzgwJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IGdldEJ0blZhcmlhbnQgPSAodmlld1R5cGU6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4ge1xuICAgIHJldHVybiBjdXJyZW50VmlldyA9PT0gdmlld1R5cGUgPyAnZGVmYXVsdCcgOiAnb3V0bGluZSdcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgaXNHcmlkID8gJ2dyaWQgZ3JpZC1jb2xzLTIgZ2FwLTInIDogJ2ZsZXggZ2FwLTEnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgPlxuICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtvblByZXZpb3VzfSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICA8Q2hldnJvbkxlZnQgY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+XG4gICAgICA8L0J1dHRvbj5cbiAgICAgIDxCdXR0b24gb25DbGljaz17b25OZXh0fSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICA8Q2hldnJvblJpZ2h0IGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgPC9CdXR0b24+XG5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UoJ2RheScpfVxuICAgICAgICB2YXJpYW50PXtnZXRCdG5WYXJpYW50KCdkYXknKX1cbiAgICAgICAgc2l6ZT17c2l6ZX1cbiAgICAgICAgY2xhc3NOYW1lPXtnZXRCdXR0b25DbGFzc05hbWUoJ2RheScpfVxuICAgICAgPlxuICAgICAgICBEYXlcbiAgICAgIDwvQnV0dG9uPlxuICAgICAgPEJ1dHRvblxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkNoYW5nZSgnd2VlaycpfVxuICAgICAgICB2YXJpYW50PXtnZXRCdG5WYXJpYW50KCd3ZWVrJyl9XG4gICAgICAgIHNpemU9e3NpemV9XG4gICAgICAgIGNsYXNzTmFtZT17Z2V0QnV0dG9uQ2xhc3NOYW1lKCd3ZWVrJyl9XG4gICAgICA+XG4gICAgICAgIFdlZWtcbiAgICAgIDwvQnV0dG9uPlxuICAgICAgPEJ1dHRvblxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkNoYW5nZSgnbW9udGgnKX1cbiAgICAgICAgdmFyaWFudD17Z2V0QnRuVmFyaWFudCgnbW9udGgnKX1cbiAgICAgICAgc2l6ZT17c2l6ZX1cbiAgICAgICAgY2xhc3NOYW1lPXtnZXRCdXR0b25DbGFzc05hbWUoJ21vbnRoJyl9XG4gICAgICA+XG4gICAgICAgIE1vbnRoXG4gICAgICA8L0J1dHRvbj5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UoJ3llYXInKX1cbiAgICAgICAgdmFyaWFudD17Z2V0QnRuVmFyaWFudCgneWVhcicpfVxuICAgICAgICBzaXplPXtzaXplfVxuICAgICAgICBjbGFzc05hbWU9e2dldEJ1dHRvbkNsYXNzTmFtZSgneWVhcicpfVxuICAgICAgPlxuICAgICAgICBZZWFyXG4gICAgICA8L0J1dHRvbj5cblxuICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtvblRvZGF5fSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICBUb2RheVxuICAgICAgPC9CdXR0b24+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgVmlld0NvbnRyb2xzXG4iLAogICAgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgU2Nyb2xsQXJlYSB9IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgQW5pbWF0ZVByZXNlbmNlLCBtb3Rpb24gfSBmcm9tICdtb3Rpb24vcmVhY3QnXG5cbmNvbnN0IFllYXJWaWV3OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgeyBjdXJyZW50RGF0ZSwgc2VsZWN0RGF0ZSwgZXZlbnRzLCBzZXRWaWV3LCBnZXRFdmVudHNGb3JEYXRlIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IHllYXIgPSBjdXJyZW50RGF0ZS55ZWFyKClcblxuICAvLyBHZW5lcmF0ZSBhbiBhcnJheSBvZiAxMiBtb250aHMgZm9yIHRoZSBjdXJyZW50IHllYXJcbiAgY29uc3QgbW9udGhzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+IHtcbiAgICBjb25zdCBtb250aERhdGUgPSBkYXlqcygpLnllYXIoeWVhcikubW9udGgoaSkuc3RhcnRPZignbW9udGgnKVxuICAgIHJldHVybiB7XG4gICAgICBkYXRlOiBtb250aERhdGUsXG4gICAgICBuYW1lOiBtb250aERhdGUuZm9ybWF0KCdNTU1NJyksXG4gICAgICBkYXlzSW5Nb250aDogbW9udGhEYXRlLmRheXNJbk1vbnRoKCksXG4gICAgICBmaXJzdERheU9mTW9udGg6IG1vbnRoRGF0ZS5zdGFydE9mKCdtb250aCcpLmRheSgpLCAvLyAwLTYsIDAgaXMgU3VuZGF5XG4gICAgfVxuICB9KVxuXG4gIC8vIENhbGN1bGF0ZSBldmVudHMgZm9yIGVhY2ggbW9udGhcbiAgY29uc3QgbW9udGhzV2l0aEV2ZW50Q291bnQgPSBtb250aHMubWFwKChtb250aCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50c0luTW9udGggPSBldmVudHMuZmlsdGVyKFxuICAgICAgKGV2ZW50KSA9PlxuICAgICAgICBldmVudC5zdGFydC55ZWFyKCkgPT09IHllYXIgJiZcbiAgICAgICAgZXZlbnQuc3RhcnQubW9udGgoKSA9PT0gbW9udGguZGF0ZS5tb250aCgpXG4gICAgKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1vbnRoLFxuICAgICAgZXZlbnRDb3VudDogZXZlbnRzSW5Nb250aC5sZW5ndGgsXG4gICAgfVxuICB9KVxuXG4gIC8vIEhhbmRsZSBtb250aCBjbGljayB0byBuYXZpZ2F0ZSB0byBtb250aCB2aWV3XG4gIGNvbnN0IGhhbmRsZU1vbnRoQ2xpY2sgPSAoZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICBzZWxlY3REYXRlKGRhdGUpXG4gICAgc2V0VmlldygnbW9udGgnKVxuICB9XG5cbiAgLy8gSGFuZGxlIGRheSBjbGljayB3aXRoaW4gdGhlIG1pbmkgY2FsZW5kYXJcbiAgY29uc3QgaGFuZGxlRGF5Q2xpY2sgPSAoZGF0ZTogZGF5anMuRGF5anMsIGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgLy8gUHJldmVudCB0cmlnZ2VyaW5nIHRoZSBtb250aCBjbGlja1xuICAgIHNlbGVjdERhdGUoZGF0ZSlcbiAgICBzZXRWaWV3KCdkYXknKSAvLyBOYXZpZ2F0ZSBkaXJlY3RseSB0byBkYXkgdmlldyB3aGVuIGNsaWNraW5nIG9uIGEgc3BlY2lmaWMgZGF5XG4gIH1cblxuICAvLyBHZW5lcmF0ZSBkYXlzIGZvciBtaW5pIGNhbGVuZGFyIGluIGVhY2ggbW9udGhcbiAgY29uc3QgcmVuZGVyTWluaUNhbGVuZGFyID0gKG1vbnRoOiAodHlwZW9mIG1vbnRoc1dpdGhFdmVudENvdW50KVswXSkgPT4ge1xuICAgIC8vIEdldCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCdzIGNhbGVuZGFyICh3aGljaCBjb3VsZCBiZSBpbiB0aGUgcHJldmlvdXMgbW9udGgpXG4gICAgY29uc3QgZmlyc3REYXlPZkNhbGVuZGFyID0gbW9udGguZGF0ZS5zdGFydE9mKCdtb250aCcpLnN0YXJ0T2YoJ3dlZWsnKVxuXG4gICAgLy8gQ3JlYXRlIDQyIGRheXMgKDYgcm93cyBvZiA3IGRheXMpIGZvciBjb25zaXN0ZW5jeVxuICAgIGNvbnN0IGRheXNBcnJheSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDQyIH0sIChfLCBpKSA9PiB7XG4gICAgICBjb25zdCBkYXkgPSBmaXJzdERheU9mQ2FsZW5kYXIuYWRkKGksICdkYXknKVxuICAgICAgY29uc3QgaXNDdXJyZW50TW9udGggPSBkYXkubW9udGgoKSA9PT0gbW9udGguZGF0ZS5tb250aCgpXG4gICAgICBjb25zdCBpc1RvZGF5ID0gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JylcbiAgICAgIGNvbnN0IGlzQ3VycmVudERhdGUgPSBkYXkuaXNTYW1lKGN1cnJlbnREYXRlLCAnZGF5JylcblxuICAgICAgLy8gR2V0IGV2ZW50cyBmb3IgdGhpcyBkYXlcbiAgICAgIGNvbnN0IGRheUV2ZW50cyA9IGdldEV2ZW50c0ZvckRhdGUoZGF5KVxuICAgICAgY29uc3QgaGFzRXZlbnRzID0gZGF5RXZlbnRzLmxlbmd0aCA+IDBcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF5LFxuICAgICAgICBpc0N1cnJlbnRNb250aCxcbiAgICAgICAgaXNUb2RheSxcbiAgICAgICAgaXNDdXJyZW50RGF0ZSxcbiAgICAgICAgaGFzRXZlbnRzLFxuICAgICAgICBldmVudENvdW50OiBkYXlFdmVudHMubGVuZ3RoLFxuICAgICAgICAvLyBHcm91cCBldmVudHMgYnkgdGhlaXIgY2F0ZWdvcmllcyB0byBzaG93IGRpZmZlcmVudCBjb2xvcnNcbiAgICAgICAgZXZlbnRzOiBkYXlFdmVudHMsXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGRhdGEtdGVzdGlkPXtgeWVhci1taW5pLWNhbGVuZGFyLSR7bW9udGguZGF0ZS5mb3JtYXQoJ01NJyl9YH1cbiAgICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAtWzFweF0gdGV4dC1bMC42cmVtXVwiXG4gICAgICA+XG4gICAgICAgIHsvKiBEYXkgbmFtZXMgKi99XG4gICAgICAgIHtbJ1MnLCAnTScsICdUJywgJ1cnLCAnVCcsICdGJywgJ1MnXS5tYXAoKGRheU5hbWUsIGkpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e2BoZWFkZXItJHtpfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgaC0zIHRleHQtY2VudGVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZGF5TmFtZX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSl9XG5cbiAgICAgICAgey8qIENhbGVuZGFyIGRheXMgKi99XG4gICAgICAgIHtkYXlzQXJyYXkubWFwKChkYXlJbmZvLCBpKSA9PiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgZGF5LSR7aX1gfVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B5ZWFyLWRheS0ke2RheUluZm8uZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gaGFuZGxlRGF5Q2xpY2soZGF5SW5mby5kYXksIGUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ3JlbGF0aXZlIGZsZXggYXNwZWN0LXNxdWFyZSB3LWZ1bGwgY3Vyc29yLXBvaW50ZXIgZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyJyxcbiAgICAgICAgICAgICAgJ2hvdmVyOmJnLWFjY2VudCByb3VuZGVkLXNtIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICAgICAgICFkYXlJbmZvLmlzQ3VycmVudE1vbnRoICYmICd0ZXh0LW11dGVkLWZvcmVncm91bmQgb3BhY2l0eS01MCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaXNUb2RheSAmJlxuICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaXNDdXJyZW50RGF0ZSAmJlxuICAgICAgICAgICAgICAgICFkYXlJbmZvLmlzVG9kYXkgJiZcbiAgICAgICAgICAgICAgICAnYmctbXV0ZWQgcm91bmRlZC1mdWxsIGZvbnQtYm9sZCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaGFzRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgIWRheUluZm8uaXNUb2RheSAmJlxuICAgICAgICAgICAgICAgICFkYXlJbmZvLmlzQ3VycmVudERhdGUgJiZcbiAgICAgICAgICAgICAgICAnZm9udC1tZWRpdW0nXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgdGl0bGU9e1xuICAgICAgICAgICAgICBkYXlJbmZvLmhhc0V2ZW50c1xuICAgICAgICAgICAgICAgID8gYCR7ZGF5SW5mby5ldmVudENvdW50fSBldmVudCR7XG4gICAgICAgICAgICAgICAgICAgIGRheUluZm8uZXZlbnRDb3VudCA+IDEgPyAncycgOiAnJ1xuICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgbGVhZGluZy1ub25lXCI+XG4gICAgICAgICAgICAgIHtkYXlJbmZvLmRheS5kYXRlKCl9XG4gICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgIHsvKiBFbmhhbmNlZCBldmVudCBpbmRpY2F0b3IgLSBzaG93IG11bHRpcGxlIGNvbG9yZWQgZG90cyBmb3IgZGlmZmVyZW50IGV2ZW50IHR5cGVzICovfVxuICAgICAgICAgICAge2RheUluZm8uaGFzRXZlbnRzICYmIChcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAnYWJzb2x1dGUgYm90dG9tLTAgZmxleCB3LWZ1bGwganVzdGlmeS1jZW50ZXIgc3BhY2UteC1bMXB4XScsXG4gICAgICAgICAgICAgICAgICBkYXlJbmZvLmlzVG9kYXkgPyAnYm90dG9tLVsxcHhdJyA6ICcnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHsvKiBTaG93IHVwIHRvIDMgZXZlbnQgZG90cyB3aXRoIGRpZmZlcmVudCBjb2xvcnMgaWYgYXZhaWxhYmxlICovfVxuICAgICAgICAgICAgICAgIHtkYXlJbmZvLmV2ZW50Q291bnQgPiAwICYmIChcbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgJ2gtWzNweF0gdy1bM3B4XSByb3VuZGVkLWZ1bGwnLFxuICAgICAgICAgICAgICAgICAgICAgIGRheUluZm8uaXNUb2RheSA/ICdiZy1wcmltYXJ5LWZvcmVncm91bmQnIDogJ2JnLXByaW1hcnknXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2RheUluZm8uZXZlbnRDb3VudCA+IDEgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnaC1bM3B4XSB3LVszcHhdIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgZGF5SW5mby5pc1RvZGF5ID8gJ2JnLXByaW1hcnktZm9yZWdyb3VuZCcgOiAnYmctYmx1ZS01MDAnXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2RheUluZm8uZXZlbnRDb3VudCA+IDIgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnaC1bM3B4XSB3LVszcHhdIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgZGF5SW5mby5pc1RvZGF5ID8gJ2JnLXByaW1hcnktZm9yZWdyb3VuZCcgOiAnYmctZ3JlZW4tNTAwJ1xuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8U2Nyb2xsQXJlYSBkYXRhLXRlc3RpZD1cInllYXItdmlld1wiIGNsYXNzTmFtZT1cImgtZnVsbFwiPlxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXRlc3RpZD1cInllYXItZ3JpZFwiXG4gICAgICAgIGNsYXNzTmFtZT1cImdyaWQgYXV0by1yb3dzLWZyIGdyaWQtY29scy0xIGdhcC00IHAtNCBzbTpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiXG4gICAgICA+XG4gICAgICAgIHttb250aHNXaXRoRXZlbnRDb3VudC5tYXAoKG1vbnRoLCBpbmRleCkgPT4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGtleT17bW9udGgubmFtZX1cbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgeWVhci1tb250aC0ke21vbnRoLmRhdGUuZm9ybWF0KCdNTScpfWB9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVNb250aENsaWNrKG1vbnRoLmRhdGUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6Ym9yZGVyLXByaW1hcnkgZmxleCBjdXJzb3ItcG9pbnRlciBmbGV4LWNvbCByb3VuZGVkLWxnIGJvcmRlciBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGhvdmVyOnNjYWxlLVsxLjAxXSBob3ZlcjpzaGFkb3ctbWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxBbmltYXRlUHJlc2VuY2UgbW9kZT1cIndhaXRcIj5cbiAgICAgICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgICAgICBrZXk9e2Btb250aC0ke2luZGV4fWB9XG4gICAgICAgICAgICAgICAgaW5pdGlhbD17eyBvcGFjaXR5OiAwLCB5OiAtMTAgfX1cbiAgICAgICAgICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAsIHk6IC0xMCB9fVxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb249e3tcbiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwLjI1LFxuICAgICAgICAgICAgICAgICAgZWFzZTogJ2Vhc2VJbk91dCcsXG4gICAgICAgICAgICAgICAgICBkZWxheTogaW5kZXggKiAwLjA1LFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWItMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGgzXG4gICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD17YHllYXItbW9udGgtdGl0bGUtJHttb250aC5kYXRlLmZvcm1hdCgnTU0nKX1gfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LW1lZGl1bVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge21vbnRoLm5hbWV9XG4gICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B5ZWFyLW1vbnRoLWV2ZW50LWNvdW50LSR7bW9udGguZGF0ZS5mb3JtYXQoJ01NJyl9YH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCByb3VuZGVkLWZ1bGwgcHgtMiBweS0xIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudH17JyAnfVxuICAgICAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudCA9PT0gMSA/ICdldmVudCcgOiAnZXZlbnRzJ31cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L21vdGlvbi5kaXY+XG4gICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cblxuICAgICAgICAgICAge3JlbmRlck1pbmlDYWxlbmRhcihtb250aCl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgPC9TY3JvbGxBcmVhPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFllYXJWaWV3XG4iLAogICAgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE1vbnRoVmlldyB9IGZyb20gJ0AvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL21vbnRoLXZpZXcnXG5pbXBvcnQgV2Vla1ZpZXcgZnJvbSAnQC9mZWF0dXJlcy93ZWVrLXZpZXcvd2Vlay12aWV3J1xuaW1wb3J0IERheVZpZXcgZnJvbSAnQC9mZWF0dXJlcy9kYXktdmlldy9kYXktdmlldydcbmltcG9ydCB7IEV2ZW50Rm9ybSB9IGZyb20gJy4uL2V2ZW50LWZvcm0vZXZlbnQtZm9ybSdcbmltcG9ydCB7IEhlYWRlciB9IGZyb20gJy4uL2hlYWRlcidcbmltcG9ydCBZZWFyVmlldyBmcm9tICdAL2ZlYXR1cmVzL3llYXItdmlldy95ZWFyLXZpZXcnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCB7IENhbGVuZGFyRG5kQ29udGV4dCB9IGZyb20gJ0AvZmVhdHVyZXMvZHJhZy1hbmQtZHJvcC9jYWxlbmRhci1kbmQtY29udGV4dCdcbmltcG9ydCB7IENhbGVuZGFyUHJvdmlkZXIgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvcHJvdmlkZXInXG5pbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQsIFdlZWtEYXlzIH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcblxuY29uc3QgQ2FsZW5kYXJDb250ZW50OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIHZpZXcsXG4gICAgaXNFdmVudEZvcm1PcGVuLFxuICAgIGNsb3NlRXZlbnRGb3JtLFxuICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgc2VsZWN0ZWREYXRlLFxuICAgIGFkZEV2ZW50LFxuICAgIHVwZGF0ZUV2ZW50LFxuICAgIGRlbGV0ZUV2ZW50LFxuICAgIGRheU1heEV2ZW50cyxcbiAgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgY29uc3Qgdmlld01hcCA9IHtcbiAgICBtb250aDogPE1vbnRoVmlldyBrZXk9XCJtb250aFwiIGRheU1heEV2ZW50cz17ZGF5TWF4RXZlbnRzfSAvPixcbiAgICB3ZWVrOiA8V2Vla1ZpZXcga2V5PVwid2Vla1wiIC8+LFxuICAgIGRheTogPERheVZpZXcga2V5PVwiZGF5XCIgLz4sXG4gICAgeWVhcjogPFllYXJWaWV3IGtleT1cInllYXJcIiAvPixcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZU9uVXBkYXRlID0gKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgdXBkYXRlRXZlbnQoZXZlbnQuaWQsIGV2ZW50KVxuICB9XG5cbiAgY29uc3QgaGFuZGxlT25EZWxldGUgPSAoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBkZWxldGVFdmVudChldmVudC5pZClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGxcIj5cbiAgICAgIDxIZWFkZXIgLz5cblxuICAgICAgey8qIENhbGVuZGFyIEJvZHkgd2l0aCBBbmltYXRlUHJlc2VuY2UgZm9yIHZpZXcgdHJhbnNpdGlvbnMgKi99XG4gICAgICA8Q2FsZW5kYXJEbmRDb250ZXh0PlxuICAgICAgICA8QW5pbWF0ZVByZXNlbmNlIG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgIGtleT17dmlld31cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCwgeDogMjAgfX1cbiAgICAgICAgICAgIGFuaW1hdGU9e3sgb3BhY2l0eTogMSwgeDogMCB9fVxuICAgICAgICAgICAgZXhpdD17eyBvcGFjaXR5OiAwLCB4OiAtMjAgfX1cbiAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMSwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtZnVsbCB3LWZ1bGxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt2aWV3TWFwW3ZpZXddfVxuICAgICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICA8L0NhbGVuZGFyRG5kQ29udGV4dD5cblxuICAgICAgey8qIEV2ZW50IEZvcm0gRGlhbG9nICovfVxuICAgICAge2lzRXZlbnRGb3JtT3BlbiAmJiAoXG4gICAgICAgIDxFdmVudEZvcm1cbiAgICAgICAgICBvbkNsb3NlPXtjbG9zZUV2ZW50Rm9ybX1cbiAgICAgICAgICBzZWxlY3RlZEV2ZW50PXtzZWxlY3RlZEV2ZW50fVxuICAgICAgICAgIHNlbGVjdGVkRGF0ZT17c2VsZWN0ZWREYXRlfVxuICAgICAgICAgIG9uQWRkPXthZGRFdmVudH1cbiAgICAgICAgICBvblVwZGF0ZT17aGFuZGxlT25VcGRhdGV9XG4gICAgICAgICAgb25EZWxldGU9e2hhbmRsZU9uRGVsZXRlfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5pbnRlcmZhY2UgQ2FsZW5kYXJQcm9wcyB7XG4gIGV2ZW50cz86IENhbGVuZGFyRXZlbnRbXVxuICBmaXJzdERheU9mV2Vlaz86IFdlZWtEYXlzXG4gIHJlbmRlckV2ZW50PzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgb25FdmVudENsaWNrPzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIG9uQ2VsbENsaWNrPzogKHN0YXJ0RGF0ZTogZGF5anMuRGF5anMsIGVuZERhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIG9uVmlld0NoYW5nZT86ICh2aWV3OiAnbW9udGgnIHwgJ3dlZWsnIHwgJ2RheScgfCAneWVhcicpID0+IHZvaWRcbiAgbG9jYWxlPzogc3RyaW5nXG4gIHRpbWV6b25lPzogc3RyaW5nXG4gIGRpc2FibGVDZWxsQ2xpY2s/OiBib29sZWFuXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICBkaXNhYmxlRHJhZ0FuZERyb3A/OiBib29sZWFuXG4gIGRheU1heEV2ZW50cz86IG51bWJlclxuICBzdGlja3lWaWV3SGVhZGVyPzogYm9vbGVhblxuICB2aWV3SGVhZGVyQ2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IGRheU51bWJlck1hcDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgc3VuZGF5OiAwLFxuICBtb25kYXk6IDEsXG4gIHR1ZXNkYXk6IDIsXG4gIHdlZG5lc2RheTogMyxcbiAgdGh1cnNkYXk6IDQsXG4gIGZyaWRheTogNSxcbiAgc2F0dXJkYXk6IDYsXG59XG5cbmNvbnN0IERFRkFVTFRfREFZX01BWF9FVkVOVFMgPSA2XG5leHBvcnQgY29uc3QgSWxhbXlDYWxlbmRhcjogUmVhY3QuRkM8Q2FsZW5kYXJQcm9wcz4gPSAoe1xuICBldmVudHMsXG4gIGZpcnN0RGF5T2ZXZWVrID0gJ3N1bmRheScsXG4gIHJlbmRlckV2ZW50LFxuICBvbkV2ZW50Q2xpY2ssXG4gIG9uQ2VsbENsaWNrLFxuICBvblZpZXdDaGFuZ2UsXG4gIGxvY2FsZSxcbiAgdGltZXpvbmUsXG4gIGRpc2FibGVDZWxsQ2xpY2ssXG4gIGRpc2FibGVFdmVudENsaWNrLFxuICBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gIGRheU1heEV2ZW50cyA9IERFRkFVTFRfREFZX01BWF9FVkVOVFMsXG4gIHN0aWNreVZpZXdIZWFkZXIgPSB0cnVlLFxuICB2aWV3SGVhZGVyQ2xhc3NOYW1lID0gJycsXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPENhbGVuZGFyUHJvdmlkZXJcbiAgICAgIGV2ZW50cz17ZXZlbnRzfVxuICAgICAgZmlyc3REYXlPZldlZWs9e2RheU51bWJlck1hcFtmaXJzdERheU9mV2Vla119XG4gICAgICByZW5kZXJFdmVudD17cmVuZGVyRXZlbnR9XG4gICAgICBvbkV2ZW50Q2xpY2s9e29uRXZlbnRDbGlja31cbiAgICAgIG9uQ2VsbENsaWNrPXtvbkNlbGxDbGlja31cbiAgICAgIG9uVmlld0NoYW5nZT17b25WaWV3Q2hhbmdlfVxuICAgICAgbG9jYWxlPXtsb2NhbGV9XG4gICAgICB0aW1lem9uZT17dGltZXpvbmV9XG4gICAgICBkaXNhYmxlQ2VsbENsaWNrPXtkaXNhYmxlQ2VsbENsaWNrfVxuICAgICAgZGlzYWJsZUV2ZW50Q2xpY2s9e2Rpc2FibGVFdmVudENsaWNrfVxuICAgICAgZGlzYWJsZURyYWdBbmREcm9wPXtkaXNhYmxlRHJhZ0FuZERyb3B9XG4gICAgICBkYXlNYXhFdmVudHM9e2RheU1heEV2ZW50c31cbiAgICAgIHN0aWNreVZpZXdIZWFkZXI9e3N0aWNreVZpZXdIZWFkZXJ9XG4gICAgICB2aWV3SGVhZGVyQ2xhc3NOYW1lPXt2aWV3SGVhZGVyQ2xhc3NOYW1lfVxuICAgID5cbiAgICAgIDxDYWxlbmRhckNvbnRlbnQgLz5cbiAgICA8L0NhbGVuZGFyUHJvdmlkZXI+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHtcbiAgRG5kQ29udGV4dCxcbiAgRHJhZ092ZXJsYXksXG4gIE1vdXNlU2Vuc29yLFxuICBwb2ludGVyV2l0aGluLFxuICBUb3VjaFNlbnNvcixcbiAgdXNlU2Vuc29yLFxuICB1c2VTZW5zb3JzLFxufSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHtcbiAgRHJhZ0NhbmNlbEV2ZW50LFxuICBEcmFnRW5kRXZlbnQsXG4gIERyYWdTdGFydEV2ZW50LFxufSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgc25hcENlbnRlclRvQ3Vyc29yIH0gZnJvbSAnQGRuZC1raXQvbW9kaWZpZXJzJ1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuXG5pbnRlcmZhY2UgQ2FsZW5kYXJEbmRDb250ZXh0UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDYWxlbmRhckRuZENvbnRleHQoeyBjaGlsZHJlbiB9OiBDYWxlbmRhckRuZENvbnRleHRQcm9wcykge1xuICBjb25zdCB7IHVwZGF0ZUV2ZW50LCB2aWV3LCBkaXNhYmxlRHJhZ0FuZERyb3AgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IFthY3RpdmVFdmVudCwgc2V0QWN0aXZlRXZlbnRdID0gUmVhY3QudXNlU3RhdGU8Q2FsZW5kYXJFdmVudCB8IG51bGw+KFxuICAgIG51bGxcbiAgKVxuXG4gIC8vIENvbmZpZ3VyZSBzZW5zb3JzIHdpdGggcmVkdWNlZCBhY3RpdmF0aW9uIGNvbnN0cmFpbnRzIGZvciBlYXNpZXIgZHJhZ2dpbmdcbiAgY29uc3QgbW91c2VTZW5zb3IgPSB1c2VTZW5zb3IoTW91c2VTZW5zb3IsIHtcbiAgICAvLyBSZXF1aXJlIG1pbmltYWwgbW92ZW1lbnQgYmVmb3JlIGFjdGl2YXRpbmdcbiAgICBhY3RpdmF0aW9uQ29uc3RyYWludDoge1xuICAgICAgZGlzdGFuY2U6IDIsXG4gICAgfSxcbiAgfSlcblxuICBjb25zdCB0b3VjaFNlbnNvciA9IHVzZVNlbnNvcihUb3VjaFNlbnNvciwge1xuICAgIC8vIFJlZHVjZSBkZWxheSBmb3IgdG91Y2ggZGV2aWNlc1xuICAgIGFjdGl2YXRpb25Db25zdHJhaW50OiB7XG4gICAgICBkZWxheTogMTAwLFxuICAgICAgdG9sZXJhbmNlOiA1LFxuICAgIH0sXG4gIH0pXG5cbiAgY29uc3Qgc2Vuc29ycyA9IHVzZVNlbnNvcnMobW91c2VTZW5zb3IsIHRvdWNoU2Vuc29yKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdTdGFydCA9IChldmVudDogRHJhZ1N0YXJ0RXZlbnQpID0+IHtcbiAgICBjb25zdCB7IGFjdGl2ZSB9ID0gZXZlbnRcblxuICAgIC8vIFNldCB0aGUgYWN0aXZlIGV2ZW50IGJhc2VkIG9uIHRoZSBldmVudCBkYXRhXG4gICAgaWYgKGFjdGl2ZS5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICdjYWxlbmRhci1ldmVudCcpIHtcbiAgICAgIHNldEFjdGl2ZUV2ZW50KGFjdGl2ZS5kYXRhLmN1cnJlbnQuZXZlbnQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRHJhZ0VuZCA9IChldmVudDogRHJhZ0VuZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBhY3RpdmUsIG92ZXIgfSA9IGV2ZW50XG5cbiAgICBpZiAoIWFjdGl2ZSB8fCAhb3ZlciB8fCAhYWN0aXZlRXZlbnQpIHtcbiAgICAgIHNldEFjdGl2ZUV2ZW50KG51bGwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAob3Zlci5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICd0aW1lLWNlbGwnKSB7XG4gICAgICBjb25zdCB7IGRhdGUsIGhvdXIgPSAwLCBtaW51dGUgPSAwIH0gPSBvdmVyLmRhdGEuY3VycmVudFxuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGV2ZW50IGR1cmF0aW9uIGluIG1pbnV0ZXNcbiAgICAgIGNvbnN0IG9yaWdpbmFsU3RhcnQgPSBhY3RpdmVFdmVudC5vcmlnaW5hbFN0YXJ0ID8/IGFjdGl2ZUV2ZW50LnN0YXJ0XG4gICAgICBjb25zdCBvcmlnaW5hbEVuZCA9IGFjdGl2ZUV2ZW50Lm9yaWdpbmFsRW5kID8/IGFjdGl2ZUV2ZW50LmVuZFxuICAgICAgY29uc3QgZHVyYXRpb25NaW51dGVzID0gb3JpZ2luYWxFbmQuZGlmZihvcmlnaW5hbFN0YXJ0LCAnbWludXRlJylcblxuICAgICAgLy8gQ3JlYXRlIG5ldyBzdGFydCB0aW1lIGJhc2VkIG9uIHRoZSBkcm9wIHRhcmdldFxuICAgICAgY29uc3QgbmV3U3RhcnQgPSBkYXlqcyhkYXRlKVxuICAgICAgICAuaG91cihob3VyKVxuICAgICAgICAubWludXRlKG1pbnV0ZSB8fCAwKVxuXG4gICAgICAvLyBDcmVhdGUgbmV3IGVuZCB0aW1lIGJ5IGFkZGluZyB0aGUgb3JpZ2luYWwgZHVyYXRpb25cbiAgICAgIGxldCBuZXdFbmQgPSBuZXdTdGFydC5hZGQoZHVyYXRpb25NaW51dGVzLCAnbWludXRlJylcbiAgICAgIGlmIChuZXdFbmQuaXNTYW1lKG5ld0VuZC5zdGFydE9mKCdkYXknKSkpIHtcbiAgICAgICAgLy8gSWYgdGhlIG5ldyBlbmQgdGltZSBpcyBhdCBtaWRuaWdodCwgc2V0IGl0IHRvIDI0IGhvdXJzIG9mIHBhcnRpYWwgZGF5XG4gICAgICAgIG5ld0VuZCA9IG5ld0VuZC5zdWJ0cmFjdCgxLCAnZGF5JykuZW5kT2YoJ2RheScpXG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZXZlbnQgd2l0aCBuZXcgdGltZXNcbiAgICAgIHVwZGF0ZUV2ZW50KGFjdGl2ZUV2ZW50LmlkLCB7XG4gICAgICAgIHN0YXJ0OiBuZXdTdGFydCxcbiAgICAgICAgZW5kOiBuZXdFbmQsXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAob3Zlci5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICdkYXktY2VsbCcpIHtcbiAgICAgIGNvbnN0IHsgZGF0ZSB9ID0gb3Zlci5kYXRhLmN1cnJlbnRcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSBkYXlqcyhkYXRlKVxuXG4gICAgICAvLyBGb3IgbXVsdGktZGF5IGV2ZW50cywgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgZHVyYXRpb24gaW4gZGF5c1xuICAgICAgY29uc3QgaXNNdWx0aURheUV2ZW50ID0gIWFjdGl2ZUV2ZW50LnN0YXJ0LmlzU2FtZShhY3RpdmVFdmVudC5lbmQsICdkYXknKVxuICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydCA9IGFjdGl2ZUV2ZW50Lm9yaWdpbmFsU3RhcnQgPz8gYWN0aXZlRXZlbnQuc3RhcnRcbiAgICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gYWN0aXZlRXZlbnQub3JpZ2luYWxFbmQgPz8gYWN0aXZlRXZlbnQuZW5kXG5cbiAgICAgIGlmIChpc011bHRpRGF5RXZlbnQpIHtcbiAgICAgICAgaWYgKHZpZXcgPT09ICd3ZWVrJykge1xuICAgICAgICAgIC8vIEdldCB0aW1lIGNvbXBvbmVudHMgdG8gcHJlc2VydmVcbiAgICAgICAgICBjb25zdCBzdGFydEhvdXIgPSBvcmlnaW5hbFN0YXJ0LmhvdXIoKVxuICAgICAgICAgIGNvbnN0IHN0YXJ0TWludXRlID0gb3JpZ2luYWxTdGFydC5taW51dGUoKVxuICAgICAgICAgIGNvbnN0IGVuZEhvdXIgPSBvcmlnaW5hbEVuZC5ob3VyKClcbiAgICAgICAgICBjb25zdCBlbmRNaW51dGUgPSBvcmlnaW5hbEVuZC5taW51dGUoKVxuXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIGR1cmF0aW9uIGluIGRheXMgdG8gcHJlc2VydmVcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbkRheXMgPSBvcmlnaW5hbEVuZC5kaWZmKG9yaWdpbmFsU3RhcnQsICdkYXknKVxuXG4gICAgICAgICAgLy8gQ3JlYXRlIG5ldyBzdGFydCBhbmQgZW5kIGRhdGVzXG4gICAgICAgICAgY29uc3QgbmV3U3RhcnQgPSBuZXdEYXRlXG4gICAgICAgICAgICAuc3RhcnRPZignZGF5JylcbiAgICAgICAgICAgIC5ob3VyKHN0YXJ0SG91cilcbiAgICAgICAgICAgIC5taW51dGUoc3RhcnRNaW51dGUpXG4gICAgICAgICAgY29uc3QgbmV3RW5kID0gbmV3U3RhcnRcbiAgICAgICAgICAgIC5hZGQoZHVyYXRpb25EYXlzLCAnZGF5JylcbiAgICAgICAgICAgIC5ob3VyKGVuZEhvdXIpXG4gICAgICAgICAgICAubWludXRlKGVuZE1pbnV0ZSlcblxuICAgICAgICAgIHVwZGF0ZUV2ZW50KGFjdGl2ZUV2ZW50LmlkLCB7XG4gICAgICAgICAgICBzdGFydDogbmV3U3RhcnQsXG4gICAgICAgICAgICBlbmQ6IG5ld0VuZCxcbiAgICAgICAgICAgIG9yaWdpbmFsU3RhcnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9yaWdpbmFsRW5kOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3Igb3RoZXIgdmlld3MgbGlrZSBtb250aCB2aWV3XG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkYXRlIHNoaWZ0IChob3cgbWFueSBkYXlzIHdlJ3JlIG1vdmluZyB0aGUgZXZlbnQpXG4gICAgICAgICAgY29uc3QgZGF5c0RpZmZlcmVuY2UgPSBuZXdEYXRlLmRpZmYoXG4gICAgICAgICAgICBvcmlnaW5hbFN0YXJ0LnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgJ2RheSdcbiAgICAgICAgICApXG5cbiAgICAgICAgICAvLyBDYWxjdWxhdGUgbmV3IHN0YXJ0IGFuZCBlbmQgd2hpbGUgcHJlc2VydmluZyB0aW1lIGNvbXBvbmVudHNcbiAgICAgICAgICBjb25zdCBuZXdTdGFydCA9IG9yaWdpbmFsU3RhcnQuYWRkKGRheXNEaWZmZXJlbmNlLCAnZGF5JylcbiAgICAgICAgICBjb25zdCBuZXdFbmQgPSBvcmlnaW5hbEVuZC5hZGQoZGF5c0RpZmZlcmVuY2UsICdkYXknKVxuXG4gICAgICAgICAgdXBkYXRlRXZlbnQoYWN0aXZlRXZlbnQuaWQsIHtcbiAgICAgICAgICAgIHN0YXJ0OiBuZXdTdGFydCxcbiAgICAgICAgICAgIGVuZDogbmV3RW5kLFxuICAgICAgICAgICAgb3JpZ2luYWxTdGFydDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3JpZ2luYWxFbmQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igc2luZ2xlLWRheSBldmVudHMsIG1haW50YWluIHRoZSB0aW1lIGJ1dCBjaGFuZ2UgdGhlIGRhdGVcbiAgICAgICAgY29uc3QgbmV3U3RhcnQgPSBuZXdEYXRlXG4gICAgICAgICAgLmhvdXIoYWN0aXZlRXZlbnQuc3RhcnQuaG91cigpKVxuICAgICAgICAgIC5taW51dGUoYWN0aXZlRXZlbnQuc3RhcnQubWludXRlKCkpXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGV2ZW50IGR1cmF0aW9uIGFuZCBzZXQgbmV3IGVuZCB0aW1lXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uTWludXRlcyA9IGFjdGl2ZUV2ZW50LmVuZC5kaWZmKFxuICAgICAgICAgIGFjdGl2ZUV2ZW50LnN0YXJ0LFxuICAgICAgICAgICdtaW51dGUnXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgbmV3RW5kID0gbmV3U3RhcnQuYWRkKGR1cmF0aW9uTWludXRlcywgJ21pbnV0ZScpXG5cbiAgICAgICAgdXBkYXRlRXZlbnQoYWN0aXZlRXZlbnQuaWQsIHtcbiAgICAgICAgICBzdGFydDogbmV3U3RhcnQsXG4gICAgICAgICAgZW5kOiBuZXdFbmQsXG4gICAgICAgICAgb3JpZ2luYWxTdGFydDogdW5kZWZpbmVkLFxuICAgICAgICAgIG9yaWdpbmFsRW5kOiB1bmRlZmluZWQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlRXZlbnQobnVsbClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURyYWdDYW5jZWwgPSAoX2V2ZW50OiBEcmFnQ2FuY2VsRXZlbnQpID0+IHtcbiAgICBzZXRBY3RpdmVFdmVudChudWxsKVxuICB9XG5cbiAgLy8gSWYgZHJhZyBhbmQgZHJvcCBpcyBkaXNhYmxlZCwganVzdCByZXR1cm4gY2hpbGRyZW4gd2l0aG91dCBEbmRDb250ZXh0XG4gIGlmIChkaXNhYmxlRHJhZ0FuZERyb3ApIHtcbiAgICByZXR1cm4gY2hpbGRyZW4gYXMgUmVhY3QuUmVhY3RFbGVtZW50XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxEbmRDb250ZXh0XG4gICAgICBzZW5zb3JzPXtzZW5zb3JzfVxuICAgICAgb25EcmFnU3RhcnQ9e2hhbmRsZURyYWdTdGFydH1cbiAgICAgIG9uRHJhZ0VuZD17aGFuZGxlRHJhZ0VuZH1cbiAgICAgIG9uRHJhZ0NhbmNlbD17aGFuZGxlRHJhZ0NhbmNlbH1cbiAgICAgIGNvbGxpc2lvbkRldGVjdGlvbj17cG9pbnRlcldpdGhpbn1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICA8RHJhZ092ZXJsYXkgbW9kaWZpZXJzPXtbc25hcENlbnRlclRvQ3Vyc29yXX0+XG4gICAgICAgIHthY3RpdmVFdmVudCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ2N1cnNvci1ncmFiIHRydW5jYXRlIHJvdW5kZWQgYmctYW1iZXItMjAwIHAtMiB0ZXh0LVsxMHB4XSBzaGFkb3ctbGcgc206dGV4dC14cycsXG4gICAgICAgICAgICAgIGFjdGl2ZUV2ZW50LmJhY2tncm91bmRDb2xvciB8fCAnYmctYmx1ZS01MDAnLFxuICAgICAgICAgICAgICBhY3RpdmVFdmVudC5jb2xvciB8fCAndGV4dC13aGl0ZSdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2FjdGl2ZUV2ZW50Py50aXRsZX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvRHJhZ092ZXJsYXk+XG4gICAgPC9EbmRDb250ZXh0PlxuICApXG59XG4iLAogICAgImltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgUmVhY3QsIHtcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlU3RhdGUsXG4gIHR5cGUgUmVhY3ROb2RlLFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IENhbGVuZGFyQ29udGV4dCB9IGZyb20gJy4vY29udGV4dCdcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcblxuaW50ZXJmYWNlIENhbGVuZGFyUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcbiAgZXZlbnRzPzogQ2FsZW5kYXJFdmVudFtdXG4gIGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyIC8vIDAgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5LCBldGMuXG4gIHJlbmRlckV2ZW50PzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBSZWFjdE5vZGVcbiAgb25FdmVudENsaWNrPzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIG9uQ2VsbENsaWNrPzogKHN0YXJ0RGF0ZTogZGF5anMuRGF5anMsIGVuZERhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIG9uVmlld0NoYW5nZT86ICh2aWV3OiAnbW9udGgnIHwgJ3dlZWsnIHwgJ2RheScgfCAneWVhcicpID0+IHZvaWRcbiAgbG9jYWxlPzogc3RyaW5nXG4gIHRpbWV6b25lPzogc3RyaW5nXG4gIGRpc2FibGVDZWxsQ2xpY2s/OiBib29sZWFuXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICBkaXNhYmxlRHJhZ0FuZERyb3A/OiBib29sZWFuXG4gIGRheU1heEV2ZW50czogbnVtYmVyXG4gIHN0aWNreVZpZXdIZWFkZXI6IGJvb2xlYW5cbiAgdmlld0hlYWRlckNsYXNzTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBDYWxlbmRhclByb3ZpZGVyOiBSZWFjdC5GQzxDYWxlbmRhclByb3ZpZGVyUHJvcHM+ID0gKHtcbiAgY2hpbGRyZW4sXG4gIGV2ZW50cyA9IFtdLFxuICBmaXJzdERheU9mV2VlayA9IDAsIC8vIERlZmF1bHQgdG8gU3VuZGF5LFxuICByZW5kZXJFdmVudCxcbiAgb25FdmVudENsaWNrLFxuICBvbkNlbGxDbGljayxcbiAgb25WaWV3Q2hhbmdlLFxuICBsb2NhbGUsXG4gIHRpbWV6b25lLFxuICBkaXNhYmxlQ2VsbENsaWNrLFxuICBkaXNhYmxlRXZlbnRDbGljayxcbiAgZGlzYWJsZURyYWdBbmREcm9wLFxuICBkYXlNYXhFdmVudHMsXG4gIHN0aWNreVZpZXdIZWFkZXIsXG4gIHZpZXdIZWFkZXJDbGFzc05hbWUsXG59KSA9PiB7XG4gIC8vIFN0YXRlXG4gIGNvbnN0IFtjdXJyZW50RGF0ZSwgc2V0Q3VycmVudERhdGVdID0gdXNlU3RhdGU8ZGF5anMuRGF5anM+KGRheWpzKCkpXG4gIGNvbnN0IFt2aWV3LCBzZXRWaWV3XSA9IHVzZVN0YXRlPCdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJz4oJ21vbnRoJylcbiAgY29uc3QgW2N1cnJlbnRFdmVudHMsIHNldEN1cnJlbnRFdmVudHNdID0gdXNlU3RhdGU8Q2FsZW5kYXJFdmVudFtdPihldmVudHMpXG4gIGNvbnN0IFtpc0V2ZW50Rm9ybU9wZW4sIHNldElzRXZlbnRGb3JtT3Blbl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSlcbiAgY29uc3QgW3NlbGVjdGVkRXZlbnQsIHNldFNlbGVjdGVkRXZlbnRdID0gdXNlU3RhdGU8Q2FsZW5kYXJFdmVudCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtzZWxlY3RlZERhdGUsIHNldFNlbGVjdGVkRGF0ZV0gPSB1c2VTdGF0ZTxkYXlqcy5EYXlqcyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtjdXJyZW50TG9jYWxlLCBzZXRDdXJyZW50TG9jYWxlXSA9IHVzZVN0YXRlPHN0cmluZz4obG9jYWxlIHx8ICdlbicpXG4gIGNvbnN0IFtjdXJyZW50VGltZXpvbmUsIHNldEN1cnJlbnRUaW1lem9uZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KHRpbWV6b25lIHx8ICcnKVxuXG4gIC8vIFVwZGF0ZSBldmVudHMgd2hlbiBldmVudHMgcHJvcCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGV2ZW50cykge1xuICAgICAgc2V0Q3VycmVudEV2ZW50cyhldmVudHMpXG4gICAgfVxuICB9LCBbZXZlbnRzXSlcblxuICAvLyBDb25maWd1cmUgbG9jYWxlIHdoZW4gbG9jYWxlIHByb3AgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsb2NhbGUpIHtcbiAgICAgIHNldEN1cnJlbnRMb2NhbGUobG9jYWxlKVxuICAgICAgZGF5anMubG9jYWxlKGxvY2FsZSlcbiAgICB9XG4gIH0sIFtsb2NhbGVdKVxuXG4gIC8vIENvbmZpZ3VyZSB0aW1lem9uZSBmb3IgY3VycmVudERhdGUgd2hlbiB0aW1lem9uZSBwcm9wIGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodGltZXpvbmUpIHtcbiAgICAgIHNldEN1cnJlbnRUaW1lem9uZSh0aW1lem9uZSlcbiAgICAgIGRheWpzLnR6LnNldERlZmF1bHQodGltZXpvbmUpXG4gICAgfVxuICB9LCBbdGltZXpvbmVdKVxuXG4gIC8vIEhhbmRsZXJzXG4gIGNvbnN0IHNlbGVjdERhdGUgPSB1c2VDYWxsYmFjaygoZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICBzZXRDdXJyZW50RGF0ZShkYXRlKVxuICB9LCBbXSlcblxuICBjb25zdCBuZXh0UGVyaW9kID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHN3aXRjaCAodmlldykge1xuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLmFkZCgxLCAnbW9udGgnKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLmFkZCgxLCAnd2VlaycpKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgc2V0Q3VycmVudERhdGUoKGN1cnJlbnREYXRlKSA9PiBjdXJyZW50RGF0ZS5hZGQoMSwgJ2RheScpKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIHNldEN1cnJlbnREYXRlKChjdXJyZW50RGF0ZSkgPT4gY3VycmVudERhdGUuYWRkKDEsICd5ZWFyJykpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9LCBbdmlld10pXG5cbiAgY29uc3QgcHJldlBlcmlvZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzd2l0Y2ggKHZpZXcpIHtcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgc2V0Q3VycmVudERhdGUoKGN1cnJlbnREYXRlKSA9PiBjdXJyZW50RGF0ZS5zdWJ0cmFjdCgxLCAnbW9udGgnKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICd3ZWVrJykpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdkYXknOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICdkYXknKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICd5ZWFyJykpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9LCBbdmlld10pXG5cbiAgY29uc3QgdG9kYXkgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0Q3VycmVudERhdGUoZGF5anMoKSlcbiAgfSwgW10pXG5cbiAgY29uc3QgYWRkRXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBzZXRDdXJyZW50RXZlbnRzKChwcmV2RXZlbnRzKSA9PiBbLi4ucHJldkV2ZW50cywgZXZlbnRdKVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVFdmVudCA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudElkOiBzdHJpbmcsIHVwZGF0ZWRFdmVudDogUGFydGlhbDxDYWxlbmRhckV2ZW50PikgPT4ge1xuICAgICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT5cbiAgICAgICAgcHJldkV2ZW50cy5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgIGV2ZW50LmlkID09PSBldmVudElkID8geyAuLi5ldmVudCwgLi4udXBkYXRlZEV2ZW50IH0gOiBldmVudFxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3QgZGVsZXRlRXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT5cbiAgICAgIHByZXZFdmVudHMuZmlsdGVyKChldmVudCkgPT4gZXZlbnQuaWQgIT09IGV2ZW50SWQpXG4gICAgKVxuICB9LCBbXSlcblxuICBjb25zdCBlZGl0RXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBzZXRTZWxlY3RlZEV2ZW50KGV2ZW50KVxuICAgIHNldElzRXZlbnRGb3JtT3Blbih0cnVlKVxuICB9LCBbXSlcblxuICBjb25zdCBjbG9zZUV2ZW50Rm9ybSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTZWxlY3RlZERhdGUobnVsbClcbiAgICBzZXRTZWxlY3RlZEV2ZW50KG51bGwpXG4gICAgc2V0SXNFdmVudEZvcm1PcGVuKGZhbHNlKVxuICB9LCBbXSlcblxuICAvLyBDdXN0b20gaGFuZGxlcnMgdGhhdCBjYWxsIGV4dGVybmFsIGNhbGxiYWNrc1xuICBjb25zdCBoYW5kbGVWaWV3Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZpZXc6ICdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJykgPT4ge1xuICAgICAgc2V0VmlldyhuZXdWaWV3KVxuICAgICAgb25WaWV3Q2hhbmdlPy4obmV3VmlldylcbiAgICB9LFxuICAgIFtvblZpZXdDaGFuZ2VdXG4gIClcblxuICBjb25zdCBoYW5kbGVFdmVudENsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgICBpZiAoZGlzYWJsZUNlbGxDbGljaykgcmV0dXJuXG4gICAgICBpZiAob25FdmVudENsaWNrKSB7XG4gICAgICAgIG9uRXZlbnRDbGljayhldmVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkaXRFdmVudChldmVudClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtkaXNhYmxlQ2VsbENsaWNrLCBvbkV2ZW50Q2xpY2ssIGVkaXRFdmVudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZURhdGVDbGljayA9IHVzZUNhbGxiYWNrKFxuICAgIChzdGFydERhdGU6IGRheWpzLkRheWpzLCBlbmREYXRlOiBkYXlqcy5EYXlqcykgPT4ge1xuICAgICAgaWYgKGRpc2FibGVDZWxsQ2xpY2spIHJldHVyblxuXG4gICAgICBpZiAob25DZWxsQ2xpY2spIHtcbiAgICAgICAgb25DZWxsQ2xpY2soc3RhcnREYXRlLCBlbmREYXRlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U2VsZWN0ZWREYXRlKHN0YXJ0RGF0ZSlcbiAgICAgICAgc2V0U2VsZWN0ZWRFdmVudCh7XG4gICAgICAgICAgdGl0bGU6IGBOZXcgRXZlbnRgLFxuICAgICAgICAgIHN0YXJ0OiBzdGFydERhdGUsXG4gICAgICAgICAgZW5kOiBlbmREYXRlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICBhbGxEYXk6IGZhbHNlLFxuICAgICAgICAgIGlzUmVjdXJyaW5nOiBmYWxzZSxcbiAgICAgICAgICByZWN1cnJlbmNlOiBudWxsLFxuICAgICAgICAgIHBhcmVudEV2ZW50SWQ6IG51bGwsXG4gICAgICAgIH0gYXMgQ2FsZW5kYXJFdmVudClcbiAgICAgICAgc2V0SXNFdmVudEZvcm1PcGVuKHRydWUpXG4gICAgICB9XG4gICAgfSxcbiAgICBbb25DZWxsQ2xpY2ssIGRpc2FibGVDZWxsQ2xpY2tdXG4gIClcblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBuZXh0IG9jY3VycmVuY2UgYmFzZWQgb24gZnJlcXVlbmN5XG4gIGNvbnN0IGdldE5leHRPY2N1cnJlbmNlID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZGF0ZTogZGF5anMuRGF5anMsXG4gICAgICBmcmVxOiAnZGFpbHknIHwgJ3dlZWtseScgfCAnbW9udGhseScgfCAneWVhcmx5JyxcbiAgICAgIGludDogbnVtYmVyLFxuICAgICAgZGF5cz86IG51bWJlcltdXG4gICAgKTogZGF5anMuRGF5anMgPT4ge1xuICAgICAgc3dpdGNoIChmcmVxKSB7XG4gICAgICAgIGNhc2UgJ2RhaWx5JzpcbiAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnZGF5JylcbiAgICAgICAgY2FzZSAnd2Vla2x5JzpcbiAgICAgICAgICBpZiAoZGF5cyAmJiBkYXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc3BlY2lmaWMgZGF5cyBvZiB0aGUgd2VlaywgZmluZCB0aGUgbmV4dCBkYXkgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIGxldCBuZXh0RGF0ZSA9IGRhdGUuYWRkKDEsICdkYXknKVxuICAgICAgICAgICAgbGV0IGxvb3BDb3VudCA9IDBcblxuICAgICAgICAgICAgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wIC0gbWF4aW11bSA3IGl0ZXJhdGlvbnMgdG8gZmluZCB0aGUgbmV4dCBkYXlcbiAgICAgICAgICAgIHdoaWxlIChsb29wQ291bnQgPCA3KSB7XG4gICAgICAgICAgICAgIGlmIChkYXlzLmluY2x1ZGVzKG5leHREYXRlLmRheSgpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0RGF0ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5leHREYXRlID0gbmV4dERhdGUuYWRkKDEsICdkYXknKVxuICAgICAgICAgICAgICBsb29wQ291bnQrK1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBuZXh0IGRheSwganVzdCBhZGQgdGhlIGludGVydmFsIHdlZWtzXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnd2VlaycpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwganVzdCBhZGQgdGhlIGludGVydmFsIHdlZWtzXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnd2VlaycpXG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdtb250aGx5JzpcbiAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnbW9udGgnKVxuICAgICAgICBjYXNlICd5ZWFybHknOlxuICAgICAgICAgIHJldHVybiBkYXRlLmFkZChpbnQsICd5ZWFyJylcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdXG4gIClcblxuICAvLyBFeHBhbmQgcmVjdXJyaW5nIGV2ZW50cyBmb3IgYSBkYXRlIHJhbmdlXG4gIGNvbnN0IGV4cGFuZFJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgYmFzZUV2ZW50OiBDYWxlbmRhckV2ZW50LFxuICAgICAgc3RhcnREYXRlOiBkYXlqcy5EYXlqcyxcbiAgICAgIGVuZERhdGU6IGRheWpzLkRheWpzXG4gICAgKTogQ2FsZW5kYXJFdmVudFtdID0+IHtcbiAgICAgIGNvbnN0IGV4cGFuZGVkRXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXVxuICAgICAgaWYgKCFiYXNlRXZlbnQucmVjdXJyZW5jZSkgcmV0dXJuIFtiYXNlRXZlbnRdXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZnJlcXVlbmN5LFxuICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgZW5kRGF0ZTogcmVjdXJyZW5jZUVuZERhdGUsXG4gICAgICAgIGNvdW50LFxuICAgICAgICBkYXlzT2ZXZWVrLFxuICAgICAgICBleGNlcHRpb25zID0gW10sXG4gICAgICB9ID0gYmFzZUV2ZW50LnJlY3VycmVuY2VcblxuICAgICAgLy8gR2V0IGV4aXN0aW5nIGV4Y2VwdGlvbnMgZnJvbSB0aGUgZXZlbnRzIGFycmF5XG4gICAgICBjb25zdCBleGlzdGluZ0V4Y2VwdGlvbnMgPSBldmVudHMuZmlsdGVyKFxuICAgICAgICAoZXZlbnQpID0+IGV2ZW50LnBhcmVudEV2ZW50SWQgPT09IGJhc2VFdmVudC5pZCAmJiBldmVudC5pc0V4Y2VwdGlvblxuICAgICAgKVxuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uIG9mIHRoZSBldmVudFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBiYXNlRXZlbnQuZW5kLmRpZmYoYmFzZUV2ZW50LnN0YXJ0LCAnbWludXRlJylcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGVuZCBkYXRlIGZvciByZWN1cnJlbmNlXG4gICAgICBjb25zdCBtYXhFbmREYXRlID1cbiAgICAgICAgcmVjdXJyZW5jZUVuZERhdGUgJiYgcmVjdXJyZW5jZUVuZERhdGUuaXNCZWZvcmUoZW5kRGF0ZSlcbiAgICAgICAgICA/IHJlY3VycmVuY2VFbmREYXRlXG4gICAgICAgICAgOiBlbmREYXRlXG5cbiAgICAgIGxldCBjdXJyZW50RGF0ZSA9IGJhc2VFdmVudC5zdGFydC5jbG9uZSgpXG4gICAgICBsZXQgb2NjdXJyZW5jZXMgPSAwXG5cbiAgICAgIC8vIElmIHRoZSByZWN1cnJpbmcgZXZlbnQgc3RhcnRzIGFmdGVyIHRoZSBlbmQgb2Ygb3VyIHJhbmdlLCBubyBldmVudHMgdG8gZ2VuZXJhdGVcbiAgICAgIGlmIChjdXJyZW50RGF0ZS5pc0FmdGVyKG1heEVuZERhdGUpKSB7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSBuZWVkIHRvIHN0YXJ0IGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnJlbmNlIHBhdHRlcm4sXG4gICAgICAvLyBmYXN0LWZvcndhcmQgdG8gZmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBvdXIgZGF0ZSByYW5nZVxuICAgICAgaWYgKGN1cnJlbnREYXRlLmlzQmVmb3JlKHN0YXJ0RGF0ZSkpIHtcbiAgICAgICAgc3dpdGNoIChmcmVxdWVuY3kpIHtcbiAgICAgICAgICBjYXNlICdkYWlseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGRheXNUb0FkZCA9XG4gICAgICAgICAgICAgIE1hdGguZmxvb3Ioc3RhcnREYXRlLmRpZmYoY3VycmVudERhdGUsICdkYXknKSAvIGludGVydmFsKSAqXG4gICAgICAgICAgICAgIGludGVydmFsXG4gICAgICAgICAgICBpZiAoZGF5c1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZChkYXlzVG9BZGQsICdkYXknKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnd2Vla2x5Jzoge1xuICAgICAgICAgICAgaWYgKCFkYXlzT2ZXZWVrIHx8IGRheXNPZldlZWsubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdlZWtzVG9BZGQgPVxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3Ioc3RhcnREYXRlLmRpZmYoY3VycmVudERhdGUsICd3ZWVrJykgLyBpbnRlcnZhbCkgKlxuICAgICAgICAgICAgICAgIGludGVydmFsXG4gICAgICAgICAgICAgIGlmICh3ZWVrc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGUuYWRkKHdlZWtzVG9BZGQsICd3ZWVrJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnbW9udGhseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG1vbnRoc1RvQWRkID1cbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihzdGFydERhdGUuZGlmZihjdXJyZW50RGF0ZSwgJ21vbnRoJykgLyBpbnRlcnZhbCkgKlxuICAgICAgICAgICAgICBpbnRlcnZhbFxuICAgICAgICAgICAgaWYgKG1vbnRoc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZChtb250aHNUb0FkZCwgJ21vbnRoJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3llYXJseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJzVG9BZGQgPVxuICAgICAgICAgICAgICBNYXRoLmZsb29yKHN0YXJ0RGF0ZS5kaWZmKGN1cnJlbnREYXRlLCAneWVhcicpIC8gaW50ZXJ2YWwpICpcbiAgICAgICAgICAgICAgaW50ZXJ2YWxcbiAgICAgICAgICAgIGlmICh5ZWFyc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZCh5ZWFyc1RvQWRkLCAneWVhcicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoXG4gICAgICAgIChjdXJyZW50RGF0ZS5pc0JlZm9yZShtYXhFbmREYXRlKSB8fFxuICAgICAgICAgIGN1cnJlbnREYXRlLmlzU2FtZShtYXhFbmREYXRlLCAnZGF5JykpICYmXG4gICAgICAgIChjb3VudCA9PT0gdW5kZWZpbmVkIHx8IG9jY3VycmVuY2VzIDwgY291bnQpXG4gICAgICApIHtcbiAgICAgICAgLy8gRm9ybWF0IGN1cnJlbnQgZGF0ZSBmb3IgY29tcGFyaXNvblxuICAgICAgICBjb25zdCBjdXJyZW50RGF0ZVN0ciA9IGN1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG5cbiAgICAgICAgLy8gU2tpcCBpZiB0aGlzIGRhdGUgaXMgaW4gZXhjZXB0aW9uc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhjZXB0aW9ucy5zb21lKFxuICAgICAgICAgICAgKGRhdGUpID0+IGRhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IGN1cnJlbnREYXRlU3RyXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IG9jY3VycmVuY2VcbiAgICAgICAgICBjdXJyZW50RGF0ZSA9IGdldE5leHRPY2N1cnJlbmNlKFxuICAgICAgICAgICAgY3VycmVudERhdGUsXG4gICAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgICAgIGRheXNPZldlZWtcbiAgICAgICAgICApXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaWYgaXQncyBhIHdlZWtseSByZWN1cnJlbmNlIHdpdGggc3BlY2lmaWVkIGRheXMgYW5kIGN1cnJlbnQgZGF5IGlzIG5vdCBpbmNsdWRlZFxuICAgICAgICBpZiAoXG4gICAgICAgICAgZnJlcXVlbmN5ID09PSAnd2Vla2x5JyAmJlxuICAgICAgICAgIGRheXNPZldlZWsgJiZcbiAgICAgICAgICBkYXlzT2ZXZWVrLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAhZGF5c09mV2Vlay5pbmNsdWRlcyhjdXJyZW50RGF0ZS5kYXkoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3VycmVudERhdGUgPSBjdXJyZW50RGF0ZS5hZGQoMSwgJ2RheScpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjdXN0b20gZXhjZXB0aW9uIGZvciB0aGlzIG9jY3VycmVuY2VcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uRXZlbnQgPSBleGlzdGluZ0V4Y2VwdGlvbnMuZmluZChcbiAgICAgICAgICAoZXZlbnQpID0+IGV2ZW50LnN0YXJ0LmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBjdXJyZW50RGF0ZVN0clxuICAgICAgICApXG5cbiAgICAgICAgaWYgKGV4Y2VwdGlvbkV2ZW50KSB7XG4gICAgICAgICAgLy8gVXNlIHRoZSBleGNlcHRpb24gaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgbmV3IGV2ZW50XG4gICAgICAgICAgZXhwYW5kZWRFdmVudHMucHVzaChleGNlcHRpb25FdmVudClcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RGF0ZS5pc0FmdGVyKHN0YXJ0RGF0ZS5zdWJ0cmFjdCgxLCAnZGF5JykpKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9jY3VycmVuY2UgaWYgaXQgZmFsbHMgd2l0aGluIHRoZSByZXF1ZXN0ZWQgcmFuZ2VcbiAgICAgICAgICBjb25zdCBldmVudEluc3RhbmNlOiBDYWxlbmRhckV2ZW50ID0ge1xuICAgICAgICAgICAgLi4uYmFzZUV2ZW50LFxuICAgICAgICAgICAgaWQ6IGAke2Jhc2VFdmVudC5pZH0tJHtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVlNTUREJyl9YCxcbiAgICAgICAgICAgIHN0YXJ0OiBjdXJyZW50RGF0ZS5jbG9uZSgpLFxuICAgICAgICAgICAgZW5kOiBjdXJyZW50RGF0ZS5jbG9uZSgpLmFkZChkdXJhdGlvbiwgJ21pbnV0ZScpLFxuICAgICAgICAgICAgaXNSZWN1cnJpbmc6IHRydWUsXG4gICAgICAgICAgICBwYXJlbnRFdmVudElkOiBiYXNlRXZlbnQuaWQsXG4gICAgICAgICAgfVxuICAgICAgICAgIGV4cGFuZGVkRXZlbnRzLnB1c2goZXZlbnRJbnN0YW5jZSlcbiAgICAgICAgfVxuXG4gICAgICAgIG9jY3VycmVuY2VzKytcbiAgICAgICAgY3VycmVudERhdGUgPSBnZXROZXh0T2NjdXJyZW5jZShcbiAgICAgICAgICBjdXJyZW50RGF0ZSxcbiAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgZGF5c09mV2Vla1xuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleHBhbmRlZEV2ZW50c1xuICAgIH0sXG4gICAgW2V2ZW50cywgZ2V0TmV4dE9jY3VycmVuY2VdXG4gIClcblxuICAvLyBFdmVudCBxdWVyeSBmdW5jdGlvbnNcbiAgY29uc3QgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKHN0YXJ0OiBkYXlqcy5EYXlqcywgZW5kOiBkYXlqcy5EYXlqcyk6IENhbGVuZGFyRXZlbnRbXSA9PiB7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSBzdGFydC5zdGFydE9mKCdkYXknKVxuICAgICAgY29uc3QgZW5kRGF0ZSA9IGVuZC5lbmRPZignZGF5JylcblxuICAgICAgLy8gRmlsdGVyIHJlZ3VsYXIgZXZlbnRzIGZpcnN0XG4gICAgICBjb25zdCByZWd1bGFyRXZlbnRzID0gZXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gRml4ZWQgbG9naWMgZm9yIGNoZWNraW5nIGlmIGV2ZW50IG92ZXJsYXBzIHdpdGggdGhlIGRhdGUgcmFuZ2VcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvLyBDYXNlIDE6IEV2ZW50IHN0YXJ0cyB3aXRoaW4gdGhlIHJhbmdlXG4gICAgICAgICAgKChldmVudC5zdGFydC5pc0FmdGVyKHN0YXJ0RGF0ZSkgfHwgZXZlbnQuc3RhcnQuaXNTYW1lKHN0YXJ0RGF0ZSkpICYmXG4gICAgICAgICAgICAoZXZlbnQuc3RhcnQuaXNCZWZvcmUoZW5kRGF0ZSkgfHwgZXZlbnQuc3RhcnQuaXNTYW1lKGVuZERhdGUpKSkgfHxcbiAgICAgICAgICAvLyBDYXNlIDI6IEV2ZW50IGVuZHMgd2l0aGluIHRoZSByYW5nZVxuICAgICAgICAgICgoZXZlbnQuZW5kLmlzQWZ0ZXIoc3RhcnREYXRlKSB8fCBldmVudC5lbmQuaXNTYW1lKHN0YXJ0RGF0ZSkpICYmXG4gICAgICAgICAgICAoZXZlbnQuZW5kLmlzQmVmb3JlKGVuZERhdGUpIHx8IGV2ZW50LmVuZC5pc1NhbWUoZW5kRGF0ZSkpKSB8fFxuICAgICAgICAgIC8vIENhc2UgMzogRXZlbnQgc3BhbnMgYWNyb3NzIHRoZSBlbnRpcmUgcmFuZ2VcbiAgICAgICAgICAoZXZlbnQuc3RhcnQuaXNCZWZvcmUoc3RhcnREYXRlKSAmJiBldmVudC5lbmQuaXNBZnRlcihlbmREYXRlKSlcbiAgICAgICAgKVxuICAgICAgfSlcblxuICAgICAgLy8gRmluZCBwYXJlbnQgcmVjdXJyaW5nIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgZXhwYW5kZWRcbiAgICAgIGNvbnN0IHJlY3VycmluZ1BhcmVudEV2ZW50cyA9IGV2ZW50cy5maWx0ZXIoXG4gICAgICAgIChldmVudCkgPT4gZXZlbnQucmVjdXJyZW5jZSAmJiAhZXZlbnQucGFyZW50RXZlbnRJZFxuICAgICAgKVxuXG4gICAgICAvLyBFeHBhbmQgcmVjdXJyaW5nIGV2ZW50cyBmb3IgdGhpcyByYW5nZVxuICAgICAgbGV0IHJlY3VycmluZ0V2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gW11cbiAgICAgIHJlY3VycmluZ1BhcmVudEV2ZW50cy5mb3JFYWNoKChwYXJlbnRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZFJlY3VycmluZ0V2ZW50KHBhcmVudEV2ZW50LCBzdGFydERhdGUsIGVuZERhdGUpXG4gICAgICAgIHJlY3VycmluZ0V2ZW50cyA9IFsuLi5yZWN1cnJpbmdFdmVudHMsIC4uLmV4cGFuZGVkXVxuICAgICAgfSlcblxuICAgICAgLy8gQ29tYmluZSBhbGwgZXZlbnRzIGFuZCByZW1vdmUgYW55IGR1cGxpY2F0ZXNcbiAgICAgIHJldHVybiBbLi4ucmVndWxhckV2ZW50cywgLi4ucmVjdXJyaW5nRXZlbnRzXS5maWx0ZXIoXG4gICAgICAgIChldmVudCwgaW5kZXgsIHNlbGYpID0+XG4gICAgICAgICAgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KChlKSA9PiBlLmlkID09PSBldmVudC5pZClcbiAgICAgIClcbiAgICB9LFxuICAgIFtldmVudHMsIGV4cGFuZFJlY3VycmluZ0V2ZW50XVxuICApXG5cbiAgY29uc3QgZ2V0RXZlbnRzRm9yRGF0ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChkYXRlOiBkYXlqcy5EYXlqcyk6IENhbGVuZGFyRXZlbnRbXSA9PiB7XG4gICAgICBjb25zdCBkYXkgPSBkYXRlLnN0YXJ0T2YoJ2RheScpXG4gICAgICBjb25zdCBuZXh0RGF5ID0gZGF5LmFkZCgxLCAnZGF5JylcbiAgICAgIHJldHVybiBnZXRFdmVudHNGb3JEYXRlUmFuZ2UoZGF5LCBuZXh0RGF5KVxuICAgIH0sXG4gICAgW2dldEV2ZW50c0ZvckRhdGVSYW5nZV1cbiAgKVxuXG4gIC8vIFJlY3VycmluZyBldmVudCBvcGVyYXRpb25zXG4gIGNvbnN0IGFkZFJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT4gWy4uLnByZXZFdmVudHMsIGV2ZW50XSlcbiAgfSwgW10pXG5cbiAgY29uc3QgZGVsZXRlUmVjdXJyaW5nRXZlbnQgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnRJZDogc3RyaW5nLCBkZWxldGVBbGw6IGJvb2xlYW4pID0+IHtcbiAgICAgIHNldEN1cnJlbnRFdmVudHMoKHByZXZFdmVudHMpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgZXZlbnQgYnkgSURcbiAgICAgICAgY29uc3QgZXZlbnQgPSBwcmV2RXZlbnRzLmZpbmQoKGUpID0+IGUuaWQgPT09IGV2ZW50SWQpXG4gICAgICAgIGlmICghZXZlbnQpIHJldHVybiBwcmV2RXZlbnRzXG5cbiAgICAgICAgaWYgKGV2ZW50LnBhcmVudEV2ZW50SWQgJiYgIWRlbGV0ZUFsbCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSByZWN1cnJpbmcgaW5zdGFuY2UsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgaW5zdGFuY2VcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIHBhcmVudCBldmVudFxuICAgICAgICAgIGNvbnN0IHBhcmVudEV2ZW50ID0gcHJldkV2ZW50cy5maW5kKFxuICAgICAgICAgICAgKGUpID0+IGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWRcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKCFwYXJlbnRFdmVudCB8fCAhcGFyZW50RXZlbnQucmVjdXJyZW5jZSkgcmV0dXJuIHByZXZFdmVudHNcblxuICAgICAgICAgIC8vIEFkZCB0aGlzIGRhdGUgdG8gdGhlIGV4Y2VwdGlvbnMgbGlzdFxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5lLFxuICAgICAgICAgICAgICAgIHJlY3VycmVuY2U6IHtcbiAgICAgICAgICAgICAgICAgIC4uLmUucmVjdXJyZW5jZSEsXG4gICAgICAgICAgICAgICAgICBleGNlcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIC4uLihlLnJlY3VycmVuY2UhLmV4Y2VwdGlvbnMgfHwgW10pLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdGFydC5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnBhcmVudEV2ZW50SWQgJiYgZGVsZXRlQWxsKSB7XG4gICAgICAgICAgLy8gV2Ugd2FudCB0byBkZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mIHRoaXMgcmVjdXJyaW5nIGV2ZW50XG4gICAgICAgICAgLy8gRmluZCB0aGUgcGFyZW50IElEIGFuZCBkZWxldGUgaXQgYW5kIGFsbCBpdHMgY2hpbGRyZW5cbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgZS5pZCAhPT0gZXZlbnQucGFyZW50RXZlbnRJZCAmJlxuICAgICAgICAgICAgICBlLnBhcmVudEV2ZW50SWQgIT09IGV2ZW50LnBhcmVudEV2ZW50SWRcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucmVjdXJyZW5jZSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBwYXJlbnQgcmVjdXJyaW5nIGV2ZW50LCBkZWxldGUgaXQgYW5kIGFsbCBpdHMgaW5zdGFuY2VzXG4gICAgICAgICAgcmV0dXJuIHByZXZFdmVudHMuZmlsdGVyKFxuICAgICAgICAgICAgKGUpID0+IGUuaWQgIT09IGV2ZW50LmlkICYmIGUucGFyZW50RXZlbnRJZCAhPT0gZXZlbnQuaWRcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVndWxhciBldmVudCwganVzdCBkZWxldGUgaXRcbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5maWx0ZXIoKGUpID0+IGUuaWQgIT09IGV2ZW50LmlkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IHVwZGF0ZVJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZXZlbnRJZDogc3RyaW5nLFxuICAgICAgdXBkYXRlZEV2ZW50OiBQYXJ0aWFsPENhbGVuZGFyRXZlbnQ+LFxuICAgICAgdXBkYXRlQWxsOiBib29sZWFuXG4gICAgKSA9PiB7XG4gICAgICBzZXRDdXJyZW50RXZlbnRzKChwcmV2RXZlbnRzKSA9PiB7XG4gICAgICAgIC8vIEZpbmQgdGhlIGV2ZW50IGJ5IElEXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gcHJldkV2ZW50cy5maW5kKChlKSA9PiBlLmlkID09PSBldmVudElkKVxuICAgICAgICBpZiAoIWV2ZW50KSByZXR1cm4gcHJldkV2ZW50c1xuXG4gICAgICAgIGlmIChldmVudC5wYXJlbnRFdmVudElkICYmICF1cGRhdGVBbGwpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVjdXJyaW5nIGluc3RhbmNlIGJlaW5nIHVwZGF0ZWQgaW5kaXZpZHVhbGx5XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYW4gZXhjZXB0aW9uIHdpdGggdGhlIHVwZGF0ZXNcbiAgICAgICAgICBjb25zdCBleGNlcHRpb25FdmVudDogQ2FsZW5kYXJFdmVudCA9IHtcbiAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgLi4udXBkYXRlZEV2ZW50LFxuICAgICAgICAgICAgaXNFeGNlcHRpb246IHRydWUsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWRkIHRoZSBleGNlcHRpb24gdG8gdGhlIHN0b3JlIGFuZCBhZGQgdGhpcyBkYXRlIHRvIHRoZSBwYXJlbnQncyBleGNlcHRpb25zIGxpc3RcbiAgICAgICAgICBjb25zdCB1cGRhdGVkRXZlbnRzID0gcHJldkV2ZW50cy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLmlkID09PSBldmVudC5wYXJlbnRFdmVudElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZSxcbiAgICAgICAgICAgICAgICByZWN1cnJlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAuLi5lLnJlY3VycmVuY2UhLFxuICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAuLi4oZS5yZWN1cnJlbmNlIS5leGNlcHRpb25zIHx8IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RhcnQuc3RhcnRPZignZGF5JyksXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiBbLi4udXBkYXRlZEV2ZW50cywgZXhjZXB0aW9uRXZlbnRdXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucGFyZW50RXZlbnRJZCAmJiB1cGRhdGVBbGwpIHtcbiAgICAgICAgICAvLyBVcGRhdGUgYWxsIG9jY3VycmVuY2VzIGJ5IHVwZGF0aW5nIHRoZSBwYXJlbnRcbiAgICAgICAgICAvLyBGaW5kIHRoZSBwYXJlbnQgYW5kIHVwZGF0ZSBpdFxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uZSwgLi4udXBkYXRlZEV2ZW50IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5yZWN1cnJlbmNlKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIHBhcmVudCByZWN1cnJpbmcgZXZlbnQsIHVwZGF0ZSBpdCBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LmlkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLmUsIC4uLnVwZGF0ZWRFdmVudCB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVndWxhciBldmVudCwganVzdCB1cGRhdGUgaXRcbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLmlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5lLCAuLi51cGRhdGVkRXZlbnQgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IGNyZWF0ZUV4Y2VwdGlvbkZvclJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50SWQ6IHN0cmluZywgZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICAgIHNldEN1cnJlbnRFdmVudHMoKHByZXZFdmVudHMpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgZXZlbnQgZmlyc3RcbiAgICAgICAgY29uc3QgZXZlbnQgPSBwcmV2RXZlbnRzLmZpbmQoKGUpID0+IGUuaWQgPT09IGV2ZW50SWQpXG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LnJlY3VycmVuY2UpIHJldHVybiBwcmV2RXZlbnRzXG5cbiAgICAgICAgLy8gQWRkIHRoZSBkYXRlIHRvIGV4Y2VwdGlvbnNcbiAgICAgICAgcmV0dXJuIHByZXZFdmVudHMubWFwKChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50SWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmUsXG4gICAgICAgICAgICAgIHJlY3VycmVuY2U6IHtcbiAgICAgICAgICAgICAgICAuLi5lLnJlY3VycmVuY2UhLFxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgIC4uLihlLnJlY3VycmVuY2UhLmV4Y2VwdGlvbnMgfHwgW10pLFxuICAgICAgICAgICAgICAgICAgZGF0ZS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LFxuICAgIFtdXG4gIClcblxuICAvLyBDcmVhdGUgdGhlIGNvbnRleHQgdmFsdWVcbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgY3VycmVudERhdGUsXG4gICAgICB2aWV3LFxuICAgICAgZXZlbnRzOiBjdXJyZW50RXZlbnRzLFxuICAgICAgY3VycmVudExvY2FsZSxcbiAgICAgIGlzRXZlbnRGb3JtT3BlbixcbiAgICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgICBzZWxlY3RlZERhdGUsXG4gICAgICBmaXJzdERheU9mV2VlayxcbiAgICAgIHNldEN1cnJlbnREYXRlLFxuICAgICAgc2VsZWN0RGF0ZSxcbiAgICAgIHNldFZpZXc6IGhhbmRsZVZpZXdDaGFuZ2UsXG4gICAgICBuZXh0UGVyaW9kLFxuICAgICAgcHJldlBlcmlvZCxcbiAgICAgIHRvZGF5LFxuICAgICAgYWRkRXZlbnQsXG4gICAgICB1cGRhdGVFdmVudCxcbiAgICAgIGRlbGV0ZUV2ZW50LFxuICAgICAgb3BlbkV2ZW50Rm9ybTogKCkgPT4gc2V0SXNFdmVudEZvcm1PcGVuKHRydWUpLFxuICAgICAgY2xvc2VFdmVudEZvcm0sXG4gICAgICBnZXRFdmVudHNGb3JEYXRlLFxuICAgICAgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlLFxuICAgICAgZXhwYW5kUmVjdXJyaW5nRXZlbnQsXG4gICAgICBhZGRSZWN1cnJpbmdFdmVudCxcbiAgICAgIGRlbGV0ZVJlY3VycmluZ0V2ZW50LFxuICAgICAgdXBkYXRlUmVjdXJyaW5nRXZlbnQsXG4gICAgICBjcmVhdGVFeGNlcHRpb25Gb3JSZWN1cnJpbmdFdmVudCxcbiAgICAgIHJlbmRlckV2ZW50LFxuICAgICAgb25FdmVudENsaWNrOiBoYW5kbGVFdmVudENsaWNrLFxuICAgICAgb25DZWxsQ2xpY2s6IGhhbmRsZURhdGVDbGljayxcbiAgICAgIGxvY2FsZSxcbiAgICAgIHRpbWV6b25lOiBjdXJyZW50VGltZXpvbmUsXG4gICAgICBkaXNhYmxlQ2VsbENsaWNrLFxuICAgICAgZGlzYWJsZUV2ZW50Q2xpY2ssXG4gICAgICBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gICAgICBkYXlNYXhFdmVudHMsXG4gICAgICBzdGlja3lWaWV3SGVhZGVyLFxuICAgICAgdmlld0hlYWRlckNsYXNzTmFtZSxcbiAgICB9KSxcbiAgICBbXG4gICAgICBjdXJyZW50RGF0ZSxcbiAgICAgIHZpZXcsXG4gICAgICBjdXJyZW50RXZlbnRzLFxuICAgICAgY3VycmVudExvY2FsZSxcbiAgICAgIGlzRXZlbnRGb3JtT3BlbixcbiAgICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgICBzZWxlY3RlZERhdGUsXG4gICAgICBmaXJzdERheU9mV2VlayxcbiAgICAgIHNlbGVjdERhdGUsXG4gICAgICBoYW5kbGVWaWV3Q2hhbmdlLFxuICAgICAgbmV4dFBlcmlvZCxcbiAgICAgIHByZXZQZXJpb2QsXG4gICAgICB0b2RheSxcbiAgICAgIGFkZEV2ZW50LFxuICAgICAgdXBkYXRlRXZlbnQsXG4gICAgICBkZWxldGVFdmVudCxcbiAgICAgIGNsb3NlRXZlbnRGb3JtLFxuICAgICAgZ2V0RXZlbnRzRm9yRGF0ZSxcbiAgICAgIGdldEV2ZW50c0ZvckRhdGVSYW5nZSxcbiAgICAgIGV4cGFuZFJlY3VycmluZ0V2ZW50LFxuICAgICAgYWRkUmVjdXJyaW5nRXZlbnQsXG4gICAgICBkZWxldGVSZWN1cnJpbmdFdmVudCxcbiAgICAgIHVwZGF0ZVJlY3VycmluZ0V2ZW50LFxuICAgICAgY3JlYXRlRXhjZXB0aW9uRm9yUmVjdXJyaW5nRXZlbnQsXG4gICAgICByZW5kZXJFdmVudCxcbiAgICAgIGhhbmRsZUV2ZW50Q2xpY2ssXG4gICAgICBoYW5kbGVEYXRlQ2xpY2ssXG4gICAgICBsb2NhbGUsXG4gICAgICBjdXJyZW50VGltZXpvbmUsXG4gICAgICBkaXNhYmxlQ2VsbENsaWNrLFxuICAgICAgZGlzYWJsZUV2ZW50Q2xpY2ssXG4gICAgICBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gICAgICBkYXlNYXhFdmVudHMsXG4gICAgICBzdGlja3lWaWV3SGVhZGVyLFxuICAgICAgdmlld0hlYWRlckNsYXNzTmFtZSxcbiAgICBdXG4gIClcblxuICByZXR1cm4gKFxuICAgIDxDYWxlbmRhckNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHRWYWx1ZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9DYWxlbmRhckNvbnRleHQuUHJvdmlkZXI+XG4gIClcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUN3QyxJQUF4QztBQUMrQixJQUEvQjs7O0FDQTBDLElBQTFDO0FBbURPLElBQU0sa0JBQWtCLDJCQUM3QixTQUNGO0FBRU8sSUFBTSxxQkFBcUIsTUFBTTtBQUFBLEVBQ3RDLE1BQU0sVUFBVSx3QkFBVyxlQUFlO0FBQUEsRUFDMUMsSUFBSSxZQUFZLFdBQVc7QUFBQSxJQUN6QixNQUFNLElBQUksTUFBTSwyREFBMkQ7QUFBQSxFQUM3RTtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBR0YsSUFBTSwyQkFBMkIsTUFBTTtBQUFBLEVBQzVDLE1BQU0sVUFBVSx3QkFBVyxlQUFlO0FBQUEsRUFDMUMsSUFBSSxZQUFZLFdBQVc7QUFBQSxJQUN6QixNQUFNLElBQUksTUFBTSx1REFBdUQ7QUFBQSxFQUN6RTtBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ0wsYUFBYSxRQUFRO0FBQUEsSUFDckIsTUFBTSxRQUFRO0FBQUEsSUFDZCxRQUFRLFFBQVE7QUFBQSxJQUNoQixpQkFBaUIsUUFBUTtBQUFBLElBQ3pCLGVBQWUsUUFBUTtBQUFBLElBQ3ZCLGNBQWMsUUFBUTtBQUFBLElBQ3RCLGdCQUFnQixRQUFRO0FBQUEsSUFDeEIsZ0JBQWdCLFFBQVE7QUFBQSxJQUN4QixZQUFZLFFBQVE7QUFBQSxJQUNwQixTQUFTLFFBQVE7QUFBQSxJQUNqQixZQUFZLFFBQVE7QUFBQSxJQUNwQixZQUFZLFFBQVE7QUFBQSxJQUNwQixPQUFPLFFBQVE7QUFBQSxJQUNmLFVBQVUsUUFBUTtBQUFBLElBQ2xCLGFBQWEsUUFBUTtBQUFBLElBQ3JCLGFBQWEsUUFBUTtBQUFBLElBQ3JCLGVBQWUsUUFBUTtBQUFBLElBQ3ZCLGdCQUFnQixRQUFRO0FBQUEsRUFDMUI7QUFBQTs7O0FDeEZrQyxJQUFwQztBQUNnQyxJQUFoQzs7O0FDRHNDLElBQXRDOzs7QUNEa0IsSUFBbEI7QUFDb0IsSUFBcEI7QUFDdUIsSUFBdkI7QUFDMEIsSUFBMUI7QUFDMkIsSUFBM0I7QUFDc0IsSUFBdEI7QUFDbUIsSUFBbkI7QUFDcUIsSUFBckI7QUFDZ0IsSUFBaEI7QUFDdUIsSUFBdkI7QUFJTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08sSUFBUDtBQUNPLElBQVA7QUFDTyxJQUFQO0FBQ08s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UUFDQSxPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsUUFDVixVQUFVO0FBQUEsU0FOWixpQ0FPQTtBQUFBO0FBQUEsS0E1QkosZ0NBOEJFO0FBQUE7QUFxQk4sSUFBTSxlQUF1QztBQUFBLEVBQzNDLFFBQVE7QUFBQSxFQUNSLFFBQVE7QUFBQSxFQUNSLFNBQVM7QUFBQSxFQUNULFdBQVc7QUFBQSxFQUNYLFVBQVU7QUFBQSxFQUNWLFFBQVE7QUFBQSxFQUNSLFVBQVU7QUFDWjtBQUVBLElBQU0seUJBQXlCO0FBQ3hCLElBQU0sZ0JBQXlDO0FBQUEsRUFDcEQ7QUFBQSxFQUNBLGlCQUFpQjtBQUFBLEVBQ2pCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLGVBQWU7QUFBQSxFQUNmLG1CQUFtQjtBQUFBLEVBQ25CLHNCQUFzQjtBQUFBLE1BQ2xCO0FBQUEsRUFDSix1QkFDRSx5QkFpQkUsa0JBakJGO0FBQUEsSUFDRTtBQUFBLElBQ0EsZ0JBQWdCLGFBQWE7QUFBQSxJQUM3QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQWRGLDBCQWdCRSx5QkFBQyxpQkFBRCxxQ0FBaUI7QUFBQSxLQWhCbkIsaUNBaUJFO0FBQUE7IiwKICAiZGVidWdJZCI6ICIyQjlGRjYzQkY1RUQxMjlBNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|