
    'ja                        d dl Z d dlmZmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZmZmZ d dlmZmZmZmZmZ  G d de          Z G d	 d
e          Z G d de          Z G d dee          Z G d de          Z G d de          Z G d de          Z G d de          Zh dZ G d de          Z G d de          Z G d de          Z  G d d e          Z!dS )!    N)ABCMetaabstractmethod)ListOptionalSetSequence)extract_json)EnumValidator
JsonObjectJsonValidator)BlockOptionConfirmObjectButtonStylesDynamicSelectElementTypesc            
            e Zd ZdZh dZddddededee         dee         fd	Z ed
          d             Z	de
f fdZ xZS )ActionzAction in attachments
    https://docs.slack.dev/messaging/formatting-message-text/#rich-layouts
    https://docs.slack.dev/legacy/legacy-messaging/legacy-interactive-message-field-guide/#message_action_fields
    >   urlnametextNr   r   r   subtyper   r   c                >    || _         || _        || _        || _        d S N)r   r   r   r   )selfr   r   r   r   s        f/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/slack_sdk/models/attachments/__init__.py__init__zAction.__init__   s$     		    z!name or url attribute is requiredc                 &    | j         d up| j        d uS r   r   r   s    r   name_or_url_presentzAction.name_or_url_present)   s    y$<(<<r   returnc                 \    t                                                      }| j        |d<   |S )Ntype)superto_dictr   r   json	__class__s     r   r&   zAction.to_dict-   s&    ww  |Vr   )__name__
__module____qualname____doc__
attributesstrr   r   r   r!   dictr&   __classcell__r)   s   @r   r   r      s         
 )((J #!    	
 sm c]    ]677= = 87=          r   r   c                        e Zd Ze fd            ZdZddddedededee         d	ee         f
 fd
Z	 e
de d          d             Z ed	e          d             Zdef fdZ xZS )ActionButtonc                 T    t                      j                            ddh          S )Nstylevaluer%   r.   unionr   r)   s    r   r.   zActionButton.attributes4   s#    ww!'''(:;;;r   i  N)confirmr6   r   r   r7   r;   r6   c                z    t                                          ||d           || _        || _        || _        dS )ai  Simple button for use inside attachments

        https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/

        Args:
            name: Name this specific action. The name will be returned to your
                Action URL along with the message's callback_id when this action is
                invoked. Use it to identify this particular response path.
            text: The user-facing label for the message button or menu
                representing this action. Cannot contain markup.
            value: Provide a string identifying this specific action. It will be
                sent to your Action URL along with the name and attachment's
                callback_id . If providing multiple actions with the same name, value
                can be strategically used to differentiate intent. Cannot exceed 2000
                characters.
            confirm: a ConfirmObject that will appear in a dialog to confirm
                user's choice.
            style: Leave blank to indicate that this is an ordinary button. Use
                "primary" or "danger" to mark important buttons.
        button)r   r   r   N)r%   r   r7   r;   r6   )r   r   r   r7   r;   r6   r)   s         r   r   zActionButton.__init__:   s=    : 	dx@@@



r   zvalue attribute cannot exceed  charactersc                 <    t          | j                  | j        k    S r   )lenr7   value_max_lengthr    s    r   value_lengthzActionButton.value_length\   s    4:$"777r   c                 0    | j         d u p| j         t          v S r   )r6   r   r    s    r   style_validzActionButton.style_valid`   s    zT!?TZ<%??r   r"   c                     t                                                      }| j        t          | j        d          |d<   |S )Nactionr;   )r%   r&   r;   r	   r'   s     r   r&   zActionButton.to_dictd   s8    ww  <#*4<BBDOr   )r*   r+   r,   propertyr.   rA   r/   r   r   r   r   rB   r
   r   rD   r0   r&   r1   r2   s   @r   r4   r4   3   s:       < < < < X<  ,0#        	 
   -(  }           D ]Q4DQQQRR8 8 SR8 ]7L))@ @ *)@          r   r4   c                   (     e Zd Zdedef fdZ xZS )ActionLinkButtonr   r   c                P    t                                          ||d           dS )zA simple interactive button that just opens a URL

        https://docs.slack.dev/messaging/formatting-message-text/#rich-layouts

        Args:
          text: text to display on the button, eg 'Click Me!"
          url: the URL to open
        r=   )r   r   r   Nr%   r   )r   r   r   r)   s      r   r   zActionLinkButton.__init__l   s*     	dX>>>>>r   )r*   r+   r,   r/   r   r1   r2   s   @r   rI   rI   k   sK        	? 	?# 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?r   rI   c                        e Zd Z ej        ddh          Zh dZeede	fd                        Z
ddde	d	e	d
ee         f fdZ ede          d             Zdef fdZ xZS )AbstractActionSelectorexternalstatic>   r   r   r$   data_sourcer"   c                     d S r    r    s    r   rP   z"AbstractActionSelector.data_source}   s	     	r   N)selected_optionr   r   rS   c                ^    t                                          ||d           || _        d S )Nselect)r   r   r   )r%   r   rS   )r   r   r   rS   r)   s       r   r   zAbstractActionSelector.__init__   s0    dx@@@.r   rP   c                     | j         | j        v S r   )rP   DataSourceTypesr    s    r   data_source_validz(AbstractActionSelector.data_source_valid   s    4#777r   c                     t                                                      }| j        t          | j        gd          |d<   |S )NrF   selected_options)r%   r&   rS   r	   r'   s     r   r&   zAbstractActionSelector.to_dict   sA    ww  + (4T5I4JH'U'UD#$r   )r*   r+   r,   r   r9   rW   r.   rG   r   r/   rP   r   r   r   r
   rX   r0   r&   r1   r2   s   @r   rM   rM   x   s       5/5z86LMMO888JS    ^ X UY / / / /3 /&AQ / / / / / / ]=/228 8 328          r   rM   )	metaclassc                   >     e Zd ZdZddededee         f fdZ xZS )ActionUserSelectorusersNr   r   selected_userc                 P    t                                          |||           dS )a  Automatically populate the selector with a list of users in the workspace.

        https://docs.slack.dev/legacy/legacy-messaging/legacy-adding-menus-to-messages/#menu_team_members

        Args:
            name: Name this specific action. The name will be returned to your
                Action URL along with the message's callback_id when this action is
                invoked. Use it to identify this particular response path.
            text: The user-facing label for the message button or menu
                representing this action. Cannot contain markup.
            selected_user: An Option object to pre-select as the default
                value.
        r   r   rS   NrK   )r   r   r   r_   r)   s       r   r   zActionUserSelector.__init__   s*     	d}MMMMMr   r   	r*   r+   r,   rP   r/   r   r   r   r1   r2   s   @r   r]   r]      so        KN NS N NHV<L N N N N N N N N N Nr   r]   c                   >     e Zd ZdZddededee         f fdZ xZS )ActionChannelSelectorchannelsNr   r   selected_channelc                 P    t                                          |||           dS )a  
        Automatically populate the selector with a list of public channels in the
        workspace.

        https://docs.slack.dev/legacy/legacy-messaging/legacy-adding-menus-to-messages/#menu_channels

        Args:
            name: Name this specific action. The name will be returned to your
                Action URL along with the message's callback_id when this action is
                invoked. Use it to identify this particular response path.
            text: The user-facing label for the message button or menu
                representing this action. Cannot contain markup.
            selected_channel: An Option object to pre-select as the default
                value.
        ra   NrK   )r   r   r   rf   r)   s       r   r   zActionChannelSelector.__init__   s+      	d?OPPPPPr   r   rb   r2   s   @r   rd   rd      so        KQ QS Q Qx?O Q Q Q Q Q Q Q Q Q Qr   rd   c                   >     e Zd ZdZddededee         f fdZ xZS )ActionConversationSelectorconversationsNr   r   selected_conversationc                 P    t                                          |||           dS )a  
        Automatically populate the selector with a list of conversations they have in
        the workspace.

        https://docs.slack.dev/legacy/legacy-messaging/legacy-adding-menus-to-messages/#menu_conversations

        Args:
            name: Name this specific action. The name will be returned to your
                Action URL along with the message's callback_id when this action is
                invoked. Use it to identify this particular response path.
            text: The user-facing label for the message button or menu
                representing this action. Cannot contain markup.
            selected_conversation: An Option object to pre-select as the default
                value.
        ra   NrK   )r   r   r   rk   r)   s       r   r   z#ActionConversationSelector.__init__   s+      	d?TUUUUUr   r   rb   r2   s   @r   ri   ri      so        !KV VS V VHVDT V V V V V V V V V Vr   ri   c            
            e Zd ZdZedee         f fd            Zddddededee	         d	ee
         f fd
Z xZS )ActionExternalSelectorrN   r"   c                 R    t                      j                            dh          S )Nmin_query_lengthr8   r:   s    r   r.   z!ActionExternalSelector.attributes   s"    ww!'');(<===r   N)rS   rp   r   r   rS   rp   c                ^    t                                          |||           || _        dS )aJ  
        Populate a message select menu from your own application dynamically.

        https://docs.slack.dev/legacy/legacy-messaging/legacy-adding-menus-to-messages/#menu_dynamic

        Args:
            name: Name this specific action. The name will be returned to your
                Action URL along with the message's callback_id when this action is
                invoked. Use it to identify this particular response path.
            text: The user-facing label for the message button or menu
                representing this action. Cannot contain markup.
            selected_option: An Option object to pre-select as the default
                value.
            min_query_length: Specify the number of characters that must be typed
                by a user into a dynamic select menu before dispatching to the app.
        ra   N)r%   r   rp   )r   r   r   rS   rp   r)   s        r   r   zActionExternalSelector.__init__   s2    0 	dOOO 0r   )r*   r+   r,   rP   rG   r   r/   r.   r   r   intr   r1   r2   s   @r   rn   rn      s        K>CH > > > > > X> -1*.1 1 1 1 	1
 "&)1 #3-1 1 1 1 1 1 1 1 1 1r   rn   >   gooddangerwarningc                   L    e Zd Zh dZdddddee         dee         defdZdS )	AttachmentField>   shorttitler7   NTry   r7   rx   ry   r7   rx   c                0    || _         || _        || _        d S r   rz   )r   ry   r7   rx   s       r   r   zAttachmentField.__init__   s     




r   )r*   r+   r,   r.   r   r/   boolr   rR   r   r   rw   rw      sn        ,,,J
  $#	 	 	 }	 }		
 	 	 	 	 	 	r   rw   c            $           e Zd ZU h dZee         ed<   h dZdZdddddddddddddddddde	de
e	         de
ee                  d	e
e	         d
e
ee	                  de
e	         de
e	         de
e	         de
e	         de
e	         de
e	         de
e	         de
e	         de
e	         de
e	         de
e	         de
e         f"dZ ede d          defd            Z ed          defd            Z ed
e          d             Z ed          defd             Z ed!          defd"            Z ed#          defd$            Z ed%          defd&            Zdef fd'Z xZS )(
Attachment>   tsr   colorry   fieldsfooterpretextfallback	image_url	thumb_url
title_linkauthor_iconauthor_linkauthor_namefooter_iconauthor_subnamer   >   r   r   r   i,  Nr   r   r   markdown_inry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   c                    || _         || _        || _        || _        || _        || _        |	| _        |
| _        || _        || _	        || _
        || _        || _        || _        || _        |pg | _        |pg | _        dS )a  
        A supplemental object that will display after the rest of the message.
        Considered legacy - recommended replacement is to use message blocks instead.

        https://docs.slack.dev/legacy/legacy-messaging/legacy-secondary-message-attachments#fields

        Args:
            text: The main body text of the attachment. It can be formatted as
                plain text, or with markdown by including it in the markdown_in
                parameter. The content will automatically collapse if it contains 700+
                characters or 5+ linebreaks, and will display a "Show more..." link to
                expand the content.
            fallback: A plain text summary of the attachment used in clients that
                don't show formatted text (eg. IRC, mobile notifications).
            fields: An array of AttachmentField objects that get displayed in a
                table-like way. For best results, include no more than 2-3 field
                objects.
            color: Changes the color of the border on the left side of this attachment
                from the default gray. Can be any hex color code (eg. #439FE0)
            markdown_in: An array of field names that should be formatted by
                markdown syntax - allowed values: "pretext", "text", "fields"
            title: Large title text near the top of the attachment.
            title_link: A valid URL that turns the title text into a hyperlink.
            pretext: Text that appears above the message attachment block. It can
                be formatted as plain text, or with markdown by including it in the
                markdown_in parameter.
            author_name: Small text used to display the author's name.
            author_subname: Small text used to display the author's sub name.
            author_link: A valid URL that will hyperlink the author_name text.
                Will only work if author_name is present.
            author_icon: A valid URL that displays a small 16px by 16px image to
                the left of the author_name text. Will only work if author_name is
                present.
            image_url: A valid URL to an image file that will be displayed at the
                bottom of the attachment. We support GIF, JPEG, PNG, and BMP formats.
                Large images will be resized to a maximum width of 360px or a maximum
                height of 500px, while still maintaining the original aspect ratio.
                Cannot be used with thumb_url.
            thumb_url: A valid URL to an image file that will be displayed as a
                thumbnail on the right side of a message attachment. We currently
                support the following formats: GIF, JPEG, PNG, and BMP. The thumbnail's
                longest dimension will be scaled down to 75px while maintaining the
                aspect ratio of the image. The filesize of the image must also be less
                than 500 KB. For best results, please use images that are already 75px
                by 75px.
            footer: Some brief text to help contextualize and identify an
                attachment. Limited to 300 characters, and may be truncated further when
                displayed to users in environments with limited screen real estate.
            footer_icon: A valid URL to an image file that will be displayed
                beside the footer text. Will only work if footer is present. We'll
                render what you provide at 16px by 16px. It's best to use an image that
                is similarly sized.
            ts: An integer Unix timestamp that is used to related your attachment
                to a specific time. The attachment will display the additional timestamp
                value as part of the attachment's footer. Your message's timestamp will
                be displayed in varying ways, depending on how far in the past or future
                 it is, relative to the present. Form factors, like mobile versus
                 desktop may also transform its rendered appearance.
        N)r   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   s                     r   r   zAttachment.__init__"  s    ` 	
 $
&,&&""&l&,"r   zfooter attribute cannot exceed r>   r"   c                 N    | j         d u pt          | j                   | j        k    S r   )r   r@   footer_max_lengthr    s    r   footer_lengthzAttachment.footer_length  s&    {d"Pc$+&6&6$:P&PPr   z<ts attribute cannot be present if footer attribute is absentc                 &    | j         d u p| j        d uS r   )r   r   r    s    r   ts_without_footerzAttachment.ts_without_footer  s    w$9$+T"99r   c                 T      j          pt           fd j         D                       S )Nc              3   *   K   | ]}|j         v V  d S r   )MarkdownFields).0er   s     r   	<genexpr>z/Attachment.markdown_in_valid.<locals>.<genexpr>  s+      *^*^10C+C*^*^*^*^*^*^r   )r   allr    s   `r   markdown_in_validzAttachment.markdown_in_valid  s4    ##^s*^*^*^*^TM]*^*^*^'^'^^r   zHcolor attribute must be 'good', 'warning', 'danger', or a hex color codec                 ~    | j         d u p4| j         t          v p&t          j        d| j         t          j                  d uS )Nz^#(?:[0-9A-F]{2}){3}$)r   SeededColorsrematch
IGNORECASEr    s    r   color_validzAttachment.color_valid  sE     J$ Xz\)Xx/R]KKSWW	
r   z?image_url attribute cannot be present if thumb_url is populatedc                 &    | j         d u p| j        d u S r   )r   r   r    s    r   !image_url_and_thumb_url_populatedz,Attachment.image_url_and_thumb_url_populated  s    ~%?4)??r   z'name must be present if link is presentc                 &    | j         d u p| j        d uS r   )r   r   r    s    r   author_link_without_author_namez*Attachment.author_link_without_author_name      4'G4+;4+GGr   z'icon must be present if link is presentc                 &    | j         d u p| j        d uS r   )r   r   r    s    r   author_link_without_author_iconz*Attachment.author_link_without_author_icon  r   r   c                     t                                                      }| j        t          | j                  |d<   | j        r
| j        |d<   |S )Nr   	mrkdwn_in)r%   r&   r   r	   r   r'   s     r   r&   zAttachment.to_dict  sN    ww  ;")$+66DN 	1 $ 0Dr   )r*   r+   r,   r.   r   rw   __annotations__r   r   r/   r   rr   r   r   r|   r   r   r
   r   r   r   r   r   r0   r&   r1   r2   s   @r   r~   r~     sY          J& _%%%%222N #'6:#/3#$(!%%)(,%)%)#'#' $%) '`- `- `- `- 3-	`-
 /23`- }`- hsm,`- }`- SM`- #`- c]`- !`- c]`- c]`- C=`-  C=!`-" #`-$ c]%`-& SM'`- `- `- `-D ]S5FSSSTTQt Q Q Q UTQ ]QRR:4 : : : SR: ]=.11_ _ 21_ ]]^^
T 
 
 
 _^
 ]TUU@4 @ @ @ VU@ ]<==H H H H >=H ]<==H H H H >=H          r   r~   c                        e Zd ZU ee         ed<   e fd            Zddddee         de	e
         de	e
         f fdZ ed          d	efd
            Zd	ef fdZ xZS )BlockAttachmentblocksc                 T    t                      j                            ddh          S )Nr   r   r8   r:   s    r   r.   zBlockAttachment.attributes  s#    ww!''7(;<<<r   N)r   r   r   r   c                x    t                                          d||           t          |          | _        dS )aT  
        A bridge between legacy attachments and Block Kit formatting - pass a list of
        Block objects directly to this attachment.

        https://docs.slack.dev/legacy/legacy-messaging/legacy-secondary-message-attachments#fields

        Args:
            blocks: a sequence of Block objects
            color: Changes the color of the border on the left side of this
                attachment from the default gray. Can either be one of "good" (green),
                "warning" (yellow), "danger" (red), or any hex color code (eg. #439FE0)
            fallback: fallback text
         )r   r   r   N)r%   r   listr   )r   r   r   r   r)   s       r   r   zBlockAttachment.__init__  s5    ( 	b85AAA6llr   z7fields attribute cannot be populated on BlockAttachmentr"   c                     | j          S r   )r   r    s    r   fields_attribute_absentz'BlockAttachment.fields_attribute_absent  s    ;r   c                     t                                                      }|                    dt          | j                  i           |d= |S )Nr   r   )r%   r&   updater	   r   r'   s     r   r&   zBlockAttachment.to_dict  sC    ww  X|DK889:::Nr   )r*   r+   r,   r   r   r   rG   r.   r   r   r/   r   r   r|   r   r0   r&   r1   r2   s   @r   r   r     s        K= = = = X=  $"&# # # # }	#
 3-# # # # # #. ]LMM    NM          r   r   c            (           e Zd Zedee         f fd            ZdZddddddddddddddddddee	         deded	e
e         d
e
ee                  de
e         de
ee                  de
e         de
e         de
e         de
e         de
e         de
e         de
e         de
e         de
e         de
e         de
e         de
e         f& fdZ ede d          defd            Zdef fdZ xZS )InteractiveAttachmentr"   c                 R    t                      j                            dh          S )Ncallback_idr8   r:   s    r   r.   z InteractiveAttachment.attributes  s     ww!''888r      Nr   actionsr   r   r   r   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   c                    t                                          |||||
|	|||||||||||           || _        |pg | _        dS )a  
        An Attachment, but designed to contain interactive Actions
        Considered legacy - recommended replacement is to use message blocks instead.

        https://docs.slack.dev/legacy/legacy-messaging/legacy-interactive-message-field-guide/#attachment_fields
        https://docs.slack.dev/legacy/legacy-messaging/legacy-secondary-message-attachments#fields

        Args:
            actions: A collection of Action objects to include in the attachment.
                Cannot exceed 5 elements.
            callback_id: The ID used to identify this attachment. Will be part of the
                payload sent back to your application.
            text: The main body text of the attachment. It can be formatted as
                plain text, or with markdown by including it in the markdown_in
                parameter. The content will automatically collapse if it contains 700+
                characters or 5+ linebreaks, and will display a "Show more..." link to
                expand the content.
            fallback: A plain text summary of the attachment used in clients that
                don't show formatted text (eg. IRC, mobile notifications).
            fields: An array of AttachmentField objects that get displayed in a
                table-like way. For best results, include no more than 2-3 field
                objects.
            color: Changes the color of the border on the left side of this attachment
                from the default gray. Can either be one of "good" (green), "warning"
                (yellow), "danger" (red), or any hex color code (eg. #439FE0)
            markdown_in: An array of field names that should be formatted by
                markdown syntax - allowed values: "pretext", "text", "fields"
            title: Large title text near the top of the attachment.
            title_link: A valid URL that turns the title text into a hyperlink.
            pretext: Text that appears above the message attachment block. It can
                be formatted as plain text, or with markdown by including it in the
                markdown_in parameter.
            author_name: Small text used to display the author's name.
            author_subname: Small text used to display the author's sub name.
            author_link: A valid URL that will hyperlink the author_name text.
                Will only work if author_name is present.
            author_icon: A valid URL that displays a small 16px by 16px image to
                the left of the author_name text. Will only work if author_name is
                present.
            image_url: A valid URL to an image file that will be displayed at the
                bottom of the attachment. We support GIF, JPEG, PNG, and BMP formats.
                Large images will be resized to a maximum width of 360px or a maximum
                height of 500px, while still maintaining the original aspect ratio.
                Cannot be used with thumb_url.
            thumb_url: A valid URL to an image file that will be displayed as a
                thumbnail on the right side of a message attachment. We currently
                support the following formats: GIF, JPEG, PNG, and BMP. The thumbnail's
                longest dimension will be scaled down to 75px while maintaining the
                aspect ratio of the image. The filesize of the image must also be less
                than 500 KB. For best results, please use images that are already 75px
                by 75px.
            footer: Some brief text to help contextualize and identify an
                attachment. Limited to 300 characters, and may be truncated further when
                displayed to users in environments with limited screen real estate.
            footer_icon: A valid URL to an image file that will be displayed
                beside the footer text. Will only work if footer is present. We'll
                render what you provide at 16px by 16px. It's best to use an image that
                is similarly sized.
            ts: An integer Unix timestamp that is used to related your attachment
                to a specific time. The attachment will display the additional timestamp
                value as part of the attachment's footer. Your message's timestamp will
                be displayed in varying ways, depending on how far in the past or future
                 it is, relative to the present. Form factors, like mobile versus
                 desktop may also transform its rendered appearance.
        )r   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   N)r%   r   r   r   )r   r   r   r   r   r   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   r)   s                       r   r   zInteractiveAttachment.__init__  ss    p 	!#)##### 	 	
 	
 	
& '}"r   z actions attribute cannot exceed z	 elementsc                 <    t          | j                  | j        k    S r   )r@   r   actions_max_lengthr    s    r   actions_lengthz$InteractiveAttachment.actions_lengthK  s    4<  D$;;;r   c                 v    t                                                      }t          | j                  |d<   |S )Nr   )r%   r&   r	   r   r'   s     r   r&   zInteractiveAttachment.to_dictO  s.    ww  &t|44Yr   )r*   r+   r,   rG   r   r/   r.   r   r   r   r   rw   rr   r   r   r|   r   r0   r&   r1   r2   s   @r   r   r     sC       9CH 9 9 9 9 9 X9  #'6:#/3#$(!%%)(,%)%)#'#' $%) +l% l% l% &!l% 	l%
 l% 3-l% /23l% }l% hsm,l% }l% SMl% #l% c]l% !l% c]l%  c]!l%" C=#l%$ C=%l%& 'l%( c])l%* SM+l% l% l% l% l% l%\ ]S6HSSSTT< < < < UT<          r   r   )"r   abcr   r   typingr   r   r   r   slack_sdk.modelsr	   slack_sdk.models.basic_objectsr
   r   r   slack_sdk.models.blocksr   r   r   r   r   r   r4   rI   rM   r]   rd   ri   rn   r   rw   r~   r   r   rR   r   r   <module>r      s   				 ' ' ' ' ' ' ' ' 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) ) ) )         
                 Z   >5 5 5 5 56 5 5 5p
? 
? 
? 
? 
?v 
? 
? 
?    Vw    6N N N N N/ N N N(Q Q Q Q Q2 Q Q Q,V V V V V!7 V V V, 1  1  1  1  13  1  1  1F -,,    j   b b b b b b b bJ& & & & &j & & &R| | | | |J | | | | |r   