Index: branches/testa-single-bookmark/js/build.js
===================================================================
--- branches/testa-single-bookmark/js/build.js	(revision 66)
+++ branches/testa-single-bookmark/js/build.js	(revision 67)
@@ -1,12 +1,4 @@
 class Build {
     constructor(){
-    }
-
-    set_anchor_url( part, item_name, href, text , kind){
-	if( href === undefined ){
-	    href = ""
-	}
-	Globalx.output_url_listx[text] = href
-	Globalx[part].sidemenu.set_anchor_down_url( item_name, href, text , kind)
     }
 
@@ -18,6 +10,8 @@
 	    const content = textarea.val()
 
-	    this.set_anchor_url( part, Globalx[part].item_name, "", "" , "full")
-	    this.set_anchor_url( part, Globalx[part].item_name, "", "" , "partial")
+	    let words = Globalx[part].item_name.split('.')
+	    let base = words[0]
+	    Globalx[part].sidemenu.set_anchor_url( part, base, "", "" , "full")
+	    Globalx[part].sidemenu.set_anchor_url( part, base, "", "" , "partial")
 
 	    Globalx.remotex.upload_file( cmd, Globalx.num, part, Globalx[part].key, content , (data) => {
@@ -27,6 +21,6 @@
 		    console.log("partial_download_url=" + obj["partial_download_url"])
 
-		    this.set_anchor_url( part, Globalx[part].item_name, obj["full_download_url"],    Globalx[part].item_name, "full")
-		    this.set_anchor_url( part, Globalx[part].item_name, obj["partial_download_url"], Globalx[part].item_name, "partial")
+		    Globalx[part].sidemenu.set_anchor_url( part, base, obj["full_download_url"],    Globalx[part].item_name, "full")
+		    Globalx[part].sidemenu.set_anchor_url( part, base, obj["partial_download_url"], Globalx[part].item_name, "partial")
 		}
 		else{
Index: branches/testa-single-bookmark/js/main.js
===================================================================
--- branches/testa-single-bookmark/js/main.js	(revision 66)
+++ branches/testa-single-bookmark/js/main.js	(revision 67)
@@ -45,12 +45,25 @@
 }
 
+function set_output_url_listx(text){
+    if( text.match( /{.*}/ ) !== null ){
+	const obj = JSON.parse( text )
+	//console.log("update_all_info_on_host text=" + text )
+	Globalx.output_url_listx = {}
+	obj["htmlfname"].forEach( (item) => {
+	    let words = item.full.split('.')
+	    let base = words[0]
+	    Globalx.output_url_listx[ base ] = {}
+	    Globalx.output_url_listx[ base ].full = `${obj["output_url"]}/${item.full}`
+	    Globalx.output_url_listx[ base ].partial = `${obj["output_url"]}/${item.partial}`
+	    console.log(`${words[0].full}=${ Globalx.output_url_listx[ base ].full }`)
+	    console.log(`${words[0].partial}=${ Globalx.output_url_listx[ base ].partial }`)
+	} )
+	Globalx.storagex.save_as_info_from_globalx()
+    }
+}
+
 async function update_all_info_on_host_async( ) {
-    await Globalx.remotex.get_output_url_listx( Globalx.num , (text) => {
-	if( text.match( /{.*}/ ) !== null ){
-	    const obj = JSON.parse( text )
-//console.log("update_all_info_on_host text=" + text )
-	    Globalx.output_url_listx = obj
-	    Globalx.storagex.save_as_info_from_globalx()
-	}
+    await Globalx.remotex.update_output_url_listx( Globalx.num , (text) => {
+	set_output_url_listx(text)
     } )
 
@@ -86,15 +99,11 @@
 async function get_output_url_listx_async( num ) {
     await Globalx.remotex.get_output_url_listx( num , (text) => {
-	if( text.match( /{.*}/ ) !== null ){
-	    const obj = JSON.parse( text )
-//console.log("update_all_info_on_host text=" + text )
-	    Globalx.output_url_listx = obj
-	    Globalx.storagex.save_as_info_from_globalx()
-	}
+	set_output_url_listx(text)
     } )
 }
+
 async function setup(){
     await get_output_url_listx_async( Globalx.num )
-    await get_output_url( Globalx.num )
+//    await get_output_url( Globalx.num )
 }
 
Index: branches/testa-single-bookmark/js/remotex.js
===================================================================
--- branches/testa-single-bookmark/js/remotex.js	(revision 66)
+++ branches/testa-single-bookmark/js/remotex.js	(revision 67)
@@ -38,4 +38,9 @@
     async get_output_url_listx( num, func) {
 	let param_array = [['cmd', 'get_output_url_listx'] , ['num', num]]
+	await this.fetchx( this.filename , param_array, 2, func )
+    }
+
+    async update_output_url_listx( num, func) {
+	let param_array = [['cmd', 'update_output_url_listx'] , ['num', num]]
 	await this.fetchx( this.filename , param_array, 2, func )
     }
Index: branches/testa-single-bookmark/js/sidemenu.js
===================================================================
--- branches/testa-single-bookmark/js/sidemenu.js	(revision 66)
+++ branches/testa-single-bookmark/js/sidemenu.js	(revision 67)
@@ -83,7 +83,9 @@
 	    Globalx[part].editor.getSession().setValue( "" );
 
+	    let words = Globalx[part].item_name.split('.')
+	    let base = words[0]
 	    $( this.textarea_sel ).val( "" );
-	    this.set_anchor_url( part, Globalx[part].item_name, "", "" , "full")
-	    this.set_anchor_url( part, Globalx[part].item_name, "", "" , "partial")
+	    this.set_anchor_url( part, base, "", "" , "full")
+	    this.set_anchor_url( part, base, "", "" , "partial")
 
 	    if( Globalx[part].key != '/' ){
@@ -128,8 +130,13 @@
 
 	if( jsondata !== undefined && jsondata[Globalx[part].key] !== undefined ){
+	    let words = item_name.split('.')
+	    let base = words[0]
 	    if( jsondata[Globalx[part].key].length == 0 ){
 		Globalx[part].key_indicate_file = true;
 console.log("Globalx[" + part + "].key_indicate_file = " + Globalx[part].key_indicate_file)
-		let url = ""
+		let url = Globalx.output_url_listx[base].full
+console.log( "item_name="+item_name )
+console.log( "base="+base )
+console.log( "url="+url )
 		$( Globalx[part].download_url_sel ).val( Globalx[part].key )
 		$( Globalx[part].download_url_sel ).attr('href' , url )
@@ -142,10 +149,10 @@
 		});
 
-		this.set_anchor_down_url( item_name, Globalx.output_url_listx[item_name], item_name , "full" )
-		this.set_anchor_down_url( item_name, Globalx.output_url_listx[item_name], item_name , "partial" )
+		this.set_anchor_down_url( base, Globalx.output_url_listx[base].full, item_name , "full" )
+		this.set_anchor_down_url( base, Globalx.output_url_listx[base].partial, item_name , "partial" )
 	    }
 	    else{
-		this.set_anchor_url( part, Globalx[part].item_name, "", "" , "full")
-		this.set_anchor_url( part, Globalx[part].item_name, "", "" , "partial")
+		this.set_anchor_url( part, base, "", "" , "full")
+		this.set_anchor_url( part, base, "", "" , "partial")
 	    }
 	}
@@ -184,11 +191,36 @@
     }
 
-    set_anchor_down_url( item_name, href, text , kind ){
+    set_anchor_url( part, base, href, text , kind){
+	if( href === undefined ){
+	    href = ""
+	}
+	if( text === "" ){
+	    Globalx[part].sidemenu.set_anchor_down_url( base, href, text , kind)
+	}
+	else{
+	    let words = text.split('.')
+	    let base = words[0]
+	    if( Globalx.output_url_listx[base] !==  undefined ){
+		Globalx[part].sidemenu.set_anchor_down_url( base, href, text , kind)
+	    }
+	}
+    }
+
+    set_anchor_down_url( base, href, text , kind ){
 	let sel = null
 	if( href === undefined ){
 	    href = ""
 	}
-	Globalx.output_url_listx[item_name] = href
-
+	if( href === "" ){
+	    text = ""
+	}
+	if( text !== "" ){
+	    if( kind == "full" ){
+		Globalx.output_url_listx[base].full = href
+	    }
+	    else{
+		Globalx.output_url_listx[base].partial = href
+	    }
+	}
 	if( kind === "full" ){
 	    sel = this.full_download_url_sel
