-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathextract-artefacts.sh
1807 lines (1758 loc) · 100 KB
/
extract-artefacts.sh
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
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/bin/bash
# Linux extract artefact for forensic
# (c) 2019 - 2022, Lionel PRAT <lionel.prat9 (at) gmail.com>
# source code: https://github.com/lprat/EAL/
#ATTACH_TOOLS
if [ -f "/tmp/toolsEAL/tools.tar.gz.b64" ]; then
if which base64; then
base64 -d /tmp/toolsEAL/tools.tar.gz.b64 > /tmp/toolsEAL/tools.tar.gz
rm /tmp/toolsEAL/tools.tar.gz.b64
tar -C /tmp/toolsEAL/ -zxf /tmp/toolsEAL/tools.tar.gz
elif which openssl; then
openssl base64 -d < /tmp/toolsEAL/tools.tar.gz.b64 /tmp/toolsEAL/tools.tar.gz
rm /tmp/toolsEAL/tools.tar.gz.b64
tar -C /tmp/toolsEAL/ -zxf /tmp/toolsEAL/tools.tar.gz
fi
fi
# Fix config if external file config dont exist
MEMORY=1
MEM_PROC=1
YARA_MAXSIZE="10MB"
YARA_PATHSCAN="/"
YARA_RULES_FS="filescan.yar"
YARA_RULES_MEM="procscan.yar"
EXTRACT_MAXSIZE=5
EXTRACT_PHP=1
FILE_TYPE=1
FILE_MD5=0
FILE_DELETED=0
DUMP_NETPROC=1
DUMP_ELF_STATIC=1
DUMP_PKG_INTEGRITY=1
DUMP_DOCKER=1
DUMP_ETC=1
DUMP_LOG=1
DUMP_YARA_MATCH=1
USE_DEBSCAN=1
YARA_SCAN=1
PROCESS_INFO=1
PACKAGE_INFO=1
KERNEL_INFO=1
AUTORUN_INFO=1
NETWORK_INFO=1
INFO_ACTIVE_NET=0
# Import config
if [ -f "/tmp/toolsEAL/tools/EAL.config" ]; then
. /tmp/toolsEAL/tools/EAL.config
fi
# Function to find date creation
# source: http://moiseevigor.github.io/software/2015/01/30/get-file-creation-time-on-linux-with-ext4/
xstat() {
for target in "${@}"; do
inode=$(ls -di "${target}" | cut -d ' ' -f 1)
fs=$(df "${target}" | tail -1 | awk '{print $1}')
crtime=$(debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null |
grep -oP 'crtime.*--\s*\K.*')
printf "%s\t%s\n" "${crtime}" "${target}"
done
}
# Function to dump proc memory
# source: https://serverfault.com/questions/173999/dump-a-linux-processs-memory-to-file
procdump()
(
mkdir /tmp/artefacts/procs_mem_dump/
for i in $(ls /proc/);do
if [[ $i =~ [0-9]+ ]]; then
mkdir /tmp/artefacts/procs_mem_dump/"$i"
cp /proc/"$i"/maps /tmp/artefacts/procs_mem_dump/"$i"/
grep "rw-p" /proc/"$i"/maps | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/"$i"/mem bs="$( getconf PAGESIZE )" iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) 2> /dev/null|gzip > /tmp/artefacts/procs_mem_dump/"$i"/"$i"_mem_"$a".bin.gz &
done )
fi
done
)
# Function aix get full path pid
# ref: https://stackoverflow.com/questions/606041/how-do-i-get-the-path-of-a-process-in-unix-linux
getPathByPid()
{
if [[ -e /proc/$1/object/a.out ]]; then
inode=$(ls -i /proc/$1/object/a.out 2>/dev/null | awk '{print $1}')
if [[ $? -eq 0 ]]; then
strnode=${inode}"$"
strNum=`ls -li /proc/$1/object/ 2>/dev/null | grep $strnode | awk '{print $NF}' | grep "[0-9]\{1,\}\.[0-9]\{1,\}\."`
if [[ $? -eq 0 ]]; then
# jfs2.10.6.5869
n1=`echo $strNum|awk -F"." '{print $2}'`
n2=`echo $strNum|awk -F"." '{print $3}'`
# brw-rw---- 1 root system 10, 6 Aug 23 2013 hd9var
strexp="^b.*"$n1,"[[:space:]]\{1,\}"$n2"[[:space:]]\{1,\}.*$" # "^b.*10, \{1,\}5 \{1,\}.*$"
strdf=`ls -l /dev/ | grep $strexp | awk '{print $NF}'`
if [[ $? -eq 0 ]]; then
strMpath=`df | grep $strdf | awk '{print $NF}'`
if [[ $? -eq 0 ]]; then
fullpath=`find $strMpath -inum $inode 2>/dev/null`
if [[ $? -eq 0 ]]; then
echo "$1: $fullpath" >> /tmp/artefacts/process_faout
return 0
fi
fi
fi
fi
fi
fi
return 1
}
# Check GENERIC file for debscan
if [ -f "/tmp/toolsEAL/tools/GENERIC" ]
then
URL_GENERIC="file://localhost/tmp/toolsEAL/tools/"
else
if [[ -z "${URL_GENERIC}" ]]; then
URL_GENERIC="https://security-tracker.debian.org/tracker/debsecan/release/1/GENERIC"
else
URL_GENERIC="${URL_GENERIC}"
fi
fi
# Identify OS (1==linux && 2==Aix)
OS=0
if uname -a|grep -i 'linux' ;then OS=1;echo Forensic on Linux OS;fi
if uname -a|grep -i 'aix' ;then OS=2;echo Forensic on AIX OS;fi
if [ $OS == 0 ]; then echo OS not detected!;exit; fi
# Create artefact directory
rm -rf /tmp/artefacts
mkdir /tmp/artefacts/
# Extract Memory RAM or proc mem
## Get info RAM
if [ $OS == 2 ]; then lsconf | grep Memory > /tmp/artefacts/memory ;fi
if [ $OS == 1 ]; then free > /tmp/artefacts/memory ;fi
## Extract memory with avml
echo "Extract memory at $(date)"
if [ $OS == 1 ] && [ $MEMORY == 1 ] && [ -f "/tmp/toolsEAL/tools/avml-minimal" ]
then
#use avml
chmod +x /tmp/toolsEAL/tools/avml-minimal
if /tmp/toolsEAL/tools/avml-minimal --compress /tmp/artefacts/mem.raw.compressed
then
MEM_PROC=0
YARA_RULES_MEM="noexists.yar"
fi
fi
if [ $MEM_PROC == 1 ]
then
#https://serverfault.com/questions/173999/dump-a-linux-processs-memory-to-file
procdump &
YARA_RULES_MEM="noexists.yar"
fi
# Get FS
echo "Extract FS info at $(date)"
TESTSTAT=$(stat -c 'STAT:%i|%b|%A|%h|%U|%G|%s|%t|%T|%w|%x|%y|%z|%n|%N' /)
if [ $OS == 1 ];then
if [ -x "$(which stat)" ] && [[ $TESTSTAT == "STAT:"* ]] ; then
find / -path /tmp/artefacts -prune -o \( -fstype nfs -prune \) -o -exec stat -c 'STAT:%i|%b|%A|%h|%U|%G|%s|%t|%T|%w|%x|%y|%z|%n|%N' {} + > /tmp/artefacts/all_files
else
find / -path /tmp/artefacts -prune -o \( -fstype nfs -prune \) -o -exec ls -dils --time-style=long-iso {} + > /tmp/artefacts/all_files
fi
if [ $FILE_TYPE == 1 ] || [ $FILE_MD5 == 1 ] ;then
find / -path /run -prune -o -path /tmp/artefacts -prune -o -path /sys -prune -o \( -fstype nfs -prune \) -o \( -fstype sysfs -prune \) -o \( -fstype proc -prune \) -o -type f -size -5M -print > /tmp/artefacts/all_files_file &
fi
fi
if [ $OS == 2 ] && [ $FILE_TYPE == 1 ]
then
find / -path /tmp/artefacts -prune -o \( -fstype nfs -prune \) -o -type f -size -5M -exec file {} + > /tmp/artefacts/all_files_file
fi
if [ $OS == 2 ];then find / -path /tmp/artefacts -prune -o \( -fstype nfs -prune \) -o -ls > /tmp/artefacts/all_files;fi
## Network info
if [ $NETWORK_INFO == 1 ]
then
echo "Extract network info at $(date)"
{
echo -e "#####Artefact Network#####\n";
echo -e "-------\nnetstat -Aan:\n-------";
if [ $OS == 1 ]; then netstat -lantp; fi
if [ $OS == 2 ]; then netstat -Aan ; fi
echo -e "-------\nlsof -i:\n-------";
lsof -i;
echo -e "-------\nip a:\n-------";
ip a;
echo -e "-------\nRoute:\n-------";
if [ $OS == 1 ]; then route -n;fi
if [ $OS == 2 ]; then netstat -nr ;fi
echo -e "-------\nInterface in promiscous mode:\n-------";
ifconfig -a|grep -i promisc;
} > /tmp/artefacts/network
### RPC info
if which rpcinfo;then rpcinfo > /tmp/artefacts/rpcinfo;fi
### IPTABLES
if which iptables-save;then iptables-save > /tmp/artefacts/iptables_rules.v4;fi
if which ip6tables-save;then ip6tables-save > /tmp/artefacts/iptables_rules.v6;fi
fi
## PROCESS
if [ $PROCESS_INFO == 1 ]
then
echo "Extract process info at $(date)"
if [ $OS == 2 ];then ps -aefl > /tmp/artefacts/process_ps;fi
if [ $OS == 1 ];then ps auxf > /tmp/artefacts/process_ps;fi
if [ $OS == 1 ];then ls -l /proc/*/exe >> /tmp/artefacts/process_exe 2> /dev/null;fi
if [ $OS == 2 ];then for pid in $(ps -aefl|awk '{print $4}');do procldd "$pid";done > /tmp/artefacts/process_ldd;fi
ls -la /proc/*/fd >> /tmp/artefacts/process_fd 2> /dev/null
if [ $OS == 2 ];then cksum /proc/*/object/a.out > /tmp/artefacts/process_cksum;fi
if [ $OS == 2 ];then ls -l /proc/*/object/a.out > /tmp/artefacts/process_aout;fi
### Handles
lsof >> /tmp/artefacts/process_lsof 2> /dev/null
if [ $OS == 2 ];then for p in /proc/[0-9]*;do getPathByPid $(echo $p|awk -F '/' '{print $NF}') ;done ;fi
fi
## Package (ref: http://gedsismik.free.fr/darkdoc/article.php?id=64)
if [ $PACKAGE_INFO == 1 ]
then
echo "Extract packages info at $(date)"
if which dpkg; then
dpkg -l > /tmp/artefacts/packages-list-deb
apt-config dump > /tmp/artefacts/apt-config
fi
if which rpm; then
rpm -qa > /tmp/artefacts/packages-list-rmp
fi
if [ $OS == 2 ];then if which lslpp; then lslpp -L all ;fi > /tmp/artefacts/packages-list-aix;fi
### Integrity
if which dpkg; then dpkg -l |grep -E '^ii'|awk '{print $2}'| while read -r line ; do dpkg -V "$line" >> /tmp/artefacts/packages-integrity-deb ; done ;fi
if which rpm; then rpm -qa | while read -r line ; do rpm -V "$line" >> /tmp/artefacts/packages-integrity-rpm ; done ;fi
if [ $OS == 2 ];then if which lslpp; then lslpp -L all|grep -E '^ [0-9A-Za-z]'|awk '{print $1}'|while read -r line ; do echo "Package Name: $line" >> /tmp/artefacts/packages-integrity-aix;lslpp -v "$line" >> /tmp/artefacts/packages-integrity-aix; done ; fi ;fi
### List all files
if which dpkg; then dpkg -l |grep -E '^ii'|awk '{print $2}'| while read -r line ; do echo "Package Name: $line" >> /tmp/artefacts/packages_deb-list_files; dpkg -L "$line" >> /tmp/artefacts/packages_deb-list_files; done ;fi
if which rpm; then rpm -qa | while read -r line ; do echo "Package Name: $line" >> /tmp/artefacts/packages_rpm-list_files; rpm -ql "$line" >> /tmp/artefacts/packages_rpm-list_files ; done ;fi
if [ $OS == 2 ];then if which lslpp; then lslpp -L all|grep -E '^ [0-9A-Za-z]'|awk '{print $1}'|while read -r line ; do echo "Package Name: $line" >> /tmp/artefacts/packages_aix-list_files;lslpp -f "$line" >> /tmp/artefacts/packages_aix-list_files; done ; fi ;fi
### PACKAGE CONFIG
if which chkconfig;then chkconfig --list > /tmp/artefacts/chkconfig;fi
if which yum;then yum list-security > /tmp/artefacts/yum-security;fi
fi
## Extract proc network whithout package
if [ $OS == 1 ] && [ $DUMP_NETPROC == 1 ]
then
echo "Extract proc use network out of package at $(date)"
for path in $(for pid in $(lsof -niTCP -niUDP | awk '{print $2}'|sort -u|grep -v 'PID');do ls -l /proc/"$pid"/exe|awk -F ' -> ' '{print $2}';done);do
KEEPP=1
if [ -f "/tmp/artefacts/packages_deb-list_files" ] && grep -F "${path}" /tmp/artefacts/packages_deb-list_files > /dev/null
then
KEEPP=0
fi
if [ -f "/tmp/artefacts/packages_rpm-list_files" ] && grep -F "${path}" /tmp/artefacts/packages_rpm-list_files > /dev/null
then
KEEPP=0
fi
if [ -f "/tmp/artefacts/packages-integrity-deb" ] && grep -F "${path}" /tmp/artefacts/packages-integrity-deb > /dev/null
then
KEEPP=1
fi
if [ -f "/tmp/artefacts/packages-integrity-rpm" ] && grep -F "${path}" /tmp/artefacts/packages-integrity-rpm > /dev/null
then
KEEPP=1
fi
if [ $KEEPP == 1 ]
then
size=$(du -m "${path}" | cut -f 1)
if [ "$size" -le $EXTRACT_MAXSIZE ]; then
tar vuf /tmp/artefacts/proc_network_file.tar "$path"
fi
if [ ! -x "$(which md5sum)" ]; then
md5sum "$path" >> /tmp/artefacts/proc_network_file_hash
file "$path" >> /tmp/artefacts/proc_network_file_hash
fi
fi
done
gzip /tmp/artefacts/proc_network_file.tar
fi
## Extract binary integrity package broken
if [ -f "/tmp/artefacts/packages-integrity-deb" ] && [ $DUMP_PKG_INTEGRITY == 1 ]
then
echo "Extract binary package DEB fail integrity at $(date)"
for path in $(for i in $(awk '{print $NF}' /tmp/artefacts/packages-integrity-deb);do file "$i"|grep 'ELF ';done); do
size=$(du -m "${path}" | cut -f 1)
if [ "$size" -le $EXTRACT_MAXSIZE ]; then
tar vuf /tmp/artefacts/bin_package_suspect.tar "$path"
fi
if [ ! -x "$(which md5sum)" ]; then
md5sum "$path" >> /tmp/artefacts/bin_package_suspect_hash
file "$path" >> /tmp/artefacts/bin_package_suspect_hash
fi
done
fi
if [ -f "/tmp/artefacts/packages-integrity-rpm" ] && [ $DUMP_PKG_INTEGRITY == 1 ]
then
echo "Extract binary package RPM fail integrity at $(date)"
for path in $(for i in $(awk '{print $NF}' /tmp/artefacts/packages-integrity-rpm);do file "$i"|grep 'ELF ';done); do
size=$(du -m "${path}" | cut -f 1)
if [ "$size" -le $EXTRACT_MAXSIZE ]; then
tar vuf /tmp/artefacts/bin_package_suspect.tar "$path"
fi
if [ ! -x "$(which md5sum)" ]; then
md5sum "$path" >> /tmp/artefacts/bin_package_suspect_hash
file "$path" >> /tmp/artefacts/bin_package_suspect_hash
fi
done
fi
gzip /tmp/artefacts/bin_package_suspect.tar
# Get FS - info
if [ $FILE_TYPE == 1 ] || [ $FILE_MD5 == 1 ]
then
#wait file /tmp/artefacts/all_files_file
wait
#remove package file
if [ -f "/tmp/artefacts/packages_deb-list_files" ] ; then
grep -v -x -F -f /tmp/artefacts/packages_deb-list_files /tmp/artefacts/all_files_file > /tmp/artefacts/all_files_file2
mv /tmp/artefacts/all_files_file2 /tmp/artefacts/all_files_file
fi
if [ -f "/tmp/artefacts/packages_rpm-list_files" ] ; then
grep -v -x -F -f /tmp/artefacts/packages_rpm-list_files /tmp/artefacts/all_files_file > /tmp/artefacts/all_files_file2
mv /tmp/artefacts/all_files_file2 /tmp/artefacts/all_files_file
fi
fi
if [ $FILE_TYPE == 1 ];then
echo "Get file type info at $(date)"
file -f /tmp/artefacts/all_files_file >> /tmp/artefacts/all_files &
fi
if [ -x "$(which md5sum)" ] && [ $FILE_MD5 == 1 ]
then
echo "Get md5sum info at $(date)"
while IFS= read -r line
do
md5sum "$line"
done < /tmp/artefacts/all_files_file >> /tmp/artefacts/all_files &
fi
if [ -x "$(which debugfs)" ] && [ $FILE_DELETED == 1 ]
then
declare -a fstmp=()
declare -a mnttmp=()
declare -a sizex=()
declare -a keepx=()
while IFS= read -r line;do
if [[ ${line} =~ (.+)[[:space:]](.+) ]]; then
fstmp+=("${BASH_REMATCH[1]}")
mnttmp+=("${BASH_REMATCH[2]}")
char="/"
if [[ ${BASH_REMATCH[1]} == "/dev/"* ]]; then
keepx+=(1)
else
keepx+=(0)
fi
if [[ "${BASH_REMATCH[2]}" == "/" ]]; then
sizex+=("0")
else
sizex+=($(awk -F"${char}" '{print NF-1}' <<< "${BASH_REMATCH[2]}"))
fi
fi
done < <(df|awk '{print $1" "$NF}')
declare -a fslist=()
declare -a mounted=()
declare -a validfs=()
for i in {10..0}
do
len=${#sizex[@]}
len=$((len-1))
for j in $(seq 0 $len); do
val=${sizex[$j]}
if [ "$val" == "$i" ]; then
fslist+=("${fstmp[$j]}")
mounted+=("${mnttmp[$j]}")
validfs+=("${keepx[$j]}")
fi
done
done
while IFS= read -r file;do
j=0
for i in "${mounted[@]}"; do
if [[ $file == "${i}"* ]]; then
if [ "${validfs[$j]}" == 0 ]; then
break
fi
fxs=${fslist[$j]}
rxm=${file#"${i}"}
debugfs -R 'ls -dl '"${rxm}" "${fxs}" 2>/dev/null | grep ' 0> '| awk -v myvar="$file" '{print myvar"/"$NF}' >> /tmp/artefacts/files-deleted &
break
fi
j=$((j+1))
done
done < <(find / -path /run -prune -o -path /tmp/artefacts -prune -o \( -fstype nfs -prune \) -o \( -fstype sysfs -prune \) -o \( -fstype proc -prune \) -o -type d -print) &
fi
## Extract systemd, rc.local, init.d
if [ $AUTORUN_INFO == 1 ]
then
echo "Extract autorun at $(date)"
### list service & verify path of execute (date & path standard)
echo -e "#####Artefact Services#####\n" > /tmp/artefacts/services
if [ $OS == 2 ]; then ls -l /etc/rc.d/init.d/* >> /tmp/artefacts/services_init;fi
### extract all path if exist and check package
if [ $OS == 2 ]; then lssrc -a >> /tmp/artefacts/services;fi
if [ $OS == 2 ]; then ls -l /etc/inittab >> /tmp/artefacts/services_inittab ; cat /etc/inittab >> /tmp/artefacts/services_inittab;fi
if [ $OS == 1 ]; then ls -laR /etc/init.d/ >> /tmp/artefacts/services_init;fi
if [ $OS == 1 ]; then ls -laR /etc/systemd/ >> /tmp/artefacts/services_systemd;fi
if [ $OS == 1 ]; then systemctl list-units --type=service > /tmp/artefacts/services_systemd_list;fi
if [ $OS == 1 ]; then ls -laR /run/systemd >> /tmp/artefacts/services_systemd_runtime;fi
### check contains variable: ExecStart, ExecStop, ExecReload (path exist and from package)
for path in $(grep -iER 'ExecStart=|ExecReload=|ExecStop=' /etc/systemd |grep -vE '^#'|awk -F '=' '{print $2}'|awk '{print $1}');do echo check "$path";done >/tmp/artefacts/service-systemd
if [ $OS == 1 ]; then ls -la /etc/rc.local >> /tmp/artefacts/services_rclocal;fi
grep -iER '(^|\s+)DAEMON\=|(^|\s+)NAME\=|(^|\s+)COMMAND\=|(^|\S+)[A-Z][A-Z0-9]*_BIN\=' /etc/init.d/ > /tmp/artefacts/services-initd_exe
fi
##process/services bonus
mkdir /tmp/debsecan
#debsecan VERSION = "0.4" -- openssl base64 < debsecan > debsecan_b64
cat << EOF > /tmp/debsecan/debsecan_b64
IyEvdXNyL2Jpbi9weXRob24zCiMgZGVic2VjYW4gLSBEZWJpYW4gU2VjdXJpdHkg
QW5hbHl6ZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxOSBGbG9yaWFuIFdlaW1l
ciBhbmQgY29udHJpYnV0b3JzCiMgQ29weXJpZ2h0IChDKSAyMDE1IE1pY2hhZWwg
R2lsYmVydCA8bWdpbGJlcnRAZGViaWFuLm9yZz4KIwojIFRoaXMgcHJvZ3JhbSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Ig
bW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
cgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlz
IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBH
TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMg
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYg
bm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIx
MTAtMTMwMSBVU0EKClZFUlNJT04gPSAiMC40IgoKaW1wb3J0IGNvbGxlY3Rpb25z
CmltcG9ydCBjb3B5CmZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCmZyb20gb3B0cGFy
c2UgaW1wb3J0IE9wdGlvblBhcnNlcgppbXBvcnQgb3MKaW1wb3J0IG9zLnBhdGgK
aW1wb3J0IHJlCmltcG9ydCBzb2NrZXQKaW1wb3J0IHN5cwppbXBvcnQgdGltZQpp
bXBvcnQgdHlwZXMKaW1wb3J0IHVybGxpYi5yZXF1ZXN0CmltcG9ydCB6bGliCmlt
cG9ydCBhcHRfcGtnCgoKYXB0X3BrZy5pbml0KCkKdHJ5OgogICAgdmVyc2lvbl9j
b21wYXJlID0gYXB0X3BrZy52ZXJzaW9uX2NvbXBhcmUKZXhjZXB0IEF0dHJpYnV0
ZUVycm9yOgogICAgdmVyc2lvbl9jb21wYXJlID0gYXB0X3BrZy5WZXJzaW9uQ29t
cGFyZQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIEZyb20gZGViaWFuX3N1cHBv
cnQgaW4gdGhlIHNlY3VyZS10ZXN0aW5nIHJlcG9zaXRvcnkuICBOZWVkcyB0byBi
ZQojIGtlcHQgaW4gc3luYyBtYW51YWxseS4gIChXZSBkdXBsaWNhdGUgaGVyZSB0
byBhdm9pZCBhIGxpYnJhcnkKIyBkZXBlbmRlbmN5LCBhbmQgbWFrZSBpdCBlYXN5
IHRvIHJ1biB0aGUgc2NyaXB0IGV2ZW4gd2hlbiBpdCBpcyBub3QKIyBpbnN0YWxs
ZWQgb24gdGhlIHN5c3RlbS4pCgpjbGFzcyBQYXJzZUVycm9yKEV4Y2VwdGlvbik6
CiAgICAiIiJBbiBleGNlcHRpb24gd2hpY2ggaXMgdXNlZCB0byBzaWduYWwgYSBw
YXJzZSBmYWlsdXJlLgoKICAgIEF0dHJpYnV0ZXM6CgogICAgZmlsZW5hbWUgLSBu
YW1lIG9mIHRoZSBmaWxlCiAgICBsaW5lbm8gLSBsaW5lIG51bWJlciBpbiB0aGUg
ZmlsZQogICAgbXNnIC0gZXJyb3IgbWVzc2FnZQoKICAgICIiIgoKICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vLCBtc2cpOgogICAgICAgIGFz
c2VydCB0eXBlKGxpbmVubykgPT0gaW50CiAgICAgICAgc2VsZi5maWxlbmFtZSA9
IGZpbGVuYW1lCiAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KICAgICAgICBz
ZWxmLm1zZyA9IG1zZwoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJl
dHVybiBzZWxmLm1zZwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBy
ZXR1cm4gIlBhcnNlRXJyb3IoJXMsICVkLCAlcykiICUgKHJlcHIoc2VsZi5maWxl
bmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzZWxmLmxpbmVubywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlcHIoc2VsZi5tc2cpKQoKICAgIGRlZiBwcmludE91dChzZWxm
LCBmaWxlKToKICAgICAgICAiIiJXcml0ZXMgYSBtYWNoaW5lLXBhcnNhYmxlIGVy
cm9yIG1lc3NhZ2UgdG8gZmlsZS4iIiIKICAgICAgICBmaWxlLndyaXRlKCIlczol
ZDogJXNcbiIgJSAoc2VsZi5maWxlbmFtZSwgc2VsZi5saW5lbm8sIHNlbGYubXNn
KSkKICAgICAgICBmaWxlLmZsdXNoKCkKCmNsYXNzIFZlcnNpb246CiAgICAiIiJW
ZXJzaW9uIGNsYXNzIHdoaWNoIHVzZXMgdGhlIG9yaWdpbmFsIEFQVCBjb21wYXJp
c29uIGFsZ29yaXRobS4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9u
KToKICAgICAgICAiIiJDcmVhdGVzIGEgbmV3IFZlcnNpb24gb2JqZWN0LiIiIgog
ICAgICAgIGFzc2VydCB0eXBlKHZlcnNpb24pID09IHN0ciwgcmVwcih2ZXJzaW9u
KQogICAgICAgIGFzc2VydCB2ZXJzaW9uICE9ICIiCiAgICAgICAgc2VsZi5fX2Fz
U3RyaW5nID0gdmVyc2lvbgoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAg
IHJldHVybiBzZWxmLl9fYXNTdHJpbmcKCiAgICBkZWYgX19yZXByX18oc2VsZik6
CiAgICAgICAgcmV0dXJuICdWZXJzaW9uKCVzKScgJSByZXByKHNlbGYuX19hc1N0
cmluZykKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1
cm4gdmVyc2lvbl9jb21wYXJlKHNlbGYuX19hc1N0cmluZywgb3RoZXIuX19hc1N0
cmluZykgPCAwCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAg
cmV0dXJuIHZlcnNpb25fY29tcGFyZShzZWxmLl9fYXNTdHJpbmcsIG90aGVyLl9f
YXNTdHJpbmcpID09IDAKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAg
ICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKCiAgICBkZWYgX19sZV9f
KHNlbGYsIG90aGVyKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9y
KCkKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByYWlzZSBO
b3RJbXBsZW1lbnRlZEVycm9yKCkKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVy
KToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKCiAgICBkZWYg
Y29tcGFyZShzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHZlcnNpb25fY29t
cGFyZShzZWxmLl9fYXNTdHJpbmcsIG90aGVyLl9fYXNTdHJpbmcpCgpjbGFzcyBQ
YWNrYWdlRmlsZToKICAgICIiIkEgRGViaWFuIHBhY2thZ2UgZmlsZS4KCiAgICBP
YmplY3RzIG9mIHRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gcmVhZCBEZWJpYW4n
cyBTb3VyY2UgYW5kCiAgICBQYWNrYWdlcyBmaWxlcy4iIiIKCiAgICByZV9maWVs
ZCA9IHJlLmNvbXBpbGUocideKFtBLVphLXpdW0EtWmEtejAtOS1dKyk6KD86XHMr
KC4qPykpP1xzKiQnKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBmaWxl
T2JqPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZXMgYSBuZXcgcGFja2FnZSBmaWxl
IG9iamVjdC4KCiAgICAgICAgbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRo
ZSBkYXRhIGNvbWVzIGZyb20KICAgICAgICBmaWxlT2JqIC0gYW4gYWx0ZXJuYXRl
IGRhdGEgc291cmNlOyB0aGUgZGVmYXVsdCBpcyB0byBvcGVuIHRoZQogICAgICAg
ICAgICAgICAgICBmaWxlIHdpdGggdGhlIGluZGljYXRlZCBuYW1lLgogICAgICAg
ICIiIgogICAgICAgIGlmIGZpbGVPYmogaXMgTm9uZToKICAgICAgICAgICAgZmls
ZU9iaiA9IHNhZmVfb3BlbihuYW1lKQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUK
ICAgICAgICBzZWxmLmZpbGUgPSBmaWxlT2JqCiAgICAgICAgc2VsZi5saW5lbm8g
PSAwCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGxpbmUgPSBzZWxm
LmZpbGUucmVhZGxpbmUoKQogICAgICAgIHNlbGYubGluZW5vICs9IDEKICAgICAg
ICBwa2cgPSBbXQogICAgICAgIHdoaWxlIGxpbmU6CiAgICAgICAgICAgIGlmIGxp
bmUgPT0gJ1xuJzoKICAgICAgICAgICAgICAgIGlmIGxlbihwa2cpID09IDA6CiAg
ICAgICAgICAgICAgICAgICAgc2VsZi5yYWlzZVN5bnRheEVycm9yKCdleHBlY3Rl
ZCBwYWNrYWdlIHJlY29yZCcpCiAgICAgICAgICAgICAgICB5aWVsZCBwa2cKICAg
ICAgICAgICAgICAgIHBrZyA9IFtdCiAgICAgICAgICAgICAgICBsaW5lID0gc2Vs
Zi5maWxlLnJlYWRsaW5lKCkKICAgICAgICAgICAgICAgIHNlbGYubGluZW5vICs9
IDEKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBtYXRjaCA9
IHNlbGYucmVfZmllbGQubWF0Y2gobGluZSkKICAgICAgICAgICAgaWYgbm90IG1h
dGNoOgogICAgICAgICAgICAgICAgc2VsZi5yYWlzZVN5bnRheEVycm9yKCJleHBl
Y3RlZCBwYWNrYWdlIGZpZWxkLCBnb3QgIiArIHJlcHIobGluZSkpCiAgICAgICAg
ICAgIChuYW1lLCBjb250ZW50cykgPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAg
ICBjb250ZW50cyA9IGNvbnRlbnRzIG9yICcnCgogICAgICAgICAgICB3aGlsZSBU
cnVlOgogICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuZmlsZS5yZWFkbGluZSgp
CiAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyArPSAxCiAgICAgICAgICAgICAg
ICBpZiBsaW5lIGFuZCBsaW5lWzBdIGluICIgXHQiOgogICAgICAgICAgICAgICAg
ICAgIG5jb250ZW50cyA9IGxpbmVbMTpdCiAgICAgICAgICAgICAgICAgICAgaWYg
bmNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBuY29udGVudHNb
LTFdID09ICdcbic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29udGVu
dHMgPSBuY29udGVudHNbOi0xXQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAg
Y29udGVudHMgPSAiJXNcbiVzIiAlIChjb250ZW50cywgbmNvbnRlbnRzKQogICAg
ICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBicmVhawogICAg
ICAgICAgICBwa2cuYXBwZW5kKChuYW1lLCBjb250ZW50cykpCiAgICAgICAgaWYg
cGtnOgogICAgICAgICAgICB5aWVsZCBwa2cKCiAgICBkZWYgcmFpc2VTeW50YXhF
cnJvcihzZWxmLCBtc2csIGxpbmVubz1Ob25lKToKICAgICAgICBpZiBsaW5lbm8g
aXMgTm9uZToKICAgICAgICAgICAgbGluZW5vID0gc2VsZi5saW5lbm8KICAgICAg
ICByYWlzZSBQYXJzZUVycm9yKHNlbGYubmFtZSwgbGluZW5vLCBtc2cpCgojIEVu
ZCBvZiBjb2RlIGZyb20gZGViaWFuX3N1cHBvcnQKIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIwoKIyBHZW5lcmFsIHN1cHBvcnQgcm91dGluZXMKCmRlZiBzYWZlX29wZW4o
bmFtZSwgbW9kZT0iciIpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBvcGVuKG5h
bWUsIG1vZGUpCiAgICBleGNlcHQgSU9FcnJvciBhcyBlOgogICAgICAgIHN5cy5z
dGRvdXQud3JpdGUoImVycm9yOiBjb3VsZCBub3Qgb3BlbiAlczogJXNcbiIgJSAo
cmVwcihuYW1lKSwgZS5zdHJlcnJvcikpCiAgICAgICAgc3lzLmV4aXQoMikKCiMg
Q29uZmlndXJhdGlvbiBmaWxlIHBhcnNlcgoKY2xhc3MgQ29uZmlnUGFyc2VyOgog
ICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZpbGU9Tm9uZSk6CiAgICAgICAg
c2VsZi5uYW1lID0gbmFtZQogICAgICAgIGlmIGZpbGUgaXMgTm9uZToKICAgICAg
ICAgICAgaWYgb3MucGF0aC5leGlzdHMobmFtZSk6CiAgICAgICAgICAgICAgICBz
ZWxmLmZpbGUgPSBzYWZlX29wZW4obmFtZSkKICAgICAgICAgICAgZWxzZToKICAg
ICAgICAgICAgICAgIHNlbGYuZmlsZSA9IE5vbmUKICAgICAgICBlbHNlOgogICAg
ICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCgogICAgZGVmIG9uQ29tbWVudChzZWxm
LCBsaW5lLCBudW1iZXIpOgogICAgICAgIHBhc3MKCiAgICBkZWYgb25LZXkoc2Vs
ZiwgbGluZSwgbnVtYmVyLCBrZXksIHZhbHVlLCB0cmFpbGVyKToKICAgICAgICBw
YXNzCgogICAgZGVmIG9uRXJyb3Ioc2VsZiwgbGluZSwgbnVtYmVyKToKICAgICAg
ICBzeXMuc3RkZXJyLndyaXRlKCIlczolZDogaW52YWxpZCBjb25maWd1cmF0aW9u
IGZpbGUgc3ludGF4XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAlIChzZWxm
Lm5hbWUsIG51bWJlcikpCiAgICAgICAgc3lzLmV4aXQoMikKCiAgICBkZWYgcGFy
c2Uoc2VsZiwgcmVfY29tbWVudD1yZS5jb21waWxlKHInXlxzKig/OiMuKik/JCcp
LAogICAgICAgICAgICAgIHJlX2tleT1yZS5jb21waWxlKHInXlxzKihbQS1aX10r
KT0oLio/KVxzKiQnKSwKICAgICAgICAgICAgICByZV9xdW90ZT1yZS5jb21waWxl
KHInXiIoLiopIlxzKiQnKSk6CiAgICAgICAgaWYgc2VsZi5maWxlIGlzIE5vbmU6
CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxpbmVubyA9IDAKICAgICAgICBm
b3IgbGluZSBpbiBzZWxmLmZpbGU6CiAgICAgICAgICAgIGxpbmVubyArPSAxCiAg
ICAgICAgICAgIG1hdGNoID0gcmVfY29tbWVudC5tYXRjaChsaW5lKQogICAgICAg
ICAgICBpZiBtYXRjaCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYu
b25Db21tZW50KGxpbmUsIGxpbmVubykKICAgICAgICAgICAgICAgIGNvbnRpbnVl
CgogICAgICAgICAgICBtYXRjaCA9IHJlX2tleS5tYXRjaChsaW5lKQogICAgICAg
ICAgICBpZiBtYXRjaCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIChrLCB2
KSA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICAgICBtYXRjaCA9IHJlX3F1
b3RlLm1hdGNoKHYpCiAgICAgICAgICAgICAgICBpZiBtYXRjaCBpcyBub3QgTm9u
ZToKICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgbm90IHBlcmZlY3QsIGJ1
dCBwcm9wZXIgcGFyc2luZyBpcwogICAgICAgICAgICAgICAgICAgICMgcHJvYmFi
bHkgbm90IHdvcnRoIHRoZSBlZmZvcnQuCiAgICAgICAgICAgICAgICAgICAgKHYs
KSA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICAgICBzZWxmLm9uS2V5KGxp
bmUsIGxpbmVubywgaywgdiwgJ1xuJykKICAgICAgICAgICAgICAgIGNvbnRpbnVl
CgogICAgICAgICAgICBzZWxmLm9uRXJyb3IobGluZSwgbGluZW5vKQoKZGVmIHJl
YWRfY29uZmlnKG5hbWUsIGZpbGU9Tm9uZSk6CiAgICAiIiJSZWFkIHRoZSBjb25m
aWd1cmF0aW9uIGZpbGUgTkFNRSBpbnRvIGEgZGljdGlvbmFyeSBhbmQgcmV0dXJu
IGl0LiIiIgogICAgY29uZmlnID0ge30KICAgIGNsYXNzIFBhcnNlcihDb25maWdQ
YXJzZXIpOgogICAgICAgIGRlZiBvbktleShzZWxmLCBsaW5lLCBudW1iZXIsIGtl
eSwgdmFsdWUsIHRyYWlsZXIpOgogICAgICAgICAgICBjb25maWdba2V5XSA9IHZh
bHVlCiAgICBQYXJzZXIobmFtZSwgZmlsZSkucGFyc2UoKQogICAgcmV0dXJuIGNv
bmZpZwoKZGVmIHVwZGF0ZV9jb25maWcobmFtZSk6CiAgICAiIiJVcGRhdGUgdGhl
IGNvbmZpZ3VyYXRpb24gZmlsZSBOQU1FIHdpdGggZGF0YSBmcm9tIHN0YW5kYXJk
IGlucHV0LiIiIgogICAgbmV3X2NvbmZpZyA9IHJlYWRfY29uZmlnKCc8c3RkaW4+
Jywgc3lzLnN0ZGluKQoKICAgIG5ld19maWxlID0gW10KICAgIGNsYXNzIFBhcnNl
cihDb25maWdQYXJzZXIpOgogICAgICAgIGRlZiBvbkNvbW1lbnQoc2VsZiwgbGlu
ZSwgbGluZW5vKToKICAgICAgICAgICAgbmV3X2ZpbGUuYXBwZW5kKGxpbmUpCiAg
ICAgICAgZGVmIG9uS2V5KHNlbGYsIGxpbmUsIGxpbmVubywga2V5LCB2YWx1ZSwg
dHJhaWxlcik6CiAgICAgICAgICAgIGlmIGtleSBpbiBuZXdfY29uZmlnOgogICAg
ICAgICAgICAgICAgaWYgbmV3X2NvbmZpZ1trZXldICE9IHZhbHVlOgogICAgICAg
ICAgICAgICAgICAgIG5ld19maWxlLmFwcGVuZCgiJXM9JXMlcyIKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoa2V5LCBuZXdfY29uZmlnW2tl
eV0sIHRyYWlsZXIpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAg
ICAgICAgICBuZXdfZmlsZS5hcHBlbmQobGluZSkKICAgICAgICAgICAgICAgIGRl
bCBuZXdfY29uZmlnW2tleV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAg
ICAgIG5ld19maWxlLmFwcGVuZChsaW5lKQogICAgUGFyc2VyKG5hbWUpLnBhcnNl
KCkKCiAgICByZW1haW5pbmcgPSBsaXN0KG5ld19jb25maWcua2V5cygpKQogICAg
cmVtYWluaW5nLnNvcnQoKQogICAgaWYgcmVtYWluaW5nOgogICAgICAgIGlmIHJl
bWFpbmluZ1stMV0gIT0gIlxuIjoKICAgICAgICAgICAgbmV3X2ZpbGUuYXBwZW5k
KCJcbiIpCiAgICAgICAgZm9yIGsgaW4gcmVtYWluaW5nOgogICAgICAgICAgICBu
ZXdfZmlsZS5hcHBlbmQoIiVzPSVzXG4iICUgKGssIG5ld19jb25maWdba10pKQoK
ICAgIGNvbmYgPSBvcGVuKG5hbWUsICJ3KyIpCiAgICB0cnk6CiAgICAgICAgZm9y
IGxpbmUgaW4gbmV3X2ZpbGU6CiAgICAgICAgICAgIGNvbmYud3JpdGUobGluZSkK
ICAgIGZpbmFsbHk6CiAgICAgICAgY29uZi5jbG9zZSgpCgojIENvbW1hbmQgbGlu
ZSBwYXJzZXIKCmRlZiBwYXJzZV9jbGkoKToKICAgICIiIlJlYWRzIHN5cy5hcmd2
IGFuZCByZXR1cm5zIGFuIG9wdGlvbnMgb2JqZWN0LiIiIgogICAgcGFyc2VyID0g
T3B0aW9uUGFyc2VyKHVzYWdlPSIlcHJvZyBPUFRJT05TLi4uIikKICAgIHBhcnNl
ci5hZGRfb3B0aW9uKCItLWNvbmZpZyIsIG1ldGF2YXI9IkZJTEUiLAogICAgICAg
ICAgICAgICAgICAgICAgaGVscD0ic2V0cyB0aGUgbmFtZSBvZiB0aGUgY29uZmln
dXJhdGlvbiBmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Jy9l
dGMvZGVmYXVsdC9kZWJzZWNhbicpCiAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1z
dWl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJzZXQgdGhlIERlYmlh
biBzdWl0ZSBvZiB0aGlzIGluc3RhbGxhdGlvbiIpCiAgICBwYXJzZXIuYWRkX29w
dGlvbigiLS1zb3VyY2UiLCBtZXRhdmFyPSJVUkwiLAogICAgICAgICAgICAgICAg
ICAgICAgaGVscD0ic2V0cyB0aGUgVVJMIGZvciB0aGUgdnVsbmVyYWJpbGl0eSBp
bmZvcm1hdGlvbiIpCiAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1zdGF0dXMiLCBt
ZXRhdmFyPSJOQU1FIiwKICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Ii92
YXIvbGliL2Rwa2cvc3RhdHVzIiwKICAgICAgICAgICAgICAgICAgICAgIGhlbHA9
Im5hbWUgb2YgdGhlIGRwa2cgc3RhdHVzIGZpbGUiKQogICAgcGFyc2VyLmFkZF9v
cHRpb24oIi0tZm9ybWF0IiwgdHlwZT0iY2hvaWNlIiwKICAgICAgICAgICAgICAg
ICAgICAgIGNob2ljZXM9WydidWdzJywgJ3BhY2thZ2VzJywgJ3N1bW1hcnknLCAn
ZGV0YWlsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQn
LCAnc2ltcGxlJ10sCiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJzdW1t
YXJ5IiwKICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImNoYW5nZSBvdXRwdXQg
Zm9ybWF0IikKICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLW9ubHktZml4ZWQiLCBh
Y3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJvbmx5X2ZpeGVkIiwKICAgICAgICAg
ICAgICAgIGhlbHA9Imxpc3Qgb25seSB2dWxuZXJhYmlsaXRpZXMgZm9yIHdoaWNo
IGEgZml4IGlzIGF2YWlsYWJsZSIpCiAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1u
by1vYnNvbGV0ZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9Im5vX29ic29s
ZXRlIiwKICAgICAgICAgICAgICAgIGhlbHA9ImRvIG5vdCBsaXN0IG9ic29sZXRl
IHBhY2thZ2VzIChub3QgcmVjb21tZW5kKSIpCiAgICBwYXJzZXIuYWRkX29wdGlv
bigiLS1oaXN0b3J5IiwgZGVmYXVsdD0iL3Zhci9saWIvZGVic2VjYW4vaGlzdG9y
eSIsCiAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSJOQU1FIiwKICAgICAg
ICAgICAgICAgICAgICAgIGhlbHA9InNldHMgdGhlIGZpbGUgbmFtZSBvZiBkZWJz
ZWNhbidzIGludGVybmFsIHN0YXR1cyAiCiAgICAgICAgICAgICAgICAgICAgICAr
ICJmaWxlIikKICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWxpbmUtbGVuZ3RoIiwg
ZGVmYXVsdD03MiwgdHlwZT0iaW50IiwKICAgICAgICAgICAgICAgICAgICAgIGRl
c3Q9ImxpbmVfbGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im1h
eGltdW0gbGluZSBsZW5ndGggaW4gcmVwb3J0IG1vZGUiKQogICAgcGFyc2VyLmFk
ZF9vcHRpb24oIi0tdXBkYXRlLWhpc3RvcnkiLCBhY3Rpb249InN0b3JlX3RydWUi
LAogICAgICAgICAgICAgICAgICAgICAgZGVzdD0idXBkYXRlX2hpc3RvcnkiLAog
ICAgICAgICAgICAgICAgICAgICAgaGVscD0idXBkYXRlIHRoZSBoaXN0b3J5IGZp
bGUgYWZ0ZXIgcmVwb3J0aW5nIikKICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLW1h
aWx0byIsIGhlbHA9InNlbmQgcmVwb3J0IHRvIGFuIGVtYWlsIGFkZHJlc3MiKQog
ICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tY3JvbiIsIGFjdGlvbj0ic3RvcmVfdHJ1
ZSIsCiAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkZWJzZWNhbiBpcyBpbnZv
a2VkIGZyb20gY3JvbiIpCiAgICBwYXJzZXIuYWRkX29wdGlvbigiLS13aGl0ZWxp
c3QiLCBtZXRhdmFyPSJOQU1FIiwKICAgICAgICAgICAgICAgICAgICAgIGRlZmF1
bHQ9Ii92YXIvbGliL2RlYnNlY2FuL3doaXRlbGlzdCIsCiAgICAgICAgICAgICAg
ICAgICAgICBoZWxwPSJzZXRzIHRoZSBuYW1lIG9mIHRoZSB3aGl0ZWxpc3QgZmls
ZSIpCiAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1hZGQtd2hpdGVsaXN0IiwgYWN0
aW9uPSJzdG9yZV90cnVlIiwKICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9Indo
aXRlbGlzdF9hZGQiLAogICAgICAgICAgICAgICAgICAgICAgaGVscD0iYWRkIGVu
dHJpZXMgdG8gdGhlIHdoaXRlbGlzdCIpCiAgICBwYXJzZXIuYWRkX29wdGlvbigi
LS1yZW1vdmUtd2hpdGVsaXN0IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgICAg
ICAgICAgICAgICAgICAgIGRlc3Q9IndoaXRlbGlzdF9yZW1vdmUiLAogICAgICAg
ICAgICAgICAgICAgICAgaGVscD0icmVtb3ZlIGVudHJpZXMgZnJvbSB0aGUgd2hp
dGVsaXN0IikKICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXNob3ctd2hpdGVsaXN0
IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgICAgICAgICAgICAgICAgICAgIGRl
c3Q9IndoaXRlbGlzdF9zaG93IiwKICAgICAgICAgICAgICAgICAgICAgIGhlbHA9
ImRpc3BsYXkgZW50cmllcyBvbiB0aGUgd2hpdGVsaXN0IikKICAgIHBhcnNlci5h
ZGRfb3B0aW9uKCItLWRpc2FibGUtaHR0cHMtY2hlY2siLCBhY3Rpb249InN0b3Jl
X3RydWUiLAogICAgICAgICAgICAgICAgICAgICAgZGVzdD0iZGlzYWJsZV9odHRw
c19jaGVjayIsCiAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkaXNhYmxlIGNl
cnRpZmljYXRlIGNoZWNrcyIpCiAgICBwYXJzZXIuYWRkX29wdGlvbigiLS11cGRh
dGUtY29uZmlnIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgICAgICAgICAgICAg
ICAgICAgIGRlc3Q9InVwZGF0ZV9jb25maWciLCBoZWxwPU5vbmUpCiAgICAob3B0
aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncygpCgogICAgZGVmIHByb2Nl
c3Nfd2hpdGVsaXN0X29wdGlvbnMoKToKICAgICAgICAiIiJDaGVjayB0aGUgd2hp
dGVsaXN0IG9wdGlvbnMuICBUaGV5IGNvbmZsaWN0IHdpdGggZXZlcnl0aGluZwog
ICAgICAgIGVsc2UuIiIiCiAgICAgICAgY291bnQgPSAwCiAgICAgICAgZm9yIHgg
aW4gKG9wdGlvbnMud2hpdGVsaXN0X2FkZCwgb3B0aW9ucy53aGl0ZWxpc3RfcmVt
b3ZlLAogICAgICAgICAgICAgICAgICBvcHRpb25zLndoaXRlbGlzdF9zaG93KToK
ICAgICAgICAgICAgaWYgeDoKICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKICAg
ICAgICBpZiBjb3VudCA9PSAwOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBp
ZiBjb3VudCA+IDE6CiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoCiAgICAg
ICAgICAgICAgICAiZXJyb3I6IGF0IG1vc3Qgb25lIHdoaXRlbGlzdCBvcHRpb24g
bWF5IGJlIHNwZWNpZmllZFxuIikKICAgICAgICAgICAgc3lzLmV4aXQoMSkKCiAg
ICAgICAgZm9yIChrLCB2KSBpbiBsaXN0KG9wdGlvbnMuX19kaWN0X18uaXRlbXMo
KSk6CiAgICAgICAgICAgIGlmIHR5cGUodikgPT0gdHlwZXMuTWV0aG9kVHlwZSBv
ciB2IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAg
ICBpZiBrIG5vdCBpbiAoIndoaXRlbGlzdCIsICJ3aGl0ZWxpc3RfYWRkIiwgIndo
aXRlbGlzdF9yZW1vdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUg
Zm9sbG93aW5nIG9wdGlvbnMgaGF2ZSBkZWZhdWx0cyBhbmQgYXJlCiAgICAgICAg
ICAgICAgICAgICAgICAgICAjIGFsd2F5cyBwcmVzZW50LgogICAgICAgICAgICAg
ICAgICAgICAgICAgImhpc3RvcnkiLCAic3RhdHVzIiwgImZvcm1hdCIsICJsaW5l
X2xlbmd0aCIpOgogICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgKICAg
ICAgICAiZXJyb3I6IHdoZW4gZWRpdGluZyB0aGUgd2hpdGVsaXN0LCBubyBvdGhl
ciBvcHRpb25zIGFyZSBhbGxvd2VkXG4iKQogICAgICAgICAgICAgICAgc3lzLmV4
aXQoMSkKCiAgICBpZiBvcHRpb25zLndoaXRlbGlzdF9hZGQ6CiAgICAgICAgd2hp
dGVsaXN0X2FkZChvcHRpb25zLCBhcmdzKQogICAgICAgIHN5cy5leGl0KDApCiAg
ICBpZiBvcHRpb25zLndoaXRlbGlzdF9yZW1vdmU6CiAgICAgICAgd2hpdGVsaXN0
X3JlbW92ZShvcHRpb25zLCBhcmdzKQogICAgICAgIHN5cy5leGl0KDApCiAgICBp
ZiBvcHRpb25zLndoaXRlbGlzdF9zaG93OgogICAgICAgIHdoaXRlbGlzdF9zaG93
KG9wdGlvbnMsIGFyZ3MpCiAgICAgICAgc3lzLmV4aXQoMCkKCiAgICBwcm9jZXNz
X3doaXRlbGlzdF9vcHRpb25zKCkKCiAgICBpZiBvcHRpb25zLmNyb246CiAgICAg
ICAgb3B0aW9ucy5mb3JtYXQgPSAncmVwb3J0JwogICAgICAgIG9wdGlvbnMudXBk
YXRlX2hpc3RvcnkgPSBUcnVlCiAgICBpZiBvcHRpb25zLm9ubHlfZml4ZWQgYW5k
IG5vdCBvcHRpb25zLnN1aXRlOgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImVy
cm9yOiAtLW9ubHktZml4ZWQgcmVxdWlyZXMgLS1zdWl0ZVxuIikKICAgICAgICBz
eXMuZXhpdCgxKQogICAgaWYgb3B0aW9ucy5ub19vYnNvbGV0ZSBhbmQgbm90IG9w
dGlvbnMuc3VpdGU6CiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiZXJyb3I6IC0t
bm8tb2Jzb2xldGUgcmVxdWlyZXMgLS1zdWl0ZVxuIikKICAgICAgICBzeXMuZXhp
dCgxKQogICAgaWYgb3B0aW9ucy51cGRhdGVfaGlzdG9yeSBhbmQgb3B0aW9ucy5m
b3JtYXQgIT0gJ3JlcG9ydCc6CiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiZXJy
b3I6IC0tdXBkYXRlLWhpc3RvcnkgcmVxdWlyZXMgcmVwb3J0IGZvcm1hdFxuIikK
ICAgICAgICBzeXMuZXhpdCgxKQogICAgaWYgb3B0aW9ucy5jcm9uIGFuZCBvcHRp
b25zLmZvcm1hdCAhPSAncmVwb3J0JzoKICAgICAgICBzeXMuc3RkZXJyLndyaXRl
KCJlcnJvcjogLS1jcm9uIHJlcXVpcmVzIHJlcG9ydCBmb3JtYXRcbiIpCiAgICAg
ICAgc3lzLmV4aXQoMSkKICAgIGlmIG9wdGlvbnMubWFpbHRvIGFuZCBvcHRpb25z
LmZvcm1hdCAhPSAncmVwb3J0JzoKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJl
cnJvcjogLS1tYWlsdG8gcmVxdWlyZXMgcmVwb3J0IGZvcm1hdFxuIikKICAgICAg
ICBzeXMuZXhpdCgxKQogICAgb3B0aW9ucy5uZWVkX2hpc3RvcnkgPSBvcHRpb25z
LmZvcm1hdCA9PSAncmVwb3J0JwoKICAgIGNvbmZpZyA9IHJlYWRfY29uZmlnKG9w
dGlvbnMuY29uZmlnKQogICAgaWYgb3B0aW9ucy5jcm9uIGFuZCBub3Qgb3B0aW9u
cy5tYWlsdG86CiAgICAgICAgb3B0aW9ucy5tYWlsdG8gPSBjb25maWcuZ2V0KCdN
QUlMVE8nLCAnJykKICAgICAgICBpZiBvcHRpb25zLm1haWx0byA9PSAnJzoKICAg
ICAgICAgICAgb3B0aW9ucy5tYWlsdG8gPSAncm9vdCcKICAgIG9wdGlvbnMuZGlz
YWJsZV9odHRwc19jaGVjayA9IG9wdGlvbnMuZGlzYWJsZV9odHRwc19jaGVjayBv
ciBcCiAgICAgICAgKGNvbmZpZy5nZXQoIkRJU0FCTEVfSFRUUFNfQ0hFQ0siLCBG
YWxzZSkgaW4KICAgICAgICAgWyd5ZXMnLCAndHJ1ZScsICdUcnVlJywgJzEnLCAn
b24nXSkKICAgIG9wdGlvbnMuc3VpdGUgPSBvcHRpb25zLnN1aXRlIG9yIGNvbmZp
Zy5nZXQoJ1NVSVRFJywgTm9uZSkKICAgIGlmIG9wdGlvbnMuc3VpdGUgPT0gJ0dF
TkVSSUMnOgogICAgICAgIG9wdGlvbnMuc3VpdGUgPSBOb25lCiAgICBvcHRpb25z
LnN1YmplY3QgPSBjb25maWcuZ2V0KAogICAgICAgICdTVUJKRUNUJywgJ0RlYmlh
biBzZWN1cml0eSBzdGF0dXMgb2YgJShob3N0bmFtZSlzJykKCiAgICByZXR1cm4g
KG9wdGlvbnMsIGNvbmZpZywgYXJncykKCiMgVnVsbmVyYWJpbGl0aWVzCgpjbGFz
cyBWdWxuZXJhYmlsaXR5OgogICAgIiIiU3RvcmVzIGEgdnVsbmVyYWJpbGl0eSBu
YW1lL3BhY2thZ2UgbmFtZSBjb21iaW5hdGlvbi4iIiIKCiAgICB1cmdlbmN5X2Nv
bnZlcnNpb24gPSB7JyAnIDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdM
JyA6ICdsb3cnLAogICAgICAgICAgICAgICAgICAgICAgICAnTScgOiAnbWVkaXVt
JywKICAgICAgICAgICAgICAgICAgICAgICAgJ0gnIDogJ2hpZ2gnfQoKICAgIGRl
ZiBfX2luaXRfXyhzZWxmLCB2dWxuX25hbWVzLCBzdHIpOgogICAgICAgICIiIkNy
ZWF0ZXMgYSBuZXcgdnVsbmVyYWJpbGl0eSBvYmplY3QgZnJvbSBhIHN0cmluZy4i
IiIKICAgICAgICAocGFja2FnZSwgdm51bSwgZmxhZ3MsIHVuc3RhYmxlX3ZlcnNp
b24sIG90aGVyX3ZlcnNpb25zKSBcCiAgICAgICAgICAgICAgICAgID0gc3RyLnNw
bGl0KCcsJywgNCkKICAgICAgICB2bnVtID0gaW50KHZudW0pCiAgICAgICAgc2Vs
Zi5idWcgPSB2dWxuX25hbWVzW3ZudW1dWzBdCiAgICAgICAgc2VsZi5wYWNrYWdl
ID0gcGFja2FnZQogICAgICAgIHNlbGYuYmluYXJ5X3BhY2thZ2VzID0gTm9uZQog
ICAgICAgIHNlbGYudW5zdGFibGVfdmVyc2lvbiA9IHVuc3RhYmxlX3ZlcnNpb24K
ICAgICAgICBzZWxmLm90aGVyX3ZlcnNpb25zID0gb3RoZXJfdmVyc2lvbnMuc3Bs
aXQoJyAnKQogICAgICAgIGlmIHNlbGYub3RoZXJfdmVyc2lvbnMgPT0gWycnXToK
ICAgICAgICAgICAgc2VsZi5vdGhlcl92ZXJzaW9ucyA9IFtdCiAgICAgICAgc2Vs
Zi5kZXNjcmlwdGlvbiA9IHZ1bG5fbmFtZXNbdm51bV1bMV0KICAgICAgICBzZWxm
LmJpbmFyeV9wYWNrYWdlID0gZmxhZ3NbMF0gPT0gJ0InCiAgICAgICAgc2VsZi51
cmdlbmN5ID0gc2VsZi51cmdlbmN5X2NvbnZlcnNpb25bZmxhZ3NbMV1dCiAgICAg
ICAgc2VsZi5yZW1vdGUgPSB7Jz8nIDogTm9uZSwKICAgICAgICAgICAgICAgICAg
ICAgICAnUicgOiBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICcgJyA6IEZh
bHNlfVtmbGFnc1syXV0KICAgICAgICBzZWxmLmZpeF9hdmFpbGFibGUgPSBmbGFn
c1szXSA9PSAnRicKCiAgICBkZWYgaXNfdnVsbmVyYWJsZShzZWxmLCBicCwgc3Ap
OgogICAgICAgICIiIlJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGJpbmFy
eSBwYWNrYWdlIGlzIHN1YmplY3QgdG8KICAgICAgICB0aGlzIHZ1bG5lcmFiaWxp
dHkuIiIiCiAgICAgICAgc2VsZi5fcGFyc2UoKQogICAgICAgIGlmIHNlbGYuYmlu
YXJ5X3BhY2thZ2UgYW5kIGJwLm5hbWUgPT0gc2VsZi5wYWNrYWdlOgogICAgICAg
ICAgICBpZiBzZWxmLnVuc3RhYmxlX3ZlcnNpb246CiAgICAgICAgICAgICAgICBy
ZXR1cm4gYnAudmVyc2lvbiA8IHNlbGYudW5zdGFibGVfdmVyc2lvbgogICAgICAg
ICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBl
bGlmIHNwLm5hbWUgPT0gc2VsZi5wYWNrYWdlOgogICAgICAgICAgICBpZiBzZWxm
LnVuc3RhYmxlX3ZlcnNpb246CiAgICAgICAgICAgICAgICByZXR1cm4gc3AudmVy
c2lvbiA8IHNlbGYudW5zdGFibGVfdmVyc2lvbiBcCiAgICAgICAgICAgICAgICAg
ICAgICAgYW5kIHNwLnZlcnNpb24gbm90IGluIHNlbGYub3RoZXJfdmVyc2lvbnMK
ICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzcC52ZXJz
aW9uIG5vdCBpbiBzZWxmLm90aGVyX3ZlcnNpb25zCiAgICAgICAgZWxzZToKICAg
ICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIG9ic29sZXRlKHNlbGYsIGJp
bl9uYW1lPU5vbmUpOgogICAgICAgIGlmIHNlbGYuYmluYXJ5X3BhY2thZ2VzIGlz
IE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIGJpbl9uYW1lIGlz
IE5vbmU6CiAgICAgICAgICAgIGJpbl9uYW1lID0gc2VsZi5pbnN0YWxsZWRfcGFj
a2FnZQogICAgICAgIHJldHVybiBiaW5fbmFtZSBub3QgaW4gc2VsZi5iaW5hcnlf
cGFja2FnZXMKCiAgICBkZWYgaW5zdGFsbGVkKHNlbGYsIHNyY19uYW1lLCBiaW5f
bmFtZSk6CiAgICAgICAgIiIiUmV0dXJucyBhIG5ldyB2dWxuZXJhYmlsaXR5IG9i
amVjdCBmb3IgdGhlIGluc3RhbGxlZCBwYWNrYWdlLiIiIgogICAgICAgIHYgPSBj
b3B5LmNvcHkoc2VsZikKICAgICAgICB2Lmluc3RhbGxlZF9wYWNrYWdlID0gYmlu
X25hbWUKICAgICAgICByZXR1cm4gdgoKICAgIGRlZiBfcGFyc2Uoc2VsZik6CiAg
ICAgICAgIiIiRnVydGhlciBwYXJzZXMgdGhlIG9iamVjdC4iIiIKICAgICAgICBp
ZiB0eXBlKHNlbGYudW5zdGFibGVfdmVyc2lvbikgPT0gc3RyOgogICAgICAgICAg
ICBpZiBzZWxmLnVuc3RhYmxlX3ZlcnNpb246CiAgICAgICAgICAgICAgICBzZWxm
LnVuc3RhYmxlX3ZlcnNpb24gPSBWZXJzaW9uKHNlbGYudW5zdGFibGVfdmVyc2lv
bikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudW5zdGFi
bGVfdmVyc2lvbiA9IE5vbmUKICAgICAgICAgICAgc2VsZi5vdGhlcl92ZXJzaW9u
cyA9IGxpc3QobWFwKFZlcnNpb24sIHNlbGYub3RoZXJfdmVyc2lvbnMpKQoKZGVm
IGJ1aWxkX3NzbF9jb250ZXh0KG9wdGlvbnMpOgogICAgIiIiUmV0dXJucyBhbiBz
c2wuU1NMQ29udGV4dCBpZiB0aGUgb3B0aW9ucyByZXF1aXJlLCBvciBOb25lIGlm
IHRoZQogICAgZGVmYXVsdCBpcyB0byBiZSB1c2VkLiIiIgoKICAgIGlmIG9wdGlv
bnMuZGlzYWJsZV9odHRwc19jaGVjazoKICAgICAgICBpbXBvcnQgc3NsCiAgICAg
ICAgY3R4ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoKQogICAgICAgIGN0
eC5jaGVja19ob3N0bmFtZSA9IEZhbHNlCiAgICAgICAgY3R4LnZlcmlmeV9tb2Rl
ID0gc3NsLkNFUlRfTk9ORQogICAgICAgIHJldHVybiBjdHgKCmRlZiBmZXRjaF9k
YXRhKG9wdGlvbnMsIGNvbmZpZyk6CiAgICAiIiJSZXR1cm5zIGEgZGljdGlvbmFy
eSBQQUNLQUdFIC0+IExJU1QtT0YtVlVMTkVSQUJJTElUSUVTLiIiIgogICAgdXJs
ID0gb3B0aW9ucy5zb3VyY2Ugb3IgY29uZmlnLmdldCgiU09VUkNFIiwgTm9uZSkg
XAogICAgICAgIG9yICJodHRwczovL3NlY3VyaXR5LXRyYWNrZXIuZGViaWFuLm9y
Zy90cmFja2VyLyIgXAogICAgICAgICAgICJkZWJzZWNhbi9yZWxlYXNlLzEvIgog
ICAgaWYgdXJsWy0xXSAhPSAiLyI6CiAgICAgICAgdXJsICs9ICIvIgogICAgaWYg
b3B0aW9ucy5zdWl0ZToKICAgICAgICB1cmwgKz0gb3B0aW9ucy5zdWl0ZQogICAg
ZWxzZToKICAgICAgICB1cmwgKz0gJ0dFTkVSSUMnCiAgICByID0gdXJsbGliLnJl
cXVlc3QuUmVxdWVzdCh1cmwpCiAgICByLmFkZF9oZWFkZXIoJ1VzZXItQWdlbnQn
LCAnZGVic2VjYW4vJyArIFZFUlNJT04pCiAgICB0cnk6CiAgICAgICAgdSA9IHVy
bGxpYi5yZXF1ZXN0LnVybG9wZW4ociwgY29udGV4dD1idWlsZF9zc2xfY29udGV4
dChvcHRpb25zKSkKICAgICAgICAjIEluIGNyb24gbW9kZSwgd2Ugc3VwcHJlc3Mg
YWxtb3N0IGFsbCBlcnJvcnMgYmVjYXVzZSB3ZQogICAgICAgICMgYXNzdW1lIHRo
YXQgdGhleSBhcmUgZHVlIHRvIGxhY2sgb2YgSW50ZXJuZXQgY29ubmVjdGl2aXR5
LgogICAgZXhjZXB0IHVybGxpYi5lcnJvci5IVFRQRXJyb3IgYXMgZToKICAgICAg
ICBpZiBlLmNvZGUgPT0gNDA0OgogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRl
KCJlcnJvcjogd2hpbGUgZG93bmxvYWRpbmcgJXM6XG4lc1xuIiAlICh1cmwsIGUp
KQogICAgICAgICAgICBpZiBvcHRpb25zLnN1aXRlOgogICAgICAgICAgICAgICAg
c3lzLnN0ZGVyci53cml0ZSgiQXJlIHlvdSBzdXJlICVzIGlzIGEgRGViaWFuIGNv
ZGVuYW1lP1xuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
cHIob3B0aW9ucy5zdWl0ZSkpCiAgICAgICAgICAgIHN5cy5leGl0KDEpCiAgICAg
ICAgaWYgKG5vdCBvcHRpb25zLmNyb24pIG9yIGUuY29kZSA9PSA0MDQ6CiAgICAg
ICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImVycm9yOiB3aGlsZSBkb3dubG9hZGlu
ZyAlczpcbiVzXG4iICUgKHVybCwgZSkpCiAgICAgICAgICAgIHN5cy5leGl0KDEp
CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3lzLmV4aXQoMCkKICAgIGV4Y2Vw
dCB1cmxsaWIuZXJyb3IuVVJMRXJyb3IgYXMgZToKICAgICAgICBpZiBub3Qgb3B0
aW9ucy5jcm9uOiAgICAgICAgICAgICMgbm8gZS5jb2RlIGNoZWNrIGhlcmUKICAg
ICAgICAgICAgIyBCZSBjb25zZXJ2YXRpdmUgYWJvdXQgdGhlIGF0dHJpYnV0ZXMg
b2ZmZXJlZCBieQogICAgICAgICAgICAjIFVSTEVycm9yLiAgVGhleSBhcmUgdW5k
b2N1bWVudGVkLCBhbmQgc3RyZXJyb3IgaXMgbm90CiAgICAgICAgICAgICMgYXZh
aWxhYmxlIGV2ZW4gdGhvdWdoIGl0IGlzIGRvY3VtZW50ZWQgZm9yCiAgICAgICAg
ICAgICMgRW52aXJvbm1lbnRFcnJvci4KICAgICAgICAgICAgbXNnID0gZS5fX2Rp
Y3RfXy5nZXQoJ3JlYXNvbicsICcnKQogICAgICAgICAgICBpZiBtc2c6CiAgICAg
ICAgICAgICAgICBtc2cgPSAiZXJyb3I6IHdoaWxlIGRvd25sb2FkaW5nICVzOlxu
ZXJyb3I6ICVzXG4iICUgKHVybCwgbXNnKQogICAgICAgICAgICBlbHNlOgogICAg
ICAgICAgICAgICAgbXNnID0gImVycm9yOiB3aGlsZSBkb3dubG9hZGluZyAlczpc
biIgJSB1cmwKICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShtc2cpCiAgICAg
ICAgICAgIHN5cy5leGl0KDEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3lz
LmV4aXQoMCkKCiAgICBkYXRhID0gW10KICAgIHdoaWxlIDE6CiAgICAgICAgZCA9
IHUucmVhZCg0MDk2KQogICAgICAgIGlmIGQ6CiAgICAgICAgICAgIGRhdGEuYXBw
ZW5kKGQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnJlYWsKCiAgICByYXcg
PSB6bGliLmRlY29tcHJlc3MoYicnLmpvaW4oZGF0YSkpCiAgICB0cnk6CiAgICAg
ICAgZGF0YSA9IFN0cmluZ0lPKHJhdykKICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAg
ICAgICAgZGF0YSA9IFN0cmluZ0lPKHJhdy5kZWNvZGUoJ3V0Zi04JykpCgogICAg
aWYgZGF0YS5yZWFkbGluZSgpICE9ICJWRVJTSU9OIDFcbiI6CiAgICAgICAgc3lz
LnN0ZGVyci53cml0ZSgiZXJyb3I6IHNlcnZlciBzZW5kcyBkYXRhIGluIHVua25v
d24gZm9ybWF0XG4iKQogICAgICAgIHN5cy5leGl0KDEpCgogICAgdnVsbl9uYW1l
cyA9IFtdCiAgICBmb3IgbGluZSBpbiBkYXRhOgogICAgICAgIGlmIGxpbmVbLTE6
XSA9PSAnXG4nOgogICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCiAgICAgICAg
aWYgbGluZSA9PSAnJzoKICAgICAgICAgICAgYnJlYWsKICAgICAgICAobmFtZSwg
ZmxhZ3MsIGRlc2MpID0gbGluZS5zcGxpdCgnLCcsIDIpCiAgICAgICAgdnVsbl9u
YW1lcy5hcHBlbmQoKG5hbWUsIGRlc2MpKQoKICAgIHBhY2thZ2VzID0ge30KICAg
IGZvciBsaW5lIGluIGRhdGE6CiAgICAgICAgaWYgbGluZVstMTpdID09ICdcbic6
CiAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KICAgICAgICBpZiBsaW5lID09
ICcnOgogICAgICAgICAgICBicmVhawogICAgICAgIHYgPSBWdWxuZXJhYmlsaXR5
KHZ1bG5fbmFtZXMsIGxpbmUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwYWNr
YWdlc1t2LnBhY2thZ2VdLmFwcGVuZCh2KQogICAgICAgIGV4Y2VwdCBLZXlFcnJv
cjoKICAgICAgICAgICAgcGFja2FnZXNbdi5wYWNrYWdlXSA9IFt2XQoKICAgIHNv
dXJjZV90b19iaW5hcnkgPSB7fQogICAgZm9yIGxpbmUgaW4gZGF0YToKICAgICAg
ICBpZiBsaW5lWy0xOl0gPT0gJ1xuJzoKICAgICAgICAgICAgbGluZSA9IGxpbmVb
Oi0xXQogICAgICAgIGlmIGxpbmUgPT0gJyc6CiAgICAgICAgICAgIGJyZWFrCiAg
ICAgICAgKHNwLCBicHMpID0gbGluZS5zcGxpdCgnLCcpCiAgICAgICAgaWYgYnBz
OgogICAgICAgICAgICBzb3VyY2VfdG9fYmluYXJ5W3NwXSA9IGJwcy5zcGxpdCgn
ICcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc291cmNlX3RvX2JpbmFyeVtz
cF0gPSBbXQoKICAgIGZvciB2cyBpbiBsaXN0KHBhY2thZ2VzLnZhbHVlcygpKToK
ICAgICAgICBmb3IgdiBpbiB2czoKICAgICAgICAgICAgaWYgbm90IHYuYmluYXJ5
X3BhY2thZ2U6CiAgICAgICAgICAgICAgICB2LmJpbmFyeV9wYWNrYWdlcyA9IHNv
dXJjZV90b19iaW5hcnkuZ2V0KHYucGFja2FnZSwgTm9uZSkKCiAgICByZXR1cm4g
cGFja2FnZXMKCiMgUHJldmlvdXMgc3RhdGUgKGZvciBpbmNyZW1lbnRhbCByZXBv
cnRpbmcpCgpjbGFzcyBIaXN0b3J5OgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG9w
dGlvbnMpOgogICAgICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMKICAgICAgICBz
ZWxmLmxhc3RfdXBkYXRlZCA9IDg2NDAwCiAgICAgICAgc2VsZi5fcmVhZF9oaXN0
b3J5KHNlbGYub3B0aW9ucy5oaXN0b3J5KQoKICAgIGRlZiBkYXRhKHNlbGYpOgog
ICAgICAgICIiIlJldHVybnMgYSBkaWN0aW9uYXJ5IChCVUcsIFBBQ0tBR0UpIC0+
IFVQREFURS1BVkFJTEFCTEUuCiAgICAgICAgVGhlIHJlc3VsdCBpcyBub3Qgc2hh
cmVkIHdpdGggdGhlIGludGVybmFsIGRpY3Rpb25hcnkuIiIiCiAgICAgICAgcmV0
dXJuIHNlbGYuaGlzdG9yeS5jb3B5KCkKCiAgICBkZWYgZXhwaXJlZChzZWxmKToK
ICAgICAgICAiIiJSZXR1cm5zIHRydWUgaWYgdGhlIHN0b3JlZCBoaXN0b3J5IGZp
bGUgaXMgb3V0IG9mIGRhdGUuIiIiCiAgICAgICAgaWYgc2VsZi5vcHRpb25zLmNy
b246CiAgICAgICAgICAgIG9sZCA9IHRpbWUubG9jYWx0aW1lKHNlbGYubGFzdF91
cGRhdGVkKQogICAgICAgICAgICBub3cgPSB0aW1lLmxvY2FsdGltZSgpCiAgICAg
ICAgICAgIGRlZiB5bWQodCk6CiAgICAgICAgICAgICAgICByZXR1cm4gKHQudG1f
eWVhciwgdC50bV9tb24sIHQudG1fbWRheSkKICAgICAgICAgICAgaWYgeW1kKG9s
ZCkgPT0geW1kKG5vdyk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAg
ICAgICAgICAgcmV0dXJuIG5vdy50bV9ob3VyID49IDIKICAgICAgICBlbHNlOgog
ICAgICAgICAgICAjIElmIHdlIGFyZW4ndCBydW4gZnJvbSBjcm9uLCB3ZSBhbHdh
eXMgZG93bmxvYWQgbmV3IGRhdGEuCiAgICAgICAgICAgIHJldHVybiBUcnVlCgog
ICAgZGVmIGtub3duKHNlbGYsIHYpOgogICAgICAgICIiIlJldHVybnMgdHJ1ZSBp
ZiB0aGUgdnVsbmVyYWJpbGl0eSBpcyBrbm93bi4iIiIKICAgICAgICByZXR1cm4g
diBpbiBzZWxmLmhpc3RvcnkKCiAgICBkZWYgZml4ZWQoc2VsZiwgdik6CiAgICAg
ICAgIiIiUmV0dXJucyB0cnVlIGlmIHRoZSB2dWxuZXJhYmlsaXR5IGlzIGtub3du
IGFuZCBoYXMgYmVlbgogICAgICAgIGZpeGVkLiIiIgogICAgICAgIHJldHVybiBz
ZWxmLmhpc3RvcnkuZ2V0KHYsIEZhbHNlKQoKICAgIGRlZiBfcmVhZF9oaXN0b3J5
KHNlbGYsIG5hbWUpOgogICAgICAgICIiIlJlYWRzIHRoZSBuYW1lZCBoaXN0b3J5
IGZpbGUuICBSZXR1cm5zIGEgZGljdGlvbmFyeQogICAgICAgIChCVUcsIFBBQ0tB
R0UpIC0+IFVQREFURS1BVkFJTEFCTEUuIiIiCgogICAgICAgIHNlbGYuaGlzdG9y
eSA9IHt9CgogICAgICAgIHRyeToKICAgICAgICAgICAgZiA9IG9wZW4obmFtZSkK
ICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgcmV0dXJuCgogICAg
ICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKICAgICAgICBpZiBsaW5lID09ICdWRVJT
SU9OIDBcbic6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGxpbmUgPT0g
J1ZFUlNJT04gMVxuJzoKICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQog
ICAgICAgICAgICBzZWxmLmxhc3RfdXBkYXRlZCA9IGludChsaW5lKQogICAgICAg
IGVsc2U6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBmb3IgbGluZSBpbiBm
OgogICAgICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xuJzoKICAgICAgICAgICAg
ICAgIGxpbmUgPSBsaW5lWzotMV0KICAgICAgICAgICAgKGJ1ZywgcGFja2FnZSwg
Zml4ZWQpID0gbGluZS5zcGxpdCgnLCcpCiAgICAgICAgICAgIHNlbGYuaGlzdG9y
eVsoYnVnLCBwYWNrYWdlKV0gPSBmaXhlZCA9PSAnRicKICAgICAgICBmLmNsb3Nl
KCkKCiMgV2hpdGVsaXN0aW5nIHZ1bG5lcmFiaWxpdGllcwoKY2xhc3MgV2hpdGVs
aXN0OgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlJl
YWQgYSB3aGl0ZWxpc3QgZnJvbSBkaXNrLgoKICAgICAgICBuYW1lIC0gZmlsZSBu
YW1lIG9mIHRoZSB3aGl0ZSBsaXN0LiAgSWYgTm9uZSwgbm8gZmlsZSBpcyByZWFk
LgogICAgICAgICIiIgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBz
ZWxmLmJ1Z19kaWN0ID0ge30KICAgICAgICBzZWxmLmJ1Z19wYWNrYWdlX2RpY3Qg
PSB7fQogICAgICAgIGlmIG5hbWUgYW5kIG9zLnBhdGguZXhpc3RzKG5hbWUpOgog
ICAgICAgICAgICBzcmMgPSBzYWZlX29wZW4obmFtZSkKICAgICAgICAgICAgbGlu
ZSA9IHNyYy5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIGxpbmUgIT0gJ1ZFUlNJ
T04gMFxuJzoKICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCJpbnZh
bGlkIHdoaXRlbGlzdCBmaWxlLCBnb3Q6ICIgKyByZXByKGxpbmUpKQogICAgICAg
ICAgICBmb3IgbGluZSBpbiBzcmM6CiAgICAgICAgICAgICAgICBpZiBsaW5lWy0x
XSA9PSAnXG4nOgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0K
ICAgICAgICAgICAgICAgIChidWcsIHBrZykgPSBsaW5lLnNwbGl0KCcsJykKICAg
ICAgICAgICAgICAgIHNlbGYuYWRkKGJ1ZywgcGtnKQogICAgICAgIHNlbGYuX2Rp
cnR5ID0gRmFsc2UKCiAgICBkZWYgYWRkKHNlbGYsIGJ1ZywgcGtnPU5vbmUpOgog
ICAgICAgICIiIkFkZHMgYSBidWcvcGFja2FnZSBwYWlyIHRvIHRoZSB3aGl0ZWxp
c3QuCiAgICAgICAgSWYgdGhlIHBhY2thZ2UgaXMgbm90IHNwZWNpZmllZCAob3Ig
ZW1wdHkpLCB0aGUgYnVnIGlzIHdoaXRlbGlzdGVkCiAgICAgICAgY29tcGxldGVs
eS4iIiIKICAgICAgICBpZiBwa2c6CiAgICAgICAgICAgIHNlbGYuYnVnX3BhY2th
Z2VfZGljdFsoYnVnLCBwa2cpXSA9IFRydWUKICAgICAgICBlbHNlOgogICAgICAg
ICAgICBzZWxmLmJ1Z19kaWN0W2J1Z10gPSBUcnVlCiAgICAgICAgc2VsZi5fZGly
dHkgPSBUcnVlCgogICAgZGVmIHJlbW92ZShzZWxmLCBidWcsIHBrZz1Ob25lKToK
ICAgICAgICAiIiJSZW1vdmVzIGEgYnVnL3BhY2thZ2UgcGFpciBmcm9tIHRoZSB3
aGl0ZWxpc3QuCiAgICAgICAgSWYgdGhlIHBhY2thZ2UgaXMgbm90IHNwZWNpZmll
ZCwgKmFsbCogd2hpdGVsaXN0ZWQgcGFja2FnZXMgZm9yCiAgICAgICAgdGhhdCBi
dWcgYXJlIHJlbW92ZWQuIiIiCiAgICAgICAgcmVtb3ZlZCA9IEZhbHNlCiAgICAg
ICAgaWYgcGtnOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkZWwg
c2VsZi5idWdfcGFja2FnZV9kaWN0WyhidWcsIHBrZyldCiAgICAgICAgICAgICAg
ICByZW1vdmVkID0gVHJ1ZQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAg
ICAgICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5
OgogICAgICAgICAgICAgICAgZGVsIHNlbGYuYnVnX2RpY3RbYnVnXQogICAgICAg
ICAgICAgICAgcmVtb3ZlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IEtleUVy
cm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBmb3IgYnVnX3Br
ZyBpbiBsaXN0KHNlbGYuYnVnX3BhY2thZ2VfZGljdC5rZXlzKCkpOgogICAgICAg
ICAgICAgICAgaWYgYnVnX3BrZ1swXSA9PSBidWc6CiAgICAgICAgICAgICAgICAg
ICAgZGVsIHNlbGYuYnVnX3BhY2thZ2VfZGljdFtidWdfcGtnXQogICAgICAgICAg
ICAgICAgICAgIHJlbW92ZWQgPSBUcnVlCgogICAgICAgIGlmIHJlbW92ZWQ6CiAg
ICAgICAgICAgIHNlbGYuX2RpcnR5ID0gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAg
ICAgICAgIGlmIHBrZzoKICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUo
CiAgICAgICAgICAgICAgICAgICAgImVycm9yOiBubyBtYXRjaGluZyB3aGl0ZWxp
c3QgZW50cnkgZm9yICVzICVzXG4iCiAgICAgICAgICAgICAgICAgICAgJSAoYnVn
LCBwa2cpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3lzLnN0
ZGVyci53cml0ZSgiZXJyb3I6IG5vIG1hdGNoaW5nIHdoaXRlbGlzdCBlbnRyeSBm
b3IgJXNcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBidWcp
CiAgICAgICAgICAgIHN5cy5leGl0KDEpCgogICAgZGVmIGNoZWNrKHNlbGYsIGJ1
ZywgcGFja2FnZSk6CiAgICAgICAgIiIiUmV0dXJucyB0cnVlIGlmIHRoZSBidWcv
cGFja2FnZSBwYWlyIGlzIHdoaXRlbGlzdGVkLiIiIgogICAgICAgIHJldHVybiBi
dWcgaW4gc2VsZi5idWdfZGljdCBcCiAgICAgICAgICAgICAgIG9yIChidWcsIHBh
Y2thZ2UpIGluIHNlbGYuYnVnX3BhY2thZ2VfZGljdAoKICAgIGRlZiB1cGRhdGUo
c2VsZik6CiAgICAgICAgIiIiV3JpdGUgdGhlIHdoaXRlbGlzdCBmaWxlIGJhY2sg
dG8gZGlzaywgaWYgdGhlIGRhdGEgaGFzIGNoYW5nZWQuIiIiCiAgICAgICAgaWYg
bm90IChzZWxmLl9kaXJ0eSBhbmQgc2VsZi5uYW1lKToKICAgICAgICAgICAgcmV0
dXJuCiAgICAgICAgbmV3X25hbWUgPSBzZWxmLm5hbWUgKyAnLm5ldycKICAgICAg
ICBmID0gc2FmZV9vcGVuKG5ld19uYW1lLCAidysiKQogICAgICAgIGYud3JpdGUo
IlZFUlNJT04gMFxuIikKICAgICAgICBsID0gbGlzdChzZWxmLmJ1Z19kaWN0Lmtl
eXMoKSkKICAgICAgICBsLnNvcnQoKQogICAgICAgIGZvciBidWcgaW4gbDoKICAg
ICAgICAgICAgZi53cml0ZShidWcgKyAiLFxuIikKICAgICAgICBsID0gbGlzdChz
ZWxmLmJ1Z19wYWNrYWdlX2RpY3Qua2V5cygpKQogICAgICAgIGwuc29ydCgpCiAg
ICAgICAgZm9yIGJ1Z19wa2cgaW4gbDoKICAgICAgICAgICAgZi53cml0ZSgiJXMs
JXNcbiIgJSBidWdfcGtnKQogICAgICAgIGYuY2xvc2UoKQogICAgICAgIG9zLnJl
bmFtZShuZXdfbmFtZSwgc2VsZi5uYW1lKQoKICAgIGRlZiBzaG93KHNlbGYsIGZp
bGUpOgogICAgICAgIGwgPSBbXQogICAgICAgIGZvciBidWcgaW4gbGlzdChzZWxm
LmJ1Z19kaWN0LmtleXMoKSk6CiAgICAgICAgICAgIGZpbGUud3JpdGUoIiVzIChh
bGwgcGFja2FnZXMpXG4iICUgYnVnKQogICAgICAgIGZvciAoYnVnLCBwa2cpIGlu
IGxpc3Qoc2VsZi5idWdfcGFja2FnZV9kaWN0LmtleXMoKSk6CiAgICAgICAgICAg
IGwuYXBwZW5kKCIlcyAlc1xuIiAlIChidWcsIHBrZykpCiAgICAgICAgbC5zb3J0
KCkKICAgICAgICBmb3IgbGluZSBpbiBsOgogICAgICAgICAgICBmaWxlLndyaXRl
KGxpbmUpCgpkZWYgX193aGl0ZWxpc3RfZWRpdChvcHRpb25zLCBhcmdzLCBtZXRo
b2QpOgogICAgdyA9IFdoaXRlbGlzdChvcHRpb25zLndoaXRlbGlzdCkKICAgIHdo
aWxlIGFyZ3M6CiAgICAgICAgYnVnID0gYXJnc1swXQogICAgICAgIGlmIGJ1ZyA9
PSAnJyBvciAobm90ICgnQScgPD0gYnVnWzBdIDw9ICdaJykpIG9yICcsJyBpbiBi
dWc6CiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImVycm9yOiAlcyBpcyBu
b3QgYSBidWcgbmFtZVxuIiAlIHJlcHIoYnVnKSkKICAgICAgICAgICAgc3lzLmV4
aXQoMSkKICAgICAgICBkZWwgYXJnc1swXQogICAgICAgIHBrZ19mb3VuZCA9IEZh
bHNlCiAgICAgICAgd2hpbGUgYXJnczoKICAgICAgICAgICAgcGtnID0gYXJnc1sw
XQogICAgICAgICAgICBpZiAobm90IHBrZykgb3IgJywnIGluIHBrZzoKICAgICAg
ICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImVycm9yOiAlcyBpcyBub3QgYSBw
YWNrYWdlIG5hbWVcbiIgJSByZXByKGJ1ZykpCiAgICAgICAgICAgICAgICBzeXMu
ZXhpdCgxKQogICAgICAgICAgICBpZiAnQScgPD0gcGtnWzBdIDw9ICdaJzoKICAg
ICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIG1ldGhvZCh3LCBidWcsIHBr
ZykKICAgICAgICAgICAgZGVsIGFyZ3NbMF0KICAgICAgICAgICAgcGtnX2ZvdW5k
ID0gVHJ1ZQogICAgICAgIGlmIG5vdCBwa2dfZm91bmQ6CiAgICAgICAgICAgIG1l
dGhvZCh3LCBidWcsIE5vbmUpCiAgICB3LnVwZGF0ZSgpCgpkZWYgd2hpdGVsaXN0
X2FkZChvcHRpb25zLCBhcmdzKToKICAgIF9fd2hpdGVsaXN0X2VkaXQob3B0aW9u
cywgYXJncywgbGFtYmRhIHcsIGJ1ZywgcGtnOiB3LmFkZChidWcsIHBrZykpCmRl
ZiB3aGl0ZWxpc3RfcmVtb3ZlKG9wdGlvbnMsIGFyZ3MpOgogICAgX193aGl0ZWxp
c3RfZWRpdChvcHRpb25zLCBhcmdzLCBsYW1iZGEgdywgYnVnLCBwa2c6IHcucmVt
b3ZlKGJ1ZywgcGtnKSkKZGVmIHdoaXRlbGlzdF9zaG93KG9wdGlvbnMsIGFyZ3Mp
OgogICAgV2hpdGVsaXN0KG9wdGlvbnMud2hpdGVsaXN0KS5zaG93KHN5cy5zdGRv
dXQpCgojIENsYXNzZXMgZm9yIG91dHB1dCBmb3JtYXR0aW5nCgpCaW5hcnlQYWNr
YWdlID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgKICAgICJQYWNrYWdlIiwgIm5h
bWUgdmVyc2lvbiIpClNvdXJjZVBhY2thZ2UgPSBjb2xsZWN0aW9ucy5uYW1lZHR1
cGxlKAogICAgIlNvdXJjZVBhY2thZ2UiLCAibmFtZSB2ZXJzaW9uIikKCmNsYXNz
IEZvcm1hdHRlcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXQsIG9wdGlv
bnMsIGhpc3RvcnkpOgogICAgICAgIHNlbGYudGFyZ2V0ID0gdGFyZ2V0CiAgICAg
ICAgc2VsZi5vcHRpb25zID0gb3B0aW9ucwogICAgICAgIHNlbGYuaGlzdG9yeSA9
IGhpc3RvcnkKICAgICAgICBzZWxmLndoaXRlbGlzdCA9IFdoaXRlbGlzdChzZWxm
Lm9wdGlvbnMud2hpdGVsaXN0KQogICAgICAgIHNlbGYuX2ludmFsaWRfdmVyc2lv
bnMgPSBGYWxzZQogICAgZGVmIGludmFsaWRfdmVyc2lvbihzZWxmLCBwYWNrYWdl
LCB2ZXJzaW9uKToKICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgICAgICBz
eXMuc3RkZXJyLndyaXRlKCJlcnJvcjogaW52YWxpZCB2ZXJzaW9uICVzIG9mIHBh
Y2thZ2UgJXNcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICUgKHZlcnNpb24s
IHBhY2thZ2UpKQogICAgICAgIGlmIG5vdCBzZWxmLl9pbnZhbGlkX3ZlcnNpb25z
OgogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKAogICAgImVycm9yOiBpbnN0
YWxsIHRoZSBweXRob24tYXB0IHBhY2thZ2UgZm9yIGludmFsaWQgdmVyc2lvbnMg
c3VwcG9ydFxuIikKICAgICAgICAgICAgc2VsZi5faW52YWxpZF92ZXJzaW9ucyA9
IFRydWUKICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKICAgIGRlZiBpbnZhbGlk