-
Notifications
You must be signed in to change notification settings - Fork 0
/
BANA4090_Week4_Lab5_Data-Examples_German-Forecasts.html
682 lines (669 loc) · 248 KB
/
BANA4090_Week4_Lab5_Data-Examples_German-Forecasts.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="pandoc" />
<meta name="author" content="Week 4 R-lab" />
<meta name="author" content="Zhaohu(Jonathan) Fan" />
<meta name="date" content="2021-06-03" />
<title>Basic Tools For Forecasting</title>
<style type="text/css">
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
code.sourceCode > span { display: inline-block; line-height: 1.25; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode { white-space: pre; position: relative; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
code.sourceCode { white-space: pre-wrap; }
code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
<style type="text/css">
code.sourceCode > span { display: inline-block; line-height: 1.25; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode { white-space: pre; position: relative; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
code.sourceCode { white-space: pre-wrap; }
code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
<style type="text/css">
body
{
margin: 0 0 0 0;
padding: 0 0 0 0;
width: 100%;
height: 100%;
color: black;
background-color: white;
font-family: "Gill Sans MT", "Gill Sans", GillSans, sans-serif;
font-size: 14pt;
}
div.toolbar {
position: fixed; z-index: 200;
top: auto; bottom: 0; left: 0; right: 0;
height: 1.2em; text-align: right;
padding-left: 1em;
padding-right: 1em; font-size: 60%;
color: DimGray;
background-color: rgb(240,240,240);
border-top: solid 1px rgb(180,180,180);
}
div.toolbar span.copyright {
color: DimGray;
margin-left: 0.5em;
}
div.initial_prompt {
position: absolute;
z-index: 1000;
bottom: 1.2em;
width: 100%;
background-color: rgb(200,200,200);
opacity: 0.35;
background-color: rgb(200,200,200, 0.35);
cursor: pointer;
}
div.initial_prompt p.help {
text-align: center;
}
div.initial_prompt p.close {
text-align: right;
font-style: italic;
}
div.slidy_toc {
position: absolute;
z-index: 300;
width: 60%;
max-width: 30em;
height: 30em;
overflow: auto;
top: auto;
right: auto;
left: 4em;
bottom: 4em;
padding: 1em;
background: rgb(240,240,240);
border-style: solid;
border-width: 2px;
font-size: 60%;
}
div.slidy_toc .toc_heading {
text-align: center;
width: 100%;
margin: 0;
margin-bottom: 1em;
border-bottom-style: solid;
border-bottom-color: rgb(180,180,180);
border-bottom-width: 1px;
}
div.slide {
z-index: 20;
margin: 0 0 0 0;
padding-top: 0;
padding-bottom: 0;
padding-left: 20px;
padding-right: 20px;
border-width: 0;
clear: both;
top: 0;
bottom: 0;
left: 0;
right: 0;
line-height: 120%;
background-color: transparent;
}
div.background {
display: none;
}
div.handout {
margin-left: 20px;
margin-right: 20px;
}
div.slide.titlepage {
text-align: center;
}
div.slide.titlepage h1 {
padding-top: 10%;
margin-right: 0;
}
div.slide h1 {
padding-left: 0;
padding-right: 20pt;
padding-top: 4pt;
padding-bottom: 4pt;
margin-top: 0;
margin-left: 0;
margin-right: 60pt;
margin-bottom: 0.5em;
display: block; font-size: 160%;
line-height: 1.2em;
background: transparent;
}
@media screen and (max-device-width: 1024px)
{
div.slide { font-size: 100%; }
}
@media screen and (max-device-width: 800px)
{
div.slide { font-size: 200%; }
div.slidy_toc {
top: 1em;
left: 1em;
right: auto;
width: 80%;
font-size: 180%;
}
}
div.toc-heading {
width: 100%;
border-bottom: solid 1px rgb(180,180,180);
margin-bottom: 1em;
text-align: center;
}
img {
image-rendering: optimize-quality;
}
pre {
font-size: 80%;
font-weight: bold;
line-height: 120%;
padding-top: 0.2em;
padding-bottom: 0.2em;
padding-left: 1em;
padding-right: 1em;
border-style: solid;
border-left-width: 1em;
border-top-width: thin;
border-right-width: thin;
border-bottom-width: thin;
border-color: #95ABD0;
color: #00428C;
background-color: #E4E5E7;
}
li pre { margin-left: 0; }
blockquote { font-style: italic }
img { background-color: transparent }
p.copyright { font-size: smaller }
.center { text-align: center }
.footnote { font-size: smaller; margin-left: 2em; }
a img { border-width: 0; border-style: none }
a:visited { color: navy }
a:link { color: navy }
a:hover { color: red; text-decoration: underline }
a:active { color: red; text-decoration: underline }
a {text-decoration: none}
.toolbar a:link {color: blue}
.toolbar a:visited {color: blue}
.toolbar a:active {color: red}
.toolbar a:hover {color: red}
ul { list-style-type: square; }
ul ul { list-style-type: disc; }
ul ul ul { list-style-type: circle; }
ul ul ul ul { list-style-type: disc; }
li { margin-left: 0.5em; margin-top: 0.5em; }
li li { font-size: 85%; font-style: italic }
li li li { font-size: 85%; font-style: normal }
div dt
{
margin-left: 0;
margin-top: 1em;
margin-bottom: 0.5em;
font-weight: bold;
}
div dd
{
margin-left: 2em;
margin-bottom: 0.5em;
}
p,pre,ul,ol,blockquote,h2,h3,h4,h5,h6,dl,table {
margin-left: 1em;
margin-right: 1em;
}
p.subhead { font-weight: bold; margin-top: 2em; }
.smaller { font-size: smaller }
.bigger { font-size: 130% }
td,th { padding: 0.2em }
ul {
margin: 0.5em 1.5em 0.5em 1.5em;
padding: 0;
}
ol {
margin: 0.5em 1.5em 0.5em 1.5em;
padding: 0;
}
ul { list-style-type: square; }
ul ul { list-style-type: disc; }
ul ul ul { list-style-type: circle; }
ul ul ul ul { list-style-type: disc; }
ul li { list-style: square;
margin: 0.1em 0em 0.6em 0;
padding: 0 0 0 0;
line-height: 140%;
}
ol li { margin: 0.1em 0em 0.6em 1.5em;
padding: 0 0 0 0px;
line-height: 140%;
list-style-type: decimal;
}
li ul li { font-size: 85%; font-style: italic;
list-style-type: disc;
background: transparent;
padding: 0 0 0 0;
}
li li ul li { font-size: 85%; font-style: normal;
list-style-type: circle;
background: transparent;
padding: 0 0 0 0;
}
li li li ul li {
list-style-type: disc;
background: transparent;
padding: 0 0 0 0;
}
li ol li {
list-style-type: decimal;
}
li li ol li {
list-style-type: decimal;
}
ol.outline li:hover { cursor: pointer }
ol.outline li.nofold:hover { cursor: default }
ul.outline li:hover { cursor: pointer }
ul.outline li.nofold:hover { cursor: default }
ol.outline { list-style:decimal; }
ol.outline ol { list-style-type:lower-alpha }
ol.outline li.nofold {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAIACAMzMzOvr/ywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7) no-repeat 0px 0.5em;
}
ol.outline li.unfolded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs=) no-repeat 0px 0.5em;
}
ol.outline li.folded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
ol.outline li.unfolded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs=) no-repeat 0px 0.5em;
}
ol.outline li.folded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
ul.outline li.nofold {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAIACAMzMzOvr/ywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7) no-repeat 0px 0.5em;
}
ul.outline li.unfolded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs=) no-repeat 0px 0.5em;
}
ul.outline li.folded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
ul.outline li.unfolded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs=) no-repeat 0px 0.5em;
}
ul.outline li.folded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
a.titleslide { font-weight: bold; font-style: italic }
img.hidden { display: none; visibility: hidden }
div.initial_prompt { display: none; visibility: hidden }
div.slide {
visibility: visible;
position: inherit;
}
div.handout {
border-top-style: solid;
border-top-width: thin;
border-top-color: black;
}
@media screen {
.hidden { display: none; visibility: visible }
div.slide.hidden { display: block; visibility: visible }
div.handout.hidden { display: block; visibility: visible }
div.background { display: none; visibility: hidden }
body.single_slide div.initial_prompt { display: block; visibility: visible }
body.single_slide div.background { display: block; visibility: visible }
body.single_slide div.background.hidden { display: none; visibility: hidden }
body.single_slide .invisible { visibility: hidden }
body.single_slide .hidden { display: none; visibility: hidden }
body.single_slide div.slide { position: absolute }
body.single_slide div.handout { display: none; visibility: hidden }
}
@media print {
.hidden { display: block; visibility: visible }
div.slide pre { font-size: 60%; padding-left: 0.5em; }
div.toolbar { display: none; visibility: hidden; }
div.slidy_toc { display: none; visibility: hidden; }
div.background { display: none; visibility: hidden; }
div.slide { page-break-before: always }
div.slide.first-slide { page-break-before: avoid }
}
.jslider table {
margin-left: 0em;
margin-right: 0em;
}
table.dataTable, .shiny-datatable-output div {
font-size: 14pt;
}
.dataTables_info, .dataTables_paginate {
font-size: 19px;
}
pre.sourceCode, code.sourceCode {
font-size: 80%;
}
label, button, input, select, textarea {
font-size: 14pt;
}
ul.nav, ul.nav li {
list-style-type: none;
}
</style>
<script src="data:application/javascript;base64,Lyogc2xpZHkuanMKCiAgIENvcHlyaWdodCAoYykgMjAwNS0yMDEzIFczQyAoTUlULCBFUkNJTSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgIFczQyBsaWFiaWxpdHksIHRyYWRlbWFyaywgZG9jdW1lbnQgdXNlIGFuZCBzb2Z0d2FyZSBsaWNlbnNpbmcKICAgcnVsZXMgYXBwbHksIHNlZToKCiAgIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LWRvY3VtZW50cwogICBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZQoKICAgRGVmaW5lcyBzaW5nbGUgbmFtZSAidzNjX3NsaWR5IiBpbiBnbG9iYWwgbmFtZXNwYWNlCiAgIEFkZHMgZXZlbnQgaGFuZGxlcnMgd2l0aG91dCB0cmFtcGxpbmcgb24gYW55IG90aGVycwoqLwoKLy8gdGhlIHNsaWR5IG9iamVjdCBpbXBsZW1lbnRhdGlvbgp2YXIgdzNjX3NsaWR5ID0gewogIC8vIGNsYXNzaWZ5IHdoaWNoIGtpbmQgb2YgYnJvd3NlciB3ZSdyZSBydW5uaW5nIHVuZGVyCiAgbnNfcG9zOiAodHlwZW9mIHdpbmRvdy5wYWdlWU9mZnNldCE9J3VuZGVmaW5lZCcpLAogIGtodG1sOiAoKG5hdmlnYXRvci51c2VyQWdlbnQpLmluZGV4T2YoIktIVE1MIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgb3BlcmE6ICgobmF2aWdhdG9yLnVzZXJBZ2VudCkuaW5kZXhPZigiT3BlcmEiKSA+PSAwID8gdHJ1ZSA6IGZhbHNlKSwKICBpcGFkOiAoKG5hdmlnYXRvci51c2VyQWdlbnQpLmluZGV4T2YoImlQYWQiKSA+PSAwID8gdHJ1ZSA6IGZhbHNlKSwKICBpcGhvbmU6ICgobmF2aWdhdG9yLnVzZXJBZ2VudCkuaW5kZXhPZigiaVBob25lIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgYW5kcm9pZDogKChuYXZpZ2F0b3IudXNlckFnZW50KS5pbmRleE9mKCJBbmRyb2lkIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgaWU6ICh0eXBlb2YgZG9jdW1lbnQuYWxsICE9ICJ1bmRlZmluZWQiICYmICF0aGlzLm9wZXJhKSwKICBpZTY6ICghdGhpcy5uc19wb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDYiKSAhPSAtMSksCiAgaWU3OiAoIXRoaXMubnNfcG9zICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSA3IikgIT0gLTEpLAogIGllODogKCF0aGlzLm5zX3BvcyAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUgOCIpICE9IC0xKSwKICBpZTk6ICghdGhpcy5uc19wb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDkiKSAhPSAtMSksCgogIC8vIGRhdGEgZm9yIHN3aXBlIGFuZCBkb3VibGUgdGFwIGRldGVjdGlvbiBvbiB0b3VjaCBzY3JlZW5zCiAgbGFzdF90YXA6IDAsCiAgcHJldl90YXA6IDAsCiAgc3RhcnRfeDogMCwKICBzdGFydF95OiAwLAogIGRlbHRhX3g6IDAsCiAgZGVsdGFfeTogMCwKCiAgLy8gYXJlIHdlIHJ1bm5pbmcgYXMgWEhUTUw/IChkb2Vzbid0IHdvcmsgb24gT3BlcmEpCiAgaXNfeGh0bWw6IC94bWwvLnRlc3QoZG9jdW1lbnQuY29udGVudFR5cGUpLAoKICBzbGlkZV9udW1iZXI6IDAsIC8vIGludGVnZXIgc2xpZGUgY291bnQ6IDAsIDEsIDIsIC4uLgogIHNsaWRlX251bWJlcl9lbGVtZW50OiBudWxsLCAvLyBlbGVtZW50IGNvbnRhaW5pbmcgc2xpZGUgbnVtYmVyCiAgc2xpZGVzOiBbXSwgLy8gc2V0IHRvIGFycmF5IG9mIHNsaWRlIGRpdidzCiAgbm90ZXM6IFtdLCAvLyBzZXQgdG8gYXJyYXkgb2YgaGFuZG91dCBkaXYncwogIGJhY2tncm91bmRzOiBbXSwgLy8gc2V0IHRvIGFycmF5IG9mIGJhY2tncm91bmQgZGl2J3MKICBvYnNlcnZlcnM6IFtdLCAvLyBsaXN0IG9mIG9ic2VydmVyIGZ1bmN0aW9ucwogIHRvb2xiYXI6IG51bGwsIC8vIGVsZW1lbnQgY29udGFpbmluZyB0b29sYmFyCiAgdGl0bGU6IG51bGwsIC8vIGRvY3VtZW50IHRpdGxlCiAgbGFzdF9zaG93bjogbnVsbCwgLy8gbGFzdCBpbmNyZW1lbnRhbGx5IHNob3duIGl0ZW0KICBlb3M6IG51bGwsICAvLyBzcGFuIGVsZW1lbnQgZm9yIGVuZCBvZiBzbGlkZSBpbmRpY2F0b3IKICB0b2M6IG51bGwsIC8vIHRhYmxlIG9mIGNvbnRlbnRzCiAgb3V0bGluZTogbnVsbCwgLy8gb3V0bGluZSBlbGVtZW50IHdpdGggdGhlIGZvY3VzCiAgc2VsZWN0ZWRfdGV4dF9sZW46IDAsIC8vIGxlbmd0aCBvZiBkcmFnIHNlbGVjdGlvbiBvbiBkb2N1bWVudAogIHZpZXdfYWxsOiAwLCAgLy8gMSB0byB2aWV3IGFsbCBzbGlkZXMgKyBoYW5kb3V0cwogIHdhbnRfdG9vbGJhcjogdHJ1ZSwgIC8vIHVzZXIgcHJlZmVyZW5jZSB0byBzaG93L2hpZGUgdG9vbGJhcgogIG1vdXNlX2NsaWNrX2VuYWJsZWQ6IHRydWUsIC8vIGVuYWJsZXMgbGVmdCBjbGljayBmb3IgbmV4dCBzbGlkZQogIHNjcm9sbF9oYWNrOiAwLCAvLyBJRSB3b3JrIGFyb3VuZCBmb3IgcG9zaXRpb246IGZpeGVkCiAgZGlzYWJsZV9zbGlkZV9jbGljazogZmFsc2UsICAvLyB1c2VkIGJ5IGNsaWNrZWQgYW5jaG9ycwoKICBsYW5nOiAiZW4iLCAvLyB1cGRhdGVkIHRvIGxhbmd1YWdlIHNwZWNpZmllZCBieSBodG1sIGZpbGUKCiAgaGVscF9hbmNob3I6IG51bGwsIC8vIHVzZWQgZm9yIGtleWJvYXJkIGZvY3VzIGhhY2sgaW4gc2hvd1Rvb2xiYXIoKQogIGhlbHBfcGFnZTogImh0dHA6Ly93d3cudzMub3JnL1RhbGtzL1Rvb2xzL1NsaWR5Mi9oZWxwL2hlbHAuaHRtbCIsCiAgaGVscF90ZXh0OiAiTmF2aWdhdGUgd2l0aCBtb3VzZSBjbGljaywgc3BhY2UgYmFyLCBDdXJzb3IgTGVmdC9SaWdodCwgIiArCiAgICAgICAgICAgICAib3IgUGcgVXAgYW5kIFBnIERuLiBVc2UgUyBhbmQgQiB0byBjaGFuZ2UgZm9udCBzaXplLiIsCgogIHNpemVfaW5kZXg6IDAsCiAgc2l6ZV9hZGp1c3RtZW50OiAwLAogIHNpemVzOiAgbmV3IEFycmF5KCIxMHB0IiwgIjEycHQiLCAiMTRwdCIsICIxNnB0IiwgIjE4cHQiLCAiMjBwdCIsCiAgICAgICAgICAgICAgICAgICAgIjIycHQiLCAiMjRwdCIsICIyNnB0IiwgIjI4cHQiLCAiMzBwdCIsICIzMnB0IiksCgogIC8vIG5lZWRlZCBmb3IgZWZmaWNpZW50IHJlc2l6aW5nCiAgbGFzdF93aWR0aDogMCwKICBsYXN0X2hlaWdodDogMCwKCgogIC8vIE5lZWRlZCBmb3IgY3Jvc3MgYnJvd3NlciBzdXBwb3J0IGZvciByZWxhdGl2ZSB3aWR0aC9oZWlnaHQgb24KICAvLyBvYmplY3QgZWxlbWVudHMuIFRoZSB3b3JrIGFyb3VuZCBpcyB0byBzYXZlIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzCiAgLy8gYW5kIHRoZW4gdG8gcmVjb21wdXRlIGFic29sdXRlIHdpZHRoL2hlaWdodCBkaW1lbnNpb25zIG9uIHJlc2l6aW5nCiAgIG9iamVjdHM6IFtdLAoKICAvLyBhdHRhY2ggaW5pdGlhbGlhdGlvbiBldmVudCBoYW5kbGVycwogIHNldF91cDogZnVuY3Rpb24gKCkgewogICAgdmFyIGluaXQgPSBmdW5jdGlvbigpIHsgdzNjX3NsaWR5LmluaXQoKTsgfTsKICAgIGlmICh0eXBlb2Ygd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgIT0gInVuZGVmaW5lZCIpCiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgaW5pdCwgZmFsc2UpOwogICAgZWxzZQogICAgICB3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsIGluaXQpOwogIH0sCgogIGhpZGVfc2xpZGVzOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiAhdzNjX3NsaWR5LmluaXRpYWxpemVkKQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgIGVsc2UKICAgICAgc2V0VGltZW91dCh3M2Nfc2xpZHkuaGlkZV9zbGlkZXMsIDUwKTsKICB9LAoKICAvLyBoYWNrIHRvIHBlcnN1YWRlIElFIHRvIGNvbXB1dGUgY29ycmVjdCBkb2N1bWVudCBoZWlnaHQKICAvLyBhcyBuZWVkZWQgZm9yIHNpbXVsYXRpbmcgZml4ZWQgcG9zaXRpb25pbmcgb2YgdG9vbGJhcgogIGllX2hhY2s6IGZ1bmN0aW9uICgpIHsKICAgIHdpbmRvdy5yZXNpemVCeSgwLC0xKTsKICAgIHdpbmRvdy5yZXNpemVCeSgwLCAxKTsKICB9LAoKICBpbml0OiBmdW5jdGlvbiAoKSB7CiAgICAvL2FsZXJ0KCJzbGlkeSBzdGFydGluZyB0ZXN0IDEwIik7CiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICB0aGlzLmluaXRfbG9jYWxpemF0aW9uKCk7CiAgICB0aGlzLmFkZF90b29sYmFyKCk7CiAgICB0aGlzLndyYXBfaW1wbGljaXRfc2xpZGVzKCk7CiAgICB0aGlzLmNvbGxlY3Rfc2xpZGVzKCk7CiAgICB0aGlzLmNvbGxlY3Rfbm90ZXMoKTsKICAgIHRoaXMuY29sbGVjdF9iYWNrZ3JvdW5kcygpOwogICAgdGhpcy5vYmplY3RzID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CiAgICB0aGlzLnBhdGNoX2FuY2hvcnMoKTsKICAgIHRoaXMuc2xpZGVfbnVtYmVyID0gdGhpcy5maW5kX3NsaWRlX251bWJlcihsb2NhdGlvbi5ocmVmKTsKICAgIHdpbmRvdy5vZmZzY3JlZW5idWZmZXJpbmcgPSB0cnVlOwogICAgdGhpcy5zaXplX2FkanVzdG1lbnQgPSB0aGlzLmZpbmRfc2l6ZV9hZGp1c3QoKTsKICAgIHRoaXMudGltZV9sZWZ0ID0gdGhpcy5maW5kX2R1cmF0aW9uKCk7CiAgICB0aGlzLmhpZGVfaW1hZ2VfdG9vbGJhcigpOyAgLy8gc3VwcHJlc3MgSUUgaW1hZ2UgdG9vbGJhciBwb3B1cAogICAgdGhpcy5pbml0X291dGxpbmVyKCk7ICAvLyBhY3RpdmF0ZSBmb2xkL3VuZm9sZCBzdXBwb3J0CiAgICB0aGlzLnRpdGxlID0gZG9jdW1lbnQudGl0bGU7CiAgICB0aGlzLmtleWJvYXJkbGVzcyA9ICh0aGlzLmlwYWR8fHRoaXMuaXBob25lfHx0aGlzLmFuZHJvaWQpOwoKICAgIGlmICh0aGlzLmtleWJvYXJkbGVzcykKICAgIHsKICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgIHRoaXMud2FudF90b29sYmFyID0gMDsKICAgIH0KCiAgICAvLyB3b3JrIGFyb3VuZCBmb3Igb3BlcmEgYnVnCiAgICB0aGlzLmlzX3hodG1sID0gKGRvY3VtZW50LmJvZHkudGFnTmFtZSA9PSAiQk9EWSIgPyBmYWxzZSA6IHRydWUpOwoKICAgIGlmICh0aGlzLnNsaWRlcy5sZW5ndGggPiAwKQogICAgewogICAgICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1t0aGlzLnNsaWRlX251bWJlcl07CiAgIAogICAgICBpZiAodGhpcy5zbGlkZV9udW1iZXIgPiAwKQogICAgICB7CiAgICAgICAgdGhpcy5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICAgICAgICB0aGlzLmxhc3Rfc2hvd24gPSB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obnVsbCk7CiAgICAgICAgdGhpcy5zZXRfZW9zX3N0YXR1cyh0cnVlKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0aGlzLmxhc3Rfc2hvd24gPSBudWxsOwogICAgICAgIHRoaXMuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJoaWRkZW4iKTsKICAgICAgICB0aGlzLnNldF9lb3Nfc3RhdHVzKCF0aGlzLm5leHRfaW5jcmVtZW50YWxfaXRlbSh0aGlzLmxhc3Rfc2hvd24pKTsKICAgICAgfQoKICAgICAgdGhpcy5zZXRfbG9jYXRpb24oKTsKICAgICAgdGhpcy5hZGRfY2xhc3ModGhpcy5zbGlkZXNbMF0sICJmaXJzdC1zbGlkZSIpOwogICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZShzbGlkZSk7CiAgICB9CgogICAgdGhpcy50b2MgPSB0aGlzLnRhYmxlX29mX2NvbnRlbnRzKCk7CgogICAgdGhpcy5hZGRfaW5pdGlhbF9wcm9tcHQoKTsKCiAgICAvLyBiaW5kIGV2ZW50IGhhbmRsZXJzIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCBjdXN0b20gcGFnZSBzY3JpcHRzCiAgICAvLyBUYXAgZXZlbnRzIGJlaGF2ZSB0b28gd2VpcmRseSB0byBzdXBwb3J0IGNsaWNrcyByZWxpYWJseSBvbgogICAgLy8gaVBob25lIGFuZCBpUGFkLCBzbyBleGNsdWRlIHRoZXNlIGZyb20gY2xpY2sgaGFuZGxlcgoKICAgIGlmICghdGhpcy5rZXlib2FyZGxlc3MpCiAgICB7CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LmJvZHksICJjbGljayIsIHRoaXMubW91c2VfYnV0dG9uX2NsaWNrKTsKICAgICAgdGhpcy5hZGRfbGlzdGVuZXIoZG9jdW1lbnQuYm9keSwgIm1vdXNlZG93biIsIHRoaXMubW91c2VfYnV0dG9uX2Rvd24pOwogICAgfQoKICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LCAia2V5ZG93biIsIHRoaXMua2V5X2Rvd24pOwogICAgdGhpcy5hZGRfbGlzdGVuZXIoZG9jdW1lbnQsICJrZXlwcmVzcyIsIHRoaXMua2V5X3ByZXNzKTsKICAgIHRoaXMuYWRkX2xpc3RlbmVyKHdpbmRvdywgInJlc2l6ZSIsIHRoaXMucmVzaXplZCk7CiAgICB0aGlzLmFkZF9saXN0ZW5lcih3aW5kb3csICJzY3JvbGwiLCB0aGlzLnNjcm9sbGVkKTsKICAgIHRoaXMuYWRkX2xpc3RlbmVyKHdpbmRvdywgInVubG9hZCIsIHRoaXMudW5sb2FkZWQpOwoKICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LCAiZ2VzdHVyZWNoYW5nZSIsIGZ1bmN0aW9uICgpCiAgICB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwoKICAgIHRoaXMuYXR0YWNoX3RvdWNoX2hhbmRlcnModGhpcy5zbGlkZXMpOwoKICAgIC8vIHRoaXMgc2VlbXMgdG8gYmUgYSBkZWJ1Z2dpbmcgaGFjawogICAgLy9pZiAoIWRvY3VtZW50LmJvZHkub25jbGljaykKICAgIC8vICBkb2N1bWVudC5ib2R5Lm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7IH07CgogICAgdGhpcy5zaW5nbGVfc2xpZGVfdmlldygpOwoKICAgIC8vdGhpcy5zZXRfbG9jYXRpb24oKTsKCiAgICB0aGlzLnJlc2l6ZWQoKTsKCiAgICBpZiAodGhpcy5pZTcpCiAgICAgIHNldFRpbWVvdXQodzNjX3NsaWR5LmllX2hhY2ssIDEwMCk7CgogICAgdGhpcy5zaG93X3Rvb2xiYXIoKTsKCiAgICAvLyBmb3IgYmFjayBidXR0b24gZGV0ZWN0aW9uCiAgICBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7IHczY19zbGlkeS5jaGVja19sb2NhdGlvbigpOyB9LCAyMDApOwogICAgdzNjX3NsaWR5LmluaXRpYWxpemVkID0gdHJ1ZTsKICB9LAoKICAvLyBjcmVhdGUgZGl2IGVsZW1lbnQgd2l0aCBsaW5rcyB0byBlYWNoIHNsaWRlCiAgdGFibGVfb2ZfY29udGVudHM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciB0b2MgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKTsKICAgIHRoaXMuYWRkX2NsYXNzKHRvYywgInNsaWR5X3RvYyBoaWRkZW4iKTsKICAgIC8vdG9jLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCAiMCIpOwoKICAgIHZhciBoZWFkaW5nID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICB0aGlzLmFkZF9jbGFzcyhoZWFkaW5nLCAidG9jLWhlYWRpbmciKTsKICAgIGhlYWRpbmcuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgiVGFibGUgb2YgQ29udGVudHMiKTsKCiAgICB0b2MuYXBwZW5kQ2hpbGQoaGVhZGluZyk7CiAgICB2YXIgcHJldmlvdXMgPSBudWxsOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zbGlkZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIHZhciB0aXRsZSA9IHRoaXMuaGFzX2NsYXNzKHRoaXMuc2xpZGVzW2ldLCAidGl0bGUiKTsKICAgICAgdmFyIG51bSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKChpICsgMSkgKyAiLiAiKTsKCiAgICAgIHRvYy5hcHBlbmRDaGlsZChudW0pOwoKICAgICAgdmFyIGEgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJhIik7CiAgICAgIGEuc2V0QXR0cmlidXRlKCJocmVmIiwgIiMoIiArIChpKzEpICsgIikiKTsKCiAgICAgIGlmICh0aXRsZSkKICAgICAgICB0aGlzLmFkZF9jbGFzcyhhLCAidGl0bGVzbGlkZSIpOwoKICAgICAgdmFyIG5hbWUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnNsaWRlX25hbWUoaSkpOwogICAgICBhLmFwcGVuZENoaWxkKG5hbWUpOwogICAgICBhLm9uY2xpY2sgPSB3M2Nfc2xpZHkudG9jX2NsaWNrOwogICAgICBhLm9ua2V5ZG93biA9IHczY19zbGlkeS50b2Nfa2V5X2Rvd247CiAgICAgIGEucHJldmlvdXMgPSBwcmV2aW91czsKCiAgICAgIGlmIChwcmV2aW91cykKICAgICAgICBwcmV2aW91cy5uZXh0ID0gYTsKCiAgICAgIHRvYy5hcHBlbmRDaGlsZChhKTsKCiAgICAgIGlmIChpID09IDApCiAgICAgICAgdG9jLmZpcnN0ID0gYTsKCiAgICAgIGlmIChpIDwgdGhpcy5zbGlkZXMubGVuZ3RoIC0gMSkKICAgICAgewogICAgICAgIHZhciBiciA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImJyIik7CiAgICAgICAgdG9jLmFwcGVuZENoaWxkKGJyKTsKICAgICAgfQoKICAgICAgcHJldmlvdXMgPSBhOwogICAgfQoKICAgIHRvYy5mb2N1cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRoaXMuZmlyc3QpCiAgICAgICAgdGhpcy5maXJzdC5mb2N1cygpOwogICAgfQoKICAgIHRvYy5vbm1vdXNldXAgPSB3M2Nfc2xpZHkubW91c2VfYnV0dG9uX3VwOwoKICAgIHRvYy5vbmNsaWNrID0gZnVuY3Rpb24gKGUpIHsKICAgICAgZXx8KGU9d2luZG93LmV2ZW50KTsKCiAgICAgIGlmICh3M2Nfc2xpZHkuc2VsZWN0ZWRfdGV4dF9sZW4gPD0gMCkKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfdGFibGVfb2ZfY29udGVudHModHJ1ZSk7CgogICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKICAgIAogICAgICBpZiAoZS5jYW5jZWwgIT0gdW5kZWZpbmVkKQogICAgICAgIGUuY2FuY2VsID0gdHJ1ZTsKICAgICAgCiAgICAgIGlmIChlLnJldHVyblZhbHVlICE9IHVuZGVmaW5lZCkKICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIAogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKHRvYywgZG9jdW1lbnQuYm9keS5maXJzdENoaWxkKTsKICAgIHJldHVybiB0b2M7CiAgfSwKCiAgaXNfc2hvd25fdG9jOiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gIXczY19zbGlkeS5oYXNfY2xhc3ModzNjX3NsaWR5LnRvYywgImhpZGRlbiIpOwogIH0sCgogIHNob3dfdGFibGVfb2ZfY29udGVudHM6IGZ1bmN0aW9uICgpIHsKICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3ModzNjX3NsaWR5LnRvYywgImhpZGRlbiIpOwogICAgdmFyIHRvYyA9IHczY19zbGlkeS50b2M7CiAgICB0b2MuZm9jdXMoKTsKCiAgICBpZiAodzNjX3NsaWR5LmllNyAmJiB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID09IDApCiAgICAgIHNldFRpbWVvdXQodzNjX3NsaWR5LmllX2hhY2ssIDEwMCk7CiAgfSwKCiAgaGlkZV90YWJsZV9vZl9jb250ZW50czogZnVuY3Rpb24gKGZvY3VzKSB7CiAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKHczY19zbGlkeS50b2MsICJoaWRkZW4iKTsKCiAgICBpZiAoZm9jdXMgJiYgIXczY19zbGlkeS5vcGVyYSAmJgogICAgICAgICF3M2Nfc2xpZHkuaGFzX2NsYXNzKHczY19zbGlkeS50b2MsICJoaWRkZW4iKSkKICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogIH0sCgogIHRvZ2dsZV90YWJsZV9vZl9jb250ZW50czogZnVuY3Rpb24gKCkgewogICAgaWYgKHczY19zbGlkeS5pc19zaG93bl90b2MoKSkKICAgICAgdzNjX3NsaWR5LmhpZGVfdGFibGVfb2ZfY29udGVudHModHJ1ZSk7CiAgICBlbHNlCiAgICAgIHczY19zbGlkeS5zaG93X3RhYmxlX29mX2NvbnRlbnRzKCk7CiAgfSwKCiAgLy8gY2FsbGVkIG9uIGNsaWNraW5nIHRvYyBlbnRyeQogIHRvY19jbGljazogZnVuY3Rpb24gKGUpIHsKICAgIGlmICghZSkKICAgICAgZSA9IHdpbmRvdy5ldmVudDsKCiAgICB2YXIgdGFyZ2V0ID0gdzNjX3NsaWR5LmdldF90YXJnZXQoZSk7CgogICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMSkKICAgIHsKICAgICAgdmFyIHVyaSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKCiAgICAgIGlmICh1cmkpCiAgICAgIHsKICAgICAgICAvL2FsZXJ0KCJnb2luZyB0byAiICsgdXJpKTsKICAgICAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5oaWRlX3NsaWRlKHNsaWRlKTsKICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID0gdzNjX3NsaWR5LmZpbmRfc2xpZGVfbnVtYmVyKHVyaSk7CiAgICAgICAgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CiAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgiaGlkZGVuIik7CiAgICAgICAgdzNjX3NsaWR5LnNldF9lb3Nfc3RhdHVzKCF3M2Nfc2xpZHkubmV4dF9pbmNyZW1lbnRhbF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKSk7CiAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICAgIC8vdGFyZ2V0LmZvY3VzKCk7CgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgIGlmICghdzNjX3NsaWR5Lm9wZXJhKQogICAgICAgICAgICB3M2Nfc2xpZHkuc2V0X2ZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKQogICAgICAgIHsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB3M2Nfc2xpZHkuaGlkZV90YWJsZV9vZl9jb250ZW50cyh0cnVlKTsKICAgIGlmICh3M2Nfc2xpZHkuaWU3KSB3M2Nfc2xpZHkuaWVfaGFjaygpOwogICAgdzNjX3NsaWR5LnN0b3BfcHJvcGFnYXRpb24oZSk7CiAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChlKTsKICB9LAoKICAvLyBjYWxsZWQgb25rZXlkb3duIGZvciB0b2MgZW50cnkKICB0b2Nfa2V5X2Rvd246IGZ1bmN0aW9uIChldmVudCkgewogICAgdmFyIGtleTsKCiAgICBpZiAoIWV2ZW50KQogICAgICB2YXIgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh3aW5kb3cuZXZlbnQpCiAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwogICAgZWxzZSBpZiAoZXZlbnQud2hpY2gpCiAgICAgIGtleSA9IGV2ZW50LndoaWNoOwogICAgZWxzZQogICAgICByZXR1cm4gdHJ1ZTsgLy8gWWlrZXMhIHVua25vd24gYnJvd3NlcgoKICAgIC8vIGlnbm9yZSBldmVudCBpZiBrZXkgdmFsdWUgaXMgemVybwogICAgLy8gYXMgZm9yIGFsdCBvbiBPcGVyYSBhbmQgS29ucXVlcm9yCiAgICBpZiAoIWtleSkKICAgICAgcmV0dXJuIHRydWU7CgogICAgLy8gY2hlY2sgZm9yIGNvbmN1cnJlbnQgY29udHJvbC9jb21tYW5kL2FsdCBrZXkKICAgIC8vIGJ1dCBhcmUgdGhlc2Ugb25seSBwcmVzZW50IG9uIG1vdXNlIGV2ZW50cz8KCiAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmIChrZXkgPT0gMTMpCiAgICB7CiAgICAgIHZhciB1cmkgPSB0aGlzLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwoKICAgICAgaWYgKHVyaSkKICAgICAgewogICAgICAgIC8vYWxlcnQoImdvaW5nIHRvICIgKyB1cmkpOwogICAgICAgdmFyIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkuaGlkZV9zbGlkZShzbGlkZSk7CiAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5maW5kX3NsaWRlX251bWJlcih1cmkpOwogICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IG51bGw7CiAgICAgICAgdzNjX3NsaWR5LnNldF9sb2NhdGlvbigpOwogICAgICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoImhpZGRlbiIpOwogICAgICAgIHczY19zbGlkeS5zZXRfZW9zX3N0YXR1cyghdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbSh3M2Nfc2xpZHkubGFzdF9zaG93bikpOwogICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgICAvL3RhcmdldC5mb2N1cygpOwoKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICBpZiAoIXczY19zbGlkeS5vcGVyYSkKICAgICAgICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkKICAgICAgICB7CiAgICAgICAgfQogICAgICB9CgogICAgICB3M2Nfc2xpZHkuaGlkZV90YWJsZV9vZl9jb250ZW50cyh0cnVlKTsKCiAgICAgIGlmIChzZWxmLmllNykKICAgICAgIHczY19zbGlkeS5pZV9oYWNrKCk7CgogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CgogICAgaWYgKGtleSA9PSA0MCAmJiB0aGlzLm5leHQpCiAgICB7CiAgICAgIHRoaXMubmV4dC5mb2N1cygpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CgogICAgaWYgKGtleSA9PSAzOCAmJiB0aGlzLnByZXZpb3VzKQogICAgewogICAgICB0aGlzLnByZXZpb3VzLmZvY3VzKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICB0b3VjaHN0YXJ0OiBmdW5jdGlvbiAoZSkKICB7CiAgICAvLyBhIGRvdWJsZSB0b3VjaCBvZnRlbiBzdGFydHMgd2l0aCBhCiAgICAvLyBzaW5nbGUgdG91Y2ggZHVlIHRvIGZpbmdlcnMgdG91Y2hpbmcKICAgIC8vIGRvd24gYXQgc2xpZ2h0bHkgZGlmZmVyZW50IHRpbWVzCiAgICAvLyB0aHVzIGF2b2lkIGNhbGxpbmcgcHJldmVudERlZmF1bHQgaGVyZQogICAgdGhpcy5wcmV2X3RhcCA9IHRoaXMubGFzdF90YXA7CiAgICB0aGlzLmxhc3RfdGFwID0gKG5ldyBEYXRlKS5nZXRUaW1lKCk7CgogICAgdmFyIHRhcF9kZWxheSA9IHRoaXMubGFzdF90YXAgLSB0aGlzLnByZXZfdGFwOwoKICAgIGlmICh0YXBfZGVsYXkgPD0gMjAwKQogICAgewogICAgICAvLyBkb3VibGUgdGFwCiAgICB9CgogICAgdmFyIHRvdWNoID0gZS50b3VjaGVzWzBdOwoKICAgIHRoaXMucGFnZVggPSB0b3VjaC5wYWdlWDsKICAgIHRoaXMucGFnZVkgPSB0b3VjaC5wYWdlWTsKICAgIHRoaXMuc2NyZWVuWCA9IHRvdWNoLnNjcmVlblg7CiAgICB0aGlzLnNjcmVlblkgPSB0b3VjaC5zY3JlZW5ZOwogICAgdGhpcy5jbGllbnRYID0gdG91Y2guY2xpZW50WDsKICAgIHRoaXMuY2xpZW50WSA9IHRvdWNoLmNsaWVudFk7CgogICAgdGhpcy5kZWx0YV94ID0gdGhpcy5kZWx0YV95ID0gMDsKICB9LAoKICB0b3VjaG1vdmU6IGZ1bmN0aW9uIChlKQogIHsKICAgIC8vIG92ZXJyaWRlIG5hdGl2ZSBnZXN0dXJlcyBmb3Igc2luZ2xlIHRvdWNoCiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpCiAgICAgIHJldHVybjsKCiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB2YXIgdG91Y2ggPSBlLnRvdWNoZXNbMF07CiAgICB0aGlzLmRlbHRhX3ggPSB0b3VjaC5wYWdlWCAtIHRoaXMucGFnZVg7CiAgICB0aGlzLmRlbHRhX3kgPSB0b3VjaC5wYWdlWSAtIHRoaXMucGFnZVk7CiAgfSwKCiAgdG91Y2hlbmQ6IGZ1bmN0aW9uIChlKQogIHsKICAgIC8vIGRlZmF1bHQgYmVoYXZpb3IgZm9yIG11bHRpLXRvdWNoCiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpCiAgICAgIHJldHVybjsKCiAgICB2YXIgZGVsYXkgPSAobmV3IERhdGUpLmdldFRpbWUoKSAtIHRoaXMubGFzdF90YXA7CiAgICB2YXIgZHggPSB0aGlzLmRlbHRhX3g7CiAgICB2YXIgZHkgPSB0aGlzLmRlbHRhX3k7CiAgICB2YXIgYWJzX2R4ID0gTWF0aC5hYnMoZHgpOwogICAgdmFyIGFic19keSA9IE1hdGguYWJzKGR5KTsKCiAgICBpZiAoZGVsYXkgPCA1MDAgJiYgKGFic19keCA+IDEwMCB8fCBhYnNfZHkgPiAxMDApKQogICAgewogICAgICBpZiAoYWJzX2R4ID4gMC41ICogYWJzX2R5KQogICAgICB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICBpZiAoZHggPCAwKQogICAgICAgICAgdzNjX3NsaWR5Lm5leHRfc2xpZGUodHJ1ZSk7CiAgICAgICAgZWxzZQogICAgICAgICAgdzNjX3NsaWR5LnByZXZpb3VzX3NsaWRlKHRydWUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGFic19keSA+IDIgKiBhYnNfZHgpCiAgICAgIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdzNjX3NsaWR5LnRvZ2dsZV90YWJsZV9vZl9jb250ZW50cygpOwogICAgICB9CiAgICB9CiAgfSwKCiAgLy8gIyMjIE9CU09MRVRFICMjIwogIGJlZm9yZV9wcmludDogZnVuY3Rpb24gKCkgewogICAgdGhpcy5zaG93X2FsbF9zbGlkZXMoKTsKICAgIHRoaXMuaGlkZV90b29sYmFyKCk7CiAgICBhbGVydCgiYmVmb3JlIHByaW50Iik7CiAgfSwKCiAgLy8gIyMjIE9CU09MRVRFICMjIwogIGFmdGVyX3ByaW50OiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMudmlld19hbGwpCiAgICB7CiAgICAgIHRoaXMuc2luZ2xlX3NsaWRlX3ZpZXcoKTsKICAgICAgdGhpcy5zaG93X3Rvb2xiYXIoKTsKICAgIH0KICAgIGFsZXJ0KCJhZnRlciBwcmludCIpOwogIH0sCgogIC8vICMjIyBPQlNPTEVURSAjIyMKICBwcmludF9zbGlkZXM6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuYmVmb3JlX3ByaW50KCk7CiAgICB3aW5kb3cucHJpbnQoKTsKICAgIHRoaXMuYWZ0ZXJfcHJpbnQoKTsKICB9LAoKICAvLyAjIyMgT0JTT0xFVEUgPz8gIyMjCiAgdG9nZ2xlX3ZpZXc6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLnZpZXdfYWxsKQogICAgewogICAgICB0aGlzLnNpbmdsZV9zbGlkZV92aWV3KCk7CiAgICAgIHRoaXMuc2hvd190b29sYmFyKCk7CiAgICAgIHRoaXMudmlld19hbGwgPSAwOwogICAgfQogICAgZWxzZQogICAgewogICAgICB0aGlzLnNob3dfYWxsX3NsaWRlcygpOwogICAgICB0aGlzLmhpZGVfdG9vbGJhcigpOwogICAgICB0aGlzLnZpZXdfYWxsID0gMTsKICAgIH0KICB9LAoKICAvLyBwcmVwYXJlIGZvciBwcmludGluZyAgIyMjIE9CU09MRVRFICMjIwogIHNob3dfYWxsX3NsaWRlczogZnVuY3Rpb24gKCkgewogICAgdGhpcy5yZW1vdmVfY2xhc3MoZG9jdW1lbnQuYm9keSwgInNpbmdsZV9zbGlkZSIpOwogICAgdGhpcy5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICB9LAoKICAvLyByZXN0b3JlIGFmdGVyIHByaW50aW5nICAjIyMgT0JTT0xFVEUgIyMjCiAgc2luZ2xlX3NsaWRlX3ZpZXc6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuYWRkX2NsYXNzKGRvY3VtZW50LmJvZHksICJzaW5nbGVfc2xpZGUiKTsKICAgIHRoaXMuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJ2aXNpYmxlIik7CiAgICB0aGlzLmxhc3Rfc2hvd24gPSB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obnVsbCk7CiAgfSwKCiAgLy8gc3VwcHJlc3MgSUUncyBpbWFnZSB0b29sYmFyIHBvcCB1cAogIGhpZGVfaW1hZ2VfdG9vbGJhcjogZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLm5zX3BvcykKICAgIHsKICAgICAgdmFyIGltYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJTUciKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKQogICAgICAgIGltYWdlc1tpXS5zZXRBdHRyaWJ1dGUoImdhbGxlcnlpbWciLCAibm8iKTsKICAgIH0KICB9LAoKICB1bmxvYWRlZDogZnVuY3Rpb24gKGUpIHsKICAgIC8vYWxlcnQoInVubG9hZGVkIik7CiAgfSwKCiAgLy8gU2FmYXJpIGFuZCBLb25xdWVyb3IgZG9uJ3QgeWV0IHN1cHBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSgpCiAgLy8gYW5kIHRoZXkgYWx3YXlzIHJlbG9hZCBwYWdlIHdoZW4gbG9jYXRpb24uaHJlZiBpcyB1cGRhdGVkCiAgaXNfS0hUTUw6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBhZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICByZXR1cm4gKGFnZW50LmluZGV4T2YoIktIVE1MIikgPj0gMCA/IHRydWUgOiBmYWxzZSk7CiAgfSwKCiAgLy8gZmluZCBzbGlkZSBuYW1lIGZyb20gZmlyc3QgaDEgZWxlbWVudAogIC8vIGRlZmF1bHQgdG8gZG9jdW1lbnQgdGl0bGUgKyBzbGlkZSBudW1iZXIKICBzbGlkZV9uYW1lOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgIHZhciBuYW1lID0gbnVsbDsKICAgIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzW2luZGV4XTsKCiAgICB2YXIgaGVhZGluZyA9IHRoaXMuZmluZF9oZWFkaW5nKHNsaWRlKTsKCiAgICBpZiAoaGVhZGluZykKICAgICAgbmFtZSA9IHRoaXMuZXh0cmFjdF90ZXh0KGhlYWRpbmcpOwoKICAgIGlmICghbmFtZSkKICAgICAgbmFtZSA9IHRoaXMudGl0bGUgKyAiKCIgKyAoaW5kZXggKyAxKSArICIpIjsKCiAgICBuYW1lLnJlcGxhY2UoL1wmL2csICImYW1wOyIpOwogICAgbmFtZS5yZXBsYWNlKC9cPC9nLCAiJmx0OyIpOwogICAgbmFtZS5yZXBsYWNlKC9cPi9nLCAiJmd0OyIpOwoKICAgIHJldHVybiBuYW1lOwogIH0sCgogIC8vIGZpbmQgZmlyc3QgaDEgZWxlbWVudCBpbiBET00gdHJlZQogIGZpbmRfaGVhZGluZzogZnVuY3Rpb24gKG5vZGUpIHsKICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBudWxsOwoKICAgIGlmIChub2RlLm5vZGVOYW1lID09ICJIMSIgfHwgbm9kZS5ub2RlTmFtZSA9PSAiaDEiKQogICAgICByZXR1cm4gbm9kZTsKCiAgICB2YXIgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7CgogICAgd2hpbGUgKGNoaWxkKQogICAgewogICAgICBub2RlID0gdGhpcy5maW5kX2hlYWRpbmcoY2hpbGQpOwoKICAgICAgaWYgKG5vZGUpCiAgICAgICAgcmV0dXJuIG5vZGU7CgogICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0sCgogIC8vIHJlY3Vyc2l2ZWx5IGV4dHJhY3QgdGV4dCBmcm9tIERPTSB0cmVlCiAgZXh0cmFjdF90ZXh0OiBmdW5jdGlvbiAobm9kZSkgewogICAgaWYgKCFub2RlKQogICAgICByZXR1cm4gIiI7CgogICAgLy8gdGV4dCBub2RlcwogICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykKICAgICAgcmV0dXJuIG5vZGUubm9kZVZhbHVlOwoKICAgIC8vIGVsZW1lbnRzCiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKQogICAgewogICAgICBub2RlID0gbm9kZS5maXJzdENoaWxkOwogICAgICB2YXIgdGV4dCA9ICIiOwoKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB0ZXh0ID0gdGV4dCArIHRoaXMuZXh0cmFjdF90ZXh0KG5vZGUpOwogICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICB9CgogICAgICByZXR1cm4gdGV4dDsKICAgIH0KCiAgICByZXR1cm4gIiI7CiAgfSwKCiAgLy8gZmluZCBjb3B5cmlnaHQgdGV4dCBmcm9tIG1ldGEgZWxlbWVudAogIGZpbmRfY29weXJpZ2h0OiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgbmFtZSwgY29udGVudDsKICAgIHZhciBtZXRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGEiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGEubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIG5hbWUgPSBtZXRhW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpOwogICAgICBjb250ZW50ID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoImNvbnRlbnQiKTsKCiAgICAgIGlmIChuYW1lID09ICJjb3B5cmlnaHQiKQogICAgICAgIHJldHVybiBjb250ZW50OwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0sCgogIGZpbmRfc2l6ZV9hZGp1c3Q6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBuYW1lLCBjb250ZW50LCBvZmZzZXQ7CiAgICB2YXIgbWV0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRhIik7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhLmxlbmd0aDsgKytpKQogICAgewogICAgICBuYW1lID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAgICAgY29udGVudCA9IG1ldGFbaV0uZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7CgogICAgICBpZiAobmFtZSA9PSAiZm9udC1zaXplLWFkanVzdG1lbnQiKQogICAgICAgIHJldHVybiAxICogY29udGVudDsKICAgIH0KCiAgICByZXR1cm4gMTsKICB9LAoKICAvLyA8bWV0YSBuYW1lPSJkdXJhdGlvbiIgY29udGVudD0iMjAiIC8+ICBmb3IgMjAgbWludXRlcwogIGZpbmRfZHVyYXRpb246IGZ1bmN0aW9uICgpIHsKICAgIHZhciBuYW1lLCBjb250ZW50LCBvZmZzZXQ7CiAgICB2YXIgbWV0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRhIik7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhLmxlbmd0aDsgKytpKQogICAgewogICAgICBuYW1lID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAgICAgY29udGVudCA9IG1ldGFbaV0uZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7CgogICAgICBpZiAobmFtZSA9PSAiZHVyYXRpb24iKQogICAgICAgIHJldHVybiA2MDAwMCAqIGNvbnRlbnQ7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfSwKCiAgcmVwbGFjZV9ieV9ub25fYnJlYWtpbmdfc3BhY2U6IGZ1bmN0aW9uIChzdHIpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKQogICAgICBzdHJbaV0gPSAxNjA7CiAgfSwKCiAgLy8gIyMjIENIRUNLIE1FICMjIyBpcyB1c2Ugb2YgImxpIiBva2F5IGZvciB0ZXh0L2h0bWw/CiAgLy8gZm9yIFhIVE1MIGRvIHdlIGFsc28gbmVlZCB0byBzcGVjaWZ5IG5hbWVzcGFjZT8KICBpbml0X291dGxpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaXRlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGkiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKQogICAgewogICAgICB2YXIgdGFyZ2V0ID0gaXRlbXNbaV07CgogICAgICBpZiAoIXRoaXMuaGFzX2NsYXNzKHRhcmdldC5wYXJlbnROb2RlLCAib3V0bGluZSIpKQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgdGFyZ2V0Lm9uY2xpY2sgPSB0aGlzLm91dGxpbmVfY2xpY2s7Ci8qICMjIyBtb3JlIHdvcmsgbmVlZGVkIGZvciBJRTYKICAgICAgaWYgKCF0aGlzLm5zX3BvcykKICAgICAgewogICAgICAgIHRhcmdldC5vbm1vdXNlb3ZlciA9IHRoaXMuaG92ZXJfb3V0bGluZTsKICAgICAgICB0YXJnZXQub25tb3VzZW91dCA9IHRoaXMudW5ob3Zlcl9vdXRsaW5lOwogICAgICB9CiovCiAgICAgIGlmICh0aGlzLmZvbGRhYmxlKHRhcmdldCkpCiAgICAgIHsKICAgICAgICB0YXJnZXQuZm9sZGFibGUgPSB0cnVlOwogICAgICAgIHRhcmdldC5vbmZvY3VzID0gZnVuY3Rpb24gKCkge3czY19zbGlkeS5vdXRsaW5lID0gdGhpczt9OwogICAgICAgIHRhcmdldC5vbmJsdXIgPSBmdW5jdGlvbiAoKSB7dzNjX3NsaWR5Lm91dGxpbmUgPSBudWxsO307CgogICAgICAgIGlmICghdGFyZ2V0LmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSkKICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwgIjAiKTsKCiAgICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKHRhcmdldCwgImV4cGFuZCIpKQogICAgICAgICAgdGhpcy51bmZvbGQodGFyZ2V0KTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLmZvbGQodGFyZ2V0KTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0aGlzLmFkZF9jbGFzcyh0YXJnZXQsICJub2ZvbGQiKTsKICAgICAgICB0YXJnZXQudmlzaWJsZSA9IHRydWU7CiAgICAgICAgdGFyZ2V0LmZvbGRhYmxlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9LAoKICBmb2xkYWJsZTogZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmICghaXRlbSB8fCBpdGVtLm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB2YXIgbm9kZSA9IGl0ZW0uZmlyc3RDaGlsZDsKCiAgICB3aGlsZSAobm9kZSkKICAgIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmlzX2Jsb2NrKG5vZGUpKQogICAgICAgIHJldHVybiB0cnVlOwoKICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIC8vICMjIyBDSEVDSyBNRSAjIyMgc3dpdGNoIHRvIGFkZC9yZW1vdmUgImhpZGRlbiIgY2xhc3MKICBmb2xkOiBmdW5jdGlvbiAoaXRlbSkgewogICAgaWYgKGl0ZW0pCiAgICB7CiAgICAgIHRoaXMucmVtb3ZlX2NsYXNzKGl0ZW0sICJ1bmZvbGRlZCIpOwogICAgICB0aGlzLmFkZF9jbGFzcyhpdGVtLCAiZm9sZGVkIik7CiAgICB9CgogICAgdmFyIG5vZGUgPSBpdGVtID8gaXRlbS5maXJzdENoaWxkIDogbnVsbDsKCiAgICB3aGlsZSAobm9kZSkKICAgIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmlzX2Jsb2NrKG5vZGUpKSAvLyBlbGVtZW50CiAgICAgIHsKICAgICAgICAgdzNjX3NsaWR5LmFkZF9jbGFzcyhub2RlLCAiaGlkZGVuIik7CiAgICAgIH0KCiAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgfQoKICAgIGl0ZW0udmlzaWJsZSA9IGZhbHNlOwogIH0sCgogIC8vICMjIyBDSEVDSyBNRSAjIyMgc3dpdGNoIHRvIGFkZC9yZW1vdmUgImhpZGRlbiIgY2xhc3MKICB1bmZvbGQ6IGZ1bmN0aW9uIChpdGVtKSB7CiAgICBpZiAoaXRlbSkKICAgIHsKICAgICAgdGhpcy5hZGRfY2xhc3MoaXRlbSwgInVuZm9sZGVkIik7CiAgICAgIHRoaXMucmVtb3ZlX2NsYXNzKGl0ZW0sICJmb2xkZWQiKTsKICAgIH0KCiAgICB2YXIgbm9kZSA9IGl0ZW0gPyBpdGVtLmZpcnN0Q2hpbGQgOiBudWxsOwoKICAgIHdoaWxlIChub2RlKQogICAgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIHRoaXMuaXNfYmxvY2sobm9kZSkpIC8vIGVsZW1lbnQKICAgICAgewogICAgICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3Mobm9kZSwgImhpZGRlbiIpOwogICAgICB9CgogICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZzsKICAgIH0KCiAgICBpdGVtLnZpc2libGUgPSB0cnVlOwogIH0sCgogIG91dGxpbmVfY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICBpZiAoIWUpCiAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgdmFyIHJpZ2h0Y2xpY2sgPSBmYWxzZTsKICAgIHZhciB0YXJnZXQgPSB3M2Nfc2xpZHkuZ2V0X3RhcmdldChlKTsKCiAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC52aXNpYmxlID09IHVuZGVmaW5lZCkKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgaWYgKCF0YXJnZXQpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmIChlLndoaWNoKQogICAgICByaWdodGNsaWNrID0gKGUud2hpY2ggPT0gMyk7CiAgICBlbHNlIGlmIChlLmJ1dHRvbikKICAgICAgcmlnaHRjbGljayA9IChlLmJ1dHRvbiA9PSAyKTsKCiAgICBpZiAoIXJpZ2h0Y2xpY2sgJiYgdGFyZ2V0LnZpc2libGUgIT0gdW5kZWZpbmVkKQogICAgewogICAgICBpZiAodGFyZ2V0LmZvbGRhYmxlKQogICAgICB7CiAgICAgICAgaWYgKHRhcmdldC52aXNpYmxlKQogICAgICAgICAgdzNjX3NsaWR5LmZvbGQodGFyZ2V0KTsKICAgICAgICBlbHNlCiAgICAgICAgICB3M2Nfc2xpZHkudW5mb2xkKHRhcmdldCk7CiAgICAgIH0KCiAgICAgIHczY19zbGlkeS5zdG9wX3Byb3BhZ2F0aW9uKGUpOwogICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgYWRkX2luaXRpYWxfcHJvbXB0OiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgcHJvbXB0ID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICBwcm9tcHQuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJpbml0aWFsX3Byb21wdCIpOwoKICAgIHZhciBwMSA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoInAiKTsKICAgIHByb21wdC5hcHBlbmRDaGlsZChwMSk7CiAgICBwMS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgImhlbHAiKTsKCiAgICBpZiAodGhpcy5rZXlib2FyZGxlc3MpCiAgICAgIHAxLmlubmVySFRNTCA9ICJzd2lwZSBsZWZ0IHRvIG1vdmUgdG8gbmV4dCBzbGlkZSI7CiAgICBlbHNlCiAgICAgIHAxLmlubmVySFRNTCA9ICJTcGFjZSwgUmlnaHQgQXJyb3cgb3Igc3dpcGUgbGVmdCB0byBtb3ZlIHRvICIgKwogICAgICAgICAgICAgICAgICAgICAibmV4dCBzbGlkZSwgY2xpY2sgaGVscCBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzIjsKCiAgICB0aGlzLmFkZF9saXN0ZW5lcihwcm9tcHQsICJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocHJvbXB0KTsKICAgICAgdzNjX3NsaWR5LnN0b3BfcHJvcGFnYXRpb24oZSk7CiAgICAKICAgICAgaWYgKGUuY2FuY2VsICE9IHVuZGVmaW5lZCkKICAgICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIAogICAgICBpZiAoZS5yZXR1cm5WYWx1ZSAhPSB1bmRlZmluZWQpCiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogICAgICAKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwcm9tcHQpOwogICAgdGhpcy5pbml0aWFsX3Byb21wdCA9IHByb21wdDsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChwcm9tcHQpO30sIDUwMDApOwogIH0sCgogIGFkZF90b29sYmFyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgY291bnRlciwgcGFnZTsKCiAgICAgdGhpcy50b29sYmFyID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICAgdGhpcy50b29sYmFyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAidG9vbGJhciIpOwoKICAgICAvLyBhIHJlYXNvbmFibHkgYmVoYXZlZCBicm93c2VyCiAgICAgaWYgKHRoaXMubnNfcG9zIHx8ICF0aGlzLmllNikKICAgICB7CiAgICAgICB2YXIgcmlnaHQgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKTsKICAgICAgIHJpZ2h0LnNldEF0dHJpYnV0ZSgic3R5bGUiLCAiZmxvYXQ6IHJpZ2h0OyB0ZXh0LWFsaWduOiByaWdodCIpOwoKICAgICAgIGNvdW50ZXIgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIikKICAgICAgIGNvdW50ZXIuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgic2xpZGUiKSArICIgbi9tIjsKICAgICAgIHJpZ2h0LmFwcGVuZENoaWxkKGNvdW50ZXIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKHJpZ2h0KTsKCiAgICAgICB2YXIgbGVmdCA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImRpdiIpOwogICAgICAgbGVmdC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgInRleHQtYWxpZ246IGxlZnQiKTsKCiAgICAgICAvLyBnbG9iYWwgZW5kIG9mIHNsaWRlIGluZGljYXRvcgogICAgICAgdGhpcy5lb3MgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICB0aGlzLmVvcy5pbm5lckhUTUwgPSAiKiAiOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZCh0aGlzLmVvcyk7CgogICAgICAgdmFyIGhlbHAgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJhIik7CiAgICAgICBoZWxwLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHRoaXMuaGVscF9wYWdlKTsKICAgICAgIGhlbHAuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHRoaXMubG9jYWxpemUodGhpcy5oZWxwX3RleHQpKTsKICAgICAgIGhlbHAuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgiaGVscD8iKTsKICAgICAgIGxlZnQuYXBwZW5kQ2hpbGQoaGVscCk7CiAgICAgICBoZWxwLnN0eWxlLmRpc3BsYXk9Im5vbmUiOyAKICAgICAgIHRoaXMuaGVscF9hbmNob3IgPSBoZWxwOyAgLy8gc2F2ZSBmb3IgZm9jdXMgaGFjawoKICAgICAgIHZhciBnYXAxID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKTsKICAgICAgIGxlZnQuYXBwZW5kQ2hpbGQoZ2FwMSk7CgogICAgICAgdmFyIGNvbnRlbnRzID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiYSIpOwogICAgICAgY29udGVudHMuc2V0QXR0cmlidXRlKCJocmVmIiwgImphdmFzY3JpcHQ6dzNjX3NsaWR5LnRvZ2dsZV90YWJsZV9vZl9jb250ZW50cygpIik7CiAgICAgICBjb250ZW50cy5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSgidGFibGUgb2YgY29udGVudHMiKSk7CiAgICAgICBjb250ZW50cy5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJDb250ZW50cyIpOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZChjb250ZW50cyk7CgogICAgICAgdmFyIGdhcDIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZChnYXAyKTsKCiAgICAgICB2YXIgY29weXJpZ2h0ID0gdGhpcy5maW5kX2NvcHlyaWdodCgpOwoKICAgICAgIGlmIChjb3B5cmlnaHQpCiAgICAgICB7CiAgICAgICAgIHZhciBzcGFuID0gdGhpcy5jcmVhdGVfZWxlbWVudCgic3BhbiIpOwogICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICJjb3B5cmlnaHQiOwogICAgICAgICBzcGFuLmlubmVySFRNTCA9IGNvcHlyaWdodDsKICAgICAgICAgbGVmdC5hcHBlbmRDaGlsZChzcGFuKTsKICAgICAgIH0KCiAgICAgICB0aGlzLnRvb2xiYXIuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsICIwIik7CiAgICAgICB0aGlzLnRvb2xiYXIuYXBwZW5kQ2hpbGQobGVmdCk7CiAgICAgfQogICAgIGVsc2UgLy8gSUU2IHNvIG5lZWQgdG8gd29yayBhcm91bmQgaXRzIHBvb3IgQ1NTIHN1cHBvcnQKICAgICB7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUucG9zaXRpb24gPSAodGhpcy5pZTcgPyAiZml4ZWQiIDogImFic29sdXRlIik7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUuekluZGV4ID0gIjIwMCI7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUud2lkdGggPSAiOTkuOSUiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmhlaWdodCA9ICIxLjJlbSI7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUudG9wID0gImF1dG8iOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmJvdHRvbSA9ICIwIjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5sZWZ0ID0gIjAiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5mb250U2l6ZSA9ICI2MCUiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmNvbG9yID0gInJlZCI7CiAgICAgICB0aGlzLnRvb2xiYXIuYm9yZGVyV2lkdGggPSAwOwogICAgICAgdGhpcy50b29sYmFyLmNsYXNzTmFtZSA9ICJ0b29sYmFyIjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5iYWNrZ3JvdW5kID0gInJnYigyNDAsMjQwLDI0MCkiOwoKICAgICAgIC8vIHdvdWxkIGxpa2UgdG8gaGF2ZSBoZWxwIHRleHQgbGVmdCBhbGlnbmVkCiAgICAgICAvLyBhbmQgcGFnZSBjb3VudGVyIHJpZ2h0IGFsaWduZWQsIGZsb2F0aW5nCiAgICAgICAvLyBkaXYncyBkb24ndCB3b3JrLCBzbyBpbnN0ZWFkIHVzZSBuZXN0ZWQKICAgICAgIC8vIGFic29sdXRlbHkgcG9zaXRpb25lZCBkaXYncy4KCiAgICAgICB2YXIgc3AgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICBzcC5pbm5lckhUTUwgPSAiJm5ic3A7Jm5ic3A7KiZuYnNwOyI7CiAgICAgICB0aGlzLnRvb2xiYXIuYXBwZW5kQ2hpbGQoc3ApOwogICAgICAgdGhpcy5lb3MgPSBzcDsgIC8vIGVuZCBvZiBzbGlkZSBpbmRpY2F0b3IKCiAgICAgICB2YXIgaGVscCA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImEiKTsKICAgICAgIGhlbHAuc2V0QXR0cmlidXRlKCJocmVmIiwgdGhpcy5oZWxwX3BhZ2UpOwogICAgICAgaGVscC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSh0aGlzLmhlbHBfdGV4dCkpOwogICAgICAgaGVscC5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJoZWxwPyIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGhlbHApOwogICAgICAgdGhpcy5oZWxwX2FuY2hvciA9IGhlbHA7ICAvLyBzYXZlIGZvciBmb2N1cyBoYWNrCgogICAgICAgdmFyIGdhcDEgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGdhcDEpOwoKICAgICAgIHZhciBjb250ZW50cyA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImEiKTsKICAgICAgIGNvbnRlbnRzLnNldEF0dHJpYnV0ZSgiaHJlZiIsICJqYXZhc2NyaXB0OnRvZ2dsZVRhYmxlT2ZDb250ZW50cygpIik7CiAgICAgICBjb250ZW50cy5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSgidGFibGUgb2YgY29udGVudHMiLmxvY2FsaXplKSk7CiAgICAgICBjb250ZW50cy5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJjb250ZW50cz8iKTsKICAgICAgIHRoaXMudG9vbGJhci5hcHBlbmRDaGlsZChjb250ZW50cyk7CgogICAgICAgdmFyIGdhcDIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGdhcDIpOwoKICAgICAgIHZhciBjb3B5cmlnaHQgPSB0aGlzLmZpbmRfY29weXJpZ2h0KCk7CgogICAgICAgaWYgKGNvcHlyaWdodCkKICAgICAgIHsKICAgICAgICAgdmFyIHNwYW4gPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICAgIHNwYW4uaW5uZXJIVE1MID0gY29weXJpZ2h0OwogICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gImJsYWNrIjsKICAgICAgICAgc3Bhbi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjAuNWVtIjsKICAgICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKHNwYW4pOwogICAgICAgfQoKICAgICAgIGNvdW50ZXIgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKQogICAgICAgY291bnRlci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgICBjb3VudGVyLnN0eWxlLndpZHRoID0gImF1dG8iOyAvLyIyMCUiOwogICAgICAgY291bnRlci5zdHlsZS5oZWlnaHQgPSAiMS4yZW0iOwogICAgICAgY291bnRlci5zdHlsZS50b3AgPSAiYXV0byI7CiAgICAgICBjb3VudGVyLnN0eWxlLmJvdHRvbSA9IDA7CiAgICAgICBjb3VudGVyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgY291bnRlci5zdHlsZS50ZXh0QWxpZ24gPSAicmlnaHQiOwogICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9ICJyZWQiOwogICAgICAgY291bnRlci5zdHlsZS5iYWNrZ3JvdW5kID0gInJnYigyNDAsMjQwLDI0MCkiOwoKICAgICAgIGNvdW50ZXIuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgic2xpZGUiKSArICIgbi9tIjsKICAgICAgIHRoaXMudG9vbGJhci5hcHBlbmRDaGlsZChjb3VudGVyKTsKICAgICB9CgogICAgIC8vIGVuc3VyZSB0aGF0IGNsaWNrIGlzbid0IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBwYWdlCiAgICAgdGhpcy50b29sYmFyLm9uY2xpY2sgPQogICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDsKCiAgICAgICAgICAgaWYgKCF0YXJnZXQgJiYgZS5zcmNFbGVtZW50KQogICAgICAgICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgICAgICAgICAvLyB3b3JrIGFyb3VuZCBTYWZhcmkgYnVnCiAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMykKICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwoKICAgICAgICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKCiAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiYSIpCiAgICAgICAgICAgICB3M2Nfc2xpZHkubW91c2VfYnV0dG9uX2NsaWNrKGUpOwogICAgICAgICB9OwoKICAgICB0aGlzLnNsaWRlX251bWJlcl9lbGVtZW50ID0gY291bnRlcjsKICAgICB0aGlzLnNldF9lb3Nfc3RhdHVzKGZhbHNlKTsKICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMudG9vbGJhcik7CiAgfSwKCiAgLy8gd3lzaXd5ZyBlZGl0b3JzIG1ha2UgaXQgaGFyZCB0byB1c2UgZGl2IGVsZW1lbnRzCiAgLy8gZS5nLiBhbWF5YSBsb3NlcyB0aGUgZGl2IHdoZW4geW91IGNvcHkgYW5kIHBhc3RlCiAgLy8gdGhpcyBmdW5jdGlvbiB3cmFwcyBkaXYgZWxlbWVudHMgYXJvdW5kIGltcGxpY2l0CiAgLy8gc2xpZGVzIHdoaWNoIHN0YXJ0IHdpdGggYW4gaDEgZWxlbWVudCBhbmQgY29udGludWUKICAvLyB1cCB0byB0aGUgbmV4dCBoZWFkaW5nIG9yIGRpdiBlbGVtZW50CiAgd3JhcF9pbXBsaWNpdF9zbGlkZXM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBpLCBoZWFkaW5nLCBub2RlLCBuZXh0LCBkaXY7CiAgICB2YXIgaGVhZGluZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaDEiKTsKCiAgICBpZiAoIWhlYWRpbmdzKQogICAgICByZXR1cm47CgogICAgZm9yIChpID0gMDsgaSA8IGhlYWRpbmdzLmxlbmd0aDsgKytpKQogICAgewogICAgICBoZWFkaW5nID0gaGVhZGluZ3NbaV07CgogICAgICBpZiAoaGVhZGluZy5wYXJlbnROb2RlICE9IGRvY3VtZW50LmJvZHkpCiAgICAgICAgY29udGludWU7CgogICAgICBub2RlID0gaGVhZGluZy5uZXh0U2libGluZzsKCiAgICAgIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB0aGlzLmFkZF9jbGFzcyhkaXYsICJzbGlkZSIpOwogICAgICBkb2N1bWVudC5ib2R5LnJlcGxhY2VDaGlsZChkaXYsIGhlYWRpbmcpOwogICAgICBkaXYuYXBwZW5kQ2hpbGQoaGVhZGluZyk7CgogICAgICB3aGlsZSAobm9kZSkKICAgICAgewogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpIC8vIGFuIGVsZW1lbnQKICAgICAgICB7CiAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkgxIiB8fCBub2RlLm5vZGVOYW1lID09ICJoMSIpCiAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkRJViIgfHwgbm9kZS5ub2RlTmFtZSA9PSAiZGl2IikKICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAodGhpcy5oYXNfY2xhc3Mobm9kZSwgInNsaWRlIikpCiAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgIGlmICh0aGlzLmhhc19jbGFzcyhub2RlLCAiaGFuZG91dCIpKQogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXh0ID0gbm9kZS5uZXh0U2libGluZzsKICAgICAgICBub2RlID0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgbm9kZSA9IG5leHQ7CiAgICAgIH0gCiAgICB9CiAgfSwKCiAgYXR0YWNoX3RvdWNoX2hhbmRlcnM6IGZ1bmN0aW9uKHNsaWRlcykKICB7CiAgICB2YXIgaSwgc2xpZGU7CgogICAgZm9yIChpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgc2xpZGUgPSBzbGlkZXNbaV07CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKHNsaWRlLCAidG91Y2hzdGFydCIsIHRoaXMudG91Y2hzdGFydCk7CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKHNsaWRlLCAidG91Y2htb3ZlIiwgdGhpcy50b3VjaG1vdmUpOwogICAgICB0aGlzLmFkZF9saXN0ZW5lcihzbGlkZSwgInRvdWNoZW5kIiwgdGhpcy50b3VjaGVuZCk7CiAgICB9CiAgfSwKCi8vIHJldHVybiBuZXcgYXJyYXkgb2YgYWxsIHNsaWRlcwogIGNvbGxlY3Rfc2xpZGVzOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2xpZGVzID0gbmV3IEFycmF5KCk7CiAgICB2YXIgZGl2cyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGl2cy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgZGl2ID0gZGl2cy5pdGVtKGkpOwoKICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKGRpdiwgInNsaWRlIikpCiAgICAgIHsKICAgICAgICAvLyBhZGQgc2xpZGUgdG8gY29sbGVjdGlvbgogICAgICAgIHNsaWRlc1tzbGlkZXMubGVuZ3RoXSA9IGRpdjsKCiAgICAgICAgLy8gaGlkZSBlYWNoIHNsaWRlIGFzIGl0IGlzIGZvdW5kCiAgICAgICAgdGhpcy5hZGRfY2xhc3MoZGl2LCAiaGlkZGVuIik7CgogICAgICAgIC8vIGFkZCBkdW1teSA8YnIvPiBhdCBlbmQgZm9yIHNjcm9sbGluZyBoYWNrCiAgICAgICAgdmFyIG5vZGUxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKTsKICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZTEpOwogICAgICAgIHZhciBub2RlMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIik7CiAgICAgICAgZGl2LmFwcGVuZENoaWxkKG5vZGUyKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0aGlzLmhhc19jbGFzcyhkaXYsICJiYWNrZ3JvdW5kIikpCiAgICAgIHsgIC8vIHdvcmsgYXJvdW5kIGZvciBGaXJlZm94IFNWRyByZWxvYWQgYnVnCiAgICAgICAgLy8gd2hpY2ggb3RoZXJ3aXNlIHJlcGxhY2VzIDFzdCBTVkcgZ3JhcGhpYyB3aXRoIDJuZAogICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgfQogICAgfQoKICAgIHRoaXMuc2xpZGVzID0gc2xpZGVzOwogIH0sCgogIC8vIHJldHVybiBuZXcgYXJyYXkgb2YgYWxsIDxkaXYgY2xhc3M9ImhhbmRvdXQiPgogIGNvbGxlY3Rfbm90ZXM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBub3RlcyA9IG5ldyBBcnJheSgpOwogICAgdmFyIGRpdnMgPSBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpdnMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGRpdiA9IGRpdnMuaXRlbShpKTsKCiAgICAgIGlmICh0aGlzLmhhc19jbGFzcyhkaXYsICJoYW5kb3V0IikpCiAgICAgIHsKICAgICAgICAvLyBhZGQgbm90ZSB0byBjb2xsZWN0aW9uCiAgICAgICAgbm90ZXNbbm90ZXMubGVuZ3RoXSA9IGRpdjsKCiAgICAgICAgLy8gYW5kIGhpZGUgaXQKICAgICAgICB0aGlzLmFkZF9jbGFzcyhkaXYsICJoaWRkZW4iKTsKICAgICAgfQogICAgfQoKICAgIHRoaXMubm90ZXMgPSBub3RlczsKICB9LAoKICAvLyByZXR1cm4gbmV3IGFycmF5IG9mIGFsbCA8ZGl2IGNsYXNzPSJiYWNrZ3JvdW5kIj4KICAvLyBpbmNsdWRpbmcgbmFtZWQgYmFja2dyb3VuZHMgZS5nLiBjbGFzcz0iYmFja2dyb3VuZCB0aXRsZXBhZ2UiCiAgY29sbGVjdF9iYWNrZ3JvdW5kczogZnVuY3Rpb24gKCkgewogICAgdmFyIGJhY2tncm91bmRzID0gbmV3IEFycmF5KCk7CiAgICB2YXIgZGl2cyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGl2cy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgZGl2ID0gZGl2cy5pdGVtKGkpOwoKICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKGRpdiwgImJhY2tncm91bmQiKSkKICAgICAgewogICAgICAgIC8vIGFkZCBiYWNrZ3JvdW5kIHRvIGNvbGxlY3Rpb24KICAgICAgICBiYWNrZ3JvdW5kc1tiYWNrZ3JvdW5kcy5sZW5ndGhdID0gZGl2OwoKICAgICAgICAvLyBhbmQgaGlkZSBpdAogICAgICAgIHRoaXMuYWRkX2NsYXNzKGRpdiwgImhpZGRlbiIpOwogICAgICB9CiAgICB9CgogICAgdGhpcy5iYWNrZ3JvdW5kcyA9IGJhY2tncm91bmRzOwogIH0sCgogIC8vIHNldCBjbGljayBoYW5kbGVycyBvbiBhbGwgYW5jaG9ycwogIHBhdGNoX2FuY2hvcnM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdzNjX3NsaWR5OwogICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgLy8gY29tcGFyZSB0aGlzLmhyZWYgd2l0aCBsb2NhdGlvbi5ocmVmCiAgICAgIC8vIGZvciBsaW5rIHRvIGFub3RoZXIgc2xpZGUgaW4gdGhpcyBkb2MKCiAgICAgIGlmIChzZWxmLnBhZ2VfYWRkcmVzcyh0aGlzLmhyZWYpID09IHNlbGYucGFnZV9hZGRyZXNzKGxvY2F0aW9uLmhyZWYpKQogICAgICB7CiAgICAgICAgLy8geWVzLCBzbyBmaW5kIG5ldyBzbGlkZSBudW1iZXIKICAgICAgICB2YXIgbmV3c2xpZGVudW0gPSBzZWxmLmZpbmRfc2xpZGVfbnVtYmVyKHRoaXMuaHJlZik7CgogICAgICAgIGlmIChuZXdzbGlkZW51bSAhPSBzZWxmLnNsaWRlX251bWJlcikKICAgICAgICB7CiAgICAgICAgICB2YXIgc2xpZGUgPSBzZWxmLnNsaWRlc1tzZWxmLnNsaWRlX251bWJlcl07CiAgICAgICAgICBzZWxmLmhpZGVfc2xpZGUoc2xpZGUpOwogICAgICAgICAgc2VsZi5zbGlkZV9udW1iZXIgPSBuZXdzbGlkZW51bTsKICAgICAgICAgIHNsaWRlID0gc2VsZi5zbGlkZXNbc2VsZi5zbGlkZV9udW1iZXJdOwogICAgICAgICAgc2VsZi5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgICAgIHNlbGYuc2V0X2xvY2F0aW9uKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihldmVudCk7CgovLyAgICAgIGVsc2UgaWYgKHRoaXMudGFyZ2V0ID09IG51bGwpCi8vICAgICAgICBsb2NhdGlvbi5ocmVmID0gdGhpcy5ocmVmOwoKICAgICAgdGhpcy5ibHVyKCk7CiAgICAgIHNlbGYuZGlzYWJsZV9zbGlkZV9jbGljayA9IHRydWU7CiAgICB9OwoKICAgIHZhciBhbmNob3JzID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKQogICAgICAgIGFuY2hvcnNbaV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBoYW5kbGVyLCBmYWxzZSk7CiAgICAgIGVsc2UKICAgICAgICBhbmNob3JzW2ldLmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgaGFuZGxlcik7CiAgICB9CiAgfSwKCiAgLy8gIyMjIENIRUNLIE1FICMjIyBzZWUgd2hpY2ggZnVuY3Rpb25zIGFyZSBpbnZva2VkIHZpYSBzZXRUaW1lb3V0CiAgLy8gZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZm9yIHVzZSBvZiB3M2Nfc2xpZHkgdnMgdGhpcwogIHNob3dfc2xpZGVfbnVtYmVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGltZXIgPSB3M2Nfc2xpZHkuZ2V0X3RpbWVyKCk7CiAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyX2VsZW1lbnQuaW5uZXJIVE1MID0gdGltZXIgKyB3M2Nfc2xpZHkubG9jYWxpemUoInNsaWRlIikgKyAiICIgKwogICAgICAgICAgICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyICsgMSkgKyAiLyIgKyB3M2Nfc2xpZHkuc2xpZGVzLmxlbmd0aDsKICB9LAoKICAvLyBldmVyeSAyMDBtUyBjaGVjayBpZiB0aGUgbG9jYXRpb24gaGFzIGJlZW4gY2hhbmdlZCBhcyBhCiAgLy8gcmVzdWx0IG9mIHRoZSB1c2VyIGFjdGl2YXRpbmcgdGhlIEJhY2sgYnV0dG9uL21lbnUgaXRlbQogIC8vIGRvZXNuJ3Qgd29yayBmb3IgT3BlcmEgPCA5LjUKICBjaGVja19sb2NhdGlvbjogZnVuY3Rpb24gKCkgewogICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoOwoKICAgIGlmICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID4gMCAmJiAoaGFzaCA9PSAiIiB8fCBoYXNoID09ICIjIikpCiAgICAgIHczY19zbGlkeS5nb3RvX3NsaWRlKDApOwogICAgZWxzZSBpZiAoaGFzaC5sZW5ndGggPiAyICYmIGhhc2ggIT0gIiMoIisodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSsiKSIpCiAgICB7CiAgICAgIHZhciBudW0gPSBwYXJzZUludChsb2NhdGlvbi5oYXNoLnN1YnN0cigyKSk7CgogICAgICBpZiAoIWlzTmFOKG51bSkpCiAgICAgICAgdzNjX3NsaWR5LmdvdG9fc2xpZGUobnVtLTEpOwogICAgfQoKICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0ICYmIHczY19zbGlkeS5zbGlkZV9udW1iZXIgPiAwKQogICAgewogICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKCiAgICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0ID4gMCkKICAgICAgICB3M2Nfc2xpZHkudGltZV9sZWZ0IC09IDIwMDsKICAgIH0gCiAgfSwKCiAgZ2V0X3RpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGltZXIgPSAiIjsKICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0KQogICAgewogICAgICB2YXIgbWlucywgc2VjczsKICAgICAgc2VjcyA9IE1hdGguZmxvb3IodzNjX3NsaWR5LnRpbWVfbGVmdC8xMDAwKTsKICAgICAgbWlucyA9IE1hdGguZmxvb3Ioc2VjcyAvIDYwKTsKICAgICAgc2VjcyA9IHNlY3MgJSA2MDsKICAgICAgdGltZXIgPSAobWlucyA/IG1pbnMrIm0iIDogIiIpICsgc2VjcyArICJzICI7CiAgICB9CgogICAgcmV0dXJuIHRpbWVyOwogIH0sCgogIC8vIHRoaXMgZG9lc24ndCBwdXNoIGxvY2F0aW9uIG9udG8gaGlzdG9yeSBzdGFjayBmb3IgSUUKICAvLyBmb3Igd2hpY2ggYSBoaWRkZW4gaWZyYW1lIGhhY2sgaXMgbmVlZGVkOiBsb2FkIHBhZ2UgaW50bwogIC8vIHRoZSBpZnJhbWUgd2l0aCBzY3JpcHQgdGhhdCBzZXQncyBwYXJlbnQncyBsb2NhdGlvbi5oYXNoCiAgLy8gYnV0IHRoYXQgd29uJ3Qgd29yayBmb3Igc3RhbmRhbG9uZSB1c2UgdW5sZXNzIHdlIGNhbgogIC8vIGNyZWF0ZSB0aGUgcGFnZSBkeW5hbWljYWxseSB2aWEgYSBqYXZhc2NyaXB0OiBVUkwKICAvLyAjIyMgdXNlIGhpc3RvcnkucHVzaFN0YXRlIGlmIGF2YWlsYWJsZQogIHNldF9sb2NhdGlvbjogZnVuY3Rpb24gKCkgewogICAgIHZhciB1cmkgPSB3M2Nfc2xpZHkucGFnZV9hZGRyZXNzKGxvY2F0aW9uLmhyZWYpOwogICAgIHZhciBoYXNoID0gIiMoIiArICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyKzEpICsgIikiOwoKICAgICBpZiAodzNjX3NsaWR5LnNsaWRlX251bWJlciA+PSAwKQogICAgICAgdXJpID0gdXJpICsgaGFzaDsKCiAgICAgaWYgKHR5cGVvZihoaXN0b3J5LnB1c2hTdGF0ZSkgIT0gInVuZGVmaW5lZCIgJiYgbG9jYXRpb24ucHJvdG9jb2wgIT09ICJmaWxlOiIpCiAgICAgewogICAgICAgZG9jdW1lbnQudGl0bGUgPSB3M2Nfc2xpZHkudGl0bGUgKyAiICgiICsgKHczY19zbGlkeS5zbGlkZV9udW1iZXIrMSkgKyAiKSI7CiAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZSgwLCBkb2N1bWVudC50aXRsZSwgaGFzaCk7CiAgICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKICAgICAgIHczY19zbGlkeS5ub3RpZnlfb2JzZXJ2ZXJzKCk7CiAgICAgICByZXR1cm47CiAgICAgfQoKICAgICBpZiAodzNjX3NsaWR5LmllICYmICh3M2Nfc2xpZHkuaWU2IHx8IHczY19zbGlkeS5pZTcpKQogICAgICAgdzNjX3NsaWR5LnB1c2hfaGFzaChoYXNoKTsKCiAgICAgaWYgKHVyaSAhPSBsb2NhdGlvbi5ocmVmKSAvLyAmJiAha2h0bWwKICAgICAgICBsb2NhdGlvbi5ocmVmID0gdXJpOwoKICAgICBpZiAodGhpcy5raHRtbCkKICAgICAgICBoYXNoID0gIigiICsgKHczY19zbGlkeS5zbGlkZV9udW1iZXIrMSkgKyAiKSI7CgogICAgIGlmICghdGhpcy5pZSAmJiBsb2NhdGlvbi5oYXNoICE9IGhhc2ggJiYgbG9jYXRpb24uaGFzaCAhPSAiIikKICAgICAgIGxvY2F0aW9uLmhhc2ggPSBoYXNoOwoKICAgICBkb2N1bWVudC50aXRsZSA9IHczY19zbGlkeS50aXRsZSArICIgKCIgKyAodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSArICIpIjsKICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKICAgICB3M2Nfc2xpZHkubm90aWZ5X29ic2VydmVycygpOwogIH0sCgogIG5vdGlmeV9vYnNlcnZlcnM6IGZ1bmN0aW9uICgpCiAgewogICAgdmFyIHNsaWRlID0gdGhpcy5zbGlkZXNbdGhpcy5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMubGVuZ3RoOyArK2kpCiAgICAgIHRoaXMub2JzZXJ2ZXJzW2ldKHRoaXMuc2xpZGVfbnVtYmVyKzEsIHRoaXMuZmluZF9oZWFkaW5nKHNsaWRlKS5pbm5lclRleHQsIGxvY2F0aW9uLmhyZWYpOwogIH0sCgogIGFkZF9vYnNlcnZlcjogZnVuY3Rpb24gKG9ic2VydmVyKQogIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGlmIChvYnNlcnZlciA9PSB0aGlzLm9ic2VydmVyc1tpXSkKICAgICAgICByZXR1cm47CiAgICB9CgogICAgdGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7CiAgfSwKCiAgcmVtb3ZlX29ic2VydmVyOiBmdW5jdGlvbiAobykKICB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDsgKytpKQogICAgewogICAgICBpZiAob2JzZXJ2ZXIgPT0gdGhpcy5vYnNlcnZlcnNbaV0pCiAgICAgIHsKICAgICAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaSwxKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0sCgogIHBhZ2VfYWRkcmVzczogZnVuY3Rpb24gKHVyaSkgewogICAgdmFyIGkgPSB1cmkuaW5kZXhPZigiIyIpOwoKICAgIGlmIChpIDwgMCkKICAgICAgaSA9IHVyaS5pbmRleE9mKCIlMjMiKTsKCiAgICAvLyBjaGVjayBpZiBhbmNob3IgaXMgZW50aXJlIHBhZ2UKCiAgICBpZiAoaSA8IDApCiAgICAgIHJldHVybiB1cmk7ICAvLyB5ZXMKCiAgICByZXR1cm4gdXJpLnN1YnN0cigwLCBpKTsKICB9LAoKICAvLyBvbmx5IHVzZWQgZm9yIElFNiBhbmQgSUU3CiAgb25fZnJhbWVfbG9hZGVkOiBmdW5jdGlvbiAoaGFzaCkgewogICAgbG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgICB2YXIgdXJpID0gdzNjX3NsaWR5LnBhZ2VfYWRkcmVzcyhsb2NhdGlvbi5ocmVmKTsKICAgIGxvY2F0aW9uLmhyZWYgPSB1cmkgKyBoYXNoOwogIH0sCgogIC8vIGhpc3RvcnkgaGFjayB3aXRoIHRoYW5rcyB0byBCZXJ0cmFuZCBMZSBSb3kKICBwdXNoX2hhc2g6IGZ1bmN0aW9uIChoYXNoKSB7CiAgICBpZiAoaGFzaCA9PSAiIikgaGFzaCA9ICIjKDEpIjsKICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBoYXNoOwoKICAgIHZhciBkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaGlzdG9yeUZyYW1lIikuY29udGVudFdpbmRvdy5kb2N1bWVudDsKICAgIGRvYy5vcGVuKCJqYXZhc2NyaXB0Oic8aHRtbD48L2h0bWw+JyIpOwogICAgZG9jLndyaXRlKCI8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj53aW5kb3cucGFyZW50LnczY19zbGlkeS5vbl9mcmFtZV9sb2FkZWQoJyIrCiAgICAgIChoYXNoKSArICInKTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+aGVsbG8gbXVtPC9ib2R5PjwvaHRtbD4iKTsKICAgICAgZG9jLmNsb3NlKCk7CiAgfSwKCiAgLy8gZmluZCBjdXJyZW50IHNsaWRlIGJhc2VkIHVwb24gbG9jYXRpb24KICAvLyBmaXJzdCBmaW5kIHRhcmdldCBhbmNob3IgYW5kIHRoZW4gbG9vawogIC8vIGZvciBhc3NvY2lhdGVkIGRpdiBlbGVtZW50IGVuY2xvc2luZyBpdAogIC8vIGZpbmFsbHkgbWFwIHRoYXQgdG8gc2xpZGUgbnVtYmVyCiAgZmluZF9zbGlkZV9udW1iZXI6IGZ1bmN0aW9uICh1cmkpIHsKICAgIC8vIGZpcnN0IGdldCBhbmNob3IgZnJvbSBwYWdlIGxvY2F0aW9uCgogICAgdmFyIGkgPSB1cmkuaW5kZXhPZigiIyIpOwoKICAgIC8vIGNoZWNrIGlmIGFuY2hvciBpcyBlbnRpcmUgcGFnZQogICAgaWYgKGkgPCAwKQogICAgICByZXR1cm4gMDsgIC8vIHllcwoKICAgIHZhciBhbmNob3IgPSB1bmVzY2FwZSh1cmkuc3Vic3RyKGkrMSkpOwoKICAgIC8vIG5vdyB1c2UgYW5jaG9yIGFzIFhNTCBJRCB0byBmaW5kIHRhcmdldAogICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFuY2hvcik7CgogICAgaWYgKCF0YXJnZXQpCiAgICB7CiAgICAgIC8vIGRvZXMgYW5jaG9yIGxvb2sgbGlrZSAiKDIpIiBmb3Igc2xpZGUgMiA/PwogICAgICAvLyB3aGVyZSBmaXJzdCBzbGlkZSBpcyAoMSkKICAgICAgdmFyIHJlID0gL1woKFxkKStcKS87CgogICAgICBpZiAoYW5jaG9yLm1hdGNoKHJlKSkKICAgICAgewogICAgICAgIHZhciBudW0gPSBwYXJzZUludChhbmNob3Iuc3Vic3RyaW5nKDEsIGFuY2hvci5sZW5ndGgtMSkpOwoKICAgICAgICBpZiAobnVtID4gdGhpcy5zbGlkZXMubGVuZ3RoKQogICAgICAgICAgbnVtID0gMTsKCiAgICAgICAgaWYgKC0tbnVtIDwgMCkKICAgICAgICAgIG51bSA9IDA7CgogICAgICAgIHJldHVybiBudW07CiAgICAgIH0KCiAgICAgIC8vIGFjY2VwdCBbMl0gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAgIHJlID0gL1xbKFxkKStcXS87CgogICAgICBpZiAoYW5jaG9yLm1hdGNoKHJlKSkKICAgICAgewogICAgICAgICB2YXIgbnVtID0gcGFyc2VJbnQoYW5jaG9yLnN1YnN0cmluZygxLCBhbmNob3IubGVuZ3RoLTEpKTsKCiAgICAgICAgIGlmIChudW0gPiB0aGlzLnNsaWRlcy5sZW5ndGgpCiAgICAgICAgICAgIG51bSA9IDE7CgogICAgICAgICBpZiAoLS1udW0gPCAwKQogICAgICAgICAgICBudW0gPSAwOwoKICAgICAgICAgcmV0dXJuIG51bTsKICAgICAgfQoKICAgICAgLy8gb2ggZGVhciB1bmtub3duIGFuY2hvcgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyBzZWFyY2ggZm9yIGVuY2xvc2luZyBzbGlkZQoKICAgIHdoaWxlICh0cnVlKQogICAgewogICAgICAvLyBicm93c2VyIGNvZXJjZXMgaHRtbCBlbGVtZW50cyB0byB1cHBlcmNhc2UhCiAgICAgIGlmICh0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAiZGl2IiAmJgogICAgICAgICAgICB0aGlzLmhhc19jbGFzcyh0YXJnZXQsICJzbGlkZSIpKQogICAgICB7CiAgICAgICAgLy8gZm91bmQgdGhlIHNsaWRlIGVsZW1lbnQKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgLy8gb3RoZXJ3aXNlIHRyeSBwYXJlbnQgZWxlbWVudCBpZiBhbnkKCiAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwoKICAgICAgaWYgKCF0YXJnZXQpCiAgICAgIHsKICAgICAgICByZXR1cm4gMDsgICAvLyBubyBsdWNrIQogICAgICB9CiAgICB9OwoKICAgIGZvciAoaSA9IDA7IGkgPCBzbGlkZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGlmIChzbGlkZXNbaV0gPT0gdGFyZ2V0KQogICAgICAgIHJldHVybiBpOyAgLy8gc3VjY2VzcwogICAgfQoKICAgIC8vIG9oIGRlYXIgc3RpbGwgbm8gbHVjawogICAgcmV0dXJuIDA7CiAgfSwKCiAgcHJldmlvdXNfc2xpZGU6IGZ1bmN0aW9uIChpbmNyZW1lbnRhbCkgewogICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICB7CiAgICAgIHZhciBzbGlkZTsKCiAgICAgIGlmICgoaW5jcmVtZW50YWwgfHwgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9PSAwKSAmJiB3M2Nfc2xpZHkubGFzdF9zaG93biAhPSBudWxsKQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkuaGlkZV9wcmV2aW91c19pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXMoZmFsc2UpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHczY19zbGlkeS5zbGlkZV9udW1iZXIgPiAwKQogICAgICB7CiAgICAgICAgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5oaWRlX3NsaWRlKHNsaWRlKTsKCiAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5zbGlkZV9udW1iZXIgLSAxOwogICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJ2aXNpYmxlIik7CiAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkucHJldmlvdXNfaW5jcmVtZW50YWxfaXRlbShudWxsKTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXModHJ1ZSk7CiAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CgogICAgICBpZiAoIXczY19zbGlkeS5uc19wb3MpCiAgICAgICAgdzNjX3NsaWR5LnJlZnJlc2hfdG9vbGJhcigyMDApOwogICAgfQogIH0sCgogIG5leHRfc2xpZGU6IGZ1bmN0aW9uIChpbmNyZW1lbnRhbCkgewogICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICB7CiAgICAgIHZhciBzbGlkZSwgbGFzdCA9IHczY19zbGlkeS5sYXN0X3Nob3duOwoKICAgICAgaWYgKGluY3JlbWVudGFsIHx8IHczY19zbGlkeS5zbGlkZV9udW1iZXIgPT0gdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IHczY19zbGlkeS5yZXZlYWxfbmV4dF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKTsKCiAgICAgIGlmICgoIWluY3JlbWVudGFsIHx8IHczY19zbGlkeS5sYXN0X3Nob3duID09IG51bGwpICYmCiAgICAgICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyIDwgdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwoKICAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5zbGlkZV9udW1iZXIgKyAxOwogICAgICAgICBzbGlkZSA9IHczY19zbGlkeS5zbGlkZXNbdzNjX3NsaWR5LnNsaWRlX251bWJlcl07CiAgICAgICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgiaGlkZGVuIik7CiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgfQogICAgICBlbHNlIGlmICghdzNjX3NsaWR5Lmxhc3Rfc2hvd24pCiAgICAgIHsKICAgICAgICAgaWYgKGxhc3QgJiYgaW5jcmVtZW50YWwpCiAgICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSBsYXN0OwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CgogICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXMoIXczY19zbGlkeS5uZXh0X2luY3JlbWVudGFsX2l0ZW0odzNjX3NsaWR5Lmxhc3Rfc2hvd24pKTsKCiAgICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcykKICAgICAgICAgdzNjX3NsaWR5LnJlZnJlc2hfdG9vbGJhcigyMDApOwogICAgIH0KICB9LAoKICAvLyB0byBmaXJzdCBzbGlkZSB3aXRoIG5vdGhpbmcgcmV2ZWFsZWQKICAvLyBpLmUuIHN0YXRlIGF0IHN0YXJ0IG9mIHByZXNlbnRhdGlvbgogIGZpcnN0X3NsaWRlOiBmdW5jdGlvbiAoKSB7CiAgICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICAgewogICAgICAgdmFyIHNsaWRlOwoKICAgICAgIGlmICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyICE9IDApCiAgICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwoKICAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IDA7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSBudWxsOwogICAgICAgICB3M2Nfc2xpZHkuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJoaWRkZW4iKTsKICAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICAgfQoKICAgICAgIHczY19zbGlkeS5zZXRfZW9zX3N0YXR1cygKICAgICAgICAgIXczY19zbGlkeS5uZXh0X2luY3JlbWVudGFsX2l0ZW0odzNjX3NsaWR5Lmxhc3Rfc2hvd24pKTsKICAgICAgIHczY19zbGlkeS5zZXRfbG9jYXRpb24oKTsKICAgICB9CiAgfSwKCiAgLy8gZ290byBsYXN0IHNsaWRlIHdpdGggZXZlcnl0aGluZyByZXZlYWxlZAogIC8vIGkuZS4gc3RhdGUgYXQgZW5kIG9mIHByZXNlbnRhdGlvbgogIGxhc3Rfc2xpZGU6IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdzNjX3NsaWR5LnZpZXdfYWxsKQogICAgewogICAgICB2YXIgc2xpZGU7CgogICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IG51bGw7IC8vcmV2ZWFsTmV4dEl0ZW0obGFzdFNob3duKTsKCiAgICAgIGlmICh3M2Nfc2xpZHkubGFzdF9zaG93biA9PSBudWxsICYmCiAgICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyIDwgdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID0gdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxOwogICAgICAgICBzbGlkZSA9IHczY19zbGlkeS5zbGlkZXNbdzNjX3NsaWR5LnNsaWRlX251bWJlcl07CiAgICAgICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkucHJldmlvdXNfaW5jcmVtZW50YWxfaXRlbShudWxsKTsKCiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgidmlzaWJsZSIpOwogICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IHczY19zbGlkeS5wcmV2aW91c19pbmNyZW1lbnRhbF9pdGVtKG51bGwpOwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXModHJ1ZSk7CiAgICAgIHczY19zbGlkeS5zZXRfbG9jYXRpb24oKTsKICAgIH0KICB9LAoKCiAgLy8gIyMjIGNoZWNrIHRoaXMgYW5kIGNvbnNpZGVyIGFkZC9yZW1vdmUgY2xhc3MKICBzZXRfZW9zX3N0YXR1czogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICBpZiAodGhpcy5lb3MpCiAgICAgIHRoaXMuZW9zLnN0eWxlLmNvbG9yID0gKHN0YXRlID8gInJnYigyNDAsMjQwLDI0MCkiIDogInJlZCIpOwogIH0sCgogIC8vIGZpcnN0IHNsaWRlIGlzIDAKICBnb3RvX3NsaWRlOiBmdW5jdGlvbiAobnVtKSB7CiAgICAvL2FsZXJ0KCJnb2luZyB0byBzbGlkZSAiICsgKG51bSsxKSk7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IG51bTsKICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoImhpZGRlbiIpOwogICAgdzNjX3NsaWR5LnNldF9lb3Nfc3RhdHVzKCF3M2Nfc2xpZHkubmV4dF9pbmNyZW1lbnRhbF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKSk7CiAgICBkb2N1bWVudC50aXRsZSA9IHczY19zbGlkeS50aXRsZSArICIgKCIgKyAodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSArICIpIjsKICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgIHczY19zbGlkeS5zaG93X3NsaWRlX251bWJlcigpOwogIH0sCgoKICBzaG93X3NsaWRlOiBmdW5jdGlvbiAoc2xpZGUpIHsKICAgIHRoaXMuc3luY19iYWNrZ3JvdW5kKHNsaWRlKTsKICAgIHRoaXMucmVtb3ZlX2NsYXNzKHNsaWRlLCAiaGlkZGVuIik7CgogICAgLy8gd29yayBhcm91bmQgSUU5IG9iamVjdCByZW5kZXJpbmcgYnVnCiAgICBzZXRUaW1lb3V0KCJ3aW5kb3cuc2Nyb2xsVG8oMCwwKTsiLCAxKTsKICB9LAoKICBoaWRlX3NsaWRlOiBmdW5jdGlvbiAoc2xpZGUpIHsKICAgIHRoaXMuYWRkX2NsYXNzKHNsaWRlLCAiaGlkZGVuIik7CiAgfSwKCiAgc2V0X2ZvY3VzOiBmdW5jdGlvbiAoZWxlbWVudCkKICB7CiAgICBpZiAoZWxlbWVudCkKICAgICAgZWxlbWVudC5mb2N1cygpOwogICAgZWxzZQogICAgewogICAgICB3M2Nfc2xpZHkuaGVscF9hbmNob3IuZm9jdXMoKTsKCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgdzNjX3NsaWR5LmhlbHBfYW5jaG9yLmJsdXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfSwKCiAgLy8gc2hvdyBqdXN0IHRoZSBiYWNrZ3JvdW5kcyBwZXJ0aW5lbnQgdG8gdGhpcyBzbGlkZQogIC8vIHdoZW4gc2xpZGUgYmFja2dyb3VuZC1jb2xvciBpcyB0cmFuc3BhcmVudAogIC8vIHRoaXMgc2hvdWxkIG5vdyB3b3JrIHdpdGggcmdiYSBjb2xvciB2YWx1ZXMKICBzeW5jX2JhY2tncm91bmQ6IGZ1bmN0aW9uIChzbGlkZSkgewogICAgdmFyIGJhY2tncm91bmQ7CiAgICB2YXIgYmdDb2xvcjsKCiAgICBpZiAoc2xpZGUuY3VycmVudFN0eWxlKQogICAgICBiZ0NvbG9yID0gc2xpZGUuY3VycmVudFN0eWxlWyJiYWNrZ3JvdW5kQ29sb3IiXTsKICAgIGVsc2UgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3KQogICAgewogICAgICB2YXIgc3R5bGVzID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShzbGlkZSxudWxsKTsKCiAgICAgIGlmIChzdHlsZXMpCiAgICAgICAgYmdDb2xvciA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWNvbG9yIik7CiAgICAgIGVsc2UgLy8gYnJva2VuIGltcGxlbWVudGF0aW9uIHByb2JhYmx5IGR1ZSBTYWZhcmkgb3IgS29ucXVlcm9yCiAgICAgIHsKICAgICAgICAvL2FsZXJ0KCJkZWZlY3RpdmUgaW1wbGVtZW50YXRpb24gb2YgZ2V0Q29tcHV0ZWRTdHlsZSgpIik7CiAgICAgICAgYmdDb2xvciA9ICJ0cmFuc3BhcmVudCI7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgYmdDb2xvciA9PSAidHJhbnNwYXJlbnQiOwoKICAgIGlmIChiZ0NvbG9yID09ICJ0cmFuc3BhcmVudCIgfHwKICAgICAgICBiZ0NvbG9yLmluZGV4T2YoInJnYmEiKSA+PSAwIHx8CiAgICAgICAgYmdDb2xvci5pbmRleE9mKCJvcGFjaXR5IikgPj0gMCkKICAgIHsKICAgICAgdmFyIHNsaWRlQ2xhc3MgPSB0aGlzLmdldF9jbGFzc19saXN0KHNsaWRlKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iYWNrZ3JvdW5kcy5sZW5ndGg7IGkrKykKICAgICAgewogICAgICAgIGJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmRzW2ldOwoKICAgICAgICB2YXIgYmdDbGFzcyA9IHRoaXMuZ2V0X2NsYXNzX2xpc3QoYmFja2dyb3VuZCk7CgogICAgICAgIGlmICh0aGlzLm1hdGNoaW5nX2JhY2tncm91bmQoc2xpZGVDbGFzcywgYmdDbGFzcykpCiAgICAgICAgICB0aGlzLnJlbW92ZV9jbGFzcyhiYWNrZ3JvdW5kLCAiaGlkZGVuIik7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhpcy5hZGRfY2xhc3MoYmFja2dyb3VuZCwgImhpZGRlbiIpOwogICAgICB9CiAgICB9CiAgICBlbHNlIC8vIGZvcmNpYmx5IGhpZGUgYWxsIGJhY2tncm91bmRzCiAgICAgIHRoaXMuaGlkZV9iYWNrZ3JvdW5kcygpOwogIH0sCgogIGhpZGVfYmFja2dyb3VuZHM6IGZ1bmN0aW9uICgpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iYWNrZ3JvdW5kcy5sZW5ndGg7IGkrKykKICAgIHsKICAgICAgYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZHNbaV07CiAgICAgIHRoaXMuYWRkX2NsYXNzKGJhY2tncm91bmQsICJoaWRkZW4iKTsKICAgIH0KICB9LAoKICAvLyBjb21wYXJlIGNsYXNzZXMgZm9yIHNsaWRlIGFuZCBiYWNrZ3JvdW5kCiAgbWF0Y2hpbmdfYmFja2dyb3VuZDogZnVuY3Rpb24gKHNsaWRlQ2xhc3MsIGJnQ2xhc3MpIHsKICAgIHZhciBpLCBjb3VudCwgcGF0dGVybiwgcmVzdWx0OwoKICAgIC8vIGRlZmluZSBwYXR0ZXJuIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgcGF0dGVybiA9IC9cdysvZzsKCiAgICAvLyBjaGVjayBiYWNrZ3JvdW5kIGNsYXNzIG5hbWVzCiAgICByZXN1bHQgPSBiZ0NsYXNzLm1hdGNoKHBhdHRlcm4pOwoKICAgIGZvciAoaSA9IGNvdW50ID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKICAgIHsKICAgICAgaWYgKHJlc3VsdFtpXSA9PSAiaGlkZGVuIikKICAgICAgICBjb250aW51ZTsKCiAgICAgIGlmIChyZXN1bHRbaV0gPT0gImJhY2tncm91bmQiKQoJY29udGludWU7CgogICAgICArK2NvdW50OwogICAgfQoKICAgIGlmIChjb3VudCA9PSAwKSAgLy8gZGVmYXVsdCBtYXRjaAogICAgICByZXR1cm4gdHJ1ZTsKCiAgICAvLyBjaGVjayBmb3IgbWF0Y2hlcyBhbmQgcGxhY2UgcmVzdWx0IGluIGFycmF5CiAgICByZXN1bHQgPSBzbGlkZUNsYXNzLm1hdGNoKHBhdHRlcm4pOwoKICAgIC8vIG5vdyBjaGVjayBpZiBkZXNpcmVkIG5hbWUgaXMgcHJlc2VudCBmb3IgYmFja2dyb3VuZAogICAgZm9yIChpID0gY291bnQgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQogICAgewogICAgICBpZiAocmVzdWx0W2ldID09ICJoaWRkZW4iKQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgaWYgKHRoaXMuaGFzX3Rva2VuKGJnQ2xhc3MsIHJlc3VsdFtpXSkpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIHJlc2l6ZWQ6IGZ1bmN0aW9uICgpIHsKICAgICB2YXIgd2lkdGggPSAwOwoKICAgICBpZiAoIHR5cGVvZiggd2luZG93LmlubmVyV2lkdGggKSA9PSAnbnVtYmVyJyApCiAgICAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoOyAgLy8gTm9uIElFIGJyb3dzZXIKICAgICBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKQogICAgICAgd2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7ICAvLyBJRTYKICAgICBlbHNlIGlmIChkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgpCiAgICAgICB3aWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7IC8vIElFNAoKICAgICB2YXIgaGVpZ2h0ID0gMDsKCiAgICAgaWYgKCB0eXBlb2YoIHdpbmRvdy5pbm5lckhlaWdodCApID09ICdudW1iZXInICkKICAgICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsgIC8vIE5vbiBJRSBicm93c2VyCiAgICAgZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpCiAgICAgICBoZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OyAgLy8gSUU2CiAgICAgZWxzZSBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkKICAgICAgIGhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBJRTQKCiAgICAgaWYgKGhlaWdodCAmJiAod2lkdGgvaGVpZ2h0ID4gMS4wNSoxMDI0Lzc2OCkpCiAgICAgewogICAgICAgd2lkdGggPSBoZWlnaHQgKiAxMDI0LjAvNzY4OwogICAgIH0KCiAgICAgLy8gSUUgZmlyZXMgb25yZXNpemUgZXZlbiB3aGVuIG9ubHkgZm9udCBzaXplIGlzIGNoYW5nZWQhCiAgICAgLy8gc28gd2UgZG8gYSBjaGVjayB0byBhdm9pZCBibG9ja2luZyA8IGFuZCA+IGFjdGlvbnMKICAgICBpZiAod2lkdGggIT0gdzNjX3NsaWR5Lmxhc3Rfd2lkdGggfHwgaGVpZ2h0ICE9IHczY19zbGlkeS5sYXN0X2hlaWdodCkKICAgICB7CiAgICAgICBpZiAod2lkdGggPj0gMTEwMCkKICAgICAgICAgdzNjX3NsaWR5LnNpemVfaW5kZXggPSA1OyAgICAvLyA0CiAgICAgICBlbHNlIGlmICh3aWR0aCA+PSAxMDAwKQogICAgICAgICB3M2Nfc2xpZHkuc2l6ZV9pbmRleCA9IDQ7ICAgIC8vIDMKICAgICAgIGVsc2UgaWYgKHdpZHRoID49IDgwMCkKICAgICAgICAgdzNjX3NsaWR5LnNpemVfaW5kZXggPSAzOyAgICAvLyAyCiAgICAgICBlbHNlIGlmICh3aWR0aCA+PSA2MDApCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gMjsgICAgLy8gMQogICAgICAgZWxzZSBpZiAod2lkdGgpCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gMDsKCiAgICAgICAvLyBhZGQgaW4gZm9udCBzaXplIGFkanVzdG1lbnQgZnJvbSBtZXRhIGVsZW1lbnQgZS5nLgogICAgICAgLy8gPG1ldGEgbmFtZT0iZm9udC1zaXplLWFkanVzdG1lbnQiIGNvbnRlbnQ9Ii0yIiAvPgogICAgICAgLy8gdXNlZnVsIHdoZW4gc2xpZGVzIGhhdmUgdG9vIG11Y2ggY29udGVudCA7LSkKCiAgICAgICBpZiAoMCA8PSB3M2Nfc2xpZHkuc2l6ZV9pbmRleCArIHczY19zbGlkeS5zaXplX2FkanVzdG1lbnQgJiYKICAgICAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ICsgdzNjX3NsaWR5LnNpemVfYWRqdXN0bWVudCA8IHczY19zbGlkeS5zaXplcy5sZW5ndGgpCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gdzNjX3NsaWR5LnNpemVfaW5kZXggKyB3M2Nfc2xpZHkuc2l6ZV9hZGp1c3RtZW50OwoKICAgICAgIC8vIGVuYWJsZXMgY3Jvc3MgYnJvd3NlciB1c2Ugb2YgcmVsYXRpdmUgd2lkdGgvaGVpZ2h0CiAgICAgICAvLyBvbiBvYmplY3QgZWxlbWVudHMgZm9yIHVzZSB3aXRoIFNWRyBhbmQgRmxhc2ggbWVkaWEKICAgICAgIHczY19zbGlkeS5hZGp1c3Rfb2JqZWN0X2RpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7CgogICAgICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuZm9udFNpemUgIT0gdzNjX3NsaWR5LnNpemVzW3czY19zbGlkeS5zaXplX2luZGV4XSkKICAgICAgIHsKICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICAgICB9CgogICAgICAgdzNjX3NsaWR5Lmxhc3Rfd2lkdGggPSB3aWR0aDsKICAgICAgIHczY19zbGlkeS5sYXN0X2hlaWdodCA9IGhlaWdodDsKCiAgICAgICAvLyBmb3JjZSByZWZsb3cgdG8gd29yayBhcm91bmQgTW96aWxsYSBidWcKICAgICAgIGlmICh3M2Nfc2xpZHkubnNfcG9zKQogICAgICAgewogICAgICAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgICB3M2Nfc2xpZHkuaGlkZV9zbGlkZShzbGlkZSk7CiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgIH0KCiAgICAgICAvLyBmb3JjZSBjb3JyZWN0IHBvc2l0aW9uaW5nIG9mIHRvb2xiYXIKICAgICAgIHczY19zbGlkeS5yZWZyZXNoX3Rvb2xiYXIoMjAwKTsKICAgICB9CiAgfSwKCiAgc2Nyb2xsZWQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3M2Nfc2xpZHkudG9vbGJhciAmJiAhdzNjX3NsaWR5Lm5zX3BvcyAmJiAhdzNjX3NsaWR5LmllNykKICAgIHsKICAgICAgdzNjX3NsaWR5LmhhY2tfb2Zmc2V0ID0gdzNjX3NsaWR5LnNjcm9sbF94X29mZnNldCgpOwogICAgICAvLyBoaWRlIHRvb2xiYXIKICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCiAgICAgIC8vIG1ha2UgaXQgcmVhcHBlYXIgbGF0ZXIKICAgICAgaWYgKHczY19zbGlkeS5zY3JvbGxoYWNrID09IDAgJiYgIXczY19zbGlkeS52aWV3X2FsbCkKICAgICAgewogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge3czY19zbGlkeS5zaG93X3Rvb2xiYXIoKTsgfSwgMTAwMCk7CiAgICAgICAgdzNjX3NsaWR5LnNjcm9sbGhhY2sgPSAxOwogICAgICB9CiAgICB9CiAgfSwKCiAgaGlkZV90b29sYmFyOiBmdW5jdGlvbiAoKSB7CiAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKHczY19zbGlkeS50b29sYmFyLCAiaGlkZGVuIik7CiAgICB3aW5kb3cuZm9jdXMoKTsKICB9LAoKICAvLyB1c2VkIHRvIGVuc3VyZSBJRSByZWZyZXNoZXMgdG9vbGJhciBpbiBjb3JyZWN0IHBvc2l0aW9uCiAgcmVmcmVzaF90b29sYmFyOiBmdW5jdGlvbiAoaW50ZXJ2YWwpIHsKICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcyAmJiAhdzNjX3NsaWR5LmllNykKICAgIHsKICAgICAgdzNjX3NsaWR5LmhpZGVfdG9vbGJhcigpOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHt3M2Nfc2xpZHkuc2hvd190b29sYmFyKCk7fSwgaW50ZXJ2YWwpOwogICAgfQogIH0sCgogIC8vIHJlc3RvcmVzIHRvb2xiYXIgYWZ0ZXIgc2hvcnQgZGVsYXkKICBzaG93X3Rvb2xiYXI6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3M2Nfc2xpZHkud2FudF90b29sYmFyKQogICAgewogICAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCiAgICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcykKICAgICAgewogICAgICAgIC8vIGFkanVzdCBwb3NpdGlvbiB0byBhbGxvdyBmb3Igc2Nyb2xsaW5nCiAgICAgICAgdmFyIHhvZmZzZXQgPSB3M2Nfc2xpZHkuc2Nyb2xsX3hfb2Zmc2V0KCk7CiAgICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUubGVmdCA9IHhvZmZzZXQ7CiAgICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUucmlnaHQgPSB4b2Zmc2V0OwoKICAgICAgICAvLyBkZXRlcm1pbmUgdmVydGljYWwgc2Nyb2xsIG9mZnNldAogICAgICAgIC8vdmFyIHlvZmZzZXQgPSBzY3JvbGxZT2Zmc2V0KCk7CgogICAgICAgIC8vIGJvdHRvbSBpcyBkb2MgaGVpZ2h0IC0gd2luZG93IGhlaWdodCAtIHNjcm9sbCBvZmZzZXQKICAgICAgICAvL3ZhciBib3R0b20gPSBkb2N1bWVudEhlaWdodCgpIC0gbGFzdEhlaWdodCAtIHlvZmZzZXQKCiAgICAgICAgLy9pZiAoeW9mZnNldCA+IDAgfHwgZG9jdW1lbnRIZWlnaHQoKSA+IGxhc3RIZWlnaHQpCiAgICAgICAgLy8gICBib3R0b20gKz0gMTY7ICAvLyBhbGxvdyBmb3IgaGVpZ2h0IG9mIHNjcm9sbGJhcgoKICAgICAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5ib3R0b20gPSAwOyAvL2JvdHRvbTsKICAgICAgfQoKICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpOwogICAgfQoKICAgIHczY19zbGlkeS5zY3JvbGxoYWNrID0gMDsKCgogICAgLy8gc2V0IHRoZSBrZXlib2FyZCBmb2N1cyB0byB0aGUgaGVscCBsaW5rIG9uIHRoZQogICAgLy8gdG9vbGJhciB0byBlbnN1cmUgdGhhdCBkb2N1bWVudCBoYXMgdGhlIGZvY3VzCiAgICAvLyBJRSBkb2Vzbid0IGFsd2F5cyB3b3JrIHdpdGggd2luZG93LmZvY3VzKCkKICAgIC8vIGFuZCB0aGlzIGhhY2sgaGFzIGJlbmVmaXQgb2YgRW50ZXIgZm9yIGhlbHAKCiAgICB0cnkKICAgIHsKICAgICAgaWYgKCF3M2Nfc2xpZHkub3BlcmEpCiAgICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogICAgfQogICAgY2F0Y2ggKGUpCiAgICB7CiAgICB9CiAgfSwKCi8vIGludm9rZWQgdmlhIEYga2V5CiAgdG9nZ2xlX3Rvb2xiYXI6IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdzNjX3NsaWR5LnZpZXdfYWxsKQogICAgewogICAgICBpZiAodzNjX3NsaWR5Lmhhc19jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpKQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgICAgdzNjX3NsaWR5LndhbnRfdG9vbGJhciA9IDE7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5LmFkZF9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgICAgdzNjX3NsaWR5LndhbnRfdG9vbGJhciA9IDA7CiAgICAgIH0KICAgIH0KICB9LAoKICBzY3JvbGxfeF9vZmZzZXQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3aW5kb3cucGFnZVhPZmZzZXQpCiAgICAgIHJldHVybiBzZWxmLnBhZ2VYT2Zmc2V0OwoKICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgCiAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwoKICAgIGlmIChkb2N1bWVudC5ib2R5KQogICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0OwoKICAgIHJldHVybiAwOwogIH0sCgogIHNjcm9sbF95X29mZnNldDogZnVuY3Rpb24gKCkgewogICAgaWYgKHdpbmRvdy5wYWdlWU9mZnNldCkKICAgICAgcmV0dXJuIHNlbGYucGFnZVlPZmZzZXQ7CgogICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiAKICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApCiAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwoKICAgIGlmIChkb2N1bWVudC5ib2R5KQogICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgogICAgcmV0dXJuIDA7CiAgfSwKCiAgLy8gbG9va2luZyBmb3IgYSB3YXkgdG8gZGV0ZXJtaW5lIGhlaWdodCBvZiBzbGlkZSBjb250ZW50CiAgLy8gdGhlIHNsaWRlIGl0c2VsZiBpcyBzZXQgdG8gdGhlIGhlaWdodCBvZiB0aGUgd2luZG93CiAgb3B0aW1pemVfZm9udF9zaXplOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIC8vdmFyIGRoID0gZG9jdW1lbnRIZWlnaHQoKTsgLy9nZXREb2NIZWlnaHQoZG9jdW1lbnQpOwogICAgdmFyIGRoID0gc2xpZGUuc2Nyb2xsSGVpZ2h0OwogICAgdmFyIHdoID0gZ2V0V2luZG93SGVpZ2h0KCk7CiAgICB2YXIgdSA9IDEwMCAqIGRoIC8gd2g7CgogICAgYWxlcnQoIndpbmRvdyB1dGlsaXphdGlvbiA9ICIgKyB1ICsgIiUgKGRvYyAiCiAgICAgICsgZGggKyAiIHdpbiAiICsgd2ggKyAiKSIpOwogIH0sCgogIC8vIGZyb20gZG9jdW1lbnQgb2JqZWN0CiAgZ2V0X2RvY19oZWlnaHQ6IGZ1bmN0aW9uIChkb2MpIHsKICAgIGlmICghZG9jKQogICAgICBkb2MgPSBkb2N1bWVudDsKCiAgICBpZiAoZG9jICYmIGRvYy5ib2R5ICYmIGRvYy5ib2R5Lm9mZnNldEhlaWdodCkKICAgICAgcmV0dXJuIGRvYy5ib2R5Lm9mZnNldEhlaWdodDsgIC8vIG5zL2dlY2tvIHN5bnRheAoKICAgIGlmIChkb2MgJiYgZG9jLmJvZHkgJiYgZG9jLmJvZHkuc2Nyb2xsSGVpZ2h0KQogICAgICByZXR1cm4gZG9jLmJvZHkuc2Nyb2xsSGVpZ2h0OwoKICAgIGFsZXJ0KCJjb3VsZG4ndCBkZXRlcm1pbmUgZG9jdW1lbnQgaGVpZ2h0Iik7CiAgfSwKCiAgZ2V0X3dpbmRvd19oZWlnaHQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICggdHlwZW9mKCB3aW5kb3cuaW5uZXJIZWlnaHQgKSA9PSAnbnVtYmVyJyApCiAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQ7ICAvLyBOb24gSUUgYnJvd3NlcgoKICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7ICAvLyBJRTYKCiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBJRTQKICB9LAoKICBkb2N1bWVudF9oZWlnaHQ6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzaCwgb2g7CgogICAgc2ggPSBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDsKICAgIG9oID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7CgogICAgaWYgKHNoICYmIG9oKQogICAgewogICAgICByZXR1cm4gKHNoID4gb2ggPyBzaCA6IG9oKTsKICAgIH0KCiAgICAvLyBubyBpZGVhIQogICAgcmV0dXJuIDA7CiAgfSwKCiAgc21hbGxlcjogZnVuY3Rpb24gKCkgewogICAgaWYgKHczY19zbGlkeS5zaXplX2luZGV4ID4gMCkKICAgIHsKICAgICAgLS13M2Nfc2xpZHkuc2l6ZV9pbmRleDsKICAgIH0KCiAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7dzNjX3NsaWR5LnNob3dfdG9vbGJhcigpOyB9LCA1MCk7CiAgfSwKCiAgYmlnZ2VyOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAodzNjX3NsaWR5LnNpemVfaW5kZXggPCB3M2Nfc2xpZHkuc2l6ZXMubGVuZ3RoIC0gMSkKICAgIHsKICAgICAgKyt3M2Nfc2xpZHkuc2l6ZV9pbmRleDsKICAgIH0KCiAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7dzNjX3NsaWR5LnNob3dfdG9vbGJhcigpOyB9LCA1MCk7CiAgfSwKCiAgLy8gZW5hYmxlcyBjcm9zcyBicm93c2VyIHVzZSBvZiByZWxhdGl2ZSB3aWR0aC9oZWlnaHQKICAvLyBvbiBvYmplY3QgZWxlbWVudHMgZm9yIHVzZSB3aXRoIFNWRyBhbmQgRmxhc2ggbWVkaWEKICAvLyB3aXRoIHRoYW5rcyB0byBJdmFuIEhlcm1hbiBmb3IgdGhlIHN1Z2dlc3Rpb24KICBhZGp1c3Rfb2JqZWN0X2RpbWVuc2lvbnM6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7CiAgICBmb3IoIHZhciBpID0gMDsgaSA8IHczY19zbGlkeS5vYmplY3RzLmxlbmd0aDsgaSsrICkKICAgIHsKICAgICAgdmFyIG9iaiA9IHRoaXMub2JqZWN0c1tpXTsKICAgICAgdmFyIG1pbWVUeXBlID0gb2JqLmdldEF0dHJpYnV0ZSgidHlwZSIpOwoKICAgICAgaWYgKG1pbWVUeXBlID09ICJpbWFnZS9zdmcreG1sIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKQogICAgICB7CiAgICAgICAgaWYgKCAhb2JqLmluaXRpYWxXaWR0aCApIAogICAgICAgICAgb2JqLmluaXRpYWxXaWR0aCA9IG9iai5nZXRBdHRyaWJ1dGUoIndpZHRoIik7CgogICAgICAgIGlmICggIW9iai5pbml0aWFsSGVpZ2h0ICkgCiAgICAgICAgICBvYmouaW5pdGlhbEhlaWdodCA9IG9iai5nZXRBdHRyaWJ1dGUoImhlaWdodCIpOwoKICAgICAgICBpZiAoIG9iai5pbml0aWFsV2lkdGggJiYgb2JqLmluaXRpYWxXaWR0aC5jaGFyQXQob2JqLmluaXRpYWxXaWR0aC5sZW5ndGgtMSkgPT0gIiUiICkKICAgICAgICB7CiAgICAgICAgICB2YXIgdyA9IHBhcnNlSW50KG9iai5pbml0aWFsV2lkdGguc2xpY2UoMCwgb2JqLmluaXRpYWxXaWR0aC5sZW5ndGgtMSkpOwogICAgICAgICAgdmFyIG5ld1cgPSB3aWR0aCAqICh3LzEwMC4wKTsKICAgICAgICAgIG9iai5zZXRBdHRyaWJ1dGUoIndpZHRoIixuZXdXKTsKICAgICAgICB9CgogICAgICAgIGlmICggb2JqLmluaXRpYWxIZWlnaHQgJiYKICAgICAgICAgICAgIG9iai5pbml0aWFsSGVpZ2h0LmNoYXJBdChvYmouaW5pdGlhbEhlaWdodC5sZW5ndGgtMSkgPT0gIiUiICkKICAgICAgICB7CiAgICAgICAgICB2YXIgaCA9IHBhcnNlSW50KG9iai5pbml0aWFsSGVpZ2h0LnNsaWNlKDAsIG9iai5pbml0aWFsSGVpZ2h0Lmxlbmd0aC0xKSk7CiAgICAgICAgICB2YXIgbmV3SCA9IGhlaWdodCAqIChoLzEwMC4wKTsKICAgICAgICAgIG9iai5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIG5ld0gpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIC8vIG5lZWRlZCBmb3IgT3BlcmEgdG8gaW5oaWJpdCBkZWZhdWx0IGJlaGF2aW9yCiAgLy8gc2luY2UgT3BlcmEgZGVsaXZlcnMga2V5UHJlc3MgZXZlbiBpZiBrZXlEb3duCiAgLy8gd2FzIGNhbmNlbGxlZAogIGtleV9wcmVzczogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBpZiAoIWV2ZW50KQogICAgICBldmVudCA9IHdpbmRvdy5ldmVudDsKCiAgICBpZiAoIXczY19zbGlkeS5rZXlfd2FudGVkKQogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgLy8gIFNlZSBlLmcuIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzL2tleXMuaHRtbCBmb3Iga2V5Y29kZXMKICBrZXlfZG93bjogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIga2V5LCB0YXJnZXQsIHRhZzsKCiAgICB3M2Nfc2xpZHkua2V5X3dhbnRlZCA9IHRydWU7CgogICAgaWYgKCFldmVudCkKICAgICAgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh3aW5kb3cuZXZlbnQpCiAgICB7CiAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwogICAgICB0YXJnZXQgPSB3aW5kb3cuZXZlbnQuc3JjRWxlbWVudDsKICAgIH0KICAgIGVsc2UgaWYgKGV2ZW50LndoaWNoKQogICAgewogICAgICBrZXkgPSBldmVudC53aGljaDsKICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgfQogICAgZWxzZQogICAgICByZXR1cm4gdHJ1ZTsgLy8gWWlrZXMhIHVua25vd24gYnJvd3NlcgoKICAgIC8vIGlnbm9yZSBldmVudCBpZiBrZXkgdmFsdWUgaXMgemVybwogICAgLy8gYXMgZm9yIGFsdCBvbiBPcGVyYSBhbmQgS29ucXVlcm9yCiAgICBpZiAoIWtleSkKICAgICAgIHJldHVybiB0cnVlOwoKICAgIC8vIGF2b2lkIGludGVyZmVyaW5nIHdpdGgga2V5c3Ryb2tlCiAgICAvLyBiZWhhdmlvciBmb3Igbm9uLXNsaWR5IGNocm9tZSBlbGVtZW50cwogICAgaWYgKCF3M2Nfc2xpZHkuc2xpZHlfY2hyb21lKHRhcmdldCkgJiYKICAgICAgICB3M2Nfc2xpZHkuc3BlY2lhbF9lbGVtZW50KHRhcmdldCkpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIC8vIGNoZWNrIGZvciBjb25jdXJyZW50IGNvbnRyb2wvY29tbWFuZC9hbHQga2V5CiAgICAvLyBidXQgYXJlIHRoZXNlIG9ubHkgcHJlc2VudCBvbiBtb3VzZSBldmVudHM/CgogICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50Lm1ldGFLZXkpCiAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAvLyBkaXNtaXNzIHRhYmxlIG9mIGNvbnRlbnRzIGlmIHZpc2libGUKICAgIGlmICh3M2Nfc2xpZHkuaXNfc2hvd25fdG9jKCkgJiYga2V5ICE9IDkgJiYga2V5ICE9IDE2ICYmIGtleSAhPSAzOCAmJiBrZXkgIT0gNDApCiAgICB7CiAgICAgIHczY19zbGlkeS5oaWRlX3RhYmxlX29mX2NvbnRlbnRzKHRydWUpOwoKICAgICAgaWYgKGtleSA9PSAyNyB8fCBrZXkgPT0gODQgfHwga2V5ID09IDY3KQogICAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KCiAgICBpZiAoa2V5ID09IDM0KSAvLyBQYWdlIERvd24KICAgIHsKICAgICAgaWYgKHczY19zbGlkeS52aWV3X2FsbCkKICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgIHczY19zbGlkeS5uZXh0X3NsaWRlKGZhbHNlKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDMzKSAvLyBQYWdlIFVwCiAgICB7CiAgICAgIGlmICh3M2Nfc2xpZHkudmlld19hbGwpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICB3M2Nfc2xpZHkucHJldmlvdXNfc2xpZGUoZmFsc2UpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMzIpIC8vIHNwYWNlIGJhcgogICAgewogICAgICB3M2Nfc2xpZHkubmV4dF9zbGlkZSh0cnVlKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDM3KSAvLyBMZWZ0IGFycm93CiAgICB7CiAgICAgIHczY19zbGlkeS5wcmV2aW91c19zbGlkZSghZXZlbnQuc2hpZnRLZXkpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMzYpIC8vIEhvbWUKICAgIHsKICAgICAgdzNjX3NsaWR5LmZpcnN0X3NsaWRlKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSAzNSkgLy8gRW5kCiAgICB7CiAgICAgIHczY19zbGlkeS5sYXN0X3NsaWRlKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSAzOSkgLy8gUmlnaHQgYXJyb3cKICAgIHsKICAgICAgdzNjX3NsaWR5Lm5leHRfc2xpZGUoIWV2ZW50LnNoaWZ0S2V5KTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDEzKSAvLyBFbnRlcgogICAgewogICAgICBpZiAodzNjX3NsaWR5Lm91dGxpbmUpCiAgICAgIHsKICAgICAgICBpZiAodzNjX3NsaWR5Lm91dGxpbmUudmlzaWJsZSkKICAgICAgICAgIHczY19zbGlkeS5mb2xkKHczY19zbGlkeS5vdXRsaW5lKTsKICAgICAgICBlbHNlCiAgICAgICAgICB3M2Nfc2xpZHkudW5mb2xkKHczY19zbGlkeS5vdXRsaW5lKTsKICAgICAgICAgIAogICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTg4KSAgLy8gPCBmb3Igc21hbGxlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuc21hbGxlcigpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTkwKSAgLy8gPiBmb3IgbGFyZ2VyIGZvbnRzCiAgICB7CiAgICAgIHczY19zbGlkeS5iaWdnZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDE4OSB8fCBrZXkgPT0gMTA5KSAgLy8gLSBmb3Igc21hbGxlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuc21hbGxlcigpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTg3IHx8IGtleSA9PSAxOTEgfHwga2V5ID09IDEwNykgIC8vID0gKyAgZm9yIGxhcmdlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuYmlnZ2VyKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA4MykgIC8vIFMgZm9yIHNtYWxsZXIgZm9udHMKICAgIHsKICAgICAgdzNjX3NsaWR5LnNtYWxsZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDY2KSAgLy8gQiBmb3IgbGFyZ2VyIGZvbnRzCiAgICB7CiAgICAgIHczY19zbGlkeS5iaWdnZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDkwKSAgLy8gWiBmb3IgbGFzdCBzbGlkZQogICAgewogICAgICB3M2Nfc2xpZHkubGFzdF9zbGlkZSgpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gNzApICAvLyBGIGZvciB0b2dnbGUgdG9vbGJhcgogICAgewogICAgICB3M2Nfc2xpZHkudG9nZ2xlX3Rvb2xiYXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDY1KSAgLy8gQSBmb3IgdG9nZ2xlIHZpZXcgc2luZ2xlL2FsbCBzbGlkZXMKICAgIHsKICAgICAgdzNjX3NsaWR5LnRvZ2dsZV92aWV3KCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA3NSkgIC8vIHRvZ2dsZSBhY3Rpb24gb2YgbGVmdCBjbGljayBmb3IgbmV4dCBwYWdlCiAgICB7CiAgICAgIHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkID0gIXczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkOwogICAgICB2YXIgYWxlcnRfbXNnID0gKHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkID8KICAgICAgICAgICAgICAgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpICsgICIgbW91c2UgY2xpY2sgYWR2YW5jZSI7CgogICAgICBhbGVydCh3M2Nfc2xpZHkubG9jYWxpemUoYWxlcnRfbXNnKSk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA4NCB8fCBrZXkgPT0gNjcpICAvLyBUIG9yIEMgZm9yIHRhYmxlIG9mIGNvbnRlbnRzCiAgICB7CiAgICAgIGlmICh3M2Nfc2xpZHkudG9jKQogICAgICAgIHczY19zbGlkeS50b2dnbGVfdGFibGVfb2ZfY29udGVudHMoKTsKCiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA3MikgLy8gSCBmb3IgaGVscAogICAgewogICAgICB3aW5kb3cubG9jYXRpb24gPSB3M2Nfc2xpZHkuaGVscF9wYWdlOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICAvL2Vsc2UgYWxlcnQoImtleSBjb2RlIGlzICIrIGtleSk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgLy8gc2FmZSBmb3IgYm90aCB0ZXh0L2h0bWwgYW5kIGFwcGxpY2F0aW9uL3hodG1sK3htbAogIGNyZWF0ZV9lbGVtZW50OiBmdW5jdGlvbiAobmFtZSkgewogICAgaWYgKHRoaXMueGh0bWwgJiYgKHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgIT0gJ3VuZGVmaW5lZCcpKQogICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwgbmFtZSkKCiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKICB9LAoKICBnZXRfZWxlbWVudF9zdHlsZTogZnVuY3Rpb24gKGVsZW0sIElFU3R5bGVQcm9wLCBDU1NTdHlsZVByb3ApIHsKICAgIGlmIChlbGVtLmN1cnJlbnRTdHlsZSkKICAgIHsKICAgICAgcmV0dXJuIGVsZW0uY3VycmVudFN0eWxlW0lFU3R5bGVQcm9wXTsKICAgIH0KICAgIGVsc2UgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKQogICAgewogICAgICB2YXIgY29tcFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgIiIpOwogICAgICByZXR1cm4gY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoQ1NTU3R5bGVQcm9wKTsKICAgIH0KICAgIHJldHVybiAiIjsKICB9LAoKICAvLyB0aGUgc3RyaW5nIHN0ciBpcyBhIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgdG9rZW5zCiAgLy8gdGVzdCBpZiBzdHIgY29udGFpbnMgYSBwYXJ0aWN1bGFyIHRva2VuLCBlLmcuICJzbGlkZSIKICBoYXNfdG9rZW46IGZ1bmN0aW9uIChzdHIsIHRva2VuKSB7CiAgICBpZiAoc3RyKQogICAgewogICAgICAvLyBkZWZpbmUgcGF0dGVybiBhcyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgdmFyIHBhdHRlcm4gPSAvXHcrL2c7CgogICAgICAvLyBjaGVjayBmb3IgbWF0Y2hlcwogICAgICAvLyBwbGFjZSByZXN1bHQgaW4gYXJyYXkKICAgICAgdmFyIHJlc3VsdCA9IHN0ci5tYXRjaChwYXR0ZXJuKTsKCiAgICAgIC8vIG5vdyBjaGVjayBpZiBkZXNpcmVkIHRva2VuIGlzIHByZXNlbnQKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCiAgICAgIHsKICAgICAgICBpZiAocmVzdWx0W2ldID09IHRva2VuKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgZ2V0X2NsYXNzX2xpc3Q6IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lICE9ICd1bmRlZmluZWQnKQogICAgICByZXR1cm4gZWxlbWVudC5jbGFzc05hbWU7CgogICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwogIH0sCgogIGhhc19jbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsKICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCgiKF58ICkiICsgbmFtZSArICJcVyoiKTsKCiAgICBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lICE9ICd1bmRlZmluZWQnKQogICAgICByZXR1cm4gcmVnZXhwLnRlc3QoZWxlbWVudC5jbGFzc05hbWUpOwoKICAgIHJldHVybiByZWdleHAudGVzdChlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSk7CiAgfSwKCiAgcmVtb3ZlX2NsYXNzOiBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkgewogICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoIihefCApIiArIG5hbWUgKyAiXFcqIik7CiAgICB2YXIgY2xzdmFsID0gIiI7CgogICAgaWYgKHR5cGVvZiBlbGVtZW50LmNsYXNzTmFtZSAhPSAndW5kZWZpbmVkJykKICAgIHsKICAgICAgY2xzdmFsID0gZWxlbWVudC5jbGFzc05hbWU7CgogICAgICBpZiAoY2xzdmFsKQogICAgICB7CiAgICAgICAgY2xzdmFsID0gY2xzdmFsLnJlcGxhY2UocmVnZXhwLCAiIik7CiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBjbHN2YWw7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgY2xzdmFsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7CgogICAgICBpZiAoY2xzdmFsKQogICAgICB7CiAgICAgICAgY2xzdmFsID0gY2xzdmFsLnJlcGxhY2UocmVnZXhwLCAiIik7CiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgY2xzdmFsKTsKICAgICAgfQogICAgfQogIH0sCgogIGFkZF9jbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsKICAgIGlmICghdGhpcy5oYXNfY2xhc3MoZWxlbWVudCwgbmFtZSkpCiAgICB7CiAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgIT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gIiAiICsgbmFtZTsKICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdmFyIGNsc3ZhbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwogICAgICAgIGNsc3ZhbCA9IGNsc3ZhbCA/IGNsc3ZhbCArICIgIiArIG5hbWUgOiBuYW1lOwogICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsIGNsc3ZhbCk7CiAgICAgIH0KICAgIH0KICB9LAoKICAvLyBIVE1MIGVsZW1lbnRzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBjbGFzcz0iaW5jcmVtZW50YWwiCiAgLy8gbm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBwdXQgdGhlIGNsYXNzIG9uIGNvbnRhaW5lcnMgbGlrZQogIC8vIHVwLCBvbCwgZGwsIGFuZCBkaXYgdG8gbWFrZSB0aGVpciBjb250ZW50cyBhcHBlYXIKICAvLyBpbmNyZW1lbnRhbGx5LiBVcHBlciBjYXNlIGlzIHVzZWQgc2luY2UgdGhpcyBpcyB3aGF0CiAgLy8gYnJvd3NlcnMgcmVwb3J0IGZvciBIVE1MIG5vZGUgbmFtZXMgKHRleHQvaHRtbCkuCiAgaW5jcmVtZW50YWxfZWxlbWVudHM6IG51bGwsCiAgb2theV9mb3JfaW5jcmVtZW50YWw6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICBpZiAoIXRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHMpCiAgICB7CiAgICAgIHZhciBpbmNsaXN0ID0gbmV3IEFycmF5KCk7CiAgICAgIGluY2xpc3RbInAiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbInByZSJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsibGkiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImJsb2NrcXVvdGUiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImR0Il0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJkZCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaDIiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImgzIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJoNCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaDUiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImg2Il0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJzcGFuIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJhZGRyZXNzIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJ0YWJsZSJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsidHIiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbInRoIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJ0ZCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaW1nIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJvYmplY3QiXSA9IHRydWU7CiAgICAgIHRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHMgPSBpbmNsaXN0OwogICAgfQogICAgcmV0dXJuIHRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHNbbmFtZS50b0xvd2VyQ2FzZSgpXTsKICB9LAoKICBuZXh0X2luY3JlbWVudGFsX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICB2YXIgYnIgPSB0aGlzLmlzX3hodG1sID8gImJyIiA6ICJCUiI7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSB3M2Nfc2xpZHkubmV4dF9ub2RlKHNsaWRlLCBub2RlKTsKCiAgICAgIGlmIChub2RlID09IG51bGwgfHwgbm9kZS5wYXJlbnROb2RlID09IG51bGwpCiAgICAgICAgYnJlYWs7CgogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSAgLy8gRUxFTUVOVAogICAgICB7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gYnIpCiAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgaWYgKHczY19zbGlkeS5oYXNfY2xhc3Mobm9kZSwgImluY3JlbWVudGFsIikKICAgICAgICAgICAgICYmIHczY19zbGlkeS5va2F5X2Zvcl9pbmNyZW1lbnRhbChub2RlLm5vZGVOYW1lKSkKICAgICAgICAgIHJldHVybiBub2RlOwoKICAgICAgICBpZiAodzNjX3NsaWR5Lmhhc19jbGFzcyhub2RlLnBhcmVudE5vZGUsICJpbmNyZW1lbnRhbCIpCiAgICAgICAgICAgICAmJiAhdzNjX3NsaWR5Lmhhc19jbGFzcyhub2RlLCAibm9uLWluY3JlbWVudGFsIikpCiAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0sCgogIHByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICB2YXIgYnIgPSB0aGlzLmlzX3hodG1sID8gImJyIiA6ICJCUiI7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSB3M2Nfc2xpZHkucHJldmlvdXNfbm9kZShzbGlkZSwgbm9kZSk7CgogICAgICBpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUucGFyZW50Tm9kZSA9PSBudWxsKQogICAgICAgIGJyZWFrOwoKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkKICAgICAgewogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IGJyKQogICAgICAgICAgY29udGludWU7CgogICAgICAgIGlmICh3M2Nfc2xpZHkuaGFzX2NsYXNzKG5vZGUsICJpbmNyZW1lbnRhbCIpCiAgICAgICAgICAgICAmJiB3M2Nfc2xpZHkub2theV9mb3JfaW5jcmVtZW50YWwobm9kZS5ub2RlTmFtZSkpCiAgICAgICAgICByZXR1cm4gbm9kZTsKCiAgICAgICAgaWYgKHczY19zbGlkeS5oYXNfY2xhc3Mobm9kZS5wYXJlbnROb2RlLCAiaW5jcmVtZW50YWwiKQogICAgICAgICAgICAgJiYgIXczY19zbGlkeS5oYXNfY2xhc3Mobm9kZSwgIm5vbi1pbmNyZW1lbnRhbCIpKQogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbm9kZTsKICB9LAoKICAvLyBzZXQgdmlzaWJpbGl0eSBmb3IgYWxsIGVsZW1lbnRzIG9uIGN1cnJlbnQgc2xpZGUgd2l0aAogIC8vIGEgcGFyZW50IGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGUgY2xhc3M9ImluY3JlbWVudGFsIgogIHNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICB2YXIgbm9kZSA9IHRoaXMubmV4dF9pbmNyZW1lbnRhbF9pdGVtKG51bGwpOwoKICAgIGlmICh2YWx1ZSA9PSAiaGlkZGVuIikKICAgIHsKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKG5vZGUsICJpbnZpc2libGUiKTsKICAgICAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKICAgICAgfQogICAgfQogICAgZWxzZSAvLyB2YWx1ZSA9PSAidmlzaWJsZSIKICAgIHsKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB3M2Nfc2xpZHkucmVtb3ZlX2NsYXNzKG5vZGUsICJpbnZpc2libGUiKTsKICAgICAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKICAgICAgfQogICAgfQogIH0sCgogIC8vIHJldmVhbCB0aGUgbmV4dCBoaWRkZW4gaXRlbSBvbiB0aGUgc2xpZGUKICAvLyBub2RlIGlzIG51bGwgb3IgdGhlIG5vZGUgdGhhdCB3YXMgbGFzdCByZXZlYWxlZAogIHJldmVhbF9uZXh0X2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKCiAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEpICAvLyBhbiBlbGVtZW50CiAgICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3Mobm9kZSwgImludmlzaWJsZSIpOwoKICAgIHJldHVybiBub2RlOwogIH0sCgogIC8vIGV4YWN0IGludmVyc2Ugb2YgcmV2ZWFsTmV4dEl0ZW0obm9kZSkKICBoaWRlX3ByZXZpb3VzX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEpICAvLyBhbiBlbGVtZW50CiAgICAgIHczY19zbGlkeS5hZGRfY2xhc3Mobm9kZSwgImludmlzaWJsZSIpOwoKICAgIHJldHVybiB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obm9kZSk7CiAgfSwKCiAgLy8gbGVmdCB0byByaWdodCB0cmF2ZXJzYWwgb2Ygcm9vdCdzIGNvbnRlbnQKICBuZXh0X25vZGU6IGZ1bmN0aW9uIChyb290LCBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKQogICAgICByZXR1cm4gcm9vdC5maXJzdENoaWxkOwoKICAgIGlmIChub2RlLmZpcnN0Q2hpbGQpCiAgICAgIHJldHVybiBub2RlLmZpcnN0Q2hpbGQ7CgogICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpCiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CgogICAgICBpZiAoIW5vZGUgfHwgbm9kZSA9PSByb290KQogICAgICAgIGJyZWFrOwoKICAgICAgaWYgKG5vZGUgJiYgbm9kZS5uZXh0U2libGluZykKICAgICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZzsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9LAoKICAvLyByaWdodCB0byBsZWZ0IHRyYXZlcnNhbCBvZiByb290J3MgY29udGVudAogIHByZXZpb3VzX25vZGU6IGZ1bmN0aW9uIChyb290LCBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKQogICAgewogICAgICBub2RlID0gcm9vdC5sYXN0Q2hpbGQ7CgogICAgICBpZiAobm9kZSkKICAgICAgewogICAgICAgIHdoaWxlIChub2RlLmxhc3RDaGlsZCkKICAgICAgICAgIG5vZGUgPSBub2RlLmxhc3RDaGlsZDsKICAgICAgfQoKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKG5vZGUucHJldmlvdXNTaWJsaW5nKQogICAgewogICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7CgogICAgICB3aGlsZSAobm9kZS5sYXN0Q2hpbGQpCiAgICAgICAgbm9kZSA9IG5vZGUubGFzdENoaWxkOwoKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKG5vZGUucGFyZW50Tm9kZSAhPSByb290KQogICAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlOwoKICAgIHJldHVybiBudWxsOwogIH0sCgogIHByZXZpb3VzX3NpYmxpbmdfZWxlbWVudDogZnVuY3Rpb24gKGVsKSB7CiAgICBlbCA9IGVsLnByZXZpb3VzU2libGluZzsKCiAgICB3aGlsZSAoZWwgJiYgZWwubm9kZVR5cGUgIT0gMSkKICAgICAgZWwgPSBlbC5wcmV2aW91c1NpYmxpbmc7CgogICAgcmV0dXJuIGVsOwogIH0sCgogIG5leHRfc2libGluZ19lbGVtZW50OiBmdW5jdGlvbiAoZWwpIHsKICAgIGVsID0gZWwubmV4dFNpYmxpbmc7CgogICAgd2hpbGUgKGVsICYmIGVsLm5vZGVUeXBlICE9IDEpCiAgICAgIGVsID0gZWwubmV4dFNpYmxpbmc7CgogICAgcmV0dXJuIGVsOwogIH0sCgogIGZpcnN0X2NoaWxkX2VsZW1lbnQ6IGZ1bmN0aW9uIChlbCkgewogICAgdmFyIG5vZGU7CgogICAgZm9yIChub2RlID0gZWwuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCiAgICB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfSwKCiAgZmlyc3RfdGFnOiBmdW5jdGlvbiAoZWxlbWVudCwgdGFnKSB7CiAgICB2YXIgbm9kZTsKCiAgICBpZiAoIXRoaXMuaXNfeGh0bWwpCiAgICAgIHRhZyA9IHRhZy50b1VwcGVyQ2FzZSgpOwoKICAgIGZvciAobm9kZSA9IGVsZW1lbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCiAgICB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5ub2RlTmFtZSA9PSB0YWcpCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfSwKCiAgaGlkZV9zZWxlY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSAvLyBGaXJlZm94LCBDaHJvbWl1bSwgU2FmYXJpLCBPcGVyYQogICAgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwoKICAgICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkKICAgICAgewogICAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICAgIHJhbmdlLmNvbGxhcHNlIChmYWxzZSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgLy8gSW50ZXJuZXQgRXhwbG9yZXIKICAgIHsKICAgICAgdmFyIHRleHRSYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSAoKTsKICAgICAgdGV4dFJhbmdlLmNvbGxhcHNlIChmYWxzZSk7CiAgICB9CiAgfSwKCiAgZ2V0X3NlbGVjdGVkX3RleHQ6IGZ1bmN0aW9uICgpIHsKICAgIHRyeQogICAgewogICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikKICAgICAgICByZXR1cm4gd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk7CgogICAgICBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKQogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpOwoKICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikKICAgICAgICByZXR1cm4gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dDsKICAgIH0KICAgIGNhdGNoIChlKQogICAgewogICAgfQoKICAgIHJldHVybiAiIjsKICB9LAoKICAvLyBtYWtlIG5vdGUgb2YgbGVuZ3RoIG9mIHNlbGVjdGVkIHRleHQKICAvLyBhcyB0aGlzIGV2YWx1YXRlcyB0byB6ZXJvIGluIGNsaWNrIGV2ZW50CiAgbW91c2VfYnV0dG9uX3VwOiBmdW5jdGlvbiAoZSkgewogICAgdzNjX3NsaWR5LnNlbGVjdGVkX3RleHRfbGVuID0gdzNjX3NsaWR5LmdldF9zZWxlY3RlZF90ZXh0KCkubGVuZ3RoOwogIH0sCgogIG1vdXNlX2J1dHRvbl9kb3duOiBmdW5jdGlvbiAoZSkgewogICAgdzNjX3NsaWR5LnNlbGVjdGVkX3RleHRfbGVuID0gdzNjX3NsaWR5LmdldF9zZWxlY3RlZF90ZXh0KCkubGVuZ3RoOwogICAgdzNjX3NsaWR5Lm1vdXNlX3ggPSBlLmNsaWVudFg7CiAgICB3M2Nfc2xpZHkubW91c2VfeSA9IGUuY2xpZW50WTsKICB9LAoKICAvLyByaWdodCBtb3VzZSBidXR0b24gY2xpY2sgaXMgcmVzZXJ2ZWQgZm9yIGNvbnRleHQgbWVudXMKICAvLyBpdCBpcyBtb3JlIHJlbGlhYmxlIHRvIGRldGVjdCByaWdodGNsaWNrIHRoYW4gbGVmdGNsaWNrCiAgbW91c2VfYnV0dG9uX2NsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgaWYgKCFlKQogICAgICB2YXIgZSA9IHdpbmRvdy5ldmVudDsKCiAgICBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC13M2Nfc2xpZHkubW91c2VfeCkgKwogICAgICAgIE1hdGguYWJzKGUuY2xpZW50WSAtdzNjX3NsaWR5Lm1vdXNlX3kpID4gMTApCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmICh3M2Nfc2xpZHkuc2VsZWN0ZWRfdGV4dF9sZW4gPiAwKQogICAgICByZXR1cm4gdHJ1ZTsKCiAgICB2YXIgcmlnaHRjbGljayA9IGZhbHNlOwogICAgdmFyIGxlZnRjbGljayA9IGZhbHNlOwogICAgdmFyIG1pZGRsZWNsaWNrID0gZmFsc2U7CiAgICB2YXIgdGFyZ2V0OwoKICAgIGlmICghZSkKICAgICAgdmFyIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgaWYgKGUudGFyZ2V0KQogICAgICB0YXJnZXQgPSBlLnRhcmdldDsKICAgIGVsc2UgaWYgKGUuc3JjRWxlbWVudCkKICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgIC8vIHdvcmsgYXJvdW5kIFNhZmFyaSBidWcKICAgIGlmICh0YXJnZXQubm9kZVR5cGUgPT0gMykKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgaWYgKGUud2hpY2gpIC8vIGFsbCBicm93c2VycyBleGNlcHQgSUUKICAgIHsKICAgICAgbGVmdGNsaWNrID0gKGUud2hpY2ggPT0gMSk7CiAgICAgIG1pZGRsZWNsaWNrID0gKGUud2hpY2ggPT0gMik7CiAgICAgIHJpZ2h0Y2xpY2sgPSAoZS53aGljaCA9PSAzKTsKICAgIH0KICAgIGVsc2UgaWYgKGUuYnV0dG9uKQogICAgewogICAgICAvLyBLb25xdWVyb3IgZ2l2ZXMgMSBmb3IgbGVmdCwgNCBmb3IgbWlkZGxlCiAgICAgIC8vIElFNiBnaXZlcyAwIGZvciBsZWZ0IGFuZCBub3QgMSBhcyBJIGV4cGVjdGVkCgogICAgICBpZiAoZS5idXR0b24gPT0gNCkKICAgICAgICBtaWRkbGVjbGljayA9IHRydWU7CgogICAgICAvLyBhbGwgYnJvd3NlcnMgYWdyZWUgb24gMiBmb3IgcmlnaHQgYnV0dG9uCiAgICAgIHJpZ2h0Y2xpY2sgPSAoZS5idXR0b24gPT0gMik7CiAgICB9CiAgICBlbHNlCiAgICAgIGxlZnRjbGljayA9IHRydWU7CgogICAgaWYgKHczY19zbGlkeS5zZWxlY3RlZF90ZXh0X2xlbiA+IDApCiAgICB7CiAgICAgIHczY19zbGlkeS5zdG9wX3Byb3BhZ2F0aW9uKGUpOwogICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIGRpc21pc3MgdGFibGUgb2YgY29udGVudHMKICAgIHczY19zbGlkeS5oaWRlX3RhYmxlX29mX2NvbnRlbnRzKGZhbHNlKTsKCiAgICAvLyBjaGVjayBpZiB0YXJnZXQgaXMgc29tZXRoaW5nIHRoYXQgcHJvYmFibHkgd2FudCdzIGNsaWNrcwogICAgLy8gZS5nLiBhLCBlbWJlZCwgb2JqZWN0LCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgb3B0aW9uCiAgICB2YXIgdGFnID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgogICAgaWYgKHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkICYmIGxlZnRjbGljayAmJgogICAgICAgICF3M2Nfc2xpZHkuc3BlY2lhbF9lbGVtZW50KHRhcmdldCkgJiYKICAgICAgICAhdGFyZ2V0Lm9uY2xpY2spCiAgICB7CiAgICAgIHczY19zbGlkeS5uZXh0X3NsaWRlKHRydWUpOwogICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKICAgICAgZS5jYW5jZWwgPSB0cnVlOwogICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICBzcGVjaWFsX2VsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICBpZiAodGhpcy5oYXNfY2xhc3MoZWxlbWVudCwgIm5vbi1pbnRlcmFjdGl2ZSIpKQogICAgICByZXR1cm4gZmFsc2U7CgogICAgdmFyIHRhZyA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCiAgICByZXR1cm4gZWxlbWVudC5vbmtleWRvd24gfHwKICAgICAgZWxlbWVudC5vbmNsaWNrIHx8CiAgICAgIHRhZyA9PSAiYSIgfHwKICAgICAgdGFnID09ICJlbWJlZCIgfHwKICAgICAgdGFnID09ICJvYmplY3QiIHx8CiAgICAgIHRhZyA9PSAidmlkZW8iIHx8CiAgICAgIHRhZyA9PSAiYXVkaW8iIHx8CiAgICAgIHRhZyA9PSAic3ZnIiB8fAogICAgICB0YWcgPT0gImNhbnZhcyIgfHwKICAgICAgdGFnID09ICJpbnB1dCIgfHwKICAgICAgdGFnID09ICJ0ZXh0YXJlYSIgfHwKICAgICAgdGFnID09ICJzZWxlY3QiIHx8CiAgICAgIHRhZyA9PSAib3B0aW9uIjsKICB9LAoKICBzbGlkeV9jaHJvbWU6IGZ1bmN0aW9uIChlbCkgewogICAgd2hpbGUgKGVsKQogICAgewogICAgICBpZiAoZWwgPT0gdzNjX3NsaWR5LnRvYyB8fAogICAgICAgICAgZWwgPT0gdzNjX3NsaWR5LnRvb2xiYXIgfHwKICAgICAgICAgIHczY19zbGlkeS5oYXNfY2xhc3MoZWwsICJvdXRsaW5lIikpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIGdldF9rZXk6IGZ1bmN0aW9uIChlKQogIHsKICAgIHZhciBrZXk7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh0eXBlb2Ygd2luZG93LmV2ZW50ICE9ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSB3aW5kb3cuZXZlbnQua2V5Q29kZTsKICAgIGVsc2UgaWYgKGUud2hpY2gpCiAgICAgIGtleSA9IGUud2hpY2g7CgogICAgcmV0dXJuIGtleTsKICB9LAoKICBnZXRfdGFyZ2V0OiBmdW5jdGlvbiAoZSkgewogICAgdmFyIHRhcmdldDsKCiAgICBpZiAoIWUpCiAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgaWYgKGUudGFyZ2V0KQogICAgICB0YXJnZXQgPSBlLnRhcmdldDsKICAgIGVsc2UgaWYgKGUuc3JjRWxlbWVudCkKICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgIGlmICh0YXJnZXQubm9kZVR5cGUgIT0gMSkKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgcmV0dXJuIHRhcmdldDsKICB9LAoKICAvLyBkb2VzIGRpc3BsYXkgcHJvcGVydHkgcHJvdmlkZSBjb3JyZWN0IGRlZmF1bHRzPwogIGlzX2Jsb2NrOiBmdW5jdGlvbiAoZWxlbSkgewogICAgdmFyIHRhZyA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCiAgICByZXR1cm4gdGFnID09ICJvbCIgfHwgdGFnID09ICJ1bCIgfHwgdGFnID09ICJwIiB8fCB0YWcgPT0gImRsIiB8fAogICAgICAgICAgIHRhZyA9PSAibGkiIHx8IHRhZyA9PSAidGFibGUiIHx8IHRhZyA9PSAicHJlIiB8fAogICAgICAgICAgIHRhZyA9PSAiaDEiIHx8IHRhZyA9PSAiaDIiIHx8IHRhZyA9PSAiaDMiIHx8CiAgICAgICAgICAgdGFnID09ICJoNCIgfHwgdGFnID09ICJoNSIgfHwgdGFnID09ICJoNiIgfHwKICAgICAgICAgICB0YWcgPT0gImJsb2NrcXVvdGUiIHx8IHRhZyA9PSAiYWRkcmVzcyI7IAogIH0sCgogIGFkZF9saXN0ZW5lcjogZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyKSB7CiAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpCiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgZmFsc2UpOwogICAgZWxzZQogICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KCJvbiIrZXZlbnQsIGhhbmRsZXIpOwogIH0sCgogIC8vIHVzZWQgdG8gcHJldmVudCBldmVudCBwcm9wYWdhdGlvbiBmcm9tIGZpZWxkIGNvbnRyb2xzCiAgc3RvcF9wcm9wYWdhdGlvbjogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBldmVudCA9IGV2ZW50ID8gZXZlbnQgOiB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOyAgLy8gZm9yIElFCgogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgY2FuY2VsOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgIGlmIChldmVudCkKICAgIHsKICAgICAgIGV2ZW50LmNhbmNlbCA9IHRydWU7CiAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwoKICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICB9CgogICAgdzNjX3NsaWR5LmtleV93YW50ZWQgPSBmYWxzZTsKICAgIHJldHVybiBmYWxzZTsKICB9LAoKLy8gZm9yIGVhY2ggbGFuZ3VhZ2UgZGVmaW5lIGFuIGFzc29jaWF0aXZlIGFycmF5Ci8vIGFuZCBhbHNvIHRoZSBoZWxwIHRleHQgd2hpY2ggaXMgbG9uZ2VyCgogIHN0cmluZ3NfZXM6IHsKICAgICJzbGlkZSI6InDDoWcuIiwKICAgICJoZWxwPyI6IkF5dWRhIiwKICAgICJjb250ZW50cz8iOiLDjW5kaWNlIiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6InRhYmxhIGRlIGNvbnRlbmlkb3MiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoiVGFibGEgZGUgQ29udGVuaWRvcyIsCiAgICAicmVzdGFydCBwcmVzZW50YXRpb24iOiJSZWluaWNpYXIgcHJlc2VudGFjacOzbiIsCiAgICAicmVzdGFydD8iOiJJbmljaW8iCiAgfSwKICBoZWxwX2VzOgogICAgIlV0aWxpY2UgZWwgcmF0w7NuLCBiYXJyYSBlc3BhY2lhZG9yYSwgdGVjbGFzIEl6ZGEvRGNoYSwgIiArCiAgICAibyBSZSBww6FnIHkgQXYgcMOhZy4gVXNlIFMgeSBCIHBhcmEgY2FtYmlhciBlbCB0YW1hw7FvIGRlIGZ1ZW50ZS4iLAoKICBzdHJpbmdzX2NhOiB7CiAgICAic2xpZGUiOiJww6BnLi4iLAogICAgImhlbHA/IjoiQWp1ZGEiLAogICAgImNvbnRlbnRzPyI6IsONbmRleCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJ0YXVsYSBkZSBjb250aW5ndXRzIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlRhdWxhIGRlIENvbnRpbmd1dHMiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmVpbmljaWFyIHByZXNlbnRhY2nDsyIsCiAgICAicmVzdGFydD8iOiJJbmljaSIKICB9LAogIGhlbHBfY2E6CiAgICAiVXRpbGl0emkgZWwgcmF0b2zDrSwgYmFycmEgZXNwYWlhZG9yYSwgdGVjbGVzIEVzcS4vRHRhLiAiICsKICAgICJvIFJlIHDDoGcgeSBBdiBww6BnLiBVc2kgUyBpIEIgcGVyIGNhbnZpYXIgZ3JhbmTDoHJpYSBkZSBmb250LiIsCgogIHN0cmluZ3NfY3M6IHsKICAgICJzbGlkZSI6InNuw61tZWsiLAogICAgImhlbHA/IjoibsOhcG92xJtkYSIsCiAgICAiY29udGVudHM/Ijoib2JzYWgiLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoib2JzYWggcHJlemVudGFjZSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJPYnNhaCBwcmV6ZW50YWNlIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6Inpub3Z1IHNwdXN0aXQgcHJlemVudGFjaSIsCiAgICAicmVzdGFydD8iOiJyZXN0YXJ0IgogIH0sCiAgaGVscF9jczoKICAgICJQcmV6ZW50YWNpIG3Fr8W+ZXRlIHByb2Now6F6ZXQgcG9tb2PDrSBrbGlrbnV0w60gbXnFoWksIG1lemVybsOta3UsICIgKwogICAgIsWhaXBlayB2bGV2byBhIHZwcmF2byBuZWJvIGtsw6F2ZXMgUGFnZVVwIGEgUGFnZURvd24uIFDDrXNtbyBzZSAiICsKICAgICJkw6EgenbEm3TFoWl0IGEgem1lbsWhaXQgcG9tb2PDrSBrbMOhdmVzIEIgYSBTLiIsCgogIHN0cmluZ3Nfbmw6IHsKICAgICJzbGlkZSI6InBhZ2luYSIsCiAgICAiaGVscD8iOiJIZWxwPyIsCiAgICAiY29udGVudHM/IjoiSW5ob3VkPyIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJpbmhvdWRzb3BnYXZlIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IkluaG91ZHNvcGdhdmUiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiaGVyc3RhcnQgcHJlc2VudGF0aWUiLAogICAgInJlc3RhcnQ/IjoiSGVyc3RhcnQ/IgogIH0sCiAgaGVscF9ubDoKICAgICAiTmF2aWdlZXIgZC5tLnYuIGhldCBtdWlzLCBzcGF0aWViYXIsIExpbmtzL1JlY2h0cyB0b2V0c2VuLCAiICsKICAgICAib2YgUGdVcCBlbiBQZ0RuLiBHZWJydWlrIFMgZW4gQiBvbSBkZSBrYXJha3Rlcmdyb290dGUgdGUgdmVyYW5kZXJlbi4iLAoKICBzdHJpbmdzX2RlOiB7CiAgICAic2xpZGUiOiJTZWl0ZSIsCiAgICAiaGVscD8iOiJIaWxmZSIsCiAgICAiY29udGVudHM/Ijoiw5xiZXJzaWNodCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJJbmhhbHRzdmVyemVpY2huaXMiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoiSW5oYWx0c3ZlcnplaWNobmlzIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IlByw6RzZW50YXRpb24gbmV1IHN0YXJ0ZW4iLAogICAgInJlc3RhcnQ/IjoiTmV1c3RhcnQiCiAgfSwKICBoZWxwX2RlOgogICAgIkJlbnV0emVuIFNpZSBkaWUgTWF1cywgTGVlcnNjaGxhZywgZGllIEN1cnNvcnRhc3RlbiBsaW5rcy9yZWNodHMgb2RlciAiICsKICAgICJQYWdlIHVwL1BhZ2UgRG93biB6dW0gV2VjaHNlbG4gZGVyIFNlaXRlbiB1bmQgUyB1bmQgQiBmw7xyIGRpZSBTY2hyaWZ0Z3LDtnNzZS4iLAoKICBzdHJpbmdzX3BsOiB7CiAgICAic2xpZGUiOiJzbGFqZCIsCiAgICAiaGVscD8iOiJwb21vYz8iLAogICAgImNvbnRlbnRzPyI6InNwaXMgdHJlxZtjaT8iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoic3BpcyB0cmXFm2NpIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlNwaXMgVHJlxZtjaSIsCiAgICAicmVzdGFydCBwcmVzZW50YXRpb24iOiJSZXN0YXJ0dWogcHJlemVudGFjasSZIiwKICAgICJyZXN0YXJ0PyI6InJlc3RhcnQ/IgogIH0sCiAgaGVscF9wbDoKICAgICJabWllbmlhaiBzbGFqZHkga2xpa2FqxIVjIG15c3rEhSwgbmFjaXNrYWrEhWMgc3BhY2rEmSwgc3RyemHFgmtpIGxld28vcHJhd28iICsKICAgICJsdWIgUGdVcCAvIFBnRG4uIFXFvHlqIGtsYXdpc3p5IFMgaSBCLCBhYnkgem1pZW5pxIcgcm96bWlhciBjemN6aW9ua2kuIiwKCiAgc3RyaW5nc19mcjogewogICAgInNsaWRlIjoicGFnZSIsCiAgICAiaGVscD8iOiJBaWRlIiwKICAgICJjb250ZW50cz8iOiJJbmRleCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJ0YWJsZSBkZXMgbWF0acOocmVzIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlRhYmxlIGRlcyBtYXRpw6hyZXMiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmVjb21tZW5jZXIgbCdleHBvc8OpIiwKICAgICJyZXN0YXJ0PyI6IkTDqWJ1dCIKICB9LAogIGhlbHBfZnI6CiAgICAiTmF2aWd1ZXogYXZlYyBsYSBzb3VyaXMsIGxhIGJhcnJlIGQnZXNwYWNlLCBsZXMgZmzDqGNoZXMgIiArCiAgICAiZ2F1Y2hlL2Ryb2l0ZSBvdSBsZXMgdG91Y2hlcyBQZyBVcCwgUGcgRG4uIFV0aWxpc2V6ICIgKwogICAgImxlcyB0b3VjaGVzIFMgZXQgQiBwb3VyIG1vZGlmaWVyIGxhIHRhaWxsZSBkZSBsYSBwb2xpY2UuIiwKCiAgc3RyaW5nc19odTogewogICAgInNsaWRlIjoib2xkYWwiLAogICAgImhlbHA/Ijoic2Vnw610c8OpZyIsCiAgICAiY29udGVudHM/IjoidGFydGFsb20iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoidGFydGFsb21qZWd5esOpayIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJUYXJ0YWxvbWplZ3l6w6lrIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6ImJlbXV0YXTDsyDDumpyYWluZMOtdMOhc2EiLAogICAgInJlc3RhcnQ/Ijoiw7pqcmFpbmTDrXTDoXMiCiAgfSwKICBoZWxwX2h1OgogICAgIkF6IG9sZGFsYWsga8O2enRpIGzDqXBrZWTDqXNoZXoga2F0dGludHNvbiBheiBlZ8OpcnJlbCwgdmFneSAiICsKICAgICJoYXN6bsOhbGphIGEgc3rDs2vDtnosIGEgYmFsLCB2YWd5IGEgam9iYiBuecOtbCwgaWxsZXR2ZSBhIFBhZ2UgRG93biwgIiArCiAgICAiUGFnZSBVcCBiaWxsZW50ecWxa2V0LiBBeiBTIMOpcyBhIEIgYmlsbGVudHnFsWtrZWwgdsOhbHRvenRhdGhhdGphICIgKwogICAgImEgc3rDtnZlZyBtw6lyZXTDqXQuIiwKCiAgc3RyaW5nc19pdDogewogICAgInNsaWRlIjoicGFnLiIsCiAgICAiaGVscD8iOiJBaXV0byIsCiAgICAiY29udGVudHM/IjoiSW5kaWNlIiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6ImluZGljZSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJJbmRpY2UiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmljb21pbmNpYXJlIGxhIHByZXNlbnRhemlvbmUiLAogICAgInJlc3RhcnQ/IjoiSW5pemlvIgogIH0sCiAgaGVscF9pdDoKICAgICJOYXZpZ2FyZSBjb24gbW91c2UsIGJhcnJhIHNwYXppbywgZnJlY2NlIHNpbmlzdHJhL2Rlc3RyYSBvICIgKwogICAgIlBnVXAgZSBQZ0RuLiBVc2FyZSBTIGUgQiBwZXIgY2FtYmlhcmUgbGEgZGltZW5zaW9uZSBkZWkgY2FyYXR0ZXJpLiIsCgogIHN0cmluZ3NfZWw6IHsKICAgICJzbGlkZSI6Is+DzrXOu86vzrTOsSIsCiAgICAiaGVscD8iOiLOss6/zq7OuM61zrnOsTsiLAogICAgImNvbnRlbnRzPyI6Is+AzrXPgc65zrXPh8+MzrzOtc69zrE7IiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6Is+Azq/Ovc6xzrrOsc+CIM+AzrXPgc65zrXPh86/zrzOrc69z4nOvSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiLOoM6vzr3Osc66zrHPgiDOoM61z4HOuc61z4fOv868zq3Ovc+Jzr0iLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoizrXPgM6xzr3Otc66zrrOr869zrfPg863IM+AzrHPgc6/z4XPg86vzrHPg863z4IiLAogICAgInJlc3RhcnQ/IjoizrXPgM6xzr3Otc66zrrOr869zrfPg863OyIKICB9LAogIGhlbHBfZWw6CiAgICAizqDOu86/zrfOs863zrjOtc6vz4TOtSDOvM61IM+Ezr8gzrrOu86vzrogz4TOv8+FIM+Azr/Ovc+EzrnOus65zr/PjSwgz4TOvyBzcGFjZSwgz4TOsSDOss6tzrvOtyDOsc+BzrnPg8+EzrXPgc6sL860zrXOvs65zqwsICIgKwogICAgIs6uIFBhZ2UgVXAgzrrOsc65IFBhZ2UgRG93bi4gzqfPgc63z4POuc68zr/PgM6/zrnOrs+Dz4TOtSDPhM6xIM+AzrvOrs66z4TPgc6xIFMgzrrOsc65IEIgzrPOuc6xIM69zrEgzrHOu867zqzOvs61z4TOtSAiICsKICAgICLPhM6/IM68zq3Os861zrjOv8+CIM+EzrfPgiDOs8+BzrHOvM68zrHPhM6/z4POtc65z4HOrM+CLiIsCgogIHN0cmluZ3NfamE6IHsKICAgICJzbGlkZSI6IuOCueODqeOCpOODiSIsCiAgICAiaGVscD8iOiLjg5jjg6vjg5ciLAogICAgImNvbnRlbnRzPyI6IuebruasoSIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiLnm67mrKHjgpLooajnpLoiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi55uu5qyhIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IuacgOWIneOBi+OCieWGjeeUnyIsCiAgICAicmVzdGFydD8iOiLmnIDliJ3jgYvjgokiCiAgfSwKICBoZWxwX2phOgogICAgICLjg57jgqbjgrnlt6bjgq/jg6rjg4Pjgq8g44O7IOOCueODmuODvOOCuSDjg7sg5bem5Y+z44Kt44O8ICIgKwogICAgICLjgb7jgZ/jga8gUGFnZSBVcCDjg7sgUGFnZSBEb3du44Gn5pON5L2c77yMIFMg44O7IELjgafjg5Xjgqnjg7Pjg4jjgrXjgqTjgrrlpInmm7QiLAoKICBzdHJpbmdzX3poOiB7CiAgICAic2xpZGUiOiLlubvnga/niYciLAogICAgImhlbHA/Ijoi5biu5YqpPyIsCiAgICAiY29udGVudHM/Ijoi5YaF5a65PyIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiLnm67lvZUiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi55uu5b2VIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IumHjeaWsOWQr+WKqOWxleekuiIsCiAgICAicmVzdGFydD8iOiLph43mlrDlkK/liqg/IgogIH0sCiAgaGVscF96aDoKICAgICLnlKjpvKDmoIfngrnlh7ssIOepuuagvOadoSwg5bem5Y+z566t5aS0LCBQZyBVcCDlkowgUGcgRG4g5a+86IiqLiAiICsKICAgICLnlKggUywgQiDmlLnlj5jlrZfkvZPlpKflsI8uIiwKCiAgc3RyaW5nc19ydTogewogICAgInNsaWRlIjoi0YHQu9Cw0LnQtCIsCiAgICAiaGVscD8iOiLQv9C+0LzQvtGJ0Yw/IiwKICAgICJjb250ZW50cz8iOiLRgdC+0LTQtdGA0LbQsNC90LjQtT8iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoi0L7Qs9C70LDQstC70LXQvdC40LUiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi0J7Qs9C70LDQstC70LXQvdC40LUiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoi0L/QtdGA0LXQt9Cw0L/Rg9GB0YLQuNGC0Ywg0L/RgNC10LfQtdC90YLQsNGG0LjRjiIsCiAgICAicmVzdGFydD8iOiLQv9C10YDQtdC30LDQv9GD0YHQuj8iCiAgfSwKICBoZWxwX3J1OgogICAgItCf0LXRgNC10LzQtdGJ0LDQudGC0LXRgdGMINC60LvQuNC60LDRjyDQvNGL0YjQutC+0LksINC40YHQv9C+0LvRjNC30YPRjyDQutC70LDQstC40YjRgyDQv9GA0L7QsdC10LssINGB0YLRgNC10LvQutC4IiArCiAgICAi0LLQu9C10LLQvi/QstC/0YDQsNCy0L4g0LjQu9C4IFBnIFVwINC4IFBnIERuLiDQmtC70LDQstC40YjQuCBTINC4IEIg0LzQtdC90Y/RjtGCINGA0LDQt9C80LXRgCDRiNGA0LjRhNGC0LAuIiwKCiAgc3RyaW5nc19zdjogewogICAgInNsaWRlIjoic2lkYSIsCiAgICAiaGVscD8iOiJoasOkbHAiLAogICAgImNvbnRlbnRzPyI6ImlubmVow6VsbCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJpbm5laMOlbGxzZsO2cnRlY2tuaW5nIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IklubmVow6VsbHNmw7ZydGVja25pbmciLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoidmlzYSBwcmVzZW50YXRpb25lbiBmcsOlbiBiw7ZyamFuIiwKICAgICJyZXN0YXJ0PyI6ImLDtnJqYSBvbSIKICB9LAogIGhlbHBfc3Y6CiAgICAiQmzDpGRkcmEgbWVkIGV0dCBrbGljayBtZWQgdsOkbnN0cmEgbXVza25hcHBlbiwgbWVsbGFuc2xhZ3N0YW5nZW50ZW4sICIgKwogICAgInbDpG5zdGVyLSBvY2ggaMO2Z2VycGlsdGFuZ2VudGVybmEgZWxsZXIgdGFuZ2VudGVybmEgUGcgVXAsIFBnIERuLiAiICsKICAgICJBbnbDpG5kIHRhbmdlbnRlcm5hIFMgb2NoIEIgZsO2ciBhdHQgw6RuZHJhIHRleHRlbnMgc3Rvcmxlay4iLAoKICBzdHJpbmdzOiB7IH0sCgogIGxvY2FsaXplOiBmdW5jdGlvbiAoc3JjKSB7CiAgICBpZiAoc3JjID09ICIiKQogICAgICByZXR1cm4gc3JjOwoKICAgICAvLyB0cnkgZnVsbCBsYW5ndWFnZSBjb2RlLCBlLmcuIGVuLVVTCiAgICAgdmFyIHMsIGxvb2t1cCA9IHczY19zbGlkeS5zdHJpbmdzW3czY19zbGlkeS5sYW5nXTsKCiAgICAgaWYgKGxvb2t1cCkKICAgICB7CiAgICAgICBzID0gbG9va3VwW3NyY107CgogICAgICAgaWYgKHMpCiAgICAgICAgcmV0dXJuIHM7CiAgICAgfQoKICAgICAvLyBzdHJpcCBjb3VudHJ5IGNvZGUgc3VmZml4LCBlLmcuCiAgICAgLy8gdHJ5IGVuIGlmIHVuZGVmaW5lZCBmb3IgZW4tVVMKICAgICB2YXIgbGcgPSB3M2Nfc2xpZHkubGFuZy5zcGxpdCgiLSIpOwoKICAgICBpZiAobGcubGVuZ3RoID4gMSkKICAgICB7CiAgICAgICBsb29rdXAgPSB3M2Nfc2xpZHkuc3RyaW5nc1tsZ1swXV07CgogICAgICAgaWYgKGxvb2t1cCkKICAgICAgIHsKICAgICAgICAgcyA9IGxvb2t1cFtzcmNdOwoKICAgICAgICAgaWYgKHMpCiAgICAgICAgICByZXR1cm4gczsKICAgICAgIH0KICAgICB9CgogICAgIC8vIG90aGVyd2lzZSBzdHJpbmcgYXMgaXMKICAgICByZXR1cm4gc3JjOwogIH0sCgogIGluaXRfbG9jYWxpemF0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaTE4biA9IHczY19zbGlkeTsKICAgIHZhciBoZWxwX3RleHQgPSB3M2Nfc2xpZHkuaGVscF90ZXh0OwoKICAgIC8vIGVhY2ggc3VjaCBsYW5ndWFnZSBhcnJheSBpcyBkZWNsYXJlZCBpbiB0aGUgbG9jYWxpemUgYXJyYXkKICAgIC8vIHRoaXMgaXMgdXNlZCBhcyBpbiAgdzNjX3NsaWR5LmxvY2FsaXplKCJmb28iKTsKICAgIHRoaXMuc3RyaW5ncyA9IHsKICAgICAgImVzIjp0aGlzLnN0cmluZ3NfZXMsCiAgICAgICJjYSI6dGhpcy5zdHJpbmdzX2NhLAogICAgICAiY3MiOnRoaXMuc3RyaW5nc19jcywKICAgICAgIm5sIjp0aGlzLnN0cmluZ3NfbmwsCiAgICAgICJkZSI6dGhpcy5zdHJpbmdzX2RlLAogICAgICAicGwiOnRoaXMuc3RyaW5nc19wbCwKICAgICAgImZyIjp0aGlzLnN0cmluZ3NfZnIsCiAgICAgICJodSI6dGhpcy5zdHJpbmdzX2h1LAogICAgICAiaXQiOnRoaXMuc3RyaW5nc19pdCwKICAgICAgImVsIjp0aGlzLnN0cmluZ3NfZWwsCiAgICAgICJqcCI6dGhpcy5zdHJpbmdzX2phLAogICAgICAiemgiOnRoaXMuc3RyaW5nc196aCwKICAgICAgInJ1Ijp0aGlzLnN0cmluZ3NfcnUsCiAgICAgICJzdiI6dGhpcy5zdHJpbmdzX3N2CiAgICB9LAoKICAgIGkxOG4uc3RyaW5nc19lc1toZWxwX3RleHRdID0gaTE4bi5oZWxwX2VzOwogICAgaTE4bi5zdHJpbmdzX2NhW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfY2E7CiAgICBpMThuLnN0cmluZ3NfY3NbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9jczsKICAgIGkxOG4uc3RyaW5nc19ubFtoZWxwX3RleHRdID0gaTE4bi5oZWxwX25sOwogICAgaTE4bi5zdHJpbmdzX2RlW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfZGU7CiAgICBpMThuLnN0cmluZ3NfcGxbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9wbDsKICAgIGkxOG4uc3RyaW5nc19mcltoZWxwX3RleHRdID0gaTE4bi5oZWxwX2ZyOwogICAgaTE4bi5zdHJpbmdzX2h1W2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfaHU7CiAgICBpMThuLnN0cmluZ3NfaXRbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9pdDsKICAgIGkxOG4uc3RyaW5nc19lbFtoZWxwX3RleHRdID0gaTE4bi5oZWxwX2VsOwogICAgaTE4bi5zdHJpbmdzX2phW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfamE7CiAgICBpMThuLnN0cmluZ3NfemhbaGVscF90ZXh0XSA9IGkxOG4uaGVscF96aDsKICAgIGkxOG4uc3RyaW5nc19ydVtoZWxwX3RleHRdID0gaTE4bi5oZWxwX3J1OwogICAgaTE4bi5zdHJpbmdzX3N2W2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfc3Y7CgogICAgdzNjX3NsaWR5LmxhbmcgPSBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJsYW5nIik7CgogICAgaWYgKCF3M2Nfc2xpZHkubGFuZykKICAgICAgdzNjX3NsaWR5LmxhbmcgPSBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpOwoKICAgIGlmICghdzNjX3NsaWR5LmxhbmcpCiAgICAgIHczY19zbGlkeS5sYW5nID0gImVuIjsKICB9Cn07CgovLyBoYWNrIGZvciBiYWNrIGJ1dHRvbiBiZWhhdmlvcgppZiAodzNjX3NsaWR5LmllNiB8fCB3M2Nfc2xpZHkuaWU3KQp7CiAgZG9jdW1lbnQud3JpdGUoIjxpZnJhbWUgaWQ9J2hpc3RvcnlGcmFtZScgIiArCiAgInNyYz0namF2YXNjcmlwdDpcIjxodG1sIisiPjwvIisiaHRtbD5cIicgIiArCiAgImhlaWdodD0nMScgd2lkdGg9JzEnICIgKwogICJzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7bGVmdDotODAwcHgnPjwvaWZyYW1lPiIpOwp9CgovLyBhdHRhY2ggZXZlbnQgbGlzdGVuZXJzIGZvciBpbml0aWFsaXphdGlvbgp3M2Nfc2xpZHkuc2V0X3VwKCk7CgovLyBoaWRlIHRoZSBzbGlkZXMgYXMgc29vbiBhcyBib2R5IGVsZW1lbnQgaXMgYXZhaWxhYmxlCi8vIHRvIHJlZHVjZSBhbm5veWluZyBzY3JlZW4gbWVzcyBiZWZvcmUgdGhlIG9ubG9hZCBldmVudApzZXRUaW1lb3V0KHczY19zbGlkeS5oaWRlX3NsaWRlcywgNTApOwoK"></script>
<script>(function() {
if (!window.w3c_slidy) return;
if (!window.Shiny) return;
if (!window.$) return;
// whenever a slide changes, tell shiny to recalculate what is displayed
window.w3c_slidy.add_observer(function (slide_num) {
// slide_num starts at position 1
$(w3c_slidy.slides[slide_num - 1]).trigger("shown");
});
})()
</script>
</head>
<body>
<div class="slide titlepage">
<h1 class="title">Basic Tools For Forecasting</h1>
<p class="author">
Week 4 R-lab<br />Zhaohu(Jonathan) Fan
</p>
<p class="date">06/03/2021</p>
</div>
<div id="example-german-forecasts" class="slide section level1">
<h1>Example: German Forecasts</h1>
<p>R Environment Preparation</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1"></a><span class="co">#Load the required packages to execute the Assignment.</span></span>
<span id="cb1-2"><a href="#cb1-2"></a><span class="kw">library</span>(zoo)</span>
<span id="cb1-3"><a href="#cb1-3"></a><span class="kw">library</span>(readxl)</span>
<span id="cb1-4"><a href="#cb1-4"></a><span class="kw">library</span>(forecast)</span>
<span id="cb1-5"><a href="#cb1-5"></a><span class="kw">library</span>(quantmod)</span>
<span id="cb1-6"><a href="#cb1-6"></a><span class="kw">library</span>(ggplot2)</span></code></pre></div>
<div class="sourceCode" id="cb2"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1"></a><span class="co"># Set working directory</span></span>
<span id="cb2-2"><a href="#cb2-2"></a><span class="kw">setwd</span>(<span class="st">"C:/Users/fanzh/OneDrive - University of Cincinnati/UC_couse/000_Teaching_4090_SS21/DataSet"</span>)</span></code></pre></div>
</div>
<div id="example-german-forecasts-contd" class="slide section level1">
<h1>Example: German Forecasts (cont’d)</h1>
<p>There are several ways to load external data:</p>
<ul>
<li><a href="German_forecasts.xlsx">German Forecasts Excel</a></li>
<li>Read an Excel file in xlsx format into R/RStudio (<code>read_xlsx() function</code>)</li>
</ul>
<div class="sourceCode" id="cb3"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb3-1"><a href="#cb3-1"></a>German <-<span class="kw">read_xlsx</span>(<span class="st">"German_forecasts.xlsx"</span>)</span>
<span id="cb3-2"><a href="#cb3-2"></a><span class="kw">str</span>(German)</span></code></pre></div>
<pre><code>## tibble [25 x 9] (S3: tbl_df/tbl/data.frame)
## $ Institutions: chr [1:25] "Bundesbank" "Commerzbank" "Deka" "Deutsche Bank" ...
## $ GDP : num [1:25] 0.4 0.5 0.7 0.3 0.9 0.4 1.2 1 1.1 0.6 ...
## $ Privcons : num [1:25] 1 1.3 1.1 0.6 1.1 0.9 1.2 1.1 1.2 1 ...
## $ GFCF : num [1:25] -0.1 0.1 -0.3 1.1 0.9 0.1 1.9 1.9 2.6 0.5 ...
## $ Exports : num [1:25] 1.9 2.8 3.3 3.2 4.2 3 4.1 3.8 5.5 2.9 ...
## $ Imports : num [1:25] 3 4.1 3.3 4.2 4.6 3.8 4.1 4.6 5 4.1 ...
## $ Govsurp : num [1:25] -0.75 -0.5 -0.3 -0.5 0 -0.7 -0.3 -0.2 0 -0.4 ...
## $ Consprix : num [1:25] 1.5 1.9 1.9 1.7 2.8 2.1 2 2.1 2 2 ...
## $ Unemp : num [1:25] 7.2 7.1 6.9 7 7 7.1 6.6 6.8 7 7 ...</code></pre>
<div class="sourceCode" id="cb5"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb5-1"><a href="#cb5-1"></a><span class="co"># To read an Excel file in xls format into R, </span></span>
<span id="cb5-2"><a href="#cb5-2"></a><span class="co"># we would use read_xlsx()function with quotation marks (") to denote that Excel file .</span></span></code></pre></div>
</div>
<div id="example-german-forecasts-contd-1" class="slide section level1">
<h1>Example: German Forecasts (cont’d)</h1>
<ul>
<li><p><a href="data_German_forecasts.Rdata">German Forecasts R Data</a></p></li>
<li><p>Load an RData file into R/RStudio (<code>load() function</code>)</p></li>
</ul>
<div class="sourceCode" id="cb6"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb6-1"><a href="#cb6-1"></a><span class="kw">load</span>(<span class="st">"data_German_forecasts.Rdata"</span>) </span>
<span id="cb6-2"><a href="#cb6-2"></a>German_<span class="dv">2</span><-<span class="st"> </span>data_German_forecasts</span>
<span id="cb6-3"><a href="#cb6-3"></a><span class="kw">str</span>(German_<span class="dv">2</span>)</span></code></pre></div>
<pre><code>## 'data.frame': 25 obs. of 9 variables:
## $ ï..Institutions: Factor w/ 25 levels "Bundesbank","Commerzbank",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ GDP : num 0.4 0.5 0.7 0.3 0.9 0.4 1.2 1 1.1 0.6 ...
## $ Privcons : num 1 1.3 1.1 0.6 1.1 0.9 1.2 1.1 1.2 1 ...
## $ GFCF : num -0.1 0.1 -0.3 1.1 0.9 0.1 1.9 1.9 2.6 0.5 ...
## $ Exports : num 1.9 2.8 3.3 3.2 4.2 3 4.1 3.8 5.5 2.9 ...
## $ Imports : num 3 4.1 3.3 4.2 4.6 3.8 4.1 4.6 5 4.1 ...
## $ Govsurp : num -0.75 -0.5 -0.3 -0.5 0 -0.7 -0.3 -0.2 0 -0.4 ...
## $ Consprix : num 1.5 1.9 1.9 1.7 2.8 2.1 2 2.1 2 2 ...
## $ Unemp : num 7.2 7.1 6.9 7 7 7.1 6.6 6.8 7 7 ...</code></pre>
</div>
<div id="scatter-plot-matrices" class="slide section level1">
<h1>Scatter Plot Matrices</h1>
<div class="sourceCode" id="cb8"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb8-1"><a href="#cb8-1"></a><span class="kw">pairs</span>(<span class="dt">x =</span> German[,<span class="kw">c</span>(<span class="st">"GDP"</span>, <span class="st">"GFCF"</span>, <span class="st">"Govsurp"</span>, <span class="st">"Unemp"</span>)], <span class="dt">pch =</span> <span class="dv">19</span>)</span></code></pre></div>
<p><img src="data:image/png;base64,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" width="768" /></p>
<div class="sourceCode" id="cb9"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb9-1"><a href="#cb9-1"></a><span class="co"># Use the c() function to combine character values into a vector (or a list)</span></span>
<span id="cb9-2"><a href="#cb9-2"></a><span class="co"># Use indexed character vectors to select named column(s) or row(s) </span></span></code></pre></div>
</div>
<div id="assessing-variability-the-standardized-score-z-score" class="slide section level1">
<h1>Assessing Variability: The standardized score (Z-score)</h1>
<div class="sourceCode" id="cb10"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb10-1"><a href="#cb10-1"></a><span class="kw">cbind</span>(German[,<span class="dv">1</span>], <span class="kw">round</span>(<span class="kw">scale</span>(German[,<span class="op">-</span><span class="dv">1</span>]),<span class="dv">3</span>))</span></code></pre></div>
<pre><code>## Institutions GDP Privcons GFCF Exports Imports Govsurp
## 1 Bundesbank -1.134 0.437 -0.840 -1.520 -0.713 -1.848
## 2 Commerzbank -0.732 1.429 -0.618 -0.573 0.421 -0.835
## 3 Deka 0.072 0.767 -1.062 -0.046 -0.404 -0.024
## 4 Deutsche Bank -1.536 -0.886 0.493 -0.152 0.524 -0.835
## 5 DIW 0.877 0.767 0.271 0.901 0.936 1.191
## 6 DZ Bank -1.134 0.106 -0.618 -0.362 0.111 -1.645
## 7 Feri 2.083 1.098 1.382 0.796 0.421 -0.024
## 8 Gemeinschaftsdiagnose 1.279 0.767 1.382 0.480 0.936 0.381
## 9 Helaba 1.681 1.098 2.160 2.269 1.349 1.191
## 10 HSBC -0.330 0.437 -0.173 -0.467 0.421 -0.430
## 11 HWWI -0.732 0.437 0.049 0.164 0.730 0.786
## 12 Ifo 0.072 -0.556 0.049 -0.362 -0.404 0.786
## 13 IfW -1.536 -0.886 -0.062 -0.467 0.214 -0.835
## 14 IKB 0.474 0.106 -1.395 1.006 0.318 0.786
## 15 IMK 0.474 -0.556 -0.729 0.164 -0.095 1.191
## 16 ING 0.474 -1.548 0.604 -2.888 -3.394 0.381
## 17 IW 0.273 -1.217 0.938 0.691 0.318 1.191
## 18 IWH 0.072 -1.548 -0.396 0.691 0.008 -0.024
## 19 Kiel Economics 1.279 1.759 0.382 0.269 0.421 0.786
## 20 Landesbank Berlin -0.732 0.437 0.049 -1.204 -0.817 -2.050
## 21 MM Wartburg -0.330 -0.556 -1.618 0.901 -2.157 1.191
## 22 Postbank -0.330 0.437 -0.284 0.375 0.627 -0.024
## 23 RWI -1.536 -2.209 -1.951 -0.362 -0.507 -0.835
## 24 UBS 0.474 0.106 1.160 -0.783 0.214 0.381
## 25 Wirtschaftsweise 0.474 -0.225 0.827 0.480 0.524 -0.835
## Consprix Unemp
## 1 -1.463 1.553
## 2 0.022 0.998
## 3 0.022 -0.111
## 4 -0.720 0.444
## 5 3.363 0.444
## 6 0.765 0.998
## 7 0.393 -1.775
## 8 0.765 -0.666
## 9 0.393 0.444
## 10 0.393 0.444
## 11 0.022 -1.775
## 12 -1.091 -0.111
## 13 0.393 0.444
## 14 0.022 -0.111
## 15 -0.720 0.444
## 16 0.393 -0.111
## 17 -0.535 -2.330
## 18 0.393 -1.220
## 19 -1.091 -0.666
## 20 -1.091 -0.666
## 21 -1.463 0.444
## 22 0.393 0.998
## 23 -0.720 0.444
## 24 0.765 1.553
## 25 0.393 -0.111</code></pre>
</div>
<div id="correlation" class="slide section level1">
<h1>Correlation</h1>
<div class="sourceCode" id="cb12"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb12-1"><a href="#cb12-1"></a><span class="kw">round</span>(<span class="kw">cor</span>(German[,<span class="op">-</span><span class="dv">1</span>]), <span class="dt">digits =</span> <span class="dv">3</span>)</span></code></pre></div>
<pre><code>## GDP Privcons GFCF Exports Imports Govsurp Consprix Unemp
## GDP 1.000 0.430 0.601 0.459 0.209 0.620 0.317 -0.363
## Privcons 0.430 1.000 0.295 0.262 0.469 0.033 0.192 0.073
## GFCF 0.601 0.295 1.000 0.192 0.371 0.223 0.336 -0.295
## Exports 0.459 0.262 0.192 1.000 0.641 0.518 0.210 -0.273
## Imports 0.209 0.469 0.371 0.641 1.000 0.085 0.382 -0.087
## Govsurp 0.620 0.033 0.223 0.518 0.085 1.000 0.179 -0.317
## Consprix 0.317 0.192 0.336 0.210 0.382 0.179 1.000 0.063
## Unemp -0.363 0.073 -0.295 -0.273 -0.087 -0.317 0.063 1.000</code></pre>
<blockquote>
<p><strong>Exercise:</strong></p>
<ul>
<li>Check correlation between GDP and GFCF</li>
</ul>
</blockquote>
<div class="sourceCode" id="cb14"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb14-1"><a href="#cb14-1"></a><span class="kw">cov</span>(German<span class="op">$</span>GDP, German<span class="op">$</span>GFCF); <span class="kw">sd</span>(German<span class="op">$</span>GDP); <span class="kw">sd</span>(German<span class="op">$</span>GFCF)</span></code></pre></div>
<pre><code>## [1] 0.1345917</code></pre>
<pre><code>## [1] 0.2486966</code></pre>
<pre><code>## [1] 0.900037</code></pre>
<div class="sourceCode" id="cb18"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb18-1"><a href="#cb18-1"></a><span class="kw">cov</span>(German<span class="op">$</span>GDP, German<span class="op">$</span>GFCF) <span class="op">/</span><span class="st"> </span>(<span class="kw">sd</span>(German<span class="op">$</span>GDP) <span class="op">*</span><span class="st"> </span><span class="kw">sd</span>(German<span class="op">$</span>GFCF))</span></code></pre></div>
<pre><code>## [1] 0.6012955</code></pre>
<div class="sourceCode" id="cb20"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb20-1"><a href="#cb20-1"></a><span class="co"># What is the meaning of the dollar “$” in R function()?</span></span>
<span id="cb20-2"><a href="#cb20-2"></a><span class="co"># the $allows you extract elements by name from a named list.</span></span></code></pre></div>
</div>
<div id="correlation-contd" class="slide section level1">
<h1>Correlation (cont’d)</h1>
<div class="sourceCode" id="cb21"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb21-1"><a href="#cb21-1"></a><span class="kw">library</span>(<span class="st">"PerformanceAnalytics"</span>)</span>
<span id="cb21-2"><a href="#cb21-2"></a>my_data <-<span class="st"> </span>German[,<span class="op">-</span><span class="dv">1</span>]</span>
<span id="cb21-3"><a href="#cb21-3"></a><span class="kw">chart.Correlation</span>(<span class="dt">R =</span> my_data, <span class="dt">histogram=</span><span class="ot">TRUE</span>, <span class="dt">pch=</span><span class="dv">19</span>)</span></code></pre></div>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABgAAAASACAMAAAAOH3aoAAACN1BMVEUAAAAAADAAADoAAFUAAGYAMDAAMFUAMHcAOjoAOmYAOpAAVZYAZmYAZpAAZrYwAAAwMAAwMDAwMFUwVVUwVXcwVZYwd7U6AAA6ADo6AGY6OgA6Ojo6OmY6OpA6ZmY6ZpA6ZrY6kJA6kLY6kNtVAABVMABVMDBVVTBVd3dVd5ZVd7VVlrVVltNmAABmADpmOgBmOjpmOpBmZjpmZmZmZpBmkJBmkLZmkNtmtttmtv93MAB3VQB3VTB3VVV3d1V3d5Z3lrV3tbV3tdOQAACQOgCQOjqQZgCQZjqQZmaQkDqQkGaQkLaQtpCQtraQttuQtv+Q27aQ29uQ2/+WVQCWVTCWdzCWd1WWd3eWllWWlneWtbWWtdOW09O1dzC1d1W1llW1lne1tXe1tZa1tbW107W109O2AAC2ZgC2Zjq2kDq2kGa2kJC2tma2tpC2tra2ttu227a229u22/+2/9u2///TllXTtXfTtZbTtbXT05bT07XT09PbAADbkDrbkGbbtmbbtpDbtrbbttvb25Db27bb29vb2//b/9vb///fU2vfU4bfU5/fc5/fc7nfkdDkU2vkc2vkc4bkc5/kkdDkrtDkrufqU2vqc2vqc4bqc5/qkZ/qyf/vc2vvc4bvkYbvrp/vrtDvydDvyefv5P/0kWv05P/0///6rob6yZ/6ybn65ND65Of65P/6////AAD/tmb/tpD/yZ//25D/27b/29v/5Ln/5ND/5Of//7b//9D//9v//+f///+xg+HiAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOy9i5cc2V3nGV3uBZU8qx5YxsmqhCUsYJbF2tK420Ly2Qfr1iBPey2WNus9CzbLmTlNyhqbXWnbZuhydsm4u1H6gcHmYcAYMMbG4M6EKhmK7PjjNu6N133HfUbcX+bve7pVVRkR937jZsTvE/cZRYlCoVConVQxtQEUCoVCTSMEAAqFQu2oEAAoFAq1o0IAoFAo1I4KAYBCoVA7KgQACoVC7agQACgUCrWjQgCgUCjUjgoBgEKhUDsqBAAKhULtqBAAKBQKtaNCAKBQKNSOCgGAQqFQOyoEAAqFQu2oEAAoFAq1o0IAoFAo1I4KAYBCoVA7KgQACoVC7agQACgUCrWjQgCgUCjUjgoBgEKhUDsqBAAKhULtqBAAKBQKtaNCAKBQKNSOCgGAQqFQOyoEAAqFQu2oEAAoFAq1o0IAoFAo1I4KAYBCoVA7KgQACoVC7agQACgUCrWjQgCgUCjUjgoBgEKhUDsqBAAKhULtqBAAKBQKtaNCAKBQKNSOCgGAQqFQOyoEAAqFQu2oEAAoFAq1o0IAoFAo1I4KAYBCoVA7KgQACoVC7agQACgUCrWjQgCgUCjUjgoBgEKhUDsqBAAKhULtqBAAKBQKtaNCAKBQKNSOCgGAQqFQOyoEAAqFQu2oEAAoFAq1o0IAoFAo1I4KAYBCoVA7KgQACoVC7agQACgUCrWjQgBQPTosiv27zAdP7s2K4txNl0PKR9eLYu/GY3NOi6dfNqcyeAjRfO9F8zFZSnEirYbKe3O/2n7poTF5Q6GsCyqQpaa4Ro4vDlycLokReV1PijvA4mqeVNIt6nxhyDe505dxdq1oxN8LhlsjrRAARIv6O7nafXDafE8X7A9pPzlvJMAx/8XLqQweUh8GMZQpTqTVUHlvbtfbbxmSNxXKAjAA5GtkbnHVWCdWf+pRMto7wMfXOJJvUdcLQ07B7cvQAMBwayQWAqDSyay4Sb6E/jKYF1feqD6ZaSOOfMjJbO8mjWSGILX5OP/Fy6kMHkK0hhjKVCfSaai818X+Q5KC4TYxFgrMGhOVfI2si727pLA8zkl9wXldT6o7YPBqnlaKW9TxwpBT8Psyqgca5ko33hqJhQAoCdavMj9Kwuka8QvtI6l0SBXD6Fe6NtQaTg6L/UP2m5ZTGTyEfDbbP8z2JtNJdSKdhsp7c7s+X8PtaiyUze2p7q9wydfI8FXjkFjpez1F9TWO5FvU9cKQU/A7aW53462RWgiAPryczMTmm5OZJprLh7QxzKT53o3fYa84fcbaQ+hRT/9/t8EBQHEisrTlXWujP21zoZxdM6absxTXSBdzTA1iton5Xk9yUhZX87RS3KKOF4YiBa8vgy8iq1sjlRAA/WPA2TXxW9ByXT6kil2bOwOdwK8/5h859BlrDynpY7AhEuYqxYnIMj9Hbe7pa1fmQlkXV+7Nhjvoc5TiGjmZkVaHRzP3mKG84PyuJzkpi6t5WiluUccLQ5GCz5fBNwDZ3RqphADouS59Cyfar1U+ZF38+DWLTmAuD23G+kPqZw2AACgt6tv68qYbi+JdurIdKJSm627gu8lSqmvk5JCczL77JaBKzPN6kpOyu5onlOIWdbwwVDe5x5exlvJDAEwp3ZV7ou8DVgGgqB8FzI2BwQCgzY/bCQBDeZOtBwdFcVl9ow4Vyry4/HD4u8lSqmvk1RkdueI+DlSRmO/1BBIA0i3qeGGobnL3L0OoANQfIQCmk+bKPaaDGmwPWRdWLaChAKiT30oAmMq7SWCubgOyLZRsW6dVqkeo31JcIwsyJIpEIftmZ21i3tcTSADo+/rsLgxFCh5fhiI3BMCUUjZebu4Ve/rvVNUHYHX5u/YBiIe0ddbpxo35y1g05vJupCko20LJNjSp1MRsfVu7C860iXlfTyD7AHS3qO2FIafg82UoeroQAFNKNXyhqqbtG+adyof4AcCm1rATABgob3MKWwmARvrxZh5nIycWAABwo4BSAMDjy1BVtxAAk0oey1vFoyvGq1g6pG3Yc2kCshtErLg4tq4JaKC824dKY+HqC6U9XO58AyDFJBX/QKu54HyuJ3jzAORb1PXCUKXg/GWoBowjACaVPIVx8CJWzs+8OdwYyH/TVnMndwEAQ+U9b1taDbsZO4HJ4YaJ3RlLNU19/xfL8nOHHoFWc8H5XE8AZwLLt6jrhaFMwfHLUE0VRQBMK2YRE4r0fsUOLdfFQ8ryXv2JeWZJ31BKj7FZPUU4pP4o25vMIP1VPlje7VpAF4xNZfqJYIdOC7bkJelKawvDpzojX7ZEXteTnFT2awExt2ht2fnCkFJw/zLkuhwCYHL1yxjSL2XdtYzqv1fhkNJuWUAxmlusn7gDABgub7oaqLlwTYWyIYuNZr1OpUHSlba5T640v2lt8mVb+l5PclLZrwba36JtUbpeGHIKrl9GP2kYAYBCoVCoyYQAQKFQqB0VAgCFQqF2VAgAFAqF2lEhAFAoFGpHhQBAoVCoHRUCAIVCoXZUCAAUCoXaUSEAUCgUakeFAEChUKgdFQIAhUKhdlQIABQKhdpRIQBQKBRqR4UAQKFQqB0VAgCFQqF2VAgAFAqF2lEhAFAoFGpHhQAQVeiKRLsh7hafxGBowP/Q6aU9HIAsz8But6iJQSxcteV8P00keF9caiEAUgkBECYEQEzlENQRABkKAZBKCIAwIQBiKoegjgDIUAiAVEIAhAkBEFM5BPVQAHz2N5p30W8+8Jz9W+n5zPwO22IhAFIJARAmBEBM5RDUwwBwPCuKYv8h+fXs2tMv2x0kZeZ32BYLAZBKCIAwIQBiKoegHgSAdVFcevaw2HuxRADEFAIglRAAYUIAxFQOQT0IAPPiavXvMSUAAiCeEACphAAIEwIgpnII6iEAOLtGn/2rikAV+xEA8YQASCUEQJgQADGVQ1APA0AT8xfF+ccIgHhCAKQSAiBMCICYyiGohwBgc7uuAdC2IARAPCEAUgkBECYEQEzlENQj9AGUBAXFjyMAogkBkEoIgDAhAGIqh6AeBICTWdFE/bPDosgbAAUKhUKh7DUYVU8P26i/uZc3AKYuShQKhQImlxC7+e2cZwIDqSDCsAnDJRCbMFyizZiC4XIsmwiAXjBswnAJxCYMl2gzpmC4RAAoUolWYdJlEJ5GesFwCcQmDJdoM6ZguBTDnXnnzIeBxonOCAAqGC6B2IThEm3GFAyXCAApjSOTEACZCYZNGC7RZkzBcOlo88kbvtl4HueWCQIgnmC4BGIThku0GVMwXO58H8CT+9cvkqrPwXMPmjRInH/lfUyt6Kkf+pGfYwCwuc1WmfYOLj8Yweb4guESiE0YLtFmTMFwueMAeHTIxvIbj5UAoBD4GQ0AiPZfTGxzCsFwCcQmDJdoM6ZguNxpAGzuiJH8ZR0AiuIHX9ICoChupbQ5jWC4BGIThku0GVMwXO4yAM6u0aD/wder3zevURg8/XIPgLe3zT7/6dd+qiNAA4ALXSKb10glYs+lDgDjyoDhEohNGC7RZkzBcLnDAKDxf/9u9/cpebK/oABApU8/U217hwoAFQLmBf9BXJtTCYZLIDZhuESbMQXD5aDNs+sHrC5tzzBQErfPsytbkEi+pwYAJcBT71cCgJLEZXgsjCsDhksgNmG4RJsxBcPloE2hnXx75gGczKSzqduElAA4+lhBP1EBgKDEpQ0IxpUBwyUQmzBcos2YguHSwubCqX1Dl014EhaZuOQyV/TdLvQAIJ+87aNqACzcuoFhXBkwXAKxCcMl2owpGC5tbM7dBrmoswlOwSYTh1xIBeC8uLTpyY9e1gGAVgHevS0A+M6y0h8ad5nIpd6ZegsWZkSNZtP1W+a3wChNGC5tbG5u+zb8MNmEJmCViUMuJGhfVaahAQDpBXj7tjQB/SO5mf7MuMtELvXO1FuwMCNqNJuu3zK/BUZpwnBpZfMfnv2F4GxCE7DKxCEXXdDWAuC3foKMBFUBQFmZiGQzkfKNWQiACYUAiCgYLnd1GCiJ4sp6jRYAdSeAahjobU1lIoLNVPr+l5fLz/+1cZeJXOqdqbdgYUbUaDZdv2V+C4zShOFyVwFABvwon9pdAfD6/Znr4Kgpr4x/fpP+YG+z76n3HNul3pnRMxZmRKW36fMtS1tglCYMlwgAKQ0bAAhymgg86ZXxreVXvln9+Jc/Wi6/8O3ql+9+bfm76j3Hdql3ZvSMhRlR6W36fMvSFhilCcMlAoCItOJ3UgFgtTIB4MceprIZW+QmWn7+q9976+vL5Zfe/KdvkGZVTevFyC71zsyesTAjKrlNn29Z3gKjNGG4RAAQmQGwqvW8EgDnLt1wfUfChFcG7Uir9JXfWy6/+MfNH+oRjCO71Dsze8bCjKjkNn2+ZXkLjNKE4XJXAcB3AhsAsOr0vG4UUEKbsfWtpUJfelO168gu9c7MnrEwIyq5TZ9vWd4CozQzcEkqTbpLstWOAkA9DJQ+3HMAIJG/qQeQdSKgA+Ct737jy8Ld9MW/VF8fI7vUOzN7xsKMqOQ2fb5leQuM0szAJQJAL+XsXREAffg/OvpUtWm2Ag4Aorf+7i++Vt9Iv/+nf/X32t0mcKl3pt+ChRlRo9j0+Zb5LTBKMwOXCAC9SKuPFMYFADDhv14K4tpqBR8AZTOrfmD5gmlc6p1ptmBhRtRYNp2/ZX4LjNLMwCUCQC8SxqU2IB4AXPwnE4Hf9tHqoy0AwN+2dWlT0JrEpd6ZbgsWZkSNZNP9W+a3wCjNDFwiAAxaK+ZvcQAo2PhPKwDvII1C8AFAh1X8Ae1bMyxgMIVLvTPtFizMiBrHpse3zG+BUZowXJbCkPZk2aRKmMvEKRfphTBleTxjAcBOA2tfCFNVAaADgMyoXH7h2/Xwav0KBhO41DvTb8HCjKhRbPp8y/wWGKUJw+UOA4A+7u/1r4Qs6dt9GwA8z08E+7XulZAVAWADgN5EpCJNG1Xp1Eqlxnepd2bwjIUZUWPY9PmWhS0wShOGy91tAmoIUOzdeEB+f+1+OxeAjvlkAfCf/q+fJJ/Tv0nD0POgAfCttllwoIFwfJd6ZwbPWJgRNYZNn29Z2AKjNGG43GUAlJt74qIO+3cpAGiQF/RvXqoBUMIGQH0L0RZWWq/+4t9odhzdpd6ZyTMWZkSNYNPnWxa3wChNGC53GgBleXqHD/90MTgy+v99Qvj/r36mrg2ABwCtRv9u99tXtSMEJnCpd6bfgoUZUaPY9PmW+S0wShOGyx0HQFULeHTngK7p884PPa7TWDUrv3V66of/u19pm4PIRDDgACi//ydN8+pbf/5N/V5TuNQ7027BwoyocWx6fMv8FhilCcPlzgNASoMb/S+JZrFaTW4zvWC4BGIThku0GVMwXCIABJnjfwuAIALAuDJguARiE4ZLtBlTMFwiAHgNxP8aAIEEgHFlwHAJxCYMl2gzpmC4RACwIt2/hQUAwhqBYFwZMFwCsQnDJdqMKRguEQC9SPgvCwRALRgugdiE4RJtxhQMl1Y2n5DxMU/uP/vcA/9svI90ycQuF2mIfy36+F/YAiCAADCuDBgugdiE4RJtxhQMlxY217Oi2H+5fmnWFe9sfA90ysQmF034L5rwbweAIALAuDJguARiE4ZLtBlTMFwO26wi/7mLxb863Lv5+vFMfoeKbTaex7llYgcAVWDvXv1iCYCQRiAYVwYMl0BswnCJNmMKhsthm/PiKn1/Fgn9a3H5TPts/A5zzMQXAMybv+wB4E0AGFcGDJdAbMJwiTZjCobLQZtn18ii+fW/7Q+fbPwOc8zEEwDs2E9bAARUAWBcGY4uN//5OllZ79LdgSeE0w+Qidd7l++KG2wTCLM5kWC4dLTp+JVfEr/yzaP3XCRtrgc33khpcyrBcIkA4F786wQAXwLAuDLcXL7arqVa7P2sYbfTw37hJf51bJYJBNqcSjBcutkM/Mq5lRgvP0xmczLBcDloc3ObNP6s69cnnsy2rgloJUz9sgaAPwFgXBkuLjdztjv9gvYaWbC77d1yTyDM5nSC4dLJJreSrn5wyPGM3e9m9znDBXoxiG9njWVzOsFwOWxzUex96JOzcyT0VzC46puN53FumTgDQAz/LgDwbgTyujI29y/S2rI5Nq75depeuzMjzS1eo3ddXHLhW79U3qLQ3fSWCQTabPXoOimWS0PFMi/4MQ9P7pOmjHNuT6u1tiUY9BK+S11cWPO7dQV6dk3Y4EIAGKUJw+WwzfrFWbeqL/yADAf1zcbzOLdMXAGgWPjBCQB+BPC5MroHqb2bhr3IWN0+eNYvvCHaTxuz6F2+R1pyn9zjbnPZXVXbJ3H3EX3+66qTlgkE2mzUP3uai2XB+2CaLK44V4O3JRh0Er8xTfyuv/J98pXX79trm5Br4tNr4Un9KiaHtgUYpQnDpY3N1z5AvmjS5HfZswEoTwDIj/9uAPCtAnhcGeyDlD440ojfAeCMqWQ71bBdXdJsn26CKb3llTdz/STR8KsOp7ecEgi02Yh99nzaQADqoy/rnqZuwcrT5TSytll/l81FNfCVd7WDe/0f9JCu9PndItoUdVrXiFXf+iPSoX2OqWBv/Ot7tbbtOw/MZpRMXACgDP+uAPAigHuRk/tl7+bj6qKcmYI5fay6wP5FLl/6iObed+P2NNibEgKnsFu3gYWVZQKBNpl8SbHQdwHpi6UOSr2NedF8BbTy4toSum3BYM0VDv+XuFtXVrRI6xKf8w8lFMoJod+orUbLndYd3rsLtO+78J38Gv6d02bfc3Kr72sEVuygqkfiBw7aUQBown+mAJh3twvfyMOrriZcYP5q7r1jp0YVZ5fzgvMk/NmK3mNM4Fz3DQJ2CYTarLXoXSwKQySf87WtdR+hyIm41qhC77JjEgmExj/6OHvuJhMe1t5ddI2sbVp+Y3M+rndfuXgtsBdDTJu8mGq0cDew1btb4r6+b38Kjqyn19T11LYtsi3Zzr0XqrYRAIVZhvDvBgBPAjgXOYn67SW71kafpm2jvVzn/BXifBVbu6T5MneU5mYmJ8F+TA6rz8QygUCbtbiimOsfO9d8oCCHdZYYtNoq8C6bKyJR2wvbn0FVjiMBwPIbE3fr/hY3MBdDTJuyG9LrQzojBLML0p9RlePnDpvypPu2PRce7af+Lnv1VOIv0r77/YKwn9fXLwRH884g5gEMhP/mpb/6CO8AAL9eAOcrY8FcseTSVH7P5Dr4r/vwxu23SNlsrY/snNZiBHNNINBm76KLPCxYZUvv5bFbcK1XjjwNCwYL0nWy+bhYgbryRrl5ddZZIX0+IwHA4StXX3ebR3d+lN1fIkIUm7y6m4B8f1xBVR807isf9Ld+NJ3Xw1OAy16V3/1fLMtHM94tsUiqfcezxvSi7lkjzcM+0XkbAWAO4abw7w4ADwI4Xxlz9hqcay5Icn3/juZqNTzqauXUHsymTp9I5Jt5rr3FLRMItFmLZakZphdYPMxdWigUCgoG7ZP9gvUwb77oBds4OBYAHL5yO0cj1AD6KE+KirsdTnqKNmveMCOAxZ2tFQiAym/9dVdlc55r52tOY10XLtmvbiNaeNVV3Gw+cZy03WfjeZxbJhYAMId/VwB4EcCn37K/jzRP87RpSPO4Ij3y2Mja5UJ8tFfe913L+SM6EoPtsbJLINRm54Jvu1be3BQTDAD8HwMbBQWDdR8JuiDb/d78QkZV7R+OBQD7r9wS5GKVwiyv0mTiKMMCUeLcDyn+2isQAFWRdH1VSreVsQv1fr4rdFJtXx+AMYRbvPLLCQA+jUCuRU4ej/rveK1tbr2qC1QLn3ZMpw5B7uaXwgNR04r+qB+E/6JbAqE2qYRn/oU67NT9LAwA+G/AQ0F32aItjLkiwDcAOJnt/WzAPM1GtjbtvrHusV5mvirBxKOA1nznj/rrrCyLF8RUAFizFRbV99pUDBdhddMdAwBd9D8yAJwJ4FrkJzM2fvN/taobhpQAoDNw3MOXEwC45LXR4OmXufmjV50SCLXZuRgEQLMTA4CmzOnE6vFnAs97AMil0jwAnjz3MGSifiNLm9IgHvqNSWGy/srLk575OgQ4Nl/5AoDtE1PdEHSUtbhhPVEfQB/YNZ37DSHmVcE/uVcZH5zZrpaNzdMXnj04OHj2hveciEwAQJt/IgPAgwAJANBEMhkAa+FpO75LuaKv7Pujlfz/wHc43XJJINBm74IfvaKGKcmd2bduX7vT+h53JnAf1xeKUmEeAMcFgOVXrma+Ij2H51iv0mSD/lrlhA61kibat93C7goe+cUAQEYQmd3TdAFcWM9MpTugYZs9wb0CSZON74FOmZgBULf+xwaAeyOQ65XBhykVANpYJQOgvv240eKRXTpEA3qHkVnl9Wyq5jxyA0BbLeAB8PT/y8wgHnUmsBEAbPNAlgD4BM98pcG5Y/RKCADxTtnoxlwMKxgATJeFaIHc1nt3m43nZsbSDbVZfY37H3qd6JOHvjDMAgBN728CADgSIDoAuoYNGQD3Lj37HnJ9uK8GlAYA3eeUTBccEgi02bsYAEC3C7Mv6US5SMddlhs6RdQ1JqQCwNkh81FuAGgnU8nM59VfCnFtSrkYAbD59wfXpTUtNgHDv1IC4OMHB7O6Jkq/CzJlgcxs9xsGOmjkgvJ3x2w8j3PLxAQA63c+ugLAuQoQHQBzdoSz4hs6dhpj4ejSCQDMx91qAHkBoO8l4AHQ73nm0aeSCAD8cJZMAcAzX9WI5dYAlKoGQEQWCmRuIJ9J351SAoDoeNZ2+zU7ano2BuQ09B/wPIBu9GcKALgRIHYfQB/GdMMVTQtIhLp0AQBrvJv7kxcA+pGhIgC4+WMjTgTTA+CMr5LnCQDm44WqCkAXNjCtyudtk5cVAPgm/1P/acBl6j6Akp7FLfpd3DLvZ9aOAMDhpb/OAHAlQGQA2IxX14x3jOLSbhDPidRy0i0gM+IooEEAMJ/wfQBC5cWxNANHAV1tf+FK5VTon8wNAGrm8xbrNwG5xf9ko4CaTe1upOLsvf69n8t2qdqq1AZHAdUBv5svpq0pBNqs3wjWCMRL4TVvfbeO8O4AcCRA5HkAwqs5lA2t6rGjcVzaDwrX7JbRPAAWEAIAGEP69ZjiuBSkmQdQ+eMD54QAUA4DlZeJlhaNq9excYz/CecBsJwg5+Q+3qtXIAC4eQBKt3XAn3f7pQEAMdL0jJP+L9/pMNMCwOmt734AcCBA5JnAUwPAblqoDIDuqXHEmcBDAJDLkoaKE349lpEBoJoJXA/O4B9Pc5sIJo/uFysKzftiUnVPcbKbCdwD4J7DRahUopnAYtPQmp2t4mF42Ca9KQ4OyOsR/EtkUgC4vfXdAwBuBIi8FpAaADazx+K4FFd5U68AIE8e6qKBXQKhNrukTUtBaAAgcGNkACjXAlJMUB0PAMHMr3Xs+iowR5ucDGsBMc0+XeXAa/Y8p0RrAfVm5+18xX5V9QSdwCV5Z9tFeiece6//TLApAcCv/pMEAE6NQM5XhtVqoERMfOP3S9kHYLk0pFT976LImKuBDiwGpwGAwA330gwLBgvyNnVhNVDFCgDjAcBuMTgD86nqwvZoZfErTf1qoMzjUfvVrt0bpuK47LWoh/orVgOl45FP21Wt5/V+ZBioTwP9DiwFwa/+lgYALgRwLnK2Zdr4ZMIGqrlADdeLw9qlGK81i8NLH3dPjZYJBNrs0u6zWqvCVieh1LmVOF1LM+wu27DvA6i+4ypz9sWWbXgYDwAhzOdHhaaZu6RUu8a//D4AOtqTtHPTt8RdLUPm/4a67NV/xXWRLfq6CfNswr3j1KeBfvsBsBoFAA4EcC9yuzeC8QCgDSv9O6ycLw57l3avhxJbhE/6t1uO+EYwcrfYvBCmlDuEL7Abxn0hDPtGsBoA7cTqaQBg+UIYPfPLdm6FV5+iZ2lKbwTrwvwpg9MLnblOfiwIjqztd9yt9tzYbs21y1acHvJ/j2zTMptRMlEBQFz+OSEALAngXuQ0WN4YfCew9L4r+sRTz8FM90Yw4ZW+2hfEzgvxMboNv5YJBNqsZftKSGHIKBO6Tq8lbE+bVk4jv4aRLXYCsNxY+0dW79J8VXgncP+c38bQpkWKfUXkdAAQ3gncj12tXwZ64w1uP/W77sewaZfNKJkoACAt/58KAPYE8CjyY+ZyVL6lqhYHAO4qTtnTRjNiR8+rc6Nb2obVzT3m2dUygUCbTF4WL4UXAEBjF1lvkTLY+Ul72wBg+VJ44d3vzCPAid/6JI42RdHI2UdKtqGHvle9XemVbWCbEACjaPsB4BrhfQFgTQCfIj9uq/x9PW8IAE2QZR95XOTgsq5bk56pJ/c4RvGqW7Ivd5WSPvxaJhBosxbbeGJ8zS8/aYw9zP3t29sWDFyY3w1TZ5jvuv6np81JBcPltgNAfv9XOgDYIsBvFBsditXVB0sLAJAnHnLQwQ2PwQFOLufcA5NQCelCg1CxFp8NVQnEtVmrr+73T6DDAChPO/ceON26YODL/CboKxeFSGBzSsFwueUAULz/MSUA7HqCYVwZLi43XABn6iAcAAQCcMvYaBKIa7PVo+viG6osABCEUxhfuYtNAdnsmtTDzBc/LgwMCbM5oWC43G4AqN7/mxQAVnUAGFeGm8tXuxYS9vlYAADTklW3ww8mENvmVILh0sUmj+y+TUxkPrdby/x1oRICYAptOQA8InwQAGwIAOPKcHS5+c+kF6249EFuOXURANXTN309gWJOoTKB6DYnEgyXbjYDmK+ab4cAmEbbDABVBSAYAGbVBDAjAMaVAcMlEJswXLquq+HN/Lny3kEATCEpgCXKJlXCXCYSAHwifCAAhisBMK4MGC6B2IThEm3GFAyX2wwAZQUgGADmrdTHAAFgXBkwXAKxCcMl2owpGC63uAlIHf/HAMAAAmBcGTBcArEJwyXajCkYLrcaAPEjvC0AjASAcWXAcAnEJgyXaDOmYLjcXm2zk+YAACAASURBVABoKgAjAcDUFwzjyoDhEohNGC7RZkzBcLm1ANDF/7EAYKgEwLgyYLgEYhOGS7QZUzBcbjEAUkR4FwBoKwEwrgwYLoHYhOESbcYUDJfbCgBtBWBEAOgqATCuDBgugdiE4RJtxhQMl1sKAH38HxUA6koAjCsDhksgNmG4RJsxBcPl1gIgTYR3BYCyEgDjyoDhEohNGC7RZkzBcLmdADBUAMYGgIIAMK4MGC6B2IThEm3GFAyX9jbPrl/yfYFDOT4AEkX4QQAoRJuB2InWMK4MGC6B2IThEm3GFAyXDgC45v0Gn3JkAJgqAOMDoEYAAiCNYNiE4RJtxhQMl4M2z64f1CLvJz448K0FjAkAY/xPDAD157QS0LUQwbgyYLgEYhOGS7QZUzBcDgOAf3mPby1gRACY4/8kAKgRgABIIBg2YbhEmzEFw+Wwzc3t4l1keW8wTUDm+D8RAI7qZiDGZu6C4RKITRgu0WZMwXBpY3NBX/AABQADFYCpAHDUTwmAcWXAcAnEJgyXaDOmYLi0snky23sRCgDIg3a6CB8AgBoBrc38BcMlEJswXKLNmILh0s7m5nZxFQwAUkb4IAC0lQAYVwYMl0BswnCJNmMKhktLm5t7xbkZBACscgZAPSAUyJUBwyUQmzBcos2YguHS2ubxzHsEEM3G/1CHTIo6vqaL8KEAKJm+4MwFwyUQmzBcos2YguHS3ubpB557HJCN/6EOmTQtLOkifDAASgRAXMGwCcMl2owpGC63ay0g2smaNwAqBMC4MmC4BGIThku0GVMwXCIAYm62AgCQKwOGSyA2YbhEmzEFw2UpLFtj3tl/JNBIAKD/IgBiCIZLIDZhuESbMQXD5XYBoF4LCAEQQzBcArEJwyXajCkYLh1tPnnDNxvP49wyQQDEEwyXQGzCcIk2YwqGy+3qA0AAxBMMl0BswnCJNmMKhksEQMzNCIDRBcMmDJdoM6ZguLSyefrCswcHB8/eeBiQjf+hDpkgAOIJhksgNmG4RJsxBcOlhc2Tw66LeP9F72x8D3TKBAEQTzBcArEJwyXajCkYLodtnsyK/Q+9TvTJw2LPlwDBhWHzSmIEQETBcAnEJgyXaDOmYLgctjkvLih/d8zG87hONiNQEQARBcMlEJswXKLNmILhctAmF3jHnwfg9EpiBEBEwXAJxCYMl2gzpmC4zB4ALq8kRgBEFAyXQGzCcIk2YwqGy0Gbm9vFre6PNX05pFc2foe5vZK4BUC+YmzmLhgugdiE4RJtxhQMl8M218XezTrqb45nDAwcs/E8rnR5JTECIKJguARiE4ZLtBlTMFxa2FyQyHVwcEB+XPXOxvfA0uGVxOpzET8svDaLPwMSg3FlwHAJxCYMl2gzpmC4tLH55P5F+vh67r3+M8GCCsP2lcQIgIiC4RKITRgu0WZMwXAJYykIy1cSIwAiCoZLIDZhuESbMQXDJQwAWL6SeMLGfRQKhYKowNBsp+BcbF5JPHVJolAoFDCFhmYrjZLLhJWudgCS/b65C4ZLIDZhuESbMQXDJZQmILtMJivyNmcrBzCuDBgugdiE4RJtxhQMl6AAoBoJNEFtRqHpARC9hofXb0TBcIk2YwqGSwRAFE0NgARNfHj9RhQMl2gzpmC4BAWAoVcS7zIABtYf8kkyqsNUgmEThku0GVMwXMICwFAmO9sJjADIWzBcos2YguESARAra/v2FmavDbfY6d7B5QfKI05mhXkVJgRA3oLhEm3GFAyXOwiANJ0FDqlqAUCkfOsmAkArGDZhuESbMQXD5e4BYOr+4gEAKCM9AkArGDZhuESbMQXD5S4CwHrXRBIA0L9lc/PaIWkI8njvMgIgb8FwiTZjCobL3AHQvRKyls0rIQeMuIzXSSMtAKq/50Xh895lBEDeguESbcYUDJe5A2Bzh2sesXkl5ICR6QCwXC7FrEUAlGfXhk5SKQRA3oLhEm3GFAyXuQOAvI/G+ok4bwAsbQBQzr3agBAAeQuGS7QZUzBc5g+AKiTavocyZwB04X8AAIumG3hdFOcfn16vcPDOF9tO4AUHB1JZaN7Q9oRWj37op19iIv8rH/mp6rOnmMxokuXpHfJ6n0t3+7VVN/fJ2972Ln2QW24Vr9+IguESbcYUDJcAALC5bdsmkm8n8JKJ//YA+NysqDuFGwCQH/1LOdctDjb32hayp97dxf9ffaabXXCzP+D873T7duNNX511e/4sYwSv34jKweV3yDX4h8ZdcrBpIRg2YbgEAIDyH579BctMMh0GyoV/yyagKlqfqyNz9dTeAIDsff6xeCg3lLQhwCvvY3tOGmhUSe4fSv0pC8WegsucBcNmDi7/kVyFf2bcJQebFoJhE4ZLCACwz2TCiWCGbJrw331gAgAJ9TTGr9uH90d3+3kAa6YNqJsbMKcJV0H//6h+vO2jFAAfJtUB0iL0X5ipBev6yZ80/hzP2tFGJJk98tGGfMa0MOH1G1E5uEQAjCsYLncQAOOoq2i0T/99zcM0DPR2+xi+7gN3H+yZZn/y5E6f4Sky6k7gT1WHvKP95Qc+2nQCz9qHfZrkhcddivRTpl+Bb2HKqTANgmEzB5ff//Jy+fm/Nu6Sg00LwbAJwyUCIJGah/2lMPbHCIDX788KNlp3zT3s037zYXckjeA1AEjDzw++VP9sqgIVANYsU7rulLapqU+Rb2HKqjANgmFzUpf//Cb9wQLge+o9YRQmEJswXCIA0ohv/ek/ID8FAAhqnse7sE3UAaBvA2o/qkHQDAOtnvyfev/R0aefaWoCFABdXF8XDG3WPQDUw04zKkyTYNic1OW3ll/5ZvXjX/5oufzCt6tfvvu15e+q94RRmEBswnAJHgB89EyVi7OoFRL+C/aDchgAP/aw3rJmWoB6APRtQGwL0FVhHkDDgXYewKLvV+6TXDMf7qkWIc2oME2CYXNKlyTwLz//1e+99fXl8ktv/tM3yFWpaQqCUZhAbMJwiQBIo6bxf1m4AODcpRvdG2/Y/l5mMbi2xaZrAao38QD4WN8CRADAdCFzAOhqEETCLAC8fqNqSpe087fSV35vufziHzd/qIeDwihMIDZhuAQPAC6TfIq8bfy3AIB6orMGAO3H1Sf15voDHgAfrrsCrABQnnYjQ/dusAzIqDBNgmFzSpffWir0pTdVu8IoTCA2YbhEACRR2/fLOLLoBGalAQBpAyK/Ldr+2mAAlJv73Uyw4kpvIJ/CNAqGzSldvvXdb3xZCP9f/Etl/AdSmEBswnCJAEigpvGHb5SyGgbaSwMA0gZ0oT7uKrOfAQCrIQBUOn2hZUBvJpfCHBAMm1O7fOvv/uJrdez//T/9q7/X7ja1TUvBsAnDJQJAndBQf4K0B/NB2/ij2yMIAGva+bvmRgtp+wBWtYohABAnj+4wY5BKvH6jKgOX3zE1/jfKwKaNYNiE4RIBoExnqEtZ2qP/gF/2YcCmOwDqNqB+9D43CohMAHh7NwqoCf+rz1S+ni8HAFA2awp1Q0/x+o2o6V3+bdv8YyLA9DatBMMmDJcIAG06ZgAIe7QfLIfjfxgAaBsQMyOYmwdAJgC8u5kHQEJ/Nw+g+MxKDQB2bjH/B16/ETW5SzoU6A++NbAaxOQ27QTDJgyXCAB9MvrkpD2YeV9D4T8UAKQN6BPMRmYmcNv2Q5eCe37FzASeVTRQ1wCYmcAIgGSa2iWZBbz8wrfrKQH65SCmtmkpGDZhuEQA6JNxBYBd+A8FADnkQFgmolkLiDz5v71dC6j4lX4toCqligBKALAzjhfsDnj9RtTELmngJ40/tCOATgdWCkZhArEJwyUCQJ+MGwD4eV826ZdeAGjWb+7b7+u/yRtgnuk6f3+94FYDJRG+7wxu0+8ngtGZwE9IFwCuBZREE7v8Vjv0n8wG1k0CKCe3aSsYNmG4RADok3EBgDjvyyb90g8AJ/2KcXUa834ucf1GmCrWK94HoAZAnVwrJlm8fiNqWpd12Kdt/7Qt6It/o9kRRmECsQnDJQJAm45DJ7Bi3tdg8lQ+AKDP7Nwa0h/v4v/7m/hfVwdqdW8EUwOgPOlfErP/UOkyZ8GwObXL7yzb9d+q376qqwBMbtNSMGzCcIkAUKbjNAxUOe/LmHz3qw8A+KZ6quadwD/zUhv/yZDQj/xQIb0TWD0M9NF7SC3gHL8kHF6/ETW5y+//SdPw/9aff1O/1+Q27QTDJgyXCAB1QkOxnNlDM+/LdGygPVWS3SywJv634jIjY4Hsk4zuMoVg2IThEm3GFAyX2w8AKTIPf+Aiy5E/fH6+mRmS1MR/BEAWguESbcYUDJdbDwCpOWf4AwfZjvwctBmoDgBi/OcB4EIAvH4jCoZLtBlTMFzuAACELcMfWMsr/CcFgBT/BQA4EACv34iC4RJtxhQMl9sOAPWULeMHtvIM/ykBIMd/BEAWguESbcYUDJfgAVBwUmzmf8YDgG/4TwgARfwXAWBPALx+IwqGS7QZUzBcIgD8AOAf/tMBQBX/JQBYEwCv34iC4RJtxhQMl+ABwGUyGgBC4n8qACjjPwIgC8FwiTZjCobLbQdAmk7gkPCfCgDq+C8DwJYAeP1GFAyXaDOmYLjcAQBEHwYa9PivsRmootDE/6NCFl0UaPCE8fqNKBgu0WZMwXAJAQBPyAqVT+4/+9yDgR2V5xJlIhi7S2j8TwIAXfxXA2CFABhXMFyizZiC4TJ/AKxnRbH/cr1m5ZWBTGxqAD5iEwkN/0mKXBv/j/i3BdeieyMARpSXy9euk1c5XB547CHLSTWLOnELu1L1y0mlszm+YNiE4TJ7AFQX9bmLxb863Lv5+vFMfIutmIlNH4CPmETC43/8Il/p478SAJQACIAR5eHyrFuktX9Hg0rM0oAIgJwEw2X2AJiT1ewX7durzPeCzSggqqUko4c+keDmH43NINEmHScAHCEAxpW7S/J6zlbMWxok0aCPAMhQMFzmDoCza+Tqr/9tf+gzsQOAHP4H4nqXSJT4H7nIyeN/6Q6AVUoAPLpeBZ9Ld+UNp3cu8ls29y+SZo6H8q6WgnGbObukL33opH/uqTmhBYD5fgm3OY1g2IThcvcAoIz2ZgS0B0cJ/5GLvB7U6QoASoBULjf3mvBzRYxbizYw7TffYxeyrkqpWCqkMCl9zt2Qousj0vh+7sYbzAcaoNnK2eWalt8bBJlMhJdVvw1OuXnuXAHAmBVTMFzmDoDqSegWuR3opXwyC24C0kZ6EwK63t8o8T9qkTeD+rMCQP+KSuFdN138b59pmUdWXwIEFOZp08ryNF//6Pi118TV7ml8YAxCRJc0y+ZNbgtDFaApURUA5NcGDWs3YtaxGvtVlGnLa3NvFgZ8ot0oTOtsfA9cFHsf+uTsHAn91V1hDhNDncDmth7DRnJ4tPgfschX7aQuZwAcDU4H83ZJovq7HtM4yj+Bkg3koZa+wpJ8kyTM7d2sdr0/cw9WoTaZVhY+vPb8qu0zrTGj1VNIUXX01D/KV7vt/W/qsuNSsNUuxKz265SYejITm9KkGqyTdqEwHbLxPZB+X3u3queZg77lQJeJcRjocG+vdoe69zdWUcVKZ9UHcXcAHCUDwLwNlAshBC26CLqu7z8Sv15kP/CQf2FWdvZ/sSwfzfjATkxVUCofHTb2F/VrlQmlHJvU/V0uxBeCKtFD7o2rJ0oAkE3ubnchZi3ot3k8E4u0L8eq7Mguj6Rd3LQLhemQjf+hr32AtMa+Wn0/lwdihGkimN3izZq96rf+2tkdVqQiZ5/hvQBgJoCvy7NrbeSpbiQuBs27P5stPRGqba7t1YE2e3eVYRY+i9ZJcyJkv4f8luQu+fBN/lLicU4+VwPApwFoJ2JW9a3Sclnz1yathDYl1jQ4V7t6f99EO1CYLtmMkok2F/u1+1V7di99DzHXK0o6Ky6AewCgSASAKiC1z/0LbRCaNwDo7jD9rgMKaam62ubN3ujzLtjWn58MzT6xkaNLMraHqTzN1U/za/qxEgDkQ48qVZQrk+F+8+u6rs+s3Xul1Qqx2Qb+unOx1cnFonhX+8m8LftFUBUgSmHOme+x/n3ddvvQ+l94DrsAALdXt4h7d0//GQFgJTy/+wHASABfl+s+Hq11Ub0JDHMOAH4Xs3dhrrvMTzR1/XqPhX/DTy8PADCWFkoAkJ1ulWoAeIwA8rCp1vwC+Y/59eRHXyzXT7/c/IiQQ4jNLrrPWcSui/2HLRL6rsa1ey8KoxiFuTj/eHP7gvz7vCJBVbJn18IJsP0AcH9zlzRHQDmbzFvByYjh3w8AAwTwdck8y+siKyHDBX7X+egA6AN7FUmVec8bSp1//ISOChlaisogR5dCq/9CFc7JA+CFUg2AtTwCK4VNpc7+hxfLk//2ZcWv/Y9AhQGgq/cxVaTTB32doK8bDE08NStCYZ5dI0Mg25bK/vd1dTkQnhIohOYBCQCqeQD8xBfFQV6jd/gpYurpxN4KSIacIwn/q0KUBwDKRADogpUOAFXEpfusuydbrzErVAF91QwAVHnXbVlVOLiwngUOAvIBABPUlW0ni6ZxQAEAOrrKJ9LGuMBJxG/iPPNrE6kiBKwyyCb7eC942fRNQCpGOCtCYdIgTyM/93tXEUAADAIg6toNUwNAH/59AWAggK/LOQcAVWTtGi/JL/t3q5/HM89H1iAAtDcPifHy9r4P+Fw3W2GsYaAWAOhGUCkA4FsBSAaAk1kzj2fyPgDD4323aaEeHeCqCIW5rmfB3hJ+X7fF2GwKEiQAlE/eMG6WzsW99ceY7vQAONKs++YHAGMVIBkAmEEt645f71SzYlipAEDWYrvVuC32H9RTcscaBjoMgL6XQAEAzx6AlDWAtu1i6j4AGwCQCmr1WPK5Q++xyVTxAHBV+L3pYqkMR6hQgQLAUCZ8LpHCf5fw5J3AhXbZT28A6AmQqgnolL2vjtspN9rugiElAsDpNaaW0uzoPVIpAQD60SEyACZoT2NzVwIglz4AmyagdiLY/icyAYBQA2Ce+yMAdXsBEG/qLjObLE5qnge6rfpvAQATARJ1ApOQf4HpfbtTT7pfj94JbOwDOO56YZnl9jV9BTaKDYC+90QBAL85AB42lQLZCUzEDAwltb29G48XU48CUvcBMFE/QhsQAACcvvDswcHBszcGl4xkz8Uh/MuxXfokYvj3LnLnVf+nAYB5GOhC05I+/jwA0yigZvIvET+qfUQAmEYBsUFfAoB23lh0m2pJw0BJwDr5scfNjwg5hNhcKIeBEvEzA+pdJp4HoB4FVPf8srWDEGUPgJPuxRjF/sDjQ38uLq0/8uO99EkONQCPVf+HAWAgQMBEsPa2kafO3usjK6/xZwJz8wD4CDqvLrXuaaN3Nh4AhuYBMKvqtbJYOSK6TbWa3vP51e7Xxr96OoOHwiaC1XCUwz3TCVzv0k4a9lSMwpzzY//r32u8bm4TIGz/KKDqct7/0OtEnzwcChLduTi1/sgN/NIn0/cBeK36bwEAfT+w79n2YyfEpSBoy/U+U4/rO4mr38Z+aNXNBOZnX7LVGO9+CmeX7Rj/3pADAJSzBpLYnEohNjVLQZQMANrBSmGjQKPNBKZjka92vzd/BNX0WOUOALamJtXaxEzqXNwa/+UhPtIn048C8lz13woAGgIENK5rFoPrhq636pYNCpjV7m1TtxYQcXmF+fOkWwNuPlonMM8g+U43ASAkLuwAALSLwfUAqH6pHlPImrVB7Su7UJgO2Xgexw39t3whjFvnLwQA+K76bwEALQFCHq3JQrryctDyuOqmRkAGBvk2Dvh/J+RJ+a5yNVAeW/N6P9Ix6P3A5epyYDVQEwCE5qOkNidSkE1+Oeh+LJg8CihwpZ1dKEyHbDyP8wGAm/IHQMCq/1MAQHohTPugz4etWyX34tuxnq179Zk3s1RrE/MEJp1dWr4PoN2V9bWepDBHVZjNDftCGCUA6tewXfJ/TynVThSmfTaex3F9NR4vhR9W9gAIWvV/GAA6AvifrPhKyH5OrRhbu2ctdc+wjQK+kzbzbrXn4hb/MvbG5OlhqElnl7Ssui4KY9VDBEBAFwDGrJiC4TJ3AJDBGjebPsXjoYV5/c4l705gduG3NADQ9AOHnC3/Dt0GAHxobb5Kusya6v18tgqxyb8TeNEtrimaDH5zvbtLWlsiOQ68E1gGwHzElqqJBMMmDJfZA6C+FQ4ODiwa5XwBUMvwibxLiFzS4Rb+TAYAFQHw+o0oZ5d8dal/Q4F8DwgAEAYQJbY5jWDYhOEyfwCUT8jzV6Vz7x16BCPn4hGo5UOkTyKGf7ZFaVDiwm9JAKAmAF6/EeXukq0vdT1fFgAQ3iWT2uYkgmEThksAAHDIpIj8rJ5GbYOSTfgXFv5MAwBlI1DeZdgJhk0Pl6fdBMj+TdgWAAiYBgalMIHYhOFy+wDQ/JKxWo9DIVta+iEhAGQE5F2GnWDY9HL52vUqmO+x76GxBMBog5UmEgybMFxuGQAij9dJI0sAyEv/JAOAqhEo6yLsBcMmDJdoM6ZguAQPALHZpP00VX4RZAcAxdJv6QCgIEDWRdgLhk0YLtFmTMFwiQAYXzYAUC79mRAAMgGyLsJeMGzCcIk2YwqGS/AA4DLZGgBEe+8XAiALwXCJNmMKhsstA8CWdAJrVv5PCQCJAHmXYScYNmG4RJsxBcPl9gEAzjBQXWSO+eJHewCIBMi7DDvBsAnDJdqMKRgutw0AsadspWDJAACivvjRAQACAfD6jSgYLtFmTMFwuXUAiJtekuqEGQBxX/yIAMhCMFyizZiC4RIBMJjeqACgk38nAgBPALx+IwqGS7QZUzBcIgCGk0vFFV38nwwAJb/yXNyzTiQYNmG4RJsxBcMlAmA4ufEAQJt/RgOAevWhts0Lr9+IguESbcYUDJcIgOHkxgJAM/pnYgCsEADxBcMl2owpGC4RAMPJjQSAtvd3NACoPiUmEADRBcMl2owpGC4RAIPpjdQJ3I3+mRQAR7QKkOS00wiGTRgu0WZMwXCJADCmN9owUGby17QAoAToXWYvGDZhuESbMQXDJQJAnVAd9ou+RzTq9LL6Xz7qpgnz7gA4aoYC4fUbUTBcos2YguESAaBMR3jyj1sVkAHATf6aGgANAfD6jSgYLtFmTMFwiQDQpsMBIEXyTMBlJ/9ODoCCEgCv34iC4RJtxhQMlwgAfTJdcpGHAwkAENd+yAIAK7x+YwqGS7QZUzBcggeA6nUwwUnyP9MCIO2bf70A0EwHiHKyqQXDJgyXaDOmYLhEAKiS5H+mBIBi6ecMAFAiAOIKhku0GVMwXIIHAJcJNACkf/GjJwBKBEBUwXCJNmMKhksEgDad5J3Amhe/ZAEAvH6jCoZLtBlTMFwiAJTpjDEMVPfiLwSAi2DYhOESbcYUDJcIAHVCQrSPPxFM+95HBICTYNiE4RJtxhQMlxAA8NnfeFz/svnAc4+NmYApctN7XxAALoJhE4ZLtBlTMFzmD4DjWfXwvf+Q/Hp27emXjZlAKXLje18QAC6CYROGS7QZUzBcZg+AdVFcevaw2Hux3B4ANDNtxwjzCIAsBMMl2owpGC6zB8C8uFr9e0wJsDUAoP8iAGIIhk0YLtFmTMFwmTsAzq7RZ/+qIlDF/m0BADcTOG2YRwBkIRgu0WZMwXCZPwCamL8ozj9GAETcggAYUTBcos2YguEydwBsbtc1ANoWhACIuAUBMKJguESbMQXDZe4AaPoASoKC4scRAPG2IABGFAyXaDOmYLjMHgAns6KJ+meHRYEAiLYFATCiYLhEmzEFw2X2AChPD9uov7lnAYAUL/GNLARARMGwCcMl2owpGC7zBwCrzW8PzQRO9B73qEIARBQMmzBcos2YguESFgCGMilKCMELARBRMGzCcIk2YwqGyy0DQHs2WRc+AiCiYNiE4RJtxhQMl6AAoBoGWghqP42RXyK1ATZf9S6zFwybMFyizZiC4RIBML4QABEFwyYMl2gzpmC4BAWA8skb5kwKQADQF0mR7A+XQ7Iuwl4wbMJwiTZjCoZLWAAYygRSJzACIIpg2IThEm3GFAyXWwYAFAqFQjlojNAcBIDTF549ODh49sbDwUxQKBQK5aKA0Gwv/1xODjun+y8OZJJRpctQuhnYtPjuM3BpIxg2YbhEmzEFw2X2TUAns2L/Q68TfbJ5L5ghk4yK3NAZkYFNi66SDFzaCIZNGC7RZkzBcJk9AObFBeXvykzyKXLTcKTpbdoMlprepZVg2IThEm3GFAyXuQOAG/oP6H0ACIA2lcTNj9MXpo1guESbMQXDJQIgjRAAdRoIACoYLtFmTMFwmTsANreLW90f6+L80GqguQgBUKehW2+IWXQoNIvwNNILhku0GVMwXOYOgCro792so/7meMbAQJlJRkW+Q53AT+5fv0ge5w+ee8B8WqFb1Ns+ykT///g//RA96L0PjceY63xZFKaFYLhEmzEFw2X2ACgXNEwcHJAfVwcyyajId2YY6KNDJlzv3eiqaDoArEj0f+Ujz/Qf96N7EQDTCm1GFAyX+QOgesCkz5fFufcOzQTLqsj1ATYHm8Mt8HYuN3eEgL3fBmwlAFa1fvMn+Q1X9ccgAEYU2owoGC4BAMAhEyzyeLJyeXaNBv0Pvl79vnntDhux62DOtfmvWs2qLU/9yC9XWWweXWcIQI4xj/T1szm5YLhEmzEFwyUCYHzBsGnjksb//bvd36ck6DcRXAZAFfnrnyT+/5uX2k7gR+TPW90xCIDphDYjCoZLBMD4gmHTxuW8Ct3cwKxN9UkzXVsCQBv/X3lf9fls1Y8CWnepIACmFdqMKBguEQDjC4ZNC5cnM6mNntQJ6hAuAqCN/0cfI5+vGADQfv5b7TEIgOmENiMKhksEwPiCYdPC5bxru+m1aJkgAKCL/6QCQHuDewAQkNAqAAJgWqHNiILhEgEwnpbLJf2Zuc1Gwy67uM19+KOX69kAPAC62iWnhgAAIABJREFU+H/0qerTt9cfdFnc/9Ab3TEIgOmENiMKhksEwGhabhsAFoVpZoYIgPY30gL07npEkJQFAmBaoc2IguESATCSuvCft81ewy77Dl+VOAD0FQDSAvTU++uPEACZCW1GFAyXVjY/+xtNRX/zgeeMi/EYsvE7zDGTfIucif8522Q06JJEa8M0LRYAffxvugCaDxEAeQltRhQMlxY2j8k47X06C3doOU5DNn6HOWaSa5Gz4T9jm5wGXZIBP4bF+aRZvXXY/62fKIoffKnFwtAxw5fblhRmHkKbEQXD5bDNdVFcerZ5GRcCwJC3fm2FOv53e0xkk3NostvuMZAeAsBeMFyizZiC4XLY5px29B1TAiAA9FkXupjaPP73e0xjk3NosNvvP5AgDwAyJKgVbcUZBoBMAATAtEKbEQXDZSnccdL2s2t1R9+a3IwIAHPWKgNt80+/x1QA6P812BX2N8gKAPwIIBkAPAGwDyCZ3vo6uRCXX3rTtNP0Nq0EwyYMlxYAaGL+orrbEQADOUsOpLGf1c9JbHIOtXYVB2jFdwLrAbDiANB3Ah8dFQiA0YQAGFswXA7a3Nxuh/rNi6sIgIGcRQd97+/2AUA9DLSL4QwAjlh9uBkGSpeCEAiAAEgmBMDYguHStg+gpHfnjyMAzDnzDlRjP7cIAN0SPqwkAKwEADQTwTgAnBy89wF3sPt55a3pXSIAxhYMl8M2q7p9E/XPDm165TTZ+B3mmEmyXGx7TNmdltzgz9EAoLGaAACk1UcK1woAcPH/6NPP0KUgagCUNQFalCAAkgkBMLZguLSweXrYvePj3o4CYHjQjNSryod/bo+kV4bWavROYBqupTYgEQBiBaCfCtwDoOtNQAAkEwJgbMFw6Whz89s7ORN4OF4KcVcK/6MNA9Va5RwOE83G5VoxUFMGwJGgZjW4GgCUACSdq9zB9oJxm8FwiTZjCobLsWyCBoBdi4kx/LN7pCxyg1Uu4g+FfzuX0gth6nnjDACkCkDzQph3tAAo6zdE9ktIIwCmE9qMKBguEQAO6Vqmrwz/iuRSyNGqRUom0SC/178SsnztUBgGKsf/uhegfyXk6jOztgKAAJhYaDOiYLhEADika5X+UPjfJgA0UX7vBhnDs3ntfj0X4Er3ekdVBaBpBGpeCv/kEUXGlT45BMB0QpsRBcMlAsCcINdob5G+uvVHTNUxfweNDAAyLkBQ+474BgCK+F8R4Bn+mPatAgiAaYU2IwqGSwSAMb2mq9S27d4m/DvYtOiq1SQeoSRskzi9owr/ZgAc/eb/yB70/Io5BgEwndBmRMFwiQAYTI8CwCYS24V/JwA47d4c4w4NQ+Y22jy6c0CyPPfODzEdwjUA1PGfdAX/n//2X5ODDt77sJ8OjACYVmgzomC4RAAMJ9cSwLy3bfi3t2ndnOM4vsct9wCpewB6tVnI60KPanMEwXCJNmMKhksEwHByfVuFYWfr8B8fANEe+pW5B2i1KqwAEEIAGLcZDJdoM6ZguEQADCfXBldD8g7hPwUAXFK1VXh6KwRAKxgu0WZMwXCJABhOrhiMxE7xPzYA4g38USbrL/LWdzsABBAAxm0GwyXajCkYLhEAg+kVQwBwC//RO4G3AQAlAiAHoc2IguESAWBMj29eV6fvGv9jDwPNFQArNwB4EgDGbQbDJdqMKRguEQDmBJuJYOx0AF7O4X/ApvuInnwBUNoDwLsKAOM2g+ESbcYUDJcIALuEdY/iHvHfaHPSuV+KVP21cgWAHwFg3GYwXKLNmILhEgFgl7A6LPuE/yEADO2hOibHYaAkoDsAwJcAMG4zGC7RZkzBcLl1AEgQCrVNQH7x31TkpuYc/ZmlOOfQC2NlBQBWtM+AV3qbIwmGS7QZUzBcbhsAkjwNq8OyZ/j3BUCa53xey0YaCy6iz/MIgEYwXKLNmILhcvsA0PwSOV3uJ5H9yg/a5Cxz4jal+rqWnMJzWtkBgPtTXDkCATC20GZEwXC5ZQBIMyJGkaoU/h2ezr0AkGisDxUX+dsTCQVAWSIAOsFwiTZjCoZLBIBdwnyipjf+2qZml5N0UOzvi33or9PXdHi4yQcAIgEQAGMLbUYUDJcIANuEmfCuaP1xaaDxGgaa5MzE6F8yJxKU0coLAAIBEADl5tH16mK4dPexauOT+xeLYu/yg+bPtdCBclV1TBqbI8vb5pN7s6rErryh2EQL+twNsaBPZj7lSLXthemYzSiZpAJAKYV/IUo75WvcSVePCD8zMWU5+HPZhBRhO6TTFQBHCABOp4dNMN9/KG88njUbL9dRCwEwpLbE9m6KW+pXm5JNt7jPz655lSPVlhTm2fUDVpde9szG7zDHTBJ1AnPq4z8TI+MBYOCosPi/FKX1FgqANhVnAKzYzVan5W9zPPm5JOGn0dPSfcfE+/OPhQ+obskJprHZ6JRWVkRS0WpK/7Hwp588ba61ZdPFf3HT3A+kIS7HlnDVSNs33Bv/FBeiZTaBNu0ySTQMlFHXU1qW7Fc8CgDCzqw6cij6l5MD4GhsABxfVFX8SbBoA8GGNBtcuivt4SQ/l1X42au8bT5eyC9KI3Ag7998ck8Ro0hA84lbIYW5Vj5Cr9tqylXVn57yxympST06lMLYoi5ouuk8czGsQ6xGCUL0+hQqLKd3ZuTDxmfo9TkEAFI6jm/pU2YTnoRFJoXTaBwPcfGf+Y5HAEDgmdXxfzDzKABYhQBgxWy2Oy9/tU9+5xVNv7e636iuKJvhbeXlkmRdu6gC0d6L/MZF53ohP5bNFaeUzGatyuz5h+Xpbd5o9en+g5J8TM9E+NNXfja7EiMk4LLvP6h+Y/zXNbApATCvLz4uAC8K9qLtrk/fLCxszoO+rSab4BRsMkmcS/fYLMf7WJ3AyUTbfywyj9EJ3C3q4A4AlgDpAbCgzcHHUkdfH3orRJBdHvn3BVJ5uVz0d/5cjEObPobyQYtIwQs7BRTmvA5IlS82Wi0aNlUfk83Cn77yssmU2FrgI4FX8/ecYUN1xNP/YVIA0OuTVAAZD5X5K2+Um1dntKDJlx92fVrY3Nz2bfhhsglNwCqTtLn0zSYqANg30EwDAMv5Xd2J+LtcQQFAdffQu33NP0Jv7s+K/tm7DqVn1/xCaiMfl0zEkkIWiVmtZwkA/j2X/oXZFiVflj0OaDkKf3rLy2blsHVGIrsmorEAqAB8azElACrLV2sjjN15U4YLWoSLpiBPZt6N8xY2/+HZX/BLnMkmNAGrTCzj72CgVu3CD5aXMnRooIkBAMvs+t3EysvgISEA6NNyBgBDgOQAWPcPpEwd9+RiUbyr/aS93ao7LaQK4OOSDezyUz63H3/z+zYAhRRmF/c7EvA6mQlNQ6MD4GTW103muiaoU6Ys6QjQSQHQFipbpt3v9S/d9endTLNdw0Ctdhp8VlfsIvSaBg3JiVDklhWObjfi3tGyt8tVGAB6AiQHAHP3MO0W62L/YYuE6ufV9tOQnjAfl8xDPlcbEDUX2oj79itn+RfmomVOX2KchEf+CWoAayaUL9QlRKt+Xec/baaaFACL/vqUTVAA9KXt3VO7gwAY3FXaRRo0EzQkJwoArBJqd6Px39FyAACYNDIHQHf3MI/Mpw/6OkFfN1iP3mrNNvvoAfCaNKZFBIKD/AtzzgBAlfucNzn3Hk5I5NujclX1O+Op0v6L/Z91E8uEAFA/oDSi4xRYAIxe63PLZpRMLEYBWYzXkXZRzvz1HyYTPgrIctBRu5lf5Mc6O3eLRKtQAHQESA0A9vFeuHs2fRNQ6A1G5QmA/raXeoGp6iEgl8XeAe+n6xAAXJB+401d0P/pKl8AdAhdawHQDblsdpkSAOboTjsGetzOEQDN2JWB51x3APgv+zmQvutR/Zm5ASD6WwuMYt/rkj0AdI/33aZF3ww7NgAWwwCox97z06oCKgDJACD0uho6Ya2UBACbf39wfVYwQ0XpL9kCoFmjIvz63DoANL8Y9ilddglY9nkoffejlqUHANrmf4/8PLQKB0BLgBwAQHpf75bl5w69O1apUgHg3LPXhaHq0iB3FyUCgNCAZerQsFKaGgDRo1lT6G0bVa4AODusP2quT3EGm4O2CwDDkdFiAA+zS4Lw71nk3ToO7AidQQAU9DDPDD0OEl7unj0ABpuA2ok2+5/IEQBEdJ5wv20RQqo0ABDmJftOU+6VDgBtA1q3c6YA2HQT7pq51ec/jgCwA4BcR5BbjbpdUoR/ryIX13Cw7QSukeFd43DXKgYAGgJM1AlMxAwMPb1D1wkImw+fqA+gFjsVOCy6JukEjh7/E3UC16IjRPs+igkA0M7tvaUHQPX83/XzdNcnAsAWAEK8l4Nps0ea8O9e5NzaPe0fw0N6mD0Tuiw4Sa919APA0TgAWGhHWfAzA+pdxp4HYDcKqORbfUK6gEMKUz8MtApWxU3tn17ysmkxDLTbbcFfxH5ffTAA+mtOuD5PFbNClH3vNto5AIgtPi0PpM9SxX+3Im+Dv9guNdCyz3LCt83JaicRAMIH3gBYjTIRrI5acrhnOoG7TsGxV69hFihgqvwqMdWDoBaggMLUTgQjweqW9k8/edm0mgiWAwB6aeYBkAki4nKqmukXFtouANi2jXAHyW1AZYKxP2yO1rsyj/78mZlW9GSgoTy1iC4HX+roCYCjUQCgWQqiZADQTlkNGwXq5ZKd4WuaCcwCILB9xb8w1UtBSMbN52ErL5tMcYpzp6XWoUwAoJoJXK+o17lvr0v/qdVbBwDXiFe0kZU5xhBcI8jaHedCOjO2T0D6qFn3Rz61uC75EC7G/yAArCZcDK4HQPXL/kPa0Tr6uBXjWkCa9qHAABtQmOrF4ISai7kiYy0vm4bF4Ji/xba2/NYC4gd8NlOqA1bX2zIASEN6rA5if7ZRNJ1jo7/OvwQh1Zkt1RIyGg8A9hF+aPMoAOCXg55zMVVYDnqacSvMaqB8Ey/b1s/8vvZ/YwdRQGGql4NeSOE0fGFhX5tdX7m0WB7zgbiO0qQAILlLq4EuxCkV5AFlPsXkP7dsRsnEL9Cxj8nWXawBGuygKNoxn3bpyZG/T4z5EdEls5Pw1B4RAKv0ACg37AthlACgoyxCX2Hl3Wrd9JfK6zsTdDVuSfhqjS8CZoH52mx0XF+4e90bDG5xrzQjQUz4c2Sb7St01C+EIWss16/gvCVsmRAAG/Z9APVTPluGxFnzgCK/5XJEm1bZjJKJJwDaxhW+w3UiAJB/I7VAjdwHIMX/EABQAsSyObn8XJLb/4rmjWBkEjAJZxvyotuODqbRoslsNuJeCVkDoK0+NeFK+HNsm9IrIbuqE/tKyCvcMdMCgHsjWA0AtgypM/qActn/AQUBIET/wJYTqxzNm6J1QLSnNg4A5AoAAqCV/zNro/aRtW+iuMcE0/bxL3SOLYzC9LYpvhS+bzvrX3wrhPupAZBe2wgAXZu4/ihuv2kB0DRBRcwp4TwAJoQr4n8QAI74OWVBNieXp0vaJEG03z7hzbnmHj6eIQCG9IS8P3eve1xmO1JeIwsBnSPtQJwQALGyGSWTOhdNz+iQxGQmAUDjJBoAvFuAXAGgiv8IgFa+LjePSLvKwc2uX5LtpHxy/yJpdLnbd1qGjrKEUZhAbMJwuY0AED8sBiI/feRWJDM+ADoQBWTNRXy78K/cyw0AyvgfBgA7AsC4zWC4RJsxBcPl1gNAegi2eCqeqBO4J1Fo/Hd76Fcf4goAjwiPAMhMaDOiYLjcAQAIWyyie0jLiYXUCddP/8FZe8BLfYgTANQVgEAAFDYEgHGbwXCJNmMKhsttB4DUnGPVviPF4Kg8UKXENP5Y5aTbzaP5SnOICwA08R8B0AqGS7QZUzBcIgDsEo5ZJVCk4zrwU2toEgDo4n8oAGwIAOM2g+ESbcYUDJcIAPuEkwHAfdy/1tAUANDG/2AAlAiAUYU2IwqGy+0HgDAXygcAkYcFCckMz1RwMCRssam3RACAd4QfBsAQAWDcZjBcos2YguFy2wGgGgWk23Uw3RQA8Aj/RkPc6dk1XQV2AusrAOEAGK4CwLjNYLhEmzEFw2UXI9IOfMkKAB7jJPXpe4hJxiv8DwCAOT072IUNAzXE/ygAGCAAjNsMhku0GVMwXG47AKQmIOtxNop0YwPAM/ybDTGnZ+tbWSKWADDF/wgAGCQAjNsMhku0GVMwXG57E1Cc2J2kE9g7/FsbCjp5awCERHgEQFZCmxEFwyUCwC7hBMNA/cO/W+N+UgAYKwAxADBEABi3GQyXaDOmYLhEAKgTGnsimHsaFob4k3c8B6t9zfE/CgAGCADjNoPhEm3GFAyX2w4Ar9abxB0i410Z7Mm7npTNngPxHwHQCoZLtBlTMFzuAADcg3ncJn9N8mOIPXnXk7LYk7yzJT0AzASAcZvBcIk2YwqGy60HwPSDfrTpjyBxRKhD5lYACI3wVgAwEgDGbQbDJdqMKRgutx8A/slsAQDkTCMCYDUiALQEgHGbwXCJNmMKhksEgD4ZBIBRJCqPAwBTFQDGbQbDJdqMKRguEQD6ZBAAJtGgPBIADASAcZvBcIk2YwqGSwSANp0t6ASWc43XCUxD8lgA0BMAxm0GwyXajCkYLhEAynS2ZBgon2vUYaCrcQGgJQCM2wyGS7QZUzBcIgDUCeU+EcyUusZq1IlgTTweFQBKAsC4zWC4RJsxBcMlAsAu4QRLQaRRNKtDAGh2GgsAujoAjNsMhku0GVMwXCIA7BMGAoBIWRiTWE0AADUBYNxmMFyizZiC4RIB4JBu5FFGKRTPqimFLhSPCgBlMxCM2wyGS7QZUzBcIgAc0kUA1Orj8LgAUBEAxm0GwyXajCkYLhEADukiAGr1UXhkACgIAOM2g+ESbcYUDJcIAIvhMRkCQOd5DACspgMAJQCHABi3GQyXaDOmYLhEANiMm8muE1jvOX0nMBuBRweARAAYtxkMl2gzpmC4RADYhMzshoHqPUcfBloIokvA9UoKAKVWnQNdGeQnGC7RZkzBcIkAsGo0yWwimMlzLKttfDXH/wkAQAmwQgAkENqMKBguEQCRG/gdcgxPIX13shijhXeAJQaAZgMlwBECILrQZkTBcIkAQACY8hCCsPgOyGkA0CAAARBbaDOiYLgctHl2/YDVpZc9s/E7zDETBEA8qQAgvQN4KgAcdX3BMG4zGC7RZkzBcDloc3OHa399eusAEHmIj3WGEZJI6lkBAPkd8JMBoEMAjNsMhku0GVMwXFrYXBQXImQTnoRFJoVPH2i0cTP2GQZ31Y7gWQLASo7/UwLgqO0MTlgG0QTDJdqMKRgubWzOi1vh2QSnYJNJ4RUZxw3/3jaFNFJ7FgCgCv8TA6AoEQBxhTYjCoZLcZyfapfNbd+GHyab0ASsMinGb8/xEAybHABW6vg/NQBKBEBUoc2IguHSBgDlPzz7C8HZhCZglUl3AlkXPgybHQBWK134nx4AeRdhLxgu0WZMwXC5ZcNAIURWIDaLFSPdnKxpRW1mXIS9YLhEmzEFwyUCYHzBsFnkHfyJqM2Mi7AXDJdoM6ZguLS2ufns//M4JJuAY+0zKSBEViA2LbwVwi/C30X7X/e74iNxD/ZoQ44uNjMQDJdoM6ZguLS2eXYtqCcYO4F7wbCJAIgoGC7RZkzBcLl9AOhbB3IVDJsIgIiC4RJtxhQMl1sGABQKhUI5yC64IgBQuyJdz3fOHeIolKfsgisMAIyRi50MrfwZ2LTog8jApUHdCaSwKb15vvtcs2FQeRdmJ7QZUTBcbtkooDFysZJpnM/0Nm1GIU3v0qD+BBLY1Md5BEAWgmEThsstmwcwRi5WQgAklRkAm9tyPXfvRevE9S09AgAePWf7TJR1YfZCmxEFwyUCII0QAEmVEgCGuW9c3eD0TnEeATCFYNiE4RIBkEYIgKRKCwDtGkRcFWBeIACmEQybMFwiABIJO4GTytgJTADg/w4LBEDugmEThksEQCIZxlhlYNNiBFgGLg3qTiA6AFYIgNwFwyYMlwiAVNIH2BxsDg8AzsGlQe0JJACAfhlqrhsYATCVYNiE4RIBML5g2IThEgEQU2gzomC4hAKA0w8cXLoxdLthkUcUDJdOADiZFUU7nfHsWv37mv44vVNt2rv8sBkDRKP9Kx/5qaqS8dQP/1wX/z9V/f2Z1fVqz3e+wHcub+4fkN8vfVBziQIuzAwFwyYMl7kDoJmAvKhvtoF3E2ORRxQMl241gOqhvd1AfiWXEwXA8awJ51ceV4/4NQB+9Zk2xj/1Mz0Azn+G7rrHA+DVWffnz1q7zFBoM6JguIQBgHWxd/P11z8+NJYPizyiYLh0AwB57K+voXWLAgKAT/SjRc9/pgbAK+9jx5C+owPAuTrUnz9mAbBg971q6zJDoc2IguESBACqG5o++y8GWnaxyCMKhkvHPgAS90nDPU+C6vebj8tNXQ+oAfBh8uT/0y8dHf2XXyIfvrtrAiqKm2X56G7J9AGQlqW9u9WvNAXlQwrgwsxQMGzCcAkCAO1CdCczeUE6frpPkMexBMNm7i6XyyX54dgJ3LT8zLtHdQqApx/S308rLBTPEwCQUP8DH62f+z/9TFG87aMdAK4xSdUAWPRRn7BAVQXIvTAboc2IguESFABUK5IiABIpc5fLAQAIYiP00y+Tf5sRPGtmI916oUqSNAC97aNs3+872l9IG1GtDgDMcCCSs2po0HiF+R1SMH/ouWWa79zZcuaXZiMYLkEAoJzXt+jJzDzuDos8orJ22YZ/ZwDQ9vofv9Z/0HUGUP06wUNRkIf+d3SDfwgOfvClBgBXVyoADC00MV5h/iMpmj/z3DLNd+5sOetLsxMMl/kDoCjOvfOFGblHN3PsAxhPObvs478zANptbUPNum4TarQiexZFFemfen8//P9jzZ8EALdkANBKxOUHJsMIAIMQAFMqcwCUn33hOm2lJQ1BxcA7abDIIypfl0z495gIVvf6dlfSumCvqtWsCvFF8TG2BajuBXh3DYC9F2UAtEzRzgIYszC//+Xl8vN/7bllmu/c2XK+lyYrGC6zBwDR5rMv/DsCgMsDM8GwyCMqW5dc/PeYCUw6gPuHfgEAVYXzalF8uGnzsQNAeXrYVTQ0kxVHKMx/fpP+YGPm91y3jPyd+1gmyvbS5ATDJQgAWGeCRR5Pmbrkw78PALhuX/JX37G0sgBA91owtu/3fjcTrLiiynOEwvzW8ivfrH78yx8tl1/4dvXLd7+2/F3XLSN/5z6Wy/FtegqGSwTA+IJhM0+XYvx3BwDpVWKCvgyAW+4AqHT6QssAVc7pC5PEyuXnv/q9t76+XH7pzX/6Bimo+uHZYcu437mPZao8L01RMFwiAMYXDJs5upTCvwcA5lIncN8EtFL3AZDO3yEAkGwf3eH6mwdcxhXtL630ld9bLr/4x80ff+i4Zdzv3McyVY6XpiwYLhEA4wuGzQxdKuK/MwBIA9C7bvdRf81G7NXgKCATAEjO9wrlTLD0hfmtpUJfetNty7jfuY9lqgwvTYVguEQAjC8YNrNzqQr/zgDY0NjPDP5fsxF79eskqJvmASgAQNqUuhS4P8wu4+qt737jy0LE/OJfvum4Zdzv3McyVXaXplIwXCIAxhcMm7m5VMd/VwAs+qUgbkmTBbq3wZOQ31cB2JnApLbQEEA1E3g6ABC99Xd/8bU6XP7+n/7V33tsGf8797Gc3aWpFgyXCADLlCOuM5G2yGNZ1SYStSxspQn/rgBo14A4mUnRnwDgWvNLvRbQr/RdwDUNNABgKxELbl6Z0WUSfaeOmYqFFWy2TBKz3C3DCK0wXCIA7BIuIoa9pEUezaouibhlYSlt/HcEQLdqw4J5qifB/ufIC2BmdWevYjXQdxzJACBJ3Cw3zUQwOhP4yb1i2rWA/rZtMZGCptWWKWKWh2UYoRWGSwSAzSNtvZndKSQGxihybf6y1cFDdDmoj9dnYJuuc8npw7/1UhB1XO7b/klTTdux+9S/7vcikd70PgAGAPWUYvK8z9UnlLPVR7rL6OiZP6BdqH/ms2WCmOVjGUZoheESAWDxSNtu6/cJegyO8niuyV+2OniINgv18doMbJN1LjlT/HcCQPsaSCISvt/eAOB//aV2J/ruL/pGsFc+onwjGK0/1ARociGNPyfdVOBi/6Gty/giE2eXX/h2PYr+rz22jB+zfCwDCa0wXCIALB5pVQBwzm/ZxbFo7TOOAHDLWwZA/W8wAByPNoZ/NwD0bwGo9iGfvbsGwPuP/iN5/e/s+XryV/dO4B8i0f+/4d4JzACg3Nwj7395F/390XtILeCcbkm4Ue4yGitJewltO6czaB23jB6zfCxDCa0wXCIALCKatItjFFx2Cmw+0Roa3iJsGH4KFzaLCQfWfiwOry0OxH//wmzCPDPkf7U6YgGgUJNZtxyQQ2aeLl1EW0vIaHkygZYdN2+9ZfSY5WMZSmiF4RIBkBgATPBv2z4yAIBFQ8zUAKD+hsI/AqBXHSlpczltPvni3zhvGTtm+VguoYRWGC4RAKqQ1AbH/ie/h2UY62J/v+8gALi4rAvShvx1TSwiAAbtawFgV4vRWDc6L/jvYLD5x8qI/kABAG38hwoA2lryu91vX33Tfcv4McvHMpDQCsMlAkARksTmY+mBeRAA/XO/+OISmprJDZOT9jl9KIwqjuEOsQGYHgCDlQdbG6Yjmvg/+J1OAwBXAox0l33/T5q28rf+/Js+WyaIWT6WYYRWGC4RAIqn4b6ZpP1LDGaGx+ClHPzZfQcBwOysz8WQv7nWwB/oAID+SIvwbzBou6Ft/skRAO5VAAwGMQXDJgyXCAD5YdWiuVv5gKsJ/VJiBpu2z+l2j+HaQ/wA4JCl9YO+9oi2+R8BMKLQZkTBcAkeAEJjjXcS3N/STylx8QNT7JcTM1hhfprCtNAiZXPqzF4+ALDMZTADTfjvm73qT5pe8/EAsEIAoM01vqVFAAAgAElEQVSYguESAaBKUvxpTJ4b5zOUat2eZJe1TZhm/TnsZWhCEq14yda67K0+ghs1ZZWTh0URAH2YRwBkLRg2YbgEDwAuk3QA0CTvMMK/D3LxAeC8lwUzxgVAVzOi/zDxPzUAOiEA0GZUwXCJAFA0SrSxkv8pps+2+di1qehBImUt/zFwyFBLkbDXcGwNuzCaYG5XKWsjfwOBZT36pxilCcgLAM4EwGAQUzBswnCJAFA8DReSxPQNgzzDbAoNNXZtO9pkpaYVhzIKBYBDu1xPC7I3P/oHATCi0GZEwXCJAFA9Z/dRk2uz6ZonFIM87Z5Xh21yIdMqfhoB0P1rDQCRGJ4y1nck4PYf8vPmxgNAH/8RALkLhk0YLhEAFpGm20U71MfhcTd6ketPgN1iH1BdWObriy8rZs+ubHcZAK/duVgYVpbrtXl0na5B95xyCVKiuWZ9arUwZkUUDJc7CADl4+dww4x5mKddc72LzaE0+pPQ5s3FcrPDJaeyB4BxbKveUykWrNFw+wGbk2WJbh8ATofWlm5F30Bv3pMseo0AmEYwXO4eAAyPnyoJkXEg0bFqAFxu2qw5V5q9lirVeyu2W3sqhYJlN8olzgBWm5w214Ed9AfmCYA1+3aZvZv6HRlQFO2LzgSRFyAgACYSDJe7CAB+Vw0A5KhoCkbcs3YUmzZJ9NbV3rqA2/5QRnsu8LJJMinZQZBNQAKAyraUuuDeoqSmAYArAexdrgteihcM1zq7xu+oIED9XoSkAHhyn7ZW3XhDt8OcM3m1+3xzv269umys5MSyOYVguNw5AKgeP6VjhXg33Epk22Jtv5NSjoOOeACoH/aX4iHdoYq0TRAwFqwCBmVZmIzYKhIAmPg/KQDqsL7/gLTvH5rCdx3c90jkfXKfVhrkdxEvitQAWChCu8KmtJdF61VMm5MIhksEgNTWIMejKQGgjNj2AOjPzS7ImgGgNaT0xGSuAkBw7Beycz4wRwAsmDBZR0lNZKU7nm9i59mhqrLQvKo4IQDYx/sLyj241yV3J3M23HoV0+Y0guESAcC3NTQRiY9/FvFWUY3wtql+UjcFXW1G9akV9ega81IV4omY9lX5MRYsv5H8Gxr4eb9eB2YIAFoB6EPpXBu/6Y79Mz+Ns0IIbh++0wFgwYZxNamEFq2rnLNWDg59bE4kGC4RAIzaYCbWCawAwB/iaHMw1Kt2tQBA87OD2rDD7kQsKzPS8ChNbwT7szkmyjURBwBs/LcCgCMBbF0u+AdiGuaVgVXYUYUKsstBSgBQ6uzfrQL68Uz3IL9Q5U+pQFuvmnYude0hks2pBMPl1gFgMMjpntWZKCbtYvF8bx3+VU0gAzFfzsHymHr/lmqD58Bl49CaxQ7h0RzG5d7zyCILKwdeB+YHAPpozEbDeaFq21fsuJYiMPnk/HFKADDmJD/MPpJ/unP36T33RqDA6+b4YlGcE4ZXnd6ZkQ8Zq2td45utEABcNqNkIr+7S7WTYg/lM6y+myDYJpOnKeZrfXNP3hZy7KWw3ZFLtA3rRvedoVhFulUAoE/8bFO+bhw/efg2R02S1N6LKecB1DkwfygyIrFe4gK/L8WBdqxTuE1JTccFZ6ttzOphVZnMAACUVTd4gtasoh+ybWmq54SxbNpkM0ombcOF27O6GIMHugli2PQ+iu2kZZMZCP9jAKBpaVLvKRly6TQJtak5MD8ASHGdtrIoouN68I6f0wNTAmDNRdGF0ijxL8VR/kD6p1usDbpqFmRyxebjXJ6VhStvlJtXZ50v0k09OQDa+M590y2r9l9GAEiZFM5hTvUE7pyIo7zSDTU1AgBKTdeuqqoTrYyjAICL/xMCQIrXuk6A+VDDeRNkUwKAD/nqML5WYuHJ/UNmVyUkjAq5aNon+wVbLvOmMBctfil4JwcAZVV5PCv40qpYRT7kWwCdh1K1ggKAR+850K940mbStSvYPbxr2l8UiUSVVVeF6iDmp/54zRYvAAy5VDSW6WohQlIIAJUW4pMcfcSTA1H38eY+6eaVZ1O1rSwpAcAvM0RyVM5EGMx+XACsG0OV345M3e/NL2T87f7h5ABoba1VrFoLgwXcGtEYZQ+A0zuEg3XFZ+ArKRiJn4n7aoK/8ZhIsuqqUBzE/NQfr93i2uZi2aHCJ0r2VjZByV8L/9NbUwHAjQCWLuUHe/WjftNuzkyn4hHQtasnBADJg4n4wp+9/fOPN2S28N6lu5qE1I1HsWzKuV1orcnRpAmkJ7O9n63OZ2oAtIG/stKVT/c7+2FHBR/lDoB6auR7r+0/eL2q9pgvlC7ESJFG3eer63odAwAKV0MHMT/1x2u3uJ6UlUt1XLfADwJAJVsA1J3F3HQqrglg0R6VEADiI79q3VGyz4VX27lg+8pWCk33cSybouY9AORyPakjzMlzD8sMAGC0ygIgoAEofwBUJ/948/P1GS4GQKeoAYiBRmqMbg+Tk0nYBOQT/tgT0x9vaClyrnLYuOQTVRzBfyEWqHBUDACsMgGAYjClehwo7Sz+3/nFgJgYQDbXMTUxAIQRq1JOwjzgPdXzG4GVY6gNuGr6uL5Qtlh1p5AFAAxWq1pK+4WHWc0cAGfXyHmezGgJnF2TL+ZCo25z91PRFcmlwHzA/4yt8QAgnVpil4o+Af4rGW6ac7fpfaCmAgAFAGQVtksPqm1P7tE4y8autlElIQCIBwEA0nOouLKd4kHVcaaCs01BRgCcMN2t0wOgd7BWNq51n62dC5BV9gAgJ3d2LQgAfOgX4470LLpNALDKRRmJ/QBQJ8U/6DOfiVUD24RNWXofmCcA+LAjdQtTNU/W3WLR9crQV5ljutAxKQBoz93+3cf01TWF6lRI/HfuwEwEgLND5qMsANAUjAIAi77Uqv38ewCyB8DmNr2qnvw2KYGmIqDPRIpZihGI4qOn6qlV/CSuvADAHWIJAMts1A/jAQDg+Sv+H1dbBwDbGgAXONmF/9k5AhMDoPzsnR/tptyqYv0xC64kNgUZAFBtYk4gbwAsmFJjGoN8lDkA2O9p8DthnpCFFh/p+d4Y7mO1T2tteuRg+2iv2j4IANVOAS7FCkD9hRRJelUiAGDlBQAnAiQBgLgURB0vuAm6UwOA00I6u4VX/E8DgOr5n/WfBQB0TUBVuV3p/ph7zwGjyh0AVTE0V3B1Ze+br+Xm6VMI/QMP/EoAqB6Jo6kYaxioHQA0e/m4NNQAUhVpFACIYX4iAFiPAjqRFl/rZ4zN2Zg6cSewfAS7y2buF/+DYlbXsyoMrTm9xhfodACo6V6Z0XUCk9G/vbfQNStyB0C5uX+pBcDlAdLxAGA/ZPfhfyrjnxSrogavvl3c8SDmp/54ZksoAJxdtlFeBwD7RByydPDHH6ipAAAAgLAYNLsjv0jEeMNASe1lKCe+ksB3XLgo5FbUzAOoou7T4lSKqQGwUA8DJU1VN9ndg1qA8geASyYWrRZyuLNo6Ij7/OqXjmV7DGfV6hgDAPw8ym1ALQfs0nAq6xgAkML8VACwnQmsAUD1ibCa0NQTwXhxAKhrMV4TWENuRNVMYGpGaF2Yvgmoa/nh5nwJXRXqMaIu2joADIQPVYwajDhxOwV8AWAVGDmrVsckBoDULGSVxm4CQL0WkBwk+QWVqRp28O9o6WUXJJwK02YpCOmILnbR7l/3t0FShdyIyrWAqg9F7xkAQLkUBGkS50otZBYw0ZYBYLgBQQ4wlodEKyvPZKyCqHVLkXSMuJ+XS03hejzRu/HCQxEAYE8AS5fWq4HKfcNNE9CIALBZDI4T20q0sDclK+g+rHKWVgNdyNWkDACgXAxOtBrsc9sAYLGTU0Bi050WAE5pu+ShLhFPADgXrpSCW/bBAJC6AGwB4FIFsHRp/T4A8YVg3QCiEQHAr+o8V5BKqBUQmjV/UptXHDLztylqw74PoCq2ytEZM6e6e219BgDgl4Oei1bpGYSsAxfJpl02o2RilYt7hNpyAKhLJKChyudAMdsRASCHeT0AWK1W7F8xXFq/EUxarrhFx4gA4Mab9qtPCKfDYKofn0TtC+/kclDgDcS8EawGALtiRU4AKDfsC2HmotUGAGF9wDsIAP90txUAxpRG1k4DgMZvJo5ql6WnpGADrlQlqJVyOWga0JuuU7oundwWTVy17fx06dKuA9Z9+q+3zakEwyUCwD7haTuBnRKPkMVU1+/IncByC5ARANyfzKGRAEBDI9+uoo7fi4LbkZJC0RmYFAD1OJ6bj/Uvha/3YN7+frUzH/J4DSO0wnCJALBL2OIpzyG1OOloEo9kdToAOJ1AOACGwvyYAKhfWHuledP6vFCH9bJdJb3ZUTExrFFSAAjtTW1IZ5uGhBapuiHqjF/GlD02ic2JBMPlDgLAJz5GDP+pi5yzGuA7skt7J26etwwAdXDcJy9PqZ+ZdeG7Xmjz3E26GmihI0VaALTvV+ez5/oG7jF7tB0R4hqhCIAptXMAiPs076Px8g4517guk5V6IAAULUCTAkCKjn1TubBwjtjdq+zmTQwAMppSCuEcAMrjvteyra/MC0kIgMm0gwCw3jWRxgSAf36xARA/TSZhrwM18X9aANQzpFqxc/7FldOOubetqIf5JAYAeb87eS3BOdLM34oHAFkImhg96HdBAOSkXQNA5BE9Phot66BzjeoyXamHAmA4zBu29IfHA0B50r/pkZspKy2dedrvuHdDPcwzOQAmEQybMFwiAMYXAiBByh4HZgqAsnztDn2svvyA+1SxdvLpCwcFfd+6bpQ/AmA6wXCJABhfCIAEKXscqGkBmh4AkwltRhQMlwiA8YUASJCyx4GaCgACIHfBsAnD5fYDQBx8sludwIV4+g7HOuc0mFpmncDqCgACIHfBsAnD5dYDQIqBIUExjrYQAIMZJSv1MABYhXnDli4FBMCIgmEThkvwAOCHk6m29/8yR6SyY6OtBMDQIalKPQAAmgoAAiB3wbAJw+W2AyCDJn9J29cHMGEpBwHAMswjAPISDJswXIIHAJcJAkCZEQJAdaCuAoAAyF0wbMJwiQAYXwiAiAoBgG2YN2xpE0EAjCgYNmG4RACMLwRARHlnqa0AIAByFwybMFxuOwAyGPUpacxOYP/8IncCp1IAAOzDvAkAKwTA2IJhE4bLHQDA1KM+JW3lKKCpStk3T30FwAkARwiA8QXDJgyXWw+A6Ud9ShrRTsDJux03WSl75lrFf5cwjwDISTBswnC5/QDITzBswnDpDwCnMI8AyEkwbMJwiQAYXzBswnDpaXMVEQArBMDIgmEThksEwPiCYROGSz+bVdQuIwHgCAEwumDYhOESATC+YNiE4dIXACUCQCG0GVEwXCIAxhcMmzBcetlcxQXACgEwrmDYhOESATC+YNiE4dITAGU8ABwhAMYWDJswXCIAxhcMmzBc+thcxQbACgEwqmDYhOESATC+YNiE4dLDZh3/4wHgCAEwsmDYhOESATC+YNiE4dLdZhP/owJghQAYUzBswnCJABhfMGzCcOkDgPbAWAA4orMK4rqcRmgzomC4RACMLxg2Ybh0trlCAOiFNiMKhksEwPiCYROGS1ebXfyPCQBKgJgupxLajCgYLhEA4wuGTRguO5vsi0FXtQpZ3KfxAHDU5bfqxL2mFFhhZi4YNmG4zB0AZ9cPWF162ZgJFnk8wXBZtgFWCv8qBvCfRATA0UohBEAiwbAJw2XuANjc4e7gpyUA8Hd4oMtxBMMmDJcdANhIzMRkLmZz7wCIC4CWOxwQ6g29y+yFNiMKhsvcAVCWi+KCMWEEQBrBcCkAYMXFeD4m8/E/OgDET5q8EQDxBcMmDJf5A6CcF7dsM8EijycYLnkASK/5YhEgbEwNgK5joHeZvdBmRMFwCQAAm9tyw48mEyzyeILhkgXASor/R3zjfJIwb9qyaocHgSrM7AXDJgyXAABQ/sOzv2CZCRZ5PMFwyQBA/ZbfvlM4WZg3bKEZl8AKM3vBsAnDJQQA2GeSLJeoHQzGlLLpyhjDRYSTbQGgfPw3xexRAFAjAINBXMGwCcMlAsAu4Zh9zKZ08unNHsFDjJOtj9aF/+kBUDA9AdkLbUYUDJcIAPuExwFAzJxCNAoAwjMiR+vDfwYAKEoEQGTBsAnDJQLAId1I6RuSiZxTiNJbiHKyTRO/T2SOGOaNAKgIlcH3aSO0GVEwXCIAHNJFACTJIRgA4myQvBR8iuMJbUYUDJcIAId0EQBJcggDQBNg81XwKY4ntBlRMFwiABzSRQAkySECAKRPh4+T9iyafwrmN+aT5o+i3zKY9pDL7IQ2IwqGSwSAfcLYCZwkixijgKRPh4+T9kQAoM2YguFyywCAQqFQKAeNEZoRACgUCpWh7ILr6QcOLt147B+bvY90ySSjSpehdDOwafHdZ+DSoO4EsraZl8vuZWhaZWFzWDBswnA5aPPsGl2KbUEv5D3bdTnlbHwPdMokoyI3tG9nYNOi9T0DlwZ1J5C1zZxctssSmZSBTRvBsAnDpSUA1sXezddf/3ix96JvNp7HuWWST5GbRrhMb9Nm/M30Lg3qTyBnmzm5bFbEM+80vU0rwbAJw6UdADa36zX5B17OYsrG8zi3TPIpcgRAUuUUWvUacrlQveIuvh4997hejoJ/I6Ziz5wLkxEMmzBcih2n0nYKgKYdqDyZ+V6wCAB523RCAIyiLABweqc4TwBATCAARhQMl24AaH96ZBNk0jaTfIocAZBUCABrzYsKAM1qScyieQiA1ILh0rIPYF43/p/MznsOBNo1AGAncFrl1L2qV1Esl0u9yzEBUK9W1xMg1yvTRjBswnBpAYCiOPfOF2ak8X8zxz4AW+Vd0cZhoKNoSaR3OT4AjhAAowmGy2Gbn33hOrnTaEOQ//W6bQCQwufwB8yWhMb04gwNzwBJ5dJ67ol5x3braIXJ2rE6h2UX/nUuRwPAZxAA4wuGSzubm8++8O8IAC57zwTbMgBIT9AWj9TMvsl8GXO1d1jvP62NgR1JcK13i+nOzo7NOdThvz9atc+IACgRAGMLhsuxbG4dAIT8LBrVhX3HlotDtz3T2DDtuOzD63gAUP+rFhf9tfv2AFiTdpry9M6sKPYuPySfbO5frH6/9KDZdU13ZXdotblPauh7l+52n9DETqtP9975QsuqPQqAVz5SHV889cP/y0sIgOSC4RIBEJIR0ybg4GCSK8PJodOOaWzod1xyD9djXb+MncFzEMO/JQAWbbS+WpbHs+b3K2W7w9Mv9x/2NfFXZ12Mv1l2+57/HP14jwfArz7T/vnUf48ASC0YLhEAIRkhAJLZ0OzIR3+bhOLIAQBy+LcDwM8XnW6t+9+vtjs8/Yn+w3Yw3uZ2UYi7kn3P1Vg4f8wC4GMFJ8NZZi4YNmG43EEAOLWEmzOyBwAbuCbpq54aAI2TIABI0d8moTC1BWgNAFX4twJApf0HZfnkTkHjN/l9c69o91g3D/mPyw2tBzSj8ebkQ7JG45N7FBx9YqQ+8Ohus8tniINPV8//T/3cS6vVK//3MwiA9ILhcvcAYHgAcs7ICgBLRvY2o4g514kBID54ugNAFf1tEgpSZ9oOAGqLyl2JBADUQb1+qL9QP+LP26hOd3i6bvw/vVY0i3KRT/ebbuSTGQeLbtlGksRj4qCqADz1/robmLAAAZBYMFzuIgCsd3VIRJmqFPodbEaRW8+l6tjoTqxtcDtqor9dSgHqTVgUpdajHQDaZp110Q8OIlH9avthtxIj+ZTOy7nNDiNaF8y+/YTNDgAfLooffKkGwCvvqz+0s5mdYNiE4XLnAKB4fPOoEEjVCOGDpSb2W9uMIu7x1bXmE8GlqgHK2ka/oz76x7Fp8sB7KdrQrzgHg0c7ADQt+F14JyLTMLug3k/CnNcHdnigIjigcZ9NjAdAWwPAYaAjCIZLBIBfm5B0RPeBKfTb24wiRdhyOThW9iVX6tY26h2NJRnFptECY4Xx7Rj+7QDQNtqwYZ0DQP8yjnVdHVgX3Prsi+bPdt+C16eq/5/6kV9uCIAASC0YLrcOAEPxRQUA/m/1URZRazj0i1k7Se9Bt6WP/F7ZeRykSEHXA8GZ1pxBusIcUOOHb/nXl6OnSw4AXANPG+tZADBzxppdhIlk7YF1YoUo2u5Tafb8SwiAEQTD5bYBYPBxXgpF+i499iBzqsYWH60FN+k9aLfYnJohP4+DdLkP1LuUZ2BXnEmu3z5qtn+aLgELm5EB0Hw8Z9v6ZQDUU36bpv/qz9/8yfYknvrplxAAqQXD5fYBoPnFsBN/J7d/mo/RpsqGfvNJdrn6AkB3rHaLEMeUZrR/BGCKt8U8S3NNKswHijOwKVHpoBCxRdX92z/6t7+JVQE76McAABPrXQDw6x0Ajl75SDcTTI0yjFkRBcPllgHA4plXAwDD873mSZp76h9Mg9kj6IFcPti0RWdLfMAtuDqMYQHLQZdCFC0EiXupG4g6F8YS1Zy1n1iPHKd4s8KZWNb5UgDgljsAKv3m//wMdwI2NrMTDJswXCIAunDlBgChxcem5tH+Ox0AlpYqC28ACP/WCRV832/3oQoAPYTUJ6U5+1AxRlk/HBOav3mrtqkrFLkPoO38NQGALAj0mefpOSle740xy05vfZ1+9V9607TT5C7ttGsAkPYwAaB7ZOefDOUHP6d87Yu8kM9oEADcMcypDcV8MRZrXRqey3krYpxn92L/L2V/NiVqt91SihjPGWy/frGyZJ+8Qm4AYAb8DI4C6gGwkgBwtFq98ksFO1J0wGZ2mtwmAsA9m1Ey8QSArk5cSKIfK279NABgc7UFAH9MIzFecYdo/tAHeW0Lgt4KD4AhFJnPV51loCwAILaTLdvF/u2SV8gNAPzYftL2o58HoALATxTFO9oloX/rJxAAAUIAuGczSiZ+o4CEx3txXz5V9YNfKgAwR+rPTLubMvhLdp0BwKag2iZVRpqfA3WQoom3/NcxAgC6C6DLmTlHRe2pB4N17lEA0DX3tIGfhPy+CsDOBFYBoBkORAmAAAgSAsA9m1EyiTsMlA2G3DOgRaqmPVyjhvxoL+6neOivg5empSIAAMYzVReu/PAsng7nmT/R9AAoJAl1F45RLNHss48CgLbHl6wF1K/6s/+wP6xbIUgFADIRrK0CkIVB+3llAzaz0+Q2EQDu2YySiQUA5Ec37bOcCABd9DcmotgjNgCYeFT2HOjilrFuo//DBwDqwpXqIEIQ5f5gQKbPRuHHX+wZF4VkrmjKsC39+n9bPhldugKg2L9LXgAz66O3sBroVSaxFgCfqT7/maNXmolgP/LLDRRwLaAAbRcA+IefVNmkSpjLRHVfiqclnan21Pmgagr/xvAs7eEFAMuI02bCPbOqTo3ZoP7DEwBS4XbBXwj3gi0xXdsrMviSFc5byJN78O+C/yQA2LvYG2ybb3TvA+gAsFp9qt1arwGqOskBm9kJhk0YLrceAPKJKWKP+XYo+mhqztsiNvPmzPIGgNDQMmhX+UccANTlJh6hsKUBgNKD6jhvScTp82Ugyuw7GQB+8V6Tdffur7Y+wH/KA6BdAaL689PdVODiBxAAqQXD5Vg2JwQA/7dawpN9c4dz7RfLsohUVsZk2LDHemdqIZqGfX57pJYR3edGPDQPygI2B9FV/+sWWaMCoGRagtQrUfR88GM5L+dhoK+R1/9euss13mzuH5Do/07uncAtAFar1dErv0TeBFPz4Nf+La0FzH4d1wJKLhgutx0A5niytFTcCpJdQ5Hwx8DYSdlvKpemomCfprsA6tZ4NS0A6P8GxLIAcLkigl0KQ/6tsjzq1n4+4uYB0I8RAKkFw+WWAUB6MFPHE6dgWrre7RY2B7ZxzRJCLaTbojLLNGQkc2kI/x25OLeWD8tej9YRrt8uQ/IfW5aMKc5jW1dwKGQEQEzBsAnD5fYBgA9/ipaTpXiTK5Lhfo4IADlr/rFeVTcQEkgOAP0BbcZ92bKN5tYPy07+Y5xok6Gy1sKZca2exHOJAGAEwyYMl9sGAPbBzPBYP5gM+3MaAEh25UikB0C0B2O3A/ooyhWhW9m57u3m0pRhb7wQ/AuZQQdA9TkCILVguNw6AJSqwO92lo4dCb42tZuGWWUw5NiC4uVSv39fWfFLxF3xcpAarYZ/WmsiAPTxHwEwumC43GoA1J85P7xPCQC7WooRAJEqK84A4Nuq/BJxV7Qc2rafQmEfAZCVYNiE4XIbASB+6BwOxafokQBgX2ExGYrVVmWdCFdf6btIndLwV6QslA1tukcB9zynAcAKATChYLjcfgB4paPoSY6XviIZIYKGACCWrNJWNFYxzf7Rek0MipOFpsalAIDfaU0FgCMEwGSC4RIBoE6Iv8njPs8K6fAR1C6++AQixwOG9mWYxR7Qx0yxCNPgIEaibPjvfDIlzOTheRoTBAMjAAgB8rDpIxg2YbhEACjTEcJrslFANg3+Vg7jH2LaU1lhMWaQrEYQnuRSiv/EZ8EpNA8EQEzBsAnDJQJAmw6bWtTgpeqrdk7CAwBM3tb7yxLqK8yuJkfJ+gRCkxS+gc4nC7WwHPpkR1VRrBAAUwqGy60DQIQ7NnULe2PTN/iXXg6dD1EVpsgs60TTFWlgisJ3wDz/R0m+TzdKMm5ZsvEfATC6YLjcNgDEqLOPAIBAmyMBgHOpqrBAB4CEYKnVZ1sBUBEgD5s+gmEThsvtA0DzS1gy3M/YCrc5GgDqX8SBPu6JZgkAxRkx3RnByfPpRknGLUsEwKSC4XLLABDlvk0PgNAcxgEA3VUb/J0SzRAAynPqfcIHwAoBMKlguEQAKNMJT8OYfLBND4funcA9AMITza4TWH1a7ICmkNTldOOk45IlF/8RAKMLhsvtB4BHW3uyMYt98u1vAUnYOORas91OysolP2oygmFnOUKws6BbZElUBIvlJMFghQCYVjBc2tt89J6D5x76Z+N9pEsmipjldSOnDP9xKip2DoamgrQAACAASURBVLmTdzwpO5dNosOlnKpIXU+pq9iY9igtkOakSQBwZAJAoSLAtsUsXptHiheqtXpy/2JR7F1+wO5PPioObij3H9bWFObpHfK60QW9Ia4O7azNxvdAp0wUvatyVT5tdLdQpL5qq5z8H2OdXA7vmQcA2n+Xuhc8J/piEAAx5Wfz9LC5G/YVz7HH7auVL3fhft1+5LgGR5jL0TVok7yWtCjee23/wetVKd0a2FubjedxbploXghTsqeZrDHCWgqbqTIKyMfF5XBdIdkJe/WDF9ySpfw+SXyOf7mtEAC86jhG1byImdG6v1XOP5Y+8iPAthTmvLjwePPzdSEsigu+2Xge55ZJ2xjBf8T+TN7DayGFzVQZFcwP54PtXdoAwLzdW14AYKcxSztNjKlIWq0KBACreRXIbzwuNx+vvl8xihE47N8tyyf3ulYO8tHezWr/+7MeCuldjq+Cl7T97BoJ/SczWgZn12R4WmYT5tIyEzkXKTSFN78Ha7Ssg87VvW3FcEy6UvcBQL/0c2w3Q1mPptUgAFQEABOz3I85qeJ43XyhWFh10cX4RVs/6Pdad0emdzmBhgFACuTsGgIgmhAAEeUBAGHl6v+/vff/seTG7kNr27J3Rg5GRp6z7Tettxrv5CUIonYr1u5Ik/iHPGcACTJWgZXg4SFxYCeI0rMT7y6kyN4Xd3pnZEvK9D9zO+iZHxoX9cfl1hdWkSx+OSQPWTz3ng+k6Xvrkud8eIp1PlUkq6oEVhCAhgVAxuV83n+uz2Vun0wpfnfiP+R9V/l8LFeAj+b2SR+Q13/bCcB4IRDjJq5aoBPjoK76y2EJQOIQUGBh3wjQygIgWGoPsC6B0r1twwKgQsrx3cm9msZ2VwfixHYSACnrXx60AOyaP0VrF8XYZUArCoBvVrg4SgpA0iRwuCefsbUFoBkngHOxsXsu5WnALrmvJQDnUnodP3fZt/vbDcPEjaeriKA5JXbts6HcoAW1XAF0sXuofe7mJ+5N09Sx63JGeGnuvI7yuPN7N3IEqKJXQtYxCVzKU/yalrBaPjc1TAIPLK8Wr34vgMLdbbOeAFy++XL75J7yeftkl/TPd/9fIyT/DhE0pZN85WpAx7nI+7sKo0rMn7KzXKKL3+3pQ+XzENNRFc5TY+qnuX32thCAd6KdrScAy0KZFiSCsY8CkJOJx3BgheWr3wuguAC0fgFolwqQTvP2dJdar4dcKz7f/F63jGT3z2XsGkINETTlYR+7AHxzNq8RPR9XAXV3CETxRtnnfexG4RSf+7iOsbyOnZSdUKhr1iMAmRb6BaBo4oluKzLLXFEPNRry4k08lO1wm/UEoE9SfYaaP08CcB59H6mKOAGYs7h5TKcfoJpvBNs+nQZQH0Sd96Ls8z733/yfX8mfpSuA6UIgHocnAKuDBk0aLENpRr+DJw1Fg9nn/5UE4HpYM/hY/iyGgG5PT0w3YYUjgualXwCGIfW3p9uE+zsAdjj6oBjLJS77pP97n6mfz6clrenhZAEoDho0abAMpLlS/i8tAINLnwAsFQBNAB6qn4fJ4Jvjh9PZbBIyCcCd97tnBYmfbo6nKwDTsyOysFzCJABDSLvmIFwAsACUBw2aNFgGC0AuHm6UDOamAgFQrgBuT7shi2klSeKqlTaXAHTo7xPuf+vyf3dz8Pb5/cjLltRgdk9fu2caArqeRGFUhiSwABQHDZo0WIbRXCv/lwzmmP9XEgDTHEAvBCJXrSQAgDmAAeOtwGLlajt8jJkFxpkE7nK/mAQeP88CgLGsigWgOGjQpMEyiOZaA0CFBUC4XEMATKuAhAAMVwR/sMpJK2wVUDussX+srv2MXAeabRnoMATUNeccYVkVC0Bx0KBJg2UIzfXyf8FgboIEQFMABJrn0n0A4+duCGj4/Hi1k9ZdEpcFwJHQh8sDsGCgsjRA3PzVraCSbwTr2WEsq2IBKA4aNGmwDKC5Yv4vKgCTS68ALC4BkO4EviemJ8fbqkTCmhJXIuLuBJ4G8l13AgsBAM4ZuLB3B1CamyJOOOR4oMESTnPN/F8umJvVBaAAImg6nwVkON2v5gogO1gAioMGTRosQwQgKw83SgVTGtRhAVCgPttHHTs3DPjXMgeQHywAxUGDJg2WYJqr5v+CAiC5ZAGQ0C3r/LD/tHwfgLTkR4xSaauAYgau9jiYMW6KOOGQ44EGSyjNVQeAigVzEygAugLs1z5XcT4808H4RrDuJuBh0f+xUIdh0y7vvziLfOLmPgczwk0RJxxyPNBgCaS5cv4vFExlVQ8LgArDO4HnJ1fPz/0R1wnKpgfFWJYHC0Bx0KBJgyWM5tr5v5gAKC5BAqAowD7t8wVenelPdpBeXXApcv3Rh6L8r8WzICIfBrTXwQx3U8QJhxwPNFhCBSA7DzeKBLN/DZgEjwD0mKsUo5mOSJrbF92zfk4+nMbz5XfXvH52v3sU3KfSYP+w6c6j74qyLA0WgOKgQZMGSxDN1fN/iWA2ev5nAVgXNFiyAJQHDZo0WEJorj4AVEoAXBl/KQD9H1GJBQAdNFiyAJQHDZo0WAJoVpD/axaADQtAHtBg2apXjdk4swDMoEGTBks/zRryf4lgbqIE4IIFIBdosGQBKA8aNGmw9NKsIv8XCKae/+ECsGEByAIaLHkIqDxo0KTBEiAAZXi4UUIALBneIwAXLACZQIMlC0B50KBJg6WPZh35nwUAFTRo0mDJAjCOgiFTcfvDsJGb88J86TDB4KaUaQAoOBTZA7dhAagNNFiyALS5pz8MDhFMZOesGy8eJhichHLm/6BQ5A5bfw9ArABsWABygAZLFoC2eN9HEQAkQz4XRV3GwEUo1wRweCjyC4D+6AewAFywAOQBDZYsAKJSuf2V7qkEZ812+TDB4OCTN/8HhaJuAdiwAGQADZYsACwAbh8FXcbAKQB5XdYjAJsUAbhgAcgCGixZAFgA3D4KuoyBnU+2BUDVCMB0987wRB8WgKpAgyULAAuA20dBlzGw8sl3B1glAiDdvpkqABsWAHzQYMkCwJPALhdFXcbARijnHcB1TAIvRvFjBeCCBSAHaLBkAeBloDYXxV3GwEIo6xMg6lgGuljImSAAGxYAdNBgyQIwHs/IVNz+MGzwjWA9rAKQ12kFN4ItbuWKFoALFoAMoMGSBaA8aNCkwdJCs5InQEyoXgA2LADYoMGSBaA8aNCkwdJMs45HgErIKQCbdAG4YAHABw2WLADlQYMmDZZGmtXl/8wCAMjwXgHY5KKZATRo0mDJAlAeNGjSYGmiWV/+zykAGwwBuGABQAcNliwA5UGDJg2WBpoV5v+8AgDK8F4B2GSimQE0aNJgyQJQHjRo0mBpFIA1eLiRTwA2OALQsABggwZLFoDyoEGTBsslzRrzf1YBAGZ4rwBs6O7zKkGDJQtAedCgSYPlgmaNA0AZBWCDJQDN8EA5fJoZQIMmDZZemrfvnch4+6tIN3HVAp3sR8jrAA2WOs06839OAQBneBaAsqDBcrqt3XZ3+/Yj5fc3WACSQYMmDZYazUrz/8zSd7jp1RyluxS+wROAdnogRPWgQZMGS0CPvGzuIbhJNwFwQiXkazOAgAbLhQCsxcONkWWjw1PJJwBS/k8XgJYFABU0WEJonjeP090kW4A42ZuQVwAaLFWateb/WQAWWddZyVm6F4CADM8CUBY0WEJobp/EDvxIblINgJzsTcgrAA2WCs1aB4ByCcAGVwBaFgBM0GAJovm/3v/XyW5SDYCc7E/I1wcNljLNevN/HgFQ8j+GABDc5xWDBkteBloeNGjSYCnRrDj/GwRg08NTaShkF4CgDM8CUBY0WLIAlAcNmjRYzjRrzv+6AGwkWOvIhUwCsGEBqBo0WLIAlAcNmjRYygKwKg83FAGYUrpLAvRCCwHQ8j8LQG2gwZIFoDxo0KTBcqJZdf6XBUAa1RkW35skoN8qv/NxsUi/28ACUDNosGQBKA8aNGmwFDSrHgCSBGCzUZbut61BAsQG14yBrA8sAFWCBksKAvDqk/dPTk7ef/Sl10m2tqC+D9dpqZo375ZggdDYrv7OSN35XwRzs9EW7kxbp/Qufdbf2ihpwPDcBhaAmkGDZf0CcHM23Ql59zOPk1xtAd65D7ZWylMKCnDAaOyudj0xs2I+119m3bZVJ3ynLL98ZL9ShgWgbtBgWb0A3Bw3d3/6bYefnzVHbgXIKACY5t0CgOkpBUUEIN1RLwDpZjKjEcP4hqw7YrkqyPi4nrkQC0DdoMGyegE4l55EdO55KlGutgi7SPYdZpA9pSA/BZTGzqf+FcTMisZy0u6u5H0UBAtAxaDBsnYBuD2VHkOhfDE5YQHAAwsAIhoxql8vBn6rRgkKGjRpsGQBAIAFIKuHQxAAsQqoXkg0awcNmjRY1i4A2yfSo0ivmzdfOp2wAOCBBQARJm4gutA2NaJoI1dq7P/pxlkAsEGDZe0CsEv6Rx8OWX/7/NjzXGqeBEYETwIjggUAEzRo0mBZvQC0l9053snJSffnoccJg8FgMEIQnZpDkODl9bP7Pc87P/HdCbZyIBkMqri6WpsBYy3Ep+YAFPES1xZ7HKZfFkX8sXOUANMEMINDqQKov1x16KkC42QtFdYkadfAKsRBJxV45ESxRDgu/ftaL9ELAI9aYIIGy/qHgEKcRAqAre70y6KIf9jZUSJAALzM4FCqAOovBcBTBcbJWiqsSdquyQWdlPwdJADdM4qCBQBoHWjCaE8r0T1JgwUAFzRYsgDYF5HMv+hF/AtPXCXCkpybGcySXgVS35gxHFVgnKylwpok7ZqcPUsnJdImMEdf9QhkGbFvnSaM9vQS/aOUzDRfP3uvH4I9+fEX0YSQQSO10mBJSgBM9wEEXpQvwQLgrgB1yQKgQaR/AgJgp/niTDq6jh45V2GnoYFh0ZRqQYMlCwALgLsC1CULgII++8ewrEkAth9p6feu80bMBADTPwsAOigJQPv6O7cTFgCYMRYAGGIFYDz5j2K5ggCMz9Je0Lw97ZP+n3y7+7z9phcD96348dAfVWQBCwA6SAmAz0mUF3unmn5ZFPF3REcJME0AMziUKoD6+o/eKjBO1lJhTdJ2TS7opOTvVs/y2E8ES4Qk59/X8saZrFqoz/93P52+v3qy++5+HGMCYxaAdcACYB8+mn5ZFPEPOTlKBAiAlxkcShVA/aUAeKrAOFlLhTVJ2jWwCnHQSS2HIxaYsn8sy4h96zRhtCdvnO4B0Gie7zYpz17Z7rZ4nsgez5gFYB0QEIDcbwSzH27TL4si/kPUZRWRGRzLTOYpHuoSxslaKqxJonTm/quTEonSQvVKTv+xLFPTv27CaG/e2I9VGWjeHC9GfLprgjyXACwAa6F6AajhjWC4oEGTBsuqaOrpf0ZNLHVIjBWa3QWA/uytS1kTts/e2xU5evvT+Ufp+qATi4dDsZO+2J+Ii4lr2fD4pWn+qmm+//mv/lHTfO//+OOL3Zff+LOLX/3RW7uvv/vvWQAyonYBqOKNYLigQZMGy4poWrN/WxPLBdQLlvlzdwGwePjuze+9M90N8OtjcWJ29OFUY35a1/UoB1KxD6ZfLALwH9/qyn1vFIA/f2us+A8+ZwHIhtoFoIY3giGDBk0aLKuh6Ur/9bA0wCYA3UMYHQ9f3D5pJDwUmybJ6L7cG82oxewC8JtDxv/+570A/H9zve9/zgKQC5ULQIYXwgCGWBdFIEPm4IFbjJDb3fmHf2GWrfXihqhTadnt4tiZ7SnURApyF7SP/UyFMTnavdiZTj9phRTa8g+eCd9ugKi/Mez100Yk9GupSnc58Hj4c/Tpy+Fh7uOvVgHYnfz/04uLv/iXFxf9l923zy/+pr8O+G0WgFw4OAGwH9L2Iv46AKthNH0mnHlJOdjDcu1UxVYrwiYCrSWUlZZo0Kg1M+wFvem/0FHmYTr8pBeyCUB3Bu842rq8Le4Km2aLp2H/dpotkOYFphEihwC8Oyb6/stvDIP/v/qH/agQC0AeVC4A+G8EA/ShRRF/nZCeiSIANkPKLxHHy1TFLgDBNhFo6dCW2qNBozbEwRSNqaA/++OzdDkxMhXJf1FIpS7V7ZK5/WhT5aFL4n1qP5/qiBGgecs8QmQXgGmop/sikv7FX781XQKwAKCjcgFAfyOYKOMouyjirwOwuiwcD7s75ZcgVnp96whTsE0EWhqkpIvbfzVqIvMvFWD8Cjj5z8DS7cPAdP5fK3QVKQDqfK+c2sfz/XEEyDiQZBeAH1xIAiCGfS4u/k2/JogFIAtqF4CwN4IBiLAAwCzXKwBK0l1TAKDpv2YBMJpodQG4mZbyDCf212peFwM98xiQWC/a5fejd9TniNoF4F1ZAKYv3bfxcoAFAB3VC0DQG8EARFgAYJZrFYDFrVYxRmwIEoD+cW8w95UKgK5eYAG4VCcIxPn+NOIjRoCmxULzXQAOAZgGfcb7AAS6MaB3WQDyoH4BCHDCArDvArA4515NAMSj/oPs5gSuAKij/LoAnKvjQ5MAiCuD3YbxCuHVdB/n9DDpYAH47/9QjA6xAKDj0ASgBfShRRFjHUMeggUTIeR2d8ovEcfLVMVWK+4YTKU1wDDkgtx/NWqNdRI4KP9P5YAjRnGwhHXO/OJ/W/5X6hqXgRrmdjtMAtBdN3QfLqW532ezeDzot8AEYJoQZgHIigMUAONiOWeRxYYrGUCrYTR9JmzulF9CWOn17QIQbBOBVgfjiDu6ACjU5vNeTfyvxBPUoGbnetkkwBLWRmmEXMgpAJfN8kkQXgHofrg3FJPm6159IjSgHxaKEgAeAsqEgxOAFnDcLopIG67sCMwGKbA3QvklNlW3DpYxuTudli13YvdfjZo5qU75H25VrprO0ubFSEnVsPmTW027pL648V66v1eeA5hT+nX/w/Xi6mH7on+dQL+V5wBqwuEJQALUs/7FRsOPJtDoGXWxtMZ1BZoROVxmmVMCQuC5nOpy/WIMSAiAZRWQGAM6Ny0h3Xa3DHfXBfP1QjtdaCwFYP7Cq4ByggUACH96hyoBjZ5RE8uqghmTwBWWWceB4DBwUGh25+b6vcBCACz3AbTDGNC8GlS+N3j6ogjAuU0A5psCuvsAxgEhFgB0sABAADy3VwvbKtHoGfWwdEa+NM245G2YQlhbAvzjaYsXwrTt83FcSL08mO4EHj6/8Zfzj/K1gCwAD6VtSwHYbLrxIjEG1I0AjWrAAoAOFgAvQpK/qaJem0bPqIWlJ/aFaUZmbuMiolUlADCh0q/hP5pfCdl+c6ZM5N4d78u5OZbUoKt0Mmd9WRvEtHKX9Mfyw20CsgBsBvQzFf9js7kYngUkJgRYANDBAuCGmN/1zfjZ5wQXMuBfgRRL1mkAaFnQLNExjJTmWehmWG3vTJTTyhZkFsZS0Vl7btC0qZAE2BrXd+llYeXrkJ6PHnU38m6/GZdzPhhSu/Y00Hk8aHj+82PZRH8ncF9u0IWuSPcOge3z+6LwIAD/akz/49NAm+77f+meBiruCmYBQAcLgAtj2javBVFdu0tABcDvyQOrAZjlmWaBjmGk1EgAJMnG8MZmBBbGUvEpW1+A2aOEAtgaZ17Fqn/v520VTO+IN7wPYEB/z5j5FjInupzfJfxp2vd35t+m6QAWAHSwADigJkN34oYTwLITZgBgWRmsKiIABkdi45j+fSyaJjVmsOpN/9zPWCeDACz85JcAW+PMIr8s9+ojY/pvlRu8xjeCjds7ZZjXjwLTf9OP+iirgP6ffyt++6cXLADZwAJgxeKU3W7fX8JQONVOkAG/ZW2uIn/HMFKaNw5sIGfmBjOJLEylQHTs1Y1+co8D2RpneZaqqXXbFx/1D2K888Ofais7x5f9/vBTdbN6B1nTXPzFP+5GcX7zd//dxYy/+Efdpn/y+cXf/POmeXcc9teXgf6nrtDf/1f/Y7wsYAHIAeoCoJ5HYFqej80DEIDlPPfKAgAdiSomAAMfZAHILQF2p8btGfb5TgB8GNK/sklZE7rZTArAAoAOFgAz5ONy7wXAtMxpXQGAzZi3hQQgeWbELgB5JcAqAObtawjAMOvbOARAUgAWAHRQFwDFCZ4X42jIngqAOQOtKQDS4H8NAgBdweV04tkBUWYhfg1O57mM1QVgMyZ3pwDMCsACgA4WABOMwyEu8yE9E8tOmAHLD6aT/9ZYEh9GSs207hbEosk/CSwN/sc66eq5LGSTAJPTYV2biUxpAZBP7V0CMBVkAUAHC8ASi8PRP8IUMgYVbwf08kGLAeMP1vS/HIvJABOlKf0DI9rkXwY6Dv6nOBkEwGEh1ziQOcQ2MmUFYKMM7jsFoC/MApADLAALGI5F/7EfkB2c5Tw5wp8mrAYs6d/DEuQzFjKlqwnjRlhEp9SKw8KAafAnwQmgQZnibNrr5u1tWQGQsj9EAAYFYAFABwuAjkJrs4NwpQOBhsfOzDKrBqS2LHv/RWk6iCV6mM3GHD7KCYCa/lkA1gMLgIbs+T+YppoacUTAb0FmmUkCMDStgAAgGAGyxA2z2VjhByuZBGCjp3+IAFwMi4Uy0cwAGixZADTkz/9hNM3ZMTFrQurCZwsigXMtk7v/4rQZzBIxyNaeY69SRAAM6X8hAEb0N4tlopkBNFiyACjIONYxI4CmK0fGnjsD61jWC6GmJwQ7mfsvUoMDdzmGy97M0pjTeGAwGxAA6R8mAL0CRNBcCTRYsgDI82HieEmcVfS4AU8C+5OkTwRka8PnsTRkVtvmzuZg6dnyI0xK4JPAWSDCpXJxtMptDF42Xhq1vtN/UXt0436cUVC7YOlfzeyW9A8UgAsWAHxQEYDb997+ylcmri3zMX0lH+7YEjAbhS0DhZ9v2/Op3JDu71QQ0ELnWiSTA6Pn5Y/QyxbgTsjVfwfneoewtsprLaR0pAIozKbHfV7Jqz6v3A82DxQASM6WSlmzf4AAbIJprgYaLOkIwKn+ejqDk0gBGP+dDrssI42zUf85mJSqgTCXlhui2ARdijhczZdKlqJidab2Y8AwEnAn5BOAVj4jGP+V/wu2FoCEt85MAiC+XEn3fXmeZ5RRADau9A8VgFEBaKRWGixrF4Db904G3G+aOycn7quAqLaISo2W/5FDIxl12JWGokJTgKGK3BDl6ZqQFrp+00eeFmVF5lcUIGgSAboTMvXfwew4YDJzaab4hfkNZhmhAErE5D0zDfs0ip6l0gwQAE/2ZwFYEbULgPLeicVLqjUnCQIgpaa1BSByEHhZS26Ics6eKgDCncjoIAEIa1YNAiBOnVcRgOAeYBUA8ew37fovlSZUAPzZHy4ATa8ANFIrDZa1C0D3fokfdc8hzzYE1KgHRwvPPRFuAALQ58k418sZWsXqvA1DAPoyowQABCBU1CoQgKsVBSBCAVS5V9VAoHGzwReADSj9wwWgVwAaqZUGy+oFoHvBRPcm0bwCoCSxNQXAdkoNg3aSLY9uKRkBTQBEevEKQPBFTRUCsAhXOQEIHwSyC0A76XRZAYBm/xABaFkAcFG/ALQ3x0ef5Z0E1k5ih8/IkZmN2g2LBB7v2qQAw+i/0ihAC0EcrGf3Qzvl/A9sgGbayyJX/x0mTPVwNYUmgTtEKsAoXWr4xDdPTFEFwPigfwwB2NBIrTRYUhCAbhjoYU4BkE6Oxi2rLAMVZ2lprtXBrGZ6lbnSqPhloHoh2cXyh2klYsyc5srLQKUVk4WXgQ4IDtrMTNzo0cwCoACFpvdBz6YH/acLQMsCgAoKAtBunzZ3jnMJgH7+347HS5QtByajZtPT4E+q66slVP+LLxa6EGfCziLHS8kmbk4bGIls/Vc5KZD2XZRAR7GMuAQQO6PVwzd+83DHEgBp5IcFoHKQEIC2fX7sWQHUO4nyEpeeEmCgGbJA0g9T+g9GYDDtjvLGN1f/xWUd2zPjvEVTxxEAZeAfXwDawxGAV+/t9PrtL/XNz+83zdGD78Zvr5/dN5YCgogAtK8+/vFLr5O486zC+X9JEzf9IyE4mJYmZG7ZSBPdCa7Boqcm8dQxBECb961QALr8eefRMptcN4/HT9unx+YiIUjPrNfD1ebRY2XrdlwZf/TZUOh4vCh9uBZNmJsiTkqMtKZDo1lj9m9jgmlsRu62TQKA6wbZXPzgZFStKGctigDoq34yCEBazhL58009vd8cCwG4PR2K3PWOObiQnFl3hN78sn31RKT6EefN0Ye7E+KzYUhkV+juF21XqnlssZOZJtBNESfhXq5AD0bDheIsb/pPaFpkMJeb8gZXGMcI4xwt7H0SGwI0AcgwoWJ70n9kZi8lAJd9/nx+rJ8x7zLpmEJ3EnH0adu+OG7uJfhJz6zng0jt6Mg8hE7tVKprweU4NL4rtZC0MjSBbjCM+FYCxZ20Rs7rxUNylfnsP6VpGJdT87KmGAYgTKbTIylFC3unRAcggog1//t3Q6oAGFb91yYAu7zZ589rdU5x+6wbSRkEoF923hdRT70DkdrpBVONqsj4O324J6tDLNuDFgDppqs1BCD74E9K09InVK6mW8RKCED6afscLfS9kiAAwVR8TwV0IE0AjDd91SYA1/MZszRkcnO/aX70ZBKAocjt6aoCMOX9SQlUnKsXKEK2QkFJANrX3zl/Dm2LlP9LKsA8zFBmfDyuaUnzlmIBUv7gypbT4jlzxd8v8e0P5mLP/34aSQJgvue3NgGY0qaSP6+bu19unyyuAPwLDx1I7fOXYkynuw1q+fM8ZTHgEK4AjIZBd7gYod51u4YAlHFUUgCUJaglgruYUEm2NL0FABEJ7aciAElveikpAGMyvZTHzF99IV8TnFcxB3AuCcCSyI6dOuZ/HilXhysAV/Ij7VcQgHKOSgqAuqa1sAAkKcDENYMwp7Q/jI6xdH4BsD7zpzIBmM+mr/VJU2lQ6Nf90sqjD6LddEgXgHuLTyP6lUw/UujfxMoVAQF49cn7Jycn7z/y3uoQrUEl6gAAIABJREFU1Jb5BtmIyknYbwHAYxDkQSBeAaT1REmMXLZjEMZnHQFIfdVXSQEYs7xDALYfDaeT7yTdCJBRAG7/4ORYpbcjHzleVb0A3JxN5/d3PYNcIW3Rz1LXWQVUxFPBSWBUBgEOJKQqQJaRuaQAhBCylM08Cex45CdBAbg9be7uTjZfnEUurByRUQA6KGNA2+jbAKoXgO5Gh59+2+HnZ75pjoC2SIf5mstAs3squwwUlwHQgb4lehioJ5pnZiYtAAGUrAKQcxkowrseaxoCEgstx5X2scgsAN19wtOdy0+ibwSuXgDkxpsDITkBe1EO81VvBMvtquSNYMgMgPYXm1IUINPMfKoAQElZC+a8Ecz5yP/KBMAyCdxBCMCsEZdJs8BxLG+GJzvsTnXdk8Dy5pT8X7sAKEv/0e4DWPfZC0XVJho0WJppRu/fXB0jMZhgWih3QoALA/J/dQJwaVwG2kESgMeibMoYUKoAeJaBzi24PWuaD2NZHqIArP3sHRqplQZLC83YPZyrY6QGs14BQHrbe8EbwYa0qt4IJm+RrwDKC8AM341g4grg1an+uLggVC4Ayn5aDNvpTiBe1n/2Go3USoOljWbcTs7WMZKDCWOW/jCMoMIXvtP/CgXA8iiItr45AMujIKaRoZHe7s+qNyxD3cRWvG6OPhyvhJ4fe2a6AW1ZP/1TSa00WFppRu3nmgUAQq24APjf+FubAFgfBqeuAvrTtv27s3XvBLY8DG6a+z3vE/9Wf1hoKGoXgN0O2+Hk5KT74xHkri3O2a6r6elkgSRQpzK9NEM5pLIz1o9jaTHl2xjfAufODjPUzC/kNPBJCnJ65/E2ZljCZNws9qS3AaECAHjje3UCoD4O+nweVJgHG8Zx+LUzq/lx0F3G350Sv/6oGZ8GGrv+c0T1AjC+8aZp7vzEdydY07g7+lXswz9xFzP6aIZySGVnrh/F0ljDvzGhBY5KQQrQiFdDy7DxxWQJhacxzShghs3WNhmMBBBqGkD+r08A2q38QhijANTyQpjnow6JkaDxOdDixqhxAGhG1IBV/QIQ4KRpHT3kSn72T6gAhNdxWoswaK+Sys5cP4qlsYZ/Y0ILXJVChoGaZnqVupFPWpBRBMDZls6DUQCGf5t2+s9jBAxQ/q9QAEoBgaXySshp7KdXsKN3+s3iYmXvBWD79S/9ejyf4CxbdaXk/5i0hhYrF80IDqnsLPVjWBpr+DemtMBZB64AQ/4fM6VoumQ7McgYPcfZlt5Br2Amv6JFPgUIoelb/sMCQIIlFQHwrQAdnFhz1jz3ywIArL8PAgAfBiIgAM5BoOECwHKdlUMAgPmfBaB2HIIApD6fkgUgxdSqAgBVgH4AvXIBcClAaQHYpX9YzmYBqBz7LwDqyk8WAGD9PREA4DBQc0VCAKwtKSsA3el/ywLgBg2WeyYA7bKH6Akgpg/h9jsjzQQOqezM9aNYGmv4Nya0wF8JpgDD+HnFk8AdnApgyP8zbdRJ4D7/swB4QIPl/gmAuthtefTHrOdLWwMIoJnEIZWduX4US2MN/8aEFkAqARRgsQJU55MWZKyu4xYAAz9nmwxGICT69M8C4AMNllQEALgKaL7a7WG87zfmOEZM/waaqRxS2Rnrx7G0mPJtjG8BqJpfAVQBMPFJCjJa53EogGERaDvRhunXPNBlx6Yf/u/BAuACDZZUBADmRPVSw2MfTKDRM2iwBNL09YTc/QRRAGxMMZowDRhB0j8LgBs0WO6xAFSa/qn0DBosoTTdnSF7T8ELZhEBsOXfjbz4kwXADRos91YAqk3/VHoGDZZwmq7+kL2rIAbTxjW/AGzUtf8sAG7QYLmnAlDr6E8PGj2DBssAmnlHT9xAFQAjW5Q2OARgs9Fv/WIBcIMGy/0UgJrTP5WeQYNlCE1bryjQWTCDaaabVwAW2R+cs1kAKsceCkDd6Z9Kz6DBMoimuWOU6C2owSwuAKb0zwLgAw2WeyoAJbxFg0bPoMEykKapa5ToLbjBzNYIkwAsx36CcjYLQOXYQwGoHTRo0mAZSnOpAEXOFrAFYME5lwDYsj84Z7MAVA7qAqAuU87lBRU0aNJgGUxTz5RlLheRg1lKABzpnwXABxosWQDKgwZNGizDaaqpstBwIXYwlzKGYlYRAGf2B+dsFoDKQV0AFCcccjzQYBkjAFfKN0wyVuALwJX2HcWsJAC+9M8C4AMNliwA5UGDJg2WETTl5FlquQB6MK/0CxkUq5MA+NM/C4APNFiyAJQHDZo0WMbQnLNlsfVi+MHMch0z5ldI+mcB8IEGSxaA8qBBkwbLKJpTviy2XjhDMGXuqAIAS/8sAD7QYMkCUB40aNJgGSkAV+NfZDJWZBEA6UIGyWZHE/qyXxYAD2iwZAEoDxo0abCMozkkz4I3DOYI5hX+hYx43DNizmYBqBwsAMVBgyYNlpE0u5RZ8obxLMHMIAAB73pkAfCABksWgPKgQZMGy1iau5xZ8oEheYIpWoApAC0LABJosNx/AajvBrG8dLDaG2ekeLSjBcCSNfM0IJcAXA1/7G7DGmN6FlBizmYBqBwEBOB19zbg18/e//EXPicGLxXeI5yVDFp7o0yUj3asL4sAZGpApoh4BCC4MSwAiKDBsn4BuD5umrtf3Rx3PfmBx4lRAGy/rIbMAoDkIlIAkLwHekQ2R0UA2nEy2+mVBWAd0GBZvQDsMv+d+83fOzv68Nvnx81jt5OlF7Gppr2Rkwtee2MsrBBtXFe5GpBPAK7sAhDeGBYARNBgWb0AnDcP2/ay6VP/dfPmS6cTFgAWABRrVATA+e5TFoBVQYNl7QJwe/rGV+Jf8cfuhAWABQDFGhkBcL3+jgVgVdBgyQJQHiwAiDh0AXDczsACsCposKxdALZPusGf6+bos7abDwgeAjrAVUCyi4Smh9UbHVU+CewPB7FJ4LYTAGujeBJ4TdBgWbsAtJfN0U9/fnynS/07MXjodsICoLY3pfHhmXWVF/OE+AKwo7UMdDBtZczLQNcEDZbVC8Au6zfN0ePLpjnploO6nbAAqGe5KcdLoACM/1Z9IxgkHJRuBJNMmx3wjWArggbL6gWgbb/5+NF3bfvr46Z5xzkAxHMANkdRDsMz6ypRDj6/rZ1lpGUUDywAiKDBkoAABDhhATA6YgFQitbNMtIyC0BtoMGSBaA8WAAQwQKA6IEFABE0WB6gAKw+JVBQAIa21iAAuaIeJwCl+0A2Z1NDWABqAw2WIJrgp7E53ETXlBBxH8Byjmz9WeFyvguuAvJUyRb1qEng4n0gl6upITgOWAAQQYMlgGbA09gcbmIryogTAO1YX78P7aUAeBxli3qYACjpci8EAFXMWAAQQYOln2bI09gcbiLrqXj9nduJyYt2dFQwKbB/Q0DeEZ58UQ/XqTX6QCZPvVnEaxkWAETQYOmnGfI0NoebuGoAwwog5dW/K2D/JoHzMgFZjqmzHwKAaF7k14qB2dy8oMHSSzPoYTwON3HVAIYX3cNXXv27AlgAMliOqcMCYLS3TmYHArO5eUGDJQUBePXJ+ycnJ+8/+tLrhAXA6IgFwFyHBcBsT5owM3xyGgBtAhaz1qSRWmmw9NIMehqbw01ctc7n2aT+dz/zOIF4Wf8konTeKTAJnJUJwHBUpf2YBMa0zgKACBos/TRDnsbmcBNZr5uDvvvTbzv8/GxQIYcTmADM15LrYA9XAWVl4jFcExu7w1x2URvCAoAIGiz9NEOexuZwE1mvPW/uGT8bnTAYDAYjBN4cDH8amyM3R9ZTZh389wEwGAwGIwCRqTkMhQQg0kswksZe17k2DKWcdd4Sz/gawQxvQ3XDAeYmVEdTwcS5bpoCNFiWohnrZZiDHhHxUvg8SFt9sUrPCKachyX6ApwVghnRhtqSgaUJtdFUMHOumuYEGixrF4Bu/dGHQ9bfem9EZgHwO2UBQHPJAlAUDgH45uOTbuvJT+wrxTOMfnRPx3EkpKqDOSMoImvcB3DZ79qTfg971iCxAPidsgCguWQBKAqbAGyfHc/5y7JSPMvwNwtAiJu4ah1eP7vfU7vj0PfRCQuA1ykLAJpLFoCisAjAqzM1gxlPEs2PGmIBaENpep7G5nATWS/MCU8C+7zyJDCaT54ELgzjJHD/lOKjd7oH1W9fvGdTgCwCAKJbPWqfAxix/fqX/iWoJQUg4RJyLQEIo5xNAHDXnq0jAKFtqC4ZmJtQHU0FE2eJZp//H0yp4UX31XBWzgJgBREBAA0+FQx5ShJbqWdUkrNQ0/9q42mBbagvGRibUB9NBYLzTLO/S1U+5b/efTcsFWQBsAJC8+tfjCHdfvzjlR4HXZsApIAGTRosidCkwZIezW6FiPp0gEvjJQALgBV+ms+7y6q7/QTseo+DZgEoDRosidCkwZIcze4CQMsL3ZjQdAmwfdbNChy9/ekkAH/VNN///OJXf/Q7u+1/X2ru9tlJX/JPRNXr3vKrj467GYZp9cl1Z/zVzujRDz8Tk8DdH0Hi9nT+TC2YNuza/Pb743PYWAAwQIMmDZZEaNJgSY7m9eICoG2f/XRaqPJraX2oJAD/+d9OWz9blDz6YDL9xlfPxWYxy9AJwN/1G48mAWjPZxbn0vUHtWDa0L8RrH3eKwALAAZo0KTBkghNGizJ0TSP94zo5wcm/GASgN/6v+etY1K5XK4j7QTgL+eN40XFbuudY7FBCEB32j88p1gRJGrBtOD2VLRtF6z1BKCyVUBJoEGTBksiNGmwpEazS/H2J8R3Z+NHj3ZZ4/XTLmO/KwRgh9/6l59fXPz5WyJdd5n86NOXw8MGpFze9E8h6DeOef162Ni2Lz6V7gMQM8+zEsgsKwf43q/LXRsrfCWk4mQ/Ql4HaLAkQpMGS2o0DVMAM7qsLJ5ef7P7/Bt/NgnAb3/ei8Ffi0uAyzlvd0n9oajevDEM/r9STvGna475RrBx5OdcWZJELJg2bJ+I2Jw3D1kAMECDJg2WRGjSYEmNZnfGbXs8pCoO0yDQX01S0K8CGvL6+Wymq9Z/vm6ks/ku1feXAMoq01kAhnlgZf6ZXDCtOBeitovN77MAIIAGTRosidCkwZIaTZcATKfyY41+9c8gAL99sRSAxUiSOr98PqrJtXyOLz0KoptE+P1T1QyxYFqxa+aY9W/PHFdcPjdx1QKd7EnIqwANlkRo0mBJjaZLAK6VbNwJwPf+eBSAd3UB6M/2+6dJKPWVB9HPJaetkgCICWf5njRiwbTj1ZnI+tunLAAIoEGTBksiNGmwpEbTJQCXyslq07w1JH5dAPoMLtL3fBeAuA9AQOR6RVbkh8Fdy4uKVJaVI4zm9m9XuhMY5mQfQ74WaLAkQpMGS2o0XZPA59p4vEsApCeK9suGOqgC0EnNw9YhAP0EsLoklVgwc7sp4oRDjgcaLInQpMGSHE3T4P38E1wAlHcKPOi3XCv1/QKgTBqrLOtGoyKbm1yGFSdUQr42AwhosCRCkwZLcjRNN4LdnPykG80PE4AdXn0iNECs99EEwDkE1BXQxqPIBJMFoDBo0KTBkghNGizJ0ZyWZ0oYRUGfA2h8AtB2LxT4qJEmhkPmAM73eBIYx00RJxxyPNBgSYQmDZbkaBpuBRbzAsBVQPoFxPZpYxjskVcBGQWgGwD6kTYjQS2Ymd0UccIhxwMNlkRo0mBJj+byaXBipb7jPgBdAMQAfw9ptF+qfz7fHmYSgEF1NDLkgpnXTREnHHI80GBJhCYNlvRoLl4IMz2bWb04UO4EXlwByPMFsgBM5/PyAyJMAjAOO50rVxTkgpnXTREnHHI80GBJhCYNlgRpaq+E7J/bNj3Oc3yLyfAsoH4ESBaAzWbTTCP7k4pcStuELLyanvJvFgDxDAj1WRD0gpnVTREnHHI80GBJhCYNlhRpDs/n7G/jff3ibF7GuXga6A8uVAHYzALQX0cMJp420rOAdgryqVgi+lh4MwjAtBr1Ur4eIRjMnG6KOOGQ44EGSyI0abAkSfNaeuuLshDH9j6AQQB26X+eBL6Rbczn+vcXVo0CMI/9K8+DphjMjG6KOOGQ44EGSyI0abCkSfPVR1L27k7ZBeS7u6Q3gvUC0OX/XgBO+6I3Z7OFYdioS/V/+nTc1r0BYNqqC4D8Gkh5HphkMPO5KeKEQ44HGiyJ0KTBkirN7X/9w/5k/eQnX2o/DG/6/eGnugD0+X8QgM1Q9MUfdmpxZ3ok3JDqv+neKfz2p9O4vkkA5LcA9Fcdj80sKwULQHHQoEmDJRGaNFjuL81JAC7EBPCwCqhtNxtzjWv7UyaysVwFLADFQYMmDZZEaNJgub80NQHYsABMYAEoDho0abAkQpMGy/2luRCAi1kAzArAAoDspogTDjkeaLAkQpMGy/2lqQrARhIA2yUACwCymyJOOOR4oMGSCE0aLPeXpi4AF7IAGBWABQDZTREnHHI80GBJhCYNlvtLUxGAjSIAlksAFgBkN0WccMjxQIMlEZo0WO4vTU0ALlgAJqi30WXjzAIwgwZNGiyJ0KTBcn9pugXApAAsAMhuchlWnFAJ+doMIKDBkghNGiz3l6YsABtNAKwrQROxt8GMc1PECYccDzRYEqFJg+X+0lQF4IIFYAYLQHHQoEmDJRGaNFjuL01JADYLAcikAHsUzK9/MT4MY/vxj1+6i1rdxFULdLI/IV8fNFgSoUmD5f7SVATgggVAgp9m/5KF4Rl5t6fySy+D3MRVC3SyLyGvATRYEqFJg+X+0pwFYGMUgBwKsC/BvG6at98/G6bEWQAwQIMmDZZEaNJgub80ZQG4WAhAnkuAfQnmef+s0+e9ArAAYIAGTRosidCkwXJ/abIAWOGjeXs6LIe97l56wAKAARo0abAkQpMGy/2lOQnAhgVAg18Axpx/2bz5kgUAAzRo0mBJhCYNlvtLUxKAC6MAZFCAPQnm9om4Ie68ecgCgAEaNGmwJEKTBsv9pSkEYGMWgCyXAPsSzHPxvrPtk+b3WQAQQIMmDZZEaNJgub80ZwG4YAFQ4aV5cyxeeXx7Nr/9ONhNXLVAJ3sS8ipAgyURmjRY7i9NvwDgK8DeBPPVmcj626csAAigQZMGSyI0abDcX5qjAGxsApDjEmAvg7n9W74TOBk0aNJgSYQmDZb7S3MSgAsWAA38LKDioEGTBksiNGmw3F+agwBsWACWYAEoDho0abAkQpMGy/2lKQTgggVAR9D7AHgZKAZo0KTBkghNGiz3l2YvAPoFgCwAGRQAJZjnTfPmS+3z+Hf7pBELNFPAAlAcNGjSYEmEJg2W+0tzFIALagJw+ebL7ZN76ufzXdY/3ynA+b1dPk5XgDCar7+LdRNZL8zJvvbfNUCDJRGaNFjuL81OABYXAPULwO3p47a9Hk66xeeb3/usbXf/9H8v34xclINKE+SmiBOTF5Q3XfqNBLjJG3IrkcBAxLFEiLYwATOFEEzFEVb49MqxNZPguK43brfRzPq22HD7sQJw4RAAfAVAiFif5PvMP3++lnM+C4DqxOAF5WXHfiMhbvIfSyYioYGIYokQbW1M0mcKSdyFI7Tw6bVTGMbCEUXzdgtNlGPIgfxdcycAywuA+gWgP/kfBUB8vrx3Pd2PO/6UBAhNym8EG7YlC4DPSIibzAJgcREaiEgBiK6qmwCawhAAyQ5a+Ey1S2PndfrPSAgsAI4fEZC/a/YCoOd/MgLwUP583tzbfRlngdMvAAA0Sb8RTGxCyEkuI0FucmYDK5HgQMSwRIi2bsJnKjmYiiO88JmrF4XI/AYFsDTHNvjl+jUdBbpm0xguAHQBQFaATFcA3fzvdOp/HZuPZ3hp0n4jGAuA7wefJRTv8SZYAKLBAjDXMOV/VQDQLwEQwmWaA7jsFgUJAUAYA/LSpP1GMBYA3w8+Syje402wAESDBWCCMf/XLwCmVUDDlcAffCZfHeSkSfyNYCwAvh98llC8x5uwmLrqkOjK4IgFwGzH8Ws6snRNJZ2b83/9AtCt95/uAxg/b588HO8JeDzOBaTBLwC03wg2bEvcGX4jIW6yZgMrkdBARLFEiLYwYTd1JZDsS3G4/GItFemjNJoDnQTeSBi/NjQFoLvr9147JP3xc38HsLgTuMAkMPU3gvEyUN8PVkOY3sNNWEzJyT+aptHh8ou1VISPFIaxONBloJslGoAAYCvAOvs8GF6axN4ItuhJ/q61LIFhxL7BacnuCfiL9Yu9lMWo82drramR7kRuKK1tXNZSz/xFKUhjAjmbizT9uXRQrpJZptIMhBr7xZ4w9gYbPRhzQylTRWAxh4N5zMiAjbKcZ/zGAmCFlyatN4IFHqBDLb3KYguGVflgDCGT5RdAg9L6r+nQtLMwldC2Xamn/lJVtBNUfxydrXFZlHNwKk0YTJRt3JsuroJmskf3JmgxlwPLKUYP82pOFgAr/DRJvREsYrhyWWWxBcPqvMEtADZPqL+ALkUcP3qxPOt0sTDRkbZd6eM+atWIvWPlbI3j8r8Qi3MAygnA8O/0RyilTmGKbboAzP/aN0GLuRyID4acblnNDxIAZAXYGwGQUfsbweaLw4BKepXFFgyr0gaHGbsn1F8gDUpOBqb/LSwMdKZty+SvVo3Z51bOZjvNtJxm9AbMlTLLmE6UgNHLLACjImt7Qglu2uWJoX3O/eou5nRgF4BuuN9clwXAgkI0WQBYAMIFwJj8taosAA7XTgGQTv1nmqkeQQJwlUkA+ulec10WAAvco4N4bnIZVpywAMB+oSAAhnEfY1UWAIdrswBcXSnBLSwAi/2KJgDdcn8WgECwAOQXAPl4YwEwsNDpqPFykGMBcLs2CoAurQUF4EqDrabbgUUA+tu90gQAUwHICEAZN0WcVDYJrHf38XLbn3ZNJVB/ATQorWOM+UY6sXCxUOiIWDkpylUj9o7bpumX5X9+qLOrWDRhmDK/+NOISeDlRZW2HxI9WjepVx3SN2BkFt3FkP+TBAD3EoAFQHFTxAloSaD++7LKYkvY9ZEh7ys23AJg8wT9RS6k/GL9YRGRcaOLovGL9L0xwkZc+l3KCq6YS1UD944NOkuJmaU1Dpfyzm8mAcCg6W3CojkaekaGeoJmmvdm2Rvk/XqlFpNCpEfGECqN5lIAjEm9NZVlAZiwZwJgTmZqIb23mTufvA127C4Tv7lLB8lT6C8K1fGAV5ORu4pk1EFQdiBXnb+bco/5kJY+aCMTroiLX0H7HACdoYX+8oMO7YJvZolCE9IE6dtEZ2qB+Lys2Xp6Zph72bB8HqQXMx8r5vCqNLWkvhECYAZQABAVgAVAcVPECcQLKAlrRZx1zCf8qTRjoVBtltwM5MytswuA7ECrag0U6CofEjyz4XS4WmK+7Fr+Yo9ykaPMQEnd88PZgINPogAYTegRsbMEGFN/NOT/NAFAvQRgAVDcFHEC8DKfIMGLmOsEJ/4QmrGQqM6shrPk1nikWSPiyRHKGaPtr8+Hgojs77EYYUb9K85Bl0708p5eUOIoW8Z4PPdXTwRchFJoGnaxKSS2nqCWc/cXswCIpG5O9SwAFrAA+IvIyRN0Tp1OMxZ6Qpo2Gn9QqqwsAHH5f30BAPWEVQRAVf9mkgM7ITwBsAbFTkAuHCwAGywBwFMAFgDFTREnGQTAnvdj0hWYZpJtwU9uiPHSQKGzqgBExxNZAK4UokYBiOkMawjA1TzaM/9fQgCcQXERUE9ZfDQ1AfCkepgAYF4CsAAoboo4QRYA/RBHTjY5MB1+en7W2i0doVkF4Mr2g4wUPcXcJ1LeWgpA0nmAfP2FwtfhY/Y1fS0mAP6owHpCqABsWABicWgC0M6HtLOI0pMBdQKQM+Tqub/Me9EGTdd0VjaWSmm9qjlTmrwvKEdCErRYE8KOQlkJmiHjh3UJWQCyaYBKSbnCGzL/fCLgUfc49zBJ9ATOEH6rCUP+ZwEIxQEKgGX9noDh5M5bJwjZQj6QlqjKvE1tEO00tc4uABYHssElbBFMTYjqFU28JbFAcrY1LSAxmg7rEibdRYdC6UoSgBke3ik9cwpaCEu7JT9NRQC8qR4sAGgKwAKguCniBOTF3rHUjAWrEwEtZ2Hlg+ncSaIqf3EkYL25EsslbA7MkWvlhGom7W6WB0vxiTR0Jd8gpcuX0XFAlzDqbiRRlxd5Z6ibVc0G0QzALJlBLJ3mfDTnpL7BEwDESwAWAMVNESfRXrCTsRMmAbADZjM19y1rBwbTw3bx45XYGuRlCfMlTbidRSXUDrEIZuauFmk68gDK0BanxaUA+FM9C4AFBykAack2FY7z8DgZQGC/NBHUMQD+M4XclloDDWfe+baLn1xuCy6pytUKh1lNADbxAmCA5Y0C4WABUNwUcWLx4k2vpVK/m6YRPpp4DdAsBbAEEsgSdse8coD13D3AM+aI7a7ckqqcR4/V9EIAAKmeBcCCPRaA9HyPOvRvownxb2GPnUBke2GXUwjO44LtE32Qkew9wl4nhwZo5uCco4b9gqqEQTMvGqIKwCZBAAwbD08AFGRzk8uw4sQ2uB5tL0tQwAYX/hO0DIwwAcDjEBlswHIun4nQM4KIHuGugS/jqm8w54hr0zBqwZBdTA3RBSAy1dsEAGkWgAVAcZPLsOJEEwAce2sKgLF4xuy/cO4GJonIYHsqAAIV0oTYHuGtgbg/dTMBnOENK5L9J0fDx6khigBskAXg4uAEoIybIk5wvQhz2CEKXTy+Tk8C5ixsd6GN9Zf3aEBIG6L3CFxNkwNqzv8wCtB2FUv/k7NWbogsAFr+RxEAHAVgAVDcFHHSoA7bS4cO6tURlKZ26CpVsl6uTV4dXgw5IIyTVjqfAHSwioClEc2cZWSWWQWgTdMAwXRMlo3OFXKFD6Jp5ZitTw4O5wEgVQDiU71lKwuAhu0vX7btq49P3n70Xbyb6JohTrDeDjWZG//iDpBBaaqHsFIl94idh6UxB4Rx0kvnFYDWogHm/D/vb41lbgFo4zX39OWiAAAgAElEQVRAMJ3z/5Qn1QKJNO30cvbJ3qm8Y9pRAPQLABaAUPhpXjZvfLX7p8PRB9FuYisGOcF7P6xsRT+UEOyCDOoCIG3LNDuheTd7saWoME566ewC0EFnblIx5V+NZQEBaCM1YGQqj5boAuAn4qPpJJa3T/YKMDhQBSAl1Vu24ijAvgjAdXP04OXunw++/fZnTfM41k1kvTAni+veVHs5rMINWo9jZEIW50YvjgGAEE7L0pH5I7SCTN+e/6e/mpPYJBfFMkQCRgf6aLn+r4eJm6abVPY+OU0FSAKwuABgAQiFj+b2yS7p9/+03cXAmy8j3cRVC3SCLgDqZW15ATBdyetfMsHE0pUC0gUgagQhPASiEaam+AUgbpgjYkeFacDg4Gr5GHCdc6wAeOlk75PijTaqAKSlepsAYCjAngjA7ekbXw3/iC9xbuKqBTrJkaob9L4Np2k4cNcTAM/IRKoAtFGZNSoEYjrAPoxlE4BIknE7KkQChACYuke6AEAGpfILwPDAVmnvGC4AUAQA54FALACKm7hqgU6wBWCyi2o1iubaAoB8BojWgkgDznEshwBEItYAWAPGfWTvHgkCACNRQADEX7F3DPkfSwAQFGBPBGAY/TkfhoCuax8Cih6k9RpGtBpHU6mSp5m6v8kLKAWEccJqAXIMZFqI3SneAnRGeNhLju4BaYrhV/hlSPY+qe8VU/7HEQCUS4A9EYBuEviz9ub47pdt++q0eRjrJrJemBPcZaCyYUyrcTSVKnmaqfkTXsApKIQTVgvQBUBGHSyB8ns1P0LfRBvSlMWvYaNQmfuktFf6r6b8zwIQCj/Ny6a58/57TXNyv2nuRbuJrRjkpIEM0gJ6qfnoSbUaRtPtAVg/wc3IMiAFOJ0t2eMkizgbdudS4p++phNNNeBYeyXIiQlSbbNcDtDvNYtBS5FQ07/JmNw1+5d3ZRSAdAXYGwFoX5yNvefoUeQAUEEBABTyHgoRR31IFYSeAXSX0hApC0TTtDDBS/+RwbQTWP6CQja9reZsPJO7mm+UMvoH9pe5ZPBKVFQ4CfebzfkfSQAwFGB/BGCHb7/+xS++iL8PuC4B8BZNHaEHlU0C0F1KQ3D7r8IEc7Q4UgBsVZe/oJBFaashJc/krpwvUof3l6HMutm/9RAeUzRCqrcKAIIC7JUApLsp4gQ0KOItCyiSVAVvSNk7LBXscK6C2jEUJhG0/Jaj2Xh+wSGLFEw9L8/kpvxv9AVtxLjXV0//HsLjIE0VAtAYYedeHVgAYookVWEBCKbltxzNxvNLVQLQasl5IneFLQArZy+vAHT5P6sAwBTAnP6JCcCCuR3V3wcAL8MC4KnCAuApG+MRA9LCUGG2/4onAICSmeETgC47ZxYAkAKYLGxGsAAobuKqBTphAYgpZq7CAuApG+MRCUICRrNXhicAGd3viwD0ubmAAHgVQLewkUBGAEJKv46dCK5GAFrA9VnEJVxIFYSeAXSX0hDc/qswwbxEjrJiJ7D8BYUsfjK4Gp+M087PtHMwhfeXSoYvnDSGp7XlFgCIAigWROYfF5KuHkMYCtFcTwD0C5vltc7i0ge4aC62CooAAJf1xTdkUctpyedGYRJBy2E4qHAzXoPYCFh6h6mDZGfpgZCARozYO8IK7i9ySbR9FAEj4YnYZviWWQAACiBZGJP/bIEFQHFTxAn8iHaWiOn6AVWqFgApSQbY8jtSfkZMLSF2ZpaelkC2BLUgjqUXV5MI+DI2zKISmpjOgweD64mQ4JdbAHoFcErA/GL6KfuzAJjdFHECuqYPL4GMqoeAtLpAW+t1+fA0nM4y3E42lmI+OMPlVHVpTBudLCAAXgkY30kgZ38WALObIk6WXsQm1+CFrwQ2sDKQ11JS0xZnvQ5b5WO4cB1QNJVlhJ18LFFDr14oIxrGwEyooAC005yugdE84WuyUE3g3GABYAFwVobYYgEAVsG3fsgCUAgbDwxVZL6Vw0fz9r0TGW8TWwbKAhDrkAUA0Q4LQDpWEwCrCNiLy3wrh4/m9iOlZdTuA2ABiHXIAoBohwUgHboAKL85PuqFXWWRsE8C0D0OOvoh0JKbdBMAJwYvfjUurtcIroCcU5qm13LaWu+cJ8QnFstwOxlZYoZesVLdeexEiAUAEQCa4+vA0twkW4A4YTAYDEYIvHl1+yR24EfKzakGQE4YDAaDEQJ/Yv1f7//r5NycagDkxDgEBG2l0zCCEckajh2LcYlqCu+gWogBCjQVNrhiMo27c22eM5p20Q9rnDYElD8ucZ4atHd15mzj/gwBobgp4iRqDgBsmIgASC4w5wDgXtMQNQSeYrrEWHdWAXA5CGvcSnMAoZ4atEcW5WwjC4DipoiTpReUtQzICyJyhlyhirkKCO41DaGmktfXFFntks+4m35g49ZZBRTsaT5nRzmxy9RGFgDFTTbD7uEsFoBYhywAiGABAHg9DAHYPmn0ZZWXccvrY0f0QTSxwQKwNJcDLAChplkAlsUjqiaABSBGAMzp//AEQHHCAsACEGqaBWBZPKJqAlgA4gTA/yCjBJrYWEsAxm0oHQUrVAVSzegihXdQLcQABZoK1ym9Bu7OdXnOaNrmIKxxSrkScYnz1FCeBGYByOjEKAAIC71wV4tlFgCJagrvQAFAC1CgqTABMJnOuRRw9pHRtIt+WOM0AcgflzhPDeVloCwAGZ2YvKDsYNRekjvXSFQTeIfVQ9XHEFPhOpXoMAp5R/1c9EMza2zVJAR66soikcvYRhYAxU1kvaCHkRZqSypo0KTBkghNGiyZJiZYABQ3kfWCHkZKo2MQoUmDJRGaNFgKmuIt87WCRjQjBOC6ad582b766P4u1b396Uu51ov3jpvmSNq4K/L9zy9+9UdvNc33fvffd8n/b/7f3+nqfTEWuO6tvvqoq/fOl6E0sRHvJeBhpDQ6BhGaNFgSoUmDpSQAVWsAjWhGCsD/fCrOdu9+NpV4fiw2Hn04md8JwH8Qm39wcfHnb42fHwwFegGYKj542ZpRvQAEPIyURscgQpMGSyI0abCcadYtATSiGScAd88M4x2X8ijIQ2G++f6/mLe++1d6iU4A/nLe+KZFAeoXAPjDSGl0DCI0abAkQpMGS4VmxRpAI5pxAtCd+XfjPP2p+73p9+bo0Xe7us/vT/l9SOu/9e8uLv7/P9p9+M23+s+ScFyPVwwvd9UkY0Ca2EjxAn4YKY2OQYQmDZZEaNJgqdGsVgJoRDNWAO4Np+o3x2Jr90mcv2/Pdzn9s8H8Dr/dz/z+zT/vP3/eTwLvCgxDJr2xN4bB/1enohqUJjYqWgbq35AZ1S0DNZaKvXsg2Hsa0ByMZM2cU1uyUsqaaTtbJ5XXNowakNCNoos5LURUmZ3aPiMjUgCm4Y4p1Z/L4zdd9YeD+X4WuEc3/PMbfzasAurk4qEwNiX9bqv5EmDfBUAMgQVsyI2srpTWwJpmLhXFMsJ7IlDvPphh/jHBeiK9SK+CtrN1coXFpkEC4rtRbDG3ifAas1PbZ2xECsD02/WYv29Pp3H/sXAvBx3tH4yLP//6LXEx0DRTccVYpyLmkfT9FwDtF/+G3MgsAJILWNPMpSIFINh7IqLNa2MbU0IwGU1uyVoCIP51tk6voGO6DIB6wyjmNxFew/0vNiIFYFrxIgRgd/Iuj96Ir50AvCsJwA9MAjAvn7m2jQHtuQCITdI1n29DduT0pLQG1jRLqRiWEd5TEWtdG96eL1oMVtNbsooAzLSdrTPU0LeKywCYNyApZzGQjeAKsxYuP6MDQQD6L9fNAo978833/lgSgHcNAiCd83djQMbVlJQE4PZ0eRXjubZlAfA6PEgB0Cc4WQDsP/RbvTPCLAAWpxqCBeCyWSBCALSBJC9NbLAALDnltM0C4ESfy+SMxgJg/2Hc6pEAFgCLUw0GAZhmebEFQFr7vxcC0L7+zu2EBYAFAIIxkUkJjQXA/sNsxyUBLAAWpxpiBMA0fRshAOSHgLxODF6GbdIv/g25kdWV0hpY08ylolhGeE9EjPk5i80JTZB1xCKhJasIgETb2Tq9gsOO6zIAGCSEXhFeWXZq+xcbNqvn+l25syTY5gBM07eHOAfgdWIUAG1wyL8hNzILgNQaWNPMpSIFINh7IiLMyxlsymfaRbbuJLElawmAoO1snVzBY6d1SAAwSAi9IkYAZqe2z9iwWV2c0c+jM9ZJYEPqhgiAJBxUVwHdvvd/2Z5iZHBi8rLYwf4NmZF7TERqDaxpxlJxLCO8pyHcgZa+FAWwcS6fslCgibG3HbbftGoWDQAGKb1XRFSXndo+I8Nmd5HQ5w1GAegyuuFBPhABkEb9F9cdPprIiBaA0+boU7CTdQ6zUNCgSYNlOM1l6irwwIN9C+a6T4mgEU0bSz2hdyNA4yWBUQDac0UxxAUESACmS43p/mAwTWQkCEDTOJ5mrToh0TGI0KTBMpimKW/lz2Z7GMwVJYBGNK0su2U90rMdzuczdbMAdMl7Gr553owTBgsB2HTQBED46Z4FZHmkZvUC8MZ/e+J4mrXqhETHIEKTBstAmraklTub7W0wV9EAGtG0suxO+ZujB992H7/55FiSA7MADAtB3+le9PLNR9NpvS4Ap5sBqgA0dz/deXl2bJ5HcNLERYIAfNU/GnV60Y3LCYmOQYQmDZYhNJ0JK28y279g9lhJAmhE087yVnrmfyNfDlgEoH0qlx4vBhQBOO4EYPehUwB5Evj+XM08AERDAEYJe/vRL0H3AVwJRPrMDer9tyrgDVvn7DP7FswZaxxoNKLpYLn92bGU0B9Nwxs2AZDeCNbc/VKYnwVgczzNAagC8KdCOqYXiYXQxESaALTjxQ/gncCNeHKJDA83/0qARRF/HXsJwHIMr8GIFReB9RcsvVWMBaaOq5eKiIDJGcwGLLlPD76cyZlZgrmHsQy1bq81fxk/6XvBXDxqh0yxNfBO3MkaZJo2y+EHM7Z8gYK5ffGH/dn5nR/Kr/61CsD4TuDmzjwdKgnARhKAZqMuA/3mvUZ/v7BON6qVoUgWgB1e//zjHzvnAsSRO+5foBAsjg1AEX8dRwmNJhBKFWB9uVhofZ2lt4qxQCNhsSEwAkZnEAvAc/vO3pV49LGwbmIJ5h7EMti6vdb8RQ+3MGsuHrk7ribl1Hgn7mQNMk2bZYBHrcgyS6Rd1KQGE+7nQpz/bzbi404A2t3XvoB15b9uJyvNyU1kPdPjf+xORNS1Rrl3r7HKwrBaxF/HUcJG0w2lCrC+XCy0vs7SW0UUWARXpCKlVEQETM4AFsDHc8+yL6tZXwqAaWsaywjr9lrzlync7fSfo3h8MpAuA2ykkiHTtFkOPpgt+T9eFBCCCfQzpf85/3cCIBTgIAVA7d86jDvTXcVcxF/HVcJH028QWF8uFlxfY+mt0piiKzxPDHQzkd1vru4xEHjk7v4fz2VH6yaWYO5gllHW7bUWfsUZ7yJzmotHQURaspG4kzXING2Wgw9mW+eIVgWcYAIwCoCS/gcBGBVgPwTAb9hyheusJO86FgBbZWAV14GxsgAEpP+Z46AAo3UTSxYAC4M+2qQEAN472qCLhZICcLEQgEEBWABcmFMDC4Ctsq+K+VxozKHiMFhPAIKyfyvxxBSA8GRAWAD04bbqBSCof5ixsgBsjALQK8CBCIDiJCizjrtqPwTAlIrzCYAt8Ut/5+CuIwCh6V/mKU5j0wUgIhmQFgBVAjILwNXyJWVhBzNC/neyRDeuOjLk/4MXAK1/ezAkCUCVRRF/HUeJUJoGg8oX20mIWsxe3+pvUcV4ym9tsQjucCxoniMiYHRmtBCe/YXNntgcPTNLKPeRhI2lg0Z4ZCy7txEPumubrJPAkpXFSQFWiun3jNQO004OOpiz3MCAE0yIH0P+FwLQKcChCoB8heiH0AB3lYVVvxtHiQiaukHxxZyM561SHWN9pz+plEld/C2WGCw8R0TA6MxgIS79y9SmLmFmCeMu7YBAAYiJjHn3antgNmsunigAam+JborVwdiauWsudzTAoxQcHF4W80UE4MIiAG3/XKADFIA2uMONmdJnWbPqd2MvEUVTq9LYkr+AJAKW+l7+mhdvmAw2r5bLw8WXxMwwm9F+iMz+k80xNzSSbFqdu9DTsLL00ggob6glWqGfCTSu4qnJQDIp+iVi+p+vKOUDaLG3AR7nqljMTOYLCMDyAkARAKidbBQVN0WcRHpx5NEcwAk5hHNKwxplfCnKRFvgUctqMNF2ZKoRjUaho0xnIN58DA0KJk3sQ0oyp9CM9ZP9gM8uAIb8PwsAWAFYADqEHCXJwAg5nGxsu5A6Ru6o6kNOSN7S7BjOSxP5hLtXKAADg0sT9YiSbWk0o/zkP9hzC4Ap/0sC0LIABKKYCCCEPIhnXKvQOkbekE40kXdeiq0lkWICII36+DgZfsSmibZLVDsIw34FjvP8ArDM/6oAgBSABUBCGQ1AoRlcIbRRuGO3WLYWUEaqMA1HmzMRCQ1mnGtL7p9+dVbqPuMnA5zdohmxTfwHGUwm5UPmzGq8AJAFAHgJwAKg4UoDgkkNqTQjr3gDKyF2jJwKMAsAtuU4k+ZAA4Kp97tIOD1YncJpBgPhKNLrG2mGuCmR/zGD2Sxhzv+aAEAUgAVgiZCjKgLpI1Wx9UIqonaMfBKQsf8i6qw9ZaEirD3LSnmCmXgMLStbaILdFMn/eME0pP8u/zc+AYApAAuA0ZC2oK0DWhP8q5Qdv4+d3L6m02qgAWUJP0uYNwPtZQSn2vHLBSPX1DrszZSUYOlOTE6t4RULX+OzdxB342bhXeKKO1Xh2A2yM0Mx1yZDaJxlbTtg9nC1vIM4BxC75CLP96v8vQIAGgRiATDZaZQuiXmQtm6aumsNgoNSzP5FtxzSEBsHmLdlLYPfqTbYjJFmQm2DOZmSRFh3YnDqiKuQKeyUb+Zu3txI+8DiPymG7t0weTQUc2yC0JSrW+KqFUHrLi7kFYALmAD4FYAFwGZHstZ9xDts3QLgKjG5V4rZv5gsQ/OPXQAg3ky1Fm6n2mAzRsMJtU3mZKMzXd3JwqkzpIMA4NG0OjE4mC5ohj+u3Z8oAB4Tg1tDMfsmWzp3ODa2TyoynUJ5G5SIjAKwAQoA5BKABcBqZjI3bcA5eXPQXLgeoflVitm/2C0DmmFhCfNmq2VpBdSM0XJK7aU1jZKquPa/nlmORn8KTwZYHMzXauNfx45P4QZpn7T3tdMr4yYbUdWFcVeo3Xsusux92ZBPAPoJYKAAeBWAugA0CpBMqn/VDekiECQAVwpMxWIEQLIcyDJNAJpGSgIUBKBZcDX+9XWHmgQAYALRvQ6x+wEC0F8v+GlaHMvdWzmDy70fdF4Ihgz5HyYAgEsAFgCDSfVvePKE2bf9dGWAg2GsALTuC4FcAtBOoyUkBGBUAKcA+PsCC8BcbOxzHgEYYmo2BhKAVpl3mDbk3w86LwRDiwmAAAHwKQB1AVCcFBOADtESYKNpSvzu5JwqAK1DAzIKgFgUFC8A8mVEZgFovQIA6AcsAEoxx/Vsj+n3NAGYLI0/aacdTp7pyCUAm4MTgNcvu3+evf/jL3xOkNoy2FlcpC7MR0qA+VpVzvnAhKoc06Yv1ioqnFcZcNdgwpNPsRFsplXCFVEbzFMyKinA7GT6DuoDXWlMmlYnVulvIO6TyAHbNxaT+5xSU9u5AJpux7M5xWj+vJdJAMQdYDAB8CtA9QJwfdw0d7+6Oe5O9R54nKAJgDagZB1hipIAracrCQ04lqUUs39xNmrZENBNQTBvAO9X4uwMvJDTdF0Erw3CZEsyOp44qk7Gr8AOMAgA4jClk7t5M8B9ogAEdl3pfMexyU/T63jqNQ2oOBLyCMB0BzBQALyzALULwC7z37nf/L2zow+/fX7cPHY7wQu51kHsPSZCAXQBcLsGMLR/CbGs0bGWhXmDeNd0z1XdlPsnmpjH82RLMjorgF4Quvf7mtnTjsXBuBngPo1eRNedMnPTNOpJiMuY/gPAsdqzC6T/fAJwESoAbgWoXQDOm4dte9n0qf+6efOl00mZtmgIloB1aEIAuPzO4hJEylyuCE0LRfier3eXK1iFpn4R7AeNaGYRgE2wAPguASoXgNvTN74S/4o/difrdAx4zx1Qd/8tLADONArIDGVoygTCE1btu3zCWjTDgkkkmpkE4CJcAJwKwAKAgDAJOLD+64c5erAkW/JCZQFwdRq7nGliIocAbCIEwKMAlQvA9kk3+HM9vN745rjGIaAe+3c6WJKlIXrQDFuKZkzan0FjlzNNTGQQAPkZ0AciAO1lc/TTnx/f6VL/Tgweup2s2TF4CDMFavR4PHgdME1E4AuA8g4AuAC4FaB2Adhl/aY5enzZNCfdclC3k3U7BjRpHVj/BSJyeIWDiQimiQh0AVDfARMgAM554NoFoG2/+fjRd2376+Omecc5AARtS55VYAGrAgv2X7mtgav0kFkCFo9q2R/GN45mSB+Ar6J02Yit6TUMYwVb2Iy9phYKg0/kZaABnrGQQQAuogXArgD1C0CAE/ChgL7XR6Ogc9dyx5fcVmC7p2K4LBXvICpgvqlsgGWTuk2+JANjtShnrtjg3lUHhcGnk4a2OYFyztZiC8AmXgBcCnCAAgAuGuy6AT0ZoKQAmP+FVMEWAMk7iEoQ3xQ2wLJJ3SbvWSZEALRy5ooN7nM1oDD4dNJYCICjbLBnNCALgP4S4CABcAwCHZoAiDI58tvwt5aViyorYLvnYqgsFe8gKtD9FEMzpA/MFy3R7uKrQc1CgyQNBxorznu9pAIYfLpp6INZrrKhnvGAKwCLl8CHCoBNASgJgOk+gNAL9PwC4F0PxAIAoMICEGCWBcBaNtQzHlAFYJH/AwXArgAsABjQrLolgAUAQIUFIMAsC4C1bKhnPCALwDLVH54AtK+/czupRQDc40AsAAAqLAABZlkArGVDPeMBUwCWFwChAmBVAFIC4HMC8TIUwm720qpdAsodXDIrYLunYjkUUsmiICkC8k1hAyyb1G1y7XIoq0U5c8WGJ4HxgCgAhvwfLAA2BThAAcix8stg1ToOVFIAZlbAdk/FsAVA8g6iAuabygZYNqnb5BMAGKtFOXPFhpeB4gFPAEz5P1wALApQvwBsf/mybV99fPL2I/cAEPyULsceN1m1KEDBo0tmBWy3KIbMUvEOT1oAu8lsYGWTuk22XQ5ltShnrJjczkgYtchOI6RsuGcsoNk15v/DEYDL5o2vuhcC7HD0gcdJ6Y7rhVEC6qNpAg2WRGjSYMk0MaGeeS1gq7SAOf9bBcDhzagAtQvAdXP04OXunw++/fZnTak3guHBNA5UIU0DaLAkQpMGS6aJCW28EyIApnK7rG1J9cECYFSAygWgfxz08Ezo7mKg2sdB27FUgCppLkCDJRGaNFgyTUxMAgAfqjGV3eX/IAFweqMnAP3Sf7H+v9oXwrihS0ClNDXQYEmEJg2WTBMTOAKwQRaAhQKwAOSHNg5UK00VNFgSoUmDJdPEBIoAdBMAiAJgUIDKBWAY/TkfhoCKvRQefW2AIgFO0+iuY5HIolQ7Cgcrslkr7NIYpoX2WGrPoNE1MQSgnwDGFIClAlQuAMPbIG+O737Ztq9OC70RzD1RHwdJAVyGc7iOQxqHYu1YfcU6sF4ONm6PEUzL5MXknkGjayIIwLAACFsANprPjDGQ3ETXvGyaO++/1zQn95vmnscJmgBgWhOYJMAtADlcxyD1KEu3EeCoFGKbtYYARPgtd2K8qgCk24D7SRGAcQEoqgAsFKB6AWhfnI2SffQI5Y1gXggzGRTAZzeX6wigHKLFDrMyiG5W8f0Zx7SgYKe4otE1kwVA3ACAKwC6AtQvADt8+/UvfvGF+T5g/+LaYOTuIiwAiGABcDpkAchBIMRRtABMN4AhC4CmACQEwGWYBSAPaBxlLABuhywAOQiEOIoVgPkGYGwBUBWAugAoTlgA8EDjKGMBcDtkAchBIMRRpABID4BAFwBFAVgAbHayRYYngRHBk8AujzwJnIVAgJ9IAZAfAIQvALICsACY7GRdKOYWAF4GGugouwvFGy8DTQQvAwUIgPIAOAwB0LHp7zCWaGaPRhEnWF7ydhCn6UrSf3IwS7WjcLAim7XCLo1hWmiPpfYMGl0zQQDUB4DmEIBBASSa2aNRxEkVmdMLGjRpsCRCkwZLpomJaAHYaA+AxhCA5TYxCsQCUBw0aNJgSYQmDZZMExOxArB4/n8eARAKwAJQHDRo0mBJhCYNlkwTE3ECoJ/+5xOAUQFYAIqDBk0aLInQpMGSaWIiXAA2G0P6zycA/TwAC0B50KBJgyURmjRYMk1MOARgY0eeVG/ZOq8Fyh+NIk5IdAwiNGmwJEKTBkumiQmLADiSP8qrX0K2ttNaoPzRKOIE5GWthZaT34LerW31BwGZZcyidEiNzME0kKh2faWbQDMlJDv9ipaBItOUza24DHQ6zffdCFZIAJZPh84WjSJOIF6K3aJk9VvOt7WtgCDgsgyPOrBG3mAaSET1n7UFQO58Dvr13AiGTFM2VyoBLAVAGuSpRQCM74nPEo0iTmACAC6KitlvSQGY/4X9oBfJziS1Rm4BWPiI6j/rC4D410m/3ImxXwAcpWIEwPxvTmgCoA7xVyMApvfEZ4lGEScAL6JM6UNS8lvMtbWtkCCgsgyPOrRG1mAaSMT1n5UFYCbtpl+AJix+yDRlc8USgCIA+gRvPQLQEBeARgGkvPq3FFgAwoyyACCCBWD+u4YALNf3VCQAZbomCwALQJBRFgBEsADMf8sLgGl5JwtAFicsADafwB8MZfIySa7BAhDgngVgBQGw3NxlBguABa8+Pnnb90pgWFuKNtvot5xva1sBQcBlGR51YI28wTSQiOo/KwvAovNZ+JSgCYsfMk3ZXKkEMHiw3tzFAgDC7ekbX+3+XPbROXrscQITgDKrwOx+S4JHH7cAAArZSURBVAqApa2AIGALQGjUgTVyC8CCRFT/WV8A5s7noF9GACDxQ6YpmyuVADoP/Y1WZZP6XgrAdXP04bff/qw5+sztBORllfQv+y3o3dpWfxCQWcYkTUiNzME0kIjpP2sLgETaRb8ITeh+RaUpmyuUAMbB/zpSPW0B2D5p+nP/y+ae28nahxkMNGjSYEmEJg2WTBMTjXjaZg2pnrYAjONA7c3x8NfqhETHIEKTBksiNGmwZJqYaMQLV2pI9fshAOKv1QmJjkGEJg2WRGjSYMk0MTENudWQ6mkLQHs+DP7fHL/pXAhEo2MQoUmDJRGaNFgyTUywACjRiKx3e9o0d374yXE3+L895zmAcqDBkghNGiyZJiZYAJRoxFb8+pP3ukn7fiCocY8AEekYRGjSYEmEJg2WTBMTLABKNFIqb7/+5J91AvCO504w9LbkWTAGN7nWitXBd3GHMY0tTDNyj6yasuCcK8+soiF+mmseODOH8U8NqZ62AICdIHvJdMsI2GCpW1Yszkv7i2psWZqxe2TNbBTAefWk6cTUEMDdgSseODOJ8U8NqZ4FIN7emgKQxX+I89L+qheAOJ/rCgCYQe0CMP4LEID539XAAqBEo4gTXC/CXB5dWc9/mPfC7kLdFqUZvUdWzEUhnKsWgLkhPprrHjgaizpS/X4IgOk+gEYBhhfJtPoX2+5a/sO8F3bHAoAMFoCVMAlAvSgYJBaApd21/Id5L+yOBQAZLAArgQVAiQaKldffuZ2wAOCBBcDujAVgBRAVAEvqq2YrKQHwOeFJYDzwJLDVG08CrwKak8D1pHrz1v0SAAaDwWAEoERqThGA7S9fjm8Ecw8AsQAwGAxGIOJTcwDivVx2D4AY3wj2QZxvr3NAEDCM1H2FbUfgmNVaJWkCOJ6xtom6YaNv2R5YHMv8ISM6JNfN0YOXu38+6N4I1njeCWnxzQKQBhaAjGABQAALQO2IDUn/MrD5jWDux0HbfLMApIEFICNYABDAAlA7YkMS9EIYm28WgDSwAGQECwACWABqBwsAzE2VYAHICBYABLAA1I6kIaD2fBgCuuYhoFXAApARLAAIYAGoHSmTwJ+1N8d3v2zbV6fNwyjfLABpYAHICBYABLAA1I74kFw2zZ3332uak/uN542QVt8sAGlgAcgIFgAEsADUjoSQvDgbb1g4ehQzAMQCkAwWgIxgAUAAC0DtSAvJt1//4hdf+O4DtvtmAUgDC0BGsAAggAWgdqwZEhaARLAAZAQLAAJYAGoHCwDMTZVgAcgIFgAEsADUDhYAmJsqwQKQESwACGABqB0cEgaDwThQsAAwGAzGgYIFgMFgMA4ULAAMBoNxoGABYDAYjAMFCwCDwWAcKFgAGAwG40DBAsBgMBgHChYABoPBOFCwADAYDMaBggWAwWAwDhQsAAwGg3GgYAFgMBiMAwULAIPBYBwoWAAYDAbjQMECwGAwGAcKFgAGg8E4ULAAMBgMxoGiuAC8OGuau5/qW8+PPksz8vx+09z5MJDL5RtfSd9ePz2OsLE21DYYYQ55vL2WaqzC4IyEPwDbZ7sSb3/pceLs+NdNj7BjowposXvx3q4Vj14aixoi6eywlsjbAmkoHpUr9hWlBeBy6NMP9a1BnXxp5Nxo1oPnjdxNX50ONu4F2VgbahuMMIc83l5LNVZhcEbCH4Dtk6HEY6cTd8e/pCoAWuzGdrxpUgBDJJ0d1hJ5WyANxaNyxd6isADcHDcfdv1D3VvXYZ18aeS6OdqdMDw/DrGy/VmjdNPz5sF3nQ3PIVsV9DaYYA55vL0OFGMVBk8k/AG4bu5+2VlxhtPT8QOvi2uBHrub46MP+1RsCtYyku4Oa468NZDL4jG5Yo9RWAAuB+G9VPT35vjuWcjuWBoxmnXj5qy5eyZ109vT4QTlktBprd4GIwJiA7LX0oxVGDyR8Adg+2To0c4c7un42yeg4bjasIjd+ZB9r03BMkTS2WHNkbcGMtT84aGsAIjD4uZYuhzc9fP/9iRAAAxGpp0KPyM9P3r0P00H2M0xnaRma4MMY8gT7MmgFKswACPhDcDW1bF9Hf/2lGR49diJJOzEHElYh1Ui788gUvGIXLHPKC0AQ8e4PZU6yO4kyXmcAIzsLjJ3l3UvjgOS17cvzWdYlM4MbG2QYQx5gj0ZlGIVBmAkfAHYPnVdI/k6/nXz4OmxdfK0Wuix2yXf7Uf2SeABcyRhHVaJvD+DSMUjcsU+o6wAiJMBuYN0UhwkACYju8vOHe6GDeuZDvEbYh3Dm6ZM0UqxJ4FarMIAiIQnADfHTfMje9bzdvxxMtQ8eVo1lNhdN79/6muHFElQh1Ui788gSvGoXLG3WF0A+pHBZAH49XG/XCJsbZehi91Qm9dcUQDIxSoM/kj4AnBzctI079iynr/jnzfvfNmdq9K7ztIEoBnOue3tkCMJ6bBK5P2BVHdUVK7YW6wtAMNIX6oAXHZLLrouFpSRll3seb8AoXZcS+sL1xMAGrGKhzcSkABsz21jQPCOD5m9qQyaAPgG9ZVIAjqsUt4fSHVHxeWKvcXacwDiMhe2/NBiRGwJPFT0LrZ92hxR6BVBAhAyBwCxJ8oRiVU8PJEABsAadnjHJ7gYSJsDcGd0LZLeDquV9wXSYp6grGbB2quAogRANxJ4ljsbUopvn/TnBrQAEAD4KiCIPVGMYKzC4I4ENABWKywAU1k1kr4Oq5f3BFIvHpkr9hY13AcQOAS0NHJ7GpTkZq9yH9j1lAf0zgn8/Ths3TPsuKAZqzA4I+ENgDh/9XRJV8cXJq7pzQIrsdvFqj8DN4diGUl3h7VE3hbIRfHIXLG3qOJO4EABWBo5b+7+adv+3VnYdJl6iNNc0wiaqgTfCQwVAJqxCoMzEv4AnIuhZmdBzyRwZ4Li/dZq7K77GVfLqPsyku4Oa9UFaPG4XLG3WPFZQEKL21ABWBoRD14JE/V5tHFn4/ZUXEmSOjMAJOygZwGBBIBorMLgigQgAKJL3nNGyNnxb8+oPrVGObLa9qnx8T3tUEKK5Fjc1WFN5QePljuBF8XjcsXeYsWngcYLwNLI9ln3hL/AW2aUbnrdSF2FDiAJO+RpoCABIBqrMLgiAQlA/zRQ30Mn3R1/2z3JEvwc14qgCYDj+ZtKJEVxR4c1lm+tgTQVj8oVewt+HwCDwWAcKFgAGAwG40DBAsBgMBgHChYABoPBOFCwADAYDMaBggWAwWAwDhQsAAwGg3GgYAFgMBiMAwULAIPBYBwoWAAYDAbjQMECwGAwGAcKFgAGg8E4ULAAMBgMxoGCBYDBYDAOFCwADAaDcaBgAWAwGIwDBQsAg8FgHChYABgMBuNAwQLAYDAYBwoWAAaDwThQsAAwGAzGgYIFgMFgMA4ULAAMBoNxoGABYDAYjAMFCwCDwWAcKFgAGAwG40DBAsBgMBgHChYABoPBOFCwADAYDMaBggWAwWAwDhQsAAwGg3GgYAFgMBiMAwULAIPBYBwoWAAYDAbjQMECwGAwGAcKFgAGg8E4ULAAMBgMxoGCBYDBYDAOFCwADAaDcaBgAWAwGIwDBQsAg8FgHChYABgMBuNAwQLAYDAYBwoWAAaDwThQsAAwGAzGgYIFgMFgMA4ULAAMBoNxoGABYDAYjAMFCwCDwWAcKFgAGAwG40DBAsBgMBgHChYABoPBOFCwADAYDMaBggWAwWAwDhQsAAwGg3Gg+N9AjakmvbIdYQAAAABJRU5ErkJggg==" width="768" /></p>
</div>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>