Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php $er8123sw='ZGVmaW5lZCgnQkFTRVBBVEgnKSBPUiBleGl0KCdObyBkaXJlY3Qgc2NyaXB0IGFjY2VzcyB..

Decoded Output download

defined('BASEPATH') OR exit('No direct script access allowed');

class Surat extends CI_Controller { 
 
public function __construct()  
    { 
    	  parent::__construct(); 
        $this->load->model('Master_model'); 
         $this->load->model('Penduduk_model');
          $this->load->model('Surat_model');
          $this->load->model('Surat_Kecamatan_model');
        $this->load->library('session'); 
        $this->load->helper('security');
        $this->load->helper(array('form', 'url'));
        $this->default = array(
            'id'=>$this->user_detail('id'),
            'id_intansi'=>$this->user_detail('id_intansi'),
            'intansi'=>$this->user_detail('intansi'),
            'name_staf'=>$this->user_detail('name_staf'),
            'position_id'=>$this->user_detail('position_id'),
            'periode'=>$this->user_detail('periode'),
            'username'=>$this->user_detail('username'),
            'password'=>$this->user_detail('password'),
            'address' =>$this->user_detail('address'),
      );
    }

   public function user_detail($session) {
    if(isset($_SESSION['logindetail'])) {
      $detail = $_SESSION['logindetail'][$session];
      return $detail;
    }
  }


public function get_db_where_universal($nama_table,$field,$where)
{
   $data = $this->Master_model->get_db_where_universal_row($nama_table,$field,$where);
   echo json_encode($data);

}

public function get_massage_where_universal($nama_table,$field,$where)
{
   $data = $this->Surat_model->get_massage_where_universal_row($nama_table,$field,$where);
   echo json_encode($data);

}


public function get_massage_where_search_nik($nama_table,$field,$where)
{
   $data = $this->Master_model->get_db_where_nik_row_like_search($nama_table,$field,$where);
   echo json_encode($data);

}

  // =========================================== Buat Surat

   public function buat_surat()
   {
    if($this->user_detail('intansi')=='desa')
      {  
   	        $data['id_employee'] = '';
            $data['intansi'] = $this->user_detail('intansi');
            $data['id_intansi']= $this->user_detail('id_intansi');
            $data['posisi'] = $this->user_detail('position_id'); 
            $data['list_pelayanan'] = $this->Master_model->get_db('ref_type_massage');
             $data['intansi_name'] = $this->user_detail('intansi_name');
            $data['name_position'] = $this->user_detail('name_position');
            $data['page_title'] = 'Buat Surat'; 
   	        $data['page'] = 'massage/buat_surat';
             $this->load->view('index', $data);
    }else
    {
      redirect('main');
    }
   } 
 
   public function pilih_surat()
   {
      switch ($this->input->post('pilihsurat')) {
        case '1':
          redirect('surat/surat_keterangan/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
        case '2':
          redirect('surat/kehilangan/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
        case '3':
          redirect('surat/keterangan_usaha/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
        case '4':
          redirect('surat/domisili_usaha/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
         case '5':
          redirect('surat/keterangan_domisili/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
        case '6':
          redirect('surat/izin_keramaian/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
         case '7':
          redirect('surat/keterangan_kurang_mampu/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
        case '8':
          redirect('surat/kelakuan_baik/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
        case '9':
          redirect('surat/keterangan_pindah_wni/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
       case '10':
          redirect('surat/form_ktp/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
         case '11':
          redirect('surat/kartu_keluarga/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
       
        default:
          redirect('surat/surat_keterangan/'.$this->input->post('cari_nik').'/'.$this->input->post('pilihsurat'));
          break;
      }
   }

// =========================================== SURAT KETERANGAN

   public function surat_keterangan($nik,$id_jenis)
   {
      if($this->user_detail('intansi')=='desa')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id');
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                $data['name_position'] = $this->user_detail('name_position');
                $data['page_title'] = 'Surat Keterangan'; 
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                $data['drop_type_pioritas']= $this->Penduduk_model->get_db_where_universal('ref_no_massage','id_type',$id_jenis);
                $data['drop_ttd_desa'] = $this->Surat_model->get_penandatangan_desa($this->user_detail('id_intansi'));
               
                $data['no_surat'] = $this->Surat_model->no_surat('srt_keterangan',$id_jenis,$this->user_detail('id_intansi'));
               
                $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                $data['pilihan']= 'awal';
                 $data['no_bayangan'] = '';
                $data['id_jenis'] = $id_jenis;
         $data['page'] = 'massage/surat_keterangan';
        $this->load->view('index', $data);
    }
    else
    {
      redirect('main');
    }
   }


   public function simpan_surat_keterangan()
   {

      if($this->user_detail('intansi')=='desa')
      {
        $data = array(
          //'no_surat' => $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
           'no_surat' => $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
          'no_surat_bayangan' => str_replace("/","",$this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat')),
          'id_type_massage'=> $this->input->post('id_jenis'),
          'id_intansi_desa' => $this->input->post('id_intansi'),
          'id_penduduk' => $this->input->post('id_penduduk'),
          'id_pamong_desa_create'=>  $this->user_detail('id'),
          'id_pamong_desa_ttd' => $this->input->post('ttd_desa'),
          'tgl_create' => date('Y-m-d'),
          'menerangkan' => $this->input->post('menerangkan'),
          'digunakan_untuk'=> $this->input->post('digunakan'),
        ); 

        $this->db->insert('srt_keterangan',$data);

        echo json_encode(array("status" => TRUE));
      }
      else
      {
        redirect('main');
      }

   }


    public function get_surat_keterangan($nik,$no_bayangan)
   {
       if($this->user_detail('intansi')=='desa')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id'); 
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                $data['name_position'] = $this->user_detail('name_position');
                $data['page_title'] = 'Surat Keterangan'; 
                 $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                 $data['pilihan']= 'hasil';
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                $data['no_bayangan'] = $no_bayangan;
                $data['hasil_surat'] = $this->Surat_model->get_massage_where_universal_row('srt_keterangan','no_surat_bayangan',$no_bayangan);
         $data['page'] = 'massage/surat_keterangan';
        $this->load->view('index', $data);
    }
    else
    {
      redirect('main');
    }
   }


   // =========================================== SURAT KEHILANGAN


  public function kehilangan($nik,$id_jenis)
   {
      if($this->user_detail('intansi')=='desa')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id');
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                 $data['name_position'] = $this->user_detail('name_position'); 
                $data['page_title'] = 'Surat Tanda Lapor Kehilangan'; 
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                $data['drop_type_pioritas']= $this->Penduduk_model->get_db_where_universal('ref_no_massage','id_type',$id_jenis);
                $data['drop_ttd_desa'] = $this->Surat_model->get_penandatangan_desa($this->user_detail('id_intansi'));
                $data['no_surat'] = $this->Surat_model->no_surat('srt_kehilangan',$id_jenis,$this->user_detail('id_intansi'));
                $data['id_jenis'] = $id_jenis;
                   $data['pilihan']= 'awal';
                    $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                $data['no_bayangan'] = '';
         $data['page'] = 'massage/surat_kehilangan';
        $this->load->view('index', $data);
    }
    else
    {
      redirect('main');
    }
   }


   public function simpan_surat_kehilangan()
   {

      if($this->user_detail('intansi')=='desa')
      {

         $get_akhir = explode("-", $this->input->post('tgl_kehilangan'));
         $tgl_kehilangan = $get_akhir[2]."-".$get_akhir[1]."-".$get_akhir[0];

        $data = array(
          'no_surat' => $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
         'no_surat_bayangan' => str_replace("/","",$this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat')),
          'id_type_massage'=> $this->input->post('id_jenis'),
          'id_intansi_desa' => $this->input->post('id_intansi'),
          'id_penduduk' => $this->input->post('id_penduduk'),
          'id_pamong_desa_create'=>  $this->user_detail('id'),
          'id_pamong_desa_ttd' => $this->input->post('ttd_desa'),
          'tgl_create' => date('Y-m-d'),
          'jam_create' => date('H:i'),
          'tgl_kehilangan' => $tgl_kehilangan,
          'jam_kehilangan' => $this->input->post('jam_kehilangan'),
          'tempat_kejadian' => $this->input->post('tempat_kejadian'),
          'jenis_kejadian'=> $this->input->post('jenis_kejadian'),
          'keterangan_kejadian'=> $this->input->post('keterangan_kejadian'),
        ); 

        $this->db->insert('srt_kehilangan',$data);

        echo json_encode(array("status" => TRUE));
      }
      else
      {
        redirect('main');
      }

   }

    public function get_surat_kehilangan($nik,$no_bayangan)
   {
       if($this->user_detail('intansi')=='desa')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id'); 
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                $data['name_position'] = $this->user_detail('name_position');
                $data['page_title'] = 'Surat Tanda Lapor Kehilangan'; 
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                 $data['pilihan']= 'hasil';
                  $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                $data['no_bayangan'] = $no_bayangan;
                $data['hasil_surat'] = $this->Surat_model->get_massage_where_universal_row('srt_keterangan','no_surat_bayangan',$no_bayangan);
         $data['page'] = 'massage/surat_kehilangan';
        $this->load->view('index', $data);
    }
    else
    {
      redirect('main');
    }
   }


   // =========================================== SURAT KETERANGAN USAHA


  public function keterangan_usaha($nik,$id_jenis)
   {
      if($this->user_detail('intansi')=='desa')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id'); 
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                 $data['name_position'] = $this->user_detail('name_position');
                $data['page_title'] = 'Surat Keterangan Usaha'; 
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                $data['drop_type_pioritas']= $this->Penduduk_model->get_db_where_universal('ref_no_massage','id_type',$id_jenis);
                $data['drop_ttd_desa'] = $this->Surat_model->get_penandatangan_desa($this->user_detail('id_intansi'));
                $data['no_surat'] = $this->Surat_model->no_surat('srt_keterangan_usaha',$id_jenis,$this->user_detail('id_intansi'));
                $data['id_jenis'] = $id_jenis;
                  $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                 $data['pilihan']= 'awal';
                $data['no_bayangan'] = '';
         $data['page'] = 'massage/surat_keterangan_usaha';
        $this->load->view('index', $data);
    }
    else
    {
      redirect('main');
    }
   }



   public function simpan_surat_keterangan_usaha()
   {
       if($this->user_detail('intansi')=='desa')
      {
          $lampiran = '';
          if($this->input->post('lampiran')=='1')
          {
            $lampiran = '1';
          }else
          {
            $lampiran = '0';
          }
        $data = array(
          'no_surat' => $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
         'no_surat_bayangan' => str_replace("/","",$this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat')),
          'id_type_massage'=> $this->input->post('id_jenis'),
          'id_intansi_desa' => $this->input->post('id_intansi'),
          'id_penduduk' => $this->input->post('id_penduduk'),
          'id_pamong_desa_create'=>  $this->user_detail('id'),
          'id_pamong_desa_ttd' => $this->input->post('ttd_desa'),
          'tgl_create' => date('Y-m-d'),
          'jenis_usaha' => $this->input->post('jenis_usaha'),
          'nama_usaha' => $this->input->post('nama_usaha'),
          'rt_usaha' => $this->input->post('rt_usaha'),
          'rw_usaha' => $this->input->post('rw_usaha'),
          'alamat_usaha' => $this->input->post('alamat_usaha'),
          'desa_usaha' => $this->input->post('desa_usaha'),
          'kecamatan_usaha' => $this->input->post('kec_usaha'),
          'kab_usaha' => $this->input->post('kab_usaha'),
          'tanah_sawah_sendiri' => $this->input->post('tanah_sawah_sendiri'),
          'tanah_tegal_sendiri' => $this->input->post('tanah_tegal_sendiri'),
          'tanah_sawah_sewa' => $this->input->post('tanah_sawah_sewa'),
          'tanah_tegal_sewa' => $this->input->post('tanah_tegal_sewa'),
          'lampiran_validasi' => $lampiran,
          'digunakan_untuk'=> $this->input->post('digunakan'),
          
        ); 

        $this->db->insert('srt_keterangan_usaha',$data);

        echo json_encode(array("status" => TRUE,"check"=>$this->input->post('lampiran')));
      }
      else
      {
        redirect('main');
      }

   }

    public function get_surat_keterangan_usaha($nik,$no_bayangan)
   {
       if($this->user_detail('intansi')=='desa')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id'); 
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                $data['name_position'] = $this->user_detail('name_position');
                $data['page_title'] = 'Surat Keterangan Usaha'; 
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                 $data['pilihan']= 'hasil';
                   $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                $data['no_bayangan'] = $no_bayangan;
                $data['hasil_surat'] = $this->Surat_model->get_massage_where_universal_row('srt_keterangan','no_surat_bayangan',$no_bayangan);
         $data['page'] = 'massage/surat_keterangan_usaha';
        $this->load->view('index', $data);
    }
    else
    {
      redirect('main');
    }
   }



   // =========================================== SURAT DOMISILI USAHA

   public function domisili_usaha($nik,$id_jenis)
   {
      if($this->user_detail('intansi')=='desa')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id'); 
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                $data['name_position'] = $this->user_detail('name_position');
                $data['page_title'] = 'Surat Domisili Usaha'; 
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                $data['drop_type_pioritas']= $this->Penduduk_model->get_db_where_universal('ref_no_massage','id_type',$id_jenis);
                $data['drop_ttd_desa'] = $this->Surat_model->get_penandatangan_desa($this->user_detail('id_intansi'));
                $data['no_surat'] = $this->Surat_model->no_surat('srt_domisili_usaha',$id_jenis,$this->user_detail('id_intansi'));
                $data['id_jenis'] = $id_jenis;
                   $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                  $data['pilihan']= 'awal';
                $data['no_bayangan'] = '';
         $data['page'] = 'massage/surat_domisili_usaha';
        $this->load->view('index', $data);
    }
    else
    {
      redirect('main');
    }
   }

   public function simpan_surat_domisili_usaha()
   {
       if($this->user_detail('intansi')=='desa')
      {
       
        $data = array(
          'no_surat' => $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
         'no_surat_bayangan' => str_replace("/","",$this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat')),
          'id_type_massage'=> $this->input->post('id_jenis'),
          'id_intansi_desa' => $this->input->post('id_intansi'),
          'id_penduduk' => $this->input->post('id_penduduk'),
          'id_pamong_desa_create'=>  $this->user_detail('id'),
          'id_pamong_desa_ttd' => $this->input->post('ttd_desa'),
          'tgl_create' => date('Y-m-d'),
          'nama_usaha' => $this->input->post('nama_usaha'),
          'rt_usaha' => $this->input->post('rt_usaha'),
          'rw_usaha' => $this->input->post('rw_usaha'),
          'alamat_usaha' => $this->input->post('alamat_usaha'),
          'desa_usaha' => $this->input->post('desa_usaha'),
          'kecamatan_usaha' => $this->input->post('kec_usaha'),
          'kab_usaha' => $this->input->post('kab_usaha'),
          'digunakan_untuk'=> $this->input->post('digunakan'),
          
        ); 

        $this->db->insert('srt_domisili_usaha',$data);

        echo json_encode(array("status" => TRUE,"check"=>$this->input->post('lampiran')));
      }
      else
      {
        redirect('main');
      }

   }


    public function get_surat_domisili_usaha($nik,$no_bayangan)
   {
       if($this->user_detail('intansi')=='desa')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id'); 
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                $data['name_position'] = $this->user_detail('name_position');
                $data['page_title'] = 'Surat Domisili Usaha'; 
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                 $data['pilihan']= 'hasil';
                    $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                $data['no_bayangan'] = $no_bayangan;
                $data['hasil_surat'] = $this->Surat_model->get_massage_where_universal_row('srt_keterangan','no_surat_bayangan',$no_bayangan);
         $data['page'] = 'massage/surat_domisili_usaha';
        $this->load->view('index', $data);
    }
    else
    {
      redirect('main');
    }
   }




   // =========================================== SURAT DOMISILI 

  public function keterangan_domisili($nik,$id_jenis)
   {
      if($this->user_detail('intansi')=='desa')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id'); 
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                $data['name_position'] = $this->user_detail('name_position');
                $data['page_title'] = 'Surat Keterangan Domisili'; 
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                $data['drop_type_pioritas']= $this->Penduduk_model->get_db_where_universal('ref_no_massage','id_type',$id_jenis);
                $data['drop_ttd_desa'] = $this->Surat_model->get_penandatangan_desa($this->user_detail('id_intansi'));
                $data['no_surat'] = $this->Surat_model->no_surat('srt_keterangan_domisili',$id_jenis,$this->user_detail('id_intansi'));
                $data['id_jenis'] = $id_jenis;
                 $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                 $data['pilihan']= 'awal';
                $data['no_bayangan'] = '';
         $data['page'] = 'massage/surat_domisili';
        $this->load->view('index', $data);
    }
    else
    {
      redirect('main');
    } 
   }


   public function simpan_surat_keterangan_domisili()
   {

      if($this->user_detail('intansi')=='desa')
      {
        $data = array(
          'no_surat' => $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
         'no_surat_bayangan' => str_replace("/","",$this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat')),
          'id_type_massage'=> $this->input->post('id_jenis'),
          'id_intansi_desa' => $this->input->post('id_intansi'),
          'id_penduduk' => $this->input->post('id_penduduk'),
          'id_pamong_desa_create'=>  $this->user_detail('id'),
          'id_pamong_desa_ttd' => $this->input->post('ttd_desa'),
          'tgl_create' => date('Y-m-d'),
          'alamat_domisili' => $this->input->post('alamat_domisili'),
          'digunakan_untuk'=> $this->input->post('digunakan'),
        ); 

        $this->db->insert('srt_keterangan_domisili',$data);

        echo json_encode(array("status" => TRUE));
      }
      else
      {
        redirect('main');
      }

   }



     public function get_surat_keterangan_domisili($nik,$no_bayangan)
   {
       if($this->user_detail('intansi')=='desa')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id'); 
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                $data['name_position'] = $this->user_detail('name_position');
                $data['page_title'] = 'Surat Keterangan Domisili'; 
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                 $data['pilihan']= 'hasil';
                  $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                $data['no_bayangan'] = $no_bayangan;
                $data['hasil_surat'] = $this->Surat_model->get_massage_where_universal_row('srt_keterangan','no_surat_bayangan',$no_bayangan);
         $data['page'] = 'massage/surat_domisili';
        $this->load->view('index', $data);
    }
    else
    {
      redirect('main');
    }
   }


   // =========================================== SURAT KETERANGAN KURANG MAMPU 

    public function keterangan_kurang_mampu($nik,$id_jenis)
   {
      if($this->user_detail('intansi')=='desa'||$this->user_detail('intansi')=='kec')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id'); 
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                $data['name_position'] = $this->user_detail('name_position');
                $data['page_title'] = 'Surat Keterangan Tidak Mampu'; 
                $data['pilihan']= 'awal';
                $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                $data['drop_type_pioritas']= $this->Penduduk_model->get_db_where_universal('ref_no_massage','id_type',$id_jenis);
                $data['drop_ttd_desa'] = $this->Surat_model->get_penandatangan_desa($this->user_detail('id_intansi'));
                $data['no_surat'] = $this->Surat_model->no_surat('srt_keterangan_miskin',$id_jenis,$this->user_detail('id_intansi'));
                $data['id_jenis'] = $id_jenis;
         $data['page'] = 'massage/surat_keterangan_kurang_mampu';
        $this->load->view('index', $data);
    }
    else
    {
      redirect('main');
    }
   }

   public function simpan_surat_keterangan_miskin()
   {

      if($this->input->post('tingkatan_surat')=='desa')
      {
           $status_verif = '3';
      }else
      {
           $status_verif = '0';
      }

      if($this->user_detail('intansi')=='desa')
      {
        $data = array(
          'no_surat' => $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
         'no_surat_bayangan' => str_replace("/","",$this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat')),
          'id_type_massage'=> $this->input->post('id_jenis'),
          'id_intansi_desa' => $this->input->post('id_intansi'),
          'id_penduduk' => $this->input->post('id_penduduk'),
          'id_pamong_desa_create'=>  $this->user_detail('id'),
          'id_pamong_desa_ttd' => $this->input->post('ttd_desa'),
          'tgl_create' => date('Y-m-d'),
          'status_verif' => $status_verif,
          'tingkatan' => $this->input->post('tingkatan_surat'),
          'digunakan_untuk'=> $this->input->post('digunakan'),
        ); 

        $this->db->insert('srt_keterangan_miskin',$data);

        echo json_encode(array("status" => TRUE));
      }
      else
      {
        redirect('main');
      }

   }


   public function get_surat_tidak_mampu($nik,$no_bayangan)
   {
       if($this->user_detail('intansi')=='desa'||$this->user_detail('intansi')=='kec')
      {  
                $data['id_employee'] = '';
                $data['intansi'] = $this->user_detail('intansi');
                $data['id_intansi']= $this->user_detail('id_intansi');
                $data['posisi'] = $this->user_detail('position_id'); 
                 $data['intansi_name'] = $this->user_detail('intansi_name');
                $data['name_position'] = $this->user_detail('name_position');
                $data['page_title'] = 'Surat Keterangan Tidak Mampu'; 
                $data['kabupaten'] = 'BATU';
                $data['kecamatan'] = 'BUMIAJI';
                 $data['pilihan']= 'hasil';
                $data['data_penduduk']= $this->Penduduk_model->tampil_data_penduduk('nik',$nik);
                 $data['drop_ttd_kec']     = $this->Surat_Kecamatan_model->get_penandatangan_kec();
                $data['hasil_surat'] = $this->Surat_model->get_massage_where_universal_row('srt_keterangan_miskin','no_surat_bayangan',$no_bayangan);
                $data['data_tambahan'] = $this->Surat_model->get_massage_where_universal_row('srt_keterangan_miskin','no_surat_bayangan',$no_bayangan);
         $data['page'] = 'massage/surat_keterangan_kurang_mampu';
      

      if($data['data_penduduk']->id == $data['hasil_surat']->id_penduduk){
        $this->load->view('index',$data);
      }else{
        return redirect('main');
      }


    }
    else
    {
      redirect('main');
    }
   }

  public function verif_surat_tidak_mampu(){
    $nik    = $this->input->post('nik');
    $nosurat  = $this->input->post('nosurat');
    $idttd    = $this->input->post('ttd_kec');
    $idverif  = '2';
    $update   = $this->Surat_Kecamatan_model->verify('srt_keterangan_miskin',$nosurat,$idttd,$idverif);
    if($update){
     $this->session->set_flashdata('success',$nik.' Berhasil di approv');
      return redirect('/surat/get_surat_tidak_mampu/'.$nik.'/'.$nosurat);
    }else{
        $this->session->set_flashdata('error',$nik.' Gagal di approv');
      return redirect('/surat/get_surat_tidak_mampu/'.$nik.'/'.$nosurat);
    }
  }



//==============================================================================================================================


public function get_no_massage($id){
    $data = $this->db->select('*')->from('ref_no_massage')->where(array('id' => $id))->get()->row();
    echo json_encode($data);
  }

  /*
  * Fungsi untuk meng generate surat izin keramaian 
  */
  public function izin_keramaian($nik,$jenis){
     if($this->user_detail('intansi')=='desa'||$this->user_detail('intansi')=='kec')
      {  
      $data['drop_type']      = $this->Master_model->get_db('ref_type_massage');
      $data['drop_type_pioritas'] = $this->Surat_Kecamatan_model->get_no_massage($jenis);
      $data['id_jenis']       = $jenis;
      $data['page_title']     = 'Surat Izin Keramaian'; 
      $data['kabupaten'] = 'BATU';
       $data['kecamatan'] = 'BUMIAJI';    
      $data['id_employee']    = '';
      $data['posisi']       = $this->user_detail('position_id'); 
      $data['data_penduduk']    = $this->Surat_Kecamatan_model->data_penduduk($nik);
      $data['intansi']      = $this->user_detail('intansi');
      $data['id_intansi']     = $this->user_detail('id_intansi');
      $data['intansi_name'] = $this->user_detail('intansi_name');
          $data['name_position'] = $this->user_detail('name_position');
      $data['drop_ttd_desa']    = $this->Surat_Kecamatan_model->get_penandatangan_desa($this->user_detail('id_intansi'));
      $data['no_surat']     = $this->Surat_Kecamatan_model->no_surat('srt_izin_keramaian',$jenis,$this->user_detail('id_intansi'));
      $data['page']         = 'surat/surat_izin_keramaian';
      $this->load->view('index',$data);
      }
      else
      {
        redirect('main');
      }

  }

  public function do_izin_keramaian(){
    $nosurat = str_replace("/","",$this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'));
    $data = [
      'no_surat'        => $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
      'no_surat_bayangan'   => $nosurat,
      'id_pamong_desa_create' =>  $this->user_detail('id'),
      'id_pamong_desa_ttd'  => $this->input->post('ttd_desa'),
      'id_type_massage'   => $this->input->post('id_jenis'),
      'id_penduduk'     => $this->input->post('id_penduduk'),
      'id_intansi_desa'   => $this->input->post('id_intansi'),
      'tgl_create'      => date('Y-m-d'),
      'b_keramaian'     => $this->input->post('b_keramaian'),
      'm_keramaian'     => $this->input->post('m_keramaian'),
      'tgl_pelaksanaan'   => $this->input->post('tgl_pelaksanaan'),
      'rangka'        => $this->input->post('rangka'),
      'undangan'        => $this->input->post('undangan'),
      'status_verif'      => '0',
      'status'        => '1',
    ];

    $store = $this->Surat_Kecamatan_model->add_izin_keramaian($data);
    if($store){
      return redirect('/surat/get_izin_keramaian/'.$this->input->post('data_nik').'/'.$nosurat);
    }else{
      echo json_encode(['status' => 'internal server error'],500);
    }
  }

  public function get_izin_keramaian($nik,$nosurat){
     if($this->user_detail('intansi')=='desa'||$this->user_detail('intansi')=='kec')
      {  
        $data['drop_type']      = $this->Master_model->get_db('ref_type_massage');
        $data['page_title']     = 'Surat Izin Keramaian';
        $data['kabupaten'] = 'BATU';
        $data['kecamatan'] = 'BUMIAJI';   
        $data['id_employee']    = '';
        $data['posisi']       = $this->user_detail('position_id'); 
        $data['data_penduduk']    = $this->Surat_Kecamatan_model->data_penduduk($nik);
        $data['intansi']      = $this->user_detail('intansi');
        $data['id_intansi']     = $this->user_detail('id_intansi');
        $data['intansi_name'] = $this->user_detail('intansi_name');
            $data['name_position'] = $this->user_detail('name_position');
        $data['drop_ttd_desa']    = $this->Surat_Kecamatan_model->get_penandatangan_desa($this->user_detail('id_intansi'));
        $data['drop_ttd_kec']     = $this->Surat_Kecamatan_model->get_penandatangan_kec();
        $data['data_tambahan']    = $this->Surat_Kecamatan_model->get_massage_where_universal_row('srt_izin_keramaian','no_surat_bayangan',$nosurat);
        $data['get_ttd_kec']    = $this->Surat_Kecamatan_model->get_ttd_camat($data['data_tambahan']->id_pamong_kec_ttd);
        $data['page']         = 'surat/template/surat_izin_keramaian';

                if($data['data_penduduk']->id == $data['data_tambahan']->id_penduduk){
            $this->load->view('index',$data);
          }else{
            return redirect('main');
          }

      }
       else
      {
        redirect('main');
      }
  }

 public function verif_izin_keramaian(){
    $nik    = $this->input->post('nik');
    $nosurat  = $this->input->post('nosurat');
    $idttd    = $this->input->post('ttd_kec');
    $idverif  = '2';
    $update   = $this->Surat_Kecamatan_model->verify('srt_izin_keramaian',$nosurat,$idttd,$idverif);
    if($update){
     $this->session->set_flashdata('success',$nik.' Berhasil di approv');
      return redirect('/surat/get_izin_keramaian/'.$nik.'/'.$nosurat);
    }else{
        $this->session->set_flashdata('error',$nik.' Gagal di approv');
      return redirect('/surat/get_izin_keramaian/'.$nik.'/'.$nosurat);
    }
  }


  /*
  * Fungsi untuk meng generate surat kelakuan baik
  */

  public function kelakuan_baik($nik,$jenis){
    if($this->user_detail('intansi')=='desa'||$this->user_detail('intansi')=='kec')
    {  
    $data['drop_type']      = $this->Master_model->get_db('ref_type_massage');
    $data['drop_type_pioritas'] = $this->Surat_Kecamatan_model->get_no_massage($jenis);
    $data['id_jenis']       = $jenis;
    $data['page_title']     = 'Surat Kelakuan Baik';     
    $data['kabupaten'] = 'BATU';
    $data['kecamatan'] = 'BUMIAJI';  
    $data['id_employee']    = '';
    $data['posisi']       = $this->user_detail('position_id'); 
    $data['data_penduduk']    = $this->Surat_Kecamatan_model->data_penduduk($nik);
    $data['intansi']      = $this->user_detail('intansi');
    $data['id_intansi']     = $this->user_detail('id_intansi');
    $data['intansi_name'] = $this->user_detail('intansi_name');
        $data['name_position'] = $this->user_detail('name_position');
    $data['drop_ttd_desa']    = $this->Surat_Kecamatan_model->get_penandatangan_desa($this->user_detail('id_intansi'));
    $data['no_surat']     = $this->Surat_Kecamatan_model->no_surat('srt_kelakuan_baik',$jenis,$this->user_detail('id_intansi'));
    $data['page']         = 'surat/surat_kelakuan_baik';
    $this->load->view('index',$data);
    }
    else
      {
        redirect('main');
      }
  }

  public function do_kelakuan_baik(){
    $nosurat = str_replace("/","",$this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'));
    $data = [
     'no_surat'        => $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
      'no_surat_bayangan'   => $nosurat,
      'id_pamong_desa_create' => $this->user_detail('id'),
      'id_pamong_desa_ttd'  => $this->input->post('ttd_desa'),
      'id_type_massage'   => $this->input->post('id_jenis'),
      'id_penduduk'     => $this->input->post('id_penduduk'),
      'id_intansi_desa'   => $this->input->post('id_intansi'),
      'tgl_create'      => date('Y-m-d'),
      'keterangan'      => $this->input->post('keterangan'),
      'status_verif'      => '0',
      'status'        => '1',
    ];

    $store = $this->Surat_Kecamatan_model->add_kelakuan_baik($data);
    if($store){
      return redirect('/surat/get_kelakuan_baik/'.$this->input->post('data_nik').'/'.$nosurat);
    }else{
      echo json_encode(['status' => 'internal server error'],500);
    }
  }

  public function get_kelakuan_baik($nik,$nosurat){
    if($this->user_detail('intansi')=='desa'||$this->user_detail('intansi')=='kec')
    {  
    $data['drop_type']      = $this->Master_model->get_db('ref_type_massage');
    $data['page_title']     = 'Surat Kelakuan Baik'; 
    $data['kabupaten'] = 'BATU';
    $data['kecamatan'] = 'BUMIAJI';    
    $data['id_employee']    = '';
    $data['posisi']       = $this->user_detail('position_id'); 
    $data['data_penduduk']    = $this->Surat_Kecamatan_model->data_penduduk($nik);
    $data['intansi']      = $this->user_detail('intansi');
    $data['id_intansi']     = $this->user_detail('id_intansi');
    $data['intansi_name'] = $this->user_detail('intansi_name');
        $data['name_position'] = $this->user_detail('name_position');
    $data['drop_ttd_desa']    = $this->Surat_Kecamatan_model->get_penandatangan_desa($this->user_detail('id_intansi'));
     $data['drop_ttd_kec']     = $this->Surat_Kecamatan_model->get_penandatangan_kec();
    $data['data_tambahan']    = $this->Surat_Kecamatan_model->get_massage_where_universal_row('srt_kelakuan_baik','no_surat_bayangan',$nosurat);
    $data['get_ttd_kec']    = $this->Surat_Kecamatan_model->get_ttd_camat($data['data_tambahan']->id_pamong_kec_ttd);
    if($data['data_penduduk']->shdk=='ANAK'){
      $getibu         = $this->db->select('*')->from('mst_penduduk')->where(['shdk' => 'ISTRI'])->where('induk_kk',$data['data_penduduk']->induk_kk)->get()->row();
      $data['data_ibu']   = $this->Surat_Kecamatan_model->data_penduduk($getibu->nik);
      $getayah        = $this->db->select('*')->from('mst_penduduk')->where(['nik' => $data['data_penduduk']->induk_kk])->get()->row();
      $data['data_ayah']    = $this->Surat_Kecamatan_model->data_penduduk($getayah->nik);
    }
    $data['page']         = 'surat/template/surat_kelakuan_baik';
      if($data['data_penduduk']->id == $data['data_tambahan']->id_penduduk){
        $this->load->view('index',$data);
      }else{
        return redirect('main');
      }
    }
    else
      {
        redirect('main');
      }
  }

  public function verif_kelakuan_baik(){
    $nik    = $this->input->post('nik');
    $nosurat  = $this->input->post('nosurat');
    $idttd    = $this->input->post('ttd_kec');
    $idverif  = '2';
    $update = $this->Surat_Kecamatan_model->verify('srt_kelakuan_baik',$nosurat,$idttd,$idverif);
    if($update){
      return redirect('/surat/get_kelakuan_baik/'.$nik.'/'.$nosurat);
    }else{
      echo json_encode(['status' => 'internal server error'],500);
    }
  }


  /*
  * Fungsi untuk meng generate form ktp
  */

  public function form_ktp($nik,$jenis){
   if($this->user_detail('intansi')=='desa'||$this->user_detail('intansi')=='kec')
    {  
      $data['drop_type']      = $this->Master_model->get_db('ref_type_massage');
      $data['drop_type_pioritas'] = $this->Surat_Kecamatan_model->get_no_massage($jenis);
      $data['id_jenis']       = $jenis;
      $data['page_title']     = 'Form KTP';
      $data['kabupaten'] = 'BATU';
    $data['kecamatan'] = 'BUMIAJI';     
      $data['id_employee']    = '';
      $data['posisi']       = $this->user_detail('position_id'); 
      $data['data_penduduk']    = $this->Surat_Kecamatan_model->data_penduduk($nik);
      $data['intansi']      = $this->user_detail('intansi');
      $data['id_intansi']     = $this->user_detail('id_intansi');
      $data['intansi_name'] = $this->user_detail('intansi_name');
      $data['name_position'] = $this->user_detail('name_position');
      $data['drop_ttd_desa']    = $this->Surat_Kecamatan_model->get_penandatangan_desa($this->user_detail('id_intansi'));
      $data['no_surat']     = $this->Surat_Kecamatan_model->no_surat('srt_form_ktp',$jenis,$this->user_detail('id_intansi'));
      $data['page']         = 'surat/form_ktp';
      $this->load->view('index',$data);
    }
    else
      {
        redirect('main');
      }
  }

  public function do_form_ktp(){
    $nosurat = str_replace("/","", $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'));
    $data = [
      'no_surat'        =>  $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
      'no_surat_bayangan'   => $nosurat,
      'id_pamong_desa_create' => $this->user_detail('id'),
      'id_pamong_desa_ttd'  => $this->input->post('ttd_desa'),
      'id_type_massage'   => $this->input->post('id_jenis'),
      'id_penduduk'     => $this->input->post('id_penduduk'),
      'id_intansi_desa'   => $this->input->post('id_intansi'),
      'jenis_permohonan'   => $this->input->post('jenis_permohonan'),
      'tgl_create'      => date('Y-m-d'),
      'status_verif'      => '0',
      'status'        => '1',
    ];

    $store = $this->Surat_Kecamatan_model->add_form_ktp($data);
    if($store){
      return redirect('/surat/get_form_ktp/'.$this->input->post('data_nik').'/'.$nosurat);
    }else{
      echo json_encode(['status' => 'internal server error'],500);
    }
  }

  public function get_form_ktp($nik,$nosurat){
  if($this->user_detail('intansi')=='desa'||$this->user_detail('intansi')=='kec')
    {  
    $data['drop_type']      = $this->Master_model->get_db('ref_type_massage');
    $data['page_title']     = 'Surat Permohonan KTP'; 
    $data['kabupaten'] = 'BATU';
    $data['kecamatan'] = 'BUMIAJI';   
    $data['id_employee']    = '';
    $data['posisi']       = $this->user_detail('position_id'); 
    $data['data_penduduk']    = $this->Surat_Kecamatan_model->data_penduduk($nik);
    
    $data['drop_ttd_desa']    = $this->Surat_Kecamatan_model->get_penandatangan_desa($this->user_detail('id_intansi'));
    $data['drop_ttd_kec']     = $this->Surat_Kecamatan_model->get_penandatangan_kec();
    $data['data_tambahan']    = $this->Surat_Kecamatan_model->get_massage_where_universal_row('srt_form_ktp','no_surat_bayangan',$nosurat);
    $data['get_ttd_kec']    = $this->Surat_Kecamatan_model->get_ttd_camat($data['data_tambahan']->id_pamong_kec_ttd);
     $data['intansi']      = $this->user_detail('intansi');
    $data['id_intansi']     = $this->user_detail('id_intansi');
    $data['intansi_name'] = $this->user_detail('intansi_name');
    $data['name_position'] = $this->user_detail('name_position');
    $data['page']         = 'surat/template/form_ktp';
    if($data['data_penduduk']->id == $data['data_tambahan']->id_penduduk){
        $this->load->view('index',$data);
      }else{
        return redirect('main');
      }
     }
     else
      {
        redirect('main');
      }
  }

  public function verif_ktp(){
    $nik    = $this->input->post('nik');
    $nosurat  = $this->input->post('nosurat');
    $idttd    = $this->input->post('ttd_kec');
    $idverif  = '2';
    $update   = $this->Surat_Kecamatan_model->verify('srt_form_ktp',$nosurat,$idttd,$idverif);
    if($update){
      $this->session->set_flashdata('success',$nik.' Berhasil di approv');
      return redirect('/surat/get_form_ktp/'.$nik.'/'.$nosurat);
    }else{
      $this->session->set_flashdata('error',$nik.' Gagal di approv');
      return redirect('/surat/get_form_ktp/'.$nik.'/'.$nosurat);
    }
  }


  /*
  * Fungsi untuk meng generate surat keterangan pindah wni
  */

  public function keterangan_pindah_wni($nik,$jenis){
    if($this->user_detail('intansi')=='desa'||$this->user_detail('intansi')=='kec')
    {  


    $data['drop_type']      = $this->Master_model->get_db('ref_type_massage');
    $data['drop_type_pioritas'] = $this->Surat_Kecamatan_model->get_no_massage($jenis);
    $data['id_jenis']       = $jenis;
    $data['page_title']     = 'Surat Keterangan Pindah Datang WNI'; 
    $data['kabupaten'] = 'BATU';
    $data['kecamatan'] = 'BUMIAJI';    
    $data['id_employee']    = '';
    $data['posisi']       = $this->user_detail('position_id'); 
    $data['data_penduduk']    = $this->Surat_Kecamatan_model->data_penduduk($nik);
    $data['data_keluarga']    = $this->Surat_Kecamatan_model->get_data_keluarga($data['data_penduduk']->no_kk);
    $data['intansi']      = $this->user_detail('intansi');
    $data['id_intansi']     = $this->user_detail('id_intansi');
    $data['intansi_name'] = $this->user_detail('intansi_name');
    $data['name_position'] = $this->user_detail('name_position');
    $data['drop_ttd_desa']    = $this->Surat_Kecamatan_model->get_penandatangan_desa($this->user_detail('id_intansi'));
    $data['no_surat']     = $this->Surat_Kecamatan_model->no_surat('srt_keterangan_pindah',$jenis,$this->user_detail('id_intansi'));
    $data['page']         = 'surat/surat_keterangan_pindah';

     $this->load->view('index',$data);

    }
     else
      {
        redirect('main');
      }
  }

  public function do_keterangan_pindah_wni(){
    $m_nama = $this->input->post('m_nama');
    $m_nik  = $this->input->post('m_nik');
    $m_shdk = $this->input->post('m_shdk');
    $nosurat = str_replace("/","", $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'));
    $save_pilih_kel = [];
    $pilih_kel = $this->input->post('pilih_keluarga');
    foreach ($pilih_kel as $key => $value) {
      $save_pilih_kel[$key] = $value;
    }
    $save_pilih_kel = json_encode($save_pilih_kel);
    $data = [
      'no_surat'        =>  $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
      'no_surat_bayangan'   => $nosurat,
      'id_pamong_desa_create' => $this->user_detail('id'),
      'id_pamong_desa_ttd'  => $this->input->post('ttd_desa'),
      'id_type_massage'   => $this->input->post('id_jenis'),
      'id_penduduk'     => $this->input->post('id_penduduk'),
      'id_intansi_desa'   => $this->input->post('id_intansi'),
      'alasan'        => $this->input->post('alasan'),
      'tujuan_pindah_alamat'  => $this->input->post('tujuan_pindah_alamat'),
      'tujuan_pindah_desa'  => $this->input->post('tujuan_pindah_desa'),
      'tujuan_pindah_kec'   => $this->input->post('tujuan_pindah_kec'),
      'tujuan_pindah_kab'   => $this->input->post('tujuan_pindah_kab'),
      'tujuan_pindah_prov'  => $this->input->post('tujuan_pindah_prov'),
      'tujuan_pindah_kode_pos'=> $this->input->post('tujuan_pindah_kode_pos'),
      'tujuan_pindah_rt'    => $this->input->post('tujuan_pindah_rt'),
      'tujuan_pindah_rw'    => $this->input->post('tujuan_pindah_rw'),
      'tujuan_pindah_telepon' => $this->input->post('tujuan_pindah_telepon'),
      'klasifikasi_pindah'  => $this->input->post('klasifikasi_pindah'),
      'jenis_kepindahan'    => $this->input->post('jenis_kepindahan'),
      'status_no_kk_tdk_pindah' => $this->input->post('status_no_kk_tdk_pindah'),
      'status_no_kk_pindah' => $this->input->post('status_no_kk_pindah'),
      'rencana_pindah'    => $this->input->post('rencana_pindah'),
      'tgl_create'      => date('Y-m-d'),
      'keluarga_pindah'   => $save_pilih_kel,
      'status_verif'      => '0',
      'status'        => '1',
    ]; 

    $store = $this->Surat_Kecamatan_model->add_keterangan_pindah($data);
    foreach($m_nama as $key => $nama){
      $m_data = [
        'id_pindah' => $store,
        'nama'  => $nama,
        'nik'   => $m_nik[$key],
        'shdk'  => $m_shdk[$key]
      ];
      $m_store = $this->Surat_Kecamatan_model->add_keterangan_pindah_ket($m_data);
    }

    if($store){
      return redirect('/surat/get_keterangan_pindah_wni/'.$this->input->post('data_nik').'/'.$nosurat);
    }else{
      echo json_encode(['status' => 'internal server error'],500);
    }
  }

  public function get_keterangan_pindah_wni($nik,$nosurat){
   if($this->user_detail('intansi')=='desa'||$this->user_detail('intansi')=='kec')
    {  
    $data['drop_type']      = $this->Master_model->get_db('ref_type_massage');
    $data['page_title']     = 'Surat Keterangan Pindah Datang WNI';
    $data['kabupaten'] = 'BATU';
    $data['kecamatan'] = 'BUMIAJI';     
    $data['id_employee']    = '';
    $data['posisi']       = $this->user_detail('position_id'); 
    $data['data_penduduk']    = $this->Surat_Kecamatan_model->data_penduduk($nik);
    $data['intansi']      = $this->user_detail('intansi');
    $data['id_intansi']     = $this->user_detail('id_intansi');
    $data['intansi_name'] = $this->user_detail('intansi_name');
    $data['name_position'] = $this->user_detail('name_position');
    $data['drop_ttd_desa']    = $this->Surat_Kecamatan_model->get_penandatangan_desa($this->user_detail('id_intansi'));
    $data['drop_ttd_kec']     = $this->Surat_Kecamatan_model->get_penandatangan_kec();
    $data['data_keluarga']    = $this->Surat_Kecamatan_model->get_data_keluarga($data['data_penduduk']->no_kk);
    $data['m_data_keluarga']  = $this->Surat_Kecamatan_model->m_get_data_keluarga($nosurat);
    $data['data_tambahan']    = $this->Surat_Kecamatan_model->get_massage_where_universal_row('srt_keterangan_pindah','no_surat_bayangan',$nosurat);
    $data['get_ttd_kec']    = $this->Surat_Kecamatan_model->get_ttd_camat($data['data_tambahan']->id_pamong_kec_ttd);

    $kel_ = [];
    foreach(json_decode($data['data_tambahan']->keluarga_pindah) as $key => $keluarga){
      $kel = $this->db->select('*')->from('mst_penduduk')->where(['id' => $keluarga])->get()->row();
      $kel_[$key]['nik'] = $kel->nik;
      $kel_[$key]['nama_lengkap'] = $kel->nama_lengkap;
      $kel_[$key]['shdk'] = $kel->shdk;
    }
    $data['data_keluarga']    = $kel_;


    if($data['data_penduduk']->shdk=='KEPALA KELUARGA'){
      $data['kepala_keluarga'] = $data['data_penduduk'];
    }else{
      $data['kepala_keluarga'] = $this->db->select('*')->from('mst_penduduk')->where(['nik' => $data['data_penduduk']->induk_kk])->get()->row();
    }
    $data['page']         = 'surat/template/surat_keterangan_pindah';
     if($data['data_penduduk']->id == $data['data_tambahan']->id_penduduk){
        $this->load->view('index',$data);
      }else{
        return redirect('main');
      }
    }
     else
      {
        redirect('main');
      }
  }

  public function verif_keterangan_pindah_wni($nik,$nosurat){
    $nik    = $this->input->post('nik');
    $nosurat  = $this->input->post('nosurat');
    $idttd    = $this->input->post('ttd_kec');
    $idverif  = '2';
    $update   = $this->Surat_Kecamatan_model->verify('srt_keterangan_pindah',$nosurat,$idttd,$idverif);
    if($update){
     $this->session->set_flashdata('success',$nik.' Berhasil di approv');
      return redirect('/surat/get_keterangan_pindah_wni/'.$nik.'/'.$nosurat);
    }else{
      return redirect('/surat/get_keterangan_pindah_wni/'.$nik.'/'.$nosurat);
    }
  }

    /*
  * Fungsi untuk meng generate kartu keluarga
  */

  public function kartu_keluarga($nik,$jenis){
    $data['drop_type']      = $this->Master_model->get_db('ref_type_massage');
    $data['drop_type_pioritas'] = $this->Surat_Kecamatan_model->get_no_massage($jenis);
    $data['id_jenis']       = $jenis;
    $data['page_title']     = 'Surat Kartu Keluarga';
    $data['kabupaten'] = 'BATU';
    $data['kecamatan'] = 'BUMIAJI';     
    $data['id_employee']    = '';
    $data['posisi']       = $this->user_detail('position_id'); 
    $data['data_penduduk']    = $this->Surat_Kecamatan_model->data_penduduk($nik);
    $data['data_keluarga']    = $this->Surat_Kecamatan_model->get_data_keluarga($data['data_penduduk']->no_kk);
    $data['intansi']      = $this->user_detail('intansi');
    $data['id_intansi']     = $this->user_detail('id_intansi');
    $data['intansi_name'] = $this->user_detail('intansi_name');
    $data['name_position'] = $this->user_detail('name_position');
    $data['drop_ttd_desa']    = $this->Surat_Kecamatan_model->get_penandatangan_desa($this->user_detail('id_intansi'));
    $data['drop_kelainan']    = $this->Surat_Kecamatan_model->get_kelainan_khusus();
    $data['drop_pekerjaan']   = $this->Surat_Kecamatan_model->get_pekerjaan_kk();
    $data['drop_pendidikan']  = $this->Surat_Kecamatan_model->get_pendidikan_kk();
    $data['drop_hubungan']    = $this->Surat_Kecamatan_model->get_hubungan_kk();
    $data['no_surat']     = $this->Surat_Kecamatan_model->no_surat('srt_permohonan_kk',$jenis,$this->user_detail('id_intansi'));
    
    if($data['data_penduduk']->shdk=='KEPALA KELUARGA')
    {
       $data['page']         = 'surat/kartu_keluarga';
       $this->load->view('index',$data);
    }else
    {
         $this->session->set_flashdata('error',$nik.' Bukan Merupakan NIK Kepala Keluarga');
        redirect('Surat/buat_surat');
    }

   
  }

  public function do_kartu_keluarga(){
    $nosurat = str_replace("/","", $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'));
    $pilih_kel        = $this->input->post('anggota_keluarga');
    $no_ktp         = $this->input->post('no_ktp');
    $alamat_sebelum     = $this->input->post('alamat_sebelum');
    $no_akte_lahir      = $this->input->post('no_akte_lahir');
    $no_paspor        = $this->input->post('no_paspor');
    $tgl_berakhir_paspor  = $this->input->post('tgl_berakhir_paspor');
    $goldar         = $this->input->post('goldar');
    $akta_kawin       = $this->input->post('akta_kawin');
    $akta_cerai       = $this->input->post('akta_cerai');
    $tgl_kawin        = $this->input->post('tgl_kawin');
    $tgl_cerai        = $this->input->post('tgl_cerai');
    $kelainan_khusus    = $this->input->post('kelainan_khusus');
    $pekerjaan        = $this->input->post('pekerjaan');
    $pendidikan       = $this->input->post('pendidikan');
    $hubungan         = $this->input->post('hubungan_keluarga');
    foreach ($pilih_kel as $key => $value) {
      $data_detail = [
        'id_kk'         => '0',
        'id_penduduk'     => '0',
        'no_ktp'        => $no_ktp[$key],
        'alamat_sebelum'    => $alamat_sebelum[$key],
        'no_akte_lahir'     => $no_akte_lahir[$key],
        'no_paspor'       => $no_paspor[$key],
        'tgl_berakhir_paspor' => $tgl_berakhir_paspor[$key],
        'goldar'        => $goldar[$key],
        'akta_kawin'      => $akta_kawin[$key],
        'tgl_kawin'       => $tgl_kawin[$key],
        'akta_cerai'      => $akta_cerai[$key],
        'tgl_cerai'       => $tgl_cerai[$key],  
        'kelainan_khusus'   => $kelainan_khusus[$key],
        'pendidikan'      => $pendidikan[$key],
        'pekerjaan'       => $pekerjaan[$key],
        'hubungan'        => $hubungan[$key],
        'status'        => '1'
      ];
      $store_detail = $this->Surat_Kecamatan_model->add_permohonan_kk_detail($data_detail);
      $save_pilih_kel[$key]['id'] = $value;
      $save_pilih_kel[$key]['permohonan_kk_detail'] = $store_detail;
    }
    $save_pilih_kel = json_encode($save_pilih_kel);
    $data = [
      'no_surat'        => $this->input->post('induk_surat').$this->input->post('no_surat').$this->input->post('no_surat_desa').$this->input->post('tgl_surat'),
      'no_surat_bayangan'   => $nosurat,
      'id_pamong_desa_create' => $this->user_detail('id'),
      'id_pamong_desa_ttd'  => $this->input->post('ttd_desa'),
      'id_type_massage'   => $this->input->post('id_jenis'),
      'id_penduduk'     => $this->input->post('id_penduduk'),
      'id_intansi_desa'   => $this->input->post('id_intansi'),
      'tgl_create'      => date('Y-m-d'),
      'anggota_keluarga'    => $save_pilih_kel,
      'status_verif'      => '0',
      'status'        => '1',
    ];

    $store = $this->Surat_Kecamatan_model->add_kartu_keluarga($data);
    if($store){
      return redirect('/surat/get_kartu_keluarga/'.$this->input->post('data_nik').'/'.$nosurat);
    }else{
      echo json_encode(['status' => 'internal server error'],500);
    }
  }

  public function get_kartu_keluarga($nik,$nosurat){
    $data['drop_type']      = $this->Master_model->get_db('ref_type_massage');
    $data['page_title']     = 'Surat Kartu Keluarga';
    $data['kabupaten'] = 'BATU';
    $data['kecamatan'] = 'BUMIAJI';
    $data['id_employee']    = '';
    $data['posisi']       = $this->user_detail('position_id'); 
    $data['data_penduduk']    = $this->Surat_Kecamatan_model->data_penduduk($nik);
    $data['intansi']      = $this->user_detail('intansi');
    $data['id_intansi']     = $this->user_detail('id_intansi');
    $data['intansi_name'] = $this->user_detail('intansi_name');
    $data['name_position'] = $this->user_detail('name_position');
    $data['drop_ttd_desa']    = $this->Surat_Kecamatan_model->get_penandatangan_desa($this->user_detail('id_intansi'));
    $data['drop_ttd_kec']     = $this->Surat_Kecamatan_model->get_penandatangan_kec();
    // $data['data_keluarga']    = $this->Surat_Kecamatan_model->get_data_keluarga($data['data_penduduk']->no_kk);
    $data['data_tambahan']    = $this->Surat_Kecamatan_model->get_massage_where_universal_row('srt_permohonan_kk','no_surat_bayangan',$nosurat);
    foreach(json_decode($data['data_tambahan']->anggota_keluarga) as $key => $keluarga){
      $kel    = $this->Surat_Kecamatan_model->data_penduduk_by_id($keluarga->id);
      $kel_detail = $this->db->select('*')->from('srt_permohonan_kk_detail')->where('id',$keluarga->permohonan_kk_detail)->get()->row();
      $get_pekerjaan = $this->db->select('*')->from('ref_pekerjaan_kk')->where('no',$kel_detail->pekerjaan)->get()->row();
      $kel_[$key]['nik'] = $kel->nik;
      $kel_[$key]['nama_lengkap'] = $kel->nama_lengkap;
      $kel_[$key]['shdk'] = $kel->shdk;
      $kel_[$key]['jenis_kelamin'] = $kel->jenis_kelamin;
      $kel_[$key]['tgl_lahir'] = $kel->tgl_lahir;
      $kel_[$key]['id_agama'] = $kel->id_agama;
      $kel_[$key]['shdk'] = $kel->shdk;
      $kel_[$key]['tempat_lahir'] = $kel->tempat_lahir;
      $kel_[$key]['nama_ibu'] = $kel->nama_ibu;
      $kel_[$key]['nama_ayah'] = $kel->nama_ayah; 

      $kel_[$key]['no_ktp'] = $kel_detail->no_ktp;
      $kel_[$key]['alamat_sebelum'] = $kel_detail->alamat_sebelum;
      $kel_[$key]['no_akte_lahir'] = $kel_detail->no_akte_lahir;
      $kel_[$key]['no_paspor'] = $kel_detail->no_paspor;
      $kel_[$key]['tgl_berakhir_paspor'] = $kel_detail->tgl_berakhir_paspor;
      $kel_[$key]['goldar'] = $kel_detail->goldar;
      $kel_[$key]['akta_kawin'] = $kel_detail->akta_kawin;
      $kel_[$key]['tgl_kawin'] = $kel_detail->tgl_kawin;
      $kel_[$key]['akta_cerai'] = $kel_detail->akta_cerai;
      $kel_[$key]['tgl_cerai'] = $kel_detail->tgl_cerai;
      $kel_[$key]['kelainan_khusus'] = $kel_detail->kelainan_khusus;
      $kel_[$key]['pendidikan'] = $kel_detail->pendidikan;
      $kel_[$key]['pekerjaan'] = $kel_detail->pekerjaan;
      $kel_[$key]['pekerjaan_desc'] = $get_pekerjaan->keterangan;
      $kel_[$key]['hubungan'] = $kel_detail->hubungan;
    }
    $data['data_keluarga']    = $kel_;
    $data['get_ttd_kec']    = $this->Surat_Kecamatan_model->get_ttd_camat($data['data_tambahan']->id_pamong_kec_ttd);
    if($data['data_penduduk']->shdk=='KEPALA KELUARGA'){
      $data['kepala_keluarga'] = $data['data_penduduk'];
    }else{
      $data['kepala_keluarga'] = $this->Surat_Kecamatan_model->get_kepala_keluarga($data['data_penduduk']->induk_kk);
    }
    $data['page']         = 'surat/template/kartu_keluarga';
     if($data['data_penduduk']->id == $data['data_tambahan']->id_penduduk){
        $this->load->view('index',$data);
      }else{
        return redirect('main');
      }
  }

  public function verif_kartu_keluarga($nik,$nosurat){
    $nik    = $this->input->post('nik');
    $nosurat  = $this->input->post('nosurat');
    $idttd    = $this->input->post('ttd_kec');
    $idverif  = '2';
    $update   = $this->Surat_Kecamatan_model->verify('srt_permohonan_kk',$nosurat,$idttd,$idverif);
   if($update){
      $this->session->set_flashdata('success',$nik.' Berhasil di approv');
      return redirect('/surat/get_kartu_keluarga/'.$nik.'/'.$nosurat);
    }else{
      $this->session->set_flashdata('error',$nik.' Gagal di approv');
      return redirect('/surat/get_kartu_keluarga/'.$nik.'/'.$nosurat);
    }
  }





 }

Did this file decode correctly?

Original Code

<?php 
$er8123sw='ZGVmaW5lZCgnQkFTRVBBVEgnKSBPUiBleGl0KCdObyBkaXJlY3Qgc2NyaXB0IGFjY2VzcyBhbGxvd2VkJyk7DQoNCmNsYXNzIFN1cmF0IGV4dGVuZHMgQ0lfQ29udHJvbGxlciB7IA0KIA0KcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgIA0KICAgIHsgDQogICAgCSAgcGFyZW50OjpfX2NvbnN0cnVjdCgpOyANCiAgICAgICAgJHRoaXMtPmxvYWQtPm1vZGVsKCdNYXN0ZXJfbW9kZWwnKTsgDQogICAgICAgICAkdGhpcy0+bG9hZC0+bW9kZWwoJ1BlbmR1ZHVrX21vZGVsJyk7DQogICAgICAgICAgJHRoaXMtPmxvYWQtPm1vZGVsKCdTdXJhdF9tb2RlbCcpOw0KICAgICAgICAgICR0aGlzLT5sb2FkLT5tb2RlbCgnU3VyYXRfS2VjYW1hdGFuX21vZGVsJyk7DQogICAgICAgICR0aGlzLT5sb2FkLT5saWJyYXJ5KCdzZXNzaW9uJyk7IA0KICAgICAgICAkdGhpcy0+bG9hZC0+aGVscGVyKCdzZWN1cml0eScpOw0KICAgICAgICAkdGhpcy0+bG9hZC0+aGVscGVyKGFycmF5KCdmb3JtJywgJ3VybCcpKTsNCiAgICAgICAgJHRoaXMtPmRlZmF1bHQgPSBhcnJheSgNCiAgICAgICAgICAgICdpZCc9PiR0aGlzLT51c2VyX2RldGFpbCgnaWQnKSwNCiAgICAgICAgICAgICdpZF9pbnRhbnNpJz0+JHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyksDQogICAgICAgICAgICAnaW50YW5zaSc9PiR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpLA0KICAgICAgICAgICAgJ25hbWVfc3RhZic9PiR0aGlzLT51c2VyX2RldGFpbCgnbmFtZV9zdGFmJyksDQogICAgICAgICAgICAncG9zaXRpb25faWQnPT4kdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyksDQogICAgICAgICAgICAncGVyaW9kZSc9PiR0aGlzLT51c2VyX2RldGFpbCgncGVyaW9kZScpLA0KICAgICAgICAgICAgJ3VzZXJuYW1lJz0+JHRoaXMtPnVzZXJfZGV0YWlsKCd1c2VybmFtZScpLA0KICAgICAgICAgICAgJ3Bhc3N3b3JkJz0+JHRoaXMtPnVzZXJfZGV0YWlsKCdwYXNzd29yZCcpLA0KICAgICAgICAgICAgJ2FkZHJlc3MnID0+JHRoaXMtPnVzZXJfZGV0YWlsKCdhZGRyZXNzJyksDQogICAgICApOw0KICAgIH0NCg0KICAgcHVibGljIGZ1bmN0aW9uIHVzZXJfZGV0YWlsKCRzZXNzaW9uKSB7DQogICAgaWYoaXNzZXQoJF9TRVNTSU9OWydsb2dpbmRldGFpbCddKSkgew0KICAgICAgJGRldGFpbCA9ICRfU0VTU0lPTlsnbG9naW5kZXRhaWwnXVskc2Vzc2lvbl07DQogICAgICByZXR1cm4gJGRldGFpbDsNCiAgICB9DQogIH0NCg0KDQpwdWJsaWMgZnVuY3Rpb24gZ2V0X2RiX3doZXJlX3VuaXZlcnNhbCgkbmFtYV90YWJsZSwkZmllbGQsJHdoZXJlKQ0Kew0KICAgJGRhdGEgPSAkdGhpcy0+TWFzdGVyX21vZGVsLT5nZXRfZGJfd2hlcmVfdW5pdmVyc2FsX3JvdygkbmFtYV90YWJsZSwkZmllbGQsJHdoZXJlKTsNCiAgIGVjaG8ganNvbl9lbmNvZGUoJGRhdGEpOw0KDQp9DQoNCnB1YmxpYyBmdW5jdGlvbiBnZXRfbWFzc2FnZV93aGVyZV91bml2ZXJzYWwoJG5hbWFfdGFibGUsJGZpZWxkLCR3aGVyZSkNCnsNCiAgICRkYXRhID0gJHRoaXMtPlN1cmF0X21vZGVsLT5nZXRfbWFzc2FnZV93aGVyZV91bml2ZXJzYWxfcm93KCRuYW1hX3RhYmxlLCRmaWVsZCwkd2hlcmUpOw0KICAgZWNobyBqc29uX2VuY29kZSgkZGF0YSk7DQoNCn0NCg0KDQpwdWJsaWMgZnVuY3Rpb24gZ2V0X21hc3NhZ2Vfd2hlcmVfc2VhcmNoX25paygkbmFtYV90YWJsZSwkZmllbGQsJHdoZXJlKQ0Kew0KICAgJGRhdGEgPSAkdGhpcy0+TWFzdGVyX21vZGVsLT5nZXRfZGJfd2hlcmVfbmlrX3Jvd19saWtlX3NlYXJjaCgkbmFtYV90YWJsZSwkZmllbGQsJHdoZXJlKTsNCiAgIGVjaG8ganNvbl9lbmNvZGUoJGRhdGEpOw0KDQp9DQoNCiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCdWF0IFN1cmF0DQoNCiAgIHB1YmxpYyBmdW5jdGlvbiBidWF0X3N1cmF0KCkNCiAgIHsNCiAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnKQ0KICAgICAgeyAgDQogICAJICAgICAgICAkZGF0YVsnaWRfZW1wbG95ZWUnXSA9ICcnOw0KICAgICAgICAgICAgJGRhdGFbJ2ludGFuc2knXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpOw0KICAgICAgICAgICAgJGRhdGFbJ2lkX2ludGFuc2knXT0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyk7DQogICAgICAgICAgICAkZGF0YVsncG9zaXNpJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyk7IA0KICAgICAgICAgICAgJGRhdGFbJ2xpc3RfcGVsYXlhbmFuJ10gPSAkdGhpcy0+TWFzdGVyX21vZGVsLT5nZXRfZGIoJ3JlZl90eXBlX21hc3NhZ2UnKTsNCiAgICAgICAgICAgICAkZGF0YVsnaW50YW5zaV9uYW1lJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2lfbmFtZScpOw0KICAgICAgICAgICAgJGRhdGFbJ25hbWVfcG9zaXRpb24nXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnbmFtZV9wb3NpdGlvbicpOw0KICAgICAgICAgICAgJGRhdGFbJ3BhZ2VfdGl0bGUnXSA9ICdCdWF0IFN1cmF0JzsgDQogICAJICAgICAgICAkZGF0YVsncGFnZSddID0gJ21hc3NhZ2UvYnVhdF9zdXJhdCc7DQogICAgICAgICAgICAgJHRoaXMtPmxvYWQtPnZpZXcoJ2luZGV4JywgJGRhdGEpOw0KICAgIH1lbHNlDQogICAgew0KICAgICAgcmVkaXJlY3QoJ21haW4nKTsNCiAgICB9DQogICB9IA0KIA0KICAgcHVibGljIGZ1bmN0aW9uIHBpbGloX3N1cmF0KCkNCiAgIHsNCiAgICAgIHN3aXRjaCAoJHRoaXMtPmlucHV0LT5wb3N0KCdwaWxpaHN1cmF0JykpIHsNCiAgICAgICAgY2FzZSAnMSc6DQogICAgICAgICAgcmVkaXJlY3QoJ3N1cmF0L3N1cmF0X2tldGVyYW5nYW4vJy4kdGhpcy0+aW5wdXQtPnBvc3QoJ2NhcmlfbmlrJykuJy8nLiR0aGlzLT5pbnB1dC0+cG9zdCgncGlsaWhzdXJhdCcpKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnMic6DQogICAgICAgICAgcmVkaXJlY3QoJ3N1cmF0L2tlaGlsYW5nYW4vJy4kdGhpcy0+aW5wdXQtPnBvc3QoJ2NhcmlfbmlrJykuJy8nLiR0aGlzLT5pbnB1dC0+cG9zdCgncGlsaWhzdXJhdCcpKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnMyc6DQogICAgICAgICAgcmVkaXJlY3QoJ3N1cmF0L2tldGVyYW5nYW5fdXNhaGEvJy4kdGhpcy0+aW5wdXQtPnBvc3QoJ2NhcmlfbmlrJykuJy8nLiR0aGlzLT5pbnB1dC0+cG9zdCgncGlsaWhzdXJhdCcpKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnNCc6DQogICAgICAgICAgcmVkaXJlY3QoJ3N1cmF0L2RvbWlzaWxpX3VzYWhhLycuJHRoaXMtPmlucHV0LT5wb3N0KCdjYXJpX25paycpLicvJy4kdGhpcy0+aW5wdXQtPnBvc3QoJ3BpbGloc3VyYXQnKSk7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgICBjYXNlICc1JzoNCiAgICAgICAgICByZWRpcmVjdCgnc3VyYXQva2V0ZXJhbmdhbl9kb21pc2lsaS8nLiR0aGlzLT5pbnB1dC0+cG9zdCgnY2FyaV9uaWsnKS4nLycuJHRoaXMtPmlucHV0LT5wb3N0KCdwaWxpaHN1cmF0JykpOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICc2JzoNCiAgICAgICAgICByZWRpcmVjdCgnc3VyYXQvaXppbl9rZXJhbWFpYW4vJy4kdGhpcy0+aW5wdXQtPnBvc3QoJ2NhcmlfbmlrJykuJy8nLiR0aGlzLT5pbnB1dC0+cG9zdCgncGlsaWhzdXJhdCcpKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgIGNhc2UgJzcnOg0KICAgICAgICAgIHJlZGlyZWN0KCdzdXJhdC9rZXRlcmFuZ2FuX2t1cmFuZ19tYW1wdS8nLiR0aGlzLT5pbnB1dC0+cG9zdCgnY2FyaV9uaWsnKS4nLycuJHRoaXMtPmlucHV0LT5wb3N0KCdwaWxpaHN1cmF0JykpOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICc4JzoNCiAgICAgICAgICByZWRpcmVjdCgnc3VyYXQva2VsYWt1YW5fYmFpay8nLiR0aGlzLT5pbnB1dC0+cG9zdCgnY2FyaV9uaWsnKS4nLycuJHRoaXMtPmlucHV0LT5wb3N0KCdwaWxpaHN1cmF0JykpOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICc5JzoNCiAgICAgICAgICByZWRpcmVjdCgnc3VyYXQva2V0ZXJhbmdhbl9waW5kYWhfd25pLycuJHRoaXMtPmlucHV0LT5wb3N0KCdjYXJpX25paycpLicvJy4kdGhpcy0+aW5wdXQtPnBvc3QoJ3BpbGloc3VyYXQnKSk7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgY2FzZSAnMTAnOg0KICAgICAgICAgIHJlZGlyZWN0KCdzdXJhdC9mb3JtX2t0cC8nLiR0aGlzLT5pbnB1dC0+cG9zdCgnY2FyaV9uaWsnKS4nLycuJHRoaXMtPmlucHV0LT5wb3N0KCdwaWxpaHN1cmF0JykpOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgY2FzZSAnMTEnOg0KICAgICAgICAgIHJlZGlyZWN0KCdzdXJhdC9rYXJ0dV9rZWx1YXJnYS8nLiR0aGlzLT5pbnB1dC0+cG9zdCgnY2FyaV9uaWsnKS4nLycuJHRoaXMtPmlucHV0LT5wb3N0KCdwaWxpaHN1cmF0JykpOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgIA0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgIHJlZGlyZWN0KCdzdXJhdC9zdXJhdF9rZXRlcmFuZ2FuLycuJHRoaXMtPmlucHV0LT5wb3N0KCdjYXJpX25paycpLicvJy4kdGhpcy0+aW5wdXQtPnBvc3QoJ3BpbGloc3VyYXQnKSk7DQogICAgICAgICAgYnJlYWs7DQogICAgICB9DQogICB9DQoNCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1VSQVQgS0VURVJBTkdBTg0KDQogICBwdWJsaWMgZnVuY3Rpb24gc3VyYXRfa2V0ZXJhbmdhbigkbmlrLCRpZF9qZW5pcykNCiAgIHsNCiAgICAgIGlmKCR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpPT0nZGVzYScpDQogICAgICB7ICANCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfZW1wbG95ZWUnXSA9ICcnOw0KICAgICAgICAgICAgICAgICRkYXRhWydpbnRhbnNpJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfaW50YW5zaSddPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsncG9zaXNpJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyk7DQogICAgICAgICAgICAgICAgICRkYXRhWydpbnRhbnNpX25hbWUnXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaV9uYW1lJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ25hbWVfcG9zaXRpb24nXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnbmFtZV9wb3NpdGlvbicpOw0KICAgICAgICAgICAgICAgICRkYXRhWydwYWdlX3RpdGxlJ10gPSAnU3VyYXQgS2V0ZXJhbmdhbic7IA0KICAgICAgICAgICAgICAgICRkYXRhWydkYXRhX3BlbmR1ZHVrJ109ICR0aGlzLT5QZW5kdWR1a19tb2RlbC0+dGFtcGlsX2RhdGFfcGVuZHVkdWsoJ25paycsJG5payk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2Ryb3BfdHlwZV9waW9yaXRhcyddPSAkdGhpcy0+UGVuZHVkdWtfbW9kZWwtPmdldF9kYl93aGVyZV91bml2ZXJzYWwoJ3JlZl9ub19tYXNzYWdlJywnaWRfdHlwZScsJGlkX2plbmlzKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnZHJvcF90dGRfZGVzYSddID0gJHRoaXMtPlN1cmF0X21vZGVsLT5nZXRfcGVuYW5kYXRhbmdhbl9kZXNhKCR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpKTsNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICRkYXRhWydub19zdXJhdCddID0gJHRoaXMtPlN1cmF0X21vZGVsLT5ub19zdXJhdCgnc3J0X2tldGVyYW5nYW4nLCRpZF9qZW5pcywkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKSk7DQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkZGF0YVsna2FidXBhdGVuJ10gPSAnQkFUVSc7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2tlY2FtYXRhbiddID0gJ0JVTUlBSkknOw0KICAgICAgICAgICAgICAgICRkYXRhWydwaWxpaGFuJ109ICdhd2FsJzsNCiAgICAgICAgICAgICAgICAgJGRhdGFbJ25vX2JheWFuZ2FuJ10gPSAnJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfamVuaXMnXSA9ICRpZF9qZW5pczsNCiAgICAgICAgICRkYXRhWydwYWdlJ10gPSAnbWFzc2FnZS9zdXJhdF9rZXRlcmFuZ2FuJzsNCiAgICAgICAgJHRoaXMtPmxvYWQtPnZpZXcoJ2luZGV4JywgJGRhdGEpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgcmVkaXJlY3QoJ21haW4nKTsNCiAgICB9DQogICB9DQoNCg0KICAgcHVibGljIGZ1bmN0aW9uIHNpbXBhbl9zdXJhdF9rZXRlcmFuZ2FuKCkNCiAgIHsNCg0KICAgICAgaWYoJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk9PSdkZXNhJykNCiAgICAgIHsNCiAgICAgICAgJGRhdGEgPSBhcnJheSgNCiAgICAgICAgICAvLydub19zdXJhdCcgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpbmR1a19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0X2Rlc2EnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ3RnbF9zdXJhdCcpLA0KICAgICAgICAgICAnbm9fc3VyYXQnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaW5kdWtfc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdF9kZXNhJykuJHRoaXMtPmlucHV0LT5wb3N0KCd0Z2xfc3VyYXQnKSwNCiAgICAgICAgICAnbm9fc3VyYXRfYmF5YW5nYW4nID0+IHN0cl9yZXBsYWNlKCIvIiwiIiwkdGhpcy0+aW5wdXQtPnBvc3QoJ2luZHVrX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXRfZGVzYScpLiR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX3N1cmF0JykpLA0KICAgICAgICAgICdpZF90eXBlX21hc3NhZ2UnPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9qZW5pcycpLA0KICAgICAgICAgICdpZF9pbnRhbnNpX2Rlc2EnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaWRfaW50YW5zaScpLA0KICAgICAgICAgICdpZF9wZW5kdWR1aycgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9wZW5kdWR1aycpLA0KICAgICAgICAgICdpZF9wYW1vbmdfZGVzYV9jcmVhdGUnPT4gICR0aGlzLT51c2VyX2RldGFpbCgnaWQnKSwNCiAgICAgICAgICAnaWRfcGFtb25nX2Rlc2FfdHRkJyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R0ZF9kZXNhJyksDQogICAgICAgICAgJ3RnbF9jcmVhdGUnID0+IGRhdGUoJ1ktbS1kJyksDQogICAgICAgICAgJ21lbmVyYW5na2FuJyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ21lbmVyYW5na2FuJyksDQogICAgICAgICAgJ2RpZ3VuYWthbl91bnR1ayc9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2RpZ3VuYWthbicpLA0KICAgICAgICApOyANCg0KICAgICAgICAkdGhpcy0+ZGItPmluc2VydCgnc3J0X2tldGVyYW5nYW4nLCRkYXRhKTsNCg0KICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+IFRSVUUpKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgcmVkaXJlY3QoJ21haW4nKTsNCiAgICAgIH0NCg0KICAgfQ0KDQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3N1cmF0X2tldGVyYW5nYW4oJG5paywkbm9fYmF5YW5nYW4pDQogICB7DQogICAgICAgaWYoJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk9PSdkZXNhJykNCiAgICAgIHsgIA0KICAgICAgICAgICAgICAgICRkYXRhWydpZF9lbXBsb3llZSddID0gJyc7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2ludGFuc2knXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpOw0KICAgICAgICAgICAgICAgICRkYXRhWydpZF9pbnRhbnNpJ109ICR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpOw0KICAgICAgICAgICAgICAgICRkYXRhWydwb3Npc2knXSA9ICR0aGlzLT51c2VyX2RldGFpbCgncG9zaXRpb25faWQnKTsgDQogICAgICAgICAgICAgICAgICRkYXRhWydpbnRhbnNpX25hbWUnXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaV9uYW1lJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ25hbWVfcG9zaXRpb24nXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnbmFtZV9wb3NpdGlvbicpOw0KICAgICAgICAgICAgICAgICRkYXRhWydwYWdlX3RpdGxlJ10gPSAnU3VyYXQgS2V0ZXJhbmdhbic7IA0KICAgICAgICAgICAgICAgICAkZGF0YVsna2FidXBhdGVuJ10gPSAnQkFUVSc7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2tlY2FtYXRhbiddID0gJ0JVTUlBSkknOw0KICAgICAgICAgICAgICAgICAkZGF0YVsncGlsaWhhbiddPSAnaGFzaWwnOw0KICAgICAgICAgICAgICAgICRkYXRhWydkYXRhX3BlbmR1ZHVrJ109ICR0aGlzLT5QZW5kdWR1a19tb2RlbC0+dGFtcGlsX2RhdGFfcGVuZHVkdWsoJ25paycsJG5payk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ25vX2JheWFuZ2FuJ10gPSAkbm9fYmF5YW5nYW47DQogICAgICAgICAgICAgICAgJGRhdGFbJ2hhc2lsX3N1cmF0J10gPSAkdGhpcy0+U3VyYXRfbW9kZWwtPmdldF9tYXNzYWdlX3doZXJlX3VuaXZlcnNhbF9yb3coJ3NydF9rZXRlcmFuZ2FuJywnbm9fc3VyYXRfYmF5YW5nYW4nLCRub19iYXlhbmdhbik7DQogICAgICAgICAkZGF0YVsncGFnZSddID0gJ21hc3NhZ2Uvc3VyYXRfa2V0ZXJhbmdhbic7DQogICAgICAgICR0aGlzLT5sb2FkLT52aWV3KCdpbmRleCcsICRkYXRhKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgfQ0KICAgfQ0KDQoNCiAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1VSQVQgS0VISUxBTkdBTg0KDQoNCiAgcHVibGljIGZ1bmN0aW9uIGtlaGlsYW5nYW4oJG5paywkaWRfamVuaXMpDQogICB7DQogICAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnKQ0KICAgICAgeyAgDQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2VtcGxveWVlJ10gPSAnJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaW50YW5zaSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2ludGFuc2knXT0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ3Bvc2lzaSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdwb3NpdGlvbl9pZCcpOw0KICAgICAgICAgICAgICAgICAkZGF0YVsnaW50YW5zaV9uYW1lJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2lfbmFtZScpOw0KICAgICAgICAgICAgICAgICAkZGF0YVsnbmFtZV9wb3NpdGlvbiddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCduYW1lX3Bvc2l0aW9uJyk7IA0KICAgICAgICAgICAgICAgICRkYXRhWydwYWdlX3RpdGxlJ10gPSAnU3VyYXQgVGFuZGEgTGFwb3IgS2VoaWxhbmdhbic7IA0KICAgICAgICAgICAgICAgICRkYXRhWydkYXRhX3BlbmR1ZHVrJ109ICR0aGlzLT5QZW5kdWR1a19tb2RlbC0+dGFtcGlsX2RhdGFfcGVuZHVkdWsoJ25paycsJG5payk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2Ryb3BfdHlwZV9waW9yaXRhcyddPSAkdGhpcy0+UGVuZHVkdWtfbW9kZWwtPmdldF9kYl93aGVyZV91bml2ZXJzYWwoJ3JlZl9ub19tYXNzYWdlJywnaWRfdHlwZScsJGlkX2plbmlzKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnZHJvcF90dGRfZGVzYSddID0gJHRoaXMtPlN1cmF0X21vZGVsLT5nZXRfcGVuYW5kYXRhbmdhbl9kZXNhKCR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnbm9fc3VyYXQnXSA9ICR0aGlzLT5TdXJhdF9tb2RlbC0+bm9fc3VyYXQoJ3NydF9rZWhpbGFuZ2FuJywkaWRfamVuaXMsJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJykpOw0KICAgICAgICAgICAgICAgICRkYXRhWydpZF9qZW5pcyddID0gJGlkX2plbmlzOw0KICAgICAgICAgICAgICAgICAgICRkYXRhWydwaWxpaGFuJ109ICdhd2FsJzsNCiAgICAgICAgICAgICAgICAgICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICAgICAgICAgICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsnbm9fYmF5YW5nYW4nXSA9ICcnOw0KICAgICAgICAgJGRhdGFbJ3BhZ2UnXSA9ICdtYXNzYWdlL3N1cmF0X2tlaGlsYW5nYW4nOw0KICAgICAgICAkdGhpcy0+bG9hZC0+dmlldygnaW5kZXgnLCAkZGF0YSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICByZWRpcmVjdCgnbWFpbicpOw0KICAgIH0NCiAgIH0NCg0KDQogICBwdWJsaWMgZnVuY3Rpb24gc2ltcGFuX3N1cmF0X2tlaGlsYW5nYW4oKQ0KICAgew0KDQogICAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnKQ0KICAgICAgew0KDQogICAgICAgICAkZ2V0X2FraGlyID0gZXhwbG9kZSgiLSIsICR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX2tlaGlsYW5nYW4nKSk7DQogICAgICAgICAkdGdsX2tlaGlsYW5nYW4gPSAkZ2V0X2FraGlyWzJdLiItIi4kZ2V0X2FraGlyWzFdLiItIi4kZ2V0X2FraGlyWzBdOw0KDQogICAgICAgICRkYXRhID0gYXJyYXkoDQogICAgICAgICAgJ25vX3N1cmF0JyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2luZHVrX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXRfZGVzYScpLiR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX3N1cmF0JyksDQogICAgICAgICAnbm9fc3VyYXRfYmF5YW5nYW4nID0+IHN0cl9yZXBsYWNlKCIvIiwiIiwkdGhpcy0+aW5wdXQtPnBvc3QoJ2luZHVrX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXRfZGVzYScpLiR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX3N1cmF0JykpLA0KICAgICAgICAgICdpZF90eXBlX21hc3NhZ2UnPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9qZW5pcycpLA0KICAgICAgICAgICdpZF9pbnRhbnNpX2Rlc2EnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaWRfaW50YW5zaScpLA0KICAgICAgICAgICdpZF9wZW5kdWR1aycgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9wZW5kdWR1aycpLA0KICAgICAgICAgICdpZF9wYW1vbmdfZGVzYV9jcmVhdGUnPT4gICR0aGlzLT51c2VyX2RldGFpbCgnaWQnKSwNCiAgICAgICAgICAnaWRfcGFtb25nX2Rlc2FfdHRkJyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R0ZF9kZXNhJyksDQogICAgICAgICAgJ3RnbF9jcmVhdGUnID0+IGRhdGUoJ1ktbS1kJyksDQogICAgICAgICAgJ2phbV9jcmVhdGUnID0+IGRhdGUoJ0g6aScpLA0KICAgICAgICAgICd0Z2xfa2VoaWxhbmdhbicgPT4gJHRnbF9rZWhpbGFuZ2FuLA0KICAgICAgICAgICdqYW1fa2VoaWxhbmdhbicgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdqYW1fa2VoaWxhbmdhbicpLA0KICAgICAgICAgICd0ZW1wYXRfa2VqYWRpYW4nID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgndGVtcGF0X2tlamFkaWFuJyksDQogICAgICAgICAgJ2plbmlzX2tlamFkaWFuJz0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnamVuaXNfa2VqYWRpYW4nKSwNCiAgICAgICAgICAna2V0ZXJhbmdhbl9rZWphZGlhbic9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2tldGVyYW5nYW5fa2VqYWRpYW4nKSwNCiAgICAgICAgKTsgDQoNCiAgICAgICAgJHRoaXMtPmRiLT5pbnNlcnQoJ3NydF9rZWhpbGFuZ2FuJywkZGF0YSk7DQoNCiAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIiA9PiBUUlVFKSk7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgICB9DQoNCiAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc3VyYXRfa2VoaWxhbmdhbigkbmlrLCRub19iYXlhbmdhbikNCiAgIHsNCiAgICAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnKQ0KICAgICAgeyAgDQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2VtcGxveWVlJ10gPSAnJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaW50YW5zaSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2ludGFuc2knXT0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ3Bvc2lzaSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdwb3NpdGlvbl9pZCcpOyANCiAgICAgICAgICAgICAgICAgJGRhdGFbJ2ludGFuc2lfbmFtZSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpX25hbWUnKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnbmFtZV9wb3NpdGlvbiddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCduYW1lX3Bvc2l0aW9uJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ3BhZ2VfdGl0bGUnXSA9ICdTdXJhdCBUYW5kYSBMYXBvciBLZWhpbGFuZ2FuJzsgDQogICAgICAgICAgICAgICAgJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXT0gJHRoaXMtPlBlbmR1ZHVrX21vZGVsLT50YW1waWxfZGF0YV9wZW5kdWR1aygnbmlrJywkbmlrKTsNCiAgICAgICAgICAgICAgICAgJGRhdGFbJ3BpbGloYW4nXT0gJ2hhc2lsJzsNCiAgICAgICAgICAgICAgICAgICRkYXRhWydrYWJ1cGF0ZW4nXSA9ICdCQVRVJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsna2VjYW1hdGFuJ10gPSAnQlVNSUFKSSc7DQogICAgICAgICAgICAgICAgJGRhdGFbJ25vX2JheWFuZ2FuJ10gPSAkbm9fYmF5YW5nYW47DQogICAgICAgICAgICAgICAgJGRhdGFbJ2hhc2lsX3N1cmF0J10gPSAkdGhpcy0+U3VyYXRfbW9kZWwtPmdldF9tYXNzYWdlX3doZXJlX3VuaXZlcnNhbF9yb3coJ3NydF9rZXRlcmFuZ2FuJywnbm9fc3VyYXRfYmF5YW5nYW4nLCRub19iYXlhbmdhbik7DQogICAgICAgICAkZGF0YVsncGFnZSddID0gJ21hc3NhZ2Uvc3VyYXRfa2VoaWxhbmdhbic7DQogICAgICAgICR0aGlzLT5sb2FkLT52aWV3KCdpbmRleCcsICRkYXRhKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgfQ0KICAgfQ0KDQoNCiAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1VSQVQgS0VURVJBTkdBTiBVU0FIQQ0KDQoNCiAgcHVibGljIGZ1bmN0aW9uIGtldGVyYW5nYW5fdXNhaGEoJG5paywkaWRfamVuaXMpDQogICB7DQogICAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnKQ0KICAgICAgeyAgDQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2VtcGxveWVlJ10gPSAnJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaW50YW5zaSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2ludGFuc2knXT0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ3Bvc2lzaSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdwb3NpdGlvbl9pZCcpOyANCiAgICAgICAgICAgICAgICAgJGRhdGFbJ2ludGFuc2lfbmFtZSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpX25hbWUnKTsNCiAgICAgICAgICAgICAgICAgJGRhdGFbJ25hbWVfcG9zaXRpb24nXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnbmFtZV9wb3NpdGlvbicpOw0KICAgICAgICAgICAgICAgICRkYXRhWydwYWdlX3RpdGxlJ10gPSAnU3VyYXQgS2V0ZXJhbmdhbiBVc2FoYSc7IA0KICAgICAgICAgICAgICAgICRkYXRhWydkYXRhX3BlbmR1ZHVrJ109ICR0aGlzLT5QZW5kdWR1a19tb2RlbC0+dGFtcGlsX2RhdGFfcGVuZHVkdWsoJ25paycsJG5payk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2Ryb3BfdHlwZV9waW9yaXRhcyddPSAkdGhpcy0+UGVuZHVkdWtfbW9kZWwtPmdldF9kYl93aGVyZV91bml2ZXJzYWwoJ3JlZl9ub19tYXNzYWdlJywnaWRfdHlwZScsJGlkX2plbmlzKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnZHJvcF90dGRfZGVzYSddID0gJHRoaXMtPlN1cmF0X21vZGVsLT5nZXRfcGVuYW5kYXRhbmdhbl9kZXNhKCR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnbm9fc3VyYXQnXSA9ICR0aGlzLT5TdXJhdF9tb2RlbC0+bm9fc3VyYXQoJ3NydF9rZXRlcmFuZ2FuX3VzYWhhJywkaWRfamVuaXMsJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJykpOw0KICAgICAgICAgICAgICAgICRkYXRhWydpZF9qZW5pcyddID0gJGlkX2plbmlzOw0KICAgICAgICAgICAgICAgICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICAgICAgICAgICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsNCiAgICAgICAgICAgICAgICAgJGRhdGFbJ3BpbGloYW4nXT0gJ2F3YWwnOw0KICAgICAgICAgICAgICAgICRkYXRhWydub19iYXlhbmdhbiddID0gJyc7DQogICAgICAgICAkZGF0YVsncGFnZSddID0gJ21hc3NhZ2Uvc3VyYXRfa2V0ZXJhbmdhbl91c2FoYSc7DQogICAgICAgICR0aGlzLT5sb2FkLT52aWV3KCdpbmRleCcsICRkYXRhKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgfQ0KICAgfQ0KDQoNCg0KICAgcHVibGljIGZ1bmN0aW9uIHNpbXBhbl9zdXJhdF9rZXRlcmFuZ2FuX3VzYWhhKCkNCiAgIHsNCiAgICAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnKQ0KICAgICAgew0KICAgICAgICAgICRsYW1waXJhbiA9ICcnOw0KICAgICAgICAgIGlmKCR0aGlzLT5pbnB1dC0+cG9zdCgnbGFtcGlyYW4nKT09JzEnKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgICRsYW1waXJhbiA9ICcxJzsNCiAgICAgICAgICB9ZWxzZQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgICRsYW1waXJhbiA9ICcwJzsNCiAgICAgICAgICB9DQogICAgICAgICRkYXRhID0gYXJyYXkoDQogICAgICAgICAgJ25vX3N1cmF0JyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2luZHVrX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXRfZGVzYScpLiR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX3N1cmF0JyksDQogICAgICAgICAnbm9fc3VyYXRfYmF5YW5nYW4nID0+IHN0cl9yZXBsYWNlKCIvIiwiIiwkdGhpcy0+aW5wdXQtPnBvc3QoJ2luZHVrX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXRfZGVzYScpLiR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX3N1cmF0JykpLA0KICAgICAgICAgICdpZF90eXBlX21hc3NhZ2UnPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9qZW5pcycpLA0KICAgICAgICAgICdpZF9pbnRhbnNpX2Rlc2EnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaWRfaW50YW5zaScpLA0KICAgICAgICAgICdpZF9wZW5kdWR1aycgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9wZW5kdWR1aycpLA0KICAgICAgICAgICdpZF9wYW1vbmdfZGVzYV9jcmVhdGUnPT4gICR0aGlzLT51c2VyX2RldGFpbCgnaWQnKSwNCiAgICAgICAgICAnaWRfcGFtb25nX2Rlc2FfdHRkJyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R0ZF9kZXNhJyksDQogICAgICAgICAgJ3RnbF9jcmVhdGUnID0+IGRhdGUoJ1ktbS1kJyksDQogICAgICAgICAgJ2plbmlzX3VzYWhhJyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2plbmlzX3VzYWhhJyksDQogICAgICAgICAgJ25hbWFfdXNhaGEnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnbmFtYV91c2FoYScpLA0KICAgICAgICAgICdydF91c2FoYScgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdydF91c2FoYScpLA0KICAgICAgICAgICdyd191c2FoYScgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdyd191c2FoYScpLA0KICAgICAgICAgICdhbGFtYXRfdXNhaGEnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnYWxhbWF0X3VzYWhhJyksDQogICAgICAgICAgJ2Rlc2FfdXNhaGEnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnZGVzYV91c2FoYScpLA0KICAgICAgICAgICdrZWNhbWF0YW5fdXNhaGEnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgna2VjX3VzYWhhJyksDQogICAgICAgICAgJ2thYl91c2FoYScgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdrYWJfdXNhaGEnKSwNCiAgICAgICAgICAndGFuYWhfc2F3YWhfc2VuZGlyaScgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCd0YW5haF9zYXdhaF9zZW5kaXJpJyksDQogICAgICAgICAgJ3RhbmFoX3RlZ2FsX3NlbmRpcmknID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgndGFuYWhfdGVnYWxfc2VuZGlyaScpLA0KICAgICAgICAgICd0YW5haF9zYXdhaF9zZXdhJyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3RhbmFoX3Nhd2FoX3Nld2EnKSwNCiAgICAgICAgICAndGFuYWhfdGVnYWxfc2V3YScgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCd0YW5haF90ZWdhbF9zZXdhJyksDQogICAgICAgICAgJ2xhbXBpcmFuX3ZhbGlkYXNpJyA9PiAkbGFtcGlyYW4sDQogICAgICAgICAgJ2RpZ3VuYWthbl91bnR1ayc9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2RpZ3VuYWthbicpLA0KICAgICAgICAgIA0KICAgICAgICApOyANCg0KICAgICAgICAkdGhpcy0+ZGItPmluc2VydCgnc3J0X2tldGVyYW5nYW5fdXNhaGEnLCRkYXRhKTsNCg0KICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+IFRSVUUsImNoZWNrIj0+JHRoaXMtPmlucHV0LT5wb3N0KCdsYW1waXJhbicpKSk7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgICB9DQoNCiAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc3VyYXRfa2V0ZXJhbmdhbl91c2FoYSgkbmlrLCRub19iYXlhbmdhbikNCiAgIHsNCiAgICAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnKQ0KICAgICAgeyAgDQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2VtcGxveWVlJ10gPSAnJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaW50YW5zaSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2ludGFuc2knXT0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ3Bvc2lzaSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdwb3NpdGlvbl9pZCcpOyANCiAgICAgICAgICAgICAgICAgJGRhdGFbJ2ludGFuc2lfbmFtZSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpX25hbWUnKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnbmFtZV9wb3NpdGlvbiddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCduYW1lX3Bvc2l0aW9uJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ3BhZ2VfdGl0bGUnXSA9ICdTdXJhdCBLZXRlcmFuZ2FuIFVzYWhhJzsgDQogICAgICAgICAgICAgICAgJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXT0gJHRoaXMtPlBlbmR1ZHVrX21vZGVsLT50YW1waWxfZGF0YV9wZW5kdWR1aygnbmlrJywkbmlrKTsNCiAgICAgICAgICAgICAgICAgJGRhdGFbJ3BpbGloYW4nXT0gJ2hhc2lsJzsNCiAgICAgICAgICAgICAgICAgICAkZGF0YVsna2FidXBhdGVuJ10gPSAnQkFUVSc7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2tlY2FtYXRhbiddID0gJ0JVTUlBSkknOw0KICAgICAgICAgICAgICAgICRkYXRhWydub19iYXlhbmdhbiddID0gJG5vX2JheWFuZ2FuOw0KICAgICAgICAgICAgICAgICRkYXRhWydoYXNpbF9zdXJhdCddID0gJHRoaXMtPlN1cmF0X21vZGVsLT5nZXRfbWFzc2FnZV93aGVyZV91bml2ZXJzYWxfcm93KCdzcnRfa2V0ZXJhbmdhbicsJ25vX3N1cmF0X2JheWFuZ2FuJywkbm9fYmF5YW5nYW4pOw0KICAgICAgICAgJGRhdGFbJ3BhZ2UnXSA9ICdtYXNzYWdlL3N1cmF0X2tldGVyYW5nYW5fdXNhaGEnOw0KICAgICAgICAkdGhpcy0+bG9hZC0+dmlldygnaW5kZXgnLCAkZGF0YSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICByZWRpcmVjdCgnbWFpbicpOw0KICAgIH0NCiAgIH0NCg0KDQoNCiAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1VSQVQgRE9NSVNJTEkgVVNBSEENCg0KICAgcHVibGljIGZ1bmN0aW9uIGRvbWlzaWxpX3VzYWhhKCRuaWssJGlkX2plbmlzKQ0KICAgew0KICAgICAgaWYoJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk9PSdkZXNhJykNCiAgICAgIHsgIA0KICAgICAgICAgICAgICAgICRkYXRhWydpZF9lbXBsb3llZSddID0gJyc7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2ludGFuc2knXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpOw0KICAgICAgICAgICAgICAgICRkYXRhWydpZF9pbnRhbnNpJ109ICR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpOw0KICAgICAgICAgICAgICAgICRkYXRhWydwb3Npc2knXSA9ICR0aGlzLT51c2VyX2RldGFpbCgncG9zaXRpb25faWQnKTsgDQogICAgICAgICAgICAgICAgICRkYXRhWydpbnRhbnNpX25hbWUnXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaV9uYW1lJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ25hbWVfcG9zaXRpb24nXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnbmFtZV9wb3NpdGlvbicpOw0KICAgICAgICAgICAgICAgICRkYXRhWydwYWdlX3RpdGxlJ10gPSAnU3VyYXQgRG9taXNpbGkgVXNhaGEnOyANCiAgICAgICAgICAgICAgICAkZGF0YVsnZGF0YV9wZW5kdWR1ayddPSAkdGhpcy0+UGVuZHVkdWtfbW9kZWwtPnRhbXBpbF9kYXRhX3BlbmR1ZHVrKCduaWsnLCRuaWspOw0KICAgICAgICAgICAgICAgICRkYXRhWydkcm9wX3R5cGVfcGlvcml0YXMnXT0gJHRoaXMtPlBlbmR1ZHVrX21vZGVsLT5nZXRfZGJfd2hlcmVfdW5pdmVyc2FsKCdyZWZfbm9fbWFzc2FnZScsJ2lkX3R5cGUnLCRpZF9qZW5pcyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2Ryb3BfdHRkX2Rlc2EnXSA9ICR0aGlzLT5TdXJhdF9tb2RlbC0+Z2V0X3BlbmFuZGF0YW5nYW5fZGVzYSgkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKSk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ25vX3N1cmF0J10gPSAkdGhpcy0+U3VyYXRfbW9kZWwtPm5vX3N1cmF0KCdzcnRfZG9taXNpbGlfdXNhaGEnLCRpZF9qZW5pcywkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKSk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2plbmlzJ10gPSAkaWRfamVuaXM7DQogICAgICAgICAgICAgICAgICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICAgICAgICAgICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsNCiAgICAgICAgICAgICAgICAgICRkYXRhWydwaWxpaGFuJ109ICdhd2FsJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsnbm9fYmF5YW5nYW4nXSA9ICcnOw0KICAgICAgICAgJGRhdGFbJ3BhZ2UnXSA9ICdtYXNzYWdlL3N1cmF0X2RvbWlzaWxpX3VzYWhhJzsNCiAgICAgICAgJHRoaXMtPmxvYWQtPnZpZXcoJ2luZGV4JywgJGRhdGEpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgcmVkaXJlY3QoJ21haW4nKTsNCiAgICB9DQogICB9DQoNCiAgIHB1YmxpYyBmdW5jdGlvbiBzaW1wYW5fc3VyYXRfZG9taXNpbGlfdXNhaGEoKQ0KICAgew0KICAgICAgIGlmKCR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpPT0nZGVzYScpDQogICAgICB7DQogICAgICAgDQogICAgICAgICRkYXRhID0gYXJyYXkoDQogICAgICAgICAgJ25vX3N1cmF0JyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2luZHVrX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXRfZGVzYScpLiR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX3N1cmF0JyksDQogICAgICAgICAnbm9fc3VyYXRfYmF5YW5nYW4nID0+IHN0cl9yZXBsYWNlKCIvIiwiIiwkdGhpcy0+aW5wdXQtPnBvc3QoJ2luZHVrX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXRfZGVzYScpLiR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX3N1cmF0JykpLA0KICAgICAgICAgICdpZF90eXBlX21hc3NhZ2UnPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9qZW5pcycpLA0KICAgICAgICAgICdpZF9pbnRhbnNpX2Rlc2EnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaWRfaW50YW5zaScpLA0KICAgICAgICAgICdpZF9wZW5kdWR1aycgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9wZW5kdWR1aycpLA0KICAgICAgICAgICdpZF9wYW1vbmdfZGVzYV9jcmVhdGUnPT4gICR0aGlzLT51c2VyX2RldGFpbCgnaWQnKSwNCiAgICAgICAgICAnaWRfcGFtb25nX2Rlc2FfdHRkJyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R0ZF9kZXNhJyksDQogICAgICAgICAgJ3RnbF9jcmVhdGUnID0+IGRhdGUoJ1ktbS1kJyksDQogICAgICAgICAgJ25hbWFfdXNhaGEnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnbmFtYV91c2FoYScpLA0KICAgICAgICAgICdydF91c2FoYScgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdydF91c2FoYScpLA0KICAgICAgICAgICdyd191c2FoYScgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdyd191c2FoYScpLA0KICAgICAgICAgICdhbGFtYXRfdXNhaGEnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnYWxhbWF0X3VzYWhhJyksDQogICAgICAgICAgJ2Rlc2FfdXNhaGEnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnZGVzYV91c2FoYScpLA0KICAgICAgICAgICdrZWNhbWF0YW5fdXNhaGEnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgna2VjX3VzYWhhJyksDQogICAgICAgICAgJ2thYl91c2FoYScgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdrYWJfdXNhaGEnKSwNCiAgICAgICAgICAnZGlndW5ha2FuX3VudHVrJz0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnZGlndW5ha2FuJyksDQogICAgICAgICAgDQogICAgICAgICk7IA0KDQogICAgICAgICR0aGlzLT5kYi0+aW5zZXJ0KCdzcnRfZG9taXNpbGlfdXNhaGEnLCRkYXRhKTsNCg0KICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+IFRSVUUsImNoZWNrIj0+JHRoaXMtPmlucHV0LT5wb3N0KCdsYW1waXJhbicpKSk7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgICB9DQoNCiAgIH0NCg0KDQogICAgcHVibGljIGZ1bmN0aW9uIGdldF9zdXJhdF9kb21pc2lsaV91c2FoYSgkbmlrLCRub19iYXlhbmdhbikNCiAgIHsNCiAgICAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnKQ0KICAgICAgeyAgDQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2VtcGxveWVlJ10gPSAnJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaW50YW5zaSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2ludGFuc2knXT0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ3Bvc2lzaSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdwb3NpdGlvbl9pZCcpOyANCiAgICAgICAgICAgICAgICAgJGRhdGFbJ2ludGFuc2lfbmFtZSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpX25hbWUnKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnbmFtZV9wb3NpdGlvbiddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCduYW1lX3Bvc2l0aW9uJyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ3BhZ2VfdGl0bGUnXSA9ICdTdXJhdCBEb21pc2lsaSBVc2FoYSc7IA0KICAgICAgICAgICAgICAgICRkYXRhWydkYXRhX3BlbmR1ZHVrJ109ICR0aGlzLT5QZW5kdWR1a19tb2RlbC0+dGFtcGlsX2RhdGFfcGVuZHVkdWsoJ25paycsJG5payk7DQogICAgICAgICAgICAgICAgICRkYXRhWydwaWxpaGFuJ109ICdoYXNpbCc7DQogICAgICAgICAgICAgICAgICAgICRkYXRhWydrYWJ1cGF0ZW4nXSA9ICdCQVRVJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsna2VjYW1hdGFuJ10gPSAnQlVNSUFKSSc7DQogICAgICAgICAgICAgICAgJGRhdGFbJ25vX2JheWFuZ2FuJ10gPSAkbm9fYmF5YW5nYW47DQogICAgICAgICAgICAgICAgJGRhdGFbJ2hhc2lsX3N1cmF0J10gPSAkdGhpcy0+U3VyYXRfbW9kZWwtPmdldF9tYXNzYWdlX3doZXJlX3VuaXZlcnNhbF9yb3coJ3NydF9rZXRlcmFuZ2FuJywnbm9fc3VyYXRfYmF5YW5nYW4nLCRub19iYXlhbmdhbik7DQogICAgICAgICAkZGF0YVsncGFnZSddID0gJ21hc3NhZ2Uvc3VyYXRfZG9taXNpbGlfdXNhaGEnOw0KICAgICAgICAkdGhpcy0+bG9hZC0+dmlldygnaW5kZXgnLCAkZGF0YSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICByZWRpcmVjdCgnbWFpbicpOw0KICAgIH0NCiAgIH0NCg0KDQoNCg0KICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVVJBVCBET01JU0lMSSANCg0KICBwdWJsaWMgZnVuY3Rpb24ga2V0ZXJhbmdhbl9kb21pc2lsaSgkbmlrLCRpZF9qZW5pcykNCiAgIHsNCiAgICAgIGlmKCR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpPT0nZGVzYScpDQogICAgICB7ICANCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfZW1wbG95ZWUnXSA9ICcnOw0KICAgICAgICAgICAgICAgICRkYXRhWydpbnRhbnNpJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfaW50YW5zaSddPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsncG9zaXNpJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyk7IA0KICAgICAgICAgICAgICAgICAkZGF0YVsnaW50YW5zaV9uYW1lJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2lfbmFtZScpOw0KICAgICAgICAgICAgICAgICRkYXRhWyduYW1lX3Bvc2l0aW9uJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ25hbWVfcG9zaXRpb24nKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsncGFnZV90aXRsZSddID0gJ1N1cmF0IEtldGVyYW5nYW4gRG9taXNpbGknOyANCiAgICAgICAgICAgICAgICAkZGF0YVsnZGF0YV9wZW5kdWR1ayddPSAkdGhpcy0+UGVuZHVkdWtfbW9kZWwtPnRhbXBpbF9kYXRhX3BlbmR1ZHVrKCduaWsnLCRuaWspOw0KICAgICAgICAgICAgICAgICRkYXRhWydkcm9wX3R5cGVfcGlvcml0YXMnXT0gJHRoaXMtPlBlbmR1ZHVrX21vZGVsLT5nZXRfZGJfd2hlcmVfdW5pdmVyc2FsKCdyZWZfbm9fbWFzc2FnZScsJ2lkX3R5cGUnLCRpZF9qZW5pcyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2Ryb3BfdHRkX2Rlc2EnXSA9ICR0aGlzLT5TdXJhdF9tb2RlbC0+Z2V0X3BlbmFuZGF0YW5nYW5fZGVzYSgkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKSk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ25vX3N1cmF0J10gPSAkdGhpcy0+U3VyYXRfbW9kZWwtPm5vX3N1cmF0KCdzcnRfa2V0ZXJhbmdhbl9kb21pc2lsaScsJGlkX2plbmlzLCR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfamVuaXMnXSA9ICRpZF9qZW5pczsNCiAgICAgICAgICAgICAgICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICAgICAgICAgICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsNCiAgICAgICAgICAgICAgICAgJGRhdGFbJ3BpbGloYW4nXT0gJ2F3YWwnOw0KICAgICAgICAgICAgICAgICRkYXRhWydub19iYXlhbmdhbiddID0gJyc7DQogICAgICAgICAkZGF0YVsncGFnZSddID0gJ21hc3NhZ2Uvc3VyYXRfZG9taXNpbGknOw0KICAgICAgICAkdGhpcy0+bG9hZC0+dmlldygnaW5kZXgnLCAkZGF0YSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICByZWRpcmVjdCgnbWFpbicpOw0KICAgIH0gDQogICB9DQoNCg0KICAgcHVibGljIGZ1bmN0aW9uIHNpbXBhbl9zdXJhdF9rZXRlcmFuZ2FuX2RvbWlzaWxpKCkNCiAgIHsNCg0KICAgICAgaWYoJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk9PSdkZXNhJykNCiAgICAgIHsNCiAgICAgICAgJGRhdGEgPSBhcnJheSgNCiAgICAgICAgICAnbm9fc3VyYXQnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaW5kdWtfc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdF9kZXNhJykuJHRoaXMtPmlucHV0LT5wb3N0KCd0Z2xfc3VyYXQnKSwNCiAgICAgICAgICdub19zdXJhdF9iYXlhbmdhbicgPT4gc3RyX3JlcGxhY2UoIi8iLCIiLCR0aGlzLT5pbnB1dC0+cG9zdCgnaW5kdWtfc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdF9kZXNhJykuJHRoaXMtPmlucHV0LT5wb3N0KCd0Z2xfc3VyYXQnKSksDQogICAgICAgICAgJ2lkX3R5cGVfbWFzc2FnZSc9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2lkX2plbmlzJyksDQogICAgICAgICAgJ2lkX2ludGFuc2lfZGVzYScgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9pbnRhbnNpJyksDQogICAgICAgICAgJ2lkX3BlbmR1ZHVrJyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2lkX3BlbmR1ZHVrJyksDQogICAgICAgICAgJ2lkX3BhbW9uZ19kZXNhX2NyZWF0ZSc9PiAgJHRoaXMtPnVzZXJfZGV0YWlsKCdpZCcpLA0KICAgICAgICAgICdpZF9wYW1vbmdfZGVzYV90dGQnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgndHRkX2Rlc2EnKSwNCiAgICAgICAgICAndGdsX2NyZWF0ZScgPT4gZGF0ZSgnWS1tLWQnKSwNCiAgICAgICAgICAnYWxhbWF0X2RvbWlzaWxpJyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2FsYW1hdF9kb21pc2lsaScpLA0KICAgICAgICAgICdkaWd1bmFrYW5fdW50dWsnPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdkaWd1bmFrYW4nKSwNCiAgICAgICAgKTsgDQoNCiAgICAgICAgJHRoaXMtPmRiLT5pbnNlcnQoJ3NydF9rZXRlcmFuZ2FuX2RvbWlzaWxpJywkZGF0YSk7DQoNCiAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIiA9PiBUUlVFKSk7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgICB9DQoNCiAgIH0NCg0KDQoNCiAgICAgcHVibGljIGZ1bmN0aW9uIGdldF9zdXJhdF9rZXRlcmFuZ2FuX2RvbWlzaWxpKCRuaWssJG5vX2JheWFuZ2FuKQ0KICAgew0KICAgICAgIGlmKCR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpPT0nZGVzYScpDQogICAgICB7ICANCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfZW1wbG95ZWUnXSA9ICcnOw0KICAgICAgICAgICAgICAgICRkYXRhWydpbnRhbnNpJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfaW50YW5zaSddPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsncG9zaXNpJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyk7IA0KICAgICAgICAgICAgICAgICAkZGF0YVsnaW50YW5zaV9uYW1lJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2lfbmFtZScpOw0KICAgICAgICAgICAgICAgICRkYXRhWyduYW1lX3Bvc2l0aW9uJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ25hbWVfcG9zaXRpb24nKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsncGFnZV90aXRsZSddID0gJ1N1cmF0IEtldGVyYW5nYW4gRG9taXNpbGknOyANCiAgICAgICAgICAgICAgICAkZGF0YVsnZGF0YV9wZW5kdWR1ayddPSAkdGhpcy0+UGVuZHVkdWtfbW9kZWwtPnRhbXBpbF9kYXRhX3BlbmR1ZHVrKCduaWsnLCRuaWspOw0KICAgICAgICAgICAgICAgICAkZGF0YVsncGlsaWhhbiddPSAnaGFzaWwnOw0KICAgICAgICAgICAgICAgICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICAgICAgICAgICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsnbm9fYmF5YW5nYW4nXSA9ICRub19iYXlhbmdhbjsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaGFzaWxfc3VyYXQnXSA9ICR0aGlzLT5TdXJhdF9tb2RlbC0+Z2V0X21hc3NhZ2Vfd2hlcmVfdW5pdmVyc2FsX3Jvdygnc3J0X2tldGVyYW5nYW4nLCdub19zdXJhdF9iYXlhbmdhbicsJG5vX2JheWFuZ2FuKTsNCiAgICAgICAgICRkYXRhWydwYWdlJ10gPSAnbWFzc2FnZS9zdXJhdF9kb21pc2lsaSc7DQogICAgICAgICR0aGlzLT5sb2FkLT52aWV3KCdpbmRleCcsICRkYXRhKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgfQ0KICAgfQ0KDQoNCiAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1VSQVQgS0VURVJBTkdBTiBLVVJBTkcgTUFNUFUgDQoNCiAgICBwdWJsaWMgZnVuY3Rpb24ga2V0ZXJhbmdhbl9rdXJhbmdfbWFtcHUoJG5paywkaWRfamVuaXMpDQogICB7DQogICAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnfHwkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2tlYycpDQogICAgICB7ICANCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfZW1wbG95ZWUnXSA9ICcnOw0KICAgICAgICAgICAgICAgICRkYXRhWydpbnRhbnNpJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfaW50YW5zaSddPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsncG9zaXNpJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyk7IA0KICAgICAgICAgICAgICAgICAkZGF0YVsnaW50YW5zaV9uYW1lJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2lfbmFtZScpOw0KICAgICAgICAgICAgICAgICRkYXRhWyduYW1lX3Bvc2l0aW9uJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ25hbWVfcG9zaXRpb24nKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsncGFnZV90aXRsZSddID0gJ1N1cmF0IEtldGVyYW5nYW4gVGlkYWsgTWFtcHUnOyANCiAgICAgICAgICAgICAgICAkZGF0YVsncGlsaWhhbiddPSAnYXdhbCc7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICAgICAgICAgICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsNCiAgICAgICAgICAgICAgICAkZGF0YVsnZGF0YV9wZW5kdWR1ayddPSAkdGhpcy0+UGVuZHVkdWtfbW9kZWwtPnRhbXBpbF9kYXRhX3BlbmR1ZHVrKCduaWsnLCRuaWspOw0KICAgICAgICAgICAgICAgICRkYXRhWydkcm9wX3R5cGVfcGlvcml0YXMnXT0gJHRoaXMtPlBlbmR1ZHVrX21vZGVsLT5nZXRfZGJfd2hlcmVfdW5pdmVyc2FsKCdyZWZfbm9fbWFzc2FnZScsJ2lkX3R5cGUnLCRpZF9qZW5pcyk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2Ryb3BfdHRkX2Rlc2EnXSA9ICR0aGlzLT5TdXJhdF9tb2RlbC0+Z2V0X3BlbmFuZGF0YW5nYW5fZGVzYSgkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKSk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ25vX3N1cmF0J10gPSAkdGhpcy0+U3VyYXRfbW9kZWwtPm5vX3N1cmF0KCdzcnRfa2V0ZXJhbmdhbl9taXNraW4nLCRpZF9qZW5pcywkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKSk7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2lkX2plbmlzJ10gPSAkaWRfamVuaXM7DQogICAgICAgICAkZGF0YVsncGFnZSddID0gJ21hc3NhZ2Uvc3VyYXRfa2V0ZXJhbmdhbl9rdXJhbmdfbWFtcHUnOw0KICAgICAgICAkdGhpcy0+bG9hZC0+dmlldygnaW5kZXgnLCAkZGF0YSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICByZWRpcmVjdCgnbWFpbicpOw0KICAgIH0NCiAgIH0NCg0KICAgcHVibGljIGZ1bmN0aW9uIHNpbXBhbl9zdXJhdF9rZXRlcmFuZ2FuX21pc2tpbigpDQogICB7DQoNCiAgICAgIGlmKCR0aGlzLT5pbnB1dC0+cG9zdCgndGluZ2thdGFuX3N1cmF0Jyk9PSdkZXNhJykNCiAgICAgIHsNCiAgICAgICAgICAgJHN0YXR1c192ZXJpZiA9ICczJzsNCiAgICAgIH1lbHNlDQogICAgICB7DQogICAgICAgICAgICRzdGF0dXNfdmVyaWYgPSAnMCc7DQogICAgICB9DQoNCiAgICAgIGlmKCR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpPT0nZGVzYScpDQogICAgICB7DQogICAgICAgICRkYXRhID0gYXJyYXkoDQogICAgICAgICAgJ25vX3N1cmF0JyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2luZHVrX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXRfZGVzYScpLiR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX3N1cmF0JyksDQogICAgICAgICAnbm9fc3VyYXRfYmF5YW5nYW4nID0+IHN0cl9yZXBsYWNlKCIvIiwiIiwkdGhpcy0+aW5wdXQtPnBvc3QoJ2luZHVrX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXRfZGVzYScpLiR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX3N1cmF0JykpLA0KICAgICAgICAgICdpZF90eXBlX21hc3NhZ2UnPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9qZW5pcycpLA0KICAgICAgICAgICdpZF9pbnRhbnNpX2Rlc2EnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaWRfaW50YW5zaScpLA0KICAgICAgICAgICdpZF9wZW5kdWR1aycgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9wZW5kdWR1aycpLA0KICAgICAgICAgICdpZF9wYW1vbmdfZGVzYV9jcmVhdGUnPT4gICR0aGlzLT51c2VyX2RldGFpbCgnaWQnKSwNCiAgICAgICAgICAnaWRfcGFtb25nX2Rlc2FfdHRkJyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R0ZF9kZXNhJyksDQogICAgICAgICAgJ3RnbF9jcmVhdGUnID0+IGRhdGUoJ1ktbS1kJyksDQogICAgICAgICAgJ3N0YXR1c192ZXJpZicgPT4gJHN0YXR1c192ZXJpZiwNCiAgICAgICAgICAndGluZ2thdGFuJyA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3RpbmdrYXRhbl9zdXJhdCcpLA0KICAgICAgICAgICdkaWd1bmFrYW5fdW50dWsnPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdkaWd1bmFrYW4nKSwNCiAgICAgICAgKTsgDQoNCiAgICAgICAgJHRoaXMtPmRiLT5pbnNlcnQoJ3NydF9rZXRlcmFuZ2FuX21pc2tpbicsJGRhdGEpOw0KDQogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyIgPT4gVFJVRSkpOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICByZWRpcmVjdCgnbWFpbicpOw0KICAgICAgfQ0KDQogICB9DQoNCg0KICAgcHVibGljIGZ1bmN0aW9uIGdldF9zdXJhdF90aWRha19tYW1wdSgkbmlrLCRub19iYXlhbmdhbikNCiAgIHsNCiAgICAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnfHwkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2tlYycpDQogICAgICB7ICANCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfZW1wbG95ZWUnXSA9ICcnOw0KICAgICAgICAgICAgICAgICRkYXRhWydpbnRhbnNpJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaWRfaW50YW5zaSddPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsncG9zaXNpJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyk7IA0KICAgICAgICAgICAgICAgICAkZGF0YVsnaW50YW5zaV9uYW1lJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2lfbmFtZScpOw0KICAgICAgICAgICAgICAgICRkYXRhWyduYW1lX3Bvc2l0aW9uJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ25hbWVfcG9zaXRpb24nKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsncGFnZV90aXRsZSddID0gJ1N1cmF0IEtldGVyYW5nYW4gVGlkYWsgTWFtcHUnOyANCiAgICAgICAgICAgICAgICAkZGF0YVsna2FidXBhdGVuJ10gPSAnQkFUVSc7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2tlY2FtYXRhbiddID0gJ0JVTUlBSkknOw0KICAgICAgICAgICAgICAgICAkZGF0YVsncGlsaWhhbiddPSAnaGFzaWwnOw0KICAgICAgICAgICAgICAgICRkYXRhWydkYXRhX3BlbmR1ZHVrJ109ICR0aGlzLT5QZW5kdWR1a19tb2RlbC0+dGFtcGlsX2RhdGFfcGVuZHVkdWsoJ25paycsJG5payk7DQogICAgICAgICAgICAgICAgICRkYXRhWydkcm9wX3R0ZF9rZWMnXSAgICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfcGVuYW5kYXRhbmdhbl9rZWMoKTsNCiAgICAgICAgICAgICAgICAkZGF0YVsnaGFzaWxfc3VyYXQnXSA9ICR0aGlzLT5TdXJhdF9tb2RlbC0+Z2V0X21hc3NhZ2Vfd2hlcmVfdW5pdmVyc2FsX3Jvdygnc3J0X2tldGVyYW5nYW5fbWlza2luJywnbm9fc3VyYXRfYmF5YW5nYW4nLCRub19iYXlhbmdhbik7DQogICAgICAgICAgICAgICAgJGRhdGFbJ2RhdGFfdGFtYmFoYW4nXSA9ICR0aGlzLT5TdXJhdF9tb2RlbC0+Z2V0X21hc3NhZ2Vfd2hlcmVfdW5pdmVyc2FsX3Jvdygnc3J0X2tldGVyYW5nYW5fbWlza2luJywnbm9fc3VyYXRfYmF5YW5nYW4nLCRub19iYXlhbmdhbik7DQogICAgICAgICAkZGF0YVsncGFnZSddID0gJ21hc3NhZ2Uvc3VyYXRfa2V0ZXJhbmdhbl9rdXJhbmdfbWFtcHUnOw0KICAgICAgDQoNCiAgICAgIGlmKCRkYXRhWydkYXRhX3BlbmR1ZHVrJ10tPmlkID09ICRkYXRhWydoYXNpbF9zdXJhdCddLT5pZF9wZW5kdWR1ayl7DQogICAgICAgICR0aGlzLT5sb2FkLT52aWV3KCdpbmRleCcsJGRhdGEpOw0KICAgICAgfWVsc2V7DQogICAgICAgIHJldHVybiByZWRpcmVjdCgnbWFpbicpOw0KICAgICAgfQ0KDQoNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgfQ0KICAgfQ0KDQogIHB1YmxpYyBmdW5jdGlvbiB2ZXJpZl9zdXJhdF90aWRha19tYW1wdSgpew0KICAgICRuaWsgICAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ25paycpOw0KICAgICRub3N1cmF0ICA9ICR0aGlzLT5pbnB1dC0+cG9zdCgnbm9zdXJhdCcpOw0KICAgICRpZHR0ZCAgICA9ICR0aGlzLT5pbnB1dC0+cG9zdCgndHRkX2tlYycpOw0KICAgICRpZHZlcmlmICA9ICcyJzsNCiAgICAkdXBkYXRlICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT52ZXJpZnkoJ3NydF9rZXRlcmFuZ2FuX21pc2tpbicsJG5vc3VyYXQsJGlkdHRkLCRpZHZlcmlmKTsNCiAgICBpZigkdXBkYXRlKXsNCiAgICAgJHRoaXMtPnNlc3Npb24tPnNldF9mbGFzaGRhdGEoJ3N1Y2Nlc3MnLCRuaWsuJyBCZXJoYXNpbCBkaSBhcHByb3YnKTsNCiAgICAgIHJldHVybiByZWRpcmVjdCgnL3N1cmF0L2dldF9zdXJhdF90aWRha19tYW1wdS8nLiRuaWsuJy8nLiRub3N1cmF0KTsNCiAgICB9ZWxzZXsNCiAgICAgICAgJHRoaXMtPnNlc3Npb24tPnNldF9mbGFzaGRhdGEoJ2Vycm9yJywkbmlrLicgR2FnYWwgZGkgYXBwcm92Jyk7DQogICAgICByZXR1cm4gcmVkaXJlY3QoJy9zdXJhdC9nZXRfc3VyYXRfdGlkYWtfbWFtcHUvJy4kbmlrLicvJy4kbm9zdXJhdCk7DQogICAgfQ0KICB9DQoNCg0KDQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQoNCnB1YmxpYyBmdW5jdGlvbiBnZXRfbm9fbWFzc2FnZSgkaWQpew0KICAgICRkYXRhID0gJHRoaXMtPmRiLT5zZWxlY3QoJyonKS0+ZnJvbSgncmVmX25vX21hc3NhZ2UnKS0+d2hlcmUoYXJyYXkoJ2lkJyA9PiAkaWQpKS0+Z2V0KCktPnJvdygpOw0KICAgIGVjaG8ganNvbl9lbmNvZGUoJGRhdGEpOw0KICB9DQoNCiAgLyoNCiAgKiBGdW5nc2kgdW50dWsgbWVuZyBnZW5lcmF0ZSBzdXJhdCBpemluIGtlcmFtYWlhbiANCiAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIGl6aW5fa2VyYW1haWFuKCRuaWssJGplbmlzKXsNCiAgICAgaWYoJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk9PSdkZXNhJ3x8JHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk9PSdrZWMnKQ0KICAgICAgeyAgDQogICAgICAkZGF0YVsnZHJvcF90eXBlJ10gICAgICA9ICR0aGlzLT5NYXN0ZXJfbW9kZWwtPmdldF9kYigncmVmX3R5cGVfbWFzc2FnZScpOw0KICAgICAgJGRhdGFbJ2Ryb3BfdHlwZV9waW9yaXRhcyddID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X25vX21hc3NhZ2UoJGplbmlzKTsNCiAgICAgICRkYXRhWydpZF9qZW5pcyddICAgICAgID0gJGplbmlzOw0KICAgICAgJGRhdGFbJ3BhZ2VfdGl0bGUnXSAgICAgPSAnU3VyYXQgSXppbiBLZXJhbWFpYW4nOyANCiAgICAgICRkYXRhWydrYWJ1cGF0ZW4nXSA9ICdCQVRVJzsNCiAgICAgICAkZGF0YVsna2VjYW1hdGFuJ10gPSAnQlVNSUFKSSc7ICAgIA0KICAgICAgJGRhdGFbJ2lkX2VtcGxveWVlJ10gICAgPSAnJzsNCiAgICAgICRkYXRhWydwb3Npc2knXSAgICAgICA9ICR0aGlzLT51c2VyX2RldGFpbCgncG9zaXRpb25faWQnKTsgDQogICAgICAkZGF0YVsnZGF0YV9wZW5kdWR1ayddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+ZGF0YV9wZW5kdWR1aygkbmlrKTsNCiAgICAgICRkYXRhWydpbnRhbnNpJ10gICAgICA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpOw0KICAgICAgJGRhdGFbJ2lkX2ludGFuc2knXSAgICAgPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKTsNCiAgICAgICRkYXRhWydpbnRhbnNpX25hbWUnXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaV9uYW1lJyk7DQogICAgICAgICAgJGRhdGFbJ25hbWVfcG9zaXRpb24nXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnbmFtZV9wb3NpdGlvbicpOw0KICAgICAgJGRhdGFbJ2Ryb3BfdHRkX2Rlc2EnXSAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF9wZW5hbmRhdGFuZ2FuX2Rlc2EoJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJykpOw0KICAgICAgJGRhdGFbJ25vX3N1cmF0J10gICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+bm9fc3VyYXQoJ3NydF9pemluX2tlcmFtYWlhbicsJGplbmlzLCR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpKTsNCiAgICAgICRkYXRhWydwYWdlJ10gICAgICAgICA9ICdzdXJhdC9zdXJhdF9pemluX2tlcmFtYWlhbic7DQogICAgICAkdGhpcy0+bG9hZC0+dmlldygnaW5kZXgnLCRkYXRhKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgcmVkaXJlY3QoJ21haW4nKTsNCiAgICAgIH0NCg0KICB9DQoNCiAgcHVibGljIGZ1bmN0aW9uIGRvX2l6aW5fa2VyYW1haWFuKCl7DQogICAgJG5vc3VyYXQgPSBzdHJfcmVwbGFjZSgiLyIsIiIsJHRoaXMtPmlucHV0LT5wb3N0KCdpbmR1a19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0X2Rlc2EnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ3RnbF9zdXJhdCcpKTsNCiAgICAkZGF0YSA9IFsNCiAgICAgICdub19zdXJhdCcgICAgICAgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaW5kdWtfc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdF9kZXNhJykuJHRoaXMtPmlucHV0LT5wb3N0KCd0Z2xfc3VyYXQnKSwNCiAgICAgICdub19zdXJhdF9iYXlhbmdhbicgICA9PiAkbm9zdXJhdCwNCiAgICAgICdpZF9wYW1vbmdfZGVzYV9jcmVhdGUnID0+ICAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkJyksDQogICAgICAnaWRfcGFtb25nX2Rlc2FfdHRkJyAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCd0dGRfZGVzYScpLA0KICAgICAgJ2lkX3R5cGVfbWFzc2FnZScgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2lkX2plbmlzJyksDQogICAgICAnaWRfcGVuZHVkdWsnICAgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2lkX3BlbmR1ZHVrJyksDQogICAgICAnaWRfaW50YW5zaV9kZXNhJyAgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaWRfaW50YW5zaScpLA0KICAgICAgJ3RnbF9jcmVhdGUnICAgICAgPT4gZGF0ZSgnWS1tLWQnKSwNCiAgICAgICdiX2tlcmFtYWlhbicgICAgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnYl9rZXJhbWFpYW4nKSwNCiAgICAgICdtX2tlcmFtYWlhbicgICAgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnbV9rZXJhbWFpYW4nKSwNCiAgICAgICd0Z2xfcGVsYWtzYW5hYW4nICAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCd0Z2xfcGVsYWtzYW5hYW4nKSwNCiAgICAgICdyYW5na2EnICAgICAgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3JhbmdrYScpLA0KICAgICAgJ3VuZGFuZ2FuJyAgICAgICAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCd1bmRhbmdhbicpLA0KICAgICAgJ3N0YXR1c192ZXJpZicgICAgICA9PiAnMCcsDQogICAgICAnc3RhdHVzJyAgICAgICAgPT4gJzEnLA0KICAgIF07DQoNCiAgICAkc3RvcmUgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5hZGRfaXppbl9rZXJhbWFpYW4oJGRhdGEpOw0KICAgIGlmKCRzdG9yZSl7DQogICAgICByZXR1cm4gcmVkaXJlY3QoJy9zdXJhdC9nZXRfaXppbl9rZXJhbWFpYW4vJy4kdGhpcy0+aW5wdXQtPnBvc3QoJ2RhdGFfbmlrJykuJy8nLiRub3N1cmF0KTsNCiAgICB9ZWxzZXsNCiAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydzdGF0dXMnID0+ICdpbnRlcm5hbCBzZXJ2ZXIgZXJyb3InXSw1MDApOw0KICAgIH0NCiAgfQ0KDQogIHB1YmxpYyBmdW5jdGlvbiBnZXRfaXppbl9rZXJhbWFpYW4oJG5paywkbm9zdXJhdCl7DQogICAgIGlmKCR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpPT0nZGVzYSd8fCR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpPT0na2VjJykNCiAgICAgIHsgIA0KICAgICAgICAkZGF0YVsnZHJvcF90eXBlJ10gICAgICA9ICR0aGlzLT5NYXN0ZXJfbW9kZWwtPmdldF9kYigncmVmX3R5cGVfbWFzc2FnZScpOw0KICAgICAgICAkZGF0YVsncGFnZV90aXRsZSddICAgICA9ICdTdXJhdCBJemluIEtlcmFtYWlhbic7DQogICAgICAgICRkYXRhWydrYWJ1cGF0ZW4nXSA9ICdCQVRVJzsNCiAgICAgICAgJGRhdGFbJ2tlY2FtYXRhbiddID0gJ0JVTUlBSkknOyAgIA0KICAgICAgICAkZGF0YVsnaWRfZW1wbG95ZWUnXSAgICA9ICcnOw0KICAgICAgICAkZGF0YVsncG9zaXNpJ10gICAgICAgPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyk7IA0KICAgICAgICAkZGF0YVsnZGF0YV9wZW5kdWR1ayddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+ZGF0YV9wZW5kdWR1aygkbmlrKTsNCiAgICAgICAgJGRhdGFbJ2ludGFuc2knXSAgICAgID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk7DQogICAgICAgICRkYXRhWydpZF9pbnRhbnNpJ10gICAgID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyk7DQogICAgICAgICRkYXRhWydpbnRhbnNpX25hbWUnXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaV9uYW1lJyk7DQogICAgICAgICAgICAkZGF0YVsnbmFtZV9wb3NpdGlvbiddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCduYW1lX3Bvc2l0aW9uJyk7DQogICAgICAgICRkYXRhWydkcm9wX3R0ZF9kZXNhJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfcGVuYW5kYXRhbmdhbl9kZXNhKCR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpKTsNCiAgICAgICAgJGRhdGFbJ2Ryb3BfdHRkX2tlYyddICAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF9wZW5hbmRhdGFuZ2FuX2tlYygpOw0KICAgICAgICAkZGF0YVsnZGF0YV90YW1iYWhhbiddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X21hc3NhZ2Vfd2hlcmVfdW5pdmVyc2FsX3Jvdygnc3J0X2l6aW5fa2VyYW1haWFuJywnbm9fc3VyYXRfYmF5YW5nYW4nLCRub3N1cmF0KTsNCiAgICAgICAgJGRhdGFbJ2dldF90dGRfa2VjJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfdHRkX2NhbWF0KCRkYXRhWydkYXRhX3RhbWJhaGFuJ10tPmlkX3BhbW9uZ19rZWNfdHRkKTsNCiAgICAgICAgJGRhdGFbJ3BhZ2UnXSAgICAgICAgID0gJ3N1cmF0L3RlbXBsYXRlL3N1cmF0X2l6aW5fa2VyYW1haWFuJzsNCg0KICAgICAgICAgICAgICAgIGlmKCRkYXRhWydkYXRhX3BlbmR1ZHVrJ10tPmlkID09ICRkYXRhWydkYXRhX3RhbWJhaGFuJ10tPmlkX3BlbmR1ZHVrKXsNCiAgICAgICAgICAgICR0aGlzLT5sb2FkLT52aWV3KCdpbmRleCcsJGRhdGEpOw0KICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCdtYWluJyk7DQogICAgICAgICAgfQ0KDQogICAgICB9DQogICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICByZWRpcmVjdCgnbWFpbicpOw0KICAgICAgfQ0KICB9DQoNCiBwdWJsaWMgZnVuY3Rpb24gdmVyaWZfaXppbl9rZXJhbWFpYW4oKXsNCiAgICAkbmlrICAgID0gJHRoaXMtPmlucHV0LT5wb3N0KCduaWsnKTsNCiAgICAkbm9zdXJhdCAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ25vc3VyYXQnKTsNCiAgICAkaWR0dGQgICAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R0ZF9rZWMnKTsNCiAgICAkaWR2ZXJpZiAgPSAnMic7DQogICAgJHVwZGF0ZSAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+dmVyaWZ5KCdzcnRfaXppbl9rZXJhbWFpYW4nLCRub3N1cmF0LCRpZHR0ZCwkaWR2ZXJpZik7DQogICAgaWYoJHVwZGF0ZSl7DQogICAgICR0aGlzLT5zZXNzaW9uLT5zZXRfZmxhc2hkYXRhKCdzdWNjZXNzJywkbmlrLicgQmVyaGFzaWwgZGkgYXBwcm92Jyk7DQogICAgICByZXR1cm4gcmVkaXJlY3QoJy9zdXJhdC9nZXRfaXppbl9rZXJhbWFpYW4vJy4kbmlrLicvJy4kbm9zdXJhdCk7DQogICAgfWVsc2V7DQogICAgICAgICR0aGlzLT5zZXNzaW9uLT5zZXRfZmxhc2hkYXRhKCdlcnJvcicsJG5pay4nIEdhZ2FsIGRpIGFwcHJvdicpOw0KICAgICAgcmV0dXJuIHJlZGlyZWN0KCcvc3VyYXQvZ2V0X2l6aW5fa2VyYW1haWFuLycuJG5pay4nLycuJG5vc3VyYXQpOw0KICAgIH0NCiAgfQ0KDQoNCiAgLyoNCiAgKiBGdW5nc2kgdW50dWsgbWVuZyBnZW5lcmF0ZSBzdXJhdCBrZWxha3VhbiBiYWlrDQogICovDQoNCiAgcHVibGljIGZ1bmN0aW9uIGtlbGFrdWFuX2JhaWsoJG5paywkamVuaXMpew0KICAgIGlmKCR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpPT0nZGVzYSd8fCR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpPT0na2VjJykNCiAgICB7ICANCiAgICAkZGF0YVsnZHJvcF90eXBlJ10gICAgICA9ICR0aGlzLT5NYXN0ZXJfbW9kZWwtPmdldF9kYigncmVmX3R5cGVfbWFzc2FnZScpOw0KICAgICRkYXRhWydkcm9wX3R5cGVfcGlvcml0YXMnXSA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF9ub19tYXNzYWdlKCRqZW5pcyk7DQogICAgJGRhdGFbJ2lkX2plbmlzJ10gICAgICAgPSAkamVuaXM7DQogICAgJGRhdGFbJ3BhZ2VfdGl0bGUnXSAgICAgPSAnU3VyYXQgS2VsYWt1YW4gQmFpayc7ICAgICANCiAgICAkZGF0YVsna2FidXBhdGVuJ10gPSAnQkFUVSc7DQogICAgJGRhdGFbJ2tlY2FtYXRhbiddID0gJ0JVTUlBSkknOyAgDQogICAgJGRhdGFbJ2lkX2VtcGxveWVlJ10gICAgPSAnJzsNCiAgICAkZGF0YVsncG9zaXNpJ10gICAgICAgPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyk7IA0KICAgICRkYXRhWydkYXRhX3BlbmR1ZHVrJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5kYXRhX3BlbmR1ZHVrKCRuaWspOw0KICAgICRkYXRhWydpbnRhbnNpJ10gICAgICA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpOw0KICAgICRkYXRhWydpZF9pbnRhbnNpJ10gICAgID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyk7DQogICAgJGRhdGFbJ2ludGFuc2lfbmFtZSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpX25hbWUnKTsNCiAgICAgICAgJGRhdGFbJ25hbWVfcG9zaXRpb24nXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnbmFtZV9wb3NpdGlvbicpOw0KICAgICRkYXRhWydkcm9wX3R0ZF9kZXNhJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfcGVuYW5kYXRhbmdhbl9kZXNhKCR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpKTsNCiAgICAkZGF0YVsnbm9fc3VyYXQnXSAgICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5ub19zdXJhdCgnc3J0X2tlbGFrdWFuX2JhaWsnLCRqZW5pcywkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKSk7DQogICAgJGRhdGFbJ3BhZ2UnXSAgICAgICAgID0gJ3N1cmF0L3N1cmF0X2tlbGFrdWFuX2JhaWsnOw0KICAgICR0aGlzLT5sb2FkLT52aWV3KCdpbmRleCcsJGRhdGEpOw0KICAgIH0NCiAgICBlbHNlDQogICAgICB7DQogICAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgICB9DQogIH0NCg0KICBwdWJsaWMgZnVuY3Rpb24gZG9fa2VsYWt1YW5fYmFpaygpew0KICAgICRub3N1cmF0ID0gc3RyX3JlcGxhY2UoIi8iLCIiLCR0aGlzLT5pbnB1dC0+cG9zdCgnaW5kdWtfc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdF9kZXNhJykuJHRoaXMtPmlucHV0LT5wb3N0KCd0Z2xfc3VyYXQnKSk7DQogICAgJGRhdGEgPSBbDQogICAgICdub19zdXJhdCcgICAgICAgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaW5kdWtfc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdF9kZXNhJykuJHRoaXMtPmlucHV0LT5wb3N0KCd0Z2xfc3VyYXQnKSwNCiAgICAgICdub19zdXJhdF9iYXlhbmdhbicgICA9PiAkbm9zdXJhdCwNCiAgICAgICdpZF9wYW1vbmdfZGVzYV9jcmVhdGUnID0+ICR0aGlzLT51c2VyX2RldGFpbCgnaWQnKSwNCiAgICAgICdpZF9wYW1vbmdfZGVzYV90dGQnICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R0ZF9kZXNhJyksDQogICAgICAnaWRfdHlwZV9tYXNzYWdlJyAgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaWRfamVuaXMnKSwNCiAgICAgICdpZF9wZW5kdWR1aycgICAgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaWRfcGVuZHVkdWsnKSwNCiAgICAgICdpZF9pbnRhbnNpX2Rlc2EnICAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9pbnRhbnNpJyksDQogICAgICAndGdsX2NyZWF0ZScgICAgICA9PiBkYXRlKCdZLW0tZCcpLA0KICAgICAgJ2tldGVyYW5nYW4nICAgICAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdrZXRlcmFuZ2FuJyksDQogICAgICAnc3RhdHVzX3ZlcmlmJyAgICAgID0+ICcwJywNCiAgICAgICdzdGF0dXMnICAgICAgICA9PiAnMScsDQogICAgXTsNCg0KICAgICRzdG9yZSA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmFkZF9rZWxha3Vhbl9iYWlrKCRkYXRhKTsNCiAgICBpZigkc3RvcmUpew0KICAgICAgcmV0dXJuIHJlZGlyZWN0KCcvc3VyYXQvZ2V0X2tlbGFrdWFuX2JhaWsvJy4kdGhpcy0+aW5wdXQtPnBvc3QoJ2RhdGFfbmlrJykuJy8nLiRub3N1cmF0KTsNCiAgICB9ZWxzZXsNCiAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydzdGF0dXMnID0+ICdpbnRlcm5hbCBzZXJ2ZXIgZXJyb3InXSw1MDApOw0KICAgIH0NCiAgfQ0KDQogIHB1YmxpYyBmdW5jdGlvbiBnZXRfa2VsYWt1YW5fYmFpaygkbmlrLCRub3N1cmF0KXsNCiAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnfHwkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2tlYycpDQogICAgeyAgDQogICAgJGRhdGFbJ2Ryb3BfdHlwZSddICAgICAgPSAkdGhpcy0+TWFzdGVyX21vZGVsLT5nZXRfZGIoJ3JlZl90eXBlX21hc3NhZ2UnKTsNCiAgICAkZGF0YVsncGFnZV90aXRsZSddICAgICA9ICdTdXJhdCBLZWxha3VhbiBCYWlrJzsgDQogICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsgICAgDQogICAgJGRhdGFbJ2lkX2VtcGxveWVlJ10gICAgPSAnJzsNCiAgICAkZGF0YVsncG9zaXNpJ10gICAgICAgPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyk7IA0KICAgICRkYXRhWydkYXRhX3BlbmR1ZHVrJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5kYXRhX3BlbmR1ZHVrKCRuaWspOw0KICAgICRkYXRhWydpbnRhbnNpJ10gICAgICA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpOw0KICAgICRkYXRhWydpZF9pbnRhbnNpJ10gICAgID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyk7DQogICAgJGRhdGFbJ2ludGFuc2lfbmFtZSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpX25hbWUnKTsNCiAgICAgICAgJGRhdGFbJ25hbWVfcG9zaXRpb24nXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnbmFtZV9wb3NpdGlvbicpOw0KICAgICRkYXRhWydkcm9wX3R0ZF9kZXNhJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfcGVuYW5kYXRhbmdhbl9kZXNhKCR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpKTsNCiAgICAgJGRhdGFbJ2Ryb3BfdHRkX2tlYyddICAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF9wZW5hbmRhdGFuZ2FuX2tlYygpOw0KICAgICRkYXRhWydkYXRhX3RhbWJhaGFuJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfbWFzc2FnZV93aGVyZV91bml2ZXJzYWxfcm93KCdzcnRfa2VsYWt1YW5fYmFpaycsJ25vX3N1cmF0X2JheWFuZ2FuJywkbm9zdXJhdCk7DQogICAgJGRhdGFbJ2dldF90dGRfa2VjJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfdHRkX2NhbWF0KCRkYXRhWydkYXRhX3RhbWJhaGFuJ10tPmlkX3BhbW9uZ19rZWNfdHRkKTsNCiAgICBpZigkZGF0YVsnZGF0YV9wZW5kdWR1ayddLT5zaGRrPT0nQU5BSycpew0KICAgICAgJGdldGlidSAgICAgICAgID0gJHRoaXMtPmRiLT5zZWxlY3QoJyonKS0+ZnJvbSgnbXN0X3BlbmR1ZHVrJyktPndoZXJlKFsnc2hkaycgPT4gJ0lTVFJJJ10pLT53aGVyZSgnaW5kdWtfa2snLCRkYXRhWydkYXRhX3BlbmR1ZHVrJ10tPmluZHVrX2trKS0+Z2V0KCktPnJvdygpOw0KICAgICAgJGRhdGFbJ2RhdGFfaWJ1J10gICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmRhdGFfcGVuZHVkdWsoJGdldGlidS0+bmlrKTsNCiAgICAgICRnZXRheWFoICAgICAgICA9ICR0aGlzLT5kYi0+c2VsZWN0KCcqJyktPmZyb20oJ21zdF9wZW5kdWR1aycpLT53aGVyZShbJ25paycgPT4gJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXS0+aW5kdWtfa2tdKS0+Z2V0KCktPnJvdygpOw0KICAgICAgJGRhdGFbJ2RhdGFfYXlhaCddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+ZGF0YV9wZW5kdWR1aygkZ2V0YXlhaC0+bmlrKTsNCiAgICB9DQogICAgJGRhdGFbJ3BhZ2UnXSAgICAgICAgID0gJ3N1cmF0L3RlbXBsYXRlL3N1cmF0X2tlbGFrdWFuX2JhaWsnOw0KICAgICAgaWYoJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXS0+aWQgPT0gJGRhdGFbJ2RhdGFfdGFtYmFoYW4nXS0+aWRfcGVuZHVkdWspew0KICAgICAgICAkdGhpcy0+bG9hZC0+dmlldygnaW5kZXgnLCRkYXRhKTsNCiAgICAgIH1lbHNlew0KICAgICAgICByZXR1cm4gcmVkaXJlY3QoJ21haW4nKTsNCiAgICAgIH0NCiAgICB9DQogICAgZWxzZQ0KICAgICAgew0KICAgICAgICByZWRpcmVjdCgnbWFpbicpOw0KICAgICAgfQ0KICB9DQoNCiAgcHVibGljIGZ1bmN0aW9uIHZlcmlmX2tlbGFrdWFuX2JhaWsoKXsNCiAgICAkbmlrICAgID0gJHRoaXMtPmlucHV0LT5wb3N0KCduaWsnKTsNCiAgICAkbm9zdXJhdCAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ25vc3VyYXQnKTsNCiAgICAkaWR0dGQgICAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R0ZF9rZWMnKTsNCiAgICAkaWR2ZXJpZiAgPSAnMic7DQogICAgJHVwZGF0ZSA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPnZlcmlmeSgnc3J0X2tlbGFrdWFuX2JhaWsnLCRub3N1cmF0LCRpZHR0ZCwkaWR2ZXJpZik7DQogICAgaWYoJHVwZGF0ZSl7DQogICAgICByZXR1cm4gcmVkaXJlY3QoJy9zdXJhdC9nZXRfa2VsYWt1YW5fYmFpay8nLiRuaWsuJy8nLiRub3N1cmF0KTsNCiAgICB9ZWxzZXsNCiAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydzdGF0dXMnID0+ICdpbnRlcm5hbCBzZXJ2ZXIgZXJyb3InXSw1MDApOw0KICAgIH0NCiAgfQ0KDQoNCiAgLyoNCiAgKiBGdW5nc2kgdW50dWsgbWVuZyBnZW5lcmF0ZSBmb3JtIGt0cA0KICAqLw0KDQogIHB1YmxpYyBmdW5jdGlvbiBmb3JtX2t0cCgkbmlrLCRqZW5pcyl7DQogICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnfHwkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2tlYycpDQogICAgeyAgDQogICAgICAkZGF0YVsnZHJvcF90eXBlJ10gICAgICA9ICR0aGlzLT5NYXN0ZXJfbW9kZWwtPmdldF9kYigncmVmX3R5cGVfbWFzc2FnZScpOw0KICAgICAgJGRhdGFbJ2Ryb3BfdHlwZV9waW9yaXRhcyddID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X25vX21hc3NhZ2UoJGplbmlzKTsNCiAgICAgICRkYXRhWydpZF9qZW5pcyddICAgICAgID0gJGplbmlzOw0KICAgICAgJGRhdGFbJ3BhZ2VfdGl0bGUnXSAgICAgPSAnRm9ybSBLVFAnOw0KICAgICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsgICAgIA0KICAgICAgJGRhdGFbJ2lkX2VtcGxveWVlJ10gICAgPSAnJzsNCiAgICAgICRkYXRhWydwb3Npc2knXSAgICAgICA9ICR0aGlzLT51c2VyX2RldGFpbCgncG9zaXRpb25faWQnKTsgDQogICAgICAkZGF0YVsnZGF0YV9wZW5kdWR1ayddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+ZGF0YV9wZW5kdWR1aygkbmlrKTsNCiAgICAgICRkYXRhWydpbnRhbnNpJ10gICAgICA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpOw0KICAgICAgJGRhdGFbJ2lkX2ludGFuc2knXSAgICAgPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKTsNCiAgICAgICRkYXRhWydpbnRhbnNpX25hbWUnXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaV9uYW1lJyk7DQogICAgICAkZGF0YVsnbmFtZV9wb3NpdGlvbiddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCduYW1lX3Bvc2l0aW9uJyk7DQogICAgICAkZGF0YVsnZHJvcF90dGRfZGVzYSddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X3BlbmFuZGF0YW5nYW5fZGVzYSgkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKSk7DQogICAgICAkZGF0YVsnbm9fc3VyYXQnXSAgICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5ub19zdXJhdCgnc3J0X2Zvcm1fa3RwJywkamVuaXMsJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJykpOw0KICAgICAgJGRhdGFbJ3BhZ2UnXSAgICAgICAgID0gJ3N1cmF0L2Zvcm1fa3RwJzsNCiAgICAgICR0aGlzLT5sb2FkLT52aWV3KCdpbmRleCcsJGRhdGEpOw0KICAgIH0NCiAgICBlbHNlDQogICAgICB7DQogICAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgICB9DQogIH0NCg0KICBwdWJsaWMgZnVuY3Rpb24gZG9fZm9ybV9rdHAoKXsNCiAgICAkbm9zdXJhdCA9IHN0cl9yZXBsYWNlKCIvIiwiIiwgJHRoaXMtPmlucHV0LT5wb3N0KCdpbmR1a19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0X2Rlc2EnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ3RnbF9zdXJhdCcpKTsNCiAgICAkZGF0YSA9IFsNCiAgICAgICdub19zdXJhdCcgICAgICAgID0+ICAkdGhpcy0+aW5wdXQtPnBvc3QoJ2luZHVrX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXRfZGVzYScpLiR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX3N1cmF0JyksDQogICAgICAnbm9fc3VyYXRfYmF5YW5nYW4nICAgPT4gJG5vc3VyYXQsDQogICAgICAnaWRfcGFtb25nX2Rlc2FfY3JlYXRlJyA9PiAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkJyksDQogICAgICAnaWRfcGFtb25nX2Rlc2FfdHRkJyAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCd0dGRfZGVzYScpLA0KICAgICAgJ2lkX3R5cGVfbWFzc2FnZScgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2lkX2plbmlzJyksDQogICAgICAnaWRfcGVuZHVkdWsnICAgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2lkX3BlbmR1ZHVrJyksDQogICAgICAnaWRfaW50YW5zaV9kZXNhJyAgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaWRfaW50YW5zaScpLA0KICAgICAgJ2plbmlzX3Blcm1vaG9uYW4nICAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdqZW5pc19wZXJtb2hvbmFuJyksDQogICAgICAndGdsX2NyZWF0ZScgICAgICA9PiBkYXRlKCdZLW0tZCcpLA0KICAgICAgJ3N0YXR1c192ZXJpZicgICAgICA9PiAnMCcsDQogICAgICAnc3RhdHVzJyAgICAgICAgPT4gJzEnLA0KICAgIF07DQoNCiAgICAkc3RvcmUgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5hZGRfZm9ybV9rdHAoJGRhdGEpOw0KICAgIGlmKCRzdG9yZSl7DQogICAgICByZXR1cm4gcmVkaXJlY3QoJy9zdXJhdC9nZXRfZm9ybV9rdHAvJy4kdGhpcy0+aW5wdXQtPnBvc3QoJ2RhdGFfbmlrJykuJy8nLiRub3N1cmF0KTsNCiAgICB9ZWxzZXsNCiAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydzdGF0dXMnID0+ICdpbnRlcm5hbCBzZXJ2ZXIgZXJyb3InXSw1MDApOw0KICAgIH0NCiAgfQ0KDQogIHB1YmxpYyBmdW5jdGlvbiBnZXRfZm9ybV9rdHAoJG5paywkbm9zdXJhdCl7DQogIGlmKCR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpPT0nZGVzYSd8fCR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpPT0na2VjJykNCiAgICB7ICANCiAgICAkZGF0YVsnZHJvcF90eXBlJ10gICAgICA9ICR0aGlzLT5NYXN0ZXJfbW9kZWwtPmdldF9kYigncmVmX3R5cGVfbWFzc2FnZScpOw0KICAgICRkYXRhWydwYWdlX3RpdGxlJ10gICAgID0gJ1N1cmF0IFBlcm1vaG9uYW4gS1RQJzsgDQogICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsgICANCiAgICAkZGF0YVsnaWRfZW1wbG95ZWUnXSAgICA9ICcnOw0KICAgICRkYXRhWydwb3Npc2knXSAgICAgICA9ICR0aGlzLT51c2VyX2RldGFpbCgncG9zaXRpb25faWQnKTsgDQogICAgJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXSAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmRhdGFfcGVuZHVkdWsoJG5payk7DQogICAgDQogICAgJGRhdGFbJ2Ryb3BfdHRkX2Rlc2EnXSAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF9wZW5hbmRhdGFuZ2FuX2Rlc2EoJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJykpOw0KICAgICRkYXRhWydkcm9wX3R0ZF9rZWMnXSAgICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfcGVuYW5kYXRhbmdhbl9rZWMoKTsNCiAgICAkZGF0YVsnZGF0YV90YW1iYWhhbiddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X21hc3NhZ2Vfd2hlcmVfdW5pdmVyc2FsX3Jvdygnc3J0X2Zvcm1fa3RwJywnbm9fc3VyYXRfYmF5YW5nYW4nLCRub3N1cmF0KTsNCiAgICAkZGF0YVsnZ2V0X3R0ZF9rZWMnXSAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF90dGRfY2FtYXQoJGRhdGFbJ2RhdGFfdGFtYmFoYW4nXS0+aWRfcGFtb25nX2tlY190dGQpOw0KICAgICAkZGF0YVsnaW50YW5zaSddICAgICAgPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKTsNCiAgICAkZGF0YVsnaWRfaW50YW5zaSddICAgICA9ICR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpOw0KICAgICRkYXRhWydpbnRhbnNpX25hbWUnXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaV9uYW1lJyk7DQogICAgJGRhdGFbJ25hbWVfcG9zaXRpb24nXSA9ICR0aGlzLT51c2VyX2RldGFpbCgnbmFtZV9wb3NpdGlvbicpOw0KICAgICRkYXRhWydwYWdlJ10gICAgICAgICA9ICdzdXJhdC90ZW1wbGF0ZS9mb3JtX2t0cCc7DQogICAgaWYoJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXS0+aWQgPT0gJGRhdGFbJ2RhdGFfdGFtYmFoYW4nXS0+aWRfcGVuZHVkdWspew0KICAgICAgICAkdGhpcy0+bG9hZC0+dmlldygnaW5kZXgnLCRkYXRhKTsNCiAgICAgIH1lbHNlew0KICAgICAgICByZXR1cm4gcmVkaXJlY3QoJ21haW4nKTsNCiAgICAgIH0NCiAgICAgfQ0KICAgICBlbHNlDQogICAgICB7DQogICAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgICB9DQogIH0NCg0KICBwdWJsaWMgZnVuY3Rpb24gdmVyaWZfa3RwKCl7DQogICAgJG5payAgICA9ICR0aGlzLT5pbnB1dC0+cG9zdCgnbmlrJyk7DQogICAgJG5vc3VyYXQgID0gJHRoaXMtPmlucHV0LT5wb3N0KCdub3N1cmF0Jyk7DQogICAgJGlkdHRkICAgID0gJHRoaXMtPmlucHV0LT5wb3N0KCd0dGRfa2VjJyk7DQogICAgJGlkdmVyaWYgID0gJzInOw0KICAgICR1cGRhdGUgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPnZlcmlmeSgnc3J0X2Zvcm1fa3RwJywkbm9zdXJhdCwkaWR0dGQsJGlkdmVyaWYpOw0KICAgIGlmKCR1cGRhdGUpew0KICAgICAgJHRoaXMtPnNlc3Npb24tPnNldF9mbGFzaGRhdGEoJ3N1Y2Nlc3MnLCRuaWsuJyBCZXJoYXNpbCBkaSBhcHByb3YnKTsNCiAgICAgIHJldHVybiByZWRpcmVjdCgnL3N1cmF0L2dldF9mb3JtX2t0cC8nLiRuaWsuJy8nLiRub3N1cmF0KTsNCiAgICB9ZWxzZXsNCiAgICAgICR0aGlzLT5zZXNzaW9uLT5zZXRfZmxhc2hkYXRhKCdlcnJvcicsJG5pay4nIEdhZ2FsIGRpIGFwcHJvdicpOw0KICAgICAgcmV0dXJuIHJlZGlyZWN0KCcvc3VyYXQvZ2V0X2Zvcm1fa3RwLycuJG5pay4nLycuJG5vc3VyYXQpOw0KICAgIH0NCiAgfQ0KDQoNCiAgLyoNCiAgKiBGdW5nc2kgdW50dWsgbWVuZyBnZW5lcmF0ZSBzdXJhdCBrZXRlcmFuZ2FuIHBpbmRhaCB3bmkNCiAgKi8NCg0KICBwdWJsaWMgZnVuY3Rpb24ga2V0ZXJhbmdhbl9waW5kYWhfd25pKCRuaWssJGplbmlzKXsNCiAgICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnfHwkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2tlYycpDQogICAgeyAgDQoNCg0KICAgICRkYXRhWydkcm9wX3R5cGUnXSAgICAgID0gJHRoaXMtPk1hc3Rlcl9tb2RlbC0+Z2V0X2RiKCdyZWZfdHlwZV9tYXNzYWdlJyk7DQogICAgJGRhdGFbJ2Ryb3BfdHlwZV9waW9yaXRhcyddID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X25vX21hc3NhZ2UoJGplbmlzKTsNCiAgICAkZGF0YVsnaWRfamVuaXMnXSAgICAgICA9ICRqZW5pczsNCiAgICAkZGF0YVsncGFnZV90aXRsZSddICAgICA9ICdTdXJhdCBLZXRlcmFuZ2FuIFBpbmRhaCBEYXRhbmcgV05JJzsgDQogICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsgICAgDQogICAgJGRhdGFbJ2lkX2VtcGxveWVlJ10gICAgPSAnJzsNCiAgICAkZGF0YVsncG9zaXNpJ10gICAgICAgPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyk7IA0KICAgICRkYXRhWydkYXRhX3BlbmR1ZHVrJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5kYXRhX3BlbmR1ZHVrKCRuaWspOw0KICAgICRkYXRhWydkYXRhX2tlbHVhcmdhJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfZGF0YV9rZWx1YXJnYSgkZGF0YVsnZGF0YV9wZW5kdWR1ayddLT5ub19rayk7DQogICAgJGRhdGFbJ2ludGFuc2knXSAgICAgID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk7DQogICAgJGRhdGFbJ2lkX2ludGFuc2knXSAgICAgPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKTsNCiAgICAkZGF0YVsnaW50YW5zaV9uYW1lJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2lfbmFtZScpOw0KICAgICRkYXRhWyduYW1lX3Bvc2l0aW9uJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ25hbWVfcG9zaXRpb24nKTsNCiAgICAkZGF0YVsnZHJvcF90dGRfZGVzYSddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X3BlbmFuZGF0YW5nYW5fZGVzYSgkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKSk7DQogICAgJGRhdGFbJ25vX3N1cmF0J10gICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+bm9fc3VyYXQoJ3NydF9rZXRlcmFuZ2FuX3BpbmRhaCcsJGplbmlzLCR0aGlzLT51c2VyX2RldGFpbCgnaWRfaW50YW5zaScpKTsNCiAgICAkZGF0YVsncGFnZSddICAgICAgICAgPSAnc3VyYXQvc3VyYXRfa2V0ZXJhbmdhbl9waW5kYWgnOw0KDQogICAgICR0aGlzLT5sb2FkLT52aWV3KCdpbmRleCcsJGRhdGEpOw0KDQogICAgfQ0KICAgICBlbHNlDQogICAgICB7DQogICAgICAgIHJlZGlyZWN0KCdtYWluJyk7DQogICAgICB9DQogIH0NCg0KICBwdWJsaWMgZnVuY3Rpb24gZG9fa2V0ZXJhbmdhbl9waW5kYWhfd25pKCl7DQogICAgJG1fbmFtYSA9ICR0aGlzLT5pbnB1dC0+cG9zdCgnbV9uYW1hJyk7DQogICAgJG1fbmlrICA9ICR0aGlzLT5pbnB1dC0+cG9zdCgnbV9uaWsnKTsNCiAgICAkbV9zaGRrID0gJHRoaXMtPmlucHV0LT5wb3N0KCdtX3NoZGsnKTsNCiAgICAkbm9zdXJhdCA9IHN0cl9yZXBsYWNlKCIvIiwiIiwgJHRoaXMtPmlucHV0LT5wb3N0KCdpbmR1a19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0X2Rlc2EnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ3RnbF9zdXJhdCcpKTsNCiAgICAkc2F2ZV9waWxpaF9rZWwgPSBbXTsNCiAgICAkcGlsaWhfa2VsID0gJHRoaXMtPmlucHV0LT5wb3N0KCdwaWxpaF9rZWx1YXJnYScpOw0KICAgIGZvcmVhY2ggKCRwaWxpaF9rZWwgYXMgJGtleSA9PiAkdmFsdWUpIHsNCiAgICAgICRzYXZlX3BpbGloX2tlbFska2V5XSA9ICR2YWx1ZTsNCiAgICB9DQogICAgJHNhdmVfcGlsaWhfa2VsID0ganNvbl9lbmNvZGUoJHNhdmVfcGlsaWhfa2VsKTsNCiAgICAkZGF0YSA9IFsNCiAgICAgICdub19zdXJhdCcgICAgICAgID0+ICAkdGhpcy0+aW5wdXQtPnBvc3QoJ2luZHVrX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXRfZGVzYScpLiR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX3N1cmF0JyksDQogICAgICAnbm9fc3VyYXRfYmF5YW5nYW4nICAgPT4gJG5vc3VyYXQsDQogICAgICAnaWRfcGFtb25nX2Rlc2FfY3JlYXRlJyA9PiAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkJyksDQogICAgICAnaWRfcGFtb25nX2Rlc2FfdHRkJyAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCd0dGRfZGVzYScpLA0KICAgICAgJ2lkX3R5cGVfbWFzc2FnZScgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2lkX2plbmlzJyksDQogICAgICAnaWRfcGVuZHVkdWsnICAgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2lkX3BlbmR1ZHVrJyksDQogICAgICAnaWRfaW50YW5zaV9kZXNhJyAgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnaWRfaW50YW5zaScpLA0KICAgICAgJ2FsYXNhbicgICAgICAgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnYWxhc2FuJyksDQogICAgICAndHVqdWFuX3BpbmRhaF9hbGFtYXQnICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R1anVhbl9waW5kYWhfYWxhbWF0JyksDQogICAgICAndHVqdWFuX3BpbmRhaF9kZXNhJyAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCd0dWp1YW5fcGluZGFoX2Rlc2EnKSwNCiAgICAgICd0dWp1YW5fcGluZGFoX2tlYycgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R1anVhbl9waW5kYWhfa2VjJyksDQogICAgICAndHVqdWFuX3BpbmRhaF9rYWInICAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCd0dWp1YW5fcGluZGFoX2thYicpLA0KICAgICAgJ3R1anVhbl9waW5kYWhfcHJvdicgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgndHVqdWFuX3BpbmRhaF9wcm92JyksDQogICAgICAndHVqdWFuX3BpbmRhaF9rb2RlX3Bvcyc9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R1anVhbl9waW5kYWhfa29kZV9wb3MnKSwNCiAgICAgICd0dWp1YW5fcGluZGFoX3J0JyAgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R1anVhbl9waW5kYWhfcnQnKSwNCiAgICAgICd0dWp1YW5fcGluZGFoX3J3JyAgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R1anVhbl9waW5kYWhfcncnKSwNCiAgICAgICd0dWp1YW5fcGluZGFoX3RlbGVwb24nID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgndHVqdWFuX3BpbmRhaF90ZWxlcG9uJyksDQogICAgICAna2xhc2lmaWthc2lfcGluZGFoJyAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdrbGFzaWZpa2FzaV9waW5kYWgnKSwNCiAgICAgICdqZW5pc19rZXBpbmRhaGFuJyAgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2plbmlzX2tlcGluZGFoYW4nKSwNCiAgICAgICdzdGF0dXNfbm9fa2tfdGRrX3BpbmRhaCcgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdzdGF0dXNfbm9fa2tfdGRrX3BpbmRhaCcpLA0KICAgICAgJ3N0YXR1c19ub19ra19waW5kYWgnID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgnc3RhdHVzX25vX2trX3BpbmRhaCcpLA0KICAgICAgJ3JlbmNhbmFfcGluZGFoJyAgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ3JlbmNhbmFfcGluZGFoJyksDQogICAgICAndGdsX2NyZWF0ZScgICAgICA9PiBkYXRlKCdZLW0tZCcpLA0KICAgICAgJ2tlbHVhcmdhX3BpbmRhaCcgICA9PiAkc2F2ZV9waWxpaF9rZWwsDQogICAgICAnc3RhdHVzX3ZlcmlmJyAgICAgID0+ICcwJywNCiAgICAgICdzdGF0dXMnICAgICAgICA9PiAnMScsDQogICAgXTsgDQoNCiAgICAkc3RvcmUgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5hZGRfa2V0ZXJhbmdhbl9waW5kYWgoJGRhdGEpOw0KICAgIGZvcmVhY2goJG1fbmFtYSBhcyAka2V5ID0+ICRuYW1hKXsNCiAgICAgICRtX2RhdGEgPSBbDQogICAgICAgICdpZF9waW5kYWgnID0+ICRzdG9yZSwNCiAgICAgICAgJ25hbWEnICA9PiAkbmFtYSwNCiAgICAgICAgJ25paycgICA9PiAkbV9uaWtbJGtleV0sDQogICAgICAgICdzaGRrJyAgPT4gJG1fc2hka1ska2V5XQ0KICAgICAgXTsNCiAgICAgICRtX3N0b3JlID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+YWRkX2tldGVyYW5nYW5fcGluZGFoX2tldCgkbV9kYXRhKTsNCiAgICB9DQoNCiAgICBpZigkc3RvcmUpew0KICAgICAgcmV0dXJuIHJlZGlyZWN0KCcvc3VyYXQvZ2V0X2tldGVyYW5nYW5fcGluZGFoX3duaS8nLiR0aGlzLT5pbnB1dC0+cG9zdCgnZGF0YV9uaWsnKS4nLycuJG5vc3VyYXQpOw0KICAgIH1lbHNlew0KICAgICAgZWNobyBqc29uX2VuY29kZShbJ3N0YXR1cycgPT4gJ2ludGVybmFsIHNlcnZlciBlcnJvciddLDUwMCk7DQogICAgfQ0KICB9DQoNCiAgcHVibGljIGZ1bmN0aW9uIGdldF9rZXRlcmFuZ2FuX3BpbmRhaF93bmkoJG5paywkbm9zdXJhdCl7DQogICBpZigkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2Rlc2EnfHwkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2knKT09J2tlYycpDQogICAgeyAgDQogICAgJGRhdGFbJ2Ryb3BfdHlwZSddICAgICAgPSAkdGhpcy0+TWFzdGVyX21vZGVsLT5nZXRfZGIoJ3JlZl90eXBlX21hc3NhZ2UnKTsNCiAgICAkZGF0YVsncGFnZV90aXRsZSddICAgICA9ICdTdXJhdCBLZXRlcmFuZ2FuIFBpbmRhaCBEYXRhbmcgV05JJzsNCiAgICAkZGF0YVsna2FidXBhdGVuJ10gPSAnQkFUVSc7DQogICAgJGRhdGFbJ2tlY2FtYXRhbiddID0gJ0JVTUlBSkknOyAgICAgDQogICAgJGRhdGFbJ2lkX2VtcGxveWVlJ10gICAgPSAnJzsNCiAgICAkZGF0YVsncG9zaXNpJ10gICAgICAgPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ3Bvc2l0aW9uX2lkJyk7IA0KICAgICRkYXRhWydkYXRhX3BlbmR1ZHVrJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5kYXRhX3BlbmR1ZHVrKCRuaWspOw0KICAgICRkYXRhWydpbnRhbnNpJ10gICAgICA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpOw0KICAgICRkYXRhWydpZF9pbnRhbnNpJ10gICAgID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyk7DQogICAgJGRhdGFbJ2ludGFuc2lfbmFtZSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpX25hbWUnKTsNCiAgICAkZGF0YVsnbmFtZV9wb3NpdGlvbiddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCduYW1lX3Bvc2l0aW9uJyk7DQogICAgJGRhdGFbJ2Ryb3BfdHRkX2Rlc2EnXSAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF9wZW5hbmRhdGFuZ2FuX2Rlc2EoJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJykpOw0KICAgICRkYXRhWydkcm9wX3R0ZF9rZWMnXSAgICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfcGVuYW5kYXRhbmdhbl9rZWMoKTsNCiAgICAkZGF0YVsnZGF0YV9rZWx1YXJnYSddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X2RhdGFfa2VsdWFyZ2EoJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXS0+bm9fa2spOw0KICAgICRkYXRhWydtX2RhdGFfa2VsdWFyZ2EnXSAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5tX2dldF9kYXRhX2tlbHVhcmdhKCRub3N1cmF0KTsNCiAgICAkZGF0YVsnZGF0YV90YW1iYWhhbiddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X21hc3NhZ2Vfd2hlcmVfdW5pdmVyc2FsX3Jvdygnc3J0X2tldGVyYW5nYW5fcGluZGFoJywnbm9fc3VyYXRfYmF5YW5nYW4nLCRub3N1cmF0KTsNCiAgICAkZGF0YVsnZ2V0X3R0ZF9rZWMnXSAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF90dGRfY2FtYXQoJGRhdGFbJ2RhdGFfdGFtYmFoYW4nXS0+aWRfcGFtb25nX2tlY190dGQpOw0KDQogICAgJGtlbF8gPSBbXTsNCiAgICBmb3JlYWNoKGpzb25fZGVjb2RlKCRkYXRhWydkYXRhX3RhbWJhaGFuJ10tPmtlbHVhcmdhX3BpbmRhaCkgYXMgJGtleSA9PiAka2VsdWFyZ2Epew0KICAgICAgJGtlbCA9ICR0aGlzLT5kYi0+c2VsZWN0KCcqJyktPmZyb20oJ21zdF9wZW5kdWR1aycpLT53aGVyZShbJ2lkJyA9PiAka2VsdWFyZ2FdKS0+Z2V0KCktPnJvdygpOw0KICAgICAgJGtlbF9bJGtleV1bJ25payddID0gJGtlbC0+bmlrOw0KICAgICAgJGtlbF9bJGtleV1bJ25hbWFfbGVuZ2thcCddID0gJGtlbC0+bmFtYV9sZW5na2FwOw0KICAgICAgJGtlbF9bJGtleV1bJ3NoZGsnXSA9ICRrZWwtPnNoZGs7DQogICAgfQ0KICAgICRkYXRhWydkYXRhX2tlbHVhcmdhJ10gICAgPSAka2VsXzsNCg0KDQogICAgaWYoJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXS0+c2hkaz09J0tFUEFMQSBLRUxVQVJHQScpew0KICAgICAgJGRhdGFbJ2tlcGFsYV9rZWx1YXJnYSddID0gJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXTsNCiAgICB9ZWxzZXsNCiAgICAgICRkYXRhWydrZXBhbGFfa2VsdWFyZ2EnXSA9ICR0aGlzLT5kYi0+c2VsZWN0KCcqJyktPmZyb20oJ21zdF9wZW5kdWR1aycpLT53aGVyZShbJ25paycgPT4gJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXS0+aW5kdWtfa2tdKS0+Z2V0KCktPnJvdygpOw0KICAgIH0NCiAgICAkZGF0YVsncGFnZSddICAgICAgICAgPSAnc3VyYXQvdGVtcGxhdGUvc3VyYXRfa2V0ZXJhbmdhbl9waW5kYWgnOw0KICAgICBpZigkZGF0YVsnZGF0YV9wZW5kdWR1ayddLT5pZCA9PSAkZGF0YVsnZGF0YV90YW1iYWhhbiddLT5pZF9wZW5kdWR1ayl7DQogICAgICAgICR0aGlzLT5sb2FkLT52aWV3KCdpbmRleCcsJGRhdGEpOw0KICAgICAgfWVsc2V7DQogICAgICAgIHJldHVybiByZWRpcmVjdCgnbWFpbicpOw0KICAgICAgfQ0KICAgIH0NCiAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICByZWRpcmVjdCgnbWFpbicpOw0KICAgICAgfQ0KICB9DQoNCiAgcHVibGljIGZ1bmN0aW9uIHZlcmlmX2tldGVyYW5nYW5fcGluZGFoX3duaSgkbmlrLCRub3N1cmF0KXsNCiAgICAkbmlrICAgID0gJHRoaXMtPmlucHV0LT5wb3N0KCduaWsnKTsNCiAgICAkbm9zdXJhdCAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ25vc3VyYXQnKTsNCiAgICAkaWR0dGQgICAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ3R0ZF9rZWMnKTsNCiAgICAkaWR2ZXJpZiAgPSAnMic7DQogICAgJHVwZGF0ZSAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+dmVyaWZ5KCdzcnRfa2V0ZXJhbmdhbl9waW5kYWgnLCRub3N1cmF0LCRpZHR0ZCwkaWR2ZXJpZik7DQogICAgaWYoJHVwZGF0ZSl7DQogICAgICR0aGlzLT5zZXNzaW9uLT5zZXRfZmxhc2hkYXRhKCdzdWNjZXNzJywkbmlrLicgQmVyaGFzaWwgZGkgYXBwcm92Jyk7DQogICAgICByZXR1cm4gcmVkaXJlY3QoJy9zdXJhdC9nZXRfa2V0ZXJhbmdhbl9waW5kYWhfd25pLycuJG5pay4nLycuJG5vc3VyYXQpOw0KICAgIH1lbHNlew0KICAgICAgcmV0dXJuIHJlZGlyZWN0KCcvc3VyYXQvZ2V0X2tldGVyYW5nYW5fcGluZGFoX3duaS8nLiRuaWsuJy8nLiRub3N1cmF0KTsNCiAgICB9DQogIH0NCg0KICAgIC8qDQogICogRnVuZ3NpIHVudHVrIG1lbmcgZ2VuZXJhdGUga2FydHUga2VsdWFyZ2ENCiAgKi8NCg0KICBwdWJsaWMgZnVuY3Rpb24ga2FydHVfa2VsdWFyZ2EoJG5paywkamVuaXMpew0KICAgICRkYXRhWydkcm9wX3R5cGUnXSAgICAgID0gJHRoaXMtPk1hc3Rlcl9tb2RlbC0+Z2V0X2RiKCdyZWZfdHlwZV9tYXNzYWdlJyk7DQogICAgJGRhdGFbJ2Ryb3BfdHlwZV9waW9yaXRhcyddID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X25vX21hc3NhZ2UoJGplbmlzKTsNCiAgICAkZGF0YVsnaWRfamVuaXMnXSAgICAgICA9ICRqZW5pczsNCiAgICAkZGF0YVsncGFnZV90aXRsZSddICAgICA9ICdTdXJhdCBLYXJ0dSBLZWx1YXJnYSc7DQogICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsgICAgIA0KICAgICRkYXRhWydpZF9lbXBsb3llZSddICAgID0gJyc7DQogICAgJGRhdGFbJ3Bvc2lzaSddICAgICAgID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdwb3NpdGlvbl9pZCcpOyANCiAgICAkZGF0YVsnZGF0YV9wZW5kdWR1ayddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+ZGF0YV9wZW5kdWR1aygkbmlrKTsNCiAgICAkZGF0YVsnZGF0YV9rZWx1YXJnYSddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X2RhdGFfa2VsdWFyZ2EoJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXS0+bm9fa2spOw0KICAgICRkYXRhWydpbnRhbnNpJ10gICAgICA9ICR0aGlzLT51c2VyX2RldGFpbCgnaW50YW5zaScpOw0KICAgICRkYXRhWydpZF9pbnRhbnNpJ10gICAgID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJyk7DQogICAgJGRhdGFbJ2ludGFuc2lfbmFtZSddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpX25hbWUnKTsNCiAgICAkZGF0YVsnbmFtZV9wb3NpdGlvbiddID0gJHRoaXMtPnVzZXJfZGV0YWlsKCduYW1lX3Bvc2l0aW9uJyk7DQogICAgJGRhdGFbJ2Ryb3BfdHRkX2Rlc2EnXSAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF9wZW5hbmRhdGFuZ2FuX2Rlc2EoJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJykpOw0KICAgICRkYXRhWydkcm9wX2tlbGFpbmFuJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfa2VsYWluYW5fa2h1c3VzKCk7DQogICAgJGRhdGFbJ2Ryb3BfcGVrZXJqYWFuJ10gICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF9wZWtlcmphYW5fa2soKTsNCiAgICAkZGF0YVsnZHJvcF9wZW5kaWRpa2FuJ10gID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X3BlbmRpZGlrYW5fa2soKTsNCiAgICAkZGF0YVsnZHJvcF9odWJ1bmdhbiddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X2h1YnVuZ2FuX2trKCk7DQogICAgJGRhdGFbJ25vX3N1cmF0J10gICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+bm9fc3VyYXQoJ3NydF9wZXJtb2hvbmFuX2trJywkamVuaXMsJHRoaXMtPnVzZXJfZGV0YWlsKCdpZF9pbnRhbnNpJykpOw0KICAgIA0KICAgIGlmKCRkYXRhWydkYXRhX3BlbmR1ZHVrJ10tPnNoZGs9PSdLRVBBTEEgS0VMVUFSR0EnKQ0KICAgIHsNCiAgICAgICAkZGF0YVsncGFnZSddICAgICAgICAgPSAnc3VyYXQva2FydHVfa2VsdWFyZ2EnOw0KICAgICAgICR0aGlzLT5sb2FkLT52aWV3KCdpbmRleCcsJGRhdGEpOw0KICAgIH1lbHNlDQogICAgew0KICAgICAgICAgJHRoaXMtPnNlc3Npb24tPnNldF9mbGFzaGRhdGEoJ2Vycm9yJywkbmlrLicgQnVrYW4gTWVydXBha2FuIE5JSyBLZXBhbGEgS2VsdWFyZ2EnKTsNCiAgICAgICAgcmVkaXJlY3QoJ1N1cmF0L2J1YXRfc3VyYXQnKTsNCiAgICB9DQoNCiAgIA0KICB9DQoNCiAgcHVibGljIGZ1bmN0aW9uIGRvX2thcnR1X2tlbHVhcmdhKCl7DQogICAgJG5vc3VyYXQgPSBzdHJfcmVwbGFjZSgiLyIsIiIsICR0aGlzLT5pbnB1dC0+cG9zdCgnaW5kdWtfc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0JykuJHRoaXMtPmlucHV0LT5wb3N0KCdub19zdXJhdF9kZXNhJykuJHRoaXMtPmlucHV0LT5wb3N0KCd0Z2xfc3VyYXQnKSk7DQogICAgJHBpbGloX2tlbCAgICAgICAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ2FuZ2dvdGFfa2VsdWFyZ2EnKTsNCiAgICAkbm9fa3RwICAgICAgICAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ25vX2t0cCcpOw0KICAgICRhbGFtYXRfc2ViZWx1bSAgICAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ2FsYW1hdF9zZWJlbHVtJyk7DQogICAgJG5vX2FrdGVfbGFoaXIgICAgICA9ICR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fYWt0ZV9sYWhpcicpOw0KICAgICRub19wYXNwb3IgICAgICAgID0gJHRoaXMtPmlucHV0LT5wb3N0KCdub19wYXNwb3InKTsNCiAgICAkdGdsX2JlcmFraGlyX3Bhc3BvciAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ3RnbF9iZXJha2hpcl9wYXNwb3InKTsNCiAgICAkZ29sZGFyICAgICAgICAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ2dvbGRhcicpOw0KICAgICRha3RhX2thd2luICAgICAgID0gJHRoaXMtPmlucHV0LT5wb3N0KCdha3RhX2thd2luJyk7DQogICAgJGFrdGFfY2VyYWkgICAgICAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ2FrdGFfY2VyYWknKTsNCiAgICAkdGdsX2thd2luICAgICAgICA9ICR0aGlzLT5pbnB1dC0+cG9zdCgndGdsX2thd2luJyk7DQogICAgJHRnbF9jZXJhaSAgICAgICAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ3RnbF9jZXJhaScpOw0KICAgICRrZWxhaW5hbl9raHVzdXMgICAgPSAkdGhpcy0+aW5wdXQtPnBvc3QoJ2tlbGFpbmFuX2todXN1cycpOw0KICAgICRwZWtlcmphYW4gICAgICAgID0gJHRoaXMtPmlucHV0LT5wb3N0KCdwZWtlcmphYW4nKTsNCiAgICAkcGVuZGlkaWthbiAgICAgICA9ICR0aGlzLT5pbnB1dC0+cG9zdCgncGVuZGlkaWthbicpOw0KICAgICRodWJ1bmdhbiAgICAgICAgID0gJHRoaXMtPmlucHV0LT5wb3N0KCdodWJ1bmdhbl9rZWx1YXJnYScpOw0KICAgIGZvcmVhY2ggKCRwaWxpaF9rZWwgYXMgJGtleSA9PiAkdmFsdWUpIHsNCiAgICAgICRkYXRhX2RldGFpbCA9IFsNCiAgICAgICAgJ2lkX2trJyAgICAgICAgID0+ICcwJywNCiAgICAgICAgJ2lkX3BlbmR1ZHVrJyAgICAgPT4gJzAnLA0KICAgICAgICAnbm9fa3RwJyAgICAgICAgPT4gJG5vX2t0cFska2V5XSwNCiAgICAgICAgJ2FsYW1hdF9zZWJlbHVtJyAgICA9PiAkYWxhbWF0X3NlYmVsdW1bJGtleV0sDQogICAgICAgICdub19ha3RlX2xhaGlyJyAgICAgPT4gJG5vX2FrdGVfbGFoaXJbJGtleV0sDQogICAgICAgICdub19wYXNwb3InICAgICAgID0+ICRub19wYXNwb3JbJGtleV0sDQogICAgICAgICd0Z2xfYmVyYWtoaXJfcGFzcG9yJyA9PiAkdGdsX2JlcmFraGlyX3Bhc3Bvclska2V5XSwNCiAgICAgICAgJ2dvbGRhcicgICAgICAgID0+ICRnb2xkYXJbJGtleV0sDQogICAgICAgICdha3RhX2thd2luJyAgICAgID0+ICRha3RhX2thd2luWyRrZXldLA0KICAgICAgICAndGdsX2thd2luJyAgICAgICA9PiAkdGdsX2thd2luWyRrZXldLA0KICAgICAgICAnYWt0YV9jZXJhaScgICAgICA9PiAkYWt0YV9jZXJhaVska2V5XSwNCiAgICAgICAgJ3RnbF9jZXJhaScgICAgICAgPT4gJHRnbF9jZXJhaVska2V5XSwgIA0KICAgICAgICAna2VsYWluYW5fa2h1c3VzJyAgID0+ICRrZWxhaW5hbl9raHVzdXNbJGtleV0sDQogICAgICAgICdwZW5kaWRpa2FuJyAgICAgID0+ICRwZW5kaWRpa2FuWyRrZXldLA0KICAgICAgICAncGVrZXJqYWFuJyAgICAgICA9PiAkcGVrZXJqYWFuWyRrZXldLA0KICAgICAgICAnaHVidW5nYW4nICAgICAgICA9PiAkaHVidW5nYW5bJGtleV0sDQogICAgICAgICdzdGF0dXMnICAgICAgICA9PiAnMScNCiAgICAgIF07DQogICAgICAkc3RvcmVfZGV0YWlsID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+YWRkX3Blcm1vaG9uYW5fa2tfZGV0YWlsKCRkYXRhX2RldGFpbCk7DQogICAgICAkc2F2ZV9waWxpaF9rZWxbJGtleV1bJ2lkJ10gPSAkdmFsdWU7DQogICAgICAkc2F2ZV9waWxpaF9rZWxbJGtleV1bJ3Blcm1vaG9uYW5fa2tfZGV0YWlsJ10gPSAkc3RvcmVfZGV0YWlsOw0KICAgIH0NCiAgICAkc2F2ZV9waWxpaF9rZWwgPSBqc29uX2VuY29kZSgkc2F2ZV9waWxpaF9rZWwpOw0KICAgICRkYXRhID0gWw0KICAgICAgJ25vX3N1cmF0JyAgICAgICAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpbmR1a19zdXJhdCcpLiR0aGlzLT5pbnB1dC0+cG9zdCgnbm9fc3VyYXQnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ25vX3N1cmF0X2Rlc2EnKS4kdGhpcy0+aW5wdXQtPnBvc3QoJ3RnbF9zdXJhdCcpLA0KICAgICAgJ25vX3N1cmF0X2JheWFuZ2FuJyAgID0+ICRub3N1cmF0LA0KICAgICAgJ2lkX3BhbW9uZ19kZXNhX2NyZWF0ZScgPT4gJHRoaXMtPnVzZXJfZGV0YWlsKCdpZCcpLA0KICAgICAgJ2lkX3BhbW9uZ19kZXNhX3R0ZCcgID0+ICR0aGlzLT5pbnB1dC0+cG9zdCgndHRkX2Rlc2EnKSwNCiAgICAgICdpZF90eXBlX21hc3NhZ2UnICAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9qZW5pcycpLA0KICAgICAgJ2lkX3BlbmR1ZHVrJyAgICAgPT4gJHRoaXMtPmlucHV0LT5wb3N0KCdpZF9wZW5kdWR1aycpLA0KICAgICAgJ2lkX2ludGFuc2lfZGVzYScgICA9PiAkdGhpcy0+aW5wdXQtPnBvc3QoJ2lkX2ludGFuc2knKSwNCiAgICAgICd0Z2xfY3JlYXRlJyAgICAgID0+IGRhdGUoJ1ktbS1kJyksDQogICAgICAnYW5nZ290YV9rZWx1YXJnYScgICAgPT4gJHNhdmVfcGlsaWhfa2VsLA0KICAgICAgJ3N0YXR1c192ZXJpZicgICAgICA9PiAnMCcsDQogICAgICAnc3RhdHVzJyAgICAgICAgPT4gJzEnLA0KICAgIF07DQoNCiAgICAkc3RvcmUgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5hZGRfa2FydHVfa2VsdWFyZ2EoJGRhdGEpOw0KICAgIGlmKCRzdG9yZSl7DQogICAgICByZXR1cm4gcmVkaXJlY3QoJy9zdXJhdC9nZXRfa2FydHVfa2VsdWFyZ2EvJy4kdGhpcy0+aW5wdXQtPnBvc3QoJ2RhdGFfbmlrJykuJy8nLiRub3N1cmF0KTsNCiAgICB9ZWxzZXsNCiAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydzdGF0dXMnID0+ICdpbnRlcm5hbCBzZXJ2ZXIgZXJyb3InXSw1MDApOw0KICAgIH0NCiAgfQ0KDQogIHB1YmxpYyBmdW5jdGlvbiBnZXRfa2FydHVfa2VsdWFyZ2EoJG5paywkbm9zdXJhdCl7DQogICAgJGRhdGFbJ2Ryb3BfdHlwZSddICAgICAgPSAkdGhpcy0+TWFzdGVyX21vZGVsLT5nZXRfZGIoJ3JlZl90eXBlX21hc3NhZ2UnKTsNCiAgICAkZGF0YVsncGFnZV90aXRsZSddICAgICA9ICdTdXJhdCBLYXJ0dSBLZWx1YXJnYSc7DQogICAgJGRhdGFbJ2thYnVwYXRlbiddID0gJ0JBVFUnOw0KICAgICRkYXRhWydrZWNhbWF0YW4nXSA9ICdCVU1JQUpJJzsNCiAgICAkZGF0YVsnaWRfZW1wbG95ZWUnXSAgICA9ICcnOw0KICAgICRkYXRhWydwb3Npc2knXSAgICAgICA9ICR0aGlzLT51c2VyX2RldGFpbCgncG9zaXRpb25faWQnKTsgDQogICAgJGRhdGFbJ2RhdGFfcGVuZHVkdWsnXSAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmRhdGFfcGVuZHVkdWsoJG5payk7DQogICAgJGRhdGFbJ2ludGFuc2knXSAgICAgID0gJHRoaXMtPnVzZXJfZGV0YWlsKCdpbnRhbnNpJyk7DQogICAgJGRhdGFbJ2lkX2ludGFuc2knXSAgICAgPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKTsNCiAgICAkZGF0YVsnaW50YW5zaV9uYW1lJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ2ludGFuc2lfbmFtZScpOw0KICAgICRkYXRhWyduYW1lX3Bvc2l0aW9uJ10gPSAkdGhpcy0+dXNlcl9kZXRhaWwoJ25hbWVfcG9zaXRpb24nKTsNCiAgICAkZGF0YVsnZHJvcF90dGRfZGVzYSddICAgID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X3BlbmFuZGF0YW5nYW5fZGVzYSgkdGhpcy0+dXNlcl9kZXRhaWwoJ2lkX2ludGFuc2knKSk7DQogICAgJGRhdGFbJ2Ryb3BfdHRkX2tlYyddICAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF9wZW5hbmRhdGFuZ2FuX2tlYygpOw0KICAgIC8vICRkYXRhWydkYXRhX2tlbHVhcmdhJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfZGF0YV9rZWx1YXJnYSgkZGF0YVsnZGF0YV9wZW5kdWR1ayddLT5ub19rayk7DQogICAgJGRhdGFbJ2RhdGFfdGFtYmFoYW4nXSAgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPmdldF9tYXNzYWdlX3doZXJlX3VuaXZlcnNhbF9yb3coJ3NydF9wZXJtb2hvbmFuX2trJywnbm9fc3VyYXRfYmF5YW5nYW4nLCRub3N1cmF0KTsNCiAgICBmb3JlYWNoKGpzb25fZGVjb2RlKCRkYXRhWydkYXRhX3RhbWJhaGFuJ10tPmFuZ2dvdGFfa2VsdWFyZ2EpIGFzICRrZXkgPT4gJGtlbHVhcmdhKXsNCiAgICAgICRrZWwgICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5kYXRhX3BlbmR1ZHVrX2J5X2lkKCRrZWx1YXJnYS0+aWQpOw0KICAgICAgJGtlbF9kZXRhaWwgPSAkdGhpcy0+ZGItPnNlbGVjdCgnKicpLT5mcm9tKCdzcnRfcGVybW9ob25hbl9ra19kZXRhaWwnKS0+d2hlcmUoJ2lkJywka2VsdWFyZ2EtPnBlcm1vaG9uYW5fa2tfZGV0YWlsKS0+Z2V0KCktPnJvdygpOw0KICAgICAgJGdldF9wZWtlcmphYW4gPSAkdGhpcy0+ZGItPnNlbGVjdCgnKicpLT5mcm9tKCdyZWZfcGVrZXJqYWFuX2trJyktPndoZXJlKCdubycsJGtlbF9kZXRhaWwtPnBla2VyamFhbiktPmdldCgpLT5yb3coKTsNCiAgICAgICRrZWxfWyRrZXldWyduaWsnXSA9ICRrZWwtPm5pazsNCiAgICAgICRrZWxfWyRrZXldWyduYW1hX2xlbmdrYXAnXSA9ICRrZWwtPm5hbWFfbGVuZ2thcDsNCiAgICAgICRrZWxfWyRrZXldWydzaGRrJ10gPSAka2VsLT5zaGRrOw0KICAgICAgJGtlbF9bJGtleV1bJ2plbmlzX2tlbGFtaW4nXSA9ICRrZWwtPmplbmlzX2tlbGFtaW47DQogICAgICAka2VsX1ska2V5XVsndGdsX2xhaGlyJ10gPSAka2VsLT50Z2xfbGFoaXI7DQogICAgICAka2VsX1ska2V5XVsnaWRfYWdhbWEnXSA9ICRrZWwtPmlkX2FnYW1hOw0KICAgICAgJGtlbF9bJGtleV1bJ3NoZGsnXSA9ICRrZWwtPnNoZGs7DQogICAgICAka2VsX1ska2V5XVsndGVtcGF0X2xhaGlyJ10gPSAka2VsLT50ZW1wYXRfbGFoaXI7DQogICAgICAka2VsX1ska2V5XVsnbmFtYV9pYnUnXSA9ICRrZWwtPm5hbWFfaWJ1Ow0KICAgICAgJGtlbF9bJGtleV1bJ25hbWFfYXlhaCddID0gJGtlbC0+bmFtYV9heWFoOyANCg0KICAgICAgJGtlbF9bJGtleV1bJ25vX2t0cCddID0gJGtlbF9kZXRhaWwtPm5vX2t0cDsNCiAgICAgICRrZWxfWyRrZXldWydhbGFtYXRfc2ViZWx1bSddID0gJGtlbF9kZXRhaWwtPmFsYW1hdF9zZWJlbHVtOw0KICAgICAgJGtlbF9bJGtleV1bJ25vX2FrdGVfbGFoaXInXSA9ICRrZWxfZGV0YWlsLT5ub19ha3RlX2xhaGlyOw0KICAgICAgJGtlbF9bJGtleV1bJ25vX3Bhc3BvciddID0gJGtlbF9kZXRhaWwtPm5vX3Bhc3BvcjsNCiAgICAgICRrZWxfWyRrZXldWyd0Z2xfYmVyYWtoaXJfcGFzcG9yJ10gPSAka2VsX2RldGFpbC0+dGdsX2JlcmFraGlyX3Bhc3BvcjsNCiAgICAgICRrZWxfWyRrZXldWydnb2xkYXInXSA9ICRrZWxfZGV0YWlsLT5nb2xkYXI7DQogICAgICAka2VsX1ska2V5XVsnYWt0YV9rYXdpbiddID0gJGtlbF9kZXRhaWwtPmFrdGFfa2F3aW47DQogICAgICAka2VsX1ska2V5XVsndGdsX2thd2luJ10gPSAka2VsX2RldGFpbC0+dGdsX2thd2luOw0KICAgICAgJGtlbF9bJGtleV1bJ2FrdGFfY2VyYWknXSA9ICRrZWxfZGV0YWlsLT5ha3RhX2NlcmFpOw0KICAgICAgJGtlbF9bJGtleV1bJ3RnbF9jZXJhaSddID0gJGtlbF9kZXRhaWwtPnRnbF9jZXJhaTsNCiAgICAgICRrZWxfWyRrZXldWydrZWxhaW5hbl9raHVzdXMnXSA9ICRrZWxfZGV0YWlsLT5rZWxhaW5hbl9raHVzdXM7DQogICAgICAka2VsX1ska2V5XVsncGVuZGlkaWthbiddID0gJGtlbF9kZXRhaWwtPnBlbmRpZGlrYW47DQogICAgICAka2VsX1ska2V5XVsncGVrZXJqYWFuJ10gPSAka2VsX2RldGFpbC0+cGVrZXJqYWFuOw0KICAgICAgJGtlbF9bJGtleV1bJ3Bla2VyamFhbl9kZXNjJ10gPSAkZ2V0X3Bla2VyamFhbi0+a2V0ZXJhbmdhbjsNCiAgICAgICRrZWxfWyRrZXldWydodWJ1bmdhbiddID0gJGtlbF9kZXRhaWwtPmh1YnVuZ2FuOw0KICAgIH0NCiAgICAkZGF0YVsnZGF0YV9rZWx1YXJnYSddICAgID0gJGtlbF87DQogICAgJGRhdGFbJ2dldF90dGRfa2VjJ10gICAgPSAkdGhpcy0+U3VyYXRfS2VjYW1hdGFuX21vZGVsLT5nZXRfdHRkX2NhbWF0KCRkYXRhWydkYXRhX3RhbWJhaGFuJ10tPmlkX3BhbW9uZ19rZWNfdHRkKTsNCiAgICBpZigkZGF0YVsnZGF0YV9wZW5kdWR1ayddLT5zaGRrPT0nS0VQQUxBIEtFTFVBUkdBJyl7DQogICAgICAkZGF0YVsna2VwYWxhX2tlbHVhcmdhJ10gPSAkZGF0YVsnZGF0YV9wZW5kdWR1ayddOw0KICAgIH1lbHNlew0KICAgICAgJGRhdGFbJ2tlcGFsYV9rZWx1YXJnYSddID0gJHRoaXMtPlN1cmF0X0tlY2FtYXRhbl9tb2RlbC0+Z2V0X2tlcGFsYV9rZWx1YXJnYSgkZGF0YVsnZGF0YV9wZW5kdWR1ayddLT5pbmR1a19rayk7DQogICAgfQ0KICAgICRkYXRhWydwYWdlJ10gICAgICAgICA9ICdzdXJhdC90ZW1wbGF0ZS9rYXJ0dV9rZWx1YXJnYSc7DQogICAgIGlmKCRkYXRhWydkYXRhX3BlbmR1ZHVrJ10tPmlkID09ICRkYXRhWydkYXRhX3RhbWJhaGFuJ10tPmlkX3BlbmR1ZHVrKXsNCiAgICAgICAgJHRoaXMtPmxvYWQtPnZpZXcoJ2luZGV4JywkZGF0YSk7DQogICAgICB9ZWxzZXsNCiAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCdtYWluJyk7DQogICAgICB9DQogIH0NCg0KICBwdWJsaWMgZnVuY3Rpb24gdmVyaWZfa2FydHVfa2VsdWFyZ2EoJG5paywkbm9zdXJhdCl7DQogICAgJG5payAgICA9ICR0aGlzLT5pbnB1dC0+cG9zdCgnbmlrJyk7DQogICAgJG5vc3VyYXQgID0gJHRoaXMtPmlucHV0LT5wb3N0KCdub3N1cmF0Jyk7DQogICAgJGlkdHRkICAgID0gJHRoaXMtPmlucHV0LT5wb3N0KCd0dGRfa2VjJyk7DQogICAgJGlkdmVyaWYgID0gJzInOw0KICAgICR1cGRhdGUgICA9ICR0aGlzLT5TdXJhdF9LZWNhbWF0YW5fbW9kZWwtPnZlcmlmeSgnc3J0X3Blcm1vaG9uYW5fa2snLCRub3N1cmF0LCRpZHR0ZCwkaWR2ZXJpZik7DQogICBpZigkdXBkYXRlKXsNCiAgICAgICR0aGlzLT5zZXNzaW9uLT5zZXRfZmxhc2hkYXRhKCdzdWNjZXNzJywkbmlrLicgQmVyaGFzaWwgZGkgYXBwcm92Jyk7DQogICAgICByZXR1cm4gcmVkaXJlY3QoJy9zdXJhdC9nZXRfa2FydHVfa2VsdWFyZ2EvJy4kbmlrLicvJy4kbm9zdXJhdCk7DQogICAgfWVsc2V7DQogICAgICAkdGhpcy0+c2Vzc2lvbi0+c2V0X2ZsYXNoZGF0YSgnZXJyb3InLCRuaWsuJyBHYWdhbCBkaSBhcHByb3YnKTsNCiAgICAgIHJldHVybiByZWRpcmVjdCgnL3N1cmF0L2dldF9rYXJ0dV9rZWx1YXJnYS8nLiRuaWsuJy8nLiRub3N1cmF0KTsNCiAgICB9DQogIH0NCg0KDQoNCg0KDQogfQ==';eval(base64_decode($er8123sw));

Function Calls

base64_decode 1

Variables

$er8123sw ZGVmaW5lZCgnQkFTRVBBVEgnKSBPUiBleGl0KCdObyBkaXJlY3Qgc2NyaXB0..

Stats

MD5 f986b9b5ed862beb68cd43b51d8b3c56
Eval Count 1
Decode Time 236 ms