#===================================================================================
#Extreme gradient boosted machines
#===================================================================================
#install.packages("drat", repos="https://cran.rstudio.com")
drat:::addRepo("dmlc")
#install.packages("xgboost")
#install.packages("xgboost", repos="http://dmlc.ml/drat/", type = "source")
library(xgboost)
#install.packages(" DiagrammeR")
#install.packages("drat", repos="https://cran.rstudio.com")
#install.packages("DiagrammeR")
library(DiagrammeR)
require(xgboost)
data(agaricus.train, package='xgboost')
data(agaricus.test, package='xgboost')
train <- agaricus.train
test <- agaricus.test
str(train)
List of 2
 $ data :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  .. ..@ i       : int [1:143286] 2 6 8 11 18 20 21 24 28 32 ...
  .. ..@ p       : int [1:127] 0 369 372 3306 5845 6489 6513 8380 8384 10991 ...
  .. ..@ Dim     : int [1:2] 6513 126
  .. ..@ Dimnames:List of 2
  .. .. ..$ : NULL
  .. .. ..$ : chr [1:126] "cap-shape=bell" "cap-shape=conical" "cap-shape=convex" "cap-shape=flat" ...
  .. ..@ x       : num [1:143286] 1 1 1 1 1 1 1 1 1 1 ...
  .. ..@ factors : list()
 $ label: num [1:6513] 1 0 0 1 0 0 0 1 0 0 ...
train$data
6513 x 126 sparse Matrix of class "dgCMatrix"
   [[ suppressing 44 column names ‘cap-shape=bell’, ‘cap-shape=conical’, ‘cap-shape=convex’ ... ]]
   [[ suppressing 44 column names ‘cap-shape=bell’, ‘cap-shape=conical’, ‘cap-shape=convex’ ... ]]
                                                                                                    
 [1,] . . 1 . . . . . . 1 1 . . . . . . . . . 1 . . . . . . . . 1 . . . 1 . 1 . . . 1 1 . . . ......
 [2,] . . 1 . . . . . . 1 . . . . . . . . . 1 1 . 1 . . . . . . . . . . 1 . 1 . . 1 . 1 . . . ......
 [3,] 1 . . . . . . . . 1 . . . . . . . . 1 . 1 . . 1 . . . . . . . . . 1 . 1 . . 1 . . 1 . . ......
 [4,] . . 1 . . . . . 1 . . . . . . . . . 1 . 1 . . . . . . . . 1 . . . 1 . 1 . . . 1 . 1 . . ......
 [5,] . . 1 . . . . . . 1 . . . 1 . . . . . . . 1 . . . . . . 1 . . . . 1 . . 1 . 1 . 1 . . . ......
 [6,] . . 1 . . . . . 1 . . . . . . . . . . 1 1 . 1 . . . . . . . . . . 1 . 1 . . 1 . . 1 . . ......
 [7,] 1 . . . . . . . . 1 . . . . . . . . 1 . 1 . 1 . . . . . . . . . . 1 . 1 . . 1 . . . . . ......
 [8,] . . 1 . . . . . 1 . . . . . . . . . 1 . 1 . . . . . . . . 1 . . . 1 . 1 . . . 1 . . . . ......
 [9,] 1 . . . . . . . . 1 . . . . . . . . . 1 1 . 1 . . . . . . . . . . 1 . 1 . . 1 . . . . . ......
[10,] . . 1 . . . . . 1 . . . . . . . . . . 1 1 . . 1 . . . . . . . . . 1 . 1 . . 1 . . . . . ......
[11,] . . 1 . . . . . 1 . . . . . . . . . . 1 1 . 1 . . . . . . . . . . 1 . 1 . . 1 . . 1 . . ......

 ..............................
 ........suppressing columns and rows in show(); maybe adjust 'options(max.print= *, width = *)'
 ..............................
   [[ suppressing 44 column names ‘cap-shape=bell’, ‘cap-shape=conical’, ‘cap-shape=convex’ ... ]]
                                                                                                      
[6503,] 1 . . . . . . . . 1 . . . . . . . . 1 . . 1 . . . . . . 1 . . . . 1 . . 1 . 1 . . . . . ......
[6504,] . . 1 . . . . . . 1 1 . . . . . . . . . . 1 . . . . . . 1 . . 1 . . . 1 . . 1 . . . . . ......
[6505,] . . . . 1 . . . . 1 1 . . . . . . . . . . 1 . . . . . . 1 . . 1 . . . 1 . . 1 . . . . . ......
[6506,] . . . 1 . . . . 1 . . . 1 . . . . . . . . 1 . . . . . 1 . . . 1 . . . 1 . . 1 . . . . . ......
[6507,] . . 1 . . . . . . 1 1 . . . . . . . . . . 1 . . . . . . 1 . . 1 . . . 1 . . 1 . . . . . ......
[6508,] . . . . 1 . . . 1 . 1 . . . . . . . . . . 1 . . . . . . . . 1 . . 1 . 1 . . . 1 . . 1 . ......
[6509,] . . . . 1 . . . . 1 . . . . . . . 1 . . . 1 . . . 1 . . . . . . . 1 . 1 . . . 1 . . 1 . ......
[6510,] . . . . 1 . . . 1 . 1 . . . . . . . . . . 1 . . . . 1 . . . . . . 1 . 1 . . . 1 . . 1 . ......
[6511,] . . 1 . . . . . . 1 1 . . . . . . . . . . 1 . . . . . . 1 . . 1 . . . 1 . . 1 . . . . . ......
[6512,] . . . 1 . . . . . 1 1 . . . . . . . . . . 1 . . . . . . 1 . . 1 . . . 1 . . 1 . . 1 . . ......
[6513,] . . 1 . . . . . . 1 1 . . . . . . . . . . 1 . . . . . . 1 . . 1 . . . 1 . . 1 . . . . . ......
class(train)
[1] "list"
#dgCMatrix
 
model <- xgboost(data = train$data, label = train$label,
                 nrounds = 2, objective = "binary:logistic")
[1] train-error:0.000614 
[2] train-error:0.001228 
#preds = predict(model, test)
#confusionMatrix(test$label,preds)
cv.res <- xgb.cv(data = train$data, label = train$label, nfold = 5,
                 nrounds = 2, objective = "binary:logistic")
[1] train-error:0.000921+0.000282   test-error:0.001228+0.001041 
[2] train-error:0.001075+0.000260   test-error:0.001228+0.001041 
loglossobj <- function(preds, dtrain) {
  # dtrain is the internal format of the training data
  # We extract the labels from the training data
  labels <- getinfo(dtrain, "label")
  # We compute the 1st and 2nd gradient, as grad and hess
  preds <- 1/(1 + exp(-preds))
  grad <- preds - labels
  hess <- preds * (1 - preds)
  # Return the result as a list
  return(list(grad = grad, hess = hess))
}
model <- xgboost(data = train$data, label = train$label,
                 nrounds = 2, objective = loglossobj, eval_metric = "error")
[1] train-error:0.001228 
[2] train-error:0.001228 
bst <- xgb.cv(data = train$data, label = train$label, nfold = 5,
              nrounds = 20, objective = "binary:logistic",
              early_stopping_rounds = 3, maximize = FALSE)
[1] train-error:0.000921+0.000372   test-error:0.001228+0.000376 
Multiple eval metrics are present. Will use test_error for early stopping.
Will train until test_error hasn't improved in 3 rounds.

[2] train-error:0.001228+0.000094   test-error:0.001228+0.000376 
[3] train-error:0.000653+0.000448   test-error:0.001075+0.000614 
[4] train-error:0.000192+0.000243   test-error:0.000461+0.000614 
[5] train-error:0.000000+0.000000   test-error:0.000000+0.000000 
[6] train-error:0.000000+0.000000   test-error:0.000000+0.000000 
[7] train-error:0.000000+0.000000   test-error:0.000000+0.000000 
[8] train-error:0.000000+0.000000   test-error:0.000000+0.000000 
Stopping. Best iteration:
[5] train-error:0.000000+0.000000   test-error:0.000000+0.000000
dtrain <- xgb.DMatrix(train$data, label = train$label)
model <- xgboost(data = dtrain, nrounds = 2, objective = "binary:logistic")
[1] train-error:0.000614 
[2] train-error:0.001228 
pred_train <- predict(model, dtrain, outputmargin=TRUE)
setinfo(dtrain, "base_margin", pred_train)
[1] TRUE
model <- xgboost(data = dtrain, nrounds = 2, objective = "binary:logistic")
[1] train-error:0.000614 
[2] train-error:0.000614 
dat <- matrix(rnorm(128), 64, 2)
label <- sample(0:1, nrow(dat), replace = TRUE)
for (i in 1:nrow(dat)) {
  ind <- sample(2, 1)
  dat[i, ind] <- NA
}
model <- xgboost(data = dat, label = label, missing = NA,
                 nrounds = 2, objective = "binary:logistic")
[1] train-error:0.250000 
[2] train-error:0.250000 
bst <- xgboost(data = train$data, label = train$label, max.depth = 2,
               eta = 1, nthread = 2, nround = 2, objective = "binary:logistic")
[1] train-error:0.046522 
[2] train-error:0.022263 
xgb.plot.tree(feature_names = agaricus.train$data@Dimnames[[2]], model = bst)

bst <- xgboost(data = train$data, label = train$label, max.depth = 2,
               eta = 1, nthread = 2, nround = 10, objective = "binary:logistic")
[1] train-error:0.046522 
[2] train-error:0.022263 
[3] train-error:0.007063 
[4] train-error:0.015200 
[5] train-error:0.007063 
[6] train-error:0.001228 
[7] train-error:0.001228 
[8] train-error:0.001228 
[9] train-error:0.001228 
[10]    train-error:0.000000 
xgb.plot.tree(feature_names = agaricus.train$data@Dimnames[[2]], model = bst)

bst <- xgboost(data = train$data, label = train$label, max.depth = 15,
               eta = 1, nthread = 2, nround = 30, objective = "binary:logistic",
               min_child_weight = 50)
[1] train-error:0.039306 
[2] train-error:0.024413 
[3] train-error:0.015507 
[4] train-error:0.015507 
[5] train-error:0.012283 
[6] train-error:0.015507 
[7] train-error:0.017350 
[8] train-error:0.014740 
[9] train-error:0.015354 
[10]    train-error:0.013051 
[11]    train-error:0.016889 
[12]    train-error:0.015354 
[13]    train-error:0.015815 
[14]    train-error:0.015815 
[15]    train-error:0.015815 
[16]    train-error:0.015815 
[17]    train-error:0.015815 
[18]    train-error:0.015815 
[19]    train-error:0.015815 
[20]    train-error:0.015815 
[21]    train-error:0.015815 
[22]    train-error:0.015815 
[23]    train-error:0.015815 
[24]    train-error:0.015815 
[25]    train-error:0.015815 
[26]    train-error:0.015815 
[27]    train-error:0.015815 
[28]    train-error:0.015815 
[29]    train-error:0.015815 
[30]    train-error:0.015815 
xgb.plot.multi.trees(model = bst, feature_names = agaricus.train$data@Dimnames[[2]], features_keep = 3)

bst <- xgboost(data = train$data, label = train$label, max.depth = 2,
               eta = 1, nthread = 2, nround = 2,objective = "binary:logistic")
[1] train-error:0.046522 
[2] train-error:0.022263 
importance_matrix <- xgb.importance(agaricus.train$data@Dimnames[[2]], model = bst)
xgb.plot.importance(importance_matrix)

bst <- xgboost(data = train$data, label = train$label, max.depth = 15,
               eta = 1, nthread = 2, nround = 30, objective = "binary:logistic",
               min_child_weight = 50)
[1] train-error:0.039306 
[2] train-error:0.024413 
[3] train-error:0.015507 
[4] train-error:0.015507 
[5] train-error:0.012283 
[6] train-error:0.015507 
[7] train-error:0.017350 
[8] train-error:0.014740 
[9] train-error:0.015354 
[10]    train-error:0.013051 
[11]    train-error:0.016889 
[12]    train-error:0.015354 
[13]    train-error:0.015815 
[14]    train-error:0.015815 
[15]    train-error:0.015815 
[16]    train-error:0.015815 
[17]    train-error:0.015815 
[18]    train-error:0.015815 
[19]    train-error:0.015815 
[20]    train-error:0.015815 
[21]    train-error:0.015815 
[22]    train-error:0.015815 
[23]    train-error:0.015815 
[24]    train-error:0.015815 
[25]    train-error:0.015815 
[26]    train-error:0.015815 
[27]    train-error:0.015815 
[28]    train-error:0.015815 
[29]    train-error:0.015815 
[30]    train-error:0.015815 
xgb.plot.deepness(model = bst)

bst <- xgboost(data = train$data, label = train$label, max.depth = 2,
               eta = 1, nthread = 2, nround = 10, objective = "binary:logistic")
[1] train-error:0.046522 
[2] train-error:0.022263 
[3] train-error:0.007063 
[4] train-error:0.015200 
[5] train-error:0.007063 
[6] train-error:0.001228 
[7] train-error:0.001228 
[8] train-error:0.001228 
[9] train-error:0.001228 
[10]    train-error:0.000000 
xgb.plot.tree(feature_names = agaricus.train$data@Dimnames[[2]], model = bst)

library(xgboost)
library(readr)
library(stringr)
library(caret)
Loading required package: lattice
Loading required package: ggplot2
library(car)
#=========================================================================================================================
#                         
# DiagrammeR package Tutorial
# 
#=========================================================================================================================
ls("package:DiagrammeR")
  [1] "%>%"                          "add_balanced_tree"            "add_cycle"                   
  [4] "add_edge"                     "add_edge_clone"               "add_edge_df"                 
  [7] "add_edges_from_table"         "add_edges_w_string"           "add_forward_edges_ws"        
 [10] "add_full_graph"               "add_global_graph_attrs"       "add_gnp_graph"               
 [13] "add_graph_action"             "add_grid_2d"                  "add_grid_3d"                 
 [16] "add_mathjax"                  "add_n_node_clones"            "add_n_nodes"                 
 [19] "add_n_nodes_ws"               "add_node"                     "add_node_df"                 
 [22] "add_nodes_from_df_cols"       "add_nodes_from_table"         "add_pa_graph"                
 [25] "add_path"                     "add_prism"                    "add_reverse_edges_ws"        
 [28] "add_star"                     "add_to_series"                "cache_edge_attrs"            
 [31] "cache_edge_attrs_ws"          "cache_edge_count_ws"          "cache_node_attrs"            
 [34] "cache_node_attrs_ws"          "cache_node_count_ws"          "clear_global_graph_attrs"    
 [37] "clear_selection"              "colorize_edge_attrs"          "colorize_node_attrs"         
 [40] "combine_edfs"                 "combine_graphs"               "combine_ndfs"                
 [43] "copy_edge_attrs"              "copy_node_attrs"              "count_asymmetric_node_pairs" 
 [46] "count_automorphisms"          "count_mutual_node_pairs"      "count_unconnected_node_pairs"
 [49] "create_complement_graph"      "create_edge_df"               "create_graph"                
 [52] "create_node_df"               "create_random_graph"          "create_series"               
 [55] "create_subgraph_ws"           "delete_edge"                  "delete_edges_ws"             
 [58] "delete_global_graph_attrs"    "delete_graph_actions"         "delete_node"                 
 [61] "delete_nodes_ws"              "DiagrammeR"                   "DiagrammeROutput"            
 [64] "display_metagraph"            "do_bfs"                       "do_dfs"                      
 [67] "drop_edge_attrs"              "drop_node_attrs"              "edge_count"                  
 [70] "edge_info"                    "edge_present"                 "edge_rel"                    
 [73] "export_csv"                   "export_graph"                 "from_adj_matrix"             
 [76] "from_igraph"                  "generate_dot"                 "get_adhesion"                
 [79] "get_agg_degree_in"            "get_agg_degree_out"           "get_agg_degree_total"        
 [82] "get_all_connected_nodes"      "get_alpha_centrality"         "get_articulation_points"     
 [85] "get_attr_dfs"                 "get_authority_centrality"     "get_betweenness"             
 [88] "get_bridging"                 "get_cache"                    "get_closeness"               
 [91] "get_closeness_vitality"       "get_cmty_edge_btwns"          "get_cmty_fast_greedy"        
 [94] "get_cmty_l_eigenvec"          "get_cmty_louvain"             "get_cmty_walktrap"           
 [97] "get_common_nbrs"              "get_constraint"               "get_coreness"                
[100] "get_degree_distribution"      "get_degree_histogram"         "get_degree_in"               
[103] "get_degree_out"               "get_degree_total"             "get_dice_similarity"         
[106] "get_eccentricity"             "get_edge_attrs"               "get_edge_attrs_ws"           
[109] "get_edge_count_w_multiedge"   "get_edge_df"                  "get_edge_ids"                
[112] "get_edges"                    "get_eigen_centrality"         "get_girth"                   
[115] "get_global_graph_attrs"       "get_graph_actions"            "get_graph_from_series"       
[118] "get_graph_log"                "get_graph_name"               "get_graph_time"              
[121] "get_jaccard_similarity"       "get_last_edges_created"       "get_last_nodes_created"      
[124] "get_leverage_centrality"      "get_max_eccentricity"         "get_mean_distance"           
[127] "get_min_cut_between"          "get_min_eccentricity"         "get_min_spanning_tree"       
[130] "get_multiedge_count"          "get_nbrs"                     "get_node_attrs"              
[133] "get_node_attrs_ws"            "get_node_df"                  "get_node_ids"                
[136] "get_non_nbrs"                 "get_pagerank"                 "get_paths"                   
[139] "get_periphery"                "get_predecessors"             "get_radiality"               
[142] "get_reciprocity"              "get_s_connected_cmpts"        "get_selection"               
[145] "get_similar_nbrs"             "get_successors"               "get_w_connected_cmpts"       
[148] "graph_count"                  "graph_info"                   "grViz"                       
[151] "grVizOutput"                  "image_icon"                   "import_graph"                
[154] "invert_selection"             "is_edge_loop"                 "is_edge_multiple"            
[157] "is_edge_mutual"               "is_graph_connected"           "is_graph_dag"                
[160] "is_graph_directed"            "is_graph_empty"               "is_graph_simple"             
[163] "is_graph_weighted"            "is_property_graph"            "join_edge_attrs"             
[166] "join_node_attrs"              "layout_nodes_w_string"        "mermaid"                     
[169] "mutate_edge_attrs"            "mutate_edge_attrs_ws"         "mutate_node_attrs"           
[172] "mutate_node_attrs_ws"         "node_count"                   "node_info"                   
[175] "node_present"                 "node_type"                    "nudge_node_positions_ws"     
[178] "open_graph"                   "recode_edge_attrs"            "recode_node_attrs"           
[181] "remove_from_series"           "rename_edge_attrs"            "rename_node_attrs"           
[184] "render_graph"                 "render_graph_from_series"     "renderDiagrammeR"            
[187] "renderGrViz"                  "reorder_graph_actions"        "replace_in_spec"             
[190] "rescale_edge_attrs"           "rescale_node_attrs"           "rev_edge_dir"                
[193] "rev_edge_dir_ws"              "save_graph"                   "select_edges"                
[196] "select_edges_by_edge_id"      "select_edges_by_node_id"      "select_last_edges_created"   
[199] "select_last_nodes_created"    "select_nodes"                 "select_nodes_by_degree"      
[202] "select_nodes_by_id"           "select_nodes_in_neighborhood" "series_info"                 
[205] "set_cache"                    "set_df_as_edge_attr"          "set_df_as_node_attr"         
[208] "set_edge_attrs"               "set_edge_attrs_ws"            "set_global_graph_attrs"      
[211] "set_graph_name"               "set_graph_time"               "set_graph_undirected"        
[214] "set_node_attr_to_display"     "set_node_attr_w_fcn"          "set_node_attrs"              
[217] "set_node_attrs_ws"            "set_node_position"            "subset_series"               
[220] "to_igraph"                    "trav_both"                    "trav_both_edge"              
[223] "trav_in"                      "trav_in_edge"                 "trav_in_node"                
[226] "trav_out"                     "trav_out_edge"                "trav_out_node"               
[229] "trav_reverse_edge"            "trigger_graph_actions"        "visnetwork"                  
[232] "x11_hex"                     
grViz("
  digraph boxes_and_circles{
      
      node [shape = box]
      A; B; C; D
      
      
      }
      ")

grViz("
digraph bayesModel {
graph [overlap = true, fontsize = 10]
  # I'll make the data a triangle
  node [shape = triangle,
        fontname = Helvetica]
  y
  
  # parameters will be boxes
  node [shape = box,
        fontname = Helvetica]
  theta; sigma2; mu; tau2; lambda; phi2; psi; 
  delta; gamma; omega2; c; d
  # distributions will be circles.
  node [shape = circle,
        fixedsize = false,
        width = 0.9] // sets as circles
  normal1 normal2 normal3 normal4 invGamma1 invGamma2
  # several 'edge' statements
  {gamma omega2}->normal1->lambda 
  {c d}->invGamma1->phi2
  {lambda phi2}->normal2->mu
  {psi delta}->invGamma2->tau2
  {mu tau2}->normal3->theta
  {theta sigma2}->normal4->y
}
")

mermaid("
graph TD
        a[gamma]-->c(normal1)
        b[omega2]-->c(normal1)
        c-->d[lambda]
        e[c]-->g(invGamma1)
        f[d]-->g(invGamma1)
        g-->h[phi2]
        d-->k(normal2)
        h-->k(normal2)
        k-->l[mu]
        m[psi]-->o(invGamma2)
        n[delta]-->o(invGamma2)
        o(invGamma2)-->p[tau2]
        l-->q(normal3)
        p-->q(normal3)
        q-->r[theta]
        r-->t(normal4)
        s[sigma2]-->t(normal4)
        t-->u>y]
        ")

#=========================================================================================================================
#                         
# editR package
# 
#=========================================================================================================================
#devtools::install_github("trestletech/shinyAce")
#devtools::install_github("swarm-lab/editR")
#install.packages(c("shiny", "shinyFiles", "shinyBS", "rmarkdown", "knitr"))
library(editR)  # renders an r files as a markdown document
library(shinyAce)
library(rmarkdown)
#Now that that's installed and attached, I'm just supposed to call editR() on a .Rmd file. Here goes with my cold winter
#stats./) post from last spring.
#editR(file = "coldWinterStats.Rmd")
# editR
# 
# IMPORTANT: the latest version of editR (>=0.2) has undergone important modifications (see release notes below). The most important changes are the following:
#   
#   - editR is now fully compatible with the latest version of shiny on CRAN (>=0.11). editR was modified to support Twitter Bootstrap version 3 instead of version 2 as in the previous releases.
# 
# - editR now relies (almost) entirely on packages available through CRAN and not on a large number of experimental packages as previously. This will facilitate the installation process.
# 
# As a consequence of these modifications I strongly recommend that you reinstall editR following the new instructions below.
# 
# Release notes
# 
# editR is a basic Rmarkdown editor with instant previewing of your document. It allows you to create and edit Rmarkdown documents while instantly previewing the result of your writing and coding. It also allows you to render your Rmarkdown file in any format permitted by the rmarkdown R package.
# 
# Screenshot of editR window
# 
# Installation
# 
# Installing editR from this GitHub repository is now pretty straightforward. Simply copying the following lines of code in your R terminal should to install everything you need to run editR on your computer:
#   
#   if (!require("devtools")) install.packages("devtools")
# devtools::install_github("trestletech/shinyAce")
# devtools::install_github("swarm-lab/editR")
# 
# library(editR)
# editR requires the installation of the latest versions of following packages on CRAN:
#   
#   shiny
# shinyFiles
# shinyBS
# rmarkdown
# knitr
# It also requires the installation of the development version of the following package on GitHub:
#   
#   shinyAce
# Finally, to render documents in various output formats (.html, .pdf, .docx), editR uses the render function from the rmarkdown package. This function requires the installation of pandoc to work. Installation instructions for pandoc can be found at: http://johnmacfarlane.net/pandoc/installing.html. For Mac users, I recommend that you install pandoc via Homebrew or MacPorts.
# 
# Usage
# 
# To start editR, simply run this line of code in your R console:
#   
#   editR("path/to/file.Rmd")
# with "path/to/file.Rmd" the path to a new or existing .Rmd (or .md) file. If this is a new file, it will be created at this location. You can also open an existing file from within editR using the File > Open file menu.
# 
# You can also open editR without providing a path to a new or existing .Rmd file.
# 
# editR()
# In this case a temporary new file will be created that can then be saved from withing the user interface of editR.
# 
# For more information about authoring Rmarkdown files, visit http://rmarkdown.rstudio.com/.
# 
# 
#=========================================================================================================================
#                         
# servr package
# 
#=========================================================================================================================
#Yihui Xie's servr can apparently do real-time rendering as well. I can't speak to its functionality, but I 
#may try it in the future
#=========================================================================================================================
#                         
# R Function to Make Octopress Posts
# 
#=========================================================================================================================
#I've taken my first steps with Octopress, but I'm still a little wobbly on my feet (er, arms). Since I write most of 
#my posts in RStudio using the RMarkdown language and the knitr package, I thought I'd try writing a function in R that 
#knits my .rmd (that's the RMarkdown extension) files directly to my blog, including making a new post and assigning 
#categories and tags. When I was using wordpress I could use the knit2wp function, but that was back when I was still 
#doing things the easy way. Here goes!
# knit2blog = function(file, layout = "post", title, 
#                      comments = c("true", "false"), categories = "", 
#                      blogdir = getOption("blogdir"),
#                      postdir = getOption("postdir"), mate = F){
#   
#   curdir = getwd(); on.exit(setwd(curdir))
#   
#   # knit to temporary html file
#   outfile = "temp_outfile.html"
#   knit2html(file, output = outfile) # HTML content, temporarily stored in wd
#   
#   # Make yaml front matter:
#   comments = match.arg(comments)
#   curtime = format(Sys.time(), "%Y-%m-%d %H:%M:%S %z") 
#   
#   if(length(categories) > 1) 
#     categstr = paste0("[", paste(categories, collapse = ", "), "]") 
#   else categstr = categories
#   
#   yamlfm = paste0("---\nlayout: ", layout, '\ntitle: "', title, '"\ndate: ', 
#                   curtime, "\ncomments: ", comments, "\ncategories: ", 
#                   categstr, "\n---")
#   
#   # make file with only yaml front matter
#   curdate = format(Sys.time(), "%Y-%m-%d-") 
#   postname = paste0(curdate, title, ".html")
#   postloc = paste0('"', blogdir, postdir, '"')
#   write.table(yamlfm, postname, quote = F, row.names = F, col.names = F)
#   
#   # Add html content to yaml front matter html file
#   file.append(postname, outfile)
#   file.remove(outfile)
#   
#   pn.q = paste0('"', postname, '"') # NEED EXTRA QUOTES FOR CALLING mv
#   
#   calstr = paste("mv -f", pn.q, postloc, sep = " ")
#   print(calstr)
#   system(calstr)  
#   
#   # Optionally open in TextMate
#   if(mate) system(paste0("mate ", postloc, "/", pn.q))
# }
# 
# options(blogdir = "/Users/nanaakwasiabayieboateng/Documents/memphisclassesbooks/DataMiningscience",
#         postdir = "source/_posts/")
# # knit2blog("USGS dataRetrieval.rmd", title = "testtest", categories = c("cat1", "cat2"),
# #           mate = T)
LS0tCnRpdGxlOiAieGdib29zdCBUdXRvcmlhbCIKb3V0cHV0OiBodG1sX25vdGVib29rCmRmX3ByaW50OiBwYWdlZAphdXRob3I6ICJOYW5hICBCb2F0ZW5nIgpUaW1lOiAnYHIgU3lzLnRpbWUoKWAnCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVCICVkLCAlWScpYCIKLS0tCgoKCmBgYHtyfQoKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiNFeHRyZW1lIGdyYWRpZW50IGJvb3N0ZWQgbWFjaGluZXMKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5zdGFsbC5wYWNrYWdlcygiZHJhdCIsIHJlcG9zPSJodHRwczovL2NyYW4ucnN0dWRpby5jb20iKQpkcmF0Ojo6YWRkUmVwbygiZG1sYyIpCiNpbnN0YWxsLnBhY2thZ2VzKCJ4Z2Jvb3N0IikKI2luc3RhbGwucGFja2FnZXMoInhnYm9vc3QiLCByZXBvcz0iaHR0cDovL2RtbGMubWwvZHJhdC8iLCB0eXBlID0gInNvdXJjZSIpCmxpYnJhcnkoeGdib29zdCkKI2luc3RhbGwucGFja2FnZXMoIiBEaWFncmFtbWVSIikKI2luc3RhbGwucGFja2FnZXMoImRyYXQiLCByZXBvcz0iaHR0cHM6Ly9jcmFuLnJzdHVkaW8uY29tIikKI2luc3RhbGwucGFja2FnZXMoIkRpYWdyYW1tZVIiKQpsaWJyYXJ5KERpYWdyYW1tZVIpCgoKCnJlcXVpcmUoeGdib29zdCkKCmRhdGEoYWdhcmljdXMudHJhaW4sIHBhY2thZ2U9J3hnYm9vc3QnKQpkYXRhKGFnYXJpY3VzLnRlc3QsIHBhY2thZ2U9J3hnYm9vc3QnKQp0cmFpbiA8LSBhZ2FyaWN1cy50cmFpbgp0ZXN0IDwtIGFnYXJpY3VzLnRlc3QKCnN0cih0cmFpbikKdHJhaW4kZGF0YQpjbGFzcyh0cmFpbikKI2RnQ01hdHJpeAogCm1vZGVsIDwtIHhnYm9vc3QoZGF0YSA9IHRyYWluJGRhdGEsIGxhYmVsID0gdHJhaW4kbGFiZWwsCiAgICAgICAgICAgICAgICAgbnJvdW5kcyA9IDIsIG9iamVjdGl2ZSA9ICJiaW5hcnk6bG9naXN0aWMiKQoKCgojcHJlZHMgPSBwcmVkaWN0KG1vZGVsLCB0ZXN0KQoKI2NvbmZ1c2lvbk1hdHJpeCh0ZXN0JGxhYmVsLHByZWRzKQoKCmN2LnJlcyA8LSB4Z2IuY3YoZGF0YSA9IHRyYWluJGRhdGEsIGxhYmVsID0gdHJhaW4kbGFiZWwsIG5mb2xkID0gNSwKICAgICAgICAgICAgICAgICBucm91bmRzID0gMiwgb2JqZWN0aXZlID0gImJpbmFyeTpsb2dpc3RpYyIpCgoKCmxvZ2xvc3NvYmogPC0gZnVuY3Rpb24ocHJlZHMsIGR0cmFpbikgewogICMgZHRyYWluIGlzIHRoZSBpbnRlcm5hbCBmb3JtYXQgb2YgdGhlIHRyYWluaW5nIGRhdGEKICAjIFdlIGV4dHJhY3QgdGhlIGxhYmVscyBmcm9tIHRoZSB0cmFpbmluZyBkYXRhCiAgbGFiZWxzIDwtIGdldGluZm8oZHRyYWluLCAibGFiZWwiKQogICMgV2UgY29tcHV0ZSB0aGUgMXN0IGFuZCAybmQgZ3JhZGllbnQsIGFzIGdyYWQgYW5kIGhlc3MKICBwcmVkcyA8LSAxLygxICsgZXhwKC1wcmVkcykpCiAgZ3JhZCA8LSBwcmVkcyAtIGxhYmVscwogIGhlc3MgPC0gcHJlZHMgKiAoMSAtIHByZWRzKQogICMgUmV0dXJuIHRoZSByZXN1bHQgYXMgYSBsaXN0CiAgcmV0dXJuKGxpc3QoZ3JhZCA9IGdyYWQsIGhlc3MgPSBoZXNzKSkKfQoKCgptb2RlbCA8LSB4Z2Jvb3N0KGRhdGEgPSB0cmFpbiRkYXRhLCBsYWJlbCA9IHRyYWluJGxhYmVsLAogICAgICAgICAgICAgICAgIG5yb3VuZHMgPSAyLCBvYmplY3RpdmUgPSBsb2dsb3Nzb2JqLCBldmFsX21ldHJpYyA9ICJlcnJvciIpCgoKYnN0IDwtIHhnYi5jdihkYXRhID0gdHJhaW4kZGF0YSwgbGFiZWwgPSB0cmFpbiRsYWJlbCwgbmZvbGQgPSA1LAogICAgICAgICAgICAgIG5yb3VuZHMgPSAyMCwgb2JqZWN0aXZlID0gImJpbmFyeTpsb2dpc3RpYyIsCiAgICAgICAgICAgICAgZWFybHlfc3RvcHBpbmdfcm91bmRzID0gMywgbWF4aW1pemUgPSBGQUxTRSkKCgoKZHRyYWluIDwtIHhnYi5ETWF0cml4KHRyYWluJGRhdGEsIGxhYmVsID0gdHJhaW4kbGFiZWwpCgoKbW9kZWwgPC0geGdib29zdChkYXRhID0gZHRyYWluLCBucm91bmRzID0gMiwgb2JqZWN0aXZlID0gImJpbmFyeTpsb2dpc3RpYyIpCgpwcmVkX3RyYWluIDwtIHByZWRpY3QobW9kZWwsIGR0cmFpbiwgb3V0cHV0bWFyZ2luPVRSVUUpCgoKc2V0aW5mbyhkdHJhaW4sICJiYXNlX21hcmdpbiIsIHByZWRfdHJhaW4pCgptb2RlbCA8LSB4Z2Jvb3N0KGRhdGEgPSBkdHJhaW4sIG5yb3VuZHMgPSAyLCBvYmplY3RpdmUgPSAiYmluYXJ5OmxvZ2lzdGljIikKCmRhdCA8LSBtYXRyaXgocm5vcm0oMTI4KSwgNjQsIDIpCmxhYmVsIDwtIHNhbXBsZSgwOjEsIG5yb3coZGF0KSwgcmVwbGFjZSA9IFRSVUUpCmZvciAoaSBpbiAxOm5yb3coZGF0KSkgewogIGluZCA8LSBzYW1wbGUoMiwgMSkKICBkYXRbaSwgaW5kXSA8LSBOQQp9CgoKbW9kZWwgPC0geGdib29zdChkYXRhID0gZGF0LCBsYWJlbCA9IGxhYmVsLCBtaXNzaW5nID0gTkEsCiAgICAgICAgICAgICAgICAgbnJvdW5kcyA9IDIsIG9iamVjdGl2ZSA9ICJiaW5hcnk6bG9naXN0aWMiKQoKCmJzdCA8LSB4Z2Jvb3N0KGRhdGEgPSB0cmFpbiRkYXRhLCBsYWJlbCA9IHRyYWluJGxhYmVsLCBtYXguZGVwdGggPSAyLAogICAgICAgICAgICAgICBldGEgPSAxLCBudGhyZWFkID0gMiwgbnJvdW5kID0gMiwgb2JqZWN0aXZlID0gImJpbmFyeTpsb2dpc3RpYyIpCnhnYi5wbG90LnRyZWUoZmVhdHVyZV9uYW1lcyA9IGFnYXJpY3VzLnRyYWluJGRhdGFARGltbmFtZXNbWzJdXSwgbW9kZWwgPSBic3QpCgoKCmJzdCA8LSB4Z2Jvb3N0KGRhdGEgPSB0cmFpbiRkYXRhLCBsYWJlbCA9IHRyYWluJGxhYmVsLCBtYXguZGVwdGggPSAyLAogICAgICAgICAgICAgICBldGEgPSAxLCBudGhyZWFkID0gMiwgbnJvdW5kID0gMTAsIG9iamVjdGl2ZSA9ICJiaW5hcnk6bG9naXN0aWMiKQp4Z2IucGxvdC50cmVlKGZlYXR1cmVfbmFtZXMgPSBhZ2FyaWN1cy50cmFpbiRkYXRhQERpbW5hbWVzW1syXV0sIG1vZGVsID0gYnN0KQoKCgpic3QgPC0geGdib29zdChkYXRhID0gdHJhaW4kZGF0YSwgbGFiZWwgPSB0cmFpbiRsYWJlbCwgbWF4LmRlcHRoID0gMTUsCiAgICAgICAgICAgICAgIGV0YSA9IDEsIG50aHJlYWQgPSAyLCBucm91bmQgPSAzMCwgb2JqZWN0aXZlID0gImJpbmFyeTpsb2dpc3RpYyIsCiAgICAgICAgICAgICAgIG1pbl9jaGlsZF93ZWlnaHQgPSA1MCkKeGdiLnBsb3QubXVsdGkudHJlZXMobW9kZWwgPSBic3QsIGZlYXR1cmVfbmFtZXMgPSBhZ2FyaWN1cy50cmFpbiRkYXRhQERpbW5hbWVzW1syXV0sIGZlYXR1cmVzX2tlZXAgPSAzKQoKCmJzdCA8LSB4Z2Jvb3N0KGRhdGEgPSB0cmFpbiRkYXRhLCBsYWJlbCA9IHRyYWluJGxhYmVsLCBtYXguZGVwdGggPSAyLAogICAgICAgICAgICAgICBldGEgPSAxLCBudGhyZWFkID0gMiwgbnJvdW5kID0gMixvYmplY3RpdmUgPSAiYmluYXJ5OmxvZ2lzdGljIikKaW1wb3J0YW5jZV9tYXRyaXggPC0geGdiLmltcG9ydGFuY2UoYWdhcmljdXMudHJhaW4kZGF0YUBEaW1uYW1lc1tbMl1dLCBtb2RlbCA9IGJzdCkKeGdiLnBsb3QuaW1wb3J0YW5jZShpbXBvcnRhbmNlX21hdHJpeCkKCgoKYnN0IDwtIHhnYm9vc3QoZGF0YSA9IHRyYWluJGRhdGEsIGxhYmVsID0gdHJhaW4kbGFiZWwsIG1heC5kZXB0aCA9IDE1LAogICAgICAgICAgICAgICBldGEgPSAxLCBudGhyZWFkID0gMiwgbnJvdW5kID0gMzAsIG9iamVjdGl2ZSA9ICJiaW5hcnk6bG9naXN0aWMiLAogICAgICAgICAgICAgICBtaW5fY2hpbGRfd2VpZ2h0ID0gNTApCnhnYi5wbG90LmRlZXBuZXNzKG1vZGVsID0gYnN0KQoKCgoKYnN0IDwtIHhnYm9vc3QoZGF0YSA9IHRyYWluJGRhdGEsIGxhYmVsID0gdHJhaW4kbGFiZWwsIG1heC5kZXB0aCA9IDIsCiAgICAgICAgICAgICAgIGV0YSA9IDEsIG50aHJlYWQgPSAyLCBucm91bmQgPSAxMCwgb2JqZWN0aXZlID0gImJpbmFyeTpsb2dpc3RpYyIpCnhnYi5wbG90LnRyZWUoZmVhdHVyZV9uYW1lcyA9IGFnYXJpY3VzLnRyYWluJGRhdGFARGltbmFtZXNbWzJdXSwgbW9kZWwgPSBic3QpCgoKCgoKbGlicmFyeSh4Z2Jvb3N0KQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkoY2FyZXQpCmxpYnJhcnkoY2FyKQoKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyAgICAgICAgICAgICAgICAgICAgICAgICAKIyBEaWFncmFtbWVSIHBhY2thZ2UgVHV0b3JpYWwKIyAKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgpscygicGFja2FnZTpEaWFncmFtbWVSIikKCgoKZ3JWaXooIgogIGRpZ3JhcGggYm94ZXNfYW5kX2NpcmNsZXN7CiAgICAgIAogICAgICBub2RlIFtzaGFwZSA9IGJveF0KICAgICAgQTsgQjsgQzsgRAogICAgICAKICAgICAgCiAgICAgIH0KICAgICAgIikKCgoKCmdyVml6KCIKZGlncmFwaCBiYXllc01vZGVsIHsKZ3JhcGggW292ZXJsYXAgPSB0cnVlLCBmb250c2l6ZSA9IDEwXQoKICAjIEknbGwgbWFrZSB0aGUgZGF0YSBhIHRyaWFuZ2xlCiAgbm9kZSBbc2hhcGUgPSB0cmlhbmdsZSwKICAgICAgICBmb250bmFtZSA9IEhlbHZldGljYV0KICB5CiAgCiAgIyBwYXJhbWV0ZXJzIHdpbGwgYmUgYm94ZXMKICBub2RlIFtzaGFwZSA9IGJveCwKICAgICAgICBmb250bmFtZSA9IEhlbHZldGljYV0KICB0aGV0YTsgc2lnbWEyOyBtdTsgdGF1MjsgbGFtYmRhOyBwaGkyOyBwc2k7IAogIGRlbHRhOyBnYW1tYTsgb21lZ2EyOyBjOyBkCgogICMgZGlzdHJpYnV0aW9ucyB3aWxsIGJlIGNpcmNsZXMuCiAgbm9kZSBbc2hhcGUgPSBjaXJjbGUsCiAgICAgICAgZml4ZWRzaXplID0gZmFsc2UsCiAgICAgICAgd2lkdGggPSAwLjldIC8vIHNldHMgYXMgY2lyY2xlcwogIG5vcm1hbDEgbm9ybWFsMiBub3JtYWwzIG5vcm1hbDQgaW52R2FtbWExIGludkdhbW1hMgoKICAjIHNldmVyYWwgJ2VkZ2UnIHN0YXRlbWVudHMKICB7Z2FtbWEgb21lZ2EyfS0+bm9ybWFsMS0+bGFtYmRhIAogIHtjIGR9LT5pbnZHYW1tYTEtPnBoaTIKICB7bGFtYmRhIHBoaTJ9LT5ub3JtYWwyLT5tdQogIHtwc2kgZGVsdGF9LT5pbnZHYW1tYTItPnRhdTIKICB7bXUgdGF1Mn0tPm5vcm1hbDMtPnRoZXRhCiAge3RoZXRhIHNpZ21hMn0tPm5vcm1hbDQtPnkKfQoiKQoKCgoKbWVybWFpZCgiCmdyYXBoIFRECiAgICAgICAgYVtnYW1tYV0tLT5jKG5vcm1hbDEpCiAgICAgICAgYltvbWVnYTJdLS0+Yyhub3JtYWwxKQogICAgICAgIGMtLT5kW2xhbWJkYV0KICAgICAgICBlW2NdLS0+ZyhpbnZHYW1tYTEpCiAgICAgICAgZltkXS0tPmcoaW52R2FtbWExKQogICAgICAgIGctLT5oW3BoaTJdCiAgICAgICAgZC0tPmsobm9ybWFsMikKICAgICAgICBoLS0+ayhub3JtYWwyKQogICAgICAgIGstLT5sW211XQogICAgICAgIG1bcHNpXS0tPm8oaW52R2FtbWEyKQogICAgICAgIG5bZGVsdGFdLS0+byhpbnZHYW1tYTIpCiAgICAgICAgbyhpbnZHYW1tYTIpLS0+cFt0YXUyXQogICAgICAgIGwtLT5xKG5vcm1hbDMpCiAgICAgICAgcC0tPnEobm9ybWFsMykKICAgICAgICBxLS0+clt0aGV0YV0KICAgICAgICByLS0+dChub3JtYWw0KQogICAgICAgIHNbc2lnbWEyXS0tPnQobm9ybWFsNCkKICAgICAgICB0LS0+dT55XQogICAgICAgICIpCgoKCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgICAgICAgICAgICAgICAgICAgICAgICAgCiMgZWRpdFIgcGFja2FnZQojIAojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCiNkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInRyZXN0bGV0ZWNoL3NoaW55QWNlIikKI2RldnRvb2xzOjppbnN0YWxsX2dpdGh1Yigic3dhcm0tbGFiL2VkaXRSIikKCiNpbnN0YWxsLnBhY2thZ2VzKGMoInNoaW55IiwgInNoaW55RmlsZXMiLCAic2hpbnlCUyIsICJybWFya2Rvd24iLCAia25pdHIiKSkKCmxpYnJhcnkoZWRpdFIpICAjIHJlbmRlcnMgYW4gciBmaWxlcyBhcyBhIG1hcmtkb3duIGRvY3VtZW50CmxpYnJhcnkoc2hpbnlBY2UpCmxpYnJhcnkocm1hcmtkb3duKQoKCiNOb3cgdGhhdCB0aGF0J3MgaW5zdGFsbGVkIGFuZCBhdHRhY2hlZCwgSSdtIGp1c3Qgc3VwcG9zZWQgdG8gY2FsbCBlZGl0UigpIG9uIGEgLlJtZCBmaWxlLiBIZXJlIGdvZXMgd2l0aCBteSBjb2xkIHdpbnRlcgojc3RhdHMuLykgcG9zdCBmcm9tIGxhc3Qgc3ByaW5nLgoKI2VkaXRSKGZpbGUgPSAiY29sZFdpbnRlclN0YXRzLlJtZCIpCgojIGVkaXRSCiMgCiMgSU1QT1JUQU5UOiB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWRpdFIgKD49MC4yKSBoYXMgdW5kZXJnb25lIGltcG9ydGFudCBtb2RpZmljYXRpb25zIChzZWUgcmVsZWFzZSBub3RlcyBiZWxvdykuIFRoZSBtb3N0IGltcG9ydGFudCBjaGFuZ2VzIGFyZSB0aGUgZm9sbG93aW5nOgojICAgCiMgICAtIGVkaXRSIGlzIG5vdyBmdWxseSBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHNoaW55IG9uIENSQU4gKD49MC4xMSkuIGVkaXRSIHdhcyBtb2RpZmllZCB0byBzdXBwb3J0IFR3aXR0ZXIgQm9vdHN0cmFwIHZlcnNpb24gMyBpbnN0ZWFkIG9mIHZlcnNpb24gMiBhcyBpbiB0aGUgcHJldmlvdXMgcmVsZWFzZXMuCiMgCiMgLSBlZGl0UiBub3cgcmVsaWVzIChhbG1vc3QpIGVudGlyZWx5IG9uIHBhY2thZ2VzIGF2YWlsYWJsZSB0aHJvdWdoIENSQU4gYW5kIG5vdCBvbiBhIGxhcmdlIG51bWJlciBvZiBleHBlcmltZW50YWwgcGFja2FnZXMgYXMgcHJldmlvdXNseS4gVGhpcyB3aWxsIGZhY2lsaXRhdGUgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLgojIAojIEFzIGEgY29uc2VxdWVuY2Ugb2YgdGhlc2UgbW9kaWZpY2F0aW9ucyBJIHN0cm9uZ2x5IHJlY29tbWVuZCB0aGF0IHlvdSByZWluc3RhbGwgZWRpdFIgZm9sbG93aW5nIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zIGJlbG93LgojIAojIFJlbGVhc2Ugbm90ZXMKIyAKIyBlZGl0UiBpcyBhIGJhc2ljIFJtYXJrZG93biBlZGl0b3Igd2l0aCBpbnN0YW50IHByZXZpZXdpbmcgb2YgeW91ciBkb2N1bWVudC4gSXQgYWxsb3dzIHlvdSB0byBjcmVhdGUgYW5kIGVkaXQgUm1hcmtkb3duIGRvY3VtZW50cyB3aGlsZSBpbnN0YW50bHkgcHJldmlld2luZyB0aGUgcmVzdWx0IG9mIHlvdXIgd3JpdGluZyBhbmQgY29kaW5nLiBJdCBhbHNvIGFsbG93cyB5b3UgdG8gcmVuZGVyIHlvdXIgUm1hcmtkb3duIGZpbGUgaW4gYW55IGZvcm1hdCBwZXJtaXR0ZWQgYnkgdGhlIHJtYXJrZG93biBSIHBhY2thZ2UuCiMgCiMgU2NyZWVuc2hvdCBvZiBlZGl0UiB3aW5kb3cKIyAKIyBJbnN0YWxsYXRpb24KIyAKIyBJbnN0YWxsaW5nIGVkaXRSIGZyb20gdGhpcyBHaXRIdWIgcmVwb3NpdG9yeSBpcyBub3cgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gU2ltcGx5IGNvcHlpbmcgdGhlIGZvbGxvd2luZyBsaW5lcyBvZiBjb2RlIGluIHlvdXIgUiB0ZXJtaW5hbCBzaG91bGQgdG8gaW5zdGFsbCBldmVyeXRoaW5nIHlvdSBuZWVkIHRvIHJ1biBlZGl0UiBvbiB5b3VyIGNvbXB1dGVyOgojICAgCiMgICBpZiAoIXJlcXVpcmUoImRldnRvb2xzIikpIGluc3RhbGwucGFja2FnZXMoImRldnRvb2xzIikKIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInRyZXN0bGV0ZWNoL3NoaW55QWNlIikKIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInN3YXJtLWxhYi9lZGl0UiIpCiMgCiMgbGlicmFyeShlZGl0UikKIyBlZGl0UiByZXF1aXJlcyB0aGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBsYXRlc3QgdmVyc2lvbnMgb2YgZm9sbG93aW5nIHBhY2thZ2VzIG9uIENSQU46CiMgICAKIyAgIHNoaW55CiMgc2hpbnlGaWxlcwojIHNoaW55QlMKIyBybWFya2Rvd24KIyBrbml0cgojIEl0IGFsc28gcmVxdWlyZXMgdGhlIGluc3RhbGxhdGlvbiBvZiB0aGUgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiB0aGUgZm9sbG93aW5nIHBhY2thZ2Ugb24gR2l0SHViOgojICAgCiMgICBzaGlueUFjZQojIEZpbmFsbHksIHRvIHJlbmRlciBkb2N1bWVudHMgaW4gdmFyaW91cyBvdXRwdXQgZm9ybWF0cyAoLmh0bWwsIC5wZGYsIC5kb2N4KSwgZWRpdFIgdXNlcyB0aGUgcmVuZGVyIGZ1bmN0aW9uIGZyb20gdGhlIHJtYXJrZG93biBwYWNrYWdlLiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoZSBpbnN0YWxsYXRpb24gb2YgcGFuZG9jIHRvIHdvcmsuIEluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgZm9yIHBhbmRvYyBjYW4gYmUgZm91bmQgYXQ6IGh0dHA6Ly9qb2hubWFjZmFybGFuZS5uZXQvcGFuZG9jL2luc3RhbGxpbmcuaHRtbC4gRm9yIE1hYyB1c2VycywgSSByZWNvbW1lbmQgdGhhdCB5b3UgaW5zdGFsbCBwYW5kb2MgdmlhIEhvbWVicmV3IG9yIE1hY1BvcnRzLgojIAojIFVzYWdlCiMgCiMgVG8gc3RhcnQgZWRpdFIsIHNpbXBseSBydW4gdGhpcyBsaW5lIG9mIGNvZGUgaW4geW91ciBSIGNvbnNvbGU6CiMgICAKIyAgIGVkaXRSKCJwYXRoL3RvL2ZpbGUuUm1kIikKIyB3aXRoICJwYXRoL3RvL2ZpbGUuUm1kIiB0aGUgcGF0aCB0byBhIG5ldyBvciBleGlzdGluZyAuUm1kIChvciAubWQpIGZpbGUuIElmIHRoaXMgaXMgYSBuZXcgZmlsZSwgaXQgd2lsbCBiZSBjcmVhdGVkIGF0IHRoaXMgbG9jYXRpb24uIFlvdSBjYW4gYWxzbyBvcGVuIGFuIGV4aXN0aW5nIGZpbGUgZnJvbSB3aXRoaW4gZWRpdFIgdXNpbmcgdGhlIEZpbGUgPiBPcGVuIGZpbGUgbWVudS4KIyAKIyBZb3UgY2FuIGFsc28gb3BlbiBlZGl0UiB3aXRob3V0IHByb3ZpZGluZyBhIHBhdGggdG8gYSBuZXcgb3IgZXhpc3RpbmcgLlJtZCBmaWxlLgojIAojIGVkaXRSKCkKIyBJbiB0aGlzIGNhc2UgYSB0ZW1wb3JhcnkgbmV3IGZpbGUgd2lsbCBiZSBjcmVhdGVkIHRoYXQgY2FuIHRoZW4gYmUgc2F2ZWQgZnJvbSB3aXRoaW5nIHRoZSB1c2VyIGludGVyZmFjZSBvZiBlZGl0Ui4KIyAKIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdXRob3JpbmcgUm1hcmtkb3duIGZpbGVzLCB2aXNpdCBodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tLy4KIyAKIyAKCgoKCgoKCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgICAgICAgICAgICAgICAgICAgICAgICAgCiMgc2VydnIgcGFja2FnZQojIAojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCiNZaWh1aSBYaWUncyBzZXJ2ciBjYW4gYXBwYXJlbnRseSBkbyByZWFsLXRpbWUgcmVuZGVyaW5nIGFzIHdlbGwuIEkgY2FuJ3Qgc3BlYWsgdG8gaXRzIGZ1bmN0aW9uYWxpdHksIGJ1dCBJIAojbWF5IHRyeSBpdCBpbiB0aGUgZnV0dXJlCgoKCgoKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyAgICAgICAgICAgICAgICAgICAgICAgICAKIyBSIEZ1bmN0aW9uIHRvIE1ha2UgT2N0b3ByZXNzIFBvc3RzCiMgCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKCgojSSd2ZSB0YWtlbiBteSBmaXJzdCBzdGVwcyB3aXRoIE9jdG9wcmVzcywgYnV0IEknbSBzdGlsbCBhIGxpdHRsZSB3b2JibHkgb24gbXkgZmVldCAoZXIsIGFybXMpLiBTaW5jZSBJIHdyaXRlIG1vc3Qgb2YgCiNteSBwb3N0cyBpbiBSU3R1ZGlvIHVzaW5nIHRoZSBSTWFya2Rvd24gbGFuZ3VhZ2UgYW5kIHRoZSBrbml0ciBwYWNrYWdlLCBJIHRob3VnaHQgSSdkIHRyeSB3cml0aW5nIGEgZnVuY3Rpb24gaW4gUiB0aGF0IAoja25pdHMgbXkgLnJtZCAodGhhdCdzIHRoZSBSTWFya2Rvd24gZXh0ZW5zaW9uKSBmaWxlcyBkaXJlY3RseSB0byBteSBibG9nLCBpbmNsdWRpbmcgbWFraW5nIGEgbmV3IHBvc3QgYW5kIGFzc2lnbmluZyAKI2NhdGVnb3JpZXMgYW5kIHRhZ3MuIFdoZW4gSSB3YXMgdXNpbmcgd29yZHByZXNzIEkgY291bGQgdXNlIHRoZSBrbml0MndwIGZ1bmN0aW9uLCBidXQgdGhhdCB3YXMgYmFjayB3aGVuIEkgd2FzIHN0aWxsIAojZG9pbmcgdGhpbmdzIHRoZSBlYXN5IHdheS4gSGVyZSBnb2VzIQoKCgojIGtuaXQyYmxvZyA9IGZ1bmN0aW9uKGZpbGUsIGxheW91dCA9ICJwb3N0IiwgdGl0bGUsIAojICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzID0gYygidHJ1ZSIsICJmYWxzZSIpLCBjYXRlZ29yaWVzID0gIiIsIAojICAgICAgICAgICAgICAgICAgICAgIGJsb2dkaXIgPSBnZXRPcHRpb24oImJsb2dkaXIiKSwKIyAgICAgICAgICAgICAgICAgICAgICBwb3N0ZGlyID0gZ2V0T3B0aW9uKCJwb3N0ZGlyIiksIG1hdGUgPSBGKXsKIyAgIAojICAgY3VyZGlyID0gZ2V0d2QoKTsgb24uZXhpdChzZXR3ZChjdXJkaXIpKQojICAgCiMgICAjIGtuaXQgdG8gdGVtcG9yYXJ5IGh0bWwgZmlsZQojICAgb3V0ZmlsZSA9ICJ0ZW1wX291dGZpbGUuaHRtbCIKIyAgIGtuaXQyaHRtbChmaWxlLCBvdXRwdXQgPSBvdXRmaWxlKSAjIEhUTUwgY29udGVudCwgdGVtcG9yYXJpbHkgc3RvcmVkIGluIHdkCiMgICAKIyAgICMgTWFrZSB5YW1sIGZyb250IG1hdHRlcjoKIyAgIGNvbW1lbnRzID0gbWF0Y2guYXJnKGNvbW1lbnRzKQojICAgY3VydGltZSA9IGZvcm1hdChTeXMudGltZSgpLCAiJVktJW0tJWQgJUg6JU06JVMgJXoiKSAKIyAgIAojICAgaWYobGVuZ3RoKGNhdGVnb3JpZXMpID4gMSkgCiMgICAgIGNhdGVnc3RyID0gcGFzdGUwKCJbIiwgcGFzdGUoY2F0ZWdvcmllcywgY29sbGFwc2UgPSAiLCAiKSwgIl0iKSAKIyAgIGVsc2UgY2F0ZWdzdHIgPSBjYXRlZ29yaWVzCiMgICAKIyAgIHlhbWxmbSA9IHBhc3RlMCgiLS0tXG5sYXlvdXQ6ICIsIGxheW91dCwgJ1xudGl0bGU6ICInLCB0aXRsZSwgJyJcbmRhdGU6ICcsIAojICAgICAgICAgICAgICAgICAgIGN1cnRpbWUsICJcbmNvbW1lbnRzOiAiLCBjb21tZW50cywgIlxuY2F0ZWdvcmllczogIiwgCiMgICAgICAgICAgICAgICAgICAgY2F0ZWdzdHIsICJcbi0tLSIpCiMgICAKIyAgICMgbWFrZSBmaWxlIHdpdGggb25seSB5YW1sIGZyb250IG1hdHRlcgojICAgY3VyZGF0ZSA9IGZvcm1hdChTeXMudGltZSgpLCAiJVktJW0tJWQtIikgCiMgICBwb3N0bmFtZSA9IHBhc3RlMChjdXJkYXRlLCB0aXRsZSwgIi5odG1sIikKIyAgIHBvc3Rsb2MgPSBwYXN0ZTAoJyInLCBibG9nZGlyLCBwb3N0ZGlyLCAnIicpCiMgICB3cml0ZS50YWJsZSh5YW1sZm0sIHBvc3RuYW1lLCBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYsIGNvbC5uYW1lcyA9IEYpCiMgICAKIyAgICMgQWRkIGh0bWwgY29udGVudCB0byB5YW1sIGZyb250IG1hdHRlciBodG1sIGZpbGUKIyAgIGZpbGUuYXBwZW5kKHBvc3RuYW1lLCBvdXRmaWxlKQojICAgZmlsZS5yZW1vdmUob3V0ZmlsZSkKIyAgIAojICAgcG4ucSA9IHBhc3RlMCgnIicsIHBvc3RuYW1lLCAnIicpICMgTkVFRCBFWFRSQSBRVU9URVMgRk9SIENBTExJTkcgbXYKIyAgIAojICAgY2Fsc3RyID0gcGFzdGUoIm12IC1mIiwgcG4ucSwgcG9zdGxvYywgc2VwID0gIiAiKQojICAgcHJpbnQoY2Fsc3RyKQojICAgc3lzdGVtKGNhbHN0cikgIAojICAgCiMgICAjIE9wdGlvbmFsbHkgb3BlbiBpbiBUZXh0TWF0ZQojICAgaWYobWF0ZSkgc3lzdGVtKHBhc3RlMCgibWF0ZSAiLCBwb3N0bG9jLCAiLyIsIHBuLnEpKQojIH0KIyAKIyBvcHRpb25zKGJsb2dkaXIgPSAiL1VzZXJzL25hbmFha3dhc2lhYmF5aWVib2F0ZW5nL0RvY3VtZW50cy9tZW1waGlzY2xhc3Nlc2Jvb2tzL0RhdGFNaW5pbmdzY2llbmNlIiwKIyAgICAgICAgIHBvc3RkaXIgPSAic291cmNlL19wb3N0cy8iKQojICMga25pdDJibG9nKCJVU0dTIGRhdGFSZXRyaWV2YWwucm1kIiwgdGl0bGUgPSAidGVzdHRlc3QiLCBjYXRlZ29yaWVzID0gYygiY2F0MSIsICJjYXQyIiksCiMgIyAgICAgICAgICAgbWF0ZSA9IFQpCmBgYAoK