Introduction

Trong khoảng 10 năm trở lại đây những nghiên cứu với thang đo Likert 5 dùng các phương pháp phân tích EFA, CFA, SEM trở thành một phong trào. Những phương pháp phân tích này chiếm một tỉ trọng lớn trong các nghiên cứu đăng tạp chí và PhD Thesis và điều đáng ngạc nhiên là gần như 100% các kết quả nghiên cứu đều rất đẹp (các giả thuyết nghiên cứu đặt ra đều thỏa mãn, các tiêu chí đánh giá độ phù hợp của mô hình SEM đều tốt, bảng ma trận xoay của hệ số tải hội tụ, các kiểm định KMO Test, Cronbach Alpha đều đẹp lung linh). Sử dụng Google chúng ta có thể tìm thấy rất rất nhiều nghiên cứu có cụm từ kiểu như “..các nhân tố ảnh hưởng..” như thế này. Một trong số đó là:

  1. Các nhân tố tác động lên sự hài lòng của nhân viên: Nghiên cứu tại Hà Nội của tác giả LTP đăng trên một tạp chí thuộc nhóm uy tín nhất VN trong lĩnh vực kinh tế.

  2. Các yếu tố ảnh hưởng đến sự hài lòng đối với công việc của nhân viên tư vấn đầu tư, tại Công ty Cổ phần Chứng khoán FPT.

  3. Các nhân tố ảnh hưởng đến thái độ hoài nghi nghề nghiệp của kiểm toán viên trong kiểm toán báo cáo tài chính - Nghiên cứu tại thành phố Hà Nội.

  4. THE STUDY OF THE FACTORS AFFECTING THE LEVEL OF SATISFACTION IN THE EMPLOYMENT OF THE OFFICERS IN ECONOMIC ZONES IN VUNG ANG ECONOMIC AREA, HA TINH PROVINCE.

Như đã nói, trong số hầu hết các paper được đọc, thì 100% các kết quả đều rất đẹp. Trong post này tôi sẽ hướng dẫn cách thức tạo ra dữ liệu sao cho khi chạy các phân tích, kết quả sẽ đẹp lung linh. Dữ liệu được tạo ra nhằm mô phỏng nghiên cứu của tác giả LTP đăng trên tạp chí Kinh Tế Phát Triển. Cụ thể, tác giả LTP sẽ thu thập dữ liệu Likert 5 của 151 quant sát để đánh giá ảnh hưởng của bốn nhân tố: (1) Tính chất công việc (TCCV), (2) Tiền lương và phúc lợi (TLPL), (3) Đào tạo - phát triển (DTPT), và (4) Quan hệ công việc (QH) lên Mức độ hài lòng (SHL) của nhân viên. Số lượng các items/questions tương ứng với các nhân tố trên là 7, 4, 4, 6 và 3. Phần 1 của sẽ hướng dẫn tạo dữ liệu sao cho khi thực hiện các phân tích thì:

  1. Bảng ma trận xoay hội tụ, thậm chí là các hệ số tải nhân tố rất cao (càng cao càng đẹp).

  2. Các kiểm định như KMO Test, Cronbach Alpha đẹp.

Create Data for EFA Analysis

Để tạo ra dữ liệu, cách đơn giản nhất là.. sử dụng một bộ dữ liệu bất kì nào đó. Trong post này tôi chọn bộ dữ liệu raq.dat từ cuốn Discovering Statistics Using IBM SPSS Statistics. Trước hết đọc bộ dữ liệu này vào R:

#============================
#  Import and prepare data
#============================

# Clear R environment: 
rm(list = ls())
library(dplyr)

# Import data: 

read.delim("http://www.discoveringstatistics.com/docs/ds_data_files/R%20Data%20Files/raq.dat") -> saq_data

Chọn số lượng mẫu nghiên cứu, chẳng hạn, là 400 từ bộ dữ liệu này:

set.seed(12)
data_mini <- saq_data %>% sample_n(400)

Thực hiện cái gọi là “ma trận xoay - rotated matrix” như cách gọi phổ biến ở các paper tiếng Việt. Vì có tất cả 5 nhân tố nên:

library(psych)
rotated_fMatrix <- principal(data_mini, nfactors = 5, rotate = "varimax")

print.psych(rotated_fMatrix, cut = 0.3, digits = 3, sort = TRUE) # Page 665. 
## Principal Components Analysis
## Call: principal(r = data_mini, nfactors = 5, rotate = "varimax")
## Standardized loadings (pattern matrix) based upon correlation matrix
##     item    RC1    RC3    RC5    RC4    RC2    h2    u2  com
## Q21   21  0.670                             0.601 0.399 1.72
## Q02    2 -0.567                       0.407 0.508 0.492 1.96
## Q12   12  0.559         0.372               0.542 0.458 2.43
## Q18   18  0.558                0.447        0.603 0.397 2.54
## Q13   13  0.535                             0.458 0.542 2.25
## Q20   20  0.513         0.328               0.409 0.591 2.06
## Q14   14  0.501                0.479        0.556 0.444 2.60
## Q03    3 -0.442 -0.304                0.355 0.490 0.510 3.58
## Q08    8         0.836                      0.734 0.266 1.10
## Q17   17         0.768                      0.683 0.317 1.33
## Q11   11         0.741                      0.670 0.330 1.47
## Q04    4  0.352  0.405  0.396               0.493 0.507 3.53
## Q01    1                0.725               0.660 0.340 1.53
## Q05    5                0.692               0.536 0.464 1.25
## Q16   16                0.630               0.609 0.391 2.19
## Q06    6                       0.794        0.683 0.317 1.17
## Q07    7  0.380                0.618        0.590 0.410 2.06
## Q10   10                0.409  0.578        0.535 0.465 2.04
## Q15   15         0.396         0.432        0.432 0.568 2.95
## Q09    9                              0.691 0.504 0.496 1.11
## Q22   22                              0.660 0.462 0.538 1.12
## Q23   23  0.320                       0.561 0.501 0.499 2.22
## Q19   19               -0.309         0.437 0.349 0.651 2.56
## 
##                         RC1   RC3   RC5   RC4   RC2
## SS loadings           3.132 2.707 2.438 2.414 1.917
## Proportion Var        0.136 0.118 0.106 0.105 0.083
## Cumulative Var        0.136 0.254 0.360 0.465 0.548
## Proportion Explained  0.248 0.215 0.193 0.191 0.152
## Cumulative Proportion 0.248 0.463 0.656 0.848 1.000
## 
## Mean item complexity =  2
## Test of the hypothesis that 5 components are sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.06 
##  with the empirical chi square  725.341  with prob <  6.1e-77 
## 
## Fit based upon off diagonal values = 0.956

Kết quả này cho thấy:

  1. Một số items hội tụ. Đây là tin tốt.
  2. Số lượng các items có thể nhóm vào một nhân tố nào đó không trùng khớp với số lượng items kì vọng. Đây là tin xấu.
  3. Rotated Matrix hơi lộn xộn - tức là không hội tụ lắm. Đây là tin xấu.

Không sao. Dựa trên kết quả sơ bộ trên chúng ta có thể tạo ra bộ dữ liệu rất đẹp. Trước hết viết một hàm có tên là replace_someVar mà khi nhận đầu vào x sẽ:

  1. Thay thế 20% giá trị 1 của x thành 2.
  2. Thay thế 20% giá trị 5 của x bằng 4.
  3. Thay thế 30% giá trị 4 thành 5.
  4. Thay thế 30% giá trị 2 thành 3.
  5. Thay thế 20% giá trị 3 thành 4.

Tất cả thay thế trên, là thay thế ngẫu nhiên. Dứoi đây là hàm đó:

# Function replaces some values: 

replace_someVar <- function(x) {
  
  y <- which(x == 1)
  
  z1 <- sample(y, floor(0.2*length(y)))
  
  x[z1] <- 2
  
  y5 <- which(x == 5)
  
  z2 <- sample(y5, floor(0.2*length(y5)))
  
  x[z2] <- 4
  
  y4 <- which(x == 4)
  
  z3 <- sample(y4, floor(0.3*length(y4)))
  
  x[z3] <- 5

  y2 <- which(x == 2)
  
  t2 <- sample(y2, floor(0.3*length(y2)))
  
  x[t2] <- 3
  
  y3 <- which(x == 3)
  
  k3 <- sample(y3, floor(0.2*length(y3)))
  
  x[k3] <- 4
  
  return(x)
}

Sử dụng hàm đã có để, trước hết, tạo ra data phù hợp với số lượng các items/questions tương ứng với các nhân tố đồng thời thực hiện cái gọi là kiểm định Cronbach Alpha luôn:

#==================
#  Generate data
#==================

# TCCV: 

factor_TCCV <- data_mini %>% 
  mutate(tccv1 = Q21, 
         tccv2 = replace_someVar(tccv1), 
         tccv3 = replace_someVar(tccv1), 
         tccv4 = replace_someVar(tccv1), 
         tccv5 = replace_someVar(tccv1), 
         tccv6 = replace_someVar(tccv1), 
         tccv7 = replace_someVar(tccv1), 
         tccv8 = replace_someVar(tccv1)) %>% 
  select(contains("tccv"))

psych::alpha(factor_TCCV) -> cronbach_TCCV

# QHCV: 

factor_QH <- data_mini %>% 
  mutate(qh1 = Q17, 
         qh2 = replace_someVar(qh1), 
         qh3 = replace_someVar(qh1), 
         qh4 = replace_someVar(qh1), 
         qh5 = replace_someVar(qh1), 
         qh6 = replace_someVar(qh1)) %>% 
  select(contains("qh"))

psych::alpha(factor_QH) -> cronbach_QH


# TLPL: 

factor_TLPL <- data_mini %>% 
  mutate(tlpl1 = Q01, 
         tlpl2 = replace_someVar(tlpl1), 
         tlpl3 = replace_someVar(tlpl1), 
         tlpl4 = replace_someVar(tlpl1)) %>% 
  select(contains("tlpl"))

psych::alpha(factor_TLPL) -> cronbach_TLPL


# DTPT: 

factor_DTPT <- data_mini %>% 
  mutate(dtpt1 = Q06, 
         dtpt2 = replace_someVar(dtpt1), 
         dtpt3 = replace_someVar(dtpt1), 
         dtpt4 = replace_someVar(dtpt1)) %>% 
  select(contains("dtpt"))

psych::alpha(factor_DTPT) -> cronbach_DTPT


# SHL: 

factor_SHL <- data_mini %>% 
  mutate(shl1 = Q22, 
         shl2 = replace_someVar(shl1), 
         shl3 = replace_someVar(shl1)) %>% 
  select(contains("shl"))


psych::alpha(factor_SHL) -> cronbach_SHL


# Combine data sets: 

factor_DTPT %>% 
  bind_cols(factor_QH) %>% 
  bind_cols(factor_SHL) %>% 
  bind_cols(factor_TCCV) %>% 
  bind_cols(factor_TLPL) -> data_for_paper

Đã có dữ liệu cho tất cả các nhân tố đề cập trong paper. Việc tiếp theo là lưu lại để phần mềm SPSS có thể đọc để gửi cho thầy, editor hoặc hội đồng PhD:

haven::write_sav(data_for_paper, "data_for_paper.sav")

Results

Trước hết kiểm tra lại rằng bảng ma trận xoay là hội tụ và đẹp lung linh:

# Rotated matrix (or loadings matrix): 

rotated_fMatrix_paper <- principal(data_for_paper, nfactors = 5, rotate = "varimax")

print.psych(rotated_fMatrix_paper, cut = 0.3, digits = 3, sort = TRUE)
## Principal Components Analysis
## Call: principal(r = data_for_paper, nfactors = 5, rotate = "varimax")
## Standardized loadings (pattern matrix) based upon correlation matrix
##       item    RC1    RC2    RC3    RC5    RC4    h2     u2  com
## tccv1   14  0.958                             0.969 0.0311 1.12
## tccv8   21  0.900                             0.834 0.1659 1.06
## tccv4   17  0.890                             0.824 0.1761 1.08
## tccv6   19  0.886                             0.818 0.1820 1.08
## tccv5   18  0.884                             0.819 0.1809 1.10
## tccv3   16  0.883                             0.828 0.1725 1.12
## tccv2   15  0.881                             0.818 0.1822 1.11
## tccv7   20  0.879                             0.811 0.1894 1.10
## qh1      5         0.952                      0.954 0.0460 1.11
## qh5      9         0.895                      0.829 0.1708 1.07
## qh3      7         0.892                      0.828 0.1720 1.08
## qh2      6         0.888                      0.826 0.1743 1.10
## qh4      8         0.887                      0.825 0.1749 1.10
## qh6     10         0.886                      0.829 0.1706 1.11
## dtpt1    1                0.958               0.956 0.0442 1.08
## dtpt2    2                0.937               0.894 0.1061 1.04
## dtpt3    3                0.930               0.893 0.1065 1.07
## dtpt4    4                0.926               0.883 0.1172 1.06
## tlpl1   22                       0.924        0.934 0.0657 1.19
## tlpl2   23                       0.886        0.834 0.1656 1.13
## tlpl3   24                       0.883        0.832 0.1683 1.14
## tlpl4   25                       0.869        0.825 0.1751 1.19
## shl1    11                              0.967 0.950 0.0495 1.03
## shl2    12                              0.940 0.892 0.1084 1.02
## shl3    13                              0.934 0.882 0.1176 1.02
## 
##                         RC1   RC2   RC3   RC5   RC4
## SS loadings           6.718 5.108 3.627 3.407 2.727
## Proportion Var        0.269 0.204 0.145 0.136 0.109
## Cumulative Var        0.269 0.473 0.618 0.754 0.863
## Proportion Explained  0.311 0.237 0.168 0.158 0.126
## Cumulative Proportion 0.311 0.548 0.716 0.874 1.000
## 
## Mean item complexity =  1.1
## Test of the hypothesis that 5 components are sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.017 
##  with the empirical chi square  67.744  with prob <  1 
## 
## Fit based upon off diagonal values = 0.998

KMO Test cũng hoàn hảo:

# Measure of Sampling Adequacy (MSA) - KMO Test: 
KMO(data_for_paper)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = data_for_paper)
## Overall MSA =  0.91
## MSA for each item = 
## dtpt1 dtpt2 dtpt3 dtpt4   qh1   qh2   qh3   qh4   qh5   qh6  shl1  shl2  shl3 
##  0.81  0.88  0.89  0.90  0.85  0.95  0.94  0.94  0.95  0.94  0.66  0.75  0.77 
## tccv1 tccv2 tccv3 tccv4 tccv5 tccv6 tccv7 tccv8 tlpl1 tlpl2 tlpl3 tlpl4 
##  0.88  0.97  0.97  0.97  0.96  0.97  0.97  0.96  0.83  0.92  0.91  0.90

Và cả Cronbach Alpha cho từng nhân tố cũng không thể đẹp hơn:

# Cronbach Alpha: 

print(cronbach_DTPT)
## 
## Reliability analysis   
## Call: psych::alpha(x = factor_DTPT)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N    ase mean sd median_r
##       0.96      0.96    0.96      0.87  27 0.0029    4  1     0.88
## 
##  lower alpha upper     95% confidence boundaries
## 0.96 0.96 0.97 
## 
##  Reliability if an item is dropped:
##       raw_alpha std.alpha G6(smc) average_r S/N alpha se   var.r med.r
## dtpt1      0.94      0.94    0.91      0.84  16   0.0052 9.3e-05  0.84
## dtpt2      0.96      0.96    0.94      0.88  23   0.0037 1.6e-03  0.90
## dtpt3      0.96      0.96    0.94      0.88  22   0.0038 1.6e-03  0.90
## dtpt4      0.96      0.96    0.95      0.89  24   0.0035 1.0e-03  0.90
## 
##  Item statistics 
##         n raw.r std.r r.cor r.drop mean  sd
## dtpt1 400  0.98  0.98  0.98   0.96  3.8 1.1
## dtpt2 400  0.94  0.94  0.92   0.90  4.0 1.1
## dtpt3 400  0.95  0.95  0.92   0.90  4.0 1.1
## dtpt4 400  0.94  0.94  0.91   0.89  4.0 1.1
## 
## Non missing response frequency for each item
##          1    2    3    4    5 miss
## dtpt1 0.04 0.09 0.17 0.39 0.31    0
## dtpt2 0.04 0.07 0.16 0.36 0.38    0
## dtpt3 0.04 0.07 0.16 0.36 0.38    0
## dtpt4 0.04 0.07 0.16 0.36 0.38    0
print(cronbach_QH)
## 
## Reliability analysis   
## Call: psych::alpha(x = factor_QH)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N    ase mean   sd median_r
##       0.96      0.96    0.96      0.82  27 0.0029  3.7 0.88     0.79
## 
##  lower alpha upper     95% confidence boundaries
## 0.96 0.96 0.97 
## 
##  Reliability if an item is dropped:
##     raw_alpha std.alpha G6(smc) average_r S/N alpha se   var.r med.r
## qh1      0.95      0.95    0.94      0.78  18   0.0041 2.8e-05  0.78
## qh2      0.96      0.96    0.95      0.82  23   0.0034 2.4e-03  0.79
## qh3      0.96      0.96    0.95      0.82  23   0.0034 2.2e-03  0.79
## qh4      0.96      0.96    0.95      0.82  23   0.0034 2.2e-03  0.79
## qh5      0.96      0.96    0.95      0.82  23   0.0034 2.4e-03  0.79
## qh6      0.96      0.96    0.95      0.82  23   0.0034 2.4e-03  0.79
## 
##  Item statistics 
##       n raw.r std.r r.cor r.drop mean   sd
## qh1 400  0.98  0.98  0.98   0.96  3.5 0.90
## qh2 400  0.91  0.91  0.88   0.87  3.7 0.96
## qh3 400  0.91  0.91  0.88   0.87  3.7 0.96
## qh4 400  0.91  0.91  0.89   0.87  3.7 0.96
## qh5 400  0.91  0.91  0.89   0.87  3.7 0.96
## qh6 400  0.91  0.91  0.89   0.87  3.7 0.96
## 
## Non missing response frequency for each item
##        1    2    3    4    5 miss
## qh1 0.03 0.11 0.28 0.48 0.10    0
## qh2 0.02 0.08 0.26 0.42 0.23    0
## qh3 0.02 0.08 0.26 0.42 0.23    0
## qh4 0.02 0.08 0.26 0.42 0.23    0
## qh5 0.02 0.08 0.26 0.42 0.23    0
## qh6 0.02 0.08 0.26 0.42 0.23    0
print(cronbach_SHL)
## 
## Reliability analysis   
## Call: psych::alpha(x = factor_SHL)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N    ase mean sd median_r
##       0.95      0.95    0.94      0.86  19 0.0046  3.2  1     0.89
## 
##  lower alpha upper     95% confidence boundaries
## 0.94 0.95 0.96 
## 
##  Reliability if an item is dropped:
##      raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
## shl1      0.89      0.89    0.80      0.80   8   0.0112    NA  0.80
## shl2      0.94      0.94    0.89      0.89  15   0.0061    NA  0.89
## shl3      0.95      0.95    0.90      0.90  18   0.0054    NA  0.90
## 
##  Item statistics 
##        n raw.r std.r r.cor r.drop mean  sd
## shl1 400  0.97  0.97  0.97   0.94  3.1 1.0
## shl2 400  0.94  0.94  0.91   0.87  3.3 1.1
## shl3 400  0.94  0.94  0.89   0.86  3.3 1.1
## 
## Non missing response frequency for each item
##         1    2    3    4    5 miss
## shl1 0.06 0.26 0.33 0.26 0.09    0
## shl2 0.04 0.19 0.33 0.28 0.15    0
## shl3 0.04 0.19 0.33 0.28 0.15    0
print(cronbach_TCCV)
## 
## Reliability analysis   
## Call: psych::alpha(x = factor_TCCV)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N    ase mean   sd median_r
##       0.97      0.97    0.97      0.81  35 0.0021    3 0.99     0.79
## 
##  lower alpha upper     95% confidence boundaries
## 0.97 0.97 0.98 
## 
##  Reliability if an item is dropped:
##       raw_alpha std.alpha G6(smc) average_r S/N alpha se   var.r med.r
## tccv1      0.96      0.96    0.96      0.79  26   0.0028 0.00019  0.79
## tccv2      0.97      0.97    0.97      0.82  32   0.0024 0.00210  0.79
## tccv3      0.97      0.97    0.97      0.82  31   0.0024 0.00211  0.80
## tccv4      0.97      0.97    0.97      0.82  31   0.0024 0.00205  0.79
## tccv5      0.97      0.97    0.97      0.82  31   0.0024 0.00203  0.79
## tccv6      0.97      0.97    0.97      0.82  32   0.0024 0.00214  0.79
## tccv7      0.97      0.97    0.97      0.82  32   0.0024 0.00206  0.80
## tccv8      0.97      0.97    0.97      0.82  31   0.0025 0.00215  0.79
## 
##  Item statistics 
##         n raw.r std.r r.cor r.drop mean  sd
## tccv1 400  0.98  0.98  0.99   0.98  2.8 1.0
## tccv2 400  0.90  0.90  0.89   0.87  3.1 1.1
## tccv3 400  0.91  0.91  0.89   0.88  3.1 1.1
## tccv4 400  0.91  0.91  0.89   0.88  3.1 1.1
## tccv5 400  0.90  0.90  0.89   0.87  3.1 1.1
## tccv6 400  0.90  0.90  0.89   0.87  3.1 1.1
## tccv7 400  0.90  0.90  0.88   0.87  3.1 1.1
## tccv8 400  0.91  0.91  0.90   0.88  3.1 1.1
## 
## Non missing response frequency for each item
##          1    2    3    4    5 miss
## tccv1 0.10 0.30 0.32 0.25 0.03    0
## tccv2 0.08 0.23 0.34 0.26 0.10    0
## tccv3 0.08 0.23 0.34 0.26 0.10    0
## tccv4 0.08 0.23 0.34 0.26 0.10    0
## tccv5 0.08 0.23 0.34 0.26 0.10    0
## tccv6 0.08 0.23 0.34 0.26 0.10    0
## tccv7 0.08 0.23 0.34 0.26 0.10    0
## tccv8 0.08 0.23 0.34 0.26 0.10    0
print(cronbach_TLPL)
## 
## Reliability analysis   
## Call: psych::alpha(x = factor_TLPL)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N    ase mean   sd median_r
##       0.94      0.94    0.93      0.81  17 0.0048  3.8 0.83     0.81
## 
##  lower alpha upper     95% confidence boundaries
## 0.93 0.94 0.95 
## 
##  Reliability if an item is dropped:
##       raw_alpha std.alpha G6(smc) average_r  S/N alpha se   var.r med.r
## tlpl1      0.90      0.90    0.86      0.76  9.3   0.0084 0.00015  0.75
## tlpl2      0.93      0.93    0.92      0.82 13.9   0.0061 0.00439  0.86
## tlpl3      0.93      0.93    0.91      0.82 14.0   0.0060 0.00363  0.85
## tlpl4      0.93      0.93    0.91      0.83 14.2   0.0059 0.00234  0.85
## 
##  Item statistics 
##         n raw.r std.r r.cor r.drop mean   sd
## tlpl1 400  0.96  0.97  0.97   0.94  3.6 0.85
## tlpl2 400  0.91  0.91  0.87   0.84  3.8 0.91
## tlpl3 400  0.91  0.91  0.87   0.84  3.8 0.91
## tlpl4 400  0.91  0.91  0.87   0.84  3.8 0.91
## 
## Non missing response frequency for each item
##          1    2    3    4    5 miss
## tlpl1 0.02 0.07 0.30 0.50 0.12    0
## tlpl2 0.01 0.05 0.26 0.43 0.25    0
## tlpl3 0.01 0.05 0.26 0.43 0.25    0
## tlpl4 0.01 0.05 0.26 0.43 0.25    0

Các kết quả ở trên có thể tái lập lại bằng SPSS nếu muốn. Ma trận xoay, KMO Test và Cronbach Alpha cho nhân tố DTPT:

Final Notes

  1. Cách thức tạo dữ liệu đẹp như trên có thể được áp dụng cho bất kì tình huống nào mà không giới hạn số lượng nhân tố, số lượng câu hỏi cấu thành nhân tố và quy mô mẫu. Và có thể áp dụng cho các kiểu phân tích khác như CFA, SEM.
  2. Các bài viết được nhắc đến trong post này không có nghĩa là đi đến kết luận rằng chúng dựa trên dữ liệu giả hay mismanagement of data.
  3. Về vấn đề tạo dữ liệu cho paper bạn đọc quan tâm có thể đọc ở:
LS0tDQp0aXRsZTogJ0hvdyB0byBGYWtlIERhdGEgZm9yIFJlc2VhcmNoIFBhcGVyJw0KYXV0aG9yOiAnQXV0aG9yOiBOZ3V5ZW4gQ2hpIER1bmcnDQpzdWJ0aXRsZTogIlIgRm9yIEZ1biINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICMgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgIyBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiAiZmxhdGx5Ig0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IFRSVUUpDQoNCmBgYA0KDQohW10ocGljMS5qcGcpDQoNCiMgSW50cm9kdWN0aW9uDQoNClRyb25nIGtob+G6o25nIDEwIG7Eg20gdHLhu58gbOG6oWkgxJHDonkgbmjhu69uZyBuZ2hpw6puIGPhu6l1IHbhu5tpIHRoYW5nIMSRbyBMaWtlcnQgNSBkw7luZyBjw6FjIHBoxrDGoW5nIHBow6FwIHBow6JuIHTDrWNoIEVGQSwgQ0ZBLCBTRU0gdHLhu58gdGjDoG5oIG3hu5l0IHBob25nIHRyw6BvLiBOaOG7r25nIHBoxrDGoW5nIHBow6FwIHBow6JuIHTDrWNoIG7DoHkgY2hp4bq/bSBt4buZdCB04buJIHRy4buNbmcgbOG7m24gIHRyb25nIGPDoWMgbmdoacOqbiBj4bupdSDEkcSDbmcgdOG6oXAgY2jDrSB2w6AgUGhEIFRoZXNpcyB2w6AgxJFp4buBdSDEkcOhbmcgbmfhuqFjIG5oacOqbiBsw6AgZ+G6p24gbmjGsCAxMDAlIGPDoWMga+G6v3QgcXXhuqMgbmdoacOqbiBj4bupdSDEkeG7gXUgcuG6pXQgxJHhurlwIChjw6FjIGdp4bqjIHRodXnhur90IG5naGnDqm4gY+G7qXUgxJHhurd0IHJhIMSR4buBdSB0aOG7j2EgbcOjbiwgY8OhYyB0acOqdSBjaMOtIMSRw6FuaCBnacOhIMSR4buZIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oIFNFTSDEkeG7gXUgdOG7kXQsIGLhuqNuZyBtYSB0cuG6rW4geG9heSBj4bunYSBo4buHIHPhu5EgdOG6o2kgaOG7mWkgdOG7pSwgY8OhYyBraeG7g20gxJHhu4tuaCBLTU8gVGVzdCwgQ3JvbmJhY2ggQWxwaGEgxJHhu4F1IMSR4bq5cCBsdW5nIGxpbmgpLiBT4butIGThu6VuZyBHb29nbGUgY2jDum5nIHRhIGPDsyB0aOG7gyB0w6xtIHRo4bqleSBy4bqldCBy4bqldCBuaGnhu4F1IG5naGnDqm4gY+G7qXUgY8OzIGPhu6VtIHThu6sga2nhu4N1IG5oxrAgKiIuLmPDoWMgbmjDom4gdOG7kSDhuqNuaCBoxrDhu59uZy4uIiogbmjGsCBbdGjhur8gbsOgeV0oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT1jJUMzJUExYytuaCVDMyVBMm4rdCVFMSVCQiU5MSt0JUMzJUExYyslQzQlOTElRTElQkIlOTluZyslQzQlOTElRTElQkElQkZuK3MlRTElQkIlQjEraCVDMyVBMGkrbCVDMyVCMm5nK2MlRTElQkIlQTdhK25oJUMzJUEybit2aSVDMyVBQW4lM0ErTmdoaSVDMyVBQW4rYyVFMSVCQiVBOXUrdCVFMSVCQSVBMWkraCVDMyVBMCtuJUUxJUJCJTk5aSt0JUUxJUJBJUExcCtjaCVDMyVBRCtraW5oK3QlRTElQkElQkYrcGglQzMlQTF0K3RyaSVFMSVCQiU4M24mcmx6PTFDMUNIQkZfZW5WTjgxMFZOODE1Jm9xPWMlQzMlQTFjK25oJUMzJUEybit0JUUxJUJCJTkxK3QlQzMlQTFjKyVDNCU5MSVFMSVCQiU5OW5nKyVDNCU5MSVFMSVCQSVCRm4rcyVFMSVCQiVCMStoJUMzJUEwaStsJUMzJUIybmcrYyVFMSVCQiVBN2ErbmglQzMlQTJuK3ZpJUMzJUFBbiUzQStOZ2hpJUMzJUFBbitjJUUxJUJCJUE5dSt0JUUxJUJBJUExaStoJUMzJUEwK24lRTElQkIlOTlpK3QlRTElQkElQTFwK2NoJUMzJUFEK2tpbmgrdCVFMSVCQSVCRitwaCVDMyVBMXQrdHJpJUUxJUJCJTgzbiZhcXM9Y2hyb21lLi42OWk1Ny4yNzMxN2oxajcmc291cmNlaWQ9Y2hyb21lJmllPVVURi04KS4gTeG7mXQgdHJvbmcgc+G7kSDEkcOzIGzDoDogDQoNCjEuIFtDw6FjIG5ow6JuIHThu5EgdMOhYyDEkeG7mW5nIGzDqm4gc+G7sSBow6BpIGzDsm5nIGPhu6dhIG5ow6JuIHZpw6puOiBOZ2hpw6puIGPhu6l1IHThuqFpIEjDoCBO4buZaV0oaHR0cHM6Ly9rdHB0Lm5ldS5lZHUudm4vdGFwLWNoaS9zby0yMTkvbXVjLWx1Yy0zOTcvY2FjLW5oYW4tdG8tdGFjLWRvbmctbGVuLXN1LWhhaS1sb25nLWN1YS1uaGFuLXZpZW4tbmdoaWVuLWN1dS10YWktaGEtbm9pLjM3NDA2NC5hc3B4KSBj4bunYSB0w6FjIGdp4bqjIExUUCDEkcSDbmcgdHLDqm4gbeG7mXQgdOG6oXAgY2jDrSB0aHXhu5ljIG5ow7NtIHV5IHTDrW4gbmjhuqV0IFZOIHRyb25nIGzEqW5oIHbhu7FjIGtpbmggdOG6vy4gDQoNCjIuIFtDw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIHPhu7EgaMOgaSBsw7JuZyDEkeG7kWkgduG7m2kgY8O0bmcgdmnhu4djIGPhu6dhIG5ow6JuIHZpw6puIHTGsCB24bqlbiDEkeG6p3UgdMawLCB04bqhaSBDw7RuZyB0eSBD4buVIHBo4bqnbiBDaOG7qW5nIGtob8OhbiBGUFRdKGh0dHBzOi8vdGFwY2hpY29uZ3RodW9uZy52bi9iYWktdmlldC9jYWMteWV1LXRvLWFuaC1odW9uZy1kZW4tc3UtaGFpLWxvbmctZG9pLXZvaS1jb25nLXZpZWMtY3VhLW5oYW4tdmllbi10dS12YW4tZGF1LXR1LXRhaS1jb25nLXR5LWNvLXBoYW4tY2h1bmcta2hvYW4tZnB0LTc1Mzg0Lmh0bSkuIA0KDQozLiBbQ8OhYyBuaMOibiB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biB0aMOhaSDEkeG7mSBob8OgaSBuZ2hpIG5naOG7gSBuZ2hp4buHcCBj4bunYSBraeG7g20gdG/DoW4gdmnDqm4gdHJvbmcga2nhu4NtIHRvw6FuIGLDoW8gY8OhbyB0w6BpIGNow61uaCAtIE5naGnDqm4gY+G7qXUgdOG6oWkgdGjDoG5oIHBo4buRIEjDoCBO4buZaV0oaHR0cHM6Ly9odm5oLmVkdS52bi90YXBjaGkvdmkvdGhhbmctNy0yMS9ob2FuZy10cnVuZy1oaWV1LXZhLW5ob20tdGFjLWdpYS1jYWMtbmhhbi10by1hbmgtaHVvbmctZGVuLXRoYWktZG8taG9haS1uZ2hpLW5naGUtbmdoaWVwLWN1YS1raWVtLXRvYW4tdmllbi10cm9uZy1raWVtLXRvYW4tYmFvLWNhby10YWktY2hpbmgtbmdoaWVuLWN1dS10YWktdGhhbmgtcGhvLWhhLW5vaS12aWV0LW5hbS01MjguaHRtbCkuIA0KDQo0LiBbVEhFIFNUVURZIE9GIFRIRSBGQUNUT1JTIEFGRkVDVElORyBUSEUgTEVWRUwgT0YgU0FUSVNGQUNUSU9OIElOIFRIRSBFTVBMT1lNRU5UIE9GIFRIRSBPRkZJQ0VSUyBJTiBFQ09OT01JQyBaT05FUyBJTiBWVU5HIEFORyBFQ09OT01JQyBBUkVBLCBIQSBUSU5IIFBST1ZJTkNFXShodHRwczovL3RhcGNoaWtoY24uaGF1aS5lZHUudm4vbWVkaWEvMjkvdWZmaWxlLXVwbG9hZC1uby10aXRsZTI5OTc1LnBkZikuIA0KDQpOaMawIMSRw6MgbsOzaSwgdHJvbmcgc+G7kSBo4bqndSBo4bq/dCBjw6FjIHBhcGVyIMSRxrDhu6NjIMSR4buNYywgdGjDrCAxMDAlIGPDoWMga+G6v3QgcXXhuqMgxJHhu4F1IHLhuqV0IMSR4bq5cC4gVHJvbmcgcG9zdCBuw6B5IHTDtGkgc+G6vSBoxrDhu5tuZyBk4bqrbiBjw6FjaCB0aOG7qWMgdOG6oW8gcmEgZOG7ryBsaeG7h3Ugc2FvIGNobyBraGkgY2jhuqF5IGPDoWMgcGjDom4gdMOtY2gsIGvhur90IHF14bqjIHPhur0gxJHhurlwIGx1bmcgbGluaC4gROG7ryBsaeG7h3UgxJHGsOG7o2MgdOG6oW8gcmEgbmjhurFtIG3DtCBwaOG7j25nIG5naGnDqm4gY+G7qXUgY+G7p2EgdMOhYyBnaeG6oyBMVFAgxJHEg25nIHRyw6puIHThuqFwIGNow60gS2luaCBU4bq/IFBow6F0IFRyaeG7g24uIEPhu6UgdGjhu4MsIHTDoWMgZ2nhuqMgTFRQIHPhur0gdGh1IHRo4bqtcCBk4buvIGxp4buHdSBMaWtlcnQgNSBj4bunYSAgMTUxIHF1YW50IHPDoXQgxJHhu4MgxJHDoW5oIGdpw6Eg4bqjbmggaMaw4bufbmcgY+G7p2EgYuG7kW4gbmjDom4gdOG7kTogKDEpIFTDrW5oIGNo4bqldCBjw7RuZyB2aeG7h2MgKFRDQ1YpLCAoMikgVGnhu4FuIGzGsMahbmcgdsOgIHBow7pjIGzhu6NpIChUTFBMKSwgKDMpIMSQw6BvIHThuqFvIC0gcGjDoXQgdHJp4buDbiAoRFRQVCksIHbDoCAoNCkgUXVhbiBo4buHIGPDtG5nIHZp4buHYyAoUUgpIGzDqm4gTeG7qWMgxJHhu5kgaMOgaSBsw7JuZyAoU0hMKSBj4bunYSBuaMOibiB2acOqbi4gU+G7kSBsxrDhu6NuZyBjw6FjIGl0ZW1zL3F1ZXN0aW9ucyB0xrDGoW5nIOG7qW5nIHbhu5tpIGPDoWMgbmjDom4gdOG7kSB0csOqbiBsw6AgNywgNCwgNCwgNiB2w6AgMy4gUGjhuqduIDEgY+G7p2Egc+G6vSBoxrDhu5tuZyBk4bqrbiB04bqhbyBk4buvIGxp4buHdSBzYW8gY2hvIGtoaSB0aOG7sWMgaGnhu4duIGPDoWMgcGjDom4gdMOtY2ggdGjDrDogDQoNCjEuIELhuqNuZyBtYSB0cuG6rW4geG9heSBo4buZaSB04bulLCB0aOG6rW0gY2jDrSBsw6AgY8OhYyBo4buHIHPhu5EgdOG6o2kgbmjDom4gdOG7kSBy4bqldCBjYW8gKGPDoG5nIGNhbyBjw6BuZyDEkeG6uXApLiANCg0KMi4gQ8OhYyBraeG7g20gxJHhu4tuaCBuaMawIEtNTyBUZXN0LCBDcm9uYmFjaCBBbHBoYSDEkeG6uXAuIA0KDQojIENyZWF0ZSBEYXRhIGZvciBFRkEgQW5hbHlzaXMNCg0KxJDhu4MgdOG6oW8gcmEgZOG7ryBsaeG7h3UsIGPDoWNoIMSRxqFuIGdp4bqjbiBuaOG6pXQgbMOgLi4gc+G7rSBk4bulbmcgbeG7mXQgYuG7mSBk4buvIGxp4buHdSBi4bqldCBrw6wgbsOgbyDEkcOzLiBUcm9uZyBwb3N0IG7DoHkgdMO0aSBjaOG7jW4gYuG7mSBk4buvIGxp4buHdSAqKnJhcS5kYXQqKiB04burIGN14buRbiBbRGlzY292ZXJpbmcgU3RhdGlzdGljcyBVc2luZyBJQk0gU1BTUyBTdGF0aXN0aWNzXShodHRwczovL3d3dy5hbWF6b24uY29tL3M/az1EaXNjb3ZlcmluZytTdGF0aXN0aWNzK1VzaW5nK0lCTStTUFNTJnJlZj1uYl9zYl9ub3NzXzIpLiBUcsaw4bubYyBo4bq/dCDEkeG7jWMgYuG7mSBk4buvIGxp4buHdSBuw6B5IHbDoG8gUjogDQoNCmBgYHtyfQ0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgIEltcG9ydCBhbmQgcHJlcGFyZSBkYXRhDQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIENsZWFyIFIgZW52aXJvbm1lbnQ6IA0Kcm0obGlzdCA9IGxzKCkpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIEltcG9ydCBkYXRhOiANCg0KcmVhZC5kZWxpbSgiaHR0cDovL3d3dy5kaXNjb3ZlcmluZ3N0YXRpc3RpY3MuY29tL2RvY3MvZHNfZGF0YV9maWxlcy9SJTIwRGF0YSUyMEZpbGVzL3JhcS5kYXQiKSAtPiBzYXFfZGF0YQ0KYGBgDQoNCkNo4buNbiBz4buRIGzGsOG7o25nIG3huqt1IG5naGnDqm4gY+G7qXUsIGNo4bqzbmcgaOG6oW4sIGzDoCA0MDAgdOG7qyBi4buZIGThu68gbGnhu4d1IG7DoHk6IA0KDQpgYGB7cn0NCnNldC5zZWVkKDEyKQ0KZGF0YV9taW5pIDwtIHNhcV9kYXRhICU+JSBzYW1wbGVfbig0MDApDQpgYGANCg0KVGjhu7FjIGhp4buHbiBjw6FpIGfhu41pIGzDoCAibWEgdHLhuq1uIHhvYXkgLSByb3RhdGVkIG1hdHJpeCIgbmjGsCBjw6FjaCBn4buNaSBwaOG7lSBiaeG6v24g4bufIGPDoWMgcGFwZXIgdGnhur9uZyBWaeG7h3QuIFbDrCBjw7MgdOG6pXQgY+G6oyA1IG5ow6JuIHThu5EgbsOqbjogDQoNCmBgYHtyfQ0KbGlicmFyeShwc3ljaCkNCnJvdGF0ZWRfZk1hdHJpeCA8LSBwcmluY2lwYWwoZGF0YV9taW5pLCBuZmFjdG9ycyA9IDUsIHJvdGF0ZSA9ICJ2YXJpbWF4IikNCg0KcHJpbnQucHN5Y2gocm90YXRlZF9mTWF0cml4LCBjdXQgPSAwLjMsIGRpZ2l0cyA9IDMsIHNvcnQgPSBUUlVFKSAjIFBhZ2UgNjY1LiANCmBgYA0KDQpL4bq/dCBxdeG6oyBuw6B5IGNobyB0aOG6pXk6IA0KDQoxLiBN4buZdCBz4buRIGl0ZW1zIGjhu5lpIHThu6UuIMSQw6J5IGzDoCB0aW4gdOG7kXQuIA0KMi4gU+G7kSBsxrDhu6NuZyBjw6FjIGl0ZW1zIGPDsyB0aOG7gyBuaMOzbSB2w6BvIG3hu5l0IG5ow6JuIHThu5EgbsOgbyDEkcOzIGtow7RuZyB0csO5bmcga2jhu5twIHbhu5tpIHPhu5EgbMaw4bujbmcgaXRlbXMga8OsIHbhu41uZy4gxJDDonkgbMOgIHRpbiB44bqldS4gDQozLiBSb3RhdGVkIE1hdHJpeCBoxqFpIGzhu5luIHjhu5luIC0gdOG7qWMgbMOgIGtow7RuZyBo4buZaSB04bulIGzhuq9tLiDEkMOieSBsw6AgdGluIHjhuqV1LiANCg0KS2jDtG5nIHNhby4gROG7sWEgdHLDqm4ga+G6v3QgcXXhuqMgc8ahIGLhu5kgdHLDqm4gY2jDum5nIHRhIGPDsyB0aOG7gyB04bqhbyByYSBi4buZIGThu68gbGnhu4d1IHLhuqV0IMSR4bq5cC4gVHLGsOG7m2MgaOG6v3Qgdmnhur90IG3hu5l0IGjDoG0gY8OzIHTDqm4gbMOgICoqcmVwbGFjZV9zb21lVmFyKiogbcOgIGtoaSBuaOG6rW4gxJHhuqd1IHbDoG8geCBz4bq9OiANCg0KMS4gVGhheSB0aOG6vyAyMCUgZ2nDoSB0cuG7iyAxIGPhu6dhIHggdGjDoG5oIDIuIA0KMi4gVGhheSB0aOG6vyAyMCUgZ2nDoSB0cuG7iyA1IGPhu6dhIHggYuG6sW5nIDQuIA0KMy4gVGhheSB0aOG6vyAzMCUgZ2nDoSB0cuG7iyA0IHRow6BuaCA1LiANCjQuIFRoYXkgdGjhur8gMzAlIGdpw6EgdHLhu4sgMiB0aMOgbmggMy4gDQo1LiBUaGF5IHRo4bq/IDIwJSBnacOhIHRy4buLIDMgdGjDoG5oIDQuIA0KDQpU4bqldCBj4bqjIHRoYXkgdGjhur8gdHLDqm4sIGzDoCB0aGF5IHRo4bq/IG5n4bqrdSBuaGnDqm4uIEThu6lvaSDEkcOieSBsw6AgaMOgbSDEkcOzOiANCg0KDQpgYGB7cn0NCiMgRnVuY3Rpb24gcmVwbGFjZXMgc29tZSB2YWx1ZXM6IA0KDQpyZXBsYWNlX3NvbWVWYXIgPC0gZnVuY3Rpb24oeCkgew0KICANCiAgeSA8LSB3aGljaCh4ID09IDEpDQogIA0KICB6MSA8LSBzYW1wbGUoeSwgZmxvb3IoMC4yKmxlbmd0aCh5KSkpDQogIA0KICB4W3oxXSA8LSAyDQogIA0KICB5NSA8LSB3aGljaCh4ID09IDUpDQogIA0KICB6MiA8LSBzYW1wbGUoeTUsIGZsb29yKDAuMipsZW5ndGgoeTUpKSkNCiAgDQogIHhbejJdIDwtIDQNCiAgDQogIHk0IDwtIHdoaWNoKHggPT0gNCkNCiAgDQogIHozIDwtIHNhbXBsZSh5NCwgZmxvb3IoMC4zKmxlbmd0aCh5NCkpKQ0KICANCiAgeFt6M10gPC0gNQ0KDQogIHkyIDwtIHdoaWNoKHggPT0gMikNCiAgDQogIHQyIDwtIHNhbXBsZSh5MiwgZmxvb3IoMC4zKmxlbmd0aCh5MikpKQ0KICANCiAgeFt0Ml0gPC0gMw0KICANCiAgeTMgPC0gd2hpY2goeCA9PSAzKQ0KICANCiAgazMgPC0gc2FtcGxlKHkzLCBmbG9vcigwLjIqbGVuZ3RoKHkzKSkpDQogIA0KICB4W2szXSA8LSA0DQogIA0KICByZXR1cm4oeCkNCn0NCmBgYA0KDQpT4butIGThu6VuZyBow6BtIMSRw6MgY8OzIMSR4buDLCB0csaw4bubYyBo4bq/dCwgdOG6oW8gcmEgZGF0YSBwaMO5IGjhu6NwIHbhu5tpIHPhu5EgbMaw4bujbmcgY8OhYyBpdGVtcy9xdWVzdGlvbnMgdMawxqFuZyDhu6luZyB24bubaSBjw6FjIG5ow6JuIHThu5EgxJHhu5NuZyB0aOG7nWkgdGjhu7FjIGhp4buHbiBjw6FpIGfhu41pIGzDoCBraeG7g20gxJHhu4tuaCBDcm9uYmFjaCBBbHBoYSBsdcO0bjogDQoNCmBgYHtyfQ0KIz09PT09PT09PT09PT09PT09PQ0KIyAgR2VuZXJhdGUgZGF0YQ0KIz09PT09PT09PT09PT09PT09PQ0KDQojIFRDQ1Y6IA0KDQpmYWN0b3JfVENDViA8LSBkYXRhX21pbmkgJT4lIA0KICBtdXRhdGUodGNjdjEgPSBRMjEsIA0KICAgICAgICAgdGNjdjIgPSByZXBsYWNlX3NvbWVWYXIodGNjdjEpLCANCiAgICAgICAgIHRjY3YzID0gcmVwbGFjZV9zb21lVmFyKHRjY3YxKSwgDQogICAgICAgICB0Y2N2NCA9IHJlcGxhY2Vfc29tZVZhcih0Y2N2MSksIA0KICAgICAgICAgdGNjdjUgPSByZXBsYWNlX3NvbWVWYXIodGNjdjEpLCANCiAgICAgICAgIHRjY3Y2ID0gcmVwbGFjZV9zb21lVmFyKHRjY3YxKSwgDQogICAgICAgICB0Y2N2NyA9IHJlcGxhY2Vfc29tZVZhcih0Y2N2MSksIA0KICAgICAgICAgdGNjdjggPSByZXBsYWNlX3NvbWVWYXIodGNjdjEpKSAlPiUgDQogIHNlbGVjdChjb250YWlucygidGNjdiIpKQ0KDQpwc3ljaDo6YWxwaGEoZmFjdG9yX1RDQ1YpIC0+IGNyb25iYWNoX1RDQ1YNCg0KIyBRSENWOiANCg0KZmFjdG9yX1FIIDwtIGRhdGFfbWluaSAlPiUgDQogIG11dGF0ZShxaDEgPSBRMTcsIA0KICAgICAgICAgcWgyID0gcmVwbGFjZV9zb21lVmFyKHFoMSksIA0KICAgICAgICAgcWgzID0gcmVwbGFjZV9zb21lVmFyKHFoMSksIA0KICAgICAgICAgcWg0ID0gcmVwbGFjZV9zb21lVmFyKHFoMSksIA0KICAgICAgICAgcWg1ID0gcmVwbGFjZV9zb21lVmFyKHFoMSksIA0KICAgICAgICAgcWg2ID0gcmVwbGFjZV9zb21lVmFyKHFoMSkpICU+JSANCiAgc2VsZWN0KGNvbnRhaW5zKCJxaCIpKQ0KDQpwc3ljaDo6YWxwaGEoZmFjdG9yX1FIKSAtPiBjcm9uYmFjaF9RSA0KDQoNCiMgVExQTDogDQoNCmZhY3Rvcl9UTFBMIDwtIGRhdGFfbWluaSAlPiUgDQogIG11dGF0ZSh0bHBsMSA9IFEwMSwgDQogICAgICAgICB0bHBsMiA9IHJlcGxhY2Vfc29tZVZhcih0bHBsMSksIA0KICAgICAgICAgdGxwbDMgPSByZXBsYWNlX3NvbWVWYXIodGxwbDEpLCANCiAgICAgICAgIHRscGw0ID0gcmVwbGFjZV9zb21lVmFyKHRscGwxKSkgJT4lIA0KICBzZWxlY3QoY29udGFpbnMoInRscGwiKSkNCg0KcHN5Y2g6OmFscGhhKGZhY3Rvcl9UTFBMKSAtPiBjcm9uYmFjaF9UTFBMDQoNCg0KIyBEVFBUOiANCg0KZmFjdG9yX0RUUFQgPC0gZGF0YV9taW5pICU+JSANCiAgbXV0YXRlKGR0cHQxID0gUTA2LCANCiAgICAgICAgIGR0cHQyID0gcmVwbGFjZV9zb21lVmFyKGR0cHQxKSwgDQogICAgICAgICBkdHB0MyA9IHJlcGxhY2Vfc29tZVZhcihkdHB0MSksIA0KICAgICAgICAgZHRwdDQgPSByZXBsYWNlX3NvbWVWYXIoZHRwdDEpKSAlPiUgDQogIHNlbGVjdChjb250YWlucygiZHRwdCIpKQ0KDQpwc3ljaDo6YWxwaGEoZmFjdG9yX0RUUFQpIC0+IGNyb25iYWNoX0RUUFQNCg0KDQojIFNITDogDQoNCmZhY3Rvcl9TSEwgPC0gZGF0YV9taW5pICU+JSANCiAgbXV0YXRlKHNobDEgPSBRMjIsIA0KICAgICAgICAgc2hsMiA9IHJlcGxhY2Vfc29tZVZhcihzaGwxKSwgDQogICAgICAgICBzaGwzID0gcmVwbGFjZV9zb21lVmFyKHNobDEpKSAlPiUgDQogIHNlbGVjdChjb250YWlucygic2hsIikpDQoNCg0KcHN5Y2g6OmFscGhhKGZhY3Rvcl9TSEwpIC0+IGNyb25iYWNoX1NITA0KDQoNCiMgQ29tYmluZSBkYXRhIHNldHM6IA0KDQpmYWN0b3JfRFRQVCAlPiUgDQogIGJpbmRfY29scyhmYWN0b3JfUUgpICU+JSANCiAgYmluZF9jb2xzKGZhY3Rvcl9TSEwpICU+JSANCiAgYmluZF9jb2xzKGZhY3Rvcl9UQ0NWKSAlPiUgDQogIGJpbmRfY29scyhmYWN0b3JfVExQTCkgLT4gZGF0YV9mb3JfcGFwZXINCmBgYA0KDQrEkMOjIGPDsyBk4buvIGxp4buHdSBjaG8gdOG6pXQgY+G6oyBjw6FjIG5ow6JuIHThu5EgxJHhu4EgY+G6rXAgdHJvbmcgcGFwZXIuIFZp4buHYyB0aeG6v3AgdGhlbyBsw6AgbMawdSBs4bqhaSDEkeG7gyBwaOG6p24gbeG7gW0gU1BTUyBjw7MgdGjhu4MgxJHhu41jIMSR4buDIGfhu61pIGNobyB0aOG6p3ksIGVkaXRvciBob+G6t2MgaOG7mWkgxJHhu5NuZyBQaEQ6IA0KDQpgYGB7cn0NCmhhdmVuOjp3cml0ZV9zYXYoZGF0YV9mb3JfcGFwZXIsICJkYXRhX2Zvcl9wYXBlci5zYXYiKQ0KYGBgDQoNCiMgUmVzdWx0cw0KDQpUcsaw4bubYyBo4bq/dCBraeG7g20gdHJhIGzhuqFpIHLhurFuZyBi4bqjbmcgbWEgdHLhuq1uIHhvYXkgbMOgIGjhu5lpIHThu6UgdsOgIMSR4bq5cCBsdW5nIGxpbmg6IA0KDQpgYGB7cn0NCiMgUm90YXRlZCBtYXRyaXggKG9yIGxvYWRpbmdzIG1hdHJpeCk6IA0KDQpyb3RhdGVkX2ZNYXRyaXhfcGFwZXIgPC0gcHJpbmNpcGFsKGRhdGFfZm9yX3BhcGVyLCBuZmFjdG9ycyA9IDUsIHJvdGF0ZSA9ICJ2YXJpbWF4IikNCg0KcHJpbnQucHN5Y2gocm90YXRlZF9mTWF0cml4X3BhcGVyLCBjdXQgPSAwLjMsIGRpZ2l0cyA9IDMsIHNvcnQgPSBUUlVFKQ0KYGBgDQoNCktNTyBUZXN0IGPFqW5nIGhvw6BuIGjhuqNvOiANCg0KDQpgYGB7cn0NCiMgTWVhc3VyZSBvZiBTYW1wbGluZyBBZGVxdWFjeSAoTVNBKSAtIEtNTyBUZXN0OiANCktNTyhkYXRhX2Zvcl9wYXBlcikNCmBgYA0KDQpWw6AgY+G6oyBDcm9uYmFjaCBBbHBoYSBjaG8gdOG7q25nIG5ow6JuIHThu5EgY8Wpbmcga2jDtG5nIHRo4buDIMSR4bq5cCBoxqFuOiANCg0KYGBge3J9DQojIENyb25iYWNoIEFscGhhOiANCg0KcHJpbnQoY3JvbmJhY2hfRFRQVCkNCnByaW50KGNyb25iYWNoX1FIKQ0KcHJpbnQoY3JvbmJhY2hfU0hMKQ0KcHJpbnQoY3JvbmJhY2hfVENDVikNCnByaW50KGNyb25iYWNoX1RMUEwpDQoNCmBgYA0KDQpDw6FjIGvhur90IHF14bqjIOG7nyB0csOqbiBjw7MgdGjhu4MgdMOhaSBs4bqtcCBs4bqhaSBi4bqxbmcgU1BTUyBu4bq/dSBtdeG7kW4uIE1hIHRy4bqtbiB4b2F5LCBLTU8gVGVzdCB2w6AgQ3JvbmJhY2ggQWxwaGEgY2hvIG5ow6JuIHThu5EgRFRQVDogDQoNCiFbXShwaWMyLnBuZykNCg0KIyBGaW5hbCBOb3Rlcw0KDQoxLiBDw6FjaCB0aOG7qWMgdOG6oW8gZOG7ryBsaeG7h3UgxJHhurlwIG5oxrAgdHLDqm4gY8OzIHRo4buDIMSRxrDhu6NjIMOhcCBk4bulbmcgY2hvIGLhuqV0IGvDrCB0w6xuaCBodeG7kW5nIG7DoG8gbcOgIGtow7RuZyBnaeG7m2kgaOG6oW4gc+G7kSBsxrDhu6NuZyBuaMOibiB04buRLCBz4buRIGzGsOG7o25nIGPDonUgaOG7j2kgY+G6pXUgdGjDoG5oIG5ow6JuIHThu5EgdsOgIHF1eSBtw7QgbeG6q3UuIFbDoCBjw7MgdGjhu4Mgw6FwIGThu6VuZyBjaG8gY8OhYyBraeG7g3UgcGjDom4gdMOtY2gga2jDoWMgbmjGsCBDRkEsIFNFTS4gDQoyLiBDw6FjIGLDoGkgdmnhur90IMSRxrDhu6NjIG5o4bqvYyDEkeG6v24gdHJvbmcgcG9zdCBuw6B5IGtow7RuZyBjw7MgbmdoxKlhIGzDoCDEkWkgxJHhur9uIGvhur90IGx14bqtbiBy4bqxbmcgY2jDum5nIGThu7FhIHRyw6puIGThu68gbGnhu4d1IGdp4bqjIGhheSBtaXNtYW5hZ2VtZW50IG9mIGRhdGEuIA0KMy4gVuG7gSB24bqlbiDEkeG7gSB04bqhbyBk4buvIGxp4buHdSBjaG8gcGFwZXIgYuG6oW4gxJHhu41jIHF1YW4gdMOibSBjw7MgdGjhu4MgxJHhu41jIOG7nzoNCg0KLSBbVGVjaG5vbG9neSBoYXMgbWFkZSBpdCBlYXNpZXIgdG8gZmFrZSBzY2llbnRpZmljIHJlc3VsdHMuIElzIGEgY3VsdHVyYWwgc2hpZnQgcmVxdWlyZWQgdG8gZml4IHRoZSBwcm9ibGVtP10oaHR0cHM6Ly9tYXNzaXZlc2NpLmNvbS9hcnRpY2xlcy9zY2llbnRpZmljLXB1Ymxpc2hpbmctbWlzY29uZHVjdC1pbWFnZS1kdXBsaWNhdGlvbi1wYXBlci1yZXRyYWN0aW9ucy8pLiANCi0gW0Zha2UgZGF0YSwgcGFwZXIgbWlsbHMsIGFuZCB0aGVpciBhdXRob3JzOiBUaGUgSW50ZXJuYXRpb25hbCBKb3VybmFsIG9mIENhbmNlciByZWFjdHMgdG8gdGhpcyB0aHJlYXQgdG8gc2NpZW50aWZpYyBpbnRlZ3JpdHldKGh0dHBzOi8vb25saW5lbGlicmFyeS53aWxleS5jb20vZG9pLzEwLjEwMDIvaWpjLjMzNjA0KS4gDQotIFtXaHkgRmFrZSBEYXRhIFdoZW4gWW91IENhbiBGYWtlIGEgU2NpZW50aXN0P10oaHR0cHM6Ly9uYXV0aWwudXMvaXNzdWUvNDIvZmFrZXMvd2h5LWZha2UtZGF0YS13aGVuLXlvdS1jYW4tZmFrZS1hLXNjaWVudGlzdCkuIA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=