# Tinderbox and Hook

**URL:** https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002
**Category:** Discussion & Help
**Created:** [November 26, 2019, 8:06am UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002 "2019-11-26T08:06:18Z")
**Posts on this page:** 18
**Page:** 1

<div class="post-metadata">

### Author: ![LucB](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/lucb/32/2228_2.png) [@LucB](https://discourse.hookproductivity.com/u/LucB)
#### Post date: [November 26, 2019, 8:06am UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/1 "2019-11-26T08:06:18Z")

</div>

We received some requests for Tinderbox support quite a while ago: [Hook with Tinderbox 8](https://discourse.hookproductivity.com/t/hook-with-tinderbox-8/381).

None of us here at CogSci Apps at the time were Tinderbox users. However, Graham has been delving into it, and should have some scripts to share next month.

---

<div class="post-metadata">

### Author: ![RobTrew](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/robtrew/32/212_2.png) [@RobTrew](https://discourse.hookproductivity.com/u/RobTrew)
#### Post date: [November 27, 2019, 3:00pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/2 "2019-11-27T15:00:03Z")

</div>

The native `tinderbox://` url-scheme does _most_ of the work for free,  
but it doesn’t record the **filepath** of the active document.

(It was first conceived for linking within open documents, and any file not open or in the MRU list is hidden to it.).

SO

1. We can usefully capture the `tinderbox://` url itself (possible through osascript in Tinderbox 8), but
2. we also need to append a `?filepath=<encodedurl>` option to it, where `encodedurl` is derived from the file path of the active Tinderbox document.
3. Because of this `?filepath` addition, which is outside the scope of the `tinderbox://` scheme itself, we also need a Hook `Open Item` script, to handle the document finding, giving it a suitable custom scheme name, perhaps `tbx://`

For Name and Address, Hook now allows us to write a single ‘Get Address’ script which returns both Name and Addresss in a markdown `[Name](Address)` format.

As the `Get Address` script needs to percent-encode the file path, and the `Open Item` script needs to decode that url-encoding, JavaScript may be a little more straightforward than AppleScript (JS has built in encode and decode functions).

For example, we can, first for the **Open Item** script:

1. Enter `tbx` in the `Hook:// `…` document-identifier` field at the bottom of the Open Script panel in Hook preferences.
2. Paste in the whole code below, from the `//JavaScript` comment line at the top, which Hook requires to identify the script language, down to `})();` at the end.

```javascript
//JavaScript
(() => {
    'use strict';
    const
        parts = "$0".split(/\?filepath=/),
        tbx = Application('Tinderbox 8');
    return (
        tbx.activate(),
        tbx.open(Path(
            decodeURIComponent(
                parts.slice(-1)[0] // Document filepath.
            )
        )),
        Object.assign(
            Application.currentApplication(), {
                includeStandardAdditions: true
            }
        ).openLocation(
            `tinderbox://${parts[0].split('//')[1]}`
        )
    );
})();

```

 ![22](https://discourse.hookproductivity.com/uploads/default/original/1X/e139c697c79bbfd2669797d911678d4859a9d8d1.jpeg)

and then for the **Get Address** script.

Paste the the whole of the following (again, including `\\JavaScript` at the top, down to `})();` at the end.

```javascript
//JavaScript
(() => {
    'use strict';

    const ds = Application('Tinderbox 8').documents;
    return 0 < ds.length ? (() => {
        const 
            doc = ds.at(0),
            note = doc.selectedNote();
        return null !== note ? (
            `[${note.name()}](${
                'tbx' + note.attributes.byName('NoteURL')
                .value().slice('tinderbox'.length) + 
                '?filepath=' + encodeURIComponent(doc.file().toString())
             })`
        ) : '';
    })() : '';
})();

```

---

<div class="post-metadata">

### Author: ![RobTrew](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/robtrew/32/212_2.png) [@RobTrew](https://discourse.hookproductivity.com/u/RobTrew)
#### Post date: [November 27, 2019, 3:08pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/3 "2019-11-27T15:08:02Z")

</div>

An additional subtlety is the question of whether we want Hook links to restore the Tinderbox **view type** (`map` vs `outline` etc) in addition to the note selection.

In the script above, the TBX NoteURL is read from the corresponding attribute of the selected note. The attribute version of the url always opens a note in **outline** view.

Alternatively, we can obtain a link which remembers view type through a GUI sub-menu in the Tinderbox app: `Note > Copy Note URL`, or with the corresponding key-stroke **^⌥⌘U**.

I personally don’t do this, for two reasons:

1. The attribute route makes for a simpler and more solid script (GUI scripting invites the slings and arrows of uncertain timing),
2. Outline view is the quickest to load, and I find it a good default.

Nevertheless, restoring another view would be perfectly possible, in contexts where it might seem useful, and for earlier versions of Tinderbox (the osacript interface was introduced in ver 8.0), GUI scripting of `Note > Copy Note URL` would in any case be the only option.

---

<div class="post-metadata">

### Author: ![Tom](https://discourse.hookproductivity.com/letter_avatar_proxy/v4/letter/t/3d9bf3/32.png) [@Tom](https://discourse.hookproductivity.com/u/Tom)
#### Post date: [November 27, 2019, 3:32pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/4 "2019-11-27T15:32:28Z")

</div>

Thanks Rob.

Question:  
As I understand it, the scripts above are for the “Open Item” and “Get Address” tinderbox panels in hook under preferences  
What about the “Get Name” panel? Does this remain blank?

Thanks in advance  
Tom

---

<div class="post-metadata">

### Author: ![RobTrew](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/robtrew/32/212_2.png) [@RobTrew](https://discourse.hookproductivity.com/u/RobTrew)
#### Post date: [November 27, 2019, 3:41pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/5 "2019-11-27T15:41:31Z")

</div>

> [@Tom](#):
>
> What about the “Get Name” panel? Does this remain blank?

That’s right – we don’t need a Get Name script if the Get Address script returns a Markdown link pattern which includes a name.

> [@RobTrew](#):
>
> For Name and Address, Hook now allows us to write a single ‘Get Address’ script which returns both Name and Addresss in a markdown `[Name](Address)` format.

---

<div class="post-metadata">

### Author: ![Tom](https://discourse.hookproductivity.com/letter_avatar_proxy/v4/letter/t/3d9bf3/32.png) [@Tom](https://discourse.hookproductivity.com/u/Tom)
#### Post date: [November 27, 2019, 8:52pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/6 "2019-11-27T20:52:47Z")

</div>

Many Thanks Rob for your assistance.

Tom

---

<div class="post-metadata">

### Author: ![RobTrew](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/robtrew/32/212_2.png) [@RobTrew](https://discourse.hookproductivity.com/u/RobTrew)
#### Post date: [November 28, 2019, 1:23am UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/7 "2019-11-28T01:23:56Z")

</div>

For reference, AppleScript equivalents (using the Foundation classes for url encoding and decoding) might look something like:

**Get Address**  
(copy whole script, down to `end encodedPath`)

```auto
use AppleScript version "2.4"
use framework "Foundation"
use scripting additions

on run
    tell application "Tinderbox 8"
        set ds to documents
        if 0 < length of ds then
            set doc to item 1 of ds
            set oFile to file of doc
            
            if missing value is not oFile then
                set fp to my encodedPath(POSIX path of (oFile as alias)) as string
                
                set oNote to selected note of doc
                if missing value is not oNote then
                    set noteURL to (value of (attribute "NoteURL" of oNote)) as string
                    set strURL to (text (1 + (length of "tinderbox")) thru -1 of noteURL)
                    "[" & name of oNote & "](" & "tbx" & strURL & "?filepath=" & fp & ")"
                else
                    ""
                end if
            else
                "[Hook can't link an unsaved file]()"
            end if
        else
            ""
        end if
    end tell
end run

-- GENERIC 
-- https://github.com/RobTrew/prelude-applescript

-- encodedPath :: FilePath -> Percent Encoded String
on encodedPath(fp)
    tell current application
        (its ((NSString's stringWithString:fp)'s ¬
            stringByAddingPercentEncodingWithAllowedCharacters:(its NSCharacterSet's ¬
                URLPathAllowedCharacterSet))) as string
    end tell
end encodedPath

```

**Open Item**  
(Copy whole script, down to `end splitOn`)

```auto
use framework "Foundation"
use scripting additions

on run
    set xs to splitOn("?filePath=", "$0")
    set ys to splitOn("//", item 1 of xs)
    
    tell application "Tinderbox 8"
        activate
        open (my decodedPath(item -1 of xs))
        open location ("tinderbox://" & (item 2 of ys))
    end tell
end run

-- GENERIC
-- https://github.com/RobTrew/prelude-applescript

-- decodedPath :: Percent Encoded String -> FilePath
on decodedPath(fp)
    tell current application
        (its ((NSString's stringWithString:fp)'s ¬
            stringByRemovingPercentEncoding)) as string
    end tell
end decodedPath

-- splitOn :: String -> String -> [String]
on splitOn(pat, src)
    set {dlm, my text item delimiters} to ¬
        {my text item delimiters, pat}
    set xs to text items of src
    set my text item delimiters to dlm
    return xs
end splitOn

```

---

<div class="post-metadata">

### Author: ![grahamb](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/grahamb/32/369_2.png) [@grahamb](https://discourse.hookproductivity.com/u/grahamb)
#### Post date: [December 4, 2019, 6:30pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/8 "2019-12-04T18:30:08Z")

</div>

Those are great scripts, thanks a lot for putting them together @RobTrew

I’m going to add them to Hook as a built in integrations, but there are a few changes I’m making to the URL structure

- removing that semicolon appended to the end of attribute “NoteURL”
- changing the second ? to a &, to match query syntax

e.g. from  
`hook://tbx/file/note?view=outline+select=1575069337;?filepath=/path/file.tbx`  
to  
`hook://tbx/file/note?view=outline+select=1575069337&filepath=/path/file.tbx`

I also changed the script to link to the file if no note is selected

---

<div class="post-metadata">

### Author: ![RobTrew](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/robtrew/32/212_2.png) [@RobTrew](https://discourse.hookproductivity.com/u/RobTrew)
#### Post date: [December 4, 2019, 7:58pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/9 "2019-12-04T19:58:50Z")

</div>

> [@grahamb](#):
>
> removing that semicolon appended to the end of attribute “NoteURL”

The Tinderbox GUI `Note > Copy Note URL` uses that trailing semicolon to get an intercalating separator when several notes are selected:

e.g.

```auto
tinderbox://treeBook-003/?view=outline+select=1557888055;1558033595;1558033590;

```

Perhaps worth going beyond my first sketch to support that (multi-selection) case too ?

---

<div class="post-metadata">

### Author: ![LucB](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/lucb/32/2228_2.png) [@LucB](https://discourse.hookproductivity.com/u/LucB)
#### Post date: [December 4, 2019, 8:23pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/10 "2019-12-04T20:23:33Z")

</div>

On a related note, we are working on Hook working with multi-selection in Finder for early 2020 (which was one of the early enhancement requests for Hook).

---

<div class="post-metadata">

### Author: ![RobTrew](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/robtrew/32/212_2.png) [@RobTrew](https://discourse.hookproductivity.com/u/RobTrew)
#### Post date: [December 4, 2019, 10:32pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/11 "2019-12-04T22:32:00Z")

</div>

> [@RobTrew](#):
>
> Perhaps worth going beyond my first sketch to support that (multi-selection) case too ?

For example, updating both to enable multiple selections and being agnostic about use of either & or ? in the additional string (to avoid breaking any links that people have already made), perhaps sth like:

> **Get Address (and name)**
>
> ```applescript
> use AppleScript version "2.4"
> use framework "Foundation"
> use scripting additions
> 
> -- Rob Trew ver 0.2 
> -- (Enabling restoration of multiple selections - also needs Open Item ver 0.2)
> 
> on run
> tell application "Tinderbox 8"
> set ds to documents
> if 0 < length of ds then
> set doc to item 1 of ds
> set oFile to file of doc
>             
> if missing value is not oFile then
> set fp to my encodedPath(POSIX path of (oFile as alias)) as string
>                 
> set selns to selections of doc
> set intSelns to length of selns
> if 0 < intSelns then
> set firstNote to item 1 of selns
> if 1 < intSelns then
> set strName to name of firstNote & " ETC"
> script go
> on |λ|(x)
> value of attribute "ID" of x
> end |λ|
> end script
> set strOtherIDs to ";" & my intercalate(";", my map(go, rest of selns))
> else
> set strName to name of firstNote
> set strOtherIDs to ""
> end if
> set selnIDs to (value of (attribute "NoteURL" of firstNote)) as string
> set strURL to (text (1 + (length of "tinderbox")) thru -2 of selnIDs)
> "[" & strName & "](" & "tbx" & strURL & strOtherIDs & "&filepath=" & fp & ")"
> else
> ""
> end if
> else
> "[Hook can't link an unsaved file]()"
> end if
> else
> ""
> end if
> end tell
> end run
> 
> -- GENERIC 
> -- https://github.com/RobTrew/prelude-applescript
> 
> -- encodedPath :: FilePath -> Percent Encoded String
> on encodedPath(fp)
> tell current application
> (its ((NSString's stringWithString:fp)'s ¬
> stringByAddingPercentEncodingWithAllowedCharacters:(its NSCharacterSet's ¬
> URLPathAllowedCharacterSet))) as string
> end tell
> end encodedPath
> 
> -- intercalate :: String -> [String] -> String
> on intercalate(delim, xs)
> set {dlm, my text item delimiters} to ¬
> {my text item delimiters, delim}
> set str to xs as text
> set my text item delimiters to dlm
> str
> end intercalate
> 
> -- map :: (a -> b) -> [a] -> [b]
> on map(f, xs)
> -- The list obtained by applying f
> -- to each element of xs.
> tell mReturn(f)
> set lng to length of xs
> set lst to {}
> repeat with i from 1 to lng
> set end of lst to |λ|(item i of xs, i, xs)
> end repeat
> return lst
> end tell
> end map
> 
> -- mReturn :: First-class m => (a -> b) -> m (a -> b)
> on mReturn(f)
> -- 2nd class handler function lifted into 1st class script wrapper. 
> if script is class of f then
> f
> else
> script
> property |λ| : f
> end script
> end if
> end mReturn
> 
> ```

> **Open Item**
>
> ```applescript
> use AppleScript version "2.4"
> use framework "Foundation"
> use scripting additions
> 
> on run
> set xs to splitOn("filePath=", "$0")
> set ys to splitOn("//", item 1 of xs)
>     
> tell application "Tinderbox 8"
> activate
> open (my decodedPath(item -1 of xs))
> open location "tinderbox://" & (item 2 of ys)
> end tell
> end run
> 
> -- GENERIC
> -- https://github.com/RobTrew/prelude-applescript
> 
> -- decodedPath :: Percent Encoded String -> FilePath
> on decodedPath(fp)
> tell current application
> (its ((NSString's stringWithString:fp)'s ¬
> stringByRemovingPercentEncoding)) as string
> end tell
> end decodedPath
> 
> -- quoted :: Char -> String -> String
> on quoted(c, s)
> -- string flanked on both sides
> -- by a specified quote character.
> c & s & c
> end quoted
> 
> -- splitOn :: String -> String -> [String]
> on splitOn(pat, src)
> set {dlm, my text item delimiters} to ¬
> {my text item delimiters, pat}
> set xs to text items of src
> set my text item delimiters to dlm
> return xs
> end splitOn
> 
> ```

---

<div class="post-metadata">

### Author: ![grahamb](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/grahamb/32/369_2.png) [@grahamb](https://discourse.hookproductivity.com/u/grahamb)
#### Post date: [December 6, 2019, 10:21pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/12 "2019-12-06T22:21:43Z")

</div>

> [@RobTrew](#):
>
> Perhaps worth going beyond my first sketch to support that (multi-selection) case too

As Luc mentioned, there are plans to support multi-selection in the near future. We’re going to hold off on supporting any kind of multi-selection in Tinderbox until we can do it in a way which is in line with Hook’s model for it.

Obviously users are welcome and encouraged to use custom scripts such as the ones you’ve written, but Tinderbox’s model of one URL to multiple selected notes is at odds with Hook’s (planned) model which is multiple URLs to multiple selected notes. So it won’t be included in the default integration.

> [@RobTrew](#):
>
> updating both to enable multiple selections and being agnostic about use of either & or ? in the additional string (to avoid breaking any links that people have already made)

After thinking about it I’ve decided to use the same URL structure as you initially designed, with `identifier;?filepath` for Hook’s default integration with Tinderbox

So the only functional changes to the scripts will be

1. Returns a link to the file if no notes are selected
2. Returns nothing if multiple notes are selected, anticipating future multi-selection support

---

<div class="post-metadata">

### Author: ![grahamb](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/grahamb/32/369_2.png) [@grahamb](https://discourse.hookproductivity.com/u/grahamb)
#### Post date: [December 8, 2019, 6:00am UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/14 "2019-12-08T06:00:51Z")

</div>

These are the scripts that we plan to make the Hook default integration

> **Get Address**
>
> Aside from the functional changes mentioned above, this script has been flattened to fail first instead of using nested conditionals. This is an arbitrary stylistic preference.
> 
> ```auto
> use framework "Foundation"
> 
> tell application "Tinderbox 8"
> if (count of documents) is equal to 0 then
> return "No document is available"
> end if
> 	
> set openFile to file of first document
> if openFile is missing value then
> return "Hook can't link unsaved files"
> end if
> 	
> set filePath to my encodedPath(POSIX path of (openFile as alias)) as string
> 	
> set openNote to selected note of first document
> if openNote is missing value then
> -- link to file if no note is selected
> return "file://" & filePath
> end if
> 	
> set tinderboxURL to value of attribute "NoteURL" of openNote
> set tinderboxURL to (text (1 + (length of "tinderbox://")) thru -1 of tinderboxURL)
> set tinderboxURL to "hook://tbx/" & tinderboxURL
> 	
> return tinderboxURL & "?filepath=" & filePath
> end tell
> 
> -- encodedPath :: FilePath -> Percent Encoded String
> on encodedPath(fp)
> tell current application
> (its ((NSString's stringWithString:fp)'s ¬
> stringByAddingPercentEncodingWithAllowedCharacters:(its NSCharacterSet's ¬
> URLPathAllowedCharacterSet))) as string
> end tell
> end encodedPath
> 
> ```

> **Get Name**
>
> I personally favour splitting Get Name and Get Address apart, instead of returning a markdown link, unless there are performance reasons to do them both in one pass, e.g. if scripts rely on simulated menu items or button presses.
> 
> It is “safe” to directly access the selected note which may not exist because the only case this script needs to handle is if it does exist.
> 
> ```auto
> tell application "Tinderbox 8"
> get name of selected note of document 1
> end tell
> 
> ```

> **Open Item**
>
> I believe this is unchanged from the initial script posted by RobTrew
> 
> ```auto
> use framework "Foundation"
> use scripting additions
> 
> set xs to splitOn("?filePath=", "$0")
> 
> set filePath to my decodedPath(item -1 of xs)
> set tinderboxURL to text ((length of "tbx://") + 1) thru -1 of item 1 of xs
> set tinderboxURL to "tinderbox://" & tinderboxURL
> 
> tell application "Tinderbox 8"
> activate
> open filePath
> open location tinderboxURL
> end tell
> 
> -- GENERIC
> -- https://github.com/RobTrew/prelude-applescript
> 
> -- decodedPath :: Percent Encoded String -> FilePath
> on decodedPath(fp)
> tell current application
> (its ((NSString's stringWithString:fp)'s ¬
> stringByRemovingPercentEncoding)) as string
> end tell
> end decodedPath
> 
> -- splitOn :: String -> String -> [String]
> on splitOn(pat, src)
> set {dlm, my text item delimiters} to ¬
> {my text item delimiters, pat}
> set xs to text items of src
> set my text item delimiters to dlm
> return xs
> end splitOn
> 
> ```

---

<div class="post-metadata">

### Author: ![jasonromney](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/jasonromney/32/572_2.png) [@jasonromney](https://discourse.hookproductivity.com/u/jasonromney)
#### Post date: [July 25, 2021, 12:08am UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/15 "2021-07-25T00:08:18Z")

</div>

Might someone be kind enough to point me to the latest information please about how to use Hook with Eastgate Tinderbox v9? I’m basically just looking to discover how to enable this as Hook doesn’t seem, as far as I can tell so far, to have awareness of a Tinderbox note in map or outline view. Thanks in advance.

---

<div class="post-metadata">

### Author: ![wernervp](https://discourse.hookproductivity.com/letter_avatar_proxy/v4/letter/w/34f0e0/32.png) [@wernervp](https://discourse.hookproductivity.com/u/wernervp)
#### Post date: [July 29, 2021, 1:23pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/16 "2021-07-29T13:23:53Z")

</div>

I created a copy of the Tinderbox 8 scripts and changed the “Tinderbox 8” reference to “Tinderbox 9”.

```auto
tell application "Tinderbox 9"

```

You can do this in the Hook preferences and you will have to change the reference in **Open Item** , **Get Name** and **Get Address**.

 ![Screenshot 2021-07-29 at 15.24.27](https://discourse.hookproductivity.com/uploads/default/original/2X/d/d8314ad112403974533aad8afcb41d9d02d0327d.png)

This is needed because main Tinderbox versions can co-exist. @LucB maybe this can be added in the new scripts update?

---

<div class="post-metadata">

### Author: ![LucB](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/lucb/32/2228_2.png) [@LucB](https://discourse.hookproductivity.com/u/LucB)
#### Post date: [July 29, 2021, 8:45pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/17 "2021-07-29T20:45:27Z")

</div>

thank you very much. We’re looking at it.

---

<div class="post-metadata">

### Author: ![LucB](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/lucb/32/2228_2.png) [@LucB](https://discourse.hookproductivity.com/u/LucB)
#### Post date: [July 29, 2021, 10:47pm UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/18 "2021-07-29T22:47:13Z")

</div>

we’ve updated the script server.

---

<div class="post-metadata">

### Author: ![LucB](https://discourse.hookproductivity.com/user_avatar/discourse.hookproductivity.com/lucb/32/2228_2.png) [@LucB](https://discourse.hookproductivity.com/u/LucB)
#### Post date: [February 19, 2022, 1:39am UTC](https://discourse.hookproductivity.com/t/tinderbox-and-hook/1002/19 "2022-02-19T01:39:22Z")

</div>


