JAMALLUDIN

06 DESEMBER 2021

  1. Objektif

  2. Pemahaman Data

  3. Analisis Data eksplorasi (EDA)

A. Analisa Deskriptif customerlifetimevalue

B. Analisa Deskriptif Monthly Premium Aoutu (MPA)

C. Analisa Deskriptif TotalClaimAmount(TCA)

D. Analisa Deskriptif variabel lain

  1. Statistik Inferensial

A. Pengaruh Pertanggungan Asuransi terhadap customer life time value (CLV)

B. Pengaruh Edukasi terhadap customer life time value (CLV)

C. Pengaruh Status Pekerjaan terhadap nilai waktu hidup pelanggan (CLV)

D. Pengaruh Gender terhadap niali waktu hidup pelanggan (CLV)

E. Pengaruh Lokasi Pada nilai waktu hidup Pelanggan (CLV)

F. Pengaruh status perkawainan terhadap costumer life time value (CLV)

G. Pengaruh jenis polis terhadap costumer life time value (CLV)

H. Pengaruh jenis penawaran Perpanjangan nilai umur pelanggan (CLV)

I. Pengaruh saluran penjualan terhadap nilai umur pelanggan (CLV)

J. Pengaruh kelas kendaraan terhadap nilai waktu hidup pelanggan (CLV)

K. Pengaruh ukuran kendaraan terhadao nilai waktu hidup pelanngan (CLV)

L. Pengaruh Status terhadap nilai waktu hidup pelanggan (CLV)

M. Pengaruh kebijakan terhadap customer life time value (CLV)

  1. Analisa Regeris dengan variabel Kontinu

A. Interpretasi Model

B. Analisis Residu

  1. Pengujian Asumsi analisis regresi Linier

A. Mendeteksi mulitikolinearitas

B. Mendeteksi Homoskedastistas

C. Mendeteksi AutoKorelasi

D. Mendeteski MAPE

  1. Kurva Prediksi

A. Ringkasan

B. Rekomendasi Bisnis

  1. Tujuan : Memprediksi Customer life-time value (CLV) untuk perusahan asuransi mobil.

Nilai seumur hidup pelanggan (CLV) mewakili jumlah total uang yang di harapkan pelanggan untuk dibelanjakan dalam bisnis, atau pada produk, selama masa hidup mereka. ini adalah angka yang penting untuk diketahui karena membantu persuahan membuat keputusan tentang berapa banyak uang yang akan diinvestasikan untuk mendapat pelanggan baru dan mempertahankan pelanggan yang sudah ada.

library(caret)
Loading required package: lattice
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     

Attaching package: ‘caret’

The following object is masked from ‘package:purrr’:

    lift
  1. Pemahaman Data
colnames(Data_Asuransi)
 [1] "State"                      "CustomerLifetimeValue"     
 [3] "Response"                   "Coverage"                  
 [5] "Education"                  "EffectiveToDate"           
 [7] "EmploymentStatus"           "Gender"                    
 [9] "Income"                     "LocationCode"              
[11] "MaritalStatus"              "MonthlyPremiumAuto"        
[13] "MonthsSinceLastClaim"       "MonthsSincePolicyInception"
[15] "NumberofOpenComplaints"     "NumberofPolicies"          
[17] "PolicyType"                 "Policy"                    
[19] "RenewOfferType"             "SalesChannel"              
[21] "TotalClaimAmount"           "VehicleClass"              
[23] "VehicleSize"               

Keterangan

“State” : Negara.

“Customerlifetimevalue” : Pelanggan seumur hidup nilai

“Response” : respon

“Coverage” : cakupan

“Education” : Pendidikan

“EffectiveToDate” : tanggal berlaku

“EmploymentStatus” : Status Pekerjaan

“gender” : jenis kelamin,

“Income” : Penghasilan

“LocationCode” : Lokasi.Kode

“MartialStatus” : status perkawinan

“MonthlyPremiumAuto” : Bulanan.Premium.Otomatis

“MonthsSinceLastClaim” : Bulan sejak tekakhir klaim

“MonthsSincePolicyInception” : Bulan sejak kebijakan inception

“NumberofOpenComplaints” : Jumlah pengaduan terbuka

“NumberofPolicies” : jumlah kebijakan

“PolicyType” : Jenis kebijakan

“Policy” : Kebijakan

“RenewOfferType” : Perbarui jenis penawarn

“SalesChannel” : Saluran penjualan

“TotalClaimAmount” : Total jumlah klaim

“VehicleClass” : Kelas kendaraan

“VehicleSize” : Ukuran kendaran.

# Pemahaman Data
dim(Data_Asuransi)
[1] 9134   23
str(Data_Asuransi)
'data.frame':   9134 obs. of  23 variables:
 $ State                     : chr  "Washington" "Arizona" "Nevada" "California" ...
 $ CustomerLifetimeValue     : num  2764 6980 12887 7646 2814 ...
 $ Response                  : chr  "No" "No" "No" "No" ...
 $ Coverage                  : chr  "Basic" "Extended" "Premium" "Basic" ...
 $ Education                 : chr  "Bachelor" "Bachelor" "Bachelor" "Bachelor" ...
 $ EffectiveToDate           : chr  "2/24/11" "1/31/11" "2/19/11" "1/20/11" ...
 $ EmploymentStatus          : chr  "Employed" "Unemployed" "Employed" "Unemployed" ...
 $ Gender                    : chr  "F" "F" "F" "M" ...
 $ Income                    : int  56274 0 48767 0 43836 62902 55350 0 14072 28812 ...
 $ LocationCode              : chr  "Suburban" "Suburban" "Suburban" "Suburban" ...
 $ MaritalStatus             : chr  "Married" "Single" "Married" "Married" ...
 $ MonthlyPremiumAuto        : int  69 94 108 106 73 69 67 101 71 93 ...
 $ MonthsSinceLastClaim      : int  32 13 18 18 12 14 0 0 13 17 ...
 $ MonthsSincePolicyInception: int  5 42 38 65 44 94 13 68 3 7 ...
 $ NumberofOpenComplaints    : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumberofPolicies          : int  1 8 2 7 1 2 9 4 2 8 ...
 $ PolicyType                : chr  "Corporate Auto" "Personal Auto" "Personal Auto" "Corporate Auto" ...
 $ Policy                    : chr  "Corporate L3" "Personal L3" "Personal L3" "Corporate L2" ...
 $ RenewOfferType            : chr  "Offer1" "Offer3" "Offer1" "Offer1" ...
 $ SalesChannel              : chr  "Agent" "Agent" "Agent" "Call Center" ...
 $ TotalClaimAmount          : num  385 1131 566 530 138 ...
 $ VehicleClass              : chr  "Two-Door Car" "Four-Door Car" "Two-Door Car" "SUV" ...
 $ VehicleSize               : chr  "Medsize" "Medsize" "Medsize" "Medsize" ...

Dataset yand disediakan memiliki banyak detail :

  1. ada 9134 Pengamatan 23 variabel

  2. ada camapuran data tye kategoris dan berkelanjuatan

  3. dependent variabel adalah customer life time value karena harus memprediksi CLV

  4. variabel independen adalah : “Customer” Pelanggan

“StateCustomerlifetimevalue” : Nilai Negara Pelanggan seumur hidup

“Response” : respon

“Coverage” : cakupan

“Education” : Pendidikan

“EffectiveToDate” : tanggal berlaku

“EmploymentStatus” : Status Pekerjaan

“gender” : jenis kelamin

“Income” : Penghasilan

“LocationCode” : Lokasi.Kode

“MartialStatus” : stautus perkawinan

“MonthlyPremiumAuto” : Bulanan.Premium.Otomatis

“MonthsSinceLastClaim” : Bulan sejak tekakhir klaim

“MonthsSincePolicyInception” : Bulan sejak kebijakan

“NumberofOpenComplaints” : Jumlah pengaduan terbuka

“NumberofPoliciesPolicyType” : Jumlah Jenis kebijakan

“Policy” : Kebijakan

“RenewOfferType” :Jenis penwaran pembaruan

“SalesChannel” : Saluran penjualan

“TotalClaimAmountVehicleClass” : Jumlah klaim Kelas kendaraan

“VehicleSize” : Ukuran kendaran.

  1. Variabel independen lanjutan adalah : “Customerlifetimevalue” : Pelanggan niali seumur hidup

“Income” : pendapatan

“MonhtlyPremiumAoutu” : Premium bulanan otomatis

“MonthsSinceLastClaim” : Bulan sejak klaim terkahir

“MonthSincePolicyInception” : Bulan sejak awal kebijakan

“Numberofopencomplaints” : Jumlah keluhan terbuka

” Numberofpolicies” : Jumlah kebijakan

“TotalClaimAmount” : jumlah total klaim.

  1. Tidak ada nilai nol, jika tidak ada tindakan lebih lanjut yang diperlukan untuk mengganti nilai yang hilang atau nol.

  2. Kolom “Customers” adalah nomoer seri sehingga tiadak singnifiakan untuk analisis dan di hapus dari dataset.

keterangan data diatas adalah tidak ada nilai nol, jadi tidak ada tindakan lebih lanjut yang diperlukan untuk mengganti nilai yang hilang atau nol.

# Nilai unik dari setiap kolom 
sapply(Data_Asuransi, data.table::uniqueN)
                     State      CustomerLifetimeValue 
                         5                       8041 
                  Response                   Coverage 
                         2                          3 
                 Education            EffectiveToDate 
                         5                         59 
          EmploymentStatus                     Gender 
                         5                          2 
                    Income               LocationCode 
                      5694                          3 
             MaritalStatus         MonthlyPremiumAuto 
                         3                        202 
      MonthsSinceLastClaim MonthsSincePolicyInception 
                        36                        100 
    NumberofOpenComplaints           NumberofPolicies 
                         6                          9 
                PolicyType                     Policy 
                         3                          9 
            RenewOfferType               SalesChannel 
                         4                          4 
          TotalClaimAmount               VehicleClass 
                      5106                          6 
               VehicleSize 
                         3 
  1. Analisis Data Eksplorasi (EDA)

Di bagain ini ulun melakukan penyelidikan awal pada data_asuransi untuk menemukan pola dan memeriksa asumsi dengan bantuan statistik ringkasan dan repsensetasi grafis.

3.1 Analisis Deskriptif Customerlifetimevalue

range(Data_Asuransi$CustomerLifetimeValue)
[1]  1898.008 83325.381

keterangan data diatas adalah nilai maksimum CLV 83325.381 dan nilai minimunya CLV 1898.008

mean(Data_Asuransi$CustomerLifetimeValue)
[1] 8004.94

keterangan data diatas adalah rata-rata clv 8005 dan median nya 5780

sd(Data_Asuransi$CustomerLifetimeValue)
[1] 6870.968

keterangan data diatas adalah standart deviasi 6870.968

summary(Data_Asuransi$CustomerLifetimeValue)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1898    3994    5780    8005    8962   83325 
var(Data_Asuransi$CustomerLifetimeValue)
[1] 47210196

keterangan data diatas adalah nilai variansi dalam CLV 47210196

skewness(Data_Asuransi$CustomerLifetimeValue)
[1] 3.031284
attr(,"method")
[1] "moment"

keterangan data diatas adalah nilai kemiringanya 3.031284 CLV miring positif dan nili terkonsentrasi di sebelah kiri

kurtosis(Data_Asuransi$CustomerLifetimeValue)
[1] 13.81163
attr(,"method")
[1] "excess"

keterangan data diatas adalah nilai rata-rata, namun semua nilai ekstrem berada di sebelah kanan. jadi niai Kortosis adalah 13.81163, karena kortosis >3, berati distribusi memiliki ekor yang lebih tebal dari biasanya

Keterangan HISTOGRAM diatas adalah distrubsi dan memiliki lebih banyak outlier (nilai ekstrim). ini berarti bahwa distribusi clv miring postif(seperti yang diharapkan) dan sangat Leptokrutik. Hasil ini menunjukkan distribusi yang sangat miring dengan ekor yang sangat besar, ada banyak customers(pelanggan) dengan CLV rendah. sangat sedikit pelanggan CLV tinngi, ini dapat dipahami secara visual mengguanakan histogram.

3.2 Analsis Deskriptif Monthly Premium Auto(MPA)

range(Data_Asuransi$MonthlyPremiumAuto)
[1]  61 298

Keterangan data diatas nilai makmimum MPA 298 dan nilai minimum MPA 61

mean(Data_Asuransi$MonthlyPremiumAuto)
[1] 93.21929

Keterangan data diatas nilai rata KKL adalah 93.21929 dan median nya adalah 84.00

sd(Data_Asuransi$MonthlyPremiumAuto)
[1] 34.40797

keterangan data diatas adalah Standar Deviasi 34.40797

summary(Data_Asuransi$MonthlyPremiumAuto)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  61.00   68.00   83.00   93.22  109.00  298.00 
var(Data_Asuransi$MonthlyPremiumAuto)
[1] 1183.908

keterangan data data diatas adalah nilai variansi dalam KKL adalah 1183.908

skewness(Data_Asuransi$MonthlyPremiumAuto)
[1] 2.122849
attr(,"method")
[1] "moment"

Nilai kemiringanya adalah 2.122849 MPA conong postif dan sebagian besar nilai terkonsentrasi di sebelah kiri.

kurtosis(Data_Asuransi$MonthlyPremiumAuto)
[1] 6.187546
attr(,"method")
[1] "excess"

Nilai rata-rata, namun semua nilai ekstrim berada di sebelah kanan nilai rata Kurtosis adalah 6.187546. karena Kurtosis >3, bearti distribusinya memiliki ekor yang lebih tebal dari biasanya.

cor(Data_Asuransi$MonthlyPremiumAuto,Data_Asuransi$CustomerLifetimeValue)
[1] 0.3962617

distribusi dan memiliki lebih banyak outlier(niali ekstrim) ada korlasi positif 39,62 % KKL degan CLV. Dari Plot pencar, jelas.

terlihat bahwa pada KKL, CLV juga meningkat.7.

Premi bulanan mengikuti tren yang mirip dengan clv meskipun distribusinya tidak miring atau sepanjang ekor seperti CLV. Ini dapat dilhihat secara histogram.

3.3 Analisis Deskriptif TotalClaimAMount(TCA)

range(Data_Asuransi$TotalClaimAmount)
[1]    0.099007 2893.239678

TCA maksimum adalah 0,099007 dan TCA minimum adalah 2893,239678.

mean(Data_Asuransi$TotalClaimAmount)
[1] 434.0888

Rata-rata TCA adalah 434.0888 dan Median 383.945

sd(Data_Asuransi$TotalClaimAmount)
[1] 290.5001

standart deviasi adalah 290.5001

summary(Data_Asuransi$TotalClaimAmount)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
   0.099  272.258  383.945  434.089  547.515 2893.240 
var(Data_Asuransi$TotalClaimAmount)
[1] 84390.3

Varians dalam TCA adalah 84390.3

skewness(Data_Asuransi$TotalClaimAmount)
[1] 1.714403
attr(,"method")
[1] "moment"

Kemeringanya adalah 1.714403 TCA miring positif dan sebagian besar nilai terkonsentrasi di sebelah kiri

kurtosis(Data_Asuransi$TotalClaimAmount) 
[1] 5.973506
attr(,"method")
[1] "excess"

nilai rata-rata, namun semua nilai ekstirm berada di sebelah kanan nilai rata-rata kortusis adalah 5,973506. karena kurtosis > 3, berarti distribusi TCA memiliki ekor yang lebih tebal dari bisanya.

cor(Data_Asuransi$TotalClaimAmount,Data_Asuransi$CustomerLifetimeValue)
[1] 0.2264509

distribusi dan memiliki lebih banyak outlier(nilai ekstrim), terdapat korealsi positif sebesar 22,65% TCA dengan CLV dari plot pencar jelas.

terlihat bahwa pada TCA, CLV juga meningkat.

Jumlah total klaim juga mengikuti tren yang mirip dengan clv dan mpa meskipun distribusinya tidak atau berekor panjang seperti KKL. ini dapat dilihat secara visual histogram.

Artinya variasi datanya adalah CLV>MPA>TCA

3.4 Analisis Deskriptif Variabel lain

cor(Data_Asuransi$Income,Data_Asuransi$CustomerLifetimeValue)
[1] 0.02436566

cor(Data_Asuransi$MonthsSinceLastClaim,Data_Asuransi$CustomerLifetimeValue)
[1] 0.01151668

cor(Data_Asuransi$MonthsSincePolicyInception,Data_Asuransi$CustomerLifetimeValue)
[1] 0.009418381

cor(Data_Asuransi$NumberofOpenComplaints,Data_Asuransi$CustomerLifetimeValue)
[1] -0.03634319

cor(Data_Asuransi$NumberofPolicies,Data_Asuransi$CustomerLifetimeValue)
[1] 0.02195536

Dari bebarapa tabel diatas nilai korelasi positif yang mendekati nol menunjukkan bahwa tidak ada, hubungan yang kuat antara Income, Months SinceLAstClaim, NumberofPolicies dan lain-lain dengan CLV.

  1. Statistik Inferensial Kandidat yang paling jelas untuk variabel dependen adalah CLV (Customerlifetimevalue). ini juga masuk akal dari Perspektif Bisnis karena saya ingin memahami apa yang berkontribusi untuk membuat pelanggan bernilai tinggi (Analisis Deskriptif) dan mungkin nanti memprediksi siapa yang akan menjadi pelanggan bernilai tinggi (Analisis Prediktif).

Nasabah yang telah mengambil Asuransi Dasar (Basic) untuk kendaraaanya lebih berharga dari pada pemegang polis (extended) asuransi perpanjangan atau (premium).

4.02 Pengaruh Edukasi terhadap Customer life tiem value (CLV)

pelanggan terdididk (dengan gelar sarjana atau setara) lebih berharga dari pada yang lain.

4.03 Pengaruh status pekerjaan pada nilai waktu hidup pelanggan (CLV)

Pelanggan yang berkerja lebih berharga dari pada yang lain dibadingkan dengan pelanggan Pensiunan, pengangguaran, atau penyandang cacat.

4.04 Pengaruh gender terhadap nilai waktu hidup pelanggan ClV

Gender tidak memiliki peran dalam menentukan nilai pelanggan. baik pria maupun wanita terlihat berharga.

4.05 Pengaruh lokasi terhadap nilai waktu hidup pelanggan (CLV)

Pelanggan pendesaan Kurang berharga dari pada pelanggan Perkotaan

4.06 Pengaruh Status Perkwinan terhadap Nilai waktu hidup pelanggan

Pelanggan yang sudah menikah membeli lebih banyak asuransi mobil dan menambah nilai bagi persuhaan.

4.07 Pengaruh jenis polis terhadap customer life time value (clv)

Pelanggan yang memiliki Polis Pribadi lebih berharga bagi perusahaan dari pada pemengang Polis Korporasi dan Asuransai Khusus.

4.08 Pengaruah Jenis penawaran perpanjangan terhadap nilai umur pelanggan (CLV)

Penawaran 1 dan Penawaran 2 menarik lebih banyak customer

4.09 Pengaruh saluran penjualan pada nilai waktu hidup pelanggan (CLV)

Call center tidak berkinerja baik dibadingkan dengan saluran lain di seluruh negeri (dalam hal customer bernilai tinggi)

4.10 Pengaruh Kelas kendaraan terhadap nilai waktu umur pelanggan (CLV)

Pelanggan yang memiliki mobil empat pintu dan SUV lebih berharga

4.11 Pengaruh ukuran kendaraan terhadap nilai umur pelanggan (CLV)

Customer yang memiliki kendaraan ukuran Menegah menambah nilai lebih, bagi peruasahaan Asuransi

4.12 Pengaruh Negara pada nilai Waktu hidup pelanggan (CLV)

Pelanggan California lebih berharga

4.13 Penagaruh kebijakan terhadap nilai waktu hidup customer(CLV)

Kebijakan L3 Pribadi menambah nilai bagi peruasahaan

  1. Analisis Regresi dengan variabel kontinu

  2. Varibel Dependen CLV Kontinu dan telah melihat bahwa variabel independen sebagian besar tergantung secara linier dengan algoritma Regresi Linier adalah yang terbaik untuk jenis Data ini

  3. Tujuan dari Regresi Liner adalah untuk menemukan garis yang paling cocok yang dapat secara akurat memprediksi output untuk variabel dependen kontinu.

  4. Menghapus variabel kualitatif karena Regresi Linier bekerja paling baik ketika variabel berisifat Kuantitatif/Numerik. perusahaan hanya memiliki variabel independen kontinu.

str(dataContinous)
'data.frame':   9134 obs. of  8 variables:
 $ CustomerLifetimeValue     : num  2764 6980 12887 7646 2814 ...
 $ Income                    : int  56274 0 48767 0 43836 62902 55350 0 14072 28812 ...
 $ MonthlyPremiumAuto        : int  69 94 108 106 73 69 67 101 71 93 ...
 $ MonthsSinceLastClaim      : int  32 13 18 18 12 14 0 0 13 17 ...
 $ MonthsSincePolicyInception: int  5 42 38 65 44 94 13 68 3 7 ...
 $ NumberofOpenComplaints    : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumberofPolicies          : int  1 8 2 7 1 2 9 4 2 8 ...
 $ TotalClaimAmount          : num  385 1131 566 530 138 ...
dim(dataContinous)
[1] 9134    8

Berikut langkah-langkah yang diikuti untuk membagun model regresi : 1. pisahkan data dalam set pelatihan dan pengujian . 2. Traning dataset adalah untuk membagun model dan testing data set untuk menguji model pada data yang tidak berlabel. 3. Bagun model regresi linier mengguankan semua variabel independen berkelanjuatan. 4. Analisis siginifikansi variabekl independen dan jika perlu jalankan kembali model.

Memisahkan Data dalam set pelatihan dan pengujian.

Traning set adalah untuk membagun model dan testing set untuk menguji model pada data yang tidak berlabe.

print(trainIndex)
        Resample1
   [1,]         1
   [2,]         2
   [3,]         4
   [4,]         5
   [5,]         6
   [6,]         7
   [7,]         9
   [8,]        10
   [9,]        11
  [10,]        12
  [11,]        13
  [12,]        14
  [13,]        15
  [14,]        16
  [15,]        18
  [16,]        19
  [17,]        20
  [18,]        21
  [19,]        22
  [20,]        23
  [21,]        24
  [22,]        25
  [23,]        27
  [24,]        28
  [25,]        29
  [26,]        30
  [27,]        31
  [28,]        32
  [29,]        34
  [30,]        36
  [31,]        39
  [32,]        40
  [33,]        41
  [34,]        43
  [35,]        44
  [36,]        45
  [37,]        46
  [38,]        47
  [39,]        48
  [40,]        49
  [41,]        50
  [42,]        51
  [43,]        52
  [44,]        53
  [45,]        54
  [46,]        55
  [47,]        58
  [48,]        59
  [49,]        60
  [50,]        62
  [51,]        64
  [52,]        65
  [53,]        67
  [54,]        68
  [55,]        70
  [56,]        71
  [57,]        72
  [58,]        73
  [59,]        74
  [60,]        75
  [61,]        76
  [62,]        77
  [63,]        79
  [64,]        80
  [65,]        81
  [66,]        82
  [67,]        83
  [68,]        84
  [69,]        86
  [70,]        87
  [71,]        88
  [72,]        89
  [73,]        90
  [74,]        91
  [75,]        92
  [76,]        94
  [77,]        95
  [78,]        96
  [79,]        98
  [80,]       100
  [81,]       101
  [82,]       102
  [83,]       103
  [84,]       104
  [85,]       105
  [86,]       106
  [87,]       107
  [88,]       109
  [89,]       110
  [90,]       111
  [91,]       112
  [92,]       113
  [93,]       114
  [94,]       115
  [95,]       116
  [96,]       117
  [97,]       119
  [98,]       120
  [99,]       121
 [100,]       122
 [101,]       123
 [102,]       124
 [103,]       125
 [104,]       127
 [105,]       128
 [106,]       129
 [107,]       130
 [108,]       131
 [109,]       133
 [110,]       134
 [111,]       135
 [112,]       138
 [113,]       139
 [114,]       140
 [115,]       141
 [116,]       142
 [117,]       143
 [118,]       144
 [119,]       145
 [120,]       146
 [121,]       148
 [122,]       149
 [123,]       152
 [124,]       153
 [125,]       155
 [126,]       156
 [127,]       157
 [128,]       158
 [129,]       161
 [130,]       162
 [131,]       163
 [132,]       164
 [133,]       165
 [134,]       166
 [135,]       167
 [136,]       168
 [137,]       169
 [138,]       170
 [139,]       172
 [140,]       174
 [141,]       175
 [142,]       176
 [143,]       177
 [144,]       178
 [145,]       179
 [146,]       180
 [147,]       181
 [148,]       182
 [149,]       183
 [150,]       184
 [151,]       185
 [152,]       187
 [153,]       188
 [154,]       190
 [155,]       191
 [156,]       192
 [157,]       193
 [158,]       194
 [159,]       195
 [160,]       196
 [161,]       197
 [162,]       199
 [163,]       200
 [164,]       202
 [165,]       207
 [166,]       208
 [167,]       210
 [168,]       211
 [169,]       212
 [170,]       214
 [171,]       217
 [172,]       218
 [173,]       219
 [174,]       220
 [175,]       222
 [176,]       224
 [177,]       227
 [178,]       228
 [179,]       229
 [180,]       230
 [181,]       232
 [182,]       233
 [183,]       234
 [184,]       235
 [185,]       236
 [186,]       237
 [187,]       239
 [188,]       241
 [189,]       242
 [190,]       243
 [191,]       244
 [192,]       245
 [193,]       246
 [194,]       247
 [195,]       248
 [196,]       249
 [197,]       251
 [198,]       252
 [199,]       254
 [200,]       255
 [201,]       256
 [202,]       257
 [203,]       258
 [204,]       259
 [205,]       260
 [206,]       261
 [207,]       262
 [208,]       264
 [209,]       265
 [210,]       267
 [211,]       268
 [212,]       270
 [213,]       271
 [214,]       272
 [215,]       273
 [216,]       274
 [217,]       275
 [218,]       276
 [219,]       277
 [220,]       279
 [221,]       280
 [222,]       281
 [223,]       282
 [224,]       283
 [225,]       284
 [226,]       285
 [227,]       287
 [228,]       288
 [229,]       289
 [230,]       291
 [231,]       292
 [232,]       294
 [233,]       295
 [234,]       296
 [235,]       297
 [236,]       298
 [237,]       300
 [238,]       301
 [239,]       302
 [240,]       303
 [241,]       304
 [242,]       305
 [243,]       306
 [244,]       307
 [245,]       308
 [246,]       309
 [247,]       310
 [248,]       311
 [249,]       312
 [250,]       313
 [251,]       314
 [252,]       316
 [253,]       317
 [254,]       318
 [255,]       319
 [256,]       320
 [257,]       321
 [258,]       323
 [259,]       325
 [260,]       326
 [261,]       327
 [262,]       328
 [263,]       329
 [264,]       330
 [265,]       332
 [266,]       333
 [267,]       334
 [268,]       337
 [269,]       338
 [270,]       341
 [271,]       342
 [272,]       344
 [273,]       345
 [274,]       346
 [275,]       348
 [276,]       349
 [277,]       352
 [278,]       353
 [279,]       354
 [280,]       355
 [281,]       356
 [282,]       357
 [283,]       358
 [284,]       359
 [285,]       360
 [286,]       362
 [287,]       364
 [288,]       365
 [289,]       366
 [290,]       367
 [291,]       368
 [292,]       369
 [293,]       370
 [294,]       371
 [295,]       372
 [296,]       373
 [297,]       374
 [298,]       375
 [299,]       378
 [300,]       381
 [301,]       382
 [302,]       383
 [303,]       385
 [304,]       389
 [305,]       390
 [306,]       391
 [307,]       392
 [308,]       393
 [309,]       394
 [310,]       395
 [311,]       397
 [312,]       398
 [313,]       399
 [314,]       400
 [315,]       405
 [316,]       406
 [317,]       407
 [318,]       409
 [319,]       410
 [320,]       412
 [321,]       413
 [322,]       415
 [323,]       416
 [324,]       417
 [325,]       419
 [326,]       420
 [327,]       421
 [328,]       423
 [329,]       424
 [330,]       425
 [331,]       426
 [332,]       429
 [333,]       430
 [334,]       431
 [335,]       433
 [336,]       435
 [337,]       436
 [338,]       438
 [339,]       439
 [340,]       440
 [341,]       441
 [342,]       446
 [343,]       447
 [344,]       450
 [345,]       451
 [346,]       452
 [347,]       453
 [348,]       454
 [349,]       455
 [350,]       456
 [351,]       457
 [352,]       458
 [353,]       459
 [354,]       460
 [355,]       461
 [356,]       462
 [357,]       463
 [358,]       464
 [359,]       465
 [360,]       467
 [361,]       468
 [362,]       469
 [363,]       470
 [364,]       471
 [365,]       472
 [366,]       474
 [367,]       475
 [368,]       476
 [369,]       477
 [370,]       479
 [371,]       480
 [372,]       481
 [373,]       482
 [374,]       484
 [375,]       485
 [376,]       486
 [377,]       487
 [378,]       488
 [379,]       489
 [380,]       490
 [381,]       491
 [382,]       493
 [383,]       494
 [384,]       495
 [385,]       496
 [386,]       497
 [387,]       498
 [388,]       499
 [389,]       500
 [390,]       502
 [391,]       504
 [392,]       505
 [393,]       506
 [394,]       508
 [395,]       509
 [396,]       511
 [397,]       514
 [398,]       515
 [399,]       516
 [400,]       517
 [401,]       520
 [402,]       521
 [403,]       522
 [404,]       523
 [405,]       525
 [406,]       526
 [407,]       529
 [408,]       530
 [409,]       533
 [410,]       534
 [411,]       536
 [412,]       537
 [413,]       539
 [414,]       540
 [415,]       541
 [416,]       543
 [417,]       544
 [418,]       545
 [419,]       546
 [420,]       547
 [421,]       548
 [422,]       549
 [423,]       550
 [424,]       551
 [425,]       552
 [426,]       554
 [427,]       555
 [428,]       556
 [429,]       558
 [430,]       559
 [431,]       561
 [432,]       562
 [433,]       563
 [434,]       564
 [435,]       565
 [436,]       566
 [437,]       567
 [438,]       568
 [439,]       569
 [440,]       570
 [441,]       571
 [442,]       572
 [443,]       573
 [444,]       574
 [445,]       575
 [446,]       576
 [447,]       577
 [448,]       578
 [449,]       579
 [450,]       581
 [451,]       583
 [452,]       584
 [453,]       586
 [454,]       587
 [455,]       588
 [456,]       589
 [457,]       592
 [458,]       593
 [459,]       594
 [460,]       595
 [461,]       596
 [462,]       597
 [463,]       599
 [464,]       600
 [465,]       601
 [466,]       602
 [467,]       603
 [468,]       604
 [469,]       605
 [470,]       606
 [471,]       608
 [472,]       611
 [473,]       613
 [474,]       614
 [475,]       615
 [476,]       616
 [477,]       617
 [478,]       618
 [479,]       619
 [480,]       620
 [481,]       621
 [482,]       622
 [483,]       623
 [484,]       624
 [485,]       625
 [486,]       626
 [487,]       627
 [488,]       628
 [489,]       630
 [490,]       631
 [491,]       634
 [492,]       635
 [493,]       636
 [494,]       641
 [495,]       642
 [496,]       643
 [497,]       644
 [498,]       646
 [499,]       647
 [500,]       648
 [501,]       649
 [502,]       650
 [503,]       651
 [504,]       652
 [505,]       653
 [506,]       654
 [507,]       655
 [508,]       657
 [509,]       658
 [510,]       659
 [511,]       660
 [512,]       661
 [513,]       662
 [514,]       663
 [515,]       665
 [516,]       666
 [517,]       667
 [518,]       668
 [519,]       669
 [520,]       670
 [521,]       671
 [522,]       672
 [523,]       673
 [524,]       677
 [525,]       678
 [526,]       679
 [527,]       680
 [528,]       682
 [529,]       683
 [530,]       684
 [531,]       686
 [532,]       690
 [533,]       692
 [534,]       693
 [535,]       694
 [536,]       695
 [537,]       696
 [538,]       697
 [539,]       698
 [540,]       699
 [541,]       700
 [542,]       701
 [543,]       702
 [544,]       703
 [545,]       704
 [546,]       705
 [547,]       706
 [548,]       707
 [549,]       708
 [550,]       709
 [551,]       710
 [552,]       712
 [553,]       713
 [554,]       714
 [555,]       716
 [556,]       717
 [557,]       718
 [558,]       719
 [559,]       720
 [560,]       721
 [561,]       722
 [562,]       723
 [563,]       724
 [564,]       725
 [565,]       726
 [566,]       727
 [567,]       728
 [568,]       729
 [569,]       730
 [570,]       732
 [571,]       735
 [572,]       736
 [573,]       737
 [574,]       738
 [575,]       739
 [576,]       740
 [577,]       741
 [578,]       742
 [579,]       743
 [580,]       744
 [581,]       745
 [582,]       746
 [583,]       747
 [584,]       748
 [585,]       749
 [586,]       750
 [587,]       751
 [588,]       753
 [589,]       754
 [590,]       756
 [591,]       757
 [592,]       758
 [593,]       759
 [594,]       760
 [595,]       761
 [596,]       762
 [597,]       763
 [598,]       764
 [599,]       766
 [600,]       767
 [601,]       768
 [602,]       769
 [603,]       770
 [604,]       771
 [605,]       772
 [606,]       773
 [607,]       775
 [608,]       776
 [609,]       778
 [610,]       779
 [611,]       780
 [612,]       782
 [613,]       784
 [614,]       785
 [615,]       787
 [616,]       788
 [617,]       789
 [618,]       790
 [619,]       791
 [620,]       792
 [621,]       793
 [622,]       794
 [623,]       795
 [624,]       796
 [625,]       798
 [626,]       799
 [627,]       800
 [628,]       802
 [629,]       805
 [630,]       806
 [631,]       807
 [632,]       808
 [633,]       809
 [634,]       812
 [635,]       813
 [636,]       815
 [637,]       816
 [638,]       817
 [639,]       819
 [640,]       820
 [641,]       821
 [642,]       822
 [643,]       823
 [644,]       824
 [645,]       826
 [646,]       829
 [647,]       830
 [648,]       831
 [649,]       832
 [650,]       833
 [651,]       834
 [652,]       835
 [653,]       836
 [654,]       838
 [655,]       839
 [656,]       840
 [657,]       841
 [658,]       842
 [659,]       843
 [660,]       844
 [661,]       845
 [662,]       846
 [663,]       847
 [664,]       848
 [665,]       849
 [666,]       850
 [667,]       851
 [668,]       852
 [669,]       853
 [670,]       854
 [671,]       855
 [672,]       857
 [673,]       859
 [674,]       860
 [675,]       861
 [676,]       862
 [677,]       863
 [678,]       864
 [679,]       865
 [680,]       866
 [681,]       867
 [682,]       869
 [683,]       870
 [684,]       871
 [685,]       872
 [686,]       873
 [687,]       874
 [688,]       875
 [689,]       876
 [690,]       877
 [691,]       878
 [692,]       880
 [693,]       881
 [694,]       882
 [695,]       883
 [696,]       884
 [697,]       885
 [698,]       886
 [699,]       887
 [700,]       888
 [701,]       889
 [702,]       890
 [703,]       891
 [704,]       893
 [705,]       894
 [706,]       895
 [707,]       896
 [708,]       897
 [709,]       898
 [710,]       899
 [711,]       902
 [712,]       903
 [713,]       904
 [714,]       905
 [715,]       907
 [716,]       908
 [717,]       909
 [718,]       910
 [719,]       911
 [720,]       912
 [721,]       914
 [722,]       915
 [723,]       916
 [724,]       918
 [725,]       920
 [726,]       921
 [727,]       922
 [728,]       924
 [729,]       925
 [730,]       926
 [731,]       927
 [732,]       929
 [733,]       931
 [734,]       933
 [735,]       934
 [736,]       935
 [737,]       936
 [738,]       937
 [739,]       940
 [740,]       941
 [741,]       942
 [742,]       943
 [743,]       944
 [744,]       945
 [745,]       946
 [746,]       948
 [747,]       950
 [748,]       951
 [749,]       952
 [750,]       953
 [751,]       955
 [752,]       956
 [753,]       957
 [754,]       959
 [755,]       960
 [756,]       962
 [757,]       963
 [758,]       965
 [759,]       966
 [760,]       967
 [761,]       968
 [762,]       969
 [763,]       970
 [764,]       973
 [765,]       974
 [766,]       975
 [767,]       977
 [768,]       979
 [769,]       981
 [770,]       982
 [771,]       983
 [772,]       985
 [773,]       987
 [774,]       989
 [775,]       991
 [776,]       992
 [777,]       993
 [778,]       997
 [779,]       998
 [780,]      1000
 [781,]      1001
 [782,]      1002
 [783,]      1003
 [784,]      1004
 [785,]      1005
 [786,]      1006
 [787,]      1007
 [788,]      1008
 [789,]      1009
 [790,]      1010
 [791,]      1011
 [792,]      1012
 [793,]      1013
 [794,]      1015
 [795,]      1016
 [796,]      1017
 [797,]      1019
 [798,]      1020
 [799,]      1021
 [800,]      1022
 [801,]      1024
 [802,]      1025
 [803,]      1026
 [804,]      1027
 [805,]      1028
 [806,]      1029
 [807,]      1031
 [808,]      1032
 [809,]      1033
 [810,]      1035
 [811,]      1036
 [812,]      1037
 [813,]      1038
 [814,]      1039
 [815,]      1043
 [816,]      1044
 [817,]      1045
 [818,]      1046
 [819,]      1048
 [820,]      1049
 [821,]      1050
 [822,]      1051
 [823,]      1052
 [824,]      1053
 [825,]      1055
 [826,]      1056
 [827,]      1057
 [828,]      1058
 [829,]      1060
 [830,]      1061
 [831,]      1062
 [832,]      1063
 [833,]      1064
 [834,]      1065
 [835,]      1066
 [836,]      1068
 [837,]      1069
 [838,]      1070
 [839,]      1071
 [840,]      1073
 [841,]      1074
 [842,]      1075
 [843,]      1076
 [844,]      1080
 [845,]      1082
 [846,]      1083
 [847,]      1085
 [848,]      1086
 [849,]      1087
 [850,]      1088
 [851,]      1089
 [852,]      1090
 [853,]      1091
 [854,]      1092
 [855,]      1093
 [856,]      1094
 [857,]      1095
 [858,]      1096
 [859,]      1097
 [860,]      1099
 [861,]      1100
 [862,]      1101
 [863,]      1102
 [864,]      1103
 [865,]      1104
 [866,]      1105
 [867,]      1106
 [868,]      1109
 [869,]      1110
 [870,]      1111
 [871,]      1112
 [872,]      1114
 [873,]      1115
 [874,]      1117
 [875,]      1119
 [876,]      1120
 [877,]      1121
 [878,]      1122
 [879,]      1123
 [880,]      1124
 [881,]      1125
 [882,]      1126
 [883,]      1127
 [884,]      1128
 [885,]      1129
 [886,]      1130
 [887,]      1131
 [888,]      1132
 [889,]      1133
 [890,]      1134
 [891,]      1135
 [892,]      1138
 [893,]      1139
 [894,]      1141
 [895,]      1142
 [896,]      1143
 [897,]      1145
 [898,]      1146
 [899,]      1147
 [900,]      1148
 [901,]      1149
 [902,]      1150
 [903,]      1151
 [904,]      1152
 [905,]      1153
 [906,]      1154
 [907,]      1155
 [908,]      1156
 [909,]      1157
 [910,]      1159
 [911,]      1160
 [912,]      1161
 [913,]      1162
 [914,]      1163
 [915,]      1165
 [916,]      1166
 [917,]      1167
 [918,]      1168
 [919,]      1169
 [920,]      1170
 [921,]      1171
 [922,]      1173
 [923,]      1174
 [924,]      1175
 [925,]      1176
 [926,]      1178
 [927,]      1179
 [928,]      1180
 [929,]      1181
 [930,]      1183
 [931,]      1185
 [932,]      1186
 [933,]      1187
 [934,]      1188
 [935,]      1189
 [936,]      1190
 [937,]      1191
 [938,]      1192
 [939,]      1193
 [940,]      1194
 [941,]      1195
 [942,]      1197
 [943,]      1198
 [944,]      1199
 [945,]      1201
 [946,]      1202
 [947,]      1203
 [948,]      1205
 [949,]      1206
 [950,]      1207
 [951,]      1209
 [952,]      1210
 [953,]      1211
 [954,]      1212
 [955,]      1213
 [956,]      1215
 [957,]      1216
 [958,]      1217
 [959,]      1218
 [960,]      1219
 [961,]      1220
 [962,]      1221
 [963,]      1222
 [964,]      1224
 [965,]      1226
 [966,]      1227
 [967,]      1228
 [968,]      1229
 [969,]      1230
 [970,]      1231
 [971,]      1232
 [972,]      1233
 [973,]      1234
 [974,]      1236
 [975,]      1237
 [976,]      1238
 [977,]      1239
 [978,]      1240
 [979,]      1241
 [980,]      1243
 [981,]      1244
 [982,]      1245
 [983,]      1246
 [984,]      1247
 [985,]      1248
 [986,]      1249
 [987,]      1250
 [988,]      1251
 [989,]      1252
 [990,]      1253
 [991,]      1255
 [992,]      1256
 [993,]      1257
 [994,]      1258
 [995,]      1261
 [996,]      1262
 [997,]      1263
 [998,]      1264
 [999,]      1265
[1000,]      1266
 [ reached getOption("max.print") -- omitted 6310 rows ]
dim(dataContinous)
[1] 9134    8
dim(insurncTrain)
[1] 7310    8
dim(insurncTest)
[1] 1824    8

Lineir Regression

summary(fit)

Call:
lm(formula = insurncTrain$CustomerLifetimeValue ~ ., data = insurncTrain)

Residuals:
   Min     1Q Median     3Q    Max 
-12147  -3414  -1151   1091  64423 

Coefficients:
                             Estimate Std. Error t value Pr(>|t|)
(Intercept)                 4.105e+02  3.068e+02   1.338  0.18093
Income                      3.902e-03  2.704e-03   1.443  0.14898
MonthlyPremiumAuto          8.139e+01  2.901e+00  28.055  < 2e-16
MonthsSinceLastClaim        1.534e+00  7.370e+00   0.208  0.83510
MonthsSincePolicyInception  1.927e-01  2.657e+00   0.073  0.94218
NumberofOpenComplaints     -2.428e+02  8.118e+01  -2.991  0.00279
NumberofPolicies            7.534e+01  3.081e+01   2.445  0.01450
TotalClaimAmount           -6.786e-01  3.651e-01  -1.858  0.06315
                              
(Intercept)                   
Income                        
MonthlyPremiumAuto         ***
MonthsSinceLastClaim          
MonthsSincePolicyInception    
NumberofOpenComplaints     ** 
NumberofPolicies           *  
TotalClaimAmount           .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6315 on 7302 degrees of freedom
Multiple R-squared:  0.154, Adjusted R-squared:  0.1532 
F-statistic: 189.9 on 7 and 7302 DF,  p-value: < 2.2e-16

5.1.1 Model Interpretasi

Hipostesis NULL - tidak aada varaiabel independen yang signifikan untuk CLV.

Hipotesis Alternatif - Setidaknya salah satu variabel independen signigikan dan dapat mempengaruhi CLV.

  1. p-value model lebih kecil dari 0,05, sehingga paling tidak salah satu variabel independen signifikan.

  2. p-value dari MonthlyPremiumAuto, NumberofOpenComplaints dan NumberoPoliceies Kurang dari 0,05 sehingga menolak hipotesis nol sehingga paling tidak salah satu dati variabel bebeas tersebut signifikan dan dapat mempengaruhi CLV.

  3. Namun R kuadrat sangat rendah, hanya 15,04% varians yang ditemukan di CLV yang dapat dijelaskan oleh Pendapatan, MPA, Bulan, sejak klaim terkahir , bulan sejak awal kebijakan, jumlah keluhan terbuka, jumlah kebijakan, TCA.

  4. Disesuaikan R kuadrat adalalh 0,1532 yang lebih kecil dari R kuadart.

  5. Kesalahan standart residual adalah 6315 yang sangat tinggi, sehingga clv yang sebenarya akan menyimpang dari garis regresi sebenarnya dengan rata-rata 6315. semakin kecil kesalahan standart, semakin sedikit penyebaran dan semakin besar kemungkinan rata-rata sampel mendekati rata-rata sampel. Dengan hal demikian kesalahan standar kecil adalah Hal yang baik.

  6. Kesenjangan antara R-kuadrat dan disesuaikan R-kuadrat hanya 1,5 % itu bagus. bisanya semakin banyak variabel tidak signifikan yang anda tambahkan ke dalam model, kesenjangan antara dua meningkat.

  7. F-statistik : 6,958 - Semakin rendah F-statistik, semakin mendekati model yang tidak signfikan. Jadi F-statistik rendah berarti model tidak terlalu signifikan.

5.1.2 Jalankan Ulang Model

Ada lebih dari satu variabel tidak signifikan dalam model, sehingga perlu menjalankan model lagi dengan hanya variabel signifikan.

summary(new_fit)

Call:
lm(formula = insurncTrain$CustomerLifetimeValue ~ MonthlyPremiumAuto + 
    NumberofOpenComplaints + NumberofPolicies + TotalClaimAmount, 
    data = insurncTrain)

Residuals:
   Min     1Q Median     3Q    Max 
-12234  -3399  -1160    975  64529 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)             582.8902   237.0544   2.459  0.01396 *  
MonthlyPremiumAuto       82.5687     2.7839  29.659  < 2e-16 ***
NumberofOpenComplaints -243.3489    81.1708  -2.998  0.00273 ** 
NumberofPolicies         75.0238    30.8056   2.435  0.01490 *  
TotalClaimAmount         -0.9108     0.3275  -2.781  0.00543 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6315 on 7305 degrees of freedom
Multiple R-squared:  0.1538,    Adjusted R-squared:  0.1533 
F-statistic: 331.9 on 4 and 7305 DF,  p-value: < 2.2e-16

Persamaan garis Regresi yang diperkirakan dapat ditulis sebagai berikut :

CLV = 582,9 + 82,6 MPA - 243,4 noOC + 75,0 NoP - 0,9 TCA

Hipotesis Null - tidak ada variabel independen yang signifkan untuk CLV.

Hipotesis Alternatif - setidaknya salah satu variabel independen signifikan dan dapat mempengaruhi CLV.

  1. p-value dari MonthlyPremiumAuto, NumberofOpenComplaints, NumberofPolicies dan TotalClaimAmount kurang daru 0,05 sehingga berdampak signifikan terhadap signifikan terhadap CLV.

  2. koefisien Variabel Independen :-

i.Saya, premium BulananOtomasis: 86.4478. Peningkatan satu unit di Montly PremiumAotu akan meningkatkan CLV sebesar 86,4478

ii.Jumlah keluahan Terbuka : -199.3526, Peningkatan satu unit dalam NumberofOpenComplaints akan menurunkan CLV sebesar 199,3526

  1. Jumlah kebijakan :76.3861. Peningkatan satu unit dalam NumberofPolicies akan meningkatkan CLV sebesar 76,3861.

iV. TotalClaimAmount : -1,0445. satu unit peningkatan TotalClaimAmount akan berkurang 1,0445.

  1. sehingga nasabah dengan jumlah polis yang lebih banyak dengan premi bulanan yang tinggi akan menambah nilai lebih bagi perusahan.

  2. disisi lain , pengaduan terbuka customersdan jumlah klaim lebih banyak akan menurunkan CLV.

  3. R kuadrat sebesar 0,1656 yang berarti 16,56% variabel terikat dijelaskan oleh variabel bebas.

  4. disesuaikan R kuadrat adalah 0,1652 yang kurang dari R kuadrat.

Prediksi nilai CLV untuk semua observasi berdasarkan model regresi terhitung diatas.

#print predicted CLV.
print(predictedCLV[1:10])
       1        2        4        5        6        7        9 
6004.673 7914.017 9377.729 6559.620 6285.013 6497.298 6129.721 
      10       11       12 
8474.403 5900.701 9409.622 
#print actual CLV to compare it with above calculated predicted CLV.
print(insurncTrain$CustomerLifetimeValue[1:10])
 [1]  2763.519  6979.536  7645.862  2813.693  8256.298  5380.899
 [7] 24127.504  7388.178  4738.992  8197.197

Hitung kesalahan : Perbedaan antara CLV aktual dan CLV yang diprediksi.

print(residualsCLV[1:10])
         1          2          4          5          6          7 
-3241.1534  -934.4806 -1731.8671 -3745.9270  1971.2852 -1116.3989 
         9         10         11         12 
17997.7830 -1086.2253 -1161.7087 -1212.4247 

Vaidasi model pada dataset uji

print(predicatedTestData[1:10])
       3        8       17       26       33       35       37 
9134.421 8891.780 5776.296 6398.443 5894.267 6288.278 9881.976 
      38       42       56 
8299.000 6503.058 7923.880 

Perbadingan antara hasil aktual dan prediksi

Menghitung tingkat kesalahan atau MAPE

print(ErrorRate[1:10])
 [1] 117.28355  13.38886  22.65104 133.13206  23.87614  20.74744
 [7]  74.59447  14.70221  24.51383  14.79072

Menghitung rata-rata tingkat kesalahan

mean(InsuranceTrainData$ErrorRate, na.rm = TRUE)
[1] 60.43577

Rata-rata tingkat kesalahan model adalah 60,43% yang tinggi dan dapat mengatakan bahwa model tidak begitu baik.

#5.2 Analisis Residu

Periksa normalitas error/residual term (regresi linier mengasumsikan bahwa error terdistribusi normal.)

Hipotesis Null - Kesalahan terdistribusi normal.

Alt Hypothese - kesalahan tidak terdistribusi secara normal.

shapiro.test(residualsCLV[0:5000])

    Shapiro-Wilk normality test

data:  residualsCLV[0:5000]
W = 0.72712, p-value < 2.2e-16

p-value (0,00837) < 0,05, hipotesis null ditolak. sehingga kesalahan tidak terdistribusi normal.

Residual vs Fitted Plot

  1. Pengujian asumsi analisis regresi linier

Mendeteksi multikolinearitas- memeriksa korelasi antara variabel independen.

Dalam model hanay variabel independen yang harus ada yang tidadk berkorelasi satu sama lain. ini dilakukan dengan mengguanakan Matriks Korelasi.

cor(InsuranceTrainData) 
                           CustomerLifetimeValue       Income
CustomerLifetimeValue                1.000000000  0.017042971
Income                               0.017042971  1.000000000
MonthlyPremiumAuto                   0.388818334 -0.025274778
MonthsSinceLastClaim                 0.004029211 -0.034218309
MonthsSincePolicyInception           0.013049358  0.003722028
NumberofOpenComplaints              -0.037262886 -0.001833022
NumberofPolicies                     0.019765634 -0.010748363
TotalClaimAmount                     0.224206556 -0.357054382
predictedCLV                         0.392143821  0.008078440
residualsCLV                         0.919903921  0.015083162
ErrorRate                           -0.268667182 -0.066312890
                           MonthlyPremiumAuto MonthsSinceLastClaim
CustomerLifetimeValue            3.888183e-01          0.004029211
Income                          -2.527478e-02         -0.034218309
MonthlyPremiumAuto               1.000000e+00          0.006807046
MonthsSinceLastClaim             6.807046e-03          1.000000000
MonthsSincePolicyInception       3.080209e-02         -0.035410807
NumberofOpenComplaints          -1.353802e-02          0.010292630
NumberofPolicies                -1.589350e-02          0.016469080
TotalClaimAmount                 6.353086e-01          0.016286611
predictedCLV                     9.915197e-01          0.005820589
residualsCLV                     7.115007e-17          0.001898788
ErrorRate                       -3.022144e-02         -0.010800626
                           MonthsSincePolicyInception
CustomerLifetimeValue                    0.0130493583
Income                                   0.0037220278
MonthlyPremiumAuto                       0.0308020895
MonthsSinceLastClaim                    -0.0354108069
MonthsSincePolicyInception               1.0000000000
NumberofOpenComplaints                  -0.0015127524
NumberofPolicies                        -0.0067767897
TotalClaimAmount                         0.0048827332
predictedCLV                             0.0316623551
residualsCLV                             0.0006882908
ErrorRate                                0.0021461456
                           NumberofOpenComplaints NumberofPolicies
CustomerLifetimeValue               -3.726289e-02     1.976563e-02
Income                              -1.833022e-03    -1.074836e-02
MonthlyPremiumAuto                  -1.353802e-02    -1.589350e-02
MonthsSinceLastClaim                 1.029263e-02     1.646908e-02
MonthsSincePolicyInception          -1.512752e-03    -6.776790e-03
NumberofOpenComplaints               1.000000e+00     2.435735e-03
NumberofPolicies                     2.435735e-03     1.000000e+00
TotalClaimAmount                    -1.396386e-02    -5.132976e-03
predictedCLV                        -9.502352e-02     5.040404e-02
residualsCLV                         1.066747e-17     5.997015e-16
ErrorRate                           -2.816009e-02    -6.647980e-01
                           TotalClaimAmount  predictedCLV
CustomerLifetimeValue          2.242066e-01  3.921438e-01
Income                        -3.570544e-01  8.078440e-03
MonthlyPremiumAuto             6.353086e-01  9.915197e-01
MonthsSinceLastClaim           1.628661e-02  5.820589e-03
MonthsSincePolicyInception     4.882733e-03  3.166236e-02
NumberofOpenComplaints        -1.396386e-02 -9.502352e-02
NumberofPolicies              -5.132976e-03  5.040404e-02
TotalClaimAmount               1.000000e+00  5.717457e-01
predictedCLV                   5.717457e-01  1.000000e+00
residualsCLV                  -8.858221e-17  1.167018e-16
ErrorRate                     -7.090799e-03 -7.328688e-02
                            residualsCLV    ErrorRate
CustomerLifetimeValue       9.199039e-01 -0.268667182
Income                      1.508316e-02 -0.066312890
MonthlyPremiumAuto          7.115007e-17 -0.030221436
MonthsSinceLastClaim        1.898788e-03 -0.010800626
MonthsSincePolicyInception  6.882908e-04  0.002146146
NumberofOpenComplaints      1.066747e-17 -0.028160091
NumberofPolicies            5.997015e-16 -0.664798031
TotalClaimAmount           -8.858221e-17 -0.007090799
predictedCLV                1.167018e-16 -0.073286884
residualsCLV                1.000000e+00 -0.260818742
ErrorRate                  -2.608187e-01  1.000000000
# Variance Inflation Factors
car::vif(new_fit)
    MonthlyPremiumAuto NumberofOpenComplaints       NumberofPolicies 
              1.677284               1.000237               1.000299 
      TotalClaimAmount 
              1.676925 

Variance inflation factor (VIF adalah ukuran besarnya multikolinearitas dalam sekumpulan variabel regresi berganda.

jika terdapat korelasi yang tinggi antara dua variabel bebas(multikolinearitas tinggi), maka saya tidak akan dapat memisakahkan pengaruh masing-masing variabel bebas terhadap variabel terikat.

Karena multikolinearitas, saya tidak dapat mendefiniskan dampak lengkap dari hanya satu variabel bebas pada variabel terikat.

  1. Mendeteksi Homoskedastisitas- varians untuk semua pengamatan tidak sama.

Hipotesis Null - Homoscedasticity hadir di Residuals

Hipotesis alternatif - Heteroskedastistas hadir dalam residual

ini dilakukan dengan tes Breusch-Pagan.

bptest(new_fit)

p-value < 0,05, sehingga menolak bahwa kesalahan adalah homoskedastistas. jadi istilah error bersifat heteroskedastistas dan tidak memiliki varians konstan yang tidak baik untuk model.

  1. mendeteksi autokorelasi - memeriksa autokorelasi (memeriksa korelasi antar kesalahan)

Hal ini dilakauka Uji Durbin-watson jika-D-W Stastic sekitar 2, maka memiliki autokorelasi dalam model. dan menjau dari 2 berarti tidak ada autokeralasi.

dwt(new_fit)
 lag Autocorrelation D-W Statistic p-value
   1    -0.009401311      2.018765   0.446
 Alternative hypothesis: rho != 0

Disini D-W stastistic adalah 2.018765, sehingga terdapat autokorelasi pada model.

  1. mendeteksi MAPE- Rata-rata persentasi rugi kesalahan absolut

MAPE menghitung perbedaan persen absolut rata-rata antara dua vektor numerik

print(ErrorRate)
[1] 60.43577

rata-rata tingkat kesalahan model adalah 60,43 % yang tinggi dan dapat mengakatan bahwa mode tidak begitu baik

  1. Kurva Prediksi

Garis biru menunjukkan garis regresi dan sepatu titik merah pangamatan yang sebenarnya menyimpang dari garis regresi.

  1. Kurva Prediksi dengan MonthlyPremiumAuto
ggplot(InsuranceTrainData, aes(x = MonthlyPremiumAuto, y = CustomerLifetimeValue)) +
  geom_smooth(method = "lm", se = FALSE, color = "red") +     
  geom_segment(aes(xend = MonthlyPremiumAuto, yend = predictedCLV), alpha = .2) +    
  geom_point(aes(color = abs(residualsCLV), size = abs(residualsCLV))) + 
  scale_color_continuous(low = "green", high = "red") +             
  guides(color = FALSE, size = FALSE) +                              
  geom_point(aes(y = predictedCLV), shape = 1) +
  theme_bw()
Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
`geom_smooth()` using formula 'y ~ x'

ggplot(InsuranceTrainData,aes(x=MonthlyPremiumAuto,y=CustomerLifetimeValue))+
  geom_point(color="red")+
  stat_smooth(method="lm")+
  scale_x_continuous(name="Monthly Premium")+
  scale_y_continuous(name="Prediction of CLV")+
  ggtitle("Prediction Curve with Monthly Premium")
`geom_smooth()` using formula 'y ~ x'

  1. Kurva prediksi dengan TotalClaimAmount
ggplot(InsuranceTrainData,aes(x=TotalClaimAmount,y=CustomerLifetimeValue))+
  geom_point(color="red")+
  stat_smooth(method="lm")+
  scale_x_continuous(name="Total Claim Amount")+
  scale_y_continuous(name="Prediction of CLV")+
  ggtitle("Prediction Curve with Total Claim Amount")
`geom_smooth()` using formula 'y ~ x'

8 Ringkasan

  1. ada banyak pelanggan dengan CLV rendah, sangat sedikit pelanggan dengan CLV tinggi.

  2. Pelanggan yang telah mengambil asuransi dasar untuk kendaraanay lebih berharga dari pada pemegang polis asuranasi perpanjangan atau premi.

  3. Pelanggan perkerja terdidik (dengan gelar sarjana atau setara) lebih berhargar dari pada pelanggan pensiunan, penggaanguran, atau penyadang cacat.

  4. Gender tidak memiliki peran dalam menentukan nilai pelanggan. baik pria maupun wanita terlihat berharga.

  5. pelanggan perkawinan membeli lebih banyak asuaransi mobil dan menambah nilai lebih bagi persuhaan.

  6. Pelanggan pedesaan Kurang berharga dari pada pelanggan perkotaan.

  7. Nasabah yang memiliki polis pribadi lebih berharga bagi persuhaan dari pada pemegang polis korporasi dan asuransi khusus.

  8. Penawaran 1 dan penawaran 2 menarik lebih banyak pelanggan, call center tidak berkinerja baik dibadingkan dengan saluran lain di selurh negeri (dalam hal pelanggan bernilai tinggi).

  9. Call center tidak berkinerja baik dibadingkan dengan saluran lain di seluruh negeri (dalam hal pelanggan bernilai tinggi)

  10. Pelanggan yang memiliki kendaraan ukuran menengah, mobil empat pintu atau SUV lebih berharga.

  11. pelanggan california menamabh nilai lebih bagi perusahaan.

  12. kebijakan L3 pribadi menambah niali lebih bagi perusahaan.xii.

  13. pelanggan yang memiliki lebih banyak polis dengan premi bulanan yang tinggi akan menambah nilai lebih bagi perusahaan. Di sisi lain, pengaduan terbuka pelanggan dan jumlah klaim lebih banyak akan menurunkan CLV.

  14. Rekomedasi Bisnis

laporan ini mewakili analisi saya untuk persuhaan asuaransi xyz. menurut pendapat saya berdasarkan data yang diberikan, menargetkan pelanggan yang tepat dapat meningkatkan Nilai Seumur Hidup Pelanggan. Dua perubahan yang diusulakan adalah sebagai berikut:

  1. Perusahaan asuransi harus menargetkan pelanggan berpendidikan menikah bekerja dari daearah perkotaan yang memiliki kendaraan Mid Size untuk meningkatkan Customer LifetimeValue(CLV) Meningkat.

  2. Sebaik nya jika open complaints pelanggan tidak segeera diselasaikan dan jumlah klaim tidak berkurang, maka keduanya dapat menurunkan customer lifetimevalue (CLV)

  3. sekitar 38% nilai ditambahkan oleh agen ke perusahaan sedangkan call center hanya menamabhakan nilai 20 % . jadi agen harus lebih disukai dari pada pusat panggilan saat menjual asuransi mobil kepada pelanggan.

  4. Faktor-faktor yang menyebabkan peningkatan CLV adalah Premi bulanan dan jumlah Polis, namun pengaduan terbuka dan jumlah klaim dapat menurunkan CLV

LS0tDQp0aXRsZTogIk1FTkdBTkFMSVNJUyBEQVRBIFBFTEFOR0dBTiBTRVVNVVIgSElEVVAgQVNVUkFOU0kgTU9CSUwiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpKQU1BTExVRElODQoNCjA2IERFU0VNQkVSIDIwMjENCg0KDQoxLiBPYmpla3RpZiANCg0KMi4gUGVtYWhhbWFuIERhdGENCg0KMy4gQW5hbGlzaXMgRGF0YSBla3NwbG9yYXNpIChFREEpDQoNCiAgQS4gQW5hbGlzYSBEZXNrcmlwdGlmIGN1c3RvbWVybGlmZXRpbWV2YWx1ZQ0KICANCiAgQi4gQW5hbGlzYSBEZXNrcmlwdGlmIE1vbnRobHkgUHJlbWl1bSBBb3V0dSAoTVBBKQ0KICANCiAgQy4gQW5hbGlzYSBEZXNrcmlwdGlmIFRvdGFsQ2xhaW1BbW91bnQoVENBKQ0KICANCiAgRC4gQW5hbGlzYSBEZXNrcmlwdGlmIHZhcmlhYmVsIGxhaW4NCiAgDQo0LiBTdGF0aXN0aWsgSW5mZXJlbnNpYWwgDQoNCiAgQS4gUGVuZ2FydWggUGVydGFuZ2d1bmdhbiBBc3VyYW5zaSB0ZXJoYWRhcCBjdXN0b21lciBsaWZlIHRpbWUgdmFsdWUNCiAgKENMVikNCiAgDQogIEIuIFBlbmdhcnVoIEVkdWthc2kgdGVyaGFkYXAgY3VzdG9tZXIgbGlmZSB0aW1lIHZhbHVlIChDTFYpDQogIA0KICBDLiBQZW5nYXJ1aCBTdGF0dXMgUGVrZXJqYWFuIHRlcmhhZGFwIG5pbGFpIHdha3R1IGhpZHVwIHBlbGFuZ2dhbiAoQ0xWKQ0KICANCiAgRC4gUGVuZ2FydWggR2VuZGVyIHRlcmhhZGFwIG5pYWxpIHdha3R1IGhpZHVwIHBlbGFuZ2dhbiAoQ0xWKQ0KICANCiAgRS4gUGVuZ2FydWggTG9rYXNpIFBhZGEgbmlsYWkgd2FrdHUgaGlkdXAgUGVsYW5nZ2FuIChDTFYpDQogIA0KICBGLiBQZW5nYXJ1aCBzdGF0dXMgcGVya2F3YWluYW4gdGVyaGFkYXAgY29zdHVtZXIgbGlmZSB0aW1lIHZhbHVlIChDTFYpDQogIA0KICBHLiBQZW5nYXJ1aCBqZW5pcyBwb2xpcyB0ZXJoYWRhcCBjb3N0dW1lciBsaWZlIHRpbWUgdmFsdWUgKENMVikNCiAgDQogIEguIFBlbmdhcnVoIGplbmlzIHBlbmF3YXJhbiBQZXJwYW5qYW5nYW4gbmlsYWkgdW11ciBwZWxhbmdnYW4gKENMVikNCiAgDQogIEkuIFBlbmdhcnVoIHNhbHVyYW4gcGVuanVhbGFuIHRlcmhhZGFwIG5pbGFpIHVtdXIgcGVsYW5nZ2FuIChDTFYpDQogIA0KICBKLiBQZW5nYXJ1aCBrZWxhcyBrZW5kYXJhYW4gdGVyaGFkYXAgbmlsYWkgd2FrdHUgaGlkdXAgcGVsYW5nZ2FuIChDTFYpDQogIA0KICBLLiBQZW5nYXJ1aCB1a3VyYW4ga2VuZGFyYWFuIHRlcmhhZGFvIG5pbGFpIHdha3R1IGhpZHVwIHBlbGFubmdhbiAoQ0xWKQ0KICANCiAgTC4gUGVuZ2FydWggU3RhdHVzIHRlcmhhZGFwIG5pbGFpIHdha3R1IGhpZHVwIHBlbGFuZ2dhbiAoQ0xWKQ0KICANCiAgTS4gUGVuZ2FydWgga2ViaWpha2FuIHRlcmhhZGFwIGN1c3RvbWVyIGxpZmUgdGltZSB2YWx1ZSAoQ0xWKQ0KICANCjUuIEFuYWxpc2EgUmVnZXJpcyBkZW5nYW4gdmFyaWFiZWwgS29udGludSANCg0KICBBLiBJbnRlcnByZXRhc2kgTW9kZWwNCiAgDQogIEIuIEFuYWxpc2lzIFJlc2lkdSANCiAgDQo2LiBQZW5ndWppYW4gQXN1bXNpIGFuYWxpc2lzIHJlZ3Jlc2kgTGluaWVyDQoNCiAgQS4gTWVuZGV0ZWtzaSBtdWxpdGlrb2xpbmVhcml0YXMNCiAgDQogIEIuIE1lbmRldGVrc2kgSG9tb3NrZWRhc3Rpc3Rhcw0KICANCiAgQy4gTWVuZGV0ZWtzaSBBdXRvS29yZWxhc2kgDQogIA0KICBELiBNZW5kZXRlc2tpIE1BUEUNCiAgDQo3LiBLdXJ2YSBQcmVkaWtzaSANCg0KICBBLiBSaW5na2FzYW4NCiAgDQogIEIuIFJla29tZW5kYXNpIEJpc25pcw0KDQoNCjEuIFR1anVhbiA6IE1lbXByZWRpa3NpIEN1c3RvbWVyIGxpZmUtdGltZSB2YWx1ZSAoQ0xWKSB1bnR1ayBwZXJ1c2FoYW4gYXN1cmFuc2kgbW9iaWwuDQoNCk5pbGFpIHNldW11ciBoaWR1cCBwZWxhbmdnYW4gKENMVikgbWV3YWtpbGkganVtbGFoIHRvdGFsIHVhbmcgeWFuZyBkaSBoYXJhcGthbiBwZWxhbmdnYW4gdW50dWsgZGliZWxhbmpha2FuIGRhbGFtIGJpc25pcywgYXRhdSBwYWRhIHByb2R1aywgc2VsYW1hIG1hc2EgaGlkdXAgbWVyZWthLiBpbmkgYWRhbGFoIGFuZ2thIHlhbmcgcGVudGluZyB1bnR1ayBkaWtldGFodWkga2FyZW5hIG1lbWJhbnR1IHBlcnN1YWhhbiBtZW1idWF0IGtlcHV0dXNhbiB0ZW50YW5nIGJlcmFwYSBiYW55YWsgdWFuZyB5YW5nIGFrYW4gZGlpbnZlc3Rhc2lrYW4gdW50dWsgbWVuZGFwYXQgcGVsYW5nZ2FuIGJhcnUgZGFuIG1lbXBlcnRhaGFua2FuIHBlbGFuZ2dhbiB5YW5nIHN1ZGFoIGFkYS4gDQoNCmBgYHtyfQ0KIyBwYWNrYWdlcyB5YW5nIGRpZ3VuYWthbiANCmxpYnJhcnkodGlkeXZlcnNlKSANCmxpYnJhcnkoY2FyKSANCmxpYnJhcnkoem9vKQ0KbGlicmFyeShJTVRlc3QpDQpsaWJyYXJ5KGRwbHlyKSANCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoY2FyZXQpDQpsaWJyYXJ5KGdncGxvdDIpIA0KbGlicmFyeSh0aW1lRGF0ZSkNCmBgYA0KDQoNCmBgYHtyfQ0KIyBSZXByb2R1a3NpIGhhc2lsIHlhbmcgc2FtYSBzZWxhbHUgDQpzZXQuc2VlZCgxMjMpDQpgYGANCg0KYGBge3J9DQojIE1lbWFiYWNhIGRpIGZpbGUgZGF0YQ0KRGF0YV9Bc3VyYW5zaSA8LSByZWFkLmNzdigiV0FfRm4tVXNlQ18tTWFya2V0aW5nLUN1c3RvbWVyLVZhbHVlLUFuYWx5c2lzLmNzdiIpDQpoZWFkKERhdGFfQXN1cmFuc2kpICMgbWVsaWhhdCA2IGRhdGEgcGVydGFtYSANCmBgYA0KDQpgYGB7cn0NCnRhaWwoRGF0YV9Bc3VyYW5zaSkgIyBtZWloYXQgNiBkYXRhIHRlcmFraGlyIA0KYGBgDQoNCjIuIFBlbWFoYW1hbiBEYXRhIA0KDQpgYGB7cn0NCiMgTWVuZ2hhcHVzIEN1c3RvbWVyIElEIGRhcmkga3VtcHVsYW4gZGF0YQ0KRGF0YV9Bc3VyYW5zaSA8LSBEYXRhX0FzdXJhbnNpWywtYygxKV0NCmBgYA0KDQpgYGB7cn0NCiMgTWVtYmVyc2loa2FuIERhdGENCmNvbG5hbWVzKERhdGFfQXN1cmFuc2kpDQpjb2xuYW1lcyhEYXRhX0FzdXJhbnNpKSA8LSBzdHJfcmVwbGFjZV9hbGwoY29sbmFtZXMoRGF0YV9Bc3VyYW5zaSksIlsuXSIsIiIpDQpjb2xuYW1lcyhEYXRhX0FzdXJhbnNpKQ0KYGBgDQpLZXRlcmFuZ2FuDQoNCiJTdGF0ZSIgOiBOZWdhcmEuIA0KDQoiQ3VzdG9tZXJsaWZldGltZXZhbHVlIiA6IFBlbGFuZ2dhbiBzZXVtdXIgaGlkdXAgbmlsYWkNCg0KIlJlc3BvbnNlIiA6IHJlc3Bvbg0KDQoiQ292ZXJhZ2UiIDogY2FrdXBhbg0KDQoiRWR1Y2F0aW9uIiA6IFBlbmRpZGlrYW4NCg0KIkVmZmVjdGl2ZVRvRGF0ZSIgOiB0YW5nZ2FsIGJlcmxha3UNCg0KIkVtcGxveW1lbnRTdGF0dXMiIDogU3RhdHVzIFBla2VyamFhbg0KDQoiZ2VuZGVyIiA6IGplbmlzIGtlbGFtaW4sIA0KDQoiSW5jb21lIiA6IFBlbmdoYXNpbGFuDQoNCiJMb2NhdGlvbkNvZGUiIDogTG9rYXNpLktvZGUNCg0KIk1hcnRpYWxTdGF0dXMiIDogc3RhdHVzIHBlcmthd2luYW4NCg0KIk1vbnRobHlQcmVtaXVtQXV0byIgOiBCdWxhbmFuLlByZW1pdW0uT3RvbWF0aXMNCg0KIk1vbnRoc1NpbmNlTGFzdENsYWltIiAgOiBCdWxhbiBzZWphayB0ZWtha2hpciBrbGFpbQ0KDQoiTW9udGhzU2luY2VQb2xpY3lJbmNlcHRpb24iIDogQnVsYW4gc2VqYWsga2ViaWpha2FuIGluY2VwdGlvbg0KDQoiTnVtYmVyb2ZPcGVuQ29tcGxhaW50cyIgOiBKdW1sYWggcGVuZ2FkdWFuIHRlcmJ1a2ENCg0KIk51bWJlcm9mUG9saWNpZXMiIDoganVtbGFoIGtlYmlqYWthbg0KDQoiUG9saWN5VHlwZSIgOiBKZW5pcyBrZWJpamFrYW4gDQoNCiJQb2xpY3kiIDogS2ViaWpha2FuIA0KDQoiUmVuZXdPZmZlclR5cGUiIDogUGVyYmFydWkgamVuaXMgcGVuYXdhcm4gDQoNCiJTYWxlc0NoYW5uZWwiIDogU2FsdXJhbiBwZW5qdWFsYW4NCg0KIlRvdGFsQ2xhaW1BbW91bnQiIDogVG90YWwganVtbGFoIGtsYWltIA0KDQoiVmVoaWNsZUNsYXNzIiA6IEtlbGFzIGtlbmRhcmFhbg0KDQoiVmVoaWNsZVNpemUiIDogVWt1cmFuIGtlbmRhcmFuLiAgICAgICAgICAgICAgIA0KDQpgYGB7cn0NCiMgUGVtYWhhbWFuIERhdGENCmRpbShEYXRhX0FzdXJhbnNpKQ0KYGBgDQoNCmBgYHtyfQ0Kc3RyKERhdGFfQXN1cmFuc2kpDQpgYGANCkRhdGFzZXQgeWFuZCBkaXNlZGlha2FuIG1lbWlsaWtpIGJhbnlhayBkZXRhaWwgOiANCg0KMS4gYWRhIDkxMzQgUGVuZ2FtYXRhbiAyMyB2YXJpYWJlbCANCg0KMi4gYWRhIGNhbWFwdXJhbiBkYXRhIHR5ZSBrYXRlZ29yaXMgZGFuIGJlcmtlbGFuanVhdGFuDQoNCjMuIGRlcGVuZGVudCB2YXJpYWJlbCBhZGFsYWggY3VzdG9tZXIgbGlmZSB0aW1lIHZhbHVlIGthcmVuYSBoYXJ1cyBtZW1wcmVkaWtzaSBDTFYNCg0KNC4gdmFyaWFiZWwgaW5kZXBlbmRlbiBhZGFsYWggOg0KIkN1c3RvbWVyIiBQZWxhbmdnYW4NCg0KIlN0YXRlQ3VzdG9tZXJsaWZldGltZXZhbHVlIiA6IE5pbGFpIE5lZ2FyYSBQZWxhbmdnYW4gc2V1bXVyIGhpZHVwDQoNCiJSZXNwb25zZSIgOiByZXNwb24NCg0KICJDb3ZlcmFnZSIgOiBjYWt1cGFuDQogDQogIkVkdWNhdGlvbiIgOiBQZW5kaWRpa2FuDQogDQogIkVmZmVjdGl2ZVRvRGF0ZSIgOiB0YW5nZ2FsIGJlcmxha3UNCiANCiAiRW1wbG95bWVudFN0YXR1cyIgOiBTdGF0dXMgUGVrZXJqYWFuDQogDQogImdlbmRlciIgOiBqZW5pcyBrZWxhbWluDQogDQogIkluY29tZSIgOiBQZW5naGFzaWxhbg0KIA0KICJMb2NhdGlvbkNvZGUiIDogTG9rYXNpLktvZGUNCiANCiAiTWFydGlhbFN0YXR1cyIgOiBzdGF1dHVzIHBlcmthd2luYW4NCiANCiAiTW9udGhseVByZW1pdW1BdXRvIiA6IEJ1bGFuYW4uUHJlbWl1bS5PdG9tYXRpcw0KIA0KICJNb250aHNTaW5jZUxhc3RDbGFpbSIgIDogQnVsYW4gc2VqYWsgdGVrYWtoaXIga2xhaW0NCiANCiAiTW9udGhzU2luY2VQb2xpY3lJbmNlcHRpb24iIDogQnVsYW4gc2VqYWsga2ViaWpha2FuIA0KIA0KICJOdW1iZXJvZk9wZW5Db21wbGFpbnRzIiA6IEp1bWxhaCBwZW5nYWR1YW4gdGVyYnVrYQ0KIA0KICJOdW1iZXJvZlBvbGljaWVzUG9saWN5VHlwZSIgOiAgSnVtbGFoIEplbmlzIGtlYmlqYWthbiANCiANCiAiUG9saWN5IiA6IEtlYmlqYWthbg0KIA0KICJSZW5ld09mZmVyVHlwZSIgOkplbmlzIHBlbndhcmFuIHBlbWJhcnVhbiANCiANCiAiU2FsZXNDaGFubmVsIiA6IFNhbHVyYW4gcGVuanVhbGFuDQogDQogIlRvdGFsQ2xhaW1BbW91bnRWZWhpY2xlQ2xhc3MiIDogSnVtbGFoIGtsYWltICBLZWxhcyBrZW5kYXJhYW4NCiANCiAiVmVoaWNsZVNpemUiIDogVWt1cmFuIGtlbmRhcmFuLg0KDQo1LiBWYXJpYWJlbCBpbmRlcGVuZGVuIGxhbmp1dGFuIGFkYWxhaCA6IA0KIkN1c3RvbWVybGlmZXRpbWV2YWx1ZSIgOiBQZWxhbmdnYW4gbmlhbGkgc2V1bXVyIGhpZHVwDQoNCiJJbmNvbWUiIDogcGVuZGFwYXRhbg0KDQoiTW9uaHRseVByZW1pdW1Bb3V0dSIgOiAgUHJlbWl1bSBidWxhbmFuIG90b21hdGlzDQoNCiJNb250aHNTaW5jZUxhc3RDbGFpbSIgOiBCdWxhbiBzZWphayBrbGFpbSB0ZXJrYWhpcg0KDQoiTW9udGhTaW5jZVBvbGljeUluY2VwdGlvbiIgOiBCdWxhbiBzZWphayBhd2FsIGtlYmlqYWthbg0KDQoiTnVtYmVyb2ZvcGVuY29tcGxhaW50cyIgOiBKdW1sYWgga2VsdWhhbiB0ZXJidWthDQoNCiIgTnVtYmVyb2Zwb2xpY2llcyIgOiBKdW1sYWgga2ViaWpha2FuDQoNCiJUb3RhbENsYWltQW1vdW50IiA6IGp1bWxhaCB0b3RhbCBrbGFpbS4NCg0KNi4gVGlkYWsgYWRhIG5pbGFpIG5vbCwgamlrYSB0aWRhayBhZGEgdGluZGFrYW4gbGViaWggbGFuanV0IHlhbmcgZGlwZXJsdWthbiB1bnR1ayBtZW5nZ2FudGkgbmlsYWkgeWFuZyBoaWxhbmcgYXRhdSBub2wuDQoNCjcuIEtvbG9tICJDdXN0b21lcnMiIGFkYWxhaCBub21vZXIgc2VyaSBzZWhpbmdnYSB0aWFkYWsgc2luZ25pZmlha2FuIHVudHVrIGFuYWxpc2lzIGRhbiBkaSBoYXB1cyBkYXJpIGRhdGFzZXQuDQoNCmBgYHtyfQ0KIyBNZW1yZXJpa3NhIG5pbGFpIG5vbCBkaSBzZXRpYXAga29sb20gZGFuIG1lbnlpbXBhbiBuaWxhaSBkYWxhbSBkYXRhIGZyYW1lIE5BX0NPVU5UUy4NCm5hX2NvdW50cyA8LSBzYXBwbHkoRGF0YV9Bc3VyYW5zaSwgZnVuY3Rpb24oeSkgc3VtKGlzLm5hKHkpKSkNCm5hX2NvdW50cyA8LSBkYXRhLmZyYW1lKG5hX2NvdW50cykNCm5hX2NvdW50cw0KYGBgDQoNCmtldGVyYW5nYW4gZGF0YSBkaWF0YXMgYWRhbGFoIHRpZGFrIGFkYSBuaWxhaSBub2wsIGphZGkgdGlkYWsgYWRhIHRpbmRha2FuIGxlYmloIGxhbmp1dCB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuZ2dhbnRpIG5pbGFpIHlhbmcgaGlsYW5nIGF0YXUgbm9sLg0KDQpgYGB7cn0NCiMgTmlsYWkgdW5payBkYXJpIHNldGlhcCBrb2xvbSANCnNhcHBseShEYXRhX0FzdXJhbnNpLCBkYXRhLnRhYmxlOjp1bmlxdWVOKQ0KYGBgDQoNCjMuIEFuYWxpc2lzIERhdGEgRWtzcGxvcmFzaSAoRURBKQ0KDQpEaSBiYWdhaW4gaW5pIHVsdW4gbWVsYWt1a2FuIHBlbnllbGlkaWthbiBhd2FsIHBhZGEgZGF0YV9hc3VyYW5zaSB1bnR1ayBtZW5lbXVrYW4gcG9sYSBkYW4gbWVtZXJpa3NhIGFzdW1zaSBkZW5nYW4gYmFudHVhbiAgc3RhdGlzdGlrIHJpbmdrYXNhbiBkYW4gcmVwc2Vuc2V0YXNpIGdyYWZpcy4NCg0KMy4xIEFuYWxpc2lzIERlc2tyaXB0aWYgQ3VzdG9tZXJsaWZldGltZXZhbHVlDQoNCmBgYHtyfQ0KcmFuZ2UoRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUpDQpgYGANCmtldGVyYW5nYW4gZGF0YSBkaWF0YXMgYWRhbGFoICBuaWxhaSBtYWtzaW11bSBDTFYgODMzMjUuMzgxIGRhbiBuaWxhaSBtaW5pbXVueWEgQ0xWIDE4OTguMDA4DQoNCmBgYHtyfQ0KbWVhbihEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSkNCmBgYA0Ka2V0ZXJhbmdhbiBkYXRhIGRpYXRhcyBhZGFsYWggcmF0YS1yYXRhIGNsdiA4MDA1IGRhbiBtZWRpYW4gbnlhIDU3ODANCg0KYGBge3J9DQpzZChEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSkNCmBgYA0KDQprZXRlcmFuZ2FuIGRhdGEgZGlhdGFzIGFkYWxhaCBzdGFuZGFydCBkZXZpYXNpIDY4NzAuOTY4DQoNCmBgYHtyfQ0Kc3VtbWFyeShEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSkNCmBgYA0KDQpgYGB7cn0NCnZhcihEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSkNCmBgYA0KDQprZXRlcmFuZ2FuIGRhdGEgZGlhdGFzIGFkYWxhaCBuaWxhaSB2YXJpYW5zaSBkYWxhbSBDTFYgNDcyMTAxOTYNCg0KYGBge3J9DQpza2V3bmVzcyhEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSkNCmBgYA0Ka2V0ZXJhbmdhbiBkYXRhIGRpYXRhcyBhZGFsYWggbmlsYWkga2VtaXJpbmdhbnlhIDMuMDMxMjg0IENMViBtaXJpbmcgcG9zaXRpZiBkYW4gbmlsaSB0ZXJrb25zZW50cmFzaSBkaSBzZWJlbGFoIGtpcmkgDQoNCmBgYHtyfQ0Ka3VydG9zaXMoRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUpDQpgYGANCmtldGVyYW5nYW4gZGF0YSBkaWF0YXMgYWRhbGFoIG5pbGFpIHJhdGEtcmF0YSwgbmFtdW4gc2VtdWEgbmlsYWkgZWtzdHJlbSBiZXJhZGEgZGkgc2ViZWxhaCBrYW5hbi4gamFkaSBuaWFpIEtvcnRvc2lzIGFkYWxhaCAxMy44MTE2Mywga2FyZW5hIGtvcnRvc2lzID4zLCBiZXJhdGkgZGlzdHJpYnVzaSBtZW1pbGlraSBla29yIHlhbmcgbGViaWggdGViYWwgZGFyaSBiaWFzYW55YSANCmBgYHtyfQ0KI2hpc3QoRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUsIGNvbCA9ICIjRkY1NzMzIiwgeGxhYiA9ICJDTFYiKQ0KaGlzdChEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSwgYnJlYWtzID0gKG1heChEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSkgLSBtaW4oRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUpKS8xMDAsIGZyZXEgPSBGQUxTRSwgbWFpbiA9ICJDTFYgSGlzdG9ncmFtIiwgeGxhYiA9ICJDTFYiLCBib3JkZXIgPSAiI0ZGNTczMyIpDQpgYGANCg0KS2V0ZXJhbmdhbiBISVNUT0dSQU0gZGlhdGFzIGFkYWxhaCBkaXN0cnVic2kgZGFuIG1lbWlsaWtpIGxlYmloIGJhbnlhayBvdXRsaWVyIChuaWxhaSBla3N0cmltKS4gaW5pIGJlcmFydGkgYmFod2EgZGlzdHJpYnVzaSBjbHYgbWlyaW5nIHBvc3RpZihzZXBlcnRpIHlhbmcgZGloYXJhcGthbikgZGFuIHNhbmdhdCBMZXB0b2tydXRpay4gDQpIYXNpbCBpbmkgbWVudW5qdWtrYW4gZGlzdHJpYnVzaSB5YW5nIHNhbmdhdCBtaXJpbmcgZGVuZ2FuIGVrb3IgeWFuZyBzYW5nYXQgYmVzYXIsIGFkYSBiYW55YWsgY3VzdG9tZXJzKHBlbGFuZ2dhbikgZGVuZ2FuIENMViByZW5kYWguIA0Kc2FuZ2F0IHNlZGlraXQgcGVsYW5nZ2FuIENMViB0aW5uZ2ksIGluaSBkYXBhdCBkaXBhaGFtaSBzZWNhcmEgdmlzdWFsDQptZW5nZ3VhbmFrYW4gaGlzdG9ncmFtLg0KDQozLjIgQW5hbHNpcyBEZXNrcmlwdGlmIE1vbnRobHkgUHJlbWl1bSBBdXRvKE1QQSkNCg0KYGBge3J9DQpyYW5nZShEYXRhX0FzdXJhbnNpJE1vbnRobHlQcmVtaXVtQXV0bykNCmBgYA0KS2V0ZXJhbmdhbiBkYXRhIGRpYXRhcyBuaWxhaSBtYWttaW11bSBNUEEgMjk4IGRhbiBuaWxhaSBtaW5pbXVtIE1QQSA2MQ0KDQpgYGB7cn0NCm1lYW4oRGF0YV9Bc3VyYW5zaSRNb250aGx5UHJlbWl1bUF1dG8pDQpgYGANCktldGVyYW5nYW4gZGF0YSBkaWF0YXMgbmlsYWkgcmF0YSBLS0wgYWRhbGFoIDkzLjIxOTI5IGRhbiBtZWRpYW4gbnlhIGFkYWxhaCA4NC4wMA0KDQpgYGB7cn0NCnNkKERhdGFfQXN1cmFuc2kkTW9udGhseVByZW1pdW1BdXRvKQ0KYGBgDQprZXRlcmFuZ2FuIGRhdGEgZGlhdGFzIGFkYWxhaCBTdGFuZGFyIERldmlhc2kgMzQuNDA3OTcNCg0KYGBge3J9DQpzdW1tYXJ5KERhdGFfQXN1cmFuc2kkTW9udGhseVByZW1pdW1BdXRvKQ0KYGBgDQoNCmBgYHtyfQ0KdmFyKERhdGFfQXN1cmFuc2kkTW9udGhseVByZW1pdW1BdXRvKQ0KYGBgDQoga2V0ZXJhbmdhbiBkYXRhIGRhdGEgZGlhdGFzIGFkYWxhaCBuaWxhaSB2YXJpYW5zaSBkYWxhbSBLS0wgYWRhbGFoIDExODMuOTA4DQpgYGB7cn0NCnNrZXduZXNzKERhdGFfQXN1cmFuc2kkTW9udGhseVByZW1pdW1BdXRvKQ0KYGBgDQpOaWxhaSBrZW1pcmluZ2FueWEgYWRhbGFoIDIuMTIyODQ5IE1QQSBjb25vbmcgcG9zdGlmIGRhbiBzZWJhZ2lhbiBiZXNhciBuaWxhaSB0ZXJrb25zZW50cmFzaSBkaSBzZWJlbGFoIGtpcmkuDQoNCmBgYHtyfQ0Ka3VydG9zaXMoRGF0YV9Bc3VyYW5zaSRNb250aGx5UHJlbWl1bUF1dG8pDQpgYGANCk5pbGFpIHJhdGEtcmF0YSwgbmFtdW4gc2VtdWEgbmlsYWkgZWtzdHJpbSBiZXJhZGEgZGkgc2ViZWxhaCBrYW5hbiBuaWxhaSByYXRhIEt1cnRvc2lzIGFkYWxhaCA2LjE4NzU0Ni4ga2FyZW5hIEt1cnRvc2lzID4zLCBiZWFydGkgZGlzdHJpYnVzaW55YSBtZW1pbGlraSBla29yIHlhbmcgbGViaWggdGViYWwgZGFyaSBiaWFzYW55YS4NCmBgYHtyfQ0KY29yKERhdGFfQXN1cmFuc2kkTW9udGhseVByZW1pdW1BdXRvLERhdGFfQXN1cmFuc2kkQ3VzdG9tZXJMaWZldGltZVZhbHVlKQ0KYGBgDQpkaXN0cmlidXNpIGRhbiBtZW1pbGlraSBsZWJpaCBiYW55YWsgb3V0bGllcihuaWFsaSBla3N0cmltKSBhZGEga29ybGFzaSBwb3NpdGlmIDM5LDYyICUgS0tMIGRlZ2FuIENMVi4gRGFyaSBQbG90IHBlbmNhciwgamVsYXMuDQoNCmBgYHtyfQ0KI2hpc3QoSW5zdXJhbmNlRGF0YSRNb250aGx5UHJlbWl1bUF1dG8sIGNvbCA9ICIjMDBBRkJCIiwgeGxhYiA9ICJNb250aGx5IFByZW1pdW0gQXV0byIpDQpoaXN0KERhdGFfQXN1cmFuc2kkTW9udGhseVByZW1pdW1BdXRvLCBicmVha3MgPSAobWF4KERhdGFfQXN1cmFuc2kkTW9udGhseVByZW1pdW1BdXRvKSAtIG1pbihEYXRhX0FzdXJhbnNpJE1vbnRobHlQcmVtaXVtQXV0bykpLzEsIGZyZXEgPSBGQUxTRSwgbWFpbiA9ICJNb250aGx5IFByZW1pdW0gSGlzdG9ncmFtIiwgeGxhYiA9ICJNb250aGx5IFByZW1pdW0iLCBib3JkZXIgPSAiIzAwQUZCQiIpDQoNCmBgYA0KDQp0ZXJsaWhhdCBiYWh3YSBwYWRhIEtLTCwgQ0xWIGp1Z2EgbWVuaW5na2F0LjcuDQoNCmBgYHtyfQ0KcGxvdCh4PURhdGFfQXN1cmFuc2kkTW9udGhseVByZW1pdW1BdXRvLCB5PURhdGFfQXN1cmFuc2kkQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBjb2w9IiMwMEFGQkIiLCBjZXg9MSwgeGxhYj0iTW9udGhseVByZW1pdW1BdXRvIiwgeWxhYj0iQ3VzdG9tZXJMaWZldGltZVZhbHVlIiwNCiAgICAgICBtYWluPSJTY2F0dGVycGxvdCBvZiBNUEEgdnMgQ0xWIikNCmBgYA0KDQpQcmVtaSBidWxhbmFuIG1lbmdpa3V0aSB0cmVuIHlhbmcgbWlyaXAgZGVuZ2FuIGNsdiBtZXNraXB1biBkaXN0cmlidXNpbnlhIHRpZGFrIG1pcmluZyBhdGF1IHNlcGFuamFuZyBla29yIHNlcGVydGkgQ0xWLiBJbmkgZGFwYXQgZGlsaGloYXQgc2VjYXJhIGhpc3RvZ3JhbS4NCg0KIDMuMyBBbmFsaXNpcyBEZXNrcmlwdGlmIFRvdGFsQ2xhaW1BTW91bnQoVENBKQ0KDQpgYGB7cn0NCnJhbmdlKERhdGFfQXN1cmFuc2kkVG90YWxDbGFpbUFtb3VudCkNCmBgYA0KVENBIG1ha3NpbXVtIGFkYWxhaCAwLDA5OTAwNyBkYW4gVENBIG1pbmltdW0gYWRhbGFoIDI4OTMsMjM5Njc4Lg0KDQpgYGB7cn0NCm1lYW4oRGF0YV9Bc3VyYW5zaSRUb3RhbENsYWltQW1vdW50KQ0KYGBgDQpSYXRhLXJhdGEgVENBIGFkYWxhaCA0MzQuMDg4OCBkYW4gTWVkaWFuIDM4My45NDUNCg0KYGBge3J9DQpzZChEYXRhX0FzdXJhbnNpJFRvdGFsQ2xhaW1BbW91bnQpDQpgYGANCnN0YW5kYXJ0IGRldmlhc2kgYWRhbGFoIDI5MC41MDAxDQoNCmBgYHtyfQ0Kc3VtbWFyeShEYXRhX0FzdXJhbnNpJFRvdGFsQ2xhaW1BbW91bnQpDQpgYGANCg0KYGBge3J9DQp2YXIoRGF0YV9Bc3VyYW5zaSRUb3RhbENsYWltQW1vdW50KQ0KYGBgDQpWYXJpYW5zIGRhbGFtIFRDQSBhZGFsYWggODQzOTAuMw0KDQpgYGB7cn0NCnNrZXduZXNzKERhdGFfQXN1cmFuc2kkVG90YWxDbGFpbUFtb3VudCkNCmBgYA0KS2VtZXJpbmdhbnlhIGFkYWxhaCAxLjcxNDQwMyBUQ0EgbWlyaW5nIHBvc2l0aWYgZGFuIHNlYmFnaWFuIGJlc2FyIG5pbGFpIHRlcmtvbnNlbnRyYXNpIGRpIHNlYmVsYWgga2lyaSANCg0KYGBge3J9DQprdXJ0b3NpcyhEYXRhX0FzdXJhbnNpJFRvdGFsQ2xhaW1BbW91bnQpIA0KYGBgDQoNCm5pbGFpIHJhdGEtcmF0YSwgbmFtdW4gc2VtdWEgbmlsYWkgZWtzdGlybSBiZXJhZGEgZGkgc2ViZWxhaCBrYW5hbiBuaWxhaSByYXRhLXJhdGEga29ydHVzaXMgYWRhbGFoIDUsOTczNTA2LiBrYXJlbmEga3VydG9zaXMgPiAzLCBiZXJhcnRpIGRpc3RyaWJ1c2kgVENBIG1lbWlsaWtpIGVrb3IgeWFuZyBsZWJpaCB0ZWJhbCBkYXJpIGJpc2FueWEuDQoNCmBgYHtyfQ0KY29yKERhdGFfQXN1cmFuc2kkVG90YWxDbGFpbUFtb3VudCxEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSkNCmBgYA0KZGlzdHJpYnVzaSBkYW4gbWVtaWxpa2kgbGViaWggYmFueWFrIG91dGxpZXIobmlsYWkgZWtzdHJpbSksIHRlcmRhcGF0IGtvcmVhbHNpIHBvc2l0aWYgc2ViZXNhciAyMiw2NSUgVENBIGRlbmdhbiBDTFYgZGFyaSBwbG90IHBlbmNhciBqZWxhcy4NCg0KYGBge3J9DQojaGlzdChJbnN1cmFuY2VEYXRhJFRvdGFsQ2xhaW1BbW91bnQsIGNvbCA9ICIjRkM0RTA3IiwgeGxhYiA9ICJUb3RhbCBDbGFpbSBBbW91bnQiKQ0KaGlzdChEYXRhX0FzdXJhbnNpJFRvdGFsQ2xhaW1BbW91bnQsIGJyZWFrcyA9IChtYXgoRGF0YV9Bc3VyYW5zaSRUb3RhbENsYWltQW1vdW50KSAtIG1pbihEYXRhX0FzdXJhbnNpJFRvdGFsQ2xhaW1BbW91bnQpKS8xMCwgZnJlcSA9IEZBTFNFLCBtYWluID0gIlRvdGFsIENsYWltIEFtb3VudCBIaXN0b2dyYW0iLCB4bGFiID0gIlRvdGFsIENsYWltIEFtb3VudCIsIGJvcmRlciA9ICIjRkM0RTA3IikNCmBgYA0KDQp0ZXJsaWhhdCBiYWh3YSBwYWRhIFRDQSwgQ0xWIGp1Z2EgbWVuaW5na2F0LiANCg0KYGBge3J9DQojaGlzdChJbnN1cmFuY2VEYXRhJFRvdGFsQ2xhaW1BbW91bnQsIGNvbCA9ICIjRkM0RTA3IiwgeGxhYiA9ICJUb3RhbCBDbGFpbSBBbW91bnQiKQ0KaGlzdChEYXRhX0FzdXJhbnNpJFRvdGFsQ2xhaW1BbW91bnQsIGJyZWFrcyA9IChtYXgoRGF0YV9Bc3VyYW5zaSRUb3RhbENsYWltQW1vdW50KSAtIG1pbihEYXRhX0FzdXJhbnNpJFRvdGFsQ2xhaW1BbW91bnQpKS8xMCwgZnJlcSA9IEZBTFNFLCBtYWluID0gIlRvdGFsIENsYWltIEFtb3VudCBIaXN0b2dyYW0iLCB4bGFiID0gIlRvdGFsIENsYWltIEFtb3VudCIsIGJvcmRlciA9ICIjRkM0RTA3IikNCmBgYA0KDQpKdW1sYWggdG90YWwga2xhaW0ganVnYSBtZW5naWt1dGkgdHJlbiB5YW5nIG1pcmlwIGRlbmdhbiBjbHYgZGFuIG1wYSBtZXNraXB1biBkaXN0cmlidXNpbnlhIHRpZGFrIGF0YXUgYmVyZWtvciBwYW5qYW5nIHNlcGVydGkgS0tMLiBpbmkgZGFwYXQgZGlsaWhhdCBzZWNhcmEgdmlzdWFsIGhpc3RvZ3JhbS4NCg0KYGBge3J9DQpwbG90KHg9RGF0YV9Bc3VyYW5zaSRUb3RhbENsYWltQW1vdW50LCB5PURhdGFfQXN1cmFuc2kkQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBjb2w9IiNGQzRFMDciLCBjZXg9MSwgeGxhYj0iVG90YWxDbGFpbUFtb3VudCIsIHlsYWI9IkN1c3RvbWVyTGlmZXRpbWVWYWx1ZSIsDQogICAgIG1haW49IlNjYXR0ZXJwbG90IG9mIFRDQSB2cyBDTFYiKQ0KYGBgDQoNCkFydGlueWEgdmFyaWFzaSBkYXRhbnlhIGFkYWxhaCBDTFY+TVBBPlRDQQ0KDQogMy40IEFuYWxpc2lzIERlc2tyaXB0aWYgVmFyaWFiZWwgbGFpbiANCg0KYGBge3J9DQpjb3IoRGF0YV9Bc3VyYW5zaSRJbmNvbWUsRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUpDQpgYGANCg0KYGBge3J9DQpwbG90KHg9RGF0YV9Bc3VyYW5zaSRJbmNvbWUsIHk9RGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUsIGNvbD0iI0ZDNEUwNyIsIGNleD0xLCB4bGFiPSJJbmNvbWUiLCB5bGFiPSJDdXN0b21lckxpZmV0aW1lVmFsdWUiLG1haW49IlNjYXR0ZXJwbG90IG9mIEluY29tZSB2cyBDTFYiKQ0KYGBgDQoNCmBgYHtyfQ0KY29yKERhdGFfQXN1cmFuc2kkTW9udGhzU2luY2VMYXN0Q2xhaW0sRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KcGxvdCh4PURhdGFfQXN1cmFuc2kkTW9udGhzU2luY2VMYXN0Q2xhaW0sIHk9RGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUsIGNvbD0iI0ZDNEUwNyIsIGNleD0xLCB4bGFiPSJNb250aHNTaW5jZUxhc3RDbGFpbSIsIHlsYWI9IkN1c3RvbWVyTGlmZXRpbWVWYWx1ZSIsbWFpbj0iU2NhdHRlcnBsb3Qgb2YgTW9udGhzU2luY2VMYXN0Q2xhaW0gdnMgQ0xWIikNCmBgYA0KDQpgYGB7cn0NCmNvcihEYXRhX0FzdXJhbnNpJE1vbnRoc1NpbmNlUG9saWN5SW5jZXB0aW9uLERhdGFfQXN1cmFuc2kkQ3VzdG9tZXJMaWZldGltZVZhbHVlKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdCh4PURhdGFfQXN1cmFuc2kkTW9udGhzU2luY2VQb2xpY3lJbmNlcHRpb24sIHk9RGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUsIGNvbD0iI0ZDNEUwNyIsIGNleD0xLCB4bGFiPSJNb250aHNTaW5jZUxhc3RDbGFpbSIsIHlsYWI9IkN1c3RvbWVyTGlmZXRpbWVWYWx1ZSIsbWFpbj0iU2NhdHRlcnBsb3Qgb2YgTW9udGhzU2luY2VQb2xpY3lJbmNlcHRpb24gdnMgQ0xWIikNCmBgYA0KDQoNCmBgYHtyfQ0KY29yKERhdGFfQXN1cmFuc2kkTnVtYmVyb2ZPcGVuQ29tcGxhaW50cyxEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSkNCmBgYA0KIA0KYGBge3J9DQpwbG90KHg9RGF0YV9Bc3VyYW5zaSROdW1iZXJvZk9wZW5Db21wbGFpbnRzLCB5PURhdGFfQXN1cmFuc2kkQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBjb2w9IiNGQzRFMDciLCBjZXg9MSwgeGxhYj0iTnVtYmVyb2ZPcGVuQ29tcGxhaW50cyIsIHlsYWI9IkN1c3RvbWVyTGlmZXRpbWVWYWx1ZSIsbWFpbj0iU2NhdHRlcnBsb3Qgb2YgTnVtYmVyb2ZPcGVuQ29tcGxhaW50cyB2cyBDTFYiKQ0KYGBgDQogDQpgYGB7cn0NCmNvcihEYXRhX0FzdXJhbnNpJE51bWJlcm9mUG9saWNpZXMsRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUpDQpgYGANCiANCg0KYGBge3J9DQpwbG90KHg9RGF0YV9Bc3VyYW5zaSROdW1iZXJvZlBvbGljaWVzLCB5PURhdGFfQXN1cmFuc2kkQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBjb2w9IiNGQzRFMDciLCBjZXg9MSwgeGxhYj0iTnVtYmVyb2ZQb2xpY2llcyIsIHlsYWI9IkN1c3RvbWVyTGlmZXRpbWVWYWx1ZSIsbWFpbj0iU2NhdHRlcnBsb3Qgb2YgTnVtYmVyb2ZQb2xpY2llcyB2cyBDTFYiKQ0KYGBgDQoNCkRhcmkgYmViYXJhcGEgdGFiZWwgZGlhdGFzIG5pbGFpIGtvcmVsYXNpIHBvc2l0aWYgeWFuZyBtZW5kZWthdGkgbm9sIG1lbnVuanVra2FuIGJhaHdhIHRpZGFrIGFkYSwgaHVidW5nYW4geWFuZyBrdWF0IGFudGFyYSBJbmNvbWUsIE1vbnRocyBTaW5jZUxBc3RDbGFpbSwgTnVtYmVyb2ZQb2xpY2llcyBkYW4gbGFpbi1sYWluIGRlbmdhbiBDTFYuDQoNCiA0LiBTdGF0aXN0aWsgSW5mZXJlbnNpYWwgDQpLYW5kaWRhdCB5YW5nIHBhbGluZyBqZWxhcyB1bnR1ayB2YXJpYWJlbCBkZXBlbmRlbiBhZGFsYWggQ0xWIChDdXN0b21lcmxpZmV0aW1ldmFsdWUpLiBpbmkganVnYSBtYXN1ayBha2FsIGRhcmkgUGVyc3Bla3RpZiBCaXNuaXMga2FyZW5hIHNheWEgaW5naW4gbWVtYWhhbWkgYXBhIHlhbmcgYmVya29udHJpYnVzaSB1bnR1ayBtZW1idWF0IHBlbGFuZ2dhbiBiZXJuaWxhaSB0aW5nZ2kgKEFuYWxpc2lzIERlc2tyaXB0aWYpIGRhbiBtdW5na2luIG5hbnRpIG1lbXByZWRpa3NpIHNpYXBhIHlhbmcgYWthbiBtZW5qYWRpIHBlbGFuZ2dhbiBiZXJuaWxhaSB0aW5nZ2kgKEFuYWxpc2lzIFByZWRpa3RpZikuDQoNCmBgYHtyfQ0KZ2dwbG90KERhdGFfQXN1cmFuc2ksIGFlcyh4PUNvdmVyYWdlLCB5PSBDdXN0b21lckxpZmV0aW1lVmFsdWUsIGZpbGwgPSBDb3ZlcmFnZSkpICsgDQogIGdlb21fYm94cGxvdCgpICsgDQogIGxhYnMoeD0iQ292ZXJhZ2UiLHkgPSAiQ3VzdG9tZXIgTGlmZSBUaW1lIFZhbHVlIiwgZmlsbD0iQ292ZXJhZ2UiKSArIA0KICBnZ3RpdGxlKCJWaXN1YWxpemF0aW9uIG9mIENMViB3cnQgQ292ZXJhZ2UiKQ0KYGBgDQoNCmBgYHtyfQ0KYWdnRGF0YSA8LSBhZ2dyZWdhdGUoeCA9IERhdGFfQXN1cmFuc2kkQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBieT1saXN0KENvdmVyYWdlID0gRGF0YV9Bc3VyYW5zaSRDb3ZlcmFnZSksIEZVTiA9IHN1bSkNCmFnZ0RhdGENCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gYWdnRGF0YSwgYWVzKHggPSBDb3ZlcmFnZSwgeSA9IHByb3AudGFibGUoc3RhdChhZ2dEYXRhJHgpKSwgZmlsbCA9IENvdmVyYWdlLCBsYWJlbCA9IHNjYWxlczo6cGVyY2VudChwcm9wLnRhYmxlKHN0YXQoYWdnRGF0YSR4KSkpKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgZ2VvbV90ZXh0KHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC45KSwgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgDQogIGxhYnMoeCA9ICdDb3ZlcmFnZScsIHkgPSAnQ0xWIGluIFBlcmNlbnRhZ2UnLCBmaWxsID0gJ0NvdmVyYWdlJykgKyANCiAgZ2d0aXRsZSgiQ0xWIERpc3RyaWJ1dGlvbiBieSBDb3ZlcmFnZSIpDQpgYGANCg0KTmFzYWJhaCB5YW5nIHRlbGFoIG1lbmdhbWJpbCBBc3VyYW5zaSBEYXNhciAoQmFzaWMpIHVudHVrIGtlbmRhcmFhYW55YSBsZWJpaCBiZXJoYXJnYSBkYXJpIHBhZGEgcGVtZWdhbmcgcG9saXMgKGV4dGVuZGVkKSBhc3VyYW5zaSBwZXJwYW5qYW5nYW4gYXRhdSAocHJlbWl1bSkuDQoNCjQuMDIgUGVuZ2FydWggRWR1a2FzaSB0ZXJoYWRhcCBDdXN0b21lciBsaWZlIHRpZW0gdmFsdWUgKENMVikNCg0KYGBge3J9DQpnZ3Bsb3QoRGF0YV9Bc3VyYW5zaSwgYWVzKHg9RWR1Y2F0aW9uLCB5PSBDdXN0b21lckxpZmV0aW1lVmFsdWUsIGZpbGwgPSBFZHVjYXRpb24pKSArIA0KICBnZW9tX2JveHBsb3QoKSArIA0KICBsYWJzKHg9IkVkdWNhdGlvbiIseSA9ICJDdXN0b21lciBMaWZlIFRpbWUgVmFsdWUiLCBmaWxsPSJFZHVjYXRpb24iKSArIA0KICBnZ3RpdGxlKCJWaXN1YWxpemF0aW9uIG9mIENMViB3cnQgRWR1Y2F0aW9uIikNCmBgYA0KDQpgYGB7cn0NCmFnZ0RhdGEgPC0gYWdncmVnYXRlKHggPSBEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSwgYnk9bGlzdChFZHVjYXRpb24gPSBEYXRhX0FzdXJhbnNpJEVkdWNhdGlvbiksIEZVTiA9IHN1bSkNCg0KZ2dwbG90KGRhdGEgPSBhZ2dEYXRhLCBhZXMoeCA9IEVkdWNhdGlvbiwgeSA9IHByb3AudGFibGUoc3RhdChhZ2dEYXRhJHgpKSwgZmlsbCA9IEVkdWNhdGlvbiwgbGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQocHJvcC50YWJsZShzdGF0KGFnZ0RhdGEkeCkpKSkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgDQogIGdlb21fdGV4dChzdGF0ID0gJ2lkZW50aXR5JywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguOSksICB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIA0KICBsYWJzKHggPSAnRWR1Y2F0aW9uJywgeSA9ICdDTFYgaW4gUGVyY2VudGFnZScsIGZpbGwgPSAnRWR1Y2F0aW9uJykgKyANCiAgZ2d0aXRsZSgiQ0xWIERpc3RyaWJ1dGlvbiBieSBFZHVjYXRpb24iKQ0KYGBgDQoNCnBlbGFuZ2dhbiB0ZXJkaWRpZGsgKGRlbmdhbiBnZWxhciBzYXJqYW5hIGF0YXUgc2V0YXJhKSBsZWJpaCBiZXJoYXJnYSBkYXJpIHBhZGEgeWFuZyBsYWluLg0KDQo0LjAzIFBlbmdhcnVoIHN0YXR1cyBwZWtlcmphYW4gcGFkYSBuaWxhaSB3YWt0dSBoaWR1cCBwZWxhbmdnYW4gKENMVikNCg0KYGBge3J9DQpnZ3Bsb3QoRGF0YV9Bc3VyYW5zaSwgYWVzKHg9RW1wbG95bWVudFN0YXR1cywgeT0gQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBmaWxsID0gRW1wbG95bWVudFN0YXR1cykpICsgDQogIGdlb21fYm94cGxvdCgpICsgDQogIGxhYnMoeD0iRW1wbG95bWVudCBTdGF0dXMiLHkgPSAiQ3VzdG9tZXIgTGlmZSBUaW1lIFZhbHVlIiwgZmlsbD0iRW1wbG95bWVudCBTdGF0dXMiKSArIA0KICBnZ3RpdGxlKCJWaXN1YWxpemF0aW9uIG9mIENMViB3cnQgRW1wbG95bWVudCBTdGF0dXMiKQ0KYGBgDQoNCmBgYHtyfQ0KYWdnRGF0YSA8LSBhZ2dyZWdhdGUoeCA9IERhdGFfQXN1cmFuc2kkQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBieT1saXN0KEVtcGxveW1lbnRTdGF0dXMgPSBEYXRhX0FzdXJhbnNpJEVtcGxveW1lbnRTdGF0dXMpLCBGVU4gPSBzdW0pDQoNCmdncGxvdChkYXRhID0gYWdnRGF0YSwgYWVzKHggPSBFbXBsb3ltZW50U3RhdHVzLCB5ID0gcHJvcC50YWJsZShzdGF0KGFnZ0RhdGEkeCkpLCBmaWxsID0gRW1wbG95bWVudFN0YXR1cywgbGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQocHJvcC50YWJsZShzdGF0KGFnZ0RhdGEkeCkpKSkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgDQogIGdlb21fdGV4dChzdGF0ID0gJ2lkZW50aXR5JywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguOSksICB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIA0KICBsYWJzKHggPSAnRW1wbG95bWVudFN0YXR1cycsIHkgPSAnQ0xWIGluIFBlcmNlbnRhZ2UnLCBmaWxsID0gJ0VtcGxveW1lbnRTdGF0dXMnKSArIA0KICBnZ3RpdGxlKCJDTFYgRGlzdHJpYnV0aW9uIGJ5IEVtcGxveW1lbnRTdGF0dXMiKQ0KYGBgDQoNClBlbGFuZ2dhbiB5YW5nIGJlcmtlcmphIGxlYmloIGJlcmhhcmdhIGRhcmkgcGFkYSB5YW5nIGxhaW4gZGliYWRpbmdrYW4gZGVuZ2FuIHBlbGFuZ2dhbiBQZW5zaXVuYW4sIHBlbmdhbmdndWFyYW4sIGF0YXUgcGVueWFuZGFuZyBjYWNhdC4NCg0KNC4wNCBQZW5nYXJ1aCBnZW5kZXIgdGVyaGFkYXAgbmlsYWkgd2FrdHUgaGlkdXAgcGVsYW5nZ2FuIENsVg0KDQpgYGB7cn0NCmdncGxvdChEYXRhX0FzdXJhbnNpLCBhZXMoeD1HZW5kZXIsIHk9IEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSwgZmlsbCA9IEdlbmRlcikpICsgDQogIGdlb21fYm94cGxvdCgpICsgDQogIGxhYnMoeD0iR2VuZGVyIix5ID0gIkN1c3RvbWVyIExpZmUgVGltZSBWYWx1ZSIsIGZpbGw9IkdlbmRlciIpICsgDQogIGdndGl0bGUoIlZpc3VhbGl6YXRpb24gb2YgQ0xWIHdydCBHZW5kZXIiKQ0KYGBgDQoNCmBgYHtyfQ0KYWdnRGF0YSA8LSBhZ2dyZWdhdGUoeCA9IERhdGFfQXN1cmFuc2kkQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBieT1saXN0KEdlbmRlciA9IERhdGFfQXN1cmFuc2kkR2VuZGVyKSwgRlVOID0gc3VtKQ0KDQpnZ3Bsb3QoZGF0YSA9IGFnZ0RhdGEsIGFlcyh4ID0gR2VuZGVyLCB5ID0gcHJvcC50YWJsZShzdGF0KGFnZ0RhdGEkeCkpLCBmaWxsID0gR2VuZGVyLCBsYWJlbCA9IHNjYWxlczo6cGVyY2VudChwcm9wLnRhYmxlKHN0YXQoYWdnRGF0YSR4KSkpKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgZ2VvbV90ZXh0KHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC45KSwgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgDQogIGxhYnMoeCA9ICdHZW5kZXInLCB5ID0gJ0NMViBpbiBQZXJjZW50YWdlJywgZmlsbCA9ICdHZW5kZXInKSArIA0KICBnZ3RpdGxlKCJDTFYgRGlzdHJpYnV0aW9uIGJ5IEdlbmRlciIpDQoNCmBgYA0KDQpHZW5kZXIgdGlkYWsgbWVtaWxpa2kgcGVyYW4gZGFsYW0gbWVuZW50dWthbiBuaWxhaSBwZWxhbmdnYW4uIGJhaWsgcHJpYSBtYXVwdW4gd2FuaXRhIHRlcmxpaGF0IGJlcmhhcmdhLg0KDQo0LjA1IFBlbmdhcnVoIGxva2FzaSB0ZXJoYWRhcCBuaWxhaSB3YWt0dSBoaWR1cCBwZWxhbmdnYW4gKENMVikNCg0KYGBge3J9DQpnZ3Bsb3QoRGF0YV9Bc3VyYW5zaSwgYWVzKHg9TG9jYXRpb25Db2RlLCB5PSBDdXN0b21lckxpZmV0aW1lVmFsdWUsIGZpbGwgPSBMb2NhdGlvbkNvZGUpKSArIA0KICBnZW9tX2JveHBsb3QoKSArIA0KICBsYWJzKHg9IkxvY2F0aW9uIix5ID0gIkN1c3RvbWVyIExpZmUgVGltZSBWYWx1ZSIsIGZpbGw9IkxvY2F0aW9uIikgKyANCiAgZ2d0aXRsZSgiVmlzdWFsaXphdGlvbiBvZiBDTFYgd3J0IExvY2F0aW9uIikNCg0KYGBgDQoNCg0KYGBge3J9DQphZ2dEYXRhIDwtIGFnZ3JlZ2F0ZSh4ID0gRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUsIGJ5PWxpc3QoTG9jYXRpb25Db2RlID0gRGF0YV9Bc3VyYW5zaSRMb2NhdGlvbkNvZGUpLCBGVU4gPSBzdW0pDQoNCmdncGxvdChkYXRhID0gYWdnRGF0YSwgYWVzKHggPSBMb2NhdGlvbkNvZGUsIHkgPSBwcm9wLnRhYmxlKHN0YXQoYWdnRGF0YSR4KSksIGZpbGwgPSBMb2NhdGlvbkNvZGUsIGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHByb3AudGFibGUoc3RhdChhZ2dEYXRhJHgpKSkpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBnZW9tX3RleHQoc3RhdCA9ICdpZGVudGl0eScsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjkpLCAgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyANCiAgbGFicyh4ID0gJ0xvY2F0aW9uQ29kZScsIHkgPSAnQ0xWIGluIFBlcmNlbnRhZ2UnLCBmaWxsID0gJ0xvY2F0aW9uQ29kZScpICsgDQogIGdndGl0bGUoIkNMViBEaXN0cmlidXRpb24gYnkgTG9jYXRpb25Db2RlIikNCmBgYA0KDQpQZWxhbmdnYW4gcGVuZGVzYWFuIEt1cmFuZyBiZXJoYXJnYSBkYXJpIHBhZGEgcGVsYW5nZ2FuIFBlcmtvdGFhbg0KDQo0LjA2IFBlbmdhcnVoIFN0YXR1cyBQZXJrd2luYW4gdGVyaGFkYXAgTmlsYWkgd2FrdHUgaGlkdXAgcGVsYW5nZ2FuIA0KDQpgYGB7cn0NCmdncGxvdChEYXRhX0FzdXJhbnNpLCBhZXMoeD1NYXJpdGFsU3RhdHVzLCB5PSBDdXN0b21lckxpZmV0aW1lVmFsdWUsIGZpbGwgPSBNYXJpdGFsU3RhdHVzKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKyANCiAgbGFicyh4PSJNYXJpdGFsIFN0YXR1cyIseSA9ICJDdXN0b21lciBMaWZlIFRpbWUgVmFsdWUiLCBmaWxsPSJNYXJpdGFsIFN0YXR1cyIpICsgDQogIGdndGl0bGUoIlZpc3VhbGl6YXRpb24gb2YgQ0xWIHdydCBNYXJpdGFsIFN0YXR1cyIpDQpgYGANCg0KYGBge3J9DQphZ2dEYXRhIDwtIGFnZ3JlZ2F0ZSh4ID0gRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUsIGJ5PWxpc3QoTWFyaXRhbFN0YXR1cyA9IERhdGFfQXN1cmFuc2kkTWFyaXRhbFN0YXR1cyksIEZVTiA9IHN1bSkNCg0KZ2dwbG90KGRhdGEgPSBhZ2dEYXRhLCBhZXMoeCA9IE1hcml0YWxTdGF0dXMsIHkgPSBwcm9wLnRhYmxlKHN0YXQoYWdnRGF0YSR4KSksIGZpbGwgPSBNYXJpdGFsU3RhdHVzLCBsYWJlbCA9IHNjYWxlczo6cGVyY2VudChwcm9wLnRhYmxlKHN0YXQoYWdnRGF0YSR4KSkpKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgZ2VvbV90ZXh0KHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC45KSwgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgDQogIGxhYnMoeCA9ICdNYXJpdGFsU3RhdHVzJywgeSA9ICdDTFYgaW4gUGVyY2VudGFnZScsIGZpbGwgPSAnTWFyaXRhbFN0YXR1cycpICsgDQogIGdndGl0bGUoIkNMViBEaXN0cmlidXRpb24gYnkgTWFyaXRhbFN0YXR1cyIpDQpgYGANCg0KUGVsYW5nZ2FuIHlhbmcgc3VkYWggbWVuaWthaCBtZW1iZWxpIGxlYmloIGJhbnlhayBhc3VyYW5zaSBtb2JpbCBkYW4gbWVuYW1iYWggbmlsYWkgYmFnaSBwZXJzdWhhYW4uDQoNCjQuMDcgUGVuZ2FydWggamVuaXMgcG9saXMgdGVyaGFkYXAgY3VzdG9tZXIgbGlmZSB0aW1lIHZhbHVlIChjbHYpDQoNCmBgYHtyfQ0KZ2dwbG90KERhdGFfQXN1cmFuc2ksIGFlcyh4PVBvbGljeVR5cGUsIHk9IEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSwgZmlsbCA9IFBvbGljeVR5cGUpKSArIA0KICBnZW9tX2JveHBsb3QoKSArIA0KICBsYWJzKHg9IlBvbGljeSBUeXBlIix5ID0gIkN1c3RvbWVyIExpZmUgVGltZSBWYWx1ZSIsIGZpbGw9IlBvbGljeSBUeXBlIikgKyANCiAgZ2d0aXRsZSgiVmlzdWFsaXphdGlvbiBvZiBDTFYgd3J0IFBvbGljeSBUeXBlIikNCmBgYA0KDQpgYGB7cn0NCmFnZ0RhdGEgPC0gYWdncmVnYXRlKHggPSBEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSwgYnk9bGlzdChQb2xpY3lUeXBlID0gRGF0YV9Bc3VyYW5zaSRQb2xpY3lUeXBlKSwgRlVOID0gc3VtKQ0KDQpnZ3Bsb3QoZGF0YSA9IGFnZ0RhdGEsIGFlcyh4ID0gUG9saWN5VHlwZSwgeSA9IHByb3AudGFibGUoc3RhdChhZ2dEYXRhJHgpKSwgZmlsbCA9IFBvbGljeVR5cGUsIGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHByb3AudGFibGUoc3RhdChhZ2dEYXRhJHgpKSkpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBnZW9tX3RleHQoc3RhdCA9ICdpZGVudGl0eScsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjkpLCAgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyANCiAgbGFicyh4ID0gJ1BvbGljeVR5cGUnLCB5ID0gJ0NMViBpbiBQZXJjZW50YWdlJywgZmlsbCA9ICdQb2xpY3lUeXBlJykgKyANCiAgZ2d0aXRsZSgiQ0xWIERpc3RyaWJ1dGlvbiBieSBQb2xpY3lUeXBlIikNCmBgYA0KDQpQZWxhbmdnYW4geWFuZyBtZW1pbGlraSBQb2xpcyBQcmliYWRpIGxlYmloIGJlcmhhcmdhIGJhZ2kgcGVydXNhaGFhbiBkYXJpIHBhZGEgcGVtZW5nYW5nIFBvbGlzIEtvcnBvcmFzaSBkYW4gQXN1cmFuc2FpIEtodXN1cy4NCg0KIDQuMDggUGVuZ2FydWFoIEplbmlzIHBlbmF3YXJhbiBwZXJwYW5qYW5nYW4gdGVyaGFkYXAgbmlsYWkgdW11ciBwZWxhbmdnYW4gKENMVikNCg0KYGBge3J9DQpnZ3Bsb3QoRGF0YV9Bc3VyYW5zaSwgYWVzKHg9UmVuZXdPZmZlclR5cGUsIHk9IEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSwgZmlsbCA9IFJlbmV3T2ZmZXJUeXBlKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKyANCiAgbGFicyh4PSJSZW5ldyBPZmZlciBUeXBlIix5ID0gIkN1c3RvbWVyIExpZmUgVGltZSBWYWx1ZSIsIGZpbGw9IlJlbmV3IE9mZmVyIFR5cGUiKSArIA0KICBnZ3RpdGxlKCJWaXN1YWxpemF0aW9uIG9mIENMViB3cnQgUmVuZXcgT2ZmZXIgVHlwZSIpDQpgYGANCg0KYGBge3J9DQphZ2dEYXRhIDwtIGFnZ3JlZ2F0ZSh4ID0gRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUsIGJ5PWxpc3QoUmVuZXdPZmZlclR5cGUgPSBEYXRhX0FzdXJhbnNpJFJlbmV3T2ZmZXJUeXBlKSwgRlVOID0gc3VtKQ0KDQpnZ3Bsb3QoZGF0YSA9IGFnZ0RhdGEsIGFlcyh4ID0gUmVuZXdPZmZlclR5cGUsIHkgPSBwcm9wLnRhYmxlKHN0YXQoYWdnRGF0YSR4KSksIGZpbGwgPSBSZW5ld09mZmVyVHlwZSwgbGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQocHJvcC50YWJsZShzdGF0KGFnZ0RhdGEkeCkpKSkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgDQogIGdlb21fdGV4dChzdGF0ID0gJ2lkZW50aXR5JywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguOSksICB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIA0KICBsYWJzKHggPSAnUmVuZXdPZmZlclR5cGUnLCB5ID0gJ0NMViBpbiBQZXJjZW50YWdlJywgZmlsbCA9ICdSZW5ld09mZmVyVHlwZScpICsgDQogIGdndGl0bGUoIkNMViBEaXN0cmlidXRpb24gYnkgUmVuZXdPZmZlclR5cGUiKQ0KYGBgDQoNClBlbmF3YXJhbiAxIGRhbiBQZW5hd2FyYW4gMiBtZW5hcmlrIGxlYmloIGJhbnlhayBjdXN0b21lcg0KDQogNC4wOSBQZW5nYXJ1aCBzYWx1cmFuIHBlbmp1YWxhbiBwYWRhIG5pbGFpIHdha3R1IGhpZHVwIHBlbGFuZ2dhbiAoQ0xWKQ0KDQpgYGB7cn0NCmdncGxvdChEYXRhX0FzdXJhbnNpLCBhZXMoeD1TYWxlc0NoYW5uZWwsIHk9IEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSwgZmlsbCA9IFNhbGVzQ2hhbm5lbCkpICsgDQogIGdlb21fYm94cGxvdCgpICsgDQogIGxhYnMoeD0iU2FsZXMgQ2hhbm5lbCIseSA9ICJDdXN0b21lciBMaWZlIFRpbWUgVmFsdWUiLCBmaWxsPSJTYWxlcyBDaGFubmVsIikgKyANCiAgZ2d0aXRsZSgiVmlzdWFsaXphdGlvbiBvZiBDTFYgd3J0IFNhbGVzIENoYW5uZWwiKQ0KDQpgYGANCg0KYGBge3J9DQphZ2dEYXRhIDwtIGFnZ3JlZ2F0ZSh4ID0gRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUsIGJ5PWxpc3QoU2FsZXNDaGFubmVsID0gRGF0YV9Bc3VyYW5zaSRTYWxlc0NoYW5uZWwpLCBGVU4gPSBzdW0pDQoNCmdncGxvdChkYXRhID0gYWdnRGF0YSwgYWVzKHggPSBTYWxlc0NoYW5uZWwsIHkgPSBwcm9wLnRhYmxlKHN0YXQoYWdnRGF0YSR4KSksIGZpbGwgPSBTYWxlc0NoYW5uZWwsIGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHByb3AudGFibGUoc3RhdChhZ2dEYXRhJHgpKSkpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBnZW9tX3RleHQoc3RhdCA9ICdpZGVudGl0eScsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjkpLCAgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyANCiAgbGFicyh4ID0gJ1NhbGVzQ2hhbm5lbCcsIHkgPSAnQ0xWIGluIFBlcmNlbnRhZ2UnLCBmaWxsID0gJ1NhbGVzQ2hhbm5lbCcpICsgDQogIGdndGl0bGUoIkNMViBEaXN0cmlidXRpb24gYnkgU2FsZXNDaGFubmVsIikNCmBgYA0KDQpDYWxsIGNlbnRlciB0aWRhayBiZXJraW5lcmphIGJhaWsgZGliYWRpbmdrYW4gZGVuZ2FuIHNhbHVyYW4gbGFpbiBkaSBzZWx1cnVoIG5lZ2VyaSAoZGFsYW0gaGFsIGN1c3RvbWVyIGJlcm5pbGFpIHRpbmdnaSkNCg0KIDQuMTAgUGVuZ2FydWggS2VsYXMga2VuZGFyYWFuIHRlcmhhZGFwIG5pbGFpIHdha3R1IHVtdXIgcGVsYW5nZ2FuIChDTFYpDQoNCmBgYHtyfQ0KZ2dwbG90KERhdGFfQXN1cmFuc2ksIGFlcyh4PVZlaGljbGVDbGFzcywgeT0gQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBmaWxsID0gVmVoaWNsZUNsYXNzKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKyANCiAgbGFicyh4PSJWZWhpY2xlIENsYXNzIix5ID0gIkN1c3RvbWVyIExpZmUgVGltZSBWYWx1ZSIsIGZpbGw9IlZlaGljbGUgQ2xhc3MiKSArIA0KICBnZ3RpdGxlKCJWaXN1YWxpemF0aW9uIG9mIENMViB3cnQgVmVoaWNsZSBDbGFzcyIpDQpgYGANCg0KYGBge3J9DQphZ2dEYXRhIDwtIGFnZ3JlZ2F0ZSh4ID0gRGF0YV9Bc3VyYW5zaSRDdXN0b21lckxpZmV0aW1lVmFsdWUsIGJ5PWxpc3QoVmVoaWNsZUNsYXNzID0gRGF0YV9Bc3VyYW5zaSRWZWhpY2xlQ2xhc3MpLCBGVU4gPSBzdW0pDQoNCmdncGxvdChkYXRhID0gYWdnRGF0YSwgYWVzKHggPSBWZWhpY2xlQ2xhc3MsIHkgPSBwcm9wLnRhYmxlKHN0YXQoYWdnRGF0YSR4KSksIGZpbGwgPSBWZWhpY2xlQ2xhc3MsIGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHByb3AudGFibGUoc3RhdChhZ2dEYXRhJHgpKSkpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBnZW9tX3RleHQoc3RhdCA9ICdpZGVudGl0eScsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjkpLCAgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyANCiAgbGFicyh4ID0gJ1ZlaGljbGVDbGFzcycsIHkgPSAnQ0xWIGluIFBlcmNlbnRhZ2UnLCBmaWxsID0gJ1ZlaGljbGVDbGFzcycpICsgDQogIGdndGl0bGUoIkNMViBEaXN0cmlidXRpb24gYnkgVmVoaWNsZUNsYXNzIikNCmBgYA0KDQpQZWxhbmdnYW4geWFuZyBtZW1pbGlraSBtb2JpbCBlbXBhdCBwaW50dSBkYW4gU1VWIGxlYmloIGJlcmhhcmdhDQoNCg0KIDQuMTEgUGVuZ2FydWggdWt1cmFuIGtlbmRhcmFhbiB0ZXJoYWRhcCBuaWxhaSB1bXVyIHBlbGFuZ2dhbiAoQ0xWKQ0KDQpgYGB7cn0NCmdncGxvdChEYXRhX0FzdXJhbnNpLCBhZXMoeD1WZWhpY2xlU2l6ZSwgeT0gQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBmaWxsID0gVmVoaWNsZVNpemUpKSArIA0KICBnZW9tX2JveHBsb3QoKSArIA0KICBsYWJzKHg9IlZlaGljbGUgU2l6ZSIseSA9ICJDdXN0b21lciBMaWZlIFRpbWUgVmFsdWUiLCBmaWxsPSJWZWhpY2xlIFNpemUiKSArIA0KICBnZ3RpdGxlKCJWaXN1YWxpemF0aW9uIG9mIENMViB3cnQgVmVoaWNsZSBTaXplIikNCmBgYA0KDQpgYGB7cn0NCmFnZ0RhdGEgPC0gYWdncmVnYXRlKHggPSBEYXRhX0FzdXJhbnNpJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSwgYnk9bGlzdChWZWhpY2xlU2l6ZSA9IERhdGFfQXN1cmFuc2kkVmVoaWNsZVNpemUpLCBGVU4gPSBzdW0pDQoNCmdncGxvdChkYXRhID0gYWdnRGF0YSwgYWVzKHggPSBWZWhpY2xlU2l6ZSwgeSA9IHByb3AudGFibGUoc3RhdChhZ2dEYXRhJHgpKSwgZmlsbCA9IFZlaGljbGVTaXplLCBsYWJlbCA9IHNjYWxlczo6cGVyY2VudChwcm9wLnRhYmxlKHN0YXQoYWdnRGF0YSR4KSkpKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgZ2VvbV90ZXh0KHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC45KSwgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgDQogIGxhYnMoeCA9ICdWZWhpY2xlU2l6ZScsIHkgPSAnQ0xWIGluIFBlcmNlbnRhZ2UnLCBmaWxsID0gJ1ZlaGljbGVTaXplJykgKyANCiAgZ2d0aXRsZSgiQ0xWIERpc3RyaWJ1dGlvbiBieSBWZWhpY2xlU2l6ZSIpDQpgYGANCg0KQ3VzdG9tZXIgeWFuZyBtZW1pbGlraSBrZW5kYXJhYW4gdWt1cmFuIE1lbmVnYWggbWVuYW1iYWggbmlsYWkgbGViaWgsIGJhZ2kgcGVydWFzYWhhYW4gQXN1cmFuc2kNCg0KIyA0LjEyIFBlbmdhcnVoIE5lZ2FyYSBwYWRhIG5pbGFpIFdha3R1IGhpZHVwIHBlbGFuZ2dhbiAoQ0xWKQ0KDQpgYGB7cn0NCmdncGxvdChEYXRhX0FzdXJhbnNpLCBhZXMoeD1TdGF0ZSwgeT0gQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBmaWxsID0gU3RhdGUpKSArIA0KICBnZW9tX2JveHBsb3QoKSArIA0KICBsYWJzKHg9IlN0YXRlIix5ID0gIkN1c3RvbWVyIExpZmUgVGltZSBWYWx1ZSIsIGZpbGw9IlN0YXRlIikgKyANCiAgZ2d0aXRsZSgiVmlzdWFsaXphdGlvbiBvZiBDTFYgd3J0IFN0YXRlIikNCg0KYGBgDQoNCmBgYHtyfQ0KYWdnRGF0YSA8LSBhZ2dyZWdhdGUoeCA9IERhdGFfQXN1cmFuc2kkQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBieT1saXN0KFN0YXRlID0gRGF0YV9Bc3VyYW5zaSRTdGF0ZSksIEZVTiA9IHN1bSkNCg0KZ2dwbG90KGRhdGEgPSBhZ2dEYXRhLCBhZXMoeCA9IFN0YXRlLCB5ID0gcHJvcC50YWJsZShzdGF0KGFnZ0RhdGEkeCkpLCBmaWxsID0gU3RhdGUsIGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KHByb3AudGFibGUoc3RhdChhZ2dEYXRhJHgpKSkpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIA0KICBnZW9tX3RleHQoc3RhdCA9ICdpZGVudGl0eScsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjkpLCAgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyANCiAgbGFicyh4ID0gJ1N0YXRlJywgeSA9ICdDTFYgaW4gUGVyY2VudGFnZScsIGZpbGwgPSAnU3RhdGUnKSArIA0KICBnZ3RpdGxlKCJDTFYgRGlzdHJpYnV0aW9uIGJ5IFN0YXRlIikNCmBgYA0KDQpQZWxhbmdnYW4gQ2FsaWZvcm5pYSBsZWJpaCBiZXJoYXJnYQ0KDQogNC4xMyBQZW5hZ2FydWgga2ViaWpha2FuIHRlcmhhZGFwIG5pbGFpIHdha3R1IGhpZHVwIGN1c3RvbWVyKENMVikNCg0KYGBge3J9DQpnZ3Bsb3QoRGF0YV9Bc3VyYW5zaSwgYWVzKHg9UG9saWN5LCB5PSBDdXN0b21lckxpZmV0aW1lVmFsdWUsIGZpbGwgPSBQb2xpY3kpKSArIA0KICBnZW9tX2JveHBsb3QoKSArIA0KICBsYWJzKHg9IlBvbGljeSIseSA9ICJDdXN0b21lciBMaWZlIFRpbWUgVmFsdWUiLCBmaWxsPSJTdGF0ZSIpICsgDQogIGdndGl0bGUoIlZpc3VhbGl6YXRpb24gb2YgQ0xWIHdydCBQb2xpY3kiKQ0KYGBgDQoNCmBgYHtyfQ0KYWdnRGF0YSA8LSBhZ2dyZWdhdGUoeCA9IERhdGFfQXN1cmFuc2kkQ3VzdG9tZXJMaWZldGltZVZhbHVlLCBieT1saXN0KFBvbGljeSA9IERhdGFfQXN1cmFuc2kkUG9saWN5KSwgRlVOID0gc3VtKQ0KDQpnZ3Bsb3QoZGF0YSA9IGFnZ0RhdGEsIGFlcyh4ID0gUG9saWN5LCB5ID0gcHJvcC50YWJsZShzdGF0KGFnZ0RhdGEkeCkpLCBmaWxsID0gUG9saWN5LCBsYWJlbCA9IHNjYWxlczo6cGVyY2VudChwcm9wLnRhYmxlKHN0YXQoYWdnRGF0YSR4KSkpKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgZ2VvbV90ZXh0KHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC45KSwgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgDQogIGxhYnMoeCA9ICdQb2xpY3knLCB5ID0gJ0NMViBpbiBQZXJjZW50YWdlJywgZmlsbCA9ICdQb2xpY3knKSArIA0KICBnZ3RpdGxlKCJDTFYgRGlzdHJpYnV0aW9uIGJ5IFBvbGljeSIpDQpgYGANCg0KS2ViaWpha2FuIEwzIFByaWJhZGkgbWVuYW1iYWggbmlsYWkgYmFnaSBwZXJ1YXNhaGFhbg0KDQogNS4gQW5hbGlzaXMgUmVncmVzaSBkZW5nYW4gdmFyaWFiZWwga29udGludQ0KDQoxLiBWYXJpYmVsIERlcGVuZGVuIENMViBLb250aW51IGRhbiB0ZWxhaCBtZWxpaGF0IGJhaHdhIHZhcmlhYmVsIGluZGVwZW5kZW4gc2ViYWdpYW4gYmVzYXIgdGVyZ2FudHVuZyBzZWNhcmEgbGluaWVyIGRlbmdhbiBhbGdvcml0bWEgUmVncmVzaSBMaW5pZXIgYWRhbGFoIHlhbmcgdGVyYmFpayB1bnR1ayBqZW5pcyBEYXRhIGluaSANCg0KMi4gVHVqdWFuIGRhcmkgUmVncmVzaSBMaW5lciBhZGFsYWggdW50dWsgbWVuZW11a2FuIGdhcmlzIHlhbmcgcGFsaW5nIGNvY29rIHlhbmcgZGFwYXQgc2VjYXJhIGFrdXJhdCBtZW1wcmVkaWtzaSBvdXRwdXQgdW50dWsgdmFyaWFiZWwgZGVwZW5kZW4ga29udGludS4NCg0KMy4gTWVuZ2hhcHVzIHZhcmlhYmVsIGt1YWxpdGF0aWYga2FyZW5hIFJlZ3Jlc2kgTGluaWVyIGJla2VyamEgcGFsaW5nIGJhaWsga2V0aWthIHZhcmlhYmVsIGJlcmlzaWZhdCBLdWFudGl0YXRpZi9OdW1lcmlrLiBwZXJ1c2FoYWFuIGhhbnlhIG1lbWlsaWtpIHZhcmlhYmVsIGluZGVwZW5kZW4ga29udGludS4NCg0KYGBge3J9DQpkYXRhQ29udGlub3VzIDwtIGRwbHlyOjpzZWxlY3RfaWYoRGF0YV9Bc3VyYW5zaSwgfiFpcy5mYWN0b3IoLikpDQpkYXRhQ29udGlub3VzIDwtIGRhdGFDb250aW5vdXNbLC1jKDEsIDMsIDQsIDUsIDYsIDcsIDgsIDEwLCAxMSwgMTcsIDE4LCAxOSwgMjAsIDIyLCAyMyldDQpzdHIoZGF0YUNvbnRpbm91cykNCmBgYA0KDQpgYGB7cn0NCmRpbShkYXRhQ29udGlub3VzKQ0KYGBgDQoNCkJlcmlrdXQgbGFuZ2thaC1sYW5na2FoIHlhbmcgZGlpa3V0aSB1bnR1ayBtZW1iYWd1biBtb2RlbCByZWdyZXNpIDoNCjEuIHBpc2Foa2FuIGRhdGEgZGFsYW0gc2V0IHBlbGF0aWhhbiBkYW4gcGVuZ3VqaWFuIC4gDQoyLiBUcmFuaW5nIGRhdGFzZXQgYWRhbGFoIHVudHVrIG1lbWJhZ3VuIG1vZGVsIGRhbiB0ZXN0aW5nIGRhdGEgc2V0IHVudHVrIG1lbmd1amkgbW9kZWwgcGFkYSBkYXRhIHlhbmcgdGlkYWsgYmVybGFiZWwuDQozLiBCYWd1biBtb2RlbCByZWdyZXNpIGxpbmllciBtZW5nZ3VhbmthbiBzZW11YSB2YXJpYWJlbCBpbmRlcGVuZGVuIGJlcmtlbGFuanVhdGFuLiANCjQuIEFuYWxpc2lzIHNpZ2luaWZpa2Fuc2kgdmFyaWFiZWtsIGluZGVwZW5kZW4gZGFuIGppa2EgcGVybHUgamFsYW5rYW4ga2VtYmFsaSBtb2RlbC4NCg0KIE1lbWlzYWhrYW4gRGF0YSBkYWxhbSBzZXQgcGVsYXRpaGFuIGRhbiBwZW5ndWppYW4uDQoNClRyYW5pbmcgc2V0IGFkYWxhaCB1bnR1ayBtZW1iYWd1biBtb2RlbCBkYW4gdGVzdGluZyBzZXQgdW50dWsgbWVuZ3VqaSBtb2RlbCBwYWRhIGRhdGEgeWFuZyB0aWRhayBiZXJsYWJlLg0KDQpgYGB7cn0NCnRyYWluSW5kZXggPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihkYXRhQ29udGlub3VzJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSwgcD0wLjgwLCBsaXN0ID0gRkFMU0UpDQoNCnByaW50KHRyYWluSW5kZXgpDQpgYGANCg0KYGBge3J9DQojIDgwJSBUcmFuaW5nIGt1bXB1bGFuIGRhdGEgdW50dWsgdW50dWsgYW5saXNpcyByZWdyZXNpIA0KaW5zdXJuY1RyYWluIDwtIGRhdGFDb250aW5vdXNbdHJhaW5JbmRleCxdDQpgYGANCg0KYGBge3J9DQojIERhdGFzZXQgdWppIDIwICUgIHlhbmcgdGVyc2lzYSB1bnR1ayBwZW5ndWppYW4gDQppbnN1cm5jVGVzdCA8LSBkYXRhQ29udGlub3VzWy10cmFpbkluZGV4LF0NCmBgYA0KDQpgYGB7cn0NCmRpbShkYXRhQ29udGlub3VzKQ0KYGBgDQoNCmBgYHtyfQ0KZGltKGluc3VybmNUcmFpbikNCmBgYA0KDQpgYGB7cn0NCmRpbShpbnN1cm5jVGVzdCkNCmBgYA0KDQogTGluZWlyIFJlZ3Jlc3Npb24NCg0KYGBge3J9DQojIFJlZ3Jlc3Npb24NCiMgTG0gZGlndW5ha2FuIHVudHVrIG1lbnllc3VhaWthbiBtb2RlbCBsaW5pZXIuIGluaSBkYXBhdCBkaWd1YW5ha24gdW50dWsgbWVsYWt1a2FuIHJlZ3Jlc2ksIGFuYWxpc2lzIHZhcmlhbnNpIHN0cmF0YSBkYW4gYW5hbGlzaXMga292YXJpYW5zDQoNCiMgTWVtYnVhdCBtb2RlbCByZWdyZXNpIGxpbmllciBtZW5nZ3VuYWthbiBzZW11YSB2YXJpYWJlbCBpbmRlcGVuZGVuIGJlcmtlbGFuanV0YW4NCg0KZml0IDwtIGxtKGluc3VybmNUcmFpbiRDdXN0b21lckxpZmV0aW1lVmFsdWUgfi4sIGRhdGEgPSBpbnN1cm5jVHJhaW4pIA0Kc3VtbWFyeShmaXQpDQpgYGANCg0KIDUuMS4xIE1vZGVsIEludGVycHJldGFzaSANCg0KSGlwb3N0ZXNpcyBOVUxMIC0gdGlkYWsgYWFkYSB2YXJhaWFiZWwgaW5kZXBlbmRlbiB5YW5nIHNpZ25pZmlrYW4gdW50dWsgQ0xWLg0KDQpIaXBvdGVzaXMgQWx0ZXJuYXRpZiAtIFNldGlkYWtueWEgc2FsYWggc2F0dSB2YXJpYWJlbCBpbmRlcGVuZGVuIHNpZ25pZ2lrYW4gZGFuIGRhcGF0IG1lbXBlbmdhcnVoaSBDTFYuDQoNCjEuIHAtdmFsdWUgbW9kZWwgbGViaWgga2VjaWwgZGFyaSAwLDA1LCBzZWhpbmdnYSBwYWxpbmcgdGlkYWsgc2FsYWggc2F0dSB2YXJpYWJlbCBpbmRlcGVuZGVuIHNpZ25pZmlrYW4uIA0KDQoyLiBwLXZhbHVlIGRhcmkgTW9udGhseVByZW1pdW1BdXRvLCBOdW1iZXJvZk9wZW5Db21wbGFpbnRzIGRhbiBOdW1iZXJvUG9saWNlaWVzIEt1cmFuZyBkYXJpIDAsMDUgc2VoaW5nZ2EgbWVub2xhayBoaXBvdGVzaXMgbm9sIHNlaGluZ2dhIHBhbGluZyB0aWRhayBzYWxhaCBzYXR1IGRhdGkgdmFyaWFiZWwgYmViZWFzIHRlcnNlYnV0IHNpZ25pZmlrYW4gZGFuIGRhcGF0IG1lbXBlbmdhcnVoaSBDTFYuDQoNCg0KMy4gTmFtdW4gUiBrdWFkcmF0IHNhbmdhdCByZW5kYWgsIGhhbnlhIDE1LDA0JSB2YXJpYW5zIHlhbmcgZGl0ZW11a2FuIGRpIENMViB5YW5nIGRhcGF0IGRpamVsYXNrYW4gb2xlaCBQZW5kYXBhdGFuLCBNUEEsIEJ1bGFuLCBzZWphayBrbGFpbSB0ZXJrYWhpciAsIGJ1bGFuIHNlamFrIGF3YWwga2ViaWpha2FuLCBqdW1sYWgga2VsdWhhbiB0ZXJidWthLCBqdW1sYWgga2ViaWpha2FuLCBUQ0EuDQoNCjQuIERpc2VzdWFpa2FuIFIga3VhZHJhdCBhZGFsYWxoIDAsMTUzMiB5YW5nIGxlYmloIGtlY2lsIGRhcmkgUiBrdWFkYXJ0Lg0KDQo1LiBLZXNhbGFoYW4gc3RhbmRhcnQgcmVzaWR1YWwgYWRhbGFoIDYzMTUgeWFuZyBzYW5nYXQgdGluZ2dpLCBzZWhpbmdnYSBjbHYgeWFuZyBzZWJlbmFyeWEgYWthbiBtZW55aW1wYW5nIGRhcmkgZ2FyaXMgcmVncmVzaSBzZWJlbmFybnlhIGRlbmdhbiByYXRhLXJhdGEgNjMxNS4gc2VtYWtpbiBrZWNpbCBrZXNhbGFoYW4gc3RhbmRhcnQsIHNlbWFraW4gc2VkaWtpdCBwZW55ZWJhcmFuIGRhbiBzZW1ha2luIGJlc2FyIGtlbXVuZ2tpbmFuIHJhdGEtcmF0YSBzYW1wZWwgbWVuZGVrYXRpIHJhdGEtcmF0YSBzYW1wZWwuIERlbmdhbiBoYWwgZGVtaWtpYW4ga2VzYWxhaGFuIHN0YW5kYXIga2VjaWwgYWRhbGFoIEhhbCB5YW5nIGJhaWsuDQoNCjYuIEtlc2VuamFuZ2FuIGFudGFyYSBSLWt1YWRyYXQgZGFuIGRpc2VzdWFpa2FuIFIta3VhZHJhdCBoYW55YSAxLDUgJSBpdHUgYmFndXMuIGJpc2FueWEgc2VtYWtpbiBiYW55YWsgdmFyaWFiZWwgdGlkYWsgc2lnbmlmaWthbiB5YW5nIGFuZGEgdGFtYmFoa2FuIGtlIGRhbGFtIG1vZGVsLCBrZXNlbmphbmdhbiBhbnRhcmEgZHVhIG1lbmluZ2thdC4NCg0KNy4gRi1zdGF0aXN0aWsgOiA2LDk1OCAtIFNlbWFraW4gcmVuZGFoIEYtc3RhdGlzdGlrLCBzZW1ha2luIG1lbmRla2F0aSBtb2RlbCB5YW5nIHRpZGFrIHNpZ25maWthbi4gSmFkaSBGLXN0YXRpc3RpayByZW5kYWggYmVyYXJ0aSBtb2RlbCB0aWRhayB0ZXJsYWx1IHNpZ25pZmlrYW4uDQoNCg0KIyA1LjEuMiBKYWxhbmthbiBVbGFuZyBNb2RlbCANCg0KQWRhIGxlYmloIGRhcmkgc2F0dSB2YXJpYWJlbCB0aWRhayBzaWduaWZpa2FuIGRhbGFtIG1vZGVsLCBzZWhpbmdnYSBwZXJsdSBtZW5qYWxhbmthbiBtb2RlbCBsYWdpIGRlbmdhbiBoYW55YSB2YXJpYWJlbCBzaWduaWZpa2FuLg0KDQoNCmBgYHtyfQ0KbmV3X2ZpdCA8LSBsbShpbnN1cm5jVHJhaW4kQ3VzdG9tZXJMaWZldGltZVZhbHVlIH4gDQogICAgICAgICAgICAgIE1vbnRobHlQcmVtaXVtQXV0byArIE51bWJlcm9mT3BlbkNvbXBsYWludHMgKyBOdW1iZXJvZlBvbGljaWVzICsgVG90YWxDbGFpbUFtb3VudCwgDQogICAgICAgICAgICAgIGRhdGEgPSBpbnN1cm5jVHJhaW4pIA0Kc3VtbWFyeShuZXdfZml0KQ0KYGBgDQoNClBlcnNhbWFhbiBnYXJpcyBSZWdyZXNpIHlhbmcgZGlwZXJraXJha2FuIGRhcGF0IGRpdHVsaXMgc2ViYWdhaSBiZXJpa3V0IDogDQoNCkNMViA9IDU4Miw5ICsgODIsNiBNUEEgLSAyNDMsNCBub09DICsgNzUsMCBOb1AgLSAwLDkgVENBIA0KDQpIaXBvdGVzaXMgTnVsbCAtIHRpZGFrIGFkYSB2YXJpYWJlbCBpbmRlcGVuZGVuIHlhbmcgc2lnbmlma2FuIHVudHVrIENMVi4NCg0KSGlwb3Rlc2lzIEFsdGVybmF0aWYgLSBzZXRpZGFrbnlhIHNhbGFoIHNhdHUgdmFyaWFiZWwgaW5kZXBlbmRlbiBzaWduaWZpa2FuIGRhbiBkYXBhdCBtZW1wZW5nYXJ1aGkgQ0xWLg0KDQoxLiBwLXZhbHVlIGRhcmkgTW9udGhseVByZW1pdW1BdXRvLCBOdW1iZXJvZk9wZW5Db21wbGFpbnRzLCBOdW1iZXJvZlBvbGljaWVzIGRhbiBUb3RhbENsYWltQW1vdW50IGt1cmFuZyBkYXJ1IDAsMDUgc2VoaW5nZ2EgYmVyZGFtcGFrIHNpZ25pZmlrYW4gdGVyaGFkYXAgc2lnbmlmaWthbiB0ZXJoYWRhcCBDTFYuIA0KDQoyLiBrb2VmaXNpZW4gVmFyaWFiZWwgSW5kZXBlbmRlbiA6LQ0KDQppLlNheWEsIHByZW1pdW0gQnVsYW5hbk90b21hc2lzOiA4Ni40NDc4LiBQZW5pbmdrYXRhbiBzYXR1IHVuaXQgZGkgTW9udGx5IFByZW1pdW1Bb3R1IGFrYW4gbWVuaW5na2F0a2FuIENMViBzZWJlc2FyIDg2LDQ0NzgNCg0KaWkuSnVtbGFoIGtlbHVhaGFuIFRlcmJ1a2EgOiAtMTk5LjM1MjYsIFBlbmluZ2thdGFuIHNhdHUgdW5pdCBkYWxhbSBOdW1iZXJvZk9wZW5Db21wbGFpbnRzIGFrYW4gbWVudXJ1bmthbiBDTFYgc2ViZXNhciAxOTksMzUyNg0KDQppaWkuIEp1bWxhaCBrZWJpamFrYW4gOjc2LjM4NjEuIFBlbmluZ2thdGFuIHNhdHUgdW5pdCBkYWxhbSBOdW1iZXJvZlBvbGljaWVzIGFrYW4gbWVuaW5na2F0a2FuIENMViBzZWJlc2FyIDc2LDM4NjEuDQoNCmlWLiBUb3RhbENsYWltQW1vdW50IDogLTEsMDQ0NS4gc2F0dSB1bml0IHBlbmluZ2thdGFuIFRvdGFsQ2xhaW1BbW91bnQgYWthbiBiZXJrdXJhbmcgMSwwNDQ1Lg0KDQozLiBzZWhpbmdnYSBuYXNhYmFoIGRlbmdhbiBqdW1sYWggcG9saXMgeWFuZyBsZWJpaCBiYW55YWsgZGVuZ2FuIHByZW1pIGJ1bGFuYW4geWFuZyB0aW5nZ2kgYWthbiBtZW5hbWJhaCBuaWxhaSBsZWJpaCBiYWdpIHBlcnVzYWhhbi4NCg0KNC4gZGlzaXNpIGxhaW4gLCBwZW5nYWR1YW4gdGVyYnVrYSBjdXN0b21lcnNkYW4ganVtbGFoIGtsYWltIGxlYmloIGJhbnlhayBha2FuIG1lbnVydW5rYW4gQ0xWLiANCg0KNS4gUiBrdWFkcmF0IHNlYmVzYXIgMCwxNjU2IHlhbmcgYmVyYXJ0aSAxNiw1NiUgdmFyaWFiZWwgdGVyaWthdCBkaWplbGFza2FuIG9sZWggdmFyaWFiZWwgYmViYXMuIA0KDQo2LiBkaXNlc3VhaWthbiBSIGt1YWRyYXQgYWRhbGFoIDAsMTY1MiB5YW5nIGt1cmFuZyBkYXJpIFIga3VhZHJhdC4NCg0KDQpQcmVkaWtzaSBuaWxhaSBDTFYgdW50dWsgc2VtdWEgb2JzZXJ2YXNpIGJlcmRhc2Fya2FuIG1vZGVsIHJlZ3Jlc2kgdGVyaGl0dW5nIGRpYXRhcy4NCg0KYGBge3J9DQpwcmVkaWN0ZWRDTFYgPC0gcHJlZGljdChuZXdfZml0KSAgDQojcHJpbnQgcHJlZGljdGVkIENMVi4NCnByaW50KHByZWRpY3RlZENMVlsxOjEwXSkNCmBgYA0KDQpgYGB7cn0NCiNwcmludCBhY3R1YWwgQ0xWIHRvIGNvbXBhcmUgaXQgd2l0aCBhYm92ZSBjYWxjdWxhdGVkIHByZWRpY3RlZCBDTFYuDQpwcmludChpbnN1cm5jVHJhaW4kQ3VzdG9tZXJMaWZldGltZVZhbHVlWzE6MTBdKQ0KYGBgDQoNCkhpdHVuZyBrZXNhbGFoYW4gOiBQZXJiZWRhYW4gYW50YXJhIENMViBha3R1YWwgZGFuIENMViB5YW5nIGRpcHJlZGlrc2kuDQoNCmBgYHtyfQ0KcmVzaWR1YWxzQ0xWIDwtIHJlc2lkdWFscyhuZXdfZml0KQ0KcHJpbnQocmVzaWR1YWxzQ0xWWzE6MTBdKQ0KYGBgDQoNClZhaWRhc2kgbW9kZWwgcGFkYSBkYXRhc2V0IHVqaQ0KDQpgYGB7cn0NCnByZWRpY2F0ZWRUZXN0RGF0YT1wcmVkaWN0KG5ld19maXQsaW5zdXJuY1Rlc3QpDQpwcmludChwcmVkaWNhdGVkVGVzdERhdGFbMToxMF0pDQpgYGANCg0KUGVyYmFkaW5nYW4gYW50YXJhIGhhc2lsIGFrdHVhbCBkYW4gcHJlZGlrc2kgDQoNCmBgYHtyfQ0KSW5zdXJhbmNlVHJhaW5EYXRhIDwtIGNiaW5kKGluc3VybmNUcmFpbixwcmVkaWN0ZWRDTFYscmVzaWR1YWxzQ0xWKQ0KaGVhZChJbnN1cmFuY2VUcmFpbkRhdGEpDQpgYGANCg0KIE1lbmdoaXR1bmcgdGluZ2thdCBrZXNhbGFoYW4gYXRhdSBNQVBFDQoNCmBgYHtyfQ0KRXJyb3JSYXRlIDwtIGFicygoSW5zdXJhbmNlVHJhaW5EYXRhJEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSAtIEluc3VyYW5jZVRyYWluRGF0YSRwcmVkaWN0ZWRDTFYpLyhJbnN1cmFuY2VUcmFpbkRhdGEkQ3VzdG9tZXJMaWZldGltZVZhbHVlKSoxMDApDQpwcmludChFcnJvclJhdGVbMToxMF0pDQpgYGANCg0KYGBge3J9DQpJbnN1cmFuY2VUcmFpbkRhdGEgPC0gY2JpbmQoSW5zdXJhbmNlVHJhaW5EYXRhLCBFcnJvclJhdGUpDQpoZWFkKEluc3VyYW5jZVRyYWluRGF0YSkNCmBgYA0KDQogTWVuZ2hpdHVuZyByYXRhLXJhdGEgdGluZ2thdCBrZXNhbGFoYW4gDQoNCmBgYHtyfQ0KbWVhbihJbnN1cmFuY2VUcmFpbkRhdGEkRXJyb3JSYXRlLCBuYS5ybSA9IFRSVUUpDQpgYGANCg0KUmF0YS1yYXRhIHRpbmdrYXQga2VzYWxhaGFuIG1vZGVsIGFkYWxhaCA2MCw0MyUgeWFuZyB0aW5nZ2kgZGFuIGRhcGF0IG1lbmdhdGFrYW4gYmFod2EgbW9kZWwgdGlkYWsgYmVnaXR1IGJhaWsuDQoNCg0KIzUuMiBBbmFsaXNpcyBSZXNpZHUNCg0KYGBge3J9DQpoaXN0KEVycm9yUmF0ZSwgY29sID0gImJsdWUiKQ0KYGBgDQoNCmBgYHtyfQ0KYm94cGxvdChFcnJvclJhdGUpDQpgYGANCg0KUGVyaWtzYSBub3JtYWxpdGFzIGVycm9yL3Jlc2lkdWFsIHRlcm0gKHJlZ3Jlc2kgbGluaWVyIG1lbmdhc3Vtc2lrYW4gYmFod2EgZXJyb3IgdGVyZGlzdHJpYnVzaSBub3JtYWwuKQ0KDQpIaXBvdGVzaXMgTnVsbCAtIEtlc2FsYWhhbiB0ZXJkaXN0cmlidXNpIG5vcm1hbC4NCg0KQWx0IEh5cG90aGVzZSAtIGtlc2FsYWhhbiB0aWRhayB0ZXJkaXN0cmlidXNpIHNlY2FyYSBub3JtYWwuDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KHJlc2lkdWFsc0NMVlswOjUwMDBdKQ0KYGBgDQoNCnAtdmFsdWUgKDAsMDA4MzcpIDwgMCwwNSwgaGlwb3Rlc2lzIG51bGwgZGl0b2xhay4gc2VoaW5nZ2Ega2VzYWxhaGFuIHRpZGFrIHRlcmRpc3RyaWJ1c2kgbm9ybWFsLg0KDQoNCmBgYHtyfQ0KaGlzdChyZXNpZHVhbHNDTFYsY29sID0gImdyZWVuIikNCmBgYA0KDQogUmVzaWR1YWwgdnMgRml0dGVkIFBsb3QNCg0KYGBge3J9DQpwbG90KG5ld19maXQsIHdoaWNoPTEsIGNvbD1jKCJibHVlIikpDQpgYGANCg0KIDYuIFBlbmd1amlhbiBhc3Vtc2kgYW5hbGlzaXMgcmVncmVzaSBsaW5pZXINCg0KTWVuZGV0ZWtzaSBtdWx0aWtvbGluZWFyaXRhcy0gbWVtZXJpa3NhIGtvcmVsYXNpIGFudGFyYSB2YXJpYWJlbCBpbmRlcGVuZGVuLg0KDQpEYWxhbSBtb2RlbCBoYW5heSB2YXJpYWJlbCBpbmRlcGVuZGVuIHlhbmcgaGFydXMgYWRhIHlhbmcgdGlkYWRrIGJlcmtvcmVsYXNpIHNhdHUgc2FtYSBsYWluLiBpbmkgZGlsYWt1a2FuIGRlbmdhbiBtZW5nZ3VhbmFrYW4gTWF0cmlrcyBLb3JlbGFzaS4NCg0KYGBge3J9DQpjb3IoSW5zdXJhbmNlVHJhaW5EYXRhKSANCmBgYA0KDQpgYGB7cn0NCiMgVmFyaWFuY2UgSW5mbGF0aW9uIEZhY3RvcnMNCmNhcjo6dmlmKG5ld19maXQpDQpgYGANCg0KVmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvciAoVklGIGFkYWxhaCB1a3VyYW4gYmVzYXJueWEgbXVsdGlrb2xpbmVhcml0YXMgZGFsYW0gc2VrdW1wdWxhbiB2YXJpYWJlbCByZWdyZXNpIGJlcmdhbmRhLg0KDQpqaWthIHRlcmRhcGF0IGtvcmVsYXNpIHlhbmcgdGluZ2dpIGFudGFyYSBkdWEgdmFyaWFiZWwgYmViYXMobXVsdGlrb2xpbmVhcml0YXMgdGluZ2dpKSwgbWFrYSBzYXlhIHRpZGFrIGFrYW4gZGFwYXQgbWVtaXNha2Foa2FuIHBlbmdhcnVoIG1hc2luZy1tYXNpbmcgdmFyaWFiZWwgYmViYXMgdGVyaGFkYXAgdmFyaWFiZWwgdGVyaWthdC4NCg0KS2FyZW5hIG11bHRpa29saW5lYXJpdGFzLCBzYXlhIHRpZGFrIGRhcGF0IG1lbmRlZmluaXNrYW4gZGFtcGFrIGxlbmdrYXAgZGFyaSBoYW55YSBzYXR1IHZhcmlhYmVsIGJlYmFzIHBhZGEgdmFyaWFiZWwgdGVyaWthdC4NCg0KMi4gTWVuZGV0ZWtzaSBIb21vc2tlZGFzdGlzaXRhcy0gdmFyaWFucyB1bnR1ayBzZW11YSBwZW5nYW1hdGFuIHRpZGFrIHNhbWEuDQoNCkhpcG90ZXNpcyBOdWxsIC0gSG9tb3NjZWRhc3RpY2l0eSBoYWRpciBkaSBSZXNpZHVhbHMNCg0KSGlwb3Rlc2lzIGFsdGVybmF0aWYgLSBIZXRlcm9za2VkYXN0aXN0YXMgaGFkaXIgZGFsYW0gcmVzaWR1YWwNCg0KaW5pIGRpbGFrdWthbiBkZW5nYW4gdGVzIEJyZXVzY2gtUGFnYW4uDQoNCmBgYHtyfQ0KYnB0ZXN0KG5ld19maXQpDQpgYGANCg0KcC12YWx1ZSA8IDAsMDUsIHNlaGluZ2dhIG1lbm9sYWsgYmFod2Ega2VzYWxhaGFuIGFkYWxhaCBob21vc2tlZGFzdGlzdGFzLiBqYWRpIGlzdGlsYWggZXJyb3IgYmVyc2lmYXQgaGV0ZXJvc2tlZGFzdGlzdGFzIGRhbiB0aWRhayBtZW1pbGlraSB2YXJpYW5zIGtvbnN0YW4geWFuZyB0aWRhayBiYWlrIHVudHVrIG1vZGVsLg0KDQozLiBtZW5kZXRla3NpIGF1dG9rb3JlbGFzaSAtIG1lbWVyaWtzYSBhdXRva29yZWxhc2kgKG1lbWVyaWtzYSBrb3JlbGFzaSBhbnRhciBrZXNhbGFoYW4pDQoNCkhhbCBpbmkgZGlsYWthdWthIFVqaSBEdXJiaW4td2F0c29uIGppa2EtRC1XIFN0YXN0aWMgc2VraXRhciAyLCBtYWthIG1lbWlsaWtpIGF1dG9rb3JlbGFzaSBkYWxhbSBtb2RlbC4gZGFuIG1lbmphdSBkYXJpIDIgYmVyYXJ0aSB0aWRhayBhZGEgYXV0b2tlcmFsYXNpLg0KDQpgYGB7cn0NCmR3dChuZXdfZml0KQ0KYGBgDQpEaXNpbmkgRC1XIHN0YXN0aXN0aWMgYWRhbGFoIDIuMDE4NzY1LCBzZWhpbmdnYSB0ZXJkYXBhdCBhdXRva29yZWxhc2kgcGFkYSBtb2RlbC4NCg0KNC4gbWVuZGV0ZWtzaSBNQVBFLSBSYXRhLXJhdGEgcGVyc2VudGFzaSBydWdpIGtlc2FsYWhhbiBhYnNvbHV0DQoNCk1BUEUgbWVuZ2hpdHVuZyBwZXJiZWRhYW4gcGVyc2VuIGFic29sdXQgcmF0YS1yYXRhIGFudGFyYSBkdWEgdmVrdG9yIG51bWVyaWsNCg0KYGBge3J9DQpFcnJvclJhdGUgPC0gbWVhbihhYnMoKEluc3VyYW5jZVRyYWluRGF0YSRDdXN0b21lckxpZmV0aW1lVmFsdWUgLSBJbnN1cmFuY2VUcmFpbkRhdGEkcHJlZGljdGVkQ0xWKS9JbnN1cmFuY2VUcmFpbkRhdGEkQ3VzdG9tZXJMaWZldGltZVZhbHVlKSAqMTAwICkNCnByaW50KEVycm9yUmF0ZSkNCmBgYA0KDQpyYXRhLXJhdGEgdGluZ2thdCBrZXNhbGFoYW4gbW9kZWwgYWRhbGFoIDYwLDQzICUgeWFuZyB0aW5nZ2kgZGFuIGRhcGF0IG1lbmdha2F0YW4gYmFod2EgbW9kZSB0aWRhayBiZWdpdHUgYmFpaw0KDQo3LiBLdXJ2YSBQcmVkaWtzaSANCg0KR2FyaXMgYmlydSBtZW51bmp1a2thbiBnYXJpcyByZWdyZXNpIGRhbiBzZXBhdHUgdGl0aWsgbWVyYWggcGFuZ2FtYXRhbiB5YW5nIHNlYmVuYXJueWEgbWVueWltcGFuZyBkYXJpIGdhcmlzIHJlZ3Jlc2kuDQoNCjEuIEt1cnZhIFByZWRpa3NpIGRlbmdhbiBNb250aGx5UHJlbWl1bUF1dG8NCg0KYGBge3J9DQpnZ3Bsb3QoSW5zdXJhbmNlVHJhaW5EYXRhLCBhZXMoeCA9IE1vbnRobHlQcmVtaXVtQXV0bywgeSA9IEN1c3RvbWVyTGlmZXRpbWVWYWx1ZSkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAicmVkIikgKyAgICAgDQogIGdlb21fc2VnbWVudChhZXMoeGVuZCA9IE1vbnRobHlQcmVtaXVtQXV0bywgeWVuZCA9IHByZWRpY3RlZENMViksIGFscGhhID0gLjIpICsgICAgDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYWJzKHJlc2lkdWFsc0NMViksIHNpemUgPSBhYnMocmVzaWR1YWxzQ0xWKSkpICsgDQogIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobG93ID0gImdyZWVuIiwgaGlnaCA9ICJyZWQiKSArICAgICAgICAgICAgIA0KICBndWlkZXMoY29sb3IgPSBGQUxTRSwgc2l6ZSA9IEZBTFNFKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGdlb21fcG9pbnQoYWVzKHkgPSBwcmVkaWN0ZWRDTFYpLCBzaGFwZSA9IDEpICsNCiAgdGhlbWVfYncoKQ0KYGBgDQoNCg0KYGBge3J9DQpnZ3Bsb3QoSW5zdXJhbmNlVHJhaW5EYXRhLGFlcyh4PU1vbnRobHlQcmVtaXVtQXV0byx5PUN1c3RvbWVyTGlmZXRpbWVWYWx1ZSkpKw0KICBnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSsNCiAgc3RhdF9zbW9vdGgobWV0aG9kPSJsbSIpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0iTW9udGhseSBQcmVtaXVtIikrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJQcmVkaWN0aW9uIG9mIENMViIpKw0KICBnZ3RpdGxlKCJQcmVkaWN0aW9uIEN1cnZlIHdpdGggTW9udGhseSBQcmVtaXVtIikNCmBgYA0KDQoyLiBLdXJ2YSBwcmVkaWtzaSBkZW5nYW4gVG90YWxDbGFpbUFtb3VudA0KDQpgYGB7cn0NCmdncGxvdChJbnN1cmFuY2VUcmFpbkRhdGEsYWVzKHg9VG90YWxDbGFpbUFtb3VudCx5PUN1c3RvbWVyTGlmZXRpbWVWYWx1ZSkpKw0KICBnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSsNCiAgc3RhdF9zbW9vdGgobWV0aG9kPSJsbSIpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0iVG90YWwgQ2xhaW0gQW1vdW50IikrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJQcmVkaWN0aW9uIG9mIENMViIpKw0KICBnZ3RpdGxlKCJQcmVkaWN0aW9uIEN1cnZlIHdpdGggVG90YWwgQ2xhaW0gQW1vdW50IikNCmBgYA0KDQogOCBSaW5na2FzYW4gDQoNCjEuIGFkYSBiYW55YWsgcGVsYW5nZ2FuIGRlbmdhbiBDTFYgcmVuZGFoLCBzYW5nYXQgc2VkaWtpdCBwZWxhbmdnYW4gZGVuZ2FuIENMViB0aW5nZ2kuDQoNCjIuIFBlbGFuZ2dhbiB5YW5nIHRlbGFoIG1lbmdhbWJpbCBhc3VyYW5zaSBkYXNhciB1bnR1ayBrZW5kYXJhYW5heSBsZWJpaCBiZXJoYXJnYSBkYXJpIHBhZGEgcGVtZWdhbmcgcG9saXMgYXN1cmFuYXNpIHBlcnBhbmphbmdhbiBhdGF1IHByZW1pLg0KDQozLiBQZWxhbmdnYW4gcGVya2VyamEgdGVyZGlkaWsgKGRlbmdhbiBnZWxhciBzYXJqYW5hIGF0YXUgc2V0YXJhKSBsZWJpaCBiZXJoYXJnYXIgZGFyaSBwYWRhIHBlbGFuZ2dhbiBwZW5zaXVuYW4sIHBlbmdnYWFuZ3VyYW4sIGF0YXUgcGVueWFkYW5nIGNhY2F0Lg0KDQo0LiBHZW5kZXIgdGlkYWsgbWVtaWxpa2kgcGVyYW4gZGFsYW0gbWVuZW50dWthbiBuaWxhaSBwZWxhbmdnYW4uIGJhaWsgcHJpYSBtYXVwdW4gd2FuaXRhIHRlcmxpaGF0IGJlcmhhcmdhLg0KDQo1LiBwZWxhbmdnYW4gcGVya2F3aW5hbiBtZW1iZWxpIGxlYmloIGJhbnlhayBhc3VhcmFuc2kgbW9iaWwgZGFuIG1lbmFtYmFoIG5pbGFpIGxlYmloIGJhZ2kgcGVyc3VoYWFuLg0KDQo2LiBQZWxhbmdnYW4gcGVkZXNhYW4gS3VyYW5nIGJlcmhhcmdhIGRhcmkgcGFkYSBwZWxhbmdnYW4gcGVya290YWFuLg0KDQo3LiBOYXNhYmFoIHlhbmcgbWVtaWxpa2kgcG9saXMgcHJpYmFkaSBsZWJpaCBiZXJoYXJnYSBiYWdpIHBlcnN1aGFhbiBkYXJpIHBhZGEgcGVtZWdhbmcgcG9saXMga29ycG9yYXNpIGRhbiBhc3VyYW5zaSBraHVzdXMuIA0KDQo4LiBQZW5hd2FyYW4gMSBkYW4gcGVuYXdhcmFuIDIgbWVuYXJpayBsZWJpaCBiYW55YWsgcGVsYW5nZ2FuLCBjYWxsIGNlbnRlciB0aWRhayBiZXJraW5lcmphIGJhaWsgZGliYWRpbmdrYW4gZGVuZ2FuIHNhbHVyYW4gbGFpbiBkaSBzZWx1cmggbmVnZXJpIChkYWxhbSBoYWwgcGVsYW5nZ2FuIGJlcm5pbGFpIHRpbmdnaSkuDQoNCjkuIENhbGwgY2VudGVyIHRpZGFrIGJlcmtpbmVyamEgYmFpayBkaWJhZGluZ2thbiBkZW5nYW4gc2FsdXJhbiBsYWluIGRpIHNlbHVydWggbmVnZXJpIChkYWxhbSBoYWwgcGVsYW5nZ2FuIGJlcm5pbGFpIHRpbmdnaSkNCg0KMTAuIFBlbGFuZ2dhbiB5YW5nIG1lbWlsaWtpIGtlbmRhcmFhbiB1a3VyYW4gbWVuZW5nYWgsIG1vYmlsIGVtcGF0IHBpbnR1IGF0YXUgU1VWIGxlYmloIGJlcmhhcmdhLg0KDQoxMS4gcGVsYW5nZ2FuIGNhbGlmb3JuaWEgbWVuYW1hYmggbmlsYWkgbGViaWggYmFnaSBwZXJ1c2FoYWFuLg0KDQoxMi4ga2ViaWpha2FuIEwzIHByaWJhZGkgbWVuYW1iYWggbmlhbGkgbGViaWggYmFnaSBwZXJ1c2FoYWFuLnhpaS4NCg0KMTMuIHBlbGFuZ2dhbiB5YW5nIG1lbWlsaWtpIGxlYmloIGJhbnlhayBwb2xpcyBkZW5nYW4gcHJlbWkgYnVsYW5hbiB5YW5nIHRpbmdnaSBha2FuIG1lbmFtYmFoIG5pbGFpIGxlYmloIGJhZ2kgcGVydXNhaGFhbi4gRGkgc2lzaSBsYWluLCBwZW5nYWR1YW4gdGVyYnVrYSBwZWxhbmdnYW4gZGFuIGp1bWxhaCBrbGFpbSBsZWJpaCBiYW55YWsgYWthbiBtZW51cnVua2FuIENMVi4NCg0KDQogOS4gUmVrb21lZGFzaSBCaXNuaXMNCg0KbGFwb3JhbiBpbmkgbWV3YWtpbGkgYW5hbGlzaSBzYXlhIHVudHVrIHBlcnN1aGFhbiBhc3VhcmFuc2kgeHl6LiBtZW51cnV0IHBlbmRhcGF0IHNheWEgYmVyZGFzYXJrYW4gZGF0YSB5YW5nIGRpYmVyaWthbiwgbWVuYXJnZXRrYW4gcGVsYW5nZ2FuIHlhbmcgdGVwYXQgZGFwYXQgbWVuaW5na2F0a2FuIE5pbGFpIFNldW11ciBIaWR1cCBQZWxhbmdnYW4uIER1YSBwZXJ1YmFoYW4geWFuZyBkaXVzdWxha2FuIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNCkEpIFBlcnVzYWhhYW4gYXN1cmFuc2kgaGFydXMgbWVuYXJnZXRrYW4gcGVsYW5nZ2FuIGJlcnBlbmRpZGlrYW4gbWVuaWthaCBiZWtlcmphIGRhcmkgZGFlYXJhaCBwZXJrb3RhYW4geWFuZyBtZW1pbGlraSBrZW5kYXJhYW4gTWlkIFNpemUgdW50dWsgbWVuaW5na2F0a2FuIEN1c3RvbWVyIExpZmV0aW1lVmFsdWUoQ0xWKSBNZW5pbmdrYXQuDQoNCkIpIFNlYmFpayBueWEgamlrYSBvcGVuIGNvbXBsYWludHMgcGVsYW5nZ2FuIHRpZGFrIHNlZ2VlcmEgZGlzZWxhc2Fpa2FuIGRhbiBqdW1sYWgga2xhaW0gdGlkYWsgYmVya3VyYW5nLCBtYWthIGtlZHVhbnlhIGRhcGF0IG1lbnVydW5rYW4gY3VzdG9tZXIgbGlmZXRpbWV2YWx1ZSAoQ0xWKQ0KDQpDKSBzZWtpdGFyIDM4JSBuaWxhaSBkaXRhbWJhaGthbiBvbGVoIGFnZW4ga2UgcGVydXNhaGFhbiBzZWRhbmdrYW4gY2FsbCBjZW50ZXIgaGFueWEgbWVuYW1hYmhha2FuIG5pbGFpIDIwICUgLiBqYWRpIGFnZW4gaGFydXMgbGViaWggZGlzdWthaSBkYXJpIHBhZGEgcHVzYXQgcGFuZ2dpbGFuIHNhYXQgbWVuanVhbCBhc3VyYW5zaSBtb2JpbCBrZXBhZGEgcGVsYW5nZ2FuLg0KDQpEKSBGYWt0b3ItZmFrdG9yIHlhbmcgbWVueWViYWJrYW4gcGVuaW5na2F0YW4gQ0xWIGFkYWxhaCBQcmVtaSBidWxhbmFuIGRhbiBqdW1sYWggUG9saXMsIG5hbXVuIHBlbmdhZHVhbiB0ZXJidWthIGRhbiBqdW1sYWgga2xhaW0gZGFwYXQgbWVudXJ1bmthbiBDTFY=