-
Notifications
You must be signed in to change notification settings - Fork 0
/
Final.html
970 lines (968 loc) · 259 KB
/
Final.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
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
<?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="Dmitriy Burtsev" />
<title>Final Project - Is crime decreasing in the US according to the FBI Uniform Crime Reporting (UCR) Program</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;}
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > 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 {
pre > 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">
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > 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 {
pre > 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>
<script src="data:application/javascript;base64,Ly8gUGFuZG9jIDIuOSBhZGRzIGF0dHJpYnV0ZXMgb24gYm90aCBoZWFkZXIgYW5kIGRpdi4gV2UgcmVtb3ZlIHRoZSBmb3JtZXIgKHRvCi8vIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgYmVoYXZpb3Igb2YgUGFuZG9jIDwgMi44KS4KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKGUpIHsKICB2YXIgaHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJkaXYuc2VjdGlvbltjbGFzcyo9J2xldmVsJ10gPiA6Zmlyc3QtY2hpbGQiKTsKICB2YXIgaSwgaCwgYTsKICBmb3IgKGkgPSAwOyBpIDwgaHMubGVuZ3RoOyBpKyspIHsKICAgIGggPSBoc1tpXTsKICAgIGlmICghL15oWzEtNl0kL2kudGVzdChoLnRhZ05hbWUpKSBjb250aW51ZTsgIC8vIGl0IHNob3VsZCBiZSBhIGhlYWRlciBoMS1oNgogICAgYSA9IGguYXR0cmlidXRlczsKICAgIHdoaWxlIChhLmxlbmd0aCA+IDApIGgucmVtb3ZlQXR0cmlidXRlKGFbMF0ubmFtZSk7CiAgfQp9KTsK"></script>
<link href="data:text/css,%0Abody%0A%7B%0Amargin%3A%200%200%200%200%3B%0Apadding%3A%200%200%200%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Acolor%3A%20black%3B%0Abackground%2Dcolor%3A%20white%3B%0Afont%2Dfamily%3A%20%22Gill%20Sans%20MT%22%2C%20%22Gill%20Sans%22%2C%20GillSans%2C%20sans%2Dserif%3B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0Adiv%2Etoolbar%20%7B%0Aposition%3A%20fixed%3B%20z%2Dindex%3A%20200%3B%0Atop%3A%20auto%3B%20bottom%3A%200%3B%20left%3A%200%3B%20right%3A%200%3B%0Aheight%3A%201%2E2em%3B%20text%2Dalign%3A%20right%3B%0Apadding%2Dleft%3A%201em%3B%0Apadding%2Dright%3A%201em%3B%20font%2Dsize%3A%2060%25%3B%0Acolor%3A%20DimGray%3B%0Abackground%2Dcolor%3A%20rgb%28240%2C240%2C240%29%3B%0Aborder%2Dtop%3A%20solid%201px%20rgb%28180%2C180%2C180%29%3B%0A%7D%0Adiv%2Etoolbar%20span%2Ecopyright%20%7B%0Acolor%3A%20DimGray%3B%0Amargin%2Dleft%3A%200%2E5em%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20%7B%0Aposition%3A%20absolute%3B%0Az%2Dindex%3A%201000%3B%0Abottom%3A%201%2E2em%3B%0Awidth%3A%20100%25%3B%0Abackground%2Dcolor%3A%20rgb%28200%2C200%2C200%29%3B%0Aopacity%3A%200%2E35%3B%0Abackground%2Dcolor%3A%20rgb%28200%2C200%2C200%2C%200%2E35%29%3B%0Acursor%3A%20pointer%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20p%2Ehelp%20%7B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20p%2Eclose%20%7B%0Atext%2Dalign%3A%20right%3B%0Afont%2Dstyle%3A%20italic%3B%0A%7D%0Adiv%2Eslidy%5Ftoc%20%7B%0Aposition%3A%20absolute%3B%0Az%2Dindex%3A%20300%3B%0Awidth%3A%2060%25%3B%0Amax%2Dwidth%3A%2030em%3B%0Aheight%3A%2030em%3B%0Aoverflow%3A%20auto%3B%0Atop%3A%20auto%3B%0Aright%3A%20auto%3B%0Aleft%3A%204em%3B%0Abottom%3A%204em%3B%0Apadding%3A%201em%3B%0Abackground%3A%20rgb%28240%2C240%2C240%29%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dwidth%3A%202px%3B%0Afont%2Dsize%3A%2060%25%3B%0A%7D%0Adiv%2Eslidy%5Ftoc%20%2Etoc%5Fheading%20%7B%0Atext%2Dalign%3A%20center%3B%0Awidth%3A%20100%25%3B%0Amargin%3A%200%3B%0Amargin%2Dbottom%3A%201em%3B%0Aborder%2Dbottom%2Dstyle%3A%20solid%3B%0Aborder%2Dbottom%2Dcolor%3A%20rgb%28180%2C180%2C180%29%3B%0Aborder%2Dbottom%2Dwidth%3A%201px%3B%0A%7D%0Adiv%2Eslide%20%7B%0Az%2Dindex%3A%2020%3B%0Amargin%3A%200%200%200%200%3B%0Apadding%2Dtop%3A%200%3B%0Apadding%2Dbottom%3A%200%3B%0Apadding%2Dleft%3A%2020px%3B%0Apadding%2Dright%3A%2020px%3B%0Aborder%2Dwidth%3A%200%3B%0Aclear%3A%20both%3B%0Atop%3A%200%3B%0Abottom%3A%200%3B%0Aleft%3A%200%3B%0Aright%3A%200%3B%0Aline%2Dheight%3A%20120%25%3B%0Abackground%2Dcolor%3A%20transparent%3B%0A%7D%0Adiv%2Ebackground%20%7B%0Adisplay%3A%20none%3B%0A%7D%0Adiv%2Ehandout%20%7B%0Amargin%2Dleft%3A%2020px%3B%0Amargin%2Dright%3A%2020px%3B%0A%7D%0Adiv%2Eslide%2Etitlepage%20%7B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Adiv%2Eslide%2Etitlepage%20h1%20%7B%0Apadding%2Dtop%3A%2010%25%3B%0Amargin%2Dright%3A%200%3B%0A%7D%0Adiv%2Eslide%20h1%20%7B%0Apadding%2Dleft%3A%200%3B%0Apadding%2Dright%3A%2020pt%3B%0Apadding%2Dtop%3A%204pt%3B%0Apadding%2Dbottom%3A%204pt%3B%0Amargin%2Dtop%3A%200%3B%0Amargin%2Dleft%3A%200%3B%0Amargin%2Dright%3A%2060pt%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0Adisplay%3A%20block%3B%20font%2Dsize%3A%20160%25%3B%0Aline%2Dheight%3A%201%2E2em%3B%0Abackground%3A%20transparent%3B%0A%7D%0A%40media%20screen%20and%20%28max%2Ddevice%2Dwidth%3A%201024px%29%0A%7B%0Adiv%2Eslide%20%7B%20font%2Dsize%3A%20100%25%3B%20%7D%0A%7D%0A%40media%20screen%20and%20%28max%2Ddevice%2Dwidth%3A%20800px%29%0A%7B%0Adiv%2Eslide%20%7B%20font%2Dsize%3A%20200%25%3B%20%7D%0Adiv%2Eslidy%5Ftoc%20%7B%0Atop%3A%201em%3B%0Aleft%3A%201em%3B%0Aright%3A%20auto%3B%0Awidth%3A%2080%25%3B%0Afont%2Dsize%3A%20180%25%3B%0A%7D%0A%7D%0Adiv%2Etoc%2Dheading%20%7B%0Awidth%3A%20100%25%3B%0Aborder%2Dbottom%3A%20solid%201px%20rgb%28180%2C180%2C180%29%3B%0Amargin%2Dbottom%3A%201em%3B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Aimg%20%7B%0Aimage%2Drendering%3A%20optimize%2Dquality%3B%0A%7D%0Apre%20%7B%0Afont%2Dsize%3A%2080%25%3B%0Afont%2Dweight%3A%20bold%3B%0Aline%2Dheight%3A%20120%25%3B%0Apadding%2Dtop%3A%200%2E2em%3B%0Apadding%2Dbottom%3A%200%2E2em%3B%0Apadding%2Dleft%3A%201em%3B%0Apadding%2Dright%3A%201em%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dleft%2Dwidth%3A%201em%3B%0Aborder%2Dtop%2Dwidth%3A%20thin%3B%0Aborder%2Dright%2Dwidth%3A%20thin%3B%0Aborder%2Dbottom%2Dwidth%3A%20thin%3B%0Aborder%2Dcolor%3A%20%2395ABD0%3B%0Acolor%3A%20%2300428C%3B%0Abackground%2Dcolor%3A%20%23E4E5E7%3B%0A%7D%0Ali%20pre%20%7B%20margin%2Dleft%3A%200%3B%20%7D%0Ablockquote%20%7B%20font%2Dstyle%3A%20italic%20%7D%0Aimg%20%7B%20background%2Dcolor%3A%20transparent%20%7D%0Ap%2Ecopyright%20%7B%20font%2Dsize%3A%20smaller%20%7D%0A%2Ecenter%20%7B%20text%2Dalign%3A%20center%20%7D%0A%2Efootnote%20%7B%20font%2Dsize%3A%20smaller%3B%20margin%2Dleft%3A%202em%3B%20%7D%0Aa%20img%20%7B%20border%2Dwidth%3A%200%3B%20border%2Dstyle%3A%20none%20%7D%0Aa%3Avisited%20%7B%20color%3A%20navy%20%7D%0Aa%3Alink%20%7B%20color%3A%20navy%20%7D%0Aa%3Ahover%20%7B%20color%3A%20red%3B%20text%2Ddecoration%3A%20underline%20%7D%0Aa%3Aactive%20%7B%20color%3A%20red%3B%20text%2Ddecoration%3A%20underline%20%7D%0Aa%20%7Btext%2Ddecoration%3A%20none%7D%0A%2Etoolbar%20a%3Alink%20%7Bcolor%3A%20blue%7D%0A%2Etoolbar%20a%3Avisited%20%7Bcolor%3A%20blue%7D%0A%2Etoolbar%20a%3Aactive%20%7Bcolor%3A%20red%7D%0A%2Etoolbar%20a%3Ahover%20%7Bcolor%3A%20red%7D%0Aul%20%7B%20list%2Dstyle%2Dtype%3A%20square%3B%20%7D%0Aul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20circle%3B%20%7D%0Aul%20ul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Ali%20%7B%20margin%2Dleft%3A%200%2E5em%3B%20margin%2Dtop%3A%200%2E5em%3B%20%7D%0Ali%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20italic%20%7D%0Ali%20li%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20normal%20%7D%0Adiv%20dt%0A%7B%0Amargin%2Dleft%3A%200%3B%0Amargin%2Dtop%3A%201em%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0Adiv%20dd%0A%7B%0Amargin%2Dleft%3A%202em%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0A%7D%0Ap%2Cpre%2Cul%2Col%2Cblockquote%2Ch2%2Ch3%2Ch4%2Ch5%2Ch6%2Cdl%2Ctable%20%7B%0Amargin%2Dleft%3A%201em%3B%0Amargin%2Dright%3A%201em%3B%0A%7D%0Ap%2Esubhead%20%7B%20font%2Dweight%3A%20bold%3B%20margin%2Dtop%3A%202em%3B%20%7D%0A%2Esmaller%20%7B%20font%2Dsize%3A%20smaller%20%7D%0A%2Ebigger%20%7B%20font%2Dsize%3A%20130%25%20%7D%0Atd%2Cth%20%7B%20padding%3A%200%2E2em%20%7D%0Aul%20%7B%0Amargin%3A%200%2E5em%201%2E5em%200%2E5em%201%2E5em%3B%0Apadding%3A%200%3B%0A%7D%0Aol%20%7B%0Amargin%3A%200%2E5em%201%2E5em%200%2E5em%201%2E5em%3B%0Apadding%3A%200%3B%0A%7D%0Aul%20%7B%20list%2Dstyle%2Dtype%3A%20square%3B%20%7D%0Aul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20circle%3B%20%7D%0Aul%20ul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20li%20%7B%20list%2Dstyle%3A%20square%3B%0Amargin%3A%200%2E1em%200em%200%2E6em%200%3B%0Apadding%3A%200%200%200%200%3B%0Aline%2Dheight%3A%20140%25%3B%0A%7D%0Aol%20li%20%7B%20margin%3A%200%2E1em%200em%200%2E6em%201%2E5em%3B%0Apadding%3A%200%200%200%200px%3B%0Aline%2Dheight%3A%20140%25%3B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0Ali%20ul%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20italic%3B%0Alist%2Dstyle%2Dtype%3A%20disc%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20li%20ul%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20normal%3B%0Alist%2Dstyle%2Dtype%3A%20circle%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20li%20li%20ul%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20disc%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20ol%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0Ali%20li%20ol%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0A%0Aol%2Eoutline%20li%3Ahover%20%7B%20cursor%3A%20pointer%20%7D%0Aol%2Eoutline%20li%2Enofold%3Ahover%20%7B%20cursor%3A%20default%20%7D%0Aul%2Eoutline%20li%3Ahover%20%7B%20cursor%3A%20pointer%20%7D%0Aul%2Eoutline%20li%2Enofold%3Ahover%20%7B%20cursor%3A%20default%20%7D%0Aol%2Eoutline%20%7B%20list%2Dstyle%3Adecimal%3B%20%7D%0Aol%2Eoutline%20ol%20%7B%20list%2Dstyle%2Dtype%3Alower%2Dalpha%20%7D%0Aol%2Eoutline%20li%2Enofold%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAIACAMzMzOvr%2FywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Eunfolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Efolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Eunfolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Efolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Enofold%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAIACAMzMzOvr%2FywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Eunfolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Efolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Eunfolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Efolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0A%0Aa%2Etitleslide%20%7B%20font%2Dweight%3A%20bold%3B%20font%2Dstyle%3A%20italic%20%7D%0A%0Aimg%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Adiv%2Einitial%5Fprompt%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Adiv%2Eslide%20%7B%0Avisibility%3A%20visible%3B%0Aposition%3A%20inherit%3B%0A%7D%0Adiv%2Ehandout%20%7B%0Aborder%2Dtop%2Dstyle%3A%20solid%3B%0Aborder%2Dtop%2Dwidth%3A%20thin%3B%0Aborder%2Dtop%2Dcolor%3A%20black%3B%0A%7D%0A%40media%20screen%20%7B%0A%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20visible%20%7D%0Adiv%2Eslide%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Ehandout%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Ebackground%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20div%2Einitial%5Fprompt%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Abody%2Esingle%5Fslide%20div%2Ebackground%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Abody%2Esingle%5Fslide%20div%2Ebackground%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20%2Einvisible%20%7B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20div%2Eslide%20%7B%20position%3A%20absolute%20%7D%0Abody%2Esingle%5Fslide%20div%2Ehandout%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0A%7D%0A%40media%20print%20%7B%0A%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Eslide%20pre%20%7B%20font%2Dsize%3A%2060%25%3B%20padding%2Dleft%3A%200%2E5em%3B%20%7D%0Adiv%2Etoolbar%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Eslidy%5Ftoc%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Ebackground%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Eslide%20%7B%20page%2Dbreak%2Dbefore%3A%20always%20%7D%0A%0Adiv%2Eslide%2Efirst%2Dslide%20%7B%20page%2Dbreak%2Dbefore%3A%20avoid%20%7D%0A%7D%0A%0A%0A%2Ejslider%20table%20%7B%0Amargin%2Dleft%3A%200em%3B%0Amargin%2Dright%3A%200em%3B%0A%7D%0A%0Atable%2EdataTable%2C%20%2Eshiny%2Ddatatable%2Doutput%20div%20%7B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0A%0A%2EdataTables%5Finfo%2C%20%2EdataTables%5Fpaginate%20%7B%0Afont%2Dsize%3A%2019px%3B%0A%7D%0A%0Apre%2EsourceCode%2C%20code%2EsourceCode%20%7B%0Afont%2Dsize%3A%2080%25%3B%0A%7D%0A%0Alabel%2C%20button%2C%20input%2C%20select%2C%20textarea%20%7B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0A%0Aul%2Enav%2C%20ul%2Enav%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<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 src="data:application/javascript;base64,KGZ1bmN0aW9uKCkgewogIGlmICghd2luZG93LnczY19zbGlkeSkgcmV0dXJuOwogIGlmICghd2luZG93LlNoaW55KSByZXR1cm47CiAgaWYgKCF3aW5kb3cuJCkgcmV0dXJuOwogIC8vIHdoZW5ldmVyIGEgc2xpZGUgY2hhbmdlcywgdGVsbCBzaGlueSB0byByZWNhbGN1bGF0ZSB3aGF0IGlzIGRpc3BsYXllZAogIHdpbmRvdy53M2Nfc2xpZHkuYWRkX29ic2VydmVyKGZ1bmN0aW9uIChzbGlkZV9udW0pIHsKICAgIC8vIHNsaWRlX251bSBzdGFydHMgYXQgcG9zaXRpb24gMQogICAgJCh3M2Nfc2xpZHkuc2xpZGVzW3NsaWRlX251bSAtIDFdKS50cmlnZ2VyKCJzaG93biIpOwogIH0pOwp9KSgpCg=="></script>
</head>
<body>
<div class="slide titlepage">
<h1 class="title">Final Project - Is crime decreasing in the US according to the FBI Uniform Crime Reporting (UCR) Program</h1>
<p class="author">
Dmitriy Burtsev
</p>
</div>
<div id="load-library" class="slide section level2">
<h1>Load library</h1>
<div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="fu">library</span>(tidyverse)</span></code></pre></div>
<pre><code>## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --</code></pre>
<pre><code>## v ggplot2 3.3.3 v purrr 0.3.4
## v tibble 3.0.6 v dplyr 1.0.4
## v tidyr 1.1.2 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.1</code></pre>
<pre><code>## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()</code></pre>
<div class="sourceCode" id="cb5"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="fu">library</span>(htmltab)</span></code></pre></div>
<pre><code>## Warning: package 'htmltab' was built under R version 4.0.4</code></pre>
</div>
<div id="acquire-dataset-from-web-to-dataframe" class="slide section level2">
<h1>Acquire dataset from web to dataframe</h1>
<p><em>The FBI collects these data through the Uniform Crime Reporting (UCR) Program.</em> Crime in the United States, by Volume and Rate per 100,000 Inhabitants, 1997–2016 Violent crime includes the offenses of murder and nonnegligent manslaughter, rape (legacy definition), robbery, and aggravated assault. Property crime includes the offenses of burglary, larceny-theft, and motor vehicle theft. The UCR Program does not have sufficient data to estimate for arson.</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a>url <span class="ot"><-</span> <span class="st">"https://ucr.fbi.gov/crime-in-the-u.s/2016/crime-in-the-u.s.-2016/topic-pages/tables/table-1"</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>dfrm <span class="ot">=</span> <span class="fu">htmltab</span>(<span class="at">doc =</span> url, <span class="at">which =</span> <span class="dv">1</span>,<span class="at">rm_nodata_cols =</span> F)</span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a><span class="fu">class</span>(dfrm)</span></code></pre></div>
<pre><code>## [1] "data.frame"</code></pre>
</div>
<div id="convert-r-data-frame-to-tibble" class="slide section level2">
<h1>Convert R data frame to tibble</h1>
<p>I have to convert the original R data frame to Tibble data frame because our column names have spaces.</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a>df <span class="ot">=</span> <span class="fu">as_tibble</span>(dfrm)</span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a><span class="fu">class</span>(df)</span></code></pre></div>
<pre><code>## [1] "tbl_df" "tbl" "data.frame"</code></pre>
</div>
<div id="get-the-structure-of-the-data-frame." class="slide section level2">
<h1>Get the structure of the data frame.</h1>
<p>Function str Compactly Display the Structure of an Arbitrary R Object</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="fu">str</span>(df)</span></code></pre></div>
<pre><code>## tibble [20 x 22] (S3: tbl_df/tbl/data.frame)
## $ Year : chr [1:20] "1997" "1998" "1999" "2000" ...
## $ Population : chr [1:20] "267,783,607" "270,248,003" "272,690,813" "281,421,906" ...
## $ Violentcrime : chr [1:20] "1,636,096" "1,533,887" "1,426,044" "1,425,486" ...
## $ Violent crime rate : chr [1:20] "611.0" "567.6" "523.0" "506.5" ...
## $ Murder andnonnegligent manslaughter : chr [1:20] "18,208" "16,974" "15,522" "15,586" ...
## $ Murder and nonnegligent manslaughter rate: chr [1:20] "6.8" "6.3" "5.7" "5.5" ...
## $ Rape(revised definition) : chr [1:20] NA NA NA NA ...
## $ Rape(revised definition) rate : chr [1:20] NA NA NA NA ...
## $ Rape(legacy definition) : chr [1:20] "96,153" "93,144" "89,411" "90,178" ...
## $ Rape(legacy definition) rate : chr [1:20] "35.9" "34.5" "32.8" "32.0" ...
## $ Robbery : chr [1:20] "498,534" "447,186" "409,371" "408,016" ...
## $ Robbery rate : chr [1:20] "186.2" "165.5" "150.1" "145.0" ...
## $ Aggravated assault : chr [1:20] "1,023,201" "976,583" "911,740" "911,706" ...
## $ Aggravated assault rate : chr [1:20] "382.1" "361.4" "334.3" "324.0" ...
## $ Property crime : chr [1:20] "11,558,475" "10,951,827" "10,208,334" "10,182,584" ...
## $ Property crime rate : chr [1:20] "4,316.3" "4,052.5" "3,743.6" "3,618.3" ...
## $ Burglary : chr [1:20] "2,460,526" "2,332,735" "2,100,739" "2,050,992" ...
## $ Burglary rate : chr [1:20] "918.8" "863.2" "770.4" "728.8" ...
## $ Larceny-theft : chr [1:20] "7,743,760" "7,376,311" "6,955,520" "6,971,590" ...
## $ Larceny-theft rate : chr [1:20] "2,891.8" "2,729.5" "2,550.7" "2,477.3" ...
## $ Motor vehicle theft : chr [1:20] "1,354,189" "1,242,781" "1,152,075" "1,160,002" ...
## $ Motor vehicle theft rate : chr [1:20] "505.7" "459.9" "422.5" "412.2" ...</code></pre>
</div>
<div id="data-clean-up-and-transformations---remove-rows-with-na" class="slide section level2">
<h1>Data clean up and transformations - Remove Rows with NA</h1>
<p>Show the number of NA’s in each column of the data frame</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="fu">colSums</span>(<span class="fu">is.na</span>(df))</span></code></pre></div>
<pre><code>## Year
## 0
## Population
## 0
## Violentcrime
## 0
## Violent crime rate
## 0
## Murder andnonnegligent manslaughter
## 0
## Murder and nonnegligent manslaughter rate
## 0
## Rape(revised definition)
## 16
## Rape(revised definition) rate
## 16
## Rape(legacy definition)
## 0
## Rape(legacy definition) rate
## 0
## Robbery
## 0
## Robbery rate
## 0
## Aggravated assault
## 0
## Aggravated assault rate
## 0
## Property crime
## 0
## Property crime rate
## 0
## Burglary
## 0
## Burglary rate
## 0
## Larceny-theft
## 0
## Larceny-theft rate
## 0
## Motor vehicle theft
## 0
## Motor vehicle theft rate
## 0</code></pre>
</div>
<div id="there-are-two-colums-with-na-raperevised-definition-and-raperevised-definition-rate" class="slide section level2">
<h1>There are two colums with NA: Rape(revised definition) and Rape(revised definition) rate</h1>
<p>We should remove colums with NA</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a>df <span class="ot">=</span> <span class="fu">select</span>(df, <span class="sc">-</span><span class="fu">c</span>(<span class="st">`</span><span class="at">Rape(revised definition)</span><span class="st">`</span>,<span class="st">`</span><span class="at">Rape(revised definition) rate</span><span class="st">`</span>))</span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true" tabindex="-1"></a><span class="fu">str</span>(df)</span></code></pre></div>
<pre><code>## tibble [20 x 20] (S3: tbl_df/tbl/data.frame)
## $ Year : chr [1:20] "1997" "1998" "1999" "2000" ...
## $ Population : chr [1:20] "267,783,607" "270,248,003" "272,690,813" "281,421,906" ...
## $ Violentcrime : chr [1:20] "1,636,096" "1,533,887" "1,426,044" "1,425,486" ...
## $ Violent crime rate : chr [1:20] "611.0" "567.6" "523.0" "506.5" ...
## $ Murder andnonnegligent manslaughter : chr [1:20] "18,208" "16,974" "15,522" "15,586" ...
## $ Murder and nonnegligent manslaughter rate: chr [1:20] "6.8" "6.3" "5.7" "5.5" ...
## $ Rape(legacy definition) : chr [1:20] "96,153" "93,144" "89,411" "90,178" ...
## $ Rape(legacy definition) rate : chr [1:20] "35.9" "34.5" "32.8" "32.0" ...
## $ Robbery : chr [1:20] "498,534" "447,186" "409,371" "408,016" ...
## $ Robbery rate : chr [1:20] "186.2" "165.5" "150.1" "145.0" ...
## $ Aggravated assault : chr [1:20] "1,023,201" "976,583" "911,740" "911,706" ...
## $ Aggravated assault rate : chr [1:20] "382.1" "361.4" "334.3" "324.0" ...
## $ Property crime : chr [1:20] "11,558,475" "10,951,827" "10,208,334" "10,182,584" ...
## $ Property crime rate : chr [1:20] "4,316.3" "4,052.5" "3,743.6" "3,618.3" ...
## $ Burglary : chr [1:20] "2,460,526" "2,332,735" "2,100,739" "2,050,992" ...
## $ Burglary rate : chr [1:20] "918.8" "863.2" "770.4" "728.8" ...
## $ Larceny-theft : chr [1:20] "7,743,760" "7,376,311" "6,955,520" "6,971,590" ...
## $ Larceny-theft rate : chr [1:20] "2,891.8" "2,729.5" "2,550.7" "2,477.3" ...
## $ Motor vehicle theft : chr [1:20] "1,354,189" "1,242,781" "1,152,075" "1,160,002" ...
## $ Motor vehicle theft rate : chr [1:20] "505.7" "459.9" "422.5" "412.2" ...</code></pre>
</div>
<div id="all-colums-in-dataframe-are-string.-we-should-change-some-to-integers-or-numbers" class="slide section level2">
<h1>All colums in dataframe are string. We should change some to integers or numbers</h1>
<div class="sourceCode" id="cb17"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Year"</span>]] <span class="ot">=</span> <span class="fu">as.integer</span>(df[[<span class="st">"Year"</span>]])</span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Population"</span>]] <span class="ot">=</span> <span class="fu">as.integer</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Population"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-3"><a href="#cb17-3" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Violentcrime"</span>]] <span class="ot">=</span> <span class="fu">as.integer</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Violentcrime"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-4"><a href="#cb17-4" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Violent crime rate"</span>]] <span class="ot">=</span> <span class="fu">as.numeric</span>(df[[<span class="st">"Violent crime rate"</span>]])</span>
<span id="cb17-5"><a href="#cb17-5" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Murder andnonnegligent manslaughter"</span>]] <span class="ot">=</span> <span class="fu">as.integer</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Murder andnonnegligent manslaughter"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-6"><a href="#cb17-6" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Murder and nonnegligent manslaughter rate"</span>]] <span class="ot">=</span> <span class="fu">as.numeric</span>(df[[<span class="st">"Murder and nonnegligent manslaughter rate"</span>]])</span>
<span id="cb17-7"><a href="#cb17-7" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Rape(legacy definition)"</span>]] <span class="ot">=</span> <span class="fu">as.integer</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Rape(legacy definition)"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-8"><a href="#cb17-8" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Rape(legacy definition) rate"</span>]] <span class="ot">=</span> <span class="fu">as.numeric</span>(df[[<span class="st">"Rape(legacy definition) rate"</span>]])</span>
<span id="cb17-9"><a href="#cb17-9" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Robbery"</span>]] <span class="ot">=</span> <span class="fu">as.integer</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Robbery"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-10"><a href="#cb17-10" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Robbery rate"</span>]] <span class="ot">=</span> <span class="fu">as.numeric</span>(df[[<span class="st">"Robbery rate"</span>]])</span>
<span id="cb17-11"><a href="#cb17-11" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Aggravated assault"</span>]] <span class="ot">=</span> <span class="fu">as.integer</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Aggravated assault"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-12"><a href="#cb17-12" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Aggravated assault rate"</span>]] <span class="ot">=</span> <span class="fu">as.numeric</span>(df[[<span class="st">"Aggravated assault rate"</span>]])</span>
<span id="cb17-13"><a href="#cb17-13" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Property crime"</span>]] <span class="ot">=</span> <span class="fu">as.integer</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Property crime"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-14"><a href="#cb17-14" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Property crime rate"</span>]] <span class="ot">=</span> <span class="fu">as.numeric</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Property crime rate"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-15"><a href="#cb17-15" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Burglary"</span>]] <span class="ot">=</span> <span class="fu">as.integer</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Burglary"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-16"><a href="#cb17-16" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Burglary rate"</span>]] <span class="ot">=</span> <span class="fu">as.numeric</span>(df[[<span class="st">"Burglary rate"</span>]])</span>
<span id="cb17-17"><a href="#cb17-17" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Larceny-theft"</span>]] <span class="ot">=</span> <span class="fu">as.integer</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Larceny-theft"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-18"><a href="#cb17-18" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Larceny-theft rate"</span>]] <span class="ot">=</span> <span class="fu">as.numeric</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Larceny-theft rate"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-19"><a href="#cb17-19" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Motor vehicle theft"</span>]] <span class="ot">=</span> <span class="fu">as.integer</span>(<span class="fu">gsub</span>(<span class="st">","</span>, <span class="st">""</span>, df[[<span class="st">"Motor vehicle theft"</span>]], <span class="at">fixed =</span> <span class="cn">TRUE</span>))</span>
<span id="cb17-20"><a href="#cb17-20" aria-hidden="true" tabindex="-1"></a>df[[<span class="st">"Motor vehicle theft rate"</span>]] <span class="ot">=</span> <span class="fu">as.numeric</span>(df[[<span class="st">"Motor vehicle theft rate"</span>]])</span></code></pre></div>
</div>
<div id="create-a-table-directly-from-r-markdown" class="slide section level2">
<h1>Create a table directly from R Markdown</h1>
<div class="sourceCode" id="cb18"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a>knitr<span class="sc">::</span><span class="fu">kable</span>(df, <span class="at">caption =</span> <span class="st">'Crime in the United States'</span>)</span></code></pre></div>
<table>
<caption>Crime in the United States</caption>
<colgroup>
<col width="1%" />
<col width="2%" />
<col width="3%" />
<col width="5%" />
<col width="9%" />
<col width="11%" />
<col width="6%" />
<col width="7%" />
<col width="2%" />
<col width="3%" />
<col width="5%" />
<col width="6%" />
<col width="3%" />
<col width="5%" />
<col width="2%" />
<col width="3%" />
<col width="3%" />
<col width="5%" />
<col width="5%" />
<col width="6%" />
</colgroup>
<thead>
<tr class="header">
<th align="right">Year</th>
<th align="right">Population</th>
<th align="right">Violentcrime</th>
<th align="right">Violent crime rate</th>
<th align="right">Murder andnonnegligent manslaughter</th>
<th align="right">Murder and nonnegligent manslaughter rate</th>
<th align="right">Rape(legacy definition)</th>
<th align="right">Rape(legacy definition) rate</th>
<th align="right">Robbery</th>
<th align="right">Robbery rate</th>
<th align="right">Aggravated assault</th>
<th align="right">Aggravated assault rate</th>
<th align="right">Property crime</th>
<th align="right">Property crime rate</th>
<th align="right">Burglary</th>
<th align="right">Burglary rate</th>
<th align="right">Larceny-theft</th>
<th align="right">Larceny-theft rate</th>
<th align="right">Motor vehicle theft</th>
<th align="right">Motor vehicle theft rate</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td align="right">1997</td>
<td align="right">267783607</td>
<td align="right">1636096</td>
<td align="right">611.0</td>
<td align="right">18208</td>
<td align="right">6.8</td>
<td align="right">96153</td>
<td align="right">35.9</td>
<td align="right">498534</td>
<td align="right">186.2</td>
<td align="right">1023201</td>
<td align="right">382.1</td>
<td align="right">11558475</td>
<td align="right">4316.3</td>
<td align="right">2460526</td>
<td align="right">918.8</td>
<td align="right">7743760</td>
<td align="right">2891.8</td>
<td align="right">1354189</td>
<td align="right">505.7</td>
</tr>
<tr class="even">
<td align="right">1998</td>
<td align="right">270248003</td>
<td align="right">1533887</td>
<td align="right">567.6</td>
<td align="right">16974</td>
<td align="right">6.3</td>
<td align="right">93144</td>
<td align="right">34.5</td>
<td align="right">447186</td>
<td align="right">165.5</td>
<td align="right">976583</td>
<td align="right">361.4</td>
<td align="right">10951827</td>
<td align="right">4052.5</td>
<td align="right">2332735</td>
<td align="right">863.2</td>
<td align="right">7376311</td>
<td align="right">2729.5</td>
<td align="right">1242781</td>
<td align="right">459.9</td>
</tr>
<tr class="odd">
<td align="right">1999</td>
<td align="right">272690813</td>
<td align="right">1426044</td>
<td align="right">523.0</td>
<td align="right">15522</td>
<td align="right">5.7</td>
<td align="right">89411</td>
<td align="right">32.8</td>
<td align="right">409371</td>
<td align="right">150.1</td>
<td align="right">911740</td>
<td align="right">334.3</td>
<td align="right">10208334</td>
<td align="right">3743.6</td>
<td align="right">2100739</td>
<td align="right">770.4</td>
<td align="right">6955520</td>
<td align="right">2550.7</td>
<td align="right">1152075</td>
<td align="right">422.5</td>
</tr>
<tr class="even">
<td align="right">2000</td>
<td align="right">281421906</td>
<td align="right">1425486</td>
<td align="right">506.5</td>
<td align="right">15586</td>
<td align="right">5.5</td>
<td align="right">90178</td>
<td align="right">32.0</td>
<td align="right">408016</td>
<td align="right">145.0</td>
<td align="right">911706</td>
<td align="right">324.0</td>
<td align="right">10182584</td>
<td align="right">3618.3</td>
<td align="right">2050992</td>
<td align="right">728.8</td>
<td align="right">6971590</td>
<td align="right">2477.3</td>
<td align="right">1160002</td>
<td align="right">412.2</td>
</tr>
<tr class="odd">
<td align="right">2001</td>
<td align="right">285317559</td>
<td align="right">1439480</td>
<td align="right">504.5</td>
<td align="right">16037</td>
<td align="right">5.6</td>
<td align="right">90863</td>
<td align="right">31.8</td>
<td align="right">423557</td>
<td align="right">148.5</td>
<td align="right">909023</td>
<td align="right">318.6</td>
<td align="right">10437189</td>
<td align="right">3658.1</td>
<td align="right">2116531</td>
<td align="right">741.8</td>
<td align="right">7092267</td>
<td align="right">2485.7</td>
<td align="right">1228391</td>
<td align="right">430.5</td>
</tr>
<tr class="even">
<td align="right">2002</td>
<td align="right">287973924</td>
<td align="right">1423677</td>
<td align="right">494.4</td>
<td align="right">16229</td>
<td align="right">5.6</td>
<td align="right">95235</td>
<td align="right">33.1</td>
<td align="right">420806</td>
<td align="right">146.1</td>
<td align="right">891407</td>
<td align="right">309.5</td>
<td align="right">10455277</td>
<td align="right">3630.6</td>
<td align="right">2151252</td>
<td align="right">747.0</td>
<td align="right">7057379</td>
<td align="right">2450.7</td>
<td align="right">1246646</td>
<td align="right">432.9</td>
</tr>
<tr class="odd">
<td align="right">2003</td>
<td align="right">290788976</td>
<td align="right">1383676</td>
<td align="right">475.8</td>
<td align="right">16528</td>
<td align="right">5.7</td>
<td align="right">93883</td>
<td align="right">32.3</td>
<td align="right">414235</td>
<td align="right">142.5</td>
<td align="right">859030</td>
<td align="right">295.4</td>
<td align="right">10442862</td>
<td align="right">3591.2</td>
<td align="right">2154834</td>
<td align="right">741.0</td>
<td align="right">7026802</td>
<td align="right">2416.5</td>
<td align="right">1261226</td>
<td align="right">433.7</td>
</tr>
<tr class="even">
<td align="right">2004</td>
<td align="right">293656842</td>
<td align="right">1360088</td>
<td align="right">463.2</td>
<td align="right">16148</td>
<td align="right">5.5</td>
<td align="right">95089</td>
<td align="right">32.4</td>
<td align="right">401470</td>
<td align="right">136.7</td>
<td align="right">847381</td>
<td align="right">288.6</td>
<td align="right">10319386</td>
<td align="right">3514.1</td>
<td align="right">2144446</td>
<td align="right">730.3</td>
<td align="right">6937089</td>
<td align="right">2362.3</td>
<td align="right">1237851</td>
<td align="right">421.5</td>
</tr>
<tr class="odd">
<td align="right">2005</td>
<td align="right">296507061</td>
<td align="right">1390745</td>
<td align="right">469.0</td>
<td align="right">16740</td>
<td align="right">5.6</td>
<td align="right">94347</td>
<td align="right">31.8</td>
<td align="right">417438</td>
<td align="right">140.8</td>
<td align="right">862220</td>
<td align="right">290.8</td>
<td align="right">10174754</td>
<td align="right">3431.5</td>
<td align="right">2155448</td>
<td align="right">726.9</td>
<td align="right">6783447</td>
<td align="right">2287.8</td>
<td align="right">1235859</td>
<td align="right">416.8</td>
</tr>
<tr class="even">
<td align="right">2006</td>
<td align="right">299398484</td>
<td align="right">1435123</td>
<td align="right">479.3</td>
<td align="right">17309</td>
<td align="right">5.8</td>
<td align="right">94472</td>
<td align="right">31.6</td>
<td align="right">449246</td>
<td align="right">150.0</td>
<td align="right">874096</td>
<td align="right">292.0</td>
<td align="right">10019601</td>
<td align="right">3346.6</td>
<td align="right">2194993</td>
<td align="right">733.1</td>
<td align="right">6626363</td>
<td align="right">2213.2</td>
<td align="right">1198245</td>
<td align="right">400.2</td>
</tr>
<tr class="odd">
<td align="right">2007</td>
<td align="right">301621157</td>
<td align="right">1422970</td>
<td align="right">471.8</td>
<td align="right">17128</td>
<td align="right">5.7</td>
<td align="right">92160</td>
<td align="right">30.6</td>
<td align="right">447324</td>
<td align="right">148.3</td>
<td align="right">866358</td>
<td align="right">287.2</td>
<td align="right">9882212</td>
<td align="right">3276.4</td>
<td align="right">2190198</td>
<td align="right">726.1</td>
<td align="right">6591542</td>
<td align="right">2185.4</td>
<td align="right">1100472</td>
<td align="right">364.9</td>
</tr>
<tr class="even">
<td align="right">2008</td>
<td align="right">304059724</td>
<td align="right">1394461</td>
<td align="right">458.6</td>
<td align="right">16465</td>
<td align="right">5.4</td>
<td align="right">90750</td>
<td align="right">29.8</td>
<td align="right">443563</td>
<td align="right">145.9</td>
<td align="right">843683</td>
<td align="right">277.5</td>
<td align="right">9774152</td>
<td align="right">3214.6</td>
<td align="right">2228887</td>
<td align="right">733.0</td>
<td align="right">6586206</td>
<td align="right">2166.1</td>
<td align="right">959059</td>
<td align="right">315.4</td>
</tr>
<tr class="odd">
<td align="right">2009</td>
<td align="right">307006550</td>
<td align="right">1325896</td>
<td align="right">431.9</td>
<td align="right">15399</td>
<td align="right">5.0</td>
<td align="right">89241</td>
<td align="right">29.1</td>
<td align="right">408742</td>
<td align="right">133.1</td>
<td align="right">812514</td>
<td align="right">264.7</td>
<td align="right">9337060</td>
<td align="right">3041.3</td>
<td align="right">2203313</td>
<td align="right">717.7</td>
<td align="right">6338095</td>
<td align="right">2064.5</td>
<td align="right">795652</td>
<td align="right">259.2</td>
</tr>
<tr class="even">
<td align="right">2010</td>
<td align="right">309330219</td>
<td align="right">1251248</td>
<td align="right">404.5</td>
<td align="right">14722</td>
<td align="right">4.8</td>
<td align="right">85593</td>
<td align="right">27.7</td>
<td align="right">369089</td>
<td align="right">119.3</td>
<td align="right">781844</td>
<td align="right">252.8</td>
<td align="right">9112625</td>
<td align="right">2945.9</td>
<td align="right">2168459</td>
<td align="right">701.0</td>
<td align="right">6204601</td>
<td align="right">2005.8</td>
<td align="right">739565</td>
<td align="right">239.1</td>
</tr>
<tr class="odd">
<td align="right">2011</td>
<td align="right">311587816</td>
<td align="right">1206005</td>
<td align="right">387.1</td>
<td align="right">14661</td>
<td align="right">4.7</td>
<td align="right">84175</td>
<td align="right">27.0</td>
<td align="right">354746</td>
<td align="right">113.9</td>
<td align="right">752423</td>
<td align="right">241.5</td>
<td align="right">9052743</td>
<td align="right">2905.4</td>
<td align="right">2185140</td>
<td align="right">701.3</td>
<td align="right">6151095</td>
<td align="right">1974.1</td>
<td align="right">716508</td>
<td align="right">230.0</td>
</tr>
<tr class="even">
<td align="right">2012</td>
<td align="right">313873685</td>
<td align="right">1217057</td>
<td align="right">387.8</td>
<td align="right">14856</td>
<td align="right">4.7</td>
<td align="right">85141</td>
<td align="right">27.1</td>
<td align="right">355051</td>
<td align="right">113.1</td>
<td align="right">762009</td>
<td align="right">242.8</td>
<td align="right">9001992</td>
<td align="right">2868.0</td>
<td align="right">2109932</td>
<td align="right">672.2</td>
<td align="right">6168874</td>
<td align="right">1965.4</td>
<td align="right">723186</td>
<td align="right">230.4</td>
</tr>
<tr class="odd">
<td align="right">2013</td>
<td align="right">316497531</td>
<td align="right">1168298</td>
<td align="right">369.1</td>
<td align="right">14319</td>
<td align="right">4.5</td>
<td align="right">82109</td>
<td align="right">25.9</td>
<td align="right">345093</td>
<td align="right">109.0</td>
<td align="right">726777</td>
<td align="right">229.6</td>
<td align="right">8651892</td>
<td align="right">2733.6</td>
<td align="right">1932139</td>
<td align="right">610.5</td>
<td align="right">6019465</td>
<td align="right">1901.9</td>
<td align="right">700288</td>
<td align="right">221.3</td>
</tr>
<tr class="even">
<td align="right">2014</td>
<td align="right">318907401</td>
<td align="right">1153022</td>
<td align="right">361.6</td>
<td align="right">14164</td>
<td align="right">4.4</td>
<td align="right">84864</td>
<td align="right">26.6</td>
<td align="right">322905</td>
<td align="right">101.3</td>
<td align="right">731089</td>
<td align="right">229.2</td>
<td align="right">8209010</td>
<td align="right">2574.1</td>
<td align="right">1713153</td>
<td align="right">537.2</td>
<td align="right">5809054</td>
<td align="right">1821.5</td>
<td align="right">686803</td>
<td align="right">215.4</td>
</tr>
<tr class="odd">
<td align="right">2015</td>
<td align="right">320896618</td>
<td align="right">1199310</td>
<td align="right">373.7</td>
<td align="right">15883</td>
<td align="right">4.9</td>
<td align="right">91261</td>
<td align="right">28.4</td>
<td align="right">328109</td>
<td align="right">102.2</td>
<td align="right">764057</td>
<td align="right">238.1</td>
<td align="right">8024115</td>
<td align="right">2500.5</td>
<td align="right">1587564</td>
<td align="right">494.7</td>
<td align="right">5723488</td>
<td align="right">1783.6</td>
<td align="right">713063</td>
<td align="right">222.2</td>
</tr>
<tr class="even">
<td align="right">2016</td>
<td align="right">323127513</td>
<td align="right">1248185</td>
<td align="right">386.3</td>
<td align="right">17250</td>
<td align="right">5.3</td>
<td align="right">95730</td>
<td align="right">29.6</td>
<td align="right">332198</td>
<td align="right">102.8</td>
<td align="right">803007</td>
<td align="right">248.5</td>
<td align="right">7919035</td>
<td align="right">2450.7</td>
<td align="right">1515096</td>
<td align="right">468.9</td>
<td align="right">5638455</td>
<td align="right">1745.0</td>
<td align="right">765484</td>
<td align="right">236.9</td>
</tr>
</tbody>
</table>
</div>
<div id="summary-of-data-in-data-frame" class="slide section level2">
<h1>Summary of Data in Data Frame</h1>
<p>The statistical summary and nature of the data can be obtained by applying summary() function</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true" tabindex="-1"></a><span class="fu">print</span>(<span class="fu">summary</span>(df)) </span></code></pre></div>
<pre><code>## Year Population Violentcrime Violent crime rate
## Min. :1997 Min. :267783607 Min. :1153022 Min. :361.6
## 1st Qu.:2002 1st Qu.:287309833 1st Qu.:1240403 1st Qu.:387.6
## Median :2006 Median :300509820 Median :1387211 Median :466.1
## Mean :2006 Mean :298634769 Mean :1352038 Mean :456.3
## 3rd Qu.:2011 3rd Qu.:312159283 3rd Qu.:1425626 3rd Qu.:496.9
## Max. :2016 Max. :323127513 Max. :1636096 Max. :611.0
## Murder andnonnegligent manslaughter Murder and nonnegligent manslaughter rate
## Min. :14164 Min. :4.400
## 1st Qu.:15263 1st Qu.:4.875
## Median :16092 Median :5.500
## Mean :16006 Mean :5.375
## 3rd Qu.:16799 3rd Qu.:5.700
## Max. :18208 Max. :6.800
## Rape(legacy definition) Rape(legacy definition) rate Robbery
## Min. :82109 Min. :25.90 Min. :322905
## 1st Qu.:88329 1st Qu.:28.23 1st Qu.:354975
## Median :91062 Median :31.10 Median :409057
## Mean :90690 Mean :30.50 Mean :399834
## 3rd Qu.:94378 3rd Qu.:32.33 3rd Qu.:428559
## Max. :96153 Max. :35.90 Max. :498534
## Robbery rate Aggravated assault Aggravated assault rate Property crime
## Min. :101.3 Min. : 726777 Min. :229.2 Min. : 7919035
## 1st Qu.:113.7 1st Qu.: 777397 1st Qu.:247.1 1st Qu.: 9040055
## Median :141.7 Median : 853206 Median :287.9 Median : 9950906
## Mean :135.0 Mean : 845507 Mean :285.4 Mean : 9685756
## 3rd Qu.:148.3 3rd Qu.: 895811 3rd Qu.:311.8 3rd Qu.:10348837
## Max. :186.2 Max. :1023201 Max. :382.1 Max. :11558475
## Property crime rate Burglary Burglary rate Larceny-theft
## Min. :2451 Min. :1515096 Min. :468.9 Min. :5638455
## 1st Qu.:2896 1st Qu.:2088302 1st Qu.:693.8 1st Qu.:6164429
## Median :3312 Median :2153043 Median :727.9 Median :6608952
## Mean :3271 Mean :2084819 Mean :703.2 Mean :6590070
## 3rd Qu.:3621 3rd Qu.:2191397 3rd Qu.:741.2 3rd Qu.:6985393
## Max. :4316 Max. :2460526 Max. :918.8 Max. :7743760
## Larceny-theft rate Motor vehicle theft Motor vehicle theft rate
## Min. :1745 Min. : 686803 Min. :215.4
## 1st Qu.:1972 1st Qu.: 735470 1st Qu.:235.3
## Median :2199 Median :1126274 Median :382.6
## Mean :2224 Mean :1010867 Mean :343.5
## 3rd Qu.:2457 3rd Qu.:1236357 3rd Qu.:424.5
## Max. :2892 Max. :1354189 Max. :505.7</code></pre>
</div>
<div id="pivot-year-and-violentcrime-columns-from-dataframe" class="slide section level2">
<h1>Pivot Year and Violentcrime columns from dataFrame</h1>
<div class="sourceCode" id="cb21"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true" tabindex="-1"></a>df_year_violent <span class="ot">=</span> <span class="fu">select</span>(df, Year, Violentcrime)</span>
<span id="cb21-2"><a href="#cb21-2" aria-hidden="true" tabindex="-1"></a>tbl2 <span class="ot">=</span> df_year_violent <span class="sc">%>%</span> <span class="fu">pivot_wider</span>(<span class="at">names_from =</span> Year, <span class="at">values_from =</span> <span class="fu">c</span>(Violentcrime))</span>
<span id="cb21-3"><a href="#cb21-3" aria-hidden="true" tabindex="-1"></a>knitr<span class="sc">::</span><span class="fu">kable</span>(tbl2, <span class="at">caption =</span> <span class="st">'Crime in the United States by Year'</span>)</span></code></pre></div>
<table>
<caption>Crime in the United States by Year</caption>
<colgroup>
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
<col width="4%" />
</colgroup>
<thead>
<tr class="header">
<th align="right">1997</th>
<th align="right">1998</th>
<th align="right">1999</th>
<th align="right">2000</th>
<th align="right">2001</th>
<th align="right">2002</th>
<th align="right">2003</th>
<th align="right">2004</th>
<th align="right">2005</th>
<th align="right">2006</th>
<th align="right">2007</th>
<th align="right">2008</th>
<th align="right">2009</th>
<th align="right">2010</th>
<th align="right">2011</th>
<th align="right">2012</th>
<th align="right">2013</th>
<th align="right">2014</th>
<th align="right">2015</th>
<th align="right">2016</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td align="right">1636096</td>
<td align="right">1533887</td>
<td align="right">1426044</td>
<td align="right">1425486</td>
<td align="right">1439480</td>
<td align="right">1423677</td>
<td align="right">1383676</td>
<td align="right">1360088</td>
<td align="right">1390745</td>
<td align="right">1435123</td>
<td align="right">1422970</td>
<td align="right">1394461</td>
<td align="right">1325896</td>
<td align="right">1251248</td>
<td align="right">1206005</td>
<td align="right">1217057</td>
<td align="right">1168298</td>
<td align="right">1153022</td>
<td align="right">1199310</td>
<td align="right">1248185</td>
</tr>
</tbody>
</table>
</div>
<div id="statistical-analysys" class="slide section level2">
<h1>Statistical analysys</h1>
<div class="sourceCode" id="cb22"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb22-1"><a href="#cb22-1" aria-hidden="true" tabindex="-1"></a><span class="fu">ggplot</span>(<span class="at">data =</span> df, <span class="fu">aes</span>(<span class="at">x=</span>Year)) <span class="sc">+</span> <span class="fu">geom_point</span>(<span class="fu">aes</span>(<span class="at">y =</span> <span class="st">`</span><span class="at">Violent crime rate</span><span class="st">`</span>, <span class="at">color =</span> <span class="st">"Violent crime rate"</span>)) <span class="sc">+</span> </span>
<span id="cb22-2"><a href="#cb22-2" aria-hidden="true" tabindex="-1"></a><span class="fu">geom_point</span>(<span class="fu">aes</span>(<span class="at">y =</span> <span class="st">`</span><span class="at">Murder and nonnegligent manslaughter rate</span><span class="st">`</span>, <span class="at">color =</span> <span class="st">"Murder and nonnegligent manslaughter rate"</span>)) <span class="sc">+</span></span>
<span id="cb22-3"><a href="#cb22-3" aria-hidden="true" tabindex="-1"></a><span class="fu">geom_point</span>(<span class="fu">aes</span>(<span class="at">y =</span> <span class="st">`</span><span class="at">Rape(legacy definition) rate</span><span class="st">`</span>, <span class="at">color =</span> <span class="st">"Rape(legacy definition) rate"</span>)) <span class="sc">+</span></span>
<span id="cb22-4"><a href="#cb22-4" aria-hidden="true" tabindex="-1"></a><span class="fu">geom_point</span>(<span class="fu">aes</span>(<span class="at">y =</span> <span class="st">`</span><span class="at">Robbery rate</span><span class="st">`</span>, <span class="at">color =</span> <span class="st">"Robbery rate"</span>)) <span class="sc">+</span></span>
<span id="cb22-5"><a href="#cb22-5" aria-hidden="true" tabindex="-1"></a><span class="fu">geom_point</span>(<span class="fu">aes</span>(<span class="at">y =</span> <span class="st">`</span><span class="at">Aggravated assault rate</span><span class="st">`</span>, <span class="at">color =</span> <span class="st">"Aggravated assault rate"</span>)) <span class="sc">+</span> </span>
<span id="cb22-6"><a href="#cb22-6" aria-hidden="true" tabindex="-1"></a><span class="fu">geom_point</span>(<span class="fu">aes</span>(<span class="at">y =</span> <span class="st">`</span><span class="at">Property crime rate</span><span class="st">`</span>, <span class="at">color =</span> <span class="st">"Property crime rate"</span>)) <span class="sc">+</span></span>
<span id="cb22-7"><a href="#cb22-7" aria-hidden="true" tabindex="-1"></a><span class="fu">geom_point</span>(<span class="fu">aes</span>(<span class="at">y =</span> <span class="st">`</span><span class="at">Burglary rate</span><span class="st">`</span>, <span class="at">color =</span> <span class="st">"Burglary rate"</span>)) <span class="sc">+</span> </span>
<span id="cb22-8"><a href="#cb22-8" aria-hidden="true" tabindex="-1"></a><span class="fu">geom_point</span>(<span class="fu">aes</span>(<span class="at">y =</span> <span class="st">`</span><span class="at">Larceny-theft rate</span><span class="st">`</span>, <span class="at">color =</span> <span class="st">"Larceny-theft rate"</span>)) <span class="sc">+</span></span>
<span id="cb22-9"><a href="#cb22-9" aria-hidden="true" tabindex="-1"></a><span class="fu">geom_point</span>(<span class="fu">aes</span>(<span class="at">y =</span> <span class="st">`</span><span class="at">Motor vehicle theft rate</span><span class="st">`</span>, <span class="at">color =</span> <span class="st">"Motor vehicle theft rate"</span>)) </span></code></pre></div>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABgAAAASACAMAAAAOH3aoAAABj1BMVEUAAAAAADoAAGYAOjoAOmYAOpAAZpAAZrYAueMAujgAwZ8zMzM6AAA6AGY6OgA6Ojo6OmY6OpA6ZmY6ZpA6ZrY6kJA6kLY6kNtNTU1NTW5NTY5Nbo5NbqtNjshhnP9mAABmADpmOgBmOjpmOpBmZgBmZjpmZmZmZpBmkGZmkJBmkLZmkNtmtttmtv9uTU1ubm5ubo5ujqtujshuq+SOTU2Obk2Obm6Oq6uOq8iOq+SOyOSOyP+QOgCQOjqQZjqQZmaQZpCQkGaQkLaQttuQ27aQ29uQ2/+TqgCrbk2rbm6rjm6ryOSr5P+2ZgC2Zjq2Zma2kDq2kGa2kJC2tma2tra2ttu225C229u22/+2/7a2/9u2///Ijk3Ijm7IyKvI5P/I///TkgDbcvvbkDrbkGbbtmbbtpDbtrbbttvb25Db27bb29vb2//b/7bb/9vb///kq27kyI7kyKvk///r6+vy8vL4dm3/YcP/tmb/yI7/25D/27b/29v/5Kv/5Mj/5OT//7b//8j//9v//+T///9ZA68rAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOy97Zsb53WnWS2ypykHI3Ekxmz5ZRl6V3LkkNrLE2d2d8KhV9FE0noCDZXMjDgr5bK9LdKbRDOtibU23KR10S384VuvQBVwnoPnoJ46XQDu+4PUQFedG4cNnB9Qb8jmAABwkGRX/QAAAOBqIAAAAA4UAgAA4EAhAAAADhQCAADgQCEAAAAOFAIAAOBAIQAAAA4UAgAA4EAhAAAADhQCAADgQCEAAAAOFAIAAOBAuYoA+Gp7+qwbL3Gx0ItZQi9aQQA7BIAgYdCYNS4SetEKAtghAAQJg8ascZHQi1YQwA4BIEgYNGaNi4RetIIAdggAQcKgMWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAexwHgAAwIHCJwBBwjtNs8ZFQi9aQQA7BIAgYdCYNS4SetEKAtghAAQJg8ascZHQi1YQwA4BIEgYNGaNi4RetIIAdggAQcKgMWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYIcAECQMGrPGRUIvWkEAOwSAIGHQmDUuEnrRCgLYIQAECYPGrHGR0ItWEMAOASBIGDRmjYuEXrSCAHYIAEHCoDFrXCT0ohUEsEMACBIGjVnjIqEXrSCAHQJAkDBozBoXCb1oBQHsEACChEFj1rhI6EUrCGCHABAkDBqzxkVCL1pBADsEgCBh0Jg1LhJ60QoC2CEABAmDxqxxkdCLVhDADgEgSBg0Zo2LhF60ggB2CABBwqAxa1wk9KIVBLBDAAgSBo1Z4yKhF60ggB0CQJAwaMwaFwm9aAUB7BAAgoRBY9a4SOhFKwhghwAQJAwas8ZFQi9aQQA7BIAgYdCYNS4SetEKAtghAAQJg8ascZHQi1YQwA4BIEgYNGaNi4RetIIAdggAQcKgMWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYIcAECQMGrPGRUIvWkEAOwSAIGHQmDUuEnrRCgLYIQAECYPGrHGR0ItWEMDOWAPgRo70NE/8shFh0Ng1LhJ60QoC2BlpANy4ISfAbr44AxoXCb2YNS4SAgDGwDgD4MaNQALs5oszoHGR0ItZ4yIhAGAMjDIAbtwIJcBuvjgDGhcJvZg1LhICAMYAAbAOg8aucZHQi1YQwA4BsA6Dxq5xkdCLVhDADgGwDoPGrnGR0ItWEMDOKAOAncDpJPRi1rhICAAYA+MMAA4DTSahF7PGRUIAwBgYaQBwIlgqCb2YNS4SAgDGwFgDIPQ0T/aC0SQMGrPGRUIvWkEAOwSAIGHQmDUuEnrRCgLYIQAECYPGrHGR0ItWEMAOASBIGDRmjYuEXrSCAHYIAEHCoDFrXCT0ohUEsEMACBIGjVnjIqEXrSCAHQJAkDBozBoXCb1oBQHsEACChEFj1rhI6EUrCGCHABAkDBqzxkVCL1pBADsEgCBh0Jg1LhJ60QoC2CEABAmDxqxxkdCLVhDADgEgSBg0Zo2LhF60ggB2CABBwqAxa1wk9KIVBLBDAAgSBo1Z4yKhF60ggB0CQJAwaMwaFwm9aAUB7BAAgoRBY9a4SOhFKwhghwAQJAwas8ZFQi9aQQA7BIAgYdCYNS4SetEKAtghAAQJg8ascZHQi1YQwA4BIEgYNGaNi4RetIIAdggAQcKgMWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYIcAECQMGrPGRUIvWkEAOwSAIGHQmDUuEnrRCgLYIQAECYPGrHGR0ItWEMAOASBIGDRmjYuEXrSCAHYIAEHCoDFrXCT0ohUEsEMACBIGjVnjIqEXrSCAHQJAkDBozBoXCb1oBQHsEACChEFj1rhI6EUrCGCHABAkDBqzxkVCL1pBADsEgCBh0Jg1LhJ60QoC2CEABAmDxqxxkdCLVhDADgEgSBg0Zo2LhF60ggB2CABBwqAxa1wk9KIVBLBDAAgSBo1Z4yKhF60ggB0CQJAwaMwaFwm9aAUB7BAAgoRBY9a4SOhFKwhghwAQJAwas8ZFQi9aQQA7BIAgYdCYNS4SetEKAtghAAQJg8ascZHQi1YQwA4BIEgYNGaNi4RetIIAdggAQcKgMWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYGfnA+BGTo+CooRBY9a4SOhFKwhgZ9cD4MaN9AnAoLFrXCT0ohUEsLPjAXDjxgAJwKCxa1wk9KIVBLCz2wFw48YQCcCgsWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYGe3A4CdwBsl9GLWuEgIABgDOx4AHAa6SUIvZo2LhACAMbDrAcCJYBsk9GLWuEgIABgDWwfA79/53q/LH7752Tunpz/++XzDjRZ9nubJXjCahEFj1rhI6EUrCGBn2wD45sPTKgD+8JPTgu/8Qr/Rps/TPNkLRpMwaMwaFwm9aAUB7GwbAF+e1gHw2en3fj7/uo6D8I02fZ7myV4wmoRBY9a4SOhFKwhgZ8sA+P07dQD8/p3yHf4ffvLG32g3OvR5mid7wWgSBo1Z4yKhF60ggJ3tAuCbD0//t2ofwJen3y/v+fL0z7UbHfo8zZO9YDQJg8ascZHQi1YQwM52AfDZ6ffrncCfnf5lec/vinEfvtGhz9M82QtGkzBozBoXCb1oBQHsbBUAvzv93q+rAPjmw3oDT3EzfKNa7Y9qEjxsAADoyzYBUG7WJwAAAHabbQLgs2Kr/loAfOcX4Rvd9ft80E32kVmTsKnBrHGR0ItWEMDOFgHwZXn8zxafABr6PM2TvWA0CYPGrHGR0ItWEMCOPQB+/0452QmA3hoXCb2YNS4SAgDGgD0Avjxd8J1fcBRQD42LhF7MGhcJAQBjoG8ANEf514f+h2506PM0T/aC0SQMGrPGRUIvWkEAO30vBseZwNtrXCT0Yta4SAgAGAN9A+CbD0+/u7jiT/hGhz5P82QvGE3CoDFrXCT0ohUEsNP7ctBft6/5Gb7Rps/TPNkLRpMwaMwaFwm9aAUB7PT/PoCvf5ZP+R/X7/LDN1r0eZone8FoEgaNWeMioRetIICdnf9GsAFg0Ng1LhJ60QoC2CEABAmDxqxxkdCLVhDADgEgSBg0Zo2LhF60ggB2CABBwqAxa1wk9KIVBLBDAAgSBo1Z4yKhF60ggB0CQJAwaMwaFwm9aAUB7BAAgoRBY9a4SOhFKwhghwAQJAwas8ZFQi9aQQA7BIAgYdCYNS4SetEKAtghAAQJg8ascZHQi1YQwA4BIEgYNGaNi4RetIIAdggAQcKgMWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYIcAECQMGrPGRUIvWkEAOwSAIGHQmDUuEnrRCgLYIQAECYPGrHGR0ItWEMAOASBIGDRmjYuEXrSCAHYIAEHCoDFrXCT0ohUEsEMACBIGjVnjIqEXrSCAHQJAkDBozBoXCb1oBQHsEACChEFj1rhI6EUrCGCHABAkDBqzxkVCL1pBADsEgCBh0Jg1LhJ60QoC2CEABAmDxqxxkdCLVhDADgEgSBg0Zo2LhF60ggB2CABBwqAxa1wk9KIVBLBDAAgSBo1Z4yKhF60ggB0CQJAwaMwaFwm9aAUB7BAAgoRBY9a4SOhFKwhghwAQJAwas8ZFQi9aQQA7BIAgYdCYNS4SetEKAtghAAQJg8ascZHQi1YQwA4BIEgYNGaNi4RetIIAdggAQcKgMWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYIcAECQMGrPGRUIvWkEAOwSAIGHQmDUuEnrRCgLYIQAECYPGrHGR0ItWEMDO4QTAjZxICYPGrHGR0ItWEMDOwQTAjRvRCcCgsWtcJPSiFQSwcygBcONGfAIwaOwaFwm9aAUB7BxIANy4YUgABo1d4yKhF60ggB0CQJAwaMwaFwm9aAUB7BAAgoRBY9a4SOhFKwhghwAQJAwas8ZFQi9aQQA7BxIA7AQeWOMioRetIICdQwkADgMdVuMioRetIICdgwkATgQbVOMioRetIICdwwkAg4RBY9a4SOhFKwhghwAQJAwas8ZFQi9aQQA7BIAgYdCYNS4SetEKAtghAAQJg8ascZHQi1YQwA4BIEgYNGaNi4RetIIAdggAQcKgMWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYIcAECSRlvhzi2VNj3XjJQxNs8ZFQgDAGCAABEmcxXB1IVmz/aoGCUPTrHGREAAwBggAQRJlsVxfVNZsvaZFwtA0a1wkBACMAQJAkMRYTN8wIGu2XdEkYWiaNS4SAgDGAAEgSAgAs8ZFQi9aQQA7BIAgIQDMGhcJvWgFAewQAIIkcQAEFhpPLwk0LhJ60QoC2CEABEnancChxUbUS3+Ni4RetIIAdggAQZL0MNBgUIypl94aFwm9aAUB7BAAa0Rv1zfN//VFd3PQBDQuEnrRCgLYIQBW6Xt+l1iOAEghoRetIIAdAmCF3ud3BeoRAP0l9KIVBLBDAHTpf3RndMHdHDQBjYuEXrSCAHYIgC7JA4CdwOkk9KIVBLBDAHRJHwAcBppMQi9aQQA7BECXAQIg/kSwtNpKwtA0a1wkBACMAQJghfTzP8RaL0OIGZp2jYuEAIAxQACs4jX/13oZJHoYmnaNi4QAgDFAAKzhNP9Xexli4xNDcxuNi4QAgDFAAAiSKxk0BMBGCb1oBQHsEACChAAwa1wk9KIVBLBDAAgSAsCscZHQi1YQwA4BIEiuZtCwE3iThF60ggB2CABBckWDhsNAN0joRSsIYIcAECRXNWg4EUyX0ItWEMAOASBIGDRmjYuEXrSCAHYIAEHCoDFrXCT0ohUEsEMACBIGjVnjIqEXrSCAHQJAkDBozBoXCb1oBQHsEACChEFj1rhI6EUrCGCHABAkDBqzxkVCL1pBADsEgCBh0Jg1LhJ60QoC2CEABMnoB038CQPj78UgoRetIIAdAkCQjH3QGE4ZHn0vFgm9aAUB7BAAgmTkg8Zy0aCx92KS0ItWEMAOASBIxj1oTJcNHXkvNgm9aAUB7BAAgmTcg4YAGFjjIiEAYAwQAIJk3IOGABhY4yIhAGAMEACCZNyDhgAYWOMiIQBgDBAAgmTkg4adwMNqXCQEAIyBqwgA6Ek1/6/6UQDArsMnAEEy+neanAg2pMZFwicAGAMEgCBh0Jg1LhJ60QoC2CEABAmDxqxxkdCLVhDADgEgSBg0Zo2LhF60ggB2CABBwqAxa1wk9KIVBLBDAAgSBo1Z4yKhF60ggB0CQJAwaMwaFwm9aAUB7BAAgoRBY9a4SOhFKwhghwAQJAwas8ZFQi9aQQA7BIAg2Z9BE3/GWD/4u1glBACMAQJAkOzNoDF8dVg/+LtYJQQAjAECQJDsy6CxXDWuH/xdrBICAMYAASBI9mTQmK4b3Q/+LlYJAQBjgAAQJHsyaAiA7TQuEgIAxgABIEj2ZNAQANtpXCQEAIwBAkCQ7MmgIQC207hICAAYAwSAINmXQcNO4K00LhICAMYAASBI9mbQcBjoNhoXCQEAY4AAECT7M2g4EWwLjYuEAIAxQAAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYIcAECQMGrPGRUIvWkEAOwSAIGHQmDUuEnrRCgLYIQAECYPGrHGR0ItWEMAOASBIGDRmjYuEXrSCAHYIAEHCoDFrXCT0ohUEsEMACBIGjVnjIqEXrSCAHQJAkBzgoOl5yvCoeumrcZEQADAGCABBcniDpu9Fg8bUS2+Ni4QAgDFAAAiSgxs0vS8bOqJe+mtcJAQAjAECQJAc2qDp/8UB4+klgcZFQgDAGCAABMmhDRoCoKNxkRAAMAYIAEFyaIOGAOhoXCQEAIwBAkCQHNqgIQA6GhcJAQBjgAAQJAc3aNgJ3Na4SAgAGAMEgCA5vEHDYaAtjYuEAIAxQAAIkgMcNJwIttS4SAgAGAMEgCBh0Jg1LhJ60QoC2CEABAmDxqxxkdCLVhDADgEgSBg0Zo2LhF60ggB2CABBwqAxa1wk9KIVBLBDAAgSBo1Z4yKhF60ggB0CQJAwaMLIhwvtZi8BjYuEAIAxQAAIEgZNkMAJAzvZS0jjIiEAYAwQAIKEQRMidMrwLvYS1LhICAAYAwSAIGHQBAheNGgHewlrXCQEAIwBAkCQMGgCEADJJAQAjAECQJAwaAIQAMkkBACMAQJAkDBoAhAAySQEAIwBAkCQMGhCsBM4lYQAgDFAAAgSBk0QDgNNJCEAYAwQAIKEQROGE8HSSAgAGAMEgCBh0Jg1LhJ60QoC2CEABAmDxqxxkdCLVhDADgEgSBg0Zo2LhF60ggB2CABBwqAxa1wk9KIVBLBDAAgSBo1Zs3ZPzy8ZFiX8XbSCAHYIAEHCoDFrVu8IHC7aT8LfRSsIYIcAECQMGrNm5XbohLF+Ev4uWkEAOwSAIGHQmDXdm8FLRvST8HfRCgLYIQAECYPGrOneJAA2SggAGAMEgCBh0Jg13ZsEwEYJAQBjgAAQJAwas6Z7kwDYKCEAYAwQAIKEQWPWrNxmJ/AmCQEAY4AAECQMGrNm9Q4OA90gIQBgDBAAgoRBY9as3cOJYLqEAIAxQAAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYIcAECQMGrPGRUIvWkEAOwSAIGHQmDUuEnrRCgLYIQAECYPGrHGR0ItWMCHT7Pg8aUEYKwSAIGHQmDUuEnrRCiaEADgYCABBwqAxa1wk9KIVTAgBcDAQAIKEQWPWuEjoRSuYEALgYCAABAmDxqxxkdCLVjAhBMDBQAAIEgaNWeMioRetYEIIgIOBABAkDBqzxkVCL1pBG88eTrLs5nudm0evP65uLQKgc/eLO9nt6vdn2UufzueXD7L7T+9m2bX3+04EuDIIAEHCoDFrXCT0ohU0cZZV3OrePPqz8mYTAN27hQB4q/ht8TPsKASAIGHQmDUuEnrRClrIJ/vx4/nlR1k10vOb1z+Zz/8xfzt/v7hdB8DK3UIAZEfvz5+9JztgFyAABAmDxqxxkdCLVtBAPsrLCZ+P8GKSNzeb23UArN4tBcD9pJMB3CEABAmDxqxxkdCLVtDArJncs+ItfD7Pj+rN+BeTcsZXAbB6txAAbP3ZdQgAQcKgMWtcJPSiFTRw1p3c08XNfMafzJsAWL1bCAAOFtp1CABBwqAxa1wk9KIVNNA9zLM1yOsfy9+v3S0EwEmCcQBXCQEgSBg0Zo2LhF60ggbWAuCk+5smALp3EwB7CAEgSBg0Zo2LhF60ggb4BAA1BIAgYdCYNS4SetEKGlhs3a9muHkfwJQA2BcIAEHCoDFrXCT0ohU0sDgK6GJS/HC2OJxzlnWOAureXafD4vAfAmAPIAAECYPGrHGR0ItW0MDiCP+p5TyAxTahWUYA7AsEgCBh0Jg1LhJ60QpamAXPBC5vr58J3CxWrPXxhADYGwgAQcKgMWtcJPSiFTSxzbWAylN/C44fEQD7AgEgSBg0Zo2LhF60gjbEq4He+qK6tXI10Obu/M3/K1l27R5HAe0PBIAgYdCYNS4SetEKAtghAAQJg8ascZHQi1YQwA4BIEgYNGaNi4RetIIAdggAQcKgMWu2X/VGTqRk9L0YJAQAjAECQJAwaMyarde8cSM6AUbfi0VCAMAYIAAECYPGrNl2xRs34hNg7L2YJAQAjAECQJAwaMyaLde7ccOQACPvxSYhAGAMEACChEFj1my5HgGQriCAHQJAkDBozJot1yMA0hUEsEMACBIGjVmz5XoEQLqCAHa2CoB//ovT0zf+919XN7752Tunpz/++aYbLfo8zZO9YDQJg8as2XZFdgInKwhgZ5sA+PK05Lu/KG784Sflje9suNGmz9M82QtGkzBozJqt1+Qw0FQFAexsEQC/f+eNfzuff/0Xp98vbn12+r2fz7/+8PR7v1ZvtOnzNE/2gtEkDBqzZvtVOREsUUEAO1sEwGenf1787/fvFO/tq//m7/bf+BvtRoc+T/NkLxhNwqAxa1wk9KIVBLCz/U7gP/ykGPBfVp8D8v//uXajQ5+nebIXjCZh0Jg1LhJ60QoC2Nk+AH7/TrFt57PTvyxv/a4Y9+EbHfo8zZO9YDQJg8ascZHQi1YQwM7WAfA/3ikG/Dcf1ht4ijgI36hW+aOang8ZAABSsGUAfHZ6+sZ/mBMAALvH/2fiqh8tDMl2AfDN//W/vnP6xv/RCYDv/CJ8o7t2nw+6yT4yaxI2NZg1LhJ60QrGQwBAw/b7AP652AZk+gTQ0OdpnuwFo0kYNGaNi4RetILxEADQ0ONSEL871WY+AbBR4yKhF7PGRUIAwBjoEQDlZOcooO01LhJ6MWtcJAQAjAF7AHzzYT3ZywBojvKvD/0P3ejQ52me7AWjSRg0Zo2LhF60gvEQANCw1ZnA31/+nzOBt9e4SOjFrHGREAAwBra6FtDpv/71/Ju/Py0me/554LuLK/6Eb3To8zRP9oLRJAwas8bBEX/RoH7s5t/F8gomAKBhm30Av6uuBvpGuSXo6/Y1P8M32vR5mid7wWiS/Rmae9SL4bKh/djNv4vlBUwAQMNWO4G//jf5+G8u9P/1z/Ip/+Nfb7rRos/TPNkLRpPszdDco14sXxzQj938u1hevwQANPCNYIJkX4bmV/vTi+mrw/qxm38XywuQAIAGAkCQ7MnQLCV70gsBsLFgPAQANBAAgmRPhmYp2ZNeCICNBeMhAKCBABAkezI0S8me9EIAbCwYDwEADQSAINmToVlK9qUXdgJvKhgPAQANBIAg2Zeh+dU+9cJhoBsKxkMAQAMBIEj2ZmjuVS/R879nUOzm38XyAuwdAJcPstuJhkFV7+Nbgd/MspMkhhd3XvpU0Wx8HHsLASBI9mdoHmIvfT8qjKkXS8F4egfAxSQ7Pk80DQrCYz5pAGwslsq2QxAAguTwhmZvjYskytJ7Z8GIejEVjEec87/JiQ2A6Uv/y9H7iaZBAQFwZYw1AD7IkZ7miV82Ioc3NPtrXCQxlv6HC42nF1vBeELzX06A9fVf3Dl+knRUEgBXxkgD4IMP5ATYzRdnQOMiObReCIDNBOe/mADr68+y2+VALbn8KMuuPz4rdwq0fs6XeTLJruefE57+IMuyaz86zz841HsOzso5u7j/8kH+Q3nXs4eTLLv5uCqcr350rzOSl5XyRYufX703X/25vVDtK3T54/2/F5q6h9XHF3gc+804A+CDDwIJsJsvzoDGRXJovRAAmwnPfykB1tefHr2fD9f75c/V1Dx6s5i17Z9n2Wv5ED0+n3+UVZws3mDni+XrLu9fDN6LSXnPUVl5Wv78VisAWpWaRdd+7iykB8Da45Mfx54zygD44INQAuzmizOgcZEcWi8EwGZ6BsDFJJ+bs3o38Fl29N782d2smLXtn2dZtcCsuC9/O5/loVF/bLiYlJtjlvfXyfDiTnYrfx/+KCuWyn9/b345XU7szhr5rP52Xv3pZOXnbtluAHQ3AUmPT3oc+w4BsM7BDc0EGhcJO4G1gvH0DIByE8+LO+Vu4OrdfPGe+Xbn52KwlruJ6yFc/a762FBuAercXw3es3o+l/Wr3+e/Xszs9hq1vaT986pOCwDh8QmPY98hANY5vKHZX+MiSX0YqLzcmHqxFIynXwBcPijfGVeTs/w0UN9q/7z4hFDw/Ffv5h8LmgFb54Rwfz3IizrNVD/LOrtlmzXyGtc/WTye5c/dsnoAhB9f63FY/ll3EgJgnQMcmr01LpJIi2X+C0uOqhdDwXjWh7xlJ/DFpByjs3pLzfLdcvvn5YAtNgmV3K+PxSm3AHXvb4Kh4aVPm53M7ZndXuOs+P/1v6q3Qi1/7iwUFQD647D8s+4kowwAdgKnk9BLiNC2ol3sxfMw0LPFfLyvBkB1o9ihenTz7U/Kt/3lm+uzxZ7bxf3lwi/utAZvnRLtmd1ZY/7klXLJW+fdnzsL6QEgPL71x2H5Z91JxhkAHAaaTEIvAYJ7i3ewl68cTwRrzceT5RvpKgCWP7eO+Dk5ny+2++S/uqyjoH1/PXhb2/LXPwGsVMp/+Nvi+M3bnZ+7C0UEwKbHsfeMNAA4ESyVhF4CEACRrKy8mKIXxWE3yj6AcrFmmuaxUe0gPv6H8r199/6VfQOt9Zb7AFYqlVw+Wm7JL3/uLhQRAJsex94z1gAIPc2TvWA0CUPTrHGREABawXh6BUBzAkB1Rbh6Wubzs/vz6oCdZfVRPUfv1odatu9vjr6ppnn5SWLtKKDOGs0WoiJz2j93y1bpUdbYFADBx7HvEACChKFp1rhICACtYDx9AmB5CnA1KM+KwymX5wG8vzwPoLWJJX93njXvxstdByv3V6M2T47jx+UZwPebA0s/ylY2AdVr5DeKRZ89qM7fav/cKZvdK+5fBsByoouPT3gc+w4BIEgYmmaNi4SdwFrBePoEQOu4zItJdUBmJp8JXC03q3YXHD+qbufrNBv3W/dfVCflzupTem9VooLWmcBra5QH/3za/bmzUPV4Xvq7JgBqTV1NeHzS49hzCABBwtA0a1wkiS0cBmoPgPYG8mr7THX9n2nrWkDtfQDz+dP8E8G1e8277+U2nc79n1fXl66uwfNetcCTV1auBdRZo1y0uS5Q6+fOQpcPi8czawKg0RTIj096HPsNASBIGJpmjYsktYUTweyfAAJMW5tLpoew6WRfIAAECUPTrHGR0ItWMB9ZrY0AACAASURBVJ6EAVDvgS33pbZ/hh2BABAkDBqzxkVCL1rBeBIGwIs75U7UabHlpP0z7AgEgCBh0Jg1LhJ60QrGkzAA5k+q/aXlm/72z7AbEACChEFj1rhI6EUrGE/KACi/T+Xo9cdrP8NOQAAIEgaNWeMioRetYDxJAwB2GgJAkDBozBoXCb1oBeMhAKCBABAkDBqzxkVCL1rBeAgAaCAABAmDxqxxkdCLVjAeAgAaCABBwqAxa1wk9KIVjIcAgAYCQJAwaMwaFwm9aAXjIQCggQAQJAwas8ZFQi9awXgIAGggAAQJg8ascZHQi1YwHgIAGggAQcKgMWtcJPSiFYyHAIAGAkCQMGjMGhcJvWgF4yEAoIEAECQMGrPGRUIvWsF4CABoIAAECYPGrHGR0ItWMB4CABoIAEHCoDFrXCT0ohWMhwCABgJAkDBozBoXCb1oBeMhAKCBABAkDBqzxkVCL1rBeAgAaCAABAmDxqxxkdCLVjAeAgAaCABBwqAxa1wkV9aL/O3xvSQEAIyBnQ+AD3J6FBQlDE2zxkVyVb3cuJE8AQgAGAW7HgAffJA+ARiado2L5Ip6uXEjfQIQADAKdjwAPvhggARgaNo1LpKr6eXGjQESgACAUbDbAfDBB0MkAEPTrnGREABawXgIAGggAAQJQ9OscZEQAFrBeAgAaCAABAlD06xxkRAAWsF4CABoIAAECUPTrHGRsBNYKxgPAQANux0A7ATeKKEXs2btHg4DbXExyUqObj6OUL2489Knloe2yuXHt/qsDpvY8QDgMNBNEnoxa9bv4kSwJU0A5NzfrOobALPspM/qsIldDwBOBNsgoRezxkUyugD4ZU5cAByfF/9//lEWMdsJgJGz8wEwAAwau8ZFQi9awXhC819OgJWVmwCYXz6I+AhAAIwcAkCQMGjMGhcJvWgF4wnOfzEBVlZeBMB8mt2u/zOfnxWDepbdfjLJrr8/v/woy64/Pst/VQfA0x9kWXbtR8WK9ULvZlWZs8WEX6y9XDrPmJxigWcPJ1kWtdcBTBAAgoRBY9a4SOhFKxhPeP5LCbCy8songG4AvJaP6ePzam4fvbkIgI/qnQbFKK8X+m9VMrQ+RjRrt5ZeBEC94+EoYq8DmCAABAmDxqxxkdCLVjCeJAGQv8svfugGQPW2/iw7em/+7G7WBMCsuD2fP8mO3l8uNC0nf2sTUfOLlaVPyqWyW/nngUcxex3ABAEgSBg0Zo2LhF60gvH0DIDmIKDrxRaZbgAUM7t5V58vWAdAvUx1f71QPdpb2/ibX6wsfTJfbic6q34F6SAABAmDxqxxkdCLVjCeRAFwdG++GgDlW/jmM8J0uQ9gPn/+q3fvZtVIr35b/Wa63JHc/GJl6ZMiC6poaO1/gEQQAIKEQWPWuEjoRSsYz/qQ32In8OWTyfo+gHobzvL9ejXmi81BzZkDizlfzP72QUKLX3SXLgNgceoB24ASQwAIEgaNWeMioRetYDzClN/iMNBqYncD4KS6fyUAig8NRzff/qS1UaderH2UZ/Pz+tIv7hAAQ0EACBIGjVnjIqEXrWA80pg3nwg272zf7wZAc4RnFQD5G/iT4o7LbgC8uHN83toC1PxCWPrFnXoTECRHDYDLLwZx9nmaJ3vBaBIGjVnjIqEXrWA84pwPsrLy5gBY3QfQzO/8jXw7AObTo79+0HpHX/9CWDrqlDPYinAAFGdj5H+8P/lR8t0ufZ7myV4wmoRBY9a4SOhFKxhPogAo3+lXB+gUb9vb7+GrIzxXAmBWHBfaCoDiwP/Web4rAdBe+qz+TNHeTwxJCAXA5UfVFrf8r3g99Wa3Pk/zZC8YTcKgMWtcJPSiFYwnTQA8mVQTOrs3f/YgawVAcR7A+63zAKqNOpePspUAKDbttw7r7GwCWi5d2PIljx+XRj4JJCYUANMsu/6nk/yP9++y5Knb52me7AWjSRg0Zo2LhF60gvH0DIDFHtliMFRH6Lz0d+0AWD0TeFYv/qi9ULlYe9t+84vO0hfVycGzWsq1oVMTCIAy16tjtNLHbp+nebIXjCZh0Jg1LhJ60QrGkyYAbr5XHQ76MMuuP551Znt1LaDleQBP808D1+5Vb+dbB/6cdd5bLn7RXnr++aT8X3UtoPfMswY2EAiActdOfZDu8nJNiejzNE/2gtEkDBqzxkVCL1rBeHoFQDzTTe8cObH36pEDoDr1rg6Ai0nig2/7PM2TvWA0CYPGrHGR0ItWMJ6BA6AeGBsP3lyc4AtXhxwA1eivA6DvJb3X6PM0T/aC0SQMGrPGRUIvWsF4Bg6AF3fK3bjTTTsPn3Ct/6uHABAkDBqzxkVCL1rBeAYOgHyyV9cKUt/fTzctAB6ENgEVm+/qyZ/84Ns+T/NkLxhNwqAxa1wk9KIVjGfoACjPITp6Xf/6lkfVxeTgagnsBD6rzsAuAqA6xyMlfZ7myV4wmoRBY9a4SOhFKxjP4AEAO0MgAC4m2a3zMgCe3U3+Sa3P0zzZC0aTMGjMGhcJvWgF4yEAoCF0IthZlmWvTo5eeyXLkh+r1edpnuwFo0kYNGaNi4RetILxEADQELwW0OeLE/6SH6vb52me7AWjSRg0Zo2LhF60gvEQANAQvhjc849fzaf/tQ27crahz9M82QtGkzBozBoXCb1oBeMhAKCB7wMQJAwas8ZFMvpebuRESggAGAOBw0B/+sPlkZ8Xb/4rDgMdQuMioRezZus1b9yITgACAEaBdiKYdCMFfZ7myV4wmmTsg8YioRezZtsVb9yITwACAEZBRABwLaCBNC4SejFrtlzvxg1DAhAAMArWAqD1Bcyd634npM/TPNkLRpOMe9DYJPRi1my5HgEAu8f6J4DZegDsxfcBfJATKRn3oLFJ6MWs2XI9AgB2j/UAuPyPb7315uTotbca3v4ksbPP03zrNT/4IDoBRj5obBJ6MWu2XI8AgN0jYh9Acvo8zbdd8YMP4hNg5IPGJqEXs2bbFdkJDDtHxGGgyenzNN9yvQ8+MCTA2AeNSUIvZs3Wa3IYKOwaB3IiGAEwsMZFMvpeOBEMdgwlAC7/qebp/7zzh4ESAANrXCT0ohWMhwCAhlAAPHvYOgpo988DIAAG1rhI6EUrGA8BAA2BAOieDXC88wHATuCBNS4SetEKxkMAQEPwG8Gyo9eKg0HfnKT/5rY+T/Ot1+Qw0EE1LhJ60QrGQwBAQ/A7gY/P628GPkt9IjAngtUaFwm9mDUuEgIAxkDoPIDyayDPyi+Dme7HmcAGCYPGrHGR0ItWMB4CABrUE8Fm5dfBz/hS+GE0LhJ6MWscHPHHi8ZieQESANCwIQCKrT8v7nAxuEE0LhJ6MWuGVxjOGIvF8gIkAKAhtA+g3ARUXQia7wMYSOMioRezZnCD5ZoRsVhegAQANASOApqWW/+rXQF8H8BAGhcJvZg1QwtMV42LxfIC7BUAw10n7PLjW/Nm9Ih8Psmy29VSG8tAHIEAuJhkrz8uDgO6XfxF2AQkEn9ckazpsW68ZE+GZinZk14IAJlqZ2M4AMoL1d/euEsy+T7LvSZ0JvC0PP83/yc/KlLX9SHtCtWZBVf9KGDnWAbAFT0Acc4XT+ZxB8BZdnIeMd8JAAvBawF9Xmz4uZwO8IVgY/8EEPnG3nJusQjvmq2SPelllJ8AqifzyAPg9pwASIxyMbj/N5/7l09effVHqa8M3edpnuwFEyRyrJuuLiTC0LRK9qWXEe4Ebp7M5gB4+oP8LeK1ckbMsttPJtn19/M77+b31RcQePZwkmU3Hxc/TrP7T17Jio3L9QGG5bv6utDlg+LN5kkRABf56q+fr6xdfVPhv6iXqmgZm4dxuVigJYYgB3I56HhixzoB0NG4SPaml9EdBrp8NhsD4KP6cmHVCUOvTcrtBWfVfeU7+YtJ+fNRcTLpNHu1ubhkXaW62EDJMgBemyy2O7TWlgOgNi4fxiIA2mIIEjoK6PUBk7PP0zzZCyZA9FwnADoaF8n+9DK2E8G2DYBZdvRe/r8nWXG44Gw5tb99nt9XHUOe3crflj8qb0yzYit+/p79fnN9gZVi1Sag7PhxvVBnbWETUGNceRgn89VVIUToRLDUl39o0+dpnuwFE4AA2E7jIqEXrWA86QKg3mBfvZGflfN3sVlnWl1JrBrXZ63jCcuVhKsMNAGwXKizthgAlXHlYZzMV1eFEIfyncCxxM/1+PkfWGo3B01A4yI5wF4M3zEZT8JNQDnPf/Xu3ayavOXobm3Wac4oLT4V5L+bVkO5nM1Vmc51xpoAWCzUXVsMgOUBKq2HcbIqhiDqmcAD0ed102PdKAxv7C3zX1puVIOmr8ZFcni9WL5lPp71Ib/1TuBnd+ut78sAqK8kWVJtkW82/Ndv1M/qQX9/pVbnKKCzxfb8xXdSKQHQfRgnq2IIEvw+gOPhdgL0ed30WDcOw4Ydy/wXlhzToOmtcZEcXC+Gw4UsL0Bhym95GGixp/Xo5tuftLa9dBZofbHUagAUS5drzJrRvRYA3bXFADgJPIyVVSFEIACeP8qya6+9VfPDQzoTuN+G/UA5qeSIBk1/jYvk0HqxnDBgeQFKY36rE8Hy99kny60+iwBYfgJo/zzvBkBxjclpdl8PgM6GiGAACA9jZVUIEdwJ3OawrgWUdP4TAAklh9aLawAEWVm5+wa/GrPVQSPLcdzaB9DeyN8JgPn06K8fdCaLtAmofSxKMACEh7GyKoQgAARJSgsBkE5yaL3sTADMsuWBPYsBX/6v+T7Bcmt9NwCKg/g75+yuBUB37c0B0H4Y3VUhBCeCCRICwKxxkRxaL6MPgGrby+WjrBMA1XkAT5sj+Yu9ic2x/+0AKN5ldg7RrGZ1e6HO2osAWE70ziag5cOovsWkvSqEIAAESVILO4GTSQ6uF8edwIYAWGwZuN9svz9+VO3Nrd+b12cCV+/zqxNys9aVns8WY7u7nf6iPKu3u6e4tXYdANVS1RqNsfMw6gU6q0IIAkCQpLXEHwaadu9DJTm4odlf4yIZ2WGgWwZAc9Wf8l33cuPM+rWAihN1VwJgsZVmweeT1QBor92c01UuVa2wMLYfRrNAe1UIQQAIksSW2BPBEh9/VEkOb2j21rhIxnUimCEA0sFJuiOAABAkVzNoDGcgGCQHODT7alwk47oUxFUEwLBnm0IcBIAguZJBYzgH2SJhaJo1LhIC4AnX7R8BBIAgIQDMGhcJvWgF4xlDAEyzjA8AI4AAECQEgFnjIqEXrWA8YwiAR9nRvWEqgwUCQJAQAGaNi4RetILxjCEAYBwQAIKEncBmjYuEXrSC8RAA0KAGwOUXgzj7PM2TvWA0yRUNGg4D3SChF61gPAQANIQDoPia5Zc+ffEnyb8TngCoNWv3cCKYLqEXrWA8BAA0hALg8qPqKnAv7mTXU19Pu8/TPNkLRpMwaMwaFwm9aAXjIQCgIRQA0yy7/qeTlz69/HdZ8svp9XmaJ3vBaBIGjVnjIqEXrWA8BAA0BAJglmX36uv+pb+eXp+nebIXjCYZ/aCJ31Y0/l4MEnrRCsZDAEBDIADKKzLVF349S33GXp+nebIXjCYZ+6Ax7C0efS8WCb1oBeMhAKBB+1L4OgAuJnwhzCCabVe0HC869l5MEnrRCsZDAEBD6BvBiplfB0DnW6BT0OdpnuwFo0nGPWhMZ4yNvBebhF60gvEQANBAAAiScQ8aAmBgjYuEAIAxENoEVH2dWzn5k3+rZp+nebIXjCYZ96AhAAbWuEgIABgDgZ3A9TdyFgFQfOFmWmefp3myF4wmGfegIQAG1rhICAAYA4EAuJhkt87LAHh2N/llW/s8zZO9YDTJyAcNO4GH1bhICAAYA6ETwYrvdX51cvTaK/n/U39xW5+nebIXjCYZ+6DhMNBBNS4SAgDGQPBaQJ9Pmq9+Tv7FnX2e5sleMJpk9IOGE8GG1LhICAAYA+GLwT3/+NV8+l97/XFyZ5+nebIXjCZh0Jg1LhJ60QrGQwBAA98HIEgYNGaNi4RetILxEADQQAAIEgaNWeMioRetYDwEADSEA+BX/2nBf+Y8gCE0LhJ6MWtcJAQAjIFQACz3AZdfC5DU2edpnuwFo0kYNGaNi4RetILxEADQEL4cNAEwtMZFQi9mjYuEAIAxELwUxNF7/7Qg8VcD93maJ3vBaBIGjVnjIqEXrWA8BAA0hC4Gl/pLYNr0eZone8Fokv0ZNAN8y7AIfxerhACAMaBdDXQo+jzNk71gNMneDBrDKcP94O9ilexsAMyuvfZXzUEhl3/75r9cHRSXH9/abixMW6ecnq2cfhoaSJVsGj5ZtdiXeXvjQ9r6Me8+oU1ABMDwmsENlosG9YO/i1WyuwGQZYvNAzNh/+Bs22tHbhMAlSwcAOW+zNsbH9LWj3n3CV4NlE1Ag2uGFpguG9oP/i5WyegC4OWcuAC4NmnG5fTa+rcFJgmAVbYNgLPs5DziIREAq7y4k/oSoC36PM2TvWA0yZ4MGgJgO42LZGwB8PLLoQRYWXmWXb9bT+MXd/54fTCPLABuxzwkAmCNZ3ey6281/JATwYbQDC0gALbTuEhGFgAvvxxMgJWVZ9nxo3r7wOzo39eD+dnDLMuKy4ZdPig2upy07ypWuf1kkl2v3lI20/qsXmqSZTcf17+4uJuvcj5fbAJ6mt++dm++CIDW0gWNrL1me6HqYPZ/sXhI3cfy9AfFtc5+dN55zJ36h0AoAD7iPIDBNUMLCIDtNC6ScQXAyy+HE2Bl5TwA/qHeBjR96b/WXxpYnTZ6dH85TJd3Fau8lt+qv1ewfrddfengRWupablUtVwVAGeLyxFXAdBeuq5RB8ByzfZCcgDUj6WZcCfLx7xa/xAI7gMgAAbXDG5gJ/BWGhfJLgfAf39Qf1n4yWIwv/7F/PKj8qujqgG/clfrW2XrN/MXxd6DF3eyW/k78EflhJnmSz2e52/P79cBkNf49vn8SVYuuLp082CqTUDLNbsLrW8Cah7LLDt6L//fk9ZjFurvP8qJYGm3+7To8zRP9oLRJHszaDgMdBuNi2SXA+C8OkYk/281zc/qATst3/qXN1buau9RnNYrnyyXKuf0tJrM5Sais+o/J83ypaezdPNgqgBor9leSAqA6rHUW6KqDyLdx7x6CNJeEzoPYMB9wARArXFwcCLYFhoXyU4HQDkwi2PFy8FcDdH6V/P6d927js/bBZoFLh/UY+Ziki8wreZvnQy3lzXm1ceG7tKtWu01VxaSAmD5WJ7/6t272SIApPr7DyeCCRIGjVnjIqEXrWA860PethO4+rbwi8lJs2mmnpzlrXKYrt7Vnqj1ylVytLYy1+/JFwHQfhdaBcD6NunOUUBni+35i4WUAHh2t15uGQBDbfMeM5wIJkgYNGaNi4RetILxCFPechho+W79fnmuUB0Ai8NClwGwdteC8p32WbWUHgDLIVT83F26eTArAbCykBQA1c/FDt+jm29/stwEJNXff4I7gQfcDNbnaZ7sBaNJGDRmjYuEXrSC8Uhj3nAiWLWdp3yTGPsJoHOYfT5cqs073S3Nmz4BSNulhQDoLBQMgPwBFKeItfcBDLvde6wEAiBP6XuDOfs8zZO9YDQJg8ascZHQi1YwHnHOB1lZuQyAfCD/l0nzTj9iH0AnAC4mx/9QnkHc3sq/HgDr+wDWL08gbQJqLxQMgGbaV5e97D7mgyKwCeinb+YfkF7jRLBBNS4SejFrXCS7HQD5G8Q3q/fwcUcBdQIgX/ndZrdttUG+3qzUDYCmRvXGvjwKqLV082BWAmBloY0BMCtPM2ge81r9/Sd4OWjOAxhc4yKhF7PGRbLbAVCcKFRMhfZ5AM8f1sfUF79fuat7pYWzrL6eXD5njh/P6yP41wKgOg/g6WS5r6G1dPvBtNfsLtQEwHKidzYBXT7K6gAoFhDq7z8EgCA5wEHT83jRUfXSV+Mi2fEAyIdzNTNXzgSu9q4Wm306ZwJ3AyBfpB4p9VJZ66LOywBoTkdd7FRuL72olMvaa3YXqupcLM9DXjyW+jsPjx81pwAvH3Or/v4T/lL44ejzNE/2gtEkhzdo+p4xNqZeemtcJDseAPk76GK0NkfqtC78U1yCv1iicy2gbgAUb7/rH6ur7xTn5AoBELgW0HutUqWsEwCdheo69UPqPJa6dtXO4jGv1t97CABBcnCDpvc1I0bUS3+Ni2RnAwD2CgJAkBzaoOl/1bjx9JJA4yIhAGAMrAbA5U+LY37y/7bhKKBBNC4SAsCscZEQADAGVgPgxZ3q4nvsBB5e4yIhAMwaFwkBAGOAABAkhzZoLAEgLzWeXhJoXCQEAIwB9gEIkoMbNLb5Lyw3ol76a1wkBACMAQJAkBzeoLHN//Ulx9RLb42LhACAMRAIgOnrA34xZp+nebIXjCY5wEFjm/9ry46ql74aFwkBAGMgeCbwgGdD93maJ3vBaBIGTQBDAAzwVTT8XdSC8RAA0MAXwggSBk2A+AAY4sso+buoBeMhAKAh9IUwfCXk8BoXydUEwCBfR8/fRS0YDwEADcEvhDkebidAn6d5sheMJmHQhIjcCdz/xAIJ/i5qwXgIAGgIBMDzR1l2je8DGFbjIklsiTsMlADYKCEAYAxwOWhBwqAJE3UiGAGwUUIAwBggAAQJg8as6d4kADZKCAAYA5wIJkgYNGbNym12Am+SEAAwBggAQcKgMWtW7+Aw0A0SAgDGAAEgSBg0Zs3aPZwIpksIABgDmwLgnwZw9nmaJ3vBaBIGjVnjIqEXrWA8BAA0BAPg8uObn5Z7g9NfFajP0zzZC0aTMGjMGhcJvWgF4yEAoCEUALNJeexPcTjQUerLAvV5mid7wWgSBo1Z4yKhF61gPAQANAQC4GKSZcfF6V+/ejjJUl8Wos/TPNkLRpMwaMwaFwm9aAXjIQCgIXQ56Ox6s+Xn8kF2ktbZ52me7AWjSRg0Zo2LhF60gvEQANAQOhGs9a7/YsKJYINoXCT0Yta4SAgAGAMRl4NOfm3oPk/zZC8YTcKgMWtcJPSiFYyHAIAGPgEIEgaNWeMioRetYDwEADQE9wGciD8noc/TPNkLRpMwaMwaFwm9aAXjIQCgIRAAsyx7/Yvyp+cfZam/HrLP0zzZC0aTMGjMGhcJvWgF4yEAoCF0HsA0y7KjV199dZL/P/EHAAKg1rhI6MWscZEQADAGQgFw+ai5FvTRn6V29nmaJ3vBaBIGjVnjIqEXrWA8vQJgdu21v2q+IOryb9/8l/r+wVnPt49915coj2o5y25HLn758a0UwiimrUe1nde6VvhaQJdP38w/ASz/2Ono8zRP9oLRJAwas8ZFQi9awXj6BUC23CY82/hdIXsQAP0fwnYBsJ3XuhZXAxUkDBqzZvtV4y8bOv5eDJLRBcC3cuIC4NqkmTHTa5uOEBxtAHg+BAKgS5+nebIXjCZh0Jg1W69p+OKA0fdikYwtAL71rVACrKw8y67frefZizt/vGm0EQAmIQGw6Wme7AWjSRg0Zs22K1q+OmzsvZgkIwuAb30rmAArK8+y40f1NqDZ0b8vR1s9ts6K2TPLbj+ZZNffn8/z/x3dq+fRs4eTLLv5uFq/WaDi6Q+yLLv2o2JL8zS7/+SVrLn+cHv9+dpvnz3Mmp/bv1hdaKGdX36UZdcfF1t+WpuAlnd2l16WuXyQtY6Dye+/uFvuFv18kl17T23gWXH/q/fmiwDoLLj8F2s/iPz+vH72+nnLG/y3W95aVBbXUiEABAmDxqzZcj3TlwePvBebZFwB8K1vhRNgZeU8AP6h3gY0fem/CgHwWnUhyWl5CMlb5TQqri2Z1dcVXixQ8VF9rEmx2DR7dfkd5O31K1v7t7NWxfYvOgu1tdVoPHqzEwCtO7tLL8usBsDb5VK3y0dXni0baqAuV9xfBUB3weW/WPtBTMt/nOKfZ+EN/9stbi0ri2upEACChEFj1my5HgGQrmA8fQPgvz8o5+uLOycvhACoBtQsf/s+v5zWAzC7dV4cWFgsPGtN/3Kx4n30k3KYFkufF+/873fXr2j/Np9vr39RvHVeXa39c0d7Voie5e+u2wHQurO7dPeRtE+KzRcqjpDMH9yzB1W/cgP5KP523ubTSX5/KVxZcPkv1n4QeYHjxx2v+m+3+KdeVhbWUiEABAmDxqzZcj0CIF3BePoGwPlZuQ0o/68UANVVZKr7qksJn9UjtBy6s87l5etV8+XK6X282D7SXr9ZdPnbpmJ5lYLuausLFdpKUARHKwDad3YfZLtMNwCK+6sVyn+JYAPtq+mUwpUFF/9inQex7lX+7br/1HUhYS0VAkCQMGjMmi3XIwDSFYyndwDMqk0XL30qBUA5wpr5V424emxdTPLfzdpvYkue/+rdu1k1Fk+addrr17R+Ww/NxQxe/KK7UEtbqufNbK4DoH1n90G2S3YD4PayuUUnUgP5Q7z+Sb3WYidwa8HFv1j7Qax7tX+79q1FZWEtFQJAkDBozJptV2QncLKC8awPedtO4PNyol1MTuZKAFQzb7bYMN1sHF8JgGLbR0l3LLbXr+n8th5w7ffWdQC031ovtbPWW+JFALTv7D7IbkdqAAQayP+Tc/2vlv8YgQXbD2Ldq/3bLW61KwtrqRAAgoRBY9ZsvSaHgaYqGI8w5S2HgZbvkO8XW4DEACjnWXMJ4Vk5rrtDrH2cYrGz8ujm25+sbhhpr18jxIMaAB3txgDoPshwANyfdwMg1MB8XhwPlBX7DOZ1XsoL6gGg/ds1tzqVhbVU5AC4/OkPl0lz8ea/Sns2cJ+nebIXjCZh0Jg126/KiWCJCsYjjXnDiWDltoiTYgtQOADa7+A7F5fvDrFiG//5XNgynuATQEfbvFteCYD2ncKuic0BEGyg7O5vi8MzK2FwwfaDkAIg+G/X3OpWFtZS4QthBAmDxqxxkdCLVjAecc4HWVm5HFj5TPgvk8UBjmIAtPcBtK8n3BlizWL5W9bVaF+ytgAAIABJREFUABD2AazuOO3uhxU2AS21EfsA2g8yOgCCDdRcPqq3mAUXXNkHsL4JKPRvt/pPXVUW1lKJCAC+EGYgjYuEXswaF8luB8Dlg6M3qyMtq0Msy/OZHrTHZfcooGrGNR8elsWa4TXLVsefdBRQewN75yggMQA62nok5kNy/Sig8s7ugzQHwFoDzdQs5ns7AKoFW/9inQex7g3/260GQFVZWEtlLQBam48WrBb5539zevrGj39e3fjmZ++cnm6+0aLP0zzZC0aTMGjMGhcJvWgF4+kfAMUuzmLAVQGQj57ysPj2uCwPayzOca02SR8/nguH1debL8pLD6+Mv/b6FSu/ff2L+fOHawfVt3/uaM+KRYXzAN5vnQewXFrYrV0/BnETkNBA/ouiXHmywHITULNg+1+s/SDWveF/u+4moGXltbVU1j8BzNYDYKXI35+WvPE3xY0//KS88Z1f6Dfa9HmaJ3vBaBIGjVnj4IjfWdCP3fy7bHidd0gQAPkErgZNEQDVQScv/V3n/XJ5FEx9Jm993m52a74+xKq3mI9Wp3dn/ZLOb7tnAssB0NFuPhO4vfRK2CwiYH0ncLCB5kzg6582J4K1Fmz/i3XPBF7zav92J+v/hsJaKusBcPkf33rrzcnRa281vP1Jd4Hfnb7xb+fzrz+sRvtnp9/7eXHje79Wb7Tp8zRP9oLRJPszNPeoF8PhQv3Yzb/Lphd6mwQBkE+t6oDIckPH5cMsu/541t1g8uSV1WsBvVet3x5i86f5W99r99Y3vHTXL+j+tnMtoEAAtLX1FXc6+wDad3aX7pT5fKIEQLiBslx56Z/qX6m9YPtfrP0gJG/w325xq1N5fS2ViH0AK3zz4elfFv/P3+Dn///9O2UM/OEnxeeB8I0OfZ7myV4wmmRvhuYe9WI5YaAfu/l32fhKb9ErAHabqbRNRLzTmyt6EBGHga7wh5/UG3U+O/3z+fzL0++XN77Ub3To8zRP9oLRJPsyNL/an15Mpwz3Yzf/LpYX/QEGQL1Ptnt8pHinN1f8IHqcCFYGwGfVx4H574pxH77Roc/TPNkLRpPsydAsJXvSCwGwsWA8BxgAL+6Ue0qnnQNaxDtH8cj80ALgnxq+kH5bbtv55sN6A8/v3/ner8M3qjX+qCbdo4dDYRkAV/1I9oADDID5k2qnaPdttninN1f7IEIBUO5jaRB3CJSbeAgAcIEASMghBkD5pSlHrz+OuNObK30QgQDong0gBcDvysNAW2P+O78I3+iu2ueDbrKPzJpkTzablJJ96cWwBajnhqLd/LtYXvQHGQAgEgiAsyy7/vZ/avjP61unfvfOG8UmftMngIY+T/NkLxhNsi9D86t96sU0//skwG7+XSwvegIAGgJHAT3oHqy7xpf1aWAEQA+Ni2R/ejHN/x4fFXbz72J50RMA0BA6D0DfJfH3p83B/RwFtL3GRXJovRgOFwosNp5ebAXjIQCgwX4iWP62/7PT7zab9Zuj/OtD/0M3OvR5mid7wWiSQxuaCTQukrQBEFpuPL3YCsZDAEBDaBOQ9gngs9bVHTgTeHuNi+TQeokOgOCC4+nFVjAeAgAagjuBw18m/GX76j7ffHj63cUVf8I3OvR5mid7wWiSQxuaCTQuEgJAKxgPAQANgQDIPwLcC6xRX+SzoNi4/3X7mp/hG236PM2TvWA0yaENzQQaF0mUxboFiAAgAA6Y0LWA3syy5QVBOxcG+t1pJwDmX/8s/+nH9bv88I0WfZ7myV4wmuTghmZ/jYskzmLaBUwAEAAHTWgncLbpRLAe9HmaJ3vBaJLDG5q9NS6SSEvP40VH1YuhYDwEADQQAILkAIdmX42LJLGFw0AJgIOnx9VAt6bP0zzZC0aTMDTNGhdJagsnghEAhw4BIEgYmmaNi4RetILxEADQoAbApXgd6N70eZone8FoEgaNWeMioRetYDwEADSEA6C4SOlLn774kx8l/56CPk/zZC8YTcKgMWtcJPSiFYyHAICGUAAUX1RcBsCd4mvt09LnaZ7sBaNJGDRmjYuEXrSC8RAA0BAKgGmWXf/TyUufXv67LPl3lfV5mid7wWgSBo1Z4yK5sl56fsOAJCEAYAwEAmCWZffqS8I9maT+uvo+T/NkLxhNwtA0a1wkV9VL328YkCQEAIyBQABMi2sB1dcEPdvw3QBm+jzNk71gNAlD06xxkVxRL4ZvGIiXEAAwBrSrgdYBcDHhRLBBNC4SejFrVm4bvmHAICEAYAxo3wdQB4D+5QBb0OdpnuwFo0kYmmaNi4QA0ArGQwBAAwEgSBiaZo2LhADQCsZDAEBD8DuB7y8m/yz1YUB9nubJXjCahKFp1rhICACtYDwEADQEvxDmpAmAjV8Qb6bP0zzZC0aTMDTNGhcJO4G1gvEQANAQCICLSXbrvAyAZ3cz/Qvi7fR5mid7wWgShqZZ4yLhMFCtYDy9AiAfDRXXelwj4PLjW7GLal9OmNZ0kIROBDvL/8KvTo5eeyX/f68/gECfp3myF4wmYWiaNS4STgTTCsaTJgD6nCE6i9+q0DMADKaDJHgtoM8Xf+fU858AqDUuEnoxa1wkowuAGzlxAVDP/aeT7UeD31gmAHTCF4N7/vGrxee81x8nd/Z5mid7wWgSBo1Z4yKhF61gPKH5LyfAysqLAMhn69aHBxIAY4HvAxAkDBqzxkVCL1rBeILzX0yAlZWXAVDuI5xlt59Msuvvz+fPHuZvGKv3i9Ps/sXd7KjeSfDs4STLbpa/qJa+Vm5ZOGkOL2xfauDp3fxN573lotffLzcB1QX/rNwyce291bIVy4dSXMm43Edx+aA0SUtDCQEgSBg0Zo2LhF60gvGE57+UACsrrwXAa5Nyb8Cs2mZ8VFw4bJq9PWkmb7PToPxFtfT1u+Uv68PMq2POK86WW52bwnUAVAVvT8tS76+UrVg8lI/qjdcnywBYXxpKVgPg8qdvrfNDzgMYQuMioRezxkWyBwFQvoOf1fuC8wn7+hfFVeSL6ZyP6ePH9WUkX9zJbuVvxR+V24uapasNM9Ny8rdONM2LfPt8/qSzaB0AeZG8RnZ0b/7sQXWMeqts83ia4kfFZ4Qn5UOpTMLSULIaACtfB8+Xwg+ocZHQi1njItn5ALh8Uu4EntVHiTfbcabF/6dZfRnJfNHmF2ftpaux3P7vvFWkDIZl4TIACunFpP5ssFq2olljWt1VfbKoqgtLQwkBIEgYNGaNi4RetILx9AyAzmGg9Yb8xXac8nY9gov39tV1Jed1cDSb/Zv35cVkmS62ALU3Bs2XewhuNzP9xZ2yVvGbbtnuGgXPf/Xu3WwRANLSUMI+AEHCoDFrXCT0ohWMZ33Im3YC1+P/Zrkvtp669Wyuh3o904u5W22Fb95HdgOgXK61BWhRpFU4GADrb08XAfDsbv2rZQAM9WZ25yEABAmDxqxxkYy+l/gTxsYWANscBlpSj/LFGF8NgNYmhTIATtprFf9rbQHqXHZy1t5q0+wtWARAt2x3jSKijm6+/clyE5C0NJQQAIJk9IPGIKEXs2brNQ2XjBhdANhPBKtYBEDgE0DnXf1qALy4c3y+3AK0+glAD4D1C9TUaxQXL1tulaoDIPXlbPaGDSeCHb36oy+SO/s8zZO9YDTJ2AeNRUIvZs22K1ouGje+AAiysrIcAOI+gOKrpDrb9VcDYD49+usHy/fkK/sAtADolu2s0Uz7/G1/axMQx3/KBAPgbPGhiUtBDKRxkdCLWbPleqbLRu9bAKweBVQfwXlSHwo0Xxw02g2A4tD91pm6dZHyf3oAdMt2HkoTALOsOu6oOgpobWko0S4Gd+21t97kYnDDaVwk9GLWbLneYQdAdR7A84fNeQAn58vzAI4fz+sby8FfFSk2zt9u1y7OA3jaWTQQAJ2ynYdSbQIqThqoAqAwCUtDSfhy0MfVadPPHnA56IE0LhJ6MWu2XO+wA2DlTOC3lhsP6l9kt+aduCgH8+XKdKm3O7RPDwgEQKds96HM6oNUHzWnAC/PU24tDSWBAJguPyrxhTBDaVwk9GLWbLnegQfAyrWAikv+3Gt+MVkeNFov/fmk2UrU3SbTvhaQHgDtsisPpS5SLVeb1paGktBXQrZyOfnJE32e5sleMJpk3IPGJqEXs2bbFQ9jJ3AM0+gtLZyae8VoXwov3UhBn6d5sheMJhn5oDFJ6MWs2XrN+Pk/xDfMxDOeAOi804QrgAAQJGMfNBYJvZg1269qmf/Jv2MynvEEwBOu1n/FhDYBCRflSEafp3myF4wmGf2gMUjoxawZ3DDMt8zHM5YAmGbJDzABI+wEFiT7Mmi+opdtNEMLTHuLY7G8AMcSAI+KqzvDlRI+DPT6J+VP/3iXw0AH0rhI6MWsGVqw/wEAO4N2Ilj26quvDnEqcJ+nebIXjCbZk0FTSujFrBlaQADAaAheCuJJc9XX9J/S+jzNk71gNMmeDJpSQi9mzdACAgBGQ/hicJdP38w/Abz2XvprZ/R5mid7wWiSPRk0pYRezJrBDXu/Exh2Bi4HLUj2ZdB8RS/baIZX7PthoLAzEACCZG8GDb1so3FwRM9/wxcMxEMAQMNqAFz+9K0fnhf/bfNDzgMYQuMioRezxkUSZ7FcWyIeAgAahC+Ff+nT1a+G50zgQTQuEnoxa1wkURbT1eXiIQCggQAQJAc3aPprXCSH1ovlcCHLC5AAgAb2AQiSQxs0CTQukkPrhQCAoVnbB5D+K4DX6PO66bFuvOTQBk0CjYvk0HohAGBo1jcBXbs39Ldm9nnd9Fg3XnJogyaBxkVyaL0QADA0wj6A5mt9BqPP66bHuvGSQxs0CTQukoPrhZ3AMDBrm4A+Knf7DvoxoM/rpse68ZKDGzT9NS6Sw+uFw0BhWISdwMU3ag76MaDP66bHuvGSwxs0vTUukgPshRPBYFDEo4AuP54M+TGgz+umx7rxkgMcNH01LhJ60QrGQwBAQ+gw0H98ONzHgD5P82QvGE3CoDFrXCT0ohWMhwCABu1qoHcH+hjQ52me7AWjSRg0Zo2LhF60gvEQANCgngj2vNoUlPpjQJ+nebIXjCZh0Jg1LhJ60QrGQwBAw6YzgctNQVwKYhCNi4RezBoXCQEAY2DjpSAuP36FABhG4yKhF7PGRUIAwBjQA6DeD3BMAAyhcZHQi1njIiEAYAxoAfD0B8McCdTnaZ7sBaNJGDRmjYuEXrSC8RAA0BAMgGcPyx3A199L7+zzNE/2gtEkDBqzxkVCL1rBeAgAaJADoD785+jWINcG7fM0T/aC0SQMGrPGRUIvWsF4egXA8rtCrt0yHiE+PT5/cSfpDsVZdrJ23+f57Lp9lt3u3lvecfnxrebHIBeT+5usVZn9QAiAyyevZEO9+S/p8zRP9oLRJAwas8ZFQi9awXgSBYD18MBZdn8+fADMigcWCIBqcT0A5tONj1CKnV1lLQDqDf9HPxruanB9nubJXjCahEFj1rhI6EUrGI845/+nnLgAaAbk04lpEL64czJ3CICz7CQ4uqImd/k4rdadRbwcdHbzkyGdfZ7myV4wmoRBY9a4SOhFKxhPaP7LCbCycmuEX0ws0/zs6H2fAAi/v4+b3OUDNVp3FiEAhnzzX9LnaZ7sBaNJGDRmjYuEXrSC8QTnv5gAKyu3RnjzY7nV4Fo5NqbZ/Yu7ixFSHkly83G98PH5YpX2L4or0F9/XM/tVqnqusTX7s2LiXtc3nPWmrxPJtnRvXoUL8uVG4DyO8ty+YMpNmeXhzHmd1w+aP2uWGlxiGN7wSLXlpZZdjsXXX+/9ciaMt0udpW1APg/B33zX9LnaZ7sBaNJGDRmjYuEXrSC8YTnv5QAKyu3AmBW7QT4qN4jUMzEafb2pPk5n6TV5uRyr2o1dqu127+o5unRm+Wv26XyNUpuL5z5oosdtNPyd2+VS7bKrQTAq4tdFWsBMGs9hvaChWb5EWCWvZYvl8fP8pEtAqDT3q7Cl8ILEgaNWeMioRetYDxpAuDySbUPYJYdFYeLPMmKsZnP5ePHxbvz++XWhFv5G+ZH5Vytp2q5ducXZ8Xqz+5m1U7aVql8vn77PP+5WGhaTv5O9hzdm19Oy0HcKVeP9zoAiv0B1YNZ3QmcV3/9i+LTR/2oFwvOO1uRZln14aPzyKoyXe2uQgAIEgaNWeMioRetYDw9A2B5FNBxtdWnHJfV2/NpM4XzXzUbbM5ab+LL/7V/Ub+rz+fx7ZVS9VLl7J/VUbPYNlMtmS94Mu96ugGwfICrAdCsNC3+P+100vbMsurTQOeRNWXa2l2FABAkDBqzxkVCL1rBeBIFQOtK8c9/9W7+Hv7+YlAWc36xJeViko/XejP+2i/KX86Xw3dRqr29p46P6eKeF3eqEmflJpm2pxsAJ81CqwGwqF4+rvaC887O7WbvQ6fJssyKdlchAAQJg8ascZHQi1YwnvUhb94JfPkoW2wof3a3ToT7ixldTMdqW3mzbb1+V10FQOsXs8776FapZsZXTLvnEDQ/zhbb5Nsb++eLALhdlV4PgEX1slJ7wVb1eSsA2k3WAdDR7ioEgCBh0Jg1LhJ60QrGI0x5+2GgZ1n9HrrYF3p08+1PHqwEQGtb0XKzT7F25xedAGiX6h4wWizW2jLTvEcv7up6ogOgri4HwCJ7ZosPBa0mZ/WeBwJgO/o8zZO9YDQJg8ascZHQi1YwHmnM208Eqzf3F9vhz+fLfQCtAGi/he8EQOsXyyM8b3dLdVcvDiJdbgHqfALoLpjmE8BqAHSbrANg0+kCOwEBIEgYNGaNi4RetILxiHM+yMrKrffO9cEw1SDMby73ARTv0Dsb8Vc2AS1/0d4H0CnVXX0+PfrrB8t32t19AJ0F4wJgdR9AeBPQSdtXNdlsAtrp4z9rCABBwqAxa1wk9KIVjCdNANQbgZrZOMtaB97UM7ea7eWMrQd9fRTQ8hf1HM0n6+2VUmedPbPFAfmt82+7RwG1PJEBsHoUUCcAOjuBOwEwy9pl2tpdhQAQJAwas8ZFQi9awXgSBUA+fo/P660jl4+ybPXQ+3yoHz+eL24sDwPt/OKs2JtcnQfQLVWdB/C0Pji/2OTeOtyyPGy0OIf4ZMWzIQAWEVGdB/D8YX0eQCcAOoeBtjYBNY+sKtPV7ioEgCBh0Jg1LhJ60QrGkygA6oP3q5Nvs+NH1Xvpt8pb5UCtT7bNiosnt08EW/lF8VN1JnCnVHMmcDWM88VWNvUXVGcCt8upAXBRntUrnQncCYDOiWBNJrQeWVWmq91VCABBwqAxa1wk9KIVjCdVANT7getL9tRb0+/nb4nLC/jMm4vlVJeVn7UuBdH5RXUtoGoGt0u1rgVUcLaypeXJK6vXAnqvXi4cAMV3BTQB0L0WUDsAupeCqD8MdB5ZWaar3VUIAEHCoDFrXCT0ohWMp1cA6EyD20Oqi8FtsWKN3wm37YvB7T0EgCBh0Jg1LhJ60QrGcyUBkE9w6Vf1DteNB1W235YPzHQvju+MhAAQJAwas8ZFQi9awXiuJgDkjwDFwaTnxWXdNhxK88TtGvybvxBmnyAABAmDxqxxkdCLVjCeqwmA8ish13lS7UnV33VPNy2QkM1fCblPEACChEFj1rhI6EUrGM8VBUDxpfDCvcU3rRy9rn+tyqPi6s8+RHwp/D5BAAgSBo1Z4yKhF61gPAMGAOwYBIAgYdCYNS4SetEKxkMAQAMBIEgYNGaNi4RetILxEADQQAAIEgaNWeMioRetYDwEADQQAIKEQWPWuEjoRSsYDwEADQSAIGHQmDUuEnrRCsZDAEADASBIGDRmjYuEXrSC8RAA0EAACBIGjVnjIqEXrWA8BAA0EACChEFj1rhI6EUrGA8BAA0EgCBh0Jg1LhJ60QrGQwBAAwEgSBg0Zo2LhF60gvEQANBAAAgSBo1Z4yKhF61gPAQANBAAgoRBY9a4SOhFKxgPAQANBIAgYdCYNS4SetEKxkMAQAMBIEgYNGaNi4RetILxEADQQAAIEgaNWeMioRetYDwEADQQAIKEQWPWuEjoRSsYDwEADQSAIGHQmDUuEnrRCsZDAEDDVQQAAFwhBAA08AlAkPBO06xxkdCLVjAeAgAaCABBwqAxa1wk9KIVjIcAgAYCQJAwaMwaFwm9aAXjIQCggQAQJAwas8ZFQi9awXgIAGggAAQJg8ascZHQi1YwHgIAGggAQcKgMWtcJPSiFYynVwC8uJPVXLt1vlZ6mt0Xf+7B5ce3UpQBEQJAkDBozBoXCb1oBeNJFABZ9tKnq6UHCIBZdpKiDIgQAIKEQWPWuEjoRSsYjzjn/5+cuABoxv7TyfpoJgB2DAJAkDBozBoXCb1oBeMJzX85AVZWXgbA/GKy9hGAANgxCABBwqAxa1wk9KIVjCc4/8UEWFm5FQDNj88eZln2+uPix3zoP30lO/rR+crPxUKTLLtZLjTLbj+ZZNffzY7LX50tJnz9i/fzTxc/KHYy5KtePii2NZ10C0AyCABBwqAxa1wk9KIVjCc8/6UEWFm5FQCzaifAbFLuEDgq3u9Ps7eyZmK3f84/LSwXmmWv5beO/1tVKR/x9xcFy1+czz+qdzKcLAOgXQCSQQAIEgaNWeMioRetYDxpAuDySbUPIJ/Mr38xv/woO3q/GPrZ8eN5/pv73Z9f3Mlu5W/nH5WRMcuq9/7VNqJOolS/mGVH7+X/e1KWrDYBdQpAMggAQcKgMWtcJPSiFYynZwAsjwIqp3WzBWda/H9aDeiz4lftn5uFzrLb5Xx/v7hRjfbWNv7mF9NiqeazQfX7TgFIBgEgSBg0Zo2LhF60gvEkCoBr94r5v9iCM6uG/u1qoXz2t36+fFBN9vzjQr7QrN74X733b+0rbn5R8PxX797NFgHQLQDJIAAECYPGrHGR0ItWMJ71IW/eCXz5qH6znt9e/FAO/XKal/O69XO1Jb85d2Ax54slWluAlr94drdeehkAyskHsD0EgCBh0Jg1LhJ60QrGI0x5+2GgZ1k13xcDXAuA1najMgDqjT7FD+2jPJufix2+Rzff/mS5CahbAJJBAAgSBo1Z4yKhF61gPNKYt58IVm/ij/oEsFioZDHzX9w5Pm+fLVD/In+7f7LculQHQLsAJIMAECQMGrPGRUIvWsF4xDkfZGXl1jv+clyL+wDKU8RaP7cO9Zy3d/tOj/76Qesdff2LZtrnhtYmII7/HAICQJAwaMwaFwm9aAXjSRMAzUaglaOAlkcGtX8+q7fulymxDIDiwP/Web4rATDLqmOGqqOAWgUgGQSAIGHQmDUuEnrRCsaTKADyd+XFMK7OA3j+sDkP4OR8/iSrzwNY/Jy/mT9+PK9PClgGQLFpv3VYZ2cT0OWjrA6AwtIpAMkgAAQJg8ascZHQi1YwnkQBUIz+YnpLZwLfWvm5Wai8sQyAfNRLOwdm9WkGj5pTgIuPDa0CkAwCQJAwaMwaFwm9aAXjSRUAzX7g7rWA8jfpR/dWf24u5VOc4Ns+8Oess0Vn8Yund4vTDOo3/59Pyv+1CkAyCABBwqAxa1wk9KIVjKdXAKSFE3uvGAJAkDBozBoXCb1oBeMZTwAsTvCFK4IAECQMGrPGRUIvWsF4xhMAT7jW/xVDAAgSBo1Z4yKhF61gPGMJgGmW8QHgiiEABAmDxqxxkdCLVjCesQTAo8UeYrgqCABBwqAxa1wk9KIVjGcsAQBXDwEgSBg0Zo2LhF60gvEQANBAAAgSBo1Z4yKhF61gPAQANBAAgoRBY9a4SOhFKxgPAQANBIAgYdCYNS4SetEKxkMAQAMBIEgYNGaNi4RetILxEADQQAAIEgaNWeMioRetYDwEADQQAIKEQWPWuEjoRSsYDwEADQSAIGHQmDUuEnrRCsZDAEADASBIGDRmjYuEXrSC8RAA0EAACBIGjVnjIqEXrWA8BAA0EACChEFj1rhI6EUrGA8BAA0EgCBh0Jg1LhJ60QrGQwBAAwEgSBg0Zo2LhF60gvEQANBAAAgSBo1Z4yKhF61gPAQANBAAgoRBY9a4SOhFKxgPAQANBIAgYdCYNS4SetEKxkMAQAMBIEgYNGaNi4RetILxEADQQAAIEgaNWeMioRetYDwEADQQAIKEQWPWuEjoRSsYDwEADQSAIGHQmDUuEnrRCsZDAEADASBIGDRmjYuEXrSC8RAA0EAACBIGjVnjIqEXrWA8BAA0EACChEFj1rhI6EUrGA8BAA0EgCBh0Jg1LhJ60QrG0yMALh9kJ4sbs+ylT8+y293iL+689GlYffnxLfWhrZWzsak8rEIACBIGjVnjIqEXrWA8fT4BnGXL+T7Np7UxAGat/JDoGQCbysMqBIAgYdCYNS4SetEKxiPO+d/mRATAizvZ/cWPR++vF+8XAD0hAKwQAIKEQWPWuEjoRSsYT2j+ywmwsvJ0MWNn2fH5enECYKcgAAQJg8ascZHQi1YwnuD8FxNgZeXZYhtQsQWo2Wbz7GGWZa8/ni8C4NnDSZbdfFwtd//JK+VvLx/kS7Vm9NO7WXbtXlX19pNJdv39sly+wsXd7OjP5vPPJ9m19+bzbr3mcVRr5FV+kBe99qPzVvm1pSEAASBIGDRmjYuEXrSC8YTnv5QAKyvnU7baBlRN+ioAZpNi9GZH95u7L5Z35PP81fLGS5+uBMBZeXdVIHstX+P4vA6At8vVb0/LGsV2pna9imaN+UdVlbzsovz60hCAABAkDBqzxkVCL1rBeHoFQD62qwlebW4pJ3Y+cF//Yn75UTGsywB4cSe7lb8jf1R+WsjH+Mn5PH+7fr+7jSZf69v5/eUys6zanlQHQL52vnJ2dG/+rDzsqFNvXuurNWbZUfEZ4UkZFFV5YWkIQAAIEgaNWeMioRetYDz9AuBiUu37nZafBM6q7UDVWC/2D5QB0NxRz/NyUpdbjNoBUC80rYKhKtpaIc+H6rNBfqNTr6JZY1rdVX0waUJpbWkIQAAIEgaNWeMvwfaHAAAgAElEQVQioRetYDz9AiAftcVcrbf1F0N2sVWoGNbF/ZcP6uODLib59K53G5djuRUAi7WaNefzRQBUgrJI8Ztuve4aBc9/9e7dbBEA0tIQgAAQJAwas8ZFQi9awXjWh7xhJ3AzemfNWL+9PB60GP5VAGQNeUrU79FXA6BzFOmmAGjX664xf3a3/tUyANaXhgAEgCBh0Jg1LhJ60QrGI0z5+MNAm8k8XW6zWRz52QTAiztRAdAaz7PuNqP7804AdOt11yh2+B7dfPuT5SYgaWkIQAAIEgaNWeMioRetYDzSmI89EaxgWg795Vv2tU8A3VPE4j4B6AGwfspZvUZxbYrzeWcfgHyCGogQAIKEQWPWuEjoRSsYjzjng6yvX2xbn9U7WAP7AFqb90MBsLIPQAuAbr3OGs20r85QbjYBcfxnLASAIGHQmDUuEnrRCsbTNwCKvaz1FqDgUUDV54NyQ30gAJq1OvfLAdCtV7ESALNseZCRsDQEIAAECYPGrHGR0ItWMJ6+AZBP2D++c9L8uDgP4PnD9nkAx4/n9bH/3QBYzuTqPICnnfMDAgHQqVfR2QRUnDRQBUBRXlgaAhAAgoRBY9a4SOhFKxhP7wAodrzWszVwJnB9R1ZcnbkdABeTbBkBZ80pvBsDoFOvolljVv3i+FGr/PrSEIAAECQMGrPGRUIvWsF4egdAPqKb42v0awG9Vy28DIDi6j7LzwDtawHpAdCuV7HYmFQXqZary68tDQEIAEHCoDFrXCT0ohWMp38AwL5AAAgSBo1Z4yKhF61gPAQANBAAgoRBY9a4SOhFKxgPAQANBIAgYdCYNS4SetEKxkMAQAMBIEgYNGaNi4RetILxEADQQAAIEgaNWeMioRetYDwEADQQAIKEQWPWuEjoRSsYDwEADQSAIGHQmDUuEnrRCsZDAEADASBIGDRmjYuEXrSC8RAA0EAACBIGjVnjIqEXrWA8BAA0EACChEFj1rhI6EUrGA8BAA0EgCBh0Jg1LhJ60QrGQwBAAwEgSBg0Zo2LhF60gvEQANBAAAgSBo1Z4yKhF60ggB0CQJAwaMwaFwm9aAUB7BAAgoRBY9a4SOhFKwhghwAQJAwas8ZFQi9aQQA7BIAgYdCYNS4SetEKAtghAAQJg8ascZHQi1YQwA4BIEgYNGaNi4RetIIAdggAQcKgMWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYIcAECQMGrPGRUIvWkEAOwSAIGHQmDUuEnrRCgLYIQAECYPGrHGR0ItWEMAOASBIGDRmjYuEXrSCAHYIAEHCoDFrXCT0ohUEsEMACBIGjVnjIqEXrSCAHQJAkDBozBoXCb1oBQHsEACChEFj1rhI6EUrCGCHABAkDBqzxkVCL1pBADsEgCBh0Jg1LhJ60QoC2CEABAmDxqxxkdCLVhDAzrYB8IeffL/+6ZufvXN6+uOfb7rRos/TPNkLRpMwaMwaFwm9aAUB7GwbAJ+d1gHwh5+cFnznF/qNNn2e5sleMJqEQWPWuEjoRSsIYGe7APjms9MmAD47/d7P519/ePq9X6s32vR5mid7wWgSBo1Z4yKhF60ggJ2tAuCf/+K0CYDfv1O+w//DT974G+1Ghz5P82QvGE3CoDFrXCT0ohUEsLNNAHx5evqv/0cdAF8u/v/n2o0OfZ7myV4wmoRBY9a4SOhFKwhgZ6sA+O5/mP+uHu+fnf5l+f/ydvhGhz5P82QvGE3CoDFrXCT0ohUEsLPtTuB6rH/zYb2B5/fvfO/X4RvVOn9U0+8RAwBAEggAAIADJV0AfOcX4Rvddft80E32kVmTsKnBrHGR0ItWEMCO5yeAhj5P82QvGE3CoDFrXCT0ohUEsEMACBIGjVnjIqEXrSCAnZ4BwFFAPTQuEnoxa1wkBACMgb4B0BzlXx/6H7rRoc/TPNkLRpMwaMwaFwm9aAUB7PQNAM4E3l7jIqEXs8ZFQgDAGOgbAN98ePrdxRV/wjc69HmaJ3vBaBIGjVnjIqEXrSCAnb4BMP+6fc3P8I02fZ7myV4wmoRBY9a4SOhFKwhgp3cAzL/+WT7lf/zrTTda9HmaJ3vBaBIGjVnjIqEXrSCAHb4RTJAwaMwaFwm9aAUB7BAAgoRBY9a4SOhFKwhghwAQJAwas8ZFQi9aQQA7Yw2AX+ZIT/PELxsRBo1d4yKhF60ggJ2RBsAvfyknwG6+OAMaFwm9mDUuEgIAxsA4A+CXvwwkwG6+OAMaFwm9mDUuEgIAxsAoA+CXvwwlwG6+OAMaFwm9mDUuEgIAxgABsA6Dxq5xkdCLVhDADgGwDoPGrnGR0ItWEMAOAbAOg8aucZHQi1YQwM4oA4CdwOkk9GLWuEgIABgD4wwADgNNJqEXs8ZFQgDAGBhpAHAiWCoJvZg1LhICAMbAWAMg9DRP9oLRJAwas8ZFQi9aQQA7BIAgYdCYNS4SetEKAtjZ+QAIbCvqA4PGrnGR0ItWEMDOrgdAaG9xHxg0do2LhF60ggB2djwAgseL9oFBY9e4SOhFKwhgZ7cDIHzGWB8YNHaNi4RetIIAdggAQcKgMWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAezsdgCwE3ijhF7MGhcJAQBjYMcDgMNAN0noxaxxkRAAMAZ2PQA4EWyDhF7MGhcJAQBjYOcDYAAYNHaNi4RetIIAdggAQcKgMWtcJPSiFQSwQwAIEgaNWeMioRetIIAdAkCQMGjMGhcJvWgFAewQAIKEQWPWuEjoRSsIYIcAECQMGrPGRUIvWkEAOwSAIGHQmDUuEnrRCgLYIQAECYPGrHGR0ItWEMAOASBIGDRmjYuEXrSCAHYIAEHCoDFrXCT0ohUEsEMACBIGjVnjIqEXrSCAncMJgPiLBjFo7BoXCb1oBQHsHEwAGC4byqCxa1wk9KIVBLBzKAFg+eIABo1d4yKhF60ggJ0DCQDTV4cxaOwaFwm9aAUB7BAAgoRBY9a4SOhFKwhghwAQJIlfnAHtbg6agMZFQi9aQQA7BIAgibRElgt51y18u5kuoRetIICdAwmAIXYCRxYMmtcsfL/xBgm9aAUB7BxKAKQ/DDQyUsKfPVYtloyKJvGnmaAmdUFRQgBoBQHsHEwAxE+kuAVjNypFB4BlK1XiXvp/+ODTjFVCAMAYOJwAiMW4ZecqAiB6uloCxVBy/d5RfZrpq3GREAAwBgiAFWJH1xUGgDEo0vXyVTBSenyaiYcAUAsC2CEAukSPLvOCa7/Ydmhe4YLBZjw2ZxEAekEAOwRAl8Heh6/fv+1mkzEmhcPmLAJgQ0EAOwRAlyFGV2CxbXec7lUARP9rf0UAbCgIYIcA6GIIgKs6dDL9XO//4WPwTzNfDXDoUwACAA4HAmAFy1vSfgx/UpttuPb58DH4p5kBDn0KQQDA4UAArOI1/z1OaovvxVRw80ltyT/NDJF6AQgAOBwIgDWc5v+ITmozmmMua2EqF/Eo0y8YhACAw4EAECTsbAwjj9bBN2cRABsLAtghAAQJAWDWbL1m6p0FBABAPASAIBn70LRIRt9L4p0FBABAPASAIBn90DRI9qWXIXYCJ96cZYEAgFFAAAiSfRmaX+1TL6ax3mfB3fy7XMHrGPYAAkCQ7M3Q3KteUh/6FPqosJt/lyt4HcMeQAAIkv0ZmvQSJLizYAd7+YoAgO0gAAQJQ9OscZEQAFpBADsEgCBhaJo1LhICQCsIYIcAECQMTbPGRUIAaAUB7BAAgoShada4SNJa2AkMQAAIEoamWeMiSWzhMFA4eAgAQcLQNGtcJCO/rpEFAgBGAQEgSBiaZo2LhF60ggB2CABBwqAxa1wk9KIVBLBDAAgSBo1Z4yKhF60ggJ2xBsBvc6SneeKXjQiDxq5xkVxZL30uLhqQEAAwBkYaAL/9rZwAez5oBpDQi1mzdk+/y0vLEgIAxsA4A+C3vw0kwH4PmiEk9GLWrN7R9wsGRAkBAGNglAHw29+GEmCvB80gEnoxa1Zu9/+KGUlCAMAYIADWYWjaNS4SAkArCGCHAFiHoWnXuEgIAK0ggB0CYB2Gpl3jIiEAtIIAdkYZAOwETiehF7Nm9Q52AsPeMs4A4DDQZBJ6MWvW7uEwUNhXRhoAnAiWSkIvZs36XZwIBnvKWAMg9DRfuyeQFH1gaNo1LhJ60QoC2Nn1AAhtK+oDg8aucZHQi1YQwM6OB0Bwb3EfGDR2jYuEXrSCAHZ2OwDCx4v2gUFj17hI6EUrCGCHABAkDBqzxkVCL1pBADsEgCBh0Jg1LhJ60QoC2CEABAmDxqxxkdCLVhDAzm4HADuBN0roxazZftX48wUIABgFOx4AHAa6SUIvZs3WaxrOGCYAYBTsegBwItgGCb2YNduuaLlmEAEAo2DnAyCa+KQY+6AxSejFrNlyPdNVQwkAGAUHEwCGbUUjHzQ2Cb2YNVuuRwDA7nEoAWDZWzzyQWOT0ItZs+V6BADsHgcSAJbjRQfYqyDC0LRKxt0LAQC7x1gD4OUc6Wm+5cvDEADxnxR6JgVD0yoZeS/sBIadY6QB8PLLcgIMHwC2Twp9EoChaZWMvRcOA4VdY5wB8PLLgQQYPACGSgrhboamVTL6XqLn/xDfMANgZ5QB8PLLoQQYfCfwYEmxfj9D0yrZm14G+Y5JADuHEgCxG2zSB0BwMYamVbIvvQzzLfMAdg4mACJ32SYPgPByoxqa7NBeaoYWmA4XiuUKXsewB1xFAGxkGQD+7mZcxy63acnY5ZplYx9nWmIfISRgGQBX/Ujg4BnlJ4D0O4ENWHbt9vqkMKIL28Xuzvgq9FGBTwAG+AQAo2GcAZD8MFALsVPYsgs4JgAMUziaxNu9gk0TAAYsAWA4rhTAzkgDIPWJYCbSbjeP3QlsmMKJMyrBsa+j+rv01QxusM3/2DPLAOyMNQBCT/O1ewJJ0YfEgyY0WrcPgMRbqRLs+eYy3SZs8z/y2hIAdnY9AELbivqQetAEZuHWAeA316MXHNH+jP4aB4dt/scsewWvY9gDdjwAgnuL+3A1g8ZxXAeXjF1uYwBEf5ixsEcBENcLAQBDs9sBED5hoA9XNGiu7o19/50FPfZnxEMAqAUB7BAAguSKBk3fKbz1gl9Fb7IPFSQArBICAMYAASBIrmrQxDWSfsuOgUBBAsAqibKwExgGhgAQJJGPMNYbe0hrbCe29/WJN8TLBR0OaT3EAOAwUBiY3Q6AK90JHGuOPaktvpf4uZ58/gfYfiewIaMOMAA4EQyGZccDwHAYaHxOxJ+qFlMz9rIWlk8zqXvpzdaHgVo2FR1iABgKAtjZ9QAwbYeJnJqGi1VsrhlebvsAGCL1+rHtiWCmnQUEgFoQwM7OB0Akhm1Flg07VxIAtk8KLgmw7d+FAEhXEMDOgQRA+rfXVxcAQyRFXwgAq4QAgDFAAASWTFUxOgCSmwc6RkrEIwCuaof2MBICAMYAAbDlgsl3Aif/7DHQbmWRrf+mV3pIqwwBAIcDAbDlgukPA02992GY3coy2/9NhzhcqB8EABwOBxIA6bevfJX+RLBY0vcS33OAHn/TAQ4X6gcBAIfDoQRA8u0r/Rm8l0FST2bwoTnIzoKos5qHIe2XDn1FAMB2jDUAfpMjPc3jXjYSkfPNbf479OKXemMKgOgPCoEFxxQAlrPkAOyMNAB+8xs5ARxenF7z32XQJN6rEGREAWAMilF/vaXpGFkAO+MMgN/8JpAA4xma/RnPoNmBALjSr7dMT/odH1fwOoY9YJQB8JvfhBJgPEMzgcZFkvS6RmHN1mtGY3xfnzQAUu98Tt3LVwQAbAcBsM7hBUDvqwvt4LtmQwCY9ipELpb008xXBABsx84HQGBvcR8OMAD67lYeTy8DBED0FHb7kCJwBa9j2AN2PQBCe4v7cIgBEEloW9GIejGO6807gc3zOlac9CvdruB1DHvAKAMgfidwcME+EAAhgnuLx9SLaYNNxGGgsfN6iDf20b0QALAV4wyA2MNAwx8V+kAAhNiJAEh9IthVBgAngsGwjDQAIk8EIwA2Sg4wAPpqVm4nD4BBrmt0Ba9j2APGGgChp3n3JgGwUUIAmDWrd1zllp1oruB1DHvA4QRAfEwQAEF2YCdwf83aPaaxnvJ4UQNX8DqGPWC3A8CwE9jwQYEACDP6w0ATaNbv6rdXWZRwNVAYAzseANFz3bCpaIAzC0R2c2he3YlgOxDM8W/sCQAYBbseAJHj2rCtKP6jQs+kYGhaJfSiFQSws/MBEEd8AAyyUUlkNwdNQLN2zwCX1CMA1IIAdgiALRc0JoVw924OmoBm9Y4hLqpNAKgFAewQAEMveJXfbXBlQ3OQr9UhANSCAHYOJACi368PlxRrv9jNQRPQdG/2/4IBUUIAaAUB7BxKAMRusU8eAOHl9vjKpgTARgkBAGPgYAIgdrqm/qhgCIDYfQoGogv2NBMAVgkBAGPgcAIgFsuu3V6fFHpc2TR2XJsK9jn2lQCwSggAGAMEwBppp2t0AERvfBrg7Lf47Aksx05gq4QAgDFAAAiSSMv/394Z/rhRnGHctFRIAUElkOqQEJQvfKjEqQmhH0pFpSKhKCWISpVaqUeDDrUfUCWuJKpyhFwJ5z+8Xnttn29nxu+7Ozv7zszv9yG5tcfz+LndeZ/dmbVvYBXuHQCxZ6kiSHMbqFaEAAALEAAOkbgqvtLaNwAsNuyuZzT1n7/U5hchAMACBIBDJLKKp7KWHADSKwoVBECwQwA9BIBDZJpCM93MTvQAEHf4hK/pjtYhgB4CwCEyUaERlkx5dRVX4cHZM2BBWz5XRAAEOwTQQwA4RKYqNMKTYd3ZddTbQH3S/Re016vFogQgAIIdAughABwi1guNfH5dPL+i6TDiHU3/3dwvGnWuaBh5HmMTjGMoAALAIWI9AKacN3dL913PUHxiTJ56AzF1jIk9TzCOoQAIAIeI+QBQiNhez5AHgHzea+hlj6X9Ik+9CcYxFAAB4BAhANQynUdkhUscAMveVjNFMf+km2w6axTE73BtWtB0gnEMBUAAOEQIALVMz9cpAqBdKxj/1ic73zclN00AQD8IAIeI7aKpEzHuRTwDJF0tFl8qeBs6vERec1feIiVaIp9gHEMBEAAOEeNFUyVi3YtwCTj+pYK3oXs6K+Jdt+KM0nyp6gTjGAqAAHCIWC+aGhHzXmT1TR4A4ksFX0PHgnbcySdxRhEAMDYEgEPEfNFUiBTiRVwLhzfs3tIqq9fyySdpRhEAMDYEgEOkkKK5EinEy5QBIKzX8U/sCQAYGwLAIVJI0VyJlOJFWgrjB4C0xxFO7OX1nwCAXhAADpFSiuaTkrwIS+F0ATDGib24/hMA0AsCwCFSTNEsyouwFCqLa7ehpQCQmiYAoB8EgEOknKJZoxfxWbOn4egBMMpfTJ5gHEMBWA2AkyWuwzzmmPFRYdEcLJNERKgirq3uhh2VKWd2xEwwjqEAjAbAyYk7AUwVmqEySUTwopbpPDJwTsnTtMdbCzDBOIYCsBkAJyeeBCi70Iwhghe1TPehYXNKThH+HgBYwGQAnJz4EqDwQjOCCF7UMv1fKj+xJwDABARAF/uFRiGCF7VMEhECACyQfQB4VouHQKHRyyQRwUuoQwA9uQeAb7V4CBQavUwSEbyEOgTQYzIA5IvA3oZDoNDoZZKI4CXUIYAemwEgvQ3Uf6ng7lI0lKosNANT1JSXoTJJRAgAsIDRABB+EEwRAPIrBXEtHNihpUIz9LfD2oxWhAAAC1gNAN9hvr8pDwDdlYKodg3tMEXRVFkZYIa1Ga0IAQAWqCQARkiKwR0OKJqadgor/c2wNqMVIQDAAnkHgLoKx0sKaUN/u/5FU9cuxW+HtRmtCAEAFsg8AKKf404XAPKiaTD1UqzNEADhDgH05B4AwhPIkgLAYsMEazMEwIEOAfRkHwBCtAWpqgAY/tsZf21mlPuKnBAAUA+1BED0efPoi8BTBsDg387oazOj3MfrhgCAeqgmAGLfORP/NtD4RVN+dj30tzP62swY9/GKP9MwwsUHAQAmqCcAxIhH+8Az0t63gY5RC8VIi6bOyhT38YrDbIxfIwEAJiAAHCJTLTZGv0ixP28e/bJneFJ4gjnqMkX8hhOMYygAAsAhYv5uE3ldN+9FWFvjB4C3oW9qThoph1qN0pAAgF4QAA4R60VTI2Lei2a6xnYAiK8U4jckAKAfBIBDxHzRVIiU4kU7sZM+ABJmlIMJxjEUAAHgECmlaD4pyYu0Eg5OCgIA6oEAcIgUUzSL8iKcC4n+mQZppBAAkB8EgEOknKJZpZeBSdH3NlACAPKDAHCIVFg0h8okEYmt4i6tvT8IJq7W8RsSANAPAsAhQtFUyyQRse5FXK3jNyQAoBcEgEPEeqHRiOBFLdP/pdJqzQfBwAgEgEPEfKFRiOBFLZNEhK+CAAsQAA4RCo1aJokIXkIdAughABwiFBq1TBIRvIQ6BNBDADhEKDRqmSQieAl1CKCHAHCIUGjUMklE8BLqEECP1QC4tcR1mEsbint0iUQenCV58ckkEcFLqEMAPUYD4NYtd43rvNbXUNyju6WknbRhSV58DVOEmTz1hpEiAOKbnmAcQwHYDIBbtzw17uprvQ3FPXpaHm4nbViSF2/DBGGWLPUcx2ds5RFMTzCOoQBMBsCtLZ3DXNpQ3KOvpfhN9lbOz4u/4fhhJm4YP8zEPeraRTVNAEAvCICRG5bkxd/Qjpf4YSbuUdsuomkCAPpBAIzcsCQvOQRAdC8R9vToDZ8QANCPMQPg4sHRfH7nUefxgwdzSUWzJC8EgJG36GDEcQwFM2IAvLg3b3j7q6tPHD6avcf96HPN443izhMZeyEApn2LDsYbx1AyIwbA8fzmo8X5/fnNx1eeOHw0X1sf9te6h7m0objHq0QvwyV5yWAROIMAYBEYzDBeADw/Wp37v7h3/bMrzxw8mK9dW9W45X+dw1zaUNxjp2FbXWM1LMmLv2HHi7BDi6k3+iKw2Iv810gAQD/GC4DT+Tvt/x9ceebwANnSOcylDcU9dhvGLcMlefE3TBBmyVKvc2UmjnqxcmzTTwgA6Md4AXA8/2j1/1kbBDsOHszTFs24DUvy4m9oykvcMNNEvVg5suknBAD0Y7QAuLjfTv08P9osArzacvC1uwM//4YZvEVMR2k44VsE6InJAFiIj/sMGmbwFqcznUFdnzAA5PsFoB8pAuDqjaCHr2fbi1/Hha60objH8RuW5MXXsLeXTYkz1NDjRbCgHf0tyvcLU0DQi5RXABskx7PnuO++VjpAJmxYkhdPw/5eMgizwVHfv6F8v4w1jqFsrAaA7zAf8Fq5CN87r5bp/9IMwmxo1A9oKGascQxlY/IuoMBhHm3AhETMF02FCF7UMklE+IMwYIExPwfwwd7/O4Yc5tEGTEiEQqOWSSKCl1CHAHpMfhI4cJhHGzAhEQqNWiaJCF5CHQLoGS8ALu7Pb/T9LiD/YR5twIREKDRqmSQieAl1CKBnxC+DO+//baD+wzzagAmJUGjUMklE8BLqEEDPmH8P4PzBsv7fuXr+TwBsZJKI4EUtk0SEAAALmPyLYIHDPNqACYlQaNQySUTwEuoQQA8B4BCh0KhlkojgJdQhgB4CwCFCoVHLJBHBS6hDAD0EgEOEQqOWSSKCl1CHAHoIAIcIhUYtk0QEL6EOAfQQAA4RCo1aJokIXkIdAughABwiFBq1TBIRvIQ6BNBDADhEKDRqmSQieAl1CKCHAHCIUGjUMklE8BLqEEAPAeAQodCoZZKI4CXUIYAeAsAhQqFRyyQRwUuoQwA9BIBDhEKjlkkigpdQhwB6CACHCIVGLZNEBC+hDgH0EAAOEQqNWiaJCF5CHQLoIQAcIhQatUwSEbyEOgTQQwA4RCg0apkkIngJdQighwBwiFBo1DJJRPAS6hBADwHgEKHQqGWSiOAl1CGAHgLAIUKhUcskEcFLqEMAPQSAQ4RCo5ZJIoKXUIcAeggAhwiFRi2TRAQvoQ4B9BAADhEKjVomiQheQh0C6CEAHCIUGrVMEhG8hDoE0EMAOEQoNGqZJCJ4CXUIoIcAcIhQaNQySUTwEuoQQA8B4BCh0KhlkojgJdQhgB4CwCFCoVHLJBHBS6hDAD0EgEOEQqOWSSKCl1CHAHoIAIcIhUYtk0QEL6EOAfQQAA4RCo1aJokIXkIdAughABwiFBq1TBIRvIQ6BNBDADhEKDRqmSQieAl1CKCHAHCIUGjUMklE8BLqEEAPAeAQodCoZZKI4CXUIYAeAsAhQqFRyyQRwUuoQwA9BIBDhEKjlkkigpdQhwB6pggA67z66tTvIB54sUlJXiBjCIAuJQ1OvNikJC+QMQRAl5IGJ15sUpIXyBgCoEtJgxMvNinJC2QMAdClpMGJF5uU5AUyhgDoUtLgxItNSvICGUMAdClpcOLFJiV5gYwhALqUNDjxYpOSvEDGEAAAAJVCAAAAVAoBAABQKQQAAEClEAAAAJVCAAAAVAoBAABQKQQAAECl1B0A3/12Pr9+59F64+LB0Xx+eMMqMi8v7s1XvP3VRG9ThN/LorHwzsL9jElkXvLYL1AcVQfAl+tBd/2zZqMdgusR6N+witDL86MMCo3fS8PxfL9omrYi9ZLFfoHyqDkAzubXf7dYnN9fj7rj+c1HzcbNx8ENo0i9nG0qjmECXpbn0MfzjYXM98uelxz2CxRIxQFwcX/+UfP/8rTso+YUbDVEX9xrztX8G0aRelmWoA8mfaMCAl4Wi+8+nG+KZub7Zc9LDvsFSqTiAHhxr73eXg2+03YonoY3jCL1cnHfcLVsCXhZ/ju/+5/tI1nvlz0vOewXKJGKA2DLanAer0/V1tfi/g3rHPDy4t7NfyzPO39jfOF0TdfL4vTGn7b7IfP9suclq/0CBUEArK/It6dgz49uPi1/ACgAAARvSURBVPZvTPYmhRzwsl1rbCuRabpe1o+3RTPz/bJ+/Gw7nZXPfoGSIADWF+aFBMABL8uCM7/7ePG/B/MMZhy6XtaP5xgAB7xktV+gJAiAs9WguzQ43/7KvzHZu5RxyMt2FjqDNUeHl80TVwMgx/2yeWJ/PSOD/QJFUX0AnB1dby67i7gCOOhl19L0vZMNLi/tM9ldARz0smtpfr9AWdQeAKftRXcJAXDYy7ap+bNmp5f1U9kFwGEvW8zvFyiMygPgy+2ka/53AUm8bLBeND1e9n7KfL9c+WmN9f0CpVF1AFwcz29sTrg2d5O39877Nswi8rL5XJLxoun1smI3b571flmxvZrJYr9AeVQdAMeXZlzz/iSw1MvxlYJjE6+XFbtbJ7PeLyt2VzM57Bcoj5oD4PTyitty7N3Yfk+Lf8MqQi/Pj5rbDc8/zNTLik3RzHy/rLj0OQD7+wUKpOIA2HwDb/uFLOeXv6nRv2ETsZfT9ksnDX/kNOSlYTtNkvl+adh6yWC/QIlUHABn873BuTh/sPzpTnsG5t8wicJL8/X0d7P1srg8T575flnseTG/X6BEKg4AAIC6IQAAACqFAAAAqBQCAACgUggAAIBKIQAAACqFAAAAqBQCAACgUggAAIBKIQAAACqFAAAAqBQCAACgUggAAIBKIQCq5uFs9spu66ffz2bvT/dmACAxBEDV/Pju5ZL/9V4cAEDpEAB183Q2+9nf25+/f233MwBUAAFQOQ9ns1+tf2ICCKA2CIDK+fHd2Uufrn5iAgigNgiA2nk6m/3i28UqCVb/A0A1EAC108z8NJNADzdXAkueffzabPbSm3/bbH/TbM/e+PW37Qve/9ft2eznnzp6A4CMIACq5/vXmtL/dLsWsJoMWvPWavOnzzfbLzdrxMsAeK/ZYMEYIHcIAGgm/5dVfTsBtNxuTv5/+LxNgOX2W8vnnt1eLxI0lwzLxHj2yXTvGACiQABAU9Hf2E0ALa8I2sXgr1cP/vhuu92uEnC3EEApEADQlPy9CaDN5M6y1L/SrBK32bDcbJ5p/wOA7CEAYDXJs50AWlf9NQ/3bwx6uAkAbhcCKAICAFaXANsLgObbIXZszvV/+OYvf3h9tgkAPi8AUAQEABwMgH++fnmTAAAoBQIAOgGwX9+bRd/Z7I33/vjvhwQAQFEQALAfAJ0p/vYu0MWlNQACAKAICADYD4BLHwleZcEuEJbXBgQAQEkQAHAlAJYbbcV/2tzwvwuAr1kDACgLAgCuBEBT6F/+ZFnov1jfHNpOAX1ze7b6BDABAFAMBABcDYDddwGtvyb0drv15herjwATAAClQABAJwAWzz5ubvz8ZfttPz/9+fXmu0H/2t4gRAAAlAIBAABQKQQAAEClEAAAAJVCAAAAVAoBAABQKQQAAEClEAAAAJVCAAAAVAoBAABQKQQAAEClEAAAAJVCAAAAVAoBAABQKQQAAEClEAAAAJVCAAAAVAoBAABQKQQAAEClEAAAAJVCAAAAVMr/AYkFCt84cDVnAAAAAElFTkSuQmCC" width="768" /></p>
</div>
<div id="i-visualize-the-results-of-your-simple-linear-regression." class="slide section level2">
<h1>I visualize the results of your simple linear regression.</h1>
<p>Add the regression line using geom_smooth() and typing in lm as method for creating the line. I used linear regression.</p>
<div class="sourceCode" id="cb23"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb23-1"><a href="#cb23-1" aria-hidden="true" tabindex="-1"></a>df.graph<span class="ot"><-</span><span class="fu">ggplot</span>(df, <span class="fu">aes</span>(<span class="at">x =</span> Year, <span class="at">y=</span><span class="st">`</span><span class="at">Violent crime rate</span><span class="st">`</span>)) <span class="sc">+</span> <span class="fu">geom_point</span>() <span class="sc">+</span> <span class="fu">geom_smooth</span>(<span class="at">method=</span><span class="st">"lm"</span>, <span class="at">col=</span><span class="st">"black"</span>)</span>
<span id="cb23-2"><a href="#cb23-2" aria-hidden="true" tabindex="-1"></a>df.graph</span></code></pre></div>
<pre><code>## `geom_smooth()` using formula 'y ~ x'</code></pre>
<p><img src="data:image/png;base64,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IapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhlAAk47EGIapMilI9OJXjoZQAJOOxBiGqTIpSPTiV46GUACTjsQYhqkyKUj04leOhtGYAnj07er/G3sRUeKxBiCqTolQPTuV4KK0agGMJsJAbwWMNQlSZFKV6cCrHQ2ndABwugIXcCB5rEKLKpCjVg1M5HkoLB+BgAizkRvBYgxBVJkWpHpzK8VBaOgAHCmAhN4LHGoSoMilK9eBUjofS2gHYnwALuRE81iBElUlRqgencjyUVg/AvgRYyI3gsQYhqkyKUj04leOhtH4AugtgITeCxxqEqDIpSvXgVI6H0hMIQGcCLORG8FiDEFUmRakenMrxUHoSAegogIXcCB5rEKLKpCjVg1M5HkpPIwAPE2AhN4LHGoSoMilK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" width="768" /></p>
</div>
<div id="conclusion" class="slide section level2">
<h1>Conclusion</h1>
<p>Violent crime is decreasing over the years (1997-2016). We have a lover Rate per 100,000 Inhabitants in 2016 than in 1997. There is a small increase in crime from 2014 to 2016. Unfortunately FBI doesn’t publish the data belong the 2016 year.</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>