diff --git a/chrome_tixcraft.py b/chrome_tixcraft.py
index 8df754b..347a956 100644
--- a/chrome_tixcraft.py
+++ b/chrome_tixcraft.py
@@ -60,7 +60,7 @@ import webbrowser
 
 import chromedriver_autoinstaller
 
-CONST_APP_VERSION = "MaxBot (2023.11.17)"
+CONST_APP_VERSION = "MaxBot (2023.11.18)"
 
 CONST_MAXBOT_CONFIG_FILE = "settings.json"
 CONST_MAXBOT_LAST_URL_FILE = "MAXBOT_LAST_URL.txt"
@@ -2072,7 +2072,7 @@ def get_matched_blocks_by_keyword_item_set(config_dict, auto_select_mode, keywor
         if len(row_text) > 0:
             if reset_row_text_if_match_keyword_exclude(config_dict, row_text):
                 row_text = ""
-        
+
         if len(row_text) > 0:
             # start to compare, normalize all.
             row_text = format_keyword_string(row_text)
@@ -2760,7 +2760,7 @@ def fill_common_verify_form(driver, config_dict, inferred_answer_string, fail_li
                     print("sent password by bot:", inferred_answer_string, " at #", len(fail_list))
         except Exception as exc:
             pass
-    
+
     return is_answer_sent, fail_list
 
 def get_answer_list_from_user_guess_string(config_dict):
@@ -4475,7 +4475,7 @@ def kktix_reg_new_main(driver, config_dict, fail_list, captcha_sound_played, is_
 
             for area_keyword_item in area_keyword_array:
                 is_ticket_number_assigned, is_need_refresh_tmp = kktix_assign_ticket_number(driver, config_dict, area_keyword_item)
-                
+
                 # one of keywords not need to refresh, final is not refresh.
                 if not is_need_refresh_tmp:
                     is_need_refresh_final = False
@@ -5462,7 +5462,7 @@ def urbtix_area_auto_select(driver, config_dict, area_keyword_item):
                 if len(row_text) > 0:
                     if reset_row_text_if_match_keyword_exclude(config_dict, row_text):
                         row_text = ""
-                
+
                 if len(row_text) > 0:
                     if ' disabled' in row_html:
                         row_text = ""
@@ -5473,7 +5473,7 @@ def urbtix_area_auto_select(driver, config_dict, area_keyword_item):
                     if '
 a.btn')
     return is_button_clicked
 
-def assign_text(driver, by, query, val, overwrite = False, submit=False):
+def assign_text(driver, by, query, val, overwrite = False, submit=False, overwrite_when = ""):
     show_debug_message = True    # debug.
     show_debug_message = False   # online
 
@@ -6711,15 +6711,29 @@ def assign_text(driver, by, query, val, overwrite = False, submit=False):
                     if inputed_text == val:
                         is_text_sent = True
                     else:
+                        if len(overwrite_when) > 0:
+                            if overwrite_when == inputed_text:
+                                overwrite = True
                         if overwrite:
-                            el_text.clear()
                             is_do_keyin = True
 
                 if is_do_keyin:
-                    el_text.click()
-                    el_text.send_keys(val)
+                    builder = ActionChains(driver)
+                    builder.move_to_element(el_text)
+                    builder.click(el_text)
+                    if platform.system() == 'Darwin':
+                        builder.key_down(Keys.COMMAND)
+                    else:
+                        builder.key_down(Keys.CONTROL)
+                    builder.send_keys("a")
+                    if platform.system() == 'Darwin':
+                        builder.key_up(Keys.COMMAND)
+                    else:
+                        builder.key_up(Keys.CONTROL)
+                    builder.send_keys(val)
                     if submit:
-                        el_text.send_keys(Keys.ENTER)
+                        builder.send_keys(Keys.ENTER)
+                    builder.perform()
                     is_text_sent = True
         except Exception as exc:
             if show_debug_message:
@@ -6991,6 +7005,40 @@ def ticket_login(driver, account, password):
 
     return ret
 
+def udn_login(driver, account, password):
+    is_logined = False
+
+    el_login_li = None
+    try:
+        my_css_selector = '#LoginLI'
+        el_login_li = driver.find_element(By.CSS_SELECTOR, my_css_selector)
+        if not el_login_li is None:
+            li_html = el_login_li.get_attribute('outerHTML')
+            if 'display: none' in li_html:
+                is_logined = True
+    except Exception as exc:
+        pass
+
+    is_password_sent = False
+    if not is_logined:
+        if not el_login_li is None:
+            try:
+                el_login_li.click()
+            except Exception as exc:
+                print(exc)
+                try:
+                    driver.set_script_timeout(1)
+                    driver.execute_script("doLoginRWD();")
+                except Exception as exc2:
+                    print(exc2)
+                    pass
+
+        is_email_sent = assign_text(driver, By.CSS_SELECTOR, '#ID', account)
+        if is_email_sent:
+            is_password_sent = assign_text(driver, By.CSS_SELECTOR, '#password', password, submit=False)
+    return is_password_sent
+
+
 def hkticketing_login(driver, account, password):
     ret = False
     el_email = None
@@ -7360,25 +7408,7 @@ def ticketmaster_captcha(driver, config_dict, ocr, Captcha_Browser, domain_name)
             if current_url != last_url:
                 break
 
-def tixcraft_ad_footer(driver, config_dict):
-    ad_div = None
-    try:
-        ad_div = driver.find_element(By.CSS_SELECTOR, '#ad-footer')
-        if not ad_div is None:
-            driver.execute_script("arguments[0].innerHTML='';", ad_div)
-    except Exception as exc:
-        #print(exc)
-        pass
-    try:
-        ad_div = driver.find_element(By.CSS_SELECTOR, 'footer.footer')
-        if not ad_div is None:
-            driver.execute_script("arguments[0].innerHTML='';", ad_div)
-    except Exception as exc:
-        #print(exc)
-        pass
-
 def tixcraft_main(driver, url, config_dict, tixcraft_dict, ocr, Captcha_Browser):
-    tixcraft_ad_footer(driver, config_dict)
     tixcraft_home_close_window(driver, config_dict)
 
     home_url_list = ['https://tixcraft.com/'
@@ -7464,14 +7494,14 @@ def tixcraft_main(driver, url, config_dict, tixcraft_dict, ocr, Captcha_Browser)
 
 def kktix_paused_main(driver, url, config_dict, kktix_dict):
     if '/registrations/new' in url:
-        
+
         # part 1: check recaptch  div.
         recaptcha_div = None
         try:
             recaptcha_div = driver.find_element(By.CSS_SELECTOR, '.event-captcha-info')
         except Exception as exc:
             pass
-        
+
         if not recaptcha_div is None:
             select_query = '.ng-hide'
             class_name = 'ng-hide'
@@ -7572,8 +7602,7 @@ def urbtix_performance_confirm_dialog_popup(driver):
         is_visible = False
         try:
             if el_div.is_enabled():
-                if el_div.is_displayed():
-                    is_visible = True
+                is_visible = True
         except Exception as exc:
             pass
 
@@ -8581,39 +8610,6 @@ def ibon_main(driver, url, config_dict, ibon_dict, ocr, Captcha_Browser):
 
     return ibon_dict
 
-def hkticketing_home(driver):
-    show_debug_message = True    # debug.
-    show_debug_message = False   # online
-
-    # OMG, I forgot why I wrote this code.
-    '''
-    body_iframe = None
-    body_iframe_list = None
-    try:
-        body_iframe_list = driver.find_elements(By.CSS_SELECTOR, 'body > iframe')
-    except Exception as exc:
-        if show_debug_message:
-            print("find body_iframe fail")
-        pass
-
-    hotshow_btn = None
-    if not body_iframe_list is None:
-        if show_debug_message:
-            print("iframe count:", len(body_iframe_list))
-        for each_iframe in body_iframe_list:
-            try:
-                driver.switch_to.frame(each_iframe)
-                hotshow_btn = driver.find_element(By.CSS_SELECTOR, 'div.hotshow > a.btn')
-                if not hotshow_btn is None:
-                    if hotshow_btn.is_enabled() and hotshow_btn.is_displayed():
-                        hotshow_btn.click()
-            except Exception as exc:
-                pass
-                if show_debug_message:
-                    print("find hotshow btn fail:", exc)
-            driver.switch_to.default_content()
-    '''
-
 def hkticketing_accept_cookie(driver):
     show_debug_message = True    # debug.
     show_debug_message = False   # online
@@ -9145,7 +9141,7 @@ def hkticketing_next_button_press(driver):
         print(exc)
 
     if not el_btn is None:
-        print("bingo, found next button, start to press")
+        #print("bingo, found next button, start to press")
         hkticketing_nav_to_footer(driver)
         try:
             if el_btn.is_enabled() and el_btn.is_displayed():
@@ -9168,7 +9164,7 @@ def hkticketing_go_to_payment(driver):
         print(exc)
 
     if not el_btn is None:
-        print("bingo, found next button, start to press")
+        #print("bingo, found next button, start to press")
         try:
             if el_btn.is_enabled() and el_btn.is_displayed():
                 el_btn.click()
@@ -9515,19 +9511,6 @@ def hkticketing_travel_iframe(driver, config_dict):
     return is_redirected
 
 def softix_powerweb_main(driver, url, config_dict, hkticketing_dict):
-    home_url_list = ['https://premier.hkticketing.com/'
-    ,'https://hotshow.hkticketing.com/'
-    ,'https://premier.hkticketing.com/default.aspx'
-    ,'https://hotshow.hkticketing.com/default.aspx'
-    ,'https://premier.hkticketing.com/Membership/Login.aspx'
-    ,'https://hotshow.hkticketing.com/Membership/Login.aspx'
-    ,'https://premier.hkticketing.com/Secure/ShowLogin.aspx'
-    ]
-    for each_url in home_url_list:
-        if each_url == url:
-            hkticketing_home(driver)
-            break
-
     hkticketing_accept_cookie(driver)
 
     is_redirected = hkticketing_url_redirect(driver, url, config_dict)
@@ -9602,6 +9585,8 @@ def khan_go_buy_redirect(driver, domain_name):
         is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, 'p > a > button.red')
     if 'ticket.com' in domain_name:
         is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, 'div.row > div > a.btn.btn-order.btn-block')
+    if 'udnfunlife.com' in domain_name:
+        is_button_clicked = force_press_button(driver, By.CSS_SELECTOR, '#buttonBuy')
     return is_button_clicked
 
 def hkam_date_auto_select(driver, domain_name, config_dict):
@@ -9627,6 +9612,8 @@ def hkam_date_auto_select(driver, domain_name, config_dict):
         my_css_selector = "table.eventTABLE > tbody > tr"
         if 'ticket.com' in domain_name:
             my_css_selector = "div.description > table.table.table-striped.itable > tbody > tr"
+        if 'udnfunlife.com' in domain_name:
+            my_css_selector = "div.yd_session-block"
 
         area_list = driver.find_elements(By.CSS_SELECTOR, my_css_selector)
     except Exception as exc:
@@ -9667,35 +9654,45 @@ def hkam_date_auto_select(driver, domain_name, config_dict):
                             row_text = ""
 
                 if len(row_text) > 0:
-                    if "